{"version":3,"file":"polygonjs-editor.mjs","mappings":";;;;;AAAA;AACA;;AAEA,yCAAyC,SAAS;AAClD;AACA;;AAEA;AACA;;AAEA,oCAAoC,yBAAyB,SAAS,yBAAyB;;;;;;;ACV/F;AACA;AACA;;AAEA,kCAAkC,yBAAyB,SAAS,yBAAyB;;;;;;;ACJ7F;AACA;AACA;AACA;AACA;;AAEA,kCAAkC,yBAAyB,SAAS,yBAAyB;;;;;;;ACN7F;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA,+BAA+B,yBAAyB,SAAS,yBAAyB;;;;;;;ACnB1F;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B,+BAA+B;AAC3D;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA,wCAAwC,yBAAyB,SAAS,yBAAyB;;;;;;;AC9BnG;AACA;AACA;;AAEA,mCAAmC,yBAAyB,SAAS,yBAAyB;;;;;;;ACJ9F,qBAAqB,mBAAO,CAAC,KAAqB;;AAElD,2BAA2B,mBAAO,CAAC,KAA2B;;AAE9D,iCAAiC,mBAAO,CAAC,KAAiC;;AAE1E,sBAAsB,mBAAO,CAAC,KAAsB;;AAEpD;AACA;AACA;;AAEA,iCAAiC,yBAAyB,SAAS,yBAAyB;;;;;;;ACZ5F,uBAAuB,mBAAO,CAAC,KAAuB;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C,yBAAyB,SAAS,yBAAyB;;;;;;;ACXzG,kBAAkB,mBAAO,CAAC,KAAa;;AAEvC;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACbA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C,cAAc,mBAAO,CAAC,KAAqB;AAC3C,cAAc,mBAAO,CAAC,KAAqB;AAC3C,cAAc,mBAAO,CAAC,KAAqB;AAC3C,cAAc,mBAAO,CAAC,KAAqB;;AAE3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;AChEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/KA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzBA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C,4BAA4B,mBAAO,CAAC,IAAuB;;AAE3D;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3CA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA,WAAW,qBAAqB;AAChC;AACA;AACA,YAAY,mBAAO,CAAC,KAAY;AAChC,kBAAkB,mBAAO,CAAC,KAAkB;AAC5C,aAAa,mBAAO,CAAC,KAAa;AAClC,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,uBAAuB,mBAAO,CAAC,IAAuB;AACtD,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC;;;;;;;;AClBA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,cAAc,6EAA6E;;AAE3F;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC1BA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpDA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnDA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,OAAO;AACP;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;;AAEA;;;;;;;;AChFA;AACA;AACA,SAAS,cAAc;AACvB;AACA;AACA;AACA,UAAU,mBAAO,CAAC,KAAU;AAC5B,WAAW,mBAAO,CAAC,IAAW;AAC9B,aAAa,mBAAO,CAAC,KAAa;AAClC;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ,mEAAmE;AACtF,WAAW,QAAQ;AACnB,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oBAAoB,uBAAuB;AAC3C;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5CA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ,kDAAkD;AACrE,WAAW,QAAQ;AACnB,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oBAAoB,uBAAuB;AAC3C;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;;AAEA;;;;;;;;AC3CA;AACA;AACA;AACA;AACA,WAAW,SAAS;;AAEpB;AACA;AACA,UAAU,mBAAO,CAAC,KAAU;AAC5B;;;;;;;;ACTA,aAAa,mBAAO,CAAC,KAAkB;AACvC,aAAa,mBAAO,CAAC,IAAkB;;AAEvC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;;;;;;;ACzBA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;ACRA,aAAa,mBAAO,CAAC,KAAkB;;AAEvC;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzBA,aAAa,mBAAO,CAAC,KAAkB;AACvC,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,eAAe,mBAAO,CAAC,IAAU;;AAEjC;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/BA,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,eAAe,mBAAO,CAAC,IAAU;;AAEjC;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClCA;AACA;AACA,SAAS,aAAa;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,mBAAO,CAAC,IAAS;AAC1B,UAAU,mBAAO,CAAC,IAAU;AAC5B,cAAc,mBAAO,CAAC,KAAc;AACpC,qBAAqB,mBAAO,CAAC,KAAqB;AAClD,OAAO,mBAAO,CAAC,KAAO;AACtB,WAAW,mBAAO,CAAC,KAAW;AAC9B,cAAc,mBAAO,CAAC,KAAc;AACpC,YAAY,mBAAO,CAAC,KAAY;AAChC,WAAW,mBAAO,CAAC,KAAW;AAC9B,YAAY,mBAAO,CAAC,KAAY;AAChC,mBAAmB,mBAAO,CAAC,KAAmB;AAC9C,aAAa,mBAAO,CAAC,KAAa;AAClC,YAAY,mBAAO,CAAC,KAAY;AAChC;;;;;;;;AC7BA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,eAAe,mBAAO,CAAC,IAAU;AACjC,gBAAgB,mBAAO,CAAC,KAAW;;AAEnC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpDA,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,gBAAgB,mBAAO,CAAC,KAAW;;AAEnC;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,sCAAsC,aAAa,cAAc,aAAa;AAC9E;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,WAAW;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;;;;;;;ACtHA,gBAAgB,mBAAO,CAAC,KAAW;;AAEnC;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA,wBAAwB,mBAAO,CAAC,KAAmB;;AAEnD;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,gBAAgB,mBAAO,CAAC,KAAW;;AAEnC;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;;;;;;;ACvBA,aAAa,mBAAO,CAAC,KAAkB;;AAEvC;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,cAAc,YAAY;AACnD;;AAEA;;;;;;;;ACnBA,aAAa,mBAAO,CAAC,IAAkB;AACvC,YAAY,mBAAO,CAAC,KAAO;AAC3B,mBAAmB,mBAAO,CAAC,KAAc;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA,GAAG;;AAEH;AACA;AACA,gDAAgD,kBAAkB;AAClE;AACA;;AAEA;;;;;;;;ACnCA,aAAa,mBAAO,CAAC,KAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAU;;AAEhC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AA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KAAY;;AAErC;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB,oDAAoD;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8DAA8D,kBAAkB;;AAExF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;;AAEA;;;;;;;;AC7IA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAuB;AAC/C,aAAa,mBAAO,CAAC,IAAkB;AACvC,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,qBAAqB,mBAAO,CAAC,KAAgB;AAC7C,iBAAiB,mBAAO,CAAC,KAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,2BAA2B;AAC3B,4BAA4B,4CAA4C;AACxE,4BAA4B,kDAAkD;AAC9E;AACA;AACA;AACA;AACA;AACA,QAAQ,0BAA0B,kBAAkB;;AAEpD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3JA,eAAe,mBAAO,CAAC,KAAU;AACjC,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,aAAa,mBAAO,CAAC,KAAkB;AACvC,aAAa,mBAAO,CAAC,IAAkB;;AAEvC;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;ACRA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAuB;;AAE/C,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAS;;AAE/B;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChCA,mBAAmB,mBAAO,CAAC,KAAc;AACzC,iBAAiB,mBAAO,CAAC,KAAY;;AAErC,QAAQ,SAAS,EAAE,mBAAO,CAAC,IAAkB;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA,qCAAqC,0BAA0B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,YAAY,EAAE;AAC1E;AACA;AACA;AACA,GAAG;AACH,sBAAsB,kBAAkB;AACxC;;AAEA;;;;;;;;ACnCA,aAAa,mBAAO,CAAC,KAAkB;;AAEvC;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB,cAAc,SAAS;AACvB,cAAc,MAAM;AACpB;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,iBAAiB,mBAAO,CAAC,KAAY;;AAErC;AACA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,OAAO;AACnB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;;;;;;;AC9CA,aAAa,mBAAO,CAAC,KAAkB;AACvC,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA,WAAW,YAAY;AACvB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChCA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAuB;;AAE/C,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAS;AAC/B,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,4BAA4B,aAAa;AACzC;AACA;AACA,qBAAqB;AACrB,QAAQ,SAAS,kBAAkB;;AAEnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACzCA;AACA;AACA,SAAS,aAAa;AACtB;AACA;AACA;AACA,0CAA0C,cAAc;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAO,CAAC,KAAa;AAClC,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,SAAS,mBAAO,CAAC,KAAS;AAC1B,SAAS,mBAAO,CAAC,KAAS;AAC1B,UAAU,mBAAO,CAAC,KAAU;AAC5B,UAAU,mBAAO,CAAC,KAAU;AAC5B,UAAU,mBAAO,CAAC,KAAU;AAC5B,cAAc,mBAAO,CAAC,KAAc;AACpC,qBAAqB,mBAAO,CAAC,KAAqB;AAClD,OAAO,mBAAO,CAAC,KAAO;AACtB,WAAW,mBAAO,CAAC,KAAW;AAC9B,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,mBAAmB,mBAAO,CAAC,KAAmB;AAC9C,aAAa,mBAAO,CAAC,KAAa;AAClC,YAAY,mBAAO,CAAC,KAAY;AAChC;;;;;;;;AClCA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA,cAAc,mBAAO,CAAC,KAAS;;AAE/B;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnDA,wBAAwB,mBAAO,CAAC,KAAmB;;AAEnD;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,iBAAiB,mBAAO,CAAC,KAAY;;AAErC;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;;;;;;;ACvBA,aAAa,mBAAO,CAAC,KAAkB;;AAEvC;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,cAAc,YAAY;AACnD;;AAEA;;;;;;;;ACnBA,aAAa,mBAAO,CAAC,IAAkB;AACvC,YAAY,mBAAO,CAAC,KAAO;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA,kDAAkD,iBAAiB;AACnE;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,MAAM;AACnD;AACA,GAAG;;AAEH;AACA;AACA,gDAAgD,kBAAkB;AAClE;AACA;;AAEA;;;;;;;;ACxCA,oBAAoB,mBAAO,CAAC,KAAe;AAC3C,aAAa,mBAAO,CAAC,KAAQ;;AAE7B;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,YAAY,SAAS;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,YAAY,SAAS;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzFA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;;;;;;;;ACvBA,eAAe,mBAAO,CAAC,IAAU;;AAEjC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA,SAAS,aAAa;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,mBAAmB,mBAAO,CAAC,IAAmB;AAC9C,UAAU,mBAAO,CAAC,IAAU;AAC5B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,eAAe,mBAAO,CAAC,KAAe;AACtC;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA,aAAa,mBAAO,CAAC,KAAwB;;AAE7C;;AAEA;;;;;;;;ACXA,eAAe,mBAAO,CAAC,KAAU;;AAEjC,aAAa,mBAAO,CAAC,GAAkB;;AAEvC;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;;;;;;;;ACvBA,aAAa,mBAAO,CAAC,GAAkB;;AAEvC,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA,SAAS,aAAa;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,SAAS,mBAAO,CAAC,KAAS;AAC1B,UAAU,mBAAO,CAAC,KAAU;AAC5B,cAAc,mBAAO,CAAC,KAAc;AACpC,sBAAsB,mBAAO,CAAC,KAAsB;AACpD,UAAU,mBAAO,CAAC,KAAU;AAC5B,OAAO,mBAAO,CAAC,KAAO;AACtB,YAAY,mBAAO,CAAC,KAAY;AAChC,eAAe,mBAAO,CAAC,KAAe;AACtC,sBAAsB,mBAAO,CAAC,KAAsB;AACpD,yBAAyB,mBAAO,CAAC,KAAyB;AAC1D,uBAAuB,mBAAO,CAAC,IAAuB;AACtD,SAAS,mBAAO,CAAC,KAAS;AAC1B,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,aAAa,mBAAO,CAAC,KAAa;AAClC,YAAY,mBAAO,CAAC,EAAY;AAChC;;;;;;;;AC5BA,cAAc,mBAAO,CAAC,KAAmB;AACzC,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,cAAc,mBAAO,CAAC,KAAmB;AACzC,aAAa,mBAAO,CAAC,GAAkB;;AAEvC;AACA;AACA,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3CA,cAAc,mBAAO,CAAC,KAAS;;AAE/B;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClFA,aAAa,mBAAO,CAAC,GAAkB;;AAEvC;AACA,WAAW,OAAO;AAClB,aAAa,OAAO,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA,aAAa,mBAAO,CAAC,GAAkB;AACvC,aAAa,mBAAO,CAAC,KAAkB;;AAEvC;;AAEA;AACA;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A,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B,6BAA6B,mBAAmB;AAChD;AACA;AACA,uBAAuB,WAAW;AAClC;AACA,mCAAmC,mBAAmB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9MA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,qCAAqC;;AAEhD;AACA;AACA,aAAa,mBAAO,CAAC,KAAa;AAClC,SAAS,mBAAO,CAAC,KAAS;AAC1B,SAAS,mBAAO,CAAC,KAAS;AAC1B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,SA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;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACzBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9BA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5BA;AACA;AACA;AACA,aAAa,OAAO;AACpB;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAc;;AAEtC,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD,iBAAiB,mBAAO,CAAC,KAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClCA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClCA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpDA,aAAa,mBAAO,CAAC,GAAS;;AAE9B,qBAAqB,mBAAO,CAAC,KAAgB;;AAE7C;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChDA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxCA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxCA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxCA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3BA;AACA;AACA,SAAS,YAAY;AACrB;AACA;AACA;AACA,OAAO,mBAAO,CAAC,KAAO;AACtB,SAAS,mBAAO,CAAC,KAAS;AAC1B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,UAAU,mBAAO,CAAC,KAAU;AAC5B,UAAU,mBAAO,CAAC,KAAU;AAC5B,UAAU,mBAAO,CAAC,KAAU;AAC5B,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,eAAe,mBAAO,CAAC,KAAe;AACtC,yBAAyB,mBAAO,CAAC,KAAyB;AAC1D,mBAAmB,mBAAO,CAAC,KAAmB;AAC9C,cAAc,mBAAO,CAAC,KAAc;AACpC,sBAAsB,mBAAO,CAAC,KAAsB;AACpD,iBAAiB,mBAAO,CAAC,KAAiB;AAC1C,iBAAiB,mBAAO,CAAC,KAAiB;AAC1C,iBAAiB,mBAAO,CAAC,KAAiB;AAC1C,YAAY,mBAAO,CAAC,KAAY;AAChC,cAAc,mBAAO,CAAC,KAAc;AACpC,wBAAwB,mBAAO,CAAC,KAAwB;AACxD,eAAe,mBAAO,CAAC,IAAe;AACtC,iBAAiB,mBAAO,CAAC,KAAiB;AAC1C,YAAY,mBAAO,CAAC,KAAY;AAChC,UAAU,mBAAO,CAAC,KAAU;AAC5B,WAAW,mBAAO,CAAC,KAAW;AAC9B,WAAW,mBAAO,CAAC,KAAW;AAC9B,WAAW,mBAAO,CAAC,KAAW;AAC9B,SAAS,mBAAO,CAAC,KAAS;AAC1B,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,aAAa,mBAAO,CAAC,KAAa;AAClC;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;ACrBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AC/BA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClEA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAc;;AAEtC,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD,aAAa,mBAAO,CAAC,KAAQ;;AAE7B;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjFA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9CA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9CA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9CA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjCA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACTA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,qBAAqB,iBAAiB,iBAAiB;AACvD,qBAAqB,iBAAiB,iBAAiB;AACvD,qBAAqB,iBAAiB,kBAAkB;;AAExD,kBAAkB,cAAc,cAAc;AAC9C,kBAAkB,cAAc,cAAc;AAC9C,kBAAkB,cAAc,eAAe;;AAE/C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AClDA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA,aAAa,mBAAO,CAAC,GAAS;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/BA,aAAa,mBAAO,CAAC,GAAS;;AAE9B;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9CA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAc;;AAEtC,aAAa,mBAAO,CAAC,GAAS;;AAE9B;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzCA;AACA;AACA;AACA,SAAS,aAAa;AACtB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,SAAS,mBAAO,CAAC,KAAe;AAChC;AACA,wBAAwB;AACxB;AACA;AACA,QAAQ,mBAAO,CAAC,KAAc;AAC9B;AACA,0BAA0B;AAC1B;AACA;AACA,UAAU,mBAAO,CAAC,KAAgB;AAClC;AACA,0BAA0B;AAC1B;AACA;AACA,UAAU,mBAAO,CAAC,KAAgB;AAClC,QAAQ,mBAAO,CAAC,KAAQ;AACxB,sBAAsB,mBAAO,CAAC,KAAsB;AACpD;AACA,8BAA8B;AAC9B;AACA;AACA,cAAc,mBAAO,CAAC,KAAoB;AAC1C,cAAc,mBAAO,CAAC,KAAc;AACpC,oBAAoB,mBAAO,CAAC,KAAoB;AAChD,qBAAqB,mBAAO,CAAC,KAAqB;AAClD,yBAAyB,mBAAO,CAAC,KAAyB;AAC1D;AACA,4BAA4B;AAC5B;AACA;AACA,YAAY,mBAAO,CAAC,KAAkB;AACtC,aAAa,mBAAO,CAAC,KAAa;AAClC;;;;;;;;AC5CA,aAAa,mBAAO,CAAC,GAAS;;AAE9B;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,YAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClBA,aAAa,mBAAO,CAAC,GAAS;;AAE9B;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;;;;;;;;ACZA,aAAa,mBAAO,CAAC,KAAS;AAC9B,aAAa,mBAAO,CAAC,GAAS;;AAE9B,mBAAmB,mBAAO,CAAC,KAAc;AACzC,aAAa,mBAAO,CAAC,KAAQ;;AAE7B;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACvCA,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAc;;AAEvC;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;;;;;;;;ACXA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA;AACA,WAAW,qBAAqB;AAChC;AACA;AACA,qBAAqB,mBAAO,CAAC,KAAqB;AAClD,QAAQ,mBAAO,CAAC,KAAQ;AACxB,OAAO,gCAA6B;AACpC,kCAAkC,mBAAO,CAAC,KAAkC;AAC5E,aAAa,mBAAO,CAAC,KAAa;AAClC,OAAO,gCAA6B;AACpC,gBAAgB,mBAAO,CAAC,KAAgB;AACxC;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI,uBAAuB;AAC3B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACVA,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAc;;AAEvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB;;;;;;;;ACjCnB;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,2CAA0C;;;;;;;;ACA1C,qBAAqB,mBAAO,CAAC,KAAgB;;AAE7C;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACXA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACTA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,aAAa,OAAO;AACpB;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACVA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;;;;;;;;ACVA,yBAAyB,mBAAO,CAAC,KAAoB;;AAErD;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;;;;;;;;ACZA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA,OAAO,mBAAO,CAAC,KAAO;AACtB,OAAO,mBAAO,CAAC,KAAO;AACtB,SAAS,mBAAO,CAAC,KAAS;AAC1B,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,SAAS,mBAAO,CAAC,KAAS;AAC1B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,UAAU,mBAAO,CAAC,KAAU;AAC5B,SAAS,mBAAO,CAAC,KAAS;AAC1B,YAAY,mBAAO,CAAC,KAAY;AAChC,UAAU,mBAAO,CAAC,IAAU;AAC5B,OAAO,mBAAO,CAAC,KAAO;AACtB,UAAU,mBAAO,CAAC,KAAU;AAC5B,oBAAoB,mBAAO,CAAC,IAAoB;AAChD,oBAAoB,mBAAO,CAAC,KAAoB;AAChD,cAAc,mBAAO,CAAC,KAAc;AACpC,cAAc,mBAAO,CAAC,KAAc;AACpC,UAAU,mBAAO,CAAC,KAAU;AAC5B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,OAAO,mBAAO,CAAC,KAAO;AACtB,OAAO,mBAAO,CAAC,KAAO;AACtB,YAAY,mBAAO,CAAC,KAAY;AAChC,UAAU,mBAAO,CAAC,KAAU;AAC5B,UAAU,mBAAO,CAAC,KAAU;AAC5B,aAAa,mBAAO,CAAC,KAAa;AAClC,UAAU,mBAAO,CAAC,KAAU;AAC5B,SAAS,mBAAO,CAAC,KAAS;AAC1B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,mBAAmB,mBAAO,CAAC,KAAmB;AAC9C,iBAAiB,mBAAO,CAAC,KAAiB;AAC1C,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,aAAa,mBAAO,CAAC,KAAa;AAClC;;;;;;;;ACtCA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACTA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAc;;AAEtC,eAAe,mBAAO,CAAC,KAAU;AACjC,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;ACtBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACtBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACbA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA,iCAAiC,qBAAqB,IAAI,qBAAqB;;AAE/E;;;;;;;;ACTA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA,YAAY,mBAAO,CAAC,KAAO;;AAE3B;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,aAAa,OAAO;AACpB;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACvBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACVA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;;;;;;;;ACVA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA,SAAS,YAAY;AACrB;AACA;AACA;AACA,OAAO,mBAAO,CAAC,KAAO;AACtB,OAAO,mBAAO,CAAC,KAAO;AACtB,SAAS,mBAAO,CAAC,KAAS;AAC1B,SAAS,mBAAO,CAAC,KAAS;AAC1B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,UAAU,mBAAO,CAAC,KAAU;AAC5B,SAAS,mBAAO,CAAC,IAAS;AAC1B,YAAY,mBAAO,CAAC,KAAY;AAChC,UAAU,mBAAO,CAAC,KAAU;AAC5B,OAAO,mBAAO,CAAC,KAAO;AACtB,UAAU,mBAAO,CAAC,KAAU;AAC5B,cAAc,mBAAO,CAAC,KAAc;AACpC,cAAc,mBAAO,CAAC,KAAc;AACpC,YAAY,mBAAO,CAAC,KAAY;AAChC,UAAU,mBAAO,CAAC,IAAU;AAC5B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,OAAO,mBAAO,CAAC,KAAO;AACtB,OAAO,mBAAO,CAAC,KAAO;AACtB,YAAY,mBAAO,CAAC,KAAY;AAChC,UAAU,mBAAO,CAAC,KAAU;AAC5B,aAAa,mBAAO,CAAC,KAAa;AAClC,cAAc,mBAAO,CAAC,KAAc;AACpC,WAAW,mBAAO,CAAC,KAAW;AAC9B,WAAW,mBAAO,CAAC,KAAW;AAC9B,WAAW,mBAAO,CAAC,KAAW;AAC9B,SAAS,mBAAO,CAAC,KAAS;AAC1B,QAAQ,mBAAO,CAAC,KAAQ;AACxB,mBAAmB,mBAAO,CAAC,KAAmB;AAC9C,iBAAiB,mBAAO,CAAC,KAAiB;AAC1C,YAAY,mBAAO,CAAC,KAAY;AAChC,YAAY,mBAAO,CAAC,KAAY;AAChC,aAAa,mBAAO,CAAC,KAAa;AAClC;;;;;;;;ACtCA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACtBA,YAAY,mBAAO,CAAC,KAAO;AAC3B,eAAe,mBAAO,CAAC,KAAU;AACjC,cAAc,mBAAO,CAAC,IAAS;;AAE/B;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACrBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AChCA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AChCA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AC7BA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA,8BAA8B,kBAAkB,IAAI,kBAAkB,IAAI,kBAAkB;;AAE5F;;;;;;;;ACRA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClBA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA;AACA,aAAa,OAAO;AACpB;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACVA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,YAAY,SAAS;AACrB;AACA;AACA;;AAEA;;;;;;;;ACVA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY,QAAQ;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA;AACA;AACA,SAAS,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;AACA,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,WAAW;AACtB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACjJA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C,2BAA2B,mBAAO,CAAC,KAAsB;;AAEzD;AACA;AACA,WAAW,WAAW;AACtB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;AC3BA,gBAAgB,mBAAO,CAAC,KAAkB;;AAE1C,aAAa,mBAAO,CAAC,GAAe;;AAEpC,cAAc,mBAAO,CAAC,KAAqB;AAC3C,cAAc,mBAAO,CAAC,KAAqB;;AAE3C;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA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AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,gDAAgD;AACvE;AACA;AACA;AACA;AACA,uBAAuB,8CAA8C;AACrE,UAAU;AACV;AACA,0BAA0B,kBAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B,gDAAgD;AAC1E;AACA;AACA;;AAEA;AACA;;AAEA;AACA,0BAA0B,8CAA8C;AACxE;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;;;;;;;;AC/IA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAA0B;;AAElD,aAAa,mBAAO,CAAC,GAAqB;;AAE1C,cAAc,mBAAO,CAAC,KAA2B;;AAEjD,4BAA4B,mBAAO,CAAC,KAAuB;;AAE3D;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0EAA0E;AAC1E;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB,OAAO;AACzC;AACA,uCAAuC,OAAO,OAAO;AACrD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB,OAAO;AAC3C;AACA,sCAAsC,OAAO,OAAO;AACpD;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,kBAAkB,OAAO;AAC7C;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB,OAAO;AACzC;AACA;AACA,uCAAuC,OAAO,OAAO;AACrD;AACA,qBAAqB,OAAO,mBAAmB,kBAAkB,KAAK,qBAAqB;AAC3F;AACA,0BAA0B,OAAO,WAAW,sBAAsB;AAClE,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpQA,aAAa,mBAAO,CAAC,KAAQ;AAC7B,wBAAwB,mBAAO,CAAC,KAAmB;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjDA;AACA,QAAQ,mBAAO,CAAC,KAAQ;AACxB;;;;;;;;ACFA,aAAa,mBAAO,CAAC,GAAqB;;AAE1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAA0B;;AAElD,cAAc,mBAAO,CAAC,KAAsB;AAC5C,aAAa,mBAAO,CAAC,GAAqB;;AAE1C,cAAc,mBAAO,CAAC,KAA2B;;AAEjD,gCAAgC,mBAAO,CAAC,KAA2B;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,kCAAkC,mCAAmC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxHA,gBAAgB,mBAAO,CAAC,KAAqB;AAC7C,gCAAgC,mBAAO,CAAC,KAAqC;;AAE7E,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,mBAAmB,mBAAO,CAAC,KAAc;AACzC,m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QAAQ;AACpB,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kBAAkB,mBAAmB;;AAE/C;AACA,wCAAwC;AACxC,qCAAqC;;AAErC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,cAAc;AAClC;AACA;;AAEA;AACA,0CAA0C,UAAU;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;AC/NA,aAAa,mBAAO,CAAC,KAAkB;AACvC,aAAa,mBAAO,CAAC,GAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA;AACA,UAAU,mBAAO,CAAC,KAAU;AAC5B,UAAU,mBAAO,CAAC,KAAU;AAC5B;;;;;;;;ACVA,gBAAgB,mBAAO,CAAC,KAAqB;;AAE7C,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,oBAAoB,mBAAO,CAAC,KAAe;AAC3C,oBAAoB,mBAAO,CAAC,KAAe;;AAE3C;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ,qEAAqE;AACxF,WAAW,SAAS;AACpB,WAAW,WAAW;AACtB,YAAY,cAAc;AAC1B;AACA;AACA;AACA,wBAAwB,+BAA+B,UAAU,SAAS;AAC1E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACnCA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAuB;;AAEpD,kBAAkB,mBAAO,CAAC,KAA6B;AACvD,cAAc,mBAAO,CAAC,KAAmB;AACzC,aAAa,mBAAO,CAAC,IAAkB;AACvC,aAAa,mBAAO,CAAC,KAAwB;;AAE7C;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ,sEAAsE;AACzF,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC,mBAAmB;;AAE9D;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,4BAA4B,gDAAgD;AAC5E;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wBAAwB,4CAA4C;AACpE;AACA;;AAEA;;AAEA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;;;;;;;ACzKA,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,yBAAyB,mBAAO,CAAC,KAAoB;;AAErD;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ,sEAAsE;AACzF,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2BAA2B,mBAAmB;;AAExD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;;;;;;;AC9CA,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,yBAAyB,mBAAO,CAAC,KAAoB;;AAErD;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ,sEAAsE;AACzF,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,mCAAmC,mBAAmB;;AAEhE;AACA;AACA;;AAEA,cAAc;AACd;AACA,4BAA4B,gBAAgB;AAC5C;;AAEA;;;;;;;;AC/BA,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAsB;AAC/C,QAAQ,aAAa,EAAE,mBAAO,CAAC,KAA2B;AAC1D,QAAQ,kBAAkB,EAAE,mBAAO,CAAC,KAA2B;;AAE/D;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,wCAAwC,aAAa,cAAc,aAAa;AAChF;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,iBAAiB;AACxD;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;AC1FA,QAAQ,2DAA2D,EAAE,mBAAO,CAAC,KAAiB;AAC9F,QAAQ,wBAAwB,EAAE,mBAAO,CAAC,KAAY;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAI;;AAEJ;;AAEA,yDAAyD;;AAEzD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;;;;;;;;AClIA,uBAAuB,mBAAO,CAAC,KAAkB;AACjD,QAAQ,yBAAyB,EAAE,mBAAO,CAAC,KAAc;AACzD,QAAQ,qFAAqF,EAAE,mBAAO,CAAC,KAAiB;AACxH,QAAQ,wBAAwB,EAAE,mBAAO,CAAC,KAAY;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,aAAa;AACxB,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,yEAAyE;AACzE;AACA;AACA;;AAEA,sBAAsB,cAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AC3PA,mBAAmB,mBAAO,CAAC,KAAkB;;AAE7C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mBAAmB;;;;;;;;;ACxDnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;;;;;;;;ACrDA,QAAQ,+BAA+B,EAAE,mBAAO,CAAC,KAAc;AAC/D,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAY;;AAErC;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA,IAAI;AACJ,4BAA4B,YAAY;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC,SAAS;AAC9C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mBAAmB;;;;;;;;ACpMnB,cAAc,mBAAO,CAAC,KAA2B;AACjD,cAAc,mBAAO,CAAC,KAAsB;AAC5C,aAAa,mBAAO,CAAC,IAAqB;AAC1C,aAAa,mBAAO,CAAC,GAAqB;AAC1C,uBAAuB,mBAAO,CAAC,IAAyB;AACxD,oBAAoB,mBAAO,CAAC,KAAe;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mBAAmB;;;;;;;;ACfnB,aAAa,mBAAO,CAAC,KAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,cAAc,mBAAO,CAAC,KAAS;AAC/B,oBAAoB,mBAAO,CAAC,KAAgB;;AAE5C,qBAAqB,mBAAO,CAAC,KAAgB;;AAE7C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sEAAsE,mBAAmB;;AAEnG;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjHA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAuB;AAC/C,cAAc,mBAAO,CAAC,KAAS;AAC/B,aAAa,mBAAO,CAAC,KAAkB;AACvC,0BAA0B,mBAAO,CAAC,KAAqB;AACvD,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oDAAoD,kBAAkB;;AAEhF;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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CA;AACA;AACA;AACA,UAAU,eAAe,mBAAmB;;AAE5C;AACA;;AAEA,cAAc;;AAEd;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACvFA,cAAc,mBAAO,CAAC,KAAsB;AAC5C,aAAa,mBAAO,CAAC,GAAqB;;AAE1C;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACxCA,eAAe,mBAAO,CAAC,KAAU;;AAEjC,aAAa,mBAAO,CAAC,GAAqB;;AAE1C;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3BA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;;;;;;;;ACnBA,aAAa,mBAAO,CAAC,GAAqB;;AAE1C;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;;;;;;;AC1BA,aAAa,mBAAO,CAAC,GAAqB;;AAE1C,eAAe,mBAAO,CAAC,KAAU;;AAEjC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;AClCA,aAAa,mBAAO,CAAC,GAAqB;;AAE1C,eA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AAC,IAAkB;;AAEvC;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,kBAAkB;AAC7B;AACA;AACA,QAAQ,mBAAO,CAAC,KAAQ;AACxB,aAAa,mBAAO,CAAC,KAAa;AAClC;;;;;;;;ACXA,YAAY,mBAAO,CAAC,KAAyB;AAC7C,aAAa,mBAAO,CAAC,KAA0B;AAC/C,cAAc,mBAAO,CAAC,IAA2B;AACjD,YAAY,mBAAO,CAAC,KAAyB;AAC7C,eAAe,mBAAO,CAAC,IAA4B;AACnD,kBAAkB,mBAAO,CAAC,KAA+B;AACzD,cAAc,mBAAO,CAAC,KAA2B;AACjD,iBAAiB,mBAAO,CAAC,KAA8B;;AAEvD;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,GAAY;;AAErC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kCAAkC,gCAAgC;AAClE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7UA,iBAAiB,mBAAO,CAAC,KAA8B;AACvD,wBAAwB,mBAAO,CAAC,KAAqC;;AAErE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACvDA,YAAY,mBAAO,CAAC,KAAyB;;AAE7C,0BAA0B,mBAAO,CAAC,KAAuB;AACzD,uBAAuB,mBAAO,CAAC,IAAoB;;AAEnD,mBAAmB,mBAAO,CAAC,KAAc;AACzC,eAAe,mBAAO,CAAC,KAAU;AACjC,QAAQ,qCAAqC,EAAE,mBAAO,CAAC,IAAQ;;AAE/D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;;AAEA;AACA,gBAAgB,0BAA0B;AAC1C;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,0BAA0B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0BAA0B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;;AAEA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,mCAAmC;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,aAAa,MAAM;AACnB,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA,gFAAgF;AAChF;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA,gEAAgE;AAChE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjvBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,GAAG;AAChB,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,GAAG;AAChB,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjJA,cAAc,mBAAO,CAAC,IAA2B;AACjD,kBAAkB,mBAAO,CAAC,KAA+B;AACzD,iBAAiB,mBAAO,CAAC,KAA8B;;AAEvD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA,kBAAkB,mBAAO,CAAC,KAAa;;AAEvC;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,cAAc,mBAAO,CAAC,IAA2B;AACjD,iBAAiB,mBAAO,CAAC,KAA8B;AACvD,sBAAsB,mBAAO,CAAC,KAAmC;;AAEjE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;ACzCA,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;;;;;;;ACjCA,gBAAgB,mBAAO,CAAC,KAAqB;;AAE7C,uBAAuB,mBAAO,CAAC,KAAmC;;AAElE,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,qBAAqB,mBAAO,CAAC,KAAgB;AAC7C,sBAAsB,mBAAO,CAAC,KAAiB;AAC/C,yBAAyB,mBAAO,CAAC,KAAoB;AACrD,4BAA4B,mBAAO,CAAC,KAAuB;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,8BAA8B,kBAAkB;;AAE1D;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,WAAW;AACtB,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA,cAAc,mBAAO,CAAC,KAAc;AACpC,QAAQ,mBAAO,CAAC,KAAQ;AACxB;;;;;;;;ACVA,kBAAkB,mBAAO,CAAC,KAAuB;AACjD,aAAa,mBAAO,CAAC,GAAkB;AACvC,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;;AAEA,8BAA8B,OAAO;;AAErC;AACA;AACA;AACA;AACA,wBAAwB,SAAS,GAAG,OAAO;AAC3C,4BAA4B,OAAO,GAAG,SAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,SAAS,GAAG,OAAO;AACxC;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gCAAgC;AAC7D;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;;AAEA;AACA;;AAEA,2BAA2B,UAAU,GAAG,cAAc;AACtD,kCAAkC,cAAc,GAAG,UAAU;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,4CAA4C,0CAA0C;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,6BAA6B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,kBAAkB;AAClB,gBAAgB;AAChB,cAAc;AACd,YAAY;AACZ,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACrSA,0BAA0B,mBAAO,CAAC,KAAqC;AACvE,aAAa,mBAAO,CAAC,GAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ,GAAG,QAAQ;AACpC;AACA;;AAEA;AACA,iBAAiB,QAAQ,GAAG,QAAQ;AACpC;AACA;;AAEA;AACA,iBAAiB,QAAQ,GAAG,QAAQ;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;AC/MA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAuB;;AAE/C,cAAc,mBAAO,CAAC,KAAmB;AACzC,aAAa,mBAAO,CAAC,IAAkB;AACvC,yBAAyB,mBAAO,CAAC,KAA8B;AAC/D,uCAAuC,mBAAO,CAAC,KAAkD;;AAEjG,QAAQ,6BAA6B,EAAE,mBAAO,CAAC,KAAa;;AAE5D,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,4BAA4B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8BAA8B;AACrD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,4CAA4C;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM,OAAO;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR,MAAM;;AAEN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,sBAAsB,6BAA6B;AACnD;AACA,yBAAyB,+BAA+B;AACxD,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV,QAAQ;AACR,uBAAuB,+BAA+B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,6BAA6B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;;;;;;;ACxVA,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,0BAA0B,mBAAO,CAAC,KAAqC;;AAEvE,oCAAoC,mBAAO,CAAC,KAA+B;;AAE3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACrDA,gBAAgB,mBAAO,CAAC,KAAqB;;AAE7C,aAAa,mBAAO,CAAC,IAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;AAC9C,cAAc,mBAAO,CAAC,KAAwB;;AAE9C,uBAAuB,mBAAO,CAAC,KAAmC;;AAElE,qBAAqB,mBAAO,CAAC,KAAgB;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,WAAW;AACtB,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACxDA,aAAa,mBAAO,CAAC,GAAkB;;AAEvC,cAAc,mBAAO,CAAC,KAAwB;;AAE9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;;;;;;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CA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3IA,QAAQ,WAAW,EAAE,mBAAO,CAAC,KAAoB;;AAEjD,aAAa,mBAAO,CAAC,IAAe;;AAEpC,cAAc,mBAAO,CAAC,KAAqB;;AAE3C,QAAQ,6BAA6B,EAAE,mBAAO,CAAC,KAAgB;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO,uDAAuD;AACzE,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sCAAsC,kBAAkB;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACpEA,kBAAkB,mBAAO,CAAC,KAAa;;AAEvC,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAgB;;AAEzC;AACA;AACA,oBAAoB,4CAA4C;AAChE,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iCAAiC,kBAAkB;;AAE3D;;AAEA;;AAEA,qBAAqB,gCAAgC;AACrD;;AAEA;;;;;;;;AClCA,kBAAkB,mBAAO,CAAC,KAAa;;AAEvC,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAgB;;AAEzC;AACA;AACA,oBAAoB,4CAA4C;AAChE,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,eAAe,kBAAkB;;AAEzC;;AAEA;;AAEA,qBAAqB,cAAc;AACnC;;AAEA;;;;;;;;AC9BA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAoB;AAC5C,aAAa,mBAAO,CAAC,IAAe;;AAEpC,cAAc,mBAAO,CAAC,KAAqB;;AAE3C,QAAQ,6BAA6B,EAAE,mBAAO,CAAC,KAAgB;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAkB,cAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA,qBAAqB,6BAA6B;AAClD,qBAAqB,+CAA+C;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kEAAkE,kBAAkB;;AAE5F;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,kBAAkB,cAAc;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACvFA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAoB;;AAE5C,sBAAsB,mBAAO,CAAC,KAAwC;AACtE,QAAQ,SAAS,EAAE,mBAAO,CAAC,KAAiC;AAC5D,QAAQ,YAAY,EAAE,mBAAO,CAAC,KAAoC;;AAElE,eAAe,mBAAO,CAAC,KAAU;;AAEjC,QAAQ,cAAc,EAAE,mBAAO,CAAC,KAAgB;;AAEhD;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA,yBAAyB,mCAAmC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,mGAAmG,kBAAkB;;AAE/H;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6BAA6B,8CAA8C;;AAE3E;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/DA,QAAQ,OAAO,EAAE,mBAAO,CAAC,KAAoB;AAC7C,aAAa,mBAAO,CAAC,IAAe;;AAEpC,cAAc,mBAAO,CAAC,KAAqB;;AAE3C,QAAQ,gBAAgB,EAAE,mBAAO,CAAC,KAAgB;;AAElD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,sDAAsD;AACzE,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA,2BAA2B,qDAAqD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,eAAe,kBAAkB;;AAEzC;AACA;AACA;AACA;AACA,0GAA0G;;AAE1G;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClKA;AACA;AACA,KAAK,mCAAmC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC;AACA;AACA,cAAc,mBAAO,CAAC,KAAc;AACpC,cAAc,mBAAO,CAAC,KAAc;AACpC;;;;;;;;ACXA,qBAAqB,mBAAO,CAAC,IAAgB;;AAE7C;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;;AAEA,iBAAiB,wBAAwB;AACzC;AACA,UAAU,eAAe;AACzB,UAAU,OAAO;AACjB,UAAU,OAAO;AACjB,UAAU,OAAO;AACjB,UAAU,OAAO;AACjB,UAAU,QAAQ;AAClB,UAAU,QAAQ;AAClB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA,sCAAsC,yBAAyB;AAC/D;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;;;;;;;;AC9DA,oBAAoB,mBAAO,CAAC,KAAwC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;;;;;;;;ACzBA,mBAAmB,mBAAO,CAAC,KAAc;AACzC,qBAAqB,mBAAO,CAAC,IAAgB;;AAE7C;AACA;AACA,UAAU,OAAO,kBAAkB,YAAY,eAAe;AAC9D;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,eAAe;AAC1B,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,cAAc;AACjD;AACA,mCAAmC,kCAAkC;AACrE;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,iCAAiC,QAAQ;AACzC;AACA,wBAAwB,qDAAqD;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA,+BAA+B,SAAS;AACxC,QAAQ;AACR,+BAA+B,aAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9FA;AACA,cAAc,mBAAO,CAAC,KAAqB;AAC3C,cAAc,mBAAO,CAAC,KAAqB;AAC3C,cAAc,mBAAO,CAAC,KAAqB;;AAE3C;AACA,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACRA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;;;;;;;ACTA;AACA;AACA;AACA;;AAEA;;;;;;;;ACLA;AACA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA,2BAA2B,mBAAO,CAAC,KAA2B;AAC9D,YAAY,mBAAO,CAAC,KAAY;AAChC,WAAW,mBAAO,CAAC,KAAW;AAC9B,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,gBAAgB,mBAAO,CAAC,KAAgB;AACxC,oBAAoB,mBAAO,CAAC,KAAoB;AAChD,YAAY,mBAAO,CAAC,KAAY;AAChC;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;;;;;;;;ACRA,QAAQ,MAAM,EAAE,mBAAO,CAAC,KAAoB;;AAE5C;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,4CAA4C;AAC/D,WAAW,QAAQ,yDAAyD;AAC5E,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;;;;;;ACjBkK;;AAElK;AACA,6BAA6B,IAAI;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM,SAAS,KAAyC,EAAE,EAErD;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,OAAO;AAClD;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAIrD;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B,MAAyC,GAAG,CAAS;AAChF,mCAAmC,MAAyC,GAAG,CAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,MAAyC,GAAG,CAA2C,CAAC;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAiE,EAAE,EAStE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6BAA6B,8DAAO;AACxC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,aAAa,8DAAO;AACpB;AACA,cAAc,4DAAK;AACnB;AACA;AACA,UAAU,SAAS,mEAAY;AAC/B;AACA;AACA;AACA;AACA,aAAa,8DAAO;AACpB;AACA,cAAc,4DAAK;AACnB;AACA;AACA;AACA;AACA;AACA,YAAY,4DAAK;AACjB;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAyC,GAAG,CAAoD,CAAC;AACrH;AACA;AACA,UAAU,KAAyC,EAAE,EAE9C,CAAC;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAE9C,CAAC;AACN;AACA;AACA;AACA;AACA;AACA,kBAAkB,8DAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAA8D,EAAE,EAEnE;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,8DAAO;AAClD;AACA,+IAA+I,2DAAQ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,0BAA0B,8DAAO;AACjC;AACA,2BAA2B,6DAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+DAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mEAAY;AAC1C;AACA,QAAQ,+DAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,8DAAO;AAClB;AACA;AACA;AACA;AACA,mBAAmB,8DAAO,YAAY,mEAAY,sCAAsC,6DAAM;AAC9F;AACA;AACA;AACA;AACA,QAAQ,SAAS,iEAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,6DAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,+DAAQ;AACf;AACA;AACA;AACA;AACA;AACA,2BAA2B,8DAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAK9C;AACL;AACA,GAAG;AACH;AACA,QAAQ,KAAyC,EAAE,EAK9C;AACL;AACA;AACA;AACA,gDAAgD,6DAAM;AACtD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,6DAAM;AACtD,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,YAAY;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uBAAuB;AACjC;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA;AACA,IAAI,SAAS,iEAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uBAAuB;AACjC;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAyC,GAAG,CAAiD;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAK;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B,wBAAwB,cAAc;AACtC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAM9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM,6DAAM;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM,gEAAgE,iCAAiC;AACzH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F,gEAAS;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,+DAAQ;AACf,QAAQ,KAAyC,EAAE,EAE9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+DAAQ;AACtC,8BAA8B,+DAAQ;;AAEtC;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAM9C,CAAC;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAO9C,CAAC;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iEAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,MAAyC,GAAG,CAAU;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA6D,EAAE,EAElE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iEAAU;AAC/B;AACA;AACA,aAAa,MAAyC,GAAG,CAEpD,CAAC,EAAE,uDAAI;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM,KAAmE,EAAE,EAGxE;AACH;AACA;;AAEA,6BAA6B,iEAAiB;AAC9C,cAAc,kDAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqZ;;;;;;;;;;;;;;;;;;;;;;;;AC9tCrZ;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;;AAEA,kBAAkB,MAAyC,GAAG,CAAiB;AAC/E,kBAAkB,MAAyC,GAAG,CAAiB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,CAAC;AACD,2CAA2C;AAC3C;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6KAA6K,qBAAM,mBAAmB,qBAAM,KAAK;AACjN;AACA;AACA;AACA,yCAAyC,KAAK,eAAe,qBAAqB;AAClF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,8CAA8C,6EAA6B;;AAE3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA,8BAA8B,+BAA+B;AAC7D;AACA;AACA;AACA;AACA,aAAa,KAAK,EAAE,iDAAiD,KAAK,SAAS;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc,GAAG,OAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sBAAsB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,kEAAkB;AACpD,iCAAiC,iEAAiB;AAClD,kCAAkC,kEAAkB;;AAEpD;AACA,6CAA6C,4EAA4B;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,KAAK;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA,CAAC;AACD,uCAAuC;AACvC;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA,yBAAyB;AACzB;AACA;AACA,wBAAwB;AACxB;AACA;AACA,wBAAwB;AACxB;AACA;AACA,uBAAuB;AACvB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,cAAc,SAAS;AACvB,mBAAmB,KAAK;AACxB;AACA,OAAO,IAAI;AACX;AACA,IAAI;AACJ;AACA,cAAc,SAAS;AACvB;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEuzB;;;;;;;;ACvZvzB;AACA,IAAI,KAA4D,oBAAoB,mBAAO,CAAC,KAAsC,GAAG,mBAAO,CAAC,KAAuC,GAAG,mBAAO,CAAC,KAAoC;AACnO,IAAI,CACqL;AACzL,CAAC,6EAA6E;;AAE9E,yCAAyC,4DAA4D;;AAErG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AA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AS;;AAE5B;AACA;;AAEA;;;;;;;;ACLA,WAAW,mBAAO,CAAC,KAAS;;AAE5B;AACA;;AAEA;;;;;;;;ACLA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,WAAW,mBAAO,CAAC,KAAS;;AAE5B;AACA;;AAEA;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,GAAG;AACd,WAAW,OAAO;AAClB,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,kBAAkB,mBAAO,CAAC,KAAe;AACzC,cAAc,mBAAO,CAAC,KAAW;AACjC,eAAe,mBAAO,CAAC,KAAY;AACnC,cAAc,mBAAO,CAAC,KAAY;AAClC,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,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Ae,mBAAO,CAAC,KAAY;AACnC,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClFA,aAAa,mBAAO,CAAC,KAAW;AAChC,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,YAAY,mBAAO,CAAC,KAAU;AAC9B,kBAAkB,mBAAO,CAAC,KAAgB;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7DA,iBAAiB,mBAAO,CAAC,IAAc;AACvC,eAAe,mBAAO,CAAC,KAAa;AACpC,eAAe,mBAAO,CAAC,KAAY;AACnC,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9CA,aAAa,mBAAO,CAAC,KAAW;AAChC,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,eAAe,mBAAO,CAAC,KAAY;AACnC,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3DA,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,0BAA0B,mBAAO,CAAC,KAAwB;AAC1D,eAAe,mBAAO,CAAC,KAAY;AACnC,cAAc,mBAAO,CAAC,KAAW;AACjC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9BA,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA,e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AACH;;AAEA;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA,aAAa,mBAAO,CAAC,KAAW;AAChC,eAAe,mBAAO,CAAC,KAAa;AACpC,cAAc,mBAAO,CAAC,KAAW;AACjC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpCA,sBAAsB,mBAAO,CAAC,KAAoB;;AAElD;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClBA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACbA,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;AClBA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;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AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,WAAW,mBAAO,CAAC,KAAS;;AAE5B;AACA;;AAEA;;;;;;;;ACLA,eAAe,mBAAO,CAAC,KAAa;AACpC,qBAAqB,mBAAO,CAAC,KAAmB;;AAEhD;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;ACpCA,kBAAkB,mBAAO,CAAC,KAAe;;AAEzC;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,SAAS;AACpB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/BA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,qBAAqB,mBAAO,CAAC,KAAmB;AAChD,eAAe,mBAAO,CAAC,IAAY;;AAEnC;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA,SAAS,mBAAO,CAAC,KAAM;;AAEvB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5BA,gBAAgB,mBAAO,CAAC,KAAc;;AAEtC;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,IAAI;AACJ,CAAC;;AAED;;;;;;;;ACVA,eAAe,mBAAO,CAAC,KAAa;AACpC,gBAAgB,mBAAO,CAAC,KAAc;AACtC,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnFA,aAAa,mBAAO,CAAC,KAAW;AAChC,iBAAiB,mBAAO,CAAC,KAAe;AACxC,SAAS,mBAAO,CAAC,KAAM;AACvB,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,iBAAiB,mBAAO,CAAC,IAAe;AACxC,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/GA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzFA,qBAAqB,mBAAO,CAAC,KAAmB;;AAEhD;AACA;AACA,aAAa;AACb,YAAY;AACZ,YAAY;AACZ,cAAc;AACd,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;;AAEA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA;AACA,wBAAwB,qBAAM,gBAAgB,qBAAM,IAAI,qBAAM,sBAAsB,qBAAM;;AAE1F;;;;;;;;ACHA,qBAAqB,mBAAO,CAAC,IAAmB;AAChD,iBAAiB,mBAAO,CAAC,KAAe;AACxC,WAAW,mBAAO,CAAC,KAAQ;;AAE3B;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AAC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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChBA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACtBA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACtBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzBA,uBAAuB,mBAAO,CAAC,KAAqB;AACpD,oBAAoB,mBAAO,CAAC,IAAkB;AAC9C,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,sBAAsB,mBAAO,CAAC,KAAoB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5EA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,mBAAmB,mBAAO,CAAC,KAAiB;AAC5C,kBAAkB,mBAAO,CAAC,KAAgB;;AAE1C;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,aAAa,mBAAO,CAAC,KAAW;AAChC,kBAAkB,mBAAO,CAAC,KAAe;AACzC,cAAc,mBAAO,CAAC,KAAW;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACxBA,SAAS,mBAAO,CAAC,KAAM;AACvB,kBAAkB,mBAAO,CAAC,KAAe;AACzC,cAAc,mBAAO,CAAC,KAAY;AAClC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7BA,cAAc,mBAAO,CAAC,KAAW;AACjC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5BA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACjBA,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACZA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClCA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AClBA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;;;;;;;ACzBA,WAAW,mBAAO,CAAC,KAAS;AAC5B,gBAAgB,mBAAO,CAAC,KAAc;AACtC,UAAU,mBAAO,CAAC,KAAQ;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;ACfA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnBA,cAAc,mBAAO,CAAC,KAAW;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;;;;;;;ACzBA,gBAAgB,mBAAO,CAAC,KAAc;;AAEtC;AACA;;AAEA;;;;;;;;ACLA,cAAc,mBAAO,CAAC,KAAY;;AAElC;AACA;;AAEA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;ACnBA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA,kBAAkB,KAA0B;;AAE5C;AACA,gCAAgC,QAAa;;AAE7C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,CAAC;;AAED;;;;;;;;AC7BA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;ACrBA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA,YAAY,mBAAO,CAAC,KAAU;;AAE9B;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnCA;AACA;;AAEA;;;;;;;;ACHA;AACA;;AAEA;;;;;;;;ACHA;AACA;;AAEA;;;;;;;;ACHA,iBAAiB,mBAAO,CAAC,KAAe;;AAExC;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACRA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;ACbA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;ACjBA,sBAAsB,mBAAO,CAAC,KAAoB;AAClD,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;;AAEA;;;;;;;;ACbA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpCA,gBAAgB,mBAAO,CAAC,KAAc;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA;;AAEA;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;ACbA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,UAAU,mBAAO,CAAC,KAAQ;AAC1B,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjCA,oBAAoB,mBAAO,CAAC,KAAkB;;AAE9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;;;;;;;;AC1BA,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;;;;;;;ACzBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;AClBA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,qBAAqB,mBAAO,CAAC,KAAmB;AAChD,aAAa,mBAAO,CAAC,KAAU;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,WAAW;AACtB,WAAW,UAAU;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AAC9C,WAAW;AACX;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;ACrCA,YAAY,mBAAO,CAAC,KAAU;AAC9B,eAAe,mBAAO,CAAC,KAAa;AACpC,cAAc,mBAAO,CAAC,KAAW;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,MAAM;AACjB,aAAa,GAAG;AAChB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,CAAC;;AAED;;;;;;;;AClCA,gBAAgB,mBAAO,CAAC,KAAc;;AAEtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,GAAG;AAChB;AACA;AACA;AACA,oBAAoB,QAAQ,IAAI,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,UAAU;AACvB;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA,YAAY,QAAQ,IAAI,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,kBAAkB;AAClB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpCA,qBAAqB,mBAAO,CAAC,KAAmB;AAChD,eAAe,mBAAO,CAAC,IAAY;;AAEnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC1CA,cAAc,mBAAO,CAAC,KAAY;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,cAAc;AACzB,WAAW,GAAG;AACd,aAAa,GAAG;AAChB;AACA;AACA,kBAAkB,QAAQ,OAAO,UAAU;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AChCA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,cAAc,mBAAO,CAAC,KAAY;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;AACA;AACA,2BAA2B,gBAAgB,QAAQ,GAAG;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,GAAG;AAChB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpBA,sBAAsB,mBAAO,CAAC,KAAoB;AAClD,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA;AACA;;AAEA;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzBA,iBAAiB,mBAAO,CAAC,IAAc;AACvC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;AChCA,WAAW,mBAAO,CAAC,KAAS;AAC5B,gBAAgB,mBAAO,CAAC,KAAa;;AAErC;AACA,kBAAkB,KAA0B;;AAE5C;AACA,gCAAgC,QAAa;;AAE7C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACrCA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,mBAAmB,mBAAO,CAAC,KAAgB;AAC3C,oBAAoB,mBAAO,CAAC,KAAiB;;AAE7C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACnCA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AClCA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,gBAAgB,mBAAO,CAAC,KAAc;AACtC,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5BA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,mBAAmB,mBAAO,CAAC,KAAiB;AAC5C,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7DA,gBAAgB,mBAAO,CAAC,KAAc;AACtC,gBAAgB,mBAAO,CAAC,KAAc;AACtC,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC1BA,iBAAiB,mBAAO,CAAC,KAAe;AACxC,mBAAmB,mBAAO,CAAC,KAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC5BA,uBAAuB,mBAAO,CAAC,KAAqB;AACpD,gBAAgB,mBAAO,CAAC,KAAc;AACtC,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC1BA,oBAAoB,mBAAO,CAAC,KAAkB;AAC9C,eAAe,mBAAO,CAAC,KAAa;AACpC,kBAAkB,mBAAO,CAAC,KAAe;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACpCA,oBAAoB,mBAAO,CAAC,KAAkB;AAC9C,iBAAiB,mBAAO,CAAC,KAAe;AACxC,kBAAkB,mBAAO,CAAC,KAAe;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C;AACA,2DAA2D;;AAE3D;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB;AACzB,yBAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,2CAA2C;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B,MAAM,aAAa,OAAO;;AAEpD;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,2CAA2C,EAAE;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf,cAAc;AACd,cAAc;AACd,gBAAgB;AAChB,eAAe;AACf;;AAEA;AACA;AACA,UAAU;AACV,SAAS;AACT,SAAS;AACT,WAAW;AACX,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,qBAAM,gBAAgB,qBAAM,IAAI,qBAAM,sBAAsB,qBAAM;;AAE5F;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,KAA0B;;AAE9C;AACA,kCAAkC,QAAa;;AAE/C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,GAAG;AAChB,aAAa,OAAO;AACpB,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB,eAAe,UAAU;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,aAAa,UAAU;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,aAAa,GAAG;AAChB,aAAa,SAAS;AACtB;AACA,eAAe,GAAG;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,aAAa,GAAG;AAChB,aAAa,SAAS;AACtB;AACA,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,GAAG;AAChB,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B,aAAa,UAAU;AACvB,aAAa,GAAG;AAChB,aAAa,SAAS;AACtB;AACA,aAAa,UAAU;AACvB,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,eAAe,GAAG;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,GAAG;AAChB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,UAAU;AACzB;AACA;AACA,eAAe,0BAA0B;AACzC;AACA;AACA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4BAA4B;AAC9D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,QAAQ;AACR,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,SAAS;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,SAAS;AACxB;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,OAAO;AACtB,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA,qCAAqC,8BAA8B;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,cAAc;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,cAAc;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,GAAG;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,SAAS;AACxB;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,8BAA8B;AAC7C,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,oBAAoB;AACnC,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,gBAAgB,SAAS;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,gBAAgB,SAAS;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,OAAO;AACtB,eAAe,QAAQ,UAAU;AACjC,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ,UAAU;AACjC,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ,UAAU;AACjC,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,SAAS;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,eAAe,OAAO;AACtB;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,oEAAoE;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,eAAe,OAAO;AACtB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,OAAO;AACtB;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C,yCAAyC;AACzC,gEAAgE;AAChE,kEAAkE;AAClE;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAC3D,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,wBAAwB,gBAAgB,IAAI,gBAAgB;AAC5D;AACA,oCAAoC,gBAAgB;AACpD,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,mCAAmC;AAC9C,WAAW,oCAAoC;AAC/C,WAAW;AACX;AACA;AACA,6CAA6C,mBAAmB;AAChE;AACA;AACA;AACA,iCAAiC,oCAAoC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oCAAoC;AAC/C,WAAW;AACX;AACA;AACA,wCAAwC,mBAAmB;AAC3D;AACA;AACA;AACA,4BAA4B,mCAAmC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oCAAoC;AAC/C,WAAW;AACX;AACA;AACA,wCAAwC,4BAA4B;AACpE;AACA;AACA;AACA,4BAA4B,iCAAiC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,WAAW,mCAAmC;AAC9C,WAAW,oCAAoC;AAC/C,WAAW;AACX;AACA;AACA,4CAA4C,6BAA6B;AACzE;AACA;AACA;AACA,gCAAgC,kCAAkC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AAC7D,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,wBAAwB,gBAAgB,IAAI,gBAAgB;AAC5D,uBAAuB,gBAAgB,IAAI,gBAAgB;AAC3D;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,sBAAsB,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AAClE;AACA,6BAA6B,QAAQ,IAAI,QAAQ;AACjD;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,sBAAsB,gBAAgB,IAAI,gBAAgB,IAAI,gBAAgB;AAC9E;AACA,+BAA+B,gBAAgB;AAC/C;AACA,gBAAgB,gBAAgB,IAAI,gBAAgB;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,sBAAsB;AACrC,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ;AAC5C;AACA,kCAAkC,QAAQ,gBAAgB,aAAa;AACvE;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ;AAC5C;AACA,sCAAsC,QAAQ,gBAAgB,aAAa;AAC3E;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,mCAAmC;AAC9C,WAAW,oCAAoC;AAC/C,WAAW;AACX;AACA;AACA,6CAA6C,mBAAmB;AAChE;AACA;AACA;AACA,iCAAiC,oCAAoC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oCAAoC;AAC/C,WAAW;AACX;AACA;AACA,wCAAwC,mBAAmB;AAC3D;AACA;AACA;AACA,4BAA4B,mCAAmC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AACtD,gBAAgB,QAAQ,IAAI,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,wBAAwB,gBAAgB,IAAI,gBAAgB;AAC5D,uBAAuB,gBAAgB,IAAI,gBAAgB;AAC3D;AACA;AACA,gBAAgB,gBAAgB,IAAI,gBAAgB,IAAI,gBAAgB;AACxE;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AACnD,gBAAgB,QAAQ,IAAI,QAAQ;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,wBAAwB,gBAAgB,IAAI,gBAAgB,IAAI,gBAAgB;AAChF;AACA;AACA,gBAAgB,gBAAgB,IAAI,gBAAgB;AACpD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AACpD,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA,wBAAwB,gBAAgB,IAAI,gBAAgB;AAC5D,uBAAuB,gBAAgB,IAAI,gBAAgB;AAC3D;AACA;AACA,gBAAgB,gBAAgB,IAAI,gBAAgB;AACpD;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,eAAe,OAAO,QAAQ,QAAQ,IAAI,QAAQ;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,WAAW,8BAA8B;AACzC,WAAW,8BAA8B;AACzC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB,QAAQ,OAAO,UAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,WAAW,6BAA6B;AACxC,WAAW;AACX;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,gBAAgB,QAAQ;AACxB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,8CAA8C;AACzD,WAAW;AACX;AACA;AACA;AACA,wBAAwB,mCAAmC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA,WAAW,6CAA6C;AACxD,WAAW;AACX;AACA;AACA,qCAAqC,mBAAmB;AACxD;AACA;AACA;AACA,yBAAyB,2BAA2B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,WAAW;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA,WAAW,8CAA8C;AACzD,WAAW,+CAA+C;AAC1D,WAAW;AACX;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAqB;AACpC,eAAe,GAAG;AAClB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,uBAAuB;AACtC;AACA,eAAe,MAAM;AACrB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,WAAW,2BAA2B;AACtC,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR,eAAe,OAAO,2BAA2B,SAAS;AAC1D;AACA;AACA,eAAe,UAAU,2BAA2B,aAAa;AACjE;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,sCAAsC;AACrD;AACA,eAAe,UAAU;AACzB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,6BAA6B;AACxC,WAAW,6BAA6B;AACxC,WAAW,6BAA6B;AACxC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,+CAA+C;AAC1D,WAAW,8CAA8C;AACzD,WAAW;AACX;AACA;AACA,wCAAwC,kBAAkB;AAC1D;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,eAAe,kBAAkB;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA,QAAQ,IAAI;AACZ,eAAe,8BAA8B;AAC7C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA,WAAW,8CAA8C;AACzD,WAAW;AACX;AACA;AACA,qCAAqC,mBAAmB;AACxD;AACA;AACA;AACA,yBAAyB,2BAA2B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAqB;AACpC,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,gBAAgB,QAAQ;AACxB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C,WAAW;AACX;AACA;AACA;AACA,uBAAuB,mCAAmC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,0BAA0B;AACzC;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,WAAW,6BAA6B;AACxC,WAAW,6BAA6B;AACxC,WAAW,6BAA6B;AACxC,WAAW;AACX;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,qBAAqB,gCAAgC;AACrD,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,eAAe,MAAM;AACrB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,MAAM;AACrB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,QAAQ,WAAW;AAClC,eAAe,SAAS;AACxB;AACA,eAAe,QAAQ;AACvB;AACA,eAAe,SAAS;AACxB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,mDAAmD,iBAAiB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,MAAM;AACrB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,MAAM;AACrB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA,sBAAsB;AACtB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,0BAA0B;AACzC;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,MAAM;AACrB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,MAAM;AACrB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,sBAAsB;AACrC,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,QAAQ,WAAW;AAClC,eAAe,SAAS;AACxB;AACA,eAAe,SAAS;AACxB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,qBAAqB,QAAQ;AAC7B,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA,sBAAsB;AACtB;AACA,8BAA8B,mBAAmB,iBAAiB;AAClE;AACA;AACA,8BAA8B,mBAAmB,iBAAiB;AAClE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA,sBAAsB;AACtB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD;AACA;AACA;AACA;AACA;AACA,mDAAmD,mBAAmB;AACtE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA,sBAAsB;AACtB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA,sBAAsB;AACtB;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,OAAO;AACxB;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B,eAAe;AACf;AACA,kBAAkB,QAAQ;AAC1B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,eAAe;AACf;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AAClD,eAAe;AACf;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AAClD,eAAe;AACf;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,sBAAsB;AACrC,iBAAiB,OAAO;AACxB;AACA;AACA,sBAAsB,QAAQ,OAAO,UAAU;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,oBAAoB,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AACpD,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,wBAAwB,OAAO,UAAU,IAAI,OAAO,kBAAkB;AACtE,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD,sBAAsB,4BAA4B;AAClD,sBAAsB;AACtB;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD,sBAAsB,4BAA4B;AAClD,sBAAsB;AACtB;AACA;AACA,0CAA0C,oBAAoB;AAC9D;AACA;AACA;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA,sBAAsB,QAAQ,OAAO,UAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,SAAS;AAC1B;AACA;AACA,sBAAsB,OAAO;AAC7B,8BAA8B,gBAAgB,QAAQ,GAAG;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,SAAS;AAC1B;AACA;AACA,+BAA+B,gBAAgB,QAAQ,GAAG;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,QAAQ;AACR,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,MAAM;AACrB,iBAAiB,GAAG;AACpB;AACA;AACA,sBAAsB,QAAQ,OAAO,qBAAqB;AAC1D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA,QAAQ;AACR,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,sBAAsB;AACtB;AACA;AACA,wCAAwC,eAAe;AACvD,eAAe,2BAA2B;AAC1C;AACA;AACA;AACA,eAAe,2BAA2B;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,iBAAiB,QAAQ,IAAI,QAAQ;AACrC;AACA;AACA;AACA,iBAAiB,QAAQ,IAAI,QAAQ;AACrC;AACA;AACA;AACA,eAAe,QAAQ,gBAAgB,IAAI,gBAAgB;AAC3D;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,WAAW;AAC1B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,qBAAqB;AACrB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,KAAK;;AAEL;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,sBAAsB;AACrC,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,sBAAsB;AACrC,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA,iCAAiC;AACjC,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA,sBAAsB,QAAQ,OAAO,gCAAgC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,GAAG;AAClB,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB,QAAQ,OAAO,UAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,GAAG;AAClB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA,QAAQ,IAAI;AACZ,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,iBAAiB,SAAS;AAC1B;AACA;AACA,sBAAsB,QAAQ,OAAO,UAAU;AAC/C;AACA;AACA;AACA;AACA,eAAe,QAAQ,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ,SAAS;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA,sBAAsB,QAAQ,OAAO,UAAU;AAC/C;AACA,kDAAkD,eAAe;AACjE;AACA;AACA;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,cAAc;AAC7B,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,KAAK;AACvC;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,eAAe;AAC9B,eAAe,iBAAiB;AAChC,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,eAAe;AAC9B,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ,WAAW;AAClC,eAAe,QAAQ;AACvB;AACA,eAAe,QAAQ;AACvB;AACA,eAAe,QAAQ;AACvB;AACA,eAAe,QAAQ;AACvB;AACA,eAAe,QAAQ;AACvB;AACA,eAAe,QAAQ;AACvB;AACA,gBAAgB,QAAQ;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC,qBAAqB,UAAU;AAC/B;AACA;AACA,uEAAuE,0BAA0B,GAAG;AACpG,kBAAkB,6BAA6B;AAC/C;AACA;AACA;AACA,6DAA6D;AAC7D,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA,2CAA2C,MAAM;AACjD,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA,sDAAsD,0BAA0B,GAAG;AACnF,yCAAyC,aAAa,gBAAgB;AACtE,kBAAkB,6BAA6B;AAC/C;AACA;AACA;AACA,yDAAyD,oCAAoC;AAC7F;AACA;AACA;AACA;AACA,2DAA2D,oBAAoB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,YAAY;AACvD,2CAA2C,OAAO;AAClD,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C;;AAE5C;AACA,uDAAuD;AACvD;AACA;AACA,6BAA6B,EAAE;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,gCAAgC,gCAAgC;AAChE,cAAc;AACd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ,WAAW;AAClC,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,eAAe;AAC9B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC;AAClC,aAAa,QAAQ,QAAQ,UAAU,aAAa;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,eAAe;AAC9B,gBAAgB,QAAQ;AACxB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,MAAM;AACrB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,sBAAsB;AACrC,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA,cAAc,oBAAoB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW;AACX;AACA;AACA,sCAAsC,mBAAmB,iBAAiB;AAC1E,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA,gBAAgB,QAAQ,IAAI,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,WAAW,6CAA6C;AACxD,WAAW;AACX;AACA;AACA;AACA,oCAAoC,kCAAkC;AACtE,gBAAgB,6CAA6C;AAC7D;AACA;AACA;AACA,gBAAgB,2BAA2B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,WAAW,wBAAwB;AACnC,WAAW;AACX;AACA;AACA,qCAAqC,gBAAgB;AACrD,gBAAgB,wBAAwB;AACxC;AACA;AACA,iDAAiD,QAAQ,eAAe,QAAQ;AAChF,gBAAgB,wBAAwB,IAAI,wBAAwB;AACpE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,GAAG;AAClB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,WAAW,wBAAwB;AACnC,WAAW;AACX;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,gBAAgB,wBAAwB,IAAI,wBAAwB;AACpE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,MAAM;AACrB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,WAAW,OAAO,sBAAsB;AACxC,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,MAAM;AACrB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC,eAAe,QAAQ;AACvB,eAAe,QAAQ,WAAW;AAClC,eAAe,SAAS;AACxB,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB,IAAI,gBAAgB;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B,oDAAoD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,QAAQ,IAAI,QAAQ;AAC3D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,WAAW,OAAO,UAAU;AAC5B,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,gBAAgB,IAAI;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ;AAC5C;AACA,sCAAsC,aAAa;AACnD,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AACpE;AACA,uCAAuC,aAAa;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,GAAG;AACpB;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ;AAC5C;AACA,sCAAsC,aAAa;AACnD,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA,wBAAwB,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AACpE;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK,OAAO,gBAAgB;;AAE5B;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,2DAA2D;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,wCAAwC;AACtE;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA,MAAM,IAA0E;AAChF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI,mCAAO;AACX;AACA,KAAK;AAAA,kGAAC;AACN;AACA;AACA,OAAO,EASJ;AACH,CAAC;;;;;;;;ACxzhBD,eAAe,mBAAO,CAAC,KAAa;;AAEpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA,kBAAkB;AAClB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACxEA,mBAAmB,mBAAO,CAAC,KAAiB;AAC5C,uBAAuB,mBAAO,CAAC,IAAqB;AACpD,YAAY,mBAAO,CAAC,IAAU;AAC9B,YAAY,mBAAO,CAAC,GAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,UAAU;AACvB;AACA;AACA;AACA,OAAO,OAAO,UAAU;AACxB,OAAO,OAAO;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/BA,kBAAkB,mBAAO,CAAC,KAAgB;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC7CA,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,kBAAkB,mBAAO,CAAC,KAAgB;AAC1C,eAAe,mBAAO,CAAC,KAAa;AACpC,qBAAqB,mBAAO,CAAC,KAAmB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,0BAA0B;AACrC;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA,OAAO,6BAA6B;AACpC,OAAO,6BAA6B;AACpC,OAAO,6BAA6B;AACpC,OAAO;AACP;AACA;AACA,kCAAkC,gBAAgB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACjBA,cAAc,mBAAO,CAAC,KAAY;AAClC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACvBA,mBAAmB,mBAAO,CAAC,KAAgB;AAC3C,cAAc,mBAAO,CAAC,KAAW;AACjC,iBAAiB,mBAAO,CAAC,KAAe;AACxC,6BAA6B,mBAAO,CAAC,KAA2B;AAChE,uBAAuB,mBAAO,CAAC,KAAqB;AACpD,cAAc,mBAAO,CAAC,KAAW;AACjC,qBAAqB,mBAAO,CAAC,KAAmB;AAChD,WAAW,mBAAO,CAAC,KAAQ;AAC3B,oBAAoB,mBAAO,CAAC,KAAkB;AAC9C,uBAAuB,mBAAO,CAAC,KAAoB;AACnD,eAAe,mBAAO,CAAC,IAAY;;AAEnC;AACA;;AAEA;AACA,yCAAyC;AACzC;AACA,yDAAyD;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;AACA;AACA,wBAAwB,MAAM,aAAa,OAAO;;AAElD;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,WAAW;AAC9B,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA,YAAY,QAAQ;AACpB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA,cAAc,qBAAqB;AACnC,iBAAiB,UAAU;AAC3B;AACA;AACA,mEAAmE,0BAA0B,GAAG;AAChG,cAAc,6BAA6B;AAC3C;AACA;AACA;AACA,yDAAyD;AACzD,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA,uCAAuC,MAAM;AAC7C,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA,cAAc,oBAAoB;AAClC;AACA;AACA;AACA,kDAAkD,0BAA0B,GAAG;AAC/E,qCAAqC,aAAa,gBAAgB;AAClE,cAAc,6BAA6B;AAC3C;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA,uDAAuD,oBAAoB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,YAAY;AACnD,uCAAuC,OAAO;AAC9C,cAAc,oBAAoB;AAClC;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;;AAE3B,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH,eAAe;;AAEf;AACA;AACA;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC;;AAExC;AACA,mDAAmD;AACnD;AACA;AACA,yBAAyB,EAAE;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,4BAA4B,gCAAgC;AAC5D,UAAU;AACV;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/QA,aAAa,mBAAO,CAAC,KAAU;AAC/B,eAAe,mBAAO,CAAC,KAAa;AACpC,iBAAiB,mBAAO,CAAC,KAAe;AACxC,oBAAoB,mBAAO,CAAC,KAAkB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,WAAW;AACX;AACA;;AAEA;;;;;;;;AClEA,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;ACzCA,eAAe,mBAAO,CAAC,KAAa;AACpC,eAAe,mBAAO,CAAC,KAAY;AACnC,eAAe,mBAAO,CAAC,KAAY;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC/DA,mBAAmB,mBAAO,CAAC,KAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W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;;;;;;;;AC5CO;AACP;;ACDO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA,wBAAwB,oCAAoC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;ACdO;AACP;AACA,qDAAqD,qFAAqF;AAC1I;AACA;AACA;;ACLO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACP;AACO;AACA;AACP;;ACXA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA,YAAY,cAAc;AAC1B,YAAY,gCAAgC;AAC5C;AACA,2BAA2B,cAAc;AACzC,2BAA2B,gCAAgC;AAC3D;AACA;AACA,oFAAoF,iFAAiF,8GAA8G,IAAI;AAChR;AACP;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AC5BqE;AACP;AACa;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe;AACxB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,4CAA4C,qBAAqB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,qBAAqB;AAC/F;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,yCAAyC,kBAAkB,SAAS,+FAA+F,EAAE;AACrK,CAAC,EAAE;AACH;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,8DAA8D,2CAA2C;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2CAA2C;AACnE;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,qBAAqB;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,cAAc,QAAQ,wGAAwG;AAC5M;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,mEAAmE,GAAG;AACtE,oBAAoB;AACpB,yBAAyB,+BAA+B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,6CAA6C,aAAa;AAC1D;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,2HAA2H;AAC3H;AACA;AACA,2CAA2C,oBAAoB,2BAA2B;AAC1F,yCAAyC,kBAAkB,6CAA6C,EAAE;AAC1G,CAAC,IAAI,6BAA6B,4CAA4C,EAAE,iBAAiB,eAAe,EAAE,mBAAmB,kEAAkE,GAAG,0BAA0B,aAAa,sCAAsC,UAAU,WAAW;AAC5S,yDAAyD,+BAA+B,gBAAgB;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,gHAAgH,aAAa,IAAI;AACjI;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AC5NO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;ACPO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZqD;AACQ;AACtD;AACP,oCAAoC,cAAc;AAClD,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA;AACA;AACA;;ACV6C;AACQ;AAC9C;AACP,WAAW,cAAc,CAAC,eAAe;AACzC;AACA;;ACLqD;AAC8B;AAC5E;AACP,QAAQ,2BAA2B;AACnC;AACA;AACA,IAAI,2BAA2B;AAC/B,IAAI,4BAA4B;AAChC;AACA;;ACTO;AACP;AACA;AACA;;ACHqD;AAC8B;AAC5E;AACP,SAAS,2BAA2B;AACpC;AACA;AACA,IAAI,iCAA8B;AAClC,IAAI,4BAA4B;AAChC;AACA;;ACTkE;AACU;AAC5E;AACO;AACP,SAAS,kBAAkB;AAC3B,QAAQ,yBAAyB;AACjC;AACA;AACA;;ACRmH;AAChC;AAC8B;AAC1G;AACP;AACA;AACA,gBAAgB,8BAA8B;AAC9C,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sCAAsC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBO;AACP;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEO;AACP;AACA;AACA;;ACHkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,uDAAuD,gBAAgB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTO;AACP;;ACDqE;AAC9D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AChB8I;AACnC;AAC3G,MAAM,wCAAe;AACrB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uCAAuC,IAAI,GAAG,wCAAe;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,sCAAsC;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mCAAmC;AACnD;AACA;AACA,sCAAsC,mDAAmD,QAAQ,mDAAmD;AACpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDO;AACA;AACP;;ACFqD;AAC9C,yCAAyC,2BAA2B;AAC3E;;ACFsF;AAClB;AACe;AACE;AACrF,MAAM,oDAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,oDAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6GAA6G,0BAA0B,EAAE,0BAA0B;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA,wBAAwB,iBAAiB;AACzC,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,gBAAgB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;;ACH0D;AACL;AAC9C;AACP,WAAW,cAAc,CAAC,4BAA4B;AACtD;AACA;;ACL2D;AACN;AAC9C;AACP,WAAW,cAAc,CAAC,6BAA6B;AACvD;AACA;;ACL6E;AACX;AACA;AACI;AACrB;AACY;AACK;AACK;AACE;AACd;AACiB;AACrE;AACP,YAAY,eAAe,EAAE,uBAAuB;AACpD;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA,UAAU,kBAAkB;AAC5B;AACA,cAAc,kBAAkB;AAChC;AACA,kBAAkB,oBAAoB;AACtC;AACA,sBAAsB,UAAU;AAChC;AACA,0BAA0B,gBAAgB;AAC1C;AACA,8BAA8B,kBAAkB;AAChD;AACA;AACA;AACA,sCAAsC,wBAAwB;AAC9D;AACA;AACA;AACA;AACA,QAAQ,iBAAiB;AACzB,QAAQ,yBAAyB;AACjC;AACA;AACA;;AC9C6G;AACtG;AACP,IAAI,yCAAyC;AAC7C;AACA;;ACJO;AACP;AACA;AACA;AACA;AACA;;ACLyE;AACH;AAC/D;AACP;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC,2DAA2D,oBAAoB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC,aAAa;AACb;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA;AACA;AACA,qEAAqE,aAAa;AAClF;AACA;AACA,0EAA0E,kBAAkB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;ACvJO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBsF;AAC/E;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,aAAa;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,sDAAsD,SAAS,wCAAwC,0BAA0B,EAAE,0BAA0B;AAC7J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+EAA+E;AAC/F;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AClOO;AACP;AACA;AACA;;ACH2C;AACpC;AACP,WAAW,WAAW;AACtB;AACA;;ACJO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZ6D;AACtD;AACP,IAAI,kBAAkB;AACtB;AACA;;ACJ6D;AACtD;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ,kBAAkB;AAC1B;AACA;AACA;;ACVO;AACP;AACA;AACA;;ACH2E;AACpE;AACP,QAAQ,sBAAsB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACT6D;AACtD;AACP,WAAW,kBAAkB;AAC7B;AACA;;ACJmF;AAC5E;AACP,2BAA2B,4BAA4B;AACvD;AACA;AACA;AACA;AACA;;ACPqD;AACQ;AACtD;AACP,oCAAoC,cAAc;AAClD,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA;AACA;AACA;;ACV2E;AACpE;AACP,QAAQ,sBAAsB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;ACT8C;AACO;AAC9C;AACP,WAAW,cAAc,CAAC,gBAAgB;AAC1C;AACA;;ACL+C;AACM;AAC9C;AACP,WAAW,cAAc,CAAC,iBAAiB;AAC3C;AACA;;ACL4C;AACrC;AACP,WAAW,kBAAkB;AAC7B;AACA;;ACJqD;AAC9C;AACP,YAAY,2BAA2B;AACvC;AACA;;ACJO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACzCO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVO;AACP;AACA;AACA;;ACHgE;AACzD;AACP;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;AACA;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,KAAK;AACL;AACA;;ACnE+D;AACZ;AACkC;AACwB;AACE;AACK;AAC5B;AAC2B;AAClB;AACkB;AACE;AACS;AAC9C;AACE;AACU;AACtB;AACE;AACF;AACF;AACL;AACO;AACa;AAC8B;AACL;AAC7B;AACc;AAC7F;AACA,YAAY,8BAA8B,EAAE,wBAAwB;AACpE,YAAY,UAAU,EAAE,uBAAuB;AAC/C,2BAA2B,4BAA4B;AACvD;AACA,gCAAgC,kBAAkB;AAClD,iCAAiC,mBAAmB;AACpD;AACA,sCAAsC,wCAAwC;AAC9E,YAAY,oCAAoC;AAChD,+BAA+B,cAAc;AAC7C;AACA;AACA;AACA;AACA,sCAAsC,uCAAuC;AAC7E,YAAY,qCAAqC;AACjD,+BAA+B,cAAc;AAC7C;AACA;AACA;AACA;AACA,QAAQ,kBAAkB;AAC1B;AACA,YAAY,iBAAiB;AAC7B,YAAY,oCAAoC;AAChD;AACA;AACA,YAAY,qCAAqC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8BAA8B,EAAE,uBAAuB;AACnE,kCAAkC,2BAA2B;AAC7D;AACA,uCAAuC,uCAAuC;AAC9E;AACA;AACA;AACA;AACA;AACA,YAAY,8BAA8B,EAAE,wBAAwB;AACpE,kCAAkC,2BAA2B;AAC7D;AACA,uCAAuC,wCAAwC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8BAA8B;AACtC,uCAAuC,cAAc;AACrD,YAAY,4CAA4C,CAAC,kBAAkB,UAAU,kBAAkB;AACvG;AACA;AACA,QAAQ,iBAAiB;AACzB,gBAAgB,eAAe,EAAE,uBAAuB;AACxD,QAAQ,sCAAsC;AAC9C;AACA;AACA;AACA;AACA;AACA,QAAQ,8BAA8B;AACtC,uCAAuC,cAAc;AACrD,YAAY,kBAAkB,oBAAoB,mBAAmB;AACrE;AACA;AACA;AACA;AACA,yCAAyC,uBAAuB;AAChE;AACA;AACA,YAAY,2BAA2B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,uBAAuB;AAChE;AACA;AACA;AACA,gBAAgB,2BAA2B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,uBAAuB;AAChE;AACA;AACA;AACA;AACA;AACA,YAAY,2BAA2B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oCAAoC;AACxE,+BAA+B,oCAAoC;AACnE,qBAAqB;AACrB,gBAAgB,6BAA6B;AAC7C;AACA,YAAY,oBAAoB;AAChC,YAAY,mBAAmB;AAC/B;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B,mDAAmD,kBAAkB;AACrE;AACA,uCAAuC,uCAAuC;AAC9E,sCAAsC,kBAAkB;AACxD;AACA;AACA;AACA,yEAAyE,kBAAkB;AAC3F,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA,qCAAqC,mBAAmB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;;AC1SwD;AACjD;AACP;AACA,wCAAwC,0BAAmB;AAC3D;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,gCAAgC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7JO;AACP;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA,4BAA4B,kCAAkC;AAC9D;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BqE;AACtB;AAC/C,MAAM,8CAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,oEAAoE,GAAG,8CAAe,cAAc;AACpG;AACA;AACA,sDAAsD,2CAA2C;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,mCAAmC,WAAW;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EO;AACP,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfO;AACP;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;ACZoD;AACS;AACR;AAC9C;AACP,+BAA+B,cAAc,CAAC,sBAAsB;AACpE,mCAAmC,kBAAkB;AACrD,WAAW,cAAc;AACzB;AACA;;ACR+D;AACJ;AACU;AACW;AACE;AAChB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uBAAuB;AACxD,wCAAwC,wBAAwB;AAChE,mBAAmB,kBAAkB;AACrC,oBAAoB,kBAAkB;AACtC,uFAAuF,0CAA0C,KAAK;AACtI,oBAAoB,YAAY;AAChC;AACA,4BAA4B,4BAA4B;AACxD,gCAAgC,0BAA0B;AAC1D,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA,iEAAiE,MAAM;AACvE,gBAAgB,eAAe;AAC/B,aAAa;AACb;AACA,wBAAwB,4BAA4B;AACpD,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,qEAAqE,6BAA6B;AAClG,oCAAoC,2BAA2B;AAC/D,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4BAA4B;AACpE;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,wCAAwC,4BAA4B;AACpE;AACA,4CAA4C,0BAA0B;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,2BAA2B;AAChG;AACA,oCAAoC,2BAA2B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/OO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sCAAsC;AACtF;AACA;AACA;AACA;AACA;AACA,4DAA4D,gBAAgB;AAC5E;AACA;AACA,8DAA8D,iBAAiB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,uBAAuB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,6BAA6B;AACpF,uDAAuD,4BAA4B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;ACnFsF;AACtF,MAAM,8CAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,8CAAe;AACtD;AACA;AACA;AACA;AACA;AACA,kFAAkF,0BAA0B,EAAE,0BAA0B;AACxI;AACA,6GAA6G,0BAA0B,qBAAqB,0BAA0B;AACtL;AACA;AACA;AACA,wGAAwG,0BAA0B,GAAG,0BAA0B;AAC/J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA,MAAM,+CAAe;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,+CAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA,MAAM,iDAAe;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,mEAAmE,GAAG,iDAAe,cAAc;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCO;AACP;AACA;AACA;AACA;AACA;;ACLgE;AACzD;AACP;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;;ACbO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBsF;AAClB;AACe;AACE;AACrF,MAAM,gDAAe;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,gDAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,0BAA0B,EAAE,0BAA0B;AACpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA,wBAAwB,iBAAiB;AACzC,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDO;AACP;AACA;AACA;AACA;AACA;AACA;;ACNA,MAAM,0CAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,0CAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClD2E;AACT;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,wDAAwD,gBAAgB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBO;AACP;;ACDO;AACP,YAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AClBmE;AACwC;AACpG;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mCAAmC;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AC3EqF;AAC9E;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA,MAAM,sCAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,sCAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;;ACHmD;AACA;AAC5C;AACP;AACA,0BAA0B,WAAW;AACrC,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;;ACpBgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA,MAAM,oDAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,oDAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,gBAAgB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDO;AACP;;ACDO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF;AACtF,8CAA8C,gCAAgC;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AChDO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;ACdsF;AACtF,MAAM,qCAAe;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,qCAAe;AACtD;AACA;AACA;AACA;AACA;AACA,gFAAgF,0BAA0B,EAAE,0BAA0B;AACtI;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTO;AACP,4BAA4B,QAAQ;AACpC;AACA;;ACHO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;;ACDgE;AACzD;AACP;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;;ACVO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTO;AACP;;ACD6E;AACtE;AACP;AACA;AACA;AACA,sBAAsB,wBAAwB;AAC9C;AACA;AACA;AACA,KAAK;AACL;AACA;;ACX4H;AAC5H,MAAM,2CAAe;AACrB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,oCAAoC,GAAG,2CAAe;AACtD;AACA;AACA;AACA;AACA;AACA,YAAY,2CAA2C;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA,IAAI,8IAA8I;AAC3I;AACP;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA,wBAAwB,eAAe;AACvC,oDAAoD;AACpD;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD,yEAAyE;AACzE;AACA,gCAAgC,oBAAoB;AACpD,sEAAsE;AACtE;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;;AC1BwD;AACU;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA,QAAQ,YAAY;AACpB;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,gBAAgB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FqF;AAC9E;AACP;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BO;AACP;AACA;AACA;AACA;AACA;AACA;;ACNO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;AACA;AACA;AACA;;ACNO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;;ACDO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA,MAAM,+DAAe;AACrB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,GAAG,+DAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTyE;AACH;AAC/D;AACP;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC,2DAA2D,oBAAoB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AC3I2C;AACpC;AACP;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrByE;AACJ;AACrE,MAAM,yDAAe;AACrB;AACA;AACO;AACP;AACA;AACA,oBAAoB,uCAAuC,IAAI,GAAG,yDAAe;AACjF;AACA;AACA,iCAAiC,kBAAkB,QAAQ,kBAAkB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AClEO;AACP;AACA;AACA;AACA;AACA;AACA;;ACNgF;AACzE;AACP,IAAI,2BAA2B;AAC/B,IAAI,2BAA2B;AAC/B,IAAI,2BAA2B;AAC/B;AACA;;ACNO;AACP;AACA;AACA;;ACHO;AACP;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;;ACXyF;AACE;AACmD;AACf;AACxH;AACP;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;AACA,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC;AACA,6BAA6B,mDAAmD,QAAQ,mDAAmD;AAC3I,YAAY,4CAA4C;AACxD;AACA;AACA;AACA;AACA;;ACxBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTO;AACP;AACA;AACA;AACA;AACA;AACA;;ACN2E;AACpE;AACP;AACA;AACA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACbO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACXO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACV6G;AACpB;AACE;AACoD;AACU;AACF;AAChJ;AACP;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ,oCAAoC;AAC5C,QAAQ,2BAA2B;AACnC;AACA,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC;AACA;AACA,YAAY,oDAAoD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yDAAyD;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wDAAwD;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;ACzDO;AACP;AACA;AACA;AACA;AACA;AACA;;ACNO;AACP,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVqH;AAC9G;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,6CAA6C;AAC7C;AACA;AACA;AACA,6FAA6F,UAAU;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD;AACA;AACA;AACA;;AC3HO;AACP;AACA;AACA;AACA;AACA;AACA;;ACNO;AACP;AACA,gBAAgB,eAAe;AAC/B,6BAA6B,MAAM;AACnC;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACjBkF;AAC3E;AACP,gDAAgD,4BAA4B;AAC5E;AACA;AACA;;ACLoD;AAC0C;AACvF;AACP,6BAA6B,0BAA0B;AACvD;AACA;AACA,QAAQ,0BAA0B;AAClC;AACA,yCAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;;ACZsF;AACnB;AACJ;AACJ;AAC6B;AACnB;AACtB;AACxC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,yBAAyB,yCAAyC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA,6DAA6D,0BAA0B;AACvF,qBAAqB;AACrB;AACA,6DAA6D,0BAA0B;AACvF;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,wBAAwB,4BAA4B;AACpD;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA,iCAAiC,WAAW;AAC5C;AACA,+DAA+D,MAAM;AACrE;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,6CAA6C,2BAA2B;AACxE;AACA,uBAAuB,kBAAkB;AACzC,wBAAwB,kBAAkB;AAC1C;AACA;AACA,0EAA0E,MAAM,QAAQ,0CAA0C,KAAK;AACvI;AACA;AACA;AACA;AACA;AACA,iEAAiE,6BAA6B;AAC9F;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,2BAA2B;AAC3E;AACA;AACA,gCAAgC,gBAAgB;AAChD,oCAAoC,4BAA4B;AAChE,wCAAwC,0BAA0B;AAClE,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA,6EAA6E,MAAM;AACnF,4BAA4B,eAAe;AAC3C,yBAAyB;AACzB;AACA,oCAAoC,4BAA4B;AAChE,wCAAwC,2BAA2B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,6EAA6E,6BAA6B;AAC1G,4CAA4C,2BAA2B;AACvE,gCAAgC,aAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,wCAAwC,4BAA4B;AACpE;AACA,4CAA4C,0BAA0B;AACtE;AACA;AACA;AACA;AACA;AACA,4CAA4C,YAAY;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,6BAA6B;AAClG;AACA,oCAAoC,2BAA2B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1Y6G;AACpB;AACE;AACpF;AACP;AACA,IAAI,4BAA4B;AAChC,IAAI,oCAAoC;AACxC,IAAI,oCAAoC;AACxC,IAAI,oCAAoC;AACxC,IAAI,oCAAoC;AACxC,IAAI,2BAA2B;AAC/B;AACA;AACA;;ACb2F;AACpF;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;;AChB2E;AACpE;AACP;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA,KAAK;AACL;AACA;;AC/B2F;AACX;AACzE;AACP;AACA;AACA;AACA;AACA,IAAI,4BAA4B;AAChC;AACA,IAAI,uBAAuB;AAC3B;AACA;AACA;;ACZ6G;AAClB;AAC8D;AACF;AAChJ;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ,oCAAoC;AAC5C;AACA;AACA,YAAY,yDAAyD;AACrE;AACA;AACA;AACA,YAAY,wDAAwD;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BO;AACP;AACA;AACA;AACA;AACA;;ACLwE;AACjE;AACP,6BAA6B,6BAA6B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,+DAA+D,mCAAmC;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;;ACxFyF;AACE;AACpF;AACP;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;AACA,QAAQ,2BAA2B;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AClC6G;AAClB;AACpF;AACP;AACA,IAAI,4BAA4B;AAChC,IAAI,oCAAoC;AACxC;AACA;AACA;;ACR6G;AAClB;AACpF;AACP;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C;AACA;AACA;AACA;;ACtB6G;AAClB;AACpF;AACP;AACA,IAAI,4BAA4B;AAChC,IAAI,oCAAoC;AACxC;AACA;AACA;;ACR2F;AACpF;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;;ACbmE;AACX;AACgB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA;AACO;AACP,0CAA0C,8EAA8E;AACxH,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA,mCAAmC,YAAY;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;;AC1IO;AACP;AACA;AACA;;ACH2F;AACpF;AACP;AACA,IAAI,4BAA4B;AAChC;AACA;AACA,0FAA0F,cAAc;AACxG;AACA;AACA;AACA;;ACVO,sEAAsE,aAAa;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,oBAAoB;AACjG;AACA;AACA;;AChBO;AACP,kCAAkC,kBAAkB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACT6G;AACpB;AACE;AAC8D;AACF;AAChJ;AACP;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C;AACA;AACA;AACA;AACA,YAAY,2BAA2B;AACvC;AACA;AACA;AACA,YAAY,yDAAyD;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wDAAwD;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;;AClC6G;AACpB;AACE;AACpF;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,oCAAoC;AAC5C,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC,QAAQ,2BAA2B;AACnC;AACA;AACA;AACA;;AC5B2F;AACnB;AACjE;AACP,6BAA6B,qNAAqN;AAClP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,oEAAoE,8BAA8B;AAClG,2EAA2E,oCAAoC;AAC/G,2EAA2E,oCAAoC;AAC/G,2EAA2E,oCAAoC;AAC/G,wEAAwE,oCAAoC;AAC5G,wEAAwE,oCAAoC;AAC5G,wEAAwE,oCAAoC;AAC5G;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,2EAA2E,cAAc;AACzF,2EAA2E,cAAc;AACzF,wEAAwE,cAAc;AACtF,wEAAwE,cAAc;AACtF,wEAAwE,cAAc;AACtF;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;;AC7RO;AACP,6BAA6B,kCAAkC;AAC/D;AACA;AACA;AACA,oGAAoG,sBAAsB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbO;AACP,2GAA2G;AAC3G;AACA;;ACH6G;AAClB;AACpF;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ,oCAAoC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AClCwE;AACjE;AACP;AACA;AACA;AACA;AACA,qCAAqC;AACrC,iDAAiD;AACjD;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA,mEAAmE,oCAAoC;AACvG;AACA,gFAAgF,mEAAmE;AACnJ;AACA,+EAA+E,wDAAwD;AACvI,oEAAoE,oCAAoC;AACxG;AACA,iFAAiF,oEAAoE;AACrJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,qFAAqF,oCAAoC;AACzH;AACA;AACA;AACA;AACA,SAAS;AACT,sFAAsF,oCAAoC;AAC1H;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,+EAA+E,wDAAwD;AACvI,sFAAsF,oCAAoC;AAC1H;AACA;AACA;AACA;AACA,SAAS;AACT,uFAAuF,oCAAoC;AAC3H;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0DAA0D;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,oEAAoE,8DAA8D;AAClI;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,cAAc,gCAAgC;AAC9C,kEAAkE,cAAc;AAChF,8DAA8D,cAAc;AAC5E,8DAA8D,eAAe;AAC7E;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,uBAAuB,gCAAgC;AACvD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;;AC3QyF;AACE;AACpF;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4BAA4B;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2BAA2B,yBAAyB,OAAO;AACnE,QAAQ,2BAA2B;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxD2F;AACnB;AACjE;AACP,6BAA6B,wCAAwC;AACrE;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ,4BAA4B;AACpC,oEAAoE,8BAA8B;AAClG,qEAAqE,+BAA+B;AACpG,qEAAqE,8BAA8B;AACnG,qEAAqE,+BAA+B;AACpG;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;;AClKO;AACP;;ACDyE;AACJ;AACrE,MAAM,iDAAe;AACrB;AACA;AACO;AACP;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uCAAuC,IAAI,GAAG,iDAAe;AACjF;AACA;AACA,iCAAiC,kBAAkB,QAAQ,kBAAkB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EoE;AACe;AACE;AACrF,MAAM,2CAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,2CAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA,wBAAwB,iBAAiB;AACzC,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFkE;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DsF;AACtF,MAAM,uCAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,uCAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG,0BAA0B,EAAE,0BAA0B;AACxJ,kGAAkG,0BAA0B,EAAE,0BAA0B;AACxJ,kGAAkG,0BAA0B,EAAE,0BAA0B;AACxJ,4FAA4F,0BAA0B,EAAE,0BAA0B;AAClJ,4FAA4F,0BAA0B,EAAE,0BAA0B;AAClJ,4FAA4F,0BAA0B,EAAE,0BAA0B;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5G2E;AACT;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA,mFAAmF,oCAAoC;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,wFAAwF,oCAAoC;AAC5H;AACA;AACA,gCAAgC,qCAAqC;AACrE;AACA;AACA;AACA;AACA,qFAAqF,oCAAoC;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,kCAAkC,2BAA2B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF,oCAAoC;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtKA,MAAM,yCAAe;AACrB;AACA;AACO;AACP;AACA;AACA;AACA,gEAAgE,GAAG,yCAAe,cAAc;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;ACPO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;ACfO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;ACZqE;AAC9D;AACP;AACA;AACA,4BAA4B,kBAAkB,QAAQ,kBAAkB;AACxE;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA,sGAAsG;AACtG;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;ACpCO;AACP;AACA;AACA;AACA;AACA;;ACLO;AACP;AACA;AACA;;ACH2G;AACpG;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACzBA,MAAM,8CAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,8CAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1B2E;AACT;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,+CAA+C,8BAA8B,GAAG;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,WAAW,2CAA2C;AAC5H,2CAA2C;AAC3C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,oBAAoB;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;ACvBO;AACP;;ACDA,MAAM,4CAAe;AACrB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oCAAoC,GAAG,4CAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpD2E;AACT;AAC3D;AACP;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCO;AACP;;ACDO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,+DAA+D;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,0DAA0D;AACzH;AACA;AACA;AACA;AACA;AACA;;AC9BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;ACtBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;ACdO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVO;AACP;AACA;AACA;AACA;AACA,YAAY,WAAW;AACvB,8CAA8C,gDAAgD;AAC9F;AACA;;ACRO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iCAAiC;AAChE;AACA;AACA;;ACfO;AACP,aAAa;AACb;AACA;;ACHO;AACP,YAAY,aAAa;AACzB;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;;ACbO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVO;AACP,YAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AChB+D;AACxD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI,oBAAoB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AC/BO;AACP;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;ACb2S;AAChP;AACuD;AAC3B;AACE;AACN;AACO;AAC0B;AACtC;AACsB;AACd;AACS;AACX;AACsB;AACS;AAC7B;AACiB;AACE;AACzB;AACA;AACN;AACE;AACmB;AACS;AACT;AACA;AACS;AAClC;AAC2B;AACS;AACL;AACS;AACpC;AACU;AAC8C;AAC/B;AACS;AACZ;AACR;AACS;AACO;AACpC;AACE;AACY;AACF;AACS;AAC+B;AACd;AAC3C;AAC2B;AACiB;AACS;AACnD;AACE;AACiB;AACuB;AAC9C;AACiB;AACS;AACkB;AACxB;AACC;AACC;AACe;AAC1B;AAC4C;AACd;AACb;AACS;AACD;AAC7B;AACQ;AACF;AACC;AACN;AACE;AACmB;AACT;AACN;AACE;AACP;AAC0B;AAC1B;AACM;AAC2C;AACQ;AACV;AACW;AAC3B;AACS;AACM;AACzC;AACgB;AACM;AACc;AACZ;AACC;AACQ;AACR;AACW;AAC1B;AACiB;AACX;AACa;AACW;AACtB;AACvB;AAC0C;AAC5C;AAC0B;AACW;AACI;AACQ;AACV;AAC0B;AACnB;AACnB;AACR;AACW;AACP;AACA;AACS;AACW;AACf;AACW;AACjC;AAC2B;AACX;AACS;AACjB;AACS;AACL;AACf;AACi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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjEkC;AACU;AACrC,2BAA2B,8BAAW;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+BAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzIqC;AAC+B;AACxB;AACU;AACI;AACuB;AACjF;AACA;AACA;AACA,yBAAyB,YAAY;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,0CAA0C,oCAAe;AACzD,uBAAuB,sBAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,QAAQ,4CAAc;AACtB,4BAA4B,sBAAO;AACnC;AACA,aAAa,mDAAqB;AAClC,4BAA4B,oCAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI,8BAAS,KAAK,wEAA8B;AAChD;AACA,QAAQ,sBAAO;AACf;AACA;AACA,sCAAsC,OAAO,EAAE,sBAAO,EAAE;AACxD;AACA,qBAAqB,YAAY,sBAAsB;AACvD;AACA;;;;;;;;;;;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACqC;AACc;AAChB;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,sEAAS,wBAAwB,wGAA0B;AACtF,YAAY,0DAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAO;AACtB;;;;;;;;;;;;;;;;;ACrFqK;AAC9H;AACO;AAC9C;AACA;AACA;AACO;AACP,eAAe,8EAAe;AAC9B;AACA;AACA;AACA;AACO;AACP,eAAe,qFAAsB;AACrC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACO;AACP,IAAI,6DAAM,CAAC,oEAAS,CAAC,kFAAmB;AACxC;AACA,eAAe,kFAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACsE;AACtE;;;;;;;;;;;ACrC0C;AACnC,0BAA0B,2DAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,yBAAyB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC7GkC;AACO;AACkB;AACH;AACZ;AACY;AACqB;AACH;AAC9B;AACL;AACvC;AACA;AACA;AACA;AACO,sBAAsB,8BAAW;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wBAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2CAAkB;AAC9C;AACA,aAAa;AACb;AACA,2BAA2B,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mDAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM,CAAC,4CAAc;AAC7B;AACA;AACA;AACA;AACA,QAAQ,wBAAM,CAAC,4CAAc;AAC7B;AACA;AACA;AACA;AACA,QAAQ,wBAAM,CAAC,4CAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+CAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+BAAS;AACxB,YAAY,wBAAM,CAAC,+BAAS;AAC5B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,+BAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8BAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4CAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+BAAS;AACxB,gBAAgB,4CAAc;AAC9B;AACA;AACA;AACA,gBAAgB,8CAAY;AAC5B;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACzdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;;;;;;;;;;;;;;AClCyC;AACe;AACX;AACG;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACO,mBAAmB,mEAAa;AACvC;AACA,cAAc,8EAAoB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8EAAoB;AAC5C,wBAAwB,0DAAK;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ,mEAAQ;AAChB;AACA;AACA,6BAA6B,2FAAyB;AACtD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACzDkC;AACkC;AACvB;AACqB;AACd;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,SAAS;AAC9C;AACA;AACA,IAAI;AACJ;AACO,6BAA6B,8DAAO;AAC3C;AACA;AACA;AACA,qBAAqB,wFAAqB;AAC1C,+BAA+B,0FAAyB;AACxD;AACA,4BAA4B,wFAAqB;AACjD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wFAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA;AACA,uBAAuB,sEAAe;AACtC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACtFyD;AACA;AACD;AACZ;AACE;AACM;AAClB;AACkB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,oBAAoB,sEAAe;AAC1C;AACA,cAAc,8EAAoB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8EAAoB;AAC5C,QAAQ,6DAAM,CAAC,oEAAS;AACxB,aAAa,+EAAY;AACzB,gBAAgB,+EAAY;AAC5B;AACA;AACA,0BAA0B,oEAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6DAAQ;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA;AACA,6BAA6B,8FAA2B;AACxD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS,mBAAmB,oEAAS;AACjD,YAAY,kEAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,qEAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qEAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM,6FAA6F,sBAAsB,IAAI,qBAAqB;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM,sGAAsG,sBAAsB,IAAI,wBAAwB;AACtK;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAE;AACzB;AACA;AACA,QAAQ,6DAAM,2GAA2G,sBAAsB,IAAI,wBAAwB;AAC3K;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM;AACd;AACA;AACA,QAAQ,6DAAM,8FAA8F,sBAAsB,IAAI,0BAA0B;AAChK;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM,uEAAuE,qBAAqB;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM,qEAAqE,qBAAqB;AACxG;AACA;AACA;AACA;AACA;AACA,sBAAsB,8CAAE;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,aAAa;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC7bkC;AACK;AACR;AAC2B;AACF;AACf;AACuB;AACzB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACO,8BAA8B,gDAAI;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2DAAI;AAC1B,wBAAwB,8EAAoB;AAC5C;AACA;AACA,2BAA2B,gFAAa;AACxC;AACA;AACA,iBAAiB,mEAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2DAAI;AACzB,oBAAoB,2DAAI;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6DAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kEAAO;AAC1C;AACA;AACA,wBAAwB,6DAAU;AAClC;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mEAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mEAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM;AACd;AACA,0BAA0B,6DAAU;AACpC,8BAA8B,iCAAiC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,IAAI;AAC3D;AACA;AACA,sCAAsC,6DAAU;AAChD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC1WsE;AACxB;AACd;AACoB;AACP;AAC7C;AACA;AACA;AACO,4BAA4B,sEAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB,gBAAgB,+EAAY,sCAAsC,kDAAK;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,oEAAS,4CAA4C,8EAAW;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,cAAc;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,kBAAkB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,uBAAuB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2DAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA,qBAAqB,8EAAW;AAChC;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA,qBAAqB,8EAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,iBAAiB,8EAAW;AAC5B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,IAAI,6DAAM,CAAC,oEAAS;AACpB,IAAI,6DAAM,CAAC,oEAAS;AACpB,4CAA4C,8EAAW;AACvD,QAAQ,6DAAM;AACd;AACA,IAAI,6DAAM;AACV;AACA,mEAAmE,kDAAK;AACxE,YAAY,oEAAS;AACrB;AACA;AACA;AACA;AACA,YAAY,oEAAS;AACrB;AACA;AACA;AACA;AACA,QAAQ,+EAAY;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,oEAAS;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,8EAAW;AACxB,YAAY,oEAAS;AACrB;AACA;AACA;AACA,QAAQ,+EAAY;AACpB;AACA;AACA,aAAa,8EAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACrUuC;AACR;AACoB;AACV;AACkB;AACsB;AACc;AAC/F;AACA;AACA;AACO,8BAA8B,gDAAI;AACzC;AACA;AACA,wBAAwB,8EAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,6DAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,0DAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oEAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,4EAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAO;AACvB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iFAAuB;AAChD;AACA;AACA;AACA,oBAAoB,oEAAS,YAAY,oEAAS,kBAAkB,oEAAS;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kEAAO,YAAY,mEAAQ,YAAY,mEAAQ,YAAY,oEAAS;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,gDAAgD,oEAAS;AACzD,uCAAuC,oEAAS,2BAA2B,oEAAS;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACzKA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,sCAAsC;AACtC,uCAAuC;AACvC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;ACnEuC;AACwB;AACZ;AAChB;AACnC;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACO,6BAA6B,qDAAS;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAK;AACpB;AACA;AACA,QAAQ,4DAAK;AACb;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,iCAAiC,EAAE;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,iEAAiE,gFAAwB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,eAAe,4DAAI;AACnB;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAI;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAI;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AChO+B;AAC4C;AAC3E;AACA;AACA;AACO,4BAA4B,gBAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6BAAO;AACnB;AACA;AACA,iBAAiB,8BAAQ,eAAe,6BAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8BAAQ;AACzB;AACA;AACA,oBAAoB,+BAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,+BAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8BAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1PuC;AACF;AACM;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACO,wBAAwB,aAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4BAAI;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;AClJuC;AACJ;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,iCAAiC,qDAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;AC/B2H;AAC3H;AACA;AACA;AACO;AACP,WAAW,qFAAe;AAC1B;AACA;AACA;AACA;AACO;AACP,WAAW,oFAAc;AACzB;AACA;AACA;AACA;AACO;AACP,WAAW,8FAAwB;AACnC;AACA;AACA;AACA;AACO;AACP,WAAW,uFAAiB;AAC5B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,sDAAsD,IAAI,IAAI,IAAI,UAAU,MAAM;AAClF;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;ACjDsC;AACtC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,gBAAgB,6DAAW;AAC3B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,gBAAgB,6DAAW;AAC3B;AACA;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;ACxC+E;AACpB;AAC3D;AACA;AACA;AACA;AACA,8BAA8B,0EAAY,SAAS,yEAAW,SAAS,2EAAa;AACpF;AACO;AACP;AACA;AACA;AACA;AACA,QAAQ,8DAAQ,YAAY,8DAAQ;AACpC;AACA;AACA;AACA;AACA,qBAAqB,8DAAQ;AAC7B;AACA,4CAA4C,WAAW;AACvD;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,QAAQ,8DAAQ;AAChB;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8DAAQ;AACrC;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC,gBAAgB,+DAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,QAAQ,6DAAO;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;;;;;;;;;;;AClG+B;AACO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,sBAAsB,gDAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAAO;AACvB;AACA;AACA;AACA,oBAAoB,6DAAO;AAC3B;AACA;AACA;AACA;AACA,uDAAuD,QAAQ;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,SAAS;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChHsC;AACtC;AACA;AACA;AACO;AACP,QAAQ,6DAAO;AACf;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACO;AACP,QAAQ,6DAAO;AACf;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;ACnC+B;AACmB;AACjB;AACQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,gDAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yEAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wDAAM;AACd;AACA;AACA;AACA,YAAY,wDAAM,CAAC,mDAAG;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yCAAE;AACtB;AACA,wCAAwC,QAAQ;AAChD,4BAA4B,yCAAE;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mDAAG;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yCAAE;AAClB;AACA,uCAAuC,2BAA2B;AAClE;AACA,wBAAwB,yCAAE;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yCAAE,wBAAwB,yCAAE;AACjD;AACA;AACA,qBAAqB,yCAAE;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAE;AACnC;AACA,qCAAqC,QAAQ;AAC7C,oBAAoB,yCAAE;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC9VA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,4DAA4D;AAC5D;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,qCAAqC,EAAE;AACvC;AACA;;;;;;;;;;;;;;ACvDqD;AACS;AACD;AACX;AAClD;AACA;AACA;AACO,yBAAyB,gFAAa;AAC7C;AACA,cAAc,mFAAoB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mFAAoB;AAC5C,yCAAyC,sEAAM;AAC/C;AACA;AACA,SAAS;AACT;AACA,QAAQ,wEAAQ;AAChB;AACA;AACA,6BAA6B,wGAAyB;AACtD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AC9HwD;AACV;AACe;AACL;AACxD;AACA;AACA;AACA;AACA;AACO,iCAAiC,kCAAa;AACrD;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C,QAAQ,iCAAO;AACf,0BAA0B,kBAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,6BAA6B,0DAAyB;AACtD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5D8C;AACgB;AACN;AACM;AACD;AACH;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACO,qBAAqB,mCAAa;AACzC;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C,iDAAiD,kBAAkB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,6BAA6B,2DAAyB;AACtD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,+BAA+B,kBAAK,IAAI,0CAAY;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iCAAO;AACX;AACA;;;;;;;;;;;;;;ACtL4C;AACmB;AACjB;AACF;AAC5C;AACA;AACA;AACO,4BAA4B,gFAAa;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gEAAI;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6DAAI;AAC9B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wGAAyB;AACtD;AACA;AACA;AACA,qBAAqB,gEAAI;AACzB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kEAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kEAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gEAAI;AACjC;AACA;AACA,2BAA2B,gEAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kEAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACtLwD;AACA;AACgB;AAC1C;AACiC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,0BAA0B,mCAAa;AAC9C;AACA,cAAc,yCAAoB;AAClC;AACA,yBAAyB,oBAAM,GAAG,uBAAuB;AACzD,0BAA0B,gBAAI,GAAG,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C,QAAQ,uCAAa;AACrB;AACA;AACA;AACA;AACA,6BAA6B,2DAAyB;AACtD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uCAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAAa;AACb,4CAA4C,SAAS;AACrD,CAAC;AACD,gDAAc;AACd;AACA,CAAC;AACD;;;;;;;;ACxGsC;AACP;AAC/B;AACA;AACA;AACO,4BAA4B,gBAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wBAAQ,GAAG,YAAY;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxCuC;AACc;AACrD;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACO,yBAAyB,uCAAkB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;AC5D+B;AACS;AACP;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,+BAA+B,gBAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM,CAAC,+BAAS;AACxB,QAAQ,wBAAM,CAAC,+BAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1hBsC;AACA;AACtC;AACA;AACA;AACA;AACO,4BAA4B,wBAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6BAAW;AACnB,iCAAiC;AACjC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AC7EyC;AACe;AACZ;AACA;AAC5C;AACA;AACA;AACA;AACA;AACO,wBAAwB,kBAAK;AACpC;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA,2BAA2B,wBAAQ;AACnC;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6BAA6B,0CAAiB;AAC9C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,6BAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5O6C;AACW;AAChB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,oBAAM;AACtC;AACA,cAAc,yCAAoB;AAClC;AACA,wBAAwB,yCAAoB;AAC5C,uCAAuC,SAAS;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,6BAA6B,4CAAkB;AAC/C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC/D6D;AACL;AACX;AACS;AACV;AACE;AACJ;AACR;AAClC;AACA;AACA;AACO,yBAAyB,sCAAe;AAC/C;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA;AACA,+BAA+B,wBAAQ;AACvC,wBAAwB,yCAAoB;AAC5C,6BAA6B,UAAU;AACvC;AACA;AACA;AACA,SAAS;AACT,QAAQ,8BAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,EAAE,8DAA2B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAE;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3R6D;AACL;AACd;AACS;AACG;AACZ;AACW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACO,oBAAoB,sCAAe;AAC1C;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA,wBAAwB,sBAAI;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C;AACA,+BAA+B,UAAU;AACzC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ,8BAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8DAA2B;AACxD,sBAAsB,sBAAI;AAC1B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sCAAoB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAa;AACb;;AC1PyC;AACzC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpD2C;AACO;AAClD;AACA;AACA;AACA;AACO,mCAAmC,cAAc;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,EAAE,0BAA0B;AAC3D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,UAAU;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,UAAU;AAC5F;AACA,+EAA+E,UAAU;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FiD;AACa;AACmB;AAC1C;AACsB;AAClB;AACgB;AACH;AACd;AACa;AACK;AAChB;AACW;AACvB;AACkB;AACY;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACO,wBAAwB,sCAAe;AAC9C;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,aAAa;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wBAAQ;AACrC;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C;AACA;AACA,0BAA0B,KAAK;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ,8BAAQ;AAChB;AACA;AACA,4CAA4C;AAC5C;AACA;AACA,6BAA6B,8DAA2B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0BAA0B,cAAc;AACxC;AACA,sBAAsB,uCAAkB;AACxC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA,0BAA0B,qBAAS;AACnC,0BAA0B,qBAAS;AACnC,sBAAsB,uCAAkB;AACxC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,cAAc;AACxC;AACA;AACA,sBAAsB,uCAAkB;AACxC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,+BAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,YAAY,6BAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gBAAI;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,QAAQ;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8BAAQ;AAChB;AACA;AACA;AACA;AACA;AACA,kCAAa;AACb;AACA;AACA;AACA,+CAAa;AACb,wCAAwC,SAAS;AACjD,CAAC;AACD,gDAAc;AACd;AACA,CAAC;AACD;;AC7kBqD;AAChB;AACJ;AAC6B;AACX;AACK;AACG;AACC;AACM;AAC3B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,qBAAqB,mCAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAI;AAChC,2BAA2B,sBAAI;AAC/B;AACA;AACA,yCAAyC,oBAAM;AAC/C;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ,8BAAQ;AAChB;AACA;AACA;AACA,6BAA6B,2DAAyB;AACtD;AACA,oBAAoB,sBAAI;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,2BAA2B,6BAAO;AAClC;AACA;AACA;AACA;AACA,YAAY,wBAAM,CAAC,gBAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,+BAAU;AAC5D;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sCAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,2BAA2B,6BAAO;AAClC;AACA,sEAAsE,+BAAS;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACxR8C;AACuB;AACO;AAC3B;AACG;AACjB;AACmB;AACF;AACE;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,qBAAqB,oDAAM;AAClC;AACA,cAAc,mFAAoB;AAClC;AACA;AACA;AACA;AACA;AACA,wBAAwB,mFAAoB;AAC5C,2BAA2B,mFAAe;AAC1C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,4EAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gEAAI;AACxB,qBAAqB,gEAAI;AACzB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,gEAAI;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yEAAU;AAC/B;AACA;AACA;AACA,qBAAqB,yEAAU;AAC/B;AACA;AACA;AACA;AACA;AACA,mBAAmB,yEAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wEAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,0BAA0B,uEAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uEAAW;AACvB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uEAAW;AACvB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAAU;AACV,IAAI,wEAAS;AACb;AACA,2DAAU;AACV,IAAI,wEAAS;AACb;AACA;;;;;;;;;;;;;;;;;;;AC/V2D;AACV;AACoB;AACO;AAC3B;AACK;AACP;AACE;AACE;AACnD;AACA;AACA;AACA;AACO,+BAA+B,kEAAa;AACnD;AACA,cAAc,mFAAoB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mFAAoB;AAC5C,QAAQ,8EAAO;AACf;AACA;AACA;AACA;AACA,gCAAgC,+DAAK;AACrC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,mFAAe;AAC1C;AACA;AACA;AACA,6BAA6B,0FAAyB;AACtD,qBAAqB,mFAAe;AACpC;AACA;AACA;AACA,oBAAoB,gEAAI;AACxB,qBAAqB,gEAAI;AACzB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kEAAM;AACd;AACA;AACA;AACA;AACA;AACA,qBAAqB,yEAAU;AAC/B;AACA;AACA;AACA,qBAAqB,yEAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6DAAG;AACnB;AACA;AACA;AACA,gBAAgB,mDAAE;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mDAAE;AACd;AACA;AACA;AACA;AACA,YAAY,yEAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACnMO;AACP;;;;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACO;AACP;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACO;AACP,oCAAoC;AACpC;AACA;AACO;AACP;AACA;AACA;AACO;AACP,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACO;AACP,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACO;AACP;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACO;AACP,6BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACO;AACP,kDAAkD,QAAQ;AAC1D,yCAAyC,QAAQ;AACjD,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACO;AACP,6EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA,iBAAiB,uFAAuF,cAAc;AACtH,uBAAuB,gCAAgC,qCAAqC,2CAA2C;AACvI,4BAA4B,MAAM,iBAAiB,YAAY;AAC/D,uBAAuB;AACvB,8BAA8B;AAC9B,6BAA6B;AAC7B,4BAA4B;AAC5B;AACA;AACO;AACP;AACA,iBAAiB,6CAA6C,UAAU,sDAAsD,cAAc;AAC5I,0BAA0B,6BAA6B,oBAAoB,gDAAgD,kBAAkB;AAC7I;AACA;AACO;AACP;AACA;AACA,2GAA2G,uFAAuF,cAAc;AAChN,uBAAuB,8BAA8B,gDAAgD,wDAAwD;AAC7J,6CAA6C,sCAAsC,UAAU,mBAAmB,IAAI;AACpH;AACA;AACO;AACP,iCAAiC,uCAAuC,YAAY,KAAK,OAAO;AAChG;AACA;AACA;AACA;AACA,0CAA0C,4BAA4B;AACtE,CAAC;AACD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,6CAA6C;AAC7C;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClOe;;AAEf;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;AACtB,qBAAqB;AACrB,mBAAmB;AACnB,iBAAiB,sCAAG;AACpB,mBAAmB,wCAAK;AACxB,iCAAiC,oDAAiB;;AAElD,4BAA4B,kDAAe;AAC3C;AACA;;AAEA;AACA;AACA,8CAA8C;;AAE9C;AACA;;AAEA;AACA,oBAAoB,0CAAO;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B,gCAAgC;;AAEhC;AACA;AACA,oCAAoC;AACpC,mCAAmC;;AAEnC;AACA;AACA;AACA;;AAEA,uDAAuD;AACvD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA,4BAA4B,uCAAI;AAChC,OAAO,0CAAO;AACd,OAAO,0CAAO;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA,eAAe;;AAEf;AACA,uBAAuB,MAAM,+CAAY,UAAU,8CAAW,SAAS,4CAAS;;AAEhF;AACA,kBAAkB,KAAK,+CAAY,OAAO,kDAAe;;AAEzD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,0BAA0B,0CAAO;AACjC,yBAAyB,0CAAO;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB,0CAAO;;AAE7B;AACA,oBAAoB,6CAAU,qCAAqC,0CAAO;AAC1E;;AAEA,4BAA4B,0CAAO;AACnC,8BAA8B,6CAAU;AACxC,kCAAkC,0CAAO;;AAEzC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,kBAAkB,GAAG;AACjD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,wBAAwB,4CAAS;AACjC,6BAA6B,4CAAS;;AAEtC;AACA,wBAAwB,0CAAO;;AAE/B,0BAA0B,0CAAO;AACjC,wBAAwB,0CAAO;AAC/B,0BAA0B,0CAAO;;AAEjC,uBAAuB,0CAAO;AAC9B,qBAAqB,0CAAO;AAC5B,uBAAuB,0CAAO;;AAE9B,yBAAyB,0CAAO;AAChC,uBAAuB,0CAAO;AAC9B,yBAAyB,0CAAO;;AAEhC,6BAA6B,0CAAO;AACpC,oBAAoB,0CAAO;AAC3B;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB,0CAAO;;AAExB;AACA,4CAA4C;AAC5C;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,iBAAiB,0CAAO;;AAExB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH,sCAAsC;AACtC;AACA,sBAAsB,0CAAO;;AAE7B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qEAAqE;;AAErE;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qEAAqE;;AAErE;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS,8CAAW;AACpB;;AAEA;;AAEA;;AAEA;;AAEA,SAAS,+CAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;;AAEA;;AAEA,SAAS,4CAAS;AAClB;AACA;;AAEA;;AAEA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,+CAAY;AACvB;;AAEA;;AAEA;;AAEA;;AAEA,WAAW,4CAAS;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,kDAAe;AAC1B;;AAEA;;AAEA;;AAEA;;AAEA,WAAW,qDAAkB;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mBAAmB,0CAAO;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,4DAA4D,eAAe;;AAE3E;;AAEA;AACA;AACA;;AAEuB;;;;;;;;AC7nCvB,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACjBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,kCAAkC,oDAAoD;AACtF;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;AChBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,kCAAkC,6LAA6L;AAC/N;AACA;;;;;;;ACXA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACfA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL,kCAAkC,oLAAoL;AACtN;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;ACrBA,QAAQ,0GAA0G,EAAE,mBAAO,CAAC,KAAK;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAI,oBAAc;AACzB;;;;;;ACf6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,sBAAK;AACxB;AACA;AACA;AACA;AACA;AACA,2BAA2B,mCAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,mCAAkB;AAChE;AACA;AACA;AACA;AACA;AACA,iEAAiE,sBAAK;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gBAAgB;AAC1C;AACA;AACA,0BAA0B,kBAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,oCAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,CAAC;AACkB;AACnB;;ACjHmD;AACoF;AAC9F;AACT;AACI;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,SAAS,6BAA6B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,aAAa;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY,sBAAK;AACjD,mCAAmC;AACnC;AACA,kBAAkB,YAAY;AAC9B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kCAAW;AAC/B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,sBAAK;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,8BAAQ,CAAC,8BAAQ,GAAG,gBAAgB,mBAAmB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,sBAAK;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,8BAAQ,CAAC,8BAAQ,GAAG,gBAAgB,mBAAmB;AACpH;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,sBAAK;AACnE;AACA;AACA;AACA,kDAAkD,8BAAQ,CAAC,8BAAQ,GAAG,WAAW,mBAAmB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA,wBAAwB,uCAAsB;AAC9C,+BAA+B,8BAAQ,GAAG,sBAAsB;AAChE;AACA,cAAc,qCAAc,eAAe,kDAAkD;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAc,IAAI,mCAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,qBAAqB,qCAAe;AACpC,+CAA+C;AAC/C,0BAA0B,OAAO,CAAC,8BAAQ,CAAC,8BAAQ,CAAC,8BAAQ,GAAG;AAC/D,sCAAsC,cAAc,uBAAuB,oBAAoB,sBAAsB;AACrH;AACA;AACA;AACA;AACA,wCAAwC,kBAAkB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA,4CAA4C,8BAAQ;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oBAAc,IAAI,mCAAW;AACrC;AACA;AACA,CAAC;AACc;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,kBAAkB,qCAAe;AACjC;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0BAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,kCAAW;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA;AACO;AACP,WAAW,wCAAkB,sBAAsB,mBAAmB;AACtE;AACA;AACA,yBAAyB,WAAW;AACpC;AACA;AACA;AACA;AACO;AACP;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACrgBmD;AACgE;AACnH;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0BAA0B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,mBAAmB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yDAAQ;AAC5C,6BAA6B,yDAAQ,GAAG;AACxC,8BAA8B,yDAAQ,GAAG;AACzC,iCAAiC,yDAAQ,GAAG;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,yDAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yDAAQ,CAAC,yDAAQ,GAAG;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yDAAQ,CAAC,yDAAQ,GAAG,uBAAuB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yDAAQ,CAAC,yDAAQ,GAAG;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yDAAQ,CAAC,yDAAQ,GAAG,wBAAwB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yDAAQ,CAAC,yDAAQ,GAAG,2BAA2B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAQ,CAAC,yDAAQ,GAAG;AAC7C,0BAA0B,yDAAQ,CAAC,yDAAQ,GAAG;AAC9C,6BAA6B,yDAAQ,CAAC,yDAAQ,GAAG;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sEAAa;AAC9B;AACA;AACA,yBAAyB,yDAAQ,CAAC,yDAAQ,GAAG;AAC7C,0BAA0B,yDAAQ,CAAC,yDAAQ,GAAG;AAC9C,6BAA6B,yDAAQ,CAAC,yDAAQ,GAAG;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,yDAAQ,GAAG,WAAW,+EAAsB,IAAI;AAC/E,4BAA4B,yDAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,yDAAQ,CAAC,yDAAQ,GAAG;AAC9C;AACA;AACA,yBAAyB,yDAAQ,CAAC,yDAAQ,GAAG;AAC7C;AACA;AACA,yBAAyB,yDAAQ,CAAC,yDAAQ,GAAG;AAC7C;AACA;AACA,6BAA6B,yDAAQ,CAAC,yDAAQ,GAAG;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yDAAQ,GAAG,qCAAqC;AAC7E;AACA;AACA,6BAA6B,yDAAQ,GAAG,8BAA8B;AACtE;AACA;AACA;AACA,4BAA4B,yDAAQ;AACpC;AACA;AACA,2CAA2C,yDAAQ;AACnD;AACA;AACA;AACA;AACA;AACA,sCAAsC,yDAAQ,CAAC,yDAAQ,GAAG;AAC1D;AACA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA,gCAAgC;AAChC,mBAAmB,gEAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,uCAAuC,yDAAQ,GAAG;AAClD,oBAAoB,mEAAU;AAC9B;AACA,iDAAiD,wFAAwF;AACzI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACgB;AACjB;AACA;AACA;AACA;AACA,WAAW,0EAAkB,wCAAwC,YAAY;AACjF;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACO;AACP;AACA,oBAAoB;AACpB;AACA;AACA;AACO;AACP;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACO;AACP,oCAAoC;AACpC;AACA;AACO;AACP;AACA;AACA;AACO;AACP,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACO;AACP,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACO;AACP,6BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACO;AACP,kDAAkD,QAAQ;AAC1D,yCAAyC,QAAQ;AACjD,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA,iBAAiB,uFAAuF,cAAc;AACtH,uBAAuB,gCAAgC,qCAAqC,2CAA2C;AACvI,4BAA4B,MAAM,iBAAiB,YAAY;AAC/D,uBAAuB;AACvB,8BAA8B;AAC9B,6BAA6B;AAC7B,4BAA4B;AAC5B;AACA;AACO;AACP;AACA,iBAAiB,6CAA6C,UAAU,sDAAsD,cAAc;AAC5I,0BAA0B,6BAA6B,oBAAoB,gDAAgD,kBAAkB;AAC7I;AACA;AACO;AACP;AACA;AACA,2GAA2G,uFAAuF,cAAc;AAChN,uBAAuB,8BAA8B,gDAAgD,wDAAwD;AAC7J,6CAA6C,sCAAsC,UAAU,mBAAmB,IAAI;AACpH;AACA;AACO;AACP,iCAAiC,uCAAuC,YAAY,KAAK,OAAO;AAChG;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,6CAA6C;AAC7C;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzNA;AACA;AACO;AACA;AACP;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfkE;AACzB;AACM;AAC/C;AACA;AACA;AACO;AACP,IAAI,+CAAyB;AAC7B,IAAI,+CAAyB;AAC7B;AACA;AACA;AACA;AACA;AACA,4BAA4B,sCAAoB;AAChD;AACA;AACA,QAAQ,2BAAc,IAAI,6BAAU;AACpC;AACA;AACA;AACA;;;;;;;ACrBmD;AACN;AACwC;AAC7B;AACf;AACW;AACR;AACA;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,mCAAiB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,mCAAmC,uBAAuB;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ,2BAAc,IAAI,+BAAW;AACrC;AACA;AACA;AACA;AACA;AACA,QAAQ,2BAAc;AACtB,YAAY,6BAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2BAAc;AACtB,YAAY,6BAAU;AACtB;AACA;AACA,IAAI,2BAAc,IAAI,6BAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oBAAK;AACb,QAAQ,2BAAc;AACtB,YAAY,+BAAW;AACvB;AACA;AACA;AACA;AACA,QAAQ,2BAAc;AACtB,YAAY,+BAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,0BAA0B,kCAAW;AACrC,+CAA+C,8BAAQ,GAAG,yFAAyF;AACnJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,0BAA0B,uCAAe;AACzC,+CAA+C,8BAAQ,GAAG,yFAAyF;AACnJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,kBAAkB,8BAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,8BAAc;AAChC;AACA;AACA;AACA;AACA;AACA,8BAA8B,+BAAc;AAC5C;AACA,SAAS;AACT;AACA,8BAA8B,+BAAc;AAC5C,2CAA2C,gBAAgB;AAC3D,SAAS;AACT;AACA,8BAA8B,+BAAc;AAC5C;AACA,SAAS;AACT;AACA,8BAA8B,+BAAc;AAC5C;AACA,SAAS;AACT;AACA;AACA,wCAAwC,SAAS,2BAAU,eAAe;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+BAA+B,WAAW;AAC1C;AACA,0CAA0C,8BAAQ;AAClD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,QAAQ,0BAAS;AACjB;AACA;AACA;AACA,IAAI,4BAA4B;AAChC;AACA;;;;;;;;;;;;;;;;;;;ACrO4C;AACY;AACyB;AACxC;AACH;AACM;AACrC;AACA;AACP;AACA;AACA;AACA;AACA,IAAI,0DAAS;AACb;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF,wEAAe;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,yDAAY;AACyB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,0DAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC,uDAAuD,8BAA8B;AACrF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS,aAAa;AACtB;AACA;AACA;AACA,uCAAuC,eAAe,wEAAe;AACrE;AACA;AACA;AACA,YAAY,2DAAc;AAC1B,gBAAgB,mEAAU;AAC1B;AACA,8BAA8B,yDAAQ,+CAA+C,UAAU;AAC/F;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2DAAc;AAClC,wBAAwB,mEAAU;AAClC;AACA;AACA;AACA,oBAAoB,2DAAc;AAClC,wBAAwB,mEAAU;AAClC;AACA;AACA,aAAa;AACb,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2DAAc,IAAI,mEAAU;AACpC;AACA,QAAQ,2DAAc,IAAI,mEAAU;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA;AACA;AACA;AACA;AACA,wBAAwB,wEAAe;AACvC;AACA;AACA,iCAAiC,kEAAiB,EAAE,sFAAkC;AACtF;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA,wBAAwB,kEAAiB,EAAE,sFAAkC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2DAAc,IAAI,mEAAU;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,CAAC,8DAAW;AACc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC3QiC;AACyC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACuB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8DAAK;AAC5B;AACA;AACA;AACA,sBAAsB,8DAAK;AAC3B;AACA;AACA;AACA,8BAA8B,wEAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yDAAQ,CAAC,yDAAQ,GAAG,kBAAkB,yEAAyE;AAChJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yDAAQ,CAAC,yDAAQ,GAAG,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yDAAQ,CAAC,yDAAQ,GAAG,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,wEAAe;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC;AACe;AAChB;AACA,uCAAuC,qBAAqB;AAC5D;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACnS4C;AACK;AACuB;AAC/B;AACgB;AACzD;AACA;AACA,IAAI,0DAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,oEAAa;AAClC,YAAY,qEAAY,MAAM,sDAAG;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,oCAAoC,yDAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yDAAQ,GAAG;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yDAAQ,CAAC,yDAAQ,GAAG;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,qEAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,mEAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,uCAAuC;AACrI;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc;AAC1B,gBAAgB,mEAAU;AAC1B;AACA;AACA,QAAQ,2DAAc,IAAI,mEAAU;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0EAAiB,CAAC,yDAAQ,CAAC,yDAAQ,GAAG,kBAAkB,yCAAyC;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,iDAAS;AACY;AACvB;;;;;;;;;;;;;;AC1I4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2E;AAC3E;AACA;AACA;AACA;AACA;AACO;AACP,iBAAiB,oEAAa;AAC9B;AACA;AACA;AACA;AACO;AACP,0BAA0B,oEAAa;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACyD;AACzD;;;;;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACO;AACP;AACA,oBAAoB;AACpB;AACA;AACA;AACO;AACP;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACO;AACP,oCAAoC;AACpC;AACA;AACO;AACP;AACA;AACA;AACO;AACP,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACO;AACP,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACO;AACP,6BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACO;AACP,kDAAkD,QAAQ;AAC1D,yCAAyC,QAAQ;AACjD,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA,iBAAiB,uFAAuF,cAAc;AACtH,uBAAuB,gCAAgC,qCAAqC,2CAA2C;AACvI,4BAA4B,MAAM,iBAAiB,YAAY;AAC/D,uBAAuB;AACvB,8BAA8B;AAC9B,6BAA6B;AAC7B,4BAA4B;AAC5B;AACA;AACO;AACP;AACA,iBAAiB,6CAA6C,UAAU,sDAAsD,cAAc;AAC5I,0BAA0B,6BAA6B,oBAAoB,gDAAgD,kBAAkB;AAC7I;AACA;AACO;AACP;AACA;AACA,2GAA2G,uFAAuF,cAAc;AAChN,uBAAuB,8BAA8B,gDAAgD,wDAAwD;AAC7J,6CAA6C,sCAAsC,UAAU,mBAAmB,IAAI;AACpH;AACA;AACO;AACP,iCAAiC,uCAAuC,YAAY,KAAK,OAAO;AAChG;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,6CAA6C;AAC7C;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACzN2C;AACX;AAChC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,oCAAoC,2BAA2B,+CAA+C;AAC7J;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uDAAQ;AACjC;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,iBAAiB,iEAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACO;AACP,YAAY,0DAAS;AACrB,UAAU,qBAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,iEAAiE;AACjE;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACrC2C;AACF;AACE;AACG;AACI;AAClB;AACe;AACmB;AAClE,aAAa,iEAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc,IAAI,+DAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yDAAQ,wCAAwC,UAAU;AAChF;AACA;AACA;AACA;AACA;AACA,gBAAgB,2DAAc;AAC9B,oBAAoB,iEAAY,iFAAiF,sEAAe;AAChI;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6EAAsB;AAC1B;AACA;AACA;AACA,QAAQ,uDAAI;AACZ;AACA;AACA,iCAAiC,uBAAuB;AACxD;AACA;AACA,6CAA6C,0BAA0B;AACvE;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS,wEAAmB;AAC5B;AACA;AACA,IAAI,uDAAI;AACR;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qCAAqC,yDAAQ,GAAG;AAChD;AACA;AACA,yCAAyC,yDAAQ,CAAC,yDAAQ,GAAG,kBAAkB,8CAA8C;AAC7H;AACA,aAAa;AACb,yCAAyC,yDAAQ,CAAC,yDAAQ,GAAG,kBAAkB,wCAAwC;AACvH;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gCAAgC;AAChC,+BAA+B,2DAAY;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,+BAA+B,2DAAY;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAI;AACR;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uDAAQ;AAChC;AACA,aAAa;AACb;AACA;AACA,gBAAgB,uDAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,gBAAgB,uDAAI;AACpB;AACA;AACA,yCAAyC,uBAAuB;AAChE;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI,uDAAI;AACR;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS,oEAAe;AACxB;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,IAAI,uDAAI;AACR,IAAI,uDAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uDAAI;AACZ;AACA;AACA;AACA;AACA,+HAA+H;AAC/H,uFAAuF,aAAa;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ,uDAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc;AAClB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mBAAmB;AACvB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,qBAAqB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,eAAe;AACnB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,kBAAkB;AACtB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,oBAAoB;AACxB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,cAAc;AAClB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,gBAAgB;AACpB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,eAAe;AACnB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB;AAC3B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,YAAY;AAChB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,mBAAmB;AACvB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC9JyC;AACA;AACsB;AAC/D;AACA,aAAa,iEAAe;AAC5B;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,iBAAiB,iEAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA,QAAQ,2DAAc;AACtB;AACA;AACA;AACA;AACA,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA,8DAA8D,yDAAQ;AACtE,qBAAqB;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,yCAAyC;AACzC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI,2DAAc;AAClB,aAAa,oEAAkB;AAC/B;AACA;AACA;AACA;AACkB;AAClB;;;;;;;;;;;;;;;;;;;ACnFiC;AACU;AACS;AAChB;AACpC;AACA;AACA;AACA;AACA;AACO;AACP,iBAAiB,iEAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,4DAA4D;AAC5D;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,+BAA+B,yDAAQ,CAAC,yDAAQ,CAAC,yDAAQ,GAAG;AAC5D;AACA,yBAAyB,yDAAQ,CAAC,yDAAQ,GAAG;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,+BAA+B,2BAA2B;AAC1D;AACA;AACA;AACA,+BAA+B,2BAA2B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2EAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;ACtBA;AACA;AACA;AACA;AACwC;AACxC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,mFAAmF,gBAAgB;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACxD2C;AACE;AACgD;AACzD;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,8BAA8B,yEAAyE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,sDAAO;AACf,iBAAiB,yDAAQ,GAAG,8DAA8D;AAC1F;AACA,aAAa,sDAAO;AACpB;AACA,iBAAiB,yDAAQ,GAAG,8HAA8H;AAC1J,kDAAkD,2DAAY;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAS,WAAW,mEAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAQ;AACvB;AACA,yCAAyC,kBAAkB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,4DAAa;AACrB;AACA;AACA,0BAA0B,yDAAQ,oCAAoC,UAAU;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACpN2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA,uDAAuD,qBAAqB,qBAAqB,cAAc;AAC/G;AACA;AACA,oCAAoC;AACpC;AACA;AACA,0BAA0B,yDAAQ,sDAAsD,UAAU;AAClG;AACA;AACA,8DAA8D,yDAAQ,8DAA8D,yBAAyB;AAC7J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ,yDAAQ,CAAC,yDAAQ,GAAG,YAAY,qFAAqF,KAAK;AAClK;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC5F0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,MAAM;AAC3B;AACA;AACA,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,SAAS,uDAAQ;AACjB;AACA;AACA,QAAQ,uDAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,sCAAsC;AACtC;AACA;;;;;;;;;;;;;;;;;;AC9GyC;AACE;AACT;AAClC;AACA;AACA,IAAI,yBAAyB;AAC7B;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB;AAC3B;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,oBAAoB;AACxB;AACA;AACA;AACO;AACP,qBAAqB,iEAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,4CAA4C,uBAAuB;AACnE;AACA;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACO;AACP;AACA;AACA;AACA,iBAAiB,iEAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc;AAC1B,gBAAgB,+DAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,gCAAgC;AACpC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI,6BAA6B;AACjC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,sBAAsB;AAC1B;AACA;AACA;AACO;AACP;AACA;AACA;AACA,iBAAiB,iEAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACzKA;AACA;AACA;AACA;AACkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yDAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,0CAA0C,aAAa;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,CAAC;AACsB;AACvB;;;;;;;;;;;;;;;;;AC7J2C;AACQ;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iEAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,2BAA2B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+DAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0DAAS;AACnC;AACA;AACA;AACA,kCAAkC,6EAA6E;AAC/G;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,sBAAsB,iEAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;;;;;;;;;;;;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACO;AACP;AACA,oBAAoB;AACpB;AACA;AACA;AACO;AACP;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACO;AACP,oCAAoC;AACpC;AACA;AACO;AACP;AACA;AACA;AACO;AACP,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACO;AACP,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,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AG,CAAgB;AAC3F,oCAAoC,MAAyC,GAAG,CAAoB;AACpG,2BAA2B,MAAyC,GAAG,CAAY;AACnF,wBAAwB,MAAyC,GAAG,CAAU;AAC9E,0BAA0B,MAAyC,GAAG,CAAY;AAClF,8BAA8B,MAAyC,GAAG,CAAc;AACxF,kCAAkC,MAAyC,GAAG,CAAkB;AAChG,6BAA6B,MAAyC,GAAG,CAAa;AACtF,4BAA4B,MAAyC,GAAG,CAAY;AACpF,wBAAwB,MAAyC,GAAG,CAAS;AAC7E,qBAAqB,MAAyC,GAAG,CAAO;AACxE,sBAAsB,MAAyC,GAAG,CAAO;AACzE,yBAAyB,MAAyC,GAAG,CAAU;AAC/E,4BAA4B,MAAyC,GAAG,CAAY;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,+BAA+B;AAC1C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,+BAAQ;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,+BAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qEAAqE,gCAAS;AAC9E;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,uBAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6BAAM,GAAG;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA,kDAAkD,+BAAQ;AAC1D;AACA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAAQ;AACxB;AACA,SAAS,+BAAQ;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAAQ;AACxB;AACA;AACA;AACA;AACA;AACA,uBAAuB,+BAAQ;AAC/B;AACA,IAAI;AACJ;AACA,SAAS,+BAAQ;AACjB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,KAAK,GAAG;AACrB;AACA,GAAG,EAAE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,+BAAQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAAC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,iHAAiH,IAAI,yCAAyC,IAAI;AAClK;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAoD,EAAE,EAEzD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B,8BAA8B,IAAI,IAAI,2DAA2D,EAAE;AACnG,aAAa,KAAK,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA,aAAa,qBAAE;AACf,YAAY,qBAAE;AACd,mBAAmB,qBAAE;AACrB;AACA;AACA;AACA,eAAe,YAAoB;AACnC;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,6BAAM,GAAG;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAyC,IAAI,CAI5C;AACb;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8BAAO;AACf,sBAAsB,iBAAiB;AACvC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe;AAChB,mDAAmD,8BAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6BAAM;AACV;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAGH,EAAE,EAqBF;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAuE,EAAE,EAM5E;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uBAAuB;AACjC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,SAAS;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAQ;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,WAAW;AACrB;AACA;AACA;AACA,UAAU,WAAW;AACrB;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAyC,GAAG,CAAgB;AAC1G;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN,uBAAuB,4BAA4B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qJAAqJ,8BAAO;AAC5J;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA,YAAY,+BAAQ,WAAW,+BAAQ;AACvC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAAC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+BAAQ;AACpC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,aAAa;AACzB,oBAAoB,uBAAuB;AAC3C,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,uBAAuB,uBAAI;AAC3B,oBAAoB,uBAAI;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAAS;AAC7B;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,2BAA2B,iCAAU,CAAC,+BAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;AACL;AACA,iBAAiB,oCAAoC;AACrD,KAAK;AACL;AACA,UAAU,KAAyC,EAAE,EAO9C;AACP;AACA,KAAK;AACL;AACA,UAAU,KAA4D,EAAE,EAEjE;AACP;AACA;AACA,UAAU,KAA6D,EAAE,EAElE;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,UAAU,+BAAQ;AAClB;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,SAAS;AACnB,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,wBAAwB,qCAAkB;AAC1C,QAAQ,KAA8F,EAAE,EAGnG;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAyC,GAAG,CAAyB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,4BAA4B;AACrC;AACA,QAAQ,+BAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,iBAAiB;AAC3B;AACA,mBAAmB,4BAA4B;AAC/C;AACA;AACA,UAAU,8BAAO;AACjB;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,2BAA2B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+BAAQ;AAC1B;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,iBAAiB,KAAK,iBAAiB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAmB;AACpC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa,GAAG,UAAU,GAAG;AAClD;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,oBAAoB,EAAE,uCAAuC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC,cAAc,kBAAkB,OAAO,EAAE;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,EAAE,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,6BAA6B;AAChE;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B,IAAI,SAAS,GAAG,mBAAmB,EAAE,mCAAmC,GAAG,gBAAgB;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uCAAuC;AACjD;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA,0BAA0B,OAAO,IAAI,GAAG;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,MAAyC,IAAI,CAA2C;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B,kBAAkB,kBAAkB;AACpC;AACA,QAAQ,+BAAQ;AAChB;AACA,MAAM,SAAS,8BAAO;AACtB;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,+BAAQ;AACd;AACA;AACA;AACA,MAAM,+BAAQ;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAyC,IAAI,CAG5C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAI9C;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oBAAoB;AAC9B;AACA;AACA;AACA,UAAU,qBAAqB;AAC/B;AACA;AACA,UAAU,0BAA0B;AACpC;AACA;AACA;AACA;AACA,kBAAkB,0BAA0B;AAC5C;AACA,QAAQ,+BAAQ;AAChB;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ,aAAa,aAAa;AAC1B;AACA;AACA;AACA,UAAU,qBAAqB;AAC/B;AACA;AACA;AACA,UAAU,uBAAuB,GAAG,6BAA6B;AACjE;AACA;AACA,UAAU,qBAAqB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,aAAa,mBAAmB,GAAG,8BAA8B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,qBAAqB;AAC/B,iBAAiB,+BAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAkC;AAC5C,UAAU,aAAa;AACvB;AACA,YAAY;AACZ;AACA;AACA,8CAA8C,MAAyC,IAAI,CAA0C;AACrI,sBAAsB,OAAO;AAC7B;AACA,kBAAkB,uBAAuB;AACzC,YAAY,aAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC,UAAU,yCAAyC;AACnD;AACA,aAAa,wBAAwB;AACrC;AACA;AACA,MAAM,8BAAO;AACb;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8BAAO;AACf;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oDAAoD;AAC9D,UAAU,kCAAkC;AAC5C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,0CAA0C;AACpD,iBAAiB,WAAW;AAC5B;AACA;AACA,YAAY,2BAA2B;AACvC;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,YAAY,2BAA2B;AACvC;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+EAA+E,GAAG;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,KAAK,cAAc,eAAe,IAAI,OAAO,QAAQ,IAAI,GAAG;AACxF;AACA,IAAI;AACJ;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAE9C;AACL;AACA;AACA;AACA;AACA,MAAM,+BAAQ;AACd;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA4D,EAAE,EAEjE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAyC,IAAI,CAAyB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAC6F,EAAE,EAElG;AACT,YAAY,KAAkD,EAAE,EAcvD;AACT;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAyC,GAAG,CAAQ;AAC5D;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,UAAU,SAAS;AACnB;AACA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA;AACA,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,0BAA0B,qCAAkB;AAC5C,UAAU,KAAsH,EAAE,EAG3H;AACP;AACA;AACA;AACA;AACA;AACA,qBAAqB,MAAyC,GAAG,CAAyB;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,uBAAuB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,MAAyC,GAAG,CAAwC;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B,YAAY,KAAkE,EAAE,EAevE;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAyC,GAAG,CAA8B;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,4CAA4C;AACtD,UAAU,4BAA4B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAiD,EAAE,EAEtD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAiD,EAAE,EAMtD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAiD,EAAE,EAMtD;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAiD,EAAE,EAMtD;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,oBAAoB;AAClC,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B;AACA;AACA;AACA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uCAAuC;AACnD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,MAAyC,GAAG,CAAmC;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,aAAa;AACzB;AACA,2EAA2E,IAAI;AAC/E,+BAA+B,+BAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAqE,EAAE,EAQ1E;AACT;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAO9C,CAAC;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAM;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAI9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,iCAAiC;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,YAAY;AAC1C;AACA;AACA,6BAA6B,2BAAI;AACjC;AACA;AACA;AACA;AACA,OAAO,qCAAc;AACrB;AACA;AACA,4BAA4B,qCAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,KAAyC,EAAE,EAoB9C;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B;AAC7C;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,cAAc,+BAAQ;AACtB;AACA;AACA;AACA,QAAQ,UAAU,yCAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uCAAuC;AAC/D;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,2BAAI;AACtD;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,sBAAsB;AAClC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,mBAAmB,+BAAQ;AAC3B;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,0BAA0B,+BAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU,sBAAsB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAwE,EAAE,EAI7E;AACP;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA,QAAQ,mCAAY,CAAC,+BAAQ;AAC7B;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,MAAM;AACN;AACA,WAAW,qCAAqC;AAChD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,kCAAkC,qCAAqC;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD,QAAQ,KAAiD,EAAE,EAOtD;AACL;AACA;AACA,WAAW,kCAAkC,GAAG,YAAY,KAAK,0BAA0B,QAAQ;AACnG;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,sBAAsB;AAChC;AACA;AACA;AACA;AACA,IAAI;AACJ,qBAAqB,aAAa;AAClC;AACA;AACA;AACA;AACA,sBAAsB,+BAAQ;AAC9B,QAAQ;AACR,yBAAyB,+BAA+B,GAAG,YAAY;AACvE;AACA,MAAM;AACN,8BAA8B,+BAA+B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,yBAAyB,OAAO,GAAG,EAAE,aAAa;AAClD;AACA,IAAI;AACJ,6BAA6B,OAAO;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAyC,GAAG,CAA6B;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,+BAAQ,cAAc;AAC/E;AACA;AACA;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA,aAAa,EAAE,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAyC,IAAI,CAI5C;AACL,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iCAAiC,GAAG,IAAI;AACtD,IAAI;AACJ;AACA;AACA;AACA,cAAc,+BAA+B,GAAG,IAAI,EAAE,iCAAiC;AACvF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAyC,GAAG,CAAqB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+BAAQ;AACtB;AACA;AACA;AACA,IAAI,6BAAM,GAAG;AACb;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAAM;AACjC,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI,6BAAM,GAAG;AACb;AACA,KAAK;AACL;AACA;;AAEA,wCAAwC,WAAW;;AAE2nE;;;AC1lJ3xD;AAChX;AACyE;;AAE5G,6BAA6B,MAAyC,GAAG,CAAa;AACtF,gCAAgC,MAAyC,GAAG,CAAgB;AAC5F,4BAA4B,MAAyC,GAAG,CAAY;AACpF,8BAA8B,MAAyC,GAAG,CAAc;AACxF,+BAA+B,MAAyC,GAAG,CAAe;AAC1F,mCAAmC,MAAyC,GAAG,CAAmB;AAClG,8BAA8B,MAAyC,GAAG,CAAc;AACxF,sBAAsB,MAAyC,GAAG,CAAO;AACzE,0BAA0B,MAAyC,GAAG,CAAY;AAClF,gCAAgC,MAAyC,GAAG,CAAiB;AAC7F,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,yBAAyB,GAAG;AACjE;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,2CAA2C,8BAAO;AAClD;AACA;AACA;AACA;AACA,WAAW;AACX,wBAAwB,gCAAS,SAAS,+BAAQ;AAClD;AACA;AACA;AACA,QAAQ,aAAa;AACrB;AACA,MAAM,SAAS,aAAa;AAC5B;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qBAAqB,uCAAgB;AACrC,SAAS,sBAAsB;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,mBAAmB;AAC5B;AACA;AACA,IAAI,MAAkD,GAAG,CAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oBAAoB;AAC1B,QAAQ,sBAAsB;AAC9B,eAAe,sBAAsB;AACrC;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oBAAoB;AAC1B,QAAQ,sBAAsB;AAC9B,cAAc,eAAe,2BAA2B,oBAAoB;AAC5E,+BAA+B,iBAAiB;AAChD;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;;AAEA,MAAM,uCAAc;AACpB,qBAAqB,cAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAyC,IAAI,CAAsB;AACjF;AACA;AACA;AACA,QAAQ,SAAS,kBAAkB;AACnC;AACA,QAAQ;AACR,QAAQ,MAAyC,IAAI,CAAsB;AAC3E;AACA,MAAM;AACN;AACA,MAAM;AACN,MAAM,MAAyC,IAAI,CAAsB;AACzE;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C,8BAAO;AACrD,yCAAyC,8BAAO;AAChD;AACA;AACA;AACA,yCAAyC,8BAAO;AAChD,wCAAwC,8BAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC;AACA,iCAAiC,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,YAAY,WAAW;AACvB;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,WAAW;AACnC,yBAAyB,sBAAsB,iCAAiC,wBAAwB;AACxG;AACA;AACA,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA,MAAM,oCAAW;AACjB,SAAS,WAAa;AACtB,YAAY,YAAY;AACxB;AACA;AACA,UAAU,yBAAyB;AACnC,YAAY,sDAAsD;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW;AACjB,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA,uDAAuD,6BAAU;AACjE,YAAY,WAAW,QAAQ,sBAAsB,IAAI,YAAY,EAAE,gBAAgB,WAAW,wBAAwB,oBAAoB,gBAAgB;AAC9J;AACA;AACA,cAAc,oBAAoB;AAClC;AACA,GAAG;AACH;;AAEA;AACA,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI,MAAyC,IAAI,CAK5C;AACL;AACA;AACA;;AAEA;AACA;AACA,KAAK,MAAyC,GAAG,CAAqB;AACtE;AACA;AACA,SAAS,sBAAsB;AAC/B;AACA;AACA,SAAS,uCAAc;AACvB;AACA,MAAM,oCAAW;AACjB;AACA;AACA;AACA,uCAAuC;AACvC,SAAS,WAAW;AACpB;AACA,IAAI,6BAAM,GAAG;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAAM;AACjC,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,qCAAqC;AACrC,SAAS,SAAS,WAAW,6BAAM,GAAG;AACtC;;AAEuR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxevR;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;;AAEA,kBAAkB,MAAyC,GAAG,CAAiB;AAC/E,kBAAkB,MAAyC,GAAG,CAAiB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6KAA6K,qBAAM,mBAAmB,qBAAM,KAAK;AACjN;AACA;AACA;AACA,yCAAyC,KAAK,eAAe,qBAAqB;AAClF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA,8BAA8B,+BAA+B;AAC7D;AACA;AACA;AACA;AACA,aAAa,KAAK,EAAE,iDAAiD,KAAK,SAAS;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc,GAAG,OAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sBAAsB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,KAAK;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA,yBAAyB;AACzB;AACA;AACA,wBAAwB;AACxB;AACA;AACA,wBAAwB;AACxB;AACA;AACA,uBAAuB;AACvB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,kBAAkB;AAClB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iDAAe,EAAE,EAAC;;;ACpCO;;AAEzB;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,QAAQ,YAAE;AACV;AACA;AACA;AACA;AACA;;AAEA,kDAAe,YAAY,EAAC;;;ACpBkB;;AAE9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA,cAAc,aAAY;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA,qDAAe,eAAe,EAAC;;;AClCe;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA,cAAc,aAAY;;AAE1B;AACA;;AAEA,kDAAe,YAAY,EAAC;;;AClBkB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA,SAAS,aAAY;AACrB;;AAEA,kDAAe,YAAY,EAAC;;;ACfkB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA,cAAc,aAAY;;AAE1B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,kDAAe,YAAY,EAAC;;;ACzBsB;AACE;AACN;AACA;AACA;;AAE9C;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,eA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;AAEA,qDAAe,eAAe,EAAC;;;ACjBqB;AACP;;AAE7C;AACA,IAAI,uBAAW;;AAEf;AACA,IAAI,0BAAc,GAAG,uBAAW;;AAEhC;AACA,2BAA2B,uBAAW;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAe,cAAc,mBAAmB,MAAM,gBAAe;AACvF,SAAS,+BAAY,WAAW,0BAAc;AAC9C;AACA;;AAEA,0DAAe,WAAW,EAAC;;;ACnC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAe,OAAO,EAAC;;;ACzBvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wDAAe,SAAS,EAAC;;;ACjBK;AACS;;AAEvC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B,kCAAW;;AAExC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mBAAS;;AAE1C,uDAAe,QAAQ,EAAC;;;ACrCxB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,6CAAe,OAAO,EAAC;;;ACxBvB;AACA,IAAI,yBAAgB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,yBAAgB;AAC7D;;AAEA,uDAAe,QAAQ,EAAC;;;AClCkB;AACL;AACQ;;AAE7C;AACA,IAAI,yBAAO;AACX;AACA;AACA;AACA;AACA,IAAI,yBAAO;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yBAAO;AACtB;AACA;AACA,0CAA0C,yBAAO;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,SAAS,+BAAY;AACrB,IAAI,kBAAQ,mCAAmC,8BAAU;AACzD;;AAEA,sDAAe,gBAAgB,EAAC;;;AC3DhC;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAAe,SAAS,EAAC;;;;;ACbiB;;AAE1C;AACA,IAAI,qBAAW;;AAEf;AACA,IAAI,oBAAU,GAAG,qBAAW;;AAE5B;AACA,IAAI,uBAAa,GAAG,oBAAU,IAAI,oBAAU,aAAa,qBAAW;;AAEpE;AACA,kBAAkB,uBAAa,IAAI,0CAAkB;;AAErD;AACA;AACA;AACA;AACA,gBAAgB,oBAAU,IAAI,oBAAU,YAAY,oBAAU;;AAE9D;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,CAAC;;AAED,8CAAe,QAAQ,EAAC;;;AC7B8B;AACd;AACF;;AAEtC;AACA,uBAAuB,SAAQ,IAAI,sBAAqB;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,UAAS,qBAAqB,iBAAgB;;AAEpF,2DAAe,YAAY,EAAC;;;AC1BY;AACG;AACR;AACE;AACD;AACS;;AAE7C;AACA,IAAI,0BAAW;;AAEf;AACA,IAAI,6BAAc,GAAG,0BAAW;;AAEhC;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA,cAAc,iBAAO;AACrB,wBAAwB,qBAAW;AACnC,mCAAmC,kBAAQ;AAC3C,8CAA8C,sBAAY;AAC1D;AACA,6BAA6B,UAAS;AACtC;;AAEA;AACA,sBAAsB,6BAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA,mDAAe,aAAa,EAAC;;;AChD7B;AACA,IAAI,wBAAW;;AAEf;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA,+DAA+D,wBAAW;;AAE1E;AACA;;AAEA,iDAAe,WAAW,EAAC;;;ACjB3B;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA,6CAAe,OAAO,EAAC;;;ACda;;AAEpC;AACA,iBAAiB,QAAO;;AAExB,gDAAe,UAAU,EAAC;;;ACLkB;AACF;;AAE1C;AACA,IAAI,qBAAW;;AAEf;AACA,IAAI,wBAAc,GAAG,qBAAW;;AAEhC;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA,OAAO,YAAW;AAClB,WAAW,WAAU;AACrB;AACA;AACA;AACA,QAAQ,wBAAc;AACtB;AACA;AACA;AACA;AACA;;AAEA,8CAAe,QAAQ,EAAC;;;AC7BiB;AACJ;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,kBAAQ,mBAAmB,oBAAU;AAC/D;;AAEA,0DAAe,WAAW,EAAC;;;AChCqB;AACV;AACK;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AAC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AAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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;;AAE9B;;AAEA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,cAAc,QAAQ,OAAO;;AAE7B;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;;AAEA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA,gDAAgD,QAAQ;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;;AAEN;;AAEA;AACA,mBAAmB,GAAG;AACtB,MAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;;AAER,IAAI;;AAEJ;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,QAAQ;AAC5B;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA,+BAA+B;AAC/B,+BAA+B;AAC/B;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,0BAA0B;AACrC;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;;AAEd;;AAEA,qBAAqB;AACrB,0BAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;;AAEA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,0BAA0B,KAAK,GAAG,KAAK,IAAI,IAAI;AAC/C;AACA;AACA;AACA;;AAEA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,YAAY;AACzD;AACA;;AAEA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA,qCAAqC;AACrC;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,gBAAgB;AACpC;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,YAAY;AAChC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA,sBAAsB,wBAAwB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B,yBAAyB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,oBAAoB,iBAAiB;AACrC,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,oBAAoB,WAAW;AAC/B,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iDAAiD;AAC/D;AACA;AACA,MAAM;AACN;AACA,cAAc,iDAAiD;AAC/D;AACA;AACA,qBAAqB,+DAA+D;AACpF,qBAAqB,2DAA2D;AAChF,qBAAqB,sEAAsE;AAC3F,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,4DAA4D;AAC7E,iBAAiB;AACjB,qBAAqB;AACrB,yBAAyB,8CAA8C;AACvE,yBAAyB,+EAA+E;AACxG;AACA;AACA;AACA;AACA,6BAA6B,8DAA8D;AAC3F,6BAA6B;AAC7B,iCAAiC,8CAA8C;AAC/E,iCAAiC;AACjC;AACA;AACA,qBAAqB;AACrB;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8DAA8D;AAC/E,iBAAiB;AACjB,qBAAqB,qEAAqE;AAC1F;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,kEAAkE;AAC/E,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC,gCAAgC;AAChC,gCAAgC;AAChC,gCAAgC;;AAEhC;AACA;AACA,gCAAgC,oCAAoC;AACpE,gCAAgC,oCAAoC;AACpE,gCAAgC,oCAAoC;AACpE,gCAAgC,oCAAoC;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,wBAAwB,WAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,gBAAgB;AACpC;AACA;AACA;;AAEA,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,0CAA0C;AACnD,SAAS,8DAA8D;;AAEvE;AACA,SAAS,6CAA6C;AACtD,SAAS,6CAA6C;AACtD,SAAS;AACT;;AAEA;AACA,UAAU;AACV;AACA,aAAa,mDAAmD;AAChE,aAAa,oDAAoD;AACjE,aAAa;AACb;;AAEA;AACA;AACA,SAAS,yCAAyC;AAClD,SAAS,8CAA8C;AACvD,SAAS,2CAA2C;AACpD,SAAS,6CAA6C;AACtD,SAAS,8CAA8C;AACvD,SAAS,gDAAgD;AACzD,SAAS;AACT;;AAEA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA,wBAAwB,2BAA2B;AACnD;AACA;;AAEA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;;AAEA;AACA;AACA,0CAA0C,qDAAqD;AAC/F,8CAA8C,yDAAyD;AACvG,wCAAwC,0DAA0D;AAClG,oDAAoD,kEAAkE;AACtH;AACA,4CAA4C,2DAA2D;AACvG;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,gDAAgD,8DAA8D;AAC9G,gDAAgD,0DAA0D;AAC1G,gDAAgD,mEAAmE;AACnH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,8CAA8C;AACjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,gDAAgD;AAC7D,aAAa,iDAAiD;AAC9D,aAAa,yDAAyD;AACtE,aAAa,gDAAgD;AAC7D,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,2BAA2B;AACzD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX,WAAW;AACX;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,eAAe;AAC3B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,oCAAoC;AACpC,oCAAoC;AACpC;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,0BAA0B;AACtC,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,0BAA0B;AACtC,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA,8BAA8B,oBAAoB;AAClD;;AAEA;AACA,6BAA6B,sBAAsB;AACnD;;AAEA;AACA,6BAA6B,sBAAsB;AACnD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,0BAA0B;AACtC,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,4BAA4B,gCAAgC;AAC5D,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA,sBAAsB,yBAAyB;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY;AACZ;AACA;AACA;AACA,+BAA+B,yBAAyB;;AAExD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA,+BAA+B,yBAAyB;;AAExD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB;;AAEjB;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;;AAEA;AACA;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK,oCAAoC;AACzC,KAAK,mCAAmC;AACxC,KAAK,yCAAyC;AAC9C,KAAK,qCAAqC;AAC1C,KAAK,uCAAuC;AAC5C,KAAK,mCAAmC;AACxC,KAAK,yDAAyD;AAC9D,KAAK,wDAAwD;AAC7D,KAAK,iEAAiE;AACtE,KAAK,gEAAgE;AACrE,KAAK,sDAAsD;AAC3D,KAAK,2DAA2D;AAChE;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,KAAK,yCAAyC;AAC9C,KAAK,6FAA6F;AAClG,KAAK,wDAAwD;AAC7D,KAAK,4CAA4C;AACjD,KAAK,kDAAkD;AACvD,KAAK,mDAAmD;AACxD,KAAK,sDAAsD;AAC3D,KAAK,mEAAmE;AACxE,KAAK,sDAAsD;AAC3D,KAAK,2DAA2D;AAChE,KAAK,4DAA4D;AACjE,KAAK,wDAAwD;AAC7D,KAAK,wDAAwD;AAC7D,KAAK,0CAA0C;AAC/C,KAAK,0CAA0C;AAC/C,KAAK,2CAA2C;AAChD,KAAK;AACL;;AAEA;AACA,KAAK,gDAAgD;AACrD,KAAK,wDAAwD;AAC7D,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4BAA4B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,8BAA8B,cAAc;AAC5C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,8BAA8B,cAAc;AAC5C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,0BAA0B,eAAe;AACzC;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D,0DAA0D;AAC1D;AACA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS,uCAAuC;AAChD,SAAS,uCAAuC;AAChD,SAAS,yCAAyC;AAClD,SAAS;AACT;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA,oBAAoB,sBAAsB;AAC1C,sBAAsB,qDAAqD;AAC3E;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,iDAAiD;AACpE;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA,oBAAoB,oBAAoB;AACxC,wBAAwB,uDAAuD;AAC/E;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA,uBAAuB,iDAAiD;AACxE;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,yDAAyD;AACvE;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,sCAAsC;AAC5D,sBAAsB,sCAAsC;AAC5D,sBAAsB,uCAAuC;AAC7D;AACA;AACA,UAAU;AACV;AACA;AACA,sBAAsB,sCAAsC;AAC5D,sBAAsB,sCAAsC;AAC5D,sBAAsB,sCAAsC;AAC5D;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,wCAAwC;AAC9D,sBAAsB,wCAAwC;AAC9D,sBAAsB,wCAAwC;AAC9D,sBAAsB,wCAAwC;AAC9D,sBAAsB,sCAAsC;AAC5D,sBAAsB,sCAAsC;AAC5D,sBAAsB,wCAAwC;AAC9D;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,uCAAuC;AACrD;AACA;;AAEA;AACA;AACA,SAAS;AACT;;AAEA,oBAAoB,mBAAmB;AACvC;AACA;AACA,4BAA4B,iDAAiD;AAC7E;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,+BAA+B;AACxC,SAAS,kCAAkC;AAC3C,SAAS,qCAAqC;AAC9C,SAAS,oCAAoC;AAC7C,SAAS,wCAAwC;AACjD,SAAS,iCAAiC;AAC1C,SAAS,yCAAyC;AAClD,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC;AACzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,YAAY;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS,kDAAkD;AAC3D,SAAS,uDAAuD;AAChE,SAAS,oDAAoD;AAC7D,SAAS,sDAAsD;AAC/D,SAAS,wCAAwC;AACjD,SAAS,gDAAgD;AACzD,SAAS,+DAA+D;AACxE,SAAS,yDAAyD;AAClE,SAAS,sCAAsC;AAC/C,SAAS,sCAAsC;AAC/C,SAAS,sCAAsC;AAC/C,SAAS,sCAAsC;AAC/C,SAAS,2CAA2C;AACpD,SAAS,gDAAgD;AACzD,SAAS,mDAAmD;AAC5D,SAAS,kDAAkD;AAC3D,SAAS;AACT;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,kDAAkD;AAC3D,SAAS,0CAA0C;AACnD,SAAS,2CAA2C;AACpD,SAAS,yCAAyC;AAClD,SAAS,kDAAkD;AAC3D,SAAS,oDAAoD;AAC7D,SAAS,qDAAqD;AAC9D,SAAS,4CAA4C;AACrD,SAAS,gDAAgD;AACzD,SAAS,+CAA+C;AACxD,SAAS,6CAA6C;AACtD,SAAS,2CAA2C;AACpD,SAAS,2CAA2C;AACpD,SAAS,2CAA2C;AACpD,SAAS,2CAA2C;AACpD,SAAS,kDAAkD;AAC3D,SAAS;AACT;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;;AAEA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA,uBAAuB,+DAA+D;AACtF,uBAAuB,oEAAoE;AAC3F;;AAEA;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA,SAAS,yCAAyC;AAClD,SAAS,uCAAuC;AAChD,SAAS;AACT;;AAEA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,mEAAmE;AAC/F,4BAA4B,2DAA2D;AACvF;;AAEA,wBAAwB,yDAAyD;AACjF;AACA;;AAEA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA,6BAA6B,qBAAqB;AAClD;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS,kDAAkD;AAC3D,SAAS;AACT;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,IAAI,WAAW,GAAG;AAClB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS,sDAAsD;AAC/D,SAAS,sDAAsD;AAC/D,SAAS,sDAAsD;AAC/D,SAAS,8CAA8C;AACvD,SAAS,8CAA8C;AACvD,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,aAAa;AACnC,eAAe,aAAa;AAC5B,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,SAAS,yCAAyC;AAClD,SAAS,yDAAyD;AAClE,SAAS;AACT;;AAEA,oBAAoB,wBAAwB;AAC5C,uBAAuB,2DAA2D;AAClF;;AAEA,mBAAmB,oDAAoD;AACvE;AACA;;AAEA,cAAc;;AAEd;;AAEA;AACA,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,6BAA6B;AAClC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,2BAA2B;AAChC,KAAK,6BAA6B;AAClC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,2BAA2B;AAChC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,6BAA6B;AAClC,KAAK,+BAA+B;AACpC;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS,+CAA+C;AACxD,SAAS,+CAA+C;AACxD,SAAS,gDAAgD;AACzD,SAAS,+CAA+C;AACxD,SAAS,yCAAyC;AAClD,SAAS,mDAAmD;AAC5D,SAAS,mDAAmD;AAC5D,SAAS,mDAAmD;AAC5D,SAAS,qDAAqD;AAC9D,SAAS,qDAAqD;AAC9D,SAAS,qDAAqD;AAC9D,SAAS,qDAAqD;AAC9D,SAAS,uDAAuD;AAChE,SAAS,iDAAiD;AAC1D,SAAS,sDAAsD;AAC/D,SAAS,8CAA8C;AACvD,SAAS,4CAA4C;AACrD,SAAS,4CAA4C;AACrD,SAAS,wCAAwC;AACjD,SAAS,4CAA4C;AACrD,SAAS,0CAA0C;AACnD,SAAS,iDAAiD;AAC1D,SAAS,0CAA0C;AACnD,SAAS,4CAA4C;AACrD,SAAS,yCAAyC;AAClD,SAAS,yCAAyC;AAClD,SAAS,iDAAiD;AAC1D,SAAS,iDAAiD;AAC1D,SAAS,iDAAiD;AAC1D,SAAS,iDAAiD;AAC1D,SAAS,oDAAoD;AAC7D,SAAS,8CAA8C;AACvD,SAAS,mDAAmD;AAC5D,SAAS,kDAAkD;AAC3D,SAAS,+CAA+C;AACxD,SAAS,gDAAgD;AACzD,SAAS,8CAA8C;AACvD,SAAS,8CAA8C;AACvD,SAAS,+CAA+C;AACxD,SAAS,kDAAkD;AAC3D,SAAS,kDAAkD;AAC3D,SAAS,0CAA0C;AACnD,SAAS,4CAA4C;AACrD,SAAS,gDAAgD;AACzD,SAAS,8CAA8C;AACvD,SAAS;AACT;AACA;;AAEA,YAAY;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;;AAEA;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,2BAA2B;AACzD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,kDAAkD;AAC3D,SAAS,6CAA6C;AACtD,SAAS,mDAAmD;AAC5D,SAAS,oDAAoD;AAC7D,SAAS,8CAA8C;AACvD,SAAS,8CAA8C;AACvD,SAAS,8CAA8C;AACvD,SAAS,6CAA6C;AACtD,SAAS;AACT;AACA;;AAEA,aAAa;;AAEb;;AAEA,4CAA4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,8CAA8C;AAC3D,aAAa,8EAA8E;AAC3F,aAAa;AACb;AACA,MAAM;AACN;AACA,aAAa,8CAA8C;AAC3D,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,8CAA8C;AACvD,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,SAAS,8CAA8C;AACvD,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,SAAS,8CAA8C;AACvD,SAAS;AACT;AACA;AACA;AACA,kBAAkB,2DAA2D;AAC7E;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA,aAAa,iEAAiE;AAC9E,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,uEAAuE;AACxG,iCAAiC,2EAA2E;AAC5G,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;AACT;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,aAAa,kEAAkE;;AAE/E,wBAAwB,sFAAsF;AAC9G;AACA,4BAA4B,kFAAkF;AAC9G,SAAS;AACT,wBAAwB,8EAA8E;AACtG;AACA,4BAA4B,8EAA8E;AAC1G,SAAS;AACT,wBAAwB,sFAAsF;AAC9G;AACA,4BAA4B,kFAAkF;AAC9G,SAAS;;AAET,wBAAwB,gFAAgF;AACxG;AACA;AACA,yBAAyB,uEAAuE;AAChG,yBAAyB,2EAA2E;AACpG,SAAS;;AAET;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS,+CAA+C;AACxD,SAAS,0EAA0E;AACnF,SAAS,6EAA6E;AACtF,SAAS;AACT;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,oBAAoB;AACpB;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS,yCAAyC;AAClD,SAAS,uCAAuC;AAChD,SAAS,uDAAuD;AAChE,SAAS;AACT;;AAEA;AACA;AACA;;AAEA,4BAA4B,4CAA4C;AACxE,4BAA4B,oEAAoE;AAChG,4BAA4B,8DAA8D;AAC1F;;AAEA,wBAAwB,yDAAyD;;AAEjF;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B,iDAAiD;AACjD,yCAAyC;;AAEzC;AACA;AACA;AACA;AACA,UAAU,iDAAiD;AAC3D,UAAU,6EAA6E;AACvF,UAAU,8EAA8E;AACxF,UAAU,sEAAsE;AAChF,UAAU,sEAAsE,qDAAqD;AACrI,cAAc,4DAA4D;AAC1E,cAAc,4EAA4E;AAC1F,cAAc,iEAAiE,IAAI;AACnF,+CAA+C;AAC/C,cAAc,iEAAiE;AAC/E,cAAc,uEAAuE,IAAI;AACzF;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B;AAC7B,iDAAiD;AACjD,uCAAuC;AACvC,mDAAmD;;AAEnD;AACA;AACA;AACA;AACA;AACA,MAAM,iDAAiD;AACvD,MAAM,4FAA4F;AAClG,MAAM,uEAAuE;AAC7E,MAAM,qEAAqE;AAC3E,MAAM,4FAA4F,yDAAyD,UAAU,iEAAiE,IAAI;AAC1O,2CAA2C,UAAU,wDAAwD,IAAI;AACjH;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,8DAA8D;AACvE,SAAS,8EAA8E;AACvF,SAAS,wEAAwE;AACjF,SAAS;AACT;AACA;;AAEA;AACA;AACA,SAAS,4CAA4C;AACrD,SAAS,4CAA4C;AACrD,SAAS,8CAA8C;AACvD,SAAS,gDAAgD;AACzD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B,wCAAwC;AAClE;;AAEA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA,2BAA2B,4EAA4E;AACvG,0BAA0B,uDAAuD;AACjF;AACA;AACA;AACA;AACA,8BAA8B,wCAAwC;AACtE;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,wBAAwB;AAC5C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,uCAAuC;AACvF;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,gBAAgB,QAAQ;AACxB,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,gBAAgB,QAAQ;AACxB,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA,gBAAgB,SAAS;AACzB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,wBAAwB,2BAA2B;AACnD;AACA,mCAAmC;AACnC,mCAAmC;AACnC;AACA,uBAAuB;AACvB,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,yCAAyC,yDAAyD;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B;AAC5B,oBAAoB,OAAO;AAC3B,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAA0D;AAC5F;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA,yCAAyC,+BAA+B;AACxE;AACA,cAAc;AACd;AACA,4BAA4B,mBAAmB;AAC/C,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;;AAEA,wBAAwB,mBAAmB;AAC3C;AACA;AACA,qCAAqC,8BAA8B;AACnE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C,kCAAkC,sCAAsC;AACxE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD;AACrD,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA,gCAAgC,mBAAmB;AACnD;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,iBAAiB,kBAAkB;AACtD,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA,mEAAmE;AACnE;AACA,mBAAmB,sBAAsB;AACzC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,iBAAiB,oBAAoB;AACxD,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA,mBAAmB,sBAAsB;AACzC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,iBAAiB;AACpC,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA,mEAAmE;AACnE;AACA,mBAAmB,sBAAsB;AACzC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,aAAa;AAChC,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ,gDAAgD,mCAAmC;AACtG,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;;AAEA;AACA;AACA,0BAA0B,+BAA+B;AACzD;AACA;;AAEA;AACA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,2BAA2B;AAC7D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,2BAA2B;AAC7D;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,2BAA2B;AAC7D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+BAA+B;AAC7D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA+B,gCAAgC;AAC/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,8BAA8B;AAC9B;;AAEA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;;AAEA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8BAA8B;AAC9B,mCAAmC;AACnC,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,gDAAgD;;AAEhD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAA0C;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAA0C;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;;AAEhC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAgB;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ,oBAAoB,UAAU;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ,YAAY;;AAEZ,sBAAsB,YAAY;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB;;AAEjB;AACA;;AAEA,uBAAuB,iBAAiB;AACxC,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd,MAAM;;AAEN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,OAAO;AAC3B;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA,iBAAiB;;AAEjB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB,oBAAoB,UAAU;AAC9B,oBAAoB;;AAEpB;AACA,6BAA6B;;AAE7B;;AAEA;AACA,yBAAyB;;AAEzB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA,wBAAwB;AACxB;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yBAAyB;;AAEzB;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gDAAgD;;AAEhD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yBAAyB;;AAEzB,oBAAoB,OAAO,OAAO;;AAElC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB,oBAAoB,OAAO;AAC3B;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB;;AAElB;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yBAAyB;;AAEzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA,wBAAwB;AACxB,6BAA6B;;AAE7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA,wBAAwB;;AAExB;;AAEA,6BAA6B;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB;AACnB,WAAW;AACX;;AAEA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB;AACnB,WAAW;AACX;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA,sBAAsB;;AAEtB;AACA;;AAEA;AACA,sBAAsB;;AAEtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA,6CAA6C;AAC7C,wCAAwC;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB,oBAAoB,OAAO,OAAO;;AAElC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB,oBAAoB,OAAO;AAC3B;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX,cAAc;AACd;;AAEA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;;AAEA,sDAAsD;AACtD;;AAEA,2BAA2B;;AAE3B,cAAc;;AAEd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;;;AAIA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;;AAIA;AACA;AACA;;AAEA;;AAEA;;;;AAIA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;;;AAIA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,KAAK;AAChB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;AAC1C;AACA,QAAQ;AACR,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,4BAA4B;AAC1F;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;AACA;AACA,sDAAsD,gCAAgC;AACtF;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,MAAM;AACN,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,MAAM;AACN,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,MAAM;AACN,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,MAAM;AACN,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA,MAAM;AACN,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,oBAAoB;AAClE;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,KAAK;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD,oBAAoB;AACvE,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,KAAK;AACnB;;AAEA;AACA;AACA,WAAW,oBAAoB;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,eAAe;AAC1B;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,eAAe;AAC1B;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mCAAmC;AAC3D;AACA;AACA;AACA,4BAA4B,kCAAkC;AAC9D;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA,+CAA+C;AAC/C,wDAAwD;AACxD;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,KAAK;AAChB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA,wBAAwB;AACxB,sBAAsB;AACtB;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA,mDAAmD;AACnD;AACA,4BAA4B;AAC5B;AACA,sDAAsD,8BAA8B;AACpF;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,KAAK;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,eAAe;AAC1B;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA,yBAAyB;AACzB;AACA;AACA,sBAAsB;AACtB;AACA,8DAA8D,mCAAmC;AACjG;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,UAAU;AACV;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA,sCAAsC;AACtC,wBAAwB;AACxB;AACA;AACA;;AAEA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA,2DAA2D;AAC3D,oBAAoB,wCAAwC;AAC5D;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,sCAAsC;AACtC;AACA;AACA,sCAAsC;AACtC;AACA;AACA,gDAAgD;AAChD;AACA;AACA,yBAAyB;AACzB,kDAAkD;AAClD,kDAAkD;AAClD;AACA;AACA,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC;AACA,wCAAwC;AACxC;AACA;AACA,SAAS;AACT,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA,gDAAgD,iCAAiC;AACjF;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,QAAQ;AACnB;AACA;AACA,gDAAgD,iCAAiC;AACjF;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA,yBAAyB,8BAA8B,yBAAyB;AAChF;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,uBAAuB;AACvB,oBAAoB,qBAAqB;AACzC;AACA,kCAAkC,uBAAuB,KAAK;AAC9D;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,qDAAqD;AACrD;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,qDAAqD;AACrD;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA,oBAAoB,kCAAkC;AACtD;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS,oBAAI;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,8BAA8B;AACvD,4BAA4B,6BAA6B;AACzD,uBAAuB,qEAAqE;AAC5F;AACA,6BAA6B,0FAA0F;AACvH,uBAAuB,4BAA4B;AACnD,0BAA0B,+BAA+B;AACzD,2BAA2B,gCAAgC;AAC3D,8BAA8B,mCAAmC;AACjE,sBAAsB,2BAA2B;AACjD,yBAAyB,8BAA8B;AACvD,sBAAsB,qCAAqC;AAC3D,0BAA0B,+BAA+B;AACzD,wBAAwB,6BAA6B;AACrD,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA,2DAA2D,sBAAsB;AACjF;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,YAAY,oBAAoB;AAChC,YAAY;AACZ;AACA,oBAAI;AACJ;;;AAGA;;AAEA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;;AAEA;AACA,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,gBAAgB;AAC5B,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB;AACA;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,wDAAwD;AAClE,UAAU;AACV;AACA;;AAEA;AACA;AACA,mEAAmE,QAAQ;AAC3E,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC,YAAY,UAAU;AACtB;AACA,oBAAI;AACJ;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC;AACA;AACA,oBAAI;AACJ,yEAAyE;AACzE;;AAEA;AACA;AACA,YAAY,0BAA0B;AACtC,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC;AACA,oBAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,WAAW,0BAA0B;AACrC,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,qBAAqB;AAChC;AACA,oBAAI;AACJ;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,0BAA0B;AACrC,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,qBAAqB;AAChC;AACA,oBAAI;AACJ;AACA;AACA,KAAK;AACL;;AAEA;AACA,YAAY;AACZ,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAyC,sBAAsB;;AAE/D;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,+CAA+C;AACxD,SAAS,iEAAiE;AAC1E,SAAS,yEAAyE;AAClF,SAAS,iEAAiE;AAC1E,SAAS,6CAA6C;AACtD,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,mDAAmD;AAC5D,SAAS;AACT;;AAEA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;;AAEjD;AACA,oBAAoB,iBAAiB;AACrC;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS,+CAA+C;AACxD,SAAS,+CAA+C;AACxD,SAAS,iDAAiD;AAC1D,SAAS,2DAA2D;AACpE,SAAS,4CAA4C;AACrD,SAAS,oEAAoE;AAC7E,SAAS;AACT;AACA;;AAEA,oBAAoB,sBAAsB;AAC1C;AACA;;AAEA,oBAAoB,2BAA2B;AAC/C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,eAAe;AACnC;AACA;;AAEA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;;AAEA,YAAY;AACZ;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,MAAM;AACN,iBAAiB;AACjB,MAAM;AACN;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;;AAEA,+CAA+C;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA,iDAAiD,SAAS;AAC1D,iDAAiD,SAAS;AAC1D,iDAAiD,SAAS;AAC1D,iDAAiD,SAAS;AAC1D,iDAAiD,SAAS;AAC1D,iDAAiD,SAAS;AAC1D,iDAAiD,SAAS;;AAE1D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,+CAA+C;AACxD,SAAS,0EAA0E;AACnF,SAAS,6EAA6E;AACtF,SAAS;AACT;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA,2BAA2B,iFAAiF;AAC5G;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY;AACZ,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA,gBAAgB;AAChB,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA,2BAA2B;AAC3B,6DAA6D;AAC7D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB;;AAEA;AACA,YAAY;AACZ,YAAY;AACZ,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB,MAAM;AACN,gBAAgB;AAChB;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY;AACZ,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA,oDAAoD;;AAEpD;AACA;;AAEA;AACA;AACA,mBAAmB,oBAAI,EAAE,YAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AACA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,OAAO,oBAAI;AACX;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED,oDAAe,QAAQ,EAAC;AAC+D;;;ACtqcxE;AACmC;;AAElD;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAM;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAqB,uBAAU;AAC/B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,oBAAoB,qBAAqB;;AAEzC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAO;;A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AAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,sBAAsB,QAAkB,OAAe;AAC7D,SAAK,WAAW,QAAQ,4DAA0C,KAAK;AAAA,EACxE;AAAA,EACA,OAAO,sBAAsB,QAAkB;AAC9C,WAAO,KAAK,WAAW,QAAQ,4DAA0C,CAAC;AAAA,EAC3E;AACD;;;;;;;;;;;;;;;;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,cAAc,gBAAgB;AAC7G,+EAA+E,cAAc,gBAAgB;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,KAAK;AAChB,WAAW,eAAe;AAC1B;;AAce;AACqB;;AAEpC;AACA;;AAEA;;AAEA,gBAAgB,sBAAS;;AAEzB,iBAAiB,kBAAK;AACtB;;AAEA,kBAAkB,mBAAM;AACxB;AACA;AACA;;AAEA;AACA,oBAAoB,YAAY;AAChC;;AAEA;;AAEA,mBAAmB,0BAAa;AAChC,gBAAgB,iBAAI;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0BAAa;AAC3B,cAAc,0BAAa;AAC3B;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,2BAA2B;AAC7C;;AAEA,8BAA8B,sCAAG;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,kCAAkC;AACtD;;AAEA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B;;AAE9B,2EAA2E;AAC3E;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,8CAA8C,QAAQ;AACtD;;AAEA;AACA;AACA;AACA,uDAAuD,QAAQ;AAC/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAqB,2BAAc;AACnC;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,mBAAmB,gCAAmB;AACtC,mBAAmB,gCAAmB;;AAEtC,2BAA2B,0BAAa;AACxC,2BAA2B,0BAAa;;AAExC,yBAAyB,8BAAiB;AAC1C;AACA;AACA;AACA;AACA,WAAW,uBAAU;AACrB;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,aAAa,wBAAW,qBAAqB,uBAAU,EAAE,sBAAS;AAClE;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,uBAAuB,mDAAmD,eAAe;AACzF;;AAEA;AACA;AACA,sCAAsC;AACtC;AACA,iBAAiB;AACjB;AACA,+CAA+C;AAC/C;AACA,qDAAqD;AACrD;AACA,KAAK;AACL;AACA;AACA;;AAEgC;;;;;;;;;;;;;;;;AChY+E;AACtF;AAKlB;AAGqB;AAEA;AAES;AACO;AAC8B;AACtC;AAE7B,IAAK,oBAAL,kBAAKC,uBAAL;AACN,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,WAAQ;AACR,EAAAA,mBAAA,gBAAa;AAHF,SAAAA;AAAA;AAKL,MAAM,sBAA2C;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AACD;AACA,MAAM,oBAAoB;AAAA,EACzB,CAAC,iBAAsB,GAAG,2CAAmB,CAAC,IAAI,0BAAa,GAAG,sBAAS;AAAT,EAClE,CAAC,mBAAuB,GAAG,sBAAS;AAAT,EAC3B,CAAC,4BAA4B,GAAG,0BAAa;AAC9C;AAEA,SAAS,SAAS,QAAkB;AACnC,QAAMC,YAAW,6EAAkC,CAAC,MAAM;AAC1D,QAAM,eAAe,oBAAoBA,SAAQ;AACjD,SAAO,kBAAkB,YAAY;AACtC;AACA,MAAM,QAAQ,IAAI,oBAAO,CAAC;AAC1B,MAAM,QAAQ,IAAI,oBAAO,CAAC;AAC1B,MAAM,QAAQ,IAAI,oBAAO,CAAC;AAEnB,MAAM,kCAAkC;AAAA,EAS9C,YAAoB,gBAAyC;AAAzC;AAPpB,SAAQ,mBAAoE,oBAAI,IAAI;AACpF,SAAQ,gBAAkD,CAAC;AAC3D,SAAQ,yBAAuD,oBAAI,IAAI;AAEvE,SAAQ,gBAAyB,IAAI,oBAAO,CAAC;AAAA,EAGiB;AAAA,EAE9D,UAAU;AACT,QAAI,KAAK,aAAa;AACrB,WAAK,YAAY,QAAQ;AACzB,WAAK,cAAc;AAAA,IACpB;AAEA,SAAK,iBAAiB,MAAM;AAC5B,SAAK,cAAc,OAAO,GAAG,KAAK,cAAc,MAAM;AACtD,SAAK,uBAAuB,MAAM;AAElC,QAAI,KAAK,wCAAwC;AAChD,WAAK,uCAAuC,QAAQ;AACpD,WAAK,yCAAyC;AAAA,IAC/C;AAAA,EACD;AAAA,EAEA,wCAAwC,YAA0C;AACjF,SAAK,yCAAyC;AAAA,EAC/C;AAAA,EAEA,eAAe;AACd,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,OAAO;AACN,SAAK,YAAY;AACjB,WAAO,KAAK,iBAAiB;AAAA,EAC9B;AAAA,EAEQ,cAAc;AACrB,SAAK,gBAAgB;AAAA,EACtB;AAAA,EACQ,kBAAkB,QAAkB;AAC3C,8DAA6B,CAAC,QAAQ,KAAK,aAAa;AAAA,EACzD;AAAA,EAEA,mBAAmB;AA1FpB;AA2FE,UAAM,SAAS,KAAK,eAAe,OAAO;AAC1C,UAAM,WAAW,KAAK,eAAe,SAAS;AAC9C,QAAI,EAAE,UAAU,WAAW;AAC1B;AAAA,IACD;AACA,UAAM,WAAY,OAAgB;AAClC,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AAEA,+DAA0B,CAAC,UAAU,KAAK,aAAa;AACvD,SAAK,kBAAkB,MAAM;AAE7B,SAAK,eAAe,iBAAiB,MAAM;AAE3C,QAAI,KAAK,aAAa;AACrB,WAAK,YAAY,QAAQ;AAAA,IAC1B;AACA,SAAK,cAAc,IAAI,sBAAsB,CAAC,KAAK,cAAc,GAAG,KAAK,cAAc,GAAG,QAAQ;AAElG,SAAK,YAAY,YAAY,SAAS,MAAM,CAAC;AAE7C,SAAK,sBAAsB;AAE3B,SAAK,iBAAiB,QAAQ,CAAC,UAAU,gBAAgB;AACxD,eAAS,cAAc,CAAC,EAAE,QAAQ;AAClC,eAAS,cAAc,CAAC,EAAE,QAAQ;AAClC,WAAK,iBAAiB,OAAO,WAAW;AAAA,IACzC,CAAC;AAED,SAAK,gBAAgB,CAAC;AACtB,SAAK,eAAe,cAAc,EAAE,QAAQ,CAAC,QAAQ,gBAAgB;AACpE,UAAI,KAAK,aAAa;AACrB,cAAM,cAAc,KAAK,YAAY;AAAA,UACpC,KAAK,0BAA0B,WAAW;AAAA,UAC1C;AAAA,UACA,KAAK,uBAAuB,IAAI,WAAW;AAAA,QAC5C;AACA,aAAK,iBAAiB,IAAI,aAAa,WAAW;AAClD,aAAK,cAAc,KAAK,WAAW;AAAA,MACpC;AAAA,IACD,CAAC;AAED,eAAK,qBAAL,mBAAuB,QAAQ,CAAC,UAAU,gBAAgB;AACzD,UAAI,KAAK,aAAa;AACrB,aAAK,YAAY;AAAA,UAChB;AAAA,UACA,KAAK;AAAA;AAAA,QACN;AAAA,MACD;AAAA,IACD;AAEA,SAAK,4BAA4B;AACjC,SAAK,cAAc,MAAM;AACzB,SAAK,kCAAkC;AAEvC,UAAM,YAAY,KAAK,YAAY,KAAK;AAExC,QAAI,CAAC,WAAW;AAEf,WAAK,eAAe,SAAS,0CAA0C;AAAA,IACxE;AACA,WAAO;AAAA,EACR;AAAA,EAEO,kBAAkB,OAAe,WAAoC;AAC3E,QAAI,CAAC,KAAK,aAAqD;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY,QAAQ,SAAS;AAClC,SAAK,eAAe,iBAAiB,6BAA6B;AAClE,SAAK,kCAAkC,KAAK;AAAA,EAC7C;AAAA,EAEA,uBAAuB,aAAyB;AAtKjD;AAuKE,UAAM,WAAW,KAAK,iBAAiB,IAAI,WAAW;AACtD,QAAI,UAAU;AACb,cAAO,UAAK,gBAAL,mBAAkB,uBAAuB;AAAA,IACjD;AAAA,EACD;AAAA,EACQ,0BAA0B,YAAwB;AACzD,WAAO,WAAW;AAAA,EACnB;AAAA,EACA,YAAY;AACX,UAAM,YAA8B,CAAC;AACrC,SAAK,iBAAiB,QAAQ,CAAC,UAAU,gBAAgB;AACxD,gBAAU,KAAK,SAAS,QAAQ;AAAA,IACjC,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEQ,oCAAoC;AAC3C,UAAM,OAAO,KAAK,eAAe,KAAK;AACtC,UAAM,sBAAsB,KAAK,oBAAoB;AACrD,UAAM,YAAY,2DAAqB;AACvC,QAAI,CAAC,aAAa,CAAC,KAAK,wCAAwC;AAC/D;AAAA,IACD;AACA,UAAM,gBAAkC,CAAC;AACzC,SAAK,iBAAiB,QAAQ,CAAC,UAAU,gBAAgB;AAExD,oBAAc,KAAK,SAAS,QAAQ;AAAA,IACrC,CAAC;AACD,UAAM,sBAAsB,KAAK,qBAAqB;AACtD,eAAW,YAAY,eAAe;AACrC,eAAS,SAAS,sCAAe,IAAI,KAAK,eAAe,MAAM,eAAe,YAAY;AAC1F,eAAS,SAAS,kDAAqB,IAAI,KAAK,eAAe,MAAM,eAAe,iBAAiB;AAErG,UAAI,qBAAqB;AACxB,aAAK,wBAAwB,UAAU,mBAAmB;AAAA,MAC3D;AAAA,IACD;AAEA,QAAI,WAAW;AACd,iBAAW,YAAY,eAAe;AACrC,mBAAW,gBAAgB,UAAU,cAAc,GAAG;AACrD,mBAAS,SAAS,aAAa,YAAY,CAAC,IAAI,aAAa,QAAQ;AAAA,QACtE;AAAA,MACD;AAAA,IACD,OAAO;AACN,YAAM,iBAAiB,KAAK,iBAAiB,YAAY;AACzD,UAAI,gBAAgB;AACnB,cAAM,qBAAqB,KAAK,iBAAiB,SAAS;AAC1D,YAAI,oBAAoB;AACvB,gBAAM,sBAAsB,eAAe;AAC3C,qBAAW,QAAQ,qBAAqB;AACvC,kBAAM,aAAa,KAAK,CAAC;AACzB,kBAAM,eAAe,KAAK,CAAC;AAC3B,kBAAM,QAAQ,KAAK,OAAO,IAAI,UAAU;AACxC,kBAAM,UAAU,mBAAmB,YAAY;AAC/C,uBAAW,YAAY,eAAe;AACrC,uBAAS,SAAS,YAAY,IAAI;AAClC,kBAAI,qBAAqB;AACxB,qBAAK,wBAAwB,UAAU,mBAAmB;AAAA,cAC3D;AAAA,YACD;AACA,gBAAI,SAAS,SAAS;AACrB,oBAAM,WAAW,MAAM;AACtB,2BAAW,YAAY,eAAe;AACrC,sEAAsB,CAAC,OAAO,SAAS,SAAS,YAAY,CAAC;AAAA,gBAC9D;AAAA,cACD;AACA,oBAAM,QAAQ,UAAU,YAAY,QAAQ;AAI5C,uBAAS;AAAA,YACV;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACQ,wBAAwB,UAA0B,qBAA0C;AACnG,eAAW,cAAc,qBAAqB;AAC7C,YAAM,aAAa,WAAW,WAAW;AACzC,YAAM,UAAU,KAAK,uBAAuB,IAAI,UAAU;AAC1D,UAAI,SAAS;AACZ,cAAM,cAAc,KAAK,0BAA0B,UAAU;AAC7D,iBAAS,SAAS,WAAW,IAAI,EAAC,OAAO,QAAO;AAAA,MACjD;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,kCAAkC,OAAe;AACxD,eAAW,YAAY,KAAK,eAAe;AAC1C,eAAS,SAAS,SAAS,sCAAe,EAAE,SAAS;AACrD,eAAS,SAAS,SAAS,kDAAqB,EAAE,QAAQ;AAAA,IAC3D;AAAA,EACD;AAAA,EAEA,wBAAgE;AAC/D,WAAO,KAAK;AAAA,EACb;AAAA,EAEQ,cAAc,QAAkB;AACvC,UAAM,WAAY,OAAgB;AAClC,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AACA,UAAM,iBAAiB,mDAAqB,CAAC,MAAM;AACnD,UAAM,cAAc,gEAA+B,CAAC,QAAQ;AAC5D,UAAM,iCAAiC,KAAK,8BAA8B;AAC1E,QAAI,CAAC,gCAAgC;AACpC;AAAA,IACD;AACA,SAAK,uBAAuB,QAAQ,CAAC,SAAS,gBAAgB;AAC7D,YAAM,qBAAqB,+BAA+B,wBAAwB,WAAW;AAC7F,UAAI,CAAC,oBAAoB;AACxB,gBAAQ,KAAK,kCAAkC,aAAa;AAC5D;AAAA,MACD;AACA,YAAM,oBAAoB,mBAAmB,UAAU;AACvD,UAAI,CAAC,mBAAmB;AACvB,gBAAQ,KAAK,6BAA6B;AAC1C;AAAA,MACD;AAEA,YAAM,QAAQ,QAAQ,MAAM;AAE5B,iBAAW,oBAAoB,mBAAmB;AACjD,cAAM,mBAAmB,iBAAiB,SAAS;AACnD,YAAI,gBAAgB,iBAAiB,KAAK;AAI1C,cAAM,aAAa,eAAe,aAAa,QAAQ,aAAa;AACpE,YAAI,YAAY;AACf,gBAAM,cAAc,eAAe,WAAW,QAAQ,aAAa;AACnE,cAAI,QAAQ;AACZ,mBAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACrC,oBAAQ,aAAa;AAAA,cACpB,KAAK,GAAG;AACP,sBAAM,MAAc,eAAe,YAAY,QAAQ,GAAG,aAAa;AACvE,sBAAM,KAAK,IAAI;AACf;AAAA,cACD;AAAA,cACA,KAAK,GAAG;AACP,+BAAe,YAAY,QAAQ,GAAG,eAAe,KAAK;AAC1D,sBAAM,QAAQ,OAAO,KAAK;AAC1B;AAAA,cACD;AAAA,cACA,KAAK,GAAG;AACP,+BAAe,YAAY,QAAQ,GAAG,eAAe,KAAK;AAC1D,sBAAM,QAAQ,OAAO,KAAK;AAC1B;AAAA,cACD;AAAA,cACA,KAAK,GAAG;AACP,+BAAe,YAAY,QAAQ,GAAG,eAAe,KAAK;AAC1D,sBAAM,QAAQ,OAAO,KAAK;AAC1B;AAAA,cACD;AAAA,YACD;AAKA,qBAAS;AAAA,UACV;AAAA,QACD;AAAA,MAED;AACA,cAAQ,cAAc;AAAA,IACvB,CAAC;AAAA,EACF;AAAA,EACA,QAAQ;AACP,SAAK,gBAAgB;AAAA,EACtB;AAAA,EACQ,kBAAkB;AApV3B;AAqVE,eAAK,gBAAL,mBAAkB;AAClB,SAAK,cAAc;AAAA,EACpB;AAAA,EAEQ,8BAA8B;AACrC,SAAK,uBAAuB,QAAQ,CAAC,SAAS,gBAAgB;AAC7D,cAAQ,QAAQ;AAAA,IACjB,CAAC;AAED,SAAK,uBAAuB,MAAM;AAClC,SAAK,iBAAiB,QAAQ,CAAC,kBAAkB,gBAAgB;AAChE,UAAI,KAAK,aAAa;AACrB,aAAK,uBAAuB,IAAI,aAAa,KAAK,YAAY,cAAc,CAAC;AAAA,MAC9E;AAAA,IACD,CAAC;AAED,UAAM,sBAAsB,KAAK,qBAAqB;AACtD,QAAI,uBAAuB,KAAK,aAAa;AAC5C,iBAAW,sBAAsB,qBAAqB;AACrD,aAAK,uBAAuB,IAAI,mBAAmB,WAAW,GAAG,KAAK,YAAY,cAAc,CAAC;AAAA,MAClG;AAAA,IACD;AAAA,EACD;AAAA,EACQ,gCAAgC;AA5WzC;AA6WE,UAAM,OAAO,KAAK,eAAe,KAAK;AACtC,aACC,UAAK,oBAAoB,MAAzB,mBAA4B,UAAU,mCACtC,KAAK;AAAA,EAEP;AAAA,EACQ,uBAAuB;AAnXhC;AAoXE,YAAO,UAAK,8BAA8B,MAAnC,mBAAsC;AAAA,EAC9C;AACD;;;;;;;;;;;;;;;;ACtXiF;AAC7C;AACU;AACf;AAExB,SAAS,8BAA8B,QAAkB,cAAuB;AACtF,QAAM,WAAY,OAAgB;AAClC,MAAI,CAAC,UAAU;AACd;AAAA,EACD;AACA,QAAM,cAAc,mHAA+B,CAAC,QAAQ;AAC5D,MAAI,MAAM,IAAI,aAAa,cAAc,CAAC;AAE1C,MAAI,IAAI;AACR,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,aAAa,GAAG,KAAK;AACxC,aAAS,IAAI,GAAG,IAAI,aAAa,GAAG,KAAK;AACxC,UAAI,GAAG,IAAI,KAAK,aAAa,IAAI;AACjC,UAAI,GAAG,IAAI,KAAK,aAAa,IAAI;AAEjC,eAAS;AACT,UAAI,SAAS,IAAI,QAAQ;AACxB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,QAAM,iBAAiB,iJAA6C;AACpE,QAAM,wBAAwB,mFAAgB,CAAC,QAAQ,IAAI,2DAAwB,GAAG,kDAAe;AAKrG,WAAS,aAAa,gBAAgB,IAAI,sBAAsB,KAAK,CAAC,CAAC;AAGxE;;;;;;;;;;;;;AChCiC;AACb;AA4CpB,MAAM,MAAM,KAAK,MAAM,OAAO,mBAAmB,GAAG;AAC7C,SAAS,mBAAmB,MAAmB;AACrD,MAAI,KAAK,QAAQ,KAAK;AACrB,SAAK,QAAQ;AAAA,EACd,OAAO;AACN,SAAK,SAAS;AAAA,EACf;AACD;AACO,SAAS,gBAAgB,OAAe;AAG/C;AAEuB;;;;;;;;;;;;;;;;AC7De;AAEtC,MAAM,gBAA0C,oBAAI,IAAI;AACjD,SAAS,mBAAmB,UAAkB;AACpD,SAAO,WAAW,QAAQ,KAAK,cAAc,QAAQ;AACtD;AACO,SAAS,WAAW,UAAkB;AAC5C,SAAO,cAAc,IAAI,QAAQ;AAClC;AACO,SAAS,cAAc,UAAkB;AAC/C,MAAI,iBAAiB,cAAc,IAAI,QAAQ;AAC/C,MAAI,CAAC,gBAAgB;AACpB,qBAAiB,8EAAG,CAAC,CAAC;AACtB,kBAAc,IAAI,UAAU,cAAc;AAAA,EAC3C;AACA,SAAO;AACR;AAEO,SAAS,aAAa,UAAkB;AAC9C,QAAM,OAAO,WAAW,QAAQ;AAChC,MAAI,CAAC,MAAM;AACV;AAAA,EACD;AACA,+FAAkB,CAAC,IAAI;AACxB;;;;;;;;;;;;;;ACTO,MAAM,8BAGT,oBAAI,QAAQ;AAET,SAAS,wBACf,UACA,YAEiD;AAzBlD;AA0BC,UAAO,iCAA4B,IAAI,QAAQ,MAAxC,mBAA2C,IAAI;AACvD;AAiCO,SAAS,0BAA0B,OAAoB;AAI9D;;;;;;;;;;;;;;;;;;;AChEyF;AAC1C;AAKxC;AACkB;AACI;AAEX;AAGlB,SAAS,aAA+C,MAAiD;AACxG,UAAQ,MAAM;AAAA,IACb,KAAK,kHAA6B,EAAE;AACnC,aAAO;AAAA,IACR;AAAA,IACA,KAAK,8GAA2B,EAAE;AACjC,aAAO,IAAI,wCAAK,CAAC;AAAA,IAClB;AAAA,IACA,KAAK,8GAA2B,EAAE;AACjC,aAAO;AAAA,IACR;AAAA,IACA,KAAK,0GAAyB,EAAE;AAC/B,aAAO;AAAA,IACR;AAAA,IACA,KAAK,gHAA4B,EAAE;AAClC,aAAO;AAAA,IACR;AAAA,IACA,KAAK,kHAA6B,EAAE;AACnC,aAAO,IAAI,0CAAO,CAAC;AAAA,IACpB;AAAA,IACA,KAAK,kHAA6B,EAAE;AACnC,aAAO,IAAI,0CAAO,CAAC;AAAA,IACpB;AAAA,IACA,KAAK,kHAA6B,EAAE;AACnC,aAAO,IAAI,0CAAO,CAAC;AAAA,IACpB;AAAA,EACD;AACA,8FAAsB,CAAC,IAAI;AAC5B;AACA,SAAS,kBACR,OACA,MACyC;AACzC,UAAQ,MAAM;AAAA,IACb,KAAK,kHAA6B,EAAE;AACnC,aAAO;AAAA,IACR;AAAA,IACA,KAAK,8GAA2B,EAAE;AACjC,aAAQ,MAAgB,MAAM;AAAA,IAC/B;AAAA,IACA,KAAK,8GAA2B,EAAE;AACjC,aAAO;AAAA,IACR;AAAA,IACA,KAAK,0GAAyB,EAAE;AAC/B,aAAO;AAAA,IACR;AAAA,IACA,KAAK,gHAA4B,EAAE;AAClC,aAAO;AAAA,IACR;AAAA,IACA,KAAK,kHAA6B,EAAE;AACnC,aAAQ,MAAkB,MAAM;AAAA,IACjC;AAAA,IACA,KAAK,kHAA6B,EAAE;AACnC,aAAQ,MAAkB,MAAM;AAAA,IACjC;AAAA,IACA,KAAK,kHAA6B,EAAE;AACnC,aAAQ,MAAkB,MAAM;AAAA,IACjC;AAAA,EACD;AACA,8FAAsB,CAAC,IAAI;AAC5B;AAEO,SAAS,8BACf,UACA,YACA,MACA,oBACgB;AAChB,MAAI,eAAe,qGAA+B,CAAC,QAAQ;AAC3D,MAAI,CAAC,cAAc;AAClB,mBAAe,oBAAI,IAAI;AACvB,yGAA+B,CAAC,UAAU,YAAY;AAAA,EACvD;AACA,MAAI,mBAAkC,aAAa,IAAI,UAAU;AACjE,MAAI,CAAC,kBAAkB;AACtB,QAAI,gBAAgB,sBAAsB,OAAO,qBAAqB,aAAa,IAAI;AACvF,QAAI,iBAAiB,kBAAkB,eAAe,IAAI;AAC1D,UAAM,eAAe,qHAA0B;AAAX,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,UAAM,gBAAgB,qHAA0B,CAAC,UAAU,YAAY,GAAG,cAAgC;AAG1G,QAAI,gBAAgB,QAAQ,iBAAiB,MAAM;AAClD,yBAAmB;AAAA,QAClB,SAAS,8DAAG,CAAC,aAAa;AAAA,QAC1B,UAAU,8DAAG,CAAyC,cAAc;AAAA,MAGrE;AAAA,IACD,OAAO;AACN,yBAAmB;AAAA,QAClB,SAAS,8DAAG,CAAC,YAAY;AAAA,QACzB,UAAU,8DAAG,CAAC,aAAa;AAAA,MAC5B;AAAA,IACD;AACA,iBAAa,IAAI,YAAY,gBAAgB;AAAA,EAC9C;AACA,SAAO;AACR;AACO,SAAS,0BAA0B,OAAoB;AAI9D;;;;;;;;;;;;;;ACvHkB;AAGlB,MAAM,yBAA8E,oBAAI,QAAQ;AACzF,SAAS,0BAA0B,QAAuC;AAChF,MAAI,OAAO,uBAAuB,IAAI,MAAM;AAC5C,MAAI,CAAC,MAAM;AACV,WAAO,8EAAG,CAAC,OAAO,SAAS,MAAM;AACjC,2BAAuB,IAAI,QAAQ,IAAI;AAAA,EACxC;AACA,SAAO;AACR;AAEO,SAAS,6BAA6B,QAAuC;AACnF,4BAA0B,MAAM,EAAE,QAAQ,OAAO,SAAS;AAC3D;;;;;;;;;;;;;;;;;ACfsC;AAItC,MAAM,2BAAkE,oBAAI,IAAI;AACzE,SAAS,oBAAoB,MAAoB,WAAmB;AAC1E,SAAO,YAAY,MAAM,SAAS,KAAK,eAAe,MAAM,SAAS;AACtE;AACO,SAAS,YAAY,MAAoB,WAAmB;AATnE;AAUC,UAAO,8BAAyB,IAAI,KAAK,KAAK,CAAC,MAAxC,mBAA2C,IAAI;AACvD;AACO,SAAS,eAAe,MAAoB,WAAmB;AACrE,MAAI,aAAa,yBAAyB,IAAI,KAAK,KAAK,CAAC;AACzD,MAAI,CAAC,YAAY;AAChB,iBAAa,oBAAI,IAAI;AACrB,6BAAyB,IAAI,KAAK,KAAK,GAAG,UAAU;AAAA,EACrD;AACA,MAAI,cAAc,WAAW,IAAI,SAAS;AAC1C,MAAI,CAAC,aAAa;AACjB,kBAAc,8EAAG,CAAC,CAAC;AACnB,eAAW,IAAI,WAAW,WAAW;AAAA,EACtC;AACA,SAAO;AACR;AAEO,SAAS,cAAc,MAAoB,WAAmB;AACpE,QAAM,OAAO,YAAY,MAAM,SAAS;AACxC,MAAI,CAAC,MAAM;AACV;AAAA,EACD;AACA,+FAAkB,CAAC,IAAI;AACxB;AACO,SAAS,uBAAuB,OAAsB;AAC5D,MAAI,CAAC,MAAM,MAAM;AAChB;AAAA,EACD;AACA,QAAM,OAAO,YAAY,MAAM,MAAM,MAAM,KAAK,CAAC;AACjD,MAAI,CAAC,MAAM;AACV;AAAA,EACD;AACA,+FAAkB,CAAC,IAAI;AACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1CuB;AAC4B;AAE5C,MAAM,oBAAoB,2CAAQ,CAAC;AAAA,EAGzC,YAAmB,UAAU,SAAS,cAAc,KAAK,GAAG;AAC3D,UAAM;AADY;AAFnB,SAAgB,gBAAgB;AAK/B,SAAK,QAAQ,MAAM,WAAW;AAE9B,SAAK,QAAQ,aAAa,aAAa,KAAY;AAAA,EAepD;AAAA,EAES,KAAK,QAAqB,WAAoB;AACtD,UAAM,KAAK,QAAgB,SAAS;AAEpC,SAAK,UAAU,OAAO,QAAQ,UAAU,IAAI;AAE5C,WAAO;AAAA,EACR;AACD;AAWO,SAAS,kBAAkB,SAA6B;AAC9D,QAAM,EAAC,IAAI,WAAW,KAAI,IAAI;AAC9B,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,KAAK;AACb,UAAQ,YAAY;AACpB,UAAQ,YAAY;AACpB,QAAM,YAAY,IAAI,YAAY,OAAO;AACzC,YAAU,mBAAmB;AAE7B,MAAI,QAAQ,QAAQ;AACnB,uGAAoC,CAAC,SAAS,iCAC1C,UAD0C;AAAA,MAE7C,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACD,EAAC;AAED,QAAI;AACJ,WAAQ,QAAQ,QAAQ,OAAO,SAAS,IAAI,GAAI;AAC/C,gBAAU,IAAI,KAAK;AAAA,IACpB;AAEA,cAAU,SAAS,KAAK,QAAQ,OAAO,QAAQ;AAG/C,cAAU,aAAa;AAAA,EACxB;AAEA,SAAO;AACR;;;;;;;;;;;;;;;;;;;;AClEO;AAE0B;AAGH;AACO;AAM9B,IAAK,qBAAL,kBAAKC,wBAAL;AACN,EAAAA,oBAAA,QAAK;AACL,EAAAA,oBAAA,WAAQ;AACR,EAAAA,oBAAA,UAAO;AACP,EAAAA,oBAAA,qBAAkB;AAClB,EAAAA,oBAAA,wBAAqB;AACrB,EAAAA,oBAAA,WAAQ;AANG,SAAAA;AAAA;AASL,MAAM,sBAAsB;AAAA,EAClC,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,MAAM;AACP;AACO,MAAM,sBAAsB;AAAA,EAClC,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,MAAM;AACP;AAEO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnC,OAAO,aAAa,QAAuC,OAAe;AACzE,uFAAe,CAAC,QAAQ,mBAAuB,KAAK;AAAA,EACrD;AAAA,EACA,OAAO,aAAa,QAA+C;AAClE,WAAO,mFAAe,CAAC,QAAQ,iBAAqB;AAAA,EACrD;AAAA,EACA,OAAO,gBAAgB,QAAuC,OAAe;AAC5E,uFAAe,CAAC,QAAQ,yBAA0B,KAAK;AAAA,EACxD;AAAA,EACA,OAAO,gBAAgB,QAA+C;AACrE,WAAO,mFAAe,CAAC,QAAQ,uBAAwB;AAAA,EACxD;AAAA,EACA,OAAO,eAAe,QAAuC,OAAe;AAC3E,uFAAe,CAAC,QAAQ,mBAAyB,KAAK;AAAA,EACvD;AAAA,EACA,OAAO,eAAe,QAA+C;AACpE,WAAO,mFAAe,CAAC,QAAQ,iBAAuB;AAAA,EACvD;AAAA;AAAA,EAEA,OAAO,kBAAkB,QAAuC,OAAgB;AAC/E,wFAAgB,CAAC,QAAQ,4CAAoC,KAAK;AAAA,EACnE;AAAA,EACA,OAAO,kBAAkB,QAAgD;AACxE,WAAO,oFAAgB,CAAC,QAAQ,4CAAoC,KAAK;AAAA,EAC1E;AAAA,EACA,OAAO,oBAAoB,QAAuC,OAAe;AAChF,uFAAe,CAAC,QAAQ,iDAAuC,KAAK;AAAA,EACrE;AAAA,EACA,OAAO,oBAAoB,QAA+C;AACzE,WAAO,mFAAe,CAAC,QAAQ,+CAAqC;AAAA,EACrE;AAAA;AAAA,EAEA,OAAO,SAAS,QAAuC,OAAe;AACrE,uFAAe,CAAC,QAAQ,yBAA0B,KAAK;AAAA,EACxD;AAAA,EACA,OAAO,SAAS,QAA+C;AAC9D,WAAO,mFAAe,CAAC,QAAQ,yBAA0B,CAAC;AAAA,EAC3D;AACD;AAQO,SAAS,qCAAqC,SAAsB,SAAgC;AAC1G,QAAM,EAAC,WAAW,gBAAgB,kBAAkB,OAAM,IAAI;AAE9D,YAAU,OAAO,OAAO;AACxB,YAAU,WAAW,uEAAe,CAAC,OAAO,QAAQ;AAEpD,MAAI,kBAAkB,MAAM;AAC3B,UAAM,kBAAkB,6FAAsB,CAAC,MAAM;AACrD,eAAW,cAAc,kBAAkB;AAC1C,YAAM,cAAc,gBAAgB,YAAY,QAAQ,UAAU;AAClE,UAAI,yDAAQ,CAAC,WAAW,GAAG;AAC1B,gBAAQ,aAAa,YAAY,WAAW;AAAA,MAC7C,OAAO;AACN,YAAI,yDAAQ,CAAC,WAAW,GAAG;AAC1B,kBAAQ,aAAa,YAAY,GAAG,aAAa;AAAA,QAClD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;;;;;;;;;;;;;;AChHO,IAAK,kBAAL,kBAAKC,qBAAL;AACN,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,SAAM;AACN,EAAAA,iBAAA,aAAU;AAHC,SAAAA;AAAA;AAKL,MAAM,oBAAuC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAK,oBAAL,kBAAKC,uBAAL;AACN,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,YAAS;AACT,EAAAA,mBAAA,SAAM;AAHK,SAAAA;AAAA;AAML,MAAM,sBAA2C;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AACD;AAEO,MAAM,gCAAyD;AAAA,EACrE,OAAO;AAAA,EACP,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,wBAAwB;AACzB;;;;;;;;;;;;;;AC/ByB;AACH;AAGf,MAAM,uBAAuB;AAAA,EAA7B;AACN,SAAQ,0BAAmD,oBAAI,QAAQ;AACvE,SAAQ,gBAAgB,KAAK,8BAA8B,KAAK,IAAI;AACpE,SAAQ,oBAAoB,KAAK,2BAA2B,KAAK,IAAI;AAAA;AAAA,EAErE,gCAAgC,YAAuB;AACtD,UAAM,UAAU,WAAW,eAAe;AAC1C,eAAW,UAAU,SAAS;AAC7B,aAAO,SAAS,KAAK,aAAa;AAAA,IACnC;AAAA,EACD;AAAA,EACA,4BAA4B,YAAuB;AAClD,UAAM,UAAU,WAAW,eAAe;AAC1C,eAAW,UAAU,SAAS;AAC7B,aAAO,SAAS,KAAK,iBAAiB;AAAA,IACvC;AAAA,EACD;AAAA,EACQ,8BAA8B,QAAkB;AACvD,UAAM,MAAO,OAAgB;AAC7B,QAAI,KAAK;AACR,UAAI,wDAAO,CAAC,GAAG,GAAG;AACjB,mBAAW,QAAQ,KAAK;AACvB,eAAK,wBAAwB,IAAI;AAAA,QAClC;AAAA,MACD,OAAO;AACN,aAAK,wBAAwB,GAAG;AAAA,MACjC;AAAA,IACD;AAAA,EACD;AAAA,EACQ,2BAA2B,QAAkB;AACpD,UAAM,MAAO,OAAgB;AAC7B,QAAI,KAAK;AACR,UAAI,wDAAO,CAAC,GAAG,GAAG;AACjB,mBAAW,QAAQ,KAAK;AACvB,eAAK,4BAA4B,IAAI;AAAA,QACtC;AAAA,MACD,OAAO;AACN,aAAK,4BAA4B,GAAG;AAAA,MACrC;AAAA,IACD;AAAA,EACD;AAAA,EACQ,wBAAwB,KAAe;AAC9C,SAAK,wBAAwB,IAAI,KAAK,IAAI,IAAI;AAC9C,QAAI,OAAO,6CAAU;AAAV,EACZ;AAAA,EACQ,4BAA4B,KAAe;AAClD,QAAI,OAAO,KAAK,wBAAwB,IAAI,GAAG,KAAK,6CAAU;AAAV,EACrD;AACD;;;;;;;;;;;;ACxDO,SAAS,oBAAoB;AAanC,SAAO;AACR;;;;;;;;;;;;ACbO,SAAS,qBAAqB,OAAkB;AADvD;AAEC,SACC,MAAM,KAAK,EAAE,qBAAqB,WAAW,OAC7C,WAAM,gBAAgB,mBAAmB,MAAzC,mBAA4C,aAC5C,MAAM,KAAK,EAAE,qBAAqB,uBAAuB;AAE3D;;;;;;;;;;;;;;;;;;;;ACPA,mDAAe,kBAAkB,iBAAiB,aAAa,2EAA2E,GAAG;;ACA7I,mDAAe,wCAAwC,6BAA6B,2BAA2B,2BAA2B,0BAA0B,6DAA6D,0DAA0D,+EAA+E,oEAAoE,GAAG,iBAAiB,+CAA+C,2CAA2C,uCAAuC,2BAA2B,GAAG;;;ACU1lB;AACY;AACE;AAgBd,SAAS,sBAAkC;AAEjD,QAAM,SAAS,IAAI,+BAAkB,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AACxD,QAAM,WAAW,IAAI,2BAAc,CAAC;AAAA,IACnC,cAAc,cAAM;AAAN,IACd,gBAAgB,cAAQ;AAAR,IAChB,UAAU;AAAA,MACT,YAAY,EAAC,OAAO,OAAO,KAAI;AAAA,MAC/B,WAAW,EAAC,OAAO,OAAO,IAAG;AAAA,MAC7B,UAAU,EAAC,OAAO,KAAI;AAAA,MACtB,QAAQ,EAAC,OAAO,KAAI;AAAA,IACrB;AAAA,EACD,CAAC;AACD,QAAM,YAAY,IAAI,0BAAa,CAAC,GAAG,CAAC;AACxC,QAAM,WAAW,IAAI,iBAAI,CAAC,WAAW,QAAQ;AAC7C,QAAM,QAAQ,IAAI,kBAAK,CAAC;AACxB,QAAM,IAAI,QAAQ;AAElB,SAAO,EAAC,OAAO,QAAQ,SAAQ;AAChC;AACO,SAAS,iBAAiB,OAAmB,QAAgB,cAAiC;AACpG,MAAK,OAA6B,uBAAwB,OAA8B,sBAAsB;AAC7G,UAAM,SAAS,SAAS,WAAW,QAAS,OAAkD;AAC9F,UAAM,SAAS,SAAS,UAAU,QAAS,OAAkD;AAC7F,UAAM,SAAS,SAAS,SAAS,QAAQ,aAAa;AACtD,UAAM,SAAS,SAAS,OAAO,QAAQ,aAAa;AAAA,EACrD,OAAO;AACN,YAAQ,KAAK,yDAAyD;AAAA,EACvE;AACD;;;;ACtCO;AAC4B;AAEiB;AAE7C,SAAS,eAAe,QAAiB,QAAiB;AAChE,SAAO,IAAI,OAAO,OAAO,IAAI;AAC7B,SAAO,IAAI,OAAO,IAAI,OAAO;AAC9B;AAcA,SAAS,sBAAsB;AAC9B,QAAM,UAAU,IAAI,yBAAY,CAAC,GAAG,CAAC;AACrC,UAAQ,OAAO,+BAAkB;AACjC,SAAO;AACR;AAEO,MAAM,sBAAsB;AAAA,EAA5B;AAIN;AAAA;AAAA;AAAA,SAAQ,0BAA6C,IAAI,8BAAiB,CAAC,GAAG,GAAG;AAAA,MAChF,WAAW,0BAAa;AAAb,MACX,WAAW,0BAAa;AAAb,MACX,QAAQ,uBAAU;AAAV,MACR,MAAM,sBAAS;AAAT,MACN,YAAY,yBAAY;AAAZ,MACZ,cAAc,oBAAoB;AAAA,IACnC,CAAC;AACD,SAAQ,yBAA4C,IAAI,8BAAiB,CAAC,GAAG,GAAG;AAAA,MAC/E,WAAW,0BAAa;AAAb,MACX,WAAW,0BAAa;AAAb,MACX,QAAQ,uBAAU;AAAV,MACR,MAAM,sBAAS;AAAT,MACN,YAAY,yBAAY;AAAZ,IACb,CAAC;AACD,SAAQ,eAAe,IAAI,kBAAK,CAAC;AACjC,SAAQ,kBAAkB,mBAAmB,CAAC;AAC9C,SAAQ,kBAAkC;AAAA,MACzC,QAAQ;AAAA,QACP,QAAQ;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAIA,UAAU;AAAA,QACT,aAAa,0BAAa;AAAb,QACb,kBAAkB,yBAAY;AAAZ,MACnB;AAAA,IACD;AACA,SAAQ,QAAQ,IAAI,aAAa,CAAC;AAAA;AAAA,EAElC,YACC,OACA,UACA,UACA,QACA,iBACA,IACA,QACU;AACV,SAAK,UAAU,OAAO,UAAU,QAAQ,UAAU,iBAAiB,IAAI,QAAQ,KAAK;AAEpF,WAAO;AAAA,EACR;AAAA,EACA,YACC,OACA,UACA,QACA,iBACA,IACA,QACU;AACV,SAAK,UAAU,OAAO,UAAU,QAAQ,MAAM,iBAAiB,IAAI,QAAQ,IAAI;AAE/E,WAAO;AAAA,EACR;AAAA,EACQ,UACP,OACA,UACA,QACA,UACA,iBACA,IACA,QACA,aACC;AACD,UAAM,WAAW,MAAM,kBAAkB,uBAAuB;AAChE,QAAI,CAAC,UAAU;AACd,aAAO;AAAA,IACR;AACA,QAAI,EAAE,oBAAoB,0BAAa,GAAG;AACzC,cAAQ,IAAI,kDAAkD;AAC9D,aAAO;AAAA,IACR;AACA,QAAI,UAAU,MAAM;AACnB,eAAS,mDAAoB,CAAC,KAAK;AAAA,IACpC;AAEA,SAAK,SAAS,UAAU,UAAU,iBAAiB,QAAQ;AAC3D,SAAK,QAAQ,IAAI,QAAQ,UAAU,QAAQ,WAAW;AACtD,SAAK,SAAS,UAAU,QAAQ;AAEhC,WAAO;AAAA,EACR;AAAA,EAEQ,SACP,UACA,UACA,iBACA,UACC;AAED,SAAK,gBAAgB,SAAS,mBAAmB,SAAS;AAC1D,SAAK,gBAAgB,SAAS,cAAc,SAAS;AACrD,SAAK,gBAAgB,OAAO,SAAS,SAAS;AAG9C,SAAK,aAAa,aAAa;AAC/B,SAAK,aAAa,mBAAmB,YAAY;AACjD,SAAK,aAAa,OAAO,QAAQ;AACjC,aAAS,cAAc,0BAAa;AACpC,aAAS,mBAAmB,yBAAY;AAAZ,EAC7B;AAAA,EACQ,QAAQ,IAAa,QAAgB,UAAyB,QAAiB,WAAoB;AAC1G,IAAC,OAAe;AAAA,MACf,SAAS,WAAW;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB,GAAG,IAAI,SAAS,WAAW;AAAA,MAC3B,GAAG,IAAI,SAAS,WAAW;AAAA,MAC3B;AAAA,MACA;AAAA,IACD;AAEA,aAAS,gBAAgB,KAAK,uBAAuB;AACrD,aAAS,MAAM;AACf,aAAS,OAAO,KAAK,cAAc,MAAM;AAEzC,QAAI,WAAW;AAEd,sBAAgB,CAAC,KAAK,iBAAiB,QAAQ,KAAK,uBAAuB;AAC3E,eAAS,gBAAgB,KAAK,sBAAsB;AACpD,eAAS,OAAO,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,MAAM;AACvE,eAAS,uBAAuB,KAAK,wBAAwB,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK;AAAA,IACpF,OAAO;AASN,eAAS,uBAAuB,KAAK,yBAAyB,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK;AAAA,IACrF;AAEA,aAAS,gBAAgB,IAAI;AAC7B,IAAC,OAAe,gBAAgB;AAGhC,WAAO,UAAU,KAAK,KAAK;AAAA,EAC5B;AAAA,EACQ,SAAS,UAAoB,UAAyB;AAhM/D;AAiME,aAAS,mBAAmB,KAAK,gBAAgB,SAAS;AAC1D,aAAS,cAAc,KAAK,gBAAgB,SAAS;AACrD,eAAK,gBAAgB,OAAO,WAA5B,mBAAoC,OAAO;AAAA,EAC5C;AACD;;;;;;;;;;;;ACrMO,IAAK,wBAAL,kBAAKC,2BAAL;AACN,EAAAA,uBAAA,WAAQ;AACR,EAAAA,uBAAA,eAAY;AACZ,EAAAA,uBAAA,cAAW;AACX,EAAAA,uBAAA,UAAO;AACP,EAAAA,uBAAA,cAAW;AACX,EAAAA,uBAAA,cAAW;AACX,EAAAA,uBAAA,WAAQ;AACR,EAAAA,uBAAA,aAAU;AACV,EAAAA,uBAAA,uBAAoB;AACpB,EAAAA,uBAAA,sBAAmB;AACnB,EAAAA,uBAAA,qBAAkB;AAClB,EAAAA,uBAAA,cAAW;AACX,EAAAA,uBAAA,eAAY;AAbD,SAAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAsB;AAW3B;AACc;AAOrB,MAAM,KAAK;AAaJ,MAAM,aAAa;AAAA,EAiBzB,YAAY,SAA8B;AAhB1C,SAAgB,KAAa;AAC7B,SAAgB,OAAiB;AACjC,SAAgB,gBAAsB;AAkItC;AAAA;AAAA,SAAQ,MAAM,IAAI,oBAAO,CAAC,GAAG,GAAG,CAAC;AACjC,SAAQ,MAAM,IAAI,oBAAO,CAAC,GAAG,GAAG,CAAC;AACjC,SAAQ,MAAM,IAAI,oBAAO,CAAC,GAAG,GAAG,CAAC;AACjC,SAAQ,MAAM,IAAI,oBAAO,CAAC;AAC1B,SAAQ,MAAM,IAAI,oBAAO,CAAC;AAC1B,SAAQ,MAAM,IAAI,oBAAO,CAAC;AAC1B,SAAQ,IAAI,IAAI,oBAAO,CAAC;AACxB,SAAQ,IAAI,IAAI,oBAAO,CAAC;AACxB,SAAQ,IAAI,IAAI,oBAAO,CAAC;AA3HvB,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AAGvB,SAAK,UAAU,QAAQ;AACvB,SAAK,gBAAgB,QAAQ,MAAM,aAAa;AAChD,SAAK,cAAc,QAAQ;AAC3B,SAAK,UAAU,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,KAAmB,IAA2B;AAInD,SAAK,eAAe,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAIQ,eAAe,IAA2B;AAYjD,SAAK,YAAY,IAAI,0BAAa,CAAC;AAAA;AAAA,MAElC,WAAW;AAAA,MACX,QAAQ,KAAK,KAAK,UAAU;AAAA,MAC5B,SAAS;AAAA,IACV,CAAC;AACD,SAAK,QAAQ,YAAY,KAAK,SAAS;AAEvC,SAAK,UAAU,YAAY;AAC3B,SAAK,UAAU,UAAU,UAAU;AAAA,EAkBpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaM,OAAO,IAA2B,QAAkB;AAAA;AAKzD,UAAI,CAAC,KAAK,WAAW;AACpB,gBAAQ,KAAK,aAAa;AAC1B;AAAA,MACD;AAEA,UAAI,qBAAqB,KAAK,cAAc;AAC5C,UAAI,KAAK,cAAc,YAAY;AAElC,aAAK,cAAc,aAAa;AAAA,MACjC;AAMA,WAAK,oBAAoB,MAAM;AAG/B,WAAK,UAAU,WAAW;AAE1B,WAAK,YAAY,KAAK,SAAS;AAQ/B,WAAK,KAAK,eAAe;AAEzB,WAAK,cAAc,aAAa;AAAA,IAKjC;AAAA;AAAA,EAaA,oBAAoB,QAAkB;AAKrC,UAAM,WAAW,iDAAsC,CAAC,CAAC,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG,GAAG,CAAC;AAC/F,UAAM,YAAY;AAAA,MACjB,UAAU;AAAA,MACV,UAAU,EAAC,GAAG,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,EAAC;AAAA,MACrC,OAAO,4DAA+B;AAAX,IAC5B;AAEA,SAAK,IAAI,SAAS;AAClB,SAAK,IAAI,SAAS;AAClB,SAAK,IAAI,SAAS;AAClB,UAAM,YAAY,KAAK,IAAI,iBAAiB,KAAK,KAAK,UAAU,SAAS,CAAC;AAC1E,UAAM,YAAY,KAAK,IAAI,iBAAiB,KAAK,KAAK,UAAU,SAAS,CAAC;AAC1E,UAAM,YAAY,KAAK,IAAI,iBAAiB,KAAK,KAAK,UAAU,SAAS,CAAC;AAE1E,SAAK,EAAE,IAAI,UAAU;AACrB,SAAK,EAAE,IAAI,CAAC,UAAU;AACtB,SAAK,EAAE,IAAI,UAAU;AACrB,SAAK,EAAE,UAAU,MAAM;AACvB,SAAK,EAAE,SAAS;AAChB,SAAK,EACH,gBAAgB,IAAI,UAAU,SAAS,GAAG,IAAI,UAAU,SAAS,GAAG,KAAK,UAAU,SAAS,KAAK,EAAE,EACnG,MAAM,KAAK,CAAC,EACZ,SAAS,SAAS,EAClB,SAAS,SAAS,EAClB,SAAS,SAAS;AAEpB,SAAK,QAAQ,iBAAiB,WAAW;AACzC,SAAK,QAAQ,mBAAmB,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CD;;;;AC5PO,MAAM,iBAA2B;AAAA,EACvC,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,QAAQ,CAAC,MAAM,WAAW,MAAM;AAAA,EAChC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,IACN,wBAAwB;AAAA;AAAA;AAAA,IAIxB,yBAAyB,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,QAAQ,CAAC;AAAA,IAC9F,uBAAuB,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA,IAChG,0BAA0B;AAAA,EAC3B;AACD;;;;AClBqB;AACmD;AAC3C;AAwBtB,MAAM,uBAAuB;AAAA,EAEnC,YAAoB,UAAyB;AAAzB;AAAA,EAA0B;AAAA,EAE9C,YAAY;AAWX,UAAM,gBAAgB,KAAK,SAAS,IAAI,SAAS;AACjD,UAAM,SAAS,cAAc;AAC7B,QAAI,CAAC,QAAQ;AACZ,cAAQ,KAAK,iBAAiB;AAC9B;AAAA,IACD;AAEA,QAAI,iBAAiB;AACrB,eAAW,SAAS,QAAQ;AAC3B,UAAI,MAAM,QAAQ,YAAa,MAAM,OAAiC,YAAY,GAAG;AACpF,yBAAiB,MAAM;AAAA,MACxB;AAAA,IACD;AAGA,QAAI,kBAAkB,MAAM;AAC3B,WAAK,mBAAmB,cAAc;AACtC,WAAK,iBAAiB,cAAc;AAAA,IACrC;AAEA,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,iBAAiB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAIQ,mBAAmB;AAC1B,QAAI,CAAC,KAAK,SAAS,cAAc;AAChC;AAAA,IACD;AASA,UAAM,aAAa,IAAI,uCAA0B,CAAC;AAClD,SAAK,SAAS,IAAI,WAAW,YAAY,cAAc;AAAA,EAIxD;AAAA,EACU,cAAc;AACvB,QAAI,CAAC,KAAK,SAAS,SAAS;AAC3B;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,aAAa,cAAc,MAAM;AAClD,cAAQ;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAEA,SAAK,SAAS,IAAI,UAAU,cAAc;AAAA,MACzC,MAAM;AAAA,MACN,KAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACV,CAAC;AAED,SAAK,SAAS,IAAI,WAAW,EAAC,QAAQ,cAAc,cAAc,IAAG,CAAC;AAAA,EACvE;AAAA,EACQ,eAAe;AACtB,QAAI,CAAC,KAAK,SAAS,UAAU;AAC5B;AAAA,IACD;AAEA,SAAK,SAAS,IAAI,SAAS;AAAA,MAC1B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,QACN,YAAY;AAAA,QACZ,sBAAsB,CAAC,GAAK,CAAG;AAAA,QAC/B,gCAAgC;AAAA,MACjC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACQ,mBAAmB,gBAAwB;AAClD,QAAI,CAAC,KAAK,SAAS,gBAAgB;AAClC;AAAA,IACD;AAEA,QAAI,KAAK,YAAY,iBAAiB,GAAG;AACxC;AAAA,IACD;AACA,SAAK,SAAS,IAAI,SAAS,cAAc,EAAE,cAAc;AAAA,EAC1D;AAAA,EAEU,iBAAiB,gBAAwB;AAClD,UAAM,UAA+B;AAAA,MACpC,KAAK,KAAK,SAAS;AAAA,MACnB,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,SAAS;AAAA,MACtB,QAAQ,KAAK,SAAS,IAAI,UAAU;AAAA,MACpC,QAAQ,KAAK,SAAS;AAAA,MACtB,YAAY,KAAK,SAAS;AAAA,MAC1B,QAAQ,KAAK,SAAS;AAAA,IACvB;AACA,SAAK,gBAAgB,IAAI,YAAY,CAAC,OAAO;AAC7C,SAAK,SAAS,IAAI,SAAS,KAAK,eAAe,cAAc;AAAA,EAI9D;AAAA,EACQ,YAAY,UAA2B;AApJhD;AAqJE,UAAM,gBAAgB,KAAK,SAAS,IAAI,SAAS;AACjD,UAAM,cAAY,mBAAc,WAAd,mBAAsB,IAAI,CAAC,MAAM,EAAE,QAAO,CAAC;AAC7D,WAAO,UAAU,SAAS,QAAQ;AAAA,EACnC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzJqB;AAGe;AACgB;AAI/B;AACgB;AAcrC,MAAM,0BAA0B;AAAA,EAMvB,cAAc;AAGtB,SAAQ,mBAA8C,oBAAI,IAAI;AAE9D,SAAQ,YAAmC,CAAC;AAU5C,SAAQ,gBAAgB;AAAA,EAfD;AAAA,EAHvB,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,0BAA0B;AAAA,EAC1E;AAAA,EAOM,aAAoC;AAAA;AACzC,UAAI,KAAK,iBAAiB;AACzB,eAAO,KAAK;AAAA,MACb,OAAO;AACN,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,eAAK,UAAU,KAAK,OAAO;AAAA,QAC5B,CAAC;AAAA,MACF;AAAA,IACD;AAAA;AAAA,EAEQ,uBAAuB,KAAmB;AACjD,QAAI,KAAK,eAAe;AACvB;AAAA,IACD;AACA,SAAK,gBAAgB;AACrB,UAAM,YAAmC,CAAC,GAAG,KAAK,SAAS;AAC3D,SAAK,UAAU,SAAS;AACxB,eAAW,KAAK,WAAW;AAC1B,QAAE,GAAG;AAAA,IACN;AAAA,EACD;AAAA,EAEA,UAAU,SAAiC;AAC1C,UAAM,EAAC,QAAQ,WAAW,OAAO,YAAY,OAAM,IAAI;AACvD,SAAK,SAAS;AACd,UAAM,kBAAkB,oDAAsB,CAAC,MAAM;AACrD,UAAM,QAAQ,gBAAgB,YAAY,QAAQ,8DAA2B;AAC7E,UAAM,YAAY,gBAAgB,YAAY,QAAQ,sEAA+B;AACrF,UAAM,WAAW,gBAAgB,YAAY,QAAQ,oEAA8B;AACnF,UAAM,OAAO,gBAAgB,YAAY,QAAQ,4DAA0B;AAC3E,UAAM,UAAU,gBAAgB,YAAY,QAAQ,oEAA8B;AAClF,UAAM,UAAU,gBAAgB,YAAY,QAAQ,oEAA8B;AAClF,UAAM,QAAQ,gBAAgB,YAAY,QAAQ,8DAA2B;AAC7E,UAAM,UAAU,gBAAgB,YAAY,QAAQ,kEAA6B;AAEjF,UAAM,kBAAkB,gBAAgB,YAAY,QAAQ,sFAAuC;AACnG,UAAM,iBAAiB,gBAAgB,YAAY,QAAQ,oFAAsC;AACjG,UAAM,kBAAkB,gBAAgB,YAAY,QAAQ,kFAAqC;AACjG,UAAM,WAAW,gBAAgB,YAAY,QAAQ,oEAA8B;AACnF,UAAM,YAAY,gBAAgB,YAAY,QAAQ,sEAA+B;AAErF,UAAM,aAAqC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,QAAQ,CAAC,WAAW,QAAQ;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,aAAa;AAAA;AAAA,IAEd;AAEA,IAAC,WAAmB,YAAY;AAChC,UAAM,MAAM,IAAI,yBAAY,CAAC,UAAU;AAEvC,UAAM,gBAA+B;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,MACN;AAAA,MACA,cAAc,MAAM,aAAa;AAAA,MACjC,cAAc;AAAA,MACd,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,UAAU;AAAA,IACX;AACA,UAAM,mBAAmB,IAAI,sBAAsB,CAAC,aAAa;AACjE,QAAI,GAAG,QAAQ,MAAM;AACpB,uBAAiB,UAAU;AAE3B,iBAAW,cAAc,IAAI,MAAM,QAAQ,CAAC;AAAA,IAC7C,CAAC;AAED,QAAI,GAAG,aAAa,MAAM;AAEzB,UAAI,IAAI,cAAc,GAAG;AACxB,YAAI,CAAC,KAAK,iBAAiB,KAAK,iBAAiB;AAChD,eAAK,uBAAuB,KAAK,eAAe;AAAA,QACjD;AAAA,MACD;AAAA,IACD,CAAC;AACD,QAAI,GAAG,QAAQ,MAAM,KAAK,oBAAoB,4DAA4B,CAAC;AAC3E,QAAI,GAAG,aAAa,MAAM,KAAK,oBAAoB,wEAAkC,CAAC;AACtF,QAAI,GAAG,WAAW,MAAM,KAAK,oBAAoB,oEAAgC,CAAC;AAYlF,SAAK,iBAAiB,IAAI,OAAO,MAAM,GAAG;AAC1C,SAAK,kBAAkB;AAKvB,WAAO,EAAC,KAAK,iBAAgB;AAAA,EAC9B;AAAA,EACQ,oBACP,MACC;AACD,QAAI,CAAC,KAAK,QAAQ;AACjB;AAAA,IACD;AAEA,SAAK,OAAO,aAAa,EAAE,SAAS,CAAC,WAAW;AA5JlD;AA6JG,iBAAK,WAAL,mBAAa,cAAc,kBAAkB,QAAQ;AAAA,IACtD,CAAC;AAAA,EACF;AACD;AACO,MAAM,uBAAuB,0BAA0B,SAAS;;;;;;;;;;;;;ACjKvC;AAEzB,MAAM,gCAAgC,oDAAiB,CAAC;AAAC;;;;;;;;;;;;ACFzD,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;ACA0D;AACvE;AACM;AACT;AAGU;AAI/B,MAAM,YAAY,IAAI,uCAAI,CAAC;AAC3B,MAAM,SAAS,IAAI,uCAAI,CAAC;AACxB,MAAM,YAAY,IAAI,0CAAO,CAAC;AAC9B,MAAM,UAAU,IAAI,0CAAO,CAAC;AAC5B,MAAM,YAAY,IAAI,0CAAO,CAAC;AAC9B,MAAM,UAAoC,CAAC;AAE3C,MAAM,SAAS,IAAI,0CAAO,CAAC,EAAE,iBAAiB,IAAI,0CAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;AAChF,MAAM,uBAAuB;AAE7B,MAAM,oBAA4C;AAAA,EACjD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACL;AAEO,MAAM,uBAAN,MAA0B;AAAA,EAA1B;AAGN,SAAQ,aAA+B,CAAC,GAAG,CAAC;AAAA;AAAA,EAE5C,UAAU,QAAgB;AACzB,WAAQ,KAAK,aAAa,0EAAsB,CAAC,OAAO,KAAK,OAAO,GAAG;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,OAAc;AAC9B,UAAM,YAAY,IAAI,+DAAS,CAAC;AAChC,cAAU,cAAc,MAAM,QAAQ;AACtC,cAAU,YAAY,MAAM;AAC5B,WAAO,UAAU,SAAS;AAC1B,WAAO,QAAQ,OAAO;AAEtB,UAAM,aAAa,4EAAuB,CAAC,SAAS;AACpD,UAAM,UAAU,4EAAuB,CAAC,OAAO,GAAG;AAClD,UAAM,UAAU,4EAAuB,CAAC,OAAO,GAAG;AAElD,UAAM,WAAW,QACf,IAAI,OAAO;AAGb,UAAM,WAAW,QACf,SAAS,QAAQ;AACnB,aAAS,IAAI,KAAK,IAAI,SAAS,CAAC;AAChC,aAAS,IAAI,KAAK,IAAI,SAAS,CAAC;AAChC,aAAS,IAAI,OAAO,SAAS,IAAI,SAAS;AAE1C,UAAM,SAAS,IAAI,0CAAO,CAAC;AAC3B,UAAM,eAAe,IAAI,0CAAO,CAAC;AACjC,UAAM,QAAQ,IAAI,0CAAO,CAAC;AAC1B,iBAAa,gBAAgB,CAAC,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC;AACrE,WAAO,gBAAgB,WAAW,IAAI,KAAK,WAAW,CAAC,GAAG,WAAW,GAAG,WAAW,IAAI,KAAK,WAAW,CAAC,CAAC;AACzG,UAAM,UAAU,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAElD,UAAM,SAAS,CAAC,WAAW;AAC1B,YAAM,WAAY,OAAgB;AAElC,UAAI,UAAU;AACb,iBAAS,aAAa,YAAY;AAClC,iBAAS,aAAa,KAAK;AAC3B,iBAAS,aAAa,MAAM;AAG5B,iBAAS,aAAa,MAAM;AAC5B,YAAI,SAAS,WAAW,QAAQ;AAC/B,mBAAS,qBAAqB;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,8BAA8B,QAAkB;AAC/C,SAAK,iBAAiB,MAAM;AAAA,EAC7B;AAAA,EACA,4BAA4B,QAAkB;AAE7C,SAAK,yBAAyB,OAAO,QAAQ;AAC7C,WAAO,aAAa;AAAA,EACrB;AAAA,EACA,yBAAyB,UAA0B;AAClD,SAAK,oBAAoB,QAAQ;AAAA,EAClC;AAAA,EACA,yBAAyB,UAA4B;AACpD,WAAO,KAAK,oBAAoB,QAAQ;AAAA,EACzC;AAAA,EACA,2BAA2B,UAA4B;AACtD,WAAO,KAAK,sBAAsB,QAAQ;AAAA,EAC3C;AAAA,EAEA,iBAAiB,OAAiB;AAGjC,UAAM,SAAS,CAAC,WAAW;AAC1B,YAAM,WAAY,OAAgB;AAClC,UAAI,UAAU;AACb,aAAK,yBAAyB,QAAQ;AAAA,MACvC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAc;AAC7B,UAAM,YAAY,KAAK,iBAAiB,KAAK;AAE7C,UAAM,SAAS,CAAC,WAAW;AAC1B,YAAM,WAAY,OAAgB;AAClC,UAAI,UAAU;AACb,aAAK,kCAAkC,UAAU,SAAS;AAAA,MAC3D;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBQ,oBAAoB,UAA0B;AACrD,cAAU,WAAW;AACrB,uGAAgB,CAAC,WAAU,OAAO;AAClC,eAAW,SAAS,SAAS;AAC5B,YAAM,SAAS,SAAS;AACxB,WAAK,yBAAyB,SAAS;AACvC,YAAM,eAAe,sBAAsB,SAAS;AAAA,IACrD;AAAA,EAID;AAAA,EAEQ,kCAAkC,UAA0B,WAAmB;AACtF,cAAU,WAAW;AACrB,uGAAgB,CAAC,WAAU,OAAO;AAClC,eAAW,SAAS,SAAS;AAC5B,YAAM,SAAS,SAAS;AACxB,WAAK,kCAAkC,WAAW,SAAS;AAC3D,YAAM,eAAe,sBAAsB,SAAS;AAAA,IACrD;AAEA,aAAS,aAAa,MAAM;AAC5B,QAAI,SAAS,WAAW,QAAQ;AAC/B,eAAS,qBAAqB;AAAA,IAC/B;AAAA,EACD;AAAA,EACQ,oBAAoB,UAA4B;AACvD,UAAM,MAAM,SAAS;AACrB,UAAM,WAAW,SAAS;AAC1B,UAAM,MAAM,SAAS;AAErB,UAAM,eAAe,8EAAsC,CAAC,CAAC,KAAK,GAAG,GAAG,QAAQ;AAChF,aAAS,IAAI,aAAa,IAAI,KAAK,WAAW,CAAC;AAC/C,aAAS,IAAI,aAAa,KAAK;AAE/B,aAAS,IAAI,aAAa,IAAI,KAAK,WAAW,CAAC;AAE/C,aAAS,aAAa,qBAAoB,WAAW;AACrD,WAAO;AAAA,EACR;AAAA,EACQ,sBAAsB,UAA4B;AACzD,aAAS,eAAe,qBAAoB,WAAW;AAEvD,UAAM,MAAM,SAAS,IAAI,KAAK,WAAW,CAAC;AAC1C,UAAM,WAAW,SAAS;AAC1B,UAAM,MAAM,SAAS,IAAI,KAAK,WAAW,CAAC;AAE1C,UAAM,WAAW,IAAI,qEAA2B,CAAC,KAAK,KAAK,QAAQ;AACnE,UAAM,eAAe,SAAS,SAAS;AACvC,aAAS,IAAI,aAAa;AAC1B,aAAS,IAAI;AAEb,aAAS,IAAI,aAAa;AAE1B,WAAO;AAAA,EACR;AAAA,EACQ,kCAAkC,UAAmB,WAAmB;AAC/E,UAAM,MAAM,SAAS;AACrB,UAAM,MAAM,SAAS;AACrB,UAAM,MAAM,0EAAsB,CAAC,KAAK,GAAG;AAC3C,aAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;AACvC,aAAS,KAAK,CAAC;AACf,aAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;AAAA,EACxC;AAAA,EAEQ,iBAAiB,OAAsB;AAC9C,UAAM,aAAa,IAAI,+DAAS,CAAC;AACjC,eAAW,cAAc,MAAM,QAAQ;AACvC,eAAW,YAAY,MAAM;AAC7B,WAAO,KAAK,WAAW,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,MAAoB;AACtC,UAAM,eAAe,0EAAsB,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAClE,UAAM,eAAe,0EAAsB,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAClE,UAAM,gBAAgB,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,GAAG,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC;AAC3F,UAAM,gBAAgB,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC;AACvE,UAAM,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,GAAG,cAAc,CAAC,IAAI,cAAc,CAAC,CAAC;AAC5F,WAAO,KAAK,IAAI,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,EAC7C;AAAA,EAQA,OAAO,mCAAmC;AACzC,WAAQ,KAAK,eAAe,KAAK,gBAAgB,KAAK,wCAAwC;AAAA,EAC/F;AAAA,EACA,OAAO,0CAA0C;AAChD,UAAM,YAAY,OAAO,KAAK,iBAAiB,EAC7C,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC,EACxB,KAAK;AACP,UAAM,SAAS,CAAC;AAChB,eAAW,YAAY,WAAW;AACjC,aAAO,KAAK,kBAAkB,QAAQ,CAAC;AAAA,IACxC;AAEA,UAAM,eAAe;AACrB,UAAM,sBAAsB,IAAI,aAAa,YAAY;AACzD,WAAO,IAAI,oDAAiB,CAAC,WAAW,QAAQ,cAAc,mBAAmB;AAAA,EAClF;AAAA,EACA,OAAO,oBAAoB,MAAsB;AAChD,WAAO,KAAK,iCAAiC,EAAE,SAAS,IAAI,EAAE,CAAC;AAAA,EAChE;AACD;AAlOO,IAAM,sBAAN;AAAM,oBACL,cAAc;;;;;;;;;;;;;;;;;;AC/CtB,MAAM,aAAa;AACnB,MAAM,aAAa;AAEZ,MAAM,sBAAsB;AAAA,EAClC;AAAA,EACA,uBAAuB,cAAc,aAAa,KAAK,MAAM;AAAA,EAC7D;AAAA;AAAA,EACA,SAAS,KAAK,KAAK;AAAA,EACnB,SAAS,MAAM,KAAK;AAAA,EACpB,qBAAqB;AACtB;;;;ACT6C;AAGX;AAElC,MAAM,YAAY,mBAAmB;AAE9B,MAAM,gBAAgB;AAAA,EAC5B,OAAO,yBAAyB,KAAmB;AAClD,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AAEjB,WAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,EACrD;AAAA,EACA,OAAO,wBAAwB,KAAmB;AACjD,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI;AAEV,WAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,EACrD;AAAA,EACA,OAAO,uBAAuB,KAAmB;AAChD,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,IAAI,OAAO,eAAe;AAChC,WAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,EACvD;AAAA,EAEA,OAAO,sBAAsB,MAAc,QAAgB,MAAc,KAAa;AACrF,UAAM,MAAM,IAAI,oBAAO,CAAC;AACxB,UAAM,IAAI,IAAM,KAAK,IAAI,OAAO,CAAC;AACjC,UAAM,KAAK,KAAK,OAAO;AAEvB,UAAM,YAA0B;AAAA,MAC/B,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,OACC,MAAM,QAAQ;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,MAAM,OAAO;AAAA,MACjB;AAAA,IACD;AAEA,QAAI,WAAW;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,eAAe,QAAiB;AAEtC,UAAM,YAAY;AAAA,MACjB,CAAC,UAAU,aAAa,OAAO,CAAC,IAAI,UAAU,UAAU,UAAU;AAAA,MAClE,CAAC,UAAU,aACV,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,OAAO,MAAM,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,IACvE,UAAU;AAAA,IACZ;AAEA,UAAM,iBAAiB,KAAK,uBAAuB,OAAO,CAAC,CAAC;AAG5D,QAAI,SAAS,OAAO,CAAC;AACrB,QAAI,UAAU,MAAM;AACnB,eAAS;AAAA,IACV;AACA,cAAU,KAAK,SAAS,cAAc;AAEtC,WAAO,IAAI,oBAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAO,uBAAuB,UAA0B;AACvD,WAAO,KAAK;AAAA,MACV,UAAU,cAAc,IAAI,KAAK,IAAK,WAAW,KAAK,KAAM,GAAG,KAAM,UAAU;AAAA,IACjF;AAAA,EACD;AAAA,EAEA,OAAO,OAAO,KAAa,KAA+B;AAEzD,UAAM,SAAS;AACf,UAAM,IAAK,MAAM,SAAU;AAC3B,QAAI,IAAI,KAAK,IAAI,KAAK,KAAM,KAAK,OAAO,KAAK,KAAM,GAAG,CAAC,KAAK,KAAK,KAAK;AACtE,QAAK,IAAI,SAAU;AACnB,WAAO,EAAE,IAAI,WAAW,IAAI,SAAS,KAAK,IAAI,WAAW,IAAI,OAAO;AAAA,EACrE;AAAA,EACA,OAAO,QAAQ,UAA4B;AAC1C,UAAM,KAAK,KAAK,OAAO,SAAS,GAAG,SAAS,CAAC;AAC7C,WAAO,IAAI,oBAAO,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;AAAA,EAC5C;AAAA;AAAA,EAGA,OAAO,aAAa,SAA0B,SAA0B;AAEvE,UAAM,IAAI;AAEV,UAAM,MAAM,KAAK,KAAK,KACrB,OAAO,QAAQ,MAAM,KACrB,OAAO,QAAQ,MAAM,KACrB,IACC,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAC9B,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,QAAQ,MAAM,QAAQ,OAAO,GAAG;AAE9E,UAAM,YAAY,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC;AAC9C,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,OAAO,mBAAmB,QAAgB,QAAgB,MAAc;AACvE,UAAM,SAAU,SAAS,MAAO,KAAK;AACrC,UAAM,IAAI,KAAO;AACjB,UAAM,IAAI,KAAK,OAAQ,SAAS,OAAS,MAAS,CAAC;AACnD,UAAM,IAAI,KAAK,OAAQ,IAAM,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAO,CAAC;AAEpG,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO,sBAAsB,OAAe,OAAe,MAAc;AACxE,UAAM,IAAI,KAAO;AACjB,UAAM,UAAW,QAAQ,IAAK,MAAQ;AACtC,UAAM,UAAU,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,IAAK,IAAI,QAAS,EAAE,CAAC;AACpE,UAAM,UAAU,OAAS,UAAU,KAAK;AAExC,WAAO;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAAA,EACD;AACD;;;;;;;;;;;;;;;ACvJ2B;AACW;AAG/B,MAAM,8BAAuD;AAE7D,MAAM,uBAA+C,CAAC,SAAqB;AACjF,OAAK,uBAAuB,2BAA2B;AAEvD,OAAK,eAAwC,sFAAuB,EAAE,CAAC,YAAY;AAClF,UAAM,EAAC,QAAQ,MAAK,IAAI;AAMxB,UAAM,SAAS,IAAI,yEAAY,CAAC;AAAA;AAAA,MAE/B;AAAA,MACA;AAAA,MACA,oBAAoB,CAAC,WAAW;AAC/B,eAAO,SAAS;AAAA,MAGjB;AAAA,IACD,CAAC;AACD,WAAO;AAAA,EACR,CAAC;AACF;;;;;;;;;;;;;;ACtBO,MAAM,eAA4B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,CAAC,SAA4C;AACtD,WAAO;AAAA,EACR;AACD;AACA,SAAS,aAAa,MAAyC;AAC9D,SAAO,aAAa,SAAS,IAAI;AAElC;AACA,SAAS,UAAU;AAClB,SAAO,aAAa;AACrB;AAEsB;;;;;;;;;;;;;;;;;;;;ACtBf,IAAK,yBAAL,kBAAKC,4BAAL;AACN,EAAAA,wBAAA,eAAY;AACZ,EAAAA,wBAAA,kBAAe;AACf,EAAAA,wBAAA,YAAS;AACT,EAAAA,wBAAA,kBAAe;AACf,EAAAA,wBAAA,gBAAa;AALF,SAAAA;AAAA;AAQL,MAAM,8BAAwD;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AACA,SAAS,qBAAqB;AAC7B,QAAM,MAA2C,oBAAI,IAAI;AACzD,MAAI,IAAI;AACR,aAAW,aAAa,6BAA6B;AACpD,QAAI,IAAI,WAAW,CAAC;AACpB;AAAA,EACD;AACA,SAAO;AACR;AACO,MAAM,wBAAwB,mBAAmB;AAEjD,MAAM,8BAAsD;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AACO,MAAM,qCAA2D;AAMjE,IAAK,qBAAL,kBAAKC,wBAAL;AACN,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,cAAW;AAHA,SAAAA;AAAA;AAKL,MAAM,yBAA+C;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AACD;AACO,MAAM,sCAAsC,uBAAuB,QAAQ,yBAA2B;AACtG,MAAM,8BAA8B;AAAA,EAC1C,MAAM;AAAA,IACL,SAAS,uBAAuB,IAAI,CAAC,MAAM,WAAW,EAAC,MAAM,MAAK,EAAE;AAAA,EACrE;AACD;;;;;;;;;;;;;;;;;;;;;;;;ACtDuF;AACrB;AACnC;AAOxB,SAAS,oBAAoB,iBAAiC;AACpE,SAAO,mBAAmB;AAC3B;AAQO,MAAM,qCAAqC,4BAAe,CAAuC;AAAA,EAGvG,YACiB,OACA,UACA,OACf;AACD,UAAM;AAJU;AACA;AACA;AALjB,SAAgB,MAAW,IAAI,gBAAG,CAAC;AASlC,SAAK,aAAa,KAAK,SAAS,GAAG,cAAc,KAAK,KAAK;AAE3D,eAAW,aAAa,0CAA2B,EAAE;AACpD,YAAM,QAAmC,EAAC,MAAM,WAAW,qBAAqB,KAAI;AACpF,WAAK,WAAW,iBAAiB,WAAW,CAAC,oBAAoB;AAChE,aAAK,cAAc,KAAK;AAAA,MACzB,CAAC;AAAA,IACF;AACA,SAAK,WAAW,OAAO,oBAAoB,KAAK,KAAK;AAAA,EACtD;AAAA,EACA,WAAW,QAAuB;AACjC,QAAI,UAAU,MAAM;AACnB,uEAAgB,CAAC,KAAK,OAAO,KAAK,UAAU;AAC5C;AAAA,IACD;AAEA,UAAM,eAAe,OAAO;AAC5B,QAAI,cAAc;AACjB,mBAAa,IAAI,KAAK,UAAU;AAAA,IACjC,OAAO;AACN,cAAQ,KAAK,mEAAmE;AAAA,IACjF;AAAA,EACD;AACD;;;;ACpD6C;AAEjB;AACiD;AAClC;AAC3C,MAAM,aAAa,IAAI,oBAAO,CAAC;AAC/B,MAAM,6BAA6B;AAG5B,MAAe,wBAAwB;AAAA,EAE7C,YACW,OACA,UACA,QACF,QACE,SACT;AALS;AACA;AACA;AACF;AACE;AANX,SAAU,uBAAuD,CAAC;AA8DlE,SAAQ,uBAAuB,KAAK,gBAAgB,KAAK,IAAI;AAC7D,SAAQ,qBAAqB,KAAK,cAAc,KAAK,IAAI;AAoBzD;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,oBAA8C,oBAAI,IAAI;AA3E7D,aAAS,GAAG,UAAU;AAEtB,QAAI,8BAAa,CAAC,QAAQ,0BAA0B,KAAK,QAAQ,oBAAoB;AACpF,eAAS,GAAG,sBAAsB,QAAQ,kBAAkB;AAAA,IAC7D,OAAO;AACN,eAAS,GAAG,sBAAsB,iDAAkC;AAAA,IACrE;AAAA,EACD;AAAA,EACA,cAAc,iBAAyB;AACtC,WAAO,KAAK,qBAAqB,eAAe,KAAK,KAAK,kBAAkB,eAAe;AAAA,EAC5F;AAAA,EAEA,QAAQ;AAQP,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,UAAU;AACT,SAAK,uBAAuB;AAC5B,SAAK,eAAe;AAAA,EACrB;AAAA,EACA,eAAe,aAA4B,UAAyC;AACnF,SAAK,mBAAmB;AAAA,EACzB;AAAA,EACQ,qBAAqB;AAC5B,SAAK,SAAS,GAAG,iBAAiB,gBAAgB,KAAK,oBAAoB;AAC3E,SAAK,SAAS,GAAG,iBAAiB,cAAc,KAAK,kBAAkB;AAAA,EACxE;AAAA,EACQ,yBAAyB;AAChC,SAAK,SAAS,GAAG,oBAAoB,gBAAgB,KAAK,oBAAoB;AAC9E,SAAK,SAAS,GAAG,oBAAoB,cAAc,KAAK,kBAAkB;AAAA,EAC3E;AAAA,EAEQ,kBAAkB,iBAAuD;AAChF,UAAM,sBAAsB,IAAI,4BAA4B,CAAC,KAAK,OAAO,KAAK,UAAU,eAAe;AACvG,wBAAoB,WAAW,KAAK,MAAM;AAC1C,SAAK,qBAAqB,KAAK,mBAAmB;AAClD,SAAK,qBAAqB,qBAAqB,eAAe;AAC9D,WAAO;AAAA,EACR;AAAA,EACU,qBAAqB,qBAAmD,iBAA+B;AAAA,EAAC;AAAA,EAClH,QAAQ,OAAiB;AACxB,eAAW,uBAAuB,KAAK,sBAAsB;AAC5D,iBAAW,SAAS,EAAE,gBAAgB,oBAAoB,WAAW,WAAW;AAChF,0BAAoB,IAAI,OAAO,sBAAsB,oBAAoB,WAAW,WAAW;AAC/F,0BAAoB,IAAI,UAAU,IAAI,GAAG,GAAG,EAAE,EAAE,aAAa,UAAU;AAAA,IACxE;AAAA,EACD;AAAA,EAIU,kBAAkB;AAC3B,eAAW,uBAAuB,KAAK,sBAAsB;AAC5D,0BAAoB,WAAW,KAAK,MAAM;AAAA,IAC3C;AACA,SAAK,MAAM,KAAK;AAAA,EACjB;AAAA,EACU,gBAAgB;AACzB,SAAK,uBAAuB;AAC5B,eAAW,uBAAuB,KAAK,sBAAsB;AAC5D,0BAAoB,WAAW,IAAI;AAAA,IACpC;AACA,SAAK,MAAM,MAAM;AAAA,EAClB;AAAA,EAUQ,eAAe;AACtB,QAAI,CAAC,KAAK,SAAS,GAAG,SAAS;AAC9B,cAAQ,KAAK,uDAAuD;AACpE;AAAA,IACD;AACA,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,QAAQ;AACX,UAAI,mBAAuC,OAAO,cAAc,IAAI,4BAA4B;AAChG,UAAI,CAAC,kBAAkB;AACtB,2BAAmB,SAAS,cAAc,KAAK;AAC/C,yBAAiB,UAAU,IAAI,0BAA0B;AACzD,eAAO,QAAQ,gBAAgB;AAC/B,yBAAiB,MAAM,WAAW;AAClC,yBAAiB,MAAM,SAAS;AAChC,yBAAiB,MAAM,YAAY;AACnC,yBAAiB,MAAM,QAAQ;AAAA,MAChC;AACA,YAAM,SAAS,KAAK,aAAa;AACjC,WAAK,aAAa,kBAAkB,MAAM;AAC1C,WAAK,kBAAkB,IAAI,KAAK,OAAO,IAAI,MAAM;AAAA,IAClD,OAAO;AACN,cAAQ,KAAK,sBAAsB;AAAA,IACpC;AAAA,EACD;AAAA,EAEQ,iBAAiB;AAzH1B;AA0HE,UAAM,SAAS,KAAK,kBAAkB,IAAI,KAAK,OAAO,EAAE;AACxD,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AACA,iBAAO,kBAAP,mBAAsB,YAAY;AAAA,EACnC;AACD;;;;;;;;;;;;;;;AChIA,MAAM,4BAA4B;AAE3B,SAAS,cAAc,SAAsB;AACnD,UAAQ,MAAM,aAAa;AAC5B;AAEO,SAAS,kBAAkB,SAAsB;AACvD,UAAQ,MAAM,SAAS;AACvB,UAAQ,MAAM,UAAU;AACxB,UAAQ,MAAM,SAAS;AACvB,UAAQ,MAAM,eAAe;AAC7B,UAAQ,MAAM,QAAQ;AAEtB,UAAQ,MAAM,YAAY;AAC1B,UAAQ,MAAM,UAAU;AACxB,UAAQ,MAAM,UAAU;AACxB,UAAQ,MAAM,SAAS;AACvB,UAAQ,MAAM,aAAa;AAC5B;AAEO,SAAS,iBAAiB;AAChC,QAAM,UAAU,SAAS,cAAc,GAAG;AAE1C,MAAI,WAAW,oBAAoB,OAAO;AACzC,YAAQ,OAAO,SAAS,SAAS,KAAK,QAAQ,UAAU,QAAQ;AAChE,YAAQ,YAAY;AAAA,EACrB,OAAO;AACN,YAAQ,OAAO;AACf,YAAQ,YAAY;AAAA,EACrB;AAEA,UAAQ,MAAM,OAAO;AAErB,UAAQ,MAAM,iBAAiB;AAC/B,SAAO;AACR;AAEO,SAAS,qBAAqB,QAAqB;AACzD,SAAO,MAAM,UAAU;AAEvB,SAAO,MAAM,SAAS;AACtB,SAAO,MAAM,OAAO;AAEpB,SAAO,eAAe;AACtB,SAAO,eAAe;AAEtB,SAAO,UAAU;AAClB;;;;;;;;;;;;;;;ACnCO,IAAK,2BAAL,kBAAKC,8BAAL;AACN,EAAAA,0BAAA,YAAS;AACT,EAAAA,0BAAA,WAAQ;AACR,EAAAA,0BAAA,WAAQ;AAHG,SAAAA;AAAA;AAKL,MAAM,+BAA2D;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAK,8BAAL,kBAAKC,iCAAL;AACN,EAAAA,6BAAA,YAAS;AACT,EAAAA,6BAAA,YAAS;AAFE,SAAAA;AAAA;AAIL,MAAM,kCAAiE;AAAA,EAC7E;AAAA,EACA;AACD;;;;;;;;;;;;;AC5BO,IAAK,iBAAL,kBAAKC,oBAAL;AACN,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,sBAAmB;AAFR,SAAAA;AAAA;AAML,MAAM,oBAAsC;AAAA,EAClD;AAAA,EACA;AAAA;AAED;;;;;;;;;;;;;;;;;ACPe;;AAEf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,gCAAgC,kCAAqB;AACrD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEO,+BAA+B,kBAAK;;AAE3C;;AAEA;;AAEA,wBAAwB,uBAAU;AAClC;AACA;;AAEA,8BAA8B,6BAAgB;AAC9C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;;AAEA;AACA,4BAA4B,0BAA0B;;AAEtD,OAAO;;AAEP,MAAM;;AAEN;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,0BAA0B,wBAAwB;;AAElD;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;AC9N6E;AAC9C;AAKM;AAErC,MAAM,cAAc;AAAA,EACnB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA;AAAA,EAE1B,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAElB;AACO,MAAM,oCAAoC;AAAA,EAGhD,WAAW,OAAkB,UAAyB;AACrD,SAAK,8BAA8B;AACnC,UAAM,aAAa,EAAE,SAAS,CAAC,WAAW;AACzC,UAAI,KAAK,6BAA6B;AACrC;AAAA,MACD;AACA,YAAM,kBAAkB,oDAAsB,CAAC,MAAM;AAErD,YAAM,mBAAmB,gBAAgB,YAAY,QAAQ,YAAY,kBAAkB;AAG3F,UAAI,oBAAoB,MAAM;AAC7B,aAAK,8BAA8B;AACnC,aAAK,oBAAoB,OAAO,QAAQ;AAAA,MACzC;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA,EAIc,oBAAoB,OAAkB,UAAyB;AAAA;AAC5E,UAAI,CAAC,KAAK,6BAA6B;AACtC;AAAA,MACD;AAGA,YAAM,6BAA6B,KAAK;AACxC,YAAM,sBAAsB,KAAK,4BAA4B,SAAS,KAAK,CAAC,UAAU;AACrF,cAAMC,mBAAkB,oDAAsB,CAAC,KAAK;AACpD,QAAAA,iBAAgB,YAAY,OAAO,YAAY,wBAAwB;AAAA,MACxE,CAAC;AAkBD,YAAM,kBAAkB,oDAAsB,CAAC,0BAA0B;AAGzE,YAAM,WACJ,gBAAgB,YAAY,4BAA4B,YAAY,SAAS,KAAwB;AACvG,YAAM,kBACJ,gBAAgB,YAAY,4BAA4B,YAAY,iBAAiB,KAE1E;AACb,YAAM,gBACJ,gBAAgB,YAAY,4BAA4B,YAAY,eAAe,KACpF;AAKD,UAAI,KAAK,iBAAiB;AACzB,aAAK,4BAA4B,OAAO,KAAK,eAAe;AAAA,MAC7D;AAEA,WAAK,kBAAkB,IAAI,gBAAgB,CAAC,QAAQ;AACpD,WAAK,4BAA4B,IAAI,KAAK,eAAe;AACzD,YAAM,eAAe,MAAM,aAAa;AAExC,UAAI,cAA8B;AAClC,YAAM,iBAAiB,KAAK;AAC5B,WAAK,gBAAgB,iBAAiB,mBAAmB,MAAM;AAE9D,mCAA2B,IAAI,cAAc;AAC7C,YAAI,qBAAqB;AACxB,qCAA2B,OAAO,mBAAmB;AAAA,QACtD;AAGA,uBAAe,SAAS,CAAC,UAAU;AAClC,cAAI,iBAAiB,uBAAU,EAAE;AAChC,gBAAI,mBAAmB,OAAO;AAC7B,oBAAM,iBAAiB;AAAA,YACxB;AAAA,UACD;AACA,cAAI,iBAAiB,6BAAgB,EAAE;AACtC,gBAAI,iBAAiB,OAAO;AAC3B,oBAAM,iBAAiB;AAAA,YACxB;AAAA,UACD;AAAA,QACD,CAAC;AAGD,YAAI,YAAY,eAAe,aAAa;AAC3C,wBAAc,aAAa;AAC3B,uBAAa,cAAc,eAAe;AAAA,QAC3C;AAAA,MACD,CAAC;AAED,qBAAe,iBAAiB,iBAAiB,MAAM;AAEtD,YAAI,qBAAqB;AACxB,qCAA2B,IAAI,mBAAmB;AAAA,QACnD;AACA,mCAA2B,OAAO,cAAc;AAGhD,qBAAa,cAAc;AAAA,MAG5B,CAAC;AAAA,IACF;AAAA;AAAA,EAEA,UAAU;AAxIX;AAyIE,QAAI,KAAK,iBAAiB;AACzB,iBAAK,gCAAL,mBAAkC,OAAO,KAAK;AAC9C,WAAK,kBAAkB;AAAA,IACxB;AAAA,EACD;AACD;AA7Ha,oCACL,cAAc;;;;;;;;;;;;;AChBf,IAAK,iBAAL,kBAAKC,oBAAL;AACN,EAAAA,gBAAA,iBAAc;AACd,EAAAA,gBAAA,mBAAgB;AAChB,EAAAA,gBAAA,mBAAgB;AAChB,EAAAA,gBAAA,YAAS;AAJE,SAAAA;AAAA;AAOL,MAAM,oBAAsC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;;;;;;;;;;;;;;;;;;ACNO;AAC6C;AAC3B;AAElB,IAAK,mBAAL,kBAAKC,sBAAL;AACN,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,mBAAgB;AAEhB,EAAAA,kBAAA,yBAAsB;AANX,SAAAA;AAAA;AASL,IAAK,mBAAL,kBAAKC,sBAAL;AAEN,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,wBAAqB;AACrB,EAAAA,kBAAA,YAAS;AACT,EAAAA,kBAAA,mBAAgB;AAChB,EAAAA,kBAAA,wBAAqB;AAGrB,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,iBAAc;AAfH,SAAAA;AAAA;AAqBL,IAAK,yBAAL,kBAAKC,4BAAL;AAEN,EAAAA,wBAAA,SAAM;AACN,EAAAA,wBAAA,SAAM;AACN,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,WAAQ;AALG,SAAAA;AAAA;AAgBZ,SAAS,mBAAmB,MAAyC;AACpE,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK,0EAAwB;AAC5B,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,EACT;AACA,8FAAsB,CAAC,IAAI;AAC5B;AAEO,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA,EAIjC,OAAO,UAAU,QAAuC;AACvD,WAAO,KAAK,UAAU,MAAM,KAAK;AAAA,EAClC;AAAA,EACA,OAAO,UAAU,QAAuC,OAAe;AACtE,uFAAe,CAAC,QAAQ,yCAA0B,KAAK;AAAA,EACxD;AAAA,EACA,OAAO,UAAU,QAA+C;AAC/D,WAAO,mFAAe,CAAC,QAAQ,uCAAwB;AAAA,EACxD;AAAA,EACA,OAAO,oBAAoB,QAAuC,OAAgB;AACjF,wFAAgB,CAAC,QAAQ,8DAAqC,KAAK;AAAA,EACpE;AAAA,EACA,OAAO,oBAAoB,QAAuC;AACjE,WAAO,oFAAgB,CAAC,QAAQ,8DAAqC,KAAK;AAAA,EAC3E;AAAA,EACA,OAAO,UAAU,QAAuC,OAAe;AACtE,uFAAe,CAAC,QAAQ,wCAAyB,KAAK;AAAA,EACvD;AAAA,EACA,OAAO,UAAU,QAAuC;AACvD,WAAO,mFAAe,CAAC,QAAQ,wCAAyB,CAAC;AAAA,EAC1D;AAAA,EACA,OAAO,eAAe,QAAuC,OAAgB;AAC5E,wFAAgB,CAAC,QAAQ,oDAAgC,KAAK;AAAA,EAC/D;AAAA,EACA,OAAO,eAAe,QAAgD;AACrE,WAAO,oFAAgB,CAAC,QAAQ,oDAAgC,KAAK;AAAA,EACtE;AAAA,EACA,OAAO,oBAAoB,QAAuC,OAAgB;AACjF,wFAAgB,CAAC,QAAQ,8DAAqC,KAAK;AAAA,EACpE;AAAA,EACA,OAAO,oBAAoB,QAAgD;AAC1E,WAAO,oFAAgB,CAAC,QAAQ,8DAAqC,KAAK;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,YAAY,QAAuC,MAAuC;AAChG,WAAO,mFAAe,CAAC,QAAQ,mBAAmB,IAAI,CAAC;AAAA,EACxD;AAAA,EACA,OAAO,YAAY,QAAuC,MAAmB,OAAe;AAC3F,uFAAe,CAAC,QAAQ,mBAAmB,IAAI,GAAG,KAAK;AAAA,EACxD;AACD;AACO,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA,EAIjC,OAAO,gBAAgB,QAAuC;AAC7D,WAAO,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM;AAAA,EACnG;AAAA,EACA,OAAO,OAAO,QAAuC,OAAe;AACnE,uFAAe,CAAC,QAAQ,sCAA4B,KAAK;AAAA,EAC1D;AAAA,EACA,OAAO,OAAO,QAA+C;AAC5D,WAAO,mFAAe,CAAC,QAAQ,oCAA0B;AAAA,EAC1D;AAAA,EACA,OAAO,OAAO,QAAuC,OAAe;AACnE,uFAAe,CAAC,QAAQ,sCAA4B,KAAK;AAAA,EAC1D;AAAA,EACA,OAAO,OAAO,QAA+C;AAC5D,WAAO,mFAAe,CAAC,QAAQ,oCAA0B;AAAA,EAC1D;AAAA,EACA,OAAO,SAAS,QAAuC,OAAe;AACrE,uFAAe,CAAC,QAAQ,0CAA8B,KAAK;AAAA,EAC5D;AAAA,EACA,OAAO,SAAS,QAA+C;AAC9D,WAAO,mFAAe,CAAC,QAAQ,wCAA4B;AAAA,EAC5D;AAAA,EACA,OAAO,SAAS,QAAuC,OAAe;AACrE,uFAAe,CAAC,QAAQ,0CAA8B,KAAK;AAAA,EAC5D;AAAA,EACA,OAAO,SAAS,QAA+C;AAC9D,WAAO,mFAAe,CAAC,QAAQ,wCAA4B;AAAA,EAC5D;AACD;;;;;;;;;;;;;;;;;;;;;;;AC5JkB;AAEU;AAOrB,MAAM,2BAAkD;AACxD,MAAM,uBAA8C;AAEpD,MAAM,YAA2B,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAqC9D,MAAM,wBAAuC,CAAC,KAAK,KAAK,KAAK,GAAG;AAChE,SAAS,YAAY,MAAmB,UAA+B;AAC7E,MAAI,QAAQ,OAAO,QAAQ,KAAK;AAC/B,WAAO;AAAA,EACR;AACA,QAAM,QAAQ,sBAAsB,QAAQ,IAAI;AAChD,SAAO,sBAAsB,2DAAG,CAAC,QAAQ,UAAU,CAAC,CAAC;AACtD;AAMO,SAAS,iBAAiB,aAA2B,QAAyB;AACpF,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,aAAW,UAAU,aAAa;AACjC,QAAI,OAAO,UAAU,iEAAa,EAAE;AACnC,aAAO;AAAA,IACR,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AACD;AACO,SAAS,gBAAgB,aAAyC;AACxE,SAAO,YAAY,OAAO,CAAC,WAAW,OAAO,UAAU,iEAAa;AACrE;AAMO,SAAS,YAAY,KAAa,KAAa,QAAuB,SAAS,OAAO;AAC5F,MAAI,QAAQ;AACX,QAAI,MAAM,KAAK;AACd,aAAO,QAAQ;AACf,aAAO,SAAS;AAAA,IACjB,OAAO;AACN,aAAO,QAAQ;AACf,aAAO,SAAS;AAAA,IACjB;AAAA,EACD,OAAO;AACN,QAAI,MAAM,KAAK;AACd,aAAO,QAAQ;AACf,aAAO,SAAS;AAAA,IACjB,OAAO;AACN,aAAO,QAAQ;AACf,aAAO,SAAS;AAAA,IACjB;AAAA,EACD;AACD;AAEO,SAAS,kBAAkB,SAAiB,SAAiB,SAA8B;AACjG,SAAO,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM;AAC5G;AACO,SAAS,2BAA2B,SAAiB,SAAiB,SAA8B;AAC1G,SAAO,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,MAAM;AAC5G;;;;;;;;;;;;;;;;;AC1GO,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,wBAAwB;AAC9B,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;ACLuC;AACnC;AAC6C;AAC7C;AAEnC,MAAM,QAAQ,IAAI,0CAAO,CAAC,GAAG,GAAG,CAAC;AACjC,MAAM,YAAY,IAAI,0CAAO,CAAC,GAAG,GAAG,CAAC;AACrC,MAAM,SAAS,IAAI,0CAAO,CAAC,GAAG,GAAG,CAAC;AAC3B,SAAS,+BAA+B;AAC9C,QAAM,SAAS,kHAAgC,CAAC;AAAA,IAC/C,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AACD,SAAO,OAAO,iEAAa;AAC3B,SAAO;AACR;AAEA,MAAM,QAAQ;AACP,SAAS,+BAA+B;AAC9C,QAAM,WAAW,IAAI,8CAAW,CAAC,OAAO,OAAO,KAAK;AACpD,QAAM,WAAW,IAAI,oDAAiB,CAAC,EAAC,OAAO,SAAQ,CAAC;AACxD,QAAM,OAAO,IAAI,uCAAI,CAAC,UAAU,QAAQ;AACxC,OAAK,OAAO,iEAAa;AACzB,SAAO;AACR;AACO,SAAS,oCAAoC;AACnD,QAAM,WAAW,IAAI,8CAAW,CAAC,OAAO,OAAO,KAAK;AACpD,QAAM,WAAW,IAAI,oDAAiB,CAAC,EAAC,OAAO,SAAQ,CAAC;AACxD,QAAM,OAAO,IAAI,uCAAI,CAAC,UAAU,QAAQ;AACxC,OAAK,OAAO,sEAAkB;AAC9B,SAAO;AACR;AACO,SAAS,6BAA6B,QAAkB;AAC9D,gGAA8B,CAAC,QAAQ,iEAAa;AACpD,SAAO,OAAO,iEAAa;AAC3B,oGAAgC,CAAC,QAAQ,KAAK,kEAAe;AAC7D,oGAAgC,CAAC,QAAQ,KAAK,kEAAe;AAC7D,oGAAgC,CAAC,QAAQ,KAAK,kEAAe;AAC7D,oGAAgC,CAAC,QAAQ,KAAK,kEAAe;AAC7D,oGAAgC,CAAC,QAAQ,KAAK,kEAAe;AAC7D,oGAAgC,CAAC,QAAQ,KAAK,kEAAe;AAE7D,SAAO;AACR;AACO,SAAS,6BAA6B,QAAkB;AAC9D,0GAAmC,CAAC,QAAQ,IAAI;AAChD,SAAO,OAAO,iEAAa;AAC3B,SAAO;AACR;AACO,SAAS,kCAAkC,QAAkB;AACnE,oHAAwC,CAAC,QAAQ,IAAI;AACrD,SAAO,OAAO,sEAAkB;AAChC,SAAO;AACR;;;;;;;;;;;;;;;;ACvD8B;AAEK;AAG5B,SAAS,gBAAgB,QAAuC;AACtE,QAAM,MAAM,wFAA2B,CAAC,MAAM;AAC9C,QAAM,MAAM,wFAA2B,CAAC,MAAM;AAC9C,QAAM,QAAQ,4FAA6B,CAAC,MAAM;AAClD,QAAM,QAAQ,4FAA6B,CAAC,MAAM;AAClD,SAAO,OAAO,UAAa,OAAO,UAAa,SAAS,UAAa,SAAS;AAC/E;AACO,SAAS,kBAAkB,QAAgD;AACjF,QAAM,aAAsB;AAAA,IAC3B,KAAK,wFAA2B,CAAC,MAAM;AAAA,IACvC,KAAK,wFAA2B,CAAC,MAAM;AAAA,IACvC,OAAO,4FAA6B,CAAC,MAAM;AAAA,IAC3C,OAAO,4FAA6B,CAAC,MAAM;AAAA,EAC5C;AACA,SAAO;AACR;AACO,SAAS,iBAAiB,MAAyB;AACzD,QAAM,QAAQ,IAAI,wCAAK,CAAC;AAExB,0FAA2B,CAAC,OAAO,KAAK,GAAG;AAC3C,0FAA2B,CAAC,OAAO,KAAK,GAAG;AAC3C,8FAA6B,CAAC,OAAO,KAAK,KAAK;AAC/C,8FAA6B,CAAC,OAAO,KAAK,KAAK;AAC/C,SAAO;AACR;;;;;;;;;;;;;;;;;AC5BgD;AAMzC,MAAM,yBAAqC,EAAC,QAAQ,sEAAkB,EAAE,UAAU,EAAC;AACnF,MAAM,sBAAkC,EAAC,QAAQ,iEAAa,EAAE,UAAU,EAAC;AAElF,MAAM,gCAAgC;AACtC,MAAM,yBAAyB;AACxB,SAAS,mBAAmB,YAAgC;AAClE,SAAO,GAAG,WAAW,SAAS,gCAAgC,WAAW;AAC1E;AACO,SAAS,oBAAoB,aAAmC;AACtE,SAAO,YAAY,IAAI,kBAAkB,EAAE,KAAK,sBAAsB;AACvE;AACO,SAAS,oBAAoB,mBAAyC;AAC5E,QAAM,qBAAqB,kBAAkB,MAAM,sBAAsB;AACzE,SAAO,mBAAmB,IAAI,CAAC,qBAAqB;AACnD,UAAMC,sBAAqB,iBAAiB,MAAM,6BAA6B;AAC/E,WAAO;AAAA,MACN,QAAQA,oBAAmB,CAAC;AAAA,MAC5B,UAAU,SAASA,oBAAmB,CAAC,CAAC;AAAA,IACzC;AAAA,EACD,CAAC;AACF;;;;;;;;;;;;;;;;;AC1BmC;AACuC;AACI;AAC7B;AACE;AAGnD,MAAM,iBAAgC;AAAA,EACrC,OAAO;AAAA,EACP,QAAQ;AACT;AAKA,SAAS,SAAS,MAAe,eAA8B,QAAiB;AAC/E,mEAAW,CAAC,KAAK,KAAK,KAAK,KAAK,gBAAgB,MAAM;AACtD,MAAI,YAAY,cAAc,IAAI,eAAe,KAAK;AACtD,MAAI,CAAC,WAAW;AACf,gBAAY,oBAAI,IAAI;AACpB,kBAAc,IAAI,eAAe,OAAO,SAAS;AAAA,EAClD;AACA,MAAI,QAAQ,UAAU,IAAI,eAAe,MAAM;AAC/C,MAAI,CAAC,OAAO;AACX,YAAQ,oBAAI,IAAI;AAChB,cAAU,IAAI,eAAe,QAAQ,KAAK;AAAA,EAC3C;AACA,MAAI,WAAW,KAAK,OAAO,eAAe;AAC1C,QAAM,SAAS,WAAW,KAAK,QAAQ,KAAK;AAC5C,QAAM,SAAS,WAAW,KAAK,QAAQ,KAAK;AAC5C,QAAM,SAAS,OAAO,MAAM,EAAE;AAC9B,QAAM,SAAS,OAAO,MAAM,EAAE;AAC9B,aAAW,SAAS,QAAQ;AAC3B,eAAW,SAAS,QAAQ;AAC3B,UAAIC,UAAS,MAAM,IAAI,KAAK;AAC5B,UAAI,CAACA,SAAQ;AACZ,QAAAA,UAAS,oBAAI,IAAI;AACjB,cAAM,IAAI,OAAOA,OAAM;AAAA,MACxB;AACA,UAAI,CAACA,QAAO,IAAI,KAAK,GAAG;AACvB,QAAAA,QAAO,IAAI,KAAK;AAAA,MACjB;AAAA,IACD;AAAA,EACD;AACD;AAIO,MAAM,mBAAmB;AAAA;AAAA,EAS/B,YAAY,SAAoC;AANhD,SAAQ,iBAAgC,oBAAI,IAAI;AAO/C,SAAK,mBACJ,QAAQ,mBAAmB,KAAK,CAAC,MAAM,wGAAmC,CAAC,CAAC,CAAC,KAC7E,4FAA4B,CAAC;AAC9B,SAAK,wBACJ,QAAQ,mBAAmB,KAAK,CAAC,MAAM,kHAAwC,CAAC,CAAC,CAAC,KAClF,iGAAiC,CAAC;AACnC,SAAK,SAAS,sEAAiB,CAAC,QAAQ,kBAAkB;AAC1D,SAAK,aAAa,oBAAI,IAAI;AAC1B,eAAW,QAAQ,KAAK,QAAQ;AAC/B,WAAK,WAAW,IAAI,8FAA8B,CAAC,IAAI,GAAG,IAAI;AAAA,IAC/D;AAGA,UAAM,cAAc,sEAAiB,CAAC,QAAQ,kBAAkB;AAChE,UAAM,QAAQ,YAAY,OAAO,+DAAe,EAAE,IAAI,iEAAiB;AACvE,eAAW,QAAQ,OAAO;AACzB,uEAAW,CAAC,KAAK,KAAK,KAAK,KAAK,cAAc;AAC9C,eAAS,MAAM,KAAK,gBAAgB,KAAK;AACzC,eAAS,MAAM,KAAK,gBAAgB,IAAI;AAAA,IACzC;AAAA,EACD;AAAA,EACA,QAAQ;AACP,WAAO,KAAK;AAAA,EACb;AAAA,EACA,KAAK,QAAgB;AACpB,WAAO,KAAK,WAAW,IAAI,MAAM;AAAA,EAClC;AAAA,EACA,YAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA,EACA,iBAAiB;AAChB,WAAO,KAAK;AAAA,EACb;AAAA,EACA,cAAc,KAAa,KAAa,UAAuC;AAC9E,qEAAW,CAAC,KAAK,KAAK,cAAc;AACpC,UAAM,cAAc,KAAK,eAAe,IAAI,eAAe,KAAK;AAChE,QAAI,CAAC,aAAa;AACjB;AAAA,IACD;AACA,UAAM,QAAQ,YAAY,IAAI,eAAe,MAAM;AACnD,QAAI,CAAC,OAAO;AACX;AAAA,IACD;AACA,UAAM,QAAQ,CAAC,QAAQ,UAAU;AAChC,aAAO,QAAQ,CAAC,UAAU;AACzB,iBAAS,eAAe,OAAO,eAAe,QAAQ,OAAO,KAAK;AAAA,MACnE,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAAA,EACA,yBAAyB,IAAY,UAAkD;AACtF,UAAM,cAAc,KAAK,eAAe,IAAI,EAAE;AAC9C,QAAI,CAAC,aAAa;AACjB,eAAS,2DAAS;AAClB;AAAA,IACD;AACA,UAAM,mBAAmB,CAAC,GAAG,2DAAS;AACtC,gBAAY,QAAQ,CAAC,OAAO,QAAQ;AACnC,YAAM,QAAQ,CAAC,QAAQ,UAAU;AAChC,cAAM,QAAQ,iBAAiB,QAAQ,KAAK;AAC5C,YAAI,QAAQ,IAAI;AACf,2BAAiB,OAAO,OAAO,CAAC;AAAA,QACjC;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AACD,aAAS,gBAAgB;AAAA,EAC1B;AAAA,EACA,kBAAkB,KAAa,OAAoB,KAAa,OAA6B;AAE5F,qEAAW,CAAC,KAAK,KAAK,cAAc;AACpC,UAAM,cAAc,KAAK,eAAe,IAAI,eAAe,KAAK;AAChE,QAAI,CAAC,aAAa;AACjB,aAAO;AAAA,IACR;AACA,UAAM,QAAQ,YAAY,IAAI,eAAe,MAAM;AACnD,QAAI,CAAC,OAAO;AACX,aAAO;AAAA,IACR;AACA,QAAI,WAAW,OAAO,eAAe;AACrC,UAAM,MAAM,WAAW,QAAQ;AAC/B,UAAM,QAAQ,WAAW,QAAQ;AACjC,UAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,QAAI,CAAC,QAAQ;AACZ,aAAO;AAAA,IACR;AAEA,WAAO,OAAO,IAAI,KAAK;AAAA,EACxB;AACD;;;;;;;;;;;;;;;;;;;AClJwD;AAE5B;AAC+C;AAEpE,SAAS,kBAAkB,SAA0C;AAC3E,SAAO,QAAQ,OAAO,CAAC,WAAW,8FAA8B,CAAC,MAAM,CAAC,EAAE,OAAO,yEAAU;AAC5F;AACO,SAAS,kBAAkB,SAA0C;AAC3E,SAAO,QAAQ,OAAO,CAAC,WAAW,0GAAoC,CAAC,MAAM,CAAC;AAC/E;AAEO,SAAS,uBAAuB,YAAwB,OAAwB;AACtF,QAAM,2BAA2B,kHAA0B,CAAC,YAAY,kGAA8B;AACtG,MAAI,CAAC,0BAA0B;AAG9B,WAAO;AAAA,EACR;AAEA,QAAM,eAAoC,gHAAyB;AAAX,IACvD;AAAA,IACA;AAAA,IACA,kGAA8B;AAAb,EAClB;AACA,MAAI,gBAAgB,MAAM;AACzB,WAAO;AAAA,EACR;AACA,SAAO;AACR;AACO,SAAS,wBAAwB,YAAwB,OAAuB;AACtF,QAAM,aAAa,gHAAyB,CAAC,YAAY,OAAO,8FAA4B;AAC5F,MAAI,cAAc,MAAM;AACvB,WAAO;AAAA,EACR;AACA,SAAO;AACR;AACO,SAAS,OAAO,YAAwB,OAAuB;AACrE,QAAMC,UAAS,gHAAyB,CAAC,YAAY,OAAO,sFAAwB;AACpF,MAAIA,WAAU,MAAM;AACnB,WAAO;AAAA,EACR;AACA,SAAOA;AACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCO;AAEqC;AAY5C,MAAM,kBAA0C;AAAA;AAAA;AAAA;AAIhD;AAEA,IAAK,eAAL,kBAAKC,kBAAL;AACC,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,wBAAqB;AACrB,EAAAA,cAAA,yBAAsB;AAJlB,SAAAA;AAAA;AAML,IAAI,iBAAyB;AAEtB,MAAM,uBAAN,MAA0B;AAAA,EAahC,YAA4B,MAAkB;AAAlB;AAT5B;AAAA;AAAA,SAAQ,cAAc;AACtB,SAAQ,iBAA0B;AAKlC;AAAA;AAAA,SAAQ,wBAAuE,oBAAI,IAAI;AACvF,SAAQ,2BAA2B,oBAAI,IAAsC;AAAA,EAE9B;AAAA,EAE/C,UAAU;AACT,SAAK,sBAAsB,MAAM;AACjC,SAAK,yBAAyB,QAAQ,CAAC,aAAa;AACnD,eAAS,QAAQ;AAAA,IAClB,CAAC;AACD,SAAK,yBAAyB,MAAM;AAAA,EACrC;AAAA,EAEA,cAAc,QAAiB,MAAM;AACpC,SAAK,cAAc;AAAA,EACpB;AAAA,EACA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,kBAAkB,SAAc;AAC/B,QAAI,CAAC,KAAK,aAAa;AACtB;AAAA,IACD;AACA,YAAQ,KAAK,gBAAgB,OAAO;AAAA,EACrC;AAAA,EAEA,mBAAmB;AAClB,QAAI,CAAC,KAAK,gBAAgB;AACzB,WAAK,iBAAiB;AAAA,IACvB;AAAA,EACD;AAAA,EACA,gBAAgB,QAA4B;AAC3C,QAAI,KAAK,sBAAsB,QAAW;AACzC,WAAK,oBAAoB,KAAK,oBAAoB,MAAM;AAAA,IACzD;AACA,WAAO,KAAK;AAAA,EACb;AAAA,EACQ,oBAAoB,QAA4B;AACvD,aAAS,UAAU,KAAK,KAAK,eAAe,YAAY;AACxD,YAAQ,WAAW,0BAA0B,OAAO,WAAW,qBAAmB,MAAM;AAAA,EACzF;AAAA,EACA,8BAA8B,QAA2B;AACxD,QAAI,WAAW,KAAK,yBAAyB,IAAI,MAAM;AACvD,QAAI,CAAC,UAAU;AACd,YAAM,UAAU,KAAK,oBAAoB,MAAM;AAC/C,iBAAW,KAAK,oBAAoB,iCAAI,4CAA6B,GAAjC,EAAmC,QAAQ,QAAO,EAAC;AACvF,WAAK,yBAAyB,IAAI,QAAQ,QAAQ;AAAA,IACnD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAoB,QAAiC;AACpD,UAAM,WAAW,IAAI,0BAAa,CAAC,MAAM;AACzC,QAAI,OAAO,UAAU,QAAQ,OAAO,kBAAkB,mBAAmB;AACxE,WAAK,KAAK,eAAe,eAAe,OAAO,QAAQ,QAAQ;AAAA,IAChE,OAAO;AACN,cAAQ,KAAK,yBAAyB;AACtC,cAAQ,IAAI,OAAO,MAAM;AAAA,IAC1B;AASA,SAAK,mBAAmB,QAAQ;AAEhC,SAAK,kBAAkB,CAAC,oBAAoB,MAAM,CAAC;AACnD,WAAO;AAAA,EACR;AAAA,EAEA,mBAAmB,UAA4B;AAC9C,QAAK,SAAkC,cAAc,MAAM;AAE1D;AAAA,IACD;AAEA,UAAM,SAAU,kBAAkB;AAClC,IAAC,SAAkC,aAAa;AAAA,EACjD;AAAA,EACA,WAAW,UAA4B;AACtC,UAAM,KAAM,SAAkC;AAE9C,QAAI,MAAM,MAAM;AACf,cAAQ,MAAM,4BAA4B;AAC1C;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,QAAyD;AAC5E,QAAI,KAAwC,KAAK,sBAAsB,IAAI,MAAM;AACjF,QAAI,IAAI;AACP,aAAO;AAAA,IACR;AAEA,SAAK,KAAK,0BAA0B,QAAQ,IAAI;AAChD,QAAI,CAAC,IAAI;AACR,cAAQ,KAAK,iCAAiC;AAAA,IAC/C;AAEA,QAAI,CAAC,IAAI;AACR,WAAK,KAAK,0BAA0B,QAAQ,KAAK;AAAA,IAClD;AAEA,QAAI,CAAC,IAAI;AACR,cAAQ,MAAM,gCAAgC;AAC9C,aAAO;AAAA,IACR;AAEA,QAAK,GAAqB,uBAAuB,MAAM;AACtD,MAAC,GAAqB,sBAAsB,qBAAoB;AAAA,IACjE;AACA,SAAK,sBAAsB,IAAI,QAAQ,EAAE;AAOzC,WAAO;AAAA,EACR;AAAA,EACQ,0BAA0B,QAA2B,QAAoD;AAChH,QAAI;AACJ,QAAI,KAAK,gBAAgB,MAAM,GAAG;AACjC,oBAAc;AAAA,IACf,OAAO;AACN,oBAAc,SAAS,wBAAsB;AAAA,IAC9C;AACA,QAAI,KAAK,OAAO,WAAW,aAAa,eAAe;AACvD,QAAI,IAAI;AACP,WAAK,kBAAkB,sBAAsB,cAAc;AAAA,IAC5D,OAAO;AACN,oBAAc,SAAS,kDAAmC;AAC1D,WAAK,kBAAkB,sBAAsB,cAAc;AAC3D,WAAK,OAAO,WAAW,aAAa,eAAe;AAAA,IACpD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,mBAAmB,OAAe,QAAgB,YAAiC;AAClF,QAAI,KAAK,gBAAgB,GAAG;AAC3B,YAAM,0BAA0B,IAAI,8BAAiB,CAAC,OAAO,QAAQ,UAAU;AAC/E,8BAAwB,UAAU;AAClC,aAAO;AAAA,IACR,OAAO;AACN,aAAO,IAAI,8BAAiB,CAAC,OAAO,QAAQ,UAAU;AAAA,IACvD;AAAA,EACD;AAAA,EAQA,iBAAiB;AAChB,WAAQ,KAAK,kBAAkB,KAAK,mBAAmB,KAAK,sBAAsB;AAAA,EACnF;AAAA,EACQ,wBAAwB;AAC/B,UAAM,SAAS,KAAK,KAAK,eAAe,mBAAmB;AAC3D,UAAM,KAAK,KAAK,oBAAoB,MAAM;AAC1C,QAAI,CAAC,IAAI;AACR;AAAA,IACD;AACA,UAAM,WAAW,KAAK,oBAAoB;AAAA;AAAA;AAAA;AAAA,MAIzC,OAAO;AAAA,MACP,oBAAoB;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,IACV,CAAC;AACD,SAAK,KAAK,eAAe,eAAe,QAAQ,QAAQ;AACxD,aAAS,mBAAmB,yBAAY;AACxC,aAAS,cAAc,0BAAa;AACpC,WAAO;AAAA,EACR;AACD;AAvMO,IAAM,sBAAN;AAAM,oBACG,mBAAmB;;;;AC9B5B,MAAM,mBAAmB;AAAA,EAE/B,YAA4B,MAAkB;AAAlB;AAD5B,SAAQ,oBAAmE,oBAAI,IAAI;AAAA,EACpC;AAAA,EAE/C,qBAAqB;AACpB,UAAM,SAAS,KAAK,qBAAqB,KAAK,KAAK,cAAc;AACjE,WAAO;AAAA,EACR;AAAA,EACQ,uBAAuB;AAC9B,QAAI;AACJ,SAAK,kBAAkB,QAAQ,CAAC,UAAU,WAAW;AACpD,UAAI,eAAe,QAAQ,YAAY,MAAM;AAC5C,sBAAc;AAAA,MACf;AAAA,IACD,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EACQ,gBAAgB;AACvB,WAAO,SAAS,cAAc,QAAQ;AAAA,EACvC;AAAA,EACA,eAAe,QAAyB,UAA4B;AACnE,SAAK,kBAAkB,IAAI,QAAQ,QAAQ;AAAA,EAC5C;AAAA,EACA,iBAAiB,QAAyB;AACzC,SAAK,kBAAkB,IAAI,QAAQ,IAAI;AAAA,EACxC;AAAA,EAGA,cAAc;AACb,WAAO,KAAK,iBAAiB,KAAK,eAAe,SAAS,cAAc,QAAQ;AAAA,EACjF;AACD;;;;ACrCO,MAAM,mBAAmB;AAAA,EAAzB;AACN,SAAQ,cAAsB;AAC9B,SAAQ,QAAuB;AAwB/B;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,YAA2B;AASnC;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,aAA4B;AAYpC;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,iBAAgC;AAYxC;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,cAA6B;AAYrC;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,YAA2B;AASnC;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,gBAA+B;AAAA;AAAA,EA5EvC,OAAO;AACN,QAAI,KAAK,OAAO;AACf,UAAI,KAAK,YAAY,SAAS,GAAG;AAEhC,cAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,EAAE;AAC3C,eAAO,GAAG,KAAK,cAAc;AAAA,MAC9B,OAAO;AACN,eAAO,KAAK;AAAA,MACb;AAAA,IACD;AAAA,EACD;AAAA,EACA,QAAQ,KAAoB;AAC3B,SAAK,QAAQ;AAAA,EACd;AAAA,EACA,cAAc,QAAgB;AAC7B,SAAK,cAAc;AAAA,EACpB;AAAA,EAOA,WAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB;AACf,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EAOA,WAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAOA,eAAe;AACd,WAAO,KAAK;AAAA,EACb;AACD;;;;;;;;;;;;;;;;;;;;;;;;ACtDO,MAAM,gBAAgB;AAAA,EAC5B,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEvC,YAAY;AACX,WAAO,CAAC,KAAK,KAAK,WAAW;AAAA,EAC9B;AAAA,EAEA,QAAQ;AAAA,EAAC;AAAA,EACT,kBAAkB,MAAoB;AAAA,EAAC;AAAA,EAEjC,eAAe,MAAY,UAAkB;AAAA;AAAA,IAAC;AAAA;AAAA,EAE9C,gBAAgB,KAAgD;AAAA;AAAA,IAAC;AAAA;AAAA,EAEvE,SAAS,UAA4B;AAAA,EAAC;AACvC;;;;AC3CO,MAAM,oBAAoB;AAAA,EAGhC,OAAO,KAA6B;AACnC,SAAK,OAAO;AAAA,EACb;AAAA,EAEA,WAAW,KAAa;AACvB,QAAI,CAAC,KAAK,MAAM;AACf;AAAA,IACD;AACA,UAAM,WAAW,IAAI,MAAM,GAAG;AAC9B,UAAM,WAAW,SAAS,CAAC;AAC3B,UAAM,QAAQ,SAAS,CAAC;AACxB,UAAM,aAAa,KAAK,KAAK,QAAQ;AACrC,QAAI,YAAY;AACf,UAAI,OAAO;AACV,eAAO,GAAG,cAAc;AAAA,MACzB,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AACD;;;;ACrBO,MAAM,kCAAkC;AAAA,EAE9C,sBAAsB,GAAuB;AAC5C,SAAK,sBAAsB;AAAA,EAC5B;AAAA,EACA,qBAAyC;AACxC,WAAO,KAAK,uBAAuB,WAAW;AAAA,EAC/C;AACD;;;;ACVO,MAAM,eAAe;AAAA,EAArB;AAEN,SAAQ,UAA0B,oBAAI,IAAI;AAC1C,SAAQ,uBAA+C,oBAAI,IAAI;AAAA;AAAA,EAE/D,cAAc,OAAkB;AAC/B,QAAI,KAAK,QAAQ,IAAI,KAAK,GAAG;AAC5B,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACD;AAEA,SAAK,QAAQ,IAAI,KAAK;AACtB,SAAK,qBAAqB,IAAI,OAAO,YAAY,IAAI,CAAC;AACtD,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,gBAAgB,OAAkB;AACjC,SAAK,QAAQ,OAAO,KAAK;AACzB,SAAK,qBAAqB,OAAO,KAAK;AACtC,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,UAAU;AACT,UAAM,SAAS,KAAK,OAAO;AAC3B,eAAW,SAAS,QAAQ;AAC3B,YAAM,QAAQ;AAAA,IACf;AAAA,EACD;AAAA,EACA,sBAAsB;AACrB,WAAO,KAAK;AAAA,EACb;AAAA,EACA,SAAS;AACR,UAAM,SAAsB,CAAC;AAC7B,SAAK,QAAQ,QAAQ,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AAClD,WAAO;AAAA,EACR;AAAA,EAEQ,eAAe;AACtB,SAAK,uBAAuB;AAC5B,SAAK,qBAAqB,QAAQ,CAAC,cAAc,UAAU;AAC1D,UAAI,KAAK,wBAAwB,QAAW;AAC3C,aAAK,uBAAuB;AAAA,MAC7B,OAAO;AACN,cAAM,mBAAmB,KAAK,qBAAqB,IAAI,KAAK,oBAAoB;AAChF,YAAI,gBAAgB,QAAQ,oBAAoB,MAAM;AACrD,cAAI,eAAe,kBAAkB;AACpC,iBAAK,uBAAuB;AAAA,UAC7B;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;;;;ACnCO,MAAM,6BAA6B;AAAA,EAAnC;AAEN,SAAQ,cAAmD;AAAA;AAAA,EAC3D,UAAU,QAA8B;AACvC,SAAK,UAAU;AAAA,EAChB;AAAA,EACA,WAAW,MAAc,OAA8B;AACtD,QAAI,KAAK,SAAS;AACjB,aAAO,KAAK,QAAQ,WAAW,MAAM,KAAK;AAAA,IAC3C;AAAA,EACD;AAAA,EACA,eAAe;AA5BhB;AA6BE,aAAO,UAAK,YAAL,mBAAc,SAAS,UAAS,CAAC,EAAE;AAAA,EAC3C;AAAA,EACA,SAAS;AACR,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,gBAAyB;AACxB,WAAO,KAAK,WAAW;AAAA,EACxB;AAAA,EAEA,iBAAiB,SAA8C;AAC9D,QAAI,CAAC,KAAK,SAAS;AAClB;AAAA,IACD;AACA,UAAM,aAAa,KAAK,QAAQ,iBAAiB,OAAO;AACxD,SAAK,cAAc;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AACD;;;;ACnD6C;AACF;AAEpC,MAAM,yBAAyB;AAAA,EAGrC,iBAAiB;AAChB,WAAQ,KAAK,kBAAkB,KAAK,mBAAmB,IAAI,4BAA4B,CAAC;AAAA,EACzF;AAAA,EAGA,SAAS;AACR,WAAQ,KAAK,UAAU,KAAK,WAAW,IAAI,4CAA8B,CAAC;AAAA,EAC3E;AACD;;;;;;ACTO,MAAM,kCAAkC;AAAA,EAAxC;AACN,SAAQ,OAAmB,oBAAI,IAAI;AAAA;AAAA,EAEnC,aAAa,MAAoB,MAAY;AAC5C,SAAK,KAAK,IAAI,MAAM,IAAI;AACxB,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,eAAe,MAAoB;AAClC,SAAK,KAAK,OAAO,IAAI;AACrB,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,WAAW;AACV,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,OAAO;AACX;AAAA,IACD;AACA,aAAS,QAAQ,OAAO;AACvB,WAAK;AAAA,IACN;AAAA,EACD;AAAA,EACA,cAAc;AACb,WAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,EACnC;AAAA,EACQ,eAAe;AACtB,QAAI,KAAK,KAAK,QAAQ,GAAG;AACxB,WAAK,SAAS;AAAA,IACf,OAAO;AACN,WAAK,SAAS,KAAK,UAAU,CAAC;AAC9B,WAAK,OAAO,SAAS;AACrB,YAAM,QAAQ,KAAK;AACnB,WAAK,KAAK,QAAQ,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IAC7C;AAAA,EACD;AACD;;;;AChBO,MAAM,kCAAkC;AAAA,EAAxC;AACN,SAAQ,OAAmB,oBAAI,IAAI;AAAA;AAAA,EAEnC,aAAa,UAAkB,MAA+B;AAC7D,SAAK,KAAK,IAAI,UAAU,IAAI;AAC5B,SAAK,aAAa;AAAA,EACnB;AAAA,EACQ,eAAe;AACtB,SAAK,SAAS,CAAC;AACf,UAAM,QAAQ,KAAK;AACnB,SAAK,KAAK,QAAQ,CAAC,SAAS;AAC3B,YAAM,KAAK,IAAI;AAAA,IAChB,CAAC;AAAA,EACF;AAAA,EACA,SAAS,aAA8B,WAAsB,YAAwB,QAAyB;AAC7G,QAAI,yBAAyB;AAC7B,QAAI,KAAK,QAAQ;AAChB,eAAS,QAAQ,KAAK,QAAQ;AAC7B,cAAM,0BAA0B,KAAK,aAAa,WAAW,YAAY,MAAM;AAC/E,YAAI,yBAAyB;AAC5B,mCAAyB;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACD;;;;AChCO,MAAM,WAAW;AAAA,EACvB,YACW,OACA,WACA,UACT;AAHS;AACA;AACA;AAAA,EACR;AAAA,EAEH,OAAO;AACN,WAAO,KAAK;AAAA,EACb;AAAA,EACA,cAAc;AACb,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAEA,KAAK,MAAkB;AACtB,SAAK,UAAU,IAAI;AAAA,EACpB;AAAA,EAEA,SAAyB;AACxB,WAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,aAAa,KAAK,SAAS;AAAA,MAC3B,mBAAmB,KAAK,SAAS;AAAA,IAClC;AAAA,EACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;ACxC8D;AAYvD,MAAM,gBAAgB;AAAA,EAS5B,YAAoB,MAAkB;AAAlB;AAJpB,SAAQ,iBAAmD,oBAAI,IAAI;AACnE,SAAQ,iCAAwE,oBAAI,IAAI;AACxF,SAAQ,sCAA6E,oBAAI,IAAI;AAAA,EAEtD;AAAA,EAEjC,uBAAuB,UAA0C;AAAA;AACtE,WAAK,4BACJ,KAAK,6BACL,IAAI,UAAU,CAAC,sBAAsB,MAAM;AAAA,MAAC,GAAG,EAAC,mBAAmB,iBAAiB,aAAa,GAAE,CAAC;AAErG,WAAK,iBAAiB,KAAK;AAC3B,WAAK,eAAe,IAAI,KAAK,eAAe,KAAK,GAAG,KAAK,cAAc;AACvE,YAAM,SAAS;AACf,WAAK,iBAAiB;AAAA,IACvB;AAAA;AAAA,EAEA,SAAS,QAA6B;AACrC,UAAM,wBAAwB,KAAK;AACnC,SAAK,iBAAiB;AACtB,SAAK,eAAe,IAAI,OAAO,KAAK,GAAG,MAAM;AAC7C,WAAO,KAAK,KAAK,IAAI;AACrB,SAAK,iBAAiB;AAAA,EACvB;AAAA,EACA,aAAa,YAAoB;AAChC,WAAO,KAAK,eAAe,IAAI,UAAU;AAAA,EAC1C;AAAA,EAEA,aAAa,MAA2B;AACvC,QAAI,CAAC,KAAK,gBAAgB;AACzB;AAAA,IACD;AACA,UAAM,UAAU,KAAK,QAAQ;AAC7B,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,gBAAgB,KAAK,+BAA+B,IAAI,OAAO;AACnE,QAAI,CAAC,eAAe;AACnB,sBAAgB,oBAAI,IAAI;AACxB,WAAK,+BAA+B,IAAI,SAAS,aAAa;AAAA,IAC/D;AACA,kBAAc,IAAI,MAAM,KAAK,eAAe,KAAK,CAAC;AAAA,EACnD;AAAA,EACA,kBAAkB,WAAqC;AACtD,QAAI,CAAC,KAAK,gBAAgB;AACzB;AAAA,IACD;AACA,UAAM,UAAU,UAAU,QAAQ;AAClC,UAAM,OAAO,UAAU,KAAK;AAC5B,QAAI,gBAAgB,KAAK,oCAAoC,IAAI,OAAO;AACxE,QAAI,CAAC,eAAe;AACnB,sBAAgB,oBAAI,IAAI;AACxB,WAAK,oCAAoC,IAAI,SAAS,aAAa;AAAA,IACpE;AACA,kBAAc,IAAI,MAAM,KAAK,eAAe,KAAK,CAAC;AAAA,EACnD;AAAA,EAEA,SAAS;AACR,UAAM,OAA4B;AAAA,MACjC,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,YAAY,CAAC;AAAA,IACd;AAEA,SAAK,eAAe,QAAQ,CAAC,QAAQ,SAAS;AAC7C,WAAK,QAAQ,IAAI,IAAI,OAAO,OAAO;AAAA,IACpC,CAAC;AAED,SAAK,+BAA+B,QAAQ,CAAC,eAAe,YAAY;AACvE,WAAK,MAAM,OAAO,IAAI,CAAC;AACvB,oBAAc,QAAQ,CAAC,YAAY,SAAS;AAC3C,aAAK,MAAM,OAAO,EAAE,IAAI,IAAI;AAAA,MAC7B,CAAC;AAAA,IACF,CAAC;AACD,SAAK,oCAAoC,QAAQ,CAAC,eAAe,YAAY;AAC5E,WAAK,WAAW,OAAO,IAAI,CAAC;AAC5B,oBAAc,QAAQ,CAAC,YAAY,SAAS;AAC3C,aAAK,WAAW,OAAO,EAAE,IAAI,IAAI;AAAA,MAClC,CAAC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACR;AACD;;;;ACpFO,MAAM,oBAAoB;AAAA,EAIhC,YAAY,MAAkB;AAH9B,SAAQ,mBAA6B,CAAC;AACtC,SAAQ,0CAA4F,oBAAI,IAAI;AAAA,EAE7E;AAAA,EAE/B,iBAAiB,UAAkB;AAClC,QAAI,CAAC,KAAK,iBAAiB,SAAS,QAAQ,GAAG;AAC9C,WAAK,iBAAiB,KAAK,QAAQ;AAAA,IACpC;AAAA,EACD;AAAA,EACA,sBAAsB;AACrB,WAAO,KAAK;AAAA,EACb;AAAA,EACA,SAA2B,aAAkB,sBAA+C;AAC3F,SAAK,wCAAwC,IAAI,aAAa,oBAA2B;AAAA,EAC1F;AAAA,EACA,aAA+B,SAAmC;AACjE,UAAM,WAAW,KAAK,wCAAwC,IAAI,QAAQ,OAAO,WAA4B;AAC7G,QAAI,CAAC,UAAU;AACd,cAAQ,MAAM,oCAAoC;AAClD,cAAQ;AAAA,QACP;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,KAAK;AAAA,MACN;AACA;AAAA,IACD;AACA,WAAO,SAAS,OAAO;AAAA,EACxB;AAAA,EACA,iBAAiB,QAAkB;AAClC,UAAM,WAAW,KAAK,wCAAwC,IAAI,OAAO,WAA4B;AACrG,WAAO,YAAY;AAAA,EACpB;AACD;;;;AC3CO,MAAM,oBAAoB;AAAA,EAEhC,YAAoB,MAAkB;AAAlB;AADpB,SAAQ,gBAAsC,oBAAI,IAAI;AAAA,EACf;AAAA,EACvC,SAA+B,YAAe,QAAuB,SAAiC;AACrG,QAAI,gBAAgB,mCAAS;AAC7B,QAAI,iBAAiB,MAAM;AAC1B,sBAAgB;AAAA,IACjB;AAEA,QAAI,KAAK,cAAc,IAAI,UAAU,KAAK,eAAe;AACxD,cAAQ,KAAK,6BAA6B,UAAU;AACpD;AAAA,IACD;AACA,SAAK,cAAc,IAAI,YAAY,MAAM;AACzC,WAAO,WAAW,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,cAAc;AACb,UAAM,OAAqB,CAAC;AAC5B,SAAK,cAAc,QAAQ,CAAC,QAAQ,eAAe;AAClD,WAAK,KAAK,UAAU;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,EACR;AACD;;;;AC9BkC;AAE3B,MAAM,+BAA+B,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAIhE;;;;ACJO,MAAM,uBAAuB;AAAA,EAA7B;AACN,SAAQ,gBAAkC,CAAC;AAC3C,SAAQ,iBAAyD,oBAAI,IAAI;AAAA;AAAA,EAEzE,SAAS,YAA+B,MAAsB;AAC7D,SAAK,cAAc,KAAK,IAAI;AAC5B,SAAK,eAAe,IAAI,MAAM,UAAU;AAAA,EACzC;AAAA,EACA,UAAU,MAAsB;AAC/B,WAAO,KAAK,eAAe,IAAI,IAAI;AAAA,EACpC;AAAA,EACA,mBAAqC;AACpC,WAAO,KAAK;AAAA,EACb;AACD;;;;ACjBqC;AAG9B,MAAM,2BAA2B,sBAAsB,CAAC;AAAA,EACrD,UAAyC,MAAuC;AACxF,WAAO,MAAM,UAAU,IAAW;AAAA,EACnC;AACD;;;;;;ACNoD;AAG7C,MAAM,2BAA2B,2CAAsB,CAAC;AAAA,EAC9D,UAAyC,MAAoB,MAAqD;AACjH,UAAM,OAAO,KAAK,2BAA2B,IAAI,IAAqB;AACtE,QAAI,MAAM;AACT,YAAM,EAAC,YAAY,UAAS,IAAI;AAChC,aAAO,IAAI,WAAW,MAAM,SAAS;AAAA,IACtC;AACA,WAAO;AAAA,EACR;AAAA,EAES,WAA0C,MAAS;AAC3D,UAAM,OAAO,KAAK,2BAA2B,IAAI,IAAqB;AACtE,UAAM,WAAW,IAAqB;AACtC,WAAO;AAAA,EACR;AACD;;;;;;ACdsB;AA8Bf,MAAM,cAAc;AAAA,EAK1B,YAAoB,MAAkB;AAAlB;AAJpB,SAAQ,iBAAiD,oBAAI,IAAI;AACjE,SAAQ,2BAAmD,oBAAI,IAAI;AACnE,SAAQ,wBAAwD,oBAAI,IAAI;AAAA,EAEjC;AAAA,EAEvC,OAAe,KAAK,MAA0C;AAC7D,WAAO,KAAK,WAAW,KAAK,KAAK,CAAC;AAAA,EACnC;AAAA,EACA,OAAe,WAAW,UAAkB;AAC3C,WAAO,SAAS,YAAY;AAAA,EAC7B;AAAA,EAEA,SAAS,MAA2B,iBAAqC,SAA+B;AAjDzG;AAkDE,UAAM,UAAU,KAAK,QAAQ;AAI7B,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,QAAI,gBAAgB,mCAAS;AAC7B,QAAI,iBAAiB,MAAM;AAC1B,sBAAgB;AAAA,IACjB;AAEA,QAAI,4BAA4B,KAAK,eAAe,IAAI,OAAO;AAC/D,QAAI,CAAC,2BAA2B;AAC/B,kCAA4B,oBAAI,IAAI;AACpC,WAAK,eAAe,IAAI,SAAS,yBAAyB;AAAA,IAC3D;AAEA,UAAM,wBAAwB,0BAA0B,IAAI,QAAQ;AACpE,QAAI,uBAAuB;AAE1B,YAAM,oCACL,gBAAK,sBAAsB,IAAI,OAAO,MAAtC,mBAAyC,IAAI,cAA7C,mBAAwD,aAAY;AACrE,YAAM,qBAAoB,mCAAS,aAAY;AAC/C,UAAI,mCAAmC,mBAAmB;AAAA,MAE1D,OAAO;AACN,YAAI,eAAe;AAClB,kBAAQ,KAAK,QAAQ,WAAW,6BAA6B;AAAA,QAC9D;AACA;AAAA,MACD;AAAA,IACD;AACA,8BAA0B,IAAI,UAAU,IAAI;AAC5C,QAAI,KAAK,YAAY;AACpB,WAAK,WAAW,KAAK,IAAI;AAAA,IAC1B;AAEA,QAAI,iBAAiB;AACpB,UAAI,qBAAqB,KAAK,yBAAyB,IAAI,OAAO;AAClE,UAAI,CAAC,oBAAoB;AACxB,6BAAqB,oBAAI,IAAI;AAC7B,aAAK,yBAAyB,IAAI,SAAS,kBAAkB;AAAA,MAC9D;AACA,YAAM,gBAAgB,wBAAO,CAAC,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACnF,yBAAmB,IAAI,UAAU,aAAa;AAAA,IAC/C;AAEA,QAAI,SAAS;AACZ,UAAI,kBAAkB,KAAK,sBAAsB,IAAI,OAAO;AAC5D,UAAI,CAAC,iBAAiB;AACrB,0BAAkB,oBAAI,IAAI;AAC1B,aAAK,sBAAsB,IAAI,SAAS,eAAe;AAAA,MACxD;AACA,sBAAgB,IAAI,UAAU,OAAO;AAAA,IACtC;AACA,SAAK,KAAK,gBAAgB,aAAa,IAAI;AAAA,EAC5C;AAAA,EACA,WAAW,SAAsB,UAAkB;AA1GpD;AA2GE,eAAW,cAAc,WAAW,QAAQ;AAC5C,eAAK,eAAe,IAAI,OAAO,MAA/B,mBAAkC,OAAO;AACzC,eAAK,yBAAyB,IAAI,OAAO,MAAzC,mBAA4C,OAAO;AACnD,eAAK,sBAAsB,IAAI,OAAO,MAAtC,mBAAyC,OAAO;AAAA,EACjD;AAAA,EACA,aAAa,SAAsB,UAA2B;AAC7D,UAAM,oBAAoB,KAAK,eAAe,IAAI,OAAO;AACzD,QAAI,CAAC,mBAAmB;AACvB,aAAO;AAAA,IACR;AACA,eAAW,cAAc,WAAW,QAAQ;AAC5C,WAAO,kBAAkB,IAAI,QAAQ,KAAK;AAAA,EAC3C;AAAA,EACA,YAAY,SAAsB,UAAmD;AAxHtF;AAyHE,eAAW,cAAc,WAAW,QAAQ;AAC5C,YAAO,UAAK,sBAAsB,IAAI,OAAO,MAAtC,mBAAyC,IAAI;AAAA,EACrD;AAAA,EACA,6BAA6B,YAA0B;AA5HxD;AA6HE,UAAM,WAAU,gBAAW,uBAAX,mBAA+B;AAC/C,QAAI,CAAC,SAAS;AACb,aAAO,CAAC;AAAA,IACT;AACA,UAAM,MAAM,KAAK,eAAe,IAAI,OAAO;AAC3C,QAAI,KAAK;AACR,YAAM,oBAA2C,CAAC;AAClD,iBAAK,eAAe,IAAI,OAAO,MAA/B,mBAAkC,QAAQ,CAAC,MAAM,SAAS;AACzD,0BAAkB,KAAK,IAAI;AAAA,MAC5B;AACA,aAAO,kBAAkB,OAAO,CAAC,SAAS;AACzC,cAAM,WAAW,cAAc,KAAK,IAAI;AACxC,cAAM,UAAU,KAAK,YAAY,SAAS,QAAQ;AAClD,YAAI,CAAC,SAAS;AACb,iBAAO;AAAA,QACR,OAAO;AACN,gBAAM,gBAAgB,KAAK,YAAY,WAAW,QAAQ,GAAG,WAAW,KAAK,CAAC;AAC9E,eAAI,+CAAe,aAAY,MAAM;AAIpC,mBAAO;AAAA,UACR;AACA,gBAAM,cAAc,QAAQ,MAAM;AAClC,gBAAM,gBAAgB,QAAQ,QAAQ;AACtC,gBAAM,mBAAmB,GAAG,WAAW,QAAQ,KAAK,WAAW,KAAK;AACpE,cAAI,aAAa;AAChB,mBAAO,YAAY,SAAS,gBAAgB;AAAA,UAC7C;AACA,cAAI,eAAe;AAClB,mBAAO,CAAC,cAAc,SAAS,gBAAgB;AAAA,UAChD;AACA,iBAAO;AAAA,QACR;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AACN,aAAO,CAAC;AAAA,IACT;AAAA,EACD;AAAA,EACA,gBAAgB,YAA+D;AAC9E,UAAM,cAAmD,CAAC;AAC1D,UAAM,QAAQ,KAAK,6BAA6B,UAAU;AAC1D,aAAS,QAAQ,OAAO;AACvB,YAAM,WAAW,cAAc,KAAK,IAAI;AACxC,kBAAY,QAAQ,IAAI;AAAA,IACzB;AACA,WAAO;AAAA,EACR;AAAA,EACA,mBAAmB,SAAsB,UAAkB;AA7K5D;AA8KE,eAAW,cAAc,WAAW,QAAQ;AAC5C,YAAO,UAAK,yBAAyB,IAAI,OAAO,MAAzC,mBAA4C,IAAI;AAAA,EACxD;AAAA,EAEA,MAAM;AACL,WAAO,KAAK;AAAA,EACb;AACD;AAEO,MAAM,mBAAmB;AAAA,EAG/B,YAAoB,MAAkB;AAAlB;AAFpB,SAAQ,sBAA2D,oBAAI,IAAI;AAAA,EAEpC;AAAA,EAEvC,OAAe,KAAK,MAAgC;AACnD,WAAO,KAAK,WAAW,KAAK,KAAK,CAAC;AAAA,EACnC;AAAA,EACA,OAAe,WAAW,UAAkB;AAC3C,WAAO,SAAS,YAAY;AAAA,EAC7B;AAAA,EAEA,SAAS,WAAqC,SAAoC;AACjF,QAAI,gBAAgB,mCAAS;AAC7B,QAAI,iBAAiB,MAAM;AAC1B,sBAAgB;AAAA,IACjB;AAEA,UAAM,UAAU,UAAU,QAAQ;AAClC,QAAI,iCAAiC,KAAK,oBAAoB,IAAI,OAAO;AACzE,QAAI,CAAC,gCAAgC;AACpC,uCAAiC,oBAAI,IAAI;AACzC,WAAK,oBAAoB,IAAI,SAAS,8BAA8B;AAAA,IACrE;AAEA,UAAM,gBAAgB,mBAAmB,KAAK,SAAS;AACvD,UAAM,+BAA+B,+BAA+B,IAAI,aAAa;AACrF,QAAI,8BAA8B;AACjC,UAAI,eAAe;AAClB,cAAM,UAAU,aAAa,WAAW;AACxC,gBAAQ,KAAK,OAAO;AAAA,MACrB;AACA;AAAA,IACD;AACA,mCAA+B,IAAI,eAAe,SAAS;AAC3D,QAAI,UAAU,YAAY;AACzB,gBAAU,WAAW,KAAK,IAAI;AAAA,IAC/B;AACA,SAAK,KAAK,gBAAgB,kBAAkB,SAAS;AAAA,EACtD;AAAA,EAEA,4CAA4C,SAAsB,gBAAwB;AAhO3F;AAiOE,UAAM,MAAM,KAAK,oBAAoB,IAAI,OAAO;AAChD,QAAI,KAAK;AACR,YAAM,oBAAgD,CAAC;AACvD,iBAAK,oBAAoB,IAAI,OAAO,MAApC,mBAAuC,QAAQ,CAAC,WAAW,SAAS;AACnE,0BAAkB,KAAK,SAAS;AAAA,MACjC;AACA,aAAO;AAAA,IACR,OAAO;AACN,aAAO,CAAC;AAAA,IACT;AAAA,EACD;AAAA,EACA,oBAAoB,SAAsB,eAA6D;AACtG,UAAM,iCAAiC,KAAK,oBAAoB,IAAI,OAAO;AAC3E,QAAI,gCAAgC;AACnC,sBAAgB,mBAAmB,WAAW,aAAa;AAC3D,aAAO,+BAA+B,IAAI,aAAa;AAAA,IACxD;AAAA,EACD;AACD;;;;AC9OO,MAAM,0BAA0B;AAAA,EAAhC;AACN,SAAU,kBAAyD,oBAAI,IAAI;AAAA;AAAA,EAE3E,SAAS,eAAyC,SAAwC;AACzF,QAAI,gBAAgB,mCAAS;AAC7B,QAAI,iBAAiB,MAAM;AAC1B,sBAAgB;AAAA,IACjB;AAEA,UAAM,OAAO,cAAc,KAAK;AAChC,QAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,eAAe;AACpD,cAAQ,KAAK,oCAAoC,IAAI;AAAA,IACtD;AAEA,SAAK,gBAAgB,IAAI,MAAM,aAAa;AAAA,EAC7C;AACD;;;;AClBwC;AAEjC,MAAM,8BAA8B,yBAAyB,CAAC;AAAA,EACpE,YACC,cACA,MACA,6BACsB;AACtB,UAAM,YAAY,KAAK,gBAAgB,IAAI,YAAY;AACvD,QAAI,CAAC,WAAW;AACf,cAAQ,MAAM,4BAA4B,eAAe;AAAA,IAC1D;AACA,UAAM,OAAO,IAAK,UAAkB,MAAM,2BAA2B;AACrE,WAAO;AAAA,EAER;AACD;;;;ACjBkC;AACD;AACA;AAMH;AACI;AAEc;AACnB;AAEU;AACa;AACJ;AACA;AAIc;AACN;AAGnB;AACJ;AACA;AAO1B;AAE6B;AAepC,MAAM,oBAAoB,QAAqB;AACxC,MAAM,WAAW;AAAA,EAyCf,cAAc;AAvCtB;AAAA,SAAgB,sBAA2C,IAAI,mBAAmB,CAAC,IAAI;AACvF,SAAgB,iBAAqC,IAAI,kBAAkB,CAAC,IAAI;AAChF,SAAgB,iBAAiC,IAAI,cAAc,CAAC;AACpE,SAAgB,gBAA+B,IAAI,aAAa,CAAC,IAAI;AACrE,SAAgB,qBAAyC,IAAI,kBAAkB,CAAC,IAAI;AACpF,SAAgB,sBAA0C,IAAI,kBAAkB,CAAC;AACjF,SAAgB,qBAAyC,IAAI,kBAAkB,CAAC;AAChF,SAAgB,kBAAmC,IAAI,eAAe,CAAC,IAAI;AAC3E,SAAgB,kBAAuC,IAAI,mBAAmB,CAAC,IAAI;AACnF,SAAgB,kBAA0C,IAAI,sBAAsB,CAAC,IAAI;AACzF,SAAgB,yBAAgD,IAAI,qBAAqB,CAAC;AAC1F,SAAgB,QAAyB,IAAI,eAAe,CAAC,IAAI;AACjE,SAAgB,YAAiC,IAAI,mBAAmB,CAAC;AAEzE;AAAA,SAAgB,aAAa,IAAI,wBAAwB,CAAC;AAC1D,SAAgB,0BAA0B,IAAI,mFAAqC,CAAC;AACpF,SAAgB,sBAAsB,IAAI,iCAAiC,CAAC;AAC5E,SAAgB,sBAAsB,IAAI,iCAAiC,CAAC;AAE5E;AAAA,SAAgB,cAAiD,IAAI,iCAAiC,CAAC;AACvG,wBAA0C,CAAC;AAE3C,SAAQ,cAAuB;AAC/B,SAAQ,UAAiC;AAAA,EAgBlB;AAAA,EAdvB,OAAO,aAAa;AAInB,QAAI,WAAW,6BAA6B;AAC3C,aAAO,WAAW;AAAA,IACnB,OAAO;AACN,YAAM,WAAW,IAAI,WAAW;AAChC,iBAAW,8BAA8B;AAEzC,aAAO,WAAW;AAAA,IACnB;AAAA,EAED;AAAA,EAGA,UAAU;AACT,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,MAAe;AAC5B,SAAK,cAAc;AAAA,EACpB;AAAA,EACA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,UAAU;AACT,SAAK,eAAe,QAAQ;AAC5B,SAAK,oBAAoB,QAAQ;AAAA,EAClC;AAAA,EAEA,aAAa,MAA2B,mBAAuC,SAA+B;AAC7G,SAAK,cAAc,SAAS,MAAM,mBAAmB,OAAO;AAAA,EAC7D;AAAA,EACA,kBAAkB,WAAiC,SAAoC;AACtF,SAAK,mBAAmB,SAAS,WAAW,OAAO;AAAA,EACpD;AAAA,EACA,sBAAsB,eAAyC,SAAwC;AACtG,SAAK,uBAAuB,SAAS,eAAe,OAAO;AAAA,EAC5D;AAAA,EAEA,eAAiC,aAAkB,sBAA+C;AACjG,SAAK,gBAAgB,SAAS,aAAa,oBAAoB;AAAA,EAChE;AAAA,EACA,uBAAuB,UAAkB;AACxC,SAAK,gBAAgB,iBAAiB,QAAQ;AAAA,EAC/C;AAAA,EACA,eAAe,QAA6B;AAC3C,SAAK,gBAAgB,SAAS,MAAM;AAAA,EACrC;AAAA,EACA,uBAAuB,UAA0C;AAChE,SAAK,gBAAgB,uBAAuB,QAAQ;AAAA,EACrD;AAAA,EAEA,gBAAgB,YAAgE;AAC/E,WAAO,KAAK,cAAc,gBAAgB,UAAU;AAAA,EACrD;AAAA,EACA,oBAAoB,gBAA6B,gBAA0D;AAC1G,WAAO,KAAK,mBAAmB,oBAAoB,gBAAgB,cAAc;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAIA,eAAe,QAAgC,SAAiC;AAC/E,SAAK,gBAAgB,SAAS,OAAO,YAAY,QAAsB,OAAO;AAAA,EAC/E;AAAA,EAEA,iBAAiB;AAChB,WAAO;AAAA,EACR;AAAA,EAQA,IAAI,OAAO;AACV,WAAQ,KAAK,mBAAmB,KAAK,oBAAoB,IAAI,kBAAkB,CAAC;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAa;AACnB,SAAK,OAAO;AAAA,EACb;AAAA,EACA,MAAM;AACL,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,QAA+B;AACxC,SAAK,UAAU;AAAA,EAChB;AAAA,EACA,SAAS;AACR,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,YAAkB,gBAAuB;AA1L9C;AA2LE,eAAK,YAAL,mBAAc,IAAI,GAAG,CAAC,SAAS,GAAG,cAAc;AAAA,EACjD;AAAA,EACA,KAAK,YAAkB,gBAAuB;AA7L/C;AA8LE,eAAK,YAAL,mBAAc,KAAK,GAAG,CAAC,SAAS,GAAG,cAAc;AAAA,EAClD;AAAA,EACA,MAAM,YAAkB,gBAAuB;AAhMhD;AAiME,eAAK,YAAL,mBAAc,MAAM,GAAG,CAAC,SAAS,GAAG,cAAc;AAAA,EACnD;AACD;AAEO,MAAM,OAAO,WAAW,WAAW;;;;;;;;;;;;;;ACnMd;AAIL;AAEhB,MAAM,yBAAyB,6EAAa,CAAC;AAAA,EAMnD,YACQ,OACA,UACA,gBACN;AAlBH;AAmBE,UAAM,MAAM,MAAM,GAAG,kBAAkB;AAJhC;AACA;AACA;AALR,SAAQ,6BAA6B,KAAK,sBAAsB,KAAK,IAAI;AASxE,gBAAM,yBAAN,mBAA4B,yBAAyB;AAErD,SAAK,iBAAiB,yBAAyB,KAAK,0BAA0B;AAAA,EAC/E;AAAA,EACQ,sBAAsB,SAAyB;AACtD,QAAI,WAAW,KAAK,gBAAgB;AACnC,YAAM,OAAO;AACb,WAAK,eAAe,qBAAqB,IAAI;AAC7C,YAAM,WAAW,KAAK,eAAe,OAAO;AAE5C,YAAM,UAAU,KAAK;AACrB,YAAM,EAAC,YAAW,IAAI,KAAK;AAC3B,UAAI,WAAW,8DAAQ,CAAC,WAAW,GAAG;AACrC,gBAAQ,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,GAAG,eAAe,QAAQ;AACrE,gBAAQ,MAAM,QAAQ,IAAI,QAAQ,GAAG,eAAe,QAAQ;AAAA,MAC7D;AACA,UAAI,KAAK,MAAM,sBAAsB;AACpC,aAAK,MAAM,qBAAqB,qCAAqC;AAAA,MACtE;AAAA,IACD;AAAA,EACD;AAAA,EACA,QAAQ;AACP,SAAK,4BAA4B;AAAA,EAClC;AAAA,EAEA,0BAA0B;AACzB,QAAI,KAAK,aAAa,KAAK,gBAAgB;AAC1C,YAAM,QAAwB,CAAC;AAC/B,WAAK,eAAe,WAAW,KAAK;AACpC,iBAAW,cAAc,OAAO;AAC/B,YAAI,YAAY;AACf,gBAAM,OAAO;AACb,cAAI,KAAK,gBAAgB;AACxB,iBAAK,cAAc,KAAK,eAAe,UAAU,CAAC;AAAA,UACnD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,cAAc,WAA4B;AACzC,SAAK,YAAY;AAAA,EAClB;AAAA,EACA,wBAAwB,MAAqB;AAC5C,SAAK,sBAAsB;AAAA,EAC5B;AAAA,EACA,oBAAoB,MAAc;AACjC,SAAK,kBAAkB;AAAA,EACxB;AAAA,EAEA,OAAO,OACN,OACA,UACA,MACA,gBACC;AAUD,UAAM,WAAW,IAAI,iBAAiB,OAAO,UAAU,cAAc;AACrE,QAAI,MAAM;AACT,eAAS,wBAAwB,IAAI;AAAA,IACtC,OAAO;AACN,YAAM,EAAC,YAAW,IAAI;AACtB,UAAI,8DAAQ,CAAC,WAAW,GAAG;AAC1B,iBAAS,oBAAoB,WAAW;AAAA,MACzC;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACD;;;;;;;;;;;;;;;;ACjGA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY,sBAAsB;AAClC,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,aAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,GAAG;AACf,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA,iCAAiC;AACjC;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;;AAEA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,uBAAuB;AACnC,cAAc;AACd;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB;;AAEjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,uCAAuC;AACvC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,kCAAkC;AAClC;AACA;;AAEA,mCAAmC;AACnC;AACA;;AAEA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,4BAA4B;AAC5B,4BAA4B;AAC5B,4BAA4B;AAC5B,4BAA4B;AAC5B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC;AACA;;AAEA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,kBAAkB,sBAAsB,OAAO;;AAE/C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;AACF;;AAEA;;AAEA;;AAEiC;;;;;;AC7jChB;AACM;AAEvB,eAAe,CAAC,GAAG;AACnB,IAAI,aAAa;AACjB,gBAAgB,CAAC,MAAM,UAAU;AAKjC,MAAM,kBAAkB;AACxB,MAAM,eAAe;AAErB,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AAE7B,SAAS,oBAAoB,GAAqB;AACxD,MAAI,KAAK,MAAM;AACd,QAAI,yBAAQ,CAAC,CAAC,GAAG;AAChB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AACA;AACA,wBAAwB,yCAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,qBAAqB,sBAAI;AACzB,oBAAoB,sBAAI;AACxB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM,0DAA0D,KAAK;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sBAAI,YAAY,sBAAI;AAClD,YAAY,8BAAQ;AACpB,mDAAmD,sCAAe;AAClE;AACA;AACA,mDAAmD,sCAAe;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClHmC;AACiC;AACO;AACnB;AACK;AACf;AACqB;AACb;AACe;AAClB;AACP;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACO,sBAAsB,4BAAU;AACvC;AACA,cAAc,yCAAoB;AAClC;AACA;AACA;AACA;AACA;AACA,wBAAwB,yCAAoB;AAC5C;AACA;AACA;AACA,YAAY,wBAAM,CAAC,4BAAM;AACzB,oBAAoB,8BAAQ,mFAAmF,KAAK;AACpH,gBAAgB,4BAAM;AACtB;AACA,gCAAgC,+BAAc;AAC9C;AACA;AACA,qBAAqB,8BAAQ;AAC7B;AACA;AACA;AACA,SAAS;AACT,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oDAAsB;AACnD;AACA;AACA;AACA,oBAAoB,sBAAI;AACxB,qBAAqB,sBAAI;AACzB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,KAAK;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,6BAAK,KAAK,+BAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,gDAAwB;AACzD;AACA,+BAA+B,wCAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB,6BAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+BAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6BAAO;AACnB,YAAY,wBAAM,CAAC,6BAAO;AAC1B;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAM,CAAC,4BAAM,2DAA2D,KAAK;AACrF,YAAY,4BAAM;AAClB;AACA,4BAA4B,+BAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gCAAU;AACV,IAAI,8BAAS;AACb;AACA,gCAAU;AACV,IAAI,8BAAS;AACb;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7P6B;AACe;AACjB;AACW;AAEJ;AACR;AACI;AACX;AACK;AAEjB,MAA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A;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AClFA;AACA;AACA;AACO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;ACbO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,OAAO;;AAEnD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;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;;AAEP;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;ACZO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;ACxFO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AC/MO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,0BAA0B;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AC7DO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;ACrGO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;ACjGO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,QAAQ;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;ACtIwC;AACI;AACY;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,OAAO;AACX,IAAI,SAAS;AACb,IAAI,eAAe;;AAEnB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,uBAAuB;;AAEvB;AACA;;AAEA,IAAI,0BAA0B;;AAE9B;AACA;;AAEA,IAAI,0BAA0B;;AAE9B;AACA;;AAEA,IAAI,0BAA0B;;AAE9B;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AClfO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;ACrBO;;AAEP;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AC7DO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;ACvNO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;;ACrFO;;AAEP;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AC7DO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;;;AChFO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;AChGO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;ACxBO;;AAEP;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;ACxDO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;ACjDO;;AAEP;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;ACnFO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,mBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAM;;AAEN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;ACvKO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;;AChDO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;AClUO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;AChGyC;AACS;AAI1B;;AAExB;AACgF;AACE;AACE;AACV;AACQ;AACZ;AACM;;AAE5E;AAC6E;AACI;AACJ;AACI;AACA;;AAEjF;AAC0E;AAClB;;AAExD;AACsF;AACN;AACA;;AAEhF;AACkF;AACtB;AACE;AACI;AAC8B;;AAEhG;AACwD;AAC6B;;AAErF;AACiE;AACJ;AACE;AACJ;AACY;AACc;;AAE9E,0CAA0C,gCAAY;;AAE7D;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,kBAAkB,WAAW,oBAAO,IAAI;;AAExC,eAAe,WAAW;AAC1B,2BAA2B,WAAW;AACtC,sBAAsB,WAAW,qBAAqB,IAAI;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A;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,8BAA8B;AAC9B;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AA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;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ,kCAAkC;;AAElC;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAkC,uBAAe;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;;AAErB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEsB;;;AC7qBsB;AACC;;AAE7C;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,uBAAe;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,sCAAsC,UAAU;;AAE7B;;;ACntByB;;AAE5C;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,uBAAe;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEmB;;;AC/doB;;AAEvC;;AAEA,wBAAwB,OAAO,kDAAkD,OAAO;;AAExF;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAsC,QAAQ;;AAE9C,uBAAuB,WAAO;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAyC,QAAQ;;AAEjD,uBAAuB,WAAO;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,WAAO;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,kDAAkD,OAAO;;AAEzD;;AAEA,mCAAmC,WAAO;;AAE1C,OAAO;;AAEP,MAAM,WAAO;;AAEb;;AAEA,KAAK,WAAO;AACZ,yBAAyB,WAAO;;AAEhC;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAwC,OAAO;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,kCAAkC,WAAO;;AAEzC;AACA,SAAS,WAAO;;AAEhB;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAiC,WAAO;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,iCAAiC,WAAO;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;;AAEjF;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;;AAEA,MAAM,WAAO,qBAAqB,OAAO;;AAEzC;;AAEA;;AAEA,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;;AAErC;;AAEA,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;;AAErC,kCAAkC,OAAO;AACzC,mCAAmC,OAAO;AAC1C,0CAA0C,OAAO;AACjD,oCAAoC,OAAO;;AAE3C;;AAEA,uCAAuC,QAAQ;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEgB;;;ACrhBhB;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAG2B;;;ACtFpB;;AAEA,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEP;AACO;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;ACvNP;;AAEA;;AAEA;;AAEA,oCAAoC,OAAO;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oCAAoC,OAAO;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAiC,QAAQ;;AAEzC,0CAA0C;;AAE1C;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAE2H;;;ACvH9E;AACA;AACiB;AACD;AACO;AAC7B;;AAEvC,MAAM,sBAAO,qBAAqB,OAAO;AACzC,mCAAmC,OAAO;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,eA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AER,QAAQ;AACP,WAAO,CAAC;AAAA,EACT;AACD,CAAC,CAAC,EAAC;;;ACXuM;;;;ACAlI;AAClB;AACL;;AAEjD,CAA6E;AAC7E,iCAAiC,+BAAe,CAAC,0BAAM,aAAa,MAAM;;AAE1E,wCAAe;;;;ACPf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA,kBAAkB,sBAAsB;AACxC;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B,+BAA+B;AAC3D;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAyC,SAAS;;AAElD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,YAAoB;AAC/B,IAAI;AACJ;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;;AAEvD;AACA,+GAA+G;;AAE/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC,QAAQ;AAChD;AACA;;AAEA;AA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gBAAgB,GAAG,8CAA8C,mCAAmC,GAAG;;AAE96qB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB,YAAY,UAAU;AACtB,YAAY,UAAU;AACtB,YAAY,UAAU;AACtB,YAAY,uBAAuB;AACnC;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,SAAS,YAAY;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA,GAAG,IAAI;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,+DAA+D,gCAAgC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG,GAAG;AACN;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH,aAAa;AACb;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,kCAAkC;AAClC;AACA;AACA,mCAAmC;AACnC;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iFAAiF,aAAa;AAC9F;AACA;;AAEA,kEAAkE;AAClE;AACA,iEAAiE,8BAA8B;AAC/F;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,yFAAyF,aAAa;AACtG;AACA;;AAEA;AACA;AACA,kEAAkE;AAClE,GAAG;AACH;AACA;AACA;AACA,6FAA6F,eAAe;AAC5G;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,aAAa;AAClF;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,KAAK;AACL;AACA;AACA,kDAAkD,iBAAiB;AACnE;AACA,OAAO;AACP;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,gDAAgD,uBAAuB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;;AAEA,6CAA6C,cAAc;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,GAAG;;AAEH;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kEAAkE;AAClE;AACA,IAAI,IAAI,KAAK;AACb;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,kEAAkE;AAClE;AACA,IAAI,IAAI,KAAK;AACb;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,iCAAiC;AAC7E,4FAA4F;AAC5F,KAAK;AACL,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,IAAI;AACP;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI,WAAW;AACf;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,mDAAmD,2EAA2E;AAC9H;;AAEA;AACA,wBAAwB,6CAA6C;AACrE;;AAEA,gEAAgE,aAAa;AAC7E;AACA,KAAK;AACL;AACA;;AAEA,IAAI,eAAM;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA,yBAAyB,eAAM;AAC/B;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,oDAAoD;AACpD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,oDAAoD;AACpD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+EAA+E,WAAW;AAC1F;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,0DAA0D;AAC1D,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,wDAAwD;AACxD,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,qCAAqC;AACrC;AACA;AACA,sDAAsD;AACtD,SAAS;AACT;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,oDAAoD,WAAW;AAC/D;AACA,SAAS;AACT,OAAO;;AAEP,4DAA4D,qBAAqB;AACjF;AACA,OAAO;;AAEP;AACA;AACA,oDAAoD,WAAW;AAC/D;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,sDAAsD,qBAAqB;AAC3E;AACA,wBAAwB,GAAG,GAAG,GAAG,GAAG,GAAG;AACvC,WAAW;AACX,SAAS;AACT;AACA,sDAAsD,sBAAsB;AAC5E,uBAAuB,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,WAAW;AACX,SAAS;AACT;;AAEA;AACA;AACA;AACA,oDAAoD,WAAW;AAC/D;AACA;AACA,SAAS;AACT;AACA;AACA,sDAAsD,sBAAsB;AAC5E,uBAAuB,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,WAAW;AACX,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA;AACA,sDAAsD,WAAW;AACjE;AACA;AACA,WAAW;AACX;AACA;AACA,wDAAwD,sBAAsB;AAC9E,yBAAyB,EAAE,EAAE,EAAE,EAAE,EAAE;AACnC,aAAa;AACb,WAAW;AACX,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,cAAK;AACT,IAAI,aAAI;AACR;;AAEyM;;;AC34F3H;AACpB;;AAE1D,SAAS,gBAAO;AAChB;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,SAAS,sBAAc;AACvB,kBAAkB,sBAAsB;AACxC;AACA,YAAY,gBAAO;AACnB,MAAM,uBAAe;AACrB,KAAK,mHAAmH,gBAAO;AAC/H;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,SAAS,eAAO;AAChB;;AAEA,SAAS,eAAO;AAChB;AACA,IAAI;AACJ;AACA,GAAG,EAAE,eAAO;AACZ;;AAEA,SAAS,uBAAe;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,cAAc,uBAAuB;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,gBAAgB,6BAA6B;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,SAAS,0BAAkB;AAC3B,SAAS,0BAAkB,SAAS,wBAAgB,SAAS,mCAA2B,SAAS,0BAAkB;AACnH;;AAEA,SAAS,0BAAkB;AAC3B,iCAAiC,yBAAiB;AAClD;;AAEA,SAAS,wBAAgB;AACzB;AACA;;AAEA,SAAS,mCAA2B;AACpC;AACA,oCAAoC,yBAAiB;AACrD;AACA;AACA;AACA,sFAAsF,yBAAiB;AACvG;;AAEA,SAAS,yBAAiB;AAC1B;;AAEA,yCAAyC,SAAS;;AAElD;AACA;;AAEA,SAAS,0BAAkB;AAC3B;AACA;;AAEA,sHAAsH,qBAAM,mBAAmB,qBAAM;;AAErJ,eAAe;;AAEf;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA,EAAE;AACF,EAAE;;AAEF;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG,IAAI;AACP;AACA;AACA;AACA,WAAW,eAAe;AAC1B,aAAa;AACb;;;AAGA;AACA;AACA;AACA;AACA,GAAG,IAAI;AACP;AACA;AACA;AACA,WAAW,0BAA0B;AACrC,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA,GAAG,GAAG;;AAEN,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH,aAAa;AACb,aAAa;AACb;AACA,GAAG,GAAG;;AAEN;AACA;AACA,4CAA4C;AAC5C;;AAEA,SAAS,8BAAC,sBAAsB,sBAAc,CAAC,sBAAc,CAAC,sBAAc,GAAG,YAAY;AAC3F;AACA,WAAW,sBAAc,CAAC,sBAAc,GAAG;AAC3C,GAAG;AACH;;AAEA,IAAI,mBAAU;;AAEd;AACA,EAAE,mBAAU,GAAG,YAAoB;AACnC,EAAE;;AAEF;AACA,OAAO,mBAAU;AACjB;;AAEA;AACA;AACA;;AAEA;AACA,sFAAsF,uBAAe,GAAG;AACxG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,EAAE,uBAAe,2DAA2D,uBAAe,0EAA0E,uBAAe,gEAAgE,uBAAe,kDAAkD,uBAAe,uCAAuC,uBAAe,qCAAqC,uBAAe,mCAAmC,uBAAe,mCAAmC,uBAAe,4CAA4C,uBAAe,qCAAqC,uBAAe,8CAA8C,uBAAe;AACjsB;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;AACA,cAAc,eAAO;AACrB;AACA;;AAEA,MAAM,YAAU;AAChB,WAAW,YAAU;AACrB;;AAEA;AACA;AACA;;AAEA,MAAM,eAAO;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,oDAAe;AACrC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,iBAAiB,6CAAQ;AACzB;AACA,KAAK;AACL,kBAAkB,6CAAQ;AAC1B;AACA,KAAK;AACL,oBAAoB,6CAAQ;AAC5B,8EAA8E,iBAAe;AAC7F,KAAK;AACL,eAAe,6CAAQ;AACvB;AACA,KAAK;AACL,uBAAuB,6CAAQ;AAC/B,aAAa,IAAI,eAAe,sBAAc,CAAC,sBAAc,CAAC,sBAAc,CAAC,sBAAc,GAAG,mDAAmD;AACjJ;AACA;AACA,OAAO;AACP,KAAK;AACL,IAAI,0CAAK;AACT;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,gBAAgB,6CAAQ;AACxB,4EAA4E;AAC5E,KAAK;AACL;AACA;AACA;AACA;AACA,CAAC;;AAED,wBAAwB,oDAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,uBAAuB,qBAAmB;AAC1C,oBAAoB,6CAAQ;AAC5B,yDAAyD,0BAAkB;AAC3E,KAAK;AACL;AACA,aAAa,8BAAC;AACd;AACA,OAAO;AACP;AACA;AACA,CAAC;;AAED,4BAA4B,oDAAe;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,uBAAuB,qBAAmB;AAC1C,kBAAkB,6CAAQ;AAC1B,gDAAgD,0BAAkB,qEAAqE,0BAAkB;AACzJ,KAAK;AACL,oBAAoB,6CAAQ;AAC5B,8EAA8E,iBAAe;AAC7F,KAAK;AACL,0BAA0B,6CAAQ;AAClC,kBAAkB,aAAI,yBAAyB,sBAAc,CAAC,sBAAc,GAAG;AAC/E;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL,gBAAgB,6CAAQ;AACxB,8CAA8C;AAC9C,KAAK;AACL;AACA;AACA;AACA;AACA,CAAC;;AAEoE;;;ACloBrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2k2B;;;;AC9tSrj2B;AAGQ;AA2BvB;AAGP,aAAW;AAAH,EACP,MAAM;AAAN,EACA,OAAO;AAAP,EACA,aAAa;AAAb,EACA,cAAc;AAAd,EACA,WAAW;AAAX,EACA,aAAa;AAAb,EACA,UAAU;AAAV,EACA,SAAS;AAAT,EACA,qBAAqB;AAArB,EACA,OAAO;AAAP,EACA,OAAO;AAAP,EACA,QAAQ;AAAR,EACA,QAAQ;AAAR,EACA,WAAW;AAAX,EACA,QAAQ;AAAR,EACA,QAAQ;AAAR,EACA,OAAO;AAAP,EACA,QAAQ;AAAR,EACA,OAAO;AAAP,EACA,UAAU;AAAV,EACA,gBAAgB;AAAhB,EACA,WAAW;AAAX,EACA,cAAc;AACf;AAEQ;;;;;;;;;;;;;;;;AC9DiB;AAUlB;AAGuB;AACJ;AACD;AACK;AACT;AAEQ;AACR;AAKd,MAAM,eAAe;AAAA,EAE3B,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,eAAe;AAAA,EAC/D;AAAA,EACQ,cAAc;AAAA,EAAC;AAAA;AAAA,EAmBvB,MAAM,aAAmC;AACxC,UAAM,MAAM,qCAAS,CAAC,GAA+E;AAUrG,QAAI,IAAI,qBAAM;AACd,QAAI,UAAU,iBAAiB,uBAAoB;AACnD,QAAI,UAAU,gBAAgB,2BAAmB;AACjD,QAAI,UAAU,qBAAqB,gCAAwB;AAC3D,QAAI,UAAU,YAAY,uBAAe;AACzC,QAAI,UAAU,qBAAqB,eAAe;AAClD,SAAK,eAAe;AAEpB,SAAK,mBAAmB,IAAI,MAAM,WAAW;AAE7C,wFAAsC,CAAC;AAAA,EACxC;AAAA,EACA,UAAU;AAGT,QAAI,CAAC,KAAK,cAAc;AACvB;AAAA,IACD;AACA,SAAK,aAAa,QAAQ;AAE1B,SAAK,eAAe;AAAA,EACrB;AAAA,EAEA,sBAAsB,oBAAwC;AAC7D,SAAK,sBAAsB;AAAA,EAC5B;AAAA,EACA,qBAAqB;AACpB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAID;AAEO,MAAM,YAAY,eAAe,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;AC7F1B;AAIK;AAErB,SAAS,6BAA6B,UAAgC,eAA0C;AACtH,MAAI,CAAC,cAAc,4BAA4B,QAAQ,GAAG;AACzD;AAAA,EACD;AAEA,QAAM,aAAa,SAAS,QAAQ;AACpC,MAAI,CAAC,YAAY;AAChB;AAAA,EACD;AACA,QAAM,gBAAgB,WAAW,eAAe;AAChD,MAAI,CAAC,eAAe;AACnB;AAAA,EACD;AACA,MAAI,CAAC,uCAAiB,CAAC,aAAa,GAAG;AACtC;AAAA,EACD;AAEA,QAAM,yBAA0C;AAAA,IAC/C,qCAAkB;AAAJ,IACd,mCAAiB;AAAH,IACd,uCAAmB;AAAL,IACd,2CAAqB;AAAP,IACd,iDAAwB;AAAV,IACd,mDAAyB;AAAX,IACd,yCAAoB;AAAN,IACd,iDAAwB;AAAV,IACd,+CAAuB;AAAT,IACd,2CAAqB;AAAP,IACd,6CAAsB;AAAR,IACd,yCAAoB;AAAN,IACd,6CAAsB;AAAR,IACd,yCAAoB;AAAN,IACd,2CAAqB;AAAP,IACd,2CAAqB;AAAP,IACd,yCAAoB;AAAN,IACd,mCAAiB;AAAH,IACd,iDAAwB;AAAV,IACd,6CAAsB;AAAR,EACf;AACA,QAAM,mBAAmB,uBAAuB,aAAa;AAC7D,MAAI,oBAAoB,MAAM;AAC7B;AAAA,EACD;AACA,aAAW,eAAe,IAAI;AAC/B;;;;;;AClDgC;AAGhC,SAAS,mBAAmB,UAAgC,eAA0C;AACrG,MAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,UAAM,SAAS,SAAS,QAAQ;AAChC,QAAI,QAAQ;AACX,YAAM,aAAa,OAAO,YAAY;AACtC,UAAI,cAAc,MAAM;AACvB,eAAO,YAAY,IAAI;AAAA,MACxB;AAAA,IACD;AAAA,EACD;AACD;AAEO,SAAS,gBAAgB,UAAgC,eAA0C;AACzG,QAAM,WAAW,SAAS;AAC1B,UAAQ,UAAU;AAAA,IACjB,KAAK,8CAAsB,CAAC,GAAG;AAC9B,aAAO,mBAAmB,UAAU,aAAa;AAAA,IAClD;AAAA,EACD;AACD;;;;;;;;ACbO,MAAe,sBAAsB;AAAA,EAI3C,cAAc,MAA6B,UAAgC;AAC1E,QAAI,KAAK,MAAM;AACd,WAAK,cAAc,EAAC,MAAM,KAAK,MAAM,WAAW,CAAC,GAAG,QAAQ,OAAS,GAAG,QAAQ;AAAA,IACjF;AAAA,EACD;AAAA,EACQ,cAAc,MAAoB,UAAgC;AACzE,aAAS,IAAI;AACb,UAAM,OAAO,KAAK;AAClB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAAC,cAAc;AAClB;AAAA,IACD;AACA,UAAM,gBAAgB,OAAO,KAAK,YAAY;AAC9C,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,aAAa,SAAS;AACpC,UAAI,OAAO;AACV,cAAM,gBAAgB,cAAc,OAAO,CAAC,mBAAmB,kBAAkB,SAAS;AAC1F,cAAM,YAAY,cAAc,IAAI,CAAC,iBAAiB,aAAa,YAAY,CAAC;AAChF,cAAM,YAA0B;AAAA,UAC/B,MAAM;AAAA,UACN;AAAA,UACA,QAAQ;AAAA,QACT;AACA,aAAK,cAAc,WAAW,QAAQ;AAAA,MACvC;AAAA,IACD;AAAA,EACD;AACD;;;;;;ACzCoC;AACb;AAE2B;AAC1B;AAOjB,MAAM,gCAAgC,qBAAqB,CAAC;AAAA,EAClE,gBAAgB;AACf,WAAO;AAAA,EACR;AAAA,EACA,YAAY,MAAoD;AAC/D,SAAK,cAAc,MAAM,CAAC,SAAS;AAClC,UAAI,KAAK,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,iBAAiB;AACnE,aAAK,sBAAsB,IAAI;AAC/B,aAAK,wBAAwB,IAAI;AACjC,aAAK,0BAA0B,IAAI;AAGnC,aAAK,4BAA4B,IAAI;AAAA,MACtC;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EACQ,4BAA4B,MAAoB;AACvD,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AACA,UAAM,gBAAgB,OAAO,KAAK,QAAQ;AAC1C,UAAM,cAAc,oBAAI,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AACD,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,SAAS,SAAS;AAChC,UAAI,YAAY,IAAI,MAAM,IAAI,GAAG;AAChC,cAAM,SAAS,MAAM;AACrB,YAAI,QAAQ;AACX,gBAAM,kBAAkB,OAAO,YAAY;AAC3C,cAAI,uCAAiB,CAAC,eAAe,GAAG;AACvC,kBAAM,QAAQ;AACd,mBAAO,YAAY,IAAI;AAAA,cACtB,MAAM,wCAAgB;AAAN,cAChB,eAAe;AAAA,cACf,SAAS,EAAC,OAAO,MAAM,UAAU,KAAI;AAAA,cACrC,WAAW;AAAA,YACZ;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACQ,wBAAwB,MAAoB;AACnD,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AACA,UAAM,YAAY;AAClB,UAAM,gBAAgB,OAAO,KAAK,QAAQ;AAC1C,UAAM,iBAA8B,oBAAI,IAAI;AAE5C,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,SAAS,SAAS;AAChC,UAAI,MAAM,QAAQ,WAAW;AAC5B,uBAAe,IAAI,SAAS;AAAA,MAC7B;AAAA,IACD;AAEA,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,SAAS,SAAS;AAChC,YAAM,SAAS,MAAM;AACrB,UAAI,QAAQ;AACX,mBAAW,SAAS,QAAQ;AAC3B,cAAI,CAAC,uCAAiB,CAAC,KAAK,KAAK,SAAS,MAAM;AAC/C,gBAAI,eAAe,IAAI,MAAM,IAAI,GAAG;AACnC,kBAAI,MAAM,UAAU,YAAY;AAC/B,sBAAM,SAAS,oDAA+B;AAAT,cACtC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACQ,0BAA0B,MAAoB;AACrD,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AACA,UAAM,cAAc;AACpB,UAAM,gBAAgB,OAAO,KAAK,QAAQ;AAC1C,UAAM,mBAAgC,oBAAI,IAAI;AAE9C,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,SAAS,SAAS;AAChC,UAAI,MAAM,QAAQ,aAAa;AAC9B,yBAAiB,IAAI,SAAS;AAAA,MAC/B;AAAA,IACD;AAEA,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,SAAS,SAAS;AAChC,YAAM,SAAS,MAAM;AACrB,UAAI,QAAQ;AACX,mBAAW,SAAS,QAAQ;AAC3B,cAAI,CAAC,uCAAiB,CAAC,KAAK,KAAK,SAAS,MAAM;AAC/C,gBAAI,iBAAiB,IAAI,MAAM,IAAI,GAAG;AACrC,kBAAI,MAAM,UAAU,YAAY;AAC/B,sBAAM,SAAS,kDAA8B;AAAR,cACtC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA,EAGQ,sBAAsB,MAAoB;AACjD,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,CAAC,UAAU;AACd;AAAA,IACD;AACA,UAAM,mBAAmB;AACzB,UAAM,yBAAmE,oBAAI,IAAI;AACjF,QAAI,QAAQ;AACZ,UAAM,gBAAgB,OAAO,KAAK,QAAQ;AAE1C,eAAW,aAAa,eAAe;AACtC,YAAM,QAAQ,SAAS,SAAS;AAChC,UAAI,MAAM,QAAQ,kBAAkB;AACnC,cAAM,eAAe,eAAe;AACpC,cAAM,cAAc,cAAc;AAClC,+BAAuB,IAAI,WAAW,EAAC,OAAO,cAAc,MAAM,YAAW,CAAC;AAG9E,eAAO,SAAS,SAAS;AACzB,iBAAS,YAAY,IAAI,EAAC,MAAM,eAAc;AAC9C,iBAAS,WAAW,IAAI,EAAC,MAAM,cAAa;AAG5C;AAAA,MACD;AAAA,IACD;AAEA,UAAM,iBAAiB,OAAO,KAAK,QAAQ;AAC3C,eAAW,aAAa,gBAAgB;AACvC,YAAM,QAAQ,SAAS,SAAS;AAChC,YAAM,SAAS,MAAM;AACrB,UAAI,QAAQ;AACX,mBAAW,SAAS,QAAQ;AAC3B,cAAI,CAAC,uCAAiB,CAAC,KAAK,KAAK,SAAS,MAAM;AAC/C,kBAAM,cAAc,uBAAuB,IAAI,MAAM,IAAI;AACzD,gBAAI,eAAe,MAAM;AACxB,kBAAI,MAAM,UAAU,gBAAgB;AACnC,sBAAM,OAAO,YAAY;AACzB,sBAAM,QAAQ,IAAI;AAAA,cACnB,OAAO;AACN,oBAAI,MAAM,UAAU,eAAe;AAClC,wBAAM,OAAO,YAAY;AACzB,wBAAM,QAAQ,IAAI;AAAA,gBACnB;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;;;;;;ACjLkD;AAC5B;AACuB;AAEtC,MAAM,gCAAgC,qBAAqB,CAAC;AAAA,EAClE,gBAAgB;AACf,WAAO;AAAA,EACR;AAAA,EACA,YAAY,MAAoD;AAC/D,SAAK,cAAc,MAAM,CAAC,SAAS;AAClC,YAAM,OAAO,KAAK,KAAK;AACvB,cAAQ,MAAM;AAAA,QACb,KAAK,2CAAmB;AAAX,QACb,KAAK,+CAAqB;AAAb,QACb,KAAK,+CAAqB;AAAb,QACb,KAAK,uCAAiB;AAAT,QACb,KAAK,+CAAqB;AAAb,QACb,KAAK,2DAA2B;AAAnB,QACb,KAAK,2CAAmB;AAAX,QACb,KAAK,iCAAc;AAAN,QACb,KAAK,mCAAe,EAAE;AACrB,iBAAO,KAAK,gBAAgB,IAAI;AAAA,QACjC;AAAA,QACA,KAAK,iDAAsB,EAAE;AAC5B,iBAAO,KAAK,sBAAsB,IAAI;AAAA,QACvC;AAAA,MACD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EACQ,gBAAgB,MAAoB;AAC3C,UAAM,SAAS,KAAK,KAAK;AACzB,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AACA,UAAM,eAAe,OAAO,OAAO;AACnC,QAAI,gBAAgB,MAAM;AACzB;AAAA,IACD;AACA,YAAQ,cAAc;AAAA,MACrB,KAAK,GAAG;AACP,eAAO,OAAO,IAAI,kDAAyB,CAAC,wCAAiB;AAC7D;AAAA,MACD;AAAA,MACA,KAAK,GAAG;AACP,eAAO,OAAO,IAAI,kDAAyB,CAAC,0CAAkB;AAC9D;AAAA,MACD;AAAA,MACA,KAAK,GAAG;AACP,eAAO,OAAO,IAAI,kDAAyB,CAAC,kDAAsB;AAClE;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACQ,sBAAsB,MAAoB;AACjD,UAAM,SAAS,KAAK,KAAK;AACzB,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AACA,UAAM,mBAAmB,OAAO,WAAW;AAC3C,UAAM,iBAAiB,OAAO,SAAS;AACvC,QAAI,oBAAoB,MAAM;AAC7B,cAAQ,kBAAkB;AAAA,QACzB,KAAK,GAAG;AACP,iBAAO,WAAW,IAAI,kDAAyB,CAAC,wCAAiB;AACjE;AAAA,QACD;AAAA,QACA,KAAK,GAAG;AACP,iBAAO,WAAW,IAAI,kDAAyB,CAAC,0CAAkB;AAClE;AAAA,QACD;AAAA,QACA,KAAK,GAAG;AACP,iBAAO,WAAW,IAAI,kDAAyB,CAAC,kDAAsB;AACtE;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,QAAI,kBAAkB,MAAM;AAC3B,cAAQ,gBAAgB;AAAA,QACvB,KAAK,GAAG;AACP,iBAAO,SAAS,IAAI,kDAAyB,CAAC,wCAAiB;AAC/D;AAAA,QACD;AAAA,QACA,KAAK,GAAG;AACP,iBAAO,SAAS,IAAI,kDAAyB,CAAC,0CAAkB;AAChE;AAAA,QACD;AAAA,QACA,KAAK,GAAG;AACP,iBAAO,SAAS,IAAI,kDAAyB,CAAC,kDAAsB;AACpE;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;;;;;;AC/FkD;AAC7B;AACO;AAE5B,IAAK,iBAAL,kBAAKC,oBAAL;AACC,EAAAA,gBAAA,yBAAsB;AACtB,EAAAA,gBAAA,yBAAsB;AACtB,EAAAA,gBAAA,0BAAuB;AACvB,EAAAA,gBAAA,uBAAoB;AAJhB,SAAAA;AAAA;AAML,MAAM,gBAAgD;AAAA,EACrD,CAAC,6CAAkC,GAAG,qEAAkB;AAAJ,EACpD,CAAC,6CAAkC,GAAG,qEAAkB;AAAJ,EACpD,CAAC,+CAAmC,GAAG,uEAAmB;AAAL,EACrD,CAAC,yCAAgC,GAAG,iEAAgB;AACrD;AAEO,MAAM,iCAAiC,qBAAqB,CAAC;AAAA,EACnE,gBAAgB;AACf,WAAO;AAAA,EACR;AAAA,EACA,YAAY,MAAoD;AAC/D,SAAK,cAAc,MAAM,CAAC,SAAS;AAClC,YAAM,OAAO,KAAK,KAAK;AACvB,cAAQ,MAAM;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,2CAAkC;AACtC,iBAAO,KAAK,cAAc,IAAI;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EACQ,cAAc,MAAoB;AACzC,UAAM,eAAe,KAAK,KAAK;AAC/B,SAAK,KAAK,OAAO,sDAAsB;AACvC,UAAM,QAAQ,cAAc,YAAY;AACxC,SAAK,KAAK,SAAS,KAAK,KAAK,UAAU,CAAC;AACxC,SAAK,KAAK,OAAO,OAAO,IAAI;AAAA,EAC7B;AACD;;;;;;AC5CoC;AACI;AAGjB;AAEvB,SAAS,0BAA0B,UAAgC,eAA0C;AAC5G,QAAM,gCAA8D;AAAA,IACnE,wCAAyB;AAAH,IACtB,4CAA2B;AAAL,IACtB,gDAA6B;AAAP,IACtB,gDAA6B;AAAP,IACtB,4CAA2B;AAAL,IACtB,gDAA6B;AAAP,EACvB;AACA,QAAM,aAAa,SAAS,QAAQ;AACpC,MAAI,CAAC,YAAY;AAChB;AAAA,EACD;AACA,QAAM,iBAAiB,WAAW,MAAM;AACxC,MAAI,kBAAkB,MAAM;AAC3B;AAAA,EACD;AACA,MAAI,CAAC,uCAAiB,CAAC,cAAc,GAAG;AAEvC;AAAA,EACD;AACA,QAAM,UAAU,8BAA8B,cAAc;AAC5D,QAAM,WAAY,mEAA6D,CAAC,OAAO;AACvF,MAAI,WAAW,GAAG;AACjB,YAAQ,KAAK,2DAA2D;AACxE;AAAA,EACD;AACA,aAAW,MAAM,IAAI;AACtB;AAEO,SAAS,mCACf,UACA,eACC;AACD,MACC,cAAc,4BAA4B,QAAQ,KAClD,cAAc,gCAAgC,QAAQ,GACrD;AACD,8BAA0B,UAAU,aAAa;AAAA,EAClD;AACD;;;;AC3CiD;AAE1C,SAAS,qBAAqB,UAAgC,eAA0C;AAC9G,QAAM,WAAW,SAAS;AAE1B,MAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,UAAM,kBAA0C;AAAA,MAC/C,8BAA8B;AAAA,MAC9B,sBAAsB;AAAA,MACtB,+BAA+B;AAAA,MAC/B,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,aAAa;AAAA,MACb,qBAAqB;AAAA,MACrB,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,IACd;AACA,WAAO,gBAAgB,QAAQ;AAAA,EAChC;AACA,MAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,UAAM,kBAA0C;AAAA,MAC/C,oBAAoB;AAAA,MACpB,yBAAyB;AAAA,IAC1B;AACA,WAAO,gBAAgB,QAAQ;AAAA,EAChC;AACD;AAGA,MAAM,4BAA0D,oBAAI,IAAI;AACxE,0BAA0B,IAAI,sBAAsB,kCAAkC;AAE/E,SAAS,mBAAmB,UAAgC,eAA0C;AAC5G,QAAM,kBAAkB,0BAA0B,IAAI,SAAS,IAAI;AACnE,MAAI,iBAAiB;AACpB,oBAAgB,UAAU,aAAa;AAAA,EACxC;AACD;;;;;;;;;;ACvC6B;AACA;AAEF;AACpB,SAAS,oBAAoB,UAAgC,eAA0C;AAN9G;AAOC,QAAM,OAAM,cAAS,WAAT,mBAAiB;AAC7B,MAAI,KAAK;AAGR,QAASC,kBAAT,SAAwBC,MAAqB;AAC5C,cAAQA,MAAK;AAAA,QACZ,KAAK,iDAAkB,EAAE;AACxB,iBAAO,2CAAsB;AAAT,QACrB;AAAA,QACA,KAAK,iDAAkB,EAAE;AACxB,iBAAO,2CAAsB;AAAT,QACrB;AAAA,QACA,KAAK,mDAAmB,EAAE;AACzB,iBAAO,6CAAuB;AAAV,QACrB;AAAA,MACD;AAAA,IAED;AAbS,yBAAAD;AAFT,UAAM,MAAM,gDAAwB,CAAC,GAAG;AAgBxC,QAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,aAAOA,gBAAe,GAAG;AAAA,IAC1B;AAAA,EACD;AACD;;;;AC3BO,SAAS,oBAAoB,UAAgC,eAA0C;AAF9G;AAGC,MAAI,cAAc,4BAA4B,OAAO,GAAG;AACvD,UAAM,OAAM,cAAS,WAAT,mBAAiB;AAC7B,QAAI,SAAS,UAAU,KAAK;AAC3B,eAAS,OAAO,WAAW,IAAI;AAC/B,eAAS,OAAO,MAAM,IAAI;AAAA,IAC3B;AAAA,EACD;AACD;;;;ACPkC;AACA;AAE3B,SAAS,WAAW,UAAgC,eAA0C;AACpG,QAAM,WAAW,SAAS;AAC1B,MAAI,YAAY,iBAAiB;AAChC,WAAO;AAAA,EACR;AACA,UAAQ,UAAU;AAAA,IACjB,KAAK,SAAS;AACb,aAAO,mBAAmB,CAAC,UAAU,aAAa;AAAA,IACnD;AAAA,IACA,KAAK,SAAS;AACb,aAAO,mBAAmB,CAAC,UAAU,aAAa;AAAA,IACnD;AAAA,EACD;AACD;;;;AChBA,MAAM,eAAuC;AAAA,EAC5C,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,iBAAiB;AAClB;AAEO,SAAS,UAAU,UAAgC,eAA0C;AACnG,QAAM,WAAW,SAAS;AAC1B,QAAM,UAAU,aAAa,QAAQ;AACrC,MAAI,SAAS;AACZ,WAAO;AAAA,EACR;AACD;;;;;;ACXO,SAAS,yBAAyB,UAAgC,eAA0C;AAClH,MAAI,cAAc,4BAA4B,OAAO,GAAG;AACvD,aAAS,OAAO;AAEhB,UAAM,cAAsC;AAAA,MAC3C,KAAK;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,UAAU;AAAA,IACX;AACA,QAAI,SAAS,OAAO;AACnB,YAAM,mBAAmB,OAAO,KAAK,SAAS,KAAK;AACnD,eAAS,YAAY,kBAAkB;AACtC,cAAM,gBAAsC,SAAS,MAAM,QAAQ;AACnE,cAAM,gBAAgB,cAAc;AACpC,cAAM,mBAAmB,YAAY,aAAa,KAAK;AACvD,sBAAc,OAAO;AAAA,MACtB;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;;;;ACjDO,SAAS,wBAAwB,UAAgC,eAA0C;AACjH,MAAI,cAAc,4BAA4B,OAAO,GAAG;AACvD,UAAM,gBAAgB;AACtB,QAAI,SAAS,UAAU,MAAM;AAC5B,eAAS,SAAS,EAAC,OAAO,cAAa;AAAA,IACxC,OAAO;AACN,UAAI,SAAS,OAAO,SAAS,MAAM;AAClC,iBAAS,OAAO,QAAQ;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD;;;;ACXO,SAAS,yBAAyB,UAAgC,eAA0C;AAClH,MAAI,cAAc,4BAA4B,OAAO,GAAG;AACvD,UAAM,gBAAgB;AACtB,QAAI,SAAS,UAAU,MAAM;AAC5B,eAAS,SAAS,EAAC,OAAO,cAAa;AAAA,IACxC,OAAO;AACN,UAAI,SAAS,OAAO,SAAS,MAAM;AAClC,iBAAS,OAAO,QAAQ;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD;;;;ACbgC;AACH;AAKtB;AAEiB;AACe;AACD;AACC;AAChC,SAAS,WAAW,UAAgC,eAA0C;AAbrG;AAcC,QAAM,WAAW,SAAS;AAC1B,UAAQ,UAAU;AAAA,IACjB,KAAK,cAAc;AAClB,aAAO,wBAAwB,CAAC,UAAU,aAAa;AAAA,IACxD;AAAA,IACA,KAAK,YAAY;AAChB,aAAO,mDAAyB;AAAb,IACpB;AAAA,IACA,KAAK,QAAQ;AACZ,YAAM,OAAM,cAAS,WAAT,mBAAiB;AAC7B,UAAI,KAAK;AAGR,YAASA,kBAAT,SAAwBC,MAAwB;AAC/C,kBAAQA,MAAK;AAAA,YACZ,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,YACA,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,YACA,KAAK,oDAAqB;AAAH,YACvB,KAAK,sDAAsB,EAAE;AAC5B,qBAAO,2CAAqB;AAAT,YACpB;AAAA,YACA,KAAK,sDAAsB,EAAE;AAC5B,qBAAO,2CAAqB;AAAT,YACpB;AAAA,YACA,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,YACA,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,YACA,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,YACA,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,YACA,KAAK,oDAAqB,EAAE;AAC3B,qBAAO,yCAAoB;AAAR,YACpB;AAAA,UACD;AAAA,QAED;AAhCS,6BAAAD;AAFT,cAAM,MAAM,gDAAwB,CAAC,GAAG;AAoCxC,YAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,iBAAOA,gBAAe,GAAG;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAAA,IACA,KAAK,aAAa;AACjB,UAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,eAAO,8CAAyB;AAAR,MACzB;AAAA,IACD;AAAA,IACA,KAAK,OAAO;AACX,UAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,eAAO,yCAAoB;AAAR,MACpB;AAAA,IACD;AAAA,IACA,KAAK,iBAAiB;AACrB,UAAI,cAAc,4BAA4B,QAAQ,GAAG;AACxD,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAEA,UAAQ,UAAU;AAAA,IACjB,KAAK,gCAAc,EAAE;AACpB,aAAO,uBAAuB,CAAC,UAAU,aAAa;AAAA,IACvD;AAAA,IACA,KAAK,kCAAe,EAAE;AACrB,aAAO,wBAAwB,CAAC,UAAU,aAAa;AAAA,IACxD;AAAA,EACD;AACD;;;;ACxFO,SAAS,wBAAwB,UAAgC,eAA0C;AACjH,MAAI,cAAc,4BAA4B,OAAO,GAAG;AACvD,UAAM,gBAAgB;AACtB,QAAI,SAAS,UAAU,MAAM;AAC5B,eAAS,SAAS,EAAC,OAAO,cAAa;AAAA,IACxC,OAAO;AACN,UAAI,SAAS,OAAO,SAAS,MAAM;AAClC,iBAAS,OAAO,QAAQ;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD;;;;ACXO,SAAS,yBAAyB,UAAgC,eAA0C;AAClH,MAAI,cAAc,4BAA4B,OAAO,GAAG;AACvD,UAAM,gBAAgB;AACtB,QAAI,SAAS,UAAU,MAAM;AAC5B,eAAS,SAAS,EAAC,OAAO,cAAa;AAAA,IACxC,OAAO;AACN,UAAI,SAAS,OAAO,SAAS,MAAM;AAClC,iBAAS,OAAO,QAAQ;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD;;;;ACXwB;AACc;AACC;AAChC,SAAS,iBAAiB,UAAgC,eAA0C;AAC1G,QAAM,WAAW,SAAS;AAE1B,UAAQ,UAAU;AAAA,IACjB,KAAK,gCAAc,EAAE;AACpB,aAAO,uBAAuB,CAAC,UAAU,aAAa;AAAA,IACvD;AAAA,IACA,KAAK,kCAAe,EAAE;AACrB,aAAO,wBAAwB,CAAC,UAAU,aAAa;AAAA,IACxD;AAAA,EACD;AACD;;;;ACbO,MAAM,iBAAyC;AAAA,EACrD,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AACf;;;;ACX0B;AAEiB;AACb;AACP;AAIe;AACA;AACC;AAEgB;AAC9B;AACD;AACC;AACM;AACF;AAE7B,SAAS,gBAAgB,GAAW;AACnC,QAAM,WAAW,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACpD,QAAM,IAAI,SAAS,CAAC;AACpB,QAAM,IAAI,SAAS,CAAC;AACpB,QAAM,IAAI,SAAS,CAAC;AACpB,SAAO,MAAO,IAAI,IAAI,IAAI;AAC3B;AAEA,MAAM,0BAAmD;AAAA,EACxD,IAAI,uBAAuB,CAAC;AAAA,EAC5B,IAAI,uBAAuB,CAAC;AAAA,EAC5B,IAAI,wBAAwB,CAAC;AAC9B;AAEO,MAAM,0BAA0B;AAAA,EAEtC,YAA4B,eAAkC;AAAlC;AAC3B,UAAM,SAAS,cAAc,yBAAyB;AACtD,QAAI,QAAQ;AACX,WAAK,2BAA2B,gBAAgB,MAAM;AAAA,IACvD;AAAA,EACD;AAAA,EACA,sBAAsB;AACrB,WAAO,gBAAgB,6BAAQ,CAAC,EAAE,SAAS;AAAA,EAC5C;AAAA,EACA,4BAA4B,oBAA4B;AACvD,UAAM,aAAa,KAAK;AACxB,QAAI,cAAc,MAAM;AACvB,aAAO;AAAA,IACR;AACA,UAAM,kBAAkB,gBAAgB,kBAAkB;AAC1D,WAAO,aAAa;AAAA,EACrB;AAAA,EACA,gCAAgC,oBAA4B;AAC3D,UAAM,aAAa,KAAK,oBAAoB;AAE5C,UAAM,kBAAkB,gBAAgB,kBAAkB;AAC1D,WAAO,cAAc;AAAA,EACtB;AAAA,EACA,YAAY,MAA6B;AACxC,UAAM,gBAAyC,wBAAwB,OAAO,CAAC,iBAAiB;AAC/F,YAAM,kBAAkB,gBAAgB,aAAa,cAAc,CAAC;AACpE,UAAI,CAAC,KAAK,0BAA0B;AACnC,eAAO;AAAA,MACR;AAEA,aAAO,KAAK,2BAA2B,mBAAmB,KAAK,oBAAoB,KAAK;AAAA,IACzF,CAAC;AACD,eAAW,gBAAgB,eAAe;AACzC,cAAQ,IAAI,uBAAuB,aAAa,cAAc,GAAG;AACjE,aAAO,aAAa,YAAY,IAAI;AAAA,IACrC;AACA,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,YAA0B,UAAgC;AACzE,UAAM,WAAW,SAAS;AAC1B,UAAM,UAAU,WAAW,0BAA0B;AACrD,YAAQ,SAAS;AAAA,MAChB,KAAK;AAAA,MACL,KAAK,qCAAc,EAAE;AACpB,eAAO,oBAAoB,CAAC,UAAU,IAAI,KAAK;AAAA,MAChD;AAAA,MACA,KAAK,uCAAe,EAAE;AACrB,eAAO,UAAU,CAAC,UAAU,IAAI,KAAK;AAAA,MACtC;AAAA,MACA,KAAK,qCAAc,EAAE;AACpB,eAAO,SAAS,CAAC,UAAU,IAAI,KAAK;AAAA,MACrC;AAAA,MAIA,KAAK,uCAAe,EAAE;AACrB,eAAO,UAAU,CAAC,UAAU,IAAI,KAAK;AAAA,MACtC;AAAA,MACA,KAAK,yCAAgB,EAAE;AACtB,eAAO,cAAc,CAAC,QAAQ,KAAK;AAAA,MACpC;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EACA,cAAc,YAA0B,UAAgC;AACvE,UAAM,UAAU,WAAW,0BAA0B;AACrD,YAAQ,SAAS;AAAA,MAChB,KAAK;AAAA,MACL,KAAK,qCAAc,EAAE;AACpB,eAAO,kBAAkB,CAAC,UAAU,IAAI;AAAA,MACzC;AAAA,MACA,KAAK,qCAAc,EAAE;AACpB,eAAO,eAAe,CAAC,UAAU,IAAI;AAAA,MACtC;AAAA,MACA,KAAK,uCAAe,EAAE;AACrB,eAAO,gBAAgB,CAAC,UAAU,IAAI;AAAA,MACvC;AAAA,MACA,KAAK,yCAAgB,EAAE;AACtB,YAAI,KAAK,4BAA4B,QAAQ,GAAG;AAC/C,iBAAO,4BAA4B,CAAC,UAAU,IAAI;AAAA,QACnD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxFO,MAAM,mBAAmB;AAAA,EAC/B,YAAsB,MAAoB;AAApB;AAAA,EAAqB;AAAA,EAE3C,UAAU;AAAA,EAAC;AAAA,EAEX,OAAO,yBAAkC,OAA2B;AAvCrE;AAwCE,UAAM,OAA2B;AAAA,MAChC,MAAM,KAAK,KAAK,KAAK;AAAA,MACrB,MAAM,KAAK,KAAK,KAAK;AAAA,MACrB,eAAe,KAAK,KAAK,YAAY;AAAA,MACrC,UAAU,KAAK,KAAK,QAAQ;AAAA,MAC5B,cAAc,KAAK,KAAK,OAAO,OAAO;AAAA,MACtC,eAAe,KAAK,KAAK,OAAO,MAAM,QAAQ;AAAA,MAC9C,UAAU,KAAK,YAAY;AAAA,MAC3B,gBAAgB,KAAK,eAAe;AAAA,MACpC,QAAQ,KAAK,SAAS;AAAA,MACtB,iCAAiC,KAAK,6BAA6B;AAAA,MACnE,+BAA+B,KAAK,2BAA2B,KAAK,CAAC;AAAA,MACrE,gCAAgC,KAAK,4BAA4B,KAAK,CAAC;AAAA,MACvE,WAAW,KAAK,eAAe,sBAAsB;AAAA;AAAA,MAErD,+BAA+B,KAAK,KAAK,GAAG,OAAO,2BAA2B;AAAA,MAC9E,8BAA8B,KAAK,KAAK,GAAG,OAAO,oBAAoB;AAAA,MACtE,OAAO;AAAA;AAAA,QAEN,UAAS,gBAAK,KAAK,UAAV,mBAAiB,YAAjB,mBAA0B;AAAA,QACnC,SAAQ,gBAAK,KAAK,UAAV,mBAAiB,WAAjB,mBAAyB;AAAA,QACjC,WAAU,gBAAK,KAAK,UAAV,mBAAiB,aAAjB,mBAA2B;AAAA,MACtC;AAAA,MACA,WAAW;AAAA,IACZ;AAEA,QAAI,KAAK,KAAK,gBAAgB,KAAK,KAAK,KAAK,oBAAoB;AAChE,YAAM,kBAA4B,CAAC;AACnC,WAAK,KAAK,mBAAmB,UAAU,OAAO,eAAe;AAC7D,WAAK,WAAW,IAAI;AAAA,IACrB;AACA,QAAI,KAAK,KAAK,oBAAoB;AACjC,WAAK,UAAU,IAAI;AAAA,QAClB,QAAQ,KAAK,KAAK,mBAAmB,OAAO;AAAA,MAC7C;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,cAAc;AACb,WAAO,KAAK,KAAK,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC;AAAA,EAC7D;AAAA,EAEA,iBAAiB;AAChB,WAAO,KAAK,KAAK,GAAG,OAAO,eAAe;AAAA,EAC3C;AAAA,EAEA,WAAsD;AACrD,WAAO,KAAK,KAAK,GAAG,OAAO,OAAO,EAAE,IAAI,CAAC,SAAU,QAAQ,OAAO,KAAK,YAAY,IAAI,MAAU;AAAA,EAClG;AAAA,EAEA,+BAA6E;AA5F9E;AA6FE,YAAO,UAAK,KAAK,GAAG,YAClB,iBAAiB,MADZ,mBAEJ,IAAI,CAAC,eAAgB,cAAc,OAAO,WAAW,YAAY,IAAI;AAAA,EACzE;AAAA,EACA,6BAAkE;AACjE,YAAQ,KAAK,KAAK,GAAG,OAAO,2BAA2B,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAAA,EACtF;AAAA,EACA,8BAAmE;AAClE,YAAQ,KAAK,KAAK,GAAG,QAAQ,4BAA4B,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAAA,EACxF;AAAA,EAEA,0BAA0B,aAAuB,qBAA8B,OAAO;AACrF,WAAO,YAAY,IAAI,CAAC,eAAe;AACtC,aAAO,KAAK,KAAK,OAAO,IAAI,UAAU,EAAG,YAAY;AAAA,IACtD,CAAC;AAAA,EAeF;AAAA,EACA,eAAe,qBAA8B,OAAO;AACnD,WAAO,KAAK,0BAA0B,KAAK,KAAK,OAAO,OAAO,kBAAkB;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUD;;;;AC9GO,MAAM,oBAAyC;AAAA,EACrD,YAA4B,OAAsB;AAAtB;AAAA,EAAuB;AAAA,EAEnD,SAAiC;AAChC,UAAM,OAA+B;AAAA,MACpC,MAAM,KAAK,MAAM,KAAK;AAAA,MACtB,MAAM,KAAK,MAAM,KAAK;AAAA,MACtB,WAAW,KAAK,SAAS;AAAA,MACzB,OAAO,KAAK,MAAM;AAAA,MAClB,sBAAsB,KAAK,qBAAqB;AAAA,MAChD,YAAY,KAAK,WAAW;AAAA,MAC5B,eAAe,KAAK,MAAM,YAAY;AAAA;AAAA,MAEtC,eAAe,KAAK,cAAc;AAAA,MAClC,YAAY,KAAK,WAAW;AAAA,MAC5B,UAAU,KAAK,SAAS;AAAA;AAAA,MAExB,YAAY;AAAA,IACb;AAEA,QAAI,KAAK,MAAM,WAAW,KAAK,KAAK,MAAM,YAAY;AACrD,WAAK,YAAY,IAAI,KAAK,MAAM,WAAW,IAAI,CAAC,cAAc,UAAU,YAAY,CAAC;AAAA,IACtF;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,WAAW;AACV,WAAO,KAAK,MAAM,mBAAmB;AAAA,EACtC;AAAA,EACA,QAAQ;AACP,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACnC;AAAA,EACA,uBAAuB;AACtB,WAAO,KAAK,MAAM,6BAA6B;AAAA,EAChD;AAAA,EACA,aAAa;AA7Dd;AA8DE,WAAO,KAAK,MAAM,cAAc,KAAI,UAAK,MAAM,yBAAX,mBAAiC,eAAe;AAAA,EACrF;AAAA,EACA,gBAAgB;AACf,WAAO,KAAK,MAAM,OAAO,MAAM,QAAQ;AAAA,EACxC;AAAA,EACA,aAAa;AACZ,WAAO,KAAK,MAAM,QAAQ,UAAU;AAAA,EACrC;AAAA,EACA,WAAW;AACV,WAAO,KAAK,MAAM,QAAQ,SAAS;AAAA,EACpC;AACD;;;;;;;;;;;;;;;;;;;;;;;;ACjEO;AACiC;AACP;AACG;AACN;AACE;AACR;AACK;AAEa;AAEvB;AAEiB;AACZ;AAE4B;AAClB;AACb;AACY;AACC;AAqB3B,MAAM,oBAAoB;AAAA,EAKxB,cAAc;AAItB,SAAQ,0BAA0B,sCAAG,CAAC,KAAK;AAG3C,SAAQ,kBAAkB,sCAAG,CAAC,KAAK;AACnC,SAAQ,sBAAsB,sCAAG,CAAC,KAAK;AACvC,SAAQ,2BAA2B;AAAA,EATZ;AAAA,EAHvB,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,oBAAoB;AAAA,EACpE;AAAA,EAYA,yBAAyB,UAAiC;AACzD,SAAK,4BAA4B;AAAA,EAClC;AAAA,EACA,0BAA0B,UAAkC;AAC3D,SAAK,0BAA0B;AAAA,EAChC;AAAA,EACA,2BAA2B,OAAgB;AAC1C,SAAK,2BAA2B;AAAA,EACjC;AAAA,EACA,0BAA0B;AACzB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,yBAAyB;AACxB,WAAO,KAAK,wBAAwB;AAAA,EACrC;AAAA,EACA,mBAAmB,OAAgB;AAClC,SAAK,gBAAgB,QAAQ;AAAA,EAC9B;AAAA,EACA,uBAAuB,OAAgB;AACtC,SAAK,oBAAoB,QAAQ;AAAA,EAClC;AAAA,EACA,QAAQ;AACP,WAAO,KAAK;AAAA,EACb;AAAA,EACA,iBAA0B;AA1F3B;AA2FE,WAAO,KAAK,gBAAgB,WAAS,UAAK,WAAL,mBAAa,SAAQ;AAAA,EAC3D;AAAA,EACA,qBAA8B;AAC7B,WAAO,KAAK,oBAAoB;AAAA,EACjC;AAAA,EACA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EACc,eAAe,WAA0D;AAAA;AACtF,UAAI,gEAA4B,CAAC,GAAG;AACnC,cAAM,OAAO,MAAM,8EAAmC,CAAC,SAAS;AAChE,YAAI,MAAM;AACT,gBAAM,EAAC,WAAW,WAAU,IAAI;AAChC,4EAA6B,CAAC,UAAU;AACxC,iBAAO;AAAA,QACR;AAAA,MACD;AACA,UAAI,KAAK,2BAA2B;AACnC,eAAO,MAAM,KAAK,0BAA0B,SAAS;AAAA,MACtD,OAAO;AACN,gBAAQ,MAAM,gCAAgC;AAAA,MAC/C;AAAA,IACD;AAAA;AAAA,EACM,uBAAuB,WAA0B;AAAA;AACtD,YAAM,YAAY,MAAM,KAAK,eAAe,SAAS;AACrD,UAAI,WAAW;AACd,cAAM,QAAQ,MAAM,KAAK,oBAAoB,SAAS;AACtD,YAAI,CAAC,OAAO;AACX,kBAAQ,MAAM,sBAAsB;AACpC;AAAA,QACD;AAEA,aAAK,eAAe,KAAK;AACzB,YAAI,KAAK,yBAAyB;AACjC,gBAAM,KAAK,wBAAwB,KAAK;AAAA,QACzC;AACA,aAAK,wBAAwB,QAAQ;AACrC,eAAO;AAAA,MACR;AAAA,IACD;AAAA;AAAA,EACM,uBAAuB,WAAmB;AAAA;AAC/C,YAAM,WAAW,MAAM,sDAAqB,CAAC,GAAG,cAAc,SAAS;AACvE,WAAK,WAAW;AAChB,UAAI,CAAC,SAAS;AACb,gBAAQ,MAAM,sBAAsB,SAAS;AAC7C;AAAA,MACD;AAEA,YAAM,QAAQ,MAAM,KAAK,kBAAkB,OAAO;AAClD,WAAK,wBAAwB,QAAQ;AACrC,WAAK,eAAe,KAAK;AACzB,WAAK,mBAAmB,KAAK;AAC7B,WAAK,uBAAuB,IAAI;AAChC,aAAO;AAAA,IACR;AAAA;AAAA,EAEQ,eAAe,OAAmB;AACzC,SAAK,SAAS;AAEd,QAAI,CAAC,OAAO;AACX,YAAM,mBAAmB;AACzB;AAAA,IACD;AAEA,QAAI,OAAO;AACV,8DAAwB,CAAC,KAAK;AAAA,IAC/B;AAEA,IAAC,OAAe,QAAQ;AACxB,IAAC,OAAe,OAAO,gBAAI;AAE3B,0CAAe,CAAC,EAAE,IAAI,KAAK,KAAK,kBAAkB;AAClD,+FAAyC,CAAC;AAe1C,UAAM,QAAQ,kDAAqB,CAAC;AACpC,QAAI,oBAAoB,MAAM;AAC9B,QAAI,wBAAwB;AAC5B,QAAI,mBAAmB;AACtB,UAAI;AACH,kHAAiD,CAAC,iBAAiB;AACnE,gCAAwB;AAAA,MACzB,SAAS,KAAP;AACD,gBAAQ,MAAM,mCAAmC;AACjD,gBAAQ,IAAI,iBAAiB;AAAA,MAC9B;AAAA,IACD;AACA,QAAI,CAAC,uBAAuB;AAC3B,UAAI,eAAe,MAAM;AACzB,UAAI,CAAC,cAAc;AAClB,uBAAe,CAAC,MAAM,gBAAgB,GAAG;AAAA,MAC1C;AACA,UAAI,QAAQ;AACZ,UAAI,kBAAkB,aAAa,KAAK;AACxC,eAAS,QAAQ,GAAG,QAAQ,2DAAkC,EAAE,SAAS;AACxE,cAAM,cAAc,aAAa,KAAK,KAAK;AAC3C,cAAM,OAAO,MAAM,KAAK,WAAW;AACnC,YAAI,MAAM;AACT,4FAAqC,CAAC,6CAA2B,CAAC,KAAK,GAAG,IAAI;AAAA,QAC/E,OAAO;AAAA,QAEP;AACA;AACA,0BAAkB;AAAA,MACnB;AAAA,IACD;AAEA,QAAI,oBAAoB,MAAM;AAC9B,QAAI,qBAAqB,MAAM;AAC9B,0BAAqB,MAA4B;AAAA,IAClD;AACA,QAAI,mBAAmB;AACtB,gHAAiD,CAAC,iBAAiB;AAAA,IACpE;AACA,4GAAgD,CAAC,KAAK;AACtD,8GAAiD,CAAC,KAAK;AAAA,EACxD;AAAA,EAEgB,oBAAoB,WAAsB;AAAA;AACzD,YAAM,iBAAiB,OAAO;AAE9B,YAAM,wBAAwB,MAAY;AACzC,cAAME,YAAW,IAAI,8BAAiB,CAAC,UAAU,MAAM;AAAA,UACtD;AAAA,UACA,WAAW,UAAU;AAAA,UACrB,0BAA0B,+FAA2C,CAAC;AAAA,QACvE,CAAC;AACD,QAAAA,UAAS,iBAAiB,IAAI,yBAAyB,CAACA,SAAQ,CAAC;AACjE,cAAMC,SAAQ,MAAMD,UAAS,MAAM;AAAA,UAClC,qBAAqB,kBAAkB;AAAlB,UACrB,uBAAuB,mBAAmB;AAAnB,QACxB,CAAC;AACD,eAAO,EAAC,OAAAC,QAAO,UAAAD,UAAQ;AAAA,MACxB;AAYA,YAAM,EAAC,OAAO,SAAQ,IAAI,MAAM,sBAAsB;AACtD,UAAI,UAAU,MAAM;AACnB,cAAM,QAAQ,UAAU,IAAI;AAAA,MAC7B;AACA,UAAI,CAAC,UAAU;AACd,gBAAQ,MAAM,oBAAoB;AAClC;AAAA,MACD;AACA,8EAAgC,CAAC,SAAS,OAAO,SAAS,CAAC;AAG3D,YAAM,gBAAgB,SAAS,OAAO,SAAS;AAC/C,YAAM,0BAA0B,SAAS,OAAO,wBAAwB;AACxE,UAAI,eAAe;AAClB,4GAA8C,CAAC;AAAA,MAChD;AACA,UAAI,yBAAyB;AAC5B,0IAA6D,CAAC;AAAA,MAC/D;AACA,aAAO;AAAA,IACR;AAAA;AAAA,EAEgB,kBAAkB,SAAkB;AAAA;AA9QrD;AA+QE,cAAQ,IAAI,wBAAwB,QAAQ,KAAK,IAAI;AAErD,YAAM,QAAQ,IAAI,0BAAS,CAAC;AAAA,QAC3B,MAAM,EAAC,iBAAiB,kBAAkB;AAAA,QAC1C,uBAAuB,mBAAmB;AAAnB,MACxB,CAAC;AAED,eAAS,QAAQ,QAAQ,KAAK;AAC9B,YAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5B,WAAK,wBAAwB,QAAQ;AACrC,YAAM,kBAAkB,cAAc;AACtC,YAAM,OAAO,MAAM;AACnB,YAAM,EAAC,cAAc,YAAY,gBAAgB,YAAY,cAAa,IAAI,MAAM,QAAQ,KAAK;AAAA,QAChG;AAAA,QACA,MAAM;AAAN,MACD,CAAC;AACD,YAAM,KAAK,EAAE,qBAAqB,cAAc,UAAU;AAE1D,UAAI,mBAAmB;AACvB,UAAI,oBAAoB,MAAM;AAC7B,2BAAmB;AAAA,MACpB;AACA,YAAM,kBAAkB,aAAa;AACrC,YAAM,OAAO,QAAQ;AACrB,UAAI,kBAAkB;AACrB,iBAAe,oBAAmC;AAAA;AACjD,mBAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,oBACE,KAAK,EACL,aAAa,mBAAmB,CAAC,mBAA2B,SAA8B;AAC1F,oBAAI,qBAAqB,GAAG;AAC3B,0BAAQ;AAAA,gBACT;AAAA,cACD,CAAC;AAAA,YACH,CAAC;AAAA,UACF;AAAA;AACA,cAAM,kBAAkB;AACxB,YAAI,eAAe;AAClB,eAAK,iBAAiB;AAAA,QACvB;AACA,cAAM,KAAK;AAAA,MACZ;AACA,YAAM,QAAQ,kDAAqB,CAAC;AAGpC,UAAI,kBAAkB;AACtB,YAAM,YAAY,eAAe,aAAa,CAAC,IAAI;AACnD,UAAI,WAAW;AACd,cAAM,SAAS,UAAU,OAAO;AAChC,YAAI,QAAQ;AACX,4BAAkB,OAAO,KAAK;AAC9B,gBAAM,eAAe;AACrB,gBAAM,eAAe;AACrB,gBAAM,oBAAoB;AAC1B,cAAI,cAAc;AACjB,yBAAO,uBAAP,mBAA2B,UAAU,IAAI;AAAA,UAC1C;AAAA,QACD;AAAA,MACD;AAGA,UAAI,eAAe;AACnB,UAAI,gBAAgB,MAAM;AACzB,uBAAe;AAAA,MAChB;AACA,UAAI,cAAc;AACjB,cAAME,cAAa,IAAI,gCAAc,CAAC;AACtC,QAAAA,YAAW,cAAc,KAAK;AAAA,MAC/B;AAMA,YAAM,mBAAmB;AAEzB,aAAO;AAAA,IACR;AAAA;AAAA,EACA,eAAe;AACd,QAAI,KAAK,gBAAgB;AACxB,WAAK,eAAe;AAAA,IACrB;AAAA,EACD;AAAA,EAEA,0BAA0B;AAKzB,UAAM,kBAAkB,6EAAkC,CAAC;AAC3D,QAAI,iBAAiB;AACpB,YAAM,YAAY,kCAAe,CAAC,eAAe;AACjD,2CAAc,CAAC,8BAAW,CAAC,SAAS,CAAC;AAAA,IACtC;AAAA,EACD;AACD;AAEO,MAAM,iBAAiB,oBAAoB,SAAS;;;;;;;;;;;;;;;;;AChXvC;AACb,IAAK,UAAL,kBAAKC,aAAL;AACN,EAAAA,SAAA,WAAQ;AACR,EAAAA,SAAA,eAAY;AACZ,EAAAA,SAAA,iBAAc;AACd,EAAAA,SAAA,mBAAgB;AAChB,EAAAA,SAAA,eAAY;AACZ,EAAAA,SAAA,mBAAgB;AAChB,EAAAA,SAAA,oBAAiB;AACjB,EAAAA,SAAA,kBAAe;AACf,EAAAA,SAAA,oBAAiB;AACjB,EAAAA,SAAA,iBAAc;AACd,EAAAA,SAAA,iBAAc;AACd,EAAAA,SAAA,kBAAe;AACf,EAAAA,SAAA,kBAAe;AACf,EAAAA,SAAA,mBAAgB;AAChB,EAAAA,SAAA,kBAAe;AACf,EAAAA,SAAA,kBAAe;AACf,EAAAA,SAAA,mBAAgB;AAjBL,SAAAA;AAAA;AAoBL,MAAM,kBAA6B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEO,MAAM,YAAuB,CAAC,cAAa,EAAE,OAAO,eAAe;AAEnE,SAAS,SAAS,SAAkB;AAC1C,SAAO,OAAO;AACf;AACO,SAAS,aAAa,SAAkB;AAC9C,SAAO,GAAG,iFAAU,IAAI,SAAS,OAAO;AACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7CiD;AAIjD,MAAM,2BAA2B,MAAM,+IAAyC;AAChF,MAAM,UAAU,MAAM,uHAAwB;AAEvC,MAAM,WAAmC;AAAA,EAC/C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AACZ;AACO,SAAe,UAAU,kBAA0B,OAAuC;AAAA;AAChG,UAAM,eAAe,SAAS,gBAAgB,KAAK,oBAAoB;AACvE,QAAI,CAAC,cAAc;AAClB,cAAQ,KAAK,2BAA2B,+BAAO,MAAM,+BAAO,IAAI;AAChE;AAAA,IACD;AACA,QAAI;AACH,YAAM,WAAW,MAAM,2BAAO,GAAO,EAAE,aAAa,KAAK,CAAC;AAC1D,aAAO;AAAA,IACR,SAAS,KAAP;AAAA,IAAa;AAAA,EAChB;AAAA;AAEO,IAAK,YAAL,kBAAKC,eAAL;AAEN,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,aAAU;AACV,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,qCAAkC;AAElC,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AAEf,EAAAA,WAAA,aAAU;AAEV,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,+BAA4B;AAC5B,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,gBAAa;AAEb,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,UAAO;AAEP,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,gBAAa;AAEb,EAAAA,WAAA,cAAW;AAEX,EAAAA,WAAA,uBAAoB;AAEpB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,mBAAgB;AAqBhB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,mBAAgB;AAEhB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,4BAAyB;AACzB,EAAAA,WAAA,wCAAqC;AACrC,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,2CAAwC;AACxC,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,gCAA6B;AAE7B,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,2BAAwB;AACxB,EAAAA,WAAA,2BAAwB;AACxB,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,2BAAwB;AACxB,EAAAA,WAAA,kCAA+B;AAC/B,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,4BAAyB;AAEzB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,4BAAyB;AACzB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,iBAAc;AAjGH,SAAAA;AAAA;AAmGL,MAAM,cAA8B,oBAAI,IAAI;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAED,MAAM,eAA4B,CAAC,qCAAyB,iCAAsB;AAClF,MAAM,oBAA4C;AAAA,EACjD,CAAC,mCAAuB,GAAG;AAAA,EAC3B,CAAC,iCAAsB,GAAG;AAC3B;AAuCA,MAAM,eAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,MAAM,oBAA4C;AAAA,EACjD,CAAC,2CAA8B,GAAG;AAAA,EAClC,CAAC,yCAA6B,GAAG;AAAA,EACjC,CAAC,yCAA6B,GAAG;AAAA,EACjC,CAAC,gDAAiC,GAAG;AAAA,EACrC,CAAC,mDAAkC,GAAG;AAAA,EACtC,CAAC,oDAAmC,GAAG;AAAA,EACvC,CAAC,mDAAkC,GAAG;AAAA,EACtC,CAAC,mCAAuB,GAAG;AAAA,EAC3B,CAAC,oCAAoB,GAAG;AACzB;AACA,MAAM,oBAAiC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,MAAM,yBAAiD;AAAA,EACtD,CAAC,6CAA8B,GAAG;AAAA,EAClC,CAAC,iDAAgC,GAAG;AAAA,EACpC,CAAC,yEAA4C,GAAG;AAAA,EAChD,CAAC,qDAAkC,GAAG;AAAA,EACtC,CAAC,6EAA+C,GAAG;AAAA,EACnD,CAAC,qDAAkC,GAAG;AAAA,EACtC,CAAC,mDAAiC,GAAG;AAAA,EACrC,CAAC,oDAAkC,GAAG;AAAA,EACtC,CAAC,6CAA8B,GAAG;AAAA,EAClC,CAAC,2CAA6B,GAAG;AAAA,EACjC,CAAC,yDAAoC,GAAG;AACzC;AAEA,MAAM,gBAA6B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AACA,MAAM,qBAA6C;AAAA,EAClD,CAAC,qCAAwB,GAAG;AAAA,EAC5B,CAAC,uDAAiC,GAAG;AAAA,EACrC,CAAC,2CAA2B,GAAG;AAChC;AACA,MAAM,kBAA+B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AACA,MAAM,uBAA+C;AAAA,EACpD,CAAC,wCAA4B,GAAG;AAAA,EAChC,CAAC,4CAA8B,GAAG;AAAA,EAClC,CAAC,8CAA+B,GAAG;AAAA,EACnC,CAAC,8CAA+B,GAAG;AAAA,EACnC,CAAC,oDAAkC,GAAG;AAAA,EACtC,CAAC,8CAA+B,GAAG;AAAA,EACnC,CAAC,4DAAsC,GAAG;AAAA,EAC1C,CAAC,kDAAiC,GAAG;AAAA,EACrC,CAAC,gDAAgC,GAAG;AACrC;AAcO,MAAM,aAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrC;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,MACT;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,aAAa,IAAI,CAAC,YAAY;AACvC,aAAO;AAAA,QACN,OAAO;AAAA,QACP,MAAM,kBAAkB,OAAO;AAAA,MAChC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,MACT;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,MACZ;AAAA,IACD;AAAA,EACD;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,aAAa,IAAI,CAAC,YAAY;AACvC,aAAO;AAAA,QACN,OAAO;AAAA,QACP,MAAM,kBAAkB,OAAO;AAAA,MAChC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,kBAAkB,IAAI,CAAC,YAAY;AAC5C,aAAO;AAAA,QACN,OAAO;AAAA,QACP,MAAM,uBAAuB,OAAO;AAAA,QACpC,UACC,WAAW,wDACR;AAAA,UACA;AAAA,YACC,OAAO;AAAA,YACP,MAAM,uBAAuB,6EAA+C;AAAA,UAC7E;AAAA,QACA,IACA;AAAA,MACL;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO,+DAAQ,CAAC,sEAAa;AAAA,IAC7B,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO,EAAC,SAAS,sEAAa;AAAA,IAC9B,UAAU,0EAAmB,CAAC,CAAC,YAAY;AAC1C,aAAO;AAAA,QACN,OAAO,+DAAQ,CAAC,OAAO;AAAA,QACvB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,OAAO,EAAC,QAAO;AAAA,MAChB;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,cAAc,IAAI,CAAC,YAAY;AACxC,aAAO;AAAA,QACN,OAAO;AAAA,QACP,MAAM,mBAAmB,OAAO;AAAA,MACjC;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,gBAAgB,IAAI,CAAC,YAAY;AAC1C,aAAO;AAAA,QACN,OAAO;AAAA,QACP,MAAM,qBAAqB,OAAO;AAAA,MACnC;AAAA,IACD,CAAC;AAAA,EACF;AACD;AAGA,SAAS,eAAe,OAAmB,UAAwB;AAClE,WAAS,QAAQ,OAAO;AACvB,aAAS,IAAI;AACb,QAAI,KAAK,UAAU;AAClB,qBAAe,KAAK,UAAU,QAAQ;AAAA,IACvC;AAAA,EACD;AACD;AACA,SAAS,yBAAyB;AACjC,QAAM,OAAiC,CAAC;AACxC,iBAAe,YAAY,CAAC,SAAS;AACpC,SAAK,KAAK,KAAK,IAAI;AAAA,EACpB,CAAC;AACD,SAAO;AACR;AAEO,MAAM,sBAAsB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9enD,MAAM,eAAe;AAAA,EAE3B,YAA4B,UAAoB;AAApB;AAD5B,SAAQ,mBAAwC,oBAAI,IAAI;AAAA,EAIxD;AAAA,EAEA,SAAS,WAAmB,SAAiB;AAC5C,SAAK,iBAAiB,IAAI,WAAW,OAAO;AAAA,EAC7C;AAAA,EACA,aAAa;AACZ,QAAI,OAAiB,CAAC;AACtB,SAAK,iBAAiB,QAAQ,CAAC,OAAO,SAAS;AAC9C,WAAK,KAAK,IAAI;AAAA,IACf,CAAC;AACD,WAAO,KAAK,KAAK;AACjB,WAAO;AAAA,EACR;AAAA,EACA,gBAAgB,YAAoB;AACnC,WAAO,KAAK,iBAAiB,IAAI,UAAU;AAAA,EAC5C;AACD;;;;ACvB6B;AAItB,MAAM,SAAS;AAAA,EACrB,YAA4B,WAAsB;AAAtB;AAC5B,SAAgB,SAAS,IAAI,cAAc,CAAC,IAAI;AAAA,EADG;AAAA;AAGpD;;;;;;;ACPA,MAAM,mBAAmB,CAAC,OAAO,QAAQ,KAAK;AAC9C,MAAM,mBAAmB,CAAC,OAAO,OAAO,KAAK;AAC7C,MAAM,gBAAgB,CAAC,IAAI;AACL;AAItB,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyCjB,MAAM,gBAAgB;AACf,MAAM,YAAY;AAAA,EAKxB,YAAsB,SAAkB;AAAlB;AAJtB,SAAQ,yBAA8C,oBAAI,IAAI;AAC9D,SAAQ,kBAA8C,oBAAI,IAAI;AAC9D,SAAQ,eAAmD,oBAAI,IAAI;AAWnE;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,SAAiB;AACzB,SAAQ,eAAuB;AAC/B,SAAQ,WAAmB;AAC3B,SAAQ,WAAmB;AAC3B,SAAQ,YAAqB;AA0H7B;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,kBAA4B,CAAC;AAtIpC,SAAK,cAAc,EAAC,IAAI,qBAAqB,SAAS,SAAQ,CAAC;AAAA,EAChE;AAAA,EAYA,SAAS,OAAe;AACvB,SAAK,SAAS;AAAA,EACf;AAAA,EACA,QAAQ;AACP,WAAO,KAAK;AAAA,EACb;AAAA,EACA,eAAe,aAAqB;AACnC,SAAK,eAAe;AAAA,EACrB;AAAA,EACA,cAAc;AACb,WAAO,KAAK;AAAA,EACb;AAAA,EACA,WAAW,KAAa;AACvB,SAAK,WAAW;AAAA,EACjB;AAAA,EACA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EACA,WAAW,SAAiB;AAC3B,SAAK,WAAW;AAAA,EACjB;AAAA,EACA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EACA,YAAY,UAAmB;AAC9B,SAAK,YAAY;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe;AACd,WAAO,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG,KAAK,YAAY,GAAG,KAAK,QAAQ,GAAG,KAAK,aAAa,CAAC,EAAE,KAAK,IAAI;AAAA,EAC7G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAmB;AAClB,WAAO,UAAU,KAAK,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAyB;AACtC,UAAM,eAAe,KAAK,uBAAuB,IAAI,KAAK,EAAE;AAC5D,QAAI,cAAc;AACjB,cAAQ,MAAM,uBAAuB,KAAK,mBAAmB;AAC7D;AAAA,IACD;AACA,SAAK,uBAAuB,IAAI,KAAK,IAAI,KAAK,OAAO;AAAA,EACtD;AAAA,EACA,cAAsB;AACrB,UAAM,OAAiB,CAAC;AACxB,SAAK,uBAAuB,QAAQ,CAAC,SAAS,OAAO;AACpD,YAAM,MAAM;AAAA,aACF;AAAA,GACV;AAAA;AAEA,WAAK,KAAK,GAAG;AAAA,IACd,CAAC;AACD,WAAO,KAAK,KAAK,IAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAqB;AAC9B,UAAM,eAAe,KAAK,gBAAgB,IAAI,KAAK,EAAE;AACrD,QAAI,cAAc;AACjB,cAAQ,MAAM,mBAAmB,KAAK,mBAAmB;AACzD;AAAA,IACD;AACA,SAAK,gBAAgB,IAAI,KAAK,IAAI,IAAI;AAAA,EACvC;AAAA,EACQ,cAAwB;AAC/B,UAAM,OAAiB,CAAC;AACxB,SAAK,gBAAgB,QAAQ,CAAC,MAAM,OAAO;AAC1C,YAAM,MAAM,KAAK,WAAW,MAAM,EAAC,UAAU,KAAK,UAAS,CAAC;AAC5D,WAAK,KAAK,GAAG;AAAA,IACd,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EACA,UAAkB;AACjB,WAAO,KAAK,YAAY,EAAE,KAAK,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,KAAa,SAAiC;AAC3D,SAAK,aAAa,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,EACzC;AAAA,EACA,eAAuB;AACtB,UAAM,OAAiB,CAAC;AACxB,SAAK,aAAa,QAAQ,CAAC,SAAS,QAAQ;AAC3C,YAAM,MAAM,YAAY,sBAAsB,KAAK,OAAO;AAC1D,WAAK,KAAK,GAAG;AAAA,IACd,CAAC;AACD,WAAO,KAAK,KAAK,IAAI;AAAA,EACtB;AAAA,EAQA,WAAW;AACV,UAAM,OAAiB,CAAC;AACxB,aAAS,WAAW,KAAK,iBAAiB;AACzC,WAAK,KAAK,OAAO;AAAA,IAClB;AACA,WAAO,KAAK,KAAK,IAAI;AAAA,EACtB;AAAA,EAEA,WAAW,eAAuB;AACjC,SAAK,gBAAgB,KAAK,aAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB;AACnB,UAAM,OAAO,SAAS,qBAAqB,MAAM,EAAE,CAAC;AACpD,SAAK,gBAAgB,QAAQ,CAAC,MAAM,OAAO;AAC1C,YAAM,YAAY,SAAS,cAAc,QAAQ;AAIjD,gBAAU,YAAY,KAAK;AAC3B,gBAAU,KAAK;AACf,UAAI,KAAK,MAAM;AACd,kBAAU,OAAO,KAAK;AAAA,MACvB;AACA,WAAK,YAAY,SAAS;AAAA,IAC3B,CAAC;AAAA,EACF;AAAA,EACA,eAAe,UAAkB;AAChC,UAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,UAAM,WAAqB,CAAC;AAC5B,aAAS,QAAQ,OAAO;AACvB,UAAI,KAAK,SAAS,SAAS,GAAG;AAC7B,aAAK,gBAAgB,QAAQ,CAAC,MAAM,OAAO;AAC1C,gBAAM,MAAM,KAAK,WAAW,IAAI;AAChC,mBAAS,KAAK,GAAG;AAAA,QAClB,CAAC;AAAA,MACF;AACA,eAAS,KAAK,IAAI;AAAA,IACnB;AACA,WAAO,SAAS,KAAK,IAAI;AAAA,EAC1B;AAAA,EACQ,WAAW,MAAqB,SAAuB;AAC9D,UAAM,aAAuB,CAAC;AAC9B,eAAW,KAAK,OAAO,KAAK,KAAK;AACjC,QAAI,KAAK,MAAM;AACd,iBAAW,KAAK,SAAS,KAAK,OAAO;AAAA,IACtC;AACA,UAAM,UAAU,UAAU,kBAAS,CAAC,KAAK,OAAO,EAAE,OAAO,IAAI,KAAK;AAClE,WAAO;AAAA,UACC,WAAW,KAAK,GAAG;AAAA,GAC1B;AAAA;AAAA,EAEF;AAAA,EAEA,OAAO,sBAAsB,KAAa,SAAyC;AAClF,UAAM,eAAc,mCAAS,gBAAe;AAC5C,UAAM,cAAc,IAAI,MAAM,GAAG;AACjC,UAAM,cAAc,YAAY,CAAC,EAAE,MAAM,GAAG;AAC5C,UAAM,MAAM,YAAY,YAAY,SAAS,CAAC,EAAE,YAAY;AAC5D,QAAI,cAAc,mCAAS;AAE3B,QAAI,eAAe,MAAM;AACxB,oBAAc;AAEd,UAAI,iBAAiB,SAAS,GAAG,GAAG;AACnC,sBAAc;AAAA,MACf;AACA,UAAI,iBAAiB,SAAS,GAAG,GAAG;AACnC,sBAAc;AAAA,MACf;AACA,UAAI,cAAc,SAAS,GAAG,GAAG;AAChC,sBAAc;AAAA,MACf;AAAA,IACD;AAEA,UAAM,kBAAkB,cAAc,gBAAgB;AACtD,WAAO,6BAA6B,YAAY,gBAAgB;AAAA,EACjE;AACD;;;;ACzQO,MAAM,YAAY;AAAA,EAExB,YAAsB,SAAkB;AAAlB;AADtB,SAAQ,mBAAsD,oBAAI,IAAI;AAsBtE,SAAQ,uBAA4C,CAAC,cAAsB;AAC1E,aAAO,iBAAiB;AAAA,IACzB;AAAA,EAvByC;AAAA,EAEzC,OAAO,WAAmB,MAAe;AACxC,QAAI,WAAW,KAAK,iBAAiB,IAAI,SAAS;AAClD,QAAI,CAAC,UAAU;AACd,iBAAW,oBAAI,IAAI;AACnB,WAAK,iBAAiB,IAAI,WAAW,QAAQ;AAAA,IAC9C;AACA,aAAS,IAAI,KAAK,IAAI,IAAI;AAAA,EAC3B;AAAA,EACA,KAAK,WAA2B;AAC/B,UAAM,OAAiB,CAAC;AACxB,UAAM,WAAW,KAAK,iBAAiB,IAAI,SAAS;AACpD,QAAI,UAAU;AACb,eAAS,QAAQ,CAAC,MAAM,OAAO;AAC9B,aAAK,KAAK,KAAK,OAAO;AAAA,MACvB,CAAC;AAAA,IACF;AACA,WAAO,KAAK,KAAK,IAAI;AAAA,EACtB;AAAA,EAKA,YAAY,WAAmB;AAC9B,WAAO,KAAK,qBAAqB,SAAS;AAAA,EAC3C;AAAA,EACA,uBAAuB,UAA+B;AACrD,SAAK,uBAAuB;AAAA,EAC7B;AACD;;;;AC7BO,MAAM,cAAc;AAAA,EAE1B,YAAsB,SAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEzC,eAAe,aAA0C;AACxD,SAAK,eAAe;AAAA,EACrB;AAAA,EACA,cAA2C;AAC1C,WAAO,KAAK;AAAA,EACb;AACD;;;;ACtB0B;AACA;AACE;AAGrB,MAAM,QAAQ;AAAA,EACpB,YAA4B,WAAsB;AAAtB;AAC5B,SAAgB,OAAO,IAAI,WAAW,CAAC,IAAI;AAC3C,SAAgB,OAAO,IAAI,WAAW,CAAC,IAAI;AAC3C,SAAgB,SAAS,IAAI,aAAa,CAAC,IAAI;AAAA,EAHI;AAIpD;;;;ACEO,MAAM,UAAU;AAAA,EACtB,YAA4B,WAAsB;AAAtB;AAAA,EAAuB;AAAA,EAEnD,qBAAqB,UAA8B;AAClD,SAAK,sBAAsB;AAAA,EAC5B;AAAA,EACA,kBAAkB,MAA8B;AAC/C,QAAI,KAAK,qBAAqB;AAC7B,aAAO,KAAK,oBAAoB,IAAI;AAAA,IACrC;AAAA,EACD;AAAA,EAEA,gBAAgB,cAAsB;AACrC,SAAK,gBAAgB;AAAA,EACtB;AAAA,EACA,eAAe;AACd,WAAO,KAAK;AAAA,EACb;AACD;;;;AC5BO,MAAM,UAAU;AAAA,EAEtB,YAA4B,WAAsB;AAAtB;AAD5B,SAAgB,QAAQ,IAAI,MAAM;AAAA,EACiB;AACpD;AAEA,MAAM,MAAM;AAAA,EAAZ;AAEC,SAAQ,gCAAyC;AAAA;AAAA,EACjD,aAAa,WAAoB;AAChC,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,YAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA,EACA,gCAAgC,OAAgB;AAC/C,SAAK,gCAAgC;AAAA,EACtC;AAAA,EACA,+BAA+B;AAC9B,WAAO,KAAK;AAAA,EACb;AACD;;;;ACtBwB;AAGjB,MAAM,eAAe;AAAA,EAC3B,YAA4B,WAAsB;AAAtB;AAC5B,SAAgB,SAAS,IAAI,SAAS,CAAC,KAAK,SAAS;AAAA,EADF;AAEpD;;;;ACNuB;AACD;AACE;AACK;AAEtB,MAAM,UAAU;AAAA,EAAhB;AACN,SAAgB,OAAO,IAAI,OAAO,CAAC,IAAI;AACvC,SAAgB,QAAQ,IAAI,QAAQ,CAAC,IAAI;AACzC,SAAgB,SAAS,IAAI,SAAS,CAAC,IAAI;AAC3C,SAAgB,cAAc,IAAI,cAAc,CAAC,IAAI;AAAA;AAAA,EAGrD,eAAe,WAAmB;AACjC,SAAK,eAAe;AAAA,EACrB;AAAA,EACA,cAAc;AACb,WAAO,KAAK;AAAA,EACb;AACD;;;;;;AClBuB;AAGhB,MAAM,yBAAyB;AAAA,EAIrC,YAAsB,QAAgB;AAAhB;AAHtB,SAAQ,UAAU;AAClB,SAAQ,iBAA8B,sCAAG,CAAC,EAAE;AAC5C,SAAQ,wBAA8C,oBAAI,IAAI;AAAA,EACvB;AAAA,EACvC,SAAS;AACR,SAAK,WAAW;AAChB,WAAO,KAAK;AAAA,EACb;AAAA,EACA,wBAAwB,IAAY;AACnC,SAAK,sBAAsB,IAAI,IAAI,IAAI;AACvC,SAAK,mBAAmB;AAAA,EACzB;AAAA,EACA,0BAA0B,IAAY;AACrC,SAAK,sBAAsB,OAAO,EAAE;AACpC,SAAK,mBAAmB;AAAA,EACzB;AAAA,EAEQ,qBAAqB;AAC5B,SAAK,eAAe,QAAQ;AAC5B,SAAK,sBAAsB,QAAQ,CAAC,KAAK,OAAO;AAC/C,UAAI,KAAK,eAAe,SAAS,IAAI;AACpC,aAAK,eAAe,QAAQ;AAAA,MAC7B;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA,kBAAkB,IAAY;AAC7B,WAAO,KAAK,eAAe,SAAS;AAAA,EACrC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5BiC;AACK;AACG;AACT;AACF;AAaA;AAYvB;AACsB;AAoBtB;AAYiB;AAEe;AACN;AACJ;AACM;AACC;AAGZ;AACY;AAQ7B,MAAM,UAAN,MAAa;AAAA;AAAA,EAyFX,cAAc;AAvFtB,SAAQ,QAAoB,gCAAc;AAmB1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAgB,2BAA2B,IAAI,wBAAwB,CAAC,IAAI;AAE5E;AAAA,SAAQ,aAAoC;AAAA,MAC3C,CAAC,6CAAqB,GAAG;AAAA,MACzB,CAAC,6CAAqB,GAAG;AAAA,MACzB,CAAC,mCAAgB,GAAG;AAAA;AAAA,MAEpB,CAAC,iDAAuB,GAAG;AAAA,MAC3B,CAAC,mCAAgB,GAAG;AAAA,MACpB,CAAC,mCAAgB,GAAG;AAAA,MACpB,CAAC,yCAAmB,GAAG;AAAA;AAAA,MAEvB,CAAC,2DAA4B,GAAG;AAAA,MAChC,CAAC,uDAA0B,GAAG;AAAA,MAC9B,CAAC,uFAA0C,GAAG;AAAA,MAC9C,CAAC,mFAAwC,GAAG;AAAA,MAC5C,CAAC,iFAAuC,GAAG;AAAA,MAC3C,CAAC,+DAA8B,GAAG;AAAA,MAClC,CAAC,2CAAoB,GAAG;AAAA,MACxB,CAAC,qEAAiC,GAAG;AAAA,MACrC,CAAC,2EAAoC,GAAG;AAAA,MACxC,CAAC,iGAA+C,GAAG;AAAA,MACnD,CAAC,iGAA+C,GAAG;AAAA,MACnD,CAAC,+EAAsC,GAAG;AAAA,MAC1C,CAAC,qFAAyC,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAS7C,CAAC,uCAAkB,GAAG;AAAA;AAAA,MAEtB,CAAC,+DAA8B,GAAG;AAAA,MAClC,CAAC,yCAAmB,GAAG;AAAA;AAAA;AAAA,IAGxB;AAIA;AAAA;AAAA;AAAA,SAAgB,MAAM,IAAI,SAAS,CAAC;AAEpC;AAAA,SAAgB,OAAO;AAAA,MACtB,KAAK;AAAA,QACJ,0BAA0B;AAA1B,QACA,iBAAiB;AAAjB,QACA,uBAAuB;AAAvB,MACD;AAAA,MACA,MAAM;AAAA,QACL,eAAe;AAAf,MACD;AAAA,MACA,kBAAkB;AAAlB,MACA,QAAQ;AAAA;AAAA;AAAA;AAAA,QAIP,oBAAoB,0FAAyC;AAAlB,QAC3C,oBAAoB,0FAAyC;AAAlB,QAC3C,aAAa,4EAAkC;AAAX,QACpC,aAAa,4EAAkC;AAAX,QACpC,aAAa,4EAAkC;AAAX,QACpC,OAAO,gEAA4B;AAAL,MAC/B;AAAA,IACD;AAGC,WAAO,SAAS;AAIhB,oDAAoB,CAAC;AAAA,EA6CtB;AAAA,EACA,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,QAAO;AAAA,EACvD;AAAA,EAEQ,QAAQ,MAAkB;AACjC,SAAK,QAAQ;AAAA,EACd;AAAA,EACA,OAAO,QAAQ,MAAkB;AAChC,SAAK,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC7B;AAAA,EACA,OAAO;AACN,WAAO,KAAK;AAAA,EACb;AAAA,EACA,OAAO,OAAO;AACb,WAAO,KAAK,SAAS,EAAE;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,GAA0B,WAAc,UAAoC;AAClF,SAAK,SAAS,EAAE,aAAa,WAAW,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,8BAA8B;AAC7B,gHAAkD,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKM,aAAa;AAAA;AAClB,YAAM,WAAW,KAAK,WAAW,mCAAgB;AACjD,UAAI,UAAU;AACb,cAAM,KAAK,iBAAiB,QAAQ;AAAA,MACrC;AAAA,IACD;AAAA;AAAA,EACM,YAAY;AAAA;AACjB,YAAM,WAAW,KAAK,WAAW,mCAAgB;AACjD,UAAI,UAAU;AACb,cAAM,KAAK,iBAAiB,QAAQ;AAAA,MACrC;AAAA,IACD;AAAA;AAAA,EACM,gBAAgB;AAAA;AACrB,YAAM,WAAW,KAAK,WAAW,yCAAmB;AACpD,UAAI,UAAU;AACb,cAAM,KAAK,iBAAiB,QAAQ;AAAA,MACrC;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYM,kCAAkC;AAAA;AACvC,YAAM,WAAW,KAAK,WAAW,qFAAyC;AAC1E,UAAI,UAAU;AACb,cAAM,SAAS;AAAA,MAChB;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO;AACN,QAAI,WAAW,KAAK,WAAW,mCAAgB;AAC/C,QAAI,UAAU;AACb,WAAK,iBAAiB,QAAQ;AAAA,IAC/B,OAAO;AAAA,IAKP;AAAA,EACD;AAAA,EAEM,iBAAiB,UAA0B;AAAA;AAlVlD;AAmVE,YAAM,QAAQ,gDAAoB,CAAC;AACnC,UAAI,CAAC,OAAO;AACX,gBAAQ,KAAK,uCAAuC;AACpD;AAAA,MACD;AAKA,8FAAwC,CAAC,WAAW;AACpD,YAAM,YAAY,MAAM,yCAAoB,CAAC,EAAC,OAAO,qBAAqB,KAAI,CAAC;AAE/E,UAAI;AACH,YAAI,qFAAsC,CAAC,GAAG;AAC7C,gBAAM;AAAA,QACP;AAEA,cAAM,aAAa,KAAK,WAAW;AAEnC,mBAAK,aAAa,MAAlB,mBAAqB;AACrB,cAAM,SAAS,OAAO,WAAW,UAAU;AAAA,MAC5C,SAAS,KAAP;AACD,4FAAsC;AAAR,UAC7B;AAAA,QACD;AACA,gBAAQ,MAAM,GAAG;AAAA,MAClB;AAAA,IACD;AAAA;AAAA,EAEA,0BAA0B,OAA4B;AACrD,SAAK,0BAA0B;AAAA,EAChC;AAAA,EACA,eAAe;AACd,WAAO,KAAK;AAAA,EACb;AAAA,EACM,YAAY,SAAsB;AAAA;AAtXzC;AAuXE,UAAI,QAAQ,OAAO,GAAG;AACrB,gBAAQ,MAAM,0BAA0B,OAAO;AAC/C;AAAA,MACD;AACA,cAAQ,aAAa;AACrB,aAAM,UAAK,4BAAL,mBAA8B,mBAAmB;AAAA,IACxD;AAAA;AAAA,EACM,OAAO;AAAA;AA9Xd;AA+XE,aAAM,UAAK,4BAAL,mBAA8B;AAAA,IACrC;AAAA;AAAA,EACM,OAAO;AAAA;AAjYd;AAkYE,aAAM,UAAK,4BAAL,mBAA8B;AAAA,IACrC;AAAA;AAAA,EAEA,aAA+B;AAC9B,UAAM,cAAgC;AAAA,MACrC,gBAAgB,KAAK,MAAM,KAAK,UAAU,oBAAM,CAAC,wDAA2B,CAAC,CAAC;AAAA,MAC9E,cAAc,CAAC;AAAA,MACf,mBAAmB;AAAA,IACpB;AAEA,QAAI;AACH,YAAM,aAAa,gEAA4B,CAAC;AAChD,UAAI,YAAY;AACf,eAAO,WAAW;AAAA,MACnB,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IAED,SAAS,KAAP;AACD,cAAQ,IAAI,GAAG;AACf,YAAM;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EACA,uBAA4C;AA1Z7C;AA2ZE,UAAM,wBAAuB,UAAK,WAAW,EAAE,gBAAlB,mBAA+B;AAC5D,QAAI,wBAAwB,MAAM;AACjC,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBc,wBAAwB,UAAgC;AAAA;AACrE,YAAM,QAAQ,gDAAoB,CAAC;AACnC,UAAI,CAAC,OAAO;AACX,gBAAQ,KAAK,uCAAuC;AACpD;AAAA,MACD;AACA,UAAI,CAAC,MAAM,KAAK,GAAG;AAClB,cAAM,wFAAwC,CAAC;AAAA,UAC9C,OAAO;AAAA,UACP,SAAS;AAAA,QACV,CAAC;AACD;AAAA,MACD;AACA,UAAI,oHAAsD,CAAC,GAAG;AAC7D,wIAA4D,CAAC;AAC7D;AAAA,MACD;AACA,eAAS,KAAK;AAAA,IACf;AAAA;AAAA,EAEA,YAAY;AACX,UAAM,WAAW,KAAK,WAAW,6CAAqB;AACtD,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,iBAAiB;AAChB,QAAI,gEAA4B,CAAC,GAAG;AACnC,0GAA8C,CAAC;AAC/C;AAAA,IACD;AACA,UAAM,WAAW,KAAK,WAAW,6CAAqB;AACtD,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,iBAAiB;AAChB,UAAM,WAAW,KAAK,WAAW,mCAAgB;AACjD,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa;AACZ,UAAM,WAAW,KAAK,WAAW,iDAAuB;AACxD,QAAI,UAAU;AACb,WAAK,wBAAwB,QAAQ;AAAA,IACtC;AAAA,EACD;AAAA,EACA,gBAAgB;AACf,UAAM,WAAW,KAAK,WAAW,2CAAoB;AACrD,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,eAAe,MAAkC;AAChD,UAAM,WAAW,KAAK,WAAW,2DAA4B;AAC7D,QAAI,UAAU;AACb,eAAS,IAAI;AAAA,IACd,OAAO;AACN,cAAQ,MAAM,4BAA4B,2DAA4B;AAAA,IACvE;AAAA,EACD;AAAA,EACA,aAAa,MAAkC;AAC9C,UAAM,WAAW,KAAK,WAAW,uDAA0B;AAC3D,QAAI,UAAU;AACb,eAAS,IAAI;AAAA,IACd,OAAO;AACN,cAAQ,MAAM,4BAA4B,2DAA4B;AAAA,IACvE;AAAA,EACD;AAAA,EACM,4BAA4B,MAAoC;AAAA;AACrE,YAAM,WAAW,KAAK,WAAW,uFAA0C;AAC3E,UAAI,UAAU;AACb,cAAM,SAAS,IAAI;AAAA,MACpB;AAAA,IACD;AAAA;AAAA,EACM,0BAA0B,MAAkC;AAAA;AACjE,YAAM,WAAW,KAAK,WAAW,mFAAwC;AACzE,UAAI,UAAU;AACb,cAAM,SAAS,IAAI;AAAA,MACpB;AAAA,IACD;AAAA;AAAA,EACM,2BAA+D;AAAA,+CAAtC,OAAkC,CAAC,GAAG;AACpE,YAAM,WAAW,KAAK,WAAW,iFAAuC;AACxE,UAAI,UAAU;AACb,eAAO,MAAM,SAAS,IAAI;AAAA,MAC3B;AAAA,IACD;AAAA;AAAA,EACM,0BAA0B,GAAW;AAAA;AAC1C,YAAM,WAAW,KAAK,WAAW,+DAA8B;AAC/D,UAAI,UAAU;AACb,eAAO,MAAM,SAAS,EAAC,EAAC,CAAC;AAAA,MAC1B;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,SAAS;AACR,UAAM,WAAW,KAAK,WAAW,uCAAkB;AACnD,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,kBAAkB;AACjB,UAAM,OAAO,KAAwB,GAAgB,0BAA0B;AAC/E,SAAK,gBAAgB,GAAG,cAAc;AAAA,EAKvC;AAAA,EACA,mBAAmB;AAClB,UAAM,WAAW,KAAK,WAAW,+DAA8B;AAC/D,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA,EACA,uBAAuB;AACtB,UAAM,WAAW,KAAK,WAAW,yCAAmB;AACpD,QAAI,UAAU;AACb,eAAS;AAAA,IACV;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,aAAoC,YAAe,UAAoC;AACtF,SAAK,WAAW,UAAU,IAAI;AAAA,EAC/B;AAAA,EACA,SAAgC,YAAyC;AACxE,WAAO,KAAK,WAAW,UAAU;AAAA,EAClC;AAAA,EACA,aAAoC,YAAwB;AAC3D,WAAO,KAAK,WAAW,UAAU,KAAK;AAAA,EACvC;AAAA,EAEA,OAAO,kBAAkB;AACxB,SAAK,qBAAqB;AAAA,EAC3B;AAAA,EACA,OAAO,oBAAoB;AAC1B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0RA,gBAAgB,KAAa;AAC5B,UAAM,OAAO,SAAS,cAAc,GAAG;AAKvC,SAAK,aAAa,UAAU,QAAQ;AAQpC,SAAK,aAAa,QAAQ,GAAG;AAC7B,SAAK,MAAM;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBD;AA/0BO,IAAM,SAAN;AAAM,OA6gBG,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjmBZ;AAOlB;AACA,IAAK,gBAAL,kBAAKC,mBAAL;AACN,EAAAA,eAAA,mBAAgB;AAChB,EAAAA,eAAA,mBAAgB;AAChB,EAAAA,eAAA,kBAAe;AACf,EAAAA,eAAA,oBAAiB;AACjB,EAAAA,eAAA,wBAAqB;AACrB,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,uBAAoB;AACpB,EAAAA,eAAA,oBAAiB;AACjB,EAAAA,eAAA,qBAAkB;AAClB,EAAAA,eAAA,kBAAe;AACf,EAAAA,eAAA,eAAY;AAZD,SAAAA;AAAA;AAeZ,MAAM,aAAwC;AAAA,EAC7C,wBAAwB;AAAA,EACxB,QAAQ;AAAA,EACR,WAAW;AACZ;AAEA,MAAM,gBAAqC;AAAA,EAC1C,mBAAmB;AAAA,EACnB,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB;AACnE;AACA,MAAM,gBAAqC;AAAA,EAC1C,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB;AAAA,MAC7B,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB,EAAE,+EAAqB;AAAA,MACpD,mBAAmB;AAAA,MACnB,YAAY,EAAC,eAAe,MAAM,WAAW,EAAC;AAAA,IAC/C;AAAA,IACA,YAAY,sFAA+B;AAAR,EACpC;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB;AAAA,IAChD,mBAAmB;AAAA,IACnB,YAAY,EAAC,QAAQ,EAAC,UAAU,EAAC,GAAG,IAAI,GAAG,EAAC,GAAG,MAAM,IAAG,GAAG,SAAS,CAAC,GAAG,WAAW,EAAC;AAAA,EACrF;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,eAAoC;AAAA,EACzC,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB,EAAE,+EAAqB;AAAA,MACpD,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB;AAAA,MAClE,mBAAmB;AAAA,MACnB,YAAY,EAAC,eAAe,MAAM,WAAW,EAAC;AAAA,IAC/C;AAAA,IACA,YAAY,sFAA+B;AAAR,EACpC;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB;AAAA,IAChD,mBAAmB;AAAA,IACnB,YAAY,EAAC,QAAQ,EAAC,UAAU,EAAC,GAAG,IAAI,GAAG,EAAC,GAAG,MAAM,IAAG,GAAG,SAAS,CAAC,GAAG,WAAW,EAAC;AAAA,EACrF;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,iBAAsC;AAAA,EAC3C,aAAa;AAAA,EACb,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB;AAAA,IAClE,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACb;AAAA,EACA,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB;AAAA,MAChD,mBAAmB;AAAA,MACnB,YAAY;AAAA,QACX,QAAQ,EAAC,UAAU,EAAC,GAAG,oBAAoB,GAAG,oBAAmB,GAAG,MAAM,oBAAmB;AAAA,QAC7F,SAAS,CAAC;AAAA,QACV,WAAW;AAAA,MACZ;AAAA,IACD;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB;AAAA,MAChD,mBAAmB;AAAA,MACnB,YAAY,EAAC,eAAe,MAAM,WAAW,EAAC;AAAA,IAC/C;AAAA,IACA,YAAY,sFAA+B;AAAR,EACpC;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,qBAA0C;AAAA,EAC/C,aAAa;AAAA,EACb,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB;AAAA,IAClE,mBAAmB;AAAA,IACnB,YAAY,EAAC,eAAe,MAAM,WAAW,EAAC;AAAA,EAC/C;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB;AAAA,IAChD,mBAAmB;AAAA,IACnB,YAAY,EAAC,QAAQ,EAAC,UAAU,EAAC,GAAG,IAAI,GAAG,EAAC,GAAG,MAAM,IAAG,GAAG,SAAS,CAAC,GAAG,WAAW,EAAC;AAAA,EACrF;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,cAAmC;AAAA,EACxC,aAAa;AAAA,EACb,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB;AAAA,IAClE,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACb;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,+EAAqB;AAAA,IACvE,mBAAmB;AAAA,IACnB,YAAY,EAAC,WAAW,MAAK;AAAA,EAC9B;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,cAAmC;AAAA,EACxC,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,QACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB;AAAA,QAClE,mBAAmB;AAAA,QACnB,YAAY;AAAA,MACb;AAAA,MACA,cAAc;AAAA,QACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB;AAAA,QAClE,mBAAmB;AAAA,QACnB,YAAY,EAAC,eAAe,MAAM,WAAW,EAAC;AAAA,MAC/C;AAAA,MACA,YAAY,0FAAiC;AAAV,IACpC;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB,EAAE,+EAAqB;AAAA,MACzF,mBAAmB;AAAA,MACnB,YAAY,EAAC,WAAW,EAAC;AAAA,IAC1B;AAAA,IACA,YAAY,sFAA+B;AAAR,EACpC;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,+EAAqB;AAAA,IACvE,mBAAmB;AAAA,IACnB,YAAY,EAAC,QAAQ,EAAC,UAAU,EAAC,GAAG,IAAI,GAAG,GAAE,GAAG,MAAM,IAAG,GAAG,SAAS,CAAC,GAAG,WAAW,EAAC;AAAA,EACtF;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,oBAAyC;AAAA,EAC9C,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB;AAAA,MAClE,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,QACb,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB;AAAA,QAClE,mBAAmB;AAAA,QACnB,YAAY,EAAC,eAAe,MAAM,WAAW,EAAC;AAAA,MAC/C;AAAA,MACA,cAAc;AAAA,QACb,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB;AAAA,QAClE,mBAAmB;AAAA,QACnB,YAAY,EAAC,QAAQ,EAAC,UAAU,EAAC,GAAG,KAAK,GAAG,IAAG,GAAG,MAAM,IAAG,GAAG,SAAS,CAAC,GAAG,WAAW,EAAC;AAAA,MACxF;AAAA,MACA,YAAY,0FAAiC;AAAV,IACpC;AAAA,IACA,YAAY,0FAAiC;AAAV,EACpC;AAAA,EACA,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,QACb,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB,EAAE,+EAAqB;AAAA,QACzF,mBAAmB;AAAA,QACnB,YAAY,EAAC,WAAW,EAAC;AAAA,MAC1B;AAAA,MACA,cAAc;AAAA,QACb,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB;AAAA,QAClE,mBAAmB;AAAA,QACnB,YAAY,EAAC,eAAe,IAAI,WAAW,EAAC;AAAA,MAC7C;AAAA,MACA,YAAY,0FAAiC;AAAV,IACpC;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB,EAAE,uEAAiB,EAAE,qEAAgB;AAAA,MAClE,mBAAmB;AAAA,MACnB,YAAY,EAAC,QAAQ,EAAC,UAAU,EAAC,GAAG,KAAK,GAAG,IAAG,GAAG,MAAM,IAAG,GAAG,SAAS,CAAC,GAAG,WAAW,EAAC;AAAA,IACxF;AAAA,IACA,YAAY,0FAAiC;AAAV,EACpC;AAAA,EACA,YAAY,sFAA+B;AAC5C;AACA,MAAM,iBAAsC;AAAA,EAC3C,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB;AAAA,MAC7B,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,QACb,YAAY,CAAC,qEAAgB;AAAA,QAC7B,mBAAmB;AAAA,QACnB,YAAY,EAAC,WAAW,EAAC;AAAA,MAC1B;AAAA,MACA,cAAc;AAAA,QACb,YAAY,CAAC,uEAAiB;AAAA,QAC9B,mBAAmB;AAAA,QACnB,YAAY;AAAA,UACX,QAAQ,EAAC,UAAU,EAAC,GAAG,oBAAoB,GAAG,kBAAiB,GAAG,MAAM,IAAG;AAAA,UAC3E,SAAS,EAAC,OAAO,EAAC,UAAU,EAAC,GAAG,oBAAoB,GAAG,kBAAiB,GAAG,MAAM,IAAG,EAAC;AAAA,UACrF,WAAW;AAAA,QACZ;AAAA,MACD;AAAA,MACA,YAAY,sFAA+B;AAAR,IACpC;AAAA,IACA,YAAY,sFAA+B;AAAR,EACpC;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB,EAAE,iFAAsB;AAAA,IAC1F,mBAAmB;AAAA,IACnB,YAAY,EAAC,WAAW,EAAC;AAAA,EAC1B;AAAA,EACA,YAAY,0FAAiC;AAC9C;AACA,MAAM,kBAAuC;AAAA,EAC5C,aAAa;AAAA,EACb,cAAc;AAAA,IACb,YAAY,CAAC,6EAAoB;AAAA,IACjC,mBAAmB;AAAA,IACnB,YAAY,EAAC,WAAW,EAAC;AAAA,EAC1B;AAAA,EACA,cAAc;AAAA,EACd,YAAY,0FAAiC;AAC9C;AACA,MAAM,eAAoC;AAAA,EACzC,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB;AAAA,MAC7B,mBAAmB;AAAA,MACnB,YAAY;AAAA,QACX,QAAQ;AAAA,QACR,wBAAwB;AAAA,QACxB,WAAW;AAAA,QACX,kBAAkB;AAAA,UACjB,SAAS;AAAA,UACT,WAAW;AAAA,UACX,gBAAgB;AAAA,YACf,QAAQ,EAAC,UAAU,EAAC,GAAG,GAAG,GAAG,EAAC,GAAG,MAAM,EAAC;AAAA,YACxC,SAAS,CAAC;AAAA,YACV,iBAAiB;AAAA,YACjB,WAAW;AAAA,UACZ;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,6EAAoB,EAAE,+EAAqB;AAAA,MACxD,mBAAmB;AAAA,MACnB,YAAY,EAAC,MAAM,IAAG;AAAA,IACvB;AAAA,IACA,YAAY,sFAA+B;AAAR,EACpC;AAAA,EACA,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,uEAAiB,EAAE,qEAAgB,EAAE,qEAAgB,EAAE,iFAAsB;AAAA,MAC1F,mBAAmB;AAAA,MACnB,YAAY,EAAC,WAAW,GAAG,iBAAiB,CAAC,EAAC;AAAA,IAC/C;AAAA,IACA,cAAc;AAAA,MACb,YAAY,CAAC,uEAAiB;AAAA,MAC9B,mBAAmB;AAAA,MACnB,YAAY;AAAA,QACX,QAAQ,EAAC,UAAU,EAAC,GAAG,mBAAmB,GAAG,mBAAkB,GAAG,MAAM,mBAAkB;AAAA,QAC1F,SAAS,EAAC,KAAK,EAAC,UAAU,EAAC,GAAG,mBAAmB,GAAG,mBAAkB,GAAG,MAAM,mBAAkB,EAAC;AAAA,QAClG,iBAAiB;AAAA,QACjB,WAAW;AAAA,MACZ;AAAA,IACD;AAAA,IACA,YAAY,0FAAiC;AAAV,EACpC;AAAA,EACA,YAAY,0FAAiC;AAC9C;AAEA,MAAM,YAAiC;AAAA,EACtC,aAAa;AAAA,EACb,cAAc;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY,CAAC,qEAAgB;AAAA,MAC7B,mBAAmB;AAAA,MACnB,YAAY,EAAC,WAAW,EAAC;AAAA,IAC1B;AAAA,IACA,cAAc;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,QACb,YAAY,CAAC,qEAAgB;AAAA,QAC7B,mBAAmB;AAAA,QACnB,YAAY,EAAC,WAAW,EAAC;AAAA,MAC1B;AAAA,MACA,cAAc;AAAA,QACb,YAAY,CAAC,uEAAiB;AAAA,QAC9B,mBAAmB;AAAA,QACnB,YAAY,EAAC,WAAW,EAAC;AAAA,MAC1B;AAAA,MACA,YAAY,0FAAiC;AAAV,IACpC;AAAA,IACA,YAAY,0FAAiC;AAAV,EACpC;AAAA,EACA,cAAc;AAAA,IACb,YAAY,CAAC,2EAAmB,EAAE,uEAAiB;AAAA,IACnD,mBAAmB;AAAA,IACnB,YAAY,EAAC,WAAW,EAAC;AAAA,EAC1B;AAAA,EACA,YAAY,sFAA+B;AAC5C;AACO,MAAM,SAAqD;AAAA,EACjE,CAAC,mCAA2B,GAAG;AAAA,EAC/B,CAAC,mCAA2B,GAAG;AAAA,EAC/B,CAAC,iCAA0B,GAAG;AAAA,EAC9B,CAAC,iCAA0B,GAAG;AAAA,EAC9B,CAAC,qCAA4B,GAAG;AAAA,EAChC,CAAC,2CAAgC,GAAG;AAAA,EACpC,CAAC,+BAAyB,GAAG;AAAA,EAC7B,CAAC,+BAAyB,GAAG;AAAA,EAC7B,CAAC,2CAA+B,GAAG;AAAA,EACnC,CAAC,qCAA4B,GAAG;AAAA,EAChC,CAAC,uCAA6B,GAAG;AAAA,EACjC,CAAC,kCAAuB,GAAG;AAC5B;AAEA,SAAS,eAAe,UAA+B,UAA0C;AAChG,QAAM,EAAC,YAAY,cAAc,aAAY,IAAI;AACjD,MAAI,YAAY;AACf,aAAS,UAAU;AACnB;AAAA,EACD,OAAO;AACN,QAAI,gBAAgB,cAAc;AACjC,qBAAe,cAAc,QAAQ;AACrC,qBAAe,cAAc,QAAQ;AACrC;AAAA,IACD;AAAA,EACD;AACA,UAAQ,KAAK,oDAAoD,QAAQ;AAC1E;AACA,SAAS,eAAe,UAA+B;AACtD,QAAM,MAAmB,oBAAI,IAAI;AACjC,iBAAe,UAAU,CAAC,cAAc;AACvC,QAAK,UAAwC,wBAAwB;AACpE,YAAMC,cAAa;AACnB,UAAIA,YAAW,QAAQ;AACtB,YAAI,IAAIA,YAAW,MAAM;AAAA,MAC1B;AAAA,IACD;AAAA,EACD,CAAC;AACD,SAAO,4FAAU,CAAC,KAAK,CAAC,CAAC;AAC1B;AACA,SAAS,eAAe,UAA+B,aAAuB;AAC7E,iBAAe,UAAU,CAAC,cAAc;AACvC,QAAK,UAAwC,wBAAwB;AACpE,YAAMA,cAAa;AAGnB,YAAM,SAAS,YAAY,SAAS,IAAI,YAAY,MAAM,IAAI,YAAY,CAAC;AAC3E,MAAAA,YAAW,SAAS;AAAA,IACrB;AAAA,EACD,CAAC;AACF;AACO,SAAS,oBAAoB,SAA8B,MAA2B;AAC5F,QAAM,cAAc,eAAe,OAAO;AAC1C,iBAAe,MAAM,WAAW;AACjC;AAEO,SAAS,0BAA0B,SAA8B,WAA2C;AAClH,QAAM,gBAAgB,MAAM;AAC3B,QAAK,QAAQ,aAAa,0FAAiC,EAAG;AAC7D,YAAM,aAAa,QAAQ;AAC3B,UAAI,YAAY;AACf,cAAM,kBAAkB,WAAW,cAAc,CAAC,GAAG,WAAW,qBAAqB,CAAC;AACtF,eAAO,kBAAkB;AAAA,MAC1B;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAEA,QAAM,eAAe,cAAc;AAEnC,MAAI,cAAc;AACjB,UAAM,YAAY,QAAQ;AAC1B,QAAI,CAAC,WAAW;AACf,aAAO;AAAA,IACR;AAEA,YAAQ,eAAe,UAAU;AACjC,YAAQ,eAAe,UAAU;AACjC,YAAQ,aAAa,UAAU;AAC/B,YAAQ,cAAc,UAAU;AAChC,YAAQ,aAAa,UAAU;AAAA,EAChC,OAAO;AACN,UAAM,gBAAgB,mBAAI;AAC1B,YAAQ,eAAe;AACvB,YAAQ,eAAe;AAAA,MACtB,YAAY,CAAC,SAAS;AAAA,MACtB,mBAAmB;AAAA,IACpB;AACA,YAAQ,aAAa,0FAAiC;AACtD,YAAQ,cAAc;AACtB,YAAQ,aAAa,CAAC;AAAA,EACvB;AAcA,SAAO;AACR;AAEO,SAAS,4BAA4B,SAAmD;AAC9F,SAAO,0BAA0B,SAAS,iFAAsB;AACjE;AACO,SAAS,0BAA0B,SAAmD;AAC5F,SAAO,0BAA0B,SAAS,6EAAoB;AAC/D;AACO,SAAS,4BAA4B,SAAmD;AAC9F,SAAO,0BAA0B,SAAS,iFAAsB;AACjE;;;;;;;;;;;;;;;;;AC/c0B;AACH;AACF;AAEa;AAE3B,MAAM,4BAA4B;AAAA,EAAlC;AAMN,SAAQ,cAAc,kDAAG,CAAC,KAAK;AAC/B,SAAQ,gBAAgD,oBAAI,IAAI;AAChE,SAAQ,YAAiC,CAAC;AAC1C,SAAgB,YAA6C,kDAAG,CAAC,IAAI;AAAA;AAAA,EAPrE,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,4BAA4B;AAAA,EAC5E;AAAA,EAOA,aAAa;AACZ,WAAO,KAAK,YAAY;AAAA,EACzB;AAAA,EACA,cAAc,OAAgB;AAC7B,SAAK,YAAY,QAAQ;AACzB,QAAI,SAAS,MAAM;AAClB,WAAK,UAAU,OAAO,GAAG,KAAK,UAAU,MAAM;AAC9C,WAAK,cAAc,QAAQ,CAAC,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACnE;AAAA,EACD;AAAA,EAEA,SAAS;AACR,UAAM,gBAAgB,MAAM;AAC3B,YAAM,SAAS,wHAAwB,CAAC;AACxC,WAAK,cAAc,IAAI,OAAO,IAAI,MAAM;AACxC,aAAO;AAAA,IACR;AACA,QAAI,CAAC,KAAK,WAAW,GAAG;AACvB,YAAM,SAAS,cAAc;AAC7B,aAAO;AAAA,IACR,OAAO;AACN,aAAO,KAAK,UAAU,MAAM,KAAK,cAAc;AAAA,IAChD;AAAA,EACD;AAAA,EACA,aAAa,YAAiC,UAAwD;AACrG,SAAK,cAAc,IAAI;AACvB,UAAM,oBAAoB,sEAAe,CAAC,EAAE,WAAW;AACvD,UAAM,mBAAwC,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnF,0EAAmB,CAAC,kBAAkB,gBAAgB,gBAAgB;AACtE,aAAS,gBAAgB;AACzB,SAAK,UAAU,QAAQ;AACvB,eAAW,MAAM;AAChB,WAAK,cAAc,KAAK;AAAA,IACzB,GAAG,GAAI;AAAA,EACR;AACD;AAEO,MAAM,yBAAyB,4BAA4B,SAAS;;;;;;;;;;;;;;;ACtD1C;AACH;AAyBvB,SAAS,kBAAkB,gBAAgE;AACjG,QAAM,kCAAsD,kDAAG,CAAC,IAAI;AAOpE,QAAM,yBAAyB,uDAAQ,CAAC,MAAM;AAI7C,UAAM,iBAAiB,kJAA4C,CAAC,eAAe,UAAU,KAAK;AAClG,QAAI,gBAAgB;AACnB,YAAM,mBAAmB,0HAAgC,CAAC,cAAc;AACxE,UAAI,oBAAoB,iBAAiB,WAAW;AACnD,cAAM,KAAK,iBAAiB,UAAU,CAAC;AACvC,YAAI,MAAM,MAAM;AACf,0CAAgC,QAAQ;AAAA,QACzC;AACA,eAAO;AAAA,MACR;AAAA,IACD;AACA,WAAO;AAAA,EACR,CAAC;AACD,QAAM,qCAAqC,uDAAQ,CAAC,MAAM;AACzD,WAAO,uBAAuB,SAAS,gCAAgC;AAAA,EACxE,CAAC;AAUD,QAAM,2BAA2B,uDAAQ,CAAC,MAAM;AAC/C,QAAI,uBAAuB,OAAO;AACjC,aAAO,0HAAgC,CAAC,uBAAuB,KAAK;AAAA,IACrE,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACD,QAAM,8BAA8B,uDAAQ,CAAC,MAAM;AAClD,QAAI,gCAAgC,OAAO;AAC1C,aAAO,0HAAgC,CAAC,gCAAgC,KAAK;AAAA,IAC9E,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACD,QAAM,uCAAuC,uDAAQ,CAAC,MAAM;AAC3D,WAAO,yBAAyB,SAAS,4BAA4B;AAAA,EACtE,CAAC;AAOD,QAAM,qBAAqB,uDAAQ,CAAC,MAAM;AAtF3C;AAuFE,YAAO,8BAAyB,UAAzB,mBAAgC;AAAA,EACxC,CAAC;AACD,QAAM,qBAAqB,uDAAQ,CAAC,MAAM;AAzF3C;AA0FE,YAAO,8BAAyB,UAAzB,mBAAgC;AAAA,EACxC,CAAC;AACD,QAAM,qBAAqB,uDAAQ,CAAC,MAAM;AA5F3C;AA6FE,YAAO,iCAA4B,UAA5B,mBAAmC;AAAA,EAC3C,CAAC;AACD,QAAM,qBAAqB,uDAAQ,CAAC,MAAM;AA/F3C;AAgGE,YAAO,iCAA4B,UAA5B,mBAAmC;AAAA,EAC3C,CAAC;AACD,QAAM,iCAAiC,uDAAQ,CAAC,MAAM;AACrD,WAAO,mBAAmB,SAAS,mBAAmB;AAAA,EACvD,CAAC;AACD,QAAM,iCAAiC,uDAAQ,CAAC,MAAM;AACrD,WAAO,mBAAmB,SAAS,mBAAmB;AAAA,EACvD,CAAC;AAcD,WAAS,sBAAsB;AAC9B,UAAM,KAAK,uBAAuB;AAClC,QAAI,IAAI;AACP,aAAO,gHAA2B,CAAC,EAAE;AAAA,IACtC;AACA,WAAO;AAAA,EACR;AACA,WAAS,gBAAgB;AACxB,UAAM,KAAK,gCAAgC;AAC3C,QAAI,IAAI;AACP,aAAO,gHAA2B,CAAC,EAAE;AAAA,IACtC;AACA,WAAO;AAAA,EACR;AACA,WAAS,yBAAyB;AACjC,WAAO,oBAAoB,KAAK,cAAc;AAAA,EAC/C;AAEA,SAAO;AAAA;AAAA,IAEN;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,EACD;AACD;;;;;;;;;;;;;;;ACzJuB;AAWhB,MAAM,8BAA2C,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE/E,SAAS,uBAAuB,OAAe;AAC9C,SAAO,4BAA4B,SAAS,KAAkB;AAC/D;AACO,MAAM,iBAAiB;AAAA,EAC7B,WAAW;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,EACZ;AACD;AAYO,SAAS,eAAe,eAAiD;AAC/E,MAAI,iBAAiB,MAAM;AAC1B,oBAAgB,4BAA4B,CAAC;AAAA,EAC9C;AACA,QAAM,YAAY,kDAAG,CAAC,aAAa;AAEnC,WAAS,SAAS,MAA+B;AAChD,UAAM,eAAe,KAAK,WAAW;AACrC,QAAI,gBAAgB,MAAM;AACzB,gBAAU,QAAQ;AAAA,IACnB;AAAA,EACD;AACA,WAAS,SAAS;AACjB,WAAO;AAAA,MACN,WAAW,UAAU;AAAA,IACtB;AAAA,EACD;AAEA,WAAS,kBAAkB,OAAkB;AAC5C,cAAU,QAAQ;AAAA,EACnB;AAEA,SAAO,EAAC,WAAW,mBAAmB,UAAU,OAAM;AACvD;;;;;;;;;;;;;;;ACzDqE;AACzC;AAG5B,MAAM,iBAAiB,CAAC,qEAAgB,EAAE,qEAAgB,EAAE,uEAAiB;AAEtE,MAAM,iBAAsC;AAAA,EAClD,YAAY,0FAAiC;AAAV,EACnC,aAAa;AAAA,EACb,cAAc;AAAA,IACb,YAAY,sFAA+B;AAAR,IACnC,aAAa;AAAA,IACb,cAAc;AAAA,MACb,YAAY;AAAA,MACZ,mBAAmB,eAAe,QAAQ,qEAAgB;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACb,YAAY;AAAA,MACZ,mBAAmB,eAAe,QAAQ,qEAAgB;AAAA,IAC3D;AAAA,EACD;AAAA,EACA,cAAc;AAAA,IACb,YAAY;AAAA,IACZ,mBAAmB,eAAe,QAAQ,uEAAiB;AAAA,EAC5D;AACD;AAEO,SAAS,6BAEf,cACA,cACA,YAEA,kCAGC;AACD,QAAM,YAAY,uDAAQ,CAAC,MAAM;AAChC,WAAQ,iCAAiC,EAAE,WAAmB,aAAa;AAAA,EAC5E,CAAC;AAED,WAAS,aAAkC;AAC1C,QAAI,WAAW,QAAQ,OAAO;AAC7B,YAAM,OAA4B;AAAA,QACjC,aAAa,WAAW,YAAY;AAAA,QACpC,cAAe,aAAa,MAAc,WAAW;AAAA,QACrD,cAAe,aAAa,MAAc,WAAW;AAAA,MACtD;AACA,UAAI,WAAW,WAAW,OAAO;AAChC,aAAK,YAAY,IAAI,WAAW,WAAW;AAAA,MAC5C;AACA,aAAO;AAAA,IACR,OAAO;AACN,aAAO,iCAAiC;AAAA,IAQzC;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpEqB;AAEE;AACa;AACN;AAGvB,SAAe,gBAAgB,MAAoB;AAAA;AACzD,QAAI,KAAK,oBAAoB,GAAG;AAC/B,cAAQ,KAAK,4EAA4E;AACzF;AAAA,IACD;AAEA,UAAM,iBAAiB,KAAK,OAAO,QAAQ;AAC3C,UAAM,YAAoB,iBAAiB,kBAAkB,cAAc,EAAE,KAAK,MAAM,IAAI;AAC5F,UAAM,cAAuB,kBAAkB,QAAQ,kBAAkB;AACzE,UAAM,QAAQ,cAAc,mBAAmB;AAC/C,UAAM,cAAc,MAAM,0IAAwC,CAAC;AAAA,MAClE;AAAA,MACA,WAAW;AAAA,MACX,cAAc,aAAa;AAAA,MAC3B,cAAc;AAAA,IACf,CAAC;AACD,QAAI,eAAe,MAAM;AACxB;AAAA,IACD;AACA,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AACA,UAAM,MAAM,IAAI,4FAAqB,CAAC,QAAQ,MAAM,WAAW;AAC/D,UAAM,sEAAe,CAAC,EAAE,YAAY,GAAG;AAAA,EACxC;AAAA;AAEO,SAAS,kBAAkB,SAAiB;AAClD,WAAS,qBAAqB,MAAwB;AACrD,UAAM,aAAa,KAAK,MAAM,EAAE;AAChC,UAAM,WAAqB,CAAC;AAC5B,QAAI,QAAQ;AACZ,aAAS,aAAa,YAAY;AACjC,YAAM,WAAW,UAAU,WAAW,CAAC;AACvC,UAAI,YAAY,IAAI;AACnB;AAAA,MACD,OAAO;AACN,iBAAS,KAAK,IAAI,SAAS,KAAK,KAAK;AACrC,iBAAS,KAAK,KAAK;AAAA,MACpB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAGA,MAAI,WAAW,QAAQ,MAAM,QAAQ;AASrC,QAAM,QAAkB,CAAC;AACzB,WAAS,WAAW,UAAU;AAC7B,UAAM,eAAe,qBAAqB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC1F,aAAS,KAAK,cAAc;AAC3B,UAAI;AACH,iBAAS,KAAK,GAAG;AAChB,cAAI,GAAG;AACN,kBAAM,KAAK,CAAC;AAAA,UACb;AAAA,QACD;AAAA,IACF;AAAA,EACD;AACA,SAAO,MAAM,OAAO,CAAC,SAAS,QAAQ,KAAK;AAC5C;AAEO,SAAS,iBACf,WAWC;AACD,QAAM,UAAU,uDAAQ,CAAC,MAAM;AAC9B,WAAO,UAAU,aAAa;AAAA,EAC/B,CAAC;AACD,QAAM,iBAAiB,uDAAQ,CAAC,MAAM;AACrC,WAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS;AAAA,EAClD,CAAC;AA4BD,WAAe,eAAe;AAAA;AAC7B,YAAM,OAAO,gHAA2B,CAAC,UAAU,aAAa;AAChE,UAAI,MAAM;AACT,wBAAgB,IAAI;AAAA,MACrB;AAAA,IACD;AAAA;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,EACD;AACD;;;;;;;;;;;;;;;;;;;;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,iBAAQ;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,2BAA2B,IAAI;;AAE/B;AACA,mCAAmC,IAAI;;AAEvC,kDAAkD,MAAM;;AAExD;AACA,+BAA+B,IAAI;;AAEnC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAQ;AAC1B,QAAQ;AACR;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,2BAA2B;;AAEpD;AACA,kBAAkB,wBAAwB;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb,YAAY;AACZ;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI,iEAAiE;AACrE;AACA,kCAAkC,wBAAwB;AAC1D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI,iEAAiE;AACrE;AACA,UAAU,gBAAgB;AAC1B,kCAAkC,wBAAwB;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC,SAAS;AAC5C;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kBAAkB,gBAAgB;AAClC,gCAAgC;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,yBAAyB,YAAY;AACrC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,wCAAwC,SAAS;AACjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,YAAY,kCAAkC;;AAE9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;;AAEA,2BAA2B,+BAA+B;AAC1D,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC,SAAS;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,kCAAkC;;AAE9C;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,UAAU;AACnD;;AAEA;AACA;AACA;;AAEA;AACA,+CAA+C,UAAU;AACzD;AACA,gBAAgB,0BAA0B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH,CAAC;;AAED;AACA;AACA,iCAAiC,cAAc,IAAI;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,8BAA8B,kBAAkB;AAChD;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,iBAAiB;;AAE7B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,MAAM;;AAElB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;;AAEA;AACA,gCAAgC;AAChC,qBAAqB;;AAErB;AACA;AACA;AACA,MAAM,EAED;;AAEL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB,aAAa,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,iBAAiB;;AAE7C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,YAAY,UAAU;AACtB;;AAEA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;;AAEA,cAAc,0BAA0B;;AAExC;AACA;AACA;AACA;AACA,sBAAsB,mCAAmC;AACzD,SAAS;AACT;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;A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CA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,QAAQ;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,gBAAgB,SAAS;AACzB;AACA,kBAAkB,SAAS;AAC3B;AACA,kBAAkB,SAAS;AAC3B;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA,8DAA8D,+DAAe;AAC7E;AACA,8DAA8D,+DAAe;AAC7E;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,wCAAwC;AAC1E,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA,SAAS;AACT,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kDAAE;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA,mBAAmB;AACnB,4BAA4B,sBAAsB,sCAAsC,kCAAkC;AAC1H;AACA;AACA,2BAA2B;AAC3B,0BAA0B;AAC1B;AACA,wBAAwB;AACxB;AACA,yBAAyB;AACzB;AACA,wBAAwB;AACxB;AACA,yBAAyB;AACzB;AACA,2BAA2B;AAC3B;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,yBAAyB;AACzB;AACA;AACA;AACA,0CAA0C;AAC1C,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,QAAQ;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACgB;AACnB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACqB;AACjB;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kDAAkD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,gCAAgC;AAChC;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACgB;AACnB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACqB;AACjB;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uDAAuD;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACa;AAChB;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACkB;AACd;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,+CAA+C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACe;AAClB;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACoB;AAChB;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,qCAAqC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACa;AAChB;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACkB;AACd;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,+CAA+C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACe;AAClB;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACoB;AAChB;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,sDAAsD;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACwD;AACxD;AACsD;AACtD;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACwB;AACpB;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,cAAc;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACuB;AAC1B;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACwB;AAC3B;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,oBAAoB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACY;AACR;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACyB;AAC5B;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACqB;AACxB;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AAC0B;AAC7B;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E,sEAAsE,oBAAoB;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACc;AACjB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA,WAAW,0BAA0B;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,UAAU;AACpD;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,WAAW,0BAA0B;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACl6E8B;AACN;AACQ;AACJ;AAMrB,MAAM,MAAM;AACZ,SAAS,4BAA4B,WAAmB,gBAAwB,sBAA8B;AACpH,QAAM,cAAc,YAAY,IAAI,IAAI;AAExC,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,UAAU,KAAK,KAAK,MAAM,aAAa;AAE7C,QAAM,oBAAoB,cAAc;AACxC,QAAM,gBAAgB,oBAAoB;AAC1C,QAAM,oBAAoB,wEAAgC,CAAC,aAAa;AAExE,0FAAwC;AAAV,IAC7B,2BAA2B,kBAAkB,mCAAmC,wBAAwB;AAAA,EACzG;AACD;AAEO,SAAS,6BAA6B,WAAmB;AAC/D,QAAM,cAAc,YAAY,IAAI,IAAI;AACxC,QAAM,WAAW,wEAAgC,CAAC,WAAW;AAC7D,QAAM,UA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CAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACO;AACP;AACA,oBAAoB;AACpB;AACA;AACA;AACO,IAAI,gBAAQ;AACnB,IAAI,gBAAQ;AACZ,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAQ;AACnB;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACO;AACP,oCAAoC;AACpC;AACA;AACO;AACP;AACA;AACA;AACO;AACP,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACO;AACP,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACO,SAAS,cAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACO,SAAS,gBAAQ;AACxB,6BAA6B,sBAAsB;AACnD,uBAAuB,cAAM;AAC7B;AACA;AACA;AACO;AACP,kDAAkD,QAAQ;AAC1D,yCAAyC,QAAQ;AACjD,yDAAyD,QAAQ;AACjE;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA,iBAAiB,uFAAuF,cAAc;AACtH,uBAAuB,gCAAgC,qCAAqC,2CAA2C;AACvI,4BAA4B,MAAM,iBAAiB,YAAY;AAC/D,uBAAuB;AACvB,8BAA8B;AAC9B,6BAA6B;AAC7B,4BAA4B;AAC5B;AACA;AACO;AACP;AACA,iBAAiB,6CAA6C,UAAU,sDAAsD,cAAc;AAC5I,0BAA0B,6BAA6B,oBAAoB,gDAAgD,kBAAkB;AAC7I;AACA;AACO;AACP;AACA;AACA,2GAA2G,uFAAuF,cAAc;AAChN,uBAAuB,8BAA8B,gDAAgD,wDAAwD;AAC7J,6CAA6C,sCAAsC,UAAU,mBAAmB,IAAI;AACpH;AACA;AACO;AACP,iCAAiC,uCAAuC,YAAY,KAAK,OAAO;AAChG;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,6CAA6C;AAC7C;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzNyC;AACsC;AACrC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACyB;AAC1B;AACO;AACP,sCAAsC;AACtC,oCAAoC;AACpC;AACA,mBAAmB,gBAAQ;AAC3B,kBAAkB,gBAAQ;AAC1B,sBAAsB,gBAAQ;AAC9B;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,oBAAc;AACtB,YAAY,mCAAW,gEAAgE,oCAAmB;AAC1G;AACA;AACA;AACA,QAAQ,oBAAc;AACtB,YAAY,mCAAW,2EAA2E,oCAAmB;AACrH;AACA;AACA;AACA,QAAQ,oBAAc;AACtB,YAAY,mCAAW,uEAAuE,oCAAmB;AACjH;AACA;AACA;AACA,QAAQ,oBAAc;AACtB,YAAY,mCAAW,4EAA4E,oCAAmB;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,OAAO,oCAAiB,qBAAqB;AACnG,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,OAAO,oCAAiB,iBAAiB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,OAAO,oCAAiB,iBAAiB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA,YAAY,oBAAc,IAAI,qCAAY,uCAAuC,oCAAmB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oBAAc,IAAI,qCAAY,mCAAmC,oCAAmB;AAC5F;AACA;AACA;AACA;;;;AC7JoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA,0BAA0B,sCAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAC2B;AAC5B;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAa;AACjB,IAAI,uBAAa;AACjB,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;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;AACA;AACA;AACA,CAAC;AACsB;AACvB;;;;AChB+B;AACO;AACG;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA,aAAa,4BAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gHAAgH;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,2BAAc;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC;AACA,KAAK;AACL;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzC+B;AACkC;AAC5B;AACW;AACD;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,4BAA4B;AAC5B,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,oCAAoC;AACpC,2BAA2B,OAAO,WAAW;AAC7C,aAAa,4BAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF,oBAAK;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,qBAAqB,sBAAO,WAAW,sBAAO,UAAU,uCAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAM,8BAA8B,qBAAM;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,+BAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0CAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClMyC;AAC4B;AACJ;AACxB;AAClC;AACP;AACA;AACA;AACA;AACA;AACA,kDAAkD,mDAAmD;AACrG;AACA;AACA;AACA,KAAK;AACL;AACA;AACO;AACP,8DAA8D,gBAAQ;AACtE;AACA,uBAAuB,gBAAQ;AAC/B;AACA;AACA,uBAAuB,gBAAQ;AAC/B,uEAAuE,oDAAoD;AAC3H,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,gBAAgB;AAC5E;AACA;AACA,8CAA8C,gBAAQ;AACtD;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,0BAA0B,wCAAuB,EAAE,6BAAa;AAChE;AACA,IAAI,oBAAc,IAAI,iCAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL,0FAA0F;AAC1F;AACA;AACA,IAAI,2CAAwB;AAC5B;AACA;AACA;;AClE6D;AAC7D;AACoC;AACsM;AACjM;AACS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wBAAwB;AAC5B,IAAI,wBAAwB;AAC5B;AACA;AACA,IAAI,qBAAqB;AACzB,0CAA0C,sBAAsB;AAChE;AACA;AACA;AACA,IAAI,gCAAgC;AACpC;AACA;AACA;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wCAAuB;AACnC,YAAY,oBAAc,IAAI,iCAAU;AACxC;AACA;AACA;AACA;AACA;AACA,qCAAqC,iDAAiD;AACtF;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0BAAW;AACvC;AACA;AACA;AACA,qCAAqC,iDAAiD;AACtF;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,wCAAuB;AACrE,YAAY,oBAAc,IAAI,iCAAU;AACxC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAc,IAAI,mCAAW;AACzC;AACA;AACA;AACA,YAAY,oBAAc,IAAI,mCAAW;AACzC;AACA;AACA;AACA;AACA,6BAA6B,aAAa;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,4CAA4C;AAChG,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAc,IAAI,mCAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ,oDAAoD,sBAAsB;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAQ,CAAC,gBAAQ,GAAG,gBAAgB,mBAAmB,MAAM,sDAAsD;AAC9I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,+BAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAQ,CAAC,gBAAQ,GAAG,YAAY,qEAAqE,sBAAK,mCAAmC,uCAAsB,IAAI;AAC9L;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kCAAW;AACpC;AACA;AACA,qBAAqB,2CAAmB;AACxC;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAQ,CAAC,gBAAQ,GAAG,gCAAgC,gBAAgB,SAAS,uDAAuD;AAChL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAQ,CAAC,gBAAQ,CAAC,gBAAQ,CAAC,gBAAQ,CAAC,gBAAQ,GAAG;AACxE,8DAA8D,QAAQ,gBAAQ,CAAC,gBAAQ,GAAG;AAC1F,sBAAsB,SAAS;AAC/B,aAAa,MAAM;AACnB,SAAS;AACT,kBAAkB,SAAS;AAC3B,SAAS;AACT,sBAAsB,SAAS;AAC/B,SAAS;AACT,mBAAmB,SAAS;AAC5B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,gBAAQ,CAAC,gBAAQ,GAAG,uCAAuC,4BAA4B;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAAQ;AACpC;AACA;AACA;AACA,8BAA8B,2BAAQ;AACtC;AACA;AACA;AACA,0BAA0B,2BAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gBAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,YAAY,oBAAc,IAAI,qCAAY;AAC1C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAAmB,KAAK,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAAmB,KAAK,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,sBAAsB,WAAW;AACjC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC;AACqB;AACtB;AACA;AACA;AACA;AACA;AACA,QAAQ,yBAAU;AAClB;AACA,kBAAkB,4BAAa;AAC/B,0BAA0B,WAAW;AACrC;AACA;AACA,SAAS;AACT,sBAAsB,WAAW;AACjC,SAAS;AACT;AACA,eAAe,4BAAa;AAC5B,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;;ACtgBgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,0BAA0B,OAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACc;AACf;AACO;AACP;AACA;AACA,gCAAgC;AAChC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,4BAAS;AACpB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,cAAc,OAAO;AACrB;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJyC;AACN;AACnC;AACA;AACA;AACA;AACA;AACO;AACP,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,aAAa,4BAAM,oBAAoB,4BAAM,iBAAiB,4BAAM;AACpE;AACA;AACA;AACA;AACA;AACO;AACP,aAAa,4BAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,4BAAM;AACvB;AACA,gCAAgC,0BAAW;AAC3C;AACA,KAAK;AACL;AACA;;AC7CmD;AACuC;AACQ;AAClG;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAQ;AACrC,yBAAyB,gBAAQ;AACjC;AACA;AACA;AACO;AACP;AACA,0BAA0B,gBAAQ,CAAC,gBAAQ,GAAG,mCAAmC,gBAAgB,cAAc,uBAAuB,KAAK,WAAW,WAAW;AACjK;AACA;AACA;AACA,0BAA0B,YAAY;AACtC,mBAAmB,cAAc;AACjC;AACA;AACA;AACO;AACP,aAAa,cAAM;AACnB;AACA,cAAc,iBAAiB;AAC/B;AACA,aAAa,qCAAqC;AAClD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,gEAAgE;AAChE,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gBAAQ,CAAC,gBAAQ,GAAG,6DAA6D,gBAAgB,cAAc,uBAAuB,KAAK,WAAW,WAAW;AAC3L;AACA;AACA;AACA,6BAA6B,sCAAsC;AACnE,SAAS;AACT;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACO;AACP;AACA;AACA;AACA,gEAAgE;AAChE,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,UAAU;AAC/C,yBAAyB,kDAAkD;AAC3E,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qCAAqC;AACnD,cAAc,kCAAkC;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,gBAAQ,CAAC,gBAAQ,GAAG,6DAA6D,gBAAgB,cAAc,uBAAuB,KAAK,WAAW,WAAW;AAC/L;AACA;AACA;AACA,iCAAiC,sCAAsC;AACvE,aAAa;AACb;AACA;AACA,uBAAuB,cAAc;AACrC,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;ACjLoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2CAAmB;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,2CAAmB;AAClC;AACA;AACA,CAAC;AACwB;AACzB;;ACvB+B;AACqB;AACb;AACE;AAC8B;AACrB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAc,IAAI,mCAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,cAAc;AACpC,sBAAsB,mBAAmB;AACzC;AACA,gBAAgB,oBAAc,IAAI,qCAAY;AAC9C,aAAa;AACb;AACA;AACA;AACA,gBAAgB,oBAAc,IAAI,qCAAY;AAC9C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAc,IAAI,mCAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,cAAc;AACpC,qBAAqB,cAAM,CAAC,qBAAqB;AACjD;AACA,gBAAgB,oBAAc,IAAI,qCAAY;AAC9C,aAAa;AACb;AACA;AACA;AACA,gBAAgB,oBAAc,IAAI,qCAAY;AAC9C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,CAAC;AACsB;AACvB;;AC7FA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACO,qBAAqB,iHAAiE;AAC7F;;;;ACvB+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC;AACA;AACA;AACA;AACA,iBAAiB,oBAAM;AACvB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,aAAa,oBAAM;AACnB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7HiC;AACQ;AACyM;AACjH;AACjI;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,0BAA0B,sBAAO;AACjC,iIAAiI,iDAA8B;AAC/J,iBAAiB;AACjB;AACA,SAAS;AACT;AACA,4BAA4B,eAAe;AAC3C,SAAS;AACT;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4CAAiB,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B;AACA;AACO;AACP;AACA;AACA,IAAI,sCAAqB,SAAS,iBAAiB;AACnD,kBAAkB,cAAc;AAChC;AACA;AACA;AACA,WAAW,2CAAmB;AAC9B;AACA;AACA;AACA;AACA;AACO;AACP,4BAA4B,QAAQ,aAAa;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,2CAAmB;AAC9B;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,2BAAY;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yBAAU,eAAe,6BAAc;AAC/C;AACA;AACA;AACA;AACA;AACA,+CAA+C,yBAAU;AACzD;AACA;AACA,YAAY,sCAAqB;AACjC;AACA;AACA,yBAAyB,sBAAQ,CAAC,sBAAQ,GAAG,iBAAiB,6CAA6C;AAC3G;AACA;AACA;AACA,QAAQ,sBAAO;AACf;AACA;AACA;AACA,QAAQ,4BAAa,eAAe,sBAAO;AAC3C;AACA;AACA;AACA;AACA;AACA,QAAQ,sCAAqB;AAC7B;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,sCAAqB;AACzB,IAAI,sCAAqB;AACzB;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;;ACjNsC;AACgD;AACtF;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAAmB,KAAK,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,+BAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,qBAAqB,2CAAmB;AACxC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1F2C;AACpC,qCAAqC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACO;AACP,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,0BAA0B;AAC1B,4BAA4B,8BAAQ,GAAG;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA;AACA,0BAA0B,8BAAQ,qDAAqD,UAAU;AACjG;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA,qDAAqD,8BAAQ,uBAAuB,sBAAsB,UAAU;AACpH;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA,kDAAkD,kBAAkB;AACpE;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrB0M;AACnM;AACA;AACA;AACA;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,6BAA6B,SAAS,iBAAiB;AACvD;AACA,qCAAqC;AACrC;AACA,0BAA0B,eAAe;AACzC;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA,YAAY,aAAa;AACzB,mBAAmB,2CAAmB;AACtC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA,iCAAiC,gBAAgB;AACjD;AACA;AACA,2BAA2B,2CAAmB,GAAG,gCAAgC;AACjF;AACA,uBAAuB,2CAAmB;AAC1C;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,aAAa;AAC7F;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAI,wBAAc;AACzB;;ACf8F;AACpD;AAC1C,aAAa,qCAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ,kCAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wBAAc;AAC1B,gBAAgB,mCAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kCAAa;AACrB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;ACjGiC;AACe;AACO;AACvD;AACA;AACA;AACO;AACP,kCAAkC,cAAc,4BAA4B;AAC5E;AACA,6BAA6B,sBAAQ,GAAG,8DAA8D;AACtG;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa,IAAI;AACjB,SAAS;AACT;AACA,WAAW,eAAe,GAAG,gCAAgC;AAC7D;AACA;;ACxB4C;AACI;AAChD;AACA;AACA;AACA;AACA;AACO;AACP;AACA,UAAU,uBAAuB;AACjC;AACA,oCAAoC,uCAAsB;AAC1D;AACA,SAAS;AACT;AACA,WAAW,cAAc,SAAS,WAAW,IAAI;AACjD;AACA;;ACjB+B;AACyI;AACyC;AACvK;AACL;AACrC;AACA;AACA;AACA;AACA,IAAI,WAAM,GAAG,qCAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA,mBAAmB,kCAAkC;AACrD,8CAA8C,WAAM;AACpD,YAAY,WAAM;AAClB,oBAAoB,WAAM;AAC1B;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,sBAAsB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wBAAc,IAAI,iCAAU;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wBAAc,IAAI,iCAAU;AACxC;AACA;AACA,QAAQ,wBAAc,IAAI,iCAAU;AACpC,kBAAkB,qCAAqC;AACvD;AACA,qBAAqB,oBAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,uBAAuB,0BAA0B,sCAAsC,WAAW;AAClG;AACA,YAAY,UAAU,MAAM,iBAAiB;AAC7C;AACA;AACA,YAAY,wBAAc,IAAI,qCAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C,2BAA2B,gBAAgB;AAC3C;AACA;AACA,YAAY,wBAAc;AAC1B;AACA,gBAAgB,mCAAW;AAC3B;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B;AACA;AACA,CAAC;AACwB;AACzB;;AC3IkC;AAC+C;AAC1C;AACgB;AACvD;AACA;AACA,IAAI,iBAAS;AACb;AACA,oCAAoC,YAAY,4BAA4B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2CAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,+BAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,CAAC,aAAa;AACW;AAC1B;;AC/EgD;AACJ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACO;AACP;AACA,mBAAmB,+BAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,WAAW,eAAe,GAAG,gCAAgC;AAC7D;AACA;;AC3CkC;AACuB;AAClB;AACvC;AACA;AACA,IAAI,iBAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,uBAAuB,+BAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,wGAAwG;AACxJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,CAAC,aAAa;AACS;AACxB;;AC9D4C;AACsD;AACzD;AACK;AACwB;AACkC;AACxG;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ,aAAa;AACrD,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,sBAAQ,CAAC,sBAAQ,GAAG,qCAAqC,8IAA8I;AACtO,kBAAkB,cAAc;AAChC,kBAAkB,qCAAqC;AACvD;AACA;AACA;AACA,YAAY,kCAAa;AACzB,iCAAiC,sBAAQ,GAAG;AAC5C,iCAAiC,qBAAqB,GAAG,0CAA0C;AACnG,uBAAuB,cAAc;AACrC;AACA,6BAA6B,mBAAmB;AAChD;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CA;;;ACzNmD;AACP;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA,cAAc,iCAAa;AAC3B;AACA;AACA,sCAAsC,mCAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yDAAyD,iCAAiC;AAC1F,kEAAkE,oEAAoE;AACtI;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,4BAA4B;AACrD;AACA;AACA;AACO;AACP,oDAAoD;AACpD;AACA;;ACrLiC;AACmD;AACuF;AAClI;AACzC,IAAI,cAAM,GAAG,qCAAe;AAC5B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAmB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,4BAA4B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA,wBAAwB,sCAAqB;AAC7C,wBAAwB,sCAAqB;AAC7C;AACA,kCAAkC,sBAAQ,CAAC,sBAAQ,GAAG,kBAAkB,iBAAiB;AACzF;AACA,iBAAiB;AACjB,gBAAgB,gBAAgB;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,IAAI,sCAAmB;AACvB,IAAI,2CAAwB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,8BAA8B;AAC9B,SAAS,cAAM;AACf;AACA;AACA;AACA,QAAQ,wBAAc,IAAI,qCAAY;AACtC;AACA;AACA;AACA,QAAQ,wBAAc,IAAI,qCAAY;AACtC;AACA;AACA,iBAAiB,cAAM;AACvB;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;AACA;AACA,yBAAyB,cAAM,kBAAkB,cAAM;AACvD;AACA;AACA;AACA;AACA;;;;ACtJO,IAAI,oBAAc;AACzB;;ACDyC;AACA;AACzC;AACA,WAAW,4BAAsB;AACjC;AACA;AACA,yCAAyC,eAAe;AACxD;AACA;AACA;AACA;AACO;AACP;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA,WAAW,YAAY;AACvB;AACA;;ACnBiC;AACjC;AACA;AAC6C;AACJ;AACkH;AAC3J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAQ,GAAG,+EAA+E;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iCAAa;AACrB;AACA;AACA;AACA,qBAAqB,oCAAmB;AACxC,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,+CAAyB;AACrC;AACA;AACA,YAAY,+CAAyB;AACrC;AACA;AACA,YAAY,+CAAyB;AACrC;AACA;AACA,YAAY,+CAAyB;AACrC;AACA;AACA,YAAY,+CAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACsB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mCAAgB;AAClC,kBAAkB,mCAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iCAAa;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,eAAe,kBAAkB;AACjC,iBAAiB,2BAAQ;AACzB;AACA;AACA;AACA,yDAAyD,2BAAQ;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iCAAa;AACjB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,QAAQ,iCAAa;AACrB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,iCAAa;AACrB;AACA;AACA,mBAAmB,cAAc;AACjC;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ,iCAAa;AACrB;AACA,kBAAkB,sBAAQ,CAAC,sBAAQ,GAAG,4BAA4B,0CAA0C;AAC5G;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qCAAe;AAChC;AACA;AACA,oBAAoB,yBAAQ;AAC5B,qBAAqB,yBAAQ;AAC7B,mBAAmB,yBAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iCAAa;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;AClO4C;AACW;AACC;AACb;AACF;AACM;AACF;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,WAAW;AACxC,iBAAiB;AACjB;AACA,qBAAqB,WAAW;AAChC;AACA,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,uBAAuB,qCAAe;AACtC;AACA;AACA;AACA;AACA,YAAY,wBAAc,IAAI,qCAAY;AAC1C;AACA;AACA,QAAQ,kBAAkB,CAAC,sBAAQ,CAAC,sBAAQ,GAAG,cAAc,mCAAmC;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,WAAW;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,UAAU;AACa;AACzB;;AC3EiC;AAC2D;AAC1D;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAQ,GAAG,2GAA2G;AAC9I;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qCAAe;AACpC;AACA,YAAY,uBAAI;AAChB;AACA;AACA,YAAY,uBAAI;AAChB;AACA;AACA,YAAY,uBAAI;AAChB;AACA;AACA,YAAY,uBAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACmB;AACpB;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA,kBAAkB,IAAI;AACtB;AACA,wBAAwB,UAAU,0CAAe,YAAY;AAC7D;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA,iCAAiC,0CAAe;AAChD,qBAAqB;AACrB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAI;AACpB;AACA;AACA;AACA;AACA,yCAAyC,0CAAe;AACxD,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB;AACA;AACA,2CAA2C,sCAAmB;AAC9D;AACA,6DAA6D,0CAAe;AAC5E;AACA;AACA,2BAA2B,IAAI;AAC/B,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qCAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAI;AACR;AACA;AACA;AACA,qCAAqC,IAAI;AACzC;AACA;AACA;AACA,yCAAyC,0CAAe;AACxD;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,IAAI;AACpB;AACA;AACA;AACA,qCAAqC,0CAAe;AACpD;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA,KAAK;AACL,IAAI,uBAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AC3OyC;AACzC;AAC6C;AACJ;AACuG;AACxF;AACd;AACO;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAQ,GAAG,2CAA2C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACyB;AAC1B;AACA;AACA,IAAI,+CAAyB;AAC7B;AACA;AACA,iBAAiB,oBAAM;AACvB;AACA;AACA;AACA;AACA,YAAY,mBAAmB;AAC/B;AACA;AACA,2CAA2C,uBAAQ;AACnD;AACA,4CAA4C,qBAAqB;AACjE,sBAAsB,cAAc;AACpC;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI,+CAAyB;AAC7B;AACA;AACA,iBAAiB,oBAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mBAAmB;AAC/B;AACA;AACA,oBAAoB,0BAAW;AAC/B;AACA,cAAc,qBAAqB;AACnC,sBAAsB,cAAc;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,2BAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,kCAAkC;AAClC;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,mBAAmB,uBAAQ,gCAAgC,kCAAe;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI,wBAAc,IAAI,iCAAU;AAChC;AACA;AACA,IAAI,sCAAqB;AACzB;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,iCAAa;AAC3B;AACA;AACA;AACA;AACA;;AC1MyC;AAC6B;AACzB;AACQ;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4CAAuB;AAC/B,uBAAuB,iCAAa;AACpC;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACuB;AACxB;AACA;AACA;AACO;AACP,iEAAiE,2BAAY;AAC7E;AACA;AACA;AACA,6BAA6B,sBAAQ;AACrC;AACA;AACA;AACA;AACA;AACO;AACP,4BAA4B;AAC5B,SAAS,2BAAY;AACrB;AACA;AACA,oBAAoB,kBAAkB;AACtC,kDAAkD,sBAAQ;AAC1D;AACA;;AC1DuC;AACG;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAgB;AACxC,wBAAwB,wBAAc,IAAI,mCAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACiB;AAClB;AACA,SAAS,sBAAgB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKiC;AACqC;AACtB;AAChD,IAAI,gBAAM,GAAG,qCAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4CAAuB;AAC/B,gBAAgB,iCAAa;AAC7B;AACA,qBAAqB,gBAAM,eAAe,gBAAM,cAAc,gBAAM;AACpE;AACA;AACA;AACA,mEAAmE,gBAAM,aAAa,gBAAM;AAC5F,gCAAgC,gBAAM,eAAe;AACrD,iCAAiC,gBAAM,gBAAgB;AACvD,8BAA8B,sBAAQ,CAAC,sBAAQ,CAAC,sBAAQ,GAAG,4DAA4D,mBAAmB,oBAAoB,yBAAyB;AACvL,8BAA8B,sBAAQ,CAAC,sBAAQ,GAAG,YAAY,UAAU,MAAM,kBAAkB;AAChG,uBAAuB,sBAAQ,CAAC,sBAAQ,GAAG,YAAY,kBAAkB;AACzE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACoB;AACrB;;ACxCiC;AAC2D;AACY;AAC/D;AACA;AACQ;AACuD;AACjG;AACP,QAAQ,cAA+B;AACvC,QAAQ,gBAAiC;AACzC,QAAQ,QAAQ;AAChB,QAAQ,WAAW;AACnB,QAAQ,cAAc;AACtB,QAAQ,YAAY;AACpB,QAAQ,MAAM;AACd,QAAQ,SAAS;AACjB;AACA;AACA;AACA;AACA,8BAA8B,YAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,sBAAsB,cAAc;AACpC,oBAAoB,oBAAoB;AACxC,qBAAqB,YAAY;AACjC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,SAAS,sBAAsB;AAC/B;AACO;AACP,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,uBAAuB,qCAAe;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,aAAa;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,8BAA8B;AAC9B;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,mBAAmB;AAClF;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,SAAK;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,QAAI;AACpB;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qCAAe;AAChC;AACA;AACA,QAAQ,wBAAc,IAAI,mCAAW;AACrC;AACA;AACA,cAAc,iCAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,+CAAyB;AAC7B;AACA;AACA;AACA,8BAA8B,iCAAa;AAC3C;AACA,KAAK;AACL;AACA;;;;;;;;;;;;AC5NO;AACP,eAAe,GAAG;AAClB,iBAAiB,GAAG;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC9BwD;AAC0B;AACxC;AACM;AAChD,IAAI,oBAAM,GAAG,qCAAe;AAC5B;AACA;AACA;AACA;AACO;AACP,QAAQ,oBAAM,IAAI,oBAAM;AACxB,QAAQ,oBAAM;AACd,oCAAoC,sCAAoB;AACxD,gBAAgB,oBAAM;AACtB;AACA,gBAAgB,+BAAc;AAC9B,oBAAoB,iCAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,kCAAiB,EAAE,qDAAkC;AAC9F;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ,+BAAc,IAAI,mCAAW;AACrC;AACA;AACA;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACO;AACP;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsD;AAC/C;AACP;AACA;AACA;AACA;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,sCAAsC;AAClG,yBAAyB,4BAA4B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgD;AACzC;AACP;AACA,yCAAyC,qCAAe;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkD;AACJ;AACN;AACE;AACnC;AACP,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,iBAAiB,YAAY;AAC7B,QAAQ,QAAQ;AAChB;AACA;AACA,SAAS;AACT;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgD;AACV;AACtC;AACA;AACA,WAAW,qCAAe;AAC1B;AACA;AACA;AACA,IAAI,QAAQ;AACZ;AACA;AACA,KAAK;AACL;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkD;AACgB;AACpB;AACN;AACE;AACnC;AACP,4BAA4B,oBAAoB;AAChD,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,iBAAiB,YAAY;AAC7B,QAAQ,QAAQ;AAChB;AACA;AACA,SAAS;AACT;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkD;AACgB;AACpB;AACN;AACE;AAC1C;AACO;AACP,4BAA4B,oBAAoB;AAChD,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,2BAA2B;AACjF,SAAS;AACT,QAAQ,QAAQ;AAChB;AACA;AACA;;AC3DyC;AAC0E;AACzE;AACP;AACU;AACA;AACA;AACgC;AAC7E,IAAI,cAAM,GAAG,qCAAe;AAC5B;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,aAAa,0BAAS,MAAM,cAAM,IAAI,cAAM,gBAAgB,cAAM;AAClE,gBAAgB,cAAM;AACtB,gBAAgB,cAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAM,KAAK,cAAM,iBAAiB,cAAM,4BAA4B,yCAA4B;AAC7G;AACA;AACA;AACA,QAAQ,+BAAc,IAAI,iCAAU;AACpC,yBAAyB,yBAAO,CAAC,yCAA4B;AAC7D;AACA;AACA,QAAQ,cAAM;AACd;AACA;AACA;AACA,4BAA4B,yBAAO;AACnC,2BAA2B,yBAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,yBAAO;AACjE,yDAAyD,yBAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA,wBAAwB,+BAAc,IAAI,iCAAU;AACpD,sDAAsD;AACtD,2DAA2D;AAC3D;AACA;AACA,wBAAwB,+BAAc,IAAI,iCAAU;AACpD,uDAAuD;AACvD,4DAA4D;AAC5D;AACA;AACA;AACA;AACA,0DAA0D,cAAM;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,+BAA+B,yBAAO,CAAC,yCAA4B;AACnE;AACA;AACA;AACA,gBAAgB,+BAAc,IAAI,iCAAU;AAC5C,+CAA+C;AAC/C;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,yBAAO;AACjE;AACA;AACA;AACA,gBAAgB,+BAAc;AAC9B,oBAAoB,iCAAU;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,yEAAyE,yBAAO;AAChF;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAM;AACd;AACA;AACA;AACA;AACA,YAAY,+BAAc,IAAI,iCAAU;AACxC,2CAA2C;AAC3C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ,MAAM;AACd;AACA;AACA;AACA;AACA,6BAA6B,yBAAO,CAAC,yCAA4B;AACjE,4BAA4B,yBAAO;AACnC,YAAY,+BAAc,IAAI,iCAAU;AACxC,2CAA2C;AAC3C,gDAAgD;AAChD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ,MAAM;AACd;AACA;AACA;AACA;AACA,6BAA6B,yBAAO,CAAC,yCAA4B;AACjE,4BAA4B,yBAAO;AACnC,YAAY,+BAAc,IAAI,iCAAU;AACxC,2CAA2C;AAC3C,gDAAgD;AAChD,SAAS;AACT;AACA;AACA,CAAC;AACiC;AAClC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,yBAAO;AAC5C,mCAAmC,yBAAO;AAC1C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,yBAAO;AAC5C,mCAAmC,yBAAO;AAC1C,KAAK;AACL;AACA;AACA;AACA,qCAAqC,yBAAO;AAC5C,mCAAmC,yBAAO;AAC1C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACO;AACP,kDAAkD,kCAAM;AACxD;AACA;AACA;AACA,kCAAkC,oCAAQ,GAAG,gCAAgC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAAc,IAAI,iCAAU;AACpC;AACA;AACA,8CAA8C,mCAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+BAAc,IAAI,iCAAU;AACpC;AACA,mEAAmE,mCAAgB;AACnF,SAAS;AACT;AACA;AACA;;AC/UmD;AACwC;AACxB;AAC5D;AACA;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA,aAAa,oCAAQ,CAAC,oCAAQ,GAAG;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO,oCAAiB,gBAAgB;AACrF,iBAAiB,oCAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+CAAyB;AACjC;AACA,SAAS;AACT;AACA;AACA,QAAQ,+CAAyB;AACjC;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACO;AACP,SAAS,mCAAiB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sCAAoB;AAChD;AACA;AACA,kBAAkB,oCAAQ,CAAC,oCAAQ,GAAG,4BAA4B,eAAe;AACjF;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA,YAAY,2BAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oCAAQ;AAClC;AACA;AACA,0BAA0B,oCAAQ,CAAC,oCAAQ,GAAG,cAAc,sCAAsC;AAClG;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,SAAS,mCAAiB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sCAAoB;AAChD;AACA;AACA,kBAAkB,oCAAQ,CAAC,oCAAQ,GAAG,eAAe,+CAA+C;AACpG;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJmF;AACzC;AAC1C,IAAI,aAAM,GAAG,qCAAe;AAC5B;AACA;AACA;AACO;AACP,iDAAiD;AACjD,uDAAuD;AACvD,SAAS,aAAM,KAAK,aAAM;AAC1B,QAAQ,+BAAc,IAAI,mCAAW;AACrC;AACA;AACA,sBAAsB,aAAM;AAC5B;AACA;AACA,qDAAqD,MAAM,aAAM,oCAAoC;AACrG;AACA;AACA,QAAQ,+CAAyB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,+BAAc,IAAI,iCAAU;AAChD;AACA;AACA;AACA,6DAA6D,MAAM,aAAM,sCAAsC;AAC/G;AACA,SAAS;AACT;AACA;AACA;;AC9CiC;AACuB;AACd;AACc;AACE;AACC;AACM;AACd;AAC2C;AACrC;AAClD;AACP,sCAAsC,oCAAQ,GAAG,aAAa,4CAAoB,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AM;AAAA,EACnC;AAAA,EAEA,UAAU,QAAgB;AACzB,iBAAa,QAAQ,IAAI,QAAQ,MAAM;AAAA,EACxC;AAAA,EACA,SAAS;AACR,WAAO,aAAa,QAAQ,IAAI,MAAM,KAAK;AAAA,EAC5C;AAAA,EACQ,kBAAkB;AAEzB,QAAI,QAAkB,CAAC;AACvB,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC5B,YAAM,KAAK,yDAAsB,CAAC,CAAC;AAAA,IACpC;AACA,WAAO,MAAM,KAAK,GAAG;AAAA,EACtB;AACD;AAEO,MAAM,oBAAoB,uBAAuB,SAAS;;;;;;;;;;;;;;;;;;;;ACvC5B;AACV;AAEpB,MAAM,iBAAiB;AAAA,EAC7B,OAAO,cAAc,SAAiC;AAKrD,WAAO,GAAG,2BAAY,GAAG,uEAA+B,cAAc,QAAQ;AAAA,EAG/E;AAAA,EACA,OAAO,iBAAiB,SAAiC;AACxD,WAAO,KAAK,cAAc,OAAO;AAAA,EAIlC;AAAA,EACA,OAAO,sBAAsB;AAC5B,WAAO,GAAG,2BAAY,GAAG,2EAAiC;AAAlB,EACzC;AACD;;;;;;;ACtBA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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DyB;AAGzB,MAAM,YAAY;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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ACA,GAAG,KAAU,EAAE;;;;;;;ACXf;;AAEA;AACA,cAAc,mBAAO,CAAC,KAA4U;AAClW;AACA;AACA;AACA;AACA,UAAU,gDAAuF;AACjG,+CAA+C;AAC/C;AACA,GAAG,KAAU,EAAE;;;;;;;;;;;;;;ACXf;AACA;AACA;AACA;AACe;AACf;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D,MAAM;AACN;AACA;AACA;AACA;AACA;;;AC1BA;AACA;AACA;AACA;AACA;;AAEyC;;AAEzC;;AAEA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEe;AACf;;AAEA;;AAEA,eAAe,YAAY;AAC3B;;AAEA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA,MAAM;AACN;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA;AACA,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7Na;;AAEb,8CAA6C,EAAE,aAAa,EAAC;;AAE7D,kBAAkB,mBAAO,CAAC,IAAmB;AAC7C,iBAAiB,mBAAO,CAAC,KAAkB;AAC3C,aAAa,mBAAO,CAAC,IAAa;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;;AAEA,eAAe;AACf;AACA;AACA,CAAC;;;;;;;;AC5DW;;AAEZ,IAAI,IAAqC;AACzC,EAAE,2CAAkD;AACpD,EAAE,KAAK,EAEN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNiK;;AAElK;AACA,6BAA6B,IAAI;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM,SAAS,KAAyC,EAAE,EAErD;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,OAAO;AAClD;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAIrD;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B,MAAyC,GAAG,CAAS;AAChF,mCAAmC,MAAyC,GAAG,CAAiB;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mDAAM;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,MAAyC,GAAG,CAA2C,CAAC;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAiE,EAAE,EAStE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6BAA6B,oDAAO;AACxC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,aAAa,oDAAO;AACpB;AACA,cAAc,kDAAK;AACnB;AACA;AACA,UAAU,SAAS,yDAAY;AAC/B;AACA;AACA;AACA;AACA,aAAa,oDAAO;AACpB;AACA,cAAc,kDAAK;AACnB;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAK;AACjB;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAyC,GAAG,CAAoD,CAAC;AACrH;AACA;AACA,UAAU,KAAyC,EAAE,EAE9C,CAAC;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAE9C,CAAC;AACN;AACA;AACA;AACA;AACA;AACA,kBAAkB,oDAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAA8D,EAAE,EAEnE;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,oDAAO;AAClD;AACA,+IAA+I,iDAAQ;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,0BAA0B,oDAAO;AACjC;AACA,2BAA2B,mDAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,qDAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,yDAAY;AAC1C;AACA,QAAQ,qDAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oDAAO;AAClB;AACA;AACA;AACA;AACA,mBAAmB,oDAAO,YAAY,yDAAY,sCAAsC,mDAAM;AAC9F;AACA;AACA;AACA;AACA,QAAQ,SAAS,uDAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mDAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,qDAAQ;AACf;AACA;AACA;AACA;AACA;AACA,2BAA2B,oDAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAK9C;AACL;AACA,GAAG;AACH;AACA,QAAQ,KAAyC,EAAE,EAK9C;AACL;AACA;AACA;AACA,gDAAgD,mDAAM;AACtD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,mDAAM;AACtD,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,YAAY;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uBAAuB;AACjC;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA;AACA,IAAI,SAAS,uDAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uBAAuB;AACjC;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAyC,GAAG,CAAiD;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kDAAK;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B,wBAAwB,cAAc;AACtC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAM9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM,mDAAM;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM,gEAAgE,iCAAiC;AACzH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F,sDAAS;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,qDAAQ;AACf,QAAQ,KAAyC,EAAE,EAE9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,gDAAG;AACL;AACA;AACA,8BAA8B,qDAAQ;AACtC,8BAA8B,qDAAQ;;AAEtC;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAM9C,CAAC;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAO9C,CAAC;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uDAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,MAAyC,GAAG,CAAU;AAC9E;AACA;AACA;AACA;AACA;AACA,SAAS,uDAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA6D,EAAE,EAElE;AACH,cAAc,oDAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,uDAAU;AACvB;AACA,IAAI,SAAS,qDAAQ;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uDAAU;AAC/B;AACA;AACA,aAAa,MAAyC,GAAG,CAEpD,CAAC,EAAE,6CAAI;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM,KAAmE,EAAE,EAGxE;AACH;AACA;;AAEA,6BAA6B,iEAAiB;AAC9C,cAAc,kDAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9tClH;AACkC;AACyG;AAC5S;;AAElI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAA0C;AAChD;AACA,EAAE,wEAAa;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO,YAAY,0CAA0C;AAC1E;AACA;AACA;AACA;AACA,IAAI;AACJ,qCAAqC,IAAI;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,wEAAa;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,4BAA4B,qBAAqB;AACjD,6CAA6C,cAAc;AAC3D;AACA,uBAAuB;AACvB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,qDAAQ;AACd;AACA,6BAA6B,IAAI,GAAG,MAAM;AAC1C,IAAI;AACJ,6BAA6B,IAAI,GAAG,MAAM;AAC1C,IAAI,SAAS,gEAAK;AAClB,4BAA4B,gEAAK;AACjC,6BAA6B,IAAI;AACjC,IAAI,SAAS,uDAAU;AACvB,eAAe,IAAI,KAAK,iBAAiB,WAAW,QAAQ;AAC5D,IAAI;AACJ,YAAY,gEAAK;AACjB,6BAA6B,IAAI;AACjC;AACA;AACA;AACA,MAAM,IAA0C;AAChD;AACA;AACA;AACA,IAAI;AACJ,YAAY,MAAM,8BAA8B,oBAAoB;AACpE,IAAI;AACJ,YAAY,MAAM;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM,uDAAU;AAChB;AACA,eAAe,sDAAS;AACxB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,MAAyC,GAAG,CAAsB;AACxF;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAc9C,CAAC;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,oDAAO;AACd;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH,SAAS,kBAAkB;AAC3B;AACA;AACA,UAAU,KAA4E,EAAE,EAEjF;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAE9C;AACL;AACA,6BAA6B,4CAA4C;AACzE,UAAU,KAA4G,EAAE,EAEjH;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA,gBAAgB,MAAyC,GAAG,CAAyC,GAAG,6CAAI;AAC5G;AACA,yBAAyB,2BAA2B;AACpD;AACA;AACA,YAAY,KAAuD,EAAE,EAE5D;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,6CAA6C,kCAAkC,cAAc,QAAQ;AACrG;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI,KAAyC,EAAE,EAM9C;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,kBAAkB,aAAa;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,aAAa;AACnC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,CAAC;AACD,iDAAiD,wHAAwE;AACzH,kDAAkD;AAClD;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,CAAC;AACD,wCAAwC;AACxC;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,kDAAS;AACjD,MAAM,KAAyC,EAAE,EAwB9C;AACH;AACA;AACA;AACA;AACA,4BAA4B,+CAA+C;AAC3E,YAAY,eAAe,yBAAyB,kDAAS;AAC7D;AACA,gCAAgC,qDAAQ;AACxC;AACA;AACA,yBAAyB,sDAAa;AACtC;AACA;AACA,MAAM,KAAkE,EAAE,EAEvE;AACH,MAAM,KAAyC,EAAE,EAU9C;AACH;AACA,oCAAoC,yDAAY;AAChD,sBAAsB,yDAAY,CAAC,qDAAQ;AAC3C;AACA,kCAAkC,yDAAY,CAAC,sDAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAwC,EAAE,EAiB7C;AACH;AACA,QAAQ,qDAAQ;AAChB;AACA;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA,IAAI;AACJ,IAAI,mDAAM;AACV;AACA,MAAM,qDAAQ;AACd;AACA;AACA;AACA;AACA;AACA,mBAAmB,iDAAI;AACvB;AACA;AACA;AACA,SAAS,mDAAM,kDAAkD,mDAAM,UAAU,sDAAS,UAAU,mDAAM;AAC1G;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAkE,EAAE,EAEvE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,UAAU,KAA4D,EAAE,EAEjE;AACP;AACA;AACA;AACA,UAAU,MAAyC,GAAG,CAO3C,CAAC,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA4F,EAAE,EAEjG;AACH;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA,sCAAsC,wDAAe;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,SAAS,KAAoF,EAAE,EAwBhG;AACP;AACA;AACA;AACA,QAAQ,KAAiE,EAAE,EAItE;AACL;AACA;AACA;AACA;AACA,QAAQ,KAAiE,EAAE,EAItE;AACL;AACA;AACA,MAAM,KAAoD,EAAE,EAEzD,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,iDAAI;AAClD,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,4DAAe;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sDAAsD;AAChE,UAAU,sDAAsD;AAChE;AACA,MAAM,KAA4F,EAAE,EAEjG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uDAAU;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qGAAqG,4BAA4B,iBAAiB;AAClJ;AACA;AACA;AACA;AACA;AACA,UAAU,yDAAyD;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA+D,EAAE,EAKpE;AACH;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qDAAQ;AACxC,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAW9C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,cAAc,uGAAuG;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sBAAsB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uDAAU;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA,QAAQ,KAAyD,EAAE,EAE9D;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oDAAO;AACf;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAyC,GAAG,CAAsC,KAAK;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAyC,GAAG,CAAsC,KAAK;AAC3F;AACA;AACA;AACA;AACA,MAAM,KAA4D,EAAE,EAIjE;AACH;AACA;AACA,+BAA+B,6CAA6C,EAAE,kDAAS;AACvF;AACA,MAAM,KAAgD,EAAE,EAWrD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,0EAAe;AAClC;AACA;AACA;AACA,MAAM,gEAAK;AACX;AACA,mBAAmB,oEAAW;AAC9B,IAAI,SAAS,qEAAU;AACvB;AACA;AACA,IAAI,SAAS,oDAAO;AACpB;AACA,sCAAsC,qEAAU,OAAO,oEAAW;AAClE;AACA,UAAU,gEAAK;AACf;AACA,QAAQ,SAAS,qEAAU;AAC3B;AACA,QAAQ,SAAS,uDAAU;AAC3B;AACA,QAAQ;AACR,QAAQ,MAAyC,IAAI,CAAoB;AACzE;AACA,KAAK;AACL,IAAI,SAAS,uDAAU;AACvB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,aAAa,6CAAI;AACjB,IAAI,MAAyC,IAAI,CAAyB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6CAAI;AACpB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,aAAa,6CAAI;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,uDAAU;AAC5B,UAAU,uDAAU;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,qEAAc;AACnC,MAAM,KAAyC,EAAE,EAG9C;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM,mDAAM;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,qDAAQ;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,gEAAK;AACX;AACA,IAAI,SAAS,oDAAO;AACpB,oBAAoB,kBAAkB;AACtC;AACA;AACA,IAAI,SAAS,kDAAK,WAAW,kDAAK;AAClC;AACA;AACA,KAAK;AACL,IAAI,SAAS,0DAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAyC,IAAI,CAAgE;AACjH;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC,sCAAsC,kDAAS;AAC/C;AACA,UAAU,uDAAU;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,wEAAa;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,wEAAa;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAqD,EAAE,EAK1D;AACb;AACA;AACA,gBAAgB,IAA0C;AAC1D;AACA;AACA;AACA;AACA,uBAAuB,gEAAK;AAC5B,cAAc,OAAO;AACrB,UAAU,KAAiH,EAAE,EAEtH;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oDAAO;AACf;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,iDAAiD,KAAK;AACtD;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,uDAAU;AACnB;AACA;AACA,2BAA2B,mDAAM,GAAG,oBAAoB,kBAAkB,gBAAgB;AAC1F;AACA;;AAEA;AACA;AACA,MAAM,uDAAU;AAChB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,UAAU,KAAkD,EAAE,EAIvD;AACP;AACA;AACA;AACA,UAAU,KAAyF,EAAE,EAE9F;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,qBAAqB,8DAAG;AACxB,oBAAoB,8DAAG;AACvB,sBAAsB,8DAAG;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iDAAiD,QAAQ;AACzD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,UAAU,iCAAiC;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAkE,EAAE,EAEvE;AACL;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2DAAc;AACxB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,UAAU,KAAkE,EAAE,EAEvE;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2DAAc;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,UAAU,KAAkE,EAAE,EAEvE;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA,IAAI,SAAS,qDAAQ;AACrB;AACA,IAAI,SAAS,qDAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mDAAM;AACV,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,wEAAa;AACnB;AACA;AACA;AACA,MAAM,wEAAa;AACnB;AACA,KAAK;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAKrD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,qDAAQ;AACd;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,qDAAQ,uBAAuB,uDAAU,CAAC,qDAAQ;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAgE,EAAE,EAIrE;AACL;AACA,IAAI,SAAS,KAAyC,EAAE,EAIrD;AACH;AACA;AACA,iDAAiD,qDAAQ,oBAAoB,uDAAU,CAAC,qDAAQ;AAChG;;AAEA;AACA;AACA;AACA,MAAM,oDAAO,YAAY,qDAAQ;AACjC;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA,IAAI;AACJ,QAAQ,KAAsE,EAAE,EAE3E;AACL;AACA,oBAAoB,YAAY;AAChC;AACA;AACA,IAAI,SAAS,qDAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,yBAAyB;AAC3C;AACA,QAAQ,oDAAO;AACf,sBAAsB,iBAAiB;AACvC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAoE,EAAE,EAKzE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,KAAK;AAC3D,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,MAAM,KAA2D,EAAE,EAGhE;AACH;AACA,6DAA6D,IAAI,IAAI,yDAAY;AACjF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mDAAM;AACxB;AACA;AACA;AACA,mBAAmB,MAAyC,GAAG,CAAwB;AACvF,mBAAmB,MAAyC,GAAG,CAAwB;AACvF,mBAAmB,MAAyC,GAAG,CAAwB;AACvF,kBAAkB,MAAyC,GAAG,CAAuB;AACrF;AACA;AACA;AACA,qBAAqB,MAAmB,GAAG,CAAuB;AAClE;AACA;AACA,mBAAmB,MAAmB,GAAG,CAAqB,GAAG,6CAAI;AACrE,GAAG;AACH;AACA;AACA,kDAAkD,kDAAS,8BAA8B,mDAAM;AAC/F;AACA,QAAQ,aAAa;AACrB,YAAY,8DAA8D;AAC1E,QAAQ,KAA8D,EAAE,EAEnE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ,kBAAkB,kDAAS,IAAI,mDAAM;AAC7C;AACA;AACA,QAAQ;AACR;AACA;AACA,wDAAwD,mDAAM;AAC9D;AACA;AACA;AACA,QAAQ,iBAAiB,kDAAS,IAAI,mDAAM;AAC5C;AACA;AACA,QAAQ,SAAS,IAAyC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+DAAK;AACb,QAAQ,MAAyC,IAAI,CAAmB;AACxE,QAAQ,SAAS,KAA6D,EAAE,EAEzE;AACP;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM,iBAAiB,kDAAS,IAAI,mDAAM;AAC1C;AACA;AACA,MAAM;AACN;AACA,6DAA6D,mDAAM;AACnE;AACA;AACA;AACA;AACA,MAAM,SAAS,KAEc,EAAE,EAY1B;AACL,GAAG;AACH,QAAQ,aAAa;AACrB,YAAY,wBAAwB;AACpC;AACA;AACA;AACA,MAAM,SAAS,KAAkG,EAAE,EAG9G,CAAC,kBAAkB,kDAAS,IAAI,mDAAM;AAC3C;AACA;AACA,MAAM,SAAS,mDAAM;AACrB,MAAM,MAAyC,IAAI,CAA+D;AAClH;AACA;AACA;AACA,MAAM,MAAyC,IAAI,CAE5C;AACP;AACA,MAAM;AACN,UAAU,KAA+F,EAAE,EAMpG,CAAC;AACR;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,SAAS;AACT,GAAG;AACH;AACA,0CAA0C,kDAAS,IAAI,mDAAM,0FAA0F,mDAAM,0BAA0B,mDAAM,cAAc,mDAAM,8BAA8B,mDAAM;AACrP,GAAG;AACH;AACA;AACA;AACA,MAAM,SAAS,mDAAM;AACrB;AACA;AACA;AACA;AACA;AACA,IAAI,KAAiD,EAAE,EAOtD;AACD,mEAAmE,mDAAM;AACzE,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,qCAAqC,kEAAqB;AAC1D,UAAU,KAA4F,EAAE,EAMjG;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,UAAU,kBAAkB;AAC5B;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;;AAEA;AACA,KAAK,OAAO;AACZ;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA+C,EAAE,EAGpD;AACH,MAAM,KAAqE,EAAE,EAG1E;AACH;AACA,kBAAkB,8DAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,KAAK;AAC9B;AACA,KAAK;AACL;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAA+C,EAAE,EAEpD;AACH;AACA;AACA;AACA,SAAS,oDAAO;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oDAAO,SAAS,uDAAU;AACpC,6BAA6B;AAC7B,QAAQ;AACR;AACA;AACA,MAAM;AACN,2BAA2B;AAC3B,MAAM,SAAS,KAAyC,EAAE,EAErD;AACL,kCAAkC,IAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO,OAAO,oDAAO;AAC3B;AACA,SAAS,mDAAM,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAiD,EAAE,EAItD;AACH;AACA;AACA,MAAM,sDAAS;AACf;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM,YAAY,IAAI,0BAA0B,WAAW;AACzE,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,mCAAmC,MAAyC,GAAG,CAAwB;AACvG,MAAM,KAAyC,EAAE,EAO9C;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAO9C,CAAC;AACV;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT,QAAQ,SAAS,KAAyC,EAAE,EAIrD;AACP;AACA;AACA;AACA,QAAQ,KAAqE,EAAE,EAI1E;AACL;AACA,QAAQ,KAA4D,EAAE,EAIjE;AACL;AACA,MAAM,MAAyC,IAAI,CAAuC;AAC1F,MAAM;AACN;AACA,UAAU,KAAyC,EAAE,EAY9C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAyD,EAAE,EAE9D;AACP,uFAAuF,MAAyC,GAAG,CAI5H,CAAC;AACR;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,UAAU,KAAyC,EAAE,EAE9C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA,QAAQ,KAAyC,EAAE,EAE9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS,KAAyC,EAAE,EAErD;AACL,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ,SAAS,KAAyC,EAAE,EAErD;AACP;AACA,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA,UAAU,kCAAkC;AAC5C;AACA;AACA;AACA,cAAc;AACd,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,qDAAQ;AACd;AACA;AACA;AACA;AACA;AACA,UAAU,kCAAkC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAyC,IAAI,CAE5C;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mDAAM;AAClB,MAAM,uDAAU;AAChB,MAAM,uDAAU;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mDAAM;AACpB;AACA;AACA;AACA,QAAQ,oDAAO,QAAQ,oDAAO;AAC9B;AACA;AACA,WAAW,mDAAM;AACjB;AACA;AACA,oDAAoD;AACpD;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mDAAM;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,2CAAE;AACrB;AACA,0BAA0B;AAC1B,+BAA+B;AAC/B;AACA;AACA;AACA,KAAK;AACL;AACA,kBAAkB;AAClB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uDAAU;AACnB,sBAAsB,mDAAM,GAAG;AAC/B;AACA,8BAA8B,qDAAQ;AACtC,MAAM,MAAyC,IAAI,CAA2D;AAC9G;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAW9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,YAAY,KAAyC,EAAE,EAI9C;AACT,OAAO;AACP;AACA;AACA,UAAU,MAAyC,IAAI,CAAsD;AAC7G,UAAU,mBAAmB,uDAAU;AACvC;AACA;AACA,UAAU,SAAS,uDAAU;AAC7B;AACA;AACA,UAAU,SAAS,KAAyC,EAAE,EAIrD;AACT;AACA,OAAO;AACP;AACA,YAAY,KAAmB,EAAE,EAQxB,CAAC,SAAS,KAAyC,EAAE,EAErD;AACT;AACA,OAAO;AACP;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA,YAAY,KAAqE,EAAE,EAE1E;AACT;AACA;AACA,OAAO;AACP;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA,YAAY,KAAqE,EAAE,EAE1E;AACT;AACA;AACA,OAAO;AACP;AACA;AACA,cAAc,KAAsE,EAAE,EAK3E;AACX;AACA;AACA;AACA;AACA;AACA,cAAc,KAAyC,EAAE,EAI9C;AACX;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,cAAc,KAAkE,EAAE,EAGvE;AACX;AACA,UAAU,SAAS,KAAyC,EAAE,EAKrD;AACT,OAAO;AACP;AACA;AACA;AACA,cAAc,KAAkE,EAAE,EAGvE;AACX;AACA,UAAU,SAAS,KAAyC,EAAE,EAErD;AACT,OAAO;AACP;AACA,YAAY,KAAoE,EAAE,EAIzE;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,KAAyC,EAAE,EAE9C;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,sCAAsC,uDAAU;AAChD,MAAM,SAAS,KAAyC,EAAE,EAErD;AACL,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE,gDAAG;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA,qCAAqC,0EAAe;AACpD,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,IAAI;AACJ,0BAA0B,gEAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,KAAwE;AAC5E;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mDAAM;AACpB;AACA;AACA;AACA;AACA,YAAY;AACZ,iCAAiC,qDAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mDAAM;AACb;AACA,mBAAmB,sDAAS,mBAAmB,mDAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,mDAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAO;AACX;AACA,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2DAAc;AACxB;AACA;AACA;AACA;AACA,qBAAqB,mDAAM,qBAAqB,qDAAQ;AACxD;AACA;AACA,UAAU;AACV,+CAA+C;AAC/C;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gEAAK;AACjC,wCAAwC,kDAAS;AACjD,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,mDAAM;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mDAAM;AAC7B;AACA;AACA,uDAAuD,uDAAU;AACjE,gBAAgB,gBAAgB;AAChC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mEAAmE,sDAAS;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAwC,EAAE,EAiB7C;AACH;AACA,QAAQ,qDAAQ;AAChB,sBAAsB,kDAAS;AAC/B;AACA,WAAW,kDAAS;AACpB;AACA,MAAM,oDAAO;AACb,oBAAoB,gBAAgB;AACpC,UAAU,KAA8D,EAAE,EAEnE;AACP,4BAA4B,qDAAQ;AACpC;AACA,oCAAoC,kDAAS;AAC7C;AACA;AACA,IAAI;AACJ,QAAQ,KAA2D,EAAE,EAEhE;AACL;AACA,4BAA4B,qDAAQ;AACpC;AACA;AACA,iDAAiD,oDAAO,SAAS,uDAAU,UAAU,YAAY,EAAE,mDAAM,GAAG;AAC5G;AACA;AACA;AACA;AACA;AACA,mCAAmC,mDAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,qDAAQ;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,KAAyC,EAAE,EAErD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA,IAAI,SAAS,uDAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uCAAuC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,8BAA8B;AAClD,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,KAAK,cAAc,0CAA0C;AAC1H;AACA;AACA;AACA;AACA;AACA,8BAA8B,cAAc;AAC5C;AACA,sBAAsB,cAAc;AACpC;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB,IAAI;AACJ,cAAc,cAAc;AAC5B,IAAI;AACJ,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC,oDAAO;AAC7C;AACA;AACA;AACA;AACA;AACA,QAAQ,KAA4D,EAAE,EAIjE;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uDAAU;AAClB;AACA,MAAM;AACN,UAAU,KAAiD,EAAE,EAItD;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAiF,EAAE,EAItF;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gEAAK;AAC5B,MAAM,gDAAG;AACT,MAAM;AACN;AACA;AACA,2BAA2B;AAC3B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,EAAE,gDAAG;AACL;AACA;AACA,UAAU,eAAe;AACzB;AACA,iCAAiC,kDAAS;AAC1C;AACA;AACA;AACA,UAAU,KAA0D,EAAE,EAG/D,CAAC;AACR;AACA,QAAQ;AACR,QAAQ,mDAAM;AACd;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,oDAAO;AACb;AACA;AACA;AACA,sBAAsB,oDAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,mBAAmB;AAC7B,MAAM,KAAmD,EAAE,EAKxD;AACH;AACA,8BAA8B,kDAAS,mBAAmB;AAC1D;AACA;AACA,QAAQ,qDAAQ;AAChB;AACA,UAAU,mDAAM;AAChB;AACA;AACA,MAAM,SAAS,gEAAK;AACpB;AACA;AACA;AACA,MAAM,uDAAU;AAChB;AACA,IAAI;AACJ,sBAAsB,qDAAQ;AAC9B,mBAAmB,gEAAK;AACxB;AACA;AACA;AACA,uCAAuC,mDAAM;AAC7C;AACA,YAAY,oDAAO,cAAc,mDAAM;AACvC,YAAY;AACZ,iBAAiB,oDAAO;AACxB;AACA;AACA,oBAAoB,mDAAM;AAC1B;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;AACA,cAAc,mDAAM;AACpB;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,SAAS,KAAyC,EAAE,EAErD;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM,SAAS,KAAyC,EAAE,EAErD;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM,MAAyC,IAAI,CAE5C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kCAAkC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY,MAAyC,IAAI,CAI5C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,SAAS,KAAyC,EAAE,EAErD;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAA0C;AACtD;AACA,QAAQ,MAAyC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,iDAAI,UAAU,2DAAc;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAuD,EAAE,EAK5D;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU,MAAyC,IAAI,CAI5C;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,YAAY,KAAuD,EAAE,EAK5D;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qCAAqC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAyC,IAAI,CAQ5C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,KAAK,GAAG,aAAa;AAC1C;AACA,MAAM,KAAkE,EAAE,EAEvE;AACH;AACA;AACA;AACA,4BAA4B,KAAK,GAAG,aAAa;AACjD;AACA;AACA;AACA,UAAU,6CAA6C,IAAI,KAAK;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAkE,EAAE,EAEvE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM,KAAwC,EAAE,EAG7C;AACH,MAAM,KAA0C,EAAE,EAG/C;AACH,MAAM,KAA4D,EAAE,EAOjE;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,0DAAa;AAC9B;AACA,MAAM,KAAkE,EAAE,EAEvE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,6CAAI;AACrC;AACA,IAAI;AACJ,kJAAkJ,MAA0D,GAAG,CAAK;AACpN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uBAAuB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,SAAS,KAAyC,EAAE,EAErD;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,SAAS,KAAyC,EAAE,EAErD;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,YAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2CAA2C;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2DAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAkE,EAAE,EASvE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA,UAAU,KAA8F,EAAE,EAEnG;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,mCAAmC;AAC7C;AACA,iCAAiC,kDAAS;AAC1C,iCAAiC,kDAAS;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAA0D,EAAE,EAI/D;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAE9C;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kDAAS;AAChC;AACA,eAAe,2DAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,iEAAiE;AAC3E,QAAQ,KAC+B,EAAE,EAIpC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C,CAAC;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAkE,EAAE,EAEvE;AACL,QAAQ,KAAyC,EAAE,EAG9C;AACL;AACA;AACA;AACA;AACA,UAAU,KAAyC,EAAE,EAE9C;AACP;AACA,UAAU,KAAyC,EAAE,EAE9C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAG9C;AACL;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA,UAAU,2DAAc;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAyC,EAAE,EAE9C;AACb;AACA,gBAAgB,KAAyC,EAAE,EAE9C;AACb,gBAAgB,KAAyC,EAAE,EAE9C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAyC,EAAE,EAE9C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV,cAAc,KAAyC,EAAE,EAE9C;AACX;AACA,cAAc,KAAyC,EAAE,EAE9C;AACX,cAAc,KAAyC,EAAE,EAE9C;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAyC,EAAE,EAE9C;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAkE,EAAE,EAEvE;AACT;AACA,QAAQ;AACR,cAAc,6BAA6B;AAC3C;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU,2DAAc;AACxB;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAkE,EAAE,EAEvE;AACT,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA,yCAAyC,qEAAc;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAI9C;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wEAAa;AACjB;AACA,IAAI,wEAAa;AACjB;AACA;AACA;AACA;AACA;AACA,YAAY,uBAAuB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kDAAS;AACxB,eAAe,kDAAS;AACxB;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA,cAAc,KAAgF,EAAE,EAMrF;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF,kDAAS;AAC/F;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4CAA4C;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,YAAY,+BAA+B;AAC3C;AACA,UAAU,KAAiI,EAAE,EAQtI,CAAC;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,oBAAoB;AAClC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAkE,EAAE,EAEvE;AACL,YAAY,kCAAkC;AAC9C;AACA,MAAM,2DAAc;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAkE,EAAE,EAEvE;AACL;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO,SAAS,oDAAO;AAC7B,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAA0E,EAAE,EAE/E;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,qDAAQ;AACd;AACA,MAAM,MAAyC,IAAI,CAE5C;AACP;AACA,MAAM;AACN;AACA;AACA,QAAQ,MAAyC,IAAI,CAE5C;AACT;AACA;AACA;AACA,IAAI;AACJ,QAAQ,KAA0F,EAAE,EAE/F;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,MAAM;AACN;AACA,UAAU,uCAAuC;AACjD,QAAQ,KAA0D,EAAE,EAG/D;AACL;AACA,kCAAkC,MAAyC,GAAG,CAA+B;AAC7G,qCAAqC,MAAyC,GAAG,CAA6B;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,SAAS,KAAsD,EAAE,EAElE;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS,KAAyC,EAAE,EAMrD;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,8DAA8D,kBAAkB,sBAAsB;AACtG,YAAY,2DAA2D;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,wDAAwD,KAAK,QAAQ,WAAW;AAChF;AACA;AACA;AACA,UAAU,yCAAyC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,kDAAS;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAgG,EAAE,EAIrG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,uBAAuB,qDAAQ,SAAS,gEAAK,SAAS,uDAAU,UAAU,gEAAgE;AAC1I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,uBAAuB,qDAAQ;AAC/B;AACA,MAAM,KAAoE,EAAE,EAEzE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAyC,GAAG,CAA4B;AAC5F;AACA;AACA,QAAQ,KAAkD,EAAE,EAEvD;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sBAAsB;AAChC,kBAAkB,qDAAQ;AAC1B,oBAAoB,2DAAc;AAClC;AACA,QAAQ,qDAAQ;AAChB,UAAU,kEAAO,YAAY,oDAAO;AACpC,gBAAgB,mDAAM,GAAG;AACzB;AACA,oBAAoB,2DAAc;AAClC;AACA;AACA,oBAAoB,qDAAQ,8DAA8D,qDAAQ,aAAa,uDAAU;AACzH,MAAM,KAA2E,EAAE,EAQhF;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kEAAO,wCAAwC,mDAAM,GAAG;AACjE;AACA;AACA,UAAU,kCAAkC;AAC5C,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oDAAO;AAC/B;AACA;AACA;AACA,cAAc,MAAkF,GAAG,CAA4B;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,oDAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,YAAY;AACtB;AACA;AACA,IAAI,SAAS,oDAAO;AACpB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,uDAAU;AACvB,iBAAiB;AACjB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA,sBAAsB,2DAAc;AACpC;AACA,QAAQ;AACR,oBAAoB,2DAAc;AAClC,QAAQ,SAAS,iDAAI;AACrB;AACA;AACA,mDAAmD,oDAAO;AAC1D;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kEAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAS;AAC5B;AACA;AACA;AACA,SAAS,kDAAS;AAClB,UAAU,kDAAS;AACnB,WAAW,kDAAS;AACpB,WAAW,kDAAS;AACpB,WAAW,kDAAS;AACpB,UAAU,kDAAS;AACnB,gBAAgB,kDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAE9C,CAAC;AACJ,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,0DAAa;AACpD,mCAAmC,0DAAa;AAChD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,yEAAyB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,kBAAkB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAqB9C;AACH;AACA,mBAAmB,kEAAO;AAC1B,MAAM,KAAyC,EAAE,EAE9C;AACH,UAAU,QAAQ;AAClB;AACA;AACA;AACA,IAAI,wEAAa;AACjB;AACA;AACA;AACA;AACA,OAAO,MAAyC,GAAG,CAA+B;AAClF;AACA,IAAI,wEAAa;AACjB;AACA,QAAQ,sDAAS;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,QAAQ;AACR;AACA,YAAY,KAA+D,EAAE,EAKpE;AACT;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM,uDAAU;AAChB;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI,SAAS,qDAAQ;AACrB,QAAQ,KAAiE,EAAE,EAItE;AACL,QAAQ,KAAkE,EAAE,EAEvE;AACL,0BAA0B,oEAAS;AACnC,QAAQ,KAAyC,EAAE,EAE9C;AACL,IAAI,SAAS,KAAmE,EAAE,EAI/E;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT,gBAAgB,mCAAmC;AACnD,gBAAgB,wDAAwD;AACxE,qCAAqC,mDAAM;AAC3C,UAAU,mDAAM;AAChB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT;AACA;AACA,0CAA0C,6CAAI;AAC9C;AACA;AACA;AACA;AACA,MAAM,KAA2B,EAAE,EAMhC;AACH,MAAM,KAAoG,EAAE,EASzG;AACH;AACA;AACA;AACA;AACA,IAAI,MAAyC,GAAG,CAc3C,CAAC;AACN;AACA,QAAQ,+DAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,QAAQ,KAAyC,EAAE,EAmB9C;AACL;AACA;AACA,MAAM,KAAyC,EAAE,EAa9C,CAAC;AACJ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,oEAAS,CAAC,kEAAO;AACtF;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS,uDAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uDAAU;AACnB;;AAEA;AACA,SAAS,mEAAU;AACnB;;AAEA;AACA;AACA;AACA,QAAQ,qDAAQ,sBAAsB,oDAAO;AAC7C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAyC,IAAI,CAE5C;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM,IAA2E;AACjF;AACA;AACA,qBAAqB;AACrB,wBAAwB;AACxB,wBAAwB;AACxB,yBAAyB;AACzB;AACA;AACA,WAAW,qDAAQ;AACnB;AACA;AACA;AACA;AACA,QAAQ,SAAS,gEAAK;AACtB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,QAAQ,SAAS,qEAAU;AAC3B;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,cAAc,qEAAU,2BAA2B;AACnD;AACA,QAAQ,SAAS,qEAAU;AAC3B;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gEAAK;AACpD;AACA,gCAAgC,kDAAS;AACzC;AACA;AACA,0BAA0B,kDAAS;AACnC,8CAA8C,gEAAK;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,wCAAwC;AACxC,SAAS;AACT;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA,aAAa,mDAAM,GAAG;AACtB;AACA,wBAAwB;AACxB;AACA;AACA;AACA,QAAQ,2BAA2B,sBAAsB;AACzD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM,SAAS,qDAAQ;AACvB,0BAA0B,gBAAgB,gEAAK,SAAS;AACxD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ,uDAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oDAAO,gCAAgC,qDAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,QAAQ,uDAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEk+C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3jPxjC;AACxY;AACsQ;;AAExS;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,uFAAuF,KAAK;AAC5F;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,qDAAQ;AAC9B;AACA,iBAAiB,qDAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,MAAM,oDAAO;AACb;AACA,IAAI;AACJ;AACA;AACA,QAAQ,KAAyC,EAAE,EAM9C;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU,sDAAS;AACnB;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qDAAQ;AACrB;AACA;AACA;AACA,SAAS,uDAAU;AACnB,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ,sBAAsB,iEAAoB;AAC1C,uCAAuC,+DAAkB;AACzD;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAkB;AAChC,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,QAAQ,KAAwD,EAAE,EAK7D;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,sDAAS;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI,uFAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI,SAAS,iDAAI;AACjB,SAAS,4DAAe;AACxB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,uDAAU;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,qDAAQ;AACtC;AACA;AACA;AACA;;AAEA;AACA,eAAe,4EAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,UAAU,KAA4D,EAAE,EAIjE;AACP,0BAA0B,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,qEAAQ;AACZ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,kBAAkB,kBAAkB;AACzC;AACA,cAAc,gBAAgB;AAC9B;AACA,oBAAoB,oDAAO;AAC3B;AACA;AACA;AACA;AACA,iCAAiC,qDAAQ;AACzC;AACA,iFAAiF,qDAAU;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,6BAA6B,oDAAO,yCAAyC;AAC7E;AACA;AACA;AACA;AACA;AACA,2CAA2C,iDAAU;AACrD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,qBAAqB,qDAAU;AAC/B;AACA,cAAc,qDAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sDAAS;AACrC,UAAU;AACV,4BAA4B,sDAAS;AACrC,UAAU;AACV,+BAA+B,sDAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,wEAAW,YAAY,mDAAM,GAAG;AAClD;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAU9C;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,cAAc,sDAAS;AACvB,qBAAqB,sDAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAyC,EAAE,EAE9C;AACT,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,+EAAkB;AACvC;AACA,MAAM,MAAyC,IAAI,CAAkD;AACrG,aAAa,kDAAS;AACtB;AACA;AACA;AACA,MAAM,MAAyC,IAAI,CAA4D;AAC/G,aAAa,kDAAS;AACtB;AACA;AACA;AACA,MAAM,MAAyC,IAAI,CAAkE;AACrH,aAAa,kDAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,+EAAkB;AACrC;AACA,IAAI,MAAyC,IAAI,CAAuE;AACxH;AACA;AACA;AACA;AACA,kDAAkD,aAAa;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,4EAAe;AACjB,EAAE,sEAAS;AACX;AACA,iDAAiD,iBAAiB;AAClE,IAAI,wEAAW;AACf,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wBAAwB,iEAAQ;AACpC;AACA,IAAI,wBAAwB,+DAAM;AAClC,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,IAAI;AACjC;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,OAAO,KAAK,oDAAC,CAAC,uEAAc;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,mDAAM;AAC3E,IAAI;AACJ,EAAE,sFAA6B;AAC/B;AACA;AACA;AACA,MAAM,oDAAO;AACb;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gBAAgB,oDAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B,0BAA0B,KAAK;AAC/B,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B,0BAA0B,KAAK;AAC/B,sBAAsB,KAAK;AAC3B,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,SAAS,mDAAM;AACf;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,IAAI,SAAS,qDAAQ;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,cAAc,qDAAQ;AACtB,MAAM,KAAyC,EAAE,EAE9C;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2BAA2B;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,iDAAiD,WAAW;AAC5D,oDAAoD,WAAW;AAC/D;AACA,gDAAgD,UAAU;AAC1D,mDAAmD,UAAU;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,mDAAM,GAAG;AAClC;AACA;AACA,GAAG;AACH,iBAAiB,OAAO;AACxB,qBAAqB,+EAAkB;AACvC,kBAAkB,+EAAkB;AACpC;AACA;AACA,IAAI,sEAAS;AACb;AACA;AACA;AACA,8CAA8C,kBAAkB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,uBAAuB,kEAAK;AAC5B;AACA,gCAAgC,iEAAQ;AACxC;AACA,iCAAiC,qFAAwB;AACzD,sBAAsB,qBAAqB;AAC3C;AACA;AACA,UAAU,+EAAkB;AAC5B;AACA,YAAY,mFAAsB;AAClC;AACA,UAAU,SAAS,KAAyC,EAAE,EAErD;AACT;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA,UAAU,+EAAkB;AAC5B;AACA,YAAY,mFAAsB;AAClC;AACA;AACA;AACA;AACA,aAAa,wEAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,GAAG,KAAK,GAAG;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAU,eAAe;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS,oDAAO,kBAAkB,2DAAc;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,0DAAa;AAChC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gBAAgB,OAAO;AACvB;AACA,GAAG;AACH,qBAAqB,oBAAoB,sBAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,0DAAa;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oDAAO;AACjB,sBAAsB,yDAAY;AAClC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ,SAAS,kDAAK;AACtB;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA,MAAM,oDAAO;AACb,iBAAiB,yDAAY;AAC7B,IAAI,SAAS,kDAAK;AAClB;AACA,IAAI;AACJ,iBAAiB,uDAAU;AAC3B;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,iBAAiB,uDAAU;AAC3B;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH,qBAAqB,iBAAiB;AACtC;AACA;AACA,mBAAmB,uDAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB,UAAU;AAC9C,uBAAuB,kDAAK;AAC5B;AACA;AACA,wBAAwB,0DAAa;AACrC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA,gBAAgB,OAAO;AACvB;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,qBAAqB,oDAAO,YAAY,kDAAK;AAC7C,IAAI,MAAyC,IAAI,CAE5C;AACL;AACA;AACA,yCAAyC,OAAO;AAChD;AACA;AACA;AACA,UAAU,oDAAO;AACjB,0BAA0B,yDAAY;AACtC,QAAQ;AACR;AACA;AACA,MAAM;AACN,UAAU,uDAAU;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,OAAO,QAAQ,OAAO;AACpD,+BAA+B,OAAO;AACtC,uBAAuB,uDAAU;AACjC,eAAe;AACf;AACA;AACA,kCAAkC,OAAO;AACzC,QAAQ,oDAAO;AACf,yBAAyB,yDAAY;AACrC,iBAAiB;AACjB;AACA,MAAM,SAAS,kDAAK;AACpB;AACA,iBAAiB;AACjB;AACA,MAAM;AACN,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,EAAE;AAC9D;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sDAAS;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,OAAO,IAAI,YAAY;AAC3C;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH,gBAAgB,OAAO,IAAI,YAAY;AACvC;AACA;AACA;AACA,GAAG;AACH,gBAAgB,iBAAiB,IAAI,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,OAAO;AAChC;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA,wCAAwC,mDAAM,GAAG,WAAW;AAC5D;AACA;AACA;AACA,iCAAiC,2EAAc;AAC/C;AACA;AACA,2CAA2C,oFAAuB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAG9C;AACH,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA,SAAS,uDAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAyC,EAAE,EAG9C;AACH,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,MAAM,qDAAQ;AACd;AACA,QAAQ,KAAiD,EAAE,EAItD;AACL;AACA;AACA,MAAM,KAAuI,EAAE,EAI5I;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEgS;;;;;;;;AC3+ChS;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,EAAE;AACF;AACA,wCAAwC;AACxC;AACA;;;;;;;AC9RA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,WAAW,mBAAO,CAAC,IAAM;;;AAGzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA,0BAA0B,EAAE;;AAE5B;AACA;AACA,yBAAyB,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE,eAAe;AACjB;AACA;AACA;;AAEA,uCAAuC,SAAS;AAChD;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,EAAE,iBAAiB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,EAAE,kBAAkB;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE,YAAY;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,kBAAkB,EAAE;AACpB,uCAAuC,GAAG;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,gBAAgB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,oBAAoB;AACjC;AACA;;AAEA;AACA,aAAa,UAAU;AACvB;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAkC,2BAA2B;AAC7D;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE,WAAW;AACb,EAAE,iBAAiB,KAAK;;AAExB,EAAE;;AAEF;AACA;AACA;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;;AAEA;AACA;AACA,EAAE,eAAe;AACjB;AACA;;AAEA,uCAAuC,8BAA8B;AACrE;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,EAAE,iBAAiB;AACnB;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,EAAE,kBAAkB;AACpB;AACA;;AAEA;AACA,EAAE,YAAY;AACd;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,EAAE,gBAAgB;AAClB;AACA;;AAEA;AACA;AACA,aAAa,oBAAoB;AACjC;AACA;;AAEA;AACA,aAAa,UAAU;AACvB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,sBAAsB;AACxD;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE,WAAW;AACb,EAAE,iBAAiB;AACnB;;AAEA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,eAAe;AACf;AACA;;;AAGA,cAAc;AACd,EAAE,mCAAoB;AACtB,CAAC;;;AAGD,kBAAkB;AAClB,SAAS,uCAAwB;AACjC,CAAC;;;AAGD;AACA,EAAE,iBAAiB;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF,EAAE,iBAAiB;AACnB;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;;;ACzgBD;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;;;;;;;ACAA;AAC+E;AACc;;AAE7F;AACoD;AACpD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM,iEAAU;AAChB;AACA,eAAe,gEAAS;AACxB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA,sDAAsD,KAAK;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,yBAAyB,IAAI;AAC5D;AACA;AACA;AACA,MAAM,gEAAK;AACX;AACA,mBAAmB,oEAAS;AAC5B,IAAI,SAAS,qEAAU;AACvB;AACA;AACA,IAAI,SAAS,8DAAO;AACpB;AACA,+BAA+B,iEAAU;AACzC;AACA,UAAU,gEAAK;AACf;AACA,eAAe,qEAAU;AACzB;AACA,eAAe,iEAAW;AAC1B;AACA;AACA;AACA,KAAK;AACL,IAAI,SAAS,iEAAW;AACxB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,aAAa,uDAAI;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,iEAAU,oBAAoB,iEAAU;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,qEAAc;AACnC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO,+DAAQ;AACf;AACA;AACA,MAAM,8DAAO;AACb,oBAAoB,kBAAkB;AACtC;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AAIE;;;;;;;;;AC/J4B;;AAE9B;AACA,aAAa,uEAAW;;AAExB,yDAAe,MAAM,EAAC;;;;;;;;;;;;;;;;;ACLY;;AAElC;AACA;;AAEA;AACA,IAAI,yBAAc;;AAElB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,sBAAM,GAAG,8CAAkB;;AAEhD;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA,cAAc,yBAAc;AAC5B;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA,+CAAe,SAAS,EAAC;;;AC7CzB;AACA,IAAI,2BAAW;;AAEf;AACA;AACA;AACA;AACA;AACA,IAAI,oCAAoB,GAAG,2BAAW;;AAEtC;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA,SAAS,oCAAoB;AAC7B;;AAEA,oDAAe,cAAc,EAAC;;;ACrBI;AACM;AACU;;AAElD;AACA;AACA;;AAEA;AACA,IAAI,0BAAc,GAAG,sBAAM,GAAG,8CAAkB;;AAEhD;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,UAAU,0BAAc,IAAI,0BAAc;AAC1C,MAAM,UAAS;AACf,MAAM,eAAc;AACpB;;AAEA,gDAAe,UAAU,EAAC;;;;;;;;AC3B1B;AACA;;AAEA,yDAAe,UAAU,EAAC;;;;;;;;;ACHgB;;AAE1C;AACA;;AAEA;AACA,WAAW,+DAAU;;AAErB,yDAAe,IAAI,EAAC;;;;;;;;ACRpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yDAAe,QAAQ,EAAC;;;;;;;;AC9BxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yDAAe,YAAY,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5B5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAWe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAWe;AACf;AACA;AACA;AACA,uBAAuB,iDAAc;AACrC,wCAAwC,kDAAe;AACvD,kCAAkC,kDAAe;AACjD;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA,yCAAyC,wCAAK,iBAAiB,yCAAM;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,mBAAmB,uCAAI;AACvB;AACA;AACA,yBAAyB,wCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,qBAAqB;AAC3E,+FAA+F,iBAAiB;AAChH;AACA,aAAa,SAAS;AACtB,aAAa,sBAAsB;AACnC;AACA,+CAA+C,oDAAiB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,gCAAgC,sBAAsB;AAC3G;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,qBAAqB;AAC/E;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sBAAsB;AAChC;AACA;AACA;AACA;AACA;AACA,+CAA+C,oDAAiB,wBAAwB,2CAAQ,wBAAwB,0CAAO;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACgH;;AAEhH;AAC4D;;AAE5D;AACA,oJAAoJ,4CAA4C,gCAAgC,iBAAiB,YAAY,sCAAsC,2BAA2B,kEAAkE;;AAEhY;AACA,uCAAuC,YAAY,wBAAwB,uCAAuC;;AAElH;AACA,iCAAiC,iDAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0CAAO;AAChC,qBAAqB,0CAAO;AAC5B,OAAO;AACP,gBAAgB,6CAAU;AAC1B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oDAAkB;AAChD,mBAAmB,+CAAY;AAC/B,mBAAmB,+CAAY;AAC/B;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,8BAA8B,mDAAgB;AAC9C;AACA,QAAQ,4DAA4D,iDAAc;AAClF,+CAA+C,iDAAc;AAC7D;AACA;AACA;AACA;;AAEA;AAC8B;AAC9B,gCAAgC,wCAAK;AACrC;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA,wCAAwC,0CAAO;AAC/C;AACA;AACA,8BAA8B,mDAAiB,kCAAkC,iDAAe;AAChG,8CAA8C,iDAAe;AAC7D,+CAA+C,iDAAe;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA;AACA,iDAAiD,+CAAY;AAC7D;AACA;AACA;AACA,4BAA4B,qDAAkB;AAC9C,0BAA0B,qDAAkB;AAC5C,MAAM;AACN,0BAA0B,kDAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc,mBAAmB;AACjC;AACA;AACA;AACA,yCAAyC,0CAAO,uCAAuC,0CAAO;AAC9F;AACA,iBAAiB,+CAAa;AAC9B,iBAAiB,+CAAa;AAC9B;AACA;AACA;AACA;AACA,6BAA6B,oDAAkB;AAC/C;AACA;AACA;AACA;AACA,iBAAiB,mDAAiB,uDAAuD,iDAAe;AACxG,wCAAwC,iDAAe;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,gEAAgE,0CAAO;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA,6CAA6C,0CAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,0CAAO;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC6C;;AAE7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,uDAAoB;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,OAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA,yEAAyE,OAAO;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AAC2F;AAC3F;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,6CAAU;AAC3B;AACA;AACA,iBAAiB,2CAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,iBAAiB,6CAAU;AAC3B;AACA;AACA,iBAAiB,2CAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc,UAAU;AACxB;AACA;AACA,8BAA8B,iDAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,kBAAkB,4CAAS;AAC3B;AACA;AACA;AACA;AACA,sCAAsC;AACtC,kBAAkB,2CAAQ;AAC1B;AACA,OAAO;AACP;AACA;AACA,sCAAsC;AACtC,kBAAkB,6CAAU;AAC5B;AACA,OAAO;AACP;AACA;AACA,sCAAsC;AACtC;AACA;AACA,OAAO;AACP;AACA;AACA,sCAAsC;AACtC;AACA,kBAAkB,2CAAQ;AAC1B;AACA,OAAO;AACP;AACA;AACA,sCAAsC;AACtC;AACA,kBAAkB,6CAAU;AAC5B;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AAC6D;AAC7D;AACA,+BAA+B,kDAAe;AAC9C;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,wBAAwB,0CAAQ;AAChC,6BAA6B,0CAAQ;AACrC;AACA;AACA,6BAA6B,0CAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,wBAAwB;AAC3E;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,wBAAwB;AAC3E;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,wBAAwB;AAC3E;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,wBAAwB;AAC3E;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,wBAAwB;AACpE;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,oBAAoB;AACjC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,oBAAoB;AACjC,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA,aAAa,UAAU;AACvB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB;AAC1B;AACA,aAAa,UAAU;AACvB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc,SAAS,6EAA6E;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACiF;;AAEjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sFAAsF,2BAA2B;;AAEjH;AACA,wFAAwF,kCAAkC;;AAE1H;AACA,0FAA0F,iCAAiC;;AAE3H;AACA,wFAAwF,0BAA0B,0BAA0B,sCAAsC,uCAAuC;;AAEzN;AACA,6FAA6F,6EAA6E,yBAAyB;;AAEnM;AACA,8FAA8F,+EAA+E,yBAAyB;;AAEtM;AACA,yFAAyF,gCAAgC;;AAEzH;AACA,6FAA6F,gCAAgC;;AAE7H;AACA,yFAAyF,sCAAsC;;AAE/H;AACA,4FAA4F,qCAAqC;;AAEjI;AACA,6FAA6F,+BAA+B,wDAAwD,yBAAyB;;AAE7M;AACA,2FAA2F,qCAAqC;;AAEhI;AACA,sFAAsF,0BAA0B,0BAA0B,sCAAsC,uCAAuC;;AAEvN;AACA,yFAAyF,6BAA6B;;AAEtH;AACA,6FAA6F,iCAAiC;;AAE9H;AACA,0FAA0F,gCAAgC;;AAE1H;AACA,8FAA8F,8CAA8C;;AAE5I;AACA,+FAA+F,oCAAoC;;AAEnI;AACA,+FAA+F,kDAAkD;;AAEjJ;AACA,6FAA6F,0BAA0B,0BAA0B,sCAAsC,uCAAuC;;AAE9N;AACA,2FAA2F,2BAA2B;;AAEtH;AACA,2FAA2F,wCAAwC;;AAEnI;AACA,yFAAyF,yBAAyB;;AAElH;AACA,0FAA0F,wDAAwD,yBAAyB;;AAE3K;AACA,4FAA4F,cAAc,2EAA2E,yBAAyB;;AAE9M;AACA,0FAA0F,wDAAwD,yBAAyB;;AAE3K;AACA,6FAA6F,0BAA0B,0BAA0B,4CAA4C,uCAAuC;;AAEpO;AACA,yFAAyF,wCAAwC;;AAEjI;AACA,6FAA6F,cAAc,mBAAmB,uHAAuH,yBAAyB;;AAE9Q;AACA,sFAAsF,UAAU;;AAEhG;AACA,2FAA2F,wCAAwC;;AAEnI;AACA,8FAA8F,uFAAuF,yBAAyB;;AAE9M;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kDAAgB;AAC9C;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,uBAAuB,0CAAQ;AAC/B;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACwH;;AAExH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC0I;;AAE1I;AACmH;;AAEnH;AACA,2GAA2G,4CAA4C,4BAA4B,kBAAkB,kBAAkB,kBAAkB,YAAY,qCAAqC,iCAAiC,iCAAiC,iCAAiC,sBAAsB,mCAAmC;;AAEtb;AACA,0DAA0D,qBAAqB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,YAAY,4BAA4B,wDAAwD,iCAAiC,iCAAiC,iCAAiC,iCAAiC,uCAAuC;;AAEtb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,iDAAe;AACtD;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA,8BAA8B,0CAAO;AACrC;AACA;AACA;AACA,yBAAyB,0CAAQ;AACjC,uBAAuB,0CAAQ,KAAK,0CAAO;AAC3C,mBAAmB,0CAAQ;AAC3B,oBAAoB,0CAAQ;AAC5B,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA,6BAA6B,oDAAkB,SAAS,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,8BAA8B,mDAAiB;AAC/C;AACA;AACA,QAAQ,4DAA4D,iDAAe;AACnF,gDAAgD,iDAAe;AAC/D,gDAAgD,iDAAe;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACuG;;AAEvG;AACoH;;AAEpH;AACA,qHAAqH,4CAA4C,2CAA2C,oDAAoD,wBAAwB,2BAA2B,YAAY,sCAAsC,6BAA6B,0CAA0C,2BAA2B,YAAY,4EAA4E,wEAAwE,8BAA8B,WAAW;;AAEhpB;AACA,sCAAsC,iDAAe;AACrD;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,wBAAwB,mDAAgB;AACxC,OAAO;AACP;AACA,yBAAyB,0CAAQ;AACjC,uBAAuB,0CAAQ;AAC/B,uBAAuB,0CAAQ;AAC/B,mBAAmB,0CAAQ;AAC3B,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ,8BAA8B,yBAAyB;AAC5E,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA,8BAA8B,oDAAkB,SAAS,oBAAoB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA,0DAA0D,mDAAiB;AAC3E;AACA;AACA;AACA;AACA;;AAEA;AAC+J;;AAE/J;AAC+H;;AAE/H;AACA,iHAAiH,4CAA4C,uFAAuF,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,sCAAsC,0DAA0D,YAAY,iBAAiB,8GAA8G,oCAAoC,oCAAoC,oCAAoC,oCAAoC,yGAAyG,oCAAoC,oCAAoC,oCAAoC,oCAAoC,yGAAyG,oCAAoC,oCAAoC,oCAAoC,oCAAoC,2CAA2C,eAAe,mCAAmC;;AAEl6C;AACA,gEAAgE,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,YAAY,wBAAwB,mCAAmC,kCAAkC,oCAAoC,mCAAmC,mCAAmC,kCAAkC,kCAAkC,mCAAmC,kCAAkC,oCAAoC,mCAAmC,mCAAmC,uCAAuC;;AAElyB;AACA,yCAAyC,iDAAe;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0CAAQ;AACjC,uBAAuB,0CAAQ,KAAK,0CAAQ;AAC5C,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AAC+H;;AAE/H;AACA,+GAA+G,wCAAwC,4CAA4C,qCAAqC,+BAA+B,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,YAAY,iBAAiB,sCAAsC,qCAAqC,sCAAsC,qCAAqC,mCAAmC,qCAAqC,sCAAsC,qCAAqC,sCAAsC,4CAA4C,qCAAqC,mCAAmC;;AAEx4B;AACA,8DAA8D,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,YAAY,wBAAwB,kCAAkC,iCAAiC,iCAAiC,kCAAkC,iCAAiC,mCAAmC,kCAAkC,kCAAkC,uCAAuC;;AAExjB;AACA,uCAAuC,iDAAe;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0CAAQ;AACjC,2BAA2B,0CAAQ;AACnC,uBAAuB,0CAAQ,KAAK,0CAAQ;AAC5C,oBAAoB,0CAAQ;AAC5B,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,4BAA4B,oDAAkB,SAAS,oBAAoB;AAC3E;AACA;AACA;AACA;AACA;AACA,0BAA0B,0CAAQ;AAClC;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,2CAA2C;AACvD,YAAY,yCAAyC;AACrD;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,yDAAyD,OAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mDAAiB;AAC/C;AACA;AACA,QAAQ,4DAA4D,iDAAe;AACnF;AACA,sCAAsC,iDAAe;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AASe;AACf,2BAA2B,kDAAgB;AAC3C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,iBAAiB;AAC9B,aAAa,eAAe;AAC5B,aAAa,qBAAqB;AAClC,aAAa,sBAAsB;AACnC,aAAa,qBAAqB;AAClC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uDAAqB;AACjD,6BAA6B,+CAAY;AACzC;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qBAAqB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qBAAqB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,+CAA+C,oDAAkB;AACjE;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB;AACrD;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB,gCAAgC,sBAAsB;AAC3G;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,kBAAkB,gBAAgB,qBAAqB;AACvG;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sBAAsB;AAChC;AACA;AACA;AACA;AACA,+CAA+C,oDAAkB,wBAAwB,2CAAS,wBAAwB,0CAAQ;AAClI;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sFAAsF,oCAAoC,kCAAkC,+EAA+E,6BAA6B,+CAA+C;;AAEvT;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA,oBAAoB,0CAAQ;AAC5B,0BAA0B,0CAAQ;AAClC;AACA,KAAK;AACL,4BAA4B,oDAAkB,SAAS,oBAAoB;AAC3E;AACA,yCAAyC,YAAY;AACrD,6CAA6C,mBAAmB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,iDAAe;AAC5E,+CAA+C,iDAAe;AAC9D;AACA;AACA;AACA;;AAEA;AAC4C;;AAE5C;AACA,yCAAyC,kBAAkB,uBAAuB,sBAAsB,oGAAoG,uCAAuC,6FAA6F,uEAAuE,iCAAiC,mDAAmD,wCAAwC,sCAAsC,sCAAsC,qEAAqE,2DAA2D,0BAA0B,0BAA0B,0BAA0B,sBAAsB,0EAA0E,4EAA4E,4EAA4E,6EAA6E,2EAA2E,6EAA6E,6EAA6E,8EAA8E,2EAA2E,6EAA6E,6EAA6E,4EAA4E,2EAA2E,8EAA8E,8EAA8E,6EAA6E,6EAA6E,8EAA8E,8EAA8E,+EAA+E,8EAA8E,6EAA6E,+EAA+E,8EAA8E,6EAA6E,4EAA4E,8EAA8E,4EAA4E,8EAA8E,4EAA4E,+EAA+E,2EAA2E,6EAA6E,2EAA2E,8EAA8E,4EAA4E,8EAA8E,4EAA4E,+EAA+E,2EAA2E,wBAAwB;;AAE/1H;AACA,gCAAgC,sDAAM;AACtC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AAC+E;;AAE/E;AACA,4DAA4D,uBAAuB,+EAA+E,+CAA+C,iBAAiB,2BAA2B,KAAK,2BAA2B,gDAAgD;;AAE7U;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,kEAAkE,IAAI;AACtF;AACA;AACA;AACA,2BAA2B,0CAAQ;AACnC,yBAAyB,0CAAQ;AACjC;AACA,KAAK;AACL,2BAA2B,iDAAe;AAC1C;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,4GAA4G,8DAA8D;;AAE1K;AACA,uCAAuC,sDAAM;AAC7C;AACA;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA,yDAAyD,eAAe;AACxE;AACA;;AAEA;AAC6C;;AAE7C;AACA,gDAAgD,+EAA+E,wEAAwE;;AAEvM;AACA,qCAAqC,sDAAM;AAC3C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB;AACA,gBAAgB,2BAA2B,IAAI;AAC/C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACkE;;AAElE;AACA,6FAA6F,gCAAgC,kBAAkB,kBAAkB,+EAA+E,sBAAsB,sBAAsB,wDAAwD,gCAAgC,8BAA8B,uBAAuB,4CAA4C,6CAA6C,yBAAyB,kCAAkC,mCAAmC,qFAAqF;;AAErrB;AACA,yDAAyD,sBAAsB,kBAAkB,kBAAkB,mCAAmC,mCAAmC,6CAA6C,cAAc,eAAe;;AAEnQ;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA,iBAAiB,0CAAQ;AACzB;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA,uBAAuB,0CAAS;AAChC,iCAAiC,0CAAS;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,yHAAyH,8CAA8C,gCAAgC,gDAAgD;;AAEvP;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB;AACA,gBAAgB,sDAAsD,IAAI;AAC1E;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACyM;;AAEzM;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACgI;;AAEhI;AACA,0GAA0G,4CAA4C,mDAAmD,kCAAkC,2CAA2C,uBAAuB,oBAAoB,iBAAiB,YAAY,uEAAuE,uBAAuB,oDAAoD,uBAAuB,yCAAyC,KAAK,wEAAwE,iCAAiC,4CAA4C,YAAY,KAAK,KAAK,wBAAwB,2BAA2B,+BAA+B,sBAAsB,gCAAgC,sBAAsB,kDAAkD,YAAY,IAAI,KAAK,wBAAwB,2BAA2B,iDAAiD,sBAAsB,kDAAkD,sBAAsB,YAAY;;AAEnpC;AACA,kCAAkC,iDAAe;AACjD;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,uBAAuB,0CAAS;AAChC,uBAAuB,0CAAS,KAAK,0CAAQ;AAC7C,sBAAsB,0CAAS;AAC/B,sBAAsB,0CAAS;AAC/B,mBAAmB,0CAAS;AAC5B,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACuK;;AAEvK;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iJAAiJ,+CAA+C,sCAAsC,yBAAyB,yBAAyB,wBAAwB,iBAAiB,kCAAkC,sFAAsF,iDAAiD,2EAA2E,yCAAyC,oDAAoD,YAAY,wBAAwB,YAAY,2BAA2B,6FAA6F,uEAAuE,iCAAiC,yDAAyD,+DAA+D,mFAAmF;;AAE7mC;AACA,8CAA8C,iDAAe;AAC7D;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,2BAA2B,0CAAS;AACpC,wBAAwB,0CAAS;AACjC,wBAAwB,0CAAS;AACjC,uBAAuB,0CAAS;AAChC,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,wCAAwC,oDAAkB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,4BAA4B,oDAAiB;AAC7C;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACkJ;;AAElJ;AACA,6FAA6F,4CAA4C,4EAA4E,4CAA4C,yDAAyD,2BAA2B,YAAY,kEAAkE,oEAAoE,oEAAoE,iDAAiD,uEAAuE,iCAAiC,mDAAmD,iCAAiC,gFAAgF,0CAA0C,wFAAwF,sDAAsD,WAAW;;AAE3iC;AACA,iCAAiC,iDAAe;AAChD;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,yBAAyB,0CAAS;AAClC,yBAAyB,0CAAS;AAClC,sBAAsB,0CAAS;AAC/B,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,uBAAuB,mDAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AAC8D;AAC9D;AACA;AACA;AACA;AACA,aAAa,gBAAgB;AAC7B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA,0DAA0D,mDAAiB;AAC3E;AACA;AACA;AACA;;AAEA;AACA,2GAA2G,yCAAyC,gDAAgD,sCAAsC,+CAA+C,oCAAoC,oBAAoB,oGAAoG,6CAA6C,2CAA2C,yFAAyF,yCAAyC,0FAA0F,qCAAqC,6DAA6D,0CAA0C,oBAAoB;;AAEz4B;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA,gCAAgC,0CAAS;AACzC,+BAA+B,0CAAS;AACxC,8BAA8B,0CAAS;AACvC,6BAA6B,0CAAS;AACtC,sBAAsB,0CAAS;AAC/B;AACA,KAAK;AACL;AACA,4BAA4B,oDAAkB,SAAS,oBAAoB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,0EAA0E;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2BAA2B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,+CAA+C,oDAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,mDAAiB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,iDAAe;AAC5E,+CAA+C,iDAAe;AAC9D,mDAAmD,iDAAe;AAClE,kDAAkD,iDAAe;AACjE,qDAAqD,iDAAe;AACpE;AACA;AACA;AACA;;AAEA;AACkE;;AAElE;AACA,6CAA6C,oBAAoB,gCAAgC,oEAAoE,uCAAuC,+EAA+E,gEAAgE,sCAAsC;;AAEjY;AACA,oCAAoC,sDAAM;AAC1C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,kDAAkD,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;A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;AACA,IAAI,IAAI;AACR;AACA;AACA,gCAAgC,0CAAS;AACzC,wBAAwB,0CAAS;AACjC,uBAAuB,0CAAS;AAChC,uBAAuB,0CAAS;AAChC,sBAAsB,0CAAS,KAAK,0CAAQ;AAC5C,2BAA2B,0CAAS,KAAK,0CAAQ;AACjD;AACA,KAAK;AACL;AACA,mDAAmD,6CAAW;AAC9D;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0CAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,gDAAa;AACrD,gCAAgC,iDAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,aAAa;AAC3B;AACA;AACA,+CAA+C,6CAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAYe;;AAEf;AAgBe;;AAEf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yIAAyI,qCAAqC,gDAAgD,uCAAuC,wCAAwC,2BAA2B,qCAAqC,mGAAmG,gFAAgF,WAAW,iBAAiB,YAAY,WAAW,sFAAsF,+CAA+C,2EAA2E,0DAA0D,0EAA0E,cAAc,sGAAsG,+CAA+C,2EAA2E,0DAA0D,0EAA0E,cAAc,iDAAiD,iHAAiH,oFAAoF,6EAA6E,mFAAmF,2DAA2D,mBAAmB,yCAAyC,KAAK,UAAU;;AAEn0D;AACA,sCAAsC,iDAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,0BAA0B,0CAAS;AACnC,0BAA0B,0CAAS;AACnC,2BAA2B,0CAAS,KAAK,0CAAS;AAClD,OAAO;AACP,gBAAgB,6CAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,qBAAqB,4CAAS;AAC9B;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,yCAAyC,oDAAkB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,yCAAyC,oDAAkB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6CAAU;AACrB;AACA;AACA,WAAW,8CAAW;AACtB;AACA;AACA,WAAW,6CAAU;AACrB;AACA;AACA,WAAW,gDAAa;AACxB;AACA;AACA,WAAW,4CAAS;AACpB;AACA;AACA,WAAW,iDAAc;AACzB;AACA;AACA,WAAW,oDAAiB;AAC5B;AACA;AACA,WAAW,+CAAY;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,4BAA4B,oDAAkB;AAC9C;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC6G;;AAE7G;AACA,oKAAoK,4CAA4C,qCAAqC,uBAAuB,oBAAoB,sBAAsB,qBAAqB,uBAAuB,iBAAiB,YAAY,eAAe,+BAA+B,iCAAiC,4BAA4B,qBAAqB,YAAY,cAAc,KAAK,aAAa,wCAAwC,gCAAgC,aAAa,0BAA0B,gDAAgD,kCAAkC;;AAE5uB;AACA,oCAAoC,iDAAgB;AACpD;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,2BAA2B,0CAAS;AACpC,qBAAqB,0CAAS;AAC9B,mBAAmB,0CAAS;AAC5B,oBAAoB,0CAAS;AAC7B,sBAAsB,0CAAS;AAC/B,sBAAsB,0CAAS;AAC/B,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yFAAyF,oCAAoC,yFAAyF,+BAA+B;;AAErP;AACA,4BAA4B,0CAAO;AACnC,4BAA4B,0CAAO;AACnC;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA,oBAAoB,0CAAS;AAC7B;AACA,KAAK;AACL;AACA;AACA;AACA,0BAA0B,wCAAM;AAChC,8BAA8B,0CAAS;AACvC,6BAA6B,oDAAmB,SAAS,oBAAoB;AAC7E;AACA;AACA;AACA;AACA,iCAAiC,oDAAmB;AACpD;AACA,8CAA8C,+CAAa;AAC3D;AACA,4DAA4D,wCAAM;AAClE;AACA,4CAA4C,wCAAM;AAClD,yCAAyC,YAAY;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA,+CAA+C,oDAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,iDAAe;AAC5E,gDAAgD,iDAAe;AAC/D,gDAAgD,iDAAe;AAC/D,oDAAoD,iDAAe;AACnE;AACA;AACA;AACA;;AAEA;AACmE;;AAEnE;AACA,uCAAuC,wBAAwB,+EAA+E,kFAAkF,qEAAqE;;AAErS;AACA,+BAA+B,sDAAM;AACrC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,kEAAkE,IAAI;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACkE;;AAElE;AACA,+CAA+C,yBAAyB,+EAA+E,qGAAqG,4CAA4C,wBAAwB,mBAAmB,0CAA0C,KAAK,yBAAyB,+CAA+C;;AAE1c;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,6DAA6D,IAAI;AACjF;AACA;AACA;AACA,oBAAoB,0CAAS,KAAK,0CAAQ;AAC1C,2BAA2B,0CAAS;AACpC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACmE;;AAEnE;AACA,uDAAuD,4BAA4B,yBAAyB,mBAAmB,6BAA6B,0DAA0D,2BAA2B,wBAAwB,yDAAyD,iIAAiI,+BAA+B,+EAA+E,iCAAiC;;AAEllB;AACA,yCAAyC,sDAAM;AAC/C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACuE;;AAEvE;AACA,gHAAgH,uCAAuC,4CAA4C,yFAAyF,wJAAwJ;;AAEpb;AACA,gCAAgC,sDAAM;AACtC;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B;AACA,qBAAqB,oCAAoC,IAAI;AAC7D;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAUe;;AAEf;AAae;;AAEf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,mBAAmB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B,cAAc,cAAc;AAC5B;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,MAAM,OAAO,wBAAwB,owBAAowB,oBAAoB,6MAA6M,yBAAyB,wBAAwB,sBAAsB,oCAAoC,wBAAwB,iJAAiJ,sCAAsC,KAAK,MAAM,+GAA+G,sBAAsB,qBAAqB,6BAA6B,oRAAoR,gEAAgE,oPAAoP,YAAY,mBAAmB,+HAA+H,YAAY,IAAI,gBAAgB,IAAI,gBAAgB,IAAI,KAAK,gDAAgD,4DAA4D,WAAW,oCAAoC,sBAAsB,oBAAoB,qCAAqC,MAAM,kCAAkC,GAAG,IAAI;;AAErmF;AACA,4BAA4B,wCAAM;AAClC,iDAAiD,gDAAa;AAC9D;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB;AACA;AACA;AACA,gBAAgB,4CAAU;AAC1B,kBAAkB,6CAAW;AAC7B,qBAAqB,+CAAa;AAClC,qBAAqB,+CAAa;AAClC,iBAAiB,sDAAmB;AACpC,iBAAiB,sDAAmB;AACpC,iBAAiB,sDAAmB;AACpC;AACA;AACA,sBAAsB,uDAAqB;AAC3C,yBAAyB,0CAAQ;AACjC,yBAAyB,0CAAQ;AACjC;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,sBAAsB,4CAAU,kBAAkB,4CAAU;AAClE;AACA,MAAM,wBAAwB,6CAAW,oBAAoB,6CAAW;AACxE;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA,sBAAsB,4CAAU;AAChC;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA,kBAAkB,mDAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA,sBAAsB,mDAAkB;AACxC;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA,kBAAkB,4CAAU;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA,sBAAsB,4CAAU;AAChC,uCAAuC,OAAO;AAC9C;AACA;AACA,wBAAwB,iDAAe;AACvC;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA,sBAAsB,4CAAU;AAChC,uCAAuC,OAAO;AAC9C;AACA;AACA,wBAAwB,uDAAqB;AAC7C;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA,wBAAwB,8CAAY;AACpC;AACA;AACA;AACA,wBAAwB,+CAAa;AACrC,wBAAwB,+CAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,cAAc,eAAe;AAC7B;AACA;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC,0BAA0B,UAAU;AACpC,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B,sBAAsB,UAAU;AAChC,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC,oBAAoB,qDAAqD,uBAAuB,mHAAmH,uCAAuC,4CAA4C,2CAA2C,sDAAsD,aAAa,gCAAgC,gCAAgC,WAAW,UAAU,aAAa,YAAY,WAAW,wBAAwB,yBAAyB,kBAAkB,WAAW,wBAAwB,yBAAyB,KAAK,WAAW,wBAAwB,0BAA0B,KAAK,YAAY,WAAW,wBAAwB,yBAAyB,kBAAkB,WAAW,wBAAwB,yBAAyB,KAAK,WAAW,wBAAwB,0BAA0B,wBAAwB,wBAAwB,wBAAwB,wBAAwB,iEAAiE,kHAAkH,4BAA4B,iCAAiC,WAAW,mGAAmG,uCAAuC,4CAA4C,2CAA2C,2BAA2B,0BAA0B,0BAA0B,gCAAgC,yCAAyC,oIAAoI,qDAAqD,qDAAqD,8GAA8G,oDAAoD,oDAAoD,0CAA0C,gCAAgC,iDAAiD,yFAAyF,sBAAsB,6IAA6I,gCAAgC,KAAK,kBAAkB,wFAAwF,yCAAyC,4CAA4C;;AAEvsF;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA,sBAAsB,iDAAgB;AACtC,IAAI,IAAI;AACR;AACA;AACA;AACA,oBAAoB,0CAAS;AAC7B,sBAAsB,0CAAS,KAAK,0CAAQ;AAC5C,uBAAuB,0CAAS,KAAK,0CAAQ;AAC7C,0BAA0B,0CAAS;AACnC,0BAA0B,0CAAS;AACnC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAU,mBAAmB,gDAAc;AACtE;AACA;AACA;AACA;AACA,UAAU,0BAA0B,gDAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,gDAAc;AACxE;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAa;AACnC,sBAAsB,+CAAa;AACnC;AACA,2BAA2B,gDAAc;AACzC,0BAA0B,gDAAc;AACxC,0BAA0B,gDAAc;AACxC,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oGAAoG,qCAAqC,yFAAyF,8CAA8C,WAAW;;AAE3R;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB;AACA,gBAAgB,4DAA4D,IAAI;AAChF,0CAA0C,eAAe;AACzD;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACmL;;AAEnL;AACwK;;AAExK;AACA,qKAAqK,+CAA+C,mCAAmC,wBAAwB,8BAA8B,oCAAoC,YAAY,oGAAoG,6CAA6C,qGAAqG,gEAAgE,0GAA0G,+EAA+E,mDAAmD,qCAAqC;;AAEp6B;AACA,sLAAsL,2BAA2B,YAAY,iKAAiK,0BAA0B,sCAAsC;;AAE9b;AACA,4CAA4C,iDAAgB;AAC5D;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,mBAAmB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,wBAAwB,0CAAS;AACjC,uBAAuB,0CAAS;AAChC,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,mDAAgB;AACxC;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,wCAAwC,mDAAgB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,4BAA4B,oDAAkB;AAC9C;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACmI;;AAEnI;AACA,0DAA0D,kBAAkB,kBAAkB,kBAAkB,kBAAkB,YAAY,uCAAuC,uCAAuC,uCAAuC,uCAAuC,yBAAyB,yBAAyB,4BAA4B,wBAAwB,wBAAwB,kCAAkC,sEAAsE;;AAEhhB;AACA,+CAA+C,kBAAkB,kBAAkB,kBAAkB,kBAAkB,YAAY,4BAA4B,iCAAiC,iCAAiC,iCAAiC,iCAAiC,uCAAuC;;AAE1U;AACA,oCAAoC,iDAAgB;AACpD;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA,8BAA8B,0CAAS;AACvC;AACA;AACA;AACA,yBAAyB,0CAAS;AAClC,uBAAuB,0CAAS,KAAK,0CAAS;AAC9C,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AAC6K;AAC7K;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA,wDAAwD,oDAAiB;AACzE,oBAAoB,mDAAiB;AACrC,KAAK;AACL;AACA;AACA;AACA;AACA,uCAAuC,wCAAM;AAC7C;AACA;AACA;AACA,8BAA8B,oDAAmB;AACjD,mBAAmB,gDAAc;AACjC,mBAAmB,gDAAc;AACjC,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2DAA2D,mCAAmC,8BAA8B,6BAA6B,oBAAoB,2BAA2B,4DAA4D,wBAAwB,yFAAyF,uCAAuC,uCAAuC,4BAA4B,4CAA4C,0DAA0D,2BAA2B,6EAA6E,uCAAuC,gCAAgC,6DAA6D,8CAA8C,yCAAyC,+DAA+D,8CAA8C,yDAAyD,WAAW;;AAEzjC;AACA,mDAAmD,wBAAwB,mCAAmC,6CAA6C;;AAE3J;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA,4BAA4B,0CAAS;AACrC,4BAA4B,0CAAS;AACrC,6BAA6B,0CAAS;AACtC,iCAAiC,0CAAS,KAAK,wCAAM;AACrD,gCAAgC,0CAAS,KAAK,wCAAM;AACpD,sBAAsB,0CAAS;AAC/B,6BAA6B,0CAAS;AACtC,+BAA+B,0CAAS;AACxC;AACA,KAAK;AACL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gCAAgC,oDAAmB;AACnD;AACA;AACA;AACA,mCAAmC,oDAAmB,SAAS,oBAAoB;AACnF;AACA;AACA;AACA,4CAA4C,wCAAM;AAClD;AACA;AACA;AACA;AACA,uCAAuC,wCAAM;AAC7C;AACA,yCAAyC,uDAAuD;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iDAAe;AACjD;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA,8CAA8C,mDAAkB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACwF;;AAExF;AACA,8CAA8C,eAAe,2BAA2B,WAAW,+BAA+B;;AAElI;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,uBAAuB,0CAAS;AAChC,kBAAkB,0CAAS,KAAK,0CAAQ;AACxC;AACA,KAAK;AACL,0BAA0B,0CAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACkE;;AAElE;AACA,mDAAmD,0BAA0B,oBAAoB,sBAAsB,iCAAiC,4BAA4B,mBAAmB,qBAAqB,sCAAsC,gEAAgE,qCAAqC,qDAAqD,sDAAsD,uDAAuD,sDAAsD,qCAAqC,yBAAyB,0BAA0B,iCAAiC,mBAAmB,0CAA0C,4DAA4D,0CAA0C,uBAAuB,kBAAkB,sBAAsB,0CAA0C,gBAAgB,+BAA+B,sEAAsE,iCAAiC,gLAAgL,6CAA6C,sEAAsE,0CAA0C,0JAA0J,2BAA2B,0CAA0C,wCAAwC,qBAAqB,mFAAmF,sCAAsC,oGAAoG,6FAA6F,uEAAuE,iCAAiC,gEAAgE,sCAAsC,wCAAwC,2CAA2C,8CAA8C,gCAAgC,iCAAiC,6DAA6D,mEAAmE,kFAAkF,0CAA0C,2DAA2D,yBAAyB,0BAA0B,eAAe,uCAAuC,YAAY,gBAAgB,YAAY,aAAa,KAAK,0BAA0B,YAAY,mBAAmB,KAAK,mBAAmB,OAAO,2EAA2E,UAAU,kDAAkD,iDAAiD,qDAAqD,+CAA+C,yDAAyD,gDAAgD;;AAEp0G;AACA,yCAAyC,sDAAM;AAC/C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACmE;;AAEnE;AACA,6CAA6C,2CAA2C,yFAAyF,aAAa,qCAAqC,kDAAkD,uCAAuC;;AAE5T;AACA,mCAAmC,sDAAM;AACzC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,yEAAyE,IAAI;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACwF;;AAExF;AACA,8CAA8C,oBAAoB,uBAAuB,qBAAqB,wBAAwB,wBAAwB,oBAAoB,2BAA2B,WAAW,uCAAuC,4DAA4D,sDAAsD,oBAAoB,6BAA6B,2CAA2C,kCAAkC,gCAAgC,qDAAqD,uDAAuD;;AAE3nB;AACA,8CAA8C,6BAA6B,oBAAoB,mBAAmB,iCAAiC;;AAEnJ;AACA;AACA,6BAA6B,0CAAQ;AACrC,6BAA6B,0CAAQ;AACrC,oCAAoC,sDAAM;AAC1C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AASe;AACf;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ,8BAA8B,mBAAmB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,wCAAM;AAClD;AACA;AACA;AACA;AACA,sCAAsC,mDAAiB;AACvD,kCAAkC,6CAAW;AAC7C,kCAAkC,oDAAmB,SAAS,oBAAoB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gDAAc,GAAG,6CAAW;AAC3E;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,+CAA+C,oDAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,iDAAgB;AAC7E,qDAAqD,iDAAgB;AACrE;AACA;AACA;AACA;;AAEA;AACkE;;AAElE;AACA,2CAA2C,sBAAsB,sBAAsB,+EAA+E,wGAAwG,sCAAsC;;AAEpT;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB;AACA,gBAAgB,+BAA+B,IAAI;AACnD;AACA;AACA;AACA,yBAAyB,0CAAS,KAAK,0CAAQ;AAC/C,yBAAyB,0CAAS,KAAK,0CAAQ;AAC/C,yBAAyB,0CAAS,KAAK,0CAAQ;AAC/C;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AAUe;;AAEf;AACmM;;AAEnM;AACA,+CAA+C,kBAAkB,kBAAkB,kDAAkD,kBAAkB,kBAAkB,kBAAkB,iMAAiM,+CAA+C,4CAA4C,iFAAiF,4CAA4C,WAAW,uBAAuB,uBAAuB,4BAA4B,2BAA2B,2BAA2B,mEAAmE,uBAAuB,2CAA2C,gDAAgD,+CAA+C,2BAA2B,yEAAyE,kCAAkC,4CAA4C,6CAA6C,0EAA0E,sEAAsE,sBAAsB,2EAA2E,6EAA6E,mDAAmD,yEAAyE,2DAA2D,iCAAiC,8BAA8B,SAAS,iCAAiC,oFAAoF,uDAAuD,sDAAsD,WAAW,iCAAiC,oCAAoC,8BAA8B,SAAS,wDAAwD,yDAAyD,qCAAqC,qCAAqC,2DAA2D,yDAAyD,uDAAuD,mCAAmC,4CAA4C,qEAAqE,iCAAiC,6CAA6C,sCAAsC,2CAA2C,oBAAoB,8BAA8B,0CAA0C,cAAc,8BAA8B,oCAAoC,8BAA8B,SAAS,4CAA4C,gBAAgB,8BAA8B,6CAA6C,iBAAiB,8BAA8B,qCAAqC,+CAA+C,mBAAmB,8BAA8B,6CAA6C,iBAAiB,8BAA8B,mCAAmC,4CAA4C,kEAAkE,iCAAiC,WAAW;;AAEx/G;AACA,sDAAsD,iBAAiB,kBAAkB,kBAAkB,kDAAkD,kBAAkB,kBAAkB,kBAAkB,sBAAsB,wBAAwB,kCAAkC,kCAAkC,iEAAiE,iCAAiC,kCAAkC,kCAAkC,iDAAiD;;AAE5hB;AACA,0CAA0C,iDAAgB;AAC1D;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,mBAAmB;AAChC;AACA,8BAA8B,0CAAS;AACvC;AACA;AACA;AACA,wBAAwB,mDAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,yBAAyB,0CAAS;AAClC,+BAA+B,0CAAS;AACxC,uBAAuB,0CAAS;AAChC,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,wCAAwC,oDAAkB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACmI;;AAEnI;AACA,+PAA+P,4CAA4C,6CAA6C,qCAAqC,uBAAuB,wBAAwB,iBAAiB,wBAAwB,uBAAuB,qEAAqE,QAAQ,oBAAoB,QAAQ,qBAAqB,qEAAqE,iCAAiC,kCAAkC,yCAAyC,8BAA8B,iBAAiB,yCAAyC,iCAAiC,iBAAiB,sEAAsE,mCAAmC,2BAA2B,YAAY,uBAAuB,KAAK,+DAA+D,OAAO,oCAAoC,qCAAqC,0BAA0B,iBAAiB,sEAAsE,mCAAmC,0BAA0B,2BAA2B,YAAY,uBAAuB,KAAK,+DAA+D,OAAO,oCAAoC,qCAAqC,8BAA8B,0BAA0B,iBAAiB,wEAAwE,+EAA+E,4DAA4D,gBAAgB,uCAAuC,2CAA2C,iGAAiG,uBAAuB,OAAO,SAAS,YAAY,8CAA8C,uBAAuB,KAAK,gBAAgB,8CAA8C,gBAAgB,2EAA2E,OAAO,gEAAgE,+DAA+D,wCAAwC,4BAA4B,0CAA0C,+CAA+C,+CAA+C,gEAAgE,yCAAyC,uBAAuB,KAAK,gBAAgB,gBAAgB,iEAAiE,OAAO,8DAA8D,8DAA8D,+DAA+D,4BAA4B,0CAA0C,kDAAkD,gBAAgB,0DAA0D,yCAAyC,0CAA0C,sBAAsB,qBAAqB,iCAAiC,gCAAgC,gDAAgD,uDAAuD,qBAAqB,YAAY,uBAAuB,KAAK,4CAA4C,OAAO,qCAAqC,4CAA4C,qDAAqD,sCAAsC,qDAAqD,qBAAqB,YAAY,uBAAuB,KAAK,4CAA4C,OAAO,qCAAqC,8CAA8C,qDAAqD,sCAAsC,kDAAkD,qBAAqB,YAAY,uBAAuB,KAAK,4CAA4C,OAAO,qCAAqC,+CAA+C,wDAAwD,sCAAsC,oDAAoD,qBAAqB,YAAY,uBAAuB,KAAK,4CAA4C,OAAO,qCAAqC,8CAA8C,wDAAwD,sCAAsC,wFAAwF,qEAAqE,4DAA4D,iDAAiD,2CAA2C,8FAA8F,yEAAyE,mDAAmD,kCAAkC,sBAAsB,gFAAgF,gFAAgF,iFAAiF,iFAAiF,+BAA+B,WAAW,4FAA4F,yEAAyE,mDAAmD,kCAAkC,sBAAsB,gFAAgF,gFAAgF,iFAAiF,iFAAiF,+BAA+B,WAAW,YAAY,uBAAuB,gCAAgC,qCAAqC,YAAY,gGAAgG,0BAA0B,iBAAiB,YAAY,iDAAiD,sBAAsB,aAAa,4CAA4C,kDAAkD,aAAa,uCAAuC,wBAAwB,kEAAkE,gDAAgD,eAAe,wDAAwD,yCAAyC,KAAK,SAAS,WAAW,YAAY,OAAO,YAAY,+CAA+C,sBAAsB,aAAa,4CAA4C,iDAAiD,aAAa,sCAAsC,wBAAwB,kEAAkE,gDAAgD,eAAe,uDAAuD,sBAAsB;;AAEzmP;AACA,oDAAoD,wBAAwB,iBAAiB,wBAAwB,uBAAuB,YAAY,wBAAwB,yBAAyB,kEAAkE,kEAAkE,2GAA2G,uCAAuC;;AAE/d;AACA,wCAAwC,iDAAgB;AACxD;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA,8BAA8B,0CAAS,qBAAqB,0CAAS;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,2BAA2B,0CAAS;AACpC,yBAAyB,0CAAS;AAClC,wBAAwB,0CAAS;AACjC,uBAAuB,0CAAS;AAChC,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAiD;;AAEjD;AACA,+CAA+C;;AAE/C;AACA,gDAAgD,sBAAsB,sBAAsB,qEAAqE,QAAQ,oBAAoB,QAAQ,qBAAqB,qEAAqE,iCAAiC,kCAAkC,+EAA+E,OAAO,oCAAoC,oCAAoC,gCAAgC,sBAAsB,2BAA2B,iCAAiC,0CAA0C,yBAAyB,qDAAqD,oCAAoC,8CAA8C,qEAAqE,+DAA+D,iEAAiE,mBAAmB;;AAEphC;AACA,2CAA2C,sBAAsB,mCAAmC,oCAAoC,qCAAqC;;AAE7K;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,YAAY;AACzB,aAAa,mBAAmB;AAChC,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA,0BAA0B,0CAAS;AACnC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,oDAAmB,SAAS,oBAAoB;AACjF;AACA;AACA;AACA;AACA;AACA,4CAA4C,wCAAM;AAClD;AACA;AACA;AACA;AACA;AACA,+BAA+B,iDAAc;AAC7C;AACA,gCAAgC,0CAAQ;AACxC;AACA,gCAAgC,gDAAc;AAC9C,gCAAgC,gDAAc;AAC9C;AACA;AACA;AACA;AACA,8BAA8B,0CAAQ;AACtC;AACA,8BAA8B,+CAAa;AAC3C,8BAA8B,+CAAa;AAC3C;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uBAAuB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qBAAqB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uDAAuD;AACjE;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oDAAoD;AAC9D;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,+CAA+C,oDAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACgN;;AAEhN;AAC2O;;AAE3O;AACA,6JAA6J,qDAAqD,4CAA4C,0CAA0C,6CAA6C,gEAAgE,iFAAiF,+CAA+C,4CAA4C,iFAAiF,4CAA4C,WAAW,8CAA8C,qCAAqC,8BAA8B,uBAAuB,2BAA2B,wBAAwB,6BAA6B,mBAAmB,mBAAmB,4BAA4B,6BAA6B,iBAAiB,kBAAkB,qCAAqC,mGAAmG,gFAAgF,WAAW,6FAA6F,+DAA+D,gEAAgE,oBAAoB,kDAAkD,iGAAiG,6DAA6D,4DAA4D,gCAAgC,2CAA2C,0BAA0B,6BAA6B,oBAAoB,WAAW,YAAY,cAAc,KAAK,6CAA6C,kCAAkC,0CAA0C,+CAA+C,2DAA2D,UAAU,oCAAoC,kCAAkC,qHAAqH,6CAA6C,uDAAuD,gCAAgC,4EAA4E,iDAAiD,WAAW,kBAAkB,uBAAuB,wCAAwC,kDAAkD,QAAQ,6CAA6C,YAAY,yEAAyE,+EAA+E,uBAAuB,0BAA0B,4BAA4B,+GAA+G,iCAAiC,2CAA2C,mDAAmD,mDAAmD,iEAAiE,kEAAkE,iBAAiB,4EAA4E,WAAW,mBAAmB;;AAE9jH;AACA,6CAA6C,iBAAiB,kBAAkB,YAAY,wBAAwB,oBAAoB,uCAAuC;;AAE/K;AACA,iCAAiC,gEAAgB;AACjD;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACqK;;AAErK;AAC6K;;AAE7K;AACA,6HAA6H,+CAA+C,yEAAyE,4BAA4B,kBAAkB,kBAAkB,kBAAkB,kCAAkC,iFAAiF,4CAA4C,WAAW,6CAA6C,2DAA2D,mBAAmB,+BAA+B,+BAA+B,+BAA+B,+BAA+B,qFAAqF,iBAAiB,gBAAgB,UAAU,gBAAgB,IAAI,KAAK,6BAA6B,kBAAkB,KAAK,kBAAkB,KAAK,IAAI,KAAK,4BAA4B,+EAA+E,oBAAoB,wBAAwB,wBAAwB,wBAAwB,mEAAmE,QAAQ,IAAI,KAAK,8BAA8B,QAAQ,qBAAqB,YAAY,WAAW,qBAAqB,qBAAqB,qBAAqB,qBAAqB,2BAA2B,uCAAuC,sCAAsC,sCAAsC,sCAAsC,sCAAsC,mBAAmB,eAAe,eAAe,eAAe,eAAe,gDAAgD;;AAE/uD;AACA,0DAA0D,kBAAkB,kBAAkB,kBAAkB,kBAAkB,YAAY,4BAA4B,QAAQ,iCAAiC,iCAAiC,kBAAkB,uCAAuC;;AAE7S;AACA,8CAA8C,gEAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,oDAAI;AAC9C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS,+EAA+E,iBAAiB;AACtH,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qDAAqD,iCAAiC,wBAAwB,6IAA6I,qDAAqD,sDAAsD,8GAA8G,wCAAwC,0GAA0G,8DAA8D,8DAA8D,8DAA8D,8DAA8D,uDAAuD,uDAAuD,uDAAuD,yCAAyC,+BAA+B,2BAA2B,UAAU,YAAY,IAAI,KAAK,2CAA2C,8BAA8B,0BAA0B,UAAU,iBAAiB,sBAAsB,sBAAsB,sBAAsB,sBAAsB,mEAAmE,+CAA+C,mCAAmC,2BAA2B,4CAA4C,oCAAoC,+BAA+B,qEAAqE,qDAAqD,WAAW;;AAE/vD;AACA;AACA,+BAA+B,sDAAM;AACrC;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wDAAwD,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA,6DAA6D,+BAA+B;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACqF;;AAErF;AACA,oFAAoF,oCAAoC,4BAA4B,+EAA+E,sDAAsD,sCAAsC,6BAA6B;;AAE5V;AACA,sEAAsE,kCAAkC,4BAA4B,mCAAmC,2DAA2D,4CAA4C,WAAW;;AAEzR;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA,gBAAgB,0DAA0D,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0CAAS;AAC7B,sBAAsB,0CAAS;AAC/B,4BAA4B,0CAAS;AACrC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,2BAA2B,mDAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B,aAAa,cAAc;AAC3B,aAAa,cAAc;AAC3B,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACiJ;;AAEjJ;AACwF;;AAExF;AACA,+GAA+G,4CAA4C,kCAAkC,iBAAiB,kBAAkB,qBAAqB,2CAA2C,wFAAwF,YAAY,kDAAkD,8DAA8D,0DAA0D,0DAA0D,0DAA0D,sBAAsB,mCAAmC;;AAE3tB;AACA,8DAA8D,qBAAqB,oBAAoB,qBAAqB,sBAAsB,iBAAiB,kBAAkB,qBAAqB,YAAY,4BAA4B,OAAO,mCAAmC,iEAAiE,uDAAuD,uCAAuC;;AAE3b;AACA,0CAA0C,kEAAkB;AAC5D;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC,8DAAc;AACpD;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR,YAAY,uDAAuD;AACnE,oDAAoD,kDAAkD;AACtG;AACA;;AAEA;AACA,2FAA2F,oCAAoC,kCAAkC,kBAAkB,2CAA2C,kDAAkD,+EAA+E,sCAAsC,6BAA6B,wCAAwC;;AAE1c;AACA,iDAAiD,kBAAkB,mCAAmC,mCAAmC,kEAAkE;;AAE3M;AACA,oCAAoC,sDAAM;AAC1C;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,wDAAwD,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACwI;;AAExI;AACkG;;AAElG;AAC6G;;AAE7G;AACA,gMAAgM,wCAAwC,2BAA2B,wBAAwB,kBAAkB,iBAAiB,YAAY,4DAA4D,wFAAwF,mEAAmE,kCAAkC,wBAAwB,sDAAsD,sEAAsE;;AAEvtB;AACA,8CAA8C,iDAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,8BAA8B,0CAAS;AACvC,8BAA8B,0CAAS;AACvC,0BAA0B,0CAAS;AACnC,uBAAuB,0CAAS;AAChC,iBAAiB,0CAAS;AAC1B,OAAO;AACP;AACA;AACA,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,iCAAiC,0CAA0C,IAAI;AAC/E;AACA;AACA;AACA,oCAAoC,oDAAmB;AACvD,iBAAiB,gDAAc;AAC/B,iBAAiB,gDAAc;AAC/B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2FAA2F,iFAAiF,qEAAqE,wCAAwC,gDAAgD,2BAA2B,yBAAyB,mGAAmG,uCAAuC,0DAA0D,sEAAsE,+BAA+B,2CAA2C,uKAAuK,+CAA+C,uCAAuC,2BAA2B,kFAAkF,yFAAyF,4HAA4H,qGAAqG,oEAAoE,WAAW;;AAEp8C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA,gCAAgC,0CAAS;AACzC,6BAA6B,0CAAS;AACtC;AACA,2BAA2B,0CAAS;AACpC,2BAA2B,0CAAS;AACpC,iCAAiC,0CAAS;AAC1C;AACA,KAAK;AACL,qCAAqC,oDAAmB;AACxD,iBAAiB,2DAAwB;AACzC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mDAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2BAA2B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AAC6C;;AAE7C;AACA,6CAA6C,uBAAuB,+EAA+E,4BAA4B,0BAA0B,2DAA2D,wDAAwD,6CAA6C,qDAAqD,gDAAgD;;AAE9c;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0CAAS;AAChC,yBAAyB,0CAAS;AAClC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AAC8E;AAC9E,iCAAiC,yCAAM;AACvC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,cAAc,wBAAwB;AACtC;AACA;AACA,GAAG;AACH,GAAG;AACH;AACA,gCAAgC,iDAAe;AAC/C,uBAAuB,6CAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,KAAK;AACzC;AACA,UAAU;AACV,mCAAmC,KAAK;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,eAAe;AAC7B,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC6H;AAC7H,kCAAkC,yCAAO;AACzC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,cAAc,wBAAwB;AACtC;AACA;AACA,GAAG;AACH,GAAG;AACH;AACA,gCAAgC,iDAAe;AAC/C,uBAAuB,6CAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,KAAK;AACzC;AACA,UAAU;AACV,mCAAmC,KAAK;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,eAAe;AAC7B,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0CAAQ;AAClC,0BAA0B,0CAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC6E;AAC7E,oCAAoC,uDAAO;AAC3C;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,cAAc,kBAAkB;AAChC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,IAAI;AACxC;AACA,UAAU;AACV,mCAAmC,IAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AAC4K;;AAE5K;AACA,wGAAwG,4CAA4C,2EAA2E,oGAAoG,qDAAqD,4CAA4C,0CAA0C,uEAAuE,iFAAiF,+CAA+C,4CAA4C,iFAAiF,4CAA4C,WAAW,+CAA+C,mGAAmG,gFAAgF,WAAW,wSAAwS,+BAA+B,+BAA+B,kGAAkG,2CAA2C,2CAA2C,2CAA2C,2CAA2C,gCAAgC,oBAAoB,iBAAiB,sBAAsB,uMAAuM,gOAAgO,8eAA8e,ghBAAghB,wCAAwC,gCAAgC,oHAAoH,YAAY,iBAAiB,KAAK,uDAAuD,eAAe,MAAM,4CAA4C,uBAAuB,4BAA4B,oBAAoB,KAAK,4BAA4B,oBAAoB,KAAK,4BAA4B,wBAAwB,qDAAqD,oDAAoD,YAAY,OAAO,yCAAyC,8FAA8F,iBAAiB,KAAK,cAAc,gCAAgC,4BAA4B,oBAAoB,KAAK,4BAA4B,oBAAoB,KAAK,mCAAmC,iDAAiD,WAAW;;AAErsI;AACA,uDAAuD,oBAAoB,uDAAuD,+BAA+B,+BAA+B,kGAAkG,2CAA2C,2CAA2C,2CAA2C,2CAA2C,0BAA0B,sBAAsB,4BAA4B,+CAA+C,2BAA2B,0BAA0B,0BAA0B,0BAA0B,SAAS,yBAAyB,0BAA0B,yBAAyB,yBAAyB,iDAAiD,2BAA2B,2BAA2B,0BAA0B,0BAA0B,0BAA0B,2BAA2B,2BAA2B,0BAA0B,0BAA0B,0BAA0B,0BAA0B,0BAA0B,SAAS,yBAAyB,yBAAyB,0BAA0B,0BAA0B,yBAAyB,yBAAyB,yBAAyB,0BAA0B,0BAA0B,yBAAyB,yBAAyB,yBAAyB,gBAAgB,iDAAiD;;AAEvgD;AACA,oCAAoC,gEAAgB;AACpD;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,oCAAoC,IAAI;AACxD;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,gDAAgD,mBAAmB;AACnE;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AAC6K;;AAE7K;AACA,+DAA+D,oGAAoG,qDAAqD,4CAA4C,0CAA0C,6EAA6E,iFAAiF,+CAA+C,4CAA4C,uFAAuF,4CAA4C,WAAW,sBAAsB,2FAA2F,oCAAoC,+FAA+F,4CAA4C,mBAAmB;;AAEx+B;AACA,4CAA4C,uDAAuD,sBAAsB,8CAA8C,iCAAiC,iDAAiD;;AAEzP;AACA,sCAAsC,gEAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AAC6O;;AAE7O;AACA,4QAA4Q,4CAA4C,wEAAwE,iFAAiF,+CAA+C,kCAAkC,uBAAuB,yBAAyB,wBAAwB,qBAAqB,mBAAmB,iBAAiB,uCAAuC,wJAAwJ,kCAAkC,iFAAiF,4CAA4C,WAAW,qCAAqC,wFAAwF,qEAAqE,WAAW,iCAAiC,kFAAkF,gEAAgE,yBAAyB,2CAA2C,sBAAsB,iCAAiC,uBAAuB,wBAAwB,2CAA2C,wBAAwB,gCAAgC,2BAA2B,2BAA2B,2BAA2B,mCAAmC,iCAAiC,yBAAyB,uCAAuC,yBAAyB,0BAA0B,uDAAuD,sBAAsB,qDAAqD,oBAAoB,gGAAgG;;AAEvpE;AACA,+CAA+C,uBAAuB,yBAAyB,wBAAwB,qBAAqB,mBAAmB,iBAAiB,wBAAwB,wBAAwB,2DAA2D;;AAE3R;AACA,mCAAmC,iDAAgB;AACnD;AACA;AACA;AACA,aAAa,qBAAqB;AAClC,aAAa,qBAAqB;AAClC,aAAa,sBAAsB;AACnC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,wBAAwB,mDAAiB;AACzC;AACA;AACA,OAAO;AACP;AACA,yBAAyB,0CAAS;AAClC,yBAAyB,0CAAS;AAClC,wBAAwB,0CAAS,KAAK,0CAAS;AAC/C,uBAAuB,0CAAS,KAAK,0CAAS;AAC9C,wBAAwB,0CAAS;AACjC,uBAAuB,0CAAS;AAChC,oBAAoB,0CAAS;AAC7B,kBAAkB,0CAAS;AAC3B,OAAO;AACP,gBAAgB,6CAAY;AAC5B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,wCAAwC,oDAAmB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,kBAAkB;AAC/B,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB,oDAAoD,0BAA0B;AAChH,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB;AAClC,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,sBAAsB;AACnC,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB;AAClC,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,4BAA4B,oDAAkB;AAC9C;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACmI;;AAEnI;AACA,6GAA6G,4CAA4C,qCAAqC,qBAAqB,iBAAiB,YAAY,mDAAmD,YAAY,QAAQ,KAAK,gCAAgC,0CAA0C,0CAA0C,6BAA6B,oBAAoB,mCAAmC;;AAEpgB;AACA,4DAA4D,uBAAuB,oBAAoB,qBAAqB,iBAAiB,YAAY,kCAAkC,wBAAwB,uCAAuC;;AAE1P;AACA,yCAAyC,gEAAgB;AACzD;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,gBAAgB,kBAAkB,IAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACuL;AACvL,gCAAgC,oDAAI;AACpC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA,yDAAyD,oBAAoB;AAC7E;AACA,yDAAyD,oBAAoB;AAC7E;AACA,8CAA8C,uBAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACwJ;;AAExJ;AAQe;AACf,kCAAkC,oDAAI;AACtC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,wBAAwB;AACrC;AACA,gBAAgB,mCAAmC,IAAI;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,mDAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,6DAAa;AAClD;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,wBAAwB;AACrC,aAAa,QAAQ;AACrB;AACA,gBAAgB,gEAAgE,IAAI;AACpF;AACA,oDAAoD,aAAa;AACjE;AACA,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC4K;AAC5K;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,YAAY;AAC5D,IAAI;AACJ,6FAA6F,YAAY;AACzG,IAAI;AACJ,oEAAoE,YAAY;AAChF,IAAI;AACJ,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA,+BAA+B,OAAO;AACtC,2CAA2C,SAAS;AACpD,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,iDAAgB,sCAAsC,sCAAsC;AACpJ;AACA,sCAAsC,+CAAa;AACnD;AACA,QAAQ;AACR;AACA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,4CAA4C,wBAAwB,mBAAmB,aAAa;;AAEpG;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,iEAAiE,YAAY;AAC7E,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,wBAAwB;AACrG;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA,MAAM;AACN;AACA;AACA,4BAA4B,iDAAgB;AAC5C,0DAA0D;AAC1D;AACA;AACA,iDAAiD;AACjD;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,wBAAwB;AACrC;AACA,+CAA+C,oDAAmB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,mDAAkB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC6I;AAC7I,qCAAqC,oDAAI;AACzC;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA,yDAAyD,oBAAoB;AAC7E;AACA;AACA;AACA,mDAAmD,YAAY;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,oDAAI;AACnC;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACuI;AACvI;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA,wDAAwD,qDAAkB;AAC1E;AACA;AACA;AACA;AACA,uCAAuC,wCAAM;AAC7C;AACA;AACA;AACA,8BAA8B,oDAAmB;AACjD,mBAAmB,gDAAc;AACjC,mBAAmB,gDAAc;AACjC,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B,sBAAsB,UAAU;AAChC,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B,sBAAsB,UAAU;AAChC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B,sBAAsB,UAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,OAAO;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAC0D;;AAE1D;AACA,oCAAoC,MAAM,kBAAkB,4DAA4D,8DAA8D,KAAK,6BAA6B,oCAAoC,SAAS,cAAc,4BAA4B,uCAAuC,WAAW,6EAA6E,eAAe,IAAI,iBAAiB,KAAK,uBAAuB,eAAe,4DAA4D,cAAc,sBAAsB,u9BAAu9B,kBAAkB,iBAAiB,cAAc,iCAAiC,cAAc,uHAAuH,oEAAoE,wBAAwB,sDAAsD,4FAA4F,cAAc,wDAAwD,KAAK,uEAAuE,yGAAyG,mBAAmB,SAAS,sBAAsB,0CAA0C,UAAU,QAAQ,cAAc,MAAM,QAAQ,sCAAsC,MAAM,QAAQ,sCAAsC,MAAM,QAAQ,uEAAuE,MAAM,QAAQ,sCAAsC,MAAM,QAAQ,cAAc,MAAM,QAAQ,oJAAoJ,MAAM,QAAQ,eAAe,MAAM,QAAQ,sCAAsC,MAAM,QAAQ,oJAAoJ,MAAM,SAAS,cAAc,MAAM,SAAS,eAAe,MAAM,SAAS,uEAAuE,MAAM,SAAS,eAAe,MAAM,SAAS,eAAe,MAAM,SAAS,cAAc,OAAO,SAAS,wBAAwB,mBAAmB,OAAO,oCAAoC,oBAAoB,SAAS,wBAAwB,QAAQ,YAAY,IAAI,gBAAgB,IAAI,KAAK,wBAAwB,wBAAwB,eAAe,4BAA4B,yBAAyB,yGAAyG,sBAAsB,0BAA0B,UAAU,QAAQ,oFAAoF,MAAM,QAAQ,oFAAoF,MAAM,QAAQ,oFAAoF,MAAM,QAAQ,uBAAuB,MAAM,QAAQ,oFAAoF,MAAM,QAAQ,oFAAoF,MAAM,QAAQ,uBAAuB,MAAM,QAAQ,oFAAoF,MAAM,QAAQ,oFAAoF,MAAM,QAAQ,8CAA8C,MAAM,SAAS,oFAAoF,MAAM,SAAS,oFAAoF,MAAM,SAAS,uBAAuB,MAAM,SAAS,oFAAoF,MAAM,SAAS,oFAAoF,MAAM,SAAS,oFAAoF,OAAO,SAAS,kBAAkB,0BAA0B,uBAAuB,IAAI,KAAK,8BAA8B,YAAY,IAAI,gBAAgB,IAAI,KAAK,4BAA4B,gBAAgB,gCAAgC,0BAA0B,uBAAuB,uBAAuB,IAAI,KAAK,qCAAqC,YAAY,IAAI,gBAAgB,IAAI,KAAK,oEAAoE,8CAA8C,YAAY,kBAAkB,0GAA0G,uBAAuB,IAAI,cAAc,YAAY,KAAK,wGAAwG,uBAAuB,IAAI,uCAAuC,uBAAuB,IAAI,yCAAyC,WAAW,iqBAAiqB,kBAAkB,iBAAiB,oBAAoB,gCAAgC,qBAAqB,gBAAgB,QAAQ,sEAAsE,gBAAgB,QAAQ,0FAA0F,YAAY,kBAAkB,mEAAmE,YAAY,KAAK,gBAAgB,KAAK,KAAK,0BAA0B,uBAAuB,mCAAmC,oCAAoC,iBAAiB,KAAK,gBAAgB,KAAK,mCAAmC,wBAAwB,oCAAoC,kCAAkC,aAAa,kCAAkC,wCAAwC,GAAG,IAAI;;AAEx8O;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;;AAE5C;AACA,UAAU,eAAe;AACzB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAE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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ,kCAAkC;;AAElC;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;;AAErB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAE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EA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAuC,QAAQ;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA,uCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AA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CA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,oBAAoB,SAAS;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wBAAwB,kBAAkB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AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAW,yEAAyE;AACpF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,gEAAgE;;AAEhE;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAkB;AAClB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,UAAU,kCAAkC;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA,kBAAkB;AAClB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB,aAAa;AAC9B,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,6CAA6C,OAAO;;AAEpD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,4BAA4B;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,oBAAoB,aAAa;;AAEjC;;AAEA,qBAAqB,aAAa;;AAElC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,oBAAoB,YAAY;;AAEhC,qBAAqB,YAAY;;AAEjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qHAAqH;;AAErH,2FAA2F,gCAAgC,uHAAuH,KAAK,gCAAgC,2DAA2D,KAAK,kDAAkD,gHAAgH,6DAA6D,sHAAsH,2IAA2I,mDAAmD,sEAAsE,oDAAoD,uLAAuL,wGAAwG,8CAA8C,KAAK;;AAEtzC,uGAAuG;;AAEvG,gFAAgF;;AAEhF,6KAA6K,yCAAyC,uDAAuD;;AAE7Q,+EAA+E;;AAE/E,mIAAmI,uDAAuD,qFAAqF,uFAAuF,qIAAqI,iHAAiH;;AAE5lB,uEAAuE,iCAAiC;;AAExG,kJAAkJ,sDAAsD,+CAA+C,gDAAgD,qDAAqD,2BAA2B,uBAAuB,uBAAuB,gEAAgE,oEAAoE,oEAAoE,oEAAoE,oCAAoC,KAAK,8CAA8C,uDAAuD,uBAAuB,uBAAuB,0EAA0E,KAAK,8EAA8E,+CAA+C,0DAA0D,uBAAuB,uBAAuB,uBAAuB,sEAAsE,KAAK;;AAEnwC,uHAAuH;;AAEvH,wDAAwD,uDAAuD;;AAE/G,6DAA6D,iEAAiE;;AAE9H,6CAA6C,gBAAgB,GAAG,wEAAwE,+EAA+E,GAAG,sJAAsJ,mDAAmD,qDAAqD,sDAAsD,oDAAoD,uCAAuC,+CAA+C,yBAAyB,IAAI;;AAErrB,sNAAsN,yCAAyC,qCAAqC,iEAAiE,KAAK,kEAAkE,yGAAyG,KAAK,oEAAoE,wFAAwF,KAAK,mDAAmD,4CAA4C,4DAA4D,4DAA4D,4DAA4D,0GAA0G,yIAAyI,uBAAuB,qCAAqC,iBAAiB,KAAK,iHAAiH,aAAa,iGAAiG,4FAA4F,4CAA4C,gCAAgC,2BAA2B,OAAO,4CAA4C,6DAA6D,kDAAkD,6BAA6B,wBAAwB,oDAAoD,+BAA+B,mEAAmE,uDAAuD,iDAAiD,+BAA+B,2DAA2D,2DAA2D,2DAA2D,uEAAuE,uCAAuC,mDAAmD,+BAA+B,4DAA4D,yBAAyB,aAAa,0BAA0B,uBAAuB,QAAQ,QAAQ,mBAAmB,8EAA8E,qBAAqB,OAAO,mCAAmC,KAAK;;AAEl2F,6EAA6E,4BAA4B,sBAAsB,sCAAsC,sCAAsC,iEAAiE,+EAA+E,+EAA+E,8BAA8B,KAAK,6FAA6F,uDAAuD,uDAAuD,0BAA0B,qCAAqC,qCAAqC,sDAAsD,kEAAkE,0DAA0D,KAAK;;AAEn7B,0EAA0E,0EAA0E,8BAA8B,sDAAsD,2BAA2B,QAAQ,oCAAoC,sEAAsE,2DAA2D,2FAA2F,0CAA0C,OAAO,uHAAuH,8EAA8E,yBAAyB,QAAQ,sCAAsC,wEAAwE,6DAA6D,wGAAwG,SAAS,6EAA6E,gDAAgD,2CAA2C,+DAA+D,2BAA2B,QAAQ,oCAAoC,iEAAiE,OAAO,8GAA8G,8EAA8E,yBAAyB,QAAQ,sCAAsC,6EAA6E,SAAS,8DAA8D;;AAE30D,+FAA+F,uDAAuD;;AAEtJ,6FAA6F;;AAE7F,8FAA8F;;AAE9F,+EAA+E,2DAA2D;;AAE1I,iFAAiF,oDAAoD;;AAErI,+EAA+E,wHAAwH;;AAEvM,2EAA2E,yHAAyH,8CAA8C,yEAAyE,8GAA8G,oCAAoC;;AAE7c,wXAAwX,aAAa,iCAAiC,aAAa,mCAAmC,eAAe,mCAAmC,gBAAgB,eAAe,kCAAkC,qCAAqC,qCAAqC,qCAAqC,wCAAwC,8DAA8D,mEAAmE,kCAAkC,GAAG,iEAAiE,qBAAqB,gDAAgD,4CAA4C,uDAAuD,KAAK,gCAAgC,eAAe,mBAAmB,iBAAiB,IAAI,yBAAyB,uBAAuB,wBAAwB,yBAAyB,0BAA0B,IAAI,iDAAiD,kEAAkE,0DAA0D,GAAG,iEAAiE,0DAA0D,GAAG,yCAAyC,aAAa,oDAAoD,oDAAoD,oDAAoD,eAAe,GAAG,sCAAsC,gCAAgC,GAAG,kCAAkC,0DAA0D,uEAAuE,wBAAwB,GAAG,mDAAmD,wCAAwC,GAAG,gFAAgF,oEAAoE,sDAAsD,GAAG,kFAAkF,oEAAoE,sDAAsD,IAAI;;AAE9lF,uKAAuK,2CAA2C,yBAAyB,8CAA8C,6FAA6F,2DAA2D,QAAQ,MAAM,6FAA6F,2DAA2D,OAAO,kBAAkB,KAAK,8CAA8C,cAAc,0BAA0B,mEAAmE,QAAQ,yBAAyB,uEAAuE,QAAQ,yBAAyB,qEAAqE,QAAQ,yBAAyB,qEAAqE,QAAQ,yBAAyB,qEAAqE,QAAQ,MAAM,mEAAmE,OAAO,gCAAgC,KAAK,2EAA2E,wCAAwC,gEAAgE,iDAAiD,sCAAsC,0EAA0E,yBAAyB,yBAAyB,oBAAoB,OAAO,8BAA8B,mDAAmD,0DAA0D,iCAAiC,kCAAkC,yGAAyG,sDAAsD,iBAAiB,8SAA8S,sBAAsB,qCAAqC,4GAA4G,QAAQ,oCAAoC,4GAA4G,QAAQ,oCAAoC,4GAA4G,QAAQ,oCAAoC,4GAA4G,QAAQ,MAAM,+CAA+C,KAAK,iBAAiB,KAAK,6EAA6E,kFAAkF,gCAAgC,kCAAkC,gEAAgE,0BAA0B,mCAAmC,QAAQ,MAAM,wEAAwE,wDAAwD,OAAO,KAAK;;AAEjjH,kEAAkE,gEAAgE,kEAAkE,2GAA2G,+CAA+C,yEAAyE,8EAA8E,2GAA2G,+CAA+C,yEAAyE,yEAAyE,+DAA+D,+GAA+G,qEAAqE;;AAEphC,mGAAmG,oCAAoC,mCAAmC;;AAE1K,qMAAqM;;AAErM,oHAAoH,+CAA+C;;AAEnK,yFAAyF;;AAEzF,8EAA8E;;AAE9E,+MAA+M,wLAAwL,qDAAqD,yEAAyE,GAAG,qDAAqD,yEAAyE,GAAG,4CAA4C,iBAAiB,GAAG,0CAA0C,uKAAuK,GAAG;;AAE75B,uFAAuF,6BAA6B,mHAAmH,QAAQ,MAAM,oEAAoE,OAAO,yEAAyE,kGAAkG,2FAA2F,sDAAsD,oJAAoJ,2CAA2C,uJAAuJ,kIAAkI,8GAA8G;;AAElsC,sFAAsF,6BAA6B,gCAAgC,4DAA4D,wCAAwC;;AAEvP,4EAA4E,iMAAiM,oCAAoC,qCAAqC;;AAEtV,kPAAkP,qCAAqC,oCAAoC;;AAE3T,sGAAsG,mCAAmC,6BAA6B,qHAAqH,QAAQ,MAAM,yEAAyE,OAAO,oFAAoF,6FAA6F,sFAAsF;;AAEhoB,+DAA+D;;AAE/D,iEAAiE;;AAEjE,4IAA4I,0EAA0E,8EAA8E;;AAEpS,iEAAiE,4BAA4B,kDAAkD,qCAAqC,2BAA2B;;AAE/M,yFAAyF,0EAA0E,gDAAgD,gDAAgD,iFAAiF,+CAA+C,4FAA4F,aAAa;;AAE5e,gFAAgF,oCAAoC;;AAEpH,wDAAwD,2CAA2C,+CAA+C;;AAElJ,+DAA+D,0BAA0B,sBAAsB,2BAA2B,IAAI,4QAA4Q,2EAA2E,gDAAgD,uFAAuF,GAAG,2QAA2Q,yFAAyF,GAAG;;AAEt9B,oDAAoD,iCAAiC,kEAAkE,iFAAiF,mDAAmD,iDAAiD,uDAAuD,uDAAuD,uDAAuD,2DAA2D,2DAA2D,oEAAoE,2DAA2D,iEAAiE,kBAAkB,GAAG,uFAAuF,uEAAuE,mEAAmE,sBAAsB,GAAG,qEAAqE,wCAAwC,sBAAsB,GAAG,6HAA6H,mFAAmF,iCAAiC,0FAA0F,KAAK,2BAA2B,GAAG,oHAAoH,iEAAiE,GAAG,qDAAqD,qBAAqB,iBAAiB,MAAM,iEAAiE,yGAAyG,2CAA2C,mDAAmD,2BAA2B,KAAK,yDAAyD,oBAAoB,iBAAiB,qBAAqB,kBAAkB,MAAM,uDAAuD,uHAAuH,4DAA4D,6CAA6C,8CAA8C,qCAAqC,oGAAoG,qDAAqD,KAAK,uDAAuD,oBAAoB,qBAAqB,iBAAiB,qBAAqB,kBAAkB,oBAAoB,wBAAwB,MAAM,oDAAoD,oHAAoH,2DAA2D,6CAA6C,mEAAmE,uGAAuG,oCAAoC,gDAAgD,wDAAwD,oGAAoG,uDAAuD,QAAQ,MAAM,kCAAkC,8BAA8B,OAAO,KAAK,gEAAgE,iBAAiB,oBAAoB,qBAAqB,sBAAsB,MAAM,4BAA4B,0BAA0B,iEAAiE,6DAA6D,qBAAqB,oBAAoB,uBAAuB,MAAM,gEAAgE,mGAAmG,uDAAuD,kDAAkD,4FAA4F,wBAAwB,KAAK;;AAExhJ,yGAAyG,2GAA2G,sFAAsF,sDAAsD,sCAAsC,iBAAiB,kGAAkG,uFAAuF,kFAAkF,yEAAyE,2FAA2F,iDAAiD,sCAAsC,iBAAiB,2LAA2L,0FAA0F,mEAAmE,sHAAsH,kEAAkE,0CAA0C,qBAAqB;;AAE7/C,kDAAkD,2CAA2C;;AAE7F,4DAA4D,uBAAuB,sBAAsB,IAAI,sQAAsQ,yGAAyG,uFAAuF,GAAG,qQAAqQ,yFAAyF,GAAG;;AAEv5B,yDAAyD,2CAA2C,oCAAoC,yCAAyC,+CAA+C;;AAEhO,6DAA6D,6BAA6B,sBAAsB,uBAAuB,4BAA4B,2BAA2B,IAAI,kRAAkR,2EAA2E,gDAAgD,uFAAuF,4MAA4M,GAAG,iRAAiR,yFAAyF,GAAG;;AAEluC,0DAA0D,uEAAuE,yFAAyF,8DAA8D,sDAAsD,wCAAwC,sDAAsD,mCAAmC,+EAA+E,+CAA+C,wHAAwH,kJAAkJ,8FAA8F,mDAAmD,6CAA6C,iCAAiC,6MAA6M,2FAA2F,+BAA+B,iEAAiE,qDAAqD,wCAAwC,gCAAgC,oGAAoG,mJAAmJ,kEAAkE,2EAA2E,qDAAqD,0EAA0E,oEAAoE,uEAAuE,6CAA6C,4GAA4G,sPAAsP,2EAA2E,yEAAyE,2GAA2G,2EAA2E,yHAAyH,yLAAyL,8EAA8E,iHAAiH,mDAAmD,0DAA0D,sCAAsC,qCAAqC,MAAM,MAAM,yCAAyC,4DAA4D,KAAK,0FAA0F,+EAA+E,+EAA+E;;AAEz7H,8DAA8D,sBAAsB,oBAAoB,uBAAuB,sBAAsB,qBAAqB,8CAA8C,+BAA+B,uBAAuB,yBAAyB,4DAA4D,2BAA2B,iCAAiC,8BAA8B,yBAAyB,oDAAoD,2BAA2B,wCAAwC,8DAA8D,8BAA8B,sBAAsB,gCAAgC,4BAA4B,0DAA0D,mBAAmB,uBAAuB,uBAAuB,cAAc,6CAA6C,+CAA+C,yCAAyC,0CAA0C,mFAAmF,+CAA+C,uBAAuB,mDAAmD,qDAAqD,GAAG,mGAAmG,6BAA6B,iEAAiE,iEAAiE,yCAAyC,GAAG,6DAA6D,6BAA6B,qDAAqD,8CAA8C,GAAG,wPAAwP,iFAAiF,iFAAiF,kCAAkC,yBAAyB,KAAK,+IAA+I,iCAAiC,wEAAwE,mCAAmC,yBAAyB,8CAA8C,KAAK,qKAAqK,qCAAqC,wCAAwC,oDAAoD,sCAAsC,qDAAqD,wDAAwD,uDAAuD,uDAAuD,wDAAwD,2CAA2C,6DAA6D,sCAAsC,2BAA2B,KAAK,oIAAoI,qCAAqC,qCAAqC,yCAAyC,oCAAoC,mDAAmD,sDAAsD,qDAAqD,qDAAqD,sDAAsD,yCAAyC,gGAAgG,6FAA6F,yDAAyD,yDAAyD,0DAA0D,yDAAyD,yDAAyD,sHAAsH,iFAAiF,sEAAsE,sCAAsC,mCAAmC,GAAG,6EAA6E,gCAAgC,0DAA0D,0CAA0C,0CAA0C,qDAAqD,mCAAmC,cAAc,GAAG,wDAAwD,0BAA0B,qDAAqD,GAAG,uEAAuE,4BAA4B,uBAAuB,4DAA4D,gDAAgD,oBAAoB,+FAA+F,4CAA4C,GAAG,6HAA6H,gDAAgD,gDAAgD,uCAAuC,2EAA2E,gBAAgB,0CAA0C,0BAA0B,yDAAyD,qBAAqB,gDAAgD,gDAAgD,gDAAgD,gDAAgD,2CAA2C,2CAA2C,2CAA2C,2CAA2C,wCAAwC,6EAA6E,6EAA6E,6EAA6E,6EAA6E,mEAAmE,0BAA0B,GAAG,6EAA6E,oCAAoC,iCAAiC,gCAAgC,gDAAgD,4EAA4E,GAAG,+CAA+C,yEAAyE,GAAG,0IAA0I,mDAAmD,sDAAsD,qDAAqD,qDAAqD,iDAAiD,wCAAwC,kCAAkC,GAAG,uGAAuG,qDAAqD,qCAAqC,+GAA+G,2GAA2G,8FAA8F,0CAA0C,GAAG,2FAA2F,qDAAqD,0DAA0D,oDAAoD,iCAAiC,sEAAsE,kDAAkD,eAAe,GAAG,0JAA0J,uDAAuD,uDAAuD,GAAG,gTAAgT,2NAA2N,+DAA+D,2FAA2F,uCAAuC,6DAA6D,8BAA8B,0BAA0B,6CAA6C,kDAAkD,4BAA4B,8BAA8B,GAAG,yTAAyT,mCAAmC,qCAAqC,uCAAuC,6CAA6C,+CAA+C,iDAAiD,4CAA4C,2CAA2C,2BAA2B,0DAA0D,wDAAwD,0DAA0D,0DAA0D,qDAAqD,uCAAuC,uCAAuC,wHAAwH,yGAAyG,0HAA0H,8IAA8I,KAAK,sRAAsR,2EAA2E,gDAAgD,gHAAgH,sDAAsD,gJAAgJ,2LAA2L,yIAAyI,uFAAuF,GAAG,6QAA6Q,yFAAyF,GAAG,sUAAsU,qNAAqN,yKAAyK,kDAAkD,uCAAuC,+DAA+D,6PAA6P,8KAA8K,wEAAwE,2HAA2H,mEAAmE,kFAAkF,yEAAyE,GAAG,qVAAqV,kHAAkH,GAAG;;AAElge,uEAAuE,+BAA+B,2FAA2F,6CAA6C,oEAAoE,8FAA8F,iDAAiD,iCAAiC,MAAM,MAAM,8DAA8D,KAAK,uCAAuC,mJAAmJ,yFAAyF,KAAK,oCAAoC,gFAAgF,qGAAqG,4DAA4D,sBAAsB,QAAQ,oCAAoC,qEAAqE,uIAAuI,6UAA6U,iJAAiJ,KAAK,gHAAgH,mBAAmB,wBAAwB,wBAAwB,kGAAkG,4DAA4D,qBAAqB,QAAQ,kCAAkC,mEAAmE,4fAA4f,yFAAyF,yFAAyF,mGAAmG,iLAAiL,4PAA4P,iJAAiJ,KAAK,6HAA6H,+GAA+G,4DAA4D,oBAAoB,QAAQ,gDAAgD,+DAA+D,iJAAiJ,uSAAuS,iJAAiJ,KAAK,sIAAsI,kDAAkD,0BAA0B,QAAQ,0CAA0C,gJAAgJ,KAAK,2GAA2G,qEAAqE,6GAA6G,+FAA+F,qBAAqB,QAAQ,4FAA4F,OAAO,mHAAmH,yCAAyC;;AAExqL,kJAAkJ,sEAAsE,uCAAuC,0JAA0J,qPAAqP,iGAAiG,qJAAqJ;;AAEp4B,uMAAuM,wNAAwN;;AAE/Z,+JAA+J;;AAE/J,+FAA+F,6BAA6B,iCAAiC;;AAE7J,kFAAkF,iCAAiC;;AAEnH,qFAAqF,sEAAsE;;AAE3J,0FAA0F,8RAA8R,sDAAsD;;AAE9a,iEAAiE;;AAEjE,kIAAkI,gGAAgG,2EAA2E,+EAA+E;;AAE5X,mFAAmF,2FAA2F,4DAA4D,4DAA4D;;AAEtS,+DAA+D,8FAA8F,wCAAwC;;AAErM,4FAA4F;;AAE5F,6GAA6G,gGAAgG,qBAAqB,wBAAwB,QAAQ,iGAAiG,KAAK;;AAExW,8FAA8F,qBAAqB,wBAAwB,QAAQ,0JAA0J,0JAA0J,iBAAiB;;AAExd,8FAA8F,qBAAqB,wBAAwB,QAAQ,8HAA8H,KAAK;;AAEtR,mIAAmI,gEAAgE,yDAAyD,0CAA0C,mGAAmG,0EAA0E,qDAAqD,yDAAyD,sDAAsD,2DAA2D,KAAK;;AAEvrB,6FAA6F,qBAAqB,wBAAwB,QAAQ,6HAA6H,KAAK;;AAEpR,gFAAgF,yDAAyD,qCAAqC,iDAAiD,8CAA8C,qDAAqD,sOAAsO,8OAA8O,mGAAmG,8BAA8B,yJAAyJ,6FAA6F,oGAAoG,+BAA+B,qDAAqD;;AAEr0C,8HAA8H,6CAA6C,uEAAuE,0DAA0D,kHAAkH,2BAA2B,qCAAqC,mHAAmH;;AAEjlB,wEAAwE,kDAAkD,8BAA8B;;AAExJ,sEAAsE,kDAAkD,8BAA8B;;AAEtJ,qFAAqF,uEAAuE,uEAAuE;;AAEnO,mFAAmF,6BAA6B,wEAAwE,4NAA4N,oCAAoC,oCAAoC,+BAA+B,+BAA+B,yBAAyB,mCAAmC,mCAAmC,+CAA+C,+CAA+C,kDAAkD,8DAA8D,6CAA6C,KAAK;;AAEz3B,yGAAyG;;AAEzG,oKAAoK,6CAA6C,wDAAwD;;AAEzQ,yFAAyF,iFAAiF,sCAAsC,uFAAuF;;AAEvS,+FAA+F,2FAA2F;;AAE1L,2DAA2D,gFAAgF,+DAA+D;;AAE1M,6DAA6D,2CAA2C,GAAG,+CAA+C,+BAA+B,GAAG,wCAAwC,0CAA0C,oCAAoC,iCAAiC,oFAAoF,2EAA2E,4FAA4F,6FAA6F,4CAA4C,sDAAsD,sDAAsD,cAAc,8CAA8C,8CAA8C,8CAA8C,wEAAwE,GAAG,2CAA2C,kDAAkD,kDAAkD,cAAc,8CAA8C,8CAA8C,sDAAsD,GAAG,0CAA0C,8CAA8C,8CAA8C,cAAc,qCAAqC,oCAAoC,GAAG,8CAA8C,oCAAoC,GAAG,6CAA6C,oCAAoC,GAAG,4CAA4C,2DAA2D,GAAG,2CAA2C,0EAA0E,kEAAkE,GAAG,6CAA6C,gEAAgE,GAAG,mGAAmG,6CAA6C,GAAG,mGAAmG,yCAAyC,GAAG,kGAAkG,mEAAmE,GAAG,kGAAkG,6DAA6D,GAAG;;AAEjuF,qGAAqG;;AAErG,iEAAiE,kEAAkE,4EAA4E,oDAAoD,8CAA8C;;AAEjT,+FAA+F;;AAE/F,iFAAiF,oDAAoD,gFAAgF,+FAA+F,sCAAsC,KAAK;;AAE/V,+DAA+D,8FAA8F,wCAAwC;;AAErM,4FAA4F;;AAE5F,sHAAsH,+FAA+F,qIAAqI,oEAAoE,qCAAqC,8BAA8B,yBAAyB,+BAA+B,2BAA2B,2BAA2B,QAAQ,sFAAsF,4GAA4G,8BAA8B,8BAA8B,yBAAyB,+BAA+B,2BAA2B,2BAA2B,QAAQ,yEAAyE,+GAA+G,gEAAgE,+BAA+B,8BAA8B,yBAAyB,+BAA+B,2BAA2B,2BAA2B,+BAA+B,8BAA8B,QAAQ,4EAA4E,kFAAkF,2EAA2E,KAAK,6DAA6D,0DAA0D,KAAK,gEAAgE,4BAA4B,8DAA8D,2DAA2D,gCAAgC,mDAAmD,yEAAyE,kFAAkF,gGAAgG,8EAA8E,OAAO,uBAAuB,KAAK,+IAA+I,yBAAyB,uCAAuC,kCAAkC,oHAAoH,2DAA2D,0BAA0B,4FAA4F,iDAAiD,iDAAiD,iDAAiD,iDAAiD,8BAA8B,8BAA8B,8BAA8B,8BAA8B,miDAAmiD,mGAAmG,+BAA+B,+BAA+B,iCAAiC,mDAAmD,4BAA4B,o+CAAo+C,gHAAgH,yFAAyF,mBAAmB,iDAAiD,KAAK,+CAA+C,2BAA2B,qEAAqE,0BAA0B,oDAAoD,yBAAyB,4CAA4C,2CAA2C,kCAAkC,uDAAuD,QAAQ,iCAAiC,kCAAkC,6CAA6C,QAAQ,iCAAiC,kCAAkC,2CAA2C,qCAAqC,OAAO,gEAAgE,KAAK,mMAAmM,yBAAyB,6CAA6C,oEAAoE,gHAAgH,yGAAyG,uBAAuB,iDAAiD,4EAA4E,oLAAoL,o1BAAo1B,iGAAiG,qBAAqB,iDAAiD,KAAK;;AAEh6S,oHAAoH,0DAA0D,mIAAmI,oEAAoE,qCAAqC,8BAA8B,yBAAyB,+BAA+B,2BAA2B,2BAA2B,QAAQ,sFAAsF,0EAA0E,8BAA8B,yBAAyB,+BAA+B,2BAA2B,2BAA2B,QAAQ,yEAAyE,6GAA6G,gEAAgE,+BAA+B,8BAA8B,yBAAyB,+BAA+B,2BAA2B,2BAA2B,+BAA+B,8BAA8B,QAAQ,4EAA4E;;AAEp5C,iPAAiP,6BAA6B,6HAA6H,2BAA2B,QAAQ,2HAA2H,0FAA0F,OAAO,gIAAgI,6BAA6B,QAAQ,qHAAqH,8EAA8E,OAAO,gIAAgI,2BAA2B,QAAQ,0CAA0C,oLAAoL,oFAAoF,KAAK;;AAEn9C,uDAAuD,uBAAuB,qGAAqG,kDAAkD,2BAA2B,QAAQ,sDAAsD,yOAAyO,KAAK,qGAAqG,kDAAkD,4BAA4B,QAAQ,wCAAwC,8LAA8L,KAAK,wGAAwG,kDAAkD,6BAA6B,QAAQ,0CAA0C,mQAAmQ,KAAK,iEAAiE,GAAG;;AAEvgD,2FAA2F,iDAAiD,iDAAiD,iDAAiD;;AAE9O,2EAA2E,mCAAmC,wCAAwC,4CAA4C,iDAAiD,2BAA2B,uBAAuB,uBAAuB,4DAA4D,gEAAgE,gEAAgE,gEAAgE,oCAAoC,KAAK;;AAEjmB,sGAAsG,+BAA+B,oDAAoD,oDAAoD,oDAAoD,oDAAoD,sDAAsD;;AAE3Y,8EAA8E,0CAA0C,0CAA0C,0CAA0C,0CAA0C,6DAA6D,sEAAsE,gGAAgG;;AAEzd,mDAAmD,0FAA0F,uCAAuC,kCAAkC;;AAEtN,yFAAyF;;AAEzF,8GAA8G;;AAE9G,yIAAyI,wCAAwC,mDAAmD,GAAG,0CAA0C,iCAAiC,uDAAuD,GAAG,iDAAiD,iCAAiC,8CAA8C,4GAA4G,GAAG,+BAA+B,iDAAiD,yDAAyD,iBAAiB,GAAG,4CAA4C,8JAA8J,wKAAwK,uCAAuC,iCAAiC,kCAAkC,kCAAkC,6BAA6B,GAAG,0KAA0K,8JAA8J,2CAA2C,oBAAoB,sBAAsB,8IAA8I,GAAG,qCAAqC,8PAA8P,wRAAwR,sCAAsC,kCAAkC,iCAAiC,kDAAkD,mCAAmC,gCAAgC,wBAAwB,2DAA2D,qCAAqC,8CAA8C,oCAAoC,0DAA0D,kDAAkD,qCAAqC,iBAAiB,GAAG,yCAAyC,8CAA8C,oCAAoC,iCAAiC,sDAAsD,sDAAsD,oBAAoB,yDAAyD,gDAAgD,oCAAoC,iEAAiE,4BAA4B,mEAAmE,4CAA4C,GAAG,yCAAyC,eAAe;;AAE5nH,6FAA6F,qCAAqC,mCAAmC,uDAAuD,iDAAiD,gHAAgH,8GAA8G,wCAAwC,+CAA+C,6DAA6D,8TAA8T,yGAAyG,+EAA+E;;AAErnC,wFAAwF,4BAA4B,sCAAsC,kCAAkC,sEAAsE,0EAA0E,mDAAmD,6CAA6C,6BAA6B,kCAAkC,gCAAgC,yBAAyB,uEAAuE,KAAK,yBAAyB,kEAAkE,KAAK,wBAAwB,6EAA6E,KAAK,yBAAyB,2CAA2C,KAAK,yBAAyB,+BAA+B,KAAK,yBAAyB,+BAA+B,KAAK,yBAAyB,qDAAqD,KAAK,yBAAyB,mDAAmD,KAAK,uEAAuE,mCAAmC,6BAA6B,6BAA6B,8BAA8B,8BAA8B,8BAA8B,8BAA8B,8BAA8B,8BAA8B,0EAA0E,0EAA0E,0EAA0E,0EAA0E,kMAAkM,KAAK,kEAAkE,iEAAiE,uEAAuE,wCAAwC,wCAAwC,yFAAyF,wFAAwF,mDAAmD,KAAK,gJAAgJ,wEAAwE,sBAAsB,4DAA4D,4DAA4D,4DAA4D,oEAAoE,KAAK,+EAA+E,4DAA4D,KAAK,yGAAyG,4FAA4F,yEAAyE,KAAK,uIAAuI,2CAA2C,2BAA2B,QAAQ,MAAM,qFAAqF,oFAAoF,2BAA2B,OAAO,KAAK,ubAAub,4BAA4B,yBAAyB,yFAAyF,oEAAoE,yBAAyB,OAAO,QAAQ,qGAAqG,6DAA6D,sFAAsF,uDAAuD,kCAAkC,kCAAkC,0GAA0G,0DAA0D,qDAAqD,8IAA8I,SAAS,kCAAkC,oHAAoH,2DAA2D,8EAA8E,qDAAqD,gCAAgC,gCAAgC,qFAAqF,6HAA6H,oFAAoF,8EAA8E,gGAAgG,6GAA6G,KAAK;;AAElpM,+FAA+F,gDAAgD,0DAA0D,0DAA0D,oDAAoD,wDAAwD,4DAA4D,gEAAgE,kEAAkE,kEAAkE,oEAAoE,kEAAkE,+EAA+E,qFAAqF,sEAAsE,yFAAyF,qEAAqE,6EAA6E,gEAAgE,2EAA2E,mFAAmF,8EAA8E,oCAAoC,wEAAwE,iCAAiC;;AAEnoD,6FAA6F,sDAAsD,wBAAwB,gEAAgE,6BAA6B,gEAAgE,6BAA6B,0DAA0D,0BAA0B,8DAA8D,4BAA4B,kEAAkE,8BAA8B,8EAA8E,oCAAoC,sEAAsE,gCAAgC,wEAAwE,iCAAiC,wEAAwE,iCAAiC,0EAA0E,kCAAkC,wEAAwE,iCAAiC,qFAAqF,uCAAuC,2FAA2F,0CAA0C,2EAA2E,kCAAkC,mFAAmF,sCAAsC,4EAA4E,mCAAmC,+FAA+F,4CAA4C,sEAAsE,gCAAgC,iFAAiF,qCAAqC,yFAAyF,yCAAyC,8EAA8E,oCAAoC,wEAAwE,iCAAiC;;AAE5gF,8FAA8F,6EAA6E,iGAAiG,iGAAiG,qFAAqF,6FAA6F,qGAAqG,6HAA6H,6GAA6G,iHAAiH,iHAAiH,qHAAqH,iHAAiH,2IAA2I,uJAAuJ,yHAAyH,+JAA+J,uHAAuH,uIAAuI,6GAA6G,mIAAmI,mJAAmJ,6HAA6H,iHAAiH;;AAE/tF,mNAAmN,4EAA4E,wFAAwF,0DAA0D;;AAEjb,mCAAmC,2BAA2B,eAAe,6CAA6C,gDAAgD,GAAG;;AAE7K,0CAA0C,oCAAoC,mBAAmB,eAAe,0CAA0C,uOAAuO,kDAAkD,4BAA4B,wEAAwE;;AAEvhB,+CAA+C,kCAAkC,kEAAkE,0FAA0F,GAAG;;AAEhP,0EAA0E,mEAAmE,mCAAmC,qCAAqC,oCAAoC,kCAAkC,+BAA+B,uDAAuD,wJAAwJ,kJAAkJ,0DAA0D,kDAAkD,4BAA4B,wEAAwE;;AAE32B,+CAA+C,kCAAkC,kEAAkE,0FAA0F,GAAG;;AAEhP,8CAA8C,sBAAsB,wBAAwB,+BAA+B,eAAe,gGAAgG,4BAA4B,8BAA8B,wEAAwE;;AAE5W,wTAAwT,eAAe,+gBAA+gB,GAAG;;AAEz1B,uEAAuE,qUAAqU,eAAe,oCAAoC,mGAAmG,uPAAuP,4FAA4F,kFAAkF,8FAA8F,kGAAkG,aAAa;;AAEppC,gEAAgE,mPAAmP,6gBAA6gB,GAAG;;AAEn0B,qEAAqE,6BAA6B,4BAA4B,8BAA8B,uQAAuQ,oCAAoC,kOAAkO,oEAAoE,4BAA4B,2CAA2C,GAAG;;AAEvzB,+CAA+C,kCAAkC,kEAAkE,2DAA2D;;AAE9M,gDAAgD,+BAA+B,kCAAkC,kDAAkD,4CAA4C,oDAAoD,wEAAwE;;AAE3U,sCAAsC,+BAA+B,8BAA8B,uOAAuO,yCAAyC,iTAAiT;;AAEpqB,yCAAyC,wBAAwB,yBAAyB,0BAA0B,8BAA8B,2OAA2O,iDAAiD,8FAA8F,cAAc,KAAK,qCAAqC,gIAAgI,4KAA4K;;AAEh3B,wVAAwV,wpBAAwpB;;AAEh/B,yCAAyC,wBAAwB,8CAA8C,ojBAAojB,iDAAiD,gXAAgX,qFAAqF,8FAA8F,6DAA6D,8FAA8F,wDAAwD,2OAA2O;;AAErrD,8DAA8D,ibAAib,0lBAA0lB,qHAAqH;;AAE9rC,0DAA0D,wBAAwB,wBAAwB,00BAA00B,iDAAiD,gJAAgJ,0CAA0C,qmBAAqmB,2OAA2O;;AAE/+D,6DAA6D,gXAAgX,mnBAAmnB,GAAG;;AAEniC,yDAAyD,wBAAwB,2BAA2B,6BAA6B,ieAAie,iDAAiD,yVAAyV,8DAA8D,iCAAiC,uEAAuE,sEAAsE,6EAA6E,sEAAsE,6MAA6M;;AAEhkD,8JAA8J,8TAA8T,8nBAA8nB,WAAW;;AAErmC,0DAA0D,8HAA8H,+PAA+P,uDAAuD,sNAAsN,4CAA4C,aAAa;;AAE7vB,4DAA4D,ibAAib,0lBAA0lB,qHAAqH;;AAE5rC,wDAAwD,wBAAwB,wBAAwB,0BAA0B,wBAAwB,w0BAAw0B,iDAAiD,gJAAgJ,0CAA0C,qqBAAqqB,2OAA2O;;AAE7lE,+DAA+D,yDAAyD,0ZAA0Z,0lBAA0lB,sJAAsJ,WAAW;;AAE7wC,2HAA2H,wBAAwB,0BAA0B,0BAA0B,wBAAwB,kCAAkC,iEAAiE,+BAA+B,yEAAyE,2FAA2F,oEAAoE,qCAAqC,4DAA4D,8DAA8D,iCAAiC,8CAA8C,8CAA8C,sDAAsD,iCAAiC,mEAAmE,qFAAqF,2EAA2E,kEAAkE,+CAA+C,oiCAAoiC,iDAAiD,gJAAgJ,0CAA0C,6sBAA6sB,yFAAyF,kHAAkH,4FAA4F,oGAAoG,oHAAoH,mFAAmF,wJAAwJ,uNAAuN;;AAE7qI,2DAA2D,kZAAkZ,0lBAA0lB,yFAAyF;;AAEhoC,uDAAuD,wBAAwB,wBAAwB,8vBAA8vB,iDAAiD,gJAAgJ,0CAA0C,+jBAA+jB,6MAA6M;;AAE51D,qCAAqC,sBAAsB,wOAAwO,6BAA6B,uBAAuB,uEAAuE,yNAAyN,iGAAiG,sEAAsE,0IAA0I;;AAEx6B,yCAAyC,wBAAwB,+RAA+R,iDAAiD,4EAA4E,2MAA2M,4KAA4K;;AAEp1B,0PAA0P,qdAAqd;;AAE/sB,uCAAuC,wBAAwB,mPAAmP,yGAAyG,mGAAmG;;AAE9f,yCAAyC,sBAAsB,qKAAqK,2FAA2F,eAAe,2FAA2F,2FAA2F,kGAAkG,mDAAmD,wFAAwF,yBAAyB,kGAAkG,kGAAkG,qCAAqC,gDAAgD,kGAAkG;;AAEroC,yCAAyC,wBAAwB,sTAAsT,iDAAiD,4EAA4E,qMAAqM,iIAAiI;;AAE1zB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,aAAa,4CAA4C;AACzD,aAAa,YAAY;;AAEzB,SAAS,aAAa;AACtB,kBAAkB,oCAAoC;;AAEtD,cAAc,aAAa;AAC3B,uBAAuB,o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AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gEAAgE;;AAEhE;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,4BAA4B;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI,OAAO;;AAEX;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,WAAW,UAAU;AACrB,OAAO,6EAA6E;;AAEpF;;AAEA;;AAEA;;AAEA;;AAEA;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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAe,OAAO;;AAEtB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iDAAiD,QAAQ;AACzD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;;AAEZ;;AAEA,0CAA0C,KAAK;;AAE/C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA,KAAK;;AAEL;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,OAAO;;AAE3B;;AAEA,0BAA0B,+DAA+D;;AAEzF,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,yBAAyB,0DAA0D;;AAEnF,KAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,qBAAqB,4DAA4D;;AAEjF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,uGAAuG;;AAEvG;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;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ACA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sDAAsD;;AAEtD;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,sDAAsD;;AAEtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;AACN;AACA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM;;AAEN;;AAEA,MAAM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AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAK;;AAEL;AACA;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA,KAAK;;AAEL;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mEAAmE,eAAe;;AAElF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mEAAmE,eAAe;;AAElF;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA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ACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,6CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0BAA0B;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,2CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,yCAAyC,mBAAmB;;AAE5D;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,gBAAgB;;AAEpC;;AAEA,kDAAkD;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,6CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,2CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,2CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAiC;;AAEjC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB,4BAA4B;;AAE/C;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,eAAe;;AAElC;;AAEA;AACA;;AAEA,oBAAoB,4BAA4B;;AAEhD;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,cAAc;;AAEjC,oBAAoB,2BAA2B;;AAE/C;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,0BAA0B,eAAe;;AAEzC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,eAAe;;AAElC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,oBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA,qBAAqB,qBAAqB;;AAE1C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,oBAAoB;;AAExC,qBAAqB,oBAAoB;;AAEzC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,oBAAoB,qBAAqB;;AAEzC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,oBAAoB;;AAExC;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,gCAAgC;;AAEhC,IAAI;;AAEJ,4BAA4B;;AAE5B;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAoB,oBAAoB;;AAExC;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,WAAW;;AAE/B;;AAEA;AACA;;AAEA;;AAEA,qBAAqB,WAAW;;AAEhC;;AAEA;;AAEA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,UAAU;;AAE9B,qBAAqB,0BAA0B;;AAE/C;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,yBAAyB;;AAE7C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,yBAAyB;;AAE7C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,qBAAqB;;AAEzC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA2B,yBAAyB;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,gBAAgB;;AAEpC;;AAEA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,YAAY,UAAU;AACtB;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,+BAA+B,IAAI,+BAA+B,IAAI,+BAA+B;AAC3H,sBAAsB,+BAA+B,IAAI,+BAA+B,IAAI,+BAA+B;AAC3H,sBAAsB,+BAA+B,IAAI,+BAA+B,IAAI,+BAA+B;;AAE3H;AACA;;AAEA;;AAEA;;AAEA;AACA,qBAAqB,OAAO;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,UAAU,IAAI,UAAU;AAC9C,6BAA6B,UAAU,IAAI,UAAU;;AAErD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,aAAa,iBAAiB;AAC9B;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0CAA0C,OAAO;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4CAA4C,OAAO;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,0CAA0C,OAAO;;AAEjD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,0CAA0C,OAAO;;AAEjD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,yEAAyE;AACzE;;AAEA;AACA;;AAEA,sBAAsB,cAAc;;AAEpC;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mBAAmB,SAAS;;AAE5B,GAAG;;AAEH,uBAAuB,YAAY;;AAEnC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;AACA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,2CAA2C;;AAE3C;AACA;;AAEA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,2CAA2C;;AAE3C;;AAEA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA,wCAAwC,SAAS;;AAEjD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,cAAc,kBAAkB;;AAEhC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,8BAA8B,+BAA+B;;AAE7D;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8CAA8C;;AAE9C;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gBAAgB,YAAY;;AAE5B;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gGAAgG;;AAEhG;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4CAA4C;;AAE5C,yDAAyD;AACzD,yDAAyD;AACzD,yDAAyD;AACzD,yDAAyD;;AAEzD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,qCAAqC,SAAS;;AAE9C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8BAA8B,OAAO;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uBAAuB;AACvB,0BAA0B;AAC1B,oBAAoB;;AAEpB;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,kBAAkB;;AAErC;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,sBAAsB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAkB,oBAAoB;;AAEtC;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA,iKAAiK;;AAEjK;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,0BAA0B;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA,6BAA6B;;AAE7B,uCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,OAAO;;AAEP;;AAEA;;AAEA,MAAM;;AAEN;;AAEA,+BAA+B;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA,QAAQ;;AAER;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,gEAAgE,QAAQ;;AAExE;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA,+DAA+D,QAAQ;;AAEvE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,oBAAoB,mBAAmB;;AAEvC,+BAA+B,OAAO;;AAEtC;AACA;AACA;;AAEA;;AAEA,0CAA0C,QAAQ;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA,wCAAwC,QAAQ;;AAEhD;AACA;;AAEA,yCAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,UAAU;;AAE9B;;AAEA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,oBAAoB,YAAY;;AAEhC,qBAAqB,UAAU;;AAE/B;;AAEA;;AAEA;;AAEA,OAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,kBAAkB,oBAAoB;AACtC,oCAAoC,QAAQ;;AAE5C;AACA;AACA;;AAEA;;AAEA,0CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,wCAAwC,QAAQ;;AAEhD;AACA;;AAEA,yCAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA,QAAQ;;AAER;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB;AACpB;;AAEA;;AAEA,sBAAsB,UAAU;;AAEhC;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sBAAsB,UAAU;;AAEhC;AACA;;AAEA;;AAEA,MAAM;;AAEN;;AAEA,sBAAsB,UAAU;;AAEhC;AACA;;AAEA;;AAEA;;AAEA,sBAAsB,UAAU;;AAEhC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,wCAAwC,QAAQ;;AAEhD;AACA;;AAEA;AACA;;AAEA;;;AAGA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,0DAA0D,QAAQ;;AAElE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA,iCAAiC;;AAEjC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB,kBAAkB;;AAErC,oBAAoB,oBAAoB;;AAExC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,iBAAiB;;AAEpC;;AAEA,oBAAoB,mBAAmB;;AAEvC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ,oBAAoB,mBAAmB;;AAEvC;;AAEA,gDAAgD;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA2C,OAAO;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA,8CAA8C,OAAO;;AAErD;;AAEA;AACA;AACA,oCAAoC;;AAEpC;;AAEA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,qBAAqB,qBAAqB;;AAE1C;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,qBAAqB;;AAEzC,qBAAqB,oBAAoB;;AAEzC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAmB,qBAAqB;;AAExC,oBAAoB,sBAAsB;;AAE1C;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,qBAAqB;;AAExC,oBAAoB,sBAAsB;;AAE1C;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAmB,sBAAsB;;AAEzC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,oBAAoB,qBAAqB;;AAEzC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,sBAAsB;;AAEzC,oBAAoB,qBAAqB;;AAEzC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,oBAAoB,qBAAqB;;AAEzC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,sBAAsB;;AAE1C,qBAAqB,qBAAqB;;AAE1C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,sBAAsB;;AAE1C,qBAAqB,qBAAqB;;AAE1C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,kBAAkB,mDAAmD;;AAErE;;AAEA;;AAEA,yCAAyC,QAAQ;;AAEjD;;AAEA;AACA;;AAEA,gEAAgE,OAAO;;AAEvE,uBAAuB,OAAO;;AAE9B;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,iDAAiD,OAAO;;AAExD,sBAAsB,OAAO;;AAE7B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA,kBAAkB,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM;AAC3E,kBAAkB,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG;;AAE9E;;AAEA;;AAEA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB;;AAEnB;;AAEA,sCAAsC;AACtC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAI;AACJ;;AAEA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAsC;AACtC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB;;AAEnB;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;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A;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,wDAAwD;;AAExD;AACA,4DAA4D;AAC5D;AACA;;AAEA;AACA,gEAAgE;AAChE;AACA,qEAAqE;AACrE;AACA,sEAAsE;;AAEtE;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAmC;AACnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,MAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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AEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2EAA2E;;AAE3E;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,6CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,6CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;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AEA;;AAEA;;AAEg9N;;;;;;;;;;;;ACjipDj8N;;AAEf,wBAAwB,0CAAO;;AAE/B;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA,iCAAiC,8CAAW;;AAE5C;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,uBAAuB,0CAAO;AAC9B,qBAAqB,0CAAO;;AAE5B,kBAAkB,0CAAO;;AAEzB;AACA;AACA;;AAEA;AACA,4BAA4B,0CAAO;AACnC;;AAEA,0BAA0B,sBAAsB;;AAEhD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAE8B;;;;;;;;;;;;;;;;AC1J9B;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qCAAqC,UAAU,aAAa,+BAA+B,EAAE;AAC3G,SAAS,yBAAyB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,2BAA2B,cAAc;AACzC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,QAAQ;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,gBAAgB,SAAS;AACzB;AACA,kBAAkB,SAAS;AAC3B;AACA,kBAAkB,SAAS;AAC3B;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,wCAAwC;AAC1E,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA,WAAW,kCAAkC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,WAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA,SAAS;AACT,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kDAAE;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,wBAAwB,OAAO;AAC/B;AACA,mBAAmB;AACnB;AACA,mBAAmB;AACnB,2BAA2B,sBAAsB,sCAAsC,kCAAkC;AACzH;AACA;AACA,2BAA2B;AAC3B,0BAA0B;AAC1B;AACA,wBAAwB;AACxB;AACA,yBAAyB;AACzB;AACA,wBAAwB;AACxB;AACA,yBAAyB;AACzB;AACA,2BAA2B;AAC3B;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,yBAAyB;AACzB;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,mCAAmC;AACnC;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,QAAQ;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACgB;AACnB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACqB;AACjB;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kDAAkD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,gCAAgC;AAChC;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACgB;AACnB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACqB;AACjB;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,wDAAwD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACa;AAChB;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACkB;AACd;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,+CAA+C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACe;AAClB;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,gDAAgD;AAChD;AACA,SAAS,4BAA4B,kDAAkD;AACvF;AACA;AACA,CAAC,EAAE;AACoB;AAChB;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,iDAAiD;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACa;AAChB;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACkB;AACd;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,+CAA+C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACe;AAClB;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC,EAAE;AACoB;AAChB;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB,uDAAuD;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,0EAA0E,MAAM;AAChF;AACA;AACwD;AACF;AACtD;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACwB;AACpB;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,cAAc;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACuB;AAC1B;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACmB;AACtB;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACwB;AAC3B;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,oBAAoB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACY;AACR;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA,yBAAyB,WAAW;AACpC;AACA,qBAAqB,WAAW;AAChC;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACyB;AAC5B;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACqB;AACxB;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AAC0B;AAC7B;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E,sEAAsE,oBAAoB;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;AACc;AACjB,+HAA+H;AACxH;AACP;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA,yBAAyB,WAAW;AACpC;AACA,qBAAqB,WAAW;AAChC;AACA,WAAW,0BAA0B;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,iBAAiB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,WAAW,0BAA0B;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oEAAoE,iBAAiB;AACrF;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvmFe;;AAEf;;AAEA,0BAA0B,yCAAM;;AAEhC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAqB,6CAAU;;AAE/B;AACA;AACA;AACA;;A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A4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,SAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA4C,QAAQ;;AAEpD;AACA;;AAEA;AACA;AACA;AACA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ACpB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,gDAAgD,QAAQ;;AAExD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,oCAAoC,QAAQ;;AAE5C;;AAEA;AACA;;AAEA,+BAA+B,QAAQ;;AAEvC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA,8BAA8B,QAAQ;;AAEtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA,oCAAoC,QAAQ;;AAE5C;;AAEA;AACA;;AAEA,+BAA+B,QAAQ;;AAEvC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA,8BAA8B,QAAQ;;AAEtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;A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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA4BE;;;;;;;;AC1WF;AACA,kBAAkB,wKAAe;;AAEjC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA,qBAAqB,UAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,MAAM;AACN;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA,yCAAyC;AACzC,2CAA2C;AAC3C;AACA;AACA;AACA,yCAAyC;AACzC,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,eAAe;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8BAA8B;AAC1C,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gEAAgE;AAClF,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,qBAAqB,mBAAmB;AACxC,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,qDAAqD;AAChE,WAAW,qDAAqD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,qBAAqB,0BAA0B;AAC/C,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,4CAA4C;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B;AAC3C;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,2BAA2B;AAC1D;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,OAAO;AAC1D;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,+DAA+D,EAAE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,KAAK;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,KAAK;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA,+BAA+B,KAAK;AACpC;AACA;AACA;AACA;AACA,MAAM;AACN,gDAAgD,KAAK;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oDAAoD,KAAK,eAAe;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,MAAM;AACN,qEAAqE,wBAAwB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,KAAK;AACL,sEAAsE,yBAAyB;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iDAAiD,KAAK,4CAA4C;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU,gDAAgD,iBAAiB,sBAAsB,gCAAgC;AACrJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,KAAK;AAC5D;AACA;AACA;AACA;AACA,6FAA6F,aAAa;AAC1G;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,kBAAkB,uBAAuB,cAAc;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,UAAU;AACxD;AACA;AACA;AACA;AACA,sCAAsC,mBAAmB,SAAS,UAAU;AAC5E;AACA;AACA,yEAAyE,UAAU;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,UAAU;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,sCAAsC,mBAAmB,SAAS,UAAU;AAC5E;AACA;AACA,yEAAyE,UAAU;AACnF;AACA;AACA;AACA;AACA;AACA,OAAO,oBAAoB,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU,oBAAoB,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,UAAU;AACxD;AACA;AACA;AACA;AACA,sCAAsC,mBAAmB,SAAS,UAAU;AAC5E;AACA;AACA,yEAAyE,UAAU;AACnF;AACA;AACA;AACA,wCAAwC,wBAAwB,oBAAoB,UAAU;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,UAAU,IAAI,YAAY;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,eAAe,UAAU,IAAI,aAAa;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC;AACA,SAAS,gBAAgB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA,MAAM;AACN,2DAA2D,cAAc,oBAAoB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,oBAAoB;AACjF;AACA,4FAA4F;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA,oDAAoD;AACpD;AACA,KAAK,GAAG,SAAS,GAAG;AACpB;AACA,IAAI,GAAG,0CAA0C,WAAW;AAC5D;AACA,IAAI,GAAG,WAAW;AAClB;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,qFAAqF;AACrF;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,kDAAkD;AAClD,KAAK;AACL,4CAA4C,qBAAqB;AACjE;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,kBAAkB;AAC3E,KAAK;AACL;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,+CAA+C,gBAAgB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,oCAAoC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0BAA0B;AAC/D;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,MAAM,KAAK,KAAK;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B,kBAAkB,8BAA8B,cAAc,GAAG,KAAK,iBAAiB,EAAE;AACzF,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,MAAM,KAAK,KAAK;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,MAAM,KAAK,KAAK;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,aAAa;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,uBAAuB,YAAY;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,uBAAuB,YAAY;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,4BAA4B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,qEAAqE,KAAK;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,gEAAgE;AAChE,mBAAmB,kBAAkB;AACrC;AACA,sEAAsE;AACtE;AACA;AACA;AACA,oEAAoE;AACpE;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,EAAE,GAAG,OAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,IAAI;AACnD;AACA,IAAI;AACJ;AACA;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,8BAA8B;AACrE;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,gBAAgB;AAChB;AACA,qBAAqB;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,qBAAqB,YAAY;AACjC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,gBAAgB,gCAAgC;AAChD,OAAO;AACP;AACA,cAAc,iEAAiE;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,iBAAiB;AACjB,OAAO;AACP;AACA,cAAc,iEAAiE;AAC/E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,sBAAsB,UAAU;AAChC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA,sDAAsD,IAAI;AAC1D;AACA;AACA;AACA,+CAA+C,IAAI;AACnD;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP,kCAAkC,IAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,+CAA+C,IAAI;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,6BAA6B;AAC7B;AACA,uBAAuB;AACvB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,sCAAsC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,MAAM,GAAG,KAAK;AAChE;AACA,sBAAsB,UAAU,GAAG,KAAK;AACxC;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,MAAM;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB;AACvB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C,oBAAoB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,yCAAyC,aAAa;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,aAAa;AACnD;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,iCAAiC,iEAAiE;AAClG,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,iCAAiC,sBAAsB;AACvD,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,aAAa;AACpD;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,iCAAiC;AAClE,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sCAAsC,aAAa;AACnD;AACA,iCAAiC,kCAAkC;AACnE,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wCAAwC,0BAA0B;AAClE;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,2BAA2B;AAC3B;AACA;AACA;AACA,+CAA+C,cAAc;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC,qBAAqB,4BAA4B;AACjD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP,MAAM;AACN,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uCAAuC,6BAA6B;AACpE;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,aAAa;AACpD;AACA;AACA;AACA;AACA,mCAAmC,6BAA6B;AAChE;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,sBAAsB,YAAY;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP,MAAM;AACN,uBAAuB;AACvB,MAAM;AACN,uBAAuB;AACvB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sBAAsB,UAAU;AAChC;AACA;AACA,OAAO;AACP,sBAAsB,UAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,oBAAoB;AACpB,eAAe;AACf,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,IAAI,SAAS;AACjE;AACA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;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ACttC,gPAAgP,EAAE;AAClP;AACA,IAAI,OAAO,yDAAC,mBAAmB,OAAO,6CAA6C,OAAO,sCAAC,mBAAmB,OAAO,cAAc,EAAE,cAAc,6BAA6B,mDAAC,oBAAoB,iBAAiB,MAAM,yBAAyB,4BAA4B,QAAQ,MAAM,gIAAgI,gHAAgH,gCAAgC,YAAY,WAAW,gBAAgB,iDAAiD,YAAY,EAAE,SAAS,cAAc,sBAAsB,IAAI,0CAA0C,SAAS,mBAAmB,sBAAsB,IAAI,mCAAmC,SAAS,cAAc,8FAA2K;;;;;;;;;;;ACH3gC,iEAAuF;;;;;;;;;;;;ACAvF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,gDAAgD;AAChD;AACA,aAAa;AACb,YAAY;AACZ,YAAY;AACZ,cAAc;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6DAA6D;;AAE7D;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,WAAW,iBAAiB;AAC5B,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;AACA;;AAEA,SAAS,sBAAsB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,0BAA0B;AAC1B,6DAA6D;;AAE7D;AACA;AACA,IAAI;AACJ;AACA;;AAEA,SAAS,kBAAkB;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,IAAI,IAAI,eAAe,SAAS,KAAK;;AAEnE;AACA;AACA;;AAEA;AACA,wCAAwC,IAAI,EAAE,KAAK;;AAEnD;AACA;AACA;AACA;AACA;AACA;;AAEA,6CAA6C;AAC7C;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,0CAA0C;AAC1C,4CAA4C;AAC5C;AACA;AACA;;AAEA;;AAEA,8CAA8C;AAC9C;AACA;AACA;AACA;;AAEA;AACA,iDAAiD,IAAI,yBAAyB,aAAa,IAAI;AAC/F,yCAAyC,IAAI,yBAAyB,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG;AAC5G,kDAAkD,IAAI,yBAAyB;AAC/E,mDAAmD,IAAI,yBAAyB;;AAEhF;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,IAAI,MAAM,EAAE;AAClD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAiE;AACjE;AACA,cAAc,uBAAuB;AACrC;AACA,cAAc,OAAO;AACrB;AACA;;AAEA,8CAA8C;AAC9C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS,YAAY;AACnE;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA,oBAAoB,OAAO;AAC3B,iFAAiF,SAAS,YAAY;AACtG;;AAEA;;AAEA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;;AAEA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gDAAgD,EAAE,GAAG,GAAG;AACxD,wCAAwC,EAAE,GAAG,EAAE;;AAE/C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,+BAA+B;;AAE/B;;AAEA,oCAAoC;AACpC;AACA;AACA,UAAU,iCAAiC;AAC3C;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;;AAEA,sCAAsC;;AAEtC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,EAAE;AACf,cAAc,IAAI,GAAG,GAAG,gBAAgB,GAAG,iCAAiC,IAAI;AAChF,UAAU,IAAI,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG;AAC/D,eAAe,IAAI,GAAG,IAAI;AAC1B,mBAAmB,IAAI;AACvB,aAAa,IAAI;AACjB,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,IAAI;AACf;AACA,0BAA0B,IAAI;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,IAAI;AAChC;AACA;AACA;;AAEA;AACA;AACA,wCAAwC,GAAG,SAAS,GAAG,WAAW,GAAG;AACrE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,IAAI,EAAE,KAAK;AACpC;AACA;AACA,4BAA4B,IAAI;AAChC,wBAAwB,IAAI,KAAK,GAAG,kBAAkB,GAAG;AACzD,sBAAsB,IAAI;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uBAAuB;;AAEvB;AACA;AACA;;AAEA,oBAAoB;AACpB;AACA,SAAS,IAAI;AACb;AACA,CAAC;;AAED;AACA;AACA,yBAAyB,IAAI,EAAE,KAAK;AACpC,4BAA4B,IAAI;AAChC,sBAAsB,EAAE;AACxB,wBAAwB,IAAI,KAAK,GAAG,kBAAkB,GAAG;AACzD,sBAAsB,IAAI;AAC1B;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,IAAI,EAAE,KAAK;AACpC;AACA;AACA,4BAA4B,IAAI;AAChC,wBAAwB,IAAI,KAAK,GAAG,kBAAkB,GAAG;AACzD,sBAAsB,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;AACA;AACA,uCAAuC,GAAG;AAC1C,gEAAgE,GAAG;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,IAAI;AACpB;AACA;AACA;AACA,6BAA6B,KAAK;AAClC;AACA,8BAA8B,IAAI;AAClC;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,kCAAkC,eAAe,EAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,WAAW,GAAG;AACd;AACA,2BAA2B,GAAG,8CAA8C,GAAG;AAC/E;AACA;;AAEA;AACA;AACA,0CAA0C,cAAc,EAAE;AAC1D;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAyC,eAAe,EAAE;;AAE1D,yCAAyC,KAAK;AAC9C,2CAA2C,EAAE,kCAAkC,KAAK,6CAA6C,KAAK;AACtI;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wBAAwB;;AAExB;AACA;AACA;;AAEA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA,0BAA0B,oCAAoC,UAAU;AACxE;AACA,+BAA+B,GAAG,iCAAiC,GAAG,6EAA6E,GAAG,+BAA+B,GAAG,gCAAgC,GAAG;AAC3N,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB,gCAAgC,GAAG;AACnC;AACA,6BAA6B,GAAG;AAChC,gBAAgB,IAAI;AACpB;AACA,CAAC;;AAED;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,iBAAiB,EAAE;AACnB;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,aAAa;AACvD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,aAAa;AACxD,iEAAiE;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4BAA4B,aAAa;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,aAAa;AACvD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,aAAa;AACxD,iEAAiE;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,4BAA4B,MAAM;AAClC;;AAEA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,KAAK;AAClB;AACA;AACA;AACA;AACA,kBAAkB,OAAO,MAAM,GAAG,IAAI,KAAK,KAAK,MAAM;AACtD;;AAEA;AACA,gBAAgB,MAAM,GAAG,KAAK,KAAK,MAAM;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,kBAAkB,KAAK;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,iBAAiB,KAAK;AACtB;;AAEA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA,+BAA+B,KAAK;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,oBAAoB,QAAQ;AAC5B;;AAEA;AACA;AACA;AACA,YAAY,MAAM,SAAS,YAAY;AACvC,YAAY,KAAK;AACjB,gCAAgC,KAAK;AACrC;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,sBAAsB,KAAK;AAC3B;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,kBAAkB,KAAK;AACvB;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,oBAAoB,KAAK;AACzB;;AAEA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,mBAAmB,KAAK;AACxB;;AAEA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,KAAK,SAAS,KAAK;AAC9C;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,WAAW,EAAE;AAC1E;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;;AAEA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,QAAQ;AAC9B;;AAEA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;;AAEA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gBAAgB,4BAA4B;AAC5C;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB,qDAAqD,aAAa;AAClE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,cAAc;AACd;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0IAA0I;AAC1I;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,4BAA4B;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,sDAAM;AACpB;AACA;;AAE6K;;;;;;;;;;;;;;;;;;;ACtvF7K;AACA;AACA;AACA;AACA;AACkN;AAC1J;;AAExD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA,qBAAqB;AACrB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAgE,EAAE,EAGrE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gCAAgC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAA0E,EAAE,EAgB/E;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAqC;AAClD,gBAAgB,CAAyF;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA,sCAAsC,mBAAmB,iCAAiC;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAqC,GAAG,EAE5C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,uDAAuD,uCAAuC;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,YAAY,KAAyD,EAAE,EAI9D;AACT;AACA,+BAA+B,iDAAiD,qCAAqC;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,kBAAkB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAsF,EAAE,EAE3F;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,aAAa;AACb;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA,wCAAwC,MAAqC,IAAI,CAAoB;AACrG;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA,6CAA6C,2BAA2B;AACxE,iCAAiC,yBAAyB,EAAE;AAC5D;AACA,iBAAiB;AACjB,KAAK;AACL,qDAAqD,WAAW;AAChE,mCAAmC,cAAc,QAAQ,mBAAmB;AAC5E,KAAK;AACL,8CAA8C,UAAU;AACxD,2CAA2C,cAAc,QAAQ,YAAY;AAC7E,KAAK;AACL,gDAAgD,UAAU;AAC1D,6CAA6C,cAAc,QAAQ,YAAY;AAC/E,KAAK;AACL,kDAAkD,UAAU;AAC5D,qEAAqE,cAAc;AACnF,KAAK;AACL;AACA;AACA;AACA,QAAQ,KAAgD,EAAE,EAKrD;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,6BAA6B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sCAAsC;AAC9D;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,GAAG;AAC1C;AACA;AACA,4EAA4E,MAAM,KAAK,GAAG;AAC1F;AACA;AACA;AACA;AACA,qDAAqD,GAAG,UAAU,GAAG,YAAY,GAAG;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,WAAW;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,KAAK;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA,2DAA2D,MAAM;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,MAAM;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,MAAqC;AAC9D,cAAc,CAAsE;AACpF,+BAA+B,KAAK;AACpC;AACA;AACA;AACA,gCAAgC,MAAM,KAAK,OAAO,KAAK,QAAQ;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,KAAqC,GAAG,EAO5C;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4CAA4C;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,KAAqC,GAAG,EAE5C;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAwE,EAAE,EAG7E;AACb;AACA;AACA,gBAAgB,KAAoE;AACpF,gBAAgB,EAAkD;AAClE;AACA;AACA;AACA;AACA,qBAAqB,KAAqC,GAAG,EAE5C;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB,KAAqC,GAAG,EAK5C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAgE,EAAE,EAErE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,oCAAoC,2BAA2B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,cAAc,8BAA8B,cAAc,0CAA0C,SAAS;AAC/I;AACA;AACA;AACA,kCAAkC,cAAc,8BAA8B,cAAc,0CAA0C,SAAS;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2BAA2B;AAC5D;AACA;AACA;AACA;AACA;AACA,0CAA0C,mBAAmB,0CAA0C,SAAS,mBAAmB,mBAAmB;AACtJ;AACA;AACA;AACA;AACA;;AAEA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA,sBAAsB;AACtB,2BAA2B;AAC3B,wBAAwB;AACxB,uBAAuB;AACvB,qBAAqB;AACrB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,qCAAqC;AACrC,6BAA6B;AAC7B,gCAAgC;AAChC,kCAAkC;AAClC,4BAA4B;AAC5B,mCAAmC;AACnC,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kBAAkB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAqC,KAAK,CAAsD;AACzG;AACA;AACA;;AAEA;AACA,oCAAoC,qBAAqB;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB,wBAAwB,QAAQ,qBAAqB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,MAAqC,IAAI,CAA8B;AACvG;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,MAAqC,IAAI,CAAmB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAqC,IAAI,CAAQ;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAqC,IAAI,CAAgB;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,MAAqC,IAAI,CAAsB;;AAErG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI,0DAAW;AACf,IAAI,4DAAa;AACjB,IAAI,0DAAW;AACf;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,6CAA6C,wBAAwB;AACrE;AACA;AACA,wBAAwB;AACxB;AACA;AACA,QAAQ,KAAgE,EAAE,EAGrE;AACL,yBAAyB,qDAAM;AAC/B;AACA,MAAM;AACN;AACA,SAAS,MAAqC;AAC9C,YAAY,CAAgM;AAC5M;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,yBAAyB;AACvD;AACA;AACA,yBAAyB;AACzB;AACA;AACA,QAAQ,KAAgE,EAAE,EAGrE;AACL;AACA;AACA,MAAM;AACN;AACA,SAAS,MAAqC;AAC9C,YAAY,CAAiM;AAC7M;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,MAAqC,IAAI,CAAmC;AAChK;AACA;AACA;AACA,YAAY,KAA2D,EAAE,EAoBhE;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,2GAA2G,cAAc,QAAQ,YAAY;AAC7I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAwF,EAAE,EAG7F;AACT;AACA;AACA,iBAAiB,KAAqC,GAAG,EA8B5C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAyE,EAAE,EAG9E;AACjB;AACA;AACA,uFAAuF,KAAK,QAAQ,YAAY;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,KAAK,QAAQ,YAAY;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,mBAAmB,qDAAM;AACzB,yBAAyB,qDAAM;AAC/B,kBAAkB,uDAAQ,sBAAsB,oDAAK;AACrD,8BAA8B,uDAAQ;AACtC,gBAAgB,UAAU;AAC1B,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,qBAAqB,uDAAQ;AAC7B;AACA,0BAA0B,uDAAQ;AAClC;AACA;AACA,4BAA4B;AAC5B;AACA,0BAA0B,oDAAK,sCAAsC,oDAAK;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAA+E,EAAE,EAkBpF;AACL;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA,cAAc,uDAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,qCAAqC,8DAAe;AACpD;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,mBAAmB,OAAO;AAC1B,qBAAqB,uDAAQ;AAC7B,gBAAgB,UAAU,EAAE,qDAAM;AAClC,wBAAwB,uDAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,kBAAkB,sCAAC;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC,8DAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA,oBAAoB,SAAS;AAC7B,mBAAmB,cAAc;AACjC,SAAS,MAAqC,KAAK,CAAqB;AACxE,8BAA8B,qDAAM;AACpC,+BAA+B,uDAAQ;AACvC,8BAA8B,qDAAM;AACpC;AACA;AACA,sBAAsB,uDAAQ;AAC9B,+BAA+B,oDAAK;AACpC,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,gCAAgC,uDAAQ;AACxC,QAAQ,sDAAO,eAAe,uDAAQ;AACtC,QAAQ,sDAAO;AACf,QAAQ,sDAAO;AACf,wBAAwB,kDAAG;AAC3B;AACA;AACA,QAAQ,oDAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,IAAI,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iCAAiC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sCAAC,yBAAyB;AACxD;AACA;AACA,aAAa;AACb,gBAAgB,KAEa,EAAE,EAelB;AACb;AACA;AACA;AACA,2CAA2C,6BAA6B;AACxE;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,kBAAkB,KAAK;AACvB;AACA,mBAAmB,KAAK;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA,qCAAqC,mCAAmC;AACxE;AACA;AACA;AACA,2CAA2C,qBAAqB;AAChE;AACA,gEAAgE,eAAe;AAC/E;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA,UAAU,kDAAkD;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,kBAAkB,iDAAiD;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,SAAS,EAAE,oBAAoB;AACtE;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAyD;AACjE,QAAQ,EACoD;AAC5D;AACA;AACA;AACA,yBAAyB,yDAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,KAAqC,GAAG,EAEjD;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA,mDAAmD,+BAA+B;AAClF;AACA,iBAAiB,KAAqC,GAAG,EAM5C;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,gBAAgB,KAIsC,EAAE,EAE3C;AACb,uCAAuC;AACvC;AACA,aAAa;AACb;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAwE,EAAE,EAE7E;AACT;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA,SAAS;AACT;AACA,aAAa,KAAqC,GAAG,EAO5C;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,eAAe;AAClE;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,gBAAgB,KAE8B,EAAE,EAGnC;AACb;AACA;AACA;AACA;AACA,yDAAyD;AACzD,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,sBAAsB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KASa,EAAE,EAGlB;AACrB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,uCAAuC;AACvC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,eAAe;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAqC,GAAG,EAE5C;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uDAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oDAAK;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,KAAqC;AAC9D,wBAAwB,EAAwD;AAChF,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,0CAA0C,8DAAe;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAA+E,EAAE,EAEpF;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,qDAAM;AACjB;;AAEoa;;;;;;;SChjHpa;SACA;;SAEA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;;SAEA;SACA;;SAEA;SACA;;SAEA;SACA;SACA;;SAEA;SACA;;;;;UC5BA;;;;;UCAA;UACA;UACA;UACA,eAAe,4BAA4B;UAC3C,eAAe;UACf,iCAAiC,WAAW;UAC5C;UACA;;;;;UCPA;UACA;UACA;UACA;UACA,yCAAyC,wCAAwC;UACjF;UACA;UACA;;;;;UCPA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,EAAE;UACF;;;;;UCRA;UACA;UACA;UACA,8BAA8B,o8nBAAo8nB;UACl+nB;;;;;UCJA;UACA;UACA;UACA,0CAA0C,mvBAAmvB;UAC7xB;;;;;UCJA;UACA;UACA;UACA;UACA,GAAG;UACH;UACA;UACA,CAAC;;;;;UCPD;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,EAAE;UACF;UACA;;;;;UCVA,8CAA8C;;;;;UCA9C;UACA;UACA;UACA;UACA,uBAAuB,4BAA4B;UACnD;UACA;UACA;UACA,iBAAiB,oBAAoB;UACrC;UACA,sCAAsC,YAAY;UAClD;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,4CAA4C,mBAAmB;UAC/D;UACA;UACA;UACA,mEAAmE,iCAAiC;UACpG;UACA;UACA;UACA;;;;;UCzCA;UACA;UACA;UACA,uDAAuD,iBAAiB;UACxE;UACA,gDAAgD,aAAa;UAC7D;;;;;UCNA;UACA;UACA;UACA;UACA;;;;;UCJA;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,IAAI;UACJ;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA,gBAAgB,6BAA6B;UAC7C;UACA;UACA;UACA;UACA;UACA,gBAAgB,8BAA8B;UAC9C;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,EAAE;UACF;UACA;UACA;UACA;UACA;;UAEA;UACA,kBAAkB;UAClB;UACA;UACA;UACA;UACA,GAAG;UACH;UACA;UACA,GAAG;UACH;UACA;;UAEA;;;;;UCnEA;;UAEA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA,iCAAiC;;UAEjC;UACA;UACA;UACA,KAAK;UACL,eAAe;UACf;UACA,2DAA2D,oEAAoE;UAC/H;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,MAAM;UACN;UACA;UACA;;UAEA;;UAEA;;UAEA;;UAEA;;UAEA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,iCAAiC,mCAAmC;UACpE;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA,MAAM,qBAAqB;UAC3B;UACA;UACA;UACA;UACA;UACA;;UAEA;;UAEA;UACA;UACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvFqC;AACP;AACvB,MAAM,+BAA+B;AAAA,EAE3C,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,+BAA+B;AAAA,EAC/E;AAAA,EAEM,2BAA2B;AAAA;AAChC,YAAM,SAAS,MAAM,0FAAyC,CAAC;AAAA,QAC9D,OAAO;AAAA,QACP,SAAS;AAAA,QACT,aAAa;AAAA,MACd,CAAC;AACD,UAAI,QAAQ;AACX,cAAM,WAAW,MAAM,kGAA6C,CAAC;AACrE,YAAI,CAA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kBAAkB;AAClC;AACA;AACO;AACP;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzCkE;AACT;AACzD,MAAM,0CAAqB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA,QAAQ,0CAAqB;AAC7B,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,yDAAe,YAAY,EAAC;;;AChDiB;AACA;AAC7C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oBAAY;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C,8BAA8B,oBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AAC6D;;;AC/BpE;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,sBAAsB;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;;AAEA,kBAAkB,sBAAsB;AACxC;AACA;;AAEA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;;;ACxKO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;ACV8D;AACxD;AACP;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI;AACT;AACA;AACA;AACA;AACO;AACP;AACA,mDAAmD,cAAU;AAC7D,uDAAuD,cAAU;AACjE;AACA;AACA,2CAA2C,cAAU;AACrD,+CAA+C,cAAU;AACzD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnDgD;AACO;AACL;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,OAAO;AACtC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,QAAQ,qBAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,uBAAuB,oBAAY;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnHA;AACa;AACb,+FAA+F,YAAM;AACrG;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACO,SAAS,YAAM;AACtB;AACA;AACA,iCAAiC,YAAM;AACvC,+BAA+B,YAAM;AACrC,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACO,SAAS,YAAM;AACtB;AACA,gBAAgB,gBAAgB;AAChC,4BAA4B,YAAM;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACO;AACP,gBAAgB,YAAM;AACtB;AACA;AACA,uBAAuB,YAAM;AAC7B;AACA;AACA;AACA;AACA,OAAO,IAAI,YAAM,EAAE;AACnB;;;ACjDA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACO,SAAS,cAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACO,SAAS,cAAM;AACtB;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;;;ACVP;AACiD;AACe;AACzD;AACP;AACA;AACA;AACA,kEAAkE,OAAO;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAU;AACjC;AACA;AACA;AACA;;;AClB4C;AACA;AACG;AACiB;AACJ;AACL;AACE;AACO;AAChE;AACA;AACA,oBAAoB,GAAc;AAClC;AACA,KAAK;AACL;AACA,CAAC;AACM,sBAAsB,SAAS;AACtC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,+CAA+C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,KAAK;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,cAAM;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA,qBAAqB;AACrB,8BAA8B,0BAA0B;AACxD;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO,sBAAsB,OAAO;AACpC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,QAAQ,qBAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,IAAI;AACzB;AACA;AACA,oCAAoC,GAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,gBAAgB,cAAU;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClZgE;AACzD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACM,kBAAkB,wBAAoB,IAAI,2BAAuB;AACjE;AACA;;;ACZqC;AACG;AACH;AACV;AACyE;AAC3D;AAChD;AACA;AACA;AACA;AACO,iBAAiB,SAAS;AACjC;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA,8BAA8B,SAAS;AACvC,8BAA8B,SAAS;AACvC,0BAA0B,SAAS;AACnC;AACA;AACA;AACA;AACA,uDAAuD,iBAAiB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA,YAAY,oBAAY;AACxB;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,KAAK;AACnD;AACA;AACA;AACA;AACA;AACA,6BAA6B,cAAM;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;;;AC3LuC;AACH;AAC7B;AACP,eAAe,EAAE;AACjB,aAAa,OAAO;AACpB;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2G,IAAI,GAAG,IAAI,SAAS,IAAI;AACnI;AACA;AACA;AACO;AACP;AACA;AACA,wEAAwE;AACxE;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,IAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;AChDmD;AACW;AAChB;AACA;AACS;AACX;AACrC,qBAAqB,OAAO;AACnC;AACA;AACA;AACA,eAAe,eAAe;AAC9B,eAAe,QAAQ;AACvB;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,KAAK;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,KAAK;AACjC;AACA,QAAQ,qBAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,gCAAgC;AAChC;AACA,SAAS;AACT;AACA;AACA,8BAA8B,cAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,sCAAsC;AACtC;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,6BAA6B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,wBAAwB,6BAA6B;AACrD;AACA;AACA,+BAA+B,UAAU;AACzC;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;;;ACpkBW;AACnB;AACX,MAAM,YAAQ,GAAG,eAAe;AACI;AACQ;AACD;AACJ;AACmB;;;ACPxB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1DA,MAAM,+BAAqB;AAC3B,MAAM,gBAAM;AACZ;AACA;AACA;AACA;AACA,MAAM,kBAAQ;AACd,MAAM,wBAAc;AACpB;AACA,QAAQ,kBAAQ;AAChB;AACA;AACA,QAAQ,kBAAQ;AAChB;AACA;AACA;AACA;AACA;AACO;AACP,aAAa,+BAAqB,mCAAmC,gBAAM;AAC3E,SAAS,wBAAc;AACvB;AACA;AACO;AACP;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjD0C;AAC1C;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACO;AACP;AACA;AACA;AACA;AACA,uCAAuC;AACvC,aAAa;AACb;AACA;AACA;AACA;AACA,QAAQ,QAAQ;AAChB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACO;AACP;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClFuD;AACY;AACd;AACrD;AACA;AACA;AACA;AACA;AACO,MAAM,kBAAQ;AACd;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA,+BAA+B;AAC/B,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACO,sBAAsB,OAAO;AACpC;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/RO;AACP;AACA;AACA;AACA;AACA;;;ACL8C;AACjB;AAC2B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,kFAAkF,eAAe;AACjG;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C,IAAI;AACJ;AACO,MAAM,aAAM,SAAS,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,YAAY;AACZ;AACA;AACA,4CAA4C;AAC5C,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,QAAQ;AACR;AACA;AACA,2CAA2C;AAC3C,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,EAAE;AACd,YAAY,EAAE;AACd,YAAY,EAAE;AACd,YAAY,EAAE;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,qCAAqC;AACrC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mCAAmC;AACzE;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,MAAM,kBAAkB,QAAQ;AAC9D,aAAa;AACb;AACA;AACA,0BAA0B,MAAM,kBAAkB,mBAAmB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC,iBAAiB,uBAAuB;AACxC;AACA;AACA,iBAAiB,cAAc;AAC/B,iBAAiB,qBAAqB;AACtC;AACA;AACA,iBAAiB,qBAAqB;AACtC;AACA;AACA,iBAAiB,wBAAwB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,cAAc;AACpC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,cAAc;AACxE;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM,qBAAqB,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,MAAM;AAClC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjEsF;AACjD;AACM;AACd;AACiB;AACU;AACjD,sBAAsB,OAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,qBAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,uCAAuC,0CAAM;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA,+BAA+B,EAAE;AACjC;AACA;AACA,SAAS;AACT;AACA,yBAAyB,EAAE;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,4CAA4C,EAAE,4CAA4C,EAAE;AAC7M;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,QAAQ;AAChB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,yBAAyB,aAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrW+B;AACQ;AACF;AACrC;AACA;AACA;AACA;AACA,SAAS,UAAM;AACf;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAM;AACpB,WAAW;AACX,UAAU;AACV,QAAQ,UAAM;AACd,aAAa,UAAM;AACnB,CAAC;AACD;AACA;AACA;AACA;AACA;AAC4C;AAC5C;AACA;AACA;AACA;AACA;AACgF;;;;;;;;;;;;;;;;;;;;;;;;ACxD3D;AACW;AACF;AACH;AAOpB;AACkC;AACtB;AACY;AAGxB,MAAM,yBAAyB;AAAA,EAA/B;AAMN,SAAQ,WAAW;AAAA;AAAA,EAJnB,OAAO,WAAW;AACjB,WAAQ,KAAK,YAAY,KAAK,aAAa,IAAI,yBAAyB;AAAA,EACzE;AAAA,EAIA,QAAQ;AACP,QAAI,KAAK,UAAU;AAClB,cAAQ,IAAI,iBAAiB;AAC7B;AAAA,IACD;AACA,SAAK,WAAW;AAEhB,WAAO,iBAAiB,gBAAgB,CAAC,UAAU;AAClD,WAAK,WAAW;AAAA,IACjB,CAAC;AACD,UAAM,UAAmC;AAAA,MACxC,mBAAmB;AAAA,IACpB;AAGA,UAAM,iBAAiB,SAAS,SAAS,WAAW,OAAO,IAAI,QAAQ;AACvE,QAAI,M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","sources":["webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/createClass.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/slicedToArray.js","webpack:///../@polygonjs/polygonjs/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/colorNameToRgb.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/colorize.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/cssColors.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/hexToRgb.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/hslToRgb.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/hsvToRgb.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/hueToColorComponent.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/rgbToHex.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/rgbToHsl.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/colors/rgbToHsv.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/curves/bezier/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/curves/bezier/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/curves/bezier/tangentAt.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/curves/bezier/valueAt.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/curves/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/applyTransforms.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/fromCompactBinary.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/isA.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/reverse.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/toCompactBinary.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/toOutlines.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/toPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/toSides.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom2/validate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/applyTransforms.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/fromCompactBinary.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/invert.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/isA.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/toCompactBinary.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/toPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/toPolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/geom3/validate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/appendArc.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/appendBezier.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/appendPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/applyTransforms.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/close.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/concat.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/fromCompactBinary.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/isA.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/reverse.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/toCompactBinary.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/toPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/path2/validate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly2/arePointsInside.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly2/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly2/flip.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly2/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly2/measureArea.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/fromPointsAndPlane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/invert.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/isA.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/isConvex.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/measureArea.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/measureBoundingBox.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/measureBoundingSphere.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/measureSignedVolume.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/plane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/toPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/geometries/poly3/validate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/OrthoNormalBasis.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/constants.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/closestPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/copy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/direction.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/distanceToPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/fromValues.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/intersectPointOfLines.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/origin.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/reverse.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line2/xAtY.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/closestPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/copy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/direction.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/distanceToPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/fromPlanes.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/fromPointAndDirection.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/intersectPointOfLineAndPlane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/origin.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/reverse.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/line3/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/add.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/copy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromRotation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromScaling.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromTaitBryanRotation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromTranslation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromValues.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromVectorRotation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromXRotation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromYRotation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/fromZRotation.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/identity.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/invert.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/isIdentity.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/isMirroring.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/isOnlyTransformScale.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/mirrorByPlane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/multiply.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/rotate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/rotateX.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/rotateY.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/rotateZ.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/scale.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/subtract.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/mat4/translate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/flip.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/fromNormalAndPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/fromPointsRandom.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/projectionOfPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/signedDistanceToPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/plane/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/aboutEqualNormals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/area.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/interpolateBetween2DPointsForY.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/intersect.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/solve2Linear.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/utils/trigonometry.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/abs.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/add.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/angle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/angleDegrees.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/angleRadians.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/copy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/cross.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/distance.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/divide.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/dot.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/fromAngleDegrees.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/fromAngleRadians.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/fromScalar.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/fromValues.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/length.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/lerp.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/max.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/min.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/multiply.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/negate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/normal.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/normalize.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/rotate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/scale.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/snap.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/squaredDistance.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/squaredLength.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/subtract.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec2/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/abs.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/add.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/angle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/copy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/cross.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/distance.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/divide.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/dot.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/fromScalar.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/fromValues.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/fromVec2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/length.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/lerp.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/max.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/min.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/multiply.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/negate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/normalize.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/orthogonal.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/rotateX.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/rotateY.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/rotateZ.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/scale.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/snap.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/squaredDistance.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/squaredLength.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/subtract.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec3/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/copy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/dot.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/fromScalar.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/fromValues.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/maths/vec4/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/calculateEpsilonFromBounds.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureAggregateArea.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureAggregateBoundingBox.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureAggregateEpsilon.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureAggregateVolume.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureArea.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureBoundingBox.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureBoundingSphere.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureCenter.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureCenterOfMass.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureDimensions.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureEpsilon.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/measurements/measureVolume.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/fromFakePolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/intersect.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/intersectGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/intersectGeom3.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/intersectGeom3Sub.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/mayOverlap.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/scission.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/scissionGeom3.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/subtract.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/subtractGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/subtractGeom3.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/subtractGeom3Sub.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/to3DWalls.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/trees/Node.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/trees/PolygonTreeNode.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/trees/Tree.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/trees/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/trees/splitLineSegmentByPlane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/trees/splitPolygonByPlane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/union.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/unionGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/unionGeom3.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/booleans/unionGeom3Sub.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/expand.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/expandGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/expandGeom3.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/expandPath2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/expandShell.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/extrudePolygon.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/offset.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/offsetFromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/offsetGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/expansions/offsetPath2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/assignHoles.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/eliminateHoles.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/linkedList.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/linkedListSort.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/linkedPolygon.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/polygonHierarchy.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/earcut/triangle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeFromSlices.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeHelical.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeLinear.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeLinearGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeLinearPath2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeRectangular.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeRectangularGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeRectangularPath2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeRotate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/extrudeWalls.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/project.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/calculatePlane.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/clone.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/create.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/equals.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/fromPoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/fromSides.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/isA.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/repair.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/reverse.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/toEdges.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/toPolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/extrusions/slice/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/hull.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/hullChain.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/hullGeom2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/hullGeom3.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/hullPath2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/hullPoints2.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/Face.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/HalfEdge.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/QuickHull.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/Vertex.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/VertexList.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/get-plane-normal.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/quickhull/point-line-distance.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/hulls/toUniquePoints.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/generalize.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/insertTjunctions.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/mergePolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/reTesselateCoplanarPolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/retessellate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/snap.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/snapPolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/modifiers/triangulatePolygons.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/align.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/center.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/mirror.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/rotate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/scale.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/transform.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/operations/transforms/translate.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/arc.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/circle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/commonChecks.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/cube.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/cuboid.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/cylinder.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/cylinderElliptic.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/ellipse.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/ellipsoid.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/geodesicSphere.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/line.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/polygon.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/polyhedron.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/rectangle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/roundedCuboid.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/roundedCylinder.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/roundedRectangle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/sphere.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/square.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/star.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/torus.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/primitives/triangle.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/text/fonts/single-line/hershey/simplex.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/text/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/text/vectorChar.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/text/vectorParams.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/text/vectorText.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/areAllShapesTheSameType.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/degToRad.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/flatten.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/fnNumberSort.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/index.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/insertSorted.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/padArrayToLength.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/radToDeg.js","webpack:///../@polygonjs/polygonjs/node_modules/@jscad/modeling/src/utils/radiusToSegments.js","webpack:///../@polygonjs/polygonjs/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","webpack:///../@polygonjs/polygonjs/node_modules/@vue/shared/dist/shared.esm-bundler.js","webpack:///../@polygonjs/polygonjs/node_modules/automation-events/build/es5/bundle.js","webpack:///../@polygonjs/polygonjs/node_modules/fontfaceobserver/fontfaceobserver.standalone.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_DataView.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Hash.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_ListCache.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Map.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_MapCache.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Promise.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Set.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_SetCache.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Stack.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Symbol.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_Uint8Array.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_WeakMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_apply.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_arrayEach.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_arrayFilter.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_arrayLikeKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_arrayMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_arrayPush.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_arraySome.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_assignValue.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_assocIndexOf.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseAssign.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseAssignIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseAssignValue.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseClone.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseCreate.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseEach.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseFlatten.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseFor.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseForOwn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseGetAllKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseGetTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseHasIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsArguments.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsEqual.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsEqualDeep.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsMatch.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsNative.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIsTypedArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseIteratee.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseKeysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseMatches.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseMatchesProperty.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseOrderBy.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseProperty.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_basePropertyDeep.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_basePropertyOf.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseRange.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseRest.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseSetToString.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseSortBy.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseSum.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseTimes.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseToString.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseTrim.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseUnary.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_baseValues.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cacheHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_castPath.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cloneArrayBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cloneBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cloneDataView.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cloneRegExp.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cloneSymbol.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_cloneTypedArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_compareAscending.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_compareMultiple.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_copyArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_copyObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_copySymbols.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_copySymbolsIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_coreJsData.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_createAssigner.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_createBaseEach.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_createBaseFor.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_createRange.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_customDefaultsAssignIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_defineProperty.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_equalArrays.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_equalByTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_equalObjects.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_escapeHtmlChar.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_escapeStringChar.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_freeGlobal.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getAllKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getAllKeysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getMapData.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getMatchData.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getNative.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getPrototype.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getRawTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getSymbols.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getSymbolsIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_getValue.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_hasPath.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_hashClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_hashDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_hashGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_hashHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_hashSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_initCloneArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_initCloneByTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_initCloneObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isFlattenable.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isIndex.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isIterateeCall.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isKey.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isKeyable.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isMasked.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isPrototype.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_isStrictComparable.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_listCacheClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_listCacheDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_listCacheGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_listCacheHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_listCacheSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_mapCacheClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_mapCacheDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_mapCacheGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_mapCacheHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_mapCacheSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_mapToArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_matchesStrictComparable.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_memoizeCapped.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_nativeCreate.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_nativeKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_nativeKeysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_nodeUtil.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_objectToString.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_overArg.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_overRest.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_reEscape.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_reEvaluate.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_reInterpolate.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_root.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_setCacheAdd.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_setCacheHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_setToArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_setToString.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_shortOut.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_stackClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_stackDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_stackGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_stackHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_stackSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_stringToPath.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_toKey.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_toSource.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/_trimmedEndIndex.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/assignInWith.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/attempt.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/cloneDeep.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/compact.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/constant.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/eq.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/escape.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/get.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/hasIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/identity.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isArguments.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isArrayLike.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isError.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isFunction.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isLength.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isObjectLike.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isPlainObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isSymbol.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/isTypedArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/keys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/keysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/lodash.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/memoize.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/property.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/range.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/sortBy.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/stubArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/stubFalse.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/sum.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/template.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/templateSettings.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/toFinite.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/toNumber.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash/toString.js","webpack:///../@polygonjs/polygonjs/node_modules/mapbox-gl/dist/mapbox-gl.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/abort-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-active-input-connection-to-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-audio-node-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-audio-param-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/globals.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-constructible.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/split-import-statements.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-audio-worklet-module.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-value-for-key.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/pick-element-from-set.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/delete-passive-input-connection-to-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-event-listeners-of-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/set-internal-state-to-active.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/audio-worklet-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/set-internal-state-to-passive.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/set-internal-state-to-passive-when-necessary.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-connection-to-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-passive-input-connection-to-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-silent-connection.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/add-unrendered-audio-worklet-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/analyser-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-owned-by-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/analyser-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/index-size-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-buffer-get-channel-data-method.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-buffer-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/constants.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-active-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-buffer-source-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-buffer-source-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/audio-buffer-source-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/biquad-filter-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/constant-source-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/gain-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/oscillator-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/stereo-panner-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-audio-node-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-audio-param-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/deactivate-active-audio-node-input-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/deactivate-audio-graph.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-valid-latency-hint.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-destination-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-destination-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-listener-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/audio-node-output-connection.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/insert-element-in-set.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/add-active-input-connection-to-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/add-passive-input-connection-to-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/native-audio-node-faker.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/connect-native-audio-node-to-native-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/delete-active-input-connection.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/delete-active-input-connection-to-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/delete-event-listeners-of-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/delete-passive-input-connection-to-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/disconnect-native-audio-node-from-native-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-native-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-native-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-part-of-a-cycle.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-passive-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-node-disconnect-method-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/visit-each-audio-node-once.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/native-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-node-disconnect-method.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-param-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-param-renderer.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/read-only-map.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-worklet-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/copy-from-channel.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/copy-to-channel.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/create-nested-arrays.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-audio-worklet-processor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/audio-worklet-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/base-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/biquad-filter-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/biquad-filter-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/cache-test-result.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/channel-merger-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/channel-merger-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/channel-splitter-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/channel-splitter-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/connect-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/connect-multiple-outputs.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/connected-native-audio-buffer-source-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/constant-source-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/constant-source-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/convert-number-to-unsigned-long.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/convolver-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/convolver-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/create-native-offline-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/data-clone-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/detach-array-buffer.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/decode-audio-data.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/decrement-cycle-counter.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/delay-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/delay-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/delete-active-input-connection-to-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/delete-unrendered-audio-worklet-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/guards/delay-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/detect-cycles.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/disconnect-multiple-outputs.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/dynamics-compressor-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/dynamics-compressor-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/encoding-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/evaluate-source.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/event-target-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/expose-current-frame-and-current-time.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/fetch-source.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/gain-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/gain-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-active-audio-worklet-node-inputs.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-audio-node-renderer.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-audio-node-tail-time.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-audio-param-renderer.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-backup-offline-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/invalid-state-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-native-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-or-create-backup-offline-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/get-unrendered-audio-worklet-nodes.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/invalid-access-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-iir-filter-node-get-frequency-response-method.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/iir-filter-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/filter-buffer.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/iir-filter-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/increment-cycle-counter-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-any-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-any-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-any-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-any-offline-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-native-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-native-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-native-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-native-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-native-offline-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/is-secure-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/media-element-audio-source-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/media-stream-audio-destination-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/media-stream-audio-source-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/media-stream-track-audio-source-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/minimal-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/minimal-base-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-promise-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/minimal-offline-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/monitor-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/assign-native-audio-node-option.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/assign-native-audio-node-options.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-analyser-node-get-float-time-domain-data-method-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-analyser-node-get-float-time-domain-data-method.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-analyser-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-buffer-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/assign-native-audio-node-audio-param-value.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-buffer-source-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-destination-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-worklet-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-clonability-of-audio-worklet-node-options.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-worklet-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/compute-buffer-size.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/clone-audio-worklet-node-options.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/create-audio-worklet-processor-promise.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/create-audio-worklet-processor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-audio-worklet-node-faker-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-biquad-filter-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-channel-merger-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-channel-splitter-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-channel-splitter-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-constant-source-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/intercept-connections.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-constant-source-node-faker-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-convolver-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-delay-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-dynamics-compressor-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-gain-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-iir-filter-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-iir-filter-node-faker-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-media-element-audio-source-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-media-stream-audio-destination-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-media-stream-audio-source-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-media-stream-track-audio-source-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-offline-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-oscillator-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-panner-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-panner-node-faker-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-periodic-wave-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-script-processor-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-stereo-panner-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-stereo-panner-node-faker-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-wave-shaper-node-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/native-wave-shaper-node-faker-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/not-supported-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/offline-audio-context-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/oscillator-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/oscillator-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/panner-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/panner-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/periodic-wave-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/render-automation.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/render-inputs-of-audio-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/render-inputs-of-audio-param.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/render-native-offline-audio-context.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/set-active-audio-worklet-node-inputs.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/set-audio-node-tail-time.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/start-rendering.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/stereo-panner-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/stereo-panner-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/test-audio-buffer-constructor-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/test-audio-worklet-processor-post-message-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/test-offline-audio-context-current-time-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/unknown-error.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/wave-shaper-node-constructor.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/wave-shaper-node-renderer-factory.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/window.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/wrap-audio-buffer-copy-channel-methods.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/factories/wrap-channel-merger-node.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/get-first-sample.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/is-dc-curve.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/overwrite-accessors.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/sanitize-audio-worklet-node-options.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/sanitize-channel-splitter-options.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/sanitize-periodic-wave-options.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/set-value-at-time-until-possible.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-source-node-start-method-offset-clamping-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/test-audio-worklet-node-options-clonability.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-buffer-source-node-start-method-offset-clamping.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/helpers/wrap-event-listener.js","webpack:///../@polygonjs/polygonjs/node_modules/standardized-audio-context/build/es2019/module.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/component/channel/Volume.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/DummyContext.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/Global.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/Tone.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/AudioContext.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/BaseContext.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/Ticker.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/Context.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/ContextInitialization.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/Gain.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/OfflineContext.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/Param.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/ToneAudioBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/ToneAudioNode.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/ToneWithContext.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/type/Conversions.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/type/Frequency.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/type/TimeBase.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/type/Time.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/type/TransportTime.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/AdvancedTypeCheck.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Debug.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Decorator.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Defaults.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Emitter.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Interface.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Math.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/Timeline.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/TypeCheck.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/instrument/Instrument.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/signal/ToneConstantSource.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/signal/Signal.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/source/OneShotSource.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/Destination.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/TimelineValue.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/type/Ticks.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/IntervalTimeline.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/util/StateTimeline.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/TickParam.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/TickSignal.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/TickSource.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/Clock.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/TransportEvent.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/TransportRepeatEvent.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/clock/Transport.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/source/Source.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/source/buffer/Player.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/source/buffer/ToneBufferSource.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/version.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/node_modules/tslib/tslib.es6.js","webpack:///../@polygonjs/polygonjs/src/modules/core/controls/OrbitControls.js","webpack:///../node_modules/@heroicons/vue/20/solid/MagnifyingGlassIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/AdjustmentsVerticalIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/ArrowTopRightOnSquareIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/ArrowsPointingOutIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/ChevronLeftIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/ChevronRightIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/EllipsisHorizontalCircleIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/ExclamationTriangleIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/FaceFrownIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/MagnifyingGlassIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/MinusCircleIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/PlusCircleIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/QuestionMarkCircleIcon.js","webpack:///../node_modules/@heroicons/vue/24/outline/XMarkIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/Bars3Icon.js","webpack:///../node_modules/@heroicons/vue/24/solid/CameraIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/CheckCircleIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/CheckIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronDoubleDownIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronDoubleLeftIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronDoubleRightIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronDoubleUpIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronDownIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronLeftIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronRightIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronUpDownIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ChevronUpIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ClockIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/CodeBracketIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/FlagIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ListBulletIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/LockClosedIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/LockOpenIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/MapPinIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/NoSymbolIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/PlusCircleIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/PlusIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/ShareIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/WrenchScrewdriverIcon.js","webpack:///../node_modules/@heroicons/vue/24/solid/XCircleIcon.js","webpack:///../node_modules/@sentry/hub/esm/flags.js","webpack:///../node_modules/@sentry/hub/esm/session.js","webpack:///../node_modules/@sentry/hub/esm/hub.js","webpack:///../node_modules/@sentry/hub/esm/scope.js","webpack:///../node_modules/@sentry/hub/node_modules/tslib/tslib.es6.js","webpack:///../node_modules/@sentry/tracing/esm/constants.js","webpack:///../node_modules/@sentry/tracing/esm/flags.js","webpack:///../node_modules/@sentry/tracing/esm/errors.js","webpack:///../node_modules/@sentry/tracing/esm/hubextensions.js","webpack:///../node_modules/@sentry/tracing/esm/idletransaction.js","webpack:///../node_modules/@sentry/tracing/esm/span.js","webpack:///../node_modules/@sentry/tracing/esm/transaction.js","webpack:///../node_modules/@sentry/tracing/esm/utils.js","webpack:///../node_modules/@sentry/tracing/node_modules/tslib/tslib.es6.js","webpack:///../node_modules/@sentry/utils/esm/browser.js","webpack:///../node_modules/@sentry/utils/esm/flags.js","webpack:///../node_modules/@sentry/utils/esm/global.js","webpack:///../node_modules/@sentry/utils/esm/instrument.js","webpack:///../node_modules/@sentry/utils/esm/is.js","webpack:///../node_modules/@sentry/utils/esm/logger.js","webpack:///../node_modules/@sentry/utils/esm/misc.js","webpack:///../node_modules/@sentry/utils/esm/env.js","webpack:///../node_modules/@sentry/utils/esm/node.js","webpack:///../node_modules/@sentry/utils/esm/object.js","webpack:///../node_modules/@sentry/utils/esm/stacktrace.js","webpack:///../node_modules/@sentry/utils/esm/string.js","webpack:///../node_modules/@sentry/utils/esm/supports.js","webpack:///../node_modules/@sentry/utils/esm/syncpromise.js","webpack:///../node_modules/@sentry/utils/esm/time.js","webpack:///../node_modules/@sentry/utils/node_modules/tslib/tslib.es6.js","webpack:///../node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js","webpack:///../node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js","webpack:///../node_modules/@vue/shared/dist/shared.esm-bundler.js","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue?693e","webpack:///../src/editor/components/panels/common/Navigation.vue?faf6","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue?5eae","webpack:///../src/editor/components/panels/custom/Custom.vue?ded6","webpack:///../src/editor/components/panels/multiple/Multiple.vue?5b2e","webpack:///../src/editor/components/panels/network/NetworkCore.vue?5304","webpack:///../src/editor/components/panels/network/components/Connection.vue?1944","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue?58a0","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue?bc0e","webpack:///../src/editor/components/panels/network/components/Node.vue?e2f4","webpack:///../src/editor/components/panels/network/components/NodeComment.vue?ad12","webpack:///../src/editor/components/panels/network/components/NodeError.vue?a555","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue?207b","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue?8e1c","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue?08ce","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue?7507","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue?db28","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue?3d50","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue?c0b7","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue?9dab","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue?7927","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue?65f8","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue?060b","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue?950c","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue?de68","webpack:///../src/editor/components/panels/params/Params.vue?c24d","webpack:///../src/editor/components/panels/params/components/Extras.vue?2207","webpack:///../src/editor/components/panels/params/components/Param.vue?988b","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue?224e","webpack:///../src/editor/components/panels/params/components/fields/Button.vue?fec1","webpack:///../src/editor/components/panels/params/components/fields/Color.vue?5f13","webpack:///../src/editor/components/panels/params/components/fields/Float.vue?0d5a","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue?ec6e","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue?9c59","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue?f7d3","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue?b568","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue?d269","webpack:///../src/editor/components/panels/params/components/fields/String.vue?1981","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue?0c29","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue?f6ee","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue?2a7c","webpack:///../src/editor/components/panels/viewer/Viewer.vue?ba37","webpack:///../src/editor/components/widgets/DropDownMenu.vue?c2a9","webpack:///../src/editor/components/widgets/NodeTree.vue?4290","webpack:///../src/editor/components/widgets/dialogs/Modal.vue?c6b0","webpack:///../node_modules/css-loader/dist/runtime/api.js","webpack:///../node_modules/css-loader/dist/runtime/getUrl.js","webpack:///../node_modules/css-loader/dist/runtime/sourceMaps.js","webpack:///../@polygonjs/polygonjs/examples/presets/BasePreset.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/ImageEXR.ts","webpack:///../@polygonjs/polygonjs/src/core/ArrayUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/Assets.ts","webpack:///../@polygonjs/polygonjs/src/core/BlobUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/Color.ts","webpack:///../@polygonjs/polygonjs/src/core/CoreSceneObjectsFactory.ts","webpack:///../@polygonjs/polygonjs/src/core/CursorMoveMonitor.ts","webpack:///../@polygonjs/polygonjs/src/core/DecomposedPath.ts","webpack:///../@polygonjs/polygonjs/src/core/DomUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/EventHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/FeaturesController.ts","webpack:///../@polygonjs/polygonjs/src/core/FileTypeController.ts","webpack:///../@polygonjs/polygonjs/src/core/Image.ts","webpack:///../@polygonjs/polygonjs/src/core/MapUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/MouseButton.ts","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_listCacheClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/eq.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_assocIndexOf.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_listCacheDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_listCacheGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_listCacheHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_listCacheSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_ListCache.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_stackClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_stackDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_stackGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_stackHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isFunction.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_coreJsData.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_isMasked.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_toSource.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseIsNative.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getValue.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getNative.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Map.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_nativeCreate.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_hashClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_hashDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_hashGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_hashHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_hashSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Hash.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_mapCacheClear.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_isKeyable.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getMapData.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_mapCacheDelete.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_mapCacheGet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_mapCacheHas.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_mapCacheSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_MapCache.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_stackSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Stack.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_arrayEach.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_defineProperty.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseAssignValue.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_assignValue.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_copyObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseTimes.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseIsArguments.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isArguments.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/stubFalse.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_isIndex.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isLength.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseIsTypedArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseUnary.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_nodeUtil.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isTypedArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_arrayLikeKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_isPrototype.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_overArg.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_nativeKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isArrayLike.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/keys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseAssign.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_nativeKeysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseKeysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/keysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseAssignIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_cloneBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_copyArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_arrayFilter.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/stubArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getSymbols.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_copySymbols.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_arrayPush.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getPrototype.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getSymbolsIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_copySymbolsIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseGetAllKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getAllKeys.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getAllKeysIn.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_DataView.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Promise.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Set.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_WeakMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_initCloneArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Uint8Array.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_cloneArrayBuffer.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_cloneDataView.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_cloneRegExp.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_cloneSymbol.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_cloneTypedArray.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_initCloneByTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseCreate.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_initCloneObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseIsMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isMap.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseIsSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isSet.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseClone.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/cloneDeep.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/clone.js","webpack:///../@polygonjs/polygonjs/src/core/ObjectUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/RaycastHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/SetUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/Sleep.ts","webpack:///../@polygonjs/polygonjs/src/core/String.ts","webpack:///../@polygonjs/polygonjs/src/core/ThreeToGl.ts","webpack:///../@polygonjs/polygonjs/src/core/ThreeToJs.ts","webpack:///../@polygonjs/polygonjs/src/core/Transform.ts","webpack:///../@polygonjs/polygonjs/src/core/TransformSpace.ts","webpack:///../@polygonjs/polygonjs/src/core/Type.ts","webpack:///../@polygonjs/polygonjs/src/core/UrlHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/UserAgent.ts","webpack:///../@polygonjs/polygonjs/src/core/UserData.ts","webpack:///../@polygonjs/polygonjs/src/core/VideoEvent.ts","webpack:///../@polygonjs/polygonjs/src/core/Walker.ts","webpack:///../@polygonjs/polygonjs/src/core/actor/ActorCompilationController.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/Constant.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/AnimatedPropertiesRegister.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/StartTimeline.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/ParamProxy.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/NodeParamProxiesRegister.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/WithOp.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Vector4.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Color.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Vector3.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Vector2.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Number.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Vector.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Quaternion.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/type/Euler.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/TimelineBuilderProperty.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/TimelineBuilder.ts","webpack:///../@polygonjs/polygonjs/src/core/animation/vars/AnimBuilderTypes.ts","webpack:///../@polygonjs/polygonjs/src/core/audio/AudioBuilder.ts","webpack:///../@polygonjs/polygonjs/src/core/audio/Notes.ts","webpack:///../@polygonjs/polygonjs/src/core/audio/PlayerCallbacksManager.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraCSSRendererController.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraControlsController.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraFPS.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraFrameMode.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraPostProcessController.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraRenderSceneController.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraRendererController.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraViewOffset.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreCameraViewerCodeController.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CoreOrthographicCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/CorePerspectiveCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/frameMode/CoreCameraOrthographicFrameMode.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/frameMode/CoreCameraPerspectiveFrameMode.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/frameMode/_BaseCoreCameraFrameMode.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/webXR/CoreCameraMarkerTracking.ts","webpack:///../@polygonjs/polygonjs/src/core/code/FunctionBuilderUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/computerVision/face/Data.ts","webpack:///../@polygonjs/polygonjs/src/core/computerVision/hand/Data.ts","webpack:///../@polygonjs/polygonjs/src/core/cop/ColorSpace.ts","webpack:///../@polygonjs/polygonjs/src/core/cop/Filter.ts","webpack:///../@polygonjs/polygonjs/src/core/cop/Mapping.ts","webpack:///../@polygonjs/polygonjs/src/core/cop/Wrapping.ts","webpack:///../@polygonjs/polygonjs/src/core/event/CoreEventEmitter.ts","webpack:///../@polygonjs/polygonjs/src/core/Vector.ts","webpack:///../@polygonjs/polygonjs/src/core/event/CursorHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/event/DragEventType.ts","webpack:///../@polygonjs/polygonjs/src/core/event/KeyboardEventType.ts","webpack:///../@polygonjs/polygonjs/src/core/event/MouseEventType.ts","webpack:///../@polygonjs/polygonjs/src/core/event/MouseHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/event/PointerEventType.ts","webpack:///../@polygonjs/polygonjs/src/core/event/TouchEventType.ts","webpack:///../@polygonjs/polygonjs/src/core/event/WindowEventType.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Attribute.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/AttributeData.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/AttributeUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Constant.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/CoreEntity.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/CoreObjectFactory.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/CorePath.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/EntityGroupCollection.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Event.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/GeometryUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/GlConstant.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadCoreType.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Group.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Instancer.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Mask.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Material.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/ObjectContent.ts","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/GeometryRayIntersectUtilities.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/ExtensionUtilities.js","webpack:///../@polygonjs/polygonjs/src/core/geometry/bvh/ThreeMeshBVHHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/ObjectAttributeReactivityUpdateRef.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/object/BaseCoreObject.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/object/BaseCoreObjectUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/point/CorePoint.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/point/CorePointUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/primitive/CorePrimitive.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/primitive/CorePrimitiveUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/primitive/PrimitiveGraph.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/utils/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/vertex/CoreVertex.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/entities/vertex/CoreVertexUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadConstant.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadCoreType.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadEntityGroupCollection.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadExceptionHandler.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/build/polygonjs-occt.js","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadLoader.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadLoaderSync.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadTriangulationFaceUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadShape.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadObject.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/CadTraverse.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/operations/CadTransform.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadCompound.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadEdge.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadGeom2dCurve.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadPnt2d.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadShapeCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadVertex.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/toObject3D/CadWire.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/cad/utils/TesselationParamsConfig.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/csg/CsgCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/csg/CsgCoreType.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/csg/utils/TesselationParamsConfig.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/builders/QuadGeometryMerge.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadCoreObject.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadGeometry.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/toObject3D/QuadToObject3DCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/toObject3D/QuadToMesh.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/toObject3D/QuadToLine.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/toObject3D/QuadToPoint.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/toObject3D/QuadToConnections.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/toObject3D/QuadToObject3D.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadObject.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadPoint.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/builders/QuadPrimitiveBuilder.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadPrimitive.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/QuadVertex.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/graph/QuadHalfEdge.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/graph/QuadNode.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/graph/QuadGraph.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/graph/QuadGraphCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/graph/QuadGraphUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/LineUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/utils/QuadUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/quad/utils/TesselationParamsConfig.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/SDFCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/SDFLoaderSync.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/SDFConstant.ts","webpack:///../@polygonjs/polygonjs/src/modules/three/examples/jsm/utils/BufferGeometryUtils.js","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/toObject3D/SDFToObject3D.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/SDFObject.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/tet/TetCoreType.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/tet/utils/TesselationParamsConfig.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/CoreThreejsPointUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsPrimitiveLineSegment.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsPrimitivePoint.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreeModule.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/Geometry.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsCoreObject.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsPoint.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsPrimitive.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsPrimitiveTriangle.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsVertex.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/builders/Merge.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/builders/Mesh.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/builders/_Base.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/builders/LineSegments.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/builders/Points.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/three/builders/geometryBuilder.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/operation/Hexagon.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/operation/TextureFromAttribute.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextFlat.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/util/IndexBuilder.ts","webpack:///../@polygonjs/polygonjs/src/core/graph/DirtyController.ts","webpack:///../@polygonjs/polygonjs/src/core/graph/CoreGraphNode.ts","webpack:///../@polygonjs/polygonjs/src/core/helpers/CameraHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/keyframes/KeyframeCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/keyframes/KeyframeSamples.ts","webpack:///../@polygonjs/polygonjs/src/core/keyframes/KeyframeSerialize.ts","webpack:///../@polygonjs/polygonjs/src/core/keyframes/KeyframeTangent.ts","webpack:///../@polygonjs/polygonjs/src/core/lights/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/helpers/CoreCameraHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/lights/DirectionalLight.ts","webpack:///../@polygonjs/polygonjs/src/core/lights/spotlight/glsl/vert.glsl","webpack:///../@polygonjs/polygonjs/src/core/lights/spotlight/glsl/frag.glsl","webpack:///../@polygonjs/polygonjs/src/core/lights/spotlight/CoreSpotLightHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/lights/spotlight/VolumetricSpotLight.ts","webpack:///../@polygonjs/polygonjs/src/core/lights/SpotLight.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/AssetsUtils.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/Audio.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/FileExtensionRegister.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/Stylesheet.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/Texture.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/_Base.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/common.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/font/Font.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/font/FontLoader.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/libs/opentype.module.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/TTFLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/font/CoreFontLoader.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/GLTF.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/JSONDataParser.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/OBJLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/OBJ.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/SDF.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/Geometry.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/_BaseLoaderHandler.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/utils/WorkerPool.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/libs/ktx-parse.module.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/libs/zstddec.module.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/KTX2Loader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/KTX2.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/_BaseTextureLoader.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/_BaseImageLoader.ts","webpack:///../@polygonjs/polygonjs/src/core/logger/Base.ts","webpack:///../@polygonjs/polygonjs/src/core/logger/Console.ts","webpack:///../@polygonjs/polygonjs/src/core/material/uniform.ts","webpack:///../@polygonjs/polygonjs/src/core/math/Easing.ts","webpack:///../@polygonjs/polygonjs/src/core/math/_Module.ts","webpack:///../@polygonjs/polygonjs/src/core/monkeyPatch/SpotLight.ts","webpack:///../@polygonjs/polygonjs/src/core/particles/CoreParticlesRenderController.ts","webpack:///../@polygonjs/polygonjs/src/core/particles/CoreParticlesController.ts","webpack:///../@polygonjs/polygonjs/src/core/particles/CoreParticles.ts","webpack:///../@polygonjs/polygonjs/src/core/particles/CoreParticlesAttribute.ts","webpack:///../@polygonjs/polygonjs/src/core/particles/gpuCompute/GPUComputationRenderer.js","webpack:///../@polygonjs/polygonjs/src/core/particles/CoreParticlesGpuComputeController.ts","webpack:///../@polygonjs/polygonjs/src/core/particles/CoreParticlesInit.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/CoreReactivity.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/NodeReactivity.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/ObjectAttributeReactivity.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/ObjectAttributeReactivityCreateRef.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/ObjectHierarchyReactivity.ts","webpack:///../@polygonjs/polygonjs/src/core/reactivity/ParamReactivity.ts","webpack:///../@polygonjs/polygonjs/src/core/render/CSSRenderers/CSS2DObject.ts","webpack:///../@polygonjs/polygonjs/src/core/render/CSSRenderers/CSSObjectAttribute.ts","webpack:///../@polygonjs/polygonjs/src/core/render/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/render/MatDoubleSideTmpSetter.ts","webpack:///../@polygonjs/polygonjs/src/core/render/defaultPixelRatio.ts","webpack:///../@polygonjs/polygonjs/src/core/render/renderPixel/CoreGetDefautCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/render/renderPixel/depthRead/DepthRead.vert.glsl","webpack:///../@polygonjs/polygonjs/src/core/render/renderPixel/depthRead/DepthRead.frag.glsl","webpack:///../@polygonjs/polygonjs/src/core/render/renderPixel/DepthRead.ts","webpack:///../@polygonjs/polygonjs/src/core/render/renderPixel/RenderPixelController.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/MapboxCameraAttribute.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/layers/MapboxThreejsLayer.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/layers/Buildings.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/LayersController.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/MapboxMapsController.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/MapboxPerspectiveCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/MapboxTile.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/Transform.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/Constants.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/Utils.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/registerMapboxCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/gsap/gsapFactory.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/CoreWebXRControllerContainer.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/_BaseCoreWebXRController.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/buttons/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/markerTracking/Common.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/webXRAR/CommonAR.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/webxr/XREstimatedLight.js","webpack:///../@polygonjs/polygonjs/src/core/webXR/webXRAR/CoreWebXRAREstimatedLightController.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/webXRVR/CommonVR.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCAttributes.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCCommon.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCConstant.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCDebugTileObjects.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCRule.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCTileConfig.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCTilesCollection.ts","webpack:///../@polygonjs/polygonjs/src/core/wfc/WFCUtils.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/RenderersController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/PolyCanvasRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/PolyLibsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/BlobsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/AssetUrlsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/PerformanceController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/ScenesRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/thirdParty/MarkerTracking.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/ThirdPartyController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/PolyOnSceneUpdatedHooksController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/PolySpecializedChildrenController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/plugins/Plugin.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/plugins/PluginsRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/cameras/PolyCamerasRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/modules/_BaseRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/modules/DynamicModulesRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/expressions/_BaseRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/expressions/ExpressionRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/assemblers/AssemblersRegistry.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/NodesRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/functions/_BaseRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/functions/FunctionsRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/Poly.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/MethodDependency.ts","webpack:///../@polygonjs/polygonjs/node_modules/jsep/dist/jsep.js","webpack:///../@polygonjs/polygonjs/src/engine/expressions/traversers/ParsedTree.ts","webpack:///../@polygonjs/polygonjs/src/engine/functions/_ArrayUtils.ts","webpack:///../@polygonjs/polygonjs/src/engine/functions/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/functions/_KeyboardEventMatchesConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/sanitize.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/Node.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/Param.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/param/Numeric.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/param/NodePath.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/param/ParamPath.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/param/String.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/param/Ramp.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/nodes/Poly.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/Dispatcher.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/Node.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/param/Multiple.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/param/String.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/param/Ramp.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/nodes/Poly.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/Nodes.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/Dispatcher.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/OptimizedNodes.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/Param.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/ImportReport.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/import/Scene.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/UIData.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/states/Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/states/TimeDependent.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/states/Error.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/StatesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/hierarchy/ParentController.ts","webpack:///../@polygonjs/polygonjs/src/core/NodeSelection.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/container/utils/inputs/ClonedStatesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/container/utils/InputsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/container/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/container/sop.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/NameController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/hierarchy/ChildrenController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/LifeCycleController.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/utils/ContainableMap.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Animation.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Audio.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Event.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Geometry.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Gl.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Js.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Manager.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Material.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Object.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Texture.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/PostProcess.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/Rop.ts","webpack:///../@polygonjs/polygonjs/src/engine/containers/utils/ContainerMap.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/ContainerController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/cook/PerformanceController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/CookController.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Button.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Folder.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/types/ParamConstructorByType.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/params/ParamsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/params/ParamsValueAccessor.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/utils/ClonedStatesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/InputsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/OutputsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/ConnectionsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/SavedConnectionPointsDataController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/ConnectionMap.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/ConnectionPointsSpareParamsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/ConnectionPointsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/IOController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/params/ParamsAccessor.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/anim/Null.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/anim/Play.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/anim/PropertyName.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/anim/Subnet.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/anim/SubnetOutput.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/anim/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/audio/File.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/audio/PlayInstrument.ts","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/core/context/ToneAudioBuffers.js","webpack:///../@polygonjs/polygonjs/node_modules/tone/build/esm/instrument/Sampler.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/audio/Sampler.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/audio/Switch.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/audio/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/AudioAnalyser.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/Cube.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/CubeMap.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/GeometryAttribute.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/ImageDefault.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/Image.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/EXRLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/EXR.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/ImageEXR.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/Lut.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/MapboxElevation.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/MapboxSatellite.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/SDFExporter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/SDFFromUrl.ts","webpack:///../@polygonjs/polygonjs/src/core/Text.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/Text.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/texture/Video.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/Video.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/utils/CheckFileType.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/utils/RendererController.ts","webpack:///../@polygonjs/polygonjs/src/core/cop/Type.ts","webpack:///../@polygonjs/polygonjs/src/core/cop/Format.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/utils/TextureParamsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/utils/image/_BaseImage.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/cop/utils/lightMap/LightMapMaterial.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/event/CameraOrbitControls.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/event/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/event/_BaseCameraControls.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Attribute.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/ForLoop.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Globals.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/IfThen.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/neighbour/attract.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/NeighbourAttract.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/neighbour/attractRepulse.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/NeighbourAttractRepulse.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/neighbour/repulse.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/NeighbourRepulse.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Output.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Param.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Ramp.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/raymarching/sdfEnvMapSample.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/raymarching/sdfEnvMap.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/raymarching/sdfReflection.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/SDFMaterial.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Subnet.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/SubnetOutput.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/textureBlur.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Texture.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/Texture2DArray.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/TextureSDF.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/raymarching/sdf.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/_BaseSDF.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/assemblers/materials/OnBeforeCompile.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/assemblers/materials/common/GlobalOutput.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/globals/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/globals/Geometry.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/globals/Texture.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/globals/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/LinesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/ShadersCollectionController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/CodeBuilder.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/CodeFormatter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/ExpandShader.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/GLParamConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/LineType.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/NodeFinder.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/TextureAllocation.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/TextureAllocationsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/utils/TextureVariable.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/utils/GLDefinition.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/utils/GLDefinitionCollection.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/Attribute.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/Debug.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/GetChildrenAttributes.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/GetObjectAttribute.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/GetObjectUserData.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/Keyframes.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/OnChildAttributeUpdate.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/OnKey.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/OnObjectAttributeUpdate.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/OnObjectSwipe.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/OnObjectSwipeGPU.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/RayFromCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/SetMaterialUniform.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/Subnet.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/SubnetOutput.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/TrackFace.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/TrackHand.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/JsTypeUtils.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/_BaseObject3D.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/_BaseOnKeyEvent.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/_BaseOnObjectPointerEvent.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/_BaseUserInput.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/_BaseJsPersistedConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/_BaseJsPersistedConfigUtils.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorAssemblerCommon.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorAssemblerUtils.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/_BaseEvaluator.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorEvaluator.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorEvaluatorGenerator.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/CodeFormatter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/CodeBuilder.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/LinesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/JsLinesCollectionController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/JsParamConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/LineType.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/utils/NodeFinder.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/utils/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/utils/JsDefinition.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/utils/JsDefinitionCollection.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/Audio.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/LoadProgress.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/RootMainCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/Root.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/AutoUpdate.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/Background.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/Env.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/Fog.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/MaterialOverride.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/Code.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/AdvancedCommonController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/AdvancedFolder.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/FogController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/UniformsTransparencyController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/WireframeShaderMaterialController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/_BaseController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/mat/utils/helpers/MaterialSideHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/ChildrenDisplayControllerSpecialized.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/TesselationParams.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/Geo.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/OrthographicCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/cameras/WebXRParamOptions.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/PerspectiveCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/_BaseCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/HierarchyController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/LayersController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/ObjChildrenDisplayController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/TransformController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/cameras/PostProcessParamOptions.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/obj/utils/cameras/RenderController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/post/EffectPass.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/post/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/post/utils/EffectComposerController.ts","webpack:///../@polygonjs/polygonjs/src/modules/three/examples/jsm/postprocessing/Pass.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/fullscreen/BlendMaterial.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/rand/sobol.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/utils/SobolNumberMapGenerator.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/core/PathTracingRenderer.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/gpu/VertexAttributeTexture.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/gpu/MeshBVHUniformStruct.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/gpu/glsl/common_functions.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/gpu/glsl/bvh_struct_definitions.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/gpu/glsl/bvh_ray_functions.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/PhysicalCameraUniform.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/EquirectHdrInfoUniform.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/LightsInfoUniformStruct.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/IESProfilesTexture.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/FloatAttributeTextureArray.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/AttributesTextureArray.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/utils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/MaterialsTexture.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/uniforms/RenderTarget2DArray.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/structs/cameraStruct.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/structs/equirectStruct.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/structs/lightsStruct.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/structs/materialStruct.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/structs/fogMaterialBvh.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/bsdf/ggx.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/bsdf/sheen.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/bsdf/iridescence.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/bsdf/bsdfSampling.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/bsdf/fog.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/sampling/equirectSampling.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/sampling/lightSampling.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/sampling/shapeSampling.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/common/intersectShapes.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/common/math.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/common/fresnel.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/common/arraySamplerTexelFetch.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/rand/pcg.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/glsl/renderStructs.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/glsl/cameraUtils.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/glsl/attenuateHit.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/glsl/traceScene.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/glsl/getSurfaceRecord.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/glsl/directLightContribution.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/pathtracing/PhysicalPathTracingMaterial.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/fullscreen/DenoiseMaterial.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/rop/PathTracingRenderer.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/rop/WebGLRenderer.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/rop/_Base.ts","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/utils/GeometryPreparationUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/core/PathTracingSceneGenerator.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/utils/BlurredEnvMapGenerator.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/workers/utils/WorkerBase.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/workers/GenerateMeshBVHWorker.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/workers/PathTracingSceneWorker.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/rop/utils/pathTracing/PathTracingRendererContainer.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/attribCreate/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/attribCreate/AttribCreatePoint.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/attribCreate/AttribCreateVertex.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/attribCreate/AttribCreatePrimitive.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/attribCreate/AttribCreateObject.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/attribCreate/AttribCreateCoreGroup.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/AttribCreate.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/AttribPromote.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseExporterCAD.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/CADExporterSTEP.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/STEP.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/CADFileSTEP.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/CSS2DObject.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Cache.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/CameraViewerCode.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/CameraWebXRARMarkerTracking.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Capsule.ts","webpack:///../@polygonjs/polygonjs/src/core/code/tsUtils.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Code.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/Color.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Color.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Data.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/JSONDataLoader.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/Csv.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/DataUrl.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Decompose.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/delete/EntitySelectionHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/delete/ByAttributeHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/delete/ByExpressionHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/delete/ByBboxHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/delete/ByObjectTypeHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/delete/ByBoundingObjectHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Delete.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/DirectionalLight.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/exporters/GLTFExporter.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterGLTF.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/exporters/OBJExporter.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterOBJ.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/exporters/PLYExporter.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterPLY.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/exporters/STLExporter.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterSTL.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileDRC.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileFBX.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileGEOJSON.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileGLTF.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileJSON.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileMPD.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileOBJ.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FilePDB.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FilePLY.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileSTL.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/FileSVG.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxCamera.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/CoordinatesCollection.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/String.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/FeatureConverter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxLayer.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/plane/HexagonsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxPlane.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxTransform.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Merge.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Normals.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/code/assemblers/particles/ParticlesPersistedConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/ParticlesSystemGpu.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Point.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/PostProcessNetwork.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/RoundedBox.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/SDFLoader.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/sdf/SDFPersistedConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/SDFBuilder.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Scatter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/SpotLight.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Subnet.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/SubnetOutput.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Switch.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextJustify.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextMesh.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextShapes.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextStroke.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextShapesFromFont.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextLine.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextType.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextGeometries.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextLineHeight.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/text/TextMergeLetters.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Text.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/Transform.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/WFCDebug.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/WFCRuleConnectionFromSideName.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/WFCTileProperties.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseCAD.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseExporter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseManager.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/file/_BaseSopFile.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/group/GroupCommon.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/utils/subnet/SopSubnetChildrenDisplayController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/BasePersistedConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/DisplayNodeController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/flags/Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/flags/Bypass.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/flags/Display.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/flags/Optimize.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/FlagsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/code/configs/BaseParamConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/code/controllers/ParamConfigsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/code/controllers/TranspiledFilter.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/ParamsEditableStateController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Event.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Gl.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/params/ParamsConfig.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/shaders/NodeTraverser.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/shaders/ShaderName.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/attribCreate/AttribCreatePoint.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/attribCreate/AttribCreateVertex.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/attribCreate/AttribCreatePrimitive.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/attribCreate/AttribCreateObject.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/attribCreate/AttribCreateCoreGroup.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/AttribCreate.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/AttribPromote.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/geometries/BoxLineGeometry.js","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/BoxLines.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraCSSRenderer.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraControls.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraFPS.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraFrameMode.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraPostProcess.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraRenderScene.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraRenderer.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraViewerCode.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/buttons/CoreARButton.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/webXRAR/CoreWebXRARController.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraWebXRAR.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraWebXRARMarkerTracking.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/buttons/CoreVRButton.ts","webpack:///../@polygonjs/polygonjs/src/core/webXR/webXRVR/CoreWebXRVRController.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/CameraWebXRVR.ts","webpack:///../@polygonjs/polygonjs/src/core/player/CapsuleGeometry.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/Capsule.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/DirectionalLight.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/DRC.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileDRC.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/curves/NURBSUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/curves/NURBSCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/FBXLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/FBX.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileFBX.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/loaders/GEOJSONLoader.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/GEOJSON.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileGEOJSON.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileGLTF.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Quaternion.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Vector3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Vector2.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Box3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/core/EventDispatcher.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/constants.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/utils.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/core/BufferAttribute.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Sphere.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Matrix4.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Euler.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/core/Layers.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Matrix3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/core/Object3D.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/core/BufferGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/BoxGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/core/Curve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/EllipseCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/ArcCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/CatmullRomCurve3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/core/Interpolations.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/CubicBezierCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/CubicBezierCurve3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/LineCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/LineCurve3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/QuadraticBezierCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/QuadraticBezierCurve3.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/SplineCurve.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/curves/Curves.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/core/CurvePath.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/core/Path.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/LatheGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/CapsuleGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/CircleGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/CylinderGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/ConeGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/PolyhedronGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/DodecahedronGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/Triangle.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/EdgesGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/core/Shape.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/Earcut.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/extras/ShapeUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/ExtrudeGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/IcosahedronGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/OctahedronGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/PlaneGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/RingGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/ShapeGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/SphereGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/TetrahedronGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/TorusGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/TorusKnotGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/TubeGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/WireframeGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/geometries/Geometries.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/tmp/ObjectLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/JSON.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileJSON.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/LDrawLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/MPD.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileMPD.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileOBJ.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/PDBLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/PDB.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FilePDB.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/PLYLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/PLY.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FilePLY.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/STLLoader.js","webpack:///../@polygonjs/polygonjs/src/core/loader/geometry/STL.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileSTL.ts","webpack:///../@polygonjs/polygonjs/src/core/loader/SVG.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/FileSVG.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/MapboxCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/Merge.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/OrthographicCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/ParticlesSystemGpuAttributes.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/ParticlesSystemGpuMaterial.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/PerspectiveCamera.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/RoundedBox.ts","webpack:///../@polygonjs/polygonjs/src/modules/core/math/MeshSurfaceSampler.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/Scatter.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/SpotLight.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/Transform.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/TransformReset.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/File/_BaseFileOperation.ts","webpack:///../@polygonjs/polygonjs/src/engine/operations/sop/utils/attribCreate/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Boolean.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Color.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Float.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Integer.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/NodePath.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/ParamPath.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Ramp.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/String.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Vector2.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Vector3.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/Vector4.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/EmitController.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/states/TimeDependent.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/states/Error.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/StatesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/_BasePath.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/_BaseString.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/_Multiple.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/_Numeric.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/ramp/RampValue.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/LiteralConstructsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/traversers/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/AttributeRequirementsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/traversers/FunctionGenerator.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/traversers/ExpressionStringGenerator.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/DependenciesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/expressions/ExpressionManager.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/ExpressionController.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/OptionsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/Assert.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/InputCloneMode.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/NodeContext.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/NodeEvent.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/ParamEvent.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/ParamType.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/PolyOnObjectsAddRemoveHooksController.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/SceneEvent.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/assemblers/_BaseRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/modules/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Anim.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Audio.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cop.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Event.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Gl.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Js.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Light.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Obj.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Post.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Rop.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/thirdParty/Mapbox.ts","webpack:///../@polygonjs/polygonjs/src/engine/poly/utils/PolyEventName.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/ManualTriggersController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/ActorsKeyboardEventsController.ts","webpack:///../@polygonjs/polygonjs/src/core/geometry/util/HierarchyTraverse.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsHoverController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsPointerdownController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsPointerupController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsMouseClickController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsContextmenuController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/_BaseUserInputController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/PointerdownController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/PointerupController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/ActorsManager.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/SceneCamerasController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/Cooker.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/CookController.ts","webpack:///../@polygonjs/polygonjs/src/core/graph/CoreGraph.ts","webpack:///../@polygonjs/polygonjs/src/core/performance/PerformanceNode.ts","webpack:///../@polygonjs/polygonjs/src/core/performance/CorePerformance.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/DispatchController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/SceneExpressionsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/LifeCycleController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/LoadingController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/missingReferences/MissingReference.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/missingReferences/MissingReferencesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/GraphNodesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/NodesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/_BaseEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/DragEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/KeyboardEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/MouseEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/PointerEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/WindowEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/TouchEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/ConnectionTriggerDispatcher.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/EventsDispatcher.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/ScenePerformanceMonitor.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/ReferencesController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/UniformsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/ViewersRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/WebGLController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/WindowController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/AssetsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/raymarching/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/raymarching/SpotLight.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/raymarching/DirectionalLight.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/raymarching/PointLight.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/SceneTraverser.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/SceneRenderersRegister.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/WebXREventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/PolyScene.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/ObjectsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/TimeController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsClickController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsDoubleClickController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsLongPressController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsSwipeController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/_BaseRayObjectIntersectionsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/scene/utils/events/SceneEventsController.ts","webpack:///../@polygonjs/polygonjs/src/core/thirdParty/Mapbox/MapboxRaycaster.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/Mapbox.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/PathTracingViewer.ts","webpack:///../@polygonjs/polygonjs/src/core/camera/webXR/CoreCameraWebXR.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/Threejs.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerCamerasController.ts","webpack:///../@polygonjs/polygonjs/src/core/event/CanvasKeyFocus.ts","webpack:///../@polygonjs/polygonjs/src/core/event/EventEmitter.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerEventsController.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerWebglController.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerAudioController.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerRaycastersController.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerPerformanceMonitor.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/_Base.ts","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/ViewerControlsController.ts","webpack:///../src/config/AppConfig.ts","webpack:///../src/App.vue","webpack:///../src/App.vue?8bfc","webpack:///../src/App.vue?c820","webpack:///../node_modules/@fortawesome/fontawesome-svg-core/index.es.js","webpack:///../node_modules/@fortawesome/vue-fontawesome/index.es.js","webpack:///../node_modules/@fortawesome/free-solid-svg-icons/index.es.js","webpack:///../src/editor/components/widgets/icons/fontawesome/fontawesomeInstall.ts","webpack:///../src/config/AppLoader.ts","webpack:///../src/engine/io/json/import/params/post.ts","webpack:///../src/engine/io/json/import/params/gl.ts","webpack:///../src/engine/io/json/import/data/_Base.ts","webpack:///../src/engine/io/json/import/data/SceneDataMigrator_1_4_8.ts","webpack:///../src/engine/io/json/import/data/SceneDataMigrator_1_5_0.ts","webpack:///../src/engine/io/json/import/data/SceneDataMigrator_1_5_23.ts","webpack:///../src/engine/io/json/import/nodes/actor/SetMaterialUniform.ts","webpack:///../src/engine/io/json/import/nodes/actor.ts","webpack:///../src/engine/io/json/import/nodes/cop/Image.ts","webpack:///../src/engine/io/json/import/nodes/cop/Video.ts","webpack:///../src/engine/io/json/import/nodes/cop.ts","webpack:///../src/engine/io/json/import/nodes/gl.ts","webpack:///../src/engine/io/json/import/nodes/sop/CSGNetwork.ts","webpack:///../src/engine/io/json/import/nodes/sop/SpotLight.ts","webpack:///../src/engine/io/json/import/nodes/sop/PointLight.ts","webpack:///../src/engine/io/json/import/nodes/sop.ts","webpack:///../src/engine/io/json/import/nodes/obj/SpotLight.ts","webpack:///../src/engine/io/json/import/nodes/obj/PointLight.ts","webpack:///../src/engine/io/json/import/nodes/obj.ts","webpack:///../src/engine/io/json/import/nodes/post.ts","webpack:///../src/engine/io/json/import/MigrateHelper.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer.ts","webpack:///../@polygonjs/polygonjs/src/engine/params/utils/CoreParamSerializer.ts","webpack:///../src/config/AppSceneLoader.ts","webpack:///../src/docs/api/Common.ts","webpack:///../src/docs/pages/Pages.ts","webpack:///../src/editor/api/panel/Custom.ts","webpack:///../src/editor/api/panel/Panel.ts","webpack:///../src/editor/api/html/Head.ts","webpack:///../src/editor/api/html/Body.ts","webpack:///../src/editor/api/html/Viewer.ts","webpack:///../src/editor/api/html/HTML.ts","webpack:///../src/editor/api/export/Export.ts","webpack:///../src/editor/api/multiplayer/Remote.ts","webpack:///../src/editor/api/multiplayer/MultiPlayer.ts","webpack:///../src/editor/api/EditorApi.ts","webpack:///../src/editor/helpers/ViewerComponentsRegister.ts","webpack:///../src/editor/Editor.ts","webpack:///../src/editor/components/editor/top/Layout.ts","webpack:///../src/editor/components/editor/top/LayoutSwitchController.ts","webpack:///../src/editor/components/mixins/SelectedNode.ts","webpack:///../src/editor/components/panels/common/LinkIndex.ts","webpack:///../src/editor/components/panels/multiple/mixins/LayoutData.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Commentable.ts","webpack:///../node_modules/fuse.js/dist/fuse.esm.js","webpack:///../src/editor/components/panels/network/components/tabMenu/Common.ts","webpack:///../src/editor/components/panels/params/components/fields/mixins/FieldCommon.ts","webpack:///../src/editor/components/panels/params/components/mixins/Utils.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/_Base.ts","webpack:///../@polygonjs/polygonjs/src/modules/three/examples/jsm/controls/TransformControls.js","webpack:///../src/editor/components/panels/viewer/mixins/controls/_BaseTransform.ts","webpack:///../src/editor/core/AssetsHelper.ts","webpack:///../src/editor/core/AutoLayout.ts","webpack:///../src/editor/core/CaptureType.ts","webpack:///../src/editor/core/ColorUtils.ts","webpack:///../src/editor/core/Csrf.ts","webpack:///../src/editor/core/DateUtils.ts","webpack:///../src/editor/core/Dom.ts","webpack:///../src/editor/core/FeaturesController.ts","webpack:///../src/editor/core/FileUtils.ts","webpack:///../src/editor/core/Keyboard.ts","webpack:///../src/editor/core/LoaderController.ts","webpack:///../src/editor/core/NodeChangeType.ts","webpack:///../src/editor/core/NodeNameEdit.ts","webpack:///../src/editor/core/SafeNodeRemover.ts","webpack:///../src/editor/core/SceneSaveController.ts","webpack:///../src/editor/core/Selection.ts","webpack:///../src/editor/core/Tailwind.ts","webpack:///../src/editor/core/UserAgent.ts","webpack:///../src/editor/core/WindowController.ts","webpack:///../src/editor/core/_BasePolyNodeSaveController.ts","webpack:///../../../../node_modules/fflate/esm/browser.js","webpack:///../src/editor/core/capture/CanvasToWebmCommon.ts","webpack:///../src/editor/core/clipboard/CoreClipboard.ts","webpack:///../src/editor/core/clipboard/NetworkClipboardHelper.ts","webpack:///../src/editor/core/clipboard/NetworkClipboardHelperRegister.ts","webpack:///../node_modules/@sentry/core/esm/flags.js","webpack:///../node_modules/@sentry/core/esm/sdk.js","webpack:///../node_modules/@sentry/core/node_modules/tslib/tslib.es6.js","webpack:///../node_modules/@sentry/core/esm/integrations/inboundfilters.js","webpack:///../node_modules/@sentry/core/esm/integrations/functiontostring.js","webpack:///../node_modules/@sentry/browser/node_modules/tslib/tslib.es6.js","webpack:///../node_modules/@sentry/core/esm/version.js","webpack:///../node_modules/@sentry/utils/esm/polyfill.js","webpack:///../node_modules/@sentry/utils/esm/error.js","webpack:///../node_modules/@sentry/utils/esm/dsn.js","webpack:///../node_modules/@sentry/utils/esm/memo.js","webpack:///../node_modules/@sentry/utils/esm/normalize.js","webpack:///../node_modules/@sentry/core/esm/integration.js","webpack:///../node_modules/@sentry/core/esm/baseclient.js","webpack:///../node_modules/@sentry/core/esm/api.js","webpack:///../node_modules/@sentry/utils/esm/envelope.js","webpack:///../node_modules/@sentry/core/esm/request.js","webpack:///../node_modules/@sentry/core/esm/transports/noop.js","webpack:///../node_modules/@sentry/core/esm/basebackend.js","webpack:///../node_modules/@sentry/types/esm/severity.js","webpack:///../node_modules/@sentry/browser/esm/stack-parsers.js","webpack:///../node_modules/@sentry/browser/esm/eventbuilder.js","webpack:///../node_modules/@sentry/utils/esm/promisebuffer.js","webpack:///../node_modules/@sentry/utils/esm/ratelimit.js","webpack:///../node_modules/@sentry/utils/esm/status.js","webpack:///../node_modules/@sentry/core/esm/transports/base.js","webpack:///../node_modules/@sentry/utils/esm/async.js","webpack:///../node_modules/@sentry/browser/esm/flags.js","webpack:///../node_modules/@sentry/browser/esm/transports/utils.js","webpack:///../node_modules/@sentry/browser/esm/transports/new-fetch.js","webpack:///../node_modules/@sentry/utils/esm/clientreport.js","webpack:///../node_modules/@sentry/browser/esm/transports/base.js","webpack:///../node_modules/@sentry/browser/esm/transports/fetch.js","webpack:///../node_modules/@sentry/browser/esm/transports/new-xhr.js","webpack:///../node_modules/@sentry/browser/esm/transports/xhr.js","webpack:///../node_modules/@sentry/browser/esm/backend.js","webpack:///../node_modules/@sentry/minimal/node_modules/tslib/tslib.es6.js","webpack:///../node_modules/@sentry/minimal/esm/index.js","webpack:///../node_modules/@sentry/browser/esm/helpers.js","webpack:///../node_modules/@sentry/utils/esm/enums.js","webpack:///../node_modules/@sentry/utils/esm/severity.js","webpack:///../node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","webpack:///../node_modules/@sentry/browser/esm/client.js","webpack:///../node_modules/@sentry/browser/esm/integrations/trycatch.js","webpack:///../node_modules/@sentry/browser/esm/integrations/globalhandlers.js","webpack:///../node_modules/@sentry/browser/esm/integrations/linkederrors.js","webpack:///../node_modules/@sentry/browser/esm/integrations/dedupe.js","webpack:///../node_modules/@sentry/browser/esm/integrations/useragent.js","webpack:///../node_modules/@sentry/browser/esm/sdk.js","webpack:///../node_modules/@sentry/utils/esm/tracing.js","webpack:///../node_modules/@sentry/tracing/esm/browser/backgroundtab.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/bindReporter.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/generateUniqueID.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/initMetric.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/observe.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/onHidden.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/getCLS.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/getVisibilityWatcher.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/getFID.js","webpack:///../node_modules/@sentry/tracing/esm/browser/web-vitals/getLCP.js","webpack:///../node_modules/@sentry/tracing/esm/browser/metrics.js","webpack:///../node_modules/@sentry/tracing/esm/browser/request.js","webpack:///../node_modules/@sentry/tracing/esm/browser/router.js","webpack:///../node_modules/@sentry/tracing/esm/browser/browsertracing.js","webpack:///../node_modules/@sentry/tracing/esm/index.js","webpack:///../src/editor/core/error/ErrorsNotifier.ts","webpack:///../src/editor/core/network/Constants.ts","webpack:///../src/editor/core/render/PBRUtils.ts","webpack:///../src/editor/core/scene_traversers/Common.ts","webpack:///../src/editor/core/scene_traversers/LocalAssets.ts","webpack:///../src/editor/core/scene_traversers/UsedNodes.ts","webpack:///../src/editor/core/scene_traversers/UsedAssemblers.ts","webpack:///../src/editor/core/scene_traversers/UsedIntegrations.ts","webpack:///../src/editor/core/scene_traversers/NodesMap.ts","webpack:///../src/editor/core/scene_traversers/PolyNodes.ts","webpack:///../src/editor/core/scene_traversers/PropTypes.ts","webpack:///../src/editor/core/scene_traversers/RequiredModules.ts","webpack:///../src/editor/core/scene_traversers/Meta.ts","webpack:///../src/editor/core/scene_traversers/QuickExportable.ts","webpack:///../src/editor/core/scene_traversers/_Base.ts","webpack:///../src/editor/helpers/Clipboard.ts","webpack:///../src/editor/helpers/KeyEventsDispatcher.ts","webpack:///../src/editor/history/commands/Multiple.ts","webpack:///../src/editor/history/commands/NodeClipboardPaste.ts","webpack:///../src/editor/history/commands/NodeConnect.ts","webpack:///../src/editor/history/commands/NodeCreate.ts","webpack:///../src/editor/history/commands/NodeDelete.ts","webpack:///../src/editor/history/commands/NodeMove.ts","webpack:///../src/editor/history/commands/NodePolyNodeLock.ts","webpack:///../src/editor/history/commands/NodePolyNodeUnlock.ts","webpack:///../src/editor/history/commands/NodeSelect.ts","webpack:///../src/editor/history/commands/NodeSetComment.ts","webpack:///../src/editor/history/commands/NodeSetName.ts","webpack:///../src/editor/history/commands/NodeSetOverrideClonableState.ts","webpack:///../src/editor/history/commands/NodesSubnetCollapse.ts","webpack:///../src/editor/history/commands/NodesSubnetExtract.ts","webpack:///../src/editor/history/commands/ParamSet.ts","webpack:///../src/editor/history/commands/SetFlagBypass.ts","webpack:///../src/editor/history/commands/SetFlagDisplay.ts","webpack:///../src/editor/history/commands/SetFlagOptimize.ts","webpack:///../src/editor/history/commands/_Base.ts","webpack:///../src/editor/history/commands/utils/CommandFactory.ts","webpack:///../src/editor/history/commands/utils/CommandType.ts","webpack:///../src/editor/history/commands/utils/NodesStateController.ts","webpack:///../src/editor/self_contained/FilesRegister.ts","webpack:///../src/editor/store/controllers/editor/EditorClipboardStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorContextMenuStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogAboutStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogWarningsStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogConfirmStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogPromptStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogNoticeStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogApiLoginStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorDialogWebGLCapabilitiesStoreController.ts","webpack:///../src/editor/store/controllers/editor/MarketplacePolyNodes.ts","webpack:///../src/editor/store/controllers/editor/EditorCommandPalette.ts","webpack:///../src/editor/store/controllers/editor/EditorUserPlan.ts","webpack:///../src/editor/store/controllers/editor/EditorNetworkStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorNumericSliderStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorPanelStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorPanelNodeSelectorController.ts","webpack:///../src/editor/store/controllers/editor/EditorPanelFileSelectorController.ts","webpack:///../src/editor/store/controllers/editor/EditorPanelObjectMaskController.ts","webpack:///../src/editor/store/controllers/editor/EditorPanelSpareParamsEditorController.ts","webpack:///../src/editor/store/controllers/editor/EditorWindowsLibrariesManagerController.ts","webpack:///../src/editor/store/controllers/editor/EditorUploadsStoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorCurrentUserController.ts","webpack:///../src/editor/store/controllers/editor/EditorPolyNodeCreateFormController.ts","webpack:///../src/editor/store/controllers/editor/EditorPolyNodeUpdateFormController.ts","webpack:///../src/editor/store/controllers/editor/ShareController.ts","webpack:///../src/editor/store/controllers/editor/TabMenuController.ts","webpack:///../src/editor/store/controllers/editor/SceneReadonly.ts","webpack:///../src/editor/store/controllers/editor/DocsController.ts","webpack:///../src/editor/store/controllers/editor/DebugJsNode.ts","webpack:///../src/editor/store/controllers/editor/EditorNodeInfoStoreController.ts","webpack:///../src/editor/store/controllers/editor/SplitPanels.ts","webpack:///../src/editor/store/controllers/editor/CaptureForm.ts","webpack:///../src/editor/store/controllers/editor/CaptureResult.ts","webpack:///../src/editor/store/controllers/editor/ExportFormWeb.ts","webpack:///../src/editor/store/controllers/editor/ExportFormLocal.ts","webpack:///../src/editor/store/controllers/editor/ExportPanel.ts","webpack:///../src/editor/store/controllers/editor/EditorPanelAssetsList.ts","webpack:///../src/editor/store/controllers/editor/Preferences.ts","webpack:///../src/editor/store/controllers/editor/SaveWarnings.ts","webpack:///../src/editor/store/controllers/editor/NavigationHistoryController.ts","webpack:///../src/editor/store/controllers/editor/NavigationNodeListController.ts","webpack:///../src/editor/store/controllers/EditorStoreController.ts","webpack:///../src/editor/store/controllers/EngineStoreController.ts","webpack:///../src/editor/core/actor/ActorEvaluatorWrapper.ts","webpack:///../src/editor/store/controllers/StoreController.ts","webpack:///../src/editor/store/controllers/editor/EditorParamsModalsController.ts","webpack:///../src/editor/store/controllers/editor/EditorStatusStoreController.ts","webpack:///../src/editor/store/controllers/editor/KeyframeEditor.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerSessionsStoreController.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerAwarenessStoreController.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerFollowStoreController.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerCommandsStoreController.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerSceneDataStoreController.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerUserRequestsController.ts","webpack:///../src/editor/store/controllers/editor/multiPlayer/MultiPlayerUsersStoreController.ts","webpack:///../src/editor/store/controllers/editor/MultiPlayerController.ts","webpack:///../src/editor/store/controllers/editor/NodeInfoController.ts","webpack:///../src/editor/types.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/json/export/Scene.ts","webpack:///../src/editor/versions.ts","webpack:///../src/engine/examples/Common.ts","webpack:///../src/engine/examples/ExamplesRegisterAsync.ts","webpack:///../src/engine/io/code/export/Scene.ts","webpack:///../src/engine/io/code/export/ReservedWords.ts","webpack:///../src/engine/io/code/export/Node.ts","webpack:///../src/engine/io/code/export/node/Poly.ts","webpack:///../src/engine/io/code/export/param/Numeric.ts","webpack:///../src/engine/io/code/export/param/Multiple.ts","webpack:///../src/engine/io/code/export/param/NodePath.ts","webpack:///../src/engine/io/code/export/param/ParamPath.ts","webpack:///../src/engine/io/code/export/param/String.ts","webpack:///../src/engine/io/code/export/param/Ramp.ts","webpack:///../src/engine/io/code/export/param/Button.ts","webpack:///../src/engine/io/code/export/node/gl/Subnet.ts","webpack:///../src/engine/io/code/export/Dispatcher.ts","webpack:///../src/engine/io/code/export/Nodes.ts","webpack:///../src/engine/io/code/export/Param.ts","webpack:///../src/npm_module/WasmExporterLoader.ts","webpack:///../src/npm_module/BinaryController.ts","webpack:///../src/npm_module/NpmAuthController.ts","webpack:///../src/npm_module/controllers/ConfigController.ts","webpack:///../node_modules/http-status-codes/build/es/status-codes.js","webpack:///../src/npm_module/controllers/SingleUserSessionsController.ts","webpack:///../src/npm_module/controllers/SceneNamesController.ts","webpack:///../src/npm_module/controllers/AssetsController.ts","webpack:///../src/npm_module/StatusPing.ts","webpack:///../src/npm_module/controllers/ScenesController.ts","webpack:///../src/npm_module/controllers/SharesController.ts","webpack:///../src/npm_module/controllers/CapturesController.ts","webpack:///../src/npm_module/controllers/StatusController.ts","webpack:///../src/npm_module/controllers/NodeFilesController.ts","webpack:///../src/npm_module/controllers/PolyNodesController.ts","webpack:///../src/npm_module/controllers/multiPlayer/SceneDataController.ts","webpack:///../src/npm_module/controllers/multiPlayer/CommandsController.ts","webpack:///../src/npm_module/controllers/multiPlayer/AwarenessController.ts","webpack:///../src/npm_module/controllers/multiPlayer/MultiPlayerSessionsController.ts","webpack:///../src/npm_module/controllers/multiPlayer/UserRequestsController.ts","webpack:///../src/npm_module/controllers/multiPlayer/UsersController.ts","webpack:///../src/npm_module/controllers/LibrariesController.ts","webpack:///../src/npm_module/NpmModuleApiController.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/common/EventsDispatcher.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/common/Progress.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/self_contained/Common.ts","webpack:///../@polygonjs/polygonjs/src/engine/io/manifest/import/SceneData.ts","webpack:///../src/npm_module/NpmModuleSceneLoadController.ts","webpack:///../src/npm_module/NpmModuleTypes.ts","webpack:///../src/npm_module/controllers/Common.ts","webpack:///../src/plugins/figma/FigmaPluginConstants.ts","webpack:///../src/plugins/figma/FigmaPluginTypes.ts","webpack:///../src/plugins/figma/FigmaPluginController.ts","webpack:///../src/routes.ts","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/quaternion.glsl","webpack:///../@polygonjs/polygonjs/src/engine/nodes/gl/gl/raymarching/sdfCommon.glsl","webpack:///../node_modules/vue-loader/dist/exportHelper.js","webpack:///../src/editor/components/panels/common/NavigationWithLinkedIndex.vue","webpack:///../src/editor/components/panels/common/NavigationWithLinkedIndex.vue?0e70","webpack:///../src/editor/components/panels/common/Navigation.vue","webpack:///../src/editor/components/panels/common/Navigation.vue?fa0f","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue?dd66","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue?c1e8","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue?1350","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue?1005","webpack:///../src/editor/components/panels/common/Navigation.vue?6ccd","webpack:///../src/editor/components/panels/common/Navigation.vue?d031","webpack:///../src/editor/components/panels/common/Navigation.vue?4239","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue?53a9","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue?512d","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue?d146","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue?3df0","webpack:///../src/editor/components/panels/common/NavigationWithLinkedIndex.vue?6d46","webpack:///../src/editor/components/panels/common/NavigationWithLinkedIndex.vue?ea6c","webpack:///../src/editor/components/panels/multiple/Multiple.vue","webpack:///../src/editor/components/panels/multiple/Multiple.vue?f3e8","webpack:///../src/editor/components/panels/multiple/mixins/Panels.ts","webpack:///../src/editor/core/EventHelper.ts","webpack:///../src/editor/components/panels/multiple/mixins/Split.ts","webpack:///../src/editor/components/panels/network/Network.vue","webpack:///../src/editor/components/panels/network/Network.vue?2013","webpack:///../src/editor/components/panels/network/mixins/LayoutData.ts","webpack:///../src/editor/components/panels/network/mixins/NodeNavigation.ts","webpack:///../src/editor/components/panels/network/NetworkCore.vue","webpack:///../src/editor/components/panels/network/NetworkCore.vue?40b8","webpack:///../src/editor/components/panels/network/mixins/Camera.ts","webpack:///../src/editor/components/panels/network/helpers/NodeConnectionsHelper.ts","webpack:///../@polygonjs/polygonjs/src/core/DictUtils.ts","webpack:///../src/editor/components/panels/viewer/mixins/Common.ts","webpack:///../src/editor/components/panels/network/mixins/EventKey.ts","webpack:///../src/editor/components/panels/network/mixins/EventMouse.ts","webpack:///../src/editor/components/panels/network/mixins/MultiPlayer.ts","webpack:///../src/editor/components/panels/network/mixins/NodeAnimation.ts","webpack:///../src/editor/components/panels/network/mixins/NodeConnection.ts","webpack:///../src/editor/components/panels/network/mixins/NodeCreation.ts","webpack:///../src/editor/components/panels/network/mixins/NodeEvent.ts","webpack:///../src/editor/components/panels/network/mixins/NodeVisibleState.ts","webpack:///../src/editor/components/panels/network/mixins/NodeSelection.ts","webpack:///../src/editor/components/panels/network/mixins/ParentNodeErrored.ts","webpack:///../src/editor/components/panels/network/mixins/PolyNodeLockedState.ts","webpack:///../src/editor/components/panels/network/mixins/TabMenuOwner.ts","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue?569d","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue?ade8","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue?6df5","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue?eca0","webpack:///../src/editor/components/panels/network/components/Node.vue","webpack:///../src/editor/components/panels/network/components/Node.vue?7fd1","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Capture.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/ChildrenOwner.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/NetworkInfo.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/ContextMenu.ts","webpack:///../src/editor/components/panels/network/helpers/NodeSize.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/FlagBypass.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/FlagDisplay.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/FlagDisplaySop.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/FlagOptimize.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Errored.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/NodeEventMouse.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Extras.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Icon.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Infos.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNamesAnim.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNamesAudio.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNamesCop.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNamesObj.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNamesPost.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNamesSop.ts","webpack:///../src/editor/core/hooks/inputNames/NodeInputNames.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Inputs.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Named.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Outputs.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/ParamsLabel.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/PolyNode.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Position.ts","webpack:///../src/editor/components/panels/network/components/nodes/mixins/Selection.ts","webpack:///../src/editor/components/panels/network/components/Connection.vue","webpack:///../src/editor/components/panels/network/components/Connection.vue?5280","webpack:///../src/editor/components/panels/network/components/connections/ConnectionUtils.ts","webpack:///../src/editor/components/panels/network/components/Connection.vue?142f","webpack:///../src/editor/components/panels/network/components/Connection.vue?d65e","webpack:///../src/editor/components/panels/network/components/Connection.vue?481b","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue?c1ee","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue?5e8b","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue?bbda","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue?2f71","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue?9c33","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Audio.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Audio.vue?6962","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Audio.vue?963c","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Audio.vue?09b0","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue?e9a3","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/cop/RendererController.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/cop/MaterialController.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/cop/MeshController.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/cop/CameraController.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/cop/SceneController.ts","webpack:///../src/editor/core/CanvasToDownload.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue?93de","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue?e0f5","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue?8da2","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue?0ba5","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ShaderHelper.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue?3dc8","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue?5c14","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue?90a5","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue?bdfb","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue?077b","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue?37ab","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue?5cd2","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Obj.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Obj.vue?f2fa","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Obj.vue?a4b6","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Obj.vue?5b3b","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue?9305","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue?09fd","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue?8ad1","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue?1631","webpack:///../@polygonjs/polygonjs/src/engine/containers/utils/GeometryContainerUtils.ts","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue?93fc","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue?0b60","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue?bc38","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue?34f5","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue?b798","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue?a6b2","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue?2c52","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue?a40f","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue?359f","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue?4196","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue?4150","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue?55e2","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue?569a","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue?b2af","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue?b3b1","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue?cdf3","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue?dc7e","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue?8798","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue?5c48","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue?3046","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue?165a","webpack:///../src/editor/components/panels/network/components/NodeComment.vue","webpack:///../src/editor/components/panels/network/components/common/MarkdownHelper.ts","webpack:///../src/editor/components/panels/network/components/NodeComment.vue?f275","webpack:///../src/editor/components/panels/network/components/NodeComment.vue?4b55","webpack:///../src/editor/components/panels/network/components/NodeComment.vue?5aa4","webpack:///../src/editor/components/panels/network/components/NodeError.vue","webpack:///../src/editor/components/panels/network/components/NodeError.vue?435e","webpack:///../src/editor/components/panels/network/components/NodeError.vue?30fb","webpack:///../src/editor/components/panels/network/components/NodeError.vue?e443","webpack:///../src/editor/components/panels/network/components/NodeError.vue?9efa","webpack:///../src/editor/components/panels/network/components/nodes/extras/NodeExtras.vue","webpack:///../src/editor/components/panels/network/components/nodes/extras/NodeExtras.vue?6a6d","webpack:///../src/editor/components/panels/network/components/nodes/extras/NodeExtras.vue?0185","webpack:///../src/editor/components/panels/network/components/nodes/extras/NodeExtras.vue?6a9a","webpack:///../src/editor/components/panels/network/components/Node.vue?477e","webpack:///../src/editor/components/panels/network/components/Node.vue?0e31","webpack:///../src/editor/components/panels/network/components/Node.vue?b3fa","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionMultiple.vue","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionMultiple.vue?6076","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue?29fa","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue?2fbe","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue?e1ea","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue?efe8","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue?8ac3","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue?ca0b","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue?9cc4","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue?91c3","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionMultiple.vue?bd50","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionMultiple.vue?9e0c","webpack:///../src/editor/components/panels/network/components/NodesList.vue","webpack:///../src/editor/components/panels/network/components/NodesList.vue?33f5","webpack:///../src/editor/components/panels/network/components/NodeListItem.vue","webpack:///../src/editor/components/panels/network/components/NodeListItem.vue?bad5","webpack:///../src/editor/core/EditorCoreType.ts","webpack:///../src/editor/components/panels/network/helpers/NodeSelection.ts","webpack:///../src/editor/components/panels/network/components/NodeListItem.vue?e3d5","webpack:///../src/editor/components/panels/network/components/NodeListItem.vue?3501","webpack:///../src/editor/components/panels/network/components/NodesList.vue?0f9c","webpack:///../src/editor/components/panels/network/components/NodesList.vue?4e40","webpack:///../src/editor/components/panels/network/components/NetworkHints.vue","webpack:///../src/editor/components/panels/network/components/NetworkHints.vue?1752","webpack:///../src/editor/components/panels/network/components/NetworkHints.vue?61fe","webpack:///../src/editor/components/panels/network/components/NetworkHints.vue?7d17","webpack:///../src/editor/components/panels/network/components/MiniMap.vue","webpack:///../src/editor/components/panels/network/components/MiniMap.vue?8d08","webpack:///../src/editor/components/panels/network/components/MiniMap.vue?4f1d","webpack:///../src/editor/components/panels/network/components/MultiPlayerCursors.vue","webpack:///../src/editor/components/panels/network/components/MultiPlayerCursors.vue?7952","webpack:///../src/editor/components/panels/network/components/MultiPlayerCursors.vue?e3a7","webpack:///../src/editor/components/panels/network/components/MultiPlayerCursors.vue?66aa","webpack:///../src/editor/components/panels/network/helpers/NodeCreation.ts","webpack:///../src/editor/core/TouchEventHelper.ts","webpack:///../src/editor/components/panels/network/helpers/CameraAnimation.ts","webpack:///../src/editor/components/panels/network/helpers/NodeAnimation.ts","webpack:///../src/editor/components/panels/network/helpers/Connection.ts","webpack:///../src/editor/components/panels/network/NetworkCore.vue?c07d","webpack:///../src/editor/components/panels/network/NetworkCore.vue?7ffb","webpack:///../src/editor/components/panels/network/NetworkCore.vue?a18b","webpack:///../src/editor/components/panels/network/Network.vue?0830","webpack:///../src/editor/components/panels/network/Network.vue?ac82","webpack:///../src/editor/components/panels/viewer/Viewer.vue","webpack:///../src/editor/components/panels/viewer/Viewer.vue?1c73","webpack:///../src/editor/core/capture/_BaseCanvasToWebm.ts","webpack:///../src/editor/core/capture/CanvasToWebm.ts","webpack:///../src/editor/core/capture/CanvasToWebmPBR.ts","webpack:///../src/editor/components/panels/viewer/mixins/Capture.ts","webpack:///../src/editor/components/panels/viewer/mixins/CameraMenu.ts","webpack:///../src/editor/components/panels/viewer/mixins/ViewerActive.ts","webpack:///../src/editor/components/panels/viewer/mixins/LayoutData.ts","webpack:///../src/editor/components/panels/viewer/mixins/SubnetDisplayFlag.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/Obj.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/PositionRotationSop.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/Centerable.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/Centerable2DXY.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/Centerable2DXZ.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/TransformGlJs.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/TransformSop.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/TransformCad.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/Transform2DCad.ts","webpack:///../src/editor/components/panels/viewer/mixins/controls/Transform2DCsg.ts","webpack:///../src/editor/components/panels/viewer/mixins/Controls.ts","webpack:///../src/editor/components/panels/viewer/mixins/ViewerResolution.ts","webpack:///../src/editor/components/panels/viewer/mixins/Register.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/libs/stats.module.js","webpack:///../@polygonjs/polygonjs/src/engine/viewers/utils/Stats.ts","webpack:///../src/editor/components/panels/viewer/mixins/Stats.ts","webpack:///../src/editor/components/panels/viewer/mixins/ViewerHints.ts","webpack:///../src/editor/components/panels/viewer/mixins/CameraFrame.ts","webpack:///../src/editor/components/panels/viewer/mixins/EventKey.ts","webpack:///../src/editor/components/panels/viewer/mixins/EventMouse.ts","webpack:///../src/editor/components/panels/viewer/mixins/NetworkOverlay.ts","webpack:///../src/editor/components/panels/viewer/helpers/ViewersRegister.ts","webpack:///../src/editor/components/panels/viewer/components/ViewerHints.vue","webpack:///../src/editor/components/panels/viewer/components/ViewerHints.vue?3804","webpack:///../src/editor/components/panels/viewer/components/ViewerHints.vue?d157","webpack:///../src/editor/components/panels/viewer/components/ViewerHints.vue?b4bf","webpack:///../src/editor/components/panels/viewer/Viewer.vue?ba66","webpack:///../src/editor/components/panels/viewer/Viewer.vue?897e","webpack:///../src/editor/components/panels/viewer/Viewer.vue?01b4","webpack:///../src/editor/components/panels/custom/Custom.vue","webpack:///../src/editor/components/panels/custom/Custom.vue?9cc5","webpack:///../src/editor/components/panels/custom/mixins/LayoutData.ts","webpack:///../src/editor/components/panels/custom/Custom.vue?250e","webpack:///../src/editor/components/panels/custom/Custom.vue?f0d1","webpack:///../src/editor/components/panels/custom/Custom.vue?51b4","webpack:///../src/editor/components/panels/multiple/Multiple.vue?7c43","webpack:///../src/editor/components/panels/multiple/Multiple.vue?b0ab","webpack:///../src/editor/components/panels/multiple/Multiple.vue?811e","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue?70dd","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue?0983","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue?8dbe","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue?3c29","webpack:///../src/editor/components/panels/params/Params.vue","webpack:///../src/editor/components/panels/params/Params.vue?dc4f","webpack:///../src/editor/components/panels/params/mixins/Folders.ts","webpack:///../src/editor/components/panels/params/mixins/LayoutData.ts","webpack:///../@polygonjs/polygonjs/examples/presets/anim/PropertyName.ts","webpack:///../@polygonjs/polygonjs/examples/presets/audio/File.ts","webpack:///../@polygonjs/polygonjs/examples/presets/audio/Sampler.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/AudioAnalyser.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/CubeMap.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/GeometryAttribute.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/image/matcap.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/Image.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/Lut.ts","webpack:///../@polygonjs/polygonjs/examples/presets/common/mapbox/MapboxCopCommon.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/MapboxElevation.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/MapboxSatellite.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/SDFFromUrl.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/Text.ts","webpack:///../@polygonjs/polygonjs/examples/presets/cop/Video.ts","webpack:///../@polygonjs/polygonjs/examples/presets/event/CameraOrbitControls.ts","webpack:///../@polygonjs/polygonjs/examples/presets/gl/Attribute.ts","webpack:///../@polygonjs/polygonjs/examples/presets/gl/NeighbourAttractRepulse.ts","webpack:///../@polygonjs/polygonjs/examples/presets/gl/Neighbour.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/Attribute.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/GetChildrenAttributes.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/GetObjectAttribute.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/GetObjectUserData.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/OnChildAttributeUpdate.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/OnKey.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/OnObjectAttributeUpdate.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/OnObjectSwipe.ts","webpack:///../@polygonjs/polygonjs/examples/presets/js/RayFromCamera.ts","webpack:///../@polygonjs/polygonjs/examples/presets/mat/Code.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/AttribCreate.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/AttribPromote.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CADFileSTEP.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CameraViewerCode/color.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CameraViewerCode/deviceOrientationPermission.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CameraViewerCode/onScroll.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CameraViewerCode/touchActionNone.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CameraViewerCode.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CameraWebXRARMarkerTracking.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Capsule.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Code.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Color.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/CSS2DObject.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Data.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/DataUrl.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Delete.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/DirectionalLight.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/File.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/FileSVG.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/FileGEOJSON.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/MapboxCamera.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Normals.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Point.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/RoundedBox.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Scatter.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/SpotLight.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Text.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/Transform.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/WFCDebug.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/WFCRuleConnectionFromSideName.ts","webpack:///../@polygonjs/polygonjs/examples/presets/sop/WFCTileProperties.ts","webpack:///../@polygonjs/polygonjs/examples/presets/index.ts","webpack:///../src/editor/components/panels/params/mixins/Presets.ts","webpack:///../src/editor/components/panels/params/mixins/Tooltips.ts","webpack:///../src/editor/components/panels/params/mixins/EventMouse.ts","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/exporters/USDZExporter.js","webpack:///../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterUSDZ.ts","webpack:///../src/editor/components/panels/params/mixins/Extras.ts","webpack:///../src/editor/components/panels/params/components/Param.vue","webpack:///../src/editor/components/panels/params/components/Param.vue?a75d","webpack:///../src/editor/components/panels/params/components/fields/mixins/GlobalSliderOwner.ts","webpack:///../src/editor/components/panels/params/components/mixins/ContextMenu.ts","webpack:///../src/editor/components/panels/params/components/mixins/JoinedParams.ts","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue?bf90","webpack:///../src/editor/components/panels/params/components/fields/Numeric.vue","webpack:///../src/editor/components/panels/params/components/fields/Numeric.vue?7096","webpack:///../src/editor/components/panels/params/components/fields/Numeric.vue?a30b","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue?54e1","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue?72b5","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue?47ec","webpack:///../src/editor/components/panels/params/components/fields/Button.vue","webpack:///../src/editor/components/panels/params/components/fields/Button.vue?60c3","webpack:///../src/editor/components/panels/params/components/fields/Button.vue?4f7c","webpack:///../src/editor/components/panels/params/components/fields/Button.vue?ec01","webpack:///../src/editor/components/panels/params/components/fields/Button.vue?b992","webpack:///../src/editor/components/panels/params/components/fields/Color.vue","webpack:///../src/editor/components/panels/params/components/fields/Color.vue?4a33","webpack:///../src/editor/components/panels/params/components/fields/mixins/MultipleParamCommon.ts","webpack:///../src/editor/core/ColorMenu.ts","webpack:///../src/editor/components/panels/params/components/fields/Color.vue?21ca","webpack:///../src/editor/components/panels/params/components/fields/Color.vue?0723","webpack:///../src/editor/components/panels/params/components/fields/Color.vue?755a","webpack:///../src/editor/components/panels/params/components/fields/Float.vue","webpack:///../src/editor/components/panels/params/components/fields/Float.vue?9524","webpack:///../src/editor/components/panels/params/components/fields/mixins/NumericSlider.ts","webpack:///../src/editor/components/panels/params/components/fields/Float.vue?cefd","webpack:///../src/editor/components/panels/params/components/fields/Float.vue?a298","webpack:///../src/editor/components/panels/params/components/fields/Float.vue?0050","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue?cd27","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue?9c4b","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue?d5d2","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue?6dca","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue?822e","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue?4c68","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue?89cd","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue?a210","webpack:///../src/editor/components/panels/params/components/fields/NodePath.vue","webpack:///../src/editor/components/panels/params/components/fields/NodePath.vue?bd5e","webpack:///../src/editor/components/panels/params/components/fields/mixins/PathParam.ts","webpack:///../src/editor/components/panels/params/components/fields/NodePath.vue?4f2b","webpack:///../src/editor/components/panels/params/components/fields/NodePath.vue?7114","webpack:///../src/editor/components/panels/params/components/fields/ParamPath.vue","webpack:///../src/editor/components/panels/params/components/fields/ParamPath.vue?2cbe","webpack:///../src/editor/components/panels/params/components/fields/ParamPath.vue?a060","webpack:///../src/editor/components/panels/params/components/fields/ParamPath.vue?abad","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue?98fc","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue?3c6c","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue?22e5","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue?ad5f","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue?0c10","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue?1b10","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue?7643","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue?23ec","webpack:///../src/editor/components/panels/params/components/fields/String.vue","webpack:///../src/editor/components/panels/params/components/fields/String.vue?89ac","webpack:///../src/editor/components/panels/params/components/fields/String.vue?cd1c","webpack:///../src/editor/components/panels/params/components/fields/String.vue?5858","webpack:///../src/editor/components/panels/params/components/fields/String.vue?e83f","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue?e98b","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue?2b7e","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue?43d8","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue?1667","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue?6c61","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue?384c","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue?8f03","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue?e1f1","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue?5c1e","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue?2565","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue?521a","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue?51a7","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue?1493","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue?5283","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue?9779","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue?48be","webpack:///../src/editor/components/panels/params/components/Param.vue?d162","webpack:///../src/editor/components/panels/params/components/Param.vue?bf67","webpack:///../src/editor/components/panels/params/components/Param.vue?1894","webpack:///../src/editor/components/panels/params/components/Extras.vue","webpack:///../src/editor/components/panels/params/components/Extras.vue?b5fa","webpack:///../src/editor/components/panels/params/components/Extras.vue?c4e9","webpack:///../src/editor/components/panels/params/components/Extras.vue?08e6","webpack:///../src/editor/components/panels/params/components/Extras.vue?aa67","webpack:///../src/editor/components/panels/params/Params.vue?5c71","webpack:///../src/editor/components/panels/params/Params.vue?65cc","webpack:///../src/editor/components/panels/params/Params.vue?09af","webpack:///../src/editor/components/widgets/DropDownMenu.vue","webpack:///../src/editor/components/widgets/DropDownMenu.vue?1615","webpack:///../src/editor/components/widgets/DropDownMenu.vue?f6ae","webpack:///../src/editor/components/widgets/DropDownMenu.vue?4c19","webpack:///../src/editor/components/widgets/DropDownMenu.vue?36e5","webpack:///../src/editor/components/widgets/EmptyState.vue","webpack:///../src/editor/components/widgets/EmptyState.vue?986d","webpack:///../src/editor/components/widgets/EmptyState.vue?0294","webpack:///../src/editor/components/widgets/EmptyState.vue?6a37","webpack:///../src/editor/components/widgets/NodeTree.vue","webpack:///../src/editor/components/widgets/NodeTree.vue?bfa6","webpack:///../src/editor/components/widgets/NodeTree.vue?3c87","webpack:///../src/editor/components/widgets/NodeTree.vue?f472","webpack:///../src/editor/components/widgets/NodeTree.vue?31d7","webpack:///../src/editor/components/widgets/alert/Error.vue","webpack:///../src/editor/components/widgets/alert/Error.vue?5795","webpack:///../src/editor/components/widgets/alert/Error.vue?a025","webpack:///../src/editor/components/widgets/alert/Error.vue?3994","webpack:///../src/editor/components/widgets/commandPalette/ComboBoxHack.vue","webpack:///../src/editor/components/widgets/commandPalette/ComboBoxHack.vue?c9b5","webpack:///../src/editor/components/widgets/commandPalette/ComboBoxHack.vue?d606","webpack:///../src/editor/components/widgets/dialogs/Modal.vue","webpack:///../src/editor/components/widgets/dialogs/Modal.vue?869b","webpack:///../src/editor/components/widgets/dialogs/Modal.vue?8040","webpack:///../src/editor/components/widgets/dialogs/Modal.vue?2d3b","webpack:///../src/editor/components/widgets/dialogs/Modal.vue?bf36","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuEntry.vue","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuEntry.vue?e495","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuEntry.vue?9ad7","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuEntry.vue?a77e","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuModal.vue","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuModal.vue?0878","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuModal.vue?4784","webpack:///../src/editor/components/widgets/dropdown/DropDownMenuModal.vue?969b","webpack:///../src/editor/components/widgets/form/SelectInput.vue","webpack:///../src/editor/components/widgets/form/SelectInput.vue?93f4","webpack:///../src/editor/components/widgets/form/SelectInput.vue?710a","webpack:///../src/editor/components/widgets/form/SelectInput.vue?456d","webpack:///../src/editor/components/panels/common/LinkIndexDropdown.vue?7ae2","webpack:///../src/editor/components/panels/common/Navigation.vue?fb7b","webpack:///../src/editor/components/panels/common/NavigationPathElement.vue?2896","webpack:///../src/editor/components/panels/custom/Custom.vue?d3c0","webpack:///../src/editor/components/panels/multiple/Multiple.vue?696b","webpack:///../src/editor/components/panels/network/NetworkCore.vue?8563","webpack:///../src/editor/components/panels/network/components/Connection.vue?fd4b","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue?2c78","webpack:///../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue?3c3b","webpack:///../src/editor/components/panels/network/components/Node.vue?5b39","webpack:///../src/editor/components/panels/network/components/NodeComment.vue?7821","webpack:///../src/editor/components/panels/network/components/NodeError.vue?91a7","webpack:///../src/editor/components/panels/network/components/NodeInfo.vue?9b17","webpack:///../src/editor/components/panels/network/components/ParamLabelResult.vue?b3cc","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue?43a0","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue?c12b","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue?fa7f","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue?c83b","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue?e6bb","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue?0efa","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue?bb85","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue?31c9","webpack:///../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue?94cd","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenu.vue?ae08","webpack:///../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue?40cf","webpack:///../src/editor/components/panels/params/Params.vue?f4a7","webpack:///../src/editor/components/panels/params/components/Extras.vue?9fa7","webpack:///../src/editor/components/panels/params/components/Param.vue?fc6d","webpack:///../src/editor/components/panels/params/components/fields/Boolean.vue?5f5e","webpack:///../src/editor/components/panels/params/components/fields/Button.vue?db7f","webpack:///../src/editor/components/panels/params/components/fields/Color.vue?87b6","webpack:///../src/editor/components/panels/params/components/fields/Float.vue?7d22","webpack:///../src/editor/components/panels/params/components/fields/Folder.vue?5159","webpack:///../src/editor/components/panels/params/components/fields/Integer.vue?8248","webpack:///../src/editor/components/panels/params/components/fields/Radio.vue?66a3","webpack:///../src/editor/components/panels/params/components/fields/Ramp.vue?f489","webpack:///../src/editor/components/panels/params/components/fields/Separator.vue?6767","webpack:///../src/editor/components/panels/params/components/fields/String.vue?7ecb","webpack:///../src/editor/components/panels/params/components/fields/Vector2.vue?b564","webpack:///../src/editor/components/panels/params/components/fields/Vector3.vue?04f9","webpack:///../src/editor/components/panels/params/components/fields/Vector4.vue?146c","webpack:///../src/editor/components/panels/viewer/Viewer.vue?2997","webpack:///../src/editor/components/widgets/DropDownMenu.vue?2b4c","webpack:///../src/editor/components/widgets/NodeTree.vue?f300","webpack:///../src/editor/components/widgets/dialogs/Modal.vue?a43a","webpack:///../node_modules/vue-style-loader/lib/listToStyles.js","webpack:///../node_modules/vue-style-loader/lib/addStylesClient.js","webpack:///../node_modules/vue/dist/vue.cjs.prod.js","webpack:///../node_modules/vue/index.js","webpack:///../node_modules/vue/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","webpack:///../node_modules/vue/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","webpack:///../node_modules/vue/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","webpack:///../src/docs/pages/mdx/ lazy ^\\.\\/.*\\.mdx$ namespace object","webpack:///../../../../node_modules/path/path.js","webpack:///ignored|/home/gui/work/web/polygonjs/dev/polygonjs-editor-rails/app/javascript/polygonjs-editor/@polygonjs/polygonjs/src/core/geometry/modules/cad/build|crypto","webpack:///ignored|/home/gui/work/web/polygonjs/dev/polygonjs-editor-rails/app/javascript/polygonjs-editor/@polygonjs/polygonjs/src/core/geometry/modules/cad/build|fs","webpack:///ignored|/home/gui/work/web/polygonjs/dev/polygonjs-editor-rails/node_modules/path|fs","webpack:///ignored|/home/gui/work/web/polygonjs/dev/polygonjs-editor-rails/node_modules/path|util","webpack:///../@polygonjs/polygonjs/node_modules/@vue-reactivity/watch/dist/index.mjs","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_Symbol.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_getRawTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_objectToString.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_baseGetTag.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_freeGlobal.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/_root.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isObject.js","webpack:///../@polygonjs/polygonjs/node_modules/lodash-es/isObjectLike.js","webpack:///../@polygonjs/polygonjs/node_modules/postprocessing/build/index.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/materials/MaterialBase.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/objects/PhysicalCamera.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/shader/common/utils.glsl.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/utils/IESLoader.js","webpack:///../@polygonjs/polygonjs/node_modules/three-gpu-pathtracer/src/utils/TextureUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/Constants.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/MeshBVH.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/MeshBVHNode.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/buildTree.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/buildUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/computeBoundsUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/geometryUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/sortUtils.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/sortUtils_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/build/splitUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/bvhcast.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/closestPointToGeometry.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/closestPointToGeometry_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/closestPointToPoint.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/intersectsGeometry.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/intersectsGeometry_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/raycast.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/raycastFirst.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/raycastFirst_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/raycast_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/refit.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/refit_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/cast/shapecast.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/utils/BufferStack.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/utils/intersectUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/utils/iterationUtils.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/utils/iterationUtils_indirect.generated.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/core/utils/nodeBufferUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/math/ExtendedTriangle.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/math/MathUtilities.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/math/OrientedBox.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/math/SeparatingAxisBounds.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/ArrayBoxUtilities.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/BufferUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/ExtendedTrianglePool.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/PrimitivePool.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/StaticGeometryGenerator.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/ThreeRayIntersectUtilities.js","webpack:///../@polygonjs/polygonjs/node_modules/three-mesh-bvh/src/utils/TriangleUtilities.js","webpack:///../@polygonjs/polygonjs/node_modules/three/build/three.module.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/geometries/RoundedBoxGeometry.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/libs/fflate.module.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/DRACOLoader.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/loaders/SVGLoader.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/postprocessing/Pass.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three/examples/jsm/utils/TextureUtils.js","webpack:///../@polygonjs/polygonjs/node_modules/three/src/math/MathUtils.js","webpack:///../@polygonjs/polygonjs/src/core/geometry/modules/sdf/manifold/manifold.js","webpack:///../node_modules/@headlessui/vue/dist/components/combobox/combobox.js","webpack:///../node_modules/@headlessui/vue/dist/components/description/description.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-window-event.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-tab-direction.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-event-listener.js","webpack:///../node_modules/@headlessui/vue/dist/utils/micro-task.js","webpack:///../node_modules/@headlessui/vue/dist/components/focus-trap/focus-trap.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-inert-others.js","webpack:///../node_modules/@headlessui/vue/dist/internal/portal-force-root.js","webpack:///../node_modules/@headlessui/vue/dist/components/portal/portal.js","webpack:///../node_modules/@headlessui/vue/dist/internal/stack-context.js","webpack:///../node_modules/@headlessui/vue/dist/utils/platform.js","webpack:///../node_modules/@headlessui/vue/dist/components/dialog/dialog.js","webpack:///../node_modules/@headlessui/vue/dist/components/listbox/listbox.js","webpack:///../node_modules/@headlessui/vue/dist/utils/once.js","webpack:///../node_modules/@headlessui/vue/dist/components/transitions/utils/transition.js","webpack:///../node_modules/@headlessui/vue/dist/components/transitions/transition.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-controllable.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-id.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-document-event.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-outside-click.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-resolve-button-type.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-tracked-pointer.js","webpack:///../node_modules/@headlessui/vue/dist/hooks/use-tree-walker.js","webpack:///../node_modules/@headlessui/vue/dist/internal/hidden.js","webpack:///../node_modules/@headlessui/vue/dist/internal/open-closed.js","webpack:///../node_modules/@headlessui/vue/dist/keyboard.js","webpack:///../node_modules/@headlessui/vue/dist/utils/calculate-active-index.js","webpack:///../node_modules/@headlessui/vue/dist/utils/disposables.js","webpack:///../node_modules/@headlessui/vue/dist/utils/dom.js","webpack:///../node_modules/@headlessui/vue/dist/utils/focus-management.js","webpack:///../node_modules/@headlessui/vue/dist/utils/form.js","webpack:///../node_modules/@headlessui/vue/dist/utils/match.js","webpack:///../node_modules/@headlessui/vue/dist/utils/owner.js","webpack:///../node_modules/@headlessui/vue/dist/utils/render.js","webpack:///../node_modules/@headlessui/vue/dist/utils/ssr.js","webpack:///../node_modules/marked/lib/marked.esm.js","webpack:///../node_modules/vue-router/dist/vue-router.mjs","webpack:///webpack/bootstrap","webpack:///webpack/runtime/amd options","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/get mini-css chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/harmony module decorator","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/load script","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/css loading","webpack:///webpack/runtime/jsonp chunk loading","webpack:///../src/npm_module/NpmModuleLibraryInstaller.ts","webpack:///../src/npm_module/NpmMarketplaceController.ts","webpack:///../src/npm_module/NpmModuleSceneSaveController.ts","webpack:///../src/npm_module/NpmModulePolyNodeSaveController.ts","webpack:///../src/editor/history/serializedStack/_BaseSerializedStack.ts","webpack:///../src/editor/history/serializedStack/NpmSerializedStack.ts","webpack:///../node_modules/engine.io-parser/build/esm/commons.js","webpack:///../node_modules/engine.io-parser/build/esm/encodePacket.browser.js","webpack:///../node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","webpack:///../node_modules/engine.io-parser/build/esm/decodePacket.browser.js","webpack:///../node_modules/engine.io-parser/build/esm/index.js","webpack:///../node_modules/@socket.io/component-emitter/index.mjs","webpack:///../node_modules/engine.io-client/build/esm/globalThis.browser.js","webpack:///../node_modules/engine.io-client/build/esm/util.js","webpack:///../node_modules/engine.io-client/build/esm/transport.js","webpack:///../node_modules/engine.io-client/build/esm/contrib/yeast.js","webpack:///../node_modules/engine.io-client/build/esm/contrib/parseqs.js","webpack:///../node_modules/engine.io-client/build/esm/contrib/has-cors.js","webpack:///../node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","webpack:///../node_modules/engine.io-client/build/esm/transports/polling.js","webpack:///../node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","webpack:///../node_modules/engine.io-client/build/esm/transports/websocket.js","webpack:///../node_modules/engine.io-client/build/esm/transports/index.js","webpack:///../node_modules/engine.io-client/build/esm/contrib/parseuri.js","webpack:///../node_modules/engine.io-client/build/esm/socket.js","webpack:///../node_modules/engine.io-client/build/esm/index.js","webpack:///../node_modules/socket.io-client/build/esm/url.js","webpack:///../node_modules/socket.io-parser/build/esm/is-binary.js","webpack:///../node_modules/socket.io-parser/build/esm/binary.js","webpack:///../node_modules/socket.io-parser/build/esm/index.js","webpack:///../node_modules/socket.io-client/build/esm/on.js","webpack:///../node_modules/socket.io-client/build/esm/socket.js","webpack:///../node_modules/socket.io-client/build/esm/contrib/backo2.js","webpack:///../node_modules/socket.io-client/build/esm/manager.js","webpack:///../node_modules/socket.io-client/build/esm/index.js","webpack:///../src/npm_module/NpmSocketController.ts","webpack:///../src/npm_module/NpmEditorConfig.ts","webpack:///../src/npm_module/EditorConfigLoadController.ts","webpack:///../src/npm_module/index.ts"],"sourcesContent":["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}\n\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","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\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}\n\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _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\nmodule.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","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}\n\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayWithHoles = require(\"./arrayWithHoles.js\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\n\nvar nonIterableRest = require(\"./nonIterableRest.js\");\n\nfunction _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\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\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","const cssColors = require('./cssColors')\n\n/**\n * Converts a CSS color name to RGB color.\n *\n * @param {String} s - the CSS color name\n * @return {Array} the RGB color, or undefined if not found\n * @alias module:modeling/colors.colorNameToRgb\n * @example\n * let mysphere = colorize(colorNameToRgb('lightblue'), sphere())\n */\nconst colorNameToRgb = (s) => cssColors[s.toLowerCase()]\n\nmodule.exports = colorNameToRgb\n","const flatten = require('../utils/flatten')\n\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\nconst path2 = require('../geometries/path2')\nconst poly3 = require('../geometries/poly3')\n\nconst colorGeom2 = (color, object) => {\n  const newgeom2 = geom2.clone(object)\n  newgeom2.color = color\n  return newgeom2\n}\n\nconst colorGeom3 = (color, object) => {\n  const newgeom3 = geom3.clone(object)\n  newgeom3.color = color\n  return newgeom3\n}\n\nconst colorPath2 = (color, object) => {\n  const newpath2 = path2.clone(object)\n  newpath2.color = color\n  return newpath2\n}\n\nconst colorPoly3 = (color, object) => {\n  const newpoly = poly3.clone(object)\n  newpoly.color = color\n  return newpoly\n}\n\n/**\n * Assign the given color to the given objects.\n * @param {Array} color - RGBA color values, where each value is between 0 and 1.0\n * @param {Object|Array} objects - the objects of which to apply the given color\n * @return {Object|Array} new object, or list of new objects with an additional attribute 'color'\n * @alias module:modeling/colors.colorize\n *\n * @example\n * let redSphere = colorize([1,0,0], sphere()) // red\n * let greenCircle = colorize([0,1,0,0.8], circle()) // green transparent\n * let blueArc = colorize([0,0,1], arc()) // blue\n * let wildcylinder = colorize(colorNameToRgb('fuchsia'), cylinder()) // CSS color\n */\nconst colorize = (color, ...objects) => {\n  if (!Array.isArray(color)) throw new Error('color must be an array')\n  if (color.length < 3) throw new Error('color must contain R, G and B values')\n  if (color.length === 3) color = [color[0], color[1], color[2], 1.0] // add alpha\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  const results = objects.map((object) => {\n    if (geom2.isA(object)) return colorGeom2(color, object)\n    if (geom3.isA(object)) return colorGeom3(color, object)\n    if (path2.isA(object)) return colorPath2(color, object)\n    if (poly3.isA(object)) return colorPoly3(color, object)\n\n    object.color = color\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = colorize\n","/**\n * @alias module:modeling/colors.cssColors\n * @see CSS color table from http://www.w3.org/TR/css3-color/\n * @enum {Array}\n * @example\n * let newshape = colorize(cssColors.red, oldshape)\n */\nconst cssColors = {\n  // basic color keywords\n  black: [0 / 255, 0 / 255, 0 / 255],\n  silver: [192 / 255, 192 / 255, 192 / 255],\n  gray: [128 / 255, 128 / 255, 128 / 255],\n  white: [255 / 255, 255 / 255, 255 / 255],\n  maroon: [128 / 255, 0 / 255, 0 / 255],\n  red: [255 / 255, 0 / 255, 0 / 255],\n  purple: [128 / 255, 0 / 255, 128 / 255],\n  fuchsia: [255 / 255, 0 / 255, 255 / 255],\n  green: [0 / 255, 128 / 255, 0 / 255],\n  lime: [0 / 255, 255 / 255, 0 / 255],\n  olive: [128 / 255, 128 / 255, 0 / 255],\n  yellow: [255 / 255, 255 / 255, 0 / 255],\n  navy: [0 / 255, 0 / 255, 128 / 255],\n  blue: [0 / 255, 0 / 255, 255 / 255],\n  teal: [0 / 255, 128 / 255, 128 / 255],\n  aqua: [0 / 255, 255 / 255, 255 / 255],\n  // extended color keywords\n  aliceblue: [240 / 255, 248 / 255, 255 / 255],\n  antiquewhite: [250 / 255, 235 / 255, 215 / 255],\n  // 'aqua': [ 0 / 255, 255 / 255, 255 / 255 ],\n  aquamarine: [127 / 255, 255 / 255, 212 / 255],\n  azure: [240 / 255, 255 / 255, 255 / 255],\n  beige: [245 / 255, 245 / 255, 220 / 255],\n  bisque: [255 / 255, 228 / 255, 196 / 255],\n  // 'black': [ 0 / 255, 0 / 255, 0 / 255 ],\n  blanchedalmond: [255 / 255, 235 / 255, 205 / 255],\n  // 'blue': [ 0 / 255, 0 / 255, 255 / 255 ],\n  blueviolet: [138 / 255, 43 / 255, 226 / 255],\n  brown: [165 / 255, 42 / 255, 42 / 255],\n  burlywood: [222 / 255, 184 / 255, 135 / 255],\n  cadetblue: [95 / 255, 158 / 255, 160 / 255],\n  chartreuse: [127 / 255, 255 / 255, 0 / 255],\n  chocolate: [210 / 255, 105 / 255, 30 / 255],\n  coral: [255 / 255, 127 / 255, 80 / 255],\n  cornflowerblue: [100 / 255, 149 / 255, 237 / 255],\n  cornsilk: [255 / 255, 248 / 255, 220 / 255],\n  crimson: [220 / 255, 20 / 255, 60 / 255],\n  cyan: [0 / 255, 255 / 255, 255 / 255],\n  darkblue: [0 / 255, 0 / 255, 139 / 255],\n  darkcyan: [0 / 255, 139 / 255, 139 / 255],\n  darkgoldenrod: [184 / 255, 134 / 255, 11 / 255],\n  darkgray: [169 / 255, 169 / 255, 169 / 255],\n  darkgreen: [0 / 255, 100 / 255, 0 / 255],\n  darkgrey: [169 / 255, 169 / 255, 169 / 255],\n  darkkhaki: [189 / 255, 183 / 255, 107 / 255],\n  darkmagenta: [139 / 255, 0 / 255, 139 / 255],\n  darkolivegreen: [85 / 255, 107 / 255, 47 / 255],\n  darkorange: [255 / 255, 140 / 255, 0 / 255],\n  darkorchid: [153 / 255, 50 / 255, 204 / 255],\n  darkred: [139 / 255, 0 / 255, 0 / 255],\n  darksalmon: [233 / 255, 150 / 255, 122 / 255],\n  darkseagreen: [143 / 255, 188 / 255, 143 / 255],\n  darkslateblue: [72 / 255, 61 / 255, 139 / 255],\n  darkslategray: [47 / 255, 79 / 255, 79 / 255],\n  darkslategrey: [47 / 255, 79 / 255, 79 / 255],\n  darkturquoise: [0 / 255, 206 / 255, 209 / 255],\n  darkviolet: [148 / 255, 0 / 255, 211 / 255],\n  deeppink: [255 / 255, 20 / 255, 147 / 255],\n  deepskyblue: [0 / 255, 191 / 255, 255 / 255],\n  dimgray: [105 / 255, 105 / 255, 105 / 255],\n  dimgrey: [105 / 255, 105 / 255, 105 / 255],\n  dodgerblue: [30 / 255, 144 / 255, 255 / 255],\n  firebrick: [178 / 255, 34 / 255, 34 / 255],\n  floralwhite: [255 / 255, 250 / 255, 240 / 255],\n  forestgreen: [34 / 255, 139 / 255, 34 / 255],\n  // 'fuchsia': [ 255 / 255, 0 / 255, 255 / 255 ],\n  gainsboro: [220 / 255, 220 / 255, 220 / 255],\n  ghostwhite: [248 / 255, 248 / 255, 255 / 255],\n  gold: [255 / 255, 215 / 255, 0 / 255],\n  goldenrod: [218 / 255, 165 / 255, 32 / 255],\n  // 'gray': [ 128 / 255, 128 / 255, 128 / 255 ],\n  // 'green': [ 0 / 255, 128 / 255, 0 / 255 ],\n  greenyellow: [173 / 255, 255 / 255, 47 / 255],\n  grey: [128 / 255, 128 / 255, 128 / 255],\n  honeydew: [240 / 255, 255 / 255, 240 / 255],\n  hotpink: [255 / 255, 105 / 255, 180 / 255],\n  indianred: [205 / 255, 92 / 255, 92 / 255],\n  indigo: [75 / 255, 0 / 255, 130 / 255],\n  ivory: [255 / 255, 255 / 255, 240 / 255],\n  khaki: [240 / 255, 230 / 255, 140 / 255],\n  lavender: [230 / 255, 230 / 255, 250 / 255],\n  lavenderblush: [255 / 255, 240 / 255, 245 / 255],\n  lawngreen: [124 / 255, 252 / 255, 0 / 255],\n  lemonchiffon: [255 / 255, 250 / 255, 205 / 255],\n  lightblue: [173 / 255, 216 / 255, 230 / 255],\n  lightcoral: [240 / 255, 128 / 255, 128 / 255],\n  lightcyan: [224 / 255, 255 / 255, 255 / 255],\n  lightgoldenrodyellow: [250 / 255, 250 / 255, 210 / 255],\n  lightgray: [211 / 255, 211 / 255, 211 / 255],\n  lightgreen: [144 / 255, 238 / 255, 144 / 255],\n  lightgrey: [211 / 255, 211 / 255, 211 / 255],\n  lightpink: [255 / 255, 182 / 255, 193 / 255],\n  lightsalmon: [255 / 255, 160 / 255, 122 / 255],\n  lightseagreen: [32 / 255, 178 / 255, 170 / 255],\n  lightskyblue: [135 / 255, 206 / 255, 250 / 255],\n  lightslategray: [119 / 255, 136 / 255, 153 / 255],\n  lightslategrey: [119 / 255, 136 / 255, 153 / 255],\n  lightsteelblue: [176 / 255, 196 / 255, 222 / 255],\n  lightyellow: [255 / 255, 255 / 255, 224 / 255],\n  // 'lime': [ 0 / 255, 255 / 255, 0 / 255 ],\n  limegreen: [50 / 255, 205 / 255, 50 / 255],\n  linen: [250 / 255, 240 / 255, 230 / 255],\n  magenta: [255 / 255, 0 / 255, 255 / 255],\n  // 'maroon': [ 128 / 255, 0 / 255, 0 / 255 ],\n  mediumaquamarine: [102 / 255, 205 / 255, 170 / 255],\n  mediumblue: [0 / 255, 0 / 255, 205 / 255],\n  mediumorchid: [186 / 255, 85 / 255, 211 / 255],\n  mediumpurple: [147 / 255, 112 / 255, 219 / 255],\n  mediumseagreen: [60 / 255, 179 / 255, 113 / 255],\n  mediumslateblue: [123 / 255, 104 / 255, 238 / 255],\n  mediumspringgreen: [0 / 255, 250 / 255, 154 / 255],\n  mediumturquoise: [72 / 255, 209 / 255, 204 / 255],\n  mediumvioletred: [199 / 255, 21 / 255, 133 / 255],\n  midnightblue: [25 / 255, 25 / 255, 112 / 255],\n  mintcream: [245 / 255, 255 / 255, 250 / 255],\n  mistyrose: [255 / 255, 228 / 255, 225 / 255],\n  moccasin: [255 / 255, 228 / 255, 181 / 255],\n  navajowhite: [255 / 255, 222 / 255, 173 / 255],\n  // 'navy': [ 0 / 255, 0 / 255, 128 / 255 ],\n  oldlace: [253 / 255, 245 / 255, 230 / 255],\n  // 'olive': [ 128 / 255, 128 / 255, 0 / 255 ],\n  olivedrab: [107 / 255, 142 / 255, 35 / 255],\n  orange: [255 / 255, 165 / 255, 0 / 255],\n  orangered: [255 / 255, 69 / 255, 0 / 255],\n  orchid: [218 / 255, 112 / 255, 214 / 255],\n  palegoldenrod: [238 / 255, 232 / 255, 170 / 255],\n  palegreen: [152 / 255, 251 / 255, 152 / 255],\n  paleturquoise: [175 / 255, 238 / 255, 238 / 255],\n  palevioletred: [219 / 255, 112 / 255, 147 / 255],\n  papayawhip: [255 / 255, 239 / 255, 213 / 255],\n  peachpuff: [255 / 255, 218 / 255, 185 / 255],\n  peru: [205 / 255, 133 / 255, 63 / 255],\n  pink: [255 / 255, 192 / 255, 203 / 255],\n  plum: [221 / 255, 160 / 255, 221 / 255],\n  powderblue: [176 / 255, 224 / 255, 230 / 255],\n  // 'purple': [ 128 / 255, 0 / 255, 128 / 255 ],\n  // 'red': [ 255 / 255, 0 / 255, 0 / 255 ],\n  rosybrown: [188 / 255, 143 / 255, 143 / 255],\n  royalblue: [65 / 255, 105 / 255, 225 / 255],\n  saddlebrown: [139 / 255, 69 / 255, 19 / 255],\n  salmon: [250 / 255, 128 / 255, 114 / 255],\n  sandybrown: [244 / 255, 164 / 255, 96 / 255],\n  seagreen: [46 / 255, 139 / 255, 87 / 255],\n  seashell: [255 / 255, 245 / 255, 238 / 255],\n  sienna: [160 / 255, 82 / 255, 45 / 255],\n  // 'silver': [ 192 / 255, 192 / 255, 192 / 255 ],\n  skyblue: [135 / 255, 206 / 255, 235 / 255],\n  slateblue: [106 / 255, 90 / 255, 205 / 255],\n  slategray: [112 / 255, 128 / 255, 144 / 255],\n  slategrey: [112 / 255, 128 / 255, 144 / 255],\n  snow: [255 / 255, 250 / 255, 250 / 255],\n  springgreen: [0 / 255, 255 / 255, 127 / 255],\n  steelblue: [70 / 255, 130 / 255, 180 / 255],\n  tan: [210 / 255, 180 / 255, 140 / 255],\n  // 'teal': [ 0 / 255, 128 / 255, 128 / 255 ],\n  thistle: [216 / 255, 191 / 255, 216 / 255],\n  tomato: [255 / 255, 99 / 255, 71 / 255],\n  turquoise: [64 / 255, 224 / 255, 208 / 255],\n  violet: [238 / 255, 130 / 255, 238 / 255],\n  wheat: [245 / 255, 222 / 255, 179 / 255],\n  // 'white': [ 255 / 255, 255 / 255, 255 / 255 ],\n  whitesmoke: [245 / 255, 245 / 255, 245 / 255],\n  // 'yellow': [ 255 / 255, 255 / 255, 0 / 255 ],\n  yellowgreen: [154 / 255, 205 / 255, 50 / 255]\n}\n\nmodule.exports = cssColors\n","/**\n * Converts CSS color notations (string of hex values) to RGB values.\n *\n * @see https://www.w3.org/TR/css-color-3/\n * @param {String} notation - color notation\n * @return {Array} RGB color values\n * @alias module:modeling/colors.hexToRgb\n *\n * @example\n * let mysphere = colorize(hexToRgb('#000080'), sphere()) // navy blue\n */\nconst hexToRgb = (notation) => {\n  notation = notation.replace('#', '')\n  if (notation.length < 6) throw new Error('the given notation must contain 3 or more hex values')\n\n  const r = parseInt(notation.substring(0, 2), 16) / 255\n  const g = parseInt(notation.substring(2, 4), 16) / 255\n  const b = parseInt(notation.substring(4, 6), 16) / 255\n  if (notation.length >= 8) {\n    const a = parseInt(notation.substring(6, 8), 16) / 255\n    return [r, g, b, a]\n  }\n  return [r, g, b]\n}\n\nmodule.exports = hexToRgb\n","const flatten = require('../utils/flatten')\n\nconst hueToColorComponent = require('./hueToColorComponent')\n\n/**\n * Converts HSL color values to RGB color values.\n *\n * @see http://en.wikipedia.org/wiki/HSL_color_space\n * @param {...Number|Array} values - HSL or HSLA color values\n * @return {Array} RGB or RGBA color values\n * @alias module:modeling/colors.hslToRgb\n *\n * @example\n * let mysphere = colorize(hslToRgb([0.9166666666666666, 1, 0.5]), sphere())\n */\nconst hslToRgb = (...values) => {\n  values = flatten(values)\n  if (values.length < 3) throw new Error('values must contain H, S and L values')\n\n  const h = values[0]\n  const s = values[1]\n  const l = values[2]\n\n  let r = l // default is achromatic\n  let g = l\n  let b = l\n\n  if (s !== 0) {\n    const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n    const p = 2 * l - q\n    r = hueToColorComponent(p, q, h + 1 / 3)\n    g = hueToColorComponent(p, q, h)\n    b = hueToColorComponent(p, q, h - 1 / 3)\n  }\n\n  if (values.length > 3) {\n    // add alpha value if provided\n    const a = values[3]\n    return [r, g, b, a]\n  }\n  return [r, g, b]\n}\n\nmodule.exports = hslToRgb\n","const flatten = require('../utils/flatten')\n\n/**\n * Converts HSV color values to RGB color values.\n *\n * @see http://en.wikipedia.org/wiki/HSV_color_space.\n * @param {...Number|Array} values - HSV or HSVA color values\n * @return {Array} RGB or RGBA color values\n * @alias module:modeling/colors.hsvToRgb\n *\n * @example\n * let mysphere = colorize(hsvToRgb([0.9166666666666666, 1, 1]), sphere())\n */\nconst hsvToRgb = (...values) => {\n  values = flatten(values)\n  if (values.length < 3) throw new Error('values must contain H, S and V values')\n\n  const h = values[0]\n  const s = values[1]\n  const v = values[2]\n\n  let r = 0\n  let g = 0\n  let b = 0\n\n  const i = Math.floor(h * 6)\n  const f = h * 6 - i\n  const p = v * (1 - s)\n  const q = v * (1 - f * s)\n  const t = v * (1 - (1 - f) * s)\n\n  switch (i % 6) {\n    case 0:\n      r = v\n      g = t\n      b = p\n      break\n    case 1:\n      r = q\n      g = v\n      b = p\n      break\n    case 2:\n      r = p\n      g = v\n      b = t\n      break\n    case 3:\n      r = p\n      g = q\n      b = v\n      break\n    case 4:\n      r = t\n      g = p\n      b = v\n      break\n    case 5:\n      r = v\n      g = p\n      b = q\n      break\n  }\n\n  if (values.length > 3) {\n    // add alpha value if provided\n    const a = values[3]\n    return [r, g, b, a]\n  }\n  return [r, g, b]\n}\n\nmodule.exports = hsvToRgb\n","/**\n * Convert hue values to a color component (ie one of r, g, b)\n * @param  {Number} p\n * @param  {Number} q\n * @param  {Number} t\n * @return {Number} color component\n * @alias module:modeling/colors.hueToColorComponent\n */\nconst hueToColorComponent = (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\nmodule.exports = hueToColorComponent\n","/**\n * All shapes (primitives or the results of operations) can be assigned a color (RGBA).\n * In all cases, the function returns the results, and never changes the original shapes.\n * @module modeling/colors\n * @example\n * const { colorize, hexToRgb } = require('@jscad/modeling').colors\n */\nmodule.exports = {\n  colorize: require('./colorize'),\n  colorNameToRgb: require('./colorNameToRgb'),\n  cssColors: require('./cssColors'),\n  hexToRgb: require('./hexToRgb'),\n  hslToRgb: require('./hslToRgb'),\n  hsvToRgb: require('./hsvToRgb'),\n  hueToColorComponent: require('./hueToColorComponent'),\n  rgbToHex: require('./rgbToHex'),\n  rgbToHsl: require('./rgbToHsl'),\n  rgbToHsv: require('./rgbToHsv')\n}\n","const flatten = require('../utils/flatten')\n\n/**\n * Convert the given RGB color values to CSS color notation (string)\n * @see https://www.w3.org/TR/css-color-3/\n * @param {...Number|Array} values - RGB or RGBA color values\n * @return {String} CSS color notation\n * @alias module:modeling/colors.rgbToHex\n */\nconst rgbToHex = (...values) => {\n  values = flatten(values)\n  if (values.length < 3) throw new Error('values must contain R, G and B values')\n\n  const r = values[0] * 255\n  const g = values[1] * 255\n  const b = values[2] * 255\n\n  let s = `#${Number(0x1000000 + r * 0x10000 + g * 0x100 + b).toString(16).substring(1, 7)}`\n\n  if (values.length > 3) {\n    // convert alpha to opacity\n    s = s + Number(values[3] * 255).toString(16)\n  }\n  return s\n}\n\nmodule.exports = rgbToHex\n","const flatten = require('../utils/flatten')\n\n/**\n * Converts an RGB color value to HSL.\n *\n * @see http://en.wikipedia.org/wiki/HSL_color_space.\n * @see http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n * @param {...Number|Array} values - RGB or RGBA color values\n * @return {Array} HSL or HSLA color values\n * @alias module:modeling/colors.rgbToHsl\n */\nconst rgbToHsl = (...values) => {\n  values = flatten(values)\n  if (values.length < 3) throw new Error('values must contain R, G and B values')\n\n  const r = values[0]\n  const g = values[1]\n  const b = values[2]\n\n  const max = Math.max(r, g, b)\n  const min = Math.min(r, g, b)\n  let h\n  let s\n  const l = (max + min) / 2\n\n  if (max === min) {\n    h = s = 0 // achromatic\n  } else {\n    const d = max - min\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0)\n        break\n      case g:\n        h = (b - r) / d + 2\n        break\n      case b:\n        h = (r - g) / d + 4\n        break\n    }\n    h /= 6\n  }\n\n  if (values.length > 3) {\n    // add alpha value if provided\n    const a = values[3]\n    return [h, s, l, a]\n  }\n  return [h, s, l]\n}\n\nmodule.exports = rgbToHsl\n","const flatten = require('../utils/flatten')\n\n/**\n * Converts an RGB color value to HSV.\n *\n * @see http://en.wikipedia.org/wiki/HSV_color_space.\n * @param {...Number|Array} values - RGB or RGBA color values\n * @return {Array} HSV or HSVA color values\n * @alias module:modeling/colors.rgbToHsv\n */\nconst rgbToHsv = (...values) => {\n  values = flatten(values)\n  if (values.length < 3) throw new Error('values must contain R, G and B values')\n\n  const r = values[0]\n  const g = values[1]\n  const b = values[2]\n\n  const max = Math.max(r, g, b)\n  const min = Math.min(r, g, b)\n  let h\n  const v = max\n\n  const d = max - min\n  const s = max === 0 ? 0 : d / max\n\n  if (max === min) {\n    h = 0 // achromatic\n  } else {\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0)\n        break\n      case g:\n        h = (b - r) / d + 2\n        break\n      case b:\n        h = (r - g) / d + 4\n        break\n    }\n    h /= 6\n  }\n\n  if (values.length > 3) {\n    // add alpha if provided\n    const a = values[3]\n    return [h, s, v, a]\n  }\n  return [h, s, v]\n}\n\nmodule.exports = rgbToHsv\n","/**\n * Represents a bezier easing function.\n * @typedef {Object} bezier\n * @property {Array} points - The control points for the bezier curve. The first and last point will also be the start and end of the curve\n * @property {string} pointType - A reference to the type and dimensionality of the points that the curve was created from\n * @property {number} dimensions - The dimensionality of the bezier\n * @property {Array} permutations - A pre-calculation of the bezier algorithm's co-efficients\n * @property {Array} tangentPermutations - A pre-calculation of the bezier algorithm's tangent co-efficients\n *\n */\n\n/**\n * Creates an object representing a bezier easing curve.\n * Curves can have both an arbitrary number of control points, and an arbitrary number of dimensions.\n *\n * @example\n * const b = bezier.create([0,10]) // a linear progression from 0 to 10\n * const b = bezier.create([0, 0, 10, 10]) // a symmetrical cubic easing curve that starts slowly and ends slowly from 0 to 10\n * const b = bezier.create([0,0,0], [0,5,10], [10,0,-5], [10,10,10]]) // a cubic 3 dimensional easing curve that can generate position arrays for modelling\n * // Usage\n * let position = bezier.valueAt(t,b) // where 0 < t < 1\n * let tangent = bezier.tangentAt(t,b) // where 0 < t < 1\n *\n * @param {Array} points An array with at least 2 elements of either all numbers, or all arrays of numbers that are the same size.\n * @returns {bezier} a new bezier data object\n * @alias module:modeling/curves/bezier.create\n */\nconst create = (points) => {\n  if (!Array.isArray(points)) throw new Error('Bezier points must be a valid array/')\n  if (points.length < 2) throw new Error('Bezier points must contain at least 2 values.')\n  const pointType = getPointType(points)\n\n  return {\n    points: points,\n    pointType: pointType,\n    dimensions: pointType === 'float_single' ? 0 : points[0].length,\n    permutations: getPermutations(points.length - 1),\n    tangentPermutations: getPermutations(points.length - 2)\n  }\n}\n\nconst getPointType = function (points) {\n  let firstPointType = null\n  points.forEach((point) => {\n    let pType = ''\n    if (Number.isFinite(point)) {\n      pType = 'float_single'\n    } else if (Array.isArray(point)) {\n      point.forEach((val) => {\n        if (!Number.isFinite(val)) throw new Error('Bezier point values must all be numbers.')\n      })\n      pType = 'float_' + point.length\n    } else throw new Error('Bezier points must all be numbers or arrays of number.')\n    if (firstPointType == null) {\n      firstPointType = pType\n    } else {\n      if (firstPointType !== pType) {\n        throw new Error('Bezier points must be either all numbers or all arrays of numbers of the same size.')\n      }\n    }\n  })\n  return firstPointType\n}\n\nconst getPermutations = function (c) {\n  const permutations = []\n  for (let i = 0; i <= c; i++) {\n    permutations.push(factorial(c) / (factorial(i) * factorial(c - i)))\n  }\n  return permutations\n}\n\nconst factorial = function (b) {\n  let out = 1\n  for (let i = 2; i <= b; i++) {\n    out *= i\n  }\n  return out\n}\n\nmodule.exports = create\n","/**\n * Represents a bezier easing function.\n * @see {@link bezier} for data structure information.\n * @module modeling/curves/bezier\n */\nmodule.exports = {\n  create: require('./create'),\n  valueAt: require('./valueAt'),\n  tangentAt: require('./tangentAt')\n}\n","/**\n * Calculates the tangent at a specific position along a bezier easing curve.\n * For multidimensional curves, the tangent is the slope of each dimension at that point.\n * See the example called extrudeAlongPath.js\n *\n * @example\n * const b = bezier.create([[0,0,0], [0,5,10], [10,0,-5], [10,10,10]]) // a cubic 3 dimensional easing curve that can generate position arrays for modelling\n * let tangent = bezier.tangentAt(t, b)\n *\n * @param {number} t : the position of which to calculate the bezier's tangent value; 0 < t < 1\n * @param {Object} bezier : an array with at least 2 elements of either all numbers, or all arrays of numbers that are the same size.\n * @return {array | number} the tangent at the requested position.\n * @alias module:modeling/curves/bezier.tangentAt\n */\nconst tangentAt = (t, bezier) => {\n  if (t < 0 || t > 1) {\n    throw new Error('Bezier tangentAt() input must be between 0 and 1')\n  }\n  if (bezier.pointType === 'float_single') {\n    return bezierTangent(bezier, bezier.points, t)\n  } else {\n    const result = []\n    for (let i = 0; i < bezier.dimensions; i++) {\n      const singleDimensionPoints = []\n      for (let j = 0; j < bezier.points.length; j++) {\n        singleDimensionPoints.push(bezier.points[j][i])\n      }\n      result.push(bezierTangent(bezier, singleDimensionPoints, t))\n    }\n    return result\n  }\n}\n\nconst bezierTangent = function (bezier, p, t) {\n  // from https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html\n  const n = p.length - 1\n  let result = 0\n  for (let i = 0; i < n; i++) {\n    const q = n * (p[i + 1] - p[i])\n    result += bezier.tangentPermutations[i] * Math.pow(1 - t, n - 1 - i) * Math.pow(t, i) * q\n  }\n  return result\n}\n\nmodule.exports = tangentAt\n","/**\n * Calculates the value at a specific position along a bezier easing curve.\n * For multidimensional curves, the tangent is the slope of each dimension at that point.\n * See the example called extrudeAlongPath.js to see this in use.\n * Math and explanation comes from {@link https://www.freecodecamp.org/news/nerding-out-with-bezier-curves-6e3c0bc48e2f/}\n *\n * @example\n * const b = bezier.create([0,0,0], [0,5,10], [10,0,-5], [10,10,10]]) // a cubic 3 dimensional easing curve that can generate position arrays for modelling\n * let position = bezier.valueAt(t,b) // where 0 < t < 1\n *\n * @param {number} t : the position of which to calculate the value; 0 < t < 1\n * @param {Object} bezier : a bezier curve created with bezier.create().\n * @returns {array | number} the value at the requested position.\n * @alias module:modeling/curves/bezier.valueAt\n */\nconst valueAt = (t, bezier) => {\n  if (t < 0 || t > 1) {\n    throw new Error('Bezier valueAt() input must be between 0 and 1')\n  }\n  if (bezier.pointType === 'float_single') {\n    return bezierFunction(bezier, bezier.points, t)\n  } else {\n    const result = []\n    for (let i = 0; i < bezier.dimensions; i++) {\n      const singleDimensionPoints = []\n      for (let j = 0; j < bezier.points.length; j++) {\n        singleDimensionPoints.push(bezier.points[j][i])\n      }\n      result.push(bezierFunction(bezier, singleDimensionPoints, t))\n    }\n    return result\n  }\n}\n\nconst bezierFunction = function (bezier, p, t) {\n  const n = p.length - 1\n  let result = 0\n  for (let i = 0; i <= n; i++) {\n    result += bezier.permutations[i] * Math.pow(1 - t, n - i) * Math.pow(t, i) * p[i]\n  }\n  return result\n}\n\nmodule.exports = valueAt\n","/**\n * Curves are n-dimensional mathematical constructs that define a path from point 0 to point 1.\n * @module modeling/curves\n * @example\n * const { bezier } = require('@jscad/modeling').curves\n\n */\nmodule.exports = {\n  bezier: require('./bezier')\n}\n","const mat4 = require('../../maths/mat4')\nconst vec2 = require('../../maths/vec2')\n\n/*\n * Apply the transforms of the given geometry.\n * NOTE: This function must be called BEFORE exposing any data. See toSides().\n * @param {geom2} geometry - the geometry to transform\n * @returns {geom2} the given geometry\n *\n * @example\n * geometry = applyTransforms(geometry)\n */\nconst applyTransforms = (geometry) => {\n  if (mat4.isIdentity(geometry.transforms)) return geometry\n\n  // apply transforms to each side\n  geometry.sides = geometry.sides.map((side) => {\n    const p0 = vec2.transform(vec2.create(), side[0], geometry.transforms)\n    const p1 = vec2.transform(vec2.create(), side[1], geometry.transforms)\n    return [p0, p1]\n  })\n  geometry.transforms = mat4.create()\n  return geometry\n}\n\nmodule.exports = applyTransforms\n","/**\n * Performs a shallow clone of the given geometry.\n * @param {geom2} geometry - the geometry to clone\n * @returns {geom2} new geometry\n * @alias module:modeling/geometries/geom2.clone\n */\nconst clone = (geometry) => Object.assign({}, geometry)\n\nmodule.exports = clone\n","const mat4 = require('../../maths/mat4')\n\n/**\n * Represents a 2D geometry consisting of a list of sides.\n * @typedef {Object} geom2\n * @property {Array} sides - list of sides, each side containing two points\n * @property {mat4} transforms - transforms to apply to the sides, see transform()\n */\n\n/**\n * Create a new 2D geometry composed of unordered sides (two connected points).\n * @param {Array} [sides] - list of sides where each side is an array of two points\n * @returns {geom2} a new geometry\n * @alias module:modeling/geometries/geom2.create\n */\nconst create = (sides) => {\n  if (sides === undefined) {\n    sides = [] // empty contents\n  }\n  return {\n    sides: sides,\n    transforms: mat4.create()\n  }\n}\n\nmodule.exports = create\n","const mat4 = require('../../maths/mat4')\nconst vec2 = require('../../maths/vec2')\n\nconst create = require('./create')\n\n/**\n * Create a new 2D geometry from the given compact binary data.\n * @param {Array} data - compact binary data\n * @returns {geom2} a new geometry\n * @alias module:modeling/geometries/geom2.fromCompactBinary\n */\nconst fromCompactBinary = (data) => {\n  if (data[0] !== 0) throw new Error('invalid compact binary data')\n\n  const created = create()\n\n  created.transforms = mat4.clone(data.slice(1, 17))\n\n  for (let i = 21; i < data.length; i += 4) {\n    const point0 = vec2.fromValues(data[i + 0], data[i + 1])\n    const point1 = vec2.fromValues(data[i + 2], data[i + 3])\n    created.sides.push([point0, point1])\n  }\n  // transfer known properties, i.e. color\n  if (data[17] >= 0) {\n    created.color = [data[17], data[18], data[19], data[20]]\n  }\n  // TODO: how about custom properties or fields ?\n  return created\n}\n\nmodule.exports = fromCompactBinary\n","const vec2 = require('../../maths/vec2')\n\nconst create = require('./create')\n\n/**\n * Create a new 2D geometry from the given points.\n * The direction (rotation) of the points is not relevant,\n * as the points can define a convex or a concave polygon.\n * The geometry must not self intersect, i.e. the sides cannot cross.\n * @param {Array} points - list of points in 2D space\n * @returns {geom2} a new geometry\n * @alias module:modeling/geometries/geom2.fromPoints\n */\nconst fromPoints = (points) => {\n  if (!Array.isArray(points)) {\n    throw new Error('the given points must be an array')\n  }\n  let length = points.length\n  if (length < 3) {\n    throw new Error('the given points must define a closed geometry with three or more points')\n  }\n  // adjust length if the given points are closed by the same point\n  if (vec2.equals(points[0], points[length - 1])) --length\n\n  const sides = []\n  let prevpoint = points[length - 1]\n  for (let i = 0; i < length; i++) {\n    const point = points[i]\n    sides.push([vec2.clone(prevpoint), vec2.clone(point)])\n    prevpoint = point\n  }\n  return create(sides)\n}\n\nmodule.exports = fromPoints\n","/**\n * Represents a 2D geometry consisting of a list of sides.\n * @see {@link geom2} for data structure information.\n * @module modeling/geometries/geom2\n *\n * @example\n * colorize([0.5,0,1,1], square()) // purple square\n *\n * @example\n * {\n *   \"sides\": [[[-1,1],[-1,-1]],[[-1,-1],[1,-1]],[[1,-1],[1,1]],[[1,1],[-1,1]]],\n *   \"transforms\": [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],\n *   \"color\": [0.5,0,1,1]\n * }\n */\nmodule.exports = {\n  clone: require('./clone'),\n  create: require('./create'),\n  fromPoints: require('./fromPoints'),\n  fromCompactBinary: require('./fromCompactBinary'),\n  isA: require('./isA'),\n  reverse: require('./reverse'),\n  toOutlines: require('./toOutlines'),\n  toPoints: require('./toPoints'),\n  toSides: require('./toSides'),\n  toString: require('./toString'),\n  toCompactBinary: require('./toCompactBinary'),\n  transform: require('./transform'),\n  validate: require('./validate')\n}\n","/**\n * Determine if the given object is a 2D geometry.\n * @param {Object} object - the object to interrogate\n * @returns {Boolean} true, if the object matches a geom2 based object\n * @alias module:modeling/geometries/geom2.isA\n */\nconst isA = (object) => {\n  if (object && typeof object === 'object') {\n    if ('sides' in object && 'transforms' in object) {\n      if (Array.isArray(object.sides) && 'length' in object.transforms) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nmodule.exports = isA\n","const create = require('./create')\nconst toSides = require('./toSides')\n\n/**\n * Reverses the given geometry so that the sides are flipped in the opposite order.\n * This swaps the left (interior) and right (exterior) edges.\n * @param {geom2} geometry - the geometry to reverse\n * @returns {geom2} the new reversed geometry\n * @alias module:modeling/geometries/geom2.reverse\n *\n * @example\n * let newgeometry = reverse(geometry)\n */\nconst reverse = (geometry) => {\n  const oldsides = toSides(geometry)\n\n  const newsides = oldsides.map((side) => [side[1], side[0]])\n  newsides.reverse() // is this required?\n  return create(newsides)\n}\n\nmodule.exports = reverse\n","/**\n * Produces a compact binary representation from the given geometry.\n * @param {geom2} geometry - the geometry\n * @returns {TypedArray} compact binary representation\n * @alias module:modeling/geometries/geom2.toCompactBinary\n */\nconst toCompactBinary = (geometry) => {\n  const sides = geometry.sides\n  const transforms = geometry.transforms\n  let color = [-1, -1, -1, -1]\n  if (geometry.color) color = geometry.color\n\n  // FIXME why Float32Array?\n  const compacted = new Float32Array(1 + 16 + 4 + (sides.length * 4)) // type + transforms + color + sides data\n\n  compacted[0] = 0 // type code: 0 => geom2, 1 => geom3 , 2 => path2\n\n  compacted[1] = transforms[0]\n  compacted[2] = transforms[1]\n  compacted[3] = transforms[2]\n  compacted[4] = transforms[3]\n  compacted[5] = transforms[4]\n  compacted[6] = transforms[5]\n  compacted[7] = transforms[6]\n  compacted[8] = transforms[7]\n  compacted[9] = transforms[8]\n  compacted[10] = transforms[9]\n  compacted[11] = transforms[10]\n  compacted[12] = transforms[11]\n  compacted[13] = transforms[12]\n  compacted[14] = transforms[13]\n  compacted[15] = transforms[14]\n  compacted[16] = transforms[15]\n\n  compacted[17] = color[0]\n  compacted[18] = color[1]\n  compacted[19] = color[2]\n  compacted[20] = color[3]\n\n  for (let i = 0; i < sides.length; i++) {\n    const ci = i * 4 + 21\n    const point0 = sides[i][0]\n    const point1 = sides[i][1]\n    compacted[ci + 0] = point0[0]\n    compacted[ci + 1] = point0[1]\n    compacted[ci + 2] = point1[0]\n    compacted[ci + 3] = point1[1]\n  }\n  // TODO: how about custom properties or fields ?\n  return compacted\n}\n\nmodule.exports = toCompactBinary\n","const vec2 = require('../../maths/vec2')\n\nconst toSides = require('./toSides')\n\n/*\n * Create a list of edges which SHARE vertices.\n * This allows the edges to be traversed in order.\n */\nconst toSharedVertices = (sides) => {\n  const unique = new Map() // {key: vertex}\n  const getUniqueVertex = (vertex) => {\n    const key = vertex.toString()\n    if (unique.has(key)) {\n      return unique.get(key)\n    } else {\n      unique.set(key, vertex)\n      return vertex\n    }\n  }\n\n  return sides.map((side) => side.map(getUniqueVertex))\n}\n\n/*\n * Convert a list of sides into a map from vertex to edges.\n */\nconst toVertexMap = (sides) => {\n  const vertexMap = new Map()\n  // first map to edges with shared vertices\n  const edges = toSharedVertices(sides)\n  // construct adjacent edges map\n  edges.forEach((edge) => {\n    if (vertexMap.has(edge[0])) {\n      vertexMap.get(edge[0]).push(edge)\n    } else {\n      vertexMap.set(edge[0], [edge])\n    }\n  })\n  return vertexMap\n}\n\n/**\n * Create the outline(s) of the given geometry.\n * @param {geom2} geometry - geometry to create outlines from\n * @returns {Array} an array of outlines, where each outline is an array of ordered points\n * @alias module:modeling/geometries/geom2.toOutlines\n *\n * @example\n * let geometry = subtract(rectangle({size: [5, 5]}), rectangle({size: [3, 3]}))\n * let outlines = toOutlines(geometry) // returns two outlines\n */\nconst toOutlines = (geometry) => {\n  const vertexMap = toVertexMap(toSides(geometry)) // {vertex: [edges]}\n  const outlines = []\n  while (true) {\n    let startSide\n    for (const [vertex, edges] of vertexMap) {\n      startSide = edges.shift()\n      if (!startSide) {\n        vertexMap.delete(vertex)\n        continue\n      }\n      break\n    }\n    if (startSide === undefined) break // all starting sides have been visited\n\n    const connectedVertexPoints = []\n    const startVertex = startSide[0]\n    while (true) {\n      connectedVertexPoints.push(startSide[0])\n      const nextVertex = startSide[1]\n      if (nextVertex === startVertex) break // the outline has been closed\n      const nextPossibleSides = vertexMap.get(nextVertex)\n      if (!nextPossibleSides) {\n        throw new Error(`geometry is not closed at vertex ${nextVertex}`)\n      }\n      const nextSide = popNextSide(startSide, nextPossibleSides)\n      if (nextPossibleSides.length === 0) {\n        vertexMap.delete(nextVertex)\n      }\n      startSide = nextSide\n    } // inner loop\n\n    // due to the logic of fromPoints()\n    // move the first point to the last\n    if (connectedVertexPoints.length > 0) {\n      connectedVertexPoints.push(connectedVertexPoints.shift())\n    }\n    outlines.push(connectedVertexPoints)\n  } // outer loop\n  vertexMap.clear()\n  return outlines\n}\n\n// find the first counter-clockwise edge from startSide and pop from nextSides\nconst popNextSide = (startSide, nextSides) => {\n  if (nextSides.length === 1) {\n    return nextSides.pop()\n  }\n  const v0 = vec2.create()\n  const startAngle = vec2.angleDegrees(vec2.subtract(v0, startSide[1], startSide[0]))\n  let bestAngle\n  let bestIndex\n  nextSides.forEach((nextSide, index) => {\n    const nextAngle = vec2.angleDegrees(vec2.subtract(v0, nextSide[1], nextSide[0]))\n    let angle = nextAngle - startAngle\n    if (angle < -180) angle += 360\n    if (angle >= 180) angle -= 360\n    if (bestIndex === undefined || angle > bestAngle) {\n      bestIndex = index\n      bestAngle = angle\n    }\n  })\n  const nextSide = nextSides[bestIndex]\n  nextSides.splice(bestIndex, 1) // remove side from list\n  return nextSide\n}\n\nmodule.exports = toOutlines\n","const toSides = require('./toSides')\n\n/**\n * Produces an array of points from the given geometry.\n * The returned array should not be modified as the points are shared with the geometry.\n * NOTE: The points returned do NOT define an order. Use toOutlines() for ordered points.\n * @param {geom2} geometry - the geometry\n * @returns {Array} an array of points\n * @alias module:modeling/geometries/geom2.toPoints\n *\n * @example\n * let sharedpoints = toPoints(geometry)\n */\nconst toPoints = (geometry) => {\n  const sides = toSides(geometry)\n  const points = sides.map((side) => side[0])\n  // due to the logic of fromPoints()\n  // move the first point to the last\n  if (points.length > 0) {\n    points.push(points.shift())\n  }\n  return points\n}\n\nmodule.exports = toPoints\n","const applyTransforms = require('./applyTransforms')\n\n/**\n * Produces an array of sides from the given geometry.\n * The returned array should not be modified as the data is shared with the geometry.\n * NOTE: The sides returned do NOT define an order. Use toOutlines() for ordered points.\n * @param {geom2} geometry - the geometry\n * @returns {Array} an array of sides\n * @alias module:modeling/geometries/geom2.toSides\n *\n * @example\n * let sharedsides = toSides(geometry)\n */\nconst toSides = (geometry) => applyTransforms(geometry).sides\n\nmodule.exports = toSides\n","const vec2 = require('../../maths/vec2')\n\nconst toSides = require('./toSides')\n\n/**\n * Create a string representing the contents of the given geometry.\n * @param {geom2} geometry - the geometry\n * @returns {String} a representative string\n * @alias module:modeling/geometries/geom2.toString\n *\n * @example\n * console.out(toString(geometry))\n */\nconst toString = (geometry) => {\n  const sides = toSides(geometry)\n  let result = 'geom2 (' + sides.length + ' sides):\\n[\\n'\n  sides.forEach((side) => {\n    result += '  [' + vec2.toString(side[0]) + ', ' + vec2.toString(side[1]) + ']\\n'\n  })\n  result += ']\\n'\n  return result\n}\n\nmodule.exports = toString\n","const mat4 = require('../../maths/mat4')\n\n/**\n * Transform the given geometry using the given matrix.\n * This is a lazy transform of the sides, as this function only adjusts the transforms.\n * The transforms are applied when accessing the sides via toSides().\n * @param {mat4} matrix - the matrix to transform with\n * @param {geom2} geometry - the geometry to transform\n * @returns {geom2} a new geometry\n * @alias module:modeling/geometries/geom2.transform\n *\n * @example\n * let newgeometry = transform(fromZRotation(degToRad(90)), geometry)\n */\nconst transform = (matrix, geometry) => {\n  const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms)\n  return Object.assign({}, geometry, { transforms })\n}\n\nmodule.exports = transform\n","const vec2 = require('../../maths/vec2')\nconst isA = require('./isA')\nconst toOutlines = require('./toOutlines')\n\n/**\n * Determine if the given object is a valid geom2.\n * Checks for closedness, self-edges, and valid data points.\n *\n * **If the geometry is not valid, an exception will be thrown with details of the geometry error.**\n *\n * @param {Object} object - the object to interrogate\n * @throws {Error} error if the geometry is not valid\n * @alias module:modeling/geometries/geom2.validate\n */\nconst validate = (object) => {\n  if (!isA(object)) {\n    throw new Error('invalid geom2 structure')\n  }\n\n  // check for closedness\n  toOutlines(object)\n\n  // check for self-edges\n  object.sides.forEach((side) => {\n    if (vec2.equals(side[0], side[1])) {\n      throw new Error(`geom2 self-edge ${side[0]}`)\n    }\n  })\n\n  // check transforms\n  if (!object.transforms.every(Number.isFinite)) {\n    throw new Error(`geom2 invalid transforms ${object.transforms}`)\n  }\n}\n\nmodule.exports = validate\n","const mat4 = require('../../maths/mat4')\n\nconst poly3 = require('../poly3')\n\n/*\n * Apply the transforms of the given geometry.\n * NOTE: This function must be called BEFORE exposing any data. See toPolygons.\n * @param {geom3} geometry - the geometry to transform\n * @returns {geom3} the given geometry\n * @example\n * geometry = applyTransforms(geometry)\n */\nconst applyTransforms = (geometry) => {\n  if (mat4.isIdentity(geometry.transforms)) return geometry\n\n  // apply transforms to each polygon\n  geometry.polygons = geometry.polygons.map((polygon) => poly3.transform(geometry.transforms, polygon))\n  // reset transforms\n  geometry.transforms = mat4.create()\n  return geometry\n}\n\nmodule.exports = applyTransforms\n","/**\n * Performs a shallow clone of the given geometry.\n * @param {geom3} geometry - the geometry to clone\n * @returns {geom3} a new geometry\n * @alias module:modeling/geometries/geom3.clone\n */\nconst clone = (geometry) => Object.assign({}, geometry)\n\nmodule.exports = clone\n","const mat4 = require('../../maths/mat4')\n\n/**\n * Represents a 3D geometry consisting of a list of polygons.\n * @typedef {Object} geom3\n * @property {Array} polygons - list of polygons, each polygon containing three or more points\n * @property {mat4} transforms - transforms to apply to the polygons, see transform()\n */\n\n/**\n * Create a new 3D geometry composed of the given polygons.\n * @param {Array} [polygons] - list of polygons, or undefined\n * @returns {geom3} a new geometry\n * @alias module:modeling/geometries/geom3.create\n */\nconst create = (polygons) => {\n  if (polygons === undefined) {\n    polygons = [] // empty contents\n  }\n  return {\n    polygons,\n    transforms: mat4.create()\n  }\n}\n\nmodule.exports = create\n","const vec3 = require('../../maths/vec3')\nconst mat4 = require('../../maths/mat4')\n\nconst poly3 = require('../poly3')\n\nconst create = require('./create')\n\n/**\n * Construct a new 3D geometry from the given compact binary data.\n * @param {TypedArray} data - compact binary data\n * @returns {geom3} a new geometry\n * @alias module:modeling/geometries/geom3.fromCompactBinary\n */\nconst fromCompactBinary = (data) => {\n  if (data[0] !== 1) throw new Error('invalid compact binary data')\n\n  const created = create()\n\n  created.transforms = mat4.clone(data.slice(1, 17))\n\n  const numberOfVertices = data[21]\n  let ci = 22\n  let vi = data.length - (numberOfVertices * 3)\n  while (vi < data.length) {\n    const verticesPerPolygon = data[ci]\n    ci++\n\n    const vertices = []\n    for (let i = 0; i < verticesPerPolygon; i++) {\n      vertices.push(vec3.fromValues(data[vi], data[vi + 1], data[vi + 2]))\n      vi += 3\n    }\n    created.polygons.push(poly3.create(vertices))\n  }\n\n  // transfer known properties, i.e. color\n  if (data[17] >= 0) {\n    created.color = [data[17], data[18], data[19], data[20]]\n  }\n  // TODO: how about custom properties or fields ?\n  return created\n}\n\nmodule.exports = fromCompactBinary\n","const poly3 = require('../poly3')\n\nconst create = require('./create')\n\n/**\n * Construct a new 3D geometry from a list of points.\n * The list of points should contain sub-arrays, each defining a single polygon of points.\n * In addition, the points should follow the right-hand rule for rotation in order to\n * define an external facing polygon.\n * @param {Array} listofpoints - list of lists, where each list is a set of points to construct a polygon\n * @returns {geom3} a new geometry\n * @alias module:modeling/geometries/geom3.fromPoints\n */\nconst fromPoints = (listofpoints) => {\n  if (!Array.isArray(listofpoints)) {\n    throw new Error('the given points must be an array')\n  }\n\n  const polygons = listofpoints.map((points, index) => {\n    // TODO catch the error, and rethrow with index\n    const polygon = poly3.create(points)\n    return polygon\n  })\n  const result = create(polygons)\n  return result\n}\n\nmodule.exports = fromPoints\n","/**\n * Represents a 3D geometry consisting of a list of polygons.\n * @see {@link geom3} for data structure information.\n * @module modeling/geometries/geom3\n *\n * @example\n * colorize([0,0.5,1,0.6], cube()) // transparent ice cube\n *\n * @example\n * {\n *   \"polygons\": [\n *     {\"vertices\": [[-1,-1,-1], [-1,-1,1], [-1,1,1], [-1,1,-1]]},\n *     {\"vertices\": [[1,-1,-1], [1,1,-1], [1,1,1], [1,-1,1]]},\n *     {\"vertices\": [[-1,-1,-1], [1,-1,-1], [1,-1,1], [-1,-1,1]]},\n *     {\"vertices\": [[-1,1,-1], [-1,1,1], [1,1,1], [1,1,-1]]},\n *     {\"vertices\": [[-1,-1,-1], [-1,1,-1], [1,1,-1], [1,-1,-1]]},\n *     {\"vertices\": [[-1,-1,1], [1,-1,1], [1,1,1], [-1,1,1]]}\n *   ],\n *   \"transforms\": [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],\n *   \"color\": [0,0.5,1,0.6]\n * }\n */\nmodule.exports = {\n  clone: require('./clone'),\n  create: require('./create'),\n  fromPoints: require('./fromPoints'),\n  fromCompactBinary: require('./fromCompactBinary'),\n  invert: require('./invert'),\n  isA: require('./isA'),\n  toPoints: require('./toPoints'),\n  toPolygons: require('./toPolygons'),\n  toString: require('./toString'),\n  toCompactBinary: require('./toCompactBinary'),\n  transform: require('./transform'),\n  validate: require('./validate')\n}\n","const poly3 = require('../poly3')\n\nconst create = require('./create')\nconst toPolygons = require('./toPolygons')\n\n/**\n * Invert the given geometry, transposing solid and empty space.\n * @param {geom3} geometry - the geometry to invert\n * @return {geom3} a new geometry\n * @alias module:modeling/geometries/geom3.invert\n */\nconst invert = (geometry) => {\n  const polygons = toPolygons(geometry)\n  const newpolygons = polygons.map((polygon) => poly3.invert(polygon))\n  return create(newpolygons)\n}\n\nmodule.exports = invert\n","/**\n * Determine if the given object is a 3D geometry.\n * @param {Object} object - the object to interrogate\n * @returns {Boolean} true if the object matches a geom3\n * @alias module:modeling/geometries/geom3.isA\n */\nconst isA = (object) => {\n  if (object && typeof object === 'object') {\n    if ('polygons' in object && 'transforms' in object) {\n      if (Array.isArray(object.polygons) && 'length' in object.transforms) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nmodule.exports = isA\n","const poly3 = require('../poly3')\n\n/**\n * Return the given geometry in compact binary representation.\n * @param {geom3} geometry - the geometry\n * @return {TypedArray} compact binary representation\n * @alias module:modeling/geometries/geom3.toCompactBinary\n */\nconst toCompactBinary = (geometry) => {\n  const polygons = geometry.polygons\n  const transforms = geometry.transforms\n\n  const numberOfPolygons = polygons.length\n  const numberOfVertices = polygons.reduce((count, polygon) => count + polygon.vertices.length, 0)\n  let color = [-1, -1, -1, -1]\n  if (geometry.color) color = geometry.color\n\n  // FIXME why Float32Array?\n  const compacted = new Float32Array(1 + 16 + 4 + 1 + numberOfPolygons + (numberOfVertices * 3))\n  // type + transforms + color + numberOfPolygons + numberOfVerticesPerPolygon[] + vertices data[]\n\n  compacted[0] = 1 // type code: 0 => geom2, 1 => geom3 , 2 => path2\n\n  compacted[1] = transforms[0]\n  compacted[2] = transforms[1]\n  compacted[3] = transforms[2]\n  compacted[4] = transforms[3]\n  compacted[5] = transforms[4]\n  compacted[6] = transforms[5]\n  compacted[7] = transforms[6]\n  compacted[8] = transforms[7]\n  compacted[9] = transforms[8]\n  compacted[10] = transforms[9]\n  compacted[11] = transforms[10]\n  compacted[12] = transforms[11]\n  compacted[13] = transforms[12]\n  compacted[14] = transforms[13]\n  compacted[15] = transforms[14]\n  compacted[16] = transforms[15]\n\n  compacted[17] = color[0]\n  compacted[18] = color[1]\n  compacted[19] = color[2]\n  compacted[20] = color[3]\n\n  compacted[21] = numberOfVertices\n\n  let ci = 22\n  let vi = ci + numberOfPolygons\n  polygons.forEach((polygon) => {\n    const points = poly3.toPoints(polygon)\n    // record the number of vertices per polygon\n    compacted[ci] = points.length\n    ci++\n    // convert the vertices\n    for (let i = 0; i < points.length; i++) {\n      const point = points[i]\n      compacted[vi + 0] = point[0]\n      compacted[vi + 1] = point[1]\n      compacted[vi + 2] = point[2]\n      vi += 3\n    }\n  })\n  // TODO: how about custom properties or fields ?\n  return compacted\n}\n\nmodule.exports = toCompactBinary\n","const poly3 = require('../poly3')\n\nconst toPolygons = require('./toPolygons')\n\n/**\n * Return the given geometry as a list of points, after applying transforms.\n * The returned array should not be modified as the points are shared with the geometry.\n * @param {geom3} geometry - the geometry\n * @return {Array} list of points, where each sub-array represents a polygon\n * @alias module:modeling/geometries/geom3.toPoints\n */\nconst toPoints = (geometry) => {\n  const polygons = toPolygons(geometry)\n  const listofpoints = polygons.map((polygon) => poly3.toPoints(polygon))\n  return listofpoints\n}\n\nmodule.exports = toPoints\n","const applyTransforms = require('./applyTransforms')\n\n/**\n * Produces an array of polygons from the given geometry, after applying transforms.\n * The returned array should not be modified as the polygons are shared with the geometry.\n * @param {geom3} geometry - the geometry\n * @returns {Array} an array of polygons\n * @alias module:modeling/geometries/geom3.toPolygons\n *\n * @example\n * let sharedpolygons = toPolygons(geometry)\n */\nconst toPolygons = (geometry) => applyTransforms(geometry).polygons\n\nmodule.exports = toPolygons\n","const poly3 = require('../poly3')\n\nconst toPolygons = require('./toPolygons')\n\n/**\n * Create a string representing the contents of the given geometry.\n * @param {geom3} geometry - the geometry\n * @returns {String} a representative string\n * @alias module:modeling/geometries/geom3.toString\n *\n * @example\n * console.out(toString(geometry))\n */\nconst toString = (geometry) => {\n  const polygons = toPolygons(geometry)\n  let result = 'geom3 (' + polygons.length + ' polygons):\\n'\n  polygons.forEach((polygon) => {\n    result += '  ' + poly3.toString(polygon) + '\\n'\n  })\n  return result\n}\n\nmodule.exports = toString\n","const mat4 = require('../../maths/mat4')\n\n/**\n * Transform the given geometry using the given matrix.\n * This is a lazy transform of the polygons, as this function only adjusts the transforms.\n * See applyTransforms() for the actual application of the transforms to the polygons.\n * @param {mat4} matrix - the matrix to transform with\n * @param {geom3} geometry - the geometry to transform\n * @returns {geom3} a new geometry\n * @alias module:modeling/geometries/geom3.transform\n *\n * @example\n * let newgeometry = transform(fromXRotation(degToRad(90)), geometry)\n */\nconst transform = (matrix, geometry) => {\n  const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms)\n  return Object.assign({}, geometry, { transforms })\n}\n\nmodule.exports = transform\n","const poly3 = require('../poly3')\nconst isA = require('./isA')\n\n/**\n * Determine if the given object is a valid 3D geometry.\n * Checks for valid data structure, convex polygon faces, and manifold edges.\n *\n * **If the geometry is not valid, an exception will be thrown with details of the geometry error.**\n *\n * @param {Object} object - the object to interrogate\n * @throws {Error} error if the geometry is not valid\n * @alias module:modeling/geometries/geom3.validate\n */\nconst validate = (object) => {\n  if (!isA(object)) {\n    throw new Error('invalid geom3 structure')\n  }\n\n  // check polygons\n  object.polygons.forEach(poly3.validate)\n  validateManifold(object)\n\n  // check transforms\n  if (!object.transforms.every(Number.isFinite)) {\n    throw new Error(`geom3 invalid transforms ${object.transforms}`)\n  }\n\n  // TODO: check for self-intersecting\n}\n\n/*\n * Check manifold edge condition: Every edge is in exactly 2 faces\n */\nconst validateManifold = (object) => {\n  // count of each edge\n  const edgeCount = new Map()\n  object.polygons.forEach(({ vertices }) => {\n    vertices.forEach((v, i) => {\n      const v1 = `${v}`\n      const v2 = `${vertices[(i + 1) % vertices.length]}`\n      // sort for undirected edge\n      const edge = `${v1}/${v2}`\n      const count = edgeCount.has(edge) ? edgeCount.get(edge) : 0\n      edgeCount.set(edge, count + 1)\n    })\n  })\n\n  // check that edges are always matched\n  const nonManifold = []\n  edgeCount.forEach((count, edge) => {\n    const complementEdge = edge.split('/').reverse().join('/')\n    const complementCount = edgeCount.get(complementEdge)\n    if (count !== complementCount) {\n      nonManifold.push(edge.replace('/', ' -> '))\n    }\n  })\n  if (nonManifold.length > 0) {\n    throw new Error(`non-manifold edges ${nonManifold.length}\\n${nonManifold.join('\\n')}`)\n  }\n}\n\nmodule.exports = validate\n","/**\n * Geometries are objects that represent the contents of primitives or the results of operations.\n * Note: Geometries are considered immutable, so never change the contents directly.\n *\n * @see {@link geom2} - 2D geometry consisting of sides\n * @see {@link geom3} - 3D geometry consisting of polygons\n * @see {@link path2} - 2D geometry consisting of ordered points\n * @see {@link poly2} - 2D polygon consisting of ordered vertices\n * @see {@link poly3} - 3D polygon consisting of ordered vertices\n *\n * @module modeling/geometries\n * @example\n * const { geom2, geom3, path2, poly2, poly3 } = require('@jscad/modeling').geometries\n */\nmodule.exports = {\n  geom2: require('./geom2'),\n  geom3: require('./geom3'),\n  path2: require('./path2'),\n  poly2: require('./poly2'),\n  poly3: require('./poly3')\n}\n","const { TAU } = require('../../maths/constants')\nconst vec2 = require('../../maths/vec2')\n\nconst fromPoints = require('./fromPoints')\nconst toPoints = require('./toPoints')\n\n/**\n * Append a series of points to the given geometry that represent an arc.\n * This implementation follows the SVG specifications.\n * @see http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n * @param {Object} options - options for construction\n * @param {vec2} options.endpoint - end point of arc (REQUIRED)\n * @param {vec2} [options.radius=[0,0]] - radius of arc (X and Y)\n * @param {Number} [options.xaxisrotation=0] - rotation (RADIANS) of the X axis of the arc with respect to the X axis of the coordinate system\n * @param {Boolean} [options.clockwise=false] - draw an arc clockwise with respect to the center point\n * @param {Boolean} [options.large=false] - draw an arc longer than TAU / 2 radians\n * @param {Number} [options.segments=16] - number of segments per full rotation\n * @param {path2} geometry - the path of which to append the arc\n * @returns {path2} a new path with the appended points\n * @alias module:modeling/geometries/path2.appendArc\n *\n * @example\n * let p1 = path2.fromPoints({}, [[27.5,-22.96875]]);\n * p1 = path2.appendPoints([[27.5,-3.28125]], p1);\n * p1 = path2.appendArc({endpoint: [12.5, -22.96875], radius: [15, -19.6875]}, p1);\n */\nconst appendArc = (options, geometry) => {\n  const defaults = {\n    radius: [0, 0], // X and Y radius\n    xaxisrotation: 0,\n    clockwise: false,\n    large: false,\n    segments: 16\n  }\n  let { endpoint, radius, xaxisrotation, clockwise, large, segments } = Object.assign({}, defaults, options)\n\n  // validate the given options\n  if (!Array.isArray(endpoint)) throw new Error('endpoint must be an array of X and Y values')\n  if (endpoint.length < 2) throw new Error('endpoint must contain X and Y values')\n  endpoint = vec2.clone(endpoint)\n\n  if (!Array.isArray(radius)) throw new Error('radius must be an array of X and Y values')\n  if (radius.length < 2) throw new Error('radius must contain X and Y values')\n\n  if (segments < 4) throw new Error('segments must be four or more')\n\n  const decimals = 100000\n\n  // validate the given geometry\n  if (geometry.isClosed) {\n    throw new Error('the given path cannot be closed')\n  }\n\n  const points = toPoints(geometry)\n  if (points.length < 1) {\n    throw new Error('the given path must contain one or more points (as the starting point for the arc)')\n  }\n\n  let xradius = radius[0]\n  let yradius = radius[1]\n  const startpoint = points[points.length - 1]\n\n  // round to precision in order to have determinate calculations\n  xradius = Math.round(xradius * decimals) / decimals\n  yradius = Math.round(yradius * decimals) / decimals\n  endpoint = vec2.fromValues(Math.round(endpoint[0] * decimals) / decimals, Math.round(endpoint[1] * decimals) / decimals)\n\n  const sweepFlag = !clockwise\n  let newpoints = []\n  if ((xradius === 0) || (yradius === 0)) {\n    // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes:\n    // If rx = 0 or ry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop\n    newpoints.push(endpoint)\n  } else {\n    xradius = Math.abs(xradius)\n    yradius = Math.abs(yradius)\n\n    // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes :\n    const phi = xaxisrotation\n    const cosphi = Math.cos(phi)\n    const sinphi = Math.sin(phi)\n    const minushalfdistance = vec2.subtract(vec2.create(), startpoint, endpoint)\n    vec2.scale(minushalfdistance, minushalfdistance, 0.5)\n    // F.6.5.1:\n    // round to precision in order to have determinate calculations\n    const x = Math.round((cosphi * minushalfdistance[0] + sinphi * minushalfdistance[1]) * decimals) / decimals\n    const y = Math.round((-sinphi * minushalfdistance[0] + cosphi * minushalfdistance[1]) * decimals) / decimals\n    const startTranslated = vec2.fromValues(x, y)\n    // F.6.6.2:\n    const biglambda = (startTranslated[0] * startTranslated[0]) / (xradius * xradius) + (startTranslated[1] * startTranslated[1]) / (yradius * yradius)\n    if (biglambda > 1.0) {\n      // F.6.6.3:\n      const sqrtbiglambda = Math.sqrt(biglambda)\n      xradius *= sqrtbiglambda\n      yradius *= sqrtbiglambda\n      // round to precision in order to have determinate calculations\n      xradius = Math.round(xradius * decimals) / decimals\n      yradius = Math.round(yradius * decimals) / decimals\n    }\n    // F.6.5.2:\n    let multiplier1 = Math.sqrt((xradius * xradius * yradius * yradius - xradius * xradius * startTranslated[1] * startTranslated[1] - yradius * yradius * startTranslated[0] * startTranslated[0]) / (xradius * xradius * startTranslated[1] * startTranslated[1] + yradius * yradius * startTranslated[0] * startTranslated[0]))\n    if (sweepFlag === large) multiplier1 = -multiplier1\n    const centerTranslated = vec2.fromValues(xradius * startTranslated[1] / yradius, -yradius * startTranslated[0] / xradius)\n    vec2.scale(centerTranslated, centerTranslated, multiplier1)\n    // F.6.5.3:\n    let center = vec2.fromValues(cosphi * centerTranslated[0] - sinphi * centerTranslated[1], sinphi * centerTranslated[0] + cosphi * centerTranslated[1])\n    center = vec2.add(center, center, vec2.scale(vec2.create(), vec2.add(vec2.create(), startpoint, endpoint), 0.5))\n\n    // F.6.5.5:\n    const vector1 = vec2.fromValues((startTranslated[0] - centerTranslated[0]) / xradius, (startTranslated[1] - centerTranslated[1]) / yradius)\n    const vector2 = vec2.fromValues((-startTranslated[0] - centerTranslated[0]) / xradius, (-startTranslated[1] - centerTranslated[1]) / yradius)\n    const theta1 = vec2.angleRadians(vector1)\n    const theta2 = vec2.angleRadians(vector2)\n    let deltatheta = theta2 - theta1\n    deltatheta = deltatheta % TAU\n    if ((!sweepFlag) && (deltatheta > 0)) {\n      deltatheta -= TAU\n    } else if ((sweepFlag) && (deltatheta < 0)) {\n      deltatheta += TAU\n    }\n\n    // Ok, we have the center point and angle range (from theta1, deltatheta radians) so we can create the ellipse\n    let numsteps = Math.ceil(Math.abs(deltatheta) / TAU * segments) + 1\n    if (numsteps < 1) numsteps = 1\n    for (let step = 1; step < numsteps; step++) {\n      const theta = theta1 + step / numsteps * deltatheta\n      const costheta = Math.cos(theta)\n      const sintheta = Math.sin(theta)\n      // F.6.3.1:\n      const point = vec2.fromValues(cosphi * xradius * costheta - sinphi * yradius * sintheta, sinphi * xradius * costheta + cosphi * yradius * sintheta)\n      vec2.add(point, point, center)\n      newpoints.push(point)\n    }\n    // ensure end point is precisely what user gave as parameter\n    if (numsteps) newpoints.push(options.endpoint)\n  }\n  newpoints = points.concat(newpoints)\n  const result = fromPoints({}, newpoints)\n  return result\n}\n\nmodule.exports = appendArc\n","const { TAU } = require('../../maths/constants')\nconst vec2 = require('../../maths/vec2')\nconst vec3 = require('../../maths/vec2')\n\nconst appendPoints = require('./appendPoints')\nconst toPoints = require('./toPoints')\n\n/**\n * Append a series of points to the given geometry that represent a Bezier curve.\n * The Bézier curve starts at the last point in the given geometry, and ends at the last control point.\n * The other control points are intermediate control points to transition the curve from start to end points.\n * The first control point may be null to ensure a smooth transition occurs. In this case,\n * the second to last point of the given geometry is mirrored into the control points of the Bezier curve.\n * In other words, the trailing gradient of the geometry matches the new gradient of the curve.\n * @param {Object} options - options for construction\n * @param {Array} options.controlPoints - list of control points (2D) for the bezier curve\n * @param {Number} [options.segment=16] - number of segments per 360 rotation\n * @param {path2} geometry - the path of which to appended points\n * @returns {path2} a new path with the appended points\n * @alias module:modeling/geometries/path2.appendBezier\n *\n * @example\n * let p5 = path2.create({}, [[10,-20]])\n * p5 = path2.appendBezier({controlPoints: [[10,-10],[25,-10],[25,-20]]}, p5);\n * p5 = path2.appendBezier({controlPoints: [null, [25,-30],[40,-30],[40,-20]]}, p5)\n */\nconst appendBezier = (options, geometry) => {\n  const defaults = {\n    segments: 16\n  }\n  let { controlPoints, segments } = Object.assign({}, defaults, options)\n\n  // validate the given options\n  if (!Array.isArray(controlPoints)) throw new Error('controlPoints must be an array of one or more points')\n  if (controlPoints.length < 1) throw new Error('controlPoints must be an array of one or more points')\n\n  if (segments < 4) throw new Error('segments must be four or more')\n\n  // validate the given geometry\n  if (geometry.isClosed) {\n    throw new Error('the given geometry cannot be closed')\n  }\n\n  const points = toPoints(geometry)\n  if (points.length < 1) {\n    throw new Error('the given path must contain one or more points (as the starting point for the bezier curve)')\n  }\n\n  // make a copy of the control points\n  controlPoints = controlPoints.slice()\n\n  // special handling of null control point (only first is allowed)\n  const firstControlPoint = controlPoints[0]\n  if (firstControlPoint === null) {\n    if (controlPoints.length < 2) {\n      throw new Error('a null control point must be passed with one more control points')\n    }\n    // special handling of a previous bezier curve\n    let lastBezierControlPoint = points[points.length - 2]\n    if ('lastBezierControlPoint' in geometry) {\n      lastBezierControlPoint = geometry.lastBezierControlPoint\n    }\n    if (!Array.isArray(lastBezierControlPoint)) {\n      throw new Error('the given path must contain TWO or more points if given a null control point')\n    }\n    // replace the first control point with the mirror of the last bezier control point\n    const controlpoint = vec2.scale(vec2.create(), points[points.length - 1], 2)\n    vec2.subtract(controlpoint, controlpoint, lastBezierControlPoint)\n\n    controlPoints[0] = controlpoint\n  }\n\n  // add a control point for the previous end point\n  controlPoints.unshift(points[points.length - 1])\n\n  const bezierOrder = controlPoints.length - 1\n  const factorials = []\n  let fact = 1\n  for (let i = 0; i <= bezierOrder; ++i) {\n    if (i > 0) fact *= i\n    factorials.push(fact)\n  }\n\n  const binomials = []\n  for (let i = 0; i <= bezierOrder; ++i) {\n    const binomial = factorials[bezierOrder] / (factorials[i] * factorials[bezierOrder - i])\n    binomials.push(binomial)\n  }\n\n  const v0 = vec2.create()\n  const v1 = vec2.create()\n  const v3 = vec3.create()\n  const getPointForT = (t) => {\n    let tk = 1 // = pow(t,k)\n    let oneMinusTNMinusK = Math.pow(1 - t, bezierOrder) // = pow( 1-t, bezierOrder - k)\n    const invOneMinusT = (t !== 1) ? (1 / (1 - t)) : 1\n    const point = vec2.create() // 0, 0, 0\n    for (let k = 0; k <= bezierOrder; ++k) {\n      if (k === bezierOrder) oneMinusTNMinusK = 1\n      const bernsteinCoefficient = binomials[k] * tk * oneMinusTNMinusK\n      const derivativePoint = vec2.scale(v0, controlPoints[k], bernsteinCoefficient)\n      vec2.add(point, point, derivativePoint)\n      tk *= t\n      oneMinusTNMinusK *= invOneMinusT\n    }\n    return point\n  }\n\n  const newpoints = []\n  const newpointsT = []\n  const numsteps = bezierOrder + 1\n  for (let i = 0; i < numsteps; ++i) {\n    const t = i / (numsteps - 1)\n    const point = getPointForT(t)\n    newpoints.push(point)\n    newpointsT.push(t)\n  }\n\n  // subdivide each segment until the angle at each vertex becomes small enough:\n  let subdivideBase = 1\n  const maxangle = TAU / segments\n  const maxsinangle = Math.sin(maxangle)\n  while (subdivideBase < newpoints.length - 1) {\n    const dir1 = vec2.subtract(v0, newpoints[subdivideBase], newpoints[subdivideBase - 1])\n    vec2.normalize(dir1, dir1)\n    const dir2 = vec2.subtract(v1, newpoints[subdivideBase + 1], newpoints[subdivideBase])\n    vec2.normalize(dir2, dir2)\n    const sinangle = vec2.cross(v3, dir1, dir2) // the sine of the angle\n    if (Math.abs(sinangle[2]) > maxsinangle) {\n      // angle is too big, we need to subdivide\n      const t0 = newpointsT[subdivideBase - 1]\n      const t1 = newpointsT[subdivideBase + 1]\n      const newt0 = t0 + (t1 - t0) * 1 / 3\n      const newt1 = t0 + (t1 - t0) * 2 / 3\n      const point0 = getPointForT(newt0)\n      const point1 = getPointForT(newt1)\n      // remove the point at subdivideBase and replace with 2 new points:\n      newpoints.splice(subdivideBase, 1, point0, point1)\n      newpointsT.splice(subdivideBase, 1, newt0, newt1)\n      // re - evaluate the angles, starting at the previous junction since it has changed:\n      subdivideBase--\n      if (subdivideBase < 1) subdivideBase = 1\n    } else {\n      ++subdivideBase\n    }\n  }\n\n  // append to the new points to the given path\n  // but skip the first new point because it is identical to the last point in the given path\n  newpoints.shift()\n  const result = appendPoints(newpoints, geometry)\n  result.lastBezierControlPoint = controlPoints[controlPoints.length - 2]\n  return result\n}\n\nmodule.exports = appendBezier\n","const concat = require('./concat')\nconst create = require('./create')\n\n/**\n * Append the given list of points to the end of the given geometry.\n * @param {Array} points - the points (2D) to append to the given path\n * @param {path2} geometry - the given path\n * @returns {path2} a new path with the appended points\n * @alias module:modeling/geometries/path2.appendPoints\n * @example\n * let newpath = appendPoints([[3, 4], [4, 5]], oldpath)\n */\nconst appendPoints = (points, geometry) => concat(geometry, create(points))\n\nmodule.exports = appendPoints\n","const mat4 = require('../../maths/mat4')\nconst vec2 = require('../../maths/vec2')\n\n/*\n * Apply the transforms of the given geometry.\n * NOTE: This function must be called BEFORE exposing any data. See toPoints.\n * @param {path} geometry - the geometry to transform\n * @returns {path} the given geometry\n * @example\n * geometry = applyTransforms(geometry)\n */\nconst applyTransforms = (geometry) => {\n  if (mat4.isIdentity(geometry.transforms)) return geometry\n\n  geometry.points = geometry.points.map((point) => vec2.transform(vec2.create(), point, geometry.transforms))\n  geometry.transforms = mat4.create()\n  return geometry\n}\n\nmodule.exports = applyTransforms\n","/**\n * Performs a shallow clone of the give geometry.\n * @param {path2} geometry - the geometry to clone\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.clone\n */\nconst clone = (geometry) => Object.assign({}, geometry)\n\nmodule.exports = clone\n","const { EPS } = require('../../maths/constants')\n\nconst vec2 = require('../../maths/vec2')\n\nconst clone = require('./clone')\n\n/**\n * Close the given geometry.\n * @param {path2} geometry - the path to close\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.close\n */\nconst close = (geometry) => {\n  if (geometry.isClosed) return geometry\n\n  const cloned = clone(geometry)\n  cloned.isClosed = true\n\n  if (cloned.points.length > 1) {\n    // make sure the paths are formed properly\n    const points = cloned.points\n    const p0 = points[0]\n    let pn = points[points.length - 1]\n    while (vec2.distance(p0, pn) < (EPS * EPS)) {\n      points.pop()\n      if (points.length === 1) break\n      pn = points[points.length - 1]\n    }\n  }\n  return cloned\n}\n\nmodule.exports = close\n","const fromPoints = require('./fromPoints')\nconst toPoints = require('./toPoints')\n\nconst { equals } = require('../../maths/vec2')\n\n/**\n * Concatenate the given paths.\n *\n * If both contain the same point at the junction, merge it into one.\n * A concatenation of zero paths is an empty, open path.\n * A concatenation of one closed path to a series of open paths produces a closed path.\n * A concatenation of a path to a closed path is an error.\n * @param {...path2} paths - the paths to concatenate\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.concat\n *\n * @example\n * let newpath = concat(fromPoints({}, [[1, 2]]), fromPoints({}, [[3, 4]]))\n */\nconst concat = (...paths) => {\n  // Only the last path can be closed, producing a closed path.\n  let isClosed = false\n  let newpoints = []\n  paths.forEach((path, i) => {\n    const tmp = toPoints(path).slice()\n    if (newpoints.length > 0 && tmp.length > 0 && equals(tmp[0], newpoints[newpoints.length - 1])) tmp.shift()\n    if (tmp.length > 0 && isClosed) {\n      throw new Error(`Cannot concatenate to a closed path; check the ${i}th path`)\n    }\n    isClosed = path.isClosed\n    newpoints = newpoints.concat(tmp)\n  })\n  return fromPoints({ closed: isClosed }, newpoints)\n}\n\nmodule.exports = concat\n","const mat4 = require('../../maths/mat4')\n\n/**\n * Represents a 2D geometry consisting of a list of ordered points.\n * @typedef {Object} path2\n * @property {Array} points - list of ordered points\n * @property {Boolean} isClosed - true if the path is closed where start and end points are the same\n * @property {mat4} transforms - transforms to apply to the points, see transform()\n */\n\n/**\n * Create an empty, open path.\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.create\n *\n * @example\n * let newpath = create()\n */\nconst create = (points) => {\n  if (points === undefined) {\n    points = []\n  }\n  return {\n    points: points,\n    isClosed: false,\n    transforms: mat4.create()\n  }\n}\n\nmodule.exports = create\n","const vec2 = require('../../maths/vec2')\n\nconst toPoints = require('./toPoints')\n\n/**\n  * Determine if the given paths are equal.\n  * For closed paths, this includes equality under point order rotation.\n  * @param {path2} a - the first path to compare\n  * @param {path2} b - the second path to compare\n  * @returns {Boolean}\n  * @alias module:modeling/geometries/path2.equals\n  */\nconst equals = (a, b) => {\n  if (a.isClosed !== b.isClosed) {\n    return false\n  }\n  if (a.points.length !== b.points.length) {\n    return false\n  }\n\n  const apoints = toPoints(a)\n  const bpoints = toPoints(b)\n\n  // closed paths might be equal under graph rotation\n  // so try comparison by rotating across all points\n  const length = apoints.length\n  let offset = 0\n  do {\n    let unequal = false\n    for (let i = 0; i < length; i++) {\n      if (!vec2.equals(apoints[i], bpoints[(i + offset) % length])) {\n        unequal = true\n        break\n      }\n    }\n    if (unequal === false) {\n      return true\n    }\n    // unequal open paths should only be compared once, never rotated\n    if (!a.isClosed) {\n      return false\n    }\n  } while (++offset < length)\n  return false\n}\n\nmodule.exports = equals\n","const mat4 = require('../../maths/mat4')\nconst vec2 = require('../../maths/vec2')\n\nconst create = require('./create')\n\n/**\n * Create a new path from the given compact binary data.\n * @param {TypedArray} data - compact binary data\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.fromCompactBinary\n */\nconst fromCompactBinary = (data) => {\n  if (data[0] !== 2) throw new Error('invalid compact binary data')\n\n  const created = create()\n\n  created.transforms = mat4.clone(data.slice(1, 17))\n\n  created.isClosed = !!data[17]\n\n  for (let i = 22; i < data.length; i += 2) {\n    const point = vec2.fromValues(data[i], data[i + 1])\n    created.points.push(point)\n  }\n  // transfer known properties, i.e. color\n  if (data[18] >= 0) {\n    created.color = [data[18], data[19], data[20], data[21]]\n  }\n  // TODO: how about custom properties or fields ?\n  return created\n}\n\nmodule.exports = fromCompactBinary\n","const { EPS } = require('../../maths/constants')\n\nconst vec2 = require('../../maths/vec2')\n\nconst close = require('./close')\nconst create = require('./create')\n\n/**\n * Create a new path from the given points.\n * The points must be provided an array of points,\n * where each point is an array of two numbers.\n * @param {Object} options - options for construction\n * @param {Boolean} [options.closed=false] - if the path should be open or closed\n * @param {Array} points - array of points (2D) from which to create the path\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.fromPoints\n *\n * @example:\n * my newpath = fromPoints({closed: true}, [[10, 10], [-10, 10]])\n */\nconst fromPoints = (options, points) => {\n  const defaults = { closed: false }\n  let { closed } = Object.assign({}, defaults, options)\n\n  let created = create()\n  created.points = points.map((point) => vec2.clone(point))\n\n  // check if first and last points are equal\n  if (created.points.length > 1) {\n    const p0 = created.points[0]\n    const pn = created.points[created.points.length - 1]\n    if (vec2.distance(p0, pn) < (EPS * EPS)) {\n      // and close automatically\n      closed = true\n    }\n  }\n  if (closed === true) created = close(created)\n\n  return created\n}\n\nmodule.exports = fromPoints\n","/**\n * Represents a 2D geometry consisting of a list of ordered points.\n * @see {@link path2} for data structure information.\n * @module modeling/geometries/path2\n *\n * @example\n * colorize([0,0,0,1], path2.fromPoints({ closed: true }, [[0,0], [4,0], [4,3]]))\n *\n * @example\n * {\n *   \"points\": [[0,0], [4,0], [4,3]],\n *   \"isClosed\": true,\n *   \"transforms\": [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],\n *   \"color\": [0,0,0,1]\n * }\n */\nmodule.exports = {\n  appendArc: require('./appendArc'),\n  appendBezier: require('./appendBezier'),\n  appendPoints: require('./appendPoints'),\n  clone: require('./clone'),\n  close: require('./close'),\n  concat: require('./concat'),\n  create: require('./create'),\n  equals: require('./equals'),\n  fromPoints: require('./fromPoints'),\n  fromCompactBinary: require('./fromCompactBinary'),\n  isA: require('./isA'),\n  reverse: require('./reverse'),\n  toPoints: require('./toPoints'),\n  toString: require('./toString'),\n  toCompactBinary: require('./toCompactBinary'),\n  transform: require('./transform'),\n  validate: require('./validate')\n}\n","/**\n * Determine if the given object is a path2 geometry.\n * @param {Object} object - the object to interrogate\n * @returns {Boolean} true if the object matches a path2\n * @alias module:modeling/geometries/path2.isA\n */\nconst isA = (object) => {\n  if (object && typeof object === 'object') {\n    // see create for the required attributes and types\n    if ('points' in object && 'transforms' in object && 'isClosed' in object) {\n      // NOTE: transforms should be a TypedArray, which has a read-only length\n      if (Array.isArray(object.points) && 'length' in object.transforms) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nmodule.exports = isA\n","const clone = require('./clone')\n\n/**\n * Reverses the path so that the points are in the opposite order.\n * This swaps the left (interior) and right (exterior) edges.\n * @param {path2} geometry - the path to reverse\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.reverse\n *\n * @example\n * let newpath = reverse(mypath)\n */\nconst reverse = (geometry) => {\n  // NOTE: this only updates the order of the points\n  const cloned = clone(geometry)\n  cloned.points = geometry.points.slice().reverse()\n  return cloned\n}\n\nmodule.exports = reverse\n","/**\n * Produce a compact binary representation from the given path.\n * @param {path2} geometry - the path geometry\n * @returns {TypedArray} compact binary representation\n * @alias module:modeling/geometries/path2.toCompactBinary\n */\nconst toCompactBinary = (geometry) => {\n  const points = geometry.points\n  const transforms = geometry.transforms\n  let color = [-1, -1, -1, -1]\n  if (geometry.color) color = geometry.color\n\n  // FIXME why Float32Array?\n  const compacted = new Float32Array(1 + 16 + 1 + 4 + (points.length * 2)) // type + transforms + isClosed + color + points data\n\n  compacted[0] = 2 // type code: 0 => geom2, 1 => geom3 , 2 => path2\n\n  compacted[1] = transforms[0]\n  compacted[2] = transforms[1]\n  compacted[3] = transforms[2]\n  compacted[4] = transforms[3]\n  compacted[5] = transforms[4]\n  compacted[6] = transforms[5]\n  compacted[7] = transforms[6]\n  compacted[8] = transforms[7]\n  compacted[9] = transforms[8]\n  compacted[10] = transforms[9]\n  compacted[11] = transforms[10]\n  compacted[12] = transforms[11]\n  compacted[13] = transforms[12]\n  compacted[14] = transforms[13]\n  compacted[15] = transforms[14]\n  compacted[16] = transforms[15]\n\n  compacted[17] = geometry.isClosed ? 1 : 0\n\n  compacted[18] = color[0]\n  compacted[19] = color[1]\n  compacted[20] = color[2]\n  compacted[21] = color[3]\n\n  for (let j = 0; j < points.length; j++) {\n    const ci = j * 2 + 22\n    const point = points[j]\n    compacted[ci] = point[0]\n    compacted[ci + 1] = point[1]\n  }\n  // TODO: how about custom properties or fields ?\n  return compacted\n}\n\nmodule.exports = toCompactBinary\n","const applyTransforms = require('./applyTransforms')\n\n/**\n * Produces an array of points from the given geometry.\n * The returned array should not be modified as the data is shared with the geometry.\n * @param {path2} geometry - the geometry\n * @returns {Array} an array of points\n * @alias module:modeling/geometries/path2.toPoints\n *\n * @example\n * let sharedpoints = toPoints(geometry)\n */\nconst toPoints = (geometry) => applyTransforms(geometry).points\n\nmodule.exports = toPoints\n","const vec2 = require('../../maths/vec2')\n\nconst toPoints = require('./toPoints')\n\n/**\n * Create a string representing the contents of the given path.\n * @param {path2} geometry - the path\n * @returns {String} a representative string\n * @alias module:modeling/geometries/path2.toString\n *\n * @example\n * console.out(toString(path))\n */\nconst toString = (geometry) => {\n  const points = toPoints(geometry)\n  let result = 'path (' + points.length + ' points, ' + geometry.isClosed + '):\\n[\\n'\n  points.forEach((point) => {\n    result += '  ' + vec2.toString(point) + ',\\n'\n  })\n  result += ']\\n'\n  return result\n}\n\nmodule.exports = toString\n","const mat4 = require('../../maths/mat4')\n\n/**\n * Transform the given geometry using the given matrix.\n * This is a lazy transform of the points, as this function only adjusts the transforms.\n * The transforms are applied when accessing the points via toPoints().\n * @param {mat4} matrix - the matrix to transform with\n * @param {path2} geometry - the geometry to transform\n * @returns {path2} a new path\n * @alias module:modeling/geometries/path2.transform\n *\n * @example\n * let newpath = transform(fromZRotation(TAU / 8), path)\n */\nconst transform = (matrix, geometry) => {\n  const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms)\n  return Object.assign({}, geometry, { transforms })\n}\n\nmodule.exports = transform\n","const vec2 = require('../../maths/vec2')\nconst isA = require('./isA')\n\n/**\n * Determine if the given object is a valid path2.\n * Checks for valid data points, and duplicate points.\n *\n * **If the geometry is not valid, an exception will be thrown with details of the geometry error.**\n *\n * @param {Object} object - the object to interrogate\n * @throws {Error} error if the geometry is not valid\n * @alias module:modeling/geometries/path2.validate\n */\nconst validate = (object) => {\n  if (!isA(object)) {\n    throw new Error('invalid path2 structure')\n  }\n\n  // check for duplicate points\n  if (object.points.length > 1) {\n    for (let i = 0; i < object.points.length; i++) {\n      if (vec2.equals(object.points[i], object.points[(i + 1) % object.points.length])) {\n        throw new Error(`path2 duplicate points ${object.points[i]}`)\n      }\n    }\n  }\n\n  // check for infinity, nan\n  object.points.forEach((point) => {\n    if (!point.every(Number.isFinite)) {\n      throw new Error(`path2 invalid point ${point}`)\n    }\n  })\n\n  // check transforms\n  if (!object.transforms.every(Number.isFinite)) {\n    throw new Error(`path2 invalid transforms ${object.transforms}`)\n  }\n}\n\nmodule.exports = validate\n","const measureArea = require('./measureArea')\nconst flip = require('./flip')\n\n/**\n * Determine if the given points are inside the given polygon.\n *\n * @param {Array} points - a list of points, where each point is an array with X and Y values\n * @param {poly2} polygon - a 2D polygon\n * @return {Integer} 1 if all points are inside, 0 if some or none are inside\n * @alias module:modeling/geometries/poly2.arePointsInside\n */\nconst arePointsInside = (points, polygon) => {\n  if (points.length === 0) return 0 // nothing to check\n\n  const vertices = polygon.vertices\n  if (vertices.length < 3) return 0 // nothing can be inside an empty polygon\n\n  if (measureArea(polygon) < 0) {\n    polygon = flip(polygon) // CCW is required\n  }\n\n  const sum = points.reduce((acc, point) => acc + isPointInside(point, vertices), 0)\n  return sum === points.length ? 1 : 0\n}\n\n/*\n * Determine if the given point is inside the polygon.\n *\n * @see http://erich.realtimerendering.com/ptinpoly/ (Crossings Test)\n * @param {Array} point - an array with X and Y values\n * @param {Array} polygon - a list of points, where each point is an array with X and Y values\n * @return {Integer} 1 if the point is inside, 0 if outside\n */\nconst isPointInside = (point, polygon) => {\n  const numverts = polygon.length\n\n  const tx = point[0]\n  const ty = point[1]\n\n  let vtx0 = polygon[numverts - 1]\n  let vtx1 = polygon[0]\n\n  let yflag0 = (vtx0[1] > ty)\n\n  let insideFlag = 0\n\n  let i = 0\n  for (let j = (numverts + 1); --j;) {\n    /*\n     * check if Y endpoints straddle (are on opposite sides) of point's Y\n     * if so, +X ray could intersect this edge.\n     */\n    const yflag1 = (vtx1[1] > ty)\n    if (yflag0 !== yflag1) {\n      /*\n       * check if X endpoints are on same side of the point's X\n       * if so, it's easy to test if edge hits or misses.\n       */\n      const xflag0 = (vtx0[0] > tx)\n      const xflag1 = (vtx1[0] > tx)\n      if (xflag0 && xflag1) {\n        /* if edge's X values are both right of the point, then the point must be inside */\n        insideFlag = !insideFlag\n      } else {\n        /*\n         * if X endpoints straddle the point, then\n         * the compute intersection of polygon edge with +X ray\n         * if intersection >= point's X then the +X ray hits it.\n         */\n        if ((vtx1[0] - (vtx1[1] - ty) * (vtx0[0] - vtx1[0]) / (vtx0[1] - vtx1[1])) >= tx) {\n          insideFlag = !insideFlag\n        }\n      }\n    }\n    /* move to next pair of vertices, retaining info as possible */\n    yflag0 = yflag1\n    vtx0 = vtx1\n    vtx1 = polygon[++i]\n  }\n  return insideFlag\n}\n\n/*\n * > 0 : p2 is left of the line p0 -> p1\n * = 0 : p2 is on the line p0 -> p1\n * < 0 : p2 is right of the line p0 -> p1\n */\nconst isLeft = (p0, p1, p2) => (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1])\n\nmodule.exports = arePointsInside\n","/**\n * Represents a convex 2D polygon consisting of a list of ordered vertices.\n * @typedef {Object} poly2\n * @property {Array} vertices - list of ordered vertices (2D)\n */\n\n/**\n * Creates a new polygon with initial values.\n *\n * @param {Array} [vertices] - list of vertices (2D)\n * @returns {poly2} a new polygon\n * @alias module:modeling/geometries/poly2.create\n *\n * @example\n * let polygon = create()\n */\nconst create = (vertices) => {\n  if (vertices === undefined || vertices.length < 3) {\n    vertices = [] // empty contents\n  }\n  return { vertices: vertices }\n}\n\nmodule.exports = create\n","const create = require('./create')\n\n/**\n * Flip the give polygon, rotating the opposite direction.\n *\n * @param {poly2} polygon - the polygon to flip\n * @returns {poly2} a new polygon\n * @alias module:modeling/geometries/poly2.flip\n */\nconst flip = (polygon) => {\n  const vertices = polygon.vertices.slice().reverse()\n  return create(vertices)\n}\n\nmodule.exports = flip\n","/**\n * Represents a 2D polygon consisting of a list of ordered vertices.\n * @see {@link poly2} for data structure information.\n * @module modeling/geometries/poly2\n *\n * @example\n * poly2.create([[0,0], [4,0], [4,3]])\n *\n * @example\n * {\"vertices\": [[0,0], [4,0], [4,3]]}\n */\nmodule.exports = {\n  arePointsInside: require('./arePointsInside'),\n  create: require('./create'),\n  flip: require('./flip'),\n  measureArea: require('./measureArea')\n}\n","/**\n * Measure the area under the given polygon.\n *\n * @param {poly2} polygon - the polygon to measure\n * @return {Number} the area of the polygon\n * @alias module:modeling/geometries/poly2.measureArea\n */\nconst area = require('../../maths/utils/area')\n\nconst measureArea = (polygon) => area(polygon.vertices)\n\nmodule.exports = measureArea\n","const create = require('./create')\n\nconst vec3 = require('../../maths/vec3')\n\n/**\n * Create a deep clone of the given polygon\n *\n * @param {poly3} [out] - receiving polygon\n * @param {poly3} polygon - polygon to clone\n * @returns {poly3} a new polygon\n * @alias module:modeling/geometries/poly3.clone\n */\nconst clone = (...params) => {\n  let out\n  let poly3\n  if (params.length === 1) {\n    out = create()\n    poly3 = params[0]\n  } else {\n    out = params[0]\n    poly3 = params[1]\n  }\n  // deep clone of vertices\n  out.vertices = poly3.vertices.map((vec) => vec3.clone(vec))\n  return out\n}\n\nmodule.exports = clone\n","\n/**\n * Represents a convex 3D polygon. The vertices used to initialize a polygon must\n * be coplanar and form a convex shape. The vertices do not have to be `vec3`\n * instances but they must behave similarly.\n * @typedef {Object} poly3\n * @property {Array} vertices - list of ordered vertices (3D)\n */\n\n/**\n * Creates a new 3D polygon with initial values.\n *\n * @param {Array} [vertices] - a list of vertices (3D)\n * @returns {poly3} a new polygon\n * @alias module:modeling/geometries/poly3.create\n */\nconst create = (vertices) => {\n  if (vertices === undefined || vertices.length < 3) {\n    vertices = [] // empty contents\n  }\n  return { vertices }\n}\n\nmodule.exports = create\n","const vec3 = require('../../maths/vec3')\n\nconst create = require('./create')\n\n/**\n * Create a polygon from the given points.\n *\n * @param {Array} points - list of points (3D)\n * @returns {poly3} a new polygon\n * @alias module:modeling/geometries/poly3.fromPoints\n *\n * @example\n * const points = [\n *   [0,  0, 0],\n *   [0, 10, 0],\n *   [0, 10, 10]\n * ]\n * const polygon = fromPoints(points)\n */\nconst fromPoints = (points) => {\n  const vertices = points.map((point) => vec3.clone(point))\n  return create(vertices)\n}\n\nmodule.exports = fromPoints\n","const create = require('./create')\n\n/**\n * Create a polygon from the given vertices and plane.\n * NOTE: No checks are performed on the parameters.\n * @param {Array} vertices - list of vertices (3D)\n * @param {plane} plane - plane of the polygon\n * @returns {poly3} a new polygon\n * @alias module:modeling/geometries/poly3.fromPointsAndPlane\n */\nconst fromPointsAndPlane = (vertices, plane) => {\n  const poly = create(vertices)\n  poly.plane = plane // retain the plane for later use\n  return poly\n}\n\nmodule.exports = fromPointsAndPlane\n","/**\n * Represents a convex 3D polygon consisting of a list of ordered vertices.\n * @see {@link poly3} for data structure information.\n * @module modeling/geometries/poly3\n *\n * @example\n * poly3.create([[0,0,0], [4,0,0], [4,3,12]])\n *\n * @example\n * {\"vertices\": [[0,0,0], [4,0,0], [4,3,12]]}\n */\nmodule.exports = {\n  clone: require('./clone'),\n  create: require('./create'),\n  fromPoints: require('./fromPoints'),\n  fromPointsAndPlane: require('./fromPointsAndPlane'),\n  invert: require('./invert'),\n  isA: require('./isA'),\n  isConvex: require('./isConvex'),\n  measureArea: require('./measureArea'),\n  measureBoundingBox: require('./measureBoundingBox'),\n  measureBoundingSphere: require('./measureBoundingSphere'),\n  measureSignedVolume: require('./measureSignedVolume'),\n  plane: require('./plane'),\n  toPoints: require('./toPoints'),\n  toString: require('./toString'),\n  transform: require('./transform'),\n  validate: require('./validate')\n}\n","const plane = require('../../maths/plane')\nconst create = require('./create')\n\n/**\n * Invert the give polygon to face the opposite direction.\n *\n * @param {poly3} polygon - the polygon to invert\n * @returns {poly3} a new poly3\n * @alias module:modeling/geometries/poly3.invert\n */\nconst invert = (polygon) => {\n  const vertices = polygon.vertices.slice().reverse()\n  const inverted = create(vertices)\n  if (polygon.plane) {\n    // Flip existing plane to save recompute\n    inverted.plane = plane.flip(plane.create(), polygon.plane)\n  }\n  return inverted\n}\n\nmodule.exports = invert\n","/**\n * Determine if the given object is a polygon.\n * @param {Object} object - the object to interrogate\n * @returns {Boolean} true if the object matches a poly3\n * @alias module:modeling/geometries/poly3.isA\n */\nconst isA = (object) => {\n  if (object && typeof object === 'object') {\n    if ('vertices' in object) {\n      if (Array.isArray(object.vertices)) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nmodule.exports = isA\n","const plane = require('../../maths/plane')\nconst vec3 = require('../../maths/vec3')\n\n/**\n * Check whether the given polygon is convex.\n * @param {poly3} polygon - the polygon to interrogate\n * @returns {Boolean} true if convex\n * @alias module:modeling/geometries/poly3.isConvex\n */\nconst isConvex = (polygon) => areVerticesConvex(polygon.vertices)\n\nconst areVerticesConvex = (vertices) => {\n  const numvertices = vertices.length\n  if (numvertices > 2) {\n    // note: plane ~= normal point\n    const normal = plane.fromPoints(plane.create(), ...vertices)\n    let prevprevpos = vertices[numvertices - 2]\n    let prevpos = vertices[numvertices - 1]\n    for (let i = 0; i < numvertices; i++) {\n      const pos = vertices[i]\n      if (!isConvexPoint(prevprevpos, prevpos, pos, normal)) {\n        return false\n      }\n      prevprevpos = prevpos\n      prevpos = pos\n    }\n  }\n  return true\n}\n\n// calculate whether three points form a convex corner\n//  prevpoint, point, nextpoint: the 3 coordinates (Vector3D instances)\n//  normal: the normal vector of the plane\nconst isConvexPoint = (prevpoint, point, nextpoint, normal) => {\n  const crossproduct = vec3.cross(\n    vec3.create(),\n    vec3.subtract(vec3.create(), point, prevpoint),\n    vec3.subtract(vec3.create(), nextpoint, point)\n  )\n  const crossdotnormal = vec3.dot(crossproduct, normal)\n  return crossdotnormal >= 0\n}\n\nmodule.exports = isConvex\n","const plane = require('./plane')\n\n/**\n * Measure the area of the given polygon.\n * @see 2000 softSurfer http://geomalgorithms.com\n * @param {poly3} polygon - the polygon to measure\n * @return {Number} area of the polygon\n * @alias module:modeling/geometries/poly3.measureArea\n */\nconst measureArea = (polygon) => {\n  const n = polygon.vertices.length\n  if (n < 3) {\n    return 0 // degenerate polygon\n  }\n  const vertices = polygon.vertices\n\n  // calculate a normal vector\n  const normal = plane(polygon)\n\n  // determine direction of projection\n  const ax = Math.abs(normal[0])\n  const ay = Math.abs(normal[1])\n  const az = Math.abs(normal[2])\n\n  if (ax + ay + az === 0) {\n    // normal does not exist\n    return 0\n  }\n\n  let coord = 3 // ignore Z coordinates\n  if ((ax > ay) && (ax > az)) {\n    coord = 1 // ignore X coordinates\n  } else\n  if (ay > az) {\n    coord = 2 // ignore Y coordinates\n  }\n\n  let area = 0\n  let h = 0\n  let i = 1\n  let j = 2\n  switch (coord) {\n    case 1: // ignore X coordinates\n      // compute area of 2D projection\n      for (i = 1; i < n; i++) {\n        h = i - 1\n        j = (i + 1) % n\n        area += (vertices[i][1] * (vertices[j][2] - vertices[h][2]))\n      }\n      area += (vertices[0][1] * (vertices[1][2] - vertices[n - 1][2]))\n      // scale to get area\n      area /= (2 * normal[0])\n      break\n\n    case 2: // ignore Y coordinates\n      // compute area of 2D projection\n      for (i = 1; i < n; i++) {\n        h = i - 1\n        j = (i + 1) % n\n        area += (vertices[i][2] * (vertices[j][0] - vertices[h][0]))\n      }\n      area += (vertices[0][2] * (vertices[1][0] - vertices[n - 1][0]))\n      // scale to get area\n      area /= (2 * normal[1])\n      break\n\n    case 3: // ignore Z coordinates\n    default:\n      // compute area of 2D projection\n      for (i = 1; i < n; i++) {\n        h = i - 1\n        j = (i + 1) % n\n        area += (vertices[i][0] * (vertices[j][1] - vertices[h][1]))\n      }\n      area += (vertices[0][0] * (vertices[1][1] - vertices[n - 1][1]))\n      // scale to get area\n      area /= (2 * normal[2])\n      break\n  }\n  return area\n}\n\nmodule.exports = measureArea\n","const vec3 = require('../../maths/vec3')\n\n/**\n * @param {poly3} polygon - the polygon to measure\n * @returns {Array} an array of two vectors (3D);  minimum and maximum coordinates\n * @alias module:modeling/geometries/poly3.measureBoundingBox\n */\nconst measureBoundingBox = (polygon) => {\n  const vertices = polygon.vertices\n  const numvertices = vertices.length\n  const min = numvertices === 0 ? vec3.create() : vec3.clone(vertices[0])\n  const max = vec3.clone(min)\n  for (let i = 1; i < numvertices; i++) {\n    vec3.min(min, min, vertices[i])\n    vec3.max(max, max, vertices[i])\n  }\n  return [min, max]\n}\n\nmodule.exports = measureBoundingBox\n","const vec3 = require('../../maths/vec3')\nconst vec4 = require('../../maths/vec4')\n\nconst cache = new WeakMap()\n\n/**\n * Measure the bounding sphere of the given polygon.\n * @param {poly3} polygon - the polygon to measure\n * @returns {vec4} the computed bounding sphere; center point (3D) and radius\n * @alias module:modeling/geometries/poly3.measureBoundingSphere\n */\nconst measureBoundingSphere = (polygon) => {\n  let boundingSphere = cache.get(polygon)\n  if (boundingSphere) return boundingSphere\n\n  const vertices = polygon.vertices\n  const out = vec4.create()\n\n  if (vertices.length === 0) {\n    out[0] = 0\n    out[1] = 0\n    out[2] = 0\n    out[3] = 0\n    return out\n  }\n\n  // keep a list of min/max vertices by axis\n  let minx = vertices[0]\n  let miny = minx\n  let minz = minx\n  let maxx = minx\n  let maxy = minx\n  let maxz = minx\n\n  vertices.forEach((v) => {\n    if (minx[0] > v[0]) minx = v\n    if (miny[1] > v[1]) miny = v\n    if (minz[2] > v[2]) minz = v\n    if (maxx[0] < v[0]) maxx = v\n    if (maxy[1] < v[1]) maxy = v\n    if (maxz[2] < v[2]) maxz = v\n  })\n\n  out[0] = (minx[0] + maxx[0]) * 0.5 // center of sphere\n  out[1] = (miny[1] + maxy[1]) * 0.5\n  out[2] = (minz[2] + maxz[2]) * 0.5\n  const x = out[0] - maxx[0]\n  const y = out[1] - maxy[1]\n  const z = out[2] - maxz[2]\n  out[3] = Math.sqrt(x * x + y * y + z * z) // radius of sphere\n\n  cache.set(polygon, out)\n\n  return out\n}\n\nmodule.exports = measureBoundingSphere\n","const vec3 = require('../../maths/vec3')\n\n/**\n * Measure the signed volume of the given polygon, which must be convex.\n * The volume is that formed by the tetrahedron connected to the axis [0,0,0],\n * and will be positive or negative based on the rotation of the vertices.\n * @see http://chenlab.ece.cornell.edu/Publication/Cha/icip01_Cha.pdf\n * @param {poly3} polygon - the polygon to measure\n * @return {Number} volume of the polygon\n * @alias module:modeling/geometries/poly3.measureSignedVolume\n */\nconst measureSignedVolume = (polygon) => {\n  let signedVolume = 0\n  const vertices = polygon.vertices\n  // calculate based on triangular polygons\n  const cross = vec3.create()\n  for (let i = 0; i < vertices.length - 2; i++) {\n    vec3.cross(cross, vertices[i + 1], vertices[i + 2])\n    signedVolume += vec3.dot(vertices[0], cross)\n  }\n  signedVolume /= 6\n  return signedVolume\n}\n\nmodule.exports = measureSignedVolume\n","const mplane = require('../../maths/plane/')\n\nconst plane = (polygon) => {\n  if (!polygon.plane) {\n    polygon.plane = mplane.fromPoints(mplane.create(), ...polygon.vertices)\n  }\n  return polygon.plane\n}\n\nmodule.exports = plane\n","/**\n * Return the given polygon as a list of points.\n * NOTE: The returned array should not be modified as the points are shared with the geometry.\n * @param {poly3} polygon - the polygon\n * @return {Array} list of points (3D)\n * @alias module:modeling/geometries/poly3.toPoints\n */\nconst toPoints = (polygon) => polygon.vertices\n\nmodule.exports = toPoints\n","const vec3 = require('../../maths/vec3/')\n\n/**\n * @param {poly3} polygon - the polygon to measure\n * @return {String} the string representation\n * @alias module:modeling/geometries/poly3.toString\n */\nconst toString = (polygon) => {\n  let result = 'poly3: vertices: ['\n  polygon.vertices.forEach((vertex) => {\n    result += `${vec3.toString(vertex)}, `\n  })\n  result += ']'\n  return result\n}\n\nmodule.exports = toString\n","const mat4 = require('../../maths/mat4')\nconst vec3 = require('../../maths/vec3')\n\nconst create = require('./create')\n\n/**\n * Transform the given polygon using the given matrix.\n * @param {mat4} matrix - the matrix to transform with\n * @param {poly3} polygon - the polygon to transform\n * @returns {poly3} a new polygon\n * @alias module:modeling/geometries/poly3.transform\n */\nconst transform = (matrix, polygon) => {\n  const vertices = polygon.vertices.map((vertex) => vec3.transform(vec3.create(), vertex, matrix))\n  if (mat4.isMirroring(matrix)) {\n    // reverse the order to preserve the orientation\n    vertices.reverse()\n  }\n  return create(vertices)\n}\n\nmodule.exports = transform\n","const signedDistanceToPoint = require('../../maths/plane/signedDistanceToPoint')\nconst { NEPS } = require('../../maths/constants')\nconst vec3 = require('../../maths/vec3')\nconst isA = require('./isA')\nconst isConvex = require('./isConvex')\nconst measureArea = require('./measureArea')\nconst plane = require('./plane')\n\n/**\n * Determine if the given object is a valid polygon.\n * Checks for valid data structure, convex polygons, and duplicate points.\n *\n * **If the geometry is not valid, an exception will be thrown with details of the geometry error.**\n *\n * @param {Object} object - the object to interrogate\n * @throws {Error} error if the geometry is not valid\n * @alias module:modeling/geometries/poly3.validate\n */\nconst validate = (object) => {\n  if (!isA(object)) {\n    throw new Error('invalid poly3 structure')\n  }\n\n  // check for empty polygon\n  if (object.vertices.length < 3) {\n    throw new Error(`poly3 not enough vertices ${object.vertices.length}`)\n  }\n  // check area\n  if (measureArea(object) <= 0) {\n    throw new Error('poly3 area must be greater than zero')\n  }\n\n  // check for duplicate points\n  for (let i = 0; i < object.vertices.length; i++) {\n    if (vec3.equals(object.vertices[i], object.vertices[(i + 1) % object.vertices.length])) {\n      throw new Error(`poly3 duplicate vertex ${object.vertices[i]}`)\n    }\n  }\n\n  // check convexity\n  if (!isConvex(object)) {\n    throw new Error('poly3 must be convex')\n  }\n\n  // check for infinity, nan\n  object.vertices.forEach((vertex) => {\n    if (!vertex.every(Number.isFinite)) {\n      throw new Error(`poly3 invalid vertex ${vertex}`)\n    }\n  })\n\n  // check that points are co-planar\n  if (object.vertices.length > 3) {\n    const normal = plane(object)\n    object.vertices.forEach((vertex) => {\n      const dist = Math.abs(signedDistanceToPoint(normal, vertex))\n      if (dist > NEPS) {\n        throw new Error(`poly3 must be coplanar: vertex ${vertex} distance ${dist}`)\n      }\n    })\n  }\n}\n\nmodule.exports = validate\n","module.exports = {\n  colors: require('./colors'),\n  curves: require('./curves'),\n  geometries: require('./geometries'),\n  maths: require('./maths'),\n  measurements: require('./measurements'),\n  primitives: require('./primitives'),\n  text: require('./text'),\n  utils: require('./utils'),\n\n  booleans: require('./operations/booleans'),\n  expansions: require('./operations/expansions'),\n  extrusions: require('./operations/extrusions'),\n  hulls: require('./operations/hulls'),\n  modifiers: require('./operations/modifiers'),\n  transforms: require('./operations/transforms')\n}\n","const mat4 = require('./mat4')\n\nconst vec2 = require('./vec2')\nconst vec3 = require('./vec3')\n\n/*\n * Class OrthoNormalBasis\n * Reprojects points on a 3D plane onto a 2D plane\n * or from a 2D plane back onto the 3D plane\n * @param  {plane} plane\n * @param  {vec3} rightvector\n */\nconst OrthoNormalBasis = function (plane, rightvector) {\n  if (arguments.length < 2) {\n    // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal:\n    rightvector = vec3.orthogonal(vec3.create(), plane)\n  }\n  this.v = vec3.normalize(vec3.create(), vec3.cross(vec3.create(), plane, rightvector))\n  this.u = vec3.cross(vec3.create(), this.v, plane)\n  this.plane = plane\n  this.planeorigin = vec3.scale(vec3.create(), plane, plane[3])\n}\n\n// Get an orthonormal basis for the standard XYZ planes.\n// Parameters: the names of two 3D axes. The 2d x axis will map to the first given 3D axis, the 2d y\n// axis will map to the second.\n// Prepend the axis with a \"-\" to invert the direction of this axis.\n// For example: OrthoNormalBasis.GetCartesian(\"-Y\",\"Z\")\n//   will return an orthonormal basis where the 2d X axis maps to the 3D inverted Y axis, and\n//   the 2d Y axis maps to the 3D Z axis.\nOrthoNormalBasis.GetCartesian = function (xaxisid, yaxisid) {\n  const axisid = xaxisid + '/' + yaxisid\n  let planenormal, rightvector\n  if (axisid === 'X/Y') {\n    planenormal = [0, 0, 1]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Y/-X') {\n    planenormal = [0, 0, 1]\n    rightvector = [0, 1, 0]\n  } else if (axisid === '-X/-Y') {\n    planenormal = [0, 0, 1]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Y/X') {\n    planenormal = [0, 0, 1]\n    rightvector = [0, -1, 0]\n  } else if (axisid === '-X/Y') {\n    planenormal = [0, 0, -1]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Y/-X') {\n    planenormal = [0, 0, -1]\n    rightvector = [0, -1, 0]\n  } else if (axisid === 'X/-Y') {\n    planenormal = [0, 0, -1]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Y/X') {\n    planenormal = [0, 0, -1]\n    rightvector = [0, 1, 0]\n  } else if (axisid === 'X/Z') {\n    planenormal = [0, -1, 0]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Z/-X') {\n    planenormal = [0, -1, 0]\n    rightvector = [0, 0, 1]\n  } else if (axisid === '-X/-Z') {\n    planenormal = [0, -1, 0]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Z/X') {\n    planenormal = [0, -1, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === '-X/Z') {\n    planenormal = [0, 1, 0]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Z/-X') {\n    planenormal = [0, 1, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === 'X/-Z') {\n    planenormal = [0, 1, 0]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Z/X') {\n    planenormal = [0, 1, 0]\n    rightvector = [0, 0, 1]\n  } else if (axisid === 'Y/Z') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, 1, 0]\n  } else if (axisid === 'Z/-Y') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, 0, 1]\n  } else if (axisid === '-Y/-Z') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, -1, 0]\n  } else if (axisid === '-Z/Y') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === '-Y/Z') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, -1, 0]\n  } else if (axisid === '-Z/-Y') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === 'Y/-Z') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, 1, 0]\n  } else if (axisid === 'Z/Y') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, 0, 1]\n  } else {\n    throw new Error('OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.')\n  }\n  return new OrthoNormalBasis(new Plane(new Vector3D(planenormal), 0), new Vector3D(rightvector))\n}\n\n/*\n// test code for OrthoNormalBasis.GetCartesian()\nOrthoNormalBasis.GetCartesian_Test=function() {\n  let axisnames=[\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"];\n  let axisvectors=[[1,0,0], [0,1,0], [0,0,1], [-1,0,0], [0,-1,0], [0,0,-1]];\n  for(let axis1=0; axis1 < 3; axis1++) {\n    for(let axis1inverted=0; axis1inverted < 2; axis1inverted++) {\n      let axis1name=axisnames[axis1+3*axis1inverted];\n      let axis1vector=axisvectors[axis1+3*axis1inverted];\n      for(let axis2=0; axis2 < 3; axis2++) {\n        if(axis2 != axis1) {\n          for(let axis2inverted=0; axis2inverted < 2; axis2inverted++) {\n            let axis2name=axisnames[axis2+3*axis2inverted];\n            let axis2vector=axisvectors[axis2+3*axis2inverted];\n            let orthobasis=OrthoNormalBasis.GetCartesian(axis1name, axis2name);\n            let test1=orthobasis.to3D(new Vector2D([1,0]));\n            let test2=orthobasis.to3D(new Vector2D([0,1]));\n            let expected1=new Vector3D(axis1vector);\n            let expected2=new Vector3D(axis2vector);\n            let d1=test1.distanceTo(expected1);\n            let d2=test2.distanceTo(expected2);\n            if( (d1 > 0.01) || (d2 > 0.01) ) {\n              throw new Error(\"Wrong!\");\n  }}}}}}\n  throw new Error(\"OK\");\n};\n*/\n\n// The z=0 plane, with the 3D x and y vectors mapped to the 2D x and y vector\nOrthoNormalBasis.Z0Plane = function () {\n  const plane = new Plane(new Vector3D([0, 0, 1]), 0)\n  return new OrthoNormalBasis(plane, new Vector3D([1, 0, 0]))\n}\n\nOrthoNormalBasis.prototype = {\n\n  getProjectionMatrix: function () {\n    return mat4.fromValues(\n      this.u[0], this.v[0], this.plane[0], 0,\n      this.u[1], this.v[1], this.plane[1], 0,\n      this.u[2], this.v[2], this.plane[2], 0,\n      0, 0, -this.plane[3], 1\n    )\n  },\n\n  getInverseProjectionMatrix: function () {\n    const p = vec3.scale(vec3.create(), this.plane, this.plane[3])\n    return mat4.fromValues(\n      this.u[0], this.u[1], this.u[2], 0,\n      this.v[0], this.v[1], this.v[2], 0,\n      this.plane[0], this.plane[1], this.plane[2], 0,\n      p[0], p[1], p[2], 1\n    )\n  },\n\n  to2D: function (point) {\n    return vec2.fromValues(vec3.dot(point, this.u), vec3.dot(point, this.v))\n  },\n\n  to3D: function (point) {\n    const v1 = vec3.scale(vec3.create(), this.u, point[0])\n    const v2 = vec3.scale(vec3.create(), this.v, point[1])\n\n    const v3 = vec3.add(v1, v1, this.planeorigin)\n    const v4 = vec3.add(v2, v2, v3)\n    return v4\n  },\n\n  line3Dto2D: function (line3d) {\n    const a = line3d.point\n    const b = line3d.direction.plus(a)\n    const a2d = this.to2D(a)\n    const b2d = this.to2D(b)\n    return Line2D.fromPoints(a2d, b2d)\n  },\n\n  line2Dto3D: function (line2d) {\n    const a = line2d.origin()\n    const b = line2d.direction().plus(a)\n    const a3d = this.to3D(a)\n    const b3d = this.to3D(b)\n    return Line3D.fromPoints(a3d, b3d)\n  },\n\n  transform: function (matrix4x4) {\n    // todo: this may not work properly in case of mirroring\n    const newplane = this.plane.transform(matrix4x4)\n    const rightpointTransformed = this.u.transform(matrix4x4)\n    const originTransformed = new Vector3D(0, 0, 0).transform(matrix4x4)\n    const newrighthandvector = rightpointTransformed.minus(originTransformed)\n    const newbasis = new OrthoNormalBasis(newplane, newrighthandvector)\n    return newbasis\n  }\n}\n\nmodule.exports = OrthoNormalBasis\n","/**\n * The resolution of space, currently one hundred nanometers.\n * This should be 1 / EPS.\n * @alias module:modeling/maths.spatialResolution\n * @default\n */\nconst spatialResolution = 1e5\n\n/**\n * Epsilon used during determination of near zero distances.\n * This should be 1 / spacialResolution.\n * @default\n * @alias module:modeling/maths.EPS\n */\nconst EPS = 1e-5\n\n/**\n * Smaller epsilon used for measuring near zero distances.\n * @default\n * @alias module:modeling/maths.NEPS\n */\nconst NEPS = 1e-13\n// NEPS is derived from a series of tests to determine the optimal precision\n// for comparing coplanar polygons, as provided by the sphere primitive at high\n// segmentation. NEPS is for 64 bit Number values.\n\n/**\n * The TAU property represents the ratio of the circumference of a circle to its radius.\n * Approximately 6.28318530717958647692\n * @default\n * @example\n * const { TAU } = require('@jscad/modeling').maths.constants\n */\nconst TAU = Math.PI * 2\n\nmodule.exports = {\n  EPS,\n  NEPS,\n  TAU,\n  spatialResolution\n}\n","/**\n * Maths are computational units for fundamental Euclidean geometry. All maths operate upon array data structures.\n * Note: Maths data structures are considered immutable, so never change the contents directly.\n * @see Most computations are based upon the glMatrix library (glmatrix.net)\n * @module modeling/maths\n * @example\n * const { constants, line2, mat4, vec2, vec3 } = require('@jscad/modeling').maths\n\n */\nmodule.exports = {\n  constants: require('./constants'),\n  line2: require('./line2'),\n  line3: require('./line3'),\n  mat4: require('./mat4'),\n  plane: require('./plane'),\n  utils: require('./utils'),\n  vec2: require('./vec2'),\n  vec3: require('./vec3'),\n  vec4: require('./vec4')\n}\n","const create = require('./create')\n\n/**\n * Create a clone of the given line.\n *\n * @param {line2} line - line to clone\n * @returns {line2} a new unbounded line\n * @alias module:modeling/maths/line2.clone\n */\nconst clone = (line) => {\n  const out = create()\n  out[0] = line[0]\n  out[1] = line[1]\n  out[2] = line[2]\n  return out\n}\n\nmodule.exports = clone\n","const vec2 = require('../vec2')\n\nconst direction = require('./direction')\nconst origin = require('./origin')\n\n/**\n * Determine the closest point on the given line to the given point.\n *\n * @param {line2} line - line of reference\n * @param {vec2} point - point of reference\n * @returns {vec2} closest point\n * @alias module:modeling/maths/line2.closestPoint\n */\nconst closestPoint = (line, point) => {\n  // linear function of AB\n  const a = origin(line)\n  const b = direction(line)\n  const m1 = (b[1] - a[1]) / (b[0] - a[0])\n  const t1 = a[1] - m1 * a[0]\n  // linear function of PC\n  const m2 = -1 / m1 // perpendicular\n  const t2 = point[1] - m2 * point[0]\n  // c.x * m1 + t1 === c.x * m2 + t2\n  const x = (t2 - t1) / (m1 - m2)\n  const y = m1 * x + t1\n\n  const closest = vec2.fromValues(x, y)\n  return closest\n}\n\nmodule.exports = closestPoint\n","/**\n * Copy the given line to the receiving line.\n *\n * @param {line2} out - receiving line\n * @param {line2} line - line to copy\n * @returns {line2} out\n * @alias module:modeling/maths/line2.copy\n */\nconst copy = (out, line) => {\n  out[0] = line[0]\n  out[1] = line[1]\n  out[2] = line[2]\n  return out\n}\n\nmodule.exports = copy\n","/**\n * Represents a unbounded line in 2D space, positioned at a point of origin.\n * A line is parametrized by a normal vector (perpendicular to the line, rotated 90 degrees counter clockwise) and\n * distance from the origin.\n *\n * Equation: A Point (P) is on Line (L) if dot(L.normal, P) == L.distance\n *\n * The contents of the array are a normal [0,1] and a distance [2].\n * @typedef {Array} line2\n */\n\n/**\n * Create a line, positioned at 0,0, and running along the X axis.\n *\n * @returns {line2} a new unbounded line\n * @alias module:modeling/maths/line2.create\n */\nconst create = () => [0, 1, 0] // normal and distance\n\nmodule.exports = create\n","const vec2 = require('../vec2')\n\n/**\n * Return the direction of the given line.\n *\n * @param {line2} line - line of reference\n * @return {vec2} a vector in the direction of the line\n * @alias module:modeling/maths/line2.direction\n */\nconst direction = (line) => {\n  const vector = vec2.normal(vec2.create(), line)\n  vec2.negate(vector, vector)\n  return vector\n}\n\nmodule.exports = direction\n","const vec2 = require('../vec2')\n\n/**\n * Calculate the distance (positive) between the given point and line.\n *\n * @param {line2} line - line of reference\n * @param {vec2} point - point of reference\n * @return {Number} distance between line and point\n * @alias module:modeling/maths/line2.distanceToPoint\n */\nconst distanceToPoint = (line, point) => {\n  let distance = vec2.dot(point, line)\n  distance = Math.abs(distance - line[2])\n  return distance\n}\n\nmodule.exports = distanceToPoint\n","/**\n * Compare the given lines for equality.\n *\n * @param {line2} line1 - first line to compare\n * @param {line2} line2 - second line to compare\n * @return {Boolean} true if lines are equal\n * @alias module:modeling/maths/line2.equals\n */\nconst equals = (line1, line2) => (line1[0] === line2[0]) && (line1[1] === line2[1] && (line1[2] === line2[2]))\n\nmodule.exports = equals\n","const vec2 = require('../vec2')\n\n/**\n * Create a new line that passes through the given points.\n *\n * @param {line2} out - receiving line\n * @param {vec2} point1 - start point of the line\n * @param {vec2} point2 - end point of the line\n * @returns {line2} a new unbounded line\n * @alias module:modeling/maths/line2.fromPoints\n */\nconst fromPoints = (out, point1, point2) => {\n  const vector = vec2.subtract(vec2.create(), point2, point1) // directional vector\n\n  vec2.normal(vector, vector)\n  vec2.normalize(vector, vector) // normalized\n\n  const distance = vec2.dot(point1, vector)\n\n  out[0] = vector[0]\n  out[1] = vector[1]\n  out[2] = distance\n  return out\n}\n\nmodule.exports = fromPoints\n","const create = require('./create')\n\n/**\n * Creates a new line initialized with the given values.\n *\n * @param {Number} x - X coordinate of the unit normal\n * @param {Number} y - Y coordinate of the unit normal\n * @param {Number} d - distance of the line from [0,0]\n * @returns {line2} a new unbounded line\n * @alias module:modeling/maths/line2.fromValues\n */\nconst fromValues = (x, y, d) => {\n  const out = create()\n  out[0] = x\n  out[1] = y\n  out[2] = d\n  return out\n}\n\nmodule.exports = fromValues\n","/**\n * Represents a unbounded line in 2D space, positioned at a point of origin.\n * @see {@link line2} for data structure information.\n * @module modeling/maths/line2\n */\nmodule.exports = {\n  clone: require('./clone'),\n  closestPoint: require('./closestPoint'),\n  copy: require('./copy'),\n  create: require('./create'),\n  direction: require('./direction'),\n  distanceToPoint: require('./distanceToPoint'),\n  equals: require('./equals'),\n  fromPoints: require('./fromPoints'),\n  fromValues: require('./fromValues'),\n  intersectPointOfLines: require('./intersectPointOfLines'),\n  origin: require('./origin'),\n  reverse: require('./reverse'),\n  toString: require('./toString'),\n  transform: require('./transform'),\n  xAtY: require('./xAtY')\n}\n","const vec2 = require('../vec2')\nconst { solve2Linear } = require('../utils')\n\n/**\n * Return the point of intersection between the given lines.\n *\n * NOTES:\n * The point will have Infinity values if the lines are parallel.\n * The point will have NaN values if the lines are the same.\n *\n * @param {line2} line1 - line of reference\n * @param {line2} line2 - line of reference\n * @return {vec2} the point of intersection\n * @alias module:modeling/maths/line2.intersectPointOfLines\n */\nconst intersectToLine = (line1, line2) => {\n  const point = solve2Linear(line1[0], line1[1], line2[0], line2[1], line1[2], line2[2])\n  return vec2.clone(point)\n}\n\nmodule.exports = intersectToLine\n","const vec2 = require('../vec2')\n\n/**\n * Return the origin of the given line.\n *\n * @param {line2} line - line of reference\n * @return {vec2} the origin of the line\n * @alias module:modeling/maths/line2.origin\n */\nconst origin = (line) => vec2.scale(vec2.create(), line, line[2])\n\nmodule.exports = origin\n","const vec2 = require('../vec2')\n\nconst copy = require('./copy')\nconst fromValues = require('./fromValues')\n\n/**\n * Create a new line in the opposite direction as the given.\n *\n * @param {line2} out - receiving line\n * @param {line2} line - line to reverse\n * @returns {line2} out\n * @alias module:modeling/maths/line2.reverse\n */\nconst reverse = (out, line) => {\n  const normal = vec2.negate(vec2.create(), line)\n  const distance = -line[2]\n  return copy(out, fromValues(normal[0], normal[1], distance))\n}\n\nmodule.exports = reverse\n","/**\n * Return a string representing the given line.\n *\n * @param {line2} line - line of reference\n * @returns {String} string representation\n * @alias module:modeling/maths/line2.toString\n */\nconst toString = (line) => `line2: (${line[0].toFixed(7)}, ${line[1].toFixed(7)}, ${line[2].toFixed(7)})`\n\nmodule.exports = toString\n","const vec2 = require('../vec2')\n\nconst fromPoints = require('./fromPoints')\nconst origin = require('./origin')\nconst direction = require('./direction')\n\n/**\n * Transforms the given line using the given matrix.\n *\n * @param {line2} out - receiving line\n * @param {line2} line - line to transform\n * @param {mat4} matrix - matrix to transform with\n * @returns {line2} out\n * @alias module:modeling/maths/line2.transform\n */\nconst transform = (out, line, matrix) => {\n  const org = origin(line)\n  const dir = direction(line)\n\n  vec2.transform(org, org, matrix)\n  vec2.transform(dir, dir, matrix)\n\n  return fromPoints(out, org, dir)\n}\n\nmodule.exports = transform\n","const origin = require('./origin')\n\n/**\n * Determine the X coordinate of the given line at the Y coordinate.\n *\n * The X coordinate will be Infinity if the line is parallel to the X axis.\n *\n * @param {line2} line - line of reference\n * @param {Number} y - Y coordinate on the line\n * @return {Number} the X coordinate on the line\n * @alias module:modeling/maths/line2.xAtY\n */\nconst xAtY = (line, y) => {\n  let x = (line[2] - (line[1] * y)) / line[0]\n  if (Number.isNaN(x)) {\n    const org = origin(line)\n    x = org[0]\n  }\n  return x\n}\n\nmodule.exports = xAtY\n","const vec3 = require('../vec3')\n\nconst create = require('./create')\n\n/**\n * Create a clone of the given line.\n *\n * @param {line3} line - line to clone\n * @returns {line3} a new unbounded line\n * @alias module:modeling/maths/line3.clone\n */\nconst clone = (line) => {\n  const out = create()\n  vec3.copy(out[0], line[0])\n  vec3.copy(out[1], line[1])\n  return out\n}\n\nmodule.exports = clone\n","const vec3 = require('../vec3')\n\n/**\n * Determine the closest point on the given line to the given point.\n *\n * @param {line3} line - line of reference\n * @param {vec3} point - point of reference\n * @returns {vec3} a point\n * @alias module:modeling/maths/line3.closestPoint\n */\nconst closestPoint = (line, point) => {\n  const lpoint = line[0]\n  const ldirection = line[1]\n\n  const a = vec3.dot(vec3.subtract(vec3.create(), point, lpoint), ldirection)\n  const b = vec3.dot(ldirection, ldirection)\n  const t = a / b\n\n  const closestpoint = vec3.scale(vec3.create(), ldirection, t)\n  vec3.add(closestpoint, closestpoint, lpoint)\n  return closestpoint\n}\n\nmodule.exports = closestPoint\n","const vec3 = require('../vec3')\n\n/**\n * Copy the given line into the receiving line.\n *\n * @param {line3} out - receiving line\n * @param {line3} line - line to copy\n * @returns {line3} out\n * @alias module:modeling/maths/line3.copy\n */\nconst copy = (out, line) => {\n  vec3.copy(out[0], line[0])\n  vec3.copy(out[1], line[1])\n  return out\n}\n\nmodule.exports = copy\n","const vec3 = require('../vec3')\n\n/**\n * Represents a unbounded line in 3D space, positioned at a point of origin.\n * A line is parametrized by a point of origin and a directional vector.\n *\n * The array contents are two 3D vectors; origin [0,0,0] and directional vector [0,0,1].\n * @see https://en.wikipedia.org/wiki/Hesse_normal_form\n * @typedef {Array} line3\n */\n\n/**\n * Create a line, positioned at 0,0,0 and lying on the X axis.\n *\n * @returns {line3} a new unbounded line\n * @alias module:modeling/maths/line3.create\n */\nconst create = () => [\n  vec3.fromValues(0, 0, 0), // origin\n  vec3.fromValues(0, 0, 1) // direction\n]\n\nmodule.exports = create\n","/**\n * Return the direction of the given line.\n *\n * @param {line3} line - line for reference\n * @return {vec3} the relative vector in the direction of the line\n * @alias module:modeling/maths/line3.direction\n */\nconst direction = (line) => line[1]\n\nmodule.exports = direction\n","const vec3 = require('../vec3')\n\nconst closestPoint = require('./closestPoint')\n\n/**\n * Calculate the distance (positive) between the given point and line.\n *\n * @param {line3} line - line of reference\n * @param {vec3} point - point of reference\n * @return {Number} distance between line and point\n * @alias module:modeling/maths/line3.distanceToPoint\n */\nconst distanceToPoint = (line, point) => {\n  const closest = closestPoint(line, point)\n  const distancevector = vec3.subtract(vec3.create(), point, closest)\n  return vec3.length(distancevector)\n}\n\nmodule.exports = distanceToPoint\n","const vec3 = require('../vec3')\n\n/**\n * Compare the given lines for equality.\n *\n * @param {line3} line1 - first line to compare\n * @param {line3} line2 - second line to compare\n * @return {Boolean} true if lines are equal\n * @alias module:modeling/maths/line3.equals\n */\nconst equals = (line1, line2) => {\n  // compare directions (unit vectors)\n  if (!vec3.equals(line1[1], line2[1])) return false\n\n  // compare points\n  if (!vec3.equals(line1[0], line2[0])) return false\n\n  // why would lines with the same slope (direction) and different points be equal?\n  // let distance = distanceToPoint(line1, line2[0])\n  // if (distance > EPS) return false\n\n  return true\n}\n\nmodule.exports = equals\n","const vec3 = require('../vec3')\nconst { solve2Linear } = require('../utils')\n\nconst { EPS } = require('../constants')\n\nconst fromPointAndDirection = require('./fromPointAndDirection')\n\n/**\n * Create a line the intersection of the given planes.\n *\n * @param {line3} out - receiving line\n * @param {plane} plane1 - first plane of reference\n * @param {plane} plane2 - second plane of reference\n * @returns {line3} out\n * @alias module:modeling/maths/line3.fromPlanes\n */\nconst fromPlanes = (out, plane1, plane2) => {\n  let direction = vec3.cross(vec3.create(), plane1, plane2)\n  let length = vec3.length(direction)\n  if (length < EPS) {\n    throw new Error('parallel planes do not intersect')\n  }\n  length = (1.0 / length)\n  direction = vec3.scale(direction, direction, length)\n\n  const absx = Math.abs(direction[0])\n  const absy = Math.abs(direction[1])\n  const absz = Math.abs(direction[2])\n  let origin\n  let r\n  if ((absx >= absy) && (absx >= absz)) {\n    // find a point p for which x is zero\n    r = solve2Linear(plane1[1], plane1[2], plane2[1], plane2[2], plane1[3], plane2[3])\n    origin = vec3.fromValues(0, r[0], r[1])\n  } else if ((absy >= absx) && (absy >= absz)) {\n    // find a point p for which y is zero\n    r = solve2Linear(plane1[0], plane1[2], plane2[0], plane2[2], plane1[3], plane2[3])\n    origin = vec3.fromValues(r[0], 0, r[1])\n  } else {\n    // find a point p for which z is zero\n    r = solve2Linear(plane1[0], plane1[1], plane2[0], plane2[1], plane1[3], plane2[3])\n    origin = vec3.fromValues(r[0], r[1], 0)\n  }\n  return fromPointAndDirection(out, origin, direction)\n}\n\nmodule.exports = fromPlanes\n","const vec3 = require('../vec3')\n\n/**\n * Create a line from the given point (origin) and direction.\n *\n * The point can be any random point on the line.\n * The direction must be a vector with positive or negative distance from the point.\n *\n * See the logic of fromPoints() for appropriate values.\n *\n * @param {line3} out - receiving line\n * @param {vec3} point - start point of the line segment\n * @param {vec3} direction - direction of the line segment\n * @returns {line3} out\n * @alias module:modeling/maths/line3.fromPointAndDirection\n */\nconst fromPointAndDirection = (out, point, direction) => {\n  const unit = vec3.normalize(vec3.create(), direction)\n\n  vec3.copy(out[0], point)\n  vec3.copy(out[1], unit)\n  return out\n}\n\nmodule.exports = fromPointAndDirection\n","const vec3 = require('../vec3')\n\nconst fromPointAndDirection = require('./fromPointAndDirection')\n\n/**\n * Create a line that passes through the given points.\n *\n * @param {line3} out - receiving line\n * @param {vec3} point1 - start point of the line segment\n * @param {vec3} point2 - end point of the line segment\n * @returns {line3} out\n * @alias module:modeling/maths/line3.fromPoints\n */\nconst fromPoints = (out, point1, point2) => {\n  const direction = vec3.subtract(vec3.create(), point2, point1)\n  return fromPointAndDirection(out, point1, direction)\n}\n\nmodule.exports = fromPoints\n","/**\n * Represents a unbounded line in 3D space, positioned at a point of origin.\n * @see {@link line3} for data structure information.\n * @module modeling/maths/line3\n */\nmodule.exports = {\n  clone: require('./clone'),\n  closestPoint: require('./closestPoint'),\n  copy: require('./copy'),\n  create: require('./create'),\n  direction: require('./direction'),\n  distanceToPoint: require('./distanceToPoint'),\n  equals: require('./equals'),\n  fromPlanes: require('./fromPlanes'),\n  fromPointAndDirection: require('./fromPointAndDirection'),\n  fromPoints: require('./fromPoints'),\n  intersectPointOfLineAndPlane: require('./intersectPointOfLineAndPlane'),\n  origin: require('./origin'),\n  reverse: require('./reverse'),\n  toString: require('./toString'),\n  transform: require('./transform')\n}\n","const vec3 = require('../vec3')\n\n/**\n * Determine the closest point on the given plane to the given line.\n *\n * NOTES:\n * The point of intersection will be invalid if the line is parallel to the plane, e.g. NaN.\n *\n * @param {line3} line - line of reference\n * @param {plane} plane - plane of reference\n * @returns {vec3} a point on the line\n * @alias module:modeling/maths/line3.intersectPointOfLineAndPlane\n */\nconst intersectToPlane = (line, plane) => {\n  // plane: plane.normal * p = plane.w\n  const pnormal = plane\n  const pw = plane[3]\n\n  const lpoint = line[0]\n  const ldirection = line[1]\n\n  // point: p = line.point + labda * line.direction\n  const labda = (pw - vec3.dot(pnormal, lpoint)) / vec3.dot(pnormal, ldirection)\n\n  const point = vec3.add(vec3.create(), lpoint, vec3.scale(vec3.create(), ldirection, labda))\n  return point\n}\n\nmodule.exports = intersectToPlane\n","/**\n * Return the origin of the given line.\n *\n * @param {line3} line - line of reference\n * @return {vec3} the origin of the line\n * @alias module:modeling/maths/line3.origin\n */\nconst origin = (line) => line[0]\n\nmodule.exports = origin\n","const vec3 = require('../vec3')\n\nconst fromPointAndDirection = require('./fromPointAndDirection')\n\n/**\n * Create a line in the opposite direction as the given.\n *\n * @param {line3} out - receiving line\n * @param {line3} line - line to reverse\n * @returns {line3} out\n * @alias module:modeling/maths/line3.reverse\n */\nconst reverse = (out, line) => {\n  const point = vec3.clone(line[0])\n  const direction = vec3.negate(vec3.create(), line[1])\n  return fromPointAndDirection(out, point, direction)\n}\n\nmodule.exports = reverse\n","/**\n * Return a string representing the given line.\n *\n * @param {line3} line - line of reference\n * @returns {String} string representation\n * @alias module:modeling/maths/line3.toString\n */\nconst toString = (line) => {\n  const point = line[0]\n  const direction = line[1]\n  return `line3: point: (${point[0].toFixed(7)}, ${point[1].toFixed(7)}, ${point[2].toFixed(7)}) direction: (${direction[0].toFixed(7)}, ${direction[1].toFixed(7)}, ${direction[2].toFixed(7)})`\n}\n\nmodule.exports = toString\n","const vec3 = require('../vec3')\n\nconst fromPointAndDirection = require('./fromPointAndDirection')\n\n/**\n * Transforms the given line using the given matrix.\n *\n * @param {line3} out - line to update\n * @param {line3} line - line to transform\n * @param {mat4} matrix - matrix to transform with\n * @returns {line3} a new unbounded line\n * @alias module:modeling/maths/line3.transform\n */\nconst transform = (out, line, matrix) => {\n  const point = line[0]\n  const direction = line[1]\n  const pointPlusDirection = vec3.add(vec3.create(), point, direction)\n\n  const newpoint = vec3.transform(vec3.create(), point, matrix)\n  const newPointPlusDirection = vec3.transform(pointPlusDirection, pointPlusDirection, matrix)\n  const newdirection = vec3.subtract(newPointPlusDirection, newPointPlusDirection, newpoint)\n\n  return fromPointAndDirection(out, newpoint, newdirection)\n}\n\nmodule.exports = transform\n","/**\n * Adds the two matrices (A+B).\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} a - first operand\n * @param {mat4} b - second operand\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.add\n */\nconst add = (out, a, b) => {\n  out[0] = a[0] + b[0]\n  out[1] = a[1] + b[1]\n  out[2] = a[2] + b[2]\n  out[3] = a[3] + b[3]\n  out[4] = a[4] + b[4]\n  out[5] = a[5] + b[5]\n  out[6] = a[6] + b[6]\n  out[7] = a[7] + b[7]\n  out[8] = a[8] + b[8]\n  out[9] = a[9] + b[9]\n  out[10] = a[10] + b[10]\n  out[11] = a[11] + b[11]\n  out[12] = a[12] + b[12]\n  out[13] = a[13] + b[13]\n  out[14] = a[14] + b[14]\n  out[15] = a[15] + b[15]\n  return out\n}\n\nmodule.exports = add\n","const create = require('./create')\n\n/**\n * Creates a clone of the given matrix.\n *\n * @param {mat4} matrix - matrix to clone\n * @returns {mat4} a new matrix\n * @alias module:modeling/maths/mat4.clone\n */\nconst clone = (matrix) => {\n  const out = create()\n  out[0] = matrix[0]\n  out[1] = matrix[1]\n  out[2] = matrix[2]\n  out[3] = matrix[3]\n  out[4] = matrix[4]\n  out[5] = matrix[5]\n  out[6] = matrix[6]\n  out[7] = matrix[7]\n  out[8] = matrix[8]\n  out[9] = matrix[9]\n  out[10] = matrix[10]\n  out[11] = matrix[11]\n  out[12] = matrix[12]\n  out[13] = matrix[13]\n  out[14] = matrix[14]\n  out[15] = matrix[15]\n  return out\n}\n\nmodule.exports = clone\n","/**\n * Creates a copy of the given matrix.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to copy\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.copy\n */\nconst copy = (out, matrix) => {\n  out[0] = matrix[0]\n  out[1] = matrix[1]\n  out[2] = matrix[2]\n  out[3] = matrix[3]\n  out[4] = matrix[4]\n  out[5] = matrix[5]\n  out[6] = matrix[6]\n  out[7] = matrix[7]\n  out[8] = matrix[8]\n  out[9] = matrix[9]\n  out[10] = matrix[10]\n  out[11] = matrix[11]\n  out[12] = matrix[12]\n  out[13] = matrix[13]\n  out[14] = matrix[14]\n  out[15] = matrix[15]\n  return out\n}\n\nmodule.exports = copy\n","/**\n * Represents a 4x4 matrix which is column-major (when typed out it looks row-major).\n * See fromValues().\n * @typedef {Array} mat4\n */\n\n/**\n * Creates a new identity matrix.\n *\n * @returns {mat4} a new matrix\n * @alias module:modeling/maths/mat4.create\n */\nconst create = () => [\n  1, 0, 0, 0,\n  0, 1, 0, 0,\n  0, 0, 1, 0,\n  0, 0, 0, 1\n]\n\nmodule.exports = create\n","/**\n * Returns whether or not the matrices have exactly the same elements in the same position.\n *\n * @param {mat4} a - first matrix\n * @param {mat4} b - second matrix\n * @returns {Boolean} true if the matrices are equal\n * @alias module:modeling/maths/mat4.equals\n */\nconst equals = (a, b) => (\n  a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] &&\n  a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] &&\n  a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] &&\n  a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]\n)\n\nmodule.exports = equals\n","const { EPS } = require('../constants')\n\nconst { sin, cos } = require('../utils/trigonometry')\n\nconst identity = require('./identity')\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest)\n *     mat4.rotate(dest, dest, rad, axis)\n *\n * @param {mat4} out - receiving matrix\n * @param {Number} rad - angle to rotate the matrix by\n * @param {vec3} axis - axis of which to rotate around\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromRotation\n * @example\n * let matrix = fromRotation(create(), TAU / 4, [0, 0, 3])\n */\nconst fromRotation = (out, rad, axis) => {\n  let [x, y, z] = axis\n  const lengthSquared = x * x + y * y + z * z\n\n  if (Math.abs(lengthSquared) < EPS) {\n    // axis is 0,0,0 or almost\n    return identity(out)\n  }\n\n  const len = 1 / Math.sqrt(lengthSquared)\n  x *= len\n  y *= len\n  z *= len\n\n  const s = sin(rad)\n  const c = cos(rad)\n  const t = 1 - c\n\n  // Perform rotation-specific matrix multiplication\n  out[0] = x * x * t + c\n  out[1] = y * x * t + z * s\n  out[2] = z * x * t - y * s\n  out[3] = 0\n  out[4] = x * y * t - z * s\n  out[5] = y * y * t + c\n  out[6] = z * y * t + x * s\n  out[7] = 0\n  out[8] = x * z * t + y * s\n  out[9] = y * z * t - x * s\n  out[10] = z * z * t + c\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromRotation\n","/**\n * Creates a matrix from a vector scaling.\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest)\n *     mat4.scale(dest, dest, vec)\n *\n * @param {mat4} out - receiving matrix\n * @param {vec3} vector - X, Y, Z factors by which to scale\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromScaling\n * @example\n * let matrix = fromScaling([1, 2, 0.5])\n */\nconst fromScaling = (out, vector) => {\n  out[0] = vector[0]\n  out[1] = 0\n  out[2] = 0\n  out[3] = 0\n  out[4] = 0\n  out[5] = vector[1]\n  out[6] = 0\n  out[7] = 0\n  out[8] = 0\n  out[9] = 0\n  out[10] = vector[2]\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromScaling\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Creates a matrix from the given Tait–Bryan angles.\n *\n * Tait-Bryan Euler angle convention using active, intrinsic rotations around the axes in the order z-y-x.\n * @see https://en.wikipedia.org/wiki/Euler_angles\n *\n * @param {mat4} out - receiving matrix\n * @param {Number} yaw - Z rotation in radians\n * @param {Number} pitch - Y rotation in radians\n * @param {Number} roll - X rotation in radians\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromTaitBryanRotation\n * @example\n * let matrix = fromTaitBryanRotation(create(), TAU / 4, 0, TAU / 2)\n */\nconst fromTaitBryanRotation = (out, yaw, pitch, roll) => {\n  // precompute sines and cosines of Euler angles\n  const sy = sin(yaw)\n  const cy = cos(yaw)\n  const sp = sin(pitch)\n  const cp = cos(pitch)\n  const sr = sin(roll)\n  const cr = cos(roll)\n\n  // create and populate rotation matrix\n  // left-hand-rule rotation\n  // const els = [\n  //  cp*cy, sr*sp*cy - cr*sy, sr*sy + cr*sp*cy, 0,\n  //  cp*sy, cr*cy + sr*sp*sy, cr*sp*sy - sr*cy, 0,\n  //  -sp, sr*cp, cr*cp, 0,\n  //  0, 0, 0, 1\n  // ]\n  // right-hand-rule rotation\n  out[0] = cp * cy\n  out[1] = cp * sy\n  out[2] = -sp\n  out[3] = 0\n  out[4] = sr * sp * cy - cr * sy\n  out[5] = cr * cy + sr * sp * sy\n  out[6] = sr * cp\n  out[7] = 0\n  out[8] = sr * sy + cr * sp * cy\n  out[9] = cr * sp * sy - sr * cy\n  out[10] = cr * cp\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromTaitBryanRotation\n","/**\n * Creates a matrix from a vector translation.\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest)\n *     mat4.translate(dest, dest, vec)\n *\n * @param {mat4} out - receiving matrix\n * @param {vec3} vector - offset (vector) of translation\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromTranslation\n * @example\n * let matrix = fromTranslation(create(), [1, 2, 3])\n */\nconst fromTranslation = (out, vector) => {\n  out[0] = 1\n  out[1] = 0\n  out[2] = 0\n  out[3] = 0\n  out[4] = 0\n  out[5] = 1\n  out[6] = 0\n  out[7] = 0\n  out[8] = 0\n  out[9] = 0\n  out[10] = 1\n  out[11] = 0\n  out[12] = vector[0]\n  out[13] = vector[1]\n  out[14] = vector[2]\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromTranslation\n","const create = require('./create')\n\n/**\n * Create a matrix with the given values.\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} a new matrix\n * @alias module:modeling/maths/mat4.fromValues\n * @example\n * let matrix = fromValues(\n *   1, 0, 0, 1,\n *   0, 1, 0, 0,\n *   0, 0, 1, 0,\n *   0, 0, 0, 1\n * )\n */\nconst fromValues = (m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) => {\n  const out = create()\n  out[0] = m00\n  out[1] = m01\n  out[2] = m02\n  out[3] = m03\n  out[4] = m10\n  out[5] = m11\n  out[6] = m12\n  out[7] = m13\n  out[8] = m20\n  out[9] = m21\n  out[10] = m22\n  out[11] = m23\n  out[12] = m30\n  out[13] = m31\n  out[14] = m32\n  out[15] = m33\n  return out\n}\n\nmodule.exports = fromValues\n","const vec3 = require('../vec3')\n\nconst fromRotation = require('./fromRotation')\n\n/**\n * Create a matrix that rotates the given source to the given target vector.\n *\n * Each vector must be a directional vector with a length greater than zero.\n * @see https://gist.github.com/kevinmoran/b45980723e53edeb8a5a43c49f134724\n * @param {mat4} out - receiving matrix\n * @param {vec3} source - source vector\n * @param {vec3} target - target vector\n * @returns {mat4} a new matrix\n * @alias module:modeling/maths/mat4.fromVectorRotation\n * @example\n * let matrix = fromVectorRotation(mat4.create(), [1, 2, 2], [-3, 3, 12])\n */\nconst fromVectorRotation = (out, source, target) => {\n  const sourceNormal = vec3.normalize(vec3.create(), source)\n  const targetNormal = vec3.normalize(vec3.create(), target)\n\n  const axis = vec3.cross(vec3.create(), targetNormal, sourceNormal)\n  const cosA = vec3.dot(targetNormal, sourceNormal)\n  if (cosA === -1.0) return fromRotation(out, Math.PI, vec3.orthogonal(axis, sourceNormal))\n\n  const k = 1 / (1 + cosA)\n  out[0] = (axis[0] * axis[0] * k) + cosA\n  out[1] = (axis[1] * axis[0] * k) - axis[2]\n  out[2] = (axis[2] * axis[0] * k) + axis[1]\n  out[3] = 0\n\n  out[4] = (axis[0] * axis[1] * k) + axis[2]\n  out[5] = (axis[1] * axis[1] * k) + cosA\n  out[6] = (axis[2] * axis[1] * k) - axis[0]\n  out[7] = 0\n\n  out[8] = (axis[0] * axis[2] * k) - axis[1]\n  out[9] = (axis[1] * axis[2] * k) + axis[0]\n  out[10] = (axis[2] * axis[2] * k) + cosA\n  out[11] = 0\n\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromVectorRotation\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Creates a matrix from the given angle around the X axis.\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest)\n *     mat4.rotateX(dest, dest, radians)\n *\n * @param {mat4} out - receiving matrix\n * @param {Number} radians - angle to rotate the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromXRotation\n * @example\n * let matrix = fromXRotation(create(), TAU / 4)\n */\nconst fromXRotation = (out, radians) => {\n  const s = sin(radians)\n  const c = cos(radians)\n\n  // Perform axis-specific matrix multiplication\n  out[0] = 1\n  out[1] = 0\n  out[2] = 0\n  out[3] = 0\n  out[4] = 0\n  out[5] = c\n  out[6] = s\n  out[7] = 0\n  out[8] = 0\n  out[9] = -s\n  out[10] = c\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromXRotation\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Creates a matrix from the given angle around the Y axis.\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest)\n *     mat4.rotateY(dest, dest, radians)\n *\n * @param {mat4} out - receiving matrix\n * @param {Number} radians - angle to rotate the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromYRotation\n * @example\n * let matrix = fromYRotation(create(), TAU / 4)\n */\nconst fromYRotation = (out, radians) => {\n  const s = sin(radians)\n  const c = cos(radians)\n\n  // Perform axis-specific matrix multiplication\n  out[0] = c\n  out[1] = 0\n  out[2] = -s\n  out[3] = 0\n  out[4] = 0\n  out[5] = 1\n  out[6] = 0\n  out[7] = 0\n  out[8] = s\n  out[9] = 0\n  out[10] = c\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromYRotation\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Creates a matrix from the given angle around the Z axis.\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest)\n *     mat4.rotateZ(dest, dest, radians)\n *\n * @param {mat4} out - receiving matrix\n * @param {Number} radians - angle to rotate the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.fromZRotation\n * @example\n * let matrix = fromZRotation(create(), TAU / 4)\n */\nconst fromZRotation = (out, radians) => {\n  const s = sin(radians)\n  const c = cos(radians)\n\n  // Perform axis-specific matrix multiplication\n  out[0] = c\n  out[1] = s\n  out[2] = 0\n  out[3] = 0\n  out[4] = -s\n  out[5] = c\n  out[6] = 0\n  out[7] = 0\n  out[8] = 0\n  out[9] = 0\n  out[10] = 1\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = fromZRotation\n","/**\n * Set a matrix to the identity transform.\n *\n * @param {mat4} out - receiving matrix\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.identity\n */\nconst identity = (out) => {\n  out[0] = 1\n  out[1] = 0\n  out[2] = 0\n  out[3] = 0\n  out[4] = 0\n  out[5] = 1\n  out[6] = 0\n  out[7] = 0\n  out[8] = 0\n  out[9] = 0\n  out[10] = 1\n  out[11] = 0\n  out[12] = 0\n  out[13] = 0\n  out[14] = 0\n  out[15] = 1\n  return out\n}\n\nmodule.exports = identity\n","/**\n * Represents a 4x4 matrix which is column-major (when typed out it looks row-major).\n * @see {@link mat4} for data structure information.\n * @module modeling/maths/mat4\n */\nmodule.exports = {\n  add: require('./add'),\n  clone: require('./clone'),\n  copy: require('./copy'),\n  create: require('./create'),\n  invert: require('./invert'),\n  equals: require('./equals'),\n  fromRotation: require('./fromRotation'),\n  fromScaling: require('./fromScaling'),\n  fromTaitBryanRotation: require('./fromTaitBryanRotation'),\n  fromTranslation: require('./fromTranslation'),\n  fromValues: require('./fromValues'),\n  fromVectorRotation: require('./fromVectorRotation'),\n  fromXRotation: require('./fromXRotation'),\n  fromYRotation: require('./fromYRotation'),\n  fromZRotation: require('./fromZRotation'),\n  identity: require('./identity'),\n  isIdentity: require('./isIdentity'),\n  isOnlyTransformScale: require('./isOnlyTransformScale'),\n  isMirroring: require('./isMirroring'),\n  mirrorByPlane: require('./mirrorByPlane'),\n  multiply: require('./multiply'),\n  rotate: require('./rotate'),\n  rotateX: require('./rotateX'),\n  rotateY: require('./rotateY'),\n  rotateZ: require('./rotateZ'),\n  scale: require('./scale'),\n  subtract: require('./subtract'),\n  toString: require('./toString'),\n  translate: require('./translate')\n}\n","/**\n * Creates a invert copy of the given matrix.\n * @author Julian Lloyd\n * code from https://github.com/jlmakes/rematrix/blob/master/src/index.js\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to invert\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.invert\n */\nconst invert = (out, matrix) => {\n  const a00 = matrix[0]\n  const a01 = matrix[1]\n  const a02 = matrix[2]\n  const a03 = matrix[3]\n  const a10 = matrix[4]\n  const a11 = matrix[5]\n  const a12 = matrix[6]\n  const a13 = matrix[7]\n  const a20 = matrix[8]\n  const a21 = matrix[9]\n  const a22 = matrix[10]\n  const a23 = matrix[11]\n  const a30 = matrix[12]\n  const a31 = matrix[13]\n  const a32 = matrix[14]\n  const a33 = matrix[15]\n\n  const b00 = a00 * a11 - a01 * a10\n  const b01 = a00 * a12 - a02 * a10\n  const b02 = a00 * a13 - a03 * a10\n  const b03 = a01 * a12 - a02 * a11\n  const b04 = a01 * a13 - a03 * a11\n  const b05 = a02 * a13 - a03 * a12\n  const b06 = a20 * a31 - a21 * a30\n  const b07 = a20 * a32 - a22 * a30\n  const b08 = a20 * a33 - a23 * a30\n  const b09 = a21 * a32 - a22 * a31\n  const b10 = a21 * a33 - a23 * a31\n  const b11 = a22 * a33 - a23 * a32\n\n  // Calculate the determinant\n  let det =\n    b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06\n\n  if (!det) {\n    return null\n  }\n  det = 1.0 / det\n\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det\n  out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det\n  out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det\n  out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det\n  out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det\n  out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det\n  out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det\n  out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det\n  out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det\n  out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det\n  out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det\n  out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det\n  out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det\n  out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det\n  out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det\n  out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det\n\n  return out\n}\n\nmodule.exports = invert\n","/**\n * Determine whether the given matrix is the identity transform.\n * This is equivalent to (but much faster than):\n *\n *     mat4.equals(mat4.create(), matrix)\n *\n * @param {mat4} matrix - the matrix\n * @returns {Boolean} true if matrix is the identity transform\n * @alias module:modeling/maths/mat4.isIdentity\n * @example\n * if (mat4.isIdentity(mymatrix)) ...\n */\nconst isIdentity = (matrix) => (\n  matrix[0] === 1 && matrix[1] === 0 && matrix[2] === 0 && matrix[3] === 0 &&\n  matrix[4] === 0 && matrix[5] === 1 && matrix[6] === 0 && matrix[7] === 0 &&\n  matrix[8] === 0 && matrix[9] === 0 && matrix[10] === 1 && matrix[11] === 0 &&\n  matrix[12] === 0 && matrix[13] === 0 && matrix[14] === 0 && matrix[15] === 1\n)\n\nmodule.exports = isIdentity\n","/**\n * Determine whether the given matrix is a mirroring transformation.\n *\n * @param {mat4} matrix - matrix of reference\n * @returns {Boolean} true if matrix is a mirroring transformation\n * @alias module:modeling/maths/mat4.isMirroring\n */\nconst isMirroring = (matrix) => {\n  // const xVector = [matrix[0], matrix[4], matrix[8]]\n  // const yVector = [matrix[1], matrix[5], matrix[9]]\n  // const zVector = [matrix[2], matrix[6], matrix[10]]\n\n  // for a true orthogonal, non-mirrored base, xVector.cross(yVector) == zVector\n  // If they have an opposite direction then we are mirroring\n  // calcuate xVector.cross(yVector)\n  const x = matrix[4] * matrix[9] - matrix[8] * matrix[5]\n  const y = matrix[8] * matrix[1] - matrix[0] * matrix[9]\n  const z = matrix[0] * matrix[5] - matrix[4] * matrix[1]\n  // calcualte dot(cross, zVector)\n  const d = x * matrix[2] + y * matrix[6] + z * matrix[10]\n  return (d < 0)\n}\n\nmodule.exports = isMirroring\n","\n/**\n * Determine whether the given matrix is only translate and/or scale.\n * This code returns true for TAU / 2 rotation as it can be interpreted as scale.\n *\n * @param {mat4} matrix - the matrix\n * @returns {Boolean} true if matrix is for translate and/or scale\n * @alias module:modeling/maths/mat4.isOnlyTransformScale\n */\nconst isOnlyTransformScale = (matrix) => (\n\n  // TODO check if it is worth the effort to add recognition of 90 deg rotations\n\n  isZero(matrix[1]) && isZero(matrix[2]) && isZero(matrix[3]) &&\n  isZero(matrix[4]) && isZero(matrix[6]) && isZero(matrix[7]) &&\n  isZero(matrix[8]) && isZero(matrix[9]) && isZero(matrix[11]) &&\n  matrix[15] === 1\n)\n\nconst isZero = (num) => Math.abs(num) < Number.EPSILON\n\nmodule.exports = isOnlyTransformScale\n","/**\n * Create a matrix for mirroring about the given plane.\n *\n * @param {mat4} out - receiving matrix\n * @param {vec4} plane - plane of which to mirror the matrix\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.mirrorByPlane\n */\nconst mirrorByPlane = (out, plane) => {\n  const [nx, ny, nz, w] = plane\n\n  out[0] = (1.0 - 2.0 * nx * nx)\n  out[1] = (-2.0 * ny * nx)\n  out[2] = (-2.0 * nz * nx)\n  out[3] = 0\n  out[4] = (-2.0 * nx * ny)\n  out[5] = (1.0 - 2.0 * ny * ny)\n  out[6] = (-2.0 * nz * ny)\n  out[7] = 0\n  out[8] = (-2.0 * nx * nz)\n  out[9] = (-2.0 * ny * nz)\n  out[10] = (1.0 - 2.0 * nz * nz)\n  out[11] = 0\n  out[12] = (2.0 * nx * w)\n  out[13] = (2.0 * ny * w)\n  out[14] = (2.0 * nz * w)\n  out[15] = 1\n\n  return out\n}\n\nmodule.exports = mirrorByPlane\n","/**\n * Multiplies the two matrices.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} a - first operand\n * @param {mat4} b - second operand\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.multiply\n */\nconst multiply = (out, a, b) => {\n  const a00 = a[0]\n  const a01 = a[1]\n  const a02 = a[2]\n  const a03 = a[3]\n  const a10 = a[4]\n  const a11 = a[5]\n  const a12 = a[6]\n  const a13 = a[7]\n  const a20 = a[8]\n  const a21 = a[9]\n  const a22 = a[10]\n  const a23 = a[11]\n  const a30 = a[12]\n  const a31 = a[13]\n  const a32 = a[14]\n  const a33 = a[15]\n\n  // Cache only the current line of the second matrix\n  let b0 = b[0]\n  let b1 = b[1]\n  let b2 = b[2]\n  let b3 = b[3]\n  out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30\n  out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31\n  out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32\n  out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33\n\n  b0 = b[4]\n  b1 = b[5]\n  b2 = b[6]\n  b3 = b[7]\n  out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30\n  out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31\n  out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32\n  out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33\n\n  b0 = b[8]\n  b1 = b[9]\n  b2 = b[10]\n  b3 = b[11]\n  out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30\n  out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31\n  out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32\n  out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33\n\n  b0 = b[12]\n  b1 = b[13]\n  b2 = b[14]\n  b3 = b[15]\n  out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30\n  out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31\n  out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32\n  out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33\n  return out\n}\n\nmodule.exports = multiply\n","const { EPS } = require('../constants')\n\nconst { sin, cos } = require('../utils/trigonometry')\n\nconst copy = require('./copy')\n\n/**\n * Rotates a matrix by the given angle about the given axis.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to rotate\n * @param {Number} radians - angle to rotate the matrix by\n * @param {vec3} axis - axis to rotate around\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.rotate\n */\nconst rotate = (out, matrix, radians, axis) => {\n  let [x, y, z] = axis\n  const lengthSquared = x * x + y * y + z * z\n\n  if (Math.abs(lengthSquared) < EPS) {\n    // axis is 0,0,0 or almost\n    return copy(out, matrix)\n  }\n\n  const len = 1 / Math.sqrt(lengthSquared)\n  x *= len\n  y *= len\n  z *= len\n\n  const s = sin(radians)\n  const c = cos(radians)\n  const t = 1 - c\n\n  const a00 = matrix[0]\n  const a01 = matrix[1]\n  const a02 = matrix[2]\n  const a03 = matrix[3]\n  const a10 = matrix[4]\n  const a11 = matrix[5]\n  const a12 = matrix[6]\n  const a13 = matrix[7]\n  const a20 = matrix[8]\n  const a21 = matrix[9]\n  const a22 = matrix[10]\n  const a23 = matrix[11]\n\n  // Construct the elements of the rotation matrix\n  const b00 = x * x * t + c\n  const b01 = y * x * t + z * s\n  const b02 = z * x * t - y * s\n  const b10 = x * y * t - z * s\n  const b11 = y * y * t + c\n  const b12 = z * y * t + x * s\n  const b20 = x * z * t + y * s\n  const b21 = y * z * t - x * s\n  const b22 = z * z * t + c\n\n  // Perform rotation-specific matrix multiplication\n  out[0] = a00 * b00 + a10 * b01 + a20 * b02\n  out[1] = a01 * b00 + a11 * b01 + a21 * b02\n  out[2] = a02 * b00 + a12 * b01 + a22 * b02\n  out[3] = a03 * b00 + a13 * b01 + a23 * b02\n  out[4] = a00 * b10 + a10 * b11 + a20 * b12\n  out[5] = a01 * b10 + a11 * b11 + a21 * b12\n  out[6] = a02 * b10 + a12 * b11 + a22 * b12\n  out[7] = a03 * b10 + a13 * b11 + a23 * b12\n  out[8] = a00 * b20 + a10 * b21 + a20 * b22\n  out[9] = a01 * b20 + a11 * b21 + a21 * b22\n  out[10] = a02 * b20 + a12 * b21 + a22 * b22\n  out[11] = a03 * b20 + a13 * b21 + a23 * b22\n\n  if (matrix !== out) { // If the source and destination differ, copy the unchanged last row\n    out[12] = matrix[12]\n    out[13] = matrix[13]\n    out[14] = matrix[14]\n    out[15] = matrix[15]\n  }\n  return out\n}\n\nmodule.exports = rotate\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Rotates a matrix by the given angle around the X axis.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to rotate\n * @param {Number} radians - angle to rotate the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.rotateX\n */\nconst rotateX = (out, matrix, radians) => {\n  const s = sin(radians)\n  const c = cos(radians)\n  const a10 = matrix[4]\n  const a11 = matrix[5]\n  const a12 = matrix[6]\n  const a13 = matrix[7]\n  const a20 = matrix[8]\n  const a21 = matrix[9]\n  const a22 = matrix[10]\n  const a23 = matrix[11]\n\n  if (matrix !== out) { // If the source and destination differ, copy the unchanged rows\n    out[0] = matrix[0]\n    out[1] = matrix[1]\n    out[2] = matrix[2]\n    out[3] = matrix[3]\n    out[12] = matrix[12]\n    out[13] = matrix[13]\n    out[14] = matrix[14]\n    out[15] = matrix[15]\n  }\n\n  // Perform axis-specific matrix multiplication\n  out[4] = a10 * c + a20 * s\n  out[5] = a11 * c + a21 * s\n  out[6] = a12 * c + a22 * s\n  out[7] = a13 * c + a23 * s\n  out[8] = a20 * c - a10 * s\n  out[9] = a21 * c - a11 * s\n  out[10] = a22 * c - a12 * s\n  out[11] = a23 * c - a13 * s\n  return out\n}\n\nmodule.exports = rotateX\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Rotates a matrix by the given angle around the Y axis.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to rotate\n * @param {Number} radians - angle to rotate the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.rotateY\n */\nconst rotateY = (out, matrix, radians) => {\n  const s = sin(radians)\n  const c = cos(radians)\n  const a00 = matrix[0]\n  const a01 = matrix[1]\n  const a02 = matrix[2]\n  const a03 = matrix[3]\n  const a20 = matrix[8]\n  const a21 = matrix[9]\n  const a22 = matrix[10]\n  const a23 = matrix[11]\n\n  if (matrix !== out) { // If the source and destination differ, copy the unchanged rows\n    out[4] = matrix[4]\n    out[5] = matrix[5]\n    out[6] = matrix[6]\n    out[7] = matrix[7]\n    out[12] = matrix[12]\n    out[13] = matrix[13]\n    out[14] = matrix[14]\n    out[15] = matrix[15]\n  }\n\n  // Perform axis-specific matrix multiplication\n  out[0] = a00 * c - a20 * s\n  out[1] = a01 * c - a21 * s\n  out[2] = a02 * c - a22 * s\n  out[3] = a03 * c - a23 * s\n  out[8] = a00 * s + a20 * c\n  out[9] = a01 * s + a21 * c\n  out[10] = a02 * s + a22 * c\n  out[11] = a03 * s + a23 * c\n  return out\n}\n\nmodule.exports = rotateY\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Rotates a matrix by the given angle around the Z axis.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to rotate\n * @param {Number} radians - angle to rotate the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.rotateZ\n */\nconst rotateZ = (out, matrix, radians) => {\n  const s = sin(radians)\n  const c = cos(radians)\n  const a00 = matrix[0]\n  const a01 = matrix[1]\n  const a02 = matrix[2]\n  const a03 = matrix[3]\n  const a10 = matrix[4]\n  const a11 = matrix[5]\n  const a12 = matrix[6]\n  const a13 = matrix[7]\n\n  if (matrix !== out) { // If the source and destination differ, copy the unchanged last row\n    out[8] = matrix[8]\n    out[9] = matrix[9]\n    out[10] = matrix[10]\n    out[11] = matrix[11]\n    out[12] = matrix[12]\n    out[13] = matrix[13]\n    out[14] = matrix[14]\n    out[15] = matrix[15]\n  }\n\n  // Perform axis-specific matrix multiplication\n  out[0] = a00 * c + a10 * s\n  out[1] = a01 * c + a11 * s\n  out[2] = a02 * c + a12 * s\n  out[3] = a03 * c + a13 * s\n  out[4] = a10 * c - a00 * s\n  out[5] = a11 * c - a01 * s\n  out[6] = a12 * c - a02 * s\n  out[7] = a13 * c - a03 * s\n  return out\n}\n\nmodule.exports = rotateZ\n","/**\n * Scales the matrix by the given dimensions.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to scale\n * @param {vec3} dimensions - dimensions to scale the matrix by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.scale\n */\nconst scale = (out, matrix, dimensions) => {\n  const x = dimensions[0]\n  const y = dimensions[1]\n  const z = dimensions[2]\n\n  out[0] = matrix[0] * x\n  out[1] = matrix[1] * x\n  out[2] = matrix[2] * x\n  out[3] = matrix[3] * x\n  out[4] = matrix[4] * y\n  out[5] = matrix[5] * y\n  out[6] = matrix[6] * y\n  out[7] = matrix[7] * y\n  out[8] = matrix[8] * z\n  out[9] = matrix[9] * z\n  out[10] = matrix[10] * z\n  out[11] = matrix[11] * z\n  out[12] = matrix[12]\n  out[13] = matrix[13]\n  out[14] = matrix[14]\n  out[15] = matrix[15]\n  return out\n}\n\nmodule.exports = scale\n","/**\n * Subtracts matrix b from matrix a. (A-B)\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} a - first operand\n * @param {mat4} b - second operand\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.subtract\n */\nconst subtract = (out, a, b) => {\n  out[0] = a[0] - b[0]\n  out[1] = a[1] - b[1]\n  out[2] = a[2] - b[2]\n  out[3] = a[3] - b[3]\n  out[4] = a[4] - b[4]\n  out[5] = a[5] - b[5]\n  out[6] = a[6] - b[6]\n  out[7] = a[7] - b[7]\n  out[8] = a[8] - b[8]\n  out[9] = a[9] - b[9]\n  out[10] = a[10] - b[10]\n  out[11] = a[11] - b[11]\n  out[12] = a[12] - b[12]\n  out[13] = a[13] - b[13]\n  out[14] = a[14] - b[14]\n  out[15] = a[15] - b[15]\n  return out\n}\n\nmodule.exports = subtract\n","/**\n * Return a string representing the given matrix.\n *\n * @param {mat4} mat - matrix of reference\n * @returns {String} string representation\n * @alias module:modeling/maths/mat4.toString\n */\nconst toString = (mat) => mat.map((n) => n.toFixed(7)).toString()\n\nmodule.exports = toString\n","/**\n * Translate the matrix by the given offset vector.\n *\n * @param {mat4} out - receiving matrix\n * @param {mat4} matrix - matrix to translate\n * @param {vec3} offsets - offset vector to translate by\n * @returns {mat4} out\n * @alias module:modeling/maths/mat4.translate\n */\nconst translate = (out, matrix, offsets) => {\n  const x = offsets[0]\n  const y = offsets[1]\n  const z = offsets[2]\n  let a00\n  let a01\n  let a02\n  let a03\n  let a10\n  let a11\n  let a12\n  let a13\n  let a20\n  let a21\n  let a22\n  let a23\n\n  if (matrix === out) {\n  // 0-11 assignments are unnecessary\n    out[12] = matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12]\n    out[13] = matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13]\n    out[14] = matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14]\n    out[15] = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15]\n  } else {\n    a00 = matrix[0]; a01 = matrix[1]; a02 = matrix[2]; a03 = matrix[3]\n    a10 = matrix[4]; a11 = matrix[5]; a12 = matrix[6]; a13 = matrix[7]\n    a20 = matrix[8]; a21 = matrix[9]; a22 = matrix[10]; a23 = matrix[11]\n\n    out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03\n    out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13\n    out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23\n\n    out[12] = a00 * x + a10 * y + a20 * z + matrix[12]\n    out[13] = a01 * x + a11 * y + a21 * z + matrix[13]\n    out[14] = a02 * x + a12 * y + a22 * z + matrix[14]\n    out[15] = a03 * x + a13 * y + a23 * z + matrix[15]\n  }\n\n  return out\n}\n\nmodule.exports = translate\n","/**\n * Flip the given plane.\n *\n * @param {plane} out - receiving plane\n * @param {plane} plane - plane to flip\n * @return {plane} out\n * @alias module:modeling/maths/plane.flip\n */\nconst flip = (out, plane) => {\n  out[0] = -plane[0]\n  out[1] = -plane[1]\n  out[2] = -plane[2]\n  out[3] = -plane[3]\n  return out\n}\n\nmodule.exports = flip\n","const vec3 = require('../vec3')\n\n/**\n * Represents a plane in 3D coordinate space as determined by a normal (perpendicular to the plane)\n * and distance from 0,0,0.\n *\n * The contents of the array are a normal [0,1,2] and a distance [3].\n * @see https://en.wikipedia.org/wiki/Hesse_normal_form\n * @typedef {Array} plane\n */\n\n/**\n * Create a new plane from the given normal and point values.\n *\n * @param {plane} out - receiving plane\n * @param {vec3} normal - directional vector\n * @param {vec3} point - origin of plane\n * @returns {plane} out\n * @alias module:modeling/maths/plane.fromNormalAndPoint\n */\nconst fromNormalAndPoint = (out, normal, point) => {\n  const u = vec3.normalize(vec3.create(), normal)\n  const w = vec3.dot(point, u)\n\n  out[0] = u[0]\n  out[1] = u[1]\n  out[2] = u[2]\n  out[3] = w\n  return out\n}\n\nmodule.exports = fromNormalAndPoint\n","const vec3 = require('../vec3')\n\n/**\n * Create a plane from the given points.\n *\n * @param {plane} out - receiving plane\n * @param {Array} vertices - points on the plane\n * @returns {plane} out\n * @alias module:modeling/maths/plane.fromPoints\n */\nconst fromPoints = (out, ...vertices) => {\n  const len = vertices.length\n\n  // Calculate normal vector for a single vertex\n  // Inline to avoid allocations\n  const ba = vec3.create()\n  const ca = vec3.create()\n  const vertexNormal = (index) => {\n    const a = vertices[index]\n    const b = vertices[(index + 1) % len]\n    const c = vertices[(index + 2) % len]\n    vec3.subtract(ba, b, a) // ba = b - a\n    vec3.subtract(ca, c, a) // ca = c - a\n    vec3.cross(ba, ba, ca) // ba = ba x ca\n    vec3.normalize(ba, ba)\n    return ba\n  }\n\n  out[0] = 0\n  out[1] = 0\n  out[2] = 0\n  if (len === 3) {\n    // optimization for triangles, which are always coplanar\n    vec3.copy(out, vertexNormal(0))\n  } else {\n    // sum of vertex normals\n    vertices.forEach((v, i) => {\n      vec3.add(out, out, vertexNormal(i))\n    })\n    // renormalize normal vector\n    vec3.normalize(out, out)\n  }\n  out[3] = vec3.dot(out, vertices[0])\n  return out\n}\n\nmodule.exports = fromPoints\n","const { EPS } = require('../constants')\n\nconst vec3 = require('../vec3')\n\n/**\n * Create a new plane from the given points like fromPoints,\n * but allow the vectors to be on one point or one line.\n * In such a case, a random plane through the given points is constructed.\n *\n * @param {plane} out - receiving plane\n * @param {vec3} a - 3D point\n * @param {vec3} b - 3D point\n * @param {vec3} c - 3D point\n * @returns {plane} out\n * @alias module:modeling/maths/plane.fromPointsRandom\n */\nconst fromPointsRandom = (out, a, b, c) => {\n  let ba = vec3.subtract(vec3.create(), b, a)\n  let ca = vec3.subtract(vec3.create(), c, a)\n  if (vec3.length(ba) < EPS) {\n    ba = vec3.orthogonal(ba, ca)\n  }\n  if (vec3.length(ca) < EPS) {\n    ca = vec3.orthogonal(ca, ba)\n  }\n  let normal = vec3.cross(vec3.create(), ba, ca)\n  if (vec3.length(normal) < EPS) {\n    // this would mean that ba == ca.negated()\n    ca = vec3.orthogonal(ca, ba)\n    normal = vec3.cross(normal, ba, ca)\n  }\n  normal = vec3.normalize(normal, normal)\n  const w = vec3.dot(normal, a)\n\n  out[0] = normal[0]\n  out[1] = normal[1]\n  out[2] = normal[2]\n  out[3] = w\n  return out\n}\n\nmodule.exports = fromPointsRandom\n","/**\n * Represents a plane in 3D coordinate space as determined by a normal (perpendicular to the plane)\n * and distance from 0,0,0.\n * @see {@link plane} for data structure information.\n * @module modeling/maths/plane\n */\nmodule.exports = {\n  /**\n   * @see [vec4.clone()]{@link module:modeling/maths/vec4.clone}\n   * @function clone\n   */\n  clone: require('../vec4/clone'),\n  /**\n   * @see [vec4.copy()]{@link module:modeling/maths/vec4.copy}\n   * @function copy\n   */\n  copy: require('../vec4/copy'),\n  /**\n   * @see [vec4.create()]{@link module:modeling/maths/vec4.create}\n   * @function create\n   */\n  create: require('../vec4/create'),\n  /**\n   * @see [vec4.equals()]{@link module:modeling/maths/vec4.equals}\n   * @function equals\n   */\n  equals: require('../vec4/equals'),\n  flip: require('./flip'),\n  fromNormalAndPoint: require('./fromNormalAndPoint'),\n  /**\n   * @see [vec4.fromValues()]{@link module:modeling/maths/vec4.fromValues}\n   * @function fromValues\n   */\n  fromValues: require('../vec4/fromValues'),\n  fromPoints: require('./fromPoints'),\n  fromPointsRandom: require('./fromPointsRandom'),\n  projectionOfPoint: require('./projectionOfPoint'),\n  signedDistanceToPoint: require('./signedDistanceToPoint'),\n  /**\n   * @see [vec4.toString()]{@link module:modeling/maths/vec4.toString}\n   * @function toString\n   */\n  toString: require('../vec4/toString'),\n  transform: require('./transform')\n}\n","const vec3 = require('../vec3')\n\n/**\n * Project the given point on to the given plane.\n *\n * @param {plane} plane - plane of reference\n * @param {vec3} point - point of reference\n * @return {vec3} projected point on plane\n * @alias module:modeling/maths/plane.projectionOfPoint\n */\nconst projectionOfPoint = (plane, point) => {\n  const a = point[0] * plane[0] + point[1] * plane[1] + point[2] * plane[2] - plane[3]\n  const x = point[0] - a * plane[0]\n  const y = point[1] - a * plane[1]\n  const z = point[2] - a * plane[2]\n  return vec3.fromValues(x, y, z)\n}\n\nmodule.exports = projectionOfPoint\n","const vec3 = require('../vec3')\n\n/**\n * Calculate the distance to the given point.\n *\n * @param {plane} plane - plane of reference\n * @param {vec3} point - point of reference\n * @return {Number} signed distance to point\n * @alias module:modeling/maths/plane.signedDistanceToPoint\n */\nconst signedDistanceToPoint = (plane, point) => vec3.dot(plane, point) - plane[3]\n\nmodule.exports = signedDistanceToPoint\n","const mat4 = require('../mat4')\nconst vec3 = require('../vec3')\n\nconst fromPoints = require('./fromPoints')\nconst flip = require('./flip')\n\n/**\n * Transform the given plane using the given matrix\n *\n * @param {plane} out - receiving plane\n * @param {plane} plane - plane to transform\n * @param {mat4} matrix - matrix to transform with\n * @return {plane} out\n * @alias module:modeling/maths/plane.transform\n */\nconst transform = (out, plane, matrix) => {\n  const ismirror = mat4.isMirroring(matrix)\n  // get two vectors in the plane:\n  const r = vec3.orthogonal(vec3.create(), plane)\n  const u = vec3.cross(r, plane, r)\n  const v = vec3.cross(vec3.create(), plane, u)\n  // get 3 points in the plane:\n  let point1 = vec3.fromScalar(vec3.create(), plane[3])\n  vec3.multiply(point1, point1, plane)\n  let point2 = vec3.add(vec3.create(), point1, u)\n  let point3 = vec3.add(vec3.create(), point1, v)\n  // transform the points:\n  point1 = vec3.transform(point1, point1, matrix)\n  point2 = vec3.transform(point2, point2, matrix)\n  point3 = vec3.transform(point3, point3, matrix)\n  // and create a new plane from the transformed points:\n  fromPoints(out, point1, point2, point3)\n  if (ismirror) {\n    // the transform is mirroring so flip the plane\n    flip(out, out)\n  }\n  return out\n}\n\nmodule.exports = transform\n","const { NEPS } = require('../constants')\n\n/**\n * Compare two normals (unit vectors) for near equality.\n * @param {vec3} a - normal a\n * @param {vec3} b - normal b\n * @returns {Boolean} true if a and b are nearly equal\n * @alias module:modeling/maths/utils.aboutEqualNormals\n */\nconst aboutEqualNormals = (a, b) => (Math.abs(a[0] - b[0]) <= NEPS && Math.abs(a[1] - b[1]) <= NEPS && Math.abs(a[2] - b[2]) <= NEPS)\n\nmodule.exports = aboutEqualNormals\n","/**\n * Calculate the area under the given points.\n * @param {Array} points - list of 2D points\n * @return {Number} area under the given points\n * @alias module:modeling/maths/utils.area\n */\nconst area = (points) => {\n  let area = 0\n  for (let i = 0; i < points.length; i++) {\n    const j = (i + 1) % points.length\n    area += points[i][0] * points[j][1]\n    area -= points[j][0] * points[i][1]\n  }\n  return (area / 2.0)\n}\n\nmodule.exports = area\n","/**\n * Utility functions for maths.\n * @module modeling/maths/utils\n * @example\n * const { area, solve2Linear } = require('@jscad/maths').utils\n */\nmodule.exports = {\n  aboutEqualNormals: require('./aboutEqualNormals'),\n  area: require('./area'),\n  cos: require('./trigonometry').cos,\n  interpolateBetween2DPointsForY: require('./interpolateBetween2DPointsForY'),\n  intersect: require('./intersect'),\n  sin: require('./trigonometry').sin,\n  solve2Linear: require('./solve2Linear')\n}\n","/**\n * Get the X coordinate of a point with a certain Y coordinate, interpolated between two points.\n * Interpolation is robust even if the points have the same Y coordinate\n * @param {vec2} point1\n * @param {vec2} point2\n * @param {Number} y\n * @return {Array} X and Y of interpolated point\n * @alias module:modeling/maths/utils.interpolateBetween2DPointsForY\n */\nconst interpolateBetween2DPointsForY = (point1, point2, y) => {\n  let f1 = y - point1[1]\n  let f2 = point2[1] - point1[1]\n  if (f2 < 0) {\n    f1 = -f1\n    f2 = -f2\n  }\n  let t\n  if (f1 <= 0) {\n    t = 0.0\n  } else if (f1 >= f2) {\n    t = 1.0\n  } else if (f2 < 1e-10) { // FIXME Should this be EPS?\n    t = 0.5\n  } else {\n    t = f1 / f2\n  }\n  const result = point1[0] + t * (point2[0] - point1[0])\n  return result\n}\n\nmodule.exports = interpolateBetween2DPointsForY\n","/**\n * Calculate the intersect point of the two line segments (p1-p2 and p3-p4), end points included.\n * Note: If the line segments do NOT intersect then undefined is returned.\n * @see http://paulbourke.net/geometry/pointlineplane/\n * @param {vec2} p1 - first point of first line segment\n * @param {vec2} p2 - second point of first line segment\n * @param {vec2} p3 - first point of second line segment\n * @param {vec2} p4 - second point of second line segment\n * @returns {vec2} intersection point of the two line segments, or undefined\n * @alias module:modeling/maths/utils.intersect\n */\nconst intersect = (p1, p2, p3, p4) => {\n  // Check if none of the lines are of length 0\n  if ((p1[0] === p2[0] && p1[1] === p2[1]) || (p3[0] === p4[0] && p3[1] === p4[1])) {\n    return undefined\n  }\n\n  const denominator = ((p4[1] - p3[1]) * (p2[0] - p1[0]) - (p4[0] - p3[0]) * (p2[1] - p1[1]))\n\n  // Lines are parallel\n  if (Math.abs(denominator) < Number.MIN_VALUE) {\n    return undefined\n  }\n\n  const ua = ((p4[0] - p3[0]) * (p1[1] - p3[1]) - (p4[1] - p3[1]) * (p1[0] - p3[0])) / denominator\n  const ub = ((p2[0] - p1[0]) * (p1[1] - p3[1]) - (p2[1] - p1[1]) * (p1[0] - p3[0])) / denominator\n\n  // is the intersection along the segments\n  if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n    return undefined\n  }\n\n  // Return the x and y coordinates of the intersection\n  const x = p1[0] + ua * (p2[0] - p1[0])\n  const y = p1[1] + ua * (p2[1] - p1[1])\n\n  return [x, y]\n}\n\nmodule.exports = intersect\n","const solve2Linear = (a, b, c, d, u, v) => {\n  const det = a * d - b * c\n  const invdet = 1.0 / det\n  let x = u * d - b * v\n  let y = -u * c + a * v\n  x *= invdet\n  y *= invdet\n  return [x, y]\n}\n\nmodule.exports = solve2Linear\n","const { NEPS } = require('../constants')\n\n/*\n * Returns zero if n is within epsilon of zero, otherwise return n\n */\nconst rezero = (n) => Math.abs(n) < NEPS ? 0 : n\n\n/**\n * Return Math.sin but accurate for TAU / 4 rotations.\n * Fixes rounding errors when sin should be 0.\n *\n * @param {Number} radians - angle in radians\n * @returns {Number} sine of the given angle\n * @alias module:modeling/utils.sin\n * @example\n * sin(TAU / 2) == 0\n * sin(TAU) == 0\n */\nconst sin = (radians) => rezero(Math.sin(radians))\n\n/**\n * Return Math.cos but accurate for TAU / 4 rotations.\n * Fixes rounding errors when cos should be 0.\n *\n * @param {Number} radians - angle in radians\n * @returns {Number} cosine of the given angle\n * @alias module:modeling/utils.cos\n * @example\n * cos(TAU * 0.25) == 0\n * cos(TAU * 0.75) == 0\n */\nconst cos = (radians) => rezero(Math.cos(radians))\n\nmodule.exports = { sin, cos }\n","/**\n * Calculates the absolute coordinates of the given vector.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector of reference\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.abs\n */\nconst abs = (out, vector) => {\n  out[0] = Math.abs(vector[0])\n  out[1] = Math.abs(vector[1])\n  return out\n}\n\nmodule.exports = abs\n","/**\n * Adds the coordinates of two vectors (A+B).\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.add\n */\nconst add = (out, a, b) => {\n  out[0] = a[0] + b[0]\n  out[1] = a[1] + b[1]\n  return out\n}\n\nmodule.exports = add\n","module.exports = require('./angleRadians')\n","const angleRadians = require('./angleRadians')\n\n/**\n * Calculate the angle of the given vector.\n *\n * @param {vec2} vector - vector of reference\n * @returns {Number} angle in degrees\n * @alias module:modeling/maths/vec2.angleDegrees\n */\nconst angleDegrees = (vector) => angleRadians(vector) * 57.29577951308232\n\nmodule.exports = angleDegrees\n","/**\n * Calculate the angle of the given vector.\n *\n * @param {vec2} vector - vector of reference\n * @returns {Number} angle in radians\n * @alias module:modeling/maths/vec2.angleRadians\n */\nconst angleRadians = (vector) => Math.atan2(vector[1], vector[0]) // y=sin, x=cos\n\nmodule.exports = angleRadians\n","const create = require('./create')\n\n/**\n * Create a clone of the given vector.\n *\n * @param {vec2} vector - vector to clone\n * @returns {vec2} a new vector\n * @alias module:modeling/maths/vec2.clone\n */\nconst clone = (vector) => {\n  const out = create()\n  out[0] = vector[0]\n  out[1] = vector[1]\n  return out\n}\n\nmodule.exports = clone\n","/**\n * Create a copy of the given vector.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - source vector\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.copy\n */\nconst copy = (out, vector) => {\n  out[0] = vector[0]\n  out[1] = vector[1]\n  return out\n}\n\nmodule.exports = copy\n","/**\n * Represents a two dimensional vector.\n * See fromValues().\n * @typedef {Array} vec2\n */\n\n/**\n * Creates a new vector, initialized to [0,0].\n *\n * @returns {vec2} a new vector\n * @alias module:modeling/maths/vec2.create\n */\nconst create = () => [0, 0]\n\nmodule.exports = create\n","/**\n * Computes the cross product (3D) of two vectors.\n *\n * @param {vec3} out - receiving vector (3D)\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec3} out\n * @alias module:modeling/maths/vec2.cross\n */\nconst cross = (out, a, b) => {\n  out[0] = 0\n  out[1] = 0\n  out[2] = a[0] * b[1] - a[1] * b[0]\n  return out\n}\n\nmodule.exports = cross\n","/**\n * Calculates the distance between two vectors.\n *\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {Number} distance\n * @alias module:modeling/maths/vec2.distance\n */\nconst distance = (a, b) => {\n  const x = b[0] - a[0]\n  const y = b[1] - a[1]\n  return Math.sqrt(x * x + y * y)\n}\n\nmodule.exports = distance\n","/**\n * Divides the coordinates of two vectors (A/B).\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.divide\n */\nconst divide = (out, a, b) => {\n  out[0] = a[0] / b[0]\n  out[1] = a[1] / b[1]\n  return out\n}\n\nmodule.exports = divide\n","/**\n * Calculates the dot product of two vectors.\n *\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {Number} dot product\n * @alias module:modeling/maths/vec2.dot\n */\nconst dot = (a, b) => a[0] * b[0] + a[1] * b[1]\n\nmodule.exports = dot\n","/**\n * Compare the given vectors for equality.\n *\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {Boolean} true if a and b are equal\n * @alias module:modeling/maths/vec2.equals\n */\nconst equals = (a, b) => (a[0] === b[0]) && (a[1] === b[1])\n\nmodule.exports = equals\n","const fromAngleRadians = require('./fromAngleRadians')\n\n/**\n * Create a new vector in the direction of the given angle.\n *\n * @param {vec2} out - receiving vector\n * @param {Number} degrees - angle in degrees\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.fromAngleDegrees\n */\nconst fromAngleDegrees = (out, degrees) => fromAngleRadians(out, degrees * 0.017453292519943295)\n\nmodule.exports = fromAngleDegrees\n","const { sin, cos } = require('../utils/trigonometry')\n\n/**\n * Create a new vector in the direction of the given angle.\n *\n * @param {vec2} out - receiving vector\n * @param {Number} radians - angle in radians\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.fromAngleRadians\n */\nconst fromAngleRadians = (out, radians) => {\n  out[0] = cos(radians)\n  out[1] = sin(radians)\n  return out\n}\n\nmodule.exports = fromAngleRadians\n","/**\n * Create a vector from a single scalar value.\n *\n * @param {vec2} out - receiving vector\n * @param {Number} scalar - the scalar value\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.fromScalar\n */\nconst fromScalar = (out, scalar) => {\n  out[0] = scalar\n  out[1] = scalar\n  return out\n}\n\nmodule.exports = fromScalar\n","const create = require('./create')\n\n/**\n * Creates a new vector initialized with the given values.\n *\n * @param {Number} x - X coordinate\n * @param {Number} y - Y coordinate\n * @returns {vec2} a new vector\n * @alias module:modeling/maths/vec2.fromValues\n */\nconst fromValues = (x, y) => {\n  const out = create()\n  out[0] = x\n  out[1] = y\n  return out\n}\n\nmodule.exports = fromValues\n","/**\n * Represents a two dimensional vector.\n * @module modeling/maths/vec2\n */\nmodule.exports = {\n  abs: require('./abs'),\n  add: require('./add'),\n  angle: require('./angle'),\n  angleDegrees: require('./angleDegrees'),\n  angleRadians: require('./angleRadians'),\n  clone: require('./clone'),\n  copy: require('./copy'),\n  create: require('./create'),\n  cross: require('./cross'),\n  distance: require('./distance'),\n  divide: require('./divide'),\n  dot: require('./dot'),\n  equals: require('./equals'),\n  fromAngleDegrees: require('./fromAngleDegrees'),\n  fromAngleRadians: require('./fromAngleRadians'),\n  fromScalar: require('./fromScalar'),\n  fromValues: require('./fromValues'),\n  length: require('./length'),\n  lerp: require('./lerp'),\n  max: require('./max'),\n  min: require('./min'),\n  multiply: require('./multiply'),\n  negate: require('./negate'),\n  normal: require('./normal'),\n  normalize: require('./normalize'),\n  rotate: require('./rotate'),\n  scale: require('./scale'),\n  snap: require('./snap'),\n  squaredDistance: require('./squaredDistance'),\n  squaredLength: require('./squaredLength'),\n  subtract: require('./subtract'),\n  toString: require('./toString'),\n  transform: require('./transform')\n}\n","/**\n * Calculates the length of the given vector.\n *\n * @param {vec2} vector - vector of reference\n * @returns {Number} length\n * @alias module:modeling/maths/vec2.length\n */\nconst length = (vector) => Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1])\n\nmodule.exports = length\n","/**\n * Performs a linear interpolation between two vectors.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @param {Number} t - interpolation amount between the two vectors\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.lerp\n */\nconst lerp = (out, a, b, t) => {\n  const ax = a[0]\n  const ay = a[1]\n  out[0] = ax + t * (b[0] - ax)\n  out[1] = ay + t * (b[1] - ay)\n  return out\n}\n\nmodule.exports = lerp\n","/**\n * Returns the maximum coordinates of two vectors.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.max\n */\nconst max = (out, a, b) => {\n  out[0] = Math.max(a[0], b[0])\n  out[1] = Math.max(a[1], b[1])\n  return out\n}\n\nmodule.exports = max\n","/**\n * Returns the minimum coordinates of two vectors.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.min\n */\nconst min = (out, a, b) => {\n  out[0] = Math.min(a[0], b[0])\n  out[1] = Math.min(a[1], b[1])\n  return out\n}\n\nmodule.exports = min\n","/**\n * Multiplies the coordinates of two vectors (A*B).\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.multiply\n */\nconst multiply = (out, a, b) => {\n  out[0] = a[0] * b[0]\n  out[1] = a[1] * b[1]\n  return out\n}\n\nmodule.exports = multiply\n","/**\n * Negates the coordinates of the given vector.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector to negate\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.negate\n */\nconst negate = (out, vector) => {\n  out[0] = -vector[0]\n  out[1] = -vector[1]\n  return out\n}\n\nmodule.exports = negate\n","const { TAU } = require('../constants')\n\nconst create = require('./create')\nconst rotate = require('./rotate')\n\n/**\n * Calculates the normal of the given vector.\n * The normal value is the given vector rotated 90 degrees.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - given value\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.normal\n */\nconst normal = (out, vector) => rotate(out, vector, create(), (TAU / 4))\n\nmodule.exports = normal\n","/**\n * Normalize the given vector.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector to normalize\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.normalize\n */\nconst normalize = (out, vector) => {\n  const x = vector[0]\n  const y = vector[1]\n  let len = x * x + y * y\n  if (len > 0) {\n    len = 1 / Math.sqrt(len)\n  }\n  out[0] = x * len\n  out[1] = y * len\n  return out\n}\n\n// old this.dividedBy(this.length())\n\nmodule.exports = normalize\n","/**\n * Rotates the given vector by the given angle.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector to rotate\n * @param {vec2} origin - origin of the rotation\n * @param {Number} radians - angle of rotation (radians)\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.rotate\n */\nconst rotate = (out, vector, origin, radians) => {\n  const x = vector[0] - origin[0]\n  const y = vector[1] - origin[1]\n  const c = Math.cos(radians)\n  const s = Math.sin(radians)\n\n  out[0] = x * c - y * s + origin[0]\n  out[1] = x * s + y * c + origin[1]\n\n  return out\n}\n\nmodule.exports = rotate\n","/**\n * Scales the coordinates of the given vector.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector to scale\n * @param {Number} amount - amount to scale\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.scale\n */\nconst scale = (out, vector, amount) => {\n  out[0] = vector[0] * amount\n  out[1] = vector[1] * amount\n  return out\n}\n\nmodule.exports = scale\n","/**\n * Snaps the coordinates of the given vector to the given epsilon.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector to snap\n * @param {Number} epsilon - epsilon of precision, less than 0\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.snap\n */\nconst snap = (out, vector, epsilon) => {\n  out[0] = Math.round(vector[0] / epsilon) * epsilon + 0\n  out[1] = Math.round(vector[1] / epsilon) * epsilon + 0\n  return out\n}\n\nmodule.exports = snap\n","/**\n * Calculates the squared distance between the given vectors.\n *\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {Number} squared distance\n * @alias module:modeling/maths/vec2.squaredDistance\n */\nconst squaredDistance = (a, b) => {\n  const x = b[0] - a[0]\n  const y = b[1] - a[1]\n  return x * x + y * y\n}\n\nmodule.exports = squaredDistance\n","/**\n * Calculates the squared length of the given vector.\n *\n * @param {vec2} vector - vector of reference\n * @returns {Number} squared length\n * @alias module:modeling/maths/vec2.squaredLength\n */\nconst squaredLength = (vector) => {\n  const x = vector[0]\n  const y = vector[1]\n  return x * x + y * y\n}\n\nmodule.exports = squaredLength\n","/**\n * Subtracts the coordinates of two vectors (A-B).\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} a - first operand\n * @param {vec2} b - second operand\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.subtract\n */\nconst subtract = (out, a, b) => {\n  out[0] = a[0] - b[0]\n  out[1] = a[1] - b[1]\n  return out\n}\n\nmodule.exports = subtract\n","/**\n * Convert the given vector to a representative string.\n *\n * @param {vec2} vector - vector of reference\n * @returns {String} string representation\n * @alias module:modeling/maths/vec2.toString\n */\nconst toString = (vector) => `[${vector[0].toFixed(7)}, ${vector[1].toFixed(7)}]`\n\nmodule.exports = toString\n","/**\n * Transforms the given vector using the given matrix.\n *\n * @param {vec2} out - receiving vector\n * @param {vec2} vector - vector to transform\n * @param {mat4} matrix - matrix to transform with\n * @returns {vec2} out\n * @alias module:modeling/maths/vec2.transform\n */\nconst transform = (out, vector, matrix) => {\n  const x = vector[0]\n  const y = vector[1]\n  out[0] = matrix[0] * x + matrix[4] * y + matrix[12]\n  out[1] = matrix[1] * x + matrix[5] * y + matrix[13]\n  return out\n}\n\nmodule.exports = transform\n","/**\n * Calculates the absolute coordinates of the give vector.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector of reference\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.abs\n */\nconst abs = (out, vector) => {\n  out[0] = Math.abs(vector[0])\n  out[1] = Math.abs(vector[1])\n  out[2] = Math.abs(vector[2])\n  return out\n}\n\nmodule.exports = abs\n","/**\n * Adds the coordinates of two vectors (A+B).\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.add\n */\nconst add = (out, a, b) => {\n  out[0] = a[0] + b[0]\n  out[1] = a[1] + b[1]\n  out[2] = a[2] + b[2]\n  return out\n}\n\nmodule.exports = add\n","const dot = require('./dot')\n\n/**\n * Calculate the angle between two vectors.\n *\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {Number} angle (radians)\n * @alias module:modeling/maths/vec3.angle\n */\nconst angle = (a, b) => {\n  const ax = a[0]\n  const ay = a[1]\n  const az = a[2]\n  const bx = b[0]\n  const by = b[1]\n  const bz = b[2]\n  const mag1 = Math.sqrt(ax * ax + ay * ay + az * az)\n  const mag2 = Math.sqrt(bx * bx + by * by + bz * bz)\n  const mag = mag1 * mag2\n  const cosine = mag && dot(a, b) / mag\n  return Math.acos(Math.min(Math.max(cosine, -1), 1))\n}\n\nmodule.exports = angle\n","const create = require('./create')\n\n/**\n * Create a clone of the given vector.\n *\n * @param {vec3} vector - vector to clone\n * @returns {vec3} a new vector\n * @alias module:modeling/maths/vec3.clone\n */\nconst clone = (vector) => {\n  const out = create()\n  out[0] = vector[0]\n  out[1] = vector[1]\n  out[2] = vector[2]\n  return out\n}\n\nmodule.exports = clone\n","/**\n * Create a copy of the given vector.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to copy\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.copy\n */\nconst copy = (out, vector) => {\n  out[0] = vector[0]\n  out[1] = vector[1]\n  out[2] = vector[2]\n  return out\n}\n\nmodule.exports = copy\n","/**\n * Represents a three dimensional vector.\n * See fromValues().\n * @typedef {Array} vec3\n */\n\n/**\n * Creates a new vector initialized to [0,0,0].\n *\n * @returns {vec3} a new vector\n * @alias module:modeling/maths/vec3.create\n */\nconst create = () => [0, 0, 0]\n\nmodule.exports = create\n","/**\n * Computes the cross product of the given vectors (AxB).\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.cross\n */\nconst cross = (out, a, b) => {\n  const ax = a[0]\n  const ay = a[1]\n  const az = a[2]\n  const bx = b[0]\n  const by = b[1]\n  const bz = b[2]\n\n  out[0] = ay * bz - az * by\n  out[1] = az * bx - ax * bz\n  out[2] = ax * by - ay * bx\n  return out\n}\n\nmodule.exports = cross\n","/**\n * Calculates the Euclidian distance between the given vectors.\n *\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {Number} distance\n * @alias module:modeling/maths/vec3.distance\n */\nconst distance = (a, b) => {\n  const x = b[0] - a[0]\n  const y = b[1] - a[1]\n  const z = b[2] - a[2]\n  return Math.sqrt(x * x + y * y + z * z)\n}\n\nmodule.exports = distance\n","/**\n * Divides the coordinates of two vectors (A/B).\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - dividend vector\n * @param {vec3} b - divisor vector\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.divide\n */\nconst divide = (out, a, b) => {\n  out[0] = a[0] / b[0]\n  out[1] = a[1] / b[1]\n  out[2] = a[2] / b[2]\n  return out\n}\n\nmodule.exports = divide\n","/**\n * Calculates the dot product of two vectors.\n *\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {Number} dot product\n * @alias module:modeling/maths/vec3.dot\n */\nconst dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n\nmodule.exports = dot\n","/**\n * Compare the given vectors for equality.\n *\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {Boolean} true if a and b are equal\n * @alias module:modeling/maths/vec3.equals\n */\nconst equals = (a, b) => (a[0] === b[0]) && (a[1] === b[1]) && (a[2] === b[2])\n\nmodule.exports = equals\n","/**\n * Creates a vector from a single scalar value.\n * All components of the resulting vector have the given value.\n *\n * @param {vec3} out - receiving vector\n * @param {Number} scalar\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.fromScalar\n */\nconst fromScalar = (out, scalar) => {\n  out[0] = scalar\n  out[1] = scalar\n  out[2] = scalar\n  return out\n}\n\nmodule.exports = fromScalar\n","const create = require('./create')\n\n/**\n * Creates a new vector initialized with the given values.\n *\n * @param {Number} x - X component\n * @param {Number} y - Y component\n * @param {Number} z - Z component\n * @returns {vec3} a new vector\n * @alias module:modeling/maths/vec3.fromValues\n */\nconst fromValues = (x, y, z) => {\n  const out = create()\n  out[0] = x\n  out[1] = y\n  out[2] = z\n  return out\n}\n\nmodule.exports = fromValues\n","/**\n * Create a new vector by extending a 2D vector with a Z value.\n *\n * @param {vec3} out - receiving vector\n * @param {Array} vector - 2D vector of values\n * @param {Number} [z=0] - Z value\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.fromVec2\n */\nconst fromVector2 = (out, vector, z = 0) => {\n  out[0] = vector[0]\n  out[1] = vector[1]\n  out[2] = z\n  return out\n}\n\nmodule.exports = fromVector2\n","/**\n * Represents a three dimensional vector.\n * @see {@link vec3} for data structure information.\n * @module modeling/maths/vec3\n */\nmodule.exports = {\n  abs: require('./abs'),\n  add: require('./add'),\n  angle: require('./angle'),\n  clone: require('./clone'),\n  copy: require('./copy'),\n  create: require('./create'),\n  cross: require('./cross'),\n  distance: require('./distance'),\n  divide: require('./divide'),\n  dot: require('./dot'),\n  equals: require('./equals'),\n  fromScalar: require('./fromScalar'),\n  fromValues: require('./fromValues'),\n  fromVec2: require('./fromVec2'),\n  length: require('./length'),\n  lerp: require('./lerp'),\n  max: require('./max'),\n  min: require('./min'),\n  multiply: require('./multiply'),\n  negate: require('./negate'),\n  normalize: require('./normalize'),\n  orthogonal: require('./orthogonal'),\n  rotateX: require('./rotateX'),\n  rotateY: require('./rotateY'),\n  rotateZ: require('./rotateZ'),\n  scale: require('./scale'),\n  snap: require('./snap'),\n  squaredDistance: require('./squaredDistance'),\n  squaredLength: require('./squaredLength'),\n  subtract: require('./subtract'),\n  toString: require('./toString'),\n  transform: require('./transform')\n}\n","/**\n * Calculates the length of a vector.\n *\n * @param {vec3} vector - vector to calculate length of\n * @returns {Number} length\n * @alias module:modeling/maths/vec3.length\n */\nconst length = (vector) => {\n  const x = vector[0]\n  const y = vector[1]\n  const z = vector[2]\n  return Math.sqrt(x * x + y * y + z * z)\n}\n\nmodule.exports = length\n","/**\n * Performs a linear interpolation between two vectors.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @param {Number} t - interpolant (0.0 to 1.0) applied between the two inputs\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.lerp\n */\nconst lerp = (out, a, b, t) => {\n  out[0] = a[0] + t * (b[0] - a[0])\n  out[1] = a[1] + t * (b[1] - a[1])\n  out[2] = a[2] + t * (b[2] - a[2])\n  return out\n}\n\nmodule.exports = lerp\n","/**\n * Returns the maximum coordinates of the given vectors.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.max\n */\nconst max = (out, a, b) => {\n  out[0] = Math.max(a[0], b[0])\n  out[1] = Math.max(a[1], b[1])\n  out[2] = Math.max(a[2], b[2])\n  return out\n}\n\nmodule.exports = max\n","/**\n * Returns the minimum coordinates of the given vectors.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.min\n */\nconst min = (out, a, b) => {\n  out[0] = Math.min(a[0], b[0])\n  out[1] = Math.min(a[1], b[1])\n  out[2] = Math.min(a[2], b[2])\n  return out\n}\n\nmodule.exports = min\n","/**\n * Multiply the coordinates of the given vectors (A*B).\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.multiply\n */\nconst multiply = (out, a, b) => {\n  out[0] = a[0] * b[0]\n  out[1] = a[1] * b[1]\n  out[2] = a[2] * b[2]\n  return out\n}\n\nmodule.exports = multiply\n","/**\n * Negates the coordinates of the given vector.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to negate\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.negate\n */\nconst negate = (out, vector) => {\n  out[0] = -vector[0]\n  out[1] = -vector[1]\n  out[2] = -vector[2]\n  return out\n}\n\nmodule.exports = negate\n","/**\n * Normalize the given vector.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to normalize\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.normalize\n */\nconst normalize = (out, vector) => {\n  const x = vector[0]\n  const y = vector[1]\n  const z = vector[2]\n  let len = x * x + y * y + z * z\n  if (len > 0) {\n    len = 1 / Math.sqrt(len)\n  }\n  out[0] = x * len\n  out[1] = y * len\n  out[2] = z * len\n  return out\n}\n\nmodule.exports = normalize\n","const abs = require('./abs')\nconst create = require('./create')\nconst cross = require('./cross')\n\n/**\n * Create a new vector that is orthogonal to the given vector.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector of reference\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.orthogonal\n */\nconst orthogonal = (out, vector) => {\n  const bV = abs(create(), vector)\n  const b0 = 0 + ((bV[0] < bV[1]) && (bV[0] < bV[2]))\n  const b1 = 0 + ((bV[1] <= bV[0]) && (bV[1] < bV[2]))\n  const b2 = 0 + ((bV[2] <= bV[0]) && (bV[2] <= bV[1]))\n\n  return cross(out, vector, [b0, b1, b2])\n}\n\nmodule.exports = orthogonal\n","/**\n * Rotate the given vector around the given origin, X axis only.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to rotate\n * @param {vec3} origin - origin of the rotation\n * @param {Number} radians - angle of rotation\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.rotateX\n */\nconst rotateX = (out, vector, origin, radians) => {\n  const p = []\n  const r = []\n\n  // translate point to the origin\n  p[0] = vector[0] - origin[0]\n  p[1] = vector[1] - origin[1]\n  p[2] = vector[2] - origin[2]\n\n  // perform rotation\n  r[0] = p[0]\n  r[1] = p[1] * Math.cos(radians) - p[2] * Math.sin(radians)\n  r[2] = p[1] * Math.sin(radians) + p[2] * Math.cos(radians)\n\n  // translate to correct position\n  out[0] = r[0] + origin[0]\n  out[1] = r[1] + origin[1]\n  out[2] = r[2] + origin[2]\n\n  return out\n}\n\nmodule.exports = rotateX\n","/**\n * Rotate the given vector around the given origin, Y axis only.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to rotate\n * @param {vec3} origin - origin of the rotation\n * @param {Number} radians - angle of rotation\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.rotateY\n */\nconst rotateY = (out, vector, origin, radians) => {\n  const p = []\n  const r = []\n\n  // translate point to the origin\n  p[0] = vector[0] - origin[0]\n  p[1] = vector[1] - origin[1]\n  p[2] = vector[2] - origin[2]\n\n  // perform rotation\n  r[0] = p[2] * Math.sin(radians) + p[0] * Math.cos(radians)\n  r[1] = p[1]\n  r[2] = p[2] * Math.cos(radians) - p[0] * Math.sin(radians)\n\n  // translate to correct position\n  out[0] = r[0] + origin[0]\n  out[1] = r[1] + origin[1]\n  out[2] = r[2] + origin[2]\n\n  return out\n}\n\nmodule.exports = rotateY\n","/**\n * Rotate the given vector around the given origin, Z axis only.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to rotate\n * @param {vec3} origin - origin of the rotation\n * @param {Number} radians - angle of rotation in radians\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.rotateZ\n */\nconst rotateZ = (out, vector, origin, radians) => {\n  const p = []\n  const r = []\n  // Translate point to the origin\n  p[0] = vector[0] - origin[0]\n  p[1] = vector[1] - origin[1]\n\n  // perform rotation\n  r[0] = (p[0] * Math.cos(radians)) - (p[1] * Math.sin(radians))\n  r[1] = (p[0] * Math.sin(radians)) + (p[1] * Math.cos(radians))\n\n  // translate to correct position\n  out[0] = r[0] + origin[0]\n  out[1] = r[1] + origin[1]\n  out[2] = vector[2]\n\n  return out\n}\n\nmodule.exports = rotateZ\n","/**\n * Scales the coordinates of the given vector by a scalar number.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to scale\n * @param {Number} amount - amount to scale the vector by\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.scale\n */\nconst scale = (out, vector, amount) => {\n  out[0] = vector[0] * amount\n  out[1] = vector[1] * amount\n  out[2] = vector[2] * amount\n  return out\n}\n\nmodule.exports = scale\n","/**\n * Snaps the coordinates of the given vector to the given epsilon.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to snap\n * @param {Number} epsilon - epsilon of precision, less than 0\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.snap\n */\nconst snap = (out, vector, epsilon) => {\n  out[0] = Math.round(vector[0] / epsilon) * epsilon + 0\n  out[1] = Math.round(vector[1] / epsilon) * epsilon + 0\n  out[2] = Math.round(vector[2] / epsilon) * epsilon + 0\n  return out\n}\n\nmodule.exports = snap\n","/**\n * Calculates the squared distance between two vectors.\n *\n * @param {vec3} a - first operand\n * @param {vec3} b - second operand\n * @returns {Number} squared distance\n * @alias module:modeling/maths/vec3.squaredDistance\n */\nconst squaredDistance = (a, b) => {\n  const x = b[0] - a[0]\n  const y = b[1] - a[1]\n  const z = b[2] - a[2]\n  return x * x + y * y + z * z\n}\n\nmodule.exports = squaredDistance\n","/**\n * Calculates the squared length of the given vector.\n *\n * @param {vec3} vector - vector to calculate squared length of\n * @returns {Number} squared length\n * @alias module:modeling/maths/vec3.squaredLength\n */\nconst squaredLength = (vector) => {\n  const x = vector[0]\n  const y = vector[1]\n  const z = vector[2]\n  return x * x + y * y + z * z\n}\n\nmodule.exports = squaredLength\n","/**\n * Subtracts the coordinates of two vectors (A-B).\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} a - minuend vector\n * @param {vec3} b - subtrahend vector\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.subtract\n */\nconst subtract = (out, a, b) => {\n  out[0] = a[0] - b[0]\n  out[1] = a[1] - b[1]\n  out[2] = a[2] - b[2]\n  return out\n}\n\nmodule.exports = subtract\n","/**\n * Convert the given vector to a representative string.\n * @param {vec3} vec - vector of reference\n * @returns {String} string representation\n * @alias module:modeling/maths/vec3.toString\n */\nconst toString = (vec) => `[${vec[0].toFixed(7)}, ${vec[1].toFixed(7)}, ${vec[2].toFixed(7)}]`\n\nmodule.exports = toString\n","/**\n * Transforms the given vector using the given matrix.\n *\n * @param {vec3} out - receiving vector\n * @param {vec3} vector - vector to transform\n * @param {mat4} matrix - transform matrix\n * @returns {vec3} out\n * @alias module:modeling/maths/vec3.transform\n */\nconst transform = (out, vector, matrix) => {\n  const x = vector[0]\n  const y = vector[1]\n  const z = vector[2]\n  let w = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15]\n  w = w || 1.0\n  out[0] = (matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12]) / w\n  out[1] = (matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13]) / w\n  out[2] = (matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14]) / w\n  return out\n}\n\nmodule.exports = transform\n","const create = require('./create')\n\n/**\n * Create a clone of the given vector.\n *\n * @param {vec4} vector - source vector\n * @returns {vec4} a new vector\n * @alias module:modeling/maths/vec4.clone\n */\nconst clone = (vector) => {\n  const out = create()\n  out[0] = vector[0]\n  out[1] = vector[1]\n  out[2] = vector[2]\n  out[3] = vector[3]\n  return out\n}\n\nmodule.exports = clone\n","/**\n * Create a copy of the given vector.\n *\n * @param {vec4} out - receiving vector\n * @param {vec4} vector - source vector\n * @returns {vec4} out\n * @alias module:modeling/maths/vec4.copy\n */\nconst copy = (out, vector) => {\n  out[0] = vector[0]\n  out[1] = vector[1]\n  out[2] = vector[2]\n  out[3] = vector[3]\n  return out\n}\n\nmodule.exports = copy\n","/**\n * Represents a four dimensional vector.\n * See fromValues().\n * @typedef {Array} vec4\n */\n\n/**\n * Creates a new vector initialized to [0,0,0,0].\n *\n * @returns {vec4} a new vector\n * @alias module:modeling/maths/vec4.create\n */\nconst create = () => [0, 0, 0, 0]\n\nmodule.exports = create\n","/**\n * Calculates the dot product of the given vectors.\n *\n * @param {vec4} a - first vector\n * @param {vec4} b - second vector\n * @returns {Number} dot product\n * @alias module:modeling/maths/vec4.dot\n */\nconst dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]\n\nmodule.exports = dot\n","/**\n * Compare the given vectors for equality.\n *\n * @param {vec4} a - first vector\n * @param {vec4} b - second vector\n * @return {Boolean} true if vectors are equal\n * @alias module:modeling/maths/vec4.equals\n */\nconst equals = (a, b) => ((a[0] === b[0]) && (a[1] === b[1]) && (a[2] === b[2]) && (a[3] === b[3]))\n\nmodule.exports = equals\n","/**\n * Create a new vector from the given scalar value.\n *\n * @param {vec4} out - receiving vector\n * @param  {Number} scalar\n * @returns {vec4} out\n * @alias module:modeling/maths/vec4.fromScalar\n */\nconst fromScalar = (out, scalar) => {\n  out[0] = scalar\n  out[1] = scalar\n  out[2] = scalar\n  out[3] = scalar\n  return out\n}\n\nmodule.exports = fromScalar\n","const create = require('./create')\n\n/**\n * Creates a new vector with the given values.\n *\n * @param {Number} x - X component\n * @param {Number} y - Y component\n * @param {Number} z - Z component\n * @param {Number} w - W component\n * @returns {vec4} a new vector\n * @alias module:modeling/maths/vec4.fromValues\n */\nconst fromValues = (x, y, z, w) => {\n  const out = create()\n  out[0] = x\n  out[1] = y\n  out[2] = z\n  out[3] = w\n  return out\n}\n\nmodule.exports = fromValues\n","/**\n * Represents a four dimensional vector.\n * @see {@link vec4} for data structure information.\n * @module modeling/maths/vec4\n */\nmodule.exports = {\n  clone: require('./clone'),\n  copy: require('./copy'),\n  create: require('./create'),\n  dot: require('./dot'),\n  equals: require('./equals'),\n  fromScalar: require('./fromScalar'),\n  fromValues: require('./fromValues'),\n  toString: require('./toString'),\n  transform: require('./transform')\n}\n","/**\n * Convert the given vector to a representative string.\n *\n * @param {vec4} vec - vector to convert\n * @returns {String} representative string\n * @alias module:modeling/maths/vec4.toString\n */\nconst toString = (vec) => `(${vec[0].toFixed(9)}, ${vec[1].toFixed(9)}, ${vec[2].toFixed(9)}, ${vec[3].toFixed(9)})`\n\nmodule.exports = toString\n","/**\n * Transform the given vector using the given matrix.\n *\n * @param {vec4} out - receiving vector\n * @param {vec4} vector - vector to transform\n * @param {mat4} matrix - matrix to transform with\n * @returns {vec4} out\n * @alias module:modeling/maths/vec4.transform\n */\nconst transform = (out, vector, matrix) => {\n  const [x, y, z, w] = vector\n\n  out[0] = matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12] * w\n  out[1] = matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13] * w\n  out[2] = matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14] * w\n  out[3] = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15] * w\n  return out\n}\n\nmodule.exports = transform\n","const { EPS } = require('../maths/constants')\n\nconst calculateEpsilonFromBounds = (bounds, dimensions) => {\n  let total = 0\n  for (let i = 0; i < dimensions; i++) {\n    total += bounds[1][i] - bounds[0][i]\n  }\n  return EPS * total / dimensions\n}\n\nmodule.exports = calculateEpsilonFromBounds\n","/**\n * All shapes (primitives or the results of operations) can be measured, e.g. calculate volume, etc.\n * @module modeling/measurements\n * @example\n * const { measureArea, measureBoundingBox, measureVolume } = require('@jscad/modeling').measurements\n */\nmodule.exports = {\n  measureAggregateArea: require('./measureAggregateArea'),\n  measureAggregateBoundingBox: require('./measureAggregateBoundingBox'),\n  measureAggregateEpsilon: require('./measureAggregateEpsilon'),\n  measureAggregateVolume: require('./measureAggregateVolume'),\n  measureArea: require('./measureArea'),\n  measureBoundingBox: require('./measureBoundingBox'),\n  measureBoundingSphere: require('./measureBoundingSphere'),\n  measureCenter: require('./measureCenter'),\n  measureCenterOfMass: require('./measureCenterOfMass'),\n  measureDimensions: require('./measureDimensions'),\n  measureEpsilon: require('./measureEpsilon'),\n  measureVolume: require('./measureVolume')\n}\n","const flatten = require('../utils/flatten')\n\nconst measureArea = require('./measureArea')\n\n/**\n * Measure the total (aggregate) area for the given geometries.\n * Note: This measurement will not account for overlapping geometry\n * @param {...Object} geometries - the geometries to measure.\n * @return {Number} the total surface area for the group of geometry.\n * @alias module:modeling/measurements.measureAggregateArea\n *\n * @example\n * let totalArea = measureAggregateArea(sphere(),cube())\n */\nconst measureAggregateArea = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('measureAggregateArea: no geometries supplied')\n  const areas = measureArea(geometries)\n  if (geometries.length === 1) {\n    return areas\n  }\n  const result = 0\n  return areas.reduce((result, area) => result + area, result)\n}\n\nmodule.exports = measureAggregateArea\n","const flatten = require('../utils/flatten')\nconst vec3min = require('../maths/vec3/min')\nconst vec3max = require('../maths/vec3/max')\n\nconst measureBoundingBox = require('./measureBoundingBox')\n\n/**\n * Measure the aggregated minimum and maximum bounds for the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Array} the min and max bounds for the group of geometry, i.e. [[x,y,z],[X,Y,Z]]\n * @alias module:modeling/measurements.measureAggregateBoundingBox\n *\n * @example\n * let bounds = measureAggregateBoundingBox(sphere(),cube())\n */\nconst measureAggregateBoundingBox = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('measureAggregateBoundingBox: no geometries supplied')\n  const bounds = measureBoundingBox(geometries)\n  if (geometries.length === 1) {\n    return bounds\n  }\n  const result = [[Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE], [-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE]]\n  return bounds.reduce((result, item) => {\n    result = [vec3min(result[0], result[0], item[0]), vec3max(result[1], result[1], item[1])]\n    return result\n  }, result)\n}\n\nmodule.exports = measureAggregateBoundingBox\n","const flatten = require('../utils/flatten')\nconst measureAggregateBoundingBox = require('./measureAggregateBoundingBox')\nconst calculateEpsilonFromBounds = require('./calculateEpsilonFromBounds')\nconst { geom2, geom3, path2 } = require('../geometries')\n\n/**\n * Measure the aggregated Epsilon for the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Number} the aggregated Epsilon for the whole group of geometries\n * @alias module:modeling/measurements.measureAggregateEpsilon\n *\n * @example\n * let groupEpsilon = measureAggregateEpsilon(sphere(),cube())\n */\nconst measureAggregateEpsilon = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('measureAggregateEpsilon: no geometries supplied')\n  const bounds = measureAggregateBoundingBox(geometries)\n\n  let dimensions = 0\n  dimensions = geometries.reduce((dimensions, geometry) => {\n    if (path2.isA(geometry) || geom2.isA(geometry)) return Math.max(dimensions, 2)\n    if (geom3.isA(geometry)) return Math.max(dimensions, 3)\n    return 0\n  }, dimensions)\n  return calculateEpsilonFromBounds(bounds, dimensions)\n}\n\nmodule.exports = measureAggregateEpsilon\n","const flatten = require('../utils/flatten')\n\nconst measureVolume = require('./measureVolume')\n\n/**\n * Measure the total (aggregate) volume for the given geometries.\n * Note: This measurement will not account for overlapping geometry\n * @param {...Object} geometries - the geometries to measure.\n * @return {Number} the volume for the group of geometry.\n * @alias module:modeling/measurements.measureAggregateVolume\n *\n * @example\n * let totalVolume = measureAggregateVolume(sphere(),cube())\n */\nconst measureAggregateVolume = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('measureAggregateVolume: no geometries supplied')\n  const volumes = measureVolume(geometries)\n  if (geometries.length === 1) {\n    return volumes\n  }\n  const result = 0\n  return volumes.reduce((result, volume) => result + volume, result)\n}\n\nmodule.exports = measureAggregateVolume\n","const flatten = require('../utils/flatten')\n\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\nconst path2 = require('../geometries/path2')\nconst poly3 = require('../geometries/poly3')\n\nconst cache = new WeakMap()\n\n/*\n * Measure the area of the given geometry.\n * NOTE: paths are infinitely narrow and do not have an area\n *\n * @param {path2} geometry - geometry to measure\n * @returns {Number} area of the geometry\n */\nconst measureAreaOfPath2 = () => 0\n\n/*\n * Measure the area of the given geometry.\n * For a counter clockwise rotating geometry (about Z) the area is positive, otherwise negative.\n *\n * @see http://paulbourke.net/geometry/polygonmesh/\n * @param {geom2} geometry - 2D geometry to measure\n * @returns {Number} area of the geometry\n */\nconst measureAreaOfGeom2 = (geometry) => {\n  let area = cache.get(geometry)\n  if (area) return area\n\n  const sides = geom2.toSides(geometry)\n  area = sides.reduce((area, side) => area + (side[0][0] * side[1][1] - side[0][1] * side[1][0]), 0)\n  area *= 0.5\n\n  cache.set(geometry, area)\n\n  return area\n}\n\n/*\n * Measure the area of the given geometry.\n *\n * @param {geom3} geometry - 3D geometry to measure\n * @returns {Number} area of the geometry\n */\nconst measureAreaOfGeom3 = (geometry) => {\n  let area = cache.get(geometry)\n  if (area) return area\n\n  const polygons = geom3.toPolygons(geometry)\n  area = polygons.reduce((area, polygon) => area + poly3.measureArea(polygon), 0)\n\n  cache.set(geometry, area)\n\n  return area\n}\n\n/**\n * Measure the area of the given geometries.\n * @param {...Objects} geometries - the geometries to measure\n * @return {Number|Array} the area, or a list of areas for each geometry\n * @alias module:modeling/measurements.measureArea\n *\n * @example\n * let area = measureArea(sphere())\n */\nconst measureArea = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return measureAreaOfPath2(geometry)\n    if (geom2.isA(geometry)) return measureAreaOfGeom2(geometry)\n    if (geom3.isA(geometry)) return measureAreaOfGeom3(geometry)\n    return 0\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureArea\n","const flatten = require('../utils/flatten')\n\nconst vec2 = require('../maths/vec2')\nconst vec3 = require('../maths/vec3')\n\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\nconst path2 = require('../geometries/path2')\nconst poly3 = require('../geometries/poly3')\n\nconst cache = new WeakMap()\n\n/*\n * Measure the min and max bounds of the given (path2) geometry.\n * @return {Array[]} the min and max bounds for the geometry\n */\nconst measureBoundingBoxOfPath2 = (geometry) => {\n  let boundingBox = cache.get(geometry)\n  if (boundingBox) return boundingBox\n\n  const points = path2.toPoints(geometry)\n\n  let minpoint\n  if (points.length === 0) {\n    minpoint = vec2.create()\n  } else {\n    minpoint = vec2.clone(points[0])\n  }\n  let maxpoint = vec2.clone(minpoint)\n\n  points.forEach((point) => {\n    vec2.min(minpoint, minpoint, point)\n    vec2.max(maxpoint, maxpoint, point)\n  })\n  minpoint = [minpoint[0], minpoint[1], 0]\n  maxpoint = [maxpoint[0], maxpoint[1], 0]\n\n  boundingBox = [minpoint, maxpoint]\n\n  cache.set(geometry, boundingBox)\n\n  return boundingBox\n}\n\n/*\n * Measure the min and max bounds of the given (geom2) geometry.\n * @return {Array[]} the min and max bounds for the geometry\n */\nconst measureBoundingBoxOfGeom2 = (geometry) => {\n  let boundingBox = cache.get(geometry)\n  if (boundingBox) return boundingBox\n\n  const points = geom2.toPoints(geometry)\n\n  let minpoint\n  if (points.length === 0) {\n    minpoint = vec2.create()\n  } else {\n    minpoint = vec2.clone(points[0])\n  }\n  let maxpoint = vec2.clone(minpoint)\n\n  points.forEach((point) => {\n    vec2.min(minpoint, minpoint, point)\n    vec2.max(maxpoint, maxpoint, point)\n  })\n\n  minpoint = [minpoint[0], minpoint[1], 0]\n  maxpoint = [maxpoint[0], maxpoint[1], 0]\n\n  boundingBox = [minpoint, maxpoint]\n\n  cache.set(geometry, boundingBox)\n\n  return boundingBox\n}\n\n/*\n * Measure the min and max bounds of the given (geom3) geometry.\n * @return {Array[]} the min and max bounds for the geometry\n */\nconst measureBoundingBoxOfGeom3 = (geometry) => {\n  let boundingBox = cache.get(geometry)\n  if (boundingBox) return boundingBox\n\n  const polygons = geom3.toPolygons(geometry)\n\n  let minpoint = vec3.create()\n  if (polygons.length > 0) {\n    const points = poly3.toPoints(polygons[0])\n    vec3.copy(minpoint, points[0])\n  }\n  let maxpoint = vec3.clone(minpoint)\n\n  polygons.forEach((polygon) => {\n    poly3.toPoints(polygon).forEach((point) => {\n      vec3.min(minpoint, minpoint, point)\n      vec3.max(maxpoint, maxpoint, point)\n    })\n  })\n\n  minpoint = [minpoint[0], minpoint[1], minpoint[2]]\n  maxpoint = [maxpoint[0], maxpoint[1], maxpoint[2]]\n\n  boundingBox = [minpoint, maxpoint]\n\n  cache.set(geometry, boundingBox)\n\n  return boundingBox\n}\n\n/**\n * Measure the min and max bounds of the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Array} the min and max bounds, or a list of bounds for each geometry\n * @alias module:modeling/measurements.measureBoundingBox\n *\n * @example\n * let bounds = measureBoundingBox(sphere())\n */\nconst measureBoundingBox = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return measureBoundingBoxOfPath2(geometry)\n    if (geom2.isA(geometry)) return measureBoundingBoxOfGeom2(geometry)\n    if (geom3.isA(geometry)) return measureBoundingBoxOfGeom3(geometry)\n    return [[0, 0, 0], [0, 0, 0]]\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureBoundingBox\n","const flatten = require('../utils/flatten')\n\nconst vec2 = require('../maths/vec2')\nconst vec3 = require('../maths/vec3')\n\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\nconst path2 = require('../geometries/path2')\nconst poly3 = require('../geometries/poly3')\n\nconst cacheOfBoundingSpheres = new WeakMap()\n\n/*\n * Measure the bounding sphere of the given (path2) geometry.\n * @return {[[x, y, z], radius]} the bounding sphere for the geometry\n */\nconst measureBoundingSphereOfPath2 = (geometry) => {\n  let boundingSphere = cacheOfBoundingSpheres.get(geometry)\n  if (boundingSphere !== undefined) return boundingSphere\n\n  const centroid = vec3.create()\n  let radius = 0\n\n  const points = path2.toPoints(geometry)\n\n  if (points.length > 0) {\n    // calculate the centroid of the geometry\n    let numPoints = 0\n    const temp = vec3.create()\n    points.forEach((point) => {\n      vec3.add(centroid, centroid, vec3.fromVec2(temp, point, 0))\n      numPoints++\n    })\n    vec3.scale(centroid, centroid, 1 / numPoints)\n\n    // find the farthest point from the centroid\n    points.forEach((point) => {\n      radius = Math.max(radius, vec2.squaredDistance(centroid, point))\n    })\n    radius = Math.sqrt(radius)\n  }\n\n  boundingSphere = [centroid, radius]\n  cacheOfBoundingSpheres.set(geometry, boundingSphere)\n\n  return boundingSphere\n}\n\n/*\n * Measure the bounding sphere of the given (geom2) geometry.\n * @return {[[x, y, z], radius]} the bounding sphere for the geometry\n */\nconst measureBoundingSphereOfGeom2 = (geometry) => {\n  let boundingSphere = cacheOfBoundingSpheres.get(geometry)\n  if (boundingSphere !== undefined) return boundingSphere\n\n  const centroid = vec3.create()\n  let radius = 0\n\n  const sides = geom2.toSides(geometry)\n\n  if (sides.length > 0) {\n    // calculate the centroid of the geometry\n    let numPoints = 0\n    const temp = vec3.create()\n    sides.forEach((side) => {\n      vec3.add(centroid, centroid, vec3.fromVec2(temp, side[0], 0))\n      numPoints++\n    })\n    vec3.scale(centroid, centroid, 1 / numPoints)\n\n    // find the farthest point from the centroid\n    sides.forEach((side) => {\n      radius = Math.max(radius, vec2.squaredDistance(centroid, side[0]))\n    })\n    radius = Math.sqrt(radius)\n  }\n\n  boundingSphere = [centroid, radius]\n  cacheOfBoundingSpheres.set(geometry, boundingSphere)\n\n  return boundingSphere\n}\n\n/*\n * Measure the bounding sphere of the given (geom3) geometry.\n * @return {[[x, y, z], radius]} the bounding sphere for the geometry\n */\nconst measureBoundingSphereOfGeom3 = (geometry) => {\n  let boundingSphere = cacheOfBoundingSpheres.get(geometry)\n  if (boundingSphere !== undefined) return boundingSphere\n\n  const centroid = vec3.create()\n  let radius = 0\n\n  const polygons = geom3.toPolygons(geometry)\n\n  if (polygons.length > 0) {\n    // calculate the centroid of the geometry\n    let numPoints = 0\n    polygons.forEach((polygon) => {\n      poly3.toPoints(polygon).forEach((point) => {\n        vec3.add(centroid, centroid, point)\n        numPoints++\n      })\n    })\n    vec3.scale(centroid, centroid, 1 / numPoints)\n\n    // find the farthest point from the centroid\n    polygons.forEach((polygon) => {\n      poly3.toPoints(polygon).forEach((point) => {\n        radius = Math.max(radius, vec3.squaredDistance(centroid, point))\n      })\n    })\n    radius = Math.sqrt(radius)\n  }\n\n  boundingSphere = [centroid, radius]\n  cacheOfBoundingSpheres.set(geometry, boundingSphere)\n\n  return boundingSphere\n}\n\n/**\n * Measure the (approximate) bounding sphere of the given geometries.\n * @see https://en.wikipedia.org/wiki/Bounding_sphere\n * @param {...Object} geometries - the geometries to measure\n * @return {Array} the bounding sphere for each geometry, i.e. [centroid, radius]\n * @alias module:modeling/measurements.measureBoundingSphere\n *\n * @example\n * let bounds = measureBoundingSphere(cube())\n */\nconst measureBoundingSphere = (...geometries) => {\n  geometries = flatten(geometries)\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return measureBoundingSphereOfPath2(geometry)\n    if (geom2.isA(geometry)) return measureBoundingSphereOfGeom2(geometry)\n    if (geom3.isA(geometry)) return measureBoundingSphereOfGeom3(geometry)\n    return [[0, 0, 0], 0]\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureBoundingSphere\n","const flatten = require('../utils/flatten')\n\nconst measureBoundingBox = require('./measureBoundingBox')\n\n/**\n * Measure the center of the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Array} the center point for each geometry, i.e. [X, Y, Z]\n * @alias module:modeling/measurements.measureCenter\n *\n * @example\n * let center = measureCenter(sphere())\n */\nconst measureCenter = (...geometries) => {\n  geometries = flatten(geometries)\n\n  const results = geometries.map((geometry) => {\n    const bounds = measureBoundingBox(geometry)\n    return [\n      (bounds[0][0] + ((bounds[1][0] - bounds[0][0]) / 2)),\n      (bounds[0][1] + ((bounds[1][1] - bounds[0][1]) / 2)),\n      (bounds[0][2] + ((bounds[1][2] - bounds[0][2]) / 2))\n    ]\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureCenter\n","const flatten = require('../utils/flatten')\n\nconst vec3 = require('../maths/vec3')\n\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\n\nconst cacheOfCenterOfMass = new WeakMap()\n\n/*\n * Measure the center of mass for the given geometry.\n *\n * @see http://paulbourke.net/geometry/polygonmesh/\n * @return {Array} the center of mass for the geometry\n */\nconst measureCenterOfMassGeom2 = (geometry) => {\n  let centerOfMass = cacheOfCenterOfMass.get(geometry)\n  if (centerOfMass !== undefined) return centerOfMass\n\n  const sides = geom2.toSides(geometry)\n\n  let area = 0\n  let x = 0\n  let y = 0\n  if (sides.length > 0) {\n    for (let i = 0; i < sides.length; i++) {\n      const p1 = sides[i][0]\n      const p2 = sides[i][1]\n\n      const a = p1[0] * p2[1] - p1[1] * p2[0]\n      area += a\n      x += (p1[0] + p2[0]) * a\n      y += (p1[1] + p2[1]) * a\n    }\n    area /= 2\n\n    const f = 1 / (area * 6)\n    x *= f\n    y *= f\n  }\n\n  centerOfMass = vec3.fromValues(x, y, 0)\n\n  cacheOfCenterOfMass.set(geometry, centerOfMass)\n  return centerOfMass\n}\n\n/*\n * Measure the center of mass for the given geometry.\n * @return {Array} the center of mass for the geometry\n */\nconst measureCenterOfMassGeom3 = (geometry) => {\n  let centerOfMass = cacheOfCenterOfMass.get(geometry)\n  if (centerOfMass !== undefined) return centerOfMass\n\n  centerOfMass = vec3.create() // 0, 0, 0\n\n  const polygons = geom3.toPolygons(geometry)\n  if (polygons.length === 0) return centerOfMass\n\n  let totalVolume = 0\n  const vector = vec3.create() // for speed\n  polygons.forEach((polygon) => {\n    // calculate volume and center of each tetrahedron\n    const vertices = polygon.vertices\n    for (let i = 0; i < vertices.length - 2; i++) {\n      vec3.cross(vector, vertices[i + 1], vertices[i + 2])\n      const volume = vec3.dot(vertices[0], vector) / 6\n\n      totalVolume += volume\n\n      vec3.add(vector, vertices[0], vertices[i + 1])\n      vec3.add(vector, vector, vertices[i + 2])\n      const weightedCenter = vec3.scale(vector, vector, 1 / 4 * volume)\n\n      vec3.add(centerOfMass, centerOfMass, weightedCenter)\n    }\n  })\n  vec3.scale(centerOfMass, centerOfMass, 1 / totalVolume)\n\n  cacheOfCenterOfMass.set(geometry, centerOfMass)\n  return centerOfMass\n}\n\n/**\n * Measure the center of mass for the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Array} the center of mass for each geometry, i.e. [X, Y, Z]\n * @alias module:modeling/measurements.measureCenterOfMass\n *\n * @example\n * let center = measureCenterOfMass(sphere())\n */\nconst measureCenterOfMass = (...geometries) => {\n  geometries = flatten(geometries)\n\n  const results = geometries.map((geometry) => {\n    // NOTE: center of mass for geometry path2 is not possible\n    if (geom2.isA(geometry)) return measureCenterOfMassGeom2(geometry)\n    if (geom3.isA(geometry)) return measureCenterOfMassGeom3(geometry)\n    return [0, 0, 0]\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureCenterOfMass\n","const flatten = require('../utils/flatten')\n\nconst measureBoundingBox = require('./measureBoundingBox')\n\n/**\n * Measure the dimensions of the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Array} the dimensions for each geometry, i.e. [width, depth, height]\n * @alias module:modeling/measurements.measureDimensions\n *\n * @example\n * let dimensions = measureDimensions(sphere())\n */\nconst measureDimensions = (...geometries) => {\n  geometries = flatten(geometries)\n\n  const results = geometries.map((geometry) => {\n    const boundingBox = measureBoundingBox(geometry)\n    return [\n      boundingBox[1][0] - boundingBox[0][0],\n      boundingBox[1][1] - boundingBox[0][1],\n      boundingBox[1][2] - boundingBox[0][2]\n    ]\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureDimensions\n","const flatten = require('../utils/flatten')\nconst { geom2, geom3, path2 } = require('../geometries')\n\nconst calculateEpsilonFromBounds = require('./calculateEpsilonFromBounds')\nconst measureBoundingBox = require('./measureBoundingBox')\n\n/*\n * Measure the epsilon of the given (path2) geometry.\n * @return {Number} the epsilon (precision) of the geometry\n */\nconst measureEpsilonOfPath2 = (geometry) => calculateEpsilonFromBounds(measureBoundingBox(geometry), 2)\n\n/*\n * Measure the epsilon of the given (geom2) geometry.\n * @return {Number} the epsilon (precision) of the geometry\n */\nconst measureEpsilonOfGeom2 = (geometry) => calculateEpsilonFromBounds(measureBoundingBox(geometry), 2)\n\n/*\n * Measure the epsilon of the given (geom3) geometry.\n * @return {Float} the epsilon (precision) of the geometry\n */\nconst measureEpsilonOfGeom3 = (geometry) => calculateEpsilonFromBounds(measureBoundingBox(geometry), 3)\n\n/**\n * Measure the epsilon of the given geometries.\n * Epsilon values are used in various functions to determine minimum distances between points, planes, etc.\n * @param {...Object} geometries - the geometries to measure\n * @return {Number|Array} the epsilon, or a list of epsilons for each geometry\n * @alias module:modeling/measurements.measureEpsilon\n *\n * @example\n * let epsilon = measureEpsilon(sphere())\n */\nconst measureEpsilon = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return measureEpsilonOfPath2(geometry)\n    if (geom2.isA(geometry)) return measureEpsilonOfGeom2(geometry)\n    if (geom3.isA(geometry)) return measureEpsilonOfGeom3(geometry)\n    return 0\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureEpsilon\n","const flatten = require('../utils/flatten')\n\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\nconst path2 = require('../geometries/path2')\nconst poly3 = require('../geometries/poly3')\n\nconst cache = new WeakMap()\n\n/*\n * Measure the volume of the given geometry.\n * NOTE: paths are infinitely narrow and do not have an volume\n *\n * @param {Path2} geometry - geometry to measure\n * @returns {Number} volume of the geometry\n */\nconst measureVolumeOfPath2 = () => 0\n\n/*\n * Measure the volume of the given geometry.\n * NOTE: 2D geometry are infinitely thin and do not have an volume\n *\n * @param {Geom2} geometry - 2D geometry to measure\n * @returns {Number} volume of the geometry\n */\nconst measureVolumeOfGeom2 = () => 0\n\n/*\n * Measure the volume of the given geometry.\n *\n * @param {Geom3} geometry - 3D geometry to measure\n * @returns {Number} volume of the geometry\n */\nconst measureVolumeOfGeom3 = (geometry) => {\n  let volume = cache.get(geometry)\n  if (volume) return volume\n\n  const polygons = geom3.toPolygons(geometry)\n  volume = polygons.reduce((volume, polygon) => volume + poly3.measureSignedVolume(polygon), 0)\n\n  cache.set(geometry, volume)\n\n  return volume\n}\n\n/**\n * Measure the volume of the given geometries.\n * @param {...Object} geometries - the geometries to measure\n * @return {Number|Array} the volume, or a list of volumes for each geometry\n * @alias module:modeling/measurements.measureVolume\n *\n * @example\n * let volume = measureVolume(sphere())\n */\nconst measureVolume = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return measureVolumeOfPath2(geometry)\n    if (geom2.isA(geometry)) return measureVolumeOfGeom2(geometry)\n    if (geom3.isA(geometry)) return measureVolumeOfGeom3(geometry)\n    return 0\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = measureVolume\n","const vec2 = require('../../maths/vec2')\n\nconst geom2 = require('../../geometries/geom2')\n\nconst fromFakePolygon = (epsilon, polygon) => {\n  // this can happen based on union, seems to be residuals -\n  // return null and handle in caller\n  if (polygon.vertices.length < 4) {\n    return null\n  }\n  const vert1Indices = []\n  const points3D = polygon.vertices.filter((vertex, i) => {\n    if (vertex[2] > 0) {\n      vert1Indices.push(i)\n      return true\n    }\n    return false\n  })\n\n  if (points3D.length !== 2) {\n    throw new Error('Assertion failed: fromFakePolygon: not enough points found') // TBD remove later\n  }\n\n  const points2D = points3D.map((v3) => {\n    const x = Math.round(v3[0] / epsilon) * epsilon + 0 // no more -0\n    const y = Math.round(v3[1] / epsilon) * epsilon + 0 // no more -0\n    return vec2.fromValues(x, y)\n  })\n\n  if (vec2.equals(points2D[0], points2D[1])) return null\n\n  const d = vert1Indices[1] - vert1Indices[0]\n  if (d === 1 || d === 3) {\n    if (d === 1) {\n      points2D.reverse()\n    }\n  } else {\n    throw new Error('Assertion failed: fromFakePolygon: unknown index ordering')\n  }\n  return points2D\n}\n\n/*\n * Convert the given polygons to a list of sides.\n * The polygons must have only z coordinates +1 and -1, as constructed by to3DWalls().\n */\nconst fromFakePolygons = (epsilon, polygons) => {\n  const sides = polygons.map((polygon) => fromFakePolygon(epsilon, polygon)).filter((polygon) => (polygon !== null))\n  return geom2.create(sides)\n}\n\nmodule.exports = fromFakePolygons\n","/**\n * All shapes (primitives or the results of operations) can be passed to boolean functions\n * to perform logical operations, e.g. remove a hole from a board.\n * In all cases, the function returns the results, and never changes the original shapes.\n * @module modeling/booleans\n * @example\n * const { intersect, subtract, union } = require('@jscad/modeling').booleans\n */\nmodule.exports = {\n  intersect: require('./intersect'),\n  scission: require('./scission'),\n  subtract: require('./subtract'),\n  union: require('./union')\n}\n","const flatten = require('../../utils/flatten')\nconst areAllShapesTheSameType = require('../../utils/areAllShapesTheSameType')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\n\nconst intersectGeom2 = require('./intersectGeom2')\nconst intersectGeom3 = require('./intersectGeom3')\n\n/**\n * Return a new geometry representing space in both the first geometry and\n * all subsequent geometries.\n * The given geometries should be of the same type, either geom2 or geom3.\n *\n * @param {...Object} geometries - list of geometries\n * @returns {geom2|geom3} a new geometry\n * @alias module:modeling/booleans.intersect\n *\n * @example\n * let myshape = intersect(cube({size: [5,5,5]}), cube({size: [5,5,5], center: [5,5,5]}))\n *\n * @example\n * +-------+\n * |       |\n * |   A   |\n * |    +--+----+   =   +--+\n * +----+--+    |       +--+\n *      |   B   |\n *      |       |\n *      +-------+\n */\nconst intersect = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  if (!areAllShapesTheSameType(geometries)) {\n    throw new Error('only intersect of the types are supported')\n  }\n\n  const geometry = geometries[0]\n  // if (path.isA(geometry)) return pathintersect(matrix, geometries)\n  if (geom2.isA(geometry)) return intersectGeom2(geometries)\n  if (geom3.isA(geometry)) return intersectGeom3(geometries)\n  return geometry\n}\n\nmodule.exports = intersect\n","const flatten = require('../../utils/flatten')\n\nconst geom3 = require('../../geometries/geom3')\n\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst fromFakePolygons = require('./fromFakePolygons')\nconst to3DWalls = require('./to3DWalls')\nconst intersectGeom3 = require('./intersectGeom3')\n\n/*\n * Return a new 2D geometry representing space in both the first geometry and\n * in the subsequent geometries. None of the given geometries are modified.\n * @param {...geom2} geometries - list of 2D geometries\n * @returns {geom2} new 2D geometry\n */\nconst intersect = (...geometries) => {\n  geometries = flatten(geometries)\n  const newgeometries = geometries.map((geometry) => to3DWalls({ z0: -1, z1: 1 }, geometry))\n\n  const newgeom3 = intersectGeom3(newgeometries)\n  const epsilon = measureEpsilon(newgeom3)\n\n  return fromFakePolygons(epsilon, geom3.toPolygons(newgeom3))\n}\n\nmodule.exports = intersect\n","const flatten = require('../../utils/flatten')\n\nconst retessellate = require('../modifiers/retessellate')\n\nconst intersectSub = require('./intersectGeom3Sub')\n\n/*\n * Return a new 3D geometry representing space in both the first geometry and\n * in the subsequent geometries. None of the given geometries are modified.\n * @param {...geom3} geometries - list of 3D geometries\n * @returns {geom3} new 3D geometry\n */\nconst intersect = (...geometries) => {\n  geometries = flatten(geometries)\n\n  let newgeometry = geometries.shift()\n  geometries.forEach((geometry) => {\n    newgeometry = intersectSub(newgeometry, geometry)\n  })\n\n  newgeometry = retessellate(newgeometry)\n  return newgeometry\n}\n\nmodule.exports = intersect\n","const geom3 = require('../../geometries/geom3')\n\nconst mayOverlap = require('./mayOverlap')\nconst { Tree } = require('./trees')\n\n/*\n * Return a new 3D geometry representing the space in both the first geometry and\n * the second geometry. None of the given geometries are modified.\n * @param {geom3} geometry1 - a geometry\n * @param {geom3} geometry2 - a geometry\n * @returns {geom3} new 3D geometry\n */\nconst intersectGeom3Sub = (geometry1, geometry2) => {\n  if (!mayOverlap(geometry1, geometry2)) {\n    return geom3.create() // empty geometry\n  }\n\n  const a = new Tree(geom3.toPolygons(geometry1))\n  const b = new Tree(geom3.toPolygons(geometry2))\n\n  a.invert()\n  b.clipTo(a)\n  b.invert()\n  a.clipTo(b)\n  b.clipTo(a)\n  a.addPolygons(b.allPolygons())\n  a.invert()\n\n  const newpolygons = a.allPolygons()\n  return geom3.create(newpolygons)\n}\n\nmodule.exports = intersectGeom3Sub\n","const { EPS } = require('../../maths/constants')\n\nconst measureBoundingBox = require('../../measurements/measureBoundingBox')\n\n/*\n * Determine if the given geometries overlap by comparing min and max bounds.\n * NOTE: This is used in union for performance gains.\n * @param {geom3} geometry1 - geometry for comparison\n * @param {geom3} geometry2 - geometry for comparison\n * @returns {boolean} true if the geometries overlap\n */\nconst mayOverlap = (geometry1, geometry2) => {\n  // FIXME accessing the data structure of the geometry should not be allowed\n  if ((geometry1.polygons.length === 0) || (geometry2.polygons.length === 0)) {\n    return false\n  }\n\n  const bounds1 = measureBoundingBox(geometry1)\n  const min1 = bounds1[0]\n  const max1 = bounds1[1]\n\n  const bounds2 = measureBoundingBox(geometry2)\n  const min2 = bounds2[0]\n  const max2 = bounds2[1]\n\n  if ((min2[0] - max1[0]) > EPS) return false\n  if ((min1[0] - max2[0]) > EPS) return false\n  if ((min2[1] - max1[1]) > EPS) return false\n  if ((min1[1] - max2[1]) > EPS) return false\n  if ((min2[2] - max1[2]) > EPS) return false\n  if ((min1[2] - max2[2]) > EPS) return false\n  return true\n}\n\nmodule.exports = mayOverlap\n","const flatten = require('../../utils/flatten')\n\n// const geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\n\n// const scissionGeom2 = require('./scissionGeom2')\nconst scissionGeom3 = require('./scissionGeom3')\n\n/**\n * Scission (divide) the given geometry into the component pieces.\n *\n * @param {...Object} objects - list of geometries\n * @returns {Array} list of pieces from each geometry\n * @alias module:modeling/booleans.scission\n *\n * @example\n * let figure = require('./my.stl')\n * let pieces = scission(figure)\n *\n * @example\n * +-------+            +-------+\n * |       |            |       |\n * |   +---+            | A +---+\n * |   |    +---+   =   |   |    +---+\n * +---+    |   |       +---+    |   |\n *      +---+   |            +---+   |\n *      |       |            |    B  |\n *      +-------+            +-------+\n */\nconst scission = (...objects) => {\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  const results = objects.map((object) => {\n    // if (path2.isA(object)) return path2.transform(matrix, object)\n    // if (geom2.isA(object)) return geom2.transform(matrix, object)\n    if (geom3.isA(object)) return scissionGeom3(object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = scission\n","const vec3 = require('../../maths/vec3')\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst geom3 = require('../../geometries/geom3')\n\n// returns array numerically sorted and duplicates removed\nconst sortNb = (array) => array.sort((a, b) => a - b).filter((item, pos, ary) => !pos || item !== ary[pos - 1])\n\nconst insertMapping = (map, point, index) => {\n  const key = `${point}`\n  const mapping = map.get(key)\n  if (mapping === undefined) {\n    map.set(key, [index])\n  } else {\n    mapping.push(index)\n  }\n}\n\nconst findMapping = (map, point) => {\n  const key = `${point}`\n  return map.get(key)\n}\n\nconst scissionGeom3 = (geometry) => {\n  // construit table de correspondance entre polygones\n  // build polygons lookup table\n  const eps = measureEpsilon(geometry)\n  const polygons = geom3.toPolygons(geometry)\n  const pl = polygons.length\n\n  const indexesPerPoint = new Map()\n  const temp = vec3.create()\n  polygons.forEach((polygon, index) => {\n    polygon.vertices.forEach((point) => {\n      insertMapping(indexesPerPoint, vec3.snap(temp, point, eps), index)\n    })\n  })\n\n  const indexesPerPolygon = polygons.map((polygon) => {\n    let indexes = []\n    polygon.vertices.forEach((point) => {\n      indexes = indexes.concat(findMapping(indexesPerPoint, vec3.snap(temp, point, eps)))\n    })\n    return { e: 1, d: sortNb(indexes) } // for each polygon, push the list of indexes\n  })\n\n  indexesPerPoint.clear()\n\n  // regroupe les correspondances des polygones se touchant\n  // boucle ne s'arrêtant que quand deux passages retournent le même nb de polygones\n  // merge lookup data from linked polygons as long as possible\n  let merges = 0\n  const ippl = indexesPerPolygon.length\n  for (let i = 0; i < ippl; i++) {\n    const mapi = indexesPerPolygon[i]\n    // merge mappings if necessary\n    if (mapi.e > 0) {\n      const indexes = new Array(pl)\n      indexes[i] = true // include ourself\n      do {\n        merges = 0\n        // loop through the known indexes\n        indexes.forEach((e, j) => {\n          const mapj = indexesPerPolygon[j]\n          // merge this mapping if necessary\n          if (mapj.e > 0) {\n            mapj.e = -1 // merged\n            for (let d = 0; d < mapj.d.length; d++) {\n              indexes[mapj.d[d]] = true\n            }\n            merges++\n          }\n        })\n      } while (merges > 0)\n      mapi.indexes = indexes\n    }\n  }\n\n  // construit le tableau des geometry à retourner\n  // build array of geometry to return\n  const newgeometries = []\n  for (let i = 0; i < ippl; i++) {\n    if (indexesPerPolygon[i].indexes) {\n      const newpolygons = []\n      indexesPerPolygon[i].indexes.forEach((e, p) => newpolygons.push(polygons[p]))\n      newgeometries.push(geom3.create(newpolygons))\n    }\n  }\n\n  return newgeometries\n}\n\nmodule.exports = scissionGeom3\n","const flatten = require('../../utils/flatten')\nconst areAllShapesTheSameType = require('../../utils/areAllShapesTheSameType')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\n\nconst subtractGeom2 = require('./subtractGeom2')\nconst subtractGeom3 = require('./subtractGeom3')\n\n/**\n * Return a new geometry representing space in the first geometry but\n * not in all subsequent geometries.\n * The given geometries should be of the same type, either geom2 or geom3.\n *\n * @param {...Object} geometries - list of geometries\n * @returns {geom2|geom3} a new geometry\n * @alias module:modeling/booleans.subtract\n *\n * @example\n * let myshape = subtract(cuboid({size: [5,5,5]}), cuboid({size: [5,5,5], center: [5,5,5]}))\n *\n * @example\n * +-------+            +-------+\n * |       |            |       |\n * |   A   |            |       |\n * |    +--+----+   =   |    +--+\n * +----+--+    |       +----+\n *      |   B   |\n *      |       |\n *      +-------+\n */\nconst subtract = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  if (!areAllShapesTheSameType(geometries)) {\n    throw new Error('only subtract of the types are supported')\n  }\n\n  const geometry = geometries[0]\n  // if (path.isA(geometry)) return pathsubtract(matrix, geometries)\n  if (geom2.isA(geometry)) return subtractGeom2(geometries)\n  if (geom3.isA(geometry)) return subtractGeom3(geometries)\n  return geometry\n}\n\nmodule.exports = subtract\n","const flatten = require('../../utils/flatten')\n\nconst geom3 = require('../../geometries/geom3')\n\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst fromFakePolygons = require('./fromFakePolygons')\nconst to3DWalls = require('./to3DWalls')\nconst subtractGeom3 = require('./subtractGeom3')\n\n/*\n * Return a new 2D geometry representing space in the first geometry but\n * not in the subsequent geometries. None of the given geometries are modified.\n * @param {...geom2} geometries - list of geometries\n * @returns {geom2} new 2D geometry\n */\nconst subtract = (...geometries) => {\n  geometries = flatten(geometries)\n  const newgeometries = geometries.map((geometry) => to3DWalls({ z0: -1, z1: 1 }, geometry))\n\n  const newgeom3 = subtractGeom3(newgeometries)\n  const epsilon = measureEpsilon(newgeom3)\n\n  return fromFakePolygons(epsilon, geom3.toPolygons(newgeom3))\n}\n\nmodule.exports = subtract\n","const flatten = require('../../utils/flatten')\n\nconst retessellate = require('../modifiers/retessellate')\n\nconst subtractSub = require('./subtractGeom3Sub')\n\n/*\n * Return a new 3D geometry representing space in this geometry but not in the given geometries.\n * Neither this geometry nor the given geometries are modified.\n * @param {...geom3} geometries - list of geometries\n * @returns {geom3} new 3D geometry\n */\nconst subtract = (...geometries) => {\n  geometries = flatten(geometries)\n\n  let newgeometry = geometries.shift()\n  geometries.forEach((geometry) => {\n    newgeometry = subtractSub(newgeometry, geometry)\n  })\n\n  newgeometry = retessellate(newgeometry)\n  return newgeometry\n}\n\nmodule.exports = subtract\n","const geom3 = require('../../geometries/geom3')\n\nconst mayOverlap = require('./mayOverlap')\nconst { Tree } = require('./trees')\n\n/*\n * Return a new 3D geometry representing the space in the first geometry but not\n * in the second geometry. None of the given geometries are modified.\n * @param {geom3} geometry1 - a geometry\n * @param {geom3} geometry2 - a geometry\n * @returns {geom3} new 3D geometry\n */\nconst subtractGeom3Sub = (geometry1, geometry2) => {\n  if (!mayOverlap(geometry1, geometry2)) {\n    return geom3.clone(geometry1)\n  }\n\n  const a = new Tree(geom3.toPolygons(geometry1))\n  const b = new Tree(geom3.toPolygons(geometry2))\n\n  a.invert()\n  a.clipTo(b)\n  b.clipTo(a, true)\n  a.addPolygons(b.allPolygons())\n  a.invert()\n\n  const newpolygons = a.allPolygons()\n  return geom3.create(newpolygons)\n}\n\nmodule.exports = subtractGeom3Sub\n","const vec3 = require('../../maths/vec3')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\n/*\n * Create a polygon (wall) from the given Z values and side.\n */\nconst to3DWall = (z0, z1, side) => {\n  const points = [\n    vec3.fromVec2(vec3.create(), side[0], z0),\n    vec3.fromVec2(vec3.create(), side[1], z0),\n    vec3.fromVec2(vec3.create(), side[1], z1),\n    vec3.fromVec2(vec3.create(), side[0], z1)\n  ]\n  return poly3.create(points)\n}\n\n/*\n * Create a 3D geometry with walls, as constructed from the given options and geometry.\n *\n * @param {Object} options - options with Z offsets\n * @param {geom2} geometry - geometry used as base of walls\n * @return {geom3} the new geometry\n */\nconst to3DWalls = (options, geometry) => {\n  const sides = geom2.toSides(geometry)\n\n  const polygons = sides.map((side) => to3DWall(options.z0, options.z1, side))\n\n  const result = geom3.create(polygons)\n  return result\n}\n\nmodule.exports = to3DWalls\n","const plane = require('../../../maths/plane')\nconst poly3 = require('../../../geometries/poly3')\n\n// # class Node\n// Holds a node in a BSP tree.\n// A BSP tree is built from a collection of polygons by picking a polygon to split along.\n// Polygons are not stored directly in the tree, but in PolygonTreeNodes, stored in this.polygontreenodes.\n// Those PolygonTreeNodes are children of the owning Tree.polygonTree.\n// This is not a leafy BSP tree since there is no distinction between internal and leaf nodes.\nclass Node {\n  constructor (parent) {\n    this.plane = null\n    this.front = null\n    this.back = null\n    this.polygontreenodes = []\n    this.parent = parent\n  }\n\n  // Convert solid space to empty space and empty space to solid space.\n  invert () {\n    const queue = [this]\n    let node\n    for (let i = 0; i < queue.length; i++) {\n      node = queue[i]\n      if (node.plane) node.plane = plane.flip(plane.create(), node.plane)\n      if (node.front) queue.push(node.front)\n      if (node.back) queue.push(node.back)\n      const temp = node.front\n      node.front = node.back\n      node.back = temp\n    }\n  }\n\n  // clip polygontreenodes to our plane\n  // calls remove() for all clipped PolygonTreeNodes\n  clipPolygons (polygontreenodes, alsoRemovecoplanarFront) {\n    let current = { node: this, polygontreenodes: polygontreenodes }\n    let node\n    const stack = []\n\n    do {\n      node = current.node\n      polygontreenodes = current.polygontreenodes\n\n      if (node.plane) {\n        const plane = node.plane\n\n        const backnodes = []\n        const frontnodes = []\n        const coplanarfrontnodes = alsoRemovecoplanarFront ? backnodes : frontnodes\n        const numpolygontreenodes = polygontreenodes.length\n        for (let i = 0; i < numpolygontreenodes; i++) {\n          const treenode = polygontreenodes[i]\n          if (!treenode.isRemoved()) {\n            // split this polygon tree node using the plane\n            // NOTE: children are added to the tree if there are spanning polygons\n            treenode.splitByPlane(plane, coplanarfrontnodes, backnodes, frontnodes, backnodes)\n          }\n        }\n\n        if (node.front && (frontnodes.length > 0)) {\n          // add front node for further splitting\n          stack.push({ node: node.front, polygontreenodes: frontnodes })\n        }\n        const numbacknodes = backnodes.length\n        if (node.back && (numbacknodes > 0)) {\n          // add back node for further splitting\n          stack.push({ node: node.back, polygontreenodes: backnodes })\n        } else {\n          // remove all back nodes from processing\n          for (let i = 0; i < numbacknodes; i++) {\n            backnodes[i].remove()\n          }\n        }\n      }\n      current = stack.pop()\n    } while (current !== undefined)\n  }\n\n  // Remove all polygons in this BSP tree that are inside the other BSP tree\n  // `tree`.\n  clipTo (tree, alsoRemovecoplanarFront) {\n    let node = this\n    const stack = []\n    do {\n      if (node.polygontreenodes.length > 0) {\n        tree.rootnode.clipPolygons(node.polygontreenodes, alsoRemovecoplanarFront)\n      }\n      if (node.front) stack.push(node.front)\n      if (node.back) stack.push(node.back)\n      node = stack.pop()\n    } while (node !== undefined)\n  }\n\n  addPolygonTreeNodes (newpolygontreenodes) {\n    let current = { node: this, polygontreenodes: newpolygontreenodes }\n    const stack = []\n    do {\n      const node = current.node\n      const polygontreenodes = current.polygontreenodes\n\n      if (polygontreenodes.length === 0) {\n        current = stack.pop()\n        continue\n      }\n      if (!node.plane) {\n        let index = 0 // default\n        index = Math.floor(polygontreenodes.length / 2)\n        // index = polygontreenodes.length >> 1\n        // index = Math.floor(Math.random()*polygontreenodes.length)\n        const bestpoly = polygontreenodes[index].getPolygon()\n        node.plane = poly3.plane(bestpoly)\n      }\n      const frontnodes = []\n      const backnodes = []\n      const n = polygontreenodes.length\n      for (let i = 0; i < n; ++i) {\n        polygontreenodes[i].splitByPlane(node.plane, node.polygontreenodes, backnodes, frontnodes, backnodes)\n      }\n\n      if (frontnodes.length > 0) {\n        if (!node.front) node.front = new Node(node)\n\n        // unable to split by any of the current nodes\n        const stopCondition = n === frontnodes.length && backnodes.length === 0\n        if (stopCondition) node.front.polygontreenodes = frontnodes\n        else stack.push({ node: node.front, polygontreenodes: frontnodes })\n      }\n      if (backnodes.length > 0) {\n        if (!node.back) node.back = new Node(node)\n\n        // unable to split by any of the current nodes\n        const stopCondition = n === backnodes.length && frontnodes.length === 0\n\n        if (stopCondition) node.back.polygontreenodes = backnodes\n        else stack.push({ node: node.back, polygontreenodes: backnodes })\n      }\n\n      current = stack.pop()\n    } while (current !== undefined)\n  }\n}\n\nmodule.exports = Node\n","const { EPS } = require('../../../maths/constants')\n\nconst vec3 = require('../../../maths/vec3')\n\nconst poly3 = require('../../../geometries/poly3')\n\nconst splitPolygonByPlane = require('./splitPolygonByPlane')\n\n// # class PolygonTreeNode\n// This class manages hierarchical splits of polygons.\n// At the top is a root node which does not hold a polygon, only child PolygonTreeNodes.\n// Below that are zero or more 'top' nodes; each holds a polygon.\n// The polygons can be in different planes.\n// splitByPlane() splits a node by a plane. If the plane intersects the polygon, two new child nodes\n// are created holding the splitted polygon.\n// getPolygons() retrieves the polygons from the tree. If for PolygonTreeNode the polygon is split but\n// the two split parts (child nodes) are still intact, then the unsplit polygon is returned.\n// This ensures that we can safely split a polygon into many fragments. If the fragments are untouched,\n// getPolygons() will return the original unsplit polygon instead of the fragments.\n// remove() removes a polygon from the tree. Once a polygon is removed, the parent polygons are invalidated\n// since they are no longer intact.\nclass PolygonTreeNode {\n  // constructor creates the root node\n  constructor (parent, polygon) {\n    this.parent = parent\n    this.children = []\n    this.polygon = polygon\n    this.removed = false  // state of branch or leaf\n  }\n\n  // fill the tree with polygons. Should be called on the root node only; child nodes must\n  // always be a derivate (split) of the parent node.\n  addPolygons (polygons) {\n    // new polygons can only be added to root node; children can only be splitted polygons\n    if (!this.isRootNode()) {\n      throw new Error('Assertion failed')\n    }\n    const _this = this\n    polygons.forEach((polygon) => {\n      _this.addChild(polygon)\n    })\n  }\n\n  // remove a node\n  // - the siblings become toplevel nodes\n  // - the parent is removed recursively\n  remove () {\n    if (!this.removed) {\n      this.removed = true\n      this.polygon = null\n\n      // remove ourselves from the parent's children list:\n      const parentschildren = this.parent.children\n      const i = parentschildren.indexOf(this)\n      if (i < 0) throw new Error('Assertion failed')\n      parentschildren.splice(i, 1)\n\n      // invalidate the parent's polygon, and of all parents above it:\n      this.parent.recursivelyInvalidatePolygon()\n    }\n  }\n\n  isRemoved () {\n    return this.removed\n  }\n\n  isRootNode () {\n    return !this.parent\n  }\n\n  // invert all polygons in the tree. Call on the root node\n  invert () {\n    if (!this.isRootNode()) throw new Error('Assertion failed') // can only call this on the root node\n    this.invertSub()\n  }\n\n  getPolygon () {\n    if (!this.polygon) throw new Error('Assertion failed') // doesn't have a polygon, which means that it has been broken down\n    return this.polygon\n  }\n\n  getPolygons (result) {\n    let children = [this]\n    const queue = [children]\n    let i, j, l, node\n    for (i = 0; i < queue.length; ++i) { // queue size can change in loop, don't cache length\n      children = queue[i]\n      for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n        node = children[j]\n        if (node.polygon) {\n          // the polygon hasn't been broken yet. We can ignore the children and return our polygon:\n          result.push(node.polygon)\n        } else {\n          // our polygon has been split up and broken, so gather all subpolygons from the children\n          if (node.children.length > 0) queue.push(node.children)\n        }\n      }\n    }\n  }\n\n  // split the node by a plane; add the resulting nodes to the frontnodes and backnodes array\n  // If the plane doesn't intersect the polygon, the 'this' object is added to one of the arrays\n  // If the plane does intersect the polygon, two new child nodes are created for the front and back fragments,\n  //  and added to both arrays.\n  splitByPlane (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n    if (this.children.length) {\n      const queue = [this.children]\n      let i\n      let j\n      let l\n      let node\n      let nodes\n      for (i = 0; i < queue.length; i++) { // queue.length can increase, do not cache\n        nodes = queue[i]\n        for (j = 0, l = nodes.length; j < l; j++) { // ok to cache length\n          node = nodes[j]\n          if (node.children.length > 0) {\n            queue.push(node.children)\n          } else {\n            // no children. Split the polygon:\n            node._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes)\n          }\n        }\n      }\n    } else {\n      this._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes)\n    }\n  }\n\n  // only to be called for nodes with no children\n  _splitByPlane (splane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n    const polygon = this.polygon\n    if (polygon) {\n      const bound = poly3.measureBoundingSphere(polygon)\n      const sphereradius = bound[3] + EPS // ensure radius is LARGER then polygon\n      const spherecenter = bound\n      const d = vec3.dot(splane, spherecenter) - splane[3]\n      if (d > sphereradius) {\n        frontnodes.push(this)\n      } else if (d < -sphereradius) {\n        backnodes.push(this)\n      } else {\n        const splitresult = splitPolygonByPlane(splane, polygon)\n        switch (splitresult.type) {\n          case 0:\n            // coplanar front:\n            coplanarfrontnodes.push(this)\n            break\n\n          case 1:\n            // coplanar back:\n            coplanarbacknodes.push(this)\n            break\n\n          case 2:\n            // front:\n            frontnodes.push(this)\n            break\n\n          case 3:\n            // back:\n            backnodes.push(this)\n            break\n\n          case 4:\n            // spanning:\n            if (splitresult.front) {\n              const frontnode = this.addChild(splitresult.front)\n              frontnodes.push(frontnode)\n            }\n            if (splitresult.back) {\n              const backnode = this.addChild(splitresult.back)\n              backnodes.push(backnode)\n            }\n            break\n        }\n      }\n    }\n  }\n\n  // PRIVATE methods from here:\n  // add child to a node\n  // this should be called whenever the polygon is split\n  // a child should be created for every fragment of the split polygon\n  // returns the newly created child\n  addChild (polygon) {\n    const newchild = new PolygonTreeNode(this, polygon)\n    this.children.push(newchild)\n    return newchild\n  }\n\n  invertSub () {\n    let children = [this]\n    const queue = [children]\n    let i, j, l, node\n    for (i = 0; i < queue.length; i++) {\n      children = queue[i]\n      for (j = 0, l = children.length; j < l; j++) {\n        node = children[j]\n        if (node.polygon) {\n          node.polygon = poly3.invert(node.polygon)\n        }\n        if (node.children.length > 0) queue.push(node.children)\n      }\n    }\n  }\n\n  // private method\n  // remove the polygon from the node, and all parent nodes above it\n  // called to invalidate parents of removed nodes\n  recursivelyInvalidatePolygon () {\n    this.polygon = null\n    if (this.parent) {\n      this.parent.recursivelyInvalidatePolygon()\n    }\n  }\n\n  clear () {\n    let children = [this]\n    const queue = [children]\n    for (let i = 0; i < queue.length; ++i) { // queue size can change in loop, don't cache length\n      children = queue[i]\n      const l = children.length\n      for (let j = 0; j < l; j++) {\n        const node = children[j]\n        if (node.polygon) {\n          node.polygon = null\n        }\n        if (node.parent) {\n          node.parent = null\n        }\n        if (node.children.length > 0) queue.push(node.children)\n        node.children = []\n      }\n    }\n  }\n\n  toString () {\n    let result = ''\n    let children = [this]\n    const queue = [children]\n    let i, j, l, node\n    for (i = 0; i < queue.length; ++i) { // queue size can change in loop, don't cache length\n      children = queue[i]\n      const prefix = ' '.repeat(i)\n      for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n        node = children[j]\n        result += `${prefix}PolygonTreeNode (${node.isRootNode()}): ${node.children.length}`\n        if (node.polygon) {\n          result += `\\n ${prefix}polygon: ${node.polygon.vertices}\\n`\n        } else {\n          result += '\\n'\n        }\n        if (node.children.length > 0) queue.push(node.children)\n      }\n    }\n    return result\n  }\n}\n\nmodule.exports = PolygonTreeNode\n","const Node = require('./Node')\nconst PolygonTreeNode = require('./PolygonTreeNode')\n\n// # class Tree\n// This is the root of a BSP tree.\n// This separate class for the root of the tree in order to hold the PolygonTreeNode root.\n// The actual tree is kept in this.rootnode\nclass Tree {\n  constructor (polygons) {\n    this.polygonTree = new PolygonTreeNode()\n    this.rootnode = new Node(null)\n    if (polygons) this.addPolygons(polygons)\n  }\n\n  invert () {\n    this.polygonTree.invert()\n    this.rootnode.invert()\n  }\n\n  // Remove all polygons in this BSP tree that are inside the other BSP tree\n  // `tree`.\n  clipTo (tree, alsoRemovecoplanarFront = false) {\n    this.rootnode.clipTo(tree, alsoRemovecoplanarFront)\n  }\n\n  allPolygons () {\n    const result = []\n    this.polygonTree.getPolygons(result)\n    return result\n  }\n\n  addPolygons (polygons) {\n    const polygontreenodes = new Array(polygons.length)\n    for (let i = 0; i < polygons.length; i++) {\n      polygontreenodes[i] = this.polygonTree.addChild(polygons[i])\n    }\n    this.rootnode.addPolygonTreeNodes(polygontreenodes)\n  }\n\n  clear () {\n    this.polygonTree.clear()\n  }\n\n  toString () {\n    const result = 'Tree: ' + this.polygonTree.toString('')\n    return result\n  }\n}\n\nmodule.exports = Tree\n","module.exports = {\n  Tree: require('./Tree')\n}\n","const vec3 = require('../../../maths/vec3')\n\nconst splitLineSegmentByPlane = (plane, p1, p2) => {\n  const direction = vec3.subtract(vec3.create(), p2, p1)\n  let lambda = (plane[3] - vec3.dot(plane, p1)) / vec3.dot(plane, direction)\n  if (Number.isNaN(lambda)) lambda = 0\n  if (lambda > 1) lambda = 1\n  if (lambda < 0) lambda = 0\n\n  vec3.scale(direction, direction, lambda)\n  vec3.add(direction, p1, direction)\n  return direction\n}\n\nmodule.exports = splitLineSegmentByPlane\n","const { EPS } = require('../../../maths/constants')\n\nconst plane = require('../../../maths/plane')\nconst vec3 = require('../../../maths/vec3')\n\nconst poly3 = require('../../../geometries/poly3')\n\nconst splitLineSegmentByPlane = require('./splitLineSegmentByPlane')\n\n// Returns object:\n// .type:\n//   0: coplanar-front\n//   1: coplanar-back\n//   2: front\n//   3: back\n//   4: spanning\n// In case the polygon is spanning, returns:\n// .front: a Polygon3 of the front part\n// .back: a Polygon3 of the back part\nconst splitPolygonByPlane = (splane, polygon) => {\n  const result = {\n    type: null,\n    front: null,\n    back: null\n  }\n  // cache in local lets (speedup):\n  const vertices = polygon.vertices\n  const numvertices = vertices.length\n  const pplane = poly3.plane(polygon)\n  if (plane.equals(pplane, splane)) {\n    result.type = 0\n  } else {\n    let hasfront = false\n    let hasback = false\n    const vertexIsBack = []\n    const MINEPS = -EPS\n    for (let i = 0; i < numvertices; i++) {\n      const t = vec3.dot(splane, vertices[i]) - splane[3]\n      const isback = (t < MINEPS)\n      vertexIsBack.push(isback)\n      if (t > EPS) hasfront = true\n      if (t < MINEPS) hasback = true\n    }\n    if ((!hasfront) && (!hasback)) {\n      // all points coplanar\n      const t = vec3.dot(splane, pplane)\n      result.type = (t >= 0) ? 0 : 1\n    } else if (!hasback) {\n      result.type = 2\n    } else if (!hasfront) {\n      result.type = 3\n    } else {\n      // spanning\n      result.type = 4\n      const frontvertices = []\n      const backvertices = []\n      let isback = vertexIsBack[0]\n      for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n        const vertex = vertices[vertexindex]\n        let nextvertexindex = vertexindex + 1\n        if (nextvertexindex >= numvertices) nextvertexindex = 0\n        const nextisback = vertexIsBack[nextvertexindex]\n        if (isback === nextisback) {\n          // line segment is on one side of the plane:\n          if (isback) {\n            backvertices.push(vertex)\n          } else {\n            frontvertices.push(vertex)\n          }\n        } else {\n          // line segment intersects plane:\n          const nextpoint = vertices[nextvertexindex]\n          const intersectionpoint = splitLineSegmentByPlane(splane, vertex, nextpoint)\n          if (isback) {\n            backvertices.push(vertex)\n            backvertices.push(intersectionpoint)\n            frontvertices.push(intersectionpoint)\n          } else {\n            frontvertices.push(vertex)\n            frontvertices.push(intersectionpoint)\n            backvertices.push(intersectionpoint)\n          }\n        }\n        isback = nextisback\n      } // for vertexindex\n      // remove duplicate vertices:\n      const EPS_SQUARED = EPS * EPS\n      if (backvertices.length >= 3) {\n        let prevvertex = backvertices[backvertices.length - 1]\n        for (let vertexindex = 0; vertexindex < backvertices.length; vertexindex++) {\n          const vertex = backvertices[vertexindex]\n          if (vec3.squaredDistance(vertex, prevvertex) < EPS_SQUARED) {\n            backvertices.splice(vertexindex, 1)\n            vertexindex--\n          }\n          prevvertex = vertex\n        }\n      }\n      if (frontvertices.length >= 3) {\n        let prevvertex = frontvertices[frontvertices.length - 1]\n        for (let vertexindex = 0; vertexindex < frontvertices.length; vertexindex++) {\n          const vertex = frontvertices[vertexindex]\n          if (vec3.squaredDistance(vertex, prevvertex) < EPS_SQUARED) {\n            frontvertices.splice(vertexindex, 1)\n            vertexindex--\n          }\n          prevvertex = vertex\n        }\n      }\n      if (frontvertices.length >= 3) {\n        result.front = poly3.fromPointsAndPlane(frontvertices, pplane)\n      }\n      if (backvertices.length >= 3) {\n        result.back = poly3.fromPointsAndPlane(backvertices, pplane)\n      }\n    }\n  }\n  return result\n}\n\nmodule.exports = splitPolygonByPlane\n","const flatten = require('../../utils/flatten')\nconst areAllShapesTheSameType = require('../../utils/areAllShapesTheSameType')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\n\nconst unionGeom2 = require('./unionGeom2')\nconst unionGeom3 = require('./unionGeom3')\n\n/**\n * Return a new geometry representing the total space in the given geometries.\n * The given geometries should be of the same type, either geom2 or geom3.\n *\n * @param {...Object} geometries - list of geometries\n * @returns {geom2|geom3} a new geometry\n * @alias module:modeling/booleans.union\n *\n * @example\n * let myshape = union(cube({size: [5,5,5]}), cube({size: [5,5,5], center: [5,5,5]}))\n *\n * @example\n * +-------+            +-------+\n * |       |            |       |\n * |   A   |            |       |\n * |    +--+----+   =   |       +----+\n * +----+--+    |       +----+       |\n *      |   B   |            |       |\n *      |       |            |       |\n *      +-------+            +-------+\n */\nconst union = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  if (!areAllShapesTheSameType(geometries)) {\n    throw new Error('only unions of the same type are supported')\n  }\n\n  const geometry = geometries[0]\n  // if (path.isA(geometry)) return pathunion(matrix, geometries)\n  if (geom2.isA(geometry)) return unionGeom2(geometries)\n  if (geom3.isA(geometry)) return unionGeom3(geometries)\n  return geometry\n}\n\nmodule.exports = union\n","const flatten = require('../../utils/flatten')\n\nconst geom3 = require('../../geometries/geom3')\n\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst fromFakePolygons = require('./fromFakePolygons')\nconst to3DWalls = require('./to3DWalls')\nconst unionGeom3 = require('./unionGeom3')\n\n/*\n * Return a new 2D geometry representing the total space in the given 2D geometries.\n * @param {...geom2} geometries - list of 2D geometries to union\n * @returns {geom2} new 2D geometry\n */\nconst union = (...geometries) => {\n  geometries = flatten(geometries)\n  const newgeometries = geometries.map((geometry) => to3DWalls({ z0: -1, z1: 1 }, geometry))\n\n  const newgeom3 = unionGeom3(newgeometries)\n  const epsilon = measureEpsilon(newgeom3)\n\n  return fromFakePolygons(epsilon, geom3.toPolygons(newgeom3))\n}\n\nmodule.exports = union\n","const flatten = require('../../utils/flatten')\n\nconst retessellate = require('../modifiers/retessellate')\n\nconst unionSub = require('./unionGeom3Sub')\n\n/*\n * Return a new 3D geometry representing the space in the given 3D geometries.\n * @param {...objects} geometries - list of geometries to union\n * @returns {geom3} new 3D geometry\n */\nconst union = (...geometries) => {\n  geometries = flatten(geometries)\n\n  // combine geometries in a way that forms a balanced binary tree pattern\n  let i\n  for (i = 1; i < geometries.length; i += 2) {\n    geometries.push(unionSub(geometries[i - 1], geometries[i]))\n  }\n  let newgeometry = geometries[i - 1]\n  newgeometry = retessellate(newgeometry)\n  return newgeometry\n}\n\nmodule.exports = union\n","const geom3 = require('../../geometries/geom3')\n\nconst mayOverlap = require('./mayOverlap')\nconst { Tree } = require('./trees')\n\n/*\n * Return a new 3D geometry representing the space in the given geometries.\n * @param {geom3} geometry1 - geometry to union\n * @param {geom3} geometry2 - geometry to union\n * @returns {geom3} new 3D geometry\n */\nconst unionSub = (geometry1, geometry2) => {\n  if (!mayOverlap(geometry1, geometry2)) {\n    return unionForNonIntersecting(geometry1, geometry2)\n  }\n\n  const a = new Tree(geom3.toPolygons(geometry1))\n  const b = new Tree(geom3.toPolygons(geometry2))\n\n  a.clipTo(b, false)\n  // b.clipTo(a, true); // ERROR: doesn't work\n  b.clipTo(a)\n  b.invert()\n  b.clipTo(a)\n  b.invert()\n\n  const newpolygons = a.allPolygons().concat(b.allPolygons())\n  const result = geom3.create(newpolygons)\n  return result\n}\n\n// Like union, but when we know that the two solids are not intersecting\n// Do not use if you are not completely sure that the solids do not intersect!\nconst unionForNonIntersecting = (geometry1, geometry2) => {\n  let newpolygons = geom3.toPolygons(geometry1)\n  newpolygons = newpolygons.concat(geom3.toPolygons(geometry2))\n  return geom3.create(newpolygons)\n}\n\nmodule.exports = unionSub\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\nconst expandGeom2 = require('./expandGeom2')\nconst expandGeom3 = require('./expandGeom3')\nconst expandPath2 = require('./expandPath2')\n\n/**\n * Expand the given geometry using the given options.\n * Both internal and external space is expanded for 2D and 3D shapes.\n *\n * Note: Contract is expand using a negative delta.\n * @param {Object} options - options for expand\n * @param {Number} [options.delta=1] - delta (+/-) of expansion\n * @param {String} [options.corners='edge'] - type of corner to create after expanding; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {...Objects} objects - the geometries to expand\n * @return {Object|Array} new geometry, or list of new geometries\n * @alias module:modeling/expansions.expand\n *\n * @example\n * let newarc = expand({delta: 5, corners: 'edge'}, arc({}))\n * let newsquare = expand({delta: 5, corners: 'chamfer'}, square({size: 30}))\n * let newsphere = expand({delta: 2, corners: 'round'}, cuboid({size: [20, 25, 5]}))\n */\nconst expand = (options, ...objects) => {\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return expandPath2(options, object)\n    if (geom2.isA(object)) return expandGeom2(options, object)\n    if (geom3.isA(object)) return expandGeom3(options, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = expand\n","const geom2 = require('../../geometries/geom2')\n\nconst offsetFromPoints = require('./offsetFromPoints')\n\n/*\n * Expand the given geometry (geom2) using the given options (if any).\n * @param {Object} options - options for expand\n * @param {Number} [options.delta=1] - delta (+/-) of expansion\n * @param {String} [options.corners='edge'] - type corner to create during of expansion; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {geom2} geometry - the geometry to expand\n * @returns {geom2} expanded geometry\n */\nconst expandGeom2 = (options, geometry) => {\n  const defaults = {\n    delta: 1,\n    corners: 'edge',\n    segments: 16\n  }\n  const { delta, corners, segments } = Object.assign({ }, defaults, options)\n\n  if (!(corners === 'edge' || corners === 'chamfer' || corners === 'round')) {\n    throw new Error('corners must be \"edge\", \"chamfer\", or \"round\"')\n  }\n\n  // convert the geometry to outlines, and generate offsets from each\n  const outlines = geom2.toOutlines(geometry)\n  const newoutlines = outlines.map((outline) => {\n    options = {\n      delta,\n      corners,\n      closed: true,\n      segments\n    }\n    return offsetFromPoints(options, outline)\n  })\n\n  // create a composite geometry from the new outlines\n  const allsides = newoutlines.reduce((sides, newoutline) => sides.concat(geom2.toSides(geom2.fromPoints(newoutline))), [])\n  return geom2.create(allsides)\n}\n\nmodule.exports = expandGeom2\n","const geom3 = require('../../geometries/geom3')\n\nconst union = require('../booleans/union')\n\nconst expandShell = require('./expandShell')\n\n/*\n * Expand the given geometry (geom3) using the given options (if any).\n * @param {Object} options - options for expand\n * @param {Number} [options.delta=1] - delta (+/-) of expansion\n * @param {String} [options.corners='round'] - type corner to create during of expansion; round\n * @param {Integer} [options.segments=12] - number of segments when creating round corners\n * @param {geom3} geometry - the geometry to expand\n * @returns {geom3} expanded geometry\n */\nconst expandGeom3 = (options, geometry) => {\n  const defaults = {\n    delta: 1,\n    corners: 'round',\n    segments: 12\n  }\n  const { delta, corners, segments } = Object.assign({ }, defaults, options)\n\n  if (!(corners === 'round')) {\n    throw new Error('corners must be \"round\" for 3D geometries')\n  }\n\n  const polygons = geom3.toPolygons(geometry)\n  if (polygons.length === 0) throw new Error('the given geometry cannot be empty')\n\n  options = { delta, corners, segments }\n  const expanded = expandShell(options, geometry)\n  return union(geometry, expanded)\n}\n\nmodule.exports = expandGeom3\n","const area = require('../../maths/utils/area')\n\nconst vec2 = require('../../maths/vec2')\n\nconst geom2 = require('../../geometries/geom2')\nconst path2 = require('../../geometries/path2')\n\nconst offsetFromPoints = require('./offsetFromPoints')\n\nconst createGeometryFromClosedOffsets = (paths) => {\n  let { external, internal } = paths\n  if (area(external) < 0) {\n    external = external.reverse()\n  } else {\n    internal = internal.reverse()\n  }\n  // NOTE: creating path2 from the points ensures proper closure\n  const externalPath = path2.fromPoints({ closed: true }, external)\n  const internalPath = path2.fromPoints({ closed: true }, internal)\n  const externalSides = geom2.toSides(geom2.fromPoints(path2.toPoints(externalPath)))\n  const internalSides = geom2.toSides(geom2.fromPoints(path2.toPoints(internalPath)))\n  externalSides.push(...internalSides)\n  return geom2.create(externalSides)\n}\n\nconst createGeometryFromExpandedOpenPath = (paths, segments, corners, delta) => {\n  const { points, external, internal } = paths\n  const capSegments = Math.floor(segments / 2) // rotation is 180 degrees\n  const e2iCap = []\n  const i2eCap = []\n  if (corners === 'round' && capSegments > 0) {\n    // added round caps to the geometry\n    const step = Math.PI / capSegments\n    const eCorner = points[points.length - 1]\n    const e2iStart = vec2.angle(vec2.subtract(vec2.create(), external[external.length - 1], eCorner))\n    const iCorner = points[0]\n    const i2eStart = vec2.angle(vec2.subtract(vec2.create(), internal[0], iCorner))\n    for (let i = 1; i < capSegments; i++) {\n      let radians = e2iStart + (step * i)\n      let point = vec2.fromAngleRadians(vec2.create(), radians)\n      vec2.scale(point, point, delta)\n      vec2.add(point, point, eCorner)\n      e2iCap.push(point)\n\n      radians = i2eStart + (step * i)\n      point = vec2.fromAngleRadians(vec2.create(), radians)\n      vec2.scale(point, point, delta)\n      vec2.add(point, point, iCorner)\n      i2eCap.push(point)\n    }\n  }\n  const allPoints = []\n  allPoints.push(...external, ...e2iCap, ...internal.reverse(), ...i2eCap)\n  return geom2.fromPoints(allPoints)\n}\n\n/*\n * Expand the given geometry (path2) using the given options (if any).\n * @param {Object} options - options for expand\n * @param {Number} [options.delta=1] - delta (+) of expansion\n * @param {String} [options.corners='edge'] - type corner to create during of expansion; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {path2} geometry - the geometry to expand\n * @returns {geom2} expanded geometry\n */\nconst expandPath2 = (options, geometry) => {\n  const defaults = {\n    delta: 1,\n    corners: 'edge',\n    segments: 16\n  }\n\n  options = Object.assign({ }, defaults, options)\n  const { delta, corners, segments } = options\n\n  if (delta <= 0) throw new Error('the given delta must be positive for paths')\n\n  if (!(corners === 'edge' || corners === 'chamfer' || corners === 'round')) {\n    throw new Error('corners must be \"edge\", \"chamfer\", or \"round\"')\n  }\n\n  const closed = geometry.isClosed\n  const points = path2.toPoints(geometry)\n  if (points.length === 0) throw new Error('the given geometry cannot be empty')\n\n  const paths = {\n    points: points,\n    external: offsetFromPoints({ delta, corners, segments, closed }, points),\n    internal: offsetFromPoints({ delta: -delta, corners, segments, closed }, points)\n  }\n\n  if (geometry.isClosed) {\n    return createGeometryFromClosedOffsets(paths)\n  } else {\n    return createGeometryFromExpandedOpenPath(paths, segments, corners, delta)\n  }\n}\n\nmodule.exports = expandPath2\n","const { EPS, TAU } = require('../../maths/constants')\n\nconst mat4 = require('../../maths/mat4')\nconst vec3 = require('../../maths/vec3')\n\nconst fnNumberSort = require('../../utils/fnNumberSort')\n\nconst geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\nconst sphere = require('../../primitives/sphere')\n\nconst retessellate = require('../modifiers/retessellate')\n\nconst unionGeom3Sub = require('../booleans/unionGeom3Sub')\n\nconst extrudePolygon = require('./extrudePolygon')\n\n/*\n * Collect all planes adjacent to each vertex\n */\nconst mapPlaneToVertex = (map, vertex, plane) => {\n  const key = vertex.toString()\n  if (!map.has(key)) {\n    const entry = [vertex, [plane]]\n    map.set(key, entry)\n  } else {\n    const planes = map.get(key)[1]\n    planes.push(plane)\n  }\n}\n\n/*\n * Collect all planes adjacent to each edge.\n * Combine undirected edges, no need for duplicate cylinders.\n */\nconst mapPlaneToEdge = (map, edge, plane) => {\n  const key0 = edge[0].toString()\n  const key1 = edge[1].toString()\n  // Sort keys to make edges undirected\n  const key = key0 < key1 ? `${key0},${key1}` : `${key1},${key0}`\n  if (!map.has(key)) {\n    const entry = [edge, [plane]]\n    map.set(key, entry)\n  } else {\n    const planes = map.get(key)[1]\n    planes.push(plane)\n  }\n}\n\nconst addUniqueAngle = (map, angle) => {\n  const i = map.findIndex((item) => item === angle)\n  if (i < 0) {\n    map.push(angle)\n  }\n}\n\n/*\n * Create the expanded shell of the solid:\n * All faces are extruded to 2 times delta\n * Cylinders are constructed around every side\n * Spheres are placed on every vertex\n * the result is a true expansion of the solid\n * @param  {Number} delta\n * @param  {Integer} segments\n */\nconst expandShell = (options, geometry) => {\n  const defaults = {\n    delta: 1,\n    segments: 12\n  }\n  const { delta, segments } = Object.assign({ }, defaults, options)\n\n  let result = geom3.create()\n  const vertices2planes = new Map() // {vertex: [vertex, [plane, ...]]}\n  const edges2planes = new Map() // {edge: [[vertex, vertex], [plane, ...]]}\n\n  const v1 = vec3.create()\n  const v2 = vec3.create()\n\n  // loop through the polygons\n  // - extruded the polygon, and add to the composite result\n  // - add the plane to the unique vertice map\n  // - add the plane to the unique edge map\n  const polygons = geom3.toPolygons(geometry)\n  polygons.forEach((polygon, index) => {\n    const extrudevector = vec3.scale(vec3.create(), poly3.plane(polygon), 2 * delta)\n    const translatedpolygon = poly3.transform(mat4.fromTranslation(mat4.create(), vec3.scale(vec3.create(), extrudevector, -0.5)), polygon)\n    const extrudedface = extrudePolygon(extrudevector, translatedpolygon)\n    result = unionGeom3Sub(result, extrudedface)\n\n    const vertices = polygon.vertices\n    for (let i = 0; i < vertices.length; i++) {\n      mapPlaneToVertex(vertices2planes, vertices[i], poly3.plane(polygon))\n      const j = (i + 1) % vertices.length\n      const edge = [vertices[i], vertices[j]]\n      mapPlaneToEdge(edges2planes, edge, poly3.plane(polygon))\n    }\n  })\n\n  // now construct a cylinder on every side\n  // The cylinder is always an approximation of a true cylinder, having polygons\n  // around the sides. We will make sure though that the cylinder will have an edge at every\n  // face that touches this side. This ensures that we will get a smooth fill even\n  // if two edges are at, say, 10 degrees and the segments is low.\n  edges2planes.forEach((item) => {\n    const edge = item[0]\n    const planes = item[1]\n    const startpoint = edge[0]\n    const endpoint = edge[1]\n\n    // our x,y and z vectors:\n    const zbase = vec3.subtract(vec3.create(), endpoint, startpoint)\n    vec3.normalize(zbase, zbase)\n    const xbase = planes[0]\n    const ybase = vec3.cross(vec3.create(), xbase, zbase)\n\n    // make a list of angles that the cylinder should traverse:\n    let angles = []\n\n    // first of all equally spaced around the cylinder:\n    for (let i = 0; i < segments; i++) {\n      addUniqueAngle(angles, (i * TAU / segments))\n    }\n\n    // and also at every normal of all touching planes:\n    for (let i = 0, iMax = planes.length; i < iMax; i++) {\n      const planenormal = planes[i]\n      const si = vec3.dot(ybase, planenormal)\n      const co = vec3.dot(xbase, planenormal)\n      let angle = Math.atan2(si, co)\n\n      if (angle < 0) angle += TAU\n      addUniqueAngle(angles, angle)\n      angle = Math.atan2(-si, -co)\n      if (angle < 0) angle += TAU\n      addUniqueAngle(angles, angle)\n    }\n\n    // this will result in some duplicate angles but we will get rid of those later.\n    angles = angles.sort(fnNumberSort)\n\n    // Now construct the cylinder by traversing all angles:\n    const numangles = angles.length\n    let prevp1\n    let prevp2\n    const startfacevertices = []\n    const endfacevertices = []\n    const polygons = []\n    for (let i = -1; i < numangles; i++) {\n      const angle = angles[(i < 0) ? (i + numangles) : i]\n      const si = Math.sin(angle)\n      const co = Math.cos(angle)\n      vec3.scale(v1, xbase, co * delta)\n      vec3.scale(v2, ybase, si * delta)\n      vec3.add(v1, v1, v2)\n      const p1 = vec3.add(vec3.create(), startpoint, v1)\n      const p2 = vec3.add(vec3.create(), endpoint, v1)\n      let skip = false\n      if (i >= 0) {\n        if (vec3.distance(p1, prevp1) < EPS) {\n          skip = true\n        }\n      }\n      if (!skip) {\n        if (i >= 0) {\n          startfacevertices.push(p1)\n          endfacevertices.push(p2)\n          const points = [prevp2, p2, p1, prevp1]\n          const polygon = poly3.create(points)\n          polygons.push(polygon)\n        }\n        prevp1 = p1\n        prevp2 = p2\n      }\n    }\n    endfacevertices.reverse()\n    polygons.push(poly3.create(startfacevertices))\n    polygons.push(poly3.create(endfacevertices))\n\n    const cylinder = geom3.create(polygons)\n    result = unionGeom3Sub(result, cylinder)\n  })\n\n  // build spheres at each unique vertex\n  // We will try to set the x and z axis to the normals of 2 planes\n  // This will ensure that our sphere tesselation somewhat matches 2 planes\n  vertices2planes.forEach((item) => {\n    const vertex = item[0]\n    const planes = item[1]\n    // use the first normal to be the x axis of our sphere:\n    const xaxis = planes[0]\n    // and find a suitable z axis. We will use the normal which is most perpendicular to the x axis:\n    let bestzaxis = null\n    let bestzaxisorthogonality = 0\n    for (let i = 1; i < planes.length; i++) {\n      const normal = planes[i]\n      const cross = vec3.cross(v1, xaxis, normal)\n      const crosslength = vec3.length(cross)\n      if (crosslength > 0.05) { // FIXME why 0.05?\n        if (crosslength > bestzaxisorthogonality) {\n          bestzaxisorthogonality = crosslength\n          bestzaxis = normal\n        }\n      }\n    }\n    if (!bestzaxis) {\n      bestzaxis = vec3.orthogonal(v1, xaxis)\n    }\n    const yaxis = vec3.cross(v1, xaxis, bestzaxis)\n    vec3.normalize(yaxis, yaxis)\n    const zaxis = vec3.cross(v2, yaxis, xaxis)\n    const corner = sphere({\n      center: [vertex[0], vertex[1], vertex[2]],\n      radius: delta,\n      segments: segments,\n      axes: [xaxis, yaxis, zaxis]\n    })\n    result = unionGeom3Sub(result, corner)\n  })\n  return retessellate(result)\n}\n\nmodule.exports = expandShell\n","const mat4 = require('../../maths/mat4')\nconst vec3 = require('../../maths/vec3')\n\nconst geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\n// Extrude a polygon in the direction of the offsetvector.\n// Returns (geom3) a new geometry\nconst extrudePolygon = (offsetvector, polygon1) => {\n  const direction = vec3.dot(poly3.plane(polygon1), offsetvector)\n  if (direction > 0) {\n    polygon1 = poly3.invert(polygon1)\n  }\n\n  const newpolygons = [polygon1]\n\n  const polygon2 = poly3.transform(mat4.fromTranslation(mat4.create(), offsetvector), polygon1)\n  const numvertices = polygon1.vertices.length\n  for (let i = 0; i < numvertices; i++) {\n    const nexti = (i < (numvertices - 1)) ? i + 1 : 0\n    const sideFacePolygon = poly3.create([\n      polygon1.vertices[i],\n      polygon2.vertices[i],\n      polygon2.vertices[nexti],\n      polygon1.vertices[nexti]\n    ])\n    newpolygons.push(sideFacePolygon)\n  }\n  newpolygons.push(poly3.invert(polygon2))\n\n  return geom3.create(newpolygons)\n}\n\nmodule.exports = extrudePolygon\n","/**\n * All shapes (primitives or the results of operations) can be expanded (or contracted.)\n * In all cases, the function returns the results, and never changes the original shapes.\n * @module modeling/expansions\n * @example\n * const { expand, offset } = require('@jscad/modeling').expansions\n */\nmodule.exports = {\n  expand: require('./expand'),\n  offset: require('./offset')\n}\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\nconst path2 = require('../../geometries/path2')\n\nconst offsetGeom2 = require('./offsetGeom2')\nconst offsetPath2 = require('./offsetPath2')\n\n/**\n * Create offset geometry from the given geometry using the given options.\n * Offsets from internal and external space are created.\n * @param {Object} options - options for offset\n * @param {Float} [options.delta=1] - delta of offset (+ to exterior, - from interior)\n * @param {String} [options.corners='edge'] - type of corner to create after offseting; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {...Object} objects - the geometries to offset\n * @return {Object|Array} new geometry, or list of new geometries\n * @alias module:modeling/expansions.offset\n *\n * @example\n * let small = offset({ delta: -4, corners: 'chamfer' }, square({size: 40})) // contract\n */\nconst offset = (options, ...objects) => {\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return offsetPath2(options, object)\n    if (geom2.isA(object)) return offsetGeom2(options, object)\n    // if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = offset\n","const { EPS, TAU } = require('../../maths/constants')\n\nconst intersect = require('../../maths/utils/intersect')\nconst line2 = require('../../maths/line2')\nconst vec2 = require('../../maths/vec2')\nconst area = require('../../maths/utils/area')\n\n/*\n * Create a set of offset points from the given points using the given options (if any).\n * @param {Object} options - options for offset\n * @param {Float} [options.delta=1] - delta of offset (+ to exterior, - from interior)\n * @param {String} [options.corners='edge'] - type corner to create during of expansion; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {Integer} [options.closed=false] - is the last point connected back to the first point?\n * @param {Array} points - array of 2D points\n * @returns {Array} new set of offset points, plus points for each rounded corner\n */\nconst offsetFromPoints = (options, points) => {\n  const defaults = {\n    delta: 1,\n    corners: 'edge',\n    closed: false,\n    segments: 16\n  }\n  let { delta, corners, closed, segments } = Object.assign({ }, defaults, options)\n\n  if (Math.abs(delta) < EPS) return points\n\n  let rotation = options.closed ? area(points) : 1.0 // + counter clockwise, - clockwise\n  if (rotation === 0) rotation = 1.0\n\n  // use right hand normal?\n  const orientation = ((rotation > 0) && (delta >= 0)) || ((rotation < 0) && (delta < 0))\n  delta = Math.abs(delta) // sign is no longer required\n\n  let previousSegment = null\n  let newPoints = []\n  const newCorners = []\n  const of = vec2.create()\n  const n = points.length\n  for (let i = 0; i < n; i++) {\n    const j = (i + 1) % n\n    const p0 = points[i]\n    const p1 = points[j]\n    // calculate the unit normal\n    orientation ? vec2.subtract(of, p0, p1) : vec2.subtract(of, p1, p0)\n    vec2.normal(of, of)\n    vec2.normalize(of, of)\n    // calculate the offset vector\n    vec2.scale(of, of, delta)\n    // calculate the new points (edge)\n    const n0 = vec2.add(vec2.create(), p0, of)\n    const n1 = vec2.add(vec2.create(), p1, of)\n\n    const currentSegment = [n0, n1]\n    if (previousSegment != null) {\n      if (closed || (!closed && j !== 0)) {\n        // check for intersection of new line segments\n        const ip = intersect(previousSegment[0], previousSegment[1], currentSegment[0], currentSegment[1])\n        if (ip) {\n          // adjust the previous points\n          newPoints.pop()\n          // adjust current points\n          currentSegment[0] = ip\n        } else {\n          newCorners.push({ c: p0, s0: previousSegment, s1: currentSegment })\n        }\n      }\n    }\n    previousSegment = [n0, n1]\n\n    if (j === 0 && !closed) continue\n\n    newPoints.push(currentSegment[0])\n    newPoints.push(currentSegment[1])\n  }\n  // complete the closure if required\n  if (closed && previousSegment != null) {\n    // check for intersection of closing line segments\n    const n0 = newPoints[0]\n    const n1 = newPoints[1]\n    const ip = intersect(previousSegment[0], previousSegment[1], n0, n1)\n    if (ip) {\n      // adjust the previous points\n      newPoints[0] = ip\n      newPoints.pop()\n    } else {\n      const p0 = points[0]\n      const cursegment = [n0, n1]\n      newCorners.push({ c: p0, s0: previousSegment, s1: cursegment })\n    }\n  }\n\n  // generate corners if necessary\n\n  if (corners === 'edge') {\n    // map for fast point index lookup\n    const pointIndex = new Map() // {point: index}\n    newPoints.forEach((point, index) => pointIndex.set(point, index))\n\n    // create edge corners\n    const line0 = line2.create()\n    const line1 = line2.create()\n    newCorners.forEach((corner) => {\n      line2.fromPoints(line0, corner.s0[0], corner.s0[1])\n      line2.fromPoints(line1, corner.s1[0], corner.s1[1])\n      const ip = line2.intersectPointOfLines(line0, line1)\n      if (Number.isFinite(ip[0]) && Number.isFinite(ip[1])) {\n        const p0 = corner.s0[1]\n        const i = pointIndex.get(p0)\n        newPoints[i] = ip\n        newPoints[(i + 1) % newPoints.length] = undefined\n      } else {\n        // paralell segments, drop one\n        const p0 = corner.s1[0]\n        const i = pointIndex.get(p0)\n        newPoints[i] = undefined\n      }\n    })\n    newPoints = newPoints.filter((p) => p !== undefined)\n  }\n\n  if (corners === 'round') {\n    // create rounded corners\n    let cornersegments = Math.floor(segments / 4)\n    const v0 = vec2.create()\n    newCorners.forEach((corner) => {\n      // calculate angle of rotation\n      let rotation = vec2.angle(vec2.subtract(v0, corner.s1[0], corner.c))\n      rotation -= vec2.angle(vec2.subtract(v0, corner.s0[1], corner.c))\n      if (orientation && rotation < 0) {\n        rotation = rotation + Math.PI\n        if (rotation < 0) rotation = rotation + Math.PI\n      }\n      if ((!orientation) && rotation > 0) {\n        rotation = rotation - Math.PI\n        if (rotation > 0) rotation = rotation - Math.PI\n      }\n\n      if (rotation !== 0.0) {\n        // generate the segments\n        cornersegments = Math.floor(segments * (Math.abs(rotation) / TAU))\n        const step = rotation / cornersegments\n        const start = vec2.angle(vec2.subtract(v0, corner.s0[1], corner.c))\n        const cornerpoints = []\n        for (let i = 1; i < cornersegments; i++) {\n          const radians = start + (step * i)\n          const point = vec2.fromAngleRadians(vec2.create(), radians)\n          vec2.scale(point, point, delta)\n          vec2.add(point, point, corner.c)\n          cornerpoints.push(point)\n        }\n        if (cornerpoints.length > 0) {\n          const p0 = corner.s0[1]\n          let i = newPoints.findIndex((point) => vec2.equals(p0, point))\n          i = (i + 1) % newPoints.length\n          newPoints.splice(i, 0, ...cornerpoints)\n        }\n      } else {\n        // paralell segments, drop one\n        const p0 = corner.s1[0]\n        const i = newPoints.findIndex((point) => vec2.equals(p0, point))\n        newPoints.splice(i, 1)\n      }\n    })\n  }\n  return newPoints\n}\n\nmodule.exports = offsetFromPoints\n","const geom2 = require('../../geometries/geom2')\nconst poly2 = require('../../geometries/poly2')\n\nconst offsetFromPoints = require('./offsetFromPoints')\n\n/*\n * Create a offset geometry from the given geom2 using the given options (if any).\n * @param {Object} options - options for offset\n * @param {Float} [options.delta=1] - delta of offset (+ to exterior, - from interior)\n * @param {String} [options.corners='edge'] - type corner to create during of expansion; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {geom2} geometry - geometry from which to create the offset\n * @returns {geom2} offset geometry, plus rounded corners\n */\nconst offsetGeom2 = (options, geometry) => {\n  const defaults = {\n    delta: 1,\n    corners: 'edge',\n    segments: 0\n  }\n  const { delta, corners, segments } = Object.assign({ }, defaults, options)\n\n  if (!(corners === 'edge' || corners === 'chamfer' || corners === 'round')) {\n    throw new Error('corners must be \"edge\", \"chamfer\", or \"round\"')\n  }\n\n  // convert the geometry to outlines, and generate offsets from each\n  const outlines = geom2.toOutlines(geometry)\n  const newoutlines = outlines.map((outline) => {\n    const level = outlines.reduce((acc, polygon) => acc + poly2.arePointsInside(outline, poly2.create(polygon)), 0)\n    const outside = (level % 2) === 0\n\n    options = {\n      delta: outside ? delta : -delta,\n      corners,\n      closed: true,\n      segments\n    }\n    return offsetFromPoints(options, outline)\n  })\n\n  // create a composite geometry from the new outlines\n  const allsides = newoutlines.reduce((sides, newoutline) => sides.concat(geom2.toSides(geom2.fromPoints(newoutline))), [])\n  return geom2.create(allsides)\n}\n\nmodule.exports = offsetGeom2\n","const path2 = require('../../geometries/path2')\n\nconst offsetFromPoints = require('./offsetFromPoints')\n\n/*\n * Create a offset geometry from the given path using the given options (if any).\n * @param {Object} options - options for offset\n * @param {Float} [options.delta=1] - delta of offset (+ to exterior, - from interior)\n * @param {String} [options.corners='edge'] - type corner to create during of expansion; edge, chamfer, round\n * @param {Integer} [options.segments=16] - number of segments when creating round corners\n * @param {path2} geometry - geometry from which to create the offset\n * @returns {path2} offset geometry, plus rounded corners\n */\nconst offsetPath2 = (options, geometry) => {\n  const defaults = {\n    delta: 1,\n    corners: 'edge',\n    closed: geometry.isClosed,\n    segments: 16\n  }\n  const { delta, corners, closed, segments } = Object.assign({ }, defaults, options)\n\n  if (!(corners === 'edge' || corners === 'chamfer' || corners === 'round')) {\n    throw new Error('corners must be \"edge\", \"chamfer\", or \"round\"')\n  }\n\n  options = { delta, corners, closed, segments }\n  const newpoints = offsetFromPoints(options, path2.toPoints(geometry))\n  return path2.fromPoints({ closed: closed }, newpoints)\n}\n\nmodule.exports = offsetPath2\n","const { area } = require('../../../maths/utils')\nconst { toOutlines } = require('../../../geometries/geom2')\nconst { arePointsInside } = require('../../../geometries/poly2')\n\n/*\n * Constructs a polygon hierarchy of solids and holes.\n * The hierarchy is represented as a forest of trees. All trees shall be depth at most 2.\n * If a solid exists inside the hole of another solid, it will be split out as its own root.\n *\n * @param {geom2} geometry\n * @returns {Array} an array of polygons with associated holes\n * @alias module:modeling/geometries/geom2.toTree\n *\n * @example\n * const geometry = subtract(rectangle({size: [5, 5]}), rectangle({size: [3, 3]}))\n * console.log(assignHoles(geometry))\n * [{\n *   \"solid\": [[-2.5,-2.5],[2.5,-2.5],[2.5,2.5],[-2.5,2.5]],\n *   \"holes\": [[[-1.5,1.5],[1.5,1.5],[1.5,-1.5],[-1.5,-1.5]]]\n * }]\n */\nconst assignHoles = (geometry) => {\n  const outlines = toOutlines(geometry)\n  const solids = [] // solid indices\n  const holes = [] // hole indices\n  outlines.forEach((outline, i) => {\n    const a = area(outline)\n    if (a < 0) {\n      holes.push(i)\n    } else if (a > 0) {\n      solids.push(i)\n    }\n  })\n\n  // for each hole, determine what solids it is inside of\n  const children = [] // child holes of solid[i]\n  const parents = [] // parent solids of hole[i]\n  solids.forEach((s, i) => {\n    const solid = outlines[s]\n    children[i] = []\n    holes.forEach((h, j) => {\n      const hole = outlines[h]\n      // check if a point of hole j is inside solid i\n      if (arePointsInside([hole[0]], { vertices: solid })) {\n        children[i].push(h)\n        if (!parents[j]) parents[j] = []\n        parents[j].push(i)\n      }\n    })\n  })\n\n  // check if holes have multiple parents and choose one with fewest children\n  holes.forEach((h, j) => {\n    // ensure at least one parent exists\n    if (parents[j] && parents[j].length > 1) {\n      // the solid directly containing this hole\n      const directParent = minIndex(parents[j], (p) => children[p].length)\n      parents[j].forEach((p, i) => {\n        if (i !== directParent) {\n          // Remove hole from skip level parents\n          children[p] = children[p].filter((c) => c !== h)\n        }\n      })\n    }\n  })\n\n  // map indices back to points\n  return children.map((holes, i) => ({\n    solid: outlines[solids[i]],\n    holes: holes.map((h) => outlines[h])\n  }))\n}\n\n/*\n * Find the item in the list with smallest score(item).\n * If the list is empty, return undefined.\n */\nconst minIndex = (list, score) => {\n  let bestIndex\n  let best\n  list.forEach((item, index) => {\n    const value = score(item)\n    if (best === undefined || value < best) {\n      bestIndex = index\n      best = value\n    }\n  })\n  return bestIndex\n}\n\nmodule.exports = assignHoles\n","const { filterPoints, linkedPolygon, locallyInside, splitPolygon } = require('./linkedPolygon')\nconst { area, pointInTriangle } = require('./triangle')\n\n/*\n * link every hole into the outer loop, producing a single-ring polygon without holes\n *\n * Original source from https://github.com/mapbox/earcut\n * Copyright (c) 2016 Mapbox\n */\nconst eliminateHoles = (data, holeIndices, outerNode, dim) => {\n  const queue = []\n\n  for (let i = 0, len = holeIndices.length; i < len; i++) {\n    const start = holeIndices[i] * dim\n    const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length\n    const list = linkedPolygon(data, start, end, dim, false)\n    if (list === list.next) list.steiner = true\n    queue.push(getLeftmost(list))\n  }\n\n  queue.sort((a, b) => a.x - b.x) // compare X\n\n  // process holes from left to right\n  for (let i = 0; i < queue.length; i++) {\n    outerNode = eliminateHole(queue[i], outerNode)\n    outerNode = filterPoints(outerNode, outerNode.next)\n  }\n\n  return outerNode\n}\n\n/*\n * find a bridge between vertices that connects hole with an outer ring and link it\n */\nconst eliminateHole = (hole, outerNode) => {\n  const bridge = findHoleBridge(hole, outerNode)\n  if (!bridge) {\n    return outerNode\n  }\n\n  const bridgeReverse = splitPolygon(bridge, hole)\n\n  // filter colinear points around the cuts\n  const filteredBridge = filterPoints(bridge, bridge.next)\n  filterPoints(bridgeReverse, bridgeReverse.next)\n\n  // Check if input node was removed by the filtering\n  return outerNode === bridge ? filteredBridge : outerNode\n}\n\n/*\n * David Eberly's algorithm for finding a bridge between hole and outer polygon\n */\nconst findHoleBridge = (hole, outerNode) => {\n  let p = outerNode\n  const hx = hole.x\n  const hy = hole.y\n  let qx = -Infinity\n  let m\n\n  // find a segment intersected by a ray from the hole's leftmost point to the left\n  // segment's endpoint with lesser x will be potential connection point\n  do {\n    if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n      const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y)\n      if (x <= hx && x > qx) {\n        qx = x\n        if (x === hx) {\n          if (hy === p.y) return p\n          if (hy === p.next.y) return p.next\n        }\n\n        m = p.x < p.next.x ? p : p.next\n      }\n    }\n\n    p = p.next\n  } while (p !== outerNode)\n\n  if (!m) return null\n\n  if (hx === qx) return m // hole touches outer segment; pick leftmost endpoint\n\n  // look for points inside the triangle of hole point, segment intersection and endpoint\n  // if there are no points found, we have a valid connection\n  // otherwise choose the point of the minimum angle with the ray as connection point\n\n  const stop = m\n  const mx = m.x\n  const my = m.y\n  let tanMin = Infinity\n\n  p = m\n\n  do {\n    if (hx >= p.x && p.x >= mx && hx !== p.x &&\n        pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n      const tan = Math.abs(hy - p.y) / (hx - p.x) // tangential\n\n      if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n        m = p\n        tanMin = tan\n      }\n    }\n\n    p = p.next\n  } while (p !== stop)\n\n  return m\n}\n\n/*\n * whether sector in vertex m contains sector in vertex p in the same coordinates\n */\nconst sectorContainsSector = (m, p) => area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0\n\n/*\n * find the leftmost node of a polygon ring\n */\nconst getLeftmost = (start) => {\n  let p = start\n  let leftmost = start\n  do {\n    if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p\n    p = p.next\n  } while (p !== start)\n\n  return leftmost\n}\n\nmodule.exports = eliminateHoles\n","const eliminateHoles = require('./eliminateHoles')\nconst { removeNode, sortLinked } = require('./linkedList')\nconst { cureLocalIntersections, filterPoints, isValidDiagonal, linkedPolygon, splitPolygon } = require('./linkedPolygon')\nconst { area, pointInTriangle } = require('./triangle')\n\n/*\n * An implementation of the earcut polygon triangulation algorithm.\n *\n * Original source from https://github.com/mapbox/earcut\n * Copyright (c) 2016 Mapbox\n *\n * @param {data} A flat array of vertex coordinates.\n * @param {holeIndices} An array of hole indices if any.\n * @param {dim} The number of coordinates per vertex in the input array.\n */\nconst triangulate = (data, holeIndices, dim = 2) => {\n  const hasHoles = holeIndices && holeIndices.length\n  const outerLen = hasHoles ? holeIndices[0] * dim : data.length\n  let outerNode = linkedPolygon(data, 0, outerLen, dim, true)\n  const triangles = []\n\n  if (!outerNode || outerNode.next === outerNode.prev) return triangles\n\n  let minX, minY, maxX, maxY, invSize\n\n  if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim)\n\n  // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n  if (data.length > 80 * dim) {\n    minX = maxX = data[0]\n    minY = maxY = data[1]\n\n    for (let i = dim; i < outerLen; i += dim) {\n      const x = data[i]\n      const y = data[i + 1]\n      if (x < minX) minX = x\n      if (y < minY) minY = y\n      if (x > maxX) maxX = x\n      if (y > maxY) maxY = y\n    }\n\n    // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n    invSize = Math.max(maxX - minX, maxY - minY)\n    invSize = invSize !== 0 ? 1 / invSize : 0\n  }\n\n  earcutLinked(outerNode, triangles, dim, minX, minY, invSize)\n\n  return triangles\n}\n\n/*\n * main ear slicing loop which triangulates a polygon (given as a linked list)\n */\nconst earcutLinked = (ear, triangles, dim, minX, minY, invSize, pass) => {\n  if (!ear) return\n\n  // interlink polygon nodes in z-order\n  if (!pass && invSize) indexCurve(ear, minX, minY, invSize)\n\n  let stop = ear\n  let prev\n  let next\n\n  // iterate through ears, slicing them one by one\n  while (ear.prev !== ear.next) {\n    prev = ear.prev\n    next = ear.next\n\n    if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n      // cut off the triangle\n      triangles.push(prev.i / dim)\n      triangles.push(ear.i / dim)\n      triangles.push(next.i / dim)\n\n      removeNode(ear)\n\n      // skipping the next vertex leads to less sliver triangles\n      ear = next.next\n      stop = next.next\n\n      continue\n    }\n\n    ear = next\n\n    // if we looped through the whole remaining polygon and can't find any more ears\n    if (ear === stop) {\n      // try filtering points and slicing again\n      if (!pass) {\n        earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1)\n\n        // if this didn't work, try curing all small self-intersections locally\n      } else if (pass === 1) {\n        ear = cureLocalIntersections(filterPoints(ear), triangles, dim)\n        earcutLinked(ear, triangles, dim, minX, minY, invSize, 2)\n\n        // as a last resort, try splitting the remaining polygon into two\n      } else if (pass === 2) {\n        splitEarcut(ear, triangles, dim, minX, minY, invSize)\n      }\n\n      break\n    }\n  }\n}\n\n/*\n * check whether a polygon node forms a valid ear with adjacent nodes\n */\nconst isEar = (ear) => {\n  const a = ear.prev\n  const b = ear\n  const c = ear.next\n\n  if (area(a, b, c) >= 0) return false // reflex, can't be an ear\n\n  // now make sure we don't have other points inside the potential ear\n  let p = ear.next.next\n\n  while (p !== ear.prev) {\n    if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) {\n      return false\n    }\n    p = p.next\n  }\n\n  return true\n}\n\nconst isEarHashed = (ear, minX, minY, invSize) => {\n  const a = ear.prev\n  const b = ear\n  const c = ear.next\n\n  if (area(a, b, c) >= 0) return false // reflex, can't be an ear\n\n  // triangle bbox; min & max are calculated like this for speed\n  const minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x)\n  const minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y)\n  const maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x)\n  const maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y)\n\n  // z-order range for the current triangle bbox\n  const minZ = zOrder(minTX, minTY, minX, minY, invSize)\n  const maxZ = zOrder(maxTX, maxTY, minX, minY, invSize)\n\n  let p = ear.prevZ\n  let n = ear.nextZ\n\n  // look for points inside the triangle in both directions\n  while (p && p.z >= minZ && n && n.z <= maxZ) {\n    if (p !== ear.prev && p !== ear.next &&\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n      area(p.prev, p, p.next) >= 0) return false\n    p = p.prevZ\n\n    if (n !== ear.prev && n !== ear.next &&\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n      area(n.prev, n, n.next) >= 0) return false\n    n = n.nextZ\n  }\n\n  // look for remaining points in decreasing z-order\n  while (p && p.z >= minZ) {\n    if (p !== ear.prev && p !== ear.next &&\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n      area(p.prev, p, p.next) >= 0) return false\n    p = p.prevZ\n  }\n\n  // look for remaining points in increasing z-order\n  while (n && n.z <= maxZ) {\n    if (n !== ear.prev && n !== ear.next &&\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n      area(n.prev, n, n.next) >= 0) return false\n    n = n.nextZ\n  }\n\n  return true\n}\n\n/*\n * try splitting polygon into two and triangulate them independently\n */\nconst splitEarcut = (start, triangles, dim, minX, minY, invSize) => {\n  // look for a valid diagonal that divides the polygon into two\n  let a = start\n  do {\n    let b = a.next.next\n    while (b !== a.prev) {\n      if (a.i !== b.i && isValidDiagonal(a, b)) {\n        // split the polygon in two by the diagonal\n        let c = splitPolygon(a, b)\n\n        // filter colinear points around the cuts\n        a = filterPoints(a, a.next)\n        c = filterPoints(c, c.next)\n\n        // run earcut on each half\n        earcutLinked(a, triangles, dim, minX, minY, invSize)\n        earcutLinked(c, triangles, dim, minX, minY, invSize)\n        return\n      }\n\n      b = b.next\n    }\n\n    a = a.next\n  } while (a !== start)\n}\n\n/*\n * interlink polygon nodes in z-order\n */\nconst indexCurve = (start, minX, minY, invSize) => {\n  let p = start\n  do {\n    if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize)\n    p.prevZ = p.prev\n    p.nextZ = p.next\n    p = p.next\n  } while (p !== start)\n\n  p.prevZ.nextZ = null\n  p.prevZ = null\n\n  sortLinked(p, (p) => p.z)\n}\n\n/*\n * z-order of a point given coords and inverse of the longer side of data bbox\n */\nconst zOrder = (x, y, minX, minY, invSize) => {\n  // coords are transformed into non-negative 15-bit integer range\n  x = 32767 * (x - minX) * invSize\n  y = 32767 * (y - minY) * invSize\n\n  x = (x | (x << 8)) & 0x00FF00FF\n  x = (x | (x << 4)) & 0x0F0F0F0F\n  x = (x | (x << 2)) & 0x33333333\n  x = (x | (x << 1)) & 0x55555555\n\n  y = (y | (y << 8)) & 0x00FF00FF\n  y = (y | (y << 4)) & 0x0F0F0F0F\n  y = (y | (y << 2)) & 0x33333333\n  y = (y | (y << 1)) & 0x55555555\n\n  return x | (y << 1)\n}\n\nmodule.exports = triangulate\n","const sortLinked = require('./linkedListSort')\n\nclass Node {\n  constructor (i, x, y) {\n    // vertex index in coordinates array\n    this.i = i\n\n    // vertex coordinates\n    this.x = x\n    this.y = y\n\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null\n    this.next = null\n\n    // z-order curve value\n    this.z = null\n\n    // previous and next nodes in z-order\n    this.prevZ = null\n    this.nextZ = null\n\n    // indicates whether this is a steiner point\n    this.steiner = false\n  }\n}\n\n/*\n * create a node and optionally link it with previous one (in a circular doubly linked list)\n */\nconst insertNode = (i, x, y, last) => {\n  const p = new Node(i, x, y)\n\n  if (!last) {\n    p.prev = p\n    p.next = p\n  } else {\n    p.next = last.next\n    p.prev = last\n    last.next.prev = p\n    last.next = p\n  }\n\n  return p\n}\n\n/*\n * remove a node and join prev with next nodes\n */\nconst removeNode = (p) => {\n  p.next.prev = p.prev\n  p.prev.next = p.next\n\n  if (p.prevZ) p.prevZ.nextZ = p.nextZ\n  if (p.nextZ) p.nextZ.prevZ = p.prevZ\n}\n\nmodule.exports = { Node, insertNode, removeNode, sortLinked }\n","\n// Simon Tatham's linked list merge sort algorithm\n// https://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nconst sortLinked = (list, fn) => {\n  let i, p, q, e, numMerges\n  let inSize = 1\n\n  do {\n    p = list\n    list = null\n    let tail = null\n    numMerges = 0\n\n    while (p) {\n      numMerges++\n      q = p\n      let pSize = 0\n      for (i = 0; i < inSize; i++) {\n        pSize++\n        q = q.nextZ\n        if (!q) break\n      }\n\n      let qSize = inSize\n\n      while (pSize > 0 || (qSize > 0 && q)) {\n        if (pSize !== 0 && (qSize === 0 || !q || fn(p) <= fn(q))) {\n          e = p\n          p = p.nextZ\n          pSize--\n        } else {\n          e = q\n          q = q.nextZ\n          qSize--\n        }\n\n        if (tail) tail.nextZ = e\n        else list = e\n\n        e.prevZ = tail\n        tail = e\n      }\n\n      p = q\n    }\n\n    tail.nextZ = null\n    inSize *= 2\n  } while (numMerges > 1)\n\n  return list\n}\n\nmodule.exports = sortLinked\n","const { Node, insertNode, removeNode } = require('./linkedList')\nconst { area } = require('./triangle')\n\n/*\n * create a circular doubly linked list from polygon points in the specified winding order\n */\nconst linkedPolygon = (data, start, end, dim, clockwise) => {\n  let last\n\n  if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n    for (let i = start; i < end; i += dim) {\n      last = insertNode(i, data[i], data[i + 1], last)\n    }\n  } else {\n    for (let i = end - dim; i >= start; i -= dim) {\n      last = insertNode(i, data[i], data[i + 1], last)\n    }\n  }\n\n  if (last && equals(last, last.next)) {\n    removeNode(last)\n    last = last.next\n  }\n\n  return last\n}\n\n/*\n * eliminate colinear or duplicate points\n */\nconst filterPoints = (start, end) => {\n  if (!start) return start\n  if (!end) end = start\n\n  let p = start\n  let again\n  do {\n    again = false\n\n    if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n      removeNode(p)\n      p = end = p.prev\n      if (p === p.next) break\n      again = true\n    } else {\n      p = p.next\n    }\n  } while (again || p !== end)\n\n  return end\n}\n\n/*\n * go through all polygon nodes and cure small local self-intersections\n */\nconst cureLocalIntersections = (start, triangles, dim) => {\n  let p = start\n  do {\n    const a = p.prev\n    const b = p.next.next\n\n    if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n      triangles.push(a.i / dim)\n      triangles.push(p.i / dim)\n      triangles.push(b.i / dim)\n\n      // remove two nodes involved\n      removeNode(p)\n      removeNode(p.next)\n\n      p = start = b\n    }\n\n    p = p.next\n  } while (p !== start)\n\n  return filterPoints(p)\n}\n\n/*\n * check if a polygon diagonal intersects any polygon segments\n */\nconst intersectsPolygon = (a, b) => {\n  let p = a\n  do {\n    if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n        intersects(p, p.next, a, b)) return true\n    p = p.next\n  } while (p !== a)\n\n  return false\n}\n\n/*\n * check if a polygon diagonal is locally inside the polygon\n */\nconst locallyInside = (a, b) => area(a.prev, a, a.next) < 0\n  ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0\n  : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0\n\n/*\n * check if the middle point of a polygon diagonal is inside the polygon\n */\nconst middleInside = (a, b) => {\n  let p = a\n  let inside = false\n  const px = (a.x + b.x) / 2\n  const py = (a.y + b.y) / 2\n  do {\n    if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n        (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) { inside = !inside }\n    p = p.next\n  } while (p !== a)\n\n  return inside\n}\n\n/*\n * link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two\n * if one belongs to the outer ring and another to a hole, it merges it into a single ring\n */\nconst splitPolygon = (a, b) => {\n  const a2 = new Node(a.i, a.x, a.y)\n  const b2 = new Node(b.i, b.x, b.y)\n  const an = a.next\n  const bp = b.prev\n\n  a.next = b\n  b.prev = a\n\n  a2.next = an\n  an.prev = a2\n\n  b2.next = a2\n  a2.prev = b2\n\n  bp.next = b2\n  b2.prev = bp\n\n  return b2\n}\n\n/*\n * check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n */\nconst isValidDiagonal = (a, b) => a.next.i !== b.i &&\n    a.prev.i !== b.i &&\n    !intersectsPolygon(a, b) && // doesn't intersect other edges\n    (\n      locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n        (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n        equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0\n    )\n\n/*\n * check if two segments intersect\n */\nconst intersects = (p1, q1, p2, q2) => {\n  const o1 = Math.sign(area(p1, q1, p2))\n  const o2 = Math.sign(area(p1, q1, q2))\n  const o3 = Math.sign(area(p2, q2, p1))\n  const o4 = Math.sign(area(p2, q2, q1))\n\n  if (o1 !== o2 && o3 !== o4) return true // general case\n\n  if (o1 === 0 && onSegment(p1, p2, q1)) return true // p1, q1 and p2 are colinear and p2 lies on p1q1\n  if (o2 === 0 && onSegment(p1, q2, q1)) return true // p1, q1 and q2 are colinear and q2 lies on p1q1\n  if (o3 === 0 && onSegment(p2, p1, q2)) return true // p2, q2 and p1 are colinear and p1 lies on p2q2\n  if (o4 === 0 && onSegment(p2, q1, q2)) return true // p2, q2 and q1 are colinear and q1 lies on p2q2\n\n  return false\n}\n\n/*\n * for colinear points p, q, r, check if point q lies on segment pr\n */\nconst onSegment = (p, q, r) => q.x <= Math.max(p.x, r.x) &&\n    q.x >= Math.min(p.x, r.x) &&\n    q.y <= Math.max(p.y, r.y) &&\n    q.y >= Math.min(p.y, r.y)\n\nconst signedArea = (data, start, end, dim) => {\n  let sum = 0\n  for (let i = start, j = end - dim; i < end; i += dim) {\n    sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1])\n    j = i\n  }\n\n  return sum\n}\n\n/*\n * check if two points are equal\n */\nconst equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y\n\nmodule.exports = { cureLocalIntersections, filterPoints, isValidDiagonal, linkedPolygon, locallyInside, splitPolygon }\n","const geom2 = require('../../../geometries/geom2')\nconst plane = require('../../../maths/plane')\nconst vec2 = require('../../../maths/vec2')\nconst vec3 = require('../../../maths/vec3')\nconst calculatePlane = require('../slice/calculatePlane')\nconst assignHoles = require('./assignHoles')\n\n/*\n * Constructs a polygon hierarchy which associates holes with their outer solids.\n * This class maps a 3D polygon onto a 2D space using an orthonormal basis.\n * It tracks the mapping so that points can be reversed back to 3D losslessly.\n */\nclass PolygonHierarchy {\n  constructor (slice) {\n    this.plane = calculatePlane(slice)\n\n    // create an orthonormal basis\n    // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal\n    const rightvector = vec3.orthogonal(vec3.create(), this.plane)\n    const perp = vec3.cross(vec3.create(), this.plane, rightvector)\n    this.v = vec3.normalize(perp, perp)\n    this.u = vec3.cross(vec3.create(), this.v, this.plane)\n\n    // map from 2D to original 3D points\n    this.basisMap = new Map()\n\n    // project slice onto 2D plane\n    const projected = slice.edges.map((e) => e.map((v) => this.to2D(v)))\n\n    // compute polygon hierarchies, assign holes to solids\n    const geometry = geom2.create(projected)\n    this.roots = assignHoles(geometry)\n  }\n\n  /*\n   * project a 3D point onto the 2D plane\n   */\n  to2D (vector3) {\n    const vector2 = vec2.fromValues(vec3.dot(vector3, this.u), vec3.dot(vector3, this.v))\n    this.basisMap.set(vector2, vector3)\n    return vector2\n  }\n\n  /*\n   * un-project a 2D point back into 3D\n   */\n  to3D (vector2) {\n    // use a map to get the original 3D, no floating point error\n    const original = this.basisMap.get(vector2)\n    if (original) {\n      return original\n    } else {\n      console.log('Warning: point not in original slice')\n      const v1 = vec3.scale(vec3.create(), this.u, vector2[0])\n      const v2 = vec3.scale(vec3.create(), this.v, vector2[1])\n\n      const planeOrigin = vec3.scale(vec3.create(), plane, plane[3])\n      const v3 = vec3.add(v1, v1, planeOrigin)\n      return vec3.add(v2, v2, v3)\n    }\n  }\n}\n\nmodule.exports = PolygonHierarchy\n","\n/*\n * check if a point lies within a convex triangle\n */\nconst pointInTriangle = (ax, ay, bx, by, cx, cy, px, py) => (\n  (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n      (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n      (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0\n)\n\n/*\n * signed area of a triangle\n */\nconst area = (p, q, r) => (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y)\n\nmodule.exports = { area, pointInTriangle }\n","const mat4 = require('../../maths/mat4')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\nconst slice = require('./slice')\nconst repairSlice = require('./slice/repair')\n\nconst extrudeWalls = require('./extrudeWalls')\n\nconst defaultCallback = (progress, index, base) => {\n  let baseSlice = null\n  if (geom2.isA(base)) baseSlice = slice.fromSides(geom2.toSides(base))\n  if (poly3.isA(base)) baseSlice = slice.fromPoints(poly3.toPoints(base))\n\n  return progress === 0 || progress === 1 ? slice.transform(mat4.fromTranslation(mat4.create(), [0, 0, progress]), baseSlice) : null\n}\n\n/**\n * Extrude a solid from the slices as returned by the callback function.\n * @see slice\n *\n * @param {Object} options - options for extrude\n * @param {Integer} [options.numberOfSlices=2] the number of slices to be generated by the callback\n * @param {Boolean} [options.capStart=true] the solid should have a cap at the start\n * @param {Boolean} [options.capEnd=true] the solid should have a cap at the end\n * @param {Boolean} [options.close=false] the solid should have a closing section between start and end\n * @param {Boolean} [options.repair=true] - repair gaps in the geometry\n * @param {Function} [options.callback] the callback function that generates each slice\n * @param {Object} base - the base object which is used to create slices (see the example for callback information)\n * @return {geom3} the extruded shape\n * @alias module:modeling/extrusions.extrudeFromSlices\n *\n * @example\n * // Parameters:\n * //   progress : the percent complete [0..1]\n * //   index : the index of the current slice [0..numberOfSlices - 1]\n * //   base : the base object as given\n * // Return Value:\n * //   slice or null (to skip)\n * const callback = (progress, index, base) => {\n *   ...\n *   return slice\n * }\n */\nconst extrudeFromSlices = (options, base) => {\n  const defaults = {\n    numberOfSlices: 2,\n    capStart: true,\n    capEnd: true,\n    close: false,\n    repair: true,\n    callback: defaultCallback\n  }\n  const { numberOfSlices, capStart, capEnd, close, repair, callback: generate } = Object.assign({ }, defaults, options)\n\n  if (numberOfSlices < 2) throw new Error('numberOfSlices must be 2 or more')\n\n  // Repair gaps in the base slice\n  if (repair) {\n    // note: base must be a slice, if base is geom2 this doesn't repair\n    base = repairSlice(base)\n  }\n\n  const sMax = numberOfSlices - 1\n\n  let startSlice = null\n  let endSlice = null\n  let prevSlice = null\n  let polygons = []\n  for (let s = 0; s < numberOfSlices; s++) {\n    // invoke the callback function to get the next slice\n    // NOTE: callback can return null to skip the slice\n    const currentSlice = generate(s / sMax, s, base)\n\n    if (currentSlice) {\n      if (!slice.isA(currentSlice)) throw new Error('the callback function must return slice objects')\n\n      const edges = slice.toEdges(currentSlice)\n      if (edges.length === 0) throw new Error('the callback function must return slices with one or more edges')\n\n      if (prevSlice) {\n        polygons = polygons.concat(extrudeWalls(prevSlice, currentSlice))\n      }\n\n      // save start and end slices for caps if necessary\n      if (s === 0) startSlice = currentSlice\n      if (s === (numberOfSlices - 1)) endSlice = currentSlice\n\n      prevSlice = currentSlice\n    }\n  }\n\n  if (capEnd) {\n    // create a cap at the end\n    const endPolygons = slice.toPolygons(endSlice)\n    polygons = polygons.concat(endPolygons)\n  }\n  if (capStart) {\n    // create a cap at the start\n    const startPolygons = slice.toPolygons(startSlice).map(poly3.invert)\n    polygons = polygons.concat(startPolygons)\n  }\n  if (!capStart && !capEnd) {\n    // create walls between end and start slices\n    if (close && !slice.equals(endSlice, startSlice)) {\n      polygons = polygons.concat(extrudeWalls(endSlice, startSlice))\n    }\n  }\n  return geom3.create(polygons)\n}\n\nmodule.exports = extrudeFromSlices\n","const { TAU } = require('../../maths/constants')\nconst slice = require('./slice')\nconst mat4 = require('../../maths/mat4')\nconst extrudeFromSlices = require('./extrudeFromSlices')\nconst geom2 = require('../../geometries/geom2')\n\n/**\n * Perform a helical extrude of the geometry, using the given options.\n *\n * @param {Object} options - options for extrusion\n * @param {Number} [options.angle=TAU] - angle of the extrusion (RADIANS) positive for right-hand rotation, negative for left-hand\n * @param {Number} [options.startAngle=0] - start angle of the extrusion (RADIANS)\n * @param {Number} [options.pitch=10] - elevation gain for each turn\n * @param {Number} [options.height] - total height of the helix path. Ignored if pitch is set.\n * @param {Number} [options.endOffset=0] - offset the final radius of the extrusion, allowing for tapered helix, and or spiral\n * @param {Number} [options.segmentsPerRotation=32] - number of segments per full rotation of the extrusion\n * @param {geom2} geometry - the geometry to extrude\n * @returns {geom3} the extruded geometry\n * @alias module:modeling/extrusions.extrudeHelical\n *\n * @example\n * const myshape = extrudeHelical(\n *  {\n *      angle: Math.PI * 4,\n *      pitch: 10,\n *      segmentsPerRotation: 64\n *  },\n *  circle({size: 3, center: [10, 0]})\n * )\n */\nconst extrudeHelical = (options, geometry) => {\n  const defaults = {\n    angle: TAU,\n    startAngle: 0,\n    pitch: 10,\n    endOffset: 0,\n    segmentsPerRotation: 32\n  }\n  const { angle, endOffset, segmentsPerRotation, startAngle } = Object.assign({}, defaults, options)\n\n  let pitch\n  // ignore height if pitch is set\n  if(!options.pitch && options.height) {\n    pitch = options.height / (angle / TAU)\n  } else {\n    pitch = options.pitch ? options.pitch : defaults.pitch\n  }\n\n  // needs at least 3 segments for each revolution\n  const minNumberOfSegments = 3\n\n  if (segmentsPerRotation < minNumberOfSegments)\n    throw new Error(`The number of segments per rotation needs to be at least 3.`)\n\n  let shapeSides = geom2.toSides(geometry)\n  if (shapeSides.length === 0) throw new Error('the given geometry cannot be empty')\n\n  // const pointsWithNegativeX = shapeSides.filter((s) => (s[0][0] < 0))\n  const pointsWithPositiveX = shapeSides.filter((s) => (s[0][0] >= 0))\n  \n  let baseSlice = slice.fromSides(shapeSides)\n  \n  if(pointsWithPositiveX.length === 0) {\n    // only points in negative x plane, reverse\n    baseSlice = slice.reverse(baseSlice)\n  }\n\n  const calculatedSegments = Math.round(segmentsPerRotation / TAU * Math.abs(angle))\n  const segments = calculatedSegments >= 2 ? calculatedSegments : 2\n  // define transform matrix variables for performance increase\n  const step1 = mat4.create()\n  let matrix\n  const sliceCallback = (progress, index, base) => {\n    const zRotation = startAngle + angle / segments * index\n    const xOffset = endOffset / segments * index\n    const zOffset = (zRotation - startAngle) / TAU * pitch\n\n    // TODO: check for valid geometry after translations\n    // ie all the points have to be either x > -xOffset or x < -xOffset\n    // this would have to be checked for every transform, and handled\n    //\n    // not implementing, as this currently doesn't break anything,\n    // only creates inside-out polygons\n\n    // create transformation matrix\n    mat4.multiply(\n      step1,\n      // then apply offsets\n      mat4.fromTranslation(mat4.create(), [xOffset, 0, zOffset * Math.sign(angle)]),\n      // first rotate \"flat\" 2D shape from XY to XZ plane\n      mat4.fromXRotation(mat4.create(), -TAU / 4 * Math.sign(angle)) // rotate the slice correctly to not create inside-out polygon\n    )\n\n    matrix = mat4.create()\n    mat4.multiply(\n      matrix,\n      // finally rotate around Z axis\n      mat4.fromZRotation(mat4.create(), zRotation),\n      step1\n    )\n    return slice.transform(matrix, base)\n  }\n\n  return extrudeFromSlices(\n    {\n      // \"base\" slice is counted as segment, so add one for complete final rotation\n      numberOfSlices: segments + 1,\n      callback: sliceCallback\n    },\n    baseSlice\n  )\n}\n\nmodule.exports = extrudeHelical\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\nconst path2 = require('../../geometries/path2')\n\nconst extrudeLinearGeom2 = require('./extrudeLinearGeom2')\nconst extrudeLinearPath2 = require('./extrudeLinearPath2')\n\n/**\n * Extrude the given geometry in an upward linear direction using the given options.\n * Accepts path2 or geom2 objects as input. Paths must be closed.\n *\n * @param {Object} options - options for extrude\n * @param {Number} [options.height=1] the height of the extrusion\n * @param {Number} [options.twistAngle=0] the final rotation (RADIANS) about the origin of the shape (if any)\n * @param {Integer} [options.twistSteps=1] the resolution of the twist about the axis (if any)\n * @param {...Object} objects - the geometries to extrude\n * @return {Object|Array} the extruded geometry, or a list of extruded geometry\n * @alias module:modeling/extrusions.extrudeLinear\n *\n * @example\n * let myshape = extrudeLinear({height: 10}, rectangle({size: [20, 25]}))\n */\nconst extrudeLinear = (options, ...objects) => {\n  const defaults = {\n    height: 1,\n    twistAngle: 0,\n    twistSteps: 1,\n    repair: true\n  }\n  const { height, twistAngle, twistSteps, repair } = Object.assign({ }, defaults, options)\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  options = { offset: [0, 0, height], twistAngle, twistSteps, repair }\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return extrudeLinearPath2(options, object)\n    if (geom2.isA(object)) return extrudeLinearGeom2(options, object)\n    // if (geom3.isA(object)) return geom3.extrude(options, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = extrudeLinear\n","const mat4 = require('../../maths/mat4')\nconst vec3 = require('../../maths/vec3')\n\nconst geom2 = require('../../geometries/geom2')\n\nconst slice = require('./slice')\n\nconst extrudeFromSlices = require('./extrudeFromSlices')\n\n/*\n * Extrude the given geometry using the given options.\n *\n * @param {Object} [options] - options for extrude\n * @param {Array} [options.offset] - the direction of the extrusion as a 3D vector\n * @param {Number} [options.twistAngle] - the final rotation (RADIANS) about the origin\n * @param {Integer} [options.twistSteps] - the number of steps created to produce the twist (if any)\n * @param {Boolean} [options.repair] - repair gaps in the geometry\n * @param {geom2} geometry - the geometry to extrude\n * @returns {geom3} the extruded 3D geometry\n*/\nconst extrudeGeom2 = (options, geometry) => {\n  const defaults = {\n    offset: [0, 0, 1],\n    twistAngle: 0,\n    twistSteps: 12,\n    repair: true\n  }\n  let { offset, twistAngle, twistSteps, repair } = Object.assign({ }, defaults, options)\n\n  if (twistSteps < 1) throw new Error('twistSteps must be 1 or more')\n\n  if (twistAngle === 0) {\n    twistSteps = 1\n  }\n\n  // convert to vector in order to perform transforms\n  const offsetv = vec3.clone(offset)\n\n  const baseSides = geom2.toSides(geometry)\n  if (baseSides.length === 0) throw new Error('the given geometry cannot be empty')\n\n  const baseSlice = slice.fromSides(baseSides)\n  if (offsetv[2] < 0) slice.reverse(baseSlice, baseSlice)\n\n  const matrix = mat4.create()\n  const createTwist = (progress, index, base) => {\n    const Zrotation = index / twistSteps * twistAngle\n    const Zoffset = vec3.scale(vec3.create(), offsetv, index / twistSteps)\n    mat4.multiply(matrix, mat4.fromZRotation(matrix, Zrotation), mat4.fromTranslation(mat4.create(), Zoffset))\n\n    return slice.transform(matrix, base)\n  }\n\n  options = {\n    numberOfSlices: twistSteps + 1,\n    capStart: true,\n    capEnd: true,\n    repair,\n    callback: createTwist\n  }\n  return extrudeFromSlices(options, baseSlice)\n}\n\nmodule.exports = extrudeGeom2\n","const geom2 = require('../../geometries/geom2')\nconst path2 = require('../../geometries/path2')\n\nconst extrudeLinearGeom2 = require('./extrudeLinearGeom2')\n\n/*\n * Extrude the given geometry using the given options.\n *\n * @param {Object} [options] - options for extrude\n * @param {Array} [options.offset] - the direction of the extrusion as a 3D vector\n * @param {Number} [options.twistAngle] - the final rotation (RADIANS) about the origin\n * @param {Integer} [options.twistSteps] - the number of steps created to produce the twist (if any)\n * @param {path2} geometry - the geometry to extrude\n * @returns {geom3} the extruded 3D geometry\n*/\nconst extrudePath2 = (options, geometry) => {\n  if (!geometry.isClosed) throw new Error('extruded path must be closed')\n  // Convert path2 to geom2\n  const points = path2.toPoints(geometry)\n  const geometry2 = geom2.fromPoints(points)\n  return extrudeLinearGeom2(options, geometry2)\n}\n\nmodule.exports = extrudePath2\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\nconst path2 = require('../../geometries/path2')\n\nconst extrudeRectangularPath2 = require('./extrudeRectangularPath2')\nconst extrudeRectangularGeom2 = require('./extrudeRectangularGeom2')\n\n/**\n * Extrude the given geometry by following the outline(s) with a rectangle.\n * @See expand for addition options\n * @param {Object} options - options for extrusion, if any\n * @param {Number} [options.size=1] - size of the rectangle\n * @param {Number} [options.height=1] - height of the extrusion\n * @param {...Object} objects - the geometries to extrude\n * @return {Object|Array} the extruded object, or a list of extruded objects\n * @alias module:modeling/extrusions.extrudeRectangular\n *\n * @example\n * let mywalls = extrudeRectangular({size: 1, height: 3}, square({size: 20}))\n * let mywalls = extrudeRectangular({size: 1, height: 300, twistAngle: TAU / 2}, square({size: 20}))\n */\nconst extrudeRectangular = (options, ...objects) => {\n  const defaults = {\n    size: 1,\n    height: 1\n  }\n  const { size, height } = Object.assign({}, defaults, options)\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  if (size <= 0) throw new Error('size must be positive')\n  if (height <= 0) throw new Error('height must be positive')\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return extrudeRectangularPath2(options, object)\n    if (geom2.isA(object)) return extrudeRectangularGeom2(options, object)\n    // if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = extrudeRectangular\n","const { area } = require('../../maths/utils')\n\nconst geom2 = require('../../geometries/geom2')\nconst path2 = require('../../geometries/path2')\n\nconst expand = require('../expansions/expand')\n\nconst extrudeLinearGeom2 = require('./extrudeLinearGeom2')\n\n/*\n * Expand and extrude the given geometry (geom2).\n * @see expand for additional options\n * @param {Object} options - options for extrusion, if any\n * @param {Number} [options.size=1] - size of the rectangle\n * @param {Number} [options.height=1] - height of the extrusion\n * @param {geom2} geometry - the geometry to extrude\n * @return {geom3} the extruded geometry\n */\nconst extrudeRectangularGeom2 = (options, geometry) => {\n  const defaults = {\n    size: 1,\n    height: 1\n  }\n  const { size, height } = Object.assign({ }, defaults, options)\n\n  options.delta = size\n  options.offset = [0, 0, height]\n\n  // convert the geometry to outlines\n  const outlines = geom2.toOutlines(geometry)\n  if (outlines.length === 0) throw new Error('the given geometry cannot be empty')\n\n  // expand the outlines\n  const newparts = outlines.map((outline) => {\n    if (area(outline) < 0) outline.reverse() // all outlines must wind counter clockwise\n    return expand(options, path2.fromPoints({ closed: true }, outline))\n  })\n\n  // create a composite geometry\n  const allsides = newparts.reduce((sides, part) => sides.concat(geom2.toSides(part)), [])\n  const newgeometry = geom2.create(allsides)\n\n  return extrudeLinearGeom2(options, newgeometry)\n}\n\nmodule.exports = extrudeRectangularGeom2\n","const path2 = require('../../geometries/path2')\n\nconst expand = require('../expansions/expand')\n\nconst extrudeLinearGeom2 = require('./extrudeLinearGeom2')\n\n/*\n * Expand and extrude the given geometry (path2).\n * @See expand for addition options\n * @param {Object} options - options for extrusion, if any\n * @param {Number} [options.size=1] - size of the rectangle\n * @param {Number} [options.height=1] - height of the extrusion\n * @param {path2} geometry - the geometry to extrude\n * @return {geom3} the extruded geometry\n */\nconst extrudeRectangularPath2 = (options, geometry) => {\n  const defaults = {\n    size: 1,\n    height: 1\n  }\n  const { size, height } = Object.assign({ }, defaults, options)\n\n  options.delta = size\n  options.offset = [0, 0, height]\n\n  const points = path2.toPoints(geometry)\n  if (points.length === 0) throw new Error('the given geometry cannot be empty')\n\n  const newgeometry = expand(options, geometry)\n  return extrudeLinearGeom2(options, newgeometry)\n}\n\nmodule.exports = extrudeRectangularPath2\n","const { TAU } = require('../../maths/constants')\nconst mat4 = require('../../maths/mat4')\n\nconst { mirrorX } = require('../transforms/mirror')\n\nconst geom2 = require('../../geometries/geom2')\n\nconst slice = require('./slice')\n\nconst extrudeFromSlices = require('./extrudeFromSlices')\n\n/**\n * Rotate extrude the given geometry using the given options.\n *\n * @param {Object} options - options for extrusion\n * @param {Number} [options.angle=TAU] - angle of the extrusion (RADIANS)\n * @param {Number} [options.startAngle=0] - start angle of the extrusion (RADIANS)\n * @param {String} [options.overflow='cap'] - what to do with points outside of bounds (+ / - x) :\n * defaults to capping those points to 0 (only supported behaviour for now)\n * @param {Number} [options.segments=12] - number of segments of the extrusion\n * @param {geom2} geometry - the geometry to extrude\n * @returns {geom3} the extruded geometry\n * @alias module:modeling/extrusions.extrudeRotate\n *\n * @example\n * const myshape = extrudeRotate({segments: 8, angle: TAU / 2}, circle({size: 3, center: [4, 0]}))\n */\nconst extrudeRotate = (options, geometry) => {\n  const defaults = {\n    segments: 12,\n    startAngle: 0,\n    angle: TAU,\n    overflow: 'cap'\n  }\n  let { segments, startAngle, angle, overflow } = Object.assign({}, defaults, options)\n\n  if (segments < 3) throw new Error('segments must be greater then 3')\n\n  startAngle = Math.abs(startAngle) > TAU ? startAngle % TAU : startAngle\n  angle = Math.abs(angle) > TAU ? angle % TAU : angle\n\n  let endAngle = startAngle + angle\n  endAngle = Math.abs(endAngle) > TAU ? endAngle % TAU : endAngle\n\n  if (endAngle < startAngle) {\n    const x = startAngle\n    startAngle = endAngle\n    endAngle = x\n  }\n  let totalRotation = endAngle - startAngle\n  if (totalRotation <= 0.0) totalRotation = TAU\n\n  if (Math.abs(totalRotation) < TAU) {\n    // adjust the segments to achieve the total rotation requested\n    const anglePerSegment = TAU / segments\n    segments = Math.floor(Math.abs(totalRotation) / anglePerSegment)\n    if (Math.abs(totalRotation) > (segments * anglePerSegment)) segments++\n  }\n\n  // console.log('startAngle: '+startAngle)\n  // console.log('endAngle: '+endAngle)\n  // console.log(totalRotation)\n  // console.log(segments)\n\n  // convert geometry to an array of sides, easier to deal with\n  let shapeSides = geom2.toSides(geometry)\n  if (shapeSides.length === 0) throw new Error('the given geometry cannot be empty')\n\n  // determine if the rotate extrude can be computed in the first place\n  // ie all the points have to be either x > 0 or x < 0\n\n  // generic solution to always have a valid solid, even if points go beyond x/ -x\n  // 1. split points up between all those on the 'left' side of the axis (x<0) & those on the 'righ' (x>0)\n  // 2. for each set of points do the extrusion operation IN OPOSITE DIRECTIONS\n  // 3. union the two resulting solids\n\n  // 1. alt : OR : just cap of points at the axis ?\n\n  const pointsWithNegativeX = shapeSides.filter((s) => (s[0][0] < 0))\n  const pointsWithPositiveX = shapeSides.filter((s) => (s[0][0] >= 0))\n  const arePointsWithNegAndPosX = pointsWithNegativeX.length > 0 && pointsWithPositiveX.length > 0\n\n  // FIXME actually there are cases where setting X=0 will change the basic shape\n  // - Alternative #1 : don't allow shapes with both negative and positive X values\n  // - Alternative #2 : remove one half of the shape (costly)\n  if (arePointsWithNegAndPosX && overflow === 'cap') {\n    if (pointsWithNegativeX.length > pointsWithPositiveX.length) {\n      shapeSides = shapeSides.map((side) => {\n        let point0 = side[0]\n        let point1 = side[1]\n        point0 = [Math.min(point0[0], 0), point0[1]]\n        point1 = [Math.min(point1[0], 0), point1[1]]\n        return [point0, point1]\n      })\n      // recreate the geometry from the (-) capped points\n      geometry = geom2.reverse(geom2.create(shapeSides))\n      geometry = mirrorX(geometry)\n    } else if (pointsWithPositiveX.length >= pointsWithNegativeX.length) {\n      shapeSides = shapeSides.map((side) => {\n        let point0 = side[0]\n        let point1 = side[1]\n        point0 = [Math.max(point0[0], 0), point0[1]]\n        point1 = [Math.max(point1[0], 0), point1[1]]\n        return [point0, point1]\n      })\n      // recreate the geometry from the (+) capped points\n      geometry = geom2.create(shapeSides)\n    }\n  }\n\n  const rotationPerSlice = totalRotation / segments\n  const isCapped = Math.abs(totalRotation) < TAU\n  const baseSlice = slice.fromSides(geom2.toSides(geometry))\n  slice.reverse(baseSlice, baseSlice)\n\n  const matrix = mat4.create()\n  const createSlice = (progress, index, base) => {\n    let Zrotation = rotationPerSlice * index + startAngle\n    // fix rounding error when rotating TAU radians\n    if (totalRotation === TAU && index === segments) {\n      Zrotation = startAngle\n    }\n    mat4.multiply(matrix, mat4.fromZRotation(matrix, Zrotation), mat4.fromXRotation(mat4.create(), TAU / 4))\n\n    return slice.transform(matrix, base)\n  }\n\n  options = {\n    numberOfSlices: segments + 1,\n    capStart: isCapped,\n    capEnd: isCapped,\n    close: !isCapped,\n    callback: createSlice\n  }\n  return extrudeFromSlices(options, baseSlice)\n}\n\nmodule.exports = extrudeRotate\n","const { EPS } = require('../../maths/constants')\nconst vec3 = require('../../maths/vec3')\n\nconst poly3 = require('../../geometries/poly3')\n\nconst slice = require('./slice')\n\n// https://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid's_algorithm\nconst gcd = (a, b) => {\n  if (a === b) { return a }\n  if (a < b) { return gcd(b, a) }\n  if (b === 1) { return 1 }\n  if (b === 0) { return a }\n  return gcd(b, a % b)\n}\n\nconst lcm = (a, b) => (a * b) / gcd(a, b)\n\n// Return a set of edges that encloses the same area by splitting\n// the given edges to have newlength total edges.\nconst repartitionEdges = (newlength, edges) => {\n  // NOTE: This implementation splits each edge evenly.\n  const multiple = newlength / edges.length\n  if (multiple === 1) {\n    return edges\n  }\n\n  const divisor = vec3.fromValues(multiple, multiple, multiple)\n\n  const newEdges = []\n  edges.forEach((edge) => {\n    const increment = vec3.subtract(vec3.create(), edge[1], edge[0])\n    vec3.divide(increment, increment, divisor)\n\n    // repartition the edge\n    let prev = edge[0]\n    for (let i = 1; i <= multiple; ++i) {\n      const next = vec3.add(vec3.create(), prev, increment)\n      newEdges.push([prev, next])\n      prev = next\n    }\n  })\n  return newEdges\n}\n\nconst EPSAREA = (EPS * EPS / 2) * Math.sin(Math.PI / 3)\n\n/*\n * Extrude (build) walls between the given slices.\n * Each wall consists of two triangles, which may be invalid if slices are overlapping.\n */\nconst extrudeWalls = (slice0, slice1) => {\n  let edges0 = slice.toEdges(slice0)\n  let edges1 = slice.toEdges(slice1)\n\n  if (edges0.length !== edges1.length) {\n    // different shapes, so adjust one or both to the same number of edges\n    const newlength = lcm(edges0.length, edges1.length)\n    if (newlength !== edges0.length) edges0 = repartitionEdges(newlength, edges0)\n    if (newlength !== edges1.length) edges1 = repartitionEdges(newlength, edges1)\n  }\n\n  const walls = []\n  edges0.forEach((edge0, i) => {\n    const edge1 = edges1[i]\n\n    const poly0 = poly3.create([edge0[0], edge0[1], edge1[1]])\n    const poly0area = poly3.measureArea(poly0)\n    if (Number.isFinite(poly0area) && poly0area > EPSAREA) walls.push(poly0)\n\n    const poly1 = poly3.create([edge0[0], edge1[1], edge1[0]])\n    const poly1area = poly3.measureArea(poly1)\n    if (Number.isFinite(poly1area) && poly1area > EPSAREA) walls.push(poly1)\n  })\n  return walls\n}\n\nmodule.exports = extrudeWalls\n","/**\n * All 2D shapes (primitives or the results of operations) can be extruded in various ways.\n * In all cases, the function returns the results, and never changes the original shapes.\n * @module modeling/extrusions\n * @example\n * const { extrudeLinear, extrudeRectangular, extrudeRotate } = require('@jscad/modeling').extrusions\n */\nmodule.exports = {\n  extrudeFromSlices: require('./extrudeFromSlices'),\n  extrudeLinear: require('./extrudeLinear'),\n  extrudeRectangular: require('./extrudeRectangular'),\n  extrudeRotate: require('./extrudeRotate'),\n  extrudeHelical: require('./extrudeHelical'),\n  project: require('./project'),\n  slice: require('./slice')\n}\n","const flatten = require('../../utils/flatten')\n\nconst aboutEqualNormals = require('../../maths/utils/aboutEqualNormals')\nconst plane = require('../../maths/plane')\nconst mat4 = require('../../maths/mat4')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst unionGeom2 = require('../booleans/unionGeom2')\n\nconst projectGeom3 = (options, geometry) => {\n  // create a plane from the options, and verify\n  const projplane = plane.fromNormalAndPoint(plane.create(), options.axis, options.origin)\n  if (Number.isNaN(projplane[0]) || Number.isNaN(projplane[1]) || Number.isNaN(projplane[2]) || Number.isNaN(projplane[3])) {\n    throw new Error('project: invalid axis or origin')\n  }\n\n  const epsilon = measureEpsilon(geometry)\n  const epsilonArea = (epsilon * epsilon * Math.sqrt(3) / 4)\n\n  if (epsilon === 0) return geom2.create()\n\n  // project the polygons to the plane\n  const polygons = geom3.toPolygons(geometry)\n  let projpolys = []\n  for (let i = 0; i < polygons.length; i++) {\n    const newpoints = polygons[i].vertices.map((v) => plane.projectionOfPoint(projplane, v))\n    const newpoly = poly3.create(newpoints)\n    // only keep projections that face the same direction as the plane\n    const newplane = poly3.plane(newpoly)\n    if (!aboutEqualNormals(projplane, newplane)) continue\n    // only keep projections that have a measurable area\n    if (poly3.measureArea(newpoly) < epsilonArea) continue\n    projpolys.push(newpoly)\n  }\n\n  // rotate the polygons to lay on X/Y axes if necessary\n  if (!aboutEqualNormals(projplane, [0, 0, 1])) {\n    const rotation = mat4.fromVectorRotation(mat4.create(), projplane, [0, 0, 1])\n    projpolys = projpolys.map((p) => poly3.transform(rotation, p))\n  }\n\n  // sort the polygons to allow the union to ignore small pieces efficiently\n  projpolys = projpolys.sort((a, b) => poly3.measureArea(b) - poly3.measureArea(a))\n\n  // convert polygons to geometry, and union all pieces into a single geometry\n  const projgeoms = projpolys.map((p) => geom2.fromPoints(p.vertices))\n  return unionGeom2(projgeoms)\n}\n\n/**\n * Project the given 3D geometry on to the given plane.\n * @param {Object} options - options for project\n * @param {Array} [options.axis=[0,0,1]] the axis of the plane (default is Z axis)\n * @param {Array} [options.origin=[0,0,0]] the origin of the plane\n * @param {...Object} objects - the list of 3D geometry to project\n * @return {geom2|Array} the projected 2D geometry, or a list of 2D projected geometry\n * @alias module:modeling/extrusions.project\n *\n * @example\n * let myshape = project({}, sphere({radius: 20, segments: 5}))\n */\nconst project = (options, ...objects) => {\n  const defaults = {\n    axis: [0, 0, 1], // Z axis\n    origin: [0, 0, 0]\n  }\n  const { axis, origin } = Object.assign({ }, defaults, options)\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  options = { axis, origin }\n\n  const results = objects.map((object) => {\n    // if (path.isA(object)) return project(options, object)\n    // if (geom2.isA(object)) return project(options, object)\n    if (geom3.isA(object)) return projectGeom3(options, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = project\n","const plane = require('../../../maths/plane')\nconst vec3 = require('../../../maths/vec3')\n\n/**\n * Calculate the plane of the given slice.\n * NOTE: The slice (and all points) are assumed to be planar from the beginning.\n * @param {slice} slice - the slice\n * @returns {plane} the plane of the slice\n * @alias module:modeling/extrusions/slice.calculatePlane\n *\n * @example\n * let myplane = calculatePlane(slice)\n */\nconst calculatePlane = (slice) => {\n  const edges = slice.edges\n  if (edges.length < 3) throw new Error('slices must have 3 or more edges to calculate a plane')\n\n  // find the midpoint of the slice, which will lie on the plane by definition\n  const midpoint = edges.reduce((point, edge) => vec3.add(vec3.create(), point, edge[0]), vec3.create())\n  vec3.scale(midpoint, midpoint, 1 / edges.length)\n\n  // find the farthest edge from the midpoint, which will be on an outside edge\n  let farthestEdge\n  let distance = 0\n  edges.forEach((edge) => {\n    // Make sure that the farthest edge is not a self-edge\n    if (!vec3.equals(edge[0], edge[1])) {\n      const d = vec3.squaredDistance(midpoint, edge[0])\n      if (d > distance) {\n        farthestEdge = edge\n        distance = d\n      }\n    }\n  })\n  // find the before edge\n  const beforeEdge = edges.find((edge) => vec3.equals(edge[1], farthestEdge[0]))\n\n  return plane.fromPoints(plane.create(), beforeEdge[0], farthestEdge[0], farthestEdge[1])\n}\n\nmodule.exports = calculatePlane\n","const create = require('./create')\n\nconst vec3 = require('../../../maths/vec3')\n\n/**\n * Create a deep clone of the given slice.\n *\n * @param {slice} [out] - receiving slice\n * @param {slice} slice - slice to clone\n * @returns {slice} a new slice\n * @alias module:modeling/extrusions/slice.clone\n */\nconst clone = (...params) => {\n  let out\n  let slice\n  if (params.length === 1) {\n    out = create()\n    slice = params[0]\n  } else {\n    out = params[0]\n    slice = params[1]\n  }\n  // deep clone of edges\n  out.edges = slice.edges.map((edge) => [vec3.clone(edge[0]), vec3.clone(edge[1])])\n  return out\n}\n\nmodule.exports = clone\n","/**\n * Represents a 3D geometry consisting of a list of edges.\n * @typedef {Object} slice\n * @property {Array} edges - list of edges, each edge containing two points (3D)\n */\n\n/**\n * Creates a new empty slice.\n *\n * @returns {slice} a new slice\n * @alias module:modeling/extrusions/slice.create\n */\nconst create = (edges) => {\n  if (!edges) {\n    edges = []\n  }\n  return { edges }\n}\n\nmodule.exports = create\n","const vec3 = require('../../../maths/vec3')\n\n/**\n * Determine if the given slices have the same edges.\n * @param {slice} a - the first slice to compare\n * @param {slice} b - the second slice to compare\n * @returns {Boolean} true if the slices are equal\n * @alias module:modeling/extrusions/slice.equals\n */\nconst equals = (a, b) => {\n  const aedges = a.edges\n  const bedges = b.edges\n\n  if (aedges.length !== bedges.length) {\n    return false\n  }\n\n  const isEqual = aedges.reduce((acc, aedge, i) => {\n    const bedge = bedges[i]\n    const d = vec3.squaredDistance(aedge[0], bedge[0])\n    return acc && (d < Number.EPSILON)\n  }, true)\n\n  return isEqual\n}\n\nmodule.exports = equals\n","const vec3 = require('../../../maths/vec3')\n\nconst create = require('./create')\n\n/**\n * Create a slice from the given points.\n *\n * @param {Array} points - list of points, where each point is either 2D or 3D\n * @returns {slice} a new slice\n * @alias module:modeling/extrusions/slice.fromPoints\n *\n * @example\n * const points = [\n *   [0,  0],\n *   [0, 10],\n *   [0, 10]\n * ]\n * const slice = fromPoints(points)\n */\nconst fromPoints = (points) => {\n  if (!Array.isArray(points)) throw new Error('the given points must be an array')\n  if (points.length < 3) throw new Error('the given points must contain THREE or more points')\n\n  // create a list of edges from the points\n  const edges = []\n  let prevpoint = points[points.length - 1]\n  points.forEach((point) => {\n    if (point.length === 2) edges.push([vec3.fromVec2(vec3.create(), prevpoint), vec3.fromVec2(vec3.create(), point)])\n    if (point.length === 3) edges.push([prevpoint, point])\n    prevpoint = point\n  })\n  return create(edges)\n}\n\nmodule.exports = fromPoints\n","const vec3 = require('../../../maths/vec3')\n\nconst create = require('./create')\n\n/**\n * Create a slice from the given sides (see geom2).\n *\n * @param {Array} sides - list of sides from geom2\n * @returns {slice} a new slice\n * @alias module:modeling/extrusions/slice.fromSides\n *\n * @example\n * const myshape = circle({radius: 10})\n * const slice = fromSides(geom2.toSides(myshape))\n */\nconst fromSides = (sides) => {\n  if (!Array.isArray(sides)) throw new Error('the given sides must be an array')\n\n  // create a list of edges from the sides\n  const edges = []\n  sides.forEach((side) => {\n    edges.push([vec3.fromVec2(vec3.create(), side[0]), vec3.fromVec2(vec3.create(), side[1])])\n  })\n  return create(edges)\n}\n\nmodule.exports = fromSides\n","/**\n * Represents a 3D geometry consisting of a list of edges.\n * @see {@link slice} for data structure information.\n * @module modeling/extrusions/slice\n */\nmodule.exports = {\n  calculatePlane: require('./calculatePlane'),\n  clone: require('./clone'),\n  create: require('./create'),\n  equals: require('./equals'),\n  fromPoints: require('./fromPoints'),\n  fromSides: require('./fromSides'),\n  isA: require('./isA'),\n  reverse: require('./reverse'),\n  toEdges: require('./toEdges'),\n  toPolygons: require('./toPolygons'),\n  toString: require('./toString'),\n  transform: require('./transform')\n}\n","/**\n * Determine if the given object is a slice.\n * @param {slice} object - the object to interrogate\n * @returns {Boolean} true if the object matches a slice\n * @alias module:modeling/extrusions/slice.isA\n */\nconst isA = (object) => {\n  if (object && typeof object === 'object') {\n    if ('edges' in object) {\n      if (Array.isArray(object.edges)) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nmodule.exports = isA\n","const vec3 = require('../../../maths/vec3')\nconst create = require('./create')\n\n/*\n * Mend gaps in a 2D slice to make it a closed polygon\n */\nconst repair = (slice) => {\n  if (!slice.edges) return slice\n  let edges = slice.edges\n  const vertexMap = new Map() // string key to vertex map\n  const edgeCount = new Map() // count of (in - out) edges\n\n  // Remove self-edges\n  edges = edges.filter((e) => !vec3.equals(e[0], e[1]))\n\n  // build vertex and edge count maps\n  edges.forEach((edge) => {\n    const inKey = edge[0].toString()\n    const outKey = edge[1].toString()\n    vertexMap.set(inKey, edge[0])\n    vertexMap.set(outKey, edge[1])\n    edgeCount.set(inKey, (edgeCount.get(inKey) || 0) + 1) // in\n    edgeCount.set(outKey, (edgeCount.get(outKey) || 0) - 1) // out\n  })\n\n  // find vertices which are missing in or out edges\n  const missingIn = []\n  const missingOut = []\n  edgeCount.forEach((count, vertex) => {\n    if (count < 0) missingIn.push(vertex)\n    if (count > 0) missingOut.push(vertex)\n  })\n\n  // pairwise distance of bad vertices\n  missingIn.forEach((key1) => {\n    const v1 = vertexMap.get(key1)\n\n    // find the closest vertex that is missing an out edge\n    let bestDistance = Infinity\n    let bestReplacement\n    missingOut.forEach((key2) => {\n      const v2 = vertexMap.get(key2)\n      const distance = vec3.distance(v1, v2)\n      if (distance < bestDistance) {\n        bestDistance = distance\n        bestReplacement = v2\n      }\n    })\n    console.warn(`slice.repair: repairing vertex gap ${v1} to ${bestReplacement} distance ${bestDistance}`)\n\n    // merge broken vertices\n    edges = edges.map((edge) => {\n      if (edge[0].toString() === key1) return [bestReplacement, edge[1]]\n      if (edge[1].toString() === key1) return [edge[0], bestReplacement]\n      return edge\n    })\n  })\n\n  return create(edges)\n}\n\nmodule.exports = repair\n","const create = require('./create')\n\n/**\n * Reverse the edges of the given slice.\n *\n * @param {slice} [out] - receiving slice\n * @param {slice} slice - slice to reverse\n * @returns {slice} reverse of the slice\n * @alias module:modeling/extrusions/slice.reverse\n */\nconst reverse = (...params) => {\n  let out\n  let slice\n  if (params.length === 1) {\n    out = create()\n    slice = params[0]\n  } else {\n    out = params[0]\n    slice = params[1]\n  }\n  // reverse the edges\n  out.edges = slice.edges.map((edge) => [edge[1], edge[0]])\n  return out\n}\n\nmodule.exports = reverse\n","/**\n * Produces an array of edges from the given slice.\n * The returned array should not be modified as the data is shared with the slice.\n * @param {slice} slice - the slice\n * @returns {Array} an array of edges, each edge contains an array of two points (3D)\n * @alias module:modeling/extrusions/slice.toEdges\n *\n * @example\n * let sharededges = toEdges(slice)\n */\nconst toEdges = (slice) => slice.edges\n\nmodule.exports = toEdges\n","const poly3 = require('../../../geometries/poly3')\nconst earcut = require('../earcut')\nconst PolygonHierarchy = require('../earcut/polygonHierarchy')\n\n/**\n * Return a list of polygons which are enclosed by the slice.\n * @param {slice} slice - the slice\n * @return {Array} a list of polygons (3D)\n * @alias module:modeling/extrusions/slice.toPolygons\n */\nconst toPolygons = (slice) => {\n  const hierarchy = new PolygonHierarchy(slice)\n\n  const polygons = []\n  hierarchy.roots.forEach(({ solid, holes }) => {\n    // hole indices\n    let index = solid.length\n    const holesIndex = []\n    holes.forEach((hole, i) => {\n      holesIndex.push(index)\n      index += hole.length\n    })\n\n    // compute earcut triangulation for each solid\n    const vertices = [solid, ...holes].flat()\n    const data = vertices.flat()\n    // Get original 3D vertex by index\n    const getVertex = (i) => hierarchy.to3D(vertices[i])\n    const indices = earcut(data, holesIndex)\n    for (let i = 0; i < indices.length; i += 3) {\n      // Map back to original vertices\n      const tri = indices.slice(i, i + 3).map(getVertex)\n      polygons.push(poly3.fromPointsAndPlane(tri, hierarchy.plane))\n    }\n  })\n\n  return polygons\n}\n\nmodule.exports = toPolygons\n","const vec3 = require('../../../maths/vec3')\n\nconst edgesToString = (edges) =>\n  edges.reduce((result, edge) => (\n    result += `[${vec3.toString(edge[0])}, ${vec3.toString(edge[1])}], `\n  ), '')\n\n/**\n * @param {slice} slice - the slice\n * @return {String} the string representation\n * @alias module:modeling/extrusions/slice.toString\n */\nconst toString = (slice) => `[${edgesToString(slice.edges)}]`\n\nmodule.exports = toString\n","const vec3 = require('../../../maths/vec3')\n\nconst create = require('./create')\n\n/**\n * Transform the given slice using the given matrix.\n * @param {mat4} matrix - transform matrix\n * @param {slice} slice - slice to transform\n * @returns {slice} the transformed slice\n * @alias module:modeling/extrusions/slice.transform\n *\n * @example\n * let matrix = mat4.fromTranslation([1, 2, 3])\n * let newslice = transform(matrix, oldslice)\n */\nconst transform = (matrix, slice) => {\n  const edges = slice.edges.map((edge) => [vec3.transform(vec3.create(), edge[0], matrix), vec3.transform(vec3.create(), edge[1], matrix)])\n  return create(edges)\n}\n\nmodule.exports = transform\n","const flatten = require('../../utils/flatten')\nconst areAllShapesTheSameType = require('../../utils/areAllShapesTheSameType')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\nconst hullPath2 = require('./hullPath2')\nconst hullGeom2 = require('./hullGeom2')\nconst hullGeom3 = require('./hullGeom3')\n\n/**\n * Create a convex hull of the given geometries.\n * The given geometries should be of the same type, either geom2 or geom3 or path2.\n * @param {...Objects} geometries - list of geometries from which to create a hull\n * @returns {geom2|geom3} new geometry\n * @alias module:modeling/hulls.hull\n *\n * @example\n * let myshape = hull(rectangle({center: [-5,-5]}), ellipse({center: [5,5]}))\n *\n * @example\n * +-------+           +-------+\n * |       |           |        \\\n * |   A   |           |         \\\n * |       |           |          \\\n * +-------+           +           \\\n *                  =   \\           \\\n *       +-------+       \\           +\n *       |       |        \\          |\n *       |   B   |         \\         |\n *       |       |          \\        |\n *       +-------+           +-------+\n */\nconst hull = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  if (!areAllShapesTheSameType(geometries)) {\n    throw new Error('only hulls of the same type are supported')\n  }\n\n  const geometry = geometries[0]\n  if (path2.isA(geometry)) return hullPath2(geometries)\n  if (geom2.isA(geometry)) return hullGeom2(geometries)\n  if (geom3.isA(geometry)) return hullGeom3(geometries)\n\n  // FIXME should this throw an error for unknown geometries?\n  return geometry\n}\n\nmodule.exports = hull\n","const flatten = require('../../utils/flatten')\n\nconst union = require('../booleans/union')\n\nconst hull = require('./hull')\n\n/**\n * Create a chain of hulled geometries from the given geometries.\n * Essentially hull A+B, B+C, C+D, etc., then union the results.\n * The given geometries should be of the same type, either geom2 or geom3 or path2.\n *\n * @param {...Objects} geometries - list of geometries from which to create a hull\n * @returns {geom2|geom3} new geometry\n * @alias module:modeling/hulls.hullChain\n *\n * @example\n * let newshape = hullChain(rectangle({center: [-5,-5]}), circle({center: [0,0]}), rectangle({center: [5,5]}))\n *\n * @example\n * +-------+   +-------+     +-------+   +------+\n * |       |   |       |     |        \\ /       |\n * |   A   |   |   C   |     |         |        |\n * |       |   |       |     |                  |\n * +-------+   +-------+     +                  +\n *                       =   \\                 /\n *       +-------+            \\               /\n *       |       |             \\             /\n *       |   B   |              \\           /\n *       |       |               \\         /\n *       +-------+                +-------+\n */\nconst hullChain = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length < 2) throw new Error('wrong number of arguments')\n\n  const hulls = []\n  for (let i = 1; i < geometries.length; i++) {\n    hulls.push(hull(geometries[i - 1], geometries[i]))\n  }\n  return union(hulls)\n}\n\nmodule.exports = hullChain\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\n\nconst hullPoints2 = require('./hullPoints2')\nconst toUniquePoints = require('./toUniquePoints')\n\n/*\n * Create a convex hull of the given geom2 geometries.\n * @param {...geometries} geometries - list of geom2 geometries\n * @returns {geom2} new geometry\n */\nconst hullGeom2 = (...geometries) => {\n  geometries = flatten(geometries)\n\n  // extract the unique points from the geometries\n  const unique = toUniquePoints(geometries)\n\n  const hullPoints = hullPoints2(unique)\n\n  // NOTE: more than three points are required to create a new geometry\n  if (hullPoints.length < 3) return geom2.create()\n\n  // assemble a new geometry from the list of points\n  return geom2.fromPoints(hullPoints)\n}\n\nmodule.exports = hullGeom2\n","const flatten = require('../../utils/flatten')\n\nconst geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\nconst quickhull = require('./quickhull')\nconst toUniquePoints = require('./toUniquePoints')\n\n/*\n * Create a convex hull of the given geometries (geom3).\n * @param {...geometries} geometries - list of geom3 geometries\n * @returns {geom3} new geometry\n */\nconst hullGeom3 = (...geometries) => {\n  geometries = flatten(geometries)\n\n  if (geometries.length === 1) return geometries[0]\n\n  // extract the unique vertices from the geometries\n  const unique = toUniquePoints(geometries)\n\n  const faces = quickhull(unique, { skipTriangulation: true })\n\n  const polygons = faces.map((face) => {\n    const vertices = face.map((index) => unique[index])\n    return poly3.create(vertices)\n  })\n\n  return geom3.create(polygons)\n}\n\nmodule.exports = hullGeom3\n","const flatten = require('../../utils/flatten')\n\nconst path2 = require('../../geometries/path2')\n\nconst hullPoints2 = require('./hullPoints2')\nconst toUniquePoints = require('./toUniquePoints')\n\n/*\n * Create a convex hull of the given geometries (path2).\n * @param {...geometries} geometries - list of path2 geometries\n * @returns {path2} new geometry\n */\nconst hullPath2 = (...geometries) => {\n  geometries = flatten(geometries)\n\n  // extract the unique points from the geometries\n  const unique = toUniquePoints(geometries)\n\n  const hullPoints = hullPoints2(unique)\n\n  // assemble a new geometry from the list of points\n  return path2.fromPoints({ closed: true }, hullPoints)\n}\n\nmodule.exports = hullPath2\n","const vec2 = require('../../maths/vec2')\n\n/*\n * Create a convex hull of the given set of points, where each point is an array of [x,y].\n * Uses https://en.wikipedia.org/wiki/Graham_scan\n * @param {Array} uniquePoints - list of UNIQUE points from which to create a hull\n * @returns {Array} a list of points that form the hull\n */\nconst hullPoints2 = (uniquePoints) => {\n  // find min point\n  let min = vec2.fromValues(Infinity, Infinity)\n  uniquePoints.forEach((point) => {\n    if (point[1] < min[1] || (point[1] === min[1] && point[0] < min[0])) {\n      min = point\n    }\n  })\n\n  // gather information for sorting by polar coordinates (point, angle, distSq)\n  const points = []\n  uniquePoints.forEach((point) => {\n    // use faster fakeAtan2 instead of Math.atan2\n    const angle = fakeAtan2(point[1] - min[1], point[0] - min[0])\n    const distSq = vec2.squaredDistance(point, min)\n    points.push({ point, angle, distSq })\n  })\n\n  // sort by polar coordinates\n  points.sort((pt1, pt2) => pt1.angle < pt2.angle ? -1 : pt1.angle > pt2.angle ? 1 :\n    pt1.distSq < pt2.distSq ? -1 : pt1.distSq > pt2.distSq ? 1 : 0)\n\n  const stack = [] // start with empty stack\n  points.forEach((point) => {\n    let cnt = stack.length\n    while (cnt > 1 && ccw(stack[cnt - 2], stack[cnt - 1], point.point) <= Number.EPSILON) {\n      stack.pop() // get rid of colinear and interior (clockwise) points\n      cnt = stack.length\n    }\n    stack.push(point.point)\n  })\n\n  return stack\n}\n\n// returns: < 0 clockwise, 0 colinear, > 0 counter-clockwise\nconst ccw = (v1, v2, v3) => (v2[0] - v1[0]) * (v3[1] - v1[1]) - (v2[1] - v1[1]) * (v3[0] - v1[0])\n\n// Returned \"angle\" is really 1/tan (inverse of slope) made negative to increase with angle.\n// This function is strictly for sorting in this algorithm.\nconst fakeAtan2 = (y, x) => {\n  // The \"if\" is a special case for when the minimum vector found in loop above is present.\n  // We need to ensure that it sorts as the minimum point. Otherwise, this becomes NaN.\n  if (y === 0 && x === 0) {\n    return -Infinity\n  } else {\n    return -x / y\n  }\n}\n\nmodule.exports = hullPoints2\n","/**\n * All shapes (primitives or the results of operations) can be passed to hull functions\n * to determine the convex hull of all points.\n * In all cases, the function returns the results, and never changes the original shapes.\n * @module modeling/hulls\n * @example\n * const { hull, hullChain } = require('@jscad/modeling').hulls\n */\nmodule.exports = {\n  hull: require('./hull'),\n  hullChain: require('./hullChain')\n}\n","const add = require('../../../maths/vec3/add')\nconst copy = require('../../../maths/vec3/copy')\nconst cross = require('../../../maths/vec3/cross')\nconst dot = require('../../../maths/vec3/dot')\nconst length = require('../../../maths/vec3/length')\nconst normalize = require('../../../maths/vec3/normalize')\nconst scale = require('../../../maths/vec3/scale')\nconst subtract = require('../../../maths/vec3/subtract')\n\n/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nconst HalfEdge = require('./HalfEdge')\n\nconst VISIBLE = 0\nconst NON_CONVEX = 1\nconst DELETED = 2\n\nclass Face {\n  constructor () {\n    this.normal = []\n    this.centroid = []\n    // signed distance from face to the origin\n    this.offset = 0\n    // pointer to the a vertex in a double linked list this face can see\n    this.outside = null\n    this.mark = VISIBLE\n    this.edge = null\n    this.nVertices = 0\n  }\n\n  getEdge (i) {\n    if (typeof i !== 'number') {\n      throw Error('requires a number')\n    }\n    let it = this.edge\n    while (i > 0) {\n      it = it.next\n      i -= 1\n    }\n    while (i < 0) {\n      it = it.prev\n      i += 1\n    }\n    return it\n  }\n\n  computeNormal () {\n    const e0 = this.edge\n    const e1 = e0.next\n    let e2 = e1.next\n    const v2 = subtract([], e1.head().point, e0.head().point)\n    const t = []\n    const v1 = []\n\n    this.nVertices = 2\n    this.normal = [0, 0, 0]\n    while (e2 !== e0) {\n      copy(v1, v2)\n      subtract(v2, e2.head().point, e0.head().point)\n      add(this.normal, this.normal, cross(t, v1, v2))\n      e2 = e2.next\n      this.nVertices += 1\n    }\n    this.area = length(this.normal)\n    // normalize the vector, since we've already calculated the area\n    // it's cheaper to scale the vector using this quantity instead of\n    // doing the same operation again\n    this.normal = scale(this.normal, this.normal, 1 / this.area)\n  }\n\n  computeNormalMinArea (minArea) {\n    this.computeNormal()\n    if (this.area < minArea) {\n      // compute the normal without the longest edge\n      let maxEdge\n      let maxSquaredLength = 0\n      let edge = this.edge\n\n      // find the longest edge (in length) in the chain of edges\n      do {\n        const lengthSquared = edge.lengthSquared()\n        if (lengthSquared > maxSquaredLength) {\n          maxEdge = edge\n          maxSquaredLength = lengthSquared\n        }\n        edge = edge.next\n      } while (edge !== this.edge)\n\n      const p1 = maxEdge.tail().point\n      const p2 = maxEdge.head().point\n      const maxVector = subtract([], p2, p1)\n      const maxLength = Math.sqrt(maxSquaredLength)\n      // maxVector is normalized after this operation\n      scale(maxVector, maxVector, 1 / maxLength)\n      // compute the projection of maxVector over this face normal\n      const maxProjection = dot(this.normal, maxVector)\n      // subtract the quantity maxEdge adds on the normal\n      scale(maxVector, maxVector, -maxProjection)\n      add(this.normal, this.normal, maxVector)\n      // renormalize `this.normal`\n      normalize(this.normal, this.normal)\n    }\n  }\n\n  computeCentroid () {\n    this.centroid = [0, 0, 0]\n    let edge = this.edge\n    do {\n      add(this.centroid, this.centroid, edge.head().point)\n      edge = edge.next\n    } while (edge !== this.edge)\n    scale(this.centroid, this.centroid, 1 / this.nVertices)\n  }\n\n  computeNormalAndCentroid (minArea) {\n    if (typeof minArea !== 'undefined') {\n      this.computeNormalMinArea(minArea)\n    } else {\n      this.computeNormal()\n    }\n    this.computeCentroid()\n    this.offset = dot(this.normal, this.centroid)\n  }\n\n  distanceToPlane (point) {\n    return dot(this.normal, point) - this.offset\n  }\n\n  /**\n   * @private\n   *\n   * Connects two edges assuming that prev.head().point === next.tail().point\n   *\n   * @param {HalfEdge} prev\n   * @param {HalfEdge} next\n   */\n  connectHalfEdges (prev, next) {\n    let discardedFace\n    if (prev.opposite.face === next.opposite.face) {\n      // `prev` is remove a redundant edge\n      const oppositeFace = next.opposite.face\n      let oppositeEdge\n      if (prev === this.edge) {\n        this.edge = next\n      }\n      if (oppositeFace.nVertices === 3) {\n        // case:\n        // remove the face on the right\n        //\n        //       /|\\\n        //      / | \\ the face on the right\n        //     /  |  \\ --> opposite edge\n        //    / a |   \\\n        //   *----*----*\n        //  /     b  |  \\\n        //           ▾\n        //      redundant edge\n        //\n        // Note: the opposite edge is actually in the face to the right\n        // of the face to be destroyed\n        oppositeEdge = next.opposite.prev.opposite\n        oppositeFace.mark = DELETED\n        discardedFace = oppositeFace\n      } else {\n        // case:\n        //          t\n        //        *----\n        //       /| <- right face's redundant edge\n        //      / | opposite edge\n        //     /  |  ▴   /\n        //    / a |  |  /\n        //   *----*----*\n        //  /     b  |  \\\n        //           ▾\n        //      redundant edge\n        oppositeEdge = next.opposite.next\n        // make sure that the link `oppositeFace.edge` points correctly even\n        // after the right face redundant edge is removed\n        if (oppositeFace.edge === oppositeEdge.prev) {\n          oppositeFace.edge = oppositeEdge\n        }\n\n        //       /|   /\n        //      / | t/opposite edge\n        //     /  | / ▴  /\n        //    / a |/  | /\n        //   *----*----*\n        //  /     b     \\\n        oppositeEdge.prev = oppositeEdge.prev.prev\n        oppositeEdge.prev.next = oppositeEdge\n      }\n      //       /|\n      //      / |\n      //     /  |\n      //    / a |\n      //   *----*----*\n      //  /     b  ▴  \\\n      //           |\n      //     redundant edge\n      next.prev = prev.prev\n      next.prev.next = next\n\n      //       / \\  \\\n      //      /   \\->\\\n      //     /     \\<-\\ opposite edge\n      //    / a     \\  \\\n      //   *----*----*\n      //  /     b  ^  \\\n      next.setOpposite(oppositeEdge)\n\n      oppositeFace.computeNormalAndCentroid()\n    } else {\n      // trivial case\n      //        *\n      //       /|\\\n      //      / | \\\n      //     /  |--> next\n      //    / a |   \\\n      //   *----*----*\n      //    \\ b |   /\n      //     \\  |--> prev\n      //      \\ | /\n      //       \\|/\n      //        *\n      prev.next = next\n      next.prev = prev\n    }\n    return discardedFace\n  }\n\n  mergeAdjacentFaces (adjacentEdge, discardedFaces) {\n    const oppositeEdge = adjacentEdge.opposite\n    const oppositeFace = oppositeEdge.face\n\n    discardedFaces.push(oppositeFace)\n    oppositeFace.mark = DELETED\n\n    // find the chain of edges whose opposite face is `oppositeFace`\n    //\n    //                ===>\n    //      \\         face         /\n    //       * ---- * ---- * ---- *\n    //      /     opposite face    \\\n    //                <===\n    //\n    let adjacentEdgePrev = adjacentEdge.prev\n    let adjacentEdgeNext = adjacentEdge.next\n    let oppositeEdgePrev = oppositeEdge.prev\n    let oppositeEdgeNext = oppositeEdge.next\n\n    // left edge\n    while (adjacentEdgePrev.opposite.face === oppositeFace) {\n      adjacentEdgePrev = adjacentEdgePrev.prev\n      oppositeEdgeNext = oppositeEdgeNext.next\n    }\n    // right edge\n    while (adjacentEdgeNext.opposite.face === oppositeFace) {\n      adjacentEdgeNext = adjacentEdgeNext.next\n      oppositeEdgePrev = oppositeEdgePrev.prev\n    }\n    // adjacentEdgePrev  \\         face         / adjacentEdgeNext\n    //                    * ---- * ---- * ---- *\n    // oppositeEdgeNext  /     opposite face    \\ oppositeEdgePrev\n\n    // fix the face reference of all the opposite edges that are not part of\n    // the edges whose opposite face is not `face` i.e. all the edges that\n    // `face` and `oppositeFace` do not have in common\n    let edge\n    for (edge = oppositeEdgeNext; edge !== oppositeEdgePrev.next; edge = edge.next) {\n      edge.face = this\n    }\n\n    // make sure that `face.edge` is not one of the edges to be destroyed\n    // Note: it's important for it to be a `next` edge since `prev` edges\n    // might be destroyed on `connectHalfEdges`\n    this.edge = adjacentEdgeNext\n\n    // connect the extremes\n    // Note: it might be possible that after connecting the edges a triangular\n    // face might be redundant\n    let discardedFace\n    discardedFace = this.connectHalfEdges(oppositeEdgePrev, adjacentEdgeNext)\n    if (discardedFace) {\n      discardedFaces.push(discardedFace)\n    }\n    discardedFace = this.connectHalfEdges(adjacentEdgePrev, oppositeEdgeNext)\n    if (discardedFace) {\n      discardedFaces.push(discardedFace)\n    }\n\n    this.computeNormalAndCentroid()\n    // TODO: additional consistency checks\n    return discardedFaces\n  }\n\n  collectIndices () {\n    const indices = []\n    let edge = this.edge\n    do {\n      indices.push(edge.head().index)\n      edge = edge.next\n    } while (edge !== this.edge)\n    return indices\n  }\n\n  static createTriangle (v0, v1, v2, minArea = 0) {\n    const face = new Face()\n    const e0 = new HalfEdge(v0, face)\n    const e1 = new HalfEdge(v1, face)\n    const e2 = new HalfEdge(v2, face)\n\n    // join edges\n    e0.next = e2.prev = e1\n    e1.next = e0.prev = e2\n    e2.next = e1.prev = e0\n\n    // main half edge reference\n    face.edge = e0\n    face.computeNormalAndCentroid(minArea)\n    return face\n  }\n}\n\nmodule.exports = {\n  VISIBLE,\n  NON_CONVEX,\n  DELETED,\n  Face\n}\n","const distance = require('../../../maths/vec3/distance')\nconst squaredDistance = require('../../../maths/vec3/squaredDistance')\n\n/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nclass HalfEdge {\n  constructor (vertex, face) {\n    this.vertex = vertex\n    this.face = face\n    this.next = null\n    this.prev = null\n    this.opposite = null\n  }\n\n  head () {\n    return this.vertex\n  }\n\n  tail () {\n    return this.prev\n      ? this.prev.vertex\n      : null\n  }\n\n  length () {\n    if (this.tail()) {\n      return distance(\n        this.tail().point,\n        this.head().point\n      )\n    }\n    return -1\n  }\n\n  lengthSquared () {\n    if (this.tail()) {\n      return squaredDistance(\n        this.tail().point,\n        this.head().point\n      )\n    }\n    return -1\n  }\n\n  setOpposite (edge) {\n    this.opposite = edge\n    edge.opposite = this\n  }\n}\n\nmodule.exports = HalfEdge\n","const dot = require('../../../maths/vec3/dot')\n\nconst pointLineDistance = require('./point-line-distance')\nconst getPlaneNormal = require('./get-plane-normal')\n\nconst VertexList = require('./VertexList')\nconst Vertex = require('./Vertex')\nconst { Face, VISIBLE, NON_CONVEX, DELETED } = require('./Face')\n\n/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\n// merge types\n// non convex with respect to the large face\nconst MERGE_NON_CONVEX_WRT_LARGER_FACE = 1\nconst MERGE_NON_CONVEX = 2\n\nclass QuickHull {\n  constructor (points) {\n    if (!Array.isArray(points)) {\n      throw TypeError('input is not a valid array')\n    }\n    if (points.length < 4) {\n      throw Error('cannot build a simplex out of <4 points')\n    }\n\n    this.tolerance = -1\n\n    // buffers\n    this.nFaces = 0\n    this.nPoints = points.length\n\n    this.faces = []\n    this.newFaces = []\n    // helpers\n    //\n    // let `a`, `b` be `Face` instances\n    // let `v` be points wrapped as instance of `Vertex`\n    //\n    //     [v, v, ..., v, v, v, ...]\n    //      ^             ^\n    //      |             |\n    //  a.outside     b.outside\n    //\n    this.claimed = new VertexList()\n    this.unclaimed = new VertexList()\n\n    // vertices of the hull(internal representation of points)\n    this.vertices = []\n    for (let i = 0; i < points.length; i += 1) {\n      this.vertices.push(new Vertex(points[i], i))\n    }\n    this.discardedFaces = []\n    this.vertexPointIndices = []\n  }\n\n  addVertexToFace (vertex, face) {\n    vertex.face = face\n    if (!face.outside) {\n      this.claimed.add(vertex)\n    } else {\n      this.claimed.insertBefore(face.outside, vertex)\n    }\n    face.outside = vertex\n  }\n\n  /**\n   * Removes `vertex` for the `claimed` list of vertices, it also makes sure\n   * that the link from `face` to the first vertex it sees in `claimed` is\n   * linked correctly after the removal\n   *\n   * @param {Vertex} vertex\n   * @param {Face} face\n   */\n  removeVertexFromFace (vertex, face) {\n    if (vertex === face.outside) {\n      // fix face.outside link\n      if (vertex.next && vertex.next.face === face) {\n        // face has at least 2 outside vertices, move the `outside` reference\n        face.outside = vertex.next\n      } else {\n        // vertex was the only outside vertex that face had\n        face.outside = null\n      }\n    }\n    this.claimed.remove(vertex)\n  }\n\n  /**\n   * Removes all the visible vertices that `face` is able to see which are\n   * stored in the `claimed` vertext list\n   *\n   * @param {Face} face\n   * @return {Vertex|undefined} If face had visible vertices returns\n   * `face.outside`, otherwise undefined\n   */\n  removeAllVerticesFromFace (face) {\n    if (face.outside) {\n      // pointer to the last vertex of this face\n      // [..., outside, ..., end, outside, ...]\n      //          |           |      |\n      //          a           a      b\n      let end = face.outside\n      while (end.next && end.next.face === face) {\n        end = end.next\n      }\n      this.claimed.removeChain(face.outside, end)\n      //                            b\n      //                       [ outside, ...]\n      //                            |  removes this link\n      //     [ outside, ..., end ] -┘\n      //          |           |\n      //          a           a\n      end.next = null\n      return face.outside\n    }\n  }\n\n  /**\n   * Removes all the visible vertices that `face` is able to see, additionally\n   * checking the following:\n   *\n   * If `absorbingFace` doesn't exist then all the removed vertices will be\n   * added to the `unclaimed` vertex list\n   *\n   * If `absorbingFace` exists then this method will assign all the vertices of\n   * `face` that can see `absorbingFace`, if a vertex cannot see `absorbingFace`\n   * it's added to the `unclaimed` vertex list\n   *\n   * @param {Face} face\n   * @param {Face} [absorbingFace]\n   */\n  deleteFaceVertices (face, absorbingFace) {\n    const faceVertices = this.removeAllVerticesFromFace(face)\n    if (faceVertices) {\n      if (!absorbingFace) {\n        // mark the vertices to be reassigned to some other face\n        this.unclaimed.addAll(faceVertices)\n      } else {\n        // if there's an absorbing face try to assign as many vertices\n        // as possible to it\n\n        // the reference `vertex.next` might be destroyed on\n        // `this.addVertexToFace` (see VertexList#add), nextVertex is a\n        // reference to it\n        let nextVertex\n        for (let vertex = faceVertices; vertex; vertex = nextVertex) {\n          nextVertex = vertex.next\n          const distance = absorbingFace.distanceToPlane(vertex.point)\n\n          // check if `vertex` is able to see `absorbingFace`\n          if (distance > this.tolerance) {\n            this.addVertexToFace(vertex, absorbingFace)\n          } else {\n            this.unclaimed.add(vertex)\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Reassigns as many vertices as possible from the unclaimed list to the new\n   * faces\n   *\n   * @param {Faces[]} newFaces\n   */\n  resolveUnclaimedPoints (newFaces) {\n    // cache next vertex so that if `vertex.next` is destroyed it's still\n    // recoverable\n    let vertexNext = this.unclaimed.first()\n    for (let vertex = vertexNext; vertex; vertex = vertexNext) {\n      vertexNext = vertex.next\n      let maxDistance = this.tolerance\n      let maxFace\n      for (let i = 0; i < newFaces.length; i += 1) {\n        const face = newFaces[i]\n        if (face.mark === VISIBLE) {\n          const dist = face.distanceToPlane(vertex.point)\n          if (dist > maxDistance) {\n            maxDistance = dist\n            maxFace = face\n          }\n          if (maxDistance > 1000 * this.tolerance) {\n            break\n          }\n        }\n      }\n\n      if (maxFace) {\n        this.addVertexToFace(vertex, maxFace)\n      }\n    }\n  }\n\n  /**\n   * Computes the extremes of a tetrahedron which will be the initial hull\n   *\n   * @return {number[]} The min/max vertices in the x,y,z directions\n   */\n  computeExtremes () {\n    const min = []\n    const max = []\n\n    // min vertex on the x,y,z directions\n    const minVertices = []\n    // max vertex on the x,y,z directions\n    const maxVertices = []\n\n    let i, j\n\n    // initially assume that the first vertex is the min/max\n    for (i = 0; i < 3; i += 1) {\n      minVertices[i] = maxVertices[i] = this.vertices[0]\n    }\n    // copy the coordinates of the first vertex to min/max\n    for (i = 0; i < 3; i += 1) {\n      min[i] = max[i] = this.vertices[0].point[i]\n    }\n\n    // compute the min/max vertex on all 6 directions\n    for (i = 1; i < this.vertices.length; i += 1) {\n      const vertex = this.vertices[i]\n      const point = vertex.point\n      // update the min coordinates\n      for (j = 0; j < 3; j += 1) {\n        if (point[j] < min[j]) {\n          min[j] = point[j]\n          minVertices[j] = vertex\n        }\n      }\n      // update the max coordinates\n      for (j = 0; j < 3; j += 1) {\n        if (point[j] > max[j]) {\n          max[j] = point[j]\n          maxVertices[j] = vertex\n        }\n      }\n    }\n\n    // compute epsilon\n    this.tolerance = 3 * Number.EPSILON * (\n      Math.max(Math.abs(min[0]), Math.abs(max[0])) +\n      Math.max(Math.abs(min[1]), Math.abs(max[1])) +\n      Math.max(Math.abs(min[2]), Math.abs(max[2]))\n    )\n    return [minVertices, maxVertices]\n  }\n\n  /**\n   * Compues the initial tetrahedron assigning to its faces all the points that\n   * are candidates to form part of the hull\n   */\n  createInitialSimplex () {\n    const vertices = this.vertices\n    const [min, max] = this.computeExtremes()\n    let v2, v3\n    let i, j\n\n    // Find the two vertices with the greatest 1d separation\n    // (max.x - min.x)\n    // (max.y - min.y)\n    // (max.z - min.z)\n    let maxDistance = 0\n    let indexMax = 0\n    for (i = 0; i < 3; i += 1) {\n      const distance = max[i].point[i] - min[i].point[i]\n      if (distance > maxDistance) {\n        maxDistance = distance\n        indexMax = i\n      }\n    }\n    const v0 = min[indexMax]\n    const v1 = max[indexMax]\n\n    // the next vertex is the one farthest to the line formed by `v0` and `v1`\n    maxDistance = 0\n    for (i = 0; i < this.vertices.length; i += 1) {\n      const vertex = this.vertices[i]\n      if (vertex !== v0 && vertex !== v1) {\n        const distance = pointLineDistance(\n          vertex.point, v0.point, v1.point\n        )\n        if (distance > maxDistance) {\n          maxDistance = distance\n          v2 = vertex\n        }\n      }\n    }\n\n    // the next vertes is the one farthest to the plane `v0`, `v1`, `v2`\n    // normalize((v2 - v1) x (v0 - v1))\n    const normal = getPlaneNormal([], v0.point, v1.point, v2.point)\n    // distance from the origin to the plane\n    const distPO = dot(v0.point, normal)\n    maxDistance = -1\n    for (i = 0; i < this.vertices.length; i += 1) {\n      const vertex = this.vertices[i]\n      if (vertex !== v0 && vertex !== v1 && vertex !== v2) {\n        const distance = Math.abs(dot(normal, vertex.point) - distPO)\n        if (distance > maxDistance) {\n          maxDistance = distance\n          v3 = vertex\n        }\n      }\n    }\n\n    // initial simplex\n    // Taken from http://everything2.com/title/How+to+paint+a+tetrahedron\n    //\n    //                              v2\n    //                             ,|,\n    //                           ,7``\\'VA,\n    //                         ,7`   |, `'VA,\n    //                       ,7`     `\\    `'VA,\n    //                     ,7`        |,      `'VA,\n    //                   ,7`          `\\         `'VA,\n    //                 ,7`             |,           `'VA,\n    //               ,7`               `\\       ,..ooOOTK` v3\n    //             ,7`                  |,.ooOOT''`    AV\n    //           ,7`            ,..ooOOT`\\`           /7\n    //         ,7`      ,..ooOOT''`      |,          AV\n    //        ,T,..ooOOT''`              `\\         /7\n    //     v0 `'TTs.,                     |,       AV\n    //            `'TTs.,                 `\\      /7\n    //                 `'TTs.,             |,    AV\n    //                      `'TTs.,        `\\   /7\n    //                           `'TTs.,    |, AV\n    //                                `'TTs.,\\/7\n    //                                     `'T`\n    //                                       v1\n    //\n    const faces = []\n    if (dot(v3.point, normal) - distPO < 0) {\n      // the face is not able to see the point so `planeNormal`\n      // is pointing outside the tetrahedron\n      faces.push(\n        Face.createTriangle(v0, v1, v2),\n        Face.createTriangle(v3, v1, v0),\n        Face.createTriangle(v3, v2, v1),\n        Face.createTriangle(v3, v0, v2)\n      )\n\n      // set the opposite edge\n      for (i = 0; i < 3; i += 1) {\n        const j = (i + 1) % 3\n        // join face[i] i > 0, with the first face\n        faces[i + 1].getEdge(2).setOpposite(faces[0].getEdge(j))\n        // join face[i] with face[i + 1], 1 <= i <= 3\n        faces[i + 1].getEdge(1).setOpposite(faces[j + 1].getEdge(0))\n      }\n    } else {\n      // the face is able to see the point so `planeNormal`\n      // is pointing inside the tetrahedron\n      faces.push(\n        Face.createTriangle(v0, v2, v1),\n        Face.createTriangle(v3, v0, v1),\n        Face.createTriangle(v3, v1, v2),\n        Face.createTriangle(v3, v2, v0)\n      )\n\n      // set the opposite edge\n      for (i = 0; i < 3; i += 1) {\n        const j = (i + 1) % 3\n        // join face[i] i > 0, with the first face\n        faces[i + 1].getEdge(2).setOpposite(faces[0].getEdge((3 - i) % 3))\n        // join face[i] with face[i + 1]\n        faces[i + 1].getEdge(0).setOpposite(faces[j + 1].getEdge(1))\n      }\n    }\n\n    // the initial hull is the tetrahedron\n    for (i = 0; i < 4; i += 1) {\n      this.faces.push(faces[i])\n    }\n\n    // initial assignment of vertices to the faces of the tetrahedron\n    for (i = 0; i < vertices.length; i += 1) {\n      const vertex = vertices[i]\n      if (vertex !== v0 && vertex !== v1 && vertex !== v2 && vertex !== v3) {\n        maxDistance = this.tolerance\n        let maxFace\n        for (j = 0; j < 4; j += 1) {\n          const distance = faces[j].distanceToPlane(vertex.point)\n          if (distance > maxDistance) {\n            maxDistance = distance\n            maxFace = faces[j]\n          }\n        }\n\n        if (maxFace) {\n          this.addVertexToFace(vertex, maxFace)\n        }\n      }\n    }\n  }\n\n  reindexFaceAndVertices () {\n    // remove inactive faces\n    const activeFaces = []\n    for (let i = 0; i < this.faces.length; i += 1) {\n      const face = this.faces[i]\n      if (face.mark === VISIBLE) {\n        activeFaces.push(face)\n      }\n    }\n    this.faces = activeFaces\n  }\n\n  collectFaces (skipTriangulation) {\n    const faceIndices = []\n    for (let i = 0; i < this.faces.length; i += 1) {\n      if (this.faces[i].mark !== VISIBLE) {\n        throw Error('attempt to include a destroyed face in the hull')\n      }\n      const indices = this.faces[i].collectIndices()\n      if (skipTriangulation) {\n        faceIndices.push(indices)\n      } else {\n        for (let j = 0; j < indices.length - 2; j += 1) {\n          faceIndices.push(\n            [indices[0], indices[j + 1], indices[j + 2]]\n          )\n        }\n      }\n    }\n    return faceIndices\n  }\n\n  /**\n   * Finds the next vertex to make faces with the current hull\n   *\n   * - let `face` be the first face existing in the `claimed` vertex list\n   *  - if `face` doesn't exist then return since there're no vertices left\n   *  - otherwise for each `vertex` that face sees find the one furthest away\n   *  from `face`\n   *\n   * @return {Vertex|undefined} Returns undefined when there're no more\n   * visible vertices\n   */\n  nextVertexToAdd () {\n    if (!this.claimed.isEmpty()) {\n      let eyeVertex, vertex\n      let maxDistance = 0\n      const eyeFace = this.claimed.first().face\n      for (vertex = eyeFace.outside; vertex && vertex.face === eyeFace; vertex = vertex.next) {\n        const distance = eyeFace.distanceToPlane(vertex.point)\n        if (distance > maxDistance) {\n          maxDistance = distance\n          eyeVertex = vertex\n        }\n      }\n      return eyeVertex\n    }\n  }\n\n  /**\n   * Computes a chain of half edges in ccw order called the `horizon`, for an\n   * edge to be part of the horizon it must join a face that can see\n   * `eyePoint` and a face that cannot see `eyePoint`\n   *\n   * @param {number[]} eyePoint - The coordinates of a point\n   * @param {HalfEdge} crossEdge - The edge used to jump to the current `face`\n   * @param {Face} face - The current face being tested\n   * @param {HalfEdge[]} horizon - The edges that form part of the horizon in\n   * ccw order\n   */\n  computeHorizon (eyePoint, crossEdge, face, horizon) {\n    // moves face's vertices to the `unclaimed` vertex list\n    this.deleteFaceVertices(face)\n\n    face.mark = DELETED\n\n    let edge\n    if (!crossEdge) {\n      edge = crossEdge = face.getEdge(0)\n    } else {\n      // start from the next edge since `crossEdge` was already analyzed\n      // (actually `crossEdge.opposite` was the face who called this method\n      // recursively)\n      edge = crossEdge.next\n    }\n\n    // All the faces that are able to see `eyeVertex` are defined as follows\n    //\n    //       v    /\n    //           / <== visible face\n    //          /\n    //         |\n    //         | <== not visible face\n    //\n    //  dot(v, visible face normal) - visible face offset > this.tolerance\n    //\n    do {\n      const oppositeEdge = edge.opposite\n      const oppositeFace = oppositeEdge.face\n      if (oppositeFace.mark === VISIBLE) {\n        if (oppositeFace.distanceToPlane(eyePoint) > this.tolerance) {\n          this.computeHorizon(eyePoint, oppositeEdge, oppositeFace, horizon)\n        } else {\n          horizon.push(edge)\n        }\n      }\n      edge = edge.next\n    } while (edge !== crossEdge)\n  }\n\n  /**\n   * Creates a face with the points `eyeVertex.point`, `horizonEdge.tail` and\n   * `horizonEdge.tail` in ccw order\n   *\n   * @param {Vertex} eyeVertex\n   * @param {HalfEdge} horizonEdge\n   * @return {HalfEdge} The half edge whose vertex is the eyeVertex\n   */\n  addAdjoiningFace (eyeVertex, horizonEdge) {\n    // all the half edges are created in ccw order thus the face is always\n    // pointing outside the hull\n    // edges:\n    //\n    //                  eyeVertex.point\n    //                       / \\\n    //                      /   \\\n    //                  1  /     \\  0\n    //                    /       \\\n    //                   /         \\\n    //                  /           \\\n    //          horizon.tail --- horizon.head\n    //                        2\n    //\n    const face = Face.createTriangle(\n      eyeVertex,\n      horizonEdge.tail(),\n      horizonEdge.head()\n    )\n    this.faces.push(face)\n    // join face.getEdge(-1) with the horizon's opposite edge\n    // face.getEdge(-1) = face.getEdge(2)\n    face.getEdge(-1).setOpposite(horizonEdge.opposite)\n    return face.getEdge(0)\n  }\n\n  /**\n   * Adds horizon.length faces to the hull, each face will be 'linked' with the\n   * horizon opposite face and the face on the left/right\n   *\n   * @param {Vertex} eyeVertex\n   * @param {HalfEdge[]} horizon - A chain of half edges in ccw order\n   */\n  addNewFaces (eyeVertex, horizon) {\n    this.newFaces = []\n    let firstSideEdge, previousSideEdge\n    for (let i = 0; i < horizon.length; i += 1) {\n      const horizonEdge = horizon[i]\n      // returns the right side edge\n      const sideEdge = this.addAdjoiningFace(eyeVertex, horizonEdge)\n      if (!firstSideEdge) {\n        firstSideEdge = sideEdge\n      } else {\n        // joins face.getEdge(1) with previousFace.getEdge(0)\n        sideEdge.next.setOpposite(previousSideEdge)\n      }\n      this.newFaces.push(sideEdge.face)\n      previousSideEdge = sideEdge\n    }\n    firstSideEdge.next.setOpposite(previousSideEdge)\n  }\n\n  /**\n   * Computes the distance from `edge` opposite face's centroid to\n   * `edge.face`\n   *\n   * @param {HalfEdge} edge\n   * @return {number}\n   * - A positive number when the centroid of the opposite face is above the\n   *   face i.e. when the faces are concave\n   * - A negative number when the centroid of the opposite face is below the\n   *   face i.e. when the faces are convex\n   */\n  oppositeFaceDistance (edge) {\n    return edge.face.distanceToPlane(edge.opposite.face.centroid)\n  }\n\n  /**\n   * Merges a face with none/any/all its neighbors according to the strategy\n   * used\n   *\n   * if `mergeType` is MERGE_NON_CONVEX_WRT_LARGER_FACE then the merge will be\n   * decided based on the face with the larger area, the centroid of the face\n   * with the smaller area will be checked against the one with the larger area\n   * to see if it's in the merge range [tolerance, -tolerance] i.e.\n   *\n   *    dot(centroid smaller face, larger face normal) - larger face offset > -tolerance\n   *\n   * Note that the first check (with +tolerance) was done on `computeHorizon`\n   *\n   * If the above is not true then the check is done with respect to the smaller\n   * face i.e.\n   *\n   *    dot(centroid larger face, smaller face normal) - smaller face offset > -tolerance\n   *\n   * If true then it means that two faces are non convex (concave), even if the\n   * dot(...) - offset value is > 0 (that's the point of doing the merge in the\n   * first place)\n   *\n   * If two faces are concave then the check must also be done on the other face\n   * but this is done in another merge pass, for this to happen the face is\n   * marked in a temporal NON_CONVEX state\n   *\n   * if `mergeType` is MERGE_NON_CONVEX then two faces will be merged only if\n   * they pass the following conditions\n   *\n   *    dot(centroid smaller face, larger face normal) - larger face offset > -tolerance\n   *    dot(centroid larger face, smaller face normal) - smaller face offset > -tolerance\n   *\n   * @param {Face} face\n   * @param {number} mergeType - Either MERGE_NON_CONVEX_WRT_LARGER_FACE or\n   * MERGE_NON_CONVEX\n   */\n  doAdjacentMerge (face, mergeType) {\n    let edge = face.edge\n    let convex = true\n    let it = 0\n    do {\n      if (it >= face.nVertices) {\n        throw Error('merge recursion limit exceeded')\n      }\n      const oppositeFace = edge.opposite.face\n      let merge = false\n\n      // Important notes about the algorithm to merge faces\n      //\n      // - Given a vertex `eyeVertex` that will be added to the hull\n      //   all the faces that cannot see `eyeVertex` are defined as follows\n      //\n      //      dot(v, not visible face normal) - not visible offset < tolerance\n      //\n      // - Two faces can be merged when the centroid of one of these faces\n      // projected to the normal of the other face minus the other face offset\n      // is in the range [tolerance, -tolerance]\n      // - Since `face` (given in the input for this method) has passed the\n      // check above we only have to check the lower bound e.g.\n      //\n      //      dot(v, not visible face normal) - not visible offset > -tolerance\n      //\n      if (mergeType === MERGE_NON_CONVEX) {\n        if (this.oppositeFaceDistance(edge) > -this.tolerance ||\n            this.oppositeFaceDistance(edge.opposite) > -this.tolerance) {\n          merge = true\n        }\n      } else {\n        if (face.area > oppositeFace.area) {\n          if (this.oppositeFaceDistance(edge) > -this.tolerance) {\n            merge = true\n          } else if (this.oppositeFaceDistance(edge.opposite) > -this.tolerance) {\n            convex = false\n          }\n        } else {\n          if (this.oppositeFaceDistance(edge.opposite) > -this.tolerance) {\n            merge = true\n          } else if (this.oppositeFaceDistance(edge) > -this.tolerance) {\n            convex = false\n          }\n        }\n      }\n\n      if (merge) {\n        // when two faces are merged it might be possible that redundant faces\n        // are destroyed, in that case move all the visible vertices from the\n        // destroyed faces to the `unclaimed` vertex list\n        const discardedFaces = face.mergeAdjacentFaces(edge, [])\n        for (let i = 0; i < discardedFaces.length; i += 1) {\n          this.deleteFaceVertices(discardedFaces[i], face)\n        }\n        return true\n      }\n\n      edge = edge.next\n      it += 1\n    } while (edge !== face.edge)\n    if (!convex) {\n      face.mark = NON_CONVEX\n    }\n    return false\n  }\n\n  /**\n   * Adds a vertex to the hull with the following algorithm\n   *\n   * - Compute the `horizon` which is a chain of half edges, for an edge to\n   *   belong to this group it must be the edge connecting a face that can\n   *   see `eyeVertex` and a face which cannot see `eyeVertex`\n   * - All the faces that can see `eyeVertex` have its visible vertices removed\n   *   from the claimed VertexList\n   * - A new set of faces is created with each edge of the `horizon` and\n   *   `eyeVertex`, each face is connected with the opposite horizon face and\n   *   the face on the left/right\n   * - The new faces are merged if possible with the opposite horizon face first\n   *   and then the faces on the right/left\n   * - The vertices removed from all the visible faces are assigned to the new\n   *   faces if possible\n   *\n   * @param {Vertex} eyeVertex\n   */\n  addVertexToHull (eyeVertex) {\n    const horizon = []\n\n    this.unclaimed.clear()\n\n    // remove `eyeVertex` from `eyeVertex.face` so that it can't be added to the\n    // `unclaimed` vertex list\n    this.removeVertexFromFace(eyeVertex, eyeVertex.face)\n    this.computeHorizon(eyeVertex.point, null, eyeVertex.face, horizon)\n    this.addNewFaces(eyeVertex, horizon)\n\n    // first merge pass\n    // Do the merge with respect to the larger face\n    for (let i = 0; i < this.newFaces.length; i += 1) {\n      const face = this.newFaces[i]\n      if (face.mark === VISIBLE) {\n        while (this.doAdjacentMerge(face, MERGE_NON_CONVEX_WRT_LARGER_FACE)) {} // eslint-disable-line no-empty\n      }\n    }\n\n    // second merge pass\n    // Do the merge on non convex faces (a face is marked as non convex in the\n    // first pass)\n    for (let i = 0; i < this.newFaces.length; i += 1) {\n      const face = this.newFaces[i]\n      if (face.mark === NON_CONVEX) {\n        face.mark = VISIBLE\n        while (this.doAdjacentMerge(face, MERGE_NON_CONVEX)) {} // eslint-disable-line no-empty\n      }\n    }\n\n    // reassign `unclaimed` vertices to the new faces\n    this.resolveUnclaimedPoints(this.newFaces)\n  }\n\n  build () {\n    let eyeVertex\n    this.createInitialSimplex()\n    while ((eyeVertex = this.nextVertexToAdd())) {\n      this.addVertexToHull(eyeVertex)\n    }\n    this.reindexFaceAndVertices()\n  }\n}\n\nmodule.exports = QuickHull\n","/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nclass Vertex {\n  constructor (point, index) {\n    this.point = point\n    // index in the input array\n    this.index = index\n    // vertex is a double linked list node\n    this.next = null\n    this.prev = null\n    // the face that is able to see this point\n    this.face = null\n  }\n}\n\nmodule.exports = Vertex\n","/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nclass VertexList {\n  constructor () {\n    this.head = null\n    this.tail = null\n  }\n\n  clear () {\n    this.head = this.tail = null\n  }\n\n  /**\n   * Inserts a `node` before `target`, it's assumed that\n   * `target` belongs to this doubly linked list\n   *\n   * @param {*} target\n   * @param {*} node\n   */\n  insertBefore (target, node) {\n    node.prev = target.prev\n    node.next = target\n    if (!node.prev) {\n      this.head = node\n    } else {\n      node.prev.next = node\n    }\n    target.prev = node\n  }\n\n  /**\n   * Inserts a `node` after `target`, it's assumed that\n   * `target` belongs to this doubly linked list\n   *\n   * @param {Vertex} target\n   * @param {Vertex} node\n   */\n  insertAfter (target, node) {\n    node.prev = target\n    node.next = target.next\n    if (!node.next) {\n      this.tail = node\n    } else {\n      node.next.prev = node\n    }\n    target.next = node\n  }\n\n  /**\n   * Appends a `node` to the end of this doubly linked list\n   * Note: `node.next` will be unlinked from `node`\n   * Note: if `node` is part of another linked list call `addAll` instead\n   *\n   * @param {*} node\n   */\n  add (node) {\n    if (!this.head) {\n      this.head = node\n    } else {\n      this.tail.next = node\n    }\n    node.prev = this.tail\n    // since node is the new end it doesn't have a next node\n    node.next = null\n    this.tail = node\n  }\n\n  /**\n   * Appends a chain of nodes where `node` is the head,\n   * the difference with `add` is that it correctly sets the position\n   * of the node list `tail` property\n   *\n   * @param {*} node\n   */\n  addAll (node) {\n    if (!this.head) {\n      this.head = node\n    } else {\n      this.tail.next = node\n    }\n    node.prev = this.tail\n\n    // find the end of the list\n    while (node.next) {\n      node = node.next\n    }\n    this.tail = node\n  }\n\n  /**\n   * Deletes a `node` from this linked list, it's assumed that `node` is a\n   * member of this linked list\n   *\n   * @param {*} node\n   */\n  remove (node) {\n    if (!node.prev) {\n      this.head = node.next\n    } else {\n      node.prev.next = node.next\n    }\n\n    if (!node.next) {\n      this.tail = node.prev\n    } else {\n      node.next.prev = node.prev\n    }\n  }\n\n  /**\n   * Removes a chain of nodes whose head is `a` and whose tail is `b`,\n   * it's assumed that `a` and `b` belong to this list and also that `a`\n   * comes before `b` in the linked list\n   *\n   * @param {*} a\n   * @param {*} b\n   */\n  removeChain (a, b) {\n    if (!a.prev) {\n      this.head = b.next\n    } else {\n      a.prev.next = b.next\n    }\n\n    if (!b.next) {\n      this.tail = a.prev\n    } else {\n      b.next.prev = a.prev\n    }\n  }\n\n  first () {\n    return this.head\n  }\n\n  isEmpty () {\n    return !this.head\n  }\n}\n\nmodule.exports = VertexList\n","const cross = require('../../../maths/vec3/cross')\nconst normalize = require('../../../maths/vec3/normalize')\nconst subtract = require('../../../maths/vec3/subtract')\n\n/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nconst planeNormal = (out, point1, point2, point3) => {\n  const tmp = [0, 0, 0]\n  subtract(out, point1, point2)\n  subtract(tmp, point2, point3)\n  cross(out, out, tmp)\n  return normalize(out, out)\n}\n\nmodule.exports = planeNormal\n","const QuickHull = require('./QuickHull')\n\n/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nconst runner = (points, options = {}) => {\n  const instance = new QuickHull(points)\n  instance.build()\n  return instance.collectFaces(options.skipTriangulation)\n}\n\nmodule.exports = runner\n","const cross = require('../../../maths/vec3/cross')\nconst subtract = require('../../../maths/vec3/subtract')\nconst squaredLength = require('../../../maths/vec3/squaredLength')\n\n/*\n * Original source from quickhull3d (https://github.com/mauriciopoppe/quickhull3d)\n * Copyright (c) 2015 Mauricio Poppe\n *\n * Adapted to JSCAD by Jeff Gay\n */\n\nconst distanceSquared = (p, a, b) => {\n  // == parallelogram solution\n  //\n  //            s\n  //      __a________b__\n  //       /   |    /\n  //      /   h|   /\n  //     /_____|__/\n  //    p\n  //\n  //  s = b - a\n  //  area = s * h\n  //  |ap x s| = s * h\n  //  h = |ap x s| / s\n  //\n  const ab = []\n  const ap = []\n  const cr = []\n  subtract(ab, b, a)\n  subtract(ap, p, a)\n  const area = squaredLength(cross(cr, ap, ab))\n  const s = squaredLength(ab)\n  if (s === 0) {\n    throw Error('a and b are the same point')\n  }\n  return area / s\n}\n\nconst pointLineDistance = (point, a, b) => Math.sqrt(distanceSquared(point, a, b))\n\nmodule.exports = pointLineDistance\n","const geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\n/*\n * Return the unique vertices of a geometry\n */\nconst toUniquePoints = (geometries) => {\n  const found = new Set()\n  const uniquePoints = []\n\n  const addPoint = (point) => {\n    const key = point.toString()\n    if (!found.has(key)) {\n      uniquePoints.push(point)\n      found.add(key)\n    }\n  }\n\n  geometries.forEach((geometry) => {\n    if (geom2.isA(geometry)) {\n      geom2.toPoints(geometry).forEach(addPoint)\n    } else if (geom3.isA(geometry)) {\n      // points are grouped by polygon\n      geom3.toPoints(geometry).forEach((points) => points.forEach(addPoint))\n    } else if (path2.isA(geometry)) {\n      path2.toPoints(geometry).forEach(addPoint)\n    }\n  })\n\n  return uniquePoints\n}\n\nmodule.exports = toUniquePoints\n","const flatten = require('../../utils/flatten')\n\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\nconst snapPolygons = require('./snapPolygons')\nconst mergePolygons = require('./mergePolygons')\nconst insertTjunctions = require('./insertTjunctions')\nconst triangulatePolygons = require('./triangulatePolygons')\n\n/*\n */\nconst generalizePath2 = (options, geometry) => geometry\n\n/*\n */\nconst generalizeGeom2 = (options, geometry) => geometry\n\n/*\n */\nconst generalizeGeom3 = (options, geometry) => {\n  const defaults = {\n    snap: false,\n    simplify: false,\n    triangulate: false\n  }\n  const { snap, simplify, triangulate } = Object.assign({}, defaults, options)\n\n  const epsilon = measureEpsilon(geometry)\n  let polygons = geom3.toPolygons(geometry)\n\n  // snap the given geometry if requested\n  if (snap) {\n    polygons = snapPolygons(epsilon, polygons)\n  }\n\n  // simplify the polygons if requested\n  if (simplify) {\n    // TODO implement some mesh decimations\n    polygons = mergePolygons(epsilon, polygons)\n  }\n\n  // triangulate the polygons if requested\n  if (triangulate) {\n    polygons = insertTjunctions(polygons)\n    polygons = triangulatePolygons(epsilon, polygons)\n  }\n\n  // FIXME replace with geom3.cloneShallow() when available\n  const clone = Object.assign({}, geometry)\n  clone.polygons = polygons\n\n  return clone\n}\n\n/**\n * Apply various modifications in proper order to produce a generalized geometry.\n * @param {Object} options - options for modifications\n * @param {Boolean} [options.snap=false] the geometries should be snapped to epsilons\n * @param {Boolean} [options.simplify=false] the geometries should be simplified\n * @param {Boolean} [options.triangulate=false] the geometries should be triangulated\n * @param {...Object} geometries - the geometries to generalize\n * @return {Object|Array} the modified geometry, or a list of modified geometries\n * @alias module:modeling/modifiers.generalize\n */\nconst generalize = (options, ...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return generalizePath2(options, geometry)\n    if (geom2.isA(geometry)) return generalizeGeom2(options, geometry)\n    if (geom3.isA(geometry)) return generalizeGeom3(options, geometry)\n    throw new Error('invalid geometry')\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = generalize\n","/**\n * All shapes (primitives or the results of operations) can be modified to correct issues, etc.\n * In all cases, these functions returns the results, and never changes the original geometry.\n * @module modeling/modifiers\n * @example\n * const { snap } = require('@jscad/modeling').modifiers\n */\nmodule.exports = {\n  generalize: require('./generalize'),\n  snap: require('./snap')\n}\n","const constants = require('../../maths/constants')\nconst vec3 = require('../../maths/vec3')\nconst poly3 = require('../../geometries/poly3')\n\nconst assert = false\n\nconst getTag = (vertex) => `${vertex}`\n\nconst addSide = (sidemap, vertextag2sidestart, vertextag2sideend, vertex0, vertex1, polygonindex) => {\n  const starttag = getTag(vertex0)\n  const endtag = getTag(vertex1)\n  if (assert && starttag === endtag) throw new Error('assert failed')\n  const newsidetag = `${starttag}/${endtag}`\n  const reversesidetag = `${endtag}/${starttag}`\n  if (sidemap.has(reversesidetag)) {\n    // remove the opposing side from mappings\n    deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, vertex1, vertex0, null)\n    return null\n  }\n  // add the side to the mappings\n  const newsideobj = {\n    vertex0: vertex0,\n    vertex1: vertex1,\n    polygonindex: polygonindex\n  }\n  if (!(sidemap.has(newsidetag))) {\n    sidemap.set(newsidetag, [newsideobj])\n  } else {\n    sidemap.get(newsidetag).push(newsideobj)\n  }\n  if (vertextag2sidestart.has(starttag)) {\n    vertextag2sidestart.get(starttag).push(newsidetag)\n  } else {\n    vertextag2sidestart.set(starttag, [newsidetag])\n  }\n  if (vertextag2sideend.has(endtag)) {\n    vertextag2sideend.get(endtag).push(newsidetag)\n  } else {\n    vertextag2sideend.set(endtag, [newsidetag])\n  }\n  return newsidetag\n}\n\nconst deleteSide = (sidemap, vertextag2sidestart, vertextag2sideend, vertex0, vertex1, polygonindex) => {\n  const starttag = getTag(vertex0)\n  const endtag = getTag(vertex1)\n  const sidetag = `${starttag}/${endtag}`\n  if (assert && !(sidemap.has(sidetag))) throw new Error('assert failed')\n  let idx = -1\n  const sideobjs = sidemap.get(sidetag)\n  for (let i = 0; i < sideobjs.length; i++) {\n    const sideobj = sideobjs[i]\n    let sidetag = getTag(sideobj.vertex0)\n    if (sidetag !== starttag) continue\n    sidetag = getTag(sideobj.vertex1)\n    if (sidetag !== endtag) continue\n    if (polygonindex !== null) {\n      if (sideobj.polygonindex !== polygonindex) continue\n    }\n    idx = i\n    break\n  }\n  if (assert && idx < 0) throw new Error('assert failed')\n  sideobjs.splice(idx, 1)\n  if (sideobjs.length === 0) {\n    sidemap.delete(sidetag)\n  }\n\n  // adjust start and end lists\n  idx = vertextag2sidestart.get(starttag).indexOf(sidetag)\n  if (assert && idx < 0) throw new Error('assert failed')\n  vertextag2sidestart.get(starttag).splice(idx, 1)\n  if (vertextag2sidestart.get(starttag).length === 0) {\n    vertextag2sidestart.delete(starttag)\n  }\n\n  idx = vertextag2sideend.get(endtag).indexOf(sidetag)\n  if (assert && idx < 0) throw new Error('assert failed')\n  vertextag2sideend.get(endtag).splice(idx, 1)\n  if (vertextag2sideend.get(endtag).length === 0) {\n    vertextag2sideend.delete(endtag)\n  }\n}\n\n/*\n  Suppose we have two polygons ACDB and EDGF:\n\n   A-----B\n   |     |\n   |     E--F\n   |     |  |\n   C-----D--G\n\n  Note that vertex E forms a T-junction on the side BD. In this case some STL slicers will complain\n  that the solid is not watertight. This is because the watertightness check is done by checking if\n  each side DE is matched by another side ED.\n\n  This function will return a new solid with ACDB replaced by ACDEB\n\n  Note that this can create polygons that are slightly non-convex (due to rounding errors). Therefore the result should\n  not be used for further CSG operations!\n\n  Note this function is meant to be used to preprocess geometries when triangulation is required, i.e. AMF, STL, etc.\n  Do not use the results in other operations.\n*/\n\n/*\n * Insert missing vertices for T junctions, which creates polygons that can be triangulated.\n * @param {Array} polygons - the original polygons which may or may not have T junctions\n * @return original polygons (if no T junctions found) or new polygons with updated vertices\n */\nconst insertTjunctions = (polygons) => {\n  // STEP 1 : build a map of 'unmatched' sides from the polygons\n  // i.e. side AB in one polygon does not have a matching side BA in another polygon\n  const sidemap = new Map()\n  for (let polygonindex = 0; polygonindex < polygons.length; polygonindex++) {\n    const polygon = polygons[polygonindex]\n    const numvertices = polygon.vertices.length\n    if (numvertices >= 3) {\n      let vertex = polygon.vertices[0]\n      let vertextag = getTag(vertex)\n      for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n        let nextvertexindex = vertexindex + 1\n        if (nextvertexindex === numvertices) nextvertexindex = 0\n\n        const nextvertex = polygon.vertices[nextvertexindex]\n        const nextvertextag = getTag(nextvertex)\n\n        const sidetag = `${vertextag}/${nextvertextag}`\n        const reversesidetag = `${nextvertextag}/${vertextag}`\n        if (sidemap.has(reversesidetag)) {\n          // this side matches the same side in another polygon. Remove from sidemap\n          // FIXME is this check necessary? there should only be ONE(1) opposing side\n          // FIXME assert ?\n          const ar = sidemap.get(reversesidetag)\n          ar.splice(-1, 1)\n          if (ar.length === 0) {\n            sidemap.delete(reversesidetag)\n          }\n        } else {\n          const sideobj = {\n            vertex0: vertex,\n            vertex1: nextvertex,\n            polygonindex: polygonindex\n          }\n          if (!(sidemap.has(sidetag))) {\n            sidemap.set(sidetag, [sideobj])\n          } else {\n            sidemap.get(sidetag).push(sideobj)\n          }\n        }\n        vertex = nextvertex\n        vertextag = nextvertextag\n      }\n    } else {\n      console.warn('warning: invalid polygon found during insertTjunctions')\n    }\n  }\n\n  if (sidemap.size > 0) {\n    // STEP 2 : create a list of starting sides and ending sides\n    const vertextag2sidestart = new Map()\n    const vertextag2sideend = new Map()\n    const sidesToCheck = new Map()\n    for (const [sidetag, sideobjs] of sidemap) {\n      sidesToCheck.set(sidetag, true)\n      sideobjs.forEach((sideobj) => {\n        const starttag = getTag(sideobj.vertex0)\n        const endtag = getTag(sideobj.vertex1)\n        if (vertextag2sidestart.has(starttag)) {\n          vertextag2sidestart.get(starttag).push(sidetag)\n        } else {\n          vertextag2sidestart.set(starttag, [sidetag])\n        }\n        if (vertextag2sideend.has(endtag)) {\n          vertextag2sideend.get(endtag).push(sidetag)\n        } else {\n          vertextag2sideend.set(endtag, [sidetag])\n        }\n      })\n    }\n\n    // STEP 3 : if sidemap is not empty\n    const newpolygons = polygons.slice(0) // make a copy in order to replace polygons inline\n    while (true) {\n      if (sidemap.size === 0) break\n\n      for (const sidetag of sidemap.keys()) {\n        sidesToCheck.set(sidetag, true)\n      }\n\n      let donesomething = false\n      while (true) {\n        const sidetags = Array.from(sidesToCheck.keys())\n        if (sidetags.length === 0) break // sidesToCheck is empty, we're done!\n        const sidetagtocheck = sidetags[0]\n        let donewithside = true\n        if (sidemap.has(sidetagtocheck)) {\n          const sideobjs = sidemap.get(sidetagtocheck)\n          if (assert && sideobjs.length === 0) throw new Error('assert failed')\n          const sideobj = sideobjs[0]\n          for (let directionindex = 0; directionindex < 2; directionindex++) {\n            const startvertex = (directionindex === 0) ? sideobj.vertex0 : sideobj.vertex1\n            const endvertex = (directionindex === 0) ? sideobj.vertex1 : sideobj.vertex0\n            const startvertextag = getTag(startvertex)\n            const endvertextag = getTag(endvertex)\n            let matchingsides = []\n            if (directionindex === 0) {\n              if (vertextag2sideend.has(startvertextag)) {\n                matchingsides = vertextag2sideend.get(startvertextag)\n              }\n            } else {\n              if (vertextag2sidestart.has(startvertextag)) {\n                matchingsides = vertextag2sidestart.get(startvertextag)\n              }\n            }\n            for (let matchingsideindex = 0; matchingsideindex < matchingsides.length; matchingsideindex++) {\n              const matchingsidetag = matchingsides[matchingsideindex]\n              const matchingside = sidemap.get(matchingsidetag)[0]\n              const matchingsidestartvertex = (directionindex === 0) ? matchingside.vertex0 : matchingside.vertex1\n              const matchingsideendvertex = (directionindex === 0) ? matchingside.vertex1 : matchingside.vertex0\n              const matchingsidestartvertextag = getTag(matchingsidestartvertex)\n              const matchingsideendvertextag = getTag(matchingsideendvertex)\n              if (assert && matchingsideendvertextag !== startvertextag) throw new Error('assert failed')\n              if (matchingsidestartvertextag === endvertextag) {\n                // matchingside cancels sidetagtocheck\n                deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, startvertex, endvertex, null)\n                deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, endvertex, startvertex, null)\n                donewithside = false\n                directionindex = 2 // skip reverse direction check\n                donesomething = true\n                break\n              } else {\n                const startpos = startvertex\n                const endpos = endvertex\n                const checkpos = matchingsidestartvertex\n                const direction = vec3.subtract(vec3.create(), checkpos, startpos)\n                // Now we need to check if endpos is on the line startpos-checkpos:\n                const t = vec3.dot(vec3.subtract(vec3.create(), endpos, startpos), direction) / vec3.dot(direction, direction)\n                if ((t > 0) && (t < 1)) {\n                  const closestpoint = vec3.scale(vec3.create(), direction, t)\n                  vec3.add(closestpoint, closestpoint, startpos)\n                  const distancesquared = vec3.squaredDistance(closestpoint, endpos)\n                  if (distancesquared < (constants.EPS * constants.EPS)) {\n                    // Yes it's a t-junction! We need to split matchingside in two:\n                    const polygonindex = matchingside.polygonindex\n                    const polygon = newpolygons[polygonindex]\n                    // find the index of startvertextag in polygon:\n                    const insertionvertextag = getTag(matchingside.vertex1)\n                    let insertionvertextagindex = -1\n                    for (let i = 0; i < polygon.vertices.length; i++) {\n                      if (getTag(polygon.vertices[i]) === insertionvertextag) {\n                        insertionvertextagindex = i\n                        break\n                      }\n                    }\n                    if (assert && insertionvertextagindex < 0) throw new Error('assert failed')\n                    // split the side by inserting the vertex:\n                    const newvertices = polygon.vertices.slice(0)\n                    newvertices.splice(insertionvertextagindex, 0, endvertex)\n                    const newpolygon = poly3.create(newvertices)\n\n                    newpolygons[polygonindex] = newpolygon\n\n                    // remove the original sides from our maps\n                    deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, matchingside.vertex0, matchingside.vertex1, polygonindex)\n                    const newsidetag1 = addSide(sidemap, vertextag2sidestart, vertextag2sideend, matchingside.vertex0, endvertex, polygonindex)\n                    const newsidetag2 = addSide(sidemap, vertextag2sidestart, vertextag2sideend, endvertex, matchingside.vertex1, polygonindex)\n                    if (newsidetag1 !== null) sidesToCheck.set(newsidetag1, true)\n                    if (newsidetag2 !== null) sidesToCheck.set(newsidetag2, true)\n                    donewithside = false\n                    directionindex = 2 // skip reverse direction check\n                    donesomething = true\n                    break\n                  } // if(distancesquared < 1e-10)\n                } // if( (t > 0) && (t < 1) )\n              } // if(endingstidestartvertextag === endvertextag)\n            } // for matchingsideindex\n          } // for directionindex\n        } // if(sidetagtocheck in sidemap)\n        if (donewithside) {\n          sidesToCheck.delete(sidetagtocheck)\n        }\n      }\n      if (!donesomething) break\n    }\n    polygons = newpolygons\n  }\n  sidemap.clear()\n\n  return polygons\n}\n\nmodule.exports = insertTjunctions\n","const aboutEqualNormals = require('../../maths/utils/aboutEqualNormals')\nconst vec3 = require('../../maths/vec3')\n\nconst poly3 = require('../../geometries/poly3')\n\n// create a set of edges from the given polygon, and link the edges as well\nconst createEdges = (polygon) => {\n  const points = poly3.toPoints(polygon)\n  const edges = []\n  for (let i = 0; i < points.length; i++) {\n    const j = (i + 1) % points.length\n    const edge = {\n      v1: points[i],\n      v2: points[j]\n    }\n    edges.push(edge)\n  }\n  // link the edges together\n  for (let i = 0; i < edges.length; i++) {\n    const j = (i + 1) % points.length\n    edges[i].next = edges[j]\n    edges[j].prev = edges[i]\n  }\n  return edges\n}\n\nconst insertEdge = (edges, edge) => {\n  const key = `${edge.v1}:${edge.v2}`\n  edges.set(key, edge)\n}\n\nconst deleteEdge = (edges, edge) => {\n  const key = `${edge.v1}:${edge.v2}`\n  edges.delete(key)\n}\n\nconst findOppositeEdge = (edges, edge) => {\n  const key = `${edge.v2}:${edge.v1}` // NOTE: OPPOSITE OF INSERT KEY\n  return edges.get(key)\n}\n\n// calculate the two adjoining angles between the opposing edges\nconst calculateAnglesBetween = (current, opposite, normal) => {\n  let v0 = current.prev.v1\n  let v1 = current.prev.v2\n  let v2 = opposite.next.v2\n  const angle1 = calculateAngle(v0, v1, v2, normal)\n\n  v0 = opposite.prev.v1\n  v1 = opposite.prev.v2\n  v2 = current.next.v2\n  const angle2 = calculateAngle(v0, v1, v2, normal)\n\n  return [angle1, angle2]\n}\n\nconst v1 = vec3.create()\nconst v2 = vec3.create()\n\nconst calculateAngle = (prevpoint, point, nextpoint, normal) => {\n  const d0 = vec3.subtract(v1, point, prevpoint)\n  const d1 = vec3.subtract(v2, nextpoint, point)\n  vec3.cross(d0, d0, d1)\n  return vec3.dot(d0, normal)\n}\n\n// create a polygon starting from the given edge (if possible)\nconst createPolygonAnd = (edge) => {\n  let polygon\n  const points = []\n  while (edge.next) {\n    const next = edge.next\n\n    points.push(edge.v1)\n\n    edge.v1 = null\n    edge.v2 = null\n    edge.next = null\n    edge.prev = null\n\n    edge = next\n  }\n  if (points.length > 0) polygon = poly3.create(points)\n  return polygon\n}\n\n/*\n * Merge COPLANAR polygons that share common edges.\n * @param {poly3[]} sourcepolygons - list of polygons\n * @returns {poly3[]} new set of polygons\n */\nconst mergeCoplanarPolygons = (sourcepolygons) => {\n  if (sourcepolygons.length < 2) return sourcepolygons\n\n  const normal = sourcepolygons[0].plane\n  const polygons = sourcepolygons.slice()\n  const edgeList = new Map()\n\n  while (polygons.length > 0) { // NOTE: the length of polygons WILL change\n    const polygon = polygons.shift()\n    const edges = createEdges(polygon)\n    for (let i = 0; i < edges.length; i++) {\n      const current = edges[i]\n      const opposite = findOppositeEdge(edgeList, current)\n      if (opposite) {\n        const angles = calculateAnglesBetween(current, opposite, normal)\n        if (angles[0] >= 0 && angles[1] >= 0) {\n          const edge1 = opposite.next\n          const edge2 = current.next\n          // adjust the edges, linking together opposing polygons\n          current.prev.next = opposite.next\n          current.next.prev = opposite.prev\n\n          opposite.prev.next = current.next\n          opposite.next.prev = current.prev\n\n          // remove the opposing edges\n          current.v1 = null\n          current.v2 = null\n          current.next = null\n          current.prev = null\n\n          deleteEdge(edgeList, opposite)\n\n          opposite.v1 = null\n          opposite.v2 = null\n          opposite.next = null\n          opposite.prev = null\n\n          const mergeEdges = (list, e1, e2) => {\n            const newedge = {\n              v1: e2.v1,\n              v2: e1.v2,\n              next: e1.next,\n              prev: e2.prev\n            }\n            // link in newedge\n            e2.prev.next = newedge\n            e1.next.prev = newedge\n            // remove old edges\n            deleteEdge(list, e1)\n            e1.v1 = null\n            e1.v2 = null\n            e1.next = null\n            e1.prev = null\n\n            deleteEdge(list, e2)\n            e2.v1 = null\n            e2.v2 = null\n            e2.next = null\n            e2.prev = null\n          }\n\n          if (angles[0] === 0.0) {\n            mergeEdges(edgeList, edge1, edge1.prev)\n          }\n          if (angles[1] === 0.0) {\n            mergeEdges(edgeList, edge2, edge2.prev)\n          }\n        }\n      } else {\n        if (current.next) insertEdge(edgeList, current)\n      }\n    }\n  }\n\n  // build a set of polygons from the remaining edges\n  const destpolygons = []\n  edgeList.forEach((edge) => {\n    const polygon = createPolygonAnd(edge)\n    if (polygon) destpolygons.push(polygon)\n  })\n\n  edgeList.clear()\n\n  return destpolygons\n}\n\nconst coplanar = (plane1, plane2) => {\n  // expect the same distance from the origin, within tolerance\n  if (Math.abs(plane1[3] - plane2[3]) < 0.00000015) {\n    return aboutEqualNormals(plane1, plane2)\n  }\n  return false\n}\n\nconst mergePolygons = (epsilon, polygons) => {\n  const polygonsPerPlane = [] // elements: [plane, [poly3...]]\n  polygons.forEach((polygon) => {\n    const mapping = polygonsPerPlane.find((element) => coplanar(element[0], poly3.plane(polygon)))\n    if (mapping) {\n      const polygons = mapping[1]\n      polygons.push(polygon)\n    } else {\n      polygonsPerPlane.push([poly3.plane(polygon), [polygon]])\n    }\n  })\n\n  let destpolygons = []\n  polygonsPerPlane.forEach((mapping) => {\n    const sourcepolygons = mapping[1]\n    const retesselayedpolygons = mergeCoplanarPolygons(sourcepolygons)\n    destpolygons = destpolygons.concat(retesselayedpolygons)\n  })\n  return destpolygons\n}\n\nmodule.exports = mergePolygons\n","const { EPS } = require('../../maths/constants')\n\nconst line2 = require('../../maths/line2')\nconst vec2 = require('../../maths/vec2')\nconst OrthoNormalBasis = require('../../maths/OrthoNormalBasis')\nconst interpolateBetween2DPointsForY = require('../../maths/utils/interpolateBetween2DPointsForY')\n\nconst { insertSorted, fnNumberSort } = require('../../utils')\n\nconst poly3 = require('../../geometries/poly3')\n\n/*\n * Retesselation for a set of COPLANAR polygons.\n * @param {poly3[]} sourcepolygons - list of polygons\n * @returns {poly3[]} new set of polygons\n */\nconst reTesselateCoplanarPolygons = (sourcepolygons) => {\n  if (sourcepolygons.length < 2) return sourcepolygons\n\n  const destpolygons = []\n  const numpolygons = sourcepolygons.length\n  const plane = poly3.plane(sourcepolygons[0])\n  const orthobasis = new OrthoNormalBasis(plane)\n  const polygonvertices2d = [] // array of array of Vector2D\n  const polygontopvertexindexes = [] // array of indexes of topmost vertex per polygon\n  const topy2polygonindexes = new Map()\n  const ycoordinatetopolygonindexes = new Map()\n\n  // convert all polygon vertices to 2D\n  // Make a list of all encountered y coordinates\n  // And build a map of all polygons that have a vertex at a certain y coordinate:\n  const ycoordinatebins = new Map()\n  const ycoordinateBinningFactor = 10 / EPS\n  for (let polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n    const poly3d = sourcepolygons[polygonindex]\n    let vertices2d = []\n    let numvertices = poly3d.vertices.length\n    let minindex = -1\n    if (numvertices > 0) {\n      let miny\n      let maxy\n      for (let i = 0; i < numvertices; i++) {\n        let pos2d = orthobasis.to2D(poly3d.vertices[i])\n        // perform binning of y coordinates: If we have multiple vertices very\n        // close to each other, give them the same y coordinate:\n        const ycoordinatebin = Math.floor(pos2d[1] * ycoordinateBinningFactor)\n        let newy\n        if (ycoordinatebins.has(ycoordinatebin)) {\n          newy = ycoordinatebins.get(ycoordinatebin)\n        } else if (ycoordinatebins.has(ycoordinatebin + 1)) {\n          newy = ycoordinatebins.get(ycoordinatebin + 1)\n        } else if (ycoordinatebins.has(ycoordinatebin - 1)) {\n          newy = ycoordinatebins.get(ycoordinatebin - 1)\n        } else {\n          newy = pos2d[1]\n          ycoordinatebins.set(ycoordinatebin, pos2d[1])\n        }\n        pos2d = vec2.fromValues(pos2d[0], newy)\n        vertices2d.push(pos2d)\n        const y = pos2d[1]\n        if ((i === 0) || (y < miny)) {\n          miny = y\n          minindex = i\n        }\n        if ((i === 0) || (y > maxy)) {\n          maxy = y\n        }\n        let polygonindexes = ycoordinatetopolygonindexes.get(y)\n        if (!polygonindexes) {\n          polygonindexes = {} // PERF\n          ycoordinatetopolygonindexes.set(y, polygonindexes)\n        }\n        polygonindexes[polygonindex] = true\n      }\n      if (miny >= maxy) {\n        // degenerate polygon, all vertices have same y coordinate. Just ignore it from now:\n        vertices2d = []\n        numvertices = 0\n        minindex = -1\n      } else {\n        let polygonindexes = topy2polygonindexes.get(miny)\n        if (!polygonindexes) {\n          polygonindexes = []\n          topy2polygonindexes.set(miny, polygonindexes)\n        }\n        polygonindexes.push(polygonindex)\n      }\n    } // if(numvertices > 0)\n    // reverse the vertex order:\n    vertices2d.reverse()\n    minindex = numvertices - minindex - 1\n    polygonvertices2d.push(vertices2d)\n    polygontopvertexindexes.push(minindex)\n  }\n\n  const ycoordinates = []\n  ycoordinatetopolygonindexes.forEach((polylist, y) => ycoordinates.push(y))\n  ycoordinates.sort(fnNumberSort)\n\n  // Now we will iterate over all y coordinates, from lowest to highest y coordinate\n  // activepolygons: source polygons that are 'active', i.e. intersect with our y coordinate\n  //   Is sorted so the polygons are in left to right order\n  // Each element in activepolygons has these properties:\n  //        polygonindex: the index of the source polygon (i.e. an index into the sourcepolygons\n  //                      and polygonvertices2d arrays)\n  //        leftvertexindex: the index of the vertex at the left side of the polygon (lowest x)\n  //                         that is at or just above the current y coordinate\n  //        rightvertexindex: dito at right hand side of polygon\n  //        topleft, bottomleft: coordinates of the left side of the polygon crossing the current y coordinate\n  //        topright, bottomright: coordinates of the right hand side of the polygon crossing the current y coordinate\n  let activepolygons = []\n  let prevoutpolygonrow = []\n  for (let yindex = 0; yindex < ycoordinates.length; yindex++) {\n    const newoutpolygonrow = []\n    const ycoordinate = ycoordinates[yindex]\n\n    // update activepolygons for this y coordinate:\n    // - Remove any polygons that end at this y coordinate\n    // - update leftvertexindex and rightvertexindex (which point to the current vertex index\n    //   at the the left and right side of the polygon\n    // Iterate over all polygons that have a corner at this y coordinate:\n    const polygonindexeswithcorner = ycoordinatetopolygonindexes.get(ycoordinate)\n    for (let activepolygonindex = 0; activepolygonindex < activepolygons.length; ++activepolygonindex) {\n      const activepolygon = activepolygons[activepolygonindex]\n      const polygonindex = activepolygon.polygonindex\n      if (polygonindexeswithcorner[polygonindex]) {\n        // this active polygon has a corner at this y coordinate:\n        const vertices2d = polygonvertices2d[polygonindex]\n        const numvertices = vertices2d.length\n        let newleftvertexindex = activepolygon.leftvertexindex\n        let newrightvertexindex = activepolygon.rightvertexindex\n        // See if we need to increase leftvertexindex or decrease rightvertexindex:\n        while (true) {\n          let nextleftvertexindex = newleftvertexindex + 1\n          if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0\n          if (vertices2d[nextleftvertexindex][1] !== ycoordinate) break\n          newleftvertexindex = nextleftvertexindex\n        }\n        let nextrightvertexindex = newrightvertexindex - 1\n        if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1\n        if (vertices2d[nextrightvertexindex][1] === ycoordinate) {\n          newrightvertexindex = nextrightvertexindex\n        }\n        if ((newleftvertexindex !== activepolygon.leftvertexindex) && (newleftvertexindex === newrightvertexindex)) {\n          // We have increased leftvertexindex or decreased rightvertexindex, and now they point to the same vertex\n          // This means that this is the bottom point of the polygon. We'll remove it:\n          activepolygons.splice(activepolygonindex, 1)\n          --activepolygonindex\n        } else {\n          activepolygon.leftvertexindex = newleftvertexindex\n          activepolygon.rightvertexindex = newrightvertexindex\n          activepolygon.topleft = vertices2d[newleftvertexindex]\n          activepolygon.topright = vertices2d[newrightvertexindex]\n          let nextleftvertexindex = newleftvertexindex + 1\n          if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0\n          activepolygon.bottomleft = vertices2d[nextleftvertexindex]\n          let nextrightvertexindex = newrightvertexindex - 1\n          if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1\n          activepolygon.bottomright = vertices2d[nextrightvertexindex]\n        }\n      } // if polygon has corner here\n    } // for activepolygonindex\n    let nextycoordinate\n    if (yindex >= ycoordinates.length - 1) {\n      // last row, all polygons must be finished here:\n      activepolygons = []\n      nextycoordinate = null\n    } else { // yindex < ycoordinates.length-1\n      nextycoordinate = Number(ycoordinates[yindex + 1])\n      const middleycoordinate = 0.5 * (ycoordinate + nextycoordinate)\n      // update activepolygons by adding any polygons that start here:\n      const startingpolygonindexes = topy2polygonindexes.get(ycoordinate)\n      for (const polygonindexKey in startingpolygonindexes) {\n        const polygonindex = startingpolygonindexes[polygonindexKey]\n        const vertices2d = polygonvertices2d[polygonindex]\n        const numvertices = vertices2d.length\n        const topvertexindex = polygontopvertexindexes[polygonindex]\n        // the top of the polygon may be a horizontal line. In that case topvertexindex can point to any point on this line.\n        // Find the left and right topmost vertices which have the current y coordinate:\n        let topleftvertexindex = topvertexindex\n        while (true) {\n          let i = topleftvertexindex + 1\n          if (i >= numvertices) i = 0\n          if (vertices2d[i][1] !== ycoordinate) break\n          if (i === topvertexindex) break // should not happen, but just to prevent endless loops\n          topleftvertexindex = i\n        }\n        let toprightvertexindex = topvertexindex\n        while (true) {\n          let i = toprightvertexindex - 1\n          if (i < 0) i = numvertices - 1\n          if (vertices2d[i][1] !== ycoordinate) break\n          if (i === topleftvertexindex) break // should not happen, but just to prevent endless loops\n          toprightvertexindex = i\n        }\n        let nextleftvertexindex = topleftvertexindex + 1\n        if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0\n        let nextrightvertexindex = toprightvertexindex - 1\n        if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1\n        const newactivepolygon = {\n          polygonindex: polygonindex,\n          leftvertexindex: topleftvertexindex,\n          rightvertexindex: toprightvertexindex,\n          topleft: vertices2d[topleftvertexindex],\n          topright: vertices2d[toprightvertexindex],\n          bottomleft: vertices2d[nextleftvertexindex],\n          bottomright: vertices2d[nextrightvertexindex]\n        }\n        insertSorted(activepolygons, newactivepolygon, (el1, el2) => {\n          const x1 = interpolateBetween2DPointsForY(el1.topleft, el1.bottomleft, middleycoordinate)\n          const x2 = interpolateBetween2DPointsForY(el2.topleft, el2.bottomleft, middleycoordinate)\n          if (x1 > x2) return 1\n          if (x1 < x2) return -1\n          return 0\n        })\n      } // for(let polygonindex in startingpolygonindexes)\n    } //  yindex < ycoordinates.length-1\n\n    // Now activepolygons is up to date\n    // Build the output polygons for the next row in newoutpolygonrow:\n    for (const activepolygonKey in activepolygons) {\n      const activepolygon = activepolygons[activepolygonKey]\n\n      let x = interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, ycoordinate)\n      const topleft = vec2.fromValues(x, ycoordinate)\n      x = interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, ycoordinate)\n      const topright = vec2.fromValues(x, ycoordinate)\n      x = interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, nextycoordinate)\n      const bottomleft = vec2.fromValues(x, nextycoordinate)\n      x = interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, nextycoordinate)\n      const bottomright = vec2.fromValues(x, nextycoordinate)\n      const outpolygon = {\n        topleft: topleft,\n        topright: topright,\n        bottomleft: bottomleft,\n        bottomright: bottomright,\n        leftline: line2.fromPoints(line2.create(), topleft, bottomleft),\n        rightline: line2.fromPoints(line2.create(), bottomright, topright)\n      }\n      if (newoutpolygonrow.length > 0) {\n        const prevoutpolygon = newoutpolygonrow[newoutpolygonrow.length - 1]\n        const d1 = vec2.distance(outpolygon.topleft, prevoutpolygon.topright)\n        const d2 = vec2.distance(outpolygon.bottomleft, prevoutpolygon.bottomright)\n        if ((d1 < EPS) && (d2 < EPS)) {\n          // we can join this polygon with the one to the left:\n          outpolygon.topleft = prevoutpolygon.topleft\n          outpolygon.leftline = prevoutpolygon.leftline\n          outpolygon.bottomleft = prevoutpolygon.bottomleft\n          newoutpolygonrow.splice(newoutpolygonrow.length - 1, 1)\n        }\n      }\n      newoutpolygonrow.push(outpolygon)\n    } // for(activepolygon in activepolygons)\n    if (yindex > 0) {\n      // try to match the new polygons against the previous row:\n      const prevcontinuedindexes = new Set()\n      const matchedindexes = new Set()\n      for (let i = 0; i < newoutpolygonrow.length; i++) {\n        const thispolygon = newoutpolygonrow[i]\n        for (let ii = 0; ii < prevoutpolygonrow.length; ii++) {\n          if (!matchedindexes.has(ii)) { // not already processed?\n            // We have a match if the sidelines are equal or if the top coordinates\n            // are on the sidelines of the previous polygon\n            const prevpolygon = prevoutpolygonrow[ii]\n            if (vec2.distance(prevpolygon.bottomleft, thispolygon.topleft) < EPS) {\n              if (vec2.distance(prevpolygon.bottomright, thispolygon.topright) < EPS) {\n                // Yes, the top of this polygon matches the bottom of the previous:\n                matchedindexes.add(ii)\n                // Now check if the joined polygon would remain convex:\n                const v1 = line2.direction(thispolygon.leftline)\n                const v2 = line2.direction(prevpolygon.leftline)\n                const d1 = v1[0] - v2[0]\n\n                const v3 = line2.direction(thispolygon.rightline)\n                const v4 = line2.direction(prevpolygon.rightline)\n                const d2 = v3[0] - v4[0]\n\n                const leftlinecontinues = Math.abs(d1) < EPS\n                const rightlinecontinues = Math.abs(d2) < EPS\n                const leftlineisconvex = leftlinecontinues || (d1 >= 0)\n                const rightlineisconvex = rightlinecontinues || (d2 >= 0)\n                if (leftlineisconvex && rightlineisconvex) {\n                  // yes, both sides have convex corners:\n                  // This polygon will continue the previous polygon\n                  thispolygon.outpolygon = prevpolygon.outpolygon\n                  thispolygon.leftlinecontinues = leftlinecontinues\n                  thispolygon.rightlinecontinues = rightlinecontinues\n                  prevcontinuedindexes.add(ii)\n                }\n                break\n              }\n            }\n          } // if(!prevcontinuedindexes.has(ii))\n        } // for ii\n      } // for i\n      for (let ii = 0; ii < prevoutpolygonrow.length; ii++) {\n        if (!prevcontinuedindexes.has(ii)) {\n          // polygon ends here\n          // Finish the polygon with the last point(s):\n          const prevpolygon = prevoutpolygonrow[ii]\n          prevpolygon.outpolygon.rightpoints.push(prevpolygon.bottomright)\n          if (vec2.distance(prevpolygon.bottomright, prevpolygon.bottomleft) > EPS) {\n            // polygon ends with a horizontal line:\n            prevpolygon.outpolygon.leftpoints.push(prevpolygon.bottomleft)\n          }\n          // reverse the left half so we get a counterclockwise circle:\n          prevpolygon.outpolygon.leftpoints.reverse()\n          const points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints)\n          const vertices3d = points2d.map((point2d) => orthobasis.to3D(point2d))\n          const polygon = poly3.fromPointsAndPlane(vertices3d, plane) // TODO support shared\n\n          // if we let empty polygon out, next retesselate will crash\n          if (polygon.vertices.length) destpolygons.push(polygon)\n        }\n      }\n    } // if(yindex > 0)\n    for (let i = 0; i < newoutpolygonrow.length; i++) {\n      const thispolygon = newoutpolygonrow[i]\n      if (!thispolygon.outpolygon) {\n        // polygon starts here:\n        thispolygon.outpolygon = {\n          leftpoints: [],\n          rightpoints: []\n        }\n        thispolygon.outpolygon.leftpoints.push(thispolygon.topleft)\n        if (vec2.distance(thispolygon.topleft, thispolygon.topright) > EPS) {\n          // we have a horizontal line at the top:\n          thispolygon.outpolygon.rightpoints.push(thispolygon.topright)\n        }\n      } else {\n        // continuation of a previous row\n        if (!thispolygon.leftlinecontinues) {\n          thispolygon.outpolygon.leftpoints.push(thispolygon.topleft)\n        }\n        if (!thispolygon.rightlinecontinues) {\n          thispolygon.outpolygon.rightpoints.push(thispolygon.topright)\n        }\n      }\n    }\n    prevoutpolygonrow = newoutpolygonrow\n  } // for yindex\n  return destpolygons\n}\n\nmodule.exports = reTesselateCoplanarPolygons\n","const geom3 = require('../../geometries/geom3')\nconst poly3 = require('../../geometries/poly3')\n\nconst aboutEqualNormals = require('../../maths/utils/aboutEqualNormals')\n\nconst reTesselateCoplanarPolygons = require('./reTesselateCoplanarPolygons')\n\nconst coplanar = (plane1, plane2) => {\n  // expect the same distance from the origin, within tolerance\n  if (Math.abs(plane1[3] - plane2[3]) < 0.00000015) {\n    return aboutEqualNormals(plane1, plane2)\n  }\n  return false\n}\n\n/*\n  After boolean operations all coplanar polygon fragments are joined by a retesselating\n  operation. geom3.reTesselate(geom).\n  Retesselation is done through a linear sweep over the polygon surface.\n  The sweep line passes over the y coordinates of all vertices in the polygon.\n  Polygons are split at each sweep line, and the fragments are joined horizontally and vertically into larger polygons\n  (making sure that we will end up with convex polygons).\n*/\nconst retessellate = (geometry) => {\n  if (geometry.isRetesselated) {\n    return geometry\n  }\n\n  const polygons = geom3.toPolygons(geometry)\n  const polygonsPerPlane = [] // elements: [plane, [poly3...]]\n  polygons.forEach((polygon) => {\n    const mapping = polygonsPerPlane.find((element) => coplanar(element[0], poly3.plane(polygon)))\n    if (mapping) {\n      const polygons = mapping[1]\n      polygons.push(polygon)\n    } else {\n      polygonsPerPlane.push([poly3.plane(polygon), [polygon]])\n    }\n  })\n\n  let destpolygons = []\n  polygonsPerPlane.forEach((mapping) => {\n    const sourcepolygons = mapping[1]\n    const retesselayedpolygons = reTesselateCoplanarPolygons(sourcepolygons)\n    destpolygons = destpolygons.concat(retesselayedpolygons)\n  })\n\n  const result = geom3.create(destpolygons)\n  result.isRetesselated = true\n\n  return result\n}\n\nmodule.exports = retessellate\n","const flatten = require('../../utils/flatten')\n\nconst vec2 = require('../../maths/vec2')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\nconst measureEpsilon = require('../../measurements/measureEpsilon')\n\nconst snapPolygons = require('./snapPolygons')\n\nconst snapPath2 = (geometry) => {\n  const epsilon = measureEpsilon(geometry)\n  const points = path2.toPoints(geometry)\n  const newpoints = points.map((point) => vec2.snap(vec2.create(), point, epsilon))\n  // snap can produce duplicate points, remove those\n  return path2.create(newpoints)\n}\n\nconst snapGeom2 = (geometry) => {\n  const epsilon = measureEpsilon(geometry)\n  const sides = geom2.toSides(geometry)\n  let newsides = sides.map((side) => [vec2.snap(vec2.create(), side[0], epsilon), vec2.snap(vec2.create(), side[1], epsilon)])\n  // snap can produce sides with zero (0) length, remove those\n  newsides = newsides.filter((side) => !vec2.equals(side[0], side[1]))\n  return geom2.create(newsides)\n}\n\nconst snapGeom3 = (geometry) => {\n  const epsilon = measureEpsilon(geometry)\n  const polygons = geom3.toPolygons(geometry)\n  const newpolygons = snapPolygons(epsilon, polygons)\n  return geom3.create(newpolygons)\n}\n\n/**\n * Snap the given geometries to the overall precision (epsilon) of the geometry.\n * @see measurements.measureEpsilon()\n * @param {...Object} geometries - the geometries to snap\n * @return {Object|Array} the snapped geometry, or a list of snapped geometries\n * @alias module:modeling/modifiers.snap\n */\nconst snap = (...geometries) => {\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('wrong number of arguments')\n\n  const results = geometries.map((geometry) => {\n    if (path2.isA(geometry)) return snapPath2(geometry)\n    if (geom2.isA(geometry)) return snapGeom2(geometry)\n    if (geom3.isA(geometry)) return snapGeom3(geometry)\n    return geometry\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = snap\n","const vec3 = require('../../maths/vec3')\n\nconst poly3 = require('../../geometries/poly3')\n\nconst isValidPoly3 = (epsilon, polygon) => {\n  const area = Math.abs(poly3.measureArea(polygon))\n  return (Number.isFinite(area) && area > epsilon)\n}\n\n/*\n * Snap the given list of polygons to the epsilon.\n */\nconst snapPolygons = (epsilon, polygons) => {\n  let newpolygons = polygons.map((polygon) => {\n    const snapvertices = polygon.vertices.map((vertice) => vec3.snap(vec3.create(), vertice, epsilon))\n    // only retain unique vertices\n    const newvertices = []\n    for (let i = 0; i < snapvertices.length; i++) {\n      const j = (i + 1) % snapvertices.length\n      if (!vec3.equals(snapvertices[i], snapvertices[j])) newvertices.push(snapvertices[i])\n    }\n    const newpolygon = poly3.create(newvertices)\n    if (polygon.color) newpolygon.color = polygon.color\n    return newpolygon\n  })\n  // snap can produce polygons with zero (0) area, remove those\n  const epsilonArea = (epsilon * epsilon * Math.sqrt(3) / 4)\n  newpolygons = newpolygons.filter((polygon) => isValidPoly3(epsilonArea, polygon))\n  return newpolygons\n}\n\nmodule.exports = snapPolygons\n","const vec3 = require('../../maths/vec3')\nconst poly3 = require('../../geometries/poly3')\n\nconst triangulatePolygon = (epsilon, polygon, triangles) => {\n  const nv = polygon.vertices.length\n  if (nv > 3) {\n    if (nv > 4) {\n      // split the polygon using a midpoint\n      const midpoint = [0, 0, 0]\n      polygon.vertices.forEach((vertice) => vec3.add(midpoint, midpoint, vertice))\n      vec3.snap(midpoint, vec3.divide(midpoint, midpoint, [nv, nv, nv]), epsilon)\n      for (let i = 0; i < nv; i++) {\n        const poly = poly3.create([midpoint, polygon.vertices[i], polygon.vertices[(i + 1) % nv]])\n        if (polygon.color) poly.color = polygon.color\n        triangles.push(poly)\n      }\n      return\n    }\n    // exactly 4 vertices, use simple triangulation\n    const poly0 = poly3.create([polygon.vertices[0], polygon.vertices[1], polygon.vertices[2]])\n    const poly1 = poly3.create([polygon.vertices[0], polygon.vertices[2], polygon.vertices[3]])\n    if (polygon.color) {\n      poly0.color = polygon.color\n      poly1.color = polygon.color\n    }\n    triangles.push(poly0, poly1)\n    return\n  }\n  // exactly 3 vertices, so return the original\n  triangles.push(polygon)\n}\n\n/*\n * Convert the given polygons into a list of triangles (polygons with 3 vertices).\n * NOTE: this is possible because poly3 is CONVEX by definition\n */\nconst triangulatePolygons = (epsilon, polygons) => {\n  const triangles = []\n  polygons.forEach((polygon) => {\n    triangulatePolygon(epsilon, polygon, triangles)\n  })\n  return triangles\n}\n\nmodule.exports = triangulatePolygons\n","const flatten = require('../../utils/flatten')\nconst padArrayToLength = require('../../utils/padArrayToLength')\nconst measureAggregateBoundingBox = require('../../measurements/measureAggregateBoundingBox')\nconst { translate } = require('./translate')\n\nconst validateOptions = (options) => {\n  if (!Array.isArray(options.modes) || options.modes.length > 3) throw new Error('align(): modes must be an array of length <= 3')\n  options.modes = padArrayToLength(options.modes, 'none', 3)\n  if (options.modes.filter((mode) => ['center', 'max', 'min', 'none'].includes(mode)).length !== 3) throw new Error('align(): all modes must be one of \"center\", \"max\" or \"min\"')\n\n  if (!Array.isArray(options.relativeTo) || options.relativeTo.length > 3) throw new Error('align(): relativeTo must be an array of length <= 3')\n  options.relativeTo = padArrayToLength(options.relativeTo, 0, 3)\n  if (options.relativeTo.filter((alignVal) => (Number.isFinite(alignVal) || alignVal == null)).length !== 3) throw new Error('align(): all relativeTo values must be a number, or null.')\n\n  if (typeof options.grouped !== 'boolean') throw new Error('align(): grouped must be a boolean value.')\n\n  return options\n}\n\nconst populateRelativeToFromBounds = (relativeTo, modes, bounds) => {\n  for (let i = 0; i < 3; i++) {\n    if (relativeTo[i] == null) {\n      if (modes[i] === 'center') {\n        relativeTo[i] = (bounds[0][i] + bounds[1][i]) / 2\n      } else if (modes[i] === 'max') {\n        relativeTo[i] = bounds[1][i]\n      } else if (modes[i] === 'min') {\n        relativeTo[i] = bounds[0][i]\n      }\n    }\n  }\n  return relativeTo\n}\n\nconst alignGeometries = (geometry, modes, relativeTo) => {\n  const bounds = measureAggregateBoundingBox(geometry)\n  const translation = [0, 0, 0]\n  for (let i = 0; i < 3; i++) {\n    if (modes[i] === 'center') {\n      translation[i] = relativeTo[i] - (bounds[0][i] + bounds[1][i]) / 2\n    } else if (modes[i] === 'max') {\n      translation[i] = relativeTo[i] - bounds[1][i]\n    } else if (modes[i] === 'min') {\n      translation[i] = relativeTo[i] - bounds[0][i]\n    }\n  }\n\n  return translate(translation, geometry)\n}\n\n/**\n * Align the boundaries of the given geometries using the given options.\n * @param {Object} options - options for aligning\n * @param {Array} [options.modes = ['center', 'center', 'min']] - the point on the geometries to align to for each axis. Valid options are \"center\", \"max\", \"min\", and \"none\".\n * @param {Array} [options.relativeTo = [0,0,0]] - The point one each axis on which to align the geometries upon.  If the value is null, then the corresponding value from the group's bounding box is used.\n * @param {Boolean} [options.grouped = false] - if true, transform all geometries by the same amount, maintaining the relative positions to each other.\n * @param {...Object} geometries - the geometries to align\n * @return {Object|Array} the aligned geometry, or a list of aligned geometries\n * @alias module:modeling/transforms.align\n *\n * @example\n * let alignedGeometries = align({modes: ['min', 'center', 'none'], relativeTo: [10, null, 10], grouped: true }, geometries)\n */\nconst align = (options, ...geometries) => {\n  const defaults = {\n    modes: ['center', 'center', 'min'],\n    relativeTo: [0, 0, 0],\n    grouped: false\n  }\n  options = Object.assign({}, defaults, options)\n\n  options = validateOptions(options)\n  let { modes, relativeTo, grouped } = options\n  geometries = flatten(geometries)\n  if (geometries.length === 0) throw new Error('align(): No geometries were provided to act upon')\n\n  if (relativeTo.filter((val) => val == null).length) {\n    const bounds = measureAggregateBoundingBox(geometries)\n    relativeTo = populateRelativeToFromBounds(relativeTo, modes, bounds)\n  }\n  if (grouped) {\n    geometries = alignGeometries(geometries, modes, relativeTo)\n  } else {\n    geometries = geometries.map((geometry) => alignGeometries(geometry, modes, relativeTo))\n  }\n  return geometries.length === 1 ? geometries[0] : geometries\n}\n\nmodule.exports = align\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\nconst measureBoundingBox = require('../../measurements/measureBoundingBox')\n\nconst { translate } = require('./translate')\n\nconst centerGeometry = (options, object) => {\n  const defaults = {\n    axes: [true, true, true],\n    relativeTo: [0, 0, 0]\n  }\n  const { axes, relativeTo } = Object.assign({}, defaults, options)\n\n  const bounds = measureBoundingBox(object)\n  const offset = [0, 0, 0]\n  if (axes[0]) offset[0] = relativeTo[0] - (bounds[0][0] + ((bounds[1][0] - bounds[0][0]) / 2))\n  if (axes[1]) offset[1] = relativeTo[1] - (bounds[0][1] + ((bounds[1][1] - bounds[0][1]) / 2))\n  if (axes[2]) offset[2] = relativeTo[2] - (bounds[0][2] + ((bounds[1][2] - bounds[0][2]) / 2))\n  return translate(offset, object)\n}\n\n/**\n * Center the given objects using the given options.\n * @param {Object} options - options for centering\n * @param {Array} [options.axes=[true,true,true]] - axis of which to center, true or false\n * @param {Array} [options.relativeTo=[0,0,0]] - relative point of which to center the objects\n * @param {...Object} objects - the objects to center\n * @return {Object|Array} the centered object, or a list of centered objects\n * @alias module:modeling/transforms.center\n *\n * @example\n * let myshape = center({axes: [true,false,false]}, sphere()) // center about the X axis\n */\nconst center = (options, ...objects) => {\n  const defaults = {\n    axes: [true, true, true],\n    relativeTo: [0, 0, 0]\n  // TODO: Add additional 'methods' of centering: midpoint, centroid\n  }\n  const { axes, relativeTo } = Object.assign({}, defaults, options)\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n  if (relativeTo.length !== 3) throw new Error('relativeTo must be an array of length 3')\n\n  options = { axes, relativeTo }\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return centerGeometry(options, object)\n    if (geom2.isA(object)) return centerGeometry(options, object)\n    if (geom3.isA(object)) return centerGeometry(options, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\n/**\n * Center the given objects about the X axis.\n * @param {...Object} objects - the objects to center\n * @return {Object|Array} the centered object, or a list of centered objects\n * @alias module:modeling/transforms.centerX\n */\nconst centerX = (...objects) => center({ axes: [true, false, false] }, objects)\n\n/**\n * Center the given objects about the Y axis.\n * @param {...Object} objects - the objects to center\n * @return {Object|Array} the centered object, or a list of centered objects\n * @alias module:modeling/transforms.centerY\n */\nconst centerY = (...objects) => center({ axes: [false, true, false] }, objects)\n\n/**\n * Center the given objects about the Z axis.\n * @param {...Object} objects - the objects to center\n * @return {Object|Array} the centered object, or a list of centered objects\n * @alias module:modeling/transforms.centerZ\n */\nconst centerZ = (...objects) => center({ axes: [false, false, true] }, objects)\n\nmodule.exports = {\n  center,\n  centerX,\n  centerY,\n  centerZ\n}\n","/**\n * All shapes (primitives or the results of operations) can be transformed, such as scaled or rotated.\n * In all cases, the function returns the results, and never changes the original shapes.\n * @module modeling/transforms\n * @example\n * const { center, rotateX, translate } = require('@jscad/modeling').transforms\n */\nmodule.exports = {\n  align: require('./align'),\n\n  center: require('./center').center,\n  centerX: require('./center').centerX,\n  centerY: require('./center').centerY,\n  centerZ: require('./center').centerZ,\n\n  mirror: require('./mirror').mirror,\n  mirrorX: require('./mirror').mirrorX,\n  mirrorY: require('./mirror').mirrorY,\n  mirrorZ: require('./mirror').mirrorZ,\n\n  rotate: require('./rotate').rotate,\n  rotateX: require('./rotate').rotateX,\n  rotateY: require('./rotate').rotateY,\n  rotateZ: require('./rotate').rotateZ,\n\n  scale: require('./scale').scale,\n  scaleX: require('./scale').scaleX,\n  scaleY: require('./scale').scaleY,\n  scaleZ: require('./scale').scaleZ,\n\n  transform: require('./transform'),\n\n  translate: require('./translate').translate,\n  translateX: require('./translate').translateX,\n  translateY: require('./translate').translateY,\n  translateZ: require('./translate').translateZ\n}\n","const flatten = require('../../utils/flatten')\n\nconst mat4 = require('../../maths/mat4')\nconst plane = require('../../maths/plane')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\n/**\n * Mirror the given objects using the given options.\n * @param {Object} options - options for mirror\n * @param {Array} [options.origin=[0,0,0]] - the origin of the plane\n * @param {Array} [options.normal=[0,0,1]] - the normal vector of the plane\n * @param {...Object} objects - the objects to mirror\n * @return {Object|Array} the mirrored object, or a list of mirrored objects\n * @alias module:modeling/transforms.mirror\n *\n * @example\n * let myshape = mirror({normal: [0,0,10]}, cube({center: [0,0,15], radius: [20, 25, 5]}))\n */\nconst mirror = (options, ...objects) => {\n  const defaults = {\n    origin: [0, 0, 0],\n    normal: [0, 0, 1] // Z axis\n  }\n  const { origin, normal } = Object.assign({}, defaults, options)\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  const planeOfMirror = plane.fromNormalAndPoint(plane.create(), normal, origin)\n  // verify the plane, i.e. check that the given normal was valid\n  if (Number.isNaN(planeOfMirror[0])) {\n    throw new Error('the given origin and normal do not define a proper plane')\n  }\n\n  const matrix = mat4.mirrorByPlane(mat4.create(), planeOfMirror)\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return path2.transform(matrix, object)\n    if (geom2.isA(object)) return geom2.transform(matrix, object)\n    if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\n/**\n * Mirror the given objects about the X axis.\n * @param {...Object} objects - the objects to mirror\n * @return {Object|Array} the mirrored object, or a list of mirrored objects\n * @alias module:modeling/transforms.mirrorX\n */\nconst mirrorX = (...objects) => mirror({ normal: [1, 0, 0] }, objects)\n\n/**\n * Mirror the given objects about the Y axis.\n * @param {...Object} objects - the geometries to mirror\n * @return {Object|Array} the mirrored object, or a list of mirrored objects\n * @alias module:modeling/transforms.mirrorY\n */\nconst mirrorY = (...objects) => mirror({ normal: [0, 1, 0] }, objects)\n\n/**\n * Mirror the given objects about the Z axis.\n * @param {...Object} objects - the geometries to mirror\n * @return {Object|Array} the mirrored object, or a list of mirrored objects\n * @alias module:modeling/transforms.mirrorZ\n */\nconst mirrorZ = (...objects) => mirror({ normal: [0, 0, 1] }, objects)\n\nmodule.exports = {\n  mirror,\n  mirrorX,\n  mirrorY,\n  mirrorZ\n}\n","const flatten = require('../../utils/flatten')\n\nconst mat4 = require('../../maths/mat4')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\n/**\n * Rotate the given objects using the given options.\n * @param {Array} angles - angle (RADIANS) of rotations about X, Y, and Z axis\n * @param {...Object} objects - the objects to rotate\n * @return {Object|Array} the rotated object, or a list of rotated objects\n * @alias module:modeling/transforms.rotate\n *\n * @example\n * const newsphere = rotate([TAU / 8, 0, 0], sphere())\n */\nconst rotate = (angles, ...objects) => {\n  if (!Array.isArray(angles)) throw new Error('angles must be an array')\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  // adjust the angles if necessary\n  angles = angles.slice() // don't modify the original\n  while (angles.length < 3) angles.push(0)\n\n  const yaw = angles[2]\n  const pitch = angles[1]\n  const roll = angles[0]\n\n  const matrix = mat4.fromTaitBryanRotation(mat4.create(), yaw, pitch, roll)\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return path2.transform(matrix, object)\n    if (geom2.isA(object)) return geom2.transform(matrix, object)\n    if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\n/**\n * Rotate the given objects about the X axis, using the given options.\n * @param {Number} angle - angle (RADIANS) of rotations about X\n * @param {...Object} objects - the objects to rotate\n * @return {Object|Array} the rotated object, or a list of rotated objects\n * @alias module:modeling/transforms.rotateX\n */\nconst rotateX = (angle, ...objects) => rotate([angle, 0, 0], objects)\n\n/**\n * Rotate the given objects about the Y axis, using the given options.\n * @param {Number} angle - angle (RADIANS) of rotations about Y\n * @param {...Object} objects - the objects to rotate\n * @return {Object|Array} the rotated object, or a list of rotated objects\n * @alias module:modeling/transforms.rotateY\n */\nconst rotateY = (angle, ...objects) => rotate([0, angle, 0], objects)\n\n/**\n * Rotate the given objects about the Z axis, using the given options.\n * @param {Number} angle - angle (RADIANS) of rotations about Z\n * @param {...Object} objects - the objects to rotate\n * @return {Object|Array} the rotated object, or a list of rotated objects\n * @alias module:modeling/transforms.rotateZ\n */\nconst rotateZ = (angle, ...objects) => rotate([0, 0, angle], objects)\n\nmodule.exports = {\n  rotate,\n  rotateX,\n  rotateY,\n  rotateZ\n}\n","const flatten = require('../../utils/flatten')\n\nconst mat4 = require('../../maths/mat4')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\n/**\n * Scale the given objects using the given options.\n * @param {Array} factors - X, Y, Z factors by which to scale the objects\n * @param {...Object} objects - the objects to scale\n * @return {Object|Array} the scaled object, or a list of scaled objects\n * @alias module:modeling/transforms.scale\n *\n * @example\n * let myshape = scale([5, 0, 10], sphere())\n */\nconst scale = (factors, ...objects) => {\n  if (!Array.isArray(factors)) throw new Error('factors must be an array')\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  // adjust the factors if necessary\n  factors = factors.slice() // don't modify the original\n  while (factors.length < 3) factors.push(1)\n\n  if (factors[0] <= 0 || factors[1] <= 0 || factors[2] <= 0) throw new Error('factors must be positive')\n\n  const matrix = mat4.fromScaling(mat4.create(), factors)\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return path2.transform(matrix, object)\n    if (geom2.isA(object)) return geom2.transform(matrix, object)\n    if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\n/**\n * Scale the given objects about the X axis using the given options.\n * @param {Number} factor - X factor by which to scale the objects\n * @param {...Object} objects - the objects to scale\n * @return {Object|Array} the scaled object, or a list of scaled objects\n * @alias module:modeling/transforms.scaleX\n */\nconst scaleX = (factor, ...objects) => scale([factor, 1, 1], objects)\n\n/**\n * Scale the given objects about the Y axis using the given options.\n * @param {Number} factor - Y factor by which to scale the objects\n * @param {...Object} objects - the objects to scale\n * @return {Object|Array} the scaled object, or a list of scaled objects\n * @alias module:modeling/transforms.scaleY\n */\nconst scaleY = (factor, ...objects) => scale([1, factor, 1], objects)\n\n/**\n * Scale the given objects about the Z axis using the given options.\n * @param {Number} factor - Z factor by which to scale the objects\n * @param {...Object} objects - the objects to scale\n * @return {Object|Array} the scaled object, or a list of scaled objects\n * @alias module:modeling/transforms.scaleZ\n */\nconst scaleZ = (factor, ...objects) => scale([1, 1, factor], objects)\n\nmodule.exports = {\n  scale,\n  scaleX,\n  scaleY,\n  scaleZ\n}\n","const flatten = require('../../utils/flatten')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\n/**\n * Transform the given objects using the given matrix.\n * @param {mat4} matrix - a transformation matrix\n * @param {...Object} objects - the objects to transform\n * @return {Object|Array} the transformed object, or a list of transformed objects\n * @alias module:modeling/transforms.transform\n *\n * @example\n * const newsphere = transform(mat4.rotateX(TAU / 8), sphere())\n */\nconst transform = (matrix, ...objects) => {\n  // TODO how to check that the matrix is REAL?\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return path2.transform(matrix, object)\n    if (geom2.isA(object)) return geom2.transform(matrix, object)\n    if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = transform\n","const flatten = require('../../utils/flatten')\n\nconst mat4 = require('../../maths/mat4')\n\nconst geom2 = require('../../geometries/geom2')\nconst geom3 = require('../../geometries/geom3')\nconst path2 = require('../../geometries/path2')\n\n/**\n * Translate the given objects using the given options.\n * @param {Array} offset - offset (vector) of which to translate the objects\n * @param {...Object} objects - the objects to translate\n * @return {Object|Array} the translated object, or a list of translated objects\n * @alias module:modeling/transforms.translate\n *\n * @example\n * const newsphere = translate([5, 0, 10], sphere())\n */\nconst translate = (offset, ...objects) => {\n  if (!Array.isArray(offset)) throw new Error('offset must be an array')\n\n  objects = flatten(objects)\n  if (objects.length === 0) throw new Error('wrong number of arguments')\n\n  // adjust the offset if necessary\n  offset = offset.slice() // don't modify the original\n  while (offset.length < 3) offset.push(0)\n\n  const matrix = mat4.fromTranslation(mat4.create(), offset)\n\n  const results = objects.map((object) => {\n    if (path2.isA(object)) return path2.transform(matrix, object)\n    if (geom2.isA(object)) return geom2.transform(matrix, object)\n    if (geom3.isA(object)) return geom3.transform(matrix, object)\n    return object\n  })\n  return results.length === 1 ? results[0] : results\n}\n\n/**\n * Translate the given objects along the X axis using the given options.\n * @param {Number} offset - X offset of which to translate the objects\n * @param {...Object} objects - the objects to translate\n * @return {Object|Array} the translated object, or a list of translated objects\n * @alias module:modeling/transforms.translateX\n */\nconst translateX = (offset, ...objects) => translate([offset, 0, 0], objects)\n\n/**\n * Translate the given objects along the Y axis using the given options.\n * @param {Number} offset - Y offset of which to translate the geometries\n * @param {...Object} objects - the objects to translate\n * @return {Object|Array} the translated object, or a list of translated objects\n * @alias module:modeling/transforms.translateY\n */\nconst translateY = (offset, ...objects) => translate([0, offset, 0], objects)\n\n/**\n * Translate the given objects along the Z axis using the given options.\n * @param {Number} offset - Z offset of which to translate the geometries\n * @param {...Object} objects - the objects to translate\n * @return {Object|Array} the translated object, or a list of translated objects\n * @alias module:modeling/transforms.translateZ\n */\nconst translateZ = (offset, ...objects) => translate([0, 0, offset], objects)\n\nmodule.exports = {\n  translate,\n  translateX,\n  translateY,\n  translateZ\n}\n","const { EPS, TAU } = require('../maths/constants')\n\nconst vec2 = require('../maths/vec2')\n\nconst path2 = require('../geometries/path2')\n\nconst { isGT, isGTE, isNumberArray } = require('./commonChecks')\n\n/**\n * Construct an arc in two dimensional space where all points are at the same distance from the center.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of arc\n * @param {Number} [options.radius=1] - radius of arc\n * @param {Number} [options.startAngle=0] - starting angle of the arc, in radians\n * @param {Number} [options.endAngle=TAU] - ending angle of the arc, in radians\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @param {Boolean} [options.makeTangent=false] - adds line segments at both ends of the arc to ensure that the gradients at the edges are tangent\n * @returns {path2} new 2D path\n * @alias module:modeling/primitives.arc\n */\nconst arc = (options) => {\n  const defaults = {\n    center: [0, 0],\n    radius: 1,\n    startAngle: 0,\n    endAngle: TAU,\n    makeTangent: false,\n    segments: 32\n  }\n  let { center, radius, startAngle, endAngle, makeTangent, segments } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 2)) throw new Error('center must be an array of X and Y values')\n  if (!isGT(radius, 0)) throw new Error('radius must be greater than zero')\n  if (!isGTE(startAngle, 0)) throw new Error('startAngle must be positive')\n  if (!isGTE(endAngle, 0)) throw new Error('endAngle must be positive')\n  if (!isGTE(segments, 4)) throw new Error('segments must be four or more')\n\n  startAngle = startAngle % TAU\n  endAngle = endAngle % TAU\n\n  let rotation = TAU\n  if (startAngle < endAngle) {\n    rotation = endAngle - startAngle\n  }\n  if (startAngle > endAngle) {\n    rotation = endAngle + (TAU - startAngle)\n  }\n\n  const minangle = Math.acos(((radius * radius) + (radius * radius) - (EPS * EPS)) / (2 * radius * radius))\n\n  const centerv = vec2.clone(center)\n  let point\n  const pointArray = []\n  if (rotation < minangle) {\n    // there is no rotation, just a single point\n    point = vec2.fromAngleRadians(vec2.create(), startAngle)\n    vec2.scale(point, point, radius)\n    vec2.add(point, point, centerv)\n    pointArray.push(point)\n  } else {\n    // note: add one additional step to acheive full rotation\n    const numsteps = Math.max(1, Math.floor(segments * (rotation / TAU))) + 1\n    let edgestepsize = numsteps * 0.5 / rotation // step size for half a degree\n    if (edgestepsize > 0.25) edgestepsize = 0.25\n\n    const totalsteps = makeTangent ? (numsteps + 2) : numsteps\n    for (let i = 0; i <= totalsteps; i++) {\n      let step = i\n      if (makeTangent) {\n        step = (i - 1) * (numsteps - 2 * edgestepsize) / numsteps + edgestepsize\n        if (step < 0) step = 0\n        if (step > numsteps) step = numsteps\n      }\n      const angle = startAngle + (step * (rotation / numsteps))\n      point = vec2.fromAngleRadians(vec2.create(), angle)\n      vec2.scale(point, point, radius)\n      vec2.add(point, point, centerv)\n      pointArray.push(point)\n    }\n  }\n  return path2.fromPoints({ closed: false }, pointArray)\n}\n\nmodule.exports = arc\n","const { TAU } = require('../maths/constants')\n\nconst ellipse = require('./ellipse')\n\nconst { isGT } = require('./commonChecks')\n\n/**\n * Construct a circle in two dimensional space where all points are at the same distance from the center.\n * @see [ellipse]{@link module:modeling/primitives.ellipse} for more options\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of circle\n * @param {Number} [options.radius=1] - radius of circle\n * @param {Number} [options.startAngle=0] - start angle of circle, in radians\n * @param {Number} [options.endAngle=TAU] - end angle of circle, in radians\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.circle\n * @example\n * let myshape = circle({radius: 10})\n */\nconst circle = (options) => {\n  const defaults = {\n    center: [0, 0],\n    radius: 1,\n    startAngle: 0,\n    endAngle: TAU,\n    segments: 32\n  }\n  let { center, radius, startAngle, endAngle, segments } = Object.assign({}, defaults, options)\n\n  if (!isGT(radius, 0)) throw new Error('radius must be greater than zero')\n\n  radius = [radius, radius]\n\n  return ellipse({ center, radius, startAngle, endAngle, segments })\n}\n\nmodule.exports = circle\n","// verify that the array has the given dimension, and contains Number values\nconst isNumberArray = (array, dimension) => {\n  if (Array.isArray(array) && array.length >= dimension) {\n    return array.every((n) => Number.isFinite(n))\n  }\n  return false\n}\n\n// verify that the value is a Number greater than the constant\nconst isGT = (value, constant) => (Number.isFinite(value) && value > constant)\n\n// verify that the value is a Number greater than or equal to the constant\nconst isGTE = (value, constant) => (Number.isFinite(value) && value >= constant)\n\nmodule.exports = {\n  isNumberArray,\n  isGT,\n  isGTE\n}\n","const cuboid = require('./cuboid')\n\nconst { isGT } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned solid cube in three dimensional space with six square faces.\n * @see [cuboid]{@link module:modeling/primitives.cuboid} for more options\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of cube\n * @param {Number} [options.size=2] - dimension of cube\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.cube\n * @example\n * let myshape = cube({size: 10})\n */\nconst cube = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    size: 2\n  }\n  let { center, size } = Object.assign({}, defaults, options)\n\n  if (!isGT(size, 0)) throw new Error('size must be greater than zero')\n\n  size = [size, size, size]\n\n  return cuboid({ center, size })\n}\n\nmodule.exports = cube\n","const geom3 = require('../geometries/geom3')\nconst poly3 = require('../geometries/poly3')\n\nconst { isNumberArray } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned solid cuboid in three dimensional space.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of cuboid\n * @param {Array} [options.size=[2,2,2]] - dimensions of cuboid; width, depth, height\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.cuboid\n *\n * @example\n * let myshape = cuboid({size: [5, 10, 5]})\n */\nconst cuboid = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    size: [2, 2, 2]\n  }\n  const { center, size } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 3)) throw new Error('center must be an array of X, Y and Z values')\n  if (!isNumberArray(size, 3)) throw new Error('size must be an array of width, depth and height values')\n  if (!size.every((n) => n > 0)) throw new Error('size values must be greater than zero')\n\n  const result = geom3.create(\n    // adjust a basic shape to size\n    [\n      [[0, 4, 6, 2], [-1, 0, 0]],\n      [[1, 3, 7, 5], [+1, 0, 0]],\n      [[0, 1, 5, 4], [0, -1, 0]],\n      [[2, 6, 7, 3], [0, +1, 0]],\n      [[0, 2, 3, 1], [0, 0, -1]],\n      [[4, 5, 7, 6], [0, 0, +1]]\n    ].map((info) => {\n      const points = info[0].map((i) => {\n        const pos = [\n          center[0] + (size[0] / 2) * (2 * !!(i & 1) - 1),\n          center[1] + (size[1] / 2) * (2 * !!(i & 2) - 1),\n          center[2] + (size[2] / 2) * (2 * !!(i & 4) - 1)\n        ]\n        return pos\n      })\n      return poly3.create(points)\n    })\n  )\n  return result\n}\n\nmodule.exports = cuboid\n","const cylinderElliptic = require('./cylinderElliptic')\n\nconst { isGT } = require('./commonChecks')\n\n/**\n * Construct a Z axis-aligned cylinder in three dimensional space.\n * @see [cylinderElliptic]{@link module:modeling/primitives.cylinderElliptic} for more options\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of cylinder\n * @param {Number} [options.height=2] - height of cylinder\n * @param {Number} [options.radius=1] - radius of cylinder (at both start and end)\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom3} new geometry\n * @alias module:modeling/primitives.cylinder\n *\n * @example\n * let myshape = cylinder({height: 2, radius: 10})\n */\nconst cylinder = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    height: 2,\n    radius: 1,\n    segments: 32\n  }\n  const { center, height, radius, segments } = Object.assign({}, defaults, options)\n\n  if (!isGT(radius, 0)) throw new Error('radius must be greater than zero')\n\n  const newoptions = {\n    center,\n    height,\n    startRadius: [radius, radius],\n    endRadius: [radius, radius],\n    segments\n  }\n\n  return cylinderElliptic(newoptions)\n}\n\nmodule.exports = cylinder\n","const { EPS, TAU } = require('../maths/constants')\n\nconst vec3 = require('../maths/vec3')\n\nconst geom3 = require('../geometries/geom3')\nconst poly3 = require('../geometries/poly3')\n\nconst { sin, cos } = require('../maths/utils/trigonometry')\n\nconst { isGT, isGTE, isNumberArray } = require('./commonChecks')\n\n/**\n * Construct a Z axis-aligned elliptic cylinder in three dimensional space.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of cylinder\n * @param {Number} [options.height=2] - height of cylinder\n * @param {Array} [options.startRadius=[1,1]] - radius of rounded start, must be two dimensional array\n * @param {Number} [options.startAngle=0] - start angle of cylinder, in radians\n * @param {Array} [options.endRadius=[1,1]] - radius of rounded end, must be two dimensional array\n * @param {Number} [options.endAngle=TAU] - end angle of cylinder, in radians\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom3} new geometry\n * @alias module:modeling/primitives.cylinderElliptic\n *\n * @example\n * let myshape = cylinderElliptic({height: 2, startRadius: [10,5], endRadius: [8,3]})\n */\nconst cylinderElliptic = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    height: 2,\n    startRadius: [1, 1],\n    startAngle: 0,\n    endRadius: [1, 1],\n    endAngle: TAU,\n    segments: 32\n  }\n  let { center, height, startRadius, startAngle, endRadius, endAngle, segments } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 3)) throw new Error('center must be an array of X, Y and Z values')\n  if (!isGT(height, 0)) throw new Error('height must be greater then zero')\n  if (!isNumberArray(startRadius, 2)) throw new Error('startRadius must be an array of X and Y values')\n  if (!startRadius.every((n) => n >= 0)) throw new Error('startRadius values must be positive')\n  if (!isNumberArray(endRadius, 2)) throw new Error('endRadius must be an array of X and Y values')\n  if (!endRadius.every((n) => n >= 0)) throw new Error('endRadius values must be positive')\n  if (endRadius.every((n) => n === 0) && startRadius.every((n) => n === 0)) throw new Error('at least one radius must be positive')\n  if (!isGTE(startAngle, 0)) throw new Error('startAngle must be positive')\n  if (!isGTE(endAngle, 0)) throw new Error('endAngle must be positive')\n  if (!isGTE(segments, 4)) throw new Error('segments must be four or more')\n\n  startAngle = startAngle % TAU\n  endAngle = endAngle % TAU\n\n  let rotation = TAU\n  if (startAngle < endAngle) {\n    rotation = endAngle - startAngle\n  }\n  if (startAngle > endAngle) {\n    rotation = endAngle + (TAU - startAngle)\n  }\n\n  const minradius = Math.min(startRadius[0], startRadius[1], endRadius[0], endRadius[1])\n  const minangle = Math.acos(((minradius * minradius) + (minradius * minradius) - (EPS * EPS)) /\n                            (2 * minradius * minradius))\n  if (rotation < minangle) throw new Error('startAngle and endAngle do not define a significant rotation')\n\n  const slices = Math.floor(segments * (rotation / TAU))\n\n  const start = vec3.fromValues(0, 0, -(height / 2))\n  const end = vec3.fromValues(0, 0, height / 2)\n  const ray = vec3.subtract(vec3.create(), end, start)\n\n  const axisX = vec3.fromValues(1, 0, 0)\n  const axisY = vec3.fromValues(0, 1, 0)\n\n  const v1 = vec3.create()\n  const v2 = vec3.create()\n  const v3 = vec3.create()\n  const point = (stack, slice, radius) => {\n    const angle = slice * rotation + startAngle\n    vec3.scale(v1, axisX, radius[0] * cos(angle))\n    vec3.scale(v2, axisY, radius[1] * sin(angle))\n    vec3.add(v1, v1, v2)\n\n    vec3.scale(v3, ray, stack)\n    vec3.add(v3, v3, start)\n    return vec3.add(vec3.create(), v1, v3)\n  }\n\n  // adjust the points to center\n  const fromPoints = (...points) => {\n    const newpoints = points.map((point) => vec3.add(vec3.create(), point, center))\n    return poly3.create(newpoints)\n  }\n\n  const polygons = []\n  for (let i = 0; i < slices; i++) {\n    const t0 = i / slices\n    let t1 = (i + 1) / slices\n    // fix rounding error when rotating TAU radians\n    if (rotation === TAU && i === slices - 1) t1 = 0\n\n    if (endRadius[0] === startRadius[0] && endRadius[1] === startRadius[1]) {\n      polygons.push(fromPoints(start, point(0, t1, endRadius), point(0, t0, endRadius)))\n      polygons.push(fromPoints(point(0, t1, endRadius), point(1, t1, endRadius), point(1, t0, endRadius), point(0, t0, endRadius)))\n      polygons.push(fromPoints(end, point(1, t0, endRadius), point(1, t1, endRadius)))\n    } else {\n      if (startRadius[0] > 0 && startRadius[1] > 0) {\n        polygons.push(fromPoints(start, point(0, t1, startRadius), point(0, t0, startRadius)))\n      }\n      if (startRadius[0] > 0 || startRadius[1] > 0) {\n        polygons.push(fromPoints(point(0, t0, startRadius), point(0, t1, startRadius), point(1, t0, endRadius)))\n      }\n      if (endRadius[0] > 0 && endRadius[1] > 0) {\n        polygons.push(fromPoints(end, point(1, t0, endRadius), point(1, t1, endRadius)))\n      }\n      if (endRadius[0] > 0 || endRadius[1] > 0) {\n        polygons.push(fromPoints(point(1, t0, endRadius), point(0, t1, startRadius), point(1, t1, endRadius)))\n      }\n    }\n  }\n  if (rotation < TAU) {\n    polygons.push(fromPoints(start, point(0, 0, startRadius), end))\n    polygons.push(fromPoints(point(0, 0, startRadius), point(1, 0, endRadius), end))\n    polygons.push(fromPoints(start, end, point(0, 1, startRadius)))\n    polygons.push(fromPoints(point(0, 1, startRadius), end, point(1, 1, endRadius)))\n  }\n  const result = geom3.create(polygons)\n  return result\n}\n\nmodule.exports = cylinderElliptic\n","const { EPS, TAU } = require('../maths/constants')\n\nconst vec2 = require('../maths/vec2')\n\nconst geom2 = require('../geometries/geom2')\n\nconst { sin, cos } = require('../maths/utils/trigonometry')\n\nconst { isGTE, isNumberArray } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned ellipse in two dimensional space.\n * @see https://en.wikipedia.org/wiki/Ellipse\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of ellipse\n * @param {Array} [options.radius=[1,1]] - radius of ellipse, along X and Y\n * @param {Number} [options.startAngle=0] - start angle of ellipse, in radians\n * @param {Number} [options.endAngle=TAU] - end angle of ellipse, in radians\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.ellipse\n * @example\n * let myshape = ellipse({radius: [5,10]})\n */\nconst ellipse = (options) => {\n  const defaults = {\n    center: [0, 0],\n    radius: [1, 1],\n    startAngle: 0,\n    endAngle: TAU,\n    segments: 32\n  }\n  let { center, radius, startAngle, endAngle, segments } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 2)) throw new Error('center must be an array of X and Y values')\n  if (!isNumberArray(radius, 2)) throw new Error('radius must be an array of X and Y values')\n  if (!radius.every((n) => n > 0)) throw new Error('radius values must be greater than zero')\n  if (!isGTE(startAngle, 0)) throw new Error('startAngle must be positive')\n  if (!isGTE(endAngle, 0)) throw new Error('endAngle must be positive')\n  if (!isGTE(segments, 3)) throw new Error('segments must be three or more')\n\n  startAngle = startAngle % TAU\n  endAngle = endAngle % TAU\n\n  let rotation = TAU\n  if (startAngle < endAngle) {\n    rotation = endAngle - startAngle\n  }\n  if (startAngle > endAngle) {\n    rotation = endAngle + (TAU - startAngle)\n  }\n\n  const minradius = Math.min(radius[0], radius[1])\n  const minangle = Math.acos(((minradius * minradius) + (minradius * minradius) - (EPS * EPS)) /\n                            (2 * minradius * minradius))\n  if (rotation < minangle) throw new Error('startAngle and endAngle do not define a significant rotation')\n\n  segments = Math.floor(segments * (rotation / TAU))\n\n  const centerv = vec2.clone(center)\n  const step = rotation / segments // radians per segment\n\n  const points = []\n  segments = (rotation < TAU) ? segments + 1 : segments\n  for (let i = 0; i < segments; i++) {\n    const angle = (step * i) + startAngle\n    const point = vec2.fromValues(radius[0] * cos(angle), radius[1] * sin(angle))\n    vec2.add(point, centerv, point)\n    points.push(point)\n  }\n  if (rotation < TAU) points.push(centerv)\n  return geom2.fromPoints(points)\n}\n\nmodule.exports = ellipse\n","const { TAU } = require('../maths/constants')\nconst vec3 = require('../maths/vec3')\n\nconst geom3 = require('../geometries/geom3')\nconst poly3 = require('../geometries/poly3')\n\nconst { sin, cos } = require('../maths/utils/trigonometry')\n\nconst { isGTE, isNumberArray } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned ellipsoid in three dimensional space.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of ellipsoid\n * @param {Array} [options.radius=[1,1,1]] - radius of ellipsoid, along X, Y and Z\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @param {Array} [options.axes] -  an array with three vectors for the x, y and z base vectors\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.ellipsoid\n *\n * @example\n * let myshape = ellipsoid({radius: [5, 10, 20]})\n*/\nconst ellipsoid = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    radius: [1, 1, 1],\n    segments: 32,\n    axes: [[1, 0, 0], [0, -1, 0], [0, 0, 1]]\n  }\n  const { center, radius, segments, axes } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 3)) throw new Error('center must be an array of X, Y and Z values')\n  if (!isNumberArray(radius, 3)) throw new Error('radius must be an array of X, Y and Z values')\n  if (!radius.every((n) => n > 0)) throw new Error('radius values must be greater than zero')\n  if (!isGTE(segments, 4)) throw new Error('segments must be four or more')\n\n  const xvector = vec3.scale(vec3.create(), vec3.normalize(vec3.create(), axes[0]), radius[0])\n  const yvector = vec3.scale(vec3.create(), vec3.normalize(vec3.create(), axes[1]), radius[1])\n  const zvector = vec3.scale(vec3.create(), vec3.normalize(vec3.create(), axes[2]), radius[2])\n\n  const qsegments = Math.round(segments / 4)\n  let prevcylinderpoint\n  const polygons = []\n  const p1 = vec3.create()\n  const p2 = vec3.create()\n  for (let slice1 = 0; slice1 <= segments; slice1++) {\n    const angle = TAU * slice1 / segments\n    const cylinderpoint = vec3.add(vec3.create(), vec3.scale(p1, xvector, cos(angle)), vec3.scale(p2, yvector, sin(angle)))\n    if (slice1 > 0) {\n      let prevcospitch, prevsinpitch\n      for (let slice2 = 0; slice2 <= qsegments; slice2++) {\n        const pitch = TAU / 4 * slice2 / qsegments\n        const cospitch = cos(pitch)\n        const sinpitch = sin(pitch)\n        if (slice2 > 0) {\n          let points = []\n          let point\n          point = vec3.subtract(vec3.create(), vec3.scale(p1, prevcylinderpoint, prevcospitch), vec3.scale(p2, zvector, prevsinpitch))\n          points.push(vec3.add(point, point, center))\n          point = vec3.subtract(vec3.create(), vec3.scale(p1, cylinderpoint, prevcospitch), vec3.scale(p2, zvector, prevsinpitch))\n          points.push(vec3.add(point, point, center))\n          if (slice2 < qsegments) {\n            point = vec3.subtract(vec3.create(), vec3.scale(p1, cylinderpoint, cospitch), vec3.scale(p2, zvector, sinpitch))\n            points.push(vec3.add(point, point, center))\n          }\n          point = vec3.subtract(vec3.create(), vec3.scale(p1, prevcylinderpoint, cospitch), vec3.scale(p2, zvector, sinpitch))\n          points.push(vec3.add(point, point, center))\n\n          polygons.push(poly3.create(points))\n\n          points = []\n          point = vec3.add(vec3.create(), vec3.scale(p1, prevcylinderpoint, prevcospitch), vec3.scale(p2, zvector, prevsinpitch))\n          points.push(vec3.add(vec3.create(), center, point))\n          point = vec3.add(point, vec3.scale(p1, cylinderpoint, prevcospitch), vec3.scale(p2, zvector, prevsinpitch))\n          points.push(vec3.add(vec3.create(), center, point))\n          if (slice2 < qsegments) {\n            point = vec3.add(point, vec3.scale(p1, cylinderpoint, cospitch), vec3.scale(p2, zvector, sinpitch))\n            points.push(vec3.add(vec3.create(), center, point))\n          }\n          point = vec3.add(point, vec3.scale(p1, prevcylinderpoint, cospitch), vec3.scale(p2, zvector, sinpitch))\n          points.push(vec3.add(vec3.create(), center, point))\n          points.reverse()\n\n          polygons.push(poly3.create(points))\n        }\n        prevcospitch = cospitch\n        prevsinpitch = sinpitch\n      }\n    }\n    prevcylinderpoint = cylinderpoint\n  }\n  return geom3.create(polygons)\n}\n\nmodule.exports = ellipsoid\n","const mat4 = require('../maths/mat4')\nconst vec3 = require('../maths/vec3')\n\nconst geom3 = require('../geometries/geom3')\n\nconst polyhedron = require('./polyhedron')\n\nconst { isGT, isGTE } = require('./commonChecks')\n\n/**\n * Construct a geodesic sphere based on icosahedron symmetry.\n * @param {Object} [options] - options for construction\n * @param {Number} [options.radius=1] - target radius of sphere\n * @param {Number} [options.frequency=6] - subdivision frequency per face, multiples of 6\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.geodesicSphere\n *\n * @example\n * let myshape = geodesicSphere({radius: 15, frequency: 18})\n */\nconst geodesicSphere = (options) => {\n  const defaults = {\n    radius: 1,\n    frequency: 6\n  }\n  let { radius, frequency } = Object.assign({}, defaults, options)\n\n  if (!isGT(radius, 0)) throw new Error('radius must be greater than zero')\n  if (!isGTE(frequency, 6)) throw new Error('frequency must be six or more')\n\n  // adjust the frequency to base 6\n  frequency = Math.floor(frequency / 6)\n\n  const ci = [ // hard-coded data of icosahedron (20 faces, all triangles)\n    [0.850651, 0.000000, -0.525731],\n    [0.850651, -0.000000, 0.525731],\n    [-0.850651, -0.000000, 0.525731],\n    [-0.850651, 0.000000, -0.525731],\n    [0.000000, -0.525731, 0.850651],\n    [0.000000, 0.525731, 0.850651],\n    [0.000000, 0.525731, -0.850651],\n    [0.000000, -0.525731, -0.850651],\n    [-0.525731, -0.850651, -0.000000],\n    [0.525731, -0.850651, -0.000000],\n    [0.525731, 0.850651, 0.000000],\n    [-0.525731, 0.850651, 0.000000]]\n\n  const ti = [[0, 9, 1], [1, 10, 0], [6, 7, 0], [10, 6, 0], [7, 9, 0], [5, 1, 4], [4, 1, 9], [5, 10, 1], [2, 8, 3], [3, 11, 2], [2, 5, 4],\n    [4, 8, 2], [2, 11, 5], [3, 7, 6], [6, 11, 3], [8, 7, 3], [9, 8, 4], [11, 10, 5], [10, 11, 6], [8, 9, 7]]\n\n  const geodesicSubDivide = (p, frequency, offset) => {\n    const p1 = p[0]\n    const p2 = p[1]\n    const p3 = p[2]\n    let n = offset\n    const c = []\n    const f = []\n\n    //           p3\n    //           /\\\n    //          /__\\     frequency = 3\n    //      i  /\\  /\\\n    //        /__\\/__\\       total triangles = 9 (frequency*frequency)\n    //       /\\  /\\  /\\\n    //     0/__\\/__\\/__\\\n    //    p1 0   j      p2\n\n    for (let i = 0; i < frequency; i++) {\n      for (let j = 0; j < frequency - i; j++) {\n        const t0 = i / frequency\n        const t1 = (i + 1) / frequency\n        const s0 = j / (frequency - i)\n        const s1 = (j + 1) / (frequency - i)\n        const s2 = frequency - i - 1 ? j / (frequency - i - 1) : 1\n        const q = []\n\n        q[0] = mix3(mix3(p1, p2, s0), p3, t0)\n        q[1] = mix3(mix3(p1, p2, s1), p3, t0)\n        q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n        // -- normalize\n        for (let k = 0; k < 3; k++) {\n          const r = vec3.length(q[k])\n          for (let l = 0; l < 3; l++) {\n            q[k][l] /= r\n          }\n        }\n        c.push(q[0], q[1], q[2])\n        f.push([n, n + 1, n + 2]); n += 3\n\n        if (j < frequency - i - 1) {\n          const s3 = frequency - i - 1 ? (j + 1) / (frequency - i - 1) : 1\n          q[0] = mix3(mix3(p1, p2, s1), p3, t0)\n          q[1] = mix3(mix3(p1, p2, s3), p3, t1)\n          q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n          // -- normalize\n          for (let k = 0; k < 3; k++) {\n            const r = vec3.length(q[k])\n            for (let l = 0; l < 3; l++) {\n              q[k][l] /= r\n            }\n          }\n          c.push(q[0], q[1], q[2])\n          f.push([n, n + 1, n + 2]); n += 3\n        }\n      }\n    }\n    return { points: c, triangles: f, offset: n }\n  }\n\n  const mix3 = (a, b, f) => {\n    const _f = 1 - f\n    const c = []\n    for (let i = 0; i < 3; i++) {\n      c[i] = a[i] * _f + b[i] * f\n    }\n    return c\n  }\n\n  let points = []\n  let faces = []\n  let offset = 0\n\n  for (let i = 0; i < ti.length; i++) {\n    const g = geodesicSubDivide([ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]]], frequency, offset)\n    points = points.concat(g.points)\n    faces = faces.concat(g.triangles)\n    offset = g.offset\n  }\n\n  let geometry = polyhedron({ points: points, faces: faces, orientation: 'inward' })\n  if (radius !== 1) geometry = geom3.transform(mat4.fromScaling(mat4.create(), [radius, radius, radius]), geometry)\n  return geometry\n}\n\nmodule.exports = geodesicSphere\n","/**\n * Primitives provide the building blocks for complex parts.\n * Each primitive is a geometrical object that can be described mathematically, and therefore precise.\n * Primitives can be logically combined, transformed, extruded, etc.\n * @module modeling/primitives\n * @example\n * const { cube, ellipse, star } = require('@jscad/modeling').primitives\n */\nmodule.exports = {\n  arc: require('./arc'),\n  circle: require('./circle'),\n  cube: require('./cube'),\n  cuboid: require('./cuboid'),\n  cylinder: require('./cylinder'),\n  cylinderElliptic: require('./cylinderElliptic'),\n  ellipse: require('./ellipse'),\n  ellipsoid: require('./ellipsoid'),\n  geodesicSphere: require('./geodesicSphere'),\n  line: require('./line'),\n  polygon: require('./polygon'),\n  polyhedron: require('./polyhedron'),\n  rectangle: require('./rectangle'),\n  roundedCuboid: require('./roundedCuboid'),\n  roundedCylinder: require('./roundedCylinder'),\n  roundedRectangle: require('./roundedRectangle'),\n  sphere: require('./sphere'),\n  square: require('./square'),\n  star: require('./star'),\n  torus: require('./torus'),\n  triangle: require('./triangle')\n}\n","const path2 = require('../geometries/path2')\n\n/**\n * Construct a new line in two dimensional space from the given points.\n * The points must be provided as an array, where each element is a 2D point.\n * @param {Array} points - array of points from which to create the path\n * @returns {path2} new 2D path\n * @alias module:modeling/primitives.line\n *\n * @example\n * let myshape = line([[10, 10], [-10, 10]])\n */\nconst line = (points) => {\n  if (!Array.isArray(points)) throw new Error('points must be an array')\n\n  return path2.fromPoints({}, points)\n}\n\nmodule.exports = line\n","const geom2 = require('../geometries/geom2')\n\n/**\n * Construct a polygon in two dimensional space from a list of points, or a list of points and paths.\n * NOTE: The ordering of points is VERY IMPORTANT.\n * @param {Object} options - options for construction\n * @param {Array} options.points - points of the polygon : either flat or nested array of 2D points\n * @param {Array} [options.paths] - paths of the polygon : either flat or nested array of point indexes\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.polygon\n *\n * @example\n * let roof = [[10,11], [0,11], [5,20]]\n * let wall = [[0,0], [10,0], [10,10], [0,10]]\n *\n * let poly = polygon({ points: roof })\n * or\n * let poly = polygon({ points: [roof, wall] })\n * or\n * let poly = polygon({ points: roof, paths: [0, 1, 2] })\n * or\n * let poly = polygon({ points: [roof, wall], paths: [[0, 1, 2], [3, 4, 5, 6]] })\n */\nconst polygon = (options) => {\n  const defaults = {\n    points: [],\n    paths: []\n  }\n  const { points, paths } = Object.assign({}, defaults, options)\n\n  if (!(Array.isArray(points) && Array.isArray(paths))) throw new Error('points and paths must be arrays')\n\n  let listofpolys = points\n  if (Array.isArray(points[0])) {\n    if (!Array.isArray(points[0][0])) {\n      // points is an array of something... convert to list\n      listofpolys = [points]\n    }\n  }\n\n  listofpolys.forEach((list, i) => {\n    if (!Array.isArray(list)) throw new Error('list of points ' + i + ' must be an array')\n    if (list.length < 3) throw new Error('list of points ' + i + ' must contain three or more points')\n    list.forEach((point, j) => {\n      if (!Array.isArray(point)) throw new Error('list of points ' + i + ', point ' + j + ' must be an array')\n      if (point.length < 2) throw new Error('list of points ' + i + ', point ' + j + ' must contain by X and Y values')\n    })\n  })\n\n  let listofpaths = paths\n  if (paths.length === 0) {\n    // create a list of paths based on the points\n    let count = 0\n    listofpaths = listofpolys.map((list) => list.map((point) => count++))\n  }\n\n  // flatten the listofpoints for indexed access\n  const allpoints = []\n  listofpolys.forEach((list) => list.forEach((point) => allpoints.push(point)))\n\n  let sides = []\n  listofpaths.forEach((path) => {\n    const setofpoints = path.map((index) => allpoints[index])\n    const geometry = geom2.fromPoints(setofpoints)\n    sides = sides.concat(geom2.toSides(geometry))\n  })\n  return geom2.create(sides)\n}\n\nmodule.exports = polygon\n","const geom3 = require('../geometries/geom3')\nconst poly3 = require('../geometries/poly3')\n\nconst { isNumberArray } = require('./commonChecks')\n\n/**\n * Construct a polyhedron in three dimensional space from the given set of 3D points and faces.\n * The faces can define outward or inward facing polygons (orientation).\n * However, each face must define a counter clockwise rotation of points which follows the right hand rule.\n * @param {Object} options - options for construction\n * @param {Array} options.points - list of points in 3D space\n * @param {Array} options.faces - list of faces, where each face is a set of indexes into the points\n * @param {Array} [options.colors=undefined] - list of RGBA colors to apply to each face\n * @param {String} [options.orientation='outward'] - orientation of faces\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.polyhedron\n *\n * @example\n * let mypoints = [ [10, 10, 0], [10, -10, 0], [-10, -10, 0], [-10, 10, 0], [0, 0, 10] ]\n * let myfaces = [ [0, 1, 4], [1, 2, 4], [2, 3, 4], [3, 0, 4], [1, 0, 3], [2, 1, 3] ]\n * let myshape = polyhedron({points: mypoint, faces: myfaces, orientation: 'inward'})\n */\nconst polyhedron = (options) => {\n  const defaults = {\n    points: [],\n    faces: [],\n    colors: undefined,\n    orientation: 'outward'\n  }\n  const { points, faces, colors, orientation } = Object.assign({}, defaults, options)\n\n  if (!(Array.isArray(points) && Array.isArray(faces))) {\n    throw new Error('points and faces must be arrays')\n  }\n  if (points.length < 3) {\n    throw new Error('three or more points are required')\n  }\n  if (faces.length < 1) {\n    throw new Error('one or more faces are required')\n  }\n  if (colors) {\n    if (!Array.isArray(colors)) {\n      throw new Error('colors must be an array')\n    }\n    if (colors.length !== faces.length) {\n      throw new Error('faces and colors must have the same length')\n    }\n  }\n  points.forEach((point, i) => {\n    if (!isNumberArray(point, 3)) throw new Error(`point ${i} must be an array of X, Y, Z values`)\n  })\n  faces.forEach((face, i) => {\n    if (face.length < 3) throw new Error(`face ${i} must contain 3 or more indexes`)\n    if (!isNumberArray(face, face.length)) throw new Error(`face ${i} must be an array of numbers`)\n  })\n\n  // invert the faces if orientation is inwards, as all internals expect outwarding facing polygons\n  if (orientation !== 'outward') {\n    faces.forEach((face) => face.reverse())\n  }\n\n  const polygons = faces.map((face, findex) => {\n    const polygon = poly3.create(face.map((pindex) => points[pindex]))\n    if (colors && colors[findex]) polygon.color = colors[findex]\n    return polygon\n  })\n\n  return geom3.create(polygons)\n}\n\nmodule.exports = polyhedron\n","const vec2 = require('../maths/vec2')\n\nconst geom2 = require('../geometries/geom2')\n\nconst { isNumberArray } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned rectangle in two dimensional space with four sides at right angles.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of rectangle\n * @param {Array} [options.size=[2,2]] - dimension of rectangle, width and length\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.rectangle\n *\n * @example\n * let myshape = rectangle({size: [10, 20]})\n */\nconst rectangle = (options) => {\n  const defaults = {\n    center: [0, 0],\n    size: [2, 2]\n  }\n  const { center, size } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 2)) throw new Error('center must be an array of X and Y values')\n  if (!isNumberArray(size, 2)) throw new Error('size must be an array of X and Y values')\n  if (!size.every((n) => n > 0)) throw new Error('size values must be greater than zero')\n\n  const point = [size[0] / 2, size[1] / 2]\n  const pswap = [point[0], -point[1]]\n\n  const points = [\n    vec2.subtract(vec2.create(), center, point),\n    vec2.add(vec2.create(), center, pswap),\n    vec2.add(vec2.create(), center, point),\n    vec2.subtract(vec2.create(), center, pswap)\n  ]\n  return geom2.fromPoints(points)\n}\n\nmodule.exports = rectangle\n","const { EPS, TAU } = require('../maths/constants')\n\nconst vec2 = require('../maths/vec2')\nconst vec3 = require('../maths/vec3')\n\nconst geom3 = require('../geometries/geom3')\nconst poly3 = require('../geometries/poly3')\n\nconst { sin, cos } = require('../maths/utils/trigonometry')\n\nconst { isGT, isGTE, isNumberArray } = require('./commonChecks')\n\nconst createCorners = (center, size, radius, segments, slice, positive) => {\n  const pitch = (TAU / 4) * slice / segments\n  const cospitch = cos(pitch)\n  const sinpitch = sin(pitch)\n\n  const layersegments = segments - slice\n  let layerradius = radius * cospitch\n  let layeroffset = size[2] - (radius - (radius * sinpitch))\n  if (!positive) layeroffset = (radius - (radius * sinpitch)) - size[2]\n\n  layerradius = layerradius > EPS ? layerradius : 0\n\n  const corner0 = vec3.add(vec3.create(), center, [size[0] - radius, size[1] - radius, layeroffset])\n  const corner1 = vec3.add(vec3.create(), center, [radius - size[0], size[1] - radius, layeroffset])\n  const corner2 = vec3.add(vec3.create(), center, [radius - size[0], radius - size[1], layeroffset])\n  const corner3 = vec3.add(vec3.create(), center, [size[0] - radius, radius - size[1], layeroffset])\n  const corner0Points = []\n  const corner1Points = []\n  const corner2Points = []\n  const corner3Points = []\n  for (let i = 0; i <= layersegments; i++) {\n    const radians = layersegments > 0 ? TAU / 4 * i / layersegments : 0\n    const point2d = vec2.fromAngleRadians(vec2.create(), radians)\n    vec2.scale(point2d, point2d, layerradius)\n    const point3d = vec3.fromVec2(vec3.create(), point2d)\n    corner0Points.push(vec3.add(vec3.create(), corner0, point3d))\n    vec3.rotateZ(point3d, point3d, [0, 0, 0], TAU / 4)\n    corner1Points.push(vec3.add(vec3.create(), corner1, point3d))\n    vec3.rotateZ(point3d, point3d, [0, 0, 0], TAU / 4)\n    corner2Points.push(vec3.add(vec3.create(), corner2, point3d))\n    vec3.rotateZ(point3d, point3d, [0, 0, 0], TAU / 4)\n    corner3Points.push(vec3.add(vec3.create(), corner3, point3d))\n  }\n  if (!positive) {\n    corner0Points.reverse()\n    corner1Points.reverse()\n    corner2Points.reverse()\n    corner3Points.reverse()\n    return [corner3Points, corner2Points, corner1Points, corner0Points]\n  }\n  return [corner0Points, corner1Points, corner2Points, corner3Points]\n}\n\nconst stitchCorners = (previousCorners, currentCorners) => {\n  const polygons = []\n  for (let i = 0; i < previousCorners.length; i++) {\n    const previous = previousCorners[i]\n    const current = currentCorners[i]\n    for (let j = 0; j < (previous.length - 1); j++) {\n      polygons.push(poly3.create([previous[j], previous[j + 1], current[j]]))\n\n      if (j < (current.length - 1)) {\n        polygons.push(poly3.create([current[j], previous[j + 1], current[j + 1]]))\n      }\n    }\n  }\n  return polygons\n}\n\nconst stitchWalls = (previousCorners, currentCorners) => {\n  const polygons = []\n  for (let i = 0; i < previousCorners.length; i++) {\n    let previous = previousCorners[i]\n    let current = currentCorners[i]\n    const p0 = previous[previous.length - 1]\n    const c0 = current[current.length - 1]\n\n    const j = (i + 1) % previousCorners.length\n    previous = previousCorners[j]\n    current = currentCorners[j]\n    const p1 = previous[0]\n    const c1 = current[0]\n\n    polygons.push(poly3.create([p0, p1, c1, c0]))\n  }\n  return polygons\n}\n\nconst stitchSides = (bottomCorners, topCorners) => {\n  // make a copy and reverse the bottom corners\n  bottomCorners = [bottomCorners[3], bottomCorners[2], bottomCorners[1], bottomCorners[0]]\n  bottomCorners = bottomCorners.map((corner) => corner.slice().reverse())\n\n  const bottomPoints = []\n  bottomCorners.forEach((corner) => {\n    corner.forEach((point) => bottomPoints.push(point))\n  })\n\n  const topPoints = []\n  topCorners.forEach((corner) => {\n    corner.forEach((point) => topPoints.push(point))\n  })\n\n  const polygons = []\n  for (let i = 0; i < topPoints.length; i++) {\n    const j = (i + 1) % topPoints.length\n    polygons.push(poly3.create([bottomPoints[i], bottomPoints[j], topPoints[j], topPoints[i]]))\n  }\n  return polygons\n}\n\n/**\n * Construct an axis-aligned solid cuboid in three dimensional space with rounded corners.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of rounded cube\n * @param {Array} [options.size=[2,2,2]] - dimension of rounded cube; width, depth, height\n * @param {Number} [options.roundRadius=0.2] - radius of rounded edges\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.roundedCuboid\n *\n * @example\n * let mycube = roundedCuboid({size: [10, 20, 10], roundRadius: 2, segments: 16})\n */\nconst roundedCuboid = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    size: [2, 2, 2],\n    roundRadius: 0.2,\n    segments: 32\n  }\n  let { center, size, roundRadius, segments } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 3)) throw new Error('center must be an array of X, Y and Z values')\n  if (!isNumberArray(size, 3)) throw new Error('size must be an array of X, Y and Z values')\n  if (!size.every((n) => n > 0)) throw new Error('size values must be greater than zero')\n  if (!isGT(roundRadius, 0)) throw new Error('roundRadius must be greater than zero')\n  if (!isGTE(segments, 4)) throw new Error('segments must be four or more')\n\n  size = size.map((v) => v / 2) // convert to radius\n\n  if (roundRadius > (size[0] - EPS) ||\n      roundRadius > (size[1] - EPS) ||\n      roundRadius > (size[2] - EPS)) throw new Error('roundRadius must be smaller then the radius of all dimensions')\n\n  segments = Math.floor(segments / 4)\n\n  let prevCornersPos = null\n  let prevCornersNeg = null\n  let polygons = []\n  for (let slice = 0; slice <= segments; slice++) {\n    const cornersPos = createCorners(center, size, roundRadius, segments, slice, true)\n    const cornersNeg = createCorners(center, size, roundRadius, segments, slice, false)\n\n    if (slice === 0) {\n      polygons = polygons.concat(stitchSides(cornersNeg, cornersPos))\n    }\n\n    if (prevCornersPos) {\n      polygons = polygons.concat(stitchCorners(prevCornersPos, cornersPos),\n        stitchWalls(prevCornersPos, cornersPos))\n    }\n    if (prevCornersNeg) {\n      polygons = polygons.concat(stitchCorners(prevCornersNeg, cornersNeg),\n        stitchWalls(prevCornersNeg, cornersNeg))\n    }\n\n    if (slice === segments) {\n      // add the top\n      let points = cornersPos.map((corner) => corner[0])\n      polygons.push(poly3.create(points))\n      // add the bottom\n      points = cornersNeg.map((corner) => corner[0])\n      polygons.push(poly3.create(points))\n    }\n\n    prevCornersPos = cornersPos\n    prevCornersNeg = cornersNeg\n  }\n\n  return geom3.create(polygons)\n}\n\nmodule.exports = roundedCuboid\n","const { EPS, TAU } = require('../maths/constants')\n\nconst vec3 = require('../maths/vec3')\n\nconst geom3 = require('../geometries/geom3')\nconst poly3 = require('../geometries/poly3')\n\nconst { sin, cos } = require('../maths/utils/trigonometry')\n\nconst { isGT, isGTE, isNumberArray } = require('./commonChecks')\n\n/**\n * Construct a Z axis-aligned solid cylinder in three dimensional space with rounded ends.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of cylinder\n * @param {Number} [options.height=2] - height of cylinder\n * @param {Number} [options.radius=1] - radius of cylinder\n * @param {Number} [options.roundRadius=0.2] - radius of rounded edges\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.roundedCylinder\n *\n * @example\n * let myshape = roundedCylinder({ height: 10, radius: 2, roundRadius: 0.5 })\n */\nconst roundedCylinder = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    height: 2,\n    radius: 1,\n    roundRadius: 0.2,\n    segments: 32\n  }\n  const { center, height, radius, roundRadius, segments } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 3)) throw new Error('center must be an array of X, Y and Z values')\n  if (!isGT(height, 0)) throw new Error('height must be greater then zero')\n  if (!isGT(radius, 0)) throw new Error('radius must be greater then zero')\n  if (!isGT(roundRadius, 0)) throw new Error('roundRadius must be greater then zero')\n  if (roundRadius > (radius - EPS)) throw new Error('roundRadius must be smaller then the radius')\n  if (!isGTE(segments, 4)) throw new Error('segments must be four or more')\n\n  const start = [0, 0, -(height / 2)]\n  const end = [0, 0, height / 2]\n  const direction = vec3.subtract(vec3.create(), end, start)\n  const length = vec3.length(direction)\n\n  if ((2 * roundRadius) > (length - EPS)) throw new Error('height must be larger than twice roundRadius')\n\n  let defaultnormal\n  if (Math.abs(direction[0]) > Math.abs(direction[1])) {\n    defaultnormal = vec3.fromValues(0, 1, 0)\n  } else {\n    defaultnormal = vec3.fromValues(1, 0, 0)\n  }\n\n  const zvector = vec3.scale(vec3.create(), vec3.normalize(vec3.create(), direction), roundRadius)\n  const xvector = vec3.scale(vec3.create(), vec3.normalize(vec3.create(), vec3.cross(vec3.create(), zvector, defaultnormal)), radius)\n  const yvector = vec3.scale(vec3.create(), vec3.normalize(vec3.create(), vec3.cross(vec3.create(), xvector, zvector)), radius)\n\n  vec3.add(start, start, zvector)\n  vec3.subtract(end, end, zvector)\n\n  const qsegments = Math.floor(0.25 * segments)\n\n  const fromPoints = (points) => {\n    // adjust the points to center\n    const newpoints = points.map((point) => vec3.add(point, point, center))\n    return poly3.create(newpoints)\n  }\n\n  const polygons = []\n  const v1 = vec3.create()\n  const v2 = vec3.create()\n  let prevcylinderpoint\n  for (let slice1 = 0; slice1 <= segments; slice1++) {\n    const angle = TAU * slice1 / segments\n    const cylinderpoint = vec3.add(vec3.create(), vec3.scale(v1, xvector, cos(angle)), vec3.scale(v2, yvector, sin(angle)))\n    if (slice1 > 0) {\n      // cylinder wall\n      let points = []\n      points.push(vec3.add(vec3.create(), start, cylinderpoint))\n      points.push(vec3.add(vec3.create(), start, prevcylinderpoint))\n      points.push(vec3.add(vec3.create(), end, prevcylinderpoint))\n      points.push(vec3.add(vec3.create(), end, cylinderpoint))\n      polygons.push(fromPoints(points))\n\n      let prevcospitch, prevsinpitch\n      for (let slice2 = 0; slice2 <= qsegments; slice2++) {\n        const pitch = TAU / 4 * slice2 / qsegments\n        const cospitch = cos(pitch)\n        const sinpitch = sin(pitch)\n        if (slice2 > 0) {\n          // cylinder rounding, start\n          points = []\n          let point\n          point = vec3.add(vec3.create(), start, vec3.subtract(v1, vec3.scale(v1, prevcylinderpoint, prevcospitch), vec3.scale(v2, zvector, prevsinpitch)))\n          points.push(point)\n          point = vec3.add(vec3.create(), start, vec3.subtract(v1, vec3.scale(v1, cylinderpoint, prevcospitch), vec3.scale(v2, zvector, prevsinpitch)))\n          points.push(point)\n          if (slice2 < qsegments) {\n            point = vec3.add(vec3.create(), start, vec3.subtract(v1, vec3.scale(v1, cylinderpoint, cospitch), vec3.scale(v2, zvector, sinpitch)))\n            points.push(point)\n          }\n          point = vec3.add(vec3.create(), start, vec3.subtract(v1, vec3.scale(v1, prevcylinderpoint, cospitch), vec3.scale(v2, zvector, sinpitch)))\n          points.push(point)\n\n          polygons.push(fromPoints(points))\n\n          // cylinder rounding, end\n          points = []\n          point = vec3.add(vec3.create(), vec3.scale(v1, prevcylinderpoint, prevcospitch), vec3.scale(v2, zvector, prevsinpitch))\n          vec3.add(point, point, end)\n          points.push(point)\n          point = vec3.add(vec3.create(), vec3.scale(v1, cylinderpoint, prevcospitch), vec3.scale(v2, zvector, prevsinpitch))\n          vec3.add(point, point, end)\n          points.push(point)\n          if (slice2 < qsegments) {\n            point = vec3.add(vec3.create(), vec3.scale(v1, cylinderpoint, cospitch), vec3.scale(v2, zvector, sinpitch))\n            vec3.add(point, point, end)\n            points.push(point)\n          }\n          point = vec3.add(vec3.create(), vec3.scale(v1, prevcylinderpoint, cospitch), vec3.scale(v2, zvector, sinpitch))\n          vec3.add(point, point, end)\n          points.push(point)\n          points.reverse()\n\n          polygons.push(fromPoints(points))\n        }\n        prevcospitch = cospitch\n        prevsinpitch = sinpitch\n      }\n    }\n    prevcylinderpoint = cylinderpoint\n  }\n  const result = geom3.create(polygons)\n  return result\n}\n\nmodule.exports = roundedCylinder\n","const { EPS, TAU } = require('../maths/constants')\n\nconst vec2 = require('../maths/vec2')\n\nconst geom2 = require('../geometries/geom2')\n\nconst { isGT, isGTE, isNumberArray } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned rectangle in two dimensional space with rounded corners.\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of rounded rectangle\n * @param {Array} [options.size=[2,2]] - dimension of rounded rectangle; width and length\n * @param {Number} [options.roundRadius=0.2] - round radius of corners\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.roundedRectangle\n *\n * @example\n * let myshape = roundedRectangle({size: [10, 20], roundRadius: 2})\n */\nconst roundedRectangle = (options) => {\n  const defaults = {\n    center: [0, 0],\n    size: [2, 2],\n    roundRadius: 0.2,\n    segments: 32\n  }\n  let { center, size, roundRadius, segments } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 2)) throw new Error('center must be an array of X and Y values')\n  if (!isNumberArray(size, 2)) throw new Error('size must be an array of X and Y values')\n  if (!size.every((n) => n > 0)) throw new Error('size values must be greater than zero')\n  if (!isGT(roundRadius, 0)) throw new Error('roundRadius must be greater than zero')\n  if (!isGTE(segments, 4)) throw new Error('segments must be four or more')\n\n  size = size.map((v) => v / 2) // convert to radius\n\n  if (roundRadius > (size[0] - EPS) ||\n      roundRadius > (size[1] - EPS)) throw new Error('roundRadius must be smaller then the radius of all dimensions')\n\n  const cornersegments = Math.floor(segments / 4)\n\n  // create sets of points that define the corners\n  const corner0 = vec2.add(vec2.create(), center, [size[0] - roundRadius, size[1] - roundRadius])\n  const corner1 = vec2.add(vec2.create(), center, [roundRadius - size[0], size[1] - roundRadius])\n  const corner2 = vec2.add(vec2.create(), center, [roundRadius - size[0], roundRadius - size[1]])\n  const corner3 = vec2.add(vec2.create(), center, [size[0] - roundRadius, roundRadius - size[1]])\n  const corner0Points = []\n  const corner1Points = []\n  const corner2Points = []\n  const corner3Points = []\n  for (let i = 0; i <= cornersegments; i++) {\n    const radians = TAU / 4 * i / cornersegments\n    const point = vec2.fromAngleRadians(vec2.create(), radians)\n    vec2.scale(point, point, roundRadius)\n    corner0Points.push(vec2.add(vec2.create(), corner0, point))\n    vec2.rotate(point, point, vec2.create(), TAU / 4)\n    corner1Points.push(vec2.add(vec2.create(), corner1, point))\n    vec2.rotate(point, point, vec2.create(), TAU / 4)\n    corner2Points.push(vec2.add(vec2.create(), corner2, point))\n    vec2.rotate(point, point, vec2.create(), TAU / 4)\n    corner3Points.push(vec2.add(vec2.create(), corner3, point))\n  }\n\n  return geom2.fromPoints(corner0Points.concat(corner1Points, corner2Points, corner3Points))\n}\n\nmodule.exports = roundedRectangle\n","const ellipsoid = require('./ellipsoid')\n\nconst { isGT } = require('./commonChecks')\n\n/**\n * Construct a sphere in three dimensional space where all points are at the same distance from the center.\n * @see [ellipsoid]{@link module:modeling/primitives.ellipsoid} for more options\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0,0]] - center of sphere\n * @param {Number} [options.radius=1] - radius of sphere\n * @param {Number} [options.segments=32] - number of segments to create per full rotation\n * @param {Array} [options.axes] -  an array with three vectors for the x, y and z base vectors\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.sphere\n *\n * @example\n * let myshape = sphere({radius: 5})\n */\nconst sphere = (options) => {\n  const defaults = {\n    center: [0, 0, 0],\n    radius: 1,\n    segments: 32,\n    axes: [[1, 0, 0], [0, -1, 0], [0, 0, 1]]\n  }\n  let { center, radius, segments, axes } = Object.assign({}, defaults, options)\n\n  if (!isGT(radius, 0)) throw new Error('radius must be greater than zero')\n\n  radius = [radius, radius, radius]\n\n  return ellipsoid({ center, radius, segments, axes })\n}\n\nmodule.exports = sphere\n","const rectangle = require('./rectangle')\n\nconst { isGT } = require('./commonChecks')\n\n/**\n * Construct an axis-aligned square in two dimensional space with four equal sides at right angles.\n * @see [rectangle]{@link module:modeling/primitives.rectangle} for more options\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of square\n * @param {Number} [options.size=2] - dimension of square\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.square\n *\n * @example\n * let myshape = square({size: 10})\n */\nconst square = (options) => {\n  const defaults = {\n    center: [0, 0],\n    size: 2\n  }\n  let { center, size } = Object.assign({}, defaults, options)\n\n  if (!isGT(size, 0)) throw new Error('size must be greater than zero')\n\n  size = [size, size]\n\n  return rectangle({ center, size })\n}\n\nmodule.exports = square\n","const { TAU } = require('../maths/constants')\nconst vec2 = require('../maths/vec2')\n\nconst geom2 = require('../geometries/geom2')\n\nconst { isGT, isGTE, isNumberArray } = require('./commonChecks')\n\n// @see http://www.jdawiseman.com/papers/easymath/surds_star_inner_radius.html\nconst getRadiusRatio = (vertices, density) => {\n  if (vertices > 0 && density > 1 && density < vertices / 2) {\n    return Math.cos(Math.PI * density / vertices) / Math.cos(Math.PI * (density - 1) / vertices)\n  }\n  return 0\n}\n\nconst getPoints = (vertices, radius, startAngle, center) => {\n  const a = TAU / vertices\n\n  const points = []\n  for (let i = 0; i < vertices; i++) {\n    const point = vec2.fromAngleRadians(vec2.create(), a * i + startAngle)\n    vec2.scale(point, point, radius)\n    vec2.add(point, center, point)\n    points.push(point)\n  }\n  return points\n}\n\n/**\n * Construct a star in two dimensional space.\n * @see https://en.wikipedia.org/wiki/Star_polygon\n * @param {Object} [options] - options for construction\n * @param {Array} [options.center=[0,0]] - center of star\n * @param {Number} [options.vertices=5] - number of vertices (P) on the star\n * @param {Number} [options.density=2] - density (Q) of star\n * @param {Number} [options.outerRadius=1] - outer radius of vertices\n * @param {Number} [options.innerRadius=0] - inner radius of vertices, or zero to calculate\n * @param {Number} [options.startAngle=0] - starting angle for first vertice, in radians\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.star\n *\n * @example\n * let star1 = star({vertices: 8, outerRadius: 10}) // star with 8/2 density\n * let star2 = star({vertices: 12, outerRadius: 40, innerRadius: 20}) // star with given radius\n */\nconst star = (options) => {\n  const defaults = {\n    center: [0, 0],\n    vertices: 5,\n    outerRadius: 1,\n    innerRadius: 0,\n    density: 2,\n    startAngle: 0\n  }\n  let { center, vertices, outerRadius, innerRadius, density, startAngle } = Object.assign({}, defaults, options)\n\n  if (!isNumberArray(center, 2)) throw new Error('center must be an array of X and Y values')\n  if (!isGTE(vertices, 2)) throw new Error('vertices must be two or more')\n  if (!isGT(outerRadius, 0)) throw new Error('outerRadius must be greater than zero')\n  if (!isGTE(innerRadius, 0)) throw new Error('innerRadius must be greater than zero')\n  if (!isGTE(startAngle, 0)) throw new Error('startAngle must be greater than zero')\n\n  // force integers\n  vertices = Math.floor(vertices)\n  density = Math.floor(density)\n\n  startAngle = startAngle % TAU\n\n  if (innerRadius === 0) {\n    if (!isGTE(density, 2)) throw new Error('density must be two or more')\n    innerRadius = outerRadius * getRadiusRatio(vertices, density)\n  }\n\n  const centerv = vec2.clone(center)\n\n  const outerPoints = getPoints(vertices, outerRadius, startAngle, centerv)\n  const innerPoints = getPoints(vertices, innerRadius, startAngle + Math.PI / vertices, centerv)\n\n  const allPoints = []\n  for (let i = 0; i < vertices; i++) {\n    allPoints.push(outerPoints[i])\n    allPoints.push(innerPoints[i])\n  }\n\n  return geom2.fromPoints(allPoints)\n}\n\nmodule.exports = star\n","const { TAU } = require('../maths/constants')\n\nconst extrudeRotate = require('../operations/extrusions/extrudeRotate')\nconst { rotate } = require('../operations/transforms/rotate')\nconst { translate } = require('../operations/transforms/translate')\n\nconst circle = require('./circle')\n\nconst { isGT, isGTE } = require('./commonChecks')\n\n/**\n * Construct a torus by revolving a small circle (inner) about the circumference of a large (outer) circle.\n * @param {Object} [options] - options for construction\n * @param {Number} [options.innerRadius=1] - radius of small (inner) circle\n * @param {Number} [options.outerRadius=4] - radius of large (outer) circle\n * @param {Integer} [options.innerSegments=32] - number of segments to create per rotation\n * @param {Integer} [options.outerSegments=32] - number of segments to create per rotation\n * @param {Integer} [options.innerRotation=0] - rotation of small (inner) circle in radians\n * @param {Number} [options.outerRotation=TAU] - rotation (outer) of the torus (RADIANS)\n * @param {Number} [options.startAngle=0] - start angle of the torus (RADIANS)\n * @returns {geom3} new 3D geometry\n * @alias module:modeling/primitives.torus\n *\n * @example\n * let myshape = torus({ innerRadius: 10, outerRadius: 100 })\n */\nconst torus = (options) => {\n  const defaults = {\n    innerRadius: 1,\n    innerSegments: 32,\n    outerRadius: 4,\n    outerSegments: 32,\n    innerRotation: 0,\n    startAngle: 0,\n    outerRotation: TAU\n  }\n  const { innerRadius, innerSegments, outerRadius, outerSegments, innerRotation, startAngle, outerRotation } = Object.assign({}, defaults, options)\n\n  if (!isGT(innerRadius, 0)) throw new Error('innerRadius must be greater than zero')\n  if (!isGTE(innerSegments, 3)) throw new Error('innerSegments must be three or more')\n  if (!isGT(outerRadius, 0)) throw new Error('outerRadius must be greater than zero')\n  if (!isGTE(outerSegments, 3)) throw new Error('outerSegments must be three or more')\n  if (!isGTE(startAngle, 0)) throw new Error('startAngle must be positive')\n  if (!isGT(outerRotation, 0)) throw new Error('outerRotation must be greater than zero')\n\n  if (innerRadius >= outerRadius) throw new Error('inner circle is two large to rotate about the outer circle')\n\n  let innerCircle = circle({ radius: innerRadius, segments: innerSegments })\n\n  if (innerRotation !== 0) {\n    innerCircle = rotate([0, 0, innerRotation], innerCircle)\n  }\n\n  innerCircle = translate([outerRadius, 0], innerCircle)\n\n  const extrudeOptions = {\n    startAngle: startAngle,\n    angle: outerRotation,\n    segments: outerSegments\n  }\n  return extrudeRotate(extrudeOptions, innerCircle)\n}\n\nmodule.exports = torus\n","const { NEPS } = require('../maths/constants')\nconst vec2 = require('../maths/vec2')\n\nconst geom2 = require('../geometries/geom2')\n\nconst { isNumberArray } = require('./commonChecks')\n\n// returns angle C\nconst solveAngleFromSSS = (a, b, c) => Math.acos(((a * a) + (b * b) - (c * c)) / (2 * a * b))\n\n// returns side c\nconst solveSideFromSAS = (a, C, b) => {\n  if (C > NEPS) {\n    return Math.sqrt(a * a + b * b - 2 * a * b * Math.cos(C))\n  }\n\n  // Explained in https://www.nayuki.io/page/numerically-stable-law-of-cosines\n  return Math.sqrt((a - b) * (a - b) + a * b * C * C * (1 - C * C / 12))\n}\n\n// AAA is when three angles of a triangle, but no sides\nconst solveAAA = (angles) => {\n  const eps = Math.abs(angles[0] + angles[1] + angles[2] - Math.PI)\n  if (eps > NEPS) throw new Error('AAA triangles require angles that sum to PI')\n\n  const A = angles[0]\n  const B = angles[1]\n  const C = Math.PI - A - B\n\n  // Note: This is not 100% proper but...\n  // default the side c length to 1\n  // solve the other lengths\n  const c = 1\n  const a = (c / Math.sin(C)) * Math.sin(A)\n  const b = (c / Math.sin(C)) * Math.sin(B)\n  return createTriangle(A, B, C, a, b, c)\n}\n\n// AAS is when two angles and one side are known, and the side is not between the angles\nconst solveAAS = (values) => {\n  const A = values[0]\n  const B = values[1]\n  const C = Math.PI + NEPS - A - B\n\n  if (C < NEPS) throw new Error('AAS triangles require angles that sum to PI')\n\n  const a = values[2]\n  const b = (a / Math.sin(A)) * Math.sin(B)\n  const c = (a / Math.sin(A)) * Math.sin(C)\n  return createTriangle(A, B, C, a, b, c)\n}\n\n// ASA is when two angles and the side between the angles are known\nconst solveASA = (values) => {\n  const A = values[0]\n  const B = values[2]\n  const C = Math.PI + NEPS - A - B\n\n  if (C < NEPS) throw new Error('ASA triangles require angles that sum to PI')\n\n  const c = values[1]\n  const a = (c / Math.sin(C)) * Math.sin(A)\n  const b = (c / Math.sin(C)) * Math.sin(B)\n  return createTriangle(A, B, C, a, b, c)\n}\n\n// SAS is when two sides and the angle between them are known\nconst solveSAS = (values) => {\n  const c = values[0]\n  const B = values[1]\n  const a = values[2]\n\n  const b = solveSideFromSAS(c, B, a)\n\n  const A = solveAngleFromSSS(b, c, a) // solve for A\n  const C = Math.PI - A - B\n  return createTriangle(A, B, C, a, b, c)\n}\n\n// SSA is when two sides and an angle that is not the angle between the sides are known\nconst solveSSA = (values) => {\n  const c = values[0]\n  const a = values[1]\n  const C = values[2]\n\n  const A = Math.asin(a * Math.sin(C) / c)\n  const B = Math.PI - A - C\n\n  const b = (c / Math.sin(C)) * Math.sin(B)\n  return createTriangle(A, B, C, a, b, c)\n}\n\n// SSS is when we know three sides of the triangle\nconst solveSSS = (lengths) => {\n  const a = lengths[1]\n  const b = lengths[2]\n  const c = lengths[0]\n  if (((a + b) <= c) || ((b + c) <= a) || ((c + a) <= b)) {\n    throw new Error('SSS triangle is incorrect, as the longest side is longer than the sum of the other sides')\n  }\n\n  const A = solveAngleFromSSS(b, c, a) // solve for A\n  const B = solveAngleFromSSS(c, a, b) // solve for B\n  const C = Math.PI - A - B\n  return createTriangle(A, B, C, a, b, c)\n}\n\nconst createTriangle = (A, B, C, a, b, c) => {\n  const p0 = vec2.fromValues(0, 0) // everything starts from 0, 0\n  const p1 = vec2.fromValues(c, 0)\n  const p2 = vec2.fromValues(a, 0)\n  vec2.add(p2, vec2.rotate(p2, p2, [0, 0], Math.PI - B), p1)\n  return geom2.fromPoints([p0, p1, p2])\n}\n\n/**\n * Construct a triangle in two dimensional space from the given options.\n * The triangle is always constructed CCW from the origin, [0, 0, 0].\n * @see https://www.mathsisfun.com/algebra/trig-solving-triangles.html\n * @param {Object} [options] - options for construction\n * @param {String} [options.type='SSS'] - type of triangle to construct; A ~ angle, S ~ side\n * @param {Array} [options.values=[1,1,1]] - angle (radians) of corners or length of sides\n * @returns {geom2} new 2D geometry\n * @alias module:modeling/primitives.triangle\n *\n * @example\n * let myshape = triangle({type: 'AAS', values: [degToRad(62), degToRad(35), 7]})\n */\nconst triangle = (options) => {\n  const defaults = {\n    type: 'SSS',\n    values: [1, 1, 1]\n  }\n  let { type, values } = Object.assign({}, defaults, options)\n\n  if (typeof (type) !== 'string') throw new Error('triangle type must be a string')\n  type = type.toUpperCase()\n  if (!((type[0] === 'A' || type[0] === 'S') &&\n        (type[1] === 'A' || type[1] === 'S') &&\n        (type[2] === 'A' || type[2] === 'S'))) throw new Error('triangle type must contain three letters; A or S')\n\n  if (!isNumberArray(values, 3)) throw new Error('triangle values must contain three values')\n  if (!values.every((n) => n > 0)) throw new Error('triangle values must be greater than zero')\n\n  switch (type) {\n    case 'AAA':\n      return solveAAA(values)\n    case 'AAS':\n      return solveAAS(values)\n    case 'ASA':\n      return solveASA(values)\n    case 'SAS':\n      return solveSAS(values)\n    case 'SSA':\n      return solveSSA(values)\n    case 'SSS':\n      return solveSSS(values)\n    default:\n      throw new Error('invalid triangle type, try again')\n  }\n}\n\nmodule.exports = triangle\n","// -- data source from from http://paulbourke.net/dataformats/hershey/\n// -- reduced to save some bytes...\n// { [ascii code]: [width, x, y, ...] } - undefined value as path separator\nmodule.exports = {\n  height: 14,\n  32: [16],\n  33: [10, 5, 21, 5, 7, undefined, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2],\n  34: [16, 4, 21, 4, 14, undefined, 12, 21, 12, 14],\n  35: [21, 11, 25, 4, -7, undefined, 17, 25, 10, -7, undefined, 4, 12, 18, 12, undefined, 3, 6, 17, 6],\n  36: [20, 8, 25, 8, -4, undefined, 12, 25, 12, -4, undefined, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3],\n  37: [24, 21, 21, 3, 0, undefined, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, undefined, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7],\n  38: [26, 23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2],\n  39: [10, 5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15],\n  40: [14, 11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7],\n  41: [14, 3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7],\n  42: [16, 8, 21, 8, 9, undefined, 3, 18, 13, 12, undefined, 13, 18, 3, 12],\n  43: [26, 13, 18, 13, 0, undefined, 4, 9, 22, 9],\n  44: [10, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4],\n  45: [26, 4, 9, 22, 9],\n  46: [10, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2],\n  47: [22, 20, 25, 2, -7],\n  48: [20, 9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21],\n  49: [20, 6, 17, 8, 18, 11, 21, 11, 0],\n  50: [20, 4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0],\n  51: [20, 5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4],\n  52: [20, 13, 21, 3, 7, 18, 7, undefined, 13, 21, 13, 0],\n  53: [20, 15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4],\n  54: [20, 16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7],\n  55: [20, 17, 21, 7, 0, undefined, 3, 21, 17, 21],\n  56: [20, 8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21],\n  57: [20, 16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3],\n  58: [10, 5, 14, 4, 13, 5, 12, 6, 13, 5, 14, undefined, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2],\n  59: [10, 5, 14, 4, 13, 5, 12, 6, 13, 5, 14, undefined, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4],\n  60: [24, 20, 18, 4, 9, 20, 0],\n  61: [26, 4, 12, 22, 12, undefined, 4, 6, 22, 6],\n  62: [24, 4, 18, 20, 9, 4, 0],\n  63: [18, 3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, undefined, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2],\n  64: [27, 18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, undefined, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, undefined, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, undefined, 19, 16, 18, 8, 18, 6, 19, 5],\n  65: [18, 9, 21, 1, 0, undefined, 9, 21, 17, 0, undefined, 4, 7, 14, 7],\n  66: [21, 4, 21, 4, 0, undefined, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, undefined, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0],\n  67: [21, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5],\n  68: [21, 4, 21, 4, 0, undefined, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0],\n  69: [19, 4, 21, 4, 0, undefined, 4, 21, 17, 21, undefined, 4, 11, 12, 11, undefined, 4, 0, 17, 0],\n  70: [18, 4, 21, 4, 0, undefined, 4, 21, 17, 21, undefined, 4, 11, 12, 11],\n  71: [21, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, undefined, 13, 8, 18, 8],\n  72: [22, 4, 21, 4, 0, undefined, 18, 21, 18, 0, undefined, 4, 11, 18, 11],\n  73: [8, 4, 21, 4, 0],\n  74: [16, 12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7],\n  75: [21, 4, 21, 4, 0, undefined, 18, 21, 4, 7, undefined, 9, 12, 18, 0],\n  76: [17, 4, 21, 4, 0, undefined, 4, 0, 16, 0],\n  77: [24, 4, 21, 4, 0, undefined, 4, 21, 12, 0, undefined, 20, 21, 12, 0, undefined, 20, 21, 20, 0],\n  78: [22, 4, 21, 4, 0, undefined, 4, 21, 18, 0, undefined, 18, 21, 18, 0],\n  79: [22, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21],\n  80: [21, 4, 21, 4, 0, undefined, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10],\n  81: [22, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, undefined, 12, 4, 18, -2],\n  82: [21, 4, 21, 4, 0, undefined, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, undefined, 11, 11, 18, 0],\n  83: [20, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3],\n  84: [16, 8, 21, 8, 0, undefined, 1, 21, 15, 21],\n  85: [22, 4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21],\n  86: [18, 1, 21, 9, 0, undefined, 17, 21, 9, 0],\n  87: [24, 2, 21, 7, 0, undefined, 12, 21, 7, 0, undefined, 12, 21, 17, 0, undefined, 22, 21, 17, 0],\n  88: [20, 3, 21, 17, 0, undefined, 17, 21, 3, 0],\n  89: [18, 1, 21, 9, 11, 9, 0, undefined, 17, 21, 9, 11],\n  90: [20, 17, 21, 3, 0, undefined, 3, 21, 17, 21, undefined, 3, 0, 17, 0],\n  91: [14, 4, 25, 4, -7, undefined, 5, 25, 5, -7, undefined, 4, 25, 11, 25, undefined, 4, -7, 11, -7],\n  92: [14, 0, 21, 14, -3],\n  93: [14, 9, 25, 9, -7, undefined, 10, 25, 10, -7, undefined, 3, 25, 10, 25, undefined, 3, -7, 10, -7],\n  94: [16, 6, 15, 8, 18, 10, 15, undefined, 3, 12, 8, 17, 13, 12, undefined, 8, 17, 8, 0],\n  95: [16, 0, -2, 16, -2],\n  96: [10, 6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17],\n  97: [19, 15, 14, 15, 0, undefined, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3],\n  98: [19, 4, 21, 4, 0, undefined, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3],\n  99: [18, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3],\n  100: [19, 15, 21, 15, 0, undefined, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3],\n  101: [18, 3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3],\n  102: [12, 10, 21, 8, 21, 6, 20, 5, 17, 5, 0, undefined, 2, 14, 9, 14],\n  103: [19, 15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, undefined, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3],\n  104: [19, 4, 21, 4, 0, undefined, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0],\n  105: [8, 3, 21, 4, 20, 5, 21, 4, 22, 3, 21, undefined, 4, 14, 4, 0],\n  106: [10, 5, 21, 6, 20, 7, 21, 6, 22, 5, 21, undefined, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7],\n  107: [17, 4, 21, 4, 0, undefined, 14, 14, 4, 4, undefined, 8, 8, 15, 0],\n  108: [8, 4, 21, 4, 0],\n  109: [30, 4, 14, 4, 0, undefined, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, undefined, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0],\n  110: [19, 4, 14, 4, 0, undefined, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0],\n  111: [19, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14],\n  112: [19, 4, 14, 4, -7, undefined, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3],\n  113: [19, 15, 14, 15, -7, undefined, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3],\n  114: [13, 4, 14, 4, 0, undefined, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14],\n  115: [17, 14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3],\n  116: [12, 5, 21, 5, 4, 6, 1, 8, 0, 10, 0, undefined, 2, 14, 9, 14],\n  117: [19, 4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, undefined, 15, 14, 15, 0],\n  118: [16, 2, 14, 8, 0, undefined, 14, 14, 8, 0],\n  119: [22, 3, 14, 7, 0, undefined, 11, 14, 7, 0, undefined, 11, 14, 15, 0, undefined, 19, 14, 15, 0],\n  120: [17, 3, 14, 14, 0, undefined, 14, 14, 3, 0],\n  121: [16, 2, 14, 8, 0, undefined, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7],\n  122: [17, 14, 14, 3, 0, undefined, 3, 14, 14, 14, undefined, 3, 0, 14, 0],\n  123: [14, 9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, undefined, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, undefined, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7],\n  124: [8, 4, 25, 4, -7],\n  125: [14, 5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, undefined, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, undefined, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7],\n  126: [24, 3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, undefined, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]\n}\n","/**\n * Texts provide sets of segments for each character or text strings.\n * The segments can be used to create outlines for both 2D and 3D geometry.\n * Note: Only ASCII characters are supported.\n * @module modeling/text\n * @example\n * const { vectorChar, vectorText } = require('@jscad/modeling').text\n */\nmodule.exports = {\n  vectorChar: require('./vectorChar'),\n  vectorText: require('./vectorText')\n}\n","const vectorParams = require('./vectorParams')\n\n/**\n * Represents a character as a list of segments\n * @typedef {Object} VectorCharObject\n * @property {Float} width - character width\n * @property {Float} height - character height (uppercase)\n * @property {Array} segments - character segments [[[x, y], ...], ...]\n */\n\n/** Construct a {@link VectorCharObject} from a ascii character whose code is between 31 and 127,\n* if the character is not supported it is replaced by a question mark.\n* @param {Object|String} [options] - options for construction or ascii character\n* @param {Float} [options.xOffset=0] - x offset\n* @param {Float} [options.yOffset=0] - y offset\n* @param {Float} [options.height=21] - font size (uppercase height)\n* @param {Float} [options.extrudeOffset=0] - width of the extrusion that will be applied (manually) after the creation of the character\n* @param {String} [options.input='?'] - ascii character (ignored/overwrited if provided as seconds parameter)\n* @param {String} [char='?'] - ascii character\n* @returns {VectorCharObject}\n* @alias module:modeling/text.vectorChar\n*\n* @example\n* let vectorCharObject = vectorChar()\n* or\n* let vectorCharObject = vectorChar('A')\n* or\n* let vectorCharObject = vectorChar({ xOffset: 57 }, 'C')\n* or\n* let vectorCharObject = vectorChar({ xOffset: 78, input: '!' })\n*/\nconst vectorChar = (options, char) => {\n  const {\n    xOffset, yOffset, input, font, height, extrudeOffset\n  } = vectorParams(options, char)\n  let code = input.charCodeAt(0)\n  if (!code || !font[code]) {\n    code = 63 // 63 => ?\n  }\n  const glyph = [].concat(font[code])\n  const ratio = (height - extrudeOffset) / font.height\n  const extrudeYOffset = (extrudeOffset / 2)\n  const width = glyph.shift() * ratio\n  const segments = []\n  let polyline = []\n  for (let i = 0, il = glyph.length; i < il; i += 2) {\n    const gx = ratio * glyph[i] + xOffset\n    const gy = ratio * glyph[i + 1] + yOffset + extrudeYOffset\n    if (glyph[i] !== undefined) {\n      polyline.push([gx, gy])\n      continue\n    }\n    segments.push(polyline)\n    polyline = []\n    i--\n  }\n  if (polyline.length) {\n    segments.push(polyline)\n  }\n  return { width, height, segments }\n}\n\nmodule.exports = vectorChar\n","const defaultFont = require('./fonts/single-line/hershey/simplex.js')\n\nconst defaultsVectorParams = {\n  xOffset: 0,\n  yOffset: 0,\n  input: '?',\n  align: 'left',\n  font: defaultFont,\n  height: 14, // == old vector_xxx simplex font height\n  lineSpacing: 2.142857142857143, // == 30/14 == old vector_xxx ratio\n  letterSpacing: 1,\n  extrudeOffset: 0\n}\n\n// vectorsXXX parameters handler\nconst vectorParams = (options, input) => {\n  if (!input && typeof options === 'string') {\n    options = { input: options }\n  }\n  options = options || {}\n  const params = Object.assign({}, defaultsVectorParams, options)\n  params.input = input || params.input\n  return params\n}\n\nmodule.exports = vectorParams\n","const vectorChar = require('./vectorChar')\nconst vectorParams = require('./vectorParams')\n\n// translate text line\nconst translateLine = (options, line) => {\n  const { x, y } = Object.assign({ x: 0, y: 0 }, options || {})\n  const segments = line.segments\n  let segment = null\n  let point = null\n  for (let i = 0, il = segments.length; i < il; i++) {\n    segment = segments[i]\n    for (let j = 0, jl = segment.length; j < jl; j++) {\n      point = segment[j]\n      segment[j] = [point[0] + x, point[1] + y]\n    }\n  }\n  return line\n}\n\n/**\n * Construct an array of character segments from a ascii string whose characters code is between 31 and 127,\n * if one character is not supported it is replaced by a question mark.\n * @param {Object|String} [options] - options for construction or ascii string\n * @param {Float} [options.xOffset=0] - x offset\n * @param {Float} [options.yOffset=0] - y offset\n * @param {Float} [options.height=21] - font size (uppercase height)\n * @param {Float} [options.lineSpacing=1.4] - line spacing expressed as a percentage of font size\n * @param {Float} [options.letterSpacing=1] - extra letter spacing expressed as a percentage of font size\n * @param {String} [options.align='left'] - multi-line text alignment: left, center, right\n * @param {Float} [options.extrudeOffset=0] - width of the extrusion that will be applied (manually) after the creation of the character\n * @param {String} [options.input='?'] - ascii string (ignored/overwrited if provided as seconds parameter)\n * @param {String} [text='?'] - ascii string\n * @returns {Array} characters segments [[[x, y], ...], ...]\n * @alias module:modeling/text.vectorText\n *\n * @example\n * let textSegments = vectorText()\n * or\n * let textSegments = vectorText('OpenJSCAD')\n * or\n * let textSegments = vectorText({ yOffset: -50 }, 'OpenJSCAD')\n * or\n * let textSegments = vectorText({ yOffset: -80, input: 'OpenJSCAD' })\n */\nconst vectorText = (options, text) => {\n  const {\n    xOffset, yOffset, input, font, height, align, extrudeOffset, lineSpacing, letterSpacing\n  } = vectorParams(options, text)\n  let [x, y] = [xOffset, yOffset]\n  let i, il, char, vect, width, diff\n  let line = { width: 0, segments: [] }\n  const lines = []\n  let output = []\n  let maxWidth = 0\n  const lineStart = x\n  const pushLine = () => {\n    lines.push(line)\n    maxWidth = Math.max(maxWidth, line.width)\n    line = { width: 0, segments: [] }\n  }\n  for (i = 0, il = input.length; i < il; i++) {\n    char = input[i]\n    vect = vectorChar({ xOffset: x, yOffset: y, font, height, extrudeOffset }, char)\n    if (char === '\\n') {\n      x = lineStart\n      y -= vect.height * lineSpacing\n      pushLine()\n      continue\n    }\n    width = vect.width * letterSpacing\n    line.width += width\n    x += width\n    if (char !== ' ') {\n      line.segments = line.segments.concat(vect.segments)\n    }\n  }\n  if (line.segments.length) {\n    pushLine()\n  }\n  for (i = 0, il = lines.length; i < il; i++) {\n    line = lines[i]\n    if (maxWidth > line.width) {\n      diff = maxWidth - line.width\n      if (align === 'right') {\n        line = translateLine({ x: diff }, line)\n      } else if (align === 'center') {\n        line = translateLine({ x: diff / 2 }, line)\n      }\n    }\n    output = output.concat(line.segments)\n  }\n  return output\n}\n\nmodule.exports = vectorText\n","// list of supported geometries\nconst geom2 = require('../geometries/geom2')\nconst geom3 = require('../geometries/geom3')\nconst path2 = require('../geometries/path2')\n\n/**\n * @param {Array} shapes - list of shapes to compare\n * @returns {Boolean} true if the given shapes are of the same type\n * @alias module:modeling/utils.areAllShapesTheSameType\n */\nconst areAllShapesTheSameType = (shapes) => {\n  let previousType\n  for (const shape of shapes) {\n    let currentType = 0\n    if (geom2.isA(shape)) currentType = 1\n    if (geom3.isA(shape)) currentType = 2\n    if (path2.isA(shape)) currentType = 3\n\n    if (previousType && currentType !== previousType) return false\n    previousType = currentType\n  }\n  return true\n}\n\nmodule.exports = areAllShapesTheSameType\n","/**\n * Convert the given angle (degrees) to radians.\n * @param {Number} degrees - angle in degrees\n * @returns {Number} angle in radians\n * @alias module:modeling/utils.degToRad\n */\nconst degToRad = (degrees) => degrees * 0.017453292519943295\n\nmodule.exports = degToRad\n","/**\n * Flatten the given list of arguments into a single flat array.\n * The arguments can be composed of multiple depths of objects and arrays.\n * @param {Array} arr - list of arguments\n * @returns {Array} a flat list of arguments\n * @alias module:modeling/utils.flatten\n */\nconst flatten = (arr) => arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), [])\n\nmodule.exports = flatten\n","/**\n * @alias module:modeling/utils.fnNumberSort\n */\nconst fnNumberSort = (a, b) => a - b\n\nmodule.exports = fnNumberSort\n","/**\n * Utility functions of various sorts.\n * @module modeling/utils\n * @example\n * const { flatten, insertSorted } = require('@jscad/modeling').utils\n */\nmodule.exports = {\n  areAllShapesTheSameType: require('./areAllShapesTheSameType'),\n  degToRad: require('./degToRad'),\n  flatten: require('./flatten'),\n  fnNumberSort: require('./fnNumberSort'),\n  insertSorted: require('./insertSorted'),\n  radiusToSegments: require('./radiusToSegments'),\n  radToDeg: require('./radToDeg')\n}\n","/**\n * Insert the given element into the given array using the compareFunction.\n * @alias module:modeling/utils.insertSorted\n */\nconst insertSorted = (array, element, comparefunc) => {\n  let leftbound = 0\n  let rightbound = array.length\n  while (rightbound > leftbound) {\n    const testindex = Math.floor((leftbound + rightbound) / 2)\n    const testelement = array[testindex]\n    const compareresult = comparefunc(element, testelement)\n    if (compareresult > 0) { // element > testelement\n      leftbound = testindex + 1\n    } else {\n      rightbound = testindex\n    }\n  }\n  array.splice(leftbound, 0, element)\n}\n\nmodule.exports = insertSorted\n","/**\n * Build an array of at minimum a specified length from an existing array and a padding value. IF the array is already larger than the target length, it will not be shortened.\n * @param {Array} anArray - the source array to copy into the result.\n * @param {*} padding - the value to add to the new array to reach the desired length.\n * @param {Number} targetLength - The desired length of the return array.\n * @returns {Array} an array of at least 'targetLength' length\n * @alias module:modeling/utils.padArrayToLength\n */\nconst padArrayToLength = (anArray, padding, targetLength) => {\n  anArray = anArray.slice()\n  while (anArray.length < targetLength) {\n    anArray.push(padding)\n  }\n  return anArray\n}\n\nmodule.exports = padArrayToLength\n","/**\n * Convert the given angle (radians) to degrees.\n * @param {Number} radians - angle in radians\n * @returns {Number} angle in degrees\n * @alias module:modeling/utils.radToDeg\n */\nconst radToDeg = (radians) => radians * 57.29577951308232\n\nmodule.exports = radToDeg\n","const { TAU } = require('../maths/constants')\n\n/**\n * Calculate the number of segments from the given radius based on minimum length or angle.\n * @param {Number} radius - radius of the requested shape\n * @param {Number} minimumLength - minimum length of segments; length > 0\n * @param {Number} minimumAngle - minimum angle (radians) between segments; 0 > angle < TAU\n * @returns {Number} number of segments to complete the radius\n * @alias module:modeling/utils.radiusToSegments\n */\nconst radiusToSegments = (radius, minimumLength, minimumAngle) => {\n  const ss = minimumLength > 0 ? radius * TAU / minimumLength : 0\n  const as = minimumAngle > 0 ? TAU / minimumAngle : 0\n  // minimum segments is four(4) for round primitives\n  return Math.ceil(Math.max(ss, as, 4))\n}\n\nmodule.exports = radiusToSegments\n","import { extend, isArray, isMap, isIntegerKey, hasOwn, isSymbol, isObject, hasChanged, makeMap, capitalize, toRawType, def, isFunction, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n  console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n  constructor(detached = false) {\n    this.detached = detached;\n    /**\n     * @internal\n     */\n    this._active = true;\n    /**\n     * @internal\n     */\n    this.effects = [];\n    /**\n     * @internal\n     */\n    this.cleanups = [];\n    this.parent = activeEffectScope;\n    if (!detached && activeEffectScope) {\n      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n        this\n      ) - 1;\n    }\n  }\n  get active() {\n    return this._active;\n  }\n  run(fn) {\n    if (this._active) {\n      const currentEffectScope = activeEffectScope;\n      try {\n        activeEffectScope = this;\n        return fn();\n      } finally {\n        activeEffectScope = currentEffectScope;\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`cannot run an inactive effect scope.`);\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  on() {\n    activeEffectScope = this;\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  off() {\n    activeEffectScope = this.parent;\n  }\n  stop(fromParent) {\n    if (this._active) {\n      let i, l;\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].stop();\n      }\n      for (i = 0, l = this.cleanups.length; i < l; i++) {\n        this.cleanups[i]();\n      }\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].stop(true);\n        }\n      }\n      if (!this.detached && this.parent && !fromParent) {\n        const last = this.parent.scopes.pop();\n        if (last && last !== this) {\n          this.parent.scopes[this.index] = last;\n          last.index = this.index;\n        }\n      }\n      this.parent = void 0;\n      this._active = false;\n    }\n  }\n}\nfunction effectScope(detached) {\n  return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n  if (scope && scope.active) {\n    scope.effects.push(effect);\n  }\n}\nfunction getCurrentScope() {\n  return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n  if (activeEffectScope) {\n    activeEffectScope.cleanups.push(fn);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(\n      `onScopeDispose() is called when there is no active effect scope to be associated with.`\n    );\n  }\n}\n\nconst createDep = (effects) => {\n  const dep = new Set(effects);\n  dep.w = 0;\n  dep.n = 0;\n  return dep;\n};\nconst wasTracked = (dep) => (dep.w & trackOpBit) > 0;\nconst newTracked = (dep) => (dep.n & trackOpBit) > 0;\nconst initDepMarkers = ({ deps }) => {\n  if (deps.length) {\n    for (let i = 0; i < deps.length; i++) {\n      deps[i].w |= trackOpBit;\n    }\n  }\n};\nconst finalizeDepMarkers = (effect) => {\n  const { deps } = effect;\n  if (deps.length) {\n    let ptr = 0;\n    for (let i = 0; i < deps.length; i++) {\n      const dep = deps[i];\n      if (wasTracked(dep) && !newTracked(dep)) {\n        dep.delete(effect);\n      } else {\n        deps[ptr++] = dep;\n      }\n      dep.w &= ~trackOpBit;\n      dep.n &= ~trackOpBit;\n    }\n    deps.length = ptr;\n  }\n};\n\nconst targetMap = /* @__PURE__ */ new WeakMap();\nlet effectTrackDepth = 0;\nlet trackOpBit = 1;\nconst maxMarkerBits = 30;\nlet activeEffect;\nconst ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"iterate\" : \"\");\nconst MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"Map key iterate\" : \"\");\nclass ReactiveEffect {\n  constructor(fn, scheduler = null, scope) {\n    this.fn = fn;\n    this.scheduler = scheduler;\n    this.active = true;\n    this.deps = [];\n    this.parent = void 0;\n    recordEffectScope(this, scope);\n  }\n  run() {\n    if (!this.active) {\n      return this.fn();\n    }\n    let parent = activeEffect;\n    let lastShouldTrack = shouldTrack;\n    while (parent) {\n      if (parent === this) {\n        return;\n      }\n      parent = parent.parent;\n    }\n    try {\n      this.parent = activeEffect;\n      activeEffect = this;\n      shouldTrack = true;\n      trackOpBit = 1 << ++effectTrackDepth;\n      if (effectTrackDepth <= maxMarkerBits) {\n        initDepMarkers(this);\n      } else {\n        cleanupEffect(this);\n      }\n      return this.fn();\n    } finally {\n      if (effectTrackDepth <= maxMarkerBits) {\n        finalizeDepMarkers(this);\n      }\n      trackOpBit = 1 << --effectTrackDepth;\n      activeEffect = this.parent;\n      shouldTrack = lastShouldTrack;\n      this.parent = void 0;\n      if (this.deferStop) {\n        this.stop();\n      }\n    }\n  }\n  stop() {\n    if (activeEffect === this) {\n      this.deferStop = true;\n    } else if (this.active) {\n      cleanupEffect(this);\n      if (this.onStop) {\n        this.onStop();\n      }\n      this.active = false;\n    }\n  }\n}\nfunction cleanupEffect(effect2) {\n  const { deps } = effect2;\n  if (deps.length) {\n    for (let i = 0; i < deps.length; i++) {\n      deps[i].delete(effect2);\n    }\n    deps.length = 0;\n  }\n}\nfunction effect(fn, options) {\n  if (fn.effect) {\n    fn = fn.effect.fn;\n  }\n  const _effect = new ReactiveEffect(fn);\n  if (options) {\n    extend(_effect, options);\n    if (options.scope)\n      recordEffectScope(_effect, options.scope);\n  }\n  if (!options || !options.lazy) {\n    _effect.run();\n  }\n  const runner = _effect.run.bind(_effect);\n  runner.effect = _effect;\n  return runner;\n}\nfunction stop(runner) {\n  runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction track(target, type, key) {\n  if (shouldTrack && activeEffect) {\n    let depsMap = targetMap.get(target);\n    if (!depsMap) {\n      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n    }\n    let dep = depsMap.get(key);\n    if (!dep) {\n      depsMap.set(key, dep = createDep());\n    }\n    const eventInfo = !!(process.env.NODE_ENV !== \"production\") ? { effect: activeEffect, target, type, key } : void 0;\n    trackEffects(dep, eventInfo);\n  }\n}\nfunction trackEffects(dep, debuggerEventExtraInfo) {\n  let shouldTrack2 = false;\n  if (effectTrackDepth <= maxMarkerBits) {\n    if (!newTracked(dep)) {\n      dep.n |= trackOpBit;\n      shouldTrack2 = !wasTracked(dep);\n    }\n  } else {\n    shouldTrack2 = !dep.has(activeEffect);\n  }\n  if (shouldTrack2) {\n    dep.add(activeEffect);\n    activeEffect.deps.push(dep);\n    if (!!(process.env.NODE_ENV !== \"production\") && activeEffect.onTrack) {\n      activeEffect.onTrack(\n        extend(\n          {\n            effect: activeEffect\n          },\n          debuggerEventExtraInfo\n        )\n      );\n    }\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    return;\n  }\n  let deps = [];\n  if (type === \"clear\") {\n    deps = [...depsMap.values()];\n  } else if (key === \"length\" && isArray(target)) {\n    const newLength = Number(newValue);\n    depsMap.forEach((dep, key2) => {\n      if (key2 === \"length\" || key2 >= newLength) {\n        deps.push(dep);\n      }\n    });\n  } else {\n    if (key !== void 0) {\n      deps.push(depsMap.get(key));\n    }\n    switch (type) {\n      case \"add\":\n        if (!isArray(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        } else if (isIntegerKey(key)) {\n          deps.push(depsMap.get(\"length\"));\n        }\n        break;\n      case \"delete\":\n        if (!isArray(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        }\n        break;\n      case \"set\":\n        if (isMap(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n        }\n        break;\n    }\n  }\n  const eventInfo = !!(process.env.NODE_ENV !== \"production\") ? { target, type, key, newValue, oldValue, oldTarget } : void 0;\n  if (deps.length === 1) {\n    if (deps[0]) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        triggerEffects(deps[0], eventInfo);\n      } else {\n        triggerEffects(deps[0]);\n      }\n    }\n  } else {\n    const effects = [];\n    for (const dep of deps) {\n      if (dep) {\n        effects.push(...dep);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      triggerEffects(createDep(effects), eventInfo);\n    } else {\n      triggerEffects(createDep(effects));\n    }\n  }\n}\nfunction triggerEffects(dep, debuggerEventExtraInfo) {\n  const effects = isArray(dep) ? dep : [...dep];\n  for (const effect2 of effects) {\n    if (effect2.computed) {\n      triggerEffect(effect2, debuggerEventExtraInfo);\n    }\n  }\n  for (const effect2 of effects) {\n    if (!effect2.computed) {\n      triggerEffect(effect2, debuggerEventExtraInfo);\n    }\n  }\n}\nfunction triggerEffect(effect2, debuggerEventExtraInfo) {\n  if (effect2 !== activeEffect || effect2.allowRecurse) {\n    if (!!(process.env.NODE_ENV !== \"production\") && effect2.onTrigger) {\n      effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));\n    }\n    if (effect2.scheduler) {\n      effect2.scheduler();\n    } else {\n      effect2.run();\n    }\n  }\n}\nfunction getDepFromReactive(object, key) {\n  var _a;\n  return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nconst get$1 = /* @__PURE__ */ createGetter();\nconst shallowGet = /* @__PURE__ */ createGetter(false, true);\nconst readonlyGet = /* @__PURE__ */ createGetter(true);\nconst shallowReadonlyGet = /* @__PURE__ */ createGetter(true, true);\nconst arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n  const instrumentations = {};\n  [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      const arr = toRaw(this);\n      for (let i = 0, l = this.length; i < l; i++) {\n        track(arr, \"get\", i + \"\");\n      }\n      const res = arr[key](...args);\n      if (res === -1 || res === false) {\n        return arr[key](...args.map(toRaw));\n      } else {\n        return res;\n      }\n    };\n  });\n  [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      pauseTracking();\n      const res = toRaw(this)[key].apply(this, args);\n      resetTracking();\n      return res;\n    };\n  });\n  return instrumentations;\n}\nfunction hasOwnProperty(key) {\n  const obj = toRaw(this);\n  track(obj, \"has\", key);\n  return obj.hasOwnProperty(key);\n}\nfunction createGetter(isReadonly2 = false, shallow = false) {\n  return function get2(target, key, receiver) {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_isShallow\") {\n      return shallow;\n    } else if (key === \"__v_raw\" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {\n      return target;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly2) {\n      if (targetIsArray && hasOwn(arrayInstrumentations, key)) {\n        return Reflect.get(arrayInstrumentations, key, receiver);\n      }\n      if (key === \"hasOwnProperty\") {\n        return hasOwnProperty;\n      }\n    }\n    const res = Reflect.get(target, key, receiver);\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly2) {\n      track(target, \"get\", key);\n    }\n    if (shallow) {\n      return res;\n    }\n    if (isRef(res)) {\n      return targetIsArray && isIntegerKey(key) ? res : res.value;\n    }\n    if (isObject(res)) {\n      return isReadonly2 ? readonly(res) : reactive(res);\n    }\n    return res;\n  };\n}\nconst set$1 = /* @__PURE__ */ createSetter();\nconst shallowSet = /* @__PURE__ */ createSetter(true);\nfunction createSetter(shallow = false) {\n  return function set2(target, key, value, receiver) {\n    let oldValue = target[key];\n    if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {\n      return false;\n    }\n    if (!shallow) {\n      if (!isShallow(value) && !isReadonly(value)) {\n        oldValue = toRaw(oldValue);\n        value = toRaw(value);\n      }\n      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n        oldValue.value = value;\n        return true;\n      }\n    }\n    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(target, key, value, receiver);\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  };\n}\nfunction deleteProperty(target, key) {\n  const hadKey = hasOwn(target, key);\n  const oldValue = target[key];\n  const result = Reflect.deleteProperty(target, key);\n  if (result && hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction has$1(target, key) {\n  const result = Reflect.has(target, key);\n  if (!isSymbol(key) || !builtInSymbols.has(key)) {\n    track(target, \"has\", key);\n  }\n  return result;\n}\nfunction ownKeys(target) {\n  track(target, \"iterate\", isArray(target) ? \"length\" : ITERATE_KEY);\n  return Reflect.ownKeys(target);\n}\nconst mutableHandlers = {\n  get: get$1,\n  set: set$1,\n  deleteProperty,\n  has: has$1,\n  ownKeys\n};\nconst readonlyHandlers = {\n  get: readonlyGet,\n  set(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  },\n  deleteProperty(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n};\nconst shallowReactiveHandlers = /* @__PURE__ */ extend(\n  {},\n  mutableHandlers,\n  {\n    get: shallowGet,\n    set: shallowSet\n  }\n);\nconst shallowReadonlyHandlers = /* @__PURE__ */ extend(\n  {},\n  readonlyHandlers,\n  {\n    get: shallowReadonlyGet\n  }\n);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly = false, isShallow = false) {\n  target = target[\"__v_raw\"];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (!isReadonly) {\n    if (key !== rawKey) {\n      track(rawTarget, \"get\", key);\n    }\n    track(rawTarget, \"get\", rawKey);\n  }\n  const { has: has2 } = getProto(rawTarget);\n  const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n  if (has2.call(rawTarget, key)) {\n    return wrap(target.get(key));\n  } else if (has2.call(rawTarget, rawKey)) {\n    return wrap(target.get(rawKey));\n  } else if (target !== rawTarget) {\n    target.get(key);\n  }\n}\nfunction has(key, isReadonly = false) {\n  const target = this[\"__v_raw\"];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (!isReadonly) {\n    if (key !== rawKey) {\n      track(rawTarget, \"has\", key);\n    }\n    track(rawTarget, \"has\", rawKey);\n  }\n  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n  target = target[\"__v_raw\"];\n  !isReadonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n  return Reflect.get(target, \"size\", target);\n}\nfunction add(value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const proto = getProto(target);\n  const hadKey = proto.has.call(target, value);\n  if (!hadKey) {\n    target.add(value);\n    trigger(target, \"add\", value, value);\n  }\n  return this;\n}\nfunction set(key, value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const { has: has2, get: get2 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get2.call(target, key);\n  target.set(key, value);\n  if (!hadKey) {\n    trigger(target, \"add\", key, value);\n  } else if (hasChanged(value, oldValue)) {\n    trigger(target, \"set\", key, value, oldValue);\n  }\n  return this;\n}\nfunction deleteEntry(key) {\n  const target = toRaw(this);\n  const { has: has2, get: get2 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get2 ? get2.call(target, key) : void 0;\n  const result = target.delete(key);\n  if (hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction clear() {\n  const target = toRaw(this);\n  const hadItems = target.size !== 0;\n  const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n  const result = target.clear();\n  if (hadItems) {\n    trigger(target, \"clear\", void 0, void 0, oldTarget);\n  }\n  return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n  return function forEach(callback, thisArg) {\n    const observed = this;\n    const target = observed[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n    return target.forEach((value, key) => {\n      return callback.call(thisArg, wrap(value), wrap(key), observed);\n    });\n  };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n  return function(...args) {\n    const target = this[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(\n      rawTarget,\n      \"iterate\",\n      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n    );\n    return {\n      // iterator protocol\n      next() {\n        const { value, done } = innerIterator.next();\n        return done ? { value, done } : {\n          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n          done\n        };\n      },\n      // iterable protocol\n      [Symbol.iterator]() {\n        return this;\n      }\n    };\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      console.warn(\n        `${capitalize(type)} operation ${key}failed: target is readonly.`,\n        toRaw(this)\n      );\n    }\n    return type === \"delete\" ? false : this;\n  };\n}\nfunction createInstrumentations() {\n  const mutableInstrumentations2 = {\n    get(key) {\n      return get(this, key);\n    },\n    get size() {\n      return size(this);\n    },\n    has,\n    add,\n    set,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, false)\n  };\n  const shallowInstrumentations2 = {\n    get(key) {\n      return get(this, key, false, true);\n    },\n    get size() {\n      return size(this);\n    },\n    has,\n    add,\n    set,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, true)\n  };\n  const readonlyInstrumentations2 = {\n    get(key) {\n      return get(this, key, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has.call(this, key, true);\n    },\n    add: createReadonlyMethod(\"add\"),\n    set: createReadonlyMethod(\"set\"),\n    delete: createReadonlyMethod(\"delete\"),\n    clear: createReadonlyMethod(\"clear\"),\n    forEach: createForEach(true, false)\n  };\n  const shallowReadonlyInstrumentations2 = {\n    get(key) {\n      return get(this, key, true, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has.call(this, key, true);\n    },\n    add: createReadonlyMethod(\"add\"),\n    set: createReadonlyMethod(\"set\"),\n    delete: createReadonlyMethod(\"delete\"),\n    clear: createReadonlyMethod(\"clear\"),\n    forEach: createForEach(true, true)\n  };\n  const iteratorMethods = [\"keys\", \"values\", \"entries\", Symbol.iterator];\n  iteratorMethods.forEach((method) => {\n    mutableInstrumentations2[method] = createIterableMethod(\n      method,\n      false,\n      false\n    );\n    readonlyInstrumentations2[method] = createIterableMethod(\n      method,\n      true,\n      false\n    );\n    shallowInstrumentations2[method] = createIterableMethod(\n      method,\n      false,\n      true\n    );\n    shallowReadonlyInstrumentations2[method] = createIterableMethod(\n      method,\n      true,\n      true\n    );\n  });\n  return [\n    mutableInstrumentations2,\n    readonlyInstrumentations2,\n    shallowInstrumentations2,\n    shallowReadonlyInstrumentations2\n  ];\n}\nconst [\n  mutableInstrumentations,\n  readonlyInstrumentations,\n  shallowInstrumentations,\n  shallowReadonlyInstrumentations\n] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n  const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(\n      hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n      key,\n      receiver\n    );\n  };\n}\nconst mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has2, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has2.call(target, rawKey)) {\n    const type = toRawType(target);\n    console.warn(\n      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n    );\n  }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1 /* COMMON */;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2 /* COLLECTION */;\n    default:\n      return 0 /* INVALID */;\n  }\n}\nfunction getTargetType(value) {\n  return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n  if (isReadonly(target)) {\n    return target;\n  }\n  return createReactiveObject(\n    target,\n    false,\n    mutableHandlers,\n    mutableCollectionHandlers,\n    reactiveMap\n  );\n}\nfunction shallowReactive(target) {\n  return createReactiveObject(\n    target,\n    false,\n    shallowReactiveHandlers,\n    shallowCollectionHandlers,\n    shallowReactiveMap\n  );\n}\nfunction readonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    readonlyHandlers,\n    readonlyCollectionHandlers,\n    readonlyMap\n  );\n}\nfunction shallowReadonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    shallowReadonlyHandlers,\n    shallowReadonlyCollectionHandlers,\n    shallowReadonlyMap\n  );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      console.warn(`value cannot be made reactive: ${String(target)}`);\n    }\n    return target;\n  }\n  if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0 /* INVALID */) {\n    return target;\n  }\n  const proxy = new Proxy(\n    target,\n    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n  );\n  proxyMap.set(target, proxy);\n  return proxy;\n}\nfunction isReactive(value) {\n  if (isReadonly(value)) {\n    return isReactive(value[\"__v_raw\"]);\n  }\n  return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n  return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n  return isReactive(value) || isReadonly(value);\n}\nfunction toRaw(observed) {\n  const raw = observed && observed[\"__v_raw\"];\n  return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n  def(value, \"__v_skip\", true);\n  return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction trackRefValue(ref2) {\n  if (shouldTrack && activeEffect) {\n    ref2 = toRaw(ref2);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      trackEffects(ref2.dep || (ref2.dep = createDep()), {\n        target: ref2,\n        type: \"get\",\n        key: \"value\"\n      });\n    } else {\n      trackEffects(ref2.dep || (ref2.dep = createDep()));\n    }\n  }\n}\nfunction triggerRefValue(ref2, newVal) {\n  ref2 = toRaw(ref2);\n  const dep = ref2.dep;\n  if (dep) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      triggerEffects(dep, {\n        target: ref2,\n        type: \"set\",\n        key: \"value\",\n        newValue: newVal\n      });\n    } else {\n      triggerEffects(dep);\n    }\n  }\n}\nfunction isRef(r) {\n  return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n  return createRef(value, false);\n}\nfunction shallowRef(value) {\n  return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n  if (isRef(rawValue)) {\n    return rawValue;\n  }\n  return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n  constructor(value, __v_isShallow) {\n    this.__v_isShallow = __v_isShallow;\n    this.dep = void 0;\n    this.__v_isRef = true;\n    this._rawValue = __v_isShallow ? value : toRaw(value);\n    this._value = __v_isShallow ? value : toReactive(value);\n  }\n  get value() {\n    trackRefValue(this);\n    return this._value;\n  }\n  set value(newVal) {\n    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n    newVal = useDirectValue ? newVal : toRaw(newVal);\n    if (hasChanged(newVal, this._rawValue)) {\n      this._rawValue = newVal;\n      this._value = useDirectValue ? newVal : toReactive(newVal);\n      triggerRefValue(this, newVal);\n    }\n  }\n}\nfunction triggerRef(ref2) {\n  triggerRefValue(ref2, !!(process.env.NODE_ENV !== \"production\") ? ref2.value : void 0);\n}\nfunction unref(ref2) {\n  return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n  return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n  set: (target, key, value, receiver) => {\n    const oldValue = target[key];\n    if (isRef(oldValue) && !isRef(value)) {\n      oldValue.value = value;\n      return true;\n    } else {\n      return Reflect.set(target, key, value, receiver);\n    }\n  }\n};\nfunction proxyRefs(objectWithRefs) {\n  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n  constructor(factory) {\n    this.dep = void 0;\n    this.__v_isRef = true;\n    const { get, set } = factory(\n      () => trackRefValue(this),\n      () => triggerRefValue(this)\n    );\n    this._get = get;\n    this._set = set;\n  }\n  get value() {\n    return this._get();\n  }\n  set value(newVal) {\n    this._set(newVal);\n  }\n}\nfunction customRef(factory) {\n  return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n    console.warn(`toRefs() expects a reactive object but received a plain one.`);\n  }\n  const ret = isArray(object) ? new Array(object.length) : {};\n  for (const key in object) {\n    ret[key] = propertyToRef(object, key);\n  }\n  return ret;\n}\nclass ObjectRefImpl {\n  constructor(_object, _key, _defaultValue) {\n    this._object = _object;\n    this._key = _key;\n    this._defaultValue = _defaultValue;\n    this.__v_isRef = true;\n  }\n  get value() {\n    const val = this._object[this._key];\n    return val === void 0 ? this._defaultValue : val;\n  }\n  set value(newVal) {\n    this._object[this._key] = newVal;\n  }\n  get dep() {\n    return getDepFromReactive(toRaw(this._object), this._key);\n  }\n}\nclass GetterRefImpl {\n  constructor(_getter) {\n    this._getter = _getter;\n    this.__v_isRef = true;\n    this.__v_isReadonly = true;\n  }\n  get value() {\n    return this._getter();\n  }\n}\nfunction toRef(source, key, defaultValue) {\n  if (isRef(source)) {\n    return source;\n  } else if (isFunction(source)) {\n    return new GetterRefImpl(source);\n  } else if (isObject(source) && arguments.length > 1) {\n    return propertyToRef(source, key, defaultValue);\n  } else {\n    return ref(source);\n  }\n}\nfunction propertyToRef(source, key, defaultValue) {\n  const val = source[key];\n  return isRef(val) ? val : new ObjectRefImpl(\n    source,\n    key,\n    defaultValue\n  );\n}\n\nclass ComputedRefImpl {\n  constructor(getter, _setter, isReadonly, isSSR) {\n    this._setter = _setter;\n    this.dep = void 0;\n    this.__v_isRef = true;\n    this[\"__v_isReadonly\"] = false;\n    this._dirty = true;\n    this.effect = new ReactiveEffect(getter, () => {\n      if (!this._dirty) {\n        this._dirty = true;\n        triggerRefValue(this);\n      }\n    });\n    this.effect.computed = this;\n    this.effect.active = this._cacheable = !isSSR;\n    this[\"__v_isReadonly\"] = isReadonly;\n  }\n  get value() {\n    const self = toRaw(this);\n    trackRefValue(self);\n    if (self._dirty || !self._cacheable) {\n      self._dirty = false;\n      self._value = self.effect.run();\n    }\n    return self._value;\n  }\n  set value(newValue) {\n    this._setter(newValue);\n  }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n  let getter;\n  let setter;\n  const onlyGetter = isFunction(getterOrOptions);\n  if (onlyGetter) {\n    getter = getterOrOptions;\n    setter = !!(process.env.NODE_ENV !== \"production\") ? () => {\n      console.warn(\"Write operation failed: computed value is readonly\");\n    } : NOOP;\n  } else {\n    getter = getterOrOptions.get;\n    setter = getterOrOptions.set;\n  }\n  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n  if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n    cRef.effect.onTrack = debugOptions.onTrack;\n    cRef.effect.onTrigger = debugOptions.onTrigger;\n  }\n  return cRef;\n}\n\nconst tick = /* @__PURE__ */ Promise.resolve();\nconst queue = [];\nlet queued = false;\nconst scheduler = (fn) => {\n  queue.push(fn);\n  if (!queued) {\n    queued = true;\n    tick.then(flush);\n  }\n};\nconst flush = () => {\n  for (let i = 0; i < queue.length; i++) {\n    queue[i]();\n  }\n  queue.length = 0;\n  queued = false;\n};\nclass DeferredComputedRefImpl {\n  constructor(getter) {\n    this.dep = void 0;\n    this._dirty = true;\n    this.__v_isRef = true;\n    this[\"__v_isReadonly\"] = true;\n    let compareTarget;\n    let hasCompareTarget = false;\n    let scheduled = false;\n    this.effect = new ReactiveEffect(getter, (computedTrigger) => {\n      if (this.dep) {\n        if (computedTrigger) {\n          compareTarget = this._value;\n          hasCompareTarget = true;\n        } else if (!scheduled) {\n          const valueToCompare = hasCompareTarget ? compareTarget : this._value;\n          scheduled = true;\n          hasCompareTarget = false;\n          scheduler(() => {\n            if (this.effect.active && this._get() !== valueToCompare) {\n              triggerRefValue(this);\n            }\n            scheduled = false;\n          });\n        }\n        for (const e of this.dep) {\n          if (e.computed instanceof DeferredComputedRefImpl) {\n            e.scheduler(\n              true\n              /* computedTrigger */\n            );\n          }\n        }\n      }\n      this._dirty = true;\n    });\n    this.effect.computed = this;\n  }\n  _get() {\n    if (this._dirty) {\n      this._dirty = false;\n      return this._value = this.effect.run();\n    }\n    return this._value;\n  }\n  get value() {\n    trackRefValue(this);\n    return toRaw(this)._get();\n  }\n}\nfunction deferredComputed(getter) {\n  return new DeferredComputedRefImpl(getter);\n}\n\nexport { EffectScope, ITERATE_KEY, ReactiveEffect, computed, customRef, deferredComputed, effect, effectScope, enableTracking, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, pauseTracking, proxyRefs, reactive, readonly, ref, resetTracking, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, track, trigger, triggerRef, unref };\n","function makeMap(str, expectsLowerCase) {\n  const map = /* @__PURE__ */ Object.create(null);\n  const list = str.split(\",\");\n  for (let i = 0; i < list.length; i++) {\n    map[list[i]] = true;\n  }\n  return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst onRE = /^on[^a-z]/;\nconst isOn = (key) => onRE.test(key);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n  const i = arr.indexOf(el);\n  if (i > -1) {\n    arr.splice(i, 1);\n  }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n  return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n  // the leading comma is intentional so empty string \"\" is also included\n  \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n  \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n  (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction(\n  (str) => str.charAt(0).toUpperCase() + str.slice(1)\n);\nconst toHandlerKey = cacheStringFunction(\n  (str) => str ? `on${capitalize(str)}` : ``\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](arg);\n  }\n};\nconst def = (obj, key, value) => {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: false,\n    value\n  });\n};\nconst looseToNumber = (val) => {\n  const n = parseFloat(val);\n  return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n  const n = isString(val) ? Number(val) : NaN;\n  return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n  return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlagNames = {\n  [1]: `TEXT`,\n  [2]: `CLASS`,\n  [4]: `STYLE`,\n  [8]: `PROPS`,\n  [16]: `FULL_PROPS`,\n  [32]: `HYDRATE_EVENTS`,\n  [64]: `STABLE_FRAGMENT`,\n  [128]: `KEYED_FRAGMENT`,\n  [256]: `UNKEYED_FRAGMENT`,\n  [512]: `NEED_PATCH`,\n  [1024]: `DYNAMIC_SLOTS`,\n  [2048]: `DEV_ROOT_FRAGMENT`,\n  [-1]: `HOISTED`,\n  [-2]: `BAIL`\n};\n\nconst slotFlagsText = {\n  [1]: \"STABLE\",\n  [2]: \"DYNAMIC\",\n  [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_WHITE_LISTED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console\";\nconst isGloballyWhitelisted = /* @__PURE__ */ makeMap(GLOBALS_WHITE_LISTED);\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n  let lines = source.split(/(\\r?\\n)/);\n  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n  lines = lines.filter((_, idx) => idx % 2 === 0);\n  let count = 0;\n  const res = [];\n  for (let i = 0; i < lines.length; i++) {\n    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n    if (count >= start) {\n      for (let j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length)\n          continue;\n        const line = j + 1;\n        res.push(\n          `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`\n        );\n        const lineLength = lines[j].length;\n        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n        if (j === i) {\n          const pad = start - (count - (lineLength + newLineSeqLength));\n          const length = Math.max(\n            1,\n            end > count ? lineLength - pad : end - start\n          );\n          res.push(`   |  ` + \" \".repeat(pad) + \"^\".repeat(length));\n        } else if (j > i) {\n          if (end > count) {\n            const length = Math.max(Math.min(end - count, lineLength), 1);\n            res.push(`   |  ` + \"^\".repeat(length));\n          }\n          count += lineLength + newLineSeqLength;\n        }\n      }\n      break;\n    }\n  }\n  return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n  if (isArray(value)) {\n    const res = {};\n    for (let i = 0; i < value.length; i++) {\n      const item = value[i];\n      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n      if (normalized) {\n        for (const key in normalized) {\n          res[key] = normalized[key];\n        }\n      }\n    }\n    return res;\n  } else if (isString(value)) {\n    return value;\n  } else if (isObject(value)) {\n    return value;\n  }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n  const ret = {};\n  cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n    if (item) {\n      const tmp = item.split(propertyDelimiterRE);\n      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return ret;\n}\nfunction stringifyStyle(styles) {\n  let ret = \"\";\n  if (!styles || isString(styles)) {\n    return ret;\n  }\n  for (const key in styles) {\n    const value = styles[key];\n    const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n    if (isString(value) || typeof value === \"number\") {\n      ret += `${normalizedKey}:${value};`;\n    }\n  }\n  return ret;\n}\nfunction normalizeClass(value) {\n  let res = \"\";\n  if (isString(value)) {\n    res = value;\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      const normalized = normalizeClass(value[i]);\n      if (normalized) {\n        res += normalized + \" \";\n      }\n    }\n  } else if (isObject(value)) {\n    for (const name in value) {\n      if (value[name]) {\n        res += name + \" \";\n      }\n    }\n  }\n  return res.trim();\n}\nfunction normalizeProps(props) {\n  if (!props)\n    return null;\n  let { class: klass, style } = props;\n  if (klass && !isString(klass)) {\n    props.class = normalizeClass(klass);\n  }\n  if (style) {\n    props.style = normalizeStyle(style);\n  }\n  return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n  return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n  if (attrValidationCache.hasOwnProperty(name)) {\n    return attrValidationCache[name];\n  }\n  const isUnsafe = unsafeAttrCharRE.test(name);\n  if (isUnsafe) {\n    console.error(`unsafe attribute name: ${name}`);\n  }\n  return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n  acceptCharset: \"accept-charset\",\n  className: \"class\",\n  htmlFor: \"for\",\n  httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n  const str = \"\" + string;\n  const match = escapeRE.exec(str);\n  if (!match) {\n    return str;\n  }\n  let html = \"\";\n  let escaped;\n  let index;\n  let lastIndex = 0;\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        escaped = \"&quot;\";\n        break;\n      case 38:\n        escaped = \"&amp;\";\n        break;\n      case 39:\n        escaped = \"&#39;\";\n        break;\n      case 60:\n        escaped = \"&lt;\";\n        break;\n      case 62:\n        escaped = \"&gt;\";\n        break;\n      default:\n        continue;\n    }\n    if (lastIndex !== index) {\n      html += str.slice(lastIndex, index);\n    }\n    lastIndex = index + 1;\n    html += escaped;\n  }\n  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n  return src.replace(commentStripRE, \"\");\n}\n\nfunction looseCompareArrays(a, b) {\n  if (a.length !== b.length)\n    return false;\n  let equal = true;\n  for (let i = 0; equal && i < a.length; i++) {\n    equal = looseEqual(a[i], b[i]);\n  }\n  return equal;\n}\nfunction looseEqual(a, b) {\n  if (a === b)\n    return true;\n  let aValidType = isDate(a);\n  let bValidType = isDate(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n  }\n  aValidType = isSymbol(a);\n  bValidType = isSymbol(b);\n  if (aValidType || bValidType) {\n    return a === b;\n  }\n  aValidType = isArray(a);\n  bValidType = isArray(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n  }\n  aValidType = isObject(a);\n  bValidType = isObject(b);\n  if (aValidType || bValidType) {\n    if (!aValidType || !bValidType) {\n      return false;\n    }\n    const aKeysCount = Object.keys(a).length;\n    const bKeysCount = Object.keys(b).length;\n    if (aKeysCount !== bKeysCount) {\n      return false;\n    }\n    for (const key in a) {\n      const aHasKey = a.hasOwnProperty(key);\n      const bHasKey = b.hasOwnProperty(key);\n      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n  }\n  return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n  return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst toDisplayString = (val) => {\n  return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n  if (val && val.__v_isRef) {\n    return replacer(_key, val.value);\n  } else if (isMap(val)) {\n    return {\n      [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {\n        entries[`${key} =>`] = val2;\n        return entries;\n      }, {})\n    };\n  } else if (isSet(val)) {\n    return {\n      [`Set(${val.size})`]: [...val.values()]\n    };\n  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n    return String(val);\n  }\n  return val;\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.automationEvents = {}, global._slicedToArray, global._classCallCheck, global._createClass));\n})(this, (function (exports, _slicedToArray, _classCallCheck, _createClass) { 'use strict';\n\n    function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\n    var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);\n    var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck);\n    var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);\n\n    var createExtendedExponentialRampToValueAutomationEvent = function createExtendedExponentialRampToValueAutomationEvent(value, endTime, insertTime) {\n      return {\n        endTime: endTime,\n        insertTime: insertTime,\n        type: 'exponentialRampToValue',\n        value: value\n      };\n    };\n\n    var createExtendedLinearRampToValueAutomationEvent = function createExtendedLinearRampToValueAutomationEvent(value, endTime, insertTime) {\n      return {\n        endTime: endTime,\n        insertTime: insertTime,\n        type: 'linearRampToValue',\n        value: value\n      };\n    };\n\n    var createSetValueAutomationEvent = function createSetValueAutomationEvent(value, startTime) {\n      return {\n        startTime: startTime,\n        type: 'setValue',\n        value: value\n      };\n    };\n\n    var createSetValueCurveAutomationEvent = function createSetValueCurveAutomationEvent(values, startTime, duration) {\n      return {\n        duration: duration,\n        startTime: startTime,\n        type: 'setValueCurve',\n        values: values\n      };\n    };\n\n    var getTargetValueAtTime = function getTargetValueAtTime(time, valueAtStartTime, _ref) {\n      var startTime = _ref.startTime,\n          target = _ref.target,\n          timeConstant = _ref.timeConstant;\n      return target + (valueAtStartTime - target) * Math.exp((startTime - time) / timeConstant);\n    };\n\n    var isExponentialRampToValueAutomationEvent = function isExponentialRampToValueAutomationEvent(automationEvent) {\n      return automationEvent.type === 'exponentialRampToValue';\n    };\n\n    var isLinearRampToValueAutomationEvent = function isLinearRampToValueAutomationEvent(automationEvent) {\n      return automationEvent.type === 'linearRampToValue';\n    };\n\n    var isAnyRampToValueAutomationEvent = function isAnyRampToValueAutomationEvent(automationEvent) {\n      return isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent);\n    };\n\n    var isSetValueAutomationEvent = function isSetValueAutomationEvent(automationEvent) {\n      return automationEvent.type === 'setValue';\n    };\n\n    var isSetValueCurveAutomationEvent = function isSetValueCurveAutomationEvent(automationEvent) {\n      return automationEvent.type === 'setValueCurve';\n    };\n\n    var getValueOfAutomationEventAtIndexAtTime = function getValueOfAutomationEventAtIndexAtTime(automationEvents, index, time, defaultValue) {\n      var automationEvent = automationEvents[index];\n      return automationEvent === undefined ? defaultValue : isAnyRampToValueAutomationEvent(automationEvent) || isSetValueAutomationEvent(automationEvent) ? automationEvent.value : isSetValueCurveAutomationEvent(automationEvent) ? automationEvent.values[automationEvent.values.length - 1] : getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, automationEvent.startTime, defaultValue), automationEvent);\n    };\n\n    var getEndTimeAndValueOfPreviousAutomationEvent = function getEndTimeAndValueOfPreviousAutomationEvent(automationEvents, index, currentAutomationEvent, nextAutomationEvent, defaultValue) {\n      return currentAutomationEvent === undefined ? [nextAutomationEvent.insertTime, defaultValue] : isAnyRampToValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.endTime, currentAutomationEvent.value] : isSetValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime, currentAutomationEvent.value] : isSetValueCurveAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime + currentAutomationEvent.duration, currentAutomationEvent.values[currentAutomationEvent.values.length - 1]] : [currentAutomationEvent.startTime, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, currentAutomationEvent.startTime, defaultValue)];\n    };\n\n    var isCancelAndHoldAutomationEvent = function isCancelAndHoldAutomationEvent(automationEvent) {\n      return automationEvent.type === 'cancelAndHold';\n    };\n\n    var isCancelScheduledValuesAutomationEvent = function isCancelScheduledValuesAutomationEvent(automationEvent) {\n      return automationEvent.type === 'cancelScheduledValues';\n    };\n\n    var getEventTime = function getEventTime(automationEvent) {\n      if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n        return automationEvent.cancelTime;\n      }\n\n      if (isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent)) {\n        return automationEvent.endTime;\n      }\n\n      return automationEvent.startTime;\n    };\n\n    var getExponentialRampValueAtTime = function getExponentialRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n      var endTime = _ref.endTime,\n          value = _ref.value;\n\n      if (valueAtStartTime === value) {\n        return value;\n      }\n\n      if (0 < valueAtStartTime && 0 < value || valueAtStartTime < 0 && value < 0) {\n        return valueAtStartTime * Math.pow(value / valueAtStartTime, (time - startTime) / (endTime - startTime));\n      }\n\n      return 0;\n    };\n\n    var getLinearRampValueAtTime = function getLinearRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n      var endTime = _ref.endTime,\n          value = _ref.value;\n      return valueAtStartTime + (time - startTime) / (endTime - startTime) * (value - valueAtStartTime);\n    };\n\n    var interpolateValue = function interpolateValue(values, theoreticIndex) {\n      var lowerIndex = Math.floor(theoreticIndex);\n      var upperIndex = Math.ceil(theoreticIndex);\n\n      if (lowerIndex === upperIndex) {\n        return values[lowerIndex];\n      }\n\n      return (1 - (theoreticIndex - lowerIndex)) * values[lowerIndex] + (1 - (upperIndex - theoreticIndex)) * values[upperIndex];\n    };\n\n    var getValueCurveValueAtTime = function getValueCurveValueAtTime(time, _ref) {\n      var duration = _ref.duration,\n          startTime = _ref.startTime,\n          values = _ref.values;\n      var theoreticIndex = (time - startTime) / duration * (values.length - 1);\n      return interpolateValue(values, theoreticIndex);\n    };\n\n    var isSetTargetAutomationEvent = function isSetTargetAutomationEvent(automationEvent) {\n      return automationEvent.type === 'setTarget';\n    };\n\n    var AutomationEventList = /*#__PURE__*/function (_Symbol$iterator) {\n      function AutomationEventList(defaultValue) {\n        _classCallCheck__default[\"default\"](this, AutomationEventList);\n\n        this._automationEvents = [];\n        this._currenTime = 0;\n        this._defaultValue = defaultValue;\n      }\n\n      _createClass__default[\"default\"](AutomationEventList, [{\n        key: _Symbol$iterator,\n        value: function value() {\n          return this._automationEvents[Symbol.iterator]();\n        }\n      }, {\n        key: \"add\",\n        value: function add(automationEvent) {\n          var eventTime = getEventTime(automationEvent);\n\n          if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n            var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n              if (isCancelScheduledValuesAutomationEvent(automationEvent) && isSetValueCurveAutomationEvent(currentAutomationEvent)) {\n                return currentAutomationEvent.startTime + currentAutomationEvent.duration >= eventTime;\n              }\n\n              return getEventTime(currentAutomationEvent) >= eventTime;\n            });\n\n            var removedAutomationEvent = this._automationEvents[index];\n\n            if (index !== -1) {\n              this._automationEvents = this._automationEvents.slice(0, index);\n            }\n\n            if (isCancelAndHoldAutomationEvent(automationEvent)) {\n              var lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];\n\n              if (removedAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(removedAutomationEvent)) {\n                if (isSetTargetAutomationEvent(lastAutomationEvent)) {\n                  throw new Error('The internal list is malformed.');\n                }\n\n                var startTime = isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.startTime + lastAutomationEvent.duration : getEventTime(lastAutomationEvent);\n                var startValue = isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.values[lastAutomationEvent.values.length - 1] : lastAutomationEvent.value;\n                var value = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? getExponentialRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent) : getLinearRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent);\n                var truncatedAutomationEvent = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? createExtendedExponentialRampToValueAutomationEvent(value, eventTime, this._currenTime) : createExtendedLinearRampToValueAutomationEvent(value, eventTime, this._currenTime);\n\n                this._automationEvents.push(truncatedAutomationEvent);\n              }\n\n              if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n                this._automationEvents.push(createSetValueAutomationEvent(this.getValue(eventTime), eventTime));\n              }\n\n              if (lastAutomationEvent !== undefined && isSetValueCurveAutomationEvent(lastAutomationEvent) && lastAutomationEvent.startTime + lastAutomationEvent.duration > eventTime) {\n                this._automationEvents[this._automationEvents.length - 1] = createSetValueCurveAutomationEvent(new Float32Array([6, 7]), lastAutomationEvent.startTime, eventTime - lastAutomationEvent.startTime);\n              }\n            }\n          } else {\n            var _index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n              return getEventTime(currentAutomationEvent) > eventTime;\n            });\n\n            var previousAutomationEvent = _index === -1 ? this._automationEvents[this._automationEvents.length - 1] : this._automationEvents[_index - 1];\n\n            if (previousAutomationEvent !== undefined && isSetValueCurveAutomationEvent(previousAutomationEvent) && getEventTime(previousAutomationEvent) + previousAutomationEvent.duration > eventTime) {\n              return false;\n            }\n\n            var persistentAutomationEvent = isExponentialRampToValueAutomationEvent(automationEvent) ? createExtendedExponentialRampToValueAutomationEvent(automationEvent.value, automationEvent.endTime, this._currenTime) : isLinearRampToValueAutomationEvent(automationEvent) ? createExtendedLinearRampToValueAutomationEvent(automationEvent.value, eventTime, this._currenTime) : automationEvent;\n\n            if (_index === -1) {\n              this._automationEvents.push(persistentAutomationEvent);\n            } else {\n              if (isSetValueCurveAutomationEvent(automationEvent) && eventTime + automationEvent.duration > getEventTime(this._automationEvents[_index])) {\n                return false;\n              }\n\n              this._automationEvents.splice(_index, 0, persistentAutomationEvent);\n            }\n          }\n\n          return true;\n        }\n      }, {\n        key: \"flush\",\n        value: function flush(time) {\n          var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n            return getEventTime(currentAutomationEvent) > time;\n          });\n\n          if (index > 1) {\n            var remainingAutomationEvents = this._automationEvents.slice(index - 1);\n\n            var firstRemainingAutomationEvent = remainingAutomationEvents[0];\n\n            if (isSetTargetAutomationEvent(firstRemainingAutomationEvent)) {\n              remainingAutomationEvents.unshift(createSetValueAutomationEvent(getValueOfAutomationEventAtIndexAtTime(this._automationEvents, index - 2, firstRemainingAutomationEvent.startTime, this._defaultValue), firstRemainingAutomationEvent.startTime));\n            }\n\n            this._automationEvents = remainingAutomationEvents;\n          }\n        }\n      }, {\n        key: \"getValue\",\n        value: function getValue(time) {\n          if (this._automationEvents.length === 0) {\n            return this._defaultValue;\n          }\n\n          var indexOfNextEvent = this._automationEvents.findIndex(function (automationEvent) {\n            return getEventTime(automationEvent) > time;\n          });\n\n          var nextAutomationEvent = this._automationEvents[indexOfNextEvent];\n          var indexOfCurrentEvent = (indexOfNextEvent === -1 ? this._automationEvents.length : indexOfNextEvent) - 1;\n          var currentAutomationEvent = this._automationEvents[indexOfCurrentEvent];\n\n          if (currentAutomationEvent !== undefined && isSetTargetAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || nextAutomationEvent.insertTime > time)) {\n            return getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(this._automationEvents, indexOfCurrentEvent - 1, currentAutomationEvent.startTime, this._defaultValue), currentAutomationEvent);\n          }\n\n          if (currentAutomationEvent !== undefined && isSetValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n            return currentAutomationEvent.value;\n          }\n\n          if (currentAutomationEvent !== undefined && isSetValueCurveAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || currentAutomationEvent.startTime + currentAutomationEvent.duration > time)) {\n            if (time < currentAutomationEvent.startTime + currentAutomationEvent.duration) {\n              return getValueCurveValueAtTime(time, currentAutomationEvent);\n            }\n\n            return currentAutomationEvent.values[currentAutomationEvent.values.length - 1];\n          }\n\n          if (currentAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n            return currentAutomationEvent.value;\n          }\n\n          if (nextAutomationEvent !== undefined && isExponentialRampToValueAutomationEvent(nextAutomationEvent)) {\n            var _getEndTimeAndValueOf = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n                _getEndTimeAndValueOf2 = _slicedToArray__default[\"default\"](_getEndTimeAndValueOf, 2),\n                startTime = _getEndTimeAndValueOf2[0],\n                value = _getEndTimeAndValueOf2[1];\n\n            return getExponentialRampValueAtTime(time, startTime, value, nextAutomationEvent);\n          }\n\n          if (nextAutomationEvent !== undefined && isLinearRampToValueAutomationEvent(nextAutomationEvent)) {\n            var _getEndTimeAndValueOf3 = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n                _getEndTimeAndValueOf4 = _slicedToArray__default[\"default\"](_getEndTimeAndValueOf3, 2),\n                _startTime = _getEndTimeAndValueOf4[0],\n                _value = _getEndTimeAndValueOf4[1];\n\n            return getLinearRampValueAtTime(time, _startTime, _value, nextAutomationEvent);\n          }\n\n          return this._defaultValue;\n        }\n      }]);\n\n      return AutomationEventList;\n    }(Symbol.iterator);\n\n    var createCancelAndHoldAutomationEvent = function createCancelAndHoldAutomationEvent(cancelTime) {\n      return {\n        cancelTime: cancelTime,\n        type: 'cancelAndHold'\n      };\n    };\n\n    var createCancelScheduledValuesAutomationEvent = function createCancelScheduledValuesAutomationEvent(cancelTime) {\n      return {\n        cancelTime: cancelTime,\n        type: 'cancelScheduledValues'\n      };\n    };\n\n    var createExponentialRampToValueAutomationEvent = function createExponentialRampToValueAutomationEvent(value, endTime) {\n      return {\n        endTime: endTime,\n        type: 'exponentialRampToValue',\n        value: value\n      };\n    };\n\n    var createLinearRampToValueAutomationEvent = function createLinearRampToValueAutomationEvent(value, endTime) {\n      return {\n        endTime: endTime,\n        type: 'linearRampToValue',\n        value: value\n      };\n    };\n\n    var createSetTargetAutomationEvent = function createSetTargetAutomationEvent(target, startTime, timeConstant) {\n      return {\n        startTime: startTime,\n        target: target,\n        timeConstant: timeConstant,\n        type: 'setTarget'\n      };\n    };\n\n    exports.AutomationEventList = AutomationEventList;\n    exports.createCancelAndHoldAutomationEvent = createCancelAndHoldAutomationEvent;\n    exports.createCancelScheduledValuesAutomationEvent = createCancelScheduledValuesAutomationEvent;\n    exports.createExponentialRampToValueAutomationEvent = createExponentialRampToValueAutomationEvent;\n    exports.createLinearRampToValueAutomationEvent = createLinearRampToValueAutomationEvent;\n    exports.createSetTargetAutomationEvent = createSetTargetAutomationEvent;\n    exports.createSetValueAutomationEvent = createSetValueAutomationEvent;\n    exports.createSetValueCurveAutomationEvent = createSetValueCurveAutomationEvent;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","/* Font Face Observer v2.3.0 - © Bram Stein. License: BSD-3-Clause */(function(){function p(a,c){document.addEventListener?a.addEventListener(\"scroll\",c,!1):a.attachEvent(\"scroll\",c)}function u(a){document.body?a():document.addEventListener?document.addEventListener(\"DOMContentLoaded\",function b(){document.removeEventListener(\"DOMContentLoaded\",b);a()}):document.attachEvent(\"onreadystatechange\",function g(){if(\"interactive\"==document.readyState||\"complete\"==document.readyState)document.detachEvent(\"onreadystatechange\",g),a()})};function w(a){this.g=document.createElement(\"div\");this.g.setAttribute(\"aria-hidden\",\"true\");this.g.appendChild(document.createTextNode(a));this.h=document.createElement(\"span\");this.i=document.createElement(\"span\");this.m=document.createElement(\"span\");this.j=document.createElement(\"span\");this.l=-1;this.h.style.cssText=\"max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;\";this.i.style.cssText=\"max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;\";\nthis.j.style.cssText=\"max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;\";this.m.style.cssText=\"display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;\";this.h.appendChild(this.m);this.i.appendChild(this.j);this.g.appendChild(this.h);this.g.appendChild(this.i)}\nfunction x(a,c){a.g.style.cssText=\"max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;white-space:nowrap;font-synthesis:none;font:\"+c+\";\"}function B(a){var c=a.g.offsetWidth,b=c+100;a.j.style.width=b+\"px\";a.i.scrollLeft=b;a.h.scrollLeft=a.h.scrollWidth+100;return a.l!==c?(a.l=c,!0):!1}function C(a,c){function b(){var e=g;B(e)&&null!==e.g.parentNode&&c(e.l)}var g=a;p(a.h,b);p(a.i,b);B(a)};function D(a,c,b){c=c||{};b=b||window;this.family=a;this.style=c.style||\"normal\";this.weight=c.weight||\"normal\";this.stretch=c.stretch||\"normal\";this.context=b}var E=null,F=null,G=null,H=null;function I(a){null===F&&(M(a)&&/Apple/.test(window.navigator.vendor)?(a=/AppleWebKit\\/([0-9]+)(?:\\.([0-9]+))(?:\\.([0-9]+))/.exec(window.navigator.userAgent),F=!!a&&603>parseInt(a[1],10)):F=!1);return F}function M(a){null===H&&(H=!!a.document.fonts);return H}\nfunction N(a,c){var b=a.style,g=a.weight;if(null===G){var e=document.createElement(\"div\");try{e.style.font=\"condensed 100px sans-serif\"}catch(q){}G=\"\"!==e.style.font}return[b,g,G?a.stretch:\"\",\"100px\",c].join(\" \")}\nD.prototype.load=function(a,c){var b=this,g=a||\"BESbswy\",e=0,q=c||3E3,J=(new Date).getTime();return new Promise(function(K,L){if(M(b.context)&&!I(b.context)){var O=new Promise(function(r,t){function h(){(new Date).getTime()-J>=q?t(Error(\"\"+q+\"ms timeout exceeded\")):b.context.document.fonts.load(N(b,'\"'+b.family+'\"'),g).then(function(n){1<=n.length?r():setTimeout(h,25)},t)}h()}),P=new Promise(function(r,t){e=setTimeout(function(){t(Error(\"\"+q+\"ms timeout exceeded\"))},q)});Promise.race([P,O]).then(function(){clearTimeout(e);\nK(b)},L)}else u(function(){function r(){var d;if(d=-1!=k&&-1!=l||-1!=k&&-1!=m||-1!=l&&-1!=m)(d=k!=l&&k!=m&&l!=m)||(null===E&&(d=/AppleWebKit\\/([0-9]+)(?:\\.([0-9]+))/.exec(window.navigator.userAgent),E=!!d&&(536>parseInt(d[1],10)||536===parseInt(d[1],10)&&11>=parseInt(d[2],10))),d=E&&(k==y&&l==y&&m==y||k==z&&l==z&&m==z||k==A&&l==A&&m==A)),d=!d;d&&(null!==f.parentNode&&f.parentNode.removeChild(f),clearTimeout(e),K(b))}function t(){if((new Date).getTime()-J>=q)null!==f.parentNode&&f.parentNode.removeChild(f),\nL(Error(\"\"+q+\"ms timeout exceeded\"));else{var d=b.context.document.hidden;if(!0===d||void 0===d)k=h.g.offsetWidth,l=n.g.offsetWidth,m=v.g.offsetWidth,r();e=setTimeout(t,50)}}var h=new w(g),n=new w(g),v=new w(g),k=-1,l=-1,m=-1,y=-1,z=-1,A=-1,f=document.createElement(\"div\");f.dir=\"ltr\";x(h,N(b,\"sans-serif\"));x(n,N(b,\"serif\"));x(v,N(b,\"monospace\"));f.appendChild(h.g);f.appendChild(n.g);f.appendChild(v.g);b.context.document.body.appendChild(f);y=h.g.offsetWidth;z=n.g.offsetWidth;A=v.g.offsetWidth;t();\nC(h,function(d){k=d;r()});x(h,N(b,'\"'+b.family+'\",sans-serif'));C(n,function(d){l=d;r()});x(n,N(b,'\"'+b.family+'\",serif'));C(v,function(d){m=d;r()});x(v,N(b,'\"'+b.family+'\",monospace'))})})};\"object\"===typeof module?module.exports=D:(window.FontFaceObserver=D,window.FontFaceObserver.prototype.load=D.prototype.load);}());\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/**\n * A specialized version of `_.forEach` 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 * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\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 * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n","var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var copyObject = require('./_copyObject'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n","var Stack = require('./_Stack'),\n    arrayEach = require('./_arrayEach'),\n    assignValue = require('./_assignValue'),\n    baseAssign = require('./_baseAssign'),\n    baseAssignIn = require('./_baseAssignIn'),\n    cloneBuffer = require('./_cloneBuffer'),\n    copyArray = require('./_copyArray'),\n    copySymbols = require('./_copySymbols'),\n    copySymbolsIn = require('./_copySymbolsIn'),\n    getAllKeys = require('./_getAllKeys'),\n    getAllKeysIn = require('./_getAllKeysIn'),\n    getTag = require('./_getTag'),\n    initCloneArray = require('./_initCloneArray'),\n    initCloneByTag = require('./_initCloneByTag'),\n    initCloneObject = require('./_initCloneObject'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isMap = require('./isMap'),\n    isObject = require('./isObject'),\n    isSet = require('./isSet'),\n    keys = require('./keys'),\n    keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n","var baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n    isPrototype = require('./_isPrototype'),\n    nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseEach = require('./_baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n","var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n","var arrayMap = require('./_arrayMap'),\n    baseGet = require('./_baseGet'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    baseSortBy = require('./_baseSortBy'),\n    baseUnary = require('./_baseUnary'),\n    compareMultiple = require('./_compareMultiple'),\n    identity = require('./identity'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n  if (iteratees.length) {\n    iteratees = arrayMap(iteratees, function(iteratee) {\n      if (isArray(iteratee)) {\n        return function(value) {\n          return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n        }\n      }\n      return iteratee;\n    });\n  } else {\n    iteratees = [identity];\n  }\n\n  var index = -1;\n  iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n  var result = baseMap(collection, function(value, key, collection) {\n    var criteria = arrayMap(iteratees, function(iteratee) {\n      return iteratee(value);\n    });\n    return { 'criteria': criteria, 'index': ++index, 'value': value };\n  });\n\n  return baseSortBy(result, function(object, other) {\n    return compareMultiple(object, other, orders);\n  });\n}\n\nmodule.exports = baseOrderBy;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\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","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n    nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n  var index = -1,\n      length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n      result = Array(length);\n\n  while (length--) {\n    result[fromRight ? length : ++index] = start;\n    start += step;\n  }\n  return result;\n}\n\nmodule.exports = baseRange;\n","var identity = require('./identity'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n  var length = array.length;\n\n  array.sort(comparer);\n  while (length--) {\n    array[length] = array[length].value;\n  }\n  return array;\n}\n\nmodule.exports = baseSortBy;\n","/**\n * The base implementation of `_.sum` and `_.sumBy` 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 * @returns {number} Returns the sum.\n */\nfunction baseSum(array, iteratee) {\n  var result,\n      index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    var current = iteratee(array[index]);\n    if (current !== undefined) {\n      result = result === undefined ? current : (result + current);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseSum;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\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 trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  return arrayMap(props, function(key) {\n    return object[key];\n  });\n}\n\nmodule.exports = baseValues;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n  if (value !== other) {\n    var valIsDefined = value !== undefined,\n        valIsNull = value === null,\n        valIsReflexive = value === value,\n        valIsSymbol = isSymbol(value);\n\n    var othIsDefined = other !== undefined,\n        othIsNull = other === null,\n        othIsReflexive = other === other,\n        othIsSymbol = isSymbol(other);\n\n    if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n        (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n        (valIsNull && othIsDefined && othIsReflexive) ||\n        (!valIsDefined && othIsReflexive) ||\n        !valIsReflexive) {\n      return 1;\n    }\n    if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n        (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n        (othIsNull && valIsDefined && valIsReflexive) ||\n        (!othIsDefined && valIsReflexive) ||\n        !othIsReflexive) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\nmodule.exports = compareAscending;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n  var index = -1,\n      objCriteria = object.criteria,\n      othCriteria = other.criteria,\n      length = objCriteria.length,\n      ordersLength = orders.length;\n\n  while (++index < length) {\n    var result = compareAscending(objCriteria[index], othCriteria[index]);\n    if (result) {\n      if (index >= ordersLength) {\n        return result;\n      }\n      var order = orders[index];\n      return result * (order == 'desc' ? -1 : 1);\n    }\n  }\n  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n  // that causes it, under certain circumstances, to provide the same value for\n  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n  // for more details.\n  //\n  // This also ensures a stable sort in V8 and other engines.\n  // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n  return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n    baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nmodule.exports = copyObject;\n","var copyObject = require('./_copyObject'),\n    getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n    getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return baseRest(function(object, sources) {\n    var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined;\n\n    customizer = (assigner.length > 3 && typeof customizer == 'function')\n      ? (length--, customizer)\n      : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    object = Object(object);\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, index, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var baseRange = require('./_baseRange'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toFinite = require('./toFinite');\n\n/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n  return function(start, end, step) {\n    if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n      end = step = undefined;\n    }\n    // Ensure the sign of `-0` is preserved.\n    start = toFinite(start);\n    if (end === undefined) {\n      end = start;\n      start = 0;\n    } else {\n      end = toFinite(end);\n    }\n    step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n    return baseRange(start, end, step, fromRight);\n  };\n}\n\nmodule.exports = createRange;\n","var eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction customDefaultsAssignIn(objValue, srcValue, key, object) {\n  if (objValue === undefined ||\n      (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n    return srcValue;\n  }\n  return objValue;\n}\n\nmodule.exports = customDefaultsAssignIn;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map characters to HTML entities. */\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\n\n/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nvar escapeHtmlChar = basePropertyOf(htmlEscapes);\n\nmodule.exports = escapeHtmlChar;\n","/** Used to escape characters for inclusion in compiled string literals. */\nvar stringEscapes = {\n  '\\\\': '\\\\',\n  \"'\": \"'\",\n  '\\n': 'n',\n  '\\r': 'r',\n  '\\u2028': 'u2028',\n  '\\u2029': 'u2029'\n};\n\n/**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nfunction escapeStringChar(chr) {\n  return '\\\\' + stringEscapes[chr];\n}\n\nmodule.exports = escapeStringChar;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbolsIn = require('./_getSymbolsIn'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n","var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n","var arrayPush = require('./_arrayPush'),\n    getPrototype = require('./_getPrototype'),\n    getSymbols = require('./_getSymbols'),\n    stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n    cloneDataView = require('./_cloneDataView'),\n    cloneRegExp = require('./_cloneRegExp'),\n    cloneSymbol = require('./_cloneSymbol'),\n    cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n","var baseCreate = require('./_baseCreate'),\n    getPrototype = require('./_getPrototype'),\n    isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nmodule.exports = initCloneObject;\n","var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var eq = require('./eq'),\n    isArrayLike = require('./isArrayLike'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n","/** Used to match template delimiters. */\nvar reEscape = /<%-([\\s\\S]+?)%>/g;\n\nmodule.exports = reEscape;\n","/** Used to match template delimiters. */\nvar reEvaluate = /<%([\\s\\S]+?)%>/g;\n\nmodule.exports = reEvaluate;\n","/** Used to match template delimiters. */\nvar reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\nmodule.exports = reInterpolate;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var copyObject = require('./_copyObject'),\n    createAssigner = require('./_createAssigner'),\n    keysIn = require('./keysIn');\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n *   return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n  copyObject(source, keysIn(source), object, customizer);\n});\n\nmodule.exports = assignInWith;\n","var apply = require('./_apply'),\n    baseRest = require('./_baseRest'),\n    isError = require('./isError');\n\n/**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n *   return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n *   elements = [];\n * }\n */\nvar attempt = baseRest(function(func, args) {\n  try {\n    return apply(func, undefined, args);\n  } catch (e) {\n    return isError(e) ? e : new Error(e);\n  }\n});\n\nmodule.exports = attempt;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (value) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = compact;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var escapeHtmlChar = require('./_escapeHtmlChar'),\n    toString = require('./toString');\n\n/** Used to match HTML entities and HTML characters. */\nvar reUnescapedHtml = /[&<>\"']/g,\n    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, &amp; pebbles'\n */\nfunction escape(string) {\n  string = toString(string);\n  return (string && reHasUnescapedHtml.test(string))\n    ? string.replace(reUnescapedHtml, escapeHtmlChar)\n    : string;\n}\n\nmodule.exports = escape;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike'),\n    isPlainObject = require('./isPlainObject');\n\n/** `Object#toString` result references. */\nvar domExcTag = '[object DOMException]',\n    errorTag = '[object Error]';\n\n/**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\nfunction isError(value) {\n  if (!isObjectLike(value)) {\n    return false;\n  }\n  var tag = baseGetTag(value);\n  return tag == errorTag || tag == domExcTag ||\n    (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n}\n\nmodule.exports = isError;\n","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseIsMap = require('./_baseIsMap'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n    getPrototype = require('./_getPrototype'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var baseIsSet = require('./_baseIsSet'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeysIn = require('./_baseKeysIn'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var 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. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\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. */\n  var 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      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\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   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var 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  /** 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/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var 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  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var 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  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` 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   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` 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   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\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   */\n  function 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\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\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   */\n  function 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\n  /**\n   * A specialized version of `_.reduceRight` 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 last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\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   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\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   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` 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   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\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   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection 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 or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` 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   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\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   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\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   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\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   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\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   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\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   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\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   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\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     */\n    function 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\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\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     */\n    function 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\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\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     */\n    function 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\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\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     */\n    function 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\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     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\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     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\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     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\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     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower 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 lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower 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     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\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     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\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 lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\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 upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, 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 upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\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     */\n    var upperFirst = createCaseFirst('toUpperCase');\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     */\n    function 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\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n","var baseFlatten = require('./_baseFlatten'),\n    baseOrderBy = require('./_baseOrderBy'),\n    baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n *  The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n *   { 'user': 'fred',   'age': 48 },\n *   { 'user': 'barney', 'age': 36 },\n *   { 'user': 'fred',   'age': 30 },\n *   { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n  if (collection == null) {\n    return [];\n  }\n  var length = iteratees.length;\n  if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n    iteratees = [];\n  } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n    iteratees = [iteratees[0]];\n  }\n  return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n","var baseSum = require('./_baseSum'),\n    identity = require('./identity');\n\n/**\n * Computes the sum of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 2, 8, 6]);\n * // => 20\n */\nfunction sum(array) {\n  return (array && array.length)\n    ? baseSum(array, identity)\n    : 0;\n}\n\nmodule.exports = sum;\n","var assignInWith = require('./assignInWith'),\n    attempt = require('./attempt'),\n    baseValues = require('./_baseValues'),\n    customDefaultsAssignIn = require('./_customDefaultsAssignIn'),\n    escapeStringChar = require('./_escapeStringChar'),\n    isError = require('./isError'),\n    isIterateeCall = require('./_isIterateeCall'),\n    keys = require('./keys'),\n    reInterpolate = require('./_reInterpolate'),\n    templateSettings = require('./templateSettings'),\n    toString = require('./toString');\n\n/** Error message constants. */\nvar INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n/** Used to match empty string literals in compiled template source. */\nvar reEmptyStringLeading = /\\b__p \\+= '';/g,\n    reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n    reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n/**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - \"(),\" (modification of function parameters)\n * - \"=\" (default value)\n * - \"[]{}\" (destructuring of function parameters)\n * - \"/\" (beginning of a comment)\n * - whitespace\n */\nvar reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n/**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\nvar reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n/** Used to ensure capturing order of template delimiters. */\nvar reNoMatch = /($^)/;\n\n/** Used to match unescaped characters in compiled string literals. */\nvar reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n *  The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n *  The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n *  An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n *  The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='templateSources[n]']\n *  The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n *  The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b>&lt;script&gt;</b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * //   var __t, __p = '';\n * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * //   return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n *   var JST = {\\\n *     \"main\": ' + _.template(mainText).source + '\\\n *   };\\\n * ');\n */\nfunction template(string, options, guard) {\n  // Based on John Resig's `tmpl` implementation\n  // (http://ejohn.org/blog/javascript-micro-templating/)\n  // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n  var settings = templateSettings.imports._.templateSettings || templateSettings;\n\n  if (guard && isIterateeCall(string, options, guard)) {\n    options = undefined;\n  }\n  string = toString(string);\n  options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n  var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n      importsKeys = keys(imports),\n      importsValues = baseValues(imports, importsKeys);\n\n  var isEscaping,\n      isEvaluating,\n      index = 0,\n      interpolate = options.interpolate || reNoMatch,\n      source = \"__p += '\";\n\n  // Compile the regexp to match each delimiter.\n  var reDelimiters = RegExp(\n    (options.escape || reNoMatch).source + '|' +\n    interpolate.source + '|' +\n    (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n    (options.evaluate || reNoMatch).source + '|$'\n  , 'g');\n\n  // Use a sourceURL for easier debugging.\n  // The sourceURL gets injected into the source that's eval-ed, so be careful\n  // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n  // and escape the comment, thus injecting code that gets evaled.\n  var sourceURL = hasOwnProperty.call(options, 'sourceURL')\n    ? ('//# sourceURL=' +\n       (options.sourceURL + '').replace(/\\s/g, ' ') +\n       '\\n')\n    : '';\n\n  string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n    interpolateValue || (interpolateValue = esTemplateValue);\n\n    // Escape characters that can't be included in string literals.\n    source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n    // Replace delimiters with snippets.\n    if (escapeValue) {\n      isEscaping = true;\n      source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n    }\n    if (evaluateValue) {\n      isEvaluating = true;\n      source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n    }\n    if (interpolateValue) {\n      source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n    }\n    index = offset + match.length;\n\n    // The JS engine embedded in Adobe products needs `match` returned in\n    // order to produce the correct `offset` value.\n    return match;\n  });\n\n  source += \"';\\n\";\n\n  // If `variable` is not specified wrap a with-statement around the generated\n  // code to add the data object to the top of the scope chain.\n  var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n  if (!variable) {\n    source = 'with (obj) {\\n' + source + '\\n}\\n';\n  }\n  // Throw an error if a forbidden character was found in `variable`, to prevent\n  // potential command injection attacks.\n  else if (reForbiddenIdentifierChars.test(variable)) {\n    throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n  }\n\n  // Cleanup code by stripping empty strings.\n  source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n    .replace(reEmptyStringMiddle, '$1')\n    .replace(reEmptyStringTrailing, '$1;');\n\n  // Frame code as the function body.\n  source = 'function(' + (variable || 'obj') + ') {\\n' +\n    (variable\n      ? ''\n      : 'obj || (obj = {});\\n'\n    ) +\n    \"var __t, __p = ''\" +\n    (isEscaping\n       ? ', __e = _.escape'\n       : ''\n    ) +\n    (isEvaluating\n      ? ', __j = Array.prototype.join;\\n' +\n        \"function print() { __p += __j.call(arguments, '') }\\n\"\n      : ';\\n'\n    ) +\n    source +\n    'return __p\\n}';\n\n  var result = attempt(function() {\n    return Function(importsKeys, sourceURL + 'return ' + source)\n      .apply(undefined, importsValues);\n  });\n\n  // Provide the compiled function's source by its `toString` method or\n  // the `source` property as a convenience for inlining compiled templates.\n  result.source = source;\n  if (isError(result)) {\n    throw result;\n  }\n  return result;\n}\n\nmodule.exports = template;\n","var escape = require('./escape'),\n    reEscape = require('./_reEscape'),\n    reEvaluate = require('./_reEvaluate'),\n    reInterpolate = require('./_reInterpolate');\n\n/**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\nvar templateSettings = {\n\n  /**\n   * Used to detect `data` property values to be HTML-escaped.\n   *\n   * @memberOf _.templateSettings\n   * @type {RegExp}\n   */\n  'escape': reEscape,\n\n  /**\n   * Used to detect code to be evaluated.\n   *\n   * @memberOf _.templateSettings\n   * @type {RegExp}\n   */\n  'evaluate': reEvaluate,\n\n  /**\n   * Used to detect `data` property values to inject.\n   *\n   * @memberOf _.templateSettings\n   * @type {RegExp}\n   */\n  'interpolate': reInterpolate,\n\n  /**\n   * Used to reference the data object in the template text.\n   *\n   * @memberOf _.templateSettings\n   * @type {string}\n   */\n  'variable': '',\n\n  /**\n   * Used to import variables into the compiled template.\n   *\n   * @memberOf _.templateSettings\n   * @type {Object}\n   */\n  'imports': {\n\n    /**\n     * A reference to the `lodash` function.\n     *\n     * @memberOf _.templateSettings.imports\n     * @type {Function}\n     */\n    '_': { 'escape': escape }\n  }\n};\n\nmodule.exports = templateSettings;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n    MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n  if (!value) {\n    return value === 0 ? value : 0;\n  }\n  value = toNumber(value);\n  if (value === INFINITY || value === -INFINITY) {\n    var sign = (value < 0 ? -1 : 1);\n    return sign * MAX_INTEGER;\n  }\n  return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseTrim = require('./_baseTrim'),\n    isObject = require('./isObject'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = baseTrim(value);\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\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","/* Mapbox GL JS is Copyright © 2020 Mapbox and subject to the Mapbox Terms of Service ((https://www.mapbox.com/legal/tos/). */\n(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.mapboxgl = factory());\n})(this, (function () { 'use strict';\n\n/* eslint-disable */\n\nvar shared, worker, mapboxgl;\n// define gets called three times: one for each chunk. we rely on the order\n// they're imported to know which is which\nfunction define(_, chunk) {\nif (!shared) {\n    shared = chunk;\n} else if (!worker) {\n    worker = chunk;\n} else {\n    var workerBundleString = \"self.onerror = function() { console.error('An error occurred while parsing the WebWorker bundle. This is most likely due to improper transpilation by Babel; please see https://docs.mapbox.com/mapbox-gl-js/guides/install/#transpiling'); }; var sharedChunk = {}; (\" + shared + \")(sharedChunk); (\" + worker + \")(sharedChunk); self.onerror = null;\"\n\n    var sharedChunk = {};\n    shared(sharedChunk);\n    mapboxgl = chunk(sharedChunk);\n    if (typeof window !== 'undefined' && window && window.URL && window.URL.createObjectURL) {\n        mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' }));\n    }\n}\n}\n\n\ndefine([\"exports\"],(function(t){\"use strict\";var e=\"undefined\"!=typeof self?self:{},r=\"2.13.0\";let n;const i={API_URL:\"https://api.mapbox.com\",get API_URL_REGEX(){if(null==n){const t=/^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/|\\?|$)/i;try{n=null!=process.env.API_URL_REGEX?new RegExp(process.env.API_URL_REGEX):t;}catch(e){n=t;}}return n},get API_TILEJSON_REGEX(){return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/v[0-9]*\\/.*\\.json.*$)/i},get API_SPRITE_REGEX(){return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/styles\\/v[0-9]*\\/)(.*\\/sprite.*\\..*$)/i},get API_FONTS_REGEX(){return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/fonts\\/v[0-9]*\\/)(.*\\.pbf.*$)/i},get API_STYLE_REGEX(){return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/styles\\/v[0-9]*\\/)(.*$)/i},get API_CDN_URL_REGEX(){return /^((https?:)?\\/\\/)?api\\.mapbox\\.c(n|om)(\\/mapbox-gl-js\\/)(.*$)/i},get EVENTS_URL(){return this.API_URL?0===this.API_URL.indexOf(\"https://api.mapbox.cn\")?\"https://events.mapbox.cn/events/v2\":0===this.API_URL.indexOf(\"https://api.mapbox.com\")?\"https://events.mapbox.com/events/v2\":null:null},SESSION_PATH:\"/map-sessions/v1\",FEEDBACK_URL:\"https://apps.mapbox.com/feedback\",TILE_URL_VERSION:\"v4\",RASTER_URL_PREFIX:\"raster/v1\",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null,MAX_PARALLEL_IMAGE_REQUESTS:16},s={supported:!1,testSupport:function(t){!l&&o&&(u?c(t):a=t);}};let a,o,l=!1,u=!1;function c(t){const e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,o),t.isContextLost())return;s.supported=!0;}catch(t){}t.deleteTexture(e),l=!0;}e.document&&(o=e.document.createElement(\"img\"),o.onload=function(){a&&c(a),a=null,u=!0;},o.onerror=function(){l=!0,a=null;},o.src=\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=\");const h=\"01\";var p=f;function f(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=e,this.p2x=r,this.p2y=n;}f.prototype={sampleCurveX:function(t){return ((this.ax*t+this.bx)*t+this.cx)*t},sampleCurveY:function(t){return ((this.ay*t+this.by)*t+this.cy)*t},sampleCurveDerivativeX:function(t){return (3*this.ax*t+2*this.bx)*t+this.cx},solveCurveX:function(t,e){if(void 0===e&&(e=1e-6),t<0)return 0;if(t>1)return 1;for(var r=t,n=0;n<8;n++){var i=this.sampleCurveX(r)-t;if(Math.abs(i)<e)return r;var s=this.sampleCurveDerivativeX(r);if(Math.abs(s)<1e-6)break;r-=i/s;}var a=0,o=1;for(r=t,n=0;n<20&&(i=this.sampleCurveX(r),!(Math.abs(i-t)<e));n++)t>i?a=r:o=r,r=.5*(o-a)+a;return r},solve:function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}};var d=y;function y(t,e){this.x=t,this.y=e;}y.prototype={clone:function(){return new y(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[2]*this.x+t[3]*this.y;return this.x=t[0]*this.x+t[1]*this.y,this.y=e,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),n=r*this.x+e*this.y;return this.x=e*this.x-r*this.y,this.y=n,this},_rotateAround:function(t,e){var r=Math.cos(t),n=Math.sin(t),i=e.y+n*(this.x-e.x)+r*(this.y-e.y);return this.x=e.x+r*(this.x-e.x)-n*(this.y-e.y),this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},y.convert=function(t){return t instanceof y?t:Array.isArray(t)?new y(t[0],t[1]):t};const m=Math.PI/180,g=180/Math.PI;function x(t){return t*m}function v(t){return t*g}const b=[[0,0],[1,0],[1,1],[0,1]];function w(t){if(t<=0)return 0;if(t>=1)return 1;const e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function _(t,e,r,n){const i=new p(t,e,r,n);return function(t){return i.solve(t)}}const A=_(.25,.1,.25,1);function S(t,e,r){return Math.min(r,Math.max(e,t))}function k(t,e,r){return (r=S((r-t)/(e-t),0,1))*r*(3-2*r)}function I(t,e,r){const n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i}function M(t,e,r){if(!t.length)return r(null,[]);let n=t.length;const i=new Array(t.length);let s=null;t.forEach(((t,a)=>{e(t,((t,e)=>{t&&(s=t),i[a]=e,0==--n&&r(s,i);}));}));}function T(t){const e=[];for(const r in t)e.push(t[r]);return e}function z(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}let B=1;function E(){return B++}function C(){return function t(e){return e?(e^Math.random()*(16>>e/4)).toString(16):([1e7]+-[1e3]+-4e3+-8e3+-1e11).replace(/[018]/g,t)}()}function P(t){return t<=1?1:Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function D(t){return !!t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function V(t,e){t.forEach((t=>{e[t]&&(e[t]=e[t].bind(e));}));}function L(t,e){return -1!==t.indexOf(e,t.length-e.length)}function F(t,e,r){const n={};for(const i in t)n[i]=e.call(r||this,t[i],i,t);return n}function R(t,e,r){const n={};for(const i in t)e.call(r||this,t[i],i,t)&&(n[i]=t[i]);return n}function j(t){return Array.isArray(t)?t.map(j):\"object\"==typeof t&&t?F(t,j):t}const U={};function $(t){U[t]||(\"undefined\"!=typeof console&&console.warn(t),U[t]=!0);}function O(t,e,r){return (r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function q(t){let e=0;for(let r,n,i=0,s=t.length,a=s-1;i<s;a=i++)r=t[i],n=t[a],e+=(n.x-r.x)*(r.y+n.y);return e}function N(){return \"undefined\"!=typeof WorkerGlobalScope&&\"undefined\"!=typeof self&&self instanceof WorkerGlobalScope}function G(t){const e={};if(t.replace(/(?:^|(?:\\s*\\,\\s*))([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\\"((?:[^\"\\\\]|\\\\.)*)\\\")))?/g,((t,r,n,i)=>{const s=n||i;return e[r]=!s||s.toLowerCase(),\"\"})),e[\"max-age\"]){const t=parseInt(e[\"max-age\"],10);isNaN(t)?delete e[\"max-age\"]:e[\"max-age\"]=t;}return e}let X=null;function Z(t){if(null==X){const e=t.navigator?t.navigator.userAgent:null;X=!!t.safari||!(!e||!(/\\b(iPad|iPhone|iPod)\\b/.test(e)||e.match(\"Safari\")&&!e.match(\"Chrome\")));}return X}function K(t){try{const r=e[t];return r.setItem(\"_mapbox_test_\",1),r.removeItem(\"_mapbox_test_\"),!0}catch(t){return !1}}function Y(t,e){return [t[4*e],t[4*e+1],t[4*e+2],t[4*e+3]]}const H=\"mapbox-tiles\";let W,J,Q=500,tt=50;function et(){try{return e.caches}catch(t){}}function rt(){et()&&!W&&(W=e.caches.open(H));}function nt(t){const e=t.indexOf(\"?\");if(e<0)return t;const r=function(t){const e=t.indexOf(\"?\");return e>0?t.slice(e+1).split(\"&\"):[]}(t),n=r.filter((t=>{const e=t.split(\"=\");return \"language\"===e[0]||\"worldview\"===e[0]}));return n.length?`${t.slice(0,e)}?${n.join(\"&\")}`:t.slice(0,e)}let it=1/0;const st={Unknown:\"Unknown\",Style:\"Style\",Source:\"Source\",Tile:\"Tile\",Glyphs:\"Glyphs\",SpriteImage:\"SpriteImage\",SpriteJSON:\"SpriteJSON\",Image:\"Image\"};\"function\"==typeof Object.freeze&&Object.freeze(st);class at extends Error{constructor(t,e,r){401===e&&gt(r)&&(t+=\": you may have provided an invalid Mapbox access token. See https://docs.mapbox.com/api/overview/#access-tokens-and-token-scopes\"),super(t),this.status=e,this.url=r;}toString(){return `${this.name}: ${this.message} (${this.status}): ${this.url}`}}const ot=N()?()=>self.worker&&self.worker.referrer:()=>(\"blob:\"===e.location.protocol?e.parent:e).location.href;const lt=function(t,r){if(!(/^file:/.test(n=t.url)||/^file:/.test(ot())&&!/^\\w+:/.test(n))){if(e.fetch&&e.Request&&e.AbortController&&e.Request.prototype.hasOwnProperty(\"signal\"))return function(t,r){const n=new e.AbortController,i=new e.Request(t.url,{method:t.method||\"GET\",body:t.body,credentials:t.credentials,headers:t.headers,referrer:ot(),signal:n.signal});let s=!1,a=!1;const o=(l=i.url).indexOf(\"sku=\")>0&&gt(l);var l;\"json\"===t.type&&i.headers.set(\"Accept\",\"application/json\");const u=(n,s,l)=>{if(a)return;if(n&&\"SecurityError\"!==n.message&&$(n),s&&l)return c(s);const u=Date.now();e.fetch(i).then((e=>{if(e.ok){const t=o?e.clone():null;return c(e,t,u)}return r(new at(e.statusText,e.status,t.url))})).catch((e=>{\"AbortError\"!==e.name&&r(new Error(`${e.message} ${t.url}`));}));},c=(n,o,l)=>{(\"arrayBuffer\"===t.type?n.arrayBuffer():\"json\"===t.type?n.json():n.text()).then((t=>{a||(o&&l&&function(t,r,n){if(rt(),!W)return;const i={status:r.status,statusText:r.statusText,headers:new e.Headers};r.headers.forEach(((t,e)=>i.headers.set(e,t)));const s=G(r.headers.get(\"Cache-Control\")||\"\");if(s[\"no-store\"])return;s[\"max-age\"]&&i.headers.set(\"Expires\",new Date(n+1e3*s[\"max-age\"]).toUTCString());const a=i.headers.get(\"Expires\");a&&(new Date(a).getTime()-n<42e4||function(t,e){if(void 0===J)try{new Response(new ReadableStream),J=!0;}catch(t){J=!1;}J?e(t.body):t.blob().then(e);}(r,(r=>{const n=new e.Response(r,i);rt(),W&&W.then((e=>e.put(nt(t.url),n))).catch((t=>$(t.message)));})));}(i,o,l),s=!0,r(null,t,n.headers.get(\"Cache-Control\"),n.headers.get(\"Expires\")));})).catch((t=>{a||r(new Error(t.message));}));};return o?function(t,e){if(rt(),!W)return e(null);const r=nt(t.url);W.then((t=>{t.match(r).then((n=>{const i=function(t){if(!t)return !1;const e=new Date(t.headers.get(\"Expires\")||0),r=G(t.headers.get(\"Cache-Control\")||\"\");return e>Date.now()&&!r[\"no-cache\"]}(n);t.delete(r),i&&t.put(r,n.clone()),e(null,n,i);})).catch(e);})).catch(e);}(i,u):u(null,null),{cancel:()=>{a=!0,s||n.abort();}}}(t,r);if(N()&&self.worker&&self.worker.actor)return self.worker.actor.send(\"getResource\",t,r,void 0,!0)}var n;return function(t,r){const n=new e.XMLHttpRequest;n.open(t.method||\"GET\",t.url,!0),\"arrayBuffer\"===t.type&&(n.responseType=\"arraybuffer\");for(const e in t.headers)n.setRequestHeader(e,t.headers[e]);return \"json\"===t.type&&(n.responseType=\"text\",n.setRequestHeader(\"Accept\",\"application/json\")),n.withCredentials=\"include\"===t.credentials,n.onerror=()=>{r(new Error(n.statusText));},n.onload=()=>{if((n.status>=200&&n.status<300||0===n.status)&&null!==n.response){let e=n.response;if(\"json\"===t.type)try{e=JSON.parse(n.response);}catch(t){return r(t)}r(null,e,n.getResponseHeader(\"Cache-Control\"),n.getResponseHeader(\"Expires\"));}else r(new at(n.statusText,n.status,t.url));},n.send(t.body),{cancel:()=>n.abort()}}(t,r)},ut=function(t,e){return lt(z(t,{type:\"arrayBuffer\"}),e)};function ct(t){const r=e.document.createElement(\"a\");return r.href=t,r.protocol===e.document.location.protocol&&r.host===e.document.location.host}const ht=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=\";let pt,ft;pt=[],ft=0;const dt=function(t,r){if(s.supported&&(t.headers||(t.headers={}),t.headers.accept=\"image/webp,*/*\"),ft>=i.MAX_PARALLEL_IMAGE_REQUESTS){const e={requestParameters:t,callback:r,cancelled:!1,cancel(){this.cancelled=!0;}};return pt.push(e),e}ft++;let n=!1;const a=()=>{if(!n)for(n=!0,ft--;pt.length&&ft<i.MAX_PARALLEL_IMAGE_REQUESTS;){const t=pt.shift(),{requestParameters:e,callback:r,cancelled:n}=t;n||(t.cancel=dt(e,r).cancel);}},o=ut(t,((t,n,i,s)=>{a(),t?r(t):n&&(e.createImageBitmap?function(t,r){const n=new e.Blob([new Uint8Array(t)],{type:\"image/png\"});e.createImageBitmap(n).then((t=>{r(null,t);})).catch((t=>{r(new Error(`Could not load image because of ${t.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`));}));}(n,((t,e)=>r(t,e,i,s))):function(t,r){const n=new e.Image,i=e.URL;n.onload=()=>{r(null,n),i.revokeObjectURL(n.src),n.onload=null,e.requestAnimationFrame((()=>{n.src=ht;}));},n.onerror=()=>r(new Error(\"Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.\"));const s=new e.Blob([new Uint8Array(t)],{type:\"image/png\"});n.src=t.byteLength?i.createObjectURL(s):ht;}(n,((t,e)=>r(t,e,i,s))));}));return {cancel:()=>{o.cancel(),a();}}},yt=\"NO_ACCESS_TOKEN\";function mt(t){return 0===t.indexOf(\"mapbox:\")}function gt(t){return i.API_URL_REGEX.test(t)}function xt(t){return i.API_CDN_URL_REGEX.test(t)}function vt(t){return i.API_STYLE_REGEX.test(t)&&!bt(t)}function bt(t){return i.API_SPRITE_REGEX.test(t)}const wt=/^(\\w+):\\/\\/([^/?]*)(\\/[^?]+)?\\??(.+)?/;function _t(t){const e=t.match(wt);if(!e)throw new Error(\"Unable to parse URL object\");return {protocol:e[1],authority:e[2],path:e[3]||\"/\",params:e[4]?e[4].split(\"&\"):[]}}function At(t){const e=t.params.length?`?${t.params.join(\"&\")}`:\"\";return `${t.protocol}://${t.authority}${t.path}${e}`}function St(t){if(!t)return null;const r=t.split(\".\");if(!r||3!==r.length)return null;try{return JSON.parse(decodeURIComponent(e.atob(r[1]).split(\"\").map((t=>\"%\"+(\"00\"+t.charCodeAt(0).toString(16)).slice(-2))).join(\"\")))}catch(t){return null}}class kt{constructor(t){this.type=t,this.anonId=null,this.eventData={},this.queue=[],this.pendingRequest=null;}getStorageKey(t){const r=St(i.ACCESS_TOKEN);let n=\"\";return n=r&&r.u?e.btoa(encodeURIComponent(r.u).replace(/%([0-9A-F]{2})/g,((t,e)=>String.fromCharCode(Number(\"0x\"+e))))):i.ACCESS_TOKEN||\"\",t?`mapbox.eventData.${t}:${n}`:`mapbox.eventData:${n}`}fetchEventData(){const t=K(\"localStorage\"),r=this.getStorageKey(),n=this.getStorageKey(\"uuid\");if(t)try{const t=e.localStorage.getItem(r);t&&(this.eventData=JSON.parse(t));const i=e.localStorage.getItem(n);i&&(this.anonId=i);}catch(t){$(\"Unable to read from LocalStorage\");}}saveEventData(){const t=K(\"localStorage\"),r=this.getStorageKey(),n=this.getStorageKey(\"uuid\");if(t)try{e.localStorage.setItem(n,this.anonId),Object.keys(this.eventData).length>=1&&e.localStorage.setItem(r,JSON.stringify(this.eventData));}catch(t){$(\"Unable to write to LocalStorage\");}}processRequests(t){}postEvent(t,e,r,n){if(!i.EVENTS_URL)return;const s=_t(i.EVENTS_URL);s.params.push(`access_token=${n||i.ACCESS_TOKEN||\"\"}`);const a={event:this.type,created:new Date(t).toISOString()},o=e?z(a,e):a,l={url:At(s),headers:{\"Content-Type\":\"text/plain\"},body:JSON.stringify([o])};this.pendingRequest=function(t,e){return lt(z(t,{method:\"POST\"}),e)}(l,(t=>{this.pendingRequest=null,r(t),this.saveEventData(),this.processRequests(n);}));}queueRequest(t,e){this.queue.push(t),this.processRequests(e);}}const It=new class extends kt{constructor(t){super(\"appUserTurnstile\"),this._customAccessToken=t;}postTurnstileEvent(t,e){i.EVENTS_URL&&i.ACCESS_TOKEN&&Array.isArray(t)&&t.some((t=>mt(t)||gt(t)))&&this.queueRequest(Date.now(),e);}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;this.anonId&&this.eventData.lastSuccess&&this.eventData.tokenU||this.fetchEventData();const e=St(i.ACCESS_TOKEN),n=e?e.u:i.ACCESS_TOKEN;let s=n!==this.eventData.tokenU;D(this.anonId)||(this.anonId=C(),s=!0);const a=this.queue.shift();if(this.eventData.lastSuccess){const t=new Date(this.eventData.lastSuccess),e=new Date(a),r=(a-this.eventData.lastSuccess)/864e5;s=s||r>=1||r<-1||t.getDate()!==e.getDate();}else s=!0;s?this.postEvent(a,{sdkIdentifier:\"mapbox-gl-js\",sdkVersion:r,skuId:h,\"enabled.telemetry\":!1,userId:this.anonId},(t=>{t||(this.eventData.lastSuccess=a,this.eventData.tokenU=n);}),t):this.processRequests();}},Mt=It.postTurnstileEvent.bind(It),Tt=new class extends kt{constructor(){super(\"map.load\"),this.success={},this.skuToken=\"\";}postMapLoadEvent(t,e,r,n){this.skuToken=e,this.errorCb=n,i.EVENTS_URL&&(r||i.ACCESS_TOKEN?this.queueRequest({id:t,timestamp:Date.now()},r):this.errorCb(new Error(yt)));}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;const{id:e,timestamp:n}=this.queue.shift();e&&this.success[e]||(this.anonId||this.fetchEventData(),D(this.anonId)||(this.anonId=C()),this.postEvent(n,{sdkIdentifier:\"mapbox-gl-js\",sdkVersion:r,skuId:h,skuToken:this.skuToken,userId:this.anonId},(t=>{t?this.errorCb(t):e&&(this.success[e]=!0);}),t));}},zt=Tt.postMapLoadEvent.bind(Tt),Bt=new class extends kt{constructor(){super(\"gljs.performance\");}postPerformanceEvent(t,e){i.EVENTS_URL&&(t||i.ACCESS_TOKEN)&&this.queueRequest({timestamp:Date.now(),performanceData:e},t);}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;const{timestamp:n,performanceData:i}=this.queue.shift(),s=function(t){const n=e.performance.getEntriesByType(\"resource\"),i=e.performance.getEntriesByType(\"mark\"),s=function(t){const e={};if(t)for(const r in t)if(\"other\"!==r)for(const n of t[r]){const t=`${r}ResolveRangeMin`,i=`${r}ResolveRangeMax`,s=`${r}RequestCount`,a=`${r}RequestCachedCount`;e[t]=Math.min(e[t]||1/0,n.startTime),e[i]=Math.max(e[i]||-1/0,n.responseEnd);const o=t=>{void 0===e[t]&&(e[t]=0),++e[t];};void 0!==n.transferSize&&0===n.transferSize&&o(a),o(s);}return e}(function(t,e){const r={};if(t)for(const n of t){const t=e(n);void 0===r[t]&&(r[t]=[]),r[t].push(n);}return r}(n,Ft)),a=e.devicePixelRatio,o=e.navigator.connection||e.navigator.mozConnection||e.navigator.webkitConnection,l={counters:[],metadata:[],attributes:[]},u=(t,e,r)=>{null!=r&&t.push({name:e,value:r.toString()});};for(const t in s)u(l.counters,t,s[t]);if(t.interactionRange[0]!==1/0&&t.interactionRange[1]!==-1/0&&(u(l.counters,\"interactionRangeMin\",t.interactionRange[0]),u(l.counters,\"interactionRangeMax\",t.interactionRange[1])),i)for(const t of Object.keys(Vt)){const e=Vt[t],r=i.find((t=>t.name===e));r&&u(l.counters,e,r.startTime);}return u(l.counters,\"visibilityHidden\",t.visibilityHidden),u(l.attributes,\"style\",function(t){if(t)for(const e of t){const t=e.name.split(\"?\")[0];if(vt(t)){const e=t.split(\"/\").slice(-2);if(2===e.length)return `mapbox://styles/${e[0]}/${e[1]}`}}}(n)),u(l.attributes,\"terrainEnabled\",t.terrainEnabled?\"true\":\"false\"),u(l.attributes,\"fogEnabled\",t.fogEnabled?\"true\":\"false\"),u(l.attributes,\"projection\",t.projection),u(l.attributes,\"zoom\",t.zoom),u(l.metadata,\"devicePixelRatio\",a),u(l.metadata,\"connectionEffectiveType\",o?o.effectiveType:void 0),u(l.metadata,\"navigatorUserAgent\",e.navigator.userAgent),u(l.metadata,\"screenWidth\",e.screen.width),u(l.metadata,\"screenHeight\",e.screen.height),u(l.metadata,\"windowWidth\",e.innerWidth),u(l.metadata,\"windowHeight\",e.innerHeight),u(l.metadata,\"mapWidth\",t.width/a),u(l.metadata,\"mapHeight\",t.height/a),u(l.metadata,\"webglRenderer\",t.renderer),u(l.metadata,\"webglVendor\",t.vendor),u(l.metadata,\"sdkVersion\",r),u(l.metadata,\"sdkIdentifier\",\"mapbox-gl-js\"),l}(i);for(const t of s.metadata);for(const t of s.counters);for(const t of s.attributes);this.postEvent(n,s,(()=>{}),t);}},Et=Bt.postPerformanceEvent.bind(Bt),Ct=new class extends kt{constructor(){super(\"map.auth\"),this.success={},this.skuToken=\"\";}getSession(t,e,r,n){if(!i.API_URL||!i.SESSION_PATH)return;const s=_t(i.API_URL+i.SESSION_PATH);s.params.push(`sku=${e||\"\"}`),s.params.push(`access_token=${n||i.ACCESS_TOKEN||\"\"}`);const a={url:At(s),headers:{\"Content-Type\":\"text/plain\"}};this.pendingRequest=function(t,e){return lt(z(t,{method:\"GET\"}),e)}(a,(t=>{this.pendingRequest=null,r(t),this.saveEventData(),this.processRequests(n);}));}getSessionAPI(t,e,r,n){this.skuToken=e,this.errorCb=n,i.SESSION_PATH&&i.API_URL&&(r||i.ACCESS_TOKEN?this.queueRequest({id:t,timestamp:Date.now()},r):this.errorCb(new Error(yt)));}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;const{id:e,timestamp:r}=this.queue.shift();e&&this.success[e]||this.getSession(r,this.skuToken,(t=>{t?this.errorCb(t):e&&(this.success[e]=!0);}),t);}},Pt=Ct.getSessionAPI.bind(Ct),Dt=new Set,Vt={create:\"create\",load:\"load\",fullLoad:\"fullLoad\"},Lt={mark(t){e.performance.mark(t);},measure(t,r,n){e.performance.measure(t,r,n);}};function Ft(t){const e=t.name.split(\"?\")[0];return xt(e)&&e.includes(\"mapbox-gl.js\")?\"javascript\":xt(e)&&e.includes(\"mapbox-gl.css\")?\"css\":function(t){return i.API_FONTS_REGEX.test(t)}(e)?\"fontRange\":bt(e)?\"sprite\":vt(e)?\"style\":function(t){return i.API_TILEJSON_REGEX.test(t)}(e)?\"tilejson\":\"other\"}const Rt=e.performance;function jt(t){const e=t?t.url.toString():void 0;return Rt.getEntriesByName(e)}let Ut,$t,Ot,qt;const Nt={now:()=>void 0!==Ot?Ot:e.performance.now(),setNow(t){Ot=t;},restoreNow(){Ot=void 0;},frame(t){const r=e.requestAnimationFrame(t);return {cancel:()=>e.cancelAnimationFrame(r)}},getImageData(t,r=0){const{width:n,height:i}=t;qt||(qt=e.document.createElement(\"canvas\"));const s=qt.getContext(\"2d\",{willReadFrequently:!0});if(!s)throw new Error(\"failed to create canvas 2d context\");return (n>qt.width||i>qt.height)&&(qt.width=n,qt.height=i),s.clearRect(-r,-r,n+2*r,i+2*r),s.drawImage(t,0,0,n,i),s.getImageData(-r,-r,n+2*r,i+2*r)},resolveURL:t=>(Ut||(Ut=e.document.createElement(\"a\")),Ut.href=t,Ut.href),get devicePixelRatio(){return e.devicePixelRatio},get prefersReducedMotion(){return !!e.matchMedia&&(null==$t&&($t=e.matchMedia(\"(prefers-reduced-motion: reduce)\")),$t.matches)}};function Gt(t,e,r){r[t]&&-1!==r[t].indexOf(e)||(r[t]=r[t]||[],r[t].push(e));}function Xt(t,e,r){if(r&&r[t]){const n=r[t].indexOf(e);-1!==n&&r[t].splice(n,1);}}class Zt{constructor(t,e={}){z(this,e),this.type=t;}}class Kt extends Zt{constructor(t,e={}){super(\"error\",z({error:t},e));}}class Yt{on(t,e){return this._listeners=this._listeners||{},Gt(t,e,this._listeners),this}off(t,e){return Xt(t,e,this._listeners),Xt(t,e,this._oneTimeListeners),this}once(t,e){return e?(this._oneTimeListeners=this._oneTimeListeners||{},Gt(t,e,this._oneTimeListeners),this):new Promise((e=>this.once(t,e)))}fire(t,e){\"string\"==typeof t&&(t=new Zt(t,e||{}));const r=t.type;if(this.listens(r)){t.target=this;const e=this._listeners&&this._listeners[r]?this._listeners[r].slice():[];for(const r of e)r.call(this,t);const n=this._oneTimeListeners&&this._oneTimeListeners[r]?this._oneTimeListeners[r].slice():[];for(const e of n)Xt(r,e,this._oneTimeListeners),e.call(this,t);const i=this._eventedParent;i&&(z(t,\"function\"==typeof this._eventedParentData?this._eventedParentData():this._eventedParentData),i.fire(t));}else t instanceof Kt&&console.error(t.error);return this}listens(t){return !!(this._listeners&&this._listeners[t]&&this._listeners[t].length>0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t))}setEventedParent(t,e){return this._eventedParent=t,this._eventedParentData=e,this}}var Ht=JSON.parse('{\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8]},\"name\":{\"type\":\"string\"},\"metadata\":{\"type\":\"*\"},\"center\":{\"type\":\"array\",\"value\":\"number\"},\"zoom\":{\"type\":\"number\"},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\"},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\"},\"light\":{\"type\":\"light\"},\"terrain\":{\"type\":\"terrain\"},\"fog\":{\"type\":\"fog\"},\"sources\":{\"required\":true,\"type\":\"sources\"},\"sprite\":{\"type\":\"string\"},\"glyphs\":{\"type\":\"string\"},\"transition\":{\"type\":\"transition\"},\"projection\":{\"type\":\"projection\"},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\"}},\"sources\":{\"*\":{\"type\":\"source\"}},\"source\":[\"source_vector\",\"source_raster\",\"source_raster_dem\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_vector\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"vector\":{}}},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"bounds\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[-180,-85.051129,180,85.051129]},\"scheme\":{\"type\":\"enum\",\"values\":{\"xyz\":{},\"tms\":{}},\"default\":\"xyz\"},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"attribution\":{\"type\":\"string\"},\"promoteId\":{\"type\":\"promoteId\"},\"volatile\":{\"type\":\"boolean\",\"default\":false},\"*\":{\"type\":\"*\"}},\"source_raster\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"raster\":{}}},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"bounds\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[-180,-85.051129,180,85.051129]},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\"},\"scheme\":{\"type\":\"enum\",\"values\":{\"xyz\":{},\"tms\":{}},\"default\":\"xyz\"},\"attribution\":{\"type\":\"string\"},\"volatile\":{\"type\":\"boolean\",\"default\":false},\"*\":{\"type\":\"*\"}},\"source_raster_dem\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"raster-dem\":{}}},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"bounds\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[-180,-85.051129,180,85.051129]},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\"},\"attribution\":{\"type\":\"string\"},\"encoding\":{\"type\":\"enum\",\"values\":{\"terrarium\":{},\"mapbox\":{}},\"default\":\"mapbox\"},\"volatile\":{\"type\":\"boolean\",\"default\":false},\"*\":{\"type\":\"*\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"geojson\":{}}},\"data\":{\"type\":\"*\"},\"maxzoom\":{\"type\":\"number\",\"default\":18},\"attribution\":{\"type\":\"string\"},\"buffer\":{\"type\":\"number\",\"default\":128,\"maximum\":512,\"minimum\":0},\"filter\":{\"type\":\"*\"},\"tolerance\":{\"type\":\"number\",\"default\":0.375},\"cluster\":{\"type\":\"boolean\",\"default\":false},\"clusterRadius\":{\"type\":\"number\",\"default\":50,\"minimum\":0},\"clusterMaxZoom\":{\"type\":\"number\"},\"clusterMinPoints\":{\"type\":\"number\"},\"clusterProperties\":{\"type\":\"*\"},\"lineMetrics\":{\"type\":\"boolean\",\"default\":false},\"generateId\":{\"type\":\"boolean\",\"default\":false},\"promoteId\":{\"type\":\"promoteId\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"video\":{}}},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"image\":{}}},\"url\":{\"required\":true,\"type\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":{\"fill\":{},\"line\":{},\"symbol\":{},\"circle\":{},\"heatmap\":{},\"fill-extrusion\":{},\"raster\":{},\"hillshade\":{},\"background\":{},\"sky\":{}},\"required\":true},\"metadata\":{\"type\":\"*\"},\"source\":{\"type\":\"string\"},\"source-layer\":{\"type\":\"string\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24},\"filter\":{\"type\":\"filter\"},\"layout\":{\"type\":\"layout\"},\"paint\":{\"type\":\"paint\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_heatmap\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_hillshade\",\"layout_background\",\"layout_sky\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_sky\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_fill\":{\"fill-sort-key\":{\"type\":\"number\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_circle\":{\"circle-sort-key\":{\"type\":\"number\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_heatmap\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_fill-extrusion\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"},\"fill-extrusion-edge-radius\":{\"type\":\"number\",\"private\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"property-type\":\"constant\"}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"values\":{\"butt\":{},\"round\":{},\"square\":{}},\"default\":\"butt\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-join\":{\"type\":\"enum\",\"values\":{\"bevel\":{},\"round\":{},\"miter\":{}},\"default\":\"miter\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"requires\":[{\"line-join\":\"miter\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"requires\":[{\"line-join\":\"round\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-sort-key\":{\"type\":\"number\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"values\":{\"point\":{},\"line\":{},\"line-center\":{}},\"default\":\"point\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"units\":\"pixels\",\"requires\":[{\"symbol-placement\":\"line\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"default\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-sort-key\":{\"type\":\"number\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"symbol-z-order\":{\"type\":\"enum\",\"values\":{\"auto\":{},\"viewport-y\":{},\"source\":{}},\"default\":\"auto\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-allow-overlap\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-ignore-placement\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-optional\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"icon-image\",\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-rotation-alignment\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"units\":\"factor of the original icon size\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-text-fit\":{\"type\":\"enum\",\"values\":{\"none\":{},\"width\":{},\"height\":{},\"both\":{}},\"default\":\"none\",\"requires\":[\"icon-image\",\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"requires\":[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-image\":{\"type\":\"resolvedImage\",\"tokens\":true,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-keep-upright\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-anchor\":{\"type\":\"enum\",\"values\":{\"center\":{},\"left\":{},\"right\":{},\"top\":{},\"bottom\":{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},\"default\":\"center\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-pitch-alignment\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-pitch-alignment\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotation-alignment\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-field\":{\"type\":\"formatted\",\"default\":\"\",\"tokens\":true,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"ems\",\"requires\":[\"text-field\",{\"symbol-placement\":[\"point\"]}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"ems\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"ems\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-justify\":{\"type\":\"enum\",\"values\":{\"auto\":{},\"left\":{},\"center\":{},\"right\":{}},\"default\":\"center\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-radial-offset\":{\"type\":\"number\",\"units\":\"ems\",\"default\":0,\"requires\":[\"text-field\"],\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]}},\"text-variable-anchor\":{\"type\":\"array\",\"value\":\"enum\",\"values\":{\"center\":{},\"left\":{},\"right\":{},\"top\":{},\"bottom\":{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},\"requires\":[\"text-field\",{\"symbol-placement\":[\"point\"]}],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-anchor\":{\"type\":\"enum\",\"values\":{\"center\":{},\"left\":{},\"right\":{},\"top\":{},\"bottom\":{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},\"default\":\"center\",\"requires\":[\"text-field\",{\"!\":\"text-variable-anchor\"}],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"requires\":[\"text-field\",{\"symbol-placement\":[\"line\",\"line-center\"]}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-writing-mode\":{\"type\":\"array\",\"value\":\"enum\",\"values\":{\"horizontal\":{},\"vertical\":{}},\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-keep-upright\":{\"type\":\"boolean\",\"default\":true,\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-transform\":{\"type\":\"enum\",\"values\":{\"none\":{},\"uppercase\":{},\"lowercase\":{}},\"default\":\"none\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-offset\":{\"type\":\"array\",\"value\":\"number\",\"units\":\"ems\",\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\",{\"!\":\"text-radial-offset\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-allow-overlap\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-ignore-placement\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-optional\":{\"type\":\"boolean\",\"default\":false,\"requires\":[\"text-field\",\"icon-image\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"layout_hillshade\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\",\"property-type\":\"constant\"}},\"filter\":{\"type\":\"array\",\"value\":\"*\"},\"filter_symbol\":{\"type\":\"boolean\",\"default\":false,\"transition\":false,\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\",\"pitch\",\"distance-from-center\"]}},\"filter_fill\":{\"type\":\"boolean\",\"default\":false,\"transition\":false,\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]}},\"filter_line\":{\"type\":\"boolean\",\"default\":false,\"transition\":false,\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]}},\"filter_circle\":{\"type\":\"boolean\",\"default\":false,\"transition\":false,\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]}},\"filter_fill-extrusion\":{\"type\":\"boolean\",\"default\":false,\"transition\":false,\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]}},\"filter_heatmap\":{\"type\":\"boolean\",\"default\":false,\"transition\":false,\"property-type\":\"data-driven\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]}},\"filter_operator\":{\"type\":\"enum\",\"values\":{\"==\":{},\"!=\":{},\">\":{},\">=\":{},\"<\":{},\"<=\":{},\"in\":{},\"!in\":{},\"all\":{},\"any\":{},\"none\":{},\"has\":{},\"!has\":{},\"within\":{}}},\"geometry_type\":{\"type\":\"enum\",\"values\":{\"Point\":{},\"LineString\":{},\"Polygon\":{}}},\"function\":{\"expression\":{\"type\":\"expression\"},\"stops\":{\"type\":\"array\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0},\"property\":{\"type\":\"string\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":{\"identity\":{},\"exponential\":{},\"interval\":{},\"categorical\":{}},\"default\":\"exponential\"},\"colorSpace\":{\"type\":\"enum\",\"values\":{\"rgb\":{},\"lab\":{},\"hcl\":{}},\"default\":\"rgb\"},\"default\":{\"type\":\"*\",\"required\":false}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":24,\"value\":[\"number\",\"color\"],\"length\":2},\"expression\":{\"type\":\"array\",\"value\":\"*\",\"minimum\":1},\"fog\":{\"range\":{\"type\":\"array\",\"default\":[0.5,10],\"minimum\":-20,\"maximum\":20,\"length\":2,\"value\":\"number\",\"property-type\":\"data-constant\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]}},\"color\":{\"type\":\"color\",\"property-type\":\"data-constant\",\"default\":\"#ffffff\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true},\"high-color\":{\"type\":\"color\",\"property-type\":\"data-constant\",\"default\":\"#245cdf\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true},\"space-color\":{\"type\":\"color\",\"property-type\":\"data-constant\",\"default\":[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true},\"horizon-blend\":{\"type\":\"number\",\"property-type\":\"data-constant\",\"default\":[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1],\"minimum\":0,\"maximum\":1,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true},\"star-intensity\":{\"type\":\"number\",\"property-type\":\"data-constant\",\"default\":[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0],\"minimum\":0,\"maximum\":1,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true}},\"light\":{\"anchor\":{\"type\":\"enum\",\"default\":\"viewport\",\"values\":{\"map\":{},\"viewport\":{}},\"property-type\":\"data-constant\",\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]}},\"position\":{\"type\":\"array\",\"default\":[1.15,210,30],\"length\":3,\"value\":\"number\",\"property-type\":\"data-constant\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]}},\"color\":{\"type\":\"color\",\"property-type\":\"data-constant\",\"default\":\"#ffffff\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true},\"intensity\":{\"type\":\"number\",\"property-type\":\"data-constant\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true}},\"projection\":{\"name\":{\"type\":\"enum\",\"values\":{\"albers\":{},\"equalEarth\":{},\"equirectangular\":{},\"lambertConformalConic\":{},\"mercator\":{},\"naturalEarth\":{},\"winkelTripel\":{},\"globe\":{}},\"default\":\"mercator\",\"required\":true},\"center\":{\"type\":\"array\",\"length\":2,\"value\":\"number\",\"property-type\":\"data-constant\",\"minimum\":[-180,-90],\"maximum\":[180,90],\"transition\":false,\"requires\":[{\"name\":[\"albers\",\"lambertConformalConic\"]}]},\"parallels\":{\"type\":\"array\",\"length\":2,\"value\":\"number\",\"property-type\":\"data-constant\",\"minimum\":[-90,-90],\"maximum\":[90,90],\"transition\":false,\"requires\":[{\"name\":[\"albers\",\"lambertConformalConic\"]}]}},\"terrain\":{\"source\":{\"type\":\"string\",\"required\":true},\"exaggeration\":{\"type\":\"number\",\"property-type\":\"data-constant\",\"default\":1,\"minimum\":0,\"maximum\":1000,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true,\"requires\":[\"source\"]}},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_heatmap\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_hillshade\",\"paint_background\",\"paint_sky\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"default\":true,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-outline-color\":{\"type\":\"color\",\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-translate\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-pattern\":{\"type\":\"resolvedImage\",\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"requires\":[{\"!\":\"fill-extrusion-pattern\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-translate-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-extrusion-translate\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-pattern\":{\"type\":\"resolvedImage\",\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-height\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-base\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true,\"requires\":[\"fill-extrusion-height\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-vertical-gradient\":{\"type\":\"boolean\",\"default\":true,\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-ambient-occlusion-intensity\":{\"property-type\":\"data-constant\",\"type\":\"number\",\"private\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true},\"fill-extrusion-ambient-occlusion-radius\":{\"property-type\":\"data-constant\",\"type\":\"number\",\"private\":true,\"default\":3,\"minimum\":0,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"transition\":true,\"requires\":[\"fill-extrusion-edge-radius\"]}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-translate-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"line-translate\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-offset\":{\"type\":\"number\",\"default\":0,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"minimum\":0,\"transition\":false,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-pattern\":{\"type\":\"resolvedImage\",\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-gradient\":{\"type\":\"color\",\"transition\":false,\"requires\":[{\"!\":\"line-pattern\"},{\"source\":\"geojson\",\"has\":{\"lineMetrics\":true}}],\"expression\":{\"interpolated\":true,\"parameters\":[\"line-progress\"]},\"property-type\":\"color-ramp\"},\"line-trim-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"minimum\":[0,0],\"maximum\":[1,1],\"transition\":false,\"requires\":[{\"source\":\"geojson\",\"has\":{\"lineMetrics\":true}}],\"property-type\":\"constant\"}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-translate-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"circle-translate\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-scale\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-alignment\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"viewport\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-stroke-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"}},\"paint_heatmap\":{\"heatmap-radius\":{\"type\":\"number\",\"default\":30,\"minimum\":1,\"transition\":true,\"units\":\"pixels\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-weight\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"transition\":false,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-intensity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"heatmap-color\":{\"type\":\"color\",\"default\":[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"],\"transition\":false,\"expression\":{\"interpolated\":true,\"parameters\":[\"heatmap-density\"]},\"property-type\":\"color-ramp\"},\"heatmap-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"}},\"paint_symbol\":{\"icon-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"transition\":true,\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-translate-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"overridable\":true,\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"transition\":true,\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-translate-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"transition\":true,\"units\":\"degrees\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-min\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-max\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-saturation\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-contrast\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-resampling\":{\"type\":\"enum\",\"values\":{\"linear\":{},\"nearest\":{}},\"default\":\"linear\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"transition\":false,\"units\":\"milliseconds\",\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"}},\"paint_hillshade\":{\"hillshade-illumination-direction\":{\"type\":\"number\",\"default\":335,\"minimum\":0,\"maximum\":359,\"transition\":false,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-illumination-anchor\":{\"type\":\"enum\",\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"viewport\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-exaggeration\":{\"type\":\"number\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-shadow-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-highlight-color\":{\"type\":\"color\",\"default\":\"#FFFFFF\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-accent-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"background-pattern\":{\"type\":\"resolvedImage\",\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"}},\"paint_sky\":{\"sky-type\":{\"type\":\"enum\",\"values\":{\"gradient\":{},\"atmosphere\":{}},\"default\":\"atmosphere\",\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"sky-atmosphere-sun\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"units\":\"degrees\",\"minimum\":[0,0],\"maximum\":[360,180],\"transition\":false,\"requires\":[{\"sky-type\":\"atmosphere\"}],\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"sky-atmosphere-sun-intensity\":{\"type\":\"number\",\"requires\":[{\"sky-type\":\"atmosphere\"}],\"default\":10,\"minimum\":0,\"maximum\":100,\"transition\":false,\"property-type\":\"data-constant\"},\"sky-gradient-center\":{\"type\":\"array\",\"requires\":[{\"sky-type\":\"gradient\"}],\"value\":\"number\",\"default\":[0,0],\"length\":2,\"units\":\"degrees\",\"minimum\":[0,0],\"maximum\":[360,180],\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"sky-gradient-radius\":{\"type\":\"number\",\"requires\":[{\"sky-type\":\"gradient\"}],\"default\":90,\"minimum\":0,\"maximum\":180,\"transition\":false,\"expression\":{\"interpolated\":false,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"},\"sky-gradient\":{\"type\":\"color\",\"default\":[\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"],\"transition\":false,\"requires\":[{\"sky-type\":\"gradient\"}],\"expression\":{\"interpolated\":true,\"parameters\":[\"sky-radial-progress\"]},\"property-type\":\"color-ramp\"},\"sky-atmosphere-halo-color\":{\"type\":\"color\",\"default\":\"white\",\"transition\":false,\"requires\":[{\"sky-type\":\"atmosphere\"}],\"property-type\":\"data-constant\"},\"sky-atmosphere-color\":{\"type\":\"color\",\"default\":\"white\",\"transition\":false,\"requires\":[{\"sky-type\":\"atmosphere\"}],\"property-type\":\"data-constant\"},\"sky-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"expression\":{\"interpolated\":true,\"parameters\":[\"zoom\"]},\"property-type\":\"data-constant\"}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\"}},\"property-type\":{\"data-driven\":{\"type\":\"property-type\"},\"color-ramp\":{\"type\":\"property-type\"},\"data-constant\":{\"type\":\"property-type\"},\"constant\":{\"type\":\"property-type\"}},\"promoteId\":{\"*\":{\"type\":\"string\"}}}');function Wt(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}function Jt(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}function Qt(t){if(Array.isArray(t))return t.map(Qt);if(t instanceof Object&&!(t instanceof Number||t instanceof String||t instanceof Boolean)){const e={};for(const r in t)e[r]=Qt(t[r]);return e}return Jt(t)}class te extends Error{constructor(t,e){super(e),this.message=e,this.key=t;}}var ee=te;class re{constructor(t,e=[]){this.parent=t,this.bindings={};for(const[t,r]of e)this.bindings[t]=r;}concat(t){return new re(this,t)}get(t){if(this.bindings[t])return this.bindings[t];if(this.parent)return this.parent.get(t);throw new Error(`${t} not found in scope.`)}has(t){return !!this.bindings[t]||!!this.parent&&this.parent.has(t)}}var ne=re;const ie={kind:\"null\"},se={kind:\"number\"},ae={kind:\"string\"},oe={kind:\"boolean\"},le={kind:\"color\"},ue={kind:\"object\"},ce={kind:\"value\"},he={kind:\"collator\"},pe={kind:\"formatted\"},fe={kind:\"resolvedImage\"};function de(t,e){return {kind:\"array\",itemType:t,N:e}}function ye(t){if(\"array\"===t.kind){const e=ye(t.itemType);return \"number\"==typeof t.N?`array<${e}, ${t.N}>`:\"value\"===t.itemType.kind?\"array\":`array<${e}>`}return t.kind}const me=[ie,se,ae,oe,le,pe,ue,de(ce),fe];function ge(t,e){if(\"error\"===e.kind)return null;if(\"array\"===t.kind){if(\"array\"===e.kind&&(0===e.N&&\"value\"===e.itemType.kind||!ge(t.itemType,e.itemType))&&(\"number\"!=typeof t.N||t.N===e.N))return null}else {if(t.kind===e.kind)return null;if(\"value\"===t.kind)for(const t of me)if(!ge(t,e))return null}return `Expected ${ye(t)} but found ${ye(e)} instead.`}function xe(t,e){return e.some((e=>e.kind===t.kind))}function ve(t,e){return e.some((e=>\"null\"===e?null===t:\"array\"===e?Array.isArray(t):\"object\"===e?t&&!Array.isArray(t)&&\"object\"==typeof t:e===typeof t))}var be,we={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function _e(t){return (t=Math.round(t))<0?0:t>255?255:t}function Ae(t){return _e(\"%\"===t[t.length-1]?parseFloat(t)/100*255:parseInt(t))}function Se(t){return (e=\"%\"===t[t.length-1]?parseFloat(t)/100:parseFloat(t))<0?0:e>1?1:e;var e;}function ke(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{be={}.parseCSSColor=function(t){var e,r=t.replace(/ /g,\"\").toLowerCase();if(r in we)return we[r].slice();if(\"#\"===r[0])return 4===r.length?(e=parseInt(r.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===r.length&&(e=parseInt(r.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var n=r.indexOf(\"(\"),i=r.indexOf(\")\");if(-1!==n&&i+1===r.length){var s=r.substr(0,n),a=r.substr(n+1,i-(n+1)).split(\",\"),o=1;switch(s){case\"rgba\":if(4!==a.length)return null;o=Se(a.pop());case\"rgb\":return 3!==a.length?null:[Ae(a[0]),Ae(a[1]),Ae(a[2]),o];case\"hsla\":if(4!==a.length)return null;o=Se(a.pop());case\"hsl\":if(3!==a.length)return null;var l=(parseFloat(a[0])%360+360)%360/360,u=Se(a[1]),c=Se(a[2]),h=c<=.5?c*(u+1):c+u-c*u,p=2*c-h;return [_e(255*ke(p,h,l+1/3)),_e(255*ke(p,h,l)),_e(255*ke(p,h,l-1/3)),o];default:return null}}return null};}catch(t){}class Ie{constructor(t,e,r,n=1){this.r=t,this.g=e,this.b=r,this.a=n;}static parse(t){if(!t)return;if(t instanceof Ie)return t;if(\"string\"!=typeof t)return;const e=be(t);return e?new Ie(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3]):void 0}toString(){const[t,e,r,n]=this.toArray();return `rgba(${Math.round(t)},${Math.round(e)},${Math.round(r)},${n})`}toArray(){const{r:t,g:e,b:r,a:n}=this;return 0===n?[0,0,0,0]:[255*t/n,255*e/n,255*r/n,n]}toArray01(){const{r:t,g:e,b:r,a:n}=this;return 0===n?[0,0,0,0]:[t/n,e/n,r/n,n]}toArray01PremultipliedAlpha(){const{r:t,g:e,b:r,a:n}=this;return [t,e,r,n]}}Ie.black=new Ie(0,0,0,1),Ie.white=new Ie(1,1,1,1),Ie.transparent=new Ie(0,0,0,0),Ie.red=new Ie(1,0,0,1),Ie.blue=new Ie(0,0,1,1);var Me=Ie;class Te{constructor(t,e,r){this.sensitivity=t?e?\"variant\":\"case\":e?\"accent\":\"base\",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:\"search\"});}compare(t,e){return this.collator.compare(t,e)}resolvedLocale(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale}}class ze{constructor(t,e,r,n,i){this.text=t.normalize?t.normalize():t,this.image=e,this.scale=r,this.fontStack=n,this.textColor=i;}}class Be{constructor(t){this.sections=t;}static fromString(t){return new Be([new ze(t,null,null,null,null)])}isEmpty(){return 0===this.sections.length||!this.sections.some((t=>0!==t.text.length||t.image&&0!==t.image.name.length))}static factory(t){return t instanceof Be?t:Be.fromString(t)}toString(){return 0===this.sections.length?\"\":this.sections.map((t=>t.text)).join(\"\")}serialize(){const t=[\"format\"];for(const e of this.sections){if(e.image){t.push([\"image\",e.image.name]);continue}t.push(e.text);const r={};e.fontStack&&(r[\"text-font\"]=[\"literal\",e.fontStack.split(\",\")]),e.scale&&(r[\"font-scale\"]=e.scale),e.textColor&&(r[\"text-color\"]=[\"rgba\"].concat(e.textColor.toArray())),t.push(r);}return t}}class Ee{constructor(t){this.name=t.name,this.available=t.available;}toString(){return this.name}static fromString(t){return t?new Ee({name:t,available:!1}):null}serialize(){return [\"image\",this.name]}}function Ce(t,e,r,n){return \"number\"==typeof t&&t>=0&&t<=255&&\"number\"==typeof e&&e>=0&&e<=255&&\"number\"==typeof r&&r>=0&&r<=255?void 0===n||\"number\"==typeof n&&n>=0&&n<=1?null:`Invalid rgba value [${[t,e,r,n].join(\", \")}]: 'a' must be between 0 and 1.`:`Invalid rgba value [${(\"number\"==typeof n?[t,e,r,n]:[t,e,r]).join(\", \")}]: 'r', 'g', and 'b' must be between 0 and 255.`}function Pe(t){if(null===t)return !0;if(\"string\"==typeof t)return !0;if(\"boolean\"==typeof t)return !0;if(\"number\"==typeof t)return !0;if(t instanceof Me)return !0;if(t instanceof Te)return !0;if(t instanceof Be)return !0;if(t instanceof Ee)return !0;if(Array.isArray(t)){for(const e of t)if(!Pe(e))return !1;return !0}if(\"object\"==typeof t){for(const e in t)if(!Pe(t[e]))return !1;return !0}return !1}function De(t){if(null===t)return ie;if(\"string\"==typeof t)return ae;if(\"boolean\"==typeof t)return oe;if(\"number\"==typeof t)return se;if(t instanceof Me)return le;if(t instanceof Te)return he;if(t instanceof Be)return pe;if(t instanceof Ee)return fe;if(Array.isArray(t)){const e=t.length;let r;for(const e of t){const t=De(e);if(r){if(r===t)continue;r=ce;break}r=t;}return de(r||ce,e)}return ue}function Ve(t){const e=typeof t;return null===t?\"\":\"string\"===e||\"number\"===e||\"boolean\"===e?String(t):t instanceof Me||t instanceof Be||t instanceof Ee?t.toString():JSON.stringify(t)}class Le{constructor(t,e){this.type=t,this.value=e;}static parse(t,e){if(2!==t.length)return e.error(`'literal' expression requires exactly one argument, but found ${t.length-1} instead.`);if(!Pe(t[1]))return e.error(\"invalid value\");const r=t[1];let n=De(r);const i=e.expectedType;return \"array\"!==n.kind||0!==n.N||!i||\"array\"!==i.kind||\"number\"==typeof i.N&&0!==i.N||(n=i),new Le(n,r)}evaluate(){return this.value}eachChild(){}outputDefined(){return !0}serialize(){return \"array\"===this.type.kind||\"object\"===this.type.kind?[\"literal\",this.value]:this.value instanceof Me?[\"rgba\"].concat(this.value.toArray()):this.value instanceof Be?this.value.serialize():this.value}}var Fe=Le,Re=class{constructor(t){this.name=\"ExpressionEvaluationError\",this.message=t;}toJSON(){return this.message}};const je={string:ae,number:se,boolean:oe,object:ue};class Ue{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");let r,n=1;const i=t[0];if(\"array\"===i){let i,s;if(t.length>2){const r=t[1];if(\"string\"!=typeof r||!(r in je)||\"object\"===r)return e.error('The item type argument of \"array\" must be one of string, number, boolean',1);i=je[r],n++;}else i=ce;if(t.length>3){if(null!==t[2]&&(\"number\"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to \"array\" must be a positive integer literal',2);s=t[2],n++;}r=de(i,s);}else r=je[i];const s=[];for(;n<t.length;n++){const r=e.parse(t[n],n,ce);if(!r)return null;s.push(r);}return new Ue(r,s)}evaluate(t){for(let e=0;e<this.args.length;e++){const r=this.args[e].evaluate(t);if(!ge(this.type,De(r)))return r;if(e===this.args.length-1)throw new Re(`Expected value to be of type ${ye(this.type)}, but found ${ye(De(r))} instead.`)}return null}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every((t=>t.outputDefined()))}serialize(){const t=this.type,e=[t.kind];if(\"array\"===t.kind){const r=t.itemType;if(\"string\"===r.kind||\"number\"===r.kind||\"boolean\"===r.kind){e.push(r.kind);const n=t.N;(\"number\"==typeof n||this.args.length>1)&&e.push(n);}}return e.concat(this.args.map((t=>t.serialize())))}}var $e=Ue;class Oe{constructor(t){this.type=pe,this.sections=t;}static parse(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");const r=t[1];if(!Array.isArray(r)&&\"object\"==typeof r)return e.error(\"First argument must be an image or text section.\");const n=[];let i=!1;for(let r=1;r<=t.length-1;++r){const s=t[r];if(i&&\"object\"==typeof s&&!Array.isArray(s)){i=!1;let t=null;if(s[\"font-scale\"]&&(t=e.parse(s[\"font-scale\"],1,se),!t))return null;let r=null;if(s[\"text-font\"]&&(r=e.parse(s[\"text-font\"],1,de(ae)),!r))return null;let a=null;if(s[\"text-color\"]&&(a=e.parse(s[\"text-color\"],1,le),!a))return null;const o=n[n.length-1];o.scale=t,o.font=r,o.textColor=a;}else {const s=e.parse(t[r],1,ce);if(!s)return null;const a=s.type.kind;if(\"string\"!==a&&\"value\"!==a&&\"null\"!==a&&\"resolvedImage\"!==a)return e.error(\"Formatted text type must be 'string', 'value', 'image' or 'null'.\");i=!0,n.push({content:s,scale:null,font:null,textColor:null});}}return new Oe(n)}evaluate(t){return new Be(this.sections.map((e=>{const r=e.content.evaluate(t);return De(r)===fe?new ze(\"\",r,null,null,null):new ze(Ve(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(\",\"):null,e.textColor?e.textColor.evaluate(t):null)})))}eachChild(t){for(const e of this.sections)t(e.content),e.scale&&t(e.scale),e.font&&t(e.font),e.textColor&&t(e.textColor);}outputDefined(){return !1}serialize(){const t=[\"format\"];for(const e of this.sections){t.push(e.content.serialize());const r={};e.scale&&(r[\"font-scale\"]=e.scale.serialize()),e.font&&(r[\"text-font\"]=e.font.serialize()),e.textColor&&(r[\"text-color\"]=e.textColor.serialize()),t.push(r);}return t}}class qe{constructor(t){this.type=fe,this.input=t;}static parse(t,e){if(2!==t.length)return e.error(\"Expected two arguments.\");const r=e.parse(t[1],1,ae);return r?new qe(r):e.error(\"No image name provided.\")}evaluate(t){const e=this.input.evaluate(t),r=Ee.fromString(e);return r&&t.availableImages&&(r.available=t.availableImages.indexOf(e)>-1),r}eachChild(t){t(this.input);}outputDefined(){return !1}serialize(){return [\"image\",this.input.serialize()]}}const Ne={\"to-boolean\":oe,\"to-color\":le,\"to-number\":se,\"to-string\":ae};class Ge{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");const r=t[0];if((\"to-boolean\"===r||\"to-string\"===r)&&2!==t.length)return e.error(\"Expected one argument.\");const n=Ne[r],i=[];for(let r=1;r<t.length;r++){const n=e.parse(t[r],r,ce);if(!n)return null;i.push(n);}return new Ge(n,i)}evaluate(t){if(\"boolean\"===this.type.kind)return Boolean(this.args[0].evaluate(t));if(\"color\"===this.type.kind){let e,r;for(const n of this.args){if(e=n.evaluate(t),r=null,e instanceof Me)return e;if(\"string\"==typeof e){const r=t.parseColor(e);if(r)return r}else if(Array.isArray(e)&&(r=e.length<3||e.length>4?`Invalid rbga value ${JSON.stringify(e)}: expected an array containing either three or four numeric values.`:Ce(e[0],e[1],e[2],e[3]),!r))return new Me(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new Re(r||`Could not parse color from value '${\"string\"==typeof e?e:String(JSON.stringify(e))}'`)}if(\"number\"===this.type.kind){let e=null;for(const r of this.args){if(e=r.evaluate(t),null===e)return 0;const n=Number(e);if(!isNaN(n))return n}throw new Re(`Could not convert ${JSON.stringify(e)} to number.`)}return \"formatted\"===this.type.kind?Be.fromString(Ve(this.args[0].evaluate(t))):\"resolvedImage\"===this.type.kind?Ee.fromString(Ve(this.args[0].evaluate(t))):Ve(this.args[0].evaluate(t))}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every((t=>t.outputDefined()))}serialize(){if(\"formatted\"===this.type.kind)return new Oe([{content:this.args[0],scale:null,font:null,textColor:null}]).serialize();if(\"resolvedImage\"===this.type.kind)return new qe(this.args[0]).serialize();const t=[`to-${this.type.kind}`];return this.eachChild((e=>{t.push(e.serialize());})),t}}var Xe=Ge;const Ze=[\"Unknown\",\"Point\",\"LineString\",\"Polygon\"];var Ke=class{constructor(){this.globals=null,this.feature=null,this.featureState=null,this.formattedSection=null,this._parseColorCache={},this.availableImages=null,this.canonical=null,this.featureTileCoord=null,this.featureDistanceData=null;}id(){return this.feature&&void 0!==this.feature.id?this.feature.id:null}geometryType(){return this.feature?\"number\"==typeof this.feature.type?Ze[this.feature.type]:this.feature.type:null}geometry(){return this.feature&&\"geometry\"in this.feature?this.feature.geometry:null}canonicalID(){return this.canonical}properties(){return this.feature&&this.feature.properties||{}}distanceFromCenter(){if(this.featureTileCoord&&this.featureDistanceData){const t=this.featureDistanceData.center,e=this.featureDistanceData.scale,{x:r,y:n}=this.featureTileCoord;return this.featureDistanceData.bearing[0]*(r*e-t[0])+this.featureDistanceData.bearing[1]*(n*e-t[1])}return 0}parseColor(t){let e=this._parseColorCache[t];return e||(e=this._parseColorCache[t]=Me.parse(t)),e}};class Ye{constructor(t,e,r,n){this.name=t,this.type=e,this._evaluate=r,this.args=n;}evaluate(t){return this._evaluate(t,this.args)}eachChild(t){this.args.forEach(t);}outputDefined(){return !1}serialize(){return [this.name].concat(this.args.map((t=>t.serialize())))}static parse(t,e){const r=t[0],n=Ye.definitions[r];if(!n)return e.error(`Unknown expression \"${r}\". If you wanted a literal array, use [\"literal\", [...]].`,0);const i=Array.isArray(n)?n[0]:n.type,s=Array.isArray(n)?[[n[1],n[2]]]:n.overloads,a=s.filter((([e])=>!Array.isArray(e)||e.length===t.length-1));let o=null;for(const[n,s]of a){o=new _r(e.registry,e.path,null,e.scope);const a=[];let l=!1;for(let e=1;e<t.length;e++){const r=t[e],i=Array.isArray(n)?n[e-1]:n.type,s=o.parse(r,1+a.length,i);if(!s){l=!0;break}a.push(s);}if(!l)if(Array.isArray(n)&&n.length!==a.length)o.error(`Expected ${n.length} arguments, but found ${a.length} instead.`);else {for(let t=0;t<a.length;t++){const e=Array.isArray(n)?n[t]:n.type,r=a[t];o.concat(t+1).checkSubtype(e,r.type);}if(0===o.errors.length)return new Ye(r,i,s,a)}}if(1===a.length)e.errors.push(...o.errors);else {const r=(a.length?a:s).map((([t])=>{return e=t,Array.isArray(e)?`(${e.map(ye).join(\", \")})`:`(${ye(e.type)}...)`;var e;})).join(\" | \"),n=[];for(let r=1;r<t.length;r++){const i=e.parse(t[r],1+n.length);if(!i)return null;n.push(ye(i.type));}e.error(`Expected arguments of type ${r}, but found (${n.join(\", \")}) instead.`);}return null}static register(t,e){Ye.definitions=e;for(const r in e)t[r]=Ye;}}var He=Ye;class We{constructor(t,e,r){this.type=he,this.locale=r,this.caseSensitive=t,this.diacriticSensitive=e;}static parse(t,e){if(2!==t.length)return e.error(\"Expected one argument.\");const r=t[1];if(\"object\"!=typeof r||Array.isArray(r))return e.error(\"Collator options argument must be an object.\");const n=e.parse(void 0!==r[\"case-sensitive\"]&&r[\"case-sensitive\"],1,oe);if(!n)return null;const i=e.parse(void 0!==r[\"diacritic-sensitive\"]&&r[\"diacritic-sensitive\"],1,oe);if(!i)return null;let s=null;return r.locale&&(s=e.parse(r.locale,1,ae),!s)?null:new We(n,i,s)}evaluate(t){return new Te(this.caseSensitive.evaluate(t),this.diacriticSensitive.evaluate(t),this.locale?this.locale.evaluate(t):null)}eachChild(t){t(this.caseSensitive),t(this.diacriticSensitive),this.locale&&t(this.locale);}outputDefined(){return !1}serialize(){const t={};return t[\"case-sensitive\"]=this.caseSensitive.serialize(),t[\"diacritic-sensitive\"]=this.diacriticSensitive.serialize(),this.locale&&(t.locale=this.locale.serialize()),[\"collator\",t]}}const Je=8192;function Qe(t,e){t[0]=Math.min(t[0],e[0]),t[1]=Math.min(t[1],e[1]),t[2]=Math.max(t[2],e[0]),t[3]=Math.max(t[3],e[1]);}function tr(t,e){return !(t[0]<=e[0]||t[2]>=e[2]||t[1]<=e[1]||t[3]>=e[3])}function er(t,e){const r=(180+t[0])/360,n=(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t[1]*Math.PI/360)))/360,i=Math.pow(2,e.z);return [Math.round(r*i*Je),Math.round(n*i*Je)]}function rr(t,e,r){const n=t[0]-e[0],i=t[1]-e[1],s=t[0]-r[0],a=t[1]-r[1];return n*a-s*i==0&&n*s<=0&&i*a<=0}function nr(t,e){let r=!1;for(let a=0,o=e.length;a<o;a++){const o=e[a];for(let e=0,a=o.length;e<a-1;e++){if(rr(t,o[e],o[e+1]))return !1;(i=o[e])[1]>(n=t)[1]!=(s=o[e+1])[1]>n[1]&&n[0]<(s[0]-i[0])*(n[1]-i[1])/(s[1]-i[1])+i[0]&&(r=!r);}}var n,i,s;return r}function ir(t,e){for(let r=0;r<e.length;r++)if(nr(t,e[r]))return !0;return !1}function sr(t,e,r,n){const i=n[0]-r[0],s=n[1]-r[1],a=(t[0]-r[0])*s-i*(t[1]-r[1]),o=(e[0]-r[0])*s-i*(e[1]-r[1]);return a>0&&o<0||a<0&&o>0}function ar(t,e,r){for(const u of r)for(let r=0;r<u.length-1;++r)if(0!=(o=[(a=u[r+1])[0]-(s=u[r])[0],a[1]-s[1]])[0]*(l=[(i=e)[0]-(n=t)[0],i[1]-n[1]])[1]-o[1]*l[0]&&sr(n,i,s,a)&&sr(s,a,n,i))return !0;var n,i,s,a,o,l;return !1}function or(t,e){for(let r=0;r<t.length;++r)if(!nr(t[r],e))return !1;for(let r=0;r<t.length-1;++r)if(ar(t[r],t[r+1],e))return !1;return !0}function lr(t,e){for(let r=0;r<e.length;r++)if(or(t,e[r]))return !0;return !1}function ur(t,e,r){const n=[];for(let i=0;i<t.length;i++){const s=[];for(let n=0;n<t[i].length;n++){const a=er(t[i][n],r);Qe(e,a),s.push(a);}n.push(s);}return n}function cr(t,e,r){const n=[];for(let i=0;i<t.length;i++){const s=ur(t[i],e,r);n.push(s);}return n}function hr(t,e,r,n){if(t[0]<r[0]||t[0]>r[2]){const e=.5*n;let i=t[0]-r[0]>e?-n:r[0]-t[0]>e?n:0;0===i&&(i=t[0]-r[2]>e?-n:r[2]-t[0]>e?n:0),t[0]+=i;}Qe(e,t);}function pr(t,e,r,n){const i=Math.pow(2,n.z)*Je,s=[n.x*Je,n.y*Je],a=[];if(!t)return a;for(const n of t)for(const t of n){const n=[t.x+s[0],t.y+s[1]];hr(n,e,r,i),a.push(n);}return a}function fr(t,e,r,n){const i=Math.pow(2,n.z)*Je,s=[n.x*Je,n.y*Je],a=[];if(!t)return a;for(const r of t){const t=[];for(const n of r){const r=[n.x+s[0],n.y+s[1]];Qe(e,r),t.push(r);}a.push(t);}if(e[2]-e[0]<=i/2){(o=e)[0]=o[1]=1/0,o[2]=o[3]=-1/0;for(const t of a)for(const n of t)hr(n,e,r,i);}var o;return a}class dr{constructor(t,e){this.type=oe,this.geojson=t,this.geometries=e;}static parse(t,e){if(2!==t.length)return e.error(`'within' expression requires exactly one argument, but found ${t.length-1} instead.`);if(Pe(t[1])){const e=t[1];if(\"FeatureCollection\"===e.type)for(let t=0;t<e.features.length;++t){const r=e.features[t].geometry.type;if(\"Polygon\"===r||\"MultiPolygon\"===r)return new dr(e,e.features[t].geometry)}else if(\"Feature\"===e.type){const t=e.geometry.type;if(\"Polygon\"===t||\"MultiPolygon\"===t)return new dr(e,e.geometry)}else if(\"Polygon\"===e.type||\"MultiPolygon\"===e.type)return new dr(e,e)}return e.error(\"'within' expression requires valid geojson object that contains polygon geometry type.\")}evaluate(t){if(null!=t.geometry()&&null!=t.canonicalID()){if(\"Point\"===t.geometryType())return function(t,e){const r=[1/0,1/0,-1/0,-1/0],n=[1/0,1/0,-1/0,-1/0],i=t.canonicalID();if(!i)return !1;if(\"Polygon\"===e.type){const s=ur(e.coordinates,n,i),a=pr(t.geometry(),r,n,i);if(!tr(r,n))return !1;for(const t of a)if(!nr(t,s))return !1}if(\"MultiPolygon\"===e.type){const s=cr(e.coordinates,n,i),a=pr(t.geometry(),r,n,i);if(!tr(r,n))return !1;for(const t of a)if(!ir(t,s))return !1}return !0}(t,this.geometries);if(\"LineString\"===t.geometryType())return function(t,e){const r=[1/0,1/0,-1/0,-1/0],n=[1/0,1/0,-1/0,-1/0],i=t.canonicalID();if(!i)return !1;if(\"Polygon\"===e.type){const s=ur(e.coordinates,n,i),a=fr(t.geometry(),r,n,i);if(!tr(r,n))return !1;for(const t of a)if(!or(t,s))return !1}if(\"MultiPolygon\"===e.type){const s=cr(e.coordinates,n,i),a=fr(t.geometry(),r,n,i);if(!tr(r,n))return !1;for(const t of a)if(!lr(t,s))return !1}return !0}(t,this.geometries)}return !1}eachChild(){}outputDefined(){return !0}serialize(){return [\"within\",this.geojson]}}var yr=dr;function mr(t){if(t instanceof He){if(\"get\"===t.name&&1===t.args.length)return !1;if(\"feature-state\"===t.name)return !1;if(\"has\"===t.name&&1===t.args.length)return !1;if(\"properties\"===t.name||\"geometry-type\"===t.name||\"id\"===t.name)return !1;if(/^filter-/.test(t.name))return !1}if(t instanceof yr)return !1;let e=!0;return t.eachChild((t=>{e&&!mr(t)&&(e=!1);})),e}function gr(t){if(t instanceof He&&\"feature-state\"===t.name)return !1;let e=!0;return t.eachChild((t=>{e&&!gr(t)&&(e=!1);})),e}function xr(t,e){if(t instanceof He&&e.indexOf(t.name)>=0)return !1;let r=!0;return t.eachChild((t=>{r&&!xr(t,e)&&(r=!1);})),r}class vr{constructor(t,e){this.type=e.type,this.name=t,this.boundExpression=e;}static parse(t,e){if(2!==t.length||\"string\"!=typeof t[1])return e.error(\"'var' expression requires exactly one string literal argument.\");const r=t[1];return e.scope.has(r)?new vr(r,e.scope.get(r)):e.error(`Unknown variable \"${r}\". Make sure \"${r}\" has been bound in an enclosing \"let\" expression before using it.`,1)}evaluate(t){return this.boundExpression.evaluate(t)}eachChild(){}outputDefined(){return !1}serialize(){return [\"var\",this.name]}}var br=vr;class wr{constructor(t,e=[],r,n=new ne,i=[]){this.registry=t,this.path=e,this.key=e.map((t=>`[${t}]`)).join(\"\"),this.scope=n,this.errors=i,this.expectedType=r;}parse(t,e,r,n,i={}){return e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)}_parse(t,e){function r(t,e,r){return \"assert\"===r?new $e(e,[t]):\"coerce\"===r?new Xe(e,[t]):t}if(null!==t&&\"string\"!=typeof t&&\"boolean\"!=typeof t&&\"number\"!=typeof t||(t=[\"literal\",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []].');const n=t[0];if(\"string\"!=typeof n)return this.error(`Expression name must be a string, but found ${typeof n} instead. If you wanted a literal array, use [\"literal\", [...]].`,0),null;const i=this.registry[n];if(i){let n=i.parse(t,this);if(!n)return null;if(this.expectedType){const t=this.expectedType,i=n.type;if(\"string\"!==t.kind&&\"number\"!==t.kind&&\"boolean\"!==t.kind&&\"object\"!==t.kind&&\"array\"!==t.kind||\"value\"!==i.kind)if(\"color\"!==t.kind&&\"formatted\"!==t.kind&&\"resolvedImage\"!==t.kind||\"value\"!==i.kind&&\"string\"!==i.kind){if(this.checkSubtype(t,i))return null}else n=r(n,t,e.typeAnnotation||\"coerce\");else n=r(n,t,e.typeAnnotation||\"assert\");}if(!(n instanceof Fe)&&\"resolvedImage\"!==n.type.kind&&Ar(n)){const t=new Ke;try{n=new Fe(n.type,n.evaluate(t));}catch(t){return this.error(t.message),null}}return n}return this.error(`Unknown expression \"${n}\". If you wanted a literal array, use [\"literal\", [...]].`,0)}return this.error(void 0===t?\"'undefined' value invalid. Use null instead.\":\"object\"==typeof t?'Bare objects invalid. Use [\"literal\", {...}] instead.':`Expected an array, but found ${typeof t} instead.`)}concat(t,e,r){const n=\"number\"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new wr(this.registry,n,e||null,i,this.errors)}error(t,...e){const r=`${this.key}${e.map((t=>`[${t}]`)).join(\"\")}`;this.errors.push(new ee(r,t));}checkSubtype(t,e){const r=ge(t,e);return r&&this.error(r),r}}var _r=wr;function Ar(t){if(t instanceof br)return Ar(t.boundExpression);if(t instanceof He&&\"error\"===t.name)return !1;if(t instanceof We)return !1;if(t instanceof yr)return !1;const e=t instanceof Xe||t instanceof $e;let r=!0;return t.eachChild((t=>{r=e?r&&Ar(t):r&&t instanceof Fe;})),!!r&&mr(t)&&xr(t,[\"zoom\",\"heatmap-density\",\"line-progress\",\"sky-radial-progress\",\"accumulated\",\"is-supported-script\",\"pitch\",\"distance-from-center\"])}function Sr(t,e){const r=t.length-1;let n,i,s=0,a=r,o=0;for(;s<=a;)if(o=Math.floor((s+a)/2),n=t[o],i=t[o+1],n<=e){if(o===r||e<i)return o;s=o+1;}else {if(!(n>e))throw new Re(\"Input is not a number.\");a=o-1;}return 0}class kr{constructor(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(const[t,e]of r)this.labels.push(t),this.outputs.push(e);}static parse(t,e){if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error(\"Expected an even number of arguments.\");const r=e.parse(t[1],1,se);if(!r)return null;const n=[];let i=null;e.expectedType&&\"value\"!==e.expectedType.kind&&(i=e.expectedType);for(let r=1;r<t.length;r+=2){const s=1===r?-1/0:t[r],a=t[r+1],o=r,l=r+1;if(\"number\"!=typeof s)return e.error('Input/output pairs for \"step\" expressions must be defined using literal numeric values (not computed expressions) for the input values.',o);if(n.length&&n[n.length-1][0]>=s)return e.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.',o);const u=e.parse(a,l,i);if(!u)return null;i=i||u.type,n.push([s,u]);}return new kr(i,r,n)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);const i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[Sr(e,n)].evaluate(t)}eachChild(t){t(this.input);for(const e of this.outputs)t(e);}outputDefined(){return this.outputs.every((t=>t.outputDefined()))}serialize(){const t=[\"step\",this.input.serialize()];for(let e=0;e<this.labels.length;e++)e>0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t}}var Ir=kr;function Mr(t,e,r){return t*(1-r)+e*r}var Tr=Object.freeze({__proto__:null,number:Mr,color:function(t,e,r){return new Me(Mr(t.r,e.r,r),Mr(t.g,e.g,r),Mr(t.b,e.b,r),Mr(t.a,e.a,r))},array:function(t,e,r){return t.map(((t,n)=>Mr(t,e[n],r)))}});const zr=.95047,Br=1.08883,Er=4/29,Cr=6/29,Pr=3*Cr*Cr,Dr=Math.PI/180,Vr=180/Math.PI;function Lr(t){return t>.008856451679035631?Math.pow(t,1/3):t/Pr+Er}function Fr(t){return t>Cr?t*t*t:Pr*(t-Er)}function Rr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function jr(t){return (t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Ur(t){const e=jr(t.r),r=jr(t.g),n=jr(t.b),i=Lr((.4124564*e+.3575761*r+.1804375*n)/zr),s=Lr((.2126729*e+.7151522*r+.072175*n)/1);return {l:116*s-16,a:500*(i-s),b:200*(s-Lr((.0193339*e+.119192*r+.9503041*n)/Br)),alpha:t.a}}function $r(t){let e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,n=isNaN(t.b)?e:e-t.b/200;return e=1*Fr(e),r=zr*Fr(r),n=Br*Fr(n),new Me(Rr(3.2404542*r-1.5371385*e-.4985314*n),Rr(-.969266*r+1.8760108*e+.041556*n),Rr(.0556434*r-.2040259*e+1.0572252*n),t.alpha)}function Or(t,e,r){const n=e-t;return t+r*(n>180||n<-180?n-360*Math.round(n/360):n)}const qr={forward:Ur,reverse:$r,interpolate:function(t,e,r){return {l:Mr(t.l,e.l,r),a:Mr(t.a,e.a,r),b:Mr(t.b,e.b,r),alpha:Mr(t.alpha,e.alpha,r)}}},Nr={forward:function(t){const{l:e,a:r,b:n}=Ur(t),i=Math.atan2(n,r)*Vr;return {h:i<0?i+360:i,c:Math.sqrt(r*r+n*n),l:e,alpha:t.a}},reverse:function(t){const e=t.h*Dr,r=t.c;return $r({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return {h:Or(t.h,e.h,r),c:Mr(t.c,e.c,r),l:Mr(t.l,e.l,r),alpha:Mr(t.alpha,e.alpha,r)}}};var Gr=Object.freeze({__proto__:null,lab:qr,hcl:Nr});class Xr{constructor(t,e,r,n,i){this.type=t,this.operator=e,this.interpolation=r,this.input=n,this.labels=[],this.outputs=[];for(const[t,e]of i)this.labels.push(t),this.outputs.push(e);}static interpolationFactor(t,e,r,n){let i=0;if(\"exponential\"===t.name)i=Zr(e,t.base,r,n);else if(\"linear\"===t.name)i=Zr(e,1,r,n);else if(\"cubic-bezier\"===t.name){const s=t.controlPoints;i=new p(s[0],s[1],s[2],s[3]).solve(Zr(e,1,r,n));}return i}static parse(t,e){let[r,n,i,...s]=t;if(!Array.isArray(n)||0===n.length)return e.error(\"Expected an interpolation type expression.\",1);if(\"linear\"===n[0])n={name:\"linear\"};else if(\"exponential\"===n[0]){const t=n[1];if(\"number\"!=typeof t)return e.error(\"Exponential interpolation requires a numeric base.\",1,1);n={name:\"exponential\",base:t};}else {if(\"cubic-bezier\"!==n[0])return e.error(`Unknown interpolation type ${String(n[0])}`,1,0);{const t=n.slice(1);if(4!==t.length||t.some((t=>\"number\"!=typeof t||t<0||t>1)))return e.error(\"Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.\",1);n={name:\"cubic-bezier\",controlPoints:t};}}if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error(\"Expected an even number of arguments.\");if(i=e.parse(i,2,se),!i)return null;const a=[];let o=null;\"interpolate-hcl\"===r||\"interpolate-lab\"===r?o=le:e.expectedType&&\"value\"!==e.expectedType.kind&&(o=e.expectedType);for(let t=0;t<s.length;t+=2){const r=s[t],n=s[t+1],i=t+3,l=t+4;if(\"number\"!=typeof r)return e.error('Input/output pairs for \"interpolate\" expressions must be defined using literal numeric values (not computed expressions) for the input values.',i);if(a.length&&a[a.length-1][0]>=r)return e.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.',i);const u=e.parse(n,l,o);if(!u)return null;o=o||u.type,a.push([r,u]);}return \"number\"===o.kind||\"color\"===o.kind||\"array\"===o.kind&&\"number\"===o.itemType.kind&&\"number\"==typeof o.N?new Xr(o,r,n,i,a):e.error(`Type ${ye(o)} is not interpolatable.`)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);const i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);const s=Sr(e,n),a=Xr.interpolationFactor(this.interpolation,n,e[s],e[s+1]),o=r[s].evaluate(t),l=r[s+1].evaluate(t);return \"interpolate\"===this.operator?Tr[this.type.kind.toLowerCase()](o,l,a):\"interpolate-hcl\"===this.operator?Nr.reverse(Nr.interpolate(Nr.forward(o),Nr.forward(l),a)):qr.reverse(qr.interpolate(qr.forward(o),qr.forward(l),a))}eachChild(t){t(this.input);for(const e of this.outputs)t(e);}outputDefined(){return this.outputs.every((t=>t.outputDefined()))}serialize(){let t;t=\"linear\"===this.interpolation.name?[\"linear\"]:\"exponential\"===this.interpolation.name?1===this.interpolation.base?[\"linear\"]:[\"exponential\",this.interpolation.base]:[\"cubic-bezier\"].concat(this.interpolation.controlPoints);const e=[this.operator,t,this.input.serialize()];for(let t=0;t<this.labels.length;t++)e.push(this.labels[t],this.outputs[t].serialize());return e}}function Zr(t,e,r,n){const i=n-r,s=t-r;return 0===i?0:1===e?s/i:(Math.pow(e,s)-1)/(Math.pow(e,i)-1)}var Kr=Xr;class Yr{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error(\"Expectected at least one argument.\");let r=null;const n=e.expectedType;n&&\"value\"!==n.kind&&(r=n);const i=[];for(const n of t.slice(1)){const t=e.parse(n,1+i.length,r,void 0,{typeAnnotation:\"omit\"});if(!t)return null;r=r||t.type,i.push(t);}const s=n&&i.some((t=>ge(n,t.type)));return new Yr(s?ce:r,i)}evaluate(t){let e,r=null,n=0;for(const i of this.args){if(n++,r=i.evaluate(t),r&&r instanceof Ee&&!r.available&&(e||(e=r),r=null,n===this.args.length))return e;if(null!==r)break}return r}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every((t=>t.outputDefined()))}serialize(){const t=[\"coalesce\"];return this.eachChild((e=>{t.push(e.serialize());})),t}}var Hr=Yr;class Wr{constructor(t,e){this.type=e.type,this.bindings=[].concat(t),this.result=e;}evaluate(t){return this.result.evaluate(t)}eachChild(t){for(const e of this.bindings)t(e[1]);t(this.result);}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found ${t.length-1} instead.`);const r=[];for(let n=1;n<t.length-1;n+=2){const i=t[n];if(\"string\"!=typeof i)return e.error(`Expected string, but found ${typeof i} instead.`,n);if(/[^a-zA-Z0-9_]/.test(i))return e.error(\"Variable names must contain only alphanumeric characters or '_'.\",n);const s=e.parse(t[n+1],n+1);if(!s)return null;r.push([i,s]);}const n=e.parse(t[t.length-1],t.length-1,e.expectedType,r);return n?new Wr(r,n):null}outputDefined(){return this.result.outputDefined()}serialize(){const t=[\"let\"];for(const[e,r]of this.bindings)t.push(e,r.serialize());return t.push(this.result.serialize()),t}}var Jr=Wr;class Qr{constructor(t,e,r){this.type=t,this.index=e,this.input=r;}static parse(t,e){if(3!==t.length)return e.error(`Expected 2 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,se),n=e.parse(t[2],2,de(e.expectedType||ce));return r&&n?new Qr(n.type.itemType,r,n):null}evaluate(t){const e=this.index.evaluate(t),r=this.input.evaluate(t);if(e<0)throw new Re(`Array index out of bounds: ${e} < 0.`);if(e>=r.length)throw new Re(`Array index out of bounds: ${e} > ${r.length-1}.`);if(e!==Math.floor(e))throw new Re(`Array index must be an integer, but found ${e} instead.`);return r[e]}eachChild(t){t(this.index),t(this.input);}outputDefined(){return !1}serialize(){return [\"at\",this.index.serialize(),this.input.serialize()]}}var tn=Qr;class en{constructor(t,e){this.type=oe,this.needle=t,this.haystack=e;}static parse(t,e){if(3!==t.length)return e.error(`Expected 2 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,ce),n=e.parse(t[2],2,ce);return r&&n?xe(r.type,[oe,ae,se,ie,ce])?new en(r,n):e.error(`Expected first argument to be of type boolean, string, number or null, but found ${ye(r.type)} instead`):null}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(null==r)return !1;if(!ve(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new Re(`Expected first argument to be of type boolean, string, number or null, but found ${ye(De(e))} instead.`);if(!ve(r,[\"string\",\"array\"]))throw new Re(`Expected second argument to be of type array or string, but found ${ye(De(r))} instead.`);return r.indexOf(e)>=0}eachChild(t){t(this.needle),t(this.haystack);}outputDefined(){return !0}serialize(){return [\"in\",this.needle.serialize(),this.haystack.serialize()]}}var rn=en;class nn{constructor(t,e,r){this.type=se,this.needle=t,this.haystack=e,this.fromIndex=r;}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,ce),n=e.parse(t[2],2,ce);if(!r||!n)return null;if(!xe(r.type,[oe,ae,se,ie,ce]))return e.error(`Expected first argument to be of type boolean, string, number or null, but found ${ye(r.type)} instead`);if(4===t.length){const i=e.parse(t[3],3,se);return i?new nn(r,n,i):null}return new nn(r,n)}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!ve(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new Re(`Expected first argument to be of type boolean, string, number or null, but found ${ye(De(e))} instead.`);if(!ve(r,[\"string\",\"array\"]))throw new Re(`Expected second argument to be of type array or string, but found ${ye(De(r))} instead.`);if(this.fromIndex){const n=this.fromIndex.evaluate(t);return r.indexOf(e,n)}return r.indexOf(e)}eachChild(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex);}outputDefined(){return !1}serialize(){if(null!=this.fromIndex&&void 0!==this.fromIndex){const t=this.fromIndex.serialize();return [\"index-of\",this.needle.serialize(),this.haystack.serialize(),t]}return [\"index-of\",this.needle.serialize(),this.haystack.serialize()]}}var sn=nn;class an{constructor(t,e,r,n,i,s){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=s;}static parse(t,e){if(t.length<5)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if(t.length%2!=1)return e.error(\"Expected an even number of arguments.\");let r,n;e.expectedType&&\"value\"!==e.expectedType.kind&&(n=e.expectedType);const i={},s=[];for(let a=2;a<t.length-1;a+=2){let o=t[a];const l=t[a+1];Array.isArray(o)||(o=[o]);const u=e.concat(a);if(0===o.length)return u.error(\"Expected at least one branch label.\");for(const t of o){if(\"number\"!=typeof t&&\"string\"!=typeof t)return u.error(\"Branch labels must be numbers or strings.\");if(\"number\"==typeof t&&Math.abs(t)>Number.MAX_SAFE_INTEGER)return u.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);if(\"number\"==typeof t&&Math.floor(t)!==t)return u.error(\"Numeric branch labels must be integer values.\");if(r){if(u.checkSubtype(r,De(t)))return null}else r=De(t);if(void 0!==i[String(t)])return u.error(\"Branch labels must be unique.\");i[String(t)]=s.length;}const c=e.parse(l,a,n);if(!c)return null;n=n||c.type,s.push(c);}const a=e.parse(t[1],1,ce);if(!a)return null;const o=e.parse(t[t.length-1],t.length-1,n);return o?\"value\"!==a.type.kind&&e.concat(1).checkSubtype(r,a.type)?null:new an(r,n,a,i,s,o):null}evaluate(t){const e=this.input.evaluate(t);return (De(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)}eachChild(t){t(this.input),this.outputs.forEach(t),t(this.otherwise);}outputDefined(){return this.outputs.every((t=>t.outputDefined()))&&this.otherwise.outputDefined()}serialize(){const t=[\"match\",this.input.serialize()],e=Object.keys(this.cases).sort(),r=[],n={};for(const t of e){const e=n[this.cases[t]];void 0===e?(n[this.cases[t]]=r.length,r.push([this.cases[t],[t]])):r[e][1].push(t);}const i=t=>\"number\"===this.inputType.kind?Number(t):t;for(const[e,n]of r)t.push(1===n.length?i(n[0]):n.map(i)),t.push(this.outputs[e].serialize());return t.push(this.otherwise.serialize()),t}}var on=an;class ln{constructor(t,e,r){this.type=t,this.branches=e,this.otherwise=r;}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found only ${t.length-1}.`);if(t.length%2!=0)return e.error(\"Expected an odd number of arguments.\");let r;e.expectedType&&\"value\"!==e.expectedType.kind&&(r=e.expectedType);const n=[];for(let i=1;i<t.length-1;i+=2){const s=e.parse(t[i],i,oe);if(!s)return null;const a=e.parse(t[i+1],i+1,r);if(!a)return null;n.push([s,a]),r=r||a.type;}const i=e.parse(t[t.length-1],t.length-1,r);return i?new ln(r,n,i):null}evaluate(t){for(const[e,r]of this.branches)if(e.evaluate(t))return r.evaluate(t);return this.otherwise.evaluate(t)}eachChild(t){for(const[e,r]of this.branches)t(e),t(r);t(this.otherwise);}outputDefined(){return this.branches.every((([t,e])=>e.outputDefined()))&&this.otherwise.outputDefined()}serialize(){const t=[\"case\"];return this.eachChild((e=>{t.push(e.serialize());})),t}}var un=ln;class cn{constructor(t,e,r,n){this.type=t,this.input=e,this.beginIndex=r,this.endIndex=n;}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,ce),n=e.parse(t[2],2,se);if(!r||!n)return null;if(!xe(r.type,[de(ce),ae,ce]))return e.error(`Expected first argument to be of type array or string, but found ${ye(r.type)} instead`);if(4===t.length){const i=e.parse(t[3],3,se);return i?new cn(r.type,r,n,i):null}return new cn(r.type,r,n)}evaluate(t){const e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);if(!ve(e,[\"string\",\"array\"]))throw new Re(`Expected first argument to be of type array or string, but found ${ye(De(e))} instead.`);if(this.endIndex){const n=this.endIndex.evaluate(t);return e.slice(r,n)}return e.slice(r)}eachChild(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex);}outputDefined(){return !1}serialize(){if(null!=this.endIndex&&void 0!==this.endIndex){const t=this.endIndex.serialize();return [\"slice\",this.input.serialize(),this.beginIndex.serialize(),t]}return [\"slice\",this.input.serialize(),this.beginIndex.serialize()]}}var hn=cn;function pn(t,e){return \"==\"===t||\"!=\"===t?\"boolean\"===e.kind||\"string\"===e.kind||\"number\"===e.kind||\"null\"===e.kind||\"value\"===e.kind:\"string\"===e.kind||\"number\"===e.kind||\"value\"===e.kind}function fn(t,e,r,n){return 0===n.compare(e,r)}function dn(t,e,r){const n=\"==\"!==t&&\"!=\"!==t;return class i{constructor(t,e,r){this.type=oe,this.lhs=t,this.rhs=e,this.collator=r,this.hasUntypedArgument=\"value\"===t.type.kind||\"value\"===e.type.kind;}static parse(t,e){if(3!==t.length&&4!==t.length)return e.error(\"Expected two or three arguments.\");const r=t[0];let s=e.parse(t[1],1,ce);if(!s)return null;if(!pn(r,s.type))return e.concat(1).error(`\"${r}\" comparisons are not supported for type '${ye(s.type)}'.`);let a=e.parse(t[2],2,ce);if(!a)return null;if(!pn(r,a.type))return e.concat(2).error(`\"${r}\" comparisons are not supported for type '${ye(a.type)}'.`);if(s.type.kind!==a.type.kind&&\"value\"!==s.type.kind&&\"value\"!==a.type.kind)return e.error(`Cannot compare types '${ye(s.type)}' and '${ye(a.type)}'.`);n&&(\"value\"===s.type.kind&&\"value\"!==a.type.kind?s=new $e(a.type,[s]):\"value\"!==s.type.kind&&\"value\"===a.type.kind&&(a=new $e(s.type,[a])));let o=null;if(4===t.length){if(\"string\"!==s.type.kind&&\"string\"!==a.type.kind&&\"value\"!==s.type.kind&&\"value\"!==a.type.kind)return e.error(\"Cannot use collator to compare non-string types.\");if(o=e.parse(t[3],3,he),!o)return null}return new i(s,a,o)}evaluate(i){const s=this.lhs.evaluate(i),a=this.rhs.evaluate(i);if(n&&this.hasUntypedArgument){const e=De(s),r=De(a);if(e.kind!==r.kind||\"string\"!==e.kind&&\"number\"!==e.kind)throw new Re(`Expected arguments for \"${t}\" to be (string, string) or (number, number), but found (${e.kind}, ${r.kind}) instead.`)}if(this.collator&&!n&&this.hasUntypedArgument){const t=De(s),r=De(a);if(\"string\"!==t.kind||\"string\"!==r.kind)return e(i,s,a)}return this.collator?r(i,s,a,this.collator.evaluate(i)):e(i,s,a)}eachChild(t){t(this.lhs),t(this.rhs),this.collator&&t(this.collator);}outputDefined(){return !0}serialize(){const e=[t];return this.eachChild((t=>{e.push(t.serialize());})),e}}}const yn=dn(\"==\",(function(t,e,r){return e===r}),fn),mn=dn(\"!=\",(function(t,e,r){return e!==r}),(function(t,e,r,n){return !fn(0,e,r,n)})),gn=dn(\"<\",(function(t,e,r){return e<r}),(function(t,e,r,n){return n.compare(e,r)<0})),xn=dn(\">\",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),vn=dn(\"<=\",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),bn=dn(\">=\",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0}));class wn{constructor(t,e,r,n,i,s){this.type=ae,this.number=t,this.locale=e,this.currency=r,this.unit=n,this.minFractionDigits=i,this.maxFractionDigits=s;}static parse(t,e){if(3!==t.length)return e.error(\"Expected two arguments.\");const r=e.parse(t[1],1,se);if(!r)return null;const n=t[2];if(\"object\"!=typeof n||Array.isArray(n))return e.error(\"NumberFormat options argument must be an object.\");let i=null;if(n.locale&&(i=e.parse(n.locale,1,ae),!i))return null;let s=null;if(n.currency&&(s=e.parse(n.currency,1,ae),!s))return null;let a=null;if(n.unit&&(a=e.parse(n.unit,1,ae),!a))return null;let o=null;if(n[\"min-fraction-digits\"]&&(o=e.parse(n[\"min-fraction-digits\"],1,se),!o))return null;let l=null;return n[\"max-fraction-digits\"]&&(l=e.parse(n[\"max-fraction-digits\"],1,se),!l)?null:new wn(r,i,s,a,o,l)}evaluate(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:(this.currency?\"currency\":this.unit&&\"unit\")||\"decimal\",currency:this.currency?this.currency.evaluate(t):void 0,unit:this.unit?this.unit.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))}eachChild(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.unit&&t(this.unit),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits);}outputDefined(){return !1}serialize(){const t={};return this.locale&&(t.locale=this.locale.serialize()),this.currency&&(t.currency=this.currency.serialize()),this.unit&&(t.unit=this.unit.serialize()),this.minFractionDigits&&(t[\"min-fraction-digits\"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(t[\"max-fraction-digits\"]=this.maxFractionDigits.serialize()),[\"number-format\",this.number.serialize(),t]}}class _n{constructor(t){this.type=se,this.input=t;}static parse(t,e){if(2!==t.length)return e.error(`Expected 1 argument, but found ${t.length-1} instead.`);const r=e.parse(t[1],1);return r?\"array\"!==r.type.kind&&\"string\"!==r.type.kind&&\"value\"!==r.type.kind?e.error(`Expected argument of type string or array, but found ${ye(r.type)} instead.`):new _n(r):null}evaluate(t){const e=this.input.evaluate(t);if(\"string\"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new Re(`Expected value to be of type string or array, but found ${ye(De(e))} instead.`)}eachChild(t){t(this.input);}outputDefined(){return !1}serialize(){const t=[\"length\"];return this.eachChild((e=>{t.push(e.serialize());})),t}}const An={\"==\":yn,\"!=\":mn,\">\":xn,\"<\":gn,\">=\":bn,\"<=\":vn,array:$e,at:tn,boolean:$e,case:un,coalesce:Hr,collator:We,format:Oe,image:qe,in:rn,\"index-of\":sn,interpolate:Kr,\"interpolate-hcl\":Kr,\"interpolate-lab\":Kr,length:_n,let:Jr,literal:Fe,match:on,number:$e,\"number-format\":wn,object:$e,slice:hn,step:Ir,string:$e,\"to-boolean\":Xe,\"to-color\":Xe,\"to-number\":Xe,\"to-string\":Xe,var:br,within:yr};function Sn(t,[e,r,n,i]){e=e.evaluate(t),r=r.evaluate(t),n=n.evaluate(t);const s=i?i.evaluate(t):1,a=Ce(e,r,n,s);if(a)throw new Re(a);return new Me(e/255*s,r/255*s,n/255*s,s)}function kn(t,e){return t in e}function In(t,e){const r=e[t];return void 0===r?null:r}function Mn(t){return {type:t}}He.register(An,{error:[{kind:\"error\"},[ae],(t,[e])=>{throw new Re(e.evaluate(t))}],typeof:[ae,[ce],(t,[e])=>ye(De(e.evaluate(t)))],\"to-rgba\":[de(se,4),[le],(t,[e])=>e.evaluate(t).toArray()],rgb:[le,[se,se,se],Sn],rgba:[le,[se,se,se,se],Sn],has:{type:oe,overloads:[[[ae],(t,[e])=>kn(e.evaluate(t),t.properties())],[[ae,ue],(t,[e,r])=>kn(e.evaluate(t),r.evaluate(t))]]},get:{type:ce,overloads:[[[ae],(t,[e])=>In(e.evaluate(t),t.properties())],[[ae,ue],(t,[e,r])=>In(e.evaluate(t),r.evaluate(t))]]},\"feature-state\":[ce,[ae],(t,[e])=>In(e.evaluate(t),t.featureState||{})],properties:[ue,[],t=>t.properties()],\"geometry-type\":[ae,[],t=>t.geometryType()],id:[ce,[],t=>t.id()],zoom:[se,[],t=>t.globals.zoom],pitch:[se,[],t=>t.globals.pitch||0],\"distance-from-center\":[se,[],t=>t.distanceFromCenter()],\"heatmap-density\":[se,[],t=>t.globals.heatmapDensity||0],\"line-progress\":[se,[],t=>t.globals.lineProgress||0],\"sky-radial-progress\":[se,[],t=>t.globals.skyRadialProgress||0],accumulated:[ce,[],t=>void 0===t.globals.accumulated?null:t.globals.accumulated],\"+\":[se,Mn(se),(t,e)=>{let r=0;for(const n of e)r+=n.evaluate(t);return r}],\"*\":[se,Mn(se),(t,e)=>{let r=1;for(const n of e)r*=n.evaluate(t);return r}],\"-\":{type:se,overloads:[[[se,se],(t,[e,r])=>e.evaluate(t)-r.evaluate(t)],[[se],(t,[e])=>-e.evaluate(t)]]},\"/\":[se,[se,se],(t,[e,r])=>e.evaluate(t)/r.evaluate(t)],\"%\":[se,[se,se],(t,[e,r])=>e.evaluate(t)%r.evaluate(t)],ln2:[se,[],()=>Math.LN2],pi:[se,[],()=>Math.PI],e:[se,[],()=>Math.E],\"^\":[se,[se,se],(t,[e,r])=>Math.pow(e.evaluate(t),r.evaluate(t))],sqrt:[se,[se],(t,[e])=>Math.sqrt(e.evaluate(t))],log10:[se,[se],(t,[e])=>Math.log(e.evaluate(t))/Math.LN10],ln:[se,[se],(t,[e])=>Math.log(e.evaluate(t))],log2:[se,[se],(t,[e])=>Math.log(e.evaluate(t))/Math.LN2],sin:[se,[se],(t,[e])=>Math.sin(e.evaluate(t))],cos:[se,[se],(t,[e])=>Math.cos(e.evaluate(t))],tan:[se,[se],(t,[e])=>Math.tan(e.evaluate(t))],asin:[se,[se],(t,[e])=>Math.asin(e.evaluate(t))],acos:[se,[se],(t,[e])=>Math.acos(e.evaluate(t))],atan:[se,[se],(t,[e])=>Math.atan(e.evaluate(t))],min:[se,Mn(se),(t,e)=>Math.min(...e.map((e=>e.evaluate(t))))],max:[se,Mn(se),(t,e)=>Math.max(...e.map((e=>e.evaluate(t))))],abs:[se,[se],(t,[e])=>Math.abs(e.evaluate(t))],round:[se,[se],(t,[e])=>{const r=e.evaluate(t);return r<0?-Math.round(-r):Math.round(r)}],floor:[se,[se],(t,[e])=>Math.floor(e.evaluate(t))],ceil:[se,[se],(t,[e])=>Math.ceil(e.evaluate(t))],\"filter-==\":[oe,[ae,ce],(t,[e,r])=>t.properties()[e.value]===r.value],\"filter-id-==\":[oe,[ce],(t,[e])=>t.id()===e.value],\"filter-type-==\":[oe,[ae],(t,[e])=>t.geometryType()===e.value],\"filter-<\":[oe,[ae,ce],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n<i}],\"filter-id-<\":[oe,[ce],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r<n}],\"filter->\":[oe,[ae,ce],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n>i}],\"filter-id->\":[oe,[ce],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r>n}],\"filter-<=\":[oe,[ae,ce],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n<=i}],\"filter-id-<=\":[oe,[ce],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r<=n}],\"filter->=\":[oe,[ae,ce],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n>=i}],\"filter-id->=\":[oe,[ce],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r>=n}],\"filter-has\":[oe,[ce],(t,[e])=>e.value in t.properties()],\"filter-has-id\":[oe,[],t=>null!==t.id()&&void 0!==t.id()],\"filter-type-in\":[oe,[de(ae)],(t,[e])=>e.value.indexOf(t.geometryType())>=0],\"filter-id-in\":[oe,[de(ce)],(t,[e])=>e.value.indexOf(t.id())>=0],\"filter-in-small\":[oe,[ae,de(ce)],(t,[e,r])=>r.value.indexOf(t.properties()[e.value])>=0],\"filter-in-large\":[oe,[ae,de(ce)],(t,[e,r])=>function(t,e,r,n){for(;r<=n;){const i=r+n>>1;if(e[i]===t)return !0;e[i]>t?n=i-1:r=i+1;}return !1}(t.properties()[e.value],r.value,0,r.value.length-1)],all:{type:oe,overloads:[[[oe,oe],(t,[e,r])=>e.evaluate(t)&&r.evaluate(t)],[Mn(oe),(t,e)=>{for(const r of e)if(!r.evaluate(t))return !1;return !0}]]},any:{type:oe,overloads:[[[oe,oe],(t,[e,r])=>e.evaluate(t)||r.evaluate(t)],[Mn(oe),(t,e)=>{for(const r of e)if(r.evaluate(t))return !0;return !1}]]},\"!\":[oe,[oe],(t,[e])=>!e.evaluate(t)],\"is-supported-script\":[oe,[ae],(t,[e])=>{const r=t.globals&&t.globals.isSupportedScript;return !r||r(e.evaluate(t))}],upcase:[ae,[ae],(t,[e])=>e.evaluate(t).toUpperCase()],downcase:[ae,[ae],(t,[e])=>e.evaluate(t).toLowerCase()],concat:[ae,Mn(ce),(t,e)=>e.map((e=>Ve(e.evaluate(t)))).join(\"\")],\"resolved-locale\":[ae,[he],(t,[e])=>e.evaluate(t).resolvedLocale()]});var Tn=An;function zn(t){return {result:\"success\",value:t}}function Bn(t){return {result:\"error\",value:t}}function En(t){return \"data-driven\"===t[\"property-type\"]}function Cn(t){return !!t.expression&&t.expression.parameters.indexOf(\"zoom\")>-1}function Pn(t){return !!t.expression&&t.expression.interpolated}function Dn(t){return t instanceof Number?\"number\":t instanceof String?\"string\":t instanceof Boolean?\"boolean\":Array.isArray(t)?\"array\":null===t?\"null\":typeof t}function Vn(t){return \"object\"==typeof t&&null!==t&&!Array.isArray(t)}function Ln(t){return t}function Fn(t,e){const r=\"color\"===e.type,n=t.stops&&\"object\"==typeof t.stops[0][0],i=n||!(n||void 0!==t.property),s=t.type||(Pn(e)?\"exponential\":\"interval\");if(r&&((t=Wt({},t)).stops&&(t.stops=t.stops.map((t=>[t[0],Me.parse(t[1])]))),t.default=Me.parse(t.default?t.default:e.default)),t.colorSpace&&\"rgb\"!==t.colorSpace&&!Gr[t.colorSpace])throw new Error(`Unknown color space: ${t.colorSpace}`);let a,o,l;if(\"exponential\"===s)a=$n;else if(\"interval\"===s)a=Un;else if(\"categorical\"===s){a=jn,o=Object.create(null);for(const e of t.stops)o[e[0]]=e[1];l=typeof t.stops[0][0];}else {if(\"identity\"!==s)throw new Error(`Unknown function type \"${s}\"`);a=On;}if(n){const r={},n=[];for(let e=0;e<t.stops.length;e++){const i=t.stops[e],s=i[0].zoom;void 0===r[s]&&(r[s]={zoom:s,type:t.type,property:t.property,default:t.default,stops:[]},n.push(s)),r[s].stops.push([i[0].value,i[1]]);}const i=[];for(const t of n)i.push([r[t].zoom,Fn(r[t],e)]);const s={name:\"linear\"};return {kind:\"composite\",interpolationType:s,interpolationFactor:Kr.interpolationFactor.bind(void 0,s),zoomStops:i.map((t=>t[0])),evaluate:({zoom:r},n)=>$n({stops:i,base:t.base},e,r).evaluate(r,n)}}if(i){const r=\"exponential\"===s?{name:\"exponential\",base:void 0!==t.base?t.base:1}:null;return {kind:\"camera\",interpolationType:r,interpolationFactor:Kr.interpolationFactor.bind(void 0,r),zoomStops:t.stops.map((t=>t[0])),evaluate:({zoom:r})=>a(t,e,r,o,l)}}return {kind:\"source\",evaluate(r,n){const i=n&&n.properties?n.properties[t.property]:void 0;return void 0===i?Rn(t.default,e.default):a(t,e,i,o,l)}}}function Rn(t,e,r){return void 0!==t?t:void 0!==e?e:void 0!==r?r:void 0}function jn(t,e,r,n,i){return Rn(typeof r===i?n[r]:void 0,t.default,e.default)}function Un(t,e,r){if(\"number\"!==Dn(r))return Rn(t.default,e.default);const n=t.stops.length;if(1===n)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[n-1][0])return t.stops[n-1][1];const i=Sr(t.stops.map((t=>t[0])),r);return t.stops[i][1]}function $n(t,e,r){const n=void 0!==t.base?t.base:1;if(\"number\"!==Dn(r))return Rn(t.default,e.default);const i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];const s=Sr(t.stops.map((t=>t[0])),r),a=function(t,e,r,n){const i=n-r,s=t-r;return 0===i?0:1===e?s/i:(Math.pow(e,s)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[s][0],t.stops[s+1][0]),o=t.stops[s][1],l=t.stops[s+1][1];let u=Tr[e.type]||Ln;if(t.colorSpace&&\"rgb\"!==t.colorSpace){const e=Gr[t.colorSpace];u=(t,r)=>e.reverse(e.interpolate(e.forward(t),e.forward(r),a));}return \"function\"==typeof o.evaluate?{evaluate(...t){const e=o.evaluate.apply(void 0,t),r=l.evaluate.apply(void 0,t);if(void 0!==e&&void 0!==r)return u(e,r,a)}}:u(o,l,a)}function On(t,e,r){return \"color\"===e.type?r=Me.parse(r):\"formatted\"===e.type?r=Be.fromString(r.toString()):\"resolvedImage\"===e.type?r=Ee.fromString(r.toString()):Dn(r)===e.type||\"enum\"===e.type&&e.values[r]||(r=void 0),Rn(r,t.default,e.default)}class qn{constructor(t,e){this.expression=t,this._warningHistory={},this._evaluator=new Ke,this._defaultValue=e?function(t){return \"color\"===t.type&&(Vn(t.default)||Array.isArray(t.default))?new Me(0,0,0,0):\"color\"===t.type?Me.parse(t.default)||null:void 0===t.default?null:t.default}(e):null,this._enumValues=e&&\"enum\"===e.type?e.values:null;}evaluateWithoutErrorHandling(t,e,r,n,i,s,a,o){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=n||null,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=s,this._evaluator.featureTileCoord=a||null,this._evaluator.featureDistanceData=o||null,this.expression.evaluate(this._evaluator)}evaluate(t,e,r,n,i,s,a,o){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=n||null,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=s||null,this._evaluator.featureTileCoord=a||null,this._evaluator.featureDistanceData=o||null;try{const t=this.expression.evaluate(this._evaluator);if(null==t||\"number\"==typeof t&&t!=t)return this._defaultValue;if(this._enumValues&&!(t in this._enumValues))throw new Re(`Expected value to be one of ${Object.keys(this._enumValues).map((t=>JSON.stringify(t))).join(\", \")}, but found ${JSON.stringify(t)} instead.`);return t}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,\"undefined\"!=typeof console&&console.warn(t.message)),this._defaultValue}}}function Nn(t){return Array.isArray(t)&&t.length>0&&\"string\"==typeof t[0]&&t[0]in Tn}function Gn(t,e){const r=new _r(Tn,[],e?function(t){const e={color:le,string:ae,number:se,enum:ae,boolean:oe,formatted:pe,resolvedImage:fe};return \"array\"===t.type?de(e[t.value]||ce,t.length):e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&\"string\"===e.type?{typeAnnotation:\"coerce\"}:void 0);return n?zn(new qn(n,e)):Bn(r.errors)}class Xn{constructor(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent=\"constant\"!==t&&!gr(e.expression);}evaluateWithoutErrorHandling(t,e,r,n,i,s){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,s)}evaluate(t,e,r,n,i,s){return this._styleExpression.evaluate(t,e,r,n,i,s)}}class Zn{constructor(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent=\"camera\"!==t&&!gr(e.expression),this.interpolationType=n;}evaluateWithoutErrorHandling(t,e,r,n,i,s){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,s)}evaluate(t,e,r,n,i,s){return this._styleExpression.evaluate(t,e,r,n,i,s)}interpolationFactor(t,e,r){return this.interpolationType?Kr.interpolationFactor(this.interpolationType,t,e,r):0}}function Kn(t,e){if(\"error\"===(t=Gn(t,e)).result)return t;const r=t.value.expression,n=mr(r);if(!n&&!En(e))return Bn([new ee(\"\",\"data expressions not supported\")]);const i=xr(r,[\"zoom\",\"pitch\",\"distance-from-center\"]);if(!i&&!Cn(e))return Bn([new ee(\"\",\"zoom expressions not supported\")]);const s=Hn(r);return s||i?s instanceof ee?Bn([s]):s instanceof Kr&&!Pn(e)?Bn([new ee(\"\",'\"interpolate\" expressions cannot be used with this property')]):zn(s?new Zn(n?\"camera\":\"composite\",t.value,s.labels,s instanceof Kr?s.interpolation:void 0):new Xn(n?\"constant\":\"source\",t.value)):Bn([new ee(\"\",'\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.')])}class Yn{constructor(t,e){this._parameters=t,this._specification=e,Wt(this,Fn(this._parameters,this._specification));}static deserialize(t){return new Yn(t._parameters,t._specification)}static serialize(t){return {_parameters:t._parameters,_specification:t._specification}}}function Hn(t){let e=null;if(t instanceof Jr)e=Hn(t.result);else if(t instanceof Hr){for(const r of t.args)if(e=Hn(r),e)break}else (t instanceof Ir||t instanceof Kr)&&t.input instanceof He&&\"zoom\"===t.input.name&&(e=t);return e instanceof ee||t.eachChild((t=>{const r=Hn(t);r instanceof ee?e=r:!e&&r?e=new ee(\"\",'\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.'):e&&r&&e!==r&&(e=new ee(\"\",'Only one zoom-based \"step\" or \"interpolate\" subexpression may be used in an expression.'));})),e}class Wn{constructor(t,e,r,n){this.message=(t?`${t}: `:\"\")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__);}}function Jn(t){const e=t.key,r=t.value,n=t.valueSpec||{},i=t.objectElementValidators||{},s=t.style,a=t.styleSpec;let o=[];const l=Dn(r);if(\"object\"!==l)return [new Wn(e,r,`object expected, ${l} found`)];for(const t in r){const l=t.split(\".\")[0],u=n[l]||n[\"*\"];let c;i[l]?c=i[l]:n[l]?c=Ci:i[\"*\"]?c=i[\"*\"]:n[\"*\"]&&(c=Ci),c?o=o.concat(c({key:(e?`${e}.`:e)+t,value:r[t],valueSpec:u,style:s,styleSpec:a,object:r,objectKey:t},r)):o.push(new Wn(e,r[t],`unknown property \"${t}\"`));}for(const t in n)i[t]||n[t].required&&void 0===n[t].default&&void 0===r[t]&&o.push(new Wn(e,r,`missing required property \"${t}\"`));return o}function Qn(t){const e=t.value,r=t.valueSpec,n=t.style,i=t.styleSpec,s=t.key,a=t.arrayElementValidator||Ci;if(\"array\"!==Dn(e))return [new Wn(s,e,`array expected, ${Dn(e)} found`)];if(r.length&&e.length!==r.length)return [new Wn(s,e,`array length ${r.length} expected, length ${e.length} found`)];if(r[\"min-length\"]&&e.length<r[\"min-length\"])return [new Wn(s,e,`array length at least ${r[\"min-length\"]} expected, length ${e.length} found`)];let o={type:r.value,values:r.values,minimum:r.minimum,maximum:r.maximum,function:void 0};i.$version<7&&(o.function=r.function),\"object\"===Dn(r.value)&&(o=r.value);let l=[];for(let t=0;t<e.length;t++)l=l.concat(a({array:e,arrayIndex:t,value:e[t],valueSpec:o,style:n,styleSpec:i,key:`${s}[${t}]`}));return l}function ti(t){const e=t.key,r=t.value,n=t.valueSpec;let i=Dn(r);if(\"number\"===i&&r!=r&&(i=\"NaN\"),\"number\"!==i)return [new Wn(e,r,`number expected, ${i} found`)];if(\"minimum\"in n){let i=n.minimum;if(\"array\"===Dn(n.minimum)&&(i=n.minimum[t.arrayIndex]),r<i)return [new Wn(e,r,`${r} is less than the minimum value ${i}`)]}if(\"maximum\"in n){let i=n.maximum;if(\"array\"===Dn(n.maximum)&&(i=n.maximum[t.arrayIndex]),r>i)return [new Wn(e,r,`${r} is greater than the maximum value ${i}`)]}return []}function ei(t){const e=t.valueSpec,r=Jt(t.value.type);let n,i,s,a={};const o=\"categorical\"!==r&&void 0===t.value.property,l=!o,u=\"array\"===Dn(t.value.stops)&&\"array\"===Dn(t.value.stops[0])&&\"object\"===Dn(t.value.stops[0][0]),c=Jn({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if(\"identity\"===r)return [new Wn(t.key,t.value,'identity function may not have a \"stops\" property')];let e=[];const n=t.value;return e=e.concat(Qn({key:t.key,value:n,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:h})),\"array\"===Dn(n)&&0===n.length&&e.push(new Wn(t.key,n,\"array must have at least one stop\")),e},default:function(t){return Ci({key:t.key,value:t.value,valueSpec:e,style:t.style,styleSpec:t.styleSpec})}}});return \"identity\"===r&&o&&c.push(new Wn(t.key,t.value,'missing required property \"property\"')),\"identity\"===r||t.value.stops||c.push(new Wn(t.key,t.value,'missing required property \"stops\"')),\"exponential\"===r&&t.valueSpec.expression&&!Pn(t.valueSpec)&&c.push(new Wn(t.key,t.value,\"exponential functions not supported\")),t.styleSpec.$version>=8&&(l&&!En(t.valueSpec)?c.push(new Wn(t.key,t.value,\"property functions not supported\")):o&&!Cn(t.valueSpec)&&c.push(new Wn(t.key,t.value,\"zoom functions not supported\"))),\"categorical\"!==r&&!u||void 0!==t.value.property||c.push(new Wn(t.key,t.value,'\"property\" property is required')),c;function h(t){let r=[];const n=t.value,o=t.key;if(\"array\"!==Dn(n))return [new Wn(o,n,`array expected, ${Dn(n)} found`)];if(2!==n.length)return [new Wn(o,n,`array length 2 expected, length ${n.length} found`)];if(u){if(\"object\"!==Dn(n[0]))return [new Wn(o,n,`object expected, ${Dn(n[0])} found`)];if(void 0===n[0].zoom)return [new Wn(o,n,\"object stop key must have zoom\")];if(void 0===n[0].value)return [new Wn(o,n,\"object stop key must have value\")];const e=Jt(n[0].zoom);if(\"number\"!=typeof e)return [new Wn(o,n[0].zoom,\"stop zoom values must be numbers\")];if(s&&s>e)return [new Wn(o,n[0].zoom,\"stop zoom values must appear in ascending order\")];e!==s&&(s=e,i=void 0,a={}),r=r.concat(Jn({key:`${o}[0]`,value:n[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:ti,value:p}}));}else r=r.concat(p({key:`${o}[0]`,value:n[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},n));return Nn(Qt(n[1]))?r.concat([new Wn(`${o}[1]`,n[1],\"expressions are not allowed in function stops.\")]):r.concat(Ci({key:`${o}[1]`,value:n[1],valueSpec:e,style:t.style,styleSpec:t.styleSpec}))}function p(t,s){const o=Dn(t.value),l=Jt(t.value),u=null!==t.value?t.value:s;if(n){if(o!==n)return [new Wn(t.key,u,`${o} stop domain type must match previous stop domain type ${n}`)]}else n=o;if(\"number\"!==o&&\"string\"!==o&&\"boolean\"!==o&&\"number\"!=typeof l&&\"string\"!=typeof l&&\"boolean\"!=typeof l)return [new Wn(t.key,u,\"stop domain value must be a number, string, or boolean\")];if(\"number\"!==o&&\"categorical\"!==r){let n=`number expected, ${o} found`;return En(e)&&void 0===r&&(n+='\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.'),[new Wn(t.key,u,n)]}return \"categorical\"!==r||\"number\"!==o||\"number\"==typeof l&&isFinite(l)&&Math.floor(l)===l?\"categorical\"!==r&&\"number\"===o&&\"number\"==typeof l&&\"number\"==typeof i&&void 0!==i&&l<i?[new Wn(t.key,u,\"stop domain values must appear in ascending order\")]:(i=l,\"categorical\"===r&&l in a?[new Wn(t.key,u,\"stop domain values must be unique\")]:(a[l]=!0,[])):[new Wn(t.key,u,`integer expected, found ${String(l)}`)]}}function ri(t){const e=(\"property\"===t.expressionContext?Kn:Gn)(Qt(t.value),t.valueSpec);if(\"error\"===e.result)return e.value.map((e=>new Wn(`${t.key}${e.key}`,t.value,e.message)));const r=e.value.expression||e.value._styleExpression.expression;if(\"property\"===t.expressionContext&&\"text-font\"===t.propertyKey&&!r.outputDefined())return [new Wn(t.key,t.value,`Invalid data expression for \"${t.propertyKey}\". Output values must be contained as literals within the expression.`)];if(\"property\"===t.expressionContext&&\"layout\"===t.propertyType&&!gr(r))return [new Wn(t.key,t.value,'\"feature-state\" data expressions are not supported with layout properties.')];if(\"filter\"===t.expressionContext)return ni(r,t);if(t.expressionContext&&0===t.expressionContext.indexOf(\"cluster\")){if(!xr(r,[\"zoom\",\"feature-state\"]))return [new Wn(t.key,t.value,'\"zoom\" and \"feature-state\" expressions are not supported with cluster properties.')];if(\"cluster-initial\"===t.expressionContext&&!mr(r))return [new Wn(t.key,t.value,\"Feature data expressions are not supported with initial expression part of cluster properties.\")]}return []}function ni(t,e){const r=new Set([\"zoom\",\"feature-state\",\"pitch\",\"distance-from-center\"]);if(e.valueSpec&&e.valueSpec.expression)for(const t of e.valueSpec.expression.parameters)r.delete(t);if(0===r.size)return [];const n=[];return t instanceof He&&r.has(t.name)?[new Wn(e.key,e.value,`[\"${t.name}\"] expression is not supported in a filter for a ${e.object.type} layer with id: ${e.object.id}`)]:(t.eachChild((t=>{n.push(...ni(t,e));})),n)}function ii(t){const e=t.key,r=t.value,n=t.valueSpec,i=[];return Array.isArray(n.values)?-1===n.values.indexOf(Jt(r))&&i.push(new Wn(e,r,`expected one of [${n.values.join(\", \")}], ${JSON.stringify(r)} found`)):-1===Object.keys(n.values).indexOf(Jt(r))&&i.push(new Wn(e,r,`expected one of [${Object.keys(n.values).join(\", \")}], ${JSON.stringify(r)} found`)),i}function si(t){if(!0===t||!1===t)return !0;if(!Array.isArray(t)||0===t.length)return !1;switch(t[0]){case\"has\":return t.length>=2&&\"$id\"!==t[1]&&\"$type\"!==t[1];case\"in\":return t.length>=3&&(\"string\"!=typeof t[1]||Array.isArray(t[2]));case\"!in\":case\"!has\":case\"none\":return !1;case\"==\":case\"!=\":case\">\":case\">=\":case\"<\":case\"<=\":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case\"any\":case\"all\":for(const e of t.slice(1))if(!si(e)&&\"boolean\"!=typeof e)return !1;return !0;default:return !0}}function ai(t,e=\"fill\"){if(null==t)return {filter:()=>!0,needGeometry:!1,needFeature:!1};si(t)||(t=fi(t));const r=t;let n=!0;try{n=function(t){if(!ui(t))return t;let e=Qt(t);return li(e),e=oi(e),e}(r);}catch(t){console.warn(`Failed to extract static filter. Filter will continue working, but at higher memory usage and slower framerate.\\nThis is most likely a bug, please report this via https://github.com/mapbox/mapbox-gl-js/issues/new?assignees=&labels=&template=Bug_report.md\\nand paste the contents of this message in the report.\\nThank you!\\nFilter Expression:\\n${JSON.stringify(r,null,2)}\\n        `);}const i=Ht[`filter_${e}`],s=Gn(n,i);let a=null;if(\"error\"===s.result)throw new Error(s.value.map((t=>`${t.key}: ${t.message}`)).join(\", \"));a=(t,e,r)=>s.value.evaluate(t,e,{},r);let o=null,l=null;if(n!==r){const t=Gn(r,i);if(\"error\"===t.result)throw new Error(t.value.map((t=>`${t.key}: ${t.message}`)).join(\", \"));o=(e,r,n,i,s)=>t.value.evaluate(e,r,{},n,void 0,void 0,i,s),l=!mr(t.value.expression);}return {filter:a,dynamicFilter:o||void 0,needGeometry:pi(n),needFeature:!!l}}function oi(t){if(!Array.isArray(t))return t;const e=function(t){if(ci.has(t[0]))for(let e=1;e<t.length;e++)if(ui(t[e]))return !0;return t}(t);return !0===e?e:e.map((t=>oi(t)))}function li(t){let e=!1;const r=[];if(\"case\"===t[0]){for(let n=1;n<t.length-1;n+=2)e=e||ui(t[n]),r.push(t[n+1]);r.push(t[t.length-1]);}else if(\"match\"===t[0]){e=e||ui(t[1]);for(let e=2;e<t.length-1;e+=2)r.push(t[e+1]);r.push(t[t.length-1]);}else if(\"step\"===t[0]){e=e||ui(t[1]);for(let e=1;e<t.length-1;e+=2)r.push(t[e+1]);}e&&(t.length=0,t.push(\"any\",...r));for(let e=1;e<t.length;e++)li(t[e]);}function ui(t){if(!Array.isArray(t))return !1;if(\"pitch\"===(e=t[0])||\"distance-from-center\"===e)return !0;var e;for(let e=1;e<t.length;e++)if(ui(t[e]))return !0;return !1}const ci=new Set([\"in\",\"==\",\"!=\",\">\",\">=\",\"<\",\"<=\",\"to-boolean\"]);function hi(t,e){return t<e?-1:t>e?1:0}function pi(t){if(!Array.isArray(t))return !1;if(\"within\"===t[0])return !0;for(let e=1;e<t.length;e++)if(pi(t[e]))return !0;return !1}function fi(t){if(!t)return !0;const e=t[0];return t.length<=1?\"any\"!==e:\"==\"===e?di(t[1],t[2],\"==\"):\"!=\"===e?gi(di(t[1],t[2],\"==\")):\"<\"===e||\">\"===e||\"<=\"===e||\">=\"===e?di(t[1],t[2],e):\"any\"===e?(r=t.slice(1),[\"any\"].concat(r.map(fi))):\"all\"===e?[\"all\"].concat(t.slice(1).map(fi)):\"none\"===e?[\"all\"].concat(t.slice(1).map(fi).map(gi)):\"in\"===e?yi(t[1],t.slice(2)):\"!in\"===e?gi(yi(t[1],t.slice(2))):\"has\"===e?mi(t[1]):\"!has\"===e?gi(mi(t[1])):\"within\"!==e||t;var r;}function di(t,e,r){switch(t){case\"$type\":return [`filter-type-${r}`,e];case\"$id\":return [`filter-id-${r}`,e];default:return [`filter-${r}`,t,e]}}function yi(t,e){if(0===e.length)return !1;switch(t){case\"$type\":return [\"filter-type-in\",[\"literal\",e]];case\"$id\":return [\"filter-id-in\",[\"literal\",e]];default:return e.length>200&&!e.some((t=>typeof t!=typeof e[0]))?[\"filter-in-large\",t,[\"literal\",e.sort(hi)]]:[\"filter-in-small\",t,[\"literal\",e]]}}function mi(t){switch(t){case\"$type\":return !0;case\"$id\":return [\"filter-has-id\"];default:return [\"filter-has\",t]}}function gi(t){return [\"!\",t]}function xi(t){return si(Qt(t.value))?ri(Wt({},t,{expressionContext:\"filter\",valueSpec:t.styleSpec[`filter_${t.layerType||\"fill\"}`]})):vi(t)}function vi(t){const e=t.value,r=t.key;if(\"array\"!==Dn(e))return [new Wn(r,e,`array expected, ${Dn(e)} found`)];const n=t.styleSpec;let i,s=[];if(e.length<1)return [new Wn(r,e,\"filter array must have at least 1 element\")];switch(s=s.concat(ii({key:`${r}[0]`,value:e[0],valueSpec:n.filter_operator,style:t.style,styleSpec:t.styleSpec})),Jt(e[0])){case\"<\":case\"<=\":case\">\":case\">=\":e.length>=2&&\"$type\"===Jt(e[1])&&s.push(new Wn(r,e,`\"$type\" cannot be use with operator \"${e[0]}\"`));case\"==\":case\"!=\":3!==e.length&&s.push(new Wn(r,e,`filter array for operator \"${e[0]}\" must have 3 elements`));case\"in\":case\"!in\":e.length>=2&&(i=Dn(e[1]),\"string\"!==i&&s.push(new Wn(`${r}[1]`,e[1],`string expected, ${i} found`)));for(let a=2;a<e.length;a++)i=Dn(e[a]),\"$type\"===Jt(e[1])?s=s.concat(ii({key:`${r}[${a}]`,value:e[a],valueSpec:n.geometry_type,style:t.style,styleSpec:t.styleSpec})):\"string\"!==i&&\"number\"!==i&&\"boolean\"!==i&&s.push(new Wn(`${r}[${a}]`,e[a],`string, number, or boolean expected, ${i} found`));break;case\"any\":case\"all\":case\"none\":for(let n=1;n<e.length;n++)s=s.concat(vi({key:`${r}[${n}]`,value:e[n],style:t.style,styleSpec:t.styleSpec}));break;case\"has\":case\"!has\":i=Dn(e[1]),2!==e.length?s.push(new Wn(r,e,`filter array for \"${e[0]}\" operator must have 2 elements`)):\"string\"!==i&&s.push(new Wn(`${r}[1]`,e[1],`string expected, ${i} found`));break;case\"within\":i=Dn(e[1]),2!==e.length?s.push(new Wn(r,e,`filter array for \"${e[0]}\" operator must have 2 elements`)):\"object\"!==i&&s.push(new Wn(`${r}[1]`,e[1],`object expected, ${i} found`));}return s}function bi(t,e){const r=t.key,n=t.style,i=t.styleSpec,s=t.value,a=t.objectKey,o=i[`${e}_${t.layerType}`];if(!o)return [];const l=a.match(/^(.*)-transition$/);if(\"paint\"===e&&l&&o[l[1]]&&o[l[1]].transition)return Ci({key:r,value:s,valueSpec:i.transition,style:n,styleSpec:i});const u=t.valueSpec||o[a];if(!u)return [new Wn(r,s,`unknown property \"${a}\"`)];let c;if(\"string\"===Dn(s)&&En(u)&&!u.tokens&&(c=/^{([^}]+)}$/.exec(s)))return [new Wn(r,s,`\"${a}\" does not support interpolation syntax\\nUse an identity property function instead: \\`{ \"type\": \"identity\", \"property\": ${JSON.stringify(c[1])} }\\`.`)];const h=[];return \"symbol\"===t.layerType&&(\"text-field\"===a&&n&&!n.glyphs&&h.push(new Wn(r,s,'use of \"text-field\" requires a style \"glyphs\" property')),\"text-font\"===a&&Vn(Qt(s))&&\"identity\"===Jt(s.type)&&h.push(new Wn(r,s,'\"text-font\" does not support identity functions'))),h.concat(Ci({key:t.key,value:s,valueSpec:u,style:n,styleSpec:i,expressionContext:\"property\",propertyType:e,propertyKey:a}))}function wi(t){return bi(t,\"paint\")}function _i(t){return bi(t,\"layout\")}function Ai(t){let e=[];const r=t.value,n=t.key,i=t.style,s=t.styleSpec;r.type||r.ref||e.push(new Wn(n,r,'either \"type\" or \"ref\" is required'));let a=Jt(r.type);const o=Jt(r.ref);if(r.id){const s=Jt(r.id);for(let a=0;a<t.arrayIndex;a++){const t=i.layers[a];Jt(t.id)===s&&e.push(new Wn(n,r.id,`duplicate layer id \"${r.id}\", previously used at line ${t.id.__line__}`));}}if(\"ref\"in r){let t;[\"type\",\"source\",\"source-layer\",\"filter\",\"layout\"].forEach((t=>{t in r&&e.push(new Wn(n,r[t],`\"${t}\" is prohibited for ref layers`));})),i.layers.forEach((e=>{Jt(e.id)===o&&(t=e);})),t?t.ref?e.push(new Wn(n,r.ref,\"ref cannot reference another ref layer\")):a=Jt(t.type):\"string\"==typeof o&&e.push(new Wn(n,r.ref,`ref layer \"${o}\" not found`));}else if(\"background\"!==a&&\"sky\"!==a)if(r.source){const t=i.sources&&i.sources[r.source],s=t&&Jt(t.type);t?\"vector\"===s&&\"raster\"===a?e.push(new Wn(n,r.source,`layer \"${r.id}\" requires a raster source`)):\"raster\"===s&&\"raster\"!==a?e.push(new Wn(n,r.source,`layer \"${r.id}\" requires a vector source`)):\"vector\"!==s||r[\"source-layer\"]?\"raster-dem\"===s&&\"hillshade\"!==a?e.push(new Wn(n,r.source,\"raster-dem source can only be used with layer type 'hillshade'.\")):\"line\"!==a||!r.paint||!r.paint[\"line-gradient\"]&&!r.paint[\"line-trim-offset\"]||\"geojson\"===s&&t.lineMetrics||e.push(new Wn(n,r,`layer \"${r.id}\" specifies a line-gradient, which requires a GeoJSON source with \\`lineMetrics\\` enabled.`)):e.push(new Wn(n,r,`layer \"${r.id}\" must specify a \"source-layer\"`)):e.push(new Wn(n,r.source,`source \"${r.source}\" not found`));}else e.push(new Wn(n,r,'missing required property \"source\"'));return e=e.concat(Jn({key:n,value:r,valueSpec:s.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\"*\":()=>[],type:()=>Ci({key:`${n}.type`,value:r.type,valueSpec:s.layer.type,style:t.style,styleSpec:t.styleSpec,object:r,objectKey:\"type\"}),filter:t=>xi(Wt({layerType:a},t)),layout:t=>Jn({layer:r,key:t.key,value:t.value,valueSpec:{},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\"*\":t=>_i(Wt({layerType:a},t))}}),paint:t=>Jn({layer:r,key:t.key,value:t.value,valueSpec:{},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\"*\":t=>wi(Wt({layerType:a},t))}})}})),e}function Si(t){const e=t.value,r=t.key,n=Dn(e);return \"string\"!==n?[new Wn(r,e,`string expected, ${n} found`)]:[]}const ki={promoteId:function({key:t,value:e}){if(\"string\"===Dn(e))return Si({key:t,value:e});{const r=[];for(const n in e)r.push(...Si({key:`${t}.${n}`,value:e[n]}));return r}}};function Ii(t){const e=t.value,r=t.key,n=t.styleSpec,i=t.style;if(!e.type)return [new Wn(r,e,'\"type\" is required')];const s=Jt(e.type);let a;switch(s){case\"vector\":case\"raster\":case\"raster-dem\":return a=Jn({key:r,value:e,valueSpec:n[`source_${s.replace(\"-\",\"_\")}`],style:t.style,styleSpec:n,objectElementValidators:ki}),a;case\"geojson\":if(a=Jn({key:r,value:e,valueSpec:n.source_geojson,style:i,styleSpec:n,objectElementValidators:ki}),e.cluster)for(const t in e.clusterProperties){const[n,i]=e.clusterProperties[t],s=\"string\"==typeof n?[n,[\"accumulated\"],[\"get\",t]]:n;a.push(...ri({key:`${r}.${t}.map`,value:i,expressionContext:\"cluster-map\"})),a.push(...ri({key:`${r}.${t}.reduce`,value:s,expressionContext:\"cluster-reduce\"}));}return a;case\"video\":return Jn({key:r,value:e,valueSpec:n.source_video,style:i,styleSpec:n});case\"image\":return Jn({key:r,value:e,valueSpec:n.source_image,style:i,styleSpec:n});case\"canvas\":return [new Wn(r,null,\"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.\",\"source.canvas\")];default:return ii({key:`${r}.type`,value:e.type,valueSpec:{values:Mi(n)},style:i,styleSpec:n})}}function Mi(t){return t.source.reduce(((e,r)=>{const n=t[r];return \"enum\"===n.type.type&&(e=e.concat(Object.keys(n.type.values))),e}),[])}function Ti(t){const e=t.value,r=t.styleSpec,n=r.light,i=t.style;let s=[];const a=Dn(e);if(void 0===e)return s;if(\"object\"!==a)return s=s.concat([new Wn(\"light\",e,`object expected, ${a} found`)]),s;for(const t in e){const a=t.match(/^(.*)-transition$/);s=s.concat(a&&n[a[1]]&&n[a[1]].transition?Ci({key:t,value:e[t],valueSpec:r.transition,style:i,styleSpec:r}):n[t]?Ci({key:t,value:e[t],valueSpec:n[t],style:i,styleSpec:r}):[new Wn(t,e[t],`unknown property \"${t}\"`)]);}return s}function zi(t){const e=t.value,r=t.key,n=t.style,i=t.styleSpec,s=i.terrain;let a=[];const o=Dn(e);if(void 0===e)return a;if(\"object\"!==o)return a=a.concat([new Wn(\"terrain\",e,`object expected, ${o} found`)]),a;for(const t in e){const r=t.match(/^(.*)-transition$/);a=a.concat(r&&s[r[1]]&&s[r[1]].transition?Ci({key:t,value:e[t],valueSpec:i.transition,style:n,styleSpec:i}):s[t]?Ci({key:t,value:e[t],valueSpec:s[t],style:n,styleSpec:i}):[new Wn(t,e[t],`unknown property \"${t}\"`)]);}if(e.source){const t=n.sources&&n.sources[e.source],i=t&&Jt(t.type);t?\"raster-dem\"!==i&&a.push(new Wn(r,e.source,`terrain cannot be used with a source of type ${String(i)}, it only be used with a \"raster-dem\" source type`)):a.push(new Wn(r,e.source,`source \"${e.source}\" not found`));}else a.push(new Wn(r,e,'terrain is missing required property \"source\"'));return a}function Bi(t){const e=t.value,r=t.style,n=t.styleSpec,i=n.fog;let s=[];const a=Dn(e);if(void 0===e)return s;if(\"object\"!==a)return s=s.concat([new Wn(\"fog\",e,`object expected, ${a} found`)]),s;for(const t in e){const a=t.match(/^(.*)-transition$/);s=s.concat(a&&i[a[1]]&&i[a[1]].transition?Ci({key:t,value:e[t],valueSpec:n.transition,style:r,styleSpec:n}):i[t]?Ci({key:t,value:e[t],valueSpec:i[t],style:r,styleSpec:n}):[new Wn(t,e[t],`unknown property \"${t}\"`)]);}return s}const Ei={\"*\":()=>[],array:Qn,boolean:function(t){const e=t.value,r=t.key,n=Dn(e);return \"boolean\"!==n?[new Wn(r,e,`boolean expected, ${n} found`)]:[]},number:ti,color:function(t){const e=t.key,r=t.value,n=Dn(r);return \"string\"!==n?[new Wn(e,r,`color expected, ${n} found`)]:null===be(r)?[new Wn(e,r,`color expected, \"${r}\" found`)]:[]},enum:ii,filter:xi,function:ei,layer:Ai,object:Jn,source:Ii,light:Ti,terrain:zi,fog:Bi,string:Si,formatted:function(t){return 0===Si(t).length?[]:ri(t)},resolvedImage:function(t){return 0===Si(t).length?[]:ri(t)},projection:function(t){const e=t.value,r=t.styleSpec,n=r.projection,i=t.style;let s=[];const a=Dn(e);if(\"object\"===a)for(const t in e)s=s.concat(Ci({key:t,value:e[t],valueSpec:n[t],style:i,styleSpec:r}));else \"string\"!==a&&(s=s.concat([new Wn(\"projection\",e,`object or string expected, ${a} found`)]));return s}};function Ci(t){const e=t.value,r=t.valueSpec,n=t.styleSpec;return r.expression&&Vn(Jt(e))?ei(t):r.expression&&Nn(Qt(e))?ri(t):r.type&&Ei[r.type]?Ei[r.type](t):Jn(Wt({},t,{valueSpec:r.type?n[r.type]:r}))}function Pi(t){const e=t.value,r=t.key,n=Si(t);return n.length||(-1===e.indexOf(\"{fontstack}\")&&n.push(new Wn(r,e,'\"glyphs\" url must include a \"{fontstack}\" token')),-1===e.indexOf(\"{range}\")&&n.push(new Wn(r,e,'\"glyphs\" url must include a \"{range}\" token'))),n}function Di(t,e=Ht){return Fi(Ci({key:\"\",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:Pi,\"*\":()=>[]}}))}const Vi=t=>Fi(wi(t)),Li=t=>Fi(_i(t));function Fi(t){return t.slice().sort(((t,e)=>t.line&&e.line?t.line-e.line:0))}function Ri(t,e){let r=!1;if(e&&e.length)for(const n of e)t.fire(new Kt(new Error(n.message))),r=!0;return r}var ji=Ui;function Ui(t,e,r){var n=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var i=new Int32Array(this.arrayBuffer);t=i[0],this.d=(e=i[1])+2*(r=i[2]);for(var s=0;s<this.d*this.d;s++){var a=i[3+s],o=i[3+s+1];n.push(a===o?null:i.subarray(a,o));}var l=i[3+n.length+1];this.keys=i.subarray(i[3+n.length],l),this.bboxes=i.subarray(l),this.insert=this._insertReadonly;}else {this.d=e+2*r;for(var u=0;u<this.d*this.d;u++)n.push([]);this.keys=[],this.bboxes=[];}this.n=e,this.extent=t,this.padding=r,this.scale=e/t,this.uid=0;var c=r/e*t;this.min=-c,this.max=t+c;}Ui.prototype.insert=function(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i);},Ui.prototype._insertReadonly=function(){throw \"Cannot insert into a GridIndex created from an ArrayBuffer.\"},Ui.prototype._insertCell=function(t,e,r,n,i,s){this.cells[i].push(s);},Ui.prototype.query=function(t,e,r,n,i){var s=this.min,a=this.max;if(t<=s&&e<=s&&a<=r&&a<=n&&!i)return Array.prototype.slice.call(this.keys);var o=[];return this._forEachCell(t,e,r,n,this._queryCell,o,{},i),o},Ui.prototype._queryCell=function(t,e,r,n,i,s,a,o){var l=this.cells[i];if(null!==l)for(var u=this.keys,c=this.bboxes,h=0;h<l.length;h++){var p=l[h];if(void 0===a[p]){var f=4*p;(o?o(c[f+0],c[f+1],c[f+2],c[f+3]):t<=c[f+2]&&e<=c[f+3]&&r>=c[f+0]&&n>=c[f+1])?(a[p]=!0,s.push(u[p])):a[p]=!1;}}},Ui.prototype._forEachCell=function(t,e,r,n,i,s,a,o){for(var l=this._convertToCellCoord(t),u=this._convertToCellCoord(e),c=this._convertToCellCoord(r),h=this._convertToCellCoord(n),p=l;p<=c;p++)for(var f=u;f<=h;f++){var d=this.d*f+p;if((!o||o(this._convertFromCellCoord(p),this._convertFromCellCoord(f),this._convertFromCellCoord(p+1),this._convertFromCellCoord(f+1)))&&i.call(this,t,e,r,n,d,s,a,o))return}},Ui.prototype._convertFromCellCoord=function(t){return (t-this.padding)/this.scale},Ui.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},Ui.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=3+this.cells.length+1+1,r=0,n=0;n<this.cells.length;n++)r+=this.cells[n].length;var i=new Int32Array(e+r+this.keys.length+this.bboxes.length);i[0]=this.extent,i[1]=this.n,i[2]=this.padding;for(var s=e,a=0;a<t.length;a++){var o=t[a];i[3+a]=s,i.set(o,s),s+=o.length;}return i[3+t.length]=s,i.set(this.keys,s),i[3+t.length+1]=s+=this.keys.length,i.set(this.bboxes,s),s+=this.bboxes.length,i.buffer};const $i={};function Oi(t,e,r={}){Object.defineProperty(t,\"_classRegistryKey\",{value:e,writeable:!1}),$i[e]={klass:t,omit:r.omit||[]};}Oi(Object,\"Object\"),ji.serialize=function(t,e){const r=t.toArrayBuffer();return e&&e.push(r),{buffer:r}},ji.deserialize=function(t){return new ji(t.buffer)},Object.defineProperty(ji,\"name\",{value:\"Grid\"}),Oi(ji,\"Grid\"),Oi(Me,\"Color\"),Oi(Error,\"Error\"),Oi(at,\"AJAXError\"),Oi(Ee,\"ResolvedImage\"),Oi(Yn,\"StylePropertyFunction\"),Oi(qn,\"StyleExpression\",{omit:[\"_evaluator\"]}),Oi(Zn,\"ZoomDependentExpression\"),Oi(Xn,\"ZoomConstantExpression\"),Oi(He,\"CompoundExpression\",{omit:[\"_evaluate\"]});for(const t in Tn)$i[Tn[t]._classRegistryKey]||Oi(Tn[t],`Expression${t}`);function qi(t){return t&&\"undefined\"!=typeof ArrayBuffer&&(t instanceof ArrayBuffer||t.constructor&&\"ArrayBuffer\"===t.constructor.name)}function Ni(t){return e.ImageBitmap&&t instanceof e.ImageBitmap}function Gi(t,r){if(null==t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp)return t;if(qi(t)||Ni(t))return r&&r.push(t),t;if(ArrayBuffer.isView(t)){const e=t;return r&&r.push(e.buffer),e}if(t instanceof e.ImageData)return r&&r.push(t.data.buffer),t;if(Array.isArray(t)){const e=[];for(const n of t)e.push(Gi(n,r));return e}if(\"object\"==typeof t){const e=t.constructor,n=e._classRegistryKey;if(!n)throw new Error(`can't serialize object of unregistered class ${n}`);const i=e.serialize?e.serialize(t,r):{};if(!e.serialize){for(const e in t)t.hasOwnProperty(e)&&($i[n].omit.indexOf(e)>=0||(i[e]=Gi(t[e],r)));t instanceof Error&&(i.message=t.message);}if(i.$name)throw new Error(\"$name property is reserved for worker serialization logic.\");return \"Object\"!==n&&(i.$name=n),i}throw new Error(\"can't serialize object of type \"+typeof t)}function Xi(t){if(null==t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||qi(t)||Ni(t)||ArrayBuffer.isView(t)||t instanceof e.ImageData)return t;if(Array.isArray(t))return t.map(Xi);if(\"object\"==typeof t){const e=t.$name||\"Object\",{klass:r}=$i[e];if(!r)throw new Error(`can't deserialize unregistered class ${e}`);if(r.deserialize)return r.deserialize(t);const n=Object.create(r.prototype);for(const e of Object.keys(t))\"$name\"!==e&&(n[e]=Xi(t[e]));return n}throw new Error(\"can't deserialize object of type \"+typeof t)}const Zi=t=>t>=1536&&t<=1791,Ki=t=>t>=1872&&t<=1919,Yi=t=>t>=2208&&t<=2303,Hi=t=>t>=11904&&t<=12031,Wi=t=>t>=12032&&t<=12255,Ji=t=>t>=12272&&t<=12287,Qi=t=>t>=12288&&t<=12351,ts=t=>t>=12352&&t<=12447,es=t=>t>=12448&&t<=12543,rs=t=>t>=12544&&t<=12591,ns=t=>t>=12704&&t<=12735,is=t=>t>=12736&&t<=12783,ss=t=>t>=12784&&t<=12799,as=t=>t>=12800&&t<=13055,os=t=>t>=13056&&t<=13311,ls=t=>t>=13312&&t<=19903,us=t=>t>=19968&&t<=40959,cs=t=>t>=40960&&t<=42127,hs=t=>t>=42128&&t<=42191,ps=t=>t>=44032&&t<=55215,fs=t=>t>=63744&&t<=64255,ds=t=>t>=64336&&t<=65023,ys=t=>t>=65040&&t<=65055,ms=t=>t>=65072&&t<=65103,gs=t=>t>=65104&&t<=65135,xs=t=>t>=65136&&t<=65279,vs=t=>t>=65280&&t<=65519;function bs(t){for(const e of t)if(As(e.charCodeAt(0)))return !0;return !1}function ws(t){for(const e of t)if(!_s(e.charCodeAt(0)))return !1;return !0}function _s(t){return !(Zi(t)||Ki(t)||Yi(t)||ds(t)||xs(t))}function As(t){return !(746!==t&&747!==t&&(t<4352||!(ns(t)||rs(t)||ms(t)&&!(t>=65097&&t<=65103)||fs(t)||os(t)||Hi(t)||is(t)||!(!Qi(t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||ls(t)||us(t)||as(t)||(t=>t>=12592&&t<=12687)(t)||(t=>t>=43360&&t<=43391)(t)||(t=>t>=55216&&t<=55295)(t)||(t=>t>=4352&&t<=4607)(t)||ps(t)||ts(t)||Ji(t)||(t=>t>=12688&&t<=12703)(t)||Wi(t)||ss(t)||es(t)&&12540!==t||!(!vs(t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!gs(t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||(t=>t>=5120&&t<=5759)(t)||(t=>t>=6320&&t<=6399)(t)||ys(t)||(t=>t>=19904&&t<=19967)(t)||cs(t)||hs(t))))}function Ss(t){return !(As(t)||function(t){return !!((t=>t>=128&&t<=255)(t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||(t=>t>=8192&&t<=8303)(t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||(t=>t>=8448&&t<=8527)(t)||(t=>t>=8528&&t<=8591)(t)||(t=>t>=8960&&t<=9215)(t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||(t=>t>=9216&&t<=9279)(t)&&9251!==t||(t=>t>=9280&&t<=9311)(t)||(t=>t>=9312&&t<=9471)(t)||(t=>t>=9632&&t<=9727)(t)||(t=>t>=9728&&t<=9983)(t)&&!(t>=9754&&t<=9759)||(t=>t>=11008&&t<=11263)(t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||Qi(t)||es(t)||(t=>t>=57344&&t<=63743)(t)||ms(t)||gs(t)||vs(t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function ks(t){return t>=1424&&t<=2303||ds(t)||xs(t)}function Is(t,e){return !(!e&&ks(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||(t=>t>=6016&&t<=6143)(t))}function Ms(t){for(const e of t)if(ks(e.charCodeAt(0)))return !0;return !1}const Ts=\"deferred\",zs=\"loading\",Bs=\"loaded\";let Es=null,Cs=\"unavailable\",Ps=null;const Ds=function(t){t&&\"string\"==typeof t&&t.indexOf(\"NetworkError\")>-1&&(Cs=\"error\"),Es&&Es(t);};function Vs(){Ls.fire(new Zt(\"pluginStateChange\",{pluginStatus:Cs,pluginURL:Ps}));}const Ls=new Yt,Fs=function(){return Cs},Rs=function(){if(Cs!==Ts||!Ps)throw new Error(\"rtl-text-plugin cannot be downloaded unless a pluginURL is specified\");Cs=zs,Vs(),Ps&&ut({url:Ps},(t=>{t?Ds(t):(Cs=Bs,Vs());}));},js={applyArabicShaping:null,processBidirectionalText:null,processStyledBidirectionalText:null,isLoaded:()=>Cs===Bs||null!=js.applyArabicShaping,isLoading:()=>Cs===zs,setState(t){Cs=t.pluginStatus,Ps=t.pluginURL;},isParsed:()=>null!=js.applyArabicShaping&&null!=js.processBidirectionalText&&null!=js.processStyledBidirectionalText,getPluginURL:()=>Ps};class Us{constructor(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.transition=e.transition,this.pitch=e.pitch):(this.now=0,this.fadeDuration=0,this.transition={},this.pitch=0);}isSupportedScript(t){return function(t,e){for(const r of t)if(!Is(r.charCodeAt(0),e))return !1;return !0}(t,js.isLoaded())}}class $s{constructor(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(Vn(t))return new Yn(t,e);if(Nn(t)){const r=Kn(t,e);if(\"error\"===r.result)throw new Error(r.value.map((t=>`${t.key}: ${t.message}`)).join(\", \"));return r.value}{let r=t;return \"string\"==typeof t&&\"color\"===e.type&&(r=Me.parse(t)),{kind:\"constant\",evaluate:()=>r}}}(void 0===e?t.specification.default:e,t.specification);}isDataDriven(){return \"source\"===this.expression.kind||\"composite\"===this.expression.kind}possiblyEvaluate(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)}}class Os{constructor(t){this.property=t,this.value=new $s(t,void 0);}transitioned(t,e){return new Ns(this.property,this.value,e,z({},t.transition,this.transition),t.now)}untransitioned(){return new Ns(this.property,this.value,null,{},0)}}class qs{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues);}getValue(t){return j(this._values[t].value.value)}setValue(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Os(this._values[t].property)),this._values[t].value=new $s(this._values[t].property,null===e?void 0:j(e));}getTransition(t){return j(this._values[t].transition)}setTransition(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Os(this._values[t].property)),this._values[t].transition=j(e)||void 0;}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r);const n=this.getTransition(e);void 0!==n&&(t[`${e}-transition`]=n);}return t}transitioned(t,e){const r=new Gs(this._properties);for(const n of Object.keys(this._values))r._values[n]=this._values[n].transitioned(t,e._values[n]);return r}untransitioned(){const t=new Gs(this._properties);for(const e of Object.keys(this._values))t._values[e]=this._values[e].untransitioned();return t}}class Ns{constructor(t,e,r,n,i){const s=n.delay||0,a=n.duration||0;i=i||0,this.property=t,this.value=e,this.begin=i+s,this.end=this.begin+a,t.specification.transition&&(n.delay||n.duration)&&(this.prior=r);}possiblyEvaluate(t,e,r){const n=t.now||0,i=this.value.possiblyEvaluate(t,e,r),s=this.prior;if(s){if(n>this.end)return this.prior=null,i;if(this.value.isDataDriven())return this.prior=null,i;if(n<this.begin)return s.possiblyEvaluate(t,e,r);{const a=(n-this.begin)/(this.end-this.begin);return this.property.interpolate(s.possiblyEvaluate(t,e,r),i,w(a))}}return i}}class Gs{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues);}possiblyEvaluate(t,e,r){const n=new Ks(this._properties);for(const i of Object.keys(this._values))n._values[i]=this._values[i].possiblyEvaluate(t,e,r);return n}hasTransition(){for(const t of Object.keys(this._values))if(this._values[t].prior)return !0;return !1}}class Xs{constructor(t){this._properties=t,this._values=Object.create(t.defaultPropertyValues);}getValue(t){return j(this._values[t].value)}setValue(t,e){this._values[t]=new $s(this._values[t].property,null===e?void 0:j(e));}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r);}return t}possiblyEvaluate(t,e,r){const n=new Ks(this._properties);for(const i of Object.keys(this._values))n._values[i]=this._values[i].possiblyEvaluate(t,e,r);return n}}class Zs{constructor(t,e,r){this.property=t,this.value=e,this.parameters=r;}isConstant(){return \"constant\"===this.value.kind}constantOr(t){return \"constant\"===this.value.kind?this.value.value:t}evaluate(t,e,r,n){return this.property.evaluate(this.value,this.parameters,t,e,r,n)}}class Ks{constructor(t){this._properties=t,this._values=Object.create(t.defaultPossiblyEvaluatedValues);}get(t){return this._values[t]}}class Ys{constructor(t){this.specification=t;}possiblyEvaluate(t,e){return t.expression.evaluate(e)}interpolate(t,e,r){const n=Tr[this.specification.type];return n?n(t,e,r):t}}class Hs{constructor(t,e){this.specification=t,this.overrides=e;}possiblyEvaluate(t,e,r,n){return new Zs(this,\"constant\"===t.expression.kind||\"camera\"===t.expression.kind?{kind:\"constant\",value:t.expression.evaluate(e,null,{},r,n)}:t.expression,e)}interpolate(t,e,r){if(\"constant\"!==t.value.kind||\"constant\"!==e.value.kind)return t;if(void 0===t.value.value||void 0===e.value.value)return new Zs(this,{kind:\"constant\",value:void 0},t.parameters);const n=Tr[this.specification.type];return n?new Zs(this,{kind:\"constant\",value:n(t.value.value,e.value.value,r)},t.parameters):t}evaluate(t,e,r,n,i,s){return \"constant\"===t.kind?t.value:t.evaluate(e,r,n,i,s)}}class Ws{constructor(t){this.specification=t;}possiblyEvaluate(t,e,r,n){return !!t.expression.evaluate(e,null,{},r,n)}interpolate(){return !1}}class Js{constructor(t){this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[];const e=new Us(0,{});for(const r in t){const n=t[r];n.specification.overridable&&this.overridableProperties.push(r);const i=this.defaultPropertyValues[r]=new $s(n,void 0),s=this.defaultTransitionablePropertyValues[r]=new Os(n);this.defaultTransitioningPropertyValues[r]=s.untransitioned(),this.defaultPossiblyEvaluatedValues[r]=i.possiblyEvaluate(e);}}}function Qs(t,e){return 256*(t=S(Math.floor(t),0,255))+S(Math.floor(e),0,255)}Oi(Hs,\"DataDrivenProperty\"),Oi(Ys,\"DataConstantProperty\"),Oi(Ws,\"ColorRampProperty\");const ta={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array};class ea{constructor(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8;}}class ra{constructor(){this.isTransferred=!1,this.capacity=-1,this.resize(0);}static serialize(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}}static deserialize(t){const e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e}_trim(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews());}clear(){this.length=0;}resize(t){this.reserve(t),this.length=t;}reserve(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);const e=this.uint8;this._refreshViews(),e&&this.uint8.set(e);}}_refreshViews(){throw new Error(\"_refreshViews() must be implemented by each concrete StructArray layout\")}destroy(){this.int8=this.uint8=this.int16=this.uint16=this.int32=this.uint32=this.float32=null,this.arrayBuffer=null;}}function na(t,e=1){let r=0,n=0;return {members:t.map((t=>{const i=ta[t.type].BYTES_PER_ELEMENT,s=r=ia(r,Math.max(e,i)),a=t.components||1;return n=Math.max(n,i),r+=i*a,{name:t.name,type:t.type,components:a,offset:s}})),size:ia(r,Math.max(n,e)),alignment:e}}function ia(t,e){return Math.ceil(t/e)*e}class sa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t}}sa.prototype.bytesPerElement=4,Oi(sa,\"StructArrayLayout2i4\");class aa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t}}aa.prototype.bytesPerElement=6,Oi(aa,\"StructArrayLayout3i6\");class oa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=4*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,t}}oa.prototype.bytesPerElement=8,Oi(oa,\"StructArrayLayout4i8\");class la extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,s,a)}emplace(t,e,r,n,i,s,a,o){const l=6*t,u=12*t,c=3*t;return this.int16[l+0]=e,this.int16[l+1]=r,this.uint8[u+4]=n,this.uint8[u+5]=i,this.uint8[u+6]=s,this.uint8[u+7]=a,this.float32[c+2]=o,t}}la.prototype.bytesPerElement=12,Oi(la,\"StructArrayLayout2i4ub1f12\");class ua extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=4*t;return this.float32[s+0]=e,this.float32[s+1]=r,this.float32[s+2]=n,this.float32[s+3]=i,t}}ua.prototype.bytesPerElement=16,Oi(ua,\"StructArrayLayout4f16\");class ca extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i){const s=this.length;return this.resize(s+1),this.emplace(s,t,e,r,n,i)}emplace(t,e,r,n,i,s){const a=6*t,o=3*t;return this.uint16[a+0]=e,this.uint16[a+1]=r,this.uint16[a+2]=n,this.uint16[a+3]=i,this.float32[o+2]=s,t}}ca.prototype.bytesPerElement=12,Oi(ca,\"StructArrayLayout4ui1f12\");class ha extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=4*t;return this.uint16[s+0]=e,this.uint16[s+1]=r,this.uint16[s+2]=n,this.uint16[s+3]=i,t}}ha.prototype.bytesPerElement=8,Oi(ha,\"StructArrayLayout4ui8\");class pa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i,s)}emplace(t,e,r,n,i,s,a){const o=6*t;return this.int16[o+0]=e,this.int16[o+1]=r,this.int16[o+2]=n,this.int16[o+3]=i,this.int16[o+4]=s,this.int16[o+5]=a,t}}pa.prototype.bytesPerElement=12,Oi(pa,\"StructArrayLayout6i12\");class fa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h){const p=this.length;return this.resize(p+1),this.emplace(p,t,e,r,n,i,s,a,o,l,u,c,h)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p){const f=12*t;return this.int16[f+0]=e,this.int16[f+1]=r,this.int16[f+2]=n,this.int16[f+3]=i,this.uint16[f+4]=s,this.uint16[f+5]=a,this.uint16[f+6]=o,this.uint16[f+7]=l,this.int16[f+8]=u,this.int16[f+9]=c,this.int16[f+10]=h,this.int16[f+11]=p,t}}fa.prototype.bytesPerElement=24,Oi(fa,\"StructArrayLayout4i4ui4i24\");class da extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i,s)}emplace(t,e,r,n,i,s,a){const o=10*t,l=5*t;return this.int16[o+0]=e,this.int16[o+1]=r,this.int16[o+2]=n,this.float32[l+2]=i,this.float32[l+3]=s,this.float32[l+4]=a,t}}da.prototype.bytesPerElement=20,Oi(da,\"StructArrayLayout3i3f20\");class ya extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.uint32[1*t+0]=e,t}}ya.prototype.bytesPerElement=4,Oi(ya,\"StructArrayLayout1ul4\");class ma extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h,p){const f=this.length;return this.resize(f+1),this.emplace(f,t,e,r,n,i,s,a,o,l,u,c,h,p)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p,f){const d=20*t,y=10*t;return this.int16[d+0]=e,this.int16[d+1]=r,this.int16[d+2]=n,this.int16[d+3]=i,this.int16[d+4]=s,this.float32[y+3]=a,this.float32[y+4]=o,this.float32[y+5]=l,this.float32[y+6]=u,this.int16[d+14]=c,this.uint32[y+8]=h,this.uint16[d+18]=p,this.uint16[d+19]=f,t}}ma.prototype.bytesPerElement=40,Oi(ma,\"StructArrayLayout5i4f1i1ul2ui40\");class ga extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,s,a)}emplace(t,e,r,n,i,s,a,o){const l=8*t;return this.int16[l+0]=e,this.int16[l+1]=r,this.int16[l+2]=n,this.int16[l+4]=i,this.int16[l+5]=s,this.int16[l+6]=a,this.int16[l+7]=o,t}}ga.prototype.bytesPerElement=16,Oi(ga,\"StructArrayLayout3i2i2i16\");class xa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i){const s=this.length;return this.resize(s+1),this.emplace(s,t,e,r,n,i)}emplace(t,e,r,n,i,s){const a=4*t,o=8*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.int16[o+6]=i,this.int16[o+7]=s,t}}xa.prototype.bytesPerElement=16,Oi(xa,\"StructArrayLayout2f1f2i16\");class va extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=12*t,a=3*t;return this.uint8[s+0]=e,this.uint8[s+1]=r,this.float32[a+1]=n,this.float32[a+2]=i,t}}va.prototype.bytesPerElement=12,Oi(va,\"StructArrayLayout2ub2f12\");class ba extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t}}ba.prototype.bytesPerElement=12,Oi(ba,\"StructArrayLayout3f12\");class wa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t}}wa.prototype.bytesPerElement=6,Oi(wa,\"StructArrayLayout3ui6\");class _a extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b){const w=this.length;return this.resize(w+1),this.emplace(w,t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w){const _=30*t,A=15*t,S=60*t;return this.int16[_+0]=e,this.int16[_+1]=r,this.int16[_+2]=n,this.float32[A+2]=i,this.float32[A+3]=s,this.uint16[_+8]=a,this.uint16[_+9]=o,this.uint32[A+5]=l,this.uint32[A+6]=u,this.uint32[A+7]=c,this.uint16[_+16]=h,this.uint16[_+17]=p,this.uint16[_+18]=f,this.float32[A+10]=d,this.float32[A+11]=y,this.uint8[S+48]=m,this.uint8[S+49]=g,this.uint8[S+50]=x,this.uint32[A+13]=v,this.int16[_+28]=b,this.uint8[S+58]=w,t}}_a.prototype.bytesPerElement=60,Oi(_a,\"StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60\");class Aa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S,k,I,M,T,z){const B=this.length;return this.resize(B+1),this.emplace(B,t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S,k,I,M,T,z)}emplace(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S,k,I,M,T,z,B){const E=38*t,C=19*t;return this.int16[E+0]=e,this.int16[E+1]=r,this.int16[E+2]=n,this.float32[C+2]=i,this.float32[C+3]=s,this.int16[E+8]=a,this.int16[E+9]=o,this.int16[E+10]=l,this.int16[E+11]=u,this.int16[E+12]=c,this.int16[E+13]=h,this.uint16[E+14]=p,this.uint16[E+15]=f,this.uint16[E+16]=d,this.uint16[E+17]=y,this.uint16[E+18]=m,this.uint16[E+19]=g,this.uint16[E+20]=x,this.uint16[E+21]=v,this.uint16[E+22]=b,this.uint16[E+23]=w,this.uint16[E+24]=_,this.uint16[E+25]=A,this.uint16[E+26]=S,this.uint16[E+27]=k,this.uint16[E+28]=I,this.uint32[C+15]=M,this.float32[C+16]=T,this.float32[C+17]=z,this.float32[C+18]=B,t}}Aa.prototype.bytesPerElement=76,Oi(Aa,\"StructArrayLayout3i2f6i15ui1ul3f76\");class Sa extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.float32[1*t+0]=e,t}}Sa.prototype.bytesPerElement=4,Oi(Sa,\"StructArrayLayout1f4\");class ka extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,n,i){const s=this.length;return this.resize(s+1),this.emplace(s,t,e,r,n,i)}emplace(t,e,r,n,i,s){const a=5*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.float32[a+3]=i,this.float32[a+4]=s,t}}ka.prototype.bytesPerElement=20,Oi(ka,\"StructArrayLayout5f20\");class Ia extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const s=6*t;return this.uint32[3*t+0]=e,this.uint16[s+2]=r,this.uint16[s+3]=n,this.uint16[s+4]=i,t}}Ia.prototype.bytesPerElement=12,Oi(Ia,\"StructArrayLayout1ul3ui12\");class Ma extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t}}Ma.prototype.bytesPerElement=4,Oi(Ma,\"StructArrayLayout2ui4\");class Ta extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.uint16[1*t+0]=e,t}}Ta.prototype.bytesPerElement=2,Oi(Ta,\"StructArrayLayout1ui2\");class za extends ra{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t}}za.prototype.bytesPerElement=8,Oi(za,\"StructArrayLayout2f8\");class Ba extends ea{get projectedAnchorX(){return this._structArray.int16[this._pos2+0]}get projectedAnchorY(){return this._structArray.int16[this._pos2+1]}get projectedAnchorZ(){return this._structArray.int16[this._pos2+2]}get tileAnchorX(){return this._structArray.int16[this._pos2+3]}get tileAnchorY(){return this._structArray.int16[this._pos2+4]}get x1(){return this._structArray.float32[this._pos4+3]}get y1(){return this._structArray.float32[this._pos4+4]}get x2(){return this._structArray.float32[this._pos4+5]}get y2(){return this._structArray.float32[this._pos4+6]}get padding(){return this._structArray.int16[this._pos2+14]}get featureIndex(){return this._structArray.uint32[this._pos4+8]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+18]}get bucketIndex(){return this._structArray.uint16[this._pos2+19]}}Ba.prototype.size=40;class Ea extends ma{get(t){return new Ba(this,t)}}Oi(Ea,\"CollisionBoxArray\");class Ca extends ea{get projectedAnchorX(){return this._structArray.int16[this._pos2+0]}get projectedAnchorY(){return this._structArray.int16[this._pos2+1]}get projectedAnchorZ(){return this._structArray.int16[this._pos2+2]}get tileAnchorX(){return this._structArray.float32[this._pos4+2]}get tileAnchorY(){return this._structArray.float32[this._pos4+3]}get glyphStartIndex(){return this._structArray.uint16[this._pos2+8]}get numGlyphs(){return this._structArray.uint16[this._pos2+9]}get vertexStartIndex(){return this._structArray.uint32[this._pos4+5]}get lineStartIndex(){return this._structArray.uint32[this._pos4+6]}get lineLength(){return this._structArray.uint32[this._pos4+7]}get segment(){return this._structArray.uint16[this._pos2+16]}get lowerSize(){return this._structArray.uint16[this._pos2+17]}get upperSize(){return this._structArray.uint16[this._pos2+18]}get lineOffsetX(){return this._structArray.float32[this._pos4+10]}get lineOffsetY(){return this._structArray.float32[this._pos4+11]}get writingMode(){return this._structArray.uint8[this._pos1+48]}get placedOrientation(){return this._structArray.uint8[this._pos1+49]}set placedOrientation(t){this._structArray.uint8[this._pos1+49]=t;}get hidden(){return this._structArray.uint8[this._pos1+50]}set hidden(t){this._structArray.uint8[this._pos1+50]=t;}get crossTileID(){return this._structArray.uint32[this._pos4+13]}set crossTileID(t){this._structArray.uint32[this._pos4+13]=t;}get associatedIconIndex(){return this._structArray.int16[this._pos2+28]}get flipState(){return this._structArray.uint8[this._pos1+58]}set flipState(t){this._structArray.uint8[this._pos1+58]=t;}}Ca.prototype.size=60;class Pa extends _a{get(t){return new Ca(this,t)}}Oi(Pa,\"PlacedSymbolArray\");class Da extends ea{get projectedAnchorX(){return this._structArray.int16[this._pos2+0]}get projectedAnchorY(){return this._structArray.int16[this._pos2+1]}get projectedAnchorZ(){return this._structArray.int16[this._pos2+2]}get tileAnchorX(){return this._structArray.float32[this._pos4+2]}get tileAnchorY(){return this._structArray.float32[this._pos4+3]}get rightJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+8]}get centerJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+9]}get leftJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+10]}get verticalPlacedTextSymbolIndex(){return this._structArray.int16[this._pos2+11]}get placedIconSymbolIndex(){return this._structArray.int16[this._pos2+12]}get verticalPlacedIconSymbolIndex(){return this._structArray.int16[this._pos2+13]}get key(){return this._structArray.uint16[this._pos2+14]}get textBoxStartIndex(){return this._structArray.uint16[this._pos2+15]}get textBoxEndIndex(){return this._structArray.uint16[this._pos2+16]}get verticalTextBoxStartIndex(){return this._structArray.uint16[this._pos2+17]}get verticalTextBoxEndIndex(){return this._structArray.uint16[this._pos2+18]}get iconBoxStartIndex(){return this._structArray.uint16[this._pos2+19]}get iconBoxEndIndex(){return this._structArray.uint16[this._pos2+20]}get verticalIconBoxStartIndex(){return this._structArray.uint16[this._pos2+21]}get verticalIconBoxEndIndex(){return this._structArray.uint16[this._pos2+22]}get featureIndex(){return this._structArray.uint16[this._pos2+23]}get numHorizontalGlyphVertices(){return this._structArray.uint16[this._pos2+24]}get numVerticalGlyphVertices(){return this._structArray.uint16[this._pos2+25]}get numIconVertices(){return this._structArray.uint16[this._pos2+26]}get numVerticalIconVertices(){return this._structArray.uint16[this._pos2+27]}get useRuntimeCollisionCircles(){return this._structArray.uint16[this._pos2+28]}get crossTileID(){return this._structArray.uint32[this._pos4+15]}set crossTileID(t){this._structArray.uint32[this._pos4+15]=t;}get textOffset0(){return this._structArray.float32[this._pos4+16]}get textOffset1(){return this._structArray.float32[this._pos4+17]}get collisionCircleDiameter(){return this._structArray.float32[this._pos4+18]}}Da.prototype.size=76;class Va extends Aa{get(t){return new Da(this,t)}}Oi(Va,\"SymbolInstanceArray\");class La extends Sa{getoffsetX(t){return this.float32[1*t+0]}}Oi(La,\"GlyphOffsetArray\");class Fa extends sa{getx(t){return this.int16[2*t+0]}gety(t){return this.int16[2*t+1]}}Oi(Fa,\"SymbolLineVertexArray\");class Ra extends ea{get featureIndex(){return this._structArray.uint32[this._pos4+0]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+2]}get bucketIndex(){return this._structArray.uint16[this._pos2+3]}get layoutVertexArrayOffset(){return this._structArray.uint16[this._pos2+4]}}Ra.prototype.size=12;class ja extends Ia{get(t){return new Ra(this,t)}}Oi(ja,\"FeatureIndexArray\");class Ua extends Ma{geta_centroid_pos0(t){return this.uint16[2*t+0]}geta_centroid_pos1(t){return this.uint16[2*t+1]}}Oi(Ua,\"FillExtrusionCentroidArray\");const $a=na([{name:\"a_pattern\",components:4,type:\"Uint16\"},{name:\"a_pixel_ratio\",components:1,type:\"Float32\"}]),Oa=na([{name:\"a_dash\",components:4,type:\"Uint16\"}]);var qa={},Na={get exports(){return qa},set exports(t){qa=t;}},Ga={};({get exports(){return Ga},set exports(t){Ga=t;}}).exports=function(t,e){var r,n,i,s,a,o,l,u;for(n=t.length-(r=3&t.length),i=e,a=3432918353,o=461845907,u=0;u<n;)l=255&t.charCodeAt(u)|(255&t.charCodeAt(++u))<<8|(255&t.charCodeAt(++u))<<16|(255&t.charCodeAt(++u))<<24,++u,i=27492+(65535&(s=5*(65535&(i=(i^=l=(65535&(l=(l=(65535&l)*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(s>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(u+2))<<16;case 2:l^=(255&t.charCodeAt(u+1))<<8;case 1:i^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(u)))*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*o+(((l>>>16)*o&65535)<<16)&4294967295;}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0};var Xa={};({get exports(){return Xa},set exports(t){Xa=t;}}).exports=function(t,e){for(var r,n=t.length,i=e^n,s=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(s)|(255&t.charCodeAt(++s))<<8|(255&t.charCodeAt(++s))<<16|(255&t.charCodeAt(++s))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++s;switch(n){case 3:i^=(255&t.charCodeAt(s+2))<<16;case 2:i^=(255&t.charCodeAt(s+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(s)))+((1540483477*(i>>>16)&65535)<<16);}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0};var Za=Ga,Ka=Xa;Na.exports=Za,qa.murmur3=Za,qa.murmur2=Ka;class Ya{constructor(){this.ids=[],this.positions=[],this.indexed=!1;}add(t,e,r,n){this.ids.push(Ha(t)),this.positions.push(e,r,n);}getPositions(t){const e=Ha(t);let r=0,n=this.ids.length-1;for(;r<n;){const t=r+n>>1;this.ids[t]>=e?n=t:r=t+1;}const i=[];for(;this.ids[r]===e;)i.push({index:this.positions[3*r],start:this.positions[3*r+1],end:this.positions[3*r+2]}),r++;return i}static serialize(t,e){const r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return Wa(r,n,0,r.length-1),e&&e.push(r.buffer,n.buffer),{ids:r,positions:n}}static deserialize(t){const e=new Ya;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e}}function Ha(t){const e=+t;return !isNaN(e)&&Number.MIN_SAFE_INTEGER<=e&&e<=Number.MAX_SAFE_INTEGER?e:qa(String(t))}function Wa(t,e,r,n){for(;r<n;){const i=t[r+n>>1];let s=r-1,a=n+1;for(;;){do{s++;}while(t[s]<i);do{a--;}while(t[a]>i);if(s>=a)break;Ja(t,s,a),Ja(e,3*s,3*a),Ja(e,3*s+1,3*a+1),Ja(e,3*s+2,3*a+2);}a-r<n-a?(Wa(t,e,r,a),r=a+1):(Wa(t,e,a+1,n),n=a);}}function Ja(t,e,r){const n=t[e];t[e]=t[r],t[r]=n;}Oi(Ya,\"FeaturePositionMap\");class Qa{constructor(t){this.gl=t.gl,this.initialized=!1;}fetchUniformLocation(t,e){return this.location||this.initialized||(this.location=this.gl.getUniformLocation(t,e),this.initialized=!0),!!this.location}}class to extends Qa{constructor(t){super(t),this.current=0;}set(t,e,r){this.fetchUniformLocation(t,e)&&this.current!==r&&(this.current=r,this.gl.uniform1f(this.location,r));}}class eo extends Qa{constructor(t){super(t),this.current=[0,0,0,0];}set(t,e,r){this.fetchUniformLocation(t,e)&&(r[0]===this.current[0]&&r[1]===this.current[1]&&r[2]===this.current[2]&&r[3]===this.current[3]||(this.current=r,this.gl.uniform4f(this.location,r[0],r[1],r[2],r[3])));}}class ro extends Qa{constructor(t){super(t),this.current=Me.transparent;}set(t,e,r){this.fetchUniformLocation(t,e)&&(r.r===this.current.r&&r.g===this.current.g&&r.b===this.current.b&&r.a===this.current.a||(this.current=r,this.gl.uniform4f(this.location,r.r,r.g,r.b,r.a)));}}const no=new Float32Array(16),io=new Float32Array(9),so=new Float32Array(4);function ao(t){return [Qs(255*t.r,255*t.g),Qs(255*t.b,255*t.a)]}class oo{constructor(t,e,r){this.value=t,this.uniformNames=e.map((t=>`u_${t}`)),this.type=r;}setUniform(t,e,r,n,i){e.set(t,i,n.constantOr(this.value));}getBinding(t,e){return \"color\"===this.type?new ro(t):new to(t)}}class lo{constructor(t,e){this.uniformNames=e.map((t=>`u_${t}`)),this.pattern=null,this.pixelRatio=1;}setConstantPatternPositions(t){this.pixelRatio=t.pixelRatio||1,this.pattern=t.tl.concat(t.br);}setUniform(t,e,r,n,i){const s=\"u_pattern\"===i||\"u_dash\"===i?this.pattern:\"u_pixel_ratio\"===i?this.pixelRatio:null;s&&e.set(t,i,s);}getBinding(t,e){return \"u_pattern\"===e||\"u_dash\"===e?new eo(t):new to(t)}}class uo{constructor(t,e,r,n){this.expression=t,this.type=r,this.maxValue=0,this.paintVertexAttributes=e.map((t=>({name:`a_${t}`,type:\"Float32\",components:\"color\"===r?2:1,offset:0}))),this.paintVertexArray=new n;}populatePaintArray(t,e,r,n,i,s){const a=this.paintVertexArray.length,o=this.expression.evaluate(new Us(0),e,{},i,n,s);this.paintVertexArray.resize(t),this._setPaintValue(a,t,o);}updatePaintArray(t,e,r,n,i){const s=this.expression.evaluate({zoom:0},r,n,void 0,i);this._setPaintValue(t,e,s);}_setPaintValue(t,e,r){if(\"color\"===this.type){const n=ao(r);for(let r=t;r<e;r++)this.paintVertexArray.emplace(r,n[0],n[1]);}else {for(let n=t;n<e;n++)this.paintVertexArray.emplace(n,r);this.maxValue=Math.max(this.maxValue,Math.abs(r));}}upload(t){this.paintVertexArray&&this.paintVertexArray.arrayBuffer&&(this.paintVertexBuffer&&this.paintVertexBuffer.buffer?this.paintVertexBuffer.updateData(this.paintVertexArray):this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes,this.expression.isStateDependent));}destroy(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy();}}class co{constructor(t,e,r,n,i,s){this.expression=t,this.uniformNames=e.map((t=>`u_${t}_t`)),this.type=r,this.useIntegerZoom=n,this.zoom=i,this.maxValue=0,this.paintVertexAttributes=e.map((t=>({name:`a_${t}`,type:\"Float32\",components:\"color\"===r?4:2,offset:0}))),this.paintVertexArray=new s;}populatePaintArray(t,e,r,n,i,s){const a=this.expression.evaluate(new Us(this.zoom),e,{},i,n,s),o=this.expression.evaluate(new Us(this.zoom+1),e,{},i,n,s),l=this.paintVertexArray.length;this.paintVertexArray.resize(t),this._setPaintValue(l,t,a,o);}updatePaintArray(t,e,r,n,i){const s=this.expression.evaluate({zoom:this.zoom},r,n,void 0,i),a=this.expression.evaluate({zoom:this.zoom+1},r,n,void 0,i);this._setPaintValue(t,e,s,a);}_setPaintValue(t,e,r,n){if(\"color\"===this.type){const i=ao(r),s=ao(n);for(let r=t;r<e;r++)this.paintVertexArray.emplace(r,i[0],i[1],s[0],s[1]);}else {for(let i=t;i<e;i++)this.paintVertexArray.emplace(i,r,n);this.maxValue=Math.max(this.maxValue,Math.abs(r),Math.abs(n));}}upload(t){this.paintVertexArray&&this.paintVertexArray.arrayBuffer&&(this.paintVertexBuffer&&this.paintVertexBuffer.buffer?this.paintVertexBuffer.updateData(this.paintVertexArray):this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes,this.expression.isStateDependent));}destroy(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy();}setUniform(t,e,r,n,i){const s=this.useIntegerZoom?Math.floor(r.zoom):r.zoom,a=S(this.expression.interpolationFactor(s,this.zoom,this.zoom+1),0,1);e.set(t,i,a);}getBinding(t,e){return new to(t)}}class ho{constructor(t,e,r,n,i){this.expression=t,this.layerId=i,this.paintVertexAttributes=(\"array\"===r?Oa:$a).members;for(let t=0;t<e.length;++t);this.paintVertexArray=new n;}populatePaintArray(t,e,r){const n=this.paintVertexArray.length;this.paintVertexArray.resize(t),this._setPaintValues(n,t,e.patterns&&e.patterns[this.layerId],r);}updatePaintArray(t,e,r,n,i,s){this._setPaintValues(t,e,r.patterns&&r.patterns[this.layerId],s);}_setPaintValues(t,e,r,n){if(!n||!r)return;const i=n[r];if(!i)return;const{tl:s,br:a,pixelRatio:o}=i;for(let r=t;r<e;r++)this.paintVertexArray.emplace(r,s[0],s[1],a[0],a[1],o);}upload(t){this.paintVertexArray&&this.paintVertexArray.arrayBuffer&&(this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes,this.expression.isStateDependent));}destroy(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy();}}class po{constructor(t,e,r=(()=>!0)){this.binders={},this._buffers=[];const n=[];for(const i in t.paint._values){if(!r(i))continue;const s=t.paint.get(i);if(!(s instanceof Zs&&En(s.property.specification)))continue;const a=mo(i,t.type),o=s.value,l=s.property.specification.type,u=s.property.useIntegerZoom,c=\"line-dasharray\"===i||i.endsWith(\"pattern\"),h=\"line-dasharray\"===i&&\"constant\"!==t.layout.get(\"line-cap\").value.kind;if(\"constant\"!==o.kind||h)if(\"source\"===o.kind||h||c){const e=vo(i,l,\"source\");this.binders[i]=c?new ho(o,a,l,e,t.id):new uo(o,a,l,e),n.push(`/a_${i}`);}else {const t=vo(i,l,\"composite\");this.binders[i]=new co(o,a,l,u,e,t),n.push(`/z_${i}`);}else this.binders[i]=c?new lo(o.value,a):new oo(o.value,a,l),n.push(`/u_${i}`);}this.cacheKey=n.sort().join(\"\");}getMaxValue(t){const e=this.binders[t];return e instanceof uo||e instanceof co?e.maxValue:0}populatePaintArrays(t,e,r,n,i,s){for(const a in this.binders){const o=this.binders[a];(o instanceof uo||o instanceof co||o instanceof ho)&&o.populatePaintArray(t,e,r,n,i,s);}}setConstantPatternPositions(t){for(const e in this.binders){const r=this.binders[e];r instanceof lo&&r.setConstantPatternPositions(t);}}updatePaintArrays(t,e,r,n,i,s){let a=!1;for(const o in t){const l=e.getPositions(o);for(const e of l){const l=r.feature(e.index);for(const r in this.binders){const u=this.binders[r];if((u instanceof uo||u instanceof co||u instanceof ho)&&!0===u.expression.isStateDependent){const c=n.paint.get(r);u.expression=c.value,u.updatePaintArray(e.start,e.end,l,t[o],i,s),a=!0;}}}}return a}defines(){const t=[];for(const e in this.binders){const r=this.binders[e];(r instanceof oo||r instanceof lo)&&t.push(...r.uniformNames.map((t=>`#define HAS_UNIFORM_${t}`)));}return t}getBinderAttributes(){const t=[];for(const e in this.binders){const r=this.binders[e];if(r instanceof uo||r instanceof co||r instanceof ho)for(let e=0;e<r.paintVertexAttributes.length;e++)t.push(r.paintVertexAttributes[e].name);}return t}getBinderUniforms(){const t=[];for(const e in this.binders){const r=this.binders[e];if(r instanceof oo||r instanceof lo||r instanceof co)for(const e of r.uniformNames)t.push(e);}return t}getPaintVertexBuffers(){return this._buffers}getUniforms(t){const e=[];for(const r in this.binders){const n=this.binders[r];if(n instanceof oo||n instanceof lo||n instanceof co)for(const i of n.uniformNames)e.push({name:i,property:r,binding:n.getBinding(t,i)});}return e}setUniforms(t,e,r,n,i){for(const{name:e,property:s,binding:a}of r)this.binders[s].setUniform(t,a,i,n.get(s),e);}updatePaintBuffers(){this._buffers=[];for(const t in this.binders){const e=this.binders[t];(e instanceof uo||e instanceof co||e instanceof ho)&&e.paintVertexBuffer&&this._buffers.push(e.paintVertexBuffer);}}upload(t){for(const e in this.binders){const r=this.binders[e];(r instanceof uo||r instanceof co||r instanceof ho)&&r.upload(t);}this.updatePaintBuffers();}destroy(){for(const t in this.binders){const e=this.binders[t];(e instanceof uo||e instanceof co||e instanceof ho)&&e.destroy();}}}class fo{constructor(t,e,r=(()=>!0)){this.programConfigurations={};for(const n of t)this.programConfigurations[n.id]=new po(n,e,r);this.needsUpload=!1,this._featureMap=new Ya,this._bufferOffset=0;}populatePaintArrays(t,e,r,n,i,s,a){for(const r in this.programConfigurations)this.programConfigurations[r].populatePaintArrays(t,e,n,i,s,a);void 0!==e.id&&this._featureMap.add(e.id,r,this._bufferOffset,t),this._bufferOffset=t,this.needsUpload=!0;}updatePaintArrays(t,e,r,n,i){for(const s of r)this.needsUpload=this.programConfigurations[s.id].updatePaintArrays(t,this._featureMap,e,s,n,i)||this.needsUpload;}get(t){return this.programConfigurations[t]}upload(t){if(this.needsUpload){for(const e in this.programConfigurations)this.programConfigurations[e].upload(t);this.needsUpload=!1;}}destroy(){for(const t in this.programConfigurations)this.programConfigurations[t].destroy();}}const yo={\"text-opacity\":[\"opacity\"],\"icon-opacity\":[\"opacity\"],\"text-color\":[\"fill_color\"],\"icon-color\":[\"fill_color\"],\"text-halo-color\":[\"halo_color\"],\"icon-halo-color\":[\"halo_color\"],\"text-halo-blur\":[\"halo_blur\"],\"icon-halo-blur\":[\"halo_blur\"],\"text-halo-width\":[\"halo_width\"],\"icon-halo-width\":[\"halo_width\"],\"line-gap-width\":[\"gapwidth\"],\"line-pattern\":[\"pattern\",\"pixel_ratio\"],\"fill-pattern\":[\"pattern\",\"pixel_ratio\"],\"fill-extrusion-pattern\":[\"pattern\",\"pixel_ratio\"],\"line-dasharray\":[\"dash\"]};function mo(t,e){return yo[t]||[t.replace(`${e}-`,\"\").replace(/-/g,\"_\")]}const go={\"line-pattern\":{source:ca,composite:ca},\"fill-pattern\":{source:ca,composite:ca},\"fill-extrusion-pattern\":{source:ca,composite:ca},\"line-dasharray\":{source:ha,composite:ha}},xo={color:{source:za,composite:ua},number:{source:Sa,composite:za}};function vo(t,e,r){const n=go[t];return n&&n[r]||xo[e][r]}Oi(oo,\"ConstantBinder\"),Oi(lo,\"PatternConstantBinder\"),Oi(uo,\"SourceExpressionBinder\"),Oi(ho,\"PatternCompositeBinder\"),Oi(co,\"CompositeExpressionBinder\"),Oi(po,\"ProgramConfiguration\",{omit:[\"_buffers\"]}),Oi(fo,\"ProgramConfigurationSet\");const bo=\"-transition\";class wo extends Yt{constructor(t,e){if(super(),this.id=t.id,this.type=t.type,this._featureFilter={filter:()=>!0,needGeometry:!1,needFeature:!1},this._filterCompiled=!1,\"custom\"!==t.type&&(this.metadata=t.metadata,this.minzoom=t.minzoom,this.maxzoom=t.maxzoom,\"background\"!==t.type&&\"sky\"!==t.type&&(this.source=t.source,this.sourceLayer=t[\"source-layer\"],this.filter=t.filter),e.layout&&(this._unevaluatedLayout=new Xs(e.layout)),e.paint)){this._transitionablePaint=new qs(e.paint);for(const e in t.paint)this.setPaintProperty(e,t.paint[e],{validate:!1});for(const e in t.layout)this.setLayoutProperty(e,t.layout[e],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Ks(e.paint);}}getLayoutProperty(t){return \"visibility\"===t?this.visibility:this._unevaluatedLayout.getValue(t)}setLayoutProperty(t,e,r={}){null!=e&&this._validate(Li,`layers.${this.id}.layout.${t}`,t,e,r)||(\"visibility\"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e);}getPaintProperty(t){return L(t,bo)?this._transitionablePaint.getTransition(t.slice(0,-bo.length)):this._transitionablePaint.getValue(t)}setPaintProperty(t,e,r={}){if(null!=e&&this._validate(Vi,`layers.${this.id}.paint.${t}`,t,e,r))return !1;if(L(t,bo))return this._transitionablePaint.setTransition(t.slice(0,-bo.length),e||void 0),!1;{const r=this._transitionablePaint._values[t],n=r.value.isDataDriven(),i=r.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);const s=this._transitionablePaint._values[t].value,a=s.isDataDriven(),o=L(t,\"pattern\")||\"line-dasharray\"===t;return a||n||o||this._handleOverridablePaintPropertyUpdate(t,i,s)}}_handleSpecialPaintPropertyUpdate(t){}getProgramIds(){return null}getProgramConfiguration(t){return null}_handleOverridablePaintPropertyUpdate(t,e,r){return !1}isHidden(t){return !!(this.minzoom&&t<this.minzoom)||!!(this.maxzoom&&t>=this.maxzoom)||\"none\"===this.visibility}updateTransitions(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint);}hasTransition(){return this._transitioningPaint.hasTransition()}recalculate(t,e){this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e);}serialize(){const t={id:this.id,type:this.type,source:this.source,\"source-layer\":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),R(t,((t,e)=>!(void 0===t||\"layout\"===e&&!Object.keys(t).length||\"paint\"===e&&!Object.keys(t).length)))}_validate(t,e,r,n,i={}){return (!i||!1!==i.validate)&&Ri(this,t.call(Di,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:Ht,style:{glyphs:!0,sprite:!0}}))}is3D(){return !1}isSky(){return !1}isTileClipped(){return !1}hasOffscreenPass(){return !1}resize(){}isStateDependent(){for(const t in this.paint._values){const e=this.paint.get(t);if(e instanceof Zs&&En(e.property.specification)&&(\"source\"===e.value.kind||\"composite\"===e.value.kind)&&e.value.isStateDependent)return !0}return !1}compileFilter(){this._filterCompiled||(this._featureFilter=ai(this.filter),this._filterCompiled=!0);}invalidateCompiledFilter(){this._filterCompiled=!1;}dynamicFilter(){return this._featureFilter.dynamicFilter}dynamicFilterNeedsFeature(){return this._featureFilter.needFeature}}const _o=na([{name:\"a_pos\",components:2,type:\"Int16\"}],4),Ao=na([{name:\"a_pos_3\",components:3,type:\"Int16\"},{name:\"a_pos_normal_3\",components:3,type:\"Int16\"}]);class So{constructor(t=[]){this.segments=t;}prepareSegment(t,e,r,n){let i=this.segments[this.segments.length-1];return t>So.MAX_VERTEX_ARRAY_LENGTH&&$(`Max vertices per segment is ${So.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${t}`),(!i||i.vertexLength+t>So.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i}get(){return this.segments}destroy(){for(const t of this.segments)for(const e in t.vaos)t.vaos[e].destroy();}static simpleSegment(t,e,r,n){return new So([{vertexOffset:t,primitiveOffset:e,vertexLength:r,primitiveLength:n,vaos:{},sortKey:0}])}}So.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,Oi(So,\"SegmentVector\");var ko=8192;class Io{constructor(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]));}setNorthEast(t){return this._ne=t instanceof ru?new ru(t.lng,t.lat):ru.convert(t),this}setSouthWest(t){return this._sw=t instanceof ru?new ru(t.lng,t.lat):ru.convert(t),this}extend(t){const e=this._sw,r=this._ne;let n,i;if(t instanceof ru)n=t,i=t;else {if(!(t instanceof Io))return Array.isArray(t)?4===t.length||t.every(Array.isArray)?this.extend(Io.convert(t)):this.extend(ru.convert(t)):\"object\"==typeof t&&null!==t&&t.hasOwnProperty(\"lat\")&&t.hasOwnProperty(\"lon\")?this.extend(ru.convert(t)):this;if(n=t._sw,i=t._ne,!n||!i)return this}return e||r?(e.lng=Math.min(n.lng,e.lng),e.lat=Math.min(n.lat,e.lat),r.lng=Math.max(i.lng,r.lng),r.lat=Math.max(i.lat,r.lat)):(this._sw=new ru(n.lng,n.lat),this._ne=new ru(i.lng,i.lat)),this}getCenter(){return new ru((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)}getSouthWest(){return this._sw}getNorthEast(){return this._ne}getNorthWest(){return new ru(this.getWest(),this.getNorth())}getSouthEast(){return new ru(this.getEast(),this.getSouth())}getWest(){return this._sw.lng}getSouth(){return this._sw.lat}getEast(){return this._ne.lng}getNorth(){return this._ne.lat}toArray(){return [this._sw.toArray(),this._ne.toArray()]}toString(){return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`}isEmpty(){return !(this._sw&&this._ne)}contains(t){const{lng:e,lat:r}=ru.convert(t);let n=this._sw.lng<=e&&e<=this._ne.lng;return this._sw.lng>this._ne.lng&&(n=this._sw.lng>=e&&e>=this._ne.lng),this._sw.lat<=r&&r<=this._ne.lat&&n}static convert(t){return !t||t instanceof Io?t:new Io(t)}}var Mo=1e-6,To=\"undefined\"!=typeof Float32Array?Float32Array:Array;function zo(){var t=new To(9);return To!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}function Bo(t,e,r){var n=e[0],i=e[1],s=e[2],a=e[3],o=e[4],l=e[5],u=e[6],c=e[7],h=e[8],p=r[0],f=r[1],d=r[2],y=r[3],m=r[4],g=r[5],x=r[6],v=r[7],b=r[8];return t[0]=p*n+f*a+d*u,t[1]=p*i+f*o+d*c,t[2]=p*s+f*l+d*h,t[3]=y*n+m*a+g*u,t[4]=y*i+m*o+g*c,t[5]=y*s+m*l+g*h,t[6]=x*n+v*a+b*u,t[7]=x*i+v*o+b*c,t[8]=x*s+v*l+b*h,t}function Eo(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function Co(t,e){var r=e[0],n=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],h=e[9],p=e[10],f=e[11],d=e[12],y=e[13],m=e[14],g=e[15],x=r*o-n*a,v=r*l-i*a,b=r*u-s*a,w=n*l-i*o,_=n*u-s*o,A=i*u-s*l,S=c*y-h*d,k=c*m-p*d,I=c*g-f*d,M=h*m-p*y,T=h*g-f*y,z=p*g-f*m,B=x*z-v*T+b*M+w*I-_*k+A*S;return B?(t[0]=(o*z-l*T+u*M)*(B=1/B),t[1]=(i*T-n*z-s*M)*B,t[2]=(y*A-m*_+g*w)*B,t[3]=(p*_-h*A-f*w)*B,t[4]=(l*I-a*z-u*k)*B,t[5]=(r*z-i*I+s*k)*B,t[6]=(m*b-d*A-g*v)*B,t[7]=(c*A-p*b+f*v)*B,t[8]=(a*T-o*I+u*S)*B,t[9]=(n*I-r*T-s*S)*B,t[10]=(d*_-y*b+g*x)*B,t[11]=(h*b-c*_-f*x)*B,t[12]=(o*k-a*M-l*S)*B,t[13]=(r*M-n*k+i*S)*B,t[14]=(y*v-d*w-m*x)*B,t[15]=(c*w-h*v+p*x)*B,t):null}function Po(t,e,r){var n=e[0],i=e[1],s=e[2],a=e[3],o=e[4],l=e[5],u=e[6],c=e[7],h=e[8],p=e[9],f=e[10],d=e[11],y=e[12],m=e[13],g=e[14],x=e[15],v=r[0],b=r[1],w=r[2],_=r[3];return t[0]=v*n+b*o+w*h+_*y,t[1]=v*i+b*l+w*p+_*m,t[2]=v*s+b*u+w*f+_*g,t[3]=v*a+b*c+w*d+_*x,t[4]=(v=r[4])*n+(b=r[5])*o+(w=r[6])*h+(_=r[7])*y,t[5]=v*i+b*l+w*p+_*m,t[6]=v*s+b*u+w*f+_*g,t[7]=v*a+b*c+w*d+_*x,t[8]=(v=r[8])*n+(b=r[9])*o+(w=r[10])*h+(_=r[11])*y,t[9]=v*i+b*l+w*p+_*m,t[10]=v*s+b*u+w*f+_*g,t[11]=v*a+b*c+w*d+_*x,t[12]=(v=r[12])*n+(b=r[13])*o+(w=r[14])*h+(_=r[15])*y,t[13]=v*i+b*l+w*p+_*m,t[14]=v*s+b*u+w*f+_*g,t[15]=v*a+b*c+w*d+_*x,t}function Do(t,e,r){var n,i,s,a,o,l,u,c,h,p,f,d,y=r[0],m=r[1],g=r[2];return e===t?(t[12]=e[0]*y+e[4]*m+e[8]*g+e[12],t[13]=e[1]*y+e[5]*m+e[9]*g+e[13],t[14]=e[2]*y+e[6]*m+e[10]*g+e[14],t[15]=e[3]*y+e[7]*m+e[11]*g+e[15]):(i=e[1],s=e[2],a=e[3],o=e[4],l=e[5],u=e[6],c=e[7],h=e[8],p=e[9],f=e[10],d=e[11],t[0]=n=e[0],t[1]=i,t[2]=s,t[3]=a,t[4]=o,t[5]=l,t[6]=u,t[7]=c,t[8]=h,t[9]=p,t[10]=f,t[11]=d,t[12]=n*y+o*m+h*g+e[12],t[13]=i*y+l*m+p*g+e[13],t[14]=s*y+u*m+f*g+e[14],t[15]=a*y+c*m+d*g+e[15]),t}function Vo(t,e,r){var n=r[0],i=r[1],s=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*s,t[9]=e[9]*s,t[10]=e[10]*s,t[11]=e[11]*s,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function Lo(t,e,r){var n=Math.sin(r),i=Math.cos(r),s=e[4],a=e[5],o=e[6],l=e[7],u=e[8],c=e[9],h=e[10],p=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=s*i+u*n,t[5]=a*i+c*n,t[6]=o*i+h*n,t[7]=l*i+p*n,t[8]=u*i-s*n,t[9]=c*i-a*n,t[10]=h*i-o*n,t[11]=p*i-l*n,t}function Fo(t,e,r){var n=Math.sin(r),i=Math.cos(r),s=e[0],a=e[1],o=e[2],l=e[3],u=e[8],c=e[9],h=e[10],p=e[11];return e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=s*i-u*n,t[1]=a*i-c*n,t[2]=o*i-h*n,t[3]=l*i-p*n,t[8]=s*n+u*i,t[9]=a*n+c*i,t[10]=o*n+h*i,t[11]=l*n+p*i,t}function Ro(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function jo(t,e,r){var n,i,s,a=r[0],o=r[1],l=r[2],u=Math.hypot(a,o,l);return u<Mo?null:(a*=u=1/u,o*=u,l*=u,n=Math.sin(e),i=Math.cos(e),t[0]=a*a*(s=1-i)+i,t[1]=o*a*s+l*n,t[2]=l*a*s-o*n,t[3]=0,t[4]=a*o*s-l*n,t[5]=o*o*s+i,t[6]=l*o*s+a*n,t[7]=0,t[8]=a*l*s+o*n,t[9]=o*l*s-a*n,t[10]=l*l*s+i,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});var Uo=Po;function $o(){var t=new To(3);return To!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function Oo(t){var e=new To(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}function qo(t){return Math.hypot(t[0],t[1],t[2])}function No(t,e,r){var n=new To(3);return n[0]=t,n[1]=e,n[2]=r,n}function Go(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t}function Xo(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t}function Zo(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t}function Ko(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t}function Yo(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t}function Ho(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t}function Wo(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t}function Jo(t,e){var r=e[0],n=e[1],i=e[2],s=r*r+n*n+i*i;return s>0&&(s=1/Math.sqrt(s)),t[0]=e[0]*s,t[1]=e[1]*s,t[2]=e[2]*s,t}function Qo(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function tl(t,e,r){var n=e[0],i=e[1],s=e[2],a=r[0],o=r[1],l=r[2];return t[0]=i*l-s*o,t[1]=s*a-n*l,t[2]=n*o-i*a,t}function el(t,e,r){var n=e[0],i=e[1],s=e[2],a=r[3]*n+r[7]*i+r[11]*s+r[15];return t[0]=(r[0]*n+r[4]*i+r[8]*s+r[12])/(a=a||1),t[1]=(r[1]*n+r[5]*i+r[9]*s+r[13])/a,t[2]=(r[2]*n+r[6]*i+r[10]*s+r[14])/a,t}function rl(t,e,r){var n=r[0],i=r[1],s=r[2],a=e[0],o=e[1],l=e[2],u=i*l-s*o,c=s*a-n*l,h=n*o-i*a,p=i*h-s*c,f=s*u-n*h,d=n*c-i*u,y=2*r[3];return c*=y,h*=y,f*=2,d*=2,t[0]=a+(u*=y)+(p*=2),t[1]=o+c+f,t[2]=l+h+d,t}var nl,il=Xo,sl=Zo,al=qo;function ol(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t}function ll(t,e){var r=e[0],n=e[1],i=e[2],s=e[3],a=r*r+n*n+i*i+s*s;return a>0&&(a=1/Math.sqrt(a)),t[0]=r*a,t[1]=n*a,t[2]=i*a,t[3]=s*a,t}function ul(t,e,r){var n=e[0],i=e[1],s=e[2],a=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*s+r[12]*a,t[1]=r[1]*n+r[5]*i+r[9]*s+r[13]*a,t[2]=r[2]*n+r[6]*i+r[10]*s+r[14]*a,t[3]=r[3]*n+r[7]*i+r[11]*s+r[15]*a,t}function cl(){var t=new To(4);return To!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function hl(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t}function pl(t,e,r){r*=.5;var n=e[0],i=e[1],s=e[2],a=e[3],o=Math.sin(r),l=Math.cos(r);return t[0]=n*l+a*o,t[1]=i*l+s*o,t[2]=s*l-i*o,t[3]=a*l-n*o,t}function fl(t,e,r){r*=.5;var n=e[0],i=e[1],s=e[2],a=e[3],o=Math.sin(r),l=Math.cos(r);return t[0]=n*l-s*o,t[1]=i*l+a*o,t[2]=s*l+n*o,t[3]=a*l-i*o,t}$o(),nl=new To(4),To!=Float32Array&&(nl[0]=0,nl[1]=0,nl[2]=0,nl[3]=0);var dl=ll;$o(),No(1,0,0),No(0,1,0),cl(),cl(),zo();const yl=na([{type:\"Float32\",name:\"a_globe_pos\",components:3},{type:\"Float32\",name:\"a_uv\",components:2}]),{members:ml}=yl,gl=na([{name:\"a_pos_3\",components:3,type:\"Int16\"}]);var xl=na([{name:\"a_pos\",type:\"Int16\",components:2}]);class vl{constructor(t,e){this.pos=t,this.dir=e;}intersectsPlane(t,e,r){const n=Qo(e,this.dir);if(Math.abs(n)<1e-6)return !1;const i=((t[0]-this.pos[0])*e[0]+(t[1]-this.pos[1])*e[1]+(t[2]-this.pos[2])*e[2])/n;return r[0]=this.pos[0]+this.dir[0]*i,r[1]=this.pos[1]+this.dir[1]*i,r[2]=this.pos[2]+this.dir[2]*i,!0}closestPointOnSphere(t,e,r){if(function(t,e){var r=t[0],n=t[1],i=t[2],s=e[0],a=e[1],o=e[2];return Math.abs(r-s)<=Mo*Math.max(1,Math.abs(r),Math.abs(s))&&Math.abs(n-a)<=Mo*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-o)<=Mo*Math.max(1,Math.abs(i),Math.abs(o))}(this.pos,t)||0===e)return r[0]=r[1]=r[2]=0,!1;const[n,i,s]=this.dir,a=this.pos[0]-t[0],o=this.pos[1]-t[1],l=this.pos[2]-t[2],u=n*n+i*i+s*s,c=2*(a*n+o*i+l*s),h=c*c-4*u*(a*a+o*o+l*l-e*e);if(h<0){const t=Math.max(-c/2,0),u=a+n*t,h=o+i*t,p=l+s*t,f=Math.hypot(u,h,p);return r[0]=u*e/f,r[1]=h*e/f,r[2]=p*e/f,!1}{const t=(-c-Math.sqrt(h))/(2*u);if(t<0){const t=Math.hypot(a,o,l);return r[0]=a*e/t,r[1]=o*e/t,r[2]=l*e/t,!1}return r[0]=a+n*t,r[1]=o+i*t,r[2]=l+s*t,!0}}}class bl{constructor(t,e,r,n,i){this.TL=t,this.TR=e,this.BR=r,this.BL=n,this.horizon=i;}static fromInvProjectionMatrix(t,e,r){const n=[-1,1,1],i=[1,1,1],s=[1,-1,1],a=[-1,-1,1],o=el(n,n,t),l=el(i,i,t),u=el(s,s,t),c=el(a,a,t);return new bl(o,l,u,c,e/r)}}class wl{constructor(t,e){this.points=t,this.planes=e;}static fromInvProjectionMatrix(t,e,r,n){const i=Math.pow(2,r),s=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map((r=>{const s=ul([],r,t),a=1/s[3]/e*i;return function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}(s,s,[a,a,n?1/s[3]:a,a])})),a=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map((t=>{const e=Jo([],tl([],il([],s[t[0]],s[t[1]]),il([],s[t[2]],s[t[1]]))),r=-Qo(e,s[t[1]]);return e.concat(r)}));return new wl(s,a)}}class _l{static fromPoints(t){const e=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0];for(const n of t)Ko(e,e,n),Yo(r,r,n);return new _l(e,r)}static applyTransform(t,e){const r=t.getCorners();for(let t=0;t<r.length;++t)el(r[t],r[t],e);return _l.fromPoints(r)}constructor(t,e){this.min=t,this.max=e,this.center=Ho([],Go([],this.min,this.max),.5);}quadrant(t){const e=[t%2==0,t<2],r=Oo(this.min),n=Oo(this.max);for(let t=0;t<e.length;t++)r[t]=e[t]?this.min[t]:this.center[t],n[t]=e[t]?this.center[t]:this.max[t];return n[2]=this.max[2],new _l(r,n)}distanceX(t){return Math.max(Math.min(this.max[0],t[0]),this.min[0])-t[0]}distanceY(t){return Math.max(Math.min(this.max[1],t[1]),this.min[1])-t[1]}distanceZ(t){return Math.max(Math.min(this.max[2],t[2]),this.min[2])-t[2]}getCorners(){const t=this.min,e=this.max;return [[t[0],t[1],t[2]],[e[0],t[1],t[2]],[e[0],e[1],t[2]],[t[0],e[1],t[2]],[t[0],t[1],e[2]],[e[0],t[1],e[2]],[e[0],e[1],e[2]],[t[0],e[1],e[2]]]}intersects(t){const e=this.getCorners();let r=!0;for(let n=0;n<t.planes.length;n++){const i=t.planes[n];let s=0;for(let t=0;t<e.length;t++)s+=Qo(i,e[t])+i[3]>=0;if(0===s)return 0;s!==e.length&&(r=!1);}if(r)return 2;for(let e=0;e<3;e++){let r=Number.MAX_VALUE,n=-Number.MAX_VALUE;for(let i=0;i<t.points.length;i++){const s=t.points[i][e]-this.min[e];r=Math.min(r,s),n=Math.max(n,s);}if(n<0||r>this.max[e]-this.min[e])return 0}return 1}}const Al=ko/Math.PI/2,Sl=64,kl=[Sl,32,16],Il=-Al,Ml=Al,Tl=[new _l([Il,Il,Il],[Ml,Ml,Ml]),new _l([Il,Il,Il],[0,0,Ml]),new _l([0,Il,Il],[Ml,0,Ml]),new _l([Il,0,Il],[0,Ml,Ml]),new _l([0,0,Il],[Ml,Ml,Ml])];function zl(t){return t*Al/tu}function Bl(t,e,r,n=!0){const i=Ho([],t._camera.position,t.worldSize),s=[e,r,1,1];ul(s,s,t.pixelMatrixInverse),ol(s,s,1/s[3]);const a=Jo([],il([],s,i)),o=t.globeMatrix,l=[o[12],o[13],o[14]],u=il([],l,i),c=qo(u),h=Jo([],u),p=t.worldSize/(2*Math.PI),f=Qo(h,a),d=Math.asin(p/c);if(d<Math.acos(f)){if(!n)return null;const t=[],e=[];Ho(t,a,c/f),Jo(e,il(e,t,u)),Jo(a,Go(a,u,Ho(a,e,Math.tan(d)*c)));}const y=[];new vl(i,a).closestPointOnSphere(l,p,y);const m=Jo([],Y(o,0)),g=Jo([],Y(o,1)),x=Jo([],Y(o,2)),b=Qo(m,y),w=Qo(g,y),_=Qo(x,y),A=v(Math.asin(-w/p));let k=v(Math.atan2(b,_));k=t.center.lng+function(t,e){const r=(e-t+180)%360-180;return r<-180?r+360:r}(t.center.lng,k);const I=iu(k),M=S(su(A),0,1);return new pu(I,M)}class El{constructor(t,e,r){this.a=il([],t,r),this.b=il([],e,r),this.center=r;const n=Jo([],this.a),i=Jo([],this.b);this.angle=Math.acos(Qo(n,i));}}function Cl(t,e){if(0===t.angle)return null;let r;return r=0===t.a[e]?1/t.angle*.5*Math.PI:1/t.angle*Math.atan(t.b[e]/t.a[e]/Math.sin(t.angle)-1/Math.tan(t.angle)),r<0||r>1?null:function(t,e,r,n){const i=Math.sin(r);return t*(Math.sin((1-n)*r)/i)+e*(Math.sin(n*r)/i)}(t.a[e],t.b[e],t.angle,S(r,0,1))+t.center[e]}function Pl(t){if(t.z<=1)return Tl[t.z+2*t.y+t.x];const e=jl(Rl(t));return _l.fromPoints(e)}function Dl(t,e,r){return Ho(t,t,1-r),Wo(t,t,e,r)}function Vl(t,e){const r=Kl(e.zoom);if(0===r)return Pl(t);const n=Rl(t),i=jl(n),s=iu(n.getWest())*e.worldSize,a=iu(n.getEast())*e.worldSize,o=su(n.getNorth())*e.worldSize,l=su(n.getSouth())*e.worldSize,u=[s,o,0],c=[a,o,0],h=[s,l,0],p=[a,l,0],f=Co([],e.globeMatrix);return el(u,u,f),el(c,c,f),el(h,h,f),el(p,p,f),i[0]=Dl(i[0],h,r),i[1]=Dl(i[1],p,r),i[2]=Dl(i[2],c,r),i[3]=Dl(i[3],u,r),_l.fromPoints(i)}function Ll(t,e,r){for(const n of t)el(n,n,e),Ho(n,n,r);}function Fl(t,e,r){const n=e/t.worldSize,i=t.globeMatrix;if(r.z<=1){const t=Pl(r).getCorners();return Ll(t,i,n),_l.fromPoints(t)}const s=Rl(r),a=jl(s);Ll(a,i,n);const o=Number.MAX_VALUE,l=[-o,-o,-o],u=[o,o,o];if(s.contains(t.center)){for(const t of a)Ko(u,u,t),Yo(l,l,t);l[2]=0;const e=t.point,r=[e.x*n,e.y*n,0];return Ko(u,u,r),Yo(l,l,r),new _l(u,l)}const c=[i[12]*n,i[13]*n,i[14]*n],h=s.getCenter(),p=S(t.center.lat,-cu,cu),f=S(h.lat,-cu,cu),d=iu(t.center.lng),y=su(p);let m=d-iu(h.lng);const g=y-su(f);m>.5?m-=1:m<-.5&&(m+=1);let v=0;Math.abs(m)>Math.abs(g)?v=m>=0?1:3:(v=g>=0?0:2,Wo(c,c,[i[4]*n,i[5]*n,i[6]*n],-Math.sin(x(g>=0?s.getSouth():s.getNorth()))*Al));const b=a[v],w=a[(v+1)%4],_=new El(b,w,c),A=[Cl(_,0)||b[0],Cl(_,1)||b[1],Cl(_,2)||b[2]],k=Kl(t.zoom);if(k>0){const n=function({x:t,y:e,z:r},n,i,s,a){const o=1/(1<<r);let l=t*o,u=l+o,c=e*o,h=c+o,p=0;const f=(l+u)/2-s;return f>.5?p=-1:f<-.5&&(p=1),l=((l+p)*n-(s*=n))*i+s,u=((u+p)*n-s)*i+s,c=(c*n-(a*=n))*i+a,h=(h*n-a)*i+a,[[l,h,0],[u,h,0],[u,c,0],[l,c,0]]}(r,e,t._pixelsPerMercatorPixel,d,y);for(let t=0;t<a.length;t++)Dl(a[t],n[t],k);const i=Go([],n[v],n[(v+1)%4]);Ho(i,i,.5),Dl(A,i,k);}for(const t of a)Ko(u,u,t),Yo(l,l,t);return u[2]=Math.min(b[2],w[2]),Ko(u,u,A),Yo(l,l,A),new _l(u,l)}function Rl({x:t,y:e,z:r}){const n=1/(1<<r),i=new ru(ou(t*n),lu((e+1)*n)),s=new ru(ou((t+1)*n),lu(e*n));return new Io(i,s)}function jl(t){const e=x(t.getNorth()),r=x(t.getSouth()),n=Math.cos(e),i=Math.cos(r),s=Math.sin(e),a=Math.sin(r),o=t.getWest(),l=t.getEast();return [Ul(i,a,o),Ul(i,a,l),Ul(n,s,l),Ul(n,s,o)]}function Ul(t,e,r,n=Al){return r=x(r),[t*Math.sin(r)*n,-e*n,t*Math.cos(r)*n]}function $l(t,e,r){return Ul(Math.cos(x(t)),Math.sin(x(t)),e,r)}function Ol(t,e,r,n){const i=1<<r.z,s=(t/ko+r.x)/i;return $l(lu((e/ko+r.y)/i),ou(s),n)}function ql({min:t,max:e}){return 16383/Math.max(e[0]-t[0],e[1]-t[1],e[2]-t[2])}const Nl=new Float64Array(16);function Gl(t){const e=ql(t),r=Ro(Nl,[e,e,e]);return Do(r,r,((n=[])[0]=-(i=t.min)[0],n[1]=-i[1],n[2]=-i[2],n));var n,i;}function Xl(t){const e=(n=t.min,(r=Nl)[0]=1,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=1,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=1,r[11]=0,r[12]=n[0],r[13]=n[1],r[14]=n[2],r[15]=1,r);var r,n;const i=1/ql(t);return Vo(e,e,[i,i,i])}function Zl(t,e,r,n,i){const s=function(t){const e=ko/(2*Math.PI);return t/(2*Math.PI)/e}(r),a=[t,e,-r/(2*Math.PI)],o=Eo(new Float64Array(16));return Do(o,o,a),Vo(o,o,[s,s,s]),Lo(o,o,x(-i)),Fo(o,o,x(-n)),o}function Kl(t){return k(5,6,t)}function Yl(t,e){const r=$l(e.lat,e.lng),n=function(t){const e=$l(t._center.lat,t._center.lng);let r=tl([],No(0,1,0),e);const n=jo([],-t.angle,e);r=el(r,r,n),jo(n,-t._pitch,r);const i=Jo([],e);return Ho(i,i,zl(t.cameraToCenterDistance/t.pixelsPerMeter)),el(i,i,n),Go([],e,i)}(t);return a=(i=Xo([],n,r))[0],o=i[1],l=i[2],u=(s=r)[0],c=s[1],h=s[2],f=(p=Math.sqrt(a*a+o*o+l*l)*Math.sqrt(u*u+c*c+h*h))&&Qo(i,s)/p,Math.acos(Math.min(Math.max(f,-1),1));var i,s,a,o,l,u,c,h,p,f;}function Hl(t,e){return Yl(t,e)>Math.PI/2*1.01}const Wl=x(85),Jl=Math.cos(Wl),Ql=Math.sin(Wl),tu=6371008.8,eu=2*Math.PI*tu;class ru{constructor(t,e){if(isNaN(t)||isNaN(e))throw new Error(`Invalid LngLat object: (${t}, ${e})`);if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error(\"Invalid LngLat latitude value: must be between -90 and 90\")}wrap(){return new ru(I(this.lng,-180,180),this.lat)}toArray(){return [this.lng,this.lat]}toString(){return `LngLat(${this.lng}, ${this.lat})`}distanceTo(t){const e=Math.PI/180,r=this.lat*e,n=t.lat*e,i=Math.sin(r)*Math.sin(n)+Math.cos(r)*Math.cos(n)*Math.cos((t.lng-this.lng)*e);return tu*Math.acos(Math.min(i,1))}toBounds(t=0){const e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new Io(new ru(this.lng-r,this.lat-e),new ru(this.lng+r,this.lat+e))}toEcef(t){const e=zl(t);return $l(this.lat,this.lng,Al+e)}static convert(t){if(t instanceof ru)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new ru(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&\"object\"==typeof t&&null!==t)return new ru(Number(\"lng\"in t?t.lng:t.lon),Number(t.lat));throw new Error(\"`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, an object {lon: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]\")}}function nu(t){return eu*Math.cos(t*Math.PI/180)}function iu(t){return (180+t)/360}function su(t){return (180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function au(t,e){return t/nu(e)}function ou(t){return 360*t-180}function lu(t){return 360/Math.PI*Math.atan(Math.exp((180-360*t)*Math.PI/180))-90}function uu(t,e){return t*nu(lu(e))}const cu=85.051129;function hu(t){return 1/Math.cos(t*Math.PI/180)}class pu{constructor(t,e,r=0){this.x=+t,this.y=+e,this.z=+r;}static fromLngLat(t,e=0){const r=ru.convert(t);return new pu(iu(r.lng),su(r.lat),au(e,r.lat))}toLngLat(){return new ru(ou(this.x),lu(this.y))}toAltitude(){return uu(this.z,this.y)}meterInMercatorCoordinateUnits(){return 1/eu*hu(lu(this.y))}}function fu(t,e,r,n,i,s,a,o,l){const u=(e+n)/2,c=(r+i)/2,h=new d(u,c);o(h),function(t,e,r,n,i,s){const a=r-i,o=n-s;return Math.abs((n-e)*a-(r-t)*o)/Math.hypot(a,o)}(h.x,h.y,s.x,s.y,a.x,a.y)>=l?(fu(t,e,r,u,c,s,h,o,l),fu(t,u,c,n,i,h,a,o,l)):t.push(a);}function du(t,e,r){let n=t[0],i=n.x,s=n.y;e(n);const a=[n];for(let o=1;o<t.length;o++){const l=t[o],{x:u,y:c}=l;e(l),fu(a,i,s,u,c,n,l,e,r),i=u,s=c,n=l;}return a}function yu(t,e,r,n){if(n(e,r)){const i=e.add(r)._mult(.5);yu(t,e,i,n),yu(t,i,r,n);}else t.push(r);}function mu(t,e){let r=t[0];const n=[r];for(let i=1;i<t.length;i++){const s=t[i];yu(n,r,s,e),r=s;}return n}const gu=Math.pow(2,14)-1,xu=-gu-1;function vu(t,e){const r=Math.round(t.x*e),n=Math.round(t.y*e);return t.x=S(r,xu,gu),t.y=S(n,xu,gu),(r<t.x||r>t.x+1||n<t.y||n>t.y+1)&&$(\"Geometry exceeds allowed extent, reduce your vector tile buffer size\"),t}function bu(t,e,r){const n=t.loadGeometry(),i=t.extent,s=ko/i;if(e&&r&&r.projection.isReprojectedInTileSpace){const s=1<<e.z,{scale:a,x:o,y:l,projection:u}=r,c=t=>{const r=ou((e.x+t.x/i)/s),n=lu((e.y+t.y/i)/s),c=u.project(r,n);t.x=(c.x*a-o)*i,t.y=(c.y*a-l)*i;};for(let e=0;e<n.length;e++)if(1!==t.type)n[e]=du(n[e],c,1);else {const t=[];for(const r of n[e])r.x<0||r.x>=i||r.y<0||r.y>=i||(c(r),t.push(r));n[e]=t;}}for(const t of n)for(const e of t)vu(e,s);return n}function wu(t,e){return {type:t.type,id:t.id,properties:t.properties,geometry:e?bu(t):[]}}function _u(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2);}function Au(t,e,r){const n=16384;t.emplaceBack(e.x,e.y,e.z,r[0]*n,r[1]*n,r[2]*n);}class Su{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.projection=t.projection,this.layoutVertexArray=new sa,this.indexArray=new wa,this.segments=new So,this.programConfigurations=new fo(t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id));}populate(t,e,r,n){const i=this.layers[0],s=[];let a=null;\"circle\"===i.type&&(a=i.layout.get(\"circle-sort-key\"));for(const{feature:e,id:i,index:o,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,u=wu(e,t);if(!this.layers[0]._featureFilter.filter(new Us(this.zoom),u,r))continue;const c=a?a.evaluate(u,{},r):void 0,h={id:i,properties:e.properties,type:e.type,sourceLayerIndex:l,index:o,geometry:t?u.geometry:bu(e,r,n),patterns:{},sortKey:c};s.push(h);}a&&s.sort(((t,e)=>t.sortKey-e.sortKey));let o=null;\"globe\"===n.projection.name&&(this.globeExtVertexArray=new pa,o=n.projection);for(const n of s){const{geometry:i,index:s,sourceLayerIndex:a}=n,l=t[s].feature;this.addFeature(n,i,s,e.availableImages,r,o),e.featureIndex.insert(l,i,s,a,this.index);}}update(t,e,r,n){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r,n);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,_o.members),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.globeExtVertexArray&&(this.globeExtVertexBuffer=t.createVertexBuffer(this.globeExtVertexArray,Ao.members))),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.globeExtVertexBuffer&&this.globeExtVertexBuffer.destroy());}addFeature(t,e,r,n,i,s){for(const r of e)for(const e of r){const r=e.x,n=e.y;if(r<0||r>=ko||n<0||n>=ko)continue;if(s){const t=s.projectTilePoint(r,n,i),e=s.upVector(i,r,n),a=this.globeExtVertexArray;Au(a,t,e),Au(a,t,e),Au(a,t,e),Au(a,t,e);}const a=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),o=a.vertexLength;_u(this.layoutVertexArray,r,n,-1,-1),_u(this.layoutVertexArray,r,n,1,-1),_u(this.layoutVertexArray,r,n,1,1),_u(this.layoutVertexArray,r,n,-1,1),this.indexArray.emplaceBack(o,o+1,o+2),this.indexArray.emplaceBack(o,o+2,o+3),a.vertexLength+=4,a.primitiveLength+=2;}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},n,i);}}function ku(t,e){for(let r=0;r<t.length;r++)if(Du(e,t[r]))return !0;for(let r=0;r<e.length;r++)if(Du(t,e[r]))return !0;return !!zu(t,e)}function Iu(t,e,r){return !!Du(t,e)||!!Eu(e,t,r)}function Mu(t,e){if(1===t.length)return Pu(e,t[0]);for(let r=0;r<e.length;r++){const n=e[r];for(let e=0;e<n.length;e++)if(Du(t,n[e]))return !0}for(let r=0;r<t.length;r++)if(Pu(e,t[r]))return !0;for(let r=0;r<e.length;r++)if(zu(t,e[r]))return !0;return !1}function Tu(t,e,r){if(t.length>1){if(zu(t,e))return !0;for(let n=0;n<e.length;n++)if(Eu(e[n],t,r))return !0}for(let n=0;n<t.length;n++)if(Eu(t[n],e,r))return !0;return !1}function zu(t,e){if(0===t.length||0===e.length)return !1;for(let r=0;r<t.length-1;r++){const n=t[r],i=t[r+1];for(let t=0;t<e.length-1;t++)if(Bu(n,i,e[t],e[t+1]))return !0}return !1}function Bu(t,e,r,n){return O(t,r,n)!==O(e,r,n)&&O(t,e,r)!==O(t,e,n)}function Eu(t,e,r){const n=r*r;if(1===e.length)return t.distSqr(e[0])<n;for(let r=1;r<e.length;r++)if(Cu(t,e[r-1],e[r])<n)return !0;return !1}function Cu(t,e,r){const n=e.distSqr(r);if(0===n)return t.distSqr(e);const i=((t.x-e.x)*(r.x-e.x)+(t.y-e.y)*(r.y-e.y))/n;return t.distSqr(i<0?e:i>1?r:r.sub(e)._mult(i)._add(e))}function Pu(t,e){let r,n,i,s=!1;for(let a=0;a<t.length;a++){r=t[a];for(let t=0,a=r.length-1;t<r.length;a=t++)n=r[t],i=r[a],n.y>e.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(s=!s);}return s}function Du(t,e){let r=!1;for(let n=0,i=t.length-1;n<t.length;i=n++){const s=t[n],a=t[i];s.y>e.y!=a.y>e.y&&e.x<(a.x-s.x)*(e.y-s.y)/(a.y-s.y)+s.x&&(r=!r);}return r}function Vu(t,e,r,n,i){for(const s of t)if(e<=s.x&&r<=s.y&&n>=s.x&&i>=s.y)return !0;const s=[new d(e,r),new d(e,i),new d(n,i),new d(n,r)];if(t.length>2)for(const e of s)if(Du(t,e))return !0;for(let e=0;e<t.length-1;e++)if(Lu(t[e],t[e+1],s))return !0;return !1}function Lu(t,e,r){const n=r[0],i=r[2];if(t.x<n.x&&e.x<n.x||t.x>i.x&&e.x>i.x||t.y<n.y&&e.y<n.y||t.y>i.y&&e.y>i.y)return !1;const s=O(t,e,r[0]);return s!==O(t,e,r[1])||s!==O(t,e,r[2])||s!==O(t,e,r[3])}function Fu(t,e,r){const n=e.paint.get(t).value;return \"constant\"===n.kind?n.value:r.programConfigurations.get(e.id).getMaxValue(t)}function Ru(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function ju(t,e,r,n,i){if(!e[0]&&!e[1])return t;const s=d.convert(e)._mult(i);\"viewport\"===r&&s._rotate(-n);const a=[];for(let e=0;e<t.length;e++)a.push(t[e].sub(s));return a}function Uu(t,e,r,n){const i=d.convert(t)._mult(n);return \"viewport\"===e&&i._rotate(-r),i}Oi(Su,\"CircleBucket\",{omit:[\"layers\"]});const $u=new Js({\"circle-sort-key\":new Hs(Ht.layout_circle[\"circle-sort-key\"])});var Ou={paint:new Js({\"circle-radius\":new Hs(Ht.paint_circle[\"circle-radius\"]),\"circle-color\":new Hs(Ht.paint_circle[\"circle-color\"]),\"circle-blur\":new Hs(Ht.paint_circle[\"circle-blur\"]),\"circle-opacity\":new Hs(Ht.paint_circle[\"circle-opacity\"]),\"circle-translate\":new Ys(Ht.paint_circle[\"circle-translate\"]),\"circle-translate-anchor\":new Ys(Ht.paint_circle[\"circle-translate-anchor\"]),\"circle-pitch-scale\":new Ys(Ht.paint_circle[\"circle-pitch-scale\"]),\"circle-pitch-alignment\":new Ys(Ht.paint_circle[\"circle-pitch-alignment\"]),\"circle-stroke-width\":new Hs(Ht.paint_circle[\"circle-stroke-width\"]),\"circle-stroke-color\":new Hs(Ht.paint_circle[\"circle-stroke-color\"]),\"circle-stroke-opacity\":new Hs(Ht.paint_circle[\"circle-stroke-opacity\"])}),layout:$u};function qu(t,e,r,n,i,s,a,o,l){if(s&&t.queryGeometry.isAboveHorizon)return !1;s&&(l*=t.pixelToTileUnitsFactor);const u=t.tileID.canonical,c=r.projection.upVectorScale(u,r.center.lat,r.worldSize).metersToTile;for(const h of e)for(const e of h){const h=e.add(o),p=i&&r.elevation?r.elevation.exaggeration()*i.getElevationAt(h.x,h.y,!0):0,f=r.projection.projectTilePoint(h.x,h.y,u);if(p>0){const t=r.projection.upVector(u,h.x,h.y);f.x+=t[0]*c*p,f.y+=t[1]*c*p,f.z+=t[2]*c*p;}const d=s?h:Nu(f.x,f.y,f.z,n),y=s?t.tilespaceRays.map((t=>Zu(t,p))):t.queryGeometry.screenGeometry,m=ul([],[f.x,f.y,f.z,1],n);if(!a&&s?l*=m[3]/r.cameraToCenterDistance:a&&!s&&(l*=r.cameraToCenterDistance/m[3]),s){const t=lu((e.y/ko+u.y)/(1<<u.z));l/=r.projection.pixelsPerMeter(t,1)/au(1,t);}if(Iu(y,d,l))return !0}return !1}function Nu(t,e,r,n){const i=ul([],[t,e,r,1],n);return new d(i[0]/i[3],i[1]/i[3])}const Gu=No(0,0,0),Xu=No(0,0,1);function Zu(t,e){const r=$o();return Gu[2]=e,t.intersectsPlane(Gu,Xu,r),new d(r[0],r[1])}class Ku extends Su{}function Yu(t,{width:e,height:r},n,i){if(i){if(i instanceof Uint8ClampedArray)i=new Uint8Array(i.buffer);else if(i.length!==e*r*n)throw new RangeError(\"mismatched image size\")}else i=new Uint8Array(e*r*n);return t.width=e,t.height=r,t.data=i,t}function Hu(t,e,r){const{width:n,height:i}=e;n===t.width&&i===t.height||(Wu(t,e,{x:0,y:0},{x:0,y:0},{width:Math.min(t.width,n),height:Math.min(t.height,i)},r),t.width=n,t.height=i,t.data=e.data);}function Wu(t,e,r,n,i,s){if(0===i.width||0===i.height)return e;if(i.width>t.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError(\"out of range source coordinates for image copy\");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError(\"out of range destination coordinates for image copy\");const a=t.data,o=e.data;for(let l=0;l<i.height;l++){const u=((r.y+l)*t.width+r.x)*s,c=((n.y+l)*e.width+n.x)*s;for(let t=0;t<i.width*s;t++)o[c+t]=a[u+t];}return e}Oi(Ku,\"HeatmapBucket\",{omit:[\"layers\"]});class Ju{constructor(t,e){Yu(this,t,1,e);}resize(t){Hu(this,new Ju(t),1);}clone(){return new Ju({width:this.width,height:this.height},new Uint8Array(this.data))}static copy(t,e,r,n,i){Wu(t,e,r,n,i,1);}}class Qu{constructor(t,e){Yu(this,t,4,e);}resize(t){Hu(this,new Qu(t),4);}replace(t,e){e?this.data.set(t):this.data=t instanceof Uint8ClampedArray?new Uint8Array(t.buffer):t;}clone(){return new Qu({width:this.width,height:this.height},new Uint8Array(this.data))}static copy(t,e,r,n,i){Wu(t,e,r,n,i,4);}}Oi(Ju,\"AlphaImage\"),Oi(Qu,\"RGBAImage\");var tc={paint:new Js({\"heatmap-radius\":new Hs(Ht.paint_heatmap[\"heatmap-radius\"]),\"heatmap-weight\":new Hs(Ht.paint_heatmap[\"heatmap-weight\"]),\"heatmap-intensity\":new Ys(Ht.paint_heatmap[\"heatmap-intensity\"]),\"heatmap-color\":new Ws(Ht.paint_heatmap[\"heatmap-color\"]),\"heatmap-opacity\":new Ys(Ht.paint_heatmap[\"heatmap-opacity\"])})};function ec(t){const e={},r=t.resolution||256,n=t.clips?t.clips.length:1,i=t.image||new Qu({width:r,height:n}),s=(r,n,s)=>{e[t.evaluationKey]=s;const a=t.expression.evaluate(e);i.data[r+n+0]=Math.floor(255*a.r/a.a),i.data[r+n+1]=Math.floor(255*a.g/a.a),i.data[r+n+2]=Math.floor(255*a.b/a.a),i.data[r+n+3]=Math.floor(255*a.a);};if(t.clips)for(let e=0,i=0;e<n;++e,i+=4*r)for(let n=0,a=0;n<r;n++,a+=4){const o=n/(r-1),{start:l,end:u}=t.clips[e];s(i,a,l*(1-o)+u*o);}else for(let t=0,e=0;t<r;t++,e+=4)s(0,e,t/(r-1));return i}var rc={paint:new Js({\"hillshade-illumination-direction\":new Ys(Ht.paint_hillshade[\"hillshade-illumination-direction\"]),\"hillshade-illumination-anchor\":new Ys(Ht.paint_hillshade[\"hillshade-illumination-anchor\"]),\"hillshade-exaggeration\":new Ys(Ht.paint_hillshade[\"hillshade-exaggeration\"]),\"hillshade-shadow-color\":new Ys(Ht.paint_hillshade[\"hillshade-shadow-color\"]),\"hillshade-highlight-color\":new Ys(Ht.paint_hillshade[\"hillshade-highlight-color\"]),\"hillshade-accent-color\":new Ys(Ht.paint_hillshade[\"hillshade-accent-color\"])})};const nc=na([{name:\"a_pos\",components:2,type:\"Int16\"}],4),{members:ic}=nc;var sc={};function ac(t,e,r){r=r||2;var n,i,s,a,o,l,u,c=e&&e.length,h=c?e[0]*r:t.length,p=oc(t,0,h,r,!0),f=[];if(!p||p.next===p.prev)return f;if(c&&(p=function(t,e,r,n){var i,s,a,o=[];for(i=0,s=e.length;i<s;i++)(a=oc(t,e[i]*n,i<s-1?e[i+1]*n:t.length,n,!1))===a.next&&(a.steiner=!0),o.push(xc(a));for(o.sort(dc),i=0;i<o.length;i++)r=yc(o[i],r);return r}(t,e,p,r)),t.length>80*r){n=s=t[0],i=a=t[1];for(var d=r;d<h;d+=r)(o=t[d])<n&&(n=o),(l=t[d+1])<i&&(i=l),o>s&&(s=o),l>a&&(a=l);u=0!==(u=Math.max(s-n,a-i))?32767/u:0;}return uc(p,f,r,n,i,u,0),f}function oc(t,e,r,n,i){var s,a;if(i===Ec(t,e,r,n)>0)for(s=e;s<r;s+=n)a=Tc(s,t[s],t[s+1],a);else for(s=r-n;s>=e;s-=n)a=Tc(s,t[s],t[s+1],a);return a&&_c(a,a.next)&&(zc(a),a=a.next),a}function lc(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!_c(n,n.next)&&0!==wc(n.prev,n,n.next))n=n.next;else {if(zc(n),(n=e=n.prev)===n.next)break;r=!0;}}while(r||n!==e);return e}function uc(t,e,r,n,i,s,a){if(t){!a&&s&&function(t,e,r,n){var i=t;do{0===i.z&&(i.z=gc(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,s,a,o,l,u=1;do{for(r=t,t=null,s=null,a=0;r;){for(a++,n=r,o=0,e=0;e<u&&(o++,n=n.nextZ);e++);for(l=u;o>0||l>0&&n;)0!==o&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,o--):(i=n,n=n.nextZ,l--),s?s.nextZ=i:t=i,i.prevZ=s,s=i;r=n;}s.nextZ=null,u*=2;}while(a>1)}(i);}(t,n,i,s);for(var o,l,u=t;t.prev!==t.next;)if(o=t.prev,l=t.next,s?hc(t,n,i,s):cc(t))e.push(o.i/r|0),e.push(t.i/r|0),e.push(l.i/r|0),zc(t),t=l.next,u=l.next;else if((t=l)===u){a?1===a?uc(t=pc(lc(t),e,r),e,r,n,i,s,2):2===a&&fc(t,e,r,n,i,s):uc(lc(t),e,r,n,i,s,1);break}}}function cc(t){var e=t.prev,r=t,n=t.next;if(wc(e,r,n)>=0)return !1;for(var i=e.x,s=r.x,a=n.x,o=e.y,l=r.y,u=n.y,c=i<s?i<a?i:a:s<a?s:a,h=o<l?o<u?o:u:l<u?l:u,p=i>s?i>a?i:a:s>a?s:a,f=o>l?o>u?o:u:l>u?l:u,d=n.next;d!==e;){if(d.x>=c&&d.x<=p&&d.y>=h&&d.y<=f&&vc(i,o,s,l,a,u,d.x,d.y)&&wc(d.prev,d,d.next)>=0)return !1;d=d.next;}return !0}function hc(t,e,r,n){var i=t.prev,s=t,a=t.next;if(wc(i,s,a)>=0)return !1;for(var o=i.x,l=s.x,u=a.x,c=i.y,h=s.y,p=a.y,f=o<l?o<u?o:u:l<u?l:u,d=c<h?c<p?c:p:h<p?h:p,y=o>l?o>u?o:u:l>u?l:u,m=c>h?c>p?c:p:h>p?h:p,g=gc(f,d,e,r,n),x=gc(y,m,e,r,n),v=t.prevZ,b=t.nextZ;v&&v.z>=g&&b&&b.z<=x;){if(v.x>=f&&v.x<=y&&v.y>=d&&v.y<=m&&v!==i&&v!==a&&vc(o,c,l,h,u,p,v.x,v.y)&&wc(v.prev,v,v.next)>=0)return !1;if(v=v.prevZ,b.x>=f&&b.x<=y&&b.y>=d&&b.y<=m&&b!==i&&b!==a&&vc(o,c,l,h,u,p,b.x,b.y)&&wc(b.prev,b,b.next)>=0)return !1;b=b.nextZ;}for(;v&&v.z>=g;){if(v.x>=f&&v.x<=y&&v.y>=d&&v.y<=m&&v!==i&&v!==a&&vc(o,c,l,h,u,p,v.x,v.y)&&wc(v.prev,v,v.next)>=0)return !1;v=v.prevZ;}for(;b&&b.z<=x;){if(b.x>=f&&b.x<=y&&b.y>=d&&b.y<=m&&b!==i&&b!==a&&vc(o,c,l,h,u,p,b.x,b.y)&&wc(b.prev,b,b.next)>=0)return !1;b=b.nextZ;}return !0}function pc(t,e,r){var n=t;do{var i=n.prev,s=n.next.next;!_c(i,s)&&Ac(i,n,n.next,s)&&Ic(i,s)&&Ic(s,i)&&(e.push(i.i/r|0),e.push(n.i/r|0),e.push(s.i/r|0),zc(n),zc(n.next),n=t=s),n=n.next;}while(n!==t);return lc(n)}function fc(t,e,r,n,i,s){var a=t;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&bc(a,o)){var l=Mc(a,o);return a=lc(a,a.next),l=lc(l,l.next),uc(a,e,r,n,i,s,0),void uc(l,e,r,n,i,s,0)}o=o.next;}a=a.next;}while(a!==t)}function dc(t,e){return t.x-e.x}function yc(t,e){var r=function(t,e){var r,n=e,i=t.x,s=t.y,a=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var o=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(o<=i&&o>a&&(a=o,r=n.x<n.next.x?n:n.next,o===i))return r}n=n.next;}while(n!==e);if(!r)return null;var l,u=r,c=r.x,h=r.y,p=1/0;n=r;do{i>=n.x&&n.x>=c&&i!==n.x&&vc(s<h?i:a,s,c,h,s<h?a:i,s,n.x,n.y)&&(l=Math.abs(s-n.y)/(i-n.x),Ic(n,t)&&(l<p||l===p&&(n.x>r.x||n.x===r.x&&mc(r,n)))&&(r=n,p=l)),n=n.next;}while(n!==u);return r}(t,e);if(!r)return e;var n=Mc(r,t);return lc(n,n.next),lc(r,r.next)}function mc(t,e){return wc(t.prev,t,e.prev)<0&&wc(e.next,t,t.next)<0}function gc(t,e,r,n,i){return (t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-r)*i|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*i|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xc(t){var e=t,r=t;do{(e.x<r.x||e.x===r.x&&e.y<r.y)&&(r=e),e=e.next;}while(e!==t);return r}function vc(t,e,r,n,i,s,a,o){return (i-a)*(e-o)>=(t-a)*(s-o)&&(t-a)*(n-o)>=(r-a)*(e-o)&&(r-a)*(s-o)>=(i-a)*(n-o)}function bc(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&Ac(r,r.next,t,e))return !0;r=r.next;}while(r!==t);return !1}(t,e)&&(Ic(t,e)&&Ic(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,s=(t.y+e.y)/2;do{r.y>s!=r.next.y>s&&r.next.y!==r.y&&i<(r.next.x-r.x)*(s-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;}while(r!==t);return n}(t,e)&&(wc(t.prev,t,e.prev)||wc(t,e.prev,e))||_c(t,e)&&wc(t.prev,t,t.next)>0&&wc(e.prev,e,e.next)>0)}function wc(t,e,r){return (e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function _c(t,e){return t.x===e.x&&t.y===e.y}function Ac(t,e,r,n){var i=kc(wc(t,e,r)),s=kc(wc(t,e,n)),a=kc(wc(r,n,t)),o=kc(wc(r,n,e));return i!==s&&a!==o||!(0!==i||!Sc(t,r,e))||!(0!==s||!Sc(t,n,e))||!(0!==a||!Sc(r,t,n))||!(0!==o||!Sc(r,e,n))}function Sc(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function kc(t){return t>0?1:t<0?-1:0}function Ic(t,e){return wc(t.prev,t,t.next)<0?wc(t,e,t.next)>=0&&wc(t,t.prev,e)>=0:wc(t,e,t.prev)<0||wc(t,t.next,e)<0}function Mc(t,e){var r=new Bc(t.i,t.x,t.y),n=new Bc(e.i,e.x,e.y),i=t.next,s=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,s.next=n,n.prev=s,n}function Tc(t,e,r,n){var i=new Bc(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function zc(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ);}function Bc(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1;}function Ec(t,e,r,n){for(var i=0,s=e,a=r-n;s<r;s+=n)i+=(t[a]-t[s])*(t[s+1]+t[a+1]),a=s;return i}function Cc(t,e,r,n,i){Pc(t,e,r||0,n||t.length-1,i||Vc);}function Pc(t,e,r,n,i){for(;n>r;){if(n-r>600){var s=n-r+1,a=e-r+1,o=Math.log(s),l=.5*Math.exp(2*o/3),u=.5*Math.sqrt(o*l*(s-l)/s)*(a-s/2<0?-1:1);Pc(t,e,Math.max(r,Math.floor(e-a*l/s+u)),Math.min(n,Math.floor(e+(s-a)*l/s+u)),i);}var c=t[e],h=r,p=n;for(Dc(t,r,e),i(t[n],c)>0&&Dc(t,r,n);h<p;){for(Dc(t,h,p),h++,p--;i(t[h],c)<0;)h++;for(;i(t[p],c)>0;)p--;}0===i(t[r],c)?Dc(t,r,p):Dc(t,++p,n),p<=e&&(r=p+1),e<=p&&(n=p-1);}}function Dc(t,e,r){var n=t[e];t[e]=t[r],t[r]=n;}function Vc(t,e){return t<e?-1:t>e?1:0}function Lc(t,e){const r=t.length;if(r<=1)return [t];const n=[];let i,s;for(let e=0;e<r;e++){const r=q(t[e]);0!==r&&(t[e].area=Math.abs(r),void 0===s&&(s=r<0),s===r<0?(i&&n.push(i),i=[t[e]]):i.push(t[e]));}if(i&&n.push(i),e>1)for(let t=0;t<n.length;t++)n[t].length<=e||(Cc(n[t],e,1,n[t].length-1,Fc),n[t]=n[t].slice(0,e));return n}function Fc(t,e){return e.area-t.area}function Rc(t,e,r){const n=r.patternDependencies;let i=!1;for(const r of e){const e=r.paint.get(`${t}-pattern`);e.isConstant()||(i=!0);const s=e.constantOr(null);s&&(i=!0,n[s]=!0);}return i}function jc(t,e,r,n,i){const s=i.patternDependencies;for(const a of e){const e=a.paint.get(`${t}-pattern`).value;if(\"constant\"!==e.kind){let t=e.evaluate({zoom:n},r,{},i.availableImages);t=t&&t.name?t.name:t,s[t]=!0,r.patterns[a.id]=t;}}return r}({get exports(){return sc},set exports(t){sc=t;}}).exports=ac,sc.default=ac,ac.deviation=function(t,e,r,n){var i=e&&e.length,s=Math.abs(Ec(t,0,i?e[0]*r:t.length,r));if(i)for(var a=0,o=e.length;a<o;a++)s-=Math.abs(Ec(t,e[a]*r,a<o-1?e[a+1]*r:t.length,r));var l=0;for(a=0;a<n.length;a+=3){var u=n[a]*r,c=n[a+1]*r,h=n[a+2]*r;l+=Math.abs((t[u]-t[h])*(t[c+1]-t[u+1])-(t[u]-t[c])*(t[h+1]-t[u+1]));}return 0===s&&0===l?0:Math.abs((l-s)/s)},ac.flatten=function(t){for(var e=t[0][0].length,r={vertices:[],holes:[],dimensions:e},n=0,i=0;i<t.length;i++){for(var s=0;s<t[i].length;s++)for(var a=0;a<e;a++)r.vertices.push(t[i][s][a]);i>0&&r.holes.push(n+=t[i-1].length);}return r};class Uc{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new sa,this.indexArray=new wa,this.indexArray2=new Ma,this.programConfigurations=new fo(t.layers,t.zoom),this.segments=new So,this.segments2=new So,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id)),this.projection=t.projection;}populate(t,e,r,n){this.hasPattern=Rc(\"fill\",this.layers,e);const i=this.layers[0].layout.get(\"fill-sort-key\"),s=[];for(const{feature:a,id:o,index:l,sourceLayerIndex:u}of t){const t=this.layers[0]._featureFilter.needGeometry,c=wu(a,t);if(!this.layers[0]._featureFilter.filter(new Us(this.zoom),c,r))continue;const h=i?i.evaluate(c,{},r,e.availableImages):void 0,p={id:o,properties:a.properties,type:a.type,sourceLayerIndex:u,index:l,geometry:t?c.geometry:bu(a,r,n),patterns:{},sortKey:h};s.push(p);}i&&s.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of s){const{geometry:i,index:s,sourceLayerIndex:a}=n;if(this.hasPattern){const t=jc(\"fill\",this.layers,n,this.zoom,e);this.patternFeatures.push(t);}else this.addFeature(n,i,s,r,{},e.availableImages);e.featureIndex.insert(t[s].feature,i,s,a,this.index);}}update(t,e,r,n){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r,n);}addFeatures(t,e,r,n,i){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r,n);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,ic),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.indexBuffer2=t.createIndexBuffer(this.indexArray2)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.indexBuffer2.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.segments2.destroy());}addFeature(t,e,r,n,i,s=[]){for(const t of Lc(e,500)){let e=0;for(const r of t)e+=r.length;const r=this.segments.prepareSegment(e,this.layoutVertexArray,this.indexArray),n=r.vertexLength,i=[],s=[];for(const e of t){if(0===e.length)continue;e!==t[0]&&s.push(i.length/2);const r=this.segments2.prepareSegment(e.length,this.layoutVertexArray,this.indexArray2),n=r.vertexLength;this.layoutVertexArray.emplaceBack(e[0].x,e[0].y),this.indexArray2.emplaceBack(n+e.length-1,n),i.push(e[0].x),i.push(e[0].y);for(let t=1;t<e.length;t++)this.layoutVertexArray.emplaceBack(e[t].x,e[t].y),this.indexArray2.emplaceBack(n+t-1,n+t),i.push(e[t].x),i.push(e[t].y);r.vertexLength+=e.length,r.primitiveLength+=e.length;}const a=sc(i,s);for(let t=0;t<a.length;t+=3)this.indexArray.emplaceBack(n+a[t],n+a[t+1],n+a[t+2]);r.vertexLength+=e,r.primitiveLength+=a.length/3;}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,s,n);}}Oi(Uc,\"FillBucket\",{omit:[\"layers\",\"patternFeatures\"]});const $c=new Js({\"fill-sort-key\":new Hs(Ht.layout_fill[\"fill-sort-key\"])});var Oc={paint:new Js({\"fill-antialias\":new Ys(Ht.paint_fill[\"fill-antialias\"]),\"fill-opacity\":new Hs(Ht.paint_fill[\"fill-opacity\"]),\"fill-color\":new Hs(Ht.paint_fill[\"fill-color\"]),\"fill-outline-color\":new Hs(Ht.paint_fill[\"fill-outline-color\"]),\"fill-translate\":new Ys(Ht.paint_fill[\"fill-translate\"]),\"fill-translate-anchor\":new Ys(Ht.paint_fill[\"fill-translate-anchor\"]),\"fill-pattern\":new Hs(Ht.paint_fill[\"fill-pattern\"])}),layout:$c};const qc=na([{name:\"a_pos_normal_ed\",components:4,type:\"Int16\"}]),Nc=na([{name:\"a_centroid_pos\",components:2,type:\"Uint16\"}]),Gc=na([{name:\"a_pos_3\",components:3,type:\"Int16\"},{name:\"a_pos_normal_3\",components:3,type:\"Int16\"}]),{members:Xc}=qc;var Zc={},Kc=d,Yc=Hc;function Hc(t,e,r,n,i){this.properties={},this.extent=r,this.type=0,this._pbf=t,this._geometry=-1,this._keys=n,this._values=i,t.readFields(Wc,this,e);}function Wc(t,e,r){1==t?e.id=r.readVarint():2==t?function(t,e){for(var r=t.readVarint()+t.pos;t.pos<r;){var n=e._keys[t.readVarint()],i=e._values[t.readVarint()];e.properties[n]=i;}}(r,e):3==t?e.type=r.readVarint():4==t&&(e._geometry=r.pos);}function Jc(t){for(var e,r,n=0,i=0,s=t.length,a=s-1;i<s;a=i++)n+=((r=t[a]).x-(e=t[i]).x)*(e.y+r.y);return n}Hc.types=[\"Unknown\",\"Point\",\"LineString\",\"Polygon\"],Hc.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,r=t.readVarint()+t.pos,n=1,i=0,s=0,a=0,o=[];t.pos<r;){if(i<=0){var l=t.readVarint();n=7&l,i=l>>3;}if(i--,1===n||2===n)s+=t.readSVarint(),a+=t.readSVarint(),1===n&&(e&&o.push(e),e=[]),e.push(new Kc(s,a));else {if(7!==n)throw new Error(\"unknown command \"+n);e&&e.push(e[0].clone());}}return e&&o.push(e),o},Hc.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,s=0,a=1/0,o=-1/0,l=1/0,u=-1/0;t.pos<e;){if(n<=0){var c=t.readVarint();r=7&c,n=c>>3;}if(n--,1===r||2===r)(i+=t.readSVarint())<a&&(a=i),i>o&&(o=i),(s+=t.readSVarint())<l&&(l=s),s>u&&(u=s);else if(7!==r)throw new Error(\"unknown command \"+r)}return [a,l,o,u]},Hc.prototype.toGeoJSON=function(t,e,r){var n,i,s=this.extent*Math.pow(2,r),a=this.extent*t,o=this.extent*e,l=this.loadGeometry(),u=Hc.types[this.type];function c(t){for(var e=0;e<t.length;e++){var r=t[e];t[e]=[360*(r.x+a)/s-180,360/Math.PI*Math.atan(Math.exp((180-360*(r.y+o)/s)*Math.PI/180))-90];}}switch(this.type){case 1:var h=[];for(n=0;n<l.length;n++)h[n]=l[n][0];c(l=h);break;case 2:for(n=0;n<l.length;n++)c(l[n]);break;case 3:for(l=function(t){var e=t.length;if(e<=1)return [t];for(var r,n,i=[],s=0;s<e;s++){var a=Jc(t[s]);0!==a&&(void 0===n&&(n=a<0),n===a<0?(r&&i.push(r),r=[t[s]]):r.push(t[s]));}return r&&i.push(r),i}(l),n=0;n<l.length;n++)for(i=0;i<l[n].length;i++)c(l[n][i]);}1===l.length?l=l[0]:u=\"Multi\"+u;var p={type:\"Feature\",geometry:{type:u,coordinates:l},properties:this.properties};return \"id\"in this&&(p.id=this.id),p};var Qc=Yc,th=eh;function eh(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(rh,this,e),this.length=this._features.length;}function rh(t,e,r){15===t?e.version=r.readVarint():1===t?e.name=r.readString():5===t?e.extent=r.readVarint():2===t?e._features.push(r.pos):3===t?e._keys.push(r.readString()):4===t&&e._values.push(function(t){for(var e=null,r=t.readVarint()+t.pos;t.pos<r;){var n=t.readVarint()>>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null;}return e}(r));}eh.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\"feature index out of bounds\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new Qc(this._pbf,e,this.extent,this._keys,this._values)};var nh=th;function ih(t,e,r){if(3===t){var n=new nh(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n);}}var sh=Zc.VectorTile=function(t,e){this.layers=t.readFields(ih,{},e);},ah=Zc.VectorTileFeature=Yc;function oh(t,e,r,n){const i=[],s=0===n?(t,e,r,n,i,s)=>{t.push(new d(s,r+(s-e)/(n-e)*(i-r)));}:(t,e,r,n,i,s)=>{t.push(new d(e+(s-r)/(i-r)*(n-e),s));};for(const a of t){const t=[];for(const i of a){if(i.length<=2)continue;const a=[];for(let t=0;t<i.length-1;t++){const o=i[t].x,l=i[t].y,u=i[t+1].x,c=i[t+1].y,h=0===n?o:l,p=0===n?u:c;h<e?p>e&&s(a,o,l,u,c,e):h>r?p<r&&s(a,o,l,u,c,r):a.push(i[t]),p<e&&h>=e&&s(a,o,l,u,c,e),p>r&&h<=r&&s(a,o,l,u,c,r);}let o=i[i.length-1];const l=0===n?o.x:o.y;l>=e&&l<=r&&a.push(o),a.length&&(o=a[a.length-1],a[0].x===o.x&&a[0].y===o.y||a.push(a[0]),t.push(a));}t.length&&i.push(t);}return i}Zc.VectorTileLayer=th;const lh=ah.types,uh=Math.pow(2,13);function ch(t,e,r,n,i,s,a,o){t.emplaceBack((e<<1)+a,(r<<1)+s,(Math.floor(n*uh)<<1)+i,Math.round(o));}function hh(t,e,r){const n=16384;t.emplaceBack(e.x,e.y,e.z,r[0]*n,r[1]*n,r[2]*n);}class ph{constructor(){this.acc=new d(0,0),this.polyCount=[];}startRing(t){this.currentPolyCount={edges:0,top:0},this.polyCount.push(this.currentPolyCount),this.min||(this.min=new d(t.x,t.y),this.max=new d(t.x,t.y));}append(t,e){this.currentPolyCount.edges++,this.acc._add(t);const r=this.min,n=this.max;t.x<r.x?r.x=t.x:t.x>n.x&&(n.x=t.x),t.y<r.y?r.y=t.y:t.y>n.y&&(n.y=t.y),((0===t.x||t.x===ko)&&t.x===e.x)!=((0===t.y||t.y===ko)&&t.y===e.y)&&this.processBorderOverlap(t,e),e.x<0!=t.x<0&&this.addBorderIntersection(0,Mr(e.y,t.y,(0-e.x)/(t.x-e.x))),e.x>ko!=t.x>ko&&this.addBorderIntersection(1,Mr(e.y,t.y,(ko-e.x)/(t.x-e.x))),e.y<0!=t.y<0&&this.addBorderIntersection(2,Mr(e.x,t.x,(0-e.y)/(t.y-e.y))),e.y>ko!=t.y>ko&&this.addBorderIntersection(3,Mr(e.x,t.x,(ko-e.y)/(t.y-e.y)));}addBorderIntersection(t,e){this.borders||(this.borders=[[Number.MAX_VALUE,-Number.MAX_VALUE],[Number.MAX_VALUE,-Number.MAX_VALUE],[Number.MAX_VALUE,-Number.MAX_VALUE],[Number.MAX_VALUE,-Number.MAX_VALUE]]);const r=this.borders[t];e<r[0]&&(r[0]=e),e>r[1]&&(r[1]=e);}processBorderOverlap(t,e){if(t.x===e.x){if(t.y===e.y)return;const r=0===t.x?0:1;this.addBorderIntersection(r,e.y),this.addBorderIntersection(r,t.y);}else {const r=0===t.y?2:3;this.addBorderIntersection(r,e.x),this.addBorderIntersection(r,t.x);}}centroid(){const t=this.polyCount.reduce(((t,e)=>t+e.edges),0);return 0!==t?this.acc.div(t)._round():new d(0,0)}span(){return new d(this.max.x-this.min.x,this.max.y-this.min.y)}intersectsCount(){return this.borders.reduce(((t,e)=>t+ +(e[0]!==Number.MAX_VALUE)),0)}}class fh{constructor(t){this.zoom=t.zoom,this.canonical=t.canonical,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.edgeRadius=0,this.projection=t.projection,this.layoutVertexArray=new oa,this.centroidVertexArray=new Ua,this.indexArray=new wa,this.programConfigurations=new fo(t.layers,t.zoom),this.segments=new So,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id)),this.enableTerrain=t.enableTerrain;}populate(t,e,r,n){this.features=[],this.hasPattern=Rc(\"fill-extrusion\",this.layers,e),this.featuresOnBorder=[],this.borders=[[],[],[],[]],this.borderDoneWithNeighborZ=[-1,-1,-1,-1],this.tileToMeter=function(t){const e=Math.exp(Math.PI*(1-t.y/(1<<t.z)*2));return 80150034*e/(e*e+1)/ko/(1<<t.z)}(r),this.edgeRadius=this.layers[0].layout.get(\"fill-extrusion-edge-radius\")/this.tileToMeter;for(const{feature:i,id:s,index:a,sourceLayerIndex:o}of t){const t=this.layers[0]._featureFilter.needGeometry,l=wu(i,t);if(!this.layers[0]._featureFilter.filter(new Us(this.zoom),l,r))continue;const u={id:s,sourceLayerIndex:o,index:a,geometry:t?l.geometry:bu(i,r,n),properties:i.properties,type:i.type,patterns:{}},c=this.layoutVertexArray.length;this.hasPattern?this.features.push(jc(\"fill-extrusion\",this.layers,u,this.zoom,e)):this.addFeature(u,u.geometry,a,r,{},e.availableImages,n),e.featureIndex.insert(i,u.geometry,a,o,this.index,c);}this.sortBorders();}addFeatures(t,e,r,n,i){for(const t of this.features){const{geometry:s}=t;this.addFeature(t,s,t.index,e,r,n,i);}this.sortBorders();}update(t,e,r,n){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r,n);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Xc),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.layoutVertexExtArray&&(this.layoutVertexExtBuffer=t.createVertexBuffer(this.layoutVertexExtArray,Gc.members,!0))),this.programConfigurations.upload(t),this.uploaded=!0;}uploadCentroid(t){0!==this.centroidVertexArray.length&&(this.centroidVertexBuffer?this.needsCentroidUpdate&&this.centroidVertexBuffer.updateData(this.centroidVertexArray):this.centroidVertexBuffer=t.createVertexBuffer(this.centroidVertexArray,Nc.members,!0),this.needsCentroidUpdate=!1);}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.centroidVertexBuffer&&this.centroidVertexBuffer.destroy(),this.layoutVertexExtBuffer&&this.layoutVertexExtBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy());}addFeature(t,e,r,n,i,s,a){const o=[new d(0,0),new d(ko,ko)],l=a.projection,u=\"globe\"===l.name,c=this.enableTerrain&&!u?new ph:null,h=\"Polygon\"===lh[t.type];u&&!this.layoutVertexExtArray&&(this.layoutVertexExtArray=new pa);const p=Lc(e,500);for(let t=p.length-1;t>=0;t--){const e=p[t];(0===e.length||(f=e[0]).every((t=>t.x<=0))||f.every((t=>t.x>=ko))||f.every((t=>t.y<=0))||f.every((t=>t.y>=ko)))&&p.splice(t,1);}var f;let y;if(u)y=wh(p,o,n);else {y=[];for(const t of p)y.push({polygon:t,bounds:o});}const m=h?this.edgeRadius:0;for(const{polygon:t,bounds:e}of y){let r=0,i=0;for(const e of t)h&&!e[0].equals(e[e.length-1])&&e.push(e[0]),i+=h?e.length-1:e.length;const s=this.segments.prepareSegment((h?5:4)*i,this.layoutVertexArray,this.indexArray);if(h){const e=[],i=[];r=s.vertexLength;for(const r of t){let a,o;r.length&&r!==t[0]&&i.push(e.length/2),a=r[1].sub(r[0])._perp()._unit();for(let t=1;t<r.length;t++){const i=r[t],c=r[t===r.length-1?1:t+1];let{x:h,y:p}=i;if(m){o=c.sub(i)._perp()._unit();const t=a.add(o)._unit(),e=m*Math.min(4,1/(a.x*t.x+a.y*t.y));h+=e*t.x,p+=e*t.y,a=o;}ch(this.layoutVertexArray,h,p,0,0,1,1,0),s.vertexLength++,e.push(i.x,i.y),u&&hh(this.layoutVertexExtArray,l.projectTilePoint(h,p,n),l.upVector(n,h,p));}}const a=sc(e,i);for(let t=0;t<a.length;t+=3)this.indexArray.emplaceBack(r+a[t],r+a[t+2],r+a[t+1]),s.primitiveLength++;}for(const i of t){c&&i.length&&c.startRing(i[0]);let t,a,o,p=i.length>4&&xh(i[i.length-2],i[0],i[1]),f=m?yh(i[i.length-2],i[0],i[1],m):0;a=i[1].sub(i[0])._perp()._unit();let d=!0;for(let y=1,g=0;y<i.length;y++){let x=i[y-1],v=i[y];const b=i[y===i.length-1?1:y+1];if(c&&h&&c.currentPolyCount.top++,gh(v,x,e)){m&&(a=b.sub(v)._perp()._unit(),d=!d);continue}c&&c.append(v,x);const w=v.sub(x)._perp(),_=w.x/(Math.abs(w.x)+Math.abs(w.y)),A=w.y>0?1:0,S=x.dist(v);if(g+S>32768&&(g=0),m){o=b.sub(v)._perp()._unit();let t=mh(x,v,b,dh(a,o),m);isNaN(t)&&(t=0);const e=v.sub(x)._unit();x=x.add(e.mult(f))._round(),v=v.add(e.mult(-t))._round(),f=t,a=o;}const k=s.vertexLength,I=i.length>4&&xh(x,v,b);let M=vh(g,p,d);if(ch(this.layoutVertexArray,x.x,x.y,_,A,0,0,M),ch(this.layoutVertexArray,x.x,x.y,_,A,0,1,M),g+=S,M=vh(g,I,!d),p=I,ch(this.layoutVertexArray,v.x,v.y,_,A,0,0,M),ch(this.layoutVertexArray,v.x,v.y,_,A,0,1,M),s.vertexLength+=4,this.indexArray.emplaceBack(k+0,k+1,k+2),this.indexArray.emplaceBack(k+1,k+3,k+2),s.primitiveLength+=2,m){const n=r+(1===y?i.length-2:y-2),a=1===y?r:n+1;if(this.indexArray.emplaceBack(k+1,n,k+3),this.indexArray.emplaceBack(n,a,k+3),s.primitiveLength+=2,void 0===t&&(t=k),!gh(b,i[y],e)){const e=y===i.length-1?t:s.vertexLength;this.indexArray.emplaceBack(k+2,k+3,e),this.indexArray.emplaceBack(k+3,e+1,e),this.indexArray.emplaceBack(k+3,a,e+1),s.primitiveLength+=3;}d=!d;}if(u){const t=this.layoutVertexExtArray,e=l.projectTilePoint(x.x,x.y,n),r=l.projectTilePoint(v.x,v.y,n),i=l.upVector(n,x.x,x.y),s=l.upVector(n,v.x,v.y);hh(t,e,i),hh(t,e,i),hh(t,r,s),hh(t,r,s);}}h&&(r+=i.length-1);}}if(c&&c.polyCount.length>0){if(c.borders){c.vertexArrayOffset=this.centroidVertexArray.length;const t=c.borders,e=this.featuresOnBorder.push(c)-1;for(let r=0;r<4;r++)t[r][0]!==Number.MAX_VALUE&&this.borders[r].push(e);}this.encodeCentroid(c.borders?void 0:c.centroid(),c);}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,s,n);}sortBorders(){for(let t=0;t<4;t++)this.borders[t].sort(((e,r)=>this.featuresOnBorder[e].borders[t][0]-this.featuresOnBorder[r].borders[t][0]));}encodeCentroid(t,e,r=!0){let n,i;if(t)if(0!==t.y){const r=e.span()._mult(this.tileToMeter);n=(Math.max(t.x,1)<<3)+Math.min(7,Math.round(r.x/10)),i=(Math.max(t.y,1)<<3)+Math.min(7,Math.round(r.y/10));}else n=Math.ceil(7*(t.x+450)),i=0;else n=0,i=+r;let s=r?this.centroidVertexArray.length:e.vertexArrayOffset;for(const t of e.polyCount){r&&this.centroidVertexArray.resize(this.centroidVertexArray.length+4*t.edges+t.top);for(let e=0;e<t.top;e++)this.centroidVertexArray.emplace(s++,n,i);for(let e=0;e<2*t.edges;e++)this.centroidVertexArray.emplace(s++,0,i),this.centroidVertexArray.emplace(s++,n,i);}}}function dh(t,e){const r=t.add(e)._unit();return t.x*r.x+t.y*r.y}function yh(t,e,r,n){const i=e.sub(t)._perp()._unit(),s=r.sub(e)._perp()._unit();return mh(t,e,r,dh(i,s),n)}function mh(t,e,r,n,i){const s=Math.sqrt(1-n*n);return Math.min(t.dist(e)/3,e.dist(r)/3,i*s/n)}function gh(t,e,r){return t.x<r[0].x&&e.x<r[0].x||t.x>r[1].x&&e.x>r[1].x||t.y<r[0].y&&e.y<r[0].y||t.y>r[1].y&&e.y>r[1].y}function xh(t,e,r){if(t.x<0||t.x>=ko||e.x<0||e.x>=ko||r.x<0||r.x>=ko)return !1;const n=r.sub(e),i=n.perp(),s=t.sub(e);return (n.x*s.x+n.y*s.y)/Math.sqrt((n.x*n.x+n.y*n.y)*(s.x*s.x+s.y*s.y))>-.866&&i.x*s.x+i.y*s.y<0}function vh(t,e,r){const n=e?2|t:-3&t;return r?1|n:-2&n}function bh(){const t=Math.PI/32,e=Math.tan(t),r=tu;return r*Math.sqrt(1+2*e*e)-r}function wh(t,e,r){const n=1<<r.z,i=ou(r.x/n),s=ou((r.x+1)/n),a=lu(r.y/n),o=lu((r.y+1)/n);return function(t,e,r,n,i=0,s){const a=[];if(!t.length||!r||!n)return a;const o=(t,e)=>{for(const r of t)a.push({polygon:r,bounds:e});},l=Math.ceil(Math.log2(r)),u=Math.ceil(Math.log2(n)),c=l-u,h=[];for(let t=0;t<Math.abs(c);t++)h.push(c>0?0:1);for(let t=0;t<Math.min(l,u);t++)h.push(0),h.push(1);let p=t;if(p=oh(p,e[0].y-i,e[1].y+i,1),p=oh(p,e[0].x-i,e[1].x+i,0),!p.length)return a;const f=[];for(h.length?f.push({polygons:p,bounds:e,depth:0}):o(p,e);f.length;){const t=f.pop(),e=t.depth,r=h[e],n=t.bounds[0],a=t.bounds[1],l=0===r?n.x:n.y,u=0===r?a.x:a.y,c=s?s(r,l,u):.5*(l+u),p=oh(t.polygons,l-i,c+i,r),y=oh(t.polygons,c-i,u+i,r);if(p.length){const t=[n,new d(0===r?c:a.x,1===r?c:a.y)];h.length>e+1?f.push({polygons:p,bounds:t,depth:e+1}):o(p,t);}if(y.length){const t=[new d(0===r?c:n.x,1===r?c:n.y),a];h.length>e+1?f.push({polygons:y,bounds:t,depth:e+1}):o(y,t);}}return a}(t,e,Math.ceil((s-i)/11.25),Math.ceil((a-o)/11.25),1,((t,e,i)=>{if(0===t)return .5*(e+i);{const t=lu((r.y+e/ko)/n);return (su(.5*(lu((r.y+i/ko)/n)+t))*n-r.y)*ko}}))}Oi(fh,\"FillExtrusionBucket\",{omit:[\"layers\",\"features\"]}),Oi(ph,\"PartMetadata\");const _h=new Js({\"fill-extrusion-edge-radius\":new Ys(Ht[\"layout_fill-extrusion\"][\"fill-extrusion-edge-radius\"])});var Ah={paint:new Js({\"fill-extrusion-opacity\":new Ys(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-opacity\"]),\"fill-extrusion-color\":new Hs(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-color\"]),\"fill-extrusion-translate\":new Ys(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-translate\"]),\"fill-extrusion-translate-anchor\":new Ys(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-translate-anchor\"]),\"fill-extrusion-pattern\":new Hs(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-pattern\"]),\"fill-extrusion-height\":new Hs(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-height\"]),\"fill-extrusion-base\":new Hs(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-base\"]),\"fill-extrusion-vertical-gradient\":new Ys(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-vertical-gradient\"]),\"fill-extrusion-ambient-occlusion-intensity\":new Ys(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-intensity\"]),\"fill-extrusion-ambient-occlusion-radius\":new Ys(Ht[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-radius\"])}),layout:_h};function Sh(t,e,r){var n=2*Math.PI*6378137/256/Math.pow(2,r);return [t*n-2*Math.PI*6378137/2,e*n-2*Math.PI*6378137/2]}class kh{constructor(t,e,r){this.z=t,this.x=e,this.y=r,this.key=Th(0,t,t,e,r);}equals(t){return this.z===t.z&&this.x===t.x&&this.y===t.y}url(t,e){const r=function(t,e,r){var n=Sh(256*t,256*(e=Math.pow(2,r)-e-1),r),i=Sh(256*(t+1),256*(e+1),r);return n[0]+\",\"+n[1]+\",\"+i[0]+\",\"+i[1]}(this.x,this.y,this.z),n=function(t,e,r){let n,i=\"\";for(let s=t;s>0;s--)n=1<<s-1,i+=(e&n?1:0)+(r&n?2:0);return i}(this.z,this.x,this.y);return t[(this.x+this.y)%t.length].replace(\"{prefix}\",(this.x%16).toString(16)+(this.y%16).toString(16)).replace(/{z}/g,String(this.z)).replace(/{x}/g,String(this.x)).replace(/{y}/g,String(\"tms\"===e?Math.pow(2,this.z)-this.y-1:this.y)).replace(\"{quadkey}\",n).replace(\"{bbox-epsg-3857}\",r)}toString(){return `${this.z}/${this.x}/${this.y}`}}class Ih{constructor(t,e){this.wrap=t,this.canonical=e,this.key=Th(t,e.z,e.z,e.x,e.y);}}class Mh{constructor(t,e,r,n,i){this.overscaledZ=t,this.wrap=e,this.canonical=new kh(r,+n,+i),this.key=0===e&&t===r?this.canonical.key:Th(e,t,r,n,i);}equals(t){return this.overscaledZ===t.overscaledZ&&this.wrap===t.wrap&&this.canonical.equals(t.canonical)}scaledTo(t){const e=this.canonical.z-t;return t>this.canonical.z?new Mh(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new Mh(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)}calculateScaledKey(t,e=!0){if(this.overscaledZ===t&&e)return this.key;if(t>this.canonical.z)return Th(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y);{const r=this.canonical.z-t;return Th(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)}}isChildOf(t){if(t.wrap!==this.wrap)return !1;const e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ<this.overscaledZ&&t.canonical.x===this.canonical.x>>e&&t.canonical.y===this.canonical.y>>e}children(t){if(this.overscaledZ>=t)return [new Mh(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];const e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return [new Mh(e,this.wrap,e,r,n),new Mh(e,this.wrap,e,r+1,n),new Mh(e,this.wrap,e,r,n+1),new Mh(e,this.wrap,e,r+1,n+1)]}isLessThan(t){return this.wrap<t.wrap||!(this.wrap>t.wrap)&&(this.overscaledZ<t.overscaledZ||!(this.overscaledZ>t.overscaledZ)&&(this.canonical.x<t.canonical.x||!(this.canonical.x>t.canonical.x)&&this.canonical.y<t.canonical.y))}wrapped(){return new Mh(this.overscaledZ,0,this.canonical.z,this.canonical.x,this.canonical.y)}unwrapTo(t){return new Mh(this.overscaledZ,t,this.canonical.z,this.canonical.x,this.canonical.y)}overscaleFactor(){return Math.pow(2,this.overscaledZ-this.canonical.z)}toUnwrapped(){return new Ih(this.wrap,this.canonical)}toString(){return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`}}function Th(t,e,r,n,i){const s=1<<Math.min(r,22);let a=s*(i%s)+n%s;return t&&r<22&&(a+=s*s*((t<0?-2*t-1:2*t)%(1<<2*(22-r)))),16*(32*a+r)+(e-r)}Oi(kh,\"CanonicalTileID\"),Oi(Mh,\"OverscaledTileID\",{omit:[\"projMatrix\"]});class zh extends d{constructor(t,e,r){super(t,e),this.z=r;}}function Bh(t,e){return t.x*e.x+t.y*e.y}function Eh(t,e){if(1===t.length){let r=0;const n=e[r++];let i;for(;!i||n.equals(i);)if(i=e[r++],!i)return 1/0;for(;r<e.length;r++){const s=e[r],a=t[0],o=i.sub(n),l=s.sub(n),u=a.sub(n),c=Bh(o,o),h=Bh(o,l),p=Bh(l,l),f=Bh(u,o),d=Bh(u,l),y=c*p-h*h,m=(p*f-h*d)/y,g=(c*d-h*f)/y,x=n.z*(1-m-g)+i.z*m+s.z*g;if(isFinite(x))return x}return 1/0}{let t=1/0;for(const r of e)t=Math.min(t,r.z);return t}}function Ch(t,e,r,n,i,s,a,o){const l=a*i.getElevationAt(t,e,!0,!0),u=0!==s[0],c=u?0===s[1]?a*(s[0]/7-450):a*function(t,e,r){const n=Math.floor(e[0]/8),i=Math.floor(e[1]/8),s=10*(e[0]-8*n),a=10*(e[1]-8*i),o=t.getElevationAt(n,i,!0,!0),l=t.getMeterToDEM(r),u=Math.floor(.5*(s*l-1)),c=Math.floor(.5*(a*l-1)),h=t.tileCoordToPixel(n,i),p=2*u+1,f=2*c+1,d=function(t,e,r,n,i){return [t.getElevationAtPixel(e,r,!0),t.getElevationAtPixel(e+i,r,!0),t.getElevationAtPixel(e,r+i,!0),t.getElevationAtPixel(e+n,r+i,!0)]}(t,h.x-u,h.y-c,p,f),y=Math.abs(d[0]-d[1]),m=Math.abs(d[2]-d[3]),g=Math.abs(d[0]-d[2])+Math.abs(d[1]-d[3]),x=Math.min(.25,.5*l*(y+m)/p),v=Math.min(.25,.5*l*g/f);return o+Math.max(x*s,v*a)}(i,s,o):l;return {base:l+(0===r)?-1:r,top:u?Math.max(c+n,l+r+2):l+n}}const Ph=na([{name:\"a_pos_normal\",components:2,type:\"Int16\"},{name:\"a_data\",components:4,type:\"Uint8\"},{name:\"a_linesofar\",components:1,type:\"Float32\"}],4),{members:Dh}=Ph,Vh=na([{name:\"a_packed\",components:4,type:\"Float32\"}]),{members:Lh}=Vh,Fh=ah.types,Rh=Math.cos(Math.PI/180*37.5);class jh{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.projection=t.projection,this.hasPattern=!1,this.patternFeatures=[],this.lineClipsArray=[],this.gradients={},this.layers.forEach((t=>{this.gradients[t.id]={};})),this.layoutVertexArray=new la,this.layoutVertexArray2=new ua,this.indexArray=new wa,this.programConfigurations=new fo(t.layers,t.zoom),this.segments=new So,this.maxLineLength=0,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id));}populate(t,e,r,n){this.hasPattern=Rc(\"line\",this.layers,e);const i=this.layers[0].layout.get(\"line-sort-key\"),s=[];for(const{feature:e,id:a,index:o,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,u=wu(e,t);if(!this.layers[0]._featureFilter.filter(new Us(this.zoom),u,r))continue;const c=i?i.evaluate(u,{},r):void 0,h={id:a,properties:e.properties,type:e.type,sourceLayerIndex:l,index:o,geometry:t?u.geometry:bu(e,r,n),patterns:{},sortKey:c};s.push(h);}i&&s.sort(((t,e)=>t.sortKey-e.sortKey));const{lineAtlas:a,featureIndex:o}=e,l=this.addConstantDashes(a);for(const n of s){const{geometry:i,index:s,sourceLayerIndex:u}=n;if(l&&this.addFeatureDashes(n,a),this.hasPattern){const t=jc(\"line\",this.layers,n,this.zoom,e);this.patternFeatures.push(t);}else this.addFeature(n,i,s,r,a.positions,e.availableImages);o.insert(t[s].feature,i,s,u,this.index);}}addConstantDashes(t){let e=!1;for(const r of this.layers){const n=r.paint.get(\"line-dasharray\").value,i=r.layout.get(\"line-cap\").value;if(\"constant\"!==n.kind||\"constant\"!==i.kind)e=!0;else {const e=i.value,r=n.value;if(!r)continue;t.addDash(r,e);}}return e}addFeatureDashes(t,e){const r=this.zoom;for(const n of this.layers){const i=n.paint.get(\"line-dasharray\").value,s=n.layout.get(\"line-cap\").value;if(\"constant\"===i.kind&&\"constant\"===s.kind)continue;let a,o;if(\"constant\"===i.kind){if(a=i.value,!a)continue}else a=i.evaluate({zoom:r},t);o=\"constant\"===s.kind?s.value:s.evaluate({zoom:r},t),e.addDash(a,o),t.patterns[n.id]=e.getKey(a,o);}}update(t,e,r,n){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r,n);}addFeatures(t,e,r,n,i){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r,n);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(0!==this.layoutVertexArray2.length&&(this.layoutVertexBuffer2=t.createVertexBuffer(this.layoutVertexArray2,Lh)),this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Dh),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy());}lineFeatureClips(t){if(t.properties&&t.properties.hasOwnProperty(\"mapbox_clip_start\")&&t.properties.hasOwnProperty(\"mapbox_clip_end\"))return {start:+t.properties.mapbox_clip_start,end:+t.properties.mapbox_clip_end}}addFeature(t,e,r,n,i,s){const a=this.layers[0].layout,o=a.get(\"line-join\").evaluate(t,{}),l=a.get(\"line-cap\").evaluate(t,{}),u=a.get(\"line-miter-limit\"),c=a.get(\"line-round-limit\");this.lineClips=this.lineFeatureClips(t);for(const r of e)this.addLine(r,t,o,l,u,c);this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,s,n);}addLine(t,e,r,n,i,s){if(this.distance=0,this.scaledDistance=0,this.totalDistance=0,this.lineSoFar=0,this.lineClips){this.lineClipsArray.push(this.lineClips);for(let e=0;e<t.length-1;e++)this.totalDistance+=t[e].dist(t[e+1]);this.updateScaledDistance(),this.maxLineLength=Math.max(this.maxLineLength,this.totalDistance);}const a=\"Polygon\"===Fh[e.type];let o=t.length;for(;o>=2&&t[o-1].equals(t[o-2]);)o--;let l=0;for(;l<o-1&&t[l].equals(t[l+1]);)l++;if(o<(a?3:2))return;\"bevel\"===r&&(i=1.05);const u=this.overscaling<=16?122880/(512*this.overscaling):0,c=this.segments.prepareSegment(10*o,this.layoutVertexArray,this.indexArray);let h,p,f,d,y;this.e1=this.e2=-1,a&&(h=t[o-2],y=t[l].sub(h)._unit()._perp());for(let e=l;e<o;e++){if(f=e===o-1?a?t[l+1]:void 0:t[e+1],f&&t[e].equals(f))continue;y&&(d=y),h&&(p=h),h=t[e],y=f?f.sub(h)._unit()._perp():d,d=d||y;let m=d.add(y);0===m.x&&0===m.y||m._unit();const g=d.x*y.x+d.y*y.y,x=m.x*y.x+m.y*y.y,v=0!==x?1/x:1/0,b=2*Math.sqrt(2-2*x),w=x<Rh&&p&&f,_=d.x*y.y-d.y*y.x>0;if(w&&e>l){const t=h.dist(p);if(t>2*u){const e=h.sub(h.sub(p)._mult(u/t)._round());this.updateDistance(p,e),this.addCurrentVertex(e,d,0,0,c),p=e;}}const A=p&&f;let S=A?r:a?\"butt\":n;if(A&&\"round\"===S&&(v<s?S=\"miter\":v<=2&&(S=\"fakeround\")),\"miter\"===S&&v>i&&(S=\"bevel\"),\"bevel\"===S&&(v>2&&(S=\"flipbevel\"),v<i&&(S=\"miter\")),p&&this.updateDistance(p,h),\"miter\"===S)m._mult(v),this.addCurrentVertex(h,m,0,0,c);else if(\"flipbevel\"===S){if(v>100)m=y.mult(-1);else {const t=v*d.add(y).mag()/d.sub(y).mag();m._perp()._mult(t*(_?-1:1));}this.addCurrentVertex(h,m,0,0,c),this.addCurrentVertex(h,m.mult(-1),0,0,c);}else if(\"bevel\"===S||\"fakeround\"===S){const t=-Math.sqrt(v*v-1),e=_?t:0,r=_?0:t;if(p&&this.addCurrentVertex(h,d,e,r,c),\"fakeround\"===S){const t=Math.round(180*b/Math.PI/20);for(let e=1;e<t;e++){let r=e/t;if(.5!==r){const t=r-.5;r+=r*t*(r-1)*((1.0904+g*(g*(3.55645-1.43519*g)-3.2452))*t*t+(.848013+g*(.215638*g-1.06021)));}const n=y.sub(d)._mult(r)._add(d)._unit()._mult(_?-1:1);this.addHalfVertex(h,n.x,n.y,!1,_,0,c);}}f&&this.addCurrentVertex(h,y,-e,-r,c);}else if(\"butt\"===S)this.addCurrentVertex(h,m,0,0,c);else if(\"square\"===S){const t=p?1:-1;p||this.addCurrentVertex(h,m,t,t,c),this.addCurrentVertex(h,m,0,0,c),p&&this.addCurrentVertex(h,m,t,t,c);}else \"round\"===S&&(p&&(this.addCurrentVertex(h,d,0,0,c),this.addCurrentVertex(h,d,1,1,c,!0)),f&&(this.addCurrentVertex(h,y,-1,-1,c,!0),this.addCurrentVertex(h,y,0,0,c)));if(w&&e<o-1){const t=h.dist(f);if(t>2*u){const e=h.add(f.sub(h)._mult(u/t)._round());this.updateDistance(h,e),this.addCurrentVertex(e,y,0,0,c),h=e;}}}}addCurrentVertex(t,e,r,n,i,s=!1){const a=e.y*n-e.x,o=-e.y-e.x*n;this.addHalfVertex(t,e.x+e.y*r,e.y-e.x*r,s,!1,r,i),this.addHalfVertex(t,a,o,s,!0,-n,i);}addHalfVertex({x:t,y:e},r,n,i,s,a,o){this.layoutVertexArray.emplaceBack((t<<1)+(i?1:0),(e<<1)+(s?1:0),Math.round(63*r)+128,Math.round(63*n)+128,1+(0===a?0:a<0?-1:1),0,this.lineSoFar),this.lineClips&&this.layoutVertexArray2.emplaceBack(this.scaledDistance,this.lineClipsArray.length,this.lineClips.start,this.lineClips.end);const l=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,l),o.primitiveLength++),s?this.e2=l:this.e1=l;}updateScaledDistance(){if(this.lineClips){const t=this.totalDistance/(this.lineClips.end-this.lineClips.start);this.scaledDistance=this.distance/this.totalDistance,this.lineSoFar=t*this.lineClips.start+this.distance;}else this.lineSoFar=this.distance;}updateDistance(t,e){this.distance+=t.dist(e),this.updateScaledDistance();}}Oi(jh,\"LineBucket\",{omit:[\"layers\",\"patternFeatures\"]});const Uh=new Js({\"line-cap\":new Hs(Ht.layout_line[\"line-cap\"]),\"line-join\":new Hs(Ht.layout_line[\"line-join\"]),\"line-miter-limit\":new Ys(Ht.layout_line[\"line-miter-limit\"]),\"line-round-limit\":new Ys(Ht.layout_line[\"line-round-limit\"]),\"line-sort-key\":new Hs(Ht.layout_line[\"line-sort-key\"])});var $h={paint:new Js({\"line-opacity\":new Hs(Ht.paint_line[\"line-opacity\"]),\"line-color\":new Hs(Ht.paint_line[\"line-color\"]),\"line-translate\":new Ys(Ht.paint_line[\"line-translate\"]),\"line-translate-anchor\":new Ys(Ht.paint_line[\"line-translate-anchor\"]),\"line-width\":new Hs(Ht.paint_line[\"line-width\"]),\"line-gap-width\":new Hs(Ht.paint_line[\"line-gap-width\"]),\"line-offset\":new Hs(Ht.paint_line[\"line-offset\"]),\"line-blur\":new Hs(Ht.paint_line[\"line-blur\"]),\"line-dasharray\":new Hs(Ht.paint_line[\"line-dasharray\"]),\"line-pattern\":new Hs(Ht.paint_line[\"line-pattern\"]),\"line-gradient\":new Ws(Ht.paint_line[\"line-gradient\"]),\"line-trim-offset\":new Ys(Ht.paint_line[\"line-trim-offset\"])}),layout:Uh};const Oh=new class extends Hs{possiblyEvaluate(t,e){return e=new Us(Math.floor(e.zoom),{now:e.now,fadeDuration:e.fadeDuration,transition:e.transition}),super.possiblyEvaluate(t,e)}evaluate(t,e,r,n){return e=z({},e,{zoom:Math.floor(e.zoom)}),super.evaluate(t,e,r,n)}}($h.paint.properties[\"line-width\"].specification);function qh(t,e){return e>0?e+2*t:t}Oh.useIntegerZoom=!0;const Nh=na([{name:\"a_pos_offset\",components:4,type:\"Int16\"},{name:\"a_tex_size\",components:4,type:\"Uint16\"},{name:\"a_pixeloffset\",components:4,type:\"Int16\"}],4),Gh=na([{name:\"a_globe_anchor\",components:3,type:\"Int16\"},{name:\"a_globe_normal\",components:3,type:\"Float32\"}],4),Xh=na([{name:\"a_projected_pos\",components:4,type:\"Float32\"}],4);na([{name:\"a_fade_opacity\",components:1,type:\"Uint32\"}],4);const Zh=na([{name:\"a_placed\",components:2,type:\"Uint8\"},{name:\"a_shift\",components:2,type:\"Float32\"}]),Kh=na([{name:\"a_size_scale\",components:1,type:\"Float32\"},{name:\"a_padding\",components:2,type:\"Float32\"}]);na([{type:\"Int16\",name:\"projectedAnchorX\"},{type:\"Int16\",name:\"projectedAnchorY\"},{type:\"Int16\",name:\"projectedAnchorZ\"},{type:\"Int16\",name:\"tileAnchorX\"},{type:\"Int16\",name:\"tileAnchorY\"},{type:\"Float32\",name:\"x1\"},{type:\"Float32\",name:\"y1\"},{type:\"Float32\",name:\"x2\"},{type:\"Float32\",name:\"y2\"},{type:\"Int16\",name:\"padding\"},{type:\"Uint32\",name:\"featureIndex\"},{type:\"Uint16\",name:\"sourceLayerIndex\"},{type:\"Uint16\",name:\"bucketIndex\"}]);const Yh=na([{name:\"a_pos\",components:3,type:\"Int16\"},{name:\"a_anchor_pos\",components:2,type:\"Int16\"},{name:\"a_extrude\",components:2,type:\"Int16\"}],4),Hh=na([{name:\"a_pos_2f\",components:2,type:\"Float32\"},{name:\"a_radius\",components:1,type:\"Float32\"},{name:\"a_flags\",components:2,type:\"Int16\"}],4);na([{name:\"triangle\",components:3,type:\"Uint16\"}]),na([{type:\"Int16\",name:\"projectedAnchorX\"},{type:\"Int16\",name:\"projectedAnchorY\"},{type:\"Int16\",name:\"projectedAnchorZ\"},{type:\"Float32\",name:\"tileAnchorX\"},{type:\"Float32\",name:\"tileAnchorY\"},{type:\"Uint16\",name:\"glyphStartIndex\"},{type:\"Uint16\",name:\"numGlyphs\"},{type:\"Uint32\",name:\"vertexStartIndex\"},{type:\"Uint32\",name:\"lineStartIndex\"},{type:\"Uint32\",name:\"lineLength\"},{type:\"Uint16\",name:\"segment\"},{type:\"Uint16\",name:\"lowerSize\"},{type:\"Uint16\",name:\"upperSize\"},{type:\"Float32\",name:\"lineOffsetX\"},{type:\"Float32\",name:\"lineOffsetY\"},{type:\"Uint8\",name:\"writingMode\"},{type:\"Uint8\",name:\"placedOrientation\"},{type:\"Uint8\",name:\"hidden\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Int16\",name:\"associatedIconIndex\"},{type:\"Uint8\",name:\"flipState\"}]),na([{type:\"Int16\",name:\"projectedAnchorX\"},{type:\"Int16\",name:\"projectedAnchorY\"},{type:\"Int16\",name:\"projectedAnchorZ\"},{type:\"Float32\",name:\"tileAnchorX\"},{type:\"Float32\",name:\"tileAnchorY\"},{type:\"Int16\",name:\"rightJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"centerJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"leftJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedTextSymbolIndex\"},{type:\"Int16\",name:\"placedIconSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedIconSymbolIndex\"},{type:\"Uint16\",name:\"key\"},{type:\"Uint16\",name:\"textBoxStartIndex\"},{type:\"Uint16\",name:\"textBoxEndIndex\"},{type:\"Uint16\",name:\"verticalTextBoxStartIndex\"},{type:\"Uint16\",name:\"verticalTextBoxEndIndex\"},{type:\"Uint16\",name:\"iconBoxStartIndex\"},{type:\"Uint16\",name:\"iconBoxEndIndex\"},{type:\"Uint16\",name:\"verticalIconBoxStartIndex\"},{type:\"Uint16\",name:\"verticalIconBoxEndIndex\"},{type:\"Uint16\",name:\"featureIndex\"},{type:\"Uint16\",name:\"numHorizontalGlyphVertices\"},{type:\"Uint16\",name:\"numVerticalGlyphVertices\"},{type:\"Uint16\",name:\"numIconVertices\"},{type:\"Uint16\",name:\"numVerticalIconVertices\"},{type:\"Uint16\",name:\"useRuntimeCollisionCircles\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Float32\",components:2,name:\"textOffset\"},{type:\"Float32\",name:\"collisionCircleDiameter\"}]),na([{type:\"Float32\",name:\"offsetX\"}]),na([{type:\"Int16\",name:\"x\"},{type:\"Int16\",name:\"y\"}]);var Wh=24;const Jh=128;function Qh(t,e){const{expression:r}=e;if(\"constant\"===r.kind)return {kind:\"constant\",layoutSize:r.evaluate(new Us(t+1))};if(\"source\"===r.kind)return {kind:\"source\"};{const{zoomStops:e,interpolationType:n}=r;let i=0;for(;i<e.length&&e[i]<=t;)i++;i=Math.max(0,i-1);let s=i;for(;s<e.length&&e[s]<t+1;)s++;s=Math.min(e.length-1,s);const a=e[i],o=e[s];return \"composite\"===r.kind?{kind:\"composite\",minZoom:a,maxZoom:o,interpolationType:n}:{kind:\"camera\",minZoom:a,maxZoom:o,minSize:r.evaluate(new Us(a)),maxSize:r.evaluate(new Us(o)),interpolationType:n}}}function tp(t,{uSize:e,uSizeT:r},{lowerSize:n,upperSize:i}){return \"source\"===t.kind?n/Jh:\"composite\"===t.kind?Mr(n/Jh,i/Jh,r):e}function ep(t,e){let r=0,n=0;if(\"constant\"===t.kind)n=t.layoutSize;else if(\"source\"!==t.kind){const{interpolationType:i,minZoom:s,maxZoom:a}=t,o=i?S(Kr.interpolationFactor(i,e,s,a),0,1):0;\"camera\"===t.kind?n=Mr(t.minSize,t.maxSize,o):r=o;}return {uSizeT:r,uSize:n}}var rp=Object.freeze({__proto__:null,getSizeData:Qh,evaluateSizeForFeature:tp,evaluateSizeForZoom:ep,SIZE_PACK_FACTOR:Jh});function np(t,e,r){return t.sections.forEach((t=>{t.text=function(t,e,r){const n=e.layout.get(\"text-transform\").evaluate(r,{});return \"uppercase\"===n?t=t.toLocaleUpperCase():\"lowercase\"===n&&(t=t.toLocaleLowerCase()),js.applyArabicShaping&&(t=js.applyArabicShaping(t)),t}(t.text,e,r);})),t}const ip={\"!\":\"︕\",\"#\":\"＃\",$:\"＄\",\"%\":\"％\",\"&\":\"＆\",\"(\":\"︵\",\")\":\"︶\",\"*\":\"＊\",\"+\":\"＋\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\"/\":\"／\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\"=\":\"＝\",\">\":\"﹀\",\"?\":\"︖\",\"@\":\"＠\",\"[\":\"﹇\",\"\\\\\":\"＼\",\"]\":\"﹈\",\"^\":\"＾\",_:\"︳\",\"`\":\"｀\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"~\":\"～\",\"¢\":\"￠\",\"£\":\"￡\",\"¥\":\"￥\",\"¦\":\"￤\",\"¬\":\"￢\",\"¯\":\"￣\",\"–\":\"︲\",\"—\":\"︱\",\"‘\":\"﹃\",\"’\":\"﹄\",\"“\":\"﹁\",\"”\":\"﹂\",\"…\":\"︙\",\"‧\":\"・\",\"₩\":\"￦\",\"、\":\"︑\",\"。\":\"︒\",\"〈\":\"︿\",\"〉\":\"﹀\",\"《\":\"︽\",\"》\":\"︾\",\"「\":\"﹁\",\"」\":\"﹂\",\"『\":\"﹃\",\"』\":\"﹄\",\"【\":\"︻\",\"】\":\"︼\",\"〔\":\"︹\",\"〕\":\"︺\",\"〖\":\"︗\",\"〗\":\"︘\",\"！\":\"︕\",\"（\":\"︵\",\"）\":\"︶\",\"，\":\"︐\",\"－\":\"︲\",\"．\":\"・\",\"：\":\"︓\",\"；\":\"︔\",\"＜\":\"︿\",\"＞\":\"﹀\",\"？\":\"︖\",\"［\":\"﹇\",\"］\":\"﹈\",\"＿\":\"︳\",\"｛\":\"︷\",\"｜\":\"―\",\"｝\":\"︸\",\"｟\":\"︵\",\"｠\":\"︶\",\"｡\":\"︒\",\"｢\":\"﹁\",\"｣\":\"﹂\"};function sp(t){return \"︶\"===t||\"﹈\"===t||\"︸\"===t||\"﹄\"===t||\"﹂\"===t||\"︾\"===t||\"︼\"===t||\"︺\"===t||\"︘\"===t||\"﹀\"===t||\"︐\"===t||\"︓\"===t||\"︔\"===t||\"｀\"===t||\"￣\"===t||\"︑\"===t||\"︒\"===t}function ap(t){return \"︵\"===t||\"﹇\"===t||\"︷\"===t||\"﹃\"===t||\"﹁\"===t||\"︽\"===t||\"︻\"===t||\"︹\"===t||\"︗\"===t||\"︿\"===t}var op=cp,lp=function(t,e,r,n,i){var s,a,o=8*i-n-1,l=(1<<o)-1,u=l>>1,c=-7,h=r?i-1:0,p=r?-1:1,f=t[e+h];for(h+=p,s=f&(1<<-c)-1,f>>=-c,c+=o;c>0;s=256*s+t[e+h],h+=p,c-=8);for(a=s&(1<<-c)-1,s>>=-c,c+=n;c>0;a=256*a+t[e+h],h+=p,c-=8);if(0===s)s=1-u;else {if(s===l)return a?NaN:1/0*(f?-1:1);a+=Math.pow(2,n),s-=u;}return (f?-1:1)*a*Math.pow(2,s-n)},up=function(t,e,r,n,i,s){var a,o,l,u=8*s-i-1,c=(1<<u)-1,h=c>>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:s-1,d=n?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-a))<1&&(a--,l*=2),(e+=a+h>=1?p/l:p*Math.pow(2,1-h))*l>=2&&(a++,l/=2),a+h>=c?(o=0,a=c):a+h>=1?(o=(e*l-1)*Math.pow(2,i),a+=h):(o=e*Math.pow(2,h-1)*Math.pow(2,i),a=0));i>=8;t[r+f]=255&o,f+=d,o/=256,i-=8);for(a=a<<i|o,u+=i;u>0;t[r+f]=255&a,f+=d,a/=256,u-=8);t[r+f-d]|=128*y;};\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */function cp(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length;}cp.Varint=0,cp.Fixed64=1,cp.Bytes=2,cp.Fixed32=5;var hp=4294967296,pp=1/hp,fp=\"undefined\"==typeof TextDecoder?null:new TextDecoder(\"utf8\");function dp(t){return t.type===cp.Bytes?t.readVarint()+t.pos:t.pos+1}function yp(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function mp(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i];}function gp(t,e){for(var r=0;r<t.length;r++)e.writeVarint(t[r]);}function xp(t,e){for(var r=0;r<t.length;r++)e.writeSVarint(t[r]);}function vp(t,e){for(var r=0;r<t.length;r++)e.writeFloat(t[r]);}function bp(t,e){for(var r=0;r<t.length;r++)e.writeDouble(t[r]);}function wp(t,e){for(var r=0;r<t.length;r++)e.writeBoolean(t[r]);}function _p(t,e){for(var r=0;r<t.length;r++)e.writeFixed32(t[r]);}function Ap(t,e){for(var r=0;r<t.length;r++)e.writeSFixed32(t[r]);}function Sp(t,e){for(var r=0;r<t.length;r++)e.writeFixed64(t[r]);}function kp(t,e){for(var r=0;r<t.length;r++)e.writeSFixed64(t[r]);}function Ip(t,e){return (t[e]|t[e+1]<<8|t[e+2]<<16)+16777216*t[e+3]}function Mp(t,e,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24;}function Tp(t,e){return (t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}function zp(t,e,r){e.glyphs=[],1===t&&r.readMessage(Bp,e);}function Bp(t,e,r){if(3===t){const{id:t,bitmap:n,width:i,height:s,left:a,top:o,advance:l}=r.readMessage(Ep,{});e.glyphs.push({id:t,bitmap:new Ju({width:i+6,height:s+6},n),metrics:{width:i,height:s,left:a,top:o,advance:l}});}else 4===t?e.ascender=r.readSVarint():5===t&&(e.descender=r.readSVarint());}function Ep(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint());}function Cp(t){let e=0,r=0;for(const n of t)e+=n.w*n.h,r=Math.max(r,n.w);t.sort(((t,e)=>e.h-t.h));const n=[{x:0,y:0,w:Math.max(Math.ceil(Math.sqrt(e/.95)),r),h:1/0}];let i=0,s=0;for(const e of t)for(let t=n.length-1;t>=0;t--){const r=n[t];if(!(e.w>r.w||e.h>r.h)){if(e.x=r.x,e.y=r.y,s=Math.max(s,e.y+e.h),i=Math.max(i,e.x+e.w),e.w===r.w&&e.h===r.h){const e=n.pop();t<n.length&&(n[t]=e);}else e.h===r.h?(r.x+=e.w,r.w-=e.w):e.w===r.w?(r.y+=e.h,r.h-=e.h):(n.push({x:r.x+e.w,y:r.y,w:r.w-e.w,h:e.h}),r.y+=e.h,r.h-=e.h);break}}return {w:i,h:s,fill:e/(i*s)||0}}cp.prototype={destroy:function(){this.buf=null;},readFields:function(t,e,r){for(r=r||this.length;this.pos<r;){var n=this.readVarint(),i=n>>3,s=this.pos;this.type=7&n,t(i,e,this),this.pos===s&&this.skip(n);}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Ip(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Tp(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Ip(this.buf,this.pos)+Ip(this.buf,this.pos+4)*hp;return this.pos+=8,t},readSFixed64:function(){var t=Ip(this.buf,this.pos)+Tp(this.buf,this.pos+4)*hp;return this.pos+=8,t},readFloat:function(){var t=lp(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=lp(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,s=r.buf;if(n=(112&(i=s[r.pos++]))>>4,i<128)return yp(t,n,e);if(n|=(127&(i=s[r.pos++]))<<3,i<128)return yp(t,n,e);if(n|=(127&(i=s[r.pos++]))<<10,i<128)return yp(t,n,e);if(n|=(127&(i=s[r.pos++]))<<17,i<128)return yp(t,n,e);if(n|=(127&(i=s[r.pos++]))<<24,i<128)return yp(t,n,e);if(n|=(1&(i=s[r.pos++]))<<31,i<128)return yp(t,n,e);throw new Error(\"Expected varint not more than 10 bytes\")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&fp?function(t,e,r){return fp.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var n=\"\",i=e;i<r;){var s,a,o,l=t[i],u=null,c=l>239?4:l>223?3:l>191?2:1;if(i+c>r)break;1===c?l<128&&(u=l):2===c?128==(192&(s=t[i+1]))&&(u=(31&l)<<6|63&s)<=127&&(u=null):3===c?(a=t[i+2],128==(192&(s=t[i+1]))&&128==(192&a)&&((u=(15&l)<<12|(63&s)<<6|63&a)<=2047||u>=55296&&u<=57343)&&(u=null)):4===c&&(a=t[i+2],o=t[i+3],128==(192&(s=t[i+1]))&&128==(192&a)&&128==(192&o)&&((u=(15&l)<<18|(63&s)<<12|(63&a)<<6|63&o)<=65535||u>=1114112)&&(u=null)),null===u?(u=65533,c=1):u>65535&&(u-=65536,n+=String.fromCharCode(u>>>10&1023|55296),u=56320|1023&u),n+=String.fromCharCode(u),i+=c;}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==cp.Bytes)return t.push(this.readVarint(e));var r=dp(this);for(t=t||[];this.pos<r;)t.push(this.readVarint(e));return t},readPackedSVarint:function(t){if(this.type!==cp.Bytes)return t.push(this.readSVarint());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readSVarint());return t},readPackedBoolean:function(t){if(this.type!==cp.Bytes)return t.push(this.readBoolean());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readBoolean());return t},readPackedFloat:function(t){if(this.type!==cp.Bytes)return t.push(this.readFloat());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readFloat());return t},readPackedDouble:function(t){if(this.type!==cp.Bytes)return t.push(this.readDouble());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readDouble());return t},readPackedFixed32:function(t){if(this.type!==cp.Bytes)return t.push(this.readFixed32());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readFixed32());return t},readPackedSFixed32:function(t){if(this.type!==cp.Bytes)return t.push(this.readSFixed32());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed32());return t},readPackedFixed64:function(t){if(this.type!==cp.Bytes)return t.push(this.readFixed64());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readFixed64());return t},readPackedSFixed64:function(t){if(this.type!==cp.Bytes)return t.push(this.readSFixed64());var e=dp(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed64());return t},skip:function(t){var e=7&t;if(e===cp.Varint)for(;this.buf[this.pos++]>127;);else if(e===cp.Bytes)this.pos=this.readVarint()+this.pos;else if(e===cp.Fixed32)this.pos+=4;else {if(e!==cp.Fixed64)throw new Error(\"Unimplemented type: \"+e);this.pos+=8;}},writeTag:function(t,e){this.writeVarint(t<<3|e);},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var r=new Uint8Array(e);r.set(this.buf),this.buf=r,this.length=e;}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(t){this.realloc(4),Mp(this.buf,t,this.pos),this.pos+=4;},writeSFixed32:function(t){this.realloc(4),Mp(this.buf,t,this.pos),this.pos+=4;},writeFixed64:function(t){this.realloc(8),Mp(this.buf,-1&t,this.pos),Mp(this.buf,Math.floor(t*pp),this.pos+4),this.pos+=8;},writeSFixed64:function(t){this.realloc(8),Mp(this.buf,-1&t,this.pos),Mp(this.buf,Math.floor(t*pp),this.pos+4),this.pos+=8;},writeVarint:function(t){(t=+t||0)>268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error(\"Given varint doesn't fit into 10 bytes\");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,r.buf[r.pos]=127&(t>>>=7);}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))));}(n,e);}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))));},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t);},writeBoolean:function(t){this.writeVarint(Boolean(t));},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,s=0;s<e.length;s++){if((n=e.charCodeAt(s))>55295&&n<57344){if(!i){n>56319||s+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null;}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128);}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&mp(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r;},writeFloat:function(t){this.realloc(4),up(this.buf,t,this.pos,!0,23,4),this.pos+=4;},writeDouble:function(t){this.realloc(8),up(this.buf,t,this.pos,!0,52,8),this.pos+=8;},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r<e;r++)this.buf[this.pos++]=t[r];},writeRawMessage:function(t,e){this.pos++;var r=this.pos;t(e,this);var n=this.pos-r;n>=128&&mp(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n;},writeMessage:function(t,e,r){this.writeTag(t,cp.Bytes),this.writeRawMessage(e,r);},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,gp,e);},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,xp,e);},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,wp,e);},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,vp,e);},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,bp,e);},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,_p,e);},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,Ap,e);},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,Sp,e);},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,kp,e);},writeBytesField:function(t,e){this.writeTag(t,cp.Bytes),this.writeBytes(e);},writeFixed32Field:function(t,e){this.writeTag(t,cp.Fixed32),this.writeFixed32(e);},writeSFixed32Field:function(t,e){this.writeTag(t,cp.Fixed32),this.writeSFixed32(e);},writeFixed64Field:function(t,e){this.writeTag(t,cp.Fixed64),this.writeFixed64(e);},writeSFixed64Field:function(t,e){this.writeTag(t,cp.Fixed64),this.writeSFixed64(e);},writeVarintField:function(t,e){this.writeTag(t,cp.Varint),this.writeVarint(e);},writeSVarintField:function(t,e){this.writeTag(t,cp.Varint),this.writeSVarint(e);},writeStringField:function(t,e){this.writeTag(t,cp.Bytes),this.writeString(e);},writeFloatField:function(t,e){this.writeTag(t,cp.Fixed32),this.writeFloat(e);},writeDoubleField:function(t,e){this.writeTag(t,cp.Fixed64),this.writeDouble(e);},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e));}};class Pp{constructor(t,{pixelRatio:e,version:r,stretchX:n,stretchY:i,content:s}){this.paddedRect=t,this.pixelRatio=e,this.stretchX=n,this.stretchY=i,this.content=s,this.version=r;}get tl(){return [this.paddedRect.x+1,this.paddedRect.y+1]}get br(){return [this.paddedRect.x+this.paddedRect.w-1,this.paddedRect.y+this.paddedRect.h-1]}get displaySize(){return [(this.paddedRect.w-2)/this.pixelRatio,(this.paddedRect.h-2)/this.pixelRatio]}}class Dp{constructor(t,e){const r={},n={};this.haveRenderCallbacks=[];const i=[];this.addImages(t,r,i),this.addImages(e,n,i);const{w:s,h:a}=Cp(i),o=new Qu({width:s||1,height:a||1});for(const e in t){const n=t[e],i=r[e].paddedRect;Qu.copy(n.data,o,{x:0,y:0},{x:i.x+1,y:i.y+1},n.data);}for(const t in e){const r=e[t],i=n[t].paddedRect,s=i.x+1,a=i.y+1,l=r.data.width,u=r.data.height;Qu.copy(r.data,o,{x:0,y:0},{x:s,y:a},r.data),Qu.copy(r.data,o,{x:0,y:u-1},{x:s,y:a-1},{width:l,height:1}),Qu.copy(r.data,o,{x:0,y:0},{x:s,y:a+u},{width:l,height:1}),Qu.copy(r.data,o,{x:l-1,y:0},{x:s-1,y:a},{width:1,height:u}),Qu.copy(r.data,o,{x:0,y:0},{x:s+l,y:a},{width:1,height:u});}this.image=o,this.iconPositions=r,this.patternPositions=n;}addImages(t,e,r){for(const n in t){const i=t[n],s={x:0,y:0,w:i.data.width+2,h:i.data.height+2};r.push(s),e[n]=new Pp(s,i),i.hasRenderCallback&&this.haveRenderCallbacks.push(n);}}patchUpdatedImages(t,e){this.haveRenderCallbacks=this.haveRenderCallbacks.filter((e=>t.hasImage(e))),t.dispatchRenderCallbacks(this.haveRenderCallbacks);for(const r in t.updatedImages)this.patchUpdatedImage(this.iconPositions[r],t.getImage(r),e),this.patchUpdatedImage(this.patternPositions[r],t.getImage(r),e);}patchUpdatedImage(t,e,r){if(!t||!e)return;if(t.version===e.version)return;t.version=e.version;const[n,i]=t.tl;r.update(e.data,void 0,{x:n,y:i});}}Oi(Pp,\"ImagePosition\"),Oi(Dp,\"ImageAtlas\");const Vp={horizontal:1,vertical:2,horizontalOnly:3};class Lp{constructor(){this.scale=1,this.fontStack=\"\",this.imageName=null;}static forText(t,e){const r=new Lp;return r.scale=t||1,r.fontStack=e,r}static forImage(t){const e=new Lp;return e.imageName=t,e}}class Fp{constructor(){this.text=\"\",this.sectionIndex=[],this.sections=[],this.imageSectionID=null;}static fromFeature(t,e){const r=new Fp;for(let n=0;n<t.sections.length;n++){const i=t.sections[n];i.image?r.addImageSection(i):r.addTextSection(i,e);}return r}length(){return this.text.length}getSection(t){return this.sections[this.sectionIndex[t]]}getSections(){return this.sections}getSectionIndex(t){return this.sectionIndex[t]}getCharCode(t){return this.text.charCodeAt(t)}verticalizePunctuation(t){this.text=function(t,e){let r=\"\";for(let n=0;n<t.length;n++){const i=t.charCodeAt(n+1)||null,s=t.charCodeAt(n-1)||null;r+=!e&&(i&&Ss(i)&&!ip[t[n+1]]||s&&Ss(s)&&!ip[t[n-1]])||!ip[t[n]]?t[n]:ip[t[n]];}return r}(this.text,t);}trim(){let t=0;for(let e=0;e<this.text.length&&jp[this.text.charCodeAt(e)];e++)t++;let e=this.text.length;for(let r=this.text.length-1;r>=0&&r>=t&&jp[this.text.charCodeAt(r)];r--)e--;this.text=this.text.substring(t,e),this.sectionIndex=this.sectionIndex.slice(t,e);}substring(t,e){const r=new Fp;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r}toString(){return this.text}getMaxScale(){return this.sectionIndex.reduce(((t,e)=>Math.max(t,this.sections[e].scale)),0)}addTextSection(t,e){this.text+=t.text,this.sections.push(Lp.forText(t.scale,t.fontStack||e));const r=this.sections.length-1;for(let e=0;e<t.text.length;++e)this.sectionIndex.push(r);}addImageSection(t){const e=t.image?t.image.name:\"\";if(0===e.length)return void $(\"Can't add FormattedSection with an empty image.\");const r=this.getNextImageSectionCharCode();r?(this.text+=String.fromCharCode(r),this.sections.push(Lp.forImage(e)),this.sectionIndex.push(this.sections.length-1)):$(\"Reached maximum number of images 6401\");}getNextImageSectionCharCode(){return this.imageSectionID?this.imageSectionID>=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)}}function Rp(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d){const y=Fp.fromFeature(t,i);h===Vp.vertical&&y.verticalizePunctuation(p);let m=[];const g=function(t,e,r,n,i,s){if(!t)return [];const a=[],o=function(t,e,r,n,i,s){let a=0;for(let r=0;r<t.length();r++){const o=t.getSection(r);a+=$p(t.getCharCode(r),o,n,i,e,s);}return a/Math.max(1,Math.ceil(a/r))}(t,e,r,n,i,s),l=t.text.indexOf(\"​\")>=0;let u=0;for(let r=0;r<t.length();r++){const h=t.getSection(r),p=t.getCharCode(r);if(jp[p]||(u+=$p(p,h,n,i,e,s)),r<t.length()-1){const e=!((c=p)<11904||!(ns(c)||rs(c)||ms(c)||fs(c)||os(c)||Hi(c)||is(c)||Qi(c)||ls(c)||us(c)||as(c)||vs(c)||ts(c)||Ji(c)||Wi(c)||ss(c)||es(c)||ys(c)||hs(c)||cs(c)));(Up[p]||e||h.imageName)&&a.push(Np(r+1,u,o,a,qp(p,t.getCharCode(r+1),e&&l),!1));}}var c;return Gp(Np(t.length(),u,o,a,0,!0))}(y,u,s,e,n,f),{processBidirectionalText:x,processStyledBidirectionalText:v}=js;if(x&&1===y.sections.length){const t=x(y.toString(),g);for(const e of t){const t=new Fp;t.text=e,t.sections=y.sections;for(let r=0;r<e.length;r++)t.sectionIndex.push(0);m.push(t);}}else if(v){const t=v(y.text,y.sectionIndex,g);for(const e of t){const t=new Fp;t.text=e[0],t.sectionIndex=e[1],t.sections=y.sections,m.push(t);}}else m=function(t,e){const r=[],n=t.text;let i=0;for(const n of e)r.push(t.substring(i,n)),i=n;return i<n.length&&r.push(t.substring(i,n.length)),r}(y,g);const b=[],w={positionedLines:b,text:y.toString(),top:c[1],bottom:c[1],left:c[0],right:c[0],writingMode:h,iconsInText:!1,verticalizable:!1,hasBaseline:!1};return function(t,e,r,n,i,s,a,o,l,u,c,h){let p=0,f=0,d=0;const y=\"right\"===o?1:\"left\"===o?0:.5;let m=!1;for(const t of i){const r=t.getSections();for(const t of r){if(t.imageName)continue;const r=e[t.fontStack];if(r&&(m=void 0!==r.ascender&&void 0!==r.descender,!m))break}if(!m)break}let g=0;for(const a of i){a.trim();const i=a.getMaxScale(),o=(i-1)*Wh,v={positionedGlyphs:[],lineOffset:0};t.positionedLines[g]=v;const b=v.positionedGlyphs;let w=0;if(!a.length()){f+=s,++g;continue}let _=0,A=0;for(let s=0;s<a.length();s++){const o=a.getSection(s),d=a.getSectionIndex(s),y=a.getCharCode(s);let g=o.scale,v=null,S=null,k=null,I=Wh,M=0;const T=!(l===Vp.horizontal||!c&&!As(y)||c&&(jp[y]||(x=y,Zi(x)||Ki(x)||Yi(x)||ds(x)||xs(x))));if(o.imageName){const e=n[o.imageName];if(!e)continue;k=o.imageName,t.iconsInText=t.iconsInText||!0,S=e.paddedRect;const r=e.displaySize;g=g*Wh/h,v={width:r[0],height:r[1],left:1,top:-3,advance:T?r[1]:r[0],localGlyph:!1},M=m?-v.height*g:i*Wh-17-r[1]*g,I=v.advance;const s=(T?r[0]:r[1])*g-Wh*i;s>0&&s>w&&(w=s);}else {const t=r[o.fontStack];if(!t)continue;t[y]&&(S=t[y]);const n=e[o.fontStack];if(!n)continue;const s=n.glyphs[y];if(!s)continue;if(v=s.metrics,I=8203!==y?Wh:0,m){const t=void 0!==n.ascender?Math.abs(n.ascender):0,e=void 0!==n.descender?Math.abs(n.descender):0,r=(t+e)*g;_<r&&(_=r,A=(t-e)/2*g),M=-t*g;}else M=(i-g)*Wh-17;}T?(t.verticalizable=!0,b.push({glyph:y,imageName:k,x:p,y:f+M,vertical:T,scale:g,localGlyph:v.localGlyph,fontStack:o.fontStack,sectionIndex:d,metrics:v,rect:S}),p+=I*g+u):(b.push({glyph:y,imageName:k,x:p,y:f+M,vertical:T,scale:g,localGlyph:v.localGlyph,fontStack:o.fontStack,sectionIndex:d,metrics:v,rect:S}),p+=v.advance*g+u);}0!==b.length&&(d=Math.max(p-u,d),m?Zp(b,y,w,A,s*i/2):Zp(b,y,w,0,s/2)),p=0;const S=s*i+w;v.lineOffset=Math.max(w,o),f+=S,++g;}var x;const v=f,{horizontalAlign:b,verticalAlign:w}=Xp(a);((function(t,e,r,n,i,s){const a=(e-r)*i,o=-s*n;for(const e of t)for(const t of e.positionedGlyphs)t.x+=a,t.y+=o;}))(t.positionedLines,y,b,w,d,v),t.top+=-w*v,t.bottom=t.top+v,t.left+=-b*d,t.right=t.left+d,t.hasBaseline=m;}(w,e,r,n,m,a,o,l,h,u,p,d),!function(t){for(const e of t)if(0!==e.positionedGlyphs.length)return !1;return !0}(b)&&w}const jp={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},Up={10:!0,32:!0,38:!0,40:!0,41:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0,8231:!0};function $p(t,e,r,n,i,s){if(e.imageName){const t=n[e.imageName];return t?t.displaySize[0]*e.scale*Wh/s+i:0}{const n=r[e.fontStack],s=n&&n.glyphs[t];return s?s.metrics.advance*e.scale+i:0}}function Op(t,e,r,n){const i=Math.pow(t-e,2);return n?t<e?i/2:2*i:i+Math.abs(r)*r}function qp(t,e,r){let n=0;return 10===t&&(n-=1e4),r&&(n+=150),40!==t&&65288!==t||(n+=50),41!==e&&65289!==e||(n+=50),n}function Np(t,e,r,n,i,s){let a=null,o=Op(e,r,i,s);for(const t of n){const n=Op(e-t.x,r,i,s)+t.badness;n<=o&&(a=t,o=n);}return {index:t,x:e,priorBreak:a,badness:o}}function Gp(t){return t?Gp(t.priorBreak).concat(t.index):[]}function Xp(t){let e=.5,r=.5;switch(t){case\"right\":case\"top-right\":case\"bottom-right\":e=1;break;case\"left\":case\"top-left\":case\"bottom-left\":e=0;}switch(t){case\"bottom\":case\"bottom-right\":case\"bottom-left\":r=1;break;case\"top\":case\"top-right\":case\"top-left\":r=0;}return {horizontalAlign:e,verticalAlign:r}}function Zp(t,e,r,n,i){if(!(e||r||n||i))return;const s=t.length-1,a=t[s],o=(a.x+a.metrics.advance*a.scale)*e;for(let e=0;e<=s;e++)t[e].x-=o,t[e].y+=r+n+i;}function Kp(t,e,r){const{horizontalAlign:n,verticalAlign:i}=Xp(r),s=e[0]-t.displaySize[0]*n,a=e[1]-t.displaySize[1]*i;return {image:t,top:a,bottom:a+t.displaySize[1],left:s,right:s+t.displaySize[0]}}function Yp(t,e,r,n,i,s){const a=t.image;let o;if(a.content){const t=a.content,e=a.pixelRatio||1;o=[t[0]/e,t[1]/e,a.displaySize[0]-t[2]/e,a.displaySize[1]-t[3]/e];}const l=e.left*s,u=e.right*s;let c,h,p,f;\"width\"===r||\"both\"===r?(f=i[0]+l-n[3],h=i[0]+u+n[1]):(f=i[0]+(l+u-a.displaySize[0])/2,h=f+a.displaySize[0]);const d=e.top*s,y=e.bottom*s;return \"height\"===r||\"both\"===r?(c=i[1]+d-n[0],p=i[1]+y+n[2]):(c=i[1]+(d+y-a.displaySize[1])/2,p=c+a.displaySize[1]),{image:a,top:c,right:h,bottom:p,left:f,collisionPadding:o}}class Hp extends d{constructor(t,e,r,n,i){super(t,e),this.angle=n,this.z=r,void 0!==i&&(this.segment=i);}clone(){return new Hp(this.x,this.y,this.z,this.angle,this.segment)}}function Wp(t,e,r,n,i){if(void 0===e.segment)return !0;let s=e,a=e.segment+1,o=0;for(;o>-r/2;){if(a--,a<0)return !1;o-=t[a].dist(s),s=t[a];}o+=t[a].dist(t[a+1]),a++;const l=[];let u=0;for(;o<r/2;){const e=t[a],r=t[a+1];if(!r)return !1;let s=t[a-1].angleTo(e)-e.angleTo(r);for(s=Math.abs((s+3*Math.PI)%(2*Math.PI)-Math.PI),l.push({distance:o,angleDelta:s}),u+=s;o-l[0].distance>n;)u-=l.shift().angleDelta;if(u>i)return !1;a++,o+=e.dist(r);}return !0}function Jp(t){let e=0;for(let r=0;r<t.length-1;r++)e+=t[r].dist(t[r+1]);return e}function Qp(t,e,r){return t?.6*e*r:0}function tf(t,e){return Math.max(t?t.right-t.left:0,e?e.right-e.left:0)}function ef(t,e,r,n,i,s){const a=Qp(r,i,s),o=tf(r,n)*s;let l=0;const u=Jp(t)/2;for(let r=0;r<t.length-1;r++){const n=t[r],i=t[r+1],s=n.dist(i);if(l+s>u){const c=(u-l)/s,h=Mr(n.x,i.x,c),p=Mr(n.y,i.y,c),f=new Hp(h,p,0,i.angleTo(n),r);return !a||Wp(t,f,o,a,e)?f:void 0}l+=s;}}function rf(t,e,r,n,i,s,a,o,l){const u=Qp(n,s,a),c=tf(n,i),h=c*a,p=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-h<e/4&&(e=h+e/4),nf(t,p?e/2*o%e:(c/2+2*s)*a*o%e,e,u,r,h,p,!1,l)}function nf(t,e,r,n,i,s,a,o,l){const u=s/2,c=Jp(t);let h=0,p=e-r,f=[];for(let e=0;e<t.length-1;e++){const a=t[e],o=t[e+1],d=a.dist(o),y=o.angleTo(a);for(;p+r<h+d;){p+=r;const m=(p-h)/d,g=Mr(a.x,o.x,m),x=Mr(a.y,o.y,m);if(g>=0&&g<l&&x>=0&&x<l&&p-u>=0&&p+u<=c){const r=new Hp(g,x,0,y,e);r._round(),n&&!Wp(t,r,s,n,i)||f.push(r);}}h+=d;}return o||f.length||a||(f=nf(t,h/2,r,n,i,s,a,!0,l)),f}function sf(t,e,r,n,i){const s=[];for(let a=0;a<t.length;a++){const o=t[a];let l;for(let t=0;t<o.length-1;t++){let a=o[t],u=o[t+1];a.x<e&&u.x<e||(a.x<e?a=new d(e,a.y+(e-a.x)/(u.x-a.x)*(u.y-a.y))._round():u.x<e&&(u=new d(e,a.y+(e-a.x)/(u.x-a.x)*(u.y-a.y))._round()),a.y<r&&u.y<r||(a.y<r?a=new d(a.x+(r-a.y)/(u.y-a.y)*(u.x-a.x),r)._round():u.y<r&&(u=new d(a.x+(r-a.y)/(u.y-a.y)*(u.x-a.x),r)._round()),a.x>=n&&u.x>=n||(a.x>=n?a=new d(n,a.y+(n-a.x)/(u.x-a.x)*(u.y-a.y))._round():u.x>=n&&(u=new d(n,a.y+(n-a.x)/(u.x-a.x)*(u.y-a.y))._round()),a.y>=i&&u.y>=i||(a.y>=i?a=new d(a.x+(i-a.y)/(u.y-a.y)*(u.x-a.x),i)._round():u.y>=i&&(u=new d(a.x+(i-a.y)/(u.y-a.y)*(u.x-a.x),i)._round()),l&&a.equals(l[l.length-1])||(l=[a],s.push(l)),l.push(u)))));}}return s}Oi(Hp,\"Anchor\");const af=1e20;function of(t,e,r,n,i,s,a,o,l){for(let u=e;u<e+n;u++)lf(t,r*s+u,s,i,a,o,l);for(let u=r;u<r+i;u++)lf(t,u*s+e,1,n,a,o,l);}function lf(t,e,r,n,i,s,a){s[0]=0,a[0]=-af,a[1]=af,i[0]=t[e];for(let o=1,l=0,u=0;o<n;o++){i[o]=t[e+o*r];const n=o*o;do{const t=s[l];u=(i[o]-i[t]+n-t*t)/(o-t)/2;}while(u<=a[l]&&--l>-1);l++,s[l]=o,a[l]=u,a[l+1]=af;}for(let o=0,l=0;o<n;o++){for(;a[l+1]<o;)l++;const n=s[l],u=o-n;t[e+o*r]=i[n]+u*u;}}const uf={none:0,ideographs:1,all:2};class cf{constructor(t,e,r){this.requestManager=t,this.localGlyphMode=e,this.localFontFamily=r,this.entries={},this.localGlyphs={200:{},400:{},500:{},900:{}};}setURL(t){this.url=t;}getGlyphs(t,e){const r=[];for(const e in t)for(const n of t[e])r.push({stack:e,id:n});M(r,(({stack:t,id:e},r)=>{let n=this.entries[t];n||(n=this.entries[t]={glyphs:{},requests:{},ranges:{},ascender:void 0,descender:void 0});let i=n.glyphs[e];if(void 0!==i)return void r(null,{stack:t,id:e,glyph:i});if(i=this._tinySDF(n,t,e),i)return n.glyphs[e]=i,void r(null,{stack:t,id:e,glyph:i});const s=Math.floor(e/256);if(256*s>65535)return void r(new Error(\"glyphs > 65535 not supported\"));if(n.ranges[s])return void r(null,{stack:t,id:e,glyph:i});let a=n.requests[s];a||(a=n.requests[s]=[],cf.loadGlyphRange(t,s,this.url,this.requestManager,((t,e)=>{if(e){n.ascender=e.ascender,n.descender=e.descender;for(const t in e.glyphs)this._doesCharSupportLocalGlyph(+t)||(n.glyphs[+t]=e.glyphs[+t]);n.ranges[s]=!0;}for(const r of a)r(t,e);delete n.requests[s];}))),a.push(((n,i)=>{n?r(n):i&&r(null,{stack:t,id:e,glyph:i.glyphs[e]||null});}));}),((t,r)=>{if(t)e(t);else if(r){const t={};for(const{stack:e,id:n,glyph:i}of r)void 0===t[e]&&(t[e]={}),void 0===t[e].glyphs&&(t[e].glyphs={}),t[e].glyphs[n]=i&&{id:i.id,bitmap:i.bitmap.clone(),metrics:i.metrics},t[e].ascender=this.entries[e].ascender,t[e].descender=this.entries[e].descender;e(null,t);}}));}_doesCharSupportLocalGlyph(t){return this.localGlyphMode!==uf.none&&(this.localGlyphMode===uf.all?!!this.localFontFamily:!!this.localFontFamily&&(us(t)||ps(t)||ts(t)||es(t)||Qi(t)))}_tinySDF(t,e,r){const n=this.localFontFamily;if(!n||!this._doesCharSupportLocalGlyph(r))return;let i=t.tinySDF;if(!i){let r=\"400\";/bold/i.test(e)?r=\"900\":/medium/i.test(e)?r=\"500\":/light/i.test(e)&&(r=\"200\"),i=t.tinySDF=new cf.TinySDF({fontFamily:n,fontWeight:r,fontSize:48,buffer:6,radius:16}),i.fontWeight=r;}if(this.localGlyphs[i.fontWeight][r])return this.localGlyphs[i.fontWeight][r];const s=String.fromCharCode(r),{data:a,width:o,height:l,glyphWidth:u,glyphHeight:c,glyphLeft:h,glyphTop:p,glyphAdvance:f}=i.draw(s);return this.localGlyphs[i.fontWeight][r]={id:r,bitmap:new Ju({width:o,height:l},a),metrics:{width:u/2,height:c/2,left:h/2,top:p/2-27,advance:f/2,localGlyph:!0}}}}function hf(t,e,r,n){const i=[],s=t.image,a=s.pixelRatio,o=s.paddedRect.w-2,l=s.paddedRect.h-2,u=t.right-t.left,c=t.bottom-t.top,h=s.stretchX||[[0,o]],p=s.stretchY||[[0,l]],f=(t,e)=>t+e[1]-e[0],y=h.reduce(f,0),m=p.reduce(f,0),g=o-y,x=l-m;let v=0,b=y,w=0,_=m,A=0,S=g,k=0,I=x;if(s.content&&n){const t=s.content;v=pf(h,0,t[0]),w=pf(p,0,t[1]),b=pf(h,t[0],t[2]),_=pf(p,t[1],t[3]),A=t[0]-v,k=t[1]-w,S=t[2]-t[0]-b,I=t[3]-t[1]-_;}const M=(n,i,o,l)=>{const h=df(n.stretch-v,b,u,t.left),p=yf(n.fixed-A,S,n.stretch,y),f=df(i.stretch-w,_,c,t.top),g=yf(i.fixed-k,I,i.stretch,m),x=df(o.stretch-v,b,u,t.left),M=yf(o.fixed-A,S,o.stretch,y),T=df(l.stretch-w,_,c,t.top),z=yf(l.fixed-k,I,l.stretch,m),B=new d(h,f),E=new d(x,f),C=new d(x,T),P=new d(h,T),D=new d(p/a,g/a),V=new d(M/a,z/a),L=e*Math.PI/180;if(L){const t=Math.sin(L),e=Math.cos(L),r=[e,-t,t,e];B._matMult(r),E._matMult(r),P._matMult(r),C._matMult(r);}const F=n.stretch+n.fixed,R=i.stretch+i.fixed;return {tl:B,tr:E,bl:P,br:C,tex:{x:s.paddedRect.x+1+F,y:s.paddedRect.y+1+R,w:o.stretch+o.fixed-F,h:l.stretch+l.fixed-R},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:D,pixelOffsetBR:V,minFontScaleX:S/a/u,minFontScaleY:I/a/c,isSDF:r}};if(n&&(s.stretchX||s.stretchY)){const t=ff(h,g,y),e=ff(p,x,m);for(let r=0;r<t.length-1;r++){const n=t[r],s=t[r+1];for(let t=0;t<e.length-1;t++)i.push(M(n,e[t],s,e[t+1]));}}else i.push(M({fixed:0,stretch:-1},{fixed:0,stretch:-1},{fixed:0,stretch:o+1},{fixed:0,stretch:l+1}));return i}function pf(t,e,r){let n=0;for(const i of t)n+=Math.max(e,Math.min(r,i[1]))-Math.max(e,Math.min(r,i[0]));return n}function ff(t,e,r){const n=[{fixed:-1,stretch:0}];for(const[e,r]of t){const t=n[n.length-1];n.push({fixed:e-t.stretch,stretch:t.stretch}),n.push({fixed:e-t.stretch,stretch:t.stretch+(r-e)});}return n.push({fixed:e+1,stretch:r}),n}function df(t,e,r,n){return t/e*r+n}function yf(t,e,r,n){return t-e*r/n}function mf(t,e,r,n){const i=e+t.positionedLines[n].lineOffset;return 0===n?r+i/2:r+(i+(e+t.positionedLines[n-1].lineOffset))/2}cf.loadGlyphRange=function(t,e,r,n,i){const s=256*e,a=s+255,o=n.transformRequest(n.normalizeGlyphsURL(r).replace(\"{fontstack}\",t).replace(\"{range}\",`${s}-${a}`),st.Glyphs);ut(o,((t,e)=>{if(t)i(t);else if(e){const t={},r=function(t){return new op(t).readFields(zp,{})}(e);for(const e of r.glyphs)t[e.id]=e;i(null,{glyphs:t,ascender:r.ascender,descender:r.descender});}}));},cf.TinySDF=class{constructor({fontSize:t=24,buffer:e=3,radius:r=8,cutoff:n=.25,fontFamily:i=\"sans-serif\",fontWeight:s=\"normal\",fontStyle:a=\"normal\"}={}){this.buffer=e,this.cutoff=n,this.radius=r;const o=this.size=t+4*e,l=this._createCanvas(o),u=this.ctx=l.getContext(\"2d\",{willReadFrequently:!0});u.font=`${a} ${s} ${t}px ${i}`,u.textBaseline=\"alphabetic\",u.textAlign=\"left\",u.fillStyle=\"black\",this.gridOuter=new Float64Array(o*o),this.gridInner=new Float64Array(o*o),this.f=new Float64Array(o),this.z=new Float64Array(o+1),this.v=new Uint16Array(o);}_createCanvas(t){const e=document.createElement(\"canvas\");return e.width=e.height=t,e}draw(t){const{width:e,actualBoundingBoxAscent:r,actualBoundingBoxDescent:n,actualBoundingBoxLeft:i,actualBoundingBoxRight:s}=this.ctx.measureText(t),a=Math.ceil(r),o=Math.max(0,Math.min(this.size-this.buffer,Math.ceil(s-i))),l=Math.min(this.size-this.buffer,a+Math.ceil(n)),u=o+2*this.buffer,c=l+2*this.buffer,h=Math.max(u*c,0),p=new Uint8ClampedArray(h),f={data:p,width:u,height:c,glyphWidth:o,glyphHeight:l,glyphTop:a,glyphLeft:0,glyphAdvance:e};if(0===o||0===l)return f;const{ctx:d,buffer:y,gridInner:m,gridOuter:g}=this;d.clearRect(y,y,o,l),d.fillText(t,y,y+a);const x=d.getImageData(y,y,o,l);g.fill(af,0,h),m.fill(0,0,h);for(let t=0;t<l;t++)for(let e=0;e<o;e++){const r=x.data[4*(t*o+e)+3]/255;if(0===r)continue;const n=(t+y)*u+e+y;if(1===r)g[n]=0,m[n]=af;else {const t=.5-r;g[n]=t>0?t*t:0,m[n]=t<0?t*t:0;}}of(g,0,0,u,c,u,this.f,this.v,this.z),of(m,y,y,o,l,u,this.f,this.v,this.z);for(let t=0;t<h;t++){const e=Math.sqrt(g[t])-Math.sqrt(m[t]);p[t]=Math.round(255-255*(e/this.radius+this.cutoff));}return f}};class gf{constructor(t=[],e=xf){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t);}push(t){this.data.push(t),this.length++,this._up(this.length-1);}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,n=e[t];for(;t>0;){const i=t-1>>1,s=e[i];if(r(n,s)>=0)break;e[t]=s,t=i;}e[t]=n;}_down(t){const{data:e,compare:r}=this,n=this.length>>1,i=e[t];for(;t<n;){let n=1+(t<<1),s=e[n];const a=n+1;if(a<this.length&&r(e[a],s)<0&&(n=a,s=e[a]),r(s,i)>=0)break;e[t]=s,t=n;}e[t]=i;}}function xf(t,e){return t<e?-1:t>e?1:0}function vf(t,e=1,r=!1){let n=1/0,i=1/0,s=-1/0,a=-1/0;const o=t[0];for(let t=0;t<o.length;t++){const e=o[t];(!t||e.x<n)&&(n=e.x),(!t||e.y<i)&&(i=e.y),(!t||e.x>s)&&(s=e.x),(!t||e.y>a)&&(a=e.y);}const l=Math.min(s-n,a-i);let u=l/2;const c=new gf([],bf);if(0===l)return new d(n,i);for(let e=n;e<s;e+=l)for(let r=i;r<a;r+=l)c.push(new wf(e+u,r+u,u,t));let h=function(t){let e=0,r=0,n=0;const i=t[0];for(let t=0,s=i.length,a=s-1;t<s;a=t++){const s=i[t],o=i[a],l=s.x*o.y-o.x*s.y;r+=(s.x+o.x)*l,n+=(s.y+o.y)*l,e+=3*l;}return new wf(r/e,n/e,0,t)}(t),p=c.length;for(;c.length;){const n=c.pop();(n.d>h.d||!h.d)&&(h=n,r&&console.log(\"found best %d after %d probes\",Math.round(1e4*n.d)/1e4,p)),n.max-h.d<=e||(u=n.h/2,c.push(new wf(n.p.x-u,n.p.y-u,u,t)),c.push(new wf(n.p.x+u,n.p.y-u,u,t)),c.push(new wf(n.p.x-u,n.p.y+u,u,t)),c.push(new wf(n.p.x+u,n.p.y+u,u,t)),p+=4);}return r&&(console.log(`num probes: ${p}`),console.log(`best distance: ${h.d}`)),h.p}function bf(t,e){return e.max-t.max}function wf(t,e,r,n){this.p=new d(t,e),this.h=r,this.d=function(t,e){let r=!1,n=1/0;for(let i=0;i<e.length;i++){const s=e[i];for(let e=0,i=s.length,a=i-1;e<i;a=e++){const i=s[e],o=s[a];i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(r=!r),n=Math.min(n,Cu(t,i,o));}}return (r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2;}const _f=Number.POSITIVE_INFINITY,Af=Math.sqrt(2);function Sf(t,[e,r]){let n=0,i=0;if(r===_f){e<0&&(e=0);const r=e/Af;switch(t){case\"top-right\":case\"top-left\":i=r-7;break;case\"bottom-right\":case\"bottom-left\":i=7-r;break;case\"bottom\":i=7-e;break;case\"top\":i=e-7;}switch(t){case\"top-right\":case\"bottom-right\":n=-r;break;case\"top-left\":case\"bottom-left\":n=r;break;case\"left\":n=e;break;case\"right\":n=-e;}}else {switch(e=Math.abs(e),r=Math.abs(r),t){case\"top-right\":case\"top-left\":case\"top\":i=r-7;break;case\"bottom-right\":case\"bottom-left\":case\"bottom\":i=7-r;}switch(t){case\"top-right\":case\"bottom-right\":case\"right\":n=-e;break;case\"top-left\":case\"bottom-left\":case\"left\":n=e;}}return [n,i]}function kf(t,e,r,n,i,s,a,o,l,u){t.createArrays(),t.tilePixelRatio=ko/(512*t.overscaling),t.compareText={},t.iconsNeedLinear=!1;const c=t.layers[0].layout,h=t.layers[0]._unevaluatedLayout._values,p={};if(\"composite\"===t.textSizeData.kind){const{minZoom:e,maxZoom:r}=t.textSizeData;p.compositeTextSizes=[h[\"text-size\"].possiblyEvaluate(new Us(e),o),h[\"text-size\"].possiblyEvaluate(new Us(r),o)];}if(\"composite\"===t.iconSizeData.kind){const{minZoom:e,maxZoom:r}=t.iconSizeData;p.compositeIconSizes=[h[\"icon-size\"].possiblyEvaluate(new Us(e),o),h[\"icon-size\"].possiblyEvaluate(new Us(r),o)];}p.layoutTextSize=h[\"text-size\"].possiblyEvaluate(new Us(l+1),o),p.layoutIconSize=h[\"icon-size\"].possiblyEvaluate(new Us(l+1),o),p.textMaxSize=h[\"text-size\"].possiblyEvaluate(new Us(18),o);const f=\"map\"===c.get(\"text-rotation-alignment\")&&\"point\"!==c.get(\"symbol-placement\"),d=c.get(\"text-size\");for(const s of t.features){const l=c.get(\"text-font\").evaluate(s,{},o).join(\",\"),h=d.evaluate(s,{},o),y=p.layoutTextSize.evaluate(s,{},o),m=(p.layoutIconSize.evaluate(s,{},o),{horizontal:{},vertical:void 0}),g=s.text;let x,v=[0,0];if(g){const n=g.toString(),a=c.get(\"text-letter-spacing\").evaluate(s,{},o)*Wh,u=c.get(\"text-line-height\").evaluate(s,{},o)*Wh,p=ws(n)?a:0,d=c.get(\"text-anchor\").evaluate(s,{},o),x=c.get(\"text-variable-anchor\");if(!x){const t=c.get(\"text-radial-offset\").evaluate(s,{},o);v=t?Sf(d,[t*Wh,_f]):c.get(\"text-offset\").evaluate(s,{},o).map((t=>t*Wh));}let b=f?\"center\":c.get(\"text-justify\").evaluate(s,{},o);const w=\"point\"===c.get(\"symbol-placement\"),_=w?c.get(\"text-max-width\").evaluate(s,{},o)*Wh:1/0,A=s=>{t.allowVerticalPlacement&&bs(n)&&(m.vertical=Rp(g,e,r,i,l,_,u,d,s,p,v,Vp.vertical,!0,y,h));};if(!f&&x){const t=\"auto\"===b?x.map((t=>If(t))):[b];let n=!1;for(let s=0;s<t.length;s++){const a=t[s];if(!m.horizontal[a])if(n)m.horizontal[a]=m.horizontal[0];else {const t=Rp(g,e,r,i,l,_,u,\"center\",a,p,v,Vp.horizontal,!1,y,h);t&&(m.horizontal[a]=t,n=1===t.positionedLines.length);}}A(\"left\");}else {if(\"auto\"===b&&(b=If(d)),w||c.get(\"text-writing-mode\").indexOf(\"horizontal\")>=0||!bs(n)){const t=Rp(g,e,r,i,l,_,u,d,b,p,v,Vp.horizontal,!1,y,h);t&&(m.horizontal[b]=t);}A(w?\"left\":b);}}let b=!1;if(s.icon&&s.icon.name){const e=n[s.icon.name];e&&(x=Kp(i[s.icon.name],c.get(\"icon-offset\").evaluate(s,{},o),c.get(\"icon-anchor\").evaluate(s,{},o)),b=e.sdf,void 0===t.sdfIcons?t.sdfIcons=e.sdf:t.sdfIcons!==e.sdf&&$(\"Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer\"),(e.pixelRatio!==t.pixelRatio||0!==c.get(\"icon-rotate\").constantOr(1))&&(t.iconsNeedLinear=!0));}const w=Bf(m.horizontal)||m.vertical;t.iconsInText||(t.iconsInText=!!w&&w.iconsInText),(w||x)&&Mf(t,s,m,x,n,p,y,0,v,b,a,o,u);}s&&t.generateCollisionDebugBuffers(l,t.collisionBoxArray);}function If(t){switch(t){case\"right\":case\"top-right\":case\"bottom-right\":return \"right\";case\"left\":case\"top-left\":case\"bottom-left\":return \"left\"}return \"center\"}function Mf(t,e,r,n,i,s,a,o,l,u,c,h,p){let f=s.textMaxSize.evaluate(e,{},h);void 0===f&&(f=a);const d=t.layers[0].layout,y=d.get(\"icon-offset\").evaluate(e,{},h),m=Bf(r.horizontal)||r.vertical,g=\"globe\"===p.name,v=a/24,b=t.tilePixelRatio*f/24,w=(z=t.overscaling,t.zoom>18&&z>2&&(z>>=1),Math.max(ko/(512*z),1)*d.get(\"symbol-spacing\")),_=d.get(\"text-padding\")*t.tilePixelRatio,A=d.get(\"icon-padding\")*t.tilePixelRatio,S=x(d.get(\"text-max-angle\")),k=\"map\"===d.get(\"text-rotation-alignment\")&&\"point\"!==d.get(\"symbol-placement\"),I=\"map\"===d.get(\"icon-rotation-alignment\")&&\"point\"!==d.get(\"symbol-placement\"),M=d.get(\"symbol-placement\"),T=w/2;var z;const B=d.get(\"icon-text-fit\");let E;n&&\"none\"!==B&&(t.allowVerticalPlacement&&r.vertical&&(E=Yp(n,r.vertical,B,d.get(\"icon-text-fit-padding\"),y,v)),m&&(n=Yp(n,m,B,d.get(\"icon-text-fit-padding\"),y,v)));const C=(a,o,f)=>{if(o.x<0||o.x>=ko||o.y<0||o.y>=ko)return;let d=null;if(g){const{x:t,y:e,z:r}=p.projectTilePoint(o.x,o.y,f);d={anchor:new Hp(t,e,r,0,void 0),up:p.upVector(f,o.x,o.y)};}!function(t,e,r,n,i,s,a,o,l,u,c,h,p,f,d,y,m,g,x,v,b,w,_,A,S){const k=t.addToLineVertexArray(e,n);let I,M,T,z,B,E,C,P=0,D=0,V=0,L=0,F=-1,R=-1;const j={};let U=qa(\"\");const O=r?r.anchor:e;let q=0,N=0;if(void 0===l._unevaluatedLayout.getValue(\"text-radial-offset\")?[q,N]=l.layout.get(\"text-offset\").evaluate(b,{},S).map((t=>t*Wh)):(q=l.layout.get(\"text-radial-offset\").evaluate(b,{},S)*Wh,N=_f),t.allowVerticalPlacement&&i.vertical){const t=i.vertical;if(d)E=Cf(t),o&&(C=Cf(o));else {const r=l.layout.get(\"text-rotate\").evaluate(b,{},S)+90;T=Ef(u,O,e,c,h,p,t,f,r,y),o&&(z=Ef(u,O,e,c,h,p,o,g,r));}}if(s){const n=l.layout.get(\"icon-rotate\").evaluate(b,{},S),i=\"none\"!==l.layout.get(\"icon-text-fit\"),a=hf(s,n,_,i),f=o?hf(o,n,_,i):void 0;M=Ef(u,O,e,c,h,p,s,g,n),P=4*a.length;const d=t.iconSizeData;let y=null;\"source\"===d.kind?(y=[Jh*l.layout.get(\"icon-size\").evaluate(b,{},S)],y[0]>Tf&&$(`${t.layerIds[0]}: Value for \"icon-size\" is >= 255. Reduce your \"icon-size\".`)):\"composite\"===d.kind&&(y=[Jh*w.compositeIconSizes[0].evaluate(b,{},S),Jh*w.compositeIconSizes[1].evaluate(b,{},S)],(y[0]>Tf||y[1]>Tf)&&$(`${t.layerIds[0]}: Value for \"icon-size\" is >= 255. Reduce your \"icon-size\".`)),t.addSymbols(t.icon,a,y,v,x,b,!1,r,e,k.lineStartIndex,k.lineLength,-1,A,S),F=t.icon.placedSymbolArray.length-1,f&&(D=4*f.length,t.addSymbols(t.icon,f,y,v,x,b,Vp.vertical,r,e,k.lineStartIndex,k.lineLength,-1,A,S),R=t.icon.placedSymbolArray.length-1);}for(const n in i.horizontal){const s=i.horizontal[n];I||(U=qa(s.text),d?B=Cf(s):I=Ef(u,O,e,c,h,p,s,f,l.layout.get(\"text-rotate\").evaluate(b,{},S),y));const o=1===s.positionedLines.length;if(V+=zf(t,r,e,s,a,l,d,b,y,k,i.vertical?Vp.horizontal:Vp.horizontalOnly,o?Object.keys(i.horizontal):[n],j,F,w,A,S),o)break}i.vertical&&(L+=zf(t,r,e,i.vertical,a,l,d,b,y,k,Vp.vertical,[\"vertical\"],j,R,w,A,S));let G=-1;const X=(t,e)=>t?Math.max(t,e):e;G=X(B,G),G=X(E,G),G=X(C,G);const Z=G>-1?1:0;t.glyphOffsetArray.length>=hd.MAX_GLYPHS&&$(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\"),void 0!==b.sortKey&&t.addToSortKeyRanges(t.symbolInstances.length,b.sortKey),t.symbolInstances.emplaceBack(O.x,O.y,O.z,e.x,e.y,j.right>=0?j.right:-1,j.center>=0?j.center:-1,j.left>=0?j.left:-1,j.vertical>=0?j.vertical:-1,F,R,U,void 0!==I?I:t.collisionBoxArray.length,void 0!==I?I+1:t.collisionBoxArray.length,void 0!==T?T:t.collisionBoxArray.length,void 0!==T?T+1:t.collisionBoxArray.length,void 0!==M?M:t.collisionBoxArray.length,void 0!==M?M+1:t.collisionBoxArray.length,z||t.collisionBoxArray.length,z?z+1:t.collisionBoxArray.length,c,V,L,P,D,Z,0,q,N,G);}(t,o,d,a,r,n,i,E,t.layers[0],t.collisionBoxArray,e.index,e.sourceLayerIndex,t.index,_,k,l,0,A,I,y,e,s,u,c,h);};if(\"line\"===M)for(const i of sf(e.geometry,0,0,ko,ko)){const e=rf(i,w,S,r.vertical||m,n,24,b,t.overscaling,ko);for(const r of e){const e=m;e&&Pf(t,e.text,T,r)||C(i,r,h);}}else if(\"line-center\"===M){for(const t of e.geometry)if(t.length>1){const e=ef(t,S,r.vertical||m,n,24,b);e&&C(t,e,h);}}else if(\"Polygon\"===e.type)for(const t of Lc(e.geometry,0)){const e=vf(t,16);C(t[0],new Hp(e.x,e.y,0,0,void 0),h);}else if(\"LineString\"===e.type)for(const t of e.geometry)C(t,new Hp(t[0].x,t[0].y,0,0,void 0),h);else if(\"Point\"===e.type)for(const t of e.geometry)for(const e of t)C([e],new Hp(e.x,e.y,0,0,void 0),h);}const Tf=32640;function zf(t,e,r,n,i,s,a,o,l,u,c,h,p,f,y,m,g){const x=function(t,e,r,n,i,s,a,o){const l=[];if(0===e.positionedLines.length)return l;const u=n.layout.get(\"text-rotate\").evaluate(s,{})*Math.PI/180,c=function(t){const e=t[0],r=t[1],n=e*r;return n>0?[e,-r]:n<0?[-e,r]:0===e?[r,e]:[r,-e]}(r);let h=Math.abs(e.top-e.bottom);for(const t of e.positionedLines)h-=t.lineOffset;const p=e.positionedLines.length,f=h/p;let y=e.top-r[1];for(let t=0;t<p;++t){const n=e.positionedLines[t];y=mf(e,f,y,t);for(const t of n.positionedGlyphs){if(!t.rect)continue;const n=t.rect||{};let s=4,h=!0,p=1,f=0;if(t.imageName){const e=a[t.imageName];if(!e)continue;if(e.sdf){$(\"SDF images are not supported in formatted text and will be ignored.\");continue}h=!1,p=e.pixelRatio,s=1/p;}const m=(i||o)&&t.vertical,g=t.metrics.advance*t.scale/2,x=t.metrics,v=t.rect;if(null===v)continue;o&&e.verticalizable&&(f=t.imageName?g-t.metrics.width*t.scale/2:0);const b=i?[t.x+g,t.y]:[0,0];let w=[0,0],_=[0,0],A=!1;i||(m?(_=[t.x+g+c[0],t.y+c[1]-f],A=!0):w=[t.x+g+r[0],t.y+r[1]-f]);const S=v.w*t.scale/(p*(t.localGlyph?2:1)),k=v.h*t.scale/(p*(t.localGlyph?2:1));let I,M,T,z;if(m){const e=t.y-y,r=new d(-g,g-e),n=-Math.PI/2,i=new d(..._);I=new d(-g+w[0],w[1]),I._rotateAround(n,r)._add(i),I.x+=-e+g,I.y-=(x.left-s)*t.scale;const a=t.imageName?x.advance*t.scale:Wh*t.scale,o=String.fromCharCode(t.glyph);sp(o)?I.x+=(1-s)*t.scale:ap(o)?I.x+=a-x.height*t.scale+(-s-1)*t.scale:I.x+=t.imageName||x.width+2*s===v.w&&x.height+2*s===v.h?(a-k)/2:(a-(x.height+2*s)*t.scale)/2,M=new d(I.x,I.y-S),T=new d(I.x+k,I.y),z=new d(I.x+k,I.y-S);}else {const e=(x.left-s)*t.scale-g+w[0],r=(-x.top-s)*t.scale+w[1],n=e+S,i=r+k;I=new d(e,r),M=new d(n,r),T=new d(e,i),z=new d(n,i);}if(u){let t;t=i?new d(0,0):A?new d(c[0],c[1]):new d(r[0],r[1]),I._rotateAround(u,t),M._rotateAround(u,t),T._rotateAround(u,t),z._rotateAround(u,t);}const B=new d(0,0),E=new d(0,0);l.push({tl:I,tr:M,bl:T,br:z,tex:n,writingMode:e.writingMode,glyphOffset:b,sectionIndex:t.sectionIndex,isSDF:h,pixelOffsetTL:B,pixelOffsetBR:E,minFontScaleX:0,minFontScaleY:0});}}return l}(0,n,l,s,a,o,i,t.allowVerticalPlacement),v=t.textSizeData;let b=null;\"source\"===v.kind?(b=[Jh*s.layout.get(\"text-size\").evaluate(o,{},g)],b[0]>Tf&&$(`${t.layerIds[0]}: Value for \"text-size\" is >= 255. Reduce your \"text-size\".`)):\"composite\"===v.kind&&(b=[Jh*y.compositeTextSizes[0].evaluate(o,{},g),Jh*y.compositeTextSizes[1].evaluate(o,{},g)],(b[0]>Tf||b[1]>Tf)&&$(`${t.layerIds[0]}: Value for \"text-size\" is >= 255. Reduce your \"text-size\".`)),t.addSymbols(t.text,x,b,l,a,o,c,e,r,u.lineStartIndex,u.lineLength,f,m,g);for(const e of h)p[e]=t.text.placedSymbolArray.length-1;return 4*x.length}function Bf(t){for(const e in t)return t[e];return null}function Ef(t,e,r,n,i,s,a,o,l,u){let c=a.top,h=a.bottom,p=a.left,f=a.right;const y=a.collisionPadding;if(y&&(p-=y[0],c-=y[1],f+=y[2],h+=y[3]),l){const t=new d(p,c),e=new d(f,c),r=new d(p,h),n=new d(f,h),i=x(l);let s=new d(0,0);u&&(s=new d(u[0],u[1])),t._rotateAround(i,s),e._rotateAround(i,s),r._rotateAround(i,s),n._rotateAround(i,s),p=Math.min(t.x,e.x,r.x,n.x),f=Math.max(t.x,e.x,r.x,n.x),c=Math.min(t.y,e.y,r.y,n.y),h=Math.max(t.y,e.y,r.y,n.y);}return t.emplaceBack(e.x,e.y,e.z,r.x,r.y,p,c,f,h,o,n,i,s),t.length-1}function Cf(t){t.collisionPadding&&(t.top-=t.collisionPadding[1],t.bottom+=t.collisionPadding[3]);const e=t.bottom-t.top;return e>0?Math.max(10,e):null}function Pf(t,e,r,n){const i=t.compareText;if(e in i){const t=i[e];for(let e=t.length-1;e>=0;e--)if(n.dist(t[e])<r)return !0}else i[e]=[];return i[e].push(n),!1}function Df(t,e){const r=t.fovAboveCenter,n=t.elevation?t.elevation.getMinElevationBelowMSL()*e:0,i=(t._camera.position[2]*t.worldSize-n)/Math.cos(t._pitch),s=Math.sin(r)*i/Math.sin(Math.max(Math.PI/2-t._pitch-r,.01)),a=Math.sin(t._pitch)*s+i;return Math.min(1.01*a,i*(1/t._horizonShift))}function Vf(t,e){if(!e.isReprojectedInTileSpace)return {scale:1<<t.z,x:t.x,y:t.y,x2:t.x+1,y2:t.y+1,projection:e};const r=Math.pow(2,-t.z),n=t.x*r,i=(t.x+1)*r,s=t.y*r,a=(t.y+1)*r,o=ou(n),l=ou(i),u=lu(s),c=lu(a),h=e.project(o,u),p=e.project(l,u),f=e.project(l,c),d=e.project(o,c);let y=Math.min(h.x,p.x,f.x,d.x),m=Math.min(h.y,p.y,f.y,d.y),g=Math.max(h.x,p.x,f.x,d.x),x=Math.max(h.y,p.y,f.y,d.y);const v=r/16;function b(t,r,n,i,s,a){const o=(n+s)/2,l=(i+a)/2,u=e.project(ou(o),lu(l)),c=Math.max(0,y-u.x,m-u.y,u.x-g,u.y-x);y=Math.min(y,u.x),g=Math.max(g,u.x),m=Math.min(m,u.y),x=Math.max(x,u.y),c>v&&(b(t,u,n,i,o,l),b(u,r,o,l,s,a));}b(h,p,n,s,i,s),b(p,f,i,s,i,a),b(f,d,i,a,n,a),b(d,h,n,a,n,s),y-=v,m-=v,g+=v,x+=v;const w=1/Math.max(g-y,x-m);return {scale:w,x:y*w,y:m*w,x2:g*w,y2:x*w,projection:e}}const Lf=Eo(new Float32Array(16));class Ff{constructor(t){this.spec=t,this.name=t.name,this.wrap=!1,this.requiresDraping=!1,this.supportsWorldCopies=!1,this.supportsTerrain=!1,this.supportsFog=!1,this.supportsFreeCamera=!1,this.zAxisUnit=\"meters\",this.isReprojectedInTileSpace=!0,this.unsupportedLayers=[\"custom\"],this.center=[0,0],this.range=[3.5,7];}project(t,e){return {x:0,y:0,z:0}}unproject(t,e){return new ru(0,0)}projectTilePoint(t,e,r){return {x:t,y:e,z:0}}locationPoint(t,e,r=!0){return t._coordinatePoint(t.locationCoordinate(e),r)}pixelsPerMeter(t,e){return au(1,t)*e}pixelSpaceConversion(t,e,r){return 1}farthestPixelDistance(t){return Df(t,t.pixelsPerMeter)}pointCoordinate(t,e,r,n){const i=t.horizonLineFromTop(!1),s=new d(e,Math.max(i,r));return t.rayIntersectionCoordinate(t.pointRayIntersection(s,n))}pointCoordinate3D(t,e,r){const n=new d(e,r);if(t.elevation)return t.elevation.pointCoordinate(n);{const e=this.pointCoordinate(t,n.x,n.y,0);return [e.x,e.y,e.z]}}isPointAboveHorizon(t,e){if(t.elevation)return !this.pointCoordinate3D(t,e.x,e.y);const r=t.horizonLineFromTop();return e.y<r}createInversionMatrix(t,e){return Lf}createTileMatrix(t,e,r){let n,i,s;const a=r.canonical,o=Eo(new Float64Array(16));if(this.isReprojectedInTileSpace){const l=Vf(a,this);n=1,i=l.x+r.wrap*l.scale,s=l.y,Vo(o,o,[n/l.scale,n/l.scale,t.pixelsPerMeter/e]);}else n=e/t.zoomScale(a.z),i=(a.x+Math.pow(2,a.z)*r.wrap)*n,s=a.y*n;return Do(o,o,[i,s,0]),Vo(o,o,[n/ko,n/ko,1]),o}upVector(t,e,r){return [0,0,1]}upVectorScale(t,e,r){return {metersToTile:1}}}class Rf extends Ff{constructor(t){super(t),this.range=[4,7],this.center=t.center||[-96,37.5];const[e,r]=this.parallels=t.parallels||[29.5,45.5],n=Math.sin(x(e));this.n=(n+Math.sin(x(r)))/2,this.c=1+n*(2*this.n-n),this.r0=Math.sqrt(this.c)/this.n;}project(t,e){const{n:r,c:n,r0:i}=this,s=x(t-this.center[0]),a=x(e),o=Math.sqrt(n-2*r*Math.sin(a))/r;return {x:o*Math.sin(s*r),y:o*Math.cos(s*r)-i,z:0}}unproject(t,e){const{n:r,c:n,r0:i}=this,s=i+e;let a=Math.atan2(t,Math.abs(s))*Math.sign(s);s*r<0&&(a-=Math.PI*Math.sign(t)*Math.sign(s));const o=x(this.center[0])*r;a=I(a,-Math.PI-o,Math.PI-o);const l=S(v(a/r)+this.center[0],-180,180),u=Math.asin(S((n-(t*t+s*s)*r*r)/(2*r),-1,1)),c=S(v(u),-cu,cu);return new ru(l,c)}}const jf=1.340264,Uf=-.081106,$f=893e-6,Of=.003796,qf=Math.sqrt(3)/2;class Nf extends Ff{project(t,e){e=e/180*Math.PI,t=t/180*Math.PI;const r=Math.asin(qf*Math.sin(e)),n=r*r,i=n*n*n;return {x:.5*(t*Math.cos(r)/(qf*(jf+3*Uf*n+i*(7*$f+9*Of*n)))/Math.PI+.5),y:1-.5*(r*(jf+Uf*n+i*($f+Of*n))/Math.PI+1),z:0}}unproject(t,e){t=(2*t-.5)*Math.PI;let r=e=(2*(1-e)-1)*Math.PI,n=r*r,i=n*n*n;for(let t,s,a,o=0;o<12&&(s=r*(jf+Uf*n+i*($f+Of*n))-e,a=jf+3*Uf*n+i*(7*$f+9*Of*n),t=s/a,r=S(r-t,-Math.PI/3,Math.PI/3),n=r*r,i=n*n*n,!(Math.abs(t)<1e-12));++o);const s=qf*t*(jf+3*Uf*n+i*(7*$f+9*Of*n))/Math.cos(r),a=Math.asin(Math.sin(r)/qf),o=S(180*s/Math.PI,-180,180),l=S(180*a/Math.PI,-cu,cu);return new ru(o,l)}}class Gf extends Ff{constructor(t){super(t),this.wrap=!0,this.supportsWorldCopies=!0;}project(t,e){return {x:.5+t/360,y:.5-e/360,z:0}}unproject(t,e){const r=360*(t-.5),n=S(360*(.5-e),-cu,cu);return new ru(r,n)}}const Xf=Math.PI/2;function Zf(t){return Math.tan((Xf+t)/2)}class Kf extends Ff{constructor(t){super(t),this.center=t.center||[0,30];const[e,r]=this.parallels=t.parallels||[30,30];let n=x(e),i=x(r);this.southernCenter=n+i<0,this.southernCenter&&(n=-n,i=-i);const s=Math.cos(n),a=Zf(n);this.n=n===i?Math.sin(n):Math.log(s/Math.cos(i))/Math.log(Zf(i)/a),this.f=s*Math.pow(Zf(n),this.n)/this.n;}project(t,e){e=x(e),this.southernCenter&&(e=-e),t=x(t-this.center[0]);const r=1e-6,{n:n,f:i}=this;i>0?e<-Xf+r&&(e=-Xf+r):e>Xf-r&&(e=Xf-r);const s=i/Math.pow(Zf(e),n);let a=s*Math.sin(n*t),o=i-s*Math.cos(n*t);return a=.5*(a/Math.PI+.5),o=.5*(o/Math.PI+.5),{x:a,y:this.southernCenter?o:1-o,z:0}}unproject(t,e){t=(2*t-.5)*Math.PI,this.southernCenter&&(e=1-e),e=(2*(1-e)-.5)*Math.PI;const{n:r,f:n}=this,i=n-e,s=Math.sign(i),a=Math.sign(r)*Math.sqrt(t*t+i*i);let o=Math.atan2(t,Math.abs(i))*s;i*r<0&&(o-=Math.PI*Math.sign(t)*s);const l=S(v(o/r)+this.center[0],-180,180),u=S(v(2*Math.atan(Math.pow(n/a,1/r))-Xf),-cu,cu);return new ru(l,this.southernCenter?-u:u)}}class Yf extends Ff{constructor(t){super(t),this.wrap=!0,this.supportsWorldCopies=!0,this.supportsTerrain=!0,this.supportsFog=!0,this.supportsFreeCamera=!0,this.isReprojectedInTileSpace=!1,this.unsupportedLayers=[],this.range=null;}project(t,e){return {x:iu(t),y:su(e),z:0}}unproject(t,e){const r=ou(t),n=lu(e);return new ru(r,n)}}const Hf=x(cu);class Wf extends Ff{project(t,e){const r=(e=x(e))*e,n=r*r;return {x:.5*((t=x(t))*(.8707-.131979*r+n*(n*(.003971*r-.001529*n)-.013791))/Math.PI+.5),y:1-.5*(e*(1.007226+r*(.015085+n*(.028874*r-.044475-.005916*n)))/Math.PI+1),z:0}}unproject(t,e){t=(2*t-.5)*Math.PI;let r=e=(2*(1-e)-1)*Math.PI,n=25,i=0,s=r*r;do{s=r*r;const t=s*s;i=(r*(1.007226+s*(.015085+t*(.028874*s-.044475-.005916*t)))-e)/(1.007226+s*(.045255+t*(.259866*s-.311325-.005916*11*t))),r=S(r-i,-Hf,Hf);}while(Math.abs(i)>1e-6&&--n>0);s=r*r;const a=S(v(t/(.8707+s*(s*(s*s*s*(.003971-.001529*s)-.013791)-.131979))),-180,180),o=v(r);return new ru(a,o)}}const Jf=x(cu);class Qf extends Ff{project(t,e){e=x(e),t=x(t);const r=Math.cos(e),n=2/Math.PI,i=Math.acos(r*Math.cos(t/2)),s=Math.sin(i)/i,a=.5*(t*n+2*r*Math.sin(t/2)/s)||0,o=.5*(e+Math.sin(e)/s)||0;return {x:.5*(a/Math.PI+.5),y:1-.5*(o/Math.PI+1),z:0}}unproject(t,e){let r=t=(2*t-.5)*Math.PI,n=e=(2*(1-e)-1)*Math.PI,i=25;const s=1e-6;let a=0,o=0;do{const i=Math.cos(n),s=Math.sin(n),l=2*s*i,u=s*s,c=i*i,h=Math.cos(r/2),p=Math.sin(r/2),f=2*h*p,d=p*p,y=1-c*h*h,m=y?1/y:0,g=y?Math.acos(i*h)*Math.sqrt(1/y):0,x=.5*(2*g*i*p+2*r/Math.PI)-t,v=.5*(g*s+n)-e,b=.5*m*(c*d+g*i*h*u)+1/Math.PI,w=m*(f*l/4-g*s*p),_=.125*m*(l*p-g*s*c*f),A=.5*m*(u*h+g*d*i)+.5,k=w*_-A*b;a=(v*w-x*A)/k,o=(x*_-v*b)/k,r=S(r-a,-Math.PI,Math.PI),n=S(n-o,-Jf,Jf);}while((Math.abs(a)>s||Math.abs(o)>s)&&--i>0);return new ru(v(r),v(n))}}class td extends Ff{constructor(t){super(t),this.center=t.center||[0,0],this.parallels=t.parallels||[0,0],this.cosPhi=Math.max(.01,Math.cos(x(this.parallels[0]))),this.scale=1/(2*Math.max(Math.PI*this.cosPhi,1/this.cosPhi)),this.wrap=!0,this.supportsWorldCopies=!0;}project(t,e){const{scale:r,cosPhi:n}=this;return {x:x(t)*n*r+.5,y:-Math.sin(x(e))/n*r+.5,z:0}}unproject(t,e){const{scale:r,cosPhi:n}=this,i=-(e-.5)/r,s=S(v((t-.5)/r)/n,-180,180),a=Math.asin(S(i*n,-1,1)),o=S(v(a),-cu,cu);return new ru(s,o)}}class ed extends Yf{constructor(t){super(t),this.requiresDraping=!0,this.supportsWorldCopies=!1,this.supportsFog=!0,this.zAxisUnit=\"pixels\",this.unsupportedLayers=[\"debug\"],this.range=[3,5];}projectTilePoint(t,e,r){const n=Ol(t,e,r);return el(n,n,Gl(Pl(r))),{x:n[0],y:n[1],z:n[2]}}locationPoint(t,e){const r=$l(e.lat,e.lng),n=Jo([],r),i=t.elevation?t.elevation.getAtPointOrZero(t.locationCoordinate(e),t._centerAltitude):t._centerAltitude;Wo(r,r,n,au(1,0)*ko*i);const s=Eo(new Float64Array(16));return Po(s,t.pixelMatrix,t.globeMatrix),el(r,r,s),new d(r[0],r[1])}pixelsPerMeter(t,e){return au(1,0)*e}pixelSpaceConversion(t,e,r){const n=au(1,t)*e,i=Mr(au(1,45)*e,n,r);return this.pixelsPerMeter(t,e)/i}createTileMatrix(t,e,r){const n=Xl(Pl(r.canonical));return Po(new Float64Array(16),t.globeMatrix,n)}createInversionMatrix(t,e){const{center:r}=t,n=Gl(Pl(e));return Fo(n,n,x(r.lng)),Lo(n,n,x(r.lat)),Vo(n,n,[t._pixelsPerMercatorPixel,t._pixelsPerMercatorPixel,1]),Float32Array.from(n)}pointCoordinate(t,e,r,n){return Bl(t,e,r,!0)||new pu(0,0)}pointCoordinate3D(t,e,r){const n=this.pointCoordinate(t,e,r,0);return [n.x,n.y,n.z]}isPointAboveHorizon(t,e){return !Bl(t,e.x,e.y,!1)}farthestPixelDistance(t){const e=function(t,e){const r=t.cameraToCenterDistance,n=t._centerAltitude*e,i=t._camera,s=t._camera.forward(),a=Go([],Ho([],s,-r),[0,0,n]),o=t.worldSize/(2*Math.PI),l=[0,0,-o],u=t.width/t.height,c=Math.tan(t.fovAboveCenter),h=Ho([],i.up(),c),p=Ho([],i.right(),c*u),f=Jo([],Go([],Go([],s,h),p)),d=[];let y;if(new vl(a,f).closestPointOnSphere(l,o,d)){const e=Go([],d,l),r=il([],e,a);y=Math.cos(t.fovAboveCenter)*qo(r);}else {const t=il([],a,l),e=il([],l,a);Jo(e,e);const r=qo(t)-o;y=Math.sqrt(r*(r+2*o));const n=Math.acos(y/(o+r))-Math.acos(Qo(s,e));y*=Math.cos(n);}return 1.01*y}(t,this.pixelsPerMeter(t.center.lat,t.worldSize)),r=Kl(t.zoom);if(r>0){const n=Df(t,au(1,t.center.lat)*t.worldSize),i=t.worldSize/(2*Math.PI),s=Math.max(t.width,t.height)/t.worldSize*Math.PI;return Mr(e,n+i*(1-Math.cos(s)),Math.pow(r,10))}return e}upVector(t,e,r){return Ol(e,r,t,1)}upVectorScale(t){return {metersToTile:zl(ql(Pl(t)))}}}function rd(t){const e=t.parallels,r=!!e&&Math.abs(e[0]+e[1])<.01;switch(t.name){case\"mercator\":return new Yf(t);case\"equirectangular\":return new Gf(t);case\"naturalEarth\":return new Wf(t);case\"equalEarth\":return new Nf(t);case\"winkelTripel\":return new Qf(t);case\"albers\":return r?new td(t):new Rf(t);case\"lambertConformalConic\":return r?new td(t):new Kf(t);case\"globe\":return new ed(t)}throw new Error(`Invalid projection name: ${t.name}`)}const nd=ah.types,id=[{name:\"a_fade_opacity\",components:1,type:\"Uint8\",offset:0}];function sd(t,e,r,n,i,s,a,o,l,u,c,h,p){const f=o?Math.min(Tf,Math.round(o[0])):0,d=o?Math.min(Tf,Math.round(o[1])):0;t.emplaceBack(e,r,Math.round(32*n),Math.round(32*i),s,a,(f<<1)+(l?1:0),d,16*u,16*c,256*h,256*p);}function ad(t,e,r,n,i,s,a){t.emplaceBack(e,r,n,i,s,a);}function od(t,e,r,n,i){t.emplaceBack(e,r,n,i),t.emplaceBack(e,r,n,i),t.emplaceBack(e,r,n,i),t.emplaceBack(e,r,n,i);}function ld(t){for(const e of t.sections)if(Ms(e.text))return !0;return !1}class ud{constructor(t){this.layoutVertexArray=new fa,this.indexArray=new wa,this.programConfigurations=t,this.segments=new So,this.dynamicLayoutVertexArray=new ua,this.opacityVertexArray=new ya,this.placedSymbolArray=new Pa,this.globeExtVertexArray=new da;}isEmpty(){return 0===this.layoutVertexArray.length&&0===this.indexArray.length&&0===this.dynamicLayoutVertexArray.length&&0===this.opacityVertexArray.length}upload(t,e,r,n){this.isEmpty()||(r&&(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Nh.members),this.indexBuffer=t.createIndexBuffer(this.indexArray,e),this.dynamicLayoutVertexBuffer=t.createVertexBuffer(this.dynamicLayoutVertexArray,Xh.members,!0),this.opacityVertexBuffer=t.createVertexBuffer(this.opacityVertexArray,id,!0),this.globeExtVertexArray.length>0&&(this.globeExtVertexBuffer=t.createVertexBuffer(this.globeExtVertexArray,Gh.members,!0)),this.opacityVertexBuffer.itemSize=1),(r||n)&&this.programConfigurations.upload(t));}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.dynamicLayoutVertexBuffer.destroy(),this.opacityVertexBuffer.destroy(),this.globeExtVertexBuffer&&this.globeExtVertexBuffer.destroy());}}Oi(ud,\"SymbolBuffers\");class cd{constructor(t,e,r){this.layoutVertexArray=new t,this.layoutAttributes=e,this.indexArray=new r,this.segments=new So,this.collisionVertexArray=new va,this.collisionVertexArrayExt=new ba;}upload(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,this.layoutAttributes),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.collisionVertexBuffer=t.createVertexBuffer(this.collisionVertexArray,Zh.members,!0),this.collisionVertexBufferExt=t.createVertexBuffer(this.collisionVertexArrayExt,Kh.members,!0);}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.segments.destroy(),this.collisionVertexBuffer.destroy(),this.collisionVertexBufferExt.destroy());}}Oi(cd,\"CollisionBuffers\");class hd{constructor(t){this.collisionBoxArray=t.collisionBoxArray,this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.pixelRatio=t.pixelRatio,this.sourceLayerIndex=t.sourceLayerIndex,this.hasPattern=!1,this.hasRTLText=!1,this.fullyClipped=!1,this.sortKeyRanges=[],this.collisionCircleArray=[],this.placementInvProjMatrix=Eo([]),this.placementViewportMatrix=Eo([]);const e=this.layers[0]._unevaluatedLayout._values;this.textSizeData=Qh(this.zoom,e[\"text-size\"]),this.iconSizeData=Qh(this.zoom,e[\"icon-size\"]);const r=this.layers[0].layout,n=r.get(\"symbol-sort-key\"),i=r.get(\"symbol-z-order\");this.canOverlap=r.get(\"text-allow-overlap\")||r.get(\"icon-allow-overlap\")||r.get(\"text-ignore-placement\")||r.get(\"icon-ignore-placement\"),this.sortFeaturesByKey=\"viewport-y\"!==i&&void 0!==n.constantOr(1),this.sortFeaturesByY=(\"viewport-y\"===i||\"auto\"===i&&!this.sortFeaturesByKey)&&this.canOverlap,this.writingModes=r.get(\"text-writing-mode\").map((t=>Vp[t])),this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id)),this.sourceID=t.sourceID,this.projection=t.projection;}createArrays(){this.text=new ud(new fo(this.layers,this.zoom,(t=>/^text/.test(t)))),this.icon=new ud(new fo(this.layers,this.zoom,(t=>/^icon/.test(t)))),this.glyphOffsetArray=new La,this.lineVertexArray=new Fa,this.symbolInstances=new Va;}calculateGlyphDependencies(t,e,r,n,i){for(let r=0;r<t.length;r++)if(e[t.charCodeAt(r)]=!0,n&&i){const n=ip[t.charAt(r)];n&&(e[n.charCodeAt(0)]=!0);}}populate(t,e,r,n){const i=this.layers[0],s=i.layout,a=\"globe\"===this.projection.name,o=s.get(\"text-font\"),l=s.get(\"text-field\"),u=s.get(\"icon-image\"),c=(\"constant\"!==l.value.kind||l.value.value instanceof Be&&!l.value.value.isEmpty()||l.value.value.toString().length>0)&&(\"constant\"!==o.value.kind||o.value.value.length>0),h=\"constant\"!==u.value.kind||!!u.value.value||Object.keys(u.parameters).length>0,p=s.get(\"symbol-sort-key\");if(this.features=[],!c&&!h)return;const f=e.iconDependencies,d=e.glyphDependencies,y=e.availableImages,m=new Us(this.zoom);for(const{feature:e,id:l,index:u,sourceLayerIndex:g}of t){const t=i._featureFilter.needGeometry,x=wu(e,t);if(!i._featureFilter.filter(m,x,r))continue;if(t||(x.geometry=bu(e,r,n)),a&&1!==e.type&&r.z<=5){const t=x.geometry,e=.98078528056,n=(t,n)=>Qo(Ol(t.x,t.y,r,1),Ol(n.x,n.y,r,1))<e;for(let e=0;e<t.length;e++)t[e]=mu(t[e],n);}let v,b;if(c){const t=i.getValueAndResolveTokens(\"text-field\",x,r,y),e=Be.factory(t);ld(e)&&(this.hasRTLText=!0),(!this.hasRTLText||\"unavailable\"===Fs()||this.hasRTLText&&js.isParsed())&&(v=np(e,i,x));}if(h){const t=i.getValueAndResolveTokens(\"icon-image\",x,r,y);b=t instanceof Ee?t:Ee.fromString(t);}if(!v&&!b)continue;const w=this.sortFeaturesByKey?p.evaluate(x,{},r):void 0;if(this.features.push({id:l,text:v,icon:b,index:u,sourceLayerIndex:g,geometry:x.geometry,properties:e.properties,type:nd[e.type],sortKey:w}),b&&(f[b.name]=!0),v){const t=o.evaluate(x,{},r).join(\",\"),e=\"map\"===s.get(\"text-rotation-alignment\")&&\"point\"!==s.get(\"symbol-placement\");this.allowVerticalPlacement=this.writingModes&&this.writingModes.indexOf(Vp.vertical)>=0;for(const r of v.sections)if(r.image)f[r.image.name]=!0;else {const n=bs(v.toString()),i=r.fontStack||t,s=d[i]=d[i]||{};this.calculateGlyphDependencies(r.text,s,e,this.allowVerticalPlacement,n);}}}\"line\"===s.get(\"symbol-placement\")&&(this.features=function(t){const e={},r={},n=[];let i=0;function s(e){n.push(t[e]),i++;}function a(t,e,i){const s=r[t];return delete r[t],r[e]=s,n[s].geometry[0].pop(),n[s].geometry[0]=n[s].geometry[0].concat(i[0]),s}function o(t,r,i){const s=e[r];return delete e[r],e[t]=s,n[s].geometry[0].shift(),n[s].geometry[0]=i[0].concat(n[s].geometry[0]),s}function l(t,e,r){const n=r?e[0][e[0].length-1]:e[0][0];return `${t}:${n.x}:${n.y}`}for(let u=0;u<t.length;u++){const c=t[u],h=c.geometry,p=c.text?c.text.toString():null;if(!p){s(u);continue}const f=l(p,h),d=l(p,h,!0);if(f in r&&d in e&&r[f]!==e[d]){const t=o(f,d,h),i=a(f,d,n[t].geometry);delete e[f],delete r[d],r[l(p,n[i].geometry,!0)]=i,n[t].geometry=null;}else f in r?a(f,d,h):d in e?o(f,d,h):(s(u),e[f]=i-1,r[d]=i-1);}return n.filter((t=>t.geometry))}(this.features)),this.sortFeaturesByKey&&this.features.sort(((t,e)=>t.sortKey-e.sortKey));}update(t,e,r,n){this.stateDependentLayers.length&&(this.text.programConfigurations.updatePaintArrays(t,e,this.layers,r,n),this.icon.programConfigurations.updatePaintArrays(t,e,this.layers,r,n));}isEmpty(){return 0===this.symbolInstances.length&&!this.hasRTLText}uploadPending(){return !this.uploaded||this.text.programConfigurations.needsUpload||this.icon.programConfigurations.needsUpload}upload(t){!this.uploaded&&this.hasDebugData()&&(this.textCollisionBox.upload(t),this.iconCollisionBox.upload(t)),this.text.upload(t,this.sortFeaturesByY,!this.uploaded,this.text.programConfigurations.needsUpload),this.icon.upload(t,this.sortFeaturesByY,!this.uploaded,this.icon.programConfigurations.needsUpload),this.uploaded=!0;}destroyDebugData(){this.textCollisionBox.destroy(),this.iconCollisionBox.destroy();}getProjection(){return this.projectionInstance||(this.projectionInstance=rd(this.projection)),this.projectionInstance}destroy(){this.text.destroy(),this.icon.destroy(),this.hasDebugData()&&this.destroyDebugData();}addToLineVertexArray(t,e){const r=this.lineVertexArray.length;if(void 0!==t.segment)for(const{x:t,y:r}of e)this.lineVertexArray.emplaceBack(t,r);return {lineStartIndex:r,lineLength:this.lineVertexArray.length-r}}addSymbols(t,e,r,n,i,s,a,o,l,u,c,h,p,f){const d=t.indexArray,y=t.layoutVertexArray,m=t.globeExtVertexArray,g=t.segments.prepareSegment(4*e.length,y,d,this.canOverlap?s.sortKey:void 0),x=this.glyphOffsetArray.length,v=g.vertexLength,b=this.allowVerticalPlacement&&a===Vp.vertical?Math.PI/2:0,w=s.text&&s.text.sections;for(let n=0;n<e.length;n++){const{tl:i,tr:a,bl:u,br:c,tex:h,pixelOffsetTL:x,pixelOffsetBR:v,minFontScaleX:_,minFontScaleY:A,glyphOffset:S,isSDF:k,sectionIndex:I}=e[n],M=g.vertexLength,T=S[1];if(sd(y,l.x,l.y,i.x,T+i.y,h.x,h.y,r,k,x.x,x.y,_,A),sd(y,l.x,l.y,a.x,T+a.y,h.x+h.w,h.y,r,k,v.x,x.y,_,A),sd(y,l.x,l.y,u.x,T+u.y,h.x,h.y+h.h,r,k,x.x,v.y,_,A),sd(y,l.x,l.y,c.x,T+c.y,h.x+h.w,h.y+h.h,r,k,v.x,v.y,_,A),o){const{x:e,y:r,z:n}=o.anchor,[i,s,a]=o.up;ad(m,e,r,n,i,s,a),ad(m,e,r,n,i,s,a),ad(m,e,r,n,i,s,a),ad(m,e,r,n,i,s,a),od(t.dynamicLayoutVertexArray,e,r,n,b);}else od(t.dynamicLayoutVertexArray,l.x,l.y,l.z,b);d.emplaceBack(M,M+1,M+2),d.emplaceBack(M+1,M+2,M+3),g.vertexLength+=4,g.primitiveLength+=2,this.glyphOffsetArray.emplaceBack(S[0]),n!==e.length-1&&I===e[n+1].sectionIndex||t.programConfigurations.populatePaintArrays(y.length,s,s.index,{},p,f,w&&w[I]);}const _=o?o.anchor:l;t.placedSymbolArray.emplaceBack(_.x,_.y,_.z,l.x,l.y,x,this.glyphOffsetArray.length-x,v,u,c,l.segment,r?r[0]:0,r?r[1]:0,n[0],n[1],a,0,!1,0,h,0);}_commitLayoutVertex(t,e,r,n,i,s,a){t.emplaceBack(e,r,n,i,s,Math.round(a.x),Math.round(a.y));}_addCollisionDebugVertices(t,e,r,n,i,s,a){const o=r.segments.prepareSegment(4,r.layoutVertexArray,r.indexArray),l=o.vertexLength,u=a.tileAnchorX,c=a.tileAnchorY;for(let t=0;t<4;t++)r.collisionVertexArray.emplaceBack(0,0,0,0);r.collisionVertexArrayExt.emplaceBack(e,-t.padding,-t.padding),r.collisionVertexArrayExt.emplaceBack(e,t.padding,-t.padding),r.collisionVertexArrayExt.emplaceBack(e,t.padding,t.padding),r.collisionVertexArrayExt.emplaceBack(e,-t.padding,t.padding),this._commitLayoutVertex(r.layoutVertexArray,n,i,s,u,c,new d(t.x1,t.y1)),this._commitLayoutVertex(r.layoutVertexArray,n,i,s,u,c,new d(t.x2,t.y1)),this._commitLayoutVertex(r.layoutVertexArray,n,i,s,u,c,new d(t.x2,t.y2)),this._commitLayoutVertex(r.layoutVertexArray,n,i,s,u,c,new d(t.x1,t.y2)),o.vertexLength+=4;const h=r.indexArray;h.emplaceBack(l,l+1),h.emplaceBack(l+1,l+2),h.emplaceBack(l+2,l+3),h.emplaceBack(l+3,l),o.primitiveLength+=4;}_addTextDebugCollisionBoxes(t,e,r,n,i,s){for(let a=n;a<i;a++){const n=r.get(a),i=this.getSymbolInstanceTextSize(t,s,e,a);this._addCollisionDebugVertices(n,i,this.textCollisionBox,n.projectedAnchorX,n.projectedAnchorY,n.projectedAnchorZ,s);}}_addIconDebugCollisionBoxes(t,e,r,n,i,s){for(let a=n;a<i;a++){const n=r.get(a),i=this.getSymbolInstanceIconSize(t,e,s.placedIconSymbolIndex);this._addCollisionDebugVertices(n,i,this.iconCollisionBox,n.projectedAnchorX,n.projectedAnchorY,n.projectedAnchorZ,s);}}generateCollisionDebugBuffers(t,e){this.hasDebugData()&&this.destroyDebugData(),this.textCollisionBox=new cd(ga,Yh.members,Ma),this.iconCollisionBox=new cd(ga,Yh.members,Ma);const r=ep(this.iconSizeData,t),n=ep(this.textSizeData,t);for(let i=0;i<this.symbolInstances.length;i++){const s=this.symbolInstances.get(i);this._addTextDebugCollisionBoxes(n,t,e,s.textBoxStartIndex,s.textBoxEndIndex,s),this._addTextDebugCollisionBoxes(n,t,e,s.verticalTextBoxStartIndex,s.verticalTextBoxEndIndex,s),this._addIconDebugCollisionBoxes(r,t,e,s.iconBoxStartIndex,s.iconBoxEndIndex,s),this._addIconDebugCollisionBoxes(r,t,e,s.verticalIconBoxStartIndex,s.verticalIconBoxEndIndex,s);}}getSymbolInstanceTextSize(t,e,r,n){const i=this.text.placedSymbolArray.get(e.rightJustifiedTextSymbolIndex>=0?e.rightJustifiedTextSymbolIndex:e.centerJustifiedTextSymbolIndex>=0?e.centerJustifiedTextSymbolIndex:e.leftJustifiedTextSymbolIndex>=0?e.leftJustifiedTextSymbolIndex:e.verticalPlacedTextSymbolIndex>=0?e.verticalPlacedTextSymbolIndex:n),s=tp(this.textSizeData,t,i)/Wh;return this.tilePixelRatio*s}getSymbolInstanceIconSize(t,e,r){const n=this.icon.placedSymbolArray.get(r),i=tp(this.iconSizeData,t,n);return this.tilePixelRatio*i}_commitDebugCollisionVertexUpdate(t,e,r){t.emplaceBack(e,-r,-r),t.emplaceBack(e,r,-r),t.emplaceBack(e,r,r),t.emplaceBack(e,-r,r);}_updateTextDebugCollisionBoxes(t,e,r,n,i,s){for(let a=n;a<i;a++){const n=r.get(a),i=this.getSymbolInstanceTextSize(t,s,e,a);this._commitDebugCollisionVertexUpdate(this.textCollisionBox.collisionVertexArrayExt,i,n.padding);}}_updateIconDebugCollisionBoxes(t,e,r,n,i,s){for(let a=n;a<i;a++){const n=r.get(a),i=this.getSymbolInstanceIconSize(t,e,s);this._commitDebugCollisionVertexUpdate(this.iconCollisionBox.collisionVertexArrayExt,i,n.padding);}}updateCollisionDebugBuffers(t,e){if(!this.hasDebugData())return;this.hasTextCollisionBoxData()&&this.textCollisionBox.collisionVertexArrayExt.clear(),this.hasIconCollisionBoxData()&&this.iconCollisionBox.collisionVertexArrayExt.clear();const r=ep(this.iconSizeData,t),n=ep(this.textSizeData,t);for(let i=0;i<this.symbolInstances.length;i++){const s=this.symbolInstances.get(i);this._updateTextDebugCollisionBoxes(n,t,e,s.textBoxStartIndex,s.textBoxEndIndex,s),this._updateTextDebugCollisionBoxes(n,t,e,s.verticalTextBoxStartIndex,s.verticalTextBoxEndIndex,s),this._updateIconDebugCollisionBoxes(r,t,e,s.iconBoxStartIndex,s.iconBoxEndIndex,s.placedIconSymbolIndex),this._updateIconDebugCollisionBoxes(r,t,e,s.verticalIconBoxStartIndex,s.verticalIconBoxEndIndex,s.placedIconSymbolIndex);}this.hasTextCollisionBoxData()&&this.textCollisionBox.collisionVertexBufferExt&&this.textCollisionBox.collisionVertexBufferExt.updateData(this.textCollisionBox.collisionVertexArrayExt),this.hasIconCollisionBoxData()&&this.iconCollisionBox.collisionVertexBufferExt&&this.iconCollisionBox.collisionVertexBufferExt.updateData(this.iconCollisionBox.collisionVertexArrayExt);}_deserializeCollisionBoxesForSymbol(t,e,r,n,i,s,a,o,l){const u={};if(e<r){const{x1:r,y1:n,x2:i,y2:s,padding:a,projectedAnchorX:o,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p,featureIndex:f}=t.get(e);u.textBox={x1:r,y1:n,x2:i,y2:s,padding:a,projectedAnchorX:o,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p},u.textFeatureIndex=f;}if(n<i){const{x1:e,y1:r,x2:i,y2:s,padding:a,projectedAnchorX:o,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p,featureIndex:f}=t.get(n);u.verticalTextBox={x1:e,y1:r,x2:i,y2:s,padding:a,projectedAnchorX:o,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p},u.verticalTextFeatureIndex=f;}if(s<a){const{x1:e,y1:r,x2:n,y2:i,padding:a,projectedAnchorX:o,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p,featureIndex:f}=t.get(s);u.iconBox={x1:e,y1:r,x2:n,y2:i,padding:a,projectedAnchorX:o,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p},u.iconFeatureIndex=f;}if(o<l){const{x1:e,y1:r,x2:n,y2:i,padding:s,projectedAnchorX:a,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p,featureIndex:f}=t.get(o);u.verticalIconBox={x1:e,y1:r,x2:n,y2:i,padding:s,projectedAnchorX:a,projectedAnchorY:l,projectedAnchorZ:c,tileAnchorX:h,tileAnchorY:p},u.verticalIconFeatureIndex=f;}return u}deserializeCollisionBoxes(t){this.collisionArrays=[];for(let e=0;e<this.symbolInstances.length;e++){const r=this.symbolInstances.get(e);this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(t,r.textBoxStartIndex,r.textBoxEndIndex,r.verticalTextBoxStartIndex,r.verticalTextBoxEndIndex,r.iconBoxStartIndex,r.iconBoxEndIndex,r.verticalIconBoxStartIndex,r.verticalIconBoxEndIndex));}}hasTextData(){return this.text.segments.get().length>0}hasIconData(){return this.icon.segments.get().length>0}hasDebugData(){return this.textCollisionBox&&this.iconCollisionBox}hasTextCollisionBoxData(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0}hasIconCollisionBoxData(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0}addIndicesForPlacedSymbol(t,e){const r=t.placedSymbolArray.get(e),n=r.vertexStartIndex+4*r.numGlyphs;for(let e=r.vertexStartIndex;e<n;e+=4)t.indexArray.emplaceBack(e,e+1,e+2),t.indexArray.emplaceBack(e+1,e+2,e+3);}getSortedSymbolIndexes(t){if(this.sortedAngle===t&&void 0!==this.symbolInstanceIndexes)return this.symbolInstanceIndexes;const e=Math.sin(t),r=Math.cos(t),n=[],i=[],s=[];for(let t=0;t<this.symbolInstances.length;++t){s.push(t);const a=this.symbolInstances.get(t);n.push(0|Math.round(e*a.tileAnchorX+r*a.tileAnchorY)),i.push(a.featureIndex);}return s.sort(((t,e)=>n[t]-n[e]||i[e]-i[t])),s}addToSortKeyRanges(t,e){const r=this.sortKeyRanges[this.sortKeyRanges.length-1];r&&r.sortKey===e?r.symbolInstanceEnd=t+1:this.sortKeyRanges.push({sortKey:e,symbolInstanceStart:t,symbolInstanceEnd:t+1});}sortFeatures(t){if(this.sortFeaturesByY&&this.sortedAngle!==t&&!(this.text.segments.get().length>1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(const t of this.symbolInstanceIndexes){const e=this.symbolInstances.get(t);this.featureSortOrder.push(e.featureIndex);const{rightJustifiedTextSymbolIndex:r,centerJustifiedTextSymbolIndex:n,leftJustifiedTextSymbolIndex:i,verticalPlacedTextSymbolIndex:s,placedIconSymbolIndex:a,verticalPlacedIconSymbolIndex:o}=e;r>=0&&this.addIndicesForPlacedSymbol(this.text,r),n>=0&&n!==r&&this.addIndicesForPlacedSymbol(this.text,n),i>=0&&i!==n&&i!==r&&this.addIndicesForPlacedSymbol(this.text,i),s>=0&&this.addIndicesForPlacedSymbol(this.text,s),a>=0&&this.addIndicesForPlacedSymbol(this.icon,a),o>=0&&this.addIndicesForPlacedSymbol(this.icon,o);}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray);}}}Oi(hd,\"SymbolBucket\",{omit:[\"layers\",\"collisionBoxArray\",\"features\",\"compareText\"]}),hd.MAX_GLYPHS=65535,hd.addDynamicAttributes=od;const pd=new Js({\"symbol-placement\":new Ys(Ht.layout_symbol[\"symbol-placement\"]),\"symbol-spacing\":new Ys(Ht.layout_symbol[\"symbol-spacing\"]),\"symbol-avoid-edges\":new Ys(Ht.layout_symbol[\"symbol-avoid-edges\"]),\"symbol-sort-key\":new Hs(Ht.layout_symbol[\"symbol-sort-key\"]),\"symbol-z-order\":new Ys(Ht.layout_symbol[\"symbol-z-order\"]),\"icon-allow-overlap\":new Ys(Ht.layout_symbol[\"icon-allow-overlap\"]),\"icon-ignore-placement\":new Ys(Ht.layout_symbol[\"icon-ignore-placement\"]),\"icon-optional\":new Ys(Ht.layout_symbol[\"icon-optional\"]),\"icon-rotation-alignment\":new Ys(Ht.layout_symbol[\"icon-rotation-alignment\"]),\"icon-size\":new Hs(Ht.layout_symbol[\"icon-size\"]),\"icon-text-fit\":new Ys(Ht.layout_symbol[\"icon-text-fit\"]),\"icon-text-fit-padding\":new Ys(Ht.layout_symbol[\"icon-text-fit-padding\"]),\"icon-image\":new Hs(Ht.layout_symbol[\"icon-image\"]),\"icon-rotate\":new Hs(Ht.layout_symbol[\"icon-rotate\"]),\"icon-padding\":new Ys(Ht.layout_symbol[\"icon-padding\"]),\"icon-keep-upright\":new Ys(Ht.layout_symbol[\"icon-keep-upright\"]),\"icon-offset\":new Hs(Ht.layout_symbol[\"icon-offset\"]),\"icon-anchor\":new Hs(Ht.layout_symbol[\"icon-anchor\"]),\"icon-pitch-alignment\":new Ys(Ht.layout_symbol[\"icon-pitch-alignment\"]),\"text-pitch-alignment\":new Ys(Ht.layout_symbol[\"text-pitch-alignment\"]),\"text-rotation-alignment\":new Ys(Ht.layout_symbol[\"text-rotation-alignment\"]),\"text-field\":new Hs(Ht.layout_symbol[\"text-field\"]),\"text-font\":new Hs(Ht.layout_symbol[\"text-font\"]),\"text-size\":new Hs(Ht.layout_symbol[\"text-size\"]),\"text-max-width\":new Hs(Ht.layout_symbol[\"text-max-width\"]),\"text-line-height\":new Hs(Ht.layout_symbol[\"text-line-height\"]),\"text-letter-spacing\":new Hs(Ht.layout_symbol[\"text-letter-spacing\"]),\"text-justify\":new Hs(Ht.layout_symbol[\"text-justify\"]),\"text-radial-offset\":new Hs(Ht.layout_symbol[\"text-radial-offset\"]),\"text-variable-anchor\":new Ys(Ht.layout_symbol[\"text-variable-anchor\"]),\"text-anchor\":new Hs(Ht.layout_symbol[\"text-anchor\"]),\"text-max-angle\":new Ys(Ht.layout_symbol[\"text-max-angle\"]),\"text-writing-mode\":new Ys(Ht.layout_symbol[\"text-writing-mode\"]),\"text-rotate\":new Hs(Ht.layout_symbol[\"text-rotate\"]),\"text-padding\":new Ys(Ht.layout_symbol[\"text-padding\"]),\"text-keep-upright\":new Ys(Ht.layout_symbol[\"text-keep-upright\"]),\"text-transform\":new Hs(Ht.layout_symbol[\"text-transform\"]),\"text-offset\":new Hs(Ht.layout_symbol[\"text-offset\"]),\"text-allow-overlap\":new Ys(Ht.layout_symbol[\"text-allow-overlap\"]),\"text-ignore-placement\":new Ys(Ht.layout_symbol[\"text-ignore-placement\"]),\"text-optional\":new Ys(Ht.layout_symbol[\"text-optional\"])});var fd={paint:new Js({\"icon-opacity\":new Hs(Ht.paint_symbol[\"icon-opacity\"]),\"icon-color\":new Hs(Ht.paint_symbol[\"icon-color\"]),\"icon-halo-color\":new Hs(Ht.paint_symbol[\"icon-halo-color\"]),\"icon-halo-width\":new Hs(Ht.paint_symbol[\"icon-halo-width\"]),\"icon-halo-blur\":new Hs(Ht.paint_symbol[\"icon-halo-blur\"]),\"icon-translate\":new Ys(Ht.paint_symbol[\"icon-translate\"]),\"icon-translate-anchor\":new Ys(Ht.paint_symbol[\"icon-translate-anchor\"]),\"text-opacity\":new Hs(Ht.paint_symbol[\"text-opacity\"]),\"text-color\":new Hs(Ht.paint_symbol[\"text-color\"],{runtimeType:le,getOverride:t=>t.textColor,hasOverride:t=>!!t.textColor}),\"text-halo-color\":new Hs(Ht.paint_symbol[\"text-halo-color\"]),\"text-halo-width\":new Hs(Ht.paint_symbol[\"text-halo-width\"]),\"text-halo-blur\":new Hs(Ht.paint_symbol[\"text-halo-blur\"]),\"text-translate\":new Ys(Ht.paint_symbol[\"text-translate\"]),\"text-translate-anchor\":new Ys(Ht.paint_symbol[\"text-translate-anchor\"])}),layout:pd};class dd{constructor(t){this.type=t.property.overrides?t.property.overrides.runtimeType:ie,this.defaultValue=t;}evaluate(t){if(t.formattedSection){const e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default}eachChild(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression);}outputDefined(){return !1}serialize(){return null}}Oi(dd,\"FormatSectionOverride\",{omit:[\"defaultValue\"]});class yd extends wo{constructor(t){super(t,fd);}recalculate(t,e){super.recalculate(t,e),\"auto\"===this.layout.get(\"icon-rotation-alignment\")&&(this.layout._values[\"icon-rotation-alignment\"]=\"point\"!==this.layout.get(\"symbol-placement\")?\"map\":\"viewport\"),\"auto\"===this.layout.get(\"text-rotation-alignment\")&&(this.layout._values[\"text-rotation-alignment\"]=\"point\"!==this.layout.get(\"symbol-placement\")?\"map\":\"viewport\"),\"auto\"===this.layout.get(\"text-pitch-alignment\")&&(this.layout._values[\"text-pitch-alignment\"]=this.layout.get(\"text-rotation-alignment\")),\"auto\"===this.layout.get(\"icon-pitch-alignment\")&&(this.layout._values[\"icon-pitch-alignment\"]=this.layout.get(\"icon-rotation-alignment\"));const r=this.layout.get(\"text-writing-mode\");if(r){const t=[];for(const e of r)t.indexOf(e)<0&&t.push(e);this.layout._values[\"text-writing-mode\"]=t;}else this.layout._values[\"text-writing-mode\"]=\"point\"===this.layout.get(\"symbol-placement\")?[\"horizontal\"]:[\"horizontal\",\"vertical\"];this._setPaintOverrides();}getValueAndResolveTokens(t,e,r,n){const i=this.layout.get(t).evaluate(e,{},r,n),s=this._unevaluatedLayout._values[t];return s.isDataDriven()||Nn(s.value)||!i?i:function(t,e){return e.replace(/{([^{}]+)}/g,((e,r)=>r in t?String(t[r]):\"\"))}(e.properties,i)}createBucket(t){return new hd(t)}queryRadius(){return 0}queryIntersectsFeature(){return !1}_setPaintOverrides(){for(const t of fd.paint.overridableProperties){if(!yd.hasPaintOverride(this.layout,t))continue;const e=this.paint.get(t),r=new dd(e),n=new qn(r,e.property.specification);let i=null;i=\"constant\"===e.value.kind||\"source\"===e.value.kind?new Xn(\"source\",n):new Zn(\"composite\",n,e.value.zoomStops,e.value._interpolationType),this.paint._values[t]=new Zs(e.property,i,e.parameters);}}_handleOverridablePaintPropertyUpdate(t,e,r){return !(!this.layout||e.isDataDriven()||r.isDataDriven())&&yd.hasPaintOverride(this.layout,t)}static hasPaintOverride(t,e){const r=t.get(\"text-field\"),n=fd.paint.properties[e];let i=!1;const s=t=>{for(const e of t)if(n.overrides&&n.overrides.hasOverride(e))return void(i=!0)};if(\"constant\"===r.value.kind&&r.value.value instanceof Be)s(r.value.value.sections);else if(\"source\"===r.value.kind){const t=e=>{i||(e instanceof Fe&&De(e.value)===pe?s(e.value.sections):e instanceof Oe?s(e.sections):e.eachChild(t));},e=r.value;e._styleExpression&&t(e._styleExpression.expression);}return i}getProgramConfiguration(t){return new po(this,t)}}var md={paint:new Js({\"background-color\":new Ys(Ht.paint_background[\"background-color\"]),\"background-pattern\":new Ys(Ht.paint_background[\"background-pattern\"]),\"background-opacity\":new Ys(Ht.paint_background[\"background-opacity\"])})},gd={paint:new Js({\"raster-opacity\":new Ys(Ht.paint_raster[\"raster-opacity\"]),\"raster-hue-rotate\":new Ys(Ht.paint_raster[\"raster-hue-rotate\"]),\"raster-brightness-min\":new Ys(Ht.paint_raster[\"raster-brightness-min\"]),\"raster-brightness-max\":new Ys(Ht.paint_raster[\"raster-brightness-max\"]),\"raster-saturation\":new Ys(Ht.paint_raster[\"raster-saturation\"]),\"raster-contrast\":new Ys(Ht.paint_raster[\"raster-contrast\"]),\"raster-resampling\":new Ys(Ht.paint_raster[\"raster-resampling\"]),\"raster-fade-duration\":new Ys(Ht.paint_raster[\"raster-fade-duration\"])})};class xd extends wo{constructor(t){super(t,{}),this.implementation=t;}is3D(){return \"3d\"===this.implementation.renderingMode}hasOffscreenPass(){return void 0!==this.implementation.prerender}isLayerDraped(){return void 0!==this.implementation.renderToTile}shouldRedrape(){return !!this.implementation.shouldRerenderTiles&&this.implementation.shouldRerenderTiles()}recalculate(){}updateTransitions(){}hasTransition(){return !1}serialize(){}onAdd(t){this.implementation.onAdd&&this.implementation.onAdd(t,t.painter.context.gl);}onRemove(t){this.implementation.onRemove&&this.implementation.onRemove(t,t.painter.context.gl);}}var vd={paint:new Js({\"sky-type\":new Ys(Ht.paint_sky[\"sky-type\"]),\"sky-atmosphere-sun\":new Ys(Ht.paint_sky[\"sky-atmosphere-sun\"]),\"sky-atmosphere-sun-intensity\":new Ys(Ht.paint_sky[\"sky-atmosphere-sun-intensity\"]),\"sky-gradient-center\":new Ys(Ht.paint_sky[\"sky-gradient-center\"]),\"sky-gradient-radius\":new Ys(Ht.paint_sky[\"sky-gradient-radius\"]),\"sky-gradient\":new Ws(Ht.paint_sky[\"sky-gradient\"]),\"sky-atmosphere-halo-color\":new Ys(Ht.paint_sky[\"sky-atmosphere-halo-color\"]),\"sky-atmosphere-color\":new Ys(Ht.paint_sky[\"sky-atmosphere-color\"]),\"sky-opacity\":new Ys(Ht.paint_sky[\"sky-opacity\"])})};function bd(t,e,r){const n=[0,0,1],i=hl([]);return fl(i,i,r?-x(t)+Math.PI:x(t)),pl(i,i,-x(e)),rl(n,n,i),Jo(n,n)}const wd={circle:class extends wo{constructor(t){super(t,Ou);}createBucket(t){return new Su(t)}queryRadius(t){const e=t;return Fu(\"circle-radius\",this,e)+Fu(\"circle-stroke-width\",this,e)+Ru(this.paint.get(\"circle-translate\"))}queryIntersectsFeature(t,e,r,n,i,s,a,o){const l=Uu(this.paint.get(\"circle-translate\"),this.paint.get(\"circle-translate-anchor\"),s.angle,t.pixelToTileUnitsFactor),u=this.paint.get(\"circle-radius\").evaluate(e,r)+this.paint.get(\"circle-stroke-width\").evaluate(e,r);return qu(t,n,s,a,o,\"map\"===this.paint.get(\"circle-pitch-alignment\"),\"map\"===this.paint.get(\"circle-pitch-scale\"),l,u)}getProgramIds(){return [\"circle\"]}getProgramConfiguration(t){return new po(this,t)}},heatmap:class extends wo{createBucket(t){return new Ku(t)}constructor(t){super(t,tc),this._updateColorRamp();}_handleSpecialPaintPropertyUpdate(t){\"heatmap-color\"===t&&this._updateColorRamp();}_updateColorRamp(){this.colorRamp=ec({expression:this._transitionablePaint._values[\"heatmap-color\"].value.expression,evaluationKey:\"heatmapDensity\",image:this.colorRamp}),this.colorRampTexture=null;}resize(){this.heatmapFbo&&(this.heatmapFbo.destroy(),this.heatmapFbo=null);}queryRadius(t){return Fu(\"heatmap-radius\",this,t)}queryIntersectsFeature(t,e,r,n,i,s,a,o){const l=this.paint.get(\"heatmap-radius\").evaluate(e,r);return qu(t,n,s,a,o,!0,!0,new d(0,0),l)}hasOffscreenPass(){return 0!==this.paint.get(\"heatmap-opacity\")&&\"none\"!==this.visibility}getProgramIds(){return [\"heatmap\",\"heatmapTexture\"]}getProgramConfiguration(t){return new po(this,t)}},hillshade:class extends wo{constructor(t){super(t,rc);}hasOffscreenPass(){return 0!==this.paint.get(\"hillshade-exaggeration\")&&\"none\"!==this.visibility}getProgramIds(){return [\"hillshade\",\"hillshadePrepare\"]}},fill:class extends wo{constructor(t){super(t,Oc);}getProgramIds(){const t=this.paint.get(\"fill-pattern\"),e=t&&t.constantOr(1),r=[e?\"fillPattern\":\"fill\"];return this.paint.get(\"fill-antialias\")&&r.push(e&&!this.getPaintProperty(\"fill-outline-color\")?\"fillOutlinePattern\":\"fillOutline\"),r}getProgramConfiguration(t){return new po(this,t)}recalculate(t,e){super.recalculate(t,e);const r=this.paint._values[\"fill-outline-color\"];\"constant\"===r.value.kind&&void 0===r.value.value&&(this.paint._values[\"fill-outline-color\"]=this.paint._values[\"fill-color\"]);}createBucket(t){return new Uc(t)}queryRadius(){return Ru(this.paint.get(\"fill-translate\"))}queryIntersectsFeature(t,e,r,n,i,s){return !t.queryGeometry.isAboveHorizon&&Mu(ju(t.tilespaceGeometry,this.paint.get(\"fill-translate\"),this.paint.get(\"fill-translate-anchor\"),s.angle,t.pixelToTileUnitsFactor),n)}isTileClipped(){return !0}},\"fill-extrusion\":class extends wo{constructor(t){super(t,Ah);}createBucket(t){return new fh(t)}queryRadius(){return Ru(this.paint.get(\"fill-extrusion-translate\"))}is3D(){return !0}getProgramIds(){return [this.paint.get(\"fill-extrusion-pattern\").constantOr(1)?\"fillExtrusionPattern\":\"fillExtrusion\"]}getProgramConfiguration(t){return new po(this,t)}queryIntersectsFeature(t,e,r,n,i,s,a,o,l){const u=Uu(this.paint.get(\"fill-extrusion-translate\"),this.paint.get(\"fill-extrusion-translate-anchor\"),s.angle,t.pixelToTileUnitsFactor),c=this.paint.get(\"fill-extrusion-height\").evaluate(e,r),h=this.paint.get(\"fill-extrusion-base\").evaluate(e,r),p=[0,0],f=o&&s.elevation,y=s.elevation?s.elevation.exaggeration():1,m=t.tile.getBucket(this);if(f&&m instanceof fh){const t=m.centroidVertexArray,e=l+1;e<t.length&&(p[0]=t.geta_centroid_pos0(e),p[1]=t.geta_centroid_pos1(e));}if(0===p[0]&&1===p[1])return !1;\"globe\"===s.projection.name&&(n=wh([n],[new d(0,0),new d(ko,ko)],t.tileID.canonical).map((t=>t.polygon)).flat());const g=f?o:null,[x,v]=function(t,e,r,n,i,s,a,o,l,u,c){return \"globe\"===t.projection.name?function(t,e,r,n,i,s,a,o,l,u,c){const h=[],p=[],f=t.projection.upVectorScale(c,t.center.lat,t.worldSize).metersToTile,d=[0,0,0,1],y=[0,0,0,1],m=(t,e,r,n)=>{t[0]=e,t[1]=r,t[2]=n,t[3]=1;},g=bh();r>0&&(r+=g),n+=g;for(const g of e){const e=[],x=[];for(const h of g){const p=h.x+i.x,g=h.y+i.y,v=t.projection.projectTilePoint(p,g,c),b=t.projection.upVector(c,h.x,h.y);let w=r,_=n;if(a){const t=Ch(p,g,r,n,a,o,l,u);w+=t.base,_+=t.top;}0!==r?m(d,v.x+b[0]*f*w,v.y+b[1]*f*w,v.z+b[2]*f*w):m(d,v.x,v.y,v.z),m(y,v.x+b[0]*f*_,v.y+b[1]*f*_,v.z+b[2]*f*_),el(d,d,s),el(y,y,s),e.push(new zh(d[0],d[1],d[2])),x.push(new zh(y[0],y[1],y[2]));}h.push(e),p.push(x);}return [h,p]}(t,e,r,n,i,s,a,o,l,u,c):a?function(t,e,r,n,i,s,a,o,l){const u=[],c=[],h=[0,0,0,1];for(const p of t){const t=[],f=[];for(const u of p){const c=u.x+n.x,p=u.y+n.y,d=Ch(c,p,e,r,s,a,o,l);h[0]=c,h[1]=p,h[2]=d.base,h[3]=1,ul(h,h,i),h[3]=Math.max(h[3],1e-5);const y=new zh(h[0]/h[3],h[1]/h[3],h[2]/h[3]);h[0]=c,h[1]=p,h[2]=d.top,h[3]=1,ul(h,h,i),h[3]=Math.max(h[3],1e-5);const m=new zh(h[0]/h[3],h[1]/h[3],h[2]/h[3]);t.push(y),f.push(m);}u.push(t),c.push(f);}return [u,c]}(e,r,n,i,s,a,o,l,u):function(t,e,r,n,i){const s=[],a=[],o=i[8]*e,l=i[9]*e,u=i[10]*e,c=i[11]*e,h=i[8]*r,p=i[9]*r,f=i[10]*r,d=i[11]*r;for(const e of t){const t=[],r=[];for(const s of e){const e=s.x+n.x,a=s.y+n.y,y=i[0]*e+i[4]*a+i[12],m=i[1]*e+i[5]*a+i[13],g=i[2]*e+i[6]*a+i[14],x=i[3]*e+i[7]*a+i[15],v=y+o,b=m+l,w=g+u,_=Math.max(x+c,1e-5),A=y+h,S=m+p,k=g+f,I=Math.max(x+d,1e-5);t.push(new zh(v/_,b/_,w/_)),r.push(new zh(A/I,S/I,k/I));}s.push(t),a.push(r);}return [s,a]}(e,r,n,i,s)}(s,n,h,c,u,a,g,p,y,s.center.lat,t.tileID.canonical),b=t.queryGeometry;return function(t,e,r){let n=1/0;Mu(r,e)&&(n=Eh(r,e[0]));for(let i=0;i<e.length;i++){const s=e[i],a=t[i];for(let t=0;t<s.length-1;t++){const e=s[t],i=[e,s[t+1],a[t+1],a[t],e];ku(r,i)&&(n=Math.min(n,Eh(r,i)));}}return n!==1/0&&n}(x,v,b.isPointQuery()?b.screenBounds:b.screenGeometry)}},line:class extends wo{constructor(t){super(t,$h),this.gradientVersion=0;}_handleSpecialPaintPropertyUpdate(t){if(\"line-gradient\"===t){const t=this._transitionablePaint._values[\"line-gradient\"].value.expression;this.stepInterpolant=t._styleExpression&&t._styleExpression.expression instanceof Ir,this.gradientVersion=(this.gradientVersion+1)%Number.MAX_SAFE_INTEGER;}}gradientExpression(){return this._transitionablePaint._values[\"line-gradient\"].value.expression}widthExpression(){return this._transitionablePaint._values[\"line-width\"].value.expression}recalculate(t,e){super.recalculate(t,e),this.paint._values[\"line-floorwidth\"]=Oh.possiblyEvaluate(this._transitioningPaint._values[\"line-width\"].value,t);}createBucket(t){return new jh(t)}getProgramIds(){return [this.paint.get(\"line-pattern\").constantOr(1)?\"linePattern\":\"line\"]}getProgramConfiguration(t){return new po(this,t)}queryRadius(t){const e=t,r=qh(Fu(\"line-width\",this,e),Fu(\"line-gap-width\",this,e)),n=Fu(\"line-offset\",this,e);return r/2+Math.abs(n)+Ru(this.paint.get(\"line-translate\"))}queryIntersectsFeature(t,e,r,n,i,s){if(t.queryGeometry.isAboveHorizon)return !1;const a=ju(t.tilespaceGeometry,this.paint.get(\"line-translate\"),this.paint.get(\"line-translate-anchor\"),s.angle,t.pixelToTileUnitsFactor),o=t.pixelToTileUnitsFactor/2*qh(this.paint.get(\"line-width\").evaluate(e,r),this.paint.get(\"line-gap-width\").evaluate(e,r)),l=this.paint.get(\"line-offset\").evaluate(e,r);return l&&(n=function(t,e){const r=[],n=new d(0,0);for(let i=0;i<t.length;i++){const s=t[i],a=[];for(let t=0;t<s.length;t++){const r=s[t-1],i=s[t],o=s[t+1],l=0===t?n:i.sub(r)._unit()._perp(),u=t===s.length-1?n:o.sub(i)._unit()._perp(),c=l._add(u)._unit();c._mult(1/(c.x*u.x+c.y*u.y)),a.push(c._mult(e)._add(i));}r.push(a);}return r}(n,l*t.pixelToTileUnitsFactor)),function(t,e,r){for(let n=0;n<e.length;n++){const i=e[n];if(t.length>=3)for(let e=0;e<i.length;e++)if(Du(t,i[e]))return !0;if(Tu(t,i,r))return !0}return !1}(a,n,o)}isTileClipped(){return !0}},symbol:yd,background:class extends wo{constructor(t){super(t,md);}getProgramIds(){return [this.paint.get(\"background-pattern\")?\"backgroundPattern\":\"background\"]}},raster:class extends wo{constructor(t){super(t,gd);}getProgramIds(){return [\"raster\"]}},sky:class extends wo{constructor(t){super(t,vd),this._updateColorRamp();}_handleSpecialPaintPropertyUpdate(t){\"sky-gradient\"===t?this._updateColorRamp():\"sky-atmosphere-sun\"!==t&&\"sky-atmosphere-halo-color\"!==t&&\"sky-atmosphere-color\"!==t&&\"sky-atmosphere-sun-intensity\"!==t||(this._skyboxInvalidated=!0);}_updateColorRamp(){this.colorRamp=ec({expression:this._transitionablePaint._values[\"sky-gradient\"].value.expression,evaluationKey:\"skyRadialProgress\"}),this.colorRampTexture&&(this.colorRampTexture.destroy(),this.colorRampTexture=null);}needsSkyboxCapture(t){if(this._skyboxInvalidated||!this.skyboxTexture||!this.skyboxGeometry)return !0;if(!this.paint.get(\"sky-atmosphere-sun\")){const e=t.style.light.properties.get(\"position\");return this._lightPosition.azimuthal!==e.azimuthal||this._lightPosition.polar!==e.polar}return !1}getCenter(t,e){if(\"atmosphere\"===this.paint.get(\"sky-type\")){const r=this.paint.get(\"sky-atmosphere-sun\"),n=!r,i=t.style.light,s=i.properties.get(\"position\");return n&&\"viewport\"===i.properties.get(\"anchor\")&&$(\"The sun direction is attached to a light with viewport anchor, lighting may behave unexpectedly.\"),n?bd(s.azimuthal,90-s.polar,e):bd(r[0],90-r[1],e)}const r=this.paint.get(\"sky-gradient-center\");return bd(r[0],90-r[1],e)}is3D(){return !1}isSky(){return !0}markSkyboxValid(t){this._skyboxInvalidated=!1,this._lightPosition=t.style.light.properties.get(\"position\");}hasOffscreenPass(){return !0}getProgramIds(){const t=this.paint.get(\"sky-type\");return \"atmosphere\"===t?[\"skyboxCapture\",\"skybox\"]:\"gradient\"===t?[\"skyboxGradient\"]:null}}};class _d{constructor(t,e,r,n){this.context=t,this.format=r,this.texture=t.gl.createTexture(),this.update(e,n);}update(t,r,n){const{width:i,height:s}=t,{context:a}=this,{gl:o}=a,{HTMLImageElement:l,HTMLCanvasElement:u,HTMLVideoElement:c,ImageData:h,ImageBitmap:p}=e;if(o.bindTexture(o.TEXTURE_2D,this.texture),a.pixelStoreUnpackFlipY.set(!1),a.pixelStoreUnpack.set(1),a.pixelStoreUnpackPremultiplyAlpha.set(this.format===o.RGBA&&(!r||!1!==r.premultiply)),n||this.size&&this.size[0]===i&&this.size[1]===s){const{x:e,y:r}=n||{x:0,y:0};t instanceof l||t instanceof u||t instanceof c||t instanceof h||p&&t instanceof p?o.texSubImage2D(o.TEXTURE_2D,0,e,r,o.RGBA,o.UNSIGNED_BYTE,t):o.texSubImage2D(o.TEXTURE_2D,0,e,r,i,s,o.RGBA,o.UNSIGNED_BYTE,t.data);}else this.size=[i,s],t instanceof l||t instanceof u||t instanceof c||t instanceof h||p&&t instanceof p?o.texImage2D(o.TEXTURE_2D,0,this.format,this.format,o.UNSIGNED_BYTE,t):o.texImage2D(o.TEXTURE_2D,0,this.format,i,s,0,this.format,o.UNSIGNED_BYTE,t.data);this.useMipmap=Boolean(r&&r.useMipmap&&this.isSizePowerOfTwo()),this.useMipmap&&o.generateMipmap(o.TEXTURE_2D);}bind(t,e){const{context:r}=this,{gl:n}=r;n.bindTexture(n.TEXTURE_2D,this.texture),t!==this.filter&&(n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,t),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,this.useMipmap?t===n.NEAREST?n.NEAREST_MIPMAP_NEAREST:n.LINEAR_MIPMAP_NEAREST:t),this.filter=t),e!==this.wrap&&(n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,e),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,e),this.wrap=e);}isSizePowerOfTwo(){return this.size[0]===this.size[1]&&Math.log(this.size[0])/Math.LN2%1==0}destroy(){const{gl:t}=this.context;t.deleteTexture(this.texture),this.texture=null;}}class Ad{constructor(t){this._callback=t,this._triggered=!1,\"undefined\"!=typeof MessageChannel&&(this._channel=new MessageChannel,this._channel.port2.onmessage=()=>{this._triggered=!1,this._callback();});}trigger(){this._triggered||(this._triggered=!0,this._channel?this._channel.port1.postMessage(!0):setTimeout((()=>{this._triggered=!1,this._callback();}),0));}remove(){this._channel=void 0,this._callback=()=>{};}}class Sd{constructor(){this.tasks={},this.taskQueue=[],V([\"process\"],this),this.invoker=new Ad(this.process),this.nextId=0;}add(t,e){const r=this.nextId++,n=function({type:t,isSymbolTile:e,zoom:r}){return r=r||0,\"message\"===t?0:\"maybePrepare\"!==t||e?\"parseTile\"!==t||e?\"parseTile\"===t&&e?300-r:\"maybePrepare\"===t&&e?400-r:500:200-r:100-r}(e);if(0===n){N();try{t();}finally{}return {cancel:()=>{}}}return this.tasks[r]={fn:t,metadata:e,priority:n,id:r},this.taskQueue.push(r),this.invoker.trigger(),{cancel:()=>{delete this.tasks[r];}}}process(){N();try{if(this.taskQueue=this.taskQueue.filter((t=>!!this.tasks[t])),!this.taskQueue.length)return;const t=this.pick();if(null===t)return;const e=this.tasks[t];if(delete this.tasks[t],this.taskQueue.length&&this.invoker.trigger(),!e)return;e.fn();}finally{}}pick(){let t=null,e=1/0;for(let r=0;r<this.taskQueue.length;r++){const n=this.tasks[this.taskQueue[r]];n.priority<e&&(e=n.priority,t=r);}if(null===t)return null;const r=this.taskQueue[t];return this.taskQueue.splice(t,1),r}remove(){this.invoker.remove();}}class kd{constructor(t){this._stringToNumber={},this._numberToString=[];for(let e=0;e<t.length;e++){const r=t[e];this._stringToNumber[r]=e,this._numberToString[e]=r;}}encode(t){return this._stringToNumber[t]}decode(t){return this._numberToString[t]}}const Id=[\"tile\",\"layer\",\"source\",\"sourceLayer\",\"state\"];class Md{constructor(t,e,r,n,i){this.type=\"Feature\",this._vectorTileFeature=t,this._z=e,this._x=r,this._y=n,this.properties=t.properties,this.id=i;}get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._x,this._y,this._z).geometry),this._geometry}set geometry(t){this._geometry=t;}toJSON(){const t={type:\"Feature\",geometry:this.geometry,properties:this.properties};void 0!==this.id&&(t.id=this.id);for(const e of Id)void 0!==this[e]&&(t[e]=this[e]);return t}}const Td=32,zd=33,Bd=new Uint16Array(8184);for(let t=0;t<2046;t++){let e=t+2,r=0,n=0,i=0,s=0,a=0,o=0;for(1&e?i=s=a=Td:r=n=o=Td;(e>>=1)>1;){const t=r+i>>1,l=n+s>>1;1&e?(i=r,s=n,r=a,n=o):(r=i,n=s,i=a,s=o),a=t,o=l;}const l=4*t;Bd[l+0]=r,Bd[l+1]=n,Bd[l+2]=i,Bd[l+3]=s;}const Ed=new Uint16Array(2178),Cd=new Uint8Array(1089),Pd=new Uint16Array(1089);function Dd(t){return 0===t?-.03125:32===t?.03125:0}var Vd=na([{name:\"a_pos\",type:\"Int16\",components:2},{name:\"a_texture_pos\",type:\"Int16\",components:2}]);const Ld={type:2,extent:ko,loadGeometry:()=>[[new d(0,0),new d(8193,0),new d(8193,8193),new d(0,8193),new d(0,0)]]};class Fd{constructor(t,e,r,n,i){this.tileID=t,this.uid=E(),this.uses=0,this.tileSize=e,this.tileZoom=r,this.buckets={},this.expirationTime=null,this.queryPadding=0,this.hasSymbolBuckets=!1,this.hasRTLText=!1,this.dependencies={},this.isRaster=i,this.expiredRequestCount=0,this.state=\"loading\",n&&n.transform&&(this.projection=n.transform.projection);}registerFadeDuration(t){const e=t+this.timeAdded;e<Nt.now()||this.fadeEndTime&&e<this.fadeEndTime||(this.fadeEndTime=e);}wasRequested(){return \"errored\"===this.state||\"loaded\"===this.state||\"reloading\"===this.state}get tileTransform(){return this._tileTransform||(this._tileTransform=Vf(this.tileID.canonical,this.projection)),this._tileTransform}loadVectorData(t,e,r){if(this.unloadVectorData(),this.state=\"loaded\",t){t.featureIndex&&(this.latestFeatureIndex=t.featureIndex,t.rawTileData?(this.latestRawTileData=t.rawTileData,this.latestFeatureIndex.rawTileData=t.rawTileData):this.latestRawTileData&&(this.latestFeatureIndex.rawTileData=this.latestRawTileData)),this.collisionBoxArray=t.collisionBoxArray,this.buckets=function(t,e){const r={};if(!e)return r;for(const n of t){const t=n.layerIds.map((t=>e.getLayer(t))).filter(Boolean);if(0!==t.length){n.layers=t,n.stateDependentLayerIds&&(n.stateDependentLayers=n.stateDependentLayerIds.map((e=>t.filter((t=>t.id===e))[0])));for(const e of t)r[e.id]=n;}}return r}(t.buckets,e.style),this.hasSymbolBuckets=!1;for(const t in this.buckets){const e=this.buckets[t];if(e instanceof hd){if(this.hasSymbolBuckets=!0,!r)break;e.justReloaded=!0;}}if(this.hasRTLText=!1,this.hasSymbolBuckets)for(const t in this.buckets){const e=this.buckets[t];if(e instanceof hd&&e.hasRTLText){this.hasRTLText=!0,js.isLoading()||js.isLoaded()||\"deferred\"!==Fs()||Rs();break}}this.queryPadding=0;for(const t in this.buckets){const r=this.buckets[t];this.queryPadding=Math.max(this.queryPadding,e.style.getLayer(t).queryRadius(r));}t.imageAtlas&&(this.imageAtlas=t.imageAtlas),t.glyphAtlasImage&&(this.glyphAtlasImage=t.glyphAtlasImage),t.lineAtlas&&(this.lineAtlas=t.lineAtlas);}else this.collisionBoxArray=new Ea;}unloadVectorData(){if(this.hasData()){for(const t in this.buckets)this.buckets[t].destroy();this.buckets={},this.imageAtlas&&(this.imageAtlas=null),this.lineAtlas&&(this.lineAtlas=null),this.imageAtlasTexture&&this.imageAtlasTexture.destroy(),this.glyphAtlasTexture&&this.glyphAtlasTexture.destroy(),this.lineAtlasTexture&&this.lineAtlasTexture.destroy(),this._tileBoundsBuffer&&(this._tileBoundsBuffer.destroy(),this._tileBoundsIndexBuffer.destroy(),this._tileBoundsSegments.destroy(),this._tileBoundsBuffer=null),this._tileDebugBuffer&&(this._tileDebugBuffer.destroy(),this._tileDebugSegments.destroy(),this._tileDebugBuffer=null),this._tileDebugIndexBuffer&&(this._tileDebugIndexBuffer.destroy(),this._tileDebugIndexBuffer=null),this._globeTileDebugBorderBuffer&&(this._globeTileDebugBorderBuffer.destroy(),this._globeTileDebugBorderBuffer=null),this._tileDebugTextBuffer&&(this._tileDebugTextBuffer.destroy(),this._tileDebugTextSegments.destroy(),this._tileDebugTextIndexBuffer.destroy(),this._tileDebugTextBuffer=null),this._globeTileDebugTextBuffer&&(this._globeTileDebugTextBuffer.destroy(),this._globeTileDebugTextBuffer=null),this.latestFeatureIndex=null,this.state=\"unloaded\";}}getBucket(t){return this.buckets[t.id]}upload(t){for(const e in this.buckets){const r=this.buckets[e];r.uploadPending()&&r.upload(t);}const e=t.gl;this.imageAtlas&&!this.imageAtlas.uploaded&&(this.imageAtlasTexture=new _d(t,this.imageAtlas.image,e.RGBA),this.imageAtlas.uploaded=!0),this.glyphAtlasImage&&(this.glyphAtlasTexture=new _d(t,this.glyphAtlasImage,e.ALPHA),this.glyphAtlasImage=null),this.lineAtlas&&!this.lineAtlas.uploaded&&(this.lineAtlasTexture=new _d(t,this.lineAtlas.image,e.ALPHA),this.lineAtlas.uploaded=!0);}prepare(t){this.imageAtlas&&this.imageAtlas.patchUpdatedImages(t,this.imageAtlasTexture);}queryRenderedFeatures(t,e,r,n,i,s,a,o){return this.latestFeatureIndex&&this.latestFeatureIndex.rawTileData?this.latestFeatureIndex.query({tileResult:n,pixelPosMatrix:a,transform:s,params:i,tileTransform:this.tileTransform},t,e,r):{}}querySourceFeatures(t,e){const r=this.latestFeatureIndex;if(!r||!r.rawTileData)return;const n=r.loadVTLayers(),i=e?e.sourceLayer:\"\",s=n._geojsonTileLayer||n[i];if(!s)return;const a=ai(e&&e.filter),{z:o,x:l,y:u}=this.tileID.canonical,c={z:o,x:l,y:u};for(let e=0;e<s.length;e++){const n=s.feature(e);if(a.needGeometry){const t=wu(n,!0);if(!a.filter(new Us(this.tileID.overscaledZ),t,this.tileID.canonical))continue}else if(!a.filter(new Us(this.tileID.overscaledZ),n))continue;const h=r.getId(n,i),p=new Md(n,o,l,u,h);p.tile=c,t.push(p);}}hasData(){return \"loaded\"===this.state||\"reloading\"===this.state||\"expired\"===this.state}patternsLoaded(){return !!this.imageAtlas&&!!Object.keys(this.imageAtlas.patternPositions).length}setExpiryData(t){const e=this.expirationTime;if(t.cacheControl){const e=G(t.cacheControl);e[\"max-age\"]&&(this.expirationTime=Date.now()+1e3*e[\"max-age\"]);}else t.expires&&(this.expirationTime=new Date(t.expires).getTime());if(this.expirationTime){const t=Date.now();let r=!1;if(this.expirationTime>t)r=!1;else if(e)if(this.expirationTime<e)r=!0;else {const n=this.expirationTime-e;n?this.expirationTime=t+Math.max(n,3e4):r=!0;}else r=!0;r?(this.expiredRequestCount++,this.state=\"expired\"):this.expiredRequestCount=0;}}getExpiryTimeout(){if(this.expirationTime)return this.expiredRequestCount?1e3*(1<<Math.min(this.expiredRequestCount-1,31)):Math.min(this.expirationTime-(new Date).getTime(),Math.pow(2,31)-1)}setFeatureState(t,e){if(!this.latestFeatureIndex||!this.latestFeatureIndex.rawTileData||0===Object.keys(t).length||!e)return;const r=this.latestFeatureIndex.loadVTLayers(),n=e.style.listImages();for(const i in this.buckets){if(!e.style.hasLayer(i))continue;const s=this.buckets[i],a=s.layers[0].sourceLayer||\"_geojsonTileLayer\",o=r[a],l=t[a];if(!o||!l||0===Object.keys(l).length)continue;if(s.update(l,o,n,this.imageAtlas&&this.imageAtlas.patternPositions||{}),s instanceof jh||s instanceof Uc){const t=e.style._getSourceCache(s.layers[0].source);e._terrain&&e._terrain.enabled&&t&&s.programConfigurations.needsUpload&&e._terrain._clearRenderCacheForTile(t.id,this.tileID);}const u=e&&e.style&&e.style.getLayer(i);u&&(this.queryPadding=Math.max(this.queryPadding,u.queryRadius(s)));}}holdingForFade(){return void 0!==this.symbolFadeHoldUntil}symbolFadeFinished(){return !this.symbolFadeHoldUntil||this.symbolFadeHoldUntil<Nt.now()}clearFadeHold(){this.symbolFadeHoldUntil=void 0;}setHoldDuration(t){this.symbolFadeHoldUntil=Nt.now()+t;}setTexture(t,e){const r=e.context,n=r.gl;this.texture=this.texture||e.getTileTexture(t.width),this.texture?this.texture.update(t,{useMipmap:!0}):(this.texture=new _d(r,t,n.RGBA,{useMipmap:!0}),this.texture.bind(n.LINEAR,n.CLAMP_TO_EDGE),r.extTextureFilterAnisotropic&&n.texParameterf(n.TEXTURE_2D,r.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,r.extTextureFilterAnisotropicMax));}setDependencies(t,e){const r={};for(const t of e)r[t]=!0;this.dependencies[t]=r;}hasDependency(t,e){for(const r of t){const t=this.dependencies[r];if(t)for(const r of e)if(t[r])return !0}return !1}clearQueryDebugViz(){}_makeDebugTileBoundsBuffers(t,e){if(!e||\"mercator\"===e.name||this._tileDebugBuffer)return;const r=bu(Ld,this.tileID.canonical,this.tileTransform)[0],n=new sa,i=new Ta;for(let t=0;t<r.length;t++){const{x:e,y:s}=r[t];n.emplaceBack(e,s),i.emplaceBack(t);}i.emplaceBack(0),this._tileDebugIndexBuffer=t.createIndexBuffer(i),this._tileDebugBuffer=t.createVertexBuffer(n,xl.members),this._tileDebugSegments=So.simpleSegment(0,0,n.length,i.length);}_makeTileBoundsBuffers(t,e){if(this._tileBoundsBuffer||!e||\"mercator\"===e.name)return;const r=bu(Ld,this.tileID.canonical,this.tileTransform)[0];let n,i;if(this.isRaster){const t=function(t,e){const r=Vf(t,e),n=Math.pow(2,t.z);for(let i=0;i<zd;i++)for(let s=0;s<zd;s++){const a=ou((t.x+(s+Dd(s))/Td)/n),o=lu((t.y+(i+Dd(i))/Td)/n),l=e.project(a,o),u=i*zd+s;Ed[2*u+0]=Math.round((l.x*r.scale-r.x)*ko),Ed[2*u+1]=Math.round((l.y*r.scale-r.y)*ko);}Cd.fill(0),Pd.fill(0);for(let t=2045;t>=0;t--){const e=4*t,r=Bd[e+0],n=Bd[e+1],i=Bd[e+2],s=Bd[e+3],a=r+i>>1,o=n+s>>1,l=a+o-n,u=o+r-a,c=n*zd+r,h=s*zd+i,p=o*zd+a,f=Math.hypot((Ed[2*c+0]+Ed[2*h+0])/2-Ed[2*p+0],(Ed[2*c+1]+Ed[2*h+1])/2-Ed[2*p+1])>=16;if(Cd[p]=Cd[p]||(f?1:0),t<1022){const t=(n+u>>1)*zd+(r+l>>1),e=(s+u>>1)*zd+(i+l>>1);Cd[p]=Cd[p]||Cd[t]||Cd[e];}}const i=new oa,s=new wa;let a=0;function o(t,e){const r=e*zd+t;return 0===Pd[r]&&(i.emplaceBack(Ed[2*r+0],Ed[2*r+1],t*ko/Td,e*ko/Td),Pd[r]=++a),Pd[r]-1}function l(t,e,r,n,i,a){const u=t+r>>1,c=e+n>>1;if(Math.abs(t-i)+Math.abs(e-a)>1&&Cd[c*zd+u])l(i,a,t,e,u,c),l(r,n,i,a,u,c);else {const l=o(t,e),u=o(r,n),c=o(i,a);s.emplaceBack(l,u,c);}}return l(0,0,Td,Td,Td,0),l(Td,Td,0,0,0,Td),{vertices:i,indices:s}}(this.tileID.canonical,e);n=t.vertices,i=t.indices;}else {n=new oa,i=new wa;for(const{x:t,y:e}of r)n.emplaceBack(t,e,0,0);const t=sc(n.int16,void 0,4);for(let e=0;e<t.length;e+=3)i.emplaceBack(t[e],t[e+1],t[e+2]);}this._tileBoundsBuffer=t.createVertexBuffer(n,Vd.members),this._tileBoundsIndexBuffer=t.createIndexBuffer(i),this._tileBoundsSegments=So.simpleSegment(0,0,n.length,i.length);}_makeGlobeTileDebugBuffers(t,e){const r=e.projection;if(!r||\"globe\"!==r.name||e.freezeTileCoverage)return;const n=this.tileID.canonical,i=Gl(Vl(n,e)),s=Kl(e.zoom);let a;s>0&&(a=Co(new Float64Array(16),e.globeMatrix)),this._makeGlobeTileDebugBorderBuffer(t,n,e,i,a,s),this._makeGlobeTileDebugTextBuffer(t,n,e,i,a,s);}_globePoint(t,e,r,n,i,s,a){let o=Ol(t,e,r);if(s){const i=1<<r.z,l=iu(n.center.lng),u=su(n.center.lat),c=(r.x+.5)/i-l;let h=0;c>.5?h=-1:c<-.5&&(h=1);let p=(t/ko+r.x)/i+h,f=(e/ko+r.y)/i;p=(p-l)*n._pixelsPerMercatorPixel+l,f=(f-u)*n._pixelsPerMercatorPixel+u;const d=[p*n.worldSize,f*n.worldSize,0];el(d,d,s),o=Dl(o,d,a);}return el(o,o,i)}_makeGlobeTileDebugBorderBuffer(t,e,r,n,i,s){const a=new sa,o=new Ta,l=new aa,u=(t,u,c,h,p)=>{const f=(c-t)/(p-1),d=(h-u)/(p-1),y=a.length;for(let c=0;c<p;c++){const h=t+c*f,p=u+c*d;a.emplaceBack(h,p);const m=this._globePoint(h,p,e,r,n,i,s);l.emplaceBack(m[0],m[1],m[2]),o.emplaceBack(y+c);}},c=ko;u(0,0,c,0,16),u(c,0,c,c,16),u(c,c,0,c,16),u(0,c,0,0,16),this._tileDebugIndexBuffer=t.createIndexBuffer(o),this._tileDebugBuffer=t.createVertexBuffer(a,xl.members),this._globeTileDebugBorderBuffer=t.createVertexBuffer(l,gl.members),this._tileDebugSegments=So.simpleSegment(0,0,a.length,o.length);}_makeGlobeTileDebugTextBuffer(t,e,r,n,i,s){const a=new sa,o=new wa,l=new aa,u=25;o.reserve(32),a.reserve(u),l.reserve(u);const c=(t,e)=>u*t+e;for(let t=0;t<u;t++){const o=2048*t;for(let t=0;t<u;t++){const u=2048*t;a.emplaceBack(u,o);const c=this._globePoint(u,o,e,r,n,i,s);l.emplaceBack(c[0],c[1],c[2]);}}for(let t=0;t<4;t++)for(let e=0;e<4;e++){const r=c(t,e),n=c(t,e+1),i=c(t+1,e),s=c(t+1,e+1);o.emplaceBack(r,n,i),o.emplaceBack(i,n,s);}this._tileDebugTextIndexBuffer=t.createIndexBuffer(o),this._tileDebugTextBuffer=t.createVertexBuffer(a,xl.members),this._globeTileDebugTextBuffer=t.createVertexBuffer(l,gl.members),this._tileDebugTextSegments=So.simpleSegment(0,0,u,32);}}class Rd{constructor(){this.state={},this.stateChanges={},this.deletedStates={};}updateState(t,e,r){const n=String(e);if(this.stateChanges[t]=this.stateChanges[t]||{},this.stateChanges[t][n]=this.stateChanges[t][n]||{},z(this.stateChanges[t][n],r),null===this.deletedStates[t]){this.deletedStates[t]={};for(const e in this.state[t])e!==n&&(this.deletedStates[t][e]=null);}else if(this.deletedStates[t]&&null===this.deletedStates[t][n]){this.deletedStates[t][n]={};for(const e in this.state[t][n])r[e]||(this.deletedStates[t][n][e]=null);}else for(const e in r)this.deletedStates[t]&&this.deletedStates[t][n]&&null===this.deletedStates[t][n][e]&&delete this.deletedStates[t][n][e];}removeFeatureState(t,e,r){if(null===this.deletedStates[t])return;const n=String(e);if(this.deletedStates[t]=this.deletedStates[t]||{},r&&void 0!==e)null!==this.deletedStates[t][n]&&(this.deletedStates[t][n]=this.deletedStates[t][n]||{},this.deletedStates[t][n][r]=null);else if(void 0!==e)if(this.stateChanges[t]&&this.stateChanges[t][n])for(r in this.deletedStates[t][n]={},this.stateChanges[t][n])this.deletedStates[t][n][r]=null;else this.deletedStates[t][n]=null;else this.deletedStates[t]=null;}getState(t,e){const r=String(e),n=z({},(this.state[t]||{})[r],(this.stateChanges[t]||{})[r]);if(null===this.deletedStates[t])return {};if(this.deletedStates[t]){const r=this.deletedStates[t][e];if(null===r)return {};for(const t in r)delete n[t];}return n}initializeTileState(t,e){t.setFeatureState(this.state,e);}coalesceChanges(t,e){const r={};for(const t in this.stateChanges){this.state[t]=this.state[t]||{};const e={};for(const r in this.stateChanges[t])this.state[t][r]||(this.state[t][r]={}),z(this.state[t][r],this.stateChanges[t][r]),e[r]=this.state[t][r];r[t]=e;}for(const t in this.deletedStates){this.state[t]=this.state[t]||{};const e={};if(null===this.deletedStates[t])for(const r in this.state[t])e[r]={},this.state[t][r]={};else for(const r in this.deletedStates[t]){if(null===this.deletedStates[t][r])this.state[t][r]={};else if(this.state[t][r])for(const e of Object.keys(this.deletedStates[t][r]))delete this.state[t][r][e];e[r]=this.state[t][r];}r[t]=r[t]||{},z(r[t],e);}if(this.stateChanges={},this.deletedStates={},0!==Object.keys(r).length)for(const n in t)t[n].setFeatureState(r,e);}}class jd{constructor(t){this.size=t,this.minimums=[],this.maximums=[],this.leaves=[];}getElevation(t,e){const r=this.toIdx(t,e);return {min:this.minimums[r],max:this.maximums[r]}}isLeaf(t,e){return this.leaves[this.toIdx(t,e)]}toIdx(t,e){return e*this.size+t}}function Ud(t,e,r,n){let i=0,s=Number.MAX_VALUE;for(let a=0;a<3;a++)if(Math.abs(n[a])<1e-15){if(r[a]<t[a]||r[a]>e[a])return null}else {const o=1/n[a];let l=(t[a]-r[a])*o,u=(e[a]-r[a])*o;if(l>u){const t=l;l=u,u=t;}if(l>i&&(i=l),u<s&&(s=u),i>s)return null}return i}function $d(t,e,r,n,i,s,a,o,l,u,c){const h=n-t,p=i-e,f=s-r,d=a-t,y=o-e,m=l-r,g=c[1]*m-c[2]*y,x=c[2]*d-c[0]*m,v=c[0]*y-c[1]*d,b=h*g+p*x+f*v;if(Math.abs(b)<1e-15)return null;const w=1/b,_=u[0]-t,A=u[1]-e,S=u[2]-r,k=(_*g+A*x+S*v)*w;if(k<0||k>1)return null;const I=A*f-S*p,M=S*h-_*f,T=_*p-A*h,z=(c[0]*I+c[1]*M+c[2]*T)*w;return z<0||k+z>1?null:(d*I+y*M+m*T)*w}function Od(t,e,r){return (t-e)/(r-e)}function qd(t,e,r,n,i,s,a,o,l){const u=1<<r,c=s-n,h=a-i,p=(t+1)/u*c+n,f=(e+0)/u*h+i,d=(e+1)/u*h+i;o[0]=(t+0)/u*c+n,o[1]=f,l[0]=p,l[1]=d;}class Nd{constructor(t){if(this.maximums=[],this.minimums=[],this.leaves=[],this.childOffsets=[],this.nodeCount=0,this.dem=t,this._siblingOffset=[[0,0],[1,0],[0,1],[1,1]],!this.dem)return;const e=function(t){const e=Math.ceil(Math.log2(t.dim/8)),r=[];let n=Math.ceil(Math.pow(2,e));const i=1/n,s=(t,e,r,n,i)=>{const s=n?1:0,a=(t+1)*r-s,o=e*r,l=(e+1)*r-s;i[0]=t*r,i[1]=o,i[2]=a,i[3]=l;};let a=new jd(n);const o=[];for(let e=0;e<n*n;e++){s(e%n,Math.floor(e/n),i,!1,o);const r=Xd(o[0],o[1],t),l=Xd(o[2],o[1],t),u=Xd(o[2],o[3],t),c=Xd(o[0],o[3],t);a.minimums.push(Math.min(r,l,u,c)),a.maximums.push(Math.max(r,l,u,c)),a.leaves.push(1);}for(r.push(a),n/=2;n>=1;n/=2){const t=r[r.length-1];a=new jd(n);for(let e=0;e<n*n;e++){s(e%n,Math.floor(e/n),2,!0,o);const r=t.getElevation(o[0],o[1]),i=t.getElevation(o[2],o[1]),l=t.getElevation(o[2],o[3]),u=t.getElevation(o[0],o[3]),c=t.isLeaf(o[0],o[1]),h=t.isLeaf(o[2],o[1]),p=t.isLeaf(o[2],o[3]),f=t.isLeaf(o[0],o[3]),d=Math.min(r.min,i.min,l.min,u.min),y=Math.max(r.max,i.max,l.max,u.max),m=c&&h&&p&&f;a.maximums.push(y),a.minimums.push(d),a.leaves.push(y-d<=5&&m?1:0);}r.push(a);}return r}(this.dem),r=e.length-1,n=e[r];this._addNode(n.minimums[0],n.maximums[0],n.leaves[0]),this._construct(e,0,0,r,0);}raycastRoot(t,e,r,n,i,s,a=1){return Ud([t,e,-100],[r,n,this.maximums[0]*a],i,s)}raycast(t,e,r,n,i,s,a=1){if(!this.nodeCount)return null;const o=this.raycastRoot(t,e,r,n,i,s,a);if(null==o)return null;const l=[],u=[],c=[],h=[],p=[{idx:0,t:o,nodex:0,nodey:0,depth:0}];for(;p.length>0;){const{idx:o,t:f,nodex:d,nodey:y,depth:m}=p.pop();if(this.leaves[o]){qd(d,y,m,t,e,r,n,c,h);const o=1<<m,l=(d+0)/o,u=(d+1)/o,p=(y+0)/o,g=(y+1)/o,x=Xd(l,p,this.dem)*a,v=Xd(u,p,this.dem)*a,b=Xd(u,g,this.dem)*a,w=Xd(l,g,this.dem)*a,_=$d(c[0],c[1],x,h[0],c[1],v,h[0],h[1],b,i,s),A=$d(h[0],h[1],b,c[0],h[1],w,c[0],c[1],x,i,s),S=Math.min(null!==_?_:Number.MAX_VALUE,null!==A?A:Number.MAX_VALUE);if(S!==Number.MAX_VALUE)return S;{const t=Wo([],i,s,f);if(Gd(x,v,w,b,Od(t[0],c[0],h[0]),Od(t[1],c[1],h[1]))>=t[2])return f}continue}let g=0;for(let p=0;p<this._siblingOffset.length;p++){qd((d<<1)+this._siblingOffset[p][0],(y<<1)+this._siblingOffset[p][1],m+1,t,e,r,n,c,h),c[2]=-100,h[2]=this.maximums[this.childOffsets[o]+p]*a;const f=Ud(c,h,i,s);if(null!=f){const t=f;l[p]=t;let e=!1;for(let r=0;r<g&&!e;r++)t>=l[u[r]]&&(u.splice(r,0,p),e=!0);e||(u[g]=p),g++;}}for(let t=0;t<g;t++){const e=u[t];p.push({idx:this.childOffsets[o]+e,t:l[e],nodex:(d<<1)+this._siblingOffset[e][0],nodey:(y<<1)+this._siblingOffset[e][1],depth:m+1});}}return null}_addNode(t,e,r){return this.minimums.push(t),this.maximums.push(e),this.leaves.push(r),this.childOffsets.push(0),this.nodeCount++}_construct(t,e,r,n,i){if(1===t[n].isLeaf(e,r))return;this.childOffsets[i]||(this.childOffsets[i]=this.nodeCount);const s=n-1,a=t[s];let o=0,l=0;for(let t=0;t<this._siblingOffset.length;t++){const n=2*e+this._siblingOffset[t][0],i=2*r+this._siblingOffset[t][1],s=a.getElevation(n,i),u=a.isLeaf(n,i),c=this._addNode(s.min,s.max,u);u&&(o|=1<<t),l||(l=c);}for(let n=0;n<this._siblingOffset.length;n++)o&1<<n||this._construct(t,2*e+this._siblingOffset[n][0],2*r+this._siblingOffset[n][1],s,l+n);}}function Gd(t,e,r,n,i,s){return Mr(Mr(t,r,s),Mr(e,n,s),i)}function Xd(t,e,r){const n=r.dim,i=S(t*n-.5,0,n-1),s=S(e*n-.5,0,n-1),a=Math.floor(i),o=Math.floor(s),l=Math.min(a+1,n-1),u=Math.min(o+1,n-1);return Gd(r.get(a,o),r.get(l,o),r.get(a,u),r.get(l,u),i-a,s-o)}const Zd={mapbox:[6553.6,25.6,.1,1e4],terrarium:[256,1,1/256,32768]};class Kd{get tree(){return this._tree||this._buildQuadTree(),this._tree}constructor(t,e,r,n=!1,i=!1){if(this.uid=t,e.height!==e.width)throw new RangeError(\"DEM tiles must be square\");if(r&&\"mapbox\"!==r&&\"terrarium\"!==r)return $(`\"${r}\" is not a valid encoding type. Valid types include \"mapbox\" and \"terrarium\".`);this.stride=e.height;const s=this.dim=e.height-2,a=new Uint32Array(e.data.buffer);if(this.pixels=new Uint8Array(e.data.buffer),this.encoding=r||\"mapbox\",this.borderReady=n,!n){for(let t=0;t<s;t++)a[this._idx(-1,t)]=a[this._idx(0,t)],a[this._idx(s,t)]=a[this._idx(s-1,t)],a[this._idx(t,-1)]=a[this._idx(t,0)],a[this._idx(t,s)]=a[this._idx(t,s-1)];a[this._idx(-1,-1)]=a[this._idx(0,0)],a[this._idx(s,-1)]=a[this._idx(s-1,0)],a[this._idx(-1,s)]=a[this._idx(0,s-1)],a[this._idx(s,s)]=a[this._idx(s-1,s-1)],i&&this._buildQuadTree();}}_buildQuadTree(){this._tree=new Nd(this);}get(t,e,r=!1){r&&(t=S(t,-1,this.dim),e=S(e,-1,this.dim));const n=4*this._idx(t,e);return (\"terrarium\"===this.encoding?this._unpackTerrarium:this._unpackMapbox)(this.pixels[n],this.pixels[n+1],this.pixels[n+2])}static getUnpackVector(t){return Zd[t]}get unpackVector(){return Zd[this.encoding]}_idx(t,e){if(t<-1||t>=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError(\"out of range source coordinates for DEM data\");return (e+1)*this.stride+(t+1)}_unpackMapbox(t,e,r){return (256*t*256+256*e+r)/10-1e4}_unpackTerrarium(t,e,r){return 256*t+e+r/256-32768}static pack(t,e){const r=[0,0,0,0],n=Kd.getUnpackVector(e);let i=Math.floor((t+n[3])/n[2]);return r[2]=i%256,i=Math.floor(i/256),r[1]=i%256,i=Math.floor(i/256),r[0]=i,r}getPixels(){return new Qu({width:this.stride,height:this.stride},this.pixels)}backfillBorder(t,e,r){if(this.dim!==t.dim)throw new Error(\"dem dimension mismatch\");let n=e*this.dim,i=e*this.dim+this.dim,s=r*this.dim,a=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1;}switch(r){case-1:s=a-1;break;case 1:a=s+1;}const o=-e*this.dim,l=-r*this.dim;for(let e=s;e<a;e++)for(let r=n;r<i;r++){const n=4*this._idx(r,e),i=4*this._idx(r+o,e+l);this.pixels[n+0]=t.pixels[i+0],this.pixels[n+1]=t.pixels[i+1],this.pixels[n+2]=t.pixels[i+2],this.pixels[n+3]=t.pixels[i+3];}}onDeserialize(){this._tree&&(this._tree.dem=this);}}Oi(Kd,\"DEMData\"),Oi(Nd,\"DemMinMaxQuadTree\",{omit:[\"dem\"]});class Yd{constructor(t,e){this.max=t,this.onRemove=e,this.reset();}reset(){for(const t in this.data)for(const e of this.data[t])e.timeout&&clearTimeout(e.timeout),this.onRemove(e.value);return this.data={},this.order=[],this}add(t,e,r){const n=t.wrapped().key;void 0===this.data[n]&&(this.data[n]=[]);const i={value:e,timeout:void 0};if(void 0!==r&&(i.timeout=setTimeout((()=>{this.remove(t,i);}),r)),this.data[n].push(i),this.order.push(n),this.order.length>this.max){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t);}return this}has(t){return t.wrapped().key in this.data}getAndRemove(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null}_getAndRemoveByKey(t){const e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value}getByKey(t){const e=this.data[t];return e?e[0].value:null}get(t){return this.has(t)?this.data[t.wrapped().key][0].value:null}remove(t,e){if(!this.has(t))return this;const r=t.wrapped().key,n=void 0===e?0:this.data[r].indexOf(e),i=this.data[r][n];return this.data[r].splice(n,1),i.timeout&&clearTimeout(i.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(i.value),this.order.splice(this.order.indexOf(r),1),this}setMaxSize(t){for(this.max=t;this.order.length>this.max;){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t);}return this}filter(t){const e=[];for(const r in this.data)for(const n of this.data[r])t(n.value)||e.push(n);for(const t of e)this.remove(t.value.tileID,t);}}class Hd{constructor(t,e,r){this.func=t,this.mask=e,this.range=r;}}Hd.ReadOnly=!1,Hd.ReadWrite=!0,Hd.disabled=new Hd(519,Hd.ReadOnly,[0,1]);const Wd=7680;class Jd{constructor(t,e,r,n,i,s){this.test=t,this.ref=e,this.mask=r,this.fail=n,this.depthFail=i,this.pass=s;}}Jd.disabled=new Jd({func:519,mask:0},0,0,Wd,Wd,Wd);class Qd{constructor(t,e,r){this.blendFunction=t,this.blendColor=e,this.mask=r;}}Qd.Replace=[1,0],Qd.disabled=new Qd(Qd.Replace,Me.transparent,[!1,!1,!1,!1]),Qd.unblended=new Qd(Qd.Replace,Me.transparent,[!0,!0,!0,!0]),Qd.alphaBlended=new Qd([1,771],Me.transparent,[!0,!0,!0,!0]);const ty=1029,ey=2305;class ry{constructor(t,e,r){this.enable=t,this.mode=e,this.frontFace=r;}}ry.disabled=new ry(!1,ty,ey),ry.backCCW=new ry(!0,ty,ey),ry.backCW=new ry(!0,ty,2304),ry.frontCW=new ry(!0,1028,2304),ry.frontCCW=new ry(!0,1028,ey);class ny extends Yt{constructor(t,e,r){super(),this.id=t,this._onlySymbols=r,e.on(\"data\",(t=>{\"source\"===t.dataType&&\"metadata\"===t.sourceDataType&&(this._sourceLoaded=!0),this._sourceLoaded&&!this._paused&&\"source\"===t.dataType&&\"content\"===t.sourceDataType&&(this.reload(),this.transform&&this.update(this.transform));})),e.on(\"error\",(()=>{this._sourceErrored=!0;})),this._source=e,this._tiles={},this._cache=new Yd(0,this._unloadTile.bind(this)),this._timers={},this._cacheTimers={},this._minTileCacheSize=e.minTileCacheSize,this._maxTileCacheSize=e.maxTileCacheSize,this._loadedParentTiles={},this._coveredTiles={},this._state=new Rd,this._isRaster=\"raster\"===this._source.type||\"raster-dem\"===this._source.type||\"custom\"===this._source.type&&\"raster\"===this._source._dataType;}onAdd(t){this.map=t,this._minTileCacheSize=void 0===this._minTileCacheSize&&t?t._minTileCacheSize:this._minTileCacheSize,this._maxTileCacheSize=void 0===this._maxTileCacheSize&&t?t._maxTileCacheSize:this._maxTileCacheSize;}loaded(){if(this._sourceErrored)return !0;if(!this._sourceLoaded)return !1;if(!this._source.loaded())return !1;for(const t in this._tiles){const e=this._tiles[t];if(\"loaded\"!==e.state&&\"errored\"!==e.state)return !1}return !0}getSource(){return this._source}pause(){this._paused=!0;}resume(){if(!this._paused)return;const t=this._shouldReloadOnResume;this._paused=!1,this._shouldReloadOnResume=!1,t&&this.reload(),this.transform&&this.update(this.transform);}_loadTile(t,e){return t.isSymbolTile=this._onlySymbols,this._source.loadTile(t,e)}_unloadTile(t){if(this._source.unloadTile)return this._source.unloadTile(t,(()=>{}))}_abortTile(t){if(this._source.abortTile)return this._source.abortTile(t,(()=>{}))}serialize(){return this._source.serialize()}prepare(t){this._source.prepare&&this._source.prepare(),this._state.coalesceChanges(this._tiles,this.map?this.map.painter:null);for(const e in this._tiles){const r=this._tiles[e];r.upload(t),r.prepare(this.map.style.imageManager);}}getIds(){return T(this._tiles).map((t=>t.tileID)).sort(iy).map((t=>t.key))}getRenderableIds(t){const e=[];for(const r in this._tiles)this._isIdRenderable(+r,t)&&e.push(this._tiles[r]);return t?e.sort(((t,e)=>{const r=t.tileID,n=e.tileID,i=new d(r.canonical.x,r.canonical.y)._rotate(this.transform.angle),s=new d(n.canonical.x,n.canonical.y)._rotate(this.transform.angle);return r.overscaledZ-n.overscaledZ||s.y-i.y||s.x-i.x})).map((t=>t.tileID.key)):e.map((t=>t.tileID)).sort(iy).map((t=>t.key))}hasRenderableParent(t){const e=this.findLoadedParent(t,0);return !!e&&this._isIdRenderable(e.tileID.key)}_isIdRenderable(t,e){return this._tiles[t]&&this._tiles[t].hasData()&&!this._coveredTiles[t]&&(e||!this._tiles[t].holdingForFade())}reload(){if(this._paused)this._shouldReloadOnResume=!0;else {this._cache.reset();for(const t in this._tiles)\"errored\"!==this._tiles[t].state&&this._reloadTile(+t,\"reloading\");}}_reloadTile(t,e){const r=this._tiles[t];r&&(\"loading\"!==r.state&&(r.state=e),this._loadTile(r,this._tileLoaded.bind(this,r,t,e)));}_tileLoaded(t,e,r,n){if(n)if(t.state=\"errored\",404!==n.status)this._source.fire(new Kt(n,{tile:t}));else if(\"raster-dem\"===this._source.type&&this.usedForTerrain&&this.map.painter.terrain){const t=this.map.painter.terrain;this.update(this.transform,t.getScaledDemTileSize(),!0),t.resetTileLookupCache(this.id);}else this.update(this.transform);else t.timeAdded=Nt.now(),\"expired\"===r&&(t.refreshedUponExpiration=!0),this._setTileReloadTimer(e,t),\"raster-dem\"===this._source.type&&t.dem&&this._backfillDEM(t),this._state.initializeTileState(t,this.map?this.map.painter:null),this._source.fire(new Zt(\"data\",{dataType:\"source\",tile:t,coord:t.tileID,sourceCacheId:this.id}));}_backfillDEM(t){const e=this.getRenderableIds();for(let n=0;n<e.length;n++){const i=e[n];if(t.neighboringTiles&&t.neighboringTiles[i]){const e=this.getTileByID(i);r(t,e),r(e,t);}}function r(t,e){if(!t.dem||t.dem.borderReady)return;t.needsHillshadePrepare=!0,t.needsDEMTextureUpload=!0;let r=e.tileID.canonical.x-t.tileID.canonical.x;const n=e.tileID.canonical.y-t.tileID.canonical.y,i=Math.pow(2,t.tileID.canonical.z),s=e.tileID.key;0===r&&0===n||Math.abs(n)>1||(Math.abs(r)>1&&(1===Math.abs(r+i)?r+=i:1===Math.abs(r-i)&&(r-=i)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,n),t.neighboringTiles&&t.neighboringTiles[s]&&(t.neighboringTiles[s].backfilled=!0)));}}getTile(t){return this.getTileByID(t.key)}getTileByID(t){return this._tiles[t]}_retainLoadedChildren(t,e,r,n){for(const i in this._tiles){let s=this._tiles[i];if(n[i]||!s.hasData()||s.tileID.overscaledZ<=e||s.tileID.overscaledZ>r)continue;let a=s.tileID;for(;s&&s.tileID.overscaledZ>e+1;){const t=s.tileID.scaledTo(s.tileID.overscaledZ-1);s=this._tiles[t.key],s&&s.hasData()&&(a=t);}let o=a;for(;o.overscaledZ>e;)if(o=o.scaledTo(o.overscaledZ-1),t[o.key]){n[a.key]=a;break}}}findLoadedParent(t,e){if(t.key in this._loadedParentTiles){const r=this._loadedParentTiles[t.key];return r&&r.tileID.overscaledZ>=e?r:null}for(let r=t.overscaledZ-1;r>=e;r--){const e=t.scaledTo(r),n=this._getLoadedTile(e);if(n)return n}}_getLoadedTile(t){const e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(this._source.reparseOverscaled?t.wrapped().key:t.canonical.key)}updateCacheSize(t,e){e=e||this._source.tileSize;const r=Math.ceil(t.width/e)+1,n=Math.ceil(t.height/e)+1,i=Math.floor(r*n*5),s=\"number\"==typeof this._minTileCacheSize?Math.max(this._minTileCacheSize,i):i,a=\"number\"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,s):s;this._cache.setMaxSize(a);}handleWrapJump(t){const e=Math.round((t-(void 0===this._prevLng?t:this._prevLng))/360);if(this._prevLng=t,e){const t={};for(const r in this._tiles){const n=this._tiles[r];n.tileID=n.tileID.unwrapTo(n.tileID.wrap+e),t[n.tileID.key]=n;}this._tiles=t;for(const t in this._timers)clearTimeout(this._timers[t]),delete this._timers[t];for(const t in this._tiles)this._setTileReloadTimer(+t,this._tiles[t]);}}update(t,e,r){if(this.transform=t,!this._sourceLoaded||this._paused||this.transform.freezeTileCoverage)return;if(this.usedForTerrain&&!r)return;let n;this.updateCacheSize(t,e),\"globe\"!==this.transform.projection.name&&this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used||this.usedForTerrain?this._source.tileID?n=t.getVisibleUnwrappedCoordinates(this._source.tileID).map((t=>new Mh(t.canonical.z,t.wrap,t.canonical.z,t.canonical.x,t.canonical.y))):(n=t.coveringTiles({tileSize:e||this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom&&!r,reparseOverscaled:this._source.reparseOverscaled,isTerrainDEM:this.usedForTerrain}),this._source.hasTile&&(n=n.filter((t=>this._source.hasTile(t))))):n=[];const i=this._updateRetainedTiles(n);if(sy(this._source.type)&&0!==n.length){const t={},e={},r=Object.keys(i);for(const n of r){const r=i[n],s=this._tiles[n];if(!s||s.fadeEndTime&&s.fadeEndTime<=Nt.now())continue;const a=this.findLoadedParent(r,Math.max(r.overscaledZ-ny.maxOverzooming,this._source.minzoom));a&&(this._addTile(a.tileID),t[a.tileID.key]=a.tileID),e[n]=r;}const s=n[n.length-1].overscaledZ;for(const t in this._tiles){const r=this._tiles[t];if(i[t]||!r.hasData())continue;let n=r.tileID;for(;n.overscaledZ>s;){n=n.scaledTo(n.overscaledZ-1);const s=this._tiles[n.key];if(s&&s.hasData()&&e[n.key]){i[t]=r.tileID;break}}}for(const e in t)i[e]||(this._coveredTiles[e]=!0,i[e]=t[e]);}for(const t in i)this._tiles[t].clearFadeHold();const s=function(t,e){const r=[];for(const n in t)n in e||r.push(n);return r}(this._tiles,i);for(const t of s){const e=this._tiles[t];e.hasSymbolBuckets&&!e.holdingForFade()?e.setHoldDuration(this.map._fadeDuration):e.hasSymbolBuckets&&!e.symbolFadeFinished()||this._removeTile(+t);}this._updateLoadedParentTileCache(),this._onlySymbols&&this._source.afterUpdate&&this._source.afterUpdate();}releaseSymbolFadeTiles(){for(const t in this._tiles)this._tiles[t].holdingForFade()&&this._removeTile(+t);}_updateRetainedTiles(t){const e={};if(0===t.length)return e;const r={},n=t.reduce(((t,e)=>Math.min(t,e.overscaledZ)),1/0),i=t[0].overscaledZ,s=Math.max(i-ny.maxOverzooming,this._source.minzoom),a=Math.max(i+ny.maxUnderzooming,this._source.minzoom),o={};for(const r of t){const t=this._addTile(r);e[r.key]=r,t.hasData()||n<this._source.maxzoom&&(o[r.key]=r);}this._retainLoadedChildren(o,n,a,e);for(const n of t){let t=this._tiles[n.key];if(t.hasData())continue;if(n.canonical.z>=this._source.maxzoom){const t=n.children(this._source.maxzoom)[0],r=this.getTile(t);if(r&&r.hasData()){e[t.key]=t;continue}}else {const t=n.children(this._source.maxzoom);if(e[t[0].key]&&e[t[1].key]&&e[t[2].key]&&e[t[3].key])continue}let i=t.wasRequested();for(let a=n.overscaledZ-1;a>=s;--a){const s=n.scaledTo(a);if(r[s.key])break;if(r[s.key]=!0,t=this.getTile(s),!t&&i&&(t=this._addTile(s)),t&&(e[s.key]=s,i=t.wasRequested(),t.hasData()))break}}return e}_updateLoadedParentTileCache(){this._loadedParentTiles={};for(const t in this._tiles){const e=[];let r,n=this._tiles[t].tileID;for(;n.overscaledZ>0;){if(n.key in this._loadedParentTiles){r=this._loadedParentTiles[n.key];break}e.push(n.key);const t=n.scaledTo(n.overscaledZ-1);if(r=this._getLoadedTile(t),r)break;n=t;}for(const t of e)this._loadedParentTiles[t]=r;}}_addTile(t){let e=this._tiles[t.key];if(e)return e;e=this._cache.getAndRemove(t),e&&(this._setTileReloadTimer(t.key,e),e.tileID=t,this._state.initializeTileState(e,this.map?this.map.painter:null),this._cacheTimers[t.key]&&(clearTimeout(this._cacheTimers[t.key]),delete this._cacheTimers[t.key],this._setTileReloadTimer(t.key,e)));const r=Boolean(e);if(!r){const r=this.map?this.map.painter:null;e=new Fd(t,this._source.tileSize*t.overscaleFactor(),this.transform.tileZoom,r,this._isRaster),this._loadTile(e,this._tileLoaded.bind(this,e,t.key,e.state));}return e?(e.uses++,this._tiles[t.key]=e,r||this._source.fire(new Zt(\"dataloading\",{tile:e,coord:e.tileID,dataType:\"source\"})),e):null}_setTileReloadTimer(t,e){t in this._timers&&(clearTimeout(this._timers[t]),delete this._timers[t]);const r=e.getExpiryTimeout();r&&(this._timers[t]=setTimeout((()=>{this._reloadTile(t,\"expired\"),delete this._timers[t];}),r));}_removeTile(t){const e=this._tiles[t];e&&(e.uses--,delete this._tiles[t],this._timers[t]&&(clearTimeout(this._timers[t]),delete this._timers[t]),e.uses>0||(e.hasData()&&\"reloading\"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))));}clearTiles(){this._shouldReloadOnResume=!1,this._paused=!1;for(const t in this._tiles)this._removeTile(+t);this._source._clear&&this._source._clear(),this._cache.reset(),this.map&&this.usedForTerrain&&this.map.painter.terrain&&this.map.painter.terrain.resetTileLookupCache(this.id);}tilesIn(t,e,r){const n=[],i=this.transform;if(!i)return n;const s=\"globe\"===i.projection.name,a=iu(i.center.lng);for(const o in this._tiles){const l=this._tiles[o];if(r&&l.clearQueryDebugViz(),l.holdingForFade())continue;let u;if(s){const t=l.tileID.canonical;if(0===t.z){const e=[Math.abs(S(a,...ay(t,-1))-a),Math.abs(S(a,...ay(t,1))-a)];u=[0,2*e.indexOf(Math.min(...e))-1];}else {const e=[Math.abs(S(a,...ay(t,-1))-a),Math.abs(S(a,...ay(t,0))-a),Math.abs(S(a,...ay(t,1))-a)];u=[e.indexOf(Math.min(...e))-1];}}else u=[0];for(const r of u){const s=t.containsTile(l,i,e,r);s&&n.push(s);}}return n}getVisibleCoordinates(t){const e=this.getRenderableIds(t).map((t=>this._tiles[t].tileID));for(const t of e)t.projMatrix=this.transform.calculateProjMatrix(t.toUnwrapped());return e}hasTransition(){if(this._source.hasTransition())return !0;if(sy(this._source.type))for(const t in this._tiles){const e=this._tiles[t];if(void 0!==e.fadeEndTime&&e.fadeEndTime>=Nt.now())return !0}return !1}setFeatureState(t,e,r){this._state.updateState(t=t||\"_geojsonTileLayer\",e,r);}removeFeatureState(t,e,r){this._state.removeFeatureState(t=t||\"_geojsonTileLayer\",e,r);}getFeatureState(t,e){return this._state.getState(t=t||\"_geojsonTileLayer\",e)}setDependencies(t,e,r){const n=this._tiles[t];n&&n.setDependencies(e,r);}reloadTilesForDependencies(t,e){for(const r in this._tiles)this._tiles[r].hasDependency(t,e)&&this._reloadTile(+r,\"reloading\");this._cache.filter((r=>!r.hasDependency(t,e)));}_preloadTiles(t,e){const r=new Map,n=Array.isArray(t)?t:[t],i=this.map.painter.terrain,s=this.usedForTerrain&&i?i.getScaledDemTileSize():this._source.tileSize;for(const t of n){const e=t.coveringTiles({tileSize:s,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom&&!this.usedForTerrain,reparseOverscaled:this._source.reparseOverscaled,isTerrainDEM:this.usedForTerrain});for(const t of e)r.set(t.key,t);this.usedForTerrain&&t.updateElevation(!1);}M(Array.from(r.values()),((t,e)=>{const r=new Fd(t,this._source.tileSize*t.overscaleFactor(),this.transform.tileZoom,this.map.painter,this._isRaster);this._loadTile(r,(t=>{\"raster-dem\"===this._source.type&&r.dem&&this._backfillDEM(r),e(t,r);}));}),e);}}function iy(t,e){const r=Math.abs(2*t.wrap)-+(t.wrap<0),n=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||n-r||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function sy(t){return \"raster\"===t||\"image\"===t||\"video\"===t||\"custom\"===t}function ay(t,e){const r=1<<t.z;return [t.x/r+e,(t.x+1)/r+e]}ny.maxOverzooming=10,ny.maxUnderzooming=3;class oy{constructor(t,e,r){this._demTile=t,this._dem=this._demTile.dem,this._scale=e,this._offset=r;}static create(t,e,r){const n=r||t.findDEMTileFor(e);if(!n||!n.dem)return;const i=n.dem,s=n.tileID,a=1<<e.canonical.z-s.canonical.z;return new oy(n,n.tileSize/ko/a,[(e.canonical.x/a-s.canonical.x)*i.dim,(e.canonical.y/a-s.canonical.y)*i.dim])}tileCoordToPixel(t,e){const r=e*this._scale+this._offset[1],n=Math.floor(t*this._scale+this._offset[0]),i=Math.floor(r);return new d(n,i)}getElevationAt(t,e,r,n){const i=t*this._scale+this._offset[0],s=e*this._scale+this._offset[1],a=Math.floor(i),o=Math.floor(s),l=this._dem;return n=!!n,r?Mr(Mr(l.get(a,o,n),l.get(a,o+1,n),s-o),Mr(l.get(a+1,o,n),l.get(a+1,o+1,n),s-o),i-a):l.get(a,o,n)}getElevationAtPixel(t,e,r){return this._dem.get(t,e,!!r)}getMeterToDEM(t){return (1<<this._demTile.tileID.canonical.z)*au(1,t)*this._dem.stride}}class ly{constructor(t,e){this.tileID=t,this.x=t.canonical.x,this.y=t.canonical.y,this.z=t.canonical.z,this.grid=new ji(ko,16,0),this.featureIndexArray=new ja,this.promoteId=e;}insert(t,e,r,n,i,s=0){const a=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(r,n,i,s);const o=this.grid;for(let t=0;t<e.length;t++){const r=e[t],n=[1/0,1/0,-1/0,-1/0];for(let t=0;t<r.length;t++){const e=r[t];n[0]=Math.min(n[0],e.x),n[1]=Math.min(n[1],e.y),n[2]=Math.max(n[2],e.x),n[3]=Math.max(n[3],e.y);}n[0]<ko&&n[1]<ko&&n[2]>=0&&n[3]>=0&&o.insert(a,n[0],n[1],n[2],n[3]);}}loadVTLayers(){if(!this.vtLayers){this.vtLayers=new sh(new op(this.rawTileData)).layers,this.sourceLayerCoder=new kd(this.vtLayers?Object.keys(this.vtLayers).sort():[\"_geojsonTileLayer\"]),this.vtFeatures={};for(const t in this.vtLayers)this.vtFeatures[t]=[];}return this.vtLayers}query(t,e,r,n){this.loadVTLayers();const i=t.params||{},s=ai(i.filter),a=t.tileResult,o=t.transform,l=a.bufferedTilespaceBounds,u=this.grid.query(l.min.x,l.min.y,l.max.x,l.max.y,((t,e,r,n)=>Vu(a.bufferedTilespaceGeometry,t,e,r,n)));u.sort(cy);let c=null;o.elevation&&u.length>0&&(c=oy.create(o.elevation,this.tileID));const h={};let p;for(let o=0;o<u.length;o++){const l=u[o];if(l===p)continue;p=l;const f=this.featureIndexArray.get(l);let d=null;this.loadMatchingFeature(h,f,s,i.layers,i.availableImages,e,r,n,((e,r,n,i=0)=>(d||(d=bu(e,this.tileID.canonical,t.tileTransform)),r.queryIntersectsFeature(a,e,n,d,this.z,t.transform,t.pixelPosMatrix,c,i))));}return h}loadMatchingFeature(t,e,r,n,i,s,a,o,l){const{featureIndex:u,bucketIndex:c,sourceLayerIndex:h,layoutVertexArrayOffset:p}=e,f=this.bucketLayerIDs[c];if(n&&!function(t,e){for(let r=0;r<t.length;r++)if(e.indexOf(t[r])>=0)return !0;return !1}(n,f))return;const d=this.sourceLayerCoder.decode(h),y=this.vtLayers[d].feature(u);if(r.needGeometry){const t=wu(y,!0);if(!r.filter(new Us(this.tileID.overscaledZ),t,this.tileID.canonical))return}else if(!r.filter(new Us(this.tileID.overscaledZ),y))return;const m=this.getId(y,d);for(let e=0;e<f.length;e++){const r=f[e];if(n&&n.indexOf(r)<0)continue;const c=s[r];if(!c)continue;let h={};void 0!==m&&o&&(h=o.getState(c.sourceLayer||\"_geojsonTileLayer\",m));const d=z({},a[r]);d.paint=uy(d.paint,c.paint,y,h,i),d.layout=uy(d.layout,c.layout,y,h,i);const g=!l||l(y,c,h,p);if(!g)continue;const x=new Md(y,this.z,this.x,this.y,m);x.layer=d;let v=t[r];void 0===v&&(v=t[r]=[]),v.push({featureIndex:u,feature:x,intersectionZ:g});}}lookupSymbolFeatures(t,e,r,n,i,s,a,o){const l={};this.loadVTLayers();const u=ai(i);for(const i of t)this.loadMatchingFeature(l,{bucketIndex:r,sourceLayerIndex:n,featureIndex:i,layoutVertexArrayOffset:0},u,s,a,o,e);return l}loadFeature(t){const{featureIndex:e,sourceLayerIndex:r}=t;this.loadVTLayers();const n=this.sourceLayerCoder.decode(r),i=this.vtFeatures[n];if(i[e])return i[e];const s=this.vtLayers[n].feature(e);return i[e]=s,s}hasLayer(t){for(const e of this.bucketLayerIDs)for(const r of e)if(t===r)return !0;return !1}getId(t,e){let r=t.id;if(this.promoteId){const n=\"string\"==typeof this.promoteId?this.promoteId:this.promoteId[e];null!=n&&(r=t.properties[n]),\"boolean\"==typeof r&&(r=Number(r));}return r}}function uy(t,e,r,n,i){return F(t,((t,s)=>{const a=e instanceof Ks?e.get(s):null;return a&&a.evaluate?a.evaluate(r,n,i):a}))}function cy(t,e){return e-t}Oi(ly,\"FeatureIndex\",{omit:[\"rawTileData\",\"sourceLayerCoder\"]});class hy{constructor(t,e){this.width=t,this.height=e,this.nextRow=0,this.image=new Ju({width:t,height:e}),this.positions={},this.uploaded=!1;}getDash(t,e){const r=this.getKey(t,e);return this.positions[r]}trim(){const t=this.width,e=this.height=P(this.nextRow);this.image.resize({width:t,height:e});}getKey(t,e){return t.join(\",\")+e}getDashRanges(t,e,r){const n=[];let i=t.length%2==1?-t[t.length-1]*r:0,s=t[0]*r,a=!0;n.push({left:i,right:s,isDash:a,zeroLength:0===t[0]});let o=t[0];for(let e=1;e<t.length;e++){a=!a;const l=t[e];i=o*r,o+=l,s=o*r,n.push({left:i,right:s,isDash:a,zeroLength:0===l});}return n}addRoundDash(t,e,r){const n=e/2;for(let e=-r;e<=r;e++){const i=this.width*(this.nextRow+r+e);let s=0,a=t[s];for(let o=0;o<this.width;o++){o/a.right>1&&(a=t[++s]);const l=Math.abs(o-a.left),u=Math.abs(o-a.right),c=Math.min(l,u);let h;const p=e/r*(n+1);if(a.isDash){const t=n-Math.abs(p);h=Math.sqrt(c*c+t*t);}else h=n-Math.sqrt(c*c+p*p);this.image.data[i+o]=Math.max(0,Math.min(255,h+128));}}}addRegularDash(t,e){for(let e=t.length-1;e>=0;--e){const r=t[e],n=t[e+1];r.zeroLength?t.splice(e,1):n&&n.isDash===r.isDash&&(n.left=r.left,t.splice(e,1));}const r=t[0],n=t[t.length-1];r.isDash===n.isDash&&(r.left=n.left-this.width,n.right=r.right+this.width);const i=this.width*this.nextRow;let s=0,a=t[s];for(let r=0;r<this.width;r++){r/a.right>1&&(a=t[++s]);const n=Math.abs(r-a.left),o=Math.abs(r-a.right),l=Math.min(n,o);this.image.data[i+r]=Math.max(0,Math.min(255,(a.isDash?l:-l)+e+128));}}addDash(t,e){const r=this.getKey(t,e);if(this.positions[r])return this.positions[r];const n=\"round\"===e,i=n?7:0,s=2*i+1;if(this.nextRow+s>this.height)return $(\"LineAtlas out of space\"),null;0===t.length&&t.push(1);let a=0;for(let e=0;e<t.length;e++)t[e]<0&&($(\"Negative value is found in line dasharray, replacing values with 0\"),t[e]=0),a+=t[e];if(0!==a){const r=this.width/a,s=this.getDashRanges(t,this.width,r);n?this.addRoundDash(s,r,i):this.addRegularDash(s,\"square\"===e?.5*r:0);}const o=this.nextRow+i;this.nextRow+=s;const l={tl:[o,i],br:[a,0]};return this.positions[r]=l,l}}Oi(hy,\"LineAtlas\");class py{constructor(t){const e={},r=[];for(const n in t){const i=t[n],s=e[n]={};for(const t in i.glyphs){const e=i.glyphs[+t];if(!e||0===e.bitmap.width||0===e.bitmap.height)continue;const n=e.metrics.localGlyph?2:1,a={x:0,y:0,w:e.bitmap.width+2*n,h:e.bitmap.height+2*n};r.push(a),s[t]=a;}}const{w:n,h:i}=Cp(r),s=new Ju({width:n||1,height:i||1});for(const r in t){const n=t[r];for(const t in n.glyphs){const i=n.glyphs[+t];if(!i||0===i.bitmap.width||0===i.bitmap.height)continue;const a=e[r][t],o=i.metrics.localGlyph?2:1;Ju.copy(i.bitmap,s,{x:0,y:0},{x:a.x+o,y:a.y+o},i.bitmap);}}this.image=s,this.positions=e;}}Oi(py,\"GlyphAtlas\");class fy{constructor(t){this.tileID=new Mh(t.tileID.overscaledZ,t.tileID.wrap,t.tileID.canonical.z,t.tileID.canonical.x,t.tileID.canonical.y),this.tileZoom=t.tileZoom,this.uid=t.uid,this.zoom=t.zoom,this.canonical=t.tileID.canonical,this.pixelRatio=t.pixelRatio,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=this.tileID.overscaleFactor(),this.showCollisionBoxes=t.showCollisionBoxes,this.collectResourceTiming=!!t.collectResourceTiming,this.returnDependencies=!!t.returnDependencies,this.promoteId=t.promoteId,this.enableTerrain=!!t.enableTerrain,this.isSymbolTile=t.isSymbolTile,this.tileTransform=Vf(t.tileID.canonical,t.projection),this.projection=t.projection;}parse(t,e,r,n,i){this.status=\"parsing\",this.data=t,this.collisionBoxArray=new Ea;const s=new kd(Object.keys(t.layers).sort()),a=new ly(this.tileID,this.promoteId);a.bucketLayerIDs=[];const o={},l=new hy(256,256),u={featureIndex:a,iconDependencies:{},patternDependencies:{},glyphDependencies:{},lineAtlas:l,availableImages:r},c=e.familiesBySource[this.source];for(const e in c){const n=t.layers[e];if(!n)continue;let i=!1,l=!1;for(const t of c[e])\"symbol\"===t[0].type?i=!0:l=!0;if(!0===this.isSymbolTile&&!i)continue;if(!1===this.isSymbolTile&&!l)continue;1===n.version&&$(`Vector tile source \"${this.source}\" layer \"${e}\" does not use vector tile spec v2 and therefore may have some rendering errors.`);const h=s.encode(e),p=[];for(let t=0;t<n.length;t++){const r=n.feature(t),i=a.getId(r,e);p.push({feature:r,id:i,index:t,sourceLayerIndex:h});}for(const t of c[e]){const e=t[0];void 0!==this.isSymbolTile&&\"symbol\"===e.type!==this.isSymbolTile||e.minzoom&&this.zoom<Math.floor(e.minzoom)||e.maxzoom&&this.zoom>=e.maxzoom||\"none\"!==e.visibility&&(dy(t,this.zoom,r),(o[e.id]=e.createBucket({index:a.bucketLayerIDs.length,layers:t,zoom:this.zoom,canonical:this.canonical,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:h,sourceID:this.source,enableTerrain:this.enableTerrain,projection:this.projection.spec,availableImages:r})).populate(p,u,this.tileID.canonical,this.tileTransform),a.bucketLayerIDs.push(t.map((t=>t.id))));}}let h,p,f,d;l.trim();const y={type:\"maybePrepare\",isSymbolTile:this.isSymbolTile,zoom:this.zoom},m=F(u.glyphDependencies,(t=>Object.keys(t).map(Number)));Object.keys(m).length?n.send(\"getGlyphs\",{uid:this.uid,stacks:m},((t,e)=>{h||(h=t,p=e,v.call(this));}),void 0,!1,y):p={};const g=Object.keys(u.iconDependencies);g.length?n.send(\"getImages\",{icons:g,source:this.source,tileID:this.tileID,type:\"icons\"},((t,e)=>{h||(h=t,f=e,v.call(this));}),void 0,!1,y):f={};const x=Object.keys(u.patternDependencies);function v(){if(h)return i(h);if(p&&f&&d){const t=new py(p),e=new Dp(f,d);for(const n in o){const i=o[n];i instanceof hd?(dy(i.layers,this.zoom,r),kf(i,p,t.positions,f,e.iconPositions,this.showCollisionBoxes,r,this.tileID.canonical,this.tileZoom,this.projection)):i.hasPattern&&(i instanceof jh||i instanceof Uc||i instanceof fh)&&(dy(i.layers,this.zoom,r),i.addFeatures(u,this.tileID.canonical,e.patternPositions,r,this.tileTransform));}this.status=\"done\",i(null,{buckets:T(o).filter((t=>!t.isEmpty())),featureIndex:a,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:t.image,lineAtlas:l,imageAtlas:e,glyphMap:this.returnDependencies?p:null,iconMap:this.returnDependencies?f:null,glyphPositions:this.returnDependencies?t.positions:null});}}x.length?n.send(\"getImages\",{icons:x,source:this.source,tileID:this.tileID,type:\"patterns\"},((t,e)=>{h||(h=t,d=e,v.call(this));}),void 0,!1,y):d={},v.call(this);}}function dy(t,e,r){const n=new Us(e);for(const e of t)e.recalculate(n,r);}class yy{constructor(t){this.entries={},this.scheduler=t;}request(t,e,r,n){const i=this.entries[t]=this.entries[t]||{callbacks:[]};if(i.result){const[t,r]=i.result;return this.scheduler?this.scheduler.add((()=>{n(t,r);}),e):n(t,r),()=>{}}return i.callbacks.push(n),i.cancel||(i.cancel=r(((r,n)=>{i.result=[r,n];for(const t of i.callbacks)this.scheduler?this.scheduler.add((()=>{t(r,n);}),e):t(r,n);setTimeout((()=>delete this.entries[t]),3e3);}))),()=>{i.result||(i.callbacks=i.callbacks.filter((t=>t!==n)),i.callbacks.length||(i.cancel(),delete this.entries[t]));}}}function my(t,e,r){const n=JSON.stringify(t.request);return t.data&&(this.deduped.entries[n]={result:[null,t.data]}),this.deduped.request(n,{type:\"parseTile\",isSymbolTile:t.isSymbolTile,zoom:t.tileZoom},(e=>{const n=ut(t.request,((t,n,i,s)=>{t?e(t):n&&e(null,{vectorTile:r?void 0:new sh(new op(n)),rawData:n,cacheControl:i,expires:s});}));return ()=>{n.cancel(),e();}}),e)}t.ARRAY_TYPE=To,t.AUTH_ERR_MSG=yt,t.Aabb=_l,t.Actor=class{constructor(t,r,n){this.target=t,this.parent=r,this.mapId=n,this.callbacks={},this.cancelCallbacks={},V([\"receive\"],this),this.target.addEventListener(\"message\",this.receive,!1),this.globalScope=N()?t:e,this.scheduler=new Sd;}send(t,e,r,n,i=!1,s){const a=Math.round(1e18*Math.random()).toString(36).substring(0,10);r&&(r.metadata=s,this.callbacks[a]=r);const o=Z(this.globalScope)?void 0:[];return this.target.postMessage({id:a,type:t,hasCallback:!!r,targetMapId:n,mustQueue:i,sourceMapId:this.mapId,data:Gi(e,o)},o),{cancel:()=>{r&&delete this.callbacks[a],this.target.postMessage({id:a,type:\"<cancel>\",targetMapId:n,sourceMapId:this.mapId});}}}receive(t){const e=t.data,r=e.id;if(r&&(!e.targetMapId||this.mapId===e.targetMapId))if(\"<cancel>\"===e.type){const t=this.cancelCallbacks[r];delete this.cancelCallbacks[r],t&&t.cancel();}else if(e.mustQueue||N()){const t=this.callbacks[r];this.cancelCallbacks[r]=this.scheduler.add((()=>this.processTask(r,e)),t&&t.metadata||{type:\"message\"});}else this.processTask(r,e);}processTask(t,e){if(\"<response>\"===e.type){const r=this.callbacks[t];delete this.callbacks[t],r&&(e.error?r(Xi(e.error)):r(null,Xi(e.data)));}else {const r=Z(this.globalScope)?void 0:[],n=e.hasCallback?(e,n)=>{delete this.cancelCallbacks[t],this.target.postMessage({id:t,type:\"<response>\",sourceMapId:this.mapId,error:e?Gi(e):null,data:Gi(n,r)},r);}:t=>{},i=Xi(e.data);if(this.parent[e.type])this.parent[e.type](e.sourceMapId,i,n);else if(this.parent.getWorkerSource){const t=e.type.split(\".\");this.parent.getWorkerSource(e.sourceMapId,t[0],i.source)[t[1]](i,n);}else n(new Error(`Could not find function ${e.type}`));}}remove(){this.scheduler.remove(),this.target.removeEventListener(\"message\",this.receive,!1);}},t.CanonicalTileID=kh,t.Color=Me,t.ColorMode=Qd,t.CullFaceMode=ry,t.DEMData=Kd,t.DataConstantProperty=Ys,t.DedupedRequest=yy,t.DepthMode=Hd,t.EXTENT=ko,t.Elevation=class{isDataAvailableAtPoint(t){const e=this._source();if(this.isUsingMockSource()||!e||t.y<0||t.y>1)return !1;const r=e.getSource().maxzoom,n=1<<r,i=Math.floor(t.x),s=Math.floor((t.x-i)*n),a=Math.floor(t.y*n),o=this.findDEMTileFor(new Mh(r,i,r,s,a));return !(!o||!o.dem)}getAtPointOrZero(t,e=0){return this.getAtPoint(t,e)||0}getAtPoint(t,e,r=!0){if(this.isUsingMockSource())return null;null==e&&(e=null);const n=this._source();if(!n)return e;if(t.y<0||t.y>1)return e;const i=n.getSource().maxzoom,s=1<<i,a=Math.floor(t.x),o=t.x-a,l=new Mh(i,a,i,Math.floor(o*s),Math.floor(t.y*s)),u=this.findDEMTileFor(l);if(!u||!u.dem)return e;const c=u.dem,h=1<<u.tileID.canonical.z,p=(o*h-u.tileID.canonical.x)*c.dim,f=(t.y*h-u.tileID.canonical.y)*c.dim,d=Math.floor(p),y=Math.floor(f);return (r?this.exaggeration():1)*Mr(Mr(c.get(d,y),c.get(d,y+1),f-y),Mr(c.get(d+1,y),c.get(d+1,y+1),f-y),p-d)}getAtTileOffset(t,e,r){const n=1<<t.canonical.z;return this.getAtPointOrZero(new pu(t.wrap+(t.canonical.x+e/ko)/n,(t.canonical.y+r/ko)/n))}getAtTileOffsetFunc(t,e,r,n){return i=>{const s=this.getAtTileOffset(t,i.x,i.y),a=n.upVector(t.canonical,i.x,i.y);return Ho(a,a,s*n.upVectorScale(t.canonical,e,r).metersToTile),a}}getForTilePoints(t,e,r,n){if(this.isUsingMockSource())return !1;const i=oy.create(this,t,n);return !!i&&(e.forEach((t=>{t[2]=this.exaggeration()*i.getElevationAt(t[0],t[1],r);})),!0)}getMinMaxForTile(t){if(this.isUsingMockSource())return null;const e=this.findDEMTileFor(t);if(!e||!e.dem)return null;const r=e.dem.tree,n=e.tileID,i=1<<t.canonical.z-n.canonical.z;let s=t.canonical.x/i-n.canonical.x,a=t.canonical.y/i-n.canonical.y,o=0;for(let e=0;e<t.canonical.z-n.canonical.z&&!r.leaves[o];e++){s*=2,a*=2;const t=2*Math.floor(a)+Math.floor(s);o=r.childOffsets[o]+t,s%=1,a%=1;}return {min:this.exaggeration()*r.minimums[o],max:this.exaggeration()*r.maximums[o]}}getMinElevationBelowMSL(){throw new Error(\"Pure virtual method called.\")}raycast(t,e,r){throw new Error(\"Pure virtual method called.\")}pointCoordinate(t){throw new Error(\"Pure virtual method called.\")}_source(){throw new Error(\"Pure virtual method called.\")}isUsingMockSource(){throw new Error(\"Pure virtual method called.\")}exaggeration(){throw new Error(\"Pure virtual method called.\")}findDEMTileFor(t){throw new Error(\"Pure virtual method called.\")}get visibleDemTiles(){throw new Error(\"Getter must be implemented in subclass.\")}},t.ErrorEvent=Kt,t.EvaluationParameters=Us,t.Event=Zt,t.Evented=Yt,t.FillExtrusionBucket=fh,t.Frustum=wl,t.FrustumCorners=bl,t.GLOBE_RADIUS=Al,t.GLOBE_SCALE_MATCH_LATITUDE=45,t.GLOBE_ZOOM_THRESHOLD_MAX=6,t.GLOBE_ZOOM_THRESHOLD_MIN=5,t.GlobeSharedBuffers=class{constructor(t){this._createGrid(t),this._createPoles(t);}destroy(){this._poleIndexBuffer.destroy(),this._gridBuffer.destroy(),this._gridIndexBuffer.destroy(),this._poleNorthVertexBuffer.destroy(),this._poleSouthVertexBuffer.destroy();for(const t of this._poleSegments)t.destroy();for(const t of this._gridSegments)t.withSkirts.destroy(),t.withoutSkirts.destroy();if(this._wireframeIndexBuffer){this._wireframeIndexBuffer.destroy();for(const t of this._wireframeSegments)t.destroy();}}_fillGridMeshWithLods(t,e){const r=new sa,n=new wa,i=[],s=t+1+2,a=e[0]+1,o=e[0]+1+(1+e.length),l=(t,e,r)=>{let n=t===s-1?t-2:0===t?t:t-1;return n+=r?24575:0,[n,e]};for(let t=0;t<s;++t)r.emplaceBack(...l(t,0,!0));for(let t=0;t<a;++t)for(let e=0;e<s;++e)r.emplaceBack(...l(e,t,(0===e||e===s-1)&&!0));for(let t=0;t<e.length;++t){const n=e[t];for(let t=0;t<s;++t)r.emplaceBack(...l(t,n,!0));}for(let t=0;t<e.length;++t){const a=n.length,l=e[t]+1+2,u=new wa;for(let r=0;r<l-1;r++){const i=r===l-2,a=i?s*(o-e.length+t-r):s;for(let t=0;t<s-1;t++){const e=r*s+t;0===r||i||0===t||t===s-2?(u.emplaceBack(e+1,e,e+a),u.emplaceBack(e+a,e+a+1,e+1)):(n.emplaceBack(e+1,e,e+a),n.emplaceBack(e+a,e+a+1,e+1));}}const c=So.simpleSegment(0,a,r.length,n.length-a);for(let t=0;t<u.uint16.length;t+=3)n.emplaceBack(u.uint16[t],u.uint16[t+1],u.uint16[t+2]);const h=So.simpleSegment(0,a,r.length,n.length-a);i.push({withoutSkirts:c,withSkirts:h});}return {vertices:r,indices:n,segments:i}}_createGrid(t){const e=this._fillGridMeshWithLods(Sl,kl);this._gridSegments=e.segments,this._gridBuffer=t.createVertexBuffer(e.vertices,xl.members),this._gridIndexBuffer=t.createIndexBuffer(e.indices,!0);}_createPoles(t){const e=new wa;for(let t=0;t<=Sl;t++)e.emplaceBack(0,t+1,t+2);this._poleIndexBuffer=t.createIndexBuffer(e,!0);const r=new ka,n=new ka;this._poleSegments=[];for(let t=0,e=0;t<5;t++){const i=360/(1<<t);r.emplaceBack(0,-Al,0,.5,0),n.emplaceBack(0,-Al,0,.5,1);for(let t=0;t<=Sl;t++){const e=t/Sl,s=Mr(0,i,e),[a,o,l]=Ul(Jl,Ql,s,Al);r.emplaceBack(a,o,l,e,0),n.emplaceBack(a,o,l,e,1);}this._poleSegments.push(So.simpleSegment(e,0,66,64)),e+=66;}this._poleNorthVertexBuffer=t.createVertexBuffer(r,ml,!1),this._poleSouthVertexBuffer=t.createVertexBuffer(n,ml,!1);}getGridBuffers(t,e){return [this._gridBuffer,this._gridIndexBuffer,e?this._gridSegments[t].withSkirts:this._gridSegments[t].withoutSkirts]}getPoleBuffers(t){return [this._poleNorthVertexBuffer,this._poleSouthVertexBuffer,this._poleIndexBuffer,this._poleSegments[t]]}getWirefameBuffers(t,e){if(!this._wireframeSegments){const e=new Ma,r=Sl,n=r+1+2,i=1;this._wireframeSegments=[];for(let t=0,s=0;t<kl.length;t++){const a=kl[t];for(let t=i;t<a+i;t++)for(let s=i;s<r+i;s++){const r=t*n+s;e.emplaceBack(r,r+1),e.emplaceBack(r,r+n),e.emplaceBack(r,r+n+1);}const o=a*r*3;this._wireframeSegments.push(So.simpleSegment(0,s,(a+1)*n,o)),s+=o;}this._wireframeIndexBuffer=t.createIndexBuffer(e);}return [this._gridBuffer,this._wireframeIndexBuffer,this._wireframeSegments[e]]}},t.GlyphManager=cf,t.ImagePosition=Pp,t.LivePerformanceUtils=Lt,t.LngLat=ru,t.LngLatBounds=Io,t.LocalGlyphMode=uf,t.MAX_MERCATOR_LATITUDE=cu,t.MercatorCoordinate=pu,t.ONE_EM=Wh,t.OverscaledTileID=Mh,t.PerformanceMarkers=Vt,t.Properties=Js,t.RGBAImage=Qu,t.Ray=vl,t.RequestManager=class{constructor(t,e,r){this._transformRequestFn=t,this._customAccessToken=e,this._silenceAuthErrors=!!r,this._createSkuToken();}_createSkuToken(){const t=function(){let t=\"\";for(let e=0;e<10;e++)t+=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"[Math.floor(62*Math.random())];return {token:[\"1\",h,t].join(\"\"),tokenExpiresAt:Date.now()+432e5}}();this._skuToken=t.token,this._skuTokenExpiresAt=t.tokenExpiresAt;}_isSkuTokenExpired(){return Date.now()>this._skuTokenExpiresAt}transformRequest(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}}normalizeStyleURL(t,e){if(!mt(t))return t;const r=_t(t);return r.path=`/styles/v1${r.path}`,this._makeAPIURL(r,this._customAccessToken||e)}normalizeGlyphsURL(t,e){if(!mt(t))return t;const r=_t(t);return r.path=`/fonts/v1${r.path}`,this._makeAPIURL(r,this._customAccessToken||e)}normalizeSourceURL(t,e,r,n){if(!mt(t))return t;const i=_t(t);return i.path=`/v4/${i.authority}.json`,i.params.push(\"secure\"),r&&i.params.push(`language=${r}`),n&&i.params.push(`worldview=${n}`),this._makeAPIURL(i,this._customAccessToken||e)}normalizeSpriteURL(t,e,r,n){const i=_t(t);return mt(t)?(i.path=`/styles/v1${i.path}/sprite${e}${r}`,this._makeAPIURL(i,this._customAccessToken||n)):(i.path+=`${e}${r}`,At(i))}normalizeTileURL(t,e,r){if(this._isSkuTokenExpired()&&this._createSkuToken(),t&&!mt(t))return t;const n=_t(t);n.path=n.path.replace(/(\\.(png|jpg)\\d*)(?=$)/,`${e||r&&\"raster\"!==n.authority&&512===r?\"@2x\":\"\"}${s.supported?\".webp\":\"$1\"}`),\"raster\"===n.authority?n.path=`/${i.RASTER_URL_PREFIX}${n.path}`:(n.path=n.path.replace(/^.+\\/v4\\//,\"/\"),n.path=`/${i.TILE_URL_VERSION}${n.path}`);const a=this._customAccessToken||function(t){for(const e of t){const t=e.match(/^access_token=(.*)$/);if(t)return t[1]}return null}(n.params)||i.ACCESS_TOKEN;return i.REQUIRE_ACCESS_TOKEN&&a&&this._skuToken&&n.params.push(`sku=${this._skuToken}`),this._makeAPIURL(n,a)}canonicalizeTileURL(t,e){const r=_t(t);if(!r.path.match(/^(\\/v4\\/|\\/raster\\/v1\\/)/)||!r.path.match(/\\.[\\w]+$/))return t;let n=\"mapbox://\";r.path.match(/^\\/raster\\/v1\\//)?n+=`raster/${r.path.replace(`/${i.RASTER_URL_PREFIX}/`,\"\")}`:n+=`tiles/${r.path.replace(`/${i.TILE_URL_VERSION}/`,\"\")}`;let s=r.params;return e&&(s=s.filter((t=>!t.match(/^access_token=/)))),s.length&&(n+=`?${s.join(\"&\")}`),n}canonicalizeTileset(t,e){const r=!!e&&mt(e),n=[];for(const e of t.tiles||[])gt(e)?n.push(this.canonicalizeTileURL(e,r)):n.push(e);return n}_makeAPIURL(t,e){const r=\"See https://docs.mapbox.com/api/overview/#access-tokens-and-token-scopes\",n=_t(i.API_URL);if(t.protocol=n.protocol,t.authority=n.authority,\"http\"===t.protocol){const e=t.params.indexOf(\"secure\");e>=0&&t.params.splice(e,1);}if(\"/\"!==n.path&&(t.path=`${n.path}${t.path}`),!i.REQUIRE_ACCESS_TOKEN)return At(t);if(e=e||i.ACCESS_TOKEN,!this._silenceAuthErrors){if(!e)throw new Error(`An API access token is required to use Mapbox GL. ${r}`);if(\"s\"===e[0])throw new Error(`Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). ${r}`)}return t.params=t.params.filter((t=>-1===t.indexOf(\"access_token\"))),t.params.push(`access_token=${e||\"\"}`),At(t)}},t.ResourceType=st,t.SegmentVector=So,t.SourceCache=ny,t.StencilMode=Jd,t.StructArrayLayout1ui2=Ta,t.StructArrayLayout2f1f2i16=xa,t.StructArrayLayout2i4=sa,t.StructArrayLayout2ui4=Ma,t.StructArrayLayout3f12=ba,t.StructArrayLayout3ui6=wa,t.StructArrayLayout4i8=oa,t.StructArrayLayout5f20=ka,t.Texture=_d,t.Tile=Fd,t.Transitionable=qs,t.Uniform1f=to,t.Uniform1i=class extends Qa{constructor(t){super(t),this.current=0;}set(t,e,r){this.fetchUniformLocation(t,e)&&this.current!==r&&(this.current=r,this.gl.uniform1i(this.location,r));}},t.Uniform2f=class extends Qa{constructor(t){super(t),this.current=[0,0];}set(t,e,r){this.fetchUniformLocation(t,e)&&(r[0]===this.current[0]&&r[1]===this.current[1]||(this.current=r,this.gl.uniform2f(this.location,r[0],r[1])));}},t.Uniform3f=class extends Qa{constructor(t){super(t),this.current=[0,0,0];}set(t,e,r){this.fetchUniformLocation(t,e)&&(r[0]===this.current[0]&&r[1]===this.current[1]&&r[2]===this.current[2]||(this.current=r,this.gl.uniform3f(this.location,r[0],r[1],r[2])));}},t.Uniform4f=eo,t.UniformColor=ro,t.UniformMatrix2f=class extends Qa{constructor(t){super(t),this.current=so;}set(t,e,r){if(this.fetchUniformLocation(t,e))for(let t=0;t<4;t++)if(r[t]!==this.current[t]){this.current=r,this.gl.uniformMatrix2fv(this.location,!1,r);break}}},t.UniformMatrix3f=class extends Qa{constructor(t){super(t),this.current=io;}set(t,e,r){if(this.fetchUniformLocation(t,e))for(let t=0;t<9;t++)if(r[t]!==this.current[t]){this.current=r,this.gl.uniformMatrix3fv(this.location,!1,r);break}}},t.UniformMatrix4f=class extends Qa{constructor(t){super(t),this.current=no;}set(t,e,r){if(this.fetchUniformLocation(t,e)){if(r[12]!==this.current[12]||r[0]!==this.current[0])return this.current=r,void this.gl.uniformMatrix4fv(this.location,!1,r);for(let t=1;t<16;t++)if(r[t]!==this.current[t]){this.current=r,this.gl.uniformMatrix4fv(this.location,!1,r);break}}}},t.UnwrappedTileID=Ih,t.ValidationError=Wn,t.VectorTileFeature=ah,t.VectorTileWorkerSource=class extends Yt{constructor(t,e,r,n,i){super(),this.actor=t,this.layerIndex=e,this.availableImages=r,this.loadVectorData=i||my,this.loading={},this.loaded={},this.deduped=new yy(t.scheduler),this.isSpriteLoaded=n,this.scheduler=t.scheduler;}loadTile(t,e){const r=t.uid,n=t&&t.request,i=n&&n.collectResourceTiming,s=this.loading[r]=new fy(t);s.abort=this.loadVectorData(t,((a,o)=>{const l=!this.loading[r];if(delete this.loading[r],l||a||!o)return s.status=\"done\",l||(this.loaded[r]=s),e(a);const u=o.rawData,c={};o.expires&&(c.expires=o.expires),o.cacheControl&&(c.cacheControl=o.cacheControl),s.vectorTile=o.vectorTile||new sh(new op(u));const h=()=>{s.parse(s.vectorTile,this.layerIndex,this.availableImages,this.actor,((t,r)=>{if(t||!r)return e(t);const s={};if(i){const t=jt(n);t.length>0&&(s.resourceTiming=JSON.parse(JSON.stringify(t)));}e(null,z({rawTileData:u.slice(0)},r,c,s));}));};this.isSpriteLoaded?h():this.once(\"isSpriteLoaded\",(()=>{this.scheduler?this.scheduler.add(h,{type:\"parseTile\",isSymbolTile:t.isSymbolTile,zoom:t.tileZoom}):h();})),this.loaded=this.loaded||{},this.loaded[r]=s;}));}reloadTile(t,e){const r=this.loaded,n=t.uid,i=this;if(r&&r[n]){const s=r[n];s.showCollisionBoxes=t.showCollisionBoxes,s.enableTerrain=!!t.enableTerrain,s.projection=t.projection,s.tileTransform=Vf(t.tileID.canonical,t.projection);const a=(t,r)=>{const n=s.reloadCallback;n&&(delete s.reloadCallback,s.parse(s.vectorTile,i.layerIndex,this.availableImages,i.actor,n)),e(t,r);};\"parsing\"===s.status?s.reloadCallback=a:\"done\"===s.status&&(s.vectorTile?s.parse(s.vectorTile,this.layerIndex,this.availableImages,this.actor,a):a());}}abortTile(t,e){const r=t.uid,n=this.loading[r];n&&(n.abort&&n.abort(),delete this.loading[r]),e();}removeTile(t,e){const r=this.loaded,n=t.uid;r&&r[n]&&delete r[n],e();}},t.WritingMode=Vp,t.ZoomDependentExpression=Zn,t.add=Go,t.addDynamicAttributes=od,t.adjoint=function(t,e){var r=e[0],n=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8];return t[0]=a*c-o*u,t[1]=i*u-n*c,t[2]=n*o-i*a,t[3]=o*l-s*c,t[4]=r*c-i*l,t[5]=i*s-r*o,t[6]=s*u-a*l,t[7]=n*l-r*u,t[8]=r*a-n*s,t},t.asyncAll=M,t.bezier=_,t.bindAll=V,t.boundsAttributes=Vd,t.bufferConvexPolygon=function(t,e){const r=[];for(let n=0;n<t.length;n++){const i=I(n-1,-1,t.length-1),s=I(n+1,-1,t.length-1),a=t[n],o=t[s],l=t[i].sub(a).unit(),u=o.sub(a).unit(),c=u.angleWithSep(l.x,l.y),h=l.add(u).unit().mult(-1*e/Math.sin(c/2));r.push(a.add(h));}return r},t.cacheEntryPossiblyAdded=function(t){it++,it>tt&&(t.getActor().send(\"enforceCacheSizeLimit\",Q),it=0);},t.calculateGlobeLabelMatrix=function(t,e){const{x:r,y:n}=t.point,i=Zl(r,n,t.worldSize/t._pixelsPerMercatorPixel,0,0);return Po(i,i,Xl(Pl(e)))},t.calculateGlobeMatrix=function(t){const{x:e,y:r}=t.point,{lng:n,lat:i}=t._center;return Zl(e,r,t.worldSize,n,i)},t.calculateGlobeMercatorMatrix=function(t){const e=t.pixelsPerMeter,r=e/au(1,t.center.lat),n=Eo(new Float64Array(16));return Do(n,n,[t.point.x,t.point.y,0]),Vo(n,n,[r,r,e]),Float32Array.from(n)},t.circumferenceAtLatitude=nu,t.clamp=S,t.clearTileCache=function(t){if(!et())return;const r=e.caches.delete(H);t&&r.catch(t).then((()=>t()));},t.clipLine=sf,t.clone=function(t){var e=new To(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.clone$1=j,t.collisionCircleLayout=Hh,t.config=i,t.conjugate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},t.create=function(){var t=new To(16);return To!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.create$1=zo,t.createExpression=Gn,t.createLayout=na,t.createStyleLayer=function(t){return \"custom\"===t.type?new xd(t):new wd[t.type](t)},t.cross=tl,t.degToRad=x,t.distance=function(t,e){return Math.hypot(e[0]-t[0],e[1]-t[1],e[2]-t[2])},t.div=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t},t.dot=Qo,t.earthRadius=tu,t.ease=A,t.easeCubicInOut=w,t.ecefToLatLng=function([t,e,r]){const n=Math.hypot(t,e,r),i=Math.atan2(t,r),s=.5*Math.PI-Math.acos(-e/n);return new ru(v(i),v(s))},t.emitValidationErrors=Ri,t.endsWith=L,t.enforceCacheSizeLimit=function(t){rt(),W&&W.then((e=>{e.keys().then((r=>{for(let n=0;n<r.length-t;n++)e.delete(r[n]);}));}));},t.evaluateSizeForFeature=tp,t.evaluateSizeForZoom=ep,t.evaluateVariableOffset=Sf,t.evented=Ls,t.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exactEquals$1=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]},t.exported=Nt,t.exported$1=s,t.extend=z,t.extend$1=Wt,t.fillExtrusionHeightLift=bh,t.filterObject=R,t.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},t.fromQuat=function(t,e){var r=e[0],n=e[1],i=e[2],s=e[3],a=r+r,o=n+n,l=i+i,u=r*a,c=n*a,h=n*o,p=i*a,f=i*o,d=i*l,y=s*a,m=s*o,g=s*l;return t[0]=1-h-d,t[1]=c+g,t[2]=p-m,t[3]=0,t[4]=c-g,t[5]=1-u-d,t[6]=f+y,t[7]=0,t[8]=p+m,t[9]=f-y,t[10]=1-u-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},t.fromRotation=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=0,t[3]=-r,t[4]=n,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},t.fromScaling=Ro,t.furthestTileCorner=function(t){const e=Math.round((t+45+360)%360/90)%4;return b[e]},t.getAABBPointSquareDist=function(t,e,r){let n=0;for(let i=0;i<2;++i){const s=r?r[i]:0;t[i]>s&&(n+=(t[i]-s)*(t[i]-s)),e[i]<s&&(n+=(s-e[i])*(s-e[i]));}return n},t.getAnchorAlignment=Xp,t.getAnchorJustification=If,t.getBounds=function(t){let e=1/0,r=1/0,n=-1/0,i=-1/0;for(const s of t)e=Math.min(e,s.x),r=Math.min(r,s.y),n=Math.max(n,s.x),i=Math.max(i,s.y);return {min:new d(e,r),max:new d(n,i)}},t.getColumn=Y,t.getGridMatrix=function(t,e,r,n){const i=e.getNorth(),s=e.getSouth(),a=e.getWest(),o=e.getEast(),l=1<<t.z,u=o-a,c=i-s,h=u/Sl,p=-c/kl[r],f=[0,h,0,p,0,0,i,a,0];if(t.z>0){const t=180/n;Bo(f,f,[t/u+1,0,0,0,t/c+1,0,-.5*t/h,.5*t/p,1]);}return f[2]=l,f[5]=t.x,f[8]=t.y,f},t.getImage=dt,t.getJSON=function(t,e){return lt(z(t,{type:\"json\"}),e)},t.getLatitudinalLod=function(t){const e=cu-5;t=S(t,-e,e)/e*90;const r=Math.pow(Math.abs(Math.sin(x(t))),3);return Math.round(r*(kl.length-1))},t.getMapSessionAPI=Pt,t.getPerformanceMeasurement=jt,t.getProjection=rd,t.getRTLTextPluginStatus=Fs,t.getReferrer=ot,t.getTilePoint=function(t,{x:e,y:r},n=0){return new d(((e-n)*t.scale-t.x)*ko,(r*t.scale-t.y)*ko)},t.getTileVec3=function(t,e,r=0){return No(((e.x-r)*t.scale-t.x)*ko,(e.y*t.scale-t.y)*ko,uu(e.z,e.y))},t.getVideo=function(t,r){const n=e.document.createElement(\"video\");n.muted=!0,n.onloadstart=function(){r(null,n);};for(let r=0;r<t.length;r++){const i=e.document.createElement(\"source\");ct(t[r])||(n.crossOrigin=\"Anonymous\"),i.src=t[r],n.appendChild(i);}return {cancel:()=>{}}},t.globeCenterToScreenPoint=function(t){const e=[0,0,0],r=Eo(new Float64Array(16));return Po(r,t.pixelMatrix,t.globeMatrix),el(e,e,r),new d(e[0],e[1])},t.globeDenormalizeECEF=Xl,t.globeECEFOrigin=function(t,e){const r=[0,0,0];return el(r,r,Gl(Pl(e.canonical))),el(r,r,t),r},t.globeMetersToEcef=zl,t.globeNormalizeECEF=Gl,t.globePixelsToTileUnits=function(t,e){return ko/(512*Math.pow(2,t))*ql(Pl(e))},t.globePoleMatrixForTile=function(t,e,r){const n=Eo(new Float64Array(16)),i=(e/(1<<t)-.5)*Math.PI*2;return Fo(n,r.globeMatrix,i),Float32Array.from(n)},t.globeTileBounds=Pl,t.globeTiltAtLngLat=Yl,t.globeToMercatorTransition=Kl,t.globeUseCustomAntiAliasing=function(t,e,r){const n=Kl(r.zoom),i=t.style.map._antialias,s=!!e.extStandardDerivatives,a=e.extStandardDerivativesForceOff||t.terrain&&t.terrain.exaggeration()>0;return 0===n&&!i&&!a&&s},t.identity=Eo,t.identity$1=hl,t.invert=Co,t.isFullscreen=function(){return !!e.document.fullscreenElement||!!e.document.webkitFullscreenElement},t.isLngLatBehindGlobe=Hl,t.isMapAuthenticated=function(t){return Dt.has(t)},t.isMapboxURL=mt,t.isSafariWithAntialiasingBug=function(t){const e=t.navigator?t.navigator.userAgent:null;return !!Z(t)&&e&&(e.match(\"Version/15.4\")||e.match(\"Version/15.5\")||e.match(/CPU (OS|iPhone OS) (15_4|15_5) like Mac OS X/))},t.latFromMercatorY=lu,t.latLngToECEF=$l,t.len=al,t.length=qo,t.length$1=function(t){return Math.hypot(t[0],t[1],t[2],t[3])},t.lngFromMercatorX=ou,t.loadVectorTile=my,t.makeRequest=lt,t.mapValue=function(t,e,r,n,i){return S((t-e)/(r-e)*(i-n)+n,n,i)},t.mercatorScale=hu,t.mercatorXfromLng=iu,t.mercatorYfromLat=su,t.mercatorZfromAltitude=au,t.mul=Uo,t.mul$1=sl,t.multiply=Po,t.multiply$1=Bo,t.multiply$2=Zo,t.nextPowerOfTwo=P,t.normalize=Jo,t.normalize$1=dl,t.normalize$2=ll,t.number=Mr,t.ortho=function(t,e,r,n,i,s,a){var o=1/(e-r),l=1/(n-i),u=1/(s-a);return t[0]=-2*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*o,t[13]=(i+n)*l,t[14]=(a+s)*u,t[15]=1,t},t.pbf=op,t.perspective=function(t,e,r,n,i){var s,a=1/Math.tan(e/2);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=i&&i!==1/0?(t[10]=(i+n)*(s=1/(n-i)),t[14]=2*i*n*s):(t[10]=-1,t[14]=-2*n),t},t.pick=function(t,e){const r={};for(let n=0;n<e.length;n++){const i=e[n];i in t&&(r[i]=t[i]);}return r},t.plugin=js,t.pointGeometry=d,t.polesInViewport=function(t){const e=Eo(new Float64Array(16));Po(e,t.pixelMatrix,t.globeMatrix);const r=[0,Il,0],n=[0,Ml,0];return el(r,r,e),el(n,n,e),[r[0]>0&&r[0]<=t.width&&r[1]>0&&r[1]<=t.height&&!Hl(t,new ru(t.center.lat,90)),n[0]>0&&n[0]<=t.width&&n[1]>0&&n[1]<=t.height&&!Hl(t,new ru(t.center.lat,-90))]},t.polygonContainsPoint=Du,t.polygonIntersectsBox=Vu,t.polygonIntersectsPolygon=ku,t.polygonizeBounds=function(t,e,r=0,n=!0){const i=new d(r,r),s=t.sub(i),a=e.add(i),o=[s,new d(a.x,s.y),a,new d(s.x,a.y)];return n&&o.push(s.clone()),o},t.posAttributes=xl,t.postMapLoadEvent=zt,t.postPerformanceEvent=Et,t.postTurnstileEvent=Mt,t.potpack=Cp,t.prevPowerOfTwo=function(t){return t<=1?1:Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},t.radToDeg=v,t.refProperties=[\"type\",\"source\",\"source-layer\",\"minzoom\",\"maxzoom\",\"filter\",\"layout\"],t.registerForPluginStateChange=function(t){return t({pluginStatus:Cs,pluginURL:Ps}),Ls.on(\"pluginStateChange\",t),t},t.removeAuthState=function(t){Dt.delete(t);},t.renderColorRamp=ec,t.resample=du,t.rotateX=Lo,t.rotateX$1=pl,t.rotateY=Fo,t.rotateY$1=fl,t.rotateZ=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),s=e[0],a=e[1],o=e[2],l=e[3],u=e[4],c=e[5],h=e[6],p=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=s*i+u*n,t[1]=a*i+c*n,t[2]=o*i+h*n,t[3]=l*i+p*n,t[4]=u*i-s*n,t[5]=c*i-a*n,t[6]=h*i-o*n,t[7]=p*i-l*n,t},t.rotateZ$1=function(t,e,r){r*=.5;var n=e[0],i=e[1],s=e[2],a=e[3],o=Math.sin(r),l=Math.cos(r);return t[0]=n*l+i*o,t[1]=i*l-n*o,t[2]=s*l+a*o,t[3]=a*l-s*o,t},t.scale=Vo,t.scale$1=ol,t.scale$2=Ho,t.scaleAndAdd=Wo,t.set=function(t,e,r,n){return t[0]=e,t[1]=r,t[2]=n,t},t.setCacheLimits=function(t,e){Q=t,tt=e;},t.setColumn=function(t,e,r){t[4*e+0]=r[0],t[4*e+1]=r[1],t[4*e+2]=r[2],t[4*e+3]=r[3];},t.setRTLTextPlugin=function(t,e,r=!1){if(Cs===Ts||Cs===zs||Cs===Bs)throw new Error(\"setRTLTextPlugin cannot be called multiple times.\");Ps=Nt.resolveURL(t),Cs=Ts,Es=e,Vs(),r||Rs();},t.smoothstep=k,t.spec=Ht,t.squaredLength=function(t){var e=t[0],r=t[1],n=t[2];return e*e+r*r+n*n},t.storeAuthState=function(t,e){e?Dt.add(t):Dt.delete(t);},t.sub=il,t.subtract=Xo,t.symbolSize=rp,t.tileAABB=function(t,e,r,n,i,s,a,o,l){if(\"globe\"===l.name)return Fl(t,e,new kh(r,n,i));const u=Vf({z:r,x:n,y:i},l);return new _l([(s+u.x/u.scale)*e,e*(u.y/u.scale),a],[(s+u.x2/u.scale)*e,e*(u.y2/u.scale),o])},t.tileCornersToBounds=Rl,t.tileTransform=Vf,t.transformMat3=function(t,e,r){var n=e[0],i=e[1],s=e[2];return t[0]=n*r[0]+i*r[3]+s*r[6],t[1]=n*r[1]+i*r[4]+s*r[7],t[2]=n*r[2]+i*r[5]+s*r[8],t},t.transformMat4=el,t.transformMat4$1=ul,t.transformQuat=rl,t.transitionTileAABBinECEF=Vl,t.translate=Do,t.transpose=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[5];t[1]=e[3],t[2]=e[6],t[3]=r,t[5]=e[7],t[6]=n,t[7]=i;}else t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8];return t},t.triggerPluginCompletionEvent=Ds,t.uniqueId=E,t.updateGlobeVertexNormal=function(t,e,r,n,i){const s=5*e+2;t.float32[s+0]=r,t.float32[s+1]=n,t.float32[s+2]=i;},t.validateCustomStyleLayer=function(t){const e=[],r=t.id;return void 0===r&&e.push({message:`layers.${r}: missing required property \"id\"`}),void 0===t.render&&e.push({message:`layers.${r}: missing required method \"render\"`}),t.renderingMode&&\"2d\"!==t.renderingMode&&\"3d\"!==t.renderingMode&&e.push({message:`layers.${r}: property \"renderingMode\" must be either \"2d\" or \"3d\"`}),e},t.validateFilter=t=>Fi(xi(t)),t.validateFog=t=>Fi(Bi(t)),t.validateLayer=t=>Fi(Ai(t)),t.validateLight=t=>Fi(Ti(t)),t.validateSource=t=>Fi(Ii(t)),t.validateStyle=Di,t.validateTerrain=t=>Fi(zi(t)),t.values=T,t.vectorTile=Zc,t.version=r,t.warnOnce=$,t.window=e,t.wrap=I;}));\n\ndefine([\"./shared\"],(function(e){\"use strict\";function t(e){if(\"number\"==typeof e||\"boolean\"==typeof e||\"string\"==typeof e||null==e)return JSON.stringify(e);if(Array.isArray(e)){let r=\"[\";for(const o of e)r+=`${t(o)},`;return `${r}]`}let r=\"{\";for(const o of Object.keys(e).sort())r+=`${o}:${t(e[o])},`;return `${r}}`}function r(r){let o=\"\";for(const n of e.refProperties)o+=`/${t(r[n])}`;return o}class o{constructor(e){this.keyCache={},e&&this.replace(e);}replace(e){this._layerConfigs={},this._layers={},this.update(e,[]);}update(t,o){for(const r of t)this._layerConfigs[r.id]=r,(this._layers[r.id]=e.createStyleLayer(r)).compileFilter(),this.keyCache[r.id]&&delete this.keyCache[r.id];for(const e of o)delete this.keyCache[e],delete this._layerConfigs[e],delete this._layers[e];this.familiesBySource={};const n=function(e,t){const o={};for(let n=0;n<e.length;n++){const i=t&&t[e[n].id]||r(e[n]);t&&(t[e[n].id]=i);let s=o[i];s||(s=o[i]=[]),s.push(e[n]);}const n=[];for(const e in o)n.push(o[e]);return n}(e.values(this._layerConfigs),this.keyCache);for(const e of n){const t=e.map((e=>this._layers[e.id])),r=t[0];if(\"none\"===r.visibility)continue;const o=r.source||\"\";let n=this.familiesBySource[o];n||(n=this.familiesBySource[o]={});const i=r.sourceLayer||\"_geojsonTileLayer\";let s=n[i];s||(s=n[i]=[]),s.push(t);}}}class n{loadTile(t,r){const{uid:o,encoding:n,rawImageData:i,padding:s,buildQuadTree:a}=t,l=e.window.ImageBitmap&&i instanceof e.window.ImageBitmap?this.getImageData(i,s):i;r(null,new e.DEMData(o,l,n,s<1,a));}getImageData(e,t){this.offscreenCanvas&&this.offscreenCanvasContext||(this.offscreenCanvas=new OffscreenCanvas(e.width,e.height),this.offscreenCanvasContext=this.offscreenCanvas.getContext(\"2d\",{willReadFrequently:!0})),this.offscreenCanvas.width=e.width,this.offscreenCanvas.height=e.height,this.offscreenCanvasContext.drawImage(e,0,0,e.width,e.height);const r=this.offscreenCanvasContext.getImageData(-t,-t,e.width+2*t,e.height+2*t);return this.offscreenCanvasContext.clearRect(0,0,this.offscreenCanvas.width,this.offscreenCanvas.height),r}}var i=function e(t,r){var o,n=t&&t.type;if(\"FeatureCollection\"===n)for(o=0;o<t.features.length;o++)e(t.features[o],r);else if(\"GeometryCollection\"===n)for(o=0;o<t.geometries.length;o++)e(t.geometries[o],r);else if(\"Feature\"===n)e(t.geometry,r);else if(\"Polygon\"===n)s(t.coordinates,r);else if(\"MultiPolygon\"===n)for(o=0;o<t.coordinates.length;o++)s(t.coordinates[o],r);return t};function s(e,t){if(0!==e.length){a(e[0],t);for(var r=1;r<e.length;r++)a(e[r],!t);}}function a(e,t){for(var r=0,o=0,n=0,i=e.length,s=i-1;n<i;s=n++){var a=(e[n][0]-e[s][0])*(e[s][1]+e[n][1]),l=r+a;o+=Math.abs(r)>=Math.abs(a)?r-l+a:a-l+r,r=l;}r+o>=0!=!!t&&e.reverse();}const l=e.VectorTileFeature.prototype.toGeoJSON;class u{constructor(t){this._feature=t,this.extent=e.EXTENT,this.type=t.type,this.properties=t.tags,\"id\"in t&&!isNaN(t.id)&&(this.id=parseInt(t.id,10));}loadGeometry(){if(1===this._feature.type){const t=[];for(const r of this._feature.geometry)t.push([new e.pointGeometry(r[0],r[1])]);return t}{const t=[];for(const r of this._feature.geometry){const o=[];for(const t of r)o.push(new e.pointGeometry(t[0],t[1]));t.push(o);}return t}}toGeoJSON(e,t,r){return l.call(this,e,t,r)}}class h{constructor(t){this.layers={_geojsonTileLayer:this},this.name=\"_geojsonTileLayer\",this.extent=e.EXTENT,this.length=t.length,this._features=t;}feature(e){return new u(this._features[e])}}var c={},f={get exports(){return c},set exports(e){c=e;}},p=e.pointGeometry,g=e.vectorTile.VectorTileFeature,d=m;function m(e,t){this.options=t||{},this.features=e,this.length=e.length;}function y(e,t){this.id=\"number\"==typeof e.id?e.id:void 0,this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=t||4096;}m.prototype.feature=function(e){return new y(this.features[e],this.options.extent)},y.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var t=0;t<e.length;t++){for(var r=e[t],o=[],n=0;n<r.length;n++)o.push(new p(r[n][0],r[n][1]));this.geometry.push(o);}return this.geometry},y.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var e=this.geometry,t=1/0,r=-1/0,o=1/0,n=-1/0,i=0;i<e.length;i++)for(var s=e[i],a=0;a<s.length;a++){var l=s[a];t=Math.min(t,l.x),r=Math.max(r,l.x),o=Math.min(o,l.y),n=Math.max(n,l.y);}return [t,o,r,n]},y.prototype.toGeoJSON=g.prototype.toGeoJSON;var v=e.pbf,x=d;function w(e){var t=new v;return function(e,t){for(var r in e.layers)t.writeMessage(3,S,e.layers[r]);}(e,t),t.finish()}function S(e,t){var r;t.writeVarintField(15,e.version||1),t.writeStringField(1,e.name||\"\"),t.writeVarintField(5,e.extent||4096);var o={keys:[],values:[],keycache:{},valuecache:{}};for(r=0;r<e.length;r++)o.feature=e.feature(r),t.writeMessage(2,M,o);var n=o.keys;for(r=0;r<n.length;r++)t.writeStringField(3,n[r]);var i=o.values;for(r=0;r<i.length;r++)t.writeMessage(4,T,i[r]);}function M(e,t){var r=e.feature;void 0!==r.id&&t.writeVarintField(1,r.id),t.writeMessage(2,P,e),t.writeVarintField(3,r.type),t.writeMessage(4,I,r);}function P(e,t){var r=e.feature,o=e.keys,n=e.values,i=e.keycache,s=e.valuecache;for(var a in r.properties){var l=r.properties[a],u=i[a];if(null!==l){void 0===u&&(o.push(a),i[a]=u=o.length-1),t.writeVarint(u);var h=typeof l;\"string\"!==h&&\"boolean\"!==h&&\"number\"!==h&&(l=JSON.stringify(l));var c=h+\":\"+l,f=s[c];void 0===f&&(n.push(l),s[c]=f=n.length-1),t.writeVarint(f);}}}function b(e,t){return (t<<3)+(7&e)}function k(e){return e<<1^e>>31}function I(e,t){for(var r=e.loadGeometry(),o=e.type,n=0,i=0,s=r.length,a=0;a<s;a++){var l=r[a],u=1;1===o&&(u=l.length),t.writeVarint(b(1,u));for(var h=3===o?l.length-1:l.length,c=0;c<h;c++){1===c&&1!==o&&t.writeVarint(b(2,h-1));var f=l[c].x-n,p=l[c].y-i;t.writeVarint(k(f)),t.writeVarint(k(p)),n+=f,i+=p;}3===o&&t.writeVarint(b(7,1));}}function T(e,t){var r=typeof e;\"string\"===r?t.writeStringField(1,e):\"boolean\"===r?t.writeBooleanField(7,e):\"number\"===r&&(e%1!=0?t.writeDoubleField(3,e):e<0?t.writeSVarintField(6,e):t.writeVarintField(5,e));}function _(e,t,r,o,n,i){if(n-o<=r)return;const s=o+n>>1;L(e,t,s,o,n,i%2),_(e,t,r,o,s-1,i+1),_(e,t,r,s+1,n,i+1);}function L(e,t,r,o,n,i){for(;n>o;){if(n-o>600){const s=n-o+1,a=r-o+1,l=Math.log(s),u=.5*Math.exp(2*l/3),h=.5*Math.sqrt(l*u*(s-u)/s)*(a-s/2<0?-1:1);L(e,t,r,Math.max(o,Math.floor(r-a*u/s+h)),Math.min(n,Math.floor(r+(s-a)*u/s+h)),i);}const s=t[2*r+i];let a=o,l=n;for(C(e,t,o,r),t[2*n+i]>s&&C(e,t,o,n);a<l;){for(C(e,t,a,l),a++,l--;t[2*a+i]<s;)a++;for(;t[2*l+i]>s;)l--;}t[2*o+i]===s?C(e,t,o,l):(l++,C(e,t,l,n)),l<=r&&(o=l+1),r<=l&&(n=l-1);}}function C(e,t,r,o){O(e,r,o),O(t,2*r,2*o),O(t,2*r+1,2*o+1);}function O(e,t,r){const o=e[t];e[t]=e[r],e[r]=o;}function z(e,t,r,o){const n=e-r,i=t-o;return n*n+i*i}f.exports=w,c.fromVectorTileJs=w,c.fromGeojsonVt=function(e,t){t=t||{};var r={};for(var o in e)r[o]=new x(e[o].features,t),r[o].name=o,r[o].version=t.version,r[o].extent=t.extent;return w({layers:r})},c.GeoJSONWrapper=x;const E=e=>e[0],F=e=>e[1];class N{constructor(e,t=E,r=F,o=64,n=Float64Array){this.nodeSize=o,this.points=e;const i=e.length<65536?Uint16Array:Uint32Array,s=this.ids=new i(e.length),a=this.coords=new n(2*e.length);for(let o=0;o<e.length;o++)s[o]=o,a[2*o]=t(e[o]),a[2*o+1]=r(e[o]);_(s,a,o,0,s.length-1,0);}range(e,t,r,o){return function(e,t,r,o,n,i,s){const a=[0,e.length-1,0],l=[];let u,h;for(;a.length;){const c=a.pop(),f=a.pop(),p=a.pop();if(f-p<=s){for(let s=p;s<=f;s++)u=t[2*s],h=t[2*s+1],u>=r&&u<=n&&h>=o&&h<=i&&l.push(e[s]);continue}const g=Math.floor((p+f)/2);u=t[2*g],h=t[2*g+1],u>=r&&u<=n&&h>=o&&h<=i&&l.push(e[g]);const d=(c+1)%2;(0===c?r<=u:o<=h)&&(a.push(p),a.push(g-1),a.push(d)),(0===c?n>=u:i>=h)&&(a.push(g+1),a.push(f),a.push(d));}return l}(this.ids,this.coords,e,t,r,o,this.nodeSize)}within(e,t,r){return function(e,t,r,o,n,i){const s=[0,e.length-1,0],a=[],l=n*n;for(;s.length;){const u=s.pop(),h=s.pop(),c=s.pop();if(h-c<=i){for(let n=c;n<=h;n++)z(t[2*n],t[2*n+1],r,o)<=l&&a.push(e[n]);continue}const f=Math.floor((c+h)/2),p=t[2*f],g=t[2*f+1];z(p,g,r,o)<=l&&a.push(e[f]);const d=(u+1)%2;(0===u?r-n<=p:o-n<=g)&&(s.push(c),s.push(f-1),s.push(d)),(0===u?r+n>=p:o+n>=g)&&(s.push(f+1),s.push(h),s.push(d));}return a}(this.ids,this.coords,e,t,r,this.nodeSize)}}const j={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:e=>e},Z=Math.fround||(G=new Float32Array(1),e=>(G[0]=+e,G[0]));var G;class J{constructor(e){this.options=B(Object.create(j),e),this.trees=new Array(this.options.maxZoom+1);}load(e){const{log:t,minZoom:r,maxZoom:o,nodeSize:n}=this.options;t&&console.time(\"total time\");const i=`prepare ${e.length} points`;t&&console.time(i),this.points=e;let s=[];for(let t=0;t<e.length;t++)e[t].geometry&&s.push(Y(e[t],t));this.trees[o+1]=new N(s,R,q,n,Float32Array),t&&console.timeEnd(i);for(let e=o;e>=r;e--){const r=+Date.now();s=this._cluster(s,e),this.trees[e]=new N(s,R,q,n,Float32Array),t&&console.log(\"z%d: %d clusters in %dms\",e,s.length,+Date.now()-r);}return t&&console.timeEnd(\"total time\"),this}getClusters(e,t){let r=((e[0]+180)%360+360)%360-180;const o=Math.max(-90,Math.min(90,e[1]));let n=180===e[2]?180:((e[2]+180)%360+360)%360-180;const i=Math.max(-90,Math.min(90,e[3]));if(e[2]-e[0]>=360)r=-180,n=180;else if(r>n){const e=this.getClusters([r,o,180,i],t),s=this.getClusters([-180,o,n,i],t);return e.concat(s)}const s=this.trees[this._limitZoom(t)],a=s.range(A(r),D(i),A(n),D(o)),l=[];for(const e of a){const t=s.points[e];l.push(t.numPoints?X(t):this.points[t.index]);}return l}getChildren(e){const t=this._getOriginId(e),r=this._getOriginZoom(e),o=\"No cluster with the specified id.\",n=this.trees[r];if(!n)throw new Error(o);const i=n.points[t];if(!i)throw new Error(o);const s=this.options.radius/(this.options.extent*Math.pow(2,r-1)),a=n.within(i.x,i.y,s),l=[];for(const t of a){const r=n.points[t];r.parentId===e&&l.push(r.numPoints?X(r):this.points[r.index]);}if(0===l.length)throw new Error(o);return l}getLeaves(e,t,r){const o=[];return this._appendLeaves(o,e,t=t||10,r=r||0,0),o}getTile(e,t,r){const o=this.trees[this._limitZoom(e)],n=Math.pow(2,e),{extent:i,radius:s}=this.options,a=s/i,l=(r-a)/n,u=(r+1+a)/n,h={features:[]};return this._addTileFeatures(o.range((t-a)/n,l,(t+1+a)/n,u),o.points,t,r,n,h),0===t&&this._addTileFeatures(o.range(1-a/n,l,1,u),o.points,n,r,n,h),t===n-1&&this._addTileFeatures(o.range(0,l,a/n,u),o.points,-1,r,n,h),h.features.length?h:null}getClusterExpansionZoom(e){let t=this._getOriginZoom(e)-1;for(;t<=this.options.maxZoom;){const r=this.getChildren(e);if(t++,1!==r.length)break;e=r[0].properties.cluster_id;}return t}_appendLeaves(e,t,r,o,n){const i=this.getChildren(t);for(const t of i){const i=t.properties;if(i&&i.cluster?n+i.point_count<=o?n+=i.point_count:n=this._appendLeaves(e,i.cluster_id,r,o,n):n<o?n++:e.push(t),e.length===r)break}return n}_addTileFeatures(e,t,r,o,n,i){for(const s of e){const e=t[s],a=e.numPoints;let l,u,h;if(a)l=V(e),u=e.x,h=e.y;else {const t=this.points[e.index];l=t.properties,u=A(t.geometry.coordinates[0]),h=D(t.geometry.coordinates[1]);}const c={type:1,geometry:[[Math.round(this.options.extent*(u*n-r)),Math.round(this.options.extent*(h*n-o))]],tags:l};let f;a?f=e.id:this.options.generateId?f=e.index:this.points[e.index].id&&(f=this.points[e.index].id),void 0!==f&&(c.id=f),i.features.push(c);}}_limitZoom(e){return Math.max(this.options.minZoom,Math.min(Math.floor(+e),this.options.maxZoom+1))}_cluster(e,t){const r=[],{radius:o,extent:n,reduce:i,minPoints:s}=this.options,a=o/(n*Math.pow(2,t));for(let o=0;o<e.length;o++){const n=e[o];if(n.zoom<=t)continue;n.zoom=t;const l=this.trees[t+1],u=l.within(n.x,n.y,a),h=n.numPoints||1;let c=h;for(const e of u){const r=l.points[e];r.zoom>t&&(c+=r.numPoints||1);}if(c>h&&c>=s){let e=n.x*h,s=n.y*h,a=i&&h>1?this._map(n,!0):null;const f=(o<<5)+(t+1)+this.points.length;for(const r of u){const o=l.points[r];if(o.zoom<=t)continue;o.zoom=t;const u=o.numPoints||1;e+=o.x*u,s+=o.y*u,o.parentId=f,i&&(a||(a=this._map(n,!0)),i(a,this._map(o)));}n.parentId=f,r.push(W(e/c,s/c,f,c,a));}else if(r.push(n),c>1)for(const e of u){const o=l.points[e];o.zoom<=t||(o.zoom=t,r.push(o));}}return r}_getOriginId(e){return e-this.points.length>>5}_getOriginZoom(e){return (e-this.points.length)%32}_map(e,t){if(e.numPoints)return t?B({},e.properties):e.properties;const r=this.points[e.index].properties,o=this.options.map(r);return t&&o===r?B({},o):o}}function W(e,t,r,o,n){return {x:Z(e),y:Z(t),zoom:1/0,id:r,parentId:-1,numPoints:o,properties:n}}function Y(e,t){const[r,o]=e.geometry.coordinates;return {x:Z(A(r)),y:Z(D(o)),zoom:1/0,index:t,parentId:-1}}function X(e){return {type:\"Feature\",id:e.id,properties:V(e),geometry:{type:\"Point\",coordinates:[(t=e.x,360*(t-.5)),$(e.y)]}};var t;}function V(e){const t=e.numPoints,r=t>=1e4?`${Math.round(t/1e3)}k`:t>=1e3?Math.round(t/100)/10+\"k\":t;return B(B({},e.properties),{cluster:!0,cluster_id:e.id,point_count:t,point_count_abbreviated:r})}function A(e){return e/360+.5}function D(e){const t=Math.sin(e*Math.PI/180),r=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return r<0?0:r>1?1:r}function $(e){const t=(180-360*e)*Math.PI/180;return 360*Math.atan(Math.exp(t))/Math.PI-90}function B(e,t){for(const r in t)e[r]=t[r];return e}function R(e){return e.x}function q(e){return e.y}function U(e,t,r,o){for(var n,i=o,s=r-t>>1,a=r-t,l=e[t],u=e[t+1],h=e[r],c=e[r+1],f=t+3;f<r;f+=3){var p=Q(e[f],e[f+1],l,u,h,c);if(p>i)n=f,i=p;else if(p===i){var g=Math.abs(f-s);g<a&&(n=f,a=g);}}i>o&&(n-t>3&&U(e,t,n,o),e[n+2]=i,r-n>3&&U(e,n,r,o));}function Q(e,t,r,o,n,i){var s=n-r,a=i-o;if(0!==s||0!==a){var l=((e-r)*s+(t-o)*a)/(s*s+a*a);l>1?(r=n,o=i):l>0&&(r+=s*l,o+=a*l);}return (s=e-r)*s+(a=t-o)*a}function H(e,t,r,o){var n={id:void 0===e?null:e,type:t,geometry:r,tags:o,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(e){var t=e.geometry,r=e.type;if(\"Point\"===r||\"MultiPoint\"===r||\"LineString\"===r)K(e,t);else if(\"Polygon\"===r||\"MultiLineString\"===r)for(var o=0;o<t.length;o++)K(e,t[o]);else if(\"MultiPolygon\"===r)for(o=0;o<t.length;o++)for(var n=0;n<t[o].length;n++)K(e,t[o][n]);}(n),n}function K(e,t){for(var r=0;r<t.length;r+=3)e.minX=Math.min(e.minX,t[r]),e.minY=Math.min(e.minY,t[r+1]),e.maxX=Math.max(e.maxX,t[r]),e.maxY=Math.max(e.maxY,t[r+1]);}function ee(e,t,r,o){if(t.geometry){var n=t.geometry.coordinates,i=t.geometry.type,s=Math.pow(r.tolerance/((1<<r.maxZoom)*r.extent),2),a=[],l=t.id;if(r.promoteId?l=t.properties[r.promoteId]:r.generateId&&(l=o||0),\"Point\"===i)te(n,a);else if(\"MultiPoint\"===i)for(var u=0;u<n.length;u++)te(n[u],a);else if(\"LineString\"===i)re(n,a,s,!1);else if(\"MultiLineString\"===i){if(r.lineMetrics){for(u=0;u<n.length;u++)re(n[u],a=[],s,!1),e.push(H(l,\"LineString\",a,t.properties));return}oe(n,a,s,!1);}else if(\"Polygon\"===i)oe(n,a,s,!0);else {if(\"MultiPolygon\"!==i){if(\"GeometryCollection\"===i){for(u=0;u<t.geometry.geometries.length;u++)ee(e,{id:l,geometry:t.geometry.geometries[u],properties:t.properties},r,o);return}throw new Error(\"Input data is not a valid GeoJSON object.\")}for(u=0;u<n.length;u++){var h=[];oe(n[u],h,s,!0),a.push(h);}}e.push(H(l,i,a,t.properties));}}function te(e,t){t.push(ne(e[0])),t.push(ie(e[1])),t.push(0);}function re(e,t,r,o){for(var n,i,s=0,a=0;a<e.length;a++){var l=ne(e[a][0]),u=ie(e[a][1]);t.push(l),t.push(u),t.push(0),a>0&&(s+=o?(n*u-l*i)/2:Math.sqrt(Math.pow(l-n,2)+Math.pow(u-i,2))),n=l,i=u;}var h=t.length-3;t[2]=1,U(t,0,h,r),t[h+2]=1,t.size=Math.abs(s),t.start=0,t.end=t.size;}function oe(e,t,r,o){for(var n=0;n<e.length;n++){var i=[];re(e[n],i,r,o),t.push(i);}}function ne(e){return e/360+.5}function ie(e){var t=Math.sin(e*Math.PI/180),r=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return r<0?0:r>1?1:r}function se(e,t,r,o,n,i,s,a){if(o/=t,i>=(r/=t)&&s<o)return e;if(s<r||i>=o)return null;for(var l=[],u=0;u<e.length;u++){var h=e[u],c=h.geometry,f=h.type,p=0===n?h.minX:h.minY,g=0===n?h.maxX:h.maxY;if(p>=r&&g<o)l.push(h);else if(!(g<r||p>=o)){var d=[];if(\"Point\"===f||\"MultiPoint\"===f)ae(c,d,r,o,n);else if(\"LineString\"===f)le(c,d,r,o,n,!1,a.lineMetrics);else if(\"MultiLineString\"===f)he(c,d,r,o,n,!1);else if(\"Polygon\"===f)he(c,d,r,o,n,!0);else if(\"MultiPolygon\"===f)for(var m=0;m<c.length;m++){var y=[];he(c[m],y,r,o,n,!0),y.length&&d.push(y);}if(d.length){if(a.lineMetrics&&\"LineString\"===f){for(m=0;m<d.length;m++)l.push(H(h.id,f,d[m],h.tags));continue}\"LineString\"!==f&&\"MultiLineString\"!==f||(1===d.length?(f=\"LineString\",d=d[0]):f=\"MultiLineString\"),\"Point\"!==f&&\"MultiPoint\"!==f||(f=3===d.length?\"Point\":\"MultiPoint\"),l.push(H(h.id,f,d,h.tags));}}}return l.length?l:null}function ae(e,t,r,o,n){for(var i=0;i<e.length;i+=3){var s=e[i+n];s>=r&&s<=o&&(t.push(e[i]),t.push(e[i+1]),t.push(e[i+2]));}}function le(e,t,r,o,n,i,s){for(var a,l,u=ue(e),h=0===n?fe:pe,c=e.start,f=0;f<e.length-3;f+=3){var p=e[f],g=e[f+1],d=e[f+2],m=e[f+3],y=e[f+4],v=0===n?p:g,x=0===n?m:y,w=!1;s&&(a=Math.sqrt(Math.pow(p-m,2)+Math.pow(g-y,2))),v<r?x>r&&(l=h(u,p,g,m,y,r),s&&(u.start=c+a*l)):v>o?x<o&&(l=h(u,p,g,m,y,o),s&&(u.start=c+a*l)):ce(u,p,g,d),x<r&&v>=r&&(l=h(u,p,g,m,y,r),w=!0),x>o&&v<=o&&(l=h(u,p,g,m,y,o),w=!0),!i&&w&&(s&&(u.end=c+a*l),t.push(u),u=ue(e)),s&&(c+=a);}var S=e.length-3;p=e[S],g=e[S+1],d=e[S+2],(v=0===n?p:g)>=r&&v<=o&&ce(u,p,g,d),S=u.length-3,i&&S>=3&&(u[S]!==u[0]||u[S+1]!==u[1])&&ce(u,u[0],u[1],u[2]),u.length&&t.push(u);}function ue(e){var t=[];return t.size=e.size,t.start=e.start,t.end=e.end,t}function he(e,t,r,o,n,i){for(var s=0;s<e.length;s++)le(e[s],t,r,o,n,i,!1);}function ce(e,t,r,o){e.push(t),e.push(r),e.push(o);}function fe(e,t,r,o,n,i){var s=(i-t)/(o-t);return e.push(i),e.push(r+(n-r)*s),e.push(1),s}function pe(e,t,r,o,n,i){var s=(i-r)/(n-r);return e.push(t+(o-t)*s),e.push(i),e.push(1),s}function ge(e,t){for(var r=[],o=0;o<e.length;o++){var n,i=e[o],s=i.type;if(\"Point\"===s||\"MultiPoint\"===s||\"LineString\"===s)n=de(i.geometry,t);else if(\"MultiLineString\"===s||\"Polygon\"===s){n=[];for(var a=0;a<i.geometry.length;a++)n.push(de(i.geometry[a],t));}else if(\"MultiPolygon\"===s)for(n=[],a=0;a<i.geometry.length;a++){for(var l=[],u=0;u<i.geometry[a].length;u++)l.push(de(i.geometry[a][u],t));n.push(l);}r.push(H(i.id,s,n,i.tags));}return r}function de(e,t){var r=[];r.size=e.size,void 0!==e.start&&(r.start=e.start,r.end=e.end);for(var o=0;o<e.length;o+=3)r.push(e[o]+t,e[o+1],e[o+2]);return r}function me(e,t){if(e.transformed)return e;var r,o,n,i=1<<e.z,s=e.x,a=e.y;for(r=0;r<e.features.length;r++){var l=e.features[r],u=l.geometry,h=l.type;if(l.geometry=[],1===h)for(o=0;o<u.length;o+=2)l.geometry.push(ye(u[o],u[o+1],t,i,s,a));else for(o=0;o<u.length;o++){var c=[];for(n=0;n<u[o].length;n+=2)c.push(ye(u[o][n],u[o][n+1],t,i,s,a));l.geometry.push(c);}}return e.transformed=!0,e}function ye(e,t,r,o,n,i){return [Math.round(r*(e*o-n)),Math.round(r*(t*o-i))]}function ve(e,t,r,o,n){for(var i=t===n.maxZoom?0:n.tolerance/((1<<t)*n.extent),s={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:o,z:t,transformed:!1,minX:2,minY:1,maxX:-1,maxY:0},a=0;a<e.length;a++){s.numFeatures++,xe(s,e[a],i,n);var l=e[a].minX,u=e[a].minY,h=e[a].maxX,c=e[a].maxY;l<s.minX&&(s.minX=l),u<s.minY&&(s.minY=u),h>s.maxX&&(s.maxX=h),c>s.maxY&&(s.maxY=c);}return s}function xe(e,t,r,o){var n=t.geometry,i=t.type,s=[];if(\"Point\"===i||\"MultiPoint\"===i)for(var a=0;a<n.length;a+=3)s.push(n[a]),s.push(n[a+1]),e.numPoints++,e.numSimplified++;else if(\"LineString\"===i)we(s,n,e,r,!1,!1);else if(\"MultiLineString\"===i||\"Polygon\"===i)for(a=0;a<n.length;a++)we(s,n[a],e,r,\"Polygon\"===i,0===a);else if(\"MultiPolygon\"===i)for(var l=0;l<n.length;l++){var u=n[l];for(a=0;a<u.length;a++)we(s,u[a],e,r,!0,0===a);}if(s.length){var h=t.tags||null;if(\"LineString\"===i&&o.lineMetrics){for(var c in h={},t.tags)h[c]=t.tags[c];h.mapbox_clip_start=n.start/n.size,h.mapbox_clip_end=n.end/n.size;}var f={geometry:s,type:\"Polygon\"===i||\"MultiPolygon\"===i?3:\"LineString\"===i||\"MultiLineString\"===i?2:1,tags:h};null!==t.id&&(f.id=t.id),e.features.push(f);}}function we(e,t,r,o,n,i){var s=o*o;if(o>0&&t.size<(n?s:o))r.numPoints+=t.length/3;else {for(var a=[],l=0;l<t.length;l+=3)(0===o||t[l+2]>s)&&(r.numSimplified++,a.push(t[l]),a.push(t[l+1])),r.numPoints++;n&&function(e,t){for(var r=0,o=0,n=e.length,i=n-2;o<n;i=o,o+=2)r+=(e[o]-e[i])*(e[o+1]+e[i+1]);if(r>0===t)for(o=0,n=e.length;o<n/2;o+=2){var s=e[o],a=e[o+1];e[o]=e[n-2-o],e[o+1]=e[n-1-o],e[n-2-o]=s,e[n-1-o]=a;}}(a,i),e.push(a);}}function Se(e,t){var r=(t=this.options=function(e,t){for(var r in t)e[r]=t[r];return e}(Object.create(this.options),t)).debug;if(r&&console.time(\"preprocess data\"),t.maxZoom<0||t.maxZoom>24)throw new Error(\"maxZoom should be in the 0-24 range\");if(t.promoteId&&t.generateId)throw new Error(\"promoteId and generateId cannot be used together.\");var o=function(e,t){var r=[];if(\"FeatureCollection\"===e.type)for(var o=0;o<e.features.length;o++)ee(r,e.features[o],t,o);else ee(r,\"Feature\"===e.type?e:{geometry:e},t);return r}(e,t);this.tiles={},this.tileCoords=[],r&&(console.timeEnd(\"preprocess data\"),console.log(\"index: maxZoom: %d, maxPoints: %d\",t.indexMaxZoom,t.indexMaxPoints),console.time(\"generate tiles\"),this.stats={},this.total=0),o=function(e,t){var r=t.buffer/t.extent,o=e,n=se(e,1,-1-r,r,0,-1,2,t),i=se(e,1,1-r,2+r,0,-1,2,t);return (n||i)&&(o=se(e,1,-r,1+r,0,-1,2,t)||[],n&&(o=ge(n,1).concat(o)),i&&(o=o.concat(ge(i,-1)))),o}(o,t),o.length&&this.splitTile(o,0,0,0),r&&(o.length&&console.log(\"features: %d, points: %d\",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd(\"generate tiles\"),console.log(\"tiles generated:\",this.total,JSON.stringify(this.stats)));}function Me(e,t,r){return 32*((1<<e)*r+t)+e}function Pe(e,t){const r=e.tileID.canonical;if(!this._geoJSONIndex)return t(null,null);const o=this._geoJSONIndex.getTile(r.z,r.x,r.y);if(!o)return t(null,null);const n=new h(o.features);let i=c(n);0===i.byteOffset&&i.byteLength===i.buffer.byteLength||(i=new Uint8Array(i)),t(null,{vectorTile:n,rawData:i.buffer});}Se.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,debug:0},Se.prototype.splitTile=function(e,t,r,o,n,i,s){for(var a=[e,t,r,o],l=this.options,u=l.debug;a.length;){o=a.pop(),r=a.pop(),t=a.pop(),e=a.pop();var h=1<<t,c=Me(t,r,o),f=this.tiles[c];if(!f&&(u>1&&console.time(\"creation\"),f=this.tiles[c]=ve(e,t,r,o,l),this.tileCoords.push({z:t,x:r,y:o}),u)){u>1&&(console.log(\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\",t,r,o,f.numFeatures,f.numPoints,f.numSimplified),console.timeEnd(\"creation\"));var p=\"z\"+t;this.stats[p]=(this.stats[p]||0)+1,this.total++;}if(f.source=e,n){if(t===l.maxZoom||t===n)continue;var g=1<<n-t;if(r!==Math.floor(i/g)||o!==Math.floor(s/g))continue}else if(t===l.indexMaxZoom||f.numPoints<=l.indexMaxPoints)continue;if(f.source=null,0!==e.length){u>1&&console.time(\"clipping\");var d,m,y,v,x,w,S=.5*l.buffer/l.extent,M=.5-S,P=.5+S,b=1+S;d=m=y=v=null,x=se(e,h,r-S,r+P,0,f.minX,f.maxX,l),w=se(e,h,r+M,r+b,0,f.minX,f.maxX,l),e=null,x&&(d=se(x,h,o-S,o+P,1,f.minY,f.maxY,l),m=se(x,h,o+M,o+b,1,f.minY,f.maxY,l),x=null),w&&(y=se(w,h,o-S,o+P,1,f.minY,f.maxY,l),v=se(w,h,o+M,o+b,1,f.minY,f.maxY,l),w=null),u>1&&console.timeEnd(\"clipping\"),a.push(d||[],t+1,2*r,2*o),a.push(m||[],t+1,2*r,2*o+1),a.push(y||[],t+1,2*r+1,2*o),a.push(v||[],t+1,2*r+1,2*o+1);}}},Se.prototype.getTile=function(e,t,r){var o=this.options,n=o.extent,i=o.debug;if(e<0||e>24)return null;var s=1<<e,a=Me(e,t=(t%s+s)%s,r);if(this.tiles[a])return me(this.tiles[a],n);i>1&&console.log(\"drilling down to z%d-%d-%d\",e,t,r);for(var l,u=e,h=t,c=r;!l&&u>0;)u--,h=Math.floor(h/2),c=Math.floor(c/2),l=this.tiles[Me(u,h,c)];return l&&l.source?(i>1&&console.log(\"found parent tile z%d-%d-%d\",u,h,c),i>1&&console.time(\"drilling down\"),this.splitTile(l.source,u,h,c,e,t,r),i>1&&console.timeEnd(\"drilling down\"),this.tiles[a]?me(this.tiles[a],n):null):null};class be extends e.VectorTileWorkerSource{constructor(e,t,r,o,n){super(e,t,r,o,Pe),n&&(this.loadGeoJSON=n);}loadData(t,r){const o=t&&t.request,n=o&&o.collectResourceTiming;this.loadGeoJSON(t,((s,a)=>{if(s||!a)return r(s);if(\"object\"!=typeof a)return r(new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`));{i(a,!0);try{if(t.filter){const r=e.createExpression(t.filter,{type:\"boolean\",\"property-type\":\"data-driven\",overridable:!1,transition:!1});if(\"error\"===r.result)throw new Error(r.value.map((e=>`${e.key}: ${e.message}`)).join(\", \"));const o=a.features.filter((e=>r.value.evaluate({zoom:0},e)));a={type:\"FeatureCollection\",features:o};}this._geoJSONIndex=t.cluster?new J(function({superclusterOptions:t,clusterProperties:r}){if(!r||!t)return t;const o={},n={},i={accumulated:null,zoom:0},s={properties:null},a=Object.keys(r);for(const t of a){const[i,s]=r[t],a=e.createExpression(s),l=e.createExpression(\"string\"==typeof i?[i,[\"accumulated\"],[\"get\",t]]:i);o[t]=a.value,n[t]=l.value;}return t.map=e=>{s.properties=e;const t={};for(const e of a)t[e]=o[e].evaluate(i,s);return t},t.reduce=(e,t)=>{s.properties=t;for(const t of a)i.accumulated=e[t],e[t]=n[t].evaluate(i,s);},t}(t)).load(a.features):function(e,t){return new Se(e,t)}(a,t.geojsonVtOptions);}catch(s){return r(s)}this.loaded={};const l={};if(n){const r=e.getPerformanceMeasurement(o);r&&(l.resourceTiming={},l.resourceTiming[t.source]=JSON.parse(JSON.stringify(r)));}r(null,l);}}));}reloadTile(e,t){const r=this.loaded;return r&&r[e.uid]?super.reloadTile(e,t):this.loadTile(e,t)}loadGeoJSON(t,r){if(t.request)e.getJSON(t.request,r);else {if(\"string\"!=typeof t.data)return r(new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`));try{return r(null,JSON.parse(t.data))}catch(e){return r(new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`))}}}getClusterExpansionZoom(e,t){try{t(null,this._geoJSONIndex.getClusterExpansionZoom(e.clusterId));}catch(e){t(e);}}getClusterChildren(e,t){try{t(null,this._geoJSONIndex.getChildren(e.clusterId));}catch(e){t(e);}}getClusterLeaves(e,t){try{t(null,this._geoJSONIndex.getLeaves(e.clusterId,e.limit,e.offset));}catch(e){t(e);}}}class ke{constructor(t){this.self=t,this.actor=new e.Actor(t,this),this.layerIndexes={},this.availableImages={},this.isSpriteLoaded={},this.projections={},this.defaultProjection=e.getProjection({name:\"mercator\"}),this.workerSourceTypes={vector:e.VectorTileWorkerSource,geojson:be},this.workerSources={},this.demWorkerSources={},this.self.registerWorkerSource=(e,t)=>{if(this.workerSourceTypes[e])throw new Error(`Worker source with name \"${e}\" already registered.`);this.workerSourceTypes[e]=t;},this.self.registerRTLTextPlugin=t=>{if(e.plugin.isParsed())throw new Error(\"RTL text plugin already registered.\");e.plugin.applyArabicShaping=t.applyArabicShaping,e.plugin.processBidirectionalText=t.processBidirectionalText,e.plugin.processStyledBidirectionalText=t.processStyledBidirectionalText;};}clearCaches(e,t,r){delete this.layerIndexes[e],delete this.availableImages[e],delete this.workerSources[e],delete this.demWorkerSources[e],r();}checkIfReady(e,t,r){r();}setReferrer(e,t){this.referrer=t;}spriteLoaded(t,r){this.isSpriteLoaded[t]=r;for(const o in this.workerSources[t]){const n=this.workerSources[t][o];for(const t in n)n[t]instanceof e.VectorTileWorkerSource&&(n[t].isSpriteLoaded=r,n[t].fire(new e.Event(\"isSpriteLoaded\")));}}setImages(e,t,r){this.availableImages[e]=t;for(const r in this.workerSources[e]){const o=this.workerSources[e][r];for(const e in o)o[e].availableImages=t;}r();}enableTerrain(e,t,r){this.terrain=t,r();}setProjection(t,r){this.projections[t]=e.getProjection(r);}setLayers(e,t,r){this.getLayerIndex(e).replace(t),r();}updateLayers(e,t,r){this.getLayerIndex(e).update(t.layers,t.removedIds),r();}loadTile(t,r,o){const n=this.enableTerrain?e.extend({enableTerrain:this.terrain},r):r;n.projection=this.projections[t]||this.defaultProjection,this.getWorkerSource(t,r.type,r.source).loadTile(n,o);}loadDEMTile(t,r,o){const n=this.enableTerrain?e.extend({buildQuadTree:this.terrain},r):r;this.getDEMWorkerSource(t,r.source).loadTile(n,o);}reloadTile(t,r,o){const n=this.enableTerrain?e.extend({enableTerrain:this.terrain},r):r;n.projection=this.projections[t]||this.defaultProjection,this.getWorkerSource(t,r.type,r.source).reloadTile(n,o);}abortTile(e,t,r){this.getWorkerSource(e,t.type,t.source).abortTile(t,r);}removeTile(e,t,r){this.getWorkerSource(e,t.type,t.source).removeTile(t,r);}removeSource(e,t,r){if(!this.workerSources[e]||!this.workerSources[e][t.type]||!this.workerSources[e][t.type][t.source])return;const o=this.workerSources[e][t.type][t.source];delete this.workerSources[e][t.type][t.source],void 0!==o.removeSource?o.removeSource(t,r):r();}loadWorkerSource(e,t,r){try{this.self.importScripts(t.url),r();}catch(e){r(e.toString());}}syncRTLPluginState(t,r,o){try{e.plugin.setState(r);const t=e.plugin.getPluginURL();if(e.plugin.isLoaded()&&!e.plugin.isParsed()&&null!=t){this.self.importScripts(t);const r=e.plugin.isParsed();o(r?void 0:new Error(`RTL Text Plugin failed to import scripts from ${t}`),r);}}catch(e){o(e.toString());}}getAvailableImages(e){let t=this.availableImages[e];return t||(t=[]),t}getLayerIndex(e){let t=this.layerIndexes[e];return t||(t=this.layerIndexes[e]=new o),t}getWorkerSource(e,t,r){if(this.workerSources[e]||(this.workerSources[e]={}),this.workerSources[e][t]||(this.workerSources[e][t]={}),!this.workerSources[e][t][r]){const o={send:(t,r,o,n,i,s)=>{this.actor.send(t,r,o,e,i,s);},scheduler:this.actor.scheduler};this.workerSources[e][t][r]=new this.workerSourceTypes[t](o,this.getLayerIndex(e),this.getAvailableImages(e),this.isSpriteLoaded[e]);}return this.workerSources[e][t][r]}getDEMWorkerSource(e,t){return this.demWorkerSources[e]||(this.demWorkerSources[e]={}),this.demWorkerSources[e][t]||(this.demWorkerSources[e][t]=new n),this.demWorkerSources[e][t]}enforceCacheSizeLimit(t,r){e.enforceCacheSizeLimit(r);}getWorkerPerformanceMetrics(e,t,r){r(void 0,void 0);}}return \"undefined\"!=typeof WorkerGlobalScope&&\"undefined\"!=typeof self&&self instanceof WorkerGlobalScope&&(self.worker=new ke(self)),ke}));\n\ndefine([\"./shared\"],(function(e){\"use strict\";function t(e,i){if(Array.isArray(e)){if(!Array.isArray(i)||e.length!==i.length)return !1;for(let o=0;o<e.length;o++)if(!t(e[o],i[o]))return !1;return !0}if(\"object\"==typeof e&&null!==e&&null!==i){if(\"object\"!=typeof i)return !1;if(Object.keys(e).length!==Object.keys(i).length)return !1;for(const o in e)if(!t(e[o],i[o]))return !1;return !0}return e===i}var i=o;function o(e){return !function(e){return \"undefined\"==typeof window||\"undefined\"==typeof document?\"not a browser\":Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray?Function.prototype&&Function.prototype.bind?Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions?\"JSON\"in window&&\"parse\"in JSON&&\"stringify\"in JSON?function(){if(!(\"Worker\"in window&&\"Blob\"in window&&\"URL\"in window))return !1;var e,t,i=new Blob([\"\"],{type:\"text/javascript\"}),o=URL.createObjectURL(i);try{t=new Worker(o),e=!0;}catch(t){e=!1;}return t&&t.terminate(),URL.revokeObjectURL(o),e}()?\"Uint8ClampedArray\"in window?ArrayBuffer.isView?function(){var e=document.createElement(\"canvas\");e.width=e.height=1;var t=e.getContext(\"2d\");if(!t)return !1;var i=t.getImageData(0,0,1,1);return i&&i.width===e.width}()?(void 0===r[t=e&&e.failIfMajorPerformanceCaveat]&&(r[t]=function(e){var t,i=function(e){var t=document.createElement(\"canvas\"),i=Object.create(o.webGLContextAttributes);return i.failIfMajorPerformanceCaveat=e,t.getContext(\"webgl\",i)||t.getContext(\"experimental-webgl\",i)}(e);if(!i)return !1;try{t=i.createShader(i.VERTEX_SHADER);}catch(e){return !1}return !(!t||i.isContextLost())&&(i.shaderSource(t,\"void main() {}\"),i.compileShader(t),!0===i.getShaderParameter(t,i.COMPILE_STATUS))}(t)),r[t]?document.documentMode?\"insufficient ECMAScript 6 support\":void 0:\"insufficient WebGL support\"):\"insufficient Canvas/getImageData support\":\"insufficient ArrayBuffer support\":\"insufficient Uint8ClampedArray support\":\"insufficient worker support\":\"insufficient JSON support\":\"insufficient Object support\":\"insufficient Function support\":\"insufficent Array support\";var t;}(e)}var r={};function n(t,i,o){const r=e.window.document.createElement(t);return void 0!==i&&(r.className=i),o&&o.appendChild(r),r}function s(t,i,o){const r=e.window.document.createElementNS(\"http://www.w3.org/2000/svg\",t);for(const e of Object.keys(i))r.setAttributeNS(null,e,i[e]);return o&&o.appendChild(r),r}o.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0};const a=e.window.document&&e.window.document.documentElement.style,l=a&&void 0!==a.userSelect?\"userSelect\":\"WebkitUserSelect\";let c;function h(){a&&l&&(c=a[l],a[l]=\"none\");}function u(){a&&l&&(a[l]=c);}function _(t){t.preventDefault(),t.stopPropagation(),e.window.removeEventListener(\"click\",_,!0);}function d(){e.window.addEventListener(\"click\",_,!0),e.window.setTimeout((()=>{e.window.removeEventListener(\"click\",_,!0);}),0);}function p(e,t){const i=e.getBoundingClientRect();return g(e,i,t)}function m(e,t){const i=e.getBoundingClientRect(),o=[];for(let r=0;r<t.length;r++)o.push(g(e,i,t[r]));return o}function f(t){return void 0!==e.window.InstallTrigger&&2===t.button&&t.ctrlKey&&e.window.navigator.platform.toUpperCase().indexOf(\"MAC\")>=0?0:t.button}function g(t,i,o){const r=t.offsetWidth===i.width?1:t.offsetWidth/i.width;return new e.pointGeometry((o.clientX-i.left)*r,(o.clientY-i.top)*r)}function v(e,t){var i=t[0],o=t[1],r=t[2],n=t[3],s=i*n-r*o;return s?(e[0]=n*(s=1/s),e[1]=-o*s,e[2]=-r*s,e[3]=i*s,e):null}function x(e){const{userImage:t}=e;return !!(t&&t.render&&t.render())&&(e.data.replace(new Uint8Array(t.data.buffer)),!0)}class y extends e.Evented{constructor(){super(),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new e.RGBAImage({width:1,height:1}),this.dirty=!0;}isLoaded(){return this.loaded}setLoaded(e){if(this.loaded!==e&&(this.loaded=e,e)){for(const{ids:e,callback:t}of this.requestors)this._notify(e,t);this.requestors=[];}}hasImage(e){return !!this.getImage(e)}getImage(e){return this.images[e]}addImage(e,t){this._validate(e,t)&&(this.images[e]=t);}_validate(t,i){let o=!0;return this._validateStretch(i.stretchX,i.data&&i.data.width)||(this.fire(new e.ErrorEvent(new Error(`Image \"${t}\" has invalid \"stretchX\" value`))),o=!1),this._validateStretch(i.stretchY,i.data&&i.data.height)||(this.fire(new e.ErrorEvent(new Error(`Image \"${t}\" has invalid \"stretchY\" value`))),o=!1),this._validateContent(i.content,i)||(this.fire(new e.ErrorEvent(new Error(`Image \"${t}\" has invalid \"content\" value`))),o=!1),o}_validateStretch(e,t){if(!e)return !0;let i=0;for(const o of e){if(o[0]<i||o[1]<o[0]||t<o[1])return !1;i=o[1];}return !0}_validateContent(e,t){return !(e&&(4!==e.length||e[0]<0||t.data.width<e[0]||e[1]<0||t.data.height<e[1]||e[2]<0||t.data.width<e[2]||e[3]<0||t.data.height<e[3]||e[2]<e[0]||e[3]<e[1]))}updateImage(e,t){t.version=this.images[e].version+1,this.images[e]=t,this.updatedImages[e]=!0;}removeImage(e){const t=this.images[e];delete this.images[e],delete this.patterns[e],t.userImage&&t.userImage.onRemove&&t.userImage.onRemove();}listImages(){return Object.keys(this.images)}getImages(e,t){let i=!0;if(!this.isLoaded())for(const t of e)this.images[t]||(i=!1);this.isLoaded()||i?this._notify(e,t):this.requestors.push({ids:e,callback:t});}_notify(t,i){const o={};for(const i of t){this.images[i]||this.fire(new e.Event(\"styleimagemissing\",{id:i}));const t=this.images[i];t?o[i]={data:t.data.clone(),pixelRatio:t.pixelRatio,sdf:t.sdf,version:t.version,stretchX:t.stretchX,stretchY:t.stretchY,content:t.content,hasRenderCallback:Boolean(t.userImage&&t.userImage.render)}:e.warnOnce(`Image \"${i}\" could not be loaded. Please make sure you have added the image with map.addImage() or a \"sprite\" property in your style. You can provide missing images by listening for the \"styleimagemissing\" map event.`);}i(null,o);}getPixelSize(){const{width:e,height:t}=this.atlasImage;return {width:e,height:t}}getPattern(t){const i=this.patterns[t],o=this.getImage(t);if(!o)return null;if(i&&i.position.version===o.version)return i.position;if(i)i.position.version=o.version;else {const i={w:o.data.width+2,h:o.data.height+2,x:0,y:0},r=new e.ImagePosition(i,o);this.patterns[t]={bin:i,position:r};}return this._updatePatternAtlas(),this.patterns[t].position}bind(t){const i=t.gl;this.atlasTexture?this.dirty&&(this.atlasTexture.update(this.atlasImage),this.dirty=!1):this.atlasTexture=new e.Texture(t,this.atlasImage,i.RGBA),this.atlasTexture.bind(i.LINEAR,i.CLAMP_TO_EDGE);}_updatePatternAtlas(){const t=[];for(const e in this.patterns)t.push(this.patterns[e].bin);const{w:i,h:o}=e.potpack(t),r=this.atlasImage;r.resize({width:i||1,height:o||1});for(const t in this.patterns){const{bin:i}=this.patterns[t],o=i.x+1,n=i.y+1,s=this.images[t].data,a=s.width,l=s.height;e.RGBAImage.copy(s,r,{x:0,y:0},{x:o,y:n},{width:a,height:l}),e.RGBAImage.copy(s,r,{x:0,y:l-1},{x:o,y:n-1},{width:a,height:1}),e.RGBAImage.copy(s,r,{x:0,y:0},{x:o,y:n+l},{width:a,height:1}),e.RGBAImage.copy(s,r,{x:a-1,y:0},{x:o-1,y:n},{width:1,height:l}),e.RGBAImage.copy(s,r,{x:0,y:0},{x:o+a,y:n},{width:1,height:l});}this.dirty=!0;}beginFrame(){this.callbackDispatchedThisFrame={};}dispatchRenderCallbacks(e){for(const t of e){if(this.callbackDispatchedThisFrame[t])continue;this.callbackDispatchedThisFrame[t]=!0;const e=this.images[t];x(e)&&this.updateImage(t,e);}}}const b=new e.Properties({anchor:new e.DataConstantProperty(e.spec.light.anchor),position:new class{constructor(){this.specification=e.spec.light.position;}possiblyEvaluate(t,i){return function([t,i,o]){const r=e.degToRad(i+90),n=e.degToRad(o);return {x:t*Math.cos(r)*Math.sin(n),y:t*Math.sin(r)*Math.sin(n),z:t*Math.cos(n),azimuthal:i,polar:o}}(t.expression.evaluate(i))}interpolate(t,i,o){return {x:e.number(t.x,i.x,o),y:e.number(t.y,i.y,o),z:e.number(t.z,i.z,o),azimuthal:e.number(t.azimuthal,i.azimuthal,o),polar:e.number(t.polar,i.polar,o)}}},color:new e.DataConstantProperty(e.spec.light.color),intensity:new e.DataConstantProperty(e.spec.light.intensity)}),w=\"-transition\";class T extends e.Evented{constructor(t){super(),this._transitionable=new e.Transitionable(b),this.setLight(t),this._transitioning=this._transitionable.untransitioned();}getLight(){return this._transitionable.serialize()}setLight(t,i={}){if(!this._validate(e.validateLight,t,i))for(const i in t){const o=t[i];e.endsWith(i,w)?this._transitionable.setTransition(i.slice(0,-w.length),o):this._transitionable.setValue(i,o);}}updateTransitions(e){this._transitioning=this._transitionable.transitioned(e,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(e){this.properties=this._transitioning.possiblyEvaluate(e);}_validate(t,i,o){return (!o||!1!==o.validate)&&e.emitValidationErrors(this,t.call(e.validateStyle,e.extend({value:i,style:{glyphs:!0,sprite:!0},styleSpec:e.spec})))}}const E=new e.Properties({source:new e.DataConstantProperty(e.spec.terrain.source),exaggeration:new e.DataConstantProperty(e.spec.terrain.exaggeration)}),C=\"-transition\";class M extends e.Evented{constructor(t,i){super(),this._transitionable=new e.Transitionable(E),this.set(t),this._transitioning=this._transitionable.untransitioned(),this.drapeRenderMode=i;}get(){return this._transitionable.serialize()}set(t){for(const i in t){const o=t[i];e.endsWith(i,C)?this._transitionable.setTransition(i.slice(0,-C.length),o):this._transitionable.setValue(i,o);}}updateTransitions(e){this._transitioning=this._transitionable.transitioned(e,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(e){this.properties=this._transitioning.possiblyEvaluate(e);}}function I(t,i,o,r){const n=e.smoothstep(45,65,o),[s,a]=S(t,r),l=e.length(i);let c=1-Math.min(1,Math.exp((l-s)/(a-s)*-6));return c*=c*c,c=Math.min(1,1.00747*c),c*n*t.alpha}function S(e,t){const i=.5/Math.tan(.5*t);return [e.range[0]+i,e.range[1]+i]}const D=new e.Properties({range:new e.DataConstantProperty(e.spec.fog.range),color:new e.DataConstantProperty(e.spec.fog.color),\"high-color\":new e.DataConstantProperty(e.spec.fog[\"high-color\"]),\"space-color\":new e.DataConstantProperty(e.spec.fog[\"space-color\"]),\"horizon-blend\":new e.DataConstantProperty(e.spec.fog[\"horizon-blend\"]),\"star-intensity\":new e.DataConstantProperty(e.spec.fog[\"star-intensity\"])}),L=\"-transition\";class A extends e.Evented{constructor(t,i){super(),this._transitionable=new e.Transitionable(D),this.set(t),this._transitioning=this._transitionable.untransitioned(),this._transform=i;}get state(){const t=this._transform,i=\"globe\"===t.projection.name,o=e.globeToMercatorTransition(t.zoom),r=this.properties.get(\"range\"),n=[.5,3];return {range:i?[e.number(n[0],r[0],o),e.number(n[1],r[1],o)]:r,horizonBlend:this.properties.get(\"horizon-blend\"),alpha:this.properties.get(\"color\").a}}get(){return this._transitionable.serialize()}set(t,i={}){if(!this._validate(e.validateFog,t,i)){for(const i of Object.keys(e.spec.fog))t&&void 0===t[i]&&(t[i]=e.spec.fog[i].default);for(const i in t){const o=t[i];e.endsWith(i,L)?this._transitionable.setTransition(i.slice(0,-L.length),o):this._transitionable.setValue(i,o);}}}getOpacity(t){if(!this._transform.projection.supportsFog)return 0;const i=this.properties&&this.properties.get(\"color\")||1;return (\"globe\"===this._transform.projection.name?1:e.smoothstep(45,65,t))*i.a}getOpacityAtLatLng(t,i){return this._transform.projection.supportsFog?function(t,i,o){const r=e.MercatorCoordinate.fromLngLat(i),n=o.elevation?o.elevation.getAtPointOrZero(r):0,s=[r.x,r.y,n];return e.transformMat4(s,s,o.mercatorFogMatrix),I(t,s,o.pitch,o._fov)}(this.state,t,i):0}getFovAdjustedRange(e){return this._transform.projection.supportsFog?S(this.state,e):[0,1]}updateTransitions(e){this._transitioning=this._transitionable.transitioned(e,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(e){this.properties=this._transitioning.possiblyEvaluate(e);}_validate(t,i,o){return (!o||!1!==o.validate)&&e.emitValidationErrors(this,t.call(e.validateStyle,e.extend({value:i,style:{glyphs:!0,sprite:!0},styleSpec:e.spec})))}}class z{constructor(t,i){this.workerPool=t,this.actors=[],this.currentActor=0,this.id=e.uniqueId();const o=this.workerPool.acquire(this.id);for(let e=0;e<o.length;e++){const t=new z.Actor(o[e],i,this.id);t.name=`Worker ${e}`,this.actors.push(t);}this.ready=!1,this.broadcast(\"checkIfReady\",null,(()=>{this.ready=!0;}));}broadcast(t,i,o){e.asyncAll(this.actors,((e,o)=>{e.send(t,i,o);}),o=o||function(){});}getActor(){return this.currentActor=(this.currentActor+1)%this.actors.length,this.actors[this.currentActor]}remove(){this.actors.forEach((e=>{e.remove();})),this.actors=[],this.workerPool.release(this.id);}}function P(t,i,o){return i*(e.EXTENT/(t.tileSize*Math.pow(2,o-t.tileID.overscaledZ)))}z.Actor=e.Actor;class R{constructor(e,t,i,o){this.screenBounds=e,this.cameraPoint=t,this._screenRaycastCache={},this._cameraRaycastCache={},this.isAboveHorizon=i,this.screenGeometry=this.bufferedScreenGeometry(0),this.screenGeometryMercator=this._bufferedScreenMercator(0,o);}static createFromScreenPoints(t,i){let o,r;if(t instanceof e.pointGeometry||\"number\"==typeof t[0]){const n=e.pointGeometry.convert(t);o=[n],r=i.isPointAboveHorizon(n);}else {const n=e.pointGeometry.convert(t[0]),s=e.pointGeometry.convert(t[1]);o=[n,s],r=e.polygonizeBounds(n,s).every((e=>i.isPointAboveHorizon(e)));}return new R(o,i.getCameraPoint(),r,i)}isPointQuery(){return 1===this.screenBounds.length}bufferedScreenGeometry(t){return e.polygonizeBounds(this.screenBounds[0],1===this.screenBounds.length?this.screenBounds[0]:this.screenBounds[1],t)}bufferedCameraGeometry(t){const i=this.screenBounds[0],o=1===this.screenBounds.length?this.screenBounds[0].add(new e.pointGeometry(1,1)):this.screenBounds[1],r=e.polygonizeBounds(i,o,0,!1);return this.cameraPoint.y>o.y&&(this.cameraPoint.x>i.x&&this.cameraPoint.x<o.x?r.splice(3,0,this.cameraPoint):this.cameraPoint.x>=o.x?r[2]=this.cameraPoint:this.cameraPoint.x<=i.x&&(r[3]=this.cameraPoint)),e.bufferConvexPolygon(r,t)}bufferedCameraGeometryGlobe(t){const i=this.screenBounds[0],o=1===this.screenBounds.length?this.screenBounds[0].add(new e.pointGeometry(1,1)):this.screenBounds[1],r=e.polygonizeBounds(i,o,t),n=this.cameraPoint.clone();switch(3*((n.y>i.y)+(n.y>o.y))+((n.x>i.x)+(n.x>o.x))){case 0:r[0]=n,r[4]=n.clone();break;case 1:r.splice(1,0,n);break;case 2:r[1]=n;break;case 3:r.splice(4,0,n);break;case 5:r.splice(2,0,n);break;case 6:r[3]=n;break;case 7:r.splice(3,0,n);break;case 8:r[2]=n;}return r}containsTile(t,i,o,r=0){const n=t.queryPadding/i._pixelsPerMercatorPixel+1,s=o?this._bufferedCameraMercator(n,i):this._bufferedScreenMercator(n,i);let a=t.tileID.wrap+(s.unwrapped?r:0);const l=s.polygon.map((i=>e.getTilePoint(t.tileTransform,i,a)));if(!e.polygonIntersectsBox(l,0,0,e.EXTENT,e.EXTENT))return;a=t.tileID.wrap+(this.screenGeometryMercator.unwrapped?r:0);const c=this.screenGeometryMercator.polygon.map((i=>e.getTileVec3(t.tileTransform,i,a))),h=c.map((t=>new e.pointGeometry(t[0],t[1]))),u=i.getFreeCameraOptions().position||new e.MercatorCoordinate(0,0,0),_=e.getTileVec3(t.tileTransform,u,a),d=c.map((t=>{const i=e.sub(t,t,_);return e.normalize(i,i),new e.Ray(_,i)})),p=P(t,1,i.zoom)*i._pixelsPerMercatorPixel;return {queryGeometry:this,tilespaceGeometry:h,tilespaceRays:d,bufferedTilespaceGeometry:l,bufferedTilespaceBounds:(m=e.getBounds(l),m.min.x=e.clamp(m.min.x,0,e.EXTENT),m.min.y=e.clamp(m.min.y,0,e.EXTENT),m.max.x=e.clamp(m.max.x,0,e.EXTENT),m.max.y=e.clamp(m.max.y,0,e.EXTENT),m),tile:t,tileID:t.tileID,pixelToTileUnitsFactor:p};var m;}_bufferedScreenMercator(e,t){const i=k(e);if(this._screenRaycastCache[i])return this._screenRaycastCache[i];{let o;return o=\"globe\"===t.projection.name?this._projectAndResample(this.bufferedScreenGeometry(e),t):{polygon:this.bufferedScreenGeometry(e).map((e=>t.pointCoordinate3D(e))),unwrapped:!0},this._screenRaycastCache[i]=o,o}}_bufferedCameraMercator(e,t){const i=k(e);if(this._cameraRaycastCache[i])return this._cameraRaycastCache[i];{let o;return o=\"globe\"===t.projection.name?this._projectAndResample(this.bufferedCameraGeometryGlobe(e),t):{polygon:this.bufferedCameraGeometry(e).map((e=>t.pointCoordinate3D(e))),unwrapped:!0},this._cameraRaycastCache[i]=o,o}}_projectAndResample(t,i){const o=function(t,i){const o=e.multiply([],i.pixelMatrix,i.globeMatrix),r=[0,-e.GLOBE_RADIUS,0,1],n=[0,e.GLOBE_RADIUS,0,1],s=[0,0,0,1];e.transformMat4$1(r,r,o),e.transformMat4$1(n,n,o),e.transformMat4$1(s,s,o);const a=new e.pointGeometry(r[0]/r[3],r[1]/r[3]),l=new e.pointGeometry(n[0]/n[3],n[1]/n[3]),c=e.polygonContainsPoint(t,a)&&r[3]<s[3],h=e.polygonContainsPoint(t,l)&&n[3]<s[3];if(!c&&!h)return null;const u=function(e,t,i){for(let o=1;o<e.length;o++){const r=B(t.pointCoordinate3D(e[o-1]).x),n=B(t.pointCoordinate3D(e[o]).x);if(i<0){if(r<n)return {idx:o,t:-r/(n-1-r)}}else if(n<r)return {idx:o,t:(1-r)/(n+1-r)}}return null}(t,i,c?-1:1);if(!u)return null;const{idx:_,t:d}=u;let p=_>1?O(t.slice(0,_),i):[],m=_<t.length?O(t.slice(_),i):[];p=p.map((t=>new e.pointGeometry(B(t.x),t.y))),m=m.map((t=>new e.pointGeometry(B(t.x),t.y)));const f=[...p];0===f.length&&f.push(m[m.length-1]);const g=e.number(f[f.length-1].y,(0===m.length?p[0]:m[0]).y,d);let v;return v=c?[new e.pointGeometry(0,g),new e.pointGeometry(0,0),new e.pointGeometry(1,0),new e.pointGeometry(1,g)]:[new e.pointGeometry(1,g),new e.pointGeometry(1,1),new e.pointGeometry(0,1),new e.pointGeometry(0,g)],f.push(...v),0===m.length?f.push(p[0]):f.push(...m),{polygon:f.map((t=>new e.MercatorCoordinate(t.x,t.y))),unwrapped:!1}}(t,i);if(o)return o;const r=function(t,i){let o=!1,r=-1/0,n=0;for(let e=0;e<t.length-1;e++)t[e].x>r&&(r=t[e].x,n=e);for(let e=0;e<t.length-1;e++){const i=(n+e)%(t.length-1),r=t[i],s=t[i+1];Math.abs(r.x-s.x)>.5&&(r.x<s.x?(r.x+=1,0===i&&(t[t.length-1].x+=1)):(s.x+=1,i+1===t.length-1&&(t[0].x+=1)),o=!0);}const s=e.mercatorXfromLng(i.center.lng);return o&&s<Math.abs(s-1)&&t.forEach((e=>{e.x-=1;})),{polygon:t,unwrapped:o}}(O(t,i).map((t=>new e.pointGeometry(B(t.x),t.y))),i);return {polygon:r.polygon.map((t=>new e.MercatorCoordinate(t.x,t.y))),unwrapped:r.unwrapped}}}function O(t,i){return e.resample(t,(e=>{const t=i.pointCoordinate3D(e);e.x=t.x,e.y=t.y;}),1/256)}function B(e){return e<0?1+e%1:e%1}function k(e){return 100*e|0}function F(t,i,o,r,n){const s=function(o,r){if(o)return n(o);if(r){t.url&&r.tiles&&t.tiles&&delete t.tiles;const o=e.pick(e.extend(r,t),[\"tiles\",\"minzoom\",\"maxzoom\",\"attribution\",\"mapbox_logo\",\"bounds\",\"scheme\",\"tileSize\",\"encoding\"]);r.vector_layers&&(o.vectorLayers=r.vector_layers,o.vectorLayerIds=o.vectorLayers.map((e=>e.id))),o.tiles=i.canonicalizeTileset(o,t.url),n(null,o);}};return t.url?e.getJSON(i.transformRequest(i.normalizeSourceURL(t.url,null,o,r),e.ResourceType.Source),s):e.exported.frame((()=>s(null,t)))}class U{constructor(t,i,o){this.bounds=e.LngLatBounds.convert(this.validateBounds(t)),this.minzoom=i||0,this.maxzoom=o||24;}validateBounds(e){return Array.isArray(e)&&4===e.length?[Math.max(-180,e[0]),Math.max(-90,e[1]),Math.min(180,e[2]),Math.min(90,e[3])]:[-180,-90,180,90]}contains(t){const i=Math.pow(2,t.z),o=Math.floor(e.mercatorXfromLng(this.bounds.getWest())*i),r=Math.floor(e.mercatorYfromLat(this.bounds.getNorth())*i),n=Math.ceil(e.mercatorXfromLng(this.bounds.getEast())*i),s=Math.ceil(e.mercatorYfromLat(this.bounds.getSouth())*i);return t.x>=o&&t.x<n&&t.y>=r&&t.y<s}}class N{constructor(e,t,i){this.context=e;const o=e.gl;this.buffer=o.createBuffer(),this.dynamicDraw=Boolean(i),this.context.unbindVAO(),e.bindElementBuffer.set(this.buffer),o.bufferData(o.ELEMENT_ARRAY_BUFFER,t.arrayBuffer,this.dynamicDraw?o.DYNAMIC_DRAW:o.STATIC_DRAW),this.dynamicDraw||t.destroy();}bind(){this.context.bindElementBuffer.set(this.buffer);}updateData(e){const t=this.context.gl;this.context.unbindVAO(),this.bind(),t.bufferSubData(t.ELEMENT_ARRAY_BUFFER,0,e.arrayBuffer);}destroy(){this.buffer&&(this.context.gl.deleteBuffer(this.buffer),delete this.buffer);}}const G={Int8:\"BYTE\",Uint8:\"UNSIGNED_BYTE\",Int16:\"SHORT\",Uint16:\"UNSIGNED_SHORT\",Int32:\"INT\",Uint32:\"UNSIGNED_INT\",Float32:\"FLOAT\"};class j{constructor(e,t,i,o){this.length=t.length,this.attributes=i,this.itemSize=t.bytesPerElement,this.dynamicDraw=o,this.context=e;const r=e.gl;this.buffer=r.createBuffer(),e.bindVertexBuffer.set(this.buffer),r.bufferData(r.ARRAY_BUFFER,t.arrayBuffer,this.dynamicDraw?r.DYNAMIC_DRAW:r.STATIC_DRAW),this.dynamicDraw||t.destroy();}bind(){this.context.bindVertexBuffer.set(this.buffer);}updateData(e){const t=this.context.gl;this.bind(),t.bufferSubData(t.ARRAY_BUFFER,0,e.arrayBuffer);}enableAttributes(e,t){for(let i=0;i<this.attributes.length;i++){const o=t.attributes[this.attributes[i].name];void 0!==o&&e.enableVertexAttribArray(o);}}setVertexAttribPointers(e,t,i){for(let o=0;o<this.attributes.length;o++){const r=this.attributes[o],n=t.attributes[r.name];void 0!==n&&e.vertexAttribPointer(n,r.components,e[G[r.type]],!1,this.itemSize,r.offset+this.itemSize*(i||0));}}destroy(){this.buffer&&(this.context.gl.deleteBuffer(this.buffer),delete this.buffer);}}class Z{constructor(e){this.gl=e.gl,this.default=this.getDefault(),this.current=this.default,this.dirty=!1;}get(){return this.current}set(e){}getDefault(){return this.default}setDefault(){this.set(this.default);}}class V extends Z{getDefault(){return e.Color.transparent}set(e){const t=this.current;(e.r!==t.r||e.g!==t.g||e.b!==t.b||e.a!==t.a||this.dirty)&&(this.gl.clearColor(e.r,e.g,e.b,e.a),this.current=e,this.dirty=!1);}}class W extends Z{getDefault(){return 1}set(e){(e!==this.current||this.dirty)&&(this.gl.clearDepth(e),this.current=e,this.dirty=!1);}}class X extends Z{getDefault(){return 0}set(e){(e!==this.current||this.dirty)&&(this.gl.clearStencil(e),this.current=e,this.dirty=!1);}}class q extends Z{getDefault(){return [!0,!0,!0,!0]}set(e){const t=this.current;(e[0]!==t[0]||e[1]!==t[1]||e[2]!==t[2]||e[3]!==t[3]||this.dirty)&&(this.gl.colorMask(e[0],e[1],e[2],e[3]),this.current=e,this.dirty=!1);}}class $ extends Z{getDefault(){return !0}set(e){(e!==this.current||this.dirty)&&(this.gl.depthMask(e),this.current=e,this.dirty=!1);}}class H extends Z{getDefault(){return 255}set(e){(e!==this.current||this.dirty)&&(this.gl.stencilMask(e),this.current=e,this.dirty=!1);}}class Y extends Z{getDefault(){return {func:this.gl.ALWAYS,ref:0,mask:255}}set(e){const t=this.current;(e.func!==t.func||e.ref!==t.ref||e.mask!==t.mask||this.dirty)&&(this.gl.stencilFunc(e.func,e.ref,e.mask),this.current=e,this.dirty=!1);}}class K extends Z{getDefault(){const e=this.gl;return [e.KEEP,e.KEEP,e.KEEP]}set(e){const t=this.current;(e[0]!==t[0]||e[1]!==t[1]||e[2]!==t[2]||this.dirty)&&(this.gl.stencilOp(e[0],e[1],e[2]),this.current=e,this.dirty=!1);}}class J extends Z{getDefault(){return !1}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;e?t.enable(t.STENCIL_TEST):t.disable(t.STENCIL_TEST),this.current=e,this.dirty=!1;}}class Q extends Z{getDefault(){return [0,1]}set(e){const t=this.current;(e[0]!==t[0]||e[1]!==t[1]||this.dirty)&&(this.gl.depthRange(e[0],e[1]),this.current=e,this.dirty=!1);}}class ee extends Z{getDefault(){return !1}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;e?t.enable(t.DEPTH_TEST):t.disable(t.DEPTH_TEST),this.current=e,this.dirty=!1;}}class te extends Z{getDefault(){return this.gl.LESS}set(e){(e!==this.current||this.dirty)&&(this.gl.depthFunc(e),this.current=e,this.dirty=!1);}}class ie extends Z{getDefault(){return !1}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;e?t.enable(t.BLEND):t.disable(t.BLEND),this.current=e,this.dirty=!1;}}class oe extends Z{getDefault(){const e=this.gl;return [e.ONE,e.ZERO]}set(e){const t=this.current;(e[0]!==t[0]||e[1]!==t[1]||this.dirty)&&(this.gl.blendFunc(e[0],e[1]),this.current=e,this.dirty=!1);}}class re extends Z{getDefault(){return e.Color.transparent}set(e){const t=this.current;(e.r!==t.r||e.g!==t.g||e.b!==t.b||e.a!==t.a||this.dirty)&&(this.gl.blendColor(e.r,e.g,e.b,e.a),this.current=e,this.dirty=!1);}}class ne extends Z{getDefault(){return this.gl.FUNC_ADD}set(e){(e!==this.current||this.dirty)&&(this.gl.blendEquation(e),this.current=e,this.dirty=!1);}}class se extends Z{getDefault(){return !1}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;e?t.enable(t.CULL_FACE):t.disable(t.CULL_FACE),this.current=e,this.dirty=!1;}}class ae extends Z{getDefault(){return this.gl.BACK}set(e){(e!==this.current||this.dirty)&&(this.gl.cullFace(e),this.current=e,this.dirty=!1);}}class le extends Z{getDefault(){return this.gl.CCW}set(e){(e!==this.current||this.dirty)&&(this.gl.frontFace(e),this.current=e,this.dirty=!1);}}class ce extends Z{getDefault(){return null}set(e){(e!==this.current||this.dirty)&&(this.gl.useProgram(e),this.current=e,this.dirty=!1);}}class he extends Z{getDefault(){return this.gl.TEXTURE0}set(e){(e!==this.current||this.dirty)&&(this.gl.activeTexture(e),this.current=e,this.dirty=!1);}}class ue extends Z{getDefault(){const e=this.gl;return [0,0,e.drawingBufferWidth,e.drawingBufferHeight]}set(e){const t=this.current;(e[0]!==t[0]||e[1]!==t[1]||e[2]!==t[2]||e[3]!==t[3]||this.dirty)&&(this.gl.viewport(e[0],e[1],e[2],e[3]),this.current=e,this.dirty=!1);}}class _e extends Z{getDefault(){return null}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,e),this.current=e,this.dirty=!1;}}class de extends Z{getDefault(){return null}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.bindRenderbuffer(t.RENDERBUFFER,e),this.current=e,this.dirty=!1;}}class pe extends Z{getDefault(){return null}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.bindTexture(t.TEXTURE_2D,e),this.current=e,this.dirty=!1;}}class me extends Z{getDefault(){return null}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.bindBuffer(t.ARRAY_BUFFER,e),this.current=e,this.dirty=!1;}}class fe extends Z{getDefault(){return null}set(e){const t=this.gl;t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,e),this.current=e,this.dirty=!1;}}class ge extends Z{constructor(e){super(e),this.vao=e.extVertexArrayObject;}getDefault(){return null}set(e){this.vao&&(e!==this.current||this.dirty)&&(this.vao.bindVertexArrayOES(e),this.current=e,this.dirty=!1);}}class ve extends Z{getDefault(){return 4}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.pixelStorei(t.UNPACK_ALIGNMENT,e),this.current=e,this.dirty=!1;}}class xe extends Z{getDefault(){return !1}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,e),this.current=e,this.dirty=!1;}}class ye extends Z{getDefault(){return !1}set(e){if(e===this.current&&!this.dirty)return;const t=this.gl;t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,e),this.current=e,this.dirty=!1;}}class be extends Z{constructor(e,t){super(e),this.context=e,this.parent=t;}getDefault(){return null}}class we extends be{setDirty(){this.dirty=!0;}set(e){if(e===this.current&&!this.dirty)return;this.context.bindFramebuffer.set(this.parent);const t=this.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,e,0),this.current=e,this.dirty=!1;}}class Te extends be{attachment(){return this.gl.DEPTH_ATTACHMENT}set(e){if(e===this.current&&!this.dirty)return;this.context.bindFramebuffer.set(this.parent);const t=this.gl;t.framebufferRenderbuffer(t.FRAMEBUFFER,this.attachment(),t.RENDERBUFFER,e),this.current=e,this.dirty=!1;}}class Ee extends Te{attachment(){return this.gl.DEPTH_STENCIL_ATTACHMENT}}class Ce{constructor(e,t,i,o){this.context=e,this.width=t,this.height=i;const r=this.framebuffer=e.gl.createFramebuffer();this.colorAttachment=new we(e,r),o&&(this.depthAttachment=new Te(e,r));}destroy(){const e=this.context.gl,t=this.colorAttachment.get();if(t&&e.deleteTexture(t),this.depthAttachment){const t=this.depthAttachment.get();t&&e.deleteRenderbuffer(t);}e.deleteFramebuffer(this.framebuffer);}}class Me{constructor(e,t=!1){if(this.gl=e,this.isWebGL2=t,this.extVertexArrayObject=this.gl.getExtension(\"OES_vertex_array_object\"),t){const t=e;this.extVertexArrayObject={createVertexArrayOES:t.createVertexArray.bind(e),deleteVertexArrayOES:t.deleteVertexArray.bind(e),bindVertexArrayOES:t.bindVertexArray.bind(e)};}this.clearColor=new V(this),this.clearDepth=new W(this),this.clearStencil=new X(this),this.colorMask=new q(this),this.depthMask=new $(this),this.stencilMask=new H(this),this.stencilFunc=new Y(this),this.stencilOp=new K(this),this.stencilTest=new J(this),this.depthRange=new Q(this),this.depthTest=new ee(this),this.depthFunc=new te(this),this.blend=new ie(this),this.blendFunc=new oe(this),this.blendColor=new re(this),this.blendEquation=new ne(this),this.cullFace=new se(this),this.cullFaceSide=new ae(this),this.frontFace=new le(this),this.program=new ce(this),this.activeTexture=new he(this),this.viewport=new ue(this),this.bindFramebuffer=new _e(this),this.bindRenderbuffer=new de(this),this.bindTexture=new pe(this),this.bindVertexBuffer=new me(this),this.bindElementBuffer=new fe(this),this.bindVertexArrayOES=this.extVertexArrayObject&&new ge(this),this.pixelStoreUnpack=new ve(this),this.pixelStoreUnpackPremultiplyAlpha=new xe(this),this.pixelStoreUnpackFlipY=new ye(this),this.extTextureFilterAnisotropic=e.getExtension(\"EXT_texture_filter_anisotropic\")||e.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||e.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\"),this.extTextureFilterAnisotropic&&(this.extTextureFilterAnisotropicMax=e.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)),this.extTextureFilterAnisotropicForceOff=!1,this.extStandardDerivativesForceOff=!1,this.extDebugRendererInfo=e.getExtension(\"WEBGL_debug_renderer_info\"),this.extDebugRendererInfo&&(this.renderer=e.getParameter(this.extDebugRendererInfo.UNMASKED_RENDERER_WEBGL),this.vendor=e.getParameter(this.extDebugRendererInfo.UNMASKED_VENDOR_WEBGL)),t||(this.extTextureHalfFloat=e.getExtension(\"OES_texture_half_float\")),(t||this.extTextureHalfFloat&&e.getExtension(\"OES_texture_half_float_linear\"))&&(this.extRenderToTextureHalfFloat=e.getExtension(\"EXT_color_buffer_half_float\")),this.extStandardDerivatives=t||e.getExtension(\"OES_standard_derivatives\"),this.extTimerQuery=e.getExtension(\"EXT_disjoint_timer_query\"),this.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE);}setDefault(){this.unbindVAO(),this.clearColor.setDefault(),this.clearDepth.setDefault(),this.clearStencil.setDefault(),this.colorMask.setDefault(),this.depthMask.setDefault(),this.stencilMask.setDefault(),this.stencilFunc.setDefault(),this.stencilOp.setDefault(),this.stencilTest.setDefault(),this.depthRange.setDefault(),this.depthTest.setDefault(),this.depthFunc.setDefault(),this.blend.setDefault(),this.blendFunc.setDefault(),this.blendColor.setDefault(),this.blendEquation.setDefault(),this.cullFace.setDefault(),this.cullFaceSide.setDefault(),this.frontFace.setDefault(),this.program.setDefault(),this.activeTexture.setDefault(),this.bindFramebuffer.setDefault(),this.pixelStoreUnpack.setDefault(),this.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.pixelStoreUnpackFlipY.setDefault();}setDirty(){this.clearColor.dirty=!0,this.clearDepth.dirty=!0,this.clearStencil.dirty=!0,this.colorMask.dirty=!0,this.depthMask.dirty=!0,this.stencilMask.dirty=!0,this.stencilFunc.dirty=!0,this.stencilOp.dirty=!0,this.stencilTest.dirty=!0,this.depthRange.dirty=!0,this.depthTest.dirty=!0,this.depthFunc.dirty=!0,this.blend.dirty=!0,this.blendFunc.dirty=!0,this.blendColor.dirty=!0,this.blendEquation.dirty=!0,this.cullFace.dirty=!0,this.cullFaceSide.dirty=!0,this.frontFace.dirty=!0,this.program.dirty=!0,this.activeTexture.dirty=!0,this.viewport.dirty=!0,this.bindFramebuffer.dirty=!0,this.bindRenderbuffer.dirty=!0,this.bindTexture.dirty=!0,this.bindVertexBuffer.dirty=!0,this.bindElementBuffer.dirty=!0,this.extVertexArrayObject&&(this.bindVertexArrayOES.dirty=!0),this.pixelStoreUnpack.dirty=!0,this.pixelStoreUnpackPremultiplyAlpha.dirty=!0,this.pixelStoreUnpackFlipY.dirty=!0;}createIndexBuffer(e,t){return new N(this,e,t)}createVertexBuffer(e,t,i){return new j(this,e,t,i)}createRenderbuffer(e,t,i){const o=this.gl,r=o.createRenderbuffer();return this.bindRenderbuffer.set(r),o.renderbufferStorage(o.RENDERBUFFER,e,t,i),this.bindRenderbuffer.set(null),r}createFramebuffer(e,t,i){return new Ce(this,e,t,i)}clear({color:e,depth:t,stencil:i}){const o=this.gl;let r=0;e&&(r|=o.COLOR_BUFFER_BIT,this.clearColor.set(e),this.colorMask.set([!0,!0,!0,!0])),void 0!==t&&(r|=o.DEPTH_BUFFER_BIT,this.depthRange.set([0,1]),this.clearDepth.set(t),this.depthMask.set(!0)),void 0!==i&&(r|=o.STENCIL_BUFFER_BIT,this.clearStencil.set(i),this.stencilMask.set(255)),o.clear(r);}setCullFace(e){!1===e.enable?this.cullFace.set(!1):(this.cullFace.set(!0),this.cullFaceSide.set(e.mode),this.frontFace.set(e.frontFace));}setDepthMode(e){e.func!==this.gl.ALWAYS||e.mask?(this.depthTest.set(!0),this.depthFunc.set(e.func),this.depthMask.set(e.mask),this.depthRange.set(e.range)):this.depthTest.set(!1);}setStencilMode(e){e.test.func!==this.gl.ALWAYS||e.mask?(this.stencilTest.set(!0),this.stencilMask.set(e.mask),this.stencilOp.set([e.fail,e.depthFail,e.pass]),this.stencilFunc.set({func:e.test.func,ref:e.ref,mask:e.test.mask})):this.stencilTest.set(!1);}setColorMode(i){t(i.blendFunction,e.ColorMode.Replace)?this.blend.set(!1):(this.blend.set(!0),this.blendFunc.set(i.blendFunction),this.blendColor.set(i.blendColor)),this.colorMask.set(i.mask);}unbindVAO(){this.extVertexArrayObject&&this.bindVertexArrayOES.set(null);}}class Ie extends e.Evented{constructor(t,i,o,r){if(super(),this.id=t,this.dispatcher=o,this.type=\"vector\",this.minzoom=0,this.maxzoom=22,this.scheme=\"xyz\",this.tileSize=512,this.reparseOverscaled=!0,this.isTileClipped=!0,this._loaded=!1,e.extend(this,e.pick(i,[\"url\",\"scheme\",\"tileSize\",\"promoteId\"])),this._options=e.extend({type:\"vector\"},i),this._collectResourceTiming=i.collectResourceTiming,512!==this.tileSize)throw new Error(\"vector tile sources must have a tileSize of 512\");this.setEventedParent(r),this._tileWorkers={},this._deduped=new e.DedupedRequest;}load(t){this._loaded=!1,this.fire(new e.Event(\"dataloading\",{dataType:\"source\"}));const i=Array.isArray(this.map._language)?this.map._language.join():this.map._language,o=this.map._worldview;this._tileJSONRequest=F(this._options,this.map._requestManager,i,o,((r,n)=>{this._tileJSONRequest=null,this._loaded=!0,r?(i&&console.warn(`Ensure that your requested language string is a valid BCP-47 code or list of codes. Found: ${i}`),o&&2!==o.length&&console.warn(`Requested worldview strings must be a valid ISO alpha-2 code. Found: ${o}`),this.fire(new e.ErrorEvent(r))):n&&(e.extend(this,n),n.bounds&&(this.tileBounds=new U(n.bounds,this.minzoom,this.maxzoom)),e.postTurnstileEvent(n.tiles,this.map._requestManager._customAccessToken),this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})),this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"content\"}))),t&&t(r);}));}loaded(){return this._loaded}hasTile(e){return !this.tileBounds||this.tileBounds.contains(e.canonical)}onAdd(e){this.map=e,this.load();}reload(){this.cancelTileJSONRequest(),this.load((()=>this.map.style._clearSource(this.id)));}setTiles(e){return this._options.tiles=e,this.reload(),this}setUrl(e){return this.url=e,this._options.url=e,this.reload(),this}onRemove(){this.cancelTileJSONRequest();}serialize(){return e.extend({},this._options)}loadTile(t,i){const o=this.map._requestManager.normalizeTileURL(t.tileID.canonical.url(this.tiles,this.scheme)),r={request:this.map._requestManager.transformRequest(o,e.ResourceType.Tile),data:void 0,uid:t.uid,tileID:t.tileID,tileZoom:t.tileZoom,zoom:t.tileID.overscaledZ,tileSize:this.tileSize*t.tileID.overscaleFactor(),type:this.type,source:this.id,pixelRatio:e.exported.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId,isSymbolTile:t.isSymbolTile};if(r.request.collectResourceTiming=this._collectResourceTiming,t.actor&&\"expired\"!==t.state)\"loading\"===t.state?t.reloadCallback=i:t.request=t.actor.send(\"reloadTile\",r,n.bind(this));else if(t.actor=this._tileWorkers[o]=this._tileWorkers[o]||this.dispatcher.getActor(),this.dispatcher.ready)t.request=t.actor.send(\"loadTile\",r,n.bind(this),void 0,!0);else {const i=e.loadVectorTile.call({deduped:this._deduped},r,((e,i)=>{e||!i?n.call(this,e):(r.data={cacheControl:i.cacheControl,expires:i.expires,rawData:i.rawData.slice(0)},t.actor&&t.actor.send(\"loadTile\",r,n.bind(this),void 0,!0));}),!0);t.request={cancel:i};}function n(o,r){return delete t.request,t.aborted?i(null):o&&404!==o.status?i(o):(r&&r.resourceTiming&&(t.resourceTiming=r.resourceTiming),this.map._refreshExpiredTiles&&r&&t.setExpiryData(r),t.loadVectorData(r,this.map.painter),e.cacheEntryPossiblyAdded(this.dispatcher),i(null),void(t.reloadCallback&&(this.loadTile(t,t.reloadCallback),t.reloadCallback=null)))}}abortTile(e){e.request&&(e.request.cancel(),delete e.request),e.actor&&e.actor.send(\"abortTile\",{uid:e.uid,type:this.type,source:this.id});}unloadTile(e){e.unloadVectorData(),e.actor&&e.actor.send(\"removeTile\",{uid:e.uid,type:this.type,source:this.id});}hasTransition(){return !1}afterUpdate(){this._tileWorkers={};}cancelTileJSONRequest(){this._tileJSONRequest&&(this._tileJSONRequest.cancel(),this._tileJSONRequest=null);}}class Se extends e.Evented{constructor(t,i,o,r){super(),this.id=t,this.dispatcher=o,this.setEventedParent(r),this.type=\"raster\",this.minzoom=0,this.maxzoom=22,this.roundZoom=!0,this.scheme=\"xyz\",this.tileSize=512,this._loaded=!1,this._options=e.extend({type:\"raster\"},i),e.extend(this,e.pick(i,[\"url\",\"scheme\",\"tileSize\"]));}load(t){this._loaded=!1,this.fire(new e.Event(\"dataloading\",{dataType:\"source\"})),this._tileJSONRequest=F(this._options,this.map._requestManager,null,null,((i,o)=>{this._tileJSONRequest=null,this._loaded=!0,i?this.fire(new e.ErrorEvent(i)):o&&(e.extend(this,o),o.bounds&&(this.tileBounds=new U(o.bounds,this.minzoom,this.maxzoom)),e.postTurnstileEvent(o.tiles),this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})),this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"content\"}))),t&&t(i);}));}loaded(){return this._loaded}onAdd(e){this.map=e,this.load();}reload(){this.cancelTileJSONRequest(),this.load((()=>this.map.style._clearSource(this.id)));}setTiles(e){return this._options.tiles=e,this.reload(),this}setUrl(e){return this.url=e,this._options.url=e,this.reload(),this}onRemove(){this.cancelTileJSONRequest();}serialize(){return e.extend({},this._options)}hasTile(e){return !this.tileBounds||this.tileBounds.contains(e.canonical)}loadTile(t,i){const o=e.exported.devicePixelRatio>=2,r=this.map._requestManager.normalizeTileURL(t.tileID.canonical.url(this.tiles,this.scheme),o,this.tileSize);t.request=e.getImage(this.map._requestManager.transformRequest(r,e.ResourceType.Tile),((o,r,n,s)=>(delete t.request,t.aborted?(t.state=\"unloaded\",i(null)):o?(t.state=\"errored\",i(o)):r?(this.map._refreshExpiredTiles&&t.setExpiryData({cacheControl:n,expires:s}),t.setTexture(r,this.map.painter),t.state=\"loaded\",e.cacheEntryPossiblyAdded(this.dispatcher),void i(null)):i(null))));}static loadTileData(e,t,i){e.setTexture(t,i);}static unloadTileData(e,t){e.texture&&t.saveTileTexture(e.texture);}abortTile(e,t){e.request&&(e.request.cancel(),delete e.request),t();}unloadTile(e,t){e.texture&&this.map.painter.saveTileTexture(e.texture),t();}hasTransition(){return !1}cancelTileJSONRequest(){this._tileJSONRequest&&(this._tileJSONRequest.cancel(),this._tileJSONRequest=null);}}let De;function Le(t,i,o,r,n,s,a,l){const c=[t,o,n,i,r,s,1,1,1],h=[a,l,1],u=e.adjoint([],c),[_,d,p]=e.transformMat3(h,h,e.transpose(u,u));return e.multiply$1(c,[_,0,0,0,d,0,0,0,p],c)}class Ae extends e.Evented{constructor(e,t,i,o){super(),this.id=e,this.dispatcher=i,this.coordinates=t.coordinates,this.type=\"image\",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(o),this.options=t,this._dirty=!1;}load(t,i){this._loaded=i||!1,this.fire(new e.Event(\"dataloading\",{dataType:\"source\"})),this.url=this.options.url,this._imageRequest=e.getImage(this.map._requestManager.transformRequest(this.url,e.ResourceType.Image),((i,o)=>{if(this._imageRequest=null,this._loaded=!0,i)this.fire(new e.ErrorEvent(i));else if(o){const{HTMLImageElement:i}=e.window;this.image=o instanceof i?e.exported.getImageData(o):o,this._dirty=!0,this.width=this.image.width,this.height=this.image.height,t&&(this.coordinates=t),this._finishLoading();}}));}loaded(){return this._loaded}updateImage(e){return this.image&&e.url?(this._imageRequest&&e.url!==this.options.url&&(this._imageRequest.cancel(),this._imageRequest=null),this.options.url=e.url,this.load(e.coordinates,this._loaded),this):this}_finishLoading(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})));}onAdd(e){this.map=e,this.load();}onRemove(){this._imageRequest&&(this._imageRequest.cancel(),this._imageRequest=null),this.texture&&this.texture.destroy();}setCoordinates(t){this.coordinates=t,this._boundsArray=void 0;const i=t.map(e.MercatorCoordinate.fromLngLat);return this.tileID=function(t){let i=1/0,o=1/0,r=-1/0,n=-1/0;for(const e of t)i=Math.min(i,e.x),o=Math.min(o,e.y),r=Math.max(r,e.x),n=Math.max(n,e.y);const s=Math.max(r-i,n-o),a=Math.max(0,Math.floor(-Math.log(s)/Math.LN2)),l=Math.pow(2,a);return new e.CanonicalTileID(a,Math.floor((i+r)/2*l),Math.floor((o+n)/2*l))}(i),this.minzoom=this.maxzoom=this.tileID.z,this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"content\"})),this}_clear(){this._boundsArray=void 0;}_prepareData(t){for(const e in this.tiles){const t=this.tiles[e];\"loaded\"!==t.state&&(t.state=\"loaded\",t.texture=this.texture);}if(this._boundsArray)return;const i=e.tileTransform(this.tileID,this.map.transform.projection),[o,r,n,s]=this.coordinates.map((t=>{const o=i.projection.project(t[0],t[1]);return e.getTilePoint(i,o)._round()}));this.perspectiveTransform=function(t,i,o,r,n,s,a,l,c,h){const u=Le(0,0,t,0,0,i,t,i),_=Le(o,r,n,s,a,l,c,h);return e.multiply$1(_,e.adjoint(u,u),_),[_[6]/_[8]*t/e.EXTENT,_[7]/_[8]*i/e.EXTENT]}(this.width,this.height,o.x,o.y,r.x,r.y,s.x,s.y,n.x,n.y);const a=this._boundsArray=new e.StructArrayLayout4i8;a.emplaceBack(o.x,o.y,0,0),a.emplaceBack(r.x,r.y,e.EXTENT,0),a.emplaceBack(s.x,s.y,0,e.EXTENT),a.emplaceBack(n.x,n.y,e.EXTENT,e.EXTENT),this.boundsBuffer&&this.boundsBuffer.destroy(),this.boundsBuffer=t.createVertexBuffer(a,e.boundsAttributes.members),this.boundsSegments=e.SegmentVector.simpleSegment(0,0,4,2);}prepare(){if(0===Object.keys(this.tiles).length||!this.image)return;const t=this.map.painter.context,i=t.gl;this._dirty&&(this.texture?this.texture.update(this.image):(this.texture=new e.Texture(t,this.image,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE)),this._dirty=!1),this._prepareData(t);}loadTile(e,t){this.tileID&&this.tileID.equals(e.tileID.canonical)?(this.tiles[String(e.tileID.wrap)]=e,e.buckets={},t(null)):(e.state=\"errored\",t(null));}serialize(){return {type:\"image\",url:this.options.url,coordinates:this.coordinates}}hasTransition(){return !1}}const ze={vector:Ie,raster:Se,\"raster-dem\":class extends Se{constructor(t,i,o,r){super(t,i,o,r),this.type=\"raster-dem\",this.maxzoom=22,this._options=e.extend({type:\"raster-dem\"},i),this.encoding=i.encoding||\"mapbox\";}loadTile(t,i){const o=this.map._requestManager.normalizeTileURL(t.tileID.canonical.url(this.tiles,this.scheme),!1,this.tileSize);function r(e,o){e&&(t.state=\"errored\",i(e)),o&&(t.dem=o,t.dem.onDeserialize(),t.needsHillshadePrepare=!0,t.needsDEMTextureUpload=!0,t.state=\"loaded\",i(null));}t.request=e.getImage(this.map._requestManager.transformRequest(o,e.ResourceType.Tile),function(o,n,s,a){if(delete t.request,t.aborted)t.state=\"unloaded\",i(null);else if(o)t.state=\"errored\",i(o);else if(n){this.map._refreshExpiredTiles&&t.setExpiryData({cacheControl:s,expires:a});const i=e.window.ImageBitmap&&n instanceof e.window.ImageBitmap&&(null==De&&(De=e.window.OffscreenCanvas&&new e.window.OffscreenCanvas(1,1).getContext(\"2d\")&&\"function\"==typeof e.window.createImageBitmap),De),o=1-(n.width-e.prevPowerOfTwo(n.width))/2;o<1||t.neighboringTiles||(t.neighboringTiles=this._getNeighboringTiles(t.tileID));const l=i?n:e.exported.getImageData(n,o),c={uid:t.uid,coord:t.tileID,source:this.id,rawImageData:l,encoding:this.encoding,padding:o};t.actor&&\"expired\"!==t.state||(t.actor=this.dispatcher.getActor(),t.actor.send(\"loadDEMTile\",c,r.bind(this),void 0,!0));}}.bind(this));}_getNeighboringTiles(t){const i=t.canonical,o=Math.pow(2,i.z),r=(i.x-1+o)%o,n=0===i.x?t.wrap-1:t.wrap,s=(i.x+1+o)%o,a=i.x+1===o?t.wrap+1:t.wrap,l={};return l[new e.OverscaledTileID(t.overscaledZ,n,i.z,r,i.y).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,a,i.z,s,i.y).key]={backfilled:!1},i.y>0&&(l[new e.OverscaledTileID(t.overscaledZ,n,i.z,r,i.y-1).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,t.wrap,i.z,i.x,i.y-1).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,a,i.z,s,i.y-1).key]={backfilled:!1}),i.y+1<o&&(l[new e.OverscaledTileID(t.overscaledZ,n,i.z,r,i.y+1).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,t.wrap,i.z,i.x,i.y+1).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,a,i.z,s,i.y+1).key]={backfilled:!1}),l}unloadTile(e){e.demTexture&&this.map.painter.saveTileTexture(e.demTexture),e.fbo&&(e.fbo.destroy(),delete e.fbo),e.dem&&delete e.dem,delete e.neighboringTiles,e.state=\"unloaded\";}},geojson:class extends e.Evented{constructor(t,i,o,r){super(),this.id=t,this.type=\"geojson\",this.minzoom=0,this.maxzoom=18,this.tileSize=512,this.isTileClipped=!0,this.reparseOverscaled=!0,this._loaded=!1,this.actor=o.getActor(),this.setEventedParent(r),this._data=i.data,this._options=e.extend({},i),this._collectResourceTiming=i.collectResourceTiming,void 0!==i.maxzoom&&(this.maxzoom=i.maxzoom),i.type&&(this.type=i.type),i.attribution&&(this.attribution=i.attribution),this.promoteId=i.promoteId;const n=e.EXTENT/this.tileSize;this.workerOptions=e.extend({source:this.id,cluster:i.cluster||!1,geojsonVtOptions:{buffer:(void 0!==i.buffer?i.buffer:128)*n,tolerance:(void 0!==i.tolerance?i.tolerance:.375)*n,extent:e.EXTENT,maxZoom:this.maxzoom,lineMetrics:i.lineMetrics||!1,generateId:i.generateId||!1},superclusterOptions:{maxZoom:void 0!==i.clusterMaxZoom?i.clusterMaxZoom:this.maxzoom-1,minPoints:Math.max(2,i.clusterMinPoints||2),extent:e.EXTENT,radius:(void 0!==i.clusterRadius?i.clusterRadius:50)*n,log:!1,generateId:i.generateId||!1},clusterProperties:i.clusterProperties,filter:i.filter},i.workerOptions);}onAdd(e){this.map=e,this.setData(this._data);}setData(e){return this._data=e,this._updateWorkerData(),this}getClusterExpansionZoom(e,t){return this.actor.send(\"geojson.getClusterExpansionZoom\",{clusterId:e,source:this.id},t),this}getClusterChildren(e,t){return this.actor.send(\"geojson.getClusterChildren\",{clusterId:e,source:this.id},t),this}getClusterLeaves(e,t,i,o){return this.actor.send(\"geojson.getClusterLeaves\",{source:this.id,clusterId:e,limit:t,offset:i},o),this}_updateWorkerData(){if(this._pendingLoad)return void(this._coalesce=!0);this.fire(new e.Event(\"dataloading\",{dataType:\"source\"})),this._loaded=!1;const t=e.extend({},this.workerOptions),i=this._data;\"string\"==typeof i?(t.request=this.map._requestManager.transformRequest(e.exported.resolveURL(i),e.ResourceType.Source),t.request.collectResourceTiming=this._collectResourceTiming):t.data=JSON.stringify(i),this._pendingLoad=this.actor.send(`${this.type}.loadData`,t,((t,i)=>{if(this._loaded=!0,this._pendingLoad=null,t)this.fire(new e.ErrorEvent(t));else {const t={dataType:\"source\",sourceDataType:this._metadataFired?\"content\":\"metadata\"};this._collectResourceTiming&&i&&i.resourceTiming&&i.resourceTiming[this.id]&&(t.resourceTiming=i.resourceTiming[this.id]),this.fire(new e.Event(\"data\",t)),this._metadataFired=!0;}this._coalesce&&(this._updateWorkerData(),this._coalesce=!1);}));}loaded(){return this._loaded}loadTile(t,i){const o=t.actor?\"reloadTile\":\"loadTile\";t.actor=this.actor,t.request=this.actor.send(o,{type:this.type,uid:t.uid,tileID:t.tileID,tileZoom:t.tileZoom,zoom:t.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:e.exported.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId},((e,r)=>(delete t.request,t.unloadVectorData(),t.aborted?i(null):e?i(e):(t.loadVectorData(r,this.map.painter,\"reloadTile\"===o),i(null)))),void 0,\"loadTile\"===o);}abortTile(e){e.request&&(e.request.cancel(),delete e.request),e.aborted=!0;}unloadTile(e){e.unloadVectorData(),this.actor.send(\"removeTile\",{uid:e.uid,type:this.type,source:this.id});}onRemove(){this._pendingLoad&&this._pendingLoad.cancel();}serialize(){return e.extend({},this._options,{type:this.type,data:this._data})}hasTransition(){return !1}},video:class extends Ae{constructor(e,t,i,o){super(e,t,i,o),this.roundZoom=!0,this.type=\"video\",this.options=t;}load(){this._loaded=!1;const t=this.options;this.urls=[];for(const i of t.urls)this.urls.push(this.map._requestManager.transformRequest(i,e.ResourceType.Source).url);e.getVideo(this.urls,((t,i)=>{this._loaded=!0,t?this.fire(new e.ErrorEvent(t)):i&&(this.video=i,this.video.loop=!0,this.video.setAttribute(\"playsinline\",\"\"),this.video.addEventListener(\"playing\",(()=>{this.map.triggerRepaint();})),this.map&&this.video.play(),this._finishLoading());}));}pause(){this.video&&this.video.pause();}play(){this.video&&this.video.play();}seek(t){if(this.video){const i=this.video.seekable;t<i.start(0)||t>i.end(0)?this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${this.id}`,null,`Playback for this video can be set only between the ${i.start(0)} and ${i.end(0)}-second mark.`))):this.video.currentTime=t;}}getVideo(){return this.video}onAdd(e){this.map||(this.map=e,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)));}prepare(){if(0===Object.keys(this.tiles).length||this.video.readyState<2)return;const t=this.map.painter.context,i=t.gl;this.texture?this.video.paused||(this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE),i.texSubImage2D(i.TEXTURE_2D,0,0,0,i.RGBA,i.UNSIGNED_BYTE,this.video)):(this.texture=new e.Texture(t,this.video,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE),this.width=this.video.videoWidth,this.height=this.video.videoHeight),this._prepareData(t);}serialize(){return {type:\"video\",urls:this.urls,coordinates:this.coordinates}}hasTransition(){return this.video&&!this.video.paused}},image:Ae,canvas:class extends Ae{constructor(t,i,o,r){super(t,i,o,r),i.coordinates?Array.isArray(i.coordinates)&&4===i.coordinates.length&&!i.coordinates.some((e=>!Array.isArray(e)||2!==e.length||e.some((e=>\"number\"!=typeof e))))||this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'\"coordinates\" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'missing required property \"coordinates\"'))),i.animate&&\"boolean\"!=typeof i.animate&&this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'optional \"animate\" property must be a boolean value'))),i.canvas?\"string\"==typeof i.canvas||i.canvas instanceof e.window.HTMLCanvasElement||this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'\"canvas\" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'missing required property \"canvas\"'))),this.options=i,this.animate=void 0===i.animate||i.animate;}load(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof e.window.HTMLCanvasElement?this.options.canvas:e.window.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new e.ErrorEvent(new Error(\"Canvas dimensions cannot be less than or equal to zero.\"))):(this.play=function(){this._playing=!0,this.map.triggerRepaint();},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1);},this._finishLoading());}getCanvas(){return this.canvas}onAdd(e){this.map=e,this.load(),this.canvas&&this.animate&&this.play();}onRemove(){this.pause();}prepare(){let t=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,t=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,t=!0),this._hasInvalidDimensions())return;if(0===Object.keys(this.tiles).length)return;const i=this.map.painter.context;this.texture?(t||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new e.Texture(i,this.canvas,i.gl.RGBA,{premultiply:!0}),this._prepareData(i);}serialize(){return {type:\"canvas\",coordinates:this.coordinates}}hasTransition(){return this._playing}_hasInvalidDimensions(){for(const e of [this.canvas.width,this.canvas.height])if(isNaN(e)||e<=0)return !0;return !1}},custom:class extends e.Evented{constructor(t,i,o,r){super(),this.id=t,this.type=\"custom\",this._dataType=\"raster\",this._dispatcher=o,this._implementation=i,this.setEventedParent(r),this.scheme=\"xyz\",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this._loaded=!1,this.roundZoom=!0,this._implementation||this.fire(new e.ErrorEvent(new Error(`Missing implementation for ${this.id} custom source`))),this._implementation.loadTile||this.fire(new e.ErrorEvent(new Error(`Missing loadTile implementation for ${this.id} custom source`))),this._implementation.bounds&&(this.tileBounds=new U(this._implementation.bounds,this.minzoom,this.maxzoom)),i.update=this._update.bind(this),i.clearTiles=this._clearTiles.bind(this),i.coveringTiles=this._coveringTiles.bind(this),e.extend(this,e.pick(i,[\"dataType\",\"scheme\",\"minzoom\",\"maxzoom\",\"tileSize\",\"attribution\",\"minTileCacheSize\",\"maxTileCacheSize\"]));}serialize(){return e.pick(this,[\"type\",\"scheme\",\"minzoom\",\"maxzoom\",\"tileSize\",\"attribution\"])}load(){this._loaded=!0,this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})),this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"content\"}));}loaded(){return this._loaded}onAdd(t){this._map=t,this._loaded=!1,this.fire(new e.Event(\"dataloading\",{dataType:\"source\"})),this._implementation.onAdd&&this._implementation.onAdd(t),this.load();}onRemove(e){this._implementation.onRemove&&this._implementation.onRemove(e);}hasTile(e){if(this._implementation.hasTile){const{x:t,y:i,z:o}=e.canonical;return this._implementation.hasTile({x:t,y:i,z:o})}return !this.tileBounds||this.tileBounds.contains(e.canonical)}loadTile(t,i){const{x:o,y:r,z:n}=t.tileID.canonical,s=new e.window.AbortController;t.request=Promise.resolve(this._implementation.loadTile({x:o,y:r,z:n},{signal:s.signal})).then(function(o){return delete t.request,t.aborted?(t.state=\"unloaded\",i(null)):void 0===o?(t.state=\"errored\",i(null)):null===o?(this.loadTileData(t,{width:this.tileSize,height:this.tileSize,data:null}),t.state=\"loaded\",i(null)):function(t){return t instanceof e.window.ImageData||t instanceof e.window.HTMLCanvasElement||t instanceof e.window.ImageBitmap||t instanceof e.window.HTMLImageElement}(o)?(this.loadTileData(t,o),t.state=\"loaded\",void i(null)):(t.state=\"errored\",i(new Error(`Can't infer data type for ${this.id}, only raster data supported at the moment`)))}.bind(this)).catch((e=>{20!==e.code&&(t.state=\"errored\",i(e));})),t.request.cancel=()=>s.abort();}loadTileData(e,t){Se.loadTileData(e,t,this._map.painter);}unloadTileData(e){Se.unloadTileData(e,this._map.painter);}unloadTile(e,t){if(this.unloadTileData(e),this._implementation.unloadTile){const{x:t,y:i,z:o}=e.tileID.canonical;this._implementation.unloadTile({x:t,y:i,z:o});}t();}abortTile(e,t){e.request&&e.request.cancel&&(e.request.cancel(),delete e.request),t();}hasTransition(){return !1}_coveringTiles(){return this._map.transform.coveringTiles({tileSize:this.tileSize,minzoom:this.minzoom,maxzoom:this.maxzoom,roundZoom:this.roundZoom}).map((e=>({x:e.canonical.x,y:e.canonical.y,z:e.canonical.z})))}_clearTiles(){this._map.style._clearSource(this.id);}_update(){this.fire(new e.Event(\"data\",{dataType:\"source\",sourceDataType:\"content\"}));}}},Pe=function(t,i,o,r){const n=new ze[i.type](t,i,o,r);if(n.id!==t)throw new Error(`Expected Source id to be ${t} instead of ${n.id}`);return e.bindAll([\"load\",\"abort\",\"unload\",\"serialize\",\"prepare\"],n),n};function Re(t,i){const o=e.identity([]);return e.scale(o,o,[.5*t.width,.5*-t.height,1]),e.translate(o,o,[1,-1,0]),e.multiply(o,o,t.calculateProjMatrix(i.toUnwrapped())),Float32Array.from(o)}function Oe(e,t,i,o,r,n,s,a=!1){const l=e.tilesIn(o,s,a);l.sort(ke);const c=[];for(const o of l)c.push({wrappedTileID:o.tile.tileID.wrapped().key,queryResults:o.tile.queryRenderedFeatures(t,i,e._state,o,r,n,Re(e.transform,o.tile.tileID),a)});const h=function(e){const t={},i={};for(const o of e){const e=o.queryResults,r=o.wrappedTileID,n=i[r]=i[r]||{};for(const i in e){const o=e[i],r=n[i]=n[i]||{},s=t[i]=t[i]||[];for(const e of o)r[e.featureIndex]||(r[e.featureIndex]=!0,s.push(e));}}return t}(c);for(const t in h)h[t].forEach((t=>{const i=t.feature,o=i.layer;o&&\"background\"!==o.type&&\"sky\"!==o.type&&(i.source=o.source,o[\"source-layer\"]&&(i.sourceLayer=o[\"source-layer\"]),i.state=void 0!==i.id?e.getFeatureState(o[\"source-layer\"],i.id):{});}));return h}function Be(e,t){const i=e.getRenderableIds().map((t=>e.getTileByID(t))),o=[],r={};for(let e=0;e<i.length;e++){const n=i[e],s=n.tileID.canonical.key;r[s]||(r[s]=!0,n.querySourceFeatures(o,t));}return o}function ke(e,t){const i=e.tileID,o=t.tileID;return i.overscaledZ-o.overscaledZ||i.canonical.y-o.canonical.y||i.wrap-o.wrap||i.canonical.x-o.canonical.x}function Fe(){return null!=fn.workerClass?new fn.workerClass:new e.window.Worker(fn.workerUrl)}const Ue=\"mapboxgl_preloaded_worker_pool\";class Ne{constructor(){this.active={};}acquire(e){if(!this.workers)for(this.workers=[];this.workers.length<Ne.workerCount;)this.workers.push(new Fe);return this.active[e]=!0,this.workers.slice()}release(e){delete this.active[e],0===this.numActive()&&(this.workers.forEach((e=>{e.terminate();})),this.workers=null);}isPreloaded(){return !!this.active[Ue]}numActive(){return Object.keys(this.active).length}}let Ge;function je(){return Ge||(Ge=new Ne),Ge}function Ze(t,i){const o={};for(const e in t)\"ref\"!==e&&(o[e]=t[e]);return e.refProperties.forEach((e=>{e in i&&(o[e]=i[e]);})),o}function Ve(e){e=e.slice();const t=Object.create(null);for(let i=0;i<e.length;i++)t[e[i].id]=e[i];for(let i=0;i<e.length;i++)\"ref\"in e[i]&&(e[i]=Ze(e[i],t[e[i].ref]));return e}Ne.workerCount=2;const We={setStyle:\"setStyle\",addLayer:\"addLayer\",removeLayer:\"removeLayer\",setPaintProperty:\"setPaintProperty\",setLayoutProperty:\"setLayoutProperty\",setFilter:\"setFilter\",addSource:\"addSource\",removeSource:\"removeSource\",setGeoJSONSourceData:\"setGeoJSONSourceData\",setLayerZoomRange:\"setLayerZoomRange\",setLayerProperty:\"setLayerProperty\",setCenter:\"setCenter\",setZoom:\"setZoom\",setBearing:\"setBearing\",setPitch:\"setPitch\",setSprite:\"setSprite\",setGlyphs:\"setGlyphs\",setTransition:\"setTransition\",setLight:\"setLight\",setTerrain:\"setTerrain\",setFog:\"setFog\",setProjection:\"setProjection\"};function Xe(e,t,i){i.push({command:We.addSource,args:[e,t[e]]});}function qe(e,t,i){t.push({command:We.removeSource,args:[e]}),i[e]=!0;}function $e(e,t,i,o){qe(e,i,o),Xe(e,t,i);}function He(e,i,o){let r;for(r in e[o])if(e[o].hasOwnProperty(r)&&\"data\"!==r&&!t(e[o][r],i[o][r]))return !1;for(r in i[o])if(i[o].hasOwnProperty(r)&&\"data\"!==r&&!t(e[o][r],i[o][r]))return !1;return !0}function Ye(e,i,o,r,n,s){let a;for(a in i=i||{},e=e||{})e.hasOwnProperty(a)&&(t(e[a],i[a])||o.push({command:s,args:[r,a,i[a],n]}));for(a in i)i.hasOwnProperty(a)&&!e.hasOwnProperty(a)&&(t(e[a],i[a])||o.push({command:s,args:[r,a,i[a],n]}));}function Ke(e){return e.id}function Je(e,t){return e[t.id]=t,e}class Qe{constructor(e,t){this.reset(e,t);}reset(e,t){this.points=e||[],this._distances=[0];for(let e=1;e<this.points.length;e++)this._distances[e]=this._distances[e-1]+this.points[e].dist(this.points[e-1]);this.length=this._distances[this._distances.length-1],this.padding=Math.min(t||0,.5*this.length),this.paddedLength=this.length-2*this.padding;}lerp(t){if(1===this.points.length)return this.points[0];t=e.clamp(t,0,1);let i=1,o=this._distances[i];const r=t*this.paddedLength+this.padding;for(;o<r&&i<this._distances.length;)o=this._distances[++i];const n=i-1,s=this._distances[n],a=o-s,l=a>0?(r-s)/a:0;return this.points[n].mult(1-l).add(this.points[i].mult(l))}}class et{constructor(e,t,i){const o=this.boxCells=[],r=this.circleCells=[];this.xCellCount=Math.ceil(e/i),this.yCellCount=Math.ceil(t/i);for(let e=0;e<this.xCellCount*this.yCellCount;e++)o.push([]),r.push([]);this.circleKeys=[],this.boxKeys=[],this.bboxes=[],this.circles=[],this.width=e,this.height=t,this.xScale=this.xCellCount/e,this.yScale=this.yCellCount/t,this.boxUid=0,this.circleUid=0;}keysLength(){return this.boxKeys.length+this.circleKeys.length}insert(e,t,i,o,r){this._forEachCell(t,i,o,r,this._insertBoxCell,this.boxUid++),this.boxKeys.push(e),this.bboxes.push(t),this.bboxes.push(i),this.bboxes.push(o),this.bboxes.push(r);}insertCircle(e,t,i,o){this._forEachCell(t-o,i-o,t+o,i+o,this._insertCircleCell,this.circleUid++),this.circleKeys.push(e),this.circles.push(t),this.circles.push(i),this.circles.push(o);}_insertBoxCell(e,t,i,o,r,n){this.boxCells[r].push(n);}_insertCircleCell(e,t,i,o,r,n){this.circleCells[r].push(n);}_query(e,t,i,o,r,n){if(i<0||e>this.width||o<0||t>this.height)return !r&&[];const s=[];if(e<=0&&t<=0&&this.width<=i&&this.height<=o){if(r)return !0;for(let e=0;e<this.boxKeys.length;e++)s.push({key:this.boxKeys[e],x1:this.bboxes[4*e],y1:this.bboxes[4*e+1],x2:this.bboxes[4*e+2],y2:this.bboxes[4*e+3]});for(let e=0;e<this.circleKeys.length;e++){const t=this.circles[3*e],i=this.circles[3*e+1],o=this.circles[3*e+2];s.push({key:this.circleKeys[e],x1:t-o,y1:i-o,x2:t+o,y2:i+o});}return n?s.filter(n):s}return this._forEachCell(e,t,i,o,this._queryCell,s,{hitTest:r,seenUids:{box:{},circle:{}}},n),r?s.length>0:s}_queryCircle(e,t,i,o,r){const n=e-i,s=e+i,a=t-i,l=t+i;if(s<0||n>this.width||l<0||a>this.height)return !o&&[];const c=[];return this._forEachCell(n,a,s,l,this._queryCellCircle,c,{hitTest:o,circle:{x:e,y:t,radius:i},seenUids:{box:{},circle:{}}},r),o?c.length>0:c}query(e,t,i,o,r){return this._query(e,t,i,o,!1,r)}hitTest(e,t,i,o,r){return this._query(e,t,i,o,!0,r)}hitTestCircle(e,t,i,o){return this._queryCircle(e,t,i,!0,o)}_queryCell(e,t,i,o,r,n,s,a){const l=s.seenUids,c=this.boxCells[r];if(null!==c){const r=this.bboxes;for(const h of c)if(!l.box[h]){l.box[h]=!0;const c=4*h;if(e<=r[c+2]&&t<=r[c+3]&&i>=r[c+0]&&o>=r[c+1]&&(!a||a(this.boxKeys[h]))){if(s.hitTest)return n.push(!0),!0;n.push({key:this.boxKeys[h],x1:r[c],y1:r[c+1],x2:r[c+2],y2:r[c+3]});}}}const h=this.circleCells[r];if(null!==h){const r=this.circles;for(const c of h)if(!l.circle[c]){l.circle[c]=!0;const h=3*c;if(this._circleAndRectCollide(r[h],r[h+1],r[h+2],e,t,i,o)&&(!a||a(this.circleKeys[c]))){if(s.hitTest)return n.push(!0),!0;{const e=r[h],t=r[h+1],i=r[h+2];n.push({key:this.circleKeys[c],x1:e-i,y1:t-i,x2:e+i,y2:t+i});}}}}}_queryCellCircle(e,t,i,o,r,n,s,a){const l=s.circle,c=s.seenUids,h=this.boxCells[r];if(null!==h){const e=this.bboxes;for(const t of h)if(!c.box[t]){c.box[t]=!0;const i=4*t;if(this._circleAndRectCollide(l.x,l.y,l.radius,e[i+0],e[i+1],e[i+2],e[i+3])&&(!a||a(this.boxKeys[t])))return n.push(!0),!0}}const u=this.circleCells[r];if(null!==u){const e=this.circles;for(const t of u)if(!c.circle[t]){c.circle[t]=!0;const i=3*t;if(this._circlesCollide(e[i],e[i+1],e[i+2],l.x,l.y,l.radius)&&(!a||a(this.circleKeys[t])))return n.push(!0),!0}}}_forEachCell(e,t,i,o,r,n,s,a){const l=this._convertToXCellCoord(e),c=this._convertToYCellCoord(t),h=this._convertToXCellCoord(i),u=this._convertToYCellCoord(o);for(let _=l;_<=h;_++)for(let l=c;l<=u;l++)if(r.call(this,e,t,i,o,this.xCellCount*l+_,n,s,a))return}_convertToXCellCoord(e){return Math.max(0,Math.min(this.xCellCount-1,Math.floor(e*this.xScale)))}_convertToYCellCoord(e){return Math.max(0,Math.min(this.yCellCount-1,Math.floor(e*this.yScale)))}_circlesCollide(e,t,i,o,r,n){const s=o-e,a=r-t,l=i+n;return l*l>s*s+a*a}_circleAndRectCollide(e,t,i,o,r,n,s){const a=(n-o)/2,l=Math.abs(e-(o+a));if(l>a+i)return !1;const c=(s-r)/2,h=Math.abs(t-(r+c));if(h>c+i)return !1;if(l<=a||h<=c)return !0;const u=l-a,_=h-c;return u*u+_*_<=i*i}}const tt=Math.tan(85*Math.PI/180);function it(t,i,o,r,n,s,a){const l=e.create();if(o)if(\"globe\"===s.name){const t=e.calculateGlobeLabelMatrix(n,i);e.multiply(l,l,t);}else {const t=v([],a);l[0]=t[0],l[1]=t[1],l[4]=t[2],l[5]=t[3],r||e.rotateZ(l,l,n.angle);}else e.multiply(l,n.labelPlaneMatrix,t);return l}function ot(e,t,i,o,r,n,s){const a=it(e,t,i,o,r,n,s);return \"globe\"===n.name&&i||(a[2]=a[6]=a[10]=a[14]=0),a}function rt(t,i,o,r,n,s,a){if(o){if(\"globe\"===s.name){const l=it(t,i,o,r,n,s,a);return e.invert(l,l),e.multiply(l,t,l),l}{const i=e.clone(t),o=e.identity([]);return o[0]=a[0],o[1]=a[1],o[4]=a[2],o[5]=a[3],e.multiply(i,i,o),r||e.rotateZ(i,i,-n.angle),i}}return n.glCoordMatrix}function nt(t,i,o,r){const n=[t,i,o,1];o?e.transformMat4$1(n,n,r):ft(n,n,r);const s=n[3];return n[0]/=s,n[1]/=s,n[2]/=s,n}function st(e,t){return Math.min(.5+e/t*.5,1.5)}function at(e,t){const i=e[0]/e[3],o=e[1]/e[3];return i>=-t[0]&&i<=t[0]&&o>=-t[1]&&o<=t[1]}function lt(t,i,o,r,n,s,a,l,c,h){const u=o.transform,_=r?t.textSizeData:t.iconSizeData,d=e.evaluateSizeForZoom(_,o.transform.zoom),p=\"globe\"===u.projection.name,m=[256/o.width*2+1,256/o.height*2+1],f=r?t.text.dynamicLayoutVertexArray:t.icon.dynamicLayoutVertexArray;f.clear();let g=null;p&&(g=r?t.text.globeExtVertexArray:t.icon.globeExtVertexArray);const v=t.lineVertexArray,x=r?t.text.placedSymbolArray:t.icon.placedSymbolArray,y=o.transform.width/o.transform.height;let b,w=!1;for(let r=0;r<x.length;r++){const p=x.get(r),{numGlyphs:T,writingMode:E}=p;if(E!==e.WritingMode.vertical||w||b===e.WritingMode.horizontal||(w=!0),b=E,(p.hidden||E===e.WritingMode.vertical)&&!w){mt(T,f);continue}w=!1;const C=new e.pointGeometry(p.tileAnchorX,p.tileAnchorY);let{x:M,y:I,z:S}=u.projection.projectTilePoint(C.x,C.y,h.canonical);if(c){const[e,t,i]=c(C);M+=e,I+=t,S+=i;}const D=[M,I,S,1];if(e.transformMat4$1(D,D,i),!at(D,m)){mt(T,f);continue}const L=st(o.transform.cameraToCenterDistance,D[3]),A=e.evaluateSizeForFeature(_,d,p),z=a?A/L:A*L,P=nt(M,I,S,n);if(P[3]<=0){mt(T,f);continue}let R={};const O=a?null:c,B=ut(p,z,!1,l,i,n,s,t.glyphOffsetArray,v,f,g,P,C,R,y,O,u.projection,h,a);w=B.useVertical,O&&B.needsFlipping&&(R={}),(B.notEnoughRoom||w||B.needsFlipping&&ut(p,z,!0,l,i,n,s,t.glyphOffsetArray,v,f,g,P,C,R,y,O,u.projection,h,a).notEnoughRoom)&&mt(T,f);}r?(t.text.dynamicLayoutVertexBuffer.updateData(f),g&&t.text.globeExtVertexBuffer.updateData(g)):(t.icon.dynamicLayoutVertexBuffer.updateData(f),g&&t.icon.globeExtVertexBuffer.updateData(g));}function ct(e,t,i,o,r,n,s,a,l,c,h,u,_,d,p,m){const{lineStartIndex:f,glyphStartIndex:g,segment:v}=a,x=g+a.numGlyphs,y=f+a.lineLength,b=t.getoffsetX(g),w=t.getoffsetX(x-1),T=pt(e*b,i,o,r,n,s,v,f,y,l,c,h,u,_,!0,d,p,m);if(!T)return null;const E=pt(e*w,i,o,r,n,s,v,f,y,l,c,h,u,_,!0,d,p,m);return E?{first:T,last:E}:null}function ht(t,i,o,r){return t===e.WritingMode.horizontal&&Math.abs(r)>Math.abs(o)?{useVertical:!0}:t===e.WritingMode.vertical?r>0?{needsFlipping:!0}:null:0!==i&&function(e,t){return 0===e||Math.abs(t/e)>tt}(o,r)?1===i?{needsFlipping:!0}:null:o<0?{needsFlipping:!0}:null}function ut(t,i,o,r,n,s,a,l,c,h,u,_,d,p,m,f,g,v,x){const y=i/24,b=t.lineOffsetX*y,w=t.lineOffsetY*y,{lineStartIndex:T,glyphStartIndex:E,numGlyphs:C,segment:M,writingMode:I,flipState:S}=t,D=T+t.lineLength,L=t=>{if(u){const[i,o,r]=t.up,n=h.length;e.updateGlobeVertexNormal(u,n+0,i,o,r),e.updateGlobeVertexNormal(u,n+1,i,o,r),e.updateGlobeVertexNormal(u,n+2,i,o,r),e.updateGlobeVertexNormal(u,n+3,i,o,r);}const[i,o,r]=t.point;e.addDynamicAttributes(h,i,o,r,t.angle);};if(C>1){const e=ct(y,l,b,w,o,_,d,t,c,s,p,f,!1,g,v,x);if(!e)return {notEnoughRoom:!0};if(r&&!o){let[i,o,r]=e.first.point,[n,s,l]=e.last.point;[i,o]=nt(i,o,r,a),[n,s]=nt(n,s,l,a);const c=ht(I,S,(n-i)*m,s-o);if(t.flipState=c&&c.needsFlipping?1:2,c)return c}L(e.first);for(let e=E+1;e<E+C-1;e++){const t=pt(y*l.getoffsetX(e),b,w,o,_,d,M,T,D,c,s,p,f,!1,!1,g,v,x);if(!t)return h.length-=4*(e-E),{notEnoughRoom:!0};L(t);}L(e.last);}else {if(r&&!o){const i=nt(d.x,d.y,0,n),o=T+M+1,r=new e.pointGeometry(c.getx(o),c.gety(o)),s=nt(r.x,r.y,0,n),a=s[3]>0?s:dt(d,r,i,1,n,void 0,g,v.canonical),l=ht(I,S,(a[0]-i[0])*m,a[1]-i[1]);if(t.flipState=l&&l.needsFlipping?1:2,l)return l}const i=pt(y*l.getoffsetX(E),b,w,o,_,d,M,T,D,c,s,p,f,!1,!1,g,v,x);if(!i)return {notEnoughRoom:!0};L(i);}return {}}function _t(e,t,i,o,r){const{x:n,y:s,z:a}=o.projectTilePoint(e.x,e.y,t);if(!r)return nt(n,s,a,i);const[l,c,h]=r(e);return nt(n+l,s+c,a+h,i)}function dt(t,i,o,r,n,s,a,l){const c=_t(t.sub(i)._unit()._add(t),l,n,a,s);return e.sub(c,o,c),e.normalize(c,c),e.scaleAndAdd(c,o,c,r)}function pt(t,i,o,r,n,s,a,l,c,h,u,_,d,p,m,f,g,v){const x=r?t-i:t+i;let y=x>0?1:-1,b=0;r&&(y*=-1,b=Math.PI),y<0&&(b+=Math.PI);let w=l+a+(y>0?0:1)|0,T=n,E=n,C=0,M=0;const I=Math.abs(x),S=[],D=[];let L=s,A=L;const z=()=>dt(A,L,E,I-C+1,u,d,f,g.canonical);for(;C+M<=I;){if(w+=y,w<l||w>=c)return null;if(E=T,A=L,S.push(E),p&&D.push(A),L=new e.pointGeometry(h.getx(w),h.gety(w)),T=_[w],!T){const e=_t(L,g.canonical,u,f,d);T=e[3]>0?_[w]=e:z();}C+=M,M=e.distance(E,T);}m&&d&&(_[w]&&(T=z(),M=e.distance(E,T)),_[w]=T);const P=(I-C)/M,R=L.sub(A)._mult(P)._add(A),O=e.sub([],T,E),B=e.scaleAndAdd([],E,O,P);let k=[0,0,1],F=O[0],U=O[1];if(v&&(k=f.upVector(g.canonical,R.x,R.y),0!==k[0]||0!==k[1]||1!==k[2])){const t=[k[2],0,-k[0]],i=e.cross([],k,t);e.normalize(t,t),e.normalize(i,i),F=e.dot(O,t),U=e.dot(O,i);}if(o){const t=e.cross([],k,O);e.normalize(t,t),e.scaleAndAdd(B,B,t,o*y);}const N=b+Math.atan2(U,F);return S.push(B),p&&D.push(R),{point:B,angle:N,path:S,tilePath:D,up:k}}function mt(e,t){const i=t.length,o=i+4*e;t.resize(o),t.float32.fill(-1/0,4*i,4*o);}function ft(e,t,i){const o=t[0],r=t[1];return e[0]=i[0]*o+i[4]*r+i[12],e[1]=i[1]*o+i[5]*r+i[13],e[3]=i[3]*o+i[7]*r+i[15],e}const gt=100;class vt{constructor(e,t,i=new et(e.width+200,e.height+200,25),o=new et(e.width+200,e.height+200,25)){this.transform=e,this.grid=i,this.ignoredGrid=o,this.pitchfactor=Math.cos(e._pitch)*e.cameraToCenterDistance,this.screenRightBoundary=e.width+gt,this.screenBottomBoundary=e.height+gt,this.gridRightBoundary=e.width+200,this.gridBottomBoundary=e.height+200,this.fogState=t;}placeCollisionBox(e,t,i,o,r,n,s,a){let l=i.projectedAnchorX,c=i.projectedAnchorY,h=i.projectedAnchorZ;const u=i.elevation,_=i.tileID,d=e.getProjection();if(u&&_){const[e,t,o]=d.upVector(_.canonical,i.tileAnchorX,i.tileAnchorY),r=d.upVectorScale(_.canonical,this.transform.center.lat,this.transform.worldSize).metersToTile;l+=e*u*r,c+=t*u*r,h+=o*u*r;}const p=this.projectAndGetPerspectiveRatio(s,l,c,h,i.tileID,\"globe\"===d.name||!!u||this.transform.pitch>0,d),m=n*p.perspectiveRatio,f=(i.x1*t+o.x-i.padding)*m+p.point.x,g=(i.y1*t+o.y-i.padding)*m+p.point.y,v=(i.x2*t+o.x+i.padding)*m+p.point.x,x=(i.y2*t+o.y+i.padding)*m+p.point.y,y=p.perspectiveRatio<=.55||p.occluded;return !this.isInsideGrid(f,g,v,x)||!r&&this.grid.hitTest(f,g,v,x,a)||y?{box:[],offscreen:!1,occluded:p.occluded}:{box:[f,g,v,x],offscreen:this.isOffscreen(f,g,v,x),occluded:!1}}placeCollisionCircles(t,i,o,r,n,s,a,l,c,h,u,_,d,p,m){const f=[],g=this.transform.elevation,v=t.getProjection(),x=g?g.getAtTileOffsetFunc(m,this.transform.center.lat,this.transform.worldSize,v):null,y=new e.pointGeometry(o.tileAnchorX,o.tileAnchorY);let{x:b,y:w,z:T}=v.projectTilePoint(y.x,y.y,m.canonical);if(x){const[e,t,i]=x(y);b+=e,w+=t,T+=i;}const E=\"globe\"===v.name,C=this.projectAndGetPerspectiveRatio(a,b,w,T,m,E||!!g||this.transform.pitch>0,v),{perspectiveRatio:M}=C,I=(u?s/M:s*M)/e.ONE_EM,S=nt(b,w,T,l),D=C.signedDistanceFromCamera>0?ct(I,n,o.lineOffsetX*I,o.lineOffsetY*I,!1,S,y,o,r,l,{},g&&!u?x:null,u&&!!g,v,m,u):null;let L=!1,A=!1,z=!0;if(D&&!C.occluded){const t=.5*d*M+p,o=new e.pointGeometry(-100,-100),r=new e.pointGeometry(this.screenRightBoundary,this.screenBottomBoundary),n=new Qe,{first:s,last:a}=D,l=s.path.length;let u=[];for(let e=l-1;e>=1;e--)u.push(s.path[e]);for(let e=1;e<a.path.length;e++)u.push(a.path[e]);const m=2.5*t;c&&(u=u.map((([e,t,i],o)=>(x&&!E&&(i=x(o<l-1?s.tilePath[l-1-o]:a.tilePath[o-l+2])[2]),nt(e,t,i,c)))),u.some((e=>e[3]<=0))&&(u=[]));let g=[];if(u.length>0){let t=1/0,i=-1/0,n=1/0,s=-1/0;for(const e of u)t=Math.min(t,e[0]),n=Math.min(n,e[1]),i=Math.max(i,e[0]),s=Math.max(s,e[1]);i>=o.x&&t<=r.x&&s>=o.y&&n<=r.y&&(g=[u.map((t=>new e.pointGeometry(t[0],t[1])))],(t<o.x||i>r.x||n<o.y||s>r.y)&&(g=e.clipLine(g,o.x,o.y,r.x,r.y)));}for(const e of g){n.reset(e,.25*t);let o=0;o=n.length<=.5*t?1:Math.ceil(n.paddedLength/m)+1;for(let e=0;e<o;e++){const r=e/Math.max(o-1,1),s=n.lerp(r),a=s.x+gt,l=s.y+gt;f.push(a,l,t,0);const c=a-t,u=l-t,d=a+t,p=l+t;if(z=z&&this.isOffscreen(c,u,d,p),A=A||this.isInsideGrid(c,u,d,p),!i&&this.grid.hitTestCircle(a,l,t,_)&&(L=!0,!h))return {circles:[],offscreen:!1,collisionDetected:L,occluded:!1}}}}return {circles:!h&&L||!A?[]:f,offscreen:z,collisionDetected:L,occluded:C.occluded}}queryRenderedSymbols(t){if(0===t.length||0===this.grid.keysLength()&&0===this.ignoredGrid.keysLength())return {};const i=[];let o=1/0,r=1/0,n=-1/0,s=-1/0;for(const a of t){const t=new e.pointGeometry(a.x+gt,a.y+gt);o=Math.min(o,t.x),r=Math.min(r,t.y),n=Math.max(n,t.x),s=Math.max(s,t.y),i.push(t);}const a=this.grid.query(o,r,n,s).concat(this.ignoredGrid.query(o,r,n,s)),l={},c={};for(const t of a){const o=t.key;if(void 0===l[o.bucketInstanceId]&&(l[o.bucketInstanceId]={}),l[o.bucketInstanceId][o.featureIndex])continue;const r=[new e.pointGeometry(t.x1,t.y1),new e.pointGeometry(t.x2,t.y1),new e.pointGeometry(t.x2,t.y2),new e.pointGeometry(t.x1,t.y2)];e.polygonIntersectsPolygon(i,r)&&(l[o.bucketInstanceId][o.featureIndex]=!0,void 0===c[o.bucketInstanceId]&&(c[o.bucketInstanceId]=[]),c[o.bucketInstanceId].push(o.featureIndex));}return c}insertCollisionBox(e,t,i,o,r){(t?this.ignoredGrid:this.grid).insert({bucketInstanceId:i,featureIndex:o,collisionGroupID:r},e[0],e[1],e[2],e[3]);}insertCollisionCircles(e,t,i,o,r){const n=t?this.ignoredGrid:this.grid,s={bucketInstanceId:i,featureIndex:o,collisionGroupID:r};for(let t=0;t<e.length;t+=4)n.insertCircle(s,e[t],e[t+1],e[t+2]);}projectAndGetPerspectiveRatio(t,i,o,r,n,s,a){const l=[i,o,r,1];let c=!1;if(r||this.transform.pitch>0){e.transformMat4$1(l,l,t);const s=\"globe\"===a.name;if(this.fogState&&n&&!s){const t=function(t,i,o,r,n,s){const a=s.calculateFogTileMatrix(n),l=[i,o,r];return e.transformMat4(l,l,a),I(t,l,s.pitch,s._fov)}(this.fogState,i,o,r,n.toUnwrapped(),this.transform);c=t>.9;}}else ft(l,l,t);const h=l[3];return {point:new e.pointGeometry((l[0]/h+1)/2*this.transform.width+gt,(-l[1]/h+1)/2*this.transform.height+gt),perspectiveRatio:Math.min(.5+this.transform.getCameraToCenterDistance(a)/h*.5,1.5),signedDistanceFromCamera:h,occluded:s&&l[2]>h||c}}isOffscreen(e,t,i,o){return i<gt||e>=this.screenRightBoundary||o<gt||t>this.screenBottomBoundary}isInsideGrid(e,t,i,o){return i>=0&&e<this.gridRightBoundary&&o>=0&&t<this.gridBottomBoundary}getViewportMatrix(){const t=e.identity([]);return e.translate(t,t,[-100,-100,0]),t}}function xt(t,i,o){const r=i.createTileMatrix(t,t.worldSize,o.toUnwrapped());return e.multiply(new Float32Array(16),t.projMatrix,r)}function yt(e,t,i){if(t.projection.name===i.projection.name)return e.projMatrix;const o=i.clone();return o.setProjection(t.projection),xt(o,t.getProjection(),e)}function bt(e,t,i){return t.name===i.projection.name?e.projMatrix:xt(i,t,e)}class wt{constructor(e,t,i,o){this.opacity=e?Math.max(0,Math.min(1,e.opacity+(e.placed?t:-t))):o&&i?1:0,this.placed=i;}isHidden(){return 0===this.opacity&&!this.placed}}class Tt{constructor(e,t,i,o,r,n=!1){this.text=new wt(e?e.text:null,t,i,r),this.icon=new wt(e?e.icon:null,t,o,r),this.clipped=n;}isHidden(){return this.text.isHidden()&&this.icon.isHidden()}}class Et{constructor(e,t,i,o=!1){this.text=e,this.icon=t,this.skipFade=i,this.clipped=o;}}class Ct{constructor(){this.invProjMatrix=e.create(),this.viewportMatrix=e.create(),this.circles=[];}}class Mt{constructor(e,t,i,o,r){this.bucketInstanceId=e,this.featureIndex=t,this.sourceLayerIndex=i,this.bucketIndex=o,this.tileID=r;}}class It{constructor(e){this.crossSourceCollisions=e,this.maxGroupID=0,this.collisionGroups={};}get(e){if(this.crossSourceCollisions)return {ID:0,predicate:null};if(!this.collisionGroups[e]){const t=++this.maxGroupID;this.collisionGroups[e]={ID:t,predicate:e=>e.collisionGroupID===t};}return this.collisionGroups[e]}}function St(t,i,o,r,n){const{horizontalAlign:s,verticalAlign:a}=e.getAnchorAlignment(t),l=-(s-.5)*i,c=-(a-.5)*o,h=e.evaluateVariableOffset(t,r);return new e.pointGeometry(l+h[0]*n,c+h[1]*n)}function Dt(t,i,o,r,n){const s=new e.pointGeometry(t,i);return o&&s._rotate(r?n:-n),s}class Lt{constructor(e,t,i,o,r){this.transform=e.clone(),this.projection=e.projection.name,this.collisionIndex=new vt(this.transform,r),this.placements={},this.opacities={},this.variableOffsets={},this.stale=!1,this.commitTime=0,this.fadeDuration=t,this.retainedQueryData={},this.collisionGroups=new It(i),this.collisionCircleArrays={},this.prevPlacement=o,o&&(o.prevPlacement=void 0),this.placedOrientations={};}getBucketParts(t,i,o,r){const n=o.getBucket(i),s=o.latestFeatureIndex;if(!n||!s||i.id!==n.layerIds[0])return;const a=n.layers[0].layout,l=o.collisionBoxArray,c=Math.pow(2,this.transform.zoom-o.tileID.overscaledZ),h=o.tileSize/e.EXTENT,u=o.tileID.toUnwrapped();this.transform.setProjection(n.projection);const _=(d=o.tileID,p=n.getProjection(),m=this.transform,p.name===this.projection?m.calculateProjMatrix(d.toUnwrapped()):xt(m,p,d));var d,p,m;const f=\"map\"===a.get(\"text-pitch-alignment\"),g=\"map\"===a.get(\"text-rotation-alignment\");i.compileFilter();const v=i.dynamicFilter(),x=i.dynamicFilterNeedsFeature(),y=this.transform.calculatePixelsToTileUnitsMatrix(o),b=ot(_,o.tileID.canonical,f,g,this.transform,n.getProjection(),y);let w=null;if(f){const t=rt(_,o.tileID.canonical,f,g,this.transform,n.getProjection(),y);w=e.multiply([],this.transform.labelPlaneMatrix,t);}let T=null;v&&o.latestFeatureIndex&&(T={unwrappedTileID:u,dynamicFilter:v,dynamicFilterNeedsFeature:x,featureIndex:o.latestFeatureIndex}),this.retainedQueryData[n.bucketInstanceId]=new Mt(n.bucketInstanceId,s,n.sourceLayerIndex,n.index,o.tileID);const E={bucket:n,layout:a,posMatrix:_,textLabelPlaneMatrix:b,labelToScreenMatrix:w,clippingData:T,scale:c,textPixelRatio:h,holdingForFade:o.holdingForFade(),collisionBoxArray:l,partiallyEvaluatedTextSize:e.evaluateSizeForZoom(n.textSizeData,this.transform.zoom),partiallyEvaluatedIconSize:e.evaluateSizeForZoom(n.iconSizeData,this.transform.zoom),collisionGroup:this.collisionGroups.get(n.sourceID)};if(r)for(const e of n.sortKeyRanges){const{sortKey:i,symbolInstanceStart:o,symbolInstanceEnd:r}=e;t.push({sortKey:i,symbolInstanceStart:o,symbolInstanceEnd:r,parameters:E});}else t.push({symbolInstanceStart:0,symbolInstanceEnd:n.symbolInstances.length,parameters:E});}attemptAnchorPlacement(e,t,i,o,r,n,s,a,l,c,h,u,_,d,p,m,f,g){const{textOffset0:v,textOffset1:x,crossTileID:y}=u,b=[v,x],w=St(e,i,o,b,r),T=this.collisionIndex.placeCollisionBox(d,r,t,Dt(w.x,w.y,n,s,this.transform.angle),h,a,l,c.predicate);if(m){const e=d.getSymbolInstanceIconSize(g,this.transform.zoom,u.placedIconSymbolIndex);if(0===this.collisionIndex.placeCollisionBox(d,e,m,Dt(w.x,w.y,n,s,this.transform.angle),h,a,l,c.predicate).box.length)return}if(T.box.length>0){let t;return this.prevPlacement&&this.prevPlacement.variableOffsets[y]&&this.prevPlacement.placements[y]&&this.prevPlacement.placements[y].text&&(t=this.prevPlacement.variableOffsets[y].anchor),this.variableOffsets[y]={textOffset:b,width:i,height:o,anchor:e,textScale:r,prevAnchor:t},this.markUsedJustification(d,e,u,p),d.allowVerticalPlacement&&(this.markUsedOrientation(d,p,u),this.placedOrientations[y]=p),{shift:w,placedGlyphBoxes:T}}}placeLayerBucketPart(t,i,o,r){const{bucket:n,layout:s,posMatrix:a,textLabelPlaneMatrix:l,labelToScreenMatrix:c,clippingData:h,textPixelRatio:u,holdingForFade:_,collisionBoxArray:d,partiallyEvaluatedTextSize:p,partiallyEvaluatedIconSize:m,collisionGroup:f}=t.parameters,g=s.get(\"text-optional\"),v=s.get(\"icon-optional\"),x=s.get(\"text-allow-overlap\"),y=s.get(\"icon-allow-overlap\"),b=\"map\"===s.get(\"text-rotation-alignment\"),w=\"map\"===s.get(\"text-pitch-alignment\"),T=\"none\"!==s.get(\"icon-text-fit\"),E=\"viewport-y\"===s.get(\"symbol-z-order\");this.transform.setProjection(n.projection);let C=x&&(y||!n.hasIconData()||v),M=y&&(x||!n.hasTextData()||g);!n.collisionArrays&&d&&n.deserializeCollisionBoxes(d),o&&r&&n.updateCollisionDebugBuffers(this.transform.zoom,d);const I=(t,r,d)=>{const{crossTileID:E,numVerticalGlyphVertices:I}=t;if(h){const o={zoom:this.transform.zoom,pitch:this.transform.pitch};let r=null;if(h.dynamicFilterNeedsFeature){const e=this.retainedQueryData[n.bucketInstanceId];r=h.featureIndex.loadFeature({featureIndex:t.featureIndex,bucketIndex:e.bucketIndex,sourceLayerIndex:e.sourceLayerIndex,layoutVertexArrayOffset:0});}if(!(0,h.dynamicFilter)(o,r,this.retainedQueryData[n.bucketInstanceId].tileID.canonical,new e.pointGeometry(t.tileAnchorX,t.tileAnchorY),this.transform.calculateDistanceTileData(h.unwrappedTileID)))return this.placements[E]=new Et(!1,!1,!1,!0),void(i[E]=!0)}if(i[E])return;if(_)return void(this.placements[E]=new Et(!1,!1,!1));let S=!1,D=!1,L=!0,A=!1,z=!1,P=null,R={box:null,offscreen:null,occluded:null},O={box:null,offscreen:null,occluded:null},B=null,k=null,F=null,U=0,N=0,G=0;d.textFeatureIndex?U=d.textFeatureIndex:t.useRuntimeCollisionCircles&&(U=t.featureIndex),d.verticalTextFeatureIndex&&(N=d.verticalTextFeatureIndex);const j=e=>{e.tileID=this.retainedQueryData[n.bucketInstanceId].tileID;const t=this.transform.elevation;(t||e.elevation)&&(e.elevation=t?t.getAtTileOffset(e.tileID,e.tileAnchorX,e.tileAnchorY):0);},Z=d.textBox;if(Z){j(Z);const i=i=>{let o=e.WritingMode.horizontal;if(n.allowVerticalPlacement&&!i&&this.prevPlacement){const e=this.prevPlacement.placedOrientations[E];e&&(this.placedOrientations[E]=e,o=e,this.markUsedOrientation(n,o,t));}return o},o=(t,i)=>{if(n.allowVerticalPlacement&&I>0&&d.verticalTextBox){for(const o of n.writingModes)if(o===e.WritingMode.vertical?(R=i(),O=R):R=t(),R&&R.box&&R.box.length)break}else R=t();};if(s.get(\"text-variable-anchor\")){let l=s.get(\"text-variable-anchor\");if(this.prevPlacement&&this.prevPlacement.variableOffsets[E]){const e=this.prevPlacement.variableOffsets[E];l.indexOf(e.anchor)>0&&(l=l.filter((t=>t!==e.anchor)),l.unshift(e.anchor));}const c=(e,i,o)=>{const s=n.getSymbolInstanceTextSize(p,t,this.transform.zoom,r),c=(e.x2-e.x1)*s+2*e.padding,h=(e.y2-e.y1)*s+2*e.padding,_=T&&!y?i:null;_&&j(_);let d={box:[],offscreen:!1,occluded:!1};const g=x?2*l.length:l.length;for(let i=0;i<g;++i){const g=this.attemptAnchorPlacement(l[i%l.length],e,c,h,s,b,w,u,a,f,i>=l.length,t,r,n,o,_,p,m);if(g&&(d=g.placedGlyphBoxes,d&&d.box&&d.box.length)){S=!0,P=g.shift;break}}return d};o((()=>c(Z,d.iconBox,e.WritingMode.horizontal)),(()=>{const t=d.verticalTextBox;return t&&j(t),n.allowVerticalPlacement&&!(R&&R.box&&R.box.length)&&I>0&&t?c(t,d.verticalIconBox,e.WritingMode.vertical):{box:null,offscreen:null,occluded:null}})),R&&(S=R.box,L=R.offscreen,A=R.occluded);const h=i(R&&R.box);if(!S&&this.prevPlacement){const e=this.prevPlacement.variableOffsets[E];e&&(this.variableOffsets[E]=e,this.markUsedJustification(n,e.anchor,t,h));}}else {const s=(i,o)=>{const s=n.getSymbolInstanceTextSize(p,t,this.transform.zoom,r),l=this.collisionIndex.placeCollisionBox(n,s,i,new e.pointGeometry(0,0),x,u,a,f.predicate);return l&&l.box&&l.box.length&&(this.markUsedOrientation(n,o,t),this.placedOrientations[E]=o),l};o((()=>s(Z,e.WritingMode.horizontal)),(()=>{const t=d.verticalTextBox;return n.allowVerticalPlacement&&I>0&&t?(j(t),s(t,e.WritingMode.vertical)):{box:null,offscreen:null,occluded:null}})),i(R&&R.box&&R.box.length);}}if(B=R,S=B&&B.box&&B.box.length>0,L=B&&B.offscreen,A=B&&B.occluded,t.useRuntimeCollisionCircles){const i=n.text.placedSymbolArray.get(t.centerJustifiedTextSymbolIndex>=0?t.centerJustifiedTextSymbolIndex:t.verticalPlacedTextSymbolIndex),r=e.evaluateSizeForFeature(n.textSizeData,p,i),h=s.get(\"text-padding\");k=this.collisionIndex.placeCollisionCircles(n,x,i,n.lineVertexArray,n.glyphOffsetArray,r,a,l,c,o,w,f.predicate,t.collisionCircleDiameter*r/e.ONE_EM,h,this.retainedQueryData[n.bucketInstanceId].tileID),S=x||k.circles.length>0&&!k.collisionDetected,L=L&&k.offscreen,A=k.occluded;}if(d.iconFeatureIndex&&(G=d.iconFeatureIndex),d.iconBox){const i=i=>{j(i);const o=T&&P?Dt(P.x,P.y,b,w,this.transform.angle):new e.pointGeometry(0,0),r=n.getSymbolInstanceIconSize(m,this.transform.zoom,t.placedIconSymbolIndex);return this.collisionIndex.placeCollisionBox(n,r,i,o,y,u,a,f.predicate)};O&&O.box&&O.box.length&&d.verticalIconBox?(F=i(d.verticalIconBox),D=F.box.length>0):(F=i(d.iconBox),D=F.box.length>0),L=L&&F.offscreen,z=F.occluded;}const V=g||0===t.numHorizontalGlyphVertices&&0===I,W=v||0===t.numIconVertices;if(V||W?W?V||(D=D&&S):S=D&&S:D=S=D&&S,S&&B&&B.box&&this.collisionIndex.insertCollisionBox(B.box,s.get(\"text-ignore-placement\"),n.bucketInstanceId,O&&O.box&&N?N:U,f.ID),D&&F&&this.collisionIndex.insertCollisionBox(F.box,s.get(\"icon-ignore-placement\"),n.bucketInstanceId,G,f.ID),k&&(S&&this.collisionIndex.insertCollisionCircles(k.circles,s.get(\"text-ignore-placement\"),n.bucketInstanceId,U,f.ID),o)){const e=n.bucketInstanceId;let t=this.collisionCircleArrays[e];void 0===t&&(t=this.collisionCircleArrays[e]=new Ct);for(let e=0;e<k.circles.length;e+=4)t.circles.push(k.circles[e+0]),t.circles.push(k.circles[e+1]),t.circles.push(k.circles[e+2]),t.circles.push(k.collisionDetected?1:0);}const X=\"globe\"!==n.projection.name;C=C&&(X||!A),M=M&&(X||!z),this.placements[E]=new Et(S||C,D||M,L||n.justReloaded),i[E]=!0;};if(E){const e=n.getSortedSymbolIndexes(this.transform.angle);for(let t=e.length-1;t>=0;--t){const i=e[t];I(n.symbolInstances.get(i),i,n.collisionArrays[i]);}}else for(let e=t.symbolInstanceStart;e<t.symbolInstanceEnd;e++)I(n.symbolInstances.get(e),e,n.collisionArrays[e]);if(o&&n.bucketInstanceId in this.collisionCircleArrays){const t=this.collisionCircleArrays[n.bucketInstanceId];e.invert(t.invProjMatrix,a),t.viewportMatrix=this.collisionIndex.getViewportMatrix();}n.justReloaded=!1;}markUsedJustification(t,i,o,r){const{leftJustifiedTextSymbolIndex:n,centerJustifiedTextSymbolIndex:s,rightJustifiedTextSymbolIndex:a,verticalPlacedTextSymbolIndex:l,crossTileID:c}=o,h=e.getAnchorJustification(i),u=r===e.WritingMode.vertical?l:\"left\"===h?n:\"center\"===h?s:\"right\"===h?a:-1;n>=0&&(t.text.placedSymbolArray.get(n).crossTileID=u>=0&&n!==u?0:c),s>=0&&(t.text.placedSymbolArray.get(s).crossTileID=u>=0&&s!==u?0:c),a>=0&&(t.text.placedSymbolArray.get(a).crossTileID=u>=0&&a!==u?0:c),l>=0&&(t.text.placedSymbolArray.get(l).crossTileID=u>=0&&l!==u?0:c);}markUsedOrientation(t,i,o){const r=i===e.WritingMode.horizontal||i===e.WritingMode.horizontalOnly?i:0,n=i===e.WritingMode.vertical?i:0,{leftJustifiedTextSymbolIndex:s,centerJustifiedTextSymbolIndex:a,rightJustifiedTextSymbolIndex:l,verticalPlacedTextSymbolIndex:c}=o,h=t.text.placedSymbolArray;s>=0&&(h.get(s).placedOrientation=r),a>=0&&(h.get(a).placedOrientation=r),l>=0&&(h.get(l).placedOrientation=r),c>=0&&(h.get(c).placedOrientation=n);}commit(e){this.commitTime=e,this.zoomAtLastRecencyCheck=this.transform.zoom;const t=this.prevPlacement;let i=!1;this.prevZoomAdjustment=t?t.zoomAdjustment(this.transform.zoom):0;const o=t?t.symbolFadeChange(e):1,r=t?t.opacities:{},n=t?t.variableOffsets:{},s=t?t.placedOrientations:{};for(const e in this.placements){const t=this.placements[e],n=r[e];n?(this.opacities[e]=new Tt(n,o,t.text,t.icon,null,t.clipped),i=i||t.text!==n.text.placed||t.icon!==n.icon.placed):(this.opacities[e]=new Tt(null,o,t.text,t.icon,t.skipFade,t.clipped),i=i||t.text||t.icon);}for(const e in r){const t=r[e];if(!this.opacities[e]){const r=new Tt(t,o,!1,!1);r.isHidden()||(this.opacities[e]=r,i=i||t.text.placed||t.icon.placed);}}for(const e in n)this.variableOffsets[e]||!this.opacities[e]||this.opacities[e].isHidden()||(this.variableOffsets[e]=n[e]);for(const e in s)this.placedOrientations[e]||!this.opacities[e]||this.opacities[e].isHidden()||(this.placedOrientations[e]=s[e]);i?this.lastPlacementChangeTime=e:\"number\"!=typeof this.lastPlacementChangeTime&&(this.lastPlacementChangeTime=t?t.lastPlacementChangeTime:e);}updateLayerOpacities(e,t){const i={};for(const o of t){const t=o.getBucket(e);t&&o.latestFeatureIndex&&e.id===t.layerIds[0]&&this.updateBucketOpacities(t,i,o.collisionBoxArray);}}updateBucketOpacities(t,i,o){t.hasTextData()&&t.text.opacityVertexArray.clear(),t.hasIconData()&&t.icon.opacityVertexArray.clear(),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexArray.clear(),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexArray.clear();const r=t.layers[0].layout,n=!!t.layers[0].dynamicFilter(),s=new Tt(null,0,!1,!1,!0),a=r.get(\"text-allow-overlap\"),l=r.get(\"icon-allow-overlap\"),c=r.get(\"text-variable-anchor\"),h=\"map\"===r.get(\"text-rotation-alignment\"),u=\"map\"===r.get(\"text-pitch-alignment\"),_=\"none\"!==r.get(\"icon-text-fit\"),d=new Tt(null,0,a&&(l||!t.hasIconData()||r.get(\"icon-optional\")),l&&(a||!t.hasTextData()||r.get(\"text-optional\")),!0);!t.collisionArrays&&o&&(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData())&&t.deserializeCollisionBoxes(o);const p=(e,t,i)=>{for(let o=0;o<t/4;o++)e.opacityVertexArray.emplaceBack(i);};let m=0;for(let o=0;o<t.symbolInstances.length;o++){const r=t.symbolInstances.get(o),{numHorizontalGlyphVertices:a,numVerticalGlyphVertices:l,crossTileID:f,numIconVertices:g}=r;let v=this.opacities[f];i[f]?v=s:v||(v=d,this.opacities[f]=v),i[f]=!0;const x=a>0||l>0,y=g>0,b=this.placedOrientations[f],w=b===e.WritingMode.vertical,T=b===e.WritingMode.horizontal||b===e.WritingMode.horizontalOnly;if(!x&&!y||v.isHidden()||m++,x){const e=Ut(v.text);p(t.text,a,w?Nt:e),p(t.text,l,T?Nt:e);const i=v.text.isHidden(),{leftJustifiedTextSymbolIndex:o,centerJustifiedTextSymbolIndex:n,rightJustifiedTextSymbolIndex:s,verticalPlacedTextSymbolIndex:c}=r,h=t.text.placedSymbolArray,u=i||w?1:0;o>=0&&(h.get(o).hidden=u),n>=0&&(h.get(n).hidden=u),s>=0&&(h.get(s).hidden=u),c>=0&&(h.get(c).hidden=i||T?1:0);const _=this.variableOffsets[f];_&&this.markUsedJustification(t,_.anchor,r,b);const d=this.placedOrientations[f];d&&(this.markUsedJustification(t,\"left\",r,d),this.markUsedOrientation(t,d,r));}if(y){const e=Ut(v.icon),{placedIconSymbolIndex:i,verticalPlacedIconSymbolIndex:o}=r,n=t.icon.placedSymbolArray,s=v.icon.isHidden()?1:0;i>=0&&(p(t.icon,g,w?Nt:e),n.get(i).hidden=s),o>=0&&(p(t.icon,r.numVerticalIconVertices,T?Nt:e),n.get(o).hidden=s);}if(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData()){const i=t.collisionArrays[o];if(i){let o=new e.pointGeometry(0,0),r=!0;if(i.textBox||i.verticalTextBox){if(c){const e=this.variableOffsets[f];e?(o=St(e.anchor,e.width,e.height,e.textOffset,e.textScale),h&&o._rotate(u?this.transform.angle:-this.transform.angle)):r=!1;}n&&(r=!v.clipped),i.textBox&&At(t.textCollisionBox.collisionVertexArray,v.text.placed,!r||w,o.x,o.y),i.verticalTextBox&&At(t.textCollisionBox.collisionVertexArray,v.text.placed,!r||T,o.x,o.y);}const s=r&&Boolean(!T&&i.verticalIconBox);i.iconBox&&At(t.iconCollisionBox.collisionVertexArray,v.icon.placed,s,_?o.x:0,_?o.y:0),i.verticalIconBox&&At(t.iconCollisionBox.collisionVertexArray,v.icon.placed,!s,_?o.x:0,_?o.y:0);}}}if(t.fullyClipped=0===m,t.sortFeatures(this.transform.angle),this.retainedQueryData[t.bucketInstanceId]&&(this.retainedQueryData[t.bucketInstanceId].featureSortOrder=t.featureSortOrder),t.hasTextData()&&t.text.opacityVertexBuffer&&t.text.opacityVertexBuffer.updateData(t.text.opacityVertexArray),t.hasIconData()&&t.icon.opacityVertexBuffer&&t.icon.opacityVertexBuffer.updateData(t.icon.opacityVertexArray),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexBuffer&&t.iconCollisionBox.collisionVertexBuffer.updateData(t.iconCollisionBox.collisionVertexArray),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexBuffer&&t.textCollisionBox.collisionVertexBuffer.updateData(t.textCollisionBox.collisionVertexArray),t.bucketInstanceId in this.collisionCircleArrays){const e=this.collisionCircleArrays[t.bucketInstanceId];t.placementInvProjMatrix=e.invProjMatrix,t.placementViewportMatrix=e.viewportMatrix,t.collisionCircleArray=e.circles,delete this.collisionCircleArrays[t.bucketInstanceId];}}symbolFadeChange(e){return 0===this.fadeDuration?1:(e-this.commitTime)/this.fadeDuration+this.prevZoomAdjustment}zoomAdjustment(e){return Math.max(0,(this.transform.zoom-e)/1.5)}hasTransitions(e){return this.stale||e-this.lastPlacementChangeTime<this.fadeDuration}stillRecent(e,t){const i=this.zoomAtLastRecencyCheck===t?1-this.zoomAdjustment(t):1;return this.zoomAtLastRecencyCheck=t,this.commitTime+this.fadeDuration*i>e}setStale(){this.stale=!0;}}function At(e,t,i,o,r){e.emplaceBack(t?1:0,i?1:0,o||0,r||0),e.emplaceBack(t?1:0,i?1:0,o||0,r||0),e.emplaceBack(t?1:0,i?1:0,o||0,r||0),e.emplaceBack(t?1:0,i?1:0,o||0,r||0);}const zt=Math.pow(2,25),Pt=Math.pow(2,24),Rt=Math.pow(2,17),Ot=Math.pow(2,16),Bt=Math.pow(2,9),kt=Math.pow(2,8),Ft=Math.pow(2,1);function Ut(e){if(0===e.opacity&&!e.placed)return 0;if(1===e.opacity&&e.placed)return 4294967295;const t=e.placed?1:0,i=Math.floor(127*e.opacity);return i*zt+t*Pt+i*Rt+t*Ot+i*Bt+t*kt+i*Ft+t}const Nt=0;class Gt{constructor(e){this._sortAcrossTiles=\"viewport-y\"!==e.layout.get(\"symbol-z-order\")&&void 0!==e.layout.get(\"symbol-sort-key\").constantOr(1),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[];}continuePlacement(e,t,i,o,r){const n=this._bucketParts;for(;this._currentTileIndex<e.length;)if(t.getBucketParts(n,o,e[this._currentTileIndex],this._sortAcrossTiles),this._currentTileIndex++,r())return !0;for(this._sortAcrossTiles&&(this._sortAcrossTiles=!1,n.sort(((e,t)=>e.sortKey-t.sortKey)));this._currentPartIndex<n.length;){const e=n[this._currentPartIndex];if(t.placeLayerBucketPart(e,this._seenCrossTileIDs,i,0===e.symbolInstanceStart),this._currentPartIndex++,r())return !0}return !1}}class jt{constructor(e,t,i,o,r,n,s,a){this.placement=new Lt(e,r,n,s,a),this._currentPlacementIndex=t.length-1,this._forceFullPlacement=i,this._showCollisionBoxes=o,this._done=!1;}isDone(){return this._done}continuePlacement(t,i,o){const r=e.exported.now(),n=()=>{const t=e.exported.now()-r;return !this._forceFullPlacement&&t>2};for(;this._currentPlacementIndex>=0;){const e=i[t[this._currentPlacementIndex]],r=this.placement.collisionIndex.transform.zoom;if(\"symbol\"===e.type&&(!e.minzoom||e.minzoom<=r)&&(!e.maxzoom||e.maxzoom>r)){if(this._inProgressLayer||(this._inProgressLayer=new Gt(e)),this._inProgressLayer.continuePlacement(o[e.source],this.placement,this._showCollisionBoxes,e,n))return;delete this._inProgressLayer;}this._currentPlacementIndex--;}this._done=!0;}commit(e){return this.placement.commit(e),this.placement}}const Zt=512/e.EXTENT/2;class Vt{constructor(e,t,i){this.tileID=e,this.indexedSymbolInstances={},this.bucketInstanceId=i;for(let i=0;i<t.length;i++){const o=t.get(i),r=o.key;this.indexedSymbolInstances[r]||(this.indexedSymbolInstances[r]=[]),this.indexedSymbolInstances[r].push({crossTileID:o.crossTileID,coord:this.getScaledCoordinates(o,e)});}}getScaledCoordinates(t,i){const o=Zt/Math.pow(2,i.canonical.z-this.tileID.canonical.z);return {x:Math.floor((i.canonical.x*e.EXTENT+t.tileAnchorX)*o),y:Math.floor((i.canonical.y*e.EXTENT+t.tileAnchorY)*o)}}findMatches(e,t,i){const o=this.tileID.canonical.z<t.canonical.z?1:Math.pow(2,this.tileID.canonical.z-t.canonical.z);for(let r=0;r<e.length;r++){const n=e.get(r);if(n.crossTileID)continue;const s=this.indexedSymbolInstances[n.key];if(!s)continue;const a=this.getScaledCoordinates(n,t);for(const e of s)if(Math.abs(e.coord.x-a.x)<=o&&Math.abs(e.coord.y-a.y)<=o&&!i[e.crossTileID]){i[e.crossTileID]=!0,n.crossTileID=e.crossTileID;break}}}}class Wt{constructor(){this.maxCrossTileID=0;}generate(){return ++this.maxCrossTileID}}class Xt{constructor(){this.indexes={},this.usedCrossTileIDs={},this.lng=0;}handleWrapJump(e){const t=Math.round((e-this.lng)/360);if(0!==t)for(const e in this.indexes){const i=this.indexes[e],o={};for(const e in i){const r=i[e];r.tileID=r.tileID.unwrapTo(r.tileID.wrap+t),o[r.tileID.key]=r;}this.indexes[e]=o;}this.lng=e;}addBucket(e,t,i){if(this.indexes[e.overscaledZ]&&this.indexes[e.overscaledZ][e.key]){if(this.indexes[e.overscaledZ][e.key].bucketInstanceId===t.bucketInstanceId)return !1;this.removeBucketCrossTileIDs(e.overscaledZ,this.indexes[e.overscaledZ][e.key]);}for(let e=0;e<t.symbolInstances.length;e++)t.symbolInstances.get(e).crossTileID=0;this.usedCrossTileIDs[e.overscaledZ]||(this.usedCrossTileIDs[e.overscaledZ]={});const o=this.usedCrossTileIDs[e.overscaledZ];for(const i in this.indexes){const r=this.indexes[i];if(Number(i)>e.overscaledZ)for(const i in r){const n=r[i];n.tileID.isChildOf(e)&&n.findMatches(t.symbolInstances,e,o);}else {const n=r[e.scaledTo(Number(i)).key];n&&n.findMatches(t.symbolInstances,e,o);}}for(let e=0;e<t.symbolInstances.length;e++){const r=t.symbolInstances.get(e);r.crossTileID||(r.crossTileID=i.generate(),o[r.crossTileID]=!0);}return void 0===this.indexes[e.overscaledZ]&&(this.indexes[e.overscaledZ]={}),this.indexes[e.overscaledZ][e.key]=new Vt(e,t.symbolInstances,t.bucketInstanceId),!0}removeBucketCrossTileIDs(e,t){for(const i in t.indexedSymbolInstances)for(const o of t.indexedSymbolInstances[i])delete this.usedCrossTileIDs[e][o.crossTileID];}removeStaleBuckets(e){let t=!1;for(const i in this.indexes){const o=this.indexes[i];for(const r in o)e[o[r].bucketInstanceId]||(this.removeBucketCrossTileIDs(i,o[r]),delete o[r],t=!0);}return t}}class qt{constructor(){this.layerIndexes={},this.crossTileIDs=new Wt,this.maxBucketInstanceId=0,this.bucketsInCurrentPlacement={};}addLayer(e,t,i,o){let r=this.layerIndexes[e.id];void 0===r&&(r=this.layerIndexes[e.id]=new Xt);let n=!1;const s={};\"globe\"!==o.name&&r.handleWrapJump(i);for(const i of t){const t=i.getBucket(e);t&&e.id===t.layerIds[0]&&(t.bucketInstanceId||(t.bucketInstanceId=++this.maxBucketInstanceId),r.addBucket(i.tileID,t,this.crossTileIDs)&&(n=!0),s[t.bucketInstanceId]=!0);}return r.removeStaleBuckets(s)&&(n=!0),n}pruneUnusedLayers(e){const t={};e.forEach((e=>{t[e]=!0;}));for(const e in this.layerIndexes)t[e]||delete this.layerIndexes[e];}}const $t=(t,i)=>e.emitValidationErrors(t,i&&i.filter((e=>\"source.canvas\"!==e.identifier))),Ht=e.pick(We,[\"addLayer\",\"removeLayer\",\"setPaintProperty\",\"setLayoutProperty\",\"setFilter\",\"addSource\",\"removeSource\",\"setLayerZoomRange\",\"setLight\",\"setTransition\",\"setGeoJSONSourceData\",\"setTerrain\",\"setFog\",\"setProjection\"]),Yt=e.pick(We,[\"setCenter\",\"setZoom\",\"setBearing\",\"setPitch\"]),Kt={version:8,layers:[],sources:{}},Jt={fill:!0,line:!0,background:!0,hillshade:!0,raster:!0};class Qt extends e.Evented{constructor(t,i={}){super(),this.map=t,this.dispatcher=new z(je(),this),this.imageManager=new y,this.imageManager.setEventedParent(this),this.glyphManager=new e.GlyphManager(t._requestManager,i.localFontFamily?e.LocalGlyphMode.all:i.localIdeographFontFamily?e.LocalGlyphMode.ideographs:e.LocalGlyphMode.none,i.localFontFamily||i.localIdeographFontFamily),this.crossTileSymbolIndex=new qt,this._layers={},this._num3DLayers=0,this._numSymbolLayers=0,this._numCircleLayers=0,this._serializedLayers={},this._sourceCaches={},this._otherSourceCaches={},this._symbolSourceCaches={},this._loaded=!1,this._availableImages=[],this._order=[],this._drapedFirstOrder=[],this._markersNeedUpdate=!1,this._resetUpdates(),this.dispatcher.broadcast(\"setReferrer\",e.getReferrer());const o=this;this._rtlTextPluginCallback=Qt.registerForPluginStateChange((t=>{o.dispatcher.broadcast(\"syncRTLPluginState\",{pluginStatus:t.pluginStatus,pluginURL:t.pluginURL},((t,i)=>{if(e.triggerPluginCompletionEvent(t),i&&i.every((e=>e)))for(const e in o._sourceCaches){const t=o._sourceCaches[e],i=t.getSource().type;\"vector\"!==i&&\"geojson\"!==i||t.reload();}}));})),this.on(\"data\",(e=>{if(\"source\"!==e.dataType||\"metadata\"!==e.sourceDataType)return;const t=this.getSource(e.sourceId);if(t&&t.vectorLayerIds)for(const e in this._layers){const i=this._layers[e];i.source===t.id&&this._validateLayer(i);}}));}loadURL(t,i={}){this.fire(new e.Event(\"dataloading\",{dataType:\"style\"}));const o=\"boolean\"==typeof i.validate?i.validate:!e.isMapboxURL(t);t=this.map._requestManager.normalizeStyleURL(t,i.accessToken);const r=this.map._requestManager.transformRequest(t,e.ResourceType.Style);this._request=e.getJSON(r,((t,i)=>{this._request=null,t?this.fire(new e.ErrorEvent(t)):i&&this._load(i,o);}));}loadJSON(t,i={}){this.fire(new e.Event(\"dataloading\",{dataType:\"style\"})),this._request=e.exported.frame((()=>{this._request=null,this._load(t,!1!==i.validate);}));}loadEmpty(){this.fire(new e.Event(\"dataloading\",{dataType:\"style\"})),this._load(Kt,!1);}_updateLayerCount(e,t){const i=t?1:-1;e.is3D()&&(this._num3DLayers+=i),\"circle\"===e.type&&(this._numCircleLayers+=i),\"symbol\"===e.type&&(this._numSymbolLayers+=i);}_load(t,i){if(i&&$t(this,e.validateStyle(t)))return;this._loaded=!0,this.stylesheet=e.clone$1(t),this._updateMapProjection();for(const e in t.sources)this.addSource(e,t.sources[e],{validate:!1});this._changed=!1,t.sprite?this._loadSprite(t.sprite):(this.imageManager.setLoaded(!0),this.dispatcher.broadcast(\"spriteLoaded\",!0)),this.glyphManager.setURL(t.glyphs);const o=Ve(this.stylesheet.layers);this._order=o.map((e=>e.id)),this._layers={},this._serializedLayers={};for(let t of o)t=e.createStyleLayer(t),t.setEventedParent(this,{layer:{id:t.id}}),this._layers[t.id]=t,this._serializedLayers[t.id]=t.serialize(),this._updateLayerCount(t,!0);this.dispatcher.broadcast(\"setLayers\",this._serializeLayers(this._order)),this.light=new T(this.stylesheet.light),this.stylesheet.terrain&&!this.terrainSetForDrapingOnly()&&this._createTerrain(this.stylesheet.terrain,1),this.stylesheet.fog&&this._createFog(this.stylesheet.fog),this._updateDrapeFirstLayers(),this.fire(new e.Event(\"data\",{dataType:\"style\"})),this.fire(new e.Event(\"style.load\"));}terrainSetForDrapingOnly(){return !!this.terrain&&0===this.terrain.drapeRenderMode}setProjection(e){e?this.stylesheet.projection=e:delete this.stylesheet.projection,this._updateMapProjection();}applyProjectionUpdate(){this._loaded&&(this.dispatcher.broadcast(\"setProjection\",this.map.transform.projectionOptions),this.map.transform.projection.requiresDraping?this.getTerrain()||this.stylesheet.terrain||this.setTerrainForDraping():this.terrainSetForDrapingOnly()&&this.setTerrain(null));}_updateMapProjection(){this.map._useExplicitProjection?this.applyProjectionUpdate():this.map._prioritizeAndUpdateProjection(null,this.stylesheet.projection);}_loadSprite(t){this._spriteRequest=function(t,i,o){let r,n,s;const a=e.exported.devicePixelRatio>1?\"@2x\":\"\";let l=e.getJSON(i.transformRequest(i.normalizeSpriteURL(t,a,\".json\"),e.ResourceType.SpriteJSON),((e,t)=>{l=null,s||(s=e,r=t,h());})),c=e.getImage(i.transformRequest(i.normalizeSpriteURL(t,a,\".png\"),e.ResourceType.SpriteImage),((e,t)=>{c=null,s||(s=e,n=t,h());}));function h(){if(s)o(s);else if(r&&n){const t=e.exported.getImageData(n),i={};for(const o in r){const{width:n,height:s,x:a,y:l,sdf:c,pixelRatio:h,stretchX:u,stretchY:_,content:d}=r[o],p=new e.RGBAImage({width:n,height:s});e.RGBAImage.copy(t,p,{x:a,y:l},{x:0,y:0},{width:n,height:s}),i[o]={data:p,pixelRatio:h,sdf:c,stretchX:u,stretchY:_,content:d};}o(null,i);}}return {cancel(){l&&(l.cancel(),l=null),c&&(c.cancel(),c=null);}}}(t,this.map._requestManager,((t,i)=>{if(this._spriteRequest=null,t)this.fire(new e.ErrorEvent(t));else if(i)for(const e in i)this.imageManager.addImage(e,i[e]);this.imageManager.setLoaded(!0),this._availableImages=this.imageManager.listImages(),this.dispatcher.broadcast(\"setImages\",this._availableImages),this.dispatcher.broadcast(\"spriteLoaded\",!0),this.fire(new e.Event(\"data\",{dataType:\"style\"}));}));}_validateLayer(t){const i=this.getSource(t.source);if(!i)return;const o=t.sourceLayer;o&&(\"geojson\"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(o))&&this.fire(new e.ErrorEvent(new Error(`Source layer \"${o}\" does not exist on source \"${i.id}\" as specified by style layer \"${t.id}\"`)));}loaded(){if(!this._loaded)return !1;if(Object.keys(this._updatedSources).length)return !1;for(const e in this._sourceCaches)if(!this._sourceCaches[e].loaded())return !1;return !!this.imageManager.isLoaded()}_serializeLayers(e){const t=[];for(const i of e){const e=this._layers[i];\"custom\"!==e.type&&t.push(e.serialize());}return t}hasTransitions(){if(this.light&&this.light.hasTransition())return !0;if(this.fog&&this.fog.hasTransition())return !0;for(const e in this._sourceCaches)if(this._sourceCaches[e].hasTransition())return !0;for(const e in this._layers)if(this._layers[e].hasTransition())return !0;return !1}get order(){return this.map._optimizeForTerrain&&this.terrain?this._drapedFirstOrder:this._order}isLayerDraped(e){return !!this.terrain&&(\"function\"==typeof e.isLayerDraped?e.isLayerDraped():Jt[e.type])}_checkLoaded(){if(!this._loaded)throw new Error(\"Style is not done loading\")}update(t){if(!this._loaded)return;const i=this._changed;if(this._changed){const e=Object.keys(this._updatedLayers),i=Object.keys(this._removedLayers);(e.length||i.length)&&this._updateWorkerLayers(e,i);for(const e in this._updatedSources){const t=this._updatedSources[e];\"reload\"===t?this._reloadSource(e):\"clear\"===t&&this._clearSource(e);}this._updateTilesForChangedImages();for(const e in this._updatedPaintProps)this._layers[e].updateTransitions(t);this.light.updateTransitions(t),this.fog&&this.fog.updateTransitions(t),this._resetUpdates();}const o={};for(const e in this._sourceCaches){const t=this._sourceCaches[e];o[e]=t.used,t.used=!1;}for(const e of this._order){const i=this._layers[e];if(i.recalculate(t,this._availableImages),!i.isHidden(t.zoom)){const e=this._getLayerSourceCache(i);e&&(e.used=!0);}const o=this.map.painter;if(o){const e=i.getProgramIds();if(!e)continue;const r=i.getProgramConfiguration(t.zoom);for(const t of e)o.useProgram(t,r);}}for(const t in o){const i=this._sourceCaches[t];o[t]!==i.used&&i.getSource().fire(new e.Event(\"data\",{sourceDataType:\"visibility\",dataType:\"source\",sourceId:i.getSource().id}));}this.light.recalculate(t),this.terrain&&this.terrain.recalculate(t),this.fog&&this.fog.recalculate(t),this.z=t.zoom,this._markersNeedUpdate&&(this._updateMarkersOpacity(),this._markersNeedUpdate=!1),i&&this.fire(new e.Event(\"data\",{dataType:\"style\"}));}_updateTilesForChangedImages(){const e=Object.keys(this._changedImages);if(e.length){for(const t in this._sourceCaches)this._sourceCaches[t].reloadTilesForDependencies([\"icons\",\"patterns\"],e);this._changedImages={};}}_updateWorkerLayers(e,t){this.dispatcher.broadcast(\"updateLayers\",{layers:this._serializeLayers(e),removedIds:t});}_resetUpdates(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSources={},this._updatedPaintProps={},this._changedImages={};}setState(i){if(this._checkLoaded(),$t(this,e.validateStyle(i)))return !1;(i=e.clone$1(i)).layers=Ve(i.layers);const o=function(e,i){if(!e)return [{command:We.setStyle,args:[i]}];let o=[];try{if(!t(e.version,i.version))return [{command:We.setStyle,args:[i]}];t(e.center,i.center)||o.push({command:We.setCenter,args:[i.center]}),t(e.zoom,i.zoom)||o.push({command:We.setZoom,args:[i.zoom]}),t(e.bearing,i.bearing)||o.push({command:We.setBearing,args:[i.bearing]}),t(e.pitch,i.pitch)||o.push({command:We.setPitch,args:[i.pitch]}),t(e.sprite,i.sprite)||o.push({command:We.setSprite,args:[i.sprite]}),t(e.glyphs,i.glyphs)||o.push({command:We.setGlyphs,args:[i.glyphs]}),t(e.transition,i.transition)||o.push({command:We.setTransition,args:[i.transition]}),t(e.light,i.light)||o.push({command:We.setLight,args:[i.light]}),t(e.fog,i.fog)||o.push({command:We.setFog,args:[i.fog]}),t(e.projection,i.projection)||o.push({command:We.setProjection,args:[i.projection]});const r={},n=[];!function(e,i,o,r){let n;for(n in i=i||{},e=e||{})e.hasOwnProperty(n)&&(i.hasOwnProperty(n)||qe(n,o,r));for(n in i)i.hasOwnProperty(n)&&(e.hasOwnProperty(n)?t(e[n],i[n])||(\"geojson\"===e[n].type&&\"geojson\"===i[n].type&&He(e,i,n)?o.push({command:We.setGeoJSONSourceData,args:[n,i[n].data]}):$e(n,i,o,r)):Xe(n,i,o));}(e.sources,i.sources,n,r);const s=[];e.layers&&e.layers.forEach((e=>{e.source&&r[e.source]?o.push({command:We.removeLayer,args:[e.id]}):s.push(e);}));let a=e.terrain;a&&r[a.source]&&(o.push({command:We.setTerrain,args:[void 0]}),a=void 0),o=o.concat(n),t(a,i.terrain)||o.push({command:We.setTerrain,args:[i.terrain]}),function(e,i,o){i=i||[];const r=(e=e||[]).map(Ke),n=i.map(Ke),s=e.reduce(Je,{}),a=i.reduce(Je,{}),l=r.slice(),c=Object.create(null);let h,u,_,d,p,m,f;for(h=0,u=0;h<r.length;h++)_=r[h],a.hasOwnProperty(_)?u++:(o.push({command:We.removeLayer,args:[_]}),l.splice(l.indexOf(_,u),1));for(h=0,u=0;h<n.length;h++)_=n[n.length-1-h],l[l.length-1-h]!==_&&(s.hasOwnProperty(_)?(o.push({command:We.removeLayer,args:[_]}),l.splice(l.lastIndexOf(_,l.length-u),1)):u++,m=l[l.length-h],o.push({command:We.addLayer,args:[a[_],m]}),l.splice(l.length-h,0,_),c[_]=!0);for(h=0;h<n.length;h++)if(_=n[h],d=s[_],p=a[_],!c[_]&&!t(d,p))if(t(d.source,p.source)&&t(d[\"source-layer\"],p[\"source-layer\"])&&t(d.type,p.type)){for(f in Ye(d.layout,p.layout,o,_,null,We.setLayoutProperty),Ye(d.paint,p.paint,o,_,null,We.setPaintProperty),t(d.filter,p.filter)||o.push({command:We.setFilter,args:[_,p.filter]}),t(d.minzoom,p.minzoom)&&t(d.maxzoom,p.maxzoom)||o.push({command:We.setLayerZoomRange,args:[_,p.minzoom,p.maxzoom]}),d)d.hasOwnProperty(f)&&\"layout\"!==f&&\"paint\"!==f&&\"filter\"!==f&&\"metadata\"!==f&&\"minzoom\"!==f&&\"maxzoom\"!==f&&(0===f.indexOf(\"paint.\")?Ye(d[f],p[f],o,_,f.slice(6),We.setPaintProperty):t(d[f],p[f])||o.push({command:We.setLayerProperty,args:[_,f,p[f]]}));for(f in p)p.hasOwnProperty(f)&&!d.hasOwnProperty(f)&&\"layout\"!==f&&\"paint\"!==f&&\"filter\"!==f&&\"metadata\"!==f&&\"minzoom\"!==f&&\"maxzoom\"!==f&&(0===f.indexOf(\"paint.\")?Ye(d[f],p[f],o,_,f.slice(6),We.setPaintProperty):t(d[f],p[f])||o.push({command:We.setLayerProperty,args:[_,f,p[f]]}));}else o.push({command:We.removeLayer,args:[_]}),m=l[l.lastIndexOf(_)+1],o.push({command:We.addLayer,args:[p,m]});}(s,i.layers,o);}catch(e){console.warn(\"Unable to compute style diff:\",e),o=[{command:We.setStyle,args:[i]}];}return o}(this.serialize(),i).filter((e=>!(e.command in Yt)));if(0===o.length)return !1;const r=o.filter((e=>!(e.command in Ht)));if(r.length>0)throw new Error(`Unimplemented: ${r.map((e=>e.command)).join(\", \")}.`);return o.forEach((e=>{\"setTransition\"!==e.command&&\"setProjection\"!==e.command&&this[e.command].apply(this,e.args);})),this.stylesheet=i,this._updateMapProjection(),!0}addImage(t,i){return this.getImage(t)?this.fire(new e.ErrorEvent(new Error(\"An image with this name already exists.\"))):(this.imageManager.addImage(t,i),this._afterImageUpdated(t),this)}updateImage(e,t){this.imageManager.updateImage(e,t);}getImage(e){return this.imageManager.getImage(e)}removeImage(t){return this.getImage(t)?(this.imageManager.removeImage(t),this._afterImageUpdated(t),this):this.fire(new e.ErrorEvent(new Error(\"No image with this name exists.\")))}_afterImageUpdated(t){this._availableImages=this.imageManager.listImages(),this._changedImages[t]=!0,this._changed=!0,this.dispatcher.broadcast(\"setImages\",this._availableImages),this.fire(new e.Event(\"data\",{dataType:\"style\"}));}listImages(){return this._checkLoaded(),this._availableImages.slice()}addSource(t,i,o={}){if(this._checkLoaded(),void 0!==this.getSource(t))throw new Error(\"There is already a source with this ID\");if(!i.type)throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(i).join(\", \")}.`);if([\"vector\",\"raster\",\"geojson\",\"video\",\"image\"].indexOf(i.type)>=0&&this._validate(e.validateSource,`sources.${t}`,i,null,o))return;this.map&&this.map._collectResourceTiming&&(i.collectResourceTiming=!0);const r=Pe(t,i,this.dispatcher,this);r.setEventedParent(this,(()=>({isSourceLoaded:this._isSourceCacheLoaded(t),source:r.serialize(),sourceId:t})));const n=i=>{const o=(i?\"symbol:\":\"other:\")+t,n=this._sourceCaches[o]=new e.SourceCache(o,r,i);(i?this._symbolSourceCaches:this._otherSourceCaches)[t]=n,n.style=this,n.onAdd(this.map);};n(!1),\"vector\"!==i.type&&\"geojson\"!==i.type||n(!0),r.onAdd&&r.onAdd(this.map),this._changed=!0;}removeSource(t){this._checkLoaded();const i=this.getSource(t);if(!i)throw new Error(\"There is no source with this ID\");for(const i in this._layers)if(this._layers[i].source===t)return this.fire(new e.ErrorEvent(new Error(`Source \"${t}\" cannot be removed while layer \"${i}\" is using it.`)));if(this.terrain&&this.terrain.get().source===t)return this.fire(new e.ErrorEvent(new Error(`Source \"${t}\" cannot be removed while terrain is using it.`)));const o=this._getSourceCaches(t);for(const t of o)delete this._sourceCaches[t.id],delete this._updatedSources[t.id],t.fire(new e.Event(\"data\",{sourceDataType:\"metadata\",dataType:\"source\",sourceId:t.getSource().id})),t.setEventedParent(null),t.clearTiles();return delete this._otherSourceCaches[t],delete this._symbolSourceCaches[t],i.setEventedParent(null),i.onRemove&&i.onRemove(this.map),this._changed=!0,this}setGeoJSONSourceData(e,t){this._checkLoaded(),this.getSource(e).setData(t),this._changed=!0;}getSource(e){const t=this._getSourceCache(e);return t&&t.getSource()}_getSources(){const e=[];for(const t in this._otherSourceCaches){const i=this._getSourceCache(t);i&&e.push(i.getSource());}return e}addLayer(t,i,o={}){this._checkLoaded();const r=t.id;if(this.getLayer(r))return void this.fire(new e.ErrorEvent(new Error(`Layer with id \"${r}\" already exists on this map`)));let n;if(\"custom\"===t.type){if($t(this,e.validateCustomStyleLayer(t)))return;n=e.createStyleLayer(t);}else {if(\"object\"==typeof t.source&&(this.addSource(r,t.source),t=e.clone$1(t),t=e.extend(t,{source:r})),this._validate(e.validateLayer,`layers.${r}`,t,{arrayIndex:-1},o))return;n=e.createStyleLayer(t),this._validateLayer(n),n.setEventedParent(this,{layer:{id:r}}),this._serializedLayers[n.id]=n.serialize(),this._updateLayerCount(n,!0);}const s=i?this._order.indexOf(i):this._order.length;if(i&&-1===s)return void this.fire(new e.ErrorEvent(new Error(`Layer with id \"${i}\" does not exist on this map.`)));this._order.splice(s,0,r),this._layerOrderChanged=!0,this._layers[r]=n;const a=this._getLayerSourceCache(n);if(this._removedLayers[r]&&n.source&&a&&\"custom\"!==n.type){const e=this._removedLayers[r];delete this._removedLayers[r],e.type!==n.type?this._updatedSources[n.source]=\"clear\":(this._updatedSources[n.source]=\"reload\",a.pause());}this._updateLayer(n),n.onAdd&&n.onAdd(this.map),this._updateDrapeFirstLayers();}moveLayer(t,i){if(this._checkLoaded(),this._changed=!0,!this._layers[t])return void this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be moved.`)));if(t===i)return;const o=this._order.indexOf(t);this._order.splice(o,1);const r=i?this._order.indexOf(i):this._order.length;i&&-1===r?this.fire(new e.ErrorEvent(new Error(`Layer with id \"${i}\" does not exist on this map.`))):(this._order.splice(r,0,t),this._layerOrderChanged=!0,this._updateDrapeFirstLayers());}removeLayer(t){this._checkLoaded();const i=this._layers[t];if(!i)return void this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be removed.`)));i.setEventedParent(null),this._updateLayerCount(i,!1);const o=this._order.indexOf(t);this._order.splice(o,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[t]=i,delete this._layers[t],delete this._serializedLayers[t],delete this._updatedLayers[t],delete this._updatedPaintProps[t],i.onRemove&&i.onRemove(this.map),this._updateDrapeFirstLayers();}getLayer(e){return this._layers[e]}hasLayer(e){return e in this._layers}hasLayerType(e){for(const t in this._layers)if(this._layers[t].type===e)return !0;return !1}setLayerZoomRange(t,i,o){this._checkLoaded();const r=this.getLayer(t);r?r.minzoom===i&&r.maxzoom===o||(null!=i&&(r.minzoom=i),null!=o&&(r.maxzoom=o),this._updateLayer(r)):this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot have zoom extent.`)));}setFilter(i,o,r={}){this._checkLoaded();const n=this.getLayer(i);if(n){if(!t(n.filter,o))return null==o?(n.filter=void 0,void this._updateLayer(n)):void(this._validate(e.validateFilter,`layers.${n.id}.filter`,o,{layerType:n.type},r)||(n.filter=e.clone$1(o),this._updateLayer(n)))}else this.fire(new e.ErrorEvent(new Error(`The layer '${i}' does not exist in the map's style and cannot be filtered.`)));}getFilter(t){const i=this.getLayer(t);return i&&e.clone$1(i.filter)}setLayoutProperty(i,o,r,n={}){this._checkLoaded();const s=this.getLayer(i);s?t(s.getLayoutProperty(o),r)||(s.setLayoutProperty(o,r,n),this._updateLayer(s)):this.fire(new e.ErrorEvent(new Error(`The layer '${i}' does not exist in the map's style and cannot be styled.`)));}getLayoutProperty(t,i){const o=this.getLayer(t);if(o)return o.getLayoutProperty(i);this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style.`)));}setPaintProperty(i,o,r,n={}){this._checkLoaded();const s=this.getLayer(i);s?t(s.getPaintProperty(o),r)||(s.setPaintProperty(o,r,n)&&this._updateLayer(s),this._changed=!0,this._updatedPaintProps[i]=!0):this.fire(new e.ErrorEvent(new Error(`The layer '${i}' does not exist in the map's style and cannot be styled.`)));}getPaintProperty(e,t){const i=this.getLayer(e);return i&&i.getPaintProperty(t)}setFeatureState(t,i){this._checkLoaded();const o=t.source,r=t.sourceLayer,n=this.getSource(o);if(!n)return void this.fire(new e.ErrorEvent(new Error(`The source '${o}' does not exist in the map's style.`)));const s=n.type;if(\"geojson\"===s&&r)return void this.fire(new e.ErrorEvent(new Error(\"GeoJSON sources cannot have a sourceLayer parameter.\")));if(\"vector\"===s&&!r)return void this.fire(new e.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")));void 0===t.id&&this.fire(new e.ErrorEvent(new Error(\"The feature id parameter must be provided.\")));const a=this._getSourceCaches(o);for(const e of a)e.setFeatureState(r,t.id,i);}removeFeatureState(t,i){this._checkLoaded();const o=t.source,r=this.getSource(o);if(!r)return void this.fire(new e.ErrorEvent(new Error(`The source '${o}' does not exist in the map's style.`)));const n=r.type,s=\"vector\"===n?t.sourceLayer:void 0;if(\"vector\"===n&&!s)return void this.fire(new e.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")));if(i&&\"string\"!=typeof t.id&&\"number\"!=typeof t.id)return void this.fire(new e.ErrorEvent(new Error(\"A feature id is required to remove its specific state property.\")));const a=this._getSourceCaches(o);for(const e of a)e.removeFeatureState(s,t.id,i);}getFeatureState(t){this._checkLoaded();const i=t.source,o=t.sourceLayer,r=this.getSource(i);if(r){if(\"vector\"!==r.type||o)return void 0===t.id&&this.fire(new e.ErrorEvent(new Error(\"The feature id parameter must be provided.\"))),this._getSourceCaches(i)[0].getFeatureState(o,t.id);this.fire(new e.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")));}else this.fire(new e.ErrorEvent(new Error(`The source '${i}' does not exist in the map's style.`)));}getTransition(){return e.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)}serialize(){const t={};for(const e in this._sourceCaches){const i=this._sourceCaches[e].getSource();t[i.id]||(t[i.id]=i.serialize());}return e.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,terrain:this.getTerrain()||void 0,fog:this.stylesheet.fog,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,projection:this.stylesheet.projection,sources:t,layers:this._serializeLayers(this._order)},(e=>void 0!==e))}_updateLayer(e){this._updatedLayers[e.id]=!0;const t=this._getLayerSourceCache(e);e.source&&!this._updatedSources[e.source]&&t&&\"raster\"!==t.getSource().type&&(this._updatedSources[e.source]=\"reload\",t.pause()),this._changed=!0,e.invalidateCompiledFilter();}_flattenAndSortRenderedFeatures(e){const t=e=>\"fill-extrusion\"===this._layers[e].type,i={},o=[];for(let r=this._order.length-1;r>=0;r--){const n=this._order[r];if(t(n)){i[n]=r;for(const t of e){const e=t[n];if(e)for(const t of e)o.push(t);}}}o.sort(((e,t)=>t.intersectionZ-e.intersectionZ));const r=[];for(let n=this._order.length-1;n>=0;n--){const s=this._order[n];if(t(s))for(let e=o.length-1;e>=0;e--){const t=o[e].feature;if(i[t.layer.id]<n)break;r.push(t),o.pop();}else for(const t of e){const e=t[s];if(e)for(const t of e)r.push(t.feature);}}return r}queryRenderedFeatures(t,i,o){i&&i.filter&&this._validate(e.validateFilter,\"queryRenderedFeatures.filter\",i.filter,null,i);const r={};if(i&&i.layers){if(!Array.isArray(i.layers))return this.fire(new e.ErrorEvent(new Error(\"parameters.layers must be an Array.\"))),[];for(const t of i.layers){const i=this._layers[t];if(!i)return this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be queried for features.`))),[];r[i.source]=!0;}}const n=[];i.availableImages=this._availableImages;const s=i&&i.layers?i.layers.some((e=>{const t=this.getLayer(e);return t&&t.is3D()})):this.has3DLayers(),a=R.createFromScreenPoints(t,o);for(const e in this._sourceCaches){const t=this._sourceCaches[e].getSource().id;i.layers&&!r[t]||n.push(Oe(this._sourceCaches[e],this._layers,this._serializedLayers,a,i,o,s,!!this.map._showQueryGeometry));}return this.placement&&n.push(function(e,t,i,o,r,n,s){const a={},l=n.queryRenderedSymbols(o),c=[];for(const e of Object.keys(l).map(Number))c.push(s[e]);c.sort(ke);for(const i of c){const o=i.featureIndex.lookupSymbolFeatures(l[i.bucketInstanceId],t,i.bucketIndex,i.sourceLayerIndex,r.filter,r.layers,r.availableImages,e);for(const e in o){const t=a[e]=a[e]||[],r=o[e];r.sort(((e,t)=>{const o=i.featureSortOrder;if(o){const i=o.indexOf(e.featureIndex);return o.indexOf(t.featureIndex)-i}return t.featureIndex-e.featureIndex}));for(const e of r)t.push(e);}}for(const t in a)a[t].forEach((o=>{const r=o.feature,n=i(e[t]).getFeatureState(r.layer[\"source-layer\"],r.id);r.source=r.layer.source,r.layer[\"source-layer\"]&&(r.sourceLayer=r.layer[\"source-layer\"]),r.state=n;}));return a}(this._layers,this._serializedLayers,this._getLayerSourceCache.bind(this),a.screenGeometry,i,this.placement.collisionIndex,this.placement.retainedQueryData)),this._flattenAndSortRenderedFeatures(n)}querySourceFeatures(t,i){i&&i.filter&&this._validate(e.validateFilter,\"querySourceFeatures.filter\",i.filter,null,i);const o=this._getSourceCaches(t);let r=[];for(const e of o)r=r.concat(Be(e,i));return r}addSourceType(e,t,i){return Qt.getSourceType(e)?i(new Error(`A source type called \"${e}\" already exists.`)):(Qt.setSourceType(e,t),t.workerSourceURL?void this.dispatcher.broadcast(\"loadWorkerSource\",{name:e,url:t.workerSourceURL},i):i(null,null))}getLight(){return this.light.getLight()}setLight(e,i={}){this._checkLoaded();const o=this.light.getLight();let r=!1;for(const i in e)if(!t(e[i],o[i])){r=!0;break}if(!r)return;const n=this._setTransitionParameters({duration:300,delay:0});this.light.setLight(e,i),this.light.updateTransitions(n);}getTerrain(){return this.terrain&&1===this.terrain.drapeRenderMode?this.terrain.get():null}setTerrainForDraping(){this.setTerrain({source:\"\",exaggeration:0},0);}setTerrain(i,o=1){if(this._checkLoaded(),!i)return delete this.terrain,delete this.stylesheet.terrain,this.dispatcher.broadcast(\"enableTerrain\",!1),this._force3DLayerUpdate(),void(this._markersNeedUpdate=!0);if(1===o){if(\"object\"==typeof i.source){const t=\"terrain-dem-src\";this.addSource(t,i.source),i=e.clone$1(i),i=e.extend(i,{source:t});}if(this._validate(e.validateTerrain,\"terrain\",i))return}if(!this.terrain||this.terrain&&o!==this.terrain.drapeRenderMode)this._createTerrain(i,o);else {const o=this.terrain,r=o.get();for(const t of Object.keys(e.spec.terrain))!i.hasOwnProperty(t)&&e.spec.terrain[t].default&&(i[t]=e.spec.terrain[t].default);for(const e in i)if(!t(i[e],r[e])){o.set(i),this.stylesheet.terrain=i;const e=this._setTransitionParameters({duration:0});o.updateTransitions(e);break}}this._updateDrapeFirstLayers(),this._markersNeedUpdate=!0;}_createFog(e){const t=this.fog=new A(e,this.map.transform);this.stylesheet.fog=e;const i=this._setTransitionParameters({duration:0});t.updateTransitions(i);}_updateMarkersOpacity(){0!==this.map._markers.length&&this.map._requestDomTask((()=>{for(const e of this.map._markers)e._evaluateOpacity();}));}getFog(){return this.fog?this.fog.get():null}setFog(e){if(this._checkLoaded(),!e)return delete this.fog,delete this.stylesheet.fog,void(this._markersNeedUpdate=!0);if(this.fog){const i=this.fog,o=i.get();0===Object.keys(e).length&&i.set(e);for(const r in e)if(!t(e[r],o[r])){i.set(e),this.stylesheet.fog=e;const t=this._setTransitionParameters({duration:0});i.updateTransitions(t);break}}else this._createFog(e);this._markersNeedUpdate=!0;}_setTransitionParameters(t){return {now:e.exported.now(),transition:e.extend(t,this.stylesheet.transition)}}_updateDrapeFirstLayers(){if(!this.map._optimizeForTerrain||!this.terrain)return;const e=this._order.filter((e=>this.isLayerDraped(this._layers[e]))),t=this._order.filter((e=>!this.isLayerDraped(this._layers[e])));this._drapedFirstOrder=[],this._drapedFirstOrder.push(...e),this._drapedFirstOrder.push(...t);}_createTerrain(e,t){const i=this.terrain=new M(e,t);this.stylesheet.terrain=e,this.dispatcher.broadcast(\"enableTerrain\",!this.terrainSetForDrapingOnly()),this._force3DLayerUpdate();const o=this._setTransitionParameters({duration:0});i.updateTransitions(o);}_force3DLayerUpdate(){for(const e in this._layers){const t=this._layers[e];\"fill-extrusion\"===t.type&&this._updateLayer(t);}}_forceSymbolLayerUpdate(){for(const e in this._layers){const t=this._layers[e];\"symbol\"===t.type&&this._updateLayer(t);}}_validate(t,i,o,r,n={}){return (!n||!1!==n.validate)&&$t(this,t.call(e.validateStyle,e.extend({key:i,style:this.serialize(),value:o,styleSpec:e.spec},r)))}_remove(){this._request&&(this._request.cancel(),this._request=null),this._spriteRequest&&(this._spriteRequest.cancel(),this._spriteRequest=null),e.evented.off(\"pluginStateChange\",this._rtlTextPluginCallback);for(const e in this._layers)this._layers[e].setEventedParent(null);for(const e in this._sourceCaches)this._sourceCaches[e].clearTiles(),this._sourceCaches[e].setEventedParent(null);this.imageManager.setEventedParent(null),this.setEventedParent(null),this.dispatcher.remove();}_clearSource(e){const t=this._getSourceCaches(e);for(const e of t)e.clearTiles();}_reloadSource(e){const t=this._getSourceCaches(e);for(const e of t)e.resume(),e.reload();}_reloadSources(){for(const e of this._getSources())e.reload&&e.reload();}_updateSources(e){for(const t in this._sourceCaches)this._sourceCaches[t].update(e);}_generateCollisionBoxes(){for(const e in this._sourceCaches){const t=this._sourceCaches[e];t.resume(),t.reload();}}_updatePlacement(t,i,o,r,n=!1){let s=!1,a=!1;const l={};for(const e of this._order){const i=this._layers[e];if(\"symbol\"!==i.type)continue;if(!l[i.source]){const e=this._getLayerSourceCache(i);if(!e)continue;l[i.source]=e.getRenderableIds(!0).map((t=>e.getTileByID(t))).sort(((e,t)=>t.tileID.overscaledZ-e.tileID.overscaledZ||(e.tileID.isLessThan(t.tileID)?-1:1)));}const o=this.crossTileSymbolIndex.addLayer(i,l[i.source],t.center.lng,t.projection);s=s||o;}if(this.crossTileSymbolIndex.pruneUnusedLayers(this._order),n=n||this._layerOrderChanged||0===o,this._layerOrderChanged&&this.fire(new e.Event(\"neworder\")),(n||!this.pauseablePlacement||this.pauseablePlacement.isDone()&&!this.placement.stillRecent(e.exported.now(),t.zoom))&&(this.pauseablePlacement=new jt(t,this._order,n,i,o,r,this.placement,this.fog&&t.projection.supportsFog?this.fog.state:null),this._layerOrderChanged=!1),this.pauseablePlacement.isDone()?this.placement.setStale():(this.pauseablePlacement.continuePlacement(this._order,this._layers,l),this.pauseablePlacement.isDone()&&(this.placement=this.pauseablePlacement.commit(e.exported.now()),a=!0),s&&this.pauseablePlacement.placement.setStale()),a||s)for(const e of this._order){const t=this._layers[e];\"symbol\"===t.type&&this.placement.updateLayerOpacities(t,l[t.source]);}return !this.pauseablePlacement.isDone()||this.placement.hasTransitions(e.exported.now())}_releaseSymbolFadeTiles(){for(const e in this._sourceCaches)this._sourceCaches[e].releaseSymbolFadeTiles();}getImages(e,t,i){this.imageManager.getImages(t.icons,i),this._updateTilesForChangedImages();const o=e=>{e&&e.setDependencies(t.tileID.key,t.type,t.icons);};o(this._otherSourceCaches[t.source]),o(this._symbolSourceCaches[t.source]);}getGlyphs(e,t,i){this.glyphManager.getGlyphs(t.stacks,i);}getResource(t,i,o){return e.makeRequest(i,o)}_getSourceCache(e){return this._otherSourceCaches[e]}_getLayerSourceCache(e){return \"symbol\"===e.type?this._symbolSourceCaches[e.source]:this._otherSourceCaches[e.source]}_getSourceCaches(e){const t=[];return this._otherSourceCaches[e]&&t.push(this._otherSourceCaches[e]),this._symbolSourceCaches[e]&&t.push(this._symbolSourceCaches[e]),t}_isSourceCacheLoaded(t){const i=this._getSourceCaches(t);return 0===i.length?(this.fire(new e.ErrorEvent(new Error(`There is no source with ID '${t}'`))),!1):i.every((e=>e.loaded()))}has3DLayers(){return this._num3DLayers>0}hasSymbolLayers(){return this._numSymbolLayers>0}hasCircleLayers(){return this._numCircleLayers>0}_clearWorkerCaches(){this.dispatcher.broadcast(\"clearCaches\");}destroy(){this._clearWorkerCaches(),this.terrainSetForDrapingOnly()&&(delete this.terrain,delete this.stylesheet.terrain);}}Qt.getSourceType=function(e){return ze[e]},Qt.setSourceType=function(e,t){ze[e]=t;},Qt.registerForPluginStateChange=e.registerForPluginStateChange;var ei=\"\\n#define EPSILON 0.0000001\\n#define PI 3.141592653589793\\n#define EXTENT 8192.0\\n#define HALF_PI PI/2.0\\n#define QUARTER_PI PI/4.0\\n#define RAD_TO_DEG 180.0/PI\\n#define DEG_TO_RAD PI/180.0\\n#define GLOBE_RADIUS EXTENT/PI/2.0\",ti=\"attribute highp vec3 a_pos_3f;uniform lowp mat4 u_matrix;varying highp vec3 v_uv;void main() {const mat3 half_neg_pi_around_x=mat3(1.0,0.0, 0.0,0.0,0.0,-1.0,0.0,1.0, 0.0);v_uv=half_neg_pi_around_x*a_pos_3f;vec4 pos=u_matrix*vec4(a_pos_3f,1.0);gl_Position=pos.xyww;}\",ii=\"\\n#define ELEVATION_SCALE 7.0\\n#define ELEVATION_OFFSET 450.0\\n#ifdef PROJECTION_GLOBE_VIEW\\nuniform vec3 u_tile_tl_up;uniform vec3 u_tile_tr_up;uniform vec3 u_tile_br_up;uniform vec3 u_tile_bl_up;uniform float u_tile_up_scale;vec3 elevationVector(vec2 pos) {vec2 uv=pos/EXTENT;vec3 up=normalize(mix(\\nmix(u_tile_tl_up,u_tile_tr_up,uv.xxx),mix(u_tile_bl_up,u_tile_br_up,uv.xxx),uv.yyy));return up*u_tile_up_scale;}\\n#else\\nvec3 elevationVector(vec2 pos) { return vec3(0,0,1); }\\n#endif\\nconst float skirtOffset=24575.0;vec3 decomposeToPosAndSkirt(vec2 posWithComposedSkirt)\\n{float skirt=float(posWithComposedSkirt.x >=skirtOffset);vec2 pos=posWithComposedSkirt-vec2(skirt*skirtOffset,0.0);return vec3(pos,skirt);}\\n#ifdef TERRAIN\\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\\nuniform highp sampler2D u_dem;uniform highp sampler2D u_dem_prev;\\n#else\\nuniform sampler2D u_dem;uniform sampler2D u_dem_prev;\\n#endif\\nuniform vec4 u_dem_unpack;uniform vec2 u_dem_tl;uniform vec2 u_dem_tl_prev;uniform float u_dem_scale;uniform float u_dem_scale_prev;uniform float u_dem_size;uniform float u_dem_lerp;uniform float u_exaggeration;uniform float u_meter_to_dem;uniform mat4 u_label_plane_matrix_inv;uniform sampler2D u_depth;uniform vec2 u_depth_size_inv;vec4 tileUvToDemSample(vec2 uv,float dem_size,float dem_scale,vec2 dem_tl) {vec2 pos=dem_size*(uv*dem_scale+dem_tl)+1.0;vec2 f=fract(pos);return vec4((pos-f+0.5)/(dem_size+2.0),f);}float decodeElevation(vec4 v) {return dot(vec4(v.xyz*255.0,-1.0),u_dem_unpack);}float currentElevation(vec2 apos) {\\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\\nvec2 pos=(u_dem_size*(apos/8192.0*u_dem_scale+u_dem_tl)+1.5)/(u_dem_size+2.0);return u_exaggeration*texture2D(u_dem,pos).a;\\n#else\\nfloat dd=1.0/(u_dem_size+2.0);vec4 r=tileUvToDemSample(apos/8192.0,u_dem_size,u_dem_scale,u_dem_tl);vec2 pos=r.xy;vec2 f=r.zw;float tl=decodeElevation(texture2D(u_dem,pos));\\n#ifdef TERRAIN_DEM_NEAREST_FILTER\\nreturn u_exaggeration*tl;\\n#endif\\nfloat tr=decodeElevation(texture2D(u_dem,pos+vec2(dd,0.0)));float bl=decodeElevation(texture2D(u_dem,pos+vec2(0.0,dd)));float br=decodeElevation(texture2D(u_dem,pos+vec2(dd,dd)));return u_exaggeration*mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);\\n#endif\\n}float prevElevation(vec2 apos) {\\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\\nvec2 pos=(u_dem_size*(apos/8192.0*u_dem_scale_prev+u_dem_tl_prev)+1.5)/(u_dem_size+2.0);return u_exaggeration*texture2D(u_dem_prev,pos).a;\\n#else\\nfloat dd=1.0/(u_dem_size+2.0);vec4 r=tileUvToDemSample(apos/8192.0,u_dem_size,u_dem_scale_prev,u_dem_tl_prev);vec2 pos=r.xy;vec2 f=r.zw;float tl=decodeElevation(texture2D(u_dem_prev,pos));float tr=decodeElevation(texture2D(u_dem_prev,pos+vec2(dd,0.0)));float bl=decodeElevation(texture2D(u_dem_prev,pos+vec2(0.0,dd)));float br=decodeElevation(texture2D(u_dem_prev,pos+vec2(dd,dd)));return u_exaggeration*mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);\\n#endif\\n}\\n#ifdef TERRAIN_VERTEX_MORPHING\\nfloat elevation(vec2 apos) {\\n#ifdef ZERO_EXAGGERATION\\nreturn 0.0;\\n#endif\\nfloat nextElevation=currentElevation(apos);float prevElevation=prevElevation(apos);return mix(prevElevation,nextElevation,u_dem_lerp);}\\n#else\\nfloat elevation(vec2 apos) {\\n#ifdef ZERO_EXAGGERATION\\nreturn 0.0;\\n#endif\\nreturn currentElevation(apos);}\\n#endif\\nhighp float unpack_depth(highp vec4 rgba_depth)\\n{const highp vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(rgba_depth,bit_shift)*2.0-1.0;}bool isOccluded(vec4 frag) {vec3 coord=frag.xyz/frag.w;float depth=unpack_depth(texture2D(u_depth,(coord.xy+1.0)*0.5));return coord.z > depth+0.0005;}float occlusionFade(vec4 frag) {vec3 coord=frag.xyz/frag.w;vec3 df=vec3(5.0*u_depth_size_inv,0.0);vec2 uv=0.5*coord.xy+0.5;vec4 depth=vec4(\\nunpack_depth(texture2D(u_depth,uv-df.xz)),unpack_depth(texture2D(u_depth,uv+df.xz)),unpack_depth(texture2D(u_depth,uv-df.zy)),unpack_depth(texture2D(u_depth,uv+df.zy))\\n);return dot(vec4(0.25),vec4(1.0)-clamp(300.0*(vec4(coord.z-0.001)-depth),0.0,1.0));}vec4 fourSample(vec2 pos,vec2 off) {\\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\\nfloat tl=texture2D(u_dem,pos).a;float tr=texture2D(u_dem,pos+vec2(off.x,0.0)).a;float bl=texture2D(u_dem,pos+vec2(0.0,off.y)).a;float br=texture2D(u_dem,pos+off).a;\\n#else\\nvec4 demtl=vec4(texture2D(u_dem,pos).xyz*255.0,-1.0);float tl=dot(demtl,u_dem_unpack);vec4 demtr=vec4(texture2D(u_dem,pos+vec2(off.x,0.0)).xyz*255.0,-1.0);float tr=dot(demtr,u_dem_unpack);vec4 dembl=vec4(texture2D(u_dem,pos+vec2(0.0,off.y)).xyz*255.0,-1.0);float bl=dot(dembl,u_dem_unpack);vec4 dembr=vec4(texture2D(u_dem,pos+off).xyz*255.0,-1.0);float br=dot(dembr,u_dem_unpack);\\n#endif\\nreturn vec4(tl,tr,bl,br);}float flatElevation(vec2 pack) {vec2 apos=floor(pack/8.0);vec2 span=10.0*(pack-apos*8.0);vec2 uvTex=(apos-vec2(1.0,1.0))/8190.0;float size=u_dem_size+2.0;float dd=1.0/size;vec2 pos=u_dem_size*(uvTex*u_dem_scale+u_dem_tl)+1.0;vec2 f=fract(pos);pos=(pos-f+0.5)*dd;vec4 h=fourSample(pos,vec2(dd));float z=mix(mix(h.x,h.y,f.x),mix(h.z,h.w,f.x),f.y);vec2 w=floor(0.5*(span*u_meter_to_dem-1.0));vec2 d=dd*w;h=fourSample(pos-d,2.0*d+vec2(dd));vec4 diff=abs(h.xzxy-h.ywzw);vec2 slope=min(vec2(0.25),u_meter_to_dem*0.5*(diff.xz+diff.yw)/(2.0*w+vec2(1.0)));vec2 fix=slope*span;float base=z+max(fix.x,fix.y);return u_exaggeration*base;}float elevationFromUint16(float word) {return u_exaggeration*(word/ELEVATION_SCALE-ELEVATION_OFFSET);}\\n#else\\nfloat elevation(vec2 pos) { return 0.0; }bool isOccluded(vec4 frag) { return false; }float occlusionFade(vec4 frag) { return 1.0; }\\n#endif\",oi=\"#ifdef FOG\\nuniform mediump vec4 u_fog_color;uniform mediump vec2 u_fog_range;uniform mediump float u_fog_horizon_blend;uniform mediump mat4 u_fog_matrix;varying vec3 v_fog_pos;float fog_range(float depth) {return (depth-u_fog_range[0])/(u_fog_range[1]-u_fog_range[0]);}float fog_horizon_blending(vec3 camera_dir) {float t=max(0.0,camera_dir.z/u_fog_horizon_blend);return u_fog_color.a*exp(-3.0*t*t);}float fog_opacity(float t) {const float decay=6.0;float falloff=1.0-min(1.0,exp(-decay*t));falloff*=falloff*falloff;return u_fog_color.a*min(1.0,1.00747*falloff);}vec3 fog_position(vec3 pos) {return (u_fog_matrix*vec4(pos,1.0)).xyz;}vec3 fog_position(vec2 pos) {return fog_position(vec3(pos,0.0));}float fog(vec3 pos) {float depth=length(pos);float opacity=fog_opacity(fog_range(depth));return opacity*fog_horizon_blending(pos/depth);}\\n#endif\",ri=\"#ifdef FOG\\nuniform mediump vec4 u_fog_color;uniform mediump vec2 u_fog_range;uniform mediump float u_fog_horizon_blend;uniform mediump float u_fog_temporal_offset;varying vec3 v_fog_pos;uniform highp vec3 u_frustum_tl;uniform highp vec3 u_frustum_tr;uniform highp vec3 u_frustum_br;uniform highp vec3 u_frustum_bl;uniform highp vec3 u_globe_pos;uniform highp float u_globe_radius;uniform highp vec2 u_viewport;uniform float u_globe_transition;uniform int u_is_globe;float fog_range(float depth) {return (depth-u_fog_range[0])/(u_fog_range[1]-u_fog_range[0]);}float fog_horizon_blending(vec3 camera_dir) {float t=max(0.0,camera_dir.z/u_fog_horizon_blend);return u_fog_color.a*exp(-3.0*t*t);}float fog_opacity(float t) {const float decay=6.0;float falloff=1.0-min(1.0,exp(-decay*t));falloff*=falloff*falloff;return u_fog_color.a*min(1.0,1.00747*falloff);}float globe_glow_progress() {highp vec2 uv=gl_FragCoord.xy/u_viewport;highp vec3 ray_dir=mix(\\nmix(u_frustum_tl,u_frustum_tr,uv.x),mix(u_frustum_bl,u_frustum_br,uv.x),1.0-uv.y);highp vec3 dir=normalize(ray_dir);highp vec3 closest_point=dot(u_globe_pos,dir)*dir;highp float sdf=length(closest_point-u_globe_pos)/u_globe_radius;return sdf+PI*0.5;}float fog_opacity(vec3 pos) {float depth=length(pos);return fog_opacity(fog_range(depth));}vec3 fog_apply(vec3 color,vec3 pos) {float depth=length(pos);float opacity;if (u_is_globe==1) {float glow_progress=globe_glow_progress();float t=mix(glow_progress,depth,u_globe_transition);opacity=fog_opacity(fog_range(t));} else {opacity=fog_opacity(fog_range(depth));opacity*=fog_horizon_blending(pos/depth);}return mix(color,u_fog_color.rgb,opacity);}vec4 fog_apply_from_vert(vec4 color,float fog_opac) {float alpha=EPSILON+color.a;color.rgb=mix(color.rgb/alpha,u_fog_color.rgb,fog_opac)*alpha;return color;}vec3 fog_apply_sky_gradient(vec3 camera_ray,vec3 sky_color) {float horizon_blend=fog_horizon_blending(normalize(camera_ray));return mix(sky_color,u_fog_color.rgb,horizon_blend);}vec4 fog_apply_premultiplied(vec4 color,vec3 pos) {float alpha=EPSILON+color.a;color.rgb=fog_apply(color.rgb/alpha,pos)*alpha;return color;}vec3 fog_dither(vec3 color) {vec2 dither_seed=gl_FragCoord.xy+u_fog_temporal_offset;return dither(color,dither_seed);}vec4 fog_dither(vec4 color) {return vec4(fog_dither(color.rgb),color.a);}\\n#endif\";let ni={},si={};const ai=[];_i(ei,ai),_i(ii,ai),_i(oi,ai),_i(ri,ai),ni=di(\"\",ii),si=di(ri,oi);const li=di(\"\\n#if __VERSION__ >=300\\n#define varying in\\n#define gl_FragColor glFragColor\\n#define texture2D texture\\n#define textureCube texture\\nout vec4 glFragColor;\\n#endif\\nhighp vec3 hash(highp vec2 p) {highp vec3 p3=fract(p.xyx*vec3(443.8975,397.2973,491.1871));p3+=dot(p3,p3.yxz+19.19);return fract((p3.xxy+p3.yzz)*p3.zyx);}vec3 dither(vec3 color,highp vec2 seed) {vec3 rnd=hash(seed)+hash(seed+0.59374)-0.5;return color+rnd/255.0;}highp float unpack_depth(highp vec4 rgba_depth)\\n{const highp vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(rgba_depth,bit_shift)*2.0-1.0;}highp vec4 pack_depth(highp float ndc_z) {highp float depth=ndc_z*0.5+0.5;const highp vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);const highp vec4 bit_mask =vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);highp vec4 res=fract(depth*bit_shift);res-=res.xxyz*bit_mask;return res;}\",\"\\n#if __VERSION__ >=300\\n#define attribute in\\n#define varying out\\n#define texture2D texture\\n#endif\\nfloat wrap(float n,float min,float max) {float d=max-min;float w=mod(mod(n-min,d)+d,d)+min;return (w==min) ? max : w;}\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 mercator_tile_position(mat4 matrix,vec2 tile_anchor,vec3 tile_id,vec2 mercator_center) {\\n#ifndef PROJECTED_POS_ON_VIEWPORT\\nfloat tiles=tile_id.z;vec2 mercator=(tile_anchor/EXTENT+tile_id.xy)/tiles;mercator-=mercator_center;mercator.x=wrap(mercator.x,-0.5,0.5);vec4 mercator_tile=vec4(mercator.xy*EXTENT,EXTENT/(2.0*PI),1.0);mercator_tile=matrix*mercator_tile;return mercator_tile.xyz;\\n#else\\nreturn vec3(0.0);\\n#endif\\n}vec3 mix_globe_mercator(vec3 globe,vec3 mercator,float t) {return mix(globe,mercator,t);}mat3 globe_mercator_surface_vectors(vec3 pos_normal,vec3 up_dir,float zoom_transition) {vec3 normal=zoom_transition==0.0 ? pos_normal : normalize(mix(pos_normal,up_dir,zoom_transition));vec3 xAxis=normalize(vec3(normal.z,0.0,-normal.x));vec3 yAxis=normalize(cross(normal,xAxis));return mat3(xAxis,yAxis,normal);}\\n#endif\\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(\\nunpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}const vec4 AWAY=vec4(-1000.0,-1000.0,-1000.0,1);//Normalized device coordinate that is not rendered.\"),ci=ei,hi=\"\\n#ifdef GL_ES\\nprecision mediump float;\\n#else\\n\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n\\n#if !defined(highp)\\n#define highp\\n#endif\\n\\n#endif\";var ui={background:di(\"uniform vec4 u_color;uniform float u_opacity;\\n#ifdef LIGHTING_3D_MODE\\nvarying vec4 v_color;\\n#endif\\nvoid main() {vec4 out_color;\\n#ifdef LIGHTING_3D_MODE\\nout_color=v_color;\\n#else\\nout_color=u_color;\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;\\n#ifdef LIGHTING_3D_MODE\\nuniform vec4 u_color;varying vec4 v_color;\\n#endif\\nvoid main() {gl_Position=u_matrix*vec4(a_pos,0,1);\\n#ifdef LIGHTING_3D_MODE\\nv_color=apply_lighting(u_color);\\n#endif\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),backgroundPattern:di(\"uniform vec2 u_pattern_tl;uniform vec2 u_pattern_br;uniform vec2 u_texsize;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos;void main() {vec2 imagecoord=mod(v_pos,1.0);vec2 pos=mix(u_pattern_tl/u_texsize,u_pattern_br/u_texsize,imagecoord);vec4 out_color=texture2D(u_image,pos);\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pattern_size;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_pattern_size,u_tile_units_to_pixels,a_pos);\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),circle:di(\"varying vec3 v_data;varying float v_visibility;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(\\nantialiased_blur,0.0,extrude_length-radius/(radius+stroke_width)\\n);vec4 out_color=mix(color*opacity,stroke_color*stroke_opacity,color_t);\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_apply_premultiplied(out_color,v_fog_pos);\\n#endif\\ngl_FragColor=out_color*(v_visibility*opacity_t);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"#define NUM_VISIBILITY_RINGS 2\\n#define INV_SQRT2 0.70710678\\n#define ELEVATION_BIAS 0.0001\\n#define NUM_SAMPLES_PER_RING 16\\nuniform mat4 u_matrix;uniform mat2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_pos_3;attribute vec3 a_pos_normal_3;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_tile_id;uniform float u_zoom_transition;uniform vec3 u_up_dir;\\n#endif\\nvarying vec3 v_data;varying float v_visibility;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvec2 calc_offset(vec2 extrusion,float radius,float stroke_width, float view_scale) {return extrusion*(radius+stroke_width)*u_extrude_scale*view_scale;}float cantilevered_elevation(vec2 pos,float radius,float stroke_width,float view_scale) {vec2 c1=pos+calc_offset(vec2(-1,-1),radius,stroke_width,view_scale);vec2 c2=pos+calc_offset(vec2(1,-1),radius,stroke_width,view_scale);vec2 c3=pos+calc_offset(vec2(1,1),radius,stroke_width,view_scale);vec2 c4=pos+calc_offset(vec2(-1,1),radius,stroke_width,view_scale);float h1=elevation(c1)+ELEVATION_BIAS;float h2=elevation(c2)+ELEVATION_BIAS;float h3=elevation(c3)+ELEVATION_BIAS;float h4=elevation(c4)+ELEVATION_BIAS;return max(h4,max(h3,max(h1,h2)));}float circle_elevation(vec2 pos) {\\n#if defined(TERRAIN)\\nreturn elevation(pos)+ELEVATION_BIAS;\\n#else\\nreturn 0.0;\\n#endif\\n}vec4 project_vertex(vec2 extrusion,vec4 world_center,vec4 projected_center,float radius,float stroke_width, float view_scale,mat3 surface_vectors) {vec2 sample_offset=calc_offset(extrusion,radius,stroke_width,view_scale);\\n#ifdef PITCH_WITH_MAP\\n#ifdef PROJECTION_GLOBE_VIEW\\nreturn u_matrix*( world_center+vec4(sample_offset.x*surface_vectors[0]+sample_offset.y*surface_vectors[1],0) );\\n#else\\nreturn u_matrix*( world_center+vec4(sample_offset,0,0) );\\n#endif\\n#else\\nreturn projected_center+vec4(sample_offset,0,0);\\n#endif\\n}float get_sample_step() {\\n#ifdef PITCH_WITH_MAP\\nreturn 2.0*PI/float(NUM_SAMPLES_PER_RING);\\n#else\\nreturn PI/float(NUM_SAMPLES_PER_RING);\\n#endif\\n}void main(void) {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);vec4 world_center;mat3 surface_vectors;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 pos_normal_3=a_pos_normal_3/16384.0;surface_vectors=globe_mercator_surface_vectors(pos_normal_3,u_up_dir,u_zoom_transition);vec3 surface_extrusion=extrude.x*surface_vectors[0]+extrude.y*surface_vectors[1];vec3 globe_elevation=elevationVector(circle_center)*circle_elevation(circle_center);vec3 globe_pos=a_pos_3+surface_extrusion+globe_elevation;vec3 mercator_elevation=u_up_dir*u_tile_up_scale*circle_elevation(circle_center);vec3 merc_pos=mercator_tile_position(u_inv_rot_matrix,circle_center,u_tile_id,u_merc_center)+surface_extrusion+mercator_elevation;vec3 pos=mix_globe_mercator(globe_pos,merc_pos,u_zoom_transition);world_center=vec4(pos,1);\\n#else \\nsurface_vectors=mat3(1.0);float height=circle_elevation(circle_center);world_center=vec4(circle_center,height,1);\\n#endif\\nvec4 projected_center=u_matrix*world_center;float view_scale=0.0;\\n#ifdef PITCH_WITH_MAP\\n#ifdef SCALE_WITH_MAP\\nview_scale=1.0;\\n#else\\nview_scale=projected_center.w/u_camera_to_center_distance;\\n#endif\\n#else\\n#ifdef SCALE_WITH_MAP\\nview_scale=u_camera_to_center_distance;\\n#else\\nview_scale=projected_center.w;\\n#endif\\n#endif\\ngl_Position=project_vertex(extrude,world_center,projected_center,radius,stroke_width,view_scale,surface_vectors);float visibility=0.0;\\n#ifdef TERRAIN\\nfloat step=get_sample_step();vec4 occlusion_world_center;vec4 occlusion_projected_center;\\n#ifdef PITCH_WITH_MAP\\nfloat cantilevered_height=cantilevered_elevation(circle_center,radius,stroke_width,view_scale);occlusion_world_center=vec4(circle_center,cantilevered_height,1);occlusion_projected_center=u_matrix*occlusion_world_center;\\n#else\\nocclusion_world_center=world_center;occlusion_projected_center=projected_center;\\n#endif\\nfor(int ring=0; ring < NUM_VISIBILITY_RINGS; ring++) {float scale=(float(ring)+1.0)/float(NUM_VISIBILITY_RINGS);for(int i=0; i < NUM_SAMPLES_PER_RING; i++) {vec2 extrusion=vec2(cos(step*float(i)),-sin(step*float(i)))*scale;vec4 frag_pos=project_vertex(extrusion,occlusion_world_center,occlusion_projected_center,radius,stroke_width,view_scale,surface_vectors);visibility+=float(!isOccluded(frag_pos));}}visibility/=float(NUM_VISIBILITY_RINGS)*float(NUM_SAMPLES_PER_RING);\\n#else\\nvisibility=1.0;\\n#endif\\n#ifdef PROJECTION_GLOBE_VIEW\\nvisibility=1.0;\\n#endif\\nv_visibility=visibility;lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);\\n#ifdef FOG\\nv_fog_pos=fog_position(world_center.xyz);\\n#endif\\n}\"),clippingMask:di(\"void main() {gl_FragColor=vec4(1.0);}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}\"),heatmap:di(\"uniform highp float u_intensity;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main() {\\n#pragma mapbox: initialize highp float weight\\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\\n#ifdef FOG\\nif (u_is_globe==0) {gl_FragColor.r*=pow(1.0-fog_opacity(v_fog_pos),2.0);}\\n#endif\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_pos_3;attribute vec3 a_pos_normal_3;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_tile_id;uniform float u_zoom_transition;uniform vec3 u_up_dir;\\n#endif\\nvarying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#pragma mapbox: define mediump float radius\\nconst highp float ZERO=1.0/255.0/16.0;\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main(void) {\\n#pragma mapbox: initialize highp float weight\\n#pragma mapbox: initialize mediump float radius\\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec2 tilePos=floor(a_pos*0.5);vec3 pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 pos_normal_3=a_pos_normal_3/16384.0;mat3 surface_vectors=globe_mercator_surface_vectors(pos_normal_3,u_up_dir,u_zoom_transition);vec3 surface_extrusion=extrude.x*surface_vectors[0]+extrude.y*surface_vectors[1];vec3 globe_elevation=elevationVector(tilePos)*elevation(tilePos);vec3 globe_pos=a_pos_3+surface_extrusion+globe_elevation;vec3 mercator_elevation=u_up_dir*u_tile_up_scale*elevation(tilePos);vec3 merc_pos=mercator_tile_position(u_inv_rot_matrix,tilePos,u_tile_id,u_merc_center)+surface_extrusion+mercator_elevation;pos=mix_globe_mercator(globe_pos,merc_pos,u_zoom_transition);\\n#else\\npos=vec3(tilePos+extrude,elevation(tilePos));\\n#endif\\ngl_Position=u_matrix*vec4(pos,1);\\n#ifdef FOG\\nv_fog_pos=fog_position(pos);\\n#endif\\n}\"),heatmapTexture:di(\"uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(0.0);\\n#endif\\n}\",\"attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=vec4(a_pos,0,1);v_pos=a_pos*0.5+0.5;}\"),collisionBox:di(\"varying float v_placed;varying float v_notUsed;void main() {vec4 red =vec4(1.0,0.0,0.0,1.0);vec4 blue=vec4(0.0,0.0,1.0,0.5);gl_FragColor =mix(red,blue,step(0.5,v_placed))*0.5;gl_FragColor*=mix(1.0,0.1,step(0.5,v_notUsed));}\",\"attribute vec3 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;attribute float a_size_scale;attribute vec2 a_padding;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_pos+elevationVector(a_anchor_pos)*elevation(a_anchor_pos),1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(\\n0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,1.5);gl_Position=projectedPoint;gl_Position.xy+=(a_extrude*a_size_scale+a_shift+a_padding)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}\"),collisionCircle:di(\"varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}\",\"attribute vec2 a_pos_2f;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd  =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz  /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos_2f;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(\\nmix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(\\n0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}\"),debug:di(\"uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}\",\"attribute vec2 a_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_pos_3;\\n#endif\\nvarying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {float h=elevation(a_pos);v_uv=a_pos/8192.0;\\n#ifdef PROJECTION_GLOBE_VIEW\\ngl_Position=u_matrix*vec4(a_pos_3+elevationVector(a_pos)*h,1);\\n#else\\ngl_Position=u_matrix*vec4(a_pos*u_overlay_scale,h,1);\\n#endif\\n}\"),fill:di(\"#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\nvec4 out_color=color;\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),fillOutline:di(\"varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);vec4 out_color=outline_color;\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),fillOutlinePattern:di(\"uniform vec2 u_texsize;uniform sampler2D u_image;varying vec2 v_pos;varying vec2 v_pos_world;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;vec2 imagecoord=mod(v_pos,1.0);vec2 pos=mix(pattern_tl/u_texsize,pattern_br/u_texsize,imagecoord);float dist=length(v_pos_world-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);vec4 out_color=texture2D(u_image,pos);\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos;varying vec2 v_pos_world;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern\\n#pragma mapbox: define lowp float pixel_ratio\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern\\n#pragma mapbox: initialize lowp float pixel_ratio\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size=(pattern_br-pattern_tl)/pixel_ratio;v_pos=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,display_size,u_tile_units_to_pixels,a_pos);v_pos_world=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),fillPattern:di(\"uniform vec2 u_texsize;uniform sampler2D u_image;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;vec2 imagecoord=mod(v_pos,1.0);vec2 pos=mix(pattern_tl/u_texsize,pattern_br/u_texsize,imagecoord);vec4 out_color=texture2D(u_image,pos);\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern\\n#pragma mapbox: define lowp float pixel_ratio\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern\\n#pragma mapbox: initialize lowp float pixel_ratio\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;vec2 display_size=(pattern_br-pattern_tl)/pixel_ratio;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,display_size,u_tile_units_to_pixels,a_pos);\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),fillExtrusion:di(\"varying vec4 v_color;\\n#ifdef RENDER_SHADOWS\\nvarying highp vec4 v_pos_light_view_0;varying highp vec4 v_pos_light_view_1;varying float v_depth;\\n#endif\\n#ifdef FAUX_AO\\nuniform lowp vec2 u_ao;varying vec3 v_ao;\\n#endif\\n#ifdef ZERO_ROOF_RADIUS\\nvarying vec4 v_roof_color;\\n#endif\\n#if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS)\\nvarying highp vec3 v_normal;\\n#endif\\nvoid main() {\\n#if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS)\\nvec3 normal=v_normal;\\n#endif\\nfloat z;vec4 color;\\n#ifdef ZERO_ROOF_RADIUS\\nz=float(normal.z > 0.00001);color=mix(v_color,v_roof_color,z);\\n#else\\ncolor=v_color;\\n#endif\\n#ifdef FAUX_AO\\nfloat intensity=u_ao[0];float h=max(0.0,v_ao.z);float h_floors=h/u_ao[1];float y_shade=1.0-0.9*intensity*min(v_ao.y,1.0);float shade=(1.0-0.08*intensity)*(y_shade+(1.0-y_shade)*(1.0-pow(1.0-min(h_floors/16.0,1.0),16.0)))+0.08*intensity*min(h_floors/160.0,1.0);float concave=v_ao.x*v_ao.x;\\n#ifdef ZERO_ROOF_RADIUS\\nconcave*=(1.0-z);\\n#endif\\nfloat x_shade=mix(1.0,mix(0.6,0.75,min(h_floors/30.0,1.0)),intensity)+0.1*intensity*min(h,1.0);shade*=mix(1.0,x_shade*x_shade*x_shade,concave);color.rgb=color.rgb*shade;\\n#endif\\n#ifdef RENDER_SHADOWS\\n#ifdef ZERO_ROOF_RADIUS\\nnormal=mix(normal,vec3(0.0,0.0,1.0),z);\\n#endif\\ncolor.xyz=shadowed_color_normal(color.xyz,normalize(normal),v_pos_light_view_0,v_pos_light_view_1,v_depth);\\n#endif\\n#ifdef FOG\\ncolor=fog_dither(fog_apply_premultiplied(color,v_fog_pos));\\n#endif\\ngl_FragColor=color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform float u_edge_radius;attribute vec4 a_pos_normal_ed;attribute vec2 a_centroid_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_pos_3;attribute vec3 a_pos_normal_3;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_tile_id;uniform float u_zoom_transition;uniform vec3 u_up_dir;uniform float u_height_lift;\\n#endif\\nvarying vec4 v_color;\\n#ifdef RENDER_SHADOWS\\nuniform mat4 u_light_matrix_0;uniform mat4 u_light_matrix_1;varying highp vec4 v_pos_light_view_0;varying highp vec4 v_pos_light_view_1;varying float v_depth;\\n#endif\\n#ifdef ZERO_ROOF_RADIUS\\nvarying vec4 v_roof_color;\\n#endif\\n#if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS)\\nvarying highp vec3 v_normal;\\n#endif\\n#ifdef FAUX_AO\\nuniform lowp vec2 u_ao;varying vec3 v_ao;\\n#endif\\n#pragma mapbox: define highp float base\\n#pragma mapbox: define highp float height\\n#pragma mapbox: define highp vec4 color\\nvoid main() {\\n#pragma mapbox: initialize highp float base\\n#pragma mapbox: initialize highp float height\\n#pragma mapbox: initialize highp vec4 color\\nvec4 pos_nx=floor(a_pos_normal_ed*0.5);vec4 top_up_ny_start=a_pos_normal_ed-2.0*pos_nx;vec3 top_up_ny=top_up_ny_start.xyz;float x_normal=pos_nx.z/8192.0;vec3 normal=top_up_ny.y==1.0 ? vec3(0.0,0.0,1.0) : normalize(vec3(x_normal,(2.0*top_up_ny.z-1.0)*(1.0-abs(x_normal)),0.0));\\n#if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS)\\nv_normal=normal;\\n#endif\\nbase=max(0.0,base);height=max(0.0,top_up_ny.y==0.0 && top_up_ny.x==1.0 ? height-u_edge_radius : height);float t=top_up_ny.x;vec2 centroid_pos=vec2(0.0);\\n#if defined(HAS_CENTROID) || defined(TERRAIN)\\ncentroid_pos=a_centroid_pos;\\n#endif\\nfloat ele=0.0;float h=0.0;float c_ele;vec3 pos;\\n#ifdef TERRAIN\\nbool flat_roof=centroid_pos.x !=0.0 && t > 0.0;ele=elevation(pos_nx.xy);c_ele=flat_roof ? centroid_pos.y==0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;h=flat_roof ? max(c_ele+height,ele+base+2.0) : ele+(t > 0.0 ? height : base==0.0 ?-5.0 : base);pos=vec3(pos_nx.xy,h);\\n#else\\nh=t > 0.0 ? height : base;pos=vec3(pos_nx.xy,h);\\n#endif\\n#ifdef PROJECTION_GLOBE_VIEW\\nfloat lift=float((t+base) > 0.0)*u_height_lift;h+=lift;vec3 globe_normal=normalize(mix(a_pos_normal_3/16384.0,u_up_dir,u_zoom_transition));vec3 globe_pos=a_pos_3+globe_normal*(u_tile_up_scale*h);vec3 merc_pos=mercator_tile_position(u_inv_rot_matrix,pos.xy,u_tile_id,u_merc_center)+u_up_dir*u_tile_up_scale*pos.z;pos=mix_globe_mercator(globe_pos,merc_pos,u_zoom_transition);\\n#endif\\nfloat hidden=float(centroid_pos.x==0.0 && centroid_pos.y==1.0);gl_Position=mix(u_matrix*vec4(pos,1),AWAY,hidden);\\n#ifdef RENDER_SHADOWS\\nv_pos_light_view_0=u_light_matrix_0*vec4(pos,1);v_pos_light_view_1=u_light_matrix_1*vec4(pos,1);v_depth=gl_Position.w;\\n#endif\\nfloat NdotL=0.0;float colorvalue=0.0;\\n#ifdef LIGHTING_3D_MODE\\nNdotL=calculate_NdotL(normal);\\n#else\\ncolorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;NdotL=clamp(dot(normal,u_lightpos),0.0,1.0);NdotL=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),NdotL);\\n#endif\\nif (normal.y !=0.0) {float r=0.84;\\n#ifndef LIGHTING_3D_MODE\\nr=mix(0.7,0.98,1.0-u_lightintensity);\\n#endif\\nNdotL*=(\\n(1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),r,1.0)));}v_color=vec4(0.0,0.0,0.0,1.0);\\n#ifdef FAUX_AO\\nfloat concave=pos_nx.w-floor(pos_nx.w*0.5)*2.0;float start=top_up_ny_start.w;float y_ground=1.0-clamp(t+base,0.0,1.0);float top_height=height;\\n#ifdef TERRAIN\\ntop_height=mix(max(c_ele+height,ele+base+2.0),ele+height,float(centroid_pos.x==0.0))-ele;y_ground+=y_ground*5.0/max(3.0,top_height);\\n#endif\\nv_ao=vec3(mix(concave,-concave,start),y_ground,h-ele);NdotL*=(1.0+0.05*(1.0-top_up_ny.y)*u_ao[0]);\\n#ifdef PROJECTION_GLOBE_VIEW\\ntop_height+=u_height_lift;\\n#endif\\ngl_Position.z-=(0.0000006*(min(top_height,500.)+2.0*min(base,500.0)+60.0*concave+3.0*start))*gl_Position.w;\\n#endif\\n#ifdef LIGHTING_3D_MODE\\nv_color=apply_lighting(color,NdotL);\\n#else\\nv_color.rgb+=clamp(color.rgb*NdotL*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));\\n#endif\\nv_color*=u_opacity;\\n#ifdef ZERO_ROOF_RADIUS\\nv_roof_color=vec4(0.0,0.0,0.0,1.0);\\n#ifdef LIGHTING_3D_MODE\\nv_roof_color=apply_lighting(color,calculate_NdotL(vec3(0.0,0.0,1.0)));\\n#else\\nfloat roofNdotL=clamp(u_lightpos.z,0.0,1.0);roofNdotL=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),roofNdotL);v_roof_color.rgb+=clamp(color.rgb*roofNdotL*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));\\n#endif\\nv_roof_color*=u_opacity;\\n#endif\\n#ifdef FOG\\nv_fog_pos=fog_position(pos);\\n#endif\\n}\"),fillExtrusionPattern:di(\"uniform vec2 u_texsize;uniform sampler2D u_image;\\n#ifdef FAUX_AO\\nuniform lowp vec2 u_ao;varying vec3 v_ao;\\n#endif\\n#ifdef LIGHTING_3D_MODE\\nvarying float v_NdotL;\\n#endif\\nvarying vec2 v_pos;varying vec4 v_lighting;uniform lowp float u_opacity;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern\\n#pragma mapbox: define lowp float pixel_ratio\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern\\n#pragma mapbox: initialize lowp float pixel_ratio\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;vec2 imagecoord=mod(v_pos,1.0);vec2 pos=mix(pattern_tl/u_texsize,pattern_br/u_texsize,imagecoord);vec4 out_color=texture2D(u_image,pos);\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color,v_NdotL)*u_opacity;\\n#else\\nout_color=out_color*v_lighting;\\n#endif\\n#ifdef FAUX_AO\\nfloat intensity=u_ao[0];float h=max(0.0,v_ao.z);float h_floors=h/u_ao[1];float y_shade=1.0-0.9*intensity*min(v_ao.y,1.0);float shade=(1.0-0.08*intensity)*(y_shade+(1.0-y_shade)*(1.0-pow(1.0-min(h_floors/16.0,1.0),16.0)))+0.08*intensity*min(h_floors/160.0,1.0);float concave=v_ao.x*v_ao.x;float x_shade=mix(1.0,mix(0.6,0.75,min(h_floors/30.0,1.0)),intensity)+0.1*intensity*min(h,1.0);shade*=mix(1.0,x_shade*x_shade*x_shade,concave);out_color.rgb=out_color.rgb*shade;\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=out_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform float u_tile_units_to_pixels;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec4 a_pos_normal_ed;attribute vec2 a_centroid_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_pos_3;attribute vec3 a_pos_normal_3;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_tile_id;uniform float u_zoom_transition;uniform vec3 u_up_dir;uniform float u_height_lift;\\n#endif\\nvarying vec2 v_pos;varying vec4 v_lighting;\\n#ifdef FAUX_AO\\nuniform lowp vec2 u_ao;varying vec3 v_ao;\\n#endif\\n#ifdef LIGHTING_3D_MODE\\nvarying float v_NdotL;\\n#endif\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern\\n#pragma mapbox: define lowp float pixel_ratio\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern\\n#pragma mapbox: initialize lowp float pixel_ratio\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;vec4 pos_nx=floor(a_pos_normal_ed*0.5);mediump vec4 top_up_ny_start=a_pos_normal_ed-2.0*pos_nx;mediump vec3 top_up_ny=top_up_ny_start.xyz;float x_normal=pos_nx.z/8192.0;vec3 normal=top_up_ny.y==1.0 ? vec3(0.0,0.0,1.0) : normalize(vec3(x_normal,(2.0*top_up_ny.z-1.0)*(1.0-abs(x_normal)),0.0));float edgedistance=a_pos_normal_ed.w;vec2 display_size=(pattern_br-pattern_tl)/pixel_ratio;base=max(0.0,base);height=max(0.0,height);float t=top_up_ny.x;float z=t > 0.0 ? height : base;vec2 centroid_pos=vec2(0.0);\\n#if defined(HAS_CENTROID) || defined(TERRAIN)\\ncentroid_pos=a_centroid_pos;\\n#endif\\nfloat ele=0.0;float h=z;vec3 p;float c_ele;\\n#ifdef TERRAIN\\nbool flat_roof=centroid_pos.x !=0.0 && t > 0.0;ele=elevation(pos_nx.xy);c_ele=flat_roof ? centroid_pos.y==0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;h=flat_roof ? max(c_ele+height,ele+base+2.0) : ele+(t > 0.0 ? height : base==0.0 ?-5.0 : base);p=vec3(pos_nx.xy,h);\\n#else\\np=vec3(pos_nx.xy,z);\\n#endif\\n#ifdef PROJECTION_GLOBE_VIEW\\nfloat lift=float((t+base) > 0.0)*u_height_lift;h+=lift;vec3 globe_normal=normalize(mix(a_pos_normal_3/16384.0,u_up_dir,u_zoom_transition));vec3 globe_pos=a_pos_3+globe_normal*(u_tile_up_scale*(p.z+lift));vec3 merc_pos=mercator_tile_position(u_inv_rot_matrix,p.xy,u_tile_id,u_merc_center)+u_up_dir*u_tile_up_scale*p.z;p=mix_globe_mercator(globe_pos,merc_pos,u_zoom_transition);\\n#endif\\nfloat hidden=float(centroid_pos.x==0.0 && centroid_pos.y==1.0);gl_Position=mix(u_matrix*vec4(p,1),AWAY,hidden);vec2 pos=normal.z==1.0\\n? pos_nx.xy\\n: vec2(edgedistance,z*u_height_factor);v_pos=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,display_size,u_tile_units_to_pixels,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float NdotL=0.0;\\n#ifdef LIGHTING_3D_MODE\\nNdotL=calculate_NdotL(normal);\\n#else\\nNdotL=clamp(dot(normal,u_lightpos),0.0,1.0);NdotL=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),NdotL);\\n#endif\\nif (normal.y !=0.0) {float r=0.84;\\n#ifndef LIGHTING_3D_MODE\\nr=mix(0.7,0.98,1.0-u_lightintensity);\\n#endif\\nNdotL*=(\\n(1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),r,1.0)));}\\n#ifdef FAUX_AO\\nfloat concave=pos_nx.w-floor(pos_nx.w*0.5)*2.0;float start=top_up_ny_start.w;float y_ground=1.0-clamp(t+base,0.0,1.0);float top_height=height;\\n#ifdef TERRAIN\\ntop_height=mix(max(c_ele+height,ele+base+2.0),ele+height,float(centroid_pos.x==0.0))-ele;y_ground+=y_ground*5.0/max(3.0,top_height);\\n#endif\\nv_ao=vec3(mix(concave,-concave,start),y_ground,h-ele);NdotL*=(1.0+0.05*(1.0-top_up_ny.y)*u_ao[0]);\\n#ifdef PROJECTION_GLOBE_VIEW\\ntop_height+=u_height_lift;\\n#endif\\ngl_Position.z-=(0.0000006*(min(top_height,500.)+2.0*min(base,500.0)+60.0*concave+3.0*start))*gl_Position.w;\\n#endif\\n#ifdef LIGHTING_3D_MODE\\nv_NdotL=NdotL;\\n#else\\nv_lighting.rgb+=clamp(NdotL*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;\\n#endif \\n#ifdef FOG\\nv_fog_pos=fog_position(p);\\n#endif\\n}\"),hillshadePrepare:di(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord) {\\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\\nreturn texture2D(u_image,coord).a/4.0;\\n#else\\nvec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;\\n#endif\\n}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y));float b=getElevation(v_pos+vec2(0,-epsilon.y));float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y));float d=getElevation(v_pos+vec2(-epsilon.x,0));float e=getElevation(v_pos+vec2(epsilon.x,0));float f=getElevation(v_pos+vec2(-epsilon.x,epsilon.y));float g=getElevation(v_pos+vec2(0,epsilon.y));float h=getElevation(v_pos+vec2(epsilon.x,epsilon.y));float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2(\\n(c+e+e+h)-(a+d+d+f),(f+g+g+h)-(a+b+b+c)\\n)/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(\\nderiv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}\"),hillshade:di(\"uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;void main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\\n#ifdef LIGHTING_3D_MODE\\ngl_FragColor=apply_lighting(gl_FragColor);\\n#endif\\n#ifdef FOG\\ngl_FragColor=fog_dither(fog_apply_premultiplied(gl_FragColor,v_fog_pos));\\n#endif\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),line:di(\"uniform lowp float u_device_pixel_ratio;uniform float u_alpha_discard_threshold;uniform highp vec2 u_trim_offset;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec4 v_uv;\\n#ifdef RENDER_LINE_DASH\\nuniform sampler2D u_dash_image;varying vec2 v_tex;\\n#endif\\n#ifdef RENDER_LINE_GRADIENT\\nuniform sampler2D u_gradient_image;\\n#endif\\nuniform float u_border_width;uniform vec4 u_border_color;float luminance(vec3 c) {return (c.r+c.r+c.b+c.g+c.g+c.g)*0.1667;}\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 dash\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nfloat linearstep(float edge0,float edge1,float x) {return  clamp((x-edge0)/(edge1-edge0),0.0,1.0);}void main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize lowp vec4 dash\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);\\n#ifdef RENDER_LINE_DASH\\nfloat sdfdist=texture2D(u_dash_image,v_tex).a;float sdfgamma=1.0/(2.0*u_device_pixel_ratio)/dash.z;alpha*=linearstep(0.5-sdfgamma/floorwidth,0.5+sdfgamma/floorwidth,sdfdist);\\n#endif\\nhighp vec4 out_color;\\n#ifdef RENDER_LINE_GRADIENT\\nout_color=texture2D(u_gradient_image,v_uv.xy);\\n#else\\nout_color=color;\\n#endif\\nfloat trimmed=1.0;\\n#ifdef RENDER_LINE_TRIM_OFFSET\\nhighp float start=v_uv[2];highp float end=v_uv[3];highp float trim_start=u_trim_offset[0];highp float trim_end=u_trim_offset[1];highp float line_progress=(start+(v_uv.x)*(end-start));if (trim_end > trim_start) {if (line_progress <=trim_end && line_progress >=trim_start) {out_color=vec4(0,0,0,0);trimmed=0.0;}}\\n#endif\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply_premultiplied(out_color,v_fog_pos));\\n#endif\\n#ifdef RENDER_LINE_ALPHA_DISCARD\\nif (alpha < u_alpha_discard_threshold) {discard;}\\n#endif\\n#ifdef RENDER_LINE_BORDER\\nfloat edgeBlur=(u_border_width+1.0/u_device_pixel_ratio);float alpha2=clamp(min(dist-(v_width2.t-edgeBlur),v_width2.s-dist)/edgeBlur,0.0,1.0);if (alpha2 < 1.) {float smoothAlpha=smoothstep(0.6,1.0,alpha2);\\n#ifdef RENDER_LINE_BORDER_AUTO\\nfloat Y=(out_color.a > 0.01) ? luminance(out_color.rgb/out_color.a) : 1.;float adjustment=(Y > 0.) ? 0.5/Y : 0.45;if (out_color.a > 0.25 && Y < 0.25) {vec3 borderColor=(Y > 0.) ? out_color.rgb : vec3(1,1,1)*out_color.a;out_color.rgb=out_color.rgb+borderColor*(adjustment*(1.0-smoothAlpha));} else {out_color.rgb*=(0.6 +0.4*smoothAlpha);}\\n#else\\nout_color.rgb=mix(u_border_color.rgb*u_border_color.a*trimmed,out_color.rgb,smoothAlpha);\\n#endif\\n}\\n#endif\\ngl_FragColor=out_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define EXTRUDE_SCALE 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;\\n#if defined(RENDER_LINE_GRADIENT) || defined(RENDER_LINE_TRIM_OFFSET)\\nattribute highp vec4 a_packed;\\n#endif\\n#ifdef RENDER_LINE_DASH\\nattribute float a_linesofar;\\n#endif\\nuniform mat4 u_matrix;uniform mat2 u_pixels_to_tile_units;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec4 v_uv;\\n#ifdef RENDER_LINE_DASH\\nuniform vec2 u_texsize;uniform float u_tile_units_to_pixels;varying vec2 v_tex;\\n#endif\\n#ifdef RENDER_LINE_GRADIENT\\nuniform float u_image_height;\\n#endif\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 dash\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize lowp vec4 dash\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*EXTRUDE_SCALE;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*EXTRUDE_SCALE*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist*u_pixels_to_tile_units,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2*u_pixels_to_tile_units,0.0,1.0)+projected_extrude;\\n#ifndef RENDER_TO_TEXTURE\\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\\n#else\\nv_gamma_scale=1.0;\\n#endif\\n#if defined(RENDER_LINE_GRADIENT) || defined(RENDER_LINE_TRIM_OFFSET)\\nfloat a_uv_x=a_packed[0];float a_split_index=a_packed[1];highp float a_clip_start=a_packed[2];highp float a_clip_end=a_packed[3];\\n#ifdef RENDER_LINE_GRADIENT\\nhighp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec4(a_uv_x,a_split_index*texel_height-half_texel_height,a_clip_start,a_clip_end);\\n#else\\nv_uv=vec4(a_uv_x,0.0,a_clip_start,a_clip_end);\\n#endif\\n#endif\\n#ifdef RENDER_LINE_DASH\\nfloat scale=dash.z==0.0 ? 0.0 : u_tile_units_to_pixels/dash.z;float height=dash.y;v_tex=vec2(a_linesofar*scale/floorwidth,(-normal.y*height+dash.x+0.5)/u_texsize.y);\\n#endif\\nv_width2=vec2(outset,inset);\\n#ifdef FOG\\nv_fog_pos=fog_position(pos);\\n#endif\\n}\"),linePattern:di(\"uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_tile_units_to_pixels;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp vec4 pattern\\n#pragma mapbox: define lowp float pixel_ratio\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize mediump vec4 pattern\\n#pragma mapbox: initialize lowp float pixel_ratio\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nvec2 pattern_tl=pattern.xy;vec2 pattern_br=pattern.zw;vec2 display_size=(pattern_br-pattern_tl)/pixel_ratio;vec2 pattern_size=vec2(display_size.x/u_tile_units_to_pixels,display_size.y);float aspect=display_size.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x=mod(v_linesofar/pattern_size.x*aspect,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos=mix(pattern_tl*texel_size-texel_size,pattern_br*texel_size+texel_size,vec2(x,y));vec4 color=texture2D(u_image,pos);\\n#ifdef LIGHTING_3D_MODE\\ncolor=apply_lighting(color);\\n#endif\\n#ifdef FOG\\ncolor=fog_dither(fog_apply_premultiplied(color,v_fog_pos));\\n#endif\\ngl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_linesofar;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mat2 u_pixels_to_tile_units;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 pattern\\n#pragma mapbox: define lowp float pixel_ratio\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize mediump vec4 pattern\\n#pragma mapbox: initialize lowp float pixel_ratio\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist*u_pixels_to_tile_units,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2*u_pixels_to_tile_units,0.0,1.0)+projected_extrude;\\n#ifndef RENDER_TO_TEXTURE\\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\\n#else\\nv_gamma_scale=1.0;\\n#endif\\nv_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;\\n#ifdef FOG\\nv_fog_pos=fog_position(pos);\\n#endif\\n}\"),raster:di(\"uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(\\ndot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);vec3 out_color=mix(u_high_vec,u_low_vec,rgb);\\n#ifdef LIGHTING_3D_MODE\\nout_color=apply_lighting(out_color);\\n#endif\\n#ifdef FOG\\nout_color=fog_dither(fog_apply(out_color,v_fog_pos));\\n#endif\\ngl_FragColor=vec4(out_color*color.a,color.a);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform vec2 u_perspective_transform;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {float w=1.0+dot(a_texture_pos,u_perspective_transform);gl_Position=u_matrix*vec4(a_pos*w,0,w);v_pos0=a_texture_pos/8192.0;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;\\n#ifdef FOG\\nv_fog_pos=fog_position(a_pos);\\n#endif\\n}\"),symbolIcon:di(\"uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec4 a_pos_offset;attribute vec4 a_tex_size;attribute vec4 a_pixeloffset;attribute vec4 a_projected_pos;attribute float a_fade_opacity;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_globe_anchor;attribute vec3 a_globe_normal;\\n#endif\\nuniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;uniform vec3 u_up_vector;\\n#ifdef PROJECTION_GLOBE_VIEW\\nuniform vec3 u_tile_id;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_camera_forward;uniform float u_zoom_transition;uniform vec3 u_ecef_origin;uniform mat4 u_tile_matrix;\\n#endif\\nvarying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_tex_size.xy;vec2 a_size=a_tex_size.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_min_font_scale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[3];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 tile_anchor=a_pos;vec3 h=elevationVector(tile_anchor)*elevation(tile_anchor);float globe_occlusion_fade;vec3 world_pos;vec3 mercator_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nmercator_pos=mercator_tile_position(u_inv_rot_matrix,tile_anchor,u_tile_id,u_merc_center);world_pos=mix_globe_mercator(a_globe_anchor+h,mercator_pos,u_zoom_transition);vec4 ecef_point=u_tile_matrix*vec4(world_pos,1.0);vec3 origin_to_point=ecef_point.xyz-u_ecef_origin;globe_occlusion_fade=dot(origin_to_point,u_camera_forward) >=0.0 ? 0.0 : 1.0;\\n#else\\nworld_pos=vec3(tile_anchor,0)+h;globe_occlusion_fade=1.0;\\n#endif\\nvec4 projected_point=u_matrix*vec4(world_pos,1);highp float camera_to_anchor_distance=projected_point.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float font_scale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjected_point;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 displacement=vec3(a_globe_normal.z,0,-a_globe_normal.x);offsetProjected_point=u_matrix*vec4(a_globe_anchor+displacement,1);\\n#else\\noffsetProjected_point=u_matrix*vec4(tile_anchor+vec2(1,0),0,1);\\n#endif\\nvec2 a=projected_point.xy/projected_point.w;vec2 b=offsetProjected_point.xy/offsetProjected_point.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}vec4 projected_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 proj_pos=mix_globe_mercator(a_projected_pos.xyz+h,mercator_pos,u_zoom_transition);projected_pos=u_label_plane_matrix*vec4(proj_pos,1.0);\\n#else\\nprojected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h.z,1.0);\\n#endif\\nhighp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*max(a_min_font_scale,font_scale)+a_pxoffset/16.0);\\n#ifdef TERRAIN\\n#ifdef PITCH_WITH_MAP_TERRAIN\\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\\n#endif\\n#endif\\nfloat occlusion_fade=occlusionFade(projected_point)*globe_occlusion_fade;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 xAxis=u_pitch_with_map ? normalize(cross(a_globe_normal,u_up_vector)) : vec3(1,0,0);vec3 yAxis=u_pitch_with_map ? normalize(cross(a_globe_normal,xAxis)) : vec3(0,1,0);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xyz/projected_pos.w+xAxis*offset.x+yAxis*offset.y,1.0),AWAY,float(projected_point.w <=0.0 || occlusion_fade==0.0));\\n#else\\ngl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projected_point.w <=0.0 || occlusion_fade==0.0));\\n#endif\\nfloat projection_transition_fade=1.0;\\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\\nprojection_transition_fade=1.0-step(EPSILON,u_zoom_transition);\\n#endif\\nv_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change))*projection_transition_fade;}\"),symbolSDF:di(\"#define SDF_PX 8.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec4 a_pos_offset;attribute vec4 a_tex_size;attribute vec4 a_pixeloffset;attribute vec4 a_projected_pos;attribute float a_fade_opacity;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_globe_anchor;attribute vec3 a_globe_normal;\\n#endif\\nuniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec3 u_up_vector;\\n#ifdef PROJECTION_GLOBE_VIEW\\nuniform vec3 u_tile_id;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_camera_forward;uniform float u_zoom_transition;uniform vec3 u_ecef_origin;uniform mat4 u_tile_matrix;\\n#endif\\nvarying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_tex_size.xy;vec2 a_size=a_tex_size.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[3];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 tile_anchor=a_pos;vec3 h=elevationVector(tile_anchor)*elevation(tile_anchor);float globe_occlusion_fade;vec3 world_pos;vec3 mercator_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nmercator_pos=mercator_tile_position(u_inv_rot_matrix,tile_anchor,u_tile_id,u_merc_center);world_pos=mix_globe_mercator(a_globe_anchor+h,mercator_pos,u_zoom_transition);vec4 ecef_point=u_tile_matrix*vec4(world_pos,1.0);vec3 origin_to_point=ecef_point.xyz-u_ecef_origin;globe_occlusion_fade=dot(origin_to_point,u_camera_forward) >=0.0 ? 0.0 : 1.0;\\n#else\\nworld_pos=vec3(tile_anchor,0)+h;globe_occlusion_fade=1.0;\\n#endif\\nvec4 projected_point=u_matrix*vec4(world_pos,1);highp float camera_to_anchor_distance=projected_point.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetprojected_point;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 displacement=vec3(a_globe_normal.z,0,-a_globe_normal.x);offsetprojected_point=u_matrix*vec4(a_globe_anchor+displacement,1);\\n#else\\noffsetprojected_point=u_matrix*vec4(tile_anchor+vec2(1,0),0,1);\\n#endif\\nvec2 a=projected_point.xy/projected_point.w;vec2 b=offsetprojected_point.xy/offsetprojected_point.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}vec4 projected_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 proj_pos=mix_globe_mercator(a_projected_pos.xyz+h,mercator_pos,u_zoom_transition);projected_pos=u_label_plane_matrix*vec4(proj_pos,1.0);\\n#else\\nprojected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h.z,1.0);\\n#endif\\nhighp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset);\\n#ifdef TERRAIN\\n#ifdef PITCH_WITH_MAP_TERRAIN\\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\\n#endif\\n#endif\\nfloat occlusion_fade=occlusionFade(projected_point)*globe_occlusion_fade;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 xAxis=u_pitch_with_map ? normalize(cross(a_globe_normal,u_up_vector)) : vec3(1,0,0);vec3 yAxis=u_pitch_with_map ? normalize(cross(a_globe_normal,xAxis)) : vec3(0,1,0);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xyz/projected_pos.w+xAxis*offset.x+yAxis*offset.y,1.0),AWAY,float(projected_point.w <=0.0 || occlusion_fade==0.0));\\n#else\\ngl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projected_point.w <=0.0 || occlusion_fade==0.0));\\n#endif\\nfloat gamma_scale=gl_Position.w;float projection_transition_fade=1.0;\\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\\nprojection_transition_fade=1.0-step(EPSILON,u_zoom_transition);\\n#endif\\nvec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity*projection_transition_fade);}\"),symbolTextAndIcon:di(\"#define SDF_PX 8.0\\n#define SDF 1.0\\n#define ICON 0.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec4 a_pos_offset;attribute vec4 a_tex_size;attribute vec4 a_projected_pos;attribute float a_fade_opacity;\\n#ifdef PROJECTION_GLOBE_VIEW\\nattribute vec3 a_globe_anchor;attribute vec3 a_globe_normal;\\n#endif\\nuniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec3 u_up_vector;uniform vec2 u_texsize_icon;\\n#ifdef PROJECTION_GLOBE_VIEW\\nuniform vec3 u_tile_id;uniform mat4 u_inv_rot_matrix;uniform vec2 u_merc_center;uniform vec3 u_camera_forward;uniform float u_zoom_transition;uniform vec3 u_ecef_origin;uniform mat4 u_tile_matrix;\\n#endif\\nvarying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_tex_size.xy;vec2 a_size=a_tex_size.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[3];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 tile_anchor=a_pos;vec3 h=elevationVector(tile_anchor)*elevation(tile_anchor);float globe_occlusion_fade;vec3 world_pos;vec3 mercator_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nmercator_pos=mercator_tile_position(u_inv_rot_matrix,tile_anchor,u_tile_id,u_merc_center);world_pos=mix_globe_mercator(a_globe_anchor+h,mercator_pos,u_zoom_transition);vec4 ecef_point=u_tile_matrix*vec4(world_pos,1.0);vec3 origin_to_point=ecef_point.xyz-u_ecef_origin;globe_occlusion_fade=dot(origin_to_point,u_camera_forward) >=0.0 ? 0.0 : 1.0;\\n#else\\nworld_pos=vec3(tile_anchor,0)+h;globe_occlusion_fade=1.0;\\n#endif\\nvec4 projected_point=u_matrix*vec4(world_pos,1);highp float camera_to_anchor_distance=projected_point.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float font_scale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offset_projected_point=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projected_point.xy/projected_point.w;vec2 b=offset_projected_point.xy/offset_projected_point.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}vec4 projected_pos;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 proj_pos=mix_globe_mercator(a_projected_pos.xyz+h,mercator_pos,u_zoom_transition);projected_pos=u_label_plane_matrix*vec4(proj_pos,1.0);\\n#else\\nprojected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h.z,1.0);\\n#endif\\nhighp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*font_scale);\\n#ifdef TERRAIN\\n#ifdef PITCH_WITH_MAP_TERRAIN\\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\\n#endif\\n#endif\\nfloat occlusion_fade=occlusionFade(projected_point)*globe_occlusion_fade;\\n#ifdef PROJECTION_GLOBE_VIEW\\nvec3 xAxis=u_pitch_with_map ? normalize(cross(a_globe_normal,u_up_vector)) : vec3(1,0,0);vec3 yAxis=u_pitch_with_map ? normalize(cross(a_globe_normal,xAxis)) : vec3(0,1,0);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xyz/projected_pos.w+xAxis*offset.x+yAxis*offset.y,1.0),AWAY,float(projected_point.w <=0.0 || occlusion_fade==0.0));\\n#else\\ngl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projected_point.w <=0.0 || occlusion_fade==0.0));\\n#endif\\nfloat gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));float projection_transition_fade=1.0;\\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\\nprojection_transition_fade=1.0-step(EPSILON,u_zoom_transition);\\n#endif\\nv_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity*projection_transition_fade,is_sdf);}\"),terrainRaster:di(\"uniform sampler2D u_image0;varying vec2 v_pos0;\\n#ifdef FOG\\nvarying float v_fog_opacity;\\n#endif\\n#ifdef RENDER_SHADOWS\\nvarying vec4 v_pos_light_view_0;varying vec4 v_pos_light_view_1;varying float v_depth;\\n#endif\\nvoid main() {vec4 color=texture2D(u_image0,v_pos0);\\n#ifdef RENDER_SHADOWS\\ncolor.xyz=shadowed_color(color.xyz,v_pos_light_view_0,v_pos_light_view_1,v_depth);\\n#endif\\n#ifdef FOG\\n#ifdef ZERO_EXAGGERATION\\ncolor=fog_dither(fog_apply_premultiplied(color,v_fog_pos));\\n#else\\ncolor=fog_dither(fog_apply_from_vert(color,v_fog_opacity));\\n#endif\\n#endif\\ngl_FragColor=color;\\n#ifdef TERRAIN_WIREFRAME\\ngl_FragColor=vec4(1.0,0.0,0.0,0.8);\\n#endif\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform float u_skirt_height;attribute vec2 a_pos;varying vec2 v_pos0;\\n#ifdef FOG\\nvarying float v_fog_opacity;\\n#endif\\n#ifdef RENDER_SHADOWS\\nuniform mat4 u_light_matrix_0;uniform mat4 u_light_matrix_1;varying vec4 v_pos_light_view_0;varying vec4 v_pos_light_view_1;varying float v_depth;\\n#endif\\nconst float wireframeOffset=0.00015;void main() {vec3 decomposedPosAndSkirt=decomposeToPosAndSkirt(a_pos);float skirt=decomposedPosAndSkirt.z;vec2 decodedPos=decomposedPosAndSkirt.xy;float elevation=elevation(decodedPos)-skirt*u_skirt_height;\\n#ifdef TERRAIN_WIREFRAME\\nelevation+=wireframeOffset;\\n#endif\\nv_pos0=decodedPos/8192.0;gl_Position=u_matrix*vec4(decodedPos,elevation,1.0);\\n#ifdef FOG\\n#ifdef ZERO_EXAGGERATION\\nv_fog_pos=fog_position(decodedPos);\\n#else\\nv_fog_opacity=fog(fog_position(vec3(decodedPos,elevation)));\\n#endif\\n#endif\\n#ifdef RENDER_SHADOWS\\nvec3 pos=vec3(decodedPos,elevation);v_pos_light_view_0=u_light_matrix_0*vec4(pos,1.);v_pos_light_view_1=u_light_matrix_1*vec4(pos,1.);v_depth=gl_Position.w;\\n#endif\\n}\"),terrainDepth:di(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nvarying float v_depth;void main() {gl_FragColor=pack_depth(v_depth);}\",\"uniform mat4 u_matrix;attribute vec2 a_pos;varying float v_depth;void main() {float elevation=elevation(a_pos);gl_Position=u_matrix*vec4(a_pos,elevation,1.0);v_depth=gl_Position.z/gl_Position.w;}\"),skybox:di(\"\\nvarying lowp vec3 v_uv;uniform lowp samplerCube u_cubemap;uniform lowp float u_opacity;uniform highp float u_temporal_offset;uniform highp vec3 u_sun_direction;float sun_disk(highp vec3 ray_direction,highp vec3 sun_direction) {highp float cos_angle=dot(normalize(ray_direction),sun_direction);const highp float cos_sun_angular_diameter=0.99996192306;const highp float smoothstep_delta=1e-5;return smoothstep(\\ncos_sun_angular_diameter-smoothstep_delta,cos_sun_angular_diameter+smoothstep_delta,cos_angle);}float map(float value,float start,float end,float new_start,float new_end) {return ((value-start)*(new_end-new_start))/(end-start)+new_start;}void main() {vec3 uv=v_uv;const float y_bias=0.015;uv.y+=y_bias;uv.y=pow(abs(uv.y),1.0/5.0);uv.y=map(uv.y,0.0,1.0,-1.0,1.0);vec3 sky_color=textureCube(u_cubemap,uv).rgb;\\n#ifdef FOG\\nsky_color=fog_apply_sky_gradient(v_uv.xzy,sky_color);\\n#endif\\nsky_color.rgb=dither(sky_color.rgb,gl_FragCoord.xy+u_temporal_offset);sky_color+=0.1*sun_disk(v_uv,u_sun_direction);gl_FragColor=vec4(sky_color*u_opacity,u_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",ti),skyboxGradient:di(\"varying highp vec3 v_uv;uniform lowp sampler2D u_color_ramp;uniform highp vec3 u_center_direction;uniform lowp float u_radius;uniform lowp float u_opacity;uniform highp float u_temporal_offset;void main() {float progress=acos(dot(normalize(v_uv),u_center_direction))/u_radius;vec4 color=texture2D(u_color_ramp,vec2(progress,0.5));\\n#ifdef FOG\\ncolor.rgb=fog_apply_sky_gradient(v_uv.xzy,color.rgb/color.a)*color.a;\\n#endif\\ncolor*=u_opacity;color.rgb=dither(color.rgb,gl_FragCoord.xy+u_temporal_offset);gl_FragColor=color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",ti),skyboxCapture:di(\"\\nvarying highp vec3 v_position;uniform highp float u_sun_intensity;uniform highp float u_luminance;uniform lowp vec3 u_sun_direction;uniform highp vec4 u_color_tint_r;uniform highp vec4 u_color_tint_m;\\n#ifdef GL_ES\\nprecision highp float;\\n#endif\\n#define BETA_R                  vec3(5.5e-6,13.0e-6,22.4e-6)\\n#define BETA_M                  vec3(21e-6,21e-6,21e-6)\\n#define MIE_G                   0.76\\n#define DENSITY_HEIGHT_SCALE_R  8000.0\\n#define DENSITY_HEIGHT_SCALE_M  1200.0\\n#define PLANET_RADIUS           6360e3\\n#define ATMOSPHERE_RADIUS       6420e3\\n#define SAMPLE_STEPS            10\\n#define DENSITY_STEPS           4\\nfloat ray_sphere_exit(vec3 orig,vec3 dir,float radius) {float a=dot(dir,dir);float b=2.0*dot(dir,orig);float c=dot(orig,orig)-radius*radius;float d=sqrt(b*b-4.0*a*c);return (-b+d)/(2.0*a);}vec3 extinction(vec2 density) {return exp(-vec3(BETA_R*u_color_tint_r.a*density.x+BETA_M*u_color_tint_m.a*density.y));}vec2 local_density(vec3 point) {float height=max(length(point)-PLANET_RADIUS,0.0);float exp_r=exp(-height/DENSITY_HEIGHT_SCALE_R);float exp_m=exp(-height/DENSITY_HEIGHT_SCALE_M);return vec2(exp_r,exp_m);}float phase_ray(float cos_angle) {return (3.0/(16.0*PI))*(1.0+cos_angle*cos_angle);}float phase_mie(float cos_angle) {return (3.0/(8.0*PI))*((1.0-MIE_G*MIE_G)*(1.0+cos_angle*cos_angle))/((2.0+MIE_G*MIE_G)*pow(1.0+MIE_G*MIE_G-2.0*MIE_G*cos_angle,1.5));}vec2 density_to_atmosphere(vec3 point,vec3 light_dir) {float ray_len=ray_sphere_exit(point,light_dir,ATMOSPHERE_RADIUS);float step_len=ray_len/float(DENSITY_STEPS);vec2 density_point_to_atmosphere=vec2(0.0);for (int i=0; i < DENSITY_STEPS;++i) {vec3 point_on_ray=point+light_dir*((float(i)+0.5)*step_len);density_point_to_atmosphere+=local_density(point_on_ray)*step_len;;}return density_point_to_atmosphere;}vec3 atmosphere(vec3 ray_dir,vec3 sun_direction,float sun_intensity) {vec2 density_orig_to_point=vec2(0.0);vec3 scatter_r=vec3(0.0);vec3 scatter_m=vec3(0.0);vec3 origin=vec3(0.0,PLANET_RADIUS,0.0);float ray_len=ray_sphere_exit(origin,ray_dir,ATMOSPHERE_RADIUS);float step_len=ray_len/float(SAMPLE_STEPS);for (int i=0; i < SAMPLE_STEPS;++i) {vec3 point_on_ray=origin+ray_dir*((float(i)+0.5)*step_len);vec2 density=local_density(point_on_ray)*step_len;density_orig_to_point+=density;vec2 density_point_to_atmosphere=density_to_atmosphere(point_on_ray,sun_direction);vec2 density_orig_to_atmosphere=density_orig_to_point+density_point_to_atmosphere;vec3 extinction=extinction(density_orig_to_atmosphere);scatter_r+=density.x*extinction;scatter_m+=density.y*extinction;}float cos_angle=dot(ray_dir,sun_direction);float phase_r=phase_ray(cos_angle);float phase_m=phase_mie(cos_angle);vec3 beta_r=BETA_R*u_color_tint_r.rgb*u_color_tint_r.a;vec3 beta_m=BETA_M*u_color_tint_m.rgb*u_color_tint_m.a;return (scatter_r*phase_r*beta_r+scatter_m*phase_m*beta_m)*sun_intensity;}const float A=0.15;const float B=0.50;const float C=0.10;const float D=0.20;const float E=0.02;const float F=0.30;vec3 uncharted2_tonemap(vec3 x) {return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;}void main() {vec3 ray_direction=v_position;ray_direction.y=pow(ray_direction.y,5.0);const float y_bias=0.015;ray_direction.y+=y_bias;vec3 color=atmosphere(normalize(ray_direction),u_sun_direction,u_sun_intensity);float white_scale=1.0748724675633854;color=uncharted2_tonemap((log2(2.0/pow(u_luminance,4.0)))*color)*white_scale;gl_FragColor=vec4(color,1.0);}\",\"attribute highp vec3 a_pos_3f;uniform mat3 u_matrix_3f;varying highp vec3 v_position;float map(float value,float start,float end,float new_start,float new_end) {return ((value-start)*(new_end-new_start))/(end-start)+new_start;}void main() {vec4 pos=vec4(u_matrix_3f*a_pos_3f,1.0);v_position=pos.xyz;v_position.y*=-1.0;v_position.y=map(v_position.y,-1.0,1.0,0.0,1.0);gl_Position=vec4(a_pos_3f.xy,0.0,1.0);}\"),globeRaster:di(\"uniform sampler2D u_image0;varying vec2 v_pos0;\\n#ifndef FOG\\nuniform highp vec3 u_frustum_tl;uniform highp vec3 u_frustum_tr;uniform highp vec3 u_frustum_br;uniform highp vec3 u_frustum_bl;uniform highp vec3 u_globe_pos;uniform highp float u_globe_radius;uniform vec2 u_viewport;\\n#endif\\nvoid main() {vec4 color;\\n#ifdef CUSTOM_ANTIALIASING\\nvec2 uv=gl_FragCoord.xy/u_viewport;highp vec3 ray_dir=mix(\\nmix(u_frustum_tl,u_frustum_tr,uv.x),mix(u_frustum_bl,u_frustum_br,uv.x),1.0-uv.y);vec3 dir=normalize(ray_dir);vec3 closest_point=dot(u_globe_pos,dir)*dir;float norm_dist_from_center=1.0-length(closest_point-u_globe_pos)/u_globe_radius;const float antialias_pixel=2.0;float antialias_factor=antialias_pixel*fwidth(norm_dist_from_center);float antialias=smoothstep(0.0,antialias_factor,norm_dist_from_center);vec4 raster=texture2D(u_image0,v_pos0);color=vec4(raster.rgb*antialias,raster.a*antialias);\\n#else\\ncolor=texture2D(u_image0,v_pos0);\\n#endif\\n#ifdef FOG\\ncolor=fog_dither(fog_apply_premultiplied(color,v_fog_pos));\\n#endif\\ngl_FragColor=color;\\n#ifdef TERRAIN_WIREFRAME\\ngl_FragColor=vec4(1.0,0.0,0.0,0.8);\\n#endif\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_proj_matrix;uniform mat4 u_normalize_matrix;uniform mat4 u_globe_matrix;uniform mat4 u_merc_matrix;uniform float u_zoom_transition;uniform vec2 u_merc_center;uniform mat3 u_grid_matrix;uniform float u_skirt_height;\\n#ifdef GLOBE_POLES\\nattribute vec3 a_globe_pos;attribute vec2 a_uv;\\n#else\\nattribute vec2 a_pos;\\n#endif\\nvarying vec2 v_pos0;const float wireframeOffset=1e3;float mercatorXfromLng(float lng) {return (180.0+lng)/360.0;}float mercatorYfromLat(float lat) {return (180.0-(RAD_TO_DEG*log(tan(QUARTER_PI+lat/2.0*DEG_TO_RAD))))/360.0;}vec3 latLngToECEF(vec2 latLng) {latLng=DEG_TO_RAD*latLng;float cosLat=cos(latLng[0]);float sinLat=sin(latLng[0]);float cosLng=cos(latLng[1]);float sinLng=sin(latLng[1]);float sx=cosLat*sinLng*GLOBE_RADIUS;float sy=-sinLat*GLOBE_RADIUS;float sz=cosLat*cosLng*GLOBE_RADIUS;return vec3(sx,sy,sz);}void main() {\\n#ifdef GLOBE_POLES\\nvec3 globe_pos=a_globe_pos;vec2 uv=a_uv;\\n#else\\nfloat tiles=u_grid_matrix[0][2];float idx=u_grid_matrix[1][2];float idy=u_grid_matrix[2][2];vec3 decomposed_pos_and_skirt=decomposeToPosAndSkirt(a_pos);vec3 latLng=u_grid_matrix*vec3(decomposed_pos_and_skirt.xy,1.0);float mercatorY=mercatorYfromLat(latLng[0]);float uvY=mercatorY*tiles-idy;float mercatorX=mercatorXfromLng(latLng[1]);float uvX=mercatorX*tiles-idx;vec3 globe_pos=latLngToECEF(latLng.xy);vec2 merc_pos=vec2(mercatorX,mercatorY);vec2 uv=vec2(uvX,uvY);\\n#endif\\nv_pos0=uv;vec2 tile_pos=uv*EXTENT;vec3 globe_derived_up_vector=normalize(globe_pos)*u_tile_up_scale;\\n#ifdef GLOBE_POLES\\nvec3 up_vector=globe_derived_up_vector;\\n#else\\nvec3 up_vector=elevationVector(tile_pos);\\n#endif\\nfloat height=elevation(tile_pos);\\n#ifdef TERRAIN_WIREFRAME\\nheight+=wireframeOffset;\\n#endif\\nglobe_pos+=up_vector*height;\\n#ifndef GLOBE_POLES\\nglobe_pos-=globe_derived_up_vector*u_skirt_height*decomposed_pos_and_skirt.z;\\n#endif\\n#ifdef GLOBE_POLES\\nvec4 interpolated_pos=u_globe_matrix*vec4(globe_pos,1.0);\\n#else\\nvec4 globe_world_pos=u_globe_matrix*vec4(globe_pos,1.0);vec4 merc_world_pos=vec4(0.0);if (u_zoom_transition > 0.0) {merc_world_pos=vec4(merc_pos,height-u_skirt_height*decomposed_pos_and_skirt.z,1.0);merc_world_pos.xy-=u_merc_center;merc_world_pos.x=wrap(merc_world_pos.x,-0.5,0.5);merc_world_pos=u_merc_matrix*merc_world_pos;}vec4 interpolated_pos=vec4(mix(globe_world_pos.xyz,merc_world_pos.xyz,u_zoom_transition),1.0);\\n#endif\\ngl_Position=u_proj_matrix*interpolated_pos;\\n#ifdef FOG\\nv_fog_pos=fog_position((u_normalize_matrix*vec4(globe_pos,1.0)).xyz);\\n#endif\\n}\"),globeAtmosphere:di(\"uniform float u_transition;uniform highp float u_fadeout_range;uniform highp float u_temporal_offset;uniform vec3 u_start_color;uniform vec4 u_color;uniform vec4 u_space_color;uniform vec4 u_high_color;uniform float u_star_intensity;uniform float u_star_size;uniform float u_star_density;uniform float u_horizon_angle;uniform mat4 u_rotation_matrix;varying highp vec3 v_ray_dir;varying highp vec3 v_horizon_dir;highp float random(highp vec3 p) {p=fract(p*vec3(23.2342,97.1231,91.2342));p+=dot(p.zxy,p.yxz+123.1234);return fract(p.x*p.y);}float stars(vec3 p,float scale,vec2 offset) {vec2 uv_scale=(u_viewport/u_star_size)*scale;vec3 position=vec3(p.xy*uv_scale+offset*u_viewport,p.z);vec3 q=fract(position)-0.5;vec3 id=floor(position);float random_visibility=step(random(id),u_star_density);float circle=smoothstep(0.5+u_star_intensity,0.5,length(q));return circle*random_visibility;}void main() {highp vec3 dir=normalize(v_ray_dir);float globe_pos_dot_dir;\\n#ifdef PROJECTION_GLOBE_VIEW\\nglobe_pos_dot_dir=dot(u_globe_pos,dir);highp vec3 closest_point_forward=abs(globe_pos_dot_dir)*dir;float norm_dist_from_center=length(closest_point_forward-u_globe_pos)/u_globe_radius;if (norm_dist_from_center < 0.98) {discard;return;}\\n#endif\\nhighp vec3 horizon_dir=normalize(v_horizon_dir);float horizon_angle_mercator=dir.y < horizon_dir.y ?\\n0.0 : max(acos(dot(dir,horizon_dir)),0.0);float horizon_angle;\\n#ifdef PROJECTION_GLOBE_VIEW\\nhighp vec3 closest_point=globe_pos_dot_dir*dir;float closest_point_to_center=length(closest_point-u_globe_pos);float theta=asin(clamp(closest_point_to_center/length(u_globe_pos),-1.0,1.0));horizon_angle=globe_pos_dot_dir < 0.0 ?\\nPI-theta-u_horizon_angle : theta-u_horizon_angle;float angle_t=pow(u_transition,10.0);horizon_angle=mix(horizon_angle,horizon_angle_mercator,angle_t);\\n#else\\nhorizon_angle=horizon_angle_mercator;\\n#endif\\nhorizon_angle/=PI;float t=exp(-horizon_angle/u_fadeout_range);float alpha_0=u_color.a;float alpha_1=u_high_color.a;float alpha_2=u_space_color.a;vec3 color_stop_0=u_color.rgb;vec3 color_stop_1=u_high_color.rgb;vec3 color_stop_2=u_space_color.rgb;vec3 c0=mix(color_stop_2,color_stop_1,alpha_1);vec3 c1=mix(c0,color_stop_0,alpha_0);vec3 c2=mix(c0,c1,t);vec3 c =mix(color_stop_2,c2,t);float a0=mix(alpha_2,1.0,alpha_1);float a1=mix(a0,1.0,alpha_0);float a2=mix(a0,a1,t);float a =mix(alpha_2,a2,t);vec2 uv=gl_FragCoord.xy/u_viewport-0.5;float aspect_ratio=u_viewport.x/u_viewport.y;vec4 uv_dir=vec4(normalize(vec3(uv.x*aspect_ratio,uv.y,1.0)),1.0);uv_dir=u_rotation_matrix*uv_dir;vec3 n=abs(uv_dir.xyz);vec2 uv_remap=(n.x > n.y && n.x > n.z) ? uv_dir.yz/uv_dir.x:\\n(n.y > n.x && n.y > n.z) ? uv_dir.zx/uv_dir.y:\\nuv_dir.xy/uv_dir.z;uv_remap.x/=aspect_ratio;vec3 D=vec3(uv_remap,1.0);highp float star_field=0.0;if (u_star_intensity > 0.0) {star_field+=stars(D,1.2,vec2(0.0,0.0));star_field+=stars(D,1.0,vec2(1.0,0.0));star_field+=stars(D,0.8,vec2(0.0,1.0));star_field+=stars(D,0.6,vec2(1.0,1.0));star_field*=(1.0-pow(t,0.25+(1.0-u_high_color.a)*0.75));c+=star_field*alpha_2;}c=dither(c,gl_FragCoord.xy+u_temporal_offset);gl_FragColor=vec4(c,a);}\",\"attribute vec3 a_pos;attribute vec2 a_uv;uniform vec3 u_frustum_tl;uniform vec3 u_frustum_tr;uniform vec3 u_frustum_br;uniform vec3 u_frustum_bl;uniform float u_horizon;varying highp vec3 v_ray_dir;varying highp vec3 v_horizon_dir;void main() {v_ray_dir=mix(\\nmix(u_frustum_tl,u_frustum_tr,a_uv.x),mix(u_frustum_bl,u_frustum_br,a_uv.x),a_uv.y);v_horizon_dir=mix(\\nmix(u_frustum_tl,u_frustum_bl,u_horizon),mix(u_frustum_tr,u_frustum_br,u_horizon),a_uv.x);gl_Position=vec4(a_pos,1.0);}\")};function _i(e,t){const i=e.replace(/\\s*\\/\\/[^\\n]*\\n/g,\"\\n\").split(\"\\n\");for(let e of i)if(e=e.trim(),\"#\"===e[0]&&e.includes(\"if\")&&!e.includes(\"endif\")){e=e.replace(\"#\",\"\").replace(/ifdef|ifndef|elif|if/g,\"\").replace(/!|defined|\\(|\\)|\\|\\||&&/g,\"\").replace(/\\s+/g,\" \").trim();const i=e.split(\" \");for(const e of i)t.includes(e)||t.push(e);}}function di(e,t){const i=/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g,o=t.match(/attribute (highp |mediump |lowp )?([\\w]+) ([\\w]+)/g),r={},n=[...ai];return _i(e,n),_i(t,n),{fragmentSource:e=e.replace(i,((e,t,i,o,n)=>(r[n]=!0,\"define\"===t?`\\n#ifndef HAS_UNIFORM_u_${n}\\nvarying ${i} ${o} ${n};\\n#else\\nuniform ${i} ${o} u_${n};\\n#endif\\n`:`\\n#ifdef HAS_UNIFORM_u_${n}\\n    ${i} ${o} ${n} = u_${n};\\n#endif\\n`))),vertexSource:t=t.replace(i,((e,t,i,o,n)=>{const s=\"float\"===o?\"vec2\":\"vec4\",a=n.match(/color/)?\"color\":s;return r[n]?\"define\"===t?`\\n#ifndef HAS_UNIFORM_u_${n}\\nuniform lowp float u_${n}_t;\\nattribute ${i} ${s} a_${n};\\nvarying ${i} ${o} ${n};\\n#else\\nuniform ${i} ${o} u_${n};\\n#endif\\n`:\"vec4\"===a?`\\n#ifndef HAS_UNIFORM_u_${n}\\n    ${n} = a_${n};\\n#else\\n    ${i} ${o} ${n} = u_${n};\\n#endif\\n`:`\\n#ifndef HAS_UNIFORM_u_${n}\\n    ${n} = unpack_mix_${a}(a_${n}, u_${n}_t);\\n#else\\n    ${i} ${o} ${n} = u_${n};\\n#endif\\n`:\"define\"===t?`\\n#ifndef HAS_UNIFORM_u_${n}\\nuniform lowp float u_${n}_t;\\nattribute ${i} ${s} a_${n};\\n#else\\nuniform ${i} ${o} u_${n};\\n#endif\\n`:\"vec4\"===a?`\\n#ifndef HAS_UNIFORM_u_${n}\\n    ${i} ${o} ${n} = a_${n};\\n#else\\n    ${i} ${o} ${n} = u_${n};\\n#endif\\n`:`\\n#ifndef HAS_UNIFORM_u_${n}\\n    ${i} ${o} ${n} = unpack_mix_${a}(a_${n}, u_${n}_t);\\n#else\\n    ${i} ${o} ${n} = u_${n};\\n#endif\\n`})),staticAttributes:o,usedDefines:n}}class pi{constructor(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffers=[],this.vao=null;}bind(e,t,i,o,r,n,s){this.context=e;let a=this.boundPaintVertexBuffers.length!==o.length;for(let e=0;!a&&e<o.length;e++)this.boundPaintVertexBuffers[e]!==o[e]&&(a=!0);let l=this.boundDynamicVertexBuffers.length!==s.length;for(let e=0;!l&&e<s.length;e++)this.boundDynamicVertexBuffers[e]!==s[e]&&(l=!0);if(!e.extVertexArrayObject||!this.vao||this.boundProgram!==t||this.boundLayoutVertexBuffer!==i||a||l||this.boundIndexBuffer!==r||this.boundVertexOffset!==n)this.freshBind(t,i,o,r,n,s);else {e.bindVertexArrayOES.set(this.vao);for(const e of s)e&&e.bind();r&&r.dynamicDraw&&r.bind();}}freshBind(e,t,i,o,r,n){let s;const a=e.numAttributes,l=this.context,c=l.gl;if(l.extVertexArrayObject)this.vao&&this.destroy(),this.vao=l.extVertexArrayObject.createVertexArrayOES(),l.bindVertexArrayOES.set(this.vao),s=0,this.boundProgram=e,this.boundLayoutVertexBuffer=t,this.boundPaintVertexBuffers=i,this.boundIndexBuffer=o,this.boundVertexOffset=r,this.boundDynamicVertexBuffers=n;else {s=l.currentNumAttributes||0;for(let e=a;e<s;e++)c.disableVertexAttribArray(e);}t.enableAttributes(c,e),t.bind(),t.setVertexAttribPointers(c,e,r);for(const t of i)t.enableAttributes(c,e),t.bind(),t.setVertexAttribPointers(c,e,r);for(const t of n)t&&(t.enableAttributes(c,e),t.bind(),t.setVertexAttribPointers(c,e,r));o&&o.bind(),l.currentNumAttributes=a;}destroy(){this.vao&&(this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao),this.vao=null);}}function mi(t,i){const o=Math.pow(2,i.canonical.z),r=i.canonical.y;return [new e.MercatorCoordinate(0,r/o).toLngLat().lat,new e.MercatorCoordinate(0,(r+1)/o).toLngLat().lat]}function fi(t,i,o,r,n,s,a){const l=t.context,c=l.gl,h=o.fbo;if(!h)return;t.prepareDrawTile();const u=t.useProgram(\"hillshade\");l.activeTexture.set(c.TEXTURE0),c.bindTexture(c.TEXTURE_2D,h.colorAttachment.get());const _=((e,t,i,o)=>{const r=i.paint.get(\"hillshade-shadow-color\"),n=i.paint.get(\"hillshade-highlight-color\"),s=i.paint.get(\"hillshade-accent-color\");let a=i.paint.get(\"hillshade-illumination-direction\")*(Math.PI/180);\"viewport\"===i.paint.get(\"hillshade-illumination-anchor\")&&(a-=e.transform.angle);const l=!e.options.moving;return {u_matrix:o||e.transform.calculateProjMatrix(t.tileID.toUnwrapped(),l),u_image:0,u_latrange:mi(0,t.tileID),u_light:[i.paint.get(\"hillshade-exaggeration\"),a],u_shadow:r,u_highlight:n,u_accent:s}})(t,o,r,t.terrain?i.projMatrix:null);t.prepareDrawProgram(l,u,i.toUnwrapped());const{tileBoundsBuffer:d,tileBoundsIndexBuffer:p,tileBoundsSegments:m}=t.getTileBoundsBuffers(o);u.draw(l,c.TRIANGLES,n,s,a,e.CullFaceMode.disabled,_,r.id,d,p,m);}function gi(t,i,o){if(!i.needsDEMTextureUpload)return;const r=t.context,n=r.gl;r.pixelStoreUnpackPremultiplyAlpha.set(!1),i.demTexture=i.demTexture||t.getTileTexture(o.stride);const s=o.getPixels();i.demTexture?i.demTexture.update(s,{premultiply:!1}):i.demTexture=new e.Texture(r,s,n.RGBA,{premultiply:!1}),i.needsDEMTextureUpload=!1;}function vi(t,i,o,r,n,s){const a=t.context,l=a.gl;if(!i.dem)return;const c=i.dem;if(a.activeTexture.set(l.TEXTURE1),gi(t,i,c),!i.demTexture)return;i.demTexture.bind(l.NEAREST,l.CLAMP_TO_EDGE);const h=c.dim;a.activeTexture.set(l.TEXTURE0);let u=i.fbo;if(!u){const t=new e.Texture(a,{width:h,height:h,data:null},l.RGBA);t.bind(l.LINEAR,l.CLAMP_TO_EDGE),u=i.fbo=a.createFramebuffer(h,h,!0),u.colorAttachment.set(t.texture);}a.bindFramebuffer.set(u.framebuffer),a.viewport.set([0,0,h,h]);const{tileBoundsBuffer:_,tileBoundsIndexBuffer:d,tileBoundsSegments:p}=t.getMercatorTileBoundsBuffers();t.useProgram(\"hillshadePrepare\").draw(a,l.TRIANGLES,r,n,s,e.CullFaceMode.disabled,((t,i)=>{const o=i.stride,r=e.create();return e.ortho(r,0,e.EXTENT,-e.EXTENT,0,0,1),e.translate(r,r,[0,-e.EXTENT,0]),{u_matrix:r,u_image:1,u_dimension:[o,o],u_zoom:t.overscaledZ,u_unpack:i.unpackVector}})(i.tileID,c),o.id,_,d,p),i.needsHillshadePrepare=!1;}const xi=t=>({u_matrix:new e.UniformMatrix4f(t),u_image0:new e.Uniform1i(t),u_skirt_height:new e.Uniform1f(t)}),yi=(e,t)=>({u_matrix:e,u_image0:0,u_skirt_height:t}),bi=(e,t,i,o,r,n,s,a,l,c,h,u,_,d,p)=>({u_proj_matrix:Float32Array.from(e),u_globe_matrix:t,u_normalize_matrix:Float32Array.from(o),u_merc_matrix:i,u_zoom_transition:r,u_merc_center:n,u_image0:0,u_frustum_tl:s,u_frustum_tr:a,u_frustum_br:l,u_frustum_bl:c,u_globe_pos:h,u_globe_radius:u,u_viewport:_,u_grid_matrix:p?Float32Array.from(p):new Float32Array(9),u_skirt_height:d});function wi(e,t){return null!=e&&null!=t&&!(!e.hasData()||!t.hasData())&&null!=e.demTexture&&null!=t.demTexture&&e.tileID.key!==t.tileID.key}const Ti=new class{constructor(){this.operations={};}newMorphing(e,t,i,o,r){if(e in this.operations){const t=this.operations[e];t.to.tileID.key!==i.tileID.key&&(t.queued=i);}else this.operations[e]={startTime:o,phase:0,duration:r,from:t,to:i,queued:null};}getMorphValuesForProxy(e){if(!(e in this.operations))return null;const t=this.operations[e];return {from:t.from,to:t.to,phase:t.phase}}update(e){for(const t in this.operations){const i=this.operations[t];for(i.phase=(e-i.startTime)/i.duration;i.phase>=1||!this._validOp(i);)if(!this._nextOp(i,e)){delete this.operations[t];break}}}_nextOp(e,t){return !!e.queued&&(e.from=e.to,e.to=e.queued,e.queued=null,e.phase=0,e.startTime=t,!0)}_validOp(e){return e.from.hasData()&&e.to.hasData()}},Ei={0:null,1:\"TERRAIN_VERTEX_MORPHING\",2:\"TERRAIN_WIREFRAME\"};function Ci(e){return 6*Math.pow(1.5,22-e)}function Mi(e,t){const i=1<<e.z;return !t&&(0===e.x||e.x===i-1)||0===e.y||e.y===i-1}const Ii=e=>({u_matrix:e});function Si(t,i,o,r,n){if(n>0){const s=e.exported.now(),a=(s-t.timeAdded)/n,l=i?(s-i.timeAdded)/n:-1,c=o.getSource(),h=r.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),u=!i||Math.abs(i.tileID.overscaledZ-h)>Math.abs(t.tileID.overscaledZ-h),_=u&&t.refreshedUponExpiration?1:e.clamp(u?a:1-l,0,1);return t.refreshedUponExpiration&&a>=1&&(t.refreshedUponExpiration=!1),i?{opacity:1,mix:1-_}:{opacity:_,mix:0}}return {opacity:1,mix:0}}class Di extends e.SourceCache{constructor(e){const t={type:\"raster-dem\",maxzoom:e.transform.maxZoom},i=new z(je(),null),o=Pe(\"mock-dem\",t,i,e.style);super(\"mock-dem\",o,!1),o.setEventedParent(this),this._sourceLoaded=!0;}_loadTile(e,t){e.state=\"loaded\",t(null);}}class Li extends e.SourceCache{constructor(e){const t=Pe(\"proxy\",{type:\"geojson\",maxzoom:e.transform.maxZoom},new z(je(),null),e.style);super(\"proxy\",t,!1),t.setEventedParent(this),this.map=this.getSource().map=e,this.used=this._sourceLoaded=!0,this.renderCache=[],this.renderCachePool=[],this.proxyCachedFBO={};}update(t,i,o){if(t.freezeTileCoverage)return;this.transform=t;const r=t.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}).reduce(((i,o)=>{if(i[o.key]=\"\",!this._tiles[o.key]){const i=new e.Tile(o,this._source.tileSize*o.overscaleFactor(),t.tileZoom);i.state=\"loaded\",this._tiles[o.key]=i;}return i}),{});for(const e in this._tiles)e in r||(this.freeFBO(e),this._tiles[e].unloadVectorData(),delete this._tiles[e]);}freeFBO(e){const t=this.proxyCachedFBO[e];if(void 0!==t){const i=Object.values(t);this.renderCachePool.push(...i),delete this.proxyCachedFBO[e];}}deallocRenderCache(){this.renderCache.forEach((e=>e.fb.destroy())),this.renderCache=[],this.renderCachePool=[],this.proxyCachedFBO={};}}class Ai extends e.OverscaledTileID{constructor(e,t,i){super(e.overscaledZ,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y),this.proxyTileKey=t,this.projMatrix=i;}}class zi extends e.Elevation{constructor(t,i){super(),this.painter=t,this.terrainTileForTile={},this.prevTerrainTileForTile={};const[o,r,n]=function(t){const i=new e.StructArrayLayout2i4,o=new e.StructArrayLayout3ui6,r=131;i.reserve(17161),o.reserve(33800);const n=e.EXTENT/128,s=e.EXTENT+n/2,a=s+n;for(let t=-n;t<a;t+=n)for(let o=-n;o<a;o+=n){const r=o<0||o>s||t<0||t>s?24575:0,n=e.clamp(Math.round(o),0,e.EXTENT),a=e.clamp(Math.round(t),0,e.EXTENT);i.emplaceBack(n+r,a);}const l=(e,t)=>{const i=t*r+e;o.emplaceBack(i+1,i,i+r),o.emplaceBack(i+r,i+r+1,i+1);};for(let e=1;e<129;e++)for(let t=1;t<129;t++)l(t,e);return [0,129].forEach((e=>{for(let t=0;t<130;t++)l(t,e),l(e,t);})),[i,o,32768]}(),s=t.context;this.gridBuffer=s.createVertexBuffer(o,e.posAttributes.members),this.gridIndexBuffer=s.createIndexBuffer(r),this.gridSegments=e.SegmentVector.simpleSegment(0,0,o.length,r.length),this.gridNoSkirtSegments=e.SegmentVector.simpleSegment(0,0,o.length,n),this.proxyCoords=[],this.proxiedCoords={},this._visibleDemTiles=[],this._drapedRenderBatches=[],this._sourceTilesOverlap={},this.proxySourceCache=new Li(i.map),this.orthoMatrix=e.create(),e.ortho(this.orthoMatrix,\"globe\"===this.painter.transform.projection.name?.015:0,e.EXTENT,0,e.EXTENT,0,1);const a=s.gl;this._overlapStencilMode=new e.StencilMode({func:a.GEQUAL,mask:255},0,255,a.KEEP,a.KEEP,a.REPLACE),this._previousZoom=t.transform.zoom,this.pool=[],this._findCoveringTileCache={},this._tilesDirty={},this.style=i,this._useVertexMorphing=!0,this._exaggeration=1,this._mockSourceCache=new Di(i.map);}set style(e){e.on(\"data\",this._onStyleDataEvent.bind(this)),e.on(\"neworder\",this._checkRenderCacheEfficiency.bind(this)),this._style=e,this._checkRenderCacheEfficiency(),this._style.map.on(\"moveend\",(()=>{this._clearLineLayersFromRenderCache();}));}update(t,i,o){if(t&&t.terrain){this._style!==t&&(this.style=t),this.enabled=!0;const r=t.terrain.properties;this.sourceCache=0===t.terrain.drapeRenderMode?this._mockSourceCache:t._getSourceCache(r.get(\"source\")),this._exaggeration=r.get(\"exaggeration\");const n=()=>{this.sourceCache.used&&e.warnOnce(`Raster DEM source '${this.sourceCache.id}' is used both for terrain and as layer source.\\nThis leads to lower resolution of hillshade. For full hillshade resolution but higher memory consumption, define another raster DEM source.`);const t=this.getScaledDemTileSize();this.sourceCache.update(i,t,!0),this.resetTileLookupCache(this.sourceCache.id);};this.sourceCache.usedForTerrain||(this.resetTileLookupCache(this.sourceCache.id),this.sourceCache.usedForTerrain=!0,n(),this._initializing=!0),n(),i.updateElevation(!0,o),this.resetTileLookupCache(this.proxySourceCache.id),this.proxySourceCache.update(i),this._emptyDEMTextureDirty=!0;}else this._disable();}resetTileLookupCache(e){this._findCoveringTileCache[e]={};}getScaledDemTileSize(){return this.sourceCache.getSource().tileSize/128*this.proxySourceCache.getSource().tileSize}_checkRenderCacheEfficiency(){const t=this.renderCacheEfficiency(this._style);this._style.map._optimizeForTerrain||100!==t.efficiency&&e.warnOnce(`Terrain render cache efficiency is not optimal (${t.efficiency}%) and performance\\n                may be affected negatively, consider placing all background, fill and line layers before layer\\n                with id '${t.firstUndrapedLayer}' or create a map using optimizeForTerrain: true option.`);}_onStyleDataEvent(e){e.coord&&\"source\"===e.dataType?this._clearRenderCacheForTile(e.sourceCacheId,e.coord):\"style\"===e.dataType&&(this._invalidateRenderCache=!0);}_disable(){if(this.enabled&&(this.enabled=!1,this._sharedDepthStencil=void 0,this.proxySourceCache.deallocRenderCache(),this._style))for(const e in this._style._sourceCaches)this._style._sourceCaches[e].usedForTerrain=!1;}destroy(){this._disable(),this._emptyDEMTexture&&this._emptyDEMTexture.destroy(),this._emptyDepthBufferTexture&&this._emptyDepthBufferTexture.destroy(),this.pool.forEach((e=>e.fb.destroy())),this.pool=[],this._depthFBO&&(this._depthFBO.destroy(),this._depthFBO=void 0,this._depthTexture=void 0);}_source(){return this.enabled?this.sourceCache:null}isUsingMockSource(){return this.sourceCache===this._mockSourceCache}exaggeration(){return this._exaggeration}get visibleDemTiles(){return this._visibleDemTiles}get drapeBufferSize(){const e=2*this.proxySourceCache.getSource().tileSize;return [e,e]}set useVertexMorphing(e){this._useVertexMorphing=e;}updateTileBinding(t){if(!this.enabled)return;this.prevTerrainTileForTile=this.terrainTileForTile;const i=this.proxySourceCache,o=this.painter.transform;this._initializing&&(this._initializing=0===o._centerAltitude&&-1===this.getAtPointOrZero(e.MercatorCoordinate.fromLngLat(o.center),-1),this._emptyDEMTextureDirty=!this._initializing);const r=this.proxyCoords=i.getIds().map((e=>{const t=i.getTileByID(e).tileID;return t.projMatrix=o.calculateProjMatrix(t.toUnwrapped()),t}));!function(t,i){const o=i.transform.pointCoordinate(i.transform.getCameraPoint()),r=new e.pointGeometry(o.x,o.y);t.sort(((t,i)=>{if(i.overscaledZ-t.overscaledZ)return i.overscaledZ-t.overscaledZ;const o=new e.pointGeometry(t.canonical.x+(1<<t.canonical.z)*t.wrap,t.canonical.y),n=new e.pointGeometry(i.canonical.x+(1<<i.canonical.z)*i.wrap,i.canonical.y),s=r.mult(1<<t.canonical.z);return s.x-=.5,s.y-=.5,s.distSqr(o)-s.distSqr(n)}));}(r,this.painter),this._previousZoom=o.zoom;const n=this.proxyToSource||{};this.proxyToSource={},r.forEach((e=>{this.proxyToSource[e.key]={};})),this.terrainTileForTile={};const s=this._style._sourceCaches;for(const e in s){const i=s[e];if(!i.used)continue;if(i!==this.sourceCache&&this.resetTileLookupCache(i.id),this._setupProxiedCoordsForOrtho(i,t[e],n),i.usedForTerrain)continue;const o=t[e];i.getSource().reparseOverscaled&&this._assignTerrainTiles(o);}this.proxiedCoords[i.id]=r.map((e=>new Ai(e,e.key,this.orthoMatrix))),this._assignTerrainTiles(r),this._prepareDEMTextures(),this._setupDrapedRenderBatches(),this._initFBOPool(),this._setupRenderCache(n),this.renderingToTexture=!1,this._updateTimestamp=e.exported.now();const a={};this._visibleDemTiles=[];for(const e of this.proxyCoords){const t=this.terrainTileForTile[e.key];if(!t)continue;const i=t.tileID.key;i in a||(this._visibleDemTiles.push(t),a[i]=i);}}_assignTerrainTiles(e){this._initializing||e.forEach((e=>{if(this.terrainTileForTile[e.key])return;const t=this._findTileCoveringTileID(e,this.sourceCache);t&&(this.terrainTileForTile[e.key]=t);}));}_prepareDEMTextures(){const e=this.painter.context,t=e.gl;for(const i in this.terrainTileForTile){const o=this.terrainTileForTile[i],r=o.dem;!r||o.demTexture&&!o.needsDEMTextureUpload||(e.activeTexture.set(t.TEXTURE1),gi(this.painter,o,r));}}_prepareDemTileUniforms(e,t,i,o){if(!t||null==t.demTexture)return !1;const r=e.tileID.canonical,n=Math.pow(2,t.tileID.canonical.z-r.z),s=o||\"\";return i[`u_dem_tl${s}`]=[r.x*n%1,r.y*n%1],i[`u_dem_scale${s}`]=n,!0}get emptyDEMTexture(){return !this._emptyDEMTextureDirty&&this._emptyDEMTexture?this._emptyDEMTexture:this._updateEmptyDEMTexture()}get emptyDepthBufferTexture(){const t=this.painter.context,i=t.gl;if(!this._emptyDepthBufferTexture){const o=new e.RGBAImage({width:1,height:1},Uint8Array.of(255,255,255,255));this._emptyDepthBufferTexture=new e.Texture(t,o,i.RGBA,{premultiply:!1});}return this._emptyDepthBufferTexture}_getLoadedAreaMinimum(){let e=0;const t=this._visibleDemTiles.reduce(((t,i)=>{if(!i.dem)return t;const o=i.dem.tree.minimums[0];return o>0&&e++,t+o}),0);return e?t/e:0}_updateEmptyDEMTexture(){const t=this.painter.context,i=t.gl;t.activeTexture.set(i.TEXTURE2);const o=this._getLoadedAreaMinimum(),r=new e.RGBAImage({width:1,height:1},new Uint8Array(e.DEMData.pack(o,this.sourceCache.getSource().encoding)));this._emptyDEMTextureDirty=!1;let n=this._emptyDEMTexture;return n?n.update(r,{premultiply:!1}):n=this._emptyDEMTexture=new e.Texture(t,r,i.RGBA,{premultiply:!1}),n}setupElevationDraw(t,i,o){const r=this.painter.context,n=r.gl,s=(a=this.sourceCache.getSource().encoding,{u_dem:2,u_dem_prev:4,u_dem_unpack:e.DEMData.getUnpackVector(a),u_dem_tl:[0,0],u_dem_tl_prev:[0,0],u_dem_scale:0,u_dem_scale_prev:0,u_dem_size:0,u_dem_lerp:1,u_depth:3,u_depth_size_inv:[0,0],u_exaggeration:0});var a;s.u_dem_size=this.sourceCache.getSource().tileSize,s.u_exaggeration=this.exaggeration();let l=null,c=null,h=1;if(o&&o.morphing&&this._useVertexMorphing){const e=o.morphing.srcDemTile,i=o.morphing.dstDemTile;h=o.morphing.phase,e&&i&&(this._prepareDemTileUniforms(t,e,s,\"_prev\")&&(c=e),this._prepareDemTileUniforms(t,i,s)&&(l=i));}if(c&&l?(r.activeTexture.set(n.TEXTURE2),l.demTexture.bind(n.NEAREST,n.CLAMP_TO_EDGE,n.NEAREST),r.activeTexture.set(n.TEXTURE4),c.demTexture.bind(n.NEAREST,n.CLAMP_TO_EDGE,n.NEAREST),s.u_dem_lerp=h):(l=this.terrainTileForTile[t.tileID.key],r.activeTexture.set(n.TEXTURE2),(this._prepareDemTileUniforms(t,l,s)?l.demTexture:this.emptyDEMTexture).bind(n.NEAREST,n.CLAMP_TO_EDGE)),r.activeTexture.set(n.TEXTURE3),o&&o.useDepthForOcclusion?(this._depthTexture&&this._depthTexture.bind(n.NEAREST,n.CLAMP_TO_EDGE),this._depthFBO&&(s.u_depth_size_inv=[1/this._depthFBO.width,1/this._depthFBO.height])):(this.emptyDepthBufferTexture.bind(n.NEAREST,n.CLAMP_TO_EDGE),s.u_depth_size_inv=[1,1]),o&&o.useMeterToDem&&l){const t=(1<<l.tileID.canonical.z)*e.mercatorZfromAltitude(1,this.painter.transform.center.lat)*this.sourceCache.getSource().tileSize;s.u_meter_to_dem=t;}if(o&&o.labelPlaneMatrixInv&&(s.u_label_plane_matrix_inv=o.labelPlaneMatrixInv),i.setTerrainUniformValues(r,s),\"globe\"===this.painter.transform.projection.name){const e=this.globeUniformValues(this.painter.transform,t.tileID.canonical,o&&o.useDenormalizedUpVectorScale);i.setGlobeUniformValues(r,e);}}globeUniformValues(t,i,o){const r=t.projection;return {u_tile_tl_up:r.upVector(i,0,0),u_tile_tr_up:r.upVector(i,e.EXTENT,0),u_tile_br_up:r.upVector(i,e.EXTENT,e.EXTENT),u_tile_bl_up:r.upVector(i,0,e.EXTENT),u_tile_up_scale:o?e.globeMetersToEcef(1):r.upVectorScale(i,t.center.lat,t.worldSize).metersToTile}}renderToBackBuffer(t){const i=this.painter,o=this.painter.context;0!==t.length&&(o.bindFramebuffer.set(null),o.viewport.set([0,0,i.width,i.height]),i.gpuTimingDeferredRenderStart(),this.renderingToTexture=!1,function(t,i,o,r,n){if(\"globe\"===t.transform.projection.name)!function(t,i,o,r,n){const s=t.context,a=s.gl;let l,c;const h=t.options.showTerrainWireframe?2:0,u=t.transform,_=e.globeUseCustomAntiAliasing(t,s,u),d=(e,i)=>{if(c===e)return;const o=[Ei[e],\"PROJECTION_GLOBE_VIEW\"];_&&o.push(\"CUSTOM_ANTIALIASING\"),i&&o.push(Ei[h]),l=t.useProgram(\"globeRaster\",null,o),c=e;},p=t.colorModeForRenderPass(),m=new e.DepthMode(a.LEQUAL,e.DepthMode.ReadWrite,t.depthRangeFor3D);Ti.update(n);const f=e.calculateGlobeMercatorMatrix(u),g=[e.mercatorXfromLng(u.center.lng),e.mercatorYfromLat(u.center.lat)],v=h?[!1,!0]:[!1],x=t.globeSharedBuffers,y=[u.width*e.exported.devicePixelRatio,u.height*e.exported.devicePixelRatio],b=Float32Array.from(u.globeMatrix),w={useDenormalizedUpVectorScale:!0};if(v.forEach((h=>{const u=t.transform,_=Ci(u.zoom)*i.exaggeration();c=-1;const v=h?a.LINES:a.TRIANGLES;for(const c of r){const r=o.getTile(c),T=e.StencilMode.disabled,E=i.prevTerrainTileForTile[c.key],C=i.terrainTileForTile[c.key];wi(E,C)&&Ti.newMorphing(c.key,E,C,n,250),s.activeTexture.set(a.TEXTURE0),r.texture.bind(a.LINEAR,a.CLAMP_TO_EDGE);const M=Ti.getMorphValuesForProxy(c.key),I=M?1:0;M&&e.extend$1(w,{morphing:{srcDemTile:M.from,dstDemTile:M.to,phase:e.easeCubicInOut(M.phase)}});const S=e.tileCornersToBounds(c.canonical),D=e.getLatitudinalLod(S.getCenter().lat),L=e.getGridMatrix(c.canonical,S,D,u.worldSize/u._pixelsPerMercatorPixel),A=e.globeNormalizeECEF(e.globeTileBounds(c.canonical)),z=bi(u.projMatrix,b,f,A,e.globeToMercatorTransition(u.zoom),g,u.frustumCorners.TL,u.frustumCorners.TR,u.frustumCorners.BR,u.frustumCorners.BL,u.globeCenterInViewSpace,u.globeRadius,y,_,L);if(d(I,h),i.setupElevationDraw(r,l,w),t.prepareDrawProgram(s,l,c.toUnwrapped()),x){const[i,o,r]=h?x.getWirefameBuffers(t.context,D):x.getGridBuffers(D,0!==_);l.draw(s,v,m,T,p,e.CullFaceMode.backCCW,z,\"globe_raster\",i,o,r);}}})),x){const n=[\"GLOBE_POLES\",\"PROJECTION_GLOBE_VIEW\"];_&&n.push(\"CUSTOM_ANTIALIASING\"),l=t.useProgram(\"globeRaster\",null,n);for(const n of r){const{x:r,y:c,z:h}=n.canonical,_=0===c,d=c===(1<<h)-1,[f,v,b,T]=x.getPoleBuffers(h);if(T&&(_||d)){const c=o.getTile(n);s.activeTexture.set(a.TEXTURE0),c.texture.bind(a.LINEAR,a.CLAMP_TO_EDGE);let x=e.globePoleMatrixForTile(h,r,u);const E=e.globeNormalizeECEF(e.globeTileBounds(n.canonical)),C=(t,i)=>t.draw(s,a.TRIANGLES,m,e.StencilMode.disabled,p,e.CullFaceMode.disabled,bi(u.projMatrix,x,x,E,0,g,u.frustumCorners.TL,u.frustumCorners.TR,u.frustumCorners.BR,u.frustumCorners.BL,u.globeCenterInViewSpace,u.globeRadius,y,0),\"globe_pole_raster\",i,b,T);i.setupElevationDraw(c,l,w),t.prepareDrawProgram(s,l,n.toUnwrapped()),_&&C(l,f),d&&(x=e.scale(e.create(),x,[1,-1,1]),C(l,v));}}}}(t,i,o,r,n);else {const s=t.context,a=s.gl;let l,c;const h=t.options.showTerrainWireframe?2:0,u=(e,i)=>{if(c===e)return;const o=[Ei[e]];i&&o.push(Ei[h]),l=t.useProgram(\"terrainRaster\",null,o),c=e;},_=t.colorModeForRenderPass(),d=new e.DepthMode(a.LEQUAL,e.DepthMode.ReadWrite,t.depthRangeFor3D);Ti.update(n);const p=t.transform,m=Ci(p.zoom)*i.exaggeration();(h?[!1,!0]:[!1]).forEach((h=>{c=-1;const f=h?a.LINES:a.TRIANGLES,[g,v]=h?i.getWirefameBuffer():[i.gridIndexBuffer,i.gridSegments];for(const c of r){const r=o.getTile(c),x=e.StencilMode.disabled,y=i.prevTerrainTileForTile[c.key],b=i.terrainTileForTile[c.key];wi(y,b)&&Ti.newMorphing(c.key,y,b,n,250),s.activeTexture.set(a.TEXTURE0),r.texture.bind(a.LINEAR,a.CLAMP_TO_EDGE,a.LINEAR_MIPMAP_NEAREST);const w=Ti.getMorphValuesForProxy(c.key),T=w?1:0;let E;w&&(E={morphing:{srcDemTile:w.from,dstDemTile:w.to,phase:e.easeCubicInOut(w.phase)}});const C=yi(c.projMatrix,Mi(c.canonical,p.renderWorldCopies)?m/10:m);u(T,h),i.setupElevationDraw(r,l,E),t.prepareDrawProgram(s,l,c.toUnwrapped()),l.draw(s,f,d,x,_,e.CullFaceMode.backCCW,C,\"terrain_raster\",i.gridBuffer,g,v);}}));}}(i,this,this.proxySourceCache,t,this._updateTimestamp),this.renderingToTexture=!0,i.gpuTimingDeferredRenderEnd(),t.splice(0,t.length));}renderBatch(t){if(0===this._drapedRenderBatches.length)return t+1;this.renderingToTexture=!0;const i=this.painter,o=this.painter.context,r=this.proxySourceCache,n=this.proxiedCoords[r.id],s=this._drapedRenderBatches.shift(),a=[],l=i.style.order;let c=0;for(const h of n){const n=r.getTileByID(h.proxyTileKey),u=r.proxyCachedFBO[h.key]?r.proxyCachedFBO[h.key][t]:void 0,_=void 0!==u?r.renderCache[u]:this.pool[c++],d=void 0!==u;if(n.texture=_.tex,d&&!_.dirty){a.push(n.tileID);continue}let p;o.bindFramebuffer.set(_.fb.framebuffer),this.renderedToTile=!1,_.dirty&&(o.clear({color:e.Color.transparent,stencil:0}),_.dirty=!1);for(let e=s.start;e<=s.end;++e){const t=i.style._layers[l[e]];if(t.isHidden(i.transform.zoom))continue;const r=i.style._getLayerSourceCache(t),n=r?this.proxyToSource[h.key][r.id]:[h];if(!n)continue;const s=n;o.viewport.set([0,0,_.fb.width,_.fb.height]),p!==(r?r.id:null)&&(this._setupStencil(_,n,t,r),p=r?r.id:null),i.renderLayer(i,r,t,s);}this.renderedToTile?(_.dirty=!0,a.push(n.tileID)):d||--c,5===c&&(c=0,this.renderToBackBuffer(a));}return this.renderToBackBuffer(a),this.renderingToTexture=!1,o.bindFramebuffer.set(null),o.viewport.set([0,0,i.width,i.height]),s.end+1}postRender(){}renderCacheEfficiency(e){const t=e.order.length;if(0===t)return {efficiency:100};let i,o=0,r=0,n=!1;for(let s=0;s<t;++s){const t=e._layers[e.order[s]];this._style.isLayerDraped(t)?(n&&++o,++r):n||(n=!0,i=t.id);}return 0===r?{efficiency:100}:{efficiency:100*(1-o/r),firstUndrapedLayer:i}}getMinElevationBelowMSL(){let e=0;return this._visibleDemTiles.filter((e=>e.dem)).forEach((t=>{e=Math.min(e,t.dem.tree.minimums[0]);})),0===e?e:(e-30)*this._exaggeration}raycast(e,t,i){if(!this._visibleDemTiles)return null;const o=this._visibleDemTiles.filter((e=>e.dem)).map((o=>{const r=o.tileID,n=1<<r.overscaledZ,{x:s,y:a}=r.canonical,l=s/n,c=(s+1)/n,h=a/n,u=(a+1)/n;return {minx:l,miny:h,maxx:c,maxy:u,t:o.dem.tree.raycastRoot(l,h,c,u,e,t,i),tile:o}}));o.sort(((e,t)=>(null!==e.t?e.t:Number.MAX_VALUE)-(null!==t.t?t.t:Number.MAX_VALUE)));for(const r of o){if(null==r.t)return null;const o=r.tile.dem.tree.raycast(r.minx,r.miny,r.maxx,r.maxy,e,t,i);if(null!=o)return o}return null}_createFBO(){const t=this.painter.context,i=t.gl,o=this.drapeBufferSize;t.activeTexture.set(i.TEXTURE0);const r=new e.Texture(t,{width:o[0],height:o[1],data:null},i.RGBA);r.bind(i.LINEAR,i.CLAMP_TO_EDGE);const n=t.createFramebuffer(o[0],o[1],!1);return n.colorAttachment.set(r.texture),n.depthAttachment=new Ee(t,n.framebuffer),void 0===this._sharedDepthStencil?(this._sharedDepthStencil=t.createRenderbuffer(t.gl.DEPTH_STENCIL,o[0],o[1]),this._stencilRef=0,n.depthAttachment.set(this._sharedDepthStencil),t.clear({stencil:0})):n.depthAttachment.set(this._sharedDepthStencil),t.extTextureFilterAnisotropic&&!t.extTextureFilterAnisotropicForceOff&&i.texParameterf(i.TEXTURE_2D,t.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,t.extTextureFilterAnisotropicMax),{fb:n,tex:r,dirty:!1}}_initFBOPool(){for(;this.pool.length<Math.min(5,this.proxyCoords.length);)this.pool.push(this._createFBO());}_shouldDisableRenderCache(){if(this._style.light&&this._style.light.hasTransition())return !0;for(const e in this._style._sourceCaches)if(this._style._sourceCaches[e].hasTransition())return !0;return this._style.order.some((e=>{const t=this._style._layers[e],i=t.isHidden(this.painter.transform.zoom);return \"custom\"===t.type?!i&&t.shouldRedrape():!i&&t.hasTransition()}))}_clearLineLayersFromRenderCache(){let t=!1;for(const e of this._style._getSources())if(e instanceof Ie){t=!0;break}if(!t)return;const i={};for(let t=0;t<this._style.order.length;++t){const o=this._style._layers[this._style.order[t]],r=this._style._getLayerSourceCache(o);if(r&&!i[r.id]&&!o.isHidden(this.painter.transform.zoom)&&\"line\"===o.type&&o.widthExpression()instanceof e.ZoomDependentExpression){i[r.id]=!0;for(const e of this.proxyCoords){const t=this.proxyToSource[e.key][r.id];if(t)for(const e of t)this._clearRenderCacheForTile(r.id,e);}}}}_clearRasterLayersFromRenderCache(){let e=!1;for(const t in this._style._sourceCaches)if(this._style._sourceCaches[t]._source instanceof Se){e=!0;break}if(!e)return;const t={};for(let e=0;e<this._style.order.length;++e){const i=this._style._layers[this._style.order[e]],o=this._style._getLayerSourceCache(i);if(!o||t[o.id])continue;if(i.isHidden(this.painter.transform.zoom)||\"raster\"!==i.type)continue;const r=i.paint.get(\"raster-fade-duration\");for(const e of this.proxyCoords){const t=this.proxyToSource[e.key][o.id];if(t)for(const e of t){const t=Si(o.getTile(e),o.findLoadedParent(e,0),o,this.painter.transform,r);(1!==t.opacity||0!==t.mix)&&this._clearRenderCacheForTile(o.id,e);}}}}_setupDrapedRenderBatches(){const e=this._style.order,t=e.length;if(0===t)return;const i=[];let o,r=0,n=this._style._layers[e[r]];for(;!this._style.isLayerDraped(n)&&n.isHidden(this.painter.transform.zoom)&&++r<t;)n=this._style._layers[e[r]];for(;r<t;++r){const t=this._style._layers[e[r]];t.isHidden(this.painter.transform.zoom)||(this._style.isLayerDraped(t)?void 0===o&&(o=r):void 0!==o&&(i.push({start:o,end:r-1}),o=void 0));}void 0!==o&&i.push({start:o,end:r-1}),this._drapedRenderBatches=i;}_setupRenderCache(e){const t=this.proxySourceCache;if(this._shouldDisableRenderCache()||this._invalidateRenderCache){if(this._invalidateRenderCache=!1,t.renderCache.length>t.renderCachePool.length){const e=Object.values(t.proxyCachedFBO);t.proxyCachedFBO={};for(let i=0;i<e.length;++i){const o=Object.values(e[i]);t.renderCachePool.push(...o);}}return}this._clearRasterLayersFromRenderCache();const i=this.proxyCoords,o=this._tilesDirty;for(let r=i.length-1;r>=0;r--){const n=i[r];if(t.getTileByID(n.key),void 0!==t.proxyCachedFBO[n.key]){const i=e[n.key],r=this.proxyToSource[n.key];let s=0;for(const e in r){const t=r[e],n=i[e];if(!n||n.length!==t.length||t.some(((t,i)=>t!==n[i]||o[e]&&o[e].hasOwnProperty(t.key)))){s=-1;break}++s;}for(const e in t.proxyCachedFBO[n.key])t.renderCache[t.proxyCachedFBO[n.key][e]].dirty=s<0||s!==Object.values(i).length;}}const r=[...this._drapedRenderBatches];r.sort(((e,t)=>t.end-t.start-(e.end-e.start)));for(const e of r)for(const o of i){if(t.proxyCachedFBO[o.key])continue;let i=t.renderCachePool.pop();void 0===i&&t.renderCache.length<50&&(i=t.renderCache.length,t.renderCache.push(this._createFBO())),void 0!==i&&(t.proxyCachedFBO[o.key]={},t.proxyCachedFBO[o.key][e.start]=i,t.renderCache[i].dirty=!0);}this._tilesDirty={};}_setupStencil(e,t,i,o){if(!o||!this._sourceTilesOverlap[o.id])return void(this._overlapStencilType&&(this._overlapStencilType=!1));const r=this.painter.context,n=r.gl;if(t.length<=1)return void(this._overlapStencilType=!1);let s;if(i.isTileClipped())s=t.length,this._overlapStencilMode.test={func:n.EQUAL,mask:255},this._overlapStencilType=\"Clip\";else {if(!(t[0].overscaledZ>t[t.length-1].overscaledZ))return void(this._overlapStencilType=!1);s=1,this._overlapStencilMode.test={func:n.GREATER,mask:255},this._overlapStencilType=\"Mask\";}this._stencilRef+s>255&&(r.clear({stencil:0}),this._stencilRef=0),this._stencilRef+=s,this._overlapStencilMode.ref=this._stencilRef,i.isTileClipped()&&this._renderTileClippingMasks(t,this._overlapStencilMode.ref);}clipOrMaskOverlapStencilType(){return \"Clip\"===this._overlapStencilType||\"Mask\"===this._overlapStencilType}stencilModeForRTTOverlap(t){return this.renderingToTexture&&this._overlapStencilType?(\"Clip\"===this._overlapStencilType&&(this._overlapStencilMode.ref=this.painter._tileClippingMaskIDs[t.key]),this._overlapStencilMode):e.StencilMode.disabled}_renderTileClippingMasks(t,i){const o=this.painter,r=this.painter.context,n=r.gl;o._tileClippingMaskIDs={},r.setColorMode(e.ColorMode.disabled),r.setDepthMode(e.DepthMode.disabled);const s=o.useProgram(\"clippingMask\");for(const a of t){const t=o._tileClippingMaskIDs[a.key]=--i;s.draw(r,n.TRIANGLES,e.DepthMode.disabled,new e.StencilMode({func:n.ALWAYS,mask:0},t,255,n.KEEP,n.KEEP,n.REPLACE),e.ColorMode.disabled,e.CullFaceMode.disabled,Ii(a.projMatrix),\"$clipping\",o.tileExtentBuffer,o.quadTriangleIndexBuffer,o.tileExtentSegments);}}pointCoordinate(t){const i=this.painter.transform;if(t.x<0||t.x>i.width||t.y<0||t.y>i.height)return null;const o=[t.x,t.y,1,1];e.transformMat4$1(o,o,i.pixelMatrixInverse),e.scale$1(o,o,1/o[3]),o[0]/=i.worldSize,o[1]/=i.worldSize;const r=i._camera.position,n=e.mercatorZfromAltitude(1,i.center.lat),s=[r[0],r[1],r[2]/n,0],a=e.subtract([],o.slice(0,3),s);e.normalize(a,a);const l=this.raycast(s,a,this._exaggeration);return null!==l&&l?(e.scaleAndAdd(s,s,a,l),s[3]=s[2],s[2]*=n,s):null}drawDepth(){const t=this.painter,i=t.context,o=this.proxySourceCache,r=Math.ceil(t.width),n=Math.ceil(t.height);if(!this._depthFBO||this._depthFBO.width===r&&this._depthFBO.height===n||(this._depthFBO.destroy(),this._depthFBO=void 0,this._depthTexture=void 0),!this._depthFBO){const t=i.gl,o=i.createFramebuffer(r,n,!0);i.activeTexture.set(t.TEXTURE0);const s=new e.Texture(i,{width:r,height:n,data:null},t.RGBA);s.bind(t.NEAREST,t.CLAMP_TO_EDGE),o.colorAttachment.set(s.texture);const a=i.createRenderbuffer(i.gl.DEPTH_COMPONENT16,r,n);o.depthAttachment.set(a),this._depthFBO=o,this._depthTexture=s;}i.bindFramebuffer.set(this._depthFBO.framebuffer),i.viewport.set([0,0,r,n]),function(t,i,o,r){if(\"globe\"===t.transform.projection.name)return;const n=t.context,s=n.gl;n.clear({depth:1});const a=t.useProgram(\"terrainDepth\"),l=new e.DepthMode(s.LESS,e.DepthMode.ReadWrite,t.depthRangeFor3D);for(const t of r){const r=o.getTile(t),c=yi(t.projMatrix,0);i.setupElevationDraw(r,a),a.draw(n,s.TRIANGLES,l,e.StencilMode.disabled,e.ColorMode.unblended,e.CullFaceMode.backCCW,c,\"terrain_depth\",i.gridBuffer,i.gridIndexBuffer,i.gridNoSkirtSegments);}}(t,this,o,this.proxyCoords);}_setupProxiedCoordsForOrtho(e,t,i){if(e.getSource()instanceof Ae)return this._setupProxiedCoordsForImageSource(e,t,i);this._findCoveringTileCache[e.id]=this._findCoveringTileCache[e.id]||{};const o=this.proxiedCoords[e.id]=[],r=this.proxyCoords;for(let t=0;t<r.length;t++){const n=r[t],s=this._findTileCoveringTileID(n,e);if(s){const t=this._createProxiedId(n,s,i[n.key]&&i[n.key][e.id]);o.push(t),this.proxyToSource[n.key][e.id]=[t];}}let n=!1;for(let r=0;r<t.length;r++){const s=e.getTile(t[r]);if(!s||!s.hasData())continue;const a=this._findTileCoveringTileID(s.tileID,this.proxySourceCache);if(a&&a.tileID.canonical.z!==s.tileID.canonical.z){const t=this.proxyToSource[a.tileID.key][e.id],r=this._createProxiedId(a.tileID,s,i[a.tileID.key]&&i[a.tileID.key][e.id]);t?t.splice(t.length-1,0,r):this.proxyToSource[a.tileID.key][e.id]=[r],o.push(r),n=!0;}}this._sourceTilesOverlap[e.id]=n;}_setupProxiedCoordsForImageSource(t,i,o){if(!t.getSource().loaded())return;const r=this.proxiedCoords[t.id]=[],n=this.proxyCoords,s=t.getSource(),a=new e.pointGeometry(s.tileID.x,s.tileID.y)._div(1<<s.tileID.z),l=s.coordinates.map(e.MercatorCoordinate.fromLngLat).reduce(((e,t)=>(e.min.x=Math.min(e.min.x,t.x-a.x),e.min.y=Math.min(e.min.y,t.y-a.y),e.max.x=Math.max(e.max.x,t.x-a.x),e.max.y=Math.max(e.max.y,t.y-a.y),e)),{min:new e.pointGeometry(Number.MAX_VALUE,Number.MAX_VALUE),max:new e.pointGeometry(-Number.MAX_VALUE,-Number.MAX_VALUE)}),c=(t,i)=>{const o=t.wrap+t.canonical.x/(1<<t.canonical.z),r=t.canonical.y/(1<<t.canonical.z),n=e.EXTENT/(1<<t.canonical.z),s=i.wrap+i.canonical.x/(1<<i.canonical.z),a=i.canonical.y/(1<<i.canonical.z);return o+n<s+l.min.x||o>s+l.max.x||r+n<a+l.min.y||r>a+l.max.y};for(let e=0;e<n.length;e++){const s=n[e];for(let e=0;e<i.length;e++){const n=t.getTile(i[e]);if(!n||!n.hasData())continue;if(c(s,n.tileID))continue;const a=this._createProxiedId(s,n,o[s.key]&&o[s.key][t.id]),l=this.proxyToSource[s.key][t.id];l?l.push(a):this.proxyToSource[s.key][t.id]=[a],r.push(a);}}}_createProxiedId(t,i,o){let r=this.orthoMatrix;if(o){const e=o.find((e=>e.key===i.tileID.key));if(e)return e}if(i.tileID.key!==t.key){const o=t.canonical.z-i.tileID.canonical.z;let n,s,a;r=e.create();const l=i.tileID.wrap-t.wrap<<t.overscaledZ;o>0?(n=e.EXTENT>>o,s=n*((i.tileID.canonical.x<<o)-t.canonical.x+l),a=n*((i.tileID.canonical.y<<o)-t.canonical.y)):(n=e.EXTENT<<-o,s=e.EXTENT*(i.tileID.canonical.x-(t.canonical.x+l<<-o)),a=e.EXTENT*(i.tileID.canonical.y-(t.canonical.y<<-o))),e.ortho(r,0,n,0,n,0,1),e.translate(r,r,[s,a,0]);}return new Ai(i.tileID,t.key,r)}_findTileCoveringTileID(t,i){let o=i.getTile(t);if(o&&o.hasData())return o;const r=this._findCoveringTileCache[i.id],n=r[t.key];if(o=n?i.getTileByID(n):null,o&&o.hasData()||null===n)return o;let s=o?o.tileID:t,a=s.overscaledZ;const l=i.getSource().minzoom,c=[];if(!n){const r=i.getSource().maxzoom;if(t.canonical.z>=r){const o=t.canonical.z-r;i.getSource().reparseOverscaled?(a=Math.max(t.canonical.z+2,i.transform.tileZoom),s=new e.OverscaledTileID(a,t.wrap,r,t.canonical.x>>o,t.canonical.y>>o)):0!==o&&(a=r,s=new e.OverscaledTileID(a,t.wrap,r,t.canonical.x>>o,t.canonical.y>>o));}s.key!==t.key&&(c.push(s.key),o=i.getTile(s));}const h=e=>{c.forEach((t=>{r[t]=e;})),c.length=0;};for(a-=1;a>=l&&(!o||!o.hasData());a--){o&&h(o.tileID.key);const e=s.calculateScaledKey(a);if(o=i.getTileByID(e),o&&o.hasData())break;const t=r[e];if(null===t)break;void 0===t?c.push(e):o=i.getTileByID(t);}return h(o?o.tileID.key:null),o&&o.hasData()?o:null}findDEMTileFor(e){return this.enabled?this._findTileCoveringTileID(e,this.sourceCache):null}prepareDrawTile(){this.renderedToTile=!0;}_clearRenderCacheForTile(e,t){let i=this._tilesDirty[e];i||(i=this._tilesDirty[e]={}),i[t.key]=!0;}getWirefameBuffer(){if(!this.wireframeSegments){const t=function(t){let i=0;const o=new e.StructArrayLayout2ui4,r=131;for(let e=1;e<129;e++){for(let t=1;t<129;t++)i=e*r+t,o.emplaceBack(i,i+1),o.emplaceBack(i,i+r),o.emplaceBack(i+1,i+r),128===e&&o.emplaceBack(i+r,i+r+1);o.emplaceBack(i+1,i+1+r);}return o}();this.wireframeIndexBuffer=this.painter.context.createIndexBuffer(t),this.wireframeSegments=e.SegmentVector.simpleSegment(0,0,this.gridBuffer.length,t.length);}return [this.wireframeIndexBuffer,this.wireframeSegments]}}class Pi{static cacheKey(e,t,i,o){let r=`${t}${o?o.cacheKey:\"\"}`;for(const t of i)e.usedDefines.includes(t)&&(r+=`/${t}`);return r}constructor(t,i,o,r,n,s){const a=t.gl;this.program=a.createProgram();const l=function(e){const t=[];for(let i=0;i<e.length;i++){if(null===e[i])continue;const o=e[i].split(\" \");t.push(o.pop());}return t}(o.staticAttributes),c=r?r.getBinderAttributes():[],h=l.concat(c);let u=r?r.defines():[];u=u.concat(s.map((e=>`#define ${e}`)));const _=t.isWebGL2?\"#version 300 es\\n\":\"\",d=_+u.concat(t.extStandardDerivatives&&0===_.length?\"#extension GL_OES_standard_derivatives : enable\\n\".concat(hi):hi,hi,ci,li.fragmentSource,si.fragmentSource,o.fragmentSource).join(\"\\n\"),p=_+u.concat(\"\\n#ifdef GL_ES\\nprecision highp float;\\n#else\\n\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n\\n#if !defined(highp)\\n#define highp\\n#endif\\n\\n#endif\",ci,li.vertexSource,si.vertexSource,ni.vertexSource,o.vertexSource).join(\"\\n\"),m=a.createShader(a.FRAGMENT_SHADER);if(a.isContextLost())return void(this.failedToCreate=!0);a.shaderSource(m,d),a.compileShader(m),a.attachShader(this.program,m);const f=a.createShader(a.VERTEX_SHADER);if(a.isContextLost())this.failedToCreate=!0;else {a.shaderSource(f,p),a.compileShader(f),a.attachShader(this.program,f),this.attributes={},this.numAttributes=h.length;for(let e=0;e<this.numAttributes;e++)h[e]&&(a.bindAttribLocation(this.program,e,h[e]),this.attributes[h[e]]=e);a.linkProgram(this.program),a.deleteShader(f),a.deleteShader(m),this.fixedUniforms=n(t),this.binderUniforms=r?r.getUniforms(t):[],s.includes(\"TERRAIN\")&&(this.terrainUniforms=(t=>({u_dem:new e.Uniform1i(t),u_dem_prev:new e.Uniform1i(t),u_dem_unpack:new e.Uniform4f(t),u_dem_tl:new e.Uniform2f(t),u_dem_scale:new e.Uniform1f(t),u_dem_tl_prev:new e.Uniform2f(t),u_dem_scale_prev:new e.Uniform1f(t),u_dem_size:new e.Uniform1f(t),u_dem_lerp:new e.Uniform1f(t),u_exaggeration:new e.Uniform1f(t),u_depth:new e.Uniform1i(t),u_depth_size_inv:new e.Uniform2f(t),u_meter_to_dem:new e.Uniform1f(t),u_label_plane_matrix_inv:new e.UniformMatrix4f(t)}))(t)),s.includes(\"GLOBE\")&&(this.globeUniforms=(t=>({u_tile_tl_up:new e.Uniform3f(t),u_tile_tr_up:new e.Uniform3f(t),u_tile_br_up:new e.Uniform3f(t),u_tile_bl_up:new e.Uniform3f(t),u_tile_up_scale:new e.Uniform1f(t)}))(t)),s.includes(\"FOG\")&&(this.fogUniforms=(t=>({u_fog_matrix:new e.UniformMatrix4f(t),u_fog_range:new e.Uniform2f(t),u_fog_color:new e.Uniform4f(t),u_fog_horizon_blend:new e.Uniform1f(t),u_fog_temporal_offset:new e.Uniform1f(t),u_frustum_tl:new e.Uniform3f(t),u_frustum_tr:new e.Uniform3f(t),u_frustum_br:new e.Uniform3f(t),u_frustum_bl:new e.Uniform3f(t),u_globe_pos:new e.Uniform3f(t),u_globe_radius:new e.Uniform1f(t),u_globe_transition:new e.Uniform1f(t),u_is_globe:new e.Uniform1i(t),u_viewport:new e.Uniform2f(t)}))(t));}}setTerrainUniformValues(e,t){if(!this.terrainUniforms)return;const i=this.terrainUniforms;if(!this.failedToCreate){e.program.set(this.program);for(const e in t)i[e]&&i[e].set(this.program,e,t[e]);}}setGlobeUniformValues(e,t){if(!this.globeUniforms)return;const i=this.globeUniforms;if(!this.failedToCreate){e.program.set(this.program);for(const e in t)i[e]&&i[e].set(this.program,e,t[e]);}}setFogUniformValues(e,t){if(!this.fogUniforms)return;const i=this.fogUniforms;if(!this.failedToCreate){e.program.set(this.program);for(const e in t)i[e].set(this.program,e,t[e]);}}draw(e,t,i,o,r,n,s,a,l,c,h,u,_,d,p){const m=e.gl;if(this.failedToCreate)return;e.program.set(this.program),e.setDepthMode(i),e.setStencilMode(o),e.setColorMode(r),e.setCullFace(n);for(const e of Object.keys(this.fixedUniforms))this.fixedUniforms[e].set(this.program,e,s[e]);d&&d.setUniforms(this.program,e,this.binderUniforms,u,{zoom:_});const f={[m.LINES]:2,[m.TRIANGLES]:3,[m.LINE_STRIP]:1}[t];for(const i of h.get()){const o=i.vaos||(i.vaos={});(o[a]||(o[a]=new pi)).bind(e,this,l,d?d.getPaintVertexBuffers():[],c,i.vertexOffset,p||[]),m.drawElements(t,i.primitiveLength*f,m.UNSIGNED_SHORT,i.primitiveOffset*f*2);}}}function Ri(e,t){const i=Math.pow(2,t.tileID.overscaledZ),o=t.tileSize*Math.pow(2,e.transform.tileZoom)/i,r=o*(t.tileID.canonical.x+t.tileID.wrap*i),n=o*t.tileID.canonical.y;return {u_image:0,u_texsize:t.imageAtlasTexture.size,u_tile_units_to_pixels:1/P(t,1,e.transform.tileZoom),u_pixel_coord_upper:[r>>16,n>>16],u_pixel_coord_lower:[65535&r,65535&n]}}const Oi=e.create(),Bi=(t,i,o,r,n,s,a,l,c,h,u)=>{const _=i.style.light,d=_.properties.get(\"position\"),p=[d.x,d.y,d.z],m=e.create$1();\"viewport\"===_.properties.get(\"anchor\")&&(e.fromRotation(m,-i.transform.angle),e.transformMat3(p,p,m));const f=_.properties.get(\"color\"),g=i.transform,v={u_matrix:t,u_lightpos:p,u_lightintensity:_.properties.get(\"intensity\"),u_lightcolor:[f.r,f.g,f.b],u_vertical_gradient:+o,u_opacity:r,u_tile_id:[0,0,0],u_zoom_transition:0,u_inv_rot_matrix:Oi,u_merc_center:[0,0],u_up_dir:[0,0,0],u_height_lift:0,u_ao:n,u_edge_radius:s};return \"globe\"===g.projection.name&&(v.u_tile_id=[a.canonical.x,a.canonical.y,1<<a.canonical.z],v.u_zoom_transition=c,v.u_inv_rot_matrix=u,v.u_merc_center=h,v.u_up_dir=g.projection.upVector(new e.CanonicalTileID(0,0,0),h[0]*e.EXTENT,h[1]*e.EXTENT),v.u_height_lift=l),v},ki=(t,i,o,r,n,s,a,l,c,h,u,_)=>{const d=Bi(t,i,o,r,n,s,a,c,h,u,_),p={u_height_factor:-Math.pow(2,a.overscaledZ)/l.tileSize/8};return e.extend(d,Ri(i,l),p)},Fi=e=>({u_matrix:e}),Ui=(t,i,o)=>e.extend(Fi(t),Ri(i,o)),Ni=(e,t)=>({u_matrix:e,u_world:t}),Gi=(t,i,o,r)=>e.extend(Ui(t,i,o),{u_world:r}),ji=e.create(),Zi=(t,i,o,r,n,s)=>{const a=t.transform,l=\"globe\"===a.projection.name;let c;if(\"map\"===s.paint.get(\"circle-pitch-alignment\"))if(l){const t=e.globePixelsToTileUnits(a.zoom,i.canonical)*a._pixelsPerMercatorPixel;c=Float32Array.from([t,0,0,t]);}else c=a.calculatePixelsToTileUnitsMatrix(o);else c=new Float32Array([a.pixelsToGLUnits[0],0,0,a.pixelsToGLUnits[1]]);const h={u_camera_to_center_distance:a.cameraToCenterDistance,u_matrix:t.translatePosMatrix(i.projMatrix,o,s.paint.get(\"circle-translate\"),s.paint.get(\"circle-translate-anchor\")),u_device_pixel_ratio:e.exported.devicePixelRatio,u_extrude_scale:c,u_inv_rot_matrix:ji,u_merc_center:[0,0],u_tile_id:[0,0,0],u_zoom_transition:0,u_up_dir:[0,0,0]};if(l){h.u_inv_rot_matrix=r,h.u_merc_center=n,h.u_tile_id=[i.canonical.x,i.canonical.y,1<<i.canonical.z],h.u_zoom_transition=e.globeToMercatorTransition(a.zoom);const t=n[0]*e.EXTENT,o=n[1]*e.EXTENT;h.u_up_dir=a.projection.upVector(new e.CanonicalTileID(0,0,0),t,o);}return h},Vi=e=>{const t=[];return \"map\"===e.paint.get(\"circle-pitch-alignment\")&&t.push(\"PITCH_WITH_MAP\"),\"map\"===e.paint.get(\"circle-pitch-scale\")&&t.push(\"SCALE_WITH_MAP\"),t},Wi=(t,i,o,r)=>{const n=e.EXTENT/o.tileSize;return {u_matrix:t,u_camera_to_center_distance:i.getCameraToCenterDistance(r),u_extrude_scale:[i.pixelsToGLUnits[0]/n,i.pixelsToGLUnits[1]/n]}},Xi=(e,t,i=1)=>({u_matrix:e,u_color:t,u_overlay:0,u_overlay_scale:i}),qi=e.create(),$i=(t,i,o,r,n,s,a)=>{const l=t.transform,c=\"globe\"===l.projection.name,h=c?e.globePixelsToTileUnits(l.zoom,i.canonical)*l._pixelsPerMercatorPixel:P(o,1,s),u={u_matrix:i.projMatrix,u_extrude_scale:h,u_intensity:a,u_inv_rot_matrix:qi,u_merc_center:[0,0],u_tile_id:[0,0,0],u_zoom_transition:0,u_up_dir:[0,0,0]};if(c){u.u_inv_rot_matrix=r,u.u_merc_center=n,u.u_tile_id=[i.canonical.x,i.canonical.y,1<<i.canonical.z],u.u_zoom_transition=e.globeToMercatorTransition(l.zoom);const t=n[0]*e.EXTENT,o=n[1]*e.EXTENT;u.u_up_dir=l.projection.upVector(new e.CanonicalTileID(0,0,0),t,o);}return u},Hi=(e,t,i,o,r,n,s)=>{const a=e.transform,l=a.calculatePixelsToTileUnitsMatrix(t);return {u_matrix:Ji(e,t,i,o),u_pixels_to_tile_units:l,u_device_pixel_ratio:n,u_units_to_pixels:[1/a.pixelsToGLUnits[0],1/a.pixelsToGLUnits[1]],u_dash_image:0,u_gradient_image:1,u_image_height:r,u_texsize:Qi(i)?t.lineAtlasTexture.size:[0,0],u_tile_units_to_pixels:Ki(t,e.transform),u_alpha_discard_threshold:0,u_trim_offset:s}},Yi=(e,t,i,o,r)=>{const n=e.transform;return {u_matrix:Ji(e,t,i,o),u_texsize:t.imageAtlasTexture.size,u_pixels_to_tile_units:n.calculatePixelsToTileUnitsMatrix(t),u_device_pixel_ratio:r,u_image:0,u_tile_units_to_pixels:Ki(t,n),u_units_to_pixels:[1/n.pixelsToGLUnits[0],1/n.pixelsToGLUnits[1]],u_alpha_discard_threshold:0}};function Ki(e,t){return 1/P(e,1,t.tileZoom)}function Ji(e,t,i,o){return e.translatePosMatrix(o||t.tileID.projMatrix,t,i.paint.get(\"line-translate\"),i.paint.get(\"line-translate-anchor\"))}function Qi(e){const t=e.paint.get(\"line-dasharray\").value;return t.value||\"constant\"!==t.kind}const eo=(e,t,i,o,r,n)=>{return {u_matrix:e,u_tl_parent:t,u_scale_parent:i,u_fade_t:o.mix,u_opacity:o.opacity*r.paint.get(\"raster-opacity\"),u_image0:0,u_image1:1,u_brightness_low:r.paint.get(\"raster-brightness-min\"),u_brightness_high:r.paint.get(\"raster-brightness-max\"),u_saturation_factor:(a=r.paint.get(\"raster-saturation\"),a>0?1-1/(1.001-a):-a),u_contrast_factor:(s=r.paint.get(\"raster-contrast\"),s>0?1/(1-s):1+s),u_spin_weights:to(r.paint.get(\"raster-hue-rotate\")),u_perspective_transform:n};var s,a;};function to(e){e*=Math.PI/180;const t=Math.sin(e),i=Math.cos(e);return [(2*i+1)/3,(-Math.sqrt(3)*t-i+1)/3,(Math.sqrt(3)*t-i+1)/3]}const io=e.create(),oo=(t,i,o,r,n,s,a,l,c,h,u,_,d,p,m,f)=>{const g=n.transform,v={u_is_size_zoom_constant:+(\"constant\"===t||\"source\"===t),u_is_size_feature_constant:+(\"constant\"===t||\"camera\"===t),u_size_t:i?i.uSizeT:0,u_size:i?i.uSize:0,u_camera_to_center_distance:g.cameraToCenterDistance,u_rotate_symbol:+o,u_aspect_ratio:g.width/g.height,u_fade_change:n.options.fadeDuration?n.symbolFadeChange:1,u_matrix:s,u_label_plane_matrix:a,u_coord_matrix:l,u_is_text:+c,u_pitch_with_map:+r,u_texsize:h,u_texture:0,u_tile_id:[0,0,0],u_zoom_transition:0,u_inv_rot_matrix:io,u_merc_center:[0,0],u_camera_forward:[0,0,0],u_ecef_origin:[0,0,0],u_tile_matrix:io,u_up_vector:[0,-1,0]};return \"globe\"===f.name&&(v.u_tile_id=[u.canonical.x,u.canonical.y,1<<u.canonical.z],v.u_zoom_transition=_,v.u_inv_rot_matrix=p,v.u_merc_center=d,v.u_camera_forward=g._camera.forward(),v.u_ecef_origin=e.globeECEFOrigin(g.globeMatrix,u.toUnwrapped()),v.u_tile_matrix=Float32Array.from(g.globeMatrix),v.u_up_vector=m),v},ro=(t,i,o,r,n,s,a,l,c,h,u,_,d,p,m,f,g)=>e.extend(oo(t,i,o,r,n,s,a,l,c,h,_,d,p,m,f,g),{u_gamma_scale:r?n.transform.cameraToCenterDistance*Math.cos(n.terrain?0:n.transform._pitch):1,u_device_pixel_ratio:e.exported.devicePixelRatio,u_is_halo:+u}),no=(t,i,o,r,n,s,a,l,c,h,u,_,d,p,m,f)=>e.extend(ro(t,i,o,r,n,s,a,l,!0,c,!0,u,_,d,p,m,f),{u_texsize_icon:h,u_texture_icon:1}),so=(e,t,i)=>({u_matrix:e,u_opacity:t,u_color:i}),ao=(t,i,o,r,n)=>e.extend(function(e,t,i){const o=t.imageManager.getPattern(e.toString()),{width:r,height:n}=t.imageManager.getPixelSize(),s=Math.pow(2,i.tileID.overscaledZ),a=i.tileSize*Math.pow(2,t.transform.tileZoom)/s,l=a*(i.tileID.canonical.x+i.tileID.wrap*s),c=a*i.tileID.canonical.y;return {u_image:0,u_pattern_tl:o.tl,u_pattern_br:o.br,u_texsize:[r,n],u_pattern_size:o.displaySize,u_tile_units_to_pixels:1/P(i,1,t.transform.tileZoom),u_pixel_coord_upper:[l>>16,c>>16],u_pixel_coord_lower:[65535&l,65535&c]}}(r,o,n),{u_matrix:t,u_opacity:i}),lo={fillExtrusion:t=>({u_matrix:new e.UniformMatrix4f(t),u_lightpos:new e.Uniform3f(t),u_lightintensity:new e.Uniform1f(t),u_lightcolor:new e.Uniform3f(t),u_vertical_gradient:new e.Uniform1f(t),u_opacity:new e.Uniform1f(t),u_edge_radius:new e.Uniform1f(t),u_ao:new e.Uniform2f(t),u_tile_id:new e.Uniform3f(t),u_zoom_transition:new e.Uniform1f(t),u_inv_rot_matrix:new e.UniformMatrix4f(t),u_merc_center:new e.Uniform2f(t),u_up_dir:new e.Uniform3f(t),u_height_lift:new e.Uniform1f(t)}),fillExtrusionPattern:t=>({u_matrix:new e.UniformMatrix4f(t),u_lightpos:new e.Uniform3f(t),u_lightintensity:new e.Uniform1f(t),u_lightcolor:new e.Uniform3f(t),u_vertical_gradient:new e.Uniform1f(t),u_height_factor:new e.Uniform1f(t),u_edge_radius:new e.Uniform1f(t),u_ao:new e.Uniform2f(t),u_tile_id:new e.Uniform3f(t),u_zoom_transition:new e.Uniform1f(t),u_inv_rot_matrix:new e.UniformMatrix4f(t),u_merc_center:new e.Uniform2f(t),u_up_dir:new e.Uniform3f(t),u_height_lift:new e.Uniform1f(t),u_image:new e.Uniform1i(t),u_texsize:new e.Uniform2f(t),u_pixel_coord_upper:new e.Uniform2f(t),u_pixel_coord_lower:new e.Uniform2f(t),u_tile_units_to_pixels:new e.Uniform1f(t),u_opacity:new e.Uniform1f(t)}),fill:t=>({u_matrix:new e.UniformMatrix4f(t)}),fillPattern:t=>({u_matrix:new e.UniformMatrix4f(t),u_image:new e.Uniform1i(t),u_texsize:new e.Uniform2f(t),u_pixel_coord_upper:new e.Uniform2f(t),u_pixel_coord_lower:new e.Uniform2f(t),u_tile_units_to_pixels:new e.Uniform1f(t)}),fillOutline:t=>({u_matrix:new e.UniformMatrix4f(t),u_world:new e.Uniform2f(t)}),fillOutlinePattern:t=>({u_matrix:new e.UniformMatrix4f(t),u_world:new e.Uniform2f(t),u_image:new e.Uniform1i(t),u_texsize:new e.Uniform2f(t),u_pixel_coord_upper:new e.Uniform2f(t),u_pixel_coord_lower:new e.Uniform2f(t),u_tile_units_to_pixels:new e.Uniform1f(t)}),circle:t=>({u_camera_to_center_distance:new e.Uniform1f(t),u_extrude_scale:new e.UniformMatrix2f(t),u_device_pixel_ratio:new e.Uniform1f(t),u_matrix:new e.UniformMatrix4f(t),u_inv_rot_matrix:new e.UniformMatrix4f(t),u_merc_center:new e.Uniform2f(t),u_tile_id:new e.Uniform3f(t),u_zoom_transition:new e.Uniform1f(t),u_up_dir:new e.Uniform3f(t)}),collisionBox:t=>({u_matrix:new e.UniformMatrix4f(t),u_camera_to_center_distance:new e.Uniform1f(t),u_extrude_scale:new e.Uniform2f(t)}),collisionCircle:t=>({u_matrix:new e.UniformMatrix4f(t),u_inv_matrix:new e.UniformMatrix4f(t),u_camera_to_center_distance:new e.Uniform1f(t),u_viewport_size:new e.Uniform2f(t)}),debug:t=>({u_color:new e.UniformColor(t),u_matrix:new e.UniformMatrix4f(t),u_overlay:new e.Uniform1i(t),u_overlay_scale:new e.Uniform1f(t)}),clippingMask:t=>({u_matrix:new e.UniformMatrix4f(t)}),heatmap:t=>({u_extrude_scale:new e.Uniform1f(t),u_intensity:new e.Uniform1f(t),u_matrix:new e.UniformMatrix4f(t),u_inv_rot_matrix:new e.UniformMatrix4f(t),u_merc_center:new e.Uniform2f(t),u_tile_id:new e.Uniform3f(t),u_zoom_transition:new e.Uniform1f(t),u_up_dir:new e.Uniform3f(t)}),heatmapTexture:t=>({u_image:new e.Uniform1i(t),u_color_ramp:new e.Uniform1i(t),u_opacity:new e.Uniform1f(t)}),hillshade:t=>({u_matrix:new e.UniformMatrix4f(t),u_image:new e.Uniform1i(t),u_latrange:new e.Uniform2f(t),u_light:new e.Uniform2f(t),u_shadow:new e.UniformColor(t),u_highlight:new e.UniformColor(t),u_accent:new e.UniformColor(t)}),hillshadePrepare:t=>({u_matrix:new e.UniformMatrix4f(t),u_image:new e.Uniform1i(t),u_dimension:new e.Uniform2f(t),u_zoom:new e.Uniform1f(t),u_unpack:new e.Uniform4f(t)}),line:t=>({u_matrix:new e.UniformMatrix4f(t),u_pixels_to_tile_units:new e.UniformMatrix2f(t),u_device_pixel_ratio:new e.Uniform1f(t),u_units_to_pixels:new e.Uniform2f(t),u_dash_image:new e.Uniform1i(t),u_gradient_image:new e.Uniform1i(t),u_image_height:new e.Uniform1f(t),u_texsize:new e.Uniform2f(t),u_tile_units_to_pixels:new e.Uniform1f(t),u_alpha_discard_threshold:new e.Uniform1f(t),u_trim_offset:new e.Uniform2f(t)}),linePattern:t=>({u_matrix:new e.UniformMatrix4f(t),u_texsize:new e.Uniform2f(t),u_pixels_to_tile_units:new e.UniformMatrix2f(t),u_device_pixel_ratio:new e.Uniform1f(t),u_image:new e.Uniform1i(t),u_units_to_pixels:new e.Uniform2f(t),u_tile_units_to_pixels:new e.Uniform1f(t),u_alpha_discard_threshold:new e.Uniform1f(t)}),raster:t=>({u_matrix:new e.UniformMatrix4f(t),u_tl_parent:new e.Uniform2f(t),u_scale_parent:new e.Uniform1f(t),u_fade_t:new e.Uniform1f(t),u_opacity:new e.Uniform1f(t),u_image0:new e.Uniform1i(t),u_image1:new e.Uniform1i(t),u_brightness_low:new e.Uniform1f(t),u_brightness_high:new e.Uniform1f(t),u_saturation_factor:new e.Uniform1f(t),u_contrast_factor:new e.Uniform1f(t),u_spin_weights:new e.Uniform3f(t),u_perspective_transform:new e.Uniform2f(t)}),symbolIcon:t=>({u_is_size_zoom_constant:new e.Uniform1i(t),u_is_size_feature_constant:new e.Uniform1i(t),u_size_t:new e.Uniform1f(t),u_size:new e.Uniform1f(t),u_camera_to_center_distance:new e.Uniform1f(t),u_rotate_symbol:new e.Uniform1i(t),u_aspect_ratio:new e.Uniform1f(t),u_fade_change:new e.Uniform1f(t),u_matrix:new e.UniformMatrix4f(t),u_label_plane_matrix:new e.UniformMatrix4f(t),u_coord_matrix:new e.UniformMatrix4f(t),u_is_text:new e.Uniform1i(t),u_pitch_with_map:new e.Uniform1i(t),u_texsize:new e.Uniform2f(t),u_tile_id:new e.Uniform3f(t),u_zoom_transition:new e.Uniform1f(t),u_inv_rot_matrix:new e.UniformMatrix4f(t),u_merc_center:new e.Uniform2f(t),u_camera_forward:new e.Uniform3f(t),u_tile_matrix:new e.UniformMatrix4f(t),u_up_vector:new e.Uniform3f(t),u_ecef_origin:new e.Uniform3f(t),u_texture:new e.Uniform1i(t)}),symbolSDF:t=>({u_is_size_zoom_constant:new e.Uniform1i(t),u_is_size_feature_constant:new e.Uniform1i(t),u_size_t:new e.Uniform1f(t),u_size:new e.Uniform1f(t),u_camera_to_center_distance:new e.Uniform1f(t),u_rotate_symbol:new e.Uniform1i(t),u_aspect_ratio:new e.Uniform1f(t),u_fade_change:new e.Uniform1f(t),u_matrix:new e.UniformMatrix4f(t),u_label_plane_matrix:new e.UniformMatrix4f(t),u_coord_matrix:new e.UniformMatrix4f(t),u_is_text:new e.Uniform1i(t),u_pitch_with_map:new e.Uniform1i(t),u_texsize:new e.Uniform2f(t),u_texture:new e.Uniform1i(t),u_gamma_scale:new e.Uniform1f(t),u_device_pixel_ratio:new e.Uniform1f(t),u_tile_id:new e.Uniform3f(t),u_zoom_transition:new e.Uniform1f(t),u_inv_rot_matrix:new e.UniformMatrix4f(t),u_merc_center:new e.Uniform2f(t),u_camera_forward:new e.Uniform3f(t),u_tile_matrix:new e.UniformMatrix4f(t),u_up_vector:new e.Uniform3f(t),u_ecef_origin:new e.Uniform3f(t),u_is_halo:new e.Uniform1i(t)}),symbolTextAndIcon:t=>({u_is_size_zoom_constant:new e.Uniform1i(t),u_is_size_feature_constant:new e.Uniform1i(t),u_size_t:new e.Uniform1f(t),u_size:new e.Uniform1f(t),u_camera_to_center_distance:new e.Uniform1f(t),u_rotate_symbol:new e.Uniform1i(t),u_aspect_ratio:new e.Uniform1f(t),u_fade_change:new e.Uniform1f(t),u_matrix:new e.UniformMatrix4f(t),u_label_plane_matrix:new e.UniformMatrix4f(t),u_coord_matrix:new e.UniformMatrix4f(t),u_is_text:new e.Uniform1i(t),u_pitch_with_map:new e.Uniform1i(t),u_texsize:new e.Uniform2f(t),u_texsize_icon:new e.Uniform2f(t),u_texture:new e.Uniform1i(t),u_texture_icon:new e.Uniform1i(t),u_gamma_scale:new e.Uniform1f(t),u_device_pixel_ratio:new e.Uniform1f(t),u_is_halo:new e.Uniform1i(t)}),background:t=>({u_matrix:new e.UniformMatrix4f(t),u_opacity:new e.Uniform1f(t),u_color:new e.UniformColor(t)}),backgroundPattern:t=>({u_matrix:new e.UniformMatrix4f(t),u_opacity:new e.Uniform1f(t),u_image:new e.Uniform1i(t),u_pattern_tl:new e.Uniform2f(t),u_pattern_br:new e.Uniform2f(t),u_texsize:new e.Uniform2f(t),u_pattern_size:new e.Uniform2f(t),u_pixel_coord_upper:new e.Uniform2f(t),u_pixel_coord_lower:new e.Uniform2f(t),u_tile_units_to_pixels:new e.Uniform1f(t)}),terrainRaster:xi,terrainDepth:xi,skybox:t=>({u_matrix:new e.UniformMatrix4f(t),u_sun_direction:new e.Uniform3f(t),u_cubemap:new e.Uniform1i(t),u_opacity:new e.Uniform1f(t),u_temporal_offset:new e.Uniform1f(t)}),skyboxGradient:t=>({u_matrix:new e.UniformMatrix4f(t),u_color_ramp:new e.Uniform1i(t),u_center_direction:new e.Uniform3f(t),u_radius:new e.Uniform1f(t),u_opacity:new e.Uniform1f(t),u_temporal_offset:new e.Uniform1f(t)}),skyboxCapture:t=>({u_matrix_3f:new e.UniformMatrix3f(t),u_sun_direction:new e.Uniform3f(t),u_sun_intensity:new e.Uniform1f(t),u_color_tint_r:new e.Uniform4f(t),u_color_tint_m:new e.Uniform4f(t),u_luminance:new e.Uniform1f(t)}),globeRaster:t=>({u_proj_matrix:new e.UniformMatrix4f(t),u_globe_matrix:new e.UniformMatrix4f(t),u_normalize_matrix:new e.UniformMatrix4f(t),u_merc_matrix:new e.UniformMatrix4f(t),u_zoom_transition:new e.Uniform1f(t),u_merc_center:new e.Uniform2f(t),u_image0:new e.Uniform1i(t),u_grid_matrix:new e.UniformMatrix3f(t),u_skirt_height:new e.Uniform1f(t),u_frustum_tl:new e.Uniform3f(t),u_frustum_tr:new e.Uniform3f(t),u_frustum_br:new e.Uniform3f(t),u_frustum_bl:new e.Uniform3f(t),u_globe_pos:new e.Uniform3f(t),u_globe_radius:new e.Uniform1f(t),u_viewport:new e.Uniform2f(t)}),globeAtmosphere:t=>({u_frustum_tl:new e.Uniform3f(t),u_frustum_tr:new e.Uniform3f(t),u_frustum_br:new e.Uniform3f(t),u_frustum_bl:new e.Uniform3f(t),u_horizon:new e.Uniform1f(t),u_transition:new e.Uniform1f(t),u_fadeout_range:new e.Uniform1f(t),u_color:new e.Uniform4f(t),u_high_color:new e.Uniform4f(t),u_space_color:new e.Uniform4f(t),u_star_intensity:new e.Uniform1f(t),u_star_density:new e.Uniform1f(t),u_star_size:new e.Uniform1f(t),u_temporal_offset:new e.Uniform1f(t),u_horizon_angle:new e.Uniform1f(t),u_rotation_matrix:new e.UniformMatrix4f(t)})};let co;function ho(t,i,o,r,n,s,a){const l=t.context,c=l.gl,h=t.transform,u=t.useProgram(\"collisionBox\"),_=[];let d=0,p=0;for(let m=0;m<r.length;m++){const f=r[m],g=i.getTile(f),v=g.getBucket(o);if(!v)continue;const x=yt(f,v,h);let y=x;0===n[0]&&0===n[1]||(y=t.translatePosMatrix(x,g,n,s));const b=a?v.textCollisionBox:v.iconCollisionBox,w=v.collisionCircleArray;if(w.length>0){const t=e.create(),i=y;e.mul(t,v.placementInvProjMatrix,h.glCoordMatrix),e.mul(t,t,v.placementViewportMatrix),_.push({circleArray:w,circleOffset:p,transform:i,invTransform:t,projection:v.getProjection()}),d+=w.length/4,p=d;}b&&(t.terrain&&t.terrain.setupElevationDraw(g,u),u.draw(l,c.LINES,e.DepthMode.disabled,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.disabled,Wi(y,h,g,v.getProjection()),o.id,b.layoutVertexBuffer,b.indexBuffer,b.segments,null,h.zoom,null,[b.collisionVertexBuffer,b.collisionVertexBufferExt]));}if(!a||!_.length)return;const m=t.useProgram(\"collisionCircle\"),f=new e.StructArrayLayout2f1f2i16;f.resize(4*d),f._trim();let g=0;for(const e of _)for(let t=0;t<e.circleArray.length/4;t++){const i=4*t,o=e.circleArray[i+0],r=e.circleArray[i+1],n=e.circleArray[i+2],s=e.circleArray[i+3];f.emplace(g++,o,r,n,s,0),f.emplace(g++,o,r,n,s,1),f.emplace(g++,o,r,n,s,2),f.emplace(g++,o,r,n,s,3);}(!co||co.length<2*d)&&(co=function(t){const i=2*t,o=new e.StructArrayLayout3ui6;o.resize(i),o._trim();for(let e=0;e<i;e++){const t=6*e;o.uint16[t+0]=4*e+0,o.uint16[t+1]=4*e+1,o.uint16[t+2]=4*e+2,o.uint16[t+3]=4*e+2,o.uint16[t+4]=4*e+3,o.uint16[t+5]=4*e+0;}return o}(d));const v=l.createIndexBuffer(co,!0),x=l.createVertexBuffer(f,e.collisionCircleLayout.members,!0);for(const i of _){const r={u_matrix:i.transform,u_inv_matrix:i.invTransform,u_camera_to_center_distance:(y=h).getCameraToCenterDistance(i.projection),u_viewport_size:[y.width,y.height]};m.draw(l,c.TRIANGLES,e.DepthMode.disabled,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.disabled,r,o.id,x,v,e.SegmentVector.simpleSegment(0,2*i.circleOffset,i.circleArray.length,i.circleArray.length/2),null,h.zoom);}var y;x.destroy(),v.destroy();}const uo=e.create();function _o({width:t,height:i,anchor:o,textOffset:r,textScale:n},s){const{horizontalAlign:a,verticalAlign:l}=e.getAnchorAlignment(o),c=-(a-.5)*t,h=-(l-.5)*i,u=e.evaluateVariableOffset(o,r);return new e.pointGeometry((c/n+u[0])*s,(h/n+u[1])*s)}function po(t,i,o,r,n,s,a,l,c,h,u){const _=t.text.placedSymbolArray,d=t.text.dynamicLayoutVertexArray,p=t.icon.dynamicLayoutVertexArray,m={},f=t.getProjection(),g=bt(l,f,s),v=s.elevation,x=f.upVectorScale(l.canonical,s.center.lat,s.worldSize).metersToTile;d.clear();for(let p=0;p<_.length;p++){const y=_.get(p),{tileAnchorX:b,tileAnchorY:w,numGlyphs:T}=y,E=t.allowVerticalPlacement&&!y.placedOrientation,C=y.hidden||!y.crossTileID||E?null:r[y.crossTileID];if(C){let r=0,_=0,p=0;if(v){const e=v?v.getAtTileOffset(l,b,w):0,[t,i,o]=f.upVector(l.canonical,b,w);r=e*t*x,_=e*i*x,p=e*o*x;}let[E,M,I,S]=nt(y.projectedAnchorX+r,y.projectedAnchorY+_,y.projectedAnchorZ+p,o?g:a);const D=st(s.getCameraToCenterDistance(f),S);let L=n.evaluateSizeForFeature(t.textSizeData,h,y)*D/e.ONE_EM;o&&(L*=t.tilePixelRatio/c);const A=_o(C,L);o?(({x:E,y:M,z:I}=f.projectTilePoint(b+A.x,w+A.y,l.canonical)),[E,M,I]=nt(E+r,M+_,I+p,a)):(i&&A._rotate(-s.angle),E+=A.x,M+=A.y,I=0);const z=t.allowVerticalPlacement&&y.placedOrientation===e.WritingMode.vertical?Math.PI/2:0;for(let t=0;t<T;t++)e.addDynamicAttributes(d,E,M,I,z);u&&y.associatedIconIndex>=0&&(m[y.associatedIconIndex]={x:E,y:M,z:I,angle:z});}else mt(T,d);}if(u){p.clear();const i=t.icon.placedSymbolArray;for(let t=0;t<i.length;t++){const o=i.get(t),{numGlyphs:r}=o,n=m[t];if(o.hidden||!n)mt(r,p);else {const{x:t,y:i,z:o,angle:s}=n;for(let n=0;n<r;n++)e.addDynamicAttributes(p,t,i,o,s);}}t.icon.dynamicLayoutVertexBuffer.updateData(p);}t.text.dynamicLayoutVertexBuffer.updateData(d);}function mo(e,t,i){return i.iconsInText&&t?\"symbolTextAndIcon\":e?\"symbolSDF\":\"symbolIcon\"}function fo(t,i,o,r,n,s,a,l,c,h,u,_){const d=t.context,p=d.gl,m=t.transform,f=\"map\"===l,g=\"map\"===c,v=f&&\"point\"!==o.layout.get(\"symbol-placement\"),x=f&&!g&&!v,y=void 0!==o.layout.get(\"symbol-sort-key\").constantOr(1);let b=!1;const w=t.depthModeForSublayer(0,e.DepthMode.ReadOnly),T=[e.mercatorXfromLng(m.center.lng),e.mercatorYfromLat(m.center.lat)],E=o.layout.get(\"text-variable-anchor\"),C=\"globe\"===m.projection.name,M=[],I=[0,-1,0];let S=I;!C&&!m.mercatorFromTransition||f||(S=function(t){const i=t._camera.getWorldToCamera(t.worldSize,1),o=e.multiply([],i,t.globeMatrix);e.invert(o,o);const r=[0,0,0],n=[0,1,0,0];return e.transformMat4$1(n,n,o),r[0]=n[0],r[1]=n[1],r[2]=n[2],e.normalize(r,r),r}(m));for(const l of r){const r=i.getTile(l),c=r.getBucket(o);if(!c)continue;if(\"mercator\"===c.projection.name&&C)continue;const u=n?c.text:c.icon;if(!u||c.fullyClipped||!u.segments.get().length)continue;const _=u.programConfigurations.get(o.id),d=n||c.sdfIcons,w=n?c.textSizeData:c.iconSizeData,D=g||0!==m.pitch,L=e.evaluateSizeForZoom(w,m.zoom);let A,z,P,R,O=[0,0],B=null;if(n){if(z=r.glyphAtlasTexture,P=p.LINEAR,A=r.glyphAtlasTexture.size,c.iconsInText){O=r.imageAtlasTexture.size,B=r.imageAtlasTexture;const e=\"composite\"===w.kind||\"camera\"===w.kind;R=D||t.options.rotating||t.options.zooming||e?p.LINEAR:p.NEAREST;}}else {const e=1!==o.layout.get(\"icon-size\").constantOr(0)||c.iconsNeedLinear;z=r.imageAtlasTexture,P=d||t.options.rotating||t.options.zooming||e||D?p.LINEAR:p.NEAREST,A=r.imageAtlasTexture.size;}const k=\"globe\"===c.projection.name,F=k?S:I,U=k?e.globeToMercatorTransition(m.zoom):0,N=bt(l,c.getProjection(),m),G=m.calculatePixelsToTileUnitsMatrix(r),j=it(N,r.tileID.canonical,g,f,m,c.getProjection(),G),Z=t.terrain&&g&&v?e.invert(e.create(),j):uo,V=rt(N,r.tileID.canonical,g,f,m,c.getProjection(),G),W=E&&c.hasTextData(),X=\"none\"!==o.layout.get(\"icon-text-fit\")&&W&&c.hasIconData();if(v){const e=m.elevation,i=e?e.getAtTileOffsetFunc(l,m.center.lat,m.worldSize,c.getProjection()):null,o=ot(N,r.tileID.canonical,g,f,m,c.getProjection(),G);lt(c,N,t,n,o,V,g,h,i,l);}const q=v||n&&E||X,$=t.translatePosMatrix(N,r,s,a),H=q?uo:j,Y=t.translatePosMatrix(V,r,s,a,!0),K=c.getProjection().createInversionMatrix(m,l.canonical),J=[];t.terrainRenderModeElevated()&&g&&J.push(\"PITCH_WITH_MAP_TERRAIN\"),k&&J.push(\"PROJECTION_GLOBE_VIEW\"),q&&J.push(\"PROJECTED_POS_ON_VIEWPORT\");const Q=d&&0!==o.paint.get(n?\"text-halo-width\":\"icon-halo-width\").constantOr(1);let ee;ee=d?c.iconsInText?no(w.kind,L,x,g,t,$,H,Y,A,O,l,U,T,K,F,c.getProjection()):ro(w.kind,L,x,g,t,$,H,Y,n,A,!0,l,U,T,K,F,c.getProjection()):oo(w.kind,L,x,g,t,$,H,Y,n,A,l,U,T,K,F,c.getProjection());const te={program:t.useProgram(mo(d,n,c),_,J),buffers:u,uniformValues:ee,atlasTexture:z,atlasTextureIcon:B,atlasInterpolation:P,atlasInterpolationIcon:R,isSDF:d,hasHalo:Q,tile:r,labelPlaneMatrixInv:Z};if(y&&c.canOverlap){b=!0;const t=u.segments.get();for(const i of t)M.push({segments:new e.SegmentVector([i]),sortKey:i.sortKey,state:te});}else M.push({segments:u.segments,sortKey:0,state:te});}b&&M.sort(((e,t)=>e.sortKey-t.sortKey));for(const e of M){const i=e.state;if(t.terrain&&t.terrain.setupElevationDraw(i.tile,i.program,{useDepthForOcclusion:!C,labelPlaneMatrixInv:i.labelPlaneMatrixInv}),d.activeTexture.set(p.TEXTURE0),i.atlasTexture.bind(i.atlasInterpolation,p.CLAMP_TO_EDGE),i.atlasTextureIcon&&(d.activeTexture.set(p.TEXTURE1),i.atlasTextureIcon&&i.atlasTextureIcon.bind(i.atlasInterpolationIcon,p.CLAMP_TO_EDGE)),i.isSDF){const r=i.uniformValues;i.hasHalo&&(r.u_is_halo=1,go(i.buffers,e.segments,o,t,i.program,w,u,_,r)),r.u_is_halo=0;}go(i.buffers,e.segments,o,t,i.program,w,u,_,i.uniformValues);}}function go(t,i,o,r,n,s,a,l,c){const h=r.context,u=[t.dynamicLayoutVertexBuffer,t.opacityVertexBuffer,t.globeExtVertexBuffer];n.draw(h,h.gl.TRIANGLES,s,a,l,e.CullFaceMode.disabled,c,o.id,t.layoutVertexBuffer,t.indexBuffer,i,o.paint,r.transform.zoom,t.programConfigurations.get(o.id),u);}function vo(t,i,o,r,n,s,a){const l=t.context.gl,c=o.paint.get(\"fill-pattern\"),h=c&&c.constantOr(1);let u,_,d,p,m;a?(_=h&&!o.getPaintProperty(\"fill-outline-color\")?\"fillOutlinePattern\":\"fillOutline\",u=l.LINES):(_=h?\"fillPattern\":\"fill\",u=l.TRIANGLES);for(const f of r){const r=i.getTile(f);if(h&&!r.patternsLoaded())continue;const g=r.getBucket(o);if(!g)continue;t.prepareDrawTile();const v=g.programConfigurations.get(o.id),x=t.useProgram(_,v);h&&(t.context.activeTexture.set(l.TEXTURE0),r.imageAtlasTexture.bind(l.LINEAR,l.CLAMP_TO_EDGE),v.updatePaintBuffers());const y=c.constantOr(null);if(y&&r.imageAtlas){const e=r.imageAtlas.patternPositions[y.toString()];e&&v.setConstantPatternPositions(e);}const b=t.translatePosMatrix(f.projMatrix,r,o.paint.get(\"fill-translate\"),o.paint.get(\"fill-translate-anchor\"));if(a){p=g.indexBuffer2,m=g.segments2;const e=t.terrain&&t.terrain.renderingToTexture?t.terrain.drapeBufferSize:[l.drawingBufferWidth,l.drawingBufferHeight];d=\"fillOutlinePattern\"===_&&h?Gi(b,t,r,e):Ni(b,e);}else p=g.indexBuffer,m=g.segments,d=h?Ui(b,t,r):Fi(b);t.prepareDrawProgram(t.context,x,f.toUnwrapped()),x.draw(t.context,u,n,t.stencilModeForClipping(f),s,e.CullFaceMode.disabled,d,o.id,g.layoutVertexBuffer,p,m,o.paint,t.transform.zoom,v);}}function xo(t,i,o,r,n,s,a){const l=t.context,c=l.gl,h=t.transform,u=o.paint.get(\"fill-extrusion-pattern\"),_=u.constantOr(1),d=o.paint.get(\"fill-extrusion-opacity\"),p=[o.paint.get(\"fill-extrusion-ambient-occlusion-intensity\"),o.paint.get(\"fill-extrusion-ambient-occlusion-radius\")],m=o.layout.get(\"fill-extrusion-edge-radius\"),f=\"globe\"===h.projection.name?e.fillExtrusionHeightLift():0,g=\"globe\"===h.projection.name,v=g?e.globeToMercatorTransition(h.zoom):0,x=[e.mercatorXfromLng(h.center.lng),e.mercatorYfromLat(h.center.lat)],y=[];g&&y.push(\"PROJECTION_GLOBE_VIEW\"),p[0]>0&&y.push(\"FAUX_AO\");for(const b of r){const r=i.getTile(b),w=r.getBucket(o);if(!w||w.projection.name!==h.projection.name)continue;const T=w.programConfigurations.get(o.id),E=t.useProgram(_?\"fillExtrusionPattern\":\"fillExtrusion\",T,y);if(t.terrain){const e=t.terrain;if(t.style.terrainSetForDrapingOnly())e.setupElevationDraw(r,E,{useMeterToDem:!0});else {if(!w.enableTerrain)continue;if(e.setupElevationDraw(r,E,{useMeterToDem:!0}),yo(l,i,b,w,o,e),!w.centroidVertexBuffer){const e=E.attributes.a_centroid_pos;void 0!==e&&c.vertexAttrib2f(e,0,0);}}}_&&(t.context.activeTexture.set(c.TEXTURE0),r.imageAtlasTexture.bind(c.LINEAR,c.CLAMP_TO_EDGE),T.updatePaintBuffers());const C=u.constantOr(null);if(C&&r.imageAtlas){const e=r.imageAtlas.patternPositions[C.toString()];e&&T.setConstantPatternPositions(e);}const M=t.translatePosMatrix(b.projMatrix,r,o.paint.get(\"fill-extrusion-translate\"),o.paint.get(\"fill-extrusion-translate-anchor\")),I=h.projection.createInversionMatrix(h,b.canonical),S=o.paint.get(\"fill-extrusion-vertical-gradient\"),D=_?ki(M,t,S,d,p,m,b,r,f,v,x,I):Bi(M,t,S,d,p,m,b,f,v,x,I);t.prepareDrawProgram(l,E,b.toUnwrapped());const L=[];t.terrain&&L.push(w.centroidVertexBuffer),g&&L.push(w.layoutVertexExtBuffer),E.draw(l,l.gl.TRIANGLES,n,s,a,e.CullFaceMode.backCCW,D,o.id,w.layoutVertexBuffer,w.indexBuffer,w.segments,o.paint,t.transform.zoom,T,L);}}function yo(t,i,o,r,n,s){const a=[t=>{let i=t.canonical.x-1,o=t.wrap;return i<0&&(i=(1<<t.canonical.z)-1,o--),new e.OverscaledTileID(t.overscaledZ,o,t.canonical.z,i,t.canonical.y)},t=>{let i=t.canonical.x+1,o=t.wrap;return i===1<<t.canonical.z&&(i=0,o++),new e.OverscaledTileID(t.overscaledZ,o,t.canonical.z,i,t.canonical.y)},t=>new e.OverscaledTileID(t.overscaledZ,t.wrap,t.canonical.z,t.canonical.x,(0===t.canonical.y?1<<t.canonical.z:t.canonical.y)-1),t=>new e.OverscaledTileID(t.overscaledZ,t.wrap,t.canonical.z,t.canonical.x,t.canonical.y===(1<<t.canonical.z)-1?0:t.canonical.y+1)],l=e=>{const t=i.getSource().minzoom,o=e=>{const t=i.getTileByID(e);if(t&&t.hasData())return t.getBucket(n)},r=[0,-1,1];for(const i of r){if(e.overscaledZ+i<t)continue;const r=o(e.calculateScaledKey(e.overscaledZ+i));if(r)return r}},c=[0,0,0],h=(t,i)=>(c[0]=Math.min(t.min.y,i.min.y),c[1]=Math.max(t.max.y,i.max.y),c[2]=e.EXTENT-i.min.x>t.max.x?i.min.x-e.EXTENT:t.max.x,c),u=(t,i)=>(c[0]=Math.min(t.min.x,i.min.x),c[1]=Math.max(t.max.x,i.max.x),c[2]=e.EXTENT-i.min.y>t.max.y?i.min.y-e.EXTENT:t.max.y,c),_=[(e,t)=>h(e,t),(e,t)=>h(t,e),(e,t)=>u(e,t),(e,t)=>u(t,e)],d=new e.pointGeometry(0,0);let p,m,f;const g=(t,i,r,n,a)=>{const l=[[n?r:t,n?t:r,0],[n?r:i,n?i:r,0]],c=a<0?e.EXTENT+a:a,h=[n?c:(t+i)/2,n?(t+i)/2:c,0];return 0===r&&a<0||0!==r&&a>0?s.getForTilePoints(f,[h],!0,m):l.push(h),s.getForTilePoints(o,l,!0,p),Math.max(l[0][2],l[1][2],h[2])/s.exaggeration()};for(let t=0;t<4;t++){const i=(t<2?1:5)-t,n=r.borders[t];if(0===n.length)continue;const c=f=a[t](o),h=l(c);if(!(h&&h instanceof e.FillExtrusionBucket&&h.enableTerrain))continue;if(r.borderDoneWithNeighborZ[t]===h.canonical.z&&h.borderDoneWithNeighborZ[i]===r.canonical.z)continue;if(m=s.findDEMTileFor(c),!m||!m.dem)continue;if(!p){const e=s.findDEMTileFor(o);if(!e||!e.dem)return;p=e;}const u=h.borders[i];let v=0;const x=h.borderDoneWithNeighborZ[i]!==r.canonical.z;if(r.canonical.z===h.canonical.z){for(let o=0;o<n.length;o++){const s=r.featuresOnBorder[n[o]],a=s.borders[t];let l;for(;v<u.length&&(l=h.featuresOnBorder[u[v]],!(l.borders[i][1]>a[0]+3));)x&&h.encodeCentroid(void 0,l,!1),v++;if(l&&v<u.length){const o=v;let n=0;for(;!(l.borders[i][0]>a[1]-3)&&(n++,++v!==u.length);)l=h.featuresOnBorder[u[v]];if(l=h.featuresOnBorder[u[o]],s.intersectsCount()>1||l.intersectsCount()>1||1!==n){1!==n&&(v=o),r.encodeCentroid(void 0,s,!1),x&&h.encodeCentroid(void 0,l,!1);continue}const c=_[t](s,l),p=t%2?e.EXTENT-1:0;d.x=g(c[0],Math.min(e.EXTENT-1,c[1]),p,t<2,c[2]),d.y=0,r.encodeCentroid(d,s,!1),x&&h.encodeCentroid(d,l,!1);}else r.encodeCentroid(void 0,s,!1);}r.borderDoneWithNeighborZ[t]=h.canonical.z,r.needsCentroidUpdate=!0,x&&(h.borderDoneWithNeighborZ[i]=r.canonical.z,h.needsCentroidUpdate=!0);}else {for(const e of n)r.encodeCentroid(void 0,r.featuresOnBorder[e],!1);if(x){for(const e of u)h.encodeCentroid(void 0,h.featuresOnBorder[e],!1);h.borderDoneWithNeighborZ[i]=r.canonical.z,h.needsCentroidUpdate=!0;}r.borderDoneWithNeighborZ[t]=h.canonical.z,r.needsCentroidUpdate=!0;}}(r.needsCentroidUpdate||!r.centroidVertexBuffer&&0!==r.centroidVertexArray.length)&&r.uploadCentroid(t);}const bo=new e.Color(1,0,0,1),wo=new e.Color(0,1,0,1),To=new e.Color(0,0,1,1),Eo=new e.Color(1,0,1,1),Co=new e.Color(0,1,1,1);function Mo(t,i,o){const r=t.context,n=t.transform,s=r.gl,a=\"globe\"===n.projection.name,l=a?[\"PROJECTION_GLOBE_VIEW\"]:null;let c=o.projMatrix;if(a&&e.globeToMercatorTransition(n.zoom)>0){const t=e.transitionTileAABBinECEF(o.canonical,n),i=e.globeDenormalizeECEF(t);c=e.multiply(new Float32Array(16),n.globeMatrix,i),e.multiply(c,n.projMatrix,c);}const h=t.useProgram(\"debug\",null,l),u=i.getTileByID(o.key);t.terrain&&t.terrain.setupElevationDraw(u,h);const _=e.DepthMode.disabled,d=e.StencilMode.disabled,p=t.colorModeForRenderPass(),m=\"$debug\";r.activeTexture.set(s.TEXTURE0),t.emptyTexture.bind(s.LINEAR,s.CLAMP_TO_EDGE),a?u._makeGlobeTileDebugBuffers(t.context,n):u._makeDebugTileBoundsBuffers(t.context,n.projection);const f=u._tileDebugBuffer||t.debugBuffer,g=u._tileDebugIndexBuffer||t.debugIndexBuffer,v=u._tileDebugSegments||t.debugSegments;h.draw(r,s.LINE_STRIP,_,d,p,e.CullFaceMode.disabled,Xi(c,e.Color.red),m,f,g,v,null,null,null,[u._globeTileDebugBorderBuffer]);const x=u.latestRawTileData,y=Math.floor((x&&x.byteLength||0)/1024),b=i.getTile(o).tileSize,w=512/Math.min(b,512)*(o.overscaledZ/n.zoom)*.5;let T=o.canonical.toString();o.overscaledZ!==o.canonical.z&&(T+=` => ${o.overscaledZ}`),T+=` ${y}kb`,function(e,t){e.initDebugOverlayCanvas();const i=e.debugOverlayCanvas,o=e.context.gl,r=e.debugOverlayCanvas.getContext(\"2d\");r.clearRect(0,0,i.width,i.height),r.shadowColor=\"white\",r.shadowBlur=2,r.lineWidth=1.5,r.strokeStyle=\"white\",r.textBaseline=\"top\",r.font=\"bold 36px Open Sans, sans-serif\",r.fillText(t,5,5),r.strokeText(t,5,5),e.debugOverlayTexture.update(i),e.debugOverlayTexture.bind(o.LINEAR,o.CLAMP_TO_EDGE);}(t,T);const E=u._tileDebugTextBuffer||t.debugBuffer,C=u._tileDebugTextIndexBuffer||t.quadTriangleIndexBuffer,M=u._tileDebugTextSegments||t.debugSegments;h.draw(r,s.TRIANGLES,_,d,e.ColorMode.alphaBlended,e.CullFaceMode.disabled,Xi(c,e.Color.transparent,w),m,E,C,M,null,null,null,[u._globeTileDebugTextBuffer]);}function Io(e,t,i,o){Do(e,0,t+i/2,e.transform.width,i,o);}function So(e,t,i,o){Do(e,t-i/2,0,i,e.transform.height,o);}function Do(t,i,o,r,n,s){const a=t.context,l=a.gl;l.enable(l.SCISSOR_TEST),l.scissor(i*e.exported.devicePixelRatio,o*e.exported.devicePixelRatio,r*e.exported.devicePixelRatio,n*e.exported.devicePixelRatio),a.clear({color:s}),l.disable(l.SCISSOR_TEST);}const Lo=e.createLayout([{name:\"a_pos_3f\",components:3,type:\"Float32\"}]),{members:Ao}=Lo;function zo(e,t,i,o){e.emplaceBack(t,i,o);}class Po{constructor(t){this.vertexArray=new e.StructArrayLayout3f12,this.indices=new e.StructArrayLayout3ui6,zo(this.vertexArray,-1,-1,1),zo(this.vertexArray,1,-1,1),zo(this.vertexArray,-1,1,1),zo(this.vertexArray,1,1,1),zo(this.vertexArray,-1,-1,-1),zo(this.vertexArray,1,-1,-1),zo(this.vertexArray,-1,1,-1),zo(this.vertexArray,1,1,-1),this.indices.emplaceBack(5,1,3),this.indices.emplaceBack(3,7,5),this.indices.emplaceBack(6,2,0),this.indices.emplaceBack(0,4,6),this.indices.emplaceBack(2,6,7),this.indices.emplaceBack(7,3,2),this.indices.emplaceBack(5,4,0),this.indices.emplaceBack(0,1,5),this.indices.emplaceBack(0,2,3),this.indices.emplaceBack(3,1,0),this.indices.emplaceBack(7,6,4),this.indices.emplaceBack(4,5,7),this.vertexBuffer=t.createVertexBuffer(this.vertexArray,Ao),this.indexBuffer=t.createIndexBuffer(this.indices),this.segment=e.SegmentVector.simpleSegment(0,0,36,12);}}function Ro(t,i,o,r,n,s){const a=t.gl,l=i.paint.get(\"sky-atmosphere-color\"),c=i.paint.get(\"sky-atmosphere-halo-color\"),h=i.paint.get(\"sky-atmosphere-sun-intensity\"),u=((e,t,i,o,r)=>({u_matrix_3f:e,u_sun_direction:t,u_sun_intensity:i,u_color_tint_r:[o.r,o.g,o.b,o.a],u_color_tint_m:[r.r,r.g,r.b,r.a],u_luminance:5e-5}))(e.fromMat4(e.create$1(),r),n,h,l,c);a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+s,i.skyboxTexture,0),o.draw(t,a.TRIANGLES,e.DepthMode.disabled,e.StencilMode.disabled,e.ColorMode.unblended,e.CullFaceMode.frontCW,u,\"skyboxCapture\",i.skyboxGeometry.vertexBuffer,i.skyboxGeometry.indexBuffer,i.skyboxGeometry.segment);}const Oo=e.createLayout([{type:\"Float32\",name:\"a_pos\",components:3},{type:\"Float32\",name:\"a_uv\",components:2}]);class Bo{constructor(t){const i=new e.StructArrayLayout5f20;i.emplaceBack(-1,1,1,0,0),i.emplaceBack(1,1,1,1,0),i.emplaceBack(1,-1,1,1,1),i.emplaceBack(-1,-1,1,0,1);const o=new e.StructArrayLayout3ui6;o.emplaceBack(0,1,2),o.emplaceBack(2,3,0),this.vertexBuffer=t.createVertexBuffer(i,Oo.members),this.indexBuffer=t.createIndexBuffer(o),this.segments=e.SegmentVector.simpleSegment(0,0,4,2);}destroy(){this.vertexBuffer.destroy(),this.indexBuffer.destroy(),this.segments.destroy();}}const ko={symbol:function(t,i,o,r,n){if(\"translucent\"!==t.renderPass)return;const s=e.StencilMode.disabled,a=t.colorModeForRenderPass();o.layout.get(\"text-variable-anchor\")&&function(t,i,o,r,n,s,a){const l=i.transform,c=\"map\"===n,h=\"map\"===s;for(const i of t){const t=r.getTile(i),n=t.getBucket(o);if(!n||!n.text||!n.text.segments.get().length)continue;const s=e.evaluateSizeForZoom(n.textSizeData,l.zoom),u=bt(i,n.getProjection(),l),_=l.calculatePixelsToTileUnitsMatrix(t),d=it(u,t.tileID.canonical,h,c,l,n.getProjection(),_),p=\"none\"!==o.layout.get(\"icon-text-fit\")&&n.hasIconData();if(s){const o=Math.pow(2,l.zoom-t.tileID.overscaledZ);po(n,c,h,a,e.symbolSize,l,d,i,o,s,p);}}}(r,t,o,i,o.layout.get(\"text-rotation-alignment\"),o.layout.get(\"text-pitch-alignment\"),n),0!==o.paint.get(\"icon-opacity\").constantOr(1)&&fo(t,i,o,r,!1,o.paint.get(\"icon-translate\"),o.paint.get(\"icon-translate-anchor\"),o.layout.get(\"icon-rotation-alignment\"),o.layout.get(\"icon-pitch-alignment\"),o.layout.get(\"icon-keep-upright\"),s,a),0!==o.paint.get(\"text-opacity\").constantOr(1)&&fo(t,i,o,r,!0,o.paint.get(\"text-translate\"),o.paint.get(\"text-translate-anchor\"),o.layout.get(\"text-rotation-alignment\"),o.layout.get(\"text-pitch-alignment\"),o.layout.get(\"text-keep-upright\"),s,a),i.map.showCollisionBoxes&&(ho(t,i,o,r,o.paint.get(\"text-translate\"),o.paint.get(\"text-translate-anchor\"),!0),ho(t,i,o,r,o.paint.get(\"icon-translate\"),o.paint.get(\"icon-translate-anchor\"),!1));},circle:function(t,i,o,r){if(\"translucent\"!==t.renderPass)return;const n=o.paint.get(\"circle-opacity\"),s=o.paint.get(\"circle-stroke-width\"),a=o.paint.get(\"circle-stroke-opacity\"),l=void 0!==o.layout.get(\"circle-sort-key\").constantOr(1);if(0===n.constantOr(1)&&(0===s.constantOr(1)||0===a.constantOr(1)))return;const c=t.context,h=c.gl,u=t.transform,_=t.depthModeForSublayer(0,e.DepthMode.ReadOnly),d=e.StencilMode.disabled,p=t.colorModeForRenderPass(),m=\"globe\"===u.projection.name,f=[e.mercatorXfromLng(u.center.lng),e.mercatorYfromLat(u.center.lat)],g=[];for(let n=0;n<r.length;n++){const s=r[n],a=i.getTile(s),c=a.getBucket(o);if(!c||c.projection.name!==u.projection.name)continue;const h=c.programConfigurations.get(o.id),_=Vi(o);m&&_.push(\"PROJECTION_GLOBE_VIEW\");const d=t.useProgram(\"circle\",h,_),p=c.layoutVertexBuffer,v=c.globeExtVertexBuffer,x=c.indexBuffer,y=u.projection.createInversionMatrix(u,s.canonical),b={programConfiguration:h,program:d,layoutVertexBuffer:p,globeExtVertexBuffer:v,indexBuffer:x,uniformValues:Zi(t,s,a,y,f,o),tile:a};if(l){const t=c.segments.get();for(const i of t)g.push({segments:new e.SegmentVector([i]),sortKey:i.sortKey,state:b});}else g.push({segments:c.segments,sortKey:0,state:b});}l&&g.sort(((e,t)=>e.sortKey-t.sortKey));const v={useDepthForOcclusion:!m};for(const i of g){const{programConfiguration:r,program:n,layoutVertexBuffer:s,globeExtVertexBuffer:a,indexBuffer:l,uniformValues:m,tile:f}=i.state,g=i.segments;t.terrain&&t.terrain.setupElevationDraw(f,n,v),t.prepareDrawProgram(c,n,f.tileID.toUnwrapped()),n.draw(c,h.TRIANGLES,_,d,p,e.CullFaceMode.disabled,m,o.id,s,l,g,o.paint,u.zoom,r,[a]);}},heatmap:function(t,i,o,r){if(0!==o.paint.get(\"heatmap-opacity\"))if(\"offscreen\"===t.renderPass){const n=t.context,s=n.gl,a=e.StencilMode.disabled,l=new e.ColorMode([s.ONE,s.ONE],e.Color.transparent,[!0,!0,!0,!0]);!function(e,t,i,o){const r=e.gl,n=t.width*o,s=t.height*o;e.activeTexture.set(r.TEXTURE1),e.viewport.set([0,0,n,s]);let a=i.heatmapFbo;if(!a||a&&(a.width!==n||a.height!==s)){a&&a.destroy();const t=r.createTexture();r.bindTexture(r.TEXTURE_2D,t),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),a=i.heatmapFbo=e.createFramebuffer(n,s,!1),function(e,t,i,o,r,n){const s=e.gl;s.texImage2D(s.TEXTURE_2D,0,e.isWebGL2&&e.extRenderToTextureHalfFloat?s.RGBA16F:s.RGBA,r,n,0,s.RGBA,e.extRenderToTextureHalfFloat?e.isWebGL2?s.HALF_FLOAT:e.extTextureHalfFloat.HALF_FLOAT_OES:s.UNSIGNED_BYTE,null),o.colorAttachment.set(i);}(e,0,t,a,n,s);}else r.bindTexture(r.TEXTURE_2D,a.colorAttachment.get()),e.bindFramebuffer.set(a.framebuffer);}(n,t,o,\"globe\"===t.transform.projection.name?.5:.25),n.clear({color:e.Color.transparent});const c=t.transform,h=\"globe\"===c.projection.name,u=h?[\"PROJECTION_GLOBE_VIEW\"]:null,_=h?e.CullFaceMode.frontCCW:e.CullFaceMode.disabled,d=[e.mercatorXfromLng(c.center.lng),e.mercatorYfromLat(c.center.lat)];for(let p=0;p<r.length;p++){const m=r[p];if(i.hasRenderableParent(m))continue;const f=i.getTile(m),g=f.getBucket(o);if(!g||g.projection.name!==c.projection.name)continue;const v=g.programConfigurations.get(o.id),x=t.useProgram(\"heatmap\",v,u),{zoom:y}=t.transform;t.terrain&&t.terrain.setupElevationDraw(f,x),t.prepareDrawProgram(n,x,m.toUnwrapped());const b=c.projection.createInversionMatrix(c,m.canonical);x.draw(n,s.TRIANGLES,e.DepthMode.disabled,a,l,_,$i(t,m,f,b,d,y,o.paint.get(\"heatmap-intensity\")),o.id,g.layoutVertexBuffer,g.indexBuffer,g.segments,o.paint,t.transform.zoom,v,h?[g.globeExtVertexBuffer]:null);}n.viewport.set([0,0,t.width,t.height]);}else \"translucent\"===t.renderPass&&(t.context.setColorMode(t.colorModeForRenderPass()),function(t,i){const o=t.context,r=o.gl,n=i.heatmapFbo;if(!n)return;o.activeTexture.set(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,n.colorAttachment.get()),o.activeTexture.set(r.TEXTURE1);let s=i.colorRampTexture;s||(s=i.colorRampTexture=new e.Texture(o,i.colorRamp,r.RGBA)),s.bind(r.LINEAR,r.CLAMP_TO_EDGE),t.useProgram(\"heatmapTexture\").draw(o,r.TRIANGLES,e.DepthMode.disabled,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.disabled,((e,t,i,o)=>({u_image:0,u_color_ramp:1,u_opacity:t.paint.get(\"heatmap-opacity\")}))(0,i),i.id,t.viewportBuffer,t.quadTriangleIndexBuffer,t.viewportSegments,i.paint,t.transform.zoom);}(t,o));},line:function(t,i,o,r){if(\"translucent\"!==t.renderPass)return;const n=o.paint.get(\"line-opacity\"),s=o.paint.get(\"line-width\");if(0===n.constantOr(1)||0===s.constantOr(1))return;const a=t.depthModeForSublayer(0,e.DepthMode.ReadOnly),l=t.colorModeForRenderPass(),c=t.terrain&&t.terrain.renderingToTexture?1:e.exported.devicePixelRatio,h=o.paint.get(\"line-dasharray\"),u=h.constantOr(1),_=o.layout.get(\"line-cap\"),d=o.paint.get(\"line-pattern\"),p=d.constantOr(1),m=o.paint.get(\"line-gradient\"),f=p?\"linePattern\":\"line\",g=t.context,v=g.gl,x=(e=>{const t=[];Qi(e)&&t.push(\"RENDER_LINE_DASH\"),e.paint.get(\"line-gradient\")&&t.push(\"RENDER_LINE_GRADIENT\");const i=e.paint.get(\"line-trim-offset\");0===i[0]&&0===i[1]||t.push(\"RENDER_LINE_TRIM_OFFSET\");const o=e.paint.get(\"line-pattern\").constantOr(1),r=1!==e.paint.get(\"line-opacity\").constantOr(1);return !o&&r&&t.push(\"RENDER_LINE_ALPHA_DISCARD\"),t})(o);let y=x.includes(\"RENDER_LINE_ALPHA_DISCARD\");t.terrain&&t.terrain.clipOrMaskOverlapStencilType()&&(y=!1);for(const n of r){const r=i.getTile(n);if(p&&!r.patternsLoaded())continue;const s=r.getBucket(o);if(!s)continue;t.prepareDrawTile();const b=s.programConfigurations.get(o.id),w=t.useProgram(f,b,x),T=d.constantOr(null);if(T&&r.imageAtlas){const e=r.imageAtlas.patternPositions[T.toString()];e&&b.setConstantPatternPositions(e);}const E=h.constantOr(null),C=_.constantOr(null);if(!p&&E&&C&&r.lineAtlas){const e=r.lineAtlas.getDash(E,C);e&&b.setConstantPatternPositions(e);}let[M,I]=o.paint.get(\"line-trim-offset\");if(\"round\"===C||\"square\"===C){const e=1;M!==I&&(0===M&&(M-=e),1===I&&(I+=e));}const S=t.terrain?n.projMatrix:null,D=p?Yi(t,r,o,S,c):Hi(t,r,o,S,s.lineClipsArray.length,c,[M,I]);if(m){const r=s.gradients[o.id];let a=r.texture;if(o.gradientVersion!==r.version){let l=256;if(o.stepInterpolant){const o=i.getSource().maxzoom,r=n.canonical.z===o?Math.ceil(1<<t.transform.maxZoom-n.canonical.z):1;l=e.clamp(e.nextPowerOfTwo(s.maxLineLength/e.EXTENT*1024*r),256,g.maxTextureSize);}r.gradient=e.renderColorRamp({expression:o.gradientExpression(),evaluationKey:\"lineProgress\",resolution:l,image:r.gradient||void 0,clips:s.lineClipsArray}),r.texture?r.texture.update(r.gradient):r.texture=new e.Texture(g,r.gradient,v.RGBA),r.version=o.gradientVersion,a=r.texture;}g.activeTexture.set(v.TEXTURE1),a.bind(o.stepInterpolant?v.NEAREST:v.LINEAR,v.CLAMP_TO_EDGE);}u&&(g.activeTexture.set(v.TEXTURE0),r.lineAtlasTexture.bind(v.LINEAR,v.REPEAT),b.updatePaintBuffers()),p&&(g.activeTexture.set(v.TEXTURE0),r.imageAtlasTexture.bind(v.LINEAR,v.CLAMP_TO_EDGE),b.updatePaintBuffers()),t.prepareDrawProgram(g,w,n.toUnwrapped());const L=i=>{w.draw(g,v.TRIANGLES,a,i,l,e.CullFaceMode.disabled,D,o.id,s.layoutVertexBuffer,s.indexBuffer,s.segments,o.paint,t.transform.zoom,b,[s.layoutVertexBuffer2]);};if(y){const i=t.stencilModeForClipping(n).ref;0===i&&t.terrain&&g.clear({stencil:0});const o={func:v.EQUAL,mask:255};D.u_alpha_discard_threshold=.8,L(new e.StencilMode(o,i,255,v.KEEP,v.KEEP,v.INVERT)),D.u_alpha_discard_threshold=0,L(new e.StencilMode(o,i,255,v.KEEP,v.KEEP,v.KEEP));}else L(t.stencilModeForClipping(n));}y&&(t.resetStencilClippingMasks(),t.terrain&&g.clear({stencil:0}));},fill:function(t,i,o,r){const n=o.paint.get(\"fill-color\"),s=o.paint.get(\"fill-opacity\");if(0===s.constantOr(1))return;const a=t.colorModeForRenderPass(),l=o.paint.get(\"fill-pattern\"),c=t.opaquePassEnabledForLayer()&&!l.constantOr(1)&&1===n.constantOr(e.Color.transparent).a&&1===s.constantOr(0)?\"opaque\":\"translucent\";if(t.renderPass===c){const n=t.depthModeForSublayer(1,\"opaque\"===t.renderPass?e.DepthMode.ReadWrite:e.DepthMode.ReadOnly);vo(t,i,o,r,n,a,!1);}if(\"translucent\"===t.renderPass&&o.paint.get(\"fill-antialias\")){const n=t.depthModeForSublayer(o.getPaintProperty(\"fill-outline-color\")?2:0,e.DepthMode.ReadOnly);vo(t,i,o,r,n,a,!0);}},\"fill-extrusion\":function(t,i,o,r){const n=o.paint.get(\"fill-extrusion-opacity\");if(0!==n&&\"translucent\"===t.renderPass){const s=new e.DepthMode(t.context.gl.LEQUAL,e.DepthMode.ReadWrite,t.depthRangeFor3D);if(1!==n||o.paint.get(\"fill-extrusion-pattern\").constantOr(1))xo(t,i,o,r,s,e.StencilMode.disabled,e.ColorMode.disabled),xo(t,i,o,r,s,t.stencilModeFor3D(),t.colorModeForRenderPass()),t.resetStencilClippingMasks();else {const n=t.colorModeForRenderPass();xo(t,i,o,r,s,e.StencilMode.disabled,n);}}},hillshade:function(t,i,o,r){if(\"offscreen\"!==t.renderPass&&\"translucent\"!==t.renderPass)return;const n=t.context,s=t.depthModeForSublayer(0,e.DepthMode.ReadOnly),a=t.colorModeForRenderPass(),l=t.terrain&&t.terrain.renderingToTexture,[c,h]=\"translucent\"!==t.renderPass||l?[{},r]:t.stencilConfigForOverlap(r);for(const r of h){const n=i.getTile(r);if(n.needsHillshadePrepare&&\"offscreen\"===t.renderPass)vi(t,n,o,s,e.StencilMode.disabled,a);else if(\"translucent\"===t.renderPass){const e=l&&t.terrain?t.terrain.stencilModeForRTTOverlap(r):c[r.overscaledZ];fi(t,r,n,o,s,e,a);}}n.viewport.set([0,0,t.width,t.height]),t.resetStencilClippingMasks();},raster:function(t,i,o,r,n,s){if(\"translucent\"!==t.renderPass)return;if(0===o.paint.get(\"raster-opacity\"))return;if(!r.length)return;const a=t.context,l=a.gl,c=i.getSource(),h=t.useProgram(\"raster\"),u=t.colorModeForRenderPass(),_=t.terrain&&t.terrain.renderingToTexture,[d,p]=c instanceof Ae||_?[{},r]:t.stencilConfigForOverlap(r),m=p[p.length-1].overscaledZ,f=!t.options.moving;for(const r of p){const n=_?e.DepthMode.disabled:t.depthModeForSublayer(r.overscaledZ-m,1===o.paint.get(\"raster-opacity\")?e.DepthMode.ReadWrite:e.DepthMode.ReadOnly,l.LESS),p=r.toUnwrapped(),g=i.getTile(r);if(_&&(!g||!g.hasData()))continue;const v=_?r.projMatrix:t.transform.calculateProjMatrix(p,f),x=t.terrain&&_?t.terrain.stencilModeForRTTOverlap(r):d[r.overscaledZ],y=s?0:o.paint.get(\"raster-fade-duration\");g.registerFadeDuration(y);const b=i.findLoadedParent(r,0),w=Si(g,b,i,t.transform,y);let T,E;t.terrain&&t.terrain.prepareDrawTile();const C=\"nearest\"===o.paint.get(\"raster-resampling\")?l.NEAREST:l.LINEAR;a.activeTexture.set(l.TEXTURE0),g.texture.bind(C,l.CLAMP_TO_EDGE),a.activeTexture.set(l.TEXTURE1),b?(b.texture.bind(C,l.CLAMP_TO_EDGE),T=Math.pow(2,b.tileID.overscaledZ-g.tileID.overscaledZ),E=[g.tileID.canonical.x*T%1,g.tileID.canonical.y*T%1]):g.texture.bind(C,l.CLAMP_TO_EDGE);const M=eo(v,E||[0,0],T||1,w,o,c instanceof Ae?c.perspectiveTransform:[0,0]);if(t.prepareDrawProgram(a,h,p),c instanceof Ae)c.boundsBuffer&&c.boundsSegments&&h.draw(a,l.TRIANGLES,n,e.StencilMode.disabled,u,e.CullFaceMode.disabled,M,o.id,c.boundsBuffer,t.quadTriangleIndexBuffer,c.boundsSegments);else {const{tileBoundsBuffer:i,tileBoundsIndexBuffer:r,tileBoundsSegments:s}=t.getTileBoundsBuffers(g);h.draw(a,l.TRIANGLES,n,x,u,e.CullFaceMode.disabled,M,o.id,i,r,s);}}t.resetStencilClippingMasks();},background:function(t,i,o,r){const n=o.paint.get(\"background-color\"),s=o.paint.get(\"background-opacity\");if(0===s)return;const a=t.context,l=a.gl,c=t.transform,h=c.tileSize,u=o.paint.get(\"background-pattern\");if(t.isPatternMissing(u))return;const _=!u&&1===n.a&&1===s&&t.opaquePassEnabledForLayer()?\"opaque\":\"translucent\";if(t.renderPass!==_)return;const d=e.StencilMode.disabled,p=t.depthModeForSublayer(0,\"opaque\"===_?e.DepthMode.ReadWrite:e.DepthMode.ReadOnly),m=t.colorModeForRenderPass(),f=t.useProgram(u?\"backgroundPattern\":\"background\");let g,v=r;v||(g=t.getBackgroundTiles(),v=Object.values(g).map((e=>e.tileID))),u&&(a.activeTexture.set(l.TEXTURE0),t.imageManager.bind(t.context));for(const _ of v){const v=_.toUnwrapped(),x=r?_.projMatrix:t.transform.calculateProjMatrix(v);t.prepareDrawTile();const y=i?i.getTile(_):g?g[_.key]:new e.Tile(_,h,c.zoom,t),b=u?ao(x,s,t,u,{tileID:_,tileSize:h}):so(x,s,n);t.prepareDrawProgram(a,f,v);const{tileBoundsBuffer:w,tileBoundsIndexBuffer:T,tileBoundsSegments:E}=t.getTileBoundsBuffers(y);f.draw(a,l.TRIANGLES,p,d,m,e.CullFaceMode.disabled,b,o.id,w,T,E);}},sky:function(t,i,o){const r=t.transform,n=\"mercator\"===r.projection.name||\"globe\"===r.projection.name?1:e.smoothstep(7,8,r.zoom),s=o.paint.get(\"sky-opacity\")*n;if(0===s)return;const a=t.context,l=o.paint.get(\"sky-type\"),c=new e.DepthMode(a.gl.LEQUAL,e.DepthMode.ReadOnly,[0,1]),h=t.frameCounter/1e3%1;\"atmosphere\"===l?\"offscreen\"===t.renderPass?o.needsSkyboxCapture(t)&&(function(t,i,o,r){const n=t.context,s=n.gl;let a=i.skyboxFbo;if(!a){a=i.skyboxFbo=n.createFramebuffer(32,32,!1),i.skyboxGeometry=new Po(n),i.skyboxTexture=n.gl.createTexture(),s.bindTexture(s.TEXTURE_CUBE_MAP,i.skyboxTexture),s.texParameteri(s.TEXTURE_CUBE_MAP,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_CUBE_MAP,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_CUBE_MAP,s.TEXTURE_MIN_FILTER,s.LINEAR),s.texParameteri(s.TEXTURE_CUBE_MAP,s.TEXTURE_MAG_FILTER,s.LINEAR);for(let e=0;e<6;++e)s.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,s.RGBA,32,32,0,s.RGBA,s.UNSIGNED_BYTE,null);}n.bindFramebuffer.set(a.framebuffer),n.viewport.set([0,0,32,32]);const l=i.getCenter(t,!0),c=t.useProgram(\"skyboxCapture\"),h=new Float64Array(16);e.identity(h),e.rotateY(h,h,.5*-Math.PI),Ro(n,i,c,h,l,0),e.identity(h),e.rotateY(h,h,.5*Math.PI),Ro(n,i,c,h,l,1),e.identity(h),e.rotateX(h,h,.5*-Math.PI),Ro(n,i,c,h,l,2),e.identity(h),e.rotateX(h,h,.5*Math.PI),Ro(n,i,c,h,l,3),e.identity(h),Ro(n,i,c,h,l,4),e.identity(h),e.rotateY(h,h,Math.PI),Ro(n,i,c,h,l,5),n.viewport.set([0,0,t.width,t.height]);}(t,o),o.markSkyboxValid(t)):\"sky\"===t.renderPass&&function(t,i,o,r,n){const s=t.context,a=s.gl,l=t.transform,c=t.useProgram(\"skybox\");s.activeTexture.set(a.TEXTURE0),a.bindTexture(a.TEXTURE_CUBE_MAP,i.skyboxTexture);const h=((e,t,i,o,r)=>({u_matrix:e,u_sun_direction:t,u_cubemap:0,u_opacity:o,u_temporal_offset:r}))(l.skyboxMatrix,i.getCenter(t,!1),0,r,n);t.prepareDrawProgram(s,c),c.draw(s,a.TRIANGLES,o,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.backCW,h,\"skybox\",i.skyboxGeometry.vertexBuffer,i.skyboxGeometry.indexBuffer,i.skyboxGeometry.segment);}(t,o,c,s,h):\"gradient\"===l&&\"sky\"===t.renderPass&&function(t,i,o,r,n){const s=t.context,a=s.gl,l=t.transform,c=t.useProgram(\"skyboxGradient\");i.skyboxGeometry||(i.skyboxGeometry=new Po(s)),s.activeTexture.set(a.TEXTURE0);let h=i.colorRampTexture;h||(h=i.colorRampTexture=new e.Texture(s,i.colorRamp,a.RGBA)),h.bind(a.LINEAR,a.CLAMP_TO_EDGE);const u=((t,i,o,r,n)=>({u_matrix:t,u_color_ramp:0,u_center_direction:i,u_radius:e.degToRad(o),u_opacity:r,u_temporal_offset:n}))(l.skyboxMatrix,i.getCenter(t,!1),i.paint.get(\"sky-gradient-radius\"),r,n);t.prepareDrawProgram(s,c),c.draw(s,a.TRIANGLES,o,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.backCW,u,\"skyboxGradient\",i.skyboxGeometry.vertexBuffer,i.skyboxGeometry.indexBuffer,i.skyboxGeometry.segment);}(t,o,c,s,h);},debug:function(e,t,i){for(let o=0;o<i.length;o++)Mo(e,t,i[o]);},custom:function(t,i,o,r){const n=t.context,s=o.implementation;if(!t.transform.projection.unsupportedLayers||!t.transform.projection.unsupportedLayers.includes(\"custom\")||t.terrain&&(t.terrain.renderingToTexture||\"offscreen\"===t.renderPass)&&o.isLayerDraped()){if(\"offscreen\"===t.renderPass){const i=s.prerender;if(i){if(t.setCustomLayerDefaults(),n.setColorMode(t.colorModeForRenderPass()),\"globe\"===t.transform.projection.name){const o=t.transform.pointMerc;i.call(s,n.gl,t.transform.customLayerMatrix(),t.transform.getProjection(),t.transform.globeToMercatorMatrix(),e.globeToMercatorTransition(t.transform.zoom),[o.x,o.y],t.transform.pixelsPerMeterRatio);}else i.call(s,n.gl,t.transform.customLayerMatrix());n.setDirty(),t.setBaseState();}}else if(\"translucent\"===t.renderPass){if(t.terrain&&t.terrain.renderingToTexture){const i=s.renderToTile;if(i){const o=r[0].canonical,a=new e.MercatorCoordinate(o.x+r[0].wrap*(1<<o.z),o.y,o.z);n.setDepthMode(e.DepthMode.disabled),n.setStencilMode(e.StencilMode.disabled),n.setColorMode(t.colorModeForRenderPass()),t.setCustomLayerDefaults(),i.call(s,n.gl,a),n.setDirty(),t.setBaseState();}return}t.setCustomLayerDefaults(),n.setColorMode(t.colorModeForRenderPass()),n.setStencilMode(e.StencilMode.disabled);const i=\"3d\"===s.renderingMode?new e.DepthMode(t.context.gl.LEQUAL,e.DepthMode.ReadWrite,t.depthRangeFor3D):t.depthModeForSublayer(0,e.DepthMode.ReadOnly);if(n.setDepthMode(i),\"globe\"===t.transform.projection.name){const i=t.transform.pointMerc;s.render(n.gl,t.transform.customLayerMatrix(),t.transform.getProjection(),t.transform.globeToMercatorMatrix(),e.globeToMercatorTransition(t.transform.zoom),[i.x,i.y],t.transform.pixelsPerMeterRatio);}else s.render(n.gl,t.transform.customLayerMatrix());n.setDirty(),t.setBaseState(),n.bindFramebuffer.set(null);}}else e.warnOnce(\"Custom layers are not yet supported with this projection. Use mercator or globe to enable usage of custom layers.\");}};class Fo{constructor(t,i,o=!1){this.context=new Me(t,o),this.transform=i,this._tileTextures={},this.frameCopies=[],this.loadTimeStamps=[],this.setup(),this.numSublayers=e.SourceCache.maxUnderzooming+e.SourceCache.maxOverzooming+1,this.depthEpsilon=1/Math.pow(2,16),this.crossTileSymbolIndex=new qt,this.deferredRenderGpuTimeQueries=[],this.gpuTimers={},this.frameCounter=0,this._backgroundTiles={};}updateTerrain(e,t){const i=!!e&&!!e.terrain&&this.transform.projection.supportsTerrain;if(!(i||this._terrain&&this._terrain.enabled))return;this._terrain||(this._terrain=new zi(this,e));const o=this._terrain;this.transform.elevation=i?o:null,o.update(e,this.transform,t);}_updateFog(e){const t=e.fog;if(!t||\"globe\"===this.transform.projection.name||t.getOpacity(this.transform.pitch)<1||t.properties.get(\"horizon-blend\")<.03)return void(this.transform.fogCullDistSq=null);const[i,o]=t.getFovAdjustedRange(this.transform._fov);if(i>o)return void(this.transform.fogCullDistSq=null);const r=i+.78*(o-i);this.transform.fogCullDistSq=r*r;}get terrain(){return this.transform._terrainEnabled()&&this._terrain&&this._terrain.enabled?this._terrain:null}resize(t,i){if(this.width=t*e.exported.devicePixelRatio,this.height=i*e.exported.devicePixelRatio,this.context.viewport.set([0,0,this.width,this.height]),this.style)for(const e of this.style.order)this.style._layers[e].resize();}setup(){const t=this.context,i=new e.StructArrayLayout2i4;i.emplaceBack(0,0),i.emplaceBack(e.EXTENT,0),i.emplaceBack(0,e.EXTENT),i.emplaceBack(e.EXTENT,e.EXTENT),this.tileExtentBuffer=t.createVertexBuffer(i,e.posAttributes.members),this.tileExtentSegments=e.SegmentVector.simpleSegment(0,0,4,2);const o=new e.StructArrayLayout2i4;o.emplaceBack(0,0),o.emplaceBack(e.EXTENT,0),o.emplaceBack(0,e.EXTENT),o.emplaceBack(e.EXTENT,e.EXTENT),this.debugBuffer=t.createVertexBuffer(o,e.posAttributes.members),this.debugSegments=e.SegmentVector.simpleSegment(0,0,4,5);const r=new e.StructArrayLayout2i4;r.emplaceBack(-1,-1),r.emplaceBack(1,-1),r.emplaceBack(-1,1),r.emplaceBack(1,1),this.viewportBuffer=t.createVertexBuffer(r,e.posAttributes.members),this.viewportSegments=e.SegmentVector.simpleSegment(0,0,4,2);const n=new e.StructArrayLayout4i8;n.emplaceBack(0,0,0,0),n.emplaceBack(e.EXTENT,0,e.EXTENT,0),n.emplaceBack(0,e.EXTENT,0,e.EXTENT),n.emplaceBack(e.EXTENT,e.EXTENT,e.EXTENT,e.EXTENT),this.mercatorBoundsBuffer=t.createVertexBuffer(n,e.boundsAttributes.members),this.mercatorBoundsSegments=e.SegmentVector.simpleSegment(0,0,4,2);const s=new e.StructArrayLayout3ui6;s.emplaceBack(0,1,2),s.emplaceBack(2,1,3),this.quadTriangleIndexBuffer=t.createIndexBuffer(s);const a=new e.StructArrayLayout1ui2;for(const e of [0,1,3,2,0])a.emplaceBack(e);this.debugIndexBuffer=t.createIndexBuffer(a),this.emptyTexture=new e.Texture(t,new e.RGBAImage({width:1,height:1},Uint8Array.of(0,0,0,0)),t.gl.RGBA),this.identityMat=e.create();const l=this.context.gl;this.stencilClearMode=new e.StencilMode({func:l.ALWAYS,mask:0},0,255,l.ZERO,l.ZERO,l.ZERO),this.loadTimeStamps.push(e.window.performance.now()),this.atmosphereBuffer=new Bo(this.context);}getMercatorTileBoundsBuffers(){return {tileBoundsBuffer:this.mercatorBoundsBuffer,tileBoundsIndexBuffer:this.quadTriangleIndexBuffer,tileBoundsSegments:this.mercatorBoundsSegments}}getTileBoundsBuffers(e){return e._makeTileBoundsBuffers(this.context,this.transform.projection),e._tileBoundsBuffer?{tileBoundsBuffer:e._tileBoundsBuffer,tileBoundsIndexBuffer:e._tileBoundsIndexBuffer,tileBoundsSegments:e._tileBoundsSegments}:this.getMercatorTileBoundsBuffers()}clearStencil(){const t=this.context,i=t.gl;this.nextStencilID=1,this.currentStencilSource=void 0,this._tileClippingMaskIDs={},this.useProgram(\"clippingMask\").draw(t,i.TRIANGLES,e.DepthMode.disabled,this.stencilClearMode,e.ColorMode.disabled,e.CullFaceMode.disabled,Ii(this.identityMat),\"$clipping\",this.viewportBuffer,this.quadTriangleIndexBuffer,this.viewportSegments);}resetStencilClippingMasks(){this.terrain||(this.currentStencilSource=void 0,this._tileClippingMaskIDs={});}_renderTileClippingMasks(t,i,o){if(!i||this.currentStencilSource===i.id||!t.isTileClipped()||!o||0===o.length)return;if(this._tileClippingMaskIDs&&!this.terrain){let e=!1;for(const t of o)if(void 0===this._tileClippingMaskIDs[t.key]){e=!0;break}if(!e)return}this.currentStencilSource=i.id;const r=this.context,n=r.gl;this.nextStencilID+o.length>256&&this.clearStencil(),r.setColorMode(e.ColorMode.disabled),r.setDepthMode(e.DepthMode.disabled);const s=this.useProgram(\"clippingMask\");this._tileClippingMaskIDs={};for(const t of o){const o=i.getTile(t),a=this._tileClippingMaskIDs[t.key]=this.nextStencilID++,{tileBoundsBuffer:l,tileBoundsIndexBuffer:c,tileBoundsSegments:h}=this.getTileBoundsBuffers(o);s.draw(r,n.TRIANGLES,e.DepthMode.disabled,new e.StencilMode({func:n.ALWAYS,mask:0},a,255,n.KEEP,n.KEEP,n.REPLACE),e.ColorMode.disabled,e.CullFaceMode.disabled,Ii(t.projMatrix),\"$clipping\",l,c,h);}}stencilModeFor3D(){this.currentStencilSource=void 0,this.nextStencilID+1>256&&this.clearStencil();const t=this.nextStencilID++,i=this.context.gl;return new e.StencilMode({func:i.NOTEQUAL,mask:255},t,255,i.KEEP,i.KEEP,i.REPLACE)}stencilModeForClipping(t){if(this.terrain)return this.terrain.stencilModeForRTTOverlap(t);const i=this.context.gl;return new e.StencilMode({func:i.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,i.KEEP,i.KEEP,i.REPLACE)}stencilConfigForOverlap(t){const i=this.context.gl,o=t.sort(((e,t)=>t.overscaledZ-e.overscaledZ)),r=o[o.length-1].overscaledZ,n=o[0].overscaledZ-r+1;if(n>1){this.currentStencilSource=void 0,this.nextStencilID+n>256&&this.clearStencil();const t={};for(let o=0;o<n;o++)t[o+r]=new e.StencilMode({func:i.GEQUAL,mask:255},o+this.nextStencilID,255,i.KEEP,i.KEEP,i.REPLACE);return this.nextStencilID+=n,[t,o]}return [{[r]:e.StencilMode.disabled},o]}colorModeForRenderPass(){const t=this.context.gl;if(this._showOverdrawInspector){const i=1/8;return new e.ColorMode([t.CONSTANT_COLOR,t.ONE],new e.Color(i,i,i,0),[!0,!0,!0,!0])}return \"opaque\"===this.renderPass?e.ColorMode.unblended:e.ColorMode.alphaBlended}depthModeForSublayer(t,i,o){if(!this.opaquePassEnabledForLayer())return e.DepthMode.disabled;const r=1-((1+this.currentLayer)*this.numSublayers+t)*this.depthEpsilon;return new e.DepthMode(o||this.context.gl.LEQUAL,i,[r,r])}opaquePassEnabledForLayer(){return this.currentLayer<this.opaquePassCutoff}render(t,i){this.style=t,this.options=i,this.imageManager=t.imageManager,this.glyphManager=t.glyphManager,this.symbolFadeChange=t.placement.symbolFadeChange(e.exported.now()),this.imageManager.beginFrame();const o=this.style.order,r=this.style._sourceCaches;for(const e in r){const t=r[e];t.used&&t.prepare(this.context);}const n={},s={},a={};for(const e in r){const t=r[e];n[e]=t.getVisibleCoordinates(),s[e]=n[e].slice().reverse(),a[e]=t.getVisibleCoordinates(!0).reverse();}this.opaquePassCutoff=1/0;for(let e=0;e<o.length;e++)if(this.style._layers[o[e]].is3D()){this.opaquePassCutoff=e;break}if(this.terrain&&(this.terrain.updateTileBinding(a),this.opaquePassCutoff=0),\"globe\"!==this.transform.projection.name||this.globeSharedBuffers||(this.globeSharedBuffers=new e.GlobeSharedBuffers(this.context)),e.isMapAuthenticated(this.context.gl)){this.renderPass=\"offscreen\";for(const e of o){const i=this.style._layers[e],o=t._getLayerSourceCache(i);if(!i.hasOffscreenPass()||i.isHidden(this.transform.zoom))continue;const r=o?s[o.id]:void 0;(\"custom\"===i.type||i.isSky()||r&&r.length)&&this.renderLayer(this,o,i,r);}if(this.depthRangeFor3D=[0,1-(t.order.length+2)*this.numSublayers*this.depthEpsilon],this.terrain&&(this.style.hasSymbolLayers()||this.style.hasCircleLayers())&&this.terrain.drawDepth(),this.context.bindFramebuffer.set(null),this.context.viewport.set([0,0,this.width,this.height]),this.context.clear({color:i.showOverdrawInspector?e.Color.black:e.Color.transparent,depth:1}),this.clearStencil(),this._showOverdrawInspector=i.showOverdrawInspector,this.renderPass=\"opaque\",!this.terrain)for(this.currentLayer=o.length-1;this.currentLayer>=0;this.currentLayer--){const e=this.style._layers[o[this.currentLayer]],i=t._getLayerSourceCache(e);if(e.isSky())continue;const r=i?s[i.id]:void 0;this._renderTileClippingMasks(e,i,r),this.renderLayer(this,i,e,r);}if(this.style.fog&&this.transform.projection.supportsFog&&function(t,i){const o=t.context,r=o.gl,n=t.transform,s=new e.DepthMode(r.LEQUAL,e.DepthMode.ReadOnly,[0,1]),a=t.useProgram(\"globeAtmosphere\",null,\"globe\"===n.projection.name?[\"PROJECTION_GLOBE_VIEW\",\"FOG\"]:[\"FOG\"]),l=e.globeToMercatorTransition(n.zoom),c=i.properties.get(\"color\").toArray01(),h=i.properties.get(\"high-color\").toArray01(),u=i.properties.get(\"space-color\").toArray01PremultipliedAlpha(),_=e.identity$1([]);e.rotateY$1(_,_,-e.degToRad(n._center.lng)),e.rotateX$1(_,_,e.degToRad(n._center.lat)),e.rotateZ$1(_,_,n.angle),e.rotateX$1(_,_,-n._pitch);const d=e.fromQuat(new Float32Array(16),_),p=e.mapValue(i.properties.get(\"star-intensity\"),0,1,0,.25),m=5e-4,f=e.mapValue(i.properties.get(\"horizon-blend\"),0,1,m,.25),g=e.globeUseCustomAntiAliasing(t,o,n)&&f===m?n.worldSize/(2*Math.PI*1.025)-1:n.globeRadius,v=t.frameCounter/1e3%1,x=e.length(n.globeCenterInViewSpace),y=Math.sqrt(Math.pow(x,2)-Math.pow(g,2)),b=Math.acos(y/x),w=((t,i,o,r,n,s,a,l,c,h,u,_,d,p)=>({u_frustum_tl:t,u_frustum_tr:i,u_frustum_br:o,u_frustum_bl:r,u_horizon:n,u_transition:s,u_fadeout_range:a,u_color:l,u_high_color:c,u_space_color:h,u_star_intensity:u,u_star_size:5*e.exported.devicePixelRatio,u_star_density:0,u_temporal_offset:_,u_horizon_angle:d,u_rotation_matrix:p}))(n.frustumCorners.TL,n.frustumCorners.TR,n.frustumCorners.BR,n.frustumCorners.BL,n.frustumCorners.horizon,l,f,c,h,u,p,v,b,d);t.prepareDrawProgram(o,a);const T=t.atmosphereBuffer;T&&a.draw(o,r.TRIANGLES,s,e.StencilMode.disabled,e.ColorMode.alphaBlended,e.CullFaceMode.backCW,w,\"skybox\",T.vertexBuffer,T.indexBuffer,T.segments);}(this,this.style.fog),this.renderPass=\"sky\",(e.globeToMercatorTransition(this.transform.zoom)>0||\"globe\"!==this.transform.projection.name)&&this.transform.isHorizonVisible())for(this.currentLayer=0;this.currentLayer<o.length;this.currentLayer++){const e=this.style._layers[o[this.currentLayer]],i=t._getLayerSourceCache(e);e.isSky()&&this.renderLayer(this,i,e,i?s[i.id]:void 0);}for(this.renderPass=\"translucent\",this.currentLayer=0;this.currentLayer<o.length;){const e=this.style._layers[o[this.currentLayer]],i=t._getLayerSourceCache(e);if(e.isSky()){++this.currentLayer;continue}if(this.terrain&&this.style.isLayerDraped(e)){if(e.isHidden(this.transform.zoom)){++this.currentLayer;continue}this.currentLayer=this.terrain.renderBatch(this.currentLayer);continue}const r=i?(\"symbol\"===e.type?a:s)[i.id]:void 0;this._renderTileClippingMasks(e,i,i?n[i.id]:void 0),this.renderLayer(this,i,e,r),++this.currentLayer;}if(this.terrain&&this.terrain.postRender(),this.options.showTileBoundaries||this.options.showQueryGeometry||this.options.showTileAABBs){let i=null;e.values(this.style._layers).forEach((e=>{const o=t._getLayerSourceCache(e);o&&!e.isHidden(this.transform.zoom)&&(!i||i.getSource().maxzoom<o.getSource().maxzoom)&&(i=o);})),i&&this.options.showTileBoundaries&&ko.debug(this,i,i.getVisibleCoordinates());}this.options.showPadding&&function(e){const t=e.transform.padding;Io(e,e.transform.height-(t.top||0),3,bo),Io(e,t.bottom||0,3,wo),So(e,t.left||0,3,To),So(e,e.transform.width-(t.right||0),3,Eo);const i=e.transform.centerPoint;!function(e,t,i,o){Do(e,t-1,i-10,2,20,o),Do(e,t-10,i-1,20,2,o);}(e,i.x,e.transform.height-i.y,Co);}(this),this.context.setDefault(),this.frameCounter=(this.frameCounter+1)%Number.MAX_SAFE_INTEGER,this.tileLoaded&&this.options.speedIndexTiming&&(this.loadTimeStamps.push(e.window.performance.now()),this.saveCanvasCopy());}}renderLayer(e,t,i,o){i.isHidden(this.transform.zoom)||(\"background\"===i.type||\"sky\"===i.type||\"custom\"===i.type||o&&o.length)&&(this.id=i.id,this.gpuTimingStart(i),(!e.transform.projection.unsupportedLayers||!e.transform.projection.unsupportedLayers.includes(i.type)||e.terrain&&\"custom\"===i.type)&&ko[i.type](e,t,i,o,this.style.placement.variableOffsets,this.options.isInitialLoad),this.gpuTimingEnd());}gpuTimingStart(e){if(!this.options.gpuTiming)return;const t=this.context.extTimerQuery;let i=this.gpuTimers[e.id];i||(i=this.gpuTimers[e.id]={calls:0,cpuTime:0,query:t.createQueryEXT()}),i.calls++,t.beginQueryEXT(t.TIME_ELAPSED_EXT,i.query);}gpuTimingDeferredRenderStart(){if(this.options.gpuTimingDeferredRender){const e=this.context.extTimerQuery,t=e.createQueryEXT();this.deferredRenderGpuTimeQueries.push(t),e.beginQueryEXT(e.TIME_ELAPSED_EXT,t);}}gpuTimingDeferredRenderEnd(){if(!this.options.gpuTimingDeferredRender)return;const e=this.context.extTimerQuery;e.endQueryEXT(e.TIME_ELAPSED_EXT);}gpuTimingEnd(){if(!this.options.gpuTiming)return;const e=this.context.extTimerQuery;e.endQueryEXT(e.TIME_ELAPSED_EXT);}collectGpuTimers(){const e=this.gpuTimers;return this.gpuTimers={},e}collectDeferredRenderGpuQueries(){const e=this.deferredRenderGpuTimeQueries;return this.deferredRenderGpuTimeQueries=[],e}queryGpuTimers(e){const t={};for(const i in e){const o=e[i],r=this.context.extTimerQuery,n=r.getQueryObjectEXT(o.query,r.QUERY_RESULT_EXT)/1e6;r.deleteQueryEXT(o.query),t[i]=n;}return t}queryGpuTimeDeferredRender(e){if(!this.options.gpuTimingDeferredRender)return 0;const t=this.context.extTimerQuery;let i=0;for(const o of e)i+=t.getQueryObjectEXT(o,t.QUERY_RESULT_EXT)/1e6,t.deleteQueryEXT(o);return i}translatePosMatrix(t,i,o,r,n){if(!o[0]&&!o[1])return t;const s=n?\"map\"===r?this.transform.angle:0:\"viewport\"===r?-this.transform.angle:0;if(s){const e=Math.sin(s),t=Math.cos(s);o=[o[0]*t-o[1]*e,o[0]*e+o[1]*t];}const a=[n?o[0]:P(i,o[0],this.transform.zoom),n?o[1]:P(i,o[1],this.transform.zoom),0],l=new Float32Array(16);return e.translate(l,t,a),l}saveTileTexture(e){const t=this._tileTextures[e.size[0]];t?t.push(e):this._tileTextures[e.size[0]]=[e];}getTileTexture(e){const t=this._tileTextures[e];return t&&t.length>0?t.pop():null}isPatternMissing(e){return null===e||void 0!==e&&!this.imageManager.getPattern(e.toString())}terrainRenderModeElevated(){return this.style&&!!this.style.getTerrain()&&!!this.terrain&&!this.terrain.renderingToTexture}currentGlobalDefines(){const e=this.terrain&&this.terrain.renderingToTexture,t=this.terrain&&0===this.terrain.exaggeration(),i=this.style&&this.style.fog,o=[];return this.terrainRenderModeElevated()&&o.push(\"TERRAIN\"),\"globe\"===this.transform.projection.name&&o.push(\"GLOBE\"),t&&o.push(\"ZERO_EXAGGERATION\"),i&&!e&&0!==i.getOpacity(this.transform.pitch)&&o.push(\"FOG\"),e&&o.push(\"RENDER_TO_TEXTURE\"),this._showOverdrawInspector&&o.push(\"OVERDRAW_INSPECTOR\"),o}useProgram(e,t,i){this.cache=this.cache||{};const o=i||[],r=this.currentGlobalDefines().concat(o),n=Pi.cacheKey(ui[e],e,r,t);return this.cache[n]||(this.cache[n]=new Pi(this.context,e,ui[e],t,lo[e],r)),this.cache[n]}setCustomLayerDefaults(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.frontFace.setDefault(),this.context.cullFaceSide.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault();}setBaseState(){const e=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(e.FUNC_ADD);}initDebugOverlayCanvas(){null==this.debugOverlayCanvas&&(this.debugOverlayCanvas=e.window.document.createElement(\"canvas\"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512,this.debugOverlayTexture=new e.Texture(this.context,this.debugOverlayCanvas,this.context.gl.RGBA));}destroy(){this._terrain&&this._terrain.destroy(),this.globeSharedBuffers&&this.globeSharedBuffers.destroy(),this.emptyTexture.destroy(),this.debugOverlayTexture&&this.debugOverlayTexture.destroy(),this.atmosphereBuffer&&this.atmosphereBuffer.destroy();}prepareDrawTile(){this.terrain&&this.terrain.prepareDrawTile();}prepareDrawProgram(t,i,o){if(this.terrain&&this.terrain.renderingToTexture)return;const r=this.style.fog;if(r){const n=r.getOpacity(this.transform.pitch),s=((t,i,o,r,n,s,a,l,c,h,u)=>{const _=t.transform,d=i.properties.get(\"color\").toArray01();d[3]=r;const p=t.frameCounter/1e3%1;return {u_fog_matrix:o?_.calculateFogTileMatrix(o):t.identityMat,u_fog_range:i.getFovAdjustedRange(_._fov),u_fog_color:d,u_fog_horizon_blend:i.properties.get(\"horizon-blend\"),u_fog_temporal_offset:p,u_frustum_tl:n,u_frustum_tr:s,u_frustum_br:a,u_frustum_bl:l,u_globe_pos:c,u_globe_radius:h,u_viewport:u,u_globe_transition:e.globeToMercatorTransition(_.zoom),u_is_globe:+(\"globe\"===_.projection.name)}})(this,r,o,n,this.transform.frustumCorners.TL,this.transform.frustumCorners.TR,this.transform.frustumCorners.BR,this.transform.frustumCorners.BL,this.transform.globeCenterInViewSpace,this.transform.globeRadius,[this.transform.width*e.exported.devicePixelRatio,this.transform.height*e.exported.devicePixelRatio]);i.setFogUniformValues(t,s);}}setTileLoadedFlag(e){this.tileLoaded=e;}saveCanvasCopy(){const e=this.canvasCopy();e&&(this.frameCopies.push(e),this.tileLoaded=!1);}canvasCopy(){const e=this.context.gl,t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.copyTexImage2D(e.TEXTURE_2D,0,e.RGBA,0,0,e.drawingBufferWidth,e.drawingBufferHeight,0),t}getCanvasCopiesAndTimestamps(){return {canvasCopies:this.frameCopies,timeStamps:this.loadTimeStamps}}averageElevationNeedsEasing(){if(!this.transform._elevation)return !1;const e=this.style&&this.style.fog;return !!e&&0!==e.getOpacity(this.transform.pitch)}getBackgroundTiles(){const t=this._backgroundTiles,i=this._backgroundTiles={},o=this.transform.coveringTiles({tileSize:512});for(const r of o)i[r.key]=t[r.key]||new e.Tile(r,512,this.transform.tileZoom,this);return i}clearBackgroundTiles(){this._backgroundTiles={};}}class Uo{constructor(e=0,t=0,i=0,o=0){if(isNaN(e)||e<0||isNaN(t)||t<0||isNaN(i)||i<0||isNaN(o)||o<0)throw new Error(\"Invalid value for edge-insets, top, bottom, left and right must all be numbers\");this.top=e,this.bottom=t,this.left=i,this.right=o;}interpolate(t,i,o){return null!=i.top&&null!=t.top&&(this.top=e.number(t.top,i.top,o)),null!=i.bottom&&null!=t.bottom&&(this.bottom=e.number(t.bottom,i.bottom,o)),null!=i.left&&null!=t.left&&(this.left=e.number(t.left,i.left,o)),null!=i.right&&null!=t.right&&(this.right=e.number(t.right,i.right,o)),this}getCenter(t,i){const o=e.clamp((this.left+t-this.right)/2,0,t),r=e.clamp((this.top+i-this.bottom)/2,0,i);return new e.pointGeometry(o,r)}equals(e){return this.top===e.top&&this.bottom===e.bottom&&this.left===e.left&&this.right===e.right}clone(){return new Uo(this.top,this.bottom,this.left,this.right)}toJSON(){return {top:this.top,bottom:this.bottom,left:this.left,right:this.right}}}function No(t,i){const o=e.getColumn(t,3);e.fromQuat(t,i),e.setColumn(t,3,o);}function Go(t,i){const o=e.identity$1([]);return e.rotateZ$1(o,o,-i),e.rotateX$1(o,o,-t),o}function jo(t,i){const o=[t[0],t[1],0],r=[i[0],i[1],0];if(e.length(o)>=1e-15){const t=e.normalize([],o);e.scale$2(r,t,e.dot(r,t)),i[0]=r[0],i[1]=r[1];}const n=e.cross([],i,t);if(e.len(n)<1e-15)return null;const s=Math.atan2(-n[1],n[0]);return Go(Math.atan2(Math.sqrt(t[0]*t[0]+t[1]*t[1]),-t[2]),s)}class Zo{constructor(e,t){this.position=e,this.orientation=t;}get position(){return this._position}set position(t){if(t){const i=t instanceof e.MercatorCoordinate?t:new e.MercatorCoordinate(t[0],t[1],t[2]);this._renderWorldCopies&&(i.x=e.wrap(i.x,0,1)),this._position=i;}else this._position=null;}lookAtPoint(t,i){if(this.orientation=null,!this.position)return;const o=this._elevation?this._elevation.getAtPointOrZero(e.MercatorCoordinate.fromLngLat(t)):0,r=this.position,n=e.MercatorCoordinate.fromLngLat(t,o),s=[n.x-r.x,n.y-r.y,n.z-r.z];i||(i=[0,0,1]),i[2]=Math.abs(i[2]),this.orientation=jo(s,i);}setPitchBearing(t,i){this.orientation=Go(e.degToRad(t),e.degToRad(-i));}}class Vo{constructor(t,i){this._transform=e.identity([]),this.orientation=i,this.position=t;}get mercatorPosition(){const t=this.position;return new e.MercatorCoordinate(t[0],t[1],t[2])}get position(){const t=e.getColumn(this._transform,3);return [t[0],t[1],t[2]]}set position(t){var i;t&&e.setColumn(this._transform,3,[(i=t)[0],i[1],i[2],1]);}get orientation(){return this._orientation}set orientation(t){this._orientation=t||e.identity$1([]),t&&No(this._transform,this._orientation);}getPitchBearing(){const e=this.forward(),t=this.right();return {bearing:Math.atan2(-t[1],t[0]),pitch:Math.atan2(Math.sqrt(e[0]*e[0]+e[1]*e[1]),-e[2])}}setPitchBearing(e,t){this._orientation=Go(e,t),No(this._transform,this._orientation);}forward(){const t=e.getColumn(this._transform,2);return [-t[0],-t[1],-t[2]]}up(){const t=e.getColumn(this._transform,1);return [-t[0],-t[1],-t[2]]}right(){const t=e.getColumn(this._transform,0);return [t[0],t[1],t[2]]}getCameraToWorld(t,i){const o=new Float64Array(16);return e.invert(o,this.getWorldToCamera(t,i)),o}getWorldToCameraPosition(t,i,o){const r=this.position;e.scale$2(r,r,-t);const n=new Float64Array(16);return e.fromScaling(n,[o,o,o]),e.translate(n,n,r),n[10]*=i,n}getWorldToCamera(t,i){const o=new Float64Array(16),r=new Float64Array(4),n=this.position;return e.conjugate(r,this._orientation),e.scale$2(n,n,-t),e.fromQuat(o,r),e.translate(o,o,n),o[1]*=-1,o[5]*=-1,o[9]*=-1,o[13]*=-1,o[8]*=i,o[9]*=i,o[10]*=i,o[11]*=i,o}getCameraToClipPerspective(t,i,o,r){const n=new Float64Array(16);return e.perspective(n,t,i,o,r),n}getDistanceToElevation(t,i=!1){const o=0===t?0:e.mercatorZfromAltitude(t,i?e.latFromMercatorY(this.position[1]):this.position[1]),r=this.forward();return (o-this.position[2])/r[2]}clone(){return new Vo([...this.position],[...this.orientation])}}function Wo(t,i){const o=qo(t.projection,t.zoom,t.width,t.height),r=function(t,i,o,r,n){const s=new e.LngLat(o.lng-180*$o,o.lat),a=new e.LngLat(o.lng+180*$o,o.lat),l=t.project(s.lng,s.lat),c=t.project(a.lng,a.lat),h=-Math.atan2(c.y-l.y,c.x-l.x),u=e.MercatorCoordinate.fromLngLat(o);u.y=e.clamp(u.y,-.999975,.999975);const _=u.toLngLat(),d=t.project(_.lng,_.lat),p=e.MercatorCoordinate.fromLngLat(_);p.x+=$o;const m=p.toLngLat(),f=t.project(m.lng,m.lat),g=Yo(f.x-d.x,f.y-d.y,h),v=e.MercatorCoordinate.fromLngLat(_);v.y+=$o;const x=v.toLngLat(),y=t.project(x.lng,x.lat),b=Yo(y.x-d.x,y.y-d.y,h),w=Math.abs(g.x)/Math.abs(b.y),T=e.identity([]);e.rotateZ(T,T,-h*(1-(n?0:r)));const E=e.identity([]);return e.scale(E,E,[1,1-(1-w)*r,1]),E[4]=-b.x/b.y*r,e.rotateZ(E,E,h),e.multiply(E,T,E),E}(t.projection,0,t.center,o,i),n=Xo(t);return e.scale(r,r,[n,n,1]),r}function Xo(t){const i=t.projection,o=qo(t.projection,t.zoom,t.width,t.height),r=Ho(i,t.center),n=Ho(i,e.LngLat.convert(i.center));return Math.pow(2,r*o+(1-o)*n)}function qo(t,i,o,r,n=1/0){const s=t.range;if(!s)return 0;const a=Math.min(n,Math.max(o,r)),l=Math.log(a/1024)/Math.LN2;return e.smoothstep(s[0]+l,s[1]+l,i)}const $o=1/4e4;function Ho(t,i){const o=e.clamp(i.lat,-e.MAX_MERCATOR_LATITUDE,e.MAX_MERCATOR_LATITUDE),r=new e.LngLat(i.lng-180*$o,o),n=new e.LngLat(i.lng+180*$o,o),s=t.project(r.lng,o),a=t.project(n.lng,o),l=e.MercatorCoordinate.fromLngLat(r),c=e.MercatorCoordinate.fromLngLat(n),h=a.x-s.x,u=a.y-s.y,_=c.x-l.x,d=c.y-l.y,p=Math.sqrt((_*_+d*d)/(h*h+u*u));return Math.log(p)/Math.LN2}function Yo(e,t,i){const o=Math.cos(i),r=Math.sin(i);return {x:e*o-t*r,y:e*r+t*o}}class Ko{constructor(t,i,o,r,n,s,a){this.tileSize=512,this._renderWorldCopies=void 0===n||n,this._minZoom=t||0,this._maxZoom=i||22,this._minPitch=null==o?0:o,this._maxPitch=null==r?60:r,this.setProjection(s),this.setMaxBounds(a),this.width=0,this.height=0,this._center=new e.LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._nearZ=0,this._farZ=0,this._unmodified=!0,this._edgeInsets=new Uo,this._projMatrixCache={},this._alignedProjMatrixCache={},this._fogTileMatrixCache={},this._distanceTileDataCache={},this._camera=new Vo,this._centerAltitude=0,this._averageElevation=0,this.cameraElevationReference=\"ground\",this._pixelsPerMercatorPixel=1,this.globeRadius=0,this.globeCenterInViewSpace=[0,0,0],this._horizonShift=.1;}clone(){const e=new Ko(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies,this.getProjection());return e._elevation=this._elevation,e._centerAltitude=this._centerAltitude,e._centerAltitudeValidForExaggeration=this._centerAltitudeValidForExaggeration,e.tileSize=this.tileSize,e.mercatorFromTransition=this.mercatorFromTransition,e.width=this.width,e.height=this.height,e.cameraElevationReference=this.cameraElevationReference,e._center=this._center,e._setZoom(this.zoom),e._seaLevelZoom=this._seaLevelZoom,e.angle=this.angle,e._fov=this._fov,e._pitch=this._pitch,e._nearZ=this._nearZ,e._farZ=this._farZ,e._averageElevation=this._averageElevation,e._unmodified=this._unmodified,e._edgeInsets=this._edgeInsets.clone(),e._camera=this._camera.clone(),e._calcMatrices(),e.freezeTileCoverage=this.freezeTileCoverage,e.frustumCorners=this.frustumCorners,e}get elevation(){return this._elevation}set elevation(e){this._elevation!==e&&(this._elevation=e,this._updateCameraOnTerrain(),this._calcMatrices());}updateElevation(e,t=!1){const i=this._elevation&&this._elevation.exaggeration()!==this._centerAltitudeValidForExaggeration;(null==this._seaLevelZoom||i)&&this._updateCameraOnTerrain(),(e||i)&&this._constrainCamera(t),this._calcMatrices();}getProjection(){return e.pick(this.projection,[\"name\",\"center\",\"parallels\"])}setProjection(i){this.projectionOptions=i||{name:\"mercator\"};const o=this.projection?this.getProjection():void 0;this.projection=e.getProjection(this.projectionOptions);const r=!t(o,this.getProjection());return r&&this._calcMatrices(),this.mercatorFromTransition=!1,r}setMercatorFromTransition(){const t=this.projection.name;this.mercatorFromTransition=!0,this.projectionOptions={name:\"mercator\"},this.projection=e.getProjection({name:\"mercator\"});const i=t!==this.projection.name;return i&&this._calcMatrices(),i}get minZoom(){return this._minZoom}set minZoom(e){this._minZoom!==e&&(this._minZoom=e,this.zoom=Math.max(this.zoom,e));}get maxZoom(){return this._maxZoom}set maxZoom(e){this._maxZoom!==e&&(this._maxZoom=e,this.zoom=Math.min(this.zoom,e));}get minPitch(){return this._minPitch}set minPitch(e){this._minPitch!==e&&(this._minPitch=e,this.pitch=Math.max(this.pitch,e));}get maxPitch(){return this._maxPitch}set maxPitch(e){this._maxPitch!==e&&(this._maxPitch=e,this.pitch=Math.min(this.pitch,e));}get renderWorldCopies(){return this._renderWorldCopies&&!0===this.projection.supportsWorldCopies}set renderWorldCopies(e){void 0===e?e=!0:null===e&&(e=!1),this._renderWorldCopies=e;}get worldSize(){return this.tileSize*this.scale}get cameraWorldSizeForFog(){const e=Math.max(this._camera.getDistanceToElevation(this._averageElevation),Number.EPSILON);return this._worldSizeFromZoom(this._zoomFromMercatorZ(e))}get cameraWorldSize(){const e=Math.max(this._camera.getDistanceToElevation(this._averageElevation,!0),Number.EPSILON);return this._worldSizeFromZoom(this._zoomFromMercatorZ(e))}get pixelsPerMeter(){return this.projection.pixelsPerMeter(this.center.lat,this.worldSize)}get cameraPixelsPerMeter(){return e.mercatorZfromAltitude(this.center.lat,this.cameraWorldSizeForFog)}get centerOffset(){return this.centerPoint._sub(this.size._div(2))}get size(){return new e.pointGeometry(this.width,this.height)}get bearing(){return e.wrap(this.rotation,-180,180)}set bearing(e){this.rotation=e;}get rotation(){return -this.angle/Math.PI*180}set rotation(t){const i=-t*Math.PI/180;var o;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=(o=new e.ARRAY_TYPE(4),e.ARRAY_TYPE!=Float32Array&&(o[1]=0,o[2]=0),o[0]=1,o[3]=1,o),function(e,t,i){var o=t[0],r=t[1],n=t[2],s=t[3],a=Math.sin(i),l=Math.cos(i);e[0]=o*l+n*a,e[1]=r*l+s*a,e[2]=o*-a+n*l,e[3]=r*-a+s*l;}(this.rotationMatrix,this.rotationMatrix,this.angle));}get pitch(){return this._pitch/Math.PI*180}set pitch(t){const i=e.clamp(t,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices());}get aspect(){return this.width/this.height}get fovX(){return this._fov}get fovY(){const e=1/Math.tan(.5*this.fovX);return 2*Math.atan(1/this.aspect/e)}set fov(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=e.degToRad(t),this._calcMatrices());}get averageElevation(){return this._averageElevation}set averageElevation(e){this._averageElevation=e,this._calcFogMatrices(),this._distanceTileDataCache={};}get zoom(){return this._zoom}set zoom(e){const t=Math.min(Math.max(e,this.minZoom),this.maxZoom);this._zoom!==t&&(this._unmodified=!1,this._setZoom(t),this._updateSeaLevelZoom(),this._constrain(),this._calcMatrices());}_setZoom(e){this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom;}_updateCameraOnTerrain(){if(!this._elevation||!this._elevation.isDataAvailableAtPoint(this.locationCoordinate(this.center)))return this._centerAltitude=0,this._seaLevelZoom=null,void(this._centerAltitudeValidForExaggeration=void 0);const e=this._elevation;this._centerAltitude=e.getAtPointOrZero(this.locationCoordinate(this.center)),this._centerAltitudeValidForExaggeration=e.exaggeration(),this._updateSeaLevelZoom();}_updateSeaLevelZoom(){void 0!==this._centerAltitudeValidForExaggeration&&(this._seaLevelZoom=this._zoomFromMercatorZ((this.pixelsPerMeter*this._centerAltitude+this.cameraToCenterDistance)/this.worldSize));}sampleAverageElevation(){if(!this._elevation)return 0;const t=this._elevation,i=[[.5,.2],[.3,.5],[.5,.5],[.7,.5],[.5,.8]],o=this.horizonLineFromTop();let r=0,n=0;for(let s=0;s<i.length;s++){const a=new e.pointGeometry(i[s][0]*this.width,o+i[s][1]*(this.height-o)),l=t.pointCoordinate(a);if(!l)continue;const c=1/Math.hypot(l[0]-this._camera.position[0],l[1]-this._camera.position[1]);r+=l[3]*c,n+=c;}return 0===n?NaN:r/n}get center(){return this._center}set center(e){e.lat===this._center.lat&&e.lng===this._center.lng||(this._unmodified=!1,this._center=e,this._terrainEnabled()&&(\"ground\"===this.cameraElevationReference?this._updateCameraOnTerrain():this._updateZoomFromElevation()),this._constrain(),this._calcMatrices());}_updateZoomFromElevation(){if(null==this._seaLevelZoom||!this._elevation)return;const e=this._seaLevelZoom,t=this._elevation.getAtPointOrZero(this.locationCoordinate(this.center)),i=this.pixelsPerMeter/this.worldSize*t,o=this._mercatorZfromZoom(e),r=this._mercatorZfromZoom(this._maxZoom),n=Math.max(o-i,r);this._setZoom(this._zoomFromMercatorZ(n));}get padding(){return this._edgeInsets.toJSON()}set padding(e){this._edgeInsets.equals(e)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,e,1),this._calcMatrices());}computeZoomRelativeTo(t){const i=this.rayIntersectionCoordinate(this.pointRayIntersection(this.centerPoint,t.toAltitude()));let o;o=t.z<this._camera.position[2]?[i.x,i.y,i.z]:[t.x,t.y,t.z];const r=e.length(e.sub([],this._camera.position,o));return e.clamp(this._zoomFromMercatorZ(r),this._minZoom,this._maxZoom)}setFreeCameraOptions(t){if(!this.height)return;if(!t.position&&!t.orientation)return;this._updateCameraState();let i=!1;if(t.orientation&&!e.exactEquals(t.orientation,this._camera.orientation)&&(i=this._setCameraOrientation(t.orientation)),t.position){const o=[t.position.x,t.position.y,t.position.z];e.exactEquals$1(o,this._camera.position)||(this._setCameraPosition(o),i=!0);}i&&(this._updateStateFromCamera(),this.recenterOnTerrain());}getFreeCameraOptions(){this._updateCameraState();const t=this._camera.position,i=new Zo;return i.position=new e.MercatorCoordinate(t[0],t[1],t[2]),i.orientation=this._camera.orientation,i._elevation=this.elevation,i._renderWorldCopies=this.renderWorldCopies,i}_setCameraOrientation(t){if(!e.length$1(t))return !1;e.normalize$1(t,t);const i=e.transformQuat([],[0,0,-1],t),o=e.transformQuat([],[0,-1,0],t);if(o[2]<0)return !1;const r=jo(i,o);return !!r&&(this._camera.orientation=r,!0)}_setCameraPosition(t){const i=this.zoomScale(this.minZoom)*this.tileSize,o=this.zoomScale(this.maxZoom)*this.tileSize,r=this.cameraToCenterDistance;t[2]=e.clamp(t[2],r/o,r/i),this._camera.position=t;}get centerPoint(){return this._edgeInsets.getCenter(this.width,this.height)}get fovAboveCenter(){return this._fov*(.5+this.centerOffset.y/this.height)}isPaddingEqual(e){return this._edgeInsets.equals(e)}interpolatePadding(e,t,i){this._unmodified=!1,this._edgeInsets.interpolate(e,t,i),this._constrain(),this._calcMatrices();}coveringZoomLevel(e){const t=(e.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/e.tileSize));return Math.max(0,t)}getVisibleUnwrappedCoordinates(t){const i=[new e.UnwrappedTileID(0,t)];if(this.renderWorldCopies){const o=this.pointCoordinate(new e.pointGeometry(0,0)),r=this.pointCoordinate(new e.pointGeometry(this.width,0)),n=this.pointCoordinate(new e.pointGeometry(this.width,this.height)),s=this.pointCoordinate(new e.pointGeometry(0,this.height)),a=Math.floor(Math.min(o.x,r.x,n.x,s.x)),l=Math.floor(Math.max(o.x,r.x,n.x,s.x)),c=1;for(let o=a-c;o<=l+c;o++)0!==o&&i.push(new e.UnwrappedTileID(o,t));}return i}coveringTiles(t){let i=this.coveringZoomLevel(t);const o=i,r=this.elevation&&!t.isTerrainDEM,n=\"mercator\"===this.projection.name;if(void 0!==t.minzoom&&i<t.minzoom)return [];void 0!==t.maxzoom&&i>t.maxzoom&&(i=t.maxzoom);const s=this.locationCoordinate(this.center),a=this.center.lat,l=1<<i,c=[l*s.x,l*s.y,0],h=\"globe\"===this.projection.name,u=!h,_=e.Frustum.fromInvProjectionMatrix(this.invProjMatrix,this.worldSize,i,u),d=h?this._camera.mercatorPosition:this.pointCoordinate(this.getCameraPoint()),p=l*e.mercatorZfromAltitude(1,this.center.lat),m=this._camera.position[2]/e.mercatorZfromAltitude(1,this.center.lat),f=[l*d.x,l*d.y,m*(u?1:p)],g=this.cameraToCenterDistance/t.tileSize*(t.roundZoom?1:.502),v=this.pitch<=60&&this._edgeInsets.top<=this._edgeInsets.bottom&&!this._elevation&&!this.projection.isReprojectedInTileSpace?i:0,x=t.isTerrainDEM&&this._elevation?1e4*this._elevation.exaggeration():this._centerAltitude,y=t.isTerrainDEM?-x:this._elevation?this._elevation.getMinElevationBelowMSL():0,b=this.projection.isReprojectedInTileSpace?Xo(this):1,w=t=>{const i=1/4e4,o=new e.MercatorCoordinate(t.x+i,t.y,t.z),r=new e.MercatorCoordinate(t.x,t.y+i,t.z),n=t.toLngLat(),s=o.toLngLat(),a=r.toLngLat(),l=this.locationCoordinate(n),c=this.locationCoordinate(s),h=this.locationCoordinate(a),u=Math.hypot(c.x-l.x,c.y-l.y),_=Math.hypot(h.x-l.x,h.y-l.y);return Math.sqrt(u*_)*b/i},T=t=>{const i=x,o=y;return {aabb:e.tileAABB(this,l,0,0,0,t,o,i,this.projection),zoom:0,x:0,y:0,minZ:o,maxZ:i,wrap:t,fullyVisible:!1}},E=[];let C=[];const M=i,I=t.reparseOverscaled?o:i,S=e=>e*e,D=S((m-this._centerAltitude)*p),L=e=>{if(!this._elevation||!e.tileID||!n)return;const t=this._elevation.getMinMaxForTile(e.tileID),i=e.aabb;t?(i.min[2]=t.min,i.max[2]=t.max,i.center[2]=(i.min[2]+i.max[2])/2):(e.shouldSplit=A(e),e.shouldSplit||(i.min[2]=i.max[2]=i.center[2]=this._centerAltitude));},A=t=>{if(t.zoom<v)return !0;if(t.zoom===M)return !1;if(null!=t.shouldSplit)return t.shouldSplit;const i=t.aabb.distanceX(f),n=t.aabb.distanceY(f);let s=D,l=1;if(h){s=S(t.aabb.distanceZ(f));const i=Math.pow(2,t.zoom),o=e.latFromMercatorY((t.y+1)/i),r=e.latFromMercatorY(t.y/i),n=Math.min(Math.max(a,o),r),c=e.circumferenceAtLatitude(n)/e.circumferenceAtLatitude(a);if(l=n===a?1/Math.max(1,this._mercatorScaleRatio-.3):Math.min(1,c/this._mercatorScaleRatio),this.zoom<=e.GLOBE_ZOOM_THRESHOLD_MIN&&t.zoom===M-1&&c>=.9)return !0}else if(r&&(s=S(t.aabb.distanceZ(f)*p)),this.projection.isReprojectedInTileSpace&&o<=5){const i=Math.pow(2,t.zoom),o=w(new e.MercatorCoordinate((t.x+.5)/i,(t.y+.5)/i));l=o>.85?1:o;}const c=i*i+n*n+s,u=S((1<<M-t.zoom)*g*l*((e,t)=>{if(t*S(.707)<e)return 1;const i=Math.sqrt(t/e);return i/(1.4144271570014144+(Math.pow(1.1,i-1.4144271570014144+1)-1)/(1.1-1)-1)})(Math.max(s,D),c));return c<u};if(this.renderWorldCopies)for(let e=1;e<=3;e++)E.push(T(-e)),E.push(T(e));for(E.push(T(0));E.length>0;){const o=E.pop(),s=o.x,a=o.y;let u=o.fullyVisible;if(!u){const e=o.aabb.intersects(_);if(0===e)continue;u=2===e;}if(o.zoom!==M&&A(o))for(let t=0;t<4;t++){const i=(s<<1)+t%2,c=(a<<1)+(t>>1),_={aabb:n?o.aabb.quadrant(t):e.tileAABB(this,l,o.zoom+1,i,c,o.wrap,o.minZ,o.maxZ,this.projection),zoom:o.zoom+1,x:i,y:c,wrap:o.wrap,fullyVisible:u,tileID:void 0,shouldSplit:void 0,minZ:o.minZ,maxZ:o.maxZ};r&&!h&&(_.tileID=new e.OverscaledTileID(o.zoom+1===M?I:o.zoom+1,o.wrap,o.zoom+1,i,c),L(_)),E.push(_);}else {const r=o.zoom===M?I:o.zoom;if(t.minzoom&&t.minzoom>r)continue;const n=c[0]-(.5+s+(o.wrap<<o.zoom))*(1<<i-o.zoom),l=c[1]-.5-a,h=o.tileID?o.tileID:new e.OverscaledTileID(r,o.wrap,o.zoom,s,a);C.push({tileID:h,distanceSq:n*n+l*l});}}if(this.fogCullDistSq){const i=this.fogCullDistSq,o=this.horizonLineFromTop();C=C.filter((r=>{const n=[0,0,0,1],s=[e.EXTENT,e.EXTENT,0,1],a=this.calculateFogTileMatrix(r.tileID.toUnwrapped());e.transformMat4$1(n,n,a),e.transformMat4$1(s,s,a);const l=e.getAABBPointSquareDist(n,s);if(0===l)return !0;let c=!1;const h=this._elevation;if(h&&l>i&&0!==o){const i=this.calculateProjMatrix(r.tileID.toUnwrapped());let n;t.isTerrainDEM||(n=h.getMinMaxForTile(r.tileID)),n||(n={min:y,max:x});const s=e.furthestTileCorner(this.rotation),a=[s[0]*e.EXTENT,s[1]*e.EXTENT,n.max];e.transformMat4(a,a,i),c=(1-a[1])*this.height*.5<o;}return l<i||c}));}return C.sort(((e,t)=>e.distanceSq-t.distanceSq)).map((e=>e.tileID))}resize(e,t){this.width=e,this.height=t,this.pixelsToGLUnits=[2/e,-2/t],this._constrain(),this._calcMatrices();}get unmodified(){return this._unmodified}zoomScale(e){return Math.pow(2,e)}scaleZoom(e){return Math.log(e)/Math.LN2}project(t){const i=e.clamp(t.lat,-e.MAX_MERCATOR_LATITUDE,e.MAX_MERCATOR_LATITUDE),o=this.projection.project(t.lng,i);return new e.pointGeometry(o.x*this.worldSize,o.y*this.worldSize)}unproject(e){return this.projection.unproject(e.x/this.worldSize,e.y/this.worldSize)}get point(){return this.project(this.center)}get pointMerc(){return this.point._div(this.worldSize)}get pixelsPerMeterRatio(){return this.pixelsPerMeter/e.mercatorZfromAltitude(1,this.center.lat)/this.worldSize}setLocationAtPoint(t,i){let o,r;const n=this.centerPoint;if(\"globe\"===this.projection.name){const e=this.worldSize;o=(i.x-n.x)/e,r=(i.y-n.y)/e;}else {const e=this.pointCoordinate(i),t=this.pointCoordinate(n);o=e.x-t.x,r=e.y-t.y;}const s=this.locationCoordinate(t);this.setLocation(new e.MercatorCoordinate(s.x-o,s.y-r));}setLocation(e){this.center=this.coordinateLocation(e),this.projection.wrap&&(this.center=this.center.wrap());}locationPoint(e){return this.projection.locationPoint(this,e)}locationPoint3D(e){return this.projection.locationPoint(this,e,!0)}pointLocation(e){return this.coordinateLocation(this.pointCoordinate(e))}pointLocation3D(e){return this.coordinateLocation(this.pointCoordinate3D(e))}locationCoordinate(t,i){const o=i?e.mercatorZfromAltitude(i,t.lat):void 0,r=this.projection.project(t.lng,t.lat);return new e.MercatorCoordinate(r.x,r.y,o)}coordinateLocation(e){return this.projection.unproject(e.x,e.y)}pointRayIntersection(t,i){const o=null!=i?i:this._centerAltitude,r=[t.x,t.y,0,1],n=[t.x,t.y,1,1];e.transformMat4$1(r,r,this.pixelMatrixInverse),e.transformMat4$1(n,n,this.pixelMatrixInverse);const s=n[3];e.scale$1(r,r,1/r[3]),e.scale$1(n,n,1/s);const a=r[2],l=n[2];return {p0:r,p1:n,t:a===l?0:(o-a)/(l-a)}}screenPointToMercatorRay(t){const i=[t.x,t.y,0,1],o=[t.x,t.y,1,1];return e.transformMat4$1(i,i,this.pixelMatrixInverse),e.transformMat4$1(o,o,this.pixelMatrixInverse),e.scale$1(i,i,1/i[3]),e.scale$1(o,o,1/o[3]),i[2]=e.mercatorZfromAltitude(i[2],this._center.lat)*this.worldSize,o[2]=e.mercatorZfromAltitude(o[2],this._center.lat)*this.worldSize,e.scale$1(i,i,1/this.worldSize),e.scale$1(o,o,1/this.worldSize),new e.Ray([i[0],i[1],i[2]],e.normalize([],e.sub([],o,i)))}rayIntersectionCoordinate(t){const{p0:i,p1:o,t:r}=t,n=e.mercatorZfromAltitude(i[2],this._center.lat),s=e.mercatorZfromAltitude(o[2],this._center.lat);return new e.MercatorCoordinate(e.number(i[0],o[0],r)/this.worldSize,e.number(i[1],o[1],r)/this.worldSize,e.number(n,s,r))}pointCoordinate(e,t=this._centerAltitude){return this.projection.pointCoordinate(this,e.x,e.y,t)}pointCoordinate3D(t){if(!this.elevation)return this.pointCoordinate(t);let i=this.projection.pointCoordinate3D(this,t.x,t.y);if(i)return new e.MercatorCoordinate(i[0],i[1],i[2]);let o=0,r=this.horizonLineFromTop();if(t.y>r)return this.pointCoordinate(t);const n=.02*r,s=t.clone();for(let t=0;t<10&&r-o>n;t++){s.y=e.number(o,r,.66);const t=this.projection.pointCoordinate3D(this,s.x,s.y);t?(r=s.y,i=t):o=s.y;}return i?new e.MercatorCoordinate(i[0],i[1],i[2]):this.pointCoordinate(t)}isPointAboveHorizon(e){return this.projection.isPointAboveHorizon(this,e)}_coordinatePoint(t,i){const o=i&&this.elevation?this.elevation.getAtPointOrZero(t,this._centerAltitude):this._centerAltitude,r=[t.x*this.worldSize,t.y*this.worldSize,o+t.toAltitude(),1];return e.transformMat4$1(r,r,this.pixelMatrix),r[3]>0?new e.pointGeometry(r[0]/r[3],r[1]/r[3]):new e.pointGeometry(Number.MAX_VALUE,Number.MAX_VALUE)}_getBoundsNonRectangular(){const{top:t,left:i}=this._edgeInsets,o=this.height-this._edgeInsets.bottom,r=this.width-this._edgeInsets.right,n=this.pointLocation3D(new e.pointGeometry(i,t)),s=this.pointLocation3D(new e.pointGeometry(r,t)),a=this.pointLocation3D(new e.pointGeometry(r,o)),l=this.pointLocation3D(new e.pointGeometry(i,o));let c=Math.min(n.lng,s.lng,a.lng,l.lng),h=Math.max(n.lng,s.lng,a.lng,l.lng),u=Math.min(n.lat,s.lat,a.lat,l.lat),_=Math.max(n.lat,s.lat,a.lat,l.lat);const d=Math.pow(2,-this.zoom)/16*270,p=\"globe\"===this.projection.name?1:4,m=(t,i,o,r,n)=>{const s=(t+o)/2,a=(i+r)/2,l=new e.pointGeometry(s,a),{lng:f,lat:g}=this.pointLocation3D(l),v=Math.max(0,c-f,u-g,f-h,g-_);c=Math.min(c,f),h=Math.max(h,f),u=Math.min(u,g),_=Math.max(_,g),(n<p||v>d)&&(m(t,i,s,a,n+1),m(s,a,o,r,n+1));};if(m(i,t,r,t,1),m(r,t,r,o,1),m(r,o,i,o,1),m(i,o,i,t,1),\"globe\"===this.projection.name){const[t,i]=e.polesInViewport(this);t?(_=90,h=180,c=-180):i&&(u=-90,h=180,c=-180);}return new e.LngLatBounds(new e.LngLat(c,u),new e.LngLat(h,_))}_getBoundsRectangular(t,i){const{top:o,left:r}=this._edgeInsets,n=this.height-this._edgeInsets.bottom,s=this.width-this._edgeInsets.right,a=new e.pointGeometry(r,o),l=new e.pointGeometry(s,o),c=new e.pointGeometry(s,n),h=new e.pointGeometry(r,n);let u=this.pointCoordinate(a,t),_=this.pointCoordinate(l,t);const d=this.pointCoordinate(c,i),p=this.pointCoordinate(h,i),m=(e,t)=>(t.y-e.y)/(t.x-e.x);return u.y>1&&_.y>=0?u=new e.MercatorCoordinate((1-p.y)/m(p,u)+p.x,1):u.y<0&&_.y<=1&&(u=new e.MercatorCoordinate(-p.y/m(p,u)+p.x,0)),_.y>1&&u.y>=0?_=new e.MercatorCoordinate((1-d.y)/m(d,_)+d.x,1):_.y<0&&u.y<=1&&(_=new e.MercatorCoordinate(-d.y/m(d,_)+d.x,0)),(new e.LngLatBounds).extend(this.coordinateLocation(u)).extend(this.coordinateLocation(_)).extend(this.coordinateLocation(p)).extend(this.coordinateLocation(d))}_getBoundsRectangularTerrain(){const e=this.elevation;if(!e.visibleDemTiles.length||e.isUsingMockSource())return this._getBoundsRectangular(0,0);const t=e.visibleDemTiles.reduce(((e,t)=>{if(t.dem){const i=t.dem.tree;e.min=Math.min(e.min,i.minimums[0]),e.max=Math.max(e.max,i.maximums[0]);}return e}),{min:Number.MAX_VALUE,max:0});return this._getBoundsRectangular(t.min*e.exaggeration(),t.max*e.exaggeration())}getBounds(){return \"mercator\"===this.projection.name||\"equirectangular\"===this.projection.name?this._terrainEnabled()?this._getBoundsRectangularTerrain():this._getBoundsRectangular(0,0):this._getBoundsNonRectangular()}horizonLineFromTop(e=!0){const t=this.height/2/Math.tan(this._fov/2)/Math.tan(Math.max(this._pitch,.1))+this.centerOffset.y,i=this.height/2-t*(1-this._horizonShift);return e?Math.max(0,i):i}getMaxBounds(){return this.maxBounds}setMaxBounds(t){this.maxBounds=t,this.minLat=-e.MAX_MERCATOR_LATITUDE,this.maxLat=e.MAX_MERCATOR_LATITUDE,this.minLng=-180,this.maxLng=180,t&&(this.minLat=t.getSouth(),this.maxLat=t.getNorth(),this.minLng=t.getWest(),this.maxLng=t.getEast(),this.maxLng<this.minLng&&(this.maxLng+=360)),this.worldMinX=e.mercatorXfromLng(this.minLng)*this.tileSize,this.worldMaxX=e.mercatorXfromLng(this.maxLng)*this.tileSize,this.worldMinY=e.mercatorYfromLat(this.maxLat)*this.tileSize,this.worldMaxY=e.mercatorYfromLat(this.minLat)*this.tileSize,this._constrain();}calculatePosMatrix(e,t){return this.projection.createTileMatrix(this,t,e)}calculateDistanceTileData(t){const i=t.key,o=this._distanceTileDataCache;if(o[i])return o[i];const r=t.canonical,n=1/this.height,s=this.cameraWorldSize,a=s/this.zoomScale(r.z),l=(r.x+Math.pow(2,r.z)*t.wrap)*a,c=r.y*a,h=this.point;h.x*=s/this.worldSize,h.y*=s/this.worldSize;const u=this.angle,_=Math.sin(-u),d=-Math.cos(-u);return o[i]={bearing:[_,d],center:[(h.x-l)*n,(h.y-c)*n],scale:a/e.EXTENT*n},o[i]}calculateFogTileMatrix(t){const i=t.key,o=this._fogTileMatrixCache;if(o[i])return o[i];const r=this.projection.createTileMatrix(this,this.cameraWorldSizeForFog,t);return e.multiply(r,this.worldToFogMatrix,r),o[i]=new Float32Array(r),o[i]}calculateProjMatrix(t,i=!1){const o=t.key,r=i?this._alignedProjMatrixCache:this._projMatrixCache;if(r[o])return r[o];const n=this.calculatePosMatrix(t,this.worldSize);return e.multiply(n,this.projection.isReprojectedInTileSpace?this.mercatorMatrix:i?this.alignedProjMatrix:this.projMatrix,n),r[o]=new Float32Array(n),r[o]}calculatePixelsToTileUnitsMatrix(t){const i=t.tileID.key,o=this._pixelsToTileUnitsCache;if(o[i])return o[i];const r=function(t,i){const{scale:o}=t.tileTransform,r=o*e.EXTENT/(t.tileSize*Math.pow(2,i.zoom-t.tileID.overscaledZ+t.tileID.canonical.z));return n=new Float32Array(4),l=(s=i.inverseAdjustmentMatrix)[1],c=s[2],h=s[3],_=(a=[r,r])[1],n[0]=s[0]*(u=a[0]),n[1]=l*u,n[2]=c*_,n[3]=h*_,n;var n,s,a,l,c,h,u,_;}(t,this);return o[i]=r,o[i]}customLayerMatrix(){return this.mercatorMatrix.slice()}globeToMercatorMatrix(){if(\"globe\"===this.projection.name){const t=1/this.worldSize,i=e.fromScaling([],[t,t,t]);return e.multiply(i,i,this.globeMatrix),i}}recenterOnTerrain(){if(!this._elevation||\"globe\"===this.projection.name)return;const t=this._elevation;this._updateCameraState();const i=e.mercatorZfromAltitude(1,this._center.lat)*this.worldSize,o=this._computeCameraPosition(i),r=this._camera.forward(),n=e.mercatorZfromAltitude(1,this._center.lat);o[2]/=n,r[2]/=n,e.normalize(r,r);const s=t.raycast(o,r,t.exaggeration());if(s){const t=e.scaleAndAdd([],o,r,s),i=new e.MercatorCoordinate(t[0],t[1],e.mercatorZfromAltitude(t[2],e.latFromMercatorY(t[1]))),a=(i.z+e.length([i.x-o[0],i.y-o[1],i.z-o[2]*n]))*this._pixelsPerMercatorPixel;this._seaLevelZoom=this._zoomFromMercatorZ(a),this._centerAltitude=i.toAltitude(),this._center=this.coordinateLocation(i),this._updateZoomFromElevation(),this._constrain(),this._calcMatrices();}}_constrainCamera(t=!1){if(!this._elevation)return;const i=this._elevation,o=e.mercatorZfromAltitude(1,this._center.lat)*this.worldSize,r=this._computeCameraPosition(o),n=i.getAtPointOrZero(new e.MercatorCoordinate(...r)),s=this.pixelsPerMeter/this.worldSize*n,a=this._minimumHeightOverTerrain(),l=r[2]-s;if(l<=a)if(l<0||t){const t=this.locationCoordinate(this._center,this._centerAltitude),i=[r[0],r[1],t.z-r[2]],o=e.length(i);i[2]-=(a-l)/this._pixelsPerMercatorPixel;const n=e.length(i);if(0===n)return;e.scale$2(i,i,o/n*this._pixelsPerMercatorPixel),this._camera.position=[r[0],r[1],t.z*this._pixelsPerMercatorPixel-i[2]],this._updateStateFromCamera();}else this._isCameraConstrained=!0;}_constrain(){if(!this.center||!this.width||!this.height||this._constraining)return;this._constraining=!0;const t=\"globe\"===this.projection.name||this.mercatorFromTransition;if(this.projection.isReprojectedInTileSpace||t){const i=this.center;return i.lat=e.clamp(i.lat,this.minLat,this.maxLat),(this.maxBounds||!this.renderWorldCopies&&!t)&&(i.lng=e.clamp(i.lng,this.minLng,this.maxLng)),this.center=i,void(this._constraining=!1)}const i=this._unmodified,{x:o,y:r}=this.point;let n=0,s=o,a=r;const l=this.width/2,c=this.height/2,h=this.worldMinY*this.scale,u=this.worldMaxY*this.scale;if(r-c<h&&(a=h+c),r+c>u&&(a=u-c),u-h<this.height&&(n=Math.max(n,this.height/(u-h)),a=(u+h)/2),this.maxBounds||!this._renderWorldCopies||!this.projection.wrap){const e=this.worldMinX*this.scale,t=this.worldMaxX*this.scale,i=this.worldSize/2-(e+t)/2;s=(o+i+this.worldSize)%this.worldSize-i,s-l<e&&(s=e+l),s+l>t&&(s=t-l),t-e<this.width&&(n=Math.max(n,this.width/(t-e)),s=(t+e)/2);}s===o&&a===r||(this.center=this.unproject(new e.pointGeometry(s,a))),n&&(this.zoom+=this.scaleZoom(n)),this._constrainCamera(),this._unmodified=i,this._constraining=!1;}_minZoomForBounds(){let e=Math.max(0,this.scaleZoom(this.height/(this.worldMaxY-this.worldMinY)));return this.maxBounds&&(e=Math.max(e,this.scaleZoom(this.width/(this.worldMaxX-this.worldMinX)))),e}_maxCameraBoundsDistance(){return this._mercatorZfromZoom(this._minZoomForBounds())}_calcMatrices(){if(!this.height)return;const t=this.centerOffset,i=this.pixelsPerMeter;\"globe\"===this.projection.name&&(this._mercatorScaleRatio=e.mercatorZfromAltitude(1,this.center.lat)/e.mercatorZfromAltitude(1,e.GLOBE_SCALE_MATCH_LATITUDE));const o=qo(this.projection,this.zoom,this.width,this.height,1024);this._pixelsPerMercatorPixel=this.projection.pixelSpaceConversion(this.center.lat,this.worldSize,o),this.cameraToCenterDistance=.5/Math.tan(.5*this._fov)*this.height*this._pixelsPerMercatorPixel,this._updateCameraState(),this._farZ=this.projection.farthestPixelDistance(this),this._nearZ=this.height/50;const r=\"meters\"===this.projection.zAxisUnit?i:1,n=this._camera.getWorldToCamera(this.worldSize,r),s=this._camera.getCameraToClipPerspective(this._fov,this.width/this.height,this._nearZ,this._farZ);s[8]=2*-t.x/this.width,s[9]=2*t.y/this.height;let a=e.mul([],s,n);if(this.projection.isReprojectedInTileSpace){const t=this.locationCoordinate(this.center),i=e.identity([]);e.translate(i,i,[t.x*this.worldSize,t.y*this.worldSize,0]),e.multiply(i,i,Wo(this)),e.translate(i,i,[-t.x*this.worldSize,-t.y*this.worldSize,0]),e.multiply(a,a,i),this.inverseAdjustmentMatrix=function(e){const t=Wo(e,!0);return v([],[t[0],t[1],t[4],t[5]])}(this);}else this.inverseAdjustmentMatrix=[1,0,0,1];this.mercatorMatrix=e.scale([],a,[this.worldSize,this.worldSize,this.worldSize/r,1]),this.projMatrix=a,this.invProjMatrix=e.invert(new Float64Array(16),this.projMatrix);const l=e.invert([],s);this.frustumCorners=e.FrustumCorners.fromInvProjectionMatrix(l,this.horizonLineFromTop(),this.height);const c=new Float32Array(16);e.identity(c),e.scale(c,c,[1,-1,1]),e.rotateX(c,c,this._pitch),e.rotateZ(c,c,this.angle);const h=e.perspective(new Float32Array(16),this._fov,this.width/this.height,this._nearZ,this._farZ),u=(Math.PI/2-this._pitch)*(this.height/this._fov)*this._horizonShift;h[8]=2*-t.x/this.width,h[9]=2*(t.y+u)/this.height,this.skyboxMatrix=e.multiply(c,h,c);const _=this.point,d=_.x,p=_.y,m=this.width%2/2,f=this.height%2/2,g=Math.cos(this.angle),x=Math.sin(this.angle),y=d-Math.round(d)+g*m+x*f,b=p-Math.round(p)+g*f+x*m,w=new Float64Array(a);if(e.translate(w,w,[y>.5?y-1:y,b>.5?b-1:b,0]),this.alignedProjMatrix=w,a=e.create(),e.scale(a,a,[this.width/2,-this.height/2,1]),e.translate(a,a,[1,-1,0]),this.labelPlaneMatrix=a,a=e.create(),e.scale(a,a,[1,-1,1]),e.translate(a,a,[-1,-1,0]),e.scale(a,a,[2/this.width,2/this.height,1]),this.glCoordMatrix=a,this.pixelMatrix=e.multiply(new Float64Array(16),this.labelPlaneMatrix,this.projMatrix),this._calcFogMatrices(),this._distanceTileDataCache={},a=e.invert(new Float64Array(16),this.pixelMatrix),!a)throw new Error(\"failed to invert matrix\");if(this.pixelMatrixInverse=a,\"globe\"===this.projection.name||this.mercatorFromTransition){this.globeMatrix=e.calculateGlobeMatrix(this);const t=[this.globeMatrix[12],this.globeMatrix[13],this.globeMatrix[14]];this.globeCenterInViewSpace=e.transformMat4(t,t,n),this.globeRadius=this.worldSize/2/Math.PI-1;}else this.globeMatrix=a;this._projMatrixCache={},this._alignedProjMatrixCache={},this._pixelsToTileUnitsCache={};}_calcFogMatrices(){this._fogTileMatrixCache={};const t=this.cameraWorldSizeForFog,i=this.cameraPixelsPerMeter,o=this._camera.position,r=1/this.height/this._pixelsPerMercatorPixel,n=[t,t,i];e.scale$2(n,n,r),e.scale$2(o,o,-1),e.multiply$2(o,o,n);const s=e.create();e.translate(s,s,o),e.scale(s,s,n),this.mercatorFogMatrix=s,this.worldToFogMatrix=this._camera.getWorldToCameraPosition(t,i,r);}_computeCameraPosition(e){const t=(e=e||this.pixelsPerMeter)/this.pixelsPerMeter,i=this._camera.forward(),o=this.point,r=this._mercatorZfromZoom(this._seaLevelZoom?this._seaLevelZoom:this._zoom)*t-e/this.worldSize*this._centerAltitude;return [o.x/this.worldSize-i[0]*r,o.y/this.worldSize-i[1]*r,e/this.worldSize*this._centerAltitude-i[2]*r]}_updateCameraState(){this.height&&(this._camera.setPitchBearing(this._pitch,this.angle),this._camera.position=this._computeCameraPosition());}_translateCameraConstrained(t){const i=this._maxCameraBoundsDistance()*Math.cos(this._pitch),o=this._camera.position[2],r=t[2];let n=1;this.projection.wrap&&(this.center=this.center.wrap()),r>0&&(n=Math.min((i-o)/r,1)),this._camera.position=e.scaleAndAdd([],this._camera.position,t,n),this._updateStateFromCamera();}_updateStateFromCamera(){const t=this._camera.position,i=this._camera.forward(),{pitch:o,bearing:r}=this._camera.getPitchBearing(),n=e.mercatorZfromAltitude(this._centerAltitude,this.center.lat)*this._pixelsPerMercatorPixel,s=this._mercatorZfromZoom(this._maxZoom)*Math.cos(e.degToRad(this._maxPitch)),a=Math.max((t[2]-n)/Math.cos(o),s),l=this._zoomFromMercatorZ(a);e.scaleAndAdd(t,t,i,a),this._pitch=e.clamp(o,e.degToRad(this.minPitch),e.degToRad(this.maxPitch)),this.angle=e.wrap(r,-Math.PI,Math.PI),this._setZoom(e.clamp(l,this._minZoom,this._maxZoom)),this._updateSeaLevelZoom(),this._center=this.coordinateLocation(new e.MercatorCoordinate(t[0],t[1],t[2])),this._unmodified=!1,this._constrain(),this._calcMatrices();}_worldSizeFromZoom(e){return Math.pow(2,e)*this.tileSize}_mercatorZfromZoom(e){return this.cameraToCenterDistance/this._worldSizeFromZoom(e)}_minimumHeightOverTerrain(){const e=Math.min((null!=this._seaLevelZoom?this._seaLevelZoom:this._zoom)+4,this._maxZoom);return this._mercatorZfromZoom(e)}_zoomFromMercatorZ(e){return this.scaleZoom(this.cameraToCenterDistance/(e*this.tileSize))}zoomFromMercatorZAdjusted(t){let i=0,o=e.GLOBE_ZOOM_THRESHOLD_MAX,r=0,n=1/0;for(;o-i>1e-6&&o>i;){const e=i+.5*(o-i),s=this.tileSize*Math.pow(2,e),a=this.getCameraToCenterDistance(this.projection,e,s),l=this.scaleZoom(a/(t*this.tileSize)),c=Math.abs(e-l);c<n&&(n=c,r=e),e<l?i=e:o=e;}return r}_terrainEnabled(){return !(!this._elevation||!this.projection.supportsTerrain&&(e.warnOnce(\"Terrain is not yet supported with alternate projections. Use mercator or globe to enable terrain.\"),1))}anyCornerOffEdge(t,i){const o=Math.min(t.x,i.x),r=Math.max(t.x,i.x),n=Math.min(t.y,i.y),s=Math.max(t.y,i.y);if(n<this.horizonLineFromTop(!1))return !0;if(\"mercator\"!==this.projection.name)return !1;const a=[new e.pointGeometry(o,n),new e.pointGeometry(r,s),new e.pointGeometry(o,s),new e.pointGeometry(r,n)],l=this.renderWorldCopies?-3:0,c=this.renderWorldCopies?4:1;for(const e of a){const t=this.pointRayIntersection(e);if(t.t<0)return !0;const i=this.rayIntersectionCoordinate(t);if(i.x<l||i.y<0||i.x>c||i.y>1)return !0}return !1}isHorizonVisible(){return this.pitch+e.radToDeg(this.fovAboveCenter)>88||this.anyCornerOffEdge(new e.pointGeometry(0,0),new e.pointGeometry(this.width,this.height))}zoomDeltaToMovement(t,i){const o=e.length(e.sub([],this._camera.position,t)),r=this._zoomFromMercatorZ(o)+i;return o-this._mercatorZfromZoom(r)}getCameraPoint(){if(\"globe\"===this.projection.name){const t=function([t,i,o],r){const n=[t,i,o,1];e.transformMat4$1(n,n,r);const s=n[3]=Math.max(n[3],1e-6);return n[0]/=s,n[1]/=s,n[2]/=s,n}([this.globeMatrix[12],this.globeMatrix[13],this.globeMatrix[14]],this.pixelMatrix);return new e.pointGeometry(t[0],t[1])}{const t=Math.tan(this._pitch)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new e.pointGeometry(0,t))}}getCameraToCenterDistance(e,t=this.zoom,i=this.worldSize){const o=qo(e,t,this.width,this.height,1024),r=e.pixelSpaceConversion(this.center.lat,i,o);return .5/Math.tan(.5*this._fov)*this.height*r}getWorldToCameraMatrix(){const t=this._camera.getWorldToCamera(this.worldSize,\"meters\"===this.projection.zAxisUnit?this.pixelsPerMeter:1);return \"globe\"===this.projection.name&&e.multiply(t,t,this.globeMatrix),t}}function Jo(e,t){let i=!1,o=null;const r=()=>{o=null,i&&(e(),o=setTimeout(r,t),i=!1);};return ()=>(i=!0,o||r(),o)}class Qo{constructor(t){this._hashName=t&&encodeURIComponent(t),e.bindAll([\"_getCurrentHash\",\"_onHashChange\",\"_updateHash\"],this),this._updateHash=Jo(this._updateHashUnthrottled.bind(this),300);}addTo(t){return this._map=t,e.window.addEventListener(\"hashchange\",this._onHashChange,!1),t.on(\"moveend\",this._updateHash),this}remove(){return this._map?(this._map.off(\"moveend\",this._updateHash),e.window.removeEventListener(\"hashchange\",this._onHashChange,!1),clearTimeout(this._updateHash()),this._map=void 0,this):this}getHashString(){const t=this._map;if(!t)return \"\";const i=er(t);if(this._hashName){const t=this._hashName;let o=!1;const r=e.window.location.hash.slice(1).split(\"&\").map((e=>{const r=e.split(\"=\")[0];return r===t?(o=!0,`${r}=${i}`):e})).filter((e=>e));return o||r.push(`${t}=${i}`),`#${r.join(\"&\")}`}return `#${i}`}_getCurrentHash(){const t=e.window.location.hash.replace(\"#\",\"\");if(this._hashName){let e;return t.split(\"&\").map((e=>e.split(\"=\"))).forEach((t=>{t[0]===this._hashName&&(e=t);})),(e&&e[1]||\"\").split(\"/\")}return t.split(\"/\")}_onHashChange(){const e=this._map;if(!e)return !1;const t=this._getCurrentHash();if(t.length>=3&&!t.some((e=>isNaN(e)))){const i=e.dragRotate.isEnabled()&&e.touchZoomRotate.isEnabled()?+(t[3]||0):e.getBearing();return e.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:i,pitch:+(t[4]||0)}),!0}return !1}_updateHashUnthrottled(){const t=e.window.location.href.replace(/(#.+)?$/,this.getHashString());e.window.history.replaceState(e.window.history.state,null,t);}}function er(e,t){const i=e.getCenter(),o=Math.round(100*e.getZoom())/100,r=Math.ceil((o*Math.LN2+Math.log(512/360/.5))/Math.LN10),n=Math.pow(10,r),s=Math.round(i.lng*n)/n,a=Math.round(i.lat*n)/n,l=e.getBearing(),c=e.getPitch();let h=t?`/${s}/${a}/${o}`:`${o}/${a}/${s}`;return (l||c)&&(h+=\"/\"+Math.round(10*l)/10),c&&(h+=`/${Math.round(c)}`),h}const tr={linearity:.3,easing:e.bezier(0,0,.3,1)},ir=e.extend({deceleration:2500,maxSpeed:1400},tr),or=e.extend({deceleration:20,maxSpeed:1400},tr),rr=e.extend({deceleration:1e3,maxSpeed:360},tr),nr=e.extend({deceleration:1e3,maxSpeed:90},tr);class sr{constructor(e){this._map=e,this.clear();}clear(){this._inertiaBuffer=[];}record(t){this._drainInertiaBuffer(),this._inertiaBuffer.push({time:e.exported.now(),settings:t});}_drainInertiaBuffer(){const t=this._inertiaBuffer,i=e.exported.now();for(;t.length>0&&i-t[0].time>160;)t.shift();}_onMoveEnd(t){if(this._drainInertiaBuffer(),this._inertiaBuffer.length<2)return;const i={zoom:0,bearing:0,pitch:0,pan:new e.pointGeometry(0,0),pinchAround:void 0,around:void 0};for(const{settings:e}of this._inertiaBuffer)i.zoom+=e.zoomDelta||0,i.bearing+=e.bearingDelta||0,i.pitch+=e.pitchDelta||0,e.panDelta&&i.pan._add(e.panDelta),e.around&&(i.around=e.around),e.pinchAround&&(i.pinchAround=e.pinchAround);const o=this._inertiaBuffer[this._inertiaBuffer.length-1].time-this._inertiaBuffer[0].time,r={};if(i.pan.mag()){const n=lr(i.pan.mag(),o,e.extend({},ir,t||{}));r.offset=i.pan.mult(n.amount/i.pan.mag()),r.center=this._map.transform.center,ar(r,n);}if(i.zoom){const e=lr(i.zoom,o,or);r.zoom=this._map.transform.zoom+e.amount,ar(r,e);}if(i.bearing){const t=lr(i.bearing,o,rr);r.bearing=this._map.transform.bearing+e.clamp(t.amount,-179,179),ar(r,t);}if(i.pitch){const e=lr(i.pitch,o,nr);r.pitch=this._map.transform.pitch+e.amount,ar(r,e);}if(r.zoom||r.bearing){const e=void 0===i.pinchAround?i.around:i.pinchAround;r.around=e?this._map.unproject(e):this._map.getCenter();}return this.clear(),r.noMoveStart=!0,r}}function ar(e,t){(!e.duration||e.duration<t.duration)&&(e.duration=t.duration,e.easing=t.easing);}function lr(t,i,o){const{maxSpeed:r,linearity:n,deceleration:s}=o,a=e.clamp(t*n/(i/1e3),-r,r),l=Math.abs(a)/(s*n);return {easing:o.easing,duration:1e3*l,amount:a*(l/2)}}class cr extends e.Event{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(t,i,o,r={}){const n=p(i.getCanvasContainer(),o),s=i.unproject(n);super(t,e.extend({point:n,lngLat:s,originalEvent:o},r)),this._defaultPrevented=!1,this.target=i;}}class hr extends e.Event{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(t,i,o){const r=\"touchend\"===t?o.changedTouches:o.touches,n=m(i.getCanvasContainer(),r),s=n.map((e=>i.unproject(e))),a=n.reduce(((e,t,i,o)=>e.add(t.div(o.length))),new e.pointGeometry(0,0));super(t,{points:n,point:a,lngLats:s,lngLat:i.unproject(a),originalEvent:o}),this._defaultPrevented=!1;}}class ur extends e.Event{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(e,t,i){super(e,{originalEvent:i}),this._defaultPrevented=!1;}}class _r{constructor(e,t){this._map=e,this._clickTolerance=t.clickTolerance;}reset(){this._mousedownPos=void 0;}wheel(e){return this._firePreventable(new ur(e.type,this._map,e))}mousedown(e,t){return this._mousedownPos=t,this._firePreventable(new cr(e.type,this._map,e))}mouseup(e){this._map.fire(new cr(e.type,this._map,e));}preclick(t){const i=e.extend({},t);i.type=\"preclick\",this._map.fire(new cr(i.type,this._map,i));}click(e,t){this._mousedownPos&&this._mousedownPos.dist(t)>=this._clickTolerance||(this.preclick(e),this._map.fire(new cr(e.type,this._map,e)));}dblclick(e){return this._firePreventable(new cr(e.type,this._map,e))}mouseover(e){this._map.fire(new cr(e.type,this._map,e));}mouseout(e){this._map.fire(new cr(e.type,this._map,e));}touchstart(e){return this._firePreventable(new hr(e.type,this._map,e))}touchmove(e){this._map.fire(new hr(e.type,this._map,e));}touchend(e){this._map.fire(new hr(e.type,this._map,e));}touchcancel(e){this._map.fire(new hr(e.type,this._map,e));}_firePreventable(e){if(this._map.fire(e),e.defaultPrevented)return {}}isEnabled(){return !0}isActive(){return !1}enable(){}disable(){}}class dr{constructor(e){this._map=e;}reset(){this._delayContextMenu=!1,this._contextMenuEvent=void 0;}mousemove(e){this._map.fire(new cr(e.type,this._map,e));}mousedown(){this._delayContextMenu=!0;}mouseup(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new cr(\"contextmenu\",this._map,this._contextMenuEvent)),delete this._contextMenuEvent);}contextmenu(e){this._delayContextMenu?this._contextMenuEvent=e:this._map.fire(new cr(e.type,this._map,e)),this._map.listens(\"contextmenu\")&&e.preventDefault();}isEnabled(){return !0}isActive(){return !1}enable(){}disable(){}}class pr{constructor(e,t){this._map=e,this._el=e.getCanvasContainer(),this._container=e.getContainer(),this._clickTolerance=t.clickTolerance||1;}isEnabled(){return !!this._enabled}isActive(){return !!this._active}enable(){this.isEnabled()||(this._enabled=!0);}disable(){this.isEnabled()&&(this._enabled=!1);}mousedown(e,t){this.isEnabled()&&e.shiftKey&&0===e.button&&(h(),this._startPos=this._lastPos=t,this._active=!0);}mousemoveWindow(e,t){if(!this._active)return;const i=t,o=this._startPos,r=this._lastPos;if(!o||!r||r.equals(i)||!this._box&&i.dist(o)<this._clickTolerance)return;this._lastPos=i,this._box||(this._box=n(\"div\",\"mapboxgl-boxzoom\",this._container),this._container.classList.add(\"mapboxgl-crosshair\"),this._fireEvent(\"boxzoomstart\",e));const s=Math.min(o.x,i.x),a=Math.max(o.x,i.x),l=Math.min(o.y,i.y),c=Math.max(o.y,i.y);this._map._requestDomTask((()=>{this._box&&(this._box.style.transform=`translate(${s}px,${l}px)`,this._box.style.width=a-s+\"px\",this._box.style.height=c-l+\"px\");}));}mouseupWindow(t,i){if(!this._active)return;const o=this._startPos,r=i;if(o&&0===t.button){if(this.reset(),d(),o.x!==r.x||o.y!==r.y)return this._map.fire(new e.Event(\"boxzoomend\",{originalEvent:t})),{cameraAnimation:e=>e.fitScreenCoordinates(o,r,this._map.getBearing(),{linear:!1})};this._fireEvent(\"boxzoomcancel\",t);}}keydown(e){this._active&&27===e.keyCode&&(this.reset(),this._fireEvent(\"boxzoomcancel\",e));}blur(){this.reset();}reset(){this._active=!1,this._container.classList.remove(\"mapboxgl-crosshair\"),this._box&&(this._box.remove(),this._box=null),u(),delete this._startPos,delete this._lastPos;}_fireEvent(t,i){return this._map.fire(new e.Event(t,{originalEvent:i}))}}function mr(e,t){const i={};for(let o=0;o<e.length;o++)i[e[o].identifier]=t[o];return i}class fr{constructor(e){this.reset(),this.numTouches=e.numTouches;}reset(){this.centroid=void 0,this.startTime=0,this.touches={},this.aborted=!1;}touchstart(t,i,o){(this.centroid||o.length>this.numTouches)&&(this.aborted=!0),this.aborted||(0===this.startTime&&(this.startTime=t.timeStamp),o.length===this.numTouches&&(this.centroid=function(t){const i=new e.pointGeometry(0,0);for(const e of t)i._add(e);return i.div(t.length)}(i),this.touches=mr(o,i)));}touchmove(e,t,i){if(this.aborted||!this.centroid)return;const o=mr(i,t);for(const e in this.touches){const t=this.touches[e],i=o[e];(!i||i.dist(t)>30)&&(this.aborted=!0);}}touchend(e,t,i){if((!this.centroid||e.timeStamp-this.startTime>500)&&(this.aborted=!0),0===i.length){const e=!this.aborted&&this.centroid;if(this.reset(),e)return e}}}class gr{constructor(e){this.singleTap=new fr(e),this.numTaps=e.numTaps,this.reset();}reset(){this.lastTime=1/0,this.lastTap=void 0,this.count=0,this.singleTap.reset();}touchstart(e,t,i){this.singleTap.touchstart(e,t,i);}touchmove(e,t,i){this.singleTap.touchmove(e,t,i);}touchend(e,t,i){const o=this.singleTap.touchend(e,t,i);if(o){const t=e.timeStamp-this.lastTime<500,i=!this.lastTap||this.lastTap.dist(o)<30;if(t&&i||this.reset(),this.count++,this.lastTime=e.timeStamp,this.lastTap=o,this.count===this.numTaps)return this.reset(),o}}}class vr{constructor(){this._zoomIn=new gr({numTouches:1,numTaps:2}),this._zoomOut=new gr({numTouches:2,numTaps:1}),this.reset();}reset(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset();}touchstart(e,t,i){this._zoomIn.touchstart(e,t,i),this._zoomOut.touchstart(e,t,i);}touchmove(e,t,i){this._zoomIn.touchmove(e,t,i),this._zoomOut.touchmove(e,t,i);}touchend(e,t,i){const o=this._zoomIn.touchend(e,t,i),r=this._zoomOut.touchend(e,t,i);return o?(this._active=!0,e.preventDefault(),setTimeout((()=>this.reset()),0),{cameraAnimation:t=>t.easeTo({duration:300,zoom:t.getZoom()+1,around:t.unproject(o)},{originalEvent:e})}):r?(this._active=!0,e.preventDefault(),setTimeout((()=>this.reset()),0),{cameraAnimation:t=>t.easeTo({duration:300,zoom:t.getZoom()-1,around:t.unproject(r)},{originalEvent:e})}):void 0}touchcancel(){this.reset();}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}const xr={0:1,2:2};class yr{constructor(e){this.reset(),this._clickTolerance=e.clickTolerance||1;}blur(){this.reset();}reset(){this._active=!1,this._moved=!1,this._lastPoint=void 0,this._eventButton=void 0;}_correctButton(e,t){return !1}_move(e,t){return {}}mousedown(e,t){if(this._lastPoint)return;const i=f(e);this._correctButton(e,i)&&(this._lastPoint=t,this._eventButton=i);}mousemoveWindow(e,t){const i=this._lastPoint;if(i)if(e.preventDefault(),null!=this._eventButton&&function(e,t){const i=xr[t];return void 0===e.buttons||(e.buttons&i)!==i}(e,this._eventButton))this.reset();else if(this._moved||!(t.dist(i)<this._clickTolerance))return this._moved=!0,this._lastPoint=t,this._move(i,t)}mouseupWindow(e){this._lastPoint&&f(e)===this._eventButton&&(this._moved&&d(),this.reset());}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class br extends yr{mousedown(e,t){super.mousedown(e,t),this._lastPoint&&(this._active=!0);}_correctButton(e,t){return 0===t&&!e.ctrlKey}_move(e,t){return {around:t,panDelta:t.sub(e)}}}class wr extends yr{_correctButton(e,t){return 0===t&&e.ctrlKey||2===t}_move(e,t){const i=.8*(t.x-e.x);if(i)return this._active=!0,{bearingDelta:i}}contextmenu(e){e.preventDefault();}}class Tr extends yr{_correctButton(e,t){return 0===t&&e.ctrlKey||2===t}_move(e,t){const i=-.5*(t.y-e.y);if(i)return this._active=!0,{pitchDelta:i}}contextmenu(e){e.preventDefault();}}class Er{constructor(t,i){this._map=t,this._el=t.getCanvasContainer(),this._minTouches=1,this._clickTolerance=i.clickTolerance||1,this.reset(),e.bindAll([\"_addTouchPanBlocker\",\"_showTouchPanBlockerAlert\"],this);}reset(){this._active=!1,this._touches={},this._sum=new e.pointGeometry(0,0);}touchstart(e,t,i){return this._calculateTransform(e,t,i)}touchmove(t,i,o){if(this._active&&!(o.length<this._minTouches)){if(this._map._cooperativeGestures&&!this._map.isMoving()){if(1===o.length&&!e.isFullscreen())return void this._showTouchPanBlockerAlert();\"hidden\"!==this._alertContainer.style.visibility&&(this._alertContainer.style.visibility=\"hidden\",clearTimeout(this._alertTimer));}return t.cancelable&&t.preventDefault(),this._calculateTransform(t,i,o)}}touchend(e,t,i){this._calculateTransform(e,t,i),this._active&&i.length<this._minTouches&&this.reset();}touchcancel(){this.reset();}_calculateTransform(t,i,o){o.length>0&&(this._active=!0);const r=mr(o,i),n=new e.pointGeometry(0,0),s=new e.pointGeometry(0,0);let a=0;for(const e in r){const t=r[e],i=this._touches[e];i&&(n._add(t),s._add(t.sub(i)),a++,r[e]=t);}if(this._touches=r,a<this._minTouches||!s.mag())return;const l=s.div(a);return this._sum._add(l),this._sum.mag()<this._clickTolerance?void 0:{around:n.div(a),panDelta:l}}enable(){this._enabled=!0,this._map._cooperativeGestures&&(this._addTouchPanBlocker(),this._el.classList.add(\"mapboxgl-touch-pan-blocker-override\",\"mapboxgl-scrollable-page\"));}disable(){this._enabled=!1,this._map._cooperativeGestures&&(clearTimeout(this._alertTimer),this._alertContainer.remove(),this._el.classList.remove(\"mapboxgl-touch-pan-blocker-override\",\"mapboxgl-scrollable-page\")),this.reset();}isEnabled(){return !!this._enabled}isActive(){return !!this._active}_addTouchPanBlocker(){this._map&&!this._alertContainer&&(this._alertContainer=n(\"div\",\"mapboxgl-touch-pan-blocker\",this._map._container),this._alertContainer.textContent=this._map._getUIString(\"TouchPanBlocker.Message\"),this._alertContainer.style.fontSize=`${Math.max(10,Math.min(24,Math.floor(.05*this._el.clientWidth)))}px`);}_showTouchPanBlockerAlert(){this._alertContainer.style.visibility=\"visible\",this._alertContainer.classList.add(\"mapboxgl-touch-pan-blocker-show\"),this._alertContainer.setAttribute(\"role\",\"alert\"),clearTimeout(this._alertTimer),this._alertTimer=setTimeout((()=>{this._alertContainer.classList.remove(\"mapboxgl-touch-pan-blocker-show\"),this._alertContainer.setAttribute(\"role\",\"null\");}),500);}}class Cr{constructor(){this.reset();}reset(){this._active=!1,this._firstTwoTouches=void 0;}_start(e){}_move(e,t,i){return {}}touchstart(e,t,i){this._firstTwoTouches||i.length<2||(this._firstTwoTouches=[i[0].identifier,i[1].identifier],this._start([t[0],t[1]]));}touchmove(e,t,i){const o=this._firstTwoTouches;if(!o)return;e.preventDefault();const[r,n]=o,s=Mr(i,t,r),a=Mr(i,t,n);if(!s||!a)return;const l=this._aroundCenter?null:s.add(a).div(2);return this._move([s,a],l,e)}touchend(e,t,i){if(!this._firstTwoTouches)return;const[o,r]=this._firstTwoTouches,n=Mr(i,t,o),s=Mr(i,t,r);n&&s||(this._active&&d(),this.reset());}touchcancel(){this.reset();}enable(e){this._enabled=!0,this._aroundCenter=!!e&&\"center\"===e.around;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}function Mr(e,t,i){for(let o=0;o<e.length;o++)if(e[o].identifier===i)return t[o]}function Ir(e,t){return Math.log(e/t)/Math.LN2}class Sr extends Cr{reset(){super.reset(),this._distance=0,this._startDistance=0;}_start(e){this._startDistance=this._distance=e[0].dist(e[1]);}_move(e,t){const i=this._distance;if(this._distance=e[0].dist(e[1]),this._active||!(Math.abs(Ir(this._distance,this._startDistance))<.1))return this._active=!0,{zoomDelta:Ir(this._distance,i),pinchAround:t}}}function Dr(e,t){return 180*e.angleWith(t)/Math.PI}class Lr extends Cr{reset(){super.reset(),this._minDiameter=0,this._startVector=void 0,this._vector=void 0;}_start(e){this._startVector=this._vector=e[0].sub(e[1]),this._minDiameter=e[0].dist(e[1]);}_move(e,t){const i=this._vector;if(this._vector=e[0].sub(e[1]),i&&(this._active||!this._isBelowThreshold(this._vector)))return this._active=!0,{bearingDelta:Dr(this._vector,i),pinchAround:t}}_isBelowThreshold(e){this._minDiameter=Math.min(this._minDiameter,e.mag());const t=25/(Math.PI*this._minDiameter)*360,i=this._startVector;if(!i)return !1;const o=Dr(e,i);return Math.abs(o)<t}}function Ar(e){return Math.abs(e.y)>Math.abs(e.x)}class zr extends Cr{constructor(e){super(),this._map=e;}reset(){super.reset(),this._valid=void 0,this._firstMove=void 0,this._lastPoints=void 0;}_start(e){this._lastPoints=e,Ar(e[0].sub(e[1]))&&(this._valid=!1);}_move(t,i,o){const r=this._lastPoints;if(!r)return;const n=t[0].sub(r[0]),s=t[1].sub(r[1]);return this._map._cooperativeGestures&&!e.isFullscreen()&&o.touches.length<3||(this._valid=this.gestureBeginsVertically(n,s,o.timeStamp),!this._valid)?void 0:(this._lastPoints=t,this._active=!0,{pitchDelta:(n.y+s.y)/2*-.5})}gestureBeginsVertically(e,t,i){if(void 0!==this._valid)return this._valid;const o=e.mag()>=2,r=t.mag()>=2;if(!o&&!r)return;if(!o||!r)return null==this._firstMove&&(this._firstMove=i),i-this._firstMove<100&&void 0;const n=e.y>0==t.y>0;return Ar(e)&&Ar(t)&&n}}const Pr={panStep:100,bearingStep:15,pitchStep:10};class Rr{constructor(){const e=Pr;this._panStep=e.panStep,this._bearingStep=e.bearingStep,this._pitchStep=e.pitchStep,this._rotationDisabled=!1;}blur(){this.reset();}reset(){this._active=!1;}keydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=0,i=0,o=0,r=0,n=0;switch(e.keyCode){case 61:case 107:case 171:case 187:t=1;break;case 189:case 109:case 173:t=-1;break;case 37:e.shiftKey?i=-1:(e.preventDefault(),r=-1);break;case 39:e.shiftKey?i=1:(e.preventDefault(),r=1);break;case 38:e.shiftKey?o=1:(e.preventDefault(),n=-1);break;case 40:e.shiftKey?o=-1:(e.preventDefault(),n=1);break;default:return}return this._rotationDisabled&&(i=0,o=0),{cameraAnimation:s=>{const a=s.getZoom();s.easeTo({duration:300,easeId:\"keyboardHandler\",easing:Or,zoom:t?Math.round(a)+t*(e.shiftKey?2:1):a,bearing:s.getBearing()+i*this._bearingStep,pitch:s.getPitch()+o*this._pitchStep,offset:[-r*this._panStep,-n*this._panStep],center:s.getCenter()},{originalEvent:e});}}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}disableRotation(){this._rotationDisabled=!0;}enableRotation(){this._rotationDisabled=!1;}}function Or(e){return e*(2-e)}const Br=4.000244140625;class kr{constructor(t,i){this._map=t,this._el=t.getCanvasContainer(),this._handler=i,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=.0022222222222222222,e.bindAll([\"_onTimeout\",\"_addScrollZoomBlocker\",\"_showBlockerAlert\"],this);}setZoomRate(e){this._defaultZoomRate=e;}setWheelZoomRate(e){this._wheelZoomRate=e;}isEnabled(){return !!this._enabled}isActive(){return this._active||void 0!==this._finishTimeout}isZooming(){return !!this._zooming}enable(e){this.isEnabled()||(this._enabled=!0,this._aroundCenter=!!e&&\"center\"===e.around,this._map._cooperativeGestures&&this._addScrollZoomBlocker());}disable(){this.isEnabled()&&(this._enabled=!1,this._map._cooperativeGestures&&(clearTimeout(this._alertTimer),this._alertContainer.remove()));}wheel(t){if(!this.isEnabled())return;if(this._map._cooperativeGestures){if(!(t.ctrlKey||t.metaKey||this.isZooming()||e.isFullscreen()))return void this._showBlockerAlert();\"hidden\"!==this._alertContainer.style.visibility&&(this._alertContainer.style.visibility=\"hidden\",clearTimeout(this._alertTimer));}let i=t.deltaMode===e.window.WheelEvent.DOM_DELTA_LINE?40*t.deltaY:t.deltaY;const o=e.exported.now(),r=o-(this._lastWheelEventTime||0);this._lastWheelEventTime=o,0!==i&&i%Br==0?this._type=\"wheel\":0!==i&&Math.abs(i)<4?this._type=\"trackpad\":r>400?(this._type=null,this._lastValue=i,this._timeout=setTimeout(this._onTimeout,40,t)):this._type||(this._type=Math.abs(r*i)<200?\"trackpad\":\"wheel\",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,i+=this._lastValue)),t.shiftKey&&i&&(i/=4),this._type&&(this._lastWheelEvent=t,this._delta-=i,this._active||this._start(t)),t.preventDefault();}_onTimeout(e){this._type=\"wheel\",this._delta-=this._lastValue,this._active||this._start(e);}_start(e){if(!this._delta)return;this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);const t=p(this._el,e);this._aroundPoint=this._aroundCenter?this._map.transform.centerPoint:t,this._aroundCoord=this._map.transform.pointCoordinate3D(this._aroundPoint),this._targetZoom=void 0,this._frameId||(this._frameId=!0,this._handler._triggerRenderFrame());}renderFrame(){if(!this._frameId)return;if(this._frameId=null,!this.isActive())return;const t=this._map.transform;\"wheel\"===this._type&&t.projection.wrap&&(t._center.lng>=180||t._center.lng<=-180)&&(this._prevEase=null,this._easing=null,this._lastWheelEvent=null,this._lastWheelEventTime=0);const i=()=>t._terrainEnabled()&&this._aroundCoord?t.computeZoomRelativeTo(this._aroundCoord):t.zoom;if(0!==this._delta){const e=\"wheel\"===this._type&&Math.abs(this._delta)>Br?this._wheelZoomRate:this._defaultZoomRate;let o=2/(1+Math.exp(-Math.abs(this._delta*e)));this._delta<0&&0!==o&&(o=1/o);const r=i(),n=Math.pow(2,r),s=\"number\"==typeof this._targetZoom?t.zoomScale(this._targetZoom):n;this._targetZoom=Math.min(t.maxZoom,Math.max(t.minZoom,t.scaleZoom(s*o))),\"wheel\"===this._type&&(this._startZoom=r,this._easing=this._smoothOutEasing(200)),this._delta=0;}const o=\"number\"==typeof this._targetZoom?this._targetZoom:i(),r=this._startZoom,n=this._easing;let s,a=!1;if(\"wheel\"===this._type&&r&&n){const t=Math.min((e.exported.now()-this._lastWheelEventTime)/200,1),i=n(t);s=e.number(r,o,i),t<1?this._frameId||(this._frameId=!0):a=!0;}else s=o,a=!0;return this._active=!0,a&&(this._active=!1,this._finishTimeout=setTimeout((()=>{this._zooming=!1,this._handler._triggerRenderFrame(),delete this._targetZoom,delete this._finishTimeout;}),200)),{noInertia:!0,needsRenderFrame:!a,zoomDelta:s-i(),around:this._aroundPoint,aroundCoord:this._aroundCoord,originalEvent:this._lastWheelEvent}}_smoothOutEasing(t){let i=e.ease;if(this._prevEase){const t=this._prevEase,o=(e.exported.now()-t.start)/t.duration,r=t.easing(o+.01)-t.easing(o),n=.27/Math.sqrt(r*r+1e-4)*.01,s=Math.sqrt(.0729-n*n);i=e.bezier(n,s,.25,1);}return this._prevEase={start:e.exported.now(),duration:t,easing:i},i}blur(){this.reset();}reset(){this._active=!1;}_addScrollZoomBlocker(){this._map&&!this._alertContainer&&(this._alertContainer=n(\"div\",\"mapboxgl-scroll-zoom-blocker\",this._map._container),this._alertContainer.textContent=/(Mac|iPad)/i.test(e.window.navigator.userAgent)?this._map._getUIString(\"ScrollZoomBlocker.CmdMessage\"):this._map._getUIString(\"ScrollZoomBlocker.CtrlMessage\"),this._alertContainer.style.fontSize=`${Math.max(10,Math.min(24,Math.floor(.05*this._el.clientWidth)))}px`);}_showBlockerAlert(){this._alertContainer.style.visibility=\"visible\",this._alertContainer.classList.add(\"mapboxgl-scroll-zoom-blocker-show\"),this._alertContainer.setAttribute(\"role\",\"alert\"),clearTimeout(this._alertTimer),this._alertTimer=setTimeout((()=>{this._alertContainer.classList.remove(\"mapboxgl-scroll-zoom-blocker-show\"),this._alertContainer.setAttribute(\"role\",\"null\");}),200);}}class Fr{constructor(e,t){this._clickZoom=e,this._tapZoom=t;}enable(){this._clickZoom.enable(),this._tapZoom.enable();}disable(){this._clickZoom.disable(),this._tapZoom.disable();}isEnabled(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()}isActive(){return this._clickZoom.isActive()||this._tapZoom.isActive()}}class Ur{constructor(){this.reset();}reset(){this._active=!1;}blur(){this.reset();}dblclick(e,t){return e.preventDefault(),{cameraAnimation:i=>{i.easeTo({duration:300,zoom:i.getZoom()+(e.shiftKey?-1:1),around:i.unproject(t)},{originalEvent:e});}}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class Nr{constructor(){this._tap=new gr({numTouches:1,numTaps:1}),this.reset();}reset(){this._active=!1,this._swipePoint=void 0,this._swipeTouch=0,this._tapTime=0,this._tap.reset();}touchstart(e,t,i){this._swipePoint||(this._tapTime&&e.timeStamp-this._tapTime>500&&this.reset(),this._tapTime?i.length>0&&(this._swipePoint=t[0],this._swipeTouch=i[0].identifier):this._tap.touchstart(e,t,i));}touchmove(e,t,i){if(this._tapTime){if(this._swipePoint){if(i[0].identifier!==this._swipeTouch)return;const o=t[0],r=o.y-this._swipePoint.y;return this._swipePoint=o,e.preventDefault(),this._active=!0,{zoomDelta:r/128}}}else this._tap.touchmove(e,t,i);}touchend(e,t,i){this._tapTime?this._swipePoint&&0===i.length&&this.reset():this._tap.touchend(e,t,i)&&(this._tapTime=e.timeStamp);}touchcancel(){this.reset();}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class Gr{constructor(e,t,i){this._el=e,this._mousePan=t,this._touchPan=i;}enable(e){this._inertiaOptions=e||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add(\"mapboxgl-touch-drag-pan\");}disable(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove(\"mapboxgl-touch-drag-pan\");}isEnabled(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()}isActive(){return this._mousePan.isActive()||this._touchPan.isActive()}}class jr{constructor(e,t,i){this._pitchWithRotate=e.pitchWithRotate,this._mouseRotate=t,this._mousePitch=i;}enable(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable();}disable(){this._mouseRotate.disable(),this._mousePitch.disable();}isEnabled(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())}isActive(){return this._mouseRotate.isActive()||this._mousePitch.isActive()}}class Zr{constructor(e,t,i,o){this._el=e,this._touchZoom=t,this._touchRotate=i,this._tapDragZoom=o,this._rotationDisabled=!1,this._enabled=!0;}enable(e){this._touchZoom.enable(e),this._rotationDisabled||this._touchRotate.enable(e),this._tapDragZoom.enable(),this._el.classList.add(\"mapboxgl-touch-zoom-rotate\");}disable(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove(\"mapboxgl-touch-zoom-rotate\");}isEnabled(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()}isActive(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()}disableRotation(){this._rotationDisabled=!0,this._touchRotate.disable();}enableRotation(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable();}}const Vr=e=>e.zoom||e.drag||e.pitch||e.rotate;class Wr extends e.Event{}class Xr{constructor(){this.constants=[1,1,.01],this.radius=0;}setup(t,i){const o=e.sub([],i,t);this.radius=e.length(o[2]<0?e.div([],o,this.constants):[o[0],o[1],0]);}projectRay(t){e.div(t,t,this.constants),e.normalize(t,t),e.mul$1(t,t,this.constants);const i=e.scale$2([],t,this.radius);if(i[2]>0){const t=e.scale$2([],[0,0,1],e.dot(i,[0,0,1])),o=e.scale$2([],e.normalize([],[i[0],i[1],0]),this.radius),r=e.add([],i,e.scale$2([],e.sub([],e.add([],o,t),i),2));i[0]=r[0],i[1]=r[1];}return i}}function qr(e){return e.panDelta&&e.panDelta.mag()||e.zoomDelta||e.bearingDelta||e.pitchDelta}class $r{constructor(t,i){this._map=t,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new sr(t),this._bearingSnap=i.bearingSnap,this._previousActiveHandlers={},this._trackingEllipsoid=new Xr,this._dragOrigin=null,this._eventsInProgress={},this._addDefaultHandlers(i),e.bindAll([\"handleEvent\",\"handleWindowEvent\"],this);const o=this._el;this._listeners=[[o,\"touchstart\",{passive:!0}],[o,\"touchmove\",{passive:!1}],[o,\"touchend\",void 0],[o,\"touchcancel\",void 0],[o,\"mousedown\",void 0],[o,\"mousemove\",void 0],[o,\"mouseup\",void 0],[e.window.document,\"mousemove\",{capture:!0}],[e.window.document,\"mouseup\",void 0],[o,\"mouseover\",void 0],[o,\"mouseout\",void 0],[o,\"dblclick\",void 0],[o,\"click\",void 0],[o,\"keydown\",{capture:!1}],[o,\"keyup\",void 0],[o,\"wheel\",{passive:!1}],[o,\"contextmenu\",void 0],[e.window,\"blur\",void 0]];for(const[t,i,o]of this._listeners)t.addEventListener(i,t===e.window.document?this.handleWindowEvent:this.handleEvent,o);}destroy(){for(const[t,i,o]of this._listeners)t.removeEventListener(i,t===e.window.document?this.handleWindowEvent:this.handleEvent,o);}_addDefaultHandlers(e){const t=this._map,i=t.getCanvasContainer();this._add(\"mapEvent\",new _r(t,e));const o=t.boxZoom=new pr(t,e);this._add(\"boxZoom\",o);const r=new vr,n=new Ur;t.doubleClickZoom=new Fr(n,r),this._add(\"tapZoom\",r),this._add(\"clickZoom\",n);const s=new Nr;this._add(\"tapDragZoom\",s);const a=t.touchPitch=new zr(t);this._add(\"touchPitch\",a);const l=new wr(e),c=new Tr(e);t.dragRotate=new jr(e,l,c),this._add(\"mouseRotate\",l,[\"mousePitch\"]),this._add(\"mousePitch\",c,[\"mouseRotate\"]);const h=new br(e),u=new Er(t,e);t.dragPan=new Gr(i,h,u),this._add(\"mousePan\",h),this._add(\"touchPan\",u,[\"touchZoom\",\"touchRotate\"]);const _=new Lr,d=new Sr;t.touchZoomRotate=new Zr(i,d,_,s),this._add(\"touchRotate\",_,[\"touchPan\",\"touchZoom\"]),this._add(\"touchZoom\",d,[\"touchPan\",\"touchRotate\"]),this._add(\"blockableMapEvent\",new dr(t));const p=t.scrollZoom=new kr(t,this);this._add(\"scrollZoom\",p,[\"mousePan\"]);const m=t.keyboard=new Rr;this._add(\"keyboard\",m);for(const i of [\"boxZoom\",\"doubleClickZoom\",\"tapDragZoom\",\"touchPitch\",\"dragRotate\",\"dragPan\",\"touchZoomRotate\",\"scrollZoom\",\"keyboard\"])e.interactive&&e[i]&&t[i].enable(e[i]);}_add(e,t,i){this._handlers.push({handlerName:e,handler:t,allowed:i}),this._handlersById[e]=t;}stop(e){if(!this._updatingCamera){for(const{handler:e}of this._handlers)e.reset();this._inertia.clear(),this._fireEvents({},{},e),this._changes=[];}}isActive(){for(const{handler:e}of this._handlers)if(e.isActive())return !0;return !1}isZooming(){return !!this._eventsInProgress.zoom||this._map.scrollZoom.isZooming()}isRotating(){return !!this._eventsInProgress.rotate}isMoving(){return !!Vr(this._eventsInProgress)||this.isZooming()}_isDragging(){return !!this._eventsInProgress.drag}_blockedByActive(e,t,i){for(const o in e)if(o!==i&&(!t||t.indexOf(o)<0))return !0;return !1}handleWindowEvent(e){this.handleEvent(e,`${e.type}Window`);}_getMapTouches(e){const t=[];for(const i of e)this._el.contains(i.target)&&t.push(i);return t}handleEvent(e,t){this._updatingCamera=!0;const i=\"renderFrame\"===e.type,o=i?void 0:e,r={needsRenderFrame:!1},n={},s={},a=e.touches?this._getMapTouches(e.touches):void 0,l=a?m(this._el,a):i?void 0:p(this._el,e);for(const{handlerName:i,handler:c,allowed:h}of this._handlers){if(!c.isEnabled())continue;let u;this._blockedByActive(s,h,i)?c.reset():c[t||e.type]&&(u=c[t||e.type](e,l,a),this.mergeHandlerResult(r,n,u,i,o),u&&u.needsRenderFrame&&this._triggerRenderFrame()),(u||c.isActive())&&(s[i]=c);}const c={};for(const e in this._previousActiveHandlers)s[e]||(c[e]=o);this._previousActiveHandlers=s,(Object.keys(c).length||qr(r))&&(this._changes.push([r,n,c]),this._triggerRenderFrame()),(Object.keys(s).length||qr(r))&&this._map._stop(!0),this._updatingCamera=!1;const{cameraAnimation:h}=r;h&&(this._inertia.clear(),this._fireEvents({},{},!0),this._changes=[],h(this._map));}mergeHandlerResult(t,i,o,r,n){if(!o)return;e.extend(t,o);const s={handlerName:r,originalEvent:o.originalEvent||n};void 0!==o.zoomDelta&&(i.zoom=s),void 0!==o.panDelta&&(i.drag=s),void 0!==o.pitchDelta&&(i.pitch=s),void 0!==o.bearingDelta&&(i.rotate=s);}_applyChanges(){const t={},i={},o={};for(const[r,n,s]of this._changes)r.panDelta&&(t.panDelta=(t.panDelta||new e.pointGeometry(0,0))._add(r.panDelta)),r.zoomDelta&&(t.zoomDelta=(t.zoomDelta||0)+r.zoomDelta),r.bearingDelta&&(t.bearingDelta=(t.bearingDelta||0)+r.bearingDelta),r.pitchDelta&&(t.pitchDelta=(t.pitchDelta||0)+r.pitchDelta),void 0!==r.around&&(t.around=r.around),void 0!==r.aroundCoord&&(t.aroundCoord=r.aroundCoord),void 0!==r.pinchAround&&(t.pinchAround=r.pinchAround),r.noInertia&&(t.noInertia=r.noInertia),e.extend(i,n),e.extend(o,s);this._updateMapTransform(t,i,o),this._changes=[];}_updateMapTransform(t,i,o){const r=this._map,n=r.transform,s=e=>[e.x,e.y,e.z];if((e=>{const t=this._eventsInProgress.drag;return t&&!this._handlersById[t.handlerName].isActive()})()&&!qr(t)){const e=n.zoom;n.cameraElevationReference=\"sea\",n.recenterOnTerrain(),n.cameraElevationReference=\"ground\",e!==n.zoom&&this._map._update(!0);}if(n._isCameraConstrained&&r._stop(!0),!qr(t))return void this._fireEvents(i,o,!0);let{panDelta:a,zoomDelta:l,bearingDelta:c,pitchDelta:h,around:u,aroundCoord:_,pinchAround:d}=t;n._isCameraConstrained&&(l>0&&(l=0),n._isCameraConstrained=!1),void 0!==d&&(u=d),(l||(e=>i.drag&&!this._eventsInProgress.drag)())&&u&&(this._dragOrigin=s(n.pointCoordinate3D(u)),this._trackingEllipsoid.setup(n._camera.position,this._dragOrigin)),n.cameraElevationReference=\"sea\",r._stop(!0),u=u||r.transform.centerPoint,c&&(n.bearing+=c),h&&(n.pitch+=h),n._updateCameraState();const p=[0,0,0];if(a)if(\"mercator\"===n.projection.name){const e=this._trackingEllipsoid.projectRay(n.screenPointToMercatorRay(u).dir),t=this._trackingEllipsoid.projectRay(n.screenPointToMercatorRay(u.sub(a)).dir);p[0]=t[0]-e[0],p[1]=t[1]-e[1];}else {const t=n.pointCoordinate(u);if(\"globe\"===n.projection.name){a=a.rotate(-n.angle);const i=n._pixelsPerMercatorPixel/n.worldSize;p[0]=-a.x*e.mercatorScale(e.latFromMercatorY(t.y))*i,p[1]=-a.y*e.mercatorScale(n.center.lat)*i;}else {const e=n.pointCoordinate(u.sub(a));t&&e&&(p[0]=e.x-t.x,p[1]=e.y-t.y);}}const m=n.zoom,f=[0,0,0];if(l){const t=s(_||n.pointCoordinate3D(u)),i={dir:e.normalize([],e.sub([],t,n._camera.position))};if(i.dir[2]<0){const o=n.zoomDeltaToMovement(t,l);e.scale$2(f,i.dir,o);}}const g=e.add(p,p,f);n._translateCameraConstrained(g),l&&Math.abs(n.zoom-m)>1e-4&&n.recenterOnTerrain(),n.cameraElevationReference=\"ground\",this._map._update(),t.noInertia||this._inertia.record(t),this._fireEvents(i,o,!0);}_fireEvents(t,i,o){const r=Vr(this._eventsInProgress),n=Vr(t),s={};for(const e in t){const{originalEvent:i}=t[e];this._eventsInProgress[e]||(s[`${e}start`]=i),this._eventsInProgress[e]=t[e];}!r&&n&&this._fireEvent(\"movestart\",n.originalEvent);for(const e in s)this._fireEvent(e,s[e]);n&&this._fireEvent(\"move\",n.originalEvent);for(const e in t){const{originalEvent:i}=t[e];this._fireEvent(e,i);}const a={};let l;for(const e in this._eventsInProgress){const{handlerName:t,originalEvent:o}=this._eventsInProgress[e];this._handlersById[t].isActive()||(delete this._eventsInProgress[e],l=i[t]||o,a[`${e}end`]=l);}for(const e in a)this._fireEvent(e,a[e]);const c=Vr(this._eventsInProgress);if(o&&(r||n)&&!c){this._updatingCamera=!0;const t=this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions),i=e=>0!==e&&-this._bearingSnap<e&&e<this._bearingSnap;t?(i(t.bearing||this._map.getBearing())&&(t.bearing=0),this._map.easeTo(t,{originalEvent:l})):(this._map.fire(new e.Event(\"moveend\",{originalEvent:l})),i(this._map.getBearing())&&this._map.resetNorth()),this._updatingCamera=!1;}}_fireEvent(t,i){this._map.fire(new e.Event(t,i?{originalEvent:i}:{}));}_requestFrame(){return this._map.triggerRepaint(),this._map._renderTaskQueue.add((e=>{this._frameId=void 0,this.handleEvent(new Wr(\"renderFrame\",{timeStamp:e})),this._applyChanges();}))}_triggerRenderFrame(){void 0===this._frameId&&(this._frameId=this._requestFrame());}}const Hr=\"map.setFreeCameraOptions(...) and map.getFreeCameraOptions() are not yet supported for non-mercator projections.\";class Yr extends e.Evented{constructor(t,i){super(),this._moving=!1,this._zooming=!1,this.transform=t,this._bearingSnap=i.bearingSnap,e.bindAll([\"_renderFrameCallback\"],this);}getCenter(){return new e.LngLat(this.transform.center.lng,this.transform.center.lat)}setCenter(e,t){return this.jumpTo({center:e},t)}panBy(t,i,o){return t=e.pointGeometry.convert(t).mult(-1),this.panTo(this.transform.center,e.extend({offset:t},i),o)}panTo(t,i,o){return this.easeTo(e.extend({center:t},i),o)}getZoom(){return this.transform.zoom}setZoom(e,t){return this.jumpTo({zoom:e},t),this}zoomTo(t,i,o){return this.easeTo(e.extend({zoom:t},i),o)}zoomIn(e,t){return this.zoomTo(this.getZoom()+1,e,t),this}zoomOut(e,t){return this.zoomTo(this.getZoom()-1,e,t),this}getBearing(){return this.transform.bearing}setBearing(e,t){return this.jumpTo({bearing:e},t),this}getPadding(){return this.transform.padding}setPadding(e,t){return this.jumpTo({padding:e},t),this}rotateTo(t,i,o){return this.easeTo(e.extend({bearing:t},i),o)}resetNorth(t,i){return this.rotateTo(0,e.extend({duration:1e3},t),i),this}resetNorthPitch(t,i){return this.easeTo(e.extend({bearing:0,pitch:0,duration:1e3},t),i),this}snapToNorth(e,t){return Math.abs(this.getBearing())<this._bearingSnap?this.resetNorth(e,t):this}getPitch(){return this.transform.pitch}setPitch(e,t){return this.jumpTo({pitch:e},t),this}cameraForBounds(t,i){t=e.LngLatBounds.convert(t);const o=i&&i.bearing||0,r=i&&i.pitch||0,n=t.getNorthWest(),s=t.getSouthEast();return this._cameraForBounds(this.transform,n,s,o,r,i)}_extendCameraOptions(t){const i={top:0,bottom:0,right:0,left:0};if(\"number\"==typeof(t=e.extend({padding:i,offset:[0,0],maxZoom:this.transform.maxZoom},t)).padding){const e=t.padding;t.padding={top:e,bottom:e,right:e,left:e};}return t.padding=e.extend(i,t.padding),t}_minimumAABBFrustumDistance(e,t){const i=t.max[0]-t.min[0],o=t.max[1]-t.min[1];return i/o>e.aspect?i/(2*Math.tan(.5*e.fovX)*e.aspect):o/(2*Math.tan(.5*e.fovY)*e.aspect)}_cameraForBoundsOnGlobe(t,i,o,r,n,s){const a=t.clone(),l=this._extendCameraOptions(s);a.bearing=r,a.pitch=n;const c=e.LngLat.convert(i),h=e.LngLat.convert(o),u=.5*(c.lat+h.lat),_=.5*(c.lng+h.lng),d=e.latLngToECEF(u,_),p=e.normalize([],d),m=e.normalize([],e.cross([],p,[0,1,0])),f=e.cross([],m,p),g=[m[0],m[1],m[2],0,f[0],f[1],f[2],0,p[0],p[1],p[2],0,0,0,0,1],v=[d,e.latLngToECEF(c.lat,c.lng),e.latLngToECEF(h.lat,c.lng),e.latLngToECEF(h.lat,h.lng),e.latLngToECEF(c.lat,h.lng),e.latLngToECEF(u,c.lng),e.latLngToECEF(u,h.lng),e.latLngToECEF(c.lat,_),e.latLngToECEF(h.lat,_)];let x=e.Aabb.fromPoints(v.map((t=>[e.dot(m,t),e.dot(f,t),e.dot(p,t)])));const y=e.transformMat4([],x.center,g);0===e.squaredLength(y)&&e.set(y,0,0,1),e.normalize(y,y),e.scale$2(y,y,e.GLOBE_RADIUS),a.center=e.ecefToLatLng(y);const b=a.getWorldToCameraMatrix(),w=e.invert(new Float64Array(16),b);x=e.Aabb.applyTransform(x,e.multiply([],b,g)),e.transformMat4(y,y,b);const T=.5*(x.max[2]-x.min[2]),E=this._minimumAABBFrustumDistance(a,x),C=e.scale$2([],[0,0,1],T),M=e.add(C,y,C),I=E+(0===a.pitch?0:e.distance(y,M)),S=a.globeCenterInViewSpace,D=e.sub([],y,[S[0],S[1],S[2]]);e.normalize(D,D),e.scale$2(D,D,I);const L=e.add([],y,D);e.transformMat4(L,L,w);const A=e.earthRadius/e.GLOBE_RADIUS,z=e.length(L),P=e.mercatorZfromAltitude(Math.max(z*A-e.earthRadius,Number.EPSILON),0),R=Math.min(a.zoomFromMercatorZAdjusted(P),l.maxZoom);return R>.5*(e.GLOBE_ZOOM_THRESHOLD_MIN+e.GLOBE_ZOOM_THRESHOLD_MAX)?(a.setProjection({name:\"mercator\"}),a.zoom=R,this._cameraForBounds(a,i,o,r,n,s)):{center:a.center,zoom:R,bearing:r,pitch:n}}queryTerrainElevation(t,i){const o=this.transform.elevation;return o?(i=e.extend({},{exaggerated:!0},i),o.getAtPoint(e.MercatorCoordinate.fromLngLat(t),null,i.exaggerated)):null}_cameraForBounds(t,i,o,r,n,s){if(\"globe\"===t.projection.name)return this._cameraForBoundsOnGlobe(t,i,o,r,n,s);const a=t.clone(),l=this._extendCameraOptions(s),c=a.padding;a.bearing=r,a.pitch=n;const h=e.LngLat.convert(i),u=e.LngLat.convert(o),_=new e.LngLat(h.lng,u.lat),d=new e.LngLat(u.lng,h.lat),p=a.project(h),m=a.project(u),f=this.queryTerrainElevation(h),g=this.queryTerrainElevation(u),v=this.queryTerrainElevation(_),x=this.queryTerrainElevation(d),y=[[p.x,p.y,Math.min(f||0,g||0,v||0,x||0)],[m.x,m.y,Math.max(f||0,g||0,v||0,x||0)]];let b=e.Aabb.fromPoints(y);const w=a.getWorldToCameraMatrix(),T=e.invert(new Float64Array(16),w);b=e.Aabb.applyTransform(b,w);const E=e.sub([],b.max,b.min),C=c.left||0,M=c.right||0,I=c.bottom||0,S=c.top||0,{left:D,right:L,top:A,bottom:z}=l.padding,P=.5*(C+M),R=.5*(S+I),O=Math.min(a.scaleZoom(a.scale*Math.min((a.width-(C+M+D+L))/E[0],(a.height-(I+S+z+A))/E[1])),l.maxZoom),B=a.scale/a.zoomScale(O);b=new e.Aabb([b.min[0]-(D+P)*B,b.min[1]-(z+R)*B,b.min[2]],[b.max[0]+(L+P)*B,b.max[1]+(A+R)*B,b.max[2]]);const k=.5*E[2],F=this._minimumAABBFrustumDistance(a,b),U=[0,0,1,0];e.transformMat4$1(U,U,w),e.normalize$2(U,U);const N=e.scale$2([],U,F+k),G=e.add([],b.center,N),j=(\"number\"==typeof l.offset.x&&\"number\"==typeof l.offset.y?new e.pointGeometry(l.offset.x,l.offset.y):e.pointGeometry.convert(l.offset)).rotate(-e.degToRad(r));b.center[0]-=j.x*B,b.center[1]+=j.y*B,e.transformMat4(b.center,b.center,T),e.transformMat4(G,G,T);const Z=[b.center[0],b.center[1],G[2]*a.pixelsPerMeter];e.scale$2(Z,Z,1/a.worldSize);const V=e.lngFromMercatorX(Z[0]),W=e.latFromMercatorY(Z[1]),X=Math.min(a._zoomFromMercatorZ(Z[2]),l.maxZoom),q=new e.LngLat(V,W);return a.mercatorFromTransition&&X<.5*(e.GLOBE_ZOOM_THRESHOLD_MIN+e.GLOBE_ZOOM_THRESHOLD_MAX)?(a.setProjection({name:\"globe\"}),a.zoom=X,this._cameraForBounds(a,i,o,r,n,s)):{center:q,zoom:X,bearing:r,pitch:n}}fitBounds(e,t,i){const o=this.cameraForBounds(e,t);return this._fitInternal(o,t,i)}fitScreenCoordinates(t,i,o,r,n){const s=e.pointGeometry.convert(t),a=e.pointGeometry.convert(i),l=new e.pointGeometry(Math.min(s.x,a.x),Math.min(s.y,a.y)),c=new e.pointGeometry(Math.max(s.x,a.x),Math.max(s.y,a.y));if(\"mercator\"===this.transform.projection.name&&this.transform.anyCornerOffEdge(s,a))return this;const h=this.transform.pointLocation3D(l),u=this.transform.pointLocation3D(c),_=this.transform.pointLocation3D(new e.pointGeometry(l.x,c.y)),d=this.transform.pointLocation3D(new e.pointGeometry(c.x,l.y)),p=[Math.min(h.lng,u.lng,_.lng,d.lng),Math.min(h.lat,u.lat,_.lat,d.lat)],m=[Math.max(h.lng,u.lng,_.lng,d.lng),Math.max(h.lat,u.lat,_.lat,d.lat)],f=r&&r.pitch?r.pitch:this.getPitch(),g=this._cameraForBounds(this.transform,p,m,o,f,r);return this._fitInternal(g,r,n)}_fitInternal(t,i,o){return t?(delete(i=e.extend(t,i)).padding,i.linear?this.easeTo(i,o):this.flyTo(i,o)):this}jumpTo(t,i){this.stop();const o=t.preloadOnly?this.transform.clone():this.transform;let r=!1,n=!1,s=!1;return \"zoom\"in t&&o.zoom!==+t.zoom&&(r=!0,o.zoom=+t.zoom),void 0!==t.center&&(o.center=e.LngLat.convert(t.center)),\"bearing\"in t&&o.bearing!==+t.bearing&&(n=!0,o.bearing=+t.bearing),\"pitch\"in t&&o.pitch!==+t.pitch&&(s=!0,o.pitch=+t.pitch),null==t.padding||o.isPaddingEqual(t.padding)||(o.padding=t.padding),t.preloadOnly?(this._preloadTiles(o),this):(this.fire(new e.Event(\"movestart\",i)).fire(new e.Event(\"move\",i)),r&&this.fire(new e.Event(\"zoomstart\",i)).fire(new e.Event(\"zoom\",i)).fire(new e.Event(\"zoomend\",i)),n&&this.fire(new e.Event(\"rotatestart\",i)).fire(new e.Event(\"rotate\",i)).fire(new e.Event(\"rotateend\",i)),s&&this.fire(new e.Event(\"pitchstart\",i)).fire(new e.Event(\"pitch\",i)).fire(new e.Event(\"pitchend\",i)),this.fire(new e.Event(\"moveend\",i)))}getFreeCameraOptions(){return this.transform.projection.supportsFreeCamera||e.warnOnce(Hr),this.transform.getFreeCameraOptions()}setFreeCameraOptions(t,i){const o=this.transform;if(!o.projection.supportsFreeCamera)return e.warnOnce(Hr),this;this.stop();const r=o.zoom,n=o.pitch,s=o.bearing;o.setFreeCameraOptions(t);const a=r!==o.zoom,l=n!==o.pitch,c=s!==o.bearing;return this.fire(new e.Event(\"movestart\",i)).fire(new e.Event(\"move\",i)),a&&this.fire(new e.Event(\"zoomstart\",i)).fire(new e.Event(\"zoom\",i)).fire(new e.Event(\"zoomend\",i)),c&&this.fire(new e.Event(\"rotatestart\",i)).fire(new e.Event(\"rotate\",i)).fire(new e.Event(\"rotateend\",i)),l&&this.fire(new e.Event(\"pitchstart\",i)).fire(new e.Event(\"pitch\",i)).fire(new e.Event(\"pitchend\",i)),this.fire(new e.Event(\"moveend\",i)),this}easeTo(t,i){this._stop(!1,t.easeId),(!1===(t=e.extend({offset:[0,0],duration:500,easing:e.ease},t)).animate||!t.essential&&e.exported.prefersReducedMotion)&&(t.duration=0);const o=this.transform,r=this.getZoom(),n=this.getBearing(),s=this.getPitch(),a=this.getPadding(),l=\"zoom\"in t?+t.zoom:r,c=\"bearing\"in t?this._normalizeBearing(t.bearing,n):n,h=\"pitch\"in t?+t.pitch:s,u=\"padding\"in t?t.padding:o.padding,_=e.pointGeometry.convert(t.offset);let d,p,m;if(\"globe\"===o.projection.name){const i=e.MercatorCoordinate.fromLngLat(o.center),r=_.rotate(-o.angle);i.x+=r.x/o.worldSize,i.y+=r.y/o.worldSize;const n=i.toLngLat(),s=e.LngLat.convert(t.center||n);this._normalizeCenter(s),d=o.centerPoint.add(r),p=new e.pointGeometry(i.x,i.y).mult(o.worldSize),m=new e.pointGeometry(e.mercatorXfromLng(s.lng),e.mercatorYfromLat(s.lat)).mult(o.worldSize).sub(p);}else {d=o.centerPoint.add(_);const i=o.pointLocation(d),r=e.LngLat.convert(t.center||i);this._normalizeCenter(r),p=o.project(i),m=o.project(r).sub(p);}const f=o.zoomScale(l-r);let g,v;t.around&&(g=e.LngLat.convert(t.around),v=o.locationPoint(g));const x=this._zooming||l!==r,y=this._rotating||n!==c,b=this._pitching||h!==s,w=!o.isPaddingEqual(u),T=o=>T=>{if(x&&(o.zoom=e.number(r,l,T)),y&&(o.bearing=e.number(n,c,T)),b&&(o.pitch=e.number(s,h,T)),w&&(o.interpolatePadding(a,u,T),d=o.centerPoint.add(_)),g)o.setLocationAtPoint(g,v);else {const e=o.zoomScale(o.zoom-r),t=l>r?Math.min(2,f):Math.max(.5,f),i=Math.pow(t,1-T),n=o.unproject(p.add(m.mult(T*i)).mult(e));o.setLocationAtPoint(o.renderWorldCopies?n.wrap():n,d);}return t.preloadOnly||this._fireMoveEvents(i),o};if(t.preloadOnly){const e=this._emulate(T,t.duration,o);return this._preloadTiles(e),this}const E={moving:this._moving,zooming:this._zooming,rotating:this._rotating,pitching:this._pitching};return this._zooming=x,this._rotating=y,this._pitching=b,this._padding=w,this._easeId=t.easeId,this._prepareEase(i,t.noMoveStart,E),this._ease(T(o),(e=>{o.recenterOnTerrain(),this._afterEase(i,e);}),t),this}_prepareEase(t,i,o={}){this._moving=!0,this.transform.cameraElevationReference=\"sea\",i||o.moving||this.fire(new e.Event(\"movestart\",t)),this._zooming&&!o.zooming&&this.fire(new e.Event(\"zoomstart\",t)),this._rotating&&!o.rotating&&this.fire(new e.Event(\"rotatestart\",t)),this._pitching&&!o.pitching&&this.fire(new e.Event(\"pitchstart\",t));}_fireMoveEvents(t){this.fire(new e.Event(\"move\",t)),this._zooming&&this.fire(new e.Event(\"zoom\",t)),this._rotating&&this.fire(new e.Event(\"rotate\",t)),this._pitching&&this.fire(new e.Event(\"pitch\",t));}_afterEase(t,i){if(this._easeId&&i&&this._easeId===i)return;this._easeId=void 0,this.transform.cameraElevationReference=\"ground\";const o=this._zooming,r=this._rotating,n=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,o&&this.fire(new e.Event(\"zoomend\",t)),r&&this.fire(new e.Event(\"rotateend\",t)),n&&this.fire(new e.Event(\"pitchend\",t)),this.fire(new e.Event(\"moveend\",t));}flyTo(t,i){if(!t.essential&&e.exported.prefersReducedMotion){const o=e.pick(t,[\"center\",\"zoom\",\"bearing\",\"pitch\",\"around\"]);return this.jumpTo(o,i)}this.stop(),t=e.extend({offset:[0,0],speed:1.2,curve:1.42,easing:e.ease},t);const o=this.transform,r=this.getZoom(),n=this.getBearing(),s=this.getPitch(),a=this.getPadding(),l=\"zoom\"in t?e.clamp(+t.zoom,o.minZoom,o.maxZoom):r,c=\"bearing\"in t?this._normalizeBearing(t.bearing,n):n,h=\"pitch\"in t?+t.pitch:s,u=\"padding\"in t?t.padding:o.padding,_=o.zoomScale(l-r),d=e.pointGeometry.convert(t.offset);let p=o.centerPoint.add(d);const m=o.pointLocation(p),f=e.LngLat.convert(t.center||m);this._normalizeCenter(f);const g=o.project(m),v=o.project(f).sub(g);let x=t.curve;const y=Math.max(o.width,o.height),b=y/_,w=v.mag();if(\"minZoom\"in t){const i=e.clamp(Math.min(t.minZoom,r,l),o.minZoom,o.maxZoom),n=y/o.zoomScale(i-r);x=Math.sqrt(n/w*2);}const T=x*x;function E(e){const t=(b*b-y*y+(e?-1:1)*T*T*w*w)/(2*(e?b:y)*T*w);return Math.log(Math.sqrt(t*t+1)-t)}function C(e){return (Math.exp(e)-Math.exp(-e))/2}function M(e){return (Math.exp(e)+Math.exp(-e))/2}const I=E(0);let S=function(e){return M(I)/M(I+x*e)},D=function(e){return y*((M(I)*(C(t=I+x*e)/M(t))-C(I))/T)/w;var t;},L=(E(1)-I)/x;if(Math.abs(w)<1e-6||!isFinite(L)){if(Math.abs(y-b)<1e-6)return this.easeTo(t,i);const e=b<y?-1:1;L=Math.abs(Math.log(b/y))/x,D=function(){return 0},S=function(t){return Math.exp(e*x*t)};}t.duration=\"duration\"in t?+t.duration:1e3*L/(\"screenSpeed\"in t?+t.screenSpeed/x:+t.speed),t.maxDuration&&t.duration>t.maxDuration&&(t.duration=0);const A=n!==c,z=h!==s,P=!o.isPaddingEqual(u),R=o=>_=>{const m=_*L,x=1/S(m);o.zoom=1===_?l:r+o.scaleZoom(x),A&&(o.bearing=e.number(n,c,_)),z&&(o.pitch=e.number(s,h,_)),P&&(o.interpolatePadding(a,u,_),p=o.centerPoint.add(d));const y=1===_?f:o.unproject(g.add(v.mult(D(m))).mult(x));return o.setLocationAtPoint(o.renderWorldCopies?y.wrap():y,p),o._updateCameraOnTerrain(),t.preloadOnly||this._fireMoveEvents(i),o};if(t.preloadOnly){const e=this._emulate(R,t.duration,o);return this._preloadTiles(e),this}return this._zooming=!0,this._rotating=A,this._pitching=z,this._padding=P,this._prepareEase(i,!1),this._ease(R(o),(()=>this._afterEase(i)),t),this}isEasing(){return !!this._easeFrameId}stop(){return this._stop()}_stop(e,t){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),this._easeFrameId=void 0,this._onEaseFrame=void 0),this._onEaseEnd){const e=this._onEaseEnd;this._onEaseEnd=void 0,e.call(this,t);}if(!e){const e=this.handlers;e&&e.stop(!1);}return this}_ease(t,i,o){!1===o.animate||0===o.duration?(t(1),i()):(this._easeStart=e.exported.now(),this._easeOptions=o,this._onEaseFrame=t,this._onEaseEnd=i,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback));}_renderFrameCallback(){const t=Math.min((e.exported.now()-this._easeStart)/this._easeOptions.duration,1),i=this._onEaseFrame;i&&i(this._easeOptions.easing(t)),t<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop();}_normalizeBearing(t,i){t=e.wrap(t,-180,180);const o=Math.abs(t-i);return Math.abs(t-360-i)<o&&(t-=360),Math.abs(t+360-i)<o&&(t+=360),t}_normalizeCenter(e){const t=this.transform;if(!t.renderWorldCopies||t.maxBounds)return;const i=e.lng-t.center.lng;e.lng+=i>180?-360:i<-180?360:0;}_emulate(e,t,i){const o=Math.ceil(15*t/1e3),r=[],n=e(i.clone());for(let e=0;e<=o;e++){const t=n(e/o);r.push(t.clone());}return r}}class Kr{constructor(t={}){this.options=t,e.bindAll([\"_toggleAttribution\",\"_updateEditLink\",\"_updateData\",\"_updateCompact\"],this);}getDefaultPosition(){return \"bottom-right\"}onAdd(e){const t=this.options&&this.options.compact;return this._map=e,this._container=n(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-attrib\"),this._compactButton=n(\"button\",\"mapboxgl-ctrl-attrib-button\",this._container),n(\"span\",\"mapboxgl-ctrl-icon\",this._compactButton).setAttribute(\"aria-hidden\",\"true\"),this._compactButton.type=\"button\",this._compactButton.addEventListener(\"click\",this._toggleAttribution),this._setElementTitle(this._compactButton,\"ToggleAttribution\"),this._innerContainer=n(\"div\",\"mapboxgl-ctrl-attrib-inner\",this._container),this._innerContainer.setAttribute(\"role\",\"list\"),t&&this._container.classList.add(\"mapboxgl-compact\"),this._updateAttributions(),this._updateEditLink(),this._map.on(\"styledata\",this._updateData),this._map.on(\"sourcedata\",this._updateData),this._map.on(\"moveend\",this._updateEditLink),void 0===t&&(this._map.on(\"resize\",this._updateCompact),this._updateCompact()),this._container}onRemove(){this._container.remove(),this._map.off(\"styledata\",this._updateData),this._map.off(\"sourcedata\",this._updateData),this._map.off(\"moveend\",this._updateEditLink),this._map.off(\"resize\",this._updateCompact),this._map=void 0,this._attribHTML=void 0;}_setElementTitle(e,t){const i=this._map._getUIString(`AttributionControl.${t}`);e.setAttribute(\"aria-label\",i),e.removeAttribute(\"title\"),e.firstElementChild&&e.firstElementChild.setAttribute(\"title\",i);}_toggleAttribution(){this._container.classList.contains(\"mapboxgl-compact-show\")?(this._container.classList.remove(\"mapboxgl-compact-show\"),this._compactButton.setAttribute(\"aria-expanded\",\"false\")):(this._container.classList.add(\"mapboxgl-compact-show\"),this._compactButton.setAttribute(\"aria-expanded\",\"true\"));}_updateEditLink(){let t=this._editLink;t||(t=this._editLink=this._container.querySelector(\".mapbox-improve-map\"));const i=[{key:\"owner\",value:this.styleOwner},{key:\"id\",value:this.styleId},{key:\"access_token\",value:this._map._requestManager._customAccessToken||e.config.ACCESS_TOKEN}];if(t){const o=i.reduce(((e,t,o)=>(t.value&&(e+=`${t.key}=${t.value}${o<i.length-1?\"&\":\"\"}`),e)),\"?\");t.href=`${e.config.FEEDBACK_URL}/${o}#${er(this._map,!0)}`,t.rel=\"noopener nofollow\",this._setElementTitle(t,\"MapFeedback\");}}_updateData(e){!e||\"metadata\"!==e.sourceDataType&&\"visibility\"!==e.sourceDataType&&\"style\"!==e.dataType||(this._updateAttributions(),this._updateEditLink());}_updateAttributions(){if(!this._map.style)return;let e=[];if(this._map.style.stylesheet){const e=this._map.style.stylesheet;this.styleOwner=e.owner,this.styleId=e.id;}const t=this._map.style._sourceCaches;for(const i in t){const o=t[i];if(o.used){const t=o.getSource();t.attribution&&e.indexOf(t.attribution)<0&&e.push(t.attribution);}}e.sort(((e,t)=>e.length-t.length)),e=e.filter(((t,i)=>{for(let o=i+1;o<e.length;o++)if(e[o].indexOf(t)>=0)return !1;return !0})),this.options.customAttribution&&(Array.isArray(this.options.customAttribution)?e=[...this.options.customAttribution,...e]:e.unshift(this.options.customAttribution));const i=e.join(\" | \");i!==this._attribHTML&&(this._attribHTML=i,e.length?(this._innerContainer.innerHTML=i,this._container.classList.remove(\"mapboxgl-attrib-empty\")):this._container.classList.add(\"mapboxgl-attrib-empty\"),this._editLink=null);}_updateCompact(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add(\"mapboxgl-compact\"):this._container.classList.remove(\"mapboxgl-compact\",\"mapboxgl-compact-show\");}}class Jr{constructor(){e.bindAll([\"_updateLogo\",\"_updateCompact\"],this);}onAdd(e){this._map=e,this._container=n(\"div\",\"mapboxgl-ctrl\");const t=n(\"a\",\"mapboxgl-ctrl-logo\");return t.target=\"_blank\",t.rel=\"noopener nofollow\",t.href=\"https://www.mapbox.com/\",t.setAttribute(\"aria-label\",this._map._getUIString(\"LogoControl.Title\")),t.setAttribute(\"rel\",\"noopener nofollow\"),this._container.appendChild(t),this._container.style.display=\"none\",this._map.on(\"sourcedata\",this._updateLogo),this._updateLogo(),this._map.on(\"resize\",this._updateCompact),this._updateCompact(),this._container}onRemove(){this._container.remove(),this._map.off(\"sourcedata\",this._updateLogo),this._map.off(\"resize\",this._updateCompact);}getDefaultPosition(){return \"bottom-left\"}_updateLogo(e){e&&\"metadata\"!==e.sourceDataType||(this._container.style.display=this._logoRequired()?\"block\":\"none\");}_logoRequired(){if(!this._map.style)return !0;const e=this._map.style._sourceCaches;if(0===Object.entries(e).length)return !0;for(const t in e){const i=e[t].getSource();if(i.hasOwnProperty(\"mapbox_logo\")&&!i.mapbox_logo)return !1}return !0}_updateCompact(){const e=this._container.children;if(e.length){const t=e[0];this._map.getCanvasContainer().offsetWidth<250?t.classList.add(\"mapboxgl-compact\"):t.classList.remove(\"mapboxgl-compact\");}}}class Qr{constructor(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1;}add(e){const t=++this._id;return this._queue.push({callback:e,id:t,cancelled:!1}),t}remove(e){const t=this._currentlyRunning,i=t?this._queue.concat(t):this._queue;for(const t of i)if(t.id===e)return void(t.cancelled=!0)}run(e=0){const t=this._currentlyRunning=this._queue;this._queue=[];for(const i of t)if(!i.cancelled&&(i.callback(e),this._cleared))break;this._cleared=!1,this._currentlyRunning=!1;}clear(){this._currentlyRunning&&(this._cleared=!0),this._queue=[];}}function en(t,i,o){if(t=new e.LngLat(t.lng,t.lat),i){const r=new e.LngLat(t.lng-360,t.lat),n=new e.LngLat(t.lng+360,t.lat),s=360*Math.ceil(Math.abs(t.lng-o.center.lng)/360),a=o.locationPoint(t).distSqr(i),l=i.x<0||i.y<0||i.x>o.width||i.y>o.height;o.locationPoint(r).distSqr(i)<a&&(l||Math.abs(r.lng-o.center.lng)<s)?t=r:o.locationPoint(n).distSqr(i)<a&&(l||Math.abs(n.lng-o.center.lng)<s)&&(t=n);}for(;Math.abs(t.lng-o.center.lng)>180;){const e=o.locationPoint(t);if(e.x>=0&&e.y>=0&&e.x<=o.width&&e.y<=o.height)break;t.lng>o.center.lng?t.lng-=360:t.lng+=360;}return t}const tn={center:\"translate(-50%,-50%)\",top:\"translate(-50%,0)\",\"top-left\":\"translate(0,0)\",\"top-right\":\"translate(-100%,0)\",bottom:\"translate(-50%,-100%)\",\"bottom-left\":\"translate(0,-100%)\",\"bottom-right\":\"translate(-100%,-100%)\",left:\"translate(0,-50%)\",right:\"translate(-100%,-50%)\"};class on extends e.Evented{constructor(t,i){if(super(),(t instanceof e.window.HTMLElement||i)&&(t=e.extend({element:t},i)),e.bindAll([\"_update\",\"_onMove\",\"_onUp\",\"_addDragHandler\",\"_onMapClick\",\"_onKeyPress\",\"_clearFadeTimer\"],this),this._anchor=t&&t.anchor||\"center\",this._color=t&&t.color||\"#3FB1CE\",this._scale=t&&t.scale||1,this._draggable=t&&t.draggable||!1,this._clickTolerance=t&&t.clickTolerance||0,this._isDragging=!1,this._state=\"inactive\",this._rotation=t&&t.rotation||0,this._rotationAlignment=t&&t.rotationAlignment||\"auto\",this._pitchAlignment=t&&t.pitchAlignment&&t.pitchAlignment||\"auto\",this._updateMoving=()=>this._update(!0),this._occludedOpacity=t&&t.occludedOpacity||.2,t&&t.element)this._element=t.element,this._offset=e.pointGeometry.convert(t&&t.offset||[0,0]);else {this._defaultMarker=!0,this._element=n(\"div\");const i=41,o=27,r=s(\"svg\",{display:\"block\",height:i*this._scale+\"px\",width:o*this._scale+\"px\",viewBox:`0 0 ${o} ${i}`},this._element),a=s(\"radialGradient\",{id:\"shadowGradient\"},s(\"defs\",{},r));s(\"stop\",{offset:\"10%\",\"stop-opacity\":.4},a),s(\"stop\",{offset:\"100%\",\"stop-opacity\":.05},a),s(\"ellipse\",{cx:13.5,cy:34.8,rx:10.5,ry:5.25,fill:\"url(#shadowGradient)\"},r),s(\"path\",{fill:this._color,d:\"M27,13.5C27,19.07 20.25,27 14.75,34.5C14.02,35.5 12.98,35.5 12.25,34.5C6.75,27 0,19.22 0,13.5C0,6.04 6.04,0 13.5,0C20.96,0 27,6.04 27,13.5Z\"},r),s(\"path\",{opacity:.25,d:\"M13.5,0C6.04,0 0,6.04 0,13.5C0,19.22 6.75,27 12.25,34.5C13,35.52 14.02,35.5 14.75,34.5C20.25,27 27,19.07 27,13.5C27,6.04 20.96,0 13.5,0ZM13.5,1C20.42,1 26,6.58 26,13.5C26,15.9 24.5,19.18 22.22,22.74C19.95,26.3 16.71,30.14 13.94,33.91C13.74,34.18 13.61,34.32 13.5,34.44C13.39,34.32 13.26,34.18 13.06,33.91C10.28,30.13 7.41,26.31 5.02,22.77C2.62,19.23 1,15.95 1,13.5C1,6.58 6.58,1 13.5,1Z\"},r),s(\"circle\",{fill:\"white\",cx:13.5,cy:13.5,r:5.5},r),this._offset=e.pointGeometry.convert(t&&t.offset||[0,-14]);}this._element.hasAttribute(\"aria-label\")||this._element.setAttribute(\"aria-label\",\"Map marker\"),this._element.classList.add(\"mapboxgl-marker\"),this._element.addEventListener(\"dragstart\",(e=>{e.preventDefault();})),this._element.addEventListener(\"mousedown\",(e=>{e.preventDefault();}));const o=this._element.classList;for(const e in tn)o.remove(`mapboxgl-marker-anchor-${e}`);o.add(`mapboxgl-marker-anchor-${this._anchor}`),this._popup=null;}addTo(e){return e===this._map||(this.remove(),this._map=e,e.getCanvasContainer().appendChild(this._element),e.on(\"move\",this._updateMoving),e.on(\"moveend\",this._update),e.on(\"remove\",this._clearFadeTimer),e._addMarker(this),this.setDraggable(this._draggable),this._update(),e.on(\"click\",this._onMapClick)),this}remove(){const e=this._map;return e&&(e.off(\"click\",this._onMapClick),e.off(\"move\",this._updateMoving),e.off(\"moveend\",this._update),e.off(\"mousedown\",this._addDragHandler),e.off(\"touchstart\",this._addDragHandler),e.off(\"mouseup\",this._onUp),e.off(\"touchend\",this._onUp),e.off(\"mousemove\",this._onMove),e.off(\"touchmove\",this._onMove),e.off(\"remove\",this._clearFadeTimer),e._removeMarker(this),this._map=void 0),this._clearFadeTimer(),this._element.remove(),this._popup&&this._popup.remove(),this}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.LngLat.convert(t),this._pos=null,this._popup&&this._popup.setLngLat(this._lngLat),this._update(!0),this}getElement(){return this._element}setPopup(e){if(this._popup&&(this._popup.remove(),this._popup=null,this._element.removeAttribute(\"role\"),this._element.removeEventListener(\"keypress\",this._onKeyPress),this._originalTabIndex||this._element.removeAttribute(\"tabindex\")),e){if(!(\"offset\"in e.options)){const t=38.1,i=13.5,o=Math.sqrt(Math.pow(i,2)/2);e.options.offset=this._defaultMarker?{top:[0,0],\"top-left\":[0,0],\"top-right\":[0,0],bottom:[0,-t],\"bottom-left\":[o,-1*(t-i+o)],\"bottom-right\":[-o,-1*(t-i+o)],left:[i,-1*(t-i)],right:[-i,-1*(t-i)]}:this._offset;}this._popup=e,e._marker=this,this._lngLat&&this._popup.setLngLat(this._lngLat),this._element.setAttribute(\"role\",\"button\"),this._originalTabIndex=this._element.getAttribute(\"tabindex\"),this._originalTabIndex||this._element.setAttribute(\"tabindex\",\"0\"),this._element.addEventListener(\"keypress\",this._onKeyPress),this._element.setAttribute(\"aria-expanded\",\"false\");}return this}_onKeyPress(e){const t=e.code,i=e.charCode||e.keyCode;\"Space\"!==t&&\"Enter\"!==t&&32!==i&&13!==i||this.togglePopup();}_onMapClick(e){const t=e.originalEvent.target,i=this._element;this._popup&&(t===i||i.contains(t))&&this.togglePopup();}getPopup(){return this._popup}togglePopup(){const e=this._popup;return e?(e.isOpen()?(e.remove(),this._element.setAttribute(\"aria-expanded\",\"false\")):this._map&&(e.addTo(this._map),this._element.setAttribute(\"aria-expanded\",\"true\")),this):this}_behindTerrain(){const e=this._map,t=this._pos;if(!e||!t)return !1;const i=e.unproject(t),o=e.getFreeCameraOptions();if(!o.position)return !1;const r=o.position.toLngLat();return r.distanceTo(i)<.9*r.distanceTo(this._lngLat)}_evaluateOpacity(){const t=this._map;if(!t)return;const i=this._pos;if(!i||i.x<0||i.x>t.transform.width||i.y<0||i.y>t.transform.height)return void this._clearFadeTimer();const o=t.unproject(i);let r;t._showingGlobe()&&e.isLngLatBehindGlobe(t.transform,this._lngLat)?r=0:(r=1-t._queryFogOpacity(o),t.transform._terrainEnabled()&&t.getTerrain()&&this._behindTerrain()&&(r*=this._occludedOpacity)),this._element.style.opacity=`${r}`,this._element.style.pointerEvents=r>0?\"auto\":\"none\",this._popup&&this._popup._setOpacity(r),this._fadeTimer=null;}_clearFadeTimer(){this._fadeTimer&&(clearTimeout(this._fadeTimer),this._fadeTimer=null);}_updateDOM(){const e=this._pos;if(!e||!this._map)return;const t=this._offset.mult(this._scale);this._element.style.transform=`\\n            translate(${e.x}px,${e.y}px)\\n            ${tn[this._anchor]}\\n            ${this._calculateXYTransform()} ${this._calculateZTransform()}\\n            translate(${t.x}px,${t.y}px)\\n        `;}_calculateXYTransform(){const t=this._pos,i=this._map,o=this.getPitchAlignment();if(!i||!t||\"map\"!==o)return \"\";if(!i._showingGlobe()){const e=i.getPitch();return e?`rotateX(${e}deg)`:\"\"}const r=e.radToDeg(e.globeTiltAtLngLat(i.transform,this._lngLat)),n=t.sub(e.globeCenterToScreenPoint(i.transform)),s=Math.abs(n.x)+Math.abs(n.y);if(0===s)return \"\";const a=r/s;return `rotateX(${-n.y*a}deg) rotateY(${n.x*a}deg)`}_calculateZTransform(){const t=this._pos,i=this._map;if(!i||!t)return \"\";let o=0;const r=this.getRotationAlignment();if(\"map\"===r)if(i._showingGlobe()){const t=i.project(new e.LngLat(this._lngLat.lng,this._lngLat.lat+.001)),r=i.project(new e.LngLat(this._lngLat.lng,this._lngLat.lat-.001)).sub(t);o=e.radToDeg(Math.atan2(r.y,r.x))-90;}else o=-i.getBearing();else if(\"horizon\"===r){const r=e.smoothstep(4,6,i.getZoom()),n=e.globeCenterToScreenPoint(i.transform);n.y+=r*i.transform.height;const s=t.sub(n),a=e.radToDeg(Math.atan2(s.y,s.x));o=(a>90?a-270:a+90)*(1-r);}return o+=this._rotation,o?`rotateZ(${o}deg)`:\"\"}_update(t){e.window.cancelAnimationFrame(this._updateFrameId);const i=this._map;i&&(i.transform.renderWorldCopies&&(this._lngLat=en(this._lngLat,this._pos,i.transform)),this._pos=i.project(this._lngLat),!0===t?this._updateFrameId=e.window.requestAnimationFrame((()=>{this._element&&this._pos&&this._anchor&&(this._pos=this._pos.round(),this._updateDOM());})):this._pos=this._pos.round(),i._requestDomTask((()=>{this._map&&(this._element&&this._pos&&this._anchor&&this._updateDOM(),(i._showingGlobe()||i.getTerrain()||i.getFog())&&!this._fadeTimer&&(this._fadeTimer=setTimeout(this._evaluateOpacity.bind(this),60)));})));}getOffset(){return this._offset}setOffset(t){return this._offset=e.pointGeometry.convert(t),this._update(),this}_onMove(t){const i=this._map;if(!i)return;const o=this._pointerdownPos,r=this._positionDelta;if(o&&r){if(!this._isDragging){const e=this._clickTolerance||i._clickTolerance;if(t.point.dist(o)<e)return;this._isDragging=!0;}this._pos=t.point.sub(r),this._lngLat=i.unproject(this._pos),this.setLngLat(this._lngLat),this._element.style.pointerEvents=\"none\",\"pending\"===this._state&&(this._state=\"active\",this.fire(new e.Event(\"dragstart\"))),this.fire(new e.Event(\"drag\"));}}_onUp(){this._element.style.pointerEvents=\"auto\",this._positionDelta=null,this._pointerdownPos=null,this._isDragging=!1;const t=this._map;t&&(t.off(\"mousemove\",this._onMove),t.off(\"touchmove\",this._onMove)),\"active\"===this._state&&this.fire(new e.Event(\"dragend\")),this._state=\"inactive\";}_addDragHandler(e){const t=this._map,i=this._pos;t&&i&&this._element.contains(e.originalEvent.target)&&(e.preventDefault(),this._positionDelta=e.point.sub(i),this._pointerdownPos=e.point,this._state=\"pending\",t.on(\"mousemove\",this._onMove),t.on(\"touchmove\",this._onMove),t.once(\"mouseup\",this._onUp),t.once(\"touchend\",this._onUp));}setDraggable(e){this._draggable=!!e;const t=this._map;return t&&(e?(t.on(\"mousedown\",this._addDragHandler),t.on(\"touchstart\",this._addDragHandler)):(t.off(\"mousedown\",this._addDragHandler),t.off(\"touchstart\",this._addDragHandler))),this}isDraggable(){return this._draggable}setRotation(e){return this._rotation=e||0,this._update(),this}getRotation(){return this._rotation}setRotationAlignment(e){return this._rotationAlignment=e||\"auto\",this._update(),this}getRotationAlignment(){return \"auto\"===this._rotationAlignment||\"horizon\"===this._rotationAlignment&&this._map&&!this._map._showingGlobe()?\"viewport\":this._rotationAlignment}setPitchAlignment(e){return this._pitchAlignment=e||\"auto\",this._update(),this}getPitchAlignment(){return \"auto\"===this._pitchAlignment?this.getRotationAlignment():this._pitchAlignment}setOccludedOpacity(e){return this._occludedOpacity=e||.2,this._update(),this}getOccludedOpacity(){return this._occludedOpacity}}const rn={closeButton:!0,closeOnClick:!0,focusAfterOpen:!0,className:\"\",maxWidth:\"240px\"},nn=[\"a[href]\",\"[tabindex]:not([tabindex='-1'])\",\"[contenteditable]:not([contenteditable='false'])\",\"button:not([disabled])\",\"input:not([disabled])\",\"select:not([disabled])\",\"textarea:not([disabled])\"].join(\", \");function sn(t=new e.pointGeometry(0,0),i=\"bottom\"){if(\"number\"==typeof t){const o=Math.round(Math.sqrt(.5*Math.pow(t,2)));switch(i){case\"top\":return new e.pointGeometry(0,t);case\"top-left\":return new e.pointGeometry(o,o);case\"top-right\":return new e.pointGeometry(-o,o);case\"bottom\":return new e.pointGeometry(0,-t);case\"bottom-left\":return new e.pointGeometry(o,-o);case\"bottom-right\":return new e.pointGeometry(-o,-o);case\"left\":return new e.pointGeometry(t,0);case\"right\":return new e.pointGeometry(-t,0)}return new e.pointGeometry(0,0)}return t instanceof e.pointGeometry||Array.isArray(t)?e.pointGeometry.convert(t):e.pointGeometry.convert(t[i]||[0,0])}class an{constructor(e){this.jumpTo(e);}getValue(t){if(t<=this._startTime)return this._start;if(t>=this._endTime)return this._end;const i=e.easeCubicInOut((t-this._startTime)/(this._endTime-this._startTime));return this._start*(1-i)+this._end*i}isEasing(e){return e>=this._startTime&&e<=this._endTime}jumpTo(e){this._startTime=-1/0,this._endTime=-1/0,this._start=e,this._end=e;}easeTo(e,t,i){this._start=this.getValue(t),this._end=e,this._startTime=t,this._endTime=t+i;}}const ln={\"AttributionControl.ToggleAttribution\":\"Toggle attribution\",\"AttributionControl.MapFeedback\":\"Map feedback\",\"FullscreenControl.Enter\":\"Enter fullscreen\",\"FullscreenControl.Exit\":\"Exit fullscreen\",\"GeolocateControl.FindMyLocation\":\"Find my location\",\"GeolocateControl.LocationNotAvailable\":\"Location not available\",\"LogoControl.Title\":\"Mapbox logo\",\"Map.Title\":\"Map\",\"NavigationControl.ResetBearing\":\"Reset bearing to north\",\"NavigationControl.ZoomIn\":\"Zoom in\",\"NavigationControl.ZoomOut\":\"Zoom out\",\"ScrollZoomBlocker.CtrlMessage\":\"Use ctrl + scroll to zoom the map\",\"ScrollZoomBlocker.CmdMessage\":\"Use ⌘ + scroll to zoom the map\",\"TouchPanBlocker.Message\":\"Use two fingers to move the map\"},cn={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:-2,maxZoom:22,minPitch:0,maxPitch:85,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,touchPitch:!0,cooperativeGestures:!1,performanceMetricsCollection:!0,bearingSnap:7,clickTolerance:3,pitchWithRotate:!0,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0,optimizeForTerrain:!0,renderWorldCopies:!0,refreshExpiredTiles:!0,minTileCacheSize:null,maxTileCacheSize:null,localIdeographFontFamily:\"sans-serif\",localFontFamily:null,transformRequest:null,accessToken:null,fadeDuration:300,crossSourceCollisions:!0},hn={showCompass:!0,showZoom:!0,visualizePitch:!1};class un{constructor(t,i,o=!1){this._clickTolerance=10,this.element=i,this.mouseRotate=new wr({clickTolerance:t.dragRotate._mouseRotate._clickTolerance}),this.map=t,o&&(this.mousePitch=new Tr({clickTolerance:t.dragRotate._mousePitch._clickTolerance})),e.bindAll([\"mousedown\",\"mousemove\",\"mouseup\",\"touchstart\",\"touchmove\",\"touchend\",\"reset\"],this),i.addEventListener(\"mousedown\",this.mousedown),i.addEventListener(\"touchstart\",this.touchstart,{passive:!1}),i.addEventListener(\"touchmove\",this.touchmove),i.addEventListener(\"touchend\",this.touchend),i.addEventListener(\"touchcancel\",this.reset);}down(e,t){this.mouseRotate.mousedown(e,t),this.mousePitch&&this.mousePitch.mousedown(e,t),h();}move(e,t){const i=this.map,o=this.mouseRotate.mousemoveWindow(e,t),r=o&&o.bearingDelta;if(r&&i.setBearing(i.getBearing()+r),this.mousePitch){const o=this.mousePitch.mousemoveWindow(e,t),r=o&&o.pitchDelta;r&&i.setPitch(i.getPitch()+r);}}off(){const e=this.element;e.removeEventListener(\"mousedown\",this.mousedown),e.removeEventListener(\"touchstart\",this.touchstart,{passive:!1}),e.removeEventListener(\"touchmove\",this.touchmove),e.removeEventListener(\"touchend\",this.touchend),e.removeEventListener(\"touchcancel\",this.reset),this.offTemp();}offTemp(){u(),e.window.removeEventListener(\"mousemove\",this.mousemove),e.window.removeEventListener(\"mouseup\",this.mouseup);}mousedown(t){this.down(e.extend({},t,{ctrlKey:!0,preventDefault:()=>t.preventDefault()}),p(this.element,t)),e.window.addEventListener(\"mousemove\",this.mousemove),e.window.addEventListener(\"mouseup\",this.mouseup);}mousemove(e){this.move(e,p(this.element,e));}mouseup(e){this.mouseRotate.mouseupWindow(e),this.mousePitch&&this.mousePitch.mouseupWindow(e),this.offTemp();}touchstart(e){1!==e.targetTouches.length?this.reset():(this._startPos=this._lastPos=m(this.element,e.targetTouches)[0],this.down({type:\"mousedown\",button:0,ctrlKey:!0,preventDefault:()=>e.preventDefault()},this._startPos));}touchmove(e){1!==e.targetTouches.length?this.reset():(this._lastPos=m(this.element,e.targetTouches)[0],this.move({preventDefault:()=>e.preventDefault()},this._lastPos));}touchend(e){0===e.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos)<this._clickTolerance&&this.element.click(),this.reset();}reset(){this.mouseRotate.reset(),this.mousePitch&&this.mousePitch.reset(),delete this._startPos,delete this._lastPos,this.offTemp();}}const _n={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showAccuracyCircle:!0,showUserLocation:!0,showUserHeading:!1},dn={maxWidth:100,unit:\"metric\"};function pn(e,t,i){const o=mn(t),r=o/t,n={kilometer:\"km\",meter:\"m\",mile:\"mi\",foot:\"ft\",\"nautical-mile\":\"nm\"}[i];this._map._requestDomTask((()=>{this._container.style.width=e*r+\"px\",this._container.innerHTML=`${o}&nbsp;${n}`;}));}function mn(e){const t=Math.pow(10,`${Math.floor(e)}`.length-1);let i=e/t;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:i>=1?1:function(e){const t=Math.pow(10,Math.ceil(-Math.log(e)/Math.LN10));return Math.round(e*t)/t}(i),t*i}const fn={version:e.version,supported:i,setRTLTextPlugin:e.setRTLTextPlugin,getRTLTextPluginStatus:e.getRTLTextPluginStatus,Map:class extends Yr{constructor(t){if(e.LivePerformanceUtils.mark(e.PerformanceMarkers.create),null!=(t=e.extend({},cn,t)).minZoom&&null!=t.maxZoom&&t.minZoom>t.maxZoom)throw new Error(\"maxZoom must be greater than or equal to minZoom\");if(null!=t.minPitch&&null!=t.maxPitch&&t.minPitch>t.maxPitch)throw new Error(\"maxPitch must be greater than or equal to minPitch\");if(null!=t.minPitch&&t.minPitch<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(null!=t.maxPitch&&t.maxPitch>85)throw new Error(\"maxPitch must be less than or equal to 85\");if(t.antialias&&e.isSafariWithAntialiasingBug(e.window)&&(t.antialias=!1,e.warnOnce(\"Antialiasing is disabled for this WebGL context to avoid browser bug: https://github.com/mapbox/mapbox-gl-js/issues/11609\")),super(new Ko(t.minZoom,t.maxZoom,t.minPitch,t.maxPitch,t.renderWorldCopies),t),this._interactive=t.interactive,this._minTileCacheSize=t.minTileCacheSize,this._maxTileCacheSize=t.maxTileCacheSize,this._failIfMajorPerformanceCaveat=t.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=t.preserveDrawingBuffer,this._antialias=t.antialias,this._useWebGL2=t.useWebGL2,this._trackResize=t.trackResize,this._bearingSnap=t.bearingSnap,this._refreshExpiredTiles=t.refreshExpiredTiles,this._fadeDuration=t.fadeDuration,this._isInitialLoad=!0,this._crossSourceCollisions=t.crossSourceCollisions,this._collectResourceTiming=t.collectResourceTiming,this._optimizeForTerrain=t.optimizeForTerrain,this._language=this._parseLanguage(t.language),this._worldview=t.worldview,this._renderTaskQueue=new Qr,this._domRenderTaskQueue=new Qr,this._controls=[],this._markers=[],this._popups=[],this._mapId=e.uniqueId(),this._locale=e.extend({},ln,t.locale),this._clickTolerance=t.clickTolerance,this._cooperativeGestures=t.cooperativeGestures,this._performanceMetricsCollection=t.performanceMetricsCollection,this._containerWidth=0,this._containerHeight=0,this._averageElevationLastSampledAt=-1/0,this._averageElevationExaggeration=0,this._averageElevation=new an(0),this._interactionRange=[1/0,-1/0],this._visibilityHidden=0,this._useExplicitProjection=!1,this._requestManager=new e.RequestManager(t.transformRequest,t.accessToken,t.testMode),this._silenceAuthErrors=!!t.testMode,\"string\"==typeof t.container){if(this._container=e.window.document.getElementById(t.container),!this._container)throw new Error(`Container '${t.container}' not found.`)}else {if(!(t.container instanceof e.window.HTMLElement))throw new Error(\"Invalid type: 'container' must be a String or HTMLElement.\");this._container=t.container;}if(this._container.childNodes.length>0&&e.warnOnce(\"The map container element should be empty, otherwise the map's interactivity will be negatively impacted. If you want to display a message when WebGL is not supported, use the Mapbox GL Supported plugin instead.\"),t.maxBounds&&this.setMaxBounds(t.maxBounds),e.bindAll([\"_onWindowOnline\",\"_onWindowResize\",\"_onVisibilityChange\",\"_onMapScroll\",\"_contextLost\",\"_contextRestored\"],this),this._setupContainer(),this._setupPainter(),void 0===this.painter)throw new Error(\"Failed to initialize WebGL.\");this.on(\"move\",(()=>this._update(!1))),this.on(\"moveend\",(()=>this._update(!1))),this.on(\"zoom\",(()=>this._update(!0))),void 0!==e.window&&(e.window.addEventListener(\"online\",this._onWindowOnline,!1),e.window.addEventListener(\"resize\",this._onWindowResize,!1),e.window.addEventListener(\"orientationchange\",this._onWindowResize,!1),e.window.addEventListener(\"webkitfullscreenchange\",this._onWindowResize,!1),e.window.addEventListener(\"visibilitychange\",this._onVisibilityChange,!1)),this.handlers=new $r(this,t),this._localFontFamily=t.localFontFamily,this._localIdeographFontFamily=t.localIdeographFontFamily,t.style&&this.setStyle(t.style,{localFontFamily:this._localFontFamily,localIdeographFontFamily:this._localIdeographFontFamily}),t.projection&&this.setProjection(t.projection),this._hash=t.hash&&new Qo(\"string\"==typeof t.hash&&t.hash||void 0).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:t.center,zoom:t.zoom,bearing:t.bearing,pitch:t.pitch}),t.bounds&&(this.resize(),this.fitBounds(t.bounds,e.extend({},t.fitBoundsOptions,{duration:0})))),this.resize(),t.attributionControl&&this.addControl(new Kr({customAttribution:t.customAttribution})),this._logoControl=new Jr,this.addControl(this._logoControl,t.logoPosition),this.on(\"style.load\",(()=>{this.transform.unmodified&&this.jumpTo(this.style.stylesheet);})),this.on(\"data\",(t=>{this._update(\"style\"===t.dataType),this.fire(new e.Event(`${t.dataType}data`,t));})),this.on(\"dataloading\",(t=>{this.fire(new e.Event(`${t.dataType}dataloading`,t));}));}_getMapId(){return this._mapId}addControl(t,i){if(void 0===i&&(i=t.getDefaultPosition?t.getDefaultPosition():\"top-right\"),!t||!t.onAdd)return this.fire(new e.ErrorEvent(new Error(\"Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.\")));const o=t.onAdd(this);this._controls.push(t);const r=this._controlPositions[i];return -1!==i.indexOf(\"bottom\")?r.insertBefore(o,r.firstChild):r.appendChild(o),this}removeControl(t){if(!t||!t.onRemove)return this.fire(new e.ErrorEvent(new Error(\"Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.\")));const i=this._controls.indexOf(t);return i>-1&&this._controls.splice(i,1),t.onRemove(this),this}hasControl(e){return this._controls.indexOf(e)>-1}getContainer(){return this._container}getCanvasContainer(){return this._canvasContainer}getCanvas(){return this._canvas}resize(t){if(this._updateContainerDimensions(),this._containerWidth===this.transform.width&&this._containerHeight===this.transform.height)return this;this._resizeCanvas(this._containerWidth,this._containerHeight),this.transform.resize(this._containerWidth,this._containerHeight),this.painter.resize(Math.ceil(this._containerWidth),Math.ceil(this._containerHeight));const i=!this._moving;return i&&this.fire(new e.Event(\"movestart\",t)).fire(new e.Event(\"move\",t)),this.fire(new e.Event(\"resize\",t)),i&&this.fire(new e.Event(\"moveend\",t)),this}getBounds(){return this.transform.getBounds()}getMaxBounds(){return this.transform.getMaxBounds()||null}setMaxBounds(t){return this.transform.setMaxBounds(e.LngLatBounds.convert(t)),this._update()}setMinZoom(t){if((t=null==t?-2:t)>=-2&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()<t?this.setZoom(t):this.fire(new e.Event(\"zoomstart\")).fire(new e.Event(\"zoom\")).fire(new e.Event(\"zoomend\")),this;throw new Error(\"minZoom must be between -2 and the current maxZoom, inclusive\")}getMinZoom(){return this.transform.minZoom}setMaxZoom(t){if((t=null==t?22:t)>=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t?this.setZoom(t):this.fire(new e.Event(\"zoomstart\")).fire(new e.Event(\"zoom\")).fire(new e.Event(\"zoomend\")),this;throw new Error(\"maxZoom must be greater than the current minZoom\")}getMaxZoom(){return this.transform.maxZoom}setMinPitch(t){if((t=null==t?0:t)<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(t>=0&&t<=this.transform.maxPitch)return this.transform.minPitch=t,this._update(),this.getPitch()<t?this.setPitch(t):this.fire(new e.Event(\"pitchstart\")).fire(new e.Event(\"pitch\")).fire(new e.Event(\"pitchend\")),this;throw new Error(\"minPitch must be between 0 and the current maxPitch, inclusive\")}getMinPitch(){return this.transform.minPitch}setMaxPitch(t){if((t=null==t?85:t)>85)throw new Error(\"maxPitch must be less than or equal to 85\");if(t>=this.transform.minPitch)return this.transform.maxPitch=t,this._update(),this.getPitch()>t?this.setPitch(t):this.fire(new e.Event(\"pitchstart\")).fire(new e.Event(\"pitch\")).fire(new e.Event(\"pitchend\")),this;throw new Error(\"maxPitch must be greater than or equal to minPitch\")}getMaxPitch(){return this.transform.maxPitch}getRenderWorldCopies(){return this.transform.renderWorldCopies}setRenderWorldCopies(e){return this.transform.renderWorldCopies=e,this.transform.renderWorldCopies||this._forceMarkerAndPopupUpdate(!0),this._update()}getLanguage(){return this._language}_parseLanguage(t){return \"auto\"===t?e.window.navigator.language:Array.isArray(t)?0===t.length?void 0:t.map((t=>\"auto\"===t?e.window.navigator.language:t)):t}setLanguage(e){const t=this._parseLanguage(e);if(!this.style||t===this._language)return this;this._language=t,this.style._reloadSources();for(const e of this._controls)e._setLanguage&&e._setLanguage(this._language);return this}getWorldview(){return this._worldview}setWorldview(e){return this.style&&e!==this._worldview?(this._worldview=e,this.style._reloadSources(),this):this}getProjection(){return this.transform.mercatorFromTransition?{name:\"globe\",center:[0,0]}:this.transform.getProjection()}_showingGlobe(){return \"globe\"===this.transform.projection.name}setProjection(e){return this._lazyInitEmptyStyle(),e?\"string\"==typeof e&&(e={name:e}):e=null,this._useExplicitProjection=!!e,this._prioritizeAndUpdateProjection(e,this.style.stylesheet?this.style.stylesheet.projection:null)}_updateProjectionTransition(){if(\"globe\"!==this.getProjection().name)return;const t=this.transform,i=t.projection.name;let o;\"globe\"===i&&t.zoom>=e.GLOBE_ZOOM_THRESHOLD_MAX?(t.setMercatorFromTransition(),o=!0):\"mercator\"===i&&t.zoom<e.GLOBE_ZOOM_THRESHOLD_MAX&&(t.setProjection({name:\"globe\"}),o=!0),o&&(this.style.applyProjectionUpdate(),this.style._forceSymbolLayerUpdate());}_prioritizeAndUpdateProjection(e,t){return this._updateProjection(e||t||{name:\"mercator\"})}_updateProjection(t){let i;if(i=\"globe\"===t.name&&this.transform.zoom>=e.GLOBE_ZOOM_THRESHOLD_MAX?this.transform.setMercatorFromTransition():this.transform.setProjection(t),this.style.applyProjectionUpdate(),i){this.painter.clearBackgroundTiles();for(const e in this.style._sourceCaches)this.style._sourceCaches[e].clearTiles();this._update(!0),this._forceMarkerAndPopupUpdate(!0);}return this}project(t){return this.transform.locationPoint3D(e.LngLat.convert(t))}unproject(t){return this.transform.pointLocation3D(e.pointGeometry.convert(t))}isMoving(){return this._moving||this.handlers&&this.handlers.isMoving()||!1}isZooming(){return this._zooming||this.handlers&&this.handlers.isZooming()||!1}isRotating(){return this._rotating||this.handlers&&this.handlers.isRotating()||!1}_isDragging(){return this.handlers&&this.handlers._isDragging()||!1}_createDelegatedListener(e,t,i){if(\"mouseenter\"===e||\"mouseover\"===e){let o=!1;const r=r=>{const n=t.filter((e=>this.getLayer(e))),s=n.length?this.queryRenderedFeatures(r.point,{layers:n}):[];s.length?o||(o=!0,i.call(this,new cr(e,this,r.originalEvent,{features:s}))):o=!1;},n=()=>{o=!1;};return {layers:new Set(t),listener:i,delegates:{mousemove:r,mouseout:n}}}if(\"mouseleave\"===e||\"mouseout\"===e){let o=!1;const r=r=>{const n=t.filter((e=>this.getLayer(e)));(n.length?this.queryRenderedFeatures(r.point,{layers:n}):[]).length?o=!0:o&&(o=!1,i.call(this,new cr(e,this,r.originalEvent)));},n=t=>{o&&(o=!1,i.call(this,new cr(e,this,t.originalEvent)));};return {layers:new Set(t),listener:i,delegates:{mousemove:r,mouseout:n}}}{const o=e=>{const o=t.filter((e=>this.getLayer(e))),r=o.length?this.queryRenderedFeatures(e.point,{layers:o}):[];r.length&&(e.features=r,i.call(this,e),delete e.features);};return {layers:new Set(t),listener:i,delegates:{[e]:o}}}}on(e,t,i){if(void 0===i)return super.on(e,t);Array.isArray(t)||(t=[t]);const o=this._createDelegatedListener(e,t,i);this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[e]=this._delegatedListeners[e]||[],this._delegatedListeners[e].push(o);for(const e in o.delegates)this.on(e,o.delegates[e]);return this}once(e,t,i){if(void 0===i)return super.once(e,t);Array.isArray(t)||(t=[t]);const o=this._createDelegatedListener(e,t,i);for(const e in o.delegates)this.once(e,o.delegates[e]);return this}off(e,t,i){if(void 0===i)return super.off(e,t);t=new Set(Array.isArray(t)?t:[t]);const o=(e,t)=>{if(e.size!==t.size)return !1;for(const i of e)if(!t.has(i))return !1;return !0},r=this._delegatedListeners?this._delegatedListeners[e]:void 0;return r&&(e=>{for(let r=0;r<e.length;r++){const n=e[r];if(n.listener===i&&o(n.layers,t)){for(const e in n.delegates)this.off(e,n.delegates[e]);return e.splice(r,1),this}}})(r),this}queryRenderedFeatures(t,i){return this.style?(void 0!==i||void 0===t||t instanceof e.pointGeometry||Array.isArray(t)||(i=t,t=void 0),this.style.queryRenderedFeatures(t=t||[[0,0],[this.transform.width,this.transform.height]],i=i||{},this.transform)):[]}querySourceFeatures(e,t){return this.style.querySourceFeatures(e,t)}setStyle(t,i){return !1!==(i=e.extend({},{localIdeographFontFamily:this._localIdeographFontFamily,localFontFamily:this._localFontFamily},i)).diff&&i.localIdeographFontFamily===this._localIdeographFontFamily&&i.localFontFamily===this._localFontFamily&&this.style&&t?(this._diffStyle(t,i),this):(this._localIdeographFontFamily=i.localIdeographFontFamily,this._localFontFamily=i.localFontFamily,this._updateStyle(t,i))}_getUIString(e){const t=this._locale[e];if(null==t)throw new Error(`Missing UI string '${e}'`);return t}_updateStyle(e,t){return this.style&&(this.style.setEventedParent(null),this.style._remove(),this.style=void 0),e&&(this.style=new Qt(this,t||{}),this.style.setEventedParent(this,{style:this.style}),\"string\"==typeof e?this.style.loadURL(e):this.style.loadJSON(e)),this._updateTerrain(),this}_lazyInitEmptyStyle(){this.style||(this.style=new Qt(this,{}),this.style.setEventedParent(this,{style:this.style}),this.style.loadEmpty());}_diffStyle(t,i){if(\"string\"==typeof t){const o=this._requestManager.normalizeStyleURL(t),r=this._requestManager.transformRequest(o,e.ResourceType.Style);e.getJSON(r,((t,o)=>{t?this.fire(new e.ErrorEvent(t)):o&&this._updateDiff(o,i);}));}else \"object\"==typeof t&&this._updateDiff(t,i);}_updateDiff(t,i){try{this.style.setState(t)&&this._update(!0);}catch(o){e.warnOnce(`Unable to perform style diff: ${o.message||o.error||o}.  Rebuilding the style from scratch.`),this._updateStyle(t,i);}}getStyle(){if(this.style)return this.style.serialize()}isStyleLoaded(){return this.style?this.style.loaded():(e.warnOnce(\"There is no style added to the map.\"),!1)}addSource(e,t){return this._lazyInitEmptyStyle(),this.style.addSource(e,t),this._update(!0)}isSourceLoaded(e){return !!this.style&&this.style._isSourceCacheLoaded(e)}areTilesLoaded(){const e=this.style&&this.style._sourceCaches;for(const t in e){const i=e[t]._tiles;for(const e in i){const t=i[e];if(\"loaded\"!==t.state&&\"errored\"!==t.state)return !1}}return !0}addSourceType(e,t,i){this._lazyInitEmptyStyle(),this.style.addSourceType(e,t,i);}removeSource(e){return this.style.removeSource(e),this._updateTerrain(),this._update(!0)}getSource(e){return this.style.getSource(e)}addImage(t,i,{pixelRatio:o=1,sdf:r=!1,stretchX:n,stretchY:s,content:a}={}){if(this._lazyInitEmptyStyle(),i instanceof e.window.HTMLImageElement||e.window.ImageBitmap&&i instanceof e.window.ImageBitmap){const{width:l,height:c,data:h}=e.exported.getImageData(i);this.style.addImage(t,{data:new e.RGBAImage({width:l,height:c},h),pixelRatio:o,stretchX:n,stretchY:s,content:a,sdf:r,version:0});}else if(void 0===i.width||void 0===i.height)this.fire(new e.ErrorEvent(new Error(\"Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`\")));else {const{width:l,height:c}=i,h=i;this.style.addImage(t,{data:new e.RGBAImage({width:l,height:c},new Uint8Array(h.data)),pixelRatio:o,stretchX:n,stretchY:s,content:a,sdf:r,version:0,userImage:h}),h.onAdd&&h.onAdd(this,t);}}updateImage(t,i){const o=this.style.getImage(t);if(!o)return void this.fire(new e.ErrorEvent(new Error(\"The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.\")));const r=i instanceof e.window.HTMLImageElement||e.window.ImageBitmap&&i instanceof e.window.ImageBitmap?e.exported.getImageData(i):i,{width:n,height:s}=r;void 0!==n&&void 0!==s?n===o.data.width&&s===o.data.height?(o.data.replace(r.data,!(i instanceof e.window.HTMLImageElement||e.window.ImageBitmap&&i instanceof e.window.ImageBitmap)),this.style.updateImage(t,o)):this.fire(new e.ErrorEvent(new Error(`The width and height of the updated image (${n}, ${s})\\n                must be that same as the previous version of the image\\n                (${o.data.width}, ${o.data.height})`))):this.fire(new e.ErrorEvent(new Error(\"Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`\")));}hasImage(t){return t?!!this.style.getImage(t):(this.fire(new e.ErrorEvent(new Error(\"Missing required image id\"))),!1)}removeImage(e){this.style.removeImage(e);}loadImage(t,i){e.getImage(this._requestManager.transformRequest(t,e.ResourceType.Image),((t,o)=>{i(t,o instanceof e.window.HTMLImageElement?e.exported.getImageData(o):o);}));}listImages(){return this.style.listImages()}addLayer(e,t){return this._lazyInitEmptyStyle(),this.style.addLayer(e,t),this._update(!0)}moveLayer(e,t){return this.style.moveLayer(e,t),this._update(!0)}removeLayer(e){return this.style.removeLayer(e),this._update(!0)}getLayer(e){return this.style.getLayer(e)}setLayerZoomRange(e,t,i){return this.style.setLayerZoomRange(e,t,i),this._update(!0)}setFilter(e,t,i={}){return this.style.setFilter(e,t,i),this._update(!0)}getFilter(e){return this.style.getFilter(e)}setPaintProperty(e,t,i,o={}){return this.style.setPaintProperty(e,t,i,o),this._update(!0)}getPaintProperty(e,t){return this.style.getPaintProperty(e,t)}setLayoutProperty(e,t,i,o={}){return this.style.setLayoutProperty(e,t,i,o),this._update(!0)}getLayoutProperty(e,t){return this.style.getLayoutProperty(e,t)}setLight(e,t={}){return this._lazyInitEmptyStyle(),this.style.setLight(e,t),this._update(!0)}getLight(){return this.style.getLight()}setTerrain(e){return this._lazyInitEmptyStyle(),!e&&this.transform.projection.requiresDraping?this.style.setTerrainForDraping():this.style.setTerrain(e),this._averageElevationLastSampledAt=-1/0,this._update(!0)}getTerrain(){return this.style?this.style.getTerrain():null}setFog(e){return this._lazyInitEmptyStyle(),this.style.setFog(e),this._update(!0)}getFog(){return this.style?this.style.getFog():null}_queryFogOpacity(t){return this.style&&this.style.fog?this.style.fog.getOpacityAtLatLng(e.LngLat.convert(t),this.transform):0}setFeatureState(e,t){return this.style.setFeatureState(e,t),this._update()}removeFeatureState(e,t){return this.style.removeFeatureState(e,t),this._update()}getFeatureState(e){return this.style.getFeatureState(e)}_updateContainerDimensions(){if(!this._container)return;const t=this._container.getBoundingClientRect().width||400,i=this._container.getBoundingClientRect().height||300;let o,r,n,s=this._container;for(;s&&(!r||!n);){const t=e.window.getComputedStyle(s).transform;t&&\"none\"!==t&&(o=t.match(/matrix.*\\((.+)\\)/)[1].split(\", \"),o[0]&&\"0\"!==o[0]&&\"1\"!==o[0]&&(r=o[0]),o[3]&&\"0\"!==o[3]&&\"1\"!==o[3]&&(n=o[3])),s=s.parentElement;}this._containerWidth=r?Math.abs(t/r):t,this._containerHeight=n?Math.abs(i/n):i;}_detectMissingCSS(){\"rgb(250, 128, 114)\"!==e.window.getComputedStyle(this._missingCSSCanary).getPropertyValue(\"background-color\")&&e.warnOnce(\"This page appears to be missing CSS declarations for Mapbox GL JS, which may cause the map to display incorrectly. Please ensure your page includes mapbox-gl.css, as described in https://www.mapbox.com/mapbox-gl-js/api/.\");}_setupContainer(){const e=this._container;e.classList.add(\"mapboxgl-map\"),(this._missingCSSCanary=n(\"div\",\"mapboxgl-canary\",e)).style.visibility=\"hidden\",this._detectMissingCSS();const t=this._canvasContainer=n(\"div\",\"mapboxgl-canvas-container\",e);this._interactive&&t.classList.add(\"mapboxgl-interactive\"),this._canvas=n(\"canvas\",\"mapboxgl-canvas\",t),this._canvas.addEventListener(\"webglcontextlost\",this._contextLost,!1),this._canvas.addEventListener(\"webglcontextrestored\",this._contextRestored,!1),this._canvas.setAttribute(\"tabindex\",\"0\"),this._canvas.setAttribute(\"aria-label\",this._getUIString(\"Map.Title\")),this._canvas.setAttribute(\"role\",\"region\"),this._updateContainerDimensions(),this._resizeCanvas(this._containerWidth,this._containerHeight);const i=this._controlContainer=n(\"div\",\"mapboxgl-control-container\",e),o=this._controlPositions={};[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"].forEach((e=>{o[e]=n(\"div\",`mapboxgl-ctrl-${e}`,i);})),this._container.addEventListener(\"scroll\",this._onMapScroll,!1);}_resizeCanvas(t,i){const o=e.exported.devicePixelRatio||1;this._canvas.width=o*Math.ceil(t),this._canvas.height=o*Math.ceil(i),this._canvas.style.width=`${t}px`,this._canvas.style.height=`${i}px`;}_addMarker(e){this._markers.push(e);}_removeMarker(e){const t=this._markers.indexOf(e);-1!==t&&this._markers.splice(t,1);}_addPopup(e){this._popups.push(e);}_removePopup(e){const t=this._popups.indexOf(e);-1!==t&&this._popups.splice(t,1);}_setupPainter(){const t=e.extend({},i.webGLContextAttributes,{failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer,antialias:this._antialias||!1}),o=this._useWebGL2&&this._canvas.getContext(\"webgl2\",t),r=o||this._canvas.getContext(\"webgl\",t)||this._canvas.getContext(\"experimental-webgl\",t);r?(this._useWebGL2&&!o&&e.warnOnce(\"Failed to create WebGL 2 context. Using WebGL 1.\"),e.storeAuthState(r,!0),this.painter=new Fo(r,this.transform,!!o),this.on(\"data\",(e=>{\"source\"===e.dataType&&this.painter.setTileLoadedFlag(!0);})),e.exported$1.testSupport(r)):this.fire(new e.ErrorEvent(new Error(\"Failed to initialize WebGL\")));}_contextLost(t){t.preventDefault(),this._frame&&(this._frame.cancel(),this._frame=null),this.fire(new e.Event(\"webglcontextlost\",{originalEvent:t}));}_contextRestored(t){this._setupPainter(),this.resize(),this._update(),this.fire(new e.Event(\"webglcontextrestored\",{originalEvent:t}));}_onMapScroll(e){if(e.target===this._container)return this._container.scrollTop=0,this._container.scrollLeft=0,!1}loaded(){return !this._styleDirty&&!this._sourcesDirty&&!!this.style&&this.style.loaded()}_update(e){return this.style?(this._styleDirty=this._styleDirty||e,this._sourcesDirty=!0,this.triggerRepaint(),this):this}_requestRenderFrame(e){return this._update(),this._renderTaskQueue.add(e)}_cancelRenderFrame(e){this._renderTaskQueue.remove(e);}_requestDomTask(e){!this.loaded()||this.loaded()&&!this.isMoving()?e():this._domRenderTaskQueue.add(e);}_render(t){let i;const o=this.painter.context.extTimerQuery,r=e.exported.now();if(this.listens(\"gpu-timing-frame\")&&(i=o.createQueryEXT(),o.beginQueryEXT(o.TIME_ELAPSED_EXT,i)),this.painter.context.setDirty(),this.painter.setBaseState(),(this.isMoving()||this.isRotating()||this.isZooming())&&(this._interactionRange[0]=Math.min(this._interactionRange[0],e.window.performance.now()),this._interactionRange[1]=Math.max(this._interactionRange[1],e.window.performance.now())),this._renderTaskQueue.run(t),this._domRenderTaskQueue.run(t),this._removed)return;this._updateProjectionTransition();const n=this._isInitialLoad?0:this._fadeDuration;if(this.style&&this._styleDirty){this._styleDirty=!1;const t=this.transform.zoom,i=this.transform.pitch,o=e.exported.now(),r=new e.EvaluationParameters(t,{now:o,fadeDuration:n,pitch:i,transition:this.style.getTransition()});this.style.update(r);}this.style&&this.style.fog&&this.style.fog.hasTransition()&&(this.style._markersNeedUpdate=!0,this._sourcesDirty=!0);let s=!1;if(this.style&&this._sourcesDirty?(this._sourcesDirty=!1,this.painter._updateFog(this.style),this._updateTerrain(),s=this._updateAverageElevation(r),this.style._updateSources(this.transform),this._forceMarkerAndPopupUpdate()):s=this._updateAverageElevation(r),this._placementDirty=this.style&&this.style._updatePlacement(this.painter.transform,this.showCollisionBoxes,n,this._crossSourceCollisions),this.style&&this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showTerrainWireframe:this.showTerrainWireframe,showOverdrawInspector:this._showOverdrawInspector,showQueryGeometry:!!this._showQueryGeometry,showTileAABBs:this.showTileAABBs,rotating:this.isRotating(),zooming:this.isZooming(),moving:this.isMoving(),fadeDuration:n,isInitialLoad:this._isInitialLoad,showPadding:this.showPadding,gpuTiming:!!this.listens(\"gpu-timing-layer\"),gpuTimingDeferredRender:!!this.listens(\"gpu-timing-deferred-render\"),speedIndexTiming:this.speedIndexTiming}),this.fire(new e.Event(\"render\")),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire(new e.Event(\"load\"))),this.style&&this.style.hasTransitions()&&(this._styleDirty=!0),this.style&&!this._placementDirty&&this.style._releaseSymbolFadeTiles(),i){const t=e.exported.now()-r;o.endQueryEXT(o.TIME_ELAPSED_EXT,i),setTimeout((()=>{const n=o.getQueryObjectEXT(i,o.QUERY_RESULT_EXT)/1e6;o.deleteQueryEXT(i),this.fire(new e.Event(\"gpu-timing-frame\",{cpuTime:t,gpuTime:n})),e.window.performance.mark(\"frame-gpu\",{startTime:r,detail:{gpuTime:n}});}),50);}if(this.listens(\"gpu-timing-layer\")){const t=this.painter.collectGpuTimers();setTimeout((()=>{const i=this.painter.queryGpuTimers(t);this.fire(new e.Event(\"gpu-timing-layer\",{layerTimes:i}));}),50);}if(this.listens(\"gpu-timing-deferred-render\")){const t=this.painter.collectDeferredRenderGpuQueries();setTimeout((()=>{const i=this.painter.queryGpuTimeDeferredRender(t);this.fire(new e.Event(\"gpu-timing-deferred-render\",{gpuTime:i}));}),50);}const a=this._sourcesDirty||this._styleDirty||this._placementDirty||s;if(a||this._repaint)this.triggerRepaint();else {const t=!this.isMoving()&&this.loaded();if(t&&(s=this._updateAverageElevation(r,!0)),s)this.triggerRepaint();else if(this._triggerFrame(!1),t&&(this.fire(new e.Event(\"idle\")),this._isInitialLoad=!1,this.speedIndexTiming)){const t=this._calculateSpeedIndex();this.fire(new e.Event(\"speedindexcompleted\",{speedIndex:t})),this.speedIndexTiming=!1;}}!this._loaded||this._fullyLoaded||a||(this._fullyLoaded=!0,e.LivePerformanceUtils.mark(e.PerformanceMarkers.fullLoad),this._performanceMetricsCollection&&e.postPerformanceEvent(this._requestManager._customAccessToken,{width:this.painter.width,height:this.painter.height,interactionRange:this._interactionRange,visibilityHidden:this._visibilityHidden,terrainEnabled:!!this.painter.style.getTerrain(),fogEnabled:!!this.painter.style.getFog(),projection:this.getProjection().name,zoom:this.transform.zoom,renderer:this.painter.context.renderer,vendor:this.painter.context.vendor}),this._authenticate());}_forceMarkerAndPopupUpdate(e){for(const t of this._markers)e&&!this.getRenderWorldCopies()&&(t._lngLat=t._lngLat.wrap()),t._update();for(const t of this._popups)!e||this.getRenderWorldCopies()||t._trackPointer||(t._lngLat=t._lngLat.wrap()),t._update();}_updateAverageElevation(e,t=!1){const i=e=>(this.transform.averageElevation=e,this._update(!1),!0);if(!this.painter.averageElevationNeedsEasing())return 0!==this.transform.averageElevation&&i(0);if((t||e-this._averageElevationLastSampledAt>500)&&!this._averageElevation.isEasing(e)){const t=this.transform.averageElevation;let o=this.transform.sampleAverageElevation(),r=!1;this.transform.elevation&&(r=this.transform.elevation.exaggeration()!==this._averageElevationExaggeration,this._averageElevationExaggeration=this.transform.elevation.exaggeration()),isNaN(o)?o=0:this._averageElevationLastSampledAt=e;const n=Math.abs(t-o);if(n>1){if(this._isInitialLoad||r)return this._averageElevation.jumpTo(o),i(o);this._averageElevation.easeTo(o,e,300);}else if(n>1e-4)return this._averageElevation.jumpTo(o),i(o)}return !!this._averageElevation.isEasing(e)&&i(this._averageElevation.getValue(e))}_authenticate(){e.getMapSessionAPI(this._getMapId(),this._requestManager._skuToken,this._requestManager._customAccessToken,(t=>{if(t&&(t.message===e.AUTH_ERR_MSG||401===t.status)){const t=this.painter.context.gl;e.storeAuthState(t,!1),this._logoControl instanceof Jr&&this._logoControl._updateLogo(),t&&t.clear(t.DEPTH_BUFFER_BIT|t.COLOR_BUFFER_BIT|t.STENCIL_BUFFER_BIT),this._silenceAuthErrors||this.fire(new e.ErrorEvent(new Error(\"A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/\")));}})),e.postMapLoadEvent(this._getMapId(),this._requestManager._skuToken,this._requestManager._customAccessToken,(()=>{}));}_updateTerrain(){const e=this._isDragging();this.painter.updateTerrain(this.style,e);}_calculateSpeedIndex(){const e=this.painter.canvasCopy(),t=this.painter.getCanvasCopiesAndTimestamps();t.timeStamps.push(performance.now());const i=this.painter.context.gl,o=i.createFramebuffer();function r(e){i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,e,0);const t=new Uint8Array(i.drawingBufferWidth*i.drawingBufferHeight*4);return i.readPixels(0,0,i.drawingBufferWidth,i.drawingBufferHeight,i.RGBA,i.UNSIGNED_BYTE,t),t}return i.bindFramebuffer(i.FRAMEBUFFER,o),this._canvasPixelComparison(r(e),t.canvasCopies.map(r),t.timeStamps)}_canvasPixelComparison(e,t,i){let o=i[1]-i[0];const r=e.length/4;for(let n=0;n<t.length;n++){const s=t[n];let a=0;for(let t=0;t<s.length;t+=4)s[t]===e[t]&&s[t+1]===e[t+1]&&s[t+2]===e[t+2]&&s[t+3]===e[t+3]&&(a+=1);o+=(i[n+2]-i[n+1])*(1-a/r);}return o}remove(){this._hash&&this._hash.remove();for(const e of this._controls)e.onRemove(this);this._controls=[],this._frame&&(this._frame.cancel(),this._frame=null),this._renderTaskQueue.clear(),this._domRenderTaskQueue.clear(),this.style&&this.style.destroy(),this.painter.destroy(),this.handlers&&this.handlers.destroy(),this.handlers=void 0,this.setStyle(null),void 0!==e.window&&(e.window.removeEventListener(\"resize\",this._onWindowResize,!1),e.window.removeEventListener(\"orientationchange\",this._onWindowResize,!1),e.window.removeEventListener(\"webkitfullscreenchange\",this._onWindowResize,!1),e.window.removeEventListener(\"online\",this._onWindowOnline,!1),e.window.removeEventListener(\"visibilitychange\",this._onVisibilityChange,!1));const t=this.painter.context.gl.getExtension(\"WEBGL_lose_context\");t&&t.loseContext(),this._canvas.removeEventListener(\"webglcontextlost\",this._contextLost,!1),this._canvas.removeEventListener(\"webglcontextrestored\",this._contextRestored,!1),this._canvasContainer.remove(),this._controlContainer.remove(),this._missingCSSCanary.remove(),this._canvas=void 0,this._canvasContainer=void 0,this._controlContainer=void 0,this._missingCSSCanary=void 0,this._container.classList.remove(\"mapboxgl-map\"),this._container.removeEventListener(\"scroll\",this._onMapScroll,!1),e.removeAuthState(this.painter.context.gl),this._removed=!0,this.fire(new e.Event(\"remove\"));}triggerRepaint(){this._triggerFrame(!0);}_triggerFrame(t){this._renderNextFrame=this._renderNextFrame||t,this.style&&!this._frame&&(this._frame=e.exported.frame((e=>{const t=!!this._renderNextFrame;this._frame=null,this._renderNextFrame=null,t&&this._render(e);})));}_preloadTiles(t){const i=this.style?Object.values(this.style._sourceCaches):[];return e.asyncAll(i,((e,i)=>e._preloadTiles(t,i)),(()=>{this.triggerRepaint();})),this}_onWindowOnline(){this._update();}_onWindowResize(e){this._trackResize&&this.resize({originalEvent:e})._update();}_onVisibilityChange(){\"hidden\"===e.window.document.visibilityState&&this._visibilityHidden++;}get showTileBoundaries(){return !!this._showTileBoundaries}set showTileBoundaries(e){this._showTileBoundaries!==e&&(this._showTileBoundaries=e,this._update());}get showTerrainWireframe(){return !!this._showTerrainWireframe}set showTerrainWireframe(e){this._showTerrainWireframe!==e&&(this._showTerrainWireframe=e,this._update());}get speedIndexTiming(){return !!this._speedIndexTiming}set speedIndexTiming(e){this._speedIndexTiming!==e&&(this._speedIndexTiming=e,this._update());}get showPadding(){return !!this._showPadding}set showPadding(e){this._showPadding!==e&&(this._showPadding=e,this._update());}get showCollisionBoxes(){return !!this._showCollisionBoxes}set showCollisionBoxes(e){this._showCollisionBoxes!==e&&(this._showCollisionBoxes=e,e?this.style._generateCollisionBoxes():this._update());}get showOverdrawInspector(){return !!this._showOverdrawInspector}set showOverdrawInspector(e){this._showOverdrawInspector!==e&&(this._showOverdrawInspector=e,this._update());}get repaint(){return !!this._repaint}set repaint(e){this._repaint!==e&&(this._repaint=e,this.triggerRepaint());}get vertices(){return !!this._vertices}set vertices(e){this._vertices=e,this._update();}get showTileAABBs(){return !!this._showTileAABBs}set showTileAABBs(e){this._showTileAABBs!==e&&(this._showTileAABBs=e,e&&this._update());}_setCacheLimits(t,i){e.setCacheLimits(t,i);}get version(){return e.version}},NavigationControl:class{constructor(t){this.options=e.extend({},hn,t),this._container=n(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),this._container.addEventListener(\"contextmenu\",(e=>e.preventDefault())),this.options.showZoom&&(e.bindAll([\"_setButtonTitle\",\"_updateZoomButtons\"],this),this._zoomInButton=this._createButton(\"mapboxgl-ctrl-zoom-in\",(e=>{this._map&&this._map.zoomIn({},{originalEvent:e});})),n(\"span\",\"mapboxgl-ctrl-icon\",this._zoomInButton).setAttribute(\"aria-hidden\",\"true\"),this._zoomOutButton=this._createButton(\"mapboxgl-ctrl-zoom-out\",(e=>{this._map&&this._map.zoomOut({},{originalEvent:e});})),n(\"span\",\"mapboxgl-ctrl-icon\",this._zoomOutButton).setAttribute(\"aria-hidden\",\"true\")),this.options.showCompass&&(e.bindAll([\"_rotateCompassArrow\"],this),this._compass=this._createButton(\"mapboxgl-ctrl-compass\",(e=>{const t=this._map;t&&(this.options.visualizePitch?t.resetNorthPitch({},{originalEvent:e}):t.resetNorth({},{originalEvent:e}));})),this._compassIcon=n(\"span\",\"mapboxgl-ctrl-icon\",this._compass),this._compassIcon.setAttribute(\"aria-hidden\",\"true\"));}_updateZoomButtons(){const e=this._map;if(!e)return;const t=e.getZoom(),i=t===e.getMaxZoom(),o=t===e.getMinZoom();this._zoomInButton.disabled=i,this._zoomOutButton.disabled=o,this._zoomInButton.setAttribute(\"aria-disabled\",i.toString()),this._zoomOutButton.setAttribute(\"aria-disabled\",o.toString());}_rotateCompassArrow(){const e=this._map;if(!e)return;const t=this.options.visualizePitch?`scale(${1/Math.pow(Math.cos(e.transform.pitch*(Math.PI/180)),.5)}) rotateX(${e.transform.pitch}deg) rotateZ(${e.transform.angle*(180/Math.PI)}deg)`:`rotate(${e.transform.angle*(180/Math.PI)}deg)`;e._requestDomTask((()=>{this._compassIcon&&(this._compassIcon.style.transform=t);}));}onAdd(e){return this._map=e,this.options.showZoom&&(this._setButtonTitle(this._zoomInButton,\"ZoomIn\"),this._setButtonTitle(this._zoomOutButton,\"ZoomOut\"),e.on(\"zoom\",this._updateZoomButtons),this._updateZoomButtons()),this.options.showCompass&&(this._setButtonTitle(this._compass,\"ResetBearing\"),this.options.visualizePitch&&e.on(\"pitch\",this._rotateCompassArrow),e.on(\"rotate\",this._rotateCompassArrow),this._rotateCompassArrow(),this._handler=new un(e,this._compass,this.options.visualizePitch)),this._container}onRemove(){const e=this._map;e&&(this._container.remove(),this.options.showZoom&&e.off(\"zoom\",this._updateZoomButtons),this.options.showCompass&&(this.options.visualizePitch&&e.off(\"pitch\",this._rotateCompassArrow),e.off(\"rotate\",this._rotateCompassArrow),this._handler&&this._handler.off(),this._handler=void 0),this._map=void 0);}_createButton(e,t){const i=n(\"button\",e,this._container);return i.type=\"button\",i.addEventListener(\"click\",t),i}_setButtonTitle(e,t){if(!this._map)return;const i=this._map._getUIString(`NavigationControl.${t}`);e.setAttribute(\"aria-label\",i),e.firstElementChild&&e.firstElementChild.setAttribute(\"title\",i);}},GeolocateControl:class extends e.Evented{constructor(t){super(),this.options=e.extend({geolocation:e.window.navigator.geolocation},_n,t),e.bindAll([\"_onSuccess\",\"_onError\",\"_onZoom\",\"_finish\",\"_setupUI\",\"_updateCamera\",\"_updateMarker\",\"_updateMarkerRotation\",\"_onDeviceOrientation\"],this),this._updateMarkerRotationThrottled=Jo(this._updateMarkerRotation,20),this._numberOfWatches=0;}onAdd(e){return this._map=e,this._container=n(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),this._checkGeolocationSupport(this._setupUI),this._container}onRemove(){void 0!==this._geolocationWatchID&&(this.options.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker&&this._userLocationDotMarker.remove(),this.options.showAccuracyCircle&&this._accuracyCircleMarker&&this._accuracyCircleMarker.remove(),this._container.remove(),this._map.off(\"zoom\",this._onZoom),this._map=void 0,this._numberOfWatches=0,this._noTimeout=!1;}_checkGeolocationSupport(t){const i=(e=!!this.options.geolocation)=>{this._supportsGeolocation=e,t(e);};void 0!==this._supportsGeolocation?t(this._supportsGeolocation):void 0!==e.window.navigator.permissions?e.window.navigator.permissions.query({name:\"geolocation\"}).then((e=>i(\"denied\"!==e.state))).catch((()=>i())):i();}_isOutOfMapMaxBounds(e){const t=this._map.getMaxBounds(),i=e.coords;return !!t&&(i.longitude<t.getWest()||i.longitude>t.getEast()||i.latitude<t.getSouth()||i.latitude>t.getNorth())}_setErrorState(){switch(this._watchState){case\"WAITING_ACTIVE\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\");break;case\"ACTIVE_LOCK\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\");break;case\"BACKGROUND\":this._watchState=\"BACKGROUND_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\");}}_onSuccess(t){if(this._map){if(this._isOutOfMapMaxBounds(t))return this._setErrorState(),this.fire(new e.Event(\"outofmaxbounds\",t)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=t,this._watchState){case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"BACKGROUND\":case\"BACKGROUND_ERROR\":this._watchState=\"BACKGROUND\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\");}this.options.showUserLocation&&\"OFF\"!==this._watchState&&this._updateMarker(t),this.options.trackUserLocation&&\"ACTIVE_LOCK\"!==this._watchState||this._updateCamera(t),this.options.showUserLocation&&this._dotElement.classList.remove(\"mapboxgl-user-location-dot-stale\"),this.fire(new e.Event(\"geolocate\",t)),this._finish();}}_updateCamera(t){const i=new e.LngLat(t.coords.longitude,t.coords.latitude),o=t.coords.accuracy,r=this._map.getBearing(),n=e.extend({bearing:r},this.options.fitBoundsOptions);this._map.fitBounds(i.toBounds(o),n,{geolocateSource:!0});}_updateMarker(t){if(t){const i=new e.LngLat(t.coords.longitude,t.coords.latitude);this._accuracyCircleMarker.setLngLat(i).addTo(this._map),this._userLocationDotMarker.setLngLat(i).addTo(this._map),this._accuracy=t.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius();}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove();}_updateCircleRadius(){const t=this._map.transform,i=e.mercatorZfromAltitude(1,t._center.lat)*t.worldSize,o=Math.ceil(2*this._accuracy*i);this._circleElement.style.width=`${o}px`,this._circleElement.style.height=`${o}px`;}_onZoom(){this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius();}_updateMarkerRotation(){this._userLocationDotMarker&&\"number\"==typeof this._heading?(this._userLocationDotMarker.setRotation(this._heading),this._dotElement.classList.add(\"mapboxgl-user-location-show-heading\")):(this._dotElement.classList.remove(\"mapboxgl-user-location-show-heading\"),this._userLocationDotMarker.setRotation(0));}_onError(t){if(this._map){if(this.options.trackUserLocation)if(1===t.code){this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.disabled=!0;const e=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.setAttribute(\"aria-label\",e),this._geolocateButton.firstElementChild&&this._geolocateButton.firstElementChild.setAttribute(\"title\",e),void 0!==this._geolocationWatchID&&this._clearWatch();}else {if(3===t.code&&this._noTimeout)return;this._setErrorState();}\"OFF\"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add(\"mapboxgl-user-location-dot-stale\"),this.fire(new e.Event(\"error\",t)),this._finish();}}_finish(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0;}_setupUI(t){if(void 0!==this._map){if(this._container.addEventListener(\"contextmenu\",(e=>e.preventDefault())),this._geolocateButton=n(\"button\",\"mapboxgl-ctrl-geolocate\",this._container),n(\"span\",\"mapboxgl-ctrl-icon\",this._geolocateButton).setAttribute(\"aria-hidden\",\"true\"),this._geolocateButton.type=\"button\",!1===t){e.warnOnce(\"Geolocation support is not available so the GeolocateControl will be disabled.\");const t=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.disabled=!0,this._geolocateButton.setAttribute(\"aria-label\",t),this._geolocateButton.firstElementChild&&this._geolocateButton.firstElementChild.setAttribute(\"title\",t);}else {const e=this._map._getUIString(\"GeolocateControl.FindMyLocation\");this._geolocateButton.setAttribute(\"aria-label\",e),this._geolocateButton.firstElementChild&&this._geolocateButton.firstElementChild.setAttribute(\"title\",e);}this.options.trackUserLocation&&(this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this._watchState=\"OFF\"),this.options.showUserLocation&&(this._dotElement=n(\"div\",\"mapboxgl-user-location\"),this._dotElement.appendChild(n(\"div\",\"mapboxgl-user-location-dot\")),this._dotElement.appendChild(n(\"div\",\"mapboxgl-user-location-heading\")),this._userLocationDotMarker=new on({element:this._dotElement,rotationAlignment:\"map\",pitchAlignment:\"map\"}),this._circleElement=n(\"div\",\"mapboxgl-user-location-accuracy-circle\"),this._accuracyCircleMarker=new on({element:this._circleElement,pitchAlignment:\"map\"}),this.options.trackUserLocation&&(this._watchState=\"OFF\"),this._map.on(\"zoom\",this._onZoom)),this._geolocateButton.addEventListener(\"click\",this.trigger.bind(this)),this._setup=!0,this.options.trackUserLocation&&this._map.on(\"movestart\",(t=>{t.geolocateSource||\"ACTIVE_LOCK\"!==this._watchState||t.originalEvent&&\"resize\"===t.originalEvent.type||(this._watchState=\"BACKGROUND\",this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this.fire(new e.Event(\"trackuserlocationend\")));}));}}_onDeviceOrientation(e){this._userLocationDotMarker&&(e.webkitCompassHeading?this._heading=e.webkitCompassHeading:!0===e.absolute&&(this._heading=-1*e.alpha),this._updateMarkerRotationThrottled());}trigger(){if(!this._setup)return e.warnOnce(\"Geolocate control triggered before added to a map\"),!1;if(this.options.trackUserLocation){switch(this._watchState){case\"OFF\":this._watchState=\"WAITING_ACTIVE\",this.fire(new e.Event(\"trackuserlocationstart\"));break;case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":case\"BACKGROUND_ERROR\":this._numberOfWatches--,this._noTimeout=!1,this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this.fire(new e.Event(\"trackuserlocationend\"));break;case\"BACKGROUND\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new e.Event(\"trackuserlocationstart\"));}switch(this._watchState){case\"WAITING_ACTIVE\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"ACTIVE_LOCK\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"ACTIVE_ERROR\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\");break;case\"BACKGROUND\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\");break;case\"BACKGROUND_ERROR\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background-error\");}if(\"OFF\"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){let e;this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"true\"),this._numberOfWatches++,this._numberOfWatches>1?(e={maximumAge:6e5,timeout:0},this._noTimeout=!0):(e=this.options.positionOptions,this._noTimeout=!1),this._geolocationWatchID=this.options.geolocation.watchPosition(this._onSuccess,this._onError,e),this.options.showUserHeading&&this._addDeviceOrientationListener();}}else this.options.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return !0}_addDeviceOrientationListener(){const t=()=>{e.window.addEventListener(\"ondeviceorientationabsolute\"in e.window?\"deviceorientationabsolute\":\"deviceorientation\",this._onDeviceOrientation);};void 0!==e.window.DeviceMotionEvent&&\"function\"==typeof e.window.DeviceMotionEvent.requestPermission?DeviceOrientationEvent.requestPermission().then((e=>{\"granted\"===e&&t();})).catch(console.error):t();}_clearWatch(){this.options.geolocation.clearWatch(this._geolocationWatchID),e.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),e.window.removeEventListener(\"deviceorientationabsolute\",this._onDeviceOrientation),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this.options.showUserLocation&&this._updateMarker(null);}},AttributionControl:Kr,ScaleControl:class{constructor(t){this.options=e.extend({},dn,t),function(){try{return new Intl.NumberFormat(\"en\",{style:\"unit\",unitDisplay:\"narrow\",unit:\"meter\"}),!0}catch(e){return !1}}()||(this._setScale=pn.bind(this)),e.bindAll([\"_update\",\"_setScale\",\"setUnit\"],this);}getDefaultPosition(){return \"bottom-left\"}_update(){const e=this.options.maxWidth||100,t=this._map,i=t._containerHeight/2,o=t._containerWidth/2-e/2,r=t.unproject([o,i]),n=t.unproject([o+e,i]),s=r.distanceTo(n);if(\"imperial\"===this.options.unit){const t=3.2808*s;t>5280?this._setScale(e,t/5280,\"mile\"):this._setScale(e,t,\"foot\");}else \"nautical\"===this.options.unit?this._setScale(e,s/1852,\"nautical-mile\"):s>=1e3?this._setScale(e,s/1e3,\"kilometer\"):this._setScale(e,s,\"meter\");}_setScale(e,t,i){const o=mn(t),r=o/t;this._map._requestDomTask((()=>{this._container.style.width=e*r+\"px\",this._container.innerHTML=\"nautical-mile\"!==i?new Intl.NumberFormat(this._language,{style:\"unit\",unitDisplay:\"narrow\",unit:i}).format(o):`${o}&nbsp;nm`;}));}onAdd(e){return this._map=e,this._language=e.getLanguage(),this._container=n(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-scale\",e.getContainer()),this._container.dir=\"auto\",this._map.on(\"move\",this._update),this._update(),this._container}onRemove(){this._container.remove(),this._map.off(\"move\",this._update),this._map=void 0;}_setLanguage(e){this._language=e,this._update();}setUnit(e){this.options.unit=e,this._update();}},FullscreenControl:class{constructor(t){this._fullscreen=!1,t&&t.container&&(t.container instanceof e.window.HTMLElement?this._container=t.container:e.warnOnce(\"Full screen control 'container' must be a DOM element.\")),e.bindAll([\"_onClickFullscreen\",\"_changeIcon\"],this),\"onfullscreenchange\"in e.window.document?this._fullscreenchange=\"fullscreenchange\":\"onwebkitfullscreenchange\"in e.window.document&&(this._fullscreenchange=\"webkitfullscreenchange\");}onAdd(t){return this._map=t,this._container||(this._container=this._map.getContainer()),this._controlContainer=n(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),this._checkFullscreenSupport()?this._setupUI():(this._controlContainer.style.display=\"none\",e.warnOnce(\"This device does not support fullscreen mode.\")),this._controlContainer}onRemove(){this._controlContainer.remove(),this._map=null,e.window.document.removeEventListener(this._fullscreenchange,this._changeIcon);}_checkFullscreenSupport(){return !(!e.window.document.fullscreenEnabled&&!e.window.document.webkitFullscreenEnabled)}_setupUI(){const t=this._fullscreenButton=n(\"button\",\"mapboxgl-ctrl-fullscreen\",this._controlContainer);n(\"span\",\"mapboxgl-ctrl-icon\",t).setAttribute(\"aria-hidden\",\"true\"),t.type=\"button\",this._updateTitle(),this._fullscreenButton.addEventListener(\"click\",this._onClickFullscreen),e.window.document.addEventListener(this._fullscreenchange,this._changeIcon);}_updateTitle(){const e=this._getTitle();this._fullscreenButton.setAttribute(\"aria-label\",e),this._fullscreenButton.firstElementChild&&this._fullscreenButton.firstElementChild.setAttribute(\"title\",e);}_getTitle(){return this._map._getUIString(this._isFullscreen()?\"FullscreenControl.Exit\":\"FullscreenControl.Enter\")}_isFullscreen(){return this._fullscreen}_changeIcon(){(e.window.document.fullscreenElement||e.window.document.webkitFullscreenElement)===this._container!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle(\"mapboxgl-ctrl-shrink\"),this._fullscreenButton.classList.toggle(\"mapboxgl-ctrl-fullscreen\"),this._updateTitle());}_onClickFullscreen(){this._isFullscreen()?e.window.document.exitFullscreen?e.window.document.exitFullscreen():e.window.document.webkitCancelFullScreen&&e.window.document.webkitCancelFullScreen():this._container.requestFullscreen?this._container.requestFullscreen():this._container.webkitRequestFullscreen&&this._container.webkitRequestFullscreen();}},Popup:class extends e.Evented{constructor(t){super(),this.options=e.extend(Object.create(rn),t),e.bindAll([\"_update\",\"_onClose\",\"remove\",\"_onMouseEvent\"],this),this._classList=new Set(t&&t.className?t.className.trim().split(/\\s+/):[]);}addTo(t){return this._map&&this.remove(),this._map=t,this.options.closeOnClick&&t.on(\"preclick\",this._onClose),this.options.closeOnMove&&t.on(\"move\",this._onClose),t.on(\"remove\",this.remove),this._update(),t._addPopup(this),this._focusFirstElement(),this._trackPointer?(t.on(\"mousemove\",this._onMouseEvent),t.on(\"mouseup\",this._onMouseEvent),t._canvasContainer.classList.add(\"mapboxgl-track-pointer\")):t.on(\"move\",this._update),this.fire(new e.Event(\"open\")),this}isOpen(){return !!this._map}remove(){this._content&&this._content.remove(),this._container&&(this._container.remove(),this._container=void 0);const t=this._map;return t&&(t.off(\"move\",this._update),t.off(\"move\",this._onClose),t.off(\"preclick\",this._onClose),t.off(\"click\",this._onClose),t.off(\"remove\",this.remove),t.off(\"mousemove\",this._onMouseEvent),t.off(\"mouseup\",this._onMouseEvent),t.off(\"drag\",this._onMouseEvent),t._canvasContainer&&t._canvasContainer.classList.remove(\"mapboxgl-track-pointer\"),t._removePopup(this),this._map=void 0),this.fire(new e.Event(\"close\")),this}getLngLat(){return this._lngLat}setLngLat(t){this._lngLat=e.LngLat.convert(t),this._pos=null,this._trackPointer=!1,this._update();const i=this._map;return i&&(i.on(\"move\",this._update),i.off(\"mousemove\",this._onMouseEvent),i._canvasContainer.classList.remove(\"mapboxgl-track-pointer\")),this}trackPointer(){this._trackPointer=!0,this._pos=null,this._update();const e=this._map;return e&&(e.off(\"move\",this._update),e.on(\"mousemove\",this._onMouseEvent),e.on(\"drag\",this._onMouseEvent),e._canvasContainer.classList.add(\"mapboxgl-track-pointer\")),this}getElement(){return this._container}setText(t){return this.setDOMContent(e.window.document.createTextNode(t))}setHTML(t){const i=e.window.document.createDocumentFragment(),o=e.window.document.createElement(\"body\");let r;for(o.innerHTML=t;r=o.firstChild,r;)i.appendChild(r);return this.setDOMContent(i)}getMaxWidth(){return this._container&&this._container.style.maxWidth}setMaxWidth(e){return this.options.maxWidth=e,this._update(),this}setDOMContent(e){let t=this._content;if(t)for(;t.hasChildNodes();)t.firstChild&&t.removeChild(t.firstChild);else t=this._content=n(\"div\",\"mapboxgl-popup-content\",this._container||void 0);if(t.appendChild(e),this.options.closeButton){const e=this._closeButton=n(\"button\",\"mapboxgl-popup-close-button\",t);e.type=\"button\",e.setAttribute(\"aria-label\",\"Close popup\"),e.setAttribute(\"aria-hidden\",\"true\"),e.innerHTML=\"&#215;\",e.addEventListener(\"click\",this._onClose);}return this._update(),this._focusFirstElement(),this}addClassName(e){return this._classList.add(e),this._updateClassList(),this}removeClassName(e){return this._classList.delete(e),this._updateClassList(),this}setOffset(e){return this.options.offset=e,this._update(),this}toggleClassName(e){let t;return this._classList.delete(e)?t=!1:(this._classList.add(e),t=!0),this._updateClassList(),t}_onMouseEvent(e){this._update(e.point);}_getAnchor(e){if(this.options.anchor)return this.options.anchor;const t=this._map,i=this._container,o=this._pos;if(!t||!i||!o)return \"bottom\";const r=i.offsetWidth,n=i.offsetHeight,s=o.x<r/2,a=o.x>t.transform.width-r/2;if(o.y+e<n)return s?\"top-left\":a?\"top-right\":\"top\";if(o.y>t.transform.height-n){if(s)return \"bottom-left\";if(a)return \"bottom-right\"}return s?\"left\":a?\"right\":\"bottom\"}_updateClassList(){const e=this._container;if(!e)return;const t=[...this._classList];t.push(\"mapboxgl-popup\"),this._anchor&&t.push(`mapboxgl-popup-anchor-${this._anchor}`),this._trackPointer&&t.push(\"mapboxgl-popup-track-pointer\"),e.className=t.join(\" \");}_update(t){const i=this._map,o=this._content;if(!i||!this._lngLat&&!this._trackPointer||!o)return;let r=this._container;if(r||(r=this._container=n(\"div\",\"mapboxgl-popup\",i.getContainer()),this._tip=n(\"div\",\"mapboxgl-popup-tip\",r),r.appendChild(o)),this.options.maxWidth&&r.style.maxWidth!==this.options.maxWidth&&(r.style.maxWidth=this.options.maxWidth),i.transform.renderWorldCopies&&!this._trackPointer&&(this._lngLat=en(this._lngLat,this._pos,i.transform)),!this._trackPointer||t){const e=this._pos=this._trackPointer&&t?t:i.project(this._lngLat),o=sn(this.options.offset),r=this._anchor=this._getAnchor(o.y),n=sn(this.options.offset,r),s=e.add(n).round();i._requestDomTask((()=>{this._container&&r&&(this._container.style.transform=`${tn[r]} translate(${s.x}px,${s.y}px)`);}));}if(!this._marker&&i._showingGlobe()){const t=e.isLngLatBehindGlobe(i.transform,this._lngLat)?0:1;this._setOpacity(t);}this._updateClassList();}_focusFirstElement(){if(!this.options.focusAfterOpen||!this._container)return;const e=this._container.querySelector(nn);e&&e.focus();}_onClose(){this.remove();}_setOpacity(e){this._container&&(this._container.style.opacity=`${e}`),this._content&&(this._content.style.pointerEvents=e?\"auto\":\"none\");}},Marker:on,Style:Qt,LngLat:e.LngLat,LngLatBounds:e.LngLatBounds,Point:e.pointGeometry,MercatorCoordinate:e.MercatorCoordinate,FreeCameraOptions:Zo,Evented:e.Evented,config:e.config,prewarm:function(){je().acquire(Ue);},clearPrewarmedResources:function(){const e=Ge;e&&(e.isPreloaded()&&1===e.numActive()?(e.release(Ue),Ge=null):console.warn(\"Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()\"));},get accessToken(){return e.config.ACCESS_TOKEN},set accessToken(t){e.config.ACCESS_TOKEN=t;},get baseApiUrl(){return e.config.API_URL},set baseApiUrl(t){e.config.API_URL=t;},get workerCount(){return Ne.workerCount},set workerCount(e){Ne.workerCount=e;},get maxParallelImageRequests(){return e.config.MAX_PARALLEL_IMAGE_REQUESTS},set maxParallelImageRequests(t){e.config.MAX_PARALLEL_IMAGE_REQUESTS=t;},clearStorage(t){e.clearTileCache(t);},workerUrl:\"\",workerClass:null,setNow:e.exported.setNow,restoreNow:e.exported.restoreNow};return fn}));\n\n//\n\nvar mapboxgl$1 = mapboxgl;\n\nreturn mapboxgl$1;\n\n}));\n//# sourceMappingURL=mapbox-gl.js.map\n","export const createAbortError = () => new DOMException('', 'AbortError');\n//# sourceMappingURL=abort-error.js.map","export const createAddActiveInputConnectionToAudioNode = (insertElementInSet) => {\n    return (activeInputs, source, [output, input, eventListener], ignoreDuplicates) => {\n        insertElementInSet(activeInputs[input], [source, output, eventListener], (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output, ignoreDuplicates);\n    };\n};\n//# sourceMappingURL=add-active-input-connection-to-audio-node.js.map","export const createAddAudioNodeConnections = (audioNodeConnectionsStore) => {\n    return (audioNode, audioNodeRenderer, nativeAudioNode) => {\n        const activeInputs = [];\n        for (let i = 0; i < nativeAudioNode.numberOfInputs; i += 1) {\n            activeInputs.push(new Set());\n        }\n        audioNodeConnectionsStore.set(audioNode, {\n            activeInputs,\n            outputs: new Set(),\n            passiveInputs: new WeakMap(),\n            renderer: audioNodeRenderer\n        });\n    };\n};\n//# sourceMappingURL=add-audio-node-connections.js.map","export const createAddAudioParamConnections = (audioParamConnectionsStore) => {\n    return (audioParam, audioParamRenderer) => {\n        audioParamConnectionsStore.set(audioParam, { activeInputs: new Set(), passiveInputs: new WeakMap(), renderer: audioParamRenderer });\n    };\n};\n//# sourceMappingURL=add-audio-param-connections.js.map","export const ACTIVE_AUDIO_NODE_STORE = new WeakSet();\nexport const AUDIO_NODE_CONNECTIONS_STORE = new WeakMap();\nexport const AUDIO_NODE_STORE = new WeakMap();\nexport const AUDIO_PARAM_CONNECTIONS_STORE = new WeakMap();\nexport const AUDIO_PARAM_STORE = new WeakMap();\nexport const CONTEXT_STORE = new WeakMap();\nexport const EVENT_LISTENERS = new WeakMap();\nexport const CYCLE_COUNTERS = new WeakMap();\n// This clunky name is borrowed from the spec. :-)\nexport const NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS = new WeakMap();\nexport const NODE_TO_PROCESSOR_MAPS = new WeakMap();\n//# sourceMappingURL=globals.js.map","const handler = {\n    construct() {\n        return handler;\n    }\n};\nexport const isConstructible = (constructible) => {\n    try {\n        const proxy = new Proxy(constructible, handler);\n        new proxy(); // tslint:disable-line:no-unused-expression\n    }\n    catch {\n        return false;\n    }\n    return true;\n};\n//# sourceMappingURL=is-constructible.js.map","/*\n * This massive regex tries to cover all the following cases.\n *\n * import './path';\n * import defaultImport from './path';\n * import { namedImport } from './path';\n * import { namedImport as renamendImport } from './path';\n * import * as namespaceImport from './path';\n * import defaultImport, { namedImport } from './path';\n * import defaultImport, { namedImport as renamendImport } from './path';\n * import defaultImport, * as namespaceImport from './path';\n */\nconst IMPORT_STATEMENT_REGEX = /^import(?:(?:[\\s]+[\\w]+|(?:[\\s]+[\\w]+[\\s]*,)?[\\s]*\\{[\\s]*[\\w]+(?:[\\s]+as[\\s]+[\\w]+)?(?:[\\s]*,[\\s]*[\\w]+(?:[\\s]+as[\\s]+[\\w]+)?)*[\\s]*}|(?:[\\s]+[\\w]+[\\s]*,)?[\\s]*\\*[\\s]+as[\\s]+[\\w]+)[\\s]+from)?(?:[\\s]*)(\"([^\"\\\\]|\\\\.)+\"|'([^'\\\\]|\\\\.)+')(?:[\\s]*);?/; // tslint:disable-line:max-line-length\nexport const splitImportStatements = (source, url) => {\n    const importStatements = [];\n    let sourceWithoutImportStatements = source.replace(/^[\\s]+/, '');\n    let result = sourceWithoutImportStatements.match(IMPORT_STATEMENT_REGEX);\n    while (result !== null) {\n        const unresolvedUrl = result[1].slice(1, -1);\n        const importStatementWithResolvedUrl = result[0]\n            .replace(/([\\s]+)?;?$/, '')\n            .replace(unresolvedUrl, new URL(unresolvedUrl, url).toString());\n        importStatements.push(importStatementWithResolvedUrl);\n        sourceWithoutImportStatements = sourceWithoutImportStatements.slice(result[0].length).replace(/^[\\s]+/, '');\n        result = sourceWithoutImportStatements.match(IMPORT_STATEMENT_REGEX);\n    }\n    return [importStatements.join(';'), sourceWithoutImportStatements];\n};\n//# sourceMappingURL=split-import-statements.js.map","import { NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS } from '../globals';\nimport { isConstructible } from '../helpers/is-constructible';\nimport { splitImportStatements } from '../helpers/split-import-statements';\nconst verifyParameterDescriptors = (parameterDescriptors) => {\n    if (parameterDescriptors !== undefined && !Array.isArray(parameterDescriptors)) {\n        throw new TypeError('The parameterDescriptors property of given value for processorCtor is not an array.');\n    }\n};\nconst verifyProcessorCtor = (processorCtor) => {\n    if (!isConstructible(processorCtor)) {\n        throw new TypeError('The given value for processorCtor should be a constructor.');\n    }\n    if (processorCtor.prototype === null || typeof processorCtor.prototype !== 'object') {\n        throw new TypeError('The given value for processorCtor should have a prototype.');\n    }\n};\nexport const createAddAudioWorkletModule = (cacheTestResult, createNotSupportedError, evaluateSource, exposeCurrentFrameAndCurrentTime, fetchSource, getNativeContext, getOrCreateBackupOfflineAudioContext, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor, ongoingRequests, resolvedRequests, testAudioWorkletProcessorPostMessageSupport, window) => {\n    let index = 0;\n    return (context, moduleURL, options = { credentials: 'omit' }) => {\n        const resolvedRequestsOfContext = resolvedRequests.get(context);\n        if (resolvedRequestsOfContext !== undefined && resolvedRequestsOfContext.has(moduleURL)) {\n            return Promise.resolve();\n        }\n        const ongoingRequestsOfContext = ongoingRequests.get(context);\n        if (ongoingRequestsOfContext !== undefined) {\n            const promiseOfOngoingRequest = ongoingRequestsOfContext.get(moduleURL);\n            if (promiseOfOngoingRequest !== undefined) {\n                return promiseOfOngoingRequest;\n            }\n        }\n        const nativeContext = getNativeContext(context);\n        // Bug #59: Safari does not implement the audioWorklet property.\n        const promise = nativeContext.audioWorklet === undefined\n            ? fetchSource(moduleURL)\n                .then(([source, absoluteUrl]) => {\n                const [importStatements, sourceWithoutImportStatements] = splitImportStatements(source, absoluteUrl);\n                /*\n                 * This is the unminified version of the code used below:\n                 *\n                 * ```js\n                 * ${ importStatements };\n                 * ((a, b) => {\n                 *     (a[b] = a[b] || [ ]).push(\n                 *         (AudioWorkletProcessor, global, registerProcessor, sampleRate, self, window) => {\n                 *             ${ sourceWithoutImportStatements }\n                 *         }\n                 *     );\n                 * })(window, '_AWGS');\n                 * ```\n                 */\n                // tslint:disable-next-line:max-line-length\n                const wrappedSource = `${importStatements};((a,b)=>{(a[b]=a[b]||[]).push((AudioWorkletProcessor,global,registerProcessor,sampleRate,self,window)=>{${sourceWithoutImportStatements}\n})})(window,'_AWGS')`;\n                // @todo Evaluating the given source code is a possible security problem.\n                return evaluateSource(wrappedSource);\n            })\n                .then(() => {\n                const evaluateAudioWorkletGlobalScope = window._AWGS.pop();\n                if (evaluateAudioWorkletGlobalScope === undefined) {\n                    // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n                    throw new SyntaxError();\n                }\n                exposeCurrentFrameAndCurrentTime(nativeContext.currentTime, nativeContext.sampleRate, () => evaluateAudioWorkletGlobalScope(class AudioWorkletProcessor {\n                }, undefined, (name, processorCtor) => {\n                    if (name.trim() === '') {\n                        throw createNotSupportedError();\n                    }\n                    const nodeNameToProcessorConstructorMap = NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS.get(nativeContext);\n                    if (nodeNameToProcessorConstructorMap !== undefined) {\n                        if (nodeNameToProcessorConstructorMap.has(name)) {\n                            throw createNotSupportedError();\n                        }\n                        verifyProcessorCtor(processorCtor);\n                        verifyParameterDescriptors(processorCtor.parameterDescriptors);\n                        nodeNameToProcessorConstructorMap.set(name, processorCtor);\n                    }\n                    else {\n                        verifyProcessorCtor(processorCtor);\n                        verifyParameterDescriptors(processorCtor.parameterDescriptors);\n                        NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS.set(nativeContext, new Map([[name, processorCtor]]));\n                    }\n                }, nativeContext.sampleRate, undefined, undefined));\n            })\n            : Promise.all([\n                fetchSource(moduleURL),\n                Promise.resolve(cacheTestResult(testAudioWorkletProcessorPostMessageSupport, testAudioWorkletProcessorPostMessageSupport))\n            ]).then(([[source, absoluteUrl], isSupportingPostMessage]) => {\n                const currentIndex = index + 1;\n                index = currentIndex;\n                const [importStatements, sourceWithoutImportStatements] = splitImportStatements(source, absoluteUrl);\n                /*\n                 * Bug #179: Firefox does not allow to transfer any buffer which has been passed to the process() method as an argument.\n                 *\n                 * This is the unminified version of the code used below.\n                 *\n                 * ```js\n                 * class extends AudioWorkletProcessor {\n                 *\n                 *     __buffers = new WeakSet();\n                 *\n                 *     constructor () {\n                 *         super();\n                 *\n                 *         this.port.postMessage = ((postMessage) => {\n                 *             return (message, transferables) => {\n                 *                 const filteredTransferables = (transferables)\n                 *                     ? transferables.filter((transferable) => !this.__buffers.has(transferable))\n                 *                     : transferables;\n                 *\n                 *                 return postMessage.call(this.port, message, filteredTransferables);\n                 *              };\n                 *         })(this.port.postMessage);\n                 *     }\n                 * }\n                 * ```\n                 */\n                const patchedAudioWorkletProcessor = isSupportingPostMessage\n                    ? 'AudioWorkletProcessor'\n                    : 'class extends AudioWorkletProcessor {__b=new WeakSet();constructor(){super();(p=>p.postMessage=(q=>(m,t)=>q.call(p,m,t?t.filter(u=>!this.__b.has(u)):t))(p.postMessage))(this.port)}}';\n                /*\n                 * Bug #170: Chrome and Edge do call process() with an array with empty channelData for each input if no input is connected.\n                 *\n                 * Bug #179: Firefox does not allow to transfer any buffer which has been passed to the process() method as an argument.\n                 *\n                 * Bug #190: Safari doesn't throw an error when loading an unparsable module.\n                 *\n                 * This is the unminified version of the code used below:\n                 *\n                 * ```js\n                 * `${ importStatements };\n                 * ((AudioWorkletProcessor, registerProcessor) => {${ sourceWithoutImportStatements }\n                 * })(\n                 *     ${ patchedAudioWorkletProcessor },\n                 *     (name, processorCtor) => registerProcessor(name, class extends processorCtor {\n                 *\n                 *         __collectBuffers = (array) => {\n                 *             array.forEach((element) => this.__buffers.add(element.buffer));\n                 *         };\n                 *\n                 *         process (inputs, outputs, parameters) {\n                 *             inputs.forEach(this.__collectBuffers);\n                 *             outputs.forEach(this.__collectBuffers);\n                 *             this.__collectBuffers(Object.values(parameters));\n                 *\n                 *             return super.process(\n                 *                 (inputs.map((input) => input.some((channelData) => channelData.length === 0)) ? [ ] : input),\n                 *                 outputs,\n                 *                 parameters\n                 *             );\n                 *         }\n                 *\n                 *     })\n                 * );\n                 *\n                 * registerProcessor(`__sac${currentIndex}`, class extends AudioWorkletProcessor{\n                 *\n                 *     process () {\n                 *         return false;\n                 *     }\n                 *\n                 * })`\n                 * ```\n                 */\n                const memberDefinition = isSupportingPostMessage ? '' : '__c = (a) => a.forEach(e=>this.__b.add(e.buffer));';\n                const bufferRegistration = isSupportingPostMessage\n                    ? ''\n                    : 'i.forEach(this.__c);o.forEach(this.__c);this.__c(Object.values(p));';\n                const wrappedSource = `${importStatements};((AudioWorkletProcessor,registerProcessor)=>{${sourceWithoutImportStatements}\n})(${patchedAudioWorkletProcessor},(n,p)=>registerProcessor(n,class extends p{${memberDefinition}process(i,o,p){${bufferRegistration}return super.process(i.map(j=>j.some(k=>k.length===0)?[]:j),o,p)}}));registerProcessor('__sac${currentIndex}',class extends AudioWorkletProcessor{process(){return !1}})`;\n                const blob = new Blob([wrappedSource], { type: 'application/javascript; charset=utf-8' });\n                const url = URL.createObjectURL(blob);\n                return nativeContext.audioWorklet\n                    .addModule(url, options)\n                    .then(() => {\n                    if (isNativeOfflineAudioContext(nativeContext)) {\n                        return nativeContext;\n                    }\n                    // Bug #186: Chrome, Edge and Opera do not allow to create an AudioWorkletNode on a closed AudioContext.\n                    const backupOfflineAudioContext = getOrCreateBackupOfflineAudioContext(nativeContext);\n                    return backupOfflineAudioContext.audioWorklet.addModule(url, options).then(() => backupOfflineAudioContext);\n                })\n                    .then((nativeContextOrBackupOfflineAudioContext) => {\n                    if (nativeAudioWorkletNodeConstructor === null) {\n                        throw new SyntaxError();\n                    }\n                    try {\n                        // Bug #190: Safari doesn't throw an error when loading an unparsable module.\n                        new nativeAudioWorkletNodeConstructor(nativeContextOrBackupOfflineAudioContext, `__sac${currentIndex}`); // tslint:disable-line:no-unused-expression\n                    }\n                    catch {\n                        throw new SyntaxError();\n                    }\n                })\n                    .finally(() => URL.revokeObjectURL(url));\n            });\n        if (ongoingRequestsOfContext === undefined) {\n            ongoingRequests.set(context, new Map([[moduleURL, promise]]));\n        }\n        else {\n            ongoingRequestsOfContext.set(moduleURL, promise);\n        }\n        promise\n            .then(() => {\n            const updatedResolvedRequestsOfContext = resolvedRequests.get(context);\n            if (updatedResolvedRequestsOfContext === undefined) {\n                resolvedRequests.set(context, new Set([moduleURL]));\n            }\n            else {\n                updatedResolvedRequestsOfContext.add(moduleURL);\n            }\n        })\n            .finally(() => {\n            const updatedOngoingRequestsOfContext = ongoingRequests.get(context);\n            if (updatedOngoingRequestsOfContext !== undefined) {\n                updatedOngoingRequestsOfContext.delete(moduleURL);\n            }\n        });\n        return promise;\n    };\n};\n//# sourceMappingURL=add-audio-worklet-module.js.map","export const getValueForKey = (map, key) => {\n    const value = map.get(key);\n    if (value === undefined) {\n        throw new Error('A value with the given key could not be found.');\n    }\n    return value;\n};\n//# sourceMappingURL=get-value-for-key.js.map","export const pickElementFromSet = (set, predicate) => {\n    const matchingElements = Array.from(set).filter(predicate);\n    if (matchingElements.length > 1) {\n        throw Error('More than one element was found.');\n    }\n    if (matchingElements.length === 0) {\n        throw Error('No element was found.');\n    }\n    const [matchingElement] = matchingElements;\n    set.delete(matchingElement);\n    return matchingElement;\n};\n//# sourceMappingURL=pick-element-from-set.js.map","import { getValueForKey } from './get-value-for-key';\nimport { pickElementFromSet } from './pick-element-from-set';\nexport const deletePassiveInputConnectionToAudioNode = (passiveInputs, source, output, input) => {\n    const passiveInputConnections = getValueForKey(passiveInputs, source);\n    const matchingConnection = pickElementFromSet(passiveInputConnections, (passiveInputConnection) => passiveInputConnection[0] === output && passiveInputConnection[1] === input);\n    if (passiveInputConnections.size === 0) {\n        passiveInputs.delete(source);\n    }\n    return matchingConnection;\n};\n//# sourceMappingURL=delete-passive-input-connection-to-audio-node.js.map","import { EVENT_LISTENERS } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getEventListenersOfAudioNode = (audioNode) => {\n    return getValueForKey(EVENT_LISTENERS, audioNode);\n};\n//# sourceMappingURL=get-event-listeners-of-audio-node.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nimport { getEventListenersOfAudioNode } from './get-event-listeners-of-audio-node';\nexport const setInternalStateToActive = (audioNode) => {\n    if (ACTIVE_AUDIO_NODE_STORE.has(audioNode)) {\n        throw new Error('The AudioNode is already stored.');\n    }\n    ACTIVE_AUDIO_NODE_STORE.add(audioNode);\n    getEventListenersOfAudioNode(audioNode).forEach((eventListener) => eventListener(true));\n};\n//# sourceMappingURL=set-internal-state-to-active.js.map","export const isAudioWorkletNode = (audioNode) => {\n    return 'port' in audioNode;\n};\n//# sourceMappingURL=audio-worklet-node.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nimport { getEventListenersOfAudioNode } from './get-event-listeners-of-audio-node';\nexport const setInternalStateToPassive = (audioNode) => {\n    if (!ACTIVE_AUDIO_NODE_STORE.has(audioNode)) {\n        throw new Error('The AudioNode is not stored.');\n    }\n    ACTIVE_AUDIO_NODE_STORE.delete(audioNode);\n    getEventListenersOfAudioNode(audioNode).forEach((eventListener) => eventListener(false));\n};\n//# sourceMappingURL=set-internal-state-to-passive.js.map","import { isAudioWorkletNode } from '../guards/audio-worklet-node';\nimport { setInternalStateToPassive } from './set-internal-state-to-passive';\n// Set the internalState of the audioNode to 'passive' if it is not an AudioWorkletNode and if it has no 'active' input connections.\nexport const setInternalStateToPassiveWhenNecessary = (audioNode, activeInputs) => {\n    if (!isAudioWorkletNode(audioNode) && activeInputs.every((connections) => connections.size === 0)) {\n        setInternalStateToPassive(audioNode);\n    }\n};\n//# sourceMappingURL=set-internal-state-to-passive-when-necessary.js.map","import { deletePassiveInputConnectionToAudioNode } from '../helpers/delete-passive-input-connection-to-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassiveWhenNecessary } from '../helpers/set-internal-state-to-passive-when-necessary';\nexport const createAddConnectionToAudioNode = (addActiveInputConnectionToAudioNode, addPassiveInputConnectionToAudioNode, connectNativeAudioNodeToNativeAudioNode, deleteActiveInputConnectionToAudioNode, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getAudioNodeTailTime, getEventListenersOfAudioNode, getNativeAudioNode, insertElementInSet, isActiveAudioNode, isPartOfACycle, isPassiveAudioNode) => {\n    const tailTimeTimeoutIds = new WeakMap();\n    return (source, destination, output, input, isOffline) => {\n        const { activeInputs, passiveInputs } = getAudioNodeConnections(destination);\n        const { outputs } = getAudioNodeConnections(source);\n        const eventListeners = getEventListenersOfAudioNode(source);\n        const eventListener = (isActive) => {\n            const nativeDestinationAudioNode = getNativeAudioNode(destination);\n            const nativeSourceAudioNode = getNativeAudioNode(source);\n            if (isActive) {\n                const partialConnection = deletePassiveInputConnectionToAudioNode(passiveInputs, source, output, input);\n                addActiveInputConnectionToAudioNode(activeInputs, source, partialConnection, false);\n                if (!isOffline && !isPartOfACycle(source)) {\n                    connectNativeAudioNodeToNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output, input);\n                }\n                if (isPassiveAudioNode(destination)) {\n                    setInternalStateToActive(destination);\n                }\n            }\n            else {\n                const partialConnection = deleteActiveInputConnectionToAudioNode(activeInputs, source, output, input);\n                addPassiveInputConnectionToAudioNode(passiveInputs, input, partialConnection, false);\n                if (!isOffline && !isPartOfACycle(source)) {\n                    disconnectNativeAudioNodeFromNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output, input);\n                }\n                const tailTime = getAudioNodeTailTime(destination);\n                if (tailTime === 0) {\n                    if (isActiveAudioNode(destination)) {\n                        setInternalStateToPassiveWhenNecessary(destination, activeInputs);\n                    }\n                }\n                else {\n                    const tailTimeTimeoutId = tailTimeTimeoutIds.get(destination);\n                    if (tailTimeTimeoutId !== undefined) {\n                        clearTimeout(tailTimeTimeoutId);\n                    }\n                    tailTimeTimeoutIds.set(destination, setTimeout(() => {\n                        if (isActiveAudioNode(destination)) {\n                            setInternalStateToPassiveWhenNecessary(destination, activeInputs);\n                        }\n                    }, tailTime * 1000));\n                }\n            }\n        };\n        if (insertElementInSet(outputs, [destination, output, input], (outputConnection) => outputConnection[0] === destination && outputConnection[1] === output && outputConnection[2] === input, true)) {\n            eventListeners.add(eventListener);\n            if (isActiveAudioNode(source)) {\n                addActiveInputConnectionToAudioNode(activeInputs, source, [output, input, eventListener], true);\n            }\n            else {\n                addPassiveInputConnectionToAudioNode(passiveInputs, input, [source, output, eventListener], true);\n            }\n            return true;\n        }\n        return false;\n    };\n};\n//# sourceMappingURL=add-connection-to-audio-node.js.map","export const createAddPassiveInputConnectionToAudioNode = (insertElementInSet) => {\n    return (passiveInputs, input, [source, output, eventListener], ignoreDuplicates) => {\n        const passiveInputConnections = passiveInputs.get(source);\n        if (passiveInputConnections === undefined) {\n            passiveInputs.set(source, new Set([[output, input, eventListener]]));\n        }\n        else {\n            insertElementInSet(passiveInputConnections, [output, input, eventListener], (passiveInputConnection) => passiveInputConnection[0] === output && passiveInputConnection[1] === input, ignoreDuplicates);\n        }\n    };\n};\n//# sourceMappingURL=add-passive-input-connection-to-audio-node.js.map","export const createAddSilentConnection = (createNativeGainNode) => {\n    return (nativeContext, nativeAudioScheduledSourceNode) => {\n        const nativeGainNode = createNativeGainNode(nativeContext, {\n            channelCount: 1,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete',\n            gain: 0\n        });\n        nativeAudioScheduledSourceNode.connect(nativeGainNode).connect(nativeContext.destination);\n        const disconnect = () => {\n            nativeAudioScheduledSourceNode.removeEventListener('ended', disconnect);\n            nativeAudioScheduledSourceNode.disconnect(nativeGainNode);\n            nativeGainNode.disconnect();\n        };\n        nativeAudioScheduledSourceNode.addEventListener('ended', disconnect);\n    };\n};\n//# sourceMappingURL=add-silent-connection.js.map","export const createAddUnrenderedAudioWorkletNode = (getUnrenderedAudioWorkletNodes) => {\n    return (nativeContext, audioWorkletNode) => {\n        getUnrenderedAudioWorkletNodes(nativeContext).add(audioWorkletNode);\n    };\n};\n//# sourceMappingURL=add-unrendered-audio-worklet-node.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    fftSize: 2048,\n    maxDecibels: -30,\n    minDecibels: -100,\n    smoothingTimeConstant: 0.8\n};\nexport const createAnalyserNodeConstructor = (audionNodeConstructor, createAnalyserNodeRenderer, createIndexSizeError, createNativeAnalyserNode, getNativeContext, isNativeOfflineAudioContext) => {\n    return class AnalyserNode extends audionNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeAnalyserNode = createNativeAnalyserNode(nativeContext, mergedOptions);\n            const analyserNodeRenderer = ((isNativeOfflineAudioContext(nativeContext) ? createAnalyserNodeRenderer() : null));\n            super(context, false, nativeAnalyserNode, analyserNodeRenderer);\n            this._nativeAnalyserNode = nativeAnalyserNode;\n        }\n        get fftSize() {\n            return this._nativeAnalyserNode.fftSize;\n        }\n        set fftSize(value) {\n            this._nativeAnalyserNode.fftSize = value;\n        }\n        get frequencyBinCount() {\n            return this._nativeAnalyserNode.frequencyBinCount;\n        }\n        get maxDecibels() {\n            return this._nativeAnalyserNode.maxDecibels;\n        }\n        set maxDecibels(value) {\n            // Bug #118: Safari does not throw an error if maxDecibels is not more than minDecibels.\n            const maxDecibels = this._nativeAnalyserNode.maxDecibels;\n            this._nativeAnalyserNode.maxDecibels = value;\n            if (!(value > this._nativeAnalyserNode.minDecibels)) {\n                this._nativeAnalyserNode.maxDecibels = maxDecibels;\n                throw createIndexSizeError();\n            }\n        }\n        get minDecibels() {\n            return this._nativeAnalyserNode.minDecibels;\n        }\n        set minDecibels(value) {\n            // Bug #118: Safari does not throw an error if maxDecibels is not more than minDecibels.\n            const minDecibels = this._nativeAnalyserNode.minDecibels;\n            this._nativeAnalyserNode.minDecibels = value;\n            if (!(this._nativeAnalyserNode.maxDecibels > value)) {\n                this._nativeAnalyserNode.minDecibels = minDecibels;\n                throw createIndexSizeError();\n            }\n        }\n        get smoothingTimeConstant() {\n            return this._nativeAnalyserNode.smoothingTimeConstant;\n        }\n        set smoothingTimeConstant(value) {\n            this._nativeAnalyserNode.smoothingTimeConstant = value;\n        }\n        getByteFrequencyData(array) {\n            this._nativeAnalyserNode.getByteFrequencyData(array);\n        }\n        getByteTimeDomainData(array) {\n            this._nativeAnalyserNode.getByteTimeDomainData(array);\n        }\n        getFloatFrequencyData(array) {\n            this._nativeAnalyserNode.getFloatFrequencyData(array);\n        }\n        getFloatTimeDomainData(array) {\n            this._nativeAnalyserNode.getFloatTimeDomainData(array);\n        }\n    };\n};\n//# sourceMappingURL=analyser-node-constructor.js.map","export const isOwnedByContext = (nativeAudioNode, nativeContext) => {\n    return nativeAudioNode.context === nativeContext;\n};\n//# sourceMappingURL=is-owned-by-context.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createAnalyserNodeRendererFactory = (createNativeAnalyserNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeAnalyserNodes = new WeakMap();\n        const createAnalyserNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeAnalyserNode = getNativeAudioNode(proxy);\n            // If the initially used nativeAnalyserNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeAnalyserNodeIsOwnedByContext = isOwnedByContext(nativeAnalyserNode, nativeOfflineAudioContext);\n            if (!nativeAnalyserNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeAnalyserNode.channelCount,\n                    channelCountMode: nativeAnalyserNode.channelCountMode,\n                    channelInterpretation: nativeAnalyserNode.channelInterpretation,\n                    fftSize: nativeAnalyserNode.fftSize,\n                    maxDecibels: nativeAnalyserNode.maxDecibels,\n                    minDecibels: nativeAnalyserNode.minDecibels,\n                    smoothingTimeConstant: nativeAnalyserNode.smoothingTimeConstant\n                };\n                nativeAnalyserNode = createNativeAnalyserNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeAnalyserNodes.set(nativeOfflineAudioContext, nativeAnalyserNode);\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAnalyserNode);\n            return nativeAnalyserNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeAnalyserNode = renderedNativeAnalyserNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeAnalyserNode !== undefined) {\n                    return Promise.resolve(renderedNativeAnalyserNode);\n                }\n                return createAnalyserNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=analyser-node-renderer-factory.js.map","export const testAudioBufferCopyChannelMethodsOutOfBoundsSupport = (nativeAudioBuffer) => {\n    try {\n        nativeAudioBuffer.copyToChannel(new Float32Array(1), 0, -1);\n    }\n    catch {\n        return false;\n    }\n    return true;\n};\n//# sourceMappingURL=test-audio-buffer-copy-channel-methods-out-of-bounds-support.js.map","export const createIndexSizeError = () => new DOMException('', 'IndexSizeError');\n//# sourceMappingURL=index-size-error.js.map","import { createIndexSizeError } from '../factories/index-size-error';\nexport const wrapAudioBufferGetChannelDataMethod = (audioBuffer) => {\n    audioBuffer.getChannelData = ((getChannelData) => {\n        return (channel) => {\n            try {\n                return getChannelData.call(audioBuffer, channel);\n            }\n            catch (err) {\n                if (err.code === 12) {\n                    throw createIndexSizeError();\n                }\n                throw err;\n            }\n        };\n    })(audioBuffer.getChannelData);\n};\n//# sourceMappingURL=wrap-audio-buffer-get-channel-data-method.js.map","import { testAudioBufferCopyChannelMethodsOutOfBoundsSupport } from '../helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support';\nimport { wrapAudioBufferGetChannelDataMethod } from '../helpers/wrap-audio-buffer-get-channel-data-method';\nconst DEFAULT_OPTIONS = {\n    numberOfChannels: 1\n};\nexport const createAudioBufferConstructor = (audioBufferStore, cacheTestResult, createNotSupportedError, nativeAudioBufferConstructor, nativeOfflineAudioContextConstructor, testNativeAudioBufferConstructorSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds) => {\n    let nativeOfflineAudioContext = null;\n    return class AudioBuffer {\n        constructor(options) {\n            if (nativeOfflineAudioContextConstructor === null) {\n                throw new Error('Missing the native OfflineAudioContext constructor.');\n            }\n            const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options };\n            if (nativeOfflineAudioContext === null) {\n                nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n            }\n            /*\n             * Bug #99: Firefox does not throw a NotSupportedError when the numberOfChannels is zero. But it only does it when using the\n             * factory function. But since Firefox also supports the constructor everything should be fine.\n             */\n            const audioBuffer = nativeAudioBufferConstructor !== null &&\n                cacheTestResult(testNativeAudioBufferConstructorSupport, testNativeAudioBufferConstructorSupport)\n                ? new nativeAudioBufferConstructor({ length, numberOfChannels, sampleRate })\n                : nativeOfflineAudioContext.createBuffer(numberOfChannels, length, sampleRate);\n            // Bug #99: Safari does not throw an error when the numberOfChannels is zero.\n            if (audioBuffer.numberOfChannels === 0) {\n                throw createNotSupportedError();\n            }\n            // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n            // Bug #100: Safari does throw a wrong error when calling getChannelData() with an out-of-bounds value.\n            if (typeof audioBuffer.copyFromChannel !== 'function') {\n                wrapAudioBufferCopyChannelMethods(audioBuffer);\n                wrapAudioBufferGetChannelDataMethod(audioBuffer);\n                // Bug #157: Firefox does not allow the bufferOffset to be out-of-bounds.\n            }\n            else if (!cacheTestResult(testAudioBufferCopyChannelMethodsOutOfBoundsSupport, () => testAudioBufferCopyChannelMethodsOutOfBoundsSupport(audioBuffer))) {\n                wrapAudioBufferCopyChannelMethodsOutOfBounds(audioBuffer);\n            }\n            audioBufferStore.add(audioBuffer);\n            /*\n             * This does violate all good pratices but it is necessary to allow this AudioBuffer to be used with native\n             * (Offline)AudioContexts.\n             */\n            return audioBuffer;\n        }\n        static [Symbol.hasInstance](instance) {\n            return ((instance !== null && typeof instance === 'object' && Object.getPrototypeOf(instance) === AudioBuffer.prototype) ||\n                audioBufferStore.has(instance));\n        }\n    };\n};\n//# sourceMappingURL=audio-buffer-constructor.js.map","export const MOST_NEGATIVE_SINGLE_FLOAT = -3.4028234663852886e38;\nexport const MOST_POSITIVE_SINGLE_FLOAT = -MOST_NEGATIVE_SINGLE_FLOAT;\n//# sourceMappingURL=constants.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nexport const isActiveAudioNode = (audioNode) => ACTIVE_AUDIO_NODE_STORE.has(audioNode);\n//# sourceMappingURL=is-active-audio-node.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nimport { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassive } from '../helpers/set-internal-state-to-passive';\nconst DEFAULT_OPTIONS = {\n    buffer: null,\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    // Bug #149: Safari does not yet support the detune AudioParam.\n    loop: false,\n    loopEnd: 0,\n    loopStart: 0,\n    playbackRate: 1\n};\nexport const createAudioBufferSourceNodeConstructor = (audioNodeConstructor, createAudioBufferSourceNodeRenderer, createAudioParam, createInvalidStateError, createNativeAudioBufferSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener) => {\n    return class AudioBufferSourceNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const audioBufferSourceNodeRenderer = ((isOffline ? createAudioBufferSourceNodeRenderer() : null));\n            super(context, false, nativeAudioBufferSourceNode, audioBufferSourceNodeRenderer);\n            this._audioBufferSourceNodeRenderer = audioBufferSourceNodeRenderer;\n            this._isBufferNullified = false;\n            this._isBufferSet = mergedOptions.buffer !== null;\n            this._nativeAudioBufferSourceNode = nativeAudioBufferSourceNode;\n            this._onended = null;\n            // Bug #73: Safari does not export the correct values for maxValue and minValue.\n            this._playbackRate = createAudioParam(this, isOffline, nativeAudioBufferSourceNode.playbackRate, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n        }\n        get buffer() {\n            if (this._isBufferNullified) {\n                return null;\n            }\n            return this._nativeAudioBufferSourceNode.buffer;\n        }\n        set buffer(value) {\n            this._nativeAudioBufferSourceNode.buffer = value;\n            // Bug #72: Only Chrome, Edge & Opera do not allow to reassign the buffer yet.\n            if (value !== null) {\n                if (this._isBufferSet) {\n                    throw createInvalidStateError();\n                }\n                this._isBufferSet = true;\n            }\n        }\n        get loop() {\n            return this._nativeAudioBufferSourceNode.loop;\n        }\n        set loop(value) {\n            this._nativeAudioBufferSourceNode.loop = value;\n        }\n        get loopEnd() {\n            return this._nativeAudioBufferSourceNode.loopEnd;\n        }\n        set loopEnd(value) {\n            this._nativeAudioBufferSourceNode.loopEnd = value;\n        }\n        get loopStart() {\n            return this._nativeAudioBufferSourceNode.loopStart;\n        }\n        set loopStart(value) {\n            this._nativeAudioBufferSourceNode.loopStart = value;\n        }\n        get onended() {\n            return this._onended;\n        }\n        set onended(value) {\n            const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n            this._nativeAudioBufferSourceNode.onended = wrappedListener;\n            const nativeOnEnded = this._nativeAudioBufferSourceNode.onended;\n            this._onended = nativeOnEnded !== null && nativeOnEnded === wrappedListener ? value : nativeOnEnded;\n        }\n        get playbackRate() {\n            return this._playbackRate;\n        }\n        start(when = 0, offset = 0, duration) {\n            this._nativeAudioBufferSourceNode.start(when, offset, duration);\n            if (this._audioBufferSourceNodeRenderer !== null) {\n                this._audioBufferSourceNodeRenderer.start = duration === undefined ? [when, offset] : [when, offset, duration];\n            }\n            if (this.context.state !== 'closed') {\n                setInternalStateToActive(this);\n                const resetInternalStateToPassive = () => {\n                    this._nativeAudioBufferSourceNode.removeEventListener('ended', resetInternalStateToPassive);\n                    if (isActiveAudioNode(this)) {\n                        setInternalStateToPassive(this);\n                    }\n                };\n                this._nativeAudioBufferSourceNode.addEventListener('ended', resetInternalStateToPassive);\n            }\n        }\n        stop(when = 0) {\n            this._nativeAudioBufferSourceNode.stop(when);\n            if (this._audioBufferSourceNodeRenderer !== null) {\n                this._audioBufferSourceNodeRenderer.stop = when;\n            }\n        }\n    };\n};\n//# sourceMappingURL=audio-buffer-source-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createAudioBufferSourceNodeRendererFactory = (connectAudioParam, createNativeAudioBufferSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeAudioBufferSourceNodes = new WeakMap();\n        let start = null;\n        let stop = null;\n        const createAudioBufferSourceNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeAudioBufferSourceNode = getNativeAudioNode(proxy);\n            /*\n             * If the initially used nativeAudioBufferSourceNode was not constructed on the same OfflineAudioContext it needs to be created\n             * again.\n             */\n            const nativeAudioBufferSourceNodeIsOwnedByContext = isOwnedByContext(nativeAudioBufferSourceNode, nativeOfflineAudioContext);\n            if (!nativeAudioBufferSourceNodeIsOwnedByContext) {\n                const options = {\n                    buffer: nativeAudioBufferSourceNode.buffer,\n                    channelCount: nativeAudioBufferSourceNode.channelCount,\n                    channelCountMode: nativeAudioBufferSourceNode.channelCountMode,\n                    channelInterpretation: nativeAudioBufferSourceNode.channelInterpretation,\n                    // Bug #149: Safari does not yet support the detune AudioParam.\n                    loop: nativeAudioBufferSourceNode.loop,\n                    loopEnd: nativeAudioBufferSourceNode.loopEnd,\n                    loopStart: nativeAudioBufferSourceNode.loopStart,\n                    playbackRate: nativeAudioBufferSourceNode.playbackRate.value\n                };\n                nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeOfflineAudioContext, options);\n                if (start !== null) {\n                    nativeAudioBufferSourceNode.start(...start);\n                }\n                if (stop !== null) {\n                    nativeAudioBufferSourceNode.stop(stop);\n                }\n            }\n            renderedNativeAudioBufferSourceNodes.set(nativeOfflineAudioContext, nativeAudioBufferSourceNode);\n            if (!nativeAudioBufferSourceNodeIsOwnedByContext) {\n                // Bug #149: Safari does not yet support the detune AudioParam.\n                await renderAutomation(nativeOfflineAudioContext, proxy.playbackRate, nativeAudioBufferSourceNode.playbackRate);\n            }\n            else {\n                // Bug #149: Safari does not yet support the detune AudioParam.\n                await connectAudioParam(nativeOfflineAudioContext, proxy.playbackRate, nativeAudioBufferSourceNode.playbackRate);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioBufferSourceNode);\n            return nativeAudioBufferSourceNode;\n        };\n        return {\n            set start(value) {\n                start = value;\n            },\n            set stop(value) {\n                stop = value;\n            },\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeAudioBufferSourceNode = renderedNativeAudioBufferSourceNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeAudioBufferSourceNode !== undefined) {\n                    return Promise.resolve(renderedNativeAudioBufferSourceNode);\n                }\n                return createAudioBufferSourceNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=audio-buffer-source-node-renderer-factory.js.map","export const isAudioBufferSourceNode = (audioNode) => {\n    return 'playbackRate' in audioNode;\n};\n//# sourceMappingURL=audio-buffer-source-node.js.map","export const isBiquadFilterNode = (audioNode) => {\n    return 'frequency' in audioNode && 'gain' in audioNode;\n};\n//# sourceMappingURL=biquad-filter-node.js.map","export const isConstantSourceNode = (audioNode) => {\n    return 'offset' in audioNode;\n};\n//# sourceMappingURL=constant-source-node.js.map","export const isGainNode = (audioNode) => {\n    return !('frequency' in audioNode) && 'gain' in audioNode;\n};\n//# sourceMappingURL=gain-node.js.map","export const isOscillatorNode = (audioNode) => {\n    return 'detune' in audioNode && 'frequency' in audioNode;\n};\n//# sourceMappingURL=oscillator-node.js.map","export const isStereoPannerNode = (audioNode) => {\n    return 'pan' in audioNode;\n};\n//# sourceMappingURL=stereo-panner-node.js.map","import { AUDIO_NODE_CONNECTIONS_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getAudioNodeConnections = (audioNode) => {\n    return getValueForKey(AUDIO_NODE_CONNECTIONS_STORE, audioNode);\n};\n//# sourceMappingURL=get-audio-node-connections.js.map","import { AUDIO_PARAM_CONNECTIONS_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getAudioParamConnections = (audioParam) => {\n    return getValueForKey(AUDIO_PARAM_CONNECTIONS_STORE, audioParam);\n};\n//# sourceMappingURL=get-audio-param-connections.js.map","import { isAudioBufferSourceNode } from '../guards/audio-buffer-source-node';\nimport { isAudioWorkletNode } from '../guards/audio-worklet-node';\nimport { isBiquadFilterNode } from '../guards/biquad-filter-node';\nimport { isConstantSourceNode } from '../guards/constant-source-node';\nimport { isGainNode } from '../guards/gain-node';\nimport { isOscillatorNode } from '../guards/oscillator-node';\nimport { isStereoPannerNode } from '../guards/stereo-panner-node';\nimport { getAudioNodeConnections } from './get-audio-node-connections';\nimport { getAudioParamConnections } from './get-audio-param-connections';\nimport { isActiveAudioNode } from './is-active-audio-node';\nimport { setInternalStateToPassive } from './set-internal-state-to-passive';\nexport const deactivateActiveAudioNodeInputConnections = (audioNode, trace) => {\n    const { activeInputs } = getAudioNodeConnections(audioNode);\n    activeInputs.forEach((connections) => connections.forEach(([source]) => {\n        if (!trace.includes(audioNode)) {\n            deactivateActiveAudioNodeInputConnections(source, [...trace, audioNode]);\n        }\n    }));\n    const audioParams = isAudioBufferSourceNode(audioNode)\n        ? [\n            // Bug #149: Safari does not yet support the detune AudioParam.\n            audioNode.playbackRate\n        ]\n        : isAudioWorkletNode(audioNode)\n            ? Array.from(audioNode.parameters.values())\n            : isBiquadFilterNode(audioNode)\n                ? [audioNode.Q, audioNode.detune, audioNode.frequency, audioNode.gain]\n                : isConstantSourceNode(audioNode)\n                    ? [audioNode.offset]\n                    : isGainNode(audioNode)\n                        ? [audioNode.gain]\n                        : isOscillatorNode(audioNode)\n                            ? [audioNode.detune, audioNode.frequency]\n                            : isStereoPannerNode(audioNode)\n                                ? [audioNode.pan]\n                                : [];\n    for (const audioParam of audioParams) {\n        const audioParamConnections = getAudioParamConnections(audioParam);\n        if (audioParamConnections !== undefined) {\n            audioParamConnections.activeInputs.forEach(([source]) => deactivateActiveAudioNodeInputConnections(source, trace));\n        }\n    }\n    if (isActiveAudioNode(audioNode)) {\n        setInternalStateToPassive(audioNode);\n    }\n};\n//# sourceMappingURL=deactivate-active-audio-node-input-connections.js.map","import { deactivateActiveAudioNodeInputConnections } from './deactivate-active-audio-node-input-connections';\nexport const deactivateAudioGraph = (context) => {\n    deactivateActiveAudioNodeInputConnections(context.destination, []);\n};\n//# sourceMappingURL=deactivate-audio-graph.js.map","export const isValidLatencyHint = (latencyHint) => {\n    return (latencyHint === undefined ||\n        typeof latencyHint === 'number' ||\n        (typeof latencyHint === 'string' && (latencyHint === 'balanced' || latencyHint === 'interactive' || latencyHint === 'playback')));\n};\n//# sourceMappingURL=is-valid-latency-hint.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { isValidLatencyHint } from '../helpers/is-valid-latency-hint';\nexport const createAudioContextConstructor = (baseAudioContextConstructor, createInvalidStateError, createNotSupportedError, createUnknownError, mediaElementAudioSourceNodeConstructor, mediaStreamAudioDestinationNodeConstructor, mediaStreamAudioSourceNodeConstructor, mediaStreamTrackAudioSourceNodeConstructor, nativeAudioContextConstructor) => {\n    return class AudioContext extends baseAudioContextConstructor {\n        constructor(options = {}) {\n            if (nativeAudioContextConstructor === null) {\n                throw new Error('Missing the native AudioContext constructor.');\n            }\n            let nativeAudioContext;\n            try {\n                nativeAudioContext = new nativeAudioContextConstructor(options);\n            }\n            catch (err) {\n                // Bug #192 Safari does throw a SyntaxError if the sampleRate is not supported.\n                if (err.code === 12 && err.message === 'sampleRate is not in range') {\n                    throw createNotSupportedError();\n                }\n                throw err;\n            }\n            // Bug #131 Safari returns null when there are four other AudioContexts running already.\n            if (nativeAudioContext === null) {\n                throw createUnknownError();\n            }\n            // Bug #51 Only Chrome, Edge and Opera throw an error if the given latencyHint is invalid.\n            if (!isValidLatencyHint(options.latencyHint)) {\n                throw new TypeError(`The provided value '${options.latencyHint}' is not a valid enum value of type AudioContextLatencyCategory.`);\n            }\n            // Bug #150 Safari does not support setting the sampleRate.\n            if (options.sampleRate !== undefined && nativeAudioContext.sampleRate !== options.sampleRate) {\n                throw createNotSupportedError();\n            }\n            super(nativeAudioContext, 2);\n            const { latencyHint } = options;\n            const { sampleRate } = nativeAudioContext;\n            // @todo The values for 'balanced', 'interactive' and 'playback' are just copied from Chrome's implementation.\n            this._baseLatency =\n                typeof nativeAudioContext.baseLatency === 'number'\n                    ? nativeAudioContext.baseLatency\n                    : latencyHint === 'balanced'\n                        ? 512 / sampleRate\n                        : latencyHint === 'interactive' || latencyHint === undefined\n                            ? 256 / sampleRate\n                            : latencyHint === 'playback'\n                                ? 1024 / sampleRate\n                                : /*\n                                   * @todo The min (256) and max (16384) values are taken from the allowed bufferSize values of a\n                                   * ScriptProcessorNode.\n                                   */\n                                    (Math.max(2, Math.min(128, Math.round((latencyHint * sampleRate) / 128))) * 128) / sampleRate;\n            this._nativeAudioContext = nativeAudioContext;\n            // Bug #188: Safari will set the context's state to 'interrupted' in case the user switches tabs.\n            if (nativeAudioContextConstructor.name === 'webkitAudioContext') {\n                this._nativeGainNode = nativeAudioContext.createGain();\n                this._nativeOscillatorNode = nativeAudioContext.createOscillator();\n                this._nativeGainNode.gain.value = 1e-37;\n                this._nativeOscillatorNode.connect(this._nativeGainNode).connect(nativeAudioContext.destination);\n                this._nativeOscillatorNode.start();\n            }\n            else {\n                this._nativeGainNode = null;\n                this._nativeOscillatorNode = null;\n            }\n            this._state = null;\n            /*\n             * Bug #34: Chrome, Edge and Opera pretend to be running right away, but fire an onstatechange event when the state actually\n             * changes to 'running'.\n             */\n            if (nativeAudioContext.state === 'running') {\n                this._state = 'suspended';\n                const revokeState = () => {\n                    if (this._state === 'suspended') {\n                        this._state = null;\n                    }\n                    nativeAudioContext.removeEventListener('statechange', revokeState);\n                };\n                nativeAudioContext.addEventListener('statechange', revokeState);\n            }\n        }\n        get baseLatency() {\n            return this._baseLatency;\n        }\n        get state() {\n            return this._state !== null ? this._state : this._nativeAudioContext.state;\n        }\n        close() {\n            // Bug #35: Firefox does not throw an error if the AudioContext was closed before.\n            if (this.state === 'closed') {\n                return this._nativeAudioContext.close().then(() => {\n                    throw createInvalidStateError();\n                });\n            }\n            // Bug #34: If the state was set to suspended before it should be revoked now.\n            if (this._state === 'suspended') {\n                this._state = null;\n            }\n            return this._nativeAudioContext.close().then(() => {\n                if (this._nativeGainNode !== null && this._nativeOscillatorNode !== null) {\n                    this._nativeOscillatorNode.stop();\n                    this._nativeGainNode.disconnect();\n                    this._nativeOscillatorNode.disconnect();\n                }\n                deactivateAudioGraph(this);\n            });\n        }\n        createMediaElementSource(mediaElement) {\n            return new mediaElementAudioSourceNodeConstructor(this, { mediaElement });\n        }\n        createMediaStreamDestination() {\n            return new mediaStreamAudioDestinationNodeConstructor(this);\n        }\n        createMediaStreamSource(mediaStream) {\n            return new mediaStreamAudioSourceNodeConstructor(this, { mediaStream });\n        }\n        createMediaStreamTrackSource(mediaStreamTrack) {\n            return new mediaStreamTrackAudioSourceNodeConstructor(this, { mediaStreamTrack });\n        }\n        resume() {\n            if (this._state === 'suspended') {\n                return new Promise((resolve, reject) => {\n                    const resolvePromise = () => {\n                        this._nativeAudioContext.removeEventListener('statechange', resolvePromise);\n                        if (this._nativeAudioContext.state === 'running') {\n                            resolve();\n                        }\n                        else {\n                            this.resume().then(resolve, reject);\n                        }\n                    };\n                    this._nativeAudioContext.addEventListener('statechange', resolvePromise);\n                });\n            }\n            return this._nativeAudioContext.resume().catch((err) => {\n                // Bug #55: Chrome, Edge and Opera do throw an InvalidAccessError instead of an InvalidStateError.\n                // Bug #56: Safari invokes the catch handler but without an error.\n                if (err === undefined || err.code === 15) {\n                    throw createInvalidStateError();\n                }\n                throw err;\n            });\n        }\n        suspend() {\n            return this._nativeAudioContext.suspend().catch((err) => {\n                // Bug #56: Safari invokes the catch handler but without an error.\n                if (err === undefined) {\n                    throw createInvalidStateError();\n                }\n                throw err;\n            });\n        }\n    };\n};\n//# sourceMappingURL=audio-context-constructor.js.map","export const createAudioDestinationNodeConstructor = (audioNodeConstructor, createAudioDestinationNodeRenderer, createIndexSizeError, createInvalidStateError, createNativeAudioDestinationNode, getNativeContext, isNativeOfflineAudioContext, renderInputsOfAudioNode) => {\n    return class AudioDestinationNode extends audioNodeConstructor {\n        constructor(context, channelCount) {\n            const nativeContext = getNativeContext(context);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const nativeAudioDestinationNode = createNativeAudioDestinationNode(nativeContext, channelCount, isOffline);\n            const audioDestinationNodeRenderer = ((isOffline ? createAudioDestinationNodeRenderer(renderInputsOfAudioNode) : null));\n            super(context, false, nativeAudioDestinationNode, audioDestinationNodeRenderer);\n            this._isNodeOfNativeOfflineAudioContext = isOffline;\n            this._nativeAudioDestinationNode = nativeAudioDestinationNode;\n        }\n        get channelCount() {\n            return this._nativeAudioDestinationNode.channelCount;\n        }\n        set channelCount(value) {\n            // Bug #52: Chrome, Edge, Opera & Safari do not throw an exception at all.\n            // Bug #54: Firefox does throw an IndexSizeError.\n            if (this._isNodeOfNativeOfflineAudioContext) {\n                throw createInvalidStateError();\n            }\n            // Bug #47: The AudioDestinationNode in Safari does not initialize the maxChannelCount property correctly.\n            if (value > this._nativeAudioDestinationNode.maxChannelCount) {\n                throw createIndexSizeError();\n            }\n            this._nativeAudioDestinationNode.channelCount = value;\n        }\n        get channelCountMode() {\n            return this._nativeAudioDestinationNode.channelCountMode;\n        }\n        set channelCountMode(value) {\n            // Bug #53: No browser does throw an exception yet.\n            if (this._isNodeOfNativeOfflineAudioContext) {\n                throw createInvalidStateError();\n            }\n            this._nativeAudioDestinationNode.channelCountMode = value;\n        }\n        get maxChannelCount() {\n            return this._nativeAudioDestinationNode.maxChannelCount;\n        }\n    };\n};\n//# sourceMappingURL=audio-destination-node-constructor.js.map","export const createAudioDestinationNodeRenderer = (renderInputsOfAudioNode) => {\n    const renderedNativeAudioDestinationNodes = new WeakMap();\n    const createAudioDestinationNode = async (proxy, nativeOfflineAudioContext) => {\n        const nativeAudioDestinationNode = nativeOfflineAudioContext.destination;\n        renderedNativeAudioDestinationNodes.set(nativeOfflineAudioContext, nativeAudioDestinationNode);\n        await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioDestinationNode);\n        return nativeAudioDestinationNode;\n    };\n    return {\n        render(proxy, nativeOfflineAudioContext) {\n            const renderedNativeAudioDestinationNode = renderedNativeAudioDestinationNodes.get(nativeOfflineAudioContext);\n            if (renderedNativeAudioDestinationNode !== undefined) {\n                return Promise.resolve(renderedNativeAudioDestinationNode);\n            }\n            return createAudioDestinationNode(proxy, nativeOfflineAudioContext);\n        }\n    };\n};\n//# sourceMappingURL=audio-destination-node-renderer-factory.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nexport const createAudioListenerFactory = (createAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeScriptProcessorNode, createNotSupportedError, getFirstSample, isNativeOfflineAudioContext, overwriteAccessors) => {\n    return (context, nativeContext) => {\n        const nativeListener = nativeContext.listener;\n        // Bug #117: Only Chrome, Edge & Opera support the new interface already.\n        const createFakeAudioParams = () => {\n            const buffer = new Float32Array(1);\n            const channelMergerNode = createNativeChannelMergerNode(nativeContext, {\n                channelCount: 1,\n                channelCountMode: 'explicit',\n                channelInterpretation: 'speakers',\n                numberOfInputs: 9\n            });\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            let isScriptProcessorNodeCreated = false;\n            let lastOrientation = [0, 0, -1, 0, 1, 0];\n            let lastPosition = [0, 0, 0];\n            const createScriptProcessorNode = () => {\n                if (isScriptProcessorNodeCreated) {\n                    return;\n                }\n                isScriptProcessorNodeCreated = true;\n                const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, 256, 9, 0);\n                // tslint:disable-next-line:deprecation\n                scriptProcessorNode.onaudioprocess = ({ inputBuffer }) => {\n                    const orientation = [\n                        getFirstSample(inputBuffer, buffer, 0),\n                        getFirstSample(inputBuffer, buffer, 1),\n                        getFirstSample(inputBuffer, buffer, 2),\n                        getFirstSample(inputBuffer, buffer, 3),\n                        getFirstSample(inputBuffer, buffer, 4),\n                        getFirstSample(inputBuffer, buffer, 5)\n                    ];\n                    if (orientation.some((value, index) => value !== lastOrientation[index])) {\n                        nativeListener.setOrientation(...orientation); // tslint:disable-line:deprecation\n                        lastOrientation = orientation;\n                    }\n                    const positon = [\n                        getFirstSample(inputBuffer, buffer, 6),\n                        getFirstSample(inputBuffer, buffer, 7),\n                        getFirstSample(inputBuffer, buffer, 8)\n                    ];\n                    if (positon.some((value, index) => value !== lastPosition[index])) {\n                        nativeListener.setPosition(...positon); // tslint:disable-line:deprecation\n                        lastPosition = positon;\n                    }\n                };\n                channelMergerNode.connect(scriptProcessorNode);\n            };\n            const createSetOrientation = (index) => (value) => {\n                if (value !== lastOrientation[index]) {\n                    lastOrientation[index] = value;\n                    nativeListener.setOrientation(...lastOrientation); // tslint:disable-line:deprecation\n                }\n            };\n            const createSetPosition = (index) => (value) => {\n                if (value !== lastPosition[index]) {\n                    lastPosition[index] = value;\n                    nativeListener.setPosition(...lastPosition); // tslint:disable-line:deprecation\n                }\n            };\n            const createFakeAudioParam = (input, initialValue, setValue) => {\n                const constantSourceNode = createNativeConstantSourceNode(nativeContext, {\n                    channelCount: 1,\n                    channelCountMode: 'explicit',\n                    channelInterpretation: 'discrete',\n                    offset: initialValue\n                });\n                constantSourceNode.connect(channelMergerNode, 0, input);\n                // @todo This should be stopped when the context is closed.\n                constantSourceNode.start();\n                Object.defineProperty(constantSourceNode.offset, 'defaultValue', {\n                    get() {\n                        return initialValue;\n                    }\n                });\n                /*\n                 * Bug #62 & #74: Safari does not support ConstantSourceNodes and does not export the correct values for maxValue and\n                 * minValue for GainNodes.\n                 */\n                const audioParam = createAudioParam({ context }, isOffline, constantSourceNode.offset, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n                overwriteAccessors(audioParam, 'value', (get) => () => get.call(audioParam), (set) => (value) => {\n                    try {\n                        set.call(audioParam, value);\n                    }\n                    catch (err) {\n                        if (err.code !== 9) {\n                            throw err;\n                        }\n                    }\n                    createScriptProcessorNode();\n                    if (isOffline) {\n                        // Bug #117: Using setOrientation() and setPosition() doesn't work with an OfflineAudioContext.\n                        setValue(value);\n                    }\n                });\n                audioParam.cancelAndHoldAtTime = ((cancelAndHoldAtTime) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = cancelAndHoldAtTime.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.cancelAndHoldAtTime);\n                audioParam.cancelScheduledValues = ((cancelScheduledValues) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = cancelScheduledValues.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.cancelScheduledValues);\n                audioParam.exponentialRampToValueAtTime = ((exponentialRampToValueAtTime) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = exponentialRampToValueAtTime.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.exponentialRampToValueAtTime);\n                audioParam.linearRampToValueAtTime = ((linearRampToValueAtTime) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = linearRampToValueAtTime.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.linearRampToValueAtTime);\n                audioParam.setTargetAtTime = ((setTargetAtTime) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = setTargetAtTime.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.setTargetAtTime);\n                audioParam.setValueAtTime = ((setValueAtTime) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = setValueAtTime.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.setValueAtTime);\n                audioParam.setValueCurveAtTime = ((setValueCurveAtTime) => {\n                    if (isOffline) {\n                        return () => {\n                            throw createNotSupportedError();\n                        };\n                    }\n                    return (...args) => {\n                        const value = setValueCurveAtTime.apply(audioParam, args);\n                        createScriptProcessorNode();\n                        return value;\n                    };\n                })(audioParam.setValueCurveAtTime);\n                return audioParam;\n            };\n            return {\n                forwardX: createFakeAudioParam(0, 0, createSetOrientation(0)),\n                forwardY: createFakeAudioParam(1, 0, createSetOrientation(1)),\n                forwardZ: createFakeAudioParam(2, -1, createSetOrientation(2)),\n                positionX: createFakeAudioParam(6, 0, createSetPosition(0)),\n                positionY: createFakeAudioParam(7, 0, createSetPosition(1)),\n                positionZ: createFakeAudioParam(8, 0, createSetPosition(2)),\n                upX: createFakeAudioParam(3, 0, createSetOrientation(3)),\n                upY: createFakeAudioParam(4, 1, createSetOrientation(4)),\n                upZ: createFakeAudioParam(5, 0, createSetOrientation(5))\n            };\n        };\n        const { forwardX, forwardY, forwardZ, positionX, positionY, positionZ, upX, upY, upZ } = nativeListener.forwardX === undefined ? createFakeAudioParams() : nativeListener;\n        return {\n            get forwardX() {\n                return forwardX;\n            },\n            get forwardY() {\n                return forwardY;\n            },\n            get forwardZ() {\n                return forwardZ;\n            },\n            get positionX() {\n                return positionX;\n            },\n            get positionY() {\n                return positionY;\n            },\n            get positionZ() {\n                return positionZ;\n            },\n            get upX() {\n                return upX;\n            },\n            get upY() {\n                return upY;\n            },\n            get upZ() {\n                return upZ;\n            }\n        };\n    };\n};\n//# sourceMappingURL=audio-listener-factory.js.map","export const isAudioNode = (audioNodeOrAudioParam) => {\n    return 'context' in audioNodeOrAudioParam;\n};\n//# sourceMappingURL=audio-node.js.map","import { isAudioNode } from './audio-node';\nexport const isAudioNodeOutputConnection = (outputConnection) => {\n    return isAudioNode(outputConnection[0]);\n};\n//# sourceMappingURL=audio-node-output-connection.js.map","export const insertElementInSet = (set, element, predicate, ignoreDuplicates) => {\n    for (const lmnt of set) {\n        if (predicate(lmnt)) {\n            if (ignoreDuplicates) {\n                return false;\n            }\n            throw Error('The set contains at least one similar element.');\n        }\n    }\n    set.add(element);\n    return true;\n};\n//# sourceMappingURL=insert-element-in-set.js.map","import { insertElementInSet } from './insert-element-in-set';\nexport const addActiveInputConnectionToAudioParam = (activeInputs, source, [output, eventListener], ignoreDuplicates) => {\n    insertElementInSet(activeInputs, [source, output, eventListener], (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output, ignoreDuplicates);\n};\n//# sourceMappingURL=add-active-input-connection-to-audio-param.js.map","import { insertElementInSet } from './insert-element-in-set';\nexport const addPassiveInputConnectionToAudioParam = (passiveInputs, [source, output, eventListener], ignoreDuplicates) => {\n    const passiveInputConnections = passiveInputs.get(source);\n    if (passiveInputConnections === undefined) {\n        passiveInputs.set(source, new Set([[output, eventListener]]));\n    }\n    else {\n        insertElementInSet(passiveInputConnections, [output, eventListener], (passiveInputConnection) => passiveInputConnection[0] === output, ignoreDuplicates);\n    }\n};\n//# sourceMappingURL=add-passive-input-connection-to-audio-param.js.map","export const isNativeAudioNodeFaker = (nativeAudioNodeOrNativeAudioNodeFaker) => {\n    return 'inputs' in nativeAudioNodeOrNativeAudioNodeFaker;\n};\n//# sourceMappingURL=native-audio-node-faker.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nexport const connectNativeAudioNodeToNativeAudioNode = (nativeSourceAudioNode, nativeDestinationAudioNode, output, input) => {\n    if (isNativeAudioNodeFaker(nativeDestinationAudioNode)) {\n        const fakeNativeDestinationAudioNode = nativeDestinationAudioNode.inputs[input];\n        nativeSourceAudioNode.connect(fakeNativeDestinationAudioNode, output, 0);\n        return [fakeNativeDestinationAudioNode, output, 0];\n    }\n    nativeSourceAudioNode.connect(nativeDestinationAudioNode, output, input);\n    return [nativeDestinationAudioNode, output, input];\n};\n//# sourceMappingURL=connect-native-audio-node-to-native-audio-node.js.map","export const deleteActiveInputConnection = (activeInputConnections, source, output) => {\n    for (const activeInputConnection of activeInputConnections) {\n        if (activeInputConnection[0] === source && activeInputConnection[1] === output) {\n            activeInputConnections.delete(activeInputConnection);\n            return activeInputConnection;\n        }\n    }\n    return null;\n};\n//# sourceMappingURL=delete-active-input-connection.js.map","import { pickElementFromSet } from './pick-element-from-set';\nexport const deleteActiveInputConnectionToAudioParam = (activeInputs, source, output) => {\n    return pickElementFromSet(activeInputs, (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output);\n};\n//# sourceMappingURL=delete-active-input-connection-to-audio-param.js.map","import { getEventListenersOfAudioNode } from './get-event-listeners-of-audio-node';\nexport const deleteEventListenerOfAudioNode = (audioNode, eventListener) => {\n    const eventListeners = getEventListenersOfAudioNode(audioNode);\n    if (!eventListeners.delete(eventListener)) {\n        throw new Error('Missing the expected event listener.');\n    }\n};\n//# sourceMappingURL=delete-event-listeners-of-audio-node.js.map","import { getValueForKey } from './get-value-for-key';\nimport { pickElementFromSet } from './pick-element-from-set';\nexport const deletePassiveInputConnectionToAudioParam = (passiveInputs, source, output) => {\n    const passiveInputConnections = getValueForKey(passiveInputs, source);\n    const matchingConnection = pickElementFromSet(passiveInputConnections, (passiveInputConnection) => passiveInputConnection[0] === output);\n    if (passiveInputConnections.size === 0) {\n        passiveInputs.delete(source);\n    }\n    return matchingConnection;\n};\n//# sourceMappingURL=delete-passive-input-connection-to-audio-param.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nexport const disconnectNativeAudioNodeFromNativeAudioNode = (nativeSourceAudioNode, nativeDestinationAudioNode, output, input) => {\n    if (isNativeAudioNodeFaker(nativeDestinationAudioNode)) {\n        nativeSourceAudioNode.disconnect(nativeDestinationAudioNode.inputs[input], output, 0);\n    }\n    else {\n        nativeSourceAudioNode.disconnect(nativeDestinationAudioNode, output, input);\n    }\n};\n//# sourceMappingURL=disconnect-native-audio-node-from-native-audio-node.js.map","import { AUDIO_NODE_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getNativeAudioNode = (audioNode) => {\n    return getValueForKey(AUDIO_NODE_STORE, audioNode);\n};\n//# sourceMappingURL=get-native-audio-node.js.map","import { AUDIO_PARAM_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getNativeAudioParam = (audioParam) => {\n    return getValueForKey(AUDIO_PARAM_STORE, audioParam);\n};\n//# sourceMappingURL=get-native-audio-param.js.map","import { CYCLE_COUNTERS } from '../globals';\nexport const isPartOfACycle = (audioNode) => {\n    return CYCLE_COUNTERS.has(audioNode);\n};\n//# sourceMappingURL=is-part-of-a-cycle.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nexport const isPassiveAudioNode = (audioNode) => {\n    return !ACTIVE_AUDIO_NODE_STORE.has(audioNode);\n};\n//# sourceMappingURL=is-passive-audio-node.js.map","export const testAudioNodeDisconnectMethodSupport = (nativeAudioContext, nativeAudioWorkletNodeConstructor) => {\n    return new Promise((resolve) => {\n        /*\n         * This bug existed in Safari up until v14.0.2. Since AudioWorklets were not supported in Safari until v14.1 the presence of the\n         * constructor for an AudioWorkletNode can be used here to skip the test.\n         */\n        if (nativeAudioWorkletNodeConstructor !== null) {\n            resolve(true);\n        }\n        else {\n            const analyzer = nativeAudioContext.createScriptProcessor(256, 1, 1); // tslint:disable-line deprecation\n            const dummy = nativeAudioContext.createGain();\n            // Bug #95: Safari does not play one sample buffers.\n            const ones = nativeAudioContext.createBuffer(1, 2, 44100);\n            const channelData = ones.getChannelData(0);\n            channelData[0] = 1;\n            channelData[1] = 1;\n            const source = nativeAudioContext.createBufferSource();\n            source.buffer = ones;\n            source.loop = true;\n            source.connect(analyzer).connect(nativeAudioContext.destination);\n            source.connect(dummy);\n            source.disconnect(dummy);\n            // tslint:disable-next-line:deprecation\n            analyzer.onaudioprocess = (event) => {\n                const chnnlDt = event.inputBuffer.getChannelData(0); // tslint:disable-line deprecation\n                if (Array.prototype.some.call(chnnlDt, (sample) => sample === 1)) {\n                    resolve(true);\n                }\n                else {\n                    resolve(false);\n                }\n                source.stop();\n                analyzer.onaudioprocess = null; // tslint:disable-line:deprecation\n                source.disconnect(analyzer);\n                analyzer.disconnect(nativeAudioContext.destination);\n            };\n            source.start();\n        }\n    });\n};\n//# sourceMappingURL=test-audio-node-disconnect-method-support.js.map","export const visitEachAudioNodeOnce = (cycles, visitor) => {\n    const counts = new Map();\n    for (const cycle of cycles) {\n        for (const audioNode of cycle) {\n            const count = counts.get(audioNode);\n            counts.set(audioNode, count === undefined ? 1 : count + 1);\n        }\n    }\n    counts.forEach((count, audioNode) => visitor(audioNode, count));\n};\n//# sourceMappingURL=visit-each-audio-node-once.js.map","export const isNativeAudioNode = (nativeAudioNodeOrAudioParam) => {\n    return 'context' in nativeAudioNodeOrAudioParam;\n};\n//# sourceMappingURL=native-audio-node.js.map","import { isNativeAudioNode } from '../guards/native-audio-node';\nexport const wrapAudioNodeDisconnectMethod = (nativeAudioNode) => {\n    const connections = new Map();\n    nativeAudioNode.connect = ((connect) => {\n        // tslint:disable-next-line:invalid-void no-inferrable-types\n        return (destination, output = 0, input = 0) => {\n            const returnValue = isNativeAudioNode(destination) ? connect(destination, output, input) : connect(destination, output);\n            // Save the new connection only if the calls to connect above didn't throw an error.\n            const connectionsToDestination = connections.get(destination);\n            if (connectionsToDestination === undefined) {\n                connections.set(destination, [{ input, output }]);\n            }\n            else {\n                if (connectionsToDestination.every((connection) => connection.input !== input || connection.output !== output)) {\n                    connectionsToDestination.push({ input, output });\n                }\n            }\n            return returnValue;\n        };\n    })(nativeAudioNode.connect.bind(nativeAudioNode));\n    nativeAudioNode.disconnect = ((disconnect) => {\n        return (destinationOrOutput, output, input) => {\n            disconnect.apply(nativeAudioNode);\n            if (destinationOrOutput === undefined) {\n                connections.clear();\n            }\n            else if (typeof destinationOrOutput === 'number') {\n                for (const [destination, connectionsToDestination] of connections) {\n                    const filteredConnections = connectionsToDestination.filter((connection) => connection.output !== destinationOrOutput);\n                    if (filteredConnections.length === 0) {\n                        connections.delete(destination);\n                    }\n                    else {\n                        connections.set(destination, filteredConnections);\n                    }\n                }\n            }\n            else if (connections.has(destinationOrOutput)) {\n                if (output === undefined) {\n                    connections.delete(destinationOrOutput);\n                }\n                else {\n                    const connectionsToDestination = connections.get(destinationOrOutput);\n                    if (connectionsToDestination !== undefined) {\n                        const filteredConnections = connectionsToDestination.filter((connection) => connection.output !== output && (connection.input !== input || input === undefined));\n                        if (filteredConnections.length === 0) {\n                            connections.delete(destinationOrOutput);\n                        }\n                        else {\n                            connections.set(destinationOrOutput, filteredConnections);\n                        }\n                    }\n                }\n            }\n            for (const [destination, connectionsToDestination] of connections) {\n                connectionsToDestination.forEach((connection) => {\n                    if (isNativeAudioNode(destination)) {\n                        nativeAudioNode.connect(destination, connection.output, connection.input);\n                    }\n                    else {\n                        nativeAudioNode.connect(destination, connection.output);\n                    }\n                });\n            }\n        };\n    })(nativeAudioNode.disconnect);\n};\n//# sourceMappingURL=wrap-audio-node-disconnect-method.js.map","import { AUDIO_NODE_STORE, EVENT_LISTENERS } from '../globals';\nimport { isAudioNode } from '../guards/audio-node';\nimport { isAudioNodeOutputConnection } from '../guards/audio-node-output-connection';\nimport { addActiveInputConnectionToAudioParam } from '../helpers/add-active-input-connection-to-audio-param';\nimport { addPassiveInputConnectionToAudioParam } from '../helpers/add-passive-input-connection-to-audio-param';\nimport { connectNativeAudioNodeToNativeAudioNode } from '../helpers/connect-native-audio-node-to-native-audio-node';\nimport { deleteActiveInputConnection } from '../helpers/delete-active-input-connection';\nimport { deleteActiveInputConnectionToAudioParam } from '../helpers/delete-active-input-connection-to-audio-param';\nimport { deleteEventListenerOfAudioNode } from '../helpers/delete-event-listeners-of-audio-node';\nimport { deletePassiveInputConnectionToAudioNode } from '../helpers/delete-passive-input-connection-to-audio-node';\nimport { deletePassiveInputConnectionToAudioParam } from '../helpers/delete-passive-input-connection-to-audio-param';\nimport { disconnectNativeAudioNodeFromNativeAudioNode } from '../helpers/disconnect-native-audio-node-from-native-audio-node';\nimport { getAudioNodeConnections } from '../helpers/get-audio-node-connections';\nimport { getAudioParamConnections } from '../helpers/get-audio-param-connections';\nimport { getEventListenersOfAudioNode } from '../helpers/get-event-listeners-of-audio-node';\nimport { getNativeAudioNode } from '../helpers/get-native-audio-node';\nimport { getNativeAudioParam } from '../helpers/get-native-audio-param';\nimport { insertElementInSet } from '../helpers/insert-element-in-set';\nimport { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { isPartOfACycle } from '../helpers/is-part-of-a-cycle';\nimport { isPassiveAudioNode } from '../helpers/is-passive-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassiveWhenNecessary } from '../helpers/set-internal-state-to-passive-when-necessary';\nimport { testAudioNodeDisconnectMethodSupport } from '../helpers/test-audio-node-disconnect-method-support';\nimport { visitEachAudioNodeOnce } from '../helpers/visit-each-audio-node-once';\nimport { wrapAudioNodeDisconnectMethod } from '../helpers/wrap-audio-node-disconnect-method';\nconst addConnectionToAudioParamOfAudioContext = (source, destination, output, isOffline) => {\n    const { activeInputs, passiveInputs } = getAudioParamConnections(destination);\n    const { outputs } = getAudioNodeConnections(source);\n    const eventListeners = getEventListenersOfAudioNode(source);\n    const eventListener = (isActive) => {\n        const nativeAudioNode = getNativeAudioNode(source);\n        const nativeAudioParam = getNativeAudioParam(destination);\n        if (isActive) {\n            const partialConnection = deletePassiveInputConnectionToAudioParam(passiveInputs, source, output);\n            addActiveInputConnectionToAudioParam(activeInputs, source, partialConnection, false);\n            if (!isOffline && !isPartOfACycle(source)) {\n                nativeAudioNode.connect(nativeAudioParam, output);\n            }\n        }\n        else {\n            const partialConnection = deleteActiveInputConnectionToAudioParam(activeInputs, source, output);\n            addPassiveInputConnectionToAudioParam(passiveInputs, partialConnection, false);\n            if (!isOffline && !isPartOfACycle(source)) {\n                nativeAudioNode.disconnect(nativeAudioParam, output);\n            }\n        }\n    };\n    if (insertElementInSet(outputs, [destination, output], (outputConnection) => outputConnection[0] === destination && outputConnection[1] === output, true)) {\n        eventListeners.add(eventListener);\n        if (isActiveAudioNode(source)) {\n            addActiveInputConnectionToAudioParam(activeInputs, source, [output, eventListener], true);\n        }\n        else {\n            addPassiveInputConnectionToAudioParam(passiveInputs, [source, output, eventListener], true);\n        }\n        return true;\n    }\n    return false;\n};\nconst deleteInputConnectionOfAudioNode = (source, destination, output, input) => {\n    const { activeInputs, passiveInputs } = getAudioNodeConnections(destination);\n    const activeInputConnection = deleteActiveInputConnection(activeInputs[input], source, output);\n    if (activeInputConnection === null) {\n        const passiveInputConnection = deletePassiveInputConnectionToAudioNode(passiveInputs, source, output, input);\n        return [passiveInputConnection[2], false];\n    }\n    return [activeInputConnection[2], true];\n};\nconst deleteInputConnectionOfAudioParam = (source, destination, output) => {\n    const { activeInputs, passiveInputs } = getAudioParamConnections(destination);\n    const activeInputConnection = deleteActiveInputConnection(activeInputs, source, output);\n    if (activeInputConnection === null) {\n        const passiveInputConnection = deletePassiveInputConnectionToAudioParam(passiveInputs, source, output);\n        return [passiveInputConnection[1], false];\n    }\n    return [activeInputConnection[2], true];\n};\nconst deleteInputsOfAudioNode = (source, isOffline, destination, output, input) => {\n    const [listener, isActive] = deleteInputConnectionOfAudioNode(source, destination, output, input);\n    if (listener !== null) {\n        deleteEventListenerOfAudioNode(source, listener);\n        if (isActive && !isOffline && !isPartOfACycle(source)) {\n            disconnectNativeAudioNodeFromNativeAudioNode(getNativeAudioNode(source), getNativeAudioNode(destination), output, input);\n        }\n    }\n    if (isActiveAudioNode(destination)) {\n        const { activeInputs } = getAudioNodeConnections(destination);\n        setInternalStateToPassiveWhenNecessary(destination, activeInputs);\n    }\n};\nconst deleteInputsOfAudioParam = (source, isOffline, destination, output) => {\n    const [listener, isActive] = deleteInputConnectionOfAudioParam(source, destination, output);\n    if (listener !== null) {\n        deleteEventListenerOfAudioNode(source, listener);\n        if (isActive && !isOffline && !isPartOfACycle(source)) {\n            getNativeAudioNode(source).disconnect(getNativeAudioParam(destination), output);\n        }\n    }\n};\nconst deleteAnyConnection = (source, isOffline) => {\n    const audioNodeConnectionsOfSource = getAudioNodeConnections(source);\n    const destinations = [];\n    for (const outputConnection of audioNodeConnectionsOfSource.outputs) {\n        if (isAudioNodeOutputConnection(outputConnection)) {\n            deleteInputsOfAudioNode(source, isOffline, ...outputConnection);\n        }\n        else {\n            deleteInputsOfAudioParam(source, isOffline, ...outputConnection);\n        }\n        destinations.push(outputConnection[0]);\n    }\n    audioNodeConnectionsOfSource.outputs.clear();\n    return destinations;\n};\nconst deleteConnectionAtOutput = (source, isOffline, output) => {\n    const audioNodeConnectionsOfSource = getAudioNodeConnections(source);\n    const destinations = [];\n    for (const outputConnection of audioNodeConnectionsOfSource.outputs) {\n        if (outputConnection[1] === output) {\n            if (isAudioNodeOutputConnection(outputConnection)) {\n                deleteInputsOfAudioNode(source, isOffline, ...outputConnection);\n            }\n            else {\n                deleteInputsOfAudioParam(source, isOffline, ...outputConnection);\n            }\n            destinations.push(outputConnection[0]);\n            audioNodeConnectionsOfSource.outputs.delete(outputConnection);\n        }\n    }\n    return destinations;\n};\nconst deleteConnectionToDestination = (source, isOffline, destination, output, input) => {\n    const audioNodeConnectionsOfSource = getAudioNodeConnections(source);\n    return Array.from(audioNodeConnectionsOfSource.outputs)\n        .filter((outputConnection) => outputConnection[0] === destination &&\n        (output === undefined || outputConnection[1] === output) &&\n        (input === undefined || outputConnection[2] === input))\n        .map((outputConnection) => {\n        if (isAudioNodeOutputConnection(outputConnection)) {\n            deleteInputsOfAudioNode(source, isOffline, ...outputConnection);\n        }\n        else {\n            deleteInputsOfAudioParam(source, isOffline, ...outputConnection);\n        }\n        audioNodeConnectionsOfSource.outputs.delete(outputConnection);\n        return outputConnection[0];\n    });\n};\nexport const createAudioNodeConstructor = (addAudioNodeConnections, addConnectionToAudioNode, cacheTestResult, createIncrementCycleCounter, createIndexSizeError, createInvalidAccessError, createNotSupportedError, decrementCycleCounter, detectCycles, eventTargetConstructor, getNativeContext, isNativeAudioContext, isNativeAudioNode, isNativeAudioParam, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor) => {\n    return class AudioNode extends eventTargetConstructor {\n        constructor(context, isActive, nativeAudioNode, audioNodeRenderer) {\n            super(nativeAudioNode);\n            this._context = context;\n            this._nativeAudioNode = nativeAudioNode;\n            const nativeContext = getNativeContext(context);\n            // Bug #12: Safari does not support to disconnect a specific destination.\n            if (isNativeAudioContext(nativeContext) &&\n                true !==\n                    cacheTestResult(testAudioNodeDisconnectMethodSupport, () => {\n                        return testAudioNodeDisconnectMethodSupport(nativeContext, nativeAudioWorkletNodeConstructor);\n                    })) {\n                wrapAudioNodeDisconnectMethod(nativeAudioNode);\n            }\n            AUDIO_NODE_STORE.set(this, nativeAudioNode);\n            EVENT_LISTENERS.set(this, new Set());\n            if (context.state !== 'closed' && isActive) {\n                setInternalStateToActive(this);\n            }\n            addAudioNodeConnections(this, audioNodeRenderer, nativeAudioNode);\n        }\n        get channelCount() {\n            return this._nativeAudioNode.channelCount;\n        }\n        set channelCount(value) {\n            this._nativeAudioNode.channelCount = value;\n        }\n        get channelCountMode() {\n            return this._nativeAudioNode.channelCountMode;\n        }\n        set channelCountMode(value) {\n            this._nativeAudioNode.channelCountMode = value;\n        }\n        get channelInterpretation() {\n            return this._nativeAudioNode.channelInterpretation;\n        }\n        set channelInterpretation(value) {\n            this._nativeAudioNode.channelInterpretation = value;\n        }\n        get context() {\n            return this._context;\n        }\n        get numberOfInputs() {\n            return this._nativeAudioNode.numberOfInputs;\n        }\n        get numberOfOutputs() {\n            return this._nativeAudioNode.numberOfOutputs;\n        }\n        // tslint:disable-next-line:invalid-void\n        connect(destination, output = 0, input = 0) {\n            // Bug #174: Safari does expose a wrong numberOfOutputs for MediaStreamAudioDestinationNodes.\n            if (output < 0 || output >= this._nativeAudioNode.numberOfOutputs) {\n                throw createIndexSizeError();\n            }\n            const nativeContext = getNativeContext(this._context);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            if (isNativeAudioNode(destination) || isNativeAudioParam(destination)) {\n                throw createInvalidAccessError();\n            }\n            if (isAudioNode(destination)) {\n                const nativeDestinationAudioNode = getNativeAudioNode(destination);\n                try {\n                    const connection = connectNativeAudioNodeToNativeAudioNode(this._nativeAudioNode, nativeDestinationAudioNode, output, input);\n                    const isPassive = isPassiveAudioNode(this);\n                    if (isOffline || isPassive) {\n                        this._nativeAudioNode.disconnect(...connection);\n                    }\n                    if (this.context.state !== 'closed' && !isPassive && isPassiveAudioNode(destination)) {\n                        setInternalStateToActive(destination);\n                    }\n                }\n                catch (err) {\n                    // Bug #41: Safari does not throw the correct exception so far.\n                    if (err.code === 12) {\n                        throw createInvalidAccessError();\n                    }\n                    throw err;\n                }\n                const isNewConnectionToAudioNode = addConnectionToAudioNode(this, destination, output, input, isOffline);\n                // Bug #164: Only Firefox detects cycles so far.\n                if (isNewConnectionToAudioNode) {\n                    const cycles = detectCycles([this], destination);\n                    visitEachAudioNodeOnce(cycles, createIncrementCycleCounter(isOffline));\n                }\n                return destination;\n            }\n            const nativeAudioParam = getNativeAudioParam(destination);\n            /*\n             * Bug #73, #147 & #153: Safari does not support to connect an input signal to the playbackRate AudioParam of an\n             * AudioBufferSourceNode. This can't be easily detected and that's why the outdated name property is used here to identify\n             * Safari. In addition to that the maxValue property is used to only detect the affected versions below v14.0.2.\n             */\n            if (nativeAudioParam.name === 'playbackRate' && nativeAudioParam.maxValue === 1024) {\n                throw createNotSupportedError();\n            }\n            try {\n                this._nativeAudioNode.connect(nativeAudioParam, output);\n                if (isOffline || isPassiveAudioNode(this)) {\n                    this._nativeAudioNode.disconnect(nativeAudioParam, output);\n                }\n            }\n            catch (err) {\n                // Bug #58: Safari doesn't throw an InvalidAccessError yet.\n                if (err.code === 12) {\n                    throw createInvalidAccessError();\n                }\n                throw err;\n            }\n            const isNewConnectionToAudioParam = addConnectionToAudioParamOfAudioContext(this, destination, output, isOffline);\n            // Bug #164: Only Firefox detects cycles so far.\n            if (isNewConnectionToAudioParam) {\n                const cycles = detectCycles([this], destination);\n                visitEachAudioNodeOnce(cycles, createIncrementCycleCounter(isOffline));\n            }\n        }\n        disconnect(destinationOrOutput, output, input) {\n            let destinations;\n            const nativeContext = getNativeContext(this._context);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            if (destinationOrOutput === undefined) {\n                destinations = deleteAnyConnection(this, isOffline);\n            }\n            else if (typeof destinationOrOutput === 'number') {\n                if (destinationOrOutput < 0 || destinationOrOutput >= this.numberOfOutputs) {\n                    throw createIndexSizeError();\n                }\n                destinations = deleteConnectionAtOutput(this, isOffline, destinationOrOutput);\n            }\n            else {\n                if (output !== undefined && (output < 0 || output >= this.numberOfOutputs)) {\n                    throw createIndexSizeError();\n                }\n                if (isAudioNode(destinationOrOutput) && input !== undefined && (input < 0 || input >= destinationOrOutput.numberOfInputs)) {\n                    throw createIndexSizeError();\n                }\n                destinations = deleteConnectionToDestination(this, isOffline, destinationOrOutput, output, input);\n                if (destinations.length === 0) {\n                    throw createInvalidAccessError();\n                }\n            }\n            // Bug #164: Only Firefox detects cycles so far.\n            for (const destination of destinations) {\n                const cycles = detectCycles([this], destination);\n                visitEachAudioNodeOnce(cycles, decrementCycleCounter);\n            }\n        }\n    };\n};\n//# sourceMappingURL=audio-node-constructor.js.map","import { AutomationEventList } from 'automation-events';\nexport const createAudioParamFactory = (addAudioParamConnections, audioParamAudioNodeStore, audioParamStore, createAudioParamRenderer, createCancelAndHoldAutomationEvent, createCancelScheduledValuesAutomationEvent, createExponentialRampToValueAutomationEvent, createLinearRampToValueAutomationEvent, createSetTargetAutomationEvent, createSetValueAutomationEvent, createSetValueCurveAutomationEvent, nativeAudioContextConstructor, setValueAtTimeUntilPossible) => {\n    return (audioNode, isAudioParamOfOfflineAudioContext, nativeAudioParam, maxValue = null, minValue = null) => {\n        const automationEventList = new AutomationEventList(nativeAudioParam.defaultValue);\n        const audioParamRenderer = isAudioParamOfOfflineAudioContext ? createAudioParamRenderer(automationEventList) : null;\n        const audioParam = {\n            get defaultValue() {\n                return nativeAudioParam.defaultValue;\n            },\n            get maxValue() {\n                return maxValue === null ? nativeAudioParam.maxValue : maxValue;\n            },\n            get minValue() {\n                return minValue === null ? nativeAudioParam.minValue : minValue;\n            },\n            get value() {\n                return nativeAudioParam.value;\n            },\n            set value(value) {\n                nativeAudioParam.value = value;\n                // Bug #98: Firefox & Safari do not yet treat the value setter like a call to setValueAtTime().\n                audioParam.setValueAtTime(value, audioNode.context.currentTime);\n            },\n            cancelAndHoldAtTime(cancelTime) {\n                // Bug #28: Firefox & Safari do not yet implement cancelAndHoldAtTime().\n                if (typeof nativeAudioParam.cancelAndHoldAtTime === 'function') {\n                    if (audioParamRenderer === null) {\n                        automationEventList.flush(audioNode.context.currentTime);\n                    }\n                    automationEventList.add(createCancelAndHoldAutomationEvent(cancelTime));\n                    nativeAudioParam.cancelAndHoldAtTime(cancelTime);\n                }\n                else {\n                    const previousLastEvent = Array.from(automationEventList).pop();\n                    if (audioParamRenderer === null) {\n                        automationEventList.flush(audioNode.context.currentTime);\n                    }\n                    automationEventList.add(createCancelAndHoldAutomationEvent(cancelTime));\n                    const currentLastEvent = Array.from(automationEventList).pop();\n                    nativeAudioParam.cancelScheduledValues(cancelTime);\n                    if (previousLastEvent !== currentLastEvent && currentLastEvent !== undefined) {\n                        if (currentLastEvent.type === 'exponentialRampToValue') {\n                            nativeAudioParam.exponentialRampToValueAtTime(currentLastEvent.value, currentLastEvent.endTime);\n                        }\n                        else if (currentLastEvent.type === 'linearRampToValue') {\n                            nativeAudioParam.linearRampToValueAtTime(currentLastEvent.value, currentLastEvent.endTime);\n                        }\n                        else if (currentLastEvent.type === 'setValue') {\n                            nativeAudioParam.setValueAtTime(currentLastEvent.value, currentLastEvent.startTime);\n                        }\n                        else if (currentLastEvent.type === 'setValueCurve') {\n                            nativeAudioParam.setValueCurveAtTime(currentLastEvent.values, currentLastEvent.startTime, currentLastEvent.duration);\n                        }\n                    }\n                }\n                return audioParam;\n            },\n            cancelScheduledValues(cancelTime) {\n                if (audioParamRenderer === null) {\n                    automationEventList.flush(audioNode.context.currentTime);\n                }\n                automationEventList.add(createCancelScheduledValuesAutomationEvent(cancelTime));\n                nativeAudioParam.cancelScheduledValues(cancelTime);\n                return audioParam;\n            },\n            exponentialRampToValueAtTime(value, endTime) {\n                // Bug #45: Safari does not throw an error yet.\n                if (value === 0) {\n                    throw new RangeError();\n                }\n                // Bug #187: Safari does not throw an error yet.\n                if (!Number.isFinite(endTime) || endTime < 0) {\n                    throw new RangeError();\n                }\n                if (audioParamRenderer === null) {\n                    automationEventList.flush(audioNode.context.currentTime);\n                }\n                automationEventList.add(createExponentialRampToValueAutomationEvent(value, endTime));\n                nativeAudioParam.exponentialRampToValueAtTime(value, endTime);\n                return audioParam;\n            },\n            linearRampToValueAtTime(value, endTime) {\n                if (audioParamRenderer === null) {\n                    automationEventList.flush(audioNode.context.currentTime);\n                }\n                automationEventList.add(createLinearRampToValueAutomationEvent(value, endTime));\n                nativeAudioParam.linearRampToValueAtTime(value, endTime);\n                return audioParam;\n            },\n            setTargetAtTime(target, startTime, timeConstant) {\n                if (audioParamRenderer === null) {\n                    automationEventList.flush(audioNode.context.currentTime);\n                }\n                automationEventList.add(createSetTargetAutomationEvent(target, startTime, timeConstant));\n                nativeAudioParam.setTargetAtTime(target, startTime, timeConstant);\n                return audioParam;\n            },\n            setValueAtTime(value, startTime) {\n                if (audioParamRenderer === null) {\n                    automationEventList.flush(audioNode.context.currentTime);\n                }\n                automationEventList.add(createSetValueAutomationEvent(value, startTime));\n                nativeAudioParam.setValueAtTime(value, startTime);\n                return audioParam;\n            },\n            setValueCurveAtTime(values, startTime, duration) {\n                // Bug 183: Safari only accepts a Float32Array.\n                const convertedValues = values instanceof Float32Array ? values : new Float32Array(values);\n                /*\n                 * Bug #152: Safari does not correctly interpolate the values of the curve.\n                 * @todo Unfortunately there is no way to test for this behavior in a synchronous fashion which is why testing for the\n                 * existence of the webkitAudioContext is used as a workaround here.\n                 */\n                if (nativeAudioContextConstructor !== null && nativeAudioContextConstructor.name === 'webkitAudioContext') {\n                    const endTime = startTime + duration;\n                    const sampleRate = audioNode.context.sampleRate;\n                    const firstSample = Math.ceil(startTime * sampleRate);\n                    const lastSample = Math.floor(endTime * sampleRate);\n                    const numberOfInterpolatedValues = lastSample - firstSample;\n                    const interpolatedValues = new Float32Array(numberOfInterpolatedValues);\n                    for (let i = 0; i < numberOfInterpolatedValues; i += 1) {\n                        const theoreticIndex = ((convertedValues.length - 1) / duration) * ((firstSample + i) / sampleRate - startTime);\n                        const lowerIndex = Math.floor(theoreticIndex);\n                        const upperIndex = Math.ceil(theoreticIndex);\n                        interpolatedValues[i] =\n                            lowerIndex === upperIndex\n                                ? convertedValues[lowerIndex]\n                                : (1 - (theoreticIndex - lowerIndex)) * convertedValues[lowerIndex] +\n                                    (1 - (upperIndex - theoreticIndex)) * convertedValues[upperIndex];\n                    }\n                    if (audioParamRenderer === null) {\n                        automationEventList.flush(audioNode.context.currentTime);\n                    }\n                    automationEventList.add(createSetValueCurveAutomationEvent(interpolatedValues, startTime, duration));\n                    nativeAudioParam.setValueCurveAtTime(interpolatedValues, startTime, duration);\n                    const timeOfLastSample = lastSample / sampleRate;\n                    if (timeOfLastSample < endTime) {\n                        setValueAtTimeUntilPossible(audioParam, interpolatedValues[interpolatedValues.length - 1], timeOfLastSample);\n                    }\n                    setValueAtTimeUntilPossible(audioParam, convertedValues[convertedValues.length - 1], endTime);\n                }\n                else {\n                    if (audioParamRenderer === null) {\n                        automationEventList.flush(audioNode.context.currentTime);\n                    }\n                    automationEventList.add(createSetValueCurveAutomationEvent(convertedValues, startTime, duration));\n                    nativeAudioParam.setValueCurveAtTime(convertedValues, startTime, duration);\n                }\n                return audioParam;\n            }\n        };\n        audioParamStore.set(audioParam, nativeAudioParam);\n        audioParamAudioNodeStore.set(audioParam, audioNode);\n        addAudioParamConnections(audioParam, audioParamRenderer);\n        return audioParam;\n    };\n};\n//# sourceMappingURL=audio-param-factory.js.map","export const createAudioParamRenderer = (automationEventList) => {\n    return {\n        replay(audioParam) {\n            for (const automationEvent of automationEventList) {\n                if (automationEvent.type === 'exponentialRampToValue') {\n                    const { endTime, value } = automationEvent;\n                    audioParam.exponentialRampToValueAtTime(value, endTime);\n                }\n                else if (automationEvent.type === 'linearRampToValue') {\n                    const { endTime, value } = automationEvent;\n                    audioParam.linearRampToValueAtTime(value, endTime);\n                }\n                else if (automationEvent.type === 'setTarget') {\n                    const { startTime, target, timeConstant } = automationEvent;\n                    audioParam.setTargetAtTime(target, startTime, timeConstant);\n                }\n                else if (automationEvent.type === 'setValue') {\n                    const { startTime, value } = automationEvent;\n                    audioParam.setValueAtTime(value, startTime);\n                }\n                else if (automationEvent.type === 'setValueCurve') {\n                    const { duration, startTime, values } = automationEvent;\n                    audioParam.setValueCurveAtTime(values, startTime, duration);\n                }\n                else {\n                    throw new Error(\"Can't apply an unknown automation.\");\n                }\n            }\n        }\n    };\n};\n//# sourceMappingURL=audio-param-renderer.js.map","export class ReadOnlyMap {\n    constructor(parameters) {\n        this._map = new Map(parameters);\n    }\n    get size() {\n        return this._map.size;\n    }\n    entries() {\n        return this._map.entries();\n    }\n    forEach(callback, thisArg = null) {\n        return this._map.forEach((value, key) => callback.call(thisArg, value, key, this));\n    }\n    get(name) {\n        return this._map.get(name);\n    }\n    has(name) {\n        return this._map.has(name);\n    }\n    keys() {\n        return this._map.keys();\n    }\n    values() {\n        return this._map.values();\n    }\n}\n//# sourceMappingURL=read-only-map.js.map","import { NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS } from '../globals';\nimport { ReadOnlyMap } from '../read-only-map';\nconst DEFAULT_OPTIONS = {\n    channelCount: 2,\n    // Bug #61: The channelCountMode should be 'max' according to the spec but is set to 'explicit' to achieve consistent behavior.\n    channelCountMode: 'explicit',\n    channelInterpretation: 'speakers',\n    numberOfInputs: 1,\n    numberOfOutputs: 1,\n    parameterData: {},\n    processorOptions: {}\n};\nexport const createAudioWorkletNodeConstructor = (addUnrenderedAudioWorkletNode, audioNodeConstructor, createAudioParam, createAudioWorkletNodeRenderer, createNativeAudioWorkletNode, getAudioNodeConnections, getBackupOfflineAudioContext, getNativeContext, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor, sanitizeAudioWorkletNodeOptions, setActiveAudioWorkletNodeInputs, testAudioWorkletNodeOptionsClonability, wrapEventListener) => {\n    return class AudioWorkletNode extends audioNodeConstructor {\n        constructor(context, name, options) {\n            var _a;\n            const nativeContext = getNativeContext(context);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const mergedOptions = sanitizeAudioWorkletNodeOptions({ ...DEFAULT_OPTIONS, ...options });\n            // Bug #191: Safari doesn't throw an error if the options aren't clonable.\n            testAudioWorkletNodeOptionsClonability(mergedOptions);\n            const nodeNameToProcessorConstructorMap = NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS.get(nativeContext);\n            const processorConstructor = nodeNameToProcessorConstructorMap === null || nodeNameToProcessorConstructorMap === void 0 ? void 0 : nodeNameToProcessorConstructorMap.get(name);\n            // Bug #186: Chrome, Edge and Opera do not allow to create an AudioWorkletNode on a closed AudioContext.\n            const nativeContextOrBackupOfflineAudioContext = isOffline || nativeContext.state !== 'closed'\n                ? nativeContext\n                : (_a = getBackupOfflineAudioContext(nativeContext)) !== null && _a !== void 0 ? _a : nativeContext;\n            const nativeAudioWorkletNode = createNativeAudioWorkletNode(nativeContextOrBackupOfflineAudioContext, isOffline ? null : context.baseLatency, nativeAudioWorkletNodeConstructor, name, processorConstructor, mergedOptions);\n            const audioWorkletNodeRenderer = ((isOffline ? createAudioWorkletNodeRenderer(name, mergedOptions, processorConstructor) : null));\n            /*\n             * @todo Add a mechanism to switch an AudioWorkletNode to passive once the process() function of the AudioWorkletProcessor\n             * returns false.\n             */\n            super(context, true, nativeAudioWorkletNode, audioWorkletNodeRenderer);\n            const parameters = [];\n            nativeAudioWorkletNode.parameters.forEach((nativeAudioParam, nm) => {\n                const audioParam = createAudioParam(this, isOffline, nativeAudioParam);\n                parameters.push([nm, audioParam]);\n            });\n            this._nativeAudioWorkletNode = nativeAudioWorkletNode;\n            this._onprocessorerror = null;\n            this._parameters = new ReadOnlyMap(parameters);\n            /*\n             * Bug #86 & #87: Invoking the renderer of an AudioWorkletNode might be necessary if it has no direct or indirect connection to\n             * the destination.\n             */\n            if (isOffline) {\n                addUnrenderedAudioWorkletNode(nativeContext, this);\n            }\n            const { activeInputs } = getAudioNodeConnections(this);\n            setActiveAudioWorkletNodeInputs(nativeAudioWorkletNode, activeInputs);\n        }\n        get onprocessorerror() {\n            return this._onprocessorerror;\n        }\n        set onprocessorerror(value) {\n            const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n            this._nativeAudioWorkletNode.onprocessorerror = wrappedListener;\n            const nativeOnProcessorError = this._nativeAudioWorkletNode.onprocessorerror;\n            this._onprocessorerror =\n                nativeOnProcessorError !== null && nativeOnProcessorError === wrappedListener\n                    ? value\n                    : nativeOnProcessorError;\n        }\n        get parameters() {\n            if (this._parameters === null) {\n                // @todo The definition that TypeScript uses of the AudioParamMap is lacking many methods.\n                return this._nativeAudioWorkletNode.parameters;\n            }\n            return this._parameters;\n        }\n        get port() {\n            return this._nativeAudioWorkletNode.port;\n        }\n    };\n};\n//# sourceMappingURL=audio-worklet-node-constructor.js.map","export function copyFromChannel(audioBuffer, \n// @todo There is currently no way to define something like { [ key: number | string ]: Float32Array }\nparent, key, channelNumber, bufferOffset) {\n    if (typeof audioBuffer.copyFromChannel === 'function') {\n        // The byteLength will be 0 when the ArrayBuffer was transferred.\n        if (parent[key].byteLength === 0) {\n            parent[key] = new Float32Array(128);\n        }\n        audioBuffer.copyFromChannel(parent[key], channelNumber, bufferOffset);\n        // Bug #5: Safari does not support copyFromChannel().\n    }\n    else {\n        const channelData = audioBuffer.getChannelData(channelNumber);\n        // The byteLength will be 0 when the ArrayBuffer was transferred.\n        if (parent[key].byteLength === 0) {\n            parent[key] = channelData.slice(bufferOffset, bufferOffset + 128);\n        }\n        else {\n            const slicedInput = new Float32Array(channelData.buffer, bufferOffset * Float32Array.BYTES_PER_ELEMENT, 128);\n            parent[key].set(slicedInput);\n        }\n    }\n}\n//# sourceMappingURL=copy-from-channel.js.map","export const copyToChannel = (audioBuffer, parent, key, channelNumber, bufferOffset) => {\n    if (typeof audioBuffer.copyToChannel === 'function') {\n        // The byteLength will be 0 when the ArrayBuffer was transferred.\n        if (parent[key].byteLength !== 0) {\n            audioBuffer.copyToChannel(parent[key], channelNumber, bufferOffset);\n        }\n        // Bug #5: Safari does not support copyToChannel().\n    }\n    else {\n        // The byteLength will be 0 when the ArrayBuffer was transferred.\n        if (parent[key].byteLength !== 0) {\n            audioBuffer.getChannelData(channelNumber).set(parent[key], bufferOffset);\n        }\n    }\n};\n//# sourceMappingURL=copy-to-channel.js.map","export const createNestedArrays = (x, y) => {\n    const arrays = [];\n    for (let i = 0; i < x; i += 1) {\n        const array = [];\n        const length = typeof y === 'number' ? y : y[i];\n        for (let j = 0; j < length; j += 1) {\n            array.push(new Float32Array(128));\n        }\n        arrays.push(array);\n    }\n    return arrays;\n};\n//# sourceMappingURL=create-nested-arrays.js.map","import { NODE_TO_PROCESSOR_MAPS } from '../globals';\nimport { getNativeAudioNode } from './get-native-audio-node';\nimport { getValueForKey } from './get-value-for-key';\nexport const getAudioWorkletProcessor = (nativeOfflineAudioContext, proxy) => {\n    const nodeToProcessorMap = getValueForKey(NODE_TO_PROCESSOR_MAPS, nativeOfflineAudioContext);\n    const nativeAudioWorkletNode = getNativeAudioNode(proxy);\n    return getValueForKey(nodeToProcessorMap, nativeAudioWorkletNode);\n};\n//# sourceMappingURL=get-audio-worklet-processor.js.map","import { copyFromChannel } from '../helpers/copy-from-channel';\nimport { copyToChannel } from '../helpers/copy-to-channel';\nimport { createNestedArrays } from '../helpers/create-nested-arrays';\nimport { getAudioNodeConnections } from '../helpers/get-audio-node-connections';\nimport { getAudioWorkletProcessor } from '../helpers/get-audio-worklet-processor';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nconst processBuffer = async (proxy, renderedBuffer, nativeOfflineAudioContext, options, outputChannelCount, processorConstructor, exposeCurrentFrameAndCurrentTime) => {\n    // Ceil the length to the next full render quantum.\n    // Bug #17: Safari does not yet expose the length.\n    const length = renderedBuffer === null ? Math.ceil(proxy.context.length / 128) * 128 : renderedBuffer.length;\n    const numberOfInputChannels = options.channelCount * options.numberOfInputs;\n    const numberOfOutputChannels = outputChannelCount.reduce((sum, value) => sum + value, 0);\n    const processedBuffer = numberOfOutputChannels === 0\n        ? null\n        : nativeOfflineAudioContext.createBuffer(numberOfOutputChannels, length, nativeOfflineAudioContext.sampleRate);\n    if (processorConstructor === undefined) {\n        throw new Error('Missing the processor constructor.');\n    }\n    const audioNodeConnections = getAudioNodeConnections(proxy);\n    const audioWorkletProcessor = await getAudioWorkletProcessor(nativeOfflineAudioContext, proxy);\n    const inputs = createNestedArrays(options.numberOfInputs, options.channelCount);\n    const outputs = createNestedArrays(options.numberOfOutputs, outputChannelCount);\n    const parameters = Array.from(proxy.parameters.keys()).reduce((prmtrs, name) => ({ ...prmtrs, [name]: new Float32Array(128) }), {});\n    for (let i = 0; i < length; i += 128) {\n        if (options.numberOfInputs > 0 && renderedBuffer !== null) {\n            for (let j = 0; j < options.numberOfInputs; j += 1) {\n                for (let k = 0; k < options.channelCount; k += 1) {\n                    copyFromChannel(renderedBuffer, inputs[j], k, k, i);\n                }\n            }\n        }\n        if (processorConstructor.parameterDescriptors !== undefined && renderedBuffer !== null) {\n            processorConstructor.parameterDescriptors.forEach(({ name }, index) => {\n                copyFromChannel(renderedBuffer, parameters, name, numberOfInputChannels + index, i);\n            });\n        }\n        for (let j = 0; j < options.numberOfInputs; j += 1) {\n            for (let k = 0; k < outputChannelCount[j]; k += 1) {\n                // The byteLength will be 0 when the ArrayBuffer was transferred.\n                if (outputs[j][k].byteLength === 0) {\n                    outputs[j][k] = new Float32Array(128);\n                }\n            }\n        }\n        try {\n            const potentiallyEmptyInputs = inputs.map((input, index) => {\n                if (audioNodeConnections.activeInputs[index].size === 0) {\n                    return [];\n                }\n                return input;\n            });\n            const activeSourceFlag = exposeCurrentFrameAndCurrentTime(i / nativeOfflineAudioContext.sampleRate, nativeOfflineAudioContext.sampleRate, () => audioWorkletProcessor.process(potentiallyEmptyInputs, outputs, parameters));\n            if (processedBuffer !== null) {\n                for (let j = 0, outputChannelSplitterNodeOutput = 0; j < options.numberOfOutputs; j += 1) {\n                    for (let k = 0; k < outputChannelCount[j]; k += 1) {\n                        copyToChannel(processedBuffer, outputs[j], k, outputChannelSplitterNodeOutput + k, i);\n                    }\n                    outputChannelSplitterNodeOutput += outputChannelCount[j];\n                }\n            }\n            if (!activeSourceFlag) {\n                break;\n            }\n        }\n        catch (error) {\n            proxy.dispatchEvent(new ErrorEvent('processorerror', {\n                colno: error.colno,\n                filename: error.filename,\n                lineno: error.lineno,\n                message: error.message\n            }));\n            break;\n        }\n    }\n    return processedBuffer;\n};\nexport const createAudioWorkletNodeRendererFactory = (connectAudioParam, connectMultipleOutputs, createNativeAudioBufferSourceNode, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, deleteUnrenderedAudioWorkletNode, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getNativeAudioNode, nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext) => {\n    return (name, options, processorConstructor) => {\n        const renderedNativeAudioNodes = new WeakMap();\n        let processedBufferPromise = null;\n        const createAudioNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeAudioWorkletNode = getNativeAudioNode(proxy);\n            let nativeOutputNodes = null;\n            const nativeAudioWorkletNodeIsOwnedByContext = isOwnedByContext(nativeAudioWorkletNode, nativeOfflineAudioContext);\n            const outputChannelCount = Array.isArray(options.outputChannelCount)\n                ? options.outputChannelCount\n                : Array.from(options.outputChannelCount);\n            // Bug #61: Only Chrome, Edge, Firefox & Opera have an implementation of the AudioWorkletNode yet.\n            if (nativeAudioWorkletNodeConstructor === null) {\n                const numberOfOutputChannels = outputChannelCount.reduce((sum, value) => sum + value, 0);\n                const outputChannelSplitterNode = createNativeChannelSplitterNode(nativeOfflineAudioContext, {\n                    channelCount: Math.max(1, numberOfOutputChannels),\n                    channelCountMode: 'explicit',\n                    channelInterpretation: 'discrete',\n                    numberOfOutputs: Math.max(1, numberOfOutputChannels)\n                });\n                const outputChannelMergerNodes = [];\n                for (let i = 0; i < proxy.numberOfOutputs; i += 1) {\n                    outputChannelMergerNodes.push(createNativeChannelMergerNode(nativeOfflineAudioContext, {\n                        channelCount: 1,\n                        channelCountMode: 'explicit',\n                        channelInterpretation: 'speakers',\n                        numberOfInputs: outputChannelCount[i]\n                    }));\n                }\n                const outputGainNode = createNativeGainNode(nativeOfflineAudioContext, {\n                    channelCount: options.channelCount,\n                    channelCountMode: options.channelCountMode,\n                    channelInterpretation: options.channelInterpretation,\n                    gain: 1\n                });\n                outputGainNode.connect = connectMultipleOutputs.bind(null, outputChannelMergerNodes);\n                outputGainNode.disconnect = disconnectMultipleOutputs.bind(null, outputChannelMergerNodes);\n                nativeOutputNodes = [outputChannelSplitterNode, outputChannelMergerNodes, outputGainNode];\n            }\n            else if (!nativeAudioWorkletNodeIsOwnedByContext) {\n                nativeAudioWorkletNode = new nativeAudioWorkletNodeConstructor(nativeOfflineAudioContext, name);\n            }\n            renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeOutputNodes === null ? nativeAudioWorkletNode : nativeOutputNodes[2]);\n            if (nativeOutputNodes !== null) {\n                if (processedBufferPromise === null) {\n                    if (processorConstructor === undefined) {\n                        throw new Error('Missing the processor constructor.');\n                    }\n                    if (nativeOfflineAudioContextConstructor === null) {\n                        throw new Error('Missing the native OfflineAudioContext constructor.');\n                    }\n                    // Bug #47: The AudioDestinationNode in Safari gets not initialized correctly.\n                    const numberOfInputChannels = proxy.channelCount * proxy.numberOfInputs;\n                    const numberOfParameters = processorConstructor.parameterDescriptors === undefined ? 0 : processorConstructor.parameterDescriptors.length;\n                    const numberOfChannels = numberOfInputChannels + numberOfParameters;\n                    const renderBuffer = async () => {\n                        const partialOfflineAudioContext = new nativeOfflineAudioContextConstructor(numberOfChannels, \n                        // Ceil the length to the next full render quantum.\n                        // Bug #17: Safari does not yet expose the length.\n                        Math.ceil(proxy.context.length / 128) * 128, nativeOfflineAudioContext.sampleRate);\n                        const gainNodes = [];\n                        const inputChannelSplitterNodes = [];\n                        for (let i = 0; i < options.numberOfInputs; i += 1) {\n                            gainNodes.push(createNativeGainNode(partialOfflineAudioContext, {\n                                channelCount: options.channelCount,\n                                channelCountMode: options.channelCountMode,\n                                channelInterpretation: options.channelInterpretation,\n                                gain: 1\n                            }));\n                            inputChannelSplitterNodes.push(createNativeChannelSplitterNode(partialOfflineAudioContext, {\n                                channelCount: options.channelCount,\n                                channelCountMode: 'explicit',\n                                channelInterpretation: 'discrete',\n                                numberOfOutputs: options.channelCount\n                            }));\n                        }\n                        const constantSourceNodes = await Promise.all(Array.from(proxy.parameters.values()).map(async (audioParam) => {\n                            const constantSourceNode = createNativeConstantSourceNode(partialOfflineAudioContext, {\n                                channelCount: 1,\n                                channelCountMode: 'explicit',\n                                channelInterpretation: 'discrete',\n                                offset: audioParam.value\n                            });\n                            await renderAutomation(partialOfflineAudioContext, audioParam, constantSourceNode.offset);\n                            return constantSourceNode;\n                        }));\n                        const inputChannelMergerNode = createNativeChannelMergerNode(partialOfflineAudioContext, {\n                            channelCount: 1,\n                            channelCountMode: 'explicit',\n                            channelInterpretation: 'speakers',\n                            numberOfInputs: Math.max(1, numberOfInputChannels + numberOfParameters)\n                        });\n                        for (let i = 0; i < options.numberOfInputs; i += 1) {\n                            gainNodes[i].connect(inputChannelSplitterNodes[i]);\n                            for (let j = 0; j < options.channelCount; j += 1) {\n                                inputChannelSplitterNodes[i].connect(inputChannelMergerNode, j, i * options.channelCount + j);\n                            }\n                        }\n                        for (const [index, constantSourceNode] of constantSourceNodes.entries()) {\n                            constantSourceNode.connect(inputChannelMergerNode, 0, numberOfInputChannels + index);\n                            constantSourceNode.start(0);\n                        }\n                        inputChannelMergerNode.connect(partialOfflineAudioContext.destination);\n                        await Promise.all(gainNodes.map((gainNode) => renderInputsOfAudioNode(proxy, partialOfflineAudioContext, gainNode)));\n                        return renderNativeOfflineAudioContext(partialOfflineAudioContext);\n                    };\n                    processedBufferPromise = processBuffer(proxy, numberOfChannels === 0 ? null : await renderBuffer(), nativeOfflineAudioContext, options, outputChannelCount, processorConstructor, exposeCurrentFrameAndCurrentTime);\n                }\n                const processedBuffer = await processedBufferPromise;\n                const audioBufferSourceNode = createNativeAudioBufferSourceNode(nativeOfflineAudioContext, {\n                    buffer: null,\n                    channelCount: 2,\n                    channelCountMode: 'max',\n                    channelInterpretation: 'speakers',\n                    loop: false,\n                    loopEnd: 0,\n                    loopStart: 0,\n                    playbackRate: 1\n                });\n                const [outputChannelSplitterNode, outputChannelMergerNodes, outputGainNode] = nativeOutputNodes;\n                if (processedBuffer !== null) {\n                    audioBufferSourceNode.buffer = processedBuffer;\n                    audioBufferSourceNode.start(0);\n                }\n                audioBufferSourceNode.connect(outputChannelSplitterNode);\n                for (let i = 0, outputChannelSplitterNodeOutput = 0; i < proxy.numberOfOutputs; i += 1) {\n                    const outputChannelMergerNode = outputChannelMergerNodes[i];\n                    for (let j = 0; j < outputChannelCount[i]; j += 1) {\n                        outputChannelSplitterNode.connect(outputChannelMergerNode, outputChannelSplitterNodeOutput + j, j);\n                    }\n                    outputChannelSplitterNodeOutput += outputChannelCount[i];\n                }\n                return outputGainNode;\n            }\n            if (!nativeAudioWorkletNodeIsOwnedByContext) {\n                for (const [nm, audioParam] of proxy.parameters.entries()) {\n                    await renderAutomation(nativeOfflineAudioContext, audioParam, \n                    // @todo The definition that TypeScript uses of the AudioParamMap is lacking many methods.\n                    nativeAudioWorkletNode.parameters.get(nm));\n                }\n            }\n            else {\n                for (const [nm, audioParam] of proxy.parameters.entries()) {\n                    await connectAudioParam(nativeOfflineAudioContext, audioParam, \n                    // @todo The definition that TypeScript uses of the AudioParamMap is lacking many methods.\n                    nativeAudioWorkletNode.parameters.get(nm));\n                }\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioWorkletNode);\n            return nativeAudioWorkletNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                deleteUnrenderedAudioWorkletNode(nativeOfflineAudioContext, proxy);\n                const renderedNativeAudioWorkletNodeOrGainNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeAudioWorkletNodeOrGainNode !== undefined) {\n                    return Promise.resolve(renderedNativeAudioWorkletNodeOrGainNode);\n                }\n                return createAudioNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=audio-worklet-node-renderer-factory.js.map","export const createBaseAudioContextConstructor = (addAudioWorkletModule, analyserNodeConstructor, audioBufferConstructor, audioBufferSourceNodeConstructor, biquadFilterNodeConstructor, channelMergerNodeConstructor, channelSplitterNodeConstructor, constantSourceNodeConstructor, convolverNodeConstructor, decodeAudioData, delayNodeConstructor, dynamicsCompressorNodeConstructor, gainNodeConstructor, iIRFilterNodeConstructor, minimalBaseAudioContextConstructor, oscillatorNodeConstructor, pannerNodeConstructor, periodicWaveConstructor, stereoPannerNodeConstructor, waveShaperNodeConstructor) => {\n    return class BaseAudioContext extends minimalBaseAudioContextConstructor {\n        constructor(_nativeContext, numberOfChannels) {\n            super(_nativeContext, numberOfChannels);\n            this._nativeContext = _nativeContext;\n            this._audioWorklet =\n                addAudioWorkletModule === undefined\n                    ? undefined\n                    : {\n                        addModule: (moduleURL, options) => {\n                            return addAudioWorkletModule(this, moduleURL, options);\n                        }\n                    };\n        }\n        get audioWorklet() {\n            return this._audioWorklet;\n        }\n        createAnalyser() {\n            return new analyserNodeConstructor(this);\n        }\n        createBiquadFilter() {\n            return new biquadFilterNodeConstructor(this);\n        }\n        createBuffer(numberOfChannels, length, sampleRate) {\n            return new audioBufferConstructor({ length, numberOfChannels, sampleRate });\n        }\n        createBufferSource() {\n            return new audioBufferSourceNodeConstructor(this);\n        }\n        createChannelMerger(numberOfInputs = 6) {\n            return new channelMergerNodeConstructor(this, { numberOfInputs });\n        }\n        createChannelSplitter(numberOfOutputs = 6) {\n            return new channelSplitterNodeConstructor(this, { numberOfOutputs });\n        }\n        createConstantSource() {\n            return new constantSourceNodeConstructor(this);\n        }\n        createConvolver() {\n            return new convolverNodeConstructor(this);\n        }\n        createDelay(maxDelayTime = 1) {\n            return new delayNodeConstructor(this, { maxDelayTime });\n        }\n        createDynamicsCompressor() {\n            return new dynamicsCompressorNodeConstructor(this);\n        }\n        createGain() {\n            return new gainNodeConstructor(this);\n        }\n        createIIRFilter(feedforward, feedback) {\n            return new iIRFilterNodeConstructor(this, { feedback, feedforward });\n        }\n        createOscillator() {\n            return new oscillatorNodeConstructor(this);\n        }\n        createPanner() {\n            return new pannerNodeConstructor(this);\n        }\n        createPeriodicWave(real, imag, constraints = { disableNormalization: false }) {\n            return new periodicWaveConstructor(this, { ...constraints, imag, real });\n        }\n        createStereoPanner() {\n            return new stereoPannerNodeConstructor(this);\n        }\n        createWaveShaper() {\n            return new waveShaperNodeConstructor(this);\n        }\n        decodeAudioData(audioData, successCallback, errorCallback) {\n            return decodeAudioData(this._nativeContext, audioData).then((audioBuffer) => {\n                if (typeof successCallback === 'function') {\n                    successCallback(audioBuffer);\n                }\n                return audioBuffer;\n            }, (err) => {\n                if (typeof errorCallback === 'function') {\n                    errorCallback(err);\n                }\n                throw err;\n            });\n        }\n    };\n};\n//# sourceMappingURL=base-audio-context-constructor.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nconst DEFAULT_OPTIONS = {\n    Q: 1,\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    detune: 0,\n    frequency: 350,\n    gain: 0,\n    type: 'lowpass'\n};\nexport const createBiquadFilterNodeConstructor = (audioNodeConstructor, createAudioParam, createBiquadFilterNodeRenderer, createInvalidAccessError, createNativeBiquadFilterNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class BiquadFilterNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeBiquadFilterNode = createNativeBiquadFilterNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const biquadFilterNodeRenderer = (isOffline ? createBiquadFilterNodeRenderer() : null);\n            super(context, false, nativeBiquadFilterNode, biquadFilterNodeRenderer);\n            // Bug #80: Safari does not export the correct values for maxValue and minValue.\n            this._Q = createAudioParam(this, isOffline, nativeBiquadFilterNode.Q, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            // Bug #78: Firefox & Safari do not export the correct values for maxValue and minValue.\n            this._detune = createAudioParam(this, isOffline, nativeBiquadFilterNode.detune, 1200 * Math.log2(MOST_POSITIVE_SINGLE_FLOAT), -1200 * Math.log2(MOST_POSITIVE_SINGLE_FLOAT));\n            // Bug #77: Firefox & Safari do not export the correct value for minValue.\n            this._frequency = createAudioParam(this, isOffline, nativeBiquadFilterNode.frequency, context.sampleRate / 2, 0);\n            // Bug #79: Firefox & Safari do not export the correct values for maxValue and minValue.\n            this._gain = createAudioParam(this, isOffline, nativeBiquadFilterNode.gain, 40 * Math.log10(MOST_POSITIVE_SINGLE_FLOAT), MOST_NEGATIVE_SINGLE_FLOAT);\n            this._nativeBiquadFilterNode = nativeBiquadFilterNode;\n            // @todo Determine a meaningful tail-time instead of just using one second.\n            setAudioNodeTailTime(this, 1);\n        }\n        get detune() {\n            return this._detune;\n        }\n        get frequency() {\n            return this._frequency;\n        }\n        get gain() {\n            return this._gain;\n        }\n        get Q() {\n            return this._Q;\n        }\n        get type() {\n            return this._nativeBiquadFilterNode.type;\n        }\n        set type(value) {\n            this._nativeBiquadFilterNode.type = value;\n        }\n        getFrequencyResponse(frequencyHz, magResponse, phaseResponse) {\n            // Bug #189: Safari does throw an InvalidStateError.\n            try {\n                this._nativeBiquadFilterNode.getFrequencyResponse(frequencyHz, magResponse, phaseResponse);\n            }\n            catch (err) {\n                if (err.code === 11) {\n                    throw createInvalidAccessError();\n                }\n                throw err;\n            }\n            // Bug #68: Safari does not throw an error if the parameters differ in their length.\n            if (frequencyHz.length !== magResponse.length || magResponse.length !== phaseResponse.length) {\n                throw createInvalidAccessError();\n            }\n        }\n    };\n};\n//# sourceMappingURL=biquad-filter-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createBiquadFilterNodeRendererFactory = (connectAudioParam, createNativeBiquadFilterNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeBiquadFilterNodes = new WeakMap();\n        const createBiquadFilterNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeBiquadFilterNode = getNativeAudioNode(proxy);\n            /*\n             * If the initially used nativeBiquadFilterNode was not constructed on the same OfflineAudioContext it needs to be created\n             * again.\n             */\n            const nativeBiquadFilterNodeIsOwnedByContext = isOwnedByContext(nativeBiquadFilterNode, nativeOfflineAudioContext);\n            if (!nativeBiquadFilterNodeIsOwnedByContext) {\n                const options = {\n                    Q: nativeBiquadFilterNode.Q.value,\n                    channelCount: nativeBiquadFilterNode.channelCount,\n                    channelCountMode: nativeBiquadFilterNode.channelCountMode,\n                    channelInterpretation: nativeBiquadFilterNode.channelInterpretation,\n                    detune: nativeBiquadFilterNode.detune.value,\n                    frequency: nativeBiquadFilterNode.frequency.value,\n                    gain: nativeBiquadFilterNode.gain.value,\n                    type: nativeBiquadFilterNode.type\n                };\n                nativeBiquadFilterNode = createNativeBiquadFilterNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeBiquadFilterNodes.set(nativeOfflineAudioContext, nativeBiquadFilterNode);\n            if (!nativeBiquadFilterNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.Q, nativeBiquadFilterNode.Q);\n                await renderAutomation(nativeOfflineAudioContext, proxy.detune, nativeBiquadFilterNode.detune);\n                await renderAutomation(nativeOfflineAudioContext, proxy.frequency, nativeBiquadFilterNode.frequency);\n                await renderAutomation(nativeOfflineAudioContext, proxy.gain, nativeBiquadFilterNode.gain);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.Q, nativeBiquadFilterNode.Q);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.detune, nativeBiquadFilterNode.detune);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.frequency, nativeBiquadFilterNode.frequency);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.gain, nativeBiquadFilterNode.gain);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeBiquadFilterNode);\n            return nativeBiquadFilterNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeBiquadFilterNode = renderedNativeBiquadFilterNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeBiquadFilterNode !== undefined) {\n                    return Promise.resolve(renderedNativeBiquadFilterNode);\n                }\n                return createBiquadFilterNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=biquad-filter-node-renderer-factory.js.map","export const createCacheTestResult = (ongoingTests, testResults) => {\n    return (tester, test) => {\n        const cachedTestResult = testResults.get(tester);\n        if (cachedTestResult !== undefined) {\n            return cachedTestResult;\n        }\n        const ongoingTest = ongoingTests.get(tester);\n        if (ongoingTest !== undefined) {\n            return ongoingTest;\n        }\n        try {\n            const synchronousTestResult = test();\n            if (synchronousTestResult instanceof Promise) {\n                ongoingTests.set(tester, synchronousTestResult);\n                return synchronousTestResult\n                    .catch(() => false)\n                    .then((finalTestResult) => {\n                    ongoingTests.delete(tester);\n                    testResults.set(tester, finalTestResult);\n                    return finalTestResult;\n                });\n            }\n            testResults.set(tester, synchronousTestResult);\n            return synchronousTestResult;\n        }\n        catch {\n            testResults.set(tester, false);\n            return false;\n        }\n    };\n};\n//# sourceMappingURL=cache-test-result.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 1,\n    channelCountMode: 'explicit',\n    channelInterpretation: 'speakers',\n    numberOfInputs: 6\n};\nexport const createChannelMergerNodeConstructor = (audioNodeConstructor, createChannelMergerNodeRenderer, createNativeChannelMergerNode, getNativeContext, isNativeOfflineAudioContext) => {\n    return class ChannelMergerNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeChannelMergerNode = createNativeChannelMergerNode(nativeContext, mergedOptions);\n            const channelMergerNodeRenderer = ((isNativeOfflineAudioContext(nativeContext) ? createChannelMergerNodeRenderer() : null));\n            super(context, false, nativeChannelMergerNode, channelMergerNodeRenderer);\n        }\n    };\n};\n//# sourceMappingURL=channel-merger-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createChannelMergerNodeRendererFactory = (createNativeChannelMergerNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeAudioNodes = new WeakMap();\n        const createAudioNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeAudioNode = getNativeAudioNode(proxy);\n            // If the initially used nativeAudioNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeAudioNodeIsOwnedByContext = isOwnedByContext(nativeAudioNode, nativeOfflineAudioContext);\n            if (!nativeAudioNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeAudioNode.channelCount,\n                    channelCountMode: nativeAudioNode.channelCountMode,\n                    channelInterpretation: nativeAudioNode.channelInterpretation,\n                    numberOfInputs: nativeAudioNode.numberOfInputs\n                };\n                nativeAudioNode = createNativeChannelMergerNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeAudioNode);\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioNode);\n            return nativeAudioNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeAudioNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeAudioNode !== undefined) {\n                    return Promise.resolve(renderedNativeAudioNode);\n                }\n                return createAudioNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=channel-merger-node-renderer-factory.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 6,\n    channelCountMode: 'explicit',\n    channelInterpretation: 'discrete',\n    numberOfOutputs: 6\n};\nexport const createChannelSplitterNodeConstructor = (audioNodeConstructor, createChannelSplitterNodeRenderer, createNativeChannelSplitterNode, getNativeContext, isNativeOfflineAudioContext, sanitizeChannelSplitterOptions) => {\n    return class ChannelSplitterNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = sanitizeChannelSplitterOptions({ ...DEFAULT_OPTIONS, ...options });\n            const nativeChannelSplitterNode = createNativeChannelSplitterNode(nativeContext, mergedOptions);\n            const channelSplitterNodeRenderer = ((isNativeOfflineAudioContext(nativeContext) ? createChannelSplitterNodeRenderer() : null));\n            super(context, false, nativeChannelSplitterNode, channelSplitterNodeRenderer);\n        }\n    };\n};\n//# sourceMappingURL=channel-splitter-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createChannelSplitterNodeRendererFactory = (createNativeChannelSplitterNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeAudioNodes = new WeakMap();\n        const createAudioNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeAudioNode = getNativeAudioNode(proxy);\n            // If the initially used nativeAudioNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeAudioNodeIsOwnedByContext = isOwnedByContext(nativeAudioNode, nativeOfflineAudioContext);\n            if (!nativeAudioNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeAudioNode.channelCount,\n                    channelCountMode: nativeAudioNode.channelCountMode,\n                    channelInterpretation: nativeAudioNode.channelInterpretation,\n                    numberOfOutputs: nativeAudioNode.numberOfOutputs\n                };\n                nativeAudioNode = createNativeChannelSplitterNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeAudioNode);\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioNode);\n            return nativeAudioNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeAudioNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeAudioNode !== undefined) {\n                    return Promise.resolve(renderedNativeAudioNode);\n                }\n                return createAudioNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=channel-splitter-node-renderer-factory.js.map","export const createConnectAudioParam = (renderInputsOfAudioParam) => {\n    return (nativeOfflineAudioContext, audioParam, nativeAudioParam) => {\n        return renderInputsOfAudioParam(audioParam, nativeOfflineAudioContext, nativeAudioParam);\n    };\n};\n//# sourceMappingURL=connect-audio-param.js.map","import { isNativeAudioNode } from '../guards/native-audio-node';\nexport const createConnectMultipleOutputs = (createIndexSizeError) => {\n    return (outputAudioNodes, destination, output = 0, input = 0) => {\n        const outputAudioNode = outputAudioNodes[output];\n        if (outputAudioNode === undefined) {\n            throw createIndexSizeError();\n        }\n        if (isNativeAudioNode(destination)) {\n            return outputAudioNode.connect(destination, 0, input);\n        }\n        return outputAudioNode.connect(destination, 0);\n    };\n};\n//# sourceMappingURL=connect-multiple-outputs.js.map","export const createConnectedNativeAudioBufferSourceNodeFactory = (createNativeAudioBufferSourceNode) => {\n    return (nativeContext, nativeAudioNode) => {\n        const nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeContext, {\n            buffer: null,\n            channelCount: 2,\n            channelCountMode: 'max',\n            channelInterpretation: 'speakers',\n            loop: false,\n            loopEnd: 0,\n            loopStart: 0,\n            playbackRate: 1\n        });\n        const nativeAudioBuffer = nativeContext.createBuffer(1, 2, 44100);\n        nativeAudioBufferSourceNode.buffer = nativeAudioBuffer;\n        nativeAudioBufferSourceNode.loop = true;\n        nativeAudioBufferSourceNode.connect(nativeAudioNode);\n        nativeAudioBufferSourceNode.start();\n        return () => {\n            nativeAudioBufferSourceNode.stop();\n            nativeAudioBufferSourceNode.disconnect(nativeAudioNode);\n        };\n    };\n};\n//# sourceMappingURL=connected-native-audio-buffer-source-node-factory.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nimport { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassive } from '../helpers/set-internal-state-to-passive';\nconst DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    offset: 1\n};\nexport const createConstantSourceNodeConstructor = (audioNodeConstructor, createAudioParam, createConstantSourceNodeRendererFactory, createNativeConstantSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener) => {\n    return class ConstantSourceNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeConstantSourceNode = createNativeConstantSourceNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const constantSourceNodeRenderer = ((isOffline ? createConstantSourceNodeRendererFactory() : null));\n            super(context, false, nativeConstantSourceNode, constantSourceNodeRenderer);\n            this._constantSourceNodeRenderer = constantSourceNodeRenderer;\n            this._nativeConstantSourceNode = nativeConstantSourceNode;\n            /*\n             * Bug #62 & #74: Safari does not support ConstantSourceNodes and does not export the correct values for maxValue and minValue\n             * for GainNodes.\n             */\n            this._offset = createAudioParam(this, isOffline, nativeConstantSourceNode.offset, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            this._onended = null;\n        }\n        get offset() {\n            return this._offset;\n        }\n        get onended() {\n            return this._onended;\n        }\n        set onended(value) {\n            const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n            this._nativeConstantSourceNode.onended = wrappedListener;\n            const nativeOnEnded = this._nativeConstantSourceNode.onended;\n            this._onended = nativeOnEnded !== null && nativeOnEnded === wrappedListener ? value : nativeOnEnded;\n        }\n        start(when = 0) {\n            this._nativeConstantSourceNode.start(when);\n            if (this._constantSourceNodeRenderer !== null) {\n                this._constantSourceNodeRenderer.start = when;\n            }\n            if (this.context.state !== 'closed') {\n                setInternalStateToActive(this);\n                const resetInternalStateToPassive = () => {\n                    this._nativeConstantSourceNode.removeEventListener('ended', resetInternalStateToPassive);\n                    if (isActiveAudioNode(this)) {\n                        setInternalStateToPassive(this);\n                    }\n                };\n                this._nativeConstantSourceNode.addEventListener('ended', resetInternalStateToPassive);\n            }\n        }\n        stop(when = 0) {\n            this._nativeConstantSourceNode.stop(when);\n            if (this._constantSourceNodeRenderer !== null) {\n                this._constantSourceNodeRenderer.stop = when;\n            }\n        }\n    };\n};\n//# sourceMappingURL=constant-source-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createConstantSourceNodeRendererFactory = (connectAudioParam, createNativeConstantSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeConstantSourceNodes = new WeakMap();\n        let start = null;\n        let stop = null;\n        const createConstantSourceNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeConstantSourceNode = getNativeAudioNode(proxy);\n            /*\n             * If the initially used nativeConstantSourceNode was not constructed on the same OfflineAudioContext it needs to be created\n             * again.\n             */\n            const nativeConstantSourceNodeIsOwnedByContext = isOwnedByContext(nativeConstantSourceNode, nativeOfflineAudioContext);\n            if (!nativeConstantSourceNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeConstantSourceNode.channelCount,\n                    channelCountMode: nativeConstantSourceNode.channelCountMode,\n                    channelInterpretation: nativeConstantSourceNode.channelInterpretation,\n                    offset: nativeConstantSourceNode.offset.value\n                };\n                nativeConstantSourceNode = createNativeConstantSourceNode(nativeOfflineAudioContext, options);\n                if (start !== null) {\n                    nativeConstantSourceNode.start(start);\n                }\n                if (stop !== null) {\n                    nativeConstantSourceNode.stop(stop);\n                }\n            }\n            renderedNativeConstantSourceNodes.set(nativeOfflineAudioContext, nativeConstantSourceNode);\n            if (!nativeConstantSourceNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.offset, nativeConstantSourceNode.offset);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.offset, nativeConstantSourceNode.offset);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeConstantSourceNode);\n            return nativeConstantSourceNode;\n        };\n        return {\n            set start(value) {\n                start = value;\n            },\n            set stop(value) {\n                stop = value;\n            },\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeConstantSourceNode = renderedNativeConstantSourceNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeConstantSourceNode !== undefined) {\n                    return Promise.resolve(renderedNativeConstantSourceNode);\n                }\n                return createConstantSourceNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=constant-source-node-renderer-factory.js.map","export const createConvertNumberToUnsignedLong = (unit32Array) => {\n    return (value) => {\n        unit32Array[0] = value;\n        return unit32Array[0];\n    };\n};\n//# sourceMappingURL=convert-number-to-unsigned-long.js.map","const DEFAULT_OPTIONS = {\n    buffer: null,\n    channelCount: 2,\n    channelCountMode: 'clamped-max',\n    channelInterpretation: 'speakers',\n    disableNormalization: false\n};\nexport const createConvolverNodeConstructor = (audioNodeConstructor, createConvolverNodeRenderer, createNativeConvolverNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class ConvolverNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeConvolverNode = createNativeConvolverNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const convolverNodeRenderer = (isOffline ? createConvolverNodeRenderer() : null);\n            super(context, false, nativeConvolverNode, convolverNodeRenderer);\n            this._isBufferNullified = false;\n            this._nativeConvolverNode = nativeConvolverNode;\n            if (mergedOptions.buffer !== null) {\n                setAudioNodeTailTime(this, mergedOptions.buffer.duration);\n            }\n        }\n        get buffer() {\n            if (this._isBufferNullified) {\n                return null;\n            }\n            return this._nativeConvolverNode.buffer;\n        }\n        set buffer(value) {\n            this._nativeConvolverNode.buffer = value;\n            // Bug #115: Safari does not allow to set the buffer to null.\n            if (value === null && this._nativeConvolverNode.buffer !== null) {\n                const nativeContext = this._nativeConvolverNode.context;\n                this._nativeConvolverNode.buffer = nativeContext.createBuffer(1, 1, 44100);\n                this._isBufferNullified = true;\n                setAudioNodeTailTime(this, 0);\n            }\n            else {\n                this._isBufferNullified = false;\n                setAudioNodeTailTime(this, this._nativeConvolverNode.buffer === null ? 0 : this._nativeConvolverNode.buffer.duration);\n            }\n        }\n        get normalize() {\n            return this._nativeConvolverNode.normalize;\n        }\n        set normalize(value) {\n            this._nativeConvolverNode.normalize = value;\n        }\n    };\n};\n//# sourceMappingURL=convolver-node-constructor.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createConvolverNodeRendererFactory = (createNativeConvolverNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeConvolverNodes = new WeakMap();\n        const createConvolverNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeConvolverNode = getNativeAudioNode(proxy);\n            // If the initially used nativeConvolverNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeConvolverNodeIsOwnedByContext = isOwnedByContext(nativeConvolverNode, nativeOfflineAudioContext);\n            if (!nativeConvolverNodeIsOwnedByContext) {\n                const options = {\n                    buffer: nativeConvolverNode.buffer,\n                    channelCount: nativeConvolverNode.channelCount,\n                    channelCountMode: nativeConvolverNode.channelCountMode,\n                    channelInterpretation: nativeConvolverNode.channelInterpretation,\n                    disableNormalization: !nativeConvolverNode.normalize\n                };\n                nativeConvolverNode = createNativeConvolverNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeConvolverNodes.set(nativeOfflineAudioContext, nativeConvolverNode);\n            if (isNativeAudioNodeFaker(nativeConvolverNode)) {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeConvolverNode.inputs[0]);\n            }\n            else {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeConvolverNode);\n            }\n            return nativeConvolverNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeConvolverNode = renderedNativeConvolverNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeConvolverNode !== undefined) {\n                    return Promise.resolve(renderedNativeConvolverNode);\n                }\n                return createConvolverNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=convolver-node-renderer-factory.js.map","export const createCreateNativeOfflineAudioContext = (createNotSupportedError, nativeOfflineAudioContextConstructor) => {\n    return (numberOfChannels, length, sampleRate) => {\n        if (nativeOfflineAudioContextConstructor === null) {\n            throw new Error('Missing the native OfflineAudioContext constructor.');\n        }\n        try {\n            return new nativeOfflineAudioContextConstructor(numberOfChannels, length, sampleRate);\n        }\n        catch (err) {\n            // Bug #143, #144 & #146: Safari throws a SyntaxError when numberOfChannels, length or sampleRate are invalid.\n            if (err.name === 'SyntaxError') {\n                throw createNotSupportedError();\n            }\n            throw err;\n        }\n    };\n};\n//# sourceMappingURL=create-native-offline-audio-context.js.map","export const createDataCloneError = () => new DOMException('', 'DataCloneError');\n//# sourceMappingURL=data-clone-error.js.map","export const detachArrayBuffer = (arrayBuffer) => {\n    const { port1, port2 } = new MessageChannel();\n    return new Promise((resolve) => {\n        const closeAndResolve = () => {\n            port2.onmessage = null;\n            port1.close();\n            port2.close();\n            resolve();\n        };\n        port2.onmessage = () => closeAndResolve();\n        try {\n            port1.postMessage(arrayBuffer, [arrayBuffer]);\n        }\n        finally {\n            closeAndResolve();\n        }\n    });\n};\n//# sourceMappingURL=detach-array-buffer.js.map","import { detachArrayBuffer } from '../helpers/detach-array-buffer';\nimport { wrapAudioBufferGetChannelDataMethod } from '../helpers/wrap-audio-buffer-get-channel-data-method';\nexport const createDecodeAudioData = (audioBufferStore, cacheTestResult, createDataCloneError, createEncodingError, detachedArrayBuffers, getNativeContext, isNativeContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, testPromiseSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds) => {\n    return (anyContext, audioData) => {\n        const nativeContext = isNativeContext(anyContext) ? anyContext : getNativeContext(anyContext);\n        // Bug #43: Only Chrome, Edge and Opera do throw a DataCloneError.\n        if (detachedArrayBuffers.has(audioData)) {\n            const err = createDataCloneError();\n            return Promise.reject(err);\n        }\n        // The audioData parameter maybe of a type which can't be added to a WeakSet.\n        try {\n            detachedArrayBuffers.add(audioData);\n        }\n        catch {\n            // Ignore errors.\n        }\n        // Bug #21: Safari does not support promises yet.\n        if (cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeContext))) {\n            return nativeContext.decodeAudioData(audioData).then((audioBuffer) => {\n                // Bug #133: Safari does neuter the ArrayBuffer.\n                detachArrayBuffer(audioData).catch(() => {\n                    // Ignore errors.\n                });\n                // Bug #157: Firefox does not allow the bufferOffset to be out-of-bounds.\n                if (!cacheTestResult(testAudioBufferCopyChannelMethodsOutOfBoundsSupport, () => testAudioBufferCopyChannelMethodsOutOfBoundsSupport(audioBuffer))) {\n                    wrapAudioBufferCopyChannelMethodsOutOfBounds(audioBuffer);\n                }\n                audioBufferStore.add(audioBuffer);\n                return audioBuffer;\n            });\n        }\n        // Bug #21: Safari does not return a Promise yet.\n        return new Promise((resolve, reject) => {\n            const complete = async () => {\n                // Bug #133: Safari does neuter the ArrayBuffer.\n                try {\n                    await detachArrayBuffer(audioData);\n                }\n                catch {\n                    // Ignore errors.\n                }\n            };\n            const fail = (err) => {\n                reject(err);\n                complete();\n            };\n            // Bug #26: Safari throws a synchronous error.\n            try {\n                // Bug #1: Safari requires a successCallback.\n                nativeContext.decodeAudioData(audioData, (audioBuffer) => {\n                    // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n                    // Bug #100: Safari does throw a wrong error when calling getChannelData() with an out-of-bounds value.\n                    if (typeof audioBuffer.copyFromChannel !== 'function') {\n                        wrapAudioBufferCopyChannelMethods(audioBuffer);\n                        wrapAudioBufferGetChannelDataMethod(audioBuffer);\n                    }\n                    audioBufferStore.add(audioBuffer);\n                    complete().then(() => resolve(audioBuffer));\n                }, (err) => {\n                    // Bug #4: Safari returns null instead of an error.\n                    if (err === null) {\n                        fail(createEncodingError());\n                    }\n                    else {\n                        fail(err);\n                    }\n                });\n            }\n            catch (err) {\n                fail(err);\n            }\n        });\n    };\n};\n//# sourceMappingURL=decode-audio-data.js.map","import { isAudioNodeOutputConnection } from '../guards/audio-node-output-connection';\nexport const createDecrementCycleCounter = (connectNativeAudioNodeToNativeAudioNode, cycleCounters, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, getNativeContext, isActiveAudioNode, isNativeOfflineAudioContext) => {\n    return (audioNode, count) => {\n        const cycleCounter = cycleCounters.get(audioNode);\n        if (cycleCounter === undefined) {\n            throw new Error('Missing the expected cycle count.');\n        }\n        const nativeContext = getNativeContext(audioNode.context);\n        const isOffline = isNativeOfflineAudioContext(nativeContext);\n        if (cycleCounter === count) {\n            cycleCounters.delete(audioNode);\n            if (!isOffline && isActiveAudioNode(audioNode)) {\n                const nativeSourceAudioNode = getNativeAudioNode(audioNode);\n                const { outputs } = getAudioNodeConnections(audioNode);\n                for (const output of outputs) {\n                    if (isAudioNodeOutputConnection(output)) {\n                        const nativeDestinationAudioNode = getNativeAudioNode(output[0]);\n                        connectNativeAudioNodeToNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output[1], output[2]);\n                    }\n                    else {\n                        const nativeDestinationAudioParam = getNativeAudioParam(output[0]);\n                        nativeSourceAudioNode.connect(nativeDestinationAudioParam, output[1]);\n                    }\n                }\n            }\n        }\n        else {\n            cycleCounters.set(audioNode, cycleCounter - count);\n        }\n    };\n};\n//# sourceMappingURL=decrement-cycle-counter.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    delayTime: 0,\n    maxDelayTime: 1\n};\nexport const createDelayNodeConstructor = (audioNodeConstructor, createAudioParam, createDelayNodeRenderer, createNativeDelayNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class DelayNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeDelayNode = createNativeDelayNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const delayNodeRenderer = (isOffline ? createDelayNodeRenderer(mergedOptions.maxDelayTime) : null);\n            super(context, false, nativeDelayNode, delayNodeRenderer);\n            this._delayTime = createAudioParam(this, isOffline, nativeDelayNode.delayTime);\n            setAudioNodeTailTime(this, mergedOptions.maxDelayTime);\n        }\n        get delayTime() {\n            return this._delayTime;\n        }\n    };\n};\n//# sourceMappingURL=delay-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createDelayNodeRendererFactory = (connectAudioParam, createNativeDelayNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return (maxDelayTime) => {\n        const renderedNativeDelayNodes = new WeakMap();\n        const createDelayNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeDelayNode = getNativeAudioNode(proxy);\n            // If the initially used nativeDelayNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeDelayNodeIsOwnedByContext = isOwnedByContext(nativeDelayNode, nativeOfflineAudioContext);\n            if (!nativeDelayNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeDelayNode.channelCount,\n                    channelCountMode: nativeDelayNode.channelCountMode,\n                    channelInterpretation: nativeDelayNode.channelInterpretation,\n                    delayTime: nativeDelayNode.delayTime.value,\n                    maxDelayTime\n                };\n                nativeDelayNode = createNativeDelayNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeDelayNodes.set(nativeOfflineAudioContext, nativeDelayNode);\n            if (!nativeDelayNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.delayTime, nativeDelayNode.delayTime);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.delayTime, nativeDelayNode.delayTime);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeDelayNode);\n            return nativeDelayNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeDelayNode = renderedNativeDelayNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeDelayNode !== undefined) {\n                    return Promise.resolve(renderedNativeDelayNode);\n                }\n                return createDelayNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=delay-node-renderer-factory.js.map","export const createDeleteActiveInputConnectionToAudioNode = (pickElementFromSet) => {\n    return (activeInputs, source, output, input) => {\n        return pickElementFromSet(activeInputs[input], (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output);\n    };\n};\n//# sourceMappingURL=delete-active-input-connection-to-audio-node.js.map","export const createDeleteUnrenderedAudioWorkletNode = (getUnrenderedAudioWorkletNodes) => {\n    return (nativeContext, audioWorkletNode) => {\n        getUnrenderedAudioWorkletNodes(nativeContext).delete(audioWorkletNode);\n    };\n};\n//# sourceMappingURL=delete-unrendered-audio-worklet-node.js.map","export const isDelayNode = (audioNode) => {\n    return 'delayTime' in audioNode;\n};\n//# sourceMappingURL=delay-node.js.map","import { isAudioNode } from '../guards/audio-node';\nimport { isDelayNode } from '../guards/delay-node';\nexport const createDetectCycles = (audioParamAudioNodeStore, getAudioNodeConnections, getValueForKey) => {\n    return function detectCycles(chain, nextLink) {\n        const audioNode = isAudioNode(nextLink) ? nextLink : getValueForKey(audioParamAudioNodeStore, nextLink);\n        if (isDelayNode(audioNode)) {\n            return [];\n        }\n        if (chain[0] === audioNode) {\n            return [chain];\n        }\n        if (chain.includes(audioNode)) {\n            return [];\n        }\n        const { outputs } = getAudioNodeConnections(audioNode);\n        return Array.from(outputs)\n            .map((outputConnection) => detectCycles([...chain, audioNode], outputConnection[0]))\n            .reduce((mergedCycles, nestedCycles) => mergedCycles.concat(nestedCycles), []);\n    };\n};\n//# sourceMappingURL=detect-cycles.js.map","import { isNativeAudioNode } from '../guards/native-audio-node';\nconst getOutputAudioNodeAtIndex = (createIndexSizeError, outputAudioNodes, output) => {\n    const outputAudioNode = outputAudioNodes[output];\n    if (outputAudioNode === undefined) {\n        throw createIndexSizeError();\n    }\n    return outputAudioNode;\n};\nexport const createDisconnectMultipleOutputs = (createIndexSizeError) => {\n    return (outputAudioNodes, destinationOrOutput = undefined, output = undefined, input = 0) => {\n        if (destinationOrOutput === undefined) {\n            return outputAudioNodes.forEach((outputAudioNode) => outputAudioNode.disconnect());\n        }\n        if (typeof destinationOrOutput === 'number') {\n            return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, destinationOrOutput).disconnect();\n        }\n        if (isNativeAudioNode(destinationOrOutput)) {\n            if (output === undefined) {\n                return outputAudioNodes.forEach((outputAudioNode) => outputAudioNode.disconnect(destinationOrOutput));\n            }\n            if (input === undefined) {\n                return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, output).disconnect(destinationOrOutput, 0);\n            }\n            return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, output).disconnect(destinationOrOutput, 0, input);\n        }\n        if (output === undefined) {\n            return outputAudioNodes.forEach((outputAudioNode) => outputAudioNode.disconnect(destinationOrOutput));\n        }\n        return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, output).disconnect(destinationOrOutput, 0);\n    };\n};\n//# sourceMappingURL=disconnect-multiple-outputs.js.map","const DEFAULT_OPTIONS = {\n    attack: 0.003,\n    channelCount: 2,\n    channelCountMode: 'clamped-max',\n    channelInterpretation: 'speakers',\n    knee: 30,\n    ratio: 12,\n    release: 0.25,\n    threshold: -24\n};\nexport const createDynamicsCompressorNodeConstructor = (audioNodeConstructor, createAudioParam, createDynamicsCompressorNodeRenderer, createNativeDynamicsCompressorNode, createNotSupportedError, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class DynamicsCompressorNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeDynamicsCompressorNode = createNativeDynamicsCompressorNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const dynamicsCompressorNodeRenderer = (isOffline ? createDynamicsCompressorNodeRenderer() : null);\n            super(context, false, nativeDynamicsCompressorNode, dynamicsCompressorNodeRenderer);\n            this._attack = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.attack);\n            this._knee = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.knee);\n            this._nativeDynamicsCompressorNode = nativeDynamicsCompressorNode;\n            this._ratio = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.ratio);\n            this._release = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.release);\n            this._threshold = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.threshold);\n            setAudioNodeTailTime(this, 0.006);\n        }\n        get attack() {\n            return this._attack;\n        }\n        // Bug #108: Safari allows a channelCount of three and above which is why the getter and setter needs to be overwritten here.\n        get channelCount() {\n            return this._nativeDynamicsCompressorNode.channelCount;\n        }\n        set channelCount(value) {\n            const previousChannelCount = this._nativeDynamicsCompressorNode.channelCount;\n            this._nativeDynamicsCompressorNode.channelCount = value;\n            if (value > 2) {\n                this._nativeDynamicsCompressorNode.channelCount = previousChannelCount;\n                throw createNotSupportedError();\n            }\n        }\n        /*\n         * Bug #109: Only Chrome, Firefox and Opera disallow a channelCountMode of 'max' yet which is why the getter and setter needs to be\n         * overwritten here.\n         */\n        get channelCountMode() {\n            return this._nativeDynamicsCompressorNode.channelCountMode;\n        }\n        set channelCountMode(value) {\n            const previousChannelCount = this._nativeDynamicsCompressorNode.channelCountMode;\n            this._nativeDynamicsCompressorNode.channelCountMode = value;\n            if (value === 'max') {\n                this._nativeDynamicsCompressorNode.channelCountMode = previousChannelCount;\n                throw createNotSupportedError();\n            }\n        }\n        get knee() {\n            return this._knee;\n        }\n        get ratio() {\n            return this._ratio;\n        }\n        get reduction() {\n            // Bug #111: Safari returns an AudioParam instead of a number.\n            if (typeof this._nativeDynamicsCompressorNode.reduction.value === 'number') {\n                return this._nativeDynamicsCompressorNode.reduction.value;\n            }\n            return this._nativeDynamicsCompressorNode.reduction;\n        }\n        get release() {\n            return this._release;\n        }\n        get threshold() {\n            return this._threshold;\n        }\n    };\n};\n//# sourceMappingURL=dynamics-compressor-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createDynamicsCompressorNodeRendererFactory = (connectAudioParam, createNativeDynamicsCompressorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeDynamicsCompressorNodes = new WeakMap();\n        const createDynamicsCompressorNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeDynamicsCompressorNode = getNativeAudioNode(proxy);\n            /*\n             * If the initially used nativeDynamicsCompressorNode was not constructed on the same OfflineAudioContext it needs to be\n             * created again.\n             */\n            const nativeDynamicsCompressorNodeIsOwnedByContext = isOwnedByContext(nativeDynamicsCompressorNode, nativeOfflineAudioContext);\n            if (!nativeDynamicsCompressorNodeIsOwnedByContext) {\n                const options = {\n                    attack: nativeDynamicsCompressorNode.attack.value,\n                    channelCount: nativeDynamicsCompressorNode.channelCount,\n                    channelCountMode: nativeDynamicsCompressorNode.channelCountMode,\n                    channelInterpretation: nativeDynamicsCompressorNode.channelInterpretation,\n                    knee: nativeDynamicsCompressorNode.knee.value,\n                    ratio: nativeDynamicsCompressorNode.ratio.value,\n                    release: nativeDynamicsCompressorNode.release.value,\n                    threshold: nativeDynamicsCompressorNode.threshold.value\n                };\n                nativeDynamicsCompressorNode = createNativeDynamicsCompressorNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeDynamicsCompressorNodes.set(nativeOfflineAudioContext, nativeDynamicsCompressorNode);\n            if (!nativeDynamicsCompressorNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.attack, nativeDynamicsCompressorNode.attack);\n                await renderAutomation(nativeOfflineAudioContext, proxy.knee, nativeDynamicsCompressorNode.knee);\n                await renderAutomation(nativeOfflineAudioContext, proxy.ratio, nativeDynamicsCompressorNode.ratio);\n                await renderAutomation(nativeOfflineAudioContext, proxy.release, nativeDynamicsCompressorNode.release);\n                await renderAutomation(nativeOfflineAudioContext, proxy.threshold, nativeDynamicsCompressorNode.threshold);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.attack, nativeDynamicsCompressorNode.attack);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.knee, nativeDynamicsCompressorNode.knee);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.ratio, nativeDynamicsCompressorNode.ratio);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.release, nativeDynamicsCompressorNode.release);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.threshold, nativeDynamicsCompressorNode.threshold);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeDynamicsCompressorNode);\n            return nativeDynamicsCompressorNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeDynamicsCompressorNode = renderedNativeDynamicsCompressorNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeDynamicsCompressorNode !== undefined) {\n                    return Promise.resolve(renderedNativeDynamicsCompressorNode);\n                }\n                return createDynamicsCompressorNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=dynamics-compressor-node-renderer-factory.js.map","export const createEncodingError = () => new DOMException('', 'EncodingError');\n//# sourceMappingURL=encoding-error.js.map","export const createEvaluateSource = (window) => {\n    return (source) => new Promise((resolve, reject) => {\n        if (window === null) {\n            // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n            reject(new SyntaxError());\n            return;\n        }\n        const head = window.document.head;\n        if (head === null) {\n            // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n            reject(new SyntaxError());\n        }\n        else {\n            const script = window.document.createElement('script');\n            // @todo Safari doesn't like URLs with a type of 'application/javascript; charset=utf-8'.\n            const blob = new Blob([source], { type: 'application/javascript' });\n            const url = URL.createObjectURL(blob);\n            const originalOnErrorHandler = window.onerror;\n            const removeErrorEventListenerAndRevokeUrl = () => {\n                window.onerror = originalOnErrorHandler;\n                URL.revokeObjectURL(url);\n            };\n            window.onerror = (message, src, lineno, colno, error) => {\n                // @todo Edge thinks the source is the one of the html document.\n                if (src === url || (src === window.location.href && lineno === 1 && colno === 1)) {\n                    removeErrorEventListenerAndRevokeUrl();\n                    reject(error);\n                    return false;\n                }\n                if (originalOnErrorHandler !== null) {\n                    return originalOnErrorHandler(message, src, lineno, colno, error);\n                }\n            };\n            script.onerror = () => {\n                removeErrorEventListenerAndRevokeUrl();\n                // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n                reject(new SyntaxError());\n            };\n            script.onload = () => {\n                removeErrorEventListenerAndRevokeUrl();\n                resolve();\n            };\n            script.src = url;\n            script.type = 'module';\n            head.appendChild(script);\n        }\n    });\n};\n//# sourceMappingURL=evaluate-source.js.map","export const createEventTargetConstructor = (wrapEventListener) => {\n    return class EventTarget {\n        constructor(_nativeEventTarget) {\n            this._nativeEventTarget = _nativeEventTarget;\n            this._listeners = new WeakMap();\n        }\n        addEventListener(type, listener, options) {\n            if (listener !== null) {\n                let wrappedEventListener = this._listeners.get(listener);\n                if (wrappedEventListener === undefined) {\n                    wrappedEventListener = wrapEventListener(this, listener);\n                    if (typeof listener === 'function') {\n                        this._listeners.set(listener, wrappedEventListener);\n                    }\n                }\n                this._nativeEventTarget.addEventListener(type, wrappedEventListener, options);\n            }\n        }\n        dispatchEvent(event) {\n            return this._nativeEventTarget.dispatchEvent(event);\n        }\n        removeEventListener(type, listener, options) {\n            const wrappedEventListener = listener === null ? undefined : this._listeners.get(listener);\n            this._nativeEventTarget.removeEventListener(type, wrappedEventListener === undefined ? null : wrappedEventListener, options);\n        }\n    };\n};\n//# sourceMappingURL=event-target-constructor.js.map","export const createExposeCurrentFrameAndCurrentTime = (window) => {\n    return (currentTime, sampleRate, fn) => {\n        Object.defineProperties(window, {\n            currentFrame: {\n                configurable: true,\n                get() {\n                    return Math.round(currentTime * sampleRate);\n                }\n            },\n            currentTime: {\n                configurable: true,\n                get() {\n                    return currentTime;\n                }\n            }\n        });\n        try {\n            return fn();\n        }\n        finally {\n            if (window !== null) {\n                delete window.currentFrame;\n                delete window.currentTime;\n            }\n        }\n    };\n};\n//# sourceMappingURL=expose-current-frame-and-current-time.js.map","export const createFetchSource = (createAbortError) => {\n    return async (url) => {\n        try {\n            const response = await fetch(url);\n            if (response.ok) {\n                return [await response.text(), response.url];\n            }\n        }\n        catch {\n            // Ignore errors.\n        } // tslint:disable-line:no-empty\n        throw createAbortError();\n    };\n};\n//# sourceMappingURL=fetch-source.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nconst DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    gain: 1\n};\nexport const createGainNodeConstructor = (audioNodeConstructor, createAudioParam, createGainNodeRenderer, createNativeGainNode, getNativeContext, isNativeOfflineAudioContext) => {\n    return class GainNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeGainNode = createNativeGainNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const gainNodeRenderer = (isOffline ? createGainNodeRenderer() : null);\n            super(context, false, nativeGainNode, gainNodeRenderer);\n            // Bug #74: Safari does not export the correct values for maxValue and minValue.\n            this._gain = createAudioParam(this, isOffline, nativeGainNode.gain, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n        }\n        get gain() {\n            return this._gain;\n        }\n    };\n};\n//# sourceMappingURL=gain-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createGainNodeRendererFactory = (connectAudioParam, createNativeGainNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeGainNodes = new WeakMap();\n        const createGainNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeGainNode = getNativeAudioNode(proxy);\n            // If the initially used nativeGainNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeGainNodeIsOwnedByContext = isOwnedByContext(nativeGainNode, nativeOfflineAudioContext);\n            if (!nativeGainNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeGainNode.channelCount,\n                    channelCountMode: nativeGainNode.channelCountMode,\n                    channelInterpretation: nativeGainNode.channelInterpretation,\n                    gain: nativeGainNode.gain.value\n                };\n                nativeGainNode = createNativeGainNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeGainNodes.set(nativeOfflineAudioContext, nativeGainNode);\n            if (!nativeGainNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.gain, nativeGainNode.gain);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.gain, nativeGainNode.gain);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeGainNode);\n            return nativeGainNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeGainNode = renderedNativeGainNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeGainNode !== undefined) {\n                    return Promise.resolve(renderedNativeGainNode);\n                }\n                return createGainNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=gain-node-renderer-factory.js.map","export const createGetActiveAudioWorkletNodeInputs = (activeAudioWorkletNodeInputsStore, getValueForKey) => {\n    return (nativeAudioWorkletNode) => getValueForKey(activeAudioWorkletNodeInputsStore, nativeAudioWorkletNode);\n};\n//# sourceMappingURL=get-active-audio-worklet-node-inputs.js.map","export const createGetAudioNodeRenderer = (getAudioNodeConnections) => {\n    return (audioNode) => {\n        const audioNodeConnections = getAudioNodeConnections(audioNode);\n        if (audioNodeConnections.renderer === null) {\n            throw new Error('Missing the renderer of the given AudioNode in the audio graph.');\n        }\n        return audioNodeConnections.renderer;\n    };\n};\n//# sourceMappingURL=get-audio-node-renderer.js.map","export const createGetAudioNodeTailTime = (audioNodeTailTimeStore) => {\n    return (audioNode) => { var _a; return (_a = audioNodeTailTimeStore.get(audioNode)) !== null && _a !== void 0 ? _a : 0; };\n};\n//# sourceMappingURL=get-audio-node-tail-time.js.map","export const createGetAudioParamRenderer = (getAudioParamConnections) => {\n    return (audioParam) => {\n        const audioParamConnections = getAudioParamConnections(audioParam);\n        if (audioParamConnections.renderer === null) {\n            throw new Error('Missing the renderer of the given AudioParam in the audio graph.');\n        }\n        return audioParamConnections.renderer;\n    };\n};\n//# sourceMappingURL=get-audio-param-renderer.js.map","export const createGetBackupOfflineAudioContext = (backupOfflineAudioContextStore) => {\n    return (nativeContext) => {\n        return backupOfflineAudioContextStore.get(nativeContext);\n    };\n};\n//# sourceMappingURL=get-backup-offline-audio-context.js.map","export const createInvalidStateError = () => new DOMException('', 'InvalidStateError');\n//# sourceMappingURL=invalid-state-error.js.map","import { createInvalidStateError } from './invalid-state-error';\nexport const createGetNativeContext = (contextStore) => {\n    return (context) => {\n        const nativeContext = contextStore.get(context);\n        if (nativeContext === undefined) {\n            throw createInvalidStateError();\n        }\n        return (nativeContext);\n    };\n};\n//# sourceMappingURL=get-native-context.js.map","export const createGetOrCreateBackupOfflineAudioContext = (backupOfflineAudioContextStore, nativeOfflineAudioContextConstructor) => {\n    return (nativeContext) => {\n        let backupOfflineAudioContext = backupOfflineAudioContextStore.get(nativeContext);\n        if (backupOfflineAudioContext !== undefined) {\n            return backupOfflineAudioContext;\n        }\n        if (nativeOfflineAudioContextConstructor === null) {\n            throw new Error('Missing the native OfflineAudioContext constructor.');\n        }\n        // Bug #141: Safari does not support creating an OfflineAudioContext with less than 44100 Hz.\n        backupOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n        backupOfflineAudioContextStore.set(nativeContext, backupOfflineAudioContext);\n        return backupOfflineAudioContext;\n    };\n};\n//# sourceMappingURL=get-or-create-backup-offline-audio-context.js.map","export const createGetUnrenderedAudioWorkletNodes = (unrenderedAudioWorkletNodeStore) => {\n    return (nativeContext) => {\n        const unrenderedAudioWorkletNodes = unrenderedAudioWorkletNodeStore.get(nativeContext);\n        if (unrenderedAudioWorkletNodes === undefined) {\n            throw new Error('The context has no set of AudioWorkletNodes.');\n        }\n        return unrenderedAudioWorkletNodes;\n    };\n};\n//# sourceMappingURL=get-unrendered-audio-worklet-nodes.js.map","export const createInvalidAccessError = () => new DOMException('', 'InvalidAccessError');\n//# sourceMappingURL=invalid-access-error.js.map","import { createInvalidAccessError } from '../factories/invalid-access-error';\nexport const wrapIIRFilterNodeGetFrequencyResponseMethod = (nativeIIRFilterNode) => {\n    nativeIIRFilterNode.getFrequencyResponse = ((getFrequencyResponse) => {\n        return (frequencyHz, magResponse, phaseResponse) => {\n            if (frequencyHz.length !== magResponse.length || magResponse.length !== phaseResponse.length) {\n                throw createInvalidAccessError();\n            }\n            return getFrequencyResponse.call(nativeIIRFilterNode, frequencyHz, magResponse, phaseResponse);\n        };\n    })(nativeIIRFilterNode.getFrequencyResponse);\n};\n//# sourceMappingURL=wrap-iir-filter-node-get-frequency-response-method.js.map","import { wrapIIRFilterNodeGetFrequencyResponseMethod } from '../helpers/wrap-iir-filter-node-get-frequency-response-method';\nconst DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers'\n};\nexport const createIIRFilterNodeConstructor = (audioNodeConstructor, createNativeIIRFilterNode, createIIRFilterNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class IIRFilterNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeIIRFilterNode = createNativeIIRFilterNode(nativeContext, isOffline ? null : context.baseLatency, mergedOptions);\n            const iirFilterNodeRenderer = ((isOffline ? createIIRFilterNodeRenderer(mergedOptions.feedback, mergedOptions.feedforward) : null));\n            super(context, false, nativeIIRFilterNode, iirFilterNodeRenderer);\n            // Bug #23 & #24: FirefoxDeveloper does not throw an InvalidAccessError.\n            // @todo Write a test which allows other browsers to remain unpatched.\n            wrapIIRFilterNodeGetFrequencyResponseMethod(nativeIIRFilterNode);\n            this._nativeIIRFilterNode = nativeIIRFilterNode;\n            // @todo Determine a meaningful tail-time instead of just using one second.\n            setAudioNodeTailTime(this, 1);\n        }\n        getFrequencyResponse(frequencyHz, magResponse, phaseResponse) {\n            return this._nativeIIRFilterNode.getFrequencyResponse(frequencyHz, magResponse, phaseResponse);\n        }\n    };\n};\n//# sourceMappingURL=iir-filter-node-constructor.js.map","// This implementation as shamelessly inspired by source code of\n// tslint:disable-next-line:max-line-length\n// {@link https://chromium.googlesource.com/chromium/src.git/+/master/third_party/WebKit/Source/platform/audio/IIRFilter.cpp|Chromium's IIRFilter}.\nexport const filterBuffer = (feedback, feedbackLength, feedforward, feedforwardLength, minLength, xBuffer, yBuffer, bufferIndex, bufferLength, input, output) => {\n    const inputLength = input.length;\n    let i = bufferIndex;\n    for (let j = 0; j < inputLength; j += 1) {\n        let y = feedforward[0] * input[j];\n        for (let k = 1; k < minLength; k += 1) {\n            const x = (i - k) & (bufferLength - 1); // tslint:disable-line:no-bitwise\n            y += feedforward[k] * xBuffer[x];\n            y -= feedback[k] * yBuffer[x];\n        }\n        for (let k = minLength; k < feedforwardLength; k += 1) {\n            y += feedforward[k] * xBuffer[(i - k) & (bufferLength - 1)]; // tslint:disable-line:no-bitwise\n        }\n        for (let k = minLength; k < feedbackLength; k += 1) {\n            y -= feedback[k] * yBuffer[(i - k) & (bufferLength - 1)]; // tslint:disable-line:no-bitwise\n        }\n        xBuffer[i] = input[j];\n        yBuffer[i] = y;\n        i = (i + 1) & (bufferLength - 1); // tslint:disable-line:no-bitwise\n        output[j] = y;\n    }\n    return i;\n};\n//# sourceMappingURL=filter-buffer.js.map","import { filterBuffer } from '../helpers/filter-buffer';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nconst filterFullBuffer = (renderedBuffer, nativeOfflineAudioContext, feedback, feedforward) => {\n    const convertedFeedback = feedback instanceof Float64Array ? feedback : new Float64Array(feedback);\n    const convertedFeedforward = feedforward instanceof Float64Array ? feedforward : new Float64Array(feedforward);\n    const feedbackLength = convertedFeedback.length;\n    const feedforwardLength = convertedFeedforward.length;\n    const minLength = Math.min(feedbackLength, feedforwardLength);\n    if (convertedFeedback[0] !== 1) {\n        for (let i = 0; i < feedbackLength; i += 1) {\n            convertedFeedforward[i] /= convertedFeedback[0];\n        }\n        for (let i = 1; i < feedforwardLength; i += 1) {\n            convertedFeedback[i] /= convertedFeedback[0];\n        }\n    }\n    const bufferLength = 32;\n    const xBuffer = new Float32Array(bufferLength);\n    const yBuffer = new Float32Array(bufferLength);\n    const filteredBuffer = nativeOfflineAudioContext.createBuffer(renderedBuffer.numberOfChannels, renderedBuffer.length, renderedBuffer.sampleRate);\n    const numberOfChannels = renderedBuffer.numberOfChannels;\n    for (let i = 0; i < numberOfChannels; i += 1) {\n        const input = renderedBuffer.getChannelData(i);\n        const output = filteredBuffer.getChannelData(i);\n        xBuffer.fill(0);\n        yBuffer.fill(0);\n        filterBuffer(convertedFeedback, feedbackLength, convertedFeedforward, feedforwardLength, minLength, xBuffer, yBuffer, 0, bufferLength, input, output);\n    }\n    return filteredBuffer;\n};\nexport const createIIRFilterNodeRendererFactory = (createNativeAudioBufferSourceNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderInputsOfAudioNode, renderNativeOfflineAudioContext) => {\n    return (feedback, feedforward) => {\n        const renderedNativeAudioNodes = new WeakMap();\n        let filteredBufferPromise = null;\n        const createAudioNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeAudioBufferSourceNode = null;\n            let nativeIIRFilterNode = getNativeAudioNode(proxy);\n            // If the initially used nativeIIRFilterNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeIIRFilterNodeIsOwnedByContext = isOwnedByContext(nativeIIRFilterNode, nativeOfflineAudioContext);\n            // Bug #9: Safari does not support IIRFilterNodes.\n            if (nativeOfflineAudioContext.createIIRFilter === undefined) {\n                nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeOfflineAudioContext, {\n                    buffer: null,\n                    channelCount: 2,\n                    channelCountMode: 'max',\n                    channelInterpretation: 'speakers',\n                    loop: false,\n                    loopEnd: 0,\n                    loopStart: 0,\n                    playbackRate: 1\n                });\n            }\n            else if (!nativeIIRFilterNodeIsOwnedByContext) {\n                // @todo TypeScript defines the parameters of createIIRFilter() as arrays of numbers.\n                nativeIIRFilterNode = nativeOfflineAudioContext.createIIRFilter(feedforward, feedback);\n            }\n            renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeAudioBufferSourceNode === null ? nativeIIRFilterNode : nativeAudioBufferSourceNode);\n            if (nativeAudioBufferSourceNode !== null) {\n                if (filteredBufferPromise === null) {\n                    if (nativeOfflineAudioContextConstructor === null) {\n                        throw new Error('Missing the native OfflineAudioContext constructor.');\n                    }\n                    const partialOfflineAudioContext = new nativeOfflineAudioContextConstructor(\n                    // Bug #47: The AudioDestinationNode in Safari gets not initialized correctly.\n                    proxy.context.destination.channelCount, \n                    // Bug #17: Safari does not yet expose the length.\n                    proxy.context.length, nativeOfflineAudioContext.sampleRate);\n                    filteredBufferPromise = (async () => {\n                        await renderInputsOfAudioNode(proxy, partialOfflineAudioContext, partialOfflineAudioContext.destination);\n                        const renderedBuffer = await renderNativeOfflineAudioContext(partialOfflineAudioContext);\n                        return filterFullBuffer(renderedBuffer, nativeOfflineAudioContext, feedback, feedforward);\n                    })();\n                }\n                const filteredBuffer = await filteredBufferPromise;\n                nativeAudioBufferSourceNode.buffer = filteredBuffer;\n                nativeAudioBufferSourceNode.start(0);\n                return nativeAudioBufferSourceNode;\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeIIRFilterNode);\n            return nativeIIRFilterNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeAudioNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeAudioNode !== undefined) {\n                    return Promise.resolve(renderedNativeAudioNode);\n                }\n                return createAudioNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=iir-filter-node-renderer-factory.js.map","import { isAudioNodeOutputConnection } from '../guards/audio-node-output-connection';\nexport const createIncrementCycleCounterFactory = (cycleCounters, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, isActiveAudioNode) => {\n    return (isOffline) => {\n        return (audioNode, count) => {\n            const cycleCounter = cycleCounters.get(audioNode);\n            if (cycleCounter === undefined) {\n                if (!isOffline && isActiveAudioNode(audioNode)) {\n                    const nativeSourceAudioNode = getNativeAudioNode(audioNode);\n                    const { outputs } = getAudioNodeConnections(audioNode);\n                    for (const output of outputs) {\n                        if (isAudioNodeOutputConnection(output)) {\n                            const nativeDestinationAudioNode = getNativeAudioNode(output[0]);\n                            disconnectNativeAudioNodeFromNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output[1], output[2]);\n                        }\n                        else {\n                            const nativeDestinationAudioParam = getNativeAudioParam(output[0]);\n                            nativeSourceAudioNode.disconnect(nativeDestinationAudioParam, output[1]);\n                        }\n                    }\n                }\n                cycleCounters.set(audioNode, count);\n            }\n            else {\n                cycleCounters.set(audioNode, cycleCounter + count);\n            }\n        };\n    };\n};\n//# sourceMappingURL=increment-cycle-counter-factory.js.map","export const createIsAnyAudioContext = (contextStore, isNativeAudioContext) => {\n    return (anything) => {\n        const nativeContext = contextStore.get(anything);\n        return isNativeAudioContext(nativeContext) || isNativeAudioContext(anything);\n    };\n};\n//# sourceMappingURL=is-any-audio-context.js.map","export const createIsAnyAudioNode = (audioNodeStore, isNativeAudioNode) => {\n    return (anything) => audioNodeStore.has(anything) || isNativeAudioNode(anything);\n};\n//# sourceMappingURL=is-any-audio-node.js.map","export const createIsAnyAudioParam = (audioParamStore, isNativeAudioParam) => {\n    return (anything) => audioParamStore.has(anything) || isNativeAudioParam(anything);\n};\n//# sourceMappingURL=is-any-audio-param.js.map","export const createIsAnyOfflineAudioContext = (contextStore, isNativeOfflineAudioContext) => {\n    return (anything) => {\n        const nativeContext = contextStore.get(anything);\n        return isNativeOfflineAudioContext(nativeContext) || isNativeOfflineAudioContext(anything);\n    };\n};\n//# sourceMappingURL=is-any-offline-audio-context.js.map","export const createIsNativeAudioContext = (nativeAudioContextConstructor) => {\n    return (anything) => {\n        return nativeAudioContextConstructor !== null && anything instanceof nativeAudioContextConstructor;\n    };\n};\n//# sourceMappingURL=is-native-audio-context.js.map","export const createIsNativeAudioNode = (window) => {\n    return (anything) => {\n        return window !== null && typeof window.AudioNode === 'function' && anything instanceof window.AudioNode;\n    };\n};\n//# sourceMappingURL=is-native-audio-node.js.map","export const createIsNativeAudioParam = (window) => {\n    return (anything) => {\n        return window !== null && typeof window.AudioParam === 'function' && anything instanceof window.AudioParam;\n    };\n};\n//# sourceMappingURL=is-native-audio-param.js.map","export const createIsNativeContext = (isNativeAudioContext, isNativeOfflineAudioContext) => {\n    return (anything) => {\n        return isNativeAudioContext(anything) || isNativeOfflineAudioContext(anything);\n    };\n};\n//# sourceMappingURL=is-native-context.js.map","export const createIsNativeOfflineAudioContext = (nativeOfflineAudioContextConstructor) => {\n    return (anything) => {\n        return nativeOfflineAudioContextConstructor !== null && anything instanceof nativeOfflineAudioContextConstructor;\n    };\n};\n//# sourceMappingURL=is-native-offline-audio-context.js.map","export const createIsSecureContext = (window) => window !== null && window.isSecureContext;\n//# sourceMappingURL=is-secure-context.js.map","export const createMediaElementAudioSourceNodeConstructor = (audioNodeConstructor, createNativeMediaElementAudioSourceNode, getNativeContext, isNativeOfflineAudioContext) => {\n    return class MediaElementAudioSourceNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const nativeMediaElementAudioSourceNode = createNativeMediaElementAudioSourceNode(nativeContext, options);\n            // Bug #171: Safari allows to create a MediaElementAudioSourceNode with an OfflineAudioContext.\n            if (isNativeOfflineAudioContext(nativeContext)) {\n                throw TypeError();\n            }\n            super(context, true, nativeMediaElementAudioSourceNode, null);\n            this._nativeMediaElementAudioSourceNode = nativeMediaElementAudioSourceNode;\n        }\n        get mediaElement() {\n            return this._nativeMediaElementAudioSourceNode.mediaElement;\n        }\n    };\n};\n//# sourceMappingURL=media-element-audio-source-node-constructor.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'explicit',\n    channelInterpretation: 'speakers'\n};\nexport const createMediaStreamAudioDestinationNodeConstructor = (audioNodeConstructor, createNativeMediaStreamAudioDestinationNode, getNativeContext, isNativeOfflineAudioContext) => {\n    return class MediaStreamAudioDestinationNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            // Bug #173: Safari allows to create a MediaStreamAudioDestinationNode with an OfflineAudioContext.\n            if (isNativeOfflineAudioContext(nativeContext)) {\n                throw new TypeError();\n            }\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeMediaStreamAudioDestinationNode = createNativeMediaStreamAudioDestinationNode(nativeContext, mergedOptions);\n            super(context, false, nativeMediaStreamAudioDestinationNode, null);\n            this._nativeMediaStreamAudioDestinationNode = nativeMediaStreamAudioDestinationNode;\n        }\n        get stream() {\n            return this._nativeMediaStreamAudioDestinationNode.stream;\n        }\n    };\n};\n//# sourceMappingURL=media-stream-audio-destination-node-constructor.js.map","export const createMediaStreamAudioSourceNodeConstructor = (audioNodeConstructor, createNativeMediaStreamAudioSourceNode, getNativeContext, isNativeOfflineAudioContext) => {\n    return class MediaStreamAudioSourceNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const nativeMediaStreamAudioSourceNode = createNativeMediaStreamAudioSourceNode(nativeContext, options);\n            // Bug #172: Safari allows to create a MediaStreamAudioSourceNode with an OfflineAudioContext.\n            if (isNativeOfflineAudioContext(nativeContext)) {\n                throw new TypeError();\n            }\n            super(context, true, nativeMediaStreamAudioSourceNode, null);\n            this._nativeMediaStreamAudioSourceNode = nativeMediaStreamAudioSourceNode;\n        }\n        get mediaStream() {\n            return this._nativeMediaStreamAudioSourceNode.mediaStream;\n        }\n    };\n};\n//# sourceMappingURL=media-stream-audio-source-node-constructor.js.map","export const createMediaStreamTrackAudioSourceNodeConstructor = (audioNodeConstructor, createNativeMediaStreamTrackAudioSourceNode, getNativeContext) => {\n    return class MediaStreamTrackAudioSourceNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const nativeMediaStreamTrackAudioSourceNode = createNativeMediaStreamTrackAudioSourceNode(nativeContext, options);\n            super(context, true, nativeMediaStreamTrackAudioSourceNode, null);\n        }\n    };\n};\n//# sourceMappingURL=media-stream-track-audio-source-node-constructor.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { isValidLatencyHint } from '../helpers/is-valid-latency-hint';\nexport const createMinimalAudioContextConstructor = (createInvalidStateError, createNotSupportedError, createUnknownError, minimalBaseAudioContextConstructor, nativeAudioContextConstructor) => {\n    return class MinimalAudioContext extends minimalBaseAudioContextConstructor {\n        constructor(options = {}) {\n            if (nativeAudioContextConstructor === null) {\n                throw new Error('Missing the native AudioContext constructor.');\n            }\n            let nativeAudioContext;\n            try {\n                nativeAudioContext = new nativeAudioContextConstructor(options);\n            }\n            catch (err) {\n                // Bug #192 Safari does throw a SyntaxError if the sampleRate is not supported.\n                if (err.code === 12 && err.message === 'sampleRate is not in range') {\n                    throw createNotSupportedError();\n                }\n                throw err;\n            }\n            // Bug #131 Safari returns null when there are four other AudioContexts running already.\n            if (nativeAudioContext === null) {\n                throw createUnknownError();\n            }\n            // Bug #51 Only Chrome Edge, and Opera throw an error if the given latencyHint is invalid.\n            if (!isValidLatencyHint(options.latencyHint)) {\n                throw new TypeError(`The provided value '${options.latencyHint}' is not a valid enum value of type AudioContextLatencyCategory.`);\n            }\n            // Bug #150 Safari does not support setting the sampleRate.\n            if (options.sampleRate !== undefined && nativeAudioContext.sampleRate !== options.sampleRate) {\n                throw createNotSupportedError();\n            }\n            super(nativeAudioContext, 2);\n            const { latencyHint } = options;\n            const { sampleRate } = nativeAudioContext;\n            // @todo The values for 'balanced', 'interactive' and 'playback' are just copied from Chrome's implementation.\n            this._baseLatency =\n                typeof nativeAudioContext.baseLatency === 'number'\n                    ? nativeAudioContext.baseLatency\n                    : latencyHint === 'balanced'\n                        ? 512 / sampleRate\n                        : latencyHint === 'interactive' || latencyHint === undefined\n                            ? 256 / sampleRate\n                            : latencyHint === 'playback'\n                                ? 1024 / sampleRate\n                                : /*\n                                   * @todo The min (256) and max (16384) values are taken from the allowed bufferSize values of a\n                                   * ScriptProcessorNode.\n                                   */\n                                    (Math.max(2, Math.min(128, Math.round((latencyHint * sampleRate) / 128))) * 128) / sampleRate;\n            this._nativeAudioContext = nativeAudioContext;\n            // Bug #188: Safari will set the context's state to 'interrupted' in case the user switches tabs.\n            if (nativeAudioContextConstructor.name === 'webkitAudioContext') {\n                this._nativeGainNode = nativeAudioContext.createGain();\n                this._nativeOscillatorNode = nativeAudioContext.createOscillator();\n                this._nativeGainNode.gain.value = 1e-37;\n                this._nativeOscillatorNode.connect(this._nativeGainNode).connect(nativeAudioContext.destination);\n                this._nativeOscillatorNode.start();\n            }\n            else {\n                this._nativeGainNode = null;\n                this._nativeOscillatorNode = null;\n            }\n            this._state = null;\n            /*\n             * Bug #34: Chrome, Edge and Opera pretend to be running right away, but fire an onstatechange event when the state actually\n             * changes to 'running'.\n             */\n            if (nativeAudioContext.state === 'running') {\n                this._state = 'suspended';\n                const revokeState = () => {\n                    if (this._state === 'suspended') {\n                        this._state = null;\n                    }\n                    nativeAudioContext.removeEventListener('statechange', revokeState);\n                };\n                nativeAudioContext.addEventListener('statechange', revokeState);\n            }\n        }\n        get baseLatency() {\n            return this._baseLatency;\n        }\n        get state() {\n            return this._state !== null ? this._state : this._nativeAudioContext.state;\n        }\n        close() {\n            // Bug #35: Firefox does not throw an error if the AudioContext was closed before.\n            if (this.state === 'closed') {\n                return this._nativeAudioContext.close().then(() => {\n                    throw createInvalidStateError();\n                });\n            }\n            // Bug #34: If the state was set to suspended before it should be revoked now.\n            if (this._state === 'suspended') {\n                this._state = null;\n            }\n            return this._nativeAudioContext.close().then(() => {\n                if (this._nativeGainNode !== null && this._nativeOscillatorNode !== null) {\n                    this._nativeOscillatorNode.stop();\n                    this._nativeGainNode.disconnect();\n                    this._nativeOscillatorNode.disconnect();\n                }\n                deactivateAudioGraph(this);\n            });\n        }\n        resume() {\n            if (this._state === 'suspended') {\n                return new Promise((resolve, reject) => {\n                    const resolvePromise = () => {\n                        this._nativeAudioContext.removeEventListener('statechange', resolvePromise);\n                        if (this._nativeAudioContext.state === 'running') {\n                            resolve();\n                        }\n                        else {\n                            this.resume().then(resolve, reject);\n                        }\n                    };\n                    this._nativeAudioContext.addEventListener('statechange', resolvePromise);\n                });\n            }\n            return this._nativeAudioContext.resume().catch((err) => {\n                // Bug #55: Chrome, Edge and Opera do throw an InvalidAccessError instead of an InvalidStateError.\n                // Bug #56: Safari invokes the catch handler but without an error.\n                if (err === undefined || err.code === 15) {\n                    throw createInvalidStateError();\n                }\n                throw err;\n            });\n        }\n        suspend() {\n            return this._nativeAudioContext.suspend().catch((err) => {\n                // Bug #56: Safari invokes the catch handler but without an error.\n                if (err === undefined) {\n                    throw createInvalidStateError();\n                }\n                throw err;\n            });\n        }\n    };\n};\n//# sourceMappingURL=minimal-audio-context-constructor.js.map","import { CONTEXT_STORE } from '../globals';\nexport const createMinimalBaseAudioContextConstructor = (audioDestinationNodeConstructor, createAudioListener, eventTargetConstructor, isNativeOfflineAudioContext, unrenderedAudioWorkletNodeStore, wrapEventListener) => {\n    return class MinimalBaseAudioContext extends eventTargetConstructor {\n        constructor(_nativeContext, numberOfChannels) {\n            super(_nativeContext);\n            this._nativeContext = _nativeContext;\n            CONTEXT_STORE.set(this, _nativeContext);\n            if (isNativeOfflineAudioContext(_nativeContext)) {\n                unrenderedAudioWorkletNodeStore.set(_nativeContext, new Set());\n            }\n            this._destination = new audioDestinationNodeConstructor(this, numberOfChannels);\n            this._listener = createAudioListener(this, _nativeContext);\n            this._onstatechange = null;\n        }\n        get currentTime() {\n            return this._nativeContext.currentTime;\n        }\n        get destination() {\n            return this._destination;\n        }\n        get listener() {\n            return this._listener;\n        }\n        get onstatechange() {\n            return this._onstatechange;\n        }\n        set onstatechange(value) {\n            const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n            this._nativeContext.onstatechange = wrappedListener;\n            const nativeOnStateChange = this._nativeContext.onstatechange;\n            this._onstatechange = nativeOnStateChange !== null && nativeOnStateChange === wrappedListener ? value : nativeOnStateChange;\n        }\n        get sampleRate() {\n            return this._nativeContext.sampleRate;\n        }\n        get state() {\n            return this._nativeContext.state;\n        }\n    };\n};\n//# sourceMappingURL=minimal-base-audio-context-constructor.js.map","export const testPromiseSupport = (nativeContext) => {\n    // This 12 numbers represent the 48 bytes of an empty WAVE file with a single sample.\n    const uint32Array = new Uint32Array([1179011410, 40, 1163280727, 544501094, 16, 131073, 44100, 176400, 1048580, 1635017060, 4, 0]);\n    try {\n        // Bug #1: Safari requires a successCallback.\n        const promise = nativeContext.decodeAudioData(uint32Array.buffer, () => {\n            // Ignore the success callback.\n        });\n        if (promise === undefined) {\n            return false;\n        }\n        promise.catch(() => {\n            // Ignore rejected errors.\n        });\n        return true;\n    }\n    catch {\n        // Ignore errors.\n    }\n    return false;\n};\n//# sourceMappingURL=test-promise-support.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { testPromiseSupport } from '../helpers/test-promise-support';\nconst DEFAULT_OPTIONS = {\n    numberOfChannels: 1\n};\nexport const createMinimalOfflineAudioContextConstructor = (cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, minimalBaseAudioContextConstructor, startRendering) => {\n    return class MinimalOfflineAudioContext extends minimalBaseAudioContextConstructor {\n        constructor(options) {\n            const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options };\n            const nativeOfflineAudioContext = createNativeOfflineAudioContext(numberOfChannels, length, sampleRate);\n            // #21 Safari does not support promises and therefore would fire the statechange event before the promise can be resolved.\n            if (!cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeOfflineAudioContext))) {\n                nativeOfflineAudioContext.addEventListener('statechange', (() => {\n                    let i = 0;\n                    const delayStateChangeEvent = (event) => {\n                        if (this._state === 'running') {\n                            if (i > 0) {\n                                nativeOfflineAudioContext.removeEventListener('statechange', delayStateChangeEvent);\n                                event.stopImmediatePropagation();\n                                this._waitForThePromiseToSettle(event);\n                            }\n                            else {\n                                i += 1;\n                            }\n                        }\n                    };\n                    return delayStateChangeEvent;\n                })());\n            }\n            super(nativeOfflineAudioContext, numberOfChannels);\n            this._length = length;\n            this._nativeOfflineAudioContext = nativeOfflineAudioContext;\n            this._state = null;\n        }\n        get length() {\n            // Bug #17: Safari does not yet expose the length.\n            if (this._nativeOfflineAudioContext.length === undefined) {\n                return this._length;\n            }\n            return this._nativeOfflineAudioContext.length;\n        }\n        get state() {\n            return this._state === null ? this._nativeOfflineAudioContext.state : this._state;\n        }\n        startRendering() {\n            /*\n             * Bug #9 & #59: It is theoretically possible that startRendering() will first render a partialOfflineAudioContext. Therefore\n             * the state of the nativeOfflineAudioContext might no transition to running immediately.\n             */\n            if (this._state === 'running') {\n                return Promise.reject(createInvalidStateError());\n            }\n            this._state = 'running';\n            return startRendering(this.destination, this._nativeOfflineAudioContext).finally(() => {\n                this._state = null;\n                deactivateAudioGraph(this);\n            });\n        }\n        _waitForThePromiseToSettle(event) {\n            if (this._state === null) {\n                this._nativeOfflineAudioContext.dispatchEvent(event);\n            }\n            else {\n                setTimeout(() => this._waitForThePromiseToSettle(event));\n            }\n        }\n    };\n};\n//# sourceMappingURL=minimal-offline-audio-context-constructor.js.map","export const createMonitorConnections = (insertElementInSet, isNativeAudioNode) => {\n    return (nativeAudioNode, whenConnected, whenDisconnected) => {\n        const connections = new Set();\n        nativeAudioNode.connect = ((connect) => {\n            // tslint:disable-next-line:invalid-void no-inferrable-types\n            return (destination, output = 0, input = 0) => {\n                const wasDisconnected = connections.size === 0;\n                if (isNativeAudioNode(destination)) {\n                    // @todo TypeScript cannot infer the overloaded signature with 3 arguments yet.\n                    connect.call(nativeAudioNode, destination, output, input);\n                    insertElementInSet(connections, [destination, output, input], (connection) => connection[0] === destination && connection[1] === output && connection[2] === input, true);\n                    if (wasDisconnected) {\n                        whenConnected();\n                    }\n                    return destination;\n                }\n                connect.call(nativeAudioNode, destination, output);\n                insertElementInSet(connections, [destination, output], (connection) => connection[0] === destination && connection[1] === output, true);\n                if (wasDisconnected) {\n                    whenConnected();\n                }\n                return;\n            };\n        })(nativeAudioNode.connect);\n        nativeAudioNode.disconnect = ((disconnect) => {\n            return (destinationOrOutput, output, input) => {\n                const wasConnected = connections.size > 0;\n                if (destinationOrOutput === undefined) {\n                    disconnect.apply(nativeAudioNode);\n                    connections.clear();\n                }\n                else if (typeof destinationOrOutput === 'number') {\n                    // @todo TypeScript cannot infer the overloaded signature with 1 argument yet.\n                    disconnect.call(nativeAudioNode, destinationOrOutput);\n                    for (const connection of connections) {\n                        if (connection[1] === destinationOrOutput) {\n                            connections.delete(connection);\n                        }\n                    }\n                }\n                else {\n                    if (isNativeAudioNode(destinationOrOutput)) {\n                        // @todo TypeScript cannot infer the overloaded signature with 3 arguments yet.\n                        disconnect.call(nativeAudioNode, destinationOrOutput, output, input);\n                    }\n                    else {\n                        // @todo TypeScript cannot infer the overloaded signature with 2 arguments yet.\n                        disconnect.call(nativeAudioNode, destinationOrOutput, output);\n                    }\n                    for (const connection of connections) {\n                        if (connection[0] === destinationOrOutput &&\n                            (output === undefined || connection[1] === output) &&\n                            (input === undefined || connection[2] === input)) {\n                            connections.delete(connection);\n                        }\n                    }\n                }\n                const isDisconnected = connections.size === 0;\n                if (wasConnected && isDisconnected) {\n                    whenDisconnected();\n                }\n            };\n        })(nativeAudioNode.disconnect);\n        return nativeAudioNode;\n    };\n};\n//# sourceMappingURL=monitor-connections.js.map","export const assignNativeAudioNodeOption = (nativeAudioNode, options, option) => {\n    const value = options[option];\n    if (value !== undefined && value !== nativeAudioNode[option]) {\n        nativeAudioNode[option] = value;\n    }\n};\n//# sourceMappingURL=assign-native-audio-node-option.js.map","import { assignNativeAudioNodeOption } from './assign-native-audio-node-option';\nexport const assignNativeAudioNodeOptions = (nativeAudioNode, options) => {\n    assignNativeAudioNodeOption(nativeAudioNode, options, 'channelCount');\n    assignNativeAudioNodeOption(nativeAudioNode, options, 'channelCountMode');\n    assignNativeAudioNodeOption(nativeAudioNode, options, 'channelInterpretation');\n};\n//# sourceMappingURL=assign-native-audio-node-options.js.map","export const testAnalyserNodeGetFloatTimeDomainDataMethodSupport = (nativeAnalyserNode) => {\n    return typeof nativeAnalyserNode.getFloatTimeDomainData === 'function';\n};\n//# sourceMappingURL=test-analyser-node-get-float-time-domain-data-method-support.js.map","export const wrapAnalyserNodeGetFloatTimeDomainDataMethod = (nativeAnalyserNode) => {\n    nativeAnalyserNode.getFloatTimeDomainData = (array) => {\n        const byteTimeDomainData = new Uint8Array(array.length);\n        nativeAnalyserNode.getByteTimeDomainData(byteTimeDomainData);\n        const length = Math.max(byteTimeDomainData.length, nativeAnalyserNode.fftSize);\n        for (let i = 0; i < length; i += 1) {\n            array[i] = (byteTimeDomainData[i] - 128) * 0.0078125;\n        }\n        return array;\n    };\n};\n//# sourceMappingURL=wrap-analyser-node-get-float-time-domain-data-method.js.map","import { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { testAnalyserNodeGetFloatTimeDomainDataMethodSupport } from '../helpers/test-analyser-node-get-float-time-domain-data-method-support';\nimport { wrapAnalyserNodeGetFloatTimeDomainDataMethod } from '../helpers/wrap-analyser-node-get-float-time-domain-data-method';\nexport const createNativeAnalyserNodeFactory = (cacheTestResult, createIndexSizeError) => {\n    return (nativeContext, options) => {\n        const nativeAnalyserNode = nativeContext.createAnalyser();\n        // Bug #37: Firefox does not create an AnalyserNode with the default properties.\n        assignNativeAudioNodeOptions(nativeAnalyserNode, options);\n        // Bug #118: Safari does not throw an error if maxDecibels is not more than minDecibels.\n        if (!(options.maxDecibels > options.minDecibels)) {\n            throw createIndexSizeError();\n        }\n        assignNativeAudioNodeOption(nativeAnalyserNode, options, 'fftSize');\n        assignNativeAudioNodeOption(nativeAnalyserNode, options, 'maxDecibels');\n        assignNativeAudioNodeOption(nativeAnalyserNode, options, 'minDecibels');\n        assignNativeAudioNodeOption(nativeAnalyserNode, options, 'smoothingTimeConstant');\n        // Bug #36: Safari does not support getFloatTimeDomainData() yet.\n        if (!cacheTestResult(testAnalyserNodeGetFloatTimeDomainDataMethodSupport, () => testAnalyserNodeGetFloatTimeDomainDataMethodSupport(nativeAnalyserNode))) {\n            wrapAnalyserNodeGetFloatTimeDomainDataMethod(nativeAnalyserNode);\n        }\n        return nativeAnalyserNode;\n    };\n};\n//# sourceMappingURL=native-analyser-node-factory.js.map","export const createNativeAudioBufferConstructor = (window) => {\n    if (window === null) {\n        return null;\n    }\n    if (window.hasOwnProperty('AudioBuffer')) {\n        return window.AudioBuffer;\n    }\n    return null;\n};\n//# sourceMappingURL=native-audio-buffer-constructor.js.map","export const assignNativeAudioNodeAudioParamValue = (nativeAudioNode, options, audioParam) => {\n    const value = options[audioParam];\n    if (value !== undefined && value !== nativeAudioNode[audioParam].value) {\n        nativeAudioNode[audioParam].value = value;\n    }\n};\n//# sourceMappingURL=assign-native-audio-node-audio-param-value.js.map","import { createInvalidStateError } from '../factories/invalid-state-error';\nexport const wrapAudioBufferSourceNodeStartMethodConsecutiveCalls = (nativeAudioBufferSourceNode) => {\n    nativeAudioBufferSourceNode.start = ((start) => {\n        let isScheduled = false;\n        return (when = 0, offset = 0, duration) => {\n            if (isScheduled) {\n                throw createInvalidStateError();\n            }\n            start.call(nativeAudioBufferSourceNode, when, offset, duration);\n            isScheduled = true;\n        };\n    })(nativeAudioBufferSourceNode.start);\n};\n//# sourceMappingURL=wrap-audio-buffer-source-node-start-method-consecutive-calls.js.map","export const wrapAudioScheduledSourceNodeStartMethodNegativeParameters = (nativeAudioScheduledSourceNode) => {\n    nativeAudioScheduledSourceNode.start = ((start) => {\n        return (when = 0, offset = 0, duration) => {\n            if ((typeof duration === 'number' && duration < 0) || offset < 0 || when < 0) {\n                throw new RangeError(\"The parameters can't be negative.\");\n            }\n            // @todo TypeScript cannot infer the overloaded signature with 3 arguments yet.\n            start.call(nativeAudioScheduledSourceNode, when, offset, duration);\n        };\n    })(nativeAudioScheduledSourceNode.start);\n};\n//# sourceMappingURL=wrap-audio-scheduled-source-node-start-method-negative-parameters.js.map","export const wrapAudioScheduledSourceNodeStopMethodNegativeParameters = (nativeAudioScheduledSourceNode) => {\n    nativeAudioScheduledSourceNode.stop = ((stop) => {\n        return (when = 0) => {\n            if (when < 0) {\n                throw new RangeError(\"The parameter can't be negative.\");\n            }\n            stop.call(nativeAudioScheduledSourceNode, when);\n        };\n    })(nativeAudioScheduledSourceNode.stop);\n};\n//# sourceMappingURL=wrap-audio-scheduled-source-node-stop-method-negative-parameters.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapAudioBufferSourceNodeStartMethodConsecutiveCalls } from '../helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls';\nimport { wrapAudioScheduledSourceNodeStartMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters';\nimport { wrapAudioScheduledSourceNodeStopMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters';\nexport const createNativeAudioBufferSourceNodeFactory = (addSilentConnection, cacheTestResult, testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport, testAudioBufferSourceNodeStartMethodOffsetClampingSupport, testAudioBufferSourceNodeStopMethodNullifiedBufferSupport, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioBufferSourceNodeStartMethodOffsetClampling, wrapAudioBufferSourceNodeStopMethodNullifiedBuffer, wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls) => {\n    return (nativeContext, options) => {\n        const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n        assignNativeAudioNodeOptions(nativeAudioBufferSourceNode, options);\n        assignNativeAudioNodeAudioParamValue(nativeAudioBufferSourceNode, options, 'playbackRate');\n        assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'buffer');\n        // Bug #149: Safari does not yet support the detune AudioParam.\n        assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'loop');\n        assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'loopEnd');\n        assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'loopStart');\n        // Bug #69: Safari does allow calls to start() of an already scheduled AudioBufferSourceNode.\n        if (!cacheTestResult(testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport, () => testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport(nativeContext))) {\n            wrapAudioBufferSourceNodeStartMethodConsecutiveCalls(nativeAudioBufferSourceNode);\n        }\n        // Bug #154 & #155: Safari does not handle offsets which are equal to or greater than the duration of the buffer.\n        if (!cacheTestResult(testAudioBufferSourceNodeStartMethodOffsetClampingSupport, () => testAudioBufferSourceNodeStartMethodOffsetClampingSupport(nativeContext))) {\n            wrapAudioBufferSourceNodeStartMethodOffsetClampling(nativeAudioBufferSourceNode);\n        }\n        // Bug #162: Safari does throw an error when stop() is called on an AudioBufferSourceNode which has no buffer assigned to it.\n        if (!cacheTestResult(testAudioBufferSourceNodeStopMethodNullifiedBufferSupport, () => testAudioBufferSourceNodeStopMethodNullifiedBufferSupport(nativeContext))) {\n            wrapAudioBufferSourceNodeStopMethodNullifiedBuffer(nativeAudioBufferSourceNode, nativeContext);\n        }\n        // Bug #44: Safari does not throw a RangeError yet.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStartMethodNegativeParametersSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStartMethodNegativeParameters(nativeAudioBufferSourceNode);\n        }\n        // Bug #19: Safari does not ignore calls to stop() of an already stopped AudioBufferSourceNode.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, () => testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls(nativeAudioBufferSourceNode, nativeContext);\n        }\n        // Bug #44: Only Firefox does not throw a RangeError yet.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStopMethodNegativeParametersSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStopMethodNegativeParameters(nativeAudioBufferSourceNode);\n        }\n        // Bug #175: Safari will not fire an ended event if the AudioBufferSourceNode is unconnected.\n        addSilentConnection(nativeContext, nativeAudioBufferSourceNode);\n        return nativeAudioBufferSourceNode;\n    };\n};\n//# sourceMappingURL=native-audio-buffer-source-node-factory.js.map","export const createNativeAudioContextConstructor = (window) => {\n    if (window === null) {\n        return null;\n    }\n    if (window.hasOwnProperty('AudioContext')) {\n        return window.AudioContext;\n    }\n    return window.hasOwnProperty('webkitAudioContext') ? window.webkitAudioContext : null;\n};\n//# sourceMappingURL=native-audio-context-constructor.js.map","export const createNativeAudioDestinationNodeFactory = (createNativeGainNode, overwriteAccessors) => {\n    return (nativeContext, channelCount, isNodeOfNativeOfflineAudioContext) => {\n        const nativeAudioDestinationNode = nativeContext.destination;\n        // Bug #132: Safari does not have the correct channelCount.\n        if (nativeAudioDestinationNode.channelCount !== channelCount) {\n            try {\n                nativeAudioDestinationNode.channelCount = channelCount;\n            }\n            catch {\n                // Bug #169: Safari throws an error on each attempt to change the channelCount.\n            }\n        }\n        // Bug #83: Safari does not have the correct channelCountMode.\n        if (isNodeOfNativeOfflineAudioContext && nativeAudioDestinationNode.channelCountMode !== 'explicit') {\n            nativeAudioDestinationNode.channelCountMode = 'explicit';\n        }\n        // Bug #47: The AudioDestinationNode in Safari does not initialize the maxChannelCount property correctly.\n        if (nativeAudioDestinationNode.maxChannelCount === 0) {\n            Object.defineProperty(nativeAudioDestinationNode, 'maxChannelCount', {\n                value: channelCount\n            });\n        }\n        // Bug #168: No browser does yet have an AudioDestinationNode with an output.\n        const gainNode = createNativeGainNode(nativeContext, {\n            channelCount,\n            channelCountMode: nativeAudioDestinationNode.channelCountMode,\n            channelInterpretation: nativeAudioDestinationNode.channelInterpretation,\n            gain: 1\n        });\n        overwriteAccessors(gainNode, 'channelCount', (get) => () => get.call(gainNode), (set) => (value) => {\n            set.call(gainNode, value);\n            try {\n                nativeAudioDestinationNode.channelCount = value;\n            }\n            catch (err) {\n                // Bug #169: Safari throws an error on each attempt to change the channelCount.\n                if (value > nativeAudioDestinationNode.maxChannelCount) {\n                    throw err;\n                }\n            }\n        });\n        overwriteAccessors(gainNode, 'channelCountMode', (get) => () => get.call(gainNode), (set) => (value) => {\n            set.call(gainNode, value);\n            nativeAudioDestinationNode.channelCountMode = value;\n        });\n        overwriteAccessors(gainNode, 'channelInterpretation', (get) => () => get.call(gainNode), (set) => (value) => {\n            set.call(gainNode, value);\n            nativeAudioDestinationNode.channelInterpretation = value;\n        });\n        Object.defineProperty(gainNode, 'maxChannelCount', {\n            get: () => nativeAudioDestinationNode.maxChannelCount\n        });\n        // @todo This should be disconnected when the context is closed.\n        gainNode.connect(nativeAudioDestinationNode);\n        return gainNode;\n    };\n};\n//# sourceMappingURL=native-audio-destination-node.js.map","export const createNativeAudioWorkletNodeConstructor = (window) => {\n    if (window === null) {\n        return null;\n    }\n    return window.hasOwnProperty('AudioWorkletNode') ? window.AudioWorkletNode : null;\n};\n//# sourceMappingURL=native-audio-worklet-node-constructor.js.map","export const testClonabilityOfAudioWorkletNodeOptions = (audioWorkletNodeOptions) => {\n    const { port1 } = new MessageChannel();\n    try {\n        // This will throw an error if the audioWorkletNodeOptions are not clonable.\n        port1.postMessage(audioWorkletNodeOptions);\n    }\n    finally {\n        port1.close();\n    }\n};\n//# sourceMappingURL=test-clonability-of-audio-worklet-node-options.js.map","import { testClonabilityOfAudioWorkletNodeOptions } from '../helpers/test-clonability-of-audio-worklet-node-options';\nexport const createNativeAudioWorkletNodeFactory = (createInvalidStateError, createNativeAudioWorkletNodeFaker, createNativeGainNode, createNotSupportedError, monitorConnections) => {\n    return (nativeContext, baseLatency, nativeAudioWorkletNodeConstructor, name, processorConstructor, options) => {\n        if (nativeAudioWorkletNodeConstructor !== null) {\n            try {\n                const nativeAudioWorkletNode = new nativeAudioWorkletNodeConstructor(nativeContext, name, options);\n                const patchedEventListeners = new Map();\n                let onprocessorerror = null;\n                Object.defineProperties(nativeAudioWorkletNode, {\n                    /*\n                     * Bug #61: Overwriting the property accessors for channelCount and channelCountMode is necessary as long as some\n                     * browsers have no native implementation to achieve a consistent behavior.\n                     */\n                    channelCount: {\n                        get: () => options.channelCount,\n                        set: () => {\n                            throw createInvalidStateError();\n                        }\n                    },\n                    channelCountMode: {\n                        get: () => 'explicit',\n                        set: () => {\n                            throw createInvalidStateError();\n                        }\n                    },\n                    // Bug #156: Chrome and Edge do not yet fire an ErrorEvent.\n                    onprocessorerror: {\n                        get: () => onprocessorerror,\n                        set: (value) => {\n                            if (typeof onprocessorerror === 'function') {\n                                nativeAudioWorkletNode.removeEventListener('processorerror', onprocessorerror);\n                            }\n                            onprocessorerror = typeof value === 'function' ? value : null;\n                            if (typeof onprocessorerror === 'function') {\n                                nativeAudioWorkletNode.addEventListener('processorerror', onprocessorerror);\n                            }\n                        }\n                    }\n                });\n                nativeAudioWorkletNode.addEventListener = ((addEventListener) => {\n                    return (...args) => {\n                        if (args[0] === 'processorerror') {\n                            const unpatchedEventListener = typeof args[1] === 'function'\n                                ? args[1]\n                                : typeof args[1] === 'object' && args[1] !== null && typeof args[1].handleEvent === 'function'\n                                    ? args[1].handleEvent\n                                    : null;\n                            if (unpatchedEventListener !== null) {\n                                const patchedEventListener = patchedEventListeners.get(args[1]);\n                                if (patchedEventListener !== undefined) {\n                                    args[1] = patchedEventListener;\n                                }\n                                else {\n                                    args[1] = (event) => {\n                                        // Bug #178: Chrome, Edge and Opera do fire an event of type error.\n                                        if (event.type === 'error') {\n                                            Object.defineProperties(event, {\n                                                type: { value: 'processorerror' }\n                                            });\n                                            unpatchedEventListener(event);\n                                        }\n                                        else {\n                                            unpatchedEventListener(new ErrorEvent(args[0], { ...event }));\n                                        }\n                                    };\n                                    patchedEventListeners.set(unpatchedEventListener, args[1]);\n                                }\n                            }\n                        }\n                        // Bug #178: Chrome, Edge and Opera do fire an event of type error.\n                        addEventListener.call(nativeAudioWorkletNode, 'error', args[1], args[2]);\n                        return addEventListener.call(nativeAudioWorkletNode, ...args);\n                    };\n                })(nativeAudioWorkletNode.addEventListener);\n                nativeAudioWorkletNode.removeEventListener = ((removeEventListener) => {\n                    return (...args) => {\n                        if (args[0] === 'processorerror') {\n                            const patchedEventListener = patchedEventListeners.get(args[1]);\n                            if (patchedEventListener !== undefined) {\n                                patchedEventListeners.delete(args[1]);\n                                args[1] = patchedEventListener;\n                            }\n                        }\n                        // Bug #178: Chrome, Edge and Opera do fire an event of type error.\n                        removeEventListener.call(nativeAudioWorkletNode, 'error', args[1], args[2]);\n                        return removeEventListener.call(nativeAudioWorkletNode, args[0], args[1], args[2]);\n                    };\n                })(nativeAudioWorkletNode.removeEventListener);\n                /*\n                 * Bug #86: Chrome and Edge do not invoke the process() function if the corresponding AudioWorkletNode is unconnected but\n                 * has an output.\n                 */\n                if (options.numberOfOutputs !== 0) {\n                    const nativeGainNode = createNativeGainNode(nativeContext, {\n                        channelCount: 1,\n                        channelCountMode: 'explicit',\n                        channelInterpretation: 'discrete',\n                        gain: 0\n                    });\n                    nativeAudioWorkletNode.connect(nativeGainNode).connect(nativeContext.destination);\n                    const whenConnected = () => nativeGainNode.disconnect();\n                    const whenDisconnected = () => nativeGainNode.connect(nativeContext.destination);\n                    // @todo Disconnect the connection when the process() function of the AudioWorkletNode returns false.\n                    return monitorConnections(nativeAudioWorkletNode, whenConnected, whenDisconnected);\n                }\n                return nativeAudioWorkletNode;\n            }\n            catch (err) {\n                // Bug #60: Chrome, Edge & Opera throw an InvalidStateError instead of a NotSupportedError.\n                if (err.code === 11) {\n                    throw createNotSupportedError();\n                }\n                throw err;\n            }\n        }\n        // Bug #61: Only Chrome & Opera have an implementation of the AudioWorkletNode yet.\n        if (processorConstructor === undefined) {\n            throw createNotSupportedError();\n        }\n        testClonabilityOfAudioWorkletNodeOptions(options);\n        return createNativeAudioWorkletNodeFaker(nativeContext, baseLatency, processorConstructor, options);\n    };\n};\n//# sourceMappingURL=native-audio-worklet-node-factory.js.map","export const computeBufferSize = (baseLatency, sampleRate) => {\n    if (baseLatency === null) {\n        return 512;\n    }\n    return Math.max(512, Math.min(16384, Math.pow(2, Math.round(Math.log2(baseLatency * sampleRate)))));\n};\n//# sourceMappingURL=compute-buffer-size.js.map","export const cloneAudioWorkletNodeOptions = (audioWorkletNodeOptions) => {\n    return new Promise((resolve, reject) => {\n        const { port1, port2 } = new MessageChannel();\n        port1.onmessage = ({ data }) => {\n            port1.close();\n            port2.close();\n            resolve(data);\n        };\n        port1.onmessageerror = ({ data }) => {\n            port1.close();\n            port2.close();\n            reject(data);\n        };\n        // This will throw an error if the audioWorkletNodeOptions are not clonable.\n        port2.postMessage(audioWorkletNodeOptions);\n    });\n};\n//# sourceMappingURL=clone-audio-worklet-node-options.js.map","import { cloneAudioWorkletNodeOptions } from './clone-audio-worklet-node-options';\nexport const createAudioWorkletProcessorPromise = async (processorConstructor, audioWorkletNodeOptions) => {\n    const clonedAudioWorkletNodeOptions = await cloneAudioWorkletNodeOptions(audioWorkletNodeOptions);\n    return new processorConstructor(clonedAudioWorkletNodeOptions);\n};\n//# sourceMappingURL=create-audio-worklet-processor-promise.js.map","import { NODE_TO_PROCESSOR_MAPS } from '../globals';\nimport { createAudioWorkletProcessorPromise } from './create-audio-worklet-processor-promise';\nexport const createAudioWorkletProcessor = (nativeContext, nativeAudioWorkletNode, processorConstructor, audioWorkletNodeOptions) => {\n    let nodeToProcessorMap = NODE_TO_PROCESSOR_MAPS.get(nativeContext);\n    if (nodeToProcessorMap === undefined) {\n        nodeToProcessorMap = new WeakMap();\n        NODE_TO_PROCESSOR_MAPS.set(nativeContext, nodeToProcessorMap);\n    }\n    const audioWorkletProcessorPromise = createAudioWorkletProcessorPromise(processorConstructor, audioWorkletNodeOptions);\n    nodeToProcessorMap.set(nativeAudioWorkletNode, audioWorkletProcessorPromise);\n    return audioWorkletProcessorPromise;\n};\n//# sourceMappingURL=create-audio-worklet-processor.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nimport { computeBufferSize } from '../helpers/compute-buffer-size';\nimport { copyFromChannel } from '../helpers/copy-from-channel';\nimport { copyToChannel } from '../helpers/copy-to-channel';\nimport { createAudioWorkletProcessor } from '../helpers/create-audio-worklet-processor';\nimport { createNestedArrays } from '../helpers/create-nested-arrays';\nimport { ReadOnlyMap } from '../read-only-map';\nexport const createNativeAudioWorkletNodeFakerFactory = (connectMultipleOutputs, createIndexSizeError, createInvalidStateError, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, createNativeScriptProcessorNode, createNotSupportedError, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getActiveAudioWorkletNodeInputs, monitorConnections) => {\n    return (nativeContext, baseLatency, processorConstructor, options) => {\n        if (options.numberOfInputs === 0 && options.numberOfOutputs === 0) {\n            throw createNotSupportedError();\n        }\n        const outputChannelCount = Array.isArray(options.outputChannelCount)\n            ? options.outputChannelCount\n            : Array.from(options.outputChannelCount);\n        // @todo Check if any of the channelCount values is greater than the implementation's maximum number of channels.\n        if (outputChannelCount.some((channelCount) => channelCount < 1)) {\n            throw createNotSupportedError();\n        }\n        if (outputChannelCount.length !== options.numberOfOutputs) {\n            throw createIndexSizeError();\n        }\n        // Bug #61: This is not part of the standard but required for the faker to work.\n        if (options.channelCountMode !== 'explicit') {\n            throw createNotSupportedError();\n        }\n        const numberOfInputChannels = options.channelCount * options.numberOfInputs;\n        const numberOfOutputChannels = outputChannelCount.reduce((sum, value) => sum + value, 0);\n        const numberOfParameters = processorConstructor.parameterDescriptors === undefined ? 0 : processorConstructor.parameterDescriptors.length;\n        // Bug #61: This is not part of the standard but required for the faker to work.\n        if (numberOfInputChannels + numberOfParameters > 6 || numberOfOutputChannels > 6) {\n            throw createNotSupportedError();\n        }\n        const messageChannel = new MessageChannel();\n        const gainNodes = [];\n        const inputChannelSplitterNodes = [];\n        for (let i = 0; i < options.numberOfInputs; i += 1) {\n            gainNodes.push(createNativeGainNode(nativeContext, {\n                channelCount: options.channelCount,\n                channelCountMode: options.channelCountMode,\n                channelInterpretation: options.channelInterpretation,\n                gain: 1\n            }));\n            inputChannelSplitterNodes.push(createNativeChannelSplitterNode(nativeContext, {\n                channelCount: options.channelCount,\n                channelCountMode: 'explicit',\n                channelInterpretation: 'discrete',\n                numberOfOutputs: options.channelCount\n            }));\n        }\n        const constantSourceNodes = [];\n        if (processorConstructor.parameterDescriptors !== undefined) {\n            for (const { defaultValue, maxValue, minValue, name } of processorConstructor.parameterDescriptors) {\n                const constantSourceNode = createNativeConstantSourceNode(nativeContext, {\n                    channelCount: 1,\n                    channelCountMode: 'explicit',\n                    channelInterpretation: 'discrete',\n                    offset: options.parameterData[name] !== undefined\n                        ? options.parameterData[name]\n                        : defaultValue === undefined\n                            ? 0\n                            : defaultValue\n                });\n                Object.defineProperties(constantSourceNode.offset, {\n                    defaultValue: {\n                        get: () => (defaultValue === undefined ? 0 : defaultValue)\n                    },\n                    maxValue: {\n                        get: () => (maxValue === undefined ? MOST_POSITIVE_SINGLE_FLOAT : maxValue)\n                    },\n                    minValue: {\n                        get: () => (minValue === undefined ? MOST_NEGATIVE_SINGLE_FLOAT : minValue)\n                    }\n                });\n                constantSourceNodes.push(constantSourceNode);\n            }\n        }\n        const inputChannelMergerNode = createNativeChannelMergerNode(nativeContext, {\n            channelCount: 1,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'speakers',\n            numberOfInputs: Math.max(1, numberOfInputChannels + numberOfParameters)\n        });\n        const bufferSize = computeBufferSize(baseLatency, nativeContext.sampleRate);\n        const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, bufferSize, numberOfInputChannels + numberOfParameters, \n        // Bug #87: Only Firefox will fire an AudioProcessingEvent if there is no connected output.\n        Math.max(1, numberOfOutputChannels));\n        const outputChannelSplitterNode = createNativeChannelSplitterNode(nativeContext, {\n            channelCount: Math.max(1, numberOfOutputChannels),\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete',\n            numberOfOutputs: Math.max(1, numberOfOutputChannels)\n        });\n        const outputChannelMergerNodes = [];\n        for (let i = 0; i < options.numberOfOutputs; i += 1) {\n            outputChannelMergerNodes.push(createNativeChannelMergerNode(nativeContext, {\n                channelCount: 1,\n                channelCountMode: 'explicit',\n                channelInterpretation: 'speakers',\n                numberOfInputs: outputChannelCount[i]\n            }));\n        }\n        for (let i = 0; i < options.numberOfInputs; i += 1) {\n            gainNodes[i].connect(inputChannelSplitterNodes[i]);\n            for (let j = 0; j < options.channelCount; j += 1) {\n                inputChannelSplitterNodes[i].connect(inputChannelMergerNode, j, i * options.channelCount + j);\n            }\n        }\n        const parameterMap = new ReadOnlyMap(processorConstructor.parameterDescriptors === undefined\n            ? []\n            : processorConstructor.parameterDescriptors.map(({ name }, index) => {\n                const constantSourceNode = constantSourceNodes[index];\n                constantSourceNode.connect(inputChannelMergerNode, 0, numberOfInputChannels + index);\n                constantSourceNode.start(0);\n                return [name, constantSourceNode.offset];\n            }));\n        inputChannelMergerNode.connect(scriptProcessorNode);\n        let channelInterpretation = options.channelInterpretation;\n        let onprocessorerror = null;\n        // Bug #87: Expose at least one output to make this node connectable.\n        const outputAudioNodes = options.numberOfOutputs === 0 ? [scriptProcessorNode] : outputChannelMergerNodes;\n        const nativeAudioWorkletNodeFaker = {\n            get bufferSize() {\n                return bufferSize;\n            },\n            get channelCount() {\n                return options.channelCount;\n            },\n            set channelCount(_) {\n                // Bug #61: This is not part of the standard but required for the faker to work.\n                throw createInvalidStateError();\n            },\n            get channelCountMode() {\n                return options.channelCountMode;\n            },\n            set channelCountMode(_) {\n                // Bug #61: This is not part of the standard but required for the faker to work.\n                throw createInvalidStateError();\n            },\n            get channelInterpretation() {\n                return channelInterpretation;\n            },\n            set channelInterpretation(value) {\n                for (const gainNode of gainNodes) {\n                    gainNode.channelInterpretation = value;\n                }\n                channelInterpretation = value;\n            },\n            get context() {\n                return scriptProcessorNode.context;\n            },\n            get inputs() {\n                return gainNodes;\n            },\n            get numberOfInputs() {\n                return options.numberOfInputs;\n            },\n            get numberOfOutputs() {\n                return options.numberOfOutputs;\n            },\n            get onprocessorerror() {\n                return onprocessorerror;\n            },\n            set onprocessorerror(value) {\n                if (typeof onprocessorerror === 'function') {\n                    nativeAudioWorkletNodeFaker.removeEventListener('processorerror', onprocessorerror);\n                }\n                onprocessorerror = typeof value === 'function' ? value : null;\n                if (typeof onprocessorerror === 'function') {\n                    nativeAudioWorkletNodeFaker.addEventListener('processorerror', onprocessorerror);\n                }\n            },\n            get parameters() {\n                return parameterMap;\n            },\n            get port() {\n                return messageChannel.port2;\n            },\n            addEventListener(...args) {\n                return scriptProcessorNode.addEventListener(args[0], args[1], args[2]);\n            },\n            connect: connectMultipleOutputs.bind(null, outputAudioNodes),\n            disconnect: disconnectMultipleOutputs.bind(null, outputAudioNodes),\n            dispatchEvent(...args) {\n                return scriptProcessorNode.dispatchEvent(args[0]);\n            },\n            removeEventListener(...args) {\n                return scriptProcessorNode.removeEventListener(args[0], args[1], args[2]);\n            }\n        };\n        const patchedEventListeners = new Map();\n        messageChannel.port1.addEventListener = ((addEventListener) => {\n            return (...args) => {\n                if (args[0] === 'message') {\n                    const unpatchedEventListener = typeof args[1] === 'function'\n                        ? args[1]\n                        : typeof args[1] === 'object' && args[1] !== null && typeof args[1].handleEvent === 'function'\n                            ? args[1].handleEvent\n                            : null;\n                    if (unpatchedEventListener !== null) {\n                        const patchedEventListener = patchedEventListeners.get(args[1]);\n                        if (patchedEventListener !== undefined) {\n                            args[1] = patchedEventListener;\n                        }\n                        else {\n                            args[1] = (event) => {\n                                exposeCurrentFrameAndCurrentTime(nativeContext.currentTime, nativeContext.sampleRate, () => unpatchedEventListener(event));\n                            };\n                            patchedEventListeners.set(unpatchedEventListener, args[1]);\n                        }\n                    }\n                }\n                return addEventListener.call(messageChannel.port1, args[0], args[1], args[2]);\n            };\n        })(messageChannel.port1.addEventListener);\n        messageChannel.port1.removeEventListener = ((removeEventListener) => {\n            return (...args) => {\n                if (args[0] === 'message') {\n                    const patchedEventListener = patchedEventListeners.get(args[1]);\n                    if (patchedEventListener !== undefined) {\n                        patchedEventListeners.delete(args[1]);\n                        args[1] = patchedEventListener;\n                    }\n                }\n                return removeEventListener.call(messageChannel.port1, args[0], args[1], args[2]);\n            };\n        })(messageChannel.port1.removeEventListener);\n        let onmessage = null;\n        Object.defineProperty(messageChannel.port1, 'onmessage', {\n            get: () => onmessage,\n            set: (value) => {\n                if (typeof onmessage === 'function') {\n                    messageChannel.port1.removeEventListener('message', onmessage);\n                }\n                onmessage = typeof value === 'function' ? value : null;\n                if (typeof onmessage === 'function') {\n                    messageChannel.port1.addEventListener('message', onmessage);\n                    messageChannel.port1.start();\n                }\n            }\n        });\n        processorConstructor.prototype.port = messageChannel.port1;\n        let audioWorkletProcessor = null;\n        const audioWorkletProcessorPromise = createAudioWorkletProcessor(nativeContext, nativeAudioWorkletNodeFaker, processorConstructor, options);\n        audioWorkletProcessorPromise.then((dWrkltPrcssr) => (audioWorkletProcessor = dWrkltPrcssr));\n        const inputs = createNestedArrays(options.numberOfInputs, options.channelCount);\n        const outputs = createNestedArrays(options.numberOfOutputs, outputChannelCount);\n        const parameters = processorConstructor.parameterDescriptors === undefined\n            ? []\n            : processorConstructor.parameterDescriptors.reduce((prmtrs, { name }) => ({ ...prmtrs, [name]: new Float32Array(128) }), {});\n        let isActive = true;\n        const disconnectOutputsGraph = () => {\n            if (options.numberOfOutputs > 0) {\n                scriptProcessorNode.disconnect(outputChannelSplitterNode);\n            }\n            for (let i = 0, outputChannelSplitterNodeOutput = 0; i < options.numberOfOutputs; i += 1) {\n                const outputChannelMergerNode = outputChannelMergerNodes[i];\n                for (let j = 0; j < outputChannelCount[i]; j += 1) {\n                    outputChannelSplitterNode.disconnect(outputChannelMergerNode, outputChannelSplitterNodeOutput + j, j);\n                }\n                outputChannelSplitterNodeOutput += outputChannelCount[i];\n            }\n        };\n        const activeInputIndexes = new Map();\n        // tslint:disable-next-line:deprecation\n        scriptProcessorNode.onaudioprocess = ({ inputBuffer, outputBuffer }) => {\n            if (audioWorkletProcessor !== null) {\n                const activeInputs = getActiveAudioWorkletNodeInputs(nativeAudioWorkletNodeFaker);\n                for (let i = 0; i < bufferSize; i += 128) {\n                    for (let j = 0; j < options.numberOfInputs; j += 1) {\n                        for (let k = 0; k < options.channelCount; k += 1) {\n                            copyFromChannel(inputBuffer, inputs[j], k, k, i);\n                        }\n                    }\n                    if (processorConstructor.parameterDescriptors !== undefined) {\n                        processorConstructor.parameterDescriptors.forEach(({ name }, index) => {\n                            copyFromChannel(inputBuffer, parameters, name, numberOfInputChannels + index, i);\n                        });\n                    }\n                    for (let j = 0; j < options.numberOfInputs; j += 1) {\n                        for (let k = 0; k < outputChannelCount[j]; k += 1) {\n                            // The byteLength will be 0 when the ArrayBuffer was transferred.\n                            if (outputs[j][k].byteLength === 0) {\n                                outputs[j][k] = new Float32Array(128);\n                            }\n                        }\n                    }\n                    try {\n                        const potentiallyEmptyInputs = inputs.map((input, index) => {\n                            const activeInput = activeInputs[index];\n                            if (activeInput.size > 0) {\n                                activeInputIndexes.set(index, bufferSize / 128);\n                                return input;\n                            }\n                            const count = activeInputIndexes.get(index);\n                            if (count === undefined) {\n                                return [];\n                            }\n                            if (input.every((channelData) => channelData.every((sample) => sample === 0))) {\n                                if (count === 1) {\n                                    activeInputIndexes.delete(index);\n                                }\n                                else {\n                                    activeInputIndexes.set(index, count - 1);\n                                }\n                            }\n                            return input;\n                        });\n                        const activeSourceFlag = exposeCurrentFrameAndCurrentTime(nativeContext.currentTime + i / nativeContext.sampleRate, nativeContext.sampleRate, () => audioWorkletProcessor.process(potentiallyEmptyInputs, outputs, parameters));\n                        isActive = activeSourceFlag;\n                        for (let j = 0, outputChannelSplitterNodeOutput = 0; j < options.numberOfOutputs; j += 1) {\n                            for (let k = 0; k < outputChannelCount[j]; k += 1) {\n                                copyToChannel(outputBuffer, outputs[j], k, outputChannelSplitterNodeOutput + k, i);\n                            }\n                            outputChannelSplitterNodeOutput += outputChannelCount[j];\n                        }\n                    }\n                    catch (error) {\n                        isActive = false;\n                        nativeAudioWorkletNodeFaker.dispatchEvent(new ErrorEvent('processorerror', {\n                            colno: error.colno,\n                            filename: error.filename,\n                            lineno: error.lineno,\n                            message: error.message\n                        }));\n                    }\n                    if (!isActive) {\n                        for (let j = 0; j < options.numberOfInputs; j += 1) {\n                            gainNodes[j].disconnect(inputChannelSplitterNodes[j]);\n                            for (let k = 0; k < options.channelCount; k += 1) {\n                                inputChannelSplitterNodes[i].disconnect(inputChannelMergerNode, k, j * options.channelCount + k);\n                            }\n                        }\n                        if (processorConstructor.parameterDescriptors !== undefined) {\n                            const length = processorConstructor.parameterDescriptors.length;\n                            for (let j = 0; j < length; j += 1) {\n                                const constantSourceNode = constantSourceNodes[j];\n                                constantSourceNode.disconnect(inputChannelMergerNode, 0, numberOfInputChannels + j);\n                                constantSourceNode.stop();\n                            }\n                        }\n                        inputChannelMergerNode.disconnect(scriptProcessorNode);\n                        scriptProcessorNode.onaudioprocess = null; // tslint:disable-line:deprecation\n                        if (isConnected) {\n                            disconnectOutputsGraph();\n                        }\n                        else {\n                            disconnectFakeGraph();\n                        }\n                        break;\n                    }\n                }\n            }\n        };\n        let isConnected = false;\n        // Bug #87: Only Firefox will fire an AudioProcessingEvent if there is no connected output.\n        const nativeGainNode = createNativeGainNode(nativeContext, {\n            channelCount: 1,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete',\n            gain: 0\n        });\n        const connectFakeGraph = () => scriptProcessorNode.connect(nativeGainNode).connect(nativeContext.destination);\n        const disconnectFakeGraph = () => {\n            scriptProcessorNode.disconnect(nativeGainNode);\n            nativeGainNode.disconnect();\n        };\n        const whenConnected = () => {\n            if (isActive) {\n                disconnectFakeGraph();\n                if (options.numberOfOutputs > 0) {\n                    scriptProcessorNode.connect(outputChannelSplitterNode);\n                }\n                for (let i = 0, outputChannelSplitterNodeOutput = 0; i < options.numberOfOutputs; i += 1) {\n                    const outputChannelMergerNode = outputChannelMergerNodes[i];\n                    for (let j = 0; j < outputChannelCount[i]; j += 1) {\n                        outputChannelSplitterNode.connect(outputChannelMergerNode, outputChannelSplitterNodeOutput + j, j);\n                    }\n                    outputChannelSplitterNodeOutput += outputChannelCount[i];\n                }\n            }\n            isConnected = true;\n        };\n        const whenDisconnected = () => {\n            if (isActive) {\n                connectFakeGraph();\n                disconnectOutputsGraph();\n            }\n            isConnected = false;\n        };\n        connectFakeGraph();\n        return monitorConnections(nativeAudioWorkletNodeFaker, whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=native-audio-worklet-node-faker-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeBiquadFilterNode = (nativeContext, options) => {\n    const nativeBiquadFilterNode = nativeContext.createBiquadFilter();\n    assignNativeAudioNodeOptions(nativeBiquadFilterNode, options);\n    assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'Q');\n    assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'detune');\n    assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'frequency');\n    assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'gain');\n    assignNativeAudioNodeOption(nativeBiquadFilterNode, options, 'type');\n    return nativeBiquadFilterNode;\n};\n//# sourceMappingURL=native-biquad-filter-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeChannelMergerNodeFactory = (nativeAudioContextConstructor, wrapChannelMergerNode) => {\n    return (nativeContext, options) => {\n        const nativeChannelMergerNode = nativeContext.createChannelMerger(options.numberOfInputs);\n        /*\n         * Bug #20: Safari requires a connection of any kind to treat the input signal correctly.\n         * @todo Unfortunately there is no way to test for this behavior in a synchronous fashion which is why testing for the existence of\n         * the webkitAudioContext is used as a workaround here.\n         */\n        if (nativeAudioContextConstructor !== null && nativeAudioContextConstructor.name === 'webkitAudioContext') {\n            wrapChannelMergerNode(nativeContext, nativeChannelMergerNode);\n        }\n        assignNativeAudioNodeOptions(nativeChannelMergerNode, options);\n        return nativeChannelMergerNode;\n    };\n};\n//# sourceMappingURL=native-channel-merger-node-factory.js.map","import { createInvalidStateError } from '../factories/invalid-state-error';\nexport const wrapChannelSplitterNode = (channelSplitterNode) => {\n    const channelCount = channelSplitterNode.numberOfOutputs;\n    // Bug #97: Safari does not throw an error when attempting to change the channelCount to something other than its initial value.\n    Object.defineProperty(channelSplitterNode, 'channelCount', {\n        get: () => channelCount,\n        set: (value) => {\n            if (value !== channelCount) {\n                throw createInvalidStateError();\n            }\n        }\n    });\n    // Bug #30: Safari does not throw an error when attempting to change the channelCountMode to something other than explicit.\n    Object.defineProperty(channelSplitterNode, 'channelCountMode', {\n        get: () => 'explicit',\n        set: (value) => {\n            if (value !== 'explicit') {\n                throw createInvalidStateError();\n            }\n        }\n    });\n    // Bug #32: Safari does not throw an error when attempting to change the channelInterpretation to something other than discrete.\n    Object.defineProperty(channelSplitterNode, 'channelInterpretation', {\n        get: () => 'discrete',\n        set: (value) => {\n            if (value !== 'discrete') {\n                throw createInvalidStateError();\n            }\n        }\n    });\n};\n//# sourceMappingURL=wrap-channel-splitter-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapChannelSplitterNode } from '../helpers/wrap-channel-splitter-node';\nexport const createNativeChannelSplitterNode = (nativeContext, options) => {\n    const nativeChannelSplitterNode = nativeContext.createChannelSplitter(options.numberOfOutputs);\n    // Bug #96: Safari does not have the correct channelCount.\n    // Bug #29: Safari does not have the correct channelCountMode.\n    // Bug #31: Safari does not have the correct channelInterpretation.\n    assignNativeAudioNodeOptions(nativeChannelSplitterNode, options);\n    // Bug #29, #30, #31, #32, #96 & #97: Only Chrome, Edge, Firefox & Opera partially support the spec yet.\n    wrapChannelSplitterNode(nativeChannelSplitterNode);\n    return nativeChannelSplitterNode;\n};\n//# sourceMappingURL=native-channel-splitter-node.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapAudioScheduledSourceNodeStartMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters';\nimport { wrapAudioScheduledSourceNodeStopMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters';\nexport const createNativeConstantSourceNodeFactory = (addSilentConnection, cacheTestResult, createNativeConstantSourceNodeFaker, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport) => {\n    return (nativeContext, options) => {\n        // Bug #62: Safari does not support ConstantSourceNodes.\n        if (nativeContext.createConstantSource === undefined) {\n            return createNativeConstantSourceNodeFaker(nativeContext, options);\n        }\n        const nativeConstantSourceNode = nativeContext.createConstantSource();\n        assignNativeAudioNodeOptions(nativeConstantSourceNode, options);\n        assignNativeAudioNodeAudioParamValue(nativeConstantSourceNode, options, 'offset');\n        // Bug #44: Safari does not throw a RangeError yet.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStartMethodNegativeParametersSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStartMethodNegativeParameters(nativeConstantSourceNode);\n        }\n        // Bug #44: Only Firefox does not throw a RangeError yet.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStopMethodNegativeParametersSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStopMethodNegativeParameters(nativeConstantSourceNode);\n        }\n        // Bug #175: Safari will not fire an ended event if the ConstantSourceNode is unconnected.\n        addSilentConnection(nativeContext, nativeConstantSourceNode);\n        return nativeConstantSourceNode;\n    };\n};\n//# sourceMappingURL=native-constant-source-node-factory.js.map","export const interceptConnections = (original, interceptor) => {\n    original.connect = interceptor.connect.bind(interceptor);\n    original.disconnect = interceptor.disconnect.bind(interceptor);\n    return original;\n};\n//# sourceMappingURL=intercept-connections.js.map","import { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativeConstantSourceNodeFakerFactory = (addSilentConnection, createNativeAudioBufferSourceNode, createNativeGainNode, monitorConnections) => {\n    return (nativeContext, { offset, ...audioNodeOptions }) => {\n        const audioBuffer = nativeContext.createBuffer(1, 2, 44100);\n        const audioBufferSourceNode = createNativeAudioBufferSourceNode(nativeContext, {\n            buffer: null,\n            channelCount: 2,\n            channelCountMode: 'max',\n            channelInterpretation: 'speakers',\n            loop: false,\n            loopEnd: 0,\n            loopStart: 0,\n            playbackRate: 1\n        });\n        const gainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: offset });\n        // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n        const channelData = audioBuffer.getChannelData(0);\n        // Bug #95: Safari does not play or loop one sample buffers.\n        channelData[0] = 1;\n        channelData[1] = 1;\n        audioBufferSourceNode.buffer = audioBuffer;\n        audioBufferSourceNode.loop = true;\n        const nativeConstantSourceNodeFaker = {\n            get bufferSize() {\n                return undefined;\n            },\n            get channelCount() {\n                return gainNode.channelCount;\n            },\n            set channelCount(value) {\n                gainNode.channelCount = value;\n            },\n            get channelCountMode() {\n                return gainNode.channelCountMode;\n            },\n            set channelCountMode(value) {\n                gainNode.channelCountMode = value;\n            },\n            get channelInterpretation() {\n                return gainNode.channelInterpretation;\n            },\n            set channelInterpretation(value) {\n                gainNode.channelInterpretation = value;\n            },\n            get context() {\n                return gainNode.context;\n            },\n            get inputs() {\n                return [];\n            },\n            get numberOfInputs() {\n                return audioBufferSourceNode.numberOfInputs;\n            },\n            get numberOfOutputs() {\n                return gainNode.numberOfOutputs;\n            },\n            get offset() {\n                return gainNode.gain;\n            },\n            get onended() {\n                return audioBufferSourceNode.onended;\n            },\n            set onended(value) {\n                audioBufferSourceNode.onended = value;\n            },\n            addEventListener(...args) {\n                return audioBufferSourceNode.addEventListener(args[0], args[1], args[2]);\n            },\n            dispatchEvent(...args) {\n                return audioBufferSourceNode.dispatchEvent(args[0]);\n            },\n            removeEventListener(...args) {\n                return audioBufferSourceNode.removeEventListener(args[0], args[1], args[2]);\n            },\n            start(when = 0) {\n                audioBufferSourceNode.start.call(audioBufferSourceNode, when);\n            },\n            stop(when = 0) {\n                audioBufferSourceNode.stop.call(audioBufferSourceNode, when);\n            }\n        };\n        const whenConnected = () => audioBufferSourceNode.connect(gainNode);\n        const whenDisconnected = () => audioBufferSourceNode.disconnect(gainNode);\n        // Bug #175: Safari will not fire an ended event if the AudioBufferSourceNode is unconnected.\n        addSilentConnection(nativeContext, audioBufferSourceNode);\n        return monitorConnections(interceptConnections(nativeConstantSourceNodeFaker, gainNode), whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=native-constant-source-node-faker-factory.js.map","import { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeConvolverNodeFactory = (createNotSupportedError, overwriteAccessors) => {\n    return (nativeContext, options) => {\n        const nativeConvolverNode = nativeContext.createConvolver();\n        assignNativeAudioNodeOptions(nativeConvolverNode, options);\n        // The normalize property needs to be set before setting the buffer.\n        if (options.disableNormalization === nativeConvolverNode.normalize) {\n            nativeConvolverNode.normalize = !options.disableNormalization;\n        }\n        assignNativeAudioNodeOption(nativeConvolverNode, options, 'buffer');\n        // Bug #113: Safari does allow to set the channelCount to a value larger than 2.\n        if (options.channelCount > 2) {\n            throw createNotSupportedError();\n        }\n        overwriteAccessors(nativeConvolverNode, 'channelCount', (get) => () => get.call(nativeConvolverNode), (set) => (value) => {\n            if (value > 2) {\n                throw createNotSupportedError();\n            }\n            return set.call(nativeConvolverNode, value);\n        });\n        // Bug #114: Safari allows to set the channelCountMode to 'max'.\n        if (options.channelCountMode === 'max') {\n            throw createNotSupportedError();\n        }\n        overwriteAccessors(nativeConvolverNode, 'channelCountMode', (get) => () => get.call(nativeConvolverNode), (set) => (value) => {\n            if (value === 'max') {\n                throw createNotSupportedError();\n            }\n            return set.call(nativeConvolverNode, value);\n        });\n        return nativeConvolverNode;\n    };\n};\n//# sourceMappingURL=native-convolver-node-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeDelayNode = (nativeContext, options) => {\n    const nativeDelayNode = nativeContext.createDelay(options.maxDelayTime);\n    assignNativeAudioNodeOptions(nativeDelayNode, options);\n    assignNativeAudioNodeAudioParamValue(nativeDelayNode, options, 'delayTime');\n    return nativeDelayNode;\n};\n//# sourceMappingURL=native-delay-node.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeDynamicsCompressorNodeFactory = (createNotSupportedError) => {\n    return (nativeContext, options) => {\n        const nativeDynamicsCompressorNode = nativeContext.createDynamicsCompressor();\n        assignNativeAudioNodeOptions(nativeDynamicsCompressorNode, options);\n        // Bug #108: Safari allows a channelCount of three and above.\n        if (options.channelCount > 2) {\n            throw createNotSupportedError();\n        }\n        // Bug #109: Only Chrome, Firefox and Opera disallow a channelCountMode of 'max'.\n        if (options.channelCountMode === 'max') {\n            throw createNotSupportedError();\n        }\n        assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'attack');\n        assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'knee');\n        assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'ratio');\n        assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'release');\n        assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'threshold');\n        return nativeDynamicsCompressorNode;\n    };\n};\n//# sourceMappingURL=native-dynamics-compressor-node-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeGainNode = (nativeContext, options) => {\n    const nativeGainNode = nativeContext.createGain();\n    assignNativeAudioNodeOptions(nativeGainNode, options);\n    assignNativeAudioNodeAudioParamValue(nativeGainNode, options, 'gain');\n    return nativeGainNode;\n};\n//# sourceMappingURL=native-gain-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeIIRFilterNodeFactory = (createNativeIIRFilterNodeFaker) => {\n    return (nativeContext, baseLatency, options) => {\n        // Bug #9: Safari does not support IIRFilterNodes.\n        if (nativeContext.createIIRFilter === undefined) {\n            return createNativeIIRFilterNodeFaker(nativeContext, baseLatency, options);\n        }\n        // @todo TypeScript defines the parameters of createIIRFilter() as arrays of numbers.\n        const nativeIIRFilterNode = nativeContext.createIIRFilter(options.feedforward, options.feedback);\n        assignNativeAudioNodeOptions(nativeIIRFilterNode, options);\n        return nativeIIRFilterNode;\n    };\n};\n//# sourceMappingURL=native-iir-filter-node-factory.js.map","import { computeBufferSize } from '../helpers/compute-buffer-size';\nimport { filterBuffer } from '../helpers/filter-buffer';\nimport { interceptConnections } from '../helpers/intercept-connections';\nfunction divide(a, b) {\n    const denominator = b[0] * b[0] + b[1] * b[1];\n    return [(a[0] * b[0] + a[1] * b[1]) / denominator, (a[1] * b[0] - a[0] * b[1]) / denominator];\n}\nfunction multiply(a, b) {\n    return [a[0] * b[0] - a[1] * b[1], a[0] * b[1] + a[1] * b[0]];\n}\nfunction evaluatePolynomial(coefficient, z) {\n    let result = [0, 0];\n    for (let i = coefficient.length - 1; i >= 0; i -= 1) {\n        result = multiply(result, z);\n        result[0] += coefficient[i];\n    }\n    return result;\n}\nexport const createNativeIIRFilterNodeFakerFactory = (createInvalidAccessError, createInvalidStateError, createNativeScriptProcessorNode, createNotSupportedError) => {\n    return (nativeContext, baseLatency, { channelCount, channelCountMode, channelInterpretation, feedback, feedforward }) => {\n        const bufferSize = computeBufferSize(baseLatency, nativeContext.sampleRate);\n        const convertedFeedback = feedback instanceof Float64Array ? feedback : new Float64Array(feedback);\n        const convertedFeedforward = feedforward instanceof Float64Array ? feedforward : new Float64Array(feedforward);\n        const feedbackLength = convertedFeedback.length;\n        const feedforwardLength = convertedFeedforward.length;\n        const minLength = Math.min(feedbackLength, feedforwardLength);\n        if (feedbackLength === 0 || feedbackLength > 20) {\n            throw createNotSupportedError();\n        }\n        if (convertedFeedback[0] === 0) {\n            throw createInvalidStateError();\n        }\n        if (feedforwardLength === 0 || feedforwardLength > 20) {\n            throw createNotSupportedError();\n        }\n        if (convertedFeedforward[0] === 0) {\n            throw createInvalidStateError();\n        }\n        if (convertedFeedback[0] !== 1) {\n            for (let i = 0; i < feedforwardLength; i += 1) {\n                convertedFeedforward[i] /= convertedFeedback[0];\n            }\n            for (let i = 1; i < feedbackLength; i += 1) {\n                convertedFeedback[i] /= convertedFeedback[0];\n            }\n        }\n        const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, bufferSize, channelCount, channelCount);\n        scriptProcessorNode.channelCount = channelCount;\n        scriptProcessorNode.channelCountMode = channelCountMode;\n        scriptProcessorNode.channelInterpretation = channelInterpretation;\n        const bufferLength = 32;\n        const bufferIndexes = [];\n        const xBuffers = [];\n        const yBuffers = [];\n        for (let i = 0; i < channelCount; i += 1) {\n            bufferIndexes.push(0);\n            const xBuffer = new Float32Array(bufferLength);\n            const yBuffer = new Float32Array(bufferLength);\n            xBuffer.fill(0);\n            yBuffer.fill(0);\n            xBuffers.push(xBuffer);\n            yBuffers.push(yBuffer);\n        }\n        // tslint:disable-next-line:deprecation\n        scriptProcessorNode.onaudioprocess = (event) => {\n            const inputBuffer = event.inputBuffer;\n            const outputBuffer = event.outputBuffer;\n            const numberOfChannels = inputBuffer.numberOfChannels;\n            for (let i = 0; i < numberOfChannels; i += 1) {\n                const input = inputBuffer.getChannelData(i);\n                const output = outputBuffer.getChannelData(i);\n                bufferIndexes[i] = filterBuffer(convertedFeedback, feedbackLength, convertedFeedforward, feedforwardLength, minLength, xBuffers[i], yBuffers[i], bufferIndexes[i], bufferLength, input, output);\n            }\n        };\n        const nyquist = nativeContext.sampleRate / 2;\n        const nativeIIRFilterNodeFaker = {\n            get bufferSize() {\n                return bufferSize;\n            },\n            get channelCount() {\n                return scriptProcessorNode.channelCount;\n            },\n            set channelCount(value) {\n                scriptProcessorNode.channelCount = value;\n            },\n            get channelCountMode() {\n                return scriptProcessorNode.channelCountMode;\n            },\n            set channelCountMode(value) {\n                scriptProcessorNode.channelCountMode = value;\n            },\n            get channelInterpretation() {\n                return scriptProcessorNode.channelInterpretation;\n            },\n            set channelInterpretation(value) {\n                scriptProcessorNode.channelInterpretation = value;\n            },\n            get context() {\n                return scriptProcessorNode.context;\n            },\n            get inputs() {\n                return [scriptProcessorNode];\n            },\n            get numberOfInputs() {\n                return scriptProcessorNode.numberOfInputs;\n            },\n            get numberOfOutputs() {\n                return scriptProcessorNode.numberOfOutputs;\n            },\n            addEventListener(...args) {\n                // @todo Dissallow adding an audioprocess listener.\n                return scriptProcessorNode.addEventListener(args[0], args[1], args[2]);\n            },\n            dispatchEvent(...args) {\n                return scriptProcessorNode.dispatchEvent(args[0]);\n            },\n            getFrequencyResponse(frequencyHz, magResponse, phaseResponse) {\n                if (frequencyHz.length !== magResponse.length || magResponse.length !== phaseResponse.length) {\n                    throw createInvalidAccessError();\n                }\n                const length = frequencyHz.length;\n                for (let i = 0; i < length; i += 1) {\n                    const omega = -Math.PI * (frequencyHz[i] / nyquist);\n                    const z = [Math.cos(omega), Math.sin(omega)];\n                    const numerator = evaluatePolynomial(convertedFeedforward, z);\n                    const denominator = evaluatePolynomial(convertedFeedback, z);\n                    const response = divide(numerator, denominator);\n                    magResponse[i] = Math.sqrt(response[0] * response[0] + response[1] * response[1]);\n                    phaseResponse[i] = Math.atan2(response[1], response[0]);\n                }\n            },\n            removeEventListener(...args) {\n                return scriptProcessorNode.removeEventListener(args[0], args[1], args[2]);\n            }\n        };\n        return interceptConnections(nativeIIRFilterNodeFaker, scriptProcessorNode);\n    };\n};\n//# sourceMappingURL=native-iir-filter-node-faker-factory.js.map","export const createNativeMediaElementAudioSourceNode = (nativeAudioContext, options) => {\n    return nativeAudioContext.createMediaElementSource(options.mediaElement);\n};\n//# sourceMappingURL=native-media-element-audio-source-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeMediaStreamAudioDestinationNode = (nativeAudioContext, options) => {\n    const nativeMediaStreamAudioDestinationNode = nativeAudioContext.createMediaStreamDestination();\n    assignNativeAudioNodeOptions(nativeMediaStreamAudioDestinationNode, options);\n    // Bug #174: Safari does expose a wrong numberOfOutputs.\n    if (nativeMediaStreamAudioDestinationNode.numberOfOutputs === 1) {\n        Object.defineProperty(nativeMediaStreamAudioDestinationNode, 'numberOfOutputs', { get: () => 0 });\n    }\n    return nativeMediaStreamAudioDestinationNode;\n};\n//# sourceMappingURL=native-media-stream-audio-destination-node.js.map","export const createNativeMediaStreamAudioSourceNode = (nativeAudioContext, { mediaStream }) => {\n    const audioStreamTracks = mediaStream.getAudioTracks();\n    /*\n     * Bug #151: Safari does not use the audio track as input anymore if it gets removed from the mediaStream after construction.\n     * Bug #159: Safari picks the first audio track if the MediaStream has more than one audio track.\n     */\n    audioStreamTracks.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n    const filteredAudioStreamTracks = audioStreamTracks.slice(0, 1);\n    const nativeMediaStreamAudioSourceNode = nativeAudioContext.createMediaStreamSource(new MediaStream(filteredAudioStreamTracks));\n    /*\n     * Bug #151 & #159: The given mediaStream gets reconstructed before it gets passed to the native node which is why the accessor needs\n     * to be overwritten as it would otherwise expose the reconstructed version.\n     */\n    Object.defineProperty(nativeMediaStreamAudioSourceNode, 'mediaStream', { value: mediaStream });\n    return nativeMediaStreamAudioSourceNode;\n};\n//# sourceMappingURL=native-media-stream-audio-source-node.js.map","export const createNativeMediaStreamTrackAudioSourceNodeFactory = (createInvalidStateError, isNativeOfflineAudioContext) => {\n    return (nativeAudioContext, { mediaStreamTrack }) => {\n        // Bug #121: Only Firefox does yet support the MediaStreamTrackAudioSourceNode.\n        if (typeof nativeAudioContext.createMediaStreamTrackSource === 'function') {\n            return nativeAudioContext.createMediaStreamTrackSource(mediaStreamTrack);\n        }\n        const mediaStream = new MediaStream([mediaStreamTrack]);\n        const nativeMediaStreamAudioSourceNode = nativeAudioContext.createMediaStreamSource(mediaStream);\n        // Bug #120: Firefox does not throw an error if the mediaStream has no audio track.\n        if (mediaStreamTrack.kind !== 'audio') {\n            throw createInvalidStateError();\n        }\n        // Bug #172: Safari allows to create a MediaStreamAudioSourceNode with an OfflineAudioContext.\n        if (isNativeOfflineAudioContext(nativeAudioContext)) {\n            throw new TypeError();\n        }\n        return nativeMediaStreamAudioSourceNode;\n    };\n};\n//# sourceMappingURL=native-media-stream-track-audio-source-node-factory.js.map","export const createNativeOfflineAudioContextConstructor = (window) => {\n    if (window === null) {\n        return null;\n    }\n    if (window.hasOwnProperty('OfflineAudioContext')) {\n        return window.OfflineAudioContext;\n    }\n    return window.hasOwnProperty('webkitOfflineAudioContext') ? window.webkitOfflineAudioContext : null;\n};\n//# sourceMappingURL=native-offline-audio-context-constructor.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapAudioScheduledSourceNodeStartMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters';\nimport { wrapAudioScheduledSourceNodeStopMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters';\nexport const createNativeOscillatorNodeFactory = (addSilentConnection, cacheTestResult, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls) => {\n    return (nativeContext, options) => {\n        const nativeOscillatorNode = nativeContext.createOscillator();\n        assignNativeAudioNodeOptions(nativeOscillatorNode, options);\n        assignNativeAudioNodeAudioParamValue(nativeOscillatorNode, options, 'detune');\n        assignNativeAudioNodeAudioParamValue(nativeOscillatorNode, options, 'frequency');\n        if (options.periodicWave !== undefined) {\n            nativeOscillatorNode.setPeriodicWave(options.periodicWave);\n        }\n        else {\n            assignNativeAudioNodeOption(nativeOscillatorNode, options, 'type');\n        }\n        // Bug #44: Only Chrome, Edge & Opera throw a RangeError yet.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStartMethodNegativeParametersSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStartMethodNegativeParameters(nativeOscillatorNode);\n        }\n        // Bug #19: Safari does not ignore calls to stop() of an already stopped AudioBufferSourceNode.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, () => testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls(nativeOscillatorNode, nativeContext);\n        }\n        // Bug #44: Only Firefox does not throw a RangeError yet.\n        if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStopMethodNegativeParametersSupport(nativeContext))) {\n            wrapAudioScheduledSourceNodeStopMethodNegativeParameters(nativeOscillatorNode);\n        }\n        // Bug #175: Safari will not fire an ended event if the OscillatorNode is unconnected.\n        addSilentConnection(nativeContext, nativeOscillatorNode);\n        return nativeOscillatorNode;\n    };\n};\n//# sourceMappingURL=native-oscillator-node-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativePannerNodeFactory = (createNativePannerNodeFaker) => {\n    return (nativeContext, options) => {\n        const nativePannerNode = nativeContext.createPanner();\n        // Bug #124: Safari does not support modifying the orientation and the position with AudioParams.\n        if (nativePannerNode.orientationX === undefined) {\n            return createNativePannerNodeFaker(nativeContext, options);\n        }\n        assignNativeAudioNodeOptions(nativePannerNode, options);\n        assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'orientationX');\n        assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'orientationY');\n        assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'orientationZ');\n        assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'positionX');\n        assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'positionY');\n        assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'positionZ');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'coneInnerAngle');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'coneOuterAngle');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'coneOuterGain');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'distanceModel');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'maxDistance');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'panningModel');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'refDistance');\n        assignNativeAudioNodeOption(nativePannerNode, options, 'rolloffFactor');\n        return nativePannerNode;\n    };\n};\n//# sourceMappingURL=native-panner-node-factory.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativePannerNodeFakerFactory = (connectNativeAudioNodeToNativeAudioNode, createInvalidStateError, createNativeChannelMergerNode, createNativeGainNode, createNativeScriptProcessorNode, createNativeWaveShaperNode, createNotSupportedError, disconnectNativeAudioNodeFromNativeAudioNode, getFirstSample, monitorConnections) => {\n    return (nativeContext, { coneInnerAngle, coneOuterAngle, coneOuterGain, distanceModel, maxDistance, orientationX, orientationY, orientationZ, panningModel, positionX, positionY, positionZ, refDistance, rolloffFactor, ...audioNodeOptions }) => {\n        const pannerNode = nativeContext.createPanner();\n        // Bug #125: Safari does not throw an error yet.\n        if (audioNodeOptions.channelCount > 2) {\n            throw createNotSupportedError();\n        }\n        // Bug #126: Safari does not throw an error yet.\n        if (audioNodeOptions.channelCountMode === 'max') {\n            throw createNotSupportedError();\n        }\n        assignNativeAudioNodeOptions(pannerNode, audioNodeOptions);\n        const SINGLE_CHANNEL_OPTIONS = {\n            channelCount: 1,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete'\n        };\n        const channelMergerNode = createNativeChannelMergerNode(nativeContext, {\n            ...SINGLE_CHANNEL_OPTIONS,\n            channelInterpretation: 'speakers',\n            numberOfInputs: 6\n        });\n        const inputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: 1 });\n        const orientationXGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 1 });\n        const orientationYGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        const orientationZGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        const positionXGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        const positionYGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        const positionZGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, 256, 6, 1);\n        const waveShaperNode = createNativeWaveShaperNode(nativeContext, {\n            ...SINGLE_CHANNEL_OPTIONS,\n            curve: new Float32Array([1, 1]),\n            oversample: 'none'\n        });\n        let lastOrientation = [orientationX, orientationY, orientationZ];\n        let lastPosition = [positionX, positionY, positionZ];\n        const buffer = new Float32Array(1);\n        // tslint:disable-next-line:deprecation\n        scriptProcessorNode.onaudioprocess = ({ inputBuffer }) => {\n            const orientation = [\n                getFirstSample(inputBuffer, buffer, 0),\n                getFirstSample(inputBuffer, buffer, 1),\n                getFirstSample(inputBuffer, buffer, 2)\n            ];\n            if (orientation.some((value, index) => value !== lastOrientation[index])) {\n                pannerNode.setOrientation(...orientation); // tslint:disable-line:deprecation\n                lastOrientation = orientation;\n            }\n            const positon = [\n                getFirstSample(inputBuffer, buffer, 3),\n                getFirstSample(inputBuffer, buffer, 4),\n                getFirstSample(inputBuffer, buffer, 5)\n            ];\n            if (positon.some((value, index) => value !== lastPosition[index])) {\n                pannerNode.setPosition(...positon); // tslint:disable-line:deprecation\n                lastPosition = positon;\n            }\n        };\n        Object.defineProperty(orientationYGainNode.gain, 'defaultValue', { get: () => 0 });\n        Object.defineProperty(orientationZGainNode.gain, 'defaultValue', { get: () => 0 });\n        Object.defineProperty(positionXGainNode.gain, 'defaultValue', { get: () => 0 });\n        Object.defineProperty(positionYGainNode.gain, 'defaultValue', { get: () => 0 });\n        Object.defineProperty(positionZGainNode.gain, 'defaultValue', { get: () => 0 });\n        const nativePannerNodeFaker = {\n            get bufferSize() {\n                return undefined;\n            },\n            get channelCount() {\n                return pannerNode.channelCount;\n            },\n            set channelCount(value) {\n                // Bug #125: Safari does not throw an error yet.\n                if (value > 2) {\n                    throw createNotSupportedError();\n                }\n                inputGainNode.channelCount = value;\n                pannerNode.channelCount = value;\n            },\n            get channelCountMode() {\n                return pannerNode.channelCountMode;\n            },\n            set channelCountMode(value) {\n                // Bug #126: Safari does not throw an error yet.\n                if (value === 'max') {\n                    throw createNotSupportedError();\n                }\n                inputGainNode.channelCountMode = value;\n                pannerNode.channelCountMode = value;\n            },\n            get channelInterpretation() {\n                return pannerNode.channelInterpretation;\n            },\n            set channelInterpretation(value) {\n                inputGainNode.channelInterpretation = value;\n                pannerNode.channelInterpretation = value;\n            },\n            get coneInnerAngle() {\n                return pannerNode.coneInnerAngle;\n            },\n            set coneInnerAngle(value) {\n                pannerNode.coneInnerAngle = value;\n            },\n            get coneOuterAngle() {\n                return pannerNode.coneOuterAngle;\n            },\n            set coneOuterAngle(value) {\n                pannerNode.coneOuterAngle = value;\n            },\n            get coneOuterGain() {\n                return pannerNode.coneOuterGain;\n            },\n            set coneOuterGain(value) {\n                // Bug #127: Safari does not throw an InvalidStateError yet.\n                if (value < 0 || value > 1) {\n                    throw createInvalidStateError();\n                }\n                pannerNode.coneOuterGain = value;\n            },\n            get context() {\n                return pannerNode.context;\n            },\n            get distanceModel() {\n                return pannerNode.distanceModel;\n            },\n            set distanceModel(value) {\n                pannerNode.distanceModel = value;\n            },\n            get inputs() {\n                return [inputGainNode];\n            },\n            get maxDistance() {\n                return pannerNode.maxDistance;\n            },\n            set maxDistance(value) {\n                // Bug #128: Safari does not throw an error yet.\n                if (value < 0) {\n                    throw new RangeError();\n                }\n                pannerNode.maxDistance = value;\n            },\n            get numberOfInputs() {\n                return pannerNode.numberOfInputs;\n            },\n            get numberOfOutputs() {\n                return pannerNode.numberOfOutputs;\n            },\n            get orientationX() {\n                return orientationXGainNode.gain;\n            },\n            get orientationY() {\n                return orientationYGainNode.gain;\n            },\n            get orientationZ() {\n                return orientationZGainNode.gain;\n            },\n            get panningModel() {\n                return pannerNode.panningModel;\n            },\n            set panningModel(value) {\n                pannerNode.panningModel = value;\n            },\n            get positionX() {\n                return positionXGainNode.gain;\n            },\n            get positionY() {\n                return positionYGainNode.gain;\n            },\n            get positionZ() {\n                return positionZGainNode.gain;\n            },\n            get refDistance() {\n                return pannerNode.refDistance;\n            },\n            set refDistance(value) {\n                // Bug #129: Safari does not throw an error yet.\n                if (value < 0) {\n                    throw new RangeError();\n                }\n                pannerNode.refDistance = value;\n            },\n            get rolloffFactor() {\n                return pannerNode.rolloffFactor;\n            },\n            set rolloffFactor(value) {\n                // Bug #130: Safari does not throw an error yet.\n                if (value < 0) {\n                    throw new RangeError();\n                }\n                pannerNode.rolloffFactor = value;\n            },\n            addEventListener(...args) {\n                return inputGainNode.addEventListener(args[0], args[1], args[2]);\n            },\n            dispatchEvent(...args) {\n                return inputGainNode.dispatchEvent(args[0]);\n            },\n            removeEventListener(...args) {\n                return inputGainNode.removeEventListener(args[0], args[1], args[2]);\n            }\n        };\n        if (coneInnerAngle !== nativePannerNodeFaker.coneInnerAngle) {\n            nativePannerNodeFaker.coneInnerAngle = coneInnerAngle;\n        }\n        if (coneOuterAngle !== nativePannerNodeFaker.coneOuterAngle) {\n            nativePannerNodeFaker.coneOuterAngle = coneOuterAngle;\n        }\n        if (coneOuterGain !== nativePannerNodeFaker.coneOuterGain) {\n            nativePannerNodeFaker.coneOuterGain = coneOuterGain;\n        }\n        if (distanceModel !== nativePannerNodeFaker.distanceModel) {\n            nativePannerNodeFaker.distanceModel = distanceModel;\n        }\n        if (maxDistance !== nativePannerNodeFaker.maxDistance) {\n            nativePannerNodeFaker.maxDistance = maxDistance;\n        }\n        if (orientationX !== nativePannerNodeFaker.orientationX.value) {\n            nativePannerNodeFaker.orientationX.value = orientationX;\n        }\n        if (orientationY !== nativePannerNodeFaker.orientationY.value) {\n            nativePannerNodeFaker.orientationY.value = orientationY;\n        }\n        if (orientationZ !== nativePannerNodeFaker.orientationZ.value) {\n            nativePannerNodeFaker.orientationZ.value = orientationZ;\n        }\n        if (panningModel !== nativePannerNodeFaker.panningModel) {\n            nativePannerNodeFaker.panningModel = panningModel;\n        }\n        if (positionX !== nativePannerNodeFaker.positionX.value) {\n            nativePannerNodeFaker.positionX.value = positionX;\n        }\n        if (positionY !== nativePannerNodeFaker.positionY.value) {\n            nativePannerNodeFaker.positionY.value = positionY;\n        }\n        if (positionZ !== nativePannerNodeFaker.positionZ.value) {\n            nativePannerNodeFaker.positionZ.value = positionZ;\n        }\n        if (refDistance !== nativePannerNodeFaker.refDistance) {\n            nativePannerNodeFaker.refDistance = refDistance;\n        }\n        if (rolloffFactor !== nativePannerNodeFaker.rolloffFactor) {\n            nativePannerNodeFaker.rolloffFactor = rolloffFactor;\n        }\n        if (lastOrientation[0] !== 1 || lastOrientation[1] !== 0 || lastOrientation[2] !== 0) {\n            pannerNode.setOrientation(...lastOrientation); // tslint:disable-line:deprecation\n        }\n        if (lastPosition[0] !== 0 || lastPosition[1] !== 0 || lastPosition[2] !== 0) {\n            pannerNode.setPosition(...lastPosition); // tslint:disable-line:deprecation\n        }\n        const whenConnected = () => {\n            inputGainNode.connect(pannerNode);\n            // Bug #119: Safari does not fully support the WaveShaperNode.\n            connectNativeAudioNodeToNativeAudioNode(inputGainNode, waveShaperNode, 0, 0);\n            waveShaperNode.connect(orientationXGainNode).connect(channelMergerNode, 0, 0);\n            waveShaperNode.connect(orientationYGainNode).connect(channelMergerNode, 0, 1);\n            waveShaperNode.connect(orientationZGainNode).connect(channelMergerNode, 0, 2);\n            waveShaperNode.connect(positionXGainNode).connect(channelMergerNode, 0, 3);\n            waveShaperNode.connect(positionYGainNode).connect(channelMergerNode, 0, 4);\n            waveShaperNode.connect(positionZGainNode).connect(channelMergerNode, 0, 5);\n            channelMergerNode.connect(scriptProcessorNode).connect(nativeContext.destination);\n        };\n        const whenDisconnected = () => {\n            inputGainNode.disconnect(pannerNode);\n            // Bug #119: Safari does not fully support the WaveShaperNode.\n            disconnectNativeAudioNodeFromNativeAudioNode(inputGainNode, waveShaperNode, 0, 0);\n            waveShaperNode.disconnect(orientationXGainNode);\n            orientationXGainNode.disconnect(channelMergerNode);\n            waveShaperNode.disconnect(orientationYGainNode);\n            orientationYGainNode.disconnect(channelMergerNode);\n            waveShaperNode.disconnect(orientationZGainNode);\n            orientationZGainNode.disconnect(channelMergerNode);\n            waveShaperNode.disconnect(positionXGainNode);\n            positionXGainNode.disconnect(channelMergerNode);\n            waveShaperNode.disconnect(positionYGainNode);\n            positionYGainNode.disconnect(channelMergerNode);\n            waveShaperNode.disconnect(positionZGainNode);\n            positionZGainNode.disconnect(channelMergerNode);\n            channelMergerNode.disconnect(scriptProcessorNode);\n            scriptProcessorNode.disconnect(nativeContext.destination);\n        };\n        return monitorConnections(interceptConnections(nativePannerNodeFaker, pannerNode), whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=native-panner-node-faker-factory.js.map","export const createNativePeriodicWaveFactory = (createIndexSizeError) => {\n    return (nativeContext, { disableNormalization, imag, real }) => {\n        // Bug #180: Safari does not allow to use ordinary arrays.\n        const convertedImag = imag instanceof Float32Array ? imag : new Float32Array(imag);\n        const convertedReal = real instanceof Float32Array ? real : new Float32Array(real);\n        const nativePeriodicWave = nativeContext.createPeriodicWave(convertedReal, convertedImag, { disableNormalization });\n        // Bug #181: Safari does not throw an IndexSizeError so far if the given arrays have less than two values.\n        if (Array.from(imag).length < 2) {\n            throw createIndexSizeError();\n        }\n        return nativePeriodicWave;\n    };\n};\n//# sourceMappingURL=native-periodic-wave-factory.js.map","export const createNativeScriptProcessorNode = (nativeContext, bufferSize, numberOfInputChannels, numberOfOutputChannels) => {\n    return nativeContext.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels); // tslint:disable-line deprecation\n};\n//# sourceMappingURL=native-script-processor-node.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeStereoPannerNodeFactory = (createNativeStereoPannerNodeFaker, createNotSupportedError) => {\n    return (nativeContext, options) => {\n        const channelCountMode = options.channelCountMode;\n        /*\n         * Bug #105: The channelCountMode of 'clamped-max' should be supported. However it is not possible to write a polyfill for Safari\n         * which supports it and therefore it can't be supported at all.\n         */\n        if (channelCountMode === 'clamped-max') {\n            throw createNotSupportedError();\n        }\n        // Bug #105: Safari does not support the StereoPannerNode.\n        if (nativeContext.createStereoPanner === undefined) {\n            return createNativeStereoPannerNodeFaker(nativeContext, options);\n        }\n        const nativeStereoPannerNode = nativeContext.createStereoPanner();\n        assignNativeAudioNodeOptions(nativeStereoPannerNode, options);\n        assignNativeAudioNodeAudioParamValue(nativeStereoPannerNode, options, 'pan');\n        /*\n         * Bug #105: The channelCountMode of 'clamped-max' should be supported. However it is not possible to write a polyfill for Safari\n         * which supports it and therefore it can't be supported at all.\n         */\n        Object.defineProperty(nativeStereoPannerNode, 'channelCountMode', {\n            get: () => channelCountMode,\n            set: (value) => {\n                if (value !== channelCountMode) {\n                    throw createNotSupportedError();\n                }\n            }\n        });\n        return nativeStereoPannerNode;\n    };\n};\n//# sourceMappingURL=native-stereo-panner-node-factory.js.map","import { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativeStereoPannerNodeFakerFactory = (createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeGainNode, createNativeWaveShaperNode, createNotSupportedError, monitorConnections) => {\n    // The curve has a size of 14bit plus 1 value to have an exact representation for zero. This value has been determined experimentally.\n    const CURVE_SIZE = 16385;\n    const DC_CURVE = new Float32Array([1, 1]);\n    const HALF_PI = Math.PI / 2;\n    const SINGLE_CHANNEL_OPTIONS = { channelCount: 1, channelCountMode: 'explicit', channelInterpretation: 'discrete' };\n    const SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS = { ...SINGLE_CHANNEL_OPTIONS, oversample: 'none' };\n    const buildInternalGraphForMono = (nativeContext, inputGainNode, panGainNode, channelMergerNode) => {\n        const leftWaveShaperCurve = new Float32Array(CURVE_SIZE);\n        const rightWaveShaperCurve = new Float32Array(CURVE_SIZE);\n        for (let i = 0; i < CURVE_SIZE; i += 1) {\n            const x = (i / (CURVE_SIZE - 1)) * HALF_PI;\n            leftWaveShaperCurve[i] = Math.cos(x);\n            rightWaveShaperCurve[i] = Math.sin(x);\n        }\n        const leftGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const leftWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: leftWaveShaperCurve }));\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const panWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: DC_CURVE }));\n        const rightGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const rightWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: rightWaveShaperCurve }));\n        return {\n            connectGraph() {\n                inputGainNode.connect(leftGainNode);\n                inputGainNode.connect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n                inputGainNode.connect(rightGainNode);\n                panWaveShaperNode.connect(panGainNode);\n                panGainNode.connect(leftWaveShaperNode.inputs === undefined ? leftWaveShaperNode : leftWaveShaperNode.inputs[0]);\n                panGainNode.connect(rightWaveShaperNode.inputs === undefined ? rightWaveShaperNode : rightWaveShaperNode.inputs[0]);\n                leftWaveShaperNode.connect(leftGainNode.gain);\n                rightWaveShaperNode.connect(rightGainNode.gain);\n                leftGainNode.connect(channelMergerNode, 0, 0);\n                rightGainNode.connect(channelMergerNode, 0, 1);\n            },\n            disconnectGraph() {\n                inputGainNode.disconnect(leftGainNode);\n                inputGainNode.disconnect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n                inputGainNode.disconnect(rightGainNode);\n                panWaveShaperNode.disconnect(panGainNode);\n                panGainNode.disconnect(leftWaveShaperNode.inputs === undefined ? leftWaveShaperNode : leftWaveShaperNode.inputs[0]);\n                panGainNode.disconnect(rightWaveShaperNode.inputs === undefined ? rightWaveShaperNode : rightWaveShaperNode.inputs[0]);\n                leftWaveShaperNode.disconnect(leftGainNode.gain);\n                rightWaveShaperNode.disconnect(rightGainNode.gain);\n                leftGainNode.disconnect(channelMergerNode, 0, 0);\n                rightGainNode.disconnect(channelMergerNode, 0, 1);\n            }\n        };\n    };\n    const buildInternalGraphForStereo = (nativeContext, inputGainNode, panGainNode, channelMergerNode) => {\n        const leftInputForLeftOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n        const leftInputForRightOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n        const rightInputForLeftOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n        const rightInputForRightOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n        const centerIndex = Math.floor(CURVE_SIZE / 2);\n        for (let i = 0; i < CURVE_SIZE; i += 1) {\n            if (i > centerIndex) {\n                const x = ((i - centerIndex) / (CURVE_SIZE - 1 - centerIndex)) * HALF_PI;\n                leftInputForLeftOutputWaveShaperCurve[i] = Math.cos(x);\n                leftInputForRightOutputWaveShaperCurve[i] = Math.sin(x);\n                rightInputForLeftOutputWaveShaperCurve[i] = 0;\n                rightInputForRightOutputWaveShaperCurve[i] = 1;\n            }\n            else {\n                const x = (i / (CURVE_SIZE - 1 - centerIndex)) * HALF_PI;\n                leftInputForLeftOutputWaveShaperCurve[i] = 1;\n                leftInputForRightOutputWaveShaperCurve[i] = 0;\n                rightInputForLeftOutputWaveShaperCurve[i] = Math.cos(x);\n                rightInputForRightOutputWaveShaperCurve[i] = Math.sin(x);\n            }\n        }\n        const channelSplitterNode = createNativeChannelSplitterNode(nativeContext, {\n            channelCount: 2,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete',\n            numberOfOutputs: 2\n        });\n        const leftInputForLeftOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const leftInputForLeftOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n            ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n            curve: leftInputForLeftOutputWaveShaperCurve\n        });\n        const leftInputForRightOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const leftInputForRightOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n            ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n            curve: leftInputForRightOutputWaveShaperCurve\n        });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const panWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: DC_CURVE }));\n        const rightInputForLeftOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const rightInputForLeftOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n            ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n            curve: rightInputForLeftOutputWaveShaperCurve\n        });\n        const rightInputForRightOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n        // Bug #119: Safari does not fully support the WaveShaperNode.\n        const rightInputForRightOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n            ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n            curve: rightInputForRightOutputWaveShaperCurve\n        });\n        return {\n            connectGraph() {\n                inputGainNode.connect(channelSplitterNode);\n                inputGainNode.connect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n                channelSplitterNode.connect(leftInputForLeftOutputGainNode, 0);\n                channelSplitterNode.connect(leftInputForRightOutputGainNode, 0);\n                channelSplitterNode.connect(rightInputForLeftOutputGainNode, 1);\n                channelSplitterNode.connect(rightInputForRightOutputGainNode, 1);\n                panWaveShaperNode.connect(panGainNode);\n                panGainNode.connect(leftInputForLeftOutputWaveShaperNode.inputs === undefined\n                    ? leftInputForLeftOutputWaveShaperNode\n                    : leftInputForLeftOutputWaveShaperNode.inputs[0]);\n                panGainNode.connect(leftInputForRightOutputWaveShaperNode.inputs === undefined\n                    ? leftInputForRightOutputWaveShaperNode\n                    : leftInputForRightOutputWaveShaperNode.inputs[0]);\n                panGainNode.connect(rightInputForLeftOutputWaveShaperNode.inputs === undefined\n                    ? rightInputForLeftOutputWaveShaperNode\n                    : rightInputForLeftOutputWaveShaperNode.inputs[0]);\n                panGainNode.connect(rightInputForRightOutputWaveShaperNode.inputs === undefined\n                    ? rightInputForRightOutputWaveShaperNode\n                    : rightInputForRightOutputWaveShaperNode.inputs[0]);\n                leftInputForLeftOutputWaveShaperNode.connect(leftInputForLeftOutputGainNode.gain);\n                leftInputForRightOutputWaveShaperNode.connect(leftInputForRightOutputGainNode.gain);\n                rightInputForLeftOutputWaveShaperNode.connect(rightInputForLeftOutputGainNode.gain);\n                rightInputForRightOutputWaveShaperNode.connect(rightInputForRightOutputGainNode.gain);\n                leftInputForLeftOutputGainNode.connect(channelMergerNode, 0, 0);\n                rightInputForLeftOutputGainNode.connect(channelMergerNode, 0, 0);\n                leftInputForRightOutputGainNode.connect(channelMergerNode, 0, 1);\n                rightInputForRightOutputGainNode.connect(channelMergerNode, 0, 1);\n            },\n            disconnectGraph() {\n                inputGainNode.disconnect(channelSplitterNode);\n                inputGainNode.disconnect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n                channelSplitterNode.disconnect(leftInputForLeftOutputGainNode, 0);\n                channelSplitterNode.disconnect(leftInputForRightOutputGainNode, 0);\n                channelSplitterNode.disconnect(rightInputForLeftOutputGainNode, 1);\n                channelSplitterNode.disconnect(rightInputForRightOutputGainNode, 1);\n                panWaveShaperNode.disconnect(panGainNode);\n                panGainNode.disconnect(leftInputForLeftOutputWaveShaperNode.inputs === undefined\n                    ? leftInputForLeftOutputWaveShaperNode\n                    : leftInputForLeftOutputWaveShaperNode.inputs[0]);\n                panGainNode.disconnect(leftInputForRightOutputWaveShaperNode.inputs === undefined\n                    ? leftInputForRightOutputWaveShaperNode\n                    : leftInputForRightOutputWaveShaperNode.inputs[0]);\n                panGainNode.disconnect(rightInputForLeftOutputWaveShaperNode.inputs === undefined\n                    ? rightInputForLeftOutputWaveShaperNode\n                    : rightInputForLeftOutputWaveShaperNode.inputs[0]);\n                panGainNode.disconnect(rightInputForRightOutputWaveShaperNode.inputs === undefined\n                    ? rightInputForRightOutputWaveShaperNode\n                    : rightInputForRightOutputWaveShaperNode.inputs[0]);\n                leftInputForLeftOutputWaveShaperNode.disconnect(leftInputForLeftOutputGainNode.gain);\n                leftInputForRightOutputWaveShaperNode.disconnect(leftInputForRightOutputGainNode.gain);\n                rightInputForLeftOutputWaveShaperNode.disconnect(rightInputForLeftOutputGainNode.gain);\n                rightInputForRightOutputWaveShaperNode.disconnect(rightInputForRightOutputGainNode.gain);\n                leftInputForLeftOutputGainNode.disconnect(channelMergerNode, 0, 0);\n                rightInputForLeftOutputGainNode.disconnect(channelMergerNode, 0, 0);\n                leftInputForRightOutputGainNode.disconnect(channelMergerNode, 0, 1);\n                rightInputForRightOutputGainNode.disconnect(channelMergerNode, 0, 1);\n            }\n        };\n    };\n    const buildInternalGraph = (nativeContext, channelCount, inputGainNode, panGainNode, channelMergerNode) => {\n        if (channelCount === 1) {\n            return buildInternalGraphForMono(nativeContext, inputGainNode, panGainNode, channelMergerNode);\n        }\n        if (channelCount === 2) {\n            return buildInternalGraphForStereo(nativeContext, inputGainNode, panGainNode, channelMergerNode);\n        }\n        throw createNotSupportedError();\n    };\n    return (nativeContext, { channelCount, channelCountMode, pan, ...audioNodeOptions }) => {\n        if (channelCountMode === 'max') {\n            throw createNotSupportedError();\n        }\n        const channelMergerNode = createNativeChannelMergerNode(nativeContext, {\n            ...audioNodeOptions,\n            channelCount: 1,\n            channelCountMode,\n            numberOfInputs: 2\n        });\n        const inputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, channelCount, channelCountMode, gain: 1 });\n        const panGainNode = createNativeGainNode(nativeContext, {\n            channelCount: 1,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete',\n            gain: pan\n        });\n        let { connectGraph, disconnectGraph } = buildInternalGraph(nativeContext, channelCount, inputGainNode, panGainNode, channelMergerNode);\n        Object.defineProperty(panGainNode.gain, 'defaultValue', { get: () => 0 });\n        Object.defineProperty(panGainNode.gain, 'maxValue', { get: () => 1 });\n        Object.defineProperty(panGainNode.gain, 'minValue', { get: () => -1 });\n        const nativeStereoPannerNodeFakerFactory = {\n            get bufferSize() {\n                return undefined;\n            },\n            get channelCount() {\n                return inputGainNode.channelCount;\n            },\n            set channelCount(value) {\n                if (inputGainNode.channelCount !== value) {\n                    if (isConnected) {\n                        disconnectGraph();\n                    }\n                    ({ connectGraph, disconnectGraph } = buildInternalGraph(nativeContext, value, inputGainNode, panGainNode, channelMergerNode));\n                    if (isConnected) {\n                        connectGraph();\n                    }\n                }\n                inputGainNode.channelCount = value;\n            },\n            get channelCountMode() {\n                return inputGainNode.channelCountMode;\n            },\n            set channelCountMode(value) {\n                if (value === 'clamped-max' || value === 'max') {\n                    throw createNotSupportedError();\n                }\n                inputGainNode.channelCountMode = value;\n            },\n            get channelInterpretation() {\n                return inputGainNode.channelInterpretation;\n            },\n            set channelInterpretation(value) {\n                inputGainNode.channelInterpretation = value;\n            },\n            get context() {\n                return inputGainNode.context;\n            },\n            get inputs() {\n                return [inputGainNode];\n            },\n            get numberOfInputs() {\n                return inputGainNode.numberOfInputs;\n            },\n            get numberOfOutputs() {\n                return inputGainNode.numberOfOutputs;\n            },\n            get pan() {\n                return panGainNode.gain;\n            },\n            addEventListener(...args) {\n                return inputGainNode.addEventListener(args[0], args[1], args[2]);\n            },\n            dispatchEvent(...args) {\n                return inputGainNode.dispatchEvent(args[0]);\n            },\n            removeEventListener(...args) {\n                return inputGainNode.removeEventListener(args[0], args[1], args[2]);\n            }\n        };\n        let isConnected = false;\n        const whenConnected = () => {\n            connectGraph();\n            isConnected = true;\n        };\n        const whenDisconnected = () => {\n            disconnectGraph();\n            isConnected = false;\n        };\n        return monitorConnections(interceptConnections(nativeStereoPannerNodeFakerFactory, channelMergerNode), whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=native-stereo-panner-node-faker-factory.js.map","import { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeWaveShaperNodeFactory = (createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeWaveShaperNodeFaker, isDCCurve, monitorConnections, nativeAudioContextConstructor, overwriteAccessors) => {\n    return (nativeContext, options) => {\n        const nativeWaveShaperNode = nativeContext.createWaveShaper();\n        /*\n         * Bug #119: Safari does not correctly map the values.\n         * @todo Unfortunately there is no way to test for this behavior in a synchronous fashion which is why testing for the existence of\n         * the webkitAudioContext is used as a workaround here. Testing for the automationRate property is necessary because this workaround\n         * isn't necessary anymore since v14.0.2 of Safari.\n         */\n        if (nativeAudioContextConstructor !== null &&\n            nativeAudioContextConstructor.name === 'webkitAudioContext' &&\n            nativeContext.createGain().gain.automationRate === undefined) {\n            return createNativeWaveShaperNodeFaker(nativeContext, options);\n        }\n        assignNativeAudioNodeOptions(nativeWaveShaperNode, options);\n        const curve = options.curve === null || options.curve instanceof Float32Array ? options.curve : new Float32Array(options.curve);\n        // Bug #104: Chrome, Edge and Opera will throw an InvalidAccessError when the curve has less than two samples.\n        if (curve !== null && curve.length < 2) {\n            throw createInvalidStateError();\n        }\n        // Only values of type Float32Array can be assigned to the curve property.\n        assignNativeAudioNodeOption(nativeWaveShaperNode, { curve }, 'curve');\n        assignNativeAudioNodeOption(nativeWaveShaperNode, options, 'oversample');\n        let disconnectNativeAudioBufferSourceNode = null;\n        let isConnected = false;\n        overwriteAccessors(nativeWaveShaperNode, 'curve', (get) => () => get.call(nativeWaveShaperNode), (set) => (value) => {\n            set.call(nativeWaveShaperNode, value);\n            if (isConnected) {\n                if (isDCCurve(value) && disconnectNativeAudioBufferSourceNode === null) {\n                    disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, nativeWaveShaperNode);\n                }\n                else if (!isDCCurve(value) && disconnectNativeAudioBufferSourceNode !== null) {\n                    disconnectNativeAudioBufferSourceNode();\n                    disconnectNativeAudioBufferSourceNode = null;\n                }\n            }\n            return value;\n        });\n        const whenConnected = () => {\n            isConnected = true;\n            if (isDCCurve(nativeWaveShaperNode.curve)) {\n                disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, nativeWaveShaperNode);\n            }\n        };\n        const whenDisconnected = () => {\n            isConnected = false;\n            if (disconnectNativeAudioBufferSourceNode !== null) {\n                disconnectNativeAudioBufferSourceNode();\n                disconnectNativeAudioBufferSourceNode = null;\n            }\n        };\n        return monitorConnections(nativeWaveShaperNode, whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=native-wave-shaper-node-factory.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativeWaveShaperNodeFakerFactory = (createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeGainNode, isDCCurve, monitorConnections) => {\n    return (nativeContext, { curve, oversample, ...audioNodeOptions }) => {\n        const negativeWaveShaperNode = nativeContext.createWaveShaper();\n        const positiveWaveShaperNode = nativeContext.createWaveShaper();\n        assignNativeAudioNodeOptions(negativeWaveShaperNode, audioNodeOptions);\n        assignNativeAudioNodeOptions(positiveWaveShaperNode, audioNodeOptions);\n        const inputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: 1 });\n        const invertGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: -1 });\n        const outputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: 1 });\n        const revertGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: -1 });\n        let disconnectNativeAudioBufferSourceNode = null;\n        let isConnected = false;\n        let unmodifiedCurve = null;\n        const nativeWaveShaperNodeFaker = {\n            get bufferSize() {\n                return undefined;\n            },\n            get channelCount() {\n                return negativeWaveShaperNode.channelCount;\n            },\n            set channelCount(value) {\n                inputGainNode.channelCount = value;\n                invertGainNode.channelCount = value;\n                negativeWaveShaperNode.channelCount = value;\n                outputGainNode.channelCount = value;\n                positiveWaveShaperNode.channelCount = value;\n                revertGainNode.channelCount = value;\n            },\n            get channelCountMode() {\n                return negativeWaveShaperNode.channelCountMode;\n            },\n            set channelCountMode(value) {\n                inputGainNode.channelCountMode = value;\n                invertGainNode.channelCountMode = value;\n                negativeWaveShaperNode.channelCountMode = value;\n                outputGainNode.channelCountMode = value;\n                positiveWaveShaperNode.channelCountMode = value;\n                revertGainNode.channelCountMode = value;\n            },\n            get channelInterpretation() {\n                return negativeWaveShaperNode.channelInterpretation;\n            },\n            set channelInterpretation(value) {\n                inputGainNode.channelInterpretation = value;\n                invertGainNode.channelInterpretation = value;\n                negativeWaveShaperNode.channelInterpretation = value;\n                outputGainNode.channelInterpretation = value;\n                positiveWaveShaperNode.channelInterpretation = value;\n                revertGainNode.channelInterpretation = value;\n            },\n            get context() {\n                return negativeWaveShaperNode.context;\n            },\n            get curve() {\n                return unmodifiedCurve;\n            },\n            set curve(value) {\n                // Bug #102: Safari does not throw an InvalidStateError when the curve has less than two samples.\n                if (value !== null && value.length < 2) {\n                    throw createInvalidStateError();\n                }\n                if (value === null) {\n                    negativeWaveShaperNode.curve = value;\n                    positiveWaveShaperNode.curve = value;\n                }\n                else {\n                    const curveLength = value.length;\n                    const negativeCurve = new Float32Array(curveLength + 2 - (curveLength % 2));\n                    const positiveCurve = new Float32Array(curveLength + 2 - (curveLength % 2));\n                    negativeCurve[0] = value[0];\n                    positiveCurve[0] = -value[curveLength - 1];\n                    const length = Math.ceil((curveLength + 1) / 2);\n                    const centerIndex = (curveLength + 1) / 2 - 1;\n                    for (let i = 1; i < length; i += 1) {\n                        const theoreticIndex = (i / length) * centerIndex;\n                        const lowerIndex = Math.floor(theoreticIndex);\n                        const upperIndex = Math.ceil(theoreticIndex);\n                        negativeCurve[i] =\n                            lowerIndex === upperIndex\n                                ? value[lowerIndex]\n                                : (1 - (theoreticIndex - lowerIndex)) * value[lowerIndex] +\n                                    (1 - (upperIndex - theoreticIndex)) * value[upperIndex];\n                        positiveCurve[i] =\n                            lowerIndex === upperIndex\n                                ? -value[curveLength - 1 - lowerIndex]\n                                : -((1 - (theoreticIndex - lowerIndex)) * value[curveLength - 1 - lowerIndex]) -\n                                    (1 - (upperIndex - theoreticIndex)) * value[curveLength - 1 - upperIndex];\n                    }\n                    negativeCurve[length] = curveLength % 2 === 1 ? value[length - 1] : (value[length - 2] + value[length - 1]) / 2;\n                    negativeWaveShaperNode.curve = negativeCurve;\n                    positiveWaveShaperNode.curve = positiveCurve;\n                }\n                unmodifiedCurve = value;\n                if (isConnected) {\n                    if (isDCCurve(unmodifiedCurve) && disconnectNativeAudioBufferSourceNode === null) {\n                        disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, inputGainNode);\n                    }\n                    else if (disconnectNativeAudioBufferSourceNode !== null) {\n                        disconnectNativeAudioBufferSourceNode();\n                        disconnectNativeAudioBufferSourceNode = null;\n                    }\n                }\n            },\n            get inputs() {\n                return [inputGainNode];\n            },\n            get numberOfInputs() {\n                return negativeWaveShaperNode.numberOfInputs;\n            },\n            get numberOfOutputs() {\n                return negativeWaveShaperNode.numberOfOutputs;\n            },\n            get oversample() {\n                return negativeWaveShaperNode.oversample;\n            },\n            set oversample(value) {\n                negativeWaveShaperNode.oversample = value;\n                positiveWaveShaperNode.oversample = value;\n            },\n            addEventListener(...args) {\n                return inputGainNode.addEventListener(args[0], args[1], args[2]);\n            },\n            dispatchEvent(...args) {\n                return inputGainNode.dispatchEvent(args[0]);\n            },\n            removeEventListener(...args) {\n                return inputGainNode.removeEventListener(args[0], args[1], args[2]);\n            }\n        };\n        if (curve !== null) {\n            // Only values of type Float32Array can be assigned to the curve property.\n            nativeWaveShaperNodeFaker.curve = curve instanceof Float32Array ? curve : new Float32Array(curve);\n        }\n        if (oversample !== nativeWaveShaperNodeFaker.oversample) {\n            nativeWaveShaperNodeFaker.oversample = oversample;\n        }\n        const whenConnected = () => {\n            inputGainNode.connect(negativeWaveShaperNode).connect(outputGainNode);\n            inputGainNode.connect(invertGainNode).connect(positiveWaveShaperNode).connect(revertGainNode).connect(outputGainNode);\n            isConnected = true;\n            if (isDCCurve(unmodifiedCurve)) {\n                disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, inputGainNode);\n            }\n        };\n        const whenDisconnected = () => {\n            inputGainNode.disconnect(negativeWaveShaperNode);\n            negativeWaveShaperNode.disconnect(outputGainNode);\n            inputGainNode.disconnect(invertGainNode);\n            invertGainNode.disconnect(positiveWaveShaperNode);\n            positiveWaveShaperNode.disconnect(revertGainNode);\n            revertGainNode.disconnect(outputGainNode);\n            isConnected = false;\n            if (disconnectNativeAudioBufferSourceNode !== null) {\n                disconnectNativeAudioBufferSourceNode();\n                disconnectNativeAudioBufferSourceNode = null;\n            }\n        };\n        return monitorConnections(interceptConnections(nativeWaveShaperNodeFaker, outputGainNode), whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=native-wave-shaper-node-faker-factory.js.map","export const createNotSupportedError = () => new DOMException('', 'NotSupportedError');\n//# sourceMappingURL=not-supported-error.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { testPromiseSupport } from '../helpers/test-promise-support';\nconst DEFAULT_OPTIONS = {\n    numberOfChannels: 1\n};\nexport const createOfflineAudioContextConstructor = (baseAudioContextConstructor, cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, startRendering) => {\n    return class OfflineAudioContext extends baseAudioContextConstructor {\n        constructor(a, b, c) {\n            let options;\n            if (typeof a === 'number' && b !== undefined && c !== undefined) {\n                options = { length: b, numberOfChannels: a, sampleRate: c };\n            }\n            else if (typeof a === 'object') {\n                options = a;\n            }\n            else {\n                throw new Error('The given parameters are not valid.');\n            }\n            const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options };\n            const nativeOfflineAudioContext = createNativeOfflineAudioContext(numberOfChannels, length, sampleRate);\n            // #21 Safari does not support promises and therefore would fire the statechange event before the promise can be resolved.\n            if (!cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeOfflineAudioContext))) {\n                nativeOfflineAudioContext.addEventListener('statechange', (() => {\n                    let i = 0;\n                    const delayStateChangeEvent = (event) => {\n                        if (this._state === 'running') {\n                            if (i > 0) {\n                                nativeOfflineAudioContext.removeEventListener('statechange', delayStateChangeEvent);\n                                event.stopImmediatePropagation();\n                                this._waitForThePromiseToSettle(event);\n                            }\n                            else {\n                                i += 1;\n                            }\n                        }\n                    };\n                    return delayStateChangeEvent;\n                })());\n            }\n            super(nativeOfflineAudioContext, numberOfChannels);\n            this._length = length;\n            this._nativeOfflineAudioContext = nativeOfflineAudioContext;\n            this._state = null;\n        }\n        get length() {\n            // Bug #17: Safari does not yet expose the length.\n            if (this._nativeOfflineAudioContext.length === undefined) {\n                return this._length;\n            }\n            return this._nativeOfflineAudioContext.length;\n        }\n        get state() {\n            return this._state === null ? this._nativeOfflineAudioContext.state : this._state;\n        }\n        startRendering() {\n            /*\n             * Bug #9 & #59: It is theoretically possible that startRendering() will first render a partialOfflineAudioContext. Therefore\n             * the state of the nativeOfflineAudioContext might no transition to running immediately.\n             */\n            if (this._state === 'running') {\n                return Promise.reject(createInvalidStateError());\n            }\n            this._state = 'running';\n            return startRendering(this.destination, this._nativeOfflineAudioContext).finally(() => {\n                this._state = null;\n                deactivateAudioGraph(this);\n            });\n        }\n        _waitForThePromiseToSettle(event) {\n            if (this._state === null) {\n                this._nativeOfflineAudioContext.dispatchEvent(event);\n            }\n            else {\n                setTimeout(() => this._waitForThePromiseToSettle(event));\n            }\n        }\n    };\n};\n//# sourceMappingURL=offline-audio-context-constructor.js.map","import { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassive } from '../helpers/set-internal-state-to-passive';\nconst DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    detune: 0,\n    frequency: 440,\n    periodicWave: undefined,\n    type: 'sine'\n};\nexport const createOscillatorNodeConstructor = (audioNodeConstructor, createAudioParam, createNativeOscillatorNode, createOscillatorNodeRenderer, getNativeContext, isNativeOfflineAudioContext, wrapEventListener) => {\n    return class OscillatorNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeOscillatorNode = createNativeOscillatorNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const oscillatorNodeRenderer = (isOffline ? createOscillatorNodeRenderer() : null);\n            const nyquist = context.sampleRate / 2;\n            super(context, false, nativeOscillatorNode, oscillatorNodeRenderer);\n            // Bug #81: Firefox & Safari do not export the correct values for maxValue and minValue.\n            this._detune = createAudioParam(this, isOffline, nativeOscillatorNode.detune, 153600, -153600);\n            // Bug #76: Safari does not export the correct values for maxValue and minValue.\n            this._frequency = createAudioParam(this, isOffline, nativeOscillatorNode.frequency, nyquist, -nyquist);\n            this._nativeOscillatorNode = nativeOscillatorNode;\n            this._onended = null;\n            this._oscillatorNodeRenderer = oscillatorNodeRenderer;\n            if (this._oscillatorNodeRenderer !== null && mergedOptions.periodicWave !== undefined) {\n                this._oscillatorNodeRenderer.periodicWave =\n                    mergedOptions.periodicWave;\n            }\n        }\n        get detune() {\n            return this._detune;\n        }\n        get frequency() {\n            return this._frequency;\n        }\n        get onended() {\n            return this._onended;\n        }\n        set onended(value) {\n            const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n            this._nativeOscillatorNode.onended = wrappedListener;\n            const nativeOnEnded = this._nativeOscillatorNode.onended;\n            this._onended = nativeOnEnded !== null && nativeOnEnded === wrappedListener ? value : nativeOnEnded;\n        }\n        get type() {\n            return this._nativeOscillatorNode.type;\n        }\n        set type(value) {\n            this._nativeOscillatorNode.type = value;\n            if (this._oscillatorNodeRenderer !== null) {\n                this._oscillatorNodeRenderer.periodicWave = null;\n            }\n        }\n        setPeriodicWave(periodicWave) {\n            this._nativeOscillatorNode.setPeriodicWave(periodicWave);\n            if (this._oscillatorNodeRenderer !== null) {\n                this._oscillatorNodeRenderer.periodicWave = periodicWave;\n            }\n        }\n        start(when = 0) {\n            this._nativeOscillatorNode.start(when);\n            if (this._oscillatorNodeRenderer !== null) {\n                this._oscillatorNodeRenderer.start = when;\n            }\n            if (this.context.state !== 'closed') {\n                setInternalStateToActive(this);\n                const resetInternalStateToPassive = () => {\n                    this._nativeOscillatorNode.removeEventListener('ended', resetInternalStateToPassive);\n                    if (isActiveAudioNode(this)) {\n                        setInternalStateToPassive(this);\n                    }\n                };\n                this._nativeOscillatorNode.addEventListener('ended', resetInternalStateToPassive);\n            }\n        }\n        stop(when = 0) {\n            this._nativeOscillatorNode.stop(when);\n            if (this._oscillatorNodeRenderer !== null) {\n                this._oscillatorNodeRenderer.stop = when;\n            }\n        }\n    };\n};\n//# sourceMappingURL=oscillator-node-constructor.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createOscillatorNodeRendererFactory = (connectAudioParam, createNativeOscillatorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeOscillatorNodes = new WeakMap();\n        let periodicWave = null;\n        let start = null;\n        let stop = null;\n        const createOscillatorNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeOscillatorNode = getNativeAudioNode(proxy);\n            // If the initially used nativeOscillatorNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeOscillatorNodeIsOwnedByContext = isOwnedByContext(nativeOscillatorNode, nativeOfflineAudioContext);\n            if (!nativeOscillatorNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeOscillatorNode.channelCount,\n                    channelCountMode: nativeOscillatorNode.channelCountMode,\n                    channelInterpretation: nativeOscillatorNode.channelInterpretation,\n                    detune: nativeOscillatorNode.detune.value,\n                    frequency: nativeOscillatorNode.frequency.value,\n                    periodicWave: periodicWave === null ? undefined : periodicWave,\n                    type: nativeOscillatorNode.type\n                };\n                nativeOscillatorNode = createNativeOscillatorNode(nativeOfflineAudioContext, options);\n                if (start !== null) {\n                    nativeOscillatorNode.start(start);\n                }\n                if (stop !== null) {\n                    nativeOscillatorNode.stop(stop);\n                }\n            }\n            renderedNativeOscillatorNodes.set(nativeOfflineAudioContext, nativeOscillatorNode);\n            if (!nativeOscillatorNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.detune, nativeOscillatorNode.detune);\n                await renderAutomation(nativeOfflineAudioContext, proxy.frequency, nativeOscillatorNode.frequency);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.detune, nativeOscillatorNode.detune);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.frequency, nativeOscillatorNode.frequency);\n            }\n            await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeOscillatorNode);\n            return nativeOscillatorNode;\n        };\n        return {\n            set periodicWave(value) {\n                periodicWave = value;\n            },\n            set start(value) {\n                start = value;\n            },\n            set stop(value) {\n                stop = value;\n            },\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeOscillatorNode = renderedNativeOscillatorNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeOscillatorNode !== undefined) {\n                    return Promise.resolve(renderedNativeOscillatorNode);\n                }\n                return createOscillatorNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=oscillator-node-renderer-factory.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nconst DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'clamped-max',\n    channelInterpretation: 'speakers',\n    coneInnerAngle: 360,\n    coneOuterAngle: 360,\n    coneOuterGain: 0,\n    distanceModel: 'inverse',\n    maxDistance: 10000,\n    orientationX: 1,\n    orientationY: 0,\n    orientationZ: 0,\n    panningModel: 'equalpower',\n    positionX: 0,\n    positionY: 0,\n    positionZ: 0,\n    refDistance: 1,\n    rolloffFactor: 1\n};\nexport const createPannerNodeConstructor = (audioNodeConstructor, createAudioParam, createNativePannerNode, createPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class PannerNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativePannerNode = createNativePannerNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const pannerNodeRenderer = (isOffline ? createPannerNodeRenderer() : null);\n            super(context, false, nativePannerNode, pannerNodeRenderer);\n            this._nativePannerNode = nativePannerNode;\n            // Bug #74: Safari does not export the correct values for maxValue and minValue.\n            this._orientationX = createAudioParam(this, isOffline, nativePannerNode.orientationX, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            this._orientationY = createAudioParam(this, isOffline, nativePannerNode.orientationY, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            this._orientationZ = createAudioParam(this, isOffline, nativePannerNode.orientationZ, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            this._positionX = createAudioParam(this, isOffline, nativePannerNode.positionX, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            this._positionY = createAudioParam(this, isOffline, nativePannerNode.positionY, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            this._positionZ = createAudioParam(this, isOffline, nativePannerNode.positionZ, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n            // @todo Determine a meaningful tail-time instead of just using one second.\n            setAudioNodeTailTime(this, 1);\n        }\n        get coneInnerAngle() {\n            return this._nativePannerNode.coneInnerAngle;\n        }\n        set coneInnerAngle(value) {\n            this._nativePannerNode.coneInnerAngle = value;\n        }\n        get coneOuterAngle() {\n            return this._nativePannerNode.coneOuterAngle;\n        }\n        set coneOuterAngle(value) {\n            this._nativePannerNode.coneOuterAngle = value;\n        }\n        get coneOuterGain() {\n            return this._nativePannerNode.coneOuterGain;\n        }\n        set coneOuterGain(value) {\n            this._nativePannerNode.coneOuterGain = value;\n        }\n        get distanceModel() {\n            return this._nativePannerNode.distanceModel;\n        }\n        set distanceModel(value) {\n            this._nativePannerNode.distanceModel = value;\n        }\n        get maxDistance() {\n            return this._nativePannerNode.maxDistance;\n        }\n        set maxDistance(value) {\n            this._nativePannerNode.maxDistance = value;\n        }\n        get orientationX() {\n            return this._orientationX;\n        }\n        get orientationY() {\n            return this._orientationY;\n        }\n        get orientationZ() {\n            return this._orientationZ;\n        }\n        get panningModel() {\n            return this._nativePannerNode.panningModel;\n        }\n        set panningModel(value) {\n            this._nativePannerNode.panningModel = value;\n        }\n        get positionX() {\n            return this._positionX;\n        }\n        get positionY() {\n            return this._positionY;\n        }\n        get positionZ() {\n            return this._positionZ;\n        }\n        get refDistance() {\n            return this._nativePannerNode.refDistance;\n        }\n        set refDistance(value) {\n            this._nativePannerNode.refDistance = value;\n        }\n        get rolloffFactor() {\n            return this._nativePannerNode.rolloffFactor;\n        }\n        set rolloffFactor(value) {\n            this._nativePannerNode.rolloffFactor = value;\n        }\n    };\n};\n//# sourceMappingURL=panner-node-constructor.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createPannerNodeRendererFactory = (connectAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeGainNode, createNativePannerNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext) => {\n    return () => {\n        const renderedNativeAudioNodes = new WeakMap();\n        let renderedBufferPromise = null;\n        const createAudioNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeGainNode = null;\n            let nativePannerNode = getNativeAudioNode(proxy);\n            const commonAudioNodeOptions = {\n                channelCount: nativePannerNode.channelCount,\n                channelCountMode: nativePannerNode.channelCountMode,\n                channelInterpretation: nativePannerNode.channelInterpretation\n            };\n            const commonNativePannerNodeOptions = {\n                ...commonAudioNodeOptions,\n                coneInnerAngle: nativePannerNode.coneInnerAngle,\n                coneOuterAngle: nativePannerNode.coneOuterAngle,\n                coneOuterGain: nativePannerNode.coneOuterGain,\n                distanceModel: nativePannerNode.distanceModel,\n                maxDistance: nativePannerNode.maxDistance,\n                panningModel: nativePannerNode.panningModel,\n                refDistance: nativePannerNode.refDistance,\n                rolloffFactor: nativePannerNode.rolloffFactor\n            };\n            // If the initially used nativePannerNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativePannerNodeIsOwnedByContext = isOwnedByContext(nativePannerNode, nativeOfflineAudioContext);\n            // Bug #124: Safari does not support modifying the orientation and the position with AudioParams.\n            if ('bufferSize' in nativePannerNode) {\n                nativeGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 1 });\n            }\n            else if (!nativePannerNodeIsOwnedByContext) {\n                const options = {\n                    ...commonNativePannerNodeOptions,\n                    orientationX: nativePannerNode.orientationX.value,\n                    orientationY: nativePannerNode.orientationY.value,\n                    orientationZ: nativePannerNode.orientationZ.value,\n                    positionX: nativePannerNode.positionX.value,\n                    positionY: nativePannerNode.positionY.value,\n                    positionZ: nativePannerNode.positionZ.value\n                };\n                nativePannerNode = createNativePannerNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeGainNode === null ? nativePannerNode : nativeGainNode);\n            if (nativeGainNode !== null) {\n                if (renderedBufferPromise === null) {\n                    if (nativeOfflineAudioContextConstructor === null) {\n                        throw new Error('Missing the native OfflineAudioContext constructor.');\n                    }\n                    const partialOfflineAudioContext = new nativeOfflineAudioContextConstructor(6, \n                    // Bug #17: Safari does not yet expose the length.\n                    proxy.context.length, nativeOfflineAudioContext.sampleRate);\n                    const nativeChannelMergerNode = createNativeChannelMergerNode(partialOfflineAudioContext, {\n                        channelCount: 1,\n                        channelCountMode: 'explicit',\n                        channelInterpretation: 'speakers',\n                        numberOfInputs: 6\n                    });\n                    nativeChannelMergerNode.connect(partialOfflineAudioContext.destination);\n                    renderedBufferPromise = (async () => {\n                        const nativeConstantSourceNodes = await Promise.all([\n                            proxy.orientationX,\n                            proxy.orientationY,\n                            proxy.orientationZ,\n                            proxy.positionX,\n                            proxy.positionY,\n                            proxy.positionZ\n                        ].map(async (audioParam, index) => {\n                            const nativeConstantSourceNode = createNativeConstantSourceNode(partialOfflineAudioContext, {\n                                channelCount: 1,\n                                channelCountMode: 'explicit',\n                                channelInterpretation: 'discrete',\n                                offset: index === 0 ? 1 : 0\n                            });\n                            await renderAutomation(partialOfflineAudioContext, audioParam, nativeConstantSourceNode.offset);\n                            return nativeConstantSourceNode;\n                        }));\n                        for (let i = 0; i < 6; i += 1) {\n                            nativeConstantSourceNodes[i].connect(nativeChannelMergerNode, 0, i);\n                            nativeConstantSourceNodes[i].start(0);\n                        }\n                        return renderNativeOfflineAudioContext(partialOfflineAudioContext);\n                    })();\n                }\n                const renderedBuffer = await renderedBufferPromise;\n                const inputGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 1 });\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, inputGainNode);\n                const channelDatas = [];\n                for (let i = 0; i < renderedBuffer.numberOfChannels; i += 1) {\n                    channelDatas.push(renderedBuffer.getChannelData(i));\n                }\n                let lastOrientation = [channelDatas[0][0], channelDatas[1][0], channelDatas[2][0]];\n                let lastPosition = [channelDatas[3][0], channelDatas[4][0], channelDatas[5][0]];\n                let gateGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 1 });\n                let partialPannerNode = createNativePannerNode(nativeOfflineAudioContext, {\n                    ...commonNativePannerNodeOptions,\n                    orientationX: lastOrientation[0],\n                    orientationY: lastOrientation[1],\n                    orientationZ: lastOrientation[2],\n                    positionX: lastPosition[0],\n                    positionY: lastPosition[1],\n                    positionZ: lastPosition[2]\n                });\n                inputGainNode.connect(gateGainNode).connect(partialPannerNode.inputs[0]);\n                partialPannerNode.connect(nativeGainNode);\n                for (let i = 128; i < renderedBuffer.length; i += 128) {\n                    const orientation = [channelDatas[0][i], channelDatas[1][i], channelDatas[2][i]];\n                    const positon = [channelDatas[3][i], channelDatas[4][i], channelDatas[5][i]];\n                    if (orientation.some((value, index) => value !== lastOrientation[index]) ||\n                        positon.some((value, index) => value !== lastPosition[index])) {\n                        lastOrientation = orientation;\n                        lastPosition = positon;\n                        const currentTime = i / nativeOfflineAudioContext.sampleRate;\n                        gateGainNode.gain.setValueAtTime(0, currentTime);\n                        gateGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 0 });\n                        partialPannerNode = createNativePannerNode(nativeOfflineAudioContext, {\n                            ...commonNativePannerNodeOptions,\n                            orientationX: lastOrientation[0],\n                            orientationY: lastOrientation[1],\n                            orientationZ: lastOrientation[2],\n                            positionX: lastPosition[0],\n                            positionY: lastPosition[1],\n                            positionZ: lastPosition[2]\n                        });\n                        gateGainNode.gain.setValueAtTime(1, currentTime);\n                        inputGainNode.connect(gateGainNode).connect(partialPannerNode.inputs[0]);\n                        partialPannerNode.connect(nativeGainNode);\n                    }\n                }\n                return nativeGainNode;\n            }\n            if (!nativePannerNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.orientationX, nativePannerNode.orientationX);\n                await renderAutomation(nativeOfflineAudioContext, proxy.orientationY, nativePannerNode.orientationY);\n                await renderAutomation(nativeOfflineAudioContext, proxy.orientationZ, nativePannerNode.orientationZ);\n                await renderAutomation(nativeOfflineAudioContext, proxy.positionX, nativePannerNode.positionX);\n                await renderAutomation(nativeOfflineAudioContext, proxy.positionY, nativePannerNode.positionY);\n                await renderAutomation(nativeOfflineAudioContext, proxy.positionZ, nativePannerNode.positionZ);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.orientationX, nativePannerNode.orientationX);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.orientationY, nativePannerNode.orientationY);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.orientationZ, nativePannerNode.orientationZ);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.positionX, nativePannerNode.positionX);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.positionY, nativePannerNode.positionY);\n                await connectAudioParam(nativeOfflineAudioContext, proxy.positionZ, nativePannerNode.positionZ);\n            }\n            if (isNativeAudioNodeFaker(nativePannerNode)) {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativePannerNode.inputs[0]);\n            }\n            else {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativePannerNode);\n            }\n            return nativePannerNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeGainNodeOrNativePannerNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeGainNodeOrNativePannerNode !== undefined) {\n                    return Promise.resolve(renderedNativeGainNodeOrNativePannerNode);\n                }\n                return createAudioNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=panner-node-renderer-factory.js.map","const DEFAULT_OPTIONS = {\n    disableNormalization: false\n};\nexport const createPeriodicWaveConstructor = (createNativePeriodicWave, getNativeContext, periodicWaveStore, sanitizePeriodicWaveOptions) => {\n    return class PeriodicWave {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = sanitizePeriodicWaveOptions({ ...DEFAULT_OPTIONS, ...options });\n            const periodicWave = createNativePeriodicWave(nativeContext, mergedOptions);\n            periodicWaveStore.add(periodicWave);\n            // This does violate all good pratices but it is used here to simplify the handling of periodic waves.\n            return periodicWave;\n        }\n        static [Symbol.hasInstance](instance) {\n            return ((instance !== null && typeof instance === 'object' && Object.getPrototypeOf(instance) === PeriodicWave.prototype) ||\n                periodicWaveStore.has(instance));\n        }\n    };\n};\n//# sourceMappingURL=periodic-wave-constructor.js.map","export const createRenderAutomation = (getAudioParamRenderer, renderInputsOfAudioParam) => {\n    return (nativeOfflineAudioContext, audioParam, nativeAudioParam) => {\n        const audioParamRenderer = getAudioParamRenderer(audioParam);\n        audioParamRenderer.replay(nativeAudioParam);\n        return renderInputsOfAudioParam(audioParam, nativeOfflineAudioContext, nativeAudioParam);\n    };\n};\n//# sourceMappingURL=render-automation.js.map","export const createRenderInputsOfAudioNode = (getAudioNodeConnections, getAudioNodeRenderer, isPartOfACycle) => {\n    return async (audioNode, nativeOfflineAudioContext, nativeAudioNode) => {\n        const audioNodeConnections = getAudioNodeConnections(audioNode);\n        await Promise.all(audioNodeConnections.activeInputs\n            .map((connections, input) => Array.from(connections).map(async ([source, output]) => {\n            const audioNodeRenderer = getAudioNodeRenderer(source);\n            const renderedNativeAudioNode = await audioNodeRenderer.render(source, nativeOfflineAudioContext);\n            const destination = audioNode.context.destination;\n            if (!isPartOfACycle(source) && (audioNode !== destination || !isPartOfACycle(audioNode))) {\n                renderedNativeAudioNode.connect(nativeAudioNode, output, input);\n            }\n        }))\n            .reduce((allRenderingPromises, renderingPromises) => [...allRenderingPromises, ...renderingPromises], []));\n    };\n};\n//# sourceMappingURL=render-inputs-of-audio-node.js.map","export const createRenderInputsOfAudioParam = (getAudioNodeRenderer, getAudioParamConnections, isPartOfACycle) => {\n    return async (audioParam, nativeOfflineAudioContext, nativeAudioParam) => {\n        const audioParamConnections = getAudioParamConnections(audioParam);\n        await Promise.all(Array.from(audioParamConnections.activeInputs).map(async ([source, output]) => {\n            const audioNodeRenderer = getAudioNodeRenderer(source);\n            const renderedNativeAudioNode = await audioNodeRenderer.render(source, nativeOfflineAudioContext);\n            if (!isPartOfACycle(source)) {\n                renderedNativeAudioNode.connect(nativeAudioParam, output);\n            }\n        }));\n    };\n};\n//# sourceMappingURL=render-inputs-of-audio-param.js.map","import { testPromiseSupport } from '../helpers/test-promise-support';\nexport const createRenderNativeOfflineAudioContext = (cacheTestResult, createNativeGainNode, createNativeScriptProcessorNode, testOfflineAudioContextCurrentTimeSupport) => {\n    return (nativeOfflineAudioContext) => {\n        // Bug #21: Safari does not support promises yet.\n        if (cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeOfflineAudioContext))) {\n            // Bug #158: Chrome and Edge do not advance currentTime if it is not accessed while rendering the audio.\n            return Promise.resolve(cacheTestResult(testOfflineAudioContextCurrentTimeSupport, testOfflineAudioContextCurrentTimeSupport)).then((isOfflineAudioContextCurrentTimeSupported) => {\n                if (!isOfflineAudioContextCurrentTimeSupported) {\n                    const scriptProcessorNode = createNativeScriptProcessorNode(nativeOfflineAudioContext, 512, 0, 1);\n                    nativeOfflineAudioContext.oncomplete = () => {\n                        scriptProcessorNode.onaudioprocess = null; // tslint:disable-line:deprecation\n                        scriptProcessorNode.disconnect();\n                    };\n                    scriptProcessorNode.onaudioprocess = () => nativeOfflineAudioContext.currentTime; // tslint:disable-line:deprecation\n                    scriptProcessorNode.connect(nativeOfflineAudioContext.destination);\n                }\n                return nativeOfflineAudioContext.startRendering();\n            });\n        }\n        return new Promise((resolve) => {\n            // Bug #48: Safari does not render an OfflineAudioContext without any connected node.\n            const gainNode = createNativeGainNode(nativeOfflineAudioContext, {\n                channelCount: 1,\n                channelCountMode: 'explicit',\n                channelInterpretation: 'discrete',\n                gain: 0\n            });\n            nativeOfflineAudioContext.oncomplete = (event) => {\n                gainNode.disconnect();\n                resolve(event.renderedBuffer);\n            };\n            gainNode.connect(nativeOfflineAudioContext.destination);\n            nativeOfflineAudioContext.startRendering();\n        });\n    };\n};\n//# sourceMappingURL=render-native-offline-audio-context.js.map","export const createSetActiveAudioWorkletNodeInputs = (activeAudioWorkletNodeInputsStore) => {\n    return (nativeAudioWorkletNode, activeInputs) => {\n        activeAudioWorkletNodeInputsStore.set(nativeAudioWorkletNode, activeInputs);\n    };\n};\n//# sourceMappingURL=set-active-audio-worklet-node-inputs.js.map","export const createSetAudioNodeTailTime = (audioNodeTailTimeStore) => {\n    return (audioNode, tailTime) => audioNodeTailTimeStore.set(audioNode, tailTime);\n};\n//# sourceMappingURL=set-audio-node-tail-time.js.map","import { wrapAudioBufferGetChannelDataMethod } from '../helpers/wrap-audio-buffer-get-channel-data-method';\nexport const createStartRendering = (audioBufferStore, cacheTestResult, getAudioNodeRenderer, getUnrenderedAudioWorkletNodes, renderNativeOfflineAudioContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds) => {\n    return (destination, nativeOfflineAudioContext) => getAudioNodeRenderer(destination)\n        .render(destination, nativeOfflineAudioContext)\n        /*\n         * Bug #86 & #87: Invoking the renderer of an AudioWorkletNode might be necessary if it has no direct or indirect connection to the\n         * destination.\n         */\n        .then(() => Promise.all(Array.from(getUnrenderedAudioWorkletNodes(nativeOfflineAudioContext)).map((audioWorkletNode) => getAudioNodeRenderer(audioWorkletNode).render(audioWorkletNode, nativeOfflineAudioContext))))\n        .then(() => renderNativeOfflineAudioContext(nativeOfflineAudioContext))\n        .then((audioBuffer) => {\n        // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n        // Bug #100: Safari does throw a wrong error when calling getChannelData() with an out-of-bounds value.\n        if (typeof audioBuffer.copyFromChannel !== 'function') {\n            wrapAudioBufferCopyChannelMethods(audioBuffer);\n            wrapAudioBufferGetChannelDataMethod(audioBuffer);\n            // Bug #157: Firefox does not allow the bufferOffset to be out-of-bounds.\n        }\n        else if (!cacheTestResult(testAudioBufferCopyChannelMethodsOutOfBoundsSupport, () => testAudioBufferCopyChannelMethodsOutOfBoundsSupport(audioBuffer))) {\n            wrapAudioBufferCopyChannelMethodsOutOfBounds(audioBuffer);\n        }\n        audioBufferStore.add(audioBuffer);\n        return audioBuffer;\n    });\n};\n//# sourceMappingURL=start-rendering.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 2,\n    /*\n     * Bug #105: The channelCountMode should be 'clamped-max' according to the spec but is set to 'explicit' to achieve consistent\n     * behavior.\n     */\n    channelCountMode: 'explicit',\n    channelInterpretation: 'speakers',\n    pan: 0\n};\nexport const createStereoPannerNodeConstructor = (audioNodeConstructor, createAudioParam, createNativeStereoPannerNode, createStereoPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext) => {\n    return class StereoPannerNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeStereoPannerNode = createNativeStereoPannerNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const stereoPannerNodeRenderer = (isOffline ? createStereoPannerNodeRenderer() : null);\n            super(context, false, nativeStereoPannerNode, stereoPannerNodeRenderer);\n            this._pan = createAudioParam(this, isOffline, nativeStereoPannerNode.pan);\n        }\n        get pan() {\n            return this._pan;\n        }\n    };\n};\n//# sourceMappingURL=stereo-panner-node-constructor.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createStereoPannerNodeRendererFactory = (connectAudioParam, createNativeStereoPannerNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeStereoPannerNodes = new WeakMap();\n        const createStereoPannerNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeStereoPannerNode = getNativeAudioNode(proxy);\n            /*\n             * If the initially used nativeStereoPannerNode was not constructed on the same OfflineAudioContext it needs to be created\n             * again.\n             */\n            const nativeStereoPannerNodeIsOwnedByContext = isOwnedByContext(nativeStereoPannerNode, nativeOfflineAudioContext);\n            if (!nativeStereoPannerNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeStereoPannerNode.channelCount,\n                    channelCountMode: nativeStereoPannerNode.channelCountMode,\n                    channelInterpretation: nativeStereoPannerNode.channelInterpretation,\n                    pan: nativeStereoPannerNode.pan.value\n                };\n                nativeStereoPannerNode = createNativeStereoPannerNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeStereoPannerNodes.set(nativeOfflineAudioContext, nativeStereoPannerNode);\n            if (!nativeStereoPannerNodeIsOwnedByContext) {\n                await renderAutomation(nativeOfflineAudioContext, proxy.pan, nativeStereoPannerNode.pan);\n            }\n            else {\n                await connectAudioParam(nativeOfflineAudioContext, proxy.pan, nativeStereoPannerNode.pan);\n            }\n            if (isNativeAudioNodeFaker(nativeStereoPannerNode)) {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeStereoPannerNode.inputs[0]);\n            }\n            else {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeStereoPannerNode);\n            }\n            return nativeStereoPannerNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeStereoPannerNode = renderedNativeStereoPannerNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeStereoPannerNode !== undefined) {\n                    return Promise.resolve(renderedNativeStereoPannerNode);\n                }\n                return createStereoPannerNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=stereo-panner-node-renderer-factory.js.map","// Bug #33: Safari exposes an AudioBuffer but it can't be used as a constructor.\nexport const createTestAudioBufferConstructorSupport = (nativeAudioBufferConstructor) => {\n    return () => {\n        if (nativeAudioBufferConstructor === null) {\n            return false;\n        }\n        try {\n            new nativeAudioBufferConstructor({ length: 1, sampleRate: 44100 }); // tslint:disable-line:no-unused-expression\n        }\n        catch {\n            return false;\n        }\n        return true;\n    };\n};\n//# sourceMappingURL=test-audio-buffer-constructor-support.js.map","// Bug #179: Firefox does not allow to transfer any buffer which has been passed to the process() method as an argument.\nexport const createTestAudioWorkletProcessorPostMessageSupport = (nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor) => {\n    return async () => {\n        // Bug #61: If there is no native AudioWorkletNode it gets faked and therefore it is no problem if the it doesn't exist.\n        if (nativeAudioWorkletNodeConstructor === null) {\n            return true;\n        }\n        if (nativeOfflineAudioContextConstructor === null) {\n            return false;\n        }\n        const blob = new Blob(['class A extends AudioWorkletProcessor{process(i){this.port.postMessage(i,[i[0][0].buffer])}}registerProcessor(\"a\",A)'], {\n            type: 'application/javascript; charset=utf-8'\n        });\n        // Bug #141: Safari does not support creating an OfflineAudioContext with less than 44100 Hz.\n        const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 128, 44100);\n        const url = URL.createObjectURL(blob);\n        let isEmittingMessageEvents = false;\n        let isEmittingProcessorErrorEvents = false;\n        try {\n            await offlineAudioContext.audioWorklet.addModule(url);\n            const audioWorkletNode = new nativeAudioWorkletNodeConstructor(offlineAudioContext, 'a', { numberOfOutputs: 0 });\n            const oscillator = offlineAudioContext.createOscillator();\n            audioWorkletNode.port.onmessage = () => (isEmittingMessageEvents = true);\n            audioWorkletNode.onprocessorerror = () => (isEmittingProcessorErrorEvents = true);\n            oscillator.connect(audioWorkletNode);\n            oscillator.start(0);\n            await offlineAudioContext.startRendering();\n        }\n        catch {\n            // Ignore errors.\n        }\n        finally {\n            URL.revokeObjectURL(url);\n        }\n        return isEmittingMessageEvents && !isEmittingProcessorErrorEvents;\n    };\n};\n//# sourceMappingURL=test-audio-worklet-processor-post-message-support.js.map","export const createTestOfflineAudioContextCurrentTimeSupport = (createNativeGainNode, nativeOfflineAudioContextConstructor) => {\n    return () => {\n        if (nativeOfflineAudioContextConstructor === null) {\n            return Promise.resolve(false);\n        }\n        const nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n        // Bug #48: Safari does not render an OfflineAudioContext without any connected node.\n        const gainNode = createNativeGainNode(nativeOfflineAudioContext, {\n            channelCount: 1,\n            channelCountMode: 'explicit',\n            channelInterpretation: 'discrete',\n            gain: 0\n        });\n        // Bug #21: Safari does not support promises yet.\n        return new Promise((resolve) => {\n            nativeOfflineAudioContext.oncomplete = () => {\n                gainNode.disconnect();\n                resolve(nativeOfflineAudioContext.currentTime !== 0);\n            };\n            nativeOfflineAudioContext.startRendering();\n        });\n    };\n};\n//# sourceMappingURL=test-offline-audio-context-current-time-support.js.map","export const createUnknownError = () => new DOMException('', 'UnknownError');\n//# sourceMappingURL=unknown-error.js.map","const DEFAULT_OPTIONS = {\n    channelCount: 2,\n    channelCountMode: 'max',\n    channelInterpretation: 'speakers',\n    curve: null,\n    oversample: 'none'\n};\nexport const createWaveShaperNodeConstructor = (audioNodeConstructor, createInvalidStateError, createNativeWaveShaperNode, createWaveShaperNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n    return class WaveShaperNode extends audioNodeConstructor {\n        constructor(context, options) {\n            const nativeContext = getNativeContext(context);\n            const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n            const nativeWaveShaperNode = createNativeWaveShaperNode(nativeContext, mergedOptions);\n            const isOffline = isNativeOfflineAudioContext(nativeContext);\n            const waveShaperNodeRenderer = (isOffline ? createWaveShaperNodeRenderer() : null);\n            // @todo Add a mechanism to only switch a WaveShaperNode to active while it is connected.\n            super(context, true, nativeWaveShaperNode, waveShaperNodeRenderer);\n            this._isCurveNullified = false;\n            this._nativeWaveShaperNode = nativeWaveShaperNode;\n            // @todo Determine a meaningful tail-time instead of just using one second.\n            setAudioNodeTailTime(this, 1);\n        }\n        get curve() {\n            if (this._isCurveNullified) {\n                return null;\n            }\n            return this._nativeWaveShaperNode.curve;\n        }\n        set curve(value) {\n            // Bug #103: Safari does not allow to set the curve to null.\n            if (value === null) {\n                this._isCurveNullified = true;\n                this._nativeWaveShaperNode.curve = new Float32Array([0, 0]);\n            }\n            else {\n                // Bug #102: Safari does not throw an InvalidStateError when the curve has less than two samples.\n                // Bug #104: Chrome, Edge and Opera will throw an InvalidAccessError when the curve has less than two samples.\n                if (value.length < 2) {\n                    throw createInvalidStateError();\n                }\n                this._isCurveNullified = false;\n                this._nativeWaveShaperNode.curve = value;\n            }\n        }\n        get oversample() {\n            return this._nativeWaveShaperNode.oversample;\n        }\n        set oversample(value) {\n            this._nativeWaveShaperNode.oversample = value;\n        }\n    };\n};\n//# sourceMappingURL=wave-shaper-node-constructor.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createWaveShaperNodeRendererFactory = (createNativeWaveShaperNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n    return () => {\n        const renderedNativeWaveShaperNodes = new WeakMap();\n        const createWaveShaperNode = async (proxy, nativeOfflineAudioContext) => {\n            let nativeWaveShaperNode = getNativeAudioNode(proxy);\n            // If the initially used nativeWaveShaperNode was not constructed on the same OfflineAudioContext it needs to be created again.\n            const nativeWaveShaperNodeIsOwnedByContext = isOwnedByContext(nativeWaveShaperNode, nativeOfflineAudioContext);\n            if (!nativeWaveShaperNodeIsOwnedByContext) {\n                const options = {\n                    channelCount: nativeWaveShaperNode.channelCount,\n                    channelCountMode: nativeWaveShaperNode.channelCountMode,\n                    channelInterpretation: nativeWaveShaperNode.channelInterpretation,\n                    curve: nativeWaveShaperNode.curve,\n                    oversample: nativeWaveShaperNode.oversample\n                };\n                nativeWaveShaperNode = createNativeWaveShaperNode(nativeOfflineAudioContext, options);\n            }\n            renderedNativeWaveShaperNodes.set(nativeOfflineAudioContext, nativeWaveShaperNode);\n            if (isNativeAudioNodeFaker(nativeWaveShaperNode)) {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeWaveShaperNode.inputs[0]);\n            }\n            else {\n                await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeWaveShaperNode);\n            }\n            return nativeWaveShaperNode;\n        };\n        return {\n            render(proxy, nativeOfflineAudioContext) {\n                const renderedNativeWaveShaperNode = renderedNativeWaveShaperNodes.get(nativeOfflineAudioContext);\n                if (renderedNativeWaveShaperNode !== undefined) {\n                    return Promise.resolve(renderedNativeWaveShaperNode);\n                }\n                return createWaveShaperNode(proxy, nativeOfflineAudioContext);\n            }\n        };\n    };\n};\n//# sourceMappingURL=wave-shaper-node-renderer-factory.js.map","export const createWindow = () => (typeof window === 'undefined' ? null : window);\n//# sourceMappingURL=window.js.map","export const createWrapAudioBufferCopyChannelMethods = (convertNumberToUnsignedLong, createIndexSizeError) => {\n    return (audioBuffer) => {\n        audioBuffer.copyFromChannel = (destination, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n            const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n            const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n            if (channelNumber >= audioBuffer.numberOfChannels) {\n                throw createIndexSizeError();\n            }\n            const audioBufferLength = audioBuffer.length;\n            const channelData = audioBuffer.getChannelData(channelNumber);\n            const destinationLength = destination.length;\n            for (let i = bufferOffset < 0 ? -bufferOffset : 0; i + bufferOffset < audioBufferLength && i < destinationLength; i += 1) {\n                destination[i] = channelData[i + bufferOffset];\n            }\n        };\n        audioBuffer.copyToChannel = (source, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n            const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n            const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n            if (channelNumber >= audioBuffer.numberOfChannels) {\n                throw createIndexSizeError();\n            }\n            const audioBufferLength = audioBuffer.length;\n            const channelData = audioBuffer.getChannelData(channelNumber);\n            const sourceLength = source.length;\n            for (let i = bufferOffset < 0 ? -bufferOffset : 0; i + bufferOffset < audioBufferLength && i < sourceLength; i += 1) {\n                channelData[i + bufferOffset] = source[i];\n            }\n        };\n    };\n};\n//# sourceMappingURL=wrap-audio-buffer-copy-channel-methods.js.map","export const createWrapAudioBufferCopyChannelMethodsOutOfBounds = (convertNumberToUnsignedLong) => {\n    return (audioBuffer) => {\n        audioBuffer.copyFromChannel = ((copyFromChannel) => {\n            return (destination, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n                const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n                const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n                if (bufferOffset < audioBuffer.length) {\n                    return copyFromChannel.call(audioBuffer, destination, channelNumber, bufferOffset);\n                }\n            };\n        })(audioBuffer.copyFromChannel);\n        audioBuffer.copyToChannel = ((copyToChannel) => {\n            return (source, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n                const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n                const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n                if (bufferOffset < audioBuffer.length) {\n                    return copyToChannel.call(audioBuffer, source, channelNumber, bufferOffset);\n                }\n            };\n        })(audioBuffer.copyToChannel);\n    };\n};\n//# sourceMappingURL=wrap-audio-buffer-copy-channel-methods-out-of-bounds.js.map","export const createWrapAudioBufferSourceNodeStopMethodNullifiedBuffer = (overwriteAccessors) => {\n    return (nativeAudioBufferSourceNode, nativeContext) => {\n        const nullifiedBuffer = nativeContext.createBuffer(1, 1, 44100);\n        if (nativeAudioBufferSourceNode.buffer === null) {\n            nativeAudioBufferSourceNode.buffer = nullifiedBuffer;\n        }\n        overwriteAccessors(nativeAudioBufferSourceNode, 'buffer', (get) => () => {\n            const value = get.call(nativeAudioBufferSourceNode);\n            return value === nullifiedBuffer ? null : value;\n        }, (set) => (value) => {\n            return set.call(nativeAudioBufferSourceNode, value === null ? nullifiedBuffer : value);\n        });\n    };\n};\n//# sourceMappingURL=wrap-audio-buffer-source-node-stop-method-nullified-buffer.js.map","export const createWrapChannelMergerNode = (createInvalidStateError, monitorConnections) => {\n    return (nativeContext, channelMergerNode) => {\n        // Bug #15: Safari does not return the default properties.\n        channelMergerNode.channelCount = 1;\n        channelMergerNode.channelCountMode = 'explicit';\n        // Bug #16: Safari does not throw an error when setting a different channelCount or channelCountMode.\n        Object.defineProperty(channelMergerNode, 'channelCount', {\n            get: () => 1,\n            set: () => {\n                throw createInvalidStateError();\n            }\n        });\n        Object.defineProperty(channelMergerNode, 'channelCountMode', {\n            get: () => 'explicit',\n            set: () => {\n                throw createInvalidStateError();\n            }\n        });\n        // Bug #20: Safari requires a connection of any kind to treat the input signal correctly.\n        const audioBufferSourceNode = nativeContext.createBufferSource();\n        const whenConnected = () => {\n            const length = channelMergerNode.numberOfInputs;\n            for (let i = 0; i < length; i += 1) {\n                audioBufferSourceNode.connect(channelMergerNode, 0, i);\n            }\n        };\n        const whenDisconnected = () => audioBufferSourceNode.disconnect(channelMergerNode);\n        monitorConnections(channelMergerNode, whenConnected, whenDisconnected);\n    };\n};\n//# sourceMappingURL=wrap-channel-merger-node.js.map","export const getFirstSample = (audioBuffer, buffer, channelNumber) => {\n    // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n    if (audioBuffer.copyFromChannel === undefined) {\n        return audioBuffer.getChannelData(channelNumber)[0];\n    }\n    audioBuffer.copyFromChannel(buffer, channelNumber);\n    return buffer[0];\n};\n//# sourceMappingURL=get-first-sample.js.map","export const isDCCurve = (curve) => {\n    if (curve === null) {\n        return false;\n    }\n    const length = curve.length;\n    if (length % 2 !== 0) {\n        return curve[Math.floor(length / 2)] !== 0;\n    }\n    return curve[length / 2 - 1] + curve[length / 2] !== 0;\n};\n//# sourceMappingURL=is-dc-curve.js.map","export const overwriteAccessors = (object, property, createGetter, createSetter) => {\n    let prototype = object;\n    while (!prototype.hasOwnProperty(property)) {\n        prototype = Object.getPrototypeOf(prototype);\n    }\n    const { get, set } = Object.getOwnPropertyDescriptor(prototype, property);\n    Object.defineProperty(object, property, { get: createGetter(get), set: createSetter(set) });\n};\n//# sourceMappingURL=overwrite-accessors.js.map","export const sanitizeAudioWorkletNodeOptions = (options) => {\n    return {\n        ...options,\n        outputChannelCount: options.outputChannelCount !== undefined\n            ? options.outputChannelCount\n            : options.numberOfInputs === 1 && options.numberOfOutputs === 1\n                ? /*\n                   * Bug #61: This should be the computedNumberOfChannels, but unfortunately that is almost impossible to fake. That's why\n                   * the channelCountMode is required to be 'explicit' as long as there is not a native implementation in every browser. That\n                   * makes sure the computedNumberOfChannels is equivilant to the channelCount which makes it much easier to compute.\n                   */\n                    [options.channelCount]\n                : Array.from({ length: options.numberOfOutputs }, () => 1)\n    };\n};\n//# sourceMappingURL=sanitize-audio-worklet-node-options.js.map","export const sanitizeChannelSplitterOptions = (options) => {\n    return { ...options, channelCount: options.numberOfOutputs };\n};\n//# sourceMappingURL=sanitize-channel-splitter-options.js.map","export const sanitizePeriodicWaveOptions = (options) => {\n    const { imag, real } = options;\n    if (imag === undefined) {\n        if (real === undefined) {\n            return { ...options, imag: [0, 0], real: [0, 0] };\n        }\n        return { ...options, imag: Array.from(real, () => 0), real };\n    }\n    if (real === undefined) {\n        return { ...options, imag, real: Array.from(imag, () => 0) };\n    }\n    return { ...options, imag, real };\n};\n//# sourceMappingURL=sanitize-periodic-wave-options.js.map","export const setValueAtTimeUntilPossible = (audioParam, value, startTime) => {\n    try {\n        audioParam.setValueAtTime(value, startTime);\n    }\n    catch (err) {\n        if (err.code !== 9) {\n            throw err;\n        }\n        setValueAtTimeUntilPossible(audioParam, value, startTime + 1e-7);\n    }\n};\n//# sourceMappingURL=set-value-at-time-until-possible.js.map","export const testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport = (nativeContext) => {\n    const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n    nativeAudioBufferSourceNode.start();\n    try {\n        nativeAudioBufferSourceNode.start();\n    }\n    catch {\n        return true;\n    }\n    return false;\n};\n//# sourceMappingURL=test-audio-buffer-source-node-start-method-consecutive-calls-support.js.map","export const testAudioBufferSourceNodeStartMethodOffsetClampingSupport = (nativeContext) => {\n    const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n    const nativeAudioBuffer = nativeContext.createBuffer(1, 1, 44100);\n    nativeAudioBufferSourceNode.buffer = nativeAudioBuffer;\n    try {\n        nativeAudioBufferSourceNode.start(0, 1);\n    }\n    catch {\n        return false;\n    }\n    return true;\n};\n//# sourceMappingURL=test-audio-buffer-source-node-start-method-offset-clamping-support.js.map","export const testAudioBufferSourceNodeStopMethodNullifiedBufferSupport = (nativeContext) => {\n    const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n    nativeAudioBufferSourceNode.start();\n    try {\n        nativeAudioBufferSourceNode.stop();\n    }\n    catch {\n        return false;\n    }\n    return true;\n};\n//# sourceMappingURL=test-audio-buffer-source-node-stop-method-nullified-buffer-support.js.map","export const testAudioScheduledSourceNodeStartMethodNegativeParametersSupport = (nativeContext) => {\n    const nativeAudioBufferSourceNode = nativeContext.createOscillator();\n    try {\n        nativeAudioBufferSourceNode.start(-1);\n    }\n    catch (err) {\n        return err instanceof RangeError;\n    }\n    return false;\n};\n//# sourceMappingURL=test-audio-scheduled-source-node-start-method-negative-parameters-support.js.map","export const testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport = (nativeContext) => {\n    const nativeAudioBuffer = nativeContext.createBuffer(1, 1, 44100);\n    const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n    nativeAudioBufferSourceNode.buffer = nativeAudioBuffer;\n    nativeAudioBufferSourceNode.start();\n    nativeAudioBufferSourceNode.stop();\n    try {\n        nativeAudioBufferSourceNode.stop();\n        return true;\n    }\n    catch {\n        return false;\n    }\n};\n//# sourceMappingURL=test-audio-scheduled-source-node-stop-method-consecutive-calls-support.js.map","export const testAudioScheduledSourceNodeStopMethodNegativeParametersSupport = (nativeContext) => {\n    const nativeAudioBufferSourceNode = nativeContext.createOscillator();\n    try {\n        nativeAudioBufferSourceNode.stop(-1);\n    }\n    catch (err) {\n        return err instanceof RangeError;\n    }\n    return false;\n};\n//# sourceMappingURL=test-audio-scheduled-source-node-stop-method-negative-parameters-support.js.map","export const testAudioWorkletNodeOptionsClonability = (audioWorkletNodeOptions) => {\n    const { port1, port2 } = new MessageChannel();\n    try {\n        // This will throw an error if the audioWorkletNodeOptions are not clonable.\n        port1.postMessage(audioWorkletNodeOptions);\n    }\n    finally {\n        port1.close();\n        port2.close();\n    }\n};\n//# sourceMappingURL=test-audio-worklet-node-options-clonability.js.map","export const wrapAudioBufferSourceNodeStartMethodOffsetClamping = (nativeAudioBufferSourceNode) => {\n    nativeAudioBufferSourceNode.start = ((start) => {\n        return (when = 0, offset = 0, duration) => {\n            const buffer = nativeAudioBufferSourceNode.buffer;\n            // Bug #154: Safari does not clamp the offset if it is equal to or greater than the duration of the buffer.\n            const clampedOffset = buffer === null ? offset : Math.min(buffer.duration, offset);\n            // Bug #155: Safari does not handle the offset correctly if it would cause the buffer to be not be played at all.\n            if (buffer !== null && clampedOffset > buffer.duration - 0.5 / nativeAudioBufferSourceNode.context.sampleRate) {\n                start.call(nativeAudioBufferSourceNode, when, 0, 0);\n            }\n            else {\n                start.call(nativeAudioBufferSourceNode, when, clampedOffset, duration);\n            }\n        };\n    })(nativeAudioBufferSourceNode.start);\n};\n//# sourceMappingURL=wrap-audio-buffer-source-node-start-method-offset-clamping.js.map","import { interceptConnections } from './intercept-connections';\nexport const wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls = (nativeAudioScheduledSourceNode, nativeContext) => {\n    const nativeGainNode = nativeContext.createGain();\n    nativeAudioScheduledSourceNode.connect(nativeGainNode);\n    const disconnectGainNode = ((disconnect) => {\n        return () => {\n            // @todo TypeScript cannot infer the overloaded signature with 1 argument yet.\n            disconnect.call(nativeAudioScheduledSourceNode, nativeGainNode);\n            nativeAudioScheduledSourceNode.removeEventListener('ended', disconnectGainNode);\n        };\n    })(nativeAudioScheduledSourceNode.disconnect);\n    nativeAudioScheduledSourceNode.addEventListener('ended', disconnectGainNode);\n    interceptConnections(nativeAudioScheduledSourceNode, nativeGainNode);\n    nativeAudioScheduledSourceNode.stop = ((stop) => {\n        let isStopped = false;\n        return (when = 0) => {\n            if (isStopped) {\n                try {\n                    stop.call(nativeAudioScheduledSourceNode, when);\n                }\n                catch {\n                    nativeGainNode.gain.setValueAtTime(0, when);\n                }\n            }\n            else {\n                stop.call(nativeAudioScheduledSourceNode, when);\n                isStopped = true;\n            }\n        };\n    })(nativeAudioScheduledSourceNode.stop);\n};\n//# sourceMappingURL=wrap-audio-scheduled-source-node-stop-method-consecutive-calls.js.map","export const wrapEventListener = (target, eventListener) => {\n    return (event) => {\n        const descriptor = { value: target };\n        Object.defineProperties(event, {\n            currentTarget: descriptor,\n            target: descriptor\n        });\n        if (typeof eventListener === 'function') {\n            return eventListener.call(target, event);\n        }\n        return eventListener.handleEvent.call(target, event);\n    };\n};\n//# sourceMappingURL=wrap-event-listener.js.map","import { createCancelAndHoldAutomationEvent, createCancelScheduledValuesAutomationEvent, createExponentialRampToValueAutomationEvent, createLinearRampToValueAutomationEvent, createSetTargetAutomationEvent, createSetValueAutomationEvent, createSetValueCurveAutomationEvent } from 'automation-events';\nimport { createAbortError } from './factories/abort-error';\nimport { createAddActiveInputConnectionToAudioNode } from './factories/add-active-input-connection-to-audio-node';\nimport { createAddAudioNodeConnections } from './factories/add-audio-node-connections';\nimport { createAddAudioParamConnections } from './factories/add-audio-param-connections';\nimport { createAddAudioWorkletModule } from './factories/add-audio-worklet-module';\nimport { createAddConnectionToAudioNode } from './factories/add-connection-to-audio-node';\nimport { createAddPassiveInputConnectionToAudioNode } from './factories/add-passive-input-connection-to-audio-node';\nimport { createAddSilentConnection } from './factories/add-silent-connection';\nimport { createAddUnrenderedAudioWorkletNode } from './factories/add-unrendered-audio-worklet-node';\nimport { createAnalyserNodeConstructor } from './factories/analyser-node-constructor';\nimport { createAnalyserNodeRendererFactory } from './factories/analyser-node-renderer-factory';\nimport { createAudioBufferConstructor } from './factories/audio-buffer-constructor';\nimport { createAudioBufferSourceNodeConstructor } from './factories/audio-buffer-source-node-constructor';\nimport { createAudioBufferSourceNodeRendererFactory } from './factories/audio-buffer-source-node-renderer-factory';\nimport { createAudioContextConstructor } from './factories/audio-context-constructor';\nimport { createAudioDestinationNodeConstructor } from './factories/audio-destination-node-constructor';\nimport { createAudioDestinationNodeRenderer } from './factories/audio-destination-node-renderer-factory';\nimport { createAudioListenerFactory } from './factories/audio-listener-factory';\nimport { createAudioNodeConstructor } from './factories/audio-node-constructor';\nimport { createAudioParamFactory } from './factories/audio-param-factory';\nimport { createAudioParamRenderer } from './factories/audio-param-renderer';\nimport { createAudioWorkletNodeConstructor } from './factories/audio-worklet-node-constructor';\nimport { createAudioWorkletNodeRendererFactory } from './factories/audio-worklet-node-renderer-factory';\nimport { createBaseAudioContextConstructor } from './factories/base-audio-context-constructor';\nimport { createBiquadFilterNodeConstructor } from './factories/biquad-filter-node-constructor';\nimport { createBiquadFilterNodeRendererFactory } from './factories/biquad-filter-node-renderer-factory';\nimport { createCacheTestResult } from './factories/cache-test-result';\nimport { createChannelMergerNodeConstructor } from './factories/channel-merger-node-constructor';\nimport { createChannelMergerNodeRendererFactory } from './factories/channel-merger-node-renderer-factory';\nimport { createChannelSplitterNodeConstructor } from './factories/channel-splitter-node-constructor';\nimport { createChannelSplitterNodeRendererFactory } from './factories/channel-splitter-node-renderer-factory';\nimport { createConnectAudioParam } from './factories/connect-audio-param';\nimport { createConnectMultipleOutputs } from './factories/connect-multiple-outputs';\nimport { createConnectedNativeAudioBufferSourceNodeFactory } from './factories/connected-native-audio-buffer-source-node-factory';\nimport { createConstantSourceNodeConstructor } from './factories/constant-source-node-constructor';\nimport { createConstantSourceNodeRendererFactory } from './factories/constant-source-node-renderer-factory';\nimport { createConvertNumberToUnsignedLong } from './factories/convert-number-to-unsigned-long';\nimport { createConvolverNodeConstructor } from './factories/convolver-node-constructor';\nimport { createConvolverNodeRendererFactory } from './factories/convolver-node-renderer-factory';\nimport { createCreateNativeOfflineAudioContext } from './factories/create-native-offline-audio-context';\nimport { createDataCloneError } from './factories/data-clone-error';\nimport { createDecodeAudioData } from './factories/decode-audio-data';\nimport { createDecrementCycleCounter } from './factories/decrement-cycle-counter';\nimport { createDelayNodeConstructor } from './factories/delay-node-constructor';\nimport { createDelayNodeRendererFactory } from './factories/delay-node-renderer-factory';\nimport { createDeleteActiveInputConnectionToAudioNode } from './factories/delete-active-input-connection-to-audio-node';\nimport { createDeleteUnrenderedAudioWorkletNode } from './factories/delete-unrendered-audio-worklet-node';\nimport { createDetectCycles } from './factories/detect-cycles';\nimport { createDisconnectMultipleOutputs } from './factories/disconnect-multiple-outputs';\nimport { createDynamicsCompressorNodeConstructor } from './factories/dynamics-compressor-node-constructor';\nimport { createDynamicsCompressorNodeRendererFactory } from './factories/dynamics-compressor-node-renderer-factory';\nimport { createEncodingError } from './factories/encoding-error';\nimport { createEvaluateSource } from './factories/evaluate-source';\nimport { createEventTargetConstructor } from './factories/event-target-constructor';\nimport { createExposeCurrentFrameAndCurrentTime } from './factories/expose-current-frame-and-current-time';\nimport { createFetchSource } from './factories/fetch-source';\nimport { createGainNodeConstructor } from './factories/gain-node-constructor';\nimport { createGainNodeRendererFactory } from './factories/gain-node-renderer-factory';\nimport { createGetActiveAudioWorkletNodeInputs } from './factories/get-active-audio-worklet-node-inputs';\nimport { createGetAudioNodeRenderer } from './factories/get-audio-node-renderer';\nimport { createGetAudioNodeTailTime } from './factories/get-audio-node-tail-time';\nimport { createGetAudioParamRenderer } from './factories/get-audio-param-renderer';\nimport { createGetBackupOfflineAudioContext } from './factories/get-backup-offline-audio-context';\nimport { createGetNativeContext } from './factories/get-native-context';\nimport { createGetOrCreateBackupOfflineAudioContext } from './factories/get-or-create-backup-offline-audio-context';\nimport { createGetUnrenderedAudioWorkletNodes } from './factories/get-unrendered-audio-worklet-nodes';\nimport { createIIRFilterNodeConstructor } from './factories/iir-filter-node-constructor';\nimport { createIIRFilterNodeRendererFactory } from './factories/iir-filter-node-renderer-factory';\nimport { createIncrementCycleCounterFactory } from './factories/increment-cycle-counter-factory';\nimport { createIndexSizeError } from './factories/index-size-error';\nimport { createInvalidAccessError } from './factories/invalid-access-error';\nimport { createInvalidStateError } from './factories/invalid-state-error';\nimport { createIsAnyAudioContext } from './factories/is-any-audio-context';\nimport { createIsAnyAudioNode } from './factories/is-any-audio-node';\nimport { createIsAnyAudioParam } from './factories/is-any-audio-param';\nimport { createIsAnyOfflineAudioContext } from './factories/is-any-offline-audio-context';\nimport { createIsNativeAudioContext } from './factories/is-native-audio-context';\nimport { createIsNativeAudioNode } from './factories/is-native-audio-node';\nimport { createIsNativeAudioParam } from './factories/is-native-audio-param';\nimport { createIsNativeContext } from './factories/is-native-context';\nimport { createIsNativeOfflineAudioContext } from './factories/is-native-offline-audio-context';\nimport { createIsSecureContext } from './factories/is-secure-context';\nimport { createIsSupportedPromise } from './factories/is-supported-promise';\nimport { createMediaElementAudioSourceNodeConstructor } from './factories/media-element-audio-source-node-constructor';\nimport { createMediaStreamAudioDestinationNodeConstructor } from './factories/media-stream-audio-destination-node-constructor';\nimport { createMediaStreamAudioSourceNodeConstructor } from './factories/media-stream-audio-source-node-constructor';\nimport { createMediaStreamTrackAudioSourceNodeConstructor } from './factories/media-stream-track-audio-source-node-constructor';\nimport { createMinimalAudioContextConstructor } from './factories/minimal-audio-context-constructor';\nimport { createMinimalBaseAudioContextConstructor } from './factories/minimal-base-audio-context-constructor';\nimport { createMinimalOfflineAudioContextConstructor } from './factories/minimal-offline-audio-context-constructor';\nimport { createMonitorConnections } from './factories/monitor-connections';\nimport { createNativeAnalyserNodeFactory } from './factories/native-analyser-node-factory';\nimport { createNativeAudioBufferConstructor } from './factories/native-audio-buffer-constructor';\nimport { createNativeAudioBufferSourceNodeFactory } from './factories/native-audio-buffer-source-node-factory';\nimport { createNativeAudioContextConstructor } from './factories/native-audio-context-constructor';\nimport { createNativeAudioDestinationNodeFactory } from './factories/native-audio-destination-node';\nimport { createNativeAudioWorkletNodeConstructor } from './factories/native-audio-worklet-node-constructor';\nimport { createNativeAudioWorkletNodeFactory } from './factories/native-audio-worklet-node-factory';\nimport { createNativeAudioWorkletNodeFakerFactory } from './factories/native-audio-worklet-node-faker-factory';\nimport { createNativeBiquadFilterNode } from './factories/native-biquad-filter-node';\nimport { createNativeChannelMergerNodeFactory } from './factories/native-channel-merger-node-factory';\nimport { createNativeChannelSplitterNode } from './factories/native-channel-splitter-node';\nimport { createNativeConstantSourceNodeFactory } from './factories/native-constant-source-node-factory';\nimport { createNativeConstantSourceNodeFakerFactory } from './factories/native-constant-source-node-faker-factory';\nimport { createNativeConvolverNodeFactory } from './factories/native-convolver-node-factory';\nimport { createNativeDelayNode } from './factories/native-delay-node';\nimport { createNativeDynamicsCompressorNodeFactory } from './factories/native-dynamics-compressor-node-factory';\nimport { createNativeGainNode } from './factories/native-gain-node';\nimport { createNativeIIRFilterNodeFactory } from './factories/native-iir-filter-node-factory';\nimport { createNativeIIRFilterNodeFakerFactory } from './factories/native-iir-filter-node-faker-factory';\nimport { createNativeMediaElementAudioSourceNode } from './factories/native-media-element-audio-source-node';\nimport { createNativeMediaStreamAudioDestinationNode } from './factories/native-media-stream-audio-destination-node';\nimport { createNativeMediaStreamAudioSourceNode } from './factories/native-media-stream-audio-source-node';\nimport { createNativeMediaStreamTrackAudioSourceNodeFactory } from './factories/native-media-stream-track-audio-source-node-factory';\nimport { createNativeOfflineAudioContextConstructor } from './factories/native-offline-audio-context-constructor';\nimport { createNativeOscillatorNodeFactory } from './factories/native-oscillator-node-factory';\nimport { createNativePannerNodeFactory } from './factories/native-panner-node-factory';\nimport { createNativePannerNodeFakerFactory } from './factories/native-panner-node-faker-factory';\nimport { createNativePeriodicWaveFactory } from './factories/native-periodic-wave-factory';\nimport { createNativeScriptProcessorNode } from './factories/native-script-processor-node';\nimport { createNativeStereoPannerNodeFactory } from './factories/native-stereo-panner-node-factory';\nimport { createNativeStereoPannerNodeFakerFactory } from './factories/native-stereo-panner-node-faker-factory';\nimport { createNativeWaveShaperNodeFactory } from './factories/native-wave-shaper-node-factory';\nimport { createNativeWaveShaperNodeFakerFactory } from './factories/native-wave-shaper-node-faker-factory';\nimport { createNotSupportedError } from './factories/not-supported-error';\nimport { createOfflineAudioContextConstructor } from './factories/offline-audio-context-constructor';\nimport { createOscillatorNodeConstructor } from './factories/oscillator-node-constructor';\nimport { createOscillatorNodeRendererFactory } from './factories/oscillator-node-renderer-factory';\nimport { createPannerNodeConstructor } from './factories/panner-node-constructor';\nimport { createPannerNodeRendererFactory } from './factories/panner-node-renderer-factory';\nimport { createPeriodicWaveConstructor } from './factories/periodic-wave-constructor';\nimport { createRenderAutomation } from './factories/render-automation';\nimport { createRenderInputsOfAudioNode } from './factories/render-inputs-of-audio-node';\nimport { createRenderInputsOfAudioParam } from './factories/render-inputs-of-audio-param';\nimport { createRenderNativeOfflineAudioContext } from './factories/render-native-offline-audio-context';\nimport { createSetActiveAudioWorkletNodeInputs } from './factories/set-active-audio-worklet-node-inputs';\nimport { createSetAudioNodeTailTime } from './factories/set-audio-node-tail-time';\nimport { createStartRendering } from './factories/start-rendering';\nimport { createStereoPannerNodeConstructor } from './factories/stereo-panner-node-constructor';\nimport { createStereoPannerNodeRendererFactory } from './factories/stereo-panner-node-renderer-factory';\nimport { createTestAudioBufferConstructorSupport } from './factories/test-audio-buffer-constructor-support';\nimport { createTestAudioBufferCopyChannelMethodsSubarraySupport } from './factories/test-audio-buffer-copy-channel-methods-subarray-support';\nimport { createTestAudioContextCloseMethodSupport } from './factories/test-audio-context-close-method-support';\nimport { createTestAudioContextDecodeAudioDataMethodTypeErrorSupport } from './factories/test-audio-context-decode-audio-data-method-type-error-support';\nimport { createTestAudioContextOptionsSupport } from './factories/test-audio-context-options-support';\nimport { createTestAudioNodeConnectMethodSupport } from './factories/test-audio-node-connect-method-support';\nimport { createTestAudioWorkletProcessorNoOutputsSupport } from './factories/test-audio-worklet-processor-no-outputs-support';\nimport { createTestAudioWorkletProcessorPostMessageSupport } from './factories/test-audio-worklet-processor-post-message-support';\nimport { createTestChannelMergerNodeChannelCountSupport } from './factories/test-channel-merger-node-channel-count-support';\nimport { createTestConstantSourceNodeAccurateSchedulingSupport } from './factories/test-constant-source-node-accurate-scheduling-support';\nimport { createTestConvolverNodeBufferReassignabilitySupport } from './factories/test-convolver-node-buffer-reassignability-support';\nimport { createTestConvolverNodeChannelCountSupport } from './factories/test-convolver-node-channel-count-support';\nimport { createTestIsSecureContextSupport } from './factories/test-is-secure-context-support';\nimport { createTestMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport } from './factories/test-media-stream-audio-source-node-media-stream-without-audio-track-support';\nimport { createTestOfflineAudioContextCurrentTimeSupport } from './factories/test-offline-audio-context-current-time-support';\nimport { createTestStereoPannerNodeDefaultValueSupport } from './factories/test-stereo-panner-node-default-value-support';\nimport { createUnknownError } from './factories/unknown-error';\nimport { createWaveShaperNodeConstructor } from './factories/wave-shaper-node-constructor';\nimport { createWaveShaperNodeRendererFactory } from './factories/wave-shaper-node-renderer-factory';\nimport { createWindow } from './factories/window';\nimport { createWrapAudioBufferCopyChannelMethods } from './factories/wrap-audio-buffer-copy-channel-methods';\nimport { createWrapAudioBufferCopyChannelMethodsOutOfBounds } from './factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds';\nimport { createWrapAudioBufferSourceNodeStopMethodNullifiedBuffer } from './factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer';\nimport { createWrapChannelMergerNode } from './factories/wrap-channel-merger-node';\nimport { AUDIO_NODE_CONNECTIONS_STORE, AUDIO_NODE_STORE, AUDIO_PARAM_CONNECTIONS_STORE, AUDIO_PARAM_STORE, CONTEXT_STORE, CYCLE_COUNTERS } from './globals';\nimport { connectNativeAudioNodeToNativeAudioNode } from './helpers/connect-native-audio-node-to-native-audio-node';\nimport { disconnectNativeAudioNodeFromNativeAudioNode } from './helpers/disconnect-native-audio-node-from-native-audio-node';\nimport { getAudioNodeConnections } from './helpers/get-audio-node-connections';\nimport { getAudioParamConnections } from './helpers/get-audio-param-connections';\nimport { getEventListenersOfAudioNode } from './helpers/get-event-listeners-of-audio-node';\nimport { getFirstSample } from './helpers/get-first-sample';\nimport { getNativeAudioNode } from './helpers/get-native-audio-node';\nimport { getNativeAudioParam } from './helpers/get-native-audio-param';\nimport { getValueForKey } from './helpers/get-value-for-key';\nimport { insertElementInSet } from './helpers/insert-element-in-set';\nimport { isActiveAudioNode } from './helpers/is-active-audio-node';\nimport { isDCCurve } from './helpers/is-dc-curve';\nimport { isPartOfACycle } from './helpers/is-part-of-a-cycle';\nimport { isPassiveAudioNode } from './helpers/is-passive-audio-node';\nimport { overwriteAccessors } from './helpers/overwrite-accessors';\nimport { pickElementFromSet } from './helpers/pick-element-from-set';\nimport { sanitizeAudioWorkletNodeOptions } from './helpers/sanitize-audio-worklet-node-options';\nimport { sanitizeChannelSplitterOptions } from './helpers/sanitize-channel-splitter-options';\nimport { sanitizePeriodicWaveOptions } from './helpers/sanitize-periodic-wave-options';\nimport { setValueAtTimeUntilPossible } from './helpers/set-value-at-time-until-possible';\nimport { testAudioBufferCopyChannelMethodsOutOfBoundsSupport } from './helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support';\nimport { testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport } from './helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support';\nimport { testAudioBufferSourceNodeStartMethodOffsetClampingSupport } from './helpers/test-audio-buffer-source-node-start-method-offset-clamping-support';\nimport { testAudioBufferSourceNodeStopMethodNullifiedBufferSupport } from './helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support';\nimport { testAudioScheduledSourceNodeStartMethodNegativeParametersSupport } from './helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support';\nimport { testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport } from './helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support';\nimport { testAudioScheduledSourceNodeStopMethodNegativeParametersSupport } from './helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support';\nimport { testAudioWorkletNodeOptionsClonability } from './helpers/test-audio-worklet-node-options-clonability';\nimport { testDomExceptionConstructorSupport } from './helpers/test-dom-exception-constructor-support';\nimport { testPromiseSupport } from './helpers/test-promise-support';\nimport { testTransferablesSupport } from './helpers/test-transferables-support';\nimport { wrapAudioBufferSourceNodeStartMethodOffsetClamping } from './helpers/wrap-audio-buffer-source-node-start-method-offset-clamping';\nimport { wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls } from './helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls';\nimport { wrapEventListener } from './helpers/wrap-event-listener';\n/*\n * @todo Explicitly referencing the barrel file seems to be necessary when enabling the\n * isolatedModules compiler option.\n */\nexport * from './interfaces/index';\nexport * from './types/index';\nconst addActiveInputConnectionToAudioNode = createAddActiveInputConnectionToAudioNode(insertElementInSet);\nconst addPassiveInputConnectionToAudioNode = createAddPassiveInputConnectionToAudioNode(insertElementInSet);\nconst deleteActiveInputConnectionToAudioNode = createDeleteActiveInputConnectionToAudioNode(pickElementFromSet);\nconst audioNodeTailTimeStore = new WeakMap();\nconst getAudioNodeTailTime = createGetAudioNodeTailTime(audioNodeTailTimeStore);\nconst cacheTestResult = createCacheTestResult(new Map(), new WeakMap());\nconst window = createWindow();\nconst createNativeAnalyserNode = createNativeAnalyserNodeFactory(cacheTestResult, createIndexSizeError);\nconst getAudioNodeRenderer = createGetAudioNodeRenderer(getAudioNodeConnections);\nconst renderInputsOfAudioNode = createRenderInputsOfAudioNode(getAudioNodeConnections, getAudioNodeRenderer, isPartOfACycle);\nconst createAnalyserNodeRenderer = createAnalyserNodeRendererFactory(createNativeAnalyserNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst getNativeContext = createGetNativeContext(CONTEXT_STORE);\nconst nativeOfflineAudioContextConstructor = createNativeOfflineAudioContextConstructor(window);\nconst isNativeOfflineAudioContext = createIsNativeOfflineAudioContext(nativeOfflineAudioContextConstructor);\nconst audioParamAudioNodeStore = new WeakMap();\nconst eventTargetConstructor = createEventTargetConstructor(wrapEventListener);\nconst nativeAudioContextConstructor = createNativeAudioContextConstructor(window);\nconst isNativeAudioContext = createIsNativeAudioContext(nativeAudioContextConstructor);\nconst isNativeAudioNode = createIsNativeAudioNode(window);\nconst isNativeAudioParam = createIsNativeAudioParam(window);\nconst nativeAudioWorkletNodeConstructor = createNativeAudioWorkletNodeConstructor(window);\nconst audioNodeConstructor = createAudioNodeConstructor(createAddAudioNodeConnections(AUDIO_NODE_CONNECTIONS_STORE), createAddConnectionToAudioNode(addActiveInputConnectionToAudioNode, addPassiveInputConnectionToAudioNode, connectNativeAudioNodeToNativeAudioNode, deleteActiveInputConnectionToAudioNode, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getAudioNodeTailTime, getEventListenersOfAudioNode, getNativeAudioNode, insertElementInSet, isActiveAudioNode, isPartOfACycle, isPassiveAudioNode), cacheTestResult, createIncrementCycleCounterFactory(CYCLE_COUNTERS, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, isActiveAudioNode), createIndexSizeError, createInvalidAccessError, createNotSupportedError, createDecrementCycleCounter(connectNativeAudioNodeToNativeAudioNode, CYCLE_COUNTERS, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, getNativeContext, isActiveAudioNode, isNativeOfflineAudioContext), createDetectCycles(audioParamAudioNodeStore, getAudioNodeConnections, getValueForKey), eventTargetConstructor, getNativeContext, isNativeAudioContext, isNativeAudioNode, isNativeAudioParam, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor);\nconst analyserNodeConstructor = createAnalyserNodeConstructor(audioNodeConstructor, createAnalyserNodeRenderer, createIndexSizeError, createNativeAnalyserNode, getNativeContext, isNativeOfflineAudioContext);\nexport { analyserNodeConstructor as AnalyserNode };\nconst audioBufferStore = new WeakSet();\nconst nativeAudioBufferConstructor = createNativeAudioBufferConstructor(window);\nconst convertNumberToUnsignedLong = createConvertNumberToUnsignedLong(new Uint32Array(1));\nconst wrapAudioBufferCopyChannelMethods = createWrapAudioBufferCopyChannelMethods(convertNumberToUnsignedLong, createIndexSizeError);\nconst wrapAudioBufferCopyChannelMethodsOutOfBounds = createWrapAudioBufferCopyChannelMethodsOutOfBounds(convertNumberToUnsignedLong);\nconst audioBufferConstructor = createAudioBufferConstructor(audioBufferStore, cacheTestResult, createNotSupportedError, nativeAudioBufferConstructor, nativeOfflineAudioContextConstructor, createTestAudioBufferConstructorSupport(nativeAudioBufferConstructor), wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds);\nexport { audioBufferConstructor as AudioBuffer };\nconst addSilentConnection = createAddSilentConnection(createNativeGainNode);\nconst renderInputsOfAudioParam = createRenderInputsOfAudioParam(getAudioNodeRenderer, getAudioParamConnections, isPartOfACycle);\nconst connectAudioParam = createConnectAudioParam(renderInputsOfAudioParam);\nconst createNativeAudioBufferSourceNode = createNativeAudioBufferSourceNodeFactory(addSilentConnection, cacheTestResult, testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport, testAudioBufferSourceNodeStartMethodOffsetClampingSupport, testAudioBufferSourceNodeStopMethodNullifiedBufferSupport, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioBufferSourceNodeStartMethodOffsetClamping, createWrapAudioBufferSourceNodeStopMethodNullifiedBuffer(overwriteAccessors), wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls);\nconst renderAutomation = createRenderAutomation(createGetAudioParamRenderer(getAudioParamConnections), renderInputsOfAudioParam);\nconst createAudioBufferSourceNodeRenderer = createAudioBufferSourceNodeRendererFactory(connectAudioParam, createNativeAudioBufferSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst createAudioParam = createAudioParamFactory(createAddAudioParamConnections(AUDIO_PARAM_CONNECTIONS_STORE), audioParamAudioNodeStore, AUDIO_PARAM_STORE, createAudioParamRenderer, createCancelAndHoldAutomationEvent, createCancelScheduledValuesAutomationEvent, createExponentialRampToValueAutomationEvent, createLinearRampToValueAutomationEvent, createSetTargetAutomationEvent, createSetValueAutomationEvent, createSetValueCurveAutomationEvent, nativeAudioContextConstructor, setValueAtTimeUntilPossible);\nconst audioBufferSourceNodeConstructor = createAudioBufferSourceNodeConstructor(audioNodeConstructor, createAudioBufferSourceNodeRenderer, createAudioParam, createInvalidStateError, createNativeAudioBufferSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener);\nexport { audioBufferSourceNodeConstructor as AudioBufferSourceNode };\nconst audioDestinationNodeConstructor = createAudioDestinationNodeConstructor(audioNodeConstructor, createAudioDestinationNodeRenderer, createIndexSizeError, createInvalidStateError, createNativeAudioDestinationNodeFactory(createNativeGainNode, overwriteAccessors), getNativeContext, isNativeOfflineAudioContext, renderInputsOfAudioNode);\nconst createBiquadFilterNodeRenderer = createBiquadFilterNodeRendererFactory(connectAudioParam, createNativeBiquadFilterNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst setAudioNodeTailTime = createSetAudioNodeTailTime(audioNodeTailTimeStore);\nconst biquadFilterNodeConstructor = createBiquadFilterNodeConstructor(audioNodeConstructor, createAudioParam, createBiquadFilterNodeRenderer, createInvalidAccessError, createNativeBiquadFilterNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst monitorConnections = createMonitorConnections(insertElementInSet, isNativeAudioNode);\nconst wrapChannelMergerNode = createWrapChannelMergerNode(createInvalidStateError, monitorConnections);\nconst createNativeChannelMergerNode = createNativeChannelMergerNodeFactory(nativeAudioContextConstructor, wrapChannelMergerNode);\nconst createChannelMergerNodeRenderer = createChannelMergerNodeRendererFactory(createNativeChannelMergerNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst channelMergerNodeConstructor = createChannelMergerNodeConstructor(audioNodeConstructor, createChannelMergerNodeRenderer, createNativeChannelMergerNode, getNativeContext, isNativeOfflineAudioContext);\nconst createChannelSplitterNodeRenderer = createChannelSplitterNodeRendererFactory(createNativeChannelSplitterNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst channelSplitterNodeConstructor = createChannelSplitterNodeConstructor(audioNodeConstructor, createChannelSplitterNodeRenderer, createNativeChannelSplitterNode, getNativeContext, isNativeOfflineAudioContext, sanitizeChannelSplitterOptions);\nconst createNativeConstantSourceNodeFaker = createNativeConstantSourceNodeFakerFactory(addSilentConnection, createNativeAudioBufferSourceNode, createNativeGainNode, monitorConnections);\nconst createNativeConstantSourceNode = createNativeConstantSourceNodeFactory(addSilentConnection, cacheTestResult, createNativeConstantSourceNodeFaker, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport);\nconst createConstantSourceNodeRenderer = createConstantSourceNodeRendererFactory(connectAudioParam, createNativeConstantSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst constantSourceNodeConstructor = createConstantSourceNodeConstructor(audioNodeConstructor, createAudioParam, createConstantSourceNodeRenderer, createNativeConstantSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener);\nconst createNativeConvolverNode = createNativeConvolverNodeFactory(createNotSupportedError, overwriteAccessors);\nconst createConvolverNodeRenderer = createConvolverNodeRendererFactory(createNativeConvolverNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst convolverNodeConstructor = createConvolverNodeConstructor(audioNodeConstructor, createConvolverNodeRenderer, createNativeConvolverNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createDelayNodeRenderer = createDelayNodeRendererFactory(connectAudioParam, createNativeDelayNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst delayNodeConstructor = createDelayNodeConstructor(audioNodeConstructor, createAudioParam, createDelayNodeRenderer, createNativeDelayNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createNativeDynamicsCompressorNode = createNativeDynamicsCompressorNodeFactory(createNotSupportedError);\nconst createDynamicsCompressorNodeRenderer = createDynamicsCompressorNodeRendererFactory(connectAudioParam, createNativeDynamicsCompressorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst dynamicsCompressorNodeConstructor = createDynamicsCompressorNodeConstructor(audioNodeConstructor, createAudioParam, createDynamicsCompressorNodeRenderer, createNativeDynamicsCompressorNode, createNotSupportedError, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createGainNodeRenderer = createGainNodeRendererFactory(connectAudioParam, createNativeGainNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst gainNodeConstructor = createGainNodeConstructor(audioNodeConstructor, createAudioParam, createGainNodeRenderer, createNativeGainNode, getNativeContext, isNativeOfflineAudioContext);\nconst createNativeIIRFilterNodeFaker = createNativeIIRFilterNodeFakerFactory(createInvalidAccessError, createInvalidStateError, createNativeScriptProcessorNode, createNotSupportedError);\nconst renderNativeOfflineAudioContext = createRenderNativeOfflineAudioContext(cacheTestResult, createNativeGainNode, createNativeScriptProcessorNode, createTestOfflineAudioContextCurrentTimeSupport(createNativeGainNode, nativeOfflineAudioContextConstructor));\nconst createIIRFilterNodeRenderer = createIIRFilterNodeRendererFactory(createNativeAudioBufferSourceNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderInputsOfAudioNode, renderNativeOfflineAudioContext);\nconst createNativeIIRFilterNode = createNativeIIRFilterNodeFactory(createNativeIIRFilterNodeFaker);\nconst iIRFilterNodeConstructor = createIIRFilterNodeConstructor(audioNodeConstructor, createNativeIIRFilterNode, createIIRFilterNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createAudioListener = createAudioListenerFactory(createAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeScriptProcessorNode, createNotSupportedError, getFirstSample, isNativeOfflineAudioContext, overwriteAccessors);\nconst unrenderedAudioWorkletNodeStore = new WeakMap();\nconst minimalBaseAudioContextConstructor = createMinimalBaseAudioContextConstructor(audioDestinationNodeConstructor, createAudioListener, eventTargetConstructor, isNativeOfflineAudioContext, unrenderedAudioWorkletNodeStore, wrapEventListener);\nconst createNativeOscillatorNode = createNativeOscillatorNodeFactory(addSilentConnection, cacheTestResult, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls);\nconst createOscillatorNodeRenderer = createOscillatorNodeRendererFactory(connectAudioParam, createNativeOscillatorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst oscillatorNodeConstructor = createOscillatorNodeConstructor(audioNodeConstructor, createAudioParam, createNativeOscillatorNode, createOscillatorNodeRenderer, getNativeContext, isNativeOfflineAudioContext, wrapEventListener);\nconst createConnectedNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNodeFactory(createNativeAudioBufferSourceNode);\nconst createNativeWaveShaperNodeFaker = createNativeWaveShaperNodeFakerFactory(createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeGainNode, isDCCurve, monitorConnections);\nconst createNativeWaveShaperNode = createNativeWaveShaperNodeFactory(createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeWaveShaperNodeFaker, isDCCurve, monitorConnections, nativeAudioContextConstructor, overwriteAccessors);\nconst createNativePannerNodeFaker = createNativePannerNodeFakerFactory(connectNativeAudioNodeToNativeAudioNode, createInvalidStateError, createNativeChannelMergerNode, createNativeGainNode, createNativeScriptProcessorNode, createNativeWaveShaperNode, createNotSupportedError, disconnectNativeAudioNodeFromNativeAudioNode, getFirstSample, monitorConnections);\nconst createNativePannerNode = createNativePannerNodeFactory(createNativePannerNodeFaker);\nconst createPannerNodeRenderer = createPannerNodeRendererFactory(connectAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeGainNode, createNativePannerNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext);\nconst pannerNodeConstructor = createPannerNodeConstructor(audioNodeConstructor, createAudioParam, createNativePannerNode, createPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createNativePeriodicWave = createNativePeriodicWaveFactory(createIndexSizeError);\nconst periodicWaveConstructor = createPeriodicWaveConstructor(createNativePeriodicWave, getNativeContext, new WeakSet(), sanitizePeriodicWaveOptions);\nconst nativeStereoPannerNodeFakerFactory = createNativeStereoPannerNodeFakerFactory(createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeGainNode, createNativeWaveShaperNode, createNotSupportedError, monitorConnections);\nconst createNativeStereoPannerNode = createNativeStereoPannerNodeFactory(nativeStereoPannerNodeFakerFactory, createNotSupportedError);\nconst createStereoPannerNodeRenderer = createStereoPannerNodeRendererFactory(connectAudioParam, createNativeStereoPannerNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst stereoPannerNodeConstructor = createStereoPannerNodeConstructor(audioNodeConstructor, createAudioParam, createNativeStereoPannerNode, createStereoPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext);\nconst createWaveShaperNodeRenderer = createWaveShaperNodeRendererFactory(createNativeWaveShaperNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst waveShaperNodeConstructor = createWaveShaperNodeConstructor(audioNodeConstructor, createInvalidStateError, createNativeWaveShaperNode, createWaveShaperNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst isSecureContext = createIsSecureContext(window);\nconst exposeCurrentFrameAndCurrentTime = createExposeCurrentFrameAndCurrentTime(window);\nconst backupOfflineAudioContextStore = new WeakMap();\nconst getOrCreateBackupOfflineAudioContext = createGetOrCreateBackupOfflineAudioContext(backupOfflineAudioContextStore, nativeOfflineAudioContextConstructor);\n// The addAudioWorkletModule() function is only available in a SecureContext.\nexport const addAudioWorkletModule = isSecureContext\n    ? createAddAudioWorkletModule(cacheTestResult, createNotSupportedError, createEvaluateSource(window), exposeCurrentFrameAndCurrentTime, createFetchSource(createAbortError), getNativeContext, getOrCreateBackupOfflineAudioContext, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor, new WeakMap(), new WeakMap(), createTestAudioWorkletProcessorPostMessageSupport(nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor), \n    // @todo window is guaranteed to be defined because isSecureContext checks that as well.\n    window)\n    : undefined;\nconst isNativeContext = createIsNativeContext(isNativeAudioContext, isNativeOfflineAudioContext);\nexport const decodeAudioData = createDecodeAudioData(audioBufferStore, cacheTestResult, createDataCloneError, createEncodingError, new WeakSet(), getNativeContext, isNativeContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, testPromiseSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds);\nconst baseAudioContextConstructor = createBaseAudioContextConstructor(addAudioWorkletModule, analyserNodeConstructor, audioBufferConstructor, audioBufferSourceNodeConstructor, biquadFilterNodeConstructor, channelMergerNodeConstructor, channelSplitterNodeConstructor, constantSourceNodeConstructor, convolverNodeConstructor, decodeAudioData, delayNodeConstructor, dynamicsCompressorNodeConstructor, gainNodeConstructor, iIRFilterNodeConstructor, minimalBaseAudioContextConstructor, oscillatorNodeConstructor, pannerNodeConstructor, periodicWaveConstructor, stereoPannerNodeConstructor, waveShaperNodeConstructor);\nconst mediaElementAudioSourceNodeConstructor = createMediaElementAudioSourceNodeConstructor(audioNodeConstructor, createNativeMediaElementAudioSourceNode, getNativeContext, isNativeOfflineAudioContext);\nconst mediaStreamAudioDestinationNodeConstructor = createMediaStreamAudioDestinationNodeConstructor(audioNodeConstructor, createNativeMediaStreamAudioDestinationNode, getNativeContext, isNativeOfflineAudioContext);\nconst mediaStreamAudioSourceNodeConstructor = createMediaStreamAudioSourceNodeConstructor(audioNodeConstructor, createNativeMediaStreamAudioSourceNode, getNativeContext, isNativeOfflineAudioContext);\nconst createNativeMediaStreamTrackAudioSourceNode = createNativeMediaStreamTrackAudioSourceNodeFactory(createInvalidStateError, isNativeOfflineAudioContext);\nconst mediaStreamTrackAudioSourceNodeConstructor = createMediaStreamTrackAudioSourceNodeConstructor(audioNodeConstructor, createNativeMediaStreamTrackAudioSourceNode, getNativeContext);\nconst audioContextConstructor = createAudioContextConstructor(baseAudioContextConstructor, createInvalidStateError, createNotSupportedError, createUnknownError, mediaElementAudioSourceNodeConstructor, mediaStreamAudioDestinationNodeConstructor, mediaStreamAudioSourceNodeConstructor, mediaStreamTrackAudioSourceNodeConstructor, nativeAudioContextConstructor);\nexport { audioContextConstructor as AudioContext };\nconst getUnrenderedAudioWorkletNodes = createGetUnrenderedAudioWorkletNodes(unrenderedAudioWorkletNodeStore);\nconst addUnrenderedAudioWorkletNode = createAddUnrenderedAudioWorkletNode(getUnrenderedAudioWorkletNodes);\nconst connectMultipleOutputs = createConnectMultipleOutputs(createIndexSizeError);\nconst deleteUnrenderedAudioWorkletNode = createDeleteUnrenderedAudioWorkletNode(getUnrenderedAudioWorkletNodes);\nconst disconnectMultipleOutputs = createDisconnectMultipleOutputs(createIndexSizeError);\nconst activeAudioWorkletNodeInputsStore = new WeakMap();\nconst getActiveAudioWorkletNodeInputs = createGetActiveAudioWorkletNodeInputs(activeAudioWorkletNodeInputsStore, getValueForKey);\nconst createNativeAudioWorkletNodeFaker = createNativeAudioWorkletNodeFakerFactory(connectMultipleOutputs, createIndexSizeError, createInvalidStateError, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, createNativeScriptProcessorNode, createNotSupportedError, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getActiveAudioWorkletNodeInputs, monitorConnections);\nconst createNativeAudioWorkletNode = createNativeAudioWorkletNodeFactory(createInvalidStateError, createNativeAudioWorkletNodeFaker, createNativeGainNode, createNotSupportedError, monitorConnections);\nconst createAudioWorkletNodeRenderer = createAudioWorkletNodeRendererFactory(connectAudioParam, connectMultipleOutputs, createNativeAudioBufferSourceNode, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, deleteUnrenderedAudioWorkletNode, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getNativeAudioNode, nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext);\nconst getBackupOfflineAudioContext = createGetBackupOfflineAudioContext(backupOfflineAudioContextStore);\nconst setActiveAudioWorkletNodeInputs = createSetActiveAudioWorkletNodeInputs(activeAudioWorkletNodeInputsStore);\n// The AudioWorkletNode constructor is only available in a SecureContext.\nconst audioWorkletNodeConstructor = isSecureContext\n    ? createAudioWorkletNodeConstructor(addUnrenderedAudioWorkletNode, audioNodeConstructor, createAudioParam, createAudioWorkletNodeRenderer, createNativeAudioWorkletNode, getAudioNodeConnections, getBackupOfflineAudioContext, getNativeContext, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor, sanitizeAudioWorkletNodeOptions, setActiveAudioWorkletNodeInputs, testAudioWorkletNodeOptionsClonability, wrapEventListener)\n    : undefined;\nexport { audioWorkletNodeConstructor as AudioWorkletNode };\nexport { biquadFilterNodeConstructor as BiquadFilterNode };\nexport { channelMergerNodeConstructor as ChannelMergerNode };\nexport { channelSplitterNodeConstructor as ChannelSplitterNode };\nexport { convolverNodeConstructor as ConvolverNode };\nexport { constantSourceNodeConstructor as ConstantSourceNode };\nexport { delayNodeConstructor as DelayNode };\nexport { dynamicsCompressorNodeConstructor as DynamicsCompressorNode };\nexport { gainNodeConstructor as GainNode };\nexport { iIRFilterNodeConstructor as IIRFilterNode };\nexport { mediaElementAudioSourceNodeConstructor as MediaElementAudioSourceNode };\nexport { mediaStreamAudioDestinationNodeConstructor as MediaStreamAudioDestinationNode };\nexport { mediaStreamAudioSourceNodeConstructor as MediaStreamAudioSourceNode };\nexport { mediaStreamTrackAudioSourceNodeConstructor as MediaStreamTrackAudioSourceNode };\nconst minimalAudioContextConstructor = createMinimalAudioContextConstructor(createInvalidStateError, createNotSupportedError, createUnknownError, minimalBaseAudioContextConstructor, nativeAudioContextConstructor);\nexport { minimalAudioContextConstructor as MinimalAudioContext };\nconst createNativeOfflineAudioContext = createCreateNativeOfflineAudioContext(createNotSupportedError, nativeOfflineAudioContextConstructor);\nconst startRendering = createStartRendering(audioBufferStore, cacheTestResult, getAudioNodeRenderer, getUnrenderedAudioWorkletNodes, renderNativeOfflineAudioContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds);\nconst minimalOfflineAudioContextConstructor = createMinimalOfflineAudioContextConstructor(cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, minimalBaseAudioContextConstructor, startRendering);\nexport { minimalOfflineAudioContextConstructor as MinimalOfflineAudioContext };\nconst offlineAudioContextConstructor = createOfflineAudioContextConstructor(baseAudioContextConstructor, cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, startRendering);\nexport { offlineAudioContextConstructor as OfflineAudioContext };\nexport { oscillatorNodeConstructor as OscillatorNode };\nexport { pannerNodeConstructor as PannerNode };\nexport { periodicWaveConstructor as PeriodicWave };\nexport { stereoPannerNodeConstructor as StereoPannerNode };\nexport { waveShaperNodeConstructor as WaveShaperNode };\nexport const isAnyAudioContext = createIsAnyAudioContext(CONTEXT_STORE, isNativeAudioContext);\nexport const isAnyAudioNode = createIsAnyAudioNode(AUDIO_NODE_STORE, isNativeAudioNode);\nexport const isAnyAudioParam = createIsAnyAudioParam(AUDIO_PARAM_STORE, isNativeAudioParam);\nexport const isAnyOfflineAudioContext = createIsAnyOfflineAudioContext(CONTEXT_STORE, isNativeOfflineAudioContext);\nexport const isSupported = () => createIsSupportedPromise(cacheTestResult, createTestAudioBufferCopyChannelMethodsSubarraySupport(nativeOfflineAudioContextConstructor), createTestAudioContextCloseMethodSupport(nativeAudioContextConstructor), createTestAudioContextDecodeAudioDataMethodTypeErrorSupport(nativeOfflineAudioContextConstructor), createTestAudioContextOptionsSupport(nativeAudioContextConstructor), createTestAudioNodeConnectMethodSupport(nativeOfflineAudioContextConstructor), createTestAudioWorkletProcessorNoOutputsSupport(nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor), createTestChannelMergerNodeChannelCountSupport(nativeOfflineAudioContextConstructor), createTestConstantSourceNodeAccurateSchedulingSupport(nativeOfflineAudioContextConstructor), createTestConvolverNodeBufferReassignabilitySupport(nativeOfflineAudioContextConstructor), createTestConvolverNodeChannelCountSupport(nativeOfflineAudioContextConstructor), testDomExceptionConstructorSupport, createTestIsSecureContextSupport(window), createTestMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport(nativeAudioContextConstructor), createTestStereoPannerNodeDefaultValueSupport(nativeOfflineAudioContextConstructor), testTransferablesSupport);\n//# sourceMappingURL=module.js.map","import { Gain } from \"../../core/context/Gain\";\nimport { ToneAudioNode } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\n/**\n * Volume is a simple volume node, useful for creating a volume fader.\n *\n * @example\n * const vol = new Tone.Volume(-12).toDestination();\n * const osc = new Tone.Oscillator().connect(vol).start();\n * @category Component\n */\nexport class Volume extends ToneAudioNode {\n    constructor() {\n        super(optionsFromArguments(Volume.getDefaults(), arguments, [\"volume\"]));\n        this.name = \"Volume\";\n        const options = optionsFromArguments(Volume.getDefaults(), arguments, [\"volume\"]);\n        this.input = this.output = new Gain({\n            context: this.context,\n            gain: options.volume,\n            units: \"decibels\",\n        });\n        this.volume = this.output.gain;\n        readOnly(this, \"volume\");\n        this._unmutedVolume = options.volume;\n        // set the mute initially\n        this.mute = options.mute;\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            mute: false,\n            volume: 0,\n        });\n    }\n    /**\n     * Mute the output.\n     * @example\n     * const vol = new Tone.Volume(-12).toDestination();\n     * const osc = new Tone.Oscillator().connect(vol).start();\n     * // mute the output\n     * vol.mute = true;\n     */\n    get mute() {\n        return this.volume.value === -Infinity;\n    }\n    set mute(mute) {\n        if (!this.mute && mute) {\n            this._unmutedVolume = this.volume.value;\n            // maybe it should ramp here?\n            this.volume.value = -Infinity;\n        }\n        else if (this.mute && !mute) {\n            this.volume.value = this._unmutedVolume;\n        }\n    }\n    /**\n     * clean up\n     */\n    dispose() {\n        super.dispose();\n        this.input.dispose();\n        this.volume.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=Volume.js.map","import { __awaiter } from \"tslib\";\nimport { BaseContext } from \"./BaseContext\";\nexport class DummyContext extends BaseContext {\n    constructor() {\n        super(...arguments);\n        this.lookAhead = 0;\n        this.latencyHint = 0;\n        this.isOffline = false;\n    }\n    //---------------------------\n    // BASE AUDIO CONTEXT METHODS\n    //---------------------------\n    createAnalyser() {\n        return {};\n    }\n    createOscillator() {\n        return {};\n    }\n    createBufferSource() {\n        return {};\n    }\n    createBiquadFilter() {\n        return {};\n    }\n    createBuffer(_numberOfChannels, _length, _sampleRate) {\n        return {};\n    }\n    createChannelMerger(_numberOfInputs) {\n        return {};\n    }\n    createChannelSplitter(_numberOfOutputs) {\n        return {};\n    }\n    createConstantSource() {\n        return {};\n    }\n    createConvolver() {\n        return {};\n    }\n    createDelay(_maxDelayTime) {\n        return {};\n    }\n    createDynamicsCompressor() {\n        return {};\n    }\n    createGain() {\n        return {};\n    }\n    createIIRFilter(_feedForward, _feedback) {\n        return {};\n    }\n    createPanner() {\n        return {};\n    }\n    createPeriodicWave(_real, _imag, _constraints) {\n        return {};\n    }\n    createStereoPanner() {\n        return {};\n    }\n    createWaveShaper() {\n        return {};\n    }\n    createMediaStreamSource(_stream) {\n        return {};\n    }\n    createMediaElementSource(_element) {\n        return {};\n    }\n    createMediaStreamDestination() {\n        return {};\n    }\n    decodeAudioData(_audioData) {\n        return Promise.resolve({});\n    }\n    //---------------------------\n    // TONE AUDIO CONTEXT METHODS\n    //---------------------------\n    createAudioWorkletNode(_name, _options) {\n        return {};\n    }\n    get rawContext() {\n        return {};\n    }\n    addAudioWorkletModule(_url, _name) {\n        return __awaiter(this, void 0, void 0, function* () {\n            return Promise.resolve();\n        });\n    }\n    resume() {\n        return Promise.resolve();\n    }\n    setTimeout(_fn, _timeout) {\n        return 0;\n    }\n    clearTimeout(_id) {\n        return this;\n    }\n    setInterval(_fn, _interval) {\n        return 0;\n    }\n    clearInterval(_id) {\n        return this;\n    }\n    getConstant(_val) {\n        return {};\n    }\n    get currentTime() {\n        return 0;\n    }\n    get state() {\n        return {};\n    }\n    get sampleRate() {\n        return 0;\n    }\n    get listener() {\n        return {};\n    }\n    get transport() {\n        return {};\n    }\n    get draw() {\n        return {};\n    }\n    set draw(_d) { }\n    get destination() {\n        return {};\n    }\n    set destination(_d) { }\n    now() {\n        return 0;\n    }\n    immediate() {\n        return 0;\n    }\n}\n//# sourceMappingURL=DummyContext.js.map","import { version } from \"../version\";\nimport { hasAudioContext, theWindow } from \"./context/AudioContext\";\nimport { Context } from \"./context/Context\";\nimport { DummyContext } from \"./context/DummyContext\";\nimport { OfflineContext } from \"./context/OfflineContext\";\nimport { isAudioContext, isOfflineAudioContext } from \"./util/AdvancedTypeCheck\";\n/**\n * This dummy context is used to avoid throwing immediate errors when importing in Node.js\n */\nconst dummyContext = new DummyContext();\n/**\n * The global audio context which is getable and assignable through\n * getContext and setContext\n */\nlet globalContext = dummyContext;\n/**\n * Returns the default system-wide [[Context]]\n * @category Core\n */\nexport function getContext() {\n    if (globalContext === dummyContext && hasAudioContext) {\n        setContext(new Context());\n    }\n    return globalContext;\n}\n/**\n * Set the default audio context\n * @category Core\n */\nexport function setContext(context) {\n    if (isAudioContext(context)) {\n        globalContext = new Context(context);\n    }\n    else if (isOfflineAudioContext(context)) {\n        globalContext = new OfflineContext(context);\n    }\n    else {\n        globalContext = context;\n    }\n}\n/**\n * Most browsers will not play _any_ audio until a user\n * clicks something (like a play button). Invoke this method\n * on a click or keypress event handler to start the audio context.\n * More about the Autoplay policy\n * [here](https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio)\n * @example\n * document.querySelector(\"button\").addEventListener(\"click\", async () => {\n * \tawait Tone.start();\n * \tconsole.log(\"context started\");\n * });\n * @category Core\n */\nexport function start() {\n    return globalContext.resume();\n}\n/**\n * Log Tone.js + version in the console.\n */\nif (theWindow && !theWindow.TONE_SILENCE_LOGGING) {\n    let prefix = \"v\";\n    if (version === \"dev\") {\n        prefix = \"\";\n    }\n    const printString = ` * Tone.js ${prefix}${version} * `;\n    // eslint-disable-next-line no-console\n    console.log(`%c${printString}`, \"background: #000; color: #fff\");\n}\n//# sourceMappingURL=Global.js.map","/**\n * Tone.js\n * @author Yotam Mann\n * @license http://opensource.org/licenses/MIT MIT License\n * @copyright 2014-2019 Yotam Mann\n */\nimport { version } from \"../version\";\nimport { theWindow } from \"./context/AudioContext\";\nimport { log } from \"./util/Debug\";\n/**\n * @class  Tone is the base class of all other classes.\n * @category Core\n * @constructor\n */\nexport class Tone {\n    constructor() {\n        //-------------------------------------\n        // \tDEBUGGING\n        //-------------------------------------\n        /**\n         * Set this debug flag to log all events that happen in this class.\n         */\n        this.debug = false;\n        //-------------------------------------\n        // \tDISPOSING\n        //-------------------------------------\n        /**\n         * Indicates if the instance was disposed\n         */\n        this._wasDisposed = false;\n    }\n    /**\n     * Returns all of the default options belonging to the class.\n     */\n    static getDefaults() {\n        return {};\n    }\n    /**\n     * Prints the outputs to the console log for debugging purposes.\n     * Prints the contents only if either the object has a property\n     * called `debug` set to true, or a variable called TONE_DEBUG_CLASS\n     * is set to the name of the class.\n     * @example\n     * const osc = new Tone.Oscillator();\n     * // prints all logs originating from this oscillator\n     * osc.debug = true;\n     * // calls to start/stop will print in the console\n     * osc.start();\n     */\n    log(...args) {\n        // if the object is either set to debug = true\n        // or if there is a string on the Tone.global.with the class name\n        if (this.debug || (theWindow && this.toString() === theWindow.TONE_DEBUG_CLASS)) {\n            log(this, ...args);\n        }\n    }\n    /**\n     * disconnect and dispose.\n     */\n    dispose() {\n        this._wasDisposed = true;\n        return this;\n    }\n    /**\n     * Indicates if the instance was disposed. 'Disposing' an\n     * instance means that all of the Web Audio nodes that were\n     * created for the instance are disconnected and freed for garbage collection.\n     */\n    get disposed() {\n        return this._wasDisposed;\n    }\n    /**\n     * Convert the class to a string\n     * @example\n     * const osc = new Tone.Oscillator();\n     * console.log(osc.toString());\n     */\n    toString() {\n        return this.name;\n    }\n}\n/**\n * The version number semver\n */\nTone.version = version;\n//# sourceMappingURL=Tone.js.map","import { AudioContext as stdAudioContext, AudioWorkletNode as stdAudioWorkletNode, OfflineAudioContext as stdOfflineAudioContext } from \"standardized-audio-context\";\nimport { assert } from \"../util/Debug\";\nimport { isDefined } from \"../util/TypeCheck\";\n/**\n * Create a new AudioContext\n */\nexport function createAudioContext(options) {\n    return new stdAudioContext(options);\n}\n/**\n * Create a new OfflineAudioContext\n */\nexport function createOfflineAudioContext(channels, length, sampleRate) {\n    return new stdOfflineAudioContext(channels, length, sampleRate);\n}\n/**\n * A reference to the window object\n * @hidden\n */\nexport const theWindow = typeof self === \"object\" ? self : null;\n/**\n * If the browser has a window object which has an AudioContext\n * @hidden\n */\nexport const hasAudioContext = theWindow &&\n    (theWindow.hasOwnProperty(\"AudioContext\") || theWindow.hasOwnProperty(\"webkitAudioContext\"));\nexport function createAudioWorkletNode(context, name, options) {\n    assert(isDefined(stdAudioWorkletNode), \"This node only works in a secure context (https or localhost)\");\n    // @ts-ignore\n    return new stdAudioWorkletNode(context, name, options);\n}\n/**\n * This promise resolves to a boolean which indicates if the\n * functionality is supported within the currently used browse.\n * Taken from [standardized-audio-context](https://github.com/chrisguttandin/standardized-audio-context#issupported)\n */\nexport { isSupported as supported } from \"standardized-audio-context\";\n//# sourceMappingURL=AudioContext.js.map","import { Emitter } from \"../util/Emitter\";\nexport class BaseContext extends Emitter {\n    constructor() {\n        super(...arguments);\n        this.isOffline = false;\n    }\n    /*\n     * This is a placeholder so that JSON.stringify does not throw an error\n     * This matches what JSON.stringify(audioContext) returns on a native\n     * audioContext instance.\n     */\n    toJSON() {\n        return {};\n    }\n}\n//# sourceMappingURL=BaseContext.js.map","/**\n * A class which provides a reliable callback using either\n * a Web Worker, or if that isn't supported, falls back to setTimeout.\n */\nexport class Ticker {\n    constructor(callback, type, updateInterval) {\n        this._callback = callback;\n        this._type = type;\n        this._updateInterval = updateInterval;\n        // create the clock source for the first time\n        this._createClock();\n    }\n    /**\n     * Generate a web worker\n     */\n    _createWorker() {\n        const blob = new Blob([\n            /* javascript */ `\n\t\t\t// the initial timeout time\n\t\t\tlet timeoutTime =  ${(this._updateInterval * 1000).toFixed(1)};\n\t\t\t// onmessage callback\n\t\t\tself.onmessage = function(msg){\n\t\t\t\ttimeoutTime = parseInt(msg.data);\n\t\t\t};\n\t\t\t// the tick function which posts a message\n\t\t\t// and schedules a new tick\n\t\t\tfunction tick(){\n\t\t\t\tsetTimeout(tick, timeoutTime);\n\t\t\t\tself.postMessage('tick');\n\t\t\t}\n\t\t\t// call tick initially\n\t\t\ttick();\n\t\t\t`\n        ], { type: \"text/javascript\" });\n        const blobUrl = URL.createObjectURL(blob);\n        const worker = new Worker(blobUrl);\n        worker.onmessage = this._callback.bind(this);\n        this._worker = worker;\n    }\n    /**\n     * Create a timeout loop\n     */\n    _createTimeout() {\n        this._timeout = setTimeout(() => {\n            this._createTimeout();\n            this._callback();\n        }, this._updateInterval * 1000);\n    }\n    /**\n     * Create the clock source.\n     */\n    _createClock() {\n        if (this._type === \"worker\") {\n            try {\n                this._createWorker();\n            }\n            catch (e) {\n                // workers not supported, fallback to timeout\n                this._type = \"timeout\";\n                this._createClock();\n            }\n        }\n        else if (this._type === \"timeout\") {\n            this._createTimeout();\n        }\n    }\n    /**\n     * Clean up the current clock source\n     */\n    _disposeClock() {\n        if (this._timeout) {\n            clearTimeout(this._timeout);\n            this._timeout = 0;\n        }\n        if (this._worker) {\n            this._worker.terminate();\n            this._worker.onmessage = null;\n        }\n    }\n    /**\n     * The rate in seconds the ticker will update\n     */\n    get updateInterval() {\n        return this._updateInterval;\n    }\n    set updateInterval(interval) {\n        this._updateInterval = Math.max(interval, 128 / 44100);\n        if (this._type === \"worker\") {\n            this._worker.postMessage(Math.max(interval * 1000, 1));\n        }\n    }\n    /**\n     * The type of the ticker, either a worker or a timeout\n     */\n    get type() {\n        return this._type;\n    }\n    set type(type) {\n        this._disposeClock();\n        this._type = type;\n        this._createClock();\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        this._disposeClock();\n    }\n}\n//# sourceMappingURL=Ticker.js.map","import { __awaiter } from \"tslib\";\nimport { Ticker } from \"../clock/Ticker\";\nimport { isAudioContext } from \"../util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isDefined, isString } from \"../util/TypeCheck\";\nimport { createAudioContext, createAudioWorkletNode, } from \"./AudioContext\";\nimport { closeContext, initializeContext } from \"./ContextInitialization\";\nimport { BaseContext } from \"./BaseContext\";\nimport { assert } from \"../util/Debug\";\n/**\n * Wrapper around the native AudioContext.\n * @category Core\n */\nexport class Context extends BaseContext {\n    constructor() {\n        super();\n        this.name = \"Context\";\n        /**\n         * An object containing all of the constants AudioBufferSourceNodes\n         */\n        this._constants = new Map();\n        /**\n         * All of the setTimeout events.\n         */\n        this._timeouts = new Timeline();\n        /**\n         * The timeout id counter\n         */\n        this._timeoutIds = 0;\n        /**\n         * Private indicator if the context has been initialized\n         */\n        this._initialized = false;\n        /**\n         * Indicates if the context is an OfflineAudioContext or an AudioContext\n         */\n        this.isOffline = false;\n        //--------------------------------------------\n        // AUDIO WORKLET\n        //--------------------------------------------\n        /**\n         * Maps a module name to promise of the addModule method\n         */\n        this._workletModules = new Map();\n        const options = optionsFromArguments(Context.getDefaults(), arguments, [\n            \"context\",\n        ]);\n        if (options.context) {\n            this._context = options.context;\n        }\n        else {\n            this._context = createAudioContext({\n                latencyHint: options.latencyHint,\n            });\n        }\n        this._ticker = new Ticker(this.emit.bind(this, \"tick\"), options.clockSource, options.updateInterval);\n        this.on(\"tick\", this._timeoutLoop.bind(this));\n        // fwd events from the context\n        this._context.onstatechange = () => {\n            this.emit(\"statechange\", this.state);\n        };\n        this._setLatencyHint(options.latencyHint);\n        this.lookAhead = options.lookAhead;\n    }\n    static getDefaults() {\n        return {\n            clockSource: \"worker\",\n            latencyHint: \"interactive\",\n            lookAhead: 0.1,\n            updateInterval: 0.05,\n        };\n    }\n    /**\n     * Finish setting up the context. **You usually do not need to do this manually.**\n     */\n    initialize() {\n        if (!this._initialized) {\n            // add any additional modules\n            initializeContext(this);\n            this._initialized = true;\n        }\n        return this;\n    }\n    //---------------------------\n    // BASE AUDIO CONTEXT METHODS\n    //---------------------------\n    createAnalyser() {\n        return this._context.createAnalyser();\n    }\n    createOscillator() {\n        return this._context.createOscillator();\n    }\n    createBufferSource() {\n        return this._context.createBufferSource();\n    }\n    createBiquadFilter() {\n        return this._context.createBiquadFilter();\n    }\n    createBuffer(numberOfChannels, length, sampleRate) {\n        return this._context.createBuffer(numberOfChannels, length, sampleRate);\n    }\n    createChannelMerger(numberOfInputs) {\n        return this._context.createChannelMerger(numberOfInputs);\n    }\n    createChannelSplitter(numberOfOutputs) {\n        return this._context.createChannelSplitter(numberOfOutputs);\n    }\n    createConstantSource() {\n        return this._context.createConstantSource();\n    }\n    createConvolver() {\n        return this._context.createConvolver();\n    }\n    createDelay(maxDelayTime) {\n        return this._context.createDelay(maxDelayTime);\n    }\n    createDynamicsCompressor() {\n        return this._context.createDynamicsCompressor();\n    }\n    createGain() {\n        return this._context.createGain();\n    }\n    createIIRFilter(feedForward, feedback) {\n        // @ts-ignore\n        return this._context.createIIRFilter(feedForward, feedback);\n    }\n    createPanner() {\n        return this._context.createPanner();\n    }\n    createPeriodicWave(real, imag, constraints) {\n        return this._context.createPeriodicWave(real, imag, constraints);\n    }\n    createStereoPanner() {\n        return this._context.createStereoPanner();\n    }\n    createWaveShaper() {\n        return this._context.createWaveShaper();\n    }\n    createMediaStreamSource(stream) {\n        assert(isAudioContext(this._context), \"Not available if OfflineAudioContext\");\n        const context = this._context;\n        return context.createMediaStreamSource(stream);\n    }\n    createMediaElementSource(element) {\n        assert(isAudioContext(this._context), \"Not available if OfflineAudioContext\");\n        const context = this._context;\n        return context.createMediaElementSource(element);\n    }\n    createMediaStreamDestination() {\n        assert(isAudioContext(this._context), \"Not available if OfflineAudioContext\");\n        const context = this._context;\n        return context.createMediaStreamDestination();\n    }\n    decodeAudioData(audioData) {\n        return this._context.decodeAudioData(audioData);\n    }\n    /**\n     * The current time in seconds of the AudioContext.\n     */\n    get currentTime() {\n        return this._context.currentTime;\n    }\n    /**\n     * The current time in seconds of the AudioContext.\n     */\n    get state() {\n        return this._context.state;\n    }\n    /**\n     * The current time in seconds of the AudioContext.\n     */\n    get sampleRate() {\n        return this._context.sampleRate;\n    }\n    /**\n     * The listener\n     */\n    get listener() {\n        this.initialize();\n        return this._listener;\n    }\n    set listener(l) {\n        assert(!this._initialized, \"The listener cannot be set after initialization.\");\n        this._listener = l;\n    }\n    /**\n     * There is only one Transport per Context. It is created on initialization.\n     */\n    get transport() {\n        this.initialize();\n        return this._transport;\n    }\n    set transport(t) {\n        assert(!this._initialized, \"The transport cannot be set after initialization.\");\n        this._transport = t;\n    }\n    /**\n     * This is the Draw object for the context which is useful for synchronizing the draw frame with the Tone.js clock.\n     */\n    get draw() {\n        this.initialize();\n        return this._draw;\n    }\n    set draw(d) {\n        assert(!this._initialized, \"Draw cannot be set after initialization.\");\n        this._draw = d;\n    }\n    /**\n     * A reference to the Context's destination node.\n     */\n    get destination() {\n        this.initialize();\n        return this._destination;\n    }\n    set destination(d) {\n        assert(!this._initialized, \"The destination cannot be set after initialization.\");\n        this._destination = d;\n    }\n    /**\n     * Create an audio worklet node from a name and options. The module\n     * must first be loaded using [[addAudioWorkletModule]].\n     */\n    createAudioWorkletNode(name, options) {\n        return createAudioWorkletNode(this.rawContext, name, options);\n    }\n    /**\n     * Add an AudioWorkletProcessor module\n     * @param url The url of the module\n     * @param name The name of the module\n     */\n    addAudioWorkletModule(url, name) {\n        return __awaiter(this, void 0, void 0, function* () {\n            assert(isDefined(this.rawContext.audioWorklet), \"AudioWorkletNode is only available in a secure context (https or localhost)\");\n            if (!this._workletModules.has(name)) {\n                this._workletModules.set(name, this.rawContext.audioWorklet.addModule(url));\n            }\n            yield this._workletModules.get(name);\n        });\n    }\n    /**\n     * Returns a promise which resolves when all of the worklets have been loaded on this context\n     */\n    workletsAreReady() {\n        return __awaiter(this, void 0, void 0, function* () {\n            const promises = [];\n            this._workletModules.forEach((promise) => promises.push(promise));\n            yield Promise.all(promises);\n        });\n    }\n    //---------------------------\n    // TICKER\n    //---------------------------\n    /**\n     * How often the interval callback is invoked.\n     * This number corresponds to how responsive the scheduling\n     * can be. context.updateInterval + context.lookAhead gives you the\n     * total latency between scheduling an event and hearing it.\n     */\n    get updateInterval() {\n        return this._ticker.updateInterval;\n    }\n    set updateInterval(interval) {\n        this._ticker.updateInterval = interval;\n    }\n    /**\n     * What the source of the clock is, either \"worker\" (default),\n     * \"timeout\", or \"offline\" (none).\n     */\n    get clockSource() {\n        return this._ticker.type;\n    }\n    set clockSource(type) {\n        this._ticker.type = type;\n    }\n    /**\n     * The type of playback, which affects tradeoffs between audio\n     * output latency and responsiveness.\n     * In addition to setting the value in seconds, the latencyHint also\n     * accepts the strings \"interactive\" (prioritizes low latency),\n     * \"playback\" (prioritizes sustained playback), \"balanced\" (balances\n     * latency and performance).\n     * @example\n     * // prioritize sustained playback\n     * const context = new Tone.Context({ latencyHint: \"playback\" });\n     * // set this context as the global Context\n     * Tone.setContext(context);\n     * // the global context is gettable with Tone.getContext()\n     * console.log(Tone.getContext().latencyHint);\n     */\n    get latencyHint() {\n        return this._latencyHint;\n    }\n    /**\n     * Update the lookAhead and updateInterval based on the latencyHint\n     */\n    _setLatencyHint(hint) {\n        let lookAheadValue = 0;\n        this._latencyHint = hint;\n        if (isString(hint)) {\n            switch (hint) {\n                case \"interactive\":\n                    lookAheadValue = 0.1;\n                    break;\n                case \"playback\":\n                    lookAheadValue = 0.5;\n                    break;\n                case \"balanced\":\n                    lookAheadValue = 0.25;\n                    break;\n            }\n        }\n        this.lookAhead = lookAheadValue;\n        this.updateInterval = lookAheadValue / 2;\n    }\n    /**\n     * The unwrapped AudioContext or OfflineAudioContext\n     */\n    get rawContext() {\n        return this._context;\n    }\n    /**\n     * The current audio context time plus a short [[lookAhead]].\n     */\n    now() {\n        return this._context.currentTime + this.lookAhead;\n    }\n    /**\n     * The current audio context time without the [[lookAhead]].\n     * In most cases it is better to use [[now]] instead of [[immediate]] since\n     * with [[now]] the [[lookAhead]] is applied equally to _all_ components including internal components,\n     * to making sure that everything is scheduled in sync. Mixing [[now]] and [[immediate]]\n     * can cause some timing issues. If no lookAhead is desired, you can set the [[lookAhead]] to `0`.\n     */\n    immediate() {\n        return this._context.currentTime;\n    }\n    /**\n     * Starts the audio context from a suspended state. This is required\n     * to initially start the AudioContext. See [[Tone.start]]\n     */\n    resume() {\n        if (isAudioContext(this._context)) {\n            return this._context.resume();\n        }\n        else {\n            return Promise.resolve();\n        }\n    }\n    /**\n     * Close the context. Once closed, the context can no longer be used and\n     * any AudioNodes created from the context will be silent.\n     */\n    close() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (isAudioContext(this._context)) {\n                yield this._context.close();\n            }\n            if (this._initialized) {\n                closeContext(this);\n            }\n        });\n    }\n    /**\n     * **Internal** Generate a looped buffer at some constant value.\n     */\n    getConstant(val) {\n        if (this._constants.has(val)) {\n            return this._constants.get(val);\n        }\n        else {\n            const buffer = this._context.createBuffer(1, 128, this._context.sampleRate);\n            const arr = buffer.getChannelData(0);\n            for (let i = 0; i < arr.length; i++) {\n                arr[i] = val;\n            }\n            const constant = this._context.createBufferSource();\n            constant.channelCount = 1;\n            constant.channelCountMode = \"explicit\";\n            constant.buffer = buffer;\n            constant.loop = true;\n            constant.start(0);\n            this._constants.set(val, constant);\n            return constant;\n        }\n    }\n    /**\n     * Clean up. Also closes the audio context.\n     */\n    dispose() {\n        super.dispose();\n        this._ticker.dispose();\n        this._timeouts.dispose();\n        Object.keys(this._constants).map((val) => this._constants[val].disconnect());\n        return this;\n    }\n    //---------------------------\n    // TIMEOUTS\n    //---------------------------\n    /**\n     * The private loop which keeps track of the context scheduled timeouts\n     * Is invoked from the clock source\n     */\n    _timeoutLoop() {\n        const now = this.now();\n        let firstEvent = this._timeouts.peek();\n        while (this._timeouts.length && firstEvent && firstEvent.time <= now) {\n            // invoke the callback\n            firstEvent.callback();\n            // shift the first event off\n            this._timeouts.shift();\n            // get the next one\n            firstEvent = this._timeouts.peek();\n        }\n    }\n    /**\n     * A setTimeout which is guaranteed by the clock source.\n     * Also runs in the offline context.\n     * @param  fn       The callback to invoke\n     * @param  timeout  The timeout in seconds\n     * @returns ID to use when invoking Context.clearTimeout\n     */\n    setTimeout(fn, timeout) {\n        this._timeoutIds++;\n        const now = this.now();\n        this._timeouts.add({\n            callback: fn,\n            id: this._timeoutIds,\n            time: now + timeout,\n        });\n        return this._timeoutIds;\n    }\n    /**\n     * Clears a previously scheduled timeout with Tone.context.setTimeout\n     * @param  id  The ID returned from setTimeout\n     */\n    clearTimeout(id) {\n        this._timeouts.forEach((event) => {\n            if (event.id === id) {\n                this._timeouts.remove(event);\n            }\n        });\n        return this;\n    }\n    /**\n     * Clear the function scheduled by [[setInterval]]\n     */\n    clearInterval(id) {\n        return this.clearTimeout(id);\n    }\n    /**\n     * Adds a repeating event to the context's callback clock\n     */\n    setInterval(fn, interval) {\n        const id = ++this._timeoutIds;\n        const intervalFn = () => {\n            const now = this.now();\n            this._timeouts.add({\n                callback: () => {\n                    // invoke the callback\n                    fn();\n                    // invoke the event to repeat it\n                    intervalFn();\n                },\n                id,\n                time: now + interval,\n            });\n        };\n        // kick it off\n        intervalFn();\n        return id;\n    }\n}\n//# sourceMappingURL=Context.js.map","//-------------------------------------\n// INITIALIZING NEW CONTEXT\n//-------------------------------------\n/**\n * Array of callbacks to invoke when a new context is created\n */\nconst notifyNewContext = [];\n/**\n * Used internally to setup a new Context\n */\nexport function onContextInit(cb) {\n    notifyNewContext.push(cb);\n}\n/**\n * Invoke any classes which need to also be initialized when a new context is created.\n */\nexport function initializeContext(ctx) {\n    // add any additional modules\n    notifyNewContext.forEach(cb => cb(ctx));\n}\n/**\n * Array of callbacks to invoke when a new context is created\n */\nconst notifyCloseContext = [];\n/**\n * Used internally to tear down a Context\n */\nexport function onContextClose(cb) {\n    notifyCloseContext.push(cb);\n}\nexport function closeContext(ctx) {\n    // add any additional modules\n    notifyCloseContext.forEach(cb => cb(ctx));\n}\n//# sourceMappingURL=ContextInitialization.js.map","import { Param } from \"../context/Param\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { readOnly } from \"../util/Interface\";\nimport { ToneAudioNode } from \"./ToneAudioNode\";\n/**\n * A thin wrapper around the Native Web Audio GainNode.\n * The GainNode is a basic building block of the Web Audio\n * API and is useful for routing audio and adjusting gains.\n * @category Core\n * @example\n * return Tone.Offline(() => {\n * \tconst gainNode = new Tone.Gain(0).toDestination();\n * \tconst osc = new Tone.Oscillator(30).connect(gainNode).start();\n * \tgainNode.gain.rampTo(1, 0.1);\n * \tgainNode.gain.rampTo(0, 0.4, 0.2);\n * }, 0.7, 1);\n */\nexport class Gain extends ToneAudioNode {\n    constructor() {\n        super(optionsFromArguments(Gain.getDefaults(), arguments, [\"gain\", \"units\"]));\n        this.name = \"Gain\";\n        /**\n         * The wrapped GainNode.\n         */\n        this._gainNode = this.context.createGain();\n        // input = output\n        this.input = this._gainNode;\n        this.output = this._gainNode;\n        const options = optionsFromArguments(Gain.getDefaults(), arguments, [\"gain\", \"units\"]);\n        this.gain = new Param({\n            context: this.context,\n            convert: options.convert,\n            param: this._gainNode.gain,\n            units: options.units,\n            value: options.gain,\n            minValue: options.minValue,\n            maxValue: options.maxValue,\n        });\n        readOnly(this, \"gain\");\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            convert: true,\n            gain: 1,\n            units: \"gain\",\n        });\n    }\n    /**\n     * Clean up.\n     */\n    dispose() {\n        super.dispose();\n        this._gainNode.disconnect();\n        this.gain.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=Gain.js.map","import { __awaiter } from \"tslib\";\nimport { createOfflineAudioContext } from \"../context/AudioContext\";\nimport { Context } from \"../context/Context\";\nimport { isOfflineAudioContext } from \"../util/AdvancedTypeCheck\";\nimport { ToneAudioBuffer } from \"./ToneAudioBuffer\";\n/**\n * Wrapper around the OfflineAudioContext\n * @category Core\n * @example\n * // generate a single channel, 0.5 second buffer\n * const context = new Tone.OfflineContext(1, 0.5, 44100);\n * const osc = new Tone.Oscillator({ context });\n * context.render().then(buffer => {\n * \tconsole.log(buffer.numberOfChannels, buffer.duration);\n * });\n */\nexport class OfflineContext extends Context {\n    constructor() {\n        super({\n            clockSource: \"offline\",\n            context: isOfflineAudioContext(arguments[0]) ?\n                arguments[0] : createOfflineAudioContext(arguments[0], arguments[1] * arguments[2], arguments[2]),\n            lookAhead: 0,\n            updateInterval: isOfflineAudioContext(arguments[0]) ?\n                128 / arguments[0].sampleRate : 128 / arguments[2],\n        });\n        this.name = \"OfflineContext\";\n        /**\n         * An artificial clock source\n         */\n        this._currentTime = 0;\n        this.isOffline = true;\n        this._duration = isOfflineAudioContext(arguments[0]) ?\n            arguments[0].length / arguments[0].sampleRate : arguments[1];\n    }\n    /**\n     * Override the now method to point to the internal clock time\n     */\n    now() {\n        return this._currentTime;\n    }\n    /**\n     * Same as this.now()\n     */\n    get currentTime() {\n        return this._currentTime;\n    }\n    /**\n     * Render just the clock portion of the audio context.\n     */\n    _renderClock(asynchronous) {\n        return __awaiter(this, void 0, void 0, function* () {\n            let index = 0;\n            while (this._duration - this._currentTime >= 0) {\n                // invoke all the callbacks on that time\n                this.emit(\"tick\");\n                // increment the clock in block-sized chunks\n                this._currentTime += 128 / this.sampleRate;\n                // yield once a second of audio\n                index++;\n                const yieldEvery = Math.floor(this.sampleRate / 128);\n                if (asynchronous && index % yieldEvery === 0) {\n                    yield new Promise(done => setTimeout(done, 1));\n                }\n            }\n        });\n    }\n    /**\n     * Render the output of the OfflineContext\n     * @param asynchronous If the clock should be rendered asynchronously, which will not block the main thread, but be slightly slower.\n     */\n    render(asynchronous = true) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.workletsAreReady();\n            yield this._renderClock(asynchronous);\n            const buffer = yield this._context.startRendering();\n            return new ToneAudioBuffer(buffer);\n        });\n    }\n    /**\n     * Close the context\n     */\n    close() {\n        return Promise.resolve();\n    }\n}\n//# sourceMappingURL=OfflineContext.js.map","import { dbToGain, gainToDb } from \"../type/Conversions\";\nimport { isAudioParam } from \"../util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isDefined } from \"../util/TypeCheck\";\nimport { ToneWithContext } from \"./ToneWithContext\";\nimport { EQ } from \"../util/Math\";\nimport { assert, assertRange } from \"../util/Debug\";\n/**\n * Param wraps the native Web Audio's AudioParam to provide\n * additional unit conversion functionality. It also\n * serves as a base-class for classes which have a single,\n * automatable parameter.\n * @category Core\n */\nexport class Param extends ToneWithContext {\n    constructor() {\n        super(optionsFromArguments(Param.getDefaults(), arguments, [\"param\", \"units\", \"convert\"]));\n        this.name = \"Param\";\n        this.overridden = false;\n        /**\n         * The minimum output value\n         */\n        this._minOutput = 1e-7;\n        const options = optionsFromArguments(Param.getDefaults(), arguments, [\"param\", \"units\", \"convert\"]);\n        assert(isDefined(options.param) &&\n            (isAudioParam(options.param) || options.param instanceof Param), \"param must be an AudioParam\");\n        while (!isAudioParam(options.param)) {\n            options.param = options.param._param;\n        }\n        this._swappable = isDefined(options.swappable) ? options.swappable : false;\n        if (this._swappable) {\n            this.input = this.context.createGain();\n            // initialize\n            this._param = options.param;\n            this.input.connect(this._param);\n        }\n        else {\n            this._param = this.input = options.param;\n        }\n        this._events = new Timeline(1000);\n        this._initialValue = this._param.defaultValue;\n        this.units = options.units;\n        this.convert = options.convert;\n        this._minValue = options.minValue;\n        this._maxValue = options.maxValue;\n        // if the value is defined, set it immediately\n        if (isDefined(options.value) && options.value !== this._toType(this._initialValue)) {\n            this.setValueAtTime(options.value, 0);\n        }\n    }\n    static getDefaults() {\n        return Object.assign(ToneWithContext.getDefaults(), {\n            convert: true,\n            units: \"number\",\n        });\n    }\n    get value() {\n        const now = this.now();\n        return this.getValueAtTime(now);\n    }\n    set value(value) {\n        this.cancelScheduledValues(this.now());\n        this.setValueAtTime(value, this.now());\n    }\n    get minValue() {\n        // if it's not the default minValue, return it\n        if (isDefined(this._minValue)) {\n            return this._minValue;\n        }\n        else if (this.units === \"time\" || this.units === \"frequency\" ||\n            this.units === \"normalRange\" || this.units === \"positive\" ||\n            this.units === \"transportTime\" || this.units === \"ticks\" ||\n            this.units === \"bpm\" || this.units === \"hertz\" || this.units === \"samples\") {\n            return 0;\n        }\n        else if (this.units === \"audioRange\") {\n            return -1;\n        }\n        else if (this.units === \"decibels\") {\n            return -Infinity;\n        }\n        else {\n            return this._param.minValue;\n        }\n    }\n    get maxValue() {\n        if (isDefined(this._maxValue)) {\n            return this._maxValue;\n        }\n        else if (this.units === \"normalRange\" ||\n            this.units === \"audioRange\") {\n            return 1;\n        }\n        else {\n            return this._param.maxValue;\n        }\n    }\n    /**\n     * Type guard based on the unit name\n     */\n    _is(arg, type) {\n        return this.units === type;\n    }\n    /**\n     * Make sure the value is always in the defined range\n     */\n    _assertRange(value) {\n        if (isDefined(this.maxValue) && isDefined(this.minValue)) {\n            assertRange(value, this._fromType(this.minValue), this._fromType(this.maxValue));\n        }\n        return value;\n    }\n    /**\n     * Convert the given value from the type specified by Param.units\n     * into the destination value (such as Gain or Frequency).\n     */\n    _fromType(val) {\n        if (this.convert && !this.overridden) {\n            if (this._is(val, \"time\")) {\n                return this.toSeconds(val);\n            }\n            else if (this._is(val, \"decibels\")) {\n                return dbToGain(val);\n            }\n            else if (this._is(val, \"frequency\")) {\n                return this.toFrequency(val);\n            }\n            else {\n                return val;\n            }\n        }\n        else if (this.overridden) {\n            // if it's overridden, should only schedule 0s\n            return 0;\n        }\n        else {\n            return val;\n        }\n    }\n    /**\n     * Convert the parameters value into the units specified by Param.units.\n     */\n    _toType(val) {\n        if (this.convert && this.units === \"decibels\") {\n            return gainToDb(val);\n        }\n        else {\n            return val;\n        }\n    }\n    //-------------------------------------\n    // ABSTRACT PARAM INTERFACE\n    // all docs are generated from ParamInterface.ts\n    //-------------------------------------\n    setValueAtTime(value, time) {\n        const computedTime = this.toSeconds(time);\n        const numericValue = this._fromType(value);\n        assert(isFinite(numericValue) && isFinite(computedTime), `Invalid argument(s) to setValueAtTime: ${JSON.stringify(value)}, ${JSON.stringify(time)}`);\n        this._assertRange(numericValue);\n        this.log(this.units, \"setValueAtTime\", value, computedTime);\n        this._events.add({\n            time: computedTime,\n            type: \"setValueAtTime\",\n            value: numericValue,\n        });\n        this._param.setValueAtTime(numericValue, computedTime);\n        return this;\n    }\n    getValueAtTime(time) {\n        const computedTime = Math.max(this.toSeconds(time), 0);\n        const after = this._events.getAfter(computedTime);\n        const before = this._events.get(computedTime);\n        let value = this._initialValue;\n        // if it was set by\n        if (before === null) {\n            value = this._initialValue;\n        }\n        else if (before.type === \"setTargetAtTime\" && (after === null || after.type === \"setValueAtTime\")) {\n            const previous = this._events.getBefore(before.time);\n            let previousVal;\n            if (previous === null) {\n                previousVal = this._initialValue;\n            }\n            else {\n                previousVal = previous.value;\n            }\n            if (before.type === \"setTargetAtTime\") {\n                value = this._exponentialApproach(before.time, previousVal, before.value, before.constant, computedTime);\n            }\n        }\n        else if (after === null) {\n            value = before.value;\n        }\n        else if (after.type === \"linearRampToValueAtTime\" || after.type === \"exponentialRampToValueAtTime\") {\n            let beforeValue = before.value;\n            if (before.type === \"setTargetAtTime\") {\n                const previous = this._events.getBefore(before.time);\n                if (previous === null) {\n                    beforeValue = this._initialValue;\n                }\n                else {\n                    beforeValue = previous.value;\n                }\n            }\n            if (after.type === \"linearRampToValueAtTime\") {\n                value = this._linearInterpolate(before.time, beforeValue, after.time, after.value, computedTime);\n            }\n            else {\n                value = this._exponentialInterpolate(before.time, beforeValue, after.time, after.value, computedTime);\n            }\n        }\n        else {\n            value = before.value;\n        }\n        return this._toType(value);\n    }\n    setRampPoint(time) {\n        time = this.toSeconds(time);\n        let currentVal = this.getValueAtTime(time);\n        this.cancelAndHoldAtTime(time);\n        if (this._fromType(currentVal) === 0) {\n            currentVal = this._toType(this._minOutput);\n        }\n        this.setValueAtTime(currentVal, time);\n        return this;\n    }\n    linearRampToValueAtTime(value, endTime) {\n        const numericValue = this._fromType(value);\n        const computedTime = this.toSeconds(endTime);\n        assert(isFinite(numericValue) && isFinite(computedTime), `Invalid argument(s) to linearRampToValueAtTime: ${JSON.stringify(value)}, ${JSON.stringify(endTime)}`);\n        this._assertRange(numericValue);\n        this._events.add({\n            time: computedTime,\n            type: \"linearRampToValueAtTime\",\n            value: numericValue,\n        });\n        this.log(this.units, \"linearRampToValueAtTime\", value, computedTime);\n        this._param.linearRampToValueAtTime(numericValue, computedTime);\n        return this;\n    }\n    exponentialRampToValueAtTime(value, endTime) {\n        let numericValue = this._fromType(value);\n        // the value can't be 0\n        numericValue = EQ(numericValue, 0) ? this._minOutput : numericValue;\n        this._assertRange(numericValue);\n        const computedTime = this.toSeconds(endTime);\n        assert(isFinite(numericValue) && isFinite(computedTime), `Invalid argument(s) to exponentialRampToValueAtTime: ${JSON.stringify(value)}, ${JSON.stringify(endTime)}`);\n        // store the event\n        this._events.add({\n            time: computedTime,\n            type: \"exponentialRampToValueAtTime\",\n            value: numericValue,\n        });\n        this.log(this.units, \"exponentialRampToValueAtTime\", value, computedTime);\n        this._param.exponentialRampToValueAtTime(numericValue, computedTime);\n        return this;\n    }\n    exponentialRampTo(value, rampTime, startTime) {\n        startTime = this.toSeconds(startTime);\n        this.setRampPoint(startTime);\n        this.exponentialRampToValueAtTime(value, startTime + this.toSeconds(rampTime));\n        return this;\n    }\n    linearRampTo(value, rampTime, startTime) {\n        startTime = this.toSeconds(startTime);\n        this.setRampPoint(startTime);\n        this.linearRampToValueAtTime(value, startTime + this.toSeconds(rampTime));\n        return this;\n    }\n    targetRampTo(value, rampTime, startTime) {\n        startTime = this.toSeconds(startTime);\n        this.setRampPoint(startTime);\n        this.exponentialApproachValueAtTime(value, startTime, rampTime);\n        return this;\n    }\n    exponentialApproachValueAtTime(value, time, rampTime) {\n        time = this.toSeconds(time);\n        rampTime = this.toSeconds(rampTime);\n        const timeConstant = Math.log(rampTime + 1) / Math.log(200);\n        this.setTargetAtTime(value, time, timeConstant);\n        // at 90% start a linear ramp to the final value\n        this.cancelAndHoldAtTime(time + rampTime * 0.9);\n        this.linearRampToValueAtTime(value, time + rampTime);\n        return this;\n    }\n    setTargetAtTime(value, startTime, timeConstant) {\n        const numericValue = this._fromType(value);\n        // The value will never be able to approach without timeConstant > 0.\n        assert(isFinite(timeConstant) && timeConstant > 0, \"timeConstant must be a number greater than 0\");\n        const computedTime = this.toSeconds(startTime);\n        this._assertRange(numericValue);\n        assert(isFinite(numericValue) && isFinite(computedTime), `Invalid argument(s) to setTargetAtTime: ${JSON.stringify(value)}, ${JSON.stringify(startTime)}`);\n        this._events.add({\n            constant: timeConstant,\n            time: computedTime,\n            type: \"setTargetAtTime\",\n            value: numericValue,\n        });\n        this.log(this.units, \"setTargetAtTime\", value, computedTime, timeConstant);\n        this._param.setTargetAtTime(numericValue, computedTime, timeConstant);\n        return this;\n    }\n    setValueCurveAtTime(values, startTime, duration, scaling = 1) {\n        duration = this.toSeconds(duration);\n        startTime = this.toSeconds(startTime);\n        const startingValue = this._fromType(values[0]) * scaling;\n        this.setValueAtTime(this._toType(startingValue), startTime);\n        const segTime = duration / (values.length - 1);\n        for (let i = 1; i < values.length; i++) {\n            const numericValue = this._fromType(values[i]) * scaling;\n            this.linearRampToValueAtTime(this._toType(numericValue), startTime + i * segTime);\n        }\n        return this;\n    }\n    cancelScheduledValues(time) {\n        const computedTime = this.toSeconds(time);\n        assert(isFinite(computedTime), `Invalid argument to cancelScheduledValues: ${JSON.stringify(time)}`);\n        this._events.cancel(computedTime);\n        this._param.cancelScheduledValues(computedTime);\n        this.log(this.units, \"cancelScheduledValues\", computedTime);\n        return this;\n    }\n    cancelAndHoldAtTime(time) {\n        const computedTime = this.toSeconds(time);\n        const valueAtTime = this._fromType(this.getValueAtTime(computedTime));\n        // remove the schedule events\n        assert(isFinite(computedTime), `Invalid argument to cancelAndHoldAtTime: ${JSON.stringify(time)}`);\n        this.log(this.units, \"cancelAndHoldAtTime\", computedTime, \"value=\" + valueAtTime);\n        // if there is an event at the given computedTime\n        // and that even is not a \"set\"\n        const before = this._events.get(computedTime);\n        const after = this._events.getAfter(computedTime);\n        if (before && EQ(before.time, computedTime)) {\n            // remove everything after\n            if (after) {\n                this._param.cancelScheduledValues(after.time);\n                this._events.cancel(after.time);\n            }\n            else {\n                this._param.cancelAndHoldAtTime(computedTime);\n                this._events.cancel(computedTime + this.sampleTime);\n            }\n        }\n        else if (after) {\n            this._param.cancelScheduledValues(after.time);\n            // cancel the next event(s)\n            this._events.cancel(after.time);\n            if (after.type === \"linearRampToValueAtTime\") {\n                this.linearRampToValueAtTime(this._toType(valueAtTime), computedTime);\n            }\n            else if (after.type === \"exponentialRampToValueAtTime\") {\n                this.exponentialRampToValueAtTime(this._toType(valueAtTime), computedTime);\n            }\n        }\n        // set the value at the given time\n        this._events.add({\n            time: computedTime,\n            type: \"setValueAtTime\",\n            value: valueAtTime,\n        });\n        this._param.setValueAtTime(valueAtTime, computedTime);\n        return this;\n    }\n    rampTo(value, rampTime = 0.1, startTime) {\n        if (this.units === \"frequency\" || this.units === \"bpm\" || this.units === \"decibels\") {\n            this.exponentialRampTo(value, rampTime, startTime);\n        }\n        else {\n            this.linearRampTo(value, rampTime, startTime);\n        }\n        return this;\n    }\n    /**\n     * Apply all of the previously scheduled events to the passed in Param or AudioParam.\n     * The applied values will start at the context's current time and schedule\n     * all of the events which are scheduled on this Param onto the passed in param.\n     */\n    apply(param) {\n        const now = this.context.currentTime;\n        // set the param's value at the current time and schedule everything else\n        param.setValueAtTime(this.getValueAtTime(now), now);\n        // if the previous event was a curve, then set the rest of it\n        const previousEvent = this._events.get(now);\n        if (previousEvent && previousEvent.type === \"setTargetAtTime\") {\n            // approx it until the next event with linear ramps\n            const nextEvent = this._events.getAfter(previousEvent.time);\n            // or for 2 seconds if there is no event\n            const endTime = nextEvent ? nextEvent.time : now + 2;\n            const subdivisions = (endTime - now) / 10;\n            for (let i = now; i < endTime; i += subdivisions) {\n                param.linearRampToValueAtTime(this.getValueAtTime(i), i);\n            }\n        }\n        this._events.forEachAfter(this.context.currentTime, event => {\n            if (event.type === \"cancelScheduledValues\") {\n                param.cancelScheduledValues(event.time);\n            }\n            else if (event.type === \"setTargetAtTime\") {\n                param.setTargetAtTime(event.value, event.time, event.constant);\n            }\n            else {\n                param[event.type](event.value, event.time);\n            }\n        });\n        return this;\n    }\n    /**\n     * Replace the Param's internal AudioParam. Will apply scheduled curves\n     * onto the parameter and replace the connections.\n     */\n    setParam(param) {\n        assert(this._swappable, \"The Param must be assigned as 'swappable' in the constructor\");\n        const input = this.input;\n        input.disconnect(this._param);\n        this.apply(param);\n        this._param = param;\n        input.connect(this._param);\n        return this;\n    }\n    dispose() {\n        super.dispose();\n        this._events.dispose();\n        return this;\n    }\n    get defaultValue() {\n        return this._toType(this._param.defaultValue);\n    }\n    //-------------------------------------\n    // \tAUTOMATION CURVE CALCULATIONS\n    // \tMIT License, copyright (c) 2014 Jordan Santell\n    //-------------------------------------\n    // Calculates the the value along the curve produced by setTargetAtTime\n    _exponentialApproach(t0, v0, v1, timeConstant, t) {\n        return v1 + (v0 - v1) * Math.exp(-(t - t0) / timeConstant);\n    }\n    // Calculates the the value along the curve produced by linearRampToValueAtTime\n    _linearInterpolate(t0, v0, t1, v1, t) {\n        return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));\n    }\n    // Calculates the the value along the curve produced by exponentialRampToValueAtTime\n    _exponentialInterpolate(t0, v0, t1, v1, t) {\n        return v0 * Math.pow(v1 / v0, (t - t0) / (t1 - t0));\n    }\n}\n//# sourceMappingURL=Param.js.map","import { __awaiter } from \"tslib\";\nimport { getContext } from \"../Global\";\nimport { Tone } from \"../Tone\";\nimport { isAudioBuffer } from \"../util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { noOp } from \"../util/Interface\";\nimport { isArray, isNumber, isString } from \"../util/TypeCheck\";\nimport { assert } from \"../util/Debug\";\n/**\n * AudioBuffer loading and storage. ToneAudioBuffer is used internally by all\n * classes that make requests for audio files such as Tone.Player,\n * Tone.Sampler and Tone.Convolver.\n * @example\n * const buffer = new Tone.ToneAudioBuffer(\"https://tonejs.github.io/audio/casio/A1.mp3\", () => {\n * \tconsole.log(\"loaded\");\n * });\n * @category Core\n */\nexport class ToneAudioBuffer extends Tone {\n    constructor() {\n        super();\n        this.name = \"ToneAudioBuffer\";\n        /**\n         * Callback when the buffer is loaded.\n         */\n        this.onload = noOp;\n        const options = optionsFromArguments(ToneAudioBuffer.getDefaults(), arguments, [\"url\", \"onload\", \"onerror\"]);\n        this.reverse = options.reverse;\n        this.onload = options.onload;\n        if (options.url && isAudioBuffer(options.url) || options.url instanceof ToneAudioBuffer) {\n            this.set(options.url);\n        }\n        else if (isString(options.url)) {\n            // initiate the download\n            this.load(options.url).catch(options.onerror);\n        }\n    }\n    static getDefaults() {\n        return {\n            onerror: noOp,\n            onload: noOp,\n            reverse: false,\n        };\n    }\n    /**\n     * The sample rate of the AudioBuffer\n     */\n    get sampleRate() {\n        if (this._buffer) {\n            return this._buffer.sampleRate;\n        }\n        else {\n            return getContext().sampleRate;\n        }\n    }\n    /**\n     * Pass in an AudioBuffer or ToneAudioBuffer to set the value of this buffer.\n     */\n    set(buffer) {\n        if (buffer instanceof ToneAudioBuffer) {\n            // if it's loaded, set it\n            if (buffer.loaded) {\n                this._buffer = buffer.get();\n            }\n            else {\n                // otherwise when it's loaded, invoke it's callback\n                buffer.onload = () => {\n                    this.set(buffer);\n                    this.onload(this);\n                };\n            }\n        }\n        else {\n            this._buffer = buffer;\n        }\n        // reverse it initially\n        if (this._reversed) {\n            this._reverse();\n        }\n        return this;\n    }\n    /**\n     * The audio buffer stored in the object.\n     */\n    get() {\n        return this._buffer;\n    }\n    /**\n     * Makes an fetch request for the selected url then decodes the file as an audio buffer.\n     * Invokes the callback once the audio buffer loads.\n     * @param url The url of the buffer to load. filetype support depends on the browser.\n     * @returns A Promise which resolves with this ToneAudioBuffer\n     */\n    load(url) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const doneLoading = ToneAudioBuffer.load(url).then(audioBuffer => {\n                this.set(audioBuffer);\n                // invoke the onload method\n                this.onload(this);\n            });\n            ToneAudioBuffer.downloads.push(doneLoading);\n            try {\n                yield doneLoading;\n            }\n            finally {\n                // remove the downloaded file\n                const index = ToneAudioBuffer.downloads.indexOf(doneLoading);\n                ToneAudioBuffer.downloads.splice(index, 1);\n            }\n            return this;\n        });\n    }\n    /**\n     * clean up\n     */\n    dispose() {\n        super.dispose();\n        this._buffer = undefined;\n        return this;\n    }\n    /**\n     * Set the audio buffer from the array.\n     * To create a multichannel AudioBuffer, pass in a multidimensional array.\n     * @param array The array to fill the audio buffer\n     */\n    fromArray(array) {\n        const isMultidimensional = isArray(array) && array[0].length > 0;\n        const channels = isMultidimensional ? array.length : 1;\n        const len = isMultidimensional ? array[0].length : array.length;\n        const context = getContext();\n        const buffer = context.createBuffer(channels, len, context.sampleRate);\n        const multiChannelArray = !isMultidimensional && channels === 1 ?\n            [array] : array;\n        for (let c = 0; c < channels; c++) {\n            buffer.copyToChannel(multiChannelArray[c], c);\n        }\n        this._buffer = buffer;\n        return this;\n    }\n    /**\n     * Sums multiple channels into 1 channel\n     * @param chanNum Optionally only copy a single channel from the array.\n     */\n    toMono(chanNum) {\n        if (isNumber(chanNum)) {\n            this.fromArray(this.toArray(chanNum));\n        }\n        else {\n            let outputArray = new Float32Array(this.length);\n            const numChannels = this.numberOfChannels;\n            for (let channel = 0; channel < numChannels; channel++) {\n                const channelArray = this.toArray(channel);\n                for (let i = 0; i < channelArray.length; i++) {\n                    outputArray[i] += channelArray[i];\n                }\n            }\n            // divide by the number of channels\n            outputArray = outputArray.map(sample => sample / numChannels);\n            this.fromArray(outputArray);\n        }\n        return this;\n    }\n    /**\n     * Get the buffer as an array. Single channel buffers will return a 1-dimensional\n     * Float32Array, and multichannel buffers will return multidimensional arrays.\n     * @param channel Optionally only copy a single channel from the array.\n     */\n    toArray(channel) {\n        if (isNumber(channel)) {\n            return this.getChannelData(channel);\n        }\n        else if (this.numberOfChannels === 1) {\n            return this.toArray(0);\n        }\n        else {\n            const ret = [];\n            for (let c = 0; c < this.numberOfChannels; c++) {\n                ret[c] = this.getChannelData(c);\n            }\n            return ret;\n        }\n    }\n    /**\n     * Returns the Float32Array representing the PCM audio data for the specific channel.\n     * @param  channel  The channel number to return\n     * @return The audio as a TypedArray\n     */\n    getChannelData(channel) {\n        if (this._buffer) {\n            return this._buffer.getChannelData(channel);\n        }\n        else {\n            return new Float32Array(0);\n        }\n    }\n    /**\n     * Cut a subsection of the array and return a buffer of the\n     * subsection. Does not modify the original buffer\n     * @param start The time to start the slice\n     * @param end The end time to slice. If none is given will default to the end of the buffer\n     */\n    slice(start, end = this.duration) {\n        const startSamples = Math.floor(start * this.sampleRate);\n        const endSamples = Math.floor(end * this.sampleRate);\n        assert(startSamples < endSamples, \"The start time must be less than the end time\");\n        const length = endSamples - startSamples;\n        const retBuffer = getContext().createBuffer(this.numberOfChannels, length, this.sampleRate);\n        for (let channel = 0; channel < this.numberOfChannels; channel++) {\n            retBuffer.copyToChannel(this.getChannelData(channel).subarray(startSamples, endSamples), channel);\n        }\n        return new ToneAudioBuffer(retBuffer);\n    }\n    /**\n     * Reverse the buffer.\n     */\n    _reverse() {\n        if (this.loaded) {\n            for (let i = 0; i < this.numberOfChannels; i++) {\n                this.getChannelData(i).reverse();\n            }\n        }\n        return this;\n    }\n    /**\n     * If the buffer is loaded or not\n     */\n    get loaded() {\n        return this.length > 0;\n    }\n    /**\n     * The duration of the buffer in seconds.\n     */\n    get duration() {\n        if (this._buffer) {\n            return this._buffer.duration;\n        }\n        else {\n            return 0;\n        }\n    }\n    /**\n     * The length of the buffer in samples\n     */\n    get length() {\n        if (this._buffer) {\n            return this._buffer.length;\n        }\n        else {\n            return 0;\n        }\n    }\n    /**\n     * The number of discrete audio channels. Returns 0 if no buffer is loaded.\n     */\n    get numberOfChannels() {\n        if (this._buffer) {\n            return this._buffer.numberOfChannels;\n        }\n        else {\n            return 0;\n        }\n    }\n    /**\n     * Reverse the buffer.\n     */\n    get reverse() {\n        return this._reversed;\n    }\n    set reverse(rev) {\n        if (this._reversed !== rev) {\n            this._reversed = rev;\n            this._reverse();\n        }\n    }\n    /**\n     * Create a ToneAudioBuffer from the array. To create a multichannel AudioBuffer,\n     * pass in a multidimensional array.\n     * @param array The array to fill the audio buffer\n     * @return A ToneAudioBuffer created from the array\n     */\n    static fromArray(array) {\n        return (new ToneAudioBuffer()).fromArray(array);\n    }\n    /**\n     * Creates a ToneAudioBuffer from a URL, returns a promise which resolves to a ToneAudioBuffer\n     * @param  url The url to load.\n     * @return A promise which resolves to a ToneAudioBuffer\n     */\n    static fromUrl(url) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const buffer = new ToneAudioBuffer();\n            return yield buffer.load(url);\n        });\n    }\n    /**\n     * Loads a url using fetch and returns the AudioBuffer.\n     */\n    static load(url) {\n        return __awaiter(this, void 0, void 0, function* () {\n            // test if the url contains multiple extensions\n            const matches = url.match(/\\[([^\\]\\[]+\\|.+)\\]$/);\n            if (matches) {\n                const extensions = matches[1].split(\"|\");\n                let extension = extensions[0];\n                for (const ext of extensions) {\n                    if (ToneAudioBuffer.supportsType(ext)) {\n                        extension = ext;\n                        break;\n                    }\n                }\n                url = url.replace(matches[0], extension);\n            }\n            // make sure there is a slash between the baseUrl and the url\n            const baseUrl = ToneAudioBuffer.baseUrl === \"\" || ToneAudioBuffer.baseUrl.endsWith(\"/\") ? ToneAudioBuffer.baseUrl : ToneAudioBuffer.baseUrl + \"/\";\n            const response = yield fetch(baseUrl + url);\n            if (!response.ok) {\n                throw new Error(`could not load url: ${url}`);\n            }\n            const arrayBuffer = yield response.arrayBuffer();\n            const audioBuffer = yield getContext().decodeAudioData(arrayBuffer);\n            return audioBuffer;\n        });\n    }\n    /**\n     * Checks a url's extension to see if the current browser can play that file type.\n     * @param url The url/extension to test\n     * @return If the file extension can be played\n     * @static\n     * @example\n     * Tone.ToneAudioBuffer.supportsType(\"wav\"); // returns true\n     * Tone.ToneAudioBuffer.supportsType(\"path/to/file.wav\"); // returns true\n     */\n    static supportsType(url) {\n        const extensions = url.split(\".\");\n        const extension = extensions[extensions.length - 1];\n        const response = document.createElement(\"audio\").canPlayType(\"audio/\" + extension);\n        return response !== \"\";\n    }\n    /**\n     * Returns a Promise which resolves when all of the buffers have loaded\n     */\n    static loaded() {\n        return __awaiter(this, void 0, void 0, function* () {\n            // this makes sure that the function is always async\n            yield Promise.resolve();\n            while (ToneAudioBuffer.downloads.length) {\n                yield ToneAudioBuffer.downloads[0];\n            }\n        });\n    }\n}\n//-------------------------------------\n// STATIC METHODS\n//-------------------------------------\n/**\n * A path which is prefixed before every url.\n */\nToneAudioBuffer.baseUrl = \"\";\n/**\n * All of the downloads\n */\nToneAudioBuffer.downloads = [];\n//# sourceMappingURL=ToneAudioBuffer.js.map","import { isAudioNode, isAudioParam } from \"../util/AdvancedTypeCheck\";\nimport { isDefined } from \"../util/TypeCheck\";\nimport { Param } from \"./Param\";\nimport { ToneWithContext } from \"./ToneWithContext\";\nimport { assert, warn } from \"../util/Debug\";\n/**\n * ToneAudioNode is the base class for classes which process audio.\n */\nexport class ToneAudioNode extends ToneWithContext {\n    constructor() {\n        super(...arguments);\n        /**\n         * The name of the class\n         */\n        this.name = \"ToneAudioNode\";\n        /**\n         * List all of the node that must be set to match the ChannelProperties\n         */\n        this._internalChannels = [];\n    }\n    /**\n     * The number of inputs feeding into the AudioNode.\n     * For source nodes, this will be 0.\n     * @example\n     * const node = new Tone.Gain();\n     * console.log(node.numberOfInputs);\n     */\n    get numberOfInputs() {\n        if (isDefined(this.input)) {\n            if (isAudioParam(this.input) || this.input instanceof Param) {\n                return 1;\n            }\n            else {\n                return this.input.numberOfInputs;\n            }\n        }\n        else {\n            return 0;\n        }\n    }\n    /**\n     * The number of outputs of the AudioNode.\n     * @example\n     * const node = new Tone.Gain();\n     * console.log(node.numberOfOutputs);\n     */\n    get numberOfOutputs() {\n        if (isDefined(this.output)) {\n            return this.output.numberOfOutputs;\n        }\n        else {\n            return 0;\n        }\n    }\n    //-------------------------------------\n    // AUDIO PROPERTIES\n    //-------------------------------------\n    /**\n     * Used to decide which nodes to get/set properties on\n     */\n    _isAudioNode(node) {\n        return isDefined(node) && (node instanceof ToneAudioNode || isAudioNode(node));\n    }\n    /**\n     * Get all of the audio nodes (either internal or input/output) which together\n     * make up how the class node responds to channel input/output\n     */\n    _getInternalNodes() {\n        const nodeList = this._internalChannels.slice(0);\n        if (this._isAudioNode(this.input)) {\n            nodeList.push(this.input);\n        }\n        if (this._isAudioNode(this.output)) {\n            if (this.input !== this.output) {\n                nodeList.push(this.output);\n            }\n        }\n        return nodeList;\n    }\n    /**\n     * Set the audio options for this node such as channelInterpretation\n     * channelCount, etc.\n     * @param options\n     */\n    _setChannelProperties(options) {\n        const nodeList = this._getInternalNodes();\n        nodeList.forEach(node => {\n            node.channelCount = options.channelCount;\n            node.channelCountMode = options.channelCountMode;\n            node.channelInterpretation = options.channelInterpretation;\n        });\n    }\n    /**\n     * Get the current audio options for this node such as channelInterpretation\n     * channelCount, etc.\n     */\n    _getChannelProperties() {\n        const nodeList = this._getInternalNodes();\n        assert(nodeList.length > 0, \"ToneAudioNode does not have any internal nodes\");\n        // use the first node to get properties\n        // they should all be the same\n        const node = nodeList[0];\n        return {\n            channelCount: node.channelCount,\n            channelCountMode: node.channelCountMode,\n            channelInterpretation: node.channelInterpretation,\n        };\n    }\n    /**\n     * channelCount is the number of channels used when up-mixing and down-mixing\n     * connections to any inputs to the node. The default value is 2 except for\n     * specific nodes where its value is specially determined.\n     */\n    get channelCount() {\n        return this._getChannelProperties().channelCount;\n    }\n    set channelCount(channelCount) {\n        const props = this._getChannelProperties();\n        // merge it with the other properties\n        this._setChannelProperties(Object.assign(props, { channelCount }));\n    }\n    /**\n     * channelCountMode determines how channels will be counted when up-mixing and\n     * down-mixing connections to any inputs to the node.\n     * The default value is \"max\". This attribute has no effect for nodes with no inputs.\n     * * \"max\" - computedNumberOfChannels is the maximum of the number of channels of all connections to an input. In this mode channelCount is ignored.\n     * * \"clamped-max\" - computedNumberOfChannels is determined as for \"max\" and then clamped to a maximum value of the given channelCount.\n     * * \"explicit\" - computedNumberOfChannels is the exact value as specified by the channelCount.\n     */\n    get channelCountMode() {\n        return this._getChannelProperties().channelCountMode;\n    }\n    set channelCountMode(channelCountMode) {\n        const props = this._getChannelProperties();\n        // merge it with the other properties\n        this._setChannelProperties(Object.assign(props, { channelCountMode }));\n    }\n    /**\n     * channelInterpretation determines how individual channels will be treated\n     * when up-mixing and down-mixing connections to any inputs to the node.\n     * The default value is \"speakers\".\n     */\n    get channelInterpretation() {\n        return this._getChannelProperties().channelInterpretation;\n    }\n    set channelInterpretation(channelInterpretation) {\n        const props = this._getChannelProperties();\n        // merge it with the other properties\n        this._setChannelProperties(Object.assign(props, { channelInterpretation }));\n    }\n    //-------------------------------------\n    // CONNECTIONS\n    //-------------------------------------\n    /**\n     * connect the output of a ToneAudioNode to an AudioParam, AudioNode, or ToneAudioNode\n     * @param destination The output to connect to\n     * @param outputNum The output to connect from\n     * @param inputNum The input to connect to\n     */\n    connect(destination, outputNum = 0, inputNum = 0) {\n        connect(this, destination, outputNum, inputNum);\n        return this;\n    }\n    /**\n     * Connect the output to the context's destination node.\n     * @example\n     * const osc = new Tone.Oscillator(\"C2\").start();\n     * osc.toDestination();\n     */\n    toDestination() {\n        this.connect(this.context.destination);\n        return this;\n    }\n    /**\n     * Connect the output to the context's destination node.\n     * See [[toDestination]]\n     * @deprecated\n     */\n    toMaster() {\n        warn(\"toMaster() has been renamed toDestination()\");\n        return this.toDestination();\n    }\n    /**\n     * disconnect the output\n     */\n    disconnect(destination, outputNum = 0, inputNum = 0) {\n        disconnect(this, destination, outputNum, inputNum);\n        return this;\n    }\n    /**\n     * Connect the output of this node to the rest of the nodes in series.\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/drum-samples/handdrum-loop.mp3\");\n     * player.autostart = true;\n     * const filter = new Tone.AutoFilter(4).start();\n     * const distortion = new Tone.Distortion(0.5);\n     * // connect the player to the filter, distortion and then to the master output\n     * player.chain(filter, distortion, Tone.Destination);\n     */\n    chain(...nodes) {\n        connectSeries(this, ...nodes);\n        return this;\n    }\n    /**\n     * connect the output of this node to the rest of the nodes in parallel.\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/drum-samples/conga-rhythm.mp3\");\n     * player.autostart = true;\n     * const pitchShift = new Tone.PitchShift(4).toDestination();\n     * const filter = new Tone.Filter(\"G5\").toDestination();\n     * // connect a node to the pitch shift and filter in parallel\n     * player.fan(pitchShift, filter);\n     */\n    fan(...nodes) {\n        nodes.forEach(node => this.connect(node));\n        return this;\n    }\n    /**\n     * Dispose and disconnect\n     */\n    dispose() {\n        super.dispose();\n        if (isDefined(this.input)) {\n            if (this.input instanceof ToneAudioNode) {\n                this.input.dispose();\n            }\n            else if (isAudioNode(this.input)) {\n                this.input.disconnect();\n            }\n        }\n        if (isDefined(this.output)) {\n            if (this.output instanceof ToneAudioNode) {\n                this.output.dispose();\n            }\n            else if (isAudioNode(this.output)) {\n                this.output.disconnect();\n            }\n        }\n        this._internalChannels = [];\n        return this;\n    }\n}\n//-------------------------------------\n// CONNECTIONS\n//-------------------------------------\n/**\n * connect together all of the arguments in series\n * @param nodes\n */\nexport function connectSeries(...nodes) {\n    const first = nodes.shift();\n    nodes.reduce((prev, current) => {\n        if (prev instanceof ToneAudioNode) {\n            prev.connect(current);\n        }\n        else if (isAudioNode(prev)) {\n            connect(prev, current);\n        }\n        return current;\n    }, first);\n}\n/**\n * Connect two nodes together so that signal flows from the\n * first node to the second. Optionally specify the input and output channels.\n * @param srcNode The source node\n * @param dstNode The destination node\n * @param outputNumber The output channel of the srcNode\n * @param inputNumber The input channel of the dstNode\n */\nexport function connect(srcNode, dstNode, outputNumber = 0, inputNumber = 0) {\n    assert(isDefined(srcNode), \"Cannot connect from undefined node\");\n    assert(isDefined(dstNode), \"Cannot connect to undefined node\");\n    if (dstNode instanceof ToneAudioNode || isAudioNode(dstNode)) {\n        assert(dstNode.numberOfInputs > 0, \"Cannot connect to node with no inputs\");\n    }\n    assert(srcNode.numberOfOutputs > 0, \"Cannot connect from node with no outputs\");\n    // resolve the input of the dstNode\n    while ((dstNode instanceof ToneAudioNode || dstNode instanceof Param)) {\n        if (isDefined(dstNode.input)) {\n            dstNode = dstNode.input;\n        }\n    }\n    while (srcNode instanceof ToneAudioNode) {\n        if (isDefined(srcNode.output)) {\n            srcNode = srcNode.output;\n        }\n    }\n    // make the connection\n    if (isAudioParam(dstNode)) {\n        srcNode.connect(dstNode, outputNumber);\n    }\n    else {\n        srcNode.connect(dstNode, outputNumber, inputNumber);\n    }\n}\n/**\n * Disconnect a node from all nodes or optionally include a destination node and input/output channels.\n * @param srcNode The source node\n * @param dstNode The destination node\n * @param outputNumber The output channel of the srcNode\n * @param inputNumber The input channel of the dstNode\n */\nexport function disconnect(srcNode, dstNode, outputNumber = 0, inputNumber = 0) {\n    // resolve the destination node\n    if (isDefined(dstNode)) {\n        while (dstNode instanceof ToneAudioNode) {\n            dstNode = dstNode.input;\n        }\n    }\n    // resolve the src node\n    while (!(isAudioNode(srcNode))) {\n        if (isDefined(srcNode.output)) {\n            srcNode = srcNode.output;\n        }\n    }\n    if (isAudioParam(dstNode)) {\n        srcNode.disconnect(dstNode, outputNumber);\n    }\n    else if (isAudioNode(dstNode)) {\n        srcNode.disconnect(dstNode, outputNumber, inputNumber);\n    }\n    else {\n        srcNode.disconnect();\n    }\n}\n//# sourceMappingURL=ToneAudioNode.js.map","import { getContext } from \"../Global\";\nimport { Tone } from \"../Tone\";\nimport { FrequencyClass } from \"../type/Frequency\";\nimport { TimeClass } from \"../type/Time\";\nimport { TransportTimeClass } from \"../type/TransportTime\";\nimport { getDefaultsFromInstance, optionsFromArguments } from \"../util/Defaults\";\nimport { isArray, isBoolean, isDefined, isNumber, isString, isUndef } from \"../util/TypeCheck\";\n/**\n * The Base class for all nodes that have an AudioContext.\n */\nexport class ToneWithContext extends Tone {\n    constructor() {\n        super();\n        const options = optionsFromArguments(ToneWithContext.getDefaults(), arguments, [\"context\"]);\n        if (this.defaultContext) {\n            this.context = this.defaultContext;\n        }\n        else {\n            this.context = options.context;\n        }\n    }\n    static getDefaults() {\n        return {\n            context: getContext(),\n        };\n    }\n    /**\n     * Return the current time of the Context clock plus the lookAhead.\n     * @example\n     * setInterval(() => {\n     * \tconsole.log(Tone.now());\n     * }, 100);\n     */\n    now() {\n        return this.context.currentTime + this.context.lookAhead;\n    }\n    /**\n     * Return the current time of the Context clock without any lookAhead.\n     * @example\n     * setInterval(() => {\n     * \tconsole.log(Tone.immediate());\n     * }, 100);\n     */\n    immediate() {\n        return this.context.currentTime;\n    }\n    /**\n     * The duration in seconds of one sample.\n     * @example\n     * console.log(Tone.Transport.sampleTime);\n     */\n    get sampleTime() {\n        return 1 / this.context.sampleRate;\n    }\n    /**\n     * The number of seconds of 1 processing block (128 samples)\n     * @example\n     * console.log(Tone.Destination.blockTime);\n     */\n    get blockTime() {\n        return 128 / this.context.sampleRate;\n    }\n    /**\n     * Convert the incoming time to seconds.\n     * This is calculated against the current [[Tone.Transport]] bpm\n     * @example\n     * const gain = new Tone.Gain();\n     * setInterval(() => console.log(gain.toSeconds(\"4n\")), 100);\n     * // ramp the tempo to 60 bpm over 30 seconds\n     * Tone.getTransport().bpm.rampTo(60, 30);\n     */\n    toSeconds(time) {\n        return new TimeClass(this.context, time).toSeconds();\n    }\n    /**\n     * Convert the input to a frequency number\n     * @example\n     * const gain = new Tone.Gain();\n     * console.log(gain.toFrequency(\"4n\"));\n     */\n    toFrequency(freq) {\n        return new FrequencyClass(this.context, freq).toFrequency();\n    }\n    /**\n     * Convert the input time into ticks\n     * @example\n     * const gain = new Tone.Gain();\n     * console.log(gain.toTicks(\"4n\"));\n     */\n    toTicks(time) {\n        return new TransportTimeClass(this.context, time).toTicks();\n    }\n    //-------------------------------------\n    // \tGET/SET\n    //-------------------------------------\n    /**\n     * Get a subset of the properties which are in the partial props\n     */\n    _getPartialProperties(props) {\n        const options = this.get();\n        // remove attributes from the prop that are not in the partial\n        Object.keys(options).forEach(name => {\n            if (isUndef(props[name])) {\n                delete options[name];\n            }\n        });\n        return options;\n    }\n    /**\n     * Get the object's attributes.\n     * @example\n     * const osc = new Tone.Oscillator();\n     * console.log(osc.get());\n     */\n    get() {\n        const defaults = getDefaultsFromInstance(this);\n        Object.keys(defaults).forEach(attribute => {\n            if (Reflect.has(this, attribute)) {\n                const member = this[attribute];\n                if (isDefined(member) && isDefined(member.value) && isDefined(member.setValueAtTime)) {\n                    defaults[attribute] = member.value;\n                }\n                else if (member instanceof ToneWithContext) {\n                    defaults[attribute] = member._getPartialProperties(defaults[attribute]);\n                    // otherwise make sure it's a serializable type\n                }\n                else if (isArray(member) || isNumber(member) || isString(member) || isBoolean(member)) {\n                    defaults[attribute] = member;\n                }\n                else {\n                    // remove all undefined and unserializable attributes\n                    delete defaults[attribute];\n                }\n            }\n        });\n        return defaults;\n    }\n    /**\n     * Set multiple properties at once with an object.\n     * @example\n     * const filter = new Tone.Filter().toDestination();\n     * // set values using an object\n     * filter.set({\n     * \tfrequency: \"C6\",\n     * \ttype: \"highpass\"\n     * });\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/Analogsynth_octaves_highmid.mp3\").connect(filter);\n     * player.autostart = true;\n     */\n    set(props) {\n        Object.keys(props).forEach(attribute => {\n            if (Reflect.has(this, attribute) && isDefined(this[attribute])) {\n                if (this[attribute] && isDefined(this[attribute].value) && isDefined(this[attribute].setValueAtTime)) {\n                    // small optimization\n                    if (this[attribute].value !== props[attribute]) {\n                        this[attribute].value = props[attribute];\n                    }\n                }\n                else if (this[attribute] instanceof ToneWithContext) {\n                    this[attribute].set(props[attribute]);\n                }\n                else {\n                    this[attribute] = props[attribute];\n                }\n            }\n        });\n        return this;\n    }\n}\n//# sourceMappingURL=ToneWithContext.js.map","/**\n * Equal power gain scale. Good for cross-fading.\n * @param  percent (0-1)\n */\nexport function equalPowerScale(percent) {\n    const piFactor = 0.5 * Math.PI;\n    return Math.sin(percent * piFactor);\n}\n/**\n * Convert decibels into gain.\n */\nexport function dbToGain(db) {\n    return Math.pow(10, db / 20);\n}\n/**\n * Convert gain to decibels.\n */\nexport function gainToDb(gain) {\n    return 20 * (Math.log(gain) / Math.LN10);\n}\n/**\n * Convert an interval (in semitones) to a frequency ratio.\n * @param interval the number of semitones above the base note\n * @example\n * Tone.intervalToFrequencyRatio(0); // 1\n * Tone.intervalToFrequencyRatio(12); // 2\n * Tone.intervalToFrequencyRatio(-12); // 0.5\n */\nexport function intervalToFrequencyRatio(interval) {\n    return Math.pow(2, (interval / 12));\n}\n/**\n * The Global [concert tuning pitch](https://en.wikipedia.org/wiki/Concert_pitch) which is used\n * to generate all the other pitch values from notes. A4's values in Hertz.\n */\nlet A4 = 440;\nexport function getA4() {\n    return A4;\n}\nexport function setA4(freq) {\n    A4 = freq;\n}\n/**\n * Convert a frequency value to a MIDI note.\n * @param frequency The value to frequency value to convert.\n * @example\n * Tone.ftom(440); // returns 69\n */\nexport function ftom(frequency) {\n    return Math.round(ftomf(frequency));\n}\n/**\n * Convert a frequency to a floating point midi value\n */\nexport function ftomf(frequency) {\n    return 69 + 12 * Math.log2(frequency / A4);\n}\n/**\n * Convert a MIDI note to frequency value.\n * @param  midi The midi number to convert.\n * @return The corresponding frequency value\n * @example\n * Tone.mtof(69); // 440\n */\nexport function mtof(midi) {\n    return A4 * Math.pow(2, (midi - 69) / 12);\n}\n//# sourceMappingURL=Conversions.js.map","import { getContext } from \"../Global\";\nimport { intervalToFrequencyRatio, mtof } from \"./Conversions\";\nimport { ftom, getA4, setA4 } from \"./Conversions\";\nimport { TimeClass } from \"./Time\";\n/**\n * Frequency is a primitive type for encoding Frequency values.\n * Eventually all time values are evaluated to hertz using the `valueOf` method.\n * @example\n * Tone.Frequency(\"C3\"); // 261\n * Tone.Frequency(38, \"midi\");\n * Tone.Frequency(\"C3\").transpose(4);\n * @category Unit\n */\nexport class FrequencyClass extends TimeClass {\n    constructor() {\n        super(...arguments);\n        this.name = \"Frequency\";\n        this.defaultUnits = \"hz\";\n    }\n    /**\n     * The [concert tuning pitch](https://en.wikipedia.org/wiki/Concert_pitch) which is used\n     * to generate all the other pitch values from notes. A4's values in Hertz.\n     */\n    static get A4() {\n        return getA4();\n    }\n    static set A4(freq) {\n        setA4(freq);\n    }\n    //-------------------------------------\n    // \tAUGMENT BASE EXPRESSIONS\n    //-------------------------------------\n    _getExpressions() {\n        return Object.assign({}, super._getExpressions(), {\n            midi: {\n                regexp: /^(\\d+(?:\\.\\d+)?midi)/,\n                method(value) {\n                    if (this.defaultUnits === \"midi\") {\n                        return value;\n                    }\n                    else {\n                        return FrequencyClass.mtof(value);\n                    }\n                },\n            },\n            note: {\n                regexp: /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i,\n                method(pitch, octave) {\n                    const index = noteToScaleIndex[pitch.toLowerCase()];\n                    const noteNumber = index + (parseInt(octave, 10) + 1) * 12;\n                    if (this.defaultUnits === \"midi\") {\n                        return noteNumber;\n                    }\n                    else {\n                        return FrequencyClass.mtof(noteNumber);\n                    }\n                },\n            },\n            tr: {\n                regexp: /^(\\d+(?:\\.\\d+)?):(\\d+(?:\\.\\d+)?):?(\\d+(?:\\.\\d+)?)?/,\n                method(m, q, s) {\n                    let total = 1;\n                    if (m && m !== \"0\") {\n                        total *= this._beatsToUnits(this._getTimeSignature() * parseFloat(m));\n                    }\n                    if (q && q !== \"0\") {\n                        total *= this._beatsToUnits(parseFloat(q));\n                    }\n                    if (s && s !== \"0\") {\n                        total *= this._beatsToUnits(parseFloat(s) / 4);\n                    }\n                    return total;\n                },\n            },\n        });\n    }\n    //-------------------------------------\n    // \tEXPRESSIONS\n    //-------------------------------------\n    /**\n     * Transposes the frequency by the given number of semitones.\n     * @return  A new transposed frequency\n     * @example\n     * Tone.Frequency(\"A4\").transpose(3); // \"C5\"\n     */\n    transpose(interval) {\n        return new FrequencyClass(this.context, this.valueOf() * intervalToFrequencyRatio(interval));\n    }\n    /**\n     * Takes an array of semitone intervals and returns\n     * an array of frequencies transposed by those intervals.\n     * @return  Returns an array of Frequencies\n     * @example\n     * Tone.Frequency(\"A4\").harmonize([0, 3, 7]); // [\"A4\", \"C5\", \"E5\"]\n     */\n    harmonize(intervals) {\n        return intervals.map(interval => {\n            return this.transpose(interval);\n        });\n    }\n    //-------------------------------------\n    // \tUNIT CONVERSIONS\n    //-------------------------------------\n    /**\n     * Return the value of the frequency as a MIDI note\n     * @example\n     * Tone.Frequency(\"C4\").toMidi(); // 60\n     */\n    toMidi() {\n        return ftom(this.valueOf());\n    }\n    /**\n     * Return the value of the frequency in Scientific Pitch Notation\n     * @example\n     * Tone.Frequency(69, \"midi\").toNote(); // \"A4\"\n     */\n    toNote() {\n        const freq = this.toFrequency();\n        const log = Math.log2(freq / FrequencyClass.A4);\n        let noteNumber = Math.round(12 * log) + 57;\n        const octave = Math.floor(noteNumber / 12);\n        if (octave < 0) {\n            noteNumber += -12 * octave;\n        }\n        const noteName = scaleIndexToNote[noteNumber % 12];\n        return noteName + octave.toString();\n    }\n    /**\n     * Return the duration of one cycle in seconds.\n     */\n    toSeconds() {\n        return 1 / super.toSeconds();\n    }\n    /**\n     * Return the duration of one cycle in ticks\n     */\n    toTicks() {\n        const quarterTime = this._beatsToUnits(1);\n        const quarters = this.valueOf() / quarterTime;\n        return Math.floor(quarters * this._getPPQ());\n    }\n    //-------------------------------------\n    // \tUNIT CONVERSIONS HELPERS\n    //-------------------------------------\n    /**\n     * With no arguments, return 0\n     */\n    _noArg() {\n        return 0;\n    }\n    /**\n     * Returns the value of a frequency in the current units\n     */\n    _frequencyToUnits(freq) {\n        return freq;\n    }\n    /**\n     * Returns the value of a tick in the current time units\n     */\n    _ticksToUnits(ticks) {\n        return 1 / ((ticks * 60) / (this._getBpm() * this._getPPQ()));\n    }\n    /**\n     * Return the value of the beats in the current units\n     */\n    _beatsToUnits(beats) {\n        return 1 / super._beatsToUnits(beats);\n    }\n    /**\n     * Returns the value of a second in the current units\n     */\n    _secondsToUnits(seconds) {\n        return 1 / seconds;\n    }\n    /**\n     * Convert a MIDI note to frequency value.\n     * @param  midi The midi number to convert.\n     * @return The corresponding frequency value\n     */\n    static mtof(midi) {\n        return mtof(midi);\n    }\n    /**\n     * Convert a frequency value to a MIDI note.\n     * @param frequency The value to frequency value to convert.\n     */\n    static ftom(frequency) {\n        return ftom(frequency);\n    }\n}\n//-------------------------------------\n// \tFREQUENCY CONVERSIONS\n//-------------------------------------\n/**\n * Note to scale index.\n * @hidden\n */\nconst noteToScaleIndex = {\n    cbb: -2, cb: -1, c: 0, \"c#\": 1, cx: 2,\n    dbb: 0, db: 1, d: 2, \"d#\": 3, dx: 4,\n    ebb: 2, eb: 3, e: 4, \"e#\": 5, ex: 6,\n    fbb: 3, fb: 4, f: 5, \"f#\": 6, fx: 7,\n    gbb: 5, gb: 6, g: 7, \"g#\": 8, gx: 9,\n    abb: 7, ab: 8, a: 9, \"a#\": 10, ax: 11,\n    bbb: 9, bb: 10, b: 11, \"b#\": 12, bx: 13,\n};\n/**\n * scale index to note (sharps)\n * @hidden\n */\nconst scaleIndexToNote = [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"];\n/**\n * Convert a value into a FrequencyClass object.\n * @category Unit\n * @example\n * const midi = Tone.Frequency(\"C3\").toMidi();\n * console.log(midi);\n * @example\n * const hertz = Tone.Frequency(38, \"midi\").toFrequency();\n * console.log(hertz);\n */\nexport function Frequency(value, units) {\n    return new FrequencyClass(getContext(), value, units);\n}\n//# sourceMappingURL=Frequency.js.map","import { Tone } from \"../Tone\";\nimport { isDefined, isObject, isString, isUndef } from \"../util/TypeCheck\";\n/**\n * TimeBase is a flexible encoding of time which can be evaluated to and from a string.\n */\nexport class TimeBaseClass extends Tone {\n    /**\n     * @param context The context associated with the time value. Used to compute\n     * Transport and context-relative timing.\n     * @param  value  The time value as a number, string or object\n     * @param  units  Unit values\n     */\n    constructor(context, value, units) {\n        super();\n        /**\n         * The default units\n         */\n        this.defaultUnits = \"s\";\n        this._val = value;\n        this._units = units;\n        this.context = context;\n        this._expressions = this._getExpressions();\n    }\n    /**\n     * All of the time encoding expressions\n     */\n    _getExpressions() {\n        return {\n            hz: {\n                method: (value) => {\n                    return this._frequencyToUnits(parseFloat(value));\n                },\n                regexp: /^(\\d+(?:\\.\\d+)?)hz$/i,\n            },\n            i: {\n                method: (value) => {\n                    return this._ticksToUnits(parseInt(value, 10));\n                },\n                regexp: /^(\\d+)i$/i,\n            },\n            m: {\n                method: (value) => {\n                    return this._beatsToUnits(parseInt(value, 10) * this._getTimeSignature());\n                },\n                regexp: /^(\\d+)m$/i,\n            },\n            n: {\n                method: (value, dot) => {\n                    const numericValue = parseInt(value, 10);\n                    const scalar = dot === \".\" ? 1.5 : 1;\n                    if (numericValue === 1) {\n                        return this._beatsToUnits(this._getTimeSignature()) * scalar;\n                    }\n                    else {\n                        return this._beatsToUnits(4 / numericValue) * scalar;\n                    }\n                },\n                regexp: /^(\\d+)n(\\.?)$/i,\n            },\n            number: {\n                method: (value) => {\n                    return this._expressions[this.defaultUnits].method.call(this, value);\n                },\n                regexp: /^(\\d+(?:\\.\\d+)?)$/,\n            },\n            s: {\n                method: (value) => {\n                    return this._secondsToUnits(parseFloat(value));\n                },\n                regexp: /^(\\d+(?:\\.\\d+)?)s$/,\n            },\n            samples: {\n                method: (value) => {\n                    return parseInt(value, 10) / this.context.sampleRate;\n                },\n                regexp: /^(\\d+)samples$/,\n            },\n            t: {\n                method: (value) => {\n                    const numericValue = parseInt(value, 10);\n                    return this._beatsToUnits(8 / (Math.floor(numericValue) * 3));\n                },\n                regexp: /^(\\d+)t$/i,\n            },\n            tr: {\n                method: (m, q, s) => {\n                    let total = 0;\n                    if (m && m !== \"0\") {\n                        total += this._beatsToUnits(this._getTimeSignature() * parseFloat(m));\n                    }\n                    if (q && q !== \"0\") {\n                        total += this._beatsToUnits(parseFloat(q));\n                    }\n                    if (s && s !== \"0\") {\n                        total += this._beatsToUnits(parseFloat(s) / 4);\n                    }\n                    return total;\n                },\n                regexp: /^(\\d+(?:\\.\\d+)?):(\\d+(?:\\.\\d+)?):?(\\d+(?:\\.\\d+)?)?$/,\n            },\n        };\n    }\n    //-------------------------------------\n    // \tVALUE OF\n    //-------------------------------------\n    /**\n     * Evaluate the time value. Returns the time in seconds.\n     */\n    valueOf() {\n        if (this._val instanceof TimeBaseClass) {\n            this.fromType(this._val);\n        }\n        if (isUndef(this._val)) {\n            return this._noArg();\n        }\n        else if (isString(this._val) && isUndef(this._units)) {\n            for (const units in this._expressions) {\n                if (this._expressions[units].regexp.test(this._val.trim())) {\n                    this._units = units;\n                    break;\n                }\n            }\n        }\n        else if (isObject(this._val)) {\n            let total = 0;\n            for (const typeName in this._val) {\n                if (isDefined(this._val[typeName])) {\n                    const quantity = this._val[typeName];\n                    // @ts-ignore\n                    const time = (new this.constructor(this.context, typeName)).valueOf() * quantity;\n                    total += time;\n                }\n            }\n            return total;\n        }\n        if (isDefined(this._units)) {\n            const expr = this._expressions[this._units];\n            const matching = this._val.toString().trim().match(expr.regexp);\n            if (matching) {\n                return expr.method.apply(this, matching.slice(1));\n            }\n            else {\n                return expr.method.call(this, this._val);\n            }\n        }\n        else if (isString(this._val)) {\n            return parseFloat(this._val);\n        }\n        else {\n            return this._val;\n        }\n    }\n    //-------------------------------------\n    // \tUNIT CONVERSIONS\n    //-------------------------------------\n    /**\n     * Returns the value of a frequency in the current units\n     */\n    _frequencyToUnits(freq) {\n        return 1 / freq;\n    }\n    /**\n     * Return the value of the beats in the current units\n     */\n    _beatsToUnits(beats) {\n        return (60 / this._getBpm()) * beats;\n    }\n    /**\n     * Returns the value of a second in the current units\n     */\n    _secondsToUnits(seconds) {\n        return seconds;\n    }\n    /**\n     * Returns the value of a tick in the current time units\n     */\n    _ticksToUnits(ticks) {\n        return (ticks * (this._beatsToUnits(1)) / this._getPPQ());\n    }\n    /**\n     * With no arguments, return 'now'\n     */\n    _noArg() {\n        return this._now();\n    }\n    //-------------------------------------\n    // \tTEMPO CONVERSIONS\n    //-------------------------------------\n    /**\n     * Return the bpm\n     */\n    _getBpm() {\n        return this.context.transport.bpm.value;\n    }\n    /**\n     * Return the timeSignature\n     */\n    _getTimeSignature() {\n        return this.context.transport.timeSignature;\n    }\n    /**\n     * Return the PPQ or 192 if Transport is not available\n     */\n    _getPPQ() {\n        return this.context.transport.PPQ;\n    }\n    //-------------------------------------\n    // \tCONVERSION INTERFACE\n    //-------------------------------------\n    /**\n     * Coerce a time type into this units type.\n     * @param type Any time type units\n     */\n    fromType(type) {\n        this._units = undefined;\n        switch (this.defaultUnits) {\n            case \"s\":\n                this._val = type.toSeconds();\n                break;\n            case \"i\":\n                this._val = type.toTicks();\n                break;\n            case \"hz\":\n                this._val = type.toFrequency();\n                break;\n            case \"midi\":\n                this._val = type.toMidi();\n                break;\n        }\n        return this;\n    }\n    /**\n     * Return the value in hertz\n     */\n    toFrequency() {\n        return 1 / this.toSeconds();\n    }\n    /**\n     * Return the time in samples\n     */\n    toSamples() {\n        return this.toSeconds() * this.context.sampleRate;\n    }\n    /**\n     * Return the time in milliseconds.\n     */\n    toMilliseconds() {\n        return this.toSeconds() * 1000;\n    }\n}\n//# sourceMappingURL=TimeBase.js.map","import { getContext } from \"../Global\";\nimport { ftom } from \"./Conversions\";\nimport { TimeBaseClass } from \"./TimeBase\";\n/**\n * TimeClass is a primitive type for encoding and decoding Time values.\n * TimeClass can be passed into the parameter of any method which takes time as an argument.\n * @param  val    The time value.\n * @param  units  The units of the value.\n * @example\n * const time = Tone.Time(\"4n\"); // a quarter note\n * @category Unit\n */\nexport class TimeClass extends TimeBaseClass {\n    constructor() {\n        super(...arguments);\n        this.name = \"TimeClass\";\n    }\n    _getExpressions() {\n        return Object.assign(super._getExpressions(), {\n            now: {\n                method: (capture) => {\n                    return this._now() + new this.constructor(this.context, capture).valueOf();\n                },\n                regexp: /^\\+(.+)/,\n            },\n            quantize: {\n                method: (capture) => {\n                    const quantTo = new TimeClass(this.context, capture).valueOf();\n                    return this._secondsToUnits(this.context.transport.nextSubdivision(quantTo));\n                },\n                regexp: /^@(.+)/,\n            },\n        });\n    }\n    /**\n     * Quantize the time by the given subdivision. Optionally add a\n     * percentage which will move the time value towards the ideal\n     * quantized value by that percentage.\n     * @param  subdiv    The subdivision to quantize to\n     * @param  percent  Move the time value towards the quantized value by a percentage.\n     * @example\n     * Tone.Time(21).quantize(2); // returns 22\n     * Tone.Time(0.6).quantize(\"4n\", 0.5); // returns 0.55\n     */\n    quantize(subdiv, percent = 1) {\n        const subdivision = new this.constructor(this.context, subdiv).valueOf();\n        const value = this.valueOf();\n        const multiple = Math.round(value / subdivision);\n        const ideal = multiple * subdivision;\n        const diff = ideal - value;\n        return value + diff * percent;\n    }\n    //-------------------------------------\n    // CONVERSIONS\n    //-------------------------------------\n    /**\n     * Convert a Time to Notation. The notation values are will be the\n     * closest representation between 1m to 128th note.\n     * @return {Notation}\n     * @example\n     * // if the Transport is at 120bpm:\n     * Tone.Time(2).toNotation(); // returns \"1m\"\n     */\n    toNotation() {\n        const time = this.toSeconds();\n        const testNotations = [\"1m\"];\n        for (let power = 1; power < 9; power++) {\n            const subdiv = Math.pow(2, power);\n            testNotations.push(subdiv + \"n.\");\n            testNotations.push(subdiv + \"n\");\n            testNotations.push(subdiv + \"t\");\n        }\n        testNotations.push(\"0\");\n        // find the closets notation representation\n        let closest = testNotations[0];\n        let closestSeconds = new TimeClass(this.context, testNotations[0]).toSeconds();\n        testNotations.forEach(notation => {\n            const notationSeconds = new TimeClass(this.context, notation).toSeconds();\n            if (Math.abs(notationSeconds - time) < Math.abs(closestSeconds - time)) {\n                closest = notation;\n                closestSeconds = notationSeconds;\n            }\n        });\n        return closest;\n    }\n    /**\n     * Return the time encoded as Bars:Beats:Sixteenths.\n     */\n    toBarsBeatsSixteenths() {\n        const quarterTime = this._beatsToUnits(1);\n        let quarters = this.valueOf() / quarterTime;\n        quarters = parseFloat(quarters.toFixed(4));\n        const measures = Math.floor(quarters / this._getTimeSignature());\n        let sixteenths = (quarters % 1) * 4;\n        quarters = Math.floor(quarters) % this._getTimeSignature();\n        const sixteenthString = sixteenths.toString();\n        if (sixteenthString.length > 3) {\n            // the additional parseFloat removes insignificant trailing zeroes\n            sixteenths = parseFloat(parseFloat(sixteenthString).toFixed(3));\n        }\n        const progress = [measures, quarters, sixteenths];\n        return progress.join(\":\");\n    }\n    /**\n     * Return the time in ticks.\n     */\n    toTicks() {\n        const quarterTime = this._beatsToUnits(1);\n        const quarters = this.valueOf() / quarterTime;\n        return Math.round(quarters * this._getPPQ());\n    }\n    /**\n     * Return the time in seconds.\n     */\n    toSeconds() {\n        return this.valueOf();\n    }\n    /**\n     * Return the value as a midi note.\n     */\n    toMidi() {\n        return ftom(this.toFrequency());\n    }\n    _now() {\n        return this.context.now();\n    }\n}\n/**\n * Create a TimeClass from a time string or number. The time is computed against the\n * global Tone.Context. To use a specific context, use [[TimeClass]]\n * @param value A value which represents time\n * @param units The value's units if they can't be inferred by the value.\n * @category Unit\n * @example\n * const time = Tone.Time(\"4n\").toSeconds();\n * console.log(time);\n * @example\n * const note = Tone.Time(1).toNotation();\n * console.log(note);\n * @example\n * const freq = Tone.Time(0.5).toFrequency();\n * console.log(freq);\n */\nexport function Time(value, units) {\n    return new TimeClass(getContext(), value, units);\n}\n//# sourceMappingURL=Time.js.map","import { getContext } from \"../Global\";\nimport { TimeClass } from \"./Time\";\n/**\n * TransportTime is a the time along the Transport's\n * timeline. It is similar to Tone.Time, but instead of evaluating\n * against the AudioContext's clock, it is evaluated against\n * the Transport's position. See [TransportTime wiki](https://github.com/Tonejs/Tone.js/wiki/TransportTime).\n * @category Unit\n */\nexport class TransportTimeClass extends TimeClass {\n    constructor() {\n        super(...arguments);\n        this.name = \"TransportTime\";\n    }\n    /**\n     * Return the current time in whichever context is relevant\n     */\n    _now() {\n        return this.context.transport.seconds;\n    }\n}\n/**\n * TransportTime is a the time along the Transport's\n * timeline. It is similar to [[Time]], but instead of evaluating\n * against the AudioContext's clock, it is evaluated against\n * the Transport's position. See [TransportTime wiki](https://github.com/Tonejs/Tone.js/wiki/TransportTime).\n * @category Unit\n */\nexport function TransportTime(value, units) {\n    return new TransportTimeClass(getContext(), value, units);\n}\n//# sourceMappingURL=TransportTime.js.map","import { isAnyAudioContext, isAnyAudioNode, isAnyAudioParam, isAnyOfflineAudioContext, } from \"standardized-audio-context\";\n/**\n * Test if the given value is an instanceof AudioParam\n */\nexport function isAudioParam(arg) {\n    return isAnyAudioParam(arg);\n}\n/**\n * Test if the given value is an instanceof AudioNode\n */\nexport function isAudioNode(arg) {\n    return isAnyAudioNode(arg);\n}\n/**\n * Test if the arg is instanceof an OfflineAudioContext\n */\nexport function isOfflineAudioContext(arg) {\n    return isAnyOfflineAudioContext(arg);\n}\n/**\n * Test if the arg is an instanceof AudioContext\n */\nexport function isAudioContext(arg) {\n    return isAnyAudioContext(arg);\n}\n/**\n * Test if the arg is instanceof an AudioBuffer\n */\nexport function isAudioBuffer(arg) {\n    return arg instanceof AudioBuffer;\n}\n//# sourceMappingURL=AdvancedTypeCheck.js.map","/**\n * Assert that the statement is true, otherwise invoke the error.\n * @param statement\n * @param error The message which is passed into an Error\n */\nexport function assert(statement, error) {\n    if (!statement) {\n        throw new Error(error);\n    }\n}\n/**\n * Make sure that the given value is within the range\n */\nexport function assertRange(value, gte, lte = Infinity) {\n    if (!(gte <= value && value <= lte)) {\n        throw new RangeError(`Value must be within [${gte}, ${lte}], got: ${value}`);\n    }\n}\n/**\n * Make sure that the given value is within the range\n */\nexport function assertContextRunning(context) {\n    // add a warning if the context is not started\n    if (!context.isOffline && context.state !== \"running\") {\n        warn(\"The AudioContext is \\\"suspended\\\". Invoke Tone.start() from a user action to start the audio.\");\n    }\n}\n/**\n * The default logger is the console\n */\nlet defaultLogger = console;\n/**\n * Set the logging interface\n */\nexport function setLogger(logger) {\n    defaultLogger = logger;\n}\n/**\n * Log anything\n */\nexport function log(...args) {\n    defaultLogger.log(...args);\n}\n/**\n * Warn anything\n */\nexport function warn(...args) {\n    defaultLogger.warn(...args);\n}\n//# sourceMappingURL=Debug.js.map","import { assertRange } from \"./Debug\";\n/**\n * Assert that the number is in the given range.\n */\nexport function range(min, max = Infinity) {\n    const valueMap = new WeakMap();\n    return function (target, propertyKey) {\n        Reflect.defineProperty(target, propertyKey, {\n            configurable: true,\n            enumerable: true,\n            get: function () {\n                return valueMap.get(this);\n            },\n            set: function (newValue) {\n                assertRange(newValue, min, max);\n                valueMap.set(this, newValue);\n            }\n        });\n    };\n}\n/**\n * Convert the time to seconds and assert that the time is in between the two\n * values when being set.\n */\nexport function timeRange(min, max = Infinity) {\n    const valueMap = new WeakMap();\n    return function (target, propertyKey) {\n        Reflect.defineProperty(target, propertyKey, {\n            configurable: true,\n            enumerable: true,\n            get: function () {\n                return valueMap.get(this);\n            },\n            set: function (newValue) {\n                assertRange(this.toSeconds(newValue), min, max);\n                valueMap.set(this, newValue);\n            }\n        });\n    };\n}\n//# sourceMappingURL=Decorator.js.map","import { isAudioBuffer, isAudioNode, isAudioParam } from \"./AdvancedTypeCheck\";\nimport { isDefined, isObject, isUndef } from \"./TypeCheck\";\n/**\n * Some objects should not be merged\n */\nfunction noCopy(key, arg) {\n    return key === \"value\" || isAudioParam(arg) || isAudioNode(arg) || isAudioBuffer(arg);\n}\nexport function deepMerge(target, ...sources) {\n    if (!sources.length) {\n        return target;\n    }\n    const source = sources.shift();\n    if (isObject(target) && isObject(source)) {\n        for (const key in source) {\n            if (noCopy(key, source[key])) {\n                target[key] = source[key];\n            }\n            else if (isObject(source[key])) {\n                if (!target[key]) {\n                    Object.assign(target, { [key]: {} });\n                }\n                deepMerge(target[key], source[key]);\n            }\n            else {\n                Object.assign(target, { [key]: source[key] });\n            }\n        }\n    }\n    // @ts-ignore\n    return deepMerge(target, ...sources);\n}\n/**\n * Returns true if the two arrays have the same value for each of the elements\n */\nexport function deepEquals(arrayA, arrayB) {\n    return arrayA.length === arrayB.length && arrayA.every((element, index) => arrayB[index] === element);\n}\n/**\n * Convert an args array into an object.\n */\nexport function optionsFromArguments(defaults, argsArray, keys = [], objKey) {\n    const opts = {};\n    const args = Array.from(argsArray);\n    // if the first argument is an object and has an object key\n    if (isObject(args[0]) && objKey && !Reflect.has(args[0], objKey)) {\n        // if it's not part of the defaults\n        const partOfDefaults = Object.keys(args[0]).some(key => Reflect.has(defaults, key));\n        if (!partOfDefaults) {\n            // merge that key\n            deepMerge(opts, { [objKey]: args[0] });\n            // remove the obj key from the keys\n            keys.splice(keys.indexOf(objKey), 1);\n            // shift the first argument off\n            args.shift();\n        }\n    }\n    if (args.length === 1 && isObject(args[0])) {\n        deepMerge(opts, args[0]);\n    }\n    else {\n        for (let i = 0; i < keys.length; i++) {\n            if (isDefined(args[i])) {\n                opts[keys[i]] = args[i];\n            }\n        }\n    }\n    return deepMerge(defaults, opts);\n}\n/**\n * Return this instances default values by calling Constructor.getDefaults()\n */\nexport function getDefaultsFromInstance(instance) {\n    return instance.constructor.getDefaults();\n}\n/**\n * Returns the fallback if the given object is undefined.\n * Take an array of arguments and return a formatted options object.\n */\nexport function defaultArg(given, fallback) {\n    if (isUndef(given)) {\n        return fallback;\n    }\n    else {\n        return given;\n    }\n}\n/**\n * Remove all of the properties belonging to omit from obj.\n */\nexport function omitFromObject(obj, omit) {\n    omit.forEach(prop => {\n        if (Reflect.has(obj, prop)) {\n            delete obj[prop];\n        }\n    });\n    return obj;\n}\n//# sourceMappingURL=Defaults.js.map","import { Tone } from \"../Tone\";\nimport { isUndef } from \"./TypeCheck\";\n/**\n * Emitter gives classes which extend it\n * the ability to listen for and emit events.\n * Inspiration and reference from Jerome Etienne's [MicroEvent](https://github.com/jeromeetienne/microevent.js).\n * MIT (c) 2011 Jerome Etienne.\n * @category Core\n */\nexport class Emitter extends Tone {\n    constructor() {\n        super(...arguments);\n        this.name = \"Emitter\";\n    }\n    /**\n     * Bind a callback to a specific event.\n     * @param  event     The name of the event to listen for.\n     * @param  callback  The callback to invoke when the event is emitted\n     */\n    on(event, callback) {\n        // split the event\n        const events = event.split(/\\W+/);\n        events.forEach(eventName => {\n            if (isUndef(this._events)) {\n                this._events = {};\n            }\n            if (!this._events.hasOwnProperty(eventName)) {\n                this._events[eventName] = [];\n            }\n            this._events[eventName].push(callback);\n        });\n        return this;\n    }\n    /**\n     * Bind a callback which is only invoked once\n     * @param  event     The name of the event to listen for.\n     * @param  callback  The callback to invoke when the event is emitted\n     */\n    once(event, callback) {\n        const boundCallback = (...args) => {\n            // invoke the callback\n            callback(...args);\n            // remove the event\n            this.off(event, boundCallback);\n        };\n        this.on(event, boundCallback);\n        return this;\n    }\n    /**\n     * Remove the event listener.\n     * @param  event     The event to stop listening to.\n     * @param  callback  The callback which was bound to the event with Emitter.on.\n     *                   If no callback is given, all callbacks events are removed.\n     */\n    off(event, callback) {\n        const events = event.split(/\\W+/);\n        events.forEach(eventName => {\n            if (isUndef(this._events)) {\n                this._events = {};\n            }\n            if (this._events.hasOwnProperty(event)) {\n                if (isUndef(callback)) {\n                    this._events[event] = [];\n                }\n                else {\n                    const eventList = this._events[event];\n                    for (let i = eventList.length - 1; i >= 0; i--) {\n                        if (eventList[i] === callback) {\n                            eventList.splice(i, 1);\n                        }\n                    }\n                }\n            }\n        });\n        return this;\n    }\n    /**\n     * Invoke all of the callbacks bound to the event\n     * with any arguments passed in.\n     * @param  event  The name of the event.\n     * @param args The arguments to pass to the functions listening.\n     */\n    emit(event, ...args) {\n        if (this._events) {\n            if (this._events.hasOwnProperty(event)) {\n                const eventList = this._events[event].slice(0);\n                for (let i = 0, len = eventList.length; i < len; i++) {\n                    eventList[i].apply(this, args);\n                }\n            }\n        }\n        return this;\n    }\n    /**\n     * Add Emitter functions (on/off/emit) to the object\n     */\n    static mixin(constr) {\n        // instance._events = {};\n        [\"on\", \"once\", \"off\", \"emit\"].forEach(name => {\n            const property = Object.getOwnPropertyDescriptor(Emitter.prototype, name);\n            Object.defineProperty(constr.prototype, name, property);\n        });\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        this._events = undefined;\n        return this;\n    }\n}\n//# sourceMappingURL=Emitter.js.map","import { isArray } from \"./TypeCheck\";\n/**\n * Make the property not writable using `defineProperty`. Internal use only.\n */\nexport function readOnly(target, property) {\n    if (isArray(property)) {\n        property.forEach(str => readOnly(target, str));\n    }\n    else {\n        Object.defineProperty(target, property, {\n            enumerable: true,\n            writable: false,\n        });\n    }\n}\n/**\n * Make an attribute writeable. Internal use only.\n */\nexport function writable(target, property) {\n    if (isArray(property)) {\n        property.forEach(str => writable(target, str));\n    }\n    else {\n        Object.defineProperty(target, property, {\n            writable: true,\n        });\n    }\n}\nexport const noOp = () => {\n    // no operation here!\n};\n//# sourceMappingURL=Interface.js.map","/**\n * The threshold for correctness for operators. Less than one sample even\n * at very high sampling rates (e.g. `1e-6 < 1 / 192000`).\n */\nconst EPSILON = 1e-6;\n/**\n * Test if A is greater than B\n */\nexport function GT(a, b) {\n    return a > b + EPSILON;\n}\n/**\n * Test if A is greater than or equal to B\n */\nexport function GTE(a, b) {\n    return GT(a, b) || EQ(a, b);\n}\n/**\n * Test if A is less than B\n */\nexport function LT(a, b) {\n    return a + EPSILON < b;\n}\n/**\n * Test if A is less than B\n */\nexport function EQ(a, b) {\n    return Math.abs(a - b) < EPSILON;\n}\n/**\n * Clamp the value within the given range\n */\nexport function clamp(value, min, max) {\n    return Math.max(Math.min(value, max), min);\n}\n//# sourceMappingURL=Math.js.map","import { Tone } from \"../Tone\";\nimport { optionsFromArguments } from \"./Defaults\";\nimport { assert } from \"./Debug\";\nimport { EQ, GT, GTE, LT } from \"./Math\";\n/**\n * A Timeline class for scheduling and maintaining state\n * along a timeline. All events must have a \"time\" property.\n * Internally, events are stored in time order for fast\n * retrieval.\n */\nexport class Timeline extends Tone {\n    constructor() {\n        super();\n        this.name = \"Timeline\";\n        /**\n         * The array of scheduled timeline events\n         */\n        this._timeline = [];\n        const options = optionsFromArguments(Timeline.getDefaults(), arguments, [\"memory\"]);\n        this.memory = options.memory;\n        this.increasing = options.increasing;\n    }\n    static getDefaults() {\n        return {\n            memory: Infinity,\n            increasing: false,\n        };\n    }\n    /**\n     * The number of items in the timeline.\n     */\n    get length() {\n        return this._timeline.length;\n    }\n    /**\n     * Insert an event object onto the timeline. Events must have a \"time\" attribute.\n     * @param event  The event object to insert into the timeline.\n     */\n    add(event) {\n        // the event needs to have a time attribute\n        assert(Reflect.has(event, \"time\"), \"Timeline: events must have a time attribute\");\n        event.time = event.time.valueOf();\n        if (this.increasing && this.length) {\n            const lastValue = this._timeline[this.length - 1];\n            assert(GTE(event.time, lastValue.time), \"The time must be greater than or equal to the last scheduled time\");\n            this._timeline.push(event);\n        }\n        else {\n            const index = this._search(event.time);\n            this._timeline.splice(index + 1, 0, event);\n        }\n        // if the length is more than the memory, remove the previous ones\n        if (this.length > this.memory) {\n            const diff = this.length - this.memory;\n            this._timeline.splice(0, diff);\n        }\n        return this;\n    }\n    /**\n     * Remove an event from the timeline.\n     * @param  {Object}  event  The event object to remove from the list.\n     * @returns {Timeline} this\n     */\n    remove(event) {\n        const index = this._timeline.indexOf(event);\n        if (index !== -1) {\n            this._timeline.splice(index, 1);\n        }\n        return this;\n    }\n    /**\n     * Get the nearest event whose time is less than or equal to the given time.\n     * @param  time  The time to query.\n     */\n    get(time, param = \"time\") {\n        const index = this._search(time, param);\n        if (index !== -1) {\n            return this._timeline[index];\n        }\n        else {\n            return null;\n        }\n    }\n    /**\n     * Return the first event in the timeline without removing it\n     * @returns {Object} The first event object\n     */\n    peek() {\n        return this._timeline[0];\n    }\n    /**\n     * Return the first event in the timeline and remove it\n     */\n    shift() {\n        return this._timeline.shift();\n    }\n    /**\n     * Get the event which is scheduled after the given time.\n     * @param  time  The time to query.\n     */\n    getAfter(time, param = \"time\") {\n        const index = this._search(time, param);\n        if (index + 1 < this._timeline.length) {\n            return this._timeline[index + 1];\n        }\n        else {\n            return null;\n        }\n    }\n    /**\n     * Get the event before the event at the given time.\n     * @param  time  The time to query.\n     */\n    getBefore(time) {\n        const len = this._timeline.length;\n        // if it's after the last item, return the last item\n        if (len > 0 && this._timeline[len - 1].time < time) {\n            return this._timeline[len - 1];\n        }\n        const index = this._search(time);\n        if (index - 1 >= 0) {\n            return this._timeline[index - 1];\n        }\n        else {\n            return null;\n        }\n    }\n    /**\n     * Cancel events at and after the given time\n     * @param  after  The time to query.\n     */\n    cancel(after) {\n        if (this._timeline.length > 1) {\n            let index = this._search(after);\n            if (index >= 0) {\n                if (EQ(this._timeline[index].time, after)) {\n                    // get the first item with that time\n                    for (let i = index; i >= 0; i--) {\n                        if (EQ(this._timeline[i].time, after)) {\n                            index = i;\n                        }\n                        else {\n                            break;\n                        }\n                    }\n                    this._timeline = this._timeline.slice(0, index);\n                }\n                else {\n                    this._timeline = this._timeline.slice(0, index + 1);\n                }\n            }\n            else {\n                this._timeline = [];\n            }\n        }\n        else if (this._timeline.length === 1) {\n            // the first item's time\n            if (GTE(this._timeline[0].time, after)) {\n                this._timeline = [];\n            }\n        }\n        return this;\n    }\n    /**\n     * Cancel events before or equal to the given time.\n     * @param  time  The time to cancel before.\n     */\n    cancelBefore(time) {\n        const index = this._search(time);\n        if (index >= 0) {\n            this._timeline = this._timeline.slice(index + 1);\n        }\n        return this;\n    }\n    /**\n     * Returns the previous event if there is one. null otherwise\n     * @param  event The event to find the previous one of\n     * @return The event right before the given event\n     */\n    previousEvent(event) {\n        const index = this._timeline.indexOf(event);\n        if (index > 0) {\n            return this._timeline[index - 1];\n        }\n        else {\n            return null;\n        }\n    }\n    /**\n     * Does a binary search on the timeline array and returns the\n     * nearest event index whose time is after or equal to the given time.\n     * If a time is searched before the first index in the timeline, -1 is returned.\n     * If the time is after the end, the index of the last item is returned.\n     */\n    _search(time, param = \"time\") {\n        if (this._timeline.length === 0) {\n            return -1;\n        }\n        let beginning = 0;\n        const len = this._timeline.length;\n        let end = len;\n        if (len > 0 && this._timeline[len - 1][param] <= time) {\n            return len - 1;\n        }\n        while (beginning < end) {\n            // calculate the midpoint for roughly equal partition\n            let midPoint = Math.floor(beginning + (end - beginning) / 2);\n            const event = this._timeline[midPoint];\n            const nextEvent = this._timeline[midPoint + 1];\n            if (EQ(event[param], time)) {\n                // choose the last one that has the same time\n                for (let i = midPoint; i < this._timeline.length; i++) {\n                    const testEvent = this._timeline[i];\n                    if (EQ(testEvent[param], time)) {\n                        midPoint = i;\n                    }\n                    else {\n                        break;\n                    }\n                }\n                return midPoint;\n            }\n            else if (LT(event[param], time) && GT(nextEvent[param], time)) {\n                return midPoint;\n            }\n            else if (GT(event[param], time)) {\n                // search lower\n                end = midPoint;\n            }\n            else {\n                // search upper\n                beginning = midPoint + 1;\n            }\n        }\n        return -1;\n    }\n    /**\n     * Internal iterator. Applies extra safety checks for\n     * removing items from the array.\n     */\n    _iterate(callback, lowerBound = 0, upperBound = this._timeline.length - 1) {\n        this._timeline.slice(lowerBound, upperBound + 1).forEach(callback);\n    }\n    /**\n     * Iterate over everything in the array\n     * @param  callback The callback to invoke with every item\n     */\n    forEach(callback) {\n        this._iterate(callback);\n        return this;\n    }\n    /**\n     * Iterate over everything in the array at or before the given time.\n     * @param  time The time to check if items are before\n     * @param  callback The callback to invoke with every item\n     */\n    forEachBefore(time, callback) {\n        // iterate over the items in reverse so that removing an item doesn't break things\n        const upperBound = this._search(time);\n        if (upperBound !== -1) {\n            this._iterate(callback, 0, upperBound);\n        }\n        return this;\n    }\n    /**\n     * Iterate over everything in the array after the given time.\n     * @param  time The time to check if items are before\n     * @param  callback The callback to invoke with every item\n     */\n    forEachAfter(time, callback) {\n        // iterate over the items in reverse so that removing an item doesn't break things\n        const lowerBound = this._search(time);\n        this._iterate(callback, lowerBound + 1);\n        return this;\n    }\n    /**\n     * Iterate over everything in the array between the startTime and endTime.\n     * The timerange is inclusive of the startTime, but exclusive of the endTime.\n     * range = [startTime, endTime).\n     * @param  startTime The time to check if items are before\n     * @param  endTime The end of the test interval.\n     * @param  callback The callback to invoke with every item\n     */\n    forEachBetween(startTime, endTime, callback) {\n        let lowerBound = this._search(startTime);\n        let upperBound = this._search(endTime);\n        if (lowerBound !== -1 && upperBound !== -1) {\n            if (this._timeline[lowerBound].time !== startTime) {\n                lowerBound += 1;\n            }\n            // exclusive of the end time\n            if (this._timeline[upperBound].time === endTime) {\n                upperBound -= 1;\n            }\n            this._iterate(callback, lowerBound, upperBound);\n        }\n        else if (lowerBound === -1) {\n            this._iterate(callback, 0, upperBound);\n        }\n        return this;\n    }\n    /**\n     * Iterate over everything in the array at or after the given time. Similar to\n     * forEachAfter, but includes the item(s) at the given time.\n     * @param  time The time to check if items are before\n     * @param  callback The callback to invoke with every item\n     */\n    forEachFrom(time, callback) {\n        // iterate over the items in reverse so that removing an item doesn't break things\n        let lowerBound = this._search(time);\n        // work backwards until the event time is less than time\n        while (lowerBound >= 0 && this._timeline[lowerBound].time >= time) {\n            lowerBound--;\n        }\n        this._iterate(callback, lowerBound + 1);\n        return this;\n    }\n    /**\n     * Iterate over everything in the array at the given time\n     * @param  time The time to check if items are before\n     * @param  callback The callback to invoke with every item\n     */\n    forEachAtTime(time, callback) {\n        // iterate over the items in reverse so that removing an item doesn't break things\n        const upperBound = this._search(time);\n        if (upperBound !== -1 && EQ(this._timeline[upperBound].time, time)) {\n            let lowerBound = upperBound;\n            for (let i = upperBound; i >= 0; i--) {\n                if (EQ(this._timeline[i].time, time)) {\n                    lowerBound = i;\n                }\n                else {\n                    break;\n                }\n            }\n            this._iterate(event => {\n                callback(event);\n            }, lowerBound, upperBound);\n        }\n        return this;\n    }\n    /**\n     * Clean up.\n     */\n    dispose() {\n        super.dispose();\n        this._timeline = [];\n        return this;\n    }\n}\n//# sourceMappingURL=Timeline.js.map","/**\n * Test if the arg is undefined\n */\nexport function isUndef(arg) {\n    return typeof arg === \"undefined\";\n}\n/**\n * Test if the arg is not undefined\n */\nexport function isDefined(arg) {\n    return !isUndef(arg);\n}\n/**\n * Test if the arg is a function\n */\nexport function isFunction(arg) {\n    return typeof arg === \"function\";\n}\n/**\n * Test if the argument is a number.\n */\nexport function isNumber(arg) {\n    return (typeof arg === \"number\");\n}\n/**\n * Test if the given argument is an object literal (i.e. `{}`);\n */\nexport function isObject(arg) {\n    return (Object.prototype.toString.call(arg) === \"[object Object]\" && arg.constructor === Object);\n}\n/**\n * Test if the argument is a boolean.\n */\nexport function isBoolean(arg) {\n    return (typeof arg === \"boolean\");\n}\n/**\n * Test if the argument is an Array\n */\nexport function isArray(arg) {\n    return (Array.isArray(arg));\n}\n/**\n * Test if the argument is a string.\n */\nexport function isString(arg) {\n    return (typeof arg === \"string\");\n}\n/**\n * Test if the argument is in the form of a note in scientific pitch notation.\n * e.g. \"C4\"\n */\nexport function isNote(arg) {\n    return isString(arg) && /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i.test(arg);\n}\n//# sourceMappingURL=TypeCheck.js.map","import { Volume } from \"../component/channel/Volume\";\nimport { ToneAudioNode } from \"../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\n/**\n * Base-class for all instruments\n */\nexport class Instrument extends ToneAudioNode {\n    constructor() {\n        super(optionsFromArguments(Instrument.getDefaults(), arguments));\n        /**\n         * Keep track of all events scheduled to the transport\n         * when the instrument is 'synced'\n         */\n        this._scheduledEvents = [];\n        /**\n         * If the instrument is currently synced\n         */\n        this._synced = false;\n        this._original_triggerAttack = this.triggerAttack;\n        this._original_triggerRelease = this.triggerRelease;\n        const options = optionsFromArguments(Instrument.getDefaults(), arguments);\n        this._volume = this.output = new Volume({\n            context: this.context,\n            volume: options.volume,\n        });\n        this.volume = this._volume.volume;\n        readOnly(this, \"volume\");\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            volume: 0,\n        });\n    }\n    /**\n     * Sync the instrument to the Transport. All subsequent calls of\n     * [[triggerAttack]] and [[triggerRelease]] will be scheduled along the transport.\n     * @example\n     * const fmSynth = new Tone.FMSynth().toDestination();\n     * fmSynth.volume.value = -6;\n     * fmSynth.sync();\n     * // schedule 3 notes when the transport first starts\n     * fmSynth.triggerAttackRelease(\"C4\", \"8n\", 0);\n     * fmSynth.triggerAttackRelease(\"E4\", \"8n\", \"8n\");\n     * fmSynth.triggerAttackRelease(\"G4\", \"8n\", \"4n\");\n     * // start the transport to hear the notes\n     * Tone.Transport.start();\n     */\n    sync() {\n        if (this._syncState()) {\n            this._syncMethod(\"triggerAttack\", 1);\n            this._syncMethod(\"triggerRelease\", 0);\n        }\n        return this;\n    }\n    /**\n     * set _sync\n     */\n    _syncState() {\n        let changed = false;\n        if (!this._synced) {\n            this._synced = true;\n            changed = true;\n        }\n        return changed;\n    }\n    /**\n     * Wrap the given method so that it can be synchronized\n     * @param method Which method to wrap and sync\n     * @param  timePosition What position the time argument appears in\n     */\n    _syncMethod(method, timePosition) {\n        const originalMethod = this[\"_original_\" + method] = this[method];\n        this[method] = (...args) => {\n            const time = args[timePosition];\n            const id = this.context.transport.schedule((t) => {\n                args[timePosition] = t;\n                originalMethod.apply(this, args);\n            }, time);\n            this._scheduledEvents.push(id);\n        };\n    }\n    /**\n     * Unsync the instrument from the Transport\n     */\n    unsync() {\n        this._scheduledEvents.forEach(id => this.context.transport.clear(id));\n        this._scheduledEvents = [];\n        if (this._synced) {\n            this._synced = false;\n            this.triggerAttack = this._original_triggerAttack;\n            this.triggerRelease = this._original_triggerRelease;\n        }\n        return this;\n    }\n    /**\n     * Trigger the attack and then the release after the duration.\n     * @param  note     The note to trigger.\n     * @param  duration How long the note should be held for before\n     *                         triggering the release. This value must be greater than 0.\n     * @param time  When the note should be triggered.\n     * @param  velocity The velocity the note should be triggered at.\n     * @example\n     * const synth = new Tone.Synth().toDestination();\n     * // trigger \"C4\" for the duration of an 8th note\n     * synth.triggerAttackRelease(\"C4\", \"8n\");\n     */\n    triggerAttackRelease(note, duration, time, velocity) {\n        const computedTime = this.toSeconds(time);\n        const computedDuration = this.toSeconds(duration);\n        this.triggerAttack(note, computedTime, velocity);\n        this.triggerRelease(computedTime + computedDuration);\n        return this;\n    }\n    /**\n     * clean up\n     * @returns {Instrument} this\n     */\n    dispose() {\n        super.dispose();\n        this._volume.dispose();\n        this.unsync();\n        this._scheduledEvents = [];\n        return this;\n    }\n}\n//# sourceMappingURL=Instrument.js.map","import { connect } from \"../core/context/ToneAudioNode\";\nimport { Param } from \"../core/context/Param\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { OneShotSource } from \"../source/OneShotSource\";\n/**\n * Wrapper around the native fire-and-forget ConstantSource.\n * Adds the ability to reschedule the stop method.\n * @category Signal\n */\nexport class ToneConstantSource extends OneShotSource {\n    constructor() {\n        super(optionsFromArguments(ToneConstantSource.getDefaults(), arguments, [\"offset\"]));\n        this.name = \"ToneConstantSource\";\n        /**\n         * The signal generator\n         */\n        this._source = this.context.createConstantSource();\n        const options = optionsFromArguments(ToneConstantSource.getDefaults(), arguments, [\"offset\"]);\n        connect(this._source, this._gainNode);\n        this.offset = new Param({\n            context: this.context,\n            convert: options.convert,\n            param: this._source.offset,\n            units: options.units,\n            value: options.offset,\n            minValue: options.minValue,\n            maxValue: options.maxValue,\n        });\n    }\n    static getDefaults() {\n        return Object.assign(OneShotSource.getDefaults(), {\n            convert: true,\n            offset: 1,\n            units: \"number\",\n        });\n    }\n    /**\n     * Start the source node at the given time\n     * @param  time When to start the source\n     */\n    start(time) {\n        const computedTime = this.toSeconds(time);\n        this.log(\"start\", computedTime);\n        this._startGain(computedTime);\n        this._source.start(computedTime);\n        return this;\n    }\n    _stopSource(time) {\n        this._source.stop(time);\n    }\n    dispose() {\n        super.dispose();\n        if (this.state === \"started\") {\n            this.stop();\n        }\n        this._source.disconnect();\n        this.offset.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=ToneConstantSource.js.map","import { Param } from \"../core/context/Param\";\nimport { ToneAudioNode } from \"../core/context/ToneAudioNode\";\nimport { connect } from \"../core/context/ToneAudioNode\";\nimport { isAudioParam } from \"../core/util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { ToneConstantSource } from \"./ToneConstantSource\";\n/**\n * A signal is an audio-rate value. Tone.Signal is a core component of the library.\n * Unlike a number, Signals can be scheduled with sample-level accuracy. Tone.Signal\n * has all of the methods available to native Web Audio\n * [AudioParam](http://webaudio.github.io/web-audio-api/#the-audioparam-interface)\n * as well as additional conveniences. Read more about working with signals\n * [here](https://github.com/Tonejs/Tone.js/wiki/Signals).\n *\n * @example\n * const osc = new Tone.Oscillator().toDestination().start();\n * // a scheduleable signal which can be connected to control an AudioParam or another Signal\n * const signal = new Tone.Signal({\n * \tvalue: \"C4\",\n * \tunits: \"frequency\"\n * }).connect(osc.frequency);\n * // the scheduled ramp controls the connected signal\n * signal.rampTo(\"C2\", 4, \"+0.5\");\n * @category Signal\n */\nexport class Signal extends ToneAudioNode {\n    constructor() {\n        super(optionsFromArguments(Signal.getDefaults(), arguments, [\"value\", \"units\"]));\n        this.name = \"Signal\";\n        /**\n         * Indicates if the value should be overridden on connection.\n         */\n        this.override = true;\n        const options = optionsFromArguments(Signal.getDefaults(), arguments, [\"value\", \"units\"]);\n        this.output = this._constantSource = new ToneConstantSource({\n            context: this.context,\n            convert: options.convert,\n            offset: options.value,\n            units: options.units,\n            minValue: options.minValue,\n            maxValue: options.maxValue,\n        });\n        this._constantSource.start(0);\n        this.input = this._param = this._constantSource.offset;\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            convert: true,\n            units: \"number\",\n            value: 0,\n        });\n    }\n    connect(destination, outputNum = 0, inputNum = 0) {\n        // start it only when connected to something\n        connectSignal(this, destination, outputNum, inputNum);\n        return this;\n    }\n    dispose() {\n        super.dispose();\n        this._param.dispose();\n        this._constantSource.dispose();\n        return this;\n    }\n    //-------------------------------------\n    // ABSTRACT PARAM INTERFACE\n    // just a proxy for the ConstantSourceNode's offset AudioParam\n    // all docs are generated from AbstractParam.ts\n    //-------------------------------------\n    setValueAtTime(value, time) {\n        this._param.setValueAtTime(value, time);\n        return this;\n    }\n    getValueAtTime(time) {\n        return this._param.getValueAtTime(time);\n    }\n    setRampPoint(time) {\n        this._param.setRampPoint(time);\n        return this;\n    }\n    linearRampToValueAtTime(value, time) {\n        this._param.linearRampToValueAtTime(value, time);\n        return this;\n    }\n    exponentialRampToValueAtTime(value, time) {\n        this._param.exponentialRampToValueAtTime(value, time);\n        return this;\n    }\n    exponentialRampTo(value, rampTime, startTime) {\n        this._param.exponentialRampTo(value, rampTime, startTime);\n        return this;\n    }\n    linearRampTo(value, rampTime, startTime) {\n        this._param.linearRampTo(value, rampTime, startTime);\n        return this;\n    }\n    targetRampTo(value, rampTime, startTime) {\n        this._param.targetRampTo(value, rampTime, startTime);\n        return this;\n    }\n    exponentialApproachValueAtTime(value, time, rampTime) {\n        this._param.exponentialApproachValueAtTime(value, time, rampTime);\n        return this;\n    }\n    setTargetAtTime(value, startTime, timeConstant) {\n        this._param.setTargetAtTime(value, startTime, timeConstant);\n        return this;\n    }\n    setValueCurveAtTime(values, startTime, duration, scaling) {\n        this._param.setValueCurveAtTime(values, startTime, duration, scaling);\n        return this;\n    }\n    cancelScheduledValues(time) {\n        this._param.cancelScheduledValues(time);\n        return this;\n    }\n    cancelAndHoldAtTime(time) {\n        this._param.cancelAndHoldAtTime(time);\n        return this;\n    }\n    rampTo(value, rampTime, startTime) {\n        this._param.rampTo(value, rampTime, startTime);\n        return this;\n    }\n    get value() {\n        return this._param.value;\n    }\n    set value(value) {\n        this._param.value = value;\n    }\n    get convert() {\n        return this._param.convert;\n    }\n    set convert(convert) {\n        this._param.convert = convert;\n    }\n    get units() {\n        return this._param.units;\n    }\n    get overridden() {\n        return this._param.overridden;\n    }\n    set overridden(overridden) {\n        this._param.overridden = overridden;\n    }\n    get maxValue() {\n        return this._param.maxValue;\n    }\n    get minValue() {\n        return this._param.minValue;\n    }\n    /**\n     * See [[Param.apply]].\n     */\n    apply(param) {\n        this._param.apply(param);\n        return this;\n    }\n}\n/**\n * When connecting from a signal, it's necessary to zero out the node destination\n * node if that node is also a signal. If the destination is not 0, then the values\n * will be summed. This method insures that the output of the destination signal will\n * be the same as the source signal, making the destination signal a pass through node.\n * @param signal The output signal to connect from\n * @param destination the destination to connect to\n * @param outputNum the optional output number\n * @param inputNum the input number\n */\nexport function connectSignal(signal, destination, outputNum, inputNum) {\n    if (destination instanceof Param || isAudioParam(destination) ||\n        (destination instanceof Signal && destination.override)) {\n        // cancel changes\n        destination.cancelScheduledValues(0);\n        // reset the value\n        destination.setValueAtTime(0, 0);\n        // mark the value as overridden\n        if (destination instanceof Signal) {\n            destination.overridden = true;\n        }\n    }\n    connect(signal, destination, outputNum, inputNum);\n}\n//# sourceMappingURL=Signal.js.map","import { Gain } from \"../core/context/Gain\";\nimport { ToneAudioNode, } from \"../core/context/ToneAudioNode\";\nimport { noOp } from \"../core/util/Interface\";\nimport { assert } from \"../core/util/Debug\";\n/**\n * Base class for fire-and-forget nodes\n */\nexport class OneShotSource extends ToneAudioNode {\n    constructor(options) {\n        super(options);\n        /**\n         * The callback to invoke after the\n         * source is done playing.\n         */\n        this.onended = noOp;\n        /**\n         * The start time\n         */\n        this._startTime = -1;\n        /**\n         * The stop time\n         */\n        this._stopTime = -1;\n        /**\n         * The id of the timeout\n         */\n        this._timeout = -1;\n        /**\n         * The public output node\n         */\n        this.output = new Gain({\n            context: this.context,\n            gain: 0,\n        });\n        /**\n         * The output gain node.\n         */\n        this._gainNode = this.output;\n        /**\n         * Get the playback state at the given time\n         */\n        this.getStateAtTime = function (time) {\n            const computedTime = this.toSeconds(time);\n            if (this._startTime !== -1 &&\n                computedTime >= this._startTime &&\n                (this._stopTime === -1 || computedTime <= this._stopTime)) {\n                return \"started\";\n            }\n            else {\n                return \"stopped\";\n            }\n        };\n        this._fadeIn = options.fadeIn;\n        this._fadeOut = options.fadeOut;\n        this._curve = options.curve;\n        this.onended = options.onended;\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            curve: \"linear\",\n            fadeIn: 0,\n            fadeOut: 0,\n            onended: noOp,\n        });\n    }\n    /**\n     * Start the source at the given time\n     * @param  time When to start the source\n     */\n    _startGain(time, gain = 1) {\n        assert(this._startTime === -1, \"Source cannot be started more than once\");\n        // apply a fade in envelope\n        const fadeInTime = this.toSeconds(this._fadeIn);\n        // record the start time\n        this._startTime = time + fadeInTime;\n        this._startTime = Math.max(this._startTime, this.context.currentTime);\n        // schedule the envelope\n        if (fadeInTime > 0) {\n            this._gainNode.gain.setValueAtTime(0, time);\n            if (this._curve === \"linear\") {\n                this._gainNode.gain.linearRampToValueAtTime(gain, time + fadeInTime);\n            }\n            else {\n                this._gainNode.gain.exponentialApproachValueAtTime(gain, time, fadeInTime);\n            }\n        }\n        else {\n            this._gainNode.gain.setValueAtTime(gain, time);\n        }\n        return this;\n    }\n    /**\n     * Stop the source node at the given time.\n     * @param time When to stop the source\n     */\n    stop(time) {\n        this.log(\"stop\", time);\n        this._stopGain(this.toSeconds(time));\n        return this;\n    }\n    /**\n     * Stop the source at the given time\n     * @param  time When to stop the source\n     */\n    _stopGain(time) {\n        assert(this._startTime !== -1, \"'start' must be called before 'stop'\");\n        // cancel the previous stop\n        this.cancelStop();\n        // the fadeOut time\n        const fadeOutTime = this.toSeconds(this._fadeOut);\n        // schedule the stop callback\n        this._stopTime = this.toSeconds(time) + fadeOutTime;\n        this._stopTime = Math.max(this._stopTime, this.context.currentTime);\n        if (fadeOutTime > 0) {\n            // start the fade out curve at the given time\n            if (this._curve === \"linear\") {\n                this._gainNode.gain.linearRampTo(0, fadeOutTime, time);\n            }\n            else {\n                this._gainNode.gain.targetRampTo(0, fadeOutTime, time);\n            }\n        }\n        else {\n            // stop any ongoing ramps, and set the value to 0\n            this._gainNode.gain.cancelAndHoldAtTime(time);\n            this._gainNode.gain.setValueAtTime(0, time);\n        }\n        this.context.clearTimeout(this._timeout);\n        this._timeout = this.context.setTimeout(() => {\n            // allow additional time for the exponential curve to fully decay\n            const additionalTail = this._curve === \"exponential\" ? fadeOutTime * 2 : 0;\n            this._stopSource(this.now() + additionalTail);\n            this._onended();\n        }, this._stopTime - this.context.currentTime);\n        return this;\n    }\n    /**\n     * Invoke the onended callback\n     */\n    _onended() {\n        if (this.onended !== noOp) {\n            this.onended(this);\n            // overwrite onended to make sure it only is called once\n            this.onended = noOp;\n            // dispose when it's ended to free up for garbage collection only in the online context\n            if (!this.context.isOffline) {\n                const disposeCallback = () => this.dispose();\n                // @ts-ignore\n                if (typeof window.requestIdleCallback !== \"undefined\") {\n                    // @ts-ignore\n                    window.requestIdleCallback(disposeCallback);\n                }\n                else {\n                    setTimeout(disposeCallback, 1000);\n                }\n            }\n        }\n    }\n    /**\n     * Get the playback state at the current time\n     */\n    get state() {\n        return this.getStateAtTime(this.now());\n    }\n    /**\n     * Cancel a scheduled stop event\n     */\n    cancelStop() {\n        this.log(\"cancelStop\");\n        assert(this._startTime !== -1, \"Source is not started\");\n        // cancel the stop envelope\n        this._gainNode.gain.cancelScheduledValues(this._startTime + this.sampleTime);\n        this.context.clearTimeout(this._timeout);\n        this._stopTime = -1;\n        return this;\n    }\n    dispose() {\n        super.dispose();\n        this._gainNode.disconnect();\n        return this;\n    }\n}\n//# sourceMappingURL=OneShotSource.js.map","import { Volume } from \"../../component/channel/Volume\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { onContextClose, onContextInit } from \"./ContextInitialization\";\nimport { Gain } from \"./Gain\";\nimport { connectSeries, ToneAudioNode } from \"./ToneAudioNode\";\n/**\n * A single master output which is connected to the\n * AudioDestinationNode (aka your speakers).\n * It provides useful conveniences such as the ability\n * to set the volume and mute the entire application.\n * It also gives you the ability to apply master effects to your application.\n *\n * @example\n * const oscillator = new Tone.Oscillator().start();\n * // the audio will go from the oscillator to the speakers\n * oscillator.connect(Tone.getDestination());\n * // a convenience for connecting to the master output is also provided:\n * oscillator.toDestination();\n * @category Core\n */\nexport class Destination extends ToneAudioNode {\n    constructor() {\n        super(optionsFromArguments(Destination.getDefaults(), arguments));\n        this.name = \"Destination\";\n        this.input = new Volume({ context: this.context });\n        this.output = new Gain({ context: this.context });\n        /**\n         * The volume of the master output in decibels. -Infinity is silent, and 0 is no change.\n         * @example\n         * const osc = new Tone.Oscillator().toDestination();\n         * osc.start();\n         * // ramp the volume down to silent over 10 seconds\n         * Tone.getDestination().volume.rampTo(-Infinity, 10);\n         */\n        this.volume = this.input.volume;\n        const options = optionsFromArguments(Destination.getDefaults(), arguments);\n        connectSeries(this.input, this.output, this.context.rawContext.destination);\n        this.mute = options.mute;\n        this._internalChannels = [this.input, this.context.rawContext.destination, this.output];\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            mute: false,\n            volume: 0,\n        });\n    }\n    /**\n     * Mute the output.\n     * @example\n     * const oscillator = new Tone.Oscillator().start().toDestination();\n     * setTimeout(() => {\n     * \t// mute the output\n     * \tTone.Destination.mute = true;\n     * }, 1000);\n     */\n    get mute() {\n        return this.input.mute;\n    }\n    set mute(mute) {\n        this.input.mute = mute;\n    }\n    /**\n     * Add a master effects chain. NOTE: this will disconnect any nodes which were previously\n     * chained in the master effects chain.\n     * @param args All arguments will be connected in a row and the Master will be routed through it.\n     * @example\n     * // route all audio through a filter and compressor\n     * const lowpass = new Tone.Filter(800, \"lowpass\");\n     * const compressor = new Tone.Compressor(-18);\n     * Tone.Destination.chain(lowpass, compressor);\n     */\n    chain(...args) {\n        this.input.disconnect();\n        args.unshift(this.input);\n        args.push(this.output);\n        connectSeries(...args);\n        return this;\n    }\n    /**\n     * The maximum number of channels the system can output\n     * @example\n     * console.log(Tone.Destination.maxChannelCount);\n     */\n    get maxChannelCount() {\n        return this.context.rawContext.destination.maxChannelCount;\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        this.volume.dispose();\n        return this;\n    }\n}\n//-------------------------------------\n// \tINITIALIZATION\n//-------------------------------------\nonContextInit(context => {\n    context.destination = new Destination({ context });\n});\nonContextClose(context => {\n    context.destination.dispose();\n});\n//# sourceMappingURL=Destination.js.map","import { Timeline } from \"./Timeline\";\nimport { Tone } from \"../Tone\";\n/**\n * Represents a single value which is gettable and settable in a timed way\n */\nexport class TimelineValue extends Tone {\n    /**\n     * @param initialValue The value to return if there is no scheduled values\n     */\n    constructor(initialValue) {\n        super();\n        this.name = \"TimelineValue\";\n        /**\n         * The timeline which stores the values\n         */\n        this._timeline = new Timeline({ memory: 10 });\n        this._initialValue = initialValue;\n    }\n    /**\n     * Set the value at the given time\n     */\n    set(value, time) {\n        this._timeline.add({\n            value, time\n        });\n        return this;\n    }\n    /**\n     * Get the value at the given time\n     */\n    get(time) {\n        const event = this._timeline.get(time);\n        if (event) {\n            return event.value;\n        }\n        else {\n            return this._initialValue;\n        }\n    }\n}\n//# sourceMappingURL=TimelineValue.js.map","import { getContext } from \"../Global\";\nimport { TransportTimeClass } from \"./TransportTime\";\n/**\n * Ticks is a primitive type for encoding Time values.\n * Ticks can be constructed with or without the `new` keyword. Ticks can be passed\n * into the parameter of any method which takes time as an argument.\n * @example\n * const t = Tone.Ticks(\"4n\"); // a quarter note as ticks\n * @category Unit\n */\nexport class TicksClass extends TransportTimeClass {\n    constructor() {\n        super(...arguments);\n        this.name = \"Ticks\";\n        this.defaultUnits = \"i\";\n    }\n    /**\n     * Get the current time in the given units\n     */\n    _now() {\n        return this.context.transport.ticks;\n    }\n    /**\n     * Return the value of the beats in the current units\n     */\n    _beatsToUnits(beats) {\n        return this._getPPQ() * beats;\n    }\n    /**\n     * Returns the value of a second in the current units\n     */\n    _secondsToUnits(seconds) {\n        return Math.floor(seconds / (60 / this._getBpm()) * this._getPPQ());\n    }\n    /**\n     * Returns the value of a tick in the current time units\n     */\n    _ticksToUnits(ticks) {\n        return ticks;\n    }\n    /**\n     * Return the time in ticks\n     */\n    toTicks() {\n        return this.valueOf();\n    }\n    /**\n     * Return the time in seconds\n     */\n    toSeconds() {\n        return (this.valueOf() / this._getPPQ()) * (60 / this._getBpm());\n    }\n}\n/**\n * Convert a time representation to ticks\n * @category Unit\n */\nexport function Ticks(value, units) {\n    return new TicksClass(getContext(), value, units);\n}\n//# sourceMappingURL=Ticks.js.map","import { Tone } from \"../Tone\";\nimport { isDefined } from \"./TypeCheck\";\nimport { assert } from \"./Debug\";\n/**\n * Similar to Tone.Timeline, but all events represent\n * intervals with both \"time\" and \"duration\" times. The\n * events are placed in a tree structure optimized\n * for querying an intersection point with the timeline\n * events. Internally uses an [Interval Tree](https://en.wikipedia.org/wiki/Interval_tree)\n * to represent the data.\n */\nexport class IntervalTimeline extends Tone {\n    constructor() {\n        super(...arguments);\n        this.name = \"IntervalTimeline\";\n        /**\n         * The root node of the inteval tree\n         */\n        this._root = null;\n        /**\n         * Keep track of the length of the timeline.\n         */\n        this._length = 0;\n    }\n    /**\n     * The event to add to the timeline. All events must\n     * have a time and duration value\n     * @param  event  The event to add to the timeline\n     */\n    add(event) {\n        assert(isDefined(event.time), \"Events must have a time property\");\n        assert(isDefined(event.duration), \"Events must have a duration parameter\");\n        event.time = event.time.valueOf();\n        let node = new IntervalNode(event.time, event.time + event.duration, event);\n        if (this._root === null) {\n            this._root = node;\n        }\n        else {\n            this._root.insert(node);\n        }\n        this._length++;\n        // Restructure tree to be balanced\n        while (node !== null) {\n            node.updateHeight();\n            node.updateMax();\n            this._rebalance(node);\n            node = node.parent;\n        }\n        return this;\n    }\n    /**\n     * Remove an event from the timeline.\n     * @param  event  The event to remove from the timeline\n     */\n    remove(event) {\n        if (this._root !== null) {\n            const results = [];\n            this._root.search(event.time, results);\n            for (const node of results) {\n                if (node.event === event) {\n                    this._removeNode(node);\n                    this._length--;\n                    break;\n                }\n            }\n        }\n        return this;\n    }\n    /**\n     * The number of items in the timeline.\n     * @readOnly\n     */\n    get length() {\n        return this._length;\n    }\n    /**\n     * Remove events whose time time is after the given time\n     * @param  after  The time to query.\n     */\n    cancel(after) {\n        this.forEachFrom(after, event => this.remove(event));\n        return this;\n    }\n    /**\n     * Set the root node as the given node\n     */\n    _setRoot(node) {\n        this._root = node;\n        if (this._root !== null) {\n            this._root.parent = null;\n        }\n    }\n    /**\n     * Replace the references to the node in the node's parent\n     * with the replacement node.\n     */\n    _replaceNodeInParent(node, replacement) {\n        if (node.parent !== null) {\n            if (node.isLeftChild()) {\n                node.parent.left = replacement;\n            }\n            else {\n                node.parent.right = replacement;\n            }\n            this._rebalance(node.parent);\n        }\n        else {\n            this._setRoot(replacement);\n        }\n    }\n    /**\n     * Remove the node from the tree and replace it with\n     * a successor which follows the schema.\n     */\n    _removeNode(node) {\n        if (node.left === null && node.right === null) {\n            this._replaceNodeInParent(node, null);\n        }\n        else if (node.right === null) {\n            this._replaceNodeInParent(node, node.left);\n        }\n        else if (node.left === null) {\n            this._replaceNodeInParent(node, node.right);\n        }\n        else {\n            const balance = node.getBalance();\n            let replacement;\n            let temp = null;\n            if (balance > 0) {\n                if (node.left.right === null) {\n                    replacement = node.left;\n                    replacement.right = node.right;\n                    temp = replacement;\n                }\n                else {\n                    replacement = node.left.right;\n                    while (replacement.right !== null) {\n                        replacement = replacement.right;\n                    }\n                    if (replacement.parent) {\n                        replacement.parent.right = replacement.left;\n                        temp = replacement.parent;\n                        replacement.left = node.left;\n                        replacement.right = node.right;\n                    }\n                }\n            }\n            else if (node.right.left === null) {\n                replacement = node.right;\n                replacement.left = node.left;\n                temp = replacement;\n            }\n            else {\n                replacement = node.right.left;\n                while (replacement.left !== null) {\n                    replacement = replacement.left;\n                }\n                if (replacement.parent) {\n                    replacement.parent.left = replacement.right;\n                    temp = replacement.parent;\n                    replacement.left = node.left;\n                    replacement.right = node.right;\n                }\n            }\n            if (node.parent !== null) {\n                if (node.isLeftChild()) {\n                    node.parent.left = replacement;\n                }\n                else {\n                    node.parent.right = replacement;\n                }\n            }\n            else {\n                this._setRoot(replacement);\n            }\n            if (temp) {\n                this._rebalance(temp);\n            }\n        }\n        node.dispose();\n    }\n    /**\n     * Rotate the tree to the left\n     */\n    _rotateLeft(node) {\n        const parent = node.parent;\n        const isLeftChild = node.isLeftChild();\n        // Make node.right the new root of this sub tree (instead of node)\n        const pivotNode = node.right;\n        if (pivotNode) {\n            node.right = pivotNode.left;\n            pivotNode.left = node;\n        }\n        if (parent !== null) {\n            if (isLeftChild) {\n                parent.left = pivotNode;\n            }\n            else {\n                parent.right = pivotNode;\n            }\n        }\n        else {\n            this._setRoot(pivotNode);\n        }\n    }\n    /**\n     * Rotate the tree to the right\n     */\n    _rotateRight(node) {\n        const parent = node.parent;\n        const isLeftChild = node.isLeftChild();\n        // Make node.left the new root of this sub tree (instead of node)\n        const pivotNode = node.left;\n        if (pivotNode) {\n            node.left = pivotNode.right;\n            pivotNode.right = node;\n        }\n        if (parent !== null) {\n            if (isLeftChild) {\n                parent.left = pivotNode;\n            }\n            else {\n                parent.right = pivotNode;\n            }\n        }\n        else {\n            this._setRoot(pivotNode);\n        }\n    }\n    /**\n     * Balance the BST\n     */\n    _rebalance(node) {\n        const balance = node.getBalance();\n        if (balance > 1 && node.left) {\n            if (node.left.getBalance() < 0) {\n                this._rotateLeft(node.left);\n            }\n            else {\n                this._rotateRight(node);\n            }\n        }\n        else if (balance < -1 && node.right) {\n            if (node.right.getBalance() > 0) {\n                this._rotateRight(node.right);\n            }\n            else {\n                this._rotateLeft(node);\n            }\n        }\n    }\n    /**\n     * Get an event whose time and duration span the give time. Will\n     * return the match whose \"time\" value is closest to the given time.\n     * @return  The event which spans the desired time\n     */\n    get(time) {\n        if (this._root !== null) {\n            const results = [];\n            this._root.search(time, results);\n            if (results.length > 0) {\n                let max = results[0];\n                for (let i = 1; i < results.length; i++) {\n                    if (results[i].low > max.low) {\n                        max = results[i];\n                    }\n                }\n                return max.event;\n            }\n        }\n        return null;\n    }\n    /**\n     * Iterate over everything in the timeline.\n     * @param  callback The callback to invoke with every item\n     */\n    forEach(callback) {\n        if (this._root !== null) {\n            const allNodes = [];\n            this._root.traverse(node => allNodes.push(node));\n            allNodes.forEach(node => {\n                if (node.event) {\n                    callback(node.event);\n                }\n            });\n        }\n        return this;\n    }\n    /**\n     * Iterate over everything in the array in which the given time\n     * overlaps with the time and duration time of the event.\n     * @param  time The time to check if items are overlapping\n     * @param  callback The callback to invoke with every item\n     */\n    forEachAtTime(time, callback) {\n        if (this._root !== null) {\n            const results = [];\n            this._root.search(time, results);\n            results.forEach(node => {\n                if (node.event) {\n                    callback(node.event);\n                }\n            });\n        }\n        return this;\n    }\n    /**\n     * Iterate over everything in the array in which the time is greater\n     * than or equal to the given time.\n     * @param  time The time to check if items are before\n     * @param  callback The callback to invoke with every item\n     */\n    forEachFrom(time, callback) {\n        if (this._root !== null) {\n            const results = [];\n            this._root.searchAfter(time, results);\n            results.forEach(node => {\n                if (node.event) {\n                    callback(node.event);\n                }\n            });\n        }\n        return this;\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        if (this._root !== null) {\n            this._root.traverse(node => node.dispose());\n        }\n        this._root = null;\n        return this;\n    }\n}\n//-------------------------------------\n// \tINTERVAL NODE HELPER\n//-------------------------------------\n/**\n * Represents a node in the binary search tree, with the addition\n * of a \"high\" value which keeps track of the highest value of\n * its children.\n * References:\n * https://brooknovak.wordpress.com/2013/12/07/augmented-interval-tree-in-c/\n * http://www.mif.vu.lt/~valdas/ALGORITMAI/LITERATURA/Cormen/Cormen.pdf\n * @param low\n * @param high\n */\nclass IntervalNode {\n    constructor(low, high, event) {\n        // the nodes to the left\n        this._left = null;\n        // the nodes to the right\n        this._right = null;\n        // the parent node\n        this.parent = null;\n        // the number of child nodes\n        this.height = 0;\n        this.event = event;\n        // the low value\n        this.low = low;\n        // the high value\n        this.high = high;\n        // the high value for this and all child nodes\n        this.max = this.high;\n    }\n    /**\n     * Insert a node into the correct spot in the tree\n     */\n    insert(node) {\n        if (node.low <= this.low) {\n            if (this.left === null) {\n                this.left = node;\n            }\n            else {\n                this.left.insert(node);\n            }\n        }\n        else if (this.right === null) {\n            this.right = node;\n        }\n        else {\n            this.right.insert(node);\n        }\n    }\n    /**\n     * Search the tree for nodes which overlap\n     * with the given point\n     * @param  point  The point to query\n     * @param  results  The array to put the results\n     */\n    search(point, results) {\n        // If p is to the right of the rightmost point of any interval\n        // in this node and all children, there won't be any matches.\n        if (point > this.max) {\n            return;\n        }\n        // Search left children\n        if (this.left !== null) {\n            this.left.search(point, results);\n        }\n        // Check this node\n        if (this.low <= point && this.high > point) {\n            results.push(this);\n        }\n        // If p is to the left of the time of this interval,\n        // then it can't be in any child to the right.\n        if (this.low > point) {\n            return;\n        }\n        // Search right children\n        if (this.right !== null) {\n            this.right.search(point, results);\n        }\n    }\n    /**\n     * Search the tree for nodes which are less\n     * than the given point\n     * @param  point  The point to query\n     * @param  results  The array to put the results\n     */\n    searchAfter(point, results) {\n        // Check this node\n        if (this.low >= point) {\n            results.push(this);\n            if (this.left !== null) {\n                this.left.searchAfter(point, results);\n            }\n        }\n        // search the right side\n        if (this.right !== null) {\n            this.right.searchAfter(point, results);\n        }\n    }\n    /**\n     * Invoke the callback on this element and both it's branches\n     * @param  {Function}  callback\n     */\n    traverse(callback) {\n        callback(this);\n        if (this.left !== null) {\n            this.left.traverse(callback);\n        }\n        if (this.right !== null) {\n            this.right.traverse(callback);\n        }\n    }\n    /**\n     * Update the height of the node\n     */\n    updateHeight() {\n        if (this.left !== null && this.right !== null) {\n            this.height = Math.max(this.left.height, this.right.height) + 1;\n        }\n        else if (this.right !== null) {\n            this.height = this.right.height + 1;\n        }\n        else if (this.left !== null) {\n            this.height = this.left.height + 1;\n        }\n        else {\n            this.height = 0;\n        }\n    }\n    /**\n     * Update the height of the node\n     */\n    updateMax() {\n        this.max = this.high;\n        if (this.left !== null) {\n            this.max = Math.max(this.max, this.left.max);\n        }\n        if (this.right !== null) {\n            this.max = Math.max(this.max, this.right.max);\n        }\n    }\n    /**\n     * The balance is how the leafs are distributed on the node\n     * @return  Negative numbers are balanced to the right\n     */\n    getBalance() {\n        let balance = 0;\n        if (this.left !== null && this.right !== null) {\n            balance = this.left.height - this.right.height;\n        }\n        else if (this.left !== null) {\n            balance = this.left.height + 1;\n        }\n        else if (this.right !== null) {\n            balance = -(this.right.height + 1);\n        }\n        return balance;\n    }\n    /**\n     * @returns true if this node is the left child of its parent\n     */\n    isLeftChild() {\n        return this.parent !== null && this.parent.left === this;\n    }\n    /**\n     * get/set the left node\n     */\n    get left() {\n        return this._left;\n    }\n    set left(node) {\n        this._left = node;\n        if (node !== null) {\n            node.parent = this;\n        }\n        this.updateHeight();\n        this.updateMax();\n    }\n    /**\n     * get/set the right node\n     */\n    get right() {\n        return this._right;\n    }\n    set right(node) {\n        this._right = node;\n        if (node !== null) {\n            node.parent = this;\n        }\n        this.updateHeight();\n        this.updateMax();\n    }\n    /**\n     * null out references.\n     */\n    dispose() {\n        this.parent = null;\n        this._left = null;\n        this._right = null;\n        this.event = null;\n    }\n}\n//# sourceMappingURL=IntervalTimeline.js.map","import { Timeline } from \"./Timeline\";\nimport { assertRange } from \"./Debug\";\n/**\n * A Timeline State. Provides the methods: `setStateAtTime(\"state\", time)` and `getValueAtTime(time)`\n * @param initial The initial state of the StateTimeline.  Defaults to `undefined`\n */\nexport class StateTimeline extends Timeline {\n    constructor(initial = \"stopped\") {\n        super();\n        this.name = \"StateTimeline\";\n        this._initial = initial;\n        this.setStateAtTime(this._initial, 0);\n    }\n    /**\n     * Returns the scheduled state scheduled before or at\n     * the given time.\n     * @param  time  The time to query.\n     * @return  The name of the state input in setStateAtTime.\n     */\n    getValueAtTime(time) {\n        const event = this.get(time);\n        if (event !== null) {\n            return event.state;\n        }\n        else {\n            return this._initial;\n        }\n    }\n    /**\n     * Add a state to the timeline.\n     * @param  state The name of the state to set.\n     * @param  time  The time to query.\n     * @param options Any additional options that are needed in the timeline.\n     */\n    setStateAtTime(state, time, options) {\n        assertRange(time, 0);\n        this.add(Object.assign({}, options, {\n            state,\n            time,\n        }));\n        return this;\n    }\n    /**\n     * Return the event before the time with the given state\n     * @param  state The state to look for\n     * @param  time  When to check before\n     * @return  The event with the given state before the time\n     */\n    getLastState(state, time) {\n        // time = this.toSeconds(time);\n        const index = this._search(time);\n        for (let i = index; i >= 0; i--) {\n            const event = this._timeline[i];\n            if (event.state === state) {\n                return event;\n            }\n        }\n    }\n    /**\n     * Return the event after the time with the given state\n     * @param  state The state to look for\n     * @param  time  When to check from\n     * @return  The event with the given state after the time\n     */\n    getNextState(state, time) {\n        // time = this.toSeconds(time);\n        const index = this._search(time);\n        if (index !== -1) {\n            for (let i = index; i < this._timeline.length; i++) {\n                const event = this._timeline[i];\n                if (event.state === state) {\n                    return event;\n                }\n            }\n        }\n    }\n}\n//# sourceMappingURL=StateTimeline.js.map","import { Param } from \"../context/Param\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isUndef } from \"../util/TypeCheck\";\n/**\n * A Param class just for computing ticks. Similar to the [[Param]] class,\n * but offers conversion to BPM values as well as ability to compute tick\n * duration and elapsed ticks\n */\nexport class TickParam extends Param {\n    constructor() {\n        super(optionsFromArguments(TickParam.getDefaults(), arguments, [\"value\"]));\n        this.name = \"TickParam\";\n        /**\n         * The timeline which tracks all of the automations.\n         */\n        this._events = new Timeline(Infinity);\n        /**\n         * The internal holder for the multiplier value\n         */\n        this._multiplier = 1;\n        const options = optionsFromArguments(TickParam.getDefaults(), arguments, [\"value\"]);\n        // set the multiplier\n        this._multiplier = options.multiplier;\n        // clear the ticks from the beginning\n        this._events.cancel(0);\n        // set an initial event\n        this._events.add({\n            ticks: 0,\n            time: 0,\n            type: \"setValueAtTime\",\n            value: this._fromType(options.value),\n        });\n        this.setValueAtTime(options.value, 0);\n    }\n    static getDefaults() {\n        return Object.assign(Param.getDefaults(), {\n            multiplier: 1,\n            units: \"hertz\",\n            value: 1,\n        });\n    }\n    setTargetAtTime(value, time, constant) {\n        // approximate it with multiple linear ramps\n        time = this.toSeconds(time);\n        this.setRampPoint(time);\n        const computedValue = this._fromType(value);\n        // start from previously scheduled value\n        const prevEvent = this._events.get(time);\n        const segments = Math.round(Math.max(1 / constant, 1));\n        for (let i = 0; i <= segments; i++) {\n            const segTime = constant * i + time;\n            const rampVal = this._exponentialApproach(prevEvent.time, prevEvent.value, computedValue, constant, segTime);\n            this.linearRampToValueAtTime(this._toType(rampVal), segTime);\n        }\n        return this;\n    }\n    setValueAtTime(value, time) {\n        const computedTime = this.toSeconds(time);\n        super.setValueAtTime(value, time);\n        const event = this._events.get(computedTime);\n        const previousEvent = this._events.previousEvent(event);\n        const ticksUntilTime = this._getTicksUntilEvent(previousEvent, computedTime);\n        event.ticks = Math.max(ticksUntilTime, 0);\n        return this;\n    }\n    linearRampToValueAtTime(value, time) {\n        const computedTime = this.toSeconds(time);\n        super.linearRampToValueAtTime(value, time);\n        const event = this._events.get(computedTime);\n        const previousEvent = this._events.previousEvent(event);\n        const ticksUntilTime = this._getTicksUntilEvent(previousEvent, computedTime);\n        event.ticks = Math.max(ticksUntilTime, 0);\n        return this;\n    }\n    exponentialRampToValueAtTime(value, time) {\n        // aproximate it with multiple linear ramps\n        time = this.toSeconds(time);\n        const computedVal = this._fromType(value);\n        // start from previously scheduled value\n        const prevEvent = this._events.get(time);\n        // approx 10 segments per second\n        const segments = Math.round(Math.max((time - prevEvent.time) * 10, 1));\n        const segmentDur = ((time - prevEvent.time) / segments);\n        for (let i = 0; i <= segments; i++) {\n            const segTime = segmentDur * i + prevEvent.time;\n            const rampVal = this._exponentialInterpolate(prevEvent.time, prevEvent.value, time, computedVal, segTime);\n            this.linearRampToValueAtTime(this._toType(rampVal), segTime);\n        }\n        return this;\n    }\n    /**\n     * Returns the tick value at the time. Takes into account\n     * any automation curves scheduled on the signal.\n     * @param  event The time to get the tick count at\n     * @return The number of ticks which have elapsed at the time given any automations.\n     */\n    _getTicksUntilEvent(event, time) {\n        if (event === null) {\n            event = {\n                ticks: 0,\n                time: 0,\n                type: \"setValueAtTime\",\n                value: 0,\n            };\n        }\n        else if (isUndef(event.ticks)) {\n            const previousEvent = this._events.previousEvent(event);\n            event.ticks = this._getTicksUntilEvent(previousEvent, event.time);\n        }\n        const val0 = this._fromType(this.getValueAtTime(event.time));\n        let val1 = this._fromType(this.getValueAtTime(time));\n        // if it's right on the line, take the previous value\n        const onTheLineEvent = this._events.get(time);\n        if (onTheLineEvent && onTheLineEvent.time === time && onTheLineEvent.type === \"setValueAtTime\") {\n            val1 = this._fromType(this.getValueAtTime(time - this.sampleTime));\n        }\n        return 0.5 * (time - event.time) * (val0 + val1) + event.ticks;\n    }\n    /**\n     * Returns the tick value at the time. Takes into account\n     * any automation curves scheduled on the signal.\n     * @param  time The time to get the tick count at\n     * @return The number of ticks which have elapsed at the time given any automations.\n     */\n    getTicksAtTime(time) {\n        const computedTime = this.toSeconds(time);\n        const event = this._events.get(computedTime);\n        return Math.max(this._getTicksUntilEvent(event, computedTime), 0);\n    }\n    /**\n     * Return the elapsed time of the number of ticks from the given time\n     * @param ticks The number of ticks to calculate\n     * @param  time The time to get the next tick from\n     * @return The duration of the number of ticks from the given time in seconds\n     */\n    getDurationOfTicks(ticks, time) {\n        const computedTime = this.toSeconds(time);\n        const currentTick = this.getTicksAtTime(time);\n        return this.getTimeOfTick(currentTick + ticks) - computedTime;\n    }\n    /**\n     * Given a tick, returns the time that tick occurs at.\n     * @return The time that the tick occurs.\n     */\n    getTimeOfTick(tick) {\n        const before = this._events.get(tick, \"ticks\");\n        const after = this._events.getAfter(tick, \"ticks\");\n        if (before && before.ticks === tick) {\n            return before.time;\n        }\n        else if (before && after &&\n            after.type === \"linearRampToValueAtTime\" &&\n            before.value !== after.value) {\n            const val0 = this._fromType(this.getValueAtTime(before.time));\n            const val1 = this._fromType(this.getValueAtTime(after.time));\n            const delta = (val1 - val0) / (after.time - before.time);\n            const k = Math.sqrt(Math.pow(val0, 2) - 2 * delta * (before.ticks - tick));\n            const sol1 = (-val0 + k) / delta;\n            const sol2 = (-val0 - k) / delta;\n            return (sol1 > 0 ? sol1 : sol2) + before.time;\n        }\n        else if (before) {\n            if (before.value === 0) {\n                return Infinity;\n            }\n            else {\n                return before.time + (tick - before.ticks) / before.value;\n            }\n        }\n        else {\n            return tick / this._initialValue;\n        }\n    }\n    /**\n     * Convert some number of ticks their the duration in seconds accounting\n     * for any automation curves starting at the given time.\n     * @param  ticks The number of ticks to convert to seconds.\n     * @param  when  When along the automation timeline to convert the ticks.\n     * @return The duration in seconds of the ticks.\n     */\n    ticksToTime(ticks, when) {\n        return this.getDurationOfTicks(ticks, when);\n    }\n    /**\n     * The inverse of [[ticksToTime]]. Convert a duration in\n     * seconds to the corresponding number of ticks accounting for any\n     * automation curves starting at the given time.\n     * @param  duration The time interval to convert to ticks.\n     * @param  when When along the automation timeline to convert the ticks.\n     * @return The duration in ticks.\n     */\n    timeToTicks(duration, when) {\n        const computedTime = this.toSeconds(when);\n        const computedDuration = this.toSeconds(duration);\n        const startTicks = this.getTicksAtTime(computedTime);\n        const endTicks = this.getTicksAtTime(computedTime + computedDuration);\n        return endTicks - startTicks;\n    }\n    /**\n     * Convert from the type when the unit value is BPM\n     */\n    _fromType(val) {\n        if (this.units === \"bpm\" && this.multiplier) {\n            return 1 / (60 / val / this.multiplier);\n        }\n        else {\n            return super._fromType(val);\n        }\n    }\n    /**\n     * Special case of type conversion where the units === \"bpm\"\n     */\n    _toType(val) {\n        if (this.units === \"bpm\" && this.multiplier) {\n            return (val / this.multiplier) * 60;\n        }\n        else {\n            return super._toType(val);\n        }\n    }\n    /**\n     * A multiplier on the bpm value. Useful for setting a PPQ relative to the base frequency value.\n     */\n    get multiplier() {\n        return this._multiplier;\n    }\n    set multiplier(m) {\n        // get and reset the current value with the new multiplier\n        // might be necessary to clear all the previous values\n        const currentVal = this.value;\n        this._multiplier = m;\n        this.cancelScheduledValues(0);\n        this.setValueAtTime(currentVal, 0);\n    }\n}\n//# sourceMappingURL=TickParam.js.map","import { Signal } from \"../../signal/Signal\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { TickParam } from \"./TickParam\";\n/**\n * TickSignal extends Tone.Signal, but adds the capability\n * to calculate the number of elapsed ticks. exponential and target curves\n * are approximated with multiple linear ramps.\n *\n * Thank you Bruno Dias, H. Sofia Pinto, and David M. Matos,\n * for your [WAC paper](https://smartech.gatech.edu/bitstream/handle/1853/54588/WAC2016-49.pdf)\n * describing integrating timing functions for tempo calculations.\n */\nexport class TickSignal extends Signal {\n    constructor() {\n        super(optionsFromArguments(TickSignal.getDefaults(), arguments, [\"value\"]));\n        this.name = \"TickSignal\";\n        const options = optionsFromArguments(TickSignal.getDefaults(), arguments, [\"value\"]);\n        this.input = this._param = new TickParam({\n            context: this.context,\n            convert: options.convert,\n            multiplier: options.multiplier,\n            param: this._constantSource.offset,\n            units: options.units,\n            value: options.value,\n        });\n    }\n    static getDefaults() {\n        return Object.assign(Signal.getDefaults(), {\n            multiplier: 1,\n            units: \"hertz\",\n            value: 1,\n        });\n    }\n    ticksToTime(ticks, when) {\n        return this._param.ticksToTime(ticks, when);\n    }\n    timeToTicks(duration, when) {\n        return this._param.timeToTicks(duration, when);\n    }\n    getTimeOfTick(tick) {\n        return this._param.getTimeOfTick(tick);\n    }\n    getDurationOfTicks(ticks, time) {\n        return this._param.getDurationOfTicks(ticks, time);\n    }\n    getTicksAtTime(time) {\n        return this._param.getTicksAtTime(time);\n    }\n    /**\n     * A multiplier on the bpm value. Useful for setting a PPQ relative to the base frequency value.\n     */\n    get multiplier() {\n        return this._param.multiplier;\n    }\n    set multiplier(m) {\n        this._param.multiplier = m;\n    }\n    dispose() {\n        super.dispose();\n        this._param.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=TickSignal.js.map","import { ToneWithContext } from \"../context/ToneWithContext\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { readOnly } from \"../util/Interface\";\nimport { StateTimeline } from \"../util/StateTimeline\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isDefined } from \"../util/TypeCheck\";\nimport { TickSignal } from \"./TickSignal\";\nimport { EQ } from \"../util/Math\";\n/**\n * Uses [TickSignal](TickSignal) to track elapsed ticks with complex automation curves.\n */\nexport class TickSource extends ToneWithContext {\n    constructor() {\n        super(optionsFromArguments(TickSource.getDefaults(), arguments, [\"frequency\"]));\n        this.name = \"TickSource\";\n        /**\n         * The state timeline\n         */\n        this._state = new StateTimeline();\n        /**\n         * The offset values of the ticks\n         */\n        this._tickOffset = new Timeline();\n        const options = optionsFromArguments(TickSource.getDefaults(), arguments, [\"frequency\"]);\n        this.frequency = new TickSignal({\n            context: this.context,\n            units: options.units,\n            value: options.frequency,\n        });\n        readOnly(this, \"frequency\");\n        // set the initial state\n        this._state.setStateAtTime(\"stopped\", 0);\n        // add the first event\n        this.setTicksAtTime(0, 0);\n    }\n    static getDefaults() {\n        return Object.assign({\n            frequency: 1,\n            units: \"hertz\",\n        }, ToneWithContext.getDefaults());\n    }\n    /**\n     * Returns the playback state of the source, either \"started\", \"stopped\" or \"paused\".\n     */\n    get state() {\n        return this.getStateAtTime(this.now());\n    }\n    /**\n     * Start the clock at the given time. Optionally pass in an offset\n     * of where to start the tick counter from.\n     * @param  time    The time the clock should start\n     * @param offset The number of ticks to start the source at\n     */\n    start(time, offset) {\n        const computedTime = this.toSeconds(time);\n        if (this._state.getValueAtTime(computedTime) !== \"started\") {\n            this._state.setStateAtTime(\"started\", computedTime);\n            if (isDefined(offset)) {\n                this.setTicksAtTime(offset, computedTime);\n            }\n        }\n        return this;\n    }\n    /**\n     * Stop the clock. Stopping the clock resets the tick counter to 0.\n     * @param time The time when the clock should stop.\n     */\n    stop(time) {\n        const computedTime = this.toSeconds(time);\n        // cancel the previous stop\n        if (this._state.getValueAtTime(computedTime) === \"stopped\") {\n            const event = this._state.get(computedTime);\n            if (event && event.time > 0) {\n                this._tickOffset.cancel(event.time);\n                this._state.cancel(event.time);\n            }\n        }\n        this._state.cancel(computedTime);\n        this._state.setStateAtTime(\"stopped\", computedTime);\n        this.setTicksAtTime(0, computedTime);\n        return this;\n    }\n    /**\n     * Pause the clock. Pausing does not reset the tick counter.\n     * @param time The time when the clock should stop.\n     */\n    pause(time) {\n        const computedTime = this.toSeconds(time);\n        if (this._state.getValueAtTime(computedTime) === \"started\") {\n            this._state.setStateAtTime(\"paused\", computedTime);\n        }\n        return this;\n    }\n    /**\n     * Cancel start/stop/pause and setTickAtTime events scheduled after the given time.\n     * @param time When to clear the events after\n     */\n    cancel(time) {\n        time = this.toSeconds(time);\n        this._state.cancel(time);\n        this._tickOffset.cancel(time);\n        return this;\n    }\n    /**\n     * Get the elapsed ticks at the given time\n     * @param  time  When to get the tick value\n     * @return The number of ticks\n     */\n    getTicksAtTime(time) {\n        const computedTime = this.toSeconds(time);\n        const stopEvent = this._state.getLastState(\"stopped\", computedTime);\n        // this event allows forEachBetween to iterate until the current time\n        const tmpEvent = { state: \"paused\", time: computedTime };\n        this._state.add(tmpEvent);\n        // keep track of the previous offset event\n        let lastState = stopEvent;\n        let elapsedTicks = 0;\n        // iterate through all the events since the last stop\n        this._state.forEachBetween(stopEvent.time, computedTime + this.sampleTime, e => {\n            let periodStartTime = lastState.time;\n            // if there is an offset event in this period use that\n            const offsetEvent = this._tickOffset.get(e.time);\n            if (offsetEvent && offsetEvent.time >= lastState.time) {\n                elapsedTicks = offsetEvent.ticks;\n                periodStartTime = offsetEvent.time;\n            }\n            if (lastState.state === \"started\" && e.state !== \"started\") {\n                elapsedTicks += this.frequency.getTicksAtTime(e.time) - this.frequency.getTicksAtTime(periodStartTime);\n            }\n            lastState = e;\n        });\n        // remove the temporary event\n        this._state.remove(tmpEvent);\n        // return the ticks\n        return elapsedTicks;\n    }\n    /**\n     * The number of times the callback was invoked. Starts counting at 0\n     * and increments after the callback was invoked. Returns -1 when stopped.\n     */\n    get ticks() {\n        return this.getTicksAtTime(this.now());\n    }\n    set ticks(t) {\n        this.setTicksAtTime(t, this.now());\n    }\n    /**\n     * The time since ticks=0 that the TickSource has been running. Accounts\n     * for tempo curves\n     */\n    get seconds() {\n        return this.getSecondsAtTime(this.now());\n    }\n    set seconds(s) {\n        const now = this.now();\n        const ticks = this.frequency.timeToTicks(s, now);\n        this.setTicksAtTime(ticks, now);\n    }\n    /**\n     * Return the elapsed seconds at the given time.\n     * @param  time  When to get the elapsed seconds\n     * @return  The number of elapsed seconds\n     */\n    getSecondsAtTime(time) {\n        time = this.toSeconds(time);\n        const stopEvent = this._state.getLastState(\"stopped\", time);\n        // this event allows forEachBetween to iterate until the current time\n        const tmpEvent = { state: \"paused\", time };\n        this._state.add(tmpEvent);\n        // keep track of the previous offset event\n        let lastState = stopEvent;\n        let elapsedSeconds = 0;\n        // iterate through all the events since the last stop\n        this._state.forEachBetween(stopEvent.time, time + this.sampleTime, e => {\n            let periodStartTime = lastState.time;\n            // if there is an offset event in this period use that\n            const offsetEvent = this._tickOffset.get(e.time);\n            if (offsetEvent && offsetEvent.time >= lastState.time) {\n                elapsedSeconds = offsetEvent.seconds;\n                periodStartTime = offsetEvent.time;\n            }\n            if (lastState.state === \"started\" && e.state !== \"started\") {\n                elapsedSeconds += e.time - periodStartTime;\n            }\n            lastState = e;\n        });\n        // remove the temporary event\n        this._state.remove(tmpEvent);\n        // return the ticks\n        return elapsedSeconds;\n    }\n    /**\n     * Set the clock's ticks at the given time.\n     * @param  ticks The tick value to set\n     * @param  time  When to set the tick value\n     */\n    setTicksAtTime(ticks, time) {\n        time = this.toSeconds(time);\n        this._tickOffset.cancel(time);\n        this._tickOffset.add({\n            seconds: this.frequency.getDurationOfTicks(ticks, time),\n            ticks,\n            time,\n        });\n        return this;\n    }\n    /**\n     * Returns the scheduled state at the given time.\n     * @param  time  The time to query.\n     */\n    getStateAtTime(time) {\n        time = this.toSeconds(time);\n        return this._state.getValueAtTime(time);\n    }\n    /**\n     * Get the time of the given tick. The second argument\n     * is when to test before. Since ticks can be set (with setTicksAtTime)\n     * there may be multiple times for a given tick value.\n     * @param  tick The tick number.\n     * @param  before When to measure the tick value from.\n     * @return The time of the tick\n     */\n    getTimeOfTick(tick, before = this.now()) {\n        const offset = this._tickOffset.get(before);\n        const event = this._state.get(before);\n        const startTime = Math.max(offset.time, event.time);\n        const absoluteTicks = this.frequency.getTicksAtTime(startTime) + tick - offset.ticks;\n        return this.frequency.getTimeOfTick(absoluteTicks);\n    }\n    /**\n     * Invoke the callback event at all scheduled ticks between the\n     * start time and the end time\n     * @param  startTime  The beginning of the search range\n     * @param  endTime    The end of the search range\n     * @param  callback   The callback to invoke with each tick\n     */\n    forEachTickBetween(startTime, endTime, callback) {\n        // only iterate through the sections where it is \"started\"\n        let lastStateEvent = this._state.get(startTime);\n        this._state.forEachBetween(startTime, endTime, event => {\n            if (lastStateEvent && lastStateEvent.state === \"started\" && event.state !== \"started\") {\n                this.forEachTickBetween(Math.max(lastStateEvent.time, startTime), event.time - this.sampleTime, callback);\n            }\n            lastStateEvent = event;\n        });\n        let error = null;\n        if (lastStateEvent && lastStateEvent.state === \"started\") {\n            const maxStartTime = Math.max(lastStateEvent.time, startTime);\n            // figure out the difference between the frequency ticks and the\n            const startTicks = this.frequency.getTicksAtTime(maxStartTime);\n            const ticksAtStart = this.frequency.getTicksAtTime(lastStateEvent.time);\n            const diff = startTicks - ticksAtStart;\n            let offset = Math.ceil(diff) - diff;\n            // guard against floating point issues\n            offset = EQ(offset, 1) ? 0 : offset;\n            let nextTickTime = this.frequency.getTimeOfTick(startTicks + offset);\n            while (nextTickTime < endTime) {\n                try {\n                    callback(nextTickTime, Math.round(this.getTicksAtTime(nextTickTime)));\n                }\n                catch (e) {\n                    error = e;\n                    break;\n                }\n                nextTickTime += this.frequency.getDurationOfTicks(1, nextTickTime);\n            }\n        }\n        if (error) {\n            throw error;\n        }\n        return this;\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        this._state.dispose();\n        this._tickOffset.dispose();\n        this.frequency.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=TickSource.js.map","import { ToneWithContext } from \"../context/ToneWithContext\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Emitter } from \"../util/Emitter\";\nimport { noOp, readOnly } from \"../util/Interface\";\nimport { StateTimeline } from \"../util/StateTimeline\";\nimport { TickSource } from \"./TickSource\";\nimport { assertContextRunning } from \"../util/Debug\";\n/**\n * A sample accurate clock which provides a callback at the given rate.\n * While the callback is not sample-accurate (it is still susceptible to\n * loose JS timing), the time passed in as the argument to the callback\n * is precise. For most applications, it is better to use Tone.Transport\n * instead of the Clock by itself since you can synchronize multiple callbacks.\n * @example\n * // the callback will be invoked approximately once a second\n * // and will print the time exactly once a second apart.\n * const clock = new Tone.Clock(time => {\n * \tconsole.log(time);\n * }, 1);\n * clock.start();\n * @category Core\n */\nexport class Clock extends ToneWithContext {\n    constructor() {\n        super(optionsFromArguments(Clock.getDefaults(), arguments, [\"callback\", \"frequency\"]));\n        this.name = \"Clock\";\n        /**\n         * The callback function to invoke at the scheduled tick.\n         */\n        this.callback = noOp;\n        /**\n         * The last time the loop callback was invoked\n         */\n        this._lastUpdate = 0;\n        /**\n         * Keep track of the playback state\n         */\n        this._state = new StateTimeline(\"stopped\");\n        /**\n         * Context bound reference to the _loop method\n         * This is necessary to remove the event in the end.\n         */\n        this._boundLoop = this._loop.bind(this);\n        const options = optionsFromArguments(Clock.getDefaults(), arguments, [\"callback\", \"frequency\"]);\n        this.callback = options.callback;\n        this._tickSource = new TickSource({\n            context: this.context,\n            frequency: options.frequency,\n            units: options.units,\n        });\n        this._lastUpdate = 0;\n        this.frequency = this._tickSource.frequency;\n        readOnly(this, \"frequency\");\n        // add an initial state\n        this._state.setStateAtTime(\"stopped\", 0);\n        // bind a callback to the worker thread\n        this.context.on(\"tick\", this._boundLoop);\n    }\n    static getDefaults() {\n        return Object.assign(ToneWithContext.getDefaults(), {\n            callback: noOp,\n            frequency: 1,\n            units: \"hertz\",\n        });\n    }\n    /**\n     * Returns the playback state of the source, either \"started\", \"stopped\" or \"paused\".\n     */\n    get state() {\n        return this._state.getValueAtTime(this.now());\n    }\n    /**\n     * Start the clock at the given time. Optionally pass in an offset\n     * of where to start the tick counter from.\n     * @param  time    The time the clock should start\n     * @param offset  Where the tick counter starts counting from.\n     */\n    start(time, offset) {\n        // make sure the context is running\n        assertContextRunning(this.context);\n        // start the loop\n        const computedTime = this.toSeconds(time);\n        this.log(\"start\", computedTime);\n        if (this._state.getValueAtTime(computedTime) !== \"started\") {\n            this._state.setStateAtTime(\"started\", computedTime);\n            this._tickSource.start(computedTime, offset);\n            if (computedTime < this._lastUpdate) {\n                this.emit(\"start\", computedTime, offset);\n            }\n        }\n        return this;\n    }\n    /**\n     * Stop the clock. Stopping the clock resets the tick counter to 0.\n     * @param time The time when the clock should stop.\n     * @example\n     * const clock = new Tone.Clock(time => {\n     * \tconsole.log(time);\n     * }, 1);\n     * clock.start();\n     * // stop the clock after 10 seconds\n     * clock.stop(\"+10\");\n     */\n    stop(time) {\n        const computedTime = this.toSeconds(time);\n        this.log(\"stop\", computedTime);\n        this._state.cancel(computedTime);\n        this._state.setStateAtTime(\"stopped\", computedTime);\n        this._tickSource.stop(computedTime);\n        if (computedTime < this._lastUpdate) {\n            this.emit(\"stop\", computedTime);\n        }\n        return this;\n    }\n    /**\n     * Pause the clock. Pausing does not reset the tick counter.\n     * @param time The time when the clock should stop.\n     */\n    pause(time) {\n        const computedTime = this.toSeconds(time);\n        if (this._state.getValueAtTime(computedTime) === \"started\") {\n            this._state.setStateAtTime(\"paused\", computedTime);\n            this._tickSource.pause(computedTime);\n            if (computedTime < this._lastUpdate) {\n                this.emit(\"pause\", computedTime);\n            }\n        }\n        return this;\n    }\n    /**\n     * The number of times the callback was invoked. Starts counting at 0\n     * and increments after the callback was invoked.\n     */\n    get ticks() {\n        return Math.ceil(this.getTicksAtTime(this.now()));\n    }\n    set ticks(t) {\n        this._tickSource.ticks = t;\n    }\n    /**\n     * The time since ticks=0 that the Clock has been running. Accounts for tempo curves\n     */\n    get seconds() {\n        return this._tickSource.seconds;\n    }\n    set seconds(s) {\n        this._tickSource.seconds = s;\n    }\n    /**\n     * Return the elapsed seconds at the given time.\n     * @param  time  When to get the elapsed seconds\n     * @return  The number of elapsed seconds\n     */\n    getSecondsAtTime(time) {\n        return this._tickSource.getSecondsAtTime(time);\n    }\n    /**\n     * Set the clock's ticks at the given time.\n     * @param  ticks The tick value to set\n     * @param  time  When to set the tick value\n     */\n    setTicksAtTime(ticks, time) {\n        this._tickSource.setTicksAtTime(ticks, time);\n        return this;\n    }\n    /**\n     * Get the time of the given tick. The second argument\n     * is when to test before. Since ticks can be set (with setTicksAtTime)\n     * there may be multiple times for a given tick value.\n     * @param  tick The tick number.\n     * @param  before When to measure the tick value from.\n     * @return The time of the tick\n     */\n    getTimeOfTick(tick, before = this.now()) {\n        return this._tickSource.getTimeOfTick(tick, before);\n    }\n    /**\n     * Get the clock's ticks at the given time.\n     * @param  time  When to get the tick value\n     * @return The tick value at the given time.\n     */\n    getTicksAtTime(time) {\n        return this._tickSource.getTicksAtTime(time);\n    }\n    /**\n     * Get the time of the next tick\n     * @param  offset The tick number.\n     */\n    nextTickTime(offset, when) {\n        const computedTime = this.toSeconds(when);\n        const currentTick = this.getTicksAtTime(computedTime);\n        return this._tickSource.getTimeOfTick(currentTick + offset, computedTime);\n    }\n    /**\n     * The scheduling loop.\n     */\n    _loop() {\n        const startTime = this._lastUpdate;\n        const endTime = this.now();\n        this._lastUpdate = endTime;\n        this.log(\"loop\", startTime, endTime);\n        if (startTime !== endTime) {\n            // the state change events\n            this._state.forEachBetween(startTime, endTime, e => {\n                switch (e.state) {\n                    case \"started\":\n                        const offset = this._tickSource.getTicksAtTime(e.time);\n                        this.emit(\"start\", e.time, offset);\n                        break;\n                    case \"stopped\":\n                        if (e.time !== 0) {\n                            this.emit(\"stop\", e.time);\n                        }\n                        break;\n                    case \"paused\":\n                        this.emit(\"pause\", e.time);\n                        break;\n                }\n            });\n            // the tick callbacks\n            this._tickSource.forEachTickBetween(startTime, endTime, (time, ticks) => {\n                this.callback(time, ticks);\n            });\n        }\n    }\n    /**\n     * Returns the scheduled state at the given time.\n     * @param  time  The time to query.\n     * @return  The name of the state input in setStateAtTime.\n     * @example\n     * const clock = new Tone.Clock();\n     * clock.start(\"+0.1\");\n     * clock.getStateAtTime(\"+0.1\"); // returns \"started\"\n     */\n    getStateAtTime(time) {\n        const computedTime = this.toSeconds(time);\n        return this._state.getValueAtTime(computedTime);\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        this.context.off(\"tick\", this._boundLoop);\n        this._tickSource.dispose();\n        this._state.dispose();\n        return this;\n    }\n}\nEmitter.mixin(Clock);\n//# sourceMappingURL=Clock.js.map","import { noOp } from \"../util/Interface\";\n/**\n * TransportEvent is an internal class used by [[Transport]]\n * to schedule events. Do no invoke this class directly, it is\n * handled from within Tone.Transport.\n */\nexport class TransportEvent {\n    /**\n     * @param transport The transport object which the event belongs to\n     */\n    constructor(transport, opts) {\n        /**\n         * The unique id of the event\n         */\n        this.id = TransportEvent._eventId++;\n        const options = Object.assign(TransportEvent.getDefaults(), opts);\n        this.transport = transport;\n        this.callback = options.callback;\n        this._once = options.once;\n        this.time = options.time;\n    }\n    static getDefaults() {\n        return {\n            callback: noOp,\n            once: false,\n            time: 0,\n        };\n    }\n    /**\n     * Invoke the event callback.\n     * @param  time  The AudioContext time in seconds of the event\n     */\n    invoke(time) {\n        if (this.callback) {\n            this.callback(time);\n            if (this._once) {\n                this.transport.clear(this.id);\n            }\n        }\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        this.callback = undefined;\n        return this;\n    }\n}\n/**\n * Current ID counter\n */\nTransportEvent._eventId = 0;\n//# sourceMappingURL=TransportEvent.js.map","import { TicksClass } from \"../type/Ticks\";\nimport { TransportEvent } from \"./TransportEvent\";\n/**\n * TransportRepeatEvent is an internal class used by Tone.Transport\n * to schedule repeat events. This class should not be instantiated directly.\n */\nexport class TransportRepeatEvent extends TransportEvent {\n    /**\n     * @param transport The transport object which the event belongs to\n     */\n    constructor(transport, opts) {\n        super(transport, opts);\n        /**\n         * The ID of the current timeline event\n         */\n        this._currentId = -1;\n        /**\n         * The ID of the next timeline event\n         */\n        this._nextId = -1;\n        /**\n         * The time of the next event\n         */\n        this._nextTick = this.time;\n        /**\n         * a reference to the bound start method\n         */\n        this._boundRestart = this._restart.bind(this);\n        const options = Object.assign(TransportRepeatEvent.getDefaults(), opts);\n        this.duration = new TicksClass(transport.context, options.duration).valueOf();\n        this._interval = new TicksClass(transport.context, options.interval).valueOf();\n        this._nextTick = options.time;\n        this.transport.on(\"start\", this._boundRestart);\n        this.transport.on(\"loopStart\", this._boundRestart);\n        this.context = this.transport.context;\n        this._restart();\n    }\n    static getDefaults() {\n        return Object.assign({}, TransportEvent.getDefaults(), {\n            duration: Infinity,\n            interval: 1,\n            once: false,\n        });\n    }\n    /**\n     * Invoke the callback. Returns the tick time which\n     * the next event should be scheduled at.\n     * @param  time  The AudioContext time in seconds of the event\n     */\n    invoke(time) {\n        // create more events if necessary\n        this._createEvents(time);\n        // call the super class\n        super.invoke(time);\n    }\n    /**\n     * Push more events onto the timeline to keep up with the position of the timeline\n     */\n    _createEvents(time) {\n        // schedule the next event\n        const ticks = this.transport.getTicksAtTime(time);\n        if (ticks >= this.time && ticks >= this._nextTick && this._nextTick + this._interval < this.time + this.duration) {\n            this._nextTick += this._interval;\n            this._currentId = this._nextId;\n            this._nextId = this.transport.scheduleOnce(this.invoke.bind(this), new TicksClass(this.context, this._nextTick).toSeconds());\n        }\n    }\n    /**\n     * Push more events onto the timeline to keep up with the position of the timeline\n     */\n    _restart(time) {\n        this.transport.clear(this._currentId);\n        this.transport.clear(this._nextId);\n        this._nextTick = this.time;\n        const ticks = this.transport.getTicksAtTime(time);\n        if (ticks > this.time) {\n            this._nextTick = this.time + Math.ceil((ticks - this.time) / this._interval) * this._interval;\n        }\n        this._currentId = this.transport.scheduleOnce(this.invoke.bind(this), new TicksClass(this.context, this._nextTick).toSeconds());\n        this._nextTick += this._interval;\n        this._nextId = this.transport.scheduleOnce(this.invoke.bind(this), new TicksClass(this.context, this._nextTick).toSeconds());\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        this.transport.clear(this._currentId);\n        this.transport.clear(this._nextId);\n        this.transport.off(\"start\", this._boundRestart);\n        this.transport.off(\"loopStart\", this._boundRestart);\n        return this;\n    }\n}\n//# sourceMappingURL=TransportRepeatEvent.js.map","import { TimeClass } from \"../../core/type/Time\";\nimport { TimelineValue } from \"../../core/util/TimelineValue\";\nimport { onContextClose, onContextInit } from \"../context/ContextInitialization\";\nimport { Gain } from \"../context/Gain\";\nimport { ToneWithContext } from \"../context/ToneWithContext\";\nimport { TicksClass } from \"../type/Ticks\";\nimport { TransportTimeClass } from \"../type/TransportTime\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Emitter } from \"../util/Emitter\";\nimport { readOnly, writable } from \"../util/Interface\";\nimport { IntervalTimeline } from \"../util/IntervalTimeline\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isArray, isDefined } from \"../util/TypeCheck\";\nimport { Clock } from \"./Clock\";\nimport { TransportEvent } from \"./TransportEvent\";\nimport { TransportRepeatEvent } from \"./TransportRepeatEvent\";\n/**\n * Transport for timing musical events.\n * Supports tempo curves and time changes. Unlike browser-based timing (setInterval, requestAnimationFrame)\n * Transport timing events pass in the exact time of the scheduled event\n * in the argument of the callback function. Pass that time value to the object\n * you're scheduling. <br><br>\n * A single transport is created for you when the library is initialized.\n * <br><br>\n * The transport emits the events: \"start\", \"stop\", \"pause\", and \"loop\" which are\n * called with the time of that event as the argument.\n *\n * @example\n * const osc = new Tone.Oscillator().toDestination();\n * // repeated event every 8th note\n * Tone.Transport.scheduleRepeat((time) => {\n * \t// use the callback time to schedule events\n * \tosc.start(time).stop(time + 0.1);\n * }, \"8n\");\n * // transport must be started before it starts invoking events\n * Tone.Transport.start();\n * @category Core\n */\nexport class Transport extends ToneWithContext {\n    constructor() {\n        super(optionsFromArguments(Transport.getDefaults(), arguments));\n        this.name = \"Transport\";\n        //-------------------------------------\n        // \tLOOPING\n        //-------------------------------------\n        /**\n         * If the transport loops or not.\n         */\n        this._loop = new TimelineValue(false);\n        /**\n         * The loop start position in ticks\n         */\n        this._loopStart = 0;\n        /**\n         * The loop end position in ticks\n         */\n        this._loopEnd = 0;\n        //-------------------------------------\n        // \tTIMELINE EVENTS\n        //-------------------------------------\n        /**\n         * All the events in an object to keep track by ID\n         */\n        this._scheduledEvents = {};\n        /**\n         * The scheduled events.\n         */\n        this._timeline = new Timeline();\n        /**\n         * Repeated events\n         */\n        this._repeatedEvents = new IntervalTimeline();\n        /**\n         * All of the synced Signals\n         */\n        this._syncedSignals = [];\n        /**\n         * The swing amount\n         */\n        this._swingAmount = 0;\n        const options = optionsFromArguments(Transport.getDefaults(), arguments);\n        // CLOCK/TEMPO\n        this._ppq = options.ppq;\n        this._clock = new Clock({\n            callback: this._processTick.bind(this),\n            context: this.context,\n            frequency: 0,\n            units: \"bpm\",\n        });\n        this._bindClockEvents();\n        this.bpm = this._clock.frequency;\n        this._clock.frequency.multiplier = options.ppq;\n        this.bpm.setValueAtTime(options.bpm, 0);\n        readOnly(this, \"bpm\");\n        this._timeSignature = options.timeSignature;\n        // SWING\n        this._swingTicks = options.ppq / 2; // 8n\n    }\n    static getDefaults() {\n        return Object.assign(ToneWithContext.getDefaults(), {\n            bpm: 120,\n            loopEnd: \"4m\",\n            loopStart: 0,\n            ppq: 192,\n            swing: 0,\n            swingSubdivision: \"8n\",\n            timeSignature: 4,\n        });\n    }\n    //-------------------------------------\n    // \tTICKS\n    //-------------------------------------\n    /**\n     * called on every tick\n     * @param  tickTime clock relative tick time\n     */\n    _processTick(tickTime, ticks) {\n        // do the loop test\n        if (this._loop.get(tickTime)) {\n            if (ticks >= this._loopEnd) {\n                this.emit(\"loopEnd\", tickTime);\n                this._clock.setTicksAtTime(this._loopStart, tickTime);\n                ticks = this._loopStart;\n                this.emit(\"loopStart\", tickTime, this._clock.getSecondsAtTime(tickTime));\n                this.emit(\"loop\", tickTime);\n            }\n        }\n        // handle swing\n        if (this._swingAmount > 0 &&\n            ticks % this._ppq !== 0 && // not on a downbeat\n            ticks % (this._swingTicks * 2) !== 0) {\n            // add some swing\n            const progress = (ticks % (this._swingTicks * 2)) / (this._swingTicks * 2);\n            const amount = Math.sin((progress) * Math.PI) * this._swingAmount;\n            tickTime += new TicksClass(this.context, this._swingTicks * 2 / 3).toSeconds() * amount;\n        }\n        // invoke the timeline events scheduled on this tick\n        this._timeline.forEachAtTime(ticks, event => event.invoke(tickTime));\n    }\n    //-------------------------------------\n    // \tSCHEDULABLE EVENTS\n    //-------------------------------------\n    /**\n     * Schedule an event along the timeline.\n     * @param callback The callback to be invoked at the time.\n     * @param time The time to invoke the callback at.\n     * @return The id of the event which can be used for canceling the event.\n     * @example\n     * // schedule an event on the 16th measure\n     * Tone.Transport.schedule((time) => {\n     * \t// invoked on measure 16\n     * \tconsole.log(\"measure 16!\");\n     * }, \"16:0:0\");\n     */\n    schedule(callback, time) {\n        const event = new TransportEvent(this, {\n            callback,\n            time: new TransportTimeClass(this.context, time).toTicks(),\n        });\n        return this._addEvent(event, this._timeline);\n    }\n    /**\n     * Schedule a repeated event along the timeline. The event will fire\n     * at the `interval` starting at the `startTime` and for the specified\n     * `duration`.\n     * @param  callback   The callback to invoke.\n     * @param  interval   The duration between successive callbacks. Must be a positive number.\n     * @param  startTime  When along the timeline the events should start being invoked.\n     * @param  duration How long the event should repeat.\n     * @return  The ID of the scheduled event. Use this to cancel the event.\n     * @example\n     * const osc = new Tone.Oscillator().toDestination().start();\n     * // a callback invoked every eighth note after the first measure\n     * Tone.Transport.scheduleRepeat((time) => {\n     * \tosc.start(time).stop(time + 0.1);\n     * }, \"8n\", \"1m\");\n     */\n    scheduleRepeat(callback, interval, startTime, duration = Infinity) {\n        const event = new TransportRepeatEvent(this, {\n            callback,\n            duration: new TimeClass(this.context, duration).toTicks(),\n            interval: new TimeClass(this.context, interval).toTicks(),\n            time: new TransportTimeClass(this.context, startTime).toTicks(),\n        });\n        // kick it off if the Transport is started\n        // @ts-ignore\n        return this._addEvent(event, this._repeatedEvents);\n    }\n    /**\n     * Schedule an event that will be removed after it is invoked.\n     * @param callback The callback to invoke once.\n     * @param time The time the callback should be invoked.\n     * @returns The ID of the scheduled event.\n     */\n    scheduleOnce(callback, time) {\n        const event = new TransportEvent(this, {\n            callback,\n            once: true,\n            time: new TransportTimeClass(this.context, time).toTicks(),\n        });\n        return this._addEvent(event, this._timeline);\n    }\n    /**\n     * Clear the passed in event id from the timeline\n     * @param eventId The id of the event.\n     */\n    clear(eventId) {\n        if (this._scheduledEvents.hasOwnProperty(eventId)) {\n            const item = this._scheduledEvents[eventId.toString()];\n            item.timeline.remove(item.event);\n            item.event.dispose();\n            delete this._scheduledEvents[eventId.toString()];\n        }\n        return this;\n    }\n    /**\n     * Add an event to the correct timeline. Keep track of the\n     * timeline it was added to.\n     * @returns the event id which was just added\n     */\n    _addEvent(event, timeline) {\n        this._scheduledEvents[event.id.toString()] = {\n            event,\n            timeline,\n        };\n        timeline.add(event);\n        return event.id;\n    }\n    /**\n     * Remove scheduled events from the timeline after\n     * the given time. Repeated events will be removed\n     * if their startTime is after the given time\n     * @param after Clear all events after this time.\n     */\n    cancel(after = 0) {\n        const computedAfter = this.toTicks(after);\n        this._timeline.forEachFrom(computedAfter, event => this.clear(event.id));\n        this._repeatedEvents.forEachFrom(computedAfter, event => this.clear(event.id));\n        return this;\n    }\n    //-------------------------------------\n    // \tSTART/STOP/PAUSE\n    //-------------------------------------\n    /**\n     * Bind start/stop/pause events from the clock and emit them.\n     */\n    _bindClockEvents() {\n        this._clock.on(\"start\", (time, offset) => {\n            offset = new TicksClass(this.context, offset).toSeconds();\n            this.emit(\"start\", time, offset);\n        });\n        this._clock.on(\"stop\", (time) => {\n            this.emit(\"stop\", time);\n        });\n        this._clock.on(\"pause\", (time) => {\n            this.emit(\"pause\", time);\n        });\n    }\n    /**\n     * Returns the playback state of the source, either \"started\", \"stopped\", or \"paused\"\n     */\n    get state() {\n        return this._clock.getStateAtTime(this.now());\n    }\n    /**\n     * Start the transport and all sources synced to the transport.\n     * @param  time The time when the transport should start.\n     * @param  offset The timeline offset to start the transport.\n     * @example\n     * // start the transport in one second starting at beginning of the 5th measure.\n     * Tone.Transport.start(\"+1\", \"4:0:0\");\n     */\n    start(time, offset) {\n        let offsetTicks;\n        if (isDefined(offset)) {\n            offsetTicks = this.toTicks(offset);\n        }\n        // start the clock\n        this._clock.start(time, offsetTicks);\n        return this;\n    }\n    /**\n     * Stop the transport and all sources synced to the transport.\n     * @param time The time when the transport should stop.\n     * @example\n     * Tone.Transport.stop();\n     */\n    stop(time) {\n        this._clock.stop(time);\n        return this;\n    }\n    /**\n     * Pause the transport and all sources synced to the transport.\n     */\n    pause(time) {\n        this._clock.pause(time);\n        return this;\n    }\n    /**\n     * Toggle the current state of the transport. If it is\n     * started, it will stop it, otherwise it will start the Transport.\n     * @param  time The time of the event\n     */\n    toggle(time) {\n        time = this.toSeconds(time);\n        if (this._clock.getStateAtTime(time) !== \"started\") {\n            this.start(time);\n        }\n        else {\n            this.stop(time);\n        }\n        return this;\n    }\n    //-------------------------------------\n    // \tSETTERS/GETTERS\n    //-------------------------------------\n    /**\n     * The time signature as just the numerator over 4.\n     * For example 4/4 would be just 4 and 6/8 would be 3.\n     * @example\n     * // common time\n     * Tone.Transport.timeSignature = 4;\n     * // 7/8\n     * Tone.Transport.timeSignature = [7, 8];\n     * // this will be reduced to a single number\n     * Tone.Transport.timeSignature; // returns 3.5\n     */\n    get timeSignature() {\n        return this._timeSignature;\n    }\n    set timeSignature(timeSig) {\n        if (isArray(timeSig)) {\n            timeSig = (timeSig[0] / timeSig[1]) * 4;\n        }\n        this._timeSignature = timeSig;\n    }\n    /**\n     * When the Transport.loop = true, this is the starting position of the loop.\n     */\n    get loopStart() {\n        return new TimeClass(this.context, this._loopStart, \"i\").toSeconds();\n    }\n    set loopStart(startPosition) {\n        this._loopStart = this.toTicks(startPosition);\n    }\n    /**\n     * When the Transport.loop = true, this is the ending position of the loop.\n     */\n    get loopEnd() {\n        return new TimeClass(this.context, this._loopEnd, \"i\").toSeconds();\n    }\n    set loopEnd(endPosition) {\n        this._loopEnd = this.toTicks(endPosition);\n    }\n    /**\n     * If the transport loops or not.\n     */\n    get loop() {\n        return this._loop.get(this.now());\n    }\n    set loop(loop) {\n        this._loop.set(loop, this.now());\n    }\n    /**\n     * Set the loop start and stop at the same time.\n     * @example\n     * // loop over the first measure\n     * Tone.Transport.setLoopPoints(0, \"1m\");\n     * Tone.Transport.loop = true;\n     */\n    setLoopPoints(startPosition, endPosition) {\n        this.loopStart = startPosition;\n        this.loopEnd = endPosition;\n        return this;\n    }\n    /**\n     * The swing value. Between 0-1 where 1 equal to the note + half the subdivision.\n     */\n    get swing() {\n        return this._swingAmount;\n    }\n    set swing(amount) {\n        // scale the values to a normal range\n        this._swingAmount = amount;\n    }\n    /**\n     * Set the subdivision which the swing will be applied to.\n     * The default value is an 8th note. Value must be less\n     * than a quarter note.\n     */\n    get swingSubdivision() {\n        return new TicksClass(this.context, this._swingTicks).toNotation();\n    }\n    set swingSubdivision(subdivision) {\n        this._swingTicks = this.toTicks(subdivision);\n    }\n    /**\n     * The Transport's position in Bars:Beats:Sixteenths.\n     * Setting the value will jump to that position right away.\n     */\n    get position() {\n        const now = this.now();\n        const ticks = this._clock.getTicksAtTime(now);\n        return new TicksClass(this.context, ticks).toBarsBeatsSixteenths();\n    }\n    set position(progress) {\n        const ticks = this.toTicks(progress);\n        this.ticks = ticks;\n    }\n    /**\n     * The Transport's position in seconds\n     * Setting the value will jump to that position right away.\n     */\n    get seconds() {\n        return this._clock.seconds;\n    }\n    set seconds(s) {\n        const now = this.now();\n        const ticks = this._clock.frequency.timeToTicks(s, now);\n        this.ticks = ticks;\n    }\n    /**\n     * The Transport's loop position as a normalized value. Always\n     * returns 0 if the transport if loop is not true.\n     */\n    get progress() {\n        if (this.loop) {\n            const now = this.now();\n            const ticks = this._clock.getTicksAtTime(now);\n            return (ticks - this._loopStart) / (this._loopEnd - this._loopStart);\n        }\n        else {\n            return 0;\n        }\n    }\n    /**\n     * The transports current tick position.\n     */\n    get ticks() {\n        return this._clock.ticks;\n    }\n    set ticks(t) {\n        if (this._clock.ticks !== t) {\n            const now = this.now();\n            // stop everything synced to the transport\n            if (this.state === \"started\") {\n                const ticks = this._clock.getTicksAtTime(now);\n                // schedule to start on the next tick, #573\n                const remainingTick = this._clock.frequency.getDurationOfTicks(Math.ceil(ticks) - ticks, now);\n                const time = now + remainingTick;\n                this.emit(\"stop\", time);\n                this._clock.setTicksAtTime(t, time);\n                // restart it with the new time\n                this.emit(\"start\", time, this._clock.getSecondsAtTime(time));\n            }\n            else {\n                this._clock.setTicksAtTime(t, now);\n            }\n        }\n    }\n    /**\n     * Get the clock's ticks at the given time.\n     * @param  time  When to get the tick value\n     * @return The tick value at the given time.\n     */\n    getTicksAtTime(time) {\n        return Math.round(this._clock.getTicksAtTime(time));\n    }\n    /**\n     * Return the elapsed seconds at the given time.\n     * @param  time  When to get the elapsed seconds\n     * @return  The number of elapsed seconds\n     */\n    getSecondsAtTime(time) {\n        return this._clock.getSecondsAtTime(time);\n    }\n    /**\n     * Pulses Per Quarter note. This is the smallest resolution\n     * the Transport timing supports. This should be set once\n     * on initialization and not set again. Changing this value\n     * after other objects have been created can cause problems.\n     */\n    get PPQ() {\n        return this._clock.frequency.multiplier;\n    }\n    set PPQ(ppq) {\n        this._clock.frequency.multiplier = ppq;\n    }\n    //-------------------------------------\n    // \tSYNCING\n    //-------------------------------------\n    /**\n     * Returns the time aligned to the next subdivision\n     * of the Transport. If the Transport is not started,\n     * it will return 0.\n     * Note: this will not work precisely during tempo ramps.\n     * @param  subdivision  The subdivision to quantize to\n     * @return  The context time of the next subdivision.\n     * @example\n     * // the transport must be started, otherwise returns 0\n     * Tone.Transport.start();\n     * Tone.Transport.nextSubdivision(\"4n\");\n     */\n    nextSubdivision(subdivision) {\n        subdivision = this.toTicks(subdivision);\n        if (this.state !== \"started\") {\n            // if the transport's not started, return 0\n            return 0;\n        }\n        else {\n            const now = this.now();\n            // the remainder of the current ticks and the subdivision\n            const transportPos = this.getTicksAtTime(now);\n            const remainingTicks = subdivision - transportPos % subdivision;\n            return this._clock.nextTickTime(remainingTicks, now);\n        }\n    }\n    /**\n     * Attaches the signal to the tempo control signal so that\n     * any changes in the tempo will change the signal in the same\n     * ratio.\n     *\n     * @param signal\n     * @param ratio Optionally pass in the ratio between the two signals.\n     * \t\t\tOtherwise it will be computed based on their current values.\n     */\n    syncSignal(signal, ratio) {\n        if (!ratio) {\n            // get the sync ratio\n            const now = this.now();\n            if (signal.getValueAtTime(now) !== 0) {\n                const bpm = this.bpm.getValueAtTime(now);\n                const computedFreq = 1 / (60 / bpm / this.PPQ);\n                ratio = signal.getValueAtTime(now) / computedFreq;\n            }\n            else {\n                ratio = 0;\n            }\n        }\n        const ratioSignal = new Gain(ratio);\n        // @ts-ignore\n        this.bpm.connect(ratioSignal);\n        // @ts-ignore\n        ratioSignal.connect(signal._param);\n        this._syncedSignals.push({\n            initial: signal.value,\n            ratio: ratioSignal,\n            signal,\n        });\n        signal.value = 0;\n        return this;\n    }\n    /**\n     * Unsyncs a previously synced signal from the transport's control.\n     * See Transport.syncSignal.\n     */\n    unsyncSignal(signal) {\n        for (let i = this._syncedSignals.length - 1; i >= 0; i--) {\n            const syncedSignal = this._syncedSignals[i];\n            if (syncedSignal.signal === signal) {\n                syncedSignal.ratio.dispose();\n                syncedSignal.signal.value = syncedSignal.initial;\n                this._syncedSignals.splice(i, 1);\n            }\n        }\n        return this;\n    }\n    /**\n     * Clean up.\n     */\n    dispose() {\n        super.dispose();\n        this._clock.dispose();\n        writable(this, \"bpm\");\n        this._timeline.dispose();\n        this._repeatedEvents.dispose();\n        return this;\n    }\n}\nEmitter.mixin(Transport);\n//-------------------------------------\n// \tINITIALIZATION\n//-------------------------------------\nonContextInit(context => {\n    context.transport = new Transport({ context });\n});\nonContextClose(context => {\n    context.transport.dispose();\n});\n//# sourceMappingURL=Transport.js.map","import { Volume } from \"../component/channel/Volume\";\nimport \"../core/context/Destination\";\nimport \"../core/clock/Transport\";\nimport { ToneAudioNode } from \"../core/context/ToneAudioNode\";\nimport { defaultArg } from \"../core/util/Defaults\";\nimport { noOp, readOnly } from \"../core/util/Interface\";\nimport { StateTimeline } from \"../core/util/StateTimeline\";\nimport { isDefined, isUndef } from \"../core/util/TypeCheck\";\nimport { assert, assertContextRunning } from \"../core/util/Debug\";\nimport { GT } from \"../core/util/Math\";\n/**\n * Base class for sources.\n * start/stop of this.context.transport.\n *\n * ```\n * // Multiple state change events can be chained together,\n * // but must be set in the correct order and with ascending times\n * // OK\n * state.start().stop(\"+0.2\");\n * // OK\n * state.start().stop(\"+0.2\").start(\"+0.4\").stop(\"+0.7\")\n * // BAD\n * state.stop(\"+0.2\").start();\n * // BAD\n * state.start(\"+0.3\").stop(\"+0.2\");\n * ```\n */\nexport class Source extends ToneAudioNode {\n    constructor(options) {\n        super(options);\n        /**\n         * Sources have no inputs\n         */\n        this.input = undefined;\n        /**\n         * Keep track of the scheduled state.\n         */\n        this._state = new StateTimeline(\"stopped\");\n        /**\n         * The synced `start` callback function from the transport\n         */\n        this._synced = false;\n        /**\n         * Keep track of all of the scheduled event ids\n         */\n        this._scheduled = [];\n        /**\n         * Placeholder functions for syncing/unsyncing to transport\n         */\n        this._syncedStart = noOp;\n        this._syncedStop = noOp;\n        this._state.memory = 100;\n        this._state.increasing = true;\n        this._volume = this.output = new Volume({\n            context: this.context,\n            mute: options.mute,\n            volume: options.volume,\n        });\n        this.volume = this._volume.volume;\n        readOnly(this, \"volume\");\n        this.onstop = options.onstop;\n    }\n    static getDefaults() {\n        return Object.assign(ToneAudioNode.getDefaults(), {\n            mute: false,\n            onstop: noOp,\n            volume: 0,\n        });\n    }\n    /**\n     * Returns the playback state of the source, either \"started\" or \"stopped\".\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/ahntone_c3.mp3\", () => {\n     * \tplayer.start();\n     * \tconsole.log(player.state);\n     * }).toDestination();\n     */\n    get state() {\n        if (this._synced) {\n            if (this.context.transport.state === \"started\") {\n                return this._state.getValueAtTime(this.context.transport.seconds);\n            }\n            else {\n                return \"stopped\";\n            }\n        }\n        else {\n            return this._state.getValueAtTime(this.now());\n        }\n    }\n    /**\n     * Mute the output.\n     * @example\n     * const osc = new Tone.Oscillator().toDestination().start();\n     * // mute the output\n     * osc.mute = true;\n     */\n    get mute() {\n        return this._volume.mute;\n    }\n    set mute(mute) {\n        this._volume.mute = mute;\n    }\n    /**\n     * Ensure that the scheduled time is not before the current time.\n     * Should only be used when scheduled unsynced.\n     */\n    _clampToCurrentTime(time) {\n        if (this._synced) {\n            return time;\n        }\n        else {\n            return Math.max(time, this.context.currentTime);\n        }\n    }\n    /**\n     * Start the source at the specified time. If no time is given,\n     * start the source now.\n     * @param  time When the source should be started.\n     * @example\n     * const source = new Tone.Oscillator().toDestination();\n     * source.start(\"+0.5\"); // starts the source 0.5 seconds from now\n     */\n    start(time, offset, duration) {\n        let computedTime = isUndef(time) && this._synced ? this.context.transport.seconds : this.toSeconds(time);\n        computedTime = this._clampToCurrentTime(computedTime);\n        // if it's started, stop it and restart it\n        if (!this._synced && this._state.getValueAtTime(computedTime) === \"started\") {\n            // time should be strictly greater than the previous start time\n            assert(GT(computedTime, this._state.get(computedTime).time), \"Start time must be strictly greater than previous start time\");\n            this._state.cancel(computedTime);\n            this._state.setStateAtTime(\"started\", computedTime);\n            this.log(\"restart\", computedTime);\n            this.restart(computedTime, offset, duration);\n        }\n        else {\n            this.log(\"start\", computedTime);\n            this._state.setStateAtTime(\"started\", computedTime);\n            if (this._synced) {\n                // add the offset time to the event\n                const event = this._state.get(computedTime);\n                if (event) {\n                    event.offset = this.toSeconds(defaultArg(offset, 0));\n                    event.duration = duration ? this.toSeconds(duration) : undefined;\n                }\n                const sched = this.context.transport.schedule(t => {\n                    this._start(t, offset, duration);\n                }, computedTime);\n                this._scheduled.push(sched);\n                // if the transport is already started\n                // and the time is greater than where the transport is\n                if (this.context.transport.state === \"started\" &&\n                    this.context.transport.getSecondsAtTime(this.immediate()) > computedTime) {\n                    this._syncedStart(this.now(), this.context.transport.seconds);\n                }\n            }\n            else {\n                assertContextRunning(this.context);\n                this._start(computedTime, offset, duration);\n            }\n        }\n        return this;\n    }\n    /**\n     * Stop the source at the specified time. If no time is given,\n     * stop the source now.\n     * @param  time When the source should be stopped.\n     * @example\n     * const source = new Tone.Oscillator().toDestination();\n     * source.start();\n     * source.stop(\"+0.5\"); // stops the source 0.5 seconds from now\n     */\n    stop(time) {\n        let computedTime = isUndef(time) && this._synced ? this.context.transport.seconds : this.toSeconds(time);\n        computedTime = this._clampToCurrentTime(computedTime);\n        if (this._state.getValueAtTime(computedTime) === \"started\" || isDefined(this._state.getNextState(\"started\", computedTime))) {\n            this.log(\"stop\", computedTime);\n            if (!this._synced) {\n                this._stop(computedTime);\n            }\n            else {\n                const sched = this.context.transport.schedule(this._stop.bind(this), computedTime);\n                this._scheduled.push(sched);\n            }\n            this._state.cancel(computedTime);\n            this._state.setStateAtTime(\"stopped\", computedTime);\n        }\n        return this;\n    }\n    /**\n     * Restart the source.\n     */\n    restart(time, offset, duration) {\n        time = this.toSeconds(time);\n        if (this._state.getValueAtTime(time) === \"started\") {\n            this._state.cancel(time);\n            this._restart(time, offset, duration);\n        }\n        return this;\n    }\n    /**\n     * Sync the source to the Transport so that all subsequent\n     * calls to `start` and `stop` are synced to the TransportTime\n     * instead of the AudioContext time.\n     *\n     * @example\n     * const osc = new Tone.Oscillator().toDestination();\n     * // sync the source so that it plays between 0 and 0.3 on the Transport's timeline\n     * osc.sync().start(0).stop(0.3);\n     * // start the transport.\n     * Tone.Transport.start();\n     * // set it to loop once a second\n     * Tone.Transport.loop = true;\n     * Tone.Transport.loopEnd = 1;\n     */\n    sync() {\n        if (!this._synced) {\n            this._synced = true;\n            this._syncedStart = (time, offset) => {\n                if (offset > 0) {\n                    // get the playback state at that time\n                    const stateEvent = this._state.get(offset);\n                    // listen for start events which may occur in the middle of the sync'ed time\n                    if (stateEvent && stateEvent.state === \"started\" && stateEvent.time !== offset) {\n                        // get the offset\n                        const startOffset = offset - this.toSeconds(stateEvent.time);\n                        let duration;\n                        if (stateEvent.duration) {\n                            duration = this.toSeconds(stateEvent.duration) - startOffset;\n                        }\n                        this._start(time, this.toSeconds(stateEvent.offset) + startOffset, duration);\n                    }\n                }\n            };\n            this._syncedStop = time => {\n                const seconds = this.context.transport.getSecondsAtTime(Math.max(time - this.sampleTime, 0));\n                if (this._state.getValueAtTime(seconds) === \"started\") {\n                    this._stop(time);\n                }\n            };\n            this.context.transport.on(\"start\", this._syncedStart);\n            this.context.transport.on(\"loopStart\", this._syncedStart);\n            this.context.transport.on(\"stop\", this._syncedStop);\n            this.context.transport.on(\"pause\", this._syncedStop);\n            this.context.transport.on(\"loopEnd\", this._syncedStop);\n        }\n        return this;\n    }\n    /**\n     * Unsync the source to the Transport. See Source.sync\n     */\n    unsync() {\n        if (this._synced) {\n            this.context.transport.off(\"stop\", this._syncedStop);\n            this.context.transport.off(\"pause\", this._syncedStop);\n            this.context.transport.off(\"loopEnd\", this._syncedStop);\n            this.context.transport.off(\"start\", this._syncedStart);\n            this.context.transport.off(\"loopStart\", this._syncedStart);\n        }\n        this._synced = false;\n        // clear all of the scheduled ids\n        this._scheduled.forEach(id => this.context.transport.clear(id));\n        this._scheduled = [];\n        this._state.cancel(0);\n        // stop it also\n        this._stop(0);\n        return this;\n    }\n    /**\n     * Clean up.\n     */\n    dispose() {\n        super.dispose();\n        this.onstop = noOp;\n        this.unsync();\n        this._volume.dispose();\n        this._state.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=Source.js.map","import { __awaiter, __decorate } from \"tslib\";\nimport { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { defaultArg, optionsFromArguments } from \"../../core/util/Defaults\";\nimport { noOp } from \"../../core/util/Interface\";\nimport { isUndef } from \"../../core/util/TypeCheck\";\nimport { Source } from \"../Source\";\nimport { ToneBufferSource } from \"./ToneBufferSource\";\nimport { assertRange } from \"../../core/util/Debug\";\nimport { timeRange } from \"../../core/util/Decorator\";\n/**\n * Player is an audio file player with start, loop, and stop functions.\n * @example\n * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/gong_1.mp3\").toDestination();\n * // play as soon as the buffer is loaded\n * player.autostart = true;\n * @category Source\n */\nexport class Player extends Source {\n    constructor() {\n        super(optionsFromArguments(Player.getDefaults(), arguments, [\"url\", \"onload\"]));\n        this.name = \"Player\";\n        /**\n         * All of the active buffer source nodes\n         */\n        this._activeSources = new Set();\n        const options = optionsFromArguments(Player.getDefaults(), arguments, [\"url\", \"onload\"]);\n        this._buffer = new ToneAudioBuffer({\n            onload: this._onload.bind(this, options.onload),\n            onerror: options.onerror,\n            reverse: options.reverse,\n            url: options.url,\n        });\n        this.autostart = options.autostart;\n        this._loop = options.loop;\n        this._loopStart = options.loopStart;\n        this._loopEnd = options.loopEnd;\n        this._playbackRate = options.playbackRate;\n        this.fadeIn = options.fadeIn;\n        this.fadeOut = options.fadeOut;\n    }\n    static getDefaults() {\n        return Object.assign(Source.getDefaults(), {\n            autostart: false,\n            fadeIn: 0,\n            fadeOut: 0,\n            loop: false,\n            loopEnd: 0,\n            loopStart: 0,\n            onload: noOp,\n            onerror: noOp,\n            playbackRate: 1,\n            reverse: false,\n        });\n    }\n    /**\n     * Load the audio file as an audio buffer.\n     * Decodes the audio asynchronously and invokes\n     * the callback once the audio buffer loads.\n     * Note: this does not need to be called if a url\n     * was passed in to the constructor. Only use this\n     * if you want to manually load a new url.\n     * @param url The url of the buffer to load. Filetype support depends on the browser.\n     */\n    load(url) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this._buffer.load(url);\n            this._onload();\n            return this;\n        });\n    }\n    /**\n     * Internal callback when the buffer is loaded.\n     */\n    _onload(callback = noOp) {\n        callback();\n        if (this.autostart) {\n            this.start();\n        }\n    }\n    /**\n     * Internal callback when the buffer is done playing.\n     */\n    _onSourceEnd(source) {\n        // invoke the onstop function\n        this.onstop(this);\n        // delete the source from the active sources\n        this._activeSources.delete(source);\n        if (this._activeSources.size === 0 && !this._synced &&\n            this._state.getValueAtTime(this.now()) === \"started\") {\n            // remove the 'implicitEnd' event and replace with an explicit end\n            this._state.cancel(this.now());\n            this._state.setStateAtTime(\"stopped\", this.now());\n        }\n    }\n    /**\n     * Play the buffer at the given startTime. Optionally add an offset\n     * and/or duration which will play the buffer from a position\n     * within the buffer for the given duration.\n     *\n     * @param  time When the player should start.\n     * @param  offset The offset from the beginning of the sample to start at.\n     * @param  duration How long the sample should play. If no duration is given, it will default to the full length of the sample (minus any offset)\n     */\n    start(time, offset, duration) {\n        super.start(time, offset, duration);\n        return this;\n    }\n    /**\n     * Internal start method\n     */\n    _start(startTime, offset, duration) {\n        // if it's a loop the default offset is the loopStart point\n        if (this._loop) {\n            offset = defaultArg(offset, this._loopStart);\n        }\n        else {\n            // otherwise the default offset is 0\n            offset = defaultArg(offset, 0);\n        }\n        // compute the values in seconds\n        const computedOffset = this.toSeconds(offset);\n        // compute the duration which is either the passed in duration of the buffer.duration - offset\n        const origDuration = duration;\n        duration = defaultArg(duration, Math.max(this._buffer.duration - computedOffset, 0));\n        let computedDuration = this.toSeconds(duration);\n        // scale it by the playback rate\n        computedDuration = computedDuration / this._playbackRate;\n        // get the start time\n        startTime = this.toSeconds(startTime);\n        // make the source\n        const source = new ToneBufferSource({\n            url: this._buffer,\n            context: this.context,\n            fadeIn: this.fadeIn,\n            fadeOut: this.fadeOut,\n            loop: this._loop,\n            loopEnd: this._loopEnd,\n            loopStart: this._loopStart,\n            onended: this._onSourceEnd.bind(this),\n            playbackRate: this._playbackRate,\n        }).connect(this.output);\n        // set the looping properties\n        if (!this._loop && !this._synced) {\n            // cancel the previous stop\n            this._state.cancel(startTime + computedDuration);\n            // if it's not looping, set the state change at the end of the sample\n            this._state.setStateAtTime(\"stopped\", startTime + computedDuration, {\n                implicitEnd: true,\n            });\n        }\n        // add it to the array of active sources\n        this._activeSources.add(source);\n        // start it\n        if (this._loop && isUndef(origDuration)) {\n            source.start(startTime, computedOffset);\n        }\n        else {\n            // subtract the fade out time\n            source.start(startTime, computedOffset, computedDuration - this.toSeconds(this.fadeOut));\n        }\n    }\n    /**\n     * Stop playback.\n     */\n    _stop(time) {\n        const computedTime = this.toSeconds(time);\n        this._activeSources.forEach(source => source.stop(computedTime));\n    }\n    /**\n     * Stop and then restart the player from the beginning (or offset)\n     * @param  time When the player should start.\n     * @param  offset The offset from the beginning of the sample to start at.\n     * @param  duration How long the sample should play. If no duration is given,\n     * \t\t\t\t\tit will default to the full length of the sample (minus any offset)\n     */\n    restart(time, offset, duration) {\n        super.restart(time, offset, duration);\n        return this;\n    }\n    _restart(time, offset, duration) {\n        this._stop(time);\n        this._start(time, offset, duration);\n    }\n    /**\n     * Seek to a specific time in the player's buffer. If the\n     * source is no longer playing at that time, it will stop.\n     * @param offset The time to seek to.\n     * @param when The time for the seek event to occur.\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/gurgling_theremin_1.mp3\", () => {\n     * \tplayer.start();\n     * \t// seek to the offset in 1 second from now\n     * \tplayer.seek(0.4, \"+1\");\n     * }).toDestination();\n     */\n    seek(offset, when) {\n        const computedTime = this.toSeconds(when);\n        if (this._state.getValueAtTime(computedTime) === \"started\") {\n            const computedOffset = this.toSeconds(offset);\n            // if it's currently playing, stop it\n            this._stop(computedTime);\n            // restart it at the given time\n            this._start(computedTime, computedOffset);\n        }\n        return this;\n    }\n    /**\n     * Set the loop start and end. Will only loop if loop is set to true.\n     * @param loopStart The loop start time\n     * @param loopEnd The loop end time\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/malevoices_aa2_F3.mp3\").toDestination();\n     * // loop between the given points\n     * player.setLoopPoints(0.2, 0.3);\n     * player.loop = true;\n     * player.autostart = true;\n     */\n    setLoopPoints(loopStart, loopEnd) {\n        this.loopStart = loopStart;\n        this.loopEnd = loopEnd;\n        return this;\n    }\n    /**\n     * If loop is true, the loop will start at this position.\n     */\n    get loopStart() {\n        return this._loopStart;\n    }\n    set loopStart(loopStart) {\n        this._loopStart = loopStart;\n        if (this.buffer.loaded) {\n            assertRange(this.toSeconds(loopStart), 0, this.buffer.duration);\n        }\n        // get the current source\n        this._activeSources.forEach(source => {\n            source.loopStart = loopStart;\n        });\n    }\n    /**\n     * If loop is true, the loop will end at this position.\n     */\n    get loopEnd() {\n        return this._loopEnd;\n    }\n    set loopEnd(loopEnd) {\n        this._loopEnd = loopEnd;\n        if (this.buffer.loaded) {\n            assertRange(this.toSeconds(loopEnd), 0, this.buffer.duration);\n        }\n        // get the current source\n        this._activeSources.forEach(source => {\n            source.loopEnd = loopEnd;\n        });\n    }\n    /**\n     * The audio buffer belonging to the player.\n     */\n    get buffer() {\n        return this._buffer;\n    }\n    set buffer(buffer) {\n        this._buffer.set(buffer);\n    }\n    /**\n     * If the buffer should loop once it's over.\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/drum-samples/breakbeat.mp3\").toDestination();\n     * player.loop = true;\n     * player.autostart = true;\n     */\n    get loop() {\n        return this._loop;\n    }\n    set loop(loop) {\n        // if no change, do nothing\n        if (this._loop === loop) {\n            return;\n        }\n        this._loop = loop;\n        // set the loop of all of the sources\n        this._activeSources.forEach(source => {\n            source.loop = loop;\n        });\n        if (loop) {\n            // remove the next stopEvent\n            const stopEvent = this._state.getNextState(\"stopped\", this.now());\n            if (stopEvent) {\n                this._state.cancel(stopEvent.time);\n            }\n        }\n    }\n    /**\n     * Normal speed is 1. The pitch will change with the playback rate.\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/femalevoices_aa2_A5.mp3\").toDestination();\n     * // play at 1/4 speed\n     * player.playbackRate = 0.25;\n     * // play as soon as the buffer is loaded\n     * player.autostart = true;\n     */\n    get playbackRate() {\n        return this._playbackRate;\n    }\n    set playbackRate(rate) {\n        this._playbackRate = rate;\n        const now = this.now();\n        // cancel the stop event since it's at a different time now\n        const stopEvent = this._state.getNextState(\"stopped\", now);\n        if (stopEvent && stopEvent.implicitEnd) {\n            this._state.cancel(stopEvent.time);\n            this._activeSources.forEach(source => source.cancelStop());\n        }\n        // set all the sources\n        this._activeSources.forEach(source => {\n            source.playbackRate.setValueAtTime(rate, now);\n        });\n    }\n    /**\n     * If the buffer should be reversed\n     * @example\n     * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/chime_1.mp3\").toDestination();\n     * player.autostart = true;\n     * player.reverse = true;\n     */\n    get reverse() {\n        return this._buffer.reverse;\n    }\n    set reverse(rev) {\n        this._buffer.reverse = rev;\n    }\n    /**\n     * If the buffer is loaded\n     */\n    get loaded() {\n        return this._buffer.loaded;\n    }\n    dispose() {\n        super.dispose();\n        // disconnect all of the players\n        this._activeSources.forEach(source => source.dispose());\n        this._activeSources.clear();\n        this._buffer.dispose();\n        return this;\n    }\n}\n__decorate([\n    timeRange(0)\n], Player.prototype, \"fadeIn\", void 0);\n__decorate([\n    timeRange(0)\n], Player.prototype, \"fadeOut\", void 0);\n//# sourceMappingURL=Player.js.map","import { connect } from \"../../core/context/ToneAudioNode\";\nimport { Param } from \"../../core/context/Param\";\nimport { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { defaultArg, optionsFromArguments } from \"../../core/util/Defaults\";\nimport { noOp } from \"../../core/util/Interface\";\nimport { isDefined } from \"../../core/util/TypeCheck\";\nimport { assert } from \"../../core/util/Debug\";\nimport { OneShotSource } from \"../OneShotSource\";\nimport { EQ, GTE, LT } from \"../../core/util/Math\";\n/**\n * Wrapper around the native BufferSourceNode.\n * @category Source\n */\nexport class ToneBufferSource extends OneShotSource {\n    constructor() {\n        super(optionsFromArguments(ToneBufferSource.getDefaults(), arguments, [\"url\", \"onload\"]));\n        this.name = \"ToneBufferSource\";\n        /**\n         * The oscillator\n         */\n        this._source = this.context.createBufferSource();\n        this._internalChannels = [this._source];\n        /**\n         * indicators if the source has started/stopped\n         */\n        this._sourceStarted = false;\n        this._sourceStopped = false;\n        const options = optionsFromArguments(ToneBufferSource.getDefaults(), arguments, [\"url\", \"onload\"]);\n        connect(this._source, this._gainNode);\n        this._source.onended = () => this._stopSource();\n        /**\n         * The playbackRate of the buffer\n         */\n        this.playbackRate = new Param({\n            context: this.context,\n            param: this._source.playbackRate,\n            units: \"positive\",\n            value: options.playbackRate,\n        });\n        // set some values initially\n        this.loop = options.loop;\n        this.loopStart = options.loopStart;\n        this.loopEnd = options.loopEnd;\n        this._buffer = new ToneAudioBuffer(options.url, options.onload, options.onerror);\n        this._internalChannels.push(this._source);\n    }\n    static getDefaults() {\n        return Object.assign(OneShotSource.getDefaults(), {\n            url: new ToneAudioBuffer(),\n            loop: false,\n            loopEnd: 0,\n            loopStart: 0,\n            onload: noOp,\n            onerror: noOp,\n            playbackRate: 1,\n        });\n    }\n    /**\n     * The fadeIn time of the amplitude envelope.\n     */\n    get fadeIn() {\n        return this._fadeIn;\n    }\n    set fadeIn(t) {\n        this._fadeIn = t;\n    }\n    /**\n     * The fadeOut time of the amplitude envelope.\n     */\n    get fadeOut() {\n        return this._fadeOut;\n    }\n    set fadeOut(t) {\n        this._fadeOut = t;\n    }\n    /**\n     * The curve applied to the fades, either \"linear\" or \"exponential\"\n     */\n    get curve() {\n        return this._curve;\n    }\n    set curve(t) {\n        this._curve = t;\n    }\n    /**\n     * Start the buffer\n     * @param  time When the player should start.\n     * @param  offset The offset from the beginning of the sample to start at.\n     * @param  duration How long the sample should play. If no duration is given, it will default to the full length of the sample (minus any offset)\n     * @param  gain  The gain to play the buffer back at.\n     */\n    start(time, offset, duration, gain = 1) {\n        assert(this.buffer.loaded, \"buffer is either not set or not loaded\");\n        const computedTime = this.toSeconds(time);\n        // apply the gain envelope\n        this._startGain(computedTime, gain);\n        // if it's a loop the default offset is the loopstart point\n        if (this.loop) {\n            offset = defaultArg(offset, this.loopStart);\n        }\n        else {\n            // otherwise the default offset is 0\n            offset = defaultArg(offset, 0);\n        }\n        // make sure the offset is not less than 0\n        let computedOffset = Math.max(this.toSeconds(offset), 0);\n        // start the buffer source\n        if (this.loop) {\n            // modify the offset if it's greater than the loop time\n            const loopEnd = this.toSeconds(this.loopEnd) || this.buffer.duration;\n            const loopStart = this.toSeconds(this.loopStart);\n            const loopDuration = loopEnd - loopStart;\n            // move the offset back\n            if (GTE(computedOffset, loopEnd)) {\n                computedOffset = ((computedOffset - loopStart) % loopDuration) + loopStart;\n            }\n            // when the offset is very close to the duration, set it to 0\n            if (EQ(computedOffset, this.buffer.duration)) {\n                computedOffset = 0;\n            }\n        }\n        // this.buffer.loaded would have return false if the AudioBuffer was undefined\n        this._source.buffer = this.buffer.get();\n        this._source.loopEnd = this.toSeconds(this.loopEnd) || this.buffer.duration;\n        if (LT(computedOffset, this.buffer.duration)) {\n            this._sourceStarted = true;\n            this._source.start(computedTime, computedOffset);\n        }\n        // if a duration is given, schedule a stop\n        if (isDefined(duration)) {\n            let computedDur = this.toSeconds(duration);\n            // make sure it's never negative\n            computedDur = Math.max(computedDur, 0);\n            this.stop(computedTime + computedDur);\n        }\n        return this;\n    }\n    _stopSource(time) {\n        if (!this._sourceStopped && this._sourceStarted) {\n            this._sourceStopped = true;\n            this._source.stop(this.toSeconds(time));\n            this._onended();\n        }\n    }\n    /**\n     * If loop is true, the loop will start at this position.\n     */\n    get loopStart() {\n        return this._source.loopStart;\n    }\n    set loopStart(loopStart) {\n        this._source.loopStart = this.toSeconds(loopStart);\n    }\n    /**\n     * If loop is true, the loop will end at this position.\n     */\n    get loopEnd() {\n        return this._source.loopEnd;\n    }\n    set loopEnd(loopEnd) {\n        this._source.loopEnd = this.toSeconds(loopEnd);\n    }\n    /**\n     * The audio buffer belonging to the player.\n     */\n    get buffer() {\n        return this._buffer;\n    }\n    set buffer(buffer) {\n        this._buffer.set(buffer);\n    }\n    /**\n     * If the buffer should loop once it's over.\n     */\n    get loop() {\n        return this._source.loop;\n    }\n    set loop(loop) {\n        this._source.loop = loop;\n        if (this._sourceStarted) {\n            this.cancelStop();\n        }\n    }\n    /**\n     * Clean up.\n     */\n    dispose() {\n        super.dispose();\n        this._source.onended = null;\n        this._source.disconnect();\n        this._buffer.dispose();\n        this.playbackRate.dispose();\n        return this;\n    }\n}\n//# sourceMappingURL=ToneBufferSource.js.map","export const version = \"14.7.77\";\n//# sourceMappingURL=version.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __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\nexport function __read(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\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __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}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import {\n\tEventDispatcher,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils,\n\tBox3,\n} from 'three';\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n//    Orbit - left mouse / touch: one-finger move\n//    Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n//    Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = {type: 'change'};\nconst _startEvent = {type: 'start'};\nconst _endEvent = {type: 'end'};\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst TILT_LIMIT = Math.cos(70 * MathUtils.DEG2RAD);\n\nclass OrbitControls extends EventDispatcher {\n\tconstructor(object, domElement) {\n\t\tsuper();\n\n\t\tthis.object = object;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.05;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.panSpeed = 1.0;\n\t\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\t\tthis.zoomToCursor = false;\n\t\tthis.clampPosition = false;\n\t\tthis.positionBounds = new Box3(\n\t\t\tnew Vector3(-Infinity, -Infinity, -Infinity),\n\t\t\tnew Vector3(+Infinity, +Infinity, +Infinity)\n\t\t);\n\t\t// this.targetBounds = new Box3(\n\t\t// \tnew Vector3(-Infinity, -Infinity, -Infinity),\n\t\t// \tnew Vector3(+Infinity, +Infinity, +Infinity)\n\t\t// );\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n\t\t// The four arrow keys\n\t\tthis.keys = {LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown'};\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = {LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN};\n\n\t\t// Touch fingers\n\t\tthis.touches = {ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN};\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t//\n\t\tconst mouseBefore = new Vector3(0, 0, 0);\n\t\tconst mouseAfter = new Vector3(0, 0, 0);\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\t\t\treturn spherical.phi;\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\t\t\treturn spherical.theta;\n\t\t};\n\n\t\tthis.getDistance = function () {\n\t\t\treturn this.object.position.distanceTo(this.target);\n\t\t};\n\n\t\tthis.listenToKeyEvents = function (domElement) {\n\t\t\tdomElement.addEventListener('keydown', onKeyDown);\n\t\t\tthis._domElementKeyEvents = domElement;\n\t\t};\n\n\t\tthis.stopListenToKeyEvents = function () {\n\t\t\tthis._domElementKeyEvents.removeEventListener('keydown', onKeyDown);\n\t\t\tthis._domElementKeyEvents = null;\n\t\t};\n\n\t\tthis.saveState = function () {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t\tscope.zoom0 = scope.object.zoom;\n\t\t};\n\n\t\tthis.reset = function () {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(_changeEvent);\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = (function () {\n\t\t\tconst offset = new Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tconst quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n\t\t\tconst quatInverse = quat.clone().invert();\n\n\t\t\tconst lastPosition = new Vector3();\n\t\t\tconst lastQuaternion = new Quaternion();\n\t\t\tconst lastTargetPosition = new Vector3();\n\n\t\t\tconst twoPI = 2 * Math.PI;\n\n\t\t\treturn function update(deltaTime = null) {\n\t\t\t\tconst position = scope.object.position;\n\n\t\t\t\toffset.copy(position).sub(scope.target);\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle(deltaTime));\n\t\t\t\t}\n\n\t\t\t\tif (scope.enableDamping) {\n\t\t\t\t\tconst thetaDelta = sphericalDelta.theta * scope.dampingFactor;\n\t\t\t\t\tconst phiDelta = sphericalDelta.phi * scope.dampingFactor;\n\t\t\t\t\tspherical.theta += thetaDelta;\n\t\t\t\t\tspherical.phi += phiDelta;\n\t\t\t\t} else {\n\t\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t}\n\n\t\t\t\t// restrict theta to be between desired limits\n\n\t\t\t\tlet min = scope.minAzimuthAngle;\n\t\t\t\tlet max = scope.maxAzimuthAngle;\n\n\t\t\t\tif (isFinite(min) && isFinite(max)) {\n\t\t\t\t\tif (min < -Math.PI) min += twoPI;\n\t\t\t\t\telse if (min > Math.PI) min -= twoPI;\n\n\t\t\t\t\tif (max < -Math.PI) max += twoPI;\n\t\t\t\t\telse if (max > Math.PI) max -= twoPI;\n\n\t\t\t\t\tif (min <= max) {\n\t\t\t\t\t\tspherical.theta = Math.max(min, Math.min(max, spherical.theta));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tspherical.theta =\n\t\t\t\t\t\t\tspherical.theta > (min + max) / 2\n\t\t\t\t\t\t\t\t? Math.max(min, spherical.theta)\n\t\t\t\t\t\t\t\t: Math.min(max, spherical.theta);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\n\t\t\t\tspherical.makeSafe();\n\n\t\t\t\t// move target to panned location\n\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tscope.target.addScaledVector(panOffset, scope.dampingFactor);\n\t\t\t\t} else {\n\t\t\t\t\tscope.target.add(panOffset);\n\t\t\t\t}\n\t\t\t\tfunction _clampTarget() {\n\t\t\t\t\tif (scope.clampPosition) {\n\t\t\t\t\t\t// scope.targetBounds.copy(scope.positionBounds);\n\t\t\t\t\t\t// scope.targetBounds.min.add(offset);\n\t\t\t\t\t\t// scope.targetBounds.max.add(offset);\n\t\t\t\t\t\tscope.target.clamp(scope.positionBounds.min, scope.positionBounds.max);\n\t\t\t\t\t\t// console.log('clamp target', scope.target.toArray());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction _clampPosition() {\n\t\t\t\t\tif (scope.clampPosition) {\n\t\t\t\t\t\tposition.clamp(scope.positionBounds.min, scope.positionBounds.max);\n\t\t\t\t\t\t// console.log('clamp position', position.toArray());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_clampTarget();\n\n\t\t\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t\t\t// we adjust zoom later in these cases\n\t\t\t\tif ((scope.zoomToCursor && performCursorZoom) || scope.object.isOrthographicCamera) {\n\t\t\t\t\tspherical.radius = clampDistance(spherical.radius);\n\t\t\t\t} else {\n\t\t\t\t\tspherical.radius = clampDistance(spherical.radius * scale);\n\t\t\t\t}\n\n\t\t\t\toffset.setFromSpherical(spherical);\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\t\t\t_clampPosition();\n\n\t\t\t\tscope.object.lookAt(scope.target);\n\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= 1 - scope.dampingFactor;\n\t\t\t\t\tsphericalDelta.phi *= 1 - scope.dampingFactor;\n\n\t\t\t\t\tpanOffset.multiplyScalar(1 - scope.dampingFactor);\n\t\t\t\t} else {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\n\t\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t}\n\n\t\t\t\t// adjust camera position\n\t\t\t\tlet zoomChanged = false;\n\t\t\t\tif (scope.zoomToCursor && performCursorZoom) {\n\t\t\t\t\tlet newRadius = null;\n\t\t\t\t\tif (scope.object.isPerspectiveCamera) {\n\t\t\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t\t\t// this method avoids floating point error\n\t\t\t\t\t\tconst prevRadius = offset.length();\n\t\t\t\t\t\tnewRadius = clampDistance(prevRadius * scale);\n\n\t\t\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\t\t\tscope.object.position.addScaledVector(dollyDirection, radiusDelta);\n\t\t\t\t\t\t_clampPosition();\n\t\t\t\t\t\tscope.object.updateMatrixWorld();\n\t\t\t\t\t} else if (scope.object.isOrthographicCamera) {\n\t\t\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\t\t\tmouseBefore.x = mouse.x;\n\t\t\t\t\t\tmouseBefore.y = mouse.y;\n\t\t\t\t\t\tmouseBefore.z = 0;\n\t\t\t\t\t\tmouseBefore.unproject(scope.object);\n\n\t\t\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale));\n\t\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\t\tzoomChanged = true;\n\n\t\t\t\t\t\tmouseAfter.x = mouse.x;\n\t\t\t\t\t\tmouseAfter.y = mouse.y;\n\t\t\t\t\t\tmouseAfter.z = 0;\n\t\t\t\t\t\tmouseAfter.unproject(scope.object);\n\n\t\t\t\t\t\tscope.object.position.sub(mouseAfter).add(mouseBefore);\n\t\t\t\t\t\t_clampPosition();\n\t\t\t\t\t\tscope.object.updateMatrixWorld();\n\n\t\t\t\t\t\tnewRadius = offset.length();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tscope.zoomToCursor = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle the placement of the target\n\t\t\t\t\tif (newRadius !== null) {\n\t\t\t\t\t\tif (this.screenSpacePanning) {\n\t\t\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\t\t\tscope.target\n\t\t\t\t\t\t\t\t.set(0, 0, -1)\n\t\t\t\t\t\t\t\t.transformDirection(scope.object.matrix)\n\t\t\t\t\t\t\t\t.multiplyScalar(newRadius)\n\t\t\t\t\t\t\t\t.add(scope.object.position);\n\t\t\t\t\t\t\t_clampTarget();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t\t\t_ray.origin.copy(scope.object.position);\n\t\t\t\t\t\t\t_ray.direction.set(0, 0, -1).transformDirection(scope.object.matrix);\n\n\t\t\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t\t\t// extremely large values\n\t\t\t\t\t\t\tif (Math.abs(scope.object.up.dot(_ray.direction)) < TILT_LIMIT) {\n\t\t\t\t\t\t\t\tobject.lookAt(scope.target);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint(scope.object.up, scope.target);\n\t\t\t\t\t\t\t\t_ray.intersectPlane(_plane, scope.target);\n\t\t\t\t\t\t\t\t_clampTarget();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (scope.object.isOrthographicCamera) {\n\t\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale));\n\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\tzoomChanged = true;\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tperformCursorZoom = false;\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif (\n\t\t\t\t\tzoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS ||\n\t\t\t\t\tlastTargetPosition.distanceToSquared(scope.target) > 0\n\t\t\t\t) {\n\t\t\t\t\tscope.dispatchEvent(_changeEvent);\n\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tlastTargetPosition.copy(scope.target);\n\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t})();\n\n\t\tthis.dispose = function () {\n\t\t\tscope.domElement.removeEventListener('contextmenu', onContextMenu);\n\n\t\t\tscope.domElement.removeEventListener('pointerdown', onPointerDown);\n\t\t\tscope.domElement.removeEventListener('pointercancel', onPointerUp);\n\t\t\tscope.domElement.removeEventListener('wheel', onMouseWheel);\n\n\t\t\tscope.domElement.ownerDocument.removeEventListener('pointermove', onPointerMove);\n\t\t\tscope.domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n\n\t\t\tif (scope._domElementKeyEvents !== null) {\n\t\t\t\tscope._domElementKeyEvents.removeEventListener('keydown', onKeyDown);\n\t\t\t\tscope._domElementKeyEvents = null;\n\t\t\t}\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tconst scope = this;\n\n\t\tconst STATE = {\n\t\t\tNONE: -1,\n\t\t\tROTATE: 0,\n\t\t\tDOLLY: 1,\n\t\t\tPAN: 2,\n\t\t\tTOUCH_ROTATE: 3,\n\t\t\tTOUCH_PAN: 4,\n\t\t\tTOUCH_DOLLY_PAN: 5,\n\t\t\tTOUCH_DOLLY_ROTATE: 6,\n\t\t};\n\n\t\tlet state = STATE.NONE;\n\n\t\tconst EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tconst spherical = new Spherical();\n\t\tconst sphericalDelta = new Spherical();\n\n\t\tlet scale = 1;\n\t\tconst panOffset = new Vector3();\n\n\t\tconst rotateStart = new Vector2();\n\t\tconst rotateEnd = new Vector2();\n\t\tconst rotateDelta = new Vector2();\n\n\t\tconst panStart = new Vector2();\n\t\tconst panEnd = new Vector2();\n\t\tconst panDelta = new Vector2();\n\n\t\tconst dollyStart = new Vector2();\n\t\tconst dollyEnd = new Vector2();\n\t\tconst dollyDelta = new Vector2();\n\n\t\tconst dollyDirection = new Vector3();\n\t\tconst mouse = new Vector2();\n\t\tlet performCursorZoom = false;\n\n\t\tconst pointers = [];\n\t\tconst pointerPositions = {};\n\n\t\tfunction getAutoRotationAngle(deltaTime) {\n\t\t\tif (deltaTime !== null) {\n\t\t\t\treturn ((2 * Math.PI) / 60) * scope.autoRotateSpeed * deltaTime;\n\t\t\t} else {\n\t\t\t\treturn ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed;\n\t\t\t}\n\t\t}\n\n\t\tfunction getZoomScale() {\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\n\t\tconst panLeft = (function () {\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\n\t\tconst panUp = (function () {\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tif (scope.screenSpacePanning === true) {\n\t\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1);\n\t\t\t\t} else {\n\t\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0);\n\t\t\t\t\tv.crossVectors(scope.object.up, v);\n\t\t\t\t}\n\n\t\t\t\tv.multiplyScalar(distance);\n\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tconst pan = (function () {\n\t\t\tconst offset = new Vector3();\n\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tconst element = scope.domElement;\n\n\t\t\t\tif (scope.object.isPerspectiveCamera) {\n\t\t\t\t\t// perspective\n\t\t\t\t\tconst position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tlet targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0);\n\n\t\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\t\tpanLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else if (scope.object.isOrthographicCamera) {\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(\n\t\t\t\t\t\t(deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n\t\t\t\t\t\tscope.object.matrix\n\t\t\t\t\t);\n\t\t\t\t\tpanUp(\n\t\t\t\t\t\t(deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n\t\t\t\t\t\tscope.object.matrix\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tif (scope.object.isPerspectiveCamera || scope.object.isOrthographicCamera) {\n\t\t\t\tscale /= dollyScale;\n\t\t\t} else {\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tif (scope.object.isPerspectiveCamera || scope.object.isOrthographicCamera) {\n\t\t\t\tscale *= dollyScale;\n\t\t\t} else {\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\n\t\tfunction updateMouseParameters(event) {\n\t\t\tif (!scope.zoomToCursor) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tperformCursorZoom = true;\n\n\t\t\tconst rect = scope.domElement.getBoundingClientRect();\n\t\t\tconst x = event.clientX - rect.left;\n\t\t\tconst y = event.clientY - rect.top;\n\t\t\tconst w = rect.width;\n\t\t\tconst h = rect.height;\n\n\t\t\tmouse.x = (x / w) * 2 - 1;\n\t\t\tmouse.y = -(y / h) * 2 + 1;\n\n\t\t\tdollyDirection.set(mouse.x, mouse.y, 1).unproject(scope.object).sub(scope.object.position).normalize();\n\t\t}\n\n\t\tfunction clampDistance(dist) {\n\t\t\treturn Math.max(scope.minDistance, Math.min(scope.maxDistance, dist));\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tupdateMouseParameters(event);\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed);\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height\n\n\t\t\trotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight);\n\n\t\t\trotateStart.copy(rotateEnd);\n\n\t\t\tscope.update();\n\t\t}\n\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\n\t\t\tdollyStart.copy(dollyEnd);\n\n\t\t\tscope.update();\n\t\t}\n\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\n\t\t\tpanDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed);\n\n\t\t\tpan(panDelta.x, panDelta.y);\n\n\t\t\tpanStart.copy(panEnd);\n\n\t\t\tscope.update();\n\t\t}\n\n\t\tfunction handleMouseWheel(event) {\n\t\t\tupdateMouseParameters(event);\n\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t} else if (event.deltaY > 0) {\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\n\t\t\tscope.update();\n\t\t}\n\n\t\tfunction handleKeyDown(event) {\n\t\t\tlet needsUpdate = false;\n\n\t\t\tswitch (event.code) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tif (event.ctrlKey || event.metaKey || event.shiftKey) {\n\t\t\t\t\t\trotateUp((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tif (event.ctrlKey || event.metaKey || event.shiftKey) {\n\t\t\t\t\t\trotateUp((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tif (event.ctrlKey || event.metaKey || event.shiftKey) {\n\t\t\t\t\t\trotateLeft((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tif (event.ctrlKey || event.metaKey || event.shiftKey) {\n\t\t\t\t\t\trotateLeft((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (needsUpdate) {\n\t\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tscope.update();\n\t\t\t}\n\t\t}\n\n\t\tfunction handleTouchStartRotate() {\n\t\t\tif (pointers.length === 1) {\n\t\t\t\trotateStart.set(pointers[0].pageX, pointers[0].pageY);\n\t\t\t} else {\n\t\t\t\tconst x = 0.5 * (pointers[0].pageX + pointers[1].pageX);\n\t\t\t\tconst y = 0.5 * (pointers[0].pageY + pointers[1].pageY);\n\n\t\t\t\trotateStart.set(x, y);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleTouchStartPan() {\n\t\t\tif (pointers.length === 1) {\n\t\t\t\tpanStart.set(pointers[0].pageX, pointers[0].pageY);\n\t\t\t} else {\n\t\t\t\tconst x = 0.5 * (pointers[0].pageX + pointers[1].pageX);\n\t\t\t\tconst y = 0.5 * (pointers[0].pageY + pointers[1].pageY);\n\n\t\t\t\tpanStart.set(x, y);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleTouchStartDolly() {\n\t\t\tconst dx = pointers[0].pageX - pointers[1].pageX;\n\t\t\tconst dy = pointers[0].pageY - pointers[1].pageY;\n\n\t\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\n\t\tfunction handleTouchStartDollyPan() {\n\t\t\tif (scope.enableZoom) handleTouchStartDolly();\n\n\t\t\tif (scope.enablePan) handleTouchStartPan();\n\t\t}\n\n\t\tfunction handleTouchStartDollyRotate() {\n\t\t\tif (scope.enableZoom) handleTouchStartDolly();\n\n\t\t\tif (scope.enableRotate) handleTouchStartRotate();\n\t\t}\n\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\tif (pointers.length == 1) {\n\t\t\t\trotateEnd.set(event.pageX, event.pageY);\n\t\t\t} else {\n\t\t\t\tconst position = getSecondPointerPosition(event);\n\n\t\t\t\tconst x = 0.5 * (event.pageX + position.x);\n\t\t\t\tconst y = 0.5 * (event.pageY + position.y);\n\n\t\t\t\trotateEnd.set(x, y);\n\t\t\t}\n\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed);\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height\n\n\t\t\trotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight);\n\n\t\t\trotateStart.copy(rotateEnd);\n\t\t}\n\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tif (pointers.length === 1) {\n\t\t\t\tpanEnd.set(event.pageX, event.pageY);\n\t\t\t} else {\n\t\t\t\tconst position = getSecondPointerPosition(event);\n\n\t\t\t\tconst x = 0.5 * (event.pageX + position.x);\n\t\t\t\tconst y = 0.5 * (event.pageY + position.y);\n\n\t\t\t\tpanEnd.set(x, y);\n\t\t\t}\n\n\t\t\tpanDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed);\n\n\t\t\tpan(panDelta.x, panDelta.y);\n\n\t\t\tpanStart.copy(panEnd);\n\t\t}\n\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tconst position = getSecondPointerPosition(event);\n\n\t\t\tconst dx = event.pageX - position.x;\n\t\t\tconst dy = event.pageY - position.y;\n\n\t\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\t\tdollyEnd.set(0, distance);\n\n\t\t\tdollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed));\n\n\t\t\tdollyOut(dollyDelta.y);\n\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t}\n\n\t\tfunction handleTouchMoveDollyPan(event) {\n\t\t\tif (scope.enableZoom) handleTouchMoveDolly(event);\n\n\t\t\tif (scope.enablePan) handleTouchMovePan(event);\n\t\t}\n\n\t\tfunction handleTouchMoveDollyRotate(event) {\n\t\t\tif (scope.enableZoom) handleTouchMoveDolly(event);\n\n\t\t\tif (scope.enableRotate) handleTouchMoveRotate(event);\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onPointerDown(event) {\n\t\t\tif (scope.enabled === false) return;\n\n\t\t\tif (pointers.length === 0) {\n\t\t\t\tscope.domElement.setPointerCapture(event.pointerId);\n\n\t\t\t\tscope.domElement.ownerDocument.addEventListener('pointermove', onPointerMove);\n\t\t\t\tscope.domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n\t\t\t}\n\n\t\t\t//\n\n\t\t\taddPointer(event);\n\n\t\t\tif (event.pointerType === 'touch') {\n\t\t\t\tonTouchStart(event);\n\t\t\t} else {\n\t\t\t\tonMouseDown(event);\n\t\t\t}\n\t\t}\n\n\t\tfunction onPointerMove(event) {\n\t\t\tif (scope.enabled === false) return;\n\n\t\t\tif (event.pointerType === 'touch') {\n\t\t\t\tonTouchMove(event);\n\t\t\t} else {\n\t\t\t\tonMouseMove(event);\n\t\t\t}\n\t\t}\n\n\t\tfunction onPointerUp(event) {\n\t\t\tremovePointer(event);\n\n\t\t\tif (pointers.length === 0) {\n\t\t\t\tscope.domElement.releasePointerCapture(event.pointerId);\n\n\t\t\t\tscope.domElement.ownerDocument.removeEventListener('pointermove', onPointerMove);\n\t\t\t\tscope.domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n\t\t\t}\n\n\t\t\tscope.dispatchEvent(_endEvent);\n\n\t\t\tstate = STATE.NONE;\n\t\t}\n\n\t\tfunction onMouseDown(event) {\n\t\t\tlet mouseAction;\n\n\t\t\tswitch (event.button) {\n\t\t\t\tcase 0:\n\t\t\t\t\tmouseAction = scope.mouseButtons.LEFT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tmouseAction = scope.mouseButtons.MIDDLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\tmouseAction = scope.mouseButtons.RIGHT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tmouseAction = -1;\n\t\t\t}\n\n\t\t\tswitch (mouseAction) {\n\t\t\t\tcase MOUSE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\n\t\t\t\t\thandleMouseDownDolly(event);\n\n\t\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOUSE.ROTATE:\n\t\t\t\t\t// when using the physical player,\n\t\t\t\t\t// we need to be able to rotate the camera while\n\t\t\t\t\t// having shiftKey pressed to run.\n\t\t\t\t\t// Therefore the following condition is replaced,\n\t\t\t\t\t// so that we only check the modifier key\n\t\t\t\t\t// if enablePan is true.\n\t\t\t\t\t//\n\t\t\t\t\t// if (event.ctrlKey || event.metaKey || event.shiftKey) {\n\t\t\t\t\t// if (scope.enablePan === false) return;\n\t\t\t\t\t//\n\t\t\t\t\tif (scope.enablePan === true && (event.ctrlKey || event.metaKey || event.shiftKey)) {\n\t\t\t\t\t\thandleMouseDownPan(event);\n\n\t\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (scope.enableRotate === false) return;\n\n\t\t\t\t\t\thandleMouseDownRotate(event);\n\n\t\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOUSE.PAN:\n\t\t\t\t\tif (event.ctrlKey || event.metaKey || event.shiftKey) {\n\t\t\t\t\t\tif (scope.enableRotate === false) return;\n\n\t\t\t\t\t\thandleMouseDownRotate(event);\n\n\t\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (scope.enablePan === false) return;\n\n\t\t\t\t\t\thandleMouseDownPan(event);\n\n\t\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(_startEvent);\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseMove(event) {\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\n\t\t\t\t\thandleMouseMoveRotate(event);\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\n\t\t\t\t\thandleMouseMoveDolly(event);\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false) return;\n\n\t\t\t\t\thandleMouseMovePan(event);\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tscope.dispatchEvent(_startEvent);\n\n\t\t\thandleMouseWheel(event);\n\n\t\t\tscope.dispatchEvent(_endEvent);\n\t\t}\n\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false) return;\n\n\t\t\thandleKeyDown(event);\n\t\t}\n\n\t\tfunction onTouchStart(event) {\n\t\t\ttrackPointer(event);\n\n\t\t\tswitch (pointers.length) {\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (scope.touches.ONE) {\n\t\t\t\t\t\tcase TOUCH.ROTATE:\n\t\t\t\t\t\t\tif (scope.enableRotate === false) return;\n\n\t\t\t\t\t\t\thandleTouchStartRotate();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TOUCH.PAN:\n\t\t\t\t\t\t\tif (scope.enablePan === false) return;\n\n\t\t\t\t\t\t\thandleTouchStartPan();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tstate = STATE.NONE;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\tswitch (scope.touches.TWO) {\n\t\t\t\t\t\tcase TOUCH.DOLLY_PAN:\n\t\t\t\t\t\t\tif (scope.enableZoom === false && scope.enablePan === false) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyPan();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\t\t\t\t\t\t\tif (scope.enableZoom === false && scope.enableRotate === false) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyRotate();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tstate = STATE.NONE;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(_startEvent);\n\t\t\t}\n\t\t}\n\n\t\tfunction onTouchMove(event) {\n\t\t\ttrackPointer(event);\n\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.TOUCH_ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\n\t\t\t\t\thandleTouchMoveRotate(event);\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_PAN:\n\t\t\t\t\tif (scope.enablePan === false) return;\n\n\t\t\t\t\thandleTouchMovePan(event);\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_DOLLY_PAN:\n\t\t\t\t\tif (scope.enableZoom === false && scope.enablePan === false) return;\n\n\t\t\t\t\thandleTouchMoveDollyPan(event);\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_DOLLY_ROTATE:\n\t\t\t\t\tif (scope.enableZoom === false && scope.enableRotate === false) return;\n\n\t\t\t\t\thandleTouchMoveDollyRotate(event);\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t}\n\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false) return;\n\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tfunction addPointer(event) {\n\t\t\tpointers.push(event);\n\t\t}\n\n\t\tfunction removePointer(event) {\n\t\t\tdelete pointerPositions[event.pointerId];\n\n\t\t\tfor (let i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId == event.pointerId) {\n\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction trackPointer(event) {\n\t\t\tlet position = pointerPositions[event.pointerId];\n\n\t\t\tif (position === undefined) {\n\t\t\t\tposition = new Vector2();\n\t\t\t\tpointerPositions[event.pointerId] = position;\n\t\t\t}\n\n\t\t\tposition.set(event.pageX, event.pageY);\n\t\t}\n\n\t\tfunction getSecondPointerPosition(event) {\n\t\t\tconst pointer = event.pointerId === pointers[0].pointerId ? pointers[1] : pointers[0];\n\n\t\t\treturn pointerPositions[pointer.pointerId];\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener('contextmenu', onContextMenu);\n\n\t\tscope.domElement.addEventListener('pointerdown', onPointerDown);\n\t\tscope.domElement.addEventListener('pointercancel', onPointerUp);\n\t\tscope.domElement.addEventListener('wheel', onMouseWheel, {passive: false});\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\t}\n}\n\nexport {OrbitControls};\n","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 20 20\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M6 13.5V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m12-3V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m-6-9V3.75m0 3.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 9.75V10.5\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M15.75 19.5L8.25 12l7.5-7.5\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M8.25 4.5l7.5 7.5-7.5 7.5\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M8.625 12a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0H8.25m4.125 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0H12m4.125 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0h-.375M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M15.182 16.318A4.486 4.486 0 0012.016 15a4.486 4.486 0 00-3.198 1.318M21 12a9 9 0 11-18 0 9 9 0 0118 0zM9.75 9.75c0 .414-.168.75-.375.75S9 10.164 9 9.75 9.168 9 9.375 9s.375.336.375.75zm-.375 0h.008v.015h-.008V9.75zm5.625 0c0 .414-.168.75-.375.75s-.375-.336-.375-.75.168-.75.375-.75.375.336.375.75zm-.375 0h.008v.015h-.008V9.75z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M15 12H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M12 9v6m3-3H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    \"stroke-width\": \"1.5\",\n    stroke: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      d: \"M6 18L18 6M6 6l12 12\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M3 6.75A.75.75 0 013.75 6h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 6.75zM3 12a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 12zm0 5.25a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75a.75.75 0 01-.75-.75z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", { d: \"M12 9a3.75 3.75 0 100 7.5A3.75 3.75 0 0012 9z\" }),\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M9.344 3.071a49.52 49.52 0 015.312 0c.967.052 1.83.585 2.332 1.39l.821 1.317c.24.383.645.643 1.11.71.386.054.77.113 1.152.177 1.432.239 2.429 1.493 2.429 2.909V18a3 3 0 01-3 3h-15a3 3 0 01-3-3V9.574c0-1.416.997-2.67 2.429-2.909.382-.064.766-.123 1.151-.178a1.56 1.56 0 001.11-.71l.822-1.315a2.942 2.942 0 012.332-1.39zM6.75 12.75a5.25 5.25 0 1110.5 0 5.25 5.25 0 01-10.5 0zm12-1.5a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm13.36-1.814a.75.75 0 10-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 00-1.06 1.06l2.25 2.25a.75.75 0 001.14-.094l3.75-5.25z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M19.916 4.626a.75.75 0 01.208 1.04l-9 13.5a.75.75 0 01-1.154.114l-6-6a.75.75 0 011.06-1.06l5.353 5.353 8.493-12.739a.75.75 0 011.04-.208z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M20.03 4.72a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 01-1.06 0l-7.5-7.5a.75.75 0 011.06-1.06L12 11.69l6.97-6.97a.75.75 0 011.06 0zm0 6a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 01-1.06 0l-7.5-7.5a.75.75 0 111.06-1.06L12 17.69l6.97-6.97a.75.75 0 011.06 0z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M13.28 3.97a.75.75 0 010 1.06L6.31 12l6.97 6.97a.75.75 0 11-1.06 1.06l-7.5-7.5a.75.75 0 010-1.06l7.5-7.5a.75.75 0 011.06 0zm6 0a.75.75 0 010 1.06L12.31 12l6.97 6.97a.75.75 0 11-1.06 1.06l-7.5-7.5a.75.75 0 010-1.06l7.5-7.5a.75.75 0 011.06 0z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M4.72 3.97a.75.75 0 011.06 0l7.5 7.5a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 01-1.06-1.06L11.69 12 4.72 5.03a.75.75 0 010-1.06zm6 0a.75.75 0 011.06 0l7.5 7.5a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 11-1.06-1.06L17.69 12l-6.97-6.97a.75.75 0 010-1.06z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M11.47 4.72a.75.75 0 011.06 0l7.5 7.5a.75.75 0 11-1.06 1.06L12 6.31l-6.97 6.97a.75.75 0 01-1.06-1.06l7.5-7.5zm.53 7.59l-6.97 6.97a.75.75 0 01-1.06-1.06l7.5-7.5a.75.75 0 011.06 0l7.5 7.5a.75.75 0 11-1.06 1.06L12 12.31z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12.53 16.28a.75.75 0 01-1.06 0l-7.5-7.5a.75.75 0 011.06-1.06L12 14.69l6.97-6.97a.75.75 0 111.06 1.06l-7.5 7.5z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M7.72 12.53a.75.75 0 010-1.06l7.5-7.5a.75.75 0 111.06 1.06L9.31 12l6.97 6.97a.75.75 0 11-1.06 1.06l-7.5-7.5z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M16.28 11.47a.75.75 0 010 1.06l-7.5 7.5a.75.75 0 01-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 011.06-1.06l7.5 7.5z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M11.47 4.72a.75.75 0 011.06 0l3.75 3.75a.75.75 0 01-1.06 1.06L12 6.31 8.78 9.53a.75.75 0 01-1.06-1.06l3.75-3.75zm-3.75 9.75a.75.75 0 011.06 0L12 17.69l3.22-3.22a.75.75 0 111.06 1.06l-3.75 3.75a.75.75 0 01-1.06 0l-3.75-3.75a.75.75 0 010-1.06z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M11.47 7.72a.75.75 0 011.06 0l7.5 7.5a.75.75 0 11-1.06 1.06L12 9.31l-6.97 6.97a.75.75 0 01-1.06-1.06l7.5-7.5z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 6a.75.75 0 00-1.5 0v6c0 .414.336.75.75.75h4.5a.75.75 0 000-1.5h-3.75V6z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M14.447 3.027a.75.75 0 01.527.92l-4.5 16.5a.75.75 0 01-1.448-.394l4.5-16.5a.75.75 0 01.921-.526zM16.72 6.22a.75.75 0 011.06 0l5.25 5.25a.75.75 0 010 1.06l-5.25 5.25a.75.75 0 11-1.06-1.06L21.44 12l-4.72-4.72a.75.75 0 010-1.06zm-9.44 0a.75.75 0 010 1.06L2.56 12l4.72 4.72a.75.75 0 11-1.06 1.06L.97 12.53a.75.75 0 010-1.06l5.25-5.25a.75.75 0 011.06 0z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M3 2.25a.75.75 0 01.75.75v.54l1.838-.46a9.75 9.75 0 016.725.738l.108.054a8.25 8.25 0 005.58.652l3.109-.732a.75.75 0 01.917.81 47.784 47.784 0 00.005 10.337.75.75 0 01-.574.812l-3.114.733a9.75 9.75 0 01-6.594-.77l-.108-.054a8.25 8.25 0 00-5.69-.625l-2.202.55V21a.75.75 0 01-1.5 0V3A.75.75 0 013 2.25z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M2.625 6.75a1.125 1.125 0 112.25 0 1.125 1.125 0 01-2.25 0zm4.875 0A.75.75 0 018.25 6h12a.75.75 0 010 1.5h-12a.75.75 0 01-.75-.75zM2.625 12a1.125 1.125 0 112.25 0 1.125 1.125 0 01-2.25 0zM7.5 12a.75.75 0 01.75-.75h12a.75.75 0 010 1.5h-12A.75.75 0 017.5 12zm-4.875 5.25a1.125 1.125 0 112.25 0 1.125 1.125 0 01-2.25 0zm4.875 0a.75.75 0 01.75-.75h12a.75.75 0 010 1.5h-12a.75.75 0 01-.75-.75z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12 1.5a5.25 5.25 0 00-5.25 5.25v3a3 3 0 00-3 3v6.75a3 3 0 003 3h10.5a3 3 0 003-3v-6.75a3 3 0 00-3-3v-3c0-2.9-2.35-5.25-5.25-5.25zm3.75 8.25v-3a3.75 3.75 0 10-7.5 0v3h7.5z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", { d: \"M18 1.5c2.9 0 5.25 2.35 5.25 5.25v3.75a.75.75 0 01-1.5 0V6.75a3.75 3.75 0 10-7.5 0v3a3 3 0 013 3v6.75a3 3 0 01-3 3H3.75a3 3 0 01-3-3v-6.75a3 3 0 013-3h9v-3c0-2.9 2.35-5.25 5.25-5.25z\" })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M11.54 22.351l.07.04.028.016a.76.76 0 00.723 0l.028-.015.071-.041a16.975 16.975 0 001.144-.742 19.58 19.58 0 002.683-2.282c1.944-1.99 3.963-4.98 3.963-8.827a8.25 8.25 0 00-16.5 0c0 3.846 2.02 6.837 3.963 8.827a19.58 19.58 0 002.682 2.282 16.975 16.975 0 001.145.742zM12 13.5a3 3 0 100-6 3 3 0 000 6z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M6.72 5.66l11.62 11.62A8.25 8.25 0 006.72 5.66zm10.56 12.68L5.66 6.72a8.25 8.25 0 0011.62 11.62zM5.105 5.106c3.807-3.808 9.98-3.808 13.788 0 3.808 3.807 3.808 9.98 0 13.788-3.807 3.808-9.98 3.808-13.788 0-3.808-3.807-3.808-9.98 0-13.788z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 9a.75.75 0 00-1.5 0v2.25H9a.75.75 0 000 1.5h2.25V15a.75.75 0 001.5 0v-2.25H15a.75.75 0 000-1.5h-2.25V9z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M15.75 4.5a3 3 0 11.825 2.066l-8.421 4.679a3.002 3.002 0 010 1.51l8.421 4.679a3 3 0 11-.729 1.31l-8.421-4.678a3 3 0 110-4.132l8.421-4.679a3 3 0 01-.096-.755z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12 6.75a5.25 5.25 0 016.775-5.025.75.75 0 01.313 1.248l-3.32 3.319c.063.475.276.934.641 1.299.365.365.824.578 1.3.64l3.318-3.319a.75.75 0 011.248.313 5.25 5.25 0 01-5.472 6.756c-1.018-.086-1.87.1-2.309.634L7.344 21.3A3.298 3.298 0 112.7 16.657l8.684-7.151c.533-.44.72-1.291.634-2.309A5.342 5.342 0 0112 6.75zM4.117 19.125a.75.75 0 01.75-.75h.008a.75.75 0 01.75.75v.008a.75.75 0 01-.75.75h-.008a.75.75 0 01-.75-.75v-.008z\",\n      \"clip-rule\": \"evenodd\"\n    }),\n    _createElementVNode(\"path\", { d: \"M10.076 8.64l-2.201-2.2V4.874a.75.75 0 00-.364-.643l-3.75-2.25a.75.75 0 00-.916.113l-.75.75a.75.75 0 00-.113.916l2.25 3.75a.75.75 0 00.643.364h1.564l2.062 2.062 1.575-1.297z\" }),\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12.556 17.329l4.183 4.182a3.375 3.375 0 004.773-4.773l-3.306-3.305a6.803 6.803 0 01-1.53.043c-.394-.034-.682-.006-.867.042a.589.589 0 00-.167.063l-3.086 3.748zm3.414-1.36a.75.75 0 011.06 0l1.875 1.876a.75.75 0 11-1.06 1.06L15.97 17.03a.75.75 0 010-1.06z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = require(\"vue\")\n\nmodule.exports = function render(_ctx, _cache) {\n  return (_openBlock(), _createElementBlock(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    \"aria-hidden\": \"true\"\n  }, [\n    _createElementVNode(\"path\", {\n      \"fill-rule\": \"evenodd\",\n      d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zm-1.72 6.97a.75.75 0 10-1.06 1.06L10.94 12l-1.72 1.72a.75.75 0 101.06 1.06L12 13.06l1.72 1.72a.75.75 0 101.06-1.06L13.06 12l1.72-1.72a.75.75 0 10-1.06-1.06L12 10.94l-1.72-1.72z\",\n      \"clip-rule\": \"evenodd\"\n    })\n  ]))\n}","/*\n * This file defines flags and constants that can be modified during compile time in order to facilitate tree shaking\n * for users.\n *\n * Debug flags need to be declared in each package individually and must not be imported across package boundaries,\n * because some build tools have trouble tree-shaking imported guards.\n *\n * As a convention, we define debug flags in a `flags.ts` file in the root of a package's `src` folder.\n *\n * Debug flag files will contain \"magic strings\" like `__SENTRY_DEBUG__` that may get replaced with actual values during\n * our, or the user's build process. Take care when introducing new flags - they must not throw if they are not\n * replaced.\n */\n/** Flag that is true for debug builds, false otherwise. */\nexport var IS_DEBUG_BUILD = typeof __SENTRY_DEBUG__ === 'undefined' ? true : __SENTRY_DEBUG__;\n//# sourceMappingURL=flags.js.map","import { dropUndefinedKeys, timestampInSeconds, uuid4 } from '@sentry/utils';\n/**\n * @inheritdoc\n */\nvar Session = /** @class */ (function () {\n    function Session(context) {\n        this.errors = 0;\n        this.sid = uuid4();\n        this.duration = 0;\n        this.status = 'ok';\n        this.init = true;\n        this.ignoreDuration = false;\n        // Both timestamp and started are in seconds since the UNIX epoch.\n        var startingTime = timestampInSeconds();\n        this.timestamp = startingTime;\n        this.started = startingTime;\n        if (context) {\n            this.update(context);\n        }\n    }\n    /** JSDoc */\n    // eslint-disable-next-line complexity\n    Session.prototype.update = function (context) {\n        if (context === void 0) { context = {}; }\n        if (context.user) {\n            if (!this.ipAddress && context.user.ip_address) {\n                this.ipAddress = context.user.ip_address;\n            }\n            if (!this.did && !context.did) {\n                this.did = context.user.id || context.user.email || context.user.username;\n            }\n        }\n        this.timestamp = context.timestamp || timestampInSeconds();\n        if (context.ignoreDuration) {\n            this.ignoreDuration = context.ignoreDuration;\n        }\n        if (context.sid) {\n            // Good enough uuid validation. — Kamil\n            this.sid = context.sid.length === 32 ? context.sid : uuid4();\n        }\n        if (context.init !== undefined) {\n            this.init = context.init;\n        }\n        if (!this.did && context.did) {\n            this.did = \"\" + context.did;\n        }\n        if (typeof context.started === 'number') {\n            this.started = context.started;\n        }\n        if (this.ignoreDuration) {\n            this.duration = undefined;\n        }\n        else if (typeof context.duration === 'number') {\n            this.duration = context.duration;\n        }\n        else {\n            var duration = this.timestamp - this.started;\n            this.duration = duration >= 0 ? duration : 0;\n        }\n        if (context.release) {\n            this.release = context.release;\n        }\n        if (context.environment) {\n            this.environment = context.environment;\n        }\n        if (!this.ipAddress && context.ipAddress) {\n            this.ipAddress = context.ipAddress;\n        }\n        if (!this.userAgent && context.userAgent) {\n            this.userAgent = context.userAgent;\n        }\n        if (typeof context.errors === 'number') {\n            this.errors = context.errors;\n        }\n        if (context.status) {\n            this.status = context.status;\n        }\n    };\n    /** JSDoc */\n    Session.prototype.close = function (status) {\n        if (status) {\n            this.update({ status: status });\n        }\n        else if (this.status === 'ok') {\n            this.update({ status: 'exited' });\n        }\n        else {\n            this.update();\n        }\n    };\n    /** JSDoc */\n    Session.prototype.toJSON = function () {\n        return dropUndefinedKeys({\n            sid: \"\" + this.sid,\n            init: this.init,\n            // Make sure that sec is converted to ms for date constructor\n            started: new Date(this.started * 1000).toISOString(),\n            timestamp: new Date(this.timestamp * 1000).toISOString(),\n            status: this.status,\n            errors: this.errors,\n            did: typeof this.did === 'number' || typeof this.did === 'string' ? \"\" + this.did : undefined,\n            duration: this.duration,\n            attrs: {\n                release: this.release,\n                environment: this.environment,\n                ip_address: this.ipAddress,\n                user_agent: this.userAgent,\n            },\n        });\n    };\n    return Session;\n}());\nexport { Session };\n//# sourceMappingURL=session.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { consoleSandbox, dateTimestampInSeconds, getGlobalObject, getGlobalSingleton, isNodeEnv, logger, uuid4, } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { Scope } from './scope';\nimport { Session } from './session';\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nexport var API_VERSION = 4;\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nvar DEFAULT_BREADCRUMBS = 100;\n/**\n * @inheritDoc\n */\nvar Hub = /** @class */ (function () {\n    /**\n     * Creates a new instance of the hub, will push one {@link Layer} into the\n     * internal stack on creation.\n     *\n     * @param client bound to the hub.\n     * @param scope bound to the hub.\n     * @param version number, higher number means higher priority.\n     */\n    function Hub(client, scope, _version) {\n        if (scope === void 0) { scope = new Scope(); }\n        if (_version === void 0) { _version = API_VERSION; }\n        this._version = _version;\n        /** Is a {@link Layer}[] containing the client and scope */\n        this._stack = [{}];\n        this.getStackTop().scope = scope;\n        if (client) {\n            this.bindClient(client);\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.isOlderThan = function (version) {\n        return this._version < version;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.bindClient = function (client) {\n        var top = this.getStackTop();\n        top.client = client;\n        if (client && client.setupIntegrations) {\n            client.setupIntegrations();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.pushScope = function () {\n        // We want to clone the content of prev scope\n        var scope = Scope.clone(this.getScope());\n        this.getStack().push({\n            client: this.getClient(),\n            scope: scope,\n        });\n        return scope;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.popScope = function () {\n        if (this.getStack().length <= 1)\n            return false;\n        return !!this.getStack().pop();\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.withScope = function (callback) {\n        var scope = this.pushScope();\n        try {\n            callback(scope);\n        }\n        finally {\n            this.popScope();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.getClient = function () {\n        return this.getStackTop().client;\n    };\n    /** Returns the scope of the top stack. */\n    Hub.prototype.getScope = function () {\n        return this.getStackTop().scope;\n    };\n    /** Returns the scope stack for domains or the process. */\n    Hub.prototype.getStack = function () {\n        return this._stack;\n    };\n    /** Returns the topmost scope layer in the order domain > local > process. */\n    Hub.prototype.getStackTop = function () {\n        return this._stack[this._stack.length - 1];\n    };\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    Hub.prototype.captureException = function (exception, hint) {\n        var eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n        var finalHint = hint;\n        // If there's no explicit hint provided, mimic the same thing that would happen\n        // in the minimal itself to create a consistent behavior.\n        // We don't do this in the client, as it's the lowest level API, and doing this,\n        // would prevent user from having full control over direct calls.\n        if (!hint) {\n            var syntheticException = void 0;\n            try {\n                throw new Error('Sentry syntheticException');\n            }\n            catch (exception) {\n                syntheticException = exception;\n            }\n            finalHint = {\n                originalException: exception,\n                syntheticException: syntheticException,\n            };\n        }\n        this._invokeClient('captureException', exception, __assign(__assign({}, finalHint), { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureMessage = function (message, level, hint) {\n        var eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n        var finalHint = hint;\n        // If there's no explicit hint provided, mimic the same thing that would happen\n        // in the minimal itself to create a consistent behavior.\n        // We don't do this in the client, as it's the lowest level API, and doing this,\n        // would prevent user from having full control over direct calls.\n        if (!hint) {\n            var syntheticException = void 0;\n            try {\n                throw new Error(message);\n            }\n            catch (exception) {\n                syntheticException = exception;\n            }\n            finalHint = {\n                originalException: message,\n                syntheticException: syntheticException,\n            };\n        }\n        this._invokeClient('captureMessage', message, level, __assign(__assign({}, finalHint), { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureEvent = function (event, hint) {\n        var eventId = hint && hint.event_id ? hint.event_id : uuid4();\n        if (event.type !== 'transaction') {\n            this._lastEventId = eventId;\n        }\n        this._invokeClient('captureEvent', event, __assign(__assign({}, hint), { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.lastEventId = function () {\n        return this._lastEventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        if (!scope || !client)\n            return;\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _b = (client.getOptions && client.getOptions()) || {}, _c = _b.beforeBreadcrumb, beforeBreadcrumb = _c === void 0 ? null : _c, _d = _b.maxBreadcrumbs, maxBreadcrumbs = _d === void 0 ? DEFAULT_BREADCRUMBS : _d;\n        if (maxBreadcrumbs <= 0)\n            return;\n        var timestamp = dateTimestampInSeconds();\n        var mergedBreadcrumb = __assign({ timestamp: timestamp }, breadcrumb);\n        var finalBreadcrumb = beforeBreadcrumb\n            ? consoleSandbox(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })\n            : mergedBreadcrumb;\n        if (finalBreadcrumb === null)\n            return;\n        scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setUser = function (user) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setUser(user);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setTags = function (tags) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setTags(tags);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setExtras = function (extras) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setExtras(extras);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setTag = function (key, value) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setTag(key, value);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setExtra = function (key, extra) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setExtra(key, extra);\n    };\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Hub.prototype.setContext = function (name, context) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setContext(name, context);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.configureScope = function (callback) {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        if (scope && client) {\n            callback(scope);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.run = function (callback) {\n        var oldHub = makeMain(this);\n        try {\n            callback(this);\n        }\n        finally {\n            makeMain(oldHub);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.getIntegration = function (integration) {\n        var client = this.getClient();\n        if (!client)\n            return null;\n        try {\n            return client.getIntegration(integration);\n        }\n        catch (_oO) {\n            IS_DEBUG_BUILD && logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n            return null;\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startSpan = function (context) {\n        return this._callExtensionMethod('startSpan', context);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startTransaction = function (context, customSamplingContext) {\n        return this._callExtensionMethod('startTransaction', context, customSamplingContext);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.traceHeaders = function () {\n        return this._callExtensionMethod('traceHeaders');\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureSession = function (endSession) {\n        if (endSession === void 0) { endSession = false; }\n        // both send the update and pull the session from the scope\n        if (endSession) {\n            return this.endSession();\n        }\n        // only send the update\n        this._sendSessionUpdate();\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.endSession = function () {\n        var layer = this.getStackTop();\n        var scope = layer && layer.scope;\n        var session = scope && scope.getSession();\n        if (session) {\n            session.close();\n        }\n        this._sendSessionUpdate();\n        // the session is over; take it off of the scope\n        if (scope) {\n            scope.setSession();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startSession = function (context) {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        var _b = (client && client.getOptions()) || {}, release = _b.release, environment = _b.environment;\n        // Will fetch userAgent if called from browser sdk\n        var global = getGlobalObject();\n        var userAgent = (global.navigator || {}).userAgent;\n        var session = new Session(__assign(__assign(__assign({ release: release,\n            environment: environment }, (scope && { user: scope.getUser() })), (userAgent && { userAgent: userAgent })), context));\n        if (scope) {\n            // End existing session if there's one\n            var currentSession = scope.getSession && scope.getSession();\n            if (currentSession && currentSession.status === 'ok') {\n                currentSession.update({ status: 'exited' });\n            }\n            this.endSession();\n            // Afterwards we set the new session on the scope\n            scope.setSession(session);\n        }\n        return session;\n    };\n    /**\n     * Sends the current Session on the scope\n     */\n    Hub.prototype._sendSessionUpdate = function () {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        if (!scope)\n            return;\n        var session = scope.getSession && scope.getSession();\n        if (session) {\n            if (client && client.captureSession) {\n                client.captureSession(session);\n            }\n        }\n    };\n    /**\n     * Internal helper function to call a method on the top client if it exists.\n     *\n     * @param method The method to call on the client.\n     * @param args Arguments to pass to the client function.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Hub.prototype._invokeClient = function (method) {\n        var _a;\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var _b = this.getStackTop(), scope = _b.scope, client = _b.client;\n        if (client && client[method]) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n            (_a = client)[method].apply(_a, __spread(args, [scope]));\n        }\n    };\n    /**\n     * Calls global extension method and binding current instance to the function call\n     */\n    // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Hub.prototype._callExtensionMethod = function (method) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var carrier = getMainCarrier();\n        var sentry = carrier.__SENTRY__;\n        if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n            return sentry.extensions[method].apply(this, args);\n        }\n        IS_DEBUG_BUILD && logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n    };\n    return Hub;\n}());\nexport { Hub };\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nexport function getMainCarrier() {\n    var carrier = getGlobalObject();\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {\n        extensions: {},\n        hub: undefined,\n    };\n    return carrier;\n}\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub) {\n    var registry = getMainCarrier();\n    var oldHub = getHubFromCarrier(registry);\n    setHubOnCarrier(registry, hub);\n    return oldHub;\n}\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub() {\n    // Get main carrier (global for every environment)\n    var registry = getMainCarrier();\n    // If there's no hub, or its an old API, assign a new one\n    if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n        setHubOnCarrier(registry, new Hub());\n    }\n    // Prefer domains over global if they are there (applicable only to Node environment)\n    if (isNodeEnv()) {\n        return getHubFromActiveDomain(registry);\n    }\n    // Return hub that lives on a global object\n    return getHubFromCarrier(registry);\n}\n/**\n * Returns the active domain, if one exists\n * @deprecated No longer used; remove in v7\n * @returns The domain, or undefined if there is no active domain\n */\n// eslint-disable-next-line deprecation/deprecation\nexport function getActiveDomain() {\n    IS_DEBUG_BUILD && logger.warn('Function `getActiveDomain` is deprecated and will be removed in a future version.');\n    var sentry = getMainCarrier().__SENTRY__;\n    return sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n}\n/**\n * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry) {\n    try {\n        var sentry = getMainCarrier().__SENTRY__;\n        var activeDomain = sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n        // If there's no active domain, just return global hub\n        if (!activeDomain) {\n            return getHubFromCarrier(registry);\n        }\n        // If there's no hub on current domain, or it's an old API, assign a new one\n        if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n            var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n            setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n        }\n        // Return hub that lives on a domain\n        return getHubFromCarrier(activeDomain);\n    }\n    catch (_Oo) {\n        // Return hub that lives on a global object\n        return getHubFromCarrier(registry);\n    }\n}\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n    return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\n}\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier) {\n    return getGlobalSingleton('hub', function () { return new Hub(); }, carrier);\n}\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n * @returns A boolean indicating success or failure\n */\nexport function setHubOnCarrier(carrier, hub) {\n    if (!carrier)\n        return false;\n    var __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n    __SENTRY__.hub = hub;\n    return true;\n}\n//# sourceMappingURL=hub.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { dateTimestampInSeconds, getGlobalSingleton, isPlainObject, isThenable, SyncPromise } from '@sentry/utils';\n/**\n * Absolute maximum number of breadcrumbs added to an event.\n * The `maxBreadcrumbs` option cannot be higher than this value.\n */\nvar MAX_BREADCRUMBS = 100;\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nvar Scope = /** @class */ (function () {\n    function Scope() {\n        /** Flag if notifying is happening. */\n        this._notifyingListeners = false;\n        /** Callback for client to receive scope changes. */\n        this._scopeListeners = [];\n        /** Callback list that will be called after {@link applyToEvent}. */\n        this._eventProcessors = [];\n        /** Array of breadcrumbs. */\n        this._breadcrumbs = [];\n        /** User */\n        this._user = {};\n        /** Tags */\n        this._tags = {};\n        /** Extra */\n        this._extra = {};\n        /** Contexts */\n        this._contexts = {};\n        /**\n         * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n         * sent to Sentry\n         */\n        this._sdkProcessingMetadata = {};\n    }\n    /**\n     * Inherit values from the parent scope.\n     * @param scope to clone.\n     */\n    Scope.clone = function (scope) {\n        var newScope = new Scope();\n        if (scope) {\n            newScope._breadcrumbs = __spread(scope._breadcrumbs);\n            newScope._tags = __assign({}, scope._tags);\n            newScope._extra = __assign({}, scope._extra);\n            newScope._contexts = __assign({}, scope._contexts);\n            newScope._user = scope._user;\n            newScope._level = scope._level;\n            newScope._span = scope._span;\n            newScope._session = scope._session;\n            newScope._transactionName = scope._transactionName;\n            newScope._fingerprint = scope._fingerprint;\n            newScope._eventProcessors = __spread(scope._eventProcessors);\n            newScope._requestSession = scope._requestSession;\n        }\n        return newScope;\n    };\n    /**\n     * Add internal on change listener. Used for sub SDKs that need to store the scope.\n     * @hidden\n     */\n    Scope.prototype.addScopeListener = function (callback) {\n        this._scopeListeners.push(callback);\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.addEventProcessor = function (callback) {\n        this._eventProcessors.push(callback);\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setUser = function (user) {\n        this._user = user || {};\n        if (this._session) {\n            this._session.update({ user: user });\n        }\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getUser = function () {\n        return this._user;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getRequestSession = function () {\n        return this._requestSession;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setRequestSession = function (requestSession) {\n        this._requestSession = requestSession;\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTags = function (tags) {\n        this._tags = __assign(__assign({}, this._tags), tags);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTag = function (key, value) {\n        var _a;\n        this._tags = __assign(__assign({}, this._tags), (_a = {}, _a[key] = value, _a));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setExtras = function (extras) {\n        this._extra = __assign(__assign({}, this._extra), extras);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setExtra = function (key, extra) {\n        var _a;\n        this._extra = __assign(__assign({}, this._extra), (_a = {}, _a[key] = extra, _a));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setFingerprint = function (fingerprint) {\n        this._fingerprint = fingerprint;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setLevel = function (level) {\n        this._level = level;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTransactionName = function (name) {\n        this._transactionName = name;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * Can be removed in major version.\n     * @deprecated in favor of {@link this.setTransactionName}\n     */\n    Scope.prototype.setTransaction = function (name) {\n        return this.setTransactionName(name);\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setContext = function (key, context) {\n        var _a;\n        if (context === null) {\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete this._contexts[key];\n        }\n        else {\n            this._contexts = __assign(__assign({}, this._contexts), (_a = {}, _a[key] = context, _a));\n        }\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setSpan = function (span) {\n        this._span = span;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getSpan = function () {\n        return this._span;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getTransaction = function () {\n        // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will\n        // have a pointer to the currently-active transaction.\n        var span = this.getSpan();\n        return span && span.transaction;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setSession = function (session) {\n        if (!session) {\n            delete this._session;\n        }\n        else {\n            this._session = session;\n        }\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getSession = function () {\n        return this._session;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.update = function (captureContext) {\n        if (!captureContext) {\n            return this;\n        }\n        if (typeof captureContext === 'function') {\n            var updatedScope = captureContext(this);\n            return updatedScope instanceof Scope ? updatedScope : this;\n        }\n        if (captureContext instanceof Scope) {\n            this._tags = __assign(__assign({}, this._tags), captureContext._tags);\n            this._extra = __assign(__assign({}, this._extra), captureContext._extra);\n            this._contexts = __assign(__assign({}, this._contexts), captureContext._contexts);\n            if (captureContext._user && Object.keys(captureContext._user).length) {\n                this._user = captureContext._user;\n            }\n            if (captureContext._level) {\n                this._level = captureContext._level;\n            }\n            if (captureContext._fingerprint) {\n                this._fingerprint = captureContext._fingerprint;\n            }\n            if (captureContext._requestSession) {\n                this._requestSession = captureContext._requestSession;\n            }\n        }\n        else if (isPlainObject(captureContext)) {\n            // eslint-disable-next-line no-param-reassign\n            captureContext = captureContext;\n            this._tags = __assign(__assign({}, this._tags), captureContext.tags);\n            this._extra = __assign(__assign({}, this._extra), captureContext.extra);\n            this._contexts = __assign(__assign({}, this._contexts), captureContext.contexts);\n            if (captureContext.user) {\n                this._user = captureContext.user;\n            }\n            if (captureContext.level) {\n                this._level = captureContext.level;\n            }\n            if (captureContext.fingerprint) {\n                this._fingerprint = captureContext.fingerprint;\n            }\n            if (captureContext.requestSession) {\n                this._requestSession = captureContext.requestSession;\n            }\n        }\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.clear = function () {\n        this._breadcrumbs = [];\n        this._tags = {};\n        this._extra = {};\n        this._user = {};\n        this._contexts = {};\n        this._level = undefined;\n        this._transactionName = undefined;\n        this._fingerprint = undefined;\n        this._requestSession = undefined;\n        this._span = undefined;\n        this._session = undefined;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n        var maxCrumbs = typeof maxBreadcrumbs === 'number' ? Math.min(maxBreadcrumbs, MAX_BREADCRUMBS) : MAX_BREADCRUMBS;\n        // No data has been changed, so don't notify scope listeners\n        if (maxCrumbs <= 0) {\n            return this;\n        }\n        var mergedBreadcrumb = __assign({ timestamp: dateTimestampInSeconds() }, breadcrumb);\n        this._breadcrumbs = __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxCrumbs);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.clearBreadcrumbs = function () {\n        this._breadcrumbs = [];\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * Applies the current context and fingerprint to the event.\n     * Note that breadcrumbs will be added by the client.\n     * Also if the event has already breadcrumbs on it, we do not merge them.\n     * @param event Event\n     * @param hint May contain additional information about the original exception.\n     * @hidden\n     */\n    Scope.prototype.applyToEvent = function (event, hint) {\n        if (this._extra && Object.keys(this._extra).length) {\n            event.extra = __assign(__assign({}, this._extra), event.extra);\n        }\n        if (this._tags && Object.keys(this._tags).length) {\n            event.tags = __assign(__assign({}, this._tags), event.tags);\n        }\n        if (this._user && Object.keys(this._user).length) {\n            event.user = __assign(__assign({}, this._user), event.user);\n        }\n        if (this._contexts && Object.keys(this._contexts).length) {\n            event.contexts = __assign(__assign({}, this._contexts), event.contexts);\n        }\n        if (this._level) {\n            event.level = this._level;\n        }\n        if (this._transactionName) {\n            event.transaction = this._transactionName;\n        }\n        // We want to set the trace context for normal events only if there isn't already\n        // a trace context on the event. There is a product feature in place where we link\n        // errors with transaction and it relies on that.\n        if (this._span) {\n            event.contexts = __assign({ trace: this._span.getTraceContext() }, event.contexts);\n            var transactionName = this._span.transaction && this._span.transaction.name;\n            if (transactionName) {\n                event.tags = __assign({ transaction: transactionName }, event.tags);\n            }\n        }\n        this._applyFingerprint(event);\n        event.breadcrumbs = __spread((event.breadcrumbs || []), this._breadcrumbs);\n        event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n        event.sdkProcessingMetadata = this._sdkProcessingMetadata;\n        return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n    };\n    /**\n     * Add data which will be accessible during event processing but won't get sent to Sentry\n     */\n    Scope.prototype.setSDKProcessingMetadata = function (newData) {\n        this._sdkProcessingMetadata = __assign(__assign({}, this._sdkProcessingMetadata), newData);\n        return this;\n    };\n    /**\n     * This will be called after {@link applyToEvent} is finished.\n     */\n    Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n        var _this = this;\n        if (index === void 0) { index = 0; }\n        return new SyncPromise(function (resolve, reject) {\n            var processor = processors[index];\n            if (event === null || typeof processor !== 'function') {\n                resolve(event);\n            }\n            else {\n                var result = processor(__assign({}, event), hint);\n                if (isThenable(result)) {\n                    void result\n                        .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })\n                        .then(null, reject);\n                }\n                else {\n                    void _this._notifyEventProcessors(processors, result, hint, index + 1)\n                        .then(resolve)\n                        .then(null, reject);\n                }\n            }\n        });\n    };\n    /**\n     * This will be called on every set call.\n     */\n    Scope.prototype._notifyScopeListeners = function () {\n        var _this = this;\n        // We need this check for this._notifyingListeners to be able to work on scope during updates\n        // If this check is not here we'll produce endless recursion when something is done with the scope\n        // during the callback.\n        if (!this._notifyingListeners) {\n            this._notifyingListeners = true;\n            this._scopeListeners.forEach(function (callback) {\n                callback(_this);\n            });\n            this._notifyingListeners = false;\n        }\n    };\n    /**\n     * Applies fingerprint from the scope to the event if there's one,\n     * uses message if there's one instead or get rid of empty fingerprint\n     */\n    Scope.prototype._applyFingerprint = function (event) {\n        // Make sure it's an array first and we actually have something in place\n        event.fingerprint = event.fingerprint\n            ? Array.isArray(event.fingerprint)\n                ? event.fingerprint\n                : [event.fingerprint]\n            : [];\n        // If we have something on the scope, then merge it with event\n        if (this._fingerprint) {\n            event.fingerprint = event.fingerprint.concat(this._fingerprint);\n        }\n        // If we have no data at all, remove empty array default\n        if (event.fingerprint && !event.fingerprint.length) {\n            delete event.fingerprint;\n        }\n    };\n    return Scope;\n}());\nexport { Scope };\n/**\n * Returns the global event processors.\n */\nfunction getGlobalEventProcessors() {\n    return getGlobalSingleton('globalEventProcessors', function () { return []; });\n}\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback) {\n    getGlobalEventProcessors().push(callback);\n}\n//# sourceMappingURL=scope.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __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\nexport function __read(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\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","// Store finish reasons in tuple to save on bundle size\n// Readonly type should enforce that this is not mutated.\nexport var FINISH_REASON_TAG = 'finishReason';\nexport var IDLE_TRANSACTION_FINISH_REASONS = ['heartbeatFailed', 'idleTimeout', 'documentHidden'];\n//# sourceMappingURL=constants.js.map","/*\n * This file defines flags and constants that can be modified during compile time in order to facilitate tree shaking\n * for users.\n *\n * Debug flags need to be declared in each package individually and must not be imported across package boundaries,\n * because some build tools have trouble tree-shaking imported guards.\n *\n * As a convention, we define debug flags in a `flags.ts` file in the root of a package's `src` folder.\n *\n * Debug flag files will contain \"magic strings\" like `__SENTRY_DEBUG__` that may get replaced with actual values during\n * our, or the user's build process. Take care when introducing new flags - they must not throw if they are not\n * replaced.\n */\n/** Flag that is true for debug builds, false otherwise. */\nexport var IS_DEBUG_BUILD = typeof __SENTRY_DEBUG__ === 'undefined' ? true : __SENTRY_DEBUG__;\n//# sourceMappingURL=flags.js.map","import { addInstrumentationHandler, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { getActiveTransaction } from './utils';\n/**\n * Configures global error listeners\n */\nexport function registerErrorInstrumentation() {\n    addInstrumentationHandler('error', errorCallback);\n    addInstrumentationHandler('unhandledrejection', errorCallback);\n}\n/**\n * If an error or unhandled promise occurs, we mark the active transaction as failed\n */\nfunction errorCallback() {\n    var activeTransaction = getActiveTransaction();\n    if (activeTransaction) {\n        var status_1 = 'internal_error';\n        IS_DEBUG_BUILD && logger.log(\"[Tracing] Transaction: \" + status_1 + \" -> Global error occured\");\n        activeTransaction.setStatus(status_1);\n    }\n}\n//# sourceMappingURL=errors.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { getMainCarrier } from '@sentry/hub';\nimport { dynamicRequire, isNaN, isNodeEnv, loadModule, logger } from '@sentry/utils';\nimport { registerErrorInstrumentation } from './errors';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { IdleTransaction } from './idletransaction';\nimport { Transaction } from './transaction';\nimport { hasTracingEnabled } from './utils';\n/** Returns all trace headers that are currently on the top scope. */\nfunction traceHeaders() {\n    var scope = this.getScope();\n    if (scope) {\n        var span = scope.getSpan();\n        if (span) {\n            return {\n                'sentry-trace': span.toTraceparent(),\n            };\n        }\n    }\n    return {};\n}\n/**\n * Makes a sampling decision for the given transaction and stores it on the transaction.\n *\n * Called every time a transaction is created. Only transactions which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n *\n * @param transaction: The transaction needing a sampling decision\n * @param options: The current client's options, so we can access `tracesSampleRate` and/or `tracesSampler`\n * @param samplingContext: Default and user-provided data which may be used to help make the decision\n *\n * @returns The given transaction with its `sampled` value set\n */\nfunction sample(transaction, options, samplingContext) {\n    // nothing to do if tracing is not enabled\n    if (!hasTracingEnabled(options)) {\n        transaction.sampled = false;\n        return transaction;\n    }\n    // if the user has forced a sampling decision by passing a `sampled` value in their transaction context, go with that\n    if (transaction.sampled !== undefined) {\n        transaction.setMetadata({\n            transactionSampling: { method: 'explicitly_set' },\n        });\n        return transaction;\n    }\n    // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` were defined, so one of these should\n    // work; prefer the hook if so\n    var sampleRate;\n    if (typeof options.tracesSampler === 'function') {\n        sampleRate = options.tracesSampler(samplingContext);\n        transaction.setMetadata({\n            transactionSampling: {\n                method: 'client_sampler',\n                // cast to number in case it's a boolean\n                rate: Number(sampleRate),\n            },\n        });\n    }\n    else if (samplingContext.parentSampled !== undefined) {\n        sampleRate = samplingContext.parentSampled;\n        transaction.setMetadata({\n            transactionSampling: { method: 'inheritance' },\n        });\n    }\n    else {\n        sampleRate = options.tracesSampleRate;\n        transaction.setMetadata({\n            transactionSampling: {\n                method: 'client_rate',\n                // cast to number in case it's a boolean\n                rate: Number(sampleRate),\n            },\n        });\n    }\n    // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n    // only valid values are booleans or numbers between 0 and 1.)\n    if (!isValidSampleRate(sampleRate)) {\n        IS_DEBUG_BUILD && logger.warn('[Tracing] Discarding transaction because of invalid sample rate.');\n        transaction.sampled = false;\n        return transaction;\n    }\n    // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped\n    if (!sampleRate) {\n        IS_DEBUG_BUILD &&\n            logger.log(\"[Tracing] Discarding transaction because \" + (typeof options.tracesSampler === 'function'\n                ? 'tracesSampler returned 0 or false'\n                : 'a negative sampling decision was inherited or tracesSampleRate is set to 0'));\n        transaction.sampled = false;\n        return transaction;\n    }\n    // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n    // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n    transaction.sampled = Math.random() < sampleRate;\n    // if we're not going to keep it, we're done\n    if (!transaction.sampled) {\n        IS_DEBUG_BUILD &&\n            logger.log(\"[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = \" + Number(sampleRate) + \")\");\n        return transaction;\n    }\n    IS_DEBUG_BUILD && logger.log(\"[Tracing] starting \" + transaction.op + \" transaction - \" + transaction.name);\n    return transaction;\n}\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\nfunction isValidSampleRate(rate) {\n    // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    if (isNaN(rate) || !(typeof rate === 'number' || typeof rate === 'boolean')) {\n        IS_DEBUG_BUILD &&\n            logger.warn(\"[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got \" + JSON.stringify(rate) + \" of type \" + JSON.stringify(typeof rate) + \".\");\n        return false;\n    }\n    // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false\n    if (rate < 0 || rate > 1) {\n        IS_DEBUG_BUILD &&\n            logger.warn(\"[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got \" + rate + \".\");\n        return false;\n    }\n    return true;\n}\n/**\n * Creates a new transaction and adds a sampling decision if it doesn't yet have one.\n *\n * The Hub.startTransaction method delegates to this method to do its work, passing the Hub instance in as `this`, as if\n * it had been called on the hub directly. Exists as a separate function so that it can be injected into the class as an\n * \"extension method.\"\n *\n * @param this: The Hub starting the transaction\n * @param transactionContext: Data used to configure the transaction\n * @param CustomSamplingContext: Optional data to be provided to the `tracesSampler` function (if any)\n *\n * @returns The new transaction\n *\n * @see {@link Hub.startTransaction}\n */\nfunction _startTransaction(transactionContext, customSamplingContext) {\n    var client = this.getClient();\n    var options = (client && client.getOptions()) || {};\n    var transaction = new Transaction(transactionContext, this);\n    transaction = sample(transaction, options, __assign({ parentSampled: transactionContext.parentSampled, transactionContext: transactionContext }, customSamplingContext));\n    if (transaction.sampled) {\n        transaction.initSpanRecorder(options._experiments && options._experiments.maxSpans);\n    }\n    return transaction;\n}\n/**\n * Create new idle transaction.\n */\nexport function startIdleTransaction(hub, transactionContext, idleTimeout, onScope, customSamplingContext) {\n    var client = hub.getClient();\n    var options = (client && client.getOptions()) || {};\n    var transaction = new IdleTransaction(transactionContext, hub, idleTimeout, onScope);\n    transaction = sample(transaction, options, __assign({ parentSampled: transactionContext.parentSampled, transactionContext: transactionContext }, customSamplingContext));\n    if (transaction.sampled) {\n        transaction.initSpanRecorder(options._experiments && options._experiments.maxSpans);\n    }\n    return transaction;\n}\n/**\n * @private\n */\nexport function _addTracingExtensions() {\n    var carrier = getMainCarrier();\n    if (!carrier.__SENTRY__) {\n        return;\n    }\n    carrier.__SENTRY__.extensions = carrier.__SENTRY__.extensions || {};\n    if (!carrier.__SENTRY__.extensions.startTransaction) {\n        carrier.__SENTRY__.extensions.startTransaction = _startTransaction;\n    }\n    if (!carrier.__SENTRY__.extensions.traceHeaders) {\n        carrier.__SENTRY__.extensions.traceHeaders = traceHeaders;\n    }\n}\n/**\n * @private\n */\nfunction _autoloadDatabaseIntegrations() {\n    var carrier = getMainCarrier();\n    if (!carrier.__SENTRY__) {\n        return;\n    }\n    var packageToIntegrationMapping = {\n        mongodb: function () {\n            var integration = dynamicRequire(module, './integrations/node/mongo');\n            return new integration.Mongo();\n        },\n        mongoose: function () {\n            var integration = dynamicRequire(module, './integrations/node/mongo');\n            return new integration.Mongo({ mongoose: true });\n        },\n        mysql: function () {\n            var integration = dynamicRequire(module, './integrations/node/mysql');\n            return new integration.Mysql();\n        },\n        pg: function () {\n            var integration = dynamicRequire(module, './integrations/node/postgres');\n            return new integration.Postgres();\n        },\n    };\n    var mappedPackages = Object.keys(packageToIntegrationMapping)\n        .filter(function (moduleName) { return !!loadModule(moduleName); })\n        .map(function (pkg) {\n        try {\n            return packageToIntegrationMapping[pkg]();\n        }\n        catch (e) {\n            return undefined;\n        }\n    })\n        .filter(function (p) { return p; });\n    if (mappedPackages.length > 0) {\n        carrier.__SENTRY__.integrations = __spread((carrier.__SENTRY__.integrations || []), mappedPackages);\n    }\n}\n/**\n * This patches the global object and injects the Tracing extensions methods\n */\nexport function addExtensionMethods() {\n    _addTracingExtensions();\n    // Detect and automatically load specified integrations.\n    if (isNodeEnv()) {\n        _autoloadDatabaseIntegrations();\n    }\n    // If an error happens globally, we should make sure transaction status is set to error.\n    registerErrorInstrumentation();\n}\n//# sourceMappingURL=hubextensions.js.map","import { __extends, __values } from \"tslib\";\nimport { logger, timestampWithMs } from '@sentry/utils';\nimport { FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS } from './constants';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { SpanRecorder } from './span';\nimport { Transaction } from './transaction';\nexport var DEFAULT_IDLE_TIMEOUT = 1000;\nexport var HEARTBEAT_INTERVAL = 5000;\n/**\n * @inheritDoc\n */\nvar IdleTransactionSpanRecorder = /** @class */ (function (_super) {\n    __extends(IdleTransactionSpanRecorder, _super);\n    function IdleTransactionSpanRecorder(_pushActivity, _popActivity, transactionSpanId, maxlen) {\n        if (transactionSpanId === void 0) { transactionSpanId = ''; }\n        var _this = _super.call(this, maxlen) || this;\n        _this._pushActivity = _pushActivity;\n        _this._popActivity = _popActivity;\n        _this.transactionSpanId = transactionSpanId;\n        return _this;\n    }\n    /**\n     * @inheritDoc\n     */\n    IdleTransactionSpanRecorder.prototype.add = function (span) {\n        var _this = this;\n        // We should make sure we do not push and pop activities for\n        // the transaction that this span recorder belongs to.\n        if (span.spanId !== this.transactionSpanId) {\n            // We patch span.finish() to pop an activity after setting an endTimestamp.\n            span.finish = function (endTimestamp) {\n                span.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : timestampWithMs();\n                _this._popActivity(span.spanId);\n            };\n            // We should only push new activities if the span does not have an end timestamp.\n            if (span.endTimestamp === undefined) {\n                this._pushActivity(span.spanId);\n            }\n        }\n        _super.prototype.add.call(this, span);\n    };\n    return IdleTransactionSpanRecorder;\n}(SpanRecorder));\nexport { IdleTransactionSpanRecorder };\n/**\n * An IdleTransaction is a transaction that automatically finishes. It does this by tracking child spans as activities.\n * You can have multiple IdleTransactions active, but if the `onScope` option is specified, the idle transaction will\n * put itself on the scope on creation.\n */\nvar IdleTransaction = /** @class */ (function (_super) {\n    __extends(IdleTransaction, _super);\n    function IdleTransaction(transactionContext, _idleHub, \n    /**\n     * The time to wait in ms until the idle transaction will be finished.\n     * @default 1000\n     */\n    _idleTimeout, \n    // Whether or not the transaction should put itself on the scope when it starts and pop itself off when it ends\n    _onScope) {\n        if (_idleTimeout === void 0) { _idleTimeout = DEFAULT_IDLE_TIMEOUT; }\n        if (_onScope === void 0) { _onScope = false; }\n        var _this = _super.call(this, transactionContext, _idleHub) || this;\n        _this._idleHub = _idleHub;\n        _this._idleTimeout = _idleTimeout;\n        _this._onScope = _onScope;\n        // Activities store a list of active spans\n        _this.activities = {};\n        // Amount of times heartbeat has counted. Will cause transaction to finish after 3 beats.\n        _this._heartbeatCounter = 0;\n        // We should not use heartbeat if we finished a transaction\n        _this._finished = false;\n        _this._beforeFinishCallbacks = [];\n        if (_idleHub && _onScope) {\n            // There should only be one active transaction on the scope\n            clearActiveTransaction(_idleHub);\n            // We set the transaction here on the scope so error events pick up the trace\n            // context and attach it to the error.\n            IS_DEBUG_BUILD && logger.log(\"Setting idle transaction on scope. Span ID: \" + _this.spanId);\n            _idleHub.configureScope(function (scope) { return scope.setSpan(_this); });\n        }\n        _this._initTimeout = setTimeout(function () {\n            if (!_this._finished) {\n                _this.finish();\n            }\n        }, _this._idleTimeout);\n        return _this;\n    }\n    /** {@inheritDoc} */\n    IdleTransaction.prototype.finish = function (endTimestamp) {\n        var e_1, _a;\n        var _this = this;\n        if (endTimestamp === void 0) { endTimestamp = timestampWithMs(); }\n        this._finished = true;\n        this.activities = {};\n        if (this.spanRecorder) {\n            IS_DEBUG_BUILD &&\n                logger.log('[Tracing] finishing IdleTransaction', new Date(endTimestamp * 1000).toISOString(), this.op);\n            try {\n                for (var _b = __values(this._beforeFinishCallbacks), _c = _b.next(); !_c.done; _c = _b.next()) {\n                    var callback = _c.value;\n                    callback(this, endTimestamp);\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n            this.spanRecorder.spans = this.spanRecorder.spans.filter(function (span) {\n                // If we are dealing with the transaction itself, we just return it\n                if (span.spanId === _this.spanId) {\n                    return true;\n                }\n                // We cancel all pending spans with status \"cancelled\" to indicate the idle transaction was finished early\n                if (!span.endTimestamp) {\n                    span.endTimestamp = endTimestamp;\n                    span.setStatus('cancelled');\n                    IS_DEBUG_BUILD &&\n                        logger.log('[Tracing] cancelling span since transaction ended early', JSON.stringify(span, undefined, 2));\n                }\n                var keepSpan = span.startTimestamp < endTimestamp;\n                if (!keepSpan) {\n                    IS_DEBUG_BUILD &&\n                        logger.log('[Tracing] discarding Span since it happened after Transaction was finished', JSON.stringify(span, undefined, 2));\n                }\n                return keepSpan;\n            });\n            IS_DEBUG_BUILD && logger.log('[Tracing] flushing IdleTransaction');\n        }\n        else {\n            IS_DEBUG_BUILD && logger.log('[Tracing] No active IdleTransaction');\n        }\n        // if `this._onScope` is `true`, the transaction put itself on the scope when it started\n        if (this._onScope) {\n            clearActiveTransaction(this._idleHub);\n        }\n        return _super.prototype.finish.call(this, endTimestamp);\n    };\n    /**\n     * Register a callback function that gets excecuted before the transaction finishes.\n     * Useful for cleanup or if you want to add any additional spans based on current context.\n     *\n     * This is exposed because users have no other way of running something before an idle transaction\n     * finishes.\n     */\n    IdleTransaction.prototype.registerBeforeFinishCallback = function (callback) {\n        this._beforeFinishCallbacks.push(callback);\n    };\n    /**\n     * @inheritDoc\n     */\n    IdleTransaction.prototype.initSpanRecorder = function (maxlen) {\n        var _this = this;\n        if (!this.spanRecorder) {\n            var pushActivity = function (id) {\n                if (_this._finished) {\n                    return;\n                }\n                _this._pushActivity(id);\n            };\n            var popActivity = function (id) {\n                if (_this._finished) {\n                    return;\n                }\n                _this._popActivity(id);\n            };\n            this.spanRecorder = new IdleTransactionSpanRecorder(pushActivity, popActivity, this.spanId, maxlen);\n            // Start heartbeat so that transactions do not run forever.\n            IS_DEBUG_BUILD && logger.log('Starting heartbeat');\n            this._pingHeartbeat();\n        }\n        this.spanRecorder.add(this);\n    };\n    /**\n     * Start tracking a specific activity.\n     * @param spanId The span id that represents the activity\n     */\n    IdleTransaction.prototype._pushActivity = function (spanId) {\n        if (this._initTimeout) {\n            clearTimeout(this._initTimeout);\n            this._initTimeout = undefined;\n        }\n        IS_DEBUG_BUILD && logger.log(\"[Tracing] pushActivity: \" + spanId);\n        this.activities[spanId] = true;\n        IS_DEBUG_BUILD && logger.log('[Tracing] new activities count', Object.keys(this.activities).length);\n    };\n    /**\n     * Remove an activity from usage\n     * @param spanId The span id that represents the activity\n     */\n    IdleTransaction.prototype._popActivity = function (spanId) {\n        var _this = this;\n        if (this.activities[spanId]) {\n            IS_DEBUG_BUILD && logger.log(\"[Tracing] popActivity \" + spanId);\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete this.activities[spanId];\n            IS_DEBUG_BUILD && logger.log('[Tracing] new activities count', Object.keys(this.activities).length);\n        }\n        if (Object.keys(this.activities).length === 0) {\n            var timeout = this._idleTimeout;\n            // We need to add the timeout here to have the real endtimestamp of the transaction\n            // Remember timestampWithMs is in seconds, timeout is in ms\n            var end_1 = timestampWithMs() + timeout / 1000;\n            setTimeout(function () {\n                if (!_this._finished) {\n                    _this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[1]);\n                    _this.finish(end_1);\n                }\n            }, timeout);\n        }\n    };\n    /**\n     * Checks when entries of this.activities are not changing for 3 beats.\n     * If this occurs we finish the transaction.\n     */\n    IdleTransaction.prototype._beat = function () {\n        // We should not be running heartbeat if the idle transaction is finished.\n        if (this._finished) {\n            return;\n        }\n        var heartbeatString = Object.keys(this.activities).join('');\n        if (heartbeatString === this._prevHeartbeatString) {\n            this._heartbeatCounter += 1;\n        }\n        else {\n            this._heartbeatCounter = 1;\n        }\n        this._prevHeartbeatString = heartbeatString;\n        if (this._heartbeatCounter >= 3) {\n            IS_DEBUG_BUILD && logger.log('[Tracing] Transaction finished because of no change for 3 heart beats');\n            this.setStatus('deadline_exceeded');\n            this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[0]);\n            this.finish();\n        }\n        else {\n            this._pingHeartbeat();\n        }\n    };\n    /**\n     * Pings the heartbeat\n     */\n    IdleTransaction.prototype._pingHeartbeat = function () {\n        var _this = this;\n        IS_DEBUG_BUILD && logger.log(\"pinging Heartbeat -> current counter: \" + this._heartbeatCounter);\n        setTimeout(function () {\n            _this._beat();\n        }, HEARTBEAT_INTERVAL);\n    };\n    return IdleTransaction;\n}(Transaction));\nexport { IdleTransaction };\n/**\n * Reset transaction on scope to `undefined`\n */\nfunction clearActiveTransaction(hub) {\n    if (hub) {\n        var scope = hub.getScope();\n        if (scope) {\n            var transaction = scope.getTransaction();\n            if (transaction) {\n                scope.setSpan(undefined);\n            }\n        }\n    }\n}\n//# sourceMappingURL=idletransaction.js.map","import { __assign } from \"tslib\";\nimport { dropUndefinedKeys, timestampWithMs, uuid4 } from '@sentry/utils';\n/**\n * Keeps track of finished spans for a given transaction\n * @internal\n * @hideconstructor\n * @hidden\n */\nvar SpanRecorder = /** @class */ (function () {\n    function SpanRecorder(maxlen) {\n        if (maxlen === void 0) { maxlen = 1000; }\n        this.spans = [];\n        this._maxlen = maxlen;\n    }\n    /**\n     * This is just so that we don't run out of memory while recording a lot\n     * of spans. At some point we just stop and flush out the start of the\n     * trace tree (i.e.the first n spans with the smallest\n     * start_timestamp).\n     */\n    SpanRecorder.prototype.add = function (span) {\n        if (this.spans.length > this._maxlen) {\n            span.spanRecorder = undefined;\n        }\n        else {\n            this.spans.push(span);\n        }\n    };\n    return SpanRecorder;\n}());\nexport { SpanRecorder };\n/**\n * Span contains all data about a span\n */\nvar Span = /** @class */ (function () {\n    /**\n     * You should never call the constructor manually, always use `Sentry.startTransaction()`\n     * or call `startChild()` on an existing span.\n     * @internal\n     * @hideconstructor\n     * @hidden\n     */\n    function Span(spanContext) {\n        /**\n         * @inheritDoc\n         */\n        this.traceId = uuid4();\n        /**\n         * @inheritDoc\n         */\n        this.spanId = uuid4().substring(16);\n        /**\n         * Timestamp in seconds when the span was created.\n         */\n        this.startTimestamp = timestampWithMs();\n        /**\n         * @inheritDoc\n         */\n        this.tags = {};\n        /**\n         * @inheritDoc\n         */\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        this.data = {};\n        if (!spanContext) {\n            return this;\n        }\n        if (spanContext.traceId) {\n            this.traceId = spanContext.traceId;\n        }\n        if (spanContext.spanId) {\n            this.spanId = spanContext.spanId;\n        }\n        if (spanContext.parentSpanId) {\n            this.parentSpanId = spanContext.parentSpanId;\n        }\n        // We want to include booleans as well here\n        if ('sampled' in spanContext) {\n            this.sampled = spanContext.sampled;\n        }\n        if (spanContext.op) {\n            this.op = spanContext.op;\n        }\n        if (spanContext.description) {\n            this.description = spanContext.description;\n        }\n        if (spanContext.data) {\n            this.data = spanContext.data;\n        }\n        if (spanContext.tags) {\n            this.tags = spanContext.tags;\n        }\n        if (spanContext.status) {\n            this.status = spanContext.status;\n        }\n        if (spanContext.startTimestamp) {\n            this.startTimestamp = spanContext.startTimestamp;\n        }\n        if (spanContext.endTimestamp) {\n            this.endTimestamp = spanContext.endTimestamp;\n        }\n    }\n    /**\n     * @inheritDoc\n     * @deprecated\n     */\n    Span.prototype.child = function (spanContext) {\n        return this.startChild(spanContext);\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.startChild = function (spanContext) {\n        var childSpan = new Span(__assign(__assign({}, spanContext), { parentSpanId: this.spanId, sampled: this.sampled, traceId: this.traceId }));\n        childSpan.spanRecorder = this.spanRecorder;\n        if (childSpan.spanRecorder) {\n            childSpan.spanRecorder.add(childSpan);\n        }\n        childSpan.transaction = this.transaction;\n        return childSpan;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.setTag = function (key, value) {\n        var _a;\n        this.tags = __assign(__assign({}, this.tags), (_a = {}, _a[key] = value, _a));\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    Span.prototype.setData = function (key, value) {\n        var _a;\n        this.data = __assign(__assign({}, this.data), (_a = {}, _a[key] = value, _a));\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.setStatus = function (value) {\n        this.status = value;\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.setHttpStatus = function (httpStatus) {\n        this.setTag('http.status_code', String(httpStatus));\n        var spanStatus = spanStatusfromHttpCode(httpStatus);\n        if (spanStatus !== 'unknown_error') {\n            this.setStatus(spanStatus);\n        }\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.isSuccess = function () {\n        return this.status === 'ok';\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.finish = function (endTimestamp) {\n        this.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : timestampWithMs();\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.toTraceparent = function () {\n        var sampledString = '';\n        if (this.sampled !== undefined) {\n            sampledString = this.sampled ? '-1' : '-0';\n        }\n        return this.traceId + \"-\" + this.spanId + sampledString;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.toContext = function () {\n        return dropUndefinedKeys({\n            data: this.data,\n            description: this.description,\n            endTimestamp: this.endTimestamp,\n            op: this.op,\n            parentSpanId: this.parentSpanId,\n            sampled: this.sampled,\n            spanId: this.spanId,\n            startTimestamp: this.startTimestamp,\n            status: this.status,\n            tags: this.tags,\n            traceId: this.traceId,\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.updateWithContext = function (spanContext) {\n        var _a, _b, _c, _d, _e;\n        this.data = (_a = spanContext.data, (_a !== null && _a !== void 0 ? _a : {}));\n        this.description = spanContext.description;\n        this.endTimestamp = spanContext.endTimestamp;\n        this.op = spanContext.op;\n        this.parentSpanId = spanContext.parentSpanId;\n        this.sampled = spanContext.sampled;\n        this.spanId = (_b = spanContext.spanId, (_b !== null && _b !== void 0 ? _b : this.spanId));\n        this.startTimestamp = (_c = spanContext.startTimestamp, (_c !== null && _c !== void 0 ? _c : this.startTimestamp));\n        this.status = spanContext.status;\n        this.tags = (_d = spanContext.tags, (_d !== null && _d !== void 0 ? _d : {}));\n        this.traceId = (_e = spanContext.traceId, (_e !== null && _e !== void 0 ? _e : this.traceId));\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.getTraceContext = function () {\n        return dropUndefinedKeys({\n            data: Object.keys(this.data).length > 0 ? this.data : undefined,\n            description: this.description,\n            op: this.op,\n            parent_span_id: this.parentSpanId,\n            span_id: this.spanId,\n            status: this.status,\n            tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n            trace_id: this.traceId,\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.toJSON = function () {\n        return dropUndefinedKeys({\n            data: Object.keys(this.data).length > 0 ? this.data : undefined,\n            description: this.description,\n            op: this.op,\n            parent_span_id: this.parentSpanId,\n            span_id: this.spanId,\n            start_timestamp: this.startTimestamp,\n            status: this.status,\n            tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n            timestamp: this.endTimestamp,\n            trace_id: this.traceId,\n        });\n    };\n    return Span;\n}());\nexport { Span };\n/**\n * Converts a HTTP status code into a {@link SpanStatusType}.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or unknown_error.\n */\nexport function spanStatusfromHttpCode(httpStatus) {\n    if (httpStatus < 400 && httpStatus >= 100) {\n        return 'ok';\n    }\n    if (httpStatus >= 400 && httpStatus < 500) {\n        switch (httpStatus) {\n            case 401:\n                return 'unauthenticated';\n            case 403:\n                return 'permission_denied';\n            case 404:\n                return 'not_found';\n            case 409:\n                return 'already_exists';\n            case 413:\n                return 'failed_precondition';\n            case 429:\n                return 'resource_exhausted';\n            default:\n                return 'invalid_argument';\n        }\n    }\n    if (httpStatus >= 500 && httpStatus < 600) {\n        switch (httpStatus) {\n            case 501:\n                return 'unimplemented';\n            case 503:\n                return 'unavailable';\n            case 504:\n                return 'deadline_exceeded';\n            default:\n                return 'internal_error';\n        }\n    }\n    return 'unknown_error';\n}\n//# sourceMappingURL=span.js.map","import { __assign, __extends } from \"tslib\";\nimport { getCurrentHub, Hub } from '@sentry/hub';\nimport { dropUndefinedKeys, isInstanceOf, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { Span as SpanClass, SpanRecorder } from './span';\n/** JSDoc */\nvar Transaction = /** @class */ (function (_super) {\n    __extends(Transaction, _super);\n    /**\n     * This constructor should never be called manually. Those instrumenting tracing should use\n     * `Sentry.startTransaction()`, and internal methods should use `hub.startTransaction()`.\n     * @internal\n     * @hideconstructor\n     * @hidden\n     */\n    function Transaction(transactionContext, hub) {\n        var _this = _super.call(this, transactionContext) || this;\n        _this._measurements = {};\n        /**\n         * The reference to the current hub.\n         */\n        _this._hub = getCurrentHub();\n        if (isInstanceOf(hub, Hub)) {\n            _this._hub = hub;\n        }\n        _this.name = transactionContext.name || '';\n        _this.metadata = transactionContext.metadata || {};\n        _this._trimEnd = transactionContext.trimEnd;\n        // this is because transactions are also spans, and spans have a transaction pointer\n        _this.transaction = _this;\n        return _this;\n    }\n    /**\n     * JSDoc\n     */\n    Transaction.prototype.setName = function (name) {\n        this.name = name;\n    };\n    /**\n     * Attaches SpanRecorder to the span itself\n     * @param maxlen maximum number of spans that can be recorded\n     */\n    Transaction.prototype.initSpanRecorder = function (maxlen) {\n        if (maxlen === void 0) { maxlen = 1000; }\n        if (!this.spanRecorder) {\n            this.spanRecorder = new SpanRecorder(maxlen);\n        }\n        this.spanRecorder.add(this);\n    };\n    /**\n     * Set observed measurements for this transaction.\n     * @hidden\n     */\n    Transaction.prototype.setMeasurements = function (measurements) {\n        this._measurements = __assign({}, measurements);\n    };\n    /**\n     * Set metadata for this transaction.\n     * @hidden\n     */\n    Transaction.prototype.setMetadata = function (newMetadata) {\n        this.metadata = __assign(__assign({}, this.metadata), newMetadata);\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.finish = function (endTimestamp) {\n        var _this = this;\n        // This transaction is already finished, so we should not flush it again.\n        if (this.endTimestamp !== undefined) {\n            return undefined;\n        }\n        if (!this.name) {\n            IS_DEBUG_BUILD && logger.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n            this.name = '<unlabeled transaction>';\n        }\n        // just sets the end timestamp\n        _super.prototype.finish.call(this, endTimestamp);\n        if (this.sampled !== true) {\n            // At this point if `sampled !== true` we want to discard the transaction.\n            IS_DEBUG_BUILD && logger.log('[Tracing] Discarding transaction because its trace was not chosen to be sampled.');\n            var client = this._hub.getClient();\n            var transport = client && client.getTransport && client.getTransport();\n            if (transport && transport.recordLostEvent) {\n                transport.recordLostEvent('sample_rate', 'transaction');\n            }\n            return undefined;\n        }\n        var finishedSpans = this.spanRecorder ? this.spanRecorder.spans.filter(function (s) { return s !== _this && s.endTimestamp; }) : [];\n        if (this._trimEnd && finishedSpans.length > 0) {\n            this.endTimestamp = finishedSpans.reduce(function (prev, current) {\n                if (prev.endTimestamp && current.endTimestamp) {\n                    return prev.endTimestamp > current.endTimestamp ? prev : current;\n                }\n                return prev;\n            }).endTimestamp;\n        }\n        var transaction = {\n            contexts: {\n                trace: this.getTraceContext(),\n            },\n            spans: finishedSpans,\n            start_timestamp: this.startTimestamp,\n            tags: this.tags,\n            timestamp: this.endTimestamp,\n            transaction: this.name,\n            type: 'transaction',\n            sdkProcessingMetadata: this.metadata,\n        };\n        var hasMeasurements = Object.keys(this._measurements).length > 0;\n        if (hasMeasurements) {\n            IS_DEBUG_BUILD &&\n                logger.log('[Measurements] Adding measurements to transaction', JSON.stringify(this._measurements, undefined, 2));\n            transaction.measurements = this._measurements;\n        }\n        IS_DEBUG_BUILD && logger.log(\"[Tracing] Finishing \" + this.op + \" transaction: \" + this.name + \".\");\n        return this._hub.captureEvent(transaction);\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.toContext = function () {\n        var spanContext = _super.prototype.toContext.call(this);\n        return dropUndefinedKeys(__assign(__assign({}, spanContext), { name: this.name, trimEnd: this._trimEnd }));\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.updateWithContext = function (transactionContext) {\n        var _a;\n        _super.prototype.updateWithContext.call(this, transactionContext);\n        this.name = (_a = transactionContext.name, (_a !== null && _a !== void 0 ? _a : ''));\n        this._trimEnd = transactionContext.trimEnd;\n        return this;\n    };\n    return Transaction;\n}(SpanClass));\nexport { Transaction };\n//# sourceMappingURL=transaction.js.map","import { getCurrentHub } from '@sentry/hub';\n/**\n * The `extractTraceparentData` function and `TRACEPARENT_REGEXP` constant used\n * to be declared in this file. It was later moved into `@sentry/utils` as part of a\n * move to remove `@sentry/tracing` dependencies from `@sentry/node` (`extractTraceparentData`\n * is the only tracing function used by `@sentry/node`).\n *\n * These exports are kept here for backwards compatability's sake.\n *\n * TODO(v7): Reorganize these exports\n *\n * See https://github.com/getsentry/sentry-javascript/issues/4642 for more details.\n */\nexport { TRACEPARENT_REGEXP, extractTraceparentData } from '@sentry/utils';\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\nexport function hasTracingEnabled(maybeOptions) {\n    var client = getCurrentHub().getClient();\n    var options = maybeOptions || (client && client.getOptions());\n    return !!options && ('tracesSampleRate' in options || 'tracesSampler' in options);\n}\n/** Grabs active transaction off scope, if any */\nexport function getActiveTransaction(maybeHub) {\n    var hub = maybeHub || getCurrentHub();\n    var scope = hub.getScope();\n    return scope && scope.getTransaction();\n}\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\nexport function msToSec(time) {\n    return time / 1000;\n}\n/**\n * Converts from seconds to milliseconds\n * @param time time in seconds\n */\nexport function secToMs(time) {\n    return time * 1000;\n}\n// so it can be used in manual instrumentation without necessitating a hard dependency on @sentry/utils\nexport { stripUrlQueryAndFragment } from '@sentry/utils';\n//# sourceMappingURL=utils.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __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\nexport function __read(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\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { getGlobalObject } from './global';\nimport { isString } from './is';\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem, keyAttrs) {\n    // try/catch both:\n    // - accessing event.target (see getsentry/raven-js#838, #768)\n    // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n    // - can throw an exception in some circumstances.\n    try {\n        var currentElem = elem;\n        var MAX_TRAVERSE_HEIGHT = 5;\n        var MAX_OUTPUT_LEN = 80;\n        var out = [];\n        var height = 0;\n        var len = 0;\n        var separator = ' > ';\n        var sepLength = separator.length;\n        var nextStr = void 0;\n        // eslint-disable-next-line no-plusplus\n        while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n            nextStr = _htmlElementAsString(currentElem, keyAttrs);\n            // bail out if\n            // - nextStr is the 'html' element\n            // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n            //   (ignore this limit if we are on the first iteration)\n            if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n                break;\n            }\n            out.push(nextStr);\n            len += nextStr.length;\n            currentElem = currentElem.parentNode;\n        }\n        return out.reverse().join(separator);\n    }\n    catch (_oO) {\n        return '<unknown>';\n    }\n}\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el, keyAttrs) {\n    var elem = el;\n    var out = [];\n    var className;\n    var classes;\n    var key;\n    var attr;\n    var i;\n    if (!elem || !elem.tagName) {\n        return '';\n    }\n    out.push(elem.tagName.toLowerCase());\n    // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n    var keyAttrPairs = keyAttrs && keyAttrs.length\n        ? keyAttrs.filter(function (keyAttr) { return elem.getAttribute(keyAttr); }).map(function (keyAttr) { return [keyAttr, elem.getAttribute(keyAttr)]; })\n        : null;\n    if (keyAttrPairs && keyAttrPairs.length) {\n        keyAttrPairs.forEach(function (keyAttrPair) {\n            out.push(\"[\" + keyAttrPair[0] + \"=\\\"\" + keyAttrPair[1] + \"\\\"]\");\n        });\n    }\n    else {\n        if (elem.id) {\n            out.push(\"#\" + elem.id);\n        }\n        // eslint-disable-next-line prefer-const\n        className = elem.className;\n        if (className && isString(className)) {\n            classes = className.split(/\\s+/);\n            for (i = 0; i < classes.length; i++) {\n                out.push(\".\" + classes[i]);\n            }\n        }\n    }\n    var allowedAttrs = ['type', 'name', 'title', 'alt'];\n    for (i = 0; i < allowedAttrs.length; i++) {\n        key = allowedAttrs[i];\n        attr = elem.getAttribute(key);\n        if (attr) {\n            out.push(\"[\" + key + \"=\\\"\" + attr + \"\\\"]\");\n        }\n    }\n    return out.join('');\n}\n/**\n * A safe form of location.href\n */\nexport function getLocationHref() {\n    var global = getGlobalObject();\n    try {\n        return global.document.location.href;\n    }\n    catch (oO) {\n        return '';\n    }\n}\n//# sourceMappingURL=browser.js.map","/*\n * This file defines flags and constants that can be modified during compile time in order to facilitate tree shaking\n * for users.\n *\n * Debug flags need to be declared in each package individually and must not be imported across package boundaries,\n * because some build tools have trouble tree-shaking imported guards.\n *\n * As a convention, we define debug flags in a `flags.ts` file in the root of a package's `src` folder.\n *\n * Debug flag files will contain \"magic strings\" like `__SENTRY_DEBUG__` that may get replaced with actual values during\n * our, or the user's build process. Take care when introducing new flags - they must not throw if they are not\n * replaced.\n */\n/** Flag that is true for debug builds, false otherwise. */\nexport var IS_DEBUG_BUILD = typeof __SENTRY_DEBUG__ === 'undefined' ? true : __SENTRY_DEBUG__;\n//# sourceMappingURL=flags.js.map","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\nimport { isNodeEnv } from './node';\nvar fallbackGlobalObject = {};\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject() {\n    return (isNodeEnv()\n        ? global\n        : typeof window !== 'undefined' // eslint-disable-line no-restricted-globals\n            ? window // eslint-disable-line no-restricted-globals\n            : typeof self !== 'undefined'\n                ? self\n                : fallbackGlobalObject);\n}\n/**\n * Returns a global singleton contained in the global `__SENTRY__` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `getGlobalObject`'s return value\n * @returns the singleton\n */\nexport function getGlobalSingleton(name, creator, obj) {\n    var global = (obj || getGlobalObject());\n    var __SENTRY__ = (global.__SENTRY__ = global.__SENTRY__ || {});\n    var singleton = __SENTRY__[name] || (__SENTRY__[name] = creator());\n    return singleton;\n}\n//# sourceMappingURL=global.js.map","import { __assign, __values } from \"tslib\";\nimport { IS_DEBUG_BUILD } from './flags';\nimport { getGlobalObject } from './global';\nimport { isInstanceOf, isString } from './is';\nimport { CONSOLE_LEVELS, logger } from './logger';\nimport { fill } from './object';\nimport { getFunctionName } from './stacktrace';\nimport { supportsHistory, supportsNativeFetch } from './supports';\nvar global = getGlobalObject();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n *  - Console API\n *  - Fetch API\n *  - XHR API\n *  - History API\n *  - DOM API (click/typing)\n *  - Error API\n *  - UnhandledRejection API\n */\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\nfunction instrument(type) {\n    if (instrumented[type]) {\n        return;\n    }\n    instrumented[type] = true;\n    switch (type) {\n        case 'console':\n            instrumentConsole();\n            break;\n        case 'dom':\n            instrumentDOM();\n            break;\n        case 'xhr':\n            instrumentXHR();\n            break;\n        case 'fetch':\n            instrumentFetch();\n            break;\n        case 'history':\n            instrumentHistory();\n            break;\n        case 'error':\n            instrumentError();\n            break;\n        case 'unhandledrejection':\n            instrumentUnhandledRejection();\n            break;\n        default:\n            IS_DEBUG_BUILD && logger.warn('unknown instrumentation type:', type);\n            return;\n    }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(type, callback) {\n    handlers[type] = handlers[type] || [];\n    handlers[type].push(callback);\n    instrument(type);\n}\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n    var e_1, _a;\n    if (!type || !handlers[type]) {\n        return;\n    }\n    try {\n        for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n            var handler = _c.value;\n            try {\n                handler(data);\n            }\n            catch (e) {\n                IS_DEBUG_BUILD &&\n                    logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError:\", e);\n            }\n        }\n    }\n    catch (e_1_1) { e_1 = { error: e_1_1 }; }\n    finally {\n        try {\n            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n        }\n        finally { if (e_1) throw e_1.error; }\n    }\n}\n/** JSDoc */\nfunction instrumentConsole() {\n    if (!('console' in global)) {\n        return;\n    }\n    CONSOLE_LEVELS.forEach(function (level) {\n        if (!(level in global.console)) {\n            return;\n        }\n        fill(global.console, level, function (originalConsoleMethod) {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                triggerHandlers('console', { args: args, level: level });\n                // this fails for some browsers. :(\n                if (originalConsoleMethod) {\n                    originalConsoleMethod.apply(global.console, args);\n                }\n            };\n        });\n    });\n}\n/** JSDoc */\nfunction instrumentFetch() {\n    if (!supportsNativeFetch()) {\n        return;\n    }\n    fill(global, 'fetch', function (originalFetch) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var handlerData = {\n                args: args,\n                fetchData: {\n                    method: getFetchMethod(args),\n                    url: getFetchUrl(args),\n                },\n                startTimestamp: Date.now(),\n            };\n            triggerHandlers('fetch', __assign({}, handlerData));\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            return originalFetch.apply(global, args).then(function (response) {\n                triggerHandlers('fetch', __assign(__assign({}, handlerData), { endTimestamp: Date.now(), response: response }));\n                return response;\n            }, function (error) {\n                triggerHandlers('fetch', __assign(__assign({}, handlerData), { endTimestamp: Date.now(), error: error }));\n                // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n                //       it means the sentry.javascript SDK caught an error invoking your application code.\n                //       This is expected behavior and NOT indicative of a bug with sentry.javascript.\n                throw error;\n            });\n        };\n    });\n}\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs) {\n    if (fetchArgs === void 0) { fetchArgs = []; }\n    if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n        return String(fetchArgs[0].method).toUpperCase();\n    }\n    if (fetchArgs[1] && fetchArgs[1].method) {\n        return String(fetchArgs[1].method).toUpperCase();\n    }\n    return 'GET';\n}\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs) {\n    if (fetchArgs === void 0) { fetchArgs = []; }\n    if (typeof fetchArgs[0] === 'string') {\n        return fetchArgs[0];\n    }\n    if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n        return fetchArgs[0].url;\n    }\n    return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n/** JSDoc */\nfunction instrumentXHR() {\n    if (!('XMLHttpRequest' in global)) {\n        return;\n    }\n    var xhrproto = XMLHttpRequest.prototype;\n    fill(xhrproto, 'open', function (originalOpen) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            var xhr = this;\n            var url = args[1];\n            var xhrInfo = (xhr.__sentry_xhr__ = {\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n                url: args[1],\n            });\n            // if Sentry key appears in URL, don't capture it as a request\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            if (isString(url) && xhrInfo.method === 'POST' && url.match(/sentry_key/)) {\n                xhr.__sentry_own_request__ = true;\n            }\n            var onreadystatechangeHandler = function () {\n                if (xhr.readyState === 4) {\n                    try {\n                        // touching statusCode in some platforms throws\n                        // an exception\n                        xhrInfo.status_code = xhr.status;\n                    }\n                    catch (e) {\n                        /* do nothing */\n                    }\n                    triggerHandlers('xhr', {\n                        args: args,\n                        endTimestamp: Date.now(),\n                        startTimestamp: Date.now(),\n                        xhr: xhr,\n                    });\n                }\n            };\n            if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n                fill(xhr, 'onreadystatechange', function (original) {\n                    return function () {\n                        var readyStateArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            readyStateArgs[_i] = arguments[_i];\n                        }\n                        onreadystatechangeHandler();\n                        return original.apply(xhr, readyStateArgs);\n                    };\n                });\n            }\n            else {\n                xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n            }\n            return originalOpen.apply(xhr, args);\n        };\n    });\n    fill(xhrproto, 'send', function (originalSend) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            if (this.__sentry_xhr__ && args[0] !== undefined) {\n                this.__sentry_xhr__.body = args[0];\n            }\n            triggerHandlers('xhr', {\n                args: args,\n                startTimestamp: Date.now(),\n                xhr: this,\n            });\n            return originalSend.apply(this, args);\n        };\n    });\n}\nvar lastHref;\n/** JSDoc */\nfunction instrumentHistory() {\n    if (!supportsHistory()) {\n        return;\n    }\n    var oldOnPopState = global.onpopstate;\n    global.onpopstate = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var to = global.location.href;\n        // keep track of the current URL state, as we always receive only the updated state\n        var from = lastHref;\n        lastHref = to;\n        triggerHandlers('history', {\n            from: from,\n            to: to,\n        });\n        if (oldOnPopState) {\n            // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n            // https://github.com/getsentry/sentry-javascript/issues/3344\n            // https://github.com/bugsnag/bugsnag-js/issues/469\n            try {\n                return oldOnPopState.apply(this, args);\n            }\n            catch (_oO) {\n                // no-empty\n            }\n        }\n    };\n    /** @hidden */\n    function historyReplacementFunction(originalHistoryFunction) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var url = args.length > 2 ? args[2] : undefined;\n            if (url) {\n                // coerce to string (this is what pushState does)\n                var from = lastHref;\n                var to = String(url);\n                // keep track of the current URL state, as we always receive only the updated state\n                lastHref = to;\n                triggerHandlers('history', {\n                    from: from,\n                    to: to,\n                });\n            }\n            return originalHistoryFunction.apply(this, args);\n        };\n    }\n    fill(global.history, 'pushState', historyReplacementFunction);\n    fill(global.history, 'replaceState', historyReplacementFunction);\n}\nvar debounceDuration = 1000;\nvar debounceTimerID;\nvar lastCapturedEvent;\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\nfunction shouldShortcircuitPreviousDebounce(previous, current) {\n    // If there was no previous event, it should always be swapped for the new one.\n    if (!previous) {\n        return true;\n    }\n    // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n    if (previous.type !== current.type) {\n        return true;\n    }\n    try {\n        // If both events have the same type, it's still possible that actions were performed on different targets.\n        // e.g. 2 clicks on different buttons.\n        if (previous.target !== current.target) {\n            return true;\n        }\n    }\n    catch (e) {\n        // just accessing `target` property can throw an exception in some rare circumstances\n        // see: https://github.com/getsentry/sentry-javascript/issues/838\n    }\n    // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n    // to which an event listener was attached), we treat them as the same action, as we want to capture\n    // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n    return false;\n}\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(event) {\n    // We are only interested in filtering `keypress` events for now.\n    if (event.type !== 'keypress') {\n        return false;\n    }\n    try {\n        var target = event.target;\n        if (!target || !target.tagName) {\n            return true;\n        }\n        // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n        // e.g.tabbing through elements, hotkeys, etc.\n        if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n            return false;\n        }\n    }\n    catch (e) {\n        // just accessing `target` property can throw an exception in some rare circumstances\n        // see: https://github.com/getsentry/sentry-javascript/issues/838\n    }\n    return true;\n}\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction makeDOMEventHandler(handler, globalListener) {\n    if (globalListener === void 0) { globalListener = false; }\n    return function (event) {\n        // It's possible this handler might trigger multiple times for the same\n        // event (e.g. event propagation through node ancestors).\n        // Ignore if we've already captured that event.\n        if (!event || lastCapturedEvent === event) {\n            return;\n        }\n        // We always want to skip _some_ events.\n        if (shouldSkipDOMEvent(event)) {\n            return;\n        }\n        var name = event.type === 'keypress' ? 'input' : event.type;\n        // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n        if (debounceTimerID === undefined) {\n            handler({\n                event: event,\n                name: name,\n                global: globalListener,\n            });\n            lastCapturedEvent = event;\n        }\n        // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n        // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n        else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n            handler({\n                event: event,\n                name: name,\n                global: globalListener,\n            });\n            lastCapturedEvent = event;\n        }\n        // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n        clearTimeout(debounceTimerID);\n        debounceTimerID = global.setTimeout(function () {\n            debounceTimerID = undefined;\n        }, debounceDuration);\n    };\n}\n/** JSDoc */\nfunction instrumentDOM() {\n    if (!('document' in global)) {\n        return;\n    }\n    // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n    // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n    // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n    var triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n    var globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n    global.document.addEventListener('click', globalDOMEventHandler, false);\n    global.document.addEventListener('keypress', globalDOMEventHandler, false);\n    // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n    // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n    // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n    // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n    // guaranteed to fire at least once.)\n    ['EventTarget', 'Node'].forEach(function (target) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        var proto = global[target] && global[target].prototype;\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n            return;\n        }\n        fill(proto, 'addEventListener', function (originalAddEventListener) {\n            return function (type, listener, options) {\n                if (type === 'click' || type == 'keypress') {\n                    try {\n                        var el = this;\n                        var handlers_1 = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n                        var handlerForType = (handlers_1[type] = handlers_1[type] || { refCount: 0 });\n                        if (!handlerForType.handler) {\n                            var handler = makeDOMEventHandler(triggerDOMHandler);\n                            handlerForType.handler = handler;\n                            originalAddEventListener.call(this, type, handler, options);\n                        }\n                        handlerForType.refCount += 1;\n                    }\n                    catch (e) {\n                        // Accessing dom properties is always fragile.\n                        // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n                    }\n                }\n                return originalAddEventListener.call(this, type, listener, options);\n            };\n        });\n        fill(proto, 'removeEventListener', function (originalRemoveEventListener) {\n            return function (type, listener, options) {\n                if (type === 'click' || type == 'keypress') {\n                    try {\n                        var el = this;\n                        var handlers_2 = el.__sentry_instrumentation_handlers__ || {};\n                        var handlerForType = handlers_2[type];\n                        if (handlerForType) {\n                            handlerForType.refCount -= 1;\n                            // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n                            if (handlerForType.refCount <= 0) {\n                                originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n                                handlerForType.handler = undefined;\n                                delete handlers_2[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n                            }\n                            // If there are no longer any custom handlers of any type on this element, cleanup everything.\n                            if (Object.keys(handlers_2).length === 0) {\n                                delete el.__sentry_instrumentation_handlers__;\n                            }\n                        }\n                    }\n                    catch (e) {\n                        // Accessing dom properties is always fragile.\n                        // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n                    }\n                }\n                return originalRemoveEventListener.call(this, type, listener, options);\n            };\n        });\n    });\n}\nvar _oldOnErrorHandler = null;\n/** JSDoc */\nfunction instrumentError() {\n    _oldOnErrorHandler = global.onerror;\n    global.onerror = function (msg, url, line, column, error) {\n        triggerHandlers('error', {\n            column: column,\n            error: error,\n            line: line,\n            msg: msg,\n            url: url,\n        });\n        if (_oldOnErrorHandler) {\n            // eslint-disable-next-line prefer-rest-params\n            return _oldOnErrorHandler.apply(this, arguments);\n        }\n        return false;\n    };\n}\nvar _oldOnUnhandledRejectionHandler = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection() {\n    _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n    global.onunhandledrejection = function (e) {\n        triggerHandlers('unhandledrejection', e);\n        if (_oldOnUnhandledRejectionHandler) {\n            // eslint-disable-next-line prefer-rest-params\n            return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n        }\n        return true;\n    };\n}\n//# sourceMappingURL=instrument.js.map","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n// eslint-disable-next-line @typescript-eslint/unbound-method\nvar objectToString = Object.prototype.toString;\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat) {\n    switch (objectToString.call(wat)) {\n        case '[object Error]':\n        case '[object Exception]':\n        case '[object DOMException]':\n            return true;\n        default:\n            return isInstanceOf(wat, Error);\n    }\n}\nfunction isBuiltin(wat, ty) {\n    return objectToString.call(wat) === \"[object \" + ty + \"]\";\n}\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat) {\n    return isBuiltin(wat, 'ErrorEvent');\n}\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat) {\n    return isBuiltin(wat, 'DOMError');\n}\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat) {\n    return isBuiltin(wat, 'DOMException');\n}\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat) {\n    return isBuiltin(wat, 'String');\n}\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat) {\n    return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat) {\n    return isBuiltin(wat, 'Object');\n}\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat) {\n    return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat) {\n    return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat) {\n    return isBuiltin(wat, 'RegExp');\n}\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat) {\n    return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value is NaN\n * {@link isNaN}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isNaN(wat) {\n    return typeof wat === 'number' && wat !== wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat, base) {\n    try {\n        return wat instanceof base;\n    }\n    catch (_e) {\n        return false;\n    }\n}\n//# sourceMappingURL=is.js.map","import { __read, __spread } from \"tslib\";\nimport { IS_DEBUG_BUILD } from './flags';\nimport { getGlobalObject, getGlobalSingleton } from './global';\n// TODO: Implement different loggers for different environments\nvar global = getGlobalObject();\n/** Prefix for logging strings */\nvar PREFIX = 'Sentry Logger ';\nexport var CONSOLE_LEVELS = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nexport function consoleSandbox(callback) {\n    var global = getGlobalObject();\n    if (!('console' in global)) {\n        return callback();\n    }\n    var originalConsole = global.console;\n    var wrappedLevels = {};\n    // Restore all wrapped console methods\n    CONSOLE_LEVELS.forEach(function (level) {\n        // TODO(v7): Remove this check as it's only needed for Node 6\n        var originalWrappedFunc = originalConsole[level] && originalConsole[level].__sentry_original__;\n        if (level in global.console && originalWrappedFunc) {\n            wrappedLevels[level] = originalConsole[level];\n            originalConsole[level] = originalWrappedFunc;\n        }\n    });\n    try {\n        return callback();\n    }\n    finally {\n        // Revert restoration to wrapped state\n        Object.keys(wrappedLevels).forEach(function (level) {\n            originalConsole[level] = wrappedLevels[level];\n        });\n    }\n}\nfunction makeLogger() {\n    var enabled = false;\n    var logger = {\n        enable: function () {\n            enabled = true;\n        },\n        disable: function () {\n            enabled = false;\n        },\n    };\n    if (IS_DEBUG_BUILD) {\n        CONSOLE_LEVELS.forEach(function (name) {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            logger[name] = function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                if (enabled) {\n                    consoleSandbox(function () {\n                        var _a;\n                        (_a = global.console)[name].apply(_a, __spread([PREFIX + \"[\" + name + \"]:\"], args));\n                    });\n                }\n            };\n        });\n    }\n    else {\n        CONSOLE_LEVELS.forEach(function (name) {\n            logger[name] = function () { return undefined; };\n        });\n    }\n    return logger;\n}\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nvar logger;\nif (IS_DEBUG_BUILD) {\n    logger = getGlobalSingleton('logger', makeLogger);\n}\nelse {\n    logger = makeLogger();\n}\nexport { logger };\n//# sourceMappingURL=logger.js.map","import { __assign } from \"tslib\";\nimport { getGlobalObject } from './global';\nimport { addNonEnumerableProperty } from './object';\nimport { snipLine } from './string';\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4() {\n    var global = getGlobalObject();\n    var crypto = global.crypto || global.msCrypto;\n    if (!(crypto === void 0) && crypto.getRandomValues) {\n        // Use window.crypto API if available\n        var arr = new Uint16Array(8);\n        crypto.getRandomValues(arr);\n        // set 4 in byte 7\n        // eslint-disable-next-line no-bitwise\n        arr[3] = (arr[3] & 0xfff) | 0x4000;\n        // set 2 most significant bits of byte 9 to '10'\n        // eslint-disable-next-line no-bitwise\n        arr[4] = (arr[4] & 0x3fff) | 0x8000;\n        var pad = function (num) {\n            var v = num.toString(16);\n            while (v.length < 4) {\n                v = \"0\" + v;\n            }\n            return v;\n        };\n        return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n    }\n    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n        // eslint-disable-next-line no-bitwise\n        var r = (Math.random() * 16) | 0;\n        // eslint-disable-next-line no-bitwise\n        var v = c === 'x' ? r : (r & 0x3) | 0x8;\n        return v.toString(16);\n    });\n}\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url) {\n    if (!url) {\n        return {};\n    }\n    var match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n    if (!match) {\n        return {};\n    }\n    // coerce to undefined values to empty string so we don't get 'undefined'\n    var query = match[6] || '';\n    var fragment = match[8] || '';\n    return {\n        host: match[4],\n        path: match[5],\n        protocol: match[2],\n        relative: match[5] + query + fragment,\n    };\n}\nfunction getFirstException(event) {\n    return event.exception && event.exception.values ? event.exception.values[0] : undefined;\n}\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event) {\n    var message = event.message, eventId = event.event_id;\n    if (message) {\n        return message;\n    }\n    var firstException = getFirstException(event);\n    if (firstException) {\n        if (firstException.type && firstException.value) {\n            return firstException.type + \": \" + firstException.value;\n        }\n        return firstException.type || firstException.value || eventId || '<unknown>';\n    }\n    return eventId || '<unknown>';\n}\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event, value, type) {\n    var exception = (event.exception = event.exception || {});\n    var values = (exception.values = exception.values || []);\n    var firstException = (values[0] = values[0] || {});\n    if (!firstException.value) {\n        firstException.value = value || '';\n    }\n    if (!firstException.type) {\n        firstException.type = type || 'Error';\n    }\n}\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nexport function addExceptionMechanism(event, newMechanism) {\n    var firstException = getFirstException(event);\n    if (!firstException) {\n        return;\n    }\n    var defaultMechanism = { type: 'generic', handled: true };\n    var currentMechanism = firstException.mechanism;\n    firstException.mechanism = __assign(__assign(__assign({}, defaultMechanism), currentMechanism), newMechanism);\n    if (newMechanism && 'data' in newMechanism) {\n        var mergedData = __assign(__assign({}, (currentMechanism && currentMechanism.data)), newMechanism.data);\n        firstException.mechanism.data = mergedData;\n    }\n}\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nvar SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input) {\n    var match = input.match(SEMVER_REGEXP) || [];\n    var major = parseInt(match[1], 10);\n    var minor = parseInt(match[2], 10);\n    var patch = parseInt(match[3], 10);\n    return {\n        buildmetadata: match[5],\n        major: isNaN(major) ? undefined : major,\n        minor: isNaN(minor) ? undefined : minor,\n        patch: isNaN(patch) ? undefined : patch,\n        prerelease: match[4],\n    };\n}\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines, frame, linesOfContext) {\n    if (linesOfContext === void 0) { linesOfContext = 5; }\n    var lineno = frame.lineno || 0;\n    var maxLines = lines.length;\n    var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n    frame.pre_context = lines\n        .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n        .map(function (line) { return snipLine(line, 0); });\n    frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n    frame.post_context = lines\n        .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n        .map(function (line) { return snipLine(line, 0); });\n}\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath) {\n    // eslint-disable-next-line no-useless-escape\n    return urlPath.split(/[\\?#]/, 1)[0];\n}\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nexport function checkOrSetAlreadyCaught(exception) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    if (exception && exception.__sentry_captured__) {\n        return true;\n    }\n    try {\n        // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n        // `ExtraErrorData` integration\n        addNonEnumerableProperty(exception, '__sentry_captured__', true);\n    }\n    catch (err) {\n        // `exception` is a primitive, so we can't mark it seen\n    }\n    return false;\n}\n//# sourceMappingURL=misc.js.map","/*\n * This module exists for optimizations in the build process through rollup and terser.  We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `logger` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These fags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nexport function isBrowserBundle() {\n    return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n//# sourceMappingURL=env.js.map","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\nimport { isBrowserBundle } from './env';\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv() {\n    // explicitly check for browser bundles as those can be optimized statically\n    // by terser/rollup.\n    return (!isBrowserBundle() &&\n        Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]');\n}\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function dynamicRequire(mod, request) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    return mod.require(request);\n}\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\nexport function loadModule(moduleName) {\n    var mod;\n    try {\n        mod = dynamicRequire(module, moduleName);\n    }\n    catch (e) {\n        // no-empty\n    }\n    try {\n        var cwd = dynamicRequire(module, 'process').cwd;\n        mod = dynamicRequire(module, cwd() + \"/node_modules/\" + moduleName);\n    }\n    catch (e) {\n        // no-empty\n    }\n    return mod;\n}\n//# sourceMappingURL=node.js.map","import { __assign, __values } from \"tslib\";\nimport { htmlTreeAsString } from './browser';\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive } from './is';\nimport { truncate } from './string';\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nexport function fill(source, name, replacementFactory) {\n    if (!(name in source)) {\n        return;\n    }\n    var original = source[name];\n    var wrapped = replacementFactory(original);\n    // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n    // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n    if (typeof wrapped === 'function') {\n        try {\n            markFunctionWrapped(wrapped, original);\n        }\n        catch (_Oo) {\n            // This can throw if multiple fill happens on a global object like XMLHttpRequest\n            // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n        }\n    }\n    source[name] = wrapped;\n}\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nexport function addNonEnumerableProperty(obj, name, value) {\n    Object.defineProperty(obj, name, {\n        // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n        value: value,\n        writable: true,\n        configurable: true,\n    });\n}\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nexport function markFunctionWrapped(wrapped, original) {\n    var proto = original.prototype || {};\n    wrapped.prototype = original.prototype = proto;\n    addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n}\n/**\n * This extracts the original function if available.  See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\nexport function getOriginalFunction(func) {\n    return func.__sentry_original__;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object) {\n    return Object.keys(object)\n        .map(function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]); })\n        .join('&');\n}\n/**\n * Transforms any object into an object literal with all its attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n */\nexport function convertToPlainObject(value) {\n    var newObj = value;\n    if (isError(value)) {\n        newObj = __assign({ message: value.message, name: value.name, stack: value.stack }, getOwnProperties(value));\n    }\n    else if (isEvent(value)) {\n        var event_1 = value;\n        newObj = __assign({ type: event_1.type, target: serializeEventTarget(event_1.target), currentTarget: serializeEventTarget(event_1.currentTarget) }, getOwnProperties(event_1));\n        if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n            newObj.detail = event_1.detail;\n        }\n    }\n    return newObj;\n}\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target) {\n    try {\n        return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n    }\n    catch (_oO) {\n        return '<unknown>';\n    }\n}\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj) {\n    var extractedProps = {};\n    for (var property in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, property)) {\n            extractedProps[property] = obj[property];\n        }\n    }\n    return extractedProps;\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function extractExceptionKeysForMessage(exception, maxLength) {\n    if (maxLength === void 0) { maxLength = 40; }\n    var keys = Object.keys(convertToPlainObject(exception));\n    keys.sort();\n    if (!keys.length) {\n        return '[object has no keys]';\n    }\n    if (keys[0].length >= maxLength) {\n        return truncate(keys[0], maxLength);\n    }\n    for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n        var serialized = keys.slice(0, includedKeys).join(', ');\n        if (serialized.length > maxLength) {\n            continue;\n        }\n        if (includedKeys === keys.length) {\n            return serialized;\n        }\n        return truncate(serialized, maxLength);\n    }\n    return '';\n}\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\nexport function dropUndefinedKeys(val) {\n    var e_1, _a;\n    if (isPlainObject(val)) {\n        var rv = {};\n        try {\n            for (var _b = __values(Object.keys(val)), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var key = _c.value;\n                if (typeof val[key] !== 'undefined') {\n                    rv[key] = dropUndefinedKeys(val[key]);\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        return rv;\n    }\n    if (Array.isArray(val)) {\n        return val.map(dropUndefinedKeys);\n    }\n    return val;\n}\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nexport function objectify(wat) {\n    var objectified;\n    switch (true) {\n        case wat === undefined || wat === null:\n            objectified = new String(wat);\n            break;\n        // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n        // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n        // an object in order to wrap it.\n        case typeof wat === 'symbol' || typeof wat === 'bigint':\n            objectified = Object(wat);\n            break;\n        // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n        case isPrimitive(wat):\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            objectified = new wat.constructor(wat);\n            break;\n        // by process of elimination, at this point we know that `wat` must already be an object\n        default:\n            objectified = wat;\n            break;\n    }\n    return objectified;\n}\n//# sourceMappingURL=object.js.map","import { __assign, __values } from \"tslib\";\nvar STACKTRACE_LIMIT = 50;\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nexport function createStackParser() {\n    var parsers = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        parsers[_i] = arguments[_i];\n    }\n    var sortedParsers = parsers.sort(function (a, b) { return a[0] - b[0]; }).map(function (p) { return p[1]; });\n    return function (stack, skipFirst) {\n        var e_1, _a, e_2, _b;\n        if (skipFirst === void 0) { skipFirst = 0; }\n        var frames = [];\n        try {\n            for (var _c = __values(stack.split('\\n').slice(skipFirst)), _d = _c.next(); !_d.done; _d = _c.next()) {\n                var line = _d.value;\n                try {\n                    for (var sortedParsers_1 = (e_2 = void 0, __values(sortedParsers)), sortedParsers_1_1 = sortedParsers_1.next(); !sortedParsers_1_1.done; sortedParsers_1_1 = sortedParsers_1.next()) {\n                        var parser = sortedParsers_1_1.value;\n                        var frame = parser(line);\n                        if (frame) {\n                            frames.push(frame);\n                            break;\n                        }\n                    }\n                }\n                catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                finally {\n                    try {\n                        if (sortedParsers_1_1 && !sortedParsers_1_1.done && (_b = sortedParsers_1.return)) _b.call(sortedParsers_1);\n                    }\n                    finally { if (e_2) throw e_2.error; }\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        return stripSentryFramesAndReverse(frames);\n    };\n}\n/**\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack) {\n    if (!stack.length) {\n        return [];\n    }\n    var localStack = stack;\n    var firstFrameFunction = localStack[0].function || '';\n    var lastFrameFunction = localStack[localStack.length - 1].function || '';\n    // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n    if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n        localStack = localStack.slice(1);\n    }\n    // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n    if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n        localStack = localStack.slice(0, -1);\n    }\n    // The frame where the crash happened, should be the last entry in the array\n    return localStack\n        .slice(0, STACKTRACE_LIMIT)\n        .map(function (frame) { return (__assign(__assign({}, frame), { filename: frame.filename || localStack[0].filename, function: frame.function || '?' })); })\n        .reverse();\n}\nvar defaultFunctionName = '<anonymous>';\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn) {\n    try {\n        if (!fn || typeof fn !== 'function') {\n            return defaultFunctionName;\n        }\n        return fn.name || defaultFunctionName;\n    }\n    catch (e) {\n        // Just accessing custom props in some Selenium environments\n        // can cause a \"Permission denied\" exception (see raven-js#495).\n        return defaultFunctionName;\n    }\n}\n//# sourceMappingURL=stacktrace.js.map","import { isRegExp, isString } from './is';\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str, max) {\n    if (max === void 0) { max = 0; }\n    if (typeof str !== 'string' || max === 0) {\n        return str;\n    }\n    return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line, colno) {\n    var newLine = line;\n    var lineLength = newLine.length;\n    if (lineLength <= 150) {\n        return newLine;\n    }\n    if (colno > lineLength) {\n        // eslint-disable-next-line no-param-reassign\n        colno = lineLength;\n    }\n    var start = Math.max(colno - 60, 0);\n    if (start < 5) {\n        start = 0;\n    }\n    var end = Math.min(start + 140, lineLength);\n    if (end > lineLength - 5) {\n        end = lineLength;\n    }\n    if (end === lineLength) {\n        start = Math.max(end - 140, 0);\n    }\n    newLine = newLine.slice(start, end);\n    if (start > 0) {\n        newLine = \"'{snip} \" + newLine;\n    }\n    if (end < lineLength) {\n        newLine += ' {snip}';\n    }\n    return newLine;\n}\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function safeJoin(input, delimiter) {\n    if (!Array.isArray(input)) {\n        return '';\n    }\n    var output = [];\n    // eslint-disable-next-line @typescript-eslint/prefer-for-of\n    for (var i = 0; i < input.length; i++) {\n        var value = input[i];\n        try {\n            output.push(String(value));\n        }\n        catch (e) {\n            output.push('[value cannot be serialized]');\n        }\n    }\n    return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value, pattern) {\n    if (!isString(value)) {\n        return false;\n    }\n    if (isRegExp(pattern)) {\n        return pattern.test(value);\n    }\n    if (typeof pattern === 'string') {\n        return value.indexOf(pattern) !== -1;\n    }\n    return false;\n}\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * Based on https://github.com/sindresorhus/escape-string-regexp. Vendored to a) reduce the size by skipping the runtime\n * type-checking, and b) ensure it gets down-compiled for old versions of Node (the published package only supports Node\n * 12+).\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString) {\n    // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n    // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n    return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n//# sourceMappingURL=string.js.map","import { IS_DEBUG_BUILD } from './flags';\nimport { getGlobalObject } from './global';\nimport { logger } from './logger';\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent() {\n    try {\n        new ErrorEvent('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError() {\n    try {\n        // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n        // 1 argument required, but only 0 present.\n        // @ts-ignore It really needs 1 argument, not 0.\n        new DOMError('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException() {\n    try {\n        new DOMException('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch() {\n    if (!('fetch' in getGlobalObject())) {\n        return false;\n    }\n    try {\n        new Headers();\n        new Request('');\n        new Response();\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFetch(func) {\n    return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch() {\n    if (!supportsFetch()) {\n        return false;\n    }\n    var global = getGlobalObject();\n    // Fast path to avoid DOM I/O\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    if (isNativeFetch(global.fetch)) {\n        return true;\n    }\n    // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n    // so create a \"pure\" iframe to see if that has native fetch\n    var result = false;\n    var doc = global.document;\n    // eslint-disable-next-line deprecation/deprecation\n    if (doc && typeof doc.createElement === 'function') {\n        try {\n            var sandbox = doc.createElement('iframe');\n            sandbox.hidden = true;\n            doc.head.appendChild(sandbox);\n            if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n                // eslint-disable-next-line @typescript-eslint/unbound-method\n                result = isNativeFetch(sandbox.contentWindow.fetch);\n            }\n            doc.head.removeChild(sandbox);\n        }\n        catch (err) {\n            IS_DEBUG_BUILD &&\n                logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n        }\n    }\n    return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver() {\n    return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy() {\n    // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n    // (see https://caniuse.com/#feat=referrer-policy),\n    // it doesn't. And it throws an exception instead of ignoring this parameter...\n    // REF: https://github.com/getsentry/raven-js/issues/1233\n    if (!supportsFetch()) {\n        return false;\n    }\n    try {\n        new Request('_', {\n            referrerPolicy: 'origin',\n        });\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory() {\n    // NOTE: in Chrome App environment, touching history.pushState, *even inside\n    //       a try/catch block*, will cause Chrome to output an error to console.error\n    // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n    var global = getGlobalObject();\n    /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var chrome = global.chrome;\n    var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n    /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n    var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n    return !isChromePackagedApp && hasHistoryApi;\n}\n//# sourceMappingURL=supports.js.map","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/typedef */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise(value) {\n    return new SyncPromise(function (resolve) {\n        resolve(value);\n    });\n}\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise(reason) {\n    return new SyncPromise(function (_, reject) {\n        reject(reason);\n    });\n}\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nvar SyncPromise = /** @class */ (function () {\n    function SyncPromise(executor) {\n        var _this = this;\n        this._state = 0 /* PENDING */;\n        this._handlers = [];\n        /** JSDoc */\n        this._resolve = function (value) {\n            _this._setResult(1 /* RESOLVED */, value);\n        };\n        /** JSDoc */\n        this._reject = function (reason) {\n            _this._setResult(2 /* REJECTED */, reason);\n        };\n        /** JSDoc */\n        this._setResult = function (state, value) {\n            if (_this._state !== 0 /* PENDING */) {\n                return;\n            }\n            if (isThenable(value)) {\n                void value.then(_this._resolve, _this._reject);\n                return;\n            }\n            _this._state = state;\n            _this._value = value;\n            _this._executeHandlers();\n        };\n        /** JSDoc */\n        this._executeHandlers = function () {\n            if (_this._state === 0 /* PENDING */) {\n                return;\n            }\n            var cachedHandlers = _this._handlers.slice();\n            _this._handlers = [];\n            cachedHandlers.forEach(function (handler) {\n                if (handler[0]) {\n                    return;\n                }\n                if (_this._state === 1 /* RESOLVED */) {\n                    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n                    handler[1](_this._value);\n                }\n                if (_this._state === 2 /* REJECTED */) {\n                    handler[2](_this._value);\n                }\n                handler[0] = true;\n            });\n        };\n        try {\n            executor(this._resolve, this._reject);\n        }\n        catch (e) {\n            this._reject(e);\n        }\n    }\n    /** JSDoc */\n    SyncPromise.prototype.then = function (onfulfilled, onrejected) {\n        var _this = this;\n        return new SyncPromise(function (resolve, reject) {\n            _this._handlers.push([\n                false,\n                function (result) {\n                    if (!onfulfilled) {\n                        // TODO: ¯\\_(ツ)_/¯\n                        // TODO: FIXME\n                        resolve(result);\n                    }\n                    else {\n                        try {\n                            resolve(onfulfilled(result));\n                        }\n                        catch (e) {\n                            reject(e);\n                        }\n                    }\n                },\n                function (reason) {\n                    if (!onrejected) {\n                        reject(reason);\n                    }\n                    else {\n                        try {\n                            resolve(onrejected(reason));\n                        }\n                        catch (e) {\n                            reject(e);\n                        }\n                    }\n                },\n            ]);\n            _this._executeHandlers();\n        });\n    };\n    /** JSDoc */\n    SyncPromise.prototype.catch = function (onrejected) {\n        return this.then(function (val) { return val; }, onrejected);\n    };\n    /** JSDoc */\n    SyncPromise.prototype.finally = function (onfinally) {\n        var _this = this;\n        return new SyncPromise(function (resolve, reject) {\n            var val;\n            var isRejected;\n            return _this.then(function (value) {\n                isRejected = false;\n                val = value;\n                if (onfinally) {\n                    onfinally();\n                }\n            }, function (reason) {\n                isRejected = true;\n                val = reason;\n                if (onfinally) {\n                    onfinally();\n                }\n            }).then(function () {\n                if (isRejected) {\n                    reject(val);\n                    return;\n                }\n                resolve(val);\n            });\n        });\n    };\n    return SyncPromise;\n}());\nexport { SyncPromise };\n//# sourceMappingURL=syncpromise.js.map","import { getGlobalObject } from './global';\nimport { dynamicRequire, isNodeEnv } from './node';\n/**\n * A TimestampSource implementation for environments that do not support the Performance Web API natively.\n *\n * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier\n * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It\n * is more obvious to explain \"why does my span have negative duration\" than \"why my spans have zero duration\".\n */\nvar dateTimestampSource = {\n    nowSeconds: function () { return Date.now() / 1000; },\n};\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction getBrowserPerformance() {\n    var performance = getGlobalObject().performance;\n    if (!performance || !performance.now) {\n        return undefined;\n    }\n    // Replace performance.timeOrigin with our own timeOrigin based on Date.now().\n    //\n    // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin +\n    // performance.now() gives a date arbitrarily in the past.\n    //\n    // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is\n    // undefined.\n    //\n    // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to\n    // interact with data coming out of performance entries.\n    //\n    // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that\n    // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes\n    // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have\n    // observed skews that can be as long as days, weeks or months.\n    //\n    // See https://github.com/getsentry/sentry-javascript/issues/2590.\n    //\n    // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload\n    // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation\n    // transactions of long-lived web pages.\n    var timeOrigin = Date.now() - performance.now();\n    return {\n        now: function () { return performance.now(); },\n        timeOrigin: timeOrigin,\n    };\n}\n/**\n * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't\n * implement the API.\n */\nfunction getNodePerformance() {\n    try {\n        var perfHooks = dynamicRequire(module, 'perf_hooks');\n        return perfHooks.performance;\n    }\n    catch (_) {\n        return undefined;\n    }\n}\n/**\n * The Performance API implementation for the current platform, if available.\n */\nvar platformPerformance = isNodeEnv() ? getNodePerformance() : getBrowserPerformance();\nvar timestampSource = platformPerformance === undefined\n    ? dateTimestampSource\n    : {\n        nowSeconds: function () { return (platformPerformance.timeOrigin + platformPerformance.now()) / 1000; },\n    };\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport var dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource);\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * See `usingPerformanceAPI` to test whether the Performance API is used.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport var timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource);\n// Re-exported with an old name for backwards-compatibility.\nexport var timestampWithMs = timestampInSeconds;\n/**\n * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps.\n */\nexport var usingPerformanceAPI = platformPerformance !== undefined;\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nexport var _browserPerformanceTimeOriginMode;\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport var browserPerformanceTimeOrigin = (function () {\n    // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n    // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n    // data as reliable if they are within a reasonable threshold of the current time.\n    var performance = getGlobalObject().performance;\n    if (!performance || !performance.now) {\n        _browserPerformanceTimeOriginMode = 'none';\n        return undefined;\n    }\n    var threshold = 3600 * 1000;\n    var performanceNow = performance.now();\n    var dateNow = Date.now();\n    // if timeOrigin isn't available set delta to threshold so it isn't used\n    var timeOriginDelta = performance.timeOrigin\n        ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n        : threshold;\n    var timeOriginIsReliable = timeOriginDelta < threshold;\n    // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n    // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n    // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n    // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n    // Date API.\n    // eslint-disable-next-line deprecation/deprecation\n    var navigationStart = performance.timing && performance.timing.navigationStart;\n    var hasNavigationStart = typeof navigationStart === 'number';\n    // if navigationStart isn't available set delta to threshold so it isn't used\n    var navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n    var navigationStartIsReliable = navigationStartDelta < threshold;\n    if (timeOriginIsReliable || navigationStartIsReliable) {\n        // Use the more reliable time origin\n        if (timeOriginDelta <= navigationStartDelta) {\n            _browserPerformanceTimeOriginMode = 'timeOrigin';\n            return performance.timeOrigin;\n        }\n        else {\n            _browserPerformanceTimeOriginMode = 'navigationStart';\n            return navigationStart;\n        }\n    }\n    // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n    _browserPerformanceTimeOriginMode = 'dateNow';\n    return dateNow;\n})();\n//# sourceMappingURL=time.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __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\nexport function __read(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\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { isString, hyphenate, NOOP, extend, isObject, NO, isArray, makeMap, isSymbol, capitalize, camelize, EMPTY_OBJ, PatchFlagNames, slotFlagsText, isOn, isBuiltInDirective, isReservedProp, toHandlerKey } from '@vue/shared';\nexport { generateCodeFrame } from '@vue/shared';\n\nfunction defaultOnError(error) {\n  throw error;\n}\nfunction defaultOnWarn(msg) {\n  !!(process.env.NODE_ENV !== \"production\") && console.warn(`[Vue warn] ${msg.message}`);\n}\nfunction createCompilerError(code, loc, messages, additionalMessage) {\n  const msg = !!(process.env.NODE_ENV !== \"production\") || false ? (messages || errorMessages)[code] + (additionalMessage || ``) : code;\n  const error = new SyntaxError(String(msg));\n  error.code = code;\n  error.loc = loc;\n  return error;\n}\nconst errorMessages = {\n  // parse errors\n  [0]: \"Illegal comment.\",\n  [1]: \"CDATA section is allowed only in XML context.\",\n  [2]: \"Duplicate attribute.\",\n  [3]: \"End tag cannot have attributes.\",\n  [4]: \"Illegal '/' in tags.\",\n  [5]: \"Unexpected EOF in tag.\",\n  [6]: \"Unexpected EOF in CDATA section.\",\n  [7]: \"Unexpected EOF in comment.\",\n  [8]: \"Unexpected EOF in script.\",\n  [9]: \"Unexpected EOF in tag.\",\n  [10]: \"Incorrectly closed comment.\",\n  [11]: \"Incorrectly opened comment.\",\n  [12]: \"Illegal tag name. Use '&lt;' to print '<'.\",\n  [13]: \"Attribute value was expected.\",\n  [14]: \"End tag name was expected.\",\n  [15]: \"Whitespace was expected.\",\n  [16]: \"Unexpected '<!--' in comment.\",\n  [17]: `Attribute name cannot contain U+0022 (\"), U+0027 ('), and U+003C (<).`,\n  [18]: \"Unquoted attribute value cannot contain U+0022 (\\\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).\",\n  [19]: \"Attribute name cannot start with '='.\",\n  [21]: \"'<?' is allowed only in XML context.\",\n  [20]: `Unexpected null character.`,\n  [22]: \"Illegal '/' in tags.\",\n  // Vue-specific parse errors\n  [23]: \"Invalid end tag.\",\n  [24]: \"Element is missing end tag.\",\n  [25]: \"Interpolation end sign was not found.\",\n  [27]: \"End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.\",\n  [26]: \"Legal directive name was expected.\",\n  // transform errors\n  [28]: `v-if/v-else-if is missing expression.`,\n  [29]: `v-if/else branches must use unique keys.`,\n  [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,\n  [31]: `v-for is missing expression.`,\n  [32]: `v-for has invalid expression.`,\n  [33]: `<template v-for> key should be placed on the <template> tag.`,\n  [34]: `v-bind is missing expression.`,\n  [35]: `v-on is missing expression.`,\n  [36]: `Unexpected custom directive on <slot> outlet.`,\n  [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`,\n  [38]: `Duplicate slot names found. `,\n  [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`,\n  [40]: `v-slot can only be used on components or <template> tags.`,\n  [41]: `v-model is missing expression.`,\n  [42]: `v-model value must be a valid JavaScript member expression.`,\n  [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,\n  [44]: `v-model cannot be used on a prop, because local prop bindings are not writable.\nUse a v-bind binding combined with a v-on listener that emits update:x event instead.`,\n  [45]: `Error parsing JavaScript expression: `,\n  [46]: `<KeepAlive> expects exactly one child component.`,\n  // generic errors\n  [47]: `\"prefixIdentifiers\" option is not supported in this build of compiler.`,\n  [48]: `ES module mode is not supported in this build of compiler.`,\n  [49]: `\"cacheHandlers\" option is only supported when the \"prefixIdentifiers\" option is enabled.`,\n  [50]: `\"scopeId\" option is only supported in module mode.`,\n  // deprecations\n  [51]: `@vnode-* hooks in templates are deprecated. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support will be removed in 3.4.`,\n  [52]: `v-is=\"component-name\" has been deprecated. Use is=\"vue:component-name\" instead. v-is support will be removed in 3.4.`,\n  // just to fulfill types\n  [53]: ``\n};\n\nconst FRAGMENT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Fragment` : ``);\nconst TELEPORT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Teleport` : ``);\nconst SUSPENSE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Suspense` : ``);\nconst KEEP_ALIVE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `KeepAlive` : ``);\nconst BASE_TRANSITION = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `BaseTransition` : ``);\nconst OPEN_BLOCK = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `openBlock` : ``);\nconst CREATE_BLOCK = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createBlock` : ``);\nconst CREATE_ELEMENT_BLOCK = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createElementBlock` : ``);\nconst CREATE_VNODE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createVNode` : ``);\nconst CREATE_ELEMENT_VNODE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createElementVNode` : ``);\nconst CREATE_COMMENT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createCommentVNode` : ``);\nconst CREATE_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createTextVNode` : ``);\nconst CREATE_STATIC = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createStaticVNode` : ``);\nconst RESOLVE_COMPONENT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `resolveComponent` : ``);\nconst RESOLVE_DYNAMIC_COMPONENT = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? `resolveDynamicComponent` : ``\n);\nconst RESOLVE_DIRECTIVE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `resolveDirective` : ``);\nconst RESOLVE_FILTER = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `resolveFilter` : ``);\nconst WITH_DIRECTIVES = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `withDirectives` : ``);\nconst RENDER_LIST = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `renderList` : ``);\nconst RENDER_SLOT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `renderSlot` : ``);\nconst CREATE_SLOTS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createSlots` : ``);\nconst TO_DISPLAY_STRING = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `toDisplayString` : ``);\nconst MERGE_PROPS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `mergeProps` : ``);\nconst NORMALIZE_CLASS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `normalizeClass` : ``);\nconst NORMALIZE_STYLE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `normalizeStyle` : ``);\nconst NORMALIZE_PROPS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `normalizeProps` : ``);\nconst GUARD_REACTIVE_PROPS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `guardReactiveProps` : ``);\nconst TO_HANDLERS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `toHandlers` : ``);\nconst CAMELIZE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `camelize` : ``);\nconst CAPITALIZE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `capitalize` : ``);\nconst TO_HANDLER_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `toHandlerKey` : ``);\nconst SET_BLOCK_TRACKING = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `setBlockTracking` : ``);\nconst PUSH_SCOPE_ID = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `pushScopeId` : ``);\nconst POP_SCOPE_ID = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `popScopeId` : ``);\nconst WITH_CTX = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `withCtx` : ``);\nconst UNREF = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `unref` : ``);\nconst IS_REF = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `isRef` : ``);\nconst WITH_MEMO = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `withMemo` : ``);\nconst IS_MEMO_SAME = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `isMemoSame` : ``);\nconst helperNameMap = {\n  [FRAGMENT]: `Fragment`,\n  [TELEPORT]: `Teleport`,\n  [SUSPENSE]: `Suspense`,\n  [KEEP_ALIVE]: `KeepAlive`,\n  [BASE_TRANSITION]: `BaseTransition`,\n  [OPEN_BLOCK]: `openBlock`,\n  [CREATE_BLOCK]: `createBlock`,\n  [CREATE_ELEMENT_BLOCK]: `createElementBlock`,\n  [CREATE_VNODE]: `createVNode`,\n  [CREATE_ELEMENT_VNODE]: `createElementVNode`,\n  [CREATE_COMMENT]: `createCommentVNode`,\n  [CREATE_TEXT]: `createTextVNode`,\n  [CREATE_STATIC]: `createStaticVNode`,\n  [RESOLVE_COMPONENT]: `resolveComponent`,\n  [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,\n  [RESOLVE_DIRECTIVE]: `resolveDirective`,\n  [RESOLVE_FILTER]: `resolveFilter`,\n  [WITH_DIRECTIVES]: `withDirectives`,\n  [RENDER_LIST]: `renderList`,\n  [RENDER_SLOT]: `renderSlot`,\n  [CREATE_SLOTS]: `createSlots`,\n  [TO_DISPLAY_STRING]: `toDisplayString`,\n  [MERGE_PROPS]: `mergeProps`,\n  [NORMALIZE_CLASS]: `normalizeClass`,\n  [NORMALIZE_STYLE]: `normalizeStyle`,\n  [NORMALIZE_PROPS]: `normalizeProps`,\n  [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,\n  [TO_HANDLERS]: `toHandlers`,\n  [CAMELIZE]: `camelize`,\n  [CAPITALIZE]: `capitalize`,\n  [TO_HANDLER_KEY]: `toHandlerKey`,\n  [SET_BLOCK_TRACKING]: `setBlockTracking`,\n  [PUSH_SCOPE_ID]: `pushScopeId`,\n  [POP_SCOPE_ID]: `popScopeId`,\n  [WITH_CTX]: `withCtx`,\n  [UNREF]: `unref`,\n  [IS_REF]: `isRef`,\n  [WITH_MEMO]: `withMemo`,\n  [IS_MEMO_SAME]: `isMemoSame`\n};\nfunction registerRuntimeHelpers(helpers) {\n  Object.getOwnPropertySymbols(helpers).forEach((s) => {\n    helperNameMap[s] = helpers[s];\n  });\n}\n\nconst locStub = {\n  source: \"\",\n  start: { line: 1, column: 1, offset: 0 },\n  end: { line: 1, column: 1, offset: 0 }\n};\nfunction createRoot(children, loc = locStub) {\n  return {\n    type: 0,\n    children,\n    helpers: /* @__PURE__ */ new Set(),\n    components: [],\n    directives: [],\n    hoists: [],\n    imports: [],\n    cached: 0,\n    temps: 0,\n    codegenNode: void 0,\n    loc\n  };\n}\nfunction createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {\n  if (context) {\n    if (isBlock) {\n      context.helper(OPEN_BLOCK);\n      context.helper(getVNodeBlockHelper(context.inSSR, isComponent));\n    } else {\n      context.helper(getVNodeHelper(context.inSSR, isComponent));\n    }\n    if (directives) {\n      context.helper(WITH_DIRECTIVES);\n    }\n  }\n  return {\n    type: 13,\n    tag,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    directives,\n    isBlock,\n    disableTracking,\n    isComponent,\n    loc\n  };\n}\nfunction createArrayExpression(elements, loc = locStub) {\n  return {\n    type: 17,\n    loc,\n    elements\n  };\n}\nfunction createObjectExpression(properties, loc = locStub) {\n  return {\n    type: 15,\n    loc,\n    properties\n  };\n}\nfunction createObjectProperty(key, value) {\n  return {\n    type: 16,\n    loc: locStub,\n    key: isString(key) ? createSimpleExpression(key, true) : key,\n    value\n  };\n}\nfunction createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) {\n  return {\n    type: 4,\n    loc,\n    content,\n    isStatic,\n    constType: isStatic ? 3 : constType\n  };\n}\nfunction createInterpolation(content, loc) {\n  return {\n    type: 5,\n    loc,\n    content: isString(content) ? createSimpleExpression(content, false, loc) : content\n  };\n}\nfunction createCompoundExpression(children, loc = locStub) {\n  return {\n    type: 8,\n    loc,\n    children\n  };\n}\nfunction createCallExpression(callee, args = [], loc = locStub) {\n  return {\n    type: 14,\n    loc,\n    callee,\n    arguments: args\n  };\n}\nfunction createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) {\n  return {\n    type: 18,\n    params,\n    returns,\n    newline,\n    isSlot,\n    loc\n  };\n}\nfunction createConditionalExpression(test, consequent, alternate, newline = true) {\n  return {\n    type: 19,\n    test,\n    consequent,\n    alternate,\n    newline,\n    loc: locStub\n  };\n}\nfunction createCacheExpression(index, value, isVNode = false) {\n  return {\n    type: 20,\n    index,\n    value,\n    isVNode,\n    loc: locStub\n  };\n}\nfunction createBlockStatement(body) {\n  return {\n    type: 21,\n    body,\n    loc: locStub\n  };\n}\nfunction createTemplateLiteral(elements) {\n  return {\n    type: 22,\n    elements,\n    loc: locStub\n  };\n}\nfunction createIfStatement(test, consequent, alternate) {\n  return {\n    type: 23,\n    test,\n    consequent,\n    alternate,\n    loc: locStub\n  };\n}\nfunction createAssignmentExpression(left, right) {\n  return {\n    type: 24,\n    left,\n    right,\n    loc: locStub\n  };\n}\nfunction createSequenceExpression(expressions) {\n  return {\n    type: 25,\n    expressions,\n    loc: locStub\n  };\n}\nfunction createReturnStatement(returns) {\n  return {\n    type: 26,\n    returns,\n    loc: locStub\n  };\n}\nfunction getVNodeHelper(ssr, isComponent) {\n  return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;\n}\nfunction getVNodeBlockHelper(ssr, isComponent) {\n  return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;\n}\nfunction convertToBlock(node, { helper, removeHelper, inSSR }) {\n  if (!node.isBlock) {\n    node.isBlock = true;\n    removeHelper(getVNodeHelper(inSSR, node.isComponent));\n    helper(OPEN_BLOCK);\n    helper(getVNodeBlockHelper(inSSR, node.isComponent));\n  }\n}\n\nconst isStaticExp = (p) => p.type === 4 && p.isStatic;\nconst isBuiltInType = (tag, expected) => tag === expected || tag === hyphenate(expected);\nfunction isCoreComponent(tag) {\n  if (isBuiltInType(tag, \"Teleport\")) {\n    return TELEPORT;\n  } else if (isBuiltInType(tag, \"Suspense\")) {\n    return SUSPENSE;\n  } else if (isBuiltInType(tag, \"KeepAlive\")) {\n    return KEEP_ALIVE;\n  } else if (isBuiltInType(tag, \"BaseTransition\")) {\n    return BASE_TRANSITION;\n  }\n}\nconst nonIdentifierRE = /^\\d|[^\\$\\w]/;\nconst isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);\nconst validFirstIdentCharRE = /[A-Za-z_$\\xA0-\\uFFFF]/;\nconst validIdentCharRE = /[\\.\\?\\w$\\xA0-\\uFFFF]/;\nconst whitespaceRE = /\\s+[.[]\\s*|\\s*[.[]\\s+/g;\nconst isMemberExpressionBrowser = (path) => {\n  path = path.trim().replace(whitespaceRE, (s) => s.trim());\n  let state = 0 /* inMemberExp */;\n  let stateStack = [];\n  let currentOpenBracketCount = 0;\n  let currentOpenParensCount = 0;\n  let currentStringType = null;\n  for (let i = 0; i < path.length; i++) {\n    const char = path.charAt(i);\n    switch (state) {\n      case 0 /* inMemberExp */:\n        if (char === \"[\") {\n          stateStack.push(state);\n          state = 1 /* inBrackets */;\n          currentOpenBracketCount++;\n        } else if (char === \"(\") {\n          stateStack.push(state);\n          state = 2 /* inParens */;\n          currentOpenParensCount++;\n        } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {\n          return false;\n        }\n        break;\n      case 1 /* inBrackets */:\n        if (char === `'` || char === `\"` || char === \"`\") {\n          stateStack.push(state);\n          state = 3 /* inString */;\n          currentStringType = char;\n        } else if (char === `[`) {\n          currentOpenBracketCount++;\n        } else if (char === `]`) {\n          if (!--currentOpenBracketCount) {\n            state = stateStack.pop();\n          }\n        }\n        break;\n      case 2 /* inParens */:\n        if (char === `'` || char === `\"` || char === \"`\") {\n          stateStack.push(state);\n          state = 3 /* inString */;\n          currentStringType = char;\n        } else if (char === `(`) {\n          currentOpenParensCount++;\n        } else if (char === `)`) {\n          if (i === path.length - 1) {\n            return false;\n          }\n          if (!--currentOpenParensCount) {\n            state = stateStack.pop();\n          }\n        }\n        break;\n      case 3 /* inString */:\n        if (char === currentStringType) {\n          state = stateStack.pop();\n          currentStringType = null;\n        }\n        break;\n    }\n  }\n  return !currentOpenBracketCount && !currentOpenParensCount;\n};\nconst isMemberExpressionNode = NOOP ;\nconst isMemberExpression = isMemberExpressionBrowser ;\nfunction getInnerRange(loc, offset, length) {\n  const source = loc.source.slice(offset, offset + length);\n  const newLoc = {\n    source,\n    start: advancePositionWithClone(loc.start, loc.source, offset),\n    end: loc.end\n  };\n  if (length != null) {\n    newLoc.end = advancePositionWithClone(\n      loc.start,\n      loc.source,\n      offset + length\n    );\n  }\n  return newLoc;\n}\nfunction advancePositionWithClone(pos, source, numberOfCharacters = source.length) {\n  return advancePositionWithMutation(\n    extend({}, pos),\n    source,\n    numberOfCharacters\n  );\n}\nfunction advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {\n  let linesCount = 0;\n  let lastNewLinePos = -1;\n  for (let i = 0; i < numberOfCharacters; i++) {\n    if (source.charCodeAt(i) === 10) {\n      linesCount++;\n      lastNewLinePos = i;\n    }\n  }\n  pos.offset += numberOfCharacters;\n  pos.line += linesCount;\n  pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;\n  return pos;\n}\nfunction assert(condition, msg) {\n  if (!condition) {\n    throw new Error(msg || `unexpected compiler condition`);\n  }\n}\nfunction findDir(node, name, allowEmpty = false) {\n  for (let i = 0; i < node.props.length; i++) {\n    const p = node.props[i];\n    if (p.type === 7 && (allowEmpty || p.exp) && (isString(name) ? p.name === name : name.test(p.name))) {\n      return p;\n    }\n  }\n}\nfunction findProp(node, name, dynamicOnly = false, allowEmpty = false) {\n  for (let i = 0; i < node.props.length; i++) {\n    const p = node.props[i];\n    if (p.type === 6) {\n      if (dynamicOnly)\n        continue;\n      if (p.name === name && (p.value || allowEmpty)) {\n        return p;\n      }\n    } else if (p.name === \"bind\" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) {\n      return p;\n    }\n  }\n}\nfunction isStaticArgOf(arg, name) {\n  return !!(arg && isStaticExp(arg) && arg.content === name);\n}\nfunction hasDynamicKeyVBind(node) {\n  return node.props.some(\n    (p) => p.type === 7 && p.name === \"bind\" && (!p.arg || // v-bind=\"obj\"\n    p.arg.type !== 4 || // v-bind:[_ctx.foo]\n    !p.arg.isStatic)\n    // v-bind:[foo]\n  );\n}\nfunction isText$1(node) {\n  return node.type === 5 || node.type === 2;\n}\nfunction isVSlot(p) {\n  return p.type === 7 && p.name === \"slot\";\n}\nfunction isTemplateNode(node) {\n  return node.type === 1 && node.tagType === 3;\n}\nfunction isSlotOutlet(node) {\n  return node.type === 1 && node.tagType === 2;\n}\nconst propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);\nfunction getUnnormalizedProps(props, callPath = []) {\n  if (props && !isString(props) && props.type === 14) {\n    const callee = props.callee;\n    if (!isString(callee) && propsHelperSet.has(callee)) {\n      return getUnnormalizedProps(\n        props.arguments[0],\n        callPath.concat(props)\n      );\n    }\n  }\n  return [props, callPath];\n}\nfunction injectProp(node, prop, context) {\n  let propsWithInjection;\n  let props = node.type === 13 ? node.props : node.arguments[2];\n  let callPath = [];\n  let parentCall;\n  if (props && !isString(props) && props.type === 14) {\n    const ret = getUnnormalizedProps(props);\n    props = ret[0];\n    callPath = ret[1];\n    parentCall = callPath[callPath.length - 1];\n  }\n  if (props == null || isString(props)) {\n    propsWithInjection = createObjectExpression([prop]);\n  } else if (props.type === 14) {\n    const first = props.arguments[0];\n    if (!isString(first) && first.type === 15) {\n      if (!hasProp(prop, first)) {\n        first.properties.unshift(prop);\n      }\n    } else {\n      if (props.callee === TO_HANDLERS) {\n        propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [\n          createObjectExpression([prop]),\n          props\n        ]);\n      } else {\n        props.arguments.unshift(createObjectExpression([prop]));\n      }\n    }\n    !propsWithInjection && (propsWithInjection = props);\n  } else if (props.type === 15) {\n    if (!hasProp(prop, props)) {\n      props.properties.unshift(prop);\n    }\n    propsWithInjection = props;\n  } else {\n    propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [\n      createObjectExpression([prop]),\n      props\n    ]);\n    if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {\n      parentCall = callPath[callPath.length - 2];\n    }\n  }\n  if (node.type === 13) {\n    if (parentCall) {\n      parentCall.arguments[0] = propsWithInjection;\n    } else {\n      node.props = propsWithInjection;\n    }\n  } else {\n    if (parentCall) {\n      parentCall.arguments[0] = propsWithInjection;\n    } else {\n      node.arguments[2] = propsWithInjection;\n    }\n  }\n}\nfunction hasProp(prop, props) {\n  let result = false;\n  if (prop.key.type === 4) {\n    const propKeyName = prop.key.content;\n    result = props.properties.some(\n      (p) => p.key.type === 4 && p.key.content === propKeyName\n    );\n  }\n  return result;\n}\nfunction toValidAssetId(name, type) {\n  return `_${type}_${name.replace(/[^\\w]/g, (searchValue, replaceValue) => {\n    return searchValue === \"-\" ? \"_\" : name.charCodeAt(replaceValue).toString();\n  })}`;\n}\nfunction hasScopeRef(node, ids) {\n  if (!node || Object.keys(ids).length === 0) {\n    return false;\n  }\n  switch (node.type) {\n    case 1:\n      for (let i = 0; i < node.props.length; i++) {\n        const p = node.props[i];\n        if (p.type === 7 && (hasScopeRef(p.arg, ids) || hasScopeRef(p.exp, ids))) {\n          return true;\n        }\n      }\n      return node.children.some((c) => hasScopeRef(c, ids));\n    case 11:\n      if (hasScopeRef(node.source, ids)) {\n        return true;\n      }\n      return node.children.some((c) => hasScopeRef(c, ids));\n    case 9:\n      return node.branches.some((b) => hasScopeRef(b, ids));\n    case 10:\n      if (hasScopeRef(node.condition, ids)) {\n        return true;\n      }\n      return node.children.some((c) => hasScopeRef(c, ids));\n    case 4:\n      return !node.isStatic && isSimpleIdentifier(node.content) && !!ids[node.content];\n    case 8:\n      return node.children.some((c) => isObject(c) && hasScopeRef(c, ids));\n    case 5:\n    case 12:\n      return hasScopeRef(node.content, ids);\n    case 2:\n    case 3:\n      return false;\n    default:\n      if (!!(process.env.NODE_ENV !== \"production\")) ;\n      return false;\n  }\n}\nfunction getMemoedVNodeCall(node) {\n  if (node.type === 14 && node.callee === WITH_MEMO) {\n    return node.arguments[1].returns;\n  } else {\n    return node;\n  }\n}\n\nconst deprecationData = {\n  [\"COMPILER_IS_ON_ELEMENT\"]: {\n    message: `Platform-native elements with \"is\" prop will no longer be treated as components in Vue 3 unless the \"is\" value is explicitly prefixed with \"vue:\".`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html`\n  },\n  [\"COMPILER_V_BIND_SYNC\"]: {\n    message: (key) => `.sync modifier for v-bind has been removed. Use v-model with argument instead. \\`v-bind:${key}.sync\\` should be changed to \\`v-model:${key}\\`.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-model.html`\n  },\n  [\"COMPILER_V_BIND_PROP\"]: {\n    message: `.prop modifier for v-bind has been removed and no longer necessary. Vue 3 will automatically set a binding as DOM property when appropriate.`\n  },\n  [\"COMPILER_V_BIND_OBJECT_ORDER\"]: {\n    message: `v-bind=\"obj\" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-bind.html`\n  },\n  [\"COMPILER_V_ON_NATIVE\"]: {\n    message: `.native modifier for v-on has been removed as is no longer necessary.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html`\n  },\n  [\"COMPILER_V_IF_V_FOR_PRECEDENCE\"]: {\n    message: `v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with <template> tags or use a computed property that filters v-for data source.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-if-v-for.html`\n  },\n  [\"COMPILER_NATIVE_TEMPLATE\"]: {\n    message: `<template> with no special directives will render as a native template element instead of its inner content in Vue 3.`\n  },\n  [\"COMPILER_INLINE_TEMPLATE\"]: {\n    message: `\"inline-template\" has been removed in Vue 3.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/inline-template-attribute.html`\n  },\n  [\"COMPILER_FILTER\"]: {\n    message: `filters have been removed in Vue 3. The \"|\" symbol will be treated as native JavaScript bitwise OR operator. Use method calls or computed properties instead.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/filters.html`\n  }\n};\nfunction getCompatValue(key, context) {\n  const config = context.options ? context.options.compatConfig : context.compatConfig;\n  const value = config && config[key];\n  if (key === \"MODE\") {\n    return value || 3;\n  } else {\n    return value;\n  }\n}\nfunction isCompatEnabled(key, context) {\n  const mode = getCompatValue(\"MODE\", context);\n  const value = getCompatValue(key, context);\n  return mode === 3 ? value === true : value !== false;\n}\nfunction checkCompatEnabled(key, context, loc, ...args) {\n  const enabled = isCompatEnabled(key, context);\n  if (!!(process.env.NODE_ENV !== \"production\") && enabled) {\n    warnDeprecation(key, context, loc, ...args);\n  }\n  return enabled;\n}\nfunction warnDeprecation(key, context, loc, ...args) {\n  const val = getCompatValue(key, context);\n  if (val === \"suppress-warning\") {\n    return;\n  }\n  const { message, link } = deprecationData[key];\n  const msg = `(deprecation ${key}) ${typeof message === \"function\" ? message(...args) : message}${link ? `\n  Details: ${link}` : ``}`;\n  const err = new SyntaxError(msg);\n  err.code = key;\n  if (loc)\n    err.loc = loc;\n  context.onWarn(err);\n}\n\nconst decodeRE = /&(gt|lt|amp|apos|quot);/g;\nconst decodeMap = {\n  gt: \">\",\n  lt: \"<\",\n  amp: \"&\",\n  apos: \"'\",\n  quot: '\"'\n};\nconst defaultParserOptions = {\n  delimiters: [`{{`, `}}`],\n  getNamespace: () => 0,\n  getTextMode: () => 0,\n  isVoidTag: NO,\n  isPreTag: NO,\n  isCustomElement: NO,\n  decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),\n  onError: defaultOnError,\n  onWarn: defaultOnWarn,\n  comments: !!(process.env.NODE_ENV !== \"production\")\n};\nfunction baseParse(content, options = {}) {\n  const context = createParserContext(content, options);\n  const start = getCursor(context);\n  return createRoot(\n    parseChildren(context, 0, []),\n    getSelection(context, start)\n  );\n}\nfunction createParserContext(content, rawOptions) {\n  const options = extend({}, defaultParserOptions);\n  let key;\n  for (key in rawOptions) {\n    options[key] = rawOptions[key] === void 0 ? defaultParserOptions[key] : rawOptions[key];\n  }\n  return {\n    options,\n    column: 1,\n    line: 1,\n    offset: 0,\n    originalSource: content,\n    source: content,\n    inPre: false,\n    inVPre: false,\n    onWarn: options.onWarn\n  };\n}\nfunction parseChildren(context, mode, ancestors) {\n  const parent = last(ancestors);\n  const ns = parent ? parent.ns : 0;\n  const nodes = [];\n  while (!isEnd(context, mode, ancestors)) {\n    const s = context.source;\n    let node = void 0;\n    if (mode === 0 || mode === 1) {\n      if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {\n        node = parseInterpolation(context, mode);\n      } else if (mode === 0 && s[0] === \"<\") {\n        if (s.length === 1) {\n          emitError(context, 5, 1);\n        } else if (s[1] === \"!\") {\n          if (startsWith(s, \"<!--\")) {\n            node = parseComment(context);\n          } else if (startsWith(s, \"<!DOCTYPE\")) {\n            node = parseBogusComment(context);\n          } else if (startsWith(s, \"<![CDATA[\")) {\n            if (ns !== 0) {\n              node = parseCDATA(context, ancestors);\n            } else {\n              emitError(context, 1);\n              node = parseBogusComment(context);\n            }\n          } else {\n            emitError(context, 11);\n            node = parseBogusComment(context);\n          }\n        } else if (s[1] === \"/\") {\n          if (s.length === 2) {\n            emitError(context, 5, 2);\n          } else if (s[2] === \">\") {\n            emitError(context, 14, 2);\n            advanceBy(context, 3);\n            continue;\n          } else if (/[a-z]/i.test(s[2])) {\n            emitError(context, 23);\n            parseTag(context, TagType.End, parent);\n            continue;\n          } else {\n            emitError(\n              context,\n              12,\n              2\n            );\n            node = parseBogusComment(context);\n          }\n        } else if (/[a-z]/i.test(s[1])) {\n          node = parseElement(context, ancestors);\n          if (isCompatEnabled(\n            \"COMPILER_NATIVE_TEMPLATE\",\n            context\n          ) && node && node.tag === \"template\" && !node.props.some(\n            (p) => p.type === 7 && isSpecialTemplateDirective(p.name)\n          )) {\n            !!(process.env.NODE_ENV !== \"production\") && warnDeprecation(\n              \"COMPILER_NATIVE_TEMPLATE\",\n              context,\n              node.loc\n            );\n            node = node.children;\n          }\n        } else if (s[1] === \"?\") {\n          emitError(\n            context,\n            21,\n            1\n          );\n          node = parseBogusComment(context);\n        } else {\n          emitError(context, 12, 1);\n        }\n      }\n    }\n    if (!node) {\n      node = parseText(context, mode);\n    }\n    if (isArray(node)) {\n      for (let i = 0; i < node.length; i++) {\n        pushNode(nodes, node[i]);\n      }\n    } else {\n      pushNode(nodes, node);\n    }\n  }\n  let removedWhitespace = false;\n  if (mode !== 2 && mode !== 1) {\n    const shouldCondense = context.options.whitespace !== \"preserve\";\n    for (let i = 0; i < nodes.length; i++) {\n      const node = nodes[i];\n      if (node.type === 2) {\n        if (!context.inPre) {\n          if (!/[^\\t\\r\\n\\f ]/.test(node.content)) {\n            const prev = nodes[i - 1];\n            const next = nodes[i + 1];\n            if (!prev || !next || shouldCondense && (prev.type === 3 && next.type === 3 || prev.type === 3 && next.type === 1 || prev.type === 1 && next.type === 3 || prev.type === 1 && next.type === 1 && /[\\r\\n]/.test(node.content))) {\n              removedWhitespace = true;\n              nodes[i] = null;\n            } else {\n              node.content = \" \";\n            }\n          } else if (shouldCondense) {\n            node.content = node.content.replace(/[\\t\\r\\n\\f ]+/g, \" \");\n          }\n        } else {\n          node.content = node.content.replace(/\\r\\n/g, \"\\n\");\n        }\n      } else if (node.type === 3 && !context.options.comments) {\n        removedWhitespace = true;\n        nodes[i] = null;\n      }\n    }\n    if (context.inPre && parent && context.options.isPreTag(parent.tag)) {\n      const first = nodes[0];\n      if (first && first.type === 2) {\n        first.content = first.content.replace(/^\\r?\\n/, \"\");\n      }\n    }\n  }\n  return removedWhitespace ? nodes.filter(Boolean) : nodes;\n}\nfunction pushNode(nodes, node) {\n  if (node.type === 2) {\n    const prev = last(nodes);\n    if (prev && prev.type === 2 && prev.loc.end.offset === node.loc.start.offset) {\n      prev.content += node.content;\n      prev.loc.end = node.loc.end;\n      prev.loc.source += node.loc.source;\n      return;\n    }\n  }\n  nodes.push(node);\n}\nfunction parseCDATA(context, ancestors) {\n  advanceBy(context, 9);\n  const nodes = parseChildren(context, 3, ancestors);\n  if (context.source.length === 0) {\n    emitError(context, 6);\n  } else {\n    advanceBy(context, 3);\n  }\n  return nodes;\n}\nfunction parseComment(context) {\n  const start = getCursor(context);\n  let content;\n  const match = /--(\\!)?>/.exec(context.source);\n  if (!match) {\n    content = context.source.slice(4);\n    advanceBy(context, context.source.length);\n    emitError(context, 7);\n  } else {\n    if (match.index <= 3) {\n      emitError(context, 0);\n    }\n    if (match[1]) {\n      emitError(context, 10);\n    }\n    content = context.source.slice(4, match.index);\n    const s = context.source.slice(0, match.index);\n    let prevIndex = 1, nestedIndex = 0;\n    while ((nestedIndex = s.indexOf(\"<!--\", prevIndex)) !== -1) {\n      advanceBy(context, nestedIndex - prevIndex + 1);\n      if (nestedIndex + 4 < s.length) {\n        emitError(context, 16);\n      }\n      prevIndex = nestedIndex + 1;\n    }\n    advanceBy(context, match.index + match[0].length - prevIndex + 1);\n  }\n  return {\n    type: 3,\n    content,\n    loc: getSelection(context, start)\n  };\n}\nfunction parseBogusComment(context) {\n  const start = getCursor(context);\n  const contentStart = context.source[1] === \"?\" ? 1 : 2;\n  let content;\n  const closeIndex = context.source.indexOf(\">\");\n  if (closeIndex === -1) {\n    content = context.source.slice(contentStart);\n    advanceBy(context, context.source.length);\n  } else {\n    content = context.source.slice(contentStart, closeIndex);\n    advanceBy(context, closeIndex + 1);\n  }\n  return {\n    type: 3,\n    content,\n    loc: getSelection(context, start)\n  };\n}\nfunction parseElement(context, ancestors) {\n  const wasInPre = context.inPre;\n  const wasInVPre = context.inVPre;\n  const parent = last(ancestors);\n  const element = parseTag(context, TagType.Start, parent);\n  const isPreBoundary = context.inPre && !wasInPre;\n  const isVPreBoundary = context.inVPre && !wasInVPre;\n  if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {\n    if (isPreBoundary) {\n      context.inPre = false;\n    }\n    if (isVPreBoundary) {\n      context.inVPre = false;\n    }\n    return element;\n  }\n  ancestors.push(element);\n  const mode = context.options.getTextMode(element, parent);\n  const children = parseChildren(context, mode, ancestors);\n  ancestors.pop();\n  {\n    const inlineTemplateProp = element.props.find(\n      (p) => p.type === 6 && p.name === \"inline-template\"\n    );\n    if (inlineTemplateProp && checkCompatEnabled(\n      \"COMPILER_INLINE_TEMPLATE\",\n      context,\n      inlineTemplateProp.loc\n    )) {\n      const loc = getSelection(context, element.loc.end);\n      inlineTemplateProp.value = {\n        type: 2,\n        content: loc.source,\n        loc\n      };\n    }\n  }\n  element.children = children;\n  if (startsWithEndTagOpen(context.source, element.tag)) {\n    parseTag(context, TagType.End, parent);\n  } else {\n    emitError(context, 24, 0, element.loc.start);\n    if (context.source.length === 0 && element.tag.toLowerCase() === \"script\") {\n      const first = children[0];\n      if (first && startsWith(first.loc.source, \"<!--\")) {\n        emitError(context, 8);\n      }\n    }\n  }\n  element.loc = getSelection(context, element.loc.start);\n  if (isPreBoundary) {\n    context.inPre = false;\n  }\n  if (isVPreBoundary) {\n    context.inVPre = false;\n  }\n  return element;\n}\nvar TagType = /* @__PURE__ */ ((TagType2) => {\n  TagType2[TagType2[\"Start\"] = 0] = \"Start\";\n  TagType2[TagType2[\"End\"] = 1] = \"End\";\n  return TagType2;\n})(TagType || {});\nconst isSpecialTemplateDirective = /* @__PURE__ */ makeMap(\n  `if,else,else-if,for,slot`\n);\nfunction parseTag(context, type, parent) {\n  const start = getCursor(context);\n  const match = /^<\\/?([a-z][^\\t\\r\\n\\f />]*)/i.exec(context.source);\n  const tag = match[1];\n  const ns = context.options.getNamespace(tag, parent);\n  advanceBy(context, match[0].length);\n  advanceSpaces(context);\n  const cursor = getCursor(context);\n  const currentSource = context.source;\n  if (context.options.isPreTag(tag)) {\n    context.inPre = true;\n  }\n  let props = parseAttributes(context, type);\n  if (type === 0 /* Start */ && !context.inVPre && props.some((p) => p.type === 7 && p.name === \"pre\")) {\n    context.inVPre = true;\n    extend(context, cursor);\n    context.source = currentSource;\n    props = parseAttributes(context, type).filter((p) => p.name !== \"v-pre\");\n  }\n  let isSelfClosing = false;\n  if (context.source.length === 0) {\n    emitError(context, 9);\n  } else {\n    isSelfClosing = startsWith(context.source, \"/>\");\n    if (type === 1 /* End */ && isSelfClosing) {\n      emitError(context, 4);\n    }\n    advanceBy(context, isSelfClosing ? 2 : 1);\n  }\n  if (type === 1 /* End */) {\n    return;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && isCompatEnabled(\n    \"COMPILER_V_IF_V_FOR_PRECEDENCE\",\n    context\n  )) {\n    let hasIf = false;\n    let hasFor = false;\n    for (let i = 0; i < props.length; i++) {\n      const p = props[i];\n      if (p.type === 7) {\n        if (p.name === \"if\") {\n          hasIf = true;\n        } else if (p.name === \"for\") {\n          hasFor = true;\n        }\n      }\n      if (hasIf && hasFor) {\n        warnDeprecation(\n          \"COMPILER_V_IF_V_FOR_PRECEDENCE\",\n          context,\n          getSelection(context, start)\n        );\n        break;\n      }\n    }\n  }\n  let tagType = 0;\n  if (!context.inVPre) {\n    if (tag === \"slot\") {\n      tagType = 2;\n    } else if (tag === \"template\") {\n      if (props.some(\n        (p) => p.type === 7 && isSpecialTemplateDirective(p.name)\n      )) {\n        tagType = 3;\n      }\n    } else if (isComponent(tag, props, context)) {\n      tagType = 1;\n    }\n  }\n  return {\n    type: 1,\n    ns,\n    tag,\n    tagType,\n    props,\n    isSelfClosing,\n    children: [],\n    loc: getSelection(context, start),\n    codegenNode: void 0\n    // to be created during transform phase\n  };\n}\nfunction isComponent(tag, props, context) {\n  const options = context.options;\n  if (options.isCustomElement(tag)) {\n    return false;\n  }\n  if (tag === \"component\" || /^[A-Z]/.test(tag) || isCoreComponent(tag) || options.isBuiltInComponent && options.isBuiltInComponent(tag) || options.isNativeTag && !options.isNativeTag(tag)) {\n    return true;\n  }\n  for (let i = 0; i < props.length; i++) {\n    const p = props[i];\n    if (p.type === 6) {\n      if (p.name === \"is\" && p.value) {\n        if (p.value.content.startsWith(\"vue:\")) {\n          return true;\n        } else if (checkCompatEnabled(\n          \"COMPILER_IS_ON_ELEMENT\",\n          context,\n          p.loc\n        )) {\n          return true;\n        }\n      }\n    } else {\n      if (p.name === \"is\") {\n        return true;\n      } else if (\n        // :is on plain element - only treat as component in compat mode\n        p.name === \"bind\" && isStaticArgOf(p.arg, \"is\") && true && checkCompatEnabled(\n          \"COMPILER_IS_ON_ELEMENT\",\n          context,\n          p.loc\n        )\n      ) {\n        return true;\n      }\n    }\n  }\n}\nfunction parseAttributes(context, type) {\n  const props = [];\n  const attributeNames = /* @__PURE__ */ new Set();\n  while (context.source.length > 0 && !startsWith(context.source, \">\") && !startsWith(context.source, \"/>\")) {\n    if (startsWith(context.source, \"/\")) {\n      emitError(context, 22);\n      advanceBy(context, 1);\n      advanceSpaces(context);\n      continue;\n    }\n    if (type === 1 /* End */) {\n      emitError(context, 3);\n    }\n    const attr = parseAttribute(context, attributeNames);\n    if (attr.type === 6 && attr.value && attr.name === \"class\") {\n      attr.value.content = attr.value.content.replace(/\\s+/g, \" \").trim();\n    }\n    if (type === 0 /* Start */) {\n      props.push(attr);\n    }\n    if (/^[^\\t\\r\\n\\f />]/.test(context.source)) {\n      emitError(context, 15);\n    }\n    advanceSpaces(context);\n  }\n  return props;\n}\nfunction parseAttribute(context, nameSet) {\n  var _a;\n  const start = getCursor(context);\n  const match = /^[^\\t\\r\\n\\f />][^\\t\\r\\n\\f />=]*/.exec(context.source);\n  const name = match[0];\n  if (nameSet.has(name)) {\n    emitError(context, 2);\n  }\n  nameSet.add(name);\n  if (name[0] === \"=\") {\n    emitError(context, 19);\n  }\n  {\n    const pattern = /[\"'<]/g;\n    let m;\n    while (m = pattern.exec(name)) {\n      emitError(\n        context,\n        17,\n        m.index\n      );\n    }\n  }\n  advanceBy(context, name.length);\n  let value = void 0;\n  if (/^[\\t\\r\\n\\f ]*=/.test(context.source)) {\n    advanceSpaces(context);\n    advanceBy(context, 1);\n    advanceSpaces(context);\n    value = parseAttributeValue(context);\n    if (!value) {\n      emitError(context, 13);\n    }\n  }\n  const loc = getSelection(context, start);\n  if (!context.inVPre && /^(v-[A-Za-z0-9-]|:|\\.|@|#)/.test(name)) {\n    const match2 = /(?:^v-([a-z0-9-]+))?(?:(?::|^\\.|^@|^#)(\\[[^\\]]+\\]|[^\\.]+))?(.+)?$/i.exec(\n      name\n    );\n    let isPropShorthand = startsWith(name, \".\");\n    let dirName = match2[1] || (isPropShorthand || startsWith(name, \":\") ? \"bind\" : startsWith(name, \"@\") ? \"on\" : \"slot\");\n    let arg;\n    if (match2[2]) {\n      const isSlot = dirName === \"slot\";\n      const startOffset = name.lastIndexOf(\n        match2[2],\n        name.length - (((_a = match2[3]) == null ? void 0 : _a.length) || 0)\n      );\n      const loc2 = getSelection(\n        context,\n        getNewPosition(context, start, startOffset),\n        getNewPosition(\n          context,\n          start,\n          startOffset + match2[2].length + (isSlot && match2[3] || \"\").length\n        )\n      );\n      let content = match2[2];\n      let isStatic = true;\n      if (content.startsWith(\"[\")) {\n        isStatic = false;\n        if (!content.endsWith(\"]\")) {\n          emitError(\n            context,\n            27\n          );\n          content = content.slice(1);\n        } else {\n          content = content.slice(1, content.length - 1);\n        }\n      } else if (isSlot) {\n        content += match2[3] || \"\";\n      }\n      arg = {\n        type: 4,\n        content,\n        isStatic,\n        constType: isStatic ? 3 : 0,\n        loc: loc2\n      };\n    }\n    if (value && value.isQuoted) {\n      const valueLoc = value.loc;\n      valueLoc.start.offset++;\n      valueLoc.start.column++;\n      valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);\n      valueLoc.source = valueLoc.source.slice(1, -1);\n    }\n    const modifiers = match2[3] ? match2[3].slice(1).split(\".\") : [];\n    if (isPropShorthand)\n      modifiers.push(\"prop\");\n    if (dirName === \"bind\" && arg) {\n      if (modifiers.includes(\"sync\") && checkCompatEnabled(\n        \"COMPILER_V_BIND_SYNC\",\n        context,\n        loc,\n        arg.loc.source\n      )) {\n        dirName = \"model\";\n        modifiers.splice(modifiers.indexOf(\"sync\"), 1);\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && modifiers.includes(\"prop\")) {\n        checkCompatEnabled(\n          \"COMPILER_V_BIND_PROP\",\n          context,\n          loc\n        );\n      }\n    }\n    return {\n      type: 7,\n      name: dirName,\n      exp: value && {\n        type: 4,\n        content: value.content,\n        isStatic: false,\n        // Treat as non-constant by default. This can be potentially set to\n        // other values by `transformExpression` to make it eligible for hoisting.\n        constType: 0,\n        loc: value.loc\n      },\n      arg,\n      modifiers,\n      loc\n    };\n  }\n  if (!context.inVPre && startsWith(name, \"v-\")) {\n    emitError(context, 26);\n  }\n  return {\n    type: 6,\n    name,\n    value: value && {\n      type: 2,\n      content: value.content,\n      loc: value.loc\n    },\n    loc\n  };\n}\nfunction parseAttributeValue(context) {\n  const start = getCursor(context);\n  let content;\n  const quote = context.source[0];\n  const isQuoted = quote === `\"` || quote === `'`;\n  if (isQuoted) {\n    advanceBy(context, 1);\n    const endIndex = context.source.indexOf(quote);\n    if (endIndex === -1) {\n      content = parseTextData(\n        context,\n        context.source.length,\n        4\n      );\n    } else {\n      content = parseTextData(context, endIndex, 4);\n      advanceBy(context, 1);\n    }\n  } else {\n    const match = /^[^\\t\\r\\n\\f >]+/.exec(context.source);\n    if (!match) {\n      return void 0;\n    }\n    const unexpectedChars = /[\"'<=`]/g;\n    let m;\n    while (m = unexpectedChars.exec(match[0])) {\n      emitError(\n        context,\n        18,\n        m.index\n      );\n    }\n    content = parseTextData(context, match[0].length, 4);\n  }\n  return { content, isQuoted, loc: getSelection(context, start) };\n}\nfunction parseInterpolation(context, mode) {\n  const [open, close] = context.options.delimiters;\n  const closeIndex = context.source.indexOf(close, open.length);\n  if (closeIndex === -1) {\n    emitError(context, 25);\n    return void 0;\n  }\n  const start = getCursor(context);\n  advanceBy(context, open.length);\n  const innerStart = getCursor(context);\n  const innerEnd = getCursor(context);\n  const rawContentLength = closeIndex - open.length;\n  const rawContent = context.source.slice(0, rawContentLength);\n  const preTrimContent = parseTextData(context, rawContentLength, mode);\n  const content = preTrimContent.trim();\n  const startOffset = preTrimContent.indexOf(content);\n  if (startOffset > 0) {\n    advancePositionWithMutation(innerStart, rawContent, startOffset);\n  }\n  const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);\n  advancePositionWithMutation(innerEnd, rawContent, endOffset);\n  advanceBy(context, close.length);\n  return {\n    type: 5,\n    content: {\n      type: 4,\n      isStatic: false,\n      // Set `isConstant` to false by default and will decide in transformExpression\n      constType: 0,\n      content,\n      loc: getSelection(context, innerStart, innerEnd)\n    },\n    loc: getSelection(context, start)\n  };\n}\nfunction parseText(context, mode) {\n  const endTokens = mode === 3 ? [\"]]>\"] : [\"<\", context.options.delimiters[0]];\n  let endIndex = context.source.length;\n  for (let i = 0; i < endTokens.length; i++) {\n    const index = context.source.indexOf(endTokens[i], 1);\n    if (index !== -1 && endIndex > index) {\n      endIndex = index;\n    }\n  }\n  const start = getCursor(context);\n  const content = parseTextData(context, endIndex, mode);\n  return {\n    type: 2,\n    content,\n    loc: getSelection(context, start)\n  };\n}\nfunction parseTextData(context, length, mode) {\n  const rawText = context.source.slice(0, length);\n  advanceBy(context, length);\n  if (mode === 2 || mode === 3 || !rawText.includes(\"&\")) {\n    return rawText;\n  } else {\n    return context.options.decodeEntities(\n      rawText,\n      mode === 4\n    );\n  }\n}\nfunction getCursor(context) {\n  const { column, line, offset } = context;\n  return { column, line, offset };\n}\nfunction getSelection(context, start, end) {\n  end = end || getCursor(context);\n  return {\n    start,\n    end,\n    source: context.originalSource.slice(start.offset, end.offset)\n  };\n}\nfunction last(xs) {\n  return xs[xs.length - 1];\n}\nfunction startsWith(source, searchString) {\n  return source.startsWith(searchString);\n}\nfunction advanceBy(context, numberOfCharacters) {\n  const { source } = context;\n  advancePositionWithMutation(context, source, numberOfCharacters);\n  context.source = source.slice(numberOfCharacters);\n}\nfunction advanceSpaces(context) {\n  const match = /^[\\t\\r\\n\\f ]+/.exec(context.source);\n  if (match) {\n    advanceBy(context, match[0].length);\n  }\n}\nfunction getNewPosition(context, start, numberOfCharacters) {\n  return advancePositionWithClone(\n    start,\n    context.originalSource.slice(start.offset, numberOfCharacters),\n    numberOfCharacters\n  );\n}\nfunction emitError(context, code, offset, loc = getCursor(context)) {\n  if (offset) {\n    loc.offset += offset;\n    loc.column += offset;\n  }\n  context.options.onError(\n    createCompilerError(code, {\n      start: loc,\n      end: loc,\n      source: \"\"\n    })\n  );\n}\nfunction isEnd(context, mode, ancestors) {\n  const s = context.source;\n  switch (mode) {\n    case 0:\n      if (startsWith(s, \"</\")) {\n        for (let i = ancestors.length - 1; i >= 0; --i) {\n          if (startsWithEndTagOpen(s, ancestors[i].tag)) {\n            return true;\n          }\n        }\n      }\n      break;\n    case 1:\n    case 2: {\n      const parent = last(ancestors);\n      if (parent && startsWithEndTagOpen(s, parent.tag)) {\n        return true;\n      }\n      break;\n    }\n    case 3:\n      if (startsWith(s, \"]]>\")) {\n        return true;\n      }\n      break;\n  }\n  return !s;\n}\nfunction startsWithEndTagOpen(source, tag) {\n  return startsWith(source, \"</\") && source.slice(2, 2 + tag.length).toLowerCase() === tag.toLowerCase() && /[\\t\\r\\n\\f />]/.test(source[2 + tag.length] || \">\");\n}\n\nfunction hoistStatic(root, context) {\n  walk(\n    root,\n    context,\n    // Root node is unfortunately non-hoistable due to potential parent\n    // fallthrough attributes.\n    isSingleElementRoot(root, root.children[0])\n  );\n}\nfunction isSingleElementRoot(root, child) {\n  const { children } = root;\n  return children.length === 1 && child.type === 1 && !isSlotOutlet(child);\n}\nfunction walk(node, context, doNotHoistNode = false) {\n  const { children } = node;\n  const originalCount = children.length;\n  let hoistedCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (child.type === 1 && child.tagType === 0) {\n      const constantType = doNotHoistNode ? 0 : getConstantType(child, context);\n      if (constantType > 0) {\n        if (constantType >= 2) {\n          child.codegenNode.patchFlag = -1 + (!!(process.env.NODE_ENV !== \"production\") ? ` /* HOISTED */` : ``);\n          child.codegenNode = context.hoist(child.codegenNode);\n          hoistedCount++;\n          continue;\n        }\n      } else {\n        const codegenNode = child.codegenNode;\n        if (codegenNode.type === 13) {\n          const flag = getPatchFlag(codegenNode);\n          if ((!flag || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) {\n            const props = getNodeProps(child);\n            if (props) {\n              codegenNode.props = context.hoist(props);\n            }\n          }\n          if (codegenNode.dynamicProps) {\n            codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);\n          }\n        }\n      }\n    }\n    if (child.type === 1) {\n      const isComponent = child.tagType === 1;\n      if (isComponent) {\n        context.scopes.vSlot++;\n      }\n      walk(child, context);\n      if (isComponent) {\n        context.scopes.vSlot--;\n      }\n    } else if (child.type === 11) {\n      walk(child, context, child.children.length === 1);\n    } else if (child.type === 9) {\n      for (let i2 = 0; i2 < child.branches.length; i2++) {\n        walk(\n          child.branches[i2],\n          context,\n          child.branches[i2].children.length === 1\n        );\n      }\n    }\n  }\n  if (hoistedCount && context.transformHoist) {\n    context.transformHoist(children, context, node);\n  }\n  if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && isArray(node.codegenNode.children)) {\n    node.codegenNode.children = context.hoist(\n      createArrayExpression(node.codegenNode.children)\n    );\n  }\n}\nfunction getConstantType(node, context) {\n  const { constantCache } = context;\n  switch (node.type) {\n    case 1:\n      if (node.tagType !== 0) {\n        return 0;\n      }\n      const cached = constantCache.get(node);\n      if (cached !== void 0) {\n        return cached;\n      }\n      const codegenNode = node.codegenNode;\n      if (codegenNode.type !== 13) {\n        return 0;\n      }\n      if (codegenNode.isBlock && node.tag !== \"svg\" && node.tag !== \"foreignObject\") {\n        return 0;\n      }\n      const flag = getPatchFlag(codegenNode);\n      if (!flag) {\n        let returnType2 = 3;\n        const generatedPropsType = getGeneratedPropsConstantType(node, context);\n        if (generatedPropsType === 0) {\n          constantCache.set(node, 0);\n          return 0;\n        }\n        if (generatedPropsType < returnType2) {\n          returnType2 = generatedPropsType;\n        }\n        for (let i = 0; i < node.children.length; i++) {\n          const childType = getConstantType(node.children[i], context);\n          if (childType === 0) {\n            constantCache.set(node, 0);\n            return 0;\n          }\n          if (childType < returnType2) {\n            returnType2 = childType;\n          }\n        }\n        if (returnType2 > 1) {\n          for (let i = 0; i < node.props.length; i++) {\n            const p = node.props[i];\n            if (p.type === 7 && p.name === \"bind\" && p.exp) {\n              const expType = getConstantType(p.exp, context);\n              if (expType === 0) {\n                constantCache.set(node, 0);\n                return 0;\n              }\n              if (expType < returnType2) {\n                returnType2 = expType;\n              }\n            }\n          }\n        }\n        if (codegenNode.isBlock) {\n          for (let i = 0; i < node.props.length; i++) {\n            const p = node.props[i];\n            if (p.type === 7) {\n              constantCache.set(node, 0);\n              return 0;\n            }\n          }\n          context.removeHelper(OPEN_BLOCK);\n          context.removeHelper(\n            getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)\n          );\n          codegenNode.isBlock = false;\n          context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));\n        }\n        constantCache.set(node, returnType2);\n        return returnType2;\n      } else {\n        constantCache.set(node, 0);\n        return 0;\n      }\n    case 2:\n    case 3:\n      return 3;\n    case 9:\n    case 11:\n    case 10:\n      return 0;\n    case 5:\n    case 12:\n      return getConstantType(node.content, context);\n    case 4:\n      return node.constType;\n    case 8:\n      let returnType = 3;\n      for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i];\n        if (isString(child) || isSymbol(child)) {\n          continue;\n        }\n        const childType = getConstantType(child, context);\n        if (childType === 0) {\n          return 0;\n        } else if (childType < returnType) {\n          returnType = childType;\n        }\n      }\n      return returnType;\n    default:\n      if (!!(process.env.NODE_ENV !== \"production\")) ;\n      return 0;\n  }\n}\nconst allowHoistedHelperSet = /* @__PURE__ */ new Set([\n  NORMALIZE_CLASS,\n  NORMALIZE_STYLE,\n  NORMALIZE_PROPS,\n  GUARD_REACTIVE_PROPS\n]);\nfunction getConstantTypeOfHelperCall(value, context) {\n  if (value.type === 14 && !isString(value.callee) && allowHoistedHelperSet.has(value.callee)) {\n    const arg = value.arguments[0];\n    if (arg.type === 4) {\n      return getConstantType(arg, context);\n    } else if (arg.type === 14) {\n      return getConstantTypeOfHelperCall(arg, context);\n    }\n  }\n  return 0;\n}\nfunction getGeneratedPropsConstantType(node, context) {\n  let returnType = 3;\n  const props = getNodeProps(node);\n  if (props && props.type === 15) {\n    const { properties } = props;\n    for (let i = 0; i < properties.length; i++) {\n      const { key, value } = properties[i];\n      const keyType = getConstantType(key, context);\n      if (keyType === 0) {\n        return keyType;\n      }\n      if (keyType < returnType) {\n        returnType = keyType;\n      }\n      let valueType;\n      if (value.type === 4) {\n        valueType = getConstantType(value, context);\n      } else if (value.type === 14) {\n        valueType = getConstantTypeOfHelperCall(value, context);\n      } else {\n        valueType = 0;\n      }\n      if (valueType === 0) {\n        return valueType;\n      }\n      if (valueType < returnType) {\n        returnType = valueType;\n      }\n    }\n  }\n  return returnType;\n}\nfunction getNodeProps(node) {\n  const codegenNode = node.codegenNode;\n  if (codegenNode.type === 13) {\n    return codegenNode.props;\n  }\n}\nfunction getPatchFlag(node) {\n  const flag = node.patchFlag;\n  return flag ? parseInt(flag, 10) : void 0;\n}\n\nfunction createTransformContext(root, {\n  filename = \"\",\n  prefixIdentifiers = false,\n  hoistStatic: hoistStatic2 = false,\n  cacheHandlers = false,\n  nodeTransforms = [],\n  directiveTransforms = {},\n  transformHoist = null,\n  isBuiltInComponent = NOOP,\n  isCustomElement = NOOP,\n  expressionPlugins = [],\n  scopeId = null,\n  slotted = true,\n  ssr = false,\n  inSSR = false,\n  ssrCssVars = ``,\n  bindingMetadata = EMPTY_OBJ,\n  inline = false,\n  isTS = false,\n  onError = defaultOnError,\n  onWarn = defaultOnWarn,\n  compatConfig\n}) {\n  const nameMatch = filename.replace(/\\?.*$/, \"\").match(/([^/\\\\]+)\\.\\w+$/);\n  const context = {\n    // options\n    selfName: nameMatch && capitalize(camelize(nameMatch[1])),\n    prefixIdentifiers,\n    hoistStatic: hoistStatic2,\n    cacheHandlers,\n    nodeTransforms,\n    directiveTransforms,\n    transformHoist,\n    isBuiltInComponent,\n    isCustomElement,\n    expressionPlugins,\n    scopeId,\n    slotted,\n    ssr,\n    inSSR,\n    ssrCssVars,\n    bindingMetadata,\n    inline,\n    isTS,\n    onError,\n    onWarn,\n    compatConfig,\n    // state\n    root,\n    helpers: /* @__PURE__ */ new Map(),\n    components: /* @__PURE__ */ new Set(),\n    directives: /* @__PURE__ */ new Set(),\n    hoists: [],\n    imports: [],\n    constantCache: /* @__PURE__ */ new Map(),\n    temps: 0,\n    cached: 0,\n    identifiers: /* @__PURE__ */ Object.create(null),\n    scopes: {\n      vFor: 0,\n      vSlot: 0,\n      vPre: 0,\n      vOnce: 0\n    },\n    parent: null,\n    currentNode: root,\n    childIndex: 0,\n    inVOnce: false,\n    // methods\n    helper(name) {\n      const count = context.helpers.get(name) || 0;\n      context.helpers.set(name, count + 1);\n      return name;\n    },\n    removeHelper(name) {\n      const count = context.helpers.get(name);\n      if (count) {\n        const currentCount = count - 1;\n        if (!currentCount) {\n          context.helpers.delete(name);\n        } else {\n          context.helpers.set(name, currentCount);\n        }\n      }\n    },\n    helperString(name) {\n      return `_${helperNameMap[context.helper(name)]}`;\n    },\n    replaceNode(node) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!context.currentNode) {\n          throw new Error(`Node being replaced is already removed.`);\n        }\n        if (!context.parent) {\n          throw new Error(`Cannot replace root node.`);\n        }\n      }\n      context.parent.children[context.childIndex] = context.currentNode = node;\n    },\n    removeNode(node) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !context.parent) {\n        throw new Error(`Cannot remove root node.`);\n      }\n      const list = context.parent.children;\n      const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1;\n      if (!!(process.env.NODE_ENV !== \"production\") && removalIndex < 0) {\n        throw new Error(`node being removed is not a child of current parent`);\n      }\n      if (!node || node === context.currentNode) {\n        context.currentNode = null;\n        context.onNodeRemoved();\n      } else {\n        if (context.childIndex > removalIndex) {\n          context.childIndex--;\n          context.onNodeRemoved();\n        }\n      }\n      context.parent.children.splice(removalIndex, 1);\n    },\n    onNodeRemoved: () => {\n    },\n    addIdentifiers(exp) {\n    },\n    removeIdentifiers(exp) {\n    },\n    hoist(exp) {\n      if (isString(exp))\n        exp = createSimpleExpression(exp);\n      context.hoists.push(exp);\n      const identifier = createSimpleExpression(\n        `_hoisted_${context.hoists.length}`,\n        false,\n        exp.loc,\n        2\n      );\n      identifier.hoisted = exp;\n      return identifier;\n    },\n    cache(exp, isVNode = false) {\n      return createCacheExpression(context.cached++, exp, isVNode);\n    }\n  };\n  {\n    context.filters = /* @__PURE__ */ new Set();\n  }\n  return context;\n}\nfunction transform(root, options) {\n  const context = createTransformContext(root, options);\n  traverseNode(root, context);\n  if (options.hoistStatic) {\n    hoistStatic(root, context);\n  }\n  if (!options.ssr) {\n    createRootCodegen(root, context);\n  }\n  root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]);\n  root.components = [...context.components];\n  root.directives = [...context.directives];\n  root.imports = context.imports;\n  root.hoists = context.hoists;\n  root.temps = context.temps;\n  root.cached = context.cached;\n  {\n    root.filters = [...context.filters];\n  }\n}\nfunction createRootCodegen(root, context) {\n  const { helper } = context;\n  const { children } = root;\n  if (children.length === 1) {\n    const child = children[0];\n    if (isSingleElementRoot(root, child) && child.codegenNode) {\n      const codegenNode = child.codegenNode;\n      if (codegenNode.type === 13) {\n        convertToBlock(codegenNode, context);\n      }\n      root.codegenNode = codegenNode;\n    } else {\n      root.codegenNode = child;\n    }\n  } else if (children.length > 1) {\n    let patchFlag = 64;\n    let patchFlagText = PatchFlagNames[64];\n    if (!!(process.env.NODE_ENV !== \"production\") && children.filter((c) => c.type !== 3).length === 1) {\n      patchFlag |= 2048;\n      patchFlagText += `, ${PatchFlagNames[2048]}`;\n    }\n    root.codegenNode = createVNodeCall(\n      context,\n      helper(FRAGMENT),\n      void 0,\n      root.children,\n      patchFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${patchFlagText} */` : ``),\n      void 0,\n      void 0,\n      true,\n      void 0,\n      false\n      /* isComponent */\n    );\n  } else ;\n}\nfunction traverseChildren(parent, context) {\n  let i = 0;\n  const nodeRemoved = () => {\n    i--;\n  };\n  for (; i < parent.children.length; i++) {\n    const child = parent.children[i];\n    if (isString(child))\n      continue;\n    context.parent = parent;\n    context.childIndex = i;\n    context.onNodeRemoved = nodeRemoved;\n    traverseNode(child, context);\n  }\n}\nfunction traverseNode(node, context) {\n  context.currentNode = node;\n  const { nodeTransforms } = context;\n  const exitFns = [];\n  for (let i2 = 0; i2 < nodeTransforms.length; i2++) {\n    const onExit = nodeTransforms[i2](node, context);\n    if (onExit) {\n      if (isArray(onExit)) {\n        exitFns.push(...onExit);\n      } else {\n        exitFns.push(onExit);\n      }\n    }\n    if (!context.currentNode) {\n      return;\n    } else {\n      node = context.currentNode;\n    }\n  }\n  switch (node.type) {\n    case 3:\n      if (!context.ssr) {\n        context.helper(CREATE_COMMENT);\n      }\n      break;\n    case 5:\n      if (!context.ssr) {\n        context.helper(TO_DISPLAY_STRING);\n      }\n      break;\n    case 9:\n      for (let i2 = 0; i2 < node.branches.length; i2++) {\n        traverseNode(node.branches[i2], context);\n      }\n      break;\n    case 10:\n    case 11:\n    case 1:\n    case 0:\n      traverseChildren(node, context);\n      break;\n  }\n  context.currentNode = node;\n  let i = exitFns.length;\n  while (i--) {\n    exitFns[i]();\n  }\n}\nfunction createStructuralDirectiveTransform(name, fn) {\n  const matches = isString(name) ? (n) => n === name : (n) => name.test(n);\n  return (node, context) => {\n    if (node.type === 1) {\n      const { props } = node;\n      if (node.tagType === 3 && props.some(isVSlot)) {\n        return;\n      }\n      const exitFns = [];\n      for (let i = 0; i < props.length; i++) {\n        const prop = props[i];\n        if (prop.type === 7 && matches(prop.name)) {\n          props.splice(i, 1);\n          i--;\n          const onExit = fn(node, prop, context);\n          if (onExit)\n            exitFns.push(onExit);\n        }\n      }\n      return exitFns;\n    }\n  };\n}\n\nconst PURE_ANNOTATION = `/*#__PURE__*/`;\nconst aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;\nfunction createCodegenContext(ast, {\n  mode = \"function\",\n  prefixIdentifiers = mode === \"module\",\n  sourceMap = false,\n  filename = `template.vue.html`,\n  scopeId = null,\n  optimizeImports = false,\n  runtimeGlobalName = `Vue`,\n  runtimeModuleName = `vue`,\n  ssrRuntimeModuleName = \"vue/server-renderer\",\n  ssr = false,\n  isTS = false,\n  inSSR = false\n}) {\n  const context = {\n    mode,\n    prefixIdentifiers,\n    sourceMap,\n    filename,\n    scopeId,\n    optimizeImports,\n    runtimeGlobalName,\n    runtimeModuleName,\n    ssrRuntimeModuleName,\n    ssr,\n    isTS,\n    inSSR,\n    source: ast.loc.source,\n    code: ``,\n    column: 1,\n    line: 1,\n    offset: 0,\n    indentLevel: 0,\n    pure: false,\n    map: void 0,\n    helper(key) {\n      return `_${helperNameMap[key]}`;\n    },\n    push(code, node) {\n      context.code += code;\n    },\n    indent() {\n      newline(++context.indentLevel);\n    },\n    deindent(withoutNewLine = false) {\n      if (withoutNewLine) {\n        --context.indentLevel;\n      } else {\n        newline(--context.indentLevel);\n      }\n    },\n    newline() {\n      newline(context.indentLevel);\n    }\n  };\n  function newline(n) {\n    context.push(\"\\n\" + `  `.repeat(n));\n  }\n  return context;\n}\nfunction generate(ast, options = {}) {\n  const context = createCodegenContext(ast, options);\n  if (options.onContextCreated)\n    options.onContextCreated(context);\n  const {\n    mode,\n    push,\n    prefixIdentifiers,\n    indent,\n    deindent,\n    newline,\n    scopeId,\n    ssr\n  } = context;\n  const helpers = Array.from(ast.helpers);\n  const hasHelpers = helpers.length > 0;\n  const useWithBlock = !prefixIdentifiers && mode !== \"module\";\n  const isSetupInlined = false;\n  const preambleContext = isSetupInlined ? createCodegenContext(ast, options) : context;\n  {\n    genFunctionPreamble(ast, preambleContext);\n  }\n  const functionName = ssr ? `ssrRender` : `render`;\n  const args = ssr ? [\"_ctx\", \"_push\", \"_parent\", \"_attrs\"] : [\"_ctx\", \"_cache\"];\n  const signature = args.join(\", \");\n  {\n    push(`function ${functionName}(${signature}) {`);\n  }\n  indent();\n  if (useWithBlock) {\n    push(`with (_ctx) {`);\n    indent();\n    if (hasHelpers) {\n      push(`const { ${helpers.map(aliasHelper).join(\", \")} } = _Vue`);\n      push(`\n`);\n      newline();\n    }\n  }\n  if (ast.components.length) {\n    genAssets(ast.components, \"component\", context);\n    if (ast.directives.length || ast.temps > 0) {\n      newline();\n    }\n  }\n  if (ast.directives.length) {\n    genAssets(ast.directives, \"directive\", context);\n    if (ast.temps > 0) {\n      newline();\n    }\n  }\n  if (ast.filters && ast.filters.length) {\n    newline();\n    genAssets(ast.filters, \"filter\", context);\n    newline();\n  }\n  if (ast.temps > 0) {\n    push(`let `);\n    for (let i = 0; i < ast.temps; i++) {\n      push(`${i > 0 ? `, ` : ``}_temp${i}`);\n    }\n  }\n  if (ast.components.length || ast.directives.length || ast.temps) {\n    push(`\n`);\n    newline();\n  }\n  if (!ssr) {\n    push(`return `);\n  }\n  if (ast.codegenNode) {\n    genNode(ast.codegenNode, context);\n  } else {\n    push(`null`);\n  }\n  if (useWithBlock) {\n    deindent();\n    push(`}`);\n  }\n  deindent();\n  push(`}`);\n  return {\n    ast,\n    code: context.code,\n    preamble: isSetupInlined ? preambleContext.code : ``,\n    // SourceMapGenerator does have toJSON() method but it's not in the types\n    map: context.map ? context.map.toJSON() : void 0\n  };\n}\nfunction genFunctionPreamble(ast, context) {\n  const {\n    ssr,\n    prefixIdentifiers,\n    push,\n    newline,\n    runtimeModuleName,\n    runtimeGlobalName,\n    ssrRuntimeModuleName\n  } = context;\n  const VueBinding = runtimeGlobalName;\n  const helpers = Array.from(ast.helpers);\n  if (helpers.length > 0) {\n    {\n      push(`const _Vue = ${VueBinding}\n`);\n      if (ast.hoists.length) {\n        const staticHelpers = [\n          CREATE_VNODE,\n          CREATE_ELEMENT_VNODE,\n          CREATE_COMMENT,\n          CREATE_TEXT,\n          CREATE_STATIC\n        ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(\", \");\n        push(`const { ${staticHelpers} } = _Vue\n`);\n      }\n    }\n  }\n  genHoists(ast.hoists, context);\n  newline();\n  push(`return `);\n}\nfunction genAssets(assets, type, { helper, push, newline, isTS }) {\n  const resolver = helper(\n    type === \"filter\" ? RESOLVE_FILTER : type === \"component\" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE\n  );\n  for (let i = 0; i < assets.length; i++) {\n    let id = assets[i];\n    const maybeSelfReference = id.endsWith(\"__self\");\n    if (maybeSelfReference) {\n      id = id.slice(0, -6);\n    }\n    push(\n      `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`\n    );\n    if (i < assets.length - 1) {\n      newline();\n    }\n  }\n}\nfunction genHoists(hoists, context) {\n  if (!hoists.length) {\n    return;\n  }\n  context.pure = true;\n  const { push, newline, helper, scopeId, mode } = context;\n  newline();\n  for (let i = 0; i < hoists.length; i++) {\n    const exp = hoists[i];\n    if (exp) {\n      push(\n        `const _hoisted_${i + 1} = ${``}`\n      );\n      genNode(exp, context);\n      newline();\n    }\n  }\n  context.pure = false;\n}\nfunction isText(n) {\n  return isString(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8;\n}\nfunction genNodeListAsArray(nodes, context) {\n  const multilines = nodes.length > 3 || !!(process.env.NODE_ENV !== \"production\") && nodes.some((n) => isArray(n) || !isText(n));\n  context.push(`[`);\n  multilines && context.indent();\n  genNodeList(nodes, context, multilines);\n  multilines && context.deindent();\n  context.push(`]`);\n}\nfunction genNodeList(nodes, context, multilines = false, comma = true) {\n  const { push, newline } = context;\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i];\n    if (isString(node)) {\n      push(node);\n    } else if (isArray(node)) {\n      genNodeListAsArray(node, context);\n    } else {\n      genNode(node, context);\n    }\n    if (i < nodes.length - 1) {\n      if (multilines) {\n        comma && push(\",\");\n        newline();\n      } else {\n        comma && push(\", \");\n      }\n    }\n  }\n}\nfunction genNode(node, context) {\n  if (isString(node)) {\n    context.push(node);\n    return;\n  }\n  if (isSymbol(node)) {\n    context.push(context.helper(node));\n    return;\n  }\n  switch (node.type) {\n    case 1:\n    case 9:\n    case 11:\n      !!(process.env.NODE_ENV !== \"production\") && assert(\n        node.codegenNode != null,\n        `Codegen node is missing for element/if/for node. Apply appropriate transforms first.`\n      );\n      genNode(node.codegenNode, context);\n      break;\n    case 2:\n      genText(node, context);\n      break;\n    case 4:\n      genExpression(node, context);\n      break;\n    case 5:\n      genInterpolation(node, context);\n      break;\n    case 12:\n      genNode(node.codegenNode, context);\n      break;\n    case 8:\n      genCompoundExpression(node, context);\n      break;\n    case 3:\n      genComment(node, context);\n      break;\n    case 13:\n      genVNodeCall(node, context);\n      break;\n    case 14:\n      genCallExpression(node, context);\n      break;\n    case 15:\n      genObjectExpression(node, context);\n      break;\n    case 17:\n      genArrayExpression(node, context);\n      break;\n    case 18:\n      genFunctionExpression(node, context);\n      break;\n    case 19:\n      genConditionalExpression(node, context);\n      break;\n    case 20:\n      genCacheExpression(node, context);\n      break;\n    case 21:\n      genNodeList(node.body, context, true, false);\n      break;\n    case 22:\n      break;\n    case 23:\n      break;\n    case 24:\n      break;\n    case 25:\n      break;\n    case 26:\n      break;\n    case 10:\n      break;\n    default:\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        assert(false, `unhandled codegen node type: ${node.type}`);\n        const exhaustiveCheck = node;\n        return exhaustiveCheck;\n      }\n  }\n}\nfunction genText(node, context) {\n  context.push(JSON.stringify(node.content), node);\n}\nfunction genExpression(node, context) {\n  const { content, isStatic } = node;\n  context.push(isStatic ? JSON.stringify(content) : content, node);\n}\nfunction genInterpolation(node, context) {\n  const { push, helper, pure } = context;\n  if (pure)\n    push(PURE_ANNOTATION);\n  push(`${helper(TO_DISPLAY_STRING)}(`);\n  genNode(node.content, context);\n  push(`)`);\n}\nfunction genCompoundExpression(node, context) {\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i];\n    if (isString(child)) {\n      context.push(child);\n    } else {\n      genNode(child, context);\n    }\n  }\n}\nfunction genExpressionAsPropertyKey(node, context) {\n  const { push } = context;\n  if (node.type === 8) {\n    push(`[`);\n    genCompoundExpression(node, context);\n    push(`]`);\n  } else if (node.isStatic) {\n    const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content);\n    push(text, node);\n  } else {\n    push(`[${node.content}]`, node);\n  }\n}\nfunction genComment(node, context) {\n  const { push, helper, pure } = context;\n  if (pure) {\n    push(PURE_ANNOTATION);\n  }\n  push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);\n}\nfunction genVNodeCall(node, context) {\n  const { push, helper, pure } = context;\n  const {\n    tag,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    directives,\n    isBlock,\n    disableTracking,\n    isComponent\n  } = node;\n  if (directives) {\n    push(helper(WITH_DIRECTIVES) + `(`);\n  }\n  if (isBlock) {\n    push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);\n  }\n  if (pure) {\n    push(PURE_ANNOTATION);\n  }\n  const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent);\n  push(helper(callHelper) + `(`, node);\n  genNodeList(\n    genNullableArgs([tag, props, children, patchFlag, dynamicProps]),\n    context\n  );\n  push(`)`);\n  if (isBlock) {\n    push(`)`);\n  }\n  if (directives) {\n    push(`, `);\n    genNode(directives, context);\n    push(`)`);\n  }\n}\nfunction genNullableArgs(args) {\n  let i = args.length;\n  while (i--) {\n    if (args[i] != null)\n      break;\n  }\n  return args.slice(0, i + 1).map((arg) => arg || `null`);\n}\nfunction genCallExpression(node, context) {\n  const { push, helper, pure } = context;\n  const callee = isString(node.callee) ? node.callee : helper(node.callee);\n  if (pure) {\n    push(PURE_ANNOTATION);\n  }\n  push(callee + `(`, node);\n  genNodeList(node.arguments, context);\n  push(`)`);\n}\nfunction genObjectExpression(node, context) {\n  const { push, indent, deindent, newline } = context;\n  const { properties } = node;\n  if (!properties.length) {\n    push(`{}`, node);\n    return;\n  }\n  const multilines = properties.length > 1 || !!(process.env.NODE_ENV !== \"production\") && properties.some((p) => p.value.type !== 4);\n  push(multilines ? `{` : `{ `);\n  multilines && indent();\n  for (let i = 0; i < properties.length; i++) {\n    const { key, value } = properties[i];\n    genExpressionAsPropertyKey(key, context);\n    push(`: `);\n    genNode(value, context);\n    if (i < properties.length - 1) {\n      push(`,`);\n      newline();\n    }\n  }\n  multilines && deindent();\n  push(multilines ? `}` : ` }`);\n}\nfunction genArrayExpression(node, context) {\n  genNodeListAsArray(node.elements, context);\n}\nfunction genFunctionExpression(node, context) {\n  const { push, indent, deindent } = context;\n  const { params, returns, body, newline, isSlot } = node;\n  if (isSlot) {\n    push(`_${helperNameMap[WITH_CTX]}(`);\n  }\n  push(`(`, node);\n  if (isArray(params)) {\n    genNodeList(params, context);\n  } else if (params) {\n    genNode(params, context);\n  }\n  push(`) => `);\n  if (newline || body) {\n    push(`{`);\n    indent();\n  }\n  if (returns) {\n    if (newline) {\n      push(`return `);\n    }\n    if (isArray(returns)) {\n      genNodeListAsArray(returns, context);\n    } else {\n      genNode(returns, context);\n    }\n  } else if (body) {\n    genNode(body, context);\n  }\n  if (newline || body) {\n    deindent();\n    push(`}`);\n  }\n  if (isSlot) {\n    if (node.isNonScopedSlot) {\n      push(`, undefined, true`);\n    }\n    push(`)`);\n  }\n}\nfunction genConditionalExpression(node, context) {\n  const { test, consequent, alternate, newline: needNewline } = node;\n  const { push, indent, deindent, newline } = context;\n  if (test.type === 4) {\n    const needsParens = !isSimpleIdentifier(test.content);\n    needsParens && push(`(`);\n    genExpression(test, context);\n    needsParens && push(`)`);\n  } else {\n    push(`(`);\n    genNode(test, context);\n    push(`)`);\n  }\n  needNewline && indent();\n  context.indentLevel++;\n  needNewline || push(` `);\n  push(`? `);\n  genNode(consequent, context);\n  context.indentLevel--;\n  needNewline && newline();\n  needNewline || push(` `);\n  push(`: `);\n  const isNested = alternate.type === 19;\n  if (!isNested) {\n    context.indentLevel++;\n  }\n  genNode(alternate, context);\n  if (!isNested) {\n    context.indentLevel--;\n  }\n  needNewline && deindent(\n    true\n    /* without newline */\n  );\n}\nfunction genCacheExpression(node, context) {\n  const { push, helper, indent, deindent, newline } = context;\n  push(`_cache[${node.index}] || (`);\n  if (node.isVNode) {\n    indent();\n    push(`${helper(SET_BLOCK_TRACKING)}(-1),`);\n    newline();\n  }\n  push(`_cache[${node.index}] = `);\n  genNode(node.value, context);\n  if (node.isVNode) {\n    push(`,`);\n    newline();\n    push(`${helper(SET_BLOCK_TRACKING)}(1),`);\n    newline();\n    push(`_cache[${node.index}]`);\n    deindent();\n  }\n  push(`)`);\n}\n\nfunction walkIdentifiers(root, onIdentifier, includeAll = false, parentStack = [], knownIds = /* @__PURE__ */ Object.create(null)) {\n  {\n    return;\n  }\n}\nfunction isReferencedIdentifier(id, parent, parentStack) {\n  {\n    return false;\n  }\n}\nfunction isInDestructureAssignment(parent, parentStack) {\n  if (parent && (parent.type === \"ObjectProperty\" || parent.type === \"ArrayPattern\")) {\n    let i = parentStack.length;\n    while (i--) {\n      const p = parentStack[i];\n      if (p.type === \"AssignmentExpression\") {\n        return true;\n      } else if (p.type !== \"ObjectProperty\" && !p.type.endsWith(\"Pattern\")) {\n        break;\n      }\n    }\n  }\n  return false;\n}\nfunction walkFunctionParams(node, onIdent) {\n  for (const p of node.params) {\n    for (const id of extractIdentifiers(p)) {\n      onIdent(id);\n    }\n  }\n}\nfunction walkBlockDeclarations(block, onIdent) {\n  for (const stmt of block.body) {\n    if (stmt.type === \"VariableDeclaration\") {\n      if (stmt.declare)\n        continue;\n      for (const decl of stmt.declarations) {\n        for (const id of extractIdentifiers(decl.id)) {\n          onIdent(id);\n        }\n      }\n    } else if (stmt.type === \"FunctionDeclaration\" || stmt.type === \"ClassDeclaration\") {\n      if (stmt.declare || !stmt.id)\n        continue;\n      onIdent(stmt.id);\n    }\n  }\n}\nfunction extractIdentifiers(param, nodes = []) {\n  switch (param.type) {\n    case \"Identifier\":\n      nodes.push(param);\n      break;\n    case \"MemberExpression\":\n      let object = param;\n      while (object.type === \"MemberExpression\") {\n        object = object.object;\n      }\n      nodes.push(object);\n      break;\n    case \"ObjectPattern\":\n      for (const prop of param.properties) {\n        if (prop.type === \"RestElement\") {\n          extractIdentifiers(prop.argument, nodes);\n        } else {\n          extractIdentifiers(prop.value, nodes);\n        }\n      }\n      break;\n    case \"ArrayPattern\":\n      param.elements.forEach((element) => {\n        if (element)\n          extractIdentifiers(element, nodes);\n      });\n      break;\n    case \"RestElement\":\n      extractIdentifiers(param.argument, nodes);\n      break;\n    case \"AssignmentPattern\":\n      extractIdentifiers(param.left, nodes);\n      break;\n  }\n  return nodes;\n}\nconst isFunctionType = (node) => {\n  return /Function(?:Expression|Declaration)$|Method$/.test(node.type);\n};\nconst isStaticProperty = (node) => node && (node.type === \"ObjectProperty\" || node.type === \"ObjectMethod\") && !node.computed;\nconst isStaticPropertyKey = (node, parent) => isStaticProperty(parent) && parent.key === node;\nconst TS_NODE_TYPES = [\n  \"TSAsExpression\",\n  // foo as number\n  \"TSTypeAssertion\",\n  // (<number>foo)\n  \"TSNonNullExpression\",\n  // foo!\n  \"TSInstantiationExpression\",\n  // foo<string>\n  \"TSSatisfiesExpression\"\n  // foo satisfies T\n];\n\nconst prohibitedKeywordRE = new RegExp(\n  \"\\\\b\" + \"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield\".split(\",\").join(\"\\\\b|\\\\b\") + \"\\\\b\"\n);\nconst stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\nfunction validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {\n  const exp = node.content;\n  if (!exp.trim()) {\n    return;\n  }\n  try {\n    new Function(\n      asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`\n    );\n  } catch (e) {\n    let message = e.message;\n    const keywordMatch = exp.replace(stripStringRE, \"\").match(prohibitedKeywordRE);\n    if (keywordMatch) {\n      message = `avoid using JavaScript keyword as property name: \"${keywordMatch[0]}\"`;\n    }\n    context.onError(\n      createCompilerError(\n        45,\n        node.loc,\n        void 0,\n        message\n      )\n    );\n  }\n}\n\nconst transformExpression = (node, context) => {\n  if (node.type === 5) {\n    node.content = processExpression(\n      node.content,\n      context\n    );\n  } else if (node.type === 1) {\n    for (let i = 0; i < node.props.length; i++) {\n      const dir = node.props[i];\n      if (dir.type === 7 && dir.name !== \"for\") {\n        const exp = dir.exp;\n        const arg = dir.arg;\n        if (exp && exp.type === 4 && !(dir.name === \"on\" && arg)) {\n          dir.exp = processExpression(\n            exp,\n            context,\n            // slot args must be processed as function params\n            dir.name === \"slot\"\n          );\n        }\n        if (arg && arg.type === 4 && !arg.isStatic) {\n          dir.arg = processExpression(arg, context);\n        }\n      }\n    }\n  }\n};\nfunction processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) {\n  {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      validateBrowserExpression(node, context, asParams, asRawStatements);\n    }\n    return node;\n  }\n}\nfunction stringifyExpression(exp) {\n  if (isString(exp)) {\n    return exp;\n  } else if (exp.type === 4) {\n    return exp.content;\n  } else {\n    return exp.children.map(stringifyExpression).join(\"\");\n  }\n}\n\nconst transformIf = createStructuralDirectiveTransform(\n  /^(if|else|else-if)$/,\n  (node, dir, context) => {\n    return processIf(node, dir, context, (ifNode, branch, isRoot) => {\n      const siblings = context.parent.children;\n      let i = siblings.indexOf(ifNode);\n      let key = 0;\n      while (i-- >= 0) {\n        const sibling = siblings[i];\n        if (sibling && sibling.type === 9) {\n          key += sibling.branches.length;\n        }\n      }\n      return () => {\n        if (isRoot) {\n          ifNode.codegenNode = createCodegenNodeForBranch(\n            branch,\n            key,\n            context\n          );\n        } else {\n          const parentCondition = getParentCondition(ifNode.codegenNode);\n          parentCondition.alternate = createCodegenNodeForBranch(\n            branch,\n            key + ifNode.branches.length - 1,\n            context\n          );\n        }\n      };\n    });\n  }\n);\nfunction processIf(node, dir, context, processCodegen) {\n  if (dir.name !== \"else\" && (!dir.exp || !dir.exp.content.trim())) {\n    const loc = dir.exp ? dir.exp.loc : node.loc;\n    context.onError(\n      createCompilerError(28, dir.loc)\n    );\n    dir.exp = createSimpleExpression(`true`, false, loc);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && true && dir.exp) {\n    validateBrowserExpression(dir.exp, context);\n  }\n  if (dir.name === \"if\") {\n    const branch = createIfBranch(node, dir);\n    const ifNode = {\n      type: 9,\n      loc: node.loc,\n      branches: [branch]\n    };\n    context.replaceNode(ifNode);\n    if (processCodegen) {\n      return processCodegen(ifNode, branch, true);\n    }\n  } else {\n    const siblings = context.parent.children;\n    const comments = [];\n    let i = siblings.indexOf(node);\n    while (i-- >= -1) {\n      const sibling = siblings[i];\n      if (sibling && sibling.type === 3) {\n        context.removeNode(sibling);\n        !!(process.env.NODE_ENV !== \"production\") && comments.unshift(sibling);\n        continue;\n      }\n      if (sibling && sibling.type === 2 && !sibling.content.trim().length) {\n        context.removeNode(sibling);\n        continue;\n      }\n      if (sibling && sibling.type === 9) {\n        if (dir.name === \"else-if\" && sibling.branches[sibling.branches.length - 1].condition === void 0) {\n          context.onError(\n            createCompilerError(30, node.loc)\n          );\n        }\n        context.removeNode();\n        const branch = createIfBranch(node, dir);\n        if (!!(process.env.NODE_ENV !== \"production\") && comments.length && // #3619 ignore comments if the v-if is direct child of <transition>\n        !(context.parent && context.parent.type === 1 && isBuiltInType(context.parent.tag, \"transition\"))) {\n          branch.children = [...comments, ...branch.children];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || false) {\n          const key = branch.userKey;\n          if (key) {\n            sibling.branches.forEach(({ userKey }) => {\n              if (isSameKey(userKey, key)) {\n                context.onError(\n                  createCompilerError(\n                    29,\n                    branch.userKey.loc\n                  )\n                );\n              }\n            });\n          }\n        }\n        sibling.branches.push(branch);\n        const onExit = processCodegen && processCodegen(sibling, branch, false);\n        traverseNode(branch, context);\n        if (onExit)\n          onExit();\n        context.currentNode = null;\n      } else {\n        context.onError(\n          createCompilerError(30, node.loc)\n        );\n      }\n      break;\n    }\n  }\n}\nfunction createIfBranch(node, dir) {\n  const isTemplateIf = node.tagType === 3;\n  return {\n    type: 10,\n    loc: node.loc,\n    condition: dir.name === \"else\" ? void 0 : dir.exp,\n    children: isTemplateIf && !findDir(node, \"for\") ? node.children : [node],\n    userKey: findProp(node, `key`),\n    isTemplateIf\n  };\n}\nfunction createCodegenNodeForBranch(branch, keyIndex, context) {\n  if (branch.condition) {\n    return createConditionalExpression(\n      branch.condition,\n      createChildrenCodegenNode(branch, keyIndex, context),\n      // make sure to pass in asBlock: true so that the comment node call\n      // closes the current block.\n      createCallExpression(context.helper(CREATE_COMMENT), [\n        !!(process.env.NODE_ENV !== \"production\") ? '\"v-if\"' : '\"\"',\n        \"true\"\n      ])\n    );\n  } else {\n    return createChildrenCodegenNode(branch, keyIndex, context);\n  }\n}\nfunction createChildrenCodegenNode(branch, keyIndex, context) {\n  const { helper } = context;\n  const keyProperty = createObjectProperty(\n    `key`,\n    createSimpleExpression(\n      `${keyIndex}`,\n      false,\n      locStub,\n      2\n    )\n  );\n  const { children } = branch;\n  const firstChild = children[0];\n  const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1;\n  if (needFragmentWrapper) {\n    if (children.length === 1 && firstChild.type === 11) {\n      const vnodeCall = firstChild.codegenNode;\n      injectProp(vnodeCall, keyProperty, context);\n      return vnodeCall;\n    } else {\n      let patchFlag = 64;\n      let patchFlagText = PatchFlagNames[64];\n      if (!!(process.env.NODE_ENV !== \"production\") && !branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) {\n        patchFlag |= 2048;\n        patchFlagText += `, ${PatchFlagNames[2048]}`;\n      }\n      return createVNodeCall(\n        context,\n        helper(FRAGMENT),\n        createObjectExpression([keyProperty]),\n        children,\n        patchFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${patchFlagText} */` : ``),\n        void 0,\n        void 0,\n        true,\n        false,\n        false,\n        branch.loc\n      );\n    }\n  } else {\n    const ret = firstChild.codegenNode;\n    const vnodeCall = getMemoedVNodeCall(ret);\n    if (vnodeCall.type === 13) {\n      convertToBlock(vnodeCall, context);\n    }\n    injectProp(vnodeCall, keyProperty, context);\n    return ret;\n  }\n}\nfunction isSameKey(a, b) {\n  if (!a || a.type !== b.type) {\n    return false;\n  }\n  if (a.type === 6) {\n    if (a.value.content !== b.value.content) {\n      return false;\n    }\n  } else {\n    const exp = a.exp;\n    const branchExp = b.exp;\n    if (exp.type !== branchExp.type) {\n      return false;\n    }\n    if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction getParentCondition(node) {\n  while (true) {\n    if (node.type === 19) {\n      if (node.alternate.type === 19) {\n        node = node.alternate;\n      } else {\n        return node;\n      }\n    } else if (node.type === 20) {\n      node = node.value;\n    }\n  }\n}\n\nconst transformFor = createStructuralDirectiveTransform(\n  \"for\",\n  (node, dir, context) => {\n    const { helper, removeHelper } = context;\n    return processFor(node, dir, context, (forNode) => {\n      const renderExp = createCallExpression(helper(RENDER_LIST), [\n        forNode.source\n      ]);\n      const isTemplate = isTemplateNode(node);\n      const memo = findDir(node, \"memo\");\n      const keyProp = findProp(node, `key`);\n      const keyExp = keyProp && (keyProp.type === 6 ? createSimpleExpression(keyProp.value.content, true) : keyProp.exp);\n      const keyProperty = keyProp ? createObjectProperty(`key`, keyExp) : null;\n      const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0;\n      const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256;\n      forNode.codegenNode = createVNodeCall(\n        context,\n        helper(FRAGMENT),\n        void 0,\n        renderExp,\n        fragmentFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${PatchFlagNames[fragmentFlag]} */` : ``),\n        void 0,\n        void 0,\n        true,\n        !isStableFragment,\n        false,\n        node.loc\n      );\n      return () => {\n        let childBlock;\n        const { children } = forNode;\n        if ((!!(process.env.NODE_ENV !== \"production\") || false) && isTemplate) {\n          node.children.some((c) => {\n            if (c.type === 1) {\n              const key = findProp(c, \"key\");\n              if (key) {\n                context.onError(\n                  createCompilerError(\n                    33,\n                    key.loc\n                  )\n                );\n                return true;\n              }\n            }\n          });\n        }\n        const needFragmentWrapper = children.length !== 1 || children[0].type !== 1;\n        const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null;\n        if (slotOutlet) {\n          childBlock = slotOutlet.codegenNode;\n          if (isTemplate && keyProperty) {\n            injectProp(childBlock, keyProperty, context);\n          }\n        } else if (needFragmentWrapper) {\n          childBlock = createVNodeCall(\n            context,\n            helper(FRAGMENT),\n            keyProperty ? createObjectExpression([keyProperty]) : void 0,\n            node.children,\n            64 + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${PatchFlagNames[64]} */` : ``),\n            void 0,\n            void 0,\n            true,\n            void 0,\n            false\n            /* isComponent */\n          );\n        } else {\n          childBlock = children[0].codegenNode;\n          if (isTemplate && keyProperty) {\n            injectProp(childBlock, keyProperty, context);\n          }\n          if (childBlock.isBlock !== !isStableFragment) {\n            if (childBlock.isBlock) {\n              removeHelper(OPEN_BLOCK);\n              removeHelper(\n                getVNodeBlockHelper(context.inSSR, childBlock.isComponent)\n              );\n            } else {\n              removeHelper(\n                getVNodeHelper(context.inSSR, childBlock.isComponent)\n              );\n            }\n          }\n          childBlock.isBlock = !isStableFragment;\n          if (childBlock.isBlock) {\n            helper(OPEN_BLOCK);\n            helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));\n          } else {\n            helper(getVNodeHelper(context.inSSR, childBlock.isComponent));\n          }\n        }\n        if (memo) {\n          const loop = createFunctionExpression(\n            createForLoopParams(forNode.parseResult, [\n              createSimpleExpression(`_cached`)\n            ])\n          );\n          loop.body = createBlockStatement([\n            createCompoundExpression([`const _memo = (`, memo.exp, `)`]),\n            createCompoundExpression([\n              `if (_cached`,\n              ...keyExp ? [` && _cached.key === `, keyExp] : [],\n              ` && ${context.helperString(\n                IS_MEMO_SAME\n              )}(_cached, _memo)) return _cached`\n            ]),\n            createCompoundExpression([`const _item = `, childBlock]),\n            createSimpleExpression(`_item.memo = _memo`),\n            createSimpleExpression(`return _item`)\n          ]);\n          renderExp.arguments.push(\n            loop,\n            createSimpleExpression(`_cache`),\n            createSimpleExpression(String(context.cached++))\n          );\n        } else {\n          renderExp.arguments.push(\n            createFunctionExpression(\n              createForLoopParams(forNode.parseResult),\n              childBlock,\n              true\n              /* force newline */\n            )\n          );\n        }\n      };\n    });\n  }\n);\nfunction processFor(node, dir, context, processCodegen) {\n  if (!dir.exp) {\n    context.onError(\n      createCompilerError(31, dir.loc)\n    );\n    return;\n  }\n  const parseResult = parseForExpression(\n    // can only be simple expression because vFor transform is applied\n    // before expression transform.\n    dir.exp,\n    context\n  );\n  if (!parseResult) {\n    context.onError(\n      createCompilerError(32, dir.loc)\n    );\n    return;\n  }\n  const { addIdentifiers, removeIdentifiers, scopes } = context;\n  const { source, value, key, index } = parseResult;\n  const forNode = {\n    type: 11,\n    loc: dir.loc,\n    source,\n    valueAlias: value,\n    keyAlias: key,\n    objectIndexAlias: index,\n    parseResult,\n    children: isTemplateNode(node) ? node.children : [node]\n  };\n  context.replaceNode(forNode);\n  scopes.vFor++;\n  const onExit = processCodegen && processCodegen(forNode);\n  return () => {\n    scopes.vFor--;\n    if (onExit)\n      onExit();\n  };\n}\nconst forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\nconst forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nconst stripParensRE = /^\\(|\\)$/g;\nfunction parseForExpression(input, context) {\n  const loc = input.loc;\n  const exp = input.content;\n  const inMatch = exp.match(forAliasRE);\n  if (!inMatch)\n    return;\n  const [, LHS, RHS] = inMatch;\n  const result = {\n    source: createAliasExpression(\n      loc,\n      RHS.trim(),\n      exp.indexOf(RHS, LHS.length)\n    ),\n    value: void 0,\n    key: void 0,\n    index: void 0\n  };\n  if (!!(process.env.NODE_ENV !== \"production\") && true) {\n    validateBrowserExpression(result.source, context);\n  }\n  let valueContent = LHS.trim().replace(stripParensRE, \"\").trim();\n  const trimmedOffset = LHS.indexOf(valueContent);\n  const iteratorMatch = valueContent.match(forIteratorRE);\n  if (iteratorMatch) {\n    valueContent = valueContent.replace(forIteratorRE, \"\").trim();\n    const keyContent = iteratorMatch[1].trim();\n    let keyOffset;\n    if (keyContent) {\n      keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);\n      result.key = createAliasExpression(loc, keyContent, keyOffset);\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        validateBrowserExpression(\n          result.key,\n          context,\n          true\n        );\n      }\n    }\n    if (iteratorMatch[2]) {\n      const indexContent = iteratorMatch[2].trim();\n      if (indexContent) {\n        result.index = createAliasExpression(\n          loc,\n          indexContent,\n          exp.indexOf(\n            indexContent,\n            result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length\n          )\n        );\n        if (!!(process.env.NODE_ENV !== \"production\") && true) {\n          validateBrowserExpression(\n            result.index,\n            context,\n            true\n          );\n        }\n      }\n    }\n  }\n  if (valueContent) {\n    result.value = createAliasExpression(loc, valueContent, trimmedOffset);\n    if (!!(process.env.NODE_ENV !== \"production\") && true) {\n      validateBrowserExpression(\n        result.value,\n        context,\n        true\n      );\n    }\n  }\n  return result;\n}\nfunction createAliasExpression(range, content, offset) {\n  return createSimpleExpression(\n    content,\n    false,\n    getInnerRange(range, offset, content.length)\n  );\n}\nfunction createForLoopParams({ value, key, index }, memoArgs = []) {\n  return createParamsList([value, key, index, ...memoArgs]);\n}\nfunction createParamsList(args) {\n  let i = args.length;\n  while (i--) {\n    if (args[i])\n      break;\n  }\n  return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false));\n}\n\nconst defaultFallback = createSimpleExpression(`undefined`, false);\nconst trackSlotScopes = (node, context) => {\n  if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) {\n    const vSlot = findDir(node, \"slot\");\n    if (vSlot) {\n      vSlot.exp;\n      context.scopes.vSlot++;\n      return () => {\n        context.scopes.vSlot--;\n      };\n    }\n  }\n};\nconst trackVForSlotScopes = (node, context) => {\n  let vFor;\n  if (isTemplateNode(node) && node.props.some(isVSlot) && (vFor = findDir(node, \"for\"))) {\n    const result = vFor.parseResult = parseForExpression(\n      vFor.exp,\n      context\n    );\n    if (result) {\n      const { value, key, index } = result;\n      const { addIdentifiers, removeIdentifiers } = context;\n      value && addIdentifiers(value);\n      key && addIdentifiers(key);\n      index && addIdentifiers(index);\n      return () => {\n        value && removeIdentifiers(value);\n        key && removeIdentifiers(key);\n        index && removeIdentifiers(index);\n      };\n    }\n  }\n};\nconst buildClientSlotFn = (props, children, loc) => createFunctionExpression(\n  props,\n  children,\n  false,\n  true,\n  children.length ? children[0].loc : loc\n);\nfunction buildSlots(node, context, buildSlotFn = buildClientSlotFn) {\n  context.helper(WITH_CTX);\n  const { children, loc } = node;\n  const slotsProperties = [];\n  const dynamicSlots = [];\n  let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;\n  const onComponentSlot = findDir(node, \"slot\", true);\n  if (onComponentSlot) {\n    const { arg, exp } = onComponentSlot;\n    if (arg && !isStaticExp(arg)) {\n      hasDynamicSlots = true;\n    }\n    slotsProperties.push(\n      createObjectProperty(\n        arg || createSimpleExpression(\"default\", true),\n        buildSlotFn(exp, children, loc)\n      )\n    );\n  }\n  let hasTemplateSlots = false;\n  let hasNamedDefaultSlot = false;\n  const implicitDefaultChildren = [];\n  const seenSlotNames = /* @__PURE__ */ new Set();\n  let conditionalBranchIndex = 0;\n  for (let i = 0; i < children.length; i++) {\n    const slotElement = children[i];\n    let slotDir;\n    if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, \"slot\", true))) {\n      if (slotElement.type !== 3) {\n        implicitDefaultChildren.push(slotElement);\n      }\n      continue;\n    }\n    if (onComponentSlot) {\n      context.onError(\n        createCompilerError(37, slotDir.loc)\n      );\n      break;\n    }\n    hasTemplateSlots = true;\n    const { children: slotChildren, loc: slotLoc } = slotElement;\n    const {\n      arg: slotName = createSimpleExpression(`default`, true),\n      exp: slotProps,\n      loc: dirLoc\n    } = slotDir;\n    let staticSlotName;\n    if (isStaticExp(slotName)) {\n      staticSlotName = slotName ? slotName.content : `default`;\n    } else {\n      hasDynamicSlots = true;\n    }\n    const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);\n    let vIf;\n    let vElse;\n    let vFor;\n    if (vIf = findDir(slotElement, \"if\")) {\n      hasDynamicSlots = true;\n      dynamicSlots.push(\n        createConditionalExpression(\n          vIf.exp,\n          buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++),\n          defaultFallback\n        )\n      );\n    } else if (vElse = findDir(\n      slotElement,\n      /^else(-if)?$/,\n      true\n      /* allowEmpty */\n    )) {\n      let j = i;\n      let prev;\n      while (j--) {\n        prev = children[j];\n        if (prev.type !== 3) {\n          break;\n        }\n      }\n      if (prev && isTemplateNode(prev) && findDir(prev, \"if\")) {\n        children.splice(i, 1);\n        i--;\n        let conditional = dynamicSlots[dynamicSlots.length - 1];\n        while (conditional.alternate.type === 19) {\n          conditional = conditional.alternate;\n        }\n        conditional.alternate = vElse.exp ? createConditionalExpression(\n          vElse.exp,\n          buildDynamicSlot(\n            slotName,\n            slotFunction,\n            conditionalBranchIndex++\n          ),\n          defaultFallback\n        ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);\n      } else {\n        context.onError(\n          createCompilerError(30, vElse.loc)\n        );\n      }\n    } else if (vFor = findDir(slotElement, \"for\")) {\n      hasDynamicSlots = true;\n      const parseResult = vFor.parseResult || parseForExpression(vFor.exp, context);\n      if (parseResult) {\n        dynamicSlots.push(\n          createCallExpression(context.helper(RENDER_LIST), [\n            parseResult.source,\n            createFunctionExpression(\n              createForLoopParams(parseResult),\n              buildDynamicSlot(slotName, slotFunction),\n              true\n              /* force newline */\n            )\n          ])\n        );\n      } else {\n        context.onError(\n          createCompilerError(32, vFor.loc)\n        );\n      }\n    } else {\n      if (staticSlotName) {\n        if (seenSlotNames.has(staticSlotName)) {\n          context.onError(\n            createCompilerError(\n              38,\n              dirLoc\n            )\n          );\n          continue;\n        }\n        seenSlotNames.add(staticSlotName);\n        if (staticSlotName === \"default\") {\n          hasNamedDefaultSlot = true;\n        }\n      }\n      slotsProperties.push(createObjectProperty(slotName, slotFunction));\n    }\n  }\n  if (!onComponentSlot) {\n    const buildDefaultSlotProperty = (props, children2) => {\n      const fn = buildSlotFn(props, children2, loc);\n      if (context.compatConfig) {\n        fn.isNonScopedSlot = true;\n      }\n      return createObjectProperty(`default`, fn);\n    };\n    if (!hasTemplateSlots) {\n      slotsProperties.push(buildDefaultSlotProperty(void 0, children));\n    } else if (implicitDefaultChildren.length && // #3766\n    // with whitespace: 'preserve', whitespaces between slots will end up in\n    // implicitDefaultChildren. Ignore if all implicit children are whitespaces.\n    implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) {\n      if (hasNamedDefaultSlot) {\n        context.onError(\n          createCompilerError(\n            39,\n            implicitDefaultChildren[0].loc\n          )\n        );\n      } else {\n        slotsProperties.push(\n          buildDefaultSlotProperty(void 0, implicitDefaultChildren)\n        );\n      }\n    }\n  }\n  const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1;\n  let slots = createObjectExpression(\n    slotsProperties.concat(\n      createObjectProperty(\n        `_`,\n        // 2 = compiled but dynamic = can skip normalization, but must run diff\n        // 1 = compiled and static = can skip normalization AND diff as optimized\n        createSimpleExpression(\n          slotFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${slotFlagsText[slotFlag]} */` : ``),\n          false\n        )\n      )\n    ),\n    loc\n  );\n  if (dynamicSlots.length) {\n    slots = createCallExpression(context.helper(CREATE_SLOTS), [\n      slots,\n      createArrayExpression(dynamicSlots)\n    ]);\n  }\n  return {\n    slots,\n    hasDynamicSlots\n  };\n}\nfunction buildDynamicSlot(name, fn, index) {\n  const props = [\n    createObjectProperty(`name`, name),\n    createObjectProperty(`fn`, fn)\n  ];\n  if (index != null) {\n    props.push(\n      createObjectProperty(`key`, createSimpleExpression(String(index), true))\n    );\n  }\n  return createObjectExpression(props);\n}\nfunction hasForwardedSlots(children) {\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    switch (child.type) {\n      case 1:\n        if (child.tagType === 2 || hasForwardedSlots(child.children)) {\n          return true;\n        }\n        break;\n      case 9:\n        if (hasForwardedSlots(child.branches))\n          return true;\n        break;\n      case 10:\n      case 11:\n        if (hasForwardedSlots(child.children))\n          return true;\n        break;\n    }\n  }\n  return false;\n}\nfunction isNonWhitespaceContent(node) {\n  if (node.type !== 2 && node.type !== 12)\n    return true;\n  return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content);\n}\n\nconst directiveImportMap = /* @__PURE__ */ new WeakMap();\nconst transformElement = (node, context) => {\n  return function postTransformElement() {\n    node = context.currentNode;\n    if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) {\n      return;\n    }\n    const { tag, props } = node;\n    const isComponent = node.tagType === 1;\n    let vnodeTag = isComponent ? resolveComponentType(node, context) : `\"${tag}\"`;\n    const isDynamicComponent = isObject(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;\n    let vnodeProps;\n    let vnodeChildren;\n    let vnodePatchFlag;\n    let patchFlag = 0;\n    let vnodeDynamicProps;\n    let dynamicPropNames;\n    let vnodeDirectives;\n    let shouldUseBlock = (\n      // dynamic component may resolve to plain elements\n      isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block\n      // updates inside get proper isSVG flag at runtime. (#639, #643)\n      // This is technically web-specific, but splitting the logic out of core\n      // leads to too much unnecessary complexity.\n      (tag === \"svg\" || tag === \"foreignObject\")\n    );\n    if (props.length > 0) {\n      const propsBuildResult = buildProps(\n        node,\n        context,\n        void 0,\n        isComponent,\n        isDynamicComponent\n      );\n      vnodeProps = propsBuildResult.props;\n      patchFlag = propsBuildResult.patchFlag;\n      dynamicPropNames = propsBuildResult.dynamicPropNames;\n      const directives = propsBuildResult.directives;\n      vnodeDirectives = directives && directives.length ? createArrayExpression(\n        directives.map((dir) => buildDirectiveArgs(dir, context))\n      ) : void 0;\n      if (propsBuildResult.shouldUseBlock) {\n        shouldUseBlock = true;\n      }\n    }\n    if (node.children.length > 0) {\n      if (vnodeTag === KEEP_ALIVE) {\n        shouldUseBlock = true;\n        patchFlag |= 1024;\n        if (!!(process.env.NODE_ENV !== \"production\") && node.children.length > 1) {\n          context.onError(\n            createCompilerError(46, {\n              start: node.children[0].loc.start,\n              end: node.children[node.children.length - 1].loc.end,\n              source: \"\"\n            })\n          );\n        }\n      }\n      const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling\n      vnodeTag !== TELEPORT && // explained above.\n      vnodeTag !== KEEP_ALIVE;\n      if (shouldBuildAsSlots) {\n        const { slots, hasDynamicSlots } = buildSlots(node, context);\n        vnodeChildren = slots;\n        if (hasDynamicSlots) {\n          patchFlag |= 1024;\n        }\n      } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {\n        const child = node.children[0];\n        const type = child.type;\n        const hasDynamicTextChild = type === 5 || type === 8;\n        if (hasDynamicTextChild && getConstantType(child, context) === 0) {\n          patchFlag |= 1;\n        }\n        if (hasDynamicTextChild || type === 2) {\n          vnodeChildren = child;\n        } else {\n          vnodeChildren = node.children;\n        }\n      } else {\n        vnodeChildren = node.children;\n      }\n    }\n    if (patchFlag !== 0) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (patchFlag < 0) {\n          vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`;\n        } else {\n          const flagNames = Object.keys(PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => PatchFlagNames[n]).join(`, `);\n          vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;\n        }\n      } else {\n        vnodePatchFlag = String(patchFlag);\n      }\n      if (dynamicPropNames && dynamicPropNames.length) {\n        vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);\n      }\n    }\n    node.codegenNode = createVNodeCall(\n      context,\n      vnodeTag,\n      vnodeProps,\n      vnodeChildren,\n      vnodePatchFlag,\n      vnodeDynamicProps,\n      vnodeDirectives,\n      !!shouldUseBlock,\n      false,\n      isComponent,\n      node.loc\n    );\n  };\n};\nfunction resolveComponentType(node, context, ssr = false) {\n  let { tag } = node;\n  const isExplicitDynamic = isComponentTag(tag);\n  const isProp = findProp(node, \"is\");\n  if (isProp) {\n    if (isExplicitDynamic || isCompatEnabled(\n      \"COMPILER_IS_ON_ELEMENT\",\n      context\n    )) {\n      const exp = isProp.type === 6 ? isProp.value && createSimpleExpression(isProp.value.content, true) : isProp.exp;\n      if (exp) {\n        return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [\n          exp\n        ]);\n      }\n    } else if (isProp.type === 6 && isProp.value.content.startsWith(\"vue:\")) {\n      tag = isProp.value.content.slice(4);\n    }\n  }\n  const isDir = !isExplicitDynamic && findDir(node, \"is\");\n  if (isDir && isDir.exp) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      context.onWarn(\n        createCompilerError(52, isDir.loc)\n      );\n    }\n    return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [\n      isDir.exp\n    ]);\n  }\n  const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);\n  if (builtIn) {\n    if (!ssr)\n      context.helper(builtIn);\n    return builtIn;\n  }\n  context.helper(RESOLVE_COMPONENT);\n  context.components.add(tag);\n  return toValidAssetId(tag, `component`);\n}\nfunction buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {\n  const { tag, loc: elementLoc, children } = node;\n  let properties = [];\n  const mergeArgs = [];\n  const runtimeDirectives = [];\n  const hasChildren = children.length > 0;\n  let shouldUseBlock = false;\n  let patchFlag = 0;\n  let hasRef = false;\n  let hasClassBinding = false;\n  let hasStyleBinding = false;\n  let hasHydrationEventBinding = false;\n  let hasDynamicKeys = false;\n  let hasVnodeHook = false;\n  const dynamicPropNames = [];\n  const pushMergeArg = (arg) => {\n    if (properties.length) {\n      mergeArgs.push(\n        createObjectExpression(dedupeProperties(properties), elementLoc)\n      );\n      properties = [];\n    }\n    if (arg)\n      mergeArgs.push(arg);\n  };\n  const analyzePatchFlag = ({ key, value }) => {\n    if (isStaticExp(key)) {\n      const name = key.content;\n      const isEventHandler = isOn(name);\n      if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click\n      // dedicated fast path.\n      name.toLowerCase() !== \"onclick\" && // omit v-model handlers\n      name !== \"onUpdate:modelValue\" && // omit onVnodeXXX hooks\n      !isReservedProp(name)) {\n        hasHydrationEventBinding = true;\n      }\n      if (isEventHandler && isReservedProp(name)) {\n        hasVnodeHook = true;\n      }\n      if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) {\n        return;\n      }\n      if (name === \"ref\") {\n        hasRef = true;\n      } else if (name === \"class\") {\n        hasClassBinding = true;\n      } else if (name === \"style\") {\n        hasStyleBinding = true;\n      } else if (name !== \"key\" && !dynamicPropNames.includes(name)) {\n        dynamicPropNames.push(name);\n      }\n      if (isComponent && (name === \"class\" || name === \"style\") && !dynamicPropNames.includes(name)) {\n        dynamicPropNames.push(name);\n      }\n    } else {\n      hasDynamicKeys = true;\n    }\n  };\n  for (let i = 0; i < props.length; i++) {\n    const prop = props[i];\n    if (prop.type === 6) {\n      const { loc, name, value } = prop;\n      let isStatic = true;\n      if (name === \"ref\") {\n        hasRef = true;\n        if (context.scopes.vFor > 0) {\n          properties.push(\n            createObjectProperty(\n              createSimpleExpression(\"ref_for\", true),\n              createSimpleExpression(\"true\")\n            )\n          );\n        }\n      }\n      if (name === \"is\" && (isComponentTag(tag) || value && value.content.startsWith(\"vue:\") || isCompatEnabled(\n        \"COMPILER_IS_ON_ELEMENT\",\n        context\n      ))) {\n        continue;\n      }\n      properties.push(\n        createObjectProperty(\n          createSimpleExpression(\n            name,\n            true,\n            getInnerRange(loc, 0, name.length)\n          ),\n          createSimpleExpression(\n            value ? value.content : \"\",\n            isStatic,\n            value ? value.loc : loc\n          )\n        )\n      );\n    } else {\n      const { name, arg, exp, loc } = prop;\n      const isVBind = name === \"bind\";\n      const isVOn = name === \"on\";\n      if (name === \"slot\") {\n        if (!isComponent) {\n          context.onError(\n            createCompilerError(40, loc)\n          );\n        }\n        continue;\n      }\n      if (name === \"once\" || name === \"memo\") {\n        continue;\n      }\n      if (name === \"is\" || isVBind && isStaticArgOf(arg, \"is\") && (isComponentTag(tag) || isCompatEnabled(\n        \"COMPILER_IS_ON_ELEMENT\",\n        context\n      ))) {\n        continue;\n      }\n      if (isVOn && ssr) {\n        continue;\n      }\n      if (\n        // #938: elements with dynamic keys should be forced into blocks\n        isVBind && isStaticArgOf(arg, \"key\") || // inline before-update hooks need to force block so that it is invoked\n        // before children\n        isVOn && hasChildren && isStaticArgOf(arg, \"vue:before-update\")\n      ) {\n        shouldUseBlock = true;\n      }\n      if (isVBind && isStaticArgOf(arg, \"ref\") && context.scopes.vFor > 0) {\n        properties.push(\n          createObjectProperty(\n            createSimpleExpression(\"ref_for\", true),\n            createSimpleExpression(\"true\")\n          )\n        );\n      }\n      if (!arg && (isVBind || isVOn)) {\n        hasDynamicKeys = true;\n        if (exp) {\n          if (isVBind) {\n            pushMergeArg();\n            {\n              if (!!(process.env.NODE_ENV !== \"production\")) {\n                const hasOverridableKeys = mergeArgs.some((arg2) => {\n                  if (arg2.type === 15) {\n                    return arg2.properties.some(({ key }) => {\n                      if (key.type !== 4 || !key.isStatic) {\n                        return true;\n                      }\n                      return key.content !== \"class\" && key.content !== \"style\" && !isOn(key.content);\n                    });\n                  } else {\n                    return true;\n                  }\n                });\n                if (hasOverridableKeys) {\n                  checkCompatEnabled(\n                    \"COMPILER_V_BIND_OBJECT_ORDER\",\n                    context,\n                    loc\n                  );\n                }\n              }\n              if (isCompatEnabled(\n                \"COMPILER_V_BIND_OBJECT_ORDER\",\n                context\n              )) {\n                mergeArgs.unshift(exp);\n                continue;\n              }\n            }\n            mergeArgs.push(exp);\n          } else {\n            pushMergeArg({\n              type: 14,\n              loc,\n              callee: context.helper(TO_HANDLERS),\n              arguments: isComponent ? [exp] : [exp, `true`]\n            });\n          }\n        } else {\n          context.onError(\n            createCompilerError(\n              isVBind ? 34 : 35,\n              loc\n            )\n          );\n        }\n        continue;\n      }\n      const directiveTransform = context.directiveTransforms[name];\n      if (directiveTransform) {\n        const { props: props2, needRuntime } = directiveTransform(prop, node, context);\n        !ssr && props2.forEach(analyzePatchFlag);\n        if (isVOn && arg && !isStaticExp(arg)) {\n          pushMergeArg(createObjectExpression(props2, elementLoc));\n        } else {\n          properties.push(...props2);\n        }\n        if (needRuntime) {\n          runtimeDirectives.push(prop);\n          if (isSymbol(needRuntime)) {\n            directiveImportMap.set(prop, needRuntime);\n          }\n        }\n      } else if (!isBuiltInDirective(name)) {\n        runtimeDirectives.push(prop);\n        if (hasChildren) {\n          shouldUseBlock = true;\n        }\n      }\n    }\n  }\n  let propsExpression = void 0;\n  if (mergeArgs.length) {\n    pushMergeArg();\n    if (mergeArgs.length > 1) {\n      propsExpression = createCallExpression(\n        context.helper(MERGE_PROPS),\n        mergeArgs,\n        elementLoc\n      );\n    } else {\n      propsExpression = mergeArgs[0];\n    }\n  } else if (properties.length) {\n    propsExpression = createObjectExpression(\n      dedupeProperties(properties),\n      elementLoc\n    );\n  }\n  if (hasDynamicKeys) {\n    patchFlag |= 16;\n  } else {\n    if (hasClassBinding && !isComponent) {\n      patchFlag |= 2;\n    }\n    if (hasStyleBinding && !isComponent) {\n      patchFlag |= 4;\n    }\n    if (dynamicPropNames.length) {\n      patchFlag |= 8;\n    }\n    if (hasHydrationEventBinding) {\n      patchFlag |= 32;\n    }\n  }\n  if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {\n    patchFlag |= 512;\n  }\n  if (!context.inSSR && propsExpression) {\n    switch (propsExpression.type) {\n      case 15:\n        let classKeyIndex = -1;\n        let styleKeyIndex = -1;\n        let hasDynamicKey = false;\n        for (let i = 0; i < propsExpression.properties.length; i++) {\n          const key = propsExpression.properties[i].key;\n          if (isStaticExp(key)) {\n            if (key.content === \"class\") {\n              classKeyIndex = i;\n            } else if (key.content === \"style\") {\n              styleKeyIndex = i;\n            }\n          } else if (!key.isHandlerKey) {\n            hasDynamicKey = true;\n          }\n        }\n        const classProp = propsExpression.properties[classKeyIndex];\n        const styleProp = propsExpression.properties[styleKeyIndex];\n        if (!hasDynamicKey) {\n          if (classProp && !isStaticExp(classProp.value)) {\n            classProp.value = createCallExpression(\n              context.helper(NORMALIZE_CLASS),\n              [classProp.value]\n            );\n          }\n          if (styleProp && // the static style is compiled into an object,\n          // so use `hasStyleBinding` to ensure that it is a dynamic style binding\n          (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist,\n          // v-bind:style with static literal object\n          styleProp.value.type === 17)) {\n            styleProp.value = createCallExpression(\n              context.helper(NORMALIZE_STYLE),\n              [styleProp.value]\n            );\n          }\n        } else {\n          propsExpression = createCallExpression(\n            context.helper(NORMALIZE_PROPS),\n            [propsExpression]\n          );\n        }\n        break;\n      case 14:\n        break;\n      default:\n        propsExpression = createCallExpression(\n          context.helper(NORMALIZE_PROPS),\n          [\n            createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [\n              propsExpression\n            ])\n          ]\n        );\n        break;\n    }\n  }\n  return {\n    props: propsExpression,\n    directives: runtimeDirectives,\n    patchFlag,\n    dynamicPropNames,\n    shouldUseBlock\n  };\n}\nfunction dedupeProperties(properties) {\n  const knownProps = /* @__PURE__ */ new Map();\n  const deduped = [];\n  for (let i = 0; i < properties.length; i++) {\n    const prop = properties[i];\n    if (prop.key.type === 8 || !prop.key.isStatic) {\n      deduped.push(prop);\n      continue;\n    }\n    const name = prop.key.content;\n    const existing = knownProps.get(name);\n    if (existing) {\n      if (name === \"style\" || name === \"class\" || isOn(name)) {\n        mergeAsArray(existing, prop);\n      }\n    } else {\n      knownProps.set(name, prop);\n      deduped.push(prop);\n    }\n  }\n  return deduped;\n}\nfunction mergeAsArray(existing, incoming) {\n  if (existing.value.type === 17) {\n    existing.value.elements.push(incoming.value);\n  } else {\n    existing.value = createArrayExpression(\n      [existing.value, incoming.value],\n      existing.loc\n    );\n  }\n}\nfunction buildDirectiveArgs(dir, context) {\n  const dirArgs = [];\n  const runtime = directiveImportMap.get(dir);\n  if (runtime) {\n    dirArgs.push(context.helperString(runtime));\n  } else {\n    {\n      context.helper(RESOLVE_DIRECTIVE);\n      context.directives.add(dir.name);\n      dirArgs.push(toValidAssetId(dir.name, `directive`));\n    }\n  }\n  const { loc } = dir;\n  if (dir.exp)\n    dirArgs.push(dir.exp);\n  if (dir.arg) {\n    if (!dir.exp) {\n      dirArgs.push(`void 0`);\n    }\n    dirArgs.push(dir.arg);\n  }\n  if (Object.keys(dir.modifiers).length) {\n    if (!dir.arg) {\n      if (!dir.exp) {\n        dirArgs.push(`void 0`);\n      }\n      dirArgs.push(`void 0`);\n    }\n    const trueExpression = createSimpleExpression(`true`, false, loc);\n    dirArgs.push(\n      createObjectExpression(\n        dir.modifiers.map(\n          (modifier) => createObjectProperty(modifier, trueExpression)\n        ),\n        loc\n      )\n    );\n  }\n  return createArrayExpression(dirArgs, dir.loc);\n}\nfunction stringifyDynamicPropNames(props) {\n  let propsNamesString = `[`;\n  for (let i = 0, l = props.length; i < l; i++) {\n    propsNamesString += JSON.stringify(props[i]);\n    if (i < l - 1)\n      propsNamesString += \", \";\n  }\n  return propsNamesString + `]`;\n}\nfunction isComponentTag(tag) {\n  return tag === \"component\" || tag === \"Component\";\n}\n\nconst transformSlotOutlet = (node, context) => {\n  if (isSlotOutlet(node)) {\n    const { children, loc } = node;\n    const { slotName, slotProps } = processSlotOutlet(node, context);\n    const slotArgs = [\n      context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,\n      slotName,\n      \"{}\",\n      \"undefined\",\n      \"true\"\n    ];\n    let expectedLen = 2;\n    if (slotProps) {\n      slotArgs[2] = slotProps;\n      expectedLen = 3;\n    }\n    if (children.length) {\n      slotArgs[3] = createFunctionExpression([], children, false, false, loc);\n      expectedLen = 4;\n    }\n    if (context.scopeId && !context.slotted) {\n      expectedLen = 5;\n    }\n    slotArgs.splice(expectedLen);\n    node.codegenNode = createCallExpression(\n      context.helper(RENDER_SLOT),\n      slotArgs,\n      loc\n    );\n  }\n};\nfunction processSlotOutlet(node, context) {\n  let slotName = `\"default\"`;\n  let slotProps = void 0;\n  const nonNameProps = [];\n  for (let i = 0; i < node.props.length; i++) {\n    const p = node.props[i];\n    if (p.type === 6) {\n      if (p.value) {\n        if (p.name === \"name\") {\n          slotName = JSON.stringify(p.value.content);\n        } else {\n          p.name = camelize(p.name);\n          nonNameProps.push(p);\n        }\n      }\n    } else {\n      if (p.name === \"bind\" && isStaticArgOf(p.arg, \"name\")) {\n        if (p.exp)\n          slotName = p.exp;\n      } else {\n        if (p.name === \"bind\" && p.arg && isStaticExp(p.arg)) {\n          p.arg.content = camelize(p.arg.content);\n        }\n        nonNameProps.push(p);\n      }\n    }\n  }\n  if (nonNameProps.length > 0) {\n    const { props, directives } = buildProps(\n      node,\n      context,\n      nonNameProps,\n      false,\n      false\n    );\n    slotProps = props;\n    if (directives.length) {\n      context.onError(\n        createCompilerError(\n          36,\n          directives[0].loc\n        )\n      );\n    }\n  }\n  return {\n    slotName,\n    slotProps\n  };\n}\n\nconst fnExpRE = /^\\s*([\\w$_]+|(async\\s*)?\\([^)]*?\\))\\s*(:[^=]+)?=>|^\\s*(async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/;\nconst transformOn = (dir, node, context, augmentor) => {\n  const { loc, modifiers, arg } = dir;\n  if (!dir.exp && !modifiers.length) {\n    context.onError(createCompilerError(35, loc));\n  }\n  let eventName;\n  if (arg.type === 4) {\n    if (arg.isStatic) {\n      let rawName = arg.content;\n      if (!!(process.env.NODE_ENV !== \"production\") && rawName.startsWith(\"vnode\")) {\n        context.onWarn(\n          createCompilerError(51, arg.loc)\n        );\n      }\n      if (rawName.startsWith(\"vue:\")) {\n        rawName = `vnode-${rawName.slice(4)}`;\n      }\n      const eventString = node.tagType !== 0 || rawName.startsWith(\"vnode\") || !/[A-Z]/.test(rawName) ? (\n        // for non-element and vnode lifecycle event listeners, auto convert\n        // it to camelCase. See issue #2249\n        toHandlerKey(camelize(rawName))\n      ) : (\n        // preserve case for plain element listeners that have uppercase\n        // letters, as these may be custom elements' custom events\n        `on:${rawName}`\n      );\n      eventName = createSimpleExpression(eventString, true, arg.loc);\n    } else {\n      eventName = createCompoundExpression([\n        `${context.helperString(TO_HANDLER_KEY)}(`,\n        arg,\n        `)`\n      ]);\n    }\n  } else {\n    eventName = arg;\n    eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);\n    eventName.children.push(`)`);\n  }\n  let exp = dir.exp;\n  if (exp && !exp.content.trim()) {\n    exp = void 0;\n  }\n  let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;\n  if (exp) {\n    const isMemberExp = isMemberExpression(exp.content);\n    const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));\n    const hasMultipleStatements = exp.content.includes(`;`);\n    if (!!(process.env.NODE_ENV !== \"production\") && true) {\n      validateBrowserExpression(\n        exp,\n        context,\n        false,\n        hasMultipleStatements\n      );\n    }\n    if (isInlineStatement || shouldCache && isMemberExp) {\n      exp = createCompoundExpression([\n        `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,\n        exp,\n        hasMultipleStatements ? `}` : `)`\n      ]);\n    }\n  }\n  let ret = {\n    props: [\n      createObjectProperty(\n        eventName,\n        exp || createSimpleExpression(`() => {}`, false, loc)\n      )\n    ]\n  };\n  if (augmentor) {\n    ret = augmentor(ret);\n  }\n  if (shouldCache) {\n    ret.props[0].value = context.cache(ret.props[0].value);\n  }\n  ret.props.forEach((p) => p.key.isHandlerKey = true);\n  return ret;\n};\n\nconst transformBind = (dir, _node, context) => {\n  const { exp, modifiers, loc } = dir;\n  const arg = dir.arg;\n  if (arg.type !== 4) {\n    arg.children.unshift(`(`);\n    arg.children.push(`) || \"\"`);\n  } else if (!arg.isStatic) {\n    arg.content = `${arg.content} || \"\"`;\n  }\n  if (modifiers.includes(\"camel\")) {\n    if (arg.type === 4) {\n      if (arg.isStatic) {\n        arg.content = camelize(arg.content);\n      } else {\n        arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;\n      }\n    } else {\n      arg.children.unshift(`${context.helperString(CAMELIZE)}(`);\n      arg.children.push(`)`);\n    }\n  }\n  if (!context.inSSR) {\n    if (modifiers.includes(\"prop\")) {\n      injectPrefix(arg, \".\");\n    }\n    if (modifiers.includes(\"attr\")) {\n      injectPrefix(arg, \"^\");\n    }\n  }\n  if (!exp || exp.type === 4 && !exp.content.trim()) {\n    context.onError(createCompilerError(34, loc));\n    return {\n      props: [createObjectProperty(arg, createSimpleExpression(\"\", true, loc))]\n    };\n  }\n  return {\n    props: [createObjectProperty(arg, exp)]\n  };\n};\nconst injectPrefix = (arg, prefix) => {\n  if (arg.type === 4) {\n    if (arg.isStatic) {\n      arg.content = prefix + arg.content;\n    } else {\n      arg.content = `\\`${prefix}\\${${arg.content}}\\``;\n    }\n  } else {\n    arg.children.unshift(`'${prefix}' + (`);\n    arg.children.push(`)`);\n  }\n};\n\nconst transformText = (node, context) => {\n  if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) {\n    return () => {\n      const children = node.children;\n      let currentContainer = void 0;\n      let hasText = false;\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (isText$1(child)) {\n          hasText = true;\n          for (let j = i + 1; j < children.length; j++) {\n            const next = children[j];\n            if (isText$1(next)) {\n              if (!currentContainer) {\n                currentContainer = children[i] = createCompoundExpression(\n                  [child],\n                  child.loc\n                );\n              }\n              currentContainer.children.push(` + `, next);\n              children.splice(j, 1);\n              j--;\n            } else {\n              currentContainer = void 0;\n              break;\n            }\n          }\n        }\n      }\n      if (!hasText || // if this is a plain element with a single text child, leave it\n      // as-is since the runtime has dedicated fast path for this by directly\n      // setting textContent of the element.\n      // for component root it's always normalized anyway.\n      children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756\n      // custom directives can potentially add DOM elements arbitrarily,\n      // we need to avoid setting textContent of the element at runtime\n      // to avoid accidentally overwriting the DOM elements added\n      // by the user through custom directives.\n      !node.props.find(\n        (p) => p.type === 7 && !context.directiveTransforms[p.name]\n      ) && // in compat mode, <template> tags with no special directives\n      // will be rendered as a fragment so its children must be\n      // converted into vnodes.\n      !(node.tag === \"template\"))) {\n        return;\n      }\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (isText$1(child) || child.type === 8) {\n          const callArgs = [];\n          if (child.type !== 2 || child.content !== \" \") {\n            callArgs.push(child);\n          }\n          if (!context.ssr && getConstantType(child, context) === 0) {\n            callArgs.push(\n              1 + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${PatchFlagNames[1]} */` : ``)\n            );\n          }\n          children[i] = {\n            type: 12,\n            content: child,\n            loc: child.loc,\n            codegenNode: createCallExpression(\n              context.helper(CREATE_TEXT),\n              callArgs\n            )\n          };\n        }\n      }\n    };\n  }\n};\n\nconst seen$1 = /* @__PURE__ */ new WeakSet();\nconst transformOnce = (node, context) => {\n  if (node.type === 1 && findDir(node, \"once\", true)) {\n    if (seen$1.has(node) || context.inVOnce || context.inSSR) {\n      return;\n    }\n    seen$1.add(node);\n    context.inVOnce = true;\n    context.helper(SET_BLOCK_TRACKING);\n    return () => {\n      context.inVOnce = false;\n      const cur = context.currentNode;\n      if (cur.codegenNode) {\n        cur.codegenNode = context.cache(\n          cur.codegenNode,\n          true\n          /* isVNode */\n        );\n      }\n    };\n  }\n};\n\nconst transformModel = (dir, node, context) => {\n  const { exp, arg } = dir;\n  if (!exp) {\n    context.onError(\n      createCompilerError(41, dir.loc)\n    );\n    return createTransformProps();\n  }\n  const rawExp = exp.loc.source;\n  const expString = exp.type === 4 ? exp.content : rawExp;\n  const bindingType = context.bindingMetadata[rawExp];\n  if (bindingType === \"props\" || bindingType === \"props-aliased\") {\n    context.onError(createCompilerError(44, exp.loc));\n    return createTransformProps();\n  }\n  const maybeRef = false;\n  if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) {\n    context.onError(\n      createCompilerError(42, exp.loc)\n    );\n    return createTransformProps();\n  }\n  const propName = arg ? arg : createSimpleExpression(\"modelValue\", true);\n  const eventName = arg ? isStaticExp(arg) ? `onUpdate:${camelize(arg.content)}` : createCompoundExpression(['\"onUpdate:\" + ', arg]) : `onUpdate:modelValue`;\n  let assignmentExp;\n  const eventArg = context.isTS ? `($event: any)` : `$event`;\n  {\n    assignmentExp = createCompoundExpression([\n      `${eventArg} => ((`,\n      exp,\n      `) = $event)`\n    ]);\n  }\n  const props = [\n    // modelValue: foo\n    createObjectProperty(propName, dir.exp),\n    // \"onUpdate:modelValue\": $event => (foo = $event)\n    createObjectProperty(eventName, assignmentExp)\n  ];\n  if (dir.modifiers.length && node.tagType === 1) {\n    const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `);\n    const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + \"Modifiers\"']) : `modelModifiers`;\n    props.push(\n      createObjectProperty(\n        modifiersKey,\n        createSimpleExpression(\n          `{ ${modifiers} }`,\n          false,\n          dir.loc,\n          2\n        )\n      )\n    );\n  }\n  return createTransformProps(props);\n};\nfunction createTransformProps(props = []) {\n  return { props };\n}\n\nconst validDivisionCharRE = /[\\w).+\\-_$\\]]/;\nconst transformFilter = (node, context) => {\n  if (!isCompatEnabled(\"COMPILER_FILTER\", context)) {\n    return;\n  }\n  if (node.type === 5) {\n    rewriteFilter(node.content, context);\n  }\n  if (node.type === 1) {\n    node.props.forEach((prop) => {\n      if (prop.type === 7 && prop.name !== \"for\" && prop.exp) {\n        rewriteFilter(prop.exp, context);\n      }\n    });\n  }\n};\nfunction rewriteFilter(node, context) {\n  if (node.type === 4) {\n    parseFilter(node, context);\n  } else {\n    for (let i = 0; i < node.children.length; i++) {\n      const child = node.children[i];\n      if (typeof child !== \"object\")\n        continue;\n      if (child.type === 4) {\n        parseFilter(child, context);\n      } else if (child.type === 8) {\n        rewriteFilter(node, context);\n      } else if (child.type === 5) {\n        rewriteFilter(child.content, context);\n      }\n    }\n  }\n}\nfunction parseFilter(node, context) {\n  const exp = node.content;\n  let inSingle = false;\n  let inDouble = false;\n  let inTemplateString = false;\n  let inRegex = false;\n  let curly = 0;\n  let square = 0;\n  let paren = 0;\n  let lastFilterIndex = 0;\n  let c, prev, i, expression, filters = [];\n  for (i = 0; i < exp.length; i++) {\n    prev = c;\n    c = exp.charCodeAt(i);\n    if (inSingle) {\n      if (c === 39 && prev !== 92)\n        inSingle = false;\n    } else if (inDouble) {\n      if (c === 34 && prev !== 92)\n        inDouble = false;\n    } else if (inTemplateString) {\n      if (c === 96 && prev !== 92)\n        inTemplateString = false;\n    } else if (inRegex) {\n      if (c === 47 && prev !== 92)\n        inRegex = false;\n    } else if (c === 124 && // pipe\n    exp.charCodeAt(i + 1) !== 124 && exp.charCodeAt(i - 1) !== 124 && !curly && !square && !paren) {\n      if (expression === void 0) {\n        lastFilterIndex = i + 1;\n        expression = exp.slice(0, i).trim();\n      } else {\n        pushFilter();\n      }\n    } else {\n      switch (c) {\n        case 34:\n          inDouble = true;\n          break;\n        case 39:\n          inSingle = true;\n          break;\n        case 96:\n          inTemplateString = true;\n          break;\n        case 40:\n          paren++;\n          break;\n        case 41:\n          paren--;\n          break;\n        case 91:\n          square++;\n          break;\n        case 93:\n          square--;\n          break;\n        case 123:\n          curly++;\n          break;\n        case 125:\n          curly--;\n          break;\n      }\n      if (c === 47) {\n        let j = i - 1;\n        let p;\n        for (; j >= 0; j--) {\n          p = exp.charAt(j);\n          if (p !== \" \")\n            break;\n        }\n        if (!p || !validDivisionCharRE.test(p)) {\n          inRegex = true;\n        }\n      }\n    }\n  }\n  if (expression === void 0) {\n    expression = exp.slice(0, i).trim();\n  } else if (lastFilterIndex !== 0) {\n    pushFilter();\n  }\n  function pushFilter() {\n    filters.push(exp.slice(lastFilterIndex, i).trim());\n    lastFilterIndex = i + 1;\n  }\n  if (filters.length) {\n    !!(process.env.NODE_ENV !== \"production\") && warnDeprecation(\n      \"COMPILER_FILTER\",\n      context,\n      node.loc\n    );\n    for (i = 0; i < filters.length; i++) {\n      expression = wrapFilter(expression, filters[i], context);\n    }\n    node.content = expression;\n  }\n}\nfunction wrapFilter(exp, filter, context) {\n  context.helper(RESOLVE_FILTER);\n  const i = filter.indexOf(\"(\");\n  if (i < 0) {\n    context.filters.add(filter);\n    return `${toValidAssetId(filter, \"filter\")}(${exp})`;\n  } else {\n    const name = filter.slice(0, i);\n    const args = filter.slice(i + 1);\n    context.filters.add(name);\n    return `${toValidAssetId(name, \"filter\")}(${exp}${args !== \")\" ? \",\" + args : args}`;\n  }\n}\n\nconst seen = /* @__PURE__ */ new WeakSet();\nconst transformMemo = (node, context) => {\n  if (node.type === 1) {\n    const dir = findDir(node, \"memo\");\n    if (!dir || seen.has(node)) {\n      return;\n    }\n    seen.add(node);\n    return () => {\n      const codegenNode = node.codegenNode || context.currentNode.codegenNode;\n      if (codegenNode && codegenNode.type === 13) {\n        if (node.tagType !== 1) {\n          convertToBlock(codegenNode, context);\n        }\n        node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [\n          dir.exp,\n          createFunctionExpression(void 0, codegenNode),\n          `_cache`,\n          String(context.cached++)\n        ]);\n      }\n    };\n  }\n};\n\nfunction getBaseTransformPreset(prefixIdentifiers) {\n  return [\n    [\n      transformOnce,\n      transformIf,\n      transformMemo,\n      transformFor,\n      ...[transformFilter] ,\n      ...!!(process.env.NODE_ENV !== \"production\") ? [transformExpression] : [],\n      transformSlotOutlet,\n      transformElement,\n      trackSlotScopes,\n      transformText\n    ],\n    {\n      on: transformOn,\n      bind: transformBind,\n      model: transformModel\n    }\n  ];\n}\nfunction baseCompile(template, options = {}) {\n  const onError = options.onError || defaultOnError;\n  const isModuleMode = options.mode === \"module\";\n  {\n    if (options.prefixIdentifiers === true) {\n      onError(createCompilerError(47));\n    } else if (isModuleMode) {\n      onError(createCompilerError(48));\n    }\n  }\n  const prefixIdentifiers = false;\n  if (options.cacheHandlers) {\n    onError(createCompilerError(49));\n  }\n  if (options.scopeId && !isModuleMode) {\n    onError(createCompilerError(50));\n  }\n  const ast = isString(template) ? baseParse(template, options) : template;\n  const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();\n  transform(\n    ast,\n    extend({}, options, {\n      prefixIdentifiers,\n      nodeTransforms: [\n        ...nodeTransforms,\n        ...options.nodeTransforms || []\n        // user transforms\n      ],\n      directiveTransforms: extend(\n        {},\n        directiveTransforms,\n        options.directiveTransforms || {}\n        // user transforms\n      )\n    })\n  );\n  return generate(\n    ast,\n    extend({}, options, {\n      prefixIdentifiers\n    })\n  );\n}\n\nconst noopDirectiveTransform = () => ({ props: [] });\n\nexport { BASE_TRANSITION, CAMELIZE, CAPITALIZE, CREATE_BLOCK, CREATE_COMMENT, CREATE_ELEMENT_BLOCK, CREATE_ELEMENT_VNODE, CREATE_SLOTS, CREATE_STATIC, CREATE_TEXT, CREATE_VNODE, FRAGMENT, GUARD_REACTIVE_PROPS, IS_MEMO_SAME, IS_REF, KEEP_ALIVE, MERGE_PROPS, NORMALIZE_CLASS, NORMALIZE_PROPS, NORMALIZE_STYLE, OPEN_BLOCK, POP_SCOPE_ID, PUSH_SCOPE_ID, RENDER_LIST, RENDER_SLOT, RESOLVE_COMPONENT, RESOLVE_DIRECTIVE, RESOLVE_DYNAMIC_COMPONENT, RESOLVE_FILTER, SET_BLOCK_TRACKING, SUSPENSE, TELEPORT, TO_DISPLAY_STRING, TO_HANDLERS, TO_HANDLER_KEY, TS_NODE_TYPES, UNREF, WITH_CTX, WITH_DIRECTIVES, WITH_MEMO, advancePositionWithClone, advancePositionWithMutation, assert, baseCompile, baseParse, buildDirectiveArgs, buildProps, buildSlots, checkCompatEnabled, convertToBlock, createArrayExpression, createAssignmentExpression, createBlockStatement, createCacheExpression, createCallExpression, createCompilerError, createCompoundExpression, createConditionalExpression, createForLoopParams, createFunctionExpression, createIfStatement, createInterpolation, createObjectExpression, createObjectProperty, createReturnStatement, createRoot, createSequenceExpression, createSimpleExpression, createStructuralDirectiveTransform, createTemplateLiteral, createTransformContext, createVNodeCall, extractIdentifiers, findDir, findProp, generate, getBaseTransformPreset, getConstantType, getInnerRange, getMemoedVNodeCall, getVNodeBlockHelper, getVNodeHelper, hasDynamicKeyVBind, hasScopeRef, helperNameMap, injectProp, isBuiltInType, isCoreComponent, isFunctionType, isInDestructureAssignment, isMemberExpression, isMemberExpressionBrowser, isMemberExpressionNode, isReferencedIdentifier, isSimpleIdentifier, isSlotOutlet, isStaticArgOf, isStaticExp, isStaticProperty, isStaticPropertyKey, isTemplateNode, isText$1 as isText, isVSlot, locStub, noopDirectiveTransform, processExpression, processFor, processIf, processSlotOutlet, registerRuntimeHelpers, resolveComponentType, stringifyExpression, toValidAssetId, trackSlotScopes, trackVForSlotScopes, transform, transformBind, transformElement, transformExpression, transformModel, transformOn, traverseNode, walkBlockDeclarations, walkFunctionParams, walkIdentifiers, warnDeprecation };\n","import { registerRuntimeHelpers, isBuiltInType, createSimpleExpression, createCompilerError, createObjectProperty, getConstantType, createCallExpression, TO_DISPLAY_STRING, transformModel as transformModel$1, findProp, hasDynamicKeyVBind, transformOn as transformOn$1, isStaticExp, createCompoundExpression, checkCompatEnabled, noopDirectiveTransform, baseCompile, baseParse } from '@vue/compiler-core';\nexport * from '@vue/compiler-core';\nimport { isVoidTag, isHTMLTag, isSVGTag, makeMap, parseStringStyle, capitalize, extend } from '@vue/shared';\n\nconst V_MODEL_RADIO = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelRadio` : ``);\nconst V_MODEL_CHECKBOX = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelCheckbox` : ``);\nconst V_MODEL_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelText` : ``);\nconst V_MODEL_SELECT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelSelect` : ``);\nconst V_MODEL_DYNAMIC = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelDynamic` : ``);\nconst V_ON_WITH_MODIFIERS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vOnModifiersGuard` : ``);\nconst V_ON_WITH_KEYS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vOnKeysGuard` : ``);\nconst V_SHOW = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vShow` : ``);\nconst TRANSITION = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Transition` : ``);\nconst TRANSITION_GROUP = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `TransitionGroup` : ``);\nregisterRuntimeHelpers({\n  [V_MODEL_RADIO]: `vModelRadio`,\n  [V_MODEL_CHECKBOX]: `vModelCheckbox`,\n  [V_MODEL_TEXT]: `vModelText`,\n  [V_MODEL_SELECT]: `vModelSelect`,\n  [V_MODEL_DYNAMIC]: `vModelDynamic`,\n  [V_ON_WITH_MODIFIERS]: `withModifiers`,\n  [V_ON_WITH_KEYS]: `withKeys`,\n  [V_SHOW]: `vShow`,\n  [TRANSITION]: `Transition`,\n  [TRANSITION_GROUP]: `TransitionGroup`\n});\n\nlet decoder;\nfunction decodeHtmlBrowser(raw, asAttr = false) {\n  if (!decoder) {\n    decoder = document.createElement(\"div\");\n  }\n  if (asAttr) {\n    decoder.innerHTML = `<div foo=\"${raw.replace(/\"/g, \"&quot;\")}\">`;\n    return decoder.children[0].getAttribute(\"foo\");\n  } else {\n    decoder.innerHTML = raw;\n    return decoder.textContent;\n  }\n}\n\nconst isRawTextContainer = /* @__PURE__ */ makeMap(\n  \"style,iframe,script,noscript\",\n  true\n);\nconst parserOptions = {\n  isVoidTag,\n  isNativeTag: (tag) => isHTMLTag(tag) || isSVGTag(tag),\n  isPreTag: (tag) => tag === \"pre\",\n  decodeEntities: decodeHtmlBrowser ,\n  isBuiltInComponent: (tag) => {\n    if (isBuiltInType(tag, `Transition`)) {\n      return TRANSITION;\n    } else if (isBuiltInType(tag, `TransitionGroup`)) {\n      return TRANSITION_GROUP;\n    }\n  },\n  // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher\n  getNamespace(tag, parent) {\n    let ns = parent ? parent.ns : 0;\n    if (parent && ns === 2) {\n      if (parent.tag === \"annotation-xml\") {\n        if (tag === \"svg\") {\n          return 1;\n        }\n        if (parent.props.some(\n          (a) => a.type === 6 && a.name === \"encoding\" && a.value != null && (a.value.content === \"text/html\" || a.value.content === \"application/xhtml+xml\")\n        )) {\n          ns = 0;\n        }\n      } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== \"mglyph\" && tag !== \"malignmark\") {\n        ns = 0;\n      }\n    } else if (parent && ns === 1) {\n      if (parent.tag === \"foreignObject\" || parent.tag === \"desc\" || parent.tag === \"title\") {\n        ns = 0;\n      }\n    }\n    if (ns === 0) {\n      if (tag === \"svg\") {\n        return 1;\n      }\n      if (tag === \"math\") {\n        return 2;\n      }\n    }\n    return ns;\n  },\n  // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments\n  getTextMode({ tag, ns }) {\n    if (ns === 0) {\n      if (tag === \"textarea\" || tag === \"title\") {\n        return 1;\n      }\n      if (isRawTextContainer(tag)) {\n        return 2;\n      }\n    }\n    return 0;\n  }\n};\n\nconst transformStyle = (node) => {\n  if (node.type === 1) {\n    node.props.forEach((p, i) => {\n      if (p.type === 6 && p.name === \"style\" && p.value) {\n        node.props[i] = {\n          type: 7,\n          name: `bind`,\n          arg: createSimpleExpression(`style`, true, p.loc),\n          exp: parseInlineCSS(p.value.content, p.loc),\n          modifiers: [],\n          loc: p.loc\n        };\n      }\n    });\n  }\n};\nconst parseInlineCSS = (cssText, loc) => {\n  const normalized = parseStringStyle(cssText);\n  return createSimpleExpression(\n    JSON.stringify(normalized),\n    false,\n    loc,\n    3\n  );\n};\n\nfunction createDOMCompilerError(code, loc) {\n  return createCompilerError(\n    code,\n    loc,\n    !!(process.env.NODE_ENV !== \"production\") || false ? DOMErrorMessages : void 0\n  );\n}\nconst DOMErrorMessages = {\n  [53]: `v-html is missing expression.`,\n  [54]: `v-html will override element children.`,\n  [55]: `v-text is missing expression.`,\n  [56]: `v-text will override element children.`,\n  [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,\n  [58]: `v-model argument is not supported on plain elements.`,\n  [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,\n  [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,\n  [61]: `v-show is missing expression.`,\n  [62]: `<Transition> expects exactly one child element or component.`,\n  [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`\n};\n\nconst transformVHtml = (dir, node, context) => {\n  const { exp, loc } = dir;\n  if (!exp) {\n    context.onError(\n      createDOMCompilerError(53, loc)\n    );\n  }\n  if (node.children.length) {\n    context.onError(\n      createDOMCompilerError(54, loc)\n    );\n    node.children.length = 0;\n  }\n  return {\n    props: [\n      createObjectProperty(\n        createSimpleExpression(`innerHTML`, true, loc),\n        exp || createSimpleExpression(\"\", true)\n      )\n    ]\n  };\n};\n\nconst transformVText = (dir, node, context) => {\n  const { exp, loc } = dir;\n  if (!exp) {\n    context.onError(\n      createDOMCompilerError(55, loc)\n    );\n  }\n  if (node.children.length) {\n    context.onError(\n      createDOMCompilerError(56, loc)\n    );\n    node.children.length = 0;\n  }\n  return {\n    props: [\n      createObjectProperty(\n        createSimpleExpression(`textContent`, true),\n        exp ? getConstantType(exp, context) > 0 ? exp : createCallExpression(\n          context.helperString(TO_DISPLAY_STRING),\n          [exp],\n          loc\n        ) : createSimpleExpression(\"\", true)\n      )\n    ]\n  };\n};\n\nconst transformModel = (dir, node, context) => {\n  const baseResult = transformModel$1(dir, node, context);\n  if (!baseResult.props.length || node.tagType === 1) {\n    return baseResult;\n  }\n  if (dir.arg) {\n    context.onError(\n      createDOMCompilerError(\n        58,\n        dir.arg.loc\n      )\n    );\n  }\n  function checkDuplicatedValue() {\n    const value = findProp(node, \"value\");\n    if (value) {\n      context.onError(\n        createDOMCompilerError(\n          60,\n          value.loc\n        )\n      );\n    }\n  }\n  const { tag } = node;\n  const isCustomElement = context.isCustomElement(tag);\n  if (tag === \"input\" || tag === \"textarea\" || tag === \"select\" || isCustomElement) {\n    let directiveToUse = V_MODEL_TEXT;\n    let isInvalidType = false;\n    if (tag === \"input\" || isCustomElement) {\n      const type = findProp(node, `type`);\n      if (type) {\n        if (type.type === 7) {\n          directiveToUse = V_MODEL_DYNAMIC;\n        } else if (type.value) {\n          switch (type.value.content) {\n            case \"radio\":\n              directiveToUse = V_MODEL_RADIO;\n              break;\n            case \"checkbox\":\n              directiveToUse = V_MODEL_CHECKBOX;\n              break;\n            case \"file\":\n              isInvalidType = true;\n              context.onError(\n                createDOMCompilerError(\n                  59,\n                  dir.loc\n                )\n              );\n              break;\n            default:\n              !!(process.env.NODE_ENV !== \"production\") && checkDuplicatedValue();\n              break;\n          }\n        }\n      } else if (hasDynamicKeyVBind(node)) {\n        directiveToUse = V_MODEL_DYNAMIC;\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && checkDuplicatedValue();\n      }\n    } else if (tag === \"select\") {\n      directiveToUse = V_MODEL_SELECT;\n    } else {\n      !!(process.env.NODE_ENV !== \"production\") && checkDuplicatedValue();\n    }\n    if (!isInvalidType) {\n      baseResult.needRuntime = context.helper(directiveToUse);\n    }\n  } else {\n    context.onError(\n      createDOMCompilerError(\n        57,\n        dir.loc\n      )\n    );\n  }\n  baseResult.props = baseResult.props.filter(\n    (p) => !(p.key.type === 4 && p.key.content === \"modelValue\")\n  );\n  return baseResult;\n};\n\nconst isEventOptionModifier = /* @__PURE__ */ makeMap(`passive,once,capture`);\nconst isNonKeyModifier = /* @__PURE__ */ makeMap(\n  // event propagation management\n  `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`\n);\nconst maybeKeyModifier = /* @__PURE__ */ makeMap(\"left,right\");\nconst isKeyboardEvent = /* @__PURE__ */ makeMap(\n  `onkeyup,onkeydown,onkeypress`,\n  true\n);\nconst resolveModifiers = (key, modifiers, context, loc) => {\n  const keyModifiers = [];\n  const nonKeyModifiers = [];\n  const eventOptionModifiers = [];\n  for (let i = 0; i < modifiers.length; i++) {\n    const modifier = modifiers[i];\n    if (modifier === \"native\" && checkCompatEnabled(\n      \"COMPILER_V_ON_NATIVE\",\n      context,\n      loc\n    )) {\n      eventOptionModifiers.push(modifier);\n    } else if (isEventOptionModifier(modifier)) {\n      eventOptionModifiers.push(modifier);\n    } else {\n      if (maybeKeyModifier(modifier)) {\n        if (isStaticExp(key)) {\n          if (isKeyboardEvent(key.content)) {\n            keyModifiers.push(modifier);\n          } else {\n            nonKeyModifiers.push(modifier);\n          }\n        } else {\n          keyModifiers.push(modifier);\n          nonKeyModifiers.push(modifier);\n        }\n      } else {\n        if (isNonKeyModifier(modifier)) {\n          nonKeyModifiers.push(modifier);\n        } else {\n          keyModifiers.push(modifier);\n        }\n      }\n    }\n  }\n  return {\n    keyModifiers,\n    nonKeyModifiers,\n    eventOptionModifiers\n  };\n};\nconst transformClick = (key, event) => {\n  const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === \"onclick\";\n  return isStaticClick ? createSimpleExpression(event, true) : key.type !== 4 ? createCompoundExpression([\n    `(`,\n    key,\n    `) === \"onClick\" ? \"${event}\" : (`,\n    key,\n    `)`\n  ]) : key;\n};\nconst transformOn = (dir, node, context) => {\n  return transformOn$1(dir, node, context, (baseResult) => {\n    const { modifiers } = dir;\n    if (!modifiers.length)\n      return baseResult;\n    let { key, value: handlerExp } = baseResult.props[0];\n    const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);\n    if (nonKeyModifiers.includes(\"right\")) {\n      key = transformClick(key, `onContextmenu`);\n    }\n    if (nonKeyModifiers.includes(\"middle\")) {\n      key = transformClick(key, `onMouseup`);\n    }\n    if (nonKeyModifiers.length) {\n      handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [\n        handlerExp,\n        JSON.stringify(nonKeyModifiers)\n      ]);\n    }\n    if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard\n    (!isStaticExp(key) || isKeyboardEvent(key.content))) {\n      handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [\n        handlerExp,\n        JSON.stringify(keyModifiers)\n      ]);\n    }\n    if (eventOptionModifiers.length) {\n      const modifierPostfix = eventOptionModifiers.map(capitalize).join(\"\");\n      key = isStaticExp(key) ? createSimpleExpression(`${key.content}${modifierPostfix}`, true) : createCompoundExpression([`(`, key, `) + \"${modifierPostfix}\"`]);\n    }\n    return {\n      props: [createObjectProperty(key, handlerExp)]\n    };\n  });\n};\n\nconst transformShow = (dir, node, context) => {\n  const { exp, loc } = dir;\n  if (!exp) {\n    context.onError(\n      createDOMCompilerError(61, loc)\n    );\n  }\n  return {\n    props: [],\n    needRuntime: context.helper(V_SHOW)\n  };\n};\n\nconst transformTransition = (node, context) => {\n  if (node.type === 1 && node.tagType === 1) {\n    const component = context.isBuiltInComponent(node.tag);\n    if (component === TRANSITION) {\n      return () => {\n        if (!node.children.length) {\n          return;\n        }\n        if (hasMultipleChildren(node)) {\n          context.onError(\n            createDOMCompilerError(\n              62,\n              {\n                start: node.children[0].loc.start,\n                end: node.children[node.children.length - 1].loc.end,\n                source: \"\"\n              }\n            )\n          );\n        }\n        const child = node.children[0];\n        if (child.type === 1) {\n          for (const p of child.props) {\n            if (p.type === 7 && p.name === \"show\") {\n              node.props.push({\n                type: 6,\n                name: \"persisted\",\n                value: void 0,\n                loc: node.loc\n              });\n            }\n          }\n        }\n      };\n    }\n  }\n};\nfunction hasMultipleChildren(node) {\n  const children = node.children = node.children.filter(\n    (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())\n  );\n  const child = children[0];\n  return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);\n}\n\nconst ignoreSideEffectTags = (node, context) => {\n  if (node.type === 1 && node.tagType === 0 && (node.tag === \"script\" || node.tag === \"style\")) {\n    !!(process.env.NODE_ENV !== \"production\") && context.onError(\n      createDOMCompilerError(\n        63,\n        node.loc\n      )\n    );\n    context.removeNode();\n  }\n};\n\nconst DOMNodeTransforms = [\n  transformStyle,\n  ...!!(process.env.NODE_ENV !== \"production\") ? [transformTransition] : []\n];\nconst DOMDirectiveTransforms = {\n  cloak: noopDirectiveTransform,\n  html: transformVHtml,\n  text: transformVText,\n  model: transformModel,\n  // override compiler-core\n  on: transformOn,\n  // override compiler-core\n  show: transformShow\n};\nfunction compile(template, options = {}) {\n  return baseCompile(\n    template,\n    extend({}, parserOptions, options, {\n      nodeTransforms: [\n        // ignore <script> and <tag>\n        // this is not put inside DOMNodeTransforms because that list is used\n        // by compiler-ssr to generate vnode fallback branches\n        ignoreSideEffectTags,\n        ...DOMNodeTransforms,\n        ...options.nodeTransforms || []\n      ],\n      directiveTransforms: extend(\n        {},\n        DOMDirectiveTransforms,\n        options.directiveTransforms || {}\n      ),\n      transformHoist: null \n    })\n  );\n}\nfunction parse(template, options = {}) {\n  return baseParse(template, extend({}, parserOptions, options));\n}\n\nexport { DOMDirectiveTransforms, DOMNodeTransforms, TRANSITION, TRANSITION_GROUP, V_MODEL_CHECKBOX, V_MODEL_DYNAMIC, V_MODEL_RADIO, V_MODEL_SELECT, V_MODEL_TEXT, V_ON_WITH_KEYS, V_ON_WITH_MODIFIERS, V_SHOW, compile, createDOMCompilerError, parse, parserOptions, transformStyle };\n","function makeMap(str, expectsLowerCase) {\n  const map = /* @__PURE__ */ Object.create(null);\n  const list = str.split(\",\");\n  for (let i = 0; i < list.length; i++) {\n    map[list[i]] = true;\n  }\n  return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst onRE = /^on[^a-z]/;\nconst isOn = (key) => onRE.test(key);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n  const i = arr.indexOf(el);\n  if (i > -1) {\n    arr.splice(i, 1);\n  }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n  return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n  // the leading comma is intentional so empty string \"\" is also included\n  \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n  \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n  (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction(\n  (str) => str.charAt(0).toUpperCase() + str.slice(1)\n);\nconst toHandlerKey = cacheStringFunction(\n  (str) => str ? `on${capitalize(str)}` : ``\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](arg);\n  }\n};\nconst def = (obj, key, value) => {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: false,\n    value\n  });\n};\nconst looseToNumber = (val) => {\n  const n = parseFloat(val);\n  return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n  const n = isString(val) ? Number(val) : NaN;\n  return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n  return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlagNames = {\n  [1]: `TEXT`,\n  [2]: `CLASS`,\n  [4]: `STYLE`,\n  [8]: `PROPS`,\n  [16]: `FULL_PROPS`,\n  [32]: `HYDRATE_EVENTS`,\n  [64]: `STABLE_FRAGMENT`,\n  [128]: `KEYED_FRAGMENT`,\n  [256]: `UNKEYED_FRAGMENT`,\n  [512]: `NEED_PATCH`,\n  [1024]: `DYNAMIC_SLOTS`,\n  [2048]: `DEV_ROOT_FRAGMENT`,\n  [-1]: `HOISTED`,\n  [-2]: `BAIL`\n};\n\nconst slotFlagsText = {\n  [1]: \"STABLE\",\n  [2]: \"DYNAMIC\",\n  [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_WHITE_LISTED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console\";\nconst isGloballyWhitelisted = /* @__PURE__ */ makeMap(GLOBALS_WHITE_LISTED);\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n  let lines = source.split(/(\\r?\\n)/);\n  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n  lines = lines.filter((_, idx) => idx % 2 === 0);\n  let count = 0;\n  const res = [];\n  for (let i = 0; i < lines.length; i++) {\n    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n    if (count >= start) {\n      for (let j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length)\n          continue;\n        const line = j + 1;\n        res.push(\n          `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`\n        );\n        const lineLength = lines[j].length;\n        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n        if (j === i) {\n          const pad = start - (count - (lineLength + newLineSeqLength));\n          const length = Math.max(\n            1,\n            end > count ? lineLength - pad : end - start\n          );\n          res.push(`   |  ` + \" \".repeat(pad) + \"^\".repeat(length));\n        } else if (j > i) {\n          if (end > count) {\n            const length = Math.max(Math.min(end - count, lineLength), 1);\n            res.push(`   |  ` + \"^\".repeat(length));\n          }\n          count += lineLength + newLineSeqLength;\n        }\n      }\n      break;\n    }\n  }\n  return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n  if (isArray(value)) {\n    const res = {};\n    for (let i = 0; i < value.length; i++) {\n      const item = value[i];\n      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n      if (normalized) {\n        for (const key in normalized) {\n          res[key] = normalized[key];\n        }\n      }\n    }\n    return res;\n  } else if (isString(value)) {\n    return value;\n  } else if (isObject(value)) {\n    return value;\n  }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n  const ret = {};\n  cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n    if (item) {\n      const tmp = item.split(propertyDelimiterRE);\n      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return ret;\n}\nfunction stringifyStyle(styles) {\n  let ret = \"\";\n  if (!styles || isString(styles)) {\n    return ret;\n  }\n  for (const key in styles) {\n    const value = styles[key];\n    const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n    if (isString(value) || typeof value === \"number\") {\n      ret += `${normalizedKey}:${value};`;\n    }\n  }\n  return ret;\n}\nfunction normalizeClass(value) {\n  let res = \"\";\n  if (isString(value)) {\n    res = value;\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      const normalized = normalizeClass(value[i]);\n      if (normalized) {\n        res += normalized + \" \";\n      }\n    }\n  } else if (isObject(value)) {\n    for (const name in value) {\n      if (value[name]) {\n        res += name + \" \";\n      }\n    }\n  }\n  return res.trim();\n}\nfunction normalizeProps(props) {\n  if (!props)\n    return null;\n  let { class: klass, style } = props;\n  if (klass && !isString(klass)) {\n    props.class = normalizeClass(klass);\n  }\n  if (style) {\n    props.style = normalizeStyle(style);\n  }\n  return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n  return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n  if (attrValidationCache.hasOwnProperty(name)) {\n    return attrValidationCache[name];\n  }\n  const isUnsafe = unsafeAttrCharRE.test(name);\n  if (isUnsafe) {\n    console.error(`unsafe attribute name: ${name}`);\n  }\n  return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n  acceptCharset: \"accept-charset\",\n  className: \"class\",\n  htmlFor: \"for\",\n  httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n  const str = \"\" + string;\n  const match = escapeRE.exec(str);\n  if (!match) {\n    return str;\n  }\n  let html = \"\";\n  let escaped;\n  let index;\n  let lastIndex = 0;\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        escaped = \"&quot;\";\n        break;\n      case 38:\n        escaped = \"&amp;\";\n        break;\n      case 39:\n        escaped = \"&#39;\";\n        break;\n      case 60:\n        escaped = \"&lt;\";\n        break;\n      case 62:\n        escaped = \"&gt;\";\n        break;\n      default:\n        continue;\n    }\n    if (lastIndex !== index) {\n      html += str.slice(lastIndex, index);\n    }\n    lastIndex = index + 1;\n    html += escaped;\n  }\n  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n  return src.replace(commentStripRE, \"\");\n}\n\nfunction looseCompareArrays(a, b) {\n  if (a.length !== b.length)\n    return false;\n  let equal = true;\n  for (let i = 0; equal && i < a.length; i++) {\n    equal = looseEqual(a[i], b[i]);\n  }\n  return equal;\n}\nfunction looseEqual(a, b) {\n  if (a === b)\n    return true;\n  let aValidType = isDate(a);\n  let bValidType = isDate(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n  }\n  aValidType = isSymbol(a);\n  bValidType = isSymbol(b);\n  if (aValidType || bValidType) {\n    return a === b;\n  }\n  aValidType = isArray(a);\n  bValidType = isArray(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n  }\n  aValidType = isObject(a);\n  bValidType = isObject(b);\n  if (aValidType || bValidType) {\n    if (!aValidType || !bValidType) {\n      return false;\n    }\n    const aKeysCount = Object.keys(a).length;\n    const bKeysCount = Object.keys(b).length;\n    if (aKeysCount !== bKeysCount) {\n      return false;\n    }\n    for (const key in a) {\n      const aHasKey = a.hasOwnProperty(key);\n      const bHasKey = b.hasOwnProperty(key);\n      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n  }\n  return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n  return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst toDisplayString = (val) => {\n  return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n  if (val && val.__v_isRef) {\n    return replacer(_key, val.value);\n  } else if (isMap(val)) {\n    return {\n      [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {\n        entries[`${key} =>`] = val2;\n        return entries;\n      }, {})\n    };\n  } else if (isSet(val)) {\n    return {\n      [`Set(${val.size})`]: [...val.values()]\n    };\n  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n    return String(val);\n  }\n  return val;\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Panel-Link-Index-Dropdown{padding-top:1px}.Panel-Link-Index-Dropdown .dropdown_menu_label{padding:0px}.Panel-Link-Index-Dropdown .dropdown_menu_label .dropdown_menu_label_content{font-size:.75rem;width:20px;height:20px;text-align:center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/common/LinkIndexDropdown.vue\"],\"names\":[],\"mappings\":\"AASA,2BACC,eAAA,CAEA,gDACC,WAAA,CACA,6EACC,gBAAA,CAGA,UAAA,CACA,WAAA,CACA,iBAAA\",\"sourcesContent\":[\"\\n\\n// $color_bg: $color_bg_dark\\n// $color_bg_path_elements: lighten($color_bg_dark, 25%)\\n// $border_color: lighten($color_bg, 10%)\\n// $color_bg_clickable_path_element_name: darken($color_bg_path_elements, 10%)\\n// $color_bg_clickable_path_element_name_hover: gray\\n\\n\\n.Panel-Link-Index-Dropdown\\n\\tpadding-top: 1px\\n\\t// background-color: $color_bg_panel\\n\\t.dropdown_menu_label\\n\\t\\tpadding: 0px\\n\\t\\t.dropdown_menu_label_content\\n\\t\\t\\tfont-size: 0.75rem\\n\\t\\t\\t// border: 1px solid black\\n\\t\\t\\t// border-radius: 100px\\n\\t\\t\\twidth: 20px\\n\\t\\t\\theight: 20px\\n\\t\\t\\ttext-align: center\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NavigationBar{font-size:.8rem}.NavigationBar .button-group{padding:2px}.NavigationBar ul.path_elements{padding:2px 2px}.NavigationBar ul.path_elements .root-home{cursor:pointer;position:relative;top:3px;width:16px;height:16px;display:inline-block;opacity:.6}.NavigationBar ul.path_elements .root-home:hover{opacity:1}.NavigationBar ul.path_elements{white-space:nowrap;overflow-x:hidden;margin:2px;border-radius:3px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/common/Navigation.vue\"],\"names\":[],\"mappings\":\"AAMA,eAEC,eAAA,CAEA,6BACC,WAAA,CAID,gCACC,eAAA,CAGA,2CACC,cAAA,CACA,iBAAA,CACA,OAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CACA,UAAA,CACA,iDACC,SAAA,CAmBH,gCACC,kBAAA,CACA,iBAAA,CACA,UAAA,CAGA,iBAAA\",\"sourcesContent\":[\"\\n\\n// $color_bg: $color_bg_dark\\n// $color_bg_path_elements: lighten($color_bg_dark, 25%)\\n// $color_bg_clickable_path_element_name: darken($color_bg_path_elements, 10%)\\n// $color_bg_clickable_path_element_name_hover: gray\\n.NavigationBar\\n\\t// background-color: $color_bg_panel\\n\\tfont-size: 0.8rem\\n\\n\\t.button-group\\n\\t\\tpadding: 2px\\n\\t\\t// padding-bottom: 4px\\n\\t\\t// position: relative\\n\\t\\t// top: 1px\\n\\tul.path_elements\\n\\t\\tpadding: 2px 2px\\n\\tul.path_elements\\n\\n\\t\\t.root-home\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\tposition: relative\\n\\t\\t\\ttop: 3px\\n\\t\\t\\twidth: 16px\\n\\t\\t\\theight: 16px\\n\\t\\t\\tdisplay: inline-block\\n\\t\\t\\topacity: 0.6\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\topacity: 1\\n\\n\\t// .button-group\\n\\t// \\tmargin: 0px 5px\\n\\t// \\t.button\\n\\t// \\t\\tmargin-top: 4px\\n\\t// \\t\\tmargin-bottom: 0px\\n\\t// \\t\\tline-height: 0\\n\\t// \\t\\tpadding: 1px 2px\\n\\t// \\t\\t&.backward\\n\\t// \\t\\t\\tmargin-left: 0px\\n\\t// \\t\\t&.forward\\n\\t// \\t\\t\\tmargin-left: 2px\\n\\n\\t// \\t\\t.dropdown_menu\\n\\t// \\t\\t\\tcolor: black\\n\\t// \\t\\t\\t.dropdown_menu_content\\n\\t// \\t\\t\\t\\ttext-align: left\\n\\n\\tul.path_elements\\n\\t\\twhite-space: nowrap\\n\\t\\toverflow-x: hidden\\n\\t\\tmargin: 2px\\n\\n\\t\\t\\t// border: 1px solid $border_color\\n\\t\\tborder-radius: 3px\\n\\t\\t// background-color: $color_bg_path_elements\\n\\n\\n\\t\\t// &.thin_scrollbar\\n\\t\\t// \\t&::-webkit-scrollbar\\n\\t\\t// \\t\\theight: 1px\\n\\t\\t// \\t// &::-webkit-scrollbar-track\\n\\t\\t// \\t// \\tbackground: blue\\n\\t\\t// \\t&::-webkit-scrollbar-thumb\\n\\t\\t// \\t\\tbackground-color: $color_bg_panel\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NavigationPathElement{display:inline-block}.NavigationPathElement .path_element_name:hover{cursor:pointer;opacity:.75}.NavigationPathElement .path_element_name,.NavigationPathElement .path_separator{padding:1px 5px;display:inline-block}.NavigationPathElement .path_separator{cursor:pointer;font-weight:bold;opacity:.6}.NavigationPathElement .path_separator:hover{opacity:1}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/common/NavigationPathElement.vue\"],\"names\":[],\"mappings\":\"AAIA,uBACC,oBAAA,CAEC,gDACC,cAAA,CACA,WAAA,CACF,iFACC,eAAA,CACA,oBAAA,CACD,uCACC,cAAA,CACA,gBAAA,CACA,UAAA,CACA,6CACC,SAAA\",\"sourcesContent\":[\"\\n\\n\\n\\n.NavigationPathElement\\n\\tdisplay: inline-block\\n\\t.path_element_name\\n\\t\\t&:hover\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\topacity: 0.75\\n\\t.path_element_name, .path_separator\\n\\t\\tpadding: 1px 5px\\n\\t\\tdisplay: inline-block\\n\\t.path_separator\\n\\t\\tcursor: pointer\\n\\t\\tfont-weight: bold\\n\\t\\topacity: 0.6\\n\\t\\t&:hover\\n\\t\\t\\topacity: 1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Panel.Custom .panel-custom-container{overflow:hidden}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/custom/Custom.vue\"],\"names\":[],\"mappings\":\"AAKC,sCACC,eAAA\",\"sourcesContent\":[\"\\n\\n// $color_node_name_hover: darken($color_font, 20%)\\n.Panel.Custom\\n\\t// background-color: $color_bg_panel_custom\\n\\t.panel-custom-container\\n\\t\\toverflow: hidden\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Panel.Multiple .split_panel_separator{min-width:4px;min-height:4px;background-color:rgba(0,0,0,0)}.Panel.Multiple .split-panel-horizontal,.Panel.Multiple .split-panel-vertical{position:relative}.Panel.Multiple .split-panel-horizontal>.split_panel_separator{position:absolute;top:0px;height:100%;cursor:ew-resize}.Panel.Multiple .split-panel-horizontal>.split_panel_separator .split_panel_separator_line{position:absolute;z-index:998;width:1px;height:100%}.Panel.Multiple .split-panel-horizontal>.split_panel_separator .split_panel_separator_line.large{width:2px}.Panel.Multiple .split-panel-vertical>.split_panel_separator{position:absolute;left:0px;width:100%;cursor:ns-resize;transform:translateY(-100%)}.Panel.Multiple .split-panel-vertical>.split_panel_separator .split_panel_separator_line{position:relative;top:4px;height:1px}.Panel.Multiple .split-panel-vertical>.split_panel_separator .split_panel_separator_line.large{height:2px}.Panel.Multiple .panel_tabs{padding-left:5px}.Panel.Multiple .panel_tabs ul.tab_list{position:relative;top:3px;margin:0px}.Panel.Multiple .panel_tabs ul.tab_list li.tab_item_container{display:inline-block;margin-left:4px;font-size:.75rem;cursor:pointer;border-bottom:0px;border-top-left-radius:3px;border-top-right-radius:3px}.Panel.Multiple .panel_tabs ul.tab_list li.tab_item_container.active .tab_item .panel_type_name,.Panel.Multiple .panel_tabs ul.tab_list li.tab_item_container.active .tab_item .panel_type_close{position:relative}.Panel.Multiple .panel_tabs ul.tab_list li.tab_item_container .tab_item{padding:0px 5px}.Panel.Multiple .panel_tabs ul.tab_list li.tab_item_container .tab_item .panel_type_close{margin-left:5px;position:relative;top:1px}.Panel.Multiple .panel_tabs ul.tab_list li.tab_item_container .tab_item .panel_type_close:hover{opacity:.6}.Panel.Multiple .panel_tabs .split_menu_container_container{position:relative}.Panel.Multiple .panel_tabs .split_menu_container_container .split_menu_container{position:absolute;top:5px;right:4px;border-radius:20px;line-height:1}.Panel.Multiple .panel_tabs .split_menu_container_container .split_menu_container .dropdown_menu_label{top:-1px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/multiple/Multiple.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAiDC,uCACC,aAnCiB,CAoCjB,cApCiB,CAqCjB,8BAAA,CAID,8EACC,iBAAA,CACD,+DACC,iBAAA,CACA,OAAA,CACA,WAAA,CACA,gBAAA,CACA,2FACC,iBAAA,CACA,WC2R6B,CD1R7B,SAAA,CACA,WAAA,CAEA,iGACC,SAAA,CAEH,6DACC,iBAAA,CACA,QAAA,CACA,UAAA,CACA,gBAAA,CACA,2BAAA,CACA,yFACC,iBAAA,CACA,OAjEgB,CAkEhB,UAAA,CAEA,+FACC,UAAA,CAEH,4BAEC,gBAAA,CAEA,wCACC,iBAAA,CACA,OAAA,CACA,UAAA,CAEA,8DACC,oBAAA,CACA,eAAA,CACA,gBAAA,CAEA,cAAA,CAGA,iBAAA,CACA,0BAAA,CACA,2BAAA,CAyCE,iMACC,iBAAA,CAKH,wEACC,eAAA,CACA,0FACC,eAAA,CACA,iBAAA,CACA,OAAA,CACA,gGACC,UAAA,CAEL,4DACC,iBAAA,CACA,kFAEC,iBAAA,CACA,OAAA,CACA,SAAA,CACA,kBAAA,CAEA,aAAA,CACA,uGACC,QAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n// $tab_background_default: $color_bg\\n// $color_border: lighten($color_bg, 50%)\\n// $color_split_panel_separator: mix($color_bg, $primary-color, 50%)\\n// $color_bg_split_panel_separator_line: $primary-color\\n// $color_split_panel_separator_hover: darken($color_split_panel_separator, 0%)\\n// $color_bg_tab_item_container: $color_bg_panel\\n// $color_bg_tab_item_container_active: $success-color //mix($color_bg, $success-color, 20%)\\n// $color_font_tab_item_container_inactive: lighten(black, 20%) //$color_bg //lighten($color_font, 50%)\\n// $color_font_tab_item_container_active: black //$color_bg //lighten($color_font, 50%)\\n// $color_border_tab_item_container: darken($color_bg, 20%)\\n// $color_split_menu_container: darken($color_bg, 50%)\\n\\n$split_panel_size: 4px\\n// $color_bg_panel_tabs: $color_bg_panel\\n\\n// $panel_background: lighten($tab_background_default, 10%)\\n.Panel\\n\\t// background-color: $color_bg_panel\\n\\t// li.tab_item_container\\n\\t// \\tbackground-color: $color_bg_tab_item_container\\n\\t// &.Network\\n\\t// \\tbackground-color: $color_bg_panel_network\\n\\t// &.Params\\n\\t// \\tbackground-color: $color_bg_panel_params\\n\\t// &.ParamEdit\\n\\t// \\tbackground-color: $color_bg_panel_param_edit\\n\\t// &.Viewer\\n\\t// \\tbackground-color: $color_bg_panel_viewer\\n\\t// &.Performance\\n\\t// \\tbackground-color: $color_bg_panel_performance\\n\\t// &.Assets\\n\\t// \\tbackground-color: $color_bg_panel_assets\\n\\t// &.Spreadsheet\\n\\t// \\tbackground-color: $color_bg_panel_spreadsheet\\n\\t// &.Custom\\n\\t// \\tbackground-color: $color_bg_panel_custom\\n\\t// &.SceneTree\\n\\t// \\tbackground-color: $color_bg_panel_scene_tree\\n\\t// &.CodePreview\\n\\t// \\tbackground-color: $color_bg_panel_shader_code_preview\\n\\t// &.CustomNodeEditor\\n\\t// \\tbackground-color: $color_bg_panel_custom_node_editor\\n\\n.Panel.Multiple\\n\\t// background-color: $panel_background\\n\\n\\t.split_panel_separator\\n\\t\\tmin-width: $split_panel_size\\n\\t\\tmin-height: $split_panel_size\\n\\t\\tbackground-color: transparent //$color_split_panel_separator\\n\\t\\t// &:hover\\n\\t\\t// \\tbackground-color: $color_split_panel_separator_hover\\n\\n\\t.split-panel-horizontal, .split-panel-vertical\\n\\t\\tposition: relative\\n\\t.split-panel-horizontal > .split_panel_separator\\n\\t\\tposition: absolute\\n\\t\\ttop: 0px\\n\\t\\theight: 100%\\n\\t\\tcursor: ew-resize\\n\\t\\t.split_panel_separator_line\\n\\t\\t\\tposition: absolute\\n\\t\\t\\tz-index: $z_index_multi_panel_separator\\n\\t\\t\\twidth: 1px\\n\\t\\t\\theight: 100%\\n\\t\\t\\t// background-color: transparent //$color_bg_split_panel_separator_line\\n\\t\\t\\t&.large\\n\\t\\t\\t\\twidth: 2px\\n\\n\\t.split-panel-vertical > .split_panel_separator\\n\\t\\tposition: absolute\\n\\t\\tleft: 0px\\n\\t\\twidth: 100%\\n\\t\\tcursor: ns-resize\\n\\t\\ttransform: translateY(-100%)\\n\\t\\t.split_panel_separator_line\\n\\t\\t\\tposition: relative\\n\\t\\t\\ttop: $split_panel_size\\n\\t\\t\\theight: 1px\\n\\t\\t\\t// background-color: transparent //$color_bg_split_panel_separator_line\\n\\t\\t\\t&.large\\n\\t\\t\\t\\theight: 2px\\n\\n\\t.panel_tabs\\n\\t\\t// background-color: $color_bg_panel\\n\\t\\tpadding-left: 5px\\n\\t\\t// padding-top: 6px\\n\\t\\tul.tab_list\\n\\t\\t\\tposition: relative\\n\\t\\t\\ttop: 3px // no idea why but seems necessary to have tabs touch correctly the panel\\n\\t\\t\\tmargin: 0px\\n\\t\\t\\t// margin-top: 2px\\n\\t\\t\\tli.tab_item_container\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\tmargin-left: 4px\\n\\t\\t\\t\\tfont-size: 0.75rem\\n\\t\\t\\t\\t// opacity: 0.6\\n\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\t// background-color: $color_bg_tab_item_container\\n\\t\\t\\t\\t// border: 1px solid $color_border_tab_item_container\\n\\t\\t\\t\\tborder-bottom: 0px\\n\\t\\t\\t\\tborder-top-left-radius: 3px\\n\\t\\t\\t\\tborder-top-right-radius: 3px\\n\\t\\t\\t\\t// color: $color_font_tab_item_container_inactive\\n\\n\\t\\t\\t\\t&:hover\\n\\t\\t\\t\\t\\t// opacity: 1\\n\\t\\t\\t\\t\\t// font-weight: bold\\n\\t\\t\\t\\t// &.network\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_network\\n\\t\\t\\t\\t// &.params\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_params\\n\\t\\t\\t\\t// &.param_edit\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_param_edit\\n\\t\\t\\t\\t// &.viewer\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_viewer\\n\\t\\t\\t\\t// &.performance\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_performance\\n\\t\\t\\t\\t// &.assets\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_assets\\n\\t\\t\\t\\t// &.custom\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_custom\\n\\t\\t\\t\\t// &.spreadsheet\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_spreadsheet\\n\\t\\t\\t\\t// &.custom_node_editor\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_custom_node_editor\\n\\t\\t\\t\\t// &.sceneTree\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_scene_tree\\n\\t\\t\\t\\t// &.codePreview\\n\\t\\t\\t\\t// \\tbackground-color: $color_bg_panel_shader_code_preview\\n\\t\\t\\t\\t// &.new_panel\\n\\t\\t\\t\\t// \\tbackground-color: lighten($color_bg_panel, 10%)\\n\\t\\t\\t\\t&:not(.active)\\n\\t\\t\\t\\t\\t// top: 1px\\n\\t\\t\\t\\t\\t// padding-bottom: 0px\\n\\t\\t\\t\\t\\t// position: relative\\n\\t\\t\\t\\t&.active\\n\\t\\t\\t\\t\\t//background-color: $color_bg_tab_item_container_active\\n\\t\\t\\t\\t\\t// color: $color_font_tab_item_container_active\\n\\t\\t\\t\\t\\t// padding-bottom: 4px\\n\\t\\t\\t\\t\\t// top: -3px\\n\\t\\t\\t\\t\\t// position: relative\\n\\t\\t\\t\\t\\t.tab_item\\n\\t\\t\\t\\t\\t\\t.panel_type_name, .panel_type_close\\n\\t\\t\\t\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t\\t\\t\\t// top: 3px\\n\\t\\t\\t\\t\\t\\t// padding-top: 3px\\n\\t\\t\\t\\t\\t\\t// font-weight: bold\\n\\n\\t\\t\\t\\t.tab_item\\n\\t\\t\\t\\t\\tpadding: 0px 5px\\n\\t\\t\\t\\t\\t.panel_type_close\\n\\t\\t\\t\\t\\t\\tmargin-left: 5px\\n\\t\\t\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t\\t\\ttop: 1px\\n\\t\\t\\t\\t\\t\\t&:hover\\n\\t\\t\\t\\t\\t\\t\\topacity: 0.6\\n\\n\\t\\t.split_menu_container_container\\n\\t\\t\\tposition: relative\\n\\t\\t\\t.split_menu_container\\n\\t\\t\\t\\t// background-color: lighten($color_bg_panel, 10%)\\n\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\ttop: 5px\\n\\t\\t\\t\\tright: 4px\\n\\t\\t\\t\\tborder-radius: 20px\\n\\t\\t\\t\\t// border: 1px solid $color_split_menu_container\\n\\t\\t\\t\\tline-height: 1\\n\\t\\t\\t\\t.dropdown_menu_label\\n\\t\\t\\t\\t\\ttop: -1px\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".above-event-catcher{position:relative;z-index:10}.network-core .buttons-container-height-0{height:0px;padding-left:5px}.network-core .buttons-container-height-0 .list-toggle-button{margin-left:10px;color:#000;padding:5px;border-radius:25px;width:25px;height:25px;text-align:center;background-color:#90ee90;cursor:pointer;opacity:.7;line-height:0;font-size:.75rem}.network-core .buttons-container-height-0 .list-toggle-button:hover{opacity:1}.network-core .buttons-container-height-0 .list-toggle-button svg{display:inline-block;margin:auto;position:relative}.network-core .buttons-container-height-0 .go-up-button-container{margin-right:5px}.network-core .buttons-container-height-0 .go-up-button-container .go-up-button{padding:5px;border-radius:25px;width:25px;height:25px;text-align:center;background-color:#90ee90;cursor:pointer;opacity:.7;line-height:0}.network-core .buttons-container-height-0 .go-up-button-container .go-up-button:hover{opacity:1}.network-core .buttons-container-height-0 .go-up-button-container .go-up-button svg{display:inline-block;margin:auto;position:relative}.network-core .canvas_container,.network-core .canvas,.network-core .object_parents{width:100%;height:100%}.network-core .canvas_container .canvas{overflow:hidden;position:relative}.network-core .canvas_container .canvas.pan_in_progress{cursor:move}.network-core .canvas_container .canvas.zoom_in_progress{cursor:zoom-in}.network-core .canvas_container .canvas .selection-rectangle{pointer-events:none;position:absolute;border:3px solid green;z-index:10;background-color:gray;opacity:.2}.network-core .canvas_container .canvas .node-creation-rectangle{pointer-events:none;position:absolute;border:3px solid green;z-index:10}.network-core .canvas_container .canvas .zoom-container{position:absolute;top:50%;left:50%;width:20px;height:20px}.network-core .canvas_container .canvas .zoom-container .pan-container{position:absolute;width:10px;height:10px}.network-core .canvas_container .canvas .zoom-container .pan-container .nodes-container{position:relative;width:0;height:0;top:0;left:0}.network-core .canvas_container .canvas .zoom-container .pan-container .nodes-container.connections_hoverable .NetworkNodeConnection line:hover{cursor:pointer;stroke-width:8px}.network-core .canvas_container .canvas .zoom-container .pan-container .nodes-container .nodes-container-events-catcher{position:absolute;width:50000px;height:50000px;top:-25000px;left:-25000px;will-change:transform}.network-core .canvas_container .canvas .zoom-container .pan-container .nodes-container svg.connection-line-container{position:absolute;top:0px;left:0px;width:100%;height:100%;z-index:10;pointer-events:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/NetworkCore.vue\"],\"names\":[],\"mappings\":\"AAKA,qBACC,iBAAA,CACA,UAJ8B,CAgB9B,0CACC,UAAA,CACA,gBAAA,CAGA,8DACC,gBAAA,CACA,UAAA,CACA,WAAA,CACA,kBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,wBAAA,CACA,cAAA,CACA,UAAA,CACA,aAAA,CACA,gBAAA,CACA,oEACC,SAAA,CACD,kEACC,oBAAA,CACA,WAAA,CACA,iBAAA,CAEF,kEACC,gBAAA,CACA,gFACC,WAAA,CACA,kBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,wBAAA,CACA,cAAA,CACA,UAAA,CACA,aAAA,CACA,sFACC,SAAA,CACD,oFACC,oBAAA,CACA,WAAA,CACA,iBAAA,CAIJ,oFACC,UAAA,CACA,WAAA,CAGA,wCAEC,eAAA,CACA,iBAAA,CACA,wDACC,WAAA,CACD,yDACC,cAAA,CAED,6DACC,mBAAA,CACA,iBAAA,CACA,sBAAA,CACA,UAAA,CACA,qBAAA,CACA,UAAA,CAED,iEACC,mBAAA,CACA,iBAAA,CACA,sBAAA,CACA,UAAA,CAED,wDACC,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CAEA,uEACC,iBAAA,CACA,UAAA,CACA,WAAA,CAMA,wFACC,iBAAA,CACA,OAAA,CACA,QAAA,CACA,KAAA,CACA,MAAA,CAQG,gJACC,cAAA,CACA,gBAAA,CAEJ,wHACC,iBAAA,CACA,aAtBoB,CAuBpB,cAvBoB,CAwBpB,YAtBkC,CAuBlC,aAvBkC,CAwBlC,qBAAA,CAGD,sHACC,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAGA,mBAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n$z_index_above_events_catcher: 10\\n// $panel_background_color: mix($color_bg, orange, 50%)\\n.above-event-catcher\\n\\tposition: relative\\n\\tz-index: $z_index_above_events_catcher\\n\\n// .bg-pattern\\n// \\t// background-color: #487346\\n// \\tbackground-image: url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 200 200'%3E%3Cg %3E%3Cpolygon fill='%234c8e43' points='100 57.1 64 93.1 71.5 100.6 100 72.1'/%3E%3Cpolygon fill='%236aac5f' points='100 57.1 100 72.1 128.6 100.6 136.1 93.1'/%3E%3Cpolygon fill='%234c8e43' points='100 163.2 100 178.2 170.7 107.5 170.8 92.4'/%3E%3Cpolygon fill='%236aac5f' points='100 163.2 29.2 92.5 29.2 107.5 100 178.2'/%3E%3Cpath fill='%2389CC7C' d='M100 21.8L29.2 92.5l70.7 70.7l70.7-70.7L100 21.8z M100 127.9L64.6 92.5L100 57.1l35.4 35.4L100 127.9z'/%3E%3Cpolygon fill='%23768c3a' points='0 157.1 0 172.1 28.6 200.6 36.1 193.1'/%3E%3Cpolygon fill='%2396ac58' points='70.7 200 70.8 192.4 63.2 200'/%3E%3Cpolygon fill='%23B6CC76' points='27.8 200 63.2 200 70.7 192.5 0 121.8 0 157.2 35.3 192.5'/%3E%3Cpolygon fill='%2396ac58' points='200 157.1 164 193.1 171.5 200.6 200 172.1'/%3E%3Cpolygon fill='%23768c3a' points='136.7 200 129.2 192.5 129.2 200'/%3E%3Cpolygon fill='%23B6CC76' points='172.1 200 164.6 192.5 200 157.1 200 157.2 200 121.8 200 121.8 129.2 192.5 136.7 200'/%3E%3Cpolygon fill='%23768c3a' points='129.2 0 129.2 7.5 200 78.2 200 63.2 136.7 0'/%3E%3Cpolygon fill='%23B6CC76' points='200 27.8 200 27.9 172.1 0 136.7 0 200 63.2 200 63.2'/%3E%3Cpolygon fill='%2396ac58' points='63.2 0 0 63.2 0 78.2 70.7 7.5 70.7 0'/%3E%3Cpolygon fill='%23B6CC76' points='0 63.2 63.2 0 27.8 0 0 27.8'/%3E%3C/g%3E%3C/svg%3E\\\")\\n\\n.network-core\\n\\t// background-color: darken($color_font, 20%)\\n\\t// color: $color_bg\\n\\n\\t// position: relative // for tab menu\\n\\n\\t.buttons-container-height-0\\n\\t\\theight: 0px\\n\\t\\tpadding-left: 5px\\n\\t\\t// padding-top: 5px\\n\\n\\t\\t.list-toggle-button\\n\\t\\t\\tmargin-left: 10px\\n\\t\\t\\tcolor: black\\n\\t\\t\\tpadding: 5px\\n\\t\\t\\tborder-radius: 25px\\n\\t\\t\\twidth: 25px\\n\\t\\t\\theight: 25px\\n\\t\\t\\ttext-align: center\\n\\t\\t\\tbackground-color: lightgreen\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\topacity: 0.7\\n\\t\\t\\tline-height: 0\\n\\t\\t\\tfont-size: 0.75rem\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\topacity: 1\\n\\t\\t\\tsvg\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\tmargin: auto\\n\\t\\t\\t\\tposition: relative\\n\\n\\t\\t.go-up-button-container\\n\\t\\t\\tmargin-right: 5px\\n\\t\\t\\t.go-up-button\\n\\t\\t\\t\\tpadding: 5px\\n\\t\\t\\t\\tborder-radius: 25px\\n\\t\\t\\t\\twidth: 25px\\n\\t\\t\\t\\theight: 25px\\n\\t\\t\\t\\ttext-align: center\\n\\t\\t\\t\\tbackground-color: lightgreen\\n\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\topacity: 0.7\\n\\t\\t\\t\\tline-height: 0\\n\\t\\t\\t\\t&:hover\\n\\t\\t\\t\\t\\topacity: 1\\n\\t\\t\\t\\tsvg\\n\\t\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\t\\tmargin: auto\\n\\t\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t\\t// top: 50%\\n\\t\\t\\t\\t\\t// transform: translateY(-50%)\\n\\n\\t.canvas_container, .canvas, .object_parents\\n\\t\\twidth: 100%\\n\\t\\theight: 100%\\n\\n\\t.canvas_container\\n\\t\\t.canvas\\n\\t\\t\\t// background-color: darken(white, 40%)\\n\\t\\t\\toverflow: hidden\\n\\t\\t\\tposition: relative\\n\\t\\t\\t&.pan_in_progress\\n\\t\\t\\t\\tcursor: move\\n\\t\\t\\t&.zoom_in_progress\\n\\t\\t\\t\\tcursor: zoom-in\\n\\n\\t\\t\\t.selection-rectangle\\n\\t\\t\\t\\tpointer-events: none\\n\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\tborder: 3px solid green\\n\\t\\t\\t\\tz-index: 10\\n\\t\\t\\t\\tbackground-color: grey\\n\\t\\t\\t\\topacity: 0.2\\n\\n\\t\\t\\t.node-creation-rectangle\\n\\t\\t\\t\\tpointer-events: none\\n\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\tborder: 3px solid green\\n\\t\\t\\t\\tz-index: 10\\n\\n\\t\\t\\t.zoom-container\\n\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\ttop: 50%\\n\\t\\t\\t\\tleft: 50%\\n\\t\\t\\t\\twidth: 20px\\n\\t\\t\\t\\theight: 20px\\n\\t\\t\\t\\t// background-color: red\\n\\t\\t\\t\\t.pan-container\\n\\t\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\t\\twidth: 10px\\n\\t\\t\\t\\t\\theight: 10px\\n\\t\\t\\t\\t\\t// background-color: green\\n\\n\\t\\t\\t\\t\\t$node_container_size: 50000px\\n\\t\\t\\t\\t\\t$node_container_size_half: $node_container_size * 0.5\\n\\t\\t\\t\\t\\t$node_container_size_half_negative: -$node_container_size_half\\n\\t\\t\\t\\t\\t.nodes-container\\n\\t\\t\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t\\t\\twidth: 0\\n\\t\\t\\t\\t\\t\\theight: 0\\n\\t\\t\\t\\t\\t\\ttop: 0\\n\\t\\t\\t\\t\\t\\tleft: 0\\n\\t\\t\\t\\t\\t\\t// background-color: lighten(blue,20%)\\n\\t\\t\\t\\t\\t\\t// background-color: pink\\n\\t\\t\\t\\t\\t\\t// overflow: hidden\\n\\n\\t\\t\\t\\t\\t\\t&.connections_hoverable\\n\\t\\t\\t\\t\\t\\t\\t.NetworkNodeConnection\\n\\t\\t\\t\\t\\t\\t\\t\\tline\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t&:hover\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tstroke-width: 8px\\n\\n\\t\\t\\t\\t\\t\\t.nodes-container-events-catcher\\n\\t\\t\\t\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\t\\t\\t\\twidth: $node_container_size\\n\\t\\t\\t\\t\\t\\t\\theight: $node_container_size\\n\\t\\t\\t\\t\\t\\t\\ttop: $node_container_size_half_negative\\n\\t\\t\\t\\t\\t\\t\\tleft: $node_container_size_half_negative\\n\\t\\t\\t\\t\\t\\t\\twill-change: transform\\n\\t\\t\\t\\t\\t\\t\\t// background-color: lighten(red,20%)\\n\\n\\t\\t\\t\\t\\t\\tsvg.connection-line-container\\n\\t\\t\\t\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\t\\t\\t\\ttop: 0px\\n\\t\\t\\t\\t\\t\\t\\tleft: 0px\\n\\t\\t\\t\\t\\t\\t\\twidth: 100%\\n\\t\\t\\t\\t\\t\\t\\theight: 100%\\n\\t\\t\\t\\t\\t\\t\\tz-index: 10\\n\\t\\t\\t\\t\\t\\t\\t// background-color: pink\\n\\t\\t\\t\\t\\t\\t\\t// opacity: 1\\n\\t\\t\\t\\t\\t\\t\\tpointer-events: none\\n\\t\\t\\t\\t\\t\\t\\t// line\\n\\t\\t\\t\\t\\t\\t\\t// stroke: grey\\n\\t\\t\\t\\t\\t\\t\\t// stroke-width: 2\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@keyframes triggered-pulse{0%{stroke-width:2px}50%{stroke-width:6px}100%{stroke-width:2px}}.NetworkNodeConnection{position:absolute;width:0;height:0}.NetworkNodeConnection svg{position:absolute;pointer-events:none}.NetworkNodeConnection line{pointer-events:auto;stroke-width:2px;transition:stroke-width .2s ease-in-out;opacity:1}.NetworkNodeConnection line.triggered{animation-name:triggered-pulse;animation-duration:.8s;animation-iteration-count:infinite;stroke-width:6px}.NetworkNodeConnection line:hover{opacity:.8}.NetworkNodeConnection line.mismatched_types{stroke:#b91c1c;stroke-width:6px}.NetworkNodeConnection line.non_typed_connection{stroke:#1779ba}.NetworkNodeConnection line.is_src_not_cloned{stroke:#d946ef;stroke-width:6px}.NetworkNodeConnection line.is_src_not_cloned:hover{stroke:#de5df1}.NetworkNodeConnection line.dashed{stroke-dasharray:20 8}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/Connection.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAcA,2BACC,GACC,gBAZgB,CAajB,IACC,gBAZ0B,CAa3B,KACC,gBAhBgB,CAAA,CAkBlB,uBACC,iBAAA,CACA,OAAA,CACA,QAAA,CACA,2BACC,iBAAA,CACA,mBAAA,CAKD,4BACC,mBAAA,CAEA,gBAhCgB,CAiChB,uCAAA,CACA,SAAA,CACA,sCACC,8BAAA,CACA,sBAAA,CACA,kCAAA,CACA,gBArCyB,CAsC1B,kCACC,UAAA,CAGD,6CACC,cCgFO,CD/EP,gBAAA,CACD,iDACC,cC2Qa,CD1Qd,8CACC,cCmOW,CDlOX,gBA7CwB,CA8CxB,oDACC,cA9C8B,CA+ChC,mCACC,qBAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n$color_connection: $primary-color\\n$color_connection_hover: lighten($color_connection, 5%)\\n$connection_size: 2px\\n$connection_size_hover: 4px\\n$connection_size_triggered: 6px\\n\\n$color_connection_selected: orange\\n$color_connection_no_clone: $fuchsia-500 //mix($p\\trimary-color, $success-color, 75%)\\n$connection_size_no_clone: 3*$connection_size\\n$color_connection_hover_no_clone: lighten($color_connection_no_clone, 5%)\\n\\n\\n@keyframes triggered-pulse\\n\\t0%\\n\\t\\tstroke-width: $connection_size\\n\\t50%\\n\\t\\tstroke-width: $connection_size_triggered\\n\\t100%\\n\\t\\tstroke-width: $connection_size\\n\\n.NetworkNodeConnection\\n\\tposition: absolute\\n\\twidth: 0\\n\\theight: 0\\n\\tsvg\\n\\t\\tposition: absolute\\n\\t\\tpointer-events: none\\n\\t\\t// background-color: lighten(green, 25%)\\n\\t\\t// opacity: 0.4\\n\\t\\t// border: 1px solid black\\n\\t\\t// prettier-ignore\\n\\tline // prettier-ignore\\n\\t\\tpointer-events: auto // prettier-ignore\\n\\t\\t// stroke: $color_connection\\n\\t\\tstroke-width: $connection_size\\n\\t\\ttransition: stroke-width 0.2s ease-in-out\\n\\t\\topacity: 1\\n\\t\\t&.triggered\\n\\t\\t\\tanimation-name: triggered-pulse\\n\\t\\t\\tanimation-duration: 0.8s\\n\\t\\t\\tanimation-iteration-count: infinite\\n\\t\\t\\tstroke-width: $connection_size_triggered\\n\\t\\t&:hover\\n\\t\\t\\topacity: 0.8\\n\\t\\t// \\tstroke: $color_connection_hover\\n\\t\\t\\t// stroke-width: $connection_size_hover\\n\\t\\t&.mismatched_types\\n\\t\\t\\tstroke: $red-700\\n\\t\\t\\tstroke-width: 3*$connection_size\\n\\t\\t&.non_typed_connection\\n\\t\\t\\tstroke: $color_connection\\n\\t\\t&.is_src_not_cloned\\n\\t\\t\\tstroke: $color_connection_no_clone\\n\\t\\t\\tstroke-width: $connection_size_no_clone\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\tstroke: $color_connection_hover_no_clone\\n\\t\\t&.dashed\\n\\t\\t\\tstroke-dasharray: 20 8\\n\\t\\t// gl\\n\\t\\t// &.bool, &.boolean\\n\\t\\t// \\tstroke: $color_connection_bool\\n\\t\\t// &.int, &.integer\\n\\t\\t// \\tstroke: $color_connection_int\\n\\t\\t// &.float\\n\\t\\t// \\tstroke: $color_connection_float\\n\\t\\t// &.vec2, &.Vector2\\n\\t\\t// \\tstroke: $color_connection_vec2\\n\\t\\t// // &.vec3, &.Vector3\\n\\t\\t// // \\tstroke: $color_connection_vec3\\n\\t\\t// &.vec4, &.Vector4\\n\\t\\t// \\tstroke: $color_connection_vec4\\n\\t\\t// &.mat3, &.Matrix3\\n\\t\\t// \\tstroke: $color_connection_mat3\\n\\t\\t// &.color, &.Color\\n\\t\\t// \\tstroke: $color_connection_color\\n\\t\\t// // actor\\n\\t\\t// &.AnimationAction\\n\\t\\t// \\tstroke: $color_connection_animation_action\\n\\t\\t// &.AnimationMixer\\n\\t\\t// \\tstroke: $color_connection_animation_mixer\\n\\t\\t// &.Box3\\n\\t\\t// \\tstroke: $color_connection_box3\\n\\t\\t// &.CatmullRomCurve3\\n\\t\\t// \\tstroke: $color_connection_CatmullRomCurve3\\n\\t\\t// &.Material\\n\\t\\t// \\tstroke: $color_connection_material\\n\\t\\t// &.Object3D\\n\\t\\t// \\tstroke: $color_connection_object3d\\n\\t\\t// &.Plane\\n\\t\\t// \\tstroke: $color_connection_plane\\n\\t\\t// &.Ray\\n\\t\\t// \\tstroke: $color_connection_ray\\n\\t\\t// &.Sphere\\n\\t\\t// \\tstroke: $color_connection_sphere\\n\\t\\t// &.string\\n\\t\\t// \\tstroke: $color_connection_string\\n\\t\\t// &.trigger\\n\\t\\t// \\tstroke: $color_connection_trigger\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInterractiveConnectionFromDest{position:absolute;top:0px;width:0;height:0}.NetworkNodeInterractiveConnectionFromDest svg{position:absolute;pointer-events:none}.NetworkNodeInterractiveConnectionFromDest svg line{stroke:#3adb76;stroke-width:4}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/InterractiveConnectionFromDest.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAGA,2CACC,iBAAA,CACA,OAAA,CACA,OAAA,CACA,QAAA,CACA,+CACC,iBAAA,CACA,mBAAA,CAIA,oDACC,cCkTa,CDjTb,cAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n.NetworkNodeInterractiveConnectionFromDest\\n\\tposition: absolute\\n\\ttop: 0px\\n\\twidth: 0\\n\\theight: 0\\n\\tsvg\\n\\t\\tposition: absolute\\n\\t\\tpointer-events: none\\n\\t\\t// background-color: lighten(green, 25%)\\n\\t\\t// opacity: 1\\n\\t\\t// border: 2px solid black\\n\\t\\tline\\n\\t\\t\\tstroke: $success-color\\n\\t\\t\\tstroke-width: 4\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInterractiveConnectionFromSrc{position:absolute;top:0px;width:0;height:0}.NetworkNodeInterractiveConnectionFromSrc svg{position:absolute;pointer-events:none}.NetworkNodeInterractiveConnectionFromSrc svg line{stroke:#3adb76;stroke-width:4}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/InterractiveConnectionFromSrc.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAGA,0CACC,iBAAA,CACA,OAAA,CACA,OAAA,CACA,QAAA,CACA,8CACC,iBAAA,CACA,mBAAA,CAIA,mDACC,cCkTa,CDjTb,cAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n.NetworkNodeInterractiveConnectionFromSrc\\n\\tposition: absolute\\n\\ttop: 0px\\n\\twidth: 0\\n\\theight: 0\\n\\tsvg\\n\\t\\tposition: absolute\\n\\t\\tpointer-events: none\\n\\t\\t// background-color: lighten(green, 25%)\\n\\t\\t// opacity: 1\\n\\t\\t// border: 2px solid black\\n\\t\\tline\\n\\t\\t\\tstroke: $success-color\\n\\t\\t\\tstroke-width: 4\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNode{position:absolute;width:0px;height:0px}.NetworkNode.selected .node-body{border:3px solid #54ff00 !important}.NetworkNode.is_being_moved .node-body{box-shadow:4px 4px 8px #111827}.NetworkNode.bypassed .node-body{border:3px solid #9a89a9}.NetworkNode.bypassed .node-body .icon-container{opacity:.2}.NetworkNode.bypassed .name-container,.NetworkNode.bypassed .params-label-container,.NetworkNode.bypassed .flag-optimize-container,.NetworkNode.bypassed .comment-container{opacity:.4}.NetworkNode.layout_horizontal .name-container{transform:translateY(-100%)}.NetworkNode.layout_horizontal .name-container .name-element{margin:0}.NetworkNode.layout_horizontal .inputs-container{position:absolute}.NetworkNode.layout_horizontal .inputs-container .output-pixel{left:100%}.NetworkNode.layout_horizontal .outputs-container{position:absolute}.NetworkNode.layout_horizontal .outputs-container .output-pixel{top:10px;left:100%}.NetworkNode .node-body{position:absolute;border-radius:3px;cursor:move;z-index:8}.NetworkNode .node-body:hover{border:1px solid #5b4b68}.NetworkNode .node-body .icon-container{opacity:.5;margin:auto;text-align:center;height:100%}.NetworkNode .node-body .icon-container svg{position:relative;top:50%;transform:translateY(-50%)}.NetworkNode .error-flag-container{position:absolute;pointer-events:none;z-index:99999}.NetworkNode .error-flag-container .error-flag{position:absolute;left:-80px;margin-right:20px;color:#cc4b37}.NetworkNode .flag-container{position:absolute;z-index:9}.NetworkNode .flag-container .node-flag{position:absolute;width:10px;cursor:pointer}.NetworkNode .flag-container .node-flag.bypass-flag{left:0px}.NetworkNode .flag-container .node-flag.bypass-flag.on{background-color:#ff0}.NetworkNode .flag-container .node-flag.bypass-flag.off{background-color:#fff}.NetworkNode .flag-container .node-flag.display-flag{right:0px}.NetworkNode .flag-container .node-flag.display-flag.on{background-color:#1779ba}.NetworkNode .flag-container .node-flag.display-flag.off{background-color:#fff}.NetworkNode .name-container{position:absolute;transform:translateY(-50%);z-index:5}.NetworkNode .name-container .name-element{margin-left:10px;cursor:text}.NetworkNode .node-local-info-container{position:absolute;z-index:999}.NetworkNode .node-local-info-container .params-label-container{z-index:999;opacity:.8}.NetworkNode .node-local-info-container .comment-container{width:200px;z-index:4;opacity:.85;pointer-events:none}.NetworkNode .node-local-info-container .comment-container .comment-element{font-size:.8rem;margin-left:10px;padding:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.NetworkNode .node-local-info-container .comment-container .comment-element .comment-line:not(:first-child){margin-top:8px}.NetworkNode .flag-optimize-container{position:absolute;transform:translateY(-50%);z-index:5;top:50px;left:30px}.NetworkNode .flag-optimize-container .flag-optimize-label-element{margin-left:10px;border-radius:5px;font-size:.85rem;padding:3px 5px;line-height:1}.NetworkNode .enter-button-container{position:absolute;transform:translateY(-50%);z-index:6}.NetworkNode .enter-button-container .enter-button{margin-right:10px;padding:5px;border-radius:25px;width:25px;height:25px;text-align:center;cursor:pointer;line-height:0}.NetworkNode .enter-button-container .enter-button svg{display:inline-block;margin:auto;position:relative}.NetworkNode .poly-node-icon-container{position:absolute;transform:translateY(-50%);z-index:6}.NetworkNode .poly-node-icon-container .poly-node-icon{margin-right:10px;padding:5px;border-radius:25px;width:25px;height:25px;text-align:center;line-height:0}.NetworkNode .poly-node-icon-container .poly-node-icon svg{display:inline-block;margin:auto;position:relative}.NetworkNode .connection-pixel{position:absolute}.NetworkNode .connection-pixel:hover{z-index:999}.NetworkNode .connection-pixel:hover .connection-name-element.non_named_element{display:block}.NetworkNode .connection-pixel .connection-name-element{position:absolute;pointer-events:none;line-height:1;padding:2px 4px;border-radius:2px}.NetworkNode .connection-pixel .connection-name-element.named_element{z-index:19;font-size:.5rem}.NetworkNode .connection-pixel .connection-name-element.non_named_element{z-index:21;font-size:.8rem;padding:5px 10px;display:none;top:-20px;left:0px;transform:translate(-50%, -100%)}.NetworkNode .connection-pixel .connection-element.isArray{width:20px}.NetworkNode .connection-pixel .connection-element.isArray:hover{width:22px;height:16px}.NetworkNode .connection-pixel .connection-element{width:12px;height:12px;border-radius:100px;transform:translate(-50%, -50%);position:relative;z-index:20;cursor:pointer}.NetworkNode .connection-pixel .connection-element:hover{width:16px;height:16px}.NetworkNode .connection-pixel .connection-element.isTouchOrMobile{width:24px;height:24px}.NetworkNode .inputs-container{position:absolute}.NetworkNode .inputs-container .input-pixel{top:0;width:0;height:0}.NetworkNode .inputs-container .input-pixel .connection-name-element.named_element{padding-left:10px;transform:translate(0%, -50%)}.NetworkNode .outputs-container{position:absolute}.NetworkNode .outputs-container .output-pixel{bottom:0;width:0;height:0;left:50%}.NetworkNode .outputs-container .output-pixel .connection-name-element.named_element{padding-right:10px;transform:translate(-100%, -50%)}.NetworkNode .outputs-container .output-pixel .connection-element{border:1px solid #0b3e1e}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/Node.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAwCA,aACC,iBAAA,CACA,SAAA,CACA,UAAA,CAGC,iCACC,mCAAA,CAED,uCACC,8BAAA,CAED,iCAGC,wBAAA,CACA,iDACC,UAAA,CACF,4KACC,UAAA,CAED,+CACC,2BAAA,CACA,6DACC,QAAA,CACF,iDACC,iBAAA,CACA,+DAEC,SAAA,CAEF,kDACC,iBAAA,CACA,gEACC,QAAA,CACA,SAAA,CAGH,wBACC,iBAAA,CAEA,iBAAA,CAGA,WAAA,CACA,SA5Da,CA6Db,8BACC,wBAAA,CAED,wCACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,WAAA,CACA,4CACC,iBAAA,CACA,OAAA,CACA,0BAAA,CAEH,mCACC,iBAAA,CACA,mBAAA,CACA,aAhEc,CAiEd,+CACC,iBAAA,CACA,UAAA,CACA,iBAAA,CACA,aCwNW,CDtNb,6BACC,iBAAA,CACA,SArFuB,CAsFvB,wCACC,iBAAA,CACA,UAAA,CACA,cAAA,CACA,oDACC,QAAA,CACA,uDACC,qBA5GkB,CA6GnB,wDACC,qBA7GmB,CA8GrB,qDACC,SAAA,CACA,wDACC,wBCkMW,CDjMZ,yDACC,qBAjHoB,CAmHxB,6BACC,iBAAA,CACA,0BAAA,CACA,SAzGa,CA0Gb,2CACC,gBAAA,CACA,WAAA,CACF,wCACC,iBAAA,CACA,WA9GuB,CA+GvB,gEAEC,WAhHoB,CAiHpB,UAAA,CAOD,2DAEC,WAAA,CACA,SAzHe,CA2Hf,WAAA,CACA,mBAAA,CAIA,4EACC,eAAA,CACA,gBAAA,CAEA,WAAA,CAGA,2BADwB,CAExB,8BAFwB,CAGxB,6BAHwB,CAKvB,4GACC,cAAA,CAEL,sCACC,iBAAA,CACA,0BAAA,CACA,SArJa,CAsJb,QAAA,CACA,SAAA,CACA,mEACC,gBAAA,CACA,iBAAA,CAEA,gBAAA,CACA,eAAA,CACA,aAAA,CAEF,qCACC,iBAAA,CACA,0BAAA,CACA,SA7JqB,CA8JrB,mDACC,iBAAA,CACA,WAAA,CACA,kBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CAEA,cAAA,CACA,aAAA,CAGA,uDACC,oBAAA,CACA,WAAA,CACA,iBAAA,CAGH,uCACC,iBAAA,CACA,0BAAA,CACA,SAnLqB,CAoLrB,uDACC,iBAAA,CACA,WAAA,CACA,kBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CAGA,aAAA,CAGA,2DACC,oBAAA,CACA,WAAA,CACA,iBAAA,CAIH,+BACC,iBAAA,CAEA,qCACC,WAxMwB,CA0MvB,gFACC,aAAA,CACH,wDACC,iBAAA,CACA,mBAAA,CAEA,aAAA,CACA,eAAA,CACA,iBAAA,CAEA,sEACC,UAtNsB,CAuNtB,eAAA,CACD,0EACC,UAvNgC,CAwNhC,eAAA,CACA,gBAAA,CACA,YAAA,CACA,SAAA,CACA,QAAA,CACA,gCAAA,CAGD,2DACC,UA/OqB,CAgPrB,iEACC,UAAA,CACA,WApPmB,CAqPtB,mDACC,UAvPuB,CAwPvB,WAxPuB,CAyPvB,mBAAA,CACA,+BAAA,CACA,iBAAA,CACA,UA9O0B,CA+O1B,cAAA,CACA,yDACC,UA9PoB,CA+PpB,WA/PoB,CAgQrB,mEACC,UAhQoB,CAiQpB,WAjQoB,CAmQvB,+BACC,iBAAA,CACA,4CACC,KAAA,CACA,OAAA,CACA,QAAA,CAEC,mFACC,iBAAA,CACA,6BAAA,CAQJ,gCACC,iBAAA,CACA,8CACC,QAAA,CACA,OAAA,CACA,QAAA,CACA,QAAA,CAEC,qFACC,kBAAA,CACA,gCAAA,CACF,kEAEC,wBAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n$color_node_body: lighten($color_bg_panel_network, 20%)\\n$color_node_body_bypassed: $gray-600\\n$color_node_border_bypassed: darken($color_bg_panel_network, 5%)\\n$color_node_body_hover_border: darken($color_node_body, 50%)\\n$color_node_body_selected: #54ff00 //lighten($success-color, 5%)\\n$color_box_shadow: darken($color_bg_panel_network, 10%)\\n$color_box_shadow_moved: #111827 // gray-900 ////lighten($color_box_shadow, 0%)\\n$color_error_flag: $alert-color\\n$color_bypass_flag_on: yellow\\n$color_bypass_flag_off: white //mix($color_bg_panel_network, $color_bypass_flag_on, 95%)\\n$color_display_flag_on: $primary-color //#00d9ff //#2327d7 //darken(saturate($primary-color, 20%), 20%)\\n$color_display_flag_off: white //mix($color_bg_panel_network, $color_display_flag_on, 95%)\\n$color_bg_input: lighten($primary-color, 0%)\\n$color_border_input: darken($color_bg_input, 40%)\\n$color_bg_output: darken($success-color, 0%)\\n$color_border_output: darken($color_bg_output, 40%)\\n\\n$connection_size_default: 12px\\n$connection_size_hover: 16px\\n$connection_size_touch: 24px\\n$connection_width_array: 20px\\n\\n$z_index_body: 8 // to be higher than name\\n$z_index_flag_container: 9\\n$z_index_name: 5\\n$z_index_info_container: 999\\n$z_index_param_labels: 999\\n$z_index_param_labels_hovered: 999 // has no effect, since the element is set to pointer-events none\\n$z_index_comment: 4\\n$z_index_comment_hovered: 999\\n$z_index_enter_button: 6\\n$z_index_connection_element: 20\\n$z_index_connection_name: 19\\n$z_index_connection_hover: 999\\n$z_index_connection_name_non_named: 21\\n$z_index_error: 99999\\n\\n.NetworkNode\\n\\tposition: absolute\\n\\twidth: 0px\\n\\theight: 0px\\n\\t// transform: translate(-50%, -50%)\\n\\t&.selected\\n\\t\\t.node-body\\n\\t\\t\\tborder: 3px solid $color_node_body_selected !important\\n\\t&.is_being_moved\\n\\t\\t.node-body\\n\\t\\t\\tbox-shadow: 4px 4px 8px $color_box_shadow_moved\\n\\t&.bypassed\\n\\t\\t.node-body\\n\\t\\t\\t// opacity: 0.4\\n\\t\\t\\t// background-color: $color_node_body_bypassed\\n\\t\\t\\tborder: 3px solid $color_node_border_bypassed\\n\\t\\t\\t.icon-container\\n\\t\\t\\t\\topacity: 0.2\\n\\t\\t.name-container, .params-label-container, .flag-optimize-container, .comment-container\\n\\t\\t\\topacity: 0.4\\n\\t&.layout_horizontal\\n\\t\\t.name-container\\n\\t\\t\\ttransform: translateY(-100%)\\n\\t\\t\\t.name-element\\n\\t\\t\\t\\tmargin: 0\\n\\t\\t.inputs-container\\n\\t\\t\\tposition: absolute\\n\\t\\t\\t.output-pixel\\n\\t\\t\\t\\t// top: 10px\\n\\t\\t\\t\\tleft: 100%\\n\\t\\t\\t\\t// .output-element\\n\\t\\t.outputs-container\\n\\t\\t\\tposition: absolute\\n\\t\\t\\t.output-pixel\\n\\t\\t\\t\\ttop: 10px\\n\\t\\t\\t\\tleft: 100%\\n\\t\\t\\t\\t// .output-element\\n\\n\\t.node-body\\n\\t\\tposition: absolute\\n\\t\\t//background-color: $color_node_body\\n\\t\\tborder-radius: 3px\\n\\t\\t// box-shadow: 1px 1px 2px $color_box_shadow\\n\\t\\t// border: 1px solid transparent\\n\\t\\tcursor: move\\n\\t\\tz-index: $z_index_body\\n\\t\\t&:hover\\n\\t\\t\\tborder: 1px solid $color_node_body_hover_border\\n\\n\\t\\t.icon-container\\n\\t\\t\\topacity: 0.5\\n\\t\\t\\tmargin: auto\\n\\t\\t\\ttext-align: center\\n\\t\\t\\theight: 100%\\n\\t\\t\\tsvg\\n\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\ttop: 50%\\n\\t\\t\\t\\ttransform: translateY(-50%)\\n\\n\\t.error-flag-container\\n\\t\\tposition: absolute\\n\\t\\tpointer-events: none\\n\\t\\tz-index: $z_index_error\\n\\t\\t.error-flag\\n\\t\\t\\tposition: absolute\\n\\t\\t\\tleft: -80px\\n\\t\\t\\tmargin-right: 20px\\n\\t\\t\\tcolor: $color_error_flag\\n\\n\\t.flag-container\\n\\t\\tposition: absolute\\n\\t\\tz-index: $z_index_flag_container\\n\\t\\t.node-flag\\n\\t\\t\\tposition: absolute\\n\\t\\t\\twidth: 10px\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\t&.bypass-flag\\n\\t\\t\\t\\tleft: 0px\\n\\t\\t\\t\\t&.on\\n\\t\\t\\t\\t\\tbackground-color: $color_bypass_flag_on\\n\\t\\t\\t\\t&.off\\n\\t\\t\\t\\t\\tbackground-color: $color_bypass_flag_off\\n\\t\\t\\t&.display-flag\\n\\t\\t\\t\\tright: 0px\\n\\t\\t\\t\\t&.on\\n\\t\\t\\t\\t\\tbackground-color: $color_display_flag_on\\n\\t\\t\\t\\t&.off\\n\\t\\t\\t\\t\\tbackground-color: $color_display_flag_off\\n\\n\\t.name-container\\n\\t\\tposition: absolute\\n\\t\\ttransform: translateY(-50%)\\n\\t\\tz-index: $z_index_name\\n\\t\\t.name-element\\n\\t\\t\\tmargin-left: 10px\\n\\t\\t\\tcursor: text\\n\\t.node-local-info-container\\n\\t\\tposition: absolute\\n\\t\\tz-index: $z_index_info_container\\n\\t\\t.params-label-container\\n\\t\\t\\t// transform: translateY(-50%) // does not quite work for nodes like cop/image which have multiple param labels\\n\\t\\t\\tz-index: $z_index_param_labels\\n\\t\\t\\topacity: 0.8\\n\\t\\t\\t// pointer-events: none // so that we can still get nodes under them\\n\\t\\t\\t// &:hover\\n\\t\\t\\t// \\topacity: 0.95\\n\\t\\t\\t// \\tz-index: $z_index_param_labels_hovered\\n\\t\\t\\t// \\tbackground-color: #111\\n\\t\\t\\t// \\t// border: 2px solid orange\\n\\t\\t.comment-container\\n\\t\\t\\t// transform: translateY(-50%)\\n\\t\\t\\twidth: 200px\\n\\t\\t\\tz-index: $z_index_comment\\n\\t\\t\\t// we add some opacity to see connections under a large comment\\n\\t\\t\\topacity: 0.85\\n\\t\\t\\tpointer-events: none // so that we can still get nodes under them\\n\\t\\t\\t// &:hover\\n\\t\\t\\t// \\topacity:  0.95\\n\\t\\t\\t// \\tz-index: $z_index_comment_hovered\\n\\t\\t\\t.comment-element\\n\\t\\t\\t\\tfont-size: 0.8rem\\n\\t\\t\\t\\tmargin-left: 10px\\n\\t\\t\\t\\t// margin-top: -10px\\n\\t\\t\\t\\tpadding: 5px\\n\\t\\t\\t\\t// background-color: lightblue\\n\\t\\t\\t\\t$comment_border_radius: 5px\\n\\t\\t\\t\\tborder-top-right-radius: $comment_border_radius\\n\\t\\t\\t\\tborder-bottom-right-radius: $comment_border_radius\\n\\t\\t\\t\\tborder-bottom-left-radius: $comment_border_radius\\n\\t\\t\\t\\t.comment-line\\n\\t\\t\\t\\t\\t&:not(:first-child)\\n\\t\\t\\t\\t\\t\\tmargin-top: 8px\\n\\n\\t.flag-optimize-container\\n\\t\\tposition: absolute\\n\\t\\ttransform: translateY(-50%)\\n\\t\\tz-index: $z_index_name\\n\\t\\ttop: 50px\\n\\t\\tleft: 30px\\n\\t\\t.flag-optimize-label-element\\n\\t\\t\\tmargin-left: 10px\\n\\t\\t\\tborder-radius: 5px\\n\\t\\t\\t// background-color: $warning-color\\n\\t\\t\\tfont-size: 0.85rem\\n\\t\\t\\tpadding: 3px 5px\\n\\t\\t\\tline-height: 1\\n\\n\\t.enter-button-container\\n\\t\\tposition: absolute\\n\\t\\ttransform: translateY(-50%)\\n\\t\\tz-index: $z_index_enter_button\\n\\t\\t.enter-button\\n\\t\\t\\tmargin-right: 10px\\n\\t\\t\\tpadding: 5px\\n\\t\\t\\tborder-radius: 25px\\n\\t\\t\\twidth: 25px\\n\\t\\t\\theight: 25px\\n\\t\\t\\ttext-align: center\\n\\t\\t\\t// background-color: lightgreen\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\tline-height: 0\\n\\t\\t\\t// &:hover\\n\\t\\t\\t// \\tbackground-color: darken(lightgreen, 10%)\\n\\t\\t\\tsvg\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\tmargin: auto\\n\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t// top: 50%\\n\\t\\t\\t\\t// transform: translateY(-50%)\\n\\t.poly-node-icon-container\\n\\t\\tposition: absolute\\n\\t\\ttransform: translateY(-50%)\\n\\t\\tz-index: $z_index_enter_button\\n\\t\\t.poly-node-icon\\n\\t\\t\\tmargin-right: 10px\\n\\t\\t\\tpadding: 5px\\n\\t\\t\\tborder-radius: 25px\\n\\t\\t\\twidth: 25px\\n\\t\\t\\theight: 25px\\n\\t\\t\\ttext-align: center\\n\\t\\t\\t// background-color: lightgreen\\n\\t\\t\\t// cursor: pointer\\n\\t\\t\\tline-height: 0\\n\\t\\t\\t// &:hover\\n\\t\\t\\t// \\tbackground-color: darken(lightgreen, 10%)\\n\\t\\t\\tsvg\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\tmargin: auto\\n\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t// top: 50%\\n\\t\\t\\t\\t// transform: translateY(-50%)\\n\\n\\t.connection-pixel\\n\\t\\tposition: absolute\\n\\n\\t\\t&:hover\\n\\t\\t\\tz-index: $z_index_connection_hover\\n\\t\\t\\t.connection-name-element\\n\\t\\t\\t\\t&.non_named_element\\n\\t\\t\\t\\t\\tdisplay: block\\n\\t\\t.connection-name-element\\n\\t\\t\\tposition: absolute\\n\\t\\t\\tpointer-events: none\\n\\t\\t\\t// background-color: $color_node_body\\n\\t\\t\\tline-height: 1\\n\\t\\t\\tpadding: 2px 4px\\n\\t\\t\\tborder-radius: 2px\\n\\t\\t\\t// border: 1px solid $color_bg_panel_network\\n\\t\\t\\t&.named_element\\n\\t\\t\\t\\tz-index: $z_index_connection_name\\n\\t\\t\\t\\tfont-size: 0.5rem\\n\\t\\t\\t&.non_named_element\\n\\t\\t\\t\\tz-index: $z_index_connection_name_non_named\\n\\t\\t\\t\\tfont-size: 0.8rem\\n\\t\\t\\t\\tpadding: 5px 10px\\n\\t\\t\\t\\tdisplay: none\\n\\t\\t\\t\\ttop: -20px\\n\\t\\t\\t\\tleft: 0px\\n\\t\\t\\t\\ttransform: translate(-50%, -100%)\\n\\n\\t\\t.connection-element\\n\\t\\t\\t&.isArray\\n\\t\\t\\t\\twidth: $connection_width_array\\n\\t\\t\\t\\t&:hover\\n\\t\\t\\t\\t\\twidth: $connection_width_array * 1.1\\n\\t\\t\\t\\t\\theight: $connection_size_hover\\n\\t\\t.connection-element\\n\\t\\t\\twidth: $connection_size_default\\n\\t\\t\\theight: $connection_size_default\\n\\t\\t\\tborder-radius: 100px\\n\\t\\t\\ttransform: translate(-50%, -50%)\\n\\t\\t\\tposition: relative\\n\\t\\t\\tz-index: $z_index_connection_element\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\twidth: $connection_size_hover\\n\\t\\t\\t\\theight: $connection_size_hover\\n\\t\\t\\t&.isTouchOrMobile\\n\\t\\t\\t\\twidth: $connection_size_touch\\n\\t\\t\\t\\theight: $connection_size_touch\\n\\n\\t.inputs-container\\n\\t\\tposition: absolute\\n\\t\\t.input-pixel\\n\\t\\t\\ttop: 0\\n\\t\\t\\twidth: 0\\n\\t\\t\\theight: 0\\n\\t\\t\\t.connection-name-element\\n\\t\\t\\t\\t&.named_element\\n\\t\\t\\t\\t\\tpadding-left: 10px\\n\\t\\t\\t\\t\\ttransform: translate(0%, -50%)\\n\\t\\t\\t.connection-element\\n\\t\\t\\t\\t// border: 1px solid $color_border_input\\n\\t\\t\\t\\t// background-color: $color_bg_input\\n\\t\\t\\t\\t// top: -1*($connection_size_hover - $connection_size_default)\\n\\t\\t\\t\\t// &:hover\\n\\t\\t\\t\\t// \\ttop: -1.5*($connection_size_hover - $connection_size_default)\\n\\n\\t.outputs-container\\n\\t\\tposition: absolute\\n\\t\\t.output-pixel\\n\\t\\t\\tbottom: 0\\n\\t\\t\\twidth: 0\\n\\t\\t\\theight: 0\\n\\t\\t\\tleft: 50%\\n\\t\\t\\t.connection-name-element\\n\\t\\t\\t\\t&.named_element\\n\\t\\t\\t\\t\\tpadding-right: 10px\\n\\t\\t\\t\\t\\ttransform: translate(-100%, -50%)\\n\\t\\t\\t.connection-element\\n\\t\\t\\t\\t// left: 50%\\n\\t\\t\\t\\tborder: 1px solid $color_border_output\\n\\t\\t\\t\\t// background-color: $color_bg_output\\n\\t\\t\\t\\t//&:hover\\n\\t\\t\\t\\t//\\tbottom: -1.5*($connection_size_hover - $connection_size_default)\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".node-markdown-comment-container a{color:#eee;border-bottom:2px solid #eee;cursor:pointer;pointer-events:auto;white-space:nowrap}.node-markdown-comment-container a:hover{border-bottom:2px solid #fff;color:#fff}.node-markdown-comment-container code{background-color:#000;padding:1px 2px;border:1px solid #a9a9a9;border-radius:3px}.node-markdown-comment-container ul{list-style-type:disc}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/NodeComment.vue\"],\"names\":[],\"mappings\":\"AAEC,mCACC,UAAA,CACA,4BAAA,CACA,cAAA,CACA,mBAAA,CACA,kBAAA,CACA,yCACC,4BAAA,CACA,UAAA,CAEF,sCACC,qBAAA,CACA,eAAA,CACA,wBAAA,CACA,iBAAA,CACD,oCACC,oBAAA\",\"sourcesContent\":[\"\\n.node-markdown-comment-container\\n\\ta\\n\\t\\tcolor: #eee\\n\\t\\tborder-bottom: 2px solid #eee\\n\\t\\tcursor: pointer\\n\\t\\tpointer-events: auto\\n\\t\\twhite-space: nowrap\\n\\t\\t&:hover\\n\\t\\t\\tborder-bottom: 2px solid white\\n\\t\\t\\tcolor: white\\n\\n\\tcode\\n\\t\\tbackground-color: black\\n\\t\\tpadding: 1px 2px\\n\\t\\tborder: 1px solid darkgrey\\n\\t\\tborder-radius: 3px\\n\\tul\\n\\t\\tlist-style-type: disc\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".error-flag a{color:#cc4b37;border-bottom:2px solid #cc4b37;cursor:pointer;pointer-events:auto}.error-flag a:hover{border-bottom:2px solid #e19488;color:#e19488}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/NodeError.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAKA,cACC,aC6Ta,CD5Tb,+BAAA,CACA,cAAA,CACA,mBAAA,CACA,oBACC,+BAAA,CACA,aATY\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n$color_error_flag: $alert-color\\n$hover_color: lighten($color_error_flag, 20%)\\n\\n.error-flag a\\n\\tcolor: $color_error_flag\\n\\tborder-bottom: 2px solid $color_error_flag\\n\\tcursor: pointer\\n\\tpointer-events: auto\\n\\t&:hover\\n\\t\\tborder-bottom: 2px solid $hover_color\\n\\t\\tcolor: $hover_color\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfo{position:absolute;z-index:50000;transform:translateY(-50%);margin-left:40px}.NetworkNodeInfo .arrow-left{position:absolute;top:50%;transform:translate(-100%, -50%)}.NetworkNodeInfo .node_title_container{text-align:center;cursor:pointer}.NetworkNodeInfo .node_title_container svg{margin-right:5px}.NetworkNodeInfo .node_info_container{padding:20px}.NetworkNodeInfo .node_info_container .icon_prefixed svg{margin-right:10px;position:relative;top:3px}.NetworkNodeInfo .node_info_container .node_info_separator{margin:10px 0px;height:1px}.NetworkNodeInfo .node_info_container .dependencies .dependencies_section{margin-top:10px}.NetworkNodeInfo .node_info_container .dependencies .dependencies_section .dependencies_section_title{font-weight:bold}.NetworkNodeInfo .node_info_container .dependencies .dependencies_section .dependencies_list .dependendies_item{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/NodeInfo.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAgBA,iBACC,iBAAA,CAGA,aCuUmB,CDtUnB,0BAAA,CACA,gBAAA,CAKA,6BAMC,iBAAA,CACA,OAAA,CACA,gCAAA,CAED,uCAGC,iBAAA,CACA,cAAA,CACA,2CACC,gBAAA,CAEF,sCACC,YAhCQ,CAmCP,yDACC,iBAAA,CACA,iBAAA,CACA,OAAA,CAUF,2DACC,eAAA,CACA,UAAA,CAIA,0EACC,eAAA,CACA,sGACC,gBAAA,CAEA,gHACC,cAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n$color_border: rgb(38 38 38) ///darken($color_bg_panel_network, 20%)\\n\\n$color_node_title_bg: $color_border\\n$color_node_title_font: white\\n$color_time_dependent: darken($success-color, 25%)\\n$color_error_message: $alert-color\\n$color_separator: darken($color_node_info_bg, 20%)\\n$color_dependency_item_hover: darken($color_node_info_bg, 5%)\\n\\n$size_border: 4px\\n$size_arrow: 10px\\n$padding: 20px\\n\\n.NetworkNodeInfo\\n\\tposition: absolute\\n\\t// width: 200px\\n\\t// height: 200px\\n\\tz-index: $z_index_node_info\\n\\ttransform: translateY(-50%)\\n\\tmargin-left: 40px\\n\\n\\t// background-color: $color_node_info_bg\\n\\t// border: $size_border solid $color_border\\n\\n\\t.arrow-left\\n\\t\\t//width: 0\\n\\t\\t//height: 0\\n\\t\\t//border-top: $size_arrow solid transparent\\n\\t\\t//border-bottom: $size_arrow solid transparent\\n\\t\\t//border-right: $size_arrow solid $color_border\\n\\t\\tposition: absolute\\n\\t\\ttop: 50%\\n\\t\\ttransform: translate(-100%, -50%)\\n\\n\\t.node_title_container\\n\\t\\t// background-color: $color_node_title_bg\\n\\t\\t// color: $color_node_title_font\\n\\t\\ttext-align: center\\n\\t\\tcursor: pointer\\n\\t\\tsvg\\n\\t\\t\\tmargin-right: 5px\\n\\n\\t.node_info_container\\n\\t\\tpadding: $padding\\n\\n\\t\\t.icon_prefixed\\n\\t\\t\\tsvg\\n\\t\\t\\t\\tmargin-right: 10px\\n\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\ttop: 3px\\n\\n\\t\\t// .time_dependency\\n\\t\\t// \\twhite-space: nowrap\\n\\t\\t// \\t// &.time_dependent\\n\\t\\t// \\t// \\tcolor: $color_time_dependent\\n\\n\\t\\t// .error_message\\n\\t\\t// \\tcolor: $color_error_message\\n\\n\\t\\t.node_info_separator\\n\\t\\t\\tmargin: 10px 0px\\n\\t\\t\\theight: 1px\\n\\t\\t\\t// background-color: $color_separator\\n\\n\\t\\t.dependencies\\n\\t\\t\\t.dependencies_section\\n\\t\\t\\t\\tmargin-top: 10px\\n\\t\\t\\t\\t.dependencies_section_title\\n\\t\\t\\t\\t\\tfont-weight: bold\\n\\t\\t\\t\\t.dependencies_list\\n\\t\\t\\t\\t\\t.dependendies_item\\n\\t\\t\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\t\\t\\t// &:hover\\n\\t\\t\\t\\t\\t\\t// \\tbackground-color: $color_dependency_item_hover\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ParamLabelResult{margin:0px 10px;border-radius:12px;font-size:.85rem;padding:2px 0px}.ParamLabelResult .ParamLabelResultString{white-space:nowrap}.ParamLabelResult .ParamLabelResultColor{width:50px;height:12px;border-radius:3px;border:1px solid #000}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/ParamLabelResult.vue\"],\"names\":[],\"mappings\":\"AAGA,kBACC,eAAA,CACA,kBAAA,CAGA,gBAAA,CACA,eAAA,CACA,0CACC,kBAAA,CACD,yCACC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,qBAAA\",\"sourcesContent\":[\"\\n\\n\\n.ParamLabelResult\\n\\tmargin: 0px 10px\\n\\tborder-radius: 12px\\n\\t// background-color: $primary-color\\n\\t// color: mix($primary-color, $color_font, 50%) //white\\n\\tfont-size: 0.85rem\\n\\tpadding: 2px 0px\\n\\t.ParamLabelResultString\\n\\t\\twhite-space: nowrap\\n\\t.ParamLabelResultColor\\n\\t\\twidth: 50px\\n\\t\\theight: 12px\\n\\t\\tborder-radius: 3px\\n\\t\\tborder: 1px solid black\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoAniim .node_info_anim_section{white-space:nowrap}.NetworkNodeInfoAniim .node_info_anim_section .node_info_anim_section_title{display:inline-block;margin-right:5px}.NetworkNodeInfoAniim .node_info_anim_section .node_info_anim_section_content{display:inline-block}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/Anim.vue\"],\"names\":[],\"mappings\":\"AAOC,8CACC,kBAAA,CACA,4EACC,oBAAA,CACA,gBAAA,CACD,8EACC,oBAAA\",\"sourcesContent\":[\"\\n\\n\\n// $color_table_border: black\\n\\n.NetworkNodeInfoAniim\\n\\n\\t.node_info_anim_section\\n\\t\\twhite-space: nowrap\\n\\t\\t.node_info_anim_section_title\\n\\t\\t\\tdisplay: inline-block\\n\\t\\t\\tmargin-right: 5px\\n\\t\\t.node_info_anim_section_content\\n\\t\\t\\tdisplay: inline-block\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoCop .bbox_infos table{margin-top:10px}.NetworkNodeInfoCop .bbox_infos table td{border:1px solid #000;text-align:center;padding:0px 5px}.NetworkNodeInfoCop .bbox_infos table td.number{white-space:nowrap}.NetworkNodeInfoCop .node_info_cop_section{white-space:nowrap}.NetworkNodeInfoCop .node_info_cop_section.inline .node_info_cop_section_title{display:inline-block;margin-right:5px}.NetworkNodeInfoCop .node_info_cop_section.inline .node_info_cop_section_content{display:inline-block}.NetworkNodeInfoCop .canvas-container{border:1px solid #d3d3d3}.NetworkNodeInfoCop .canvas-container canvas{max-width:100%;max-height:100%;display:block}.NetworkNodeInfoCop .download_button span{margin-left:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/Cop.vue\"],\"names\":[],\"mappings\":\"AAQE,sCACC,eAAA,CACA,yCACC,qBAAA,CACA,iBAAA,CACA,eAAA,CACA,gDACC,kBAAA,CAGJ,2CACC,kBAAA,CAEC,+EACC,oBAAA,CACA,gBAAA,CACD,iFACC,oBAAA,CACH,sCACC,wBAAA,CACA,6CACC,cAAA,CACA,eAAA,CACA,aAAA,CAED,0CACC,gBAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n$color_table_border: black\\n\\n.NetworkNodeInfoCop\\n\\n\\t.bbox_infos\\n\\t\\ttable\\n\\t\\t\\tmargin-top: 10px\\n\\t\\t\\ttd\\n\\t\\t\\t\\tborder: 1px solid $color_table_border\\n\\t\\t\\t\\ttext-align: center\\n\\t\\t\\t\\tpadding: 0px 5px\\n\\t\\t\\t\\t&.number\\n\\t\\t\\t\\t\\twhite-space: nowrap\\n\\t\\t\\t// tr.odd\\n\\n\\t.node_info_cop_section\\n\\t\\twhite-space: nowrap\\n\\t\\t&.inline\\n\\t\\t\\t.node_info_cop_section_title\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\tmargin-right: 5px\\n\\t\\t\\t.node_info_cop_section_content\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t.canvas-container\\n\\t\\tborder: 1px solid lightgrey\\n\\t\\tcanvas\\n\\t\\t\\tmax-width: 100%\\n\\t\\t\\tmax-height: 100%\\n\\t\\t\\tdisplay: block\\n\\t.download_button\\n\\t\\tspan\\n\\t\\t\\tmargin-left: 10px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoGl .button{margin-bottom:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/Gl.vue\"],\"names\":[],\"mappings\":\"AAGC,2BACC,iBAAA\",\"sourcesContent\":[\"\\n\\n.NetworkNodeInfoGl\\n\\t.button\\n\\t\\tmargin-bottom: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoMat .button{margin-bottom:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/Mat.vue\"],\"names\":[],\"mappings\":\"AAGC,4BACC,iBAAA\",\"sourcesContent\":[\"\\n\\n.NetworkNodeInfoMat\\n\\t.button\\n\\t\\tmargin-bottom: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoMatShaderBuilder .button{margin-bottom:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/ObjThreejsCamera.vue\"],\"names\":[],\"mappings\":\"AAGC,yCACC,iBAAA\",\"sourcesContent\":[\"\\n\\n.NetworkNodeInfoMatShaderBuilder\\n\\t.button\\n\\t\\tmargin-bottom: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoSop .objects_data_container{max-height:400px;overflow:auto}.NetworkNodeInfoSop .objects_data_container table.objects_data{margin-bottom:0px}.NetworkNodeInfoSop .objects_data_container table.objects_data tr.last_line{border-top:1px solid #000}.NetworkNodeInfoSop .objects_data_container table.objects_data td{padding:2px 5px}.NetworkNodeInfoSop .objects_data_container table.objects_data td.faded{opacity:.5}.NetworkNodeInfoSop .bbox_infos table{margin-top:10px}.NetworkNodeInfoSop .bbox_infos table td{border:1px solid #000;text-align:center;padding:0px 5px}.NetworkNodeInfoSop .bbox_infos table td.number{white-space:nowrap}.NetworkNodeInfoSop .node_info_sop_section{white-space:nowrap}.NetworkNodeInfoSop .node_info_sop_section.inline .node_info_sop_section_title{display:inline-block;margin-right:5px}.NetworkNodeInfoSop .node_info_sop_section.inline .node_info_sop_section_content{display:inline-block}.NetworkNodeInfoSop .node_info_sop_section.object_names .node_info_sop_section_title{position:relative;top:0px}.NetworkNodeInfoSop .node_info_sop_section.object_names .node_info_sop_section_content{max-height:200px;overflow-y:scroll}.NetworkNodeInfoSop .objects_count_visible{margin-left:10px;opacity:.7}.NetworkNodeInfoSop .objects_count_visible.highlighted{opacity:1;font-weight:bold}.NetworkNodeInfoSop .attribute_info.string{color:#1779ba}.NetworkNodeInfoSop .attribute_info.none{margin-left:5px;opacity:.6}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/Sop.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAQC,4CACC,gBAAA,CACA,aAAA,CACA,+DACC,iBAAA,CAMC,4EACC,yBAAA,CACF,kEACC,eAAA,CACA,wEACC,UAAA,CAGH,sCACC,eAAA,CACA,yCACC,qBAAA,CACA,iBAAA,CACA,eAAA,CACA,gDACC,kBAAA,CAGJ,2CACC,kBAAA,CAEC,+EACC,oBAAA,CACA,gBAAA,CACD,iFACC,oBAAA,CAGD,qFACC,iBAAA,CACA,OAAA,CACD,uFACC,gBAAA,CACA,iBAAA,CAEH,2CACC,gBAAA,CACA,UAAA,CACA,uDACC,SAAA,CACA,gBAAA,CAGD,2CACC,aCiQa,CD9Pd,yCACC,eAAA,CACA,UAAA\",\"sourcesContent\":[\"\\n\\n@import \\\"globals.sass\\\"\\n\\n$color_table_border: black\\n\\n.NetworkNodeInfoSop\\n\\n\\t.objects_data_container\\n\\t\\tmax-height: 400px\\n\\t\\toverflow: auto\\n\\t\\ttable.objects_data\\n\\t\\t\\tmargin-bottom: 0px\\n\\t\\t\\ttr\\n\\t\\t\\t\\t// &.odd\\n\\t\\t\\t\\t// \\tbackground-color: darken($color_node_info_bg,5%)\\n\\t\\t\\t\\t// &.even\\n\\t\\t\\t\\t// \\tbackground-color: lighten($color_node_info_bg,5%)\\n\\t\\t\\t\\t&.last_line\\n\\t\\t\\t\\t\\tborder-top: 1px solid black\\n\\t\\t\\ttd\\n\\t\\t\\t\\tpadding: 2px 5px\\n\\t\\t\\t\\t&.faded\\n\\t\\t\\t\\t\\topacity: 0.5\\n\\n\\t.bbox_infos\\n\\t\\ttable\\n\\t\\t\\tmargin-top: 10px\\n\\t\\t\\ttd\\n\\t\\t\\t\\tborder: 1px solid $color_table_border\\n\\t\\t\\t\\ttext-align: center\\n\\t\\t\\t\\tpadding: 0px 5px\\n\\t\\t\\t\\t&.number\\n\\t\\t\\t\\t\\twhite-space: nowrap\\n\\t\\t\\t// tr.odd\\n\\n\\t.node_info_sop_section\\n\\t\\twhite-space: nowrap\\n\\t\\t&.inline\\n\\t\\t\\t.node_info_sop_section_title\\n\\t\\t\\t\\tdisplay: inline-block\\n\\t\\t\\t\\tmargin-right: 5px\\n\\t\\t\\t.node_info_sop_section_content\\n\\t\\t\\t\\tdisplay: inline-block\\n\\n\\t\\t&.object_names\\n\\t\\t\\t.node_info_sop_section_title\\n\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\ttop: 0px\\n\\t\\t\\t.node_info_sop_section_content\\n\\t\\t\\t\\tmax-height: 200px\\n\\t\\t\\t\\toverflow-y: scroll\\n\\n\\t.objects_count_visible\\n\\t\\tmargin-left: 10px\\n\\t\\topacity: 0.7\\n\\t\\t&.highlighted\\n\\t\\t\\topacity: 1\\n\\t\\t\\tfont-weight: bold\\n\\n\\t.attribute_info\\n\\t\\t&.string\\n\\t\\t\\tcolor: $primary_color\\n\\t\\t&.numeric\\n\\t\\t\\t// color: darken($success_color, 20%)\\n\\t\\t&.none\\n\\t\\t\\tmargin-left: 5px\\n\\t\\t\\topacity: 0.6\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoMatShaderBuilder .button{margin-bottom:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/SopCache.vue\"],\"names\":[],\"mappings\":\"AAGC,yCACC,iBAAA\",\"sourcesContent\":[\"\\n\\n.NetworkNodeInfoMatShaderBuilder\\n\\t.button\\n\\t\\tmargin-bottom: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoSopParticlesSystemGPU .button{margin-bottom:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/SopParticlesSystemGPU.vue\"],\"names\":[],\"mappings\":\"AAGC,8CACC,iBAAA\",\"sourcesContent\":[\"\\n\\n.NetworkNodeInfoSopParticlesSystemGPU\\n\\t.button\\n\\t\\tmargin-bottom: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NetworkNodeInfoMatShaderBuilder .button{margin-bottom:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/nodes/node_infos/SopPostProcessNetwork.vue\"],\"names\":[],\"mappings\":\"AAGC,yCACC,iBAAA\",\"sourcesContent\":[\"\\n\\n.NetworkNodeInfoMatShaderBuilder\\n\\t.button\\n\\t\\tmargin-bottom: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".TabMenu{position:absolute;z-index:99999}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/tabMenu/TabMenu.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAGA,SACC,iBAAA,CACA,aC8VkB\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n.TabMenu\\n\\tposition: absolute\\n\\tz-index: $z_index_tab_menu\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".tab-menu-combobox-container{z-index:10999}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/network/components/tabMenu/TabMenuCombobox.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAGA,6BACC,aC6VyB\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n.tab-menu-combobox-container\\n\\tz-index: $z_index_command_palette\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Panel.Params .styled-scroll-bar::-webkit-scrollbar{width:8px;height:0px}.Panel.Params .styled-scroll-bar::-webkit-scrollbar-track{border-radius:100vh;background:#999}.Panel.Params .styled-scroll-bar::-webkit-scrollbar-thumb{background:#000;border-radius:100vh;border:1px solid rgba(0,0,0,0);background:#2563eb}.Panel.Params .styled-scroll-bar::-webkit-scrollbar-thumb:hover{background:#1d4ed8}.Panel.Params .upgrade_message{font-size:.85rem;padding:2px}.Panel.Params .node_name_container,.Panel.Params .node_help_button,.Panel.Params .preset_dropdown_title{margin:10px 5px}.Panel.Params .node_name_container .node_name{cursor:pointer}.Panel.Params .node_name_container .node_type{margin-left:10px;opacity:.6;font-style:italic}.Panel.Params .node_help_button{display:inline-block}.Panel.Params .params_container{padding-right:10px;padding-bottom:10px}.Panel.Params .params_container .params_folder .folder_name{padding:2px 5px;font-size:.8rem;margin-bottom:5px;cursor:pointer;text-align:center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/Params.vue\"],\"names\":[],\"mappings\":\"AAME,oDACC,SAAA,CACA,UAAA,CACD,0DACC,mBAAA,CACA,eAAA,CACD,0DACC,eAAA,CACA,mBAAA,CACA,8BAAA,CACA,kBAAA,CACD,gEACC,kBAAA,CAEF,+BACC,gBAAA,CACA,WAAA,CAGD,wGACC,eAAA,CAEA,8CACC,cAAA,CACD,8CACC,gBAAA,CACA,UAAA,CACA,iBAAA,CACF,gCACC,oBAAA,CAGD,gCACC,kBAAA,CACA,mBAAA,CAGC,4DACC,eAAA,CACA,eAAA,CACA,iBAAA,CACA,cAAA,CACA,iBAAA\",\"sourcesContent\":[\"\\n\\n.Panel.Params\\n\\n\\t.styled-scroll-bar\\n\\t\\t// https://stackoverflow.com/questions/69400560/how-to-change-scrollbar-when-using-tailwind-next-js-react\\n\\t\\t&::-webkit-scrollbar\\n\\t\\t\\twidth: 8px\\n\\t\\t\\theight: 0px\\n\\t\\t&::-webkit-scrollbar-track\\n\\t\\t\\tborder-radius: 100vh\\n\\t\\t\\tbackground: #999\\n\\t\\t&::-webkit-scrollbar-thumb\\n\\t\\t\\tbackground: black\\n\\t\\t\\tborder-radius: 100vh\\n\\t\\t\\tborder: 1px solid transparent\\n\\t\\t\\tbackground: rgb(37 99 235)\\n\\t\\t&::-webkit-scrollbar-thumb:hover\\n\\t\\t\\tbackground: rgb(29 78 216)\\n\\n\\t.upgrade_message\\n\\t\\tfont-size: 0.85rem\\n\\t\\tpadding: 2px\\n\\n\\n\\t.node_name_container, .node_help_button, .preset_dropdown_title\\n\\t\\tmargin: 10px 5px\\n\\t.node_name_container\\n\\t\\t.node_name\\n\\t\\t\\tcursor: pointer\\n\\t\\t.node_type\\n\\t\\t\\tmargin-left: 10px\\n\\t\\t\\topacity: 0.60\\n\\t\\t\\tfont-style: italic\\n\\t.node_help_button\\n\\t\\tdisplay: inline-block\\n\\n\\n\\t.params_container\\n\\t\\tpadding-right: 10px\\n\\t\\tpadding-bottom: 10px\\n\\n\\t\\t.params_folder\\n\\t\\t\\t.folder_name\\n\\t\\t\\t\\tpadding: 2px 5px\\n\\t\\t\\t\\tfont-size: 0.8rem\\n\\t\\t\\t\\tmargin-bottom: 5px\\n\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\ttext-align: center\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ParamExtrasContainer{padding:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/Extras.vue\"],\"names\":[],\"mappings\":\"AAEA,sBACC,YAAA\",\"sourcesContent\":[\"\\n\\n.ParamExtrasContainer\\n\\tpadding: 10px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ParamContainer{padding:1px 0px;position:relative}.ParamContainer .ParamSeparator .horizontal-border{height:2px;margin:10px}.ParamContainer.is_not_default label{font-weight:bold}.ParamContainer .param_name{position:relative;z-index:1}.ParamContainer .param_name label{font-size:.8rem;color:#111;cursor:pointer;margin:5px;padding:0rem 10px}.ParamContainer .param_name label:hover{background-color:#84606f}.ParamContainer .param_fields.no_labels_on_any_param{margin-left:10px}.ParamContainer .Field{position:relative;z-index:2}.ParamContainer .Field input.raw_input{display:block}.ParamContainer .Field input.expression_result{display:none}.ParamContainer .Field.displays_expression_result input.raw_input{display:none}.ParamContainer .Field.displays_expression_result input.expression_result{display:block}.ParamContainer .Field input,.ParamContainer .Field textarea{margin:0px;padding:.2rem}.ParamContainer .Field input.has_expression:not(.is_errored),.ParamContainer .Field textarea.has_expression:not(.is_errored){background-color:#15803d}.ParamContainer .Field input.is_errored,.ParamContainer .Field textarea.is_errored{background-color:#b91c1c}.ParamContainer .Field.Multiple.grid-x .cell .Field.Numeric:not:first-child{padding-left:2px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/Param.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAOA,gBACC,eAAA,CAEA,iBAAA,CAUC,mDACC,UAAA,CAEA,WAAA,CAGD,qCACC,gBAAA,CAEF,4BACC,iBAAA,CACA,SAAA,CACA,kCACC,eAAA,CACA,UC0RU,CDzRV,cAAA,CACA,UAAA,CACA,iBAAA,CACA,wCACC,wBApCa,CAsCf,qDACC,gBAAA,CAEF,uBACC,iBAAA,CACA,SAAA,CACA,uCACC,aAAA,CACD,+CACC,YAAA,CAEA,kEACC,YAAA,CACD,0EACC,aAAA,CAEF,6DACC,UAAA,CACA,aAAA,CAIC,6HACC,wBA5DiB,CA6DnB,mFACC,wBA7Da,CAmEd,4EACC,gBAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n$color_bg_hover: darken($color_bg_panel_params, 20%)\\n$color_bg_expression: #15803D // green-700 //lighten(mix($color_bg, lightgreen, 50%), 20%)\\n$color_bg_error: #B91C1C // red-700   //lighten($alert-color,5%)\\n\\n.ParamContainer\\n\\tpadding: 1px 0px\\n\\t// overflow: hidden\\n\\tposition: relative\\n\\t// z-index: 0\\n\\n\\t// .param_menu_container\\n\\t// \\tposition: relative\\n\\t// \\theight: 1px\\n\\t// \\twidth: 100%\\n\\t// \\tbackground-color: red\\n\\n\\t.ParamSeparator\\n\\t\\t.horizontal-border\\n\\t\\t\\theight: 2px\\n\\t\\t\\t// background-color: darken($color_bg_panel_params, 10%)\\n\\t\\t\\tmargin: 10px\\n\\n\\t&.is_not_default\\n\\t\\tlabel\\n\\t\\t\\tfont-weight: bold\\n\\n\\t.param_name\\n\\t\\tposition: relative\\n\\t\\tz-index: 1\\n\\t\\tlabel\\n\\t\\t\\tfont-size: 0.8rem\\n\\t\\t\\tcolor: $color_font\\n\\t\\t\\tcursor: pointer\\n\\t\\t\\tmargin: 5px\\n\\t\\t\\tpadding: 0rem 10px\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\tbackground-color: $color_bg_hover\\n\\t.param_fields\\n\\t\\t&.no_labels_on_any_param\\n\\t\\t\\tmargin-left: 10px\\n\\n\\t.Field\\n\\t\\tposition: relative\\n\\t\\tz-index: 2\\n\\t\\tinput.raw_input\\n\\t\\t\\tdisplay: block\\n\\t\\tinput.expression_result\\n\\t\\t\\tdisplay: none\\n\\t\\t&.displays_expression_result\\n\\t\\t\\tinput.raw_input\\n\\t\\t\\t\\tdisplay: none\\n\\t\\t\\tinput.expression_result\\n\\t\\t\\t\\tdisplay: block\\n\\n\\t\\tinput, textarea\\n\\t\\t\\tmargin: 0px\\n\\t\\t\\tpadding: 0.2rem\\n\\t\\t\\t// font-size: 0.8rem\\n\\t\\t\\t// height: 2rem\\n\\t\\t\\t&.has_expression\\n\\t\\t\\t\\t&:not(.is_errored)\\n\\t\\t\\t\\t\\tbackground-color: $color_bg_expression\\n\\t\\t\\t&.is_errored\\n\\t\\t\\t\\tbackground-color: $color_bg_error\\n\\n\\n\\n\\t.Field.Multiple.grid-x\\n\\t\\t.cell\\n\\t\\t\\t.Field.Numeric:not:first-child\\n\\t\\t\\t\\tpadding-left: 2px\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.Boolean input.raw_input{display:block}.Field.Boolean input.expression_result{display:none}.Field.Boolean.displays_expression_result input.raw_input{display:none}.Field.Boolean.displays_expression_result input.expression_result{display:block}.Field.Boolean input{margin:0px}.Field.Boolean input.has_expression{background-color:#8fbe8f}.Field.Boolean input[type=checkbox]{cursor:pointer;-ms-transform:scale(1.4);-moz-transform:scale(1.4);-webkit-transform:scale(1.4);-o-transform:scale(1.4);transform:scale(1.4);margin-right:5px;position:relative;max-height:16px;top:3px}.Field.Boolean label{padding:5px;cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/Boolean.vue\"],\"names\":[],\"mappings\":\"AAIC,+BACC,aAAA,CACD,uCACC,YAAA,CAEA,0DACC,YAAA,CACD,kEACC,aAAA,CAEF,qBACC,UAAA,CACA,oCACC,wBAAA,CAEF,oCAGC,cAAA,CACA,wBAAA,CACA,yBAAA,CACA,4BAAA,CACA,uBAAA,CACA,oBAAA,CAEA,gBAAA,CACA,iBAAA,CAEA,eAAA,CACA,OAAA,CAED,qBACC,WAAA,CACA,cAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n.Field.Boolean\\n\\tinput.raw_input\\n\\t\\tdisplay: block\\n\\tinput.expression_result\\n\\t\\tdisplay: none\\n\\t&.displays_expression_result\\n\\t\\tinput.raw_input\\n\\t\\t\\tdisplay: none\\n\\t\\tinput.expression_result\\n\\t\\t\\tdisplay: block\\n\\n\\tinput\\n\\t\\tmargin: 0px\\n\\t\\t&.has_expression\\n\\t\\t\\tbackground-color: mix($color_bg, lightgreen, 50%)\\n\\n\\tinput[type=checkbox]\\n\\t\\t// margin-top: 13px\\n\\t\\t$checkbox_scale: 1.4\\n\\t\\tcursor: pointer\\n\\t\\t-ms-transform: scale($checkbox_scale) /* IE */\\n\\t\\t-moz-transform: scale($checkbox_scale) /* FF */\\n\\t\\t-webkit-transform: scale($checkbox_scale) /* Safari and Chrome */\\n\\t\\t-o-transform: scale($checkbox_scale) /* Opera */\\n\\t\\ttransform: scale($checkbox_scale)\\n\\t\\t// padding: 10px;\\n\\t\\tmargin-right: 5px\\n\\t\\tposition: relative\\n\\t\\t// adjustments to prevent pushing the param just under\\n\\t\\tmax-height: 16px\\n\\t\\ttop: 3px\\n\\n\\tlabel\\n\\t\\tpadding: 5px\\n\\t\\tcursor: pointer\\n\\n\\t// .switch\\n\\t// \\tmargin-bottom: 0px\\n\\t// \\tpadding:\\n\\t// \\t\\t// top: 3px\\n\\t// \\t\\tright: 5px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.Button.joinToPreviousParam{display:inline-block}.Field.Button button.button{position:relative;top:0px}.Field.Button button.button:active{top:2px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/Button.vue\"],\"names\":[],\"mappings\":\"AAGC,kCACC,oBAAA,CACD,4BACC,iBAAA,CACA,OAAA,CACA,mCAEC,OAAA\",\"sourcesContent\":[\"\\n\\n.Field.Button\\n\\t&.joinToPreviousParam\\n\\t\\tdisplay: inline-block\\n\\tbutton.button\\n\\t\\tposition: relative\\n\\t\\ttop: 0px\\n\\t\\t&:active\\n\\t\\t\\t// background-color: red\\n\\t\\t\\ttop: 2px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.Color input[type=color]{width:30px;border:none;padding:0px;margin:0px;-webkit-appearance:none;margin-right:5px}.Field.Color input[type=color]::-webkit-color-swatch-wrapper{padding:0px}.Field.Color input[type=color]::-webkit-color-swatch{border:none}.Field.Color select.convert_actions{max-width:120px;width:120px;margin-left:5px;padding:.4rem;height:auto;background-color:#d6ecf3}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/Color.vue\"],\"names\":[],\"mappings\":\"AAQC,+BACC,UAAA,CAEA,WAAA,CACA,WAAA,CACA,UAAA,CACA,uBAAA,CACA,gBAAA,CACD,6DACC,WAAA,CACD,qDACC,WAAA,CACD,oCACC,eAAA,CACA,WAAA,CACA,eAAA,CACA,aAAA,CACA,WAAA,CACA,wBAAA\",\"sourcesContent\":[\"\\n.Field.Color\\n\\t// .param-color-bg\\n\\t// \\tcursor: pointer\\n\\t// \\twidth: 30px\\n\\t// \\theight: 100%\\n\\t// \\tpadding: 0px\\n\\t// \\tmargin-right: 5px\\n\\tinput[type=color]\\n\\t\\twidth: 30px\\n\\t\\t// height: 100%\\n\\t\\tborder: none\\n\\t\\tpadding: 0px\\n\\t\\tmargin: 0px\\n\\t\\t-webkit-appearance: none\\n\\t\\tmargin-right: 5px\\n\\tinput[type=\\\"color\\\"]::-webkit-color-swatch-wrapper\\n\\t\\tpadding: 0px\\n\\tinput[type=\\\"color\\\"]::-webkit-color-swatch\\n\\t\\tborder: none\\n\\tselect.convert_actions\\n\\t\\tmax-width: 120px\\n\\t\\twidth: 120px\\n\\t\\tmargin-left: 5px\\n\\t\\tpadding: 0.4rem\\n\\t\\theight: auto\\n\\t\\tbackground-color: mix(white, lightblue, 50%)\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"data:image/svg+xml;utf8,<svg xmlns=%27http://www.w3.org/2000/svg%27 version=%271.1%27 width=%2732%27 height=%2724%27 viewBox=%270 0 32 24%27><polygon points=%270,0 32,0 16,24%27 style=%27fill: rgb%28138, 138, 138%29%27></polygon></svg>\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.Radio select.select{margin-bottom:0;background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \");background-origin:content-box;background-position:right 0rem center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/Radio.vue\"],\"names\":[],\"mappings\":\"AAGC,2BACC,eAAA,CACA,wDAAA,CACA,6BAAA,CACA,qCAAA\",\"sourcesContent\":[\"\\n.Field.Radio\\n\\n\\tselect.select\\n\\t\\tmargin-bottom: 0\\n\\t\\tbackground-image: url(\\\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28138, 138, 138%29'></polygon></svg>\\\")\\n\\t\\tbackground-origin: content-box\\n\\t\\tbackground-position: right 0rem center\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.Ramp .points_container svg{display:block;width:100%}.Field.Ramp .points_container svg.large{height:320px}.Field.Ramp .points_container svg.small{height:160px}.Field.Ramp .points_container svg circle.control_point{r:5;stroke:#fff;stroke-width:1;fill:gray;cursor:pointer}.Field.Ramp .points_container svg circle.control_point:hover,.Field.Ramp .points_container svg circle.control_point.dragged{stroke-width:2;fill:#d3d3d3}.Field.Ramp .points_container svg circle.interpolated_curve_point{r:2;fill:#fff}.Field.Ramp .points_container svg circle.interpolated_curve_point.point_about_to_be_removed{fill:red}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/Ramp.vue\"],\"names\":[],\"mappings\":\"AAKE,kCACC,aAAA,CACA,UAAA,CACA,wCACC,YAAA,CACD,wCACC,YAAA,CACD,uDACC,GAAA,CACA,WAAA,CACA,cAAA,CACA,SAAA,CACA,cAAA,CACA,4HACC,cAAA,CACA,YAAA,CACF,kEACC,GAAA,CACA,SAAA,CACA,4FACC,QAAA\",\"sourcesContent\":[\"\\n\\n.Field.Ramp\\n\\t.points_container\\n\\t\\t// background-color: white\\n\\t\\tsvg\\n\\t\\t\\tdisplay: block // to remove space under it\\n\\t\\t\\twidth: 100%\\n\\t\\t\\t&.large\\n\\t\\t\\t\\theight: 320px\\n\\t\\t\\t&.small\\n\\t\\t\\t\\theight: 160px\\n\\t\\t\\tcircle.control_point\\n\\t\\t\\t\\tr: 5\\n\\t\\t\\t\\tstroke: white\\n\\t\\t\\t\\tstroke-width: 1\\n\\t\\t\\t\\tfill: grey\\n\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\t&:hover, &.dragged\\n\\t\\t\\t\\t\\tstroke-width: 2\\n\\t\\t\\t\\t\\tfill: lightgrey\\n\\t\\t\\tcircle.interpolated_curve_point\\n\\t\\t\\t\\tr: 2\\n\\t\\t\\t\\tfill: white\\n\\t\\t\\t\\t&.point_about_to_be_removed\\n\\t\\t\\t\\t\\tfill: red\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.Separator .horizontal-border{height:2px;background-color:#a9a9a9;margin:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/Separator.vue\"],\"names\":[],\"mappings\":\"AAGC,oCACC,UAAA,CACA,wBAAA,CACA,WAAA\",\"sourcesContent\":[\"\\n\\n.Field.Separator\\n\\t.horizontal-border\\n\\t\\theight: 2px\\n\\t\\tbackground-color: darkgray\\n\\t\\tmargin: 10px\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Field.String input.raw_input,.Field.String textarea.raw_input{display:block}.Field.String input.expression_result,.Field.String textarea.expression_result{display:none}.Field.String.displays_expression_result input.raw_input,.Field.String.displays_expression_result textarea.raw_input{display:none}.Field.String.displays_expression_result input.expression_result,.Field.String.displays_expression_result textarea.expression_result{display:block}.Field.String input,.Field.String textarea{margin:0px}.Field.String.displays_expression_only input,.Field.String.displays_expression_only textarea{border:0;background-color:rgba(0,0,0,0);box-shadow:none}.Field.String .browse_button,.Field.String .displaySceneTreeButton{margin-left:4px;top:1px;padding:1em 1em}.Field.String .button-group-displaySceneTreeButton{position:relative;top:1px;margin-right:0px}.Field.String .button-group-displaySceneTreeButton .button{margin-left:4px;margin-bottom:0px;line-height:0;padding:.7em 1em}.Field.String .drag_n_drop_zone{border:4px dotted rgba(0,0,0,0)}.Field.String .drag_n_drop_zone.dragInProgress{border:4px dotted purple}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/params/components/fields/String.vue\"],\"names\":[],\"mappings\":\"AAIE,+DACC,aAAA,CAED,+EACC,YAAA,CAGA,qHACC,YAAA,CAED,qIACC,aAAA,CAEH,2CACC,UAAA,CAIA,6FACC,QAAA,CACA,8BAAA,CACA,eAAA,CAEF,mEACC,eAAA,CACA,OAAA,CACA,eAAA,CACD,mDACC,iBAAA,CACA,OAAA,CACA,gBAAA,CACA,2DACC,eAAA,CACA,iBAAA,CACA,aAAA,CACA,gBAAA,CAEF,gCACC,+BAAA,CACA,+CACC,wBAAA\",\"sourcesContent\":[\"\\n\\n.Field.String\\n\\tinput, textarea\\n\\t\\t&.raw_input\\n\\t\\t\\tdisplay: block\\n\\tinput, textarea\\n\\t\\t&.expression_result\\n\\t\\t\\tdisplay: none\\n\\t&.displays_expression_result\\n\\t\\tinput, textarea\\n\\t\\t\\t&.raw_input\\n\\t\\t\\t\\tdisplay: none\\n\\t\\tinput, textarea\\n\\t\\t\\t&.expression_result\\n\\t\\t\\t\\tdisplay: block\\n\\n\\tinput, textarea\\n\\t\\tmargin: 0px\\n\\n\\n\\t&.displays_expression_only\\n\\t\\tinput, textarea\\n\\t\\t\\tborder: 0\\n\\t\\t\\tbackground-color: transparent\\n\\t\\t\\tbox-shadow: none\\n\\n\\t.browse_button, .displaySceneTreeButton\\n\\t\\tmargin-left: 4px\\n\\t\\ttop: 1px\\n\\t\\tpadding: 1em 1em\\n\\t.button-group-displaySceneTreeButton\\n\\t\\tposition: relative\\n\\t\\ttop: 1px\\n\\t\\tmargin-right: 0px\\n\\t\\t.button\\n\\t\\t\\tmargin-left: 4px\\n\\t\\t\\tmargin-bottom: 0px\\n\\t\\t\\tline-height: 0\\n\\t\\t\\tpadding: 0.7em 1em\\n\\n\\t.drag_n_drop_zone\\n\\t\\tborder: 4px dotted transparent\\n\\t\\t&.dragInProgress\\n\\t\\t\\tborder: 4px dotted purple\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Panel.Viewer canvas,.Panel.Viewer #mapbox_container{width:100%;height:100%}.Panel.Viewer .no-overflow{overflow:hidden;position:relative}.Panel.Viewer .viewer_top_bar .viewer_top_bar-controls-right{padding-right:10px}.Panel.Viewer .viewer_top_bar input{margin-bottom:0px;padding:0px}.Panel.Viewer .viewer_top_bar input[type=color]{width:20px;height:20px}.Panel.Viewer .viewer_top_bar .color-bg-input-container{margin-top:4px}.Panel.Viewer .viewers_container{position:relative;overflow:hidden;background-image:linear-gradient(to bottom, #7a7a9f, #bec7c7)}.Panel.Viewer .viewers_container .panel_container{position:absolute;min-width:360px;top:0px;left:0px;padding:10px 10px;opacity:.85}.Panel.Viewer .viewers_container .panel_container:hover{opacity:1}.Panel.Viewer .viewers_container canvas{cursor:auto}.Panel.Viewer .viewers_container canvas.active{cursor:pointer}.Panel.Viewer .viewer-control-button{position:relative;cursor:pointer;opacity:.7}.Panel.Viewer .viewer-control-button svg{display:block;position:relative;top:50%;transform:translateY(-50%)}.Panel.Viewer .viewer-control-button svg.alert{color:red}.Panel.Viewer .viewer-control-button.active{opacity:.9}.Panel.Viewer .viewer-control-button:hover{opacity:1}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/panels/viewer/Viewer.vue\"],\"names\":[],\"mappings\":\"AAKC,qDACC,UAAA,CACA,WAAA,CAED,2BAEC,eAAA,CAEA,iBAAA,CAWA,6DACC,kBAAA,CAOD,oCACC,iBAAA,CACA,WAAA,CACD,gDACC,UAAA,CACA,WAAA,CACD,wDACC,cAAA,CAEF,iCACC,iBAAA,CAEA,eAAA,CAEA,6DAAA,CACA,kDACC,iBAAA,CACA,eAAA,CAEA,OAAA,CACA,QAAA,CACA,iBAAA,CAKA,WAAA,CACA,wDACC,SAAA,CAEF,wCACC,WAAA,CACA,+CACC,cAAA,CAyBH,qCAGC,iBAAA,CACA,cAAA,CAEA,UAAA,CACA,yCACC,aAAA,CACA,iBAAA,CACA,OAAA,CACA,0BAAA,CACA,+CACC,SAAA,CACF,4CACC,UAAA,CACD,2CACC,SAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n.Panel.Viewer\\n\\n\\tcanvas, #mapbox_container\\n\\t\\twidth: 100%\\n\\t\\theight: 100%\\n\\n\\t.no-overflow\\n\\t\\t// needed in case the imported html leaks out of the element\\n\\t\\toverflow: hidden\\n\\t\\t// and since that still does not contain elements with position: absolute\\n\\t\\tposition: relative\\n\\n\\t// this may be needed, but for now\\n\\t// the css renderer does not appear to be sized correctly\\n\\t// on load, so let's not hide the bounds\\n\\t// .polygonjs-CSS2DRenderer\\n\\t// \\toverflow: hidden\\n\\n\\t.viewer_top_bar\\n\\t\\t// background-color: lighten($color_bg_panel_viewer,5%)\\n\\n\\t\\t.viewer_top_bar-controls-right\\n\\t\\t\\tpadding-right: 10px\\n\\t\\t// .viewer-control\\n\\t\\t// \\tcursor: pointer\\n\\t\\t// \\tmargin-right: 10px\\n\\t\\t// \\tpadding: 5px 10px // same as dropdown menu\\n\\t\\t// \\t&:hover\\n\\t\\t// \\t\\topacity: 0.8\\n\\t\\tinput\\n\\t\\t\\tmargin-bottom: 0px\\n\\t\\t\\tpadding: 0px\\n\\t\\tinput[type=color]\\n\\t\\t\\twidth: 20px\\n\\t\\t\\theight: 20px\\n\\t\\t.color-bg-input-container\\n\\t\\t\\tmargin-top: 4px\\n\\n\\t.viewers_container\\n\\t\\tposition: relative\\n\\t\\t// width: 40%\\n\\t\\toverflow: hidden // to hide css objects when using css renderer\\n\\t\\t// background-color: white\\n\\t\\tbackground-image: linear-gradient(to bottom, darken($color_bg_panel_viewer,10%), #bec7c7)\\n\\t\\t.panel_container\\n\\t\\t\\tposition: absolute\\n\\t\\t\\tmin-width: 360px\\n\\t\\t\\t// width: 100%\\n\\t\\t\\ttop: 0px\\n\\t\\t\\tleft: 0px\\n\\t\\t\\tpadding: 10px 10px\\n\\n\\t\\t\\t// label\\n\\t\\t\\t// \\tcolor: white\\n\\n\\t\\t\\topacity: 0.85\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\topacity: 1\\n\\n\\t\\tcanvas\\n\\t\\t\\tcursor: auto\\n\\t\\t\\t&.active\\n\\t\\t\\t\\tcursor: pointer\\n\\n\\t\\t// .event_screen_positions\\n\\t\\t// \\tposition: absolute\\n\\t\\t// \\tpointer-events: none\\n\\t\\t// \\ttop: 0\\n\\t\\t// \\tleft: 0\\n\\t\\t// \\twidth: 100%\\n\\t\\t// \\theight: 100%\\n\\t\\t// \\t.event_screen_position\\n\\t\\t// \\t\\tposition: absolute\\n\\t\\t// \\t\\twidth: 5px\\n\\t\\t// \\t\\theight: 5px\\n\\t\\t// \\t\\t// background-color: red\\n\\t\\t// \\t\\tborder: 1px solid black\\n\\t\\t// \\t\\tborder-radius: 5px\\n\\n\\t\\t// \\t\\t.event-screen-position-label\\n\\t\\t// \\t\\t\\tposition: absolute\\n\\t\\t// \\t\\t\\tleft: 10px\\n\\t\\t// \\t\\t\\tline-height: 1\\n\\t\\t// \\t\\t\\twidth: auto\\n\\t\\t// \\t\\t\\tbackground-color: white\\n\\t\\t// \\t\\t\\tcolor: black\\n\\n\\t.viewer-control-button\\n\\t\\t// margin-right: 10px\\n\\t\\t// height: 100%\\n\\t\\tposition: relative\\n\\t\\tcursor: pointer\\n\\t\\t// line-height: 0\\n\\t\\topacity: 0.7\\n\\t\\tsvg\\n\\t\\t\\tdisplay: block\\n\\t\\t\\tposition: relative\\n\\t\\t\\ttop: 50%\\n\\t\\t\\ttransform: translateY(-50%)\\n\\t\\t\\t&.alert\\n\\t\\t\\t\\tcolor: red\\n\\t\\t&.active\\n\\t\\t\\topacity: 0.9\\n\\t\\t&:hover\\n\\t\\t\\topacity: 1\\n\\n\\t\\t// &.viewer-resolution\\n\\t\\t// \\tfont-size: 0.75rem\\n\\t\\t// \\ttop: 50%\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dropdown_menu,.dropdown_menu_label,.dropdown_menu_label_content{display:inline-block}.dropdown_menu.on_hover:hover>.dropdown_menu_label>.dropdown_menu_pixel:not(.always_visible){display:block}.dropdown_menu .dropdown_menu_label_content_container{position:relative}.dropdown_menu li{display:block}.dropdown_menu .dropdown_menu_label{position:relative;cursor:pointer}.dropdown_menu .dropdown_menu_label .dropdown_menu_label_content:hover{opacity:.8}.dropdown_menu .dropdown_menu_label .dropdown_menu_pixel:not(.always_visible){display:none}.dropdown_menu .dropdown_menu_label .dropdown_menu_pixel.always_visible{display:block}.dropdown_menu .dropdown_menu_pixel{z-index:99999;position:absolute;height:0px}.dropdown_menu .dropdown_menu_pixel.bottom_left:not(.right_aligned){bottom:0px;left:0px}.dropdown_menu .dropdown_menu_pixel.top_right{top:0px;left:100%}.dropdown_menu .dropdown_menu_pixel.right_aligned{bottom:0px;left:100%}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content{position:absolute;overflow-x:hidden}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content.right_aligned{position:relative;right:100%}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content .dropdown_menu,.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content .dropdown_menu_label{display:block}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content ul{list-style-type:none;margin:0px}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content ul li .entry{white-space:nowrap;padding-right:20px;position:relative}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content ul li .entry .dropdown_menu_label{top:-5px}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content ul li .entry.disabled{cursor:default}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content ul li .entry.active{cursor:pointer}.dropdown_menu .dropdown_menu_pixel .dropdown_menu_content ul li .entry .children-arrow{position:absolute;top:5px;right:5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/widgets/DropDownMenu.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAKA,iEACC,oBAAA,CAQE,6FACC,aAAA,CAEH,sDAMC,iBAAA,CAED,kBACC,aAAA,CACD,oCACC,iBAAA,CACA,cAAA,CAOC,uEACC,UAAA,CAGD,8EACC,YAAA,CACD,wEACC,aAAA,CAEH,oCACC,aC+SsB,CD9StB,iBAAA,CACA,UAAA,CAKA,oEACC,UAAA,CACA,QAAA,CACD,8CACC,OAAA,CAEA,SAAA,CACD,kDACC,UAAA,CAEA,SAAA,CACD,2DACC,iBAAA,CAIA,iBAAA,CAGA,yEACC,iBAAA,CACA,UAAA,CACD,0JACC,aAAA,CACD,8DACC,oBAAA,CACA,UAAA,CAEC,wEAEC,kBAAA,CACA,kBAAA,CACA,iBAAA,CACA,6FACC,QAAA,CACD,iFACC,cAAA,CAED,+EACC,cAAA,CAWD,wFACC,iBAAA,CACA,OAAA,CACA,SAAA\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n// $menu_content_bg_color: #eee\\n\\n.dropdown_menu, .dropdown_menu_label, .dropdown_menu_label_content\\n\\tdisplay: inline-block\\n\\n.dropdown_menu\\n\\t&:hover\\n\\t\\t.dropdown_menu_label\\n\\t\\t\\t// background-color: $menu_content_bg_color\\n\\t&.on_hover\\n\\t\\t&:hover > .dropdown_menu_label > .dropdown_menu_pixel\\n\\t\\t\\t&:not(.always_visible)\\n\\t\\t\\t\\tdisplay: block\\n\\n\\t.dropdown_menu_label_content_container\\n\\t\\t// this element has position relative\\n\\t\\t// which isnt terribly useful by itself\\n\\t\\t// but when built in prod,\\n\\t\\t// the dropdown can be positioned incorrectly if not.\\n\\t\\t// the bug was seen with the dropdowns in the navigation bar\\n\\t\\tposition: relative\\n\\n\\tli\\n\\t\\tdisplay: block\\n\\t.dropdown_menu_label\\n\\t\\tposition: relative\\n\\t\\tcursor: pointer\\n\\n\\t\\t// &.default_label_padding\\n\\t\\t// \\tpadding: 5px 10px\\n\\n\\t\\t.dropdown_menu_label_content\\n\\n\\t\\t\\t&:hover\\n\\t\\t\\t\\topacity: 0.8\\n\\t\\t// display: inline-block\\n\\t\\t.dropdown_menu_pixel\\n\\t\\t\\t&:not(.always_visible)\\n\\t\\t\\t\\tdisplay: none\\n\\t\\t\\t&.always_visible\\n\\t\\t\\t\\tdisplay: block\\n\\n\\t.dropdown_menu_pixel\\n\\t\\tz-index: $z_index_dropdown_menu\\n\\t\\tposition: absolute\\n\\t\\theight: 0px\\n\\t\\t// make sure the width remains commented,\\n\\t\\t// as if it is present, it will prevent the split panel dropdown from being visible\\n\\t\\t// width: 0px\\n\\t\\t// background-color: red\\n\\t\\t&.bottom_left:not(.right_aligned)\\n\\t\\t\\tbottom: 0px\\n\\t\\t\\tleft: 0px\\n\\t\\t&.top_right\\n\\t\\t\\ttop: 0px\\n\\t\\t\\t// right: 0px\\n\\t\\t\\tleft: 100%\\n\\t\\t&.right_aligned\\n\\t\\t\\tbottom: 0px\\n\\t\\t\\t// right: 0px\\n\\t\\t\\tleft: 100%\\n\\t\\t.dropdown_menu_content\\n\\t\\t\\tposition: absolute\\n\\t\\t\\t// border: 1px solid $color_bg\\n\\t\\t\\t// background-color: $color_bg_dropdown_menu\\n\\t\\t\\t// border-radius: 5px\\n\\t\\t\\toverflow-x: hidden\\n\\t\\t\\t// box-shadow: 10px 10px 30px 15px gray\\n\\t\\t\\t// width: 200px\\n\\t\\t\\t&.right_aligned\\n\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\tright: 100%\\n\\t\\t\\t.dropdown_menu, .dropdown_menu_label\\n\\t\\t\\t\\tdisplay: block\\n\\t\\t\\tul\\n\\t\\t\\t\\tlist-style-type: none\\n\\t\\t\\t\\tmargin: 0px\\n\\t\\t\\t\\tli\\n\\t\\t\\t\\t\\t.entry\\n\\t\\t\\t\\t\\t\\t// padding: 5px 10px\\n\\t\\t\\t\\t\\t\\twhite-space: nowrap\\n\\t\\t\\t\\t\\t\\tpadding-right: 20px\\n\\t\\t\\t\\t\\t\\tposition: relative\\n\\t\\t\\t\\t\\t\\t.dropdown_menu_label\\n\\t\\t\\t\\t\\t\\t\\ttop: -5px\\n\\t\\t\\t\\t\\t\\t&.disabled\\n\\t\\t\\t\\t\\t\\t\\tcursor: default\\n\\t\\t\\t\\t\\t\\t\\t// color: mix($color_bg_dropdown_menu, $color_font, 70%)\\n\\t\\t\\t\\t\\t\\t&.active\\n\\t\\t\\t\\t\\t\\t\\tcursor: pointer\\n\\t\\t\\t\\t\\t\\t\\t&:hover\\n\\t\\t\\t\\t\\t\\t\\t\\t// background-color: darken($color_bg_dropdown_menu, 5%)\\n\\t\\t\\t\\t\\t\\t&.hovered\\n\\t\\t\\t\\t\\t\\t\\t// background-color: darken($color_bg_dropdown_menu, 10%)\\n\\n\\n\\t\\t\\t\\t\\t\\t.emphasis\\n\\t\\t\\t\\t\\t\\t\\t// color: $alert-color\\n\\t\\t\\t\\t\\t\\t\\t// font-weight: bold\\n\\t\\t\\t\\t\\t\\t\\t// border-bottom: 2px solid $alert-color\\n\\t\\t\\t\\t\\t\\t.children-arrow\\n\\t\\t\\t\\t\\t\\t\\tposition: absolute\\n\\t\\t\\t\\t\\t\\t\\ttop: 5px\\n\\t\\t\\t\\t\\t\\t\\tright: 5px\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".NodeTree .expand_button{cursor:pointer;padding:0px 5px}.NodeTree .expand_button:hover{opacity:.8}.NodeTree .node_name{cursor:pointer;padding:0px 5px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/widgets/NodeTree.vue\"],\"names\":[],\"mappings\":\"AAQC,yBACC,cAAA,CACA,eAAA,CACA,+BACC,UAAA,CACF,qBACC,cAAA,CACA,eAAA\",\"sourcesContent\":[\"\\n\\n\\n.NodeTree\\n\\n\\t&.selected\\n\\t\\t.node_name\\n\\t\\t\\t// background-color: $color_selected\\n\\t.expand_button\\n\\t\\tcursor: pointer\\n\\t\\tpadding: 0px 5px\\n\\t\\t&:hover\\n\\t\\t\\topacity: 0.8\\n\\t.node_name\\n\\t\\tcursor: pointer\\n\\t\\tpadding: 0px 5px\\n\\t\\t&:hover\\n\\t\\t\\t// background-color: $color_hover\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".Polygon-Modal-Container-Non-Resizable{z-index:9999}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../src/editor/components/widgets/dialogs/Modal.vue\",\"webpack://./../src/editor/sass/globals.sass\"],\"names\":[],\"mappings\":\"AAKA,uCACC,YCyVe\",\"sourcesContent\":[\"\\n@import \\\"globals.sass\\\"\\n\\n$box_shadow: 13px 10px 36px -6px black\\n\\n.Polygon-Modal-Container-Non-Resizable\\n\\tz-index: $z_index_modal\\n\\n// .Polygon-Modal-Container\\n// \\tposition: relative\\n// \\twidth: 0px\\n// \\theight: 0px\\n// \\ttop: 0px\\n// \\tleft: 0px\\n// \\tz-index: $z_index_modal\\n// \\t.Polygon-Modal-Overlay\\n// \\t\\tposition: static\\n// \\t\\twidth: 5000px\\n// \\t\\theight: 5000px\\n// \\t\\ttop: 0px\\n// \\t\\tleft: 0px\\n// \\t\\tbackground-color: black\\n// \\t\\topacity: 0.5\\n// \\t.Polygon-Modal\\n// \\t\\tposition: absolute\\n// \\t\\tz-index: $z_index_modal\\n// \\t\\tborder-radius: 5px\\n// \\t\\tborder: 2px solid gray\\n// \\t\\t// box-shadow: 5px 5px 5px lighten(black, 45%)\\n// \\t\\t-webkit-box-shadow: $box_shadow\\n// \\t\\t-moz-box-shadow: $box_shadow\\n// \\t\\tbox-shadow: $box_shadow\\n// \\t\\t// background-color: $color_bg_modal\\n// \\t\\t.modal-grid\\n// \\t\\t\\theight: 100%\\n// \\t\\t\\t.Modal-title\\n// \\t\\t\\t\\tfont-weight: bold\\n// \\t\\t\\t\\tcursor: pointer\\n// \\t\\t\\t\\tpadding: 5px\\n// \\t\\t\\t\\tborder-bottom: 1px solid grey\\n// \\t\\t\\t.title-close-button\\n// \\t\\t\\t\\tposition: absolute\\n// \\t\\t\\t\\ttop: 4px\\n// \\t\\t\\t\\tright: 4px\\n// \\t\\t\\t\\tcursor: pointer\\n// \\t\\t\\t.Modal-body\\n// \\t\\t\\t\\toverflow-y: auto\\n\\n// \\t\\t\\t.Modal-size-handle\\n// \\t\\t\\t\\theight: 10px\\n// \\t\\t\\t\\tbackground-color: green\\n// \\t\\t\\t\\tcursor: se-resize\\n\",\"\\n\\n// PALETTE\\n// from: https://palettte.app/\\n// ----------\\n// \\t[\\n//   {\\n//     \\\"paletteName\\\": \\\"New Palette\\\",\\n//     \\\"swatches\\\": [\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397A3\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"B397B2\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"A798B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9898B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98A7B5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B5B4\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"98B6A5\\\"\\n//       },\\n//       {\\n//         \\\"name\\\": \\\"New Swatch\\\",\\n//         \\\"color\\\": \\\"9BB698\\\"\\n//       }\\n//     ]\\n//   }\\n// ]\\n// ---------- \\n// :root {\\n//   --New-Swatch: #B397A3\\n//   --New-Swatch: #B397B2\\n//   --New-Swatch: #A798B4\\n//   --New-Swatch: #9898B4\\n//   --New-Swatch: #98A7B5\\n//   --New-Swatch: #98B5B4\\n//   --New-Swatch: #98B6A5\\n//   --New-Swatch: #9BB698\\n// }\\n\\t\\n$color_01: #B397A3\\n$color_02: #B397B2\\n$color_03: #A798B4\\n$color_04: #9898B4\\n$color_05: #98A7B5\\n$color_06: #98B5B4\\n$color_07: #98B6A5\\n$color_08: #9BB698\\n\\n// tailwind\\n// https://gist.github.com/minutiae/3983bb128ad1756ae67ca1bccc184d4c\\n$blueGray-50: hsl(210.0, 40.0%, 98.04%)\\n$blueGray-100: hsl(210.0, 40.0%, 96.08%)\\n$blueGray-200: hsl(214.29, 31.82%, 91.37%)\\n$blueGray-300: hsl(212.73, 26.83%, 83.92%)\\n$blueGray-400: hsl(215.0, 20.22%, 65.1%)\\n$blueGray-500: hsl(215.38, 16.32%, 46.86%)\\n$blueGray-600: hsl(215.29, 19.32%, 34.51%)\\n$blueGray-700: hsl(215.29, 25.0%, 26.67%)\\n$blueGray-800: hsl(217.24, 32.58%, 17.45%)\\n$blueGray-900: hsl(222.22, 47.37%, 11.18%)\\n\\n$coolGray-50: hsl(210.0, 20.0%, 98.04%)\\n$coolGray-100: hsl(220.0, 14.29%, 95.88%)\\n$coolGray-200: hsl(220.0, 13.04%, 90.98%)\\n$coolGray-300: hsl(216.0, 12.2%, 83.92%)\\n$coolGray-400: hsl(217.89, 10.61%, 64.9%)\\n$coolGray-500: hsl(220.0, 8.94%, 46.08%)\\n$coolGray-600: hsl(215.0, 13.79%, 34.12%)\\n$coolGray-700: hsl(216.92, 19.12%, 26.67%)\\n$coolGray-800: hsl(215.0, 27.91%, 16.86%)\\n$coolGray-900: hsl(220.91, 39.29%, 10.98%)\\n\\n$gray-50: hsl(0.0, 0.0%, 98.04%)\\n$gray-100: hsl(240.0, 4.76%, 95.88%)\\n$gray-200: hsl(240.0, 5.88%, 90.0%)\\n$gray-300: hsl(240.0, 4.88%, 83.92%)\\n$gray-400: hsl(240.0, 5.03%, 64.9%)\\n$gray-500: hsl(240.0, 3.83%, 46.08%)\\n$gray-600: hsl(240.0, 5.2%, 33.92%)\\n$gray-700: hsl(240.0, 5.26%, 26.08%)\\n$gray-800: hsl(240.0, 3.7%, 15.88%)\\n$gray-900: hsl(240.0, 5.88%, 10.0%)\\n\\n$trueGray-50: hsl(0.0, 0.0%, 98.04%)\\n$trueGray-100: hsl(0.0, 0.0%, 96.08%)\\n$trueGray-200: hsl(0.0, 0.0%, 89.8%)\\n$trueGray-300: hsl(0.0, 0.0%, 83.14%)\\n$trueGray-400: hsl(0.0, 0.0%, 63.92%)\\n$trueGray-500: hsl(0.0, 0.0%, 45.1%)\\n$trueGray-600: hsl(0.0, 0.0%, 32.16%)\\n$trueGray-700: hsl(0.0, 0.0%, 25.1%)\\n$trueGray-800: hsl(0.0, 0.0%, 14.9%)\\n$trueGray-900: hsl(0.0, 0.0%, 9.02%)\\n\\n$warmGray-50: hsl(60.0, 9.09%, 97.84%)\\n$warmGray-100: hsl(60.0, 4.76%, 95.88%)\\n$warmGray-200: hsl(20.0, 5.88%, 90.0%)\\n$warmGray-300: hsl(24.0, 5.75%, 82.94%)\\n$warmGray-400: hsl(24.0, 5.43%, 63.92%)\\n$warmGray-500: hsl(25.0, 5.26%, 44.71%)\\n$warmGray-600: hsl(33.33, 5.45%, 32.35%)\\n$warmGray-700: hsl(30.0, 6.25%, 25.1%)\\n$warmGray-800: hsl(12.0, 6.49%, 15.1%)\\n$warmGray-900: hsl(24.0, 9.8%, 10.0%)\\n\\n$red-50: hsl(0.0, 85.71%, 97.25%)\\n$red-100: hsl(0.0, 93.33%, 94.12%)\\n$red-200: hsl(0.0, 96.3%, 89.41%)\\n$red-300: hsl(0.0, 93.55%, 81.76%)\\n$red-400: hsl(0.0, 90.6%, 70.78%)\\n$red-500: hsl(0.0, 84.24%, 60.2%)\\n$red-600: hsl(0.0, 72.22%, 50.59%)\\n$red-700: hsl(0.0, 73.71%, 41.76%)\\n$red-800: hsl(0.0, 70.0%, 35.29%)\\n$red-900: hsl(0.0, 62.82%, 30.59%)\\n\\n$orange-50: hsl(33.33, 100.0%, 96.47%)\\n$orange-100: hsl(34.29, 100.0%, 91.76%)\\n$orange-200: hsl(32.14, 97.67%, 83.14%)\\n$orange-300: hsl(30.66, 97.16%, 72.35%)\\n$orange-400: hsl(27.02, 95.98%, 60.98%)\\n$orange-500: hsl(24.58, 94.98%, 53.14%)\\n$orange-600: hsl(20.54, 90.24%, 48.24%)\\n$orange-700: hsl(17.47, 88.35%, 40.39%)\\n$orange-800: hsl(15.0, 79.07%, 33.73%)\\n$orange-900: hsl(15.28, 74.65%, 27.84%)\\n\\n$amber-50: hsl(48.0, 100.0%, 96.08%)\\n$amber-100: hsl(48.0, 96.49%, 88.82%)\\n$amber-200: hsl(48.0, 96.64%, 76.67%)\\n$amber-300: hsl(45.94, 96.69%, 64.51%)\\n$amber-400: hsl(43.26, 96.41%, 56.27%)\\n$amber-500: hsl(37.69, 92.13%, 50.2%)\\n$amber-600: hsl(32.13, 94.62%, 43.73%)\\n$amber-700: hsl(25.96, 90.48%, 37.06%)\\n$amber-800: hsl(22.73, 82.5%, 31.37%)\\n$amber-900: hsl(21.71, 77.78%, 26.47%)\\n\\n$yellow-50: hsl(54.55, 91.67%, 95.29%)\\n$yellow-100: hsl(54.92, 96.72%, 88.04%)\\n$yellow-200: hsl(52.76, 98.31%, 76.86%)\\n$yellow-300: hsl(50.44, 97.85%, 63.53%)\\n$yellow-400: hsl(47.95, 95.82%, 53.14%)\\n$yellow-500: hsl(45.4, 93.39%, 47.45%)\\n$yellow-600: hsl(40.61, 96.12%, 40.39%)\\n$yellow-700: hsl(35.45, 91.67%, 32.94%)\\n$yellow-800: hsl(31.76, 80.95%, 28.82%)\\n$yellow-900: hsl(28.42, 72.52%, 25.69%)\\n\\n$lime-50: hsl(78.26, 92.0%, 95.1%)\\n$lime-100: hsl(79.59, 89.09%, 89.22%)\\n$lime-200: hsl(80.87, 88.46%, 79.61%)\\n$lime-300: hsl(81.97, 84.52%, 67.06%)\\n$lime-400: hsl(82.71, 77.97%, 55.49%)\\n$lime-500: hsl(83.74, 80.53%, 44.31%)\\n$lime-600: hsl(84.8, 85.23%, 34.51%)\\n$lime-700: hsl(85.87, 78.42%, 27.25%)\\n$lime-800: hsl(86.25, 68.97%, 22.75%)\\n$lime-900: hsl(87.62, 61.17%, 20.2%)\\n\\n$green-50: hsl(138.46, 76.47%, 96.67%)\\n$green-100: hsl(140.62, 84.21%, 92.55%)\\n$green-200: hsl(141.0, 78.95%, 85.1%)\\n$green-300: hsl(141.71, 76.64%, 73.14%)\\n$green-400: hsl(141.89, 69.16%, 58.04%)\\n$green-500: hsl(142.09, 70.56%, 45.29%)\\n$green-600: hsl(142.13, 76.22%, 36.27%)\\n$green-700: hsl(142.43, 71.81%, 29.22%)\\n$green-800: hsl(142.78, 64.23%, 24.12%)\\n$green-900: hsl(143.81, 61.17%, 20.2%)\\n\\n$emerald-50: hsl(151.76, 80.95%, 95.88%)\\n$emerald-100: hsl(149.27, 80.39%, 90.0%)\\n$emerald-200: hsl(152.37, 76.0%, 80.39%)\\n$emerald-300: hsl(156.2, 71.6%, 66.86%)\\n$emerald-400: hsl(158.11, 64.37%, 51.57%)\\n$emerald-500: hsl(160.12, 84.08%, 39.41%)\\n$emerald-600: hsl(161.38, 93.55%, 30.39%)\\n$emerald-700: hsl(162.93, 93.55%, 24.31%)\\n$emerald-800: hsl(163.15, 88.12%, 19.8%)\\n$emerald-900: hsl(164.17, 85.71%, 16.47%)\\n\\n$teal-50: hsl(166.15, 76.47%, 96.67%)\\n$teal-100: hsl(167.23, 85.45%, 89.22%)\\n$teal-200: hsl(168.39, 83.78%, 78.24%)\\n$teal-300: hsl(170.57, 76.92%, 64.31%)\\n$teal-400: hsl(172.46, 66.01%, 50.39%)\\n$teal-500: hsl(173.41, 80.39%, 40.0%)\\n$teal-600: hsl(174.67, 83.85%, 31.57%)\\n$teal-700: hsl(175.34, 77.44%, 26.08%)\\n$teal-800: hsl(176.1, 69.37%, 21.76%)\\n$teal-900: hsl(175.93, 60.82%, 19.02%)\\n\\n$cyan-50: hsl(183.16, 100.0%, 96.27%)\\n$cyan-100: hsl(185.11, 95.92%, 90.39%)\\n$cyan-200: hsl(186.21, 93.55%, 81.76%)\\n$cyan-300: hsl(186.99, 92.41%, 69.02%)\\n$cyan-400: hsl(187.94, 85.71%, 53.33%)\\n$cyan-500: hsl(188.74, 94.5%, 42.75%)\\n$cyan-600: hsl(191.65, 91.4%, 36.47%)\\n$cyan-700: hsl(192.92, 82.28%, 30.98%)\\n$cyan-800: hsl(194.38, 69.57%, 27.06%)\\n$cyan-900: hsl(196.36, 63.64%, 23.73%)\\n\\n$sky-50: hsl(204.0, 100.0%, 97.06%)\\n$sky-100: hsl(204.0, 93.75%, 93.73%)\\n$sky-200: hsl(200.6, 94.37%, 86.08%)\\n$sky-300: hsl(199.37, 95.49%, 73.92%)\\n$sky-400: hsl(198.44, 93.2%, 59.61%)\\n$sky-500: hsl(198.63, 88.66%, 48.43%)\\n$sky-600: hsl(200.41, 98.01%, 39.41%)\\n$sky-700: hsl(201.27, 96.34%, 32.16%)\\n$sky-800: hsl(200.95, 90.0%, 27.45%)\\n$sky-900: hsl(202.04, 80.33%, 23.92%)\\n\\n$blue-50: hsl(213.75, 100.0%, 96.86%)\\n$blue-100: hsl(214.29, 94.59%, 92.75%)\\n$blue-200: hsl(213.33, 96.92%, 87.25%)\\n$blue-300: hsl(211.7, 96.36%, 78.43%)\\n$blue-400: hsl(213.12, 93.9%, 67.84%)\\n$blue-500: hsl(217.22, 91.22%, 59.8%)\\n$blue-600: hsl(221.21, 83.19%, 53.33%)\\n$blue-700: hsl(224.28, 76.33%, 48.04%)\\n$blue-800: hsl(225.93, 70.73%, 40.2%)\\n$blue-900: hsl(224.44, 64.29%, 32.94%)\\n\\n$indigo-50: hsl(225.88, 100.0%, 96.67%)\\n$indigo-100: hsl(226.45, 100.0%, 93.92%)\\n$indigo-200: hsl(228.0, 96.49%, 88.82%)\\n$indigo-300: hsl(229.66, 93.55%, 81.76%)\\n$indigo-400: hsl(234.45, 89.47%, 73.92%)\\n$indigo-500: hsl(238.73, 83.53%, 66.67%)\\n$indigo-600: hsl(243.4, 75.36%, 58.63%)\\n$indigo-700: hsl(244.52, 57.94%, 50.59%)\\n$indigo-800: hsl(243.65, 54.5%, 41.37%)\\n$indigo-900: hsl(242.17, 47.43%, 34.31%)\\n\\n$violet-50: hsl(250.0, 100.0%, 97.65%)\\n$violet-100: hsl(251.43, 91.3%, 95.49%)\\n$violet-200: hsl(250.5, 95.24%, 91.76%)\\n$violet-300: hsl(252.5, 94.74%, 85.1%)\\n$violet-400: hsl(255.14, 91.74%, 76.27%)\\n$violet-500: hsl(258.31, 89.53%, 66.27%)\\n$violet-600: hsl(262.12, 83.26%, 57.84%)\\n$violet-700: hsl(263.39, 69.96%, 50.39%)\\n$violet-800: hsl(263.36, 69.3%, 42.16%)\\n$violet-900: hsl(263.5, 67.42%, 34.9%)\\n\\n$purple-50: hsl(270.0, 100.0%, 98.04%)\\n$purple-100: hsl(268.7, 100.0%, 95.49%)\\n$purple-200: hsl(268.57, 100.0%, 91.76%)\\n$purple-300: hsl(269.19, 97.37%, 85.1%)\\n$purple-400: hsl(270.0, 95.24%, 75.29%)\\n$purple-500: hsl(270.74, 91.01%, 65.1%)\\n$purple-600: hsl(271.48, 81.33%, 55.88%)\\n$purple-700: hsl(272.09, 71.67%, 47.06%)\\n$purple-800: hsl(272.89, 67.16%, 39.41%)\\n$purple-900: hsl(273.64, 65.64%, 31.96%)\\n\\n$fuchsia-50: hsl(289.09, 100.0%, 97.84%)\\n$fuchsia-100: hsl(286.96, 100.0%, 95.49%)\\n$fuchsia-200: hsl(288.26, 95.83%, 90.59%)\\n$fuchsia-300: hsl(291.11, 93.1%, 82.94%)\\n$fuchsia-400: hsl(292.03, 91.43%, 72.55%)\\n$fuchsia-500: hsl(292.19, 84.08%, 60.59%)\\n$fuchsia-600: hsl(293.41, 69.48%, 48.82%)\\n$fuchsia-700: hsl(294.69, 72.41%, 39.8%)\\n$fuchsia-800: hsl(295.42, 70.24%, 32.94%)\\n$fuchsia-900: hsl(296.7, 63.64%, 28.04%)\\n\\n$pink-50: hsl(327.27, 73.33%, 97.06%)\\n$pink-100: hsl(325.71, 77.78%, 94.71%)\\n$pink-200: hsl(325.91, 84.62%, 89.8%)\\n$pink-300: hsl(327.41, 87.1%, 81.76%)\\n$pink-400: hsl(328.62, 85.53%, 70.2%)\\n$pink-500: hsl(330.37, 81.19%, 60.39%)\\n$pink-600: hsl(333.33, 71.43%, 50.59%)\\n$pink-700: hsl(335.06, 77.57%, 41.96%)\\n$pink-800: hsl(335.82, 74.44%, 35.29%)\\n$pink-900: hsl(335.89, 69.03%, 30.39%)\\n\\n$rose-50: hsl(355.71, 100.0%, 97.25%)\\n$rose-100: hsl(355.56, 100.0%, 94.71%)\\n$rose-200: hsl(352.65, 96.08%, 90.0%)\\n$rose-300: hsl(352.58, 95.7%, 81.76%)\\n$rose-400: hsl(351.3, 94.52%, 71.37%)\\n$rose-500: hsl(349.72, 89.16%, 60.2%)\\n$rose-600: hsl(346.84, 77.17%, 49.8%)\\n$rose-700: hsl(345.35, 82.69%, 40.78%)\\n$rose-800: hsl(343.4, 79.66%, 34.71%)\\n$rose-900: hsl(341.54, 75.48%, 30.39%)\\n\\n// panels\\n$emerald-800-faded: desaturate($emerald-800, 50%)\\n\\n\\t\\n// from https://culturedcode.com/things/whats-new/\\n// but modified with the dev panel\\n$color_bg: darken(desaturate($color_03, 20%),10%) //darken(#fafafa, 50%) //#111111 //#fafcff // #d5d9de\\n$color_font: #111111 //#fafafa //#fafcff //#111111\\n$color_bg_dark: darken($color_bg, 5%)\\n\\n$primary-color: #1779ba\\n$secondary-color: #767676\\n$success-color: #3adb76\\n$warning-color: #ffae00\\n$alert-color: #cc4b37\\n\\n\\n\\n\\n$color_bg_panel: lighten($color_bg, 0%)\\n$color_bg_panel_network: $color_03// #a59ab6 //lighten($color_bg_panel, 10%)\\n$color_bg_panel_params: $color_01// #a3d9b7 //lighten($success-color, 20%)\\n$color_bg_panel_param_edit: $color_01//lighten($color_bg_panel_params, 15%)\\n$color_bg_panel_viewer: $color_04//  #96bcd5 //lighten($primary-color, 30%)\\n$color_bg_panel_performance: $color_02 //desaturate(yellow, 20%)\\n$color_bg_panel_assets: $color_04//#d5c596 //lighten($primary-color, 30%)\\n$color_bg_panel_custom: $color_05//#a3d9b7 //lighten($primary-color, 30%)\\n$color_bg_panel_spreadsheet: $color_05//#d096c9\\n$color_bg_panel_custom_node_editor: $color_06 //darken(#96bcd5, 20%)\\n$color_bg_panel_scene_tree: $color_07// #bfecb3\\n$color_bg_panel_shader_code_preview: $color_08 // #97d3d3\\n\\n$color_node_info_bg: lighten($color_bg_panel_network, 20%)\\n// $color_bg_playbar: $color_bg_panel\\n\\n// $color_bg_dropdown_menu: lighten($color_bg, 25%) //#eee\\n// $color_bg_modal: lightblue\\n\\n$z_index_node_info: 50000 // should be higher than param labels\\n$z_index_multi_panel_separator: 998\\n$z_index_dropdown_menu: 99999 // to be higher than playbar, otherwise preset dropdowns get hidden under it\\n$z_index_retractable_toggler: 9998\\n$z_index_modal: 9999\\n$z_index_playbar: 9999\\n$z_index_command_palette: 10999 // should be above the modals in order to not have the param modals above it\\n$z_index_numeric_slider: 99999\\n$z_index_tab_menu: 99999\\n$z_index_context_menu: 999999 // higher than\\n\\n// gl\\n$color_connection_bool: lighten(purple, 20%)\\n$color_connection_float: yellow\\n$color_connection_int: mix($color_connection_float, $color_connection_bool, 50%)\\n$color_connection_vec2: lighten(green, 3%)\\n$color_connection_vec3: lighten(blue, 20%)\\n$color_connection_vec4: darken(yellow, 20%)\\n$color_connection_mat3: lighten(blue, 30%)\\n$color_connection_color: lighten(red,20%)\\n$color_connection_SSSModel: orange\\n// events\\n$color_connection_base: lighten(green, 90%)\\n$color_connection_mouse: lighten(blue, 20%)\\n$color_connection_keyboard: lighten(orange, 20%)\\n// actors\\n// $color_connection_boolean: $color_connection_bool\\n// $color_connection_float: yellow\\n// $color_connection_integer: $color_connection_int\\n$color_connection_animation_action: lighten(blue, 20%)\\n$color_connection_animation_mixer: darken(blue, 18%)\\n$color_connection_box3: lighten(purple, 30%)\\n$color_connection_CatmullRomCurve3: darken(orange, 10%)\\n$color_connection_material: lighten(orange, 10%)\\n$color_connection_object3d: darken(orange, 20%)\\n$color_connection_plane: lighten(purple, 20%)\\n$color_connection_ray: lighten(green, 25%)\\n$color_connection_sphere: lighten(purple, 10%)\\n$color_connection_trigger: white\\n$color_connection_string: lighten(green, 10%)\\n// $color_connection_vector2: $color_connection_vec2\\n// $color_connection_vector3: $color_connection_vec3\\n// $color_connection_vector4: $color_connection_vec4\\n// $color_connection_matrix3: $color_connection_mat3\\n\\n\\n//https://foundation.zurb.com/sites/docs/media-queries.html\\n$width_before_medium: 39.9375em\\n$width_medium: 40em\\n$width_before_large: 63.9375em\\n$width_large: 64em\\n$width_after_large: 74.9375em\\n\\n$small_only: \\\"screen and (max-width: #{$width_before_medium})\\\"\\n$medium_and_up: \\\"screen and (min-width: #{$width_medium})\\\"\\n$medium_only: \\\"screen and (min-width: #{$width_medium}) and (max-width: #{$width_before_large})\\\"\\n$large_and_up: \\\"screen and (min-width: #{$width_large})\\\"\\n$large_only: \\\"screen and (min-width: #{$width_large}) and (max-width: #{$width_after_large})\\\"\\n\\n// // input[type=text]\\n// // \\tfont-size: 0.9rem // to see the '_' on chrome\\n// // \\t// TODO: apply it to any other input on the site\\n// [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea\\n// \\tbackground-color: mix($color_bg, $color_font, 50%)\\n// \\tborder: 0px\\n// \\t// font-size: 0.75rem\\n// [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, textarea:focus\\n// \\tbackground-color: mix($color_bg, $color_font, 20%)\\n\\n\\n// .full_height_container\\n// \\theight: 100%\\n// .full_page_height\\n// \\theight: 100vh\\n\\n// inspired by https://codersblock.com/blog/creating-glow-effects-with-css/\\n// but converted the box-shadow to drop-shadow\\n// $shadow_size0: 0.2rem\\n// $shadow_size1: 0.2*$shadow_size0\\n// $shadow_size2: 0.4*$shadow_size0\\n// $shadow_color0: darken(#fff,5%)\\n// $shadow_color1: darken(#fff,20%) //#f0f\\n// $shadow_color2: darken(#fff,20%) //darken(#0ff,15%)\\n\\n// $shadow2: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1) drop-shadow(0px 0px $shadow_size2)\\n// $shadow1: drop-shadow(0px 0px $shadow_size0 $shadow_color0) drop-shadow(0px 0px $shadow_size1 $shadow_color1)\\n// $shadow0: drop-shadow(0px 0px $shadow_size0 $shadow_color0)\\n\\n// $shadow: $shadow1\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = \"\";\n      var needLayer = typeof item[5] !== \"undefined\";\n\n      if (item[4]) {\n        content += \"@supports (\".concat(item[4], \") {\");\n      }\n\n      if (item[2]) {\n        content += \"@media \".concat(item[2], \" {\");\n      }\n\n      if (needLayer) {\n        content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n      }\n\n      content += cssWithMappingToString(item);\n\n      if (needLayer) {\n        content += \"}\";\n      }\n\n      if (item[2]) {\n        content += \"}\";\n      }\n\n      if (item[4]) {\n        content += \"}\";\n      }\n\n      return content;\n    }).join(\"\");\n  }; // import a list of modules into the list\n\n\n  list.i = function i(modules, media, dedupe, supports, layer) {\n    if (typeof modules === \"string\") {\n      modules = [[null, modules, undefined]];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var k = 0; k < this.length; k++) {\n        var id = this[k][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _k = 0; _k < modules.length; _k++) {\n      var item = [].concat(modules[_k]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        continue;\n      }\n\n      if (typeof layer !== \"undefined\") {\n        if (typeof item[5] === \"undefined\") {\n          item[5] = layer;\n        } else {\n          item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n          item[5] = layer;\n        }\n      }\n\n      if (media) {\n        if (!item[2]) {\n          item[2] = media;\n        } else {\n          item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n          item[2] = media;\n        }\n      }\n\n      if (supports) {\n        if (!item[4]) {\n          item[4] = \"\".concat(supports);\n        } else {\n          item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n          item[4] = supports;\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};","\"use strict\";\n\nmodule.exports = function (url, options) {\n  if (!options) {\n    options = {};\n  }\n\n  if (!url) {\n    return url;\n  }\n\n  url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them\n\n  if (/^['\"].*['\"]$/.test(url)) {\n    url = url.slice(1, -1);\n  }\n\n  if (options.hash) {\n    url += options.hash;\n  } // Should url be wrapped?\n  // See https://drafts.csswg.org/css-values-3/#urls\n\n\n  if (/[\"'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n    return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n  }\n\n  return url;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n  var content = item[1];\n  var cssMapping = item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (typeof btoa === \"function\") {\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n    var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n    var sourceMapping = \"/*# \".concat(data, \" */\");\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n  }\n\n  return [content].join(\"\\n\");\n};","import {BaseNodeType} from '../../src/engine/nodes/_Base';\nimport {ParamConstructorMap} from '../../src/engine/params/types/ParamConstructorMap';\nimport {ParamInitValuesTypeMap} from '../../src/engine/params/types/ParamInitValuesTypeMap';\nimport {ParamType} from '../../src/engine/poly/ParamType';\nimport {PolyDictionary} from '../../src/types/GlobalTypes';\n\nexport interface PresetEntry<T extends ParamType> {\n\tparam: ParamConstructorMap[T];\n\tvalue: ParamInitValuesTypeMap[T];\n}\n\nexport class BasePreset {\n\tprivate _entries: PresetEntry<ParamType>[] = [];\n\taddEntry<T extends ParamType>(param: ParamConstructorMap[T], value: ParamInitValuesTypeMap[T]) {\n\t\tthis._entries.push({param, value});\n\t\treturn this;\n\t}\n\n\tentries() {\n\t\treturn this._entries;\n\t}\n}\n\nexport class NodePresetsCollection {\n\tprivate _presetsByName: Map<string, BasePreset> = new Map();\n\n\t// constructor(dic: PolyDictionary<PresetEntry<ParamType>[]>){\n\t// \tconst presetNames:string[] = Object.keys(dic)\n\t// \tfor(let presetName of presetNames){\n\t// \t\tconst entries = dic[presetName]\n\t// \t\tthis._addPreset(presetName, entries)\n\t// \t}\n\t// }\n\tsetPresets(presetsByName: PolyDictionary<BasePreset>) {\n\t\tconst names = Object.keys(presetsByName);\n\t\tfor (let name of names) {\n\t\t\tconst preset = presetsByName[name];\n\t\t\tthis.addPreset(name, preset);\n\t\t}\n\t\treturn this;\n\t}\n\taddPreset(presetName: string, preset: BasePreset) {\n\t\tif (this._presetsByName.get(presetName)) {\n\t\t\tconsole.warn('existing preset', presetName);\n\t\t}\n\n\t\tthis._presetsByName.set(presetName, preset);\n\t\tthis._updatePresetNames();\n\t\treturn this;\n\t}\n\tprivate _presetNames: string[] = [];\n\tprivate _updatePresetNames() {\n\t\tthis._presetNames.length = 0;\n\t\tthis._presetsByName.forEach((preset, presetName) => {\n\t\t\tthis._presetNames.push(presetName);\n\t\t});\n\t\tthis._presetNames.sort();\n\t}\n\tpresetNames() {\n\t\treturn this._presetNames;\n\t}\n\tgetPreset(presetName: string) {\n\t\treturn this._presetsByName.get(presetName);\n\t}\n\t// addPreset(presetName:string, entries: PresetEntry<ParamType>[]){\n\t// \tif(this._presetsByName.get(presetName)){\n\t// \t\tconsole.warn('existing preset')\n\t// \t}\n\n\t// \tconst preset = new BasePreset()\n\t// \tfor(let entry of entries){\n\t// \t\tpreset.addEntry(entry)\n\t// \t}\n\t// \tthis._presetsByName.set(presetName, preset)\n\t// }\n}\n\nexport type PresetsCollectionFactory<N extends BaseNodeType> = (node: N) => NodePresetsCollection;\n\nimport {BaseNodeClass} from '../../src/engine/nodes/_Base';\n// import {BaseParamType} from '../../src/engine/params/_Base';\n\n// type PresetCallback<N extends BaseNodeType> = () => NodePresetsCollection\n// interface ParamsLabelConfig {\n// \tparams: BaseParamType | BaseParamType[];\n// \tcallback: ParamsLabelCallback;\n// }\n// export type ParamsLabelSetup<N extends BaseNodeClass> = (node: N) => ParamsLabelConfig;\n\n// export type ParamsLabelRegister<N extends typeof BaseNodeClass, NI extends BaseNodeClass> = (\n// \tnode: N\n// ) => ParamsLabelSetup<NI>;\n\nexport interface PresetRegister<N extends typeof BaseNodeClass, NI extends BaseNodeClass> {\n\tnodeClass: N;\n\tsetupFunc: PresetsCollectionFactory<NI>;\n}\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {ImageEXRCopNode} from '../../../src/engine/nodes/cop/ImageEXR';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst list = [\n\t'brown_photostudio_02_1k',\n\t'brown_photostudio_03_1k',\n\t'brown_photostudio_05_1k',\n\t'brown_photostudio_06_1k',\n\t'brown_photostudio_07_1k',\n\t'christmas_photo_studio_01_1k',\n\t'christmas_photo_studio_03_1k',\n\t'neon_photostudio_1k',\n\t'photo_studio_loft_hall_1k',\n\t'preller_drive_1k',\n\t'provence_studio_1k',\n\t'satara_night_1k',\n\t'studio_small_03_1k',\n\t'studio_small_07_1k',\n\t'studio_small_08_1k',\n\t'studio_small_09_1k',\n];\n\nexport function imageEXRPresetUrls() {\n\treturn list.map((fileName) => ({\n\t\tfileName,\n\t\turl: `${DEMO_ASSETS_ROOT_URL}/textures/resources/polyhaven.com/envmaps/${fileName}.exr`,\n\t\tthumbnail: `${DEMO_ASSETS_ROOT_URL}/textures/resources/polyhaven.com/envmaps/thumbnails/${fileName}.jpg`,\n\t}));\n}\n\nconst imageEXRCopNodePresetsCollectionFactory: PresetsCollectionFactory<ImageEXRCopNode> = (node: ImageEXRCopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction polyhavenEnvMaps() {\n\t\tconst dict: Record<string, BasePreset> = {};\n\t\tconst urls = imageEXRPresetUrls();\n\t\tfor (let fileData of urls) {\n\t\t\tconst preset = new BasePreset()\n\t\t\t\t.addEntry(node.p.url, fileData.url)\n\t\t\t\t.addEntry(node.p.tanisotropy, 1)\n\t\t\t\t.addEntry(node.p.useRendererMaxAnisotropy, 1)\n\t\t\t\t.addEntry(node.p.tminFilter, 1)\n\t\t\t\t.addEntry(node.p.tmagFilter, 1);\n\t\t\tdict[`polyhaven/${fileData.fileName}`] = preset;\n\t\t}\n\t\treturn dict;\n\t}\n\n\tcollection.setPresets({\n\t\t...polyhavenEnvMaps(),\n\t});\n\n\treturn collection;\n};\nexport const imageEXRCopPresetRegister: PresetRegister<typeof ImageEXRCopNode, ImageEXRCopNode> = {\n\tnodeClass: ImageEXRCopNode,\n\tsetupFunc: imageEXRCopNodePresetsCollectionFactory,\n};\n","import type {TypedArray} from 'three';\nimport {pushOnArrayAtEntry} from './MapUtils';\nimport {setUnion, setToArray, setIntersection, setDifference, setXOR} from './SetUtils';\nimport {isString} from './Type';\nimport {randFloat} from './math/_Module';\n\nexport type ArrayToItemFunction<T> = (array: Array<T>) => T;\nconst _tmp: Set<any> = new Set();\nconst _tmp0: Set<any> = new Set();\nconst _tmp1: Set<any> = new Set();\n\nexport function range(start: number, end: number, step: number, target: number[]): number[] {\n\tif (end == null) {\n\t\tend = start;\n\t\tstart = 0;\n\t}\n\tconst length = Math.floor((end - start) / step);\n\ttarget.length = length;\n\n\tfor (let i = 0; i < length; i++) {\n\t\ttarget[i] = start + i * step;\n\t}\n\treturn target;\n}\nexport function rangeWithEnd(end: number): number[] {\n\tconst target: number[] = [];\n\trange(0, end, 1, target);\n\treturn target;\n}\nexport function rangeStartEnd(start: number, end: number): number[] {\n\tconst target: number[] = [];\n\trange(start, end, 1, target);\n\treturn target;\n}\nexport function arrayUniq<T>(array: Array<T>, target: Array<T>): Array<T> {\n\ttarget.length = 0;\n\tfor (const element of array) {\n\t\tif (!target.includes(element)) {\n\t\t\ttarget.push(element);\n\t\t}\n\t}\n\treturn target;\n\t// if we use a set, we lose the order\n\t// const tmpSet: Set<T> = new Set();\n\n\t// for (let elem of array) {\n\t// \ttmpSet.add(elem);\n\t// }\n\n\t// const newArray: Array<T> = new Array(tmpSet.size);\n\t// let i = 0;\n\t// tmpSet.forEach((elem) => {\n\t// \tnewArray[i] = elem;\n\t// \ti++;\n\t// });\n\n\t// return newArray;\n}\nexport function sampleIndex(array: Array<any>, seed: number): number {\n\treturn Math.floor(randFloat(seed) * array.length);\n}\nexport function sample<T>(array: Array<T>, seed: number): T | undefined {\n\treturn array[sampleIndex(array, seed)];\n}\nexport function spliceSample<T>(array: Array<T>, seed: number): T | undefined {\n\treturn array.splice(sampleIndex(array, seed), 1)[0];\n}\n\nexport function uniqWithoutPreservingOrder<T>(array: Array<T>, target: Array<T>): Array<T> {\n\tarrayToSet(array, _tmp);\n\treturn setToArray(_tmp, target);\n\n\t// for (let elem of array) {\n\t// \ttmpSet.add(elem);\n\t// }\n\n\t// const newArray: Array<T> = new Array(tmpSet.size);\n\t// let i = 0;\n\t// tmpSet.forEach((elem) => {\n\t// \tnewArray[i] = elem;\n\t// \ti++;\n\t// });\n\n\t// return newArray;\n}\nexport function arrayCompact<T>(array: Readonly<Array<T | null | undefined>>, target: Array<T>): Array<T> {\n\ttarget.length = 0;\n\n\tfor (let i = 0; i < array.length; i++) {\n\t\tconst elem = array[i];\n\t\tif (elem != null) {\n\t\t\ttarget.push(elem);\n\t\t}\n\t}\n\n\treturn target;\n}\nexport function arrayMin<T>(array: Array<T>): T {\n\tlet min = array[0];\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (array[i] < min) {\n\t\t\tmin = array[i];\n\t\t}\n\t}\n\treturn min;\n}\nexport function arrayMax<T>(array: Array<T>): T {\n\tlet max = array[0];\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (array[i] > max) {\n\t\t\tmax = array[i];\n\t\t}\n\t}\n\treturn max;\n}\nexport function arraySum(array: number[]): number {\n\tlet sum = 0;\n\tfor (let i = 0; i < array.length; i++) {\n\t\tsum += array[i];\n\t}\n\treturn sum;\n}\nexport function arrayChunk<T>(array: Array<T>, chunkSize: number): Array<Array<T>> {\n\tconst newArray: Array<Array<T>> = [];\n\n\tlet newSubArray: Array<T> = [];\n\tnewArray.push(newSubArray);\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (newSubArray.length == chunkSize) {\n\t\t\tnewSubArray = [];\n\t\t\tnewArray.push(newSubArray);\n\t\t}\n\t\tnewSubArray.push(array[i]);\n\t}\n\n\treturn newArray;\n}\n\nexport function arrayUnion<T>(array0: Array<T>, array1: Array<T>, target: Array<T>): Array<T> {\n\tsetUnion(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);\n\tsetToArray(_tmp, target);\n\treturn target;\n}\nexport function arrayIntersection<T>(array0: Array<T>, array1: Array<T>, target: Array<T>): Array<T> {\n\tsetIntersection(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);\n\tsetToArray(_tmp, target);\n\treturn target;\n}\nexport function arrayDifference<T>(array0: Array<T>, array1: Array<T>, target: Array<T>): Array<T> {\n\tsetDifference(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);\n\tsetToArray(_tmp, target);\n\treturn target;\n}\nexport function arrayXOR<T>(array0: Array<T>, array1: Array<T>, target: Array<T>): Array<T> {\n\tsetXOR(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);\n\tsetToArray(_tmp, target);\n\treturn target;\n}\nexport function arrayToSet<T>(array: Array<T>, target: Set<T>): Set<T> {\n\ttarget.clear();\n\tfor (let i = 0; i < array.length; i++) {\n\t\ttarget.add(array[i]);\n\t}\n\treturn target;\n}\nexport function arrayIsEqual<T extends number | string>(array0: Array<T>, array1: Array<T>): boolean {\n\tif (array0.length != array1.length) {\n\t\treturn false;\n\t}\n\tconst count = array0.length;\n\tfor (let i = 0; i < count; i++) {\n\t\tif (array0[i] != array1[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\nexport function arraySortBy<T, K extends number | string>(array: Array<T>, callback: (e: T) => K): Array<T> {\n\tif (array.length == 0) {\n\t\treturn [];\n\t}\n\tconst elementsByValue: Map<K, T[]> = new Map();\n\tconst valuesSet: Set<K> = new Set();\n\tfor (const elem of array) {\n\t\tconst value: K = callback(elem);\n\t\tvaluesSet.add(value);\n\t\tpushOnArrayAtEntry(elementsByValue, value, elem);\n\t}\n\tconst values: K[] = new Array(valuesSet.size);\n\tlet i = 0;\n\tvaluesSet.forEach((value) => {\n\t\tvalues[i] = value;\n\t\ti++;\n\t});\n\n\t// sort differently if the callback return value is a string or a number\n\tif (isString(values[0])) {\n\t\tvalues.sort();\n\t} else {\n\t\tvalues.sort((a, b) => (a as number) - (b as number));\n\t}\n\n\tconst sorted_elements: Array<T> = new Array(array.length);\n\ti = 0;\n\tfor (const value of values) {\n\t\tconst elements_for_value = elementsByValue.get(value);\n\t\tif (elements_for_value) {\n\t\t\tfor (const element of elements_for_value) {\n\t\t\t\tsorted_elements[i] = element;\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\treturn sorted_elements;\n}\nexport function arrayShallowClone<T>(array: Array<T>): Array<T> {\n\t// https://stackoverflow.com/questions/3978492/fastest-way-to-duplicate-an-array-in-javascript-slice-vs-for-loop\n\treturn [...array];\n}\nexport function arrayMap<T, U>(array: Readonly<Array<T>>, callback: (e: T) => U, target: Array<U>): Array<U> {\n\ttarget.length = 0;\n\tfor (const item of array) {\n\t\ttarget.push(callback(item));\n\t}\n\treturn target;\n}\nexport function arrayAverage(array: number[]) {\n\treturn arraySum(array) / array.length;\n}\n\nexport class ArrayUtils {\n\tstatic shallowClone = arrayShallowClone;\n\tstatic min = arrayMin;\n\tstatic max = arrayMax;\n\tstatic sum = arraySum;\n\tstatic compact = arrayCompact;\n\tstatic uniq = arrayUniq;\n\tstatic uniqWithoutPreservingOrder = uniqWithoutPreservingOrder;\n\tstatic chunk = arrayChunk;\n\tstatic union = arrayUnion;\n\tstatic intersection = arrayIntersection;\n\tstatic toSet = arrayToSet;\n\tstatic isEqual = arrayIsEqual;\n\tstatic sortBy = arraySortBy;\n\tstatic range = range;\n}\n\n// const MAX_ITEMS_LENGTH = 1024;\nexport function arrayPushItems<T>(srcArray: Readonly<Array<T>>, target: Array<T>) {\n\t// we avoid the standard\n\t// array.push(...items),\n\t// as this can trigger an\n\t// 'Maximum call stack size exceeded' error\n\t// on some large items array.\n\t// So instead, we push them elements one by one if items.length is above a threshold\n\t// if (srcArray.length <= MAX_ITEMS_LENGTH) {\n\t// \ttarget.push(...srcArray);\n\t// } else {\n\tfor (const item of srcArray) {\n\t\ttarget.push(item);\n\t}\n\t// }\n}\n\nexport function arrayCopy<T>(srcArray: Readonly<Array<T> | ArrayLike<T>>, targetArray: Array<T>): void {\n\ttargetArray.length = srcArray.length;\n\tfor (let i = 0; i < srcArray.length; i++) {\n\t\ttargetArray[i] = srcArray[i];\n\t}\n}\n\nexport function typedArrayCopy<T1 extends TypedArray, T2 extends TypedArray>(\n\tsrcArray: Readonly<T1>,\n\ttargetArray: T2\n): T2 {\n\ttargetArray.set(srcArray);\n\treturn targetArray;\n}\n","export const DEMO_ASSETS_ROOT_URL = 'https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master';\nexport const DEFAULT_FONT_URL_JSON = `${DEMO_ASSETS_ROOT_URL}/fonts/droid_sans_regular.typeface.json`;\nexport const DEFAULT_FONT_URL_TTF = `${DEMO_ASSETS_ROOT_URL}/fonts/SourceCodePro-BoldIt.ttf`;\n","export function createObjectURL(fileOrBlob: File | Blob) {\n\tconst urlCreator = globalThis.URL || globalThis.webkitURL;\n\treturn urlCreator.createObjectURL(fileOrBlob);\n}\n\nexport function downloadBlob(blob: Blob, fileName: string) {\n\tconst urlCreator = globalThis.URL || globalThis.webkitURL;\n\tconst blobUrl = urlCreator.createObjectURL(blob);\n\n\tconst element = document.createElement('a');\n\telement.setAttribute('href', blobUrl);\n\telement.setAttribute('target', '_blank');\n\telement.setAttribute('download', fileName);\n\n\telement.style.display = 'none';\n\tdocument.body.appendChild(element);\n\telement.click();\n\n\tdocument.body.removeChild(element);\n}\n","import {MathUtils} from 'three';\nimport type {Color} from 'three';\n\nexport enum ColorConversion {\n\tNONE = 'no conversion',\n\tSRGB_TO_LINEAR = 'sRGB -> linear',\n\tLINEAR_TO_SRGB = 'linear -> sRGB',\n}\nexport const COLOR_CONVERSIONS: ColorConversion[] = [\n\tColorConversion.NONE,\n\tColorConversion.SRGB_TO_LINEAR,\n\tColorConversion.LINEAR_TO_SRGB,\n];\nexport class CoreColor {\n\t// use color.toStyle() if needed\n\t// static to_css(color: Color): string {\n\t// \tconst color_elements = color.toArray().map((e) => e * 255)\n\t// \treturn `rgb(${color_elements.join(', ')})`\n\t// }\n\n\t// from THREE.js examples ColorConverter.js\n\tstatic setHSV(h: number, s: number, v: number, target: Color) {\n\t\th = MathUtils.euclideanModulo(h, 1);\n\t\ts = MathUtils.clamp(s, 0, 1);\n\t\tv = MathUtils.clamp(v, 0, 1);\n\n\t\ttarget.setHSL(h, (s * v) / ((h = (2 - s) * v) < 1 ? h : 2 - h), h * 0.5);\n\t}\n}\n","import {ColorRepresentation, PerspectiveCamera, RectAreaLight, SpotLight} from 'three';\nimport {ObjectType, registerObjectType} from './geometry/Constant';\nimport {monkeyPatchSpotLight} from './monkeyPatch/SpotLight';\n\nexport interface PerspectiveCameraOptions {\n\tfov: number;\n\taspect: number;\n\tnear: number;\n\tfar: number;\n}\ntype PerspectiveCameraConstructor = (options: PerspectiveCameraOptions) => PerspectiveCamera;\nexport interface PerspectiveCameraUpdateOptions<C extends PerspectiveCamera> {\n\tcamera: C;\n\tparams: {\n\t\tapertureBlades: number;\n\t\tfStop: number;\n\t\tfocusDistance: number;\n\t\tapertureRotation: number;\n\t\tanamorphicRatio: number;\n\t};\n}\nexport type PerspectiveCameraUpdate<C extends PerspectiveCamera> = (options: PerspectiveCameraUpdateOptions<C>) => void;\n\nexport interface AreaLightOptions {\n\tcolor: ColorRepresentation;\n\tintensity: number;\n\twidth: number;\n\theight: number;\n}\ntype AreaLightConstructor = (options: AreaLightOptions) => RectAreaLight;\ntype SpotLightConstructor = () => SpotLight;\nexport interface SpotLightUpdateOptions<L extends SpotLight> {\n\tspotLight: L;\n\ttextureName: string;\n}\nexport type SpotLightUpdate<L extends SpotLight> = (options: SpotLightUpdateOptions<L>) => void;\n\nexport enum GeneratorName {\n\tPERSPECTIVE_CAMERA = 'perspectiveCamera',\n\tPERSPECTIVE_CAMERA_UPDATE = 'perspectiveCameraUpdate',\n\tAREA_LIGHT = 'areaLight',\n\tSPOT_LIGHT = 'spotLight',\n\tSPOT_LIGHT_UPDATE = 'spotLightUpdate',\n}\ntype GeneratorMap = {\n\t[GeneratorName.PERSPECTIVE_CAMERA]: PerspectiveCameraConstructor;\n\t[GeneratorName.PERSPECTIVE_CAMERA_UPDATE]: PerspectiveCameraUpdate<PerspectiveCamera>;\n\t[GeneratorName.AREA_LIGHT]: AreaLightConstructor;\n\t[GeneratorName.SPOT_LIGHT]: SpotLightConstructor;\n\t[GeneratorName.SPOT_LIGHT_UPDATE]: SpotLightUpdate<SpotLight>;\n};\nconst DEFAULT_PERSPECTIVE_CAMERA_CONSTRUCTOR: PerspectiveCameraConstructor = (options: PerspectiveCameraOptions) => {\n\tregisterObjectType({\n\t\ttype: ObjectType.PERSPECTIVE_CAMERA,\n\t\tcheckFunc: (obj) => {\n\t\t\tif ((obj as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\t\treturn ObjectType.PERSPECTIVE_CAMERA;\n\t\t\t}\n\t\t},\n\t\tctor: PerspectiveCamera,\n\t\thumanName: 'PerspectiveCamera',\n\t});\n\tconst {fov, aspect, near, far} = options;\n\treturn new PerspectiveCamera(fov, aspect, near, far);\n};\nconst DEFAULT_PERSPECTIVE_CAMERA_UPDATE: PerspectiveCameraUpdate<PerspectiveCamera> = <C extends PerspectiveCamera>(\n\toptions: PerspectiveCameraUpdateOptions<C>\n) => {};\n\nconst DEFAULT_AREA_LIGHT_CONSTRUCTOR: AreaLightConstructor = (options: AreaLightOptions) => {\n\tregisterObjectType({\n\t\ttype: ObjectType.AREA_LIGHT,\n\t\tcheckFunc: (obj) => {\n\t\t\tif ((obj as RectAreaLight).isRectAreaLight) {\n\t\t\t\treturn ObjectType.AREA_LIGHT;\n\t\t\t}\n\t\t},\n\t\tctor: RectAreaLight,\n\t\thumanName: 'AreaLight',\n\t});\n\tconst {color, intensity, width, height} = options;\n\treturn new RectAreaLight(color, intensity, width, height);\n};\n\nconst DEFAULT_SPOT_LIGHT_CONSTRUCTOR: SpotLightConstructor = () => {\n\tregisterObjectType({\n\t\ttype: ObjectType.SPOT_LIGHT,\n\t\tcheckFunc: (obj) => {\n\t\t\tif ((obj as SpotLight).isSpotLight) {\n\t\t\t\treturn ObjectType.SPOT_LIGHT;\n\t\t\t}\n\t\t},\n\t\tctor: SpotLight,\n\t\thumanName: ObjectType.SPOT_LIGHT,\n\t});\n\tconst spotLight = new SpotLight();\n\tmonkeyPatchSpotLight(spotLight);\n\treturn spotLight;\n};\nconst DEFAULT_SPOT_LIGHT_UPDATE: SpotLightUpdate<SpotLight> = <L extends SpotLight>(\n\toptions: SpotLightUpdateOptions<L>\n) => {};\n\nclass CoreSceneObjectsFactoryClass {\n\tprivate constructor() {}\n\tprivate static _instance: CoreSceneObjectsFactoryClass | undefined;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new CoreSceneObjectsFactoryClass());\n\t}\n\tprivate _generators: GeneratorMap = {\n\t\t[GeneratorName.PERSPECTIVE_CAMERA]: DEFAULT_PERSPECTIVE_CAMERA_CONSTRUCTOR,\n\t\t[GeneratorName.PERSPECTIVE_CAMERA_UPDATE]: DEFAULT_PERSPECTIVE_CAMERA_UPDATE,\n\t\t[GeneratorName.AREA_LIGHT]: DEFAULT_AREA_LIGHT_CONSTRUCTOR,\n\t\t[GeneratorName.SPOT_LIGHT]: DEFAULT_SPOT_LIGHT_CONSTRUCTOR,\n\t\t[GeneratorName.SPOT_LIGHT_UPDATE]: DEFAULT_SPOT_LIGHT_UPDATE,\n\t};\n\tgenerator<G extends GeneratorName>(generatorName: G): GeneratorMap[G] {\n\t\treturn this._generators[generatorName];\n\t}\n\tregisterGenerator<G extends GeneratorName>(generatorName: G, generator: GeneratorMap[G]) {\n\t\tthis._generators[generatorName] = generator;\n\t}\n\t// static generators: Generators = {\n\t// \tperspectiveCamera: (options:PerspectiveCameraOptions) => {\n\t// \t\tregisterObjectType({\n\t// \t\t\ttype: ObjectType.PERSPECTIVE_CAMERA,\n\t// \t\t\tctor: PerspectiveCamera,\n\t// \t\t\thumanName: 'PerspectiveCamera',\n\t// \t\t});\n\t// \t\tconst {fov, aspect, near, far}= options\n\t// \t\treturn new PerspectiveCamera(fov, aspect, near, far);\n\t// \t},\n\t// \tareaLight: (options:AreaLightOptions) => {\n\t// \t\tregisterObjectType({type: ObjectType.AREA_LIGHT, ctor: RectAreaLight, humanName: 'AreaLight'});\n\t// \t\tconst  {color, intensity, width, height}=options\n\t// \t\treturn new RectAreaLight(color, intensity, width, height);\n\t// \t},\n\t// \tspotLight: () => {\n\t// \t\tregisterObjectType({type: ObjectType.SPOT_LIGHT, ctor: SpotLight, humanName: ObjectType.SPOT_LIGHT});\n\t// \t\treturn new SpotLight();\n\t// \t},\n\t// \tspotLightUpdate: <L extends SpotLight>(options:SpotLightUpdateOptions<L>) => {},\n\t// };\n}\n\nexport const CoreSceneObjectsFactory = CoreSceneObjectsFactoryClass.instance();\n","import {Ref} from '@vue/reactivity';\nimport {Vector2} from 'three';\n\nconst _cursorDelta = new Vector2();\nconst _currentCursorPos = new Vector2();\nexport class CursorMoveMonitor {\n\tprivate _lastCursorPosSet: boolean = false;\n\tprivate _movedCursorDistance: number = 0;\n\tprivate cursorRef: Ref<Vector2> | undefined;\n\tprivate _lastCursorPos = new Vector2();\n\n\tconstructor() {}\n\tprivate _bound = {\n\t\tpointermove: this._onPointermove.bind(this),\n\t};\n\taddPointermoveEventListener(cursorRef: Ref<Vector2>) {\n\t\tthis.cursorRef = cursorRef;\n\t\tthis._movedCursorDistance = 0;\n\t\tthis._lastCursorPosSet = false;\n\t\tdocument.addEventListener('pointermove', this._bound.pointermove);\n\t\tdocument.addEventListener('touchmove', this._bound.pointermove);\n\t}\n\tremoveEventListener() {\n\t\tdocument.removeEventListener('pointermove', this._bound.pointermove);\n\t\tdocument.removeEventListener('touchmove', this._bound.pointermove);\n\t}\n\tmovedCursorDistance() {\n\t\treturn this._movedCursorDistance;\n\t}\n\tprivate _onPointermove() {\n\t\tif (!this.cursorRef) {\n\t\t\treturn;\n\t\t}\n\t\tconst cursor = this.cursorRef.value;\n\t\tif (this._lastCursorPosSet == false) {\n\t\t\tthis._lastCursorPos.copy(cursor);\n\t\t\tthis._lastCursorPosSet = true;\n\t\t}\n\t\t_currentCursorPos.copy(cursor);\n\t\t_cursorDelta.copy(_currentCursorPos).sub(this._lastCursorPos);\n\t\t// we divide by 2 because the cursor is in the [-1,1] range\n\t\t// and covering the whole screen would give a length of 2.\n\t\t// But it's easier to think in term of [0,1] range\n\t\tthis._movedCursorDistance += _cursorDelta.manhattanLength() / 2;\n\t\tthis._lastCursorPos.copy(_currentCursorPos);\n\t}\n}\n","import {BaseNodeType} from '../engine/nodes/_Base';\nimport {BaseParamType} from '../engine/params/_Base';\nimport {CoreWalker} from './Walker';\nimport {CoreGraphNodeId} from './graph/CoreGraph';\ntype NodeOrParam = BaseNodeType | BaseParamType;\n\ninterface PathElement {\n\tpath: string;\n\tnode: NodeOrParam;\n}\ninterface NamedNode {\n\tname: string;\n\tnode: NodeOrParam;\n}\nexport class DecomposedPath {\n\tprivate _index = -1;\n\tprivate _pathElements: Array<PathElement | null> = [];\n\tprivate _namedNodes: Array<NamedNode | null> = [];\n\tprivate _graphNodeIds: CoreGraphNodeId[] = [];\n\tprivate _nodeElementByGraphNodeId: Map<CoreGraphNodeId, string> = new Map();\n\tprivate _absolutePath: string = '/';\n\n\tconstructor() {}\n\treset() {\n\t\tthis._index = -1;\n\t\tthis._pathElements = [];\n\t\tthis._namedNodes = [];\n\t\tthis._graphNodeIds = [];\n\t\tthis._nodeElementByGraphNodeId.clear();\n\t}\n\n\taddNamedNode(namedNode: NamedNode) {\n\t\tthis._index += 1;\n\t\tif (namedNode.name == namedNode.node.name()) {\n\t\t\tthis._namedNodes[this._index] = namedNode;\n\t\t}\n\n\t\tthis._graphNodeIds[this._index] = namedNode.node.graphNodeId();\n\t\tthis._nodeElementByGraphNodeId.set(namedNode.node.graphNodeId(), namedNode.name);\n\t\tthis._absolutePath = [this._absolutePath, namedNode.name].join(CoreWalker.SEPARATOR);\n\t}\n\taddPathElement(pathElement: PathElement) {\n\t\tthis._index += 1;\n\t\tthis._pathElements[this._index] = pathElement;\n\t\tif (pathElement.node) {\n\t\t\tthis._absolutePath = pathElement.node.path();\n\t\t}\n\t}\n\n\tnamedGraphNodes() {\n\t\treturn this._namedNodes;\n\t}\n\tnamedNodes(target: BaseNodeType[]) {\n\t\ttarget.length = 0;\n\t\tfor (const namedNode of this._namedNodes) {\n\t\t\tif (namedNode) {\n\t\t\t\tconst node = namedNode.node as BaseNodeType;\n\t\t\t\tif (node.nameController) {\n\t\t\t\t\ttarget.push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t}\n\n\tupdateFromNameChange(node: NodeOrParam) {\n\t\tconst namedGraphNodeIds = this._namedNodes.map((n) => n?.node.graphNodeId());\n\n\t\tif (namedGraphNodeIds.includes(node.graphNodeId())) {\n\t\t\tthis._nodeElementByGraphNodeId.set(node.graphNodeId(), node.name());\n\t\t}\n\t}\n\n\ttoPath(): string {\n\t\tconst elements = new Array<string>(this._index);\n\t\tfor (let i = 0; i <= this._index; i++) {\n\t\t\tconst namedNode = this._namedNodes[i];\n\t\t\tif (namedNode) {\n\t\t\t\tconst nodeName = this._nodeElementByGraphNodeId.get(namedNode.node.graphNodeId());\n\t\t\t\tif (nodeName) {\n\t\t\t\t\telements[i] = nodeName;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst pathElement = this._pathElements[i];\n\t\t\t\tif (pathElement) {\n\t\t\t\t\telements[i] = pathElement.path;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet joinedPath = elements.join(CoreWalker.SEPARATOR);\n\t\t// if the first character is a letter, we need to prefix with /\n\t\tconst firstChar = joinedPath[0];\n\t\tif (firstChar) {\n\t\t\tif (!CoreWalker.NON_LETTER_PREFIXES.includes(firstChar)) {\n\t\t\t\tjoinedPath = `${CoreWalker.SEPARATOR}${joinedPath}`;\n\t\t\t}\n\t\t}\n\t\treturn joinedPath;\n\t}\n\ttoAbsolutePath(): string {\n\t\treturn this._absolutePath;\n\t}\n}\n","const CONTEXT_MENU_DISABLER = (event: MouseEvent) => {\n\tevent.preventDefault();\n\treturn false;\n};\n\nexport function disableContextMenu() {\n\tdocument.addEventListener('contextmenu', CONTEXT_MENU_DISABLER);\n}\nexport function enableContextMenu() {\n\tdocument.removeEventListener('contextmenu', CONTEXT_MENU_DISABLER);\n}\nexport function isHTMLVideoElementLoaded(videoElement: HTMLVideoElement) {\n\treturn videoElement.readyState === 4;\n}\nexport function isHTMLVideoPaused(videoElement: HTMLVideoElement) {\n\treturn videoElement.paused;\n}\n\nexport function observeStyleChange(element: HTMLElement) {\n\tconst Observe = (element: HTMLElement, opt: any, cb: any) => {\n\t\tconst Obs = new MutationObserver((m) => [...m].forEach(cb));\n\t\tObs.observe(element, opt);\n\t};\n\tObserve(\n\t\telement,\n\t\t{\n\t\t\tattributesList: ['style'], // Only the \"style\" attribute\n\t\t\tattributeOldValue: true, // Report also the oldValue\n\t\t},\n\t\t(m: any) => {\n\t\t\tconsole.log('m');\n\t\t\tconsole.warn(m); // Mutation object\n\t\t}\n\t);\n}\n","import type {Vector2} from 'three';\n\nexport class EventHelper {\n\tconstructor(private element: HTMLElement) {}\n\n\tsetElement(element: HTMLElement) {\n\t\tthis.element = element;\n\t}\n\n\tstatic elementPosition(event: TouchEvent | MouseEvent | PointerEvent, element: HTMLElement, position: Vector2) {\n\t\tconst dim = element.getBoundingClientRect();\n\n\t\tif ((event as TouchEvent).changedTouches) {\n\t\t\tevent = event as TouchEvent;\n\t\t\tconst touch = event.changedTouches[0];\n\t\t\tposition.x = touch.pageX - dim.x;\n\t\t\tposition.y = touch.pageY - dim.y;\n\t\t} else {\n\t\t\tevent = event as MouseEvent;\n\t\t\tposition.x = event.pageX - dim.x;\n\t\t\tposition.y = event.pageY - dim.y;\n\t\t}\n\t}\n\n\tstatic normalizedPosition(event: TouchEvent | MouseEvent | PointerEvent, element: HTMLElement, position: Vector2) {\n\t\tthis.elementPosition(event, element, position);\n\n\t\tconst dim = element.getBoundingClientRect();\n\n\t\tposition.x = ((position.x - globalThis.scrollX) / dim.width) * 2 - 1;\n\t\tposition.y = -(((position.y - globalThis.scrollY) / dim.height) * 2 - 1);\n\t}\n\tstatic normalized_position_0_1(\n\t\tevent: TouchEvent | MouseEvent | PointerEvent,\n\t\telement: HTMLElement,\n\t\tposition: Vector2\n\t) {\n\t\tthis.elementPosition(event, element, position);\n\n\t\tconst dim = element.getBoundingClientRect();\n\n\t\tposition.x = (position.x - globalThis.scrollX) / dim.width;\n\t\tposition.y = (position.y - globalThis.scrollY) / dim.height;\n\t}\n\n\telementPosition(event: TouchEvent | MouseEvent | PointerEvent, position: Vector2) {\n\t\tEventHelper.elementPosition(event, this.element, position);\n\t}\n\n\tnormalizedPosition(event: TouchEvent | MouseEvent | PointerEvent, position: Vector2) {\n\t\tEventHelper.normalizedPosition(event, this.element, position);\n\t}\n}\n","export class CoreFeaturesController {\n\tstatic urlParams() {\n\t\t// do not cache the url params, in case the url is changed via\n\t\t// globalThis.history.replaceState('', '', globalThis.location.pathname);\n\t\treturn new URLSearchParams(globalThis.location.search);\n\t}\n\tstatic urlParam(paramName: string) {\n\t\treturn this.urlParams().get(paramName);\n\t}\n\tstatic noAssemblers(): boolean {\n\t\treturn this.urlParam('noassemblers') == '1';\n\t}\n\tstatic debugLoadProgress(): boolean {\n\t\treturn this.urlParam('debugLoadProgress') == '1';\n\t}\n\tstatic testBatchId(): number {\n\t\tconst testBatchIdStr = this.urlParam('testBatchId');\n\t\tif (testBatchIdStr) {\n\t\t\treturn parseInt(testBatchIdStr);\n\t\t}\n\t\treturn -1;\n\t}\n}\n","export const VIDEO_EXTENSIONS = ['mp4', 'ogv', 'ogg', 'webm'];\nexport enum ImageExtension {\n\tGIF = 'gif',\n\tJPG = 'jpg',\n\tJPEG = 'jpeg',\n\tPNG = 'png',\n\tEXR = 'exr',\n\tKTX2 = 'ktx2',\n\tHDR = 'hdr',\n\tWEBP = 'webp',\n}\nexport const IMAGE_EXTENSIONS: string[] = [\n\tImageExtension.GIF,\n\tImageExtension.JPEG,\n\tImageExtension.JPG,\n\tImageExtension.PNG,\n\tImageExtension.EXR,\n\tImageExtension.KTX2,\n\tImageExtension.HDR,\n\tImageExtension.WEBP,\n];\nexport enum GeometryExtension {\n\tTDS = '3DS',\n\tDRC = 'drc',\n\tFBX = 'fbx',\n\tGEOJSON = 'geojson',\n\tGLTF = 'gltf',\n\tGLB = 'glb',\n\tIFC = 'ifc',\n\tJSON = 'json',\n\tMPD = 'mpd',\n\tOBJ = 'obj',\n\tPDB = 'pdb',\n\tPLY = 'ply',\n\tSTEP = 'step',\n\tSTL = 'stl',\n\tSVG = 'svg',\n\tUSDZ = 'usdz',\n\tVOX = 'vox',\n}\nexport const GEOMETRY_EXTENSIONS: string[] = [\n\tGeometryExtension.DRC,\n\tGeometryExtension.FBX,\n\tGeometryExtension.GEOJSON,\n\tGeometryExtension.GLTF,\n\tGeometryExtension.GLB,\n\tGeometryExtension.IFC,\n\tGeometryExtension.JSON,\n\tGeometryExtension.MPD,\n\tGeometryExtension.OBJ,\n\tGeometryExtension.PDB,\n\tGeometryExtension.PLY,\n\tGeometryExtension.STEP,\n\tGeometryExtension.STL,\n\tGeometryExtension.SVG,\n\tGeometryExtension.USDZ,\n\tGeometryExtension.VOX,\n];\nexport enum SDFExtension {\n\tBIN = 'bin',\n}\nexport const SDF_EXTENSIONS: string[] = [SDFExtension.BIN];\n\nexport enum AudioExtension {\n\tMP3 = 'mp3',\n\tWAV = 'wav',\n\tOGG = 'ogg',\n}\nexport const AUDIO_EXTENSIONS: string[] = [AudioExtension.MP3, AudioExtension.WAV, AudioExtension.OGG];\n\nexport enum FontExtension {\n\tTTF = 'ttf',\n\tJSON = 'json',\n}\nexport const FONT_EXTENSIONS: string[] = [FontExtension.TTF, FontExtension.JSON];\n\nfunction urlExt(url: string) {\n\tconst url_without_query_params = url.split('?')[0];\n\tconst url_elements = url_without_query_params.split('.');\n\tif (url_elements.length == 1) {\n\t\treturn;\n\t}\n\tconst ext = url_elements[url_elements.length - 1];\n\treturn ext;\n}\n/**\n *\n * isExt...\n *\n */\nexport function isExtVideo(ext: string) {\n\treturn VIDEO_EXTENSIONS.includes(ext);\n}\nexport function isExtStaticImage(ext: string) {\n\treturn IMAGE_EXTENSIONS.includes(ext);\n}\nexport function isExtGif(ext: string) {\n\treturn ext == ImageExtension.GIF;\n}\nexport function isExtGeometry(ext: string) {\n\treturn GEOMETRY_EXTENSIONS.includes(ext);\n}\nexport function isExtSDF(ext: string) {\n\treturn SDF_EXTENSIONS.includes(ext);\n}\nexport function isExtAudio(ext: string) {\n\treturn AUDIO_EXTENSIONS.includes(ext);\n}\n/**\n *\n * isUrl...\n *\n */\nexport function isUrlVideo(url: string): boolean {\n\tconst ext = urlExt(url);\n\treturn ext != null ? isExtVideo(ext.toLowerCase()) : false;\n}\nexport function isUrlStaticImage(url: string) {\n\tconst ext = urlExt(url);\n\treturn ext != null ? isExtStaticImage(ext.toLowerCase()) : false;\n}\nexport function isUrlGif(url: string) {\n\tconst ext = urlExt(url);\n\treturn ext != null ? isExtGif(ext.toLowerCase()) : false;\n}\nexport function isUrlGeometry(url: string) {\n\tconst ext = urlExt(url);\n\treturn ext != null ? isExtGeometry(ext.toLowerCase()) : false;\n}\nexport function isUrlAudio(url: string) {\n\tconst ext = urlExt(url);\n\treturn ext != null ? isExtAudio(ext.toLowerCase()) : false;\n}\n","// import jimp from 'jimp';\n// jimp.js is now async,\n// and created via packs/jimp.ts\n\n// import {Texture} from 'three'\n// import {Color} from 'three'\n\nexport class CoreImage {\n\t// constructor() {}\n\n\t// https://stackoverflow.com/questions/6765370/merge-image-using-javascript\n\tstatic overlay(img0: HTMLImageElement, img1: HTMLImageElement): Promise<HTMLImageElement> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet canvas = document.createElement('canvas');\n\t\t\tcanvas.width = Math.max(img0.width, img1.width);\n\t\t\tcanvas.height = Math.max(img0.height, img1.height);\n\t\t\tlet context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n\t\t\tcontext.drawImage(img0, 0, 0, img0.width, img0.height);\n\t\t\tcontext.drawImage(img1, 0, 0, img1.width, img1.height);\n\t\t\tconst datauri = canvas.toDataURL('image/png');\n\t\t\tconst img = new Image();\n\t\t\timg.onload = () => {\n\t\t\t\tresolve(img);\n\t\t\t};\n\t\t\timg.src = datauri;\n\t\t});\n\t}\n\n\t// static image_from_path(url: string): Promise<HTMLImageElement> {\n\t// \treturn new Promise((resolve, reject) => {\n\t// \t\tconst img = new Image();\n\n\t// \t\timg.onload = function() {\n\t// \t\t\tresolve(img);\n\t// \t\t};\n\n\t// \t\timg.src = url;\n\t// \t});\n\t// }\n\t// static image_from_color(color: THREE.Color, width: number, height: number): Promise<HTMLImageElement> {\n\t// \treturn new Promise((resolve, reject) => {\n\t// \t\tconst image = new Image();\n\n\t// \t\tconst canvas = document.createElement('canvas');\n\t// \t\tcanvas.width = width;\n\t// \t\tcanvas.height = height;\n\t// \t\tconst context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\t// \t\tcontext.fillStyle = color.getStyle();\n\t// \t\tcontext.fillRect(0, 0, canvas.width, canvas.height);\n\t// \t\tconst data_url = canvas.toDataURL();\n\t// \t\timage.onload = () => {\n\t// \t\t\tresolve(image);\n\t// \t\t};\n\t// \t\timage.src = data_url;\n\t// \t});\n\t// }\n\t// static image_from_texture(texture: THREE.Texture): Promise<HTMLImageElement | null> {\n\t// \treturn new Promise((resolve, reject) => {\n\t// \t\tif (texture.image) {\n\t// \t\t\tif (texture.image.data) {\n\t// \t\t\t\tconst image = new Image();\n\t// \t\t\t\timage.width = texture.image.width;\n\t// \t\t\t\timage.height = texture.image.height;\n\t// \t\t\t\tconst datauri = this.image_data_to_data_uri(texture.image);\n\t// \t\t\t\timage.onload = () => {\n\t// \t\t\t\t\tresolve(image);\n\t// \t\t\t\t};\n\t// \t\t\t\timage.src = datauri;\n\t// \t\t\t} else {\n\t// \t\t\t\tresolve(texture.image);\n\t// \t\t\t}\n\t// \t\t} else {\n\t// \t\t\tresolve(null);\n\t// \t\t}\n\t// \t});\n\t// }\n\t// static image_to_datauri(image: HTMLImageElement): string {\n\t// \tconst canvas = document.createElement('canvas');\n\t// \tcanvas.width = image.width;\n\t// \tcanvas.height = image.height;\n\t// \tconst context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\t// \t// context.fillRect(0, 0, canvas.width, canvas.height)\n\t// \tcontext.drawImage(image, 0, 0);\n\t// \treturn canvas.toDataURL();\n\t// }\n\t// static image_data_to_data_uri(image_data: ImageData): string {\n\t// \tconst canvas = document.createElement('canvas');\n\t// \tconst context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\t// \tcanvas.width = image_data.width;\n\t// \tcanvas.height = image_data.height;\n\n\t// \t// let stride\n\t// \t// let color\n\t// \t// lodash_times(canvas.width, (w)=>{\n\t// \t// \tlodash_times(canvas.height, (h)=>{\n\t// \t// \t\tstride = 4 * (w + h*w)\n\t// \t// \t\tcolor = new THREE.Color(\n\t// \t// \t\t\timage_data.data[stride],\n\t// \t// \t\t\timage_data.data[stride+1],\n\t// \t// \t\t\timage_data.data[stride+2]\n\t// \t// \t\t)\n\t// \t// \t\tcontext.fillStyle = color.getStyle()\n\t// \t// \t\tcontext.fillRect(w, h, 1, 1)\n\t// \t// \t})\n\t// \t// })\n\n\t// \t// const color = new THREE.Color(0,1,1)\n\t// \t// context.fillStyle = color.getStyle()\n\t// \t// context.fillRect(0, 0, canvas.width, canvas.height)\n\t// \t// // context.putImageData(image_data.data, 0, 0)\n\t// \tconst context_imaged_data = context.getImageData(0, 0, canvas.width, canvas.height);\n\t// \t// image_data.data = image_data.data.map(d=>d*255)\n\t// \tcontext_imaged_data.data.set(image_data.data.map((d) => d * 255));\n\t// \tcontext.putImageData(context_imaged_data, 0, 0);\n\t// \t// document.body.appendChild(canvas)\n\t// \t// document.body.style.overflow = 'auto'\n\t// \treturn canvas.toDataURL();\n\t// }\n\t// static datauri_from_texture(texture: THREE.Texture): string | null {\n\t// \tif (texture.image) {\n\t// \t\tif (texture.image.data) {\n\t// \t\t\treturn this.image_data_to_data_uri(texture.image);\n\t// \t\t} else {\n\t// \t\t\treturn this.image_to_datauri(texture.image);\n\t// \t\t}\n\t// \t} else {\n\t// \t\tconsole.warn(texture);\n\t// \t\treturn null;\n\t// \t}\n\t// }\n\n\tstatic create_white_image(width: number, height: number): Promise<HTMLImageElement> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tlet context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\t\tcontext.beginPath();\n\t\t\tcontext.rect(0, 0, width, height);\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fill();\n\t\t\tconst datauri = canvas.toDataURL('image/png');\n\t\t\tconst img = new Image();\n\t\t\timg.onload = () => {\n\t\t\t\tresolve(img);\n\t\t\t};\n\t\t\timg.src = datauri;\n\t\t});\n\t}\n\tstatic make_square(src_img: HTMLImageElement): Promise<HTMLImageElement> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet canvas = document.createElement('canvas');\n\t\t\tconst size = Math.min(src_img.width, src_img.height);\n\t\t\tconst ratio = src_img.width / src_img.height;\n\t\t\tcanvas.width = size;\n\t\t\tcanvas.height = size;\n\t\t\tlet context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n\t\t\tconst is_landscape = ratio > 1;\n\t\t\tconst margin = is_landscape ? (src_img.width - size) / 2 : (src_img.height - size) / 2;\n\n\t\t\tif (is_landscape) {\n\t\t\t\tcontext.drawImage(src_img, margin, 0, size, size, 0, 0, size, size);\n\t\t\t} else {\n\t\t\t\tcontext.drawImage(src_img, 0, margin, size, size, 0, 0, size, size);\n\t\t\t}\n\n\t\t\tconst datauri = canvas.toDataURL('image/png');\n\t\t\tconst img = new Image();\n\t\t\timg.onload = () => {\n\t\t\t\tresolve(img);\n\t\t\t};\n\t\t\timg.src = datauri;\n\t\t});\n\t}\n\n\t// static async cover(img: HTMLImageElement, width: number, height: number){\n\t// \tawait CoreScriptLoader.load_jimp()\n\t// \tconst jimp_img = await self.jimp.read(img.src)\n\t// \treturn jimp_img.cover(width, height)\n\t// }\n\n\t// static async jimp_to_img(jimp_img): Promise<HTMLImageElement>{\n\t// \treturn new Promise(async (resolve, reject)=>{\n\t// \t\tawait CoreScriptLoader.load_jimp()\n\t// \t\tjimp_img.getBase64(self.jimp.MIME_PNG, (err, src) => {\n\t// \t\t\tconst img = document.createElement('img');\n\t// \t\t\timg.onload = ()=>{\n\t// \t\t\t\tresolve(img)\n\t// \t\t\t}\n\t// \t\t\timg.src = src\n\t// \t\t})\n\t// \t})\n\t// }\n\n\tstatic async image_to_blob(img: HTMLImageElement): Promise<Blob> {\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\ttry {\n\t\t\t\tlet xhr = new XMLHttpRequest();\n\t\t\t\txhr.open('GET', img.src);\n\t\t\t\txhr.responseType = 'blob';\n\t\t\t\txhr.onerror = function () {\n\t\t\t\t\treject('Network error.');\n\t\t\t\t};\n\t\t\t\txhr.onload = function () {\n\t\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\t\tresolve(xhr.response);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject('Loading error:' + xhr.statusText);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\txhr.send();\n\t\t\t} catch (err) {\n\t\t\t\treject((err as Error).message);\n\t\t\t}\n\t\t});\n\t}\n\n\tstatic data_from_url(url: string): Promise<ImageData | undefined> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst img = new Image();\n\t\t\timg.crossOrigin = 'Anonymous';\n\t\t\timg.onload = () => {\n\t\t\t\tconst data = this.data_from_image(img);\n\t\t\t\tresolve(data);\n\t\t\t};\n\t\t\timg.onerror = () => {\n\t\t\t\tresolve(undefined);\n\t\t\t};\n\t\t\timg.src = url;\n\t\t});\n\t}\n\tstatic data_from_image(img: HTMLImageElement): ImageData {\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = img.width;\n\t\tcanvas.height = img.height;\n\t\tconst context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tcontext.drawImage(img, 0, 0, img.width, img.height);\n\t\t// canvas.style.width = `${img.width}px`;\n\t\t// canvas.style.height = `${img.height}px`;\n\t\t// document.body.appendChild(canvas);\n\t\t// document.body.style.overflow = 'auto';\n\t\treturn context.getImageData(0, 0, img.width, img.height);\n\t}\n}\n","type GroupByCallback<T, K> = (arg: T) => K;\n\nexport function mapFirstKey<K>(map: Map<K, any>): K | undefined {\n\tfor (const [k] of map) {\n\t\treturn k;\n\t}\n}\nexport function pushOnArrayAtEntry<K, V>(map: Map<K, V[]>, key: K, newElement: V) {\n\tif (map.has(key)) {\n\t\tmap.get(key)!.push(newElement);\n\t} else {\n\t\tmap.set(key, [newElement]);\n\t}\n}\nexport function popFromArrayAtEntry<K, V>(map: Map<K, V[]>, key: K, elementToRemove: V, removeFromMapIfEmpty = true) {\n\tif (map.has(key)) {\n\t\tconst array = map.get(key)!;\n\t\tconst index = array.indexOf(elementToRemove);\n\t\tif (index >= 0) {\n\t\t\tarray.splice(index, 1);\n\t\t\tif (removeFromMapIfEmpty && array.length == 0) {\n\t\t\t\tmap.delete(key);\n\t\t\t}\n\t\t}\n\t}\n}\nexport function addToSetAtEntry<K, V>(map: Map<K, Set<V>>, key: K, newElement: V) {\n\tif (map.has(key)) {\n\t\tmap.get(key)!.add(newElement);\n\t} else {\n\t\tconst set: Set<V> = new Set();\n\t\tset.add(newElement);\n\t\tmap.set(key, set);\n\t}\n}\nexport function addToMapAtEntry<K0, K1, V>(map: Map<K0, Map<K1, V>>, key0: K0, key1: K1, newElement: V) {\n\tlet subMap = map.get(key0);\n\tif (!subMap) {\n\t\tsubMap = new Map();\n\t\tmap.set(key0, subMap);\n\t}\n\tsubMap.set(key1, newElement);\n}\nexport function getMapElementAtEntry<K0, K1, V>(map: Map<K0, Map<K1, V>>, key0: K0, key1: K1): V | undefined {\n\tlet subMap = map.get(key0);\n\tif (!subMap) {\n\t\treturn;\n\t}\n\treturn subMap.get(key1);\n}\nexport function mapValuesToArray<K, V>(map: Map<K, V>, target: Array<V>): Array<V> {\n\ttarget.length = 0;\n\tmap.forEach((v) => {\n\t\ttarget.push(v);\n\t});\n\treturn target;\n}\nexport function removeFromSetAtEntry<K, V>(map: Map<K, Set<V>>, key: K, elementToRemove: V) {\n\tif (map.has(key)) {\n\t\tconst set = map.get(key)!;\n\t\tset.delete(elementToRemove);\n\t\tif (set.size == 0) {\n\t\t\tmap.delete(key);\n\t\t}\n\t}\n}\nexport function unshiftOnArrayAtEntry<K, V>(map: Map<K, V[]>, key: K, newElement: V) {\n\tif (map.has(key)) {\n\t\tmap.get(key)!.unshift(newElement);\n\t} else {\n\t\tmap.set(key, [newElement]);\n\t}\n}\nexport function concatOnArrayAtEntry<K, V>(map: Map<K, V[]>, key: K, newElements: V[]) {\n\tif (map.has(key)) {\n\t\tlet array: V[] = map.get(key)!;\n\t\tfor (const element of newElements) {\n\t\t\tarray.push(element);\n\t\t}\n\t} else {\n\t\tmap.set(key, newElements);\n\t}\n}\n// export async function mapForEachSync<K, V>(map: Map<K, V>, callback: (v: V, k: K) => Promise<void>) {\n// \tconst values: V[] = [];\n// \tconst keys: K[] = [];\n// \tmap.forEach((value, key) => {\n// \t\tvalues.push(value);\n// \t\tkeys.push(key);\n// \t});\n// \tfor (let i = 0; i < values.length; i++) {\n// \t\tconst key = keys[i];\n// \t\tconst value = values[i];\n// \t\tawait callback(value, key);\n// \t}\n// }\nexport function mapGroupBy<T, K>(array: readonly T[], callback: GroupByCallback<T, K>): Map<K, T[]> {\n\tconst map = new Map<K, T[]>();\n\tarray.forEach((element: T) => {\n\t\tconst key: K = callback(element);\n\t\tpushOnArrayAtEntry(map, key, element);\n\t});\n\treturn map;\n}\nexport function mapIncrementAtEntry<K>(map: Map<K, number>, key: K, initValue: number): number {\n\tlet entry = map.get(key);\n\tif (entry == null) {\n\t\tentry = initValue;\n\t}\n\tentry++;\n\tmap.set(key, entry);\n\treturn entry;\n}\nexport function mapEntriesCount<K, V>(map: Map<K, V>): number {\n\tlet count = 0;\n\tmap.forEach(() => {\n\t\tcount++;\n\t});\n\treturn count;\n}\nexport class MapUtils {\n\t// static arrayFromValues = mapValuesToArray;\n\tstatic pushOnArrayAtEntry = pushOnArrayAtEntry;\n\tstatic addToSetAtEntry = addToSetAtEntry;\n\tstatic popFromArrayAtEntry = popFromArrayAtEntry;\n\tstatic removeFromSetAtEntry = removeFromSetAtEntry;\n\tstatic unshiftOnArrayAtEntry = unshiftOnArrayAtEntry;\n\tstatic concatOnArrayAtEntry = concatOnArrayAtEntry;\n\t// static forEachSync = mapForEachSync;\n\tstatic groupBy = mapGroupBy;\n\tstatic incrementAtEntry = mapIncrementAtEntry;\n\tstatic firstKey = mapFirstKey;\n}\n","export enum MouseButton {\n\tLEFT = 0,\n\tMIDDLE = 1,\n\tRIGHT = 2,\n}\nexport enum MouseButtons {\n\tNONE = 0,\n\tLEFT = 1,\n\tRIGHT = 2,\n\tLEFT_RIGHT = 3,\n\tMIDDLE = 4,\n\tLEFT_MIDDLE = 5,\n\tMIDDLE_RIGHT = 6,\n\tLEFT_MIDDLE_RIGHT = 7,\n}\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\nexport const MOUSE_BUTTONS: MouseButton[][] = [\n\t/*0*/ [],\n\t/*1*/ [MouseButton.LEFT],\n\t/*2*/ [MouseButton.RIGHT],\n\t/*3*/ [MouseButton.LEFT, MouseButton.RIGHT],\n\t/*4*/ [MouseButton.MIDDLE],\n\t/*5*/ [MouseButton.LEFT, MouseButton.MIDDLE],\n\t/*6*/ [MouseButton.MIDDLE, MouseButton.RIGHT],\n\t/*7*/ [MouseButton.LEFT, MouseButton.MIDDLE, MouseButton.RIGHT],\n];\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","/**\n * A specialized version of `_.forEach` 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 * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nexport default arrayEach;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nexport default assignValue;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nexport default copyObject;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nexport default baseTimes;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default baseKeys;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import copyObject from './_copyObject.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nexport default baseAssign;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default nativeKeysIn;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default baseKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nexport default baseAssignIn;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nexport default cloneBuffer;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nexport default copyArray;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nexport default getSymbols;\n","import copyObject from './_copyObject.js';\nimport getSymbols from './_getSymbols.js';\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nexport default copySymbols;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nexport default arrayPush;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","import arrayPush from './_arrayPush.js';\nimport getPrototype from './_getPrototype.js';\nimport getSymbols from './_getSymbols.js';\nimport stubArray from './stubArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nexport default getSymbolsIn;\n","import copyObject from './_copyObject.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nexport default copySymbolsIn;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nexport default getAllKeysIn;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nexport default getTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nexport default initCloneArray;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nexport default initCloneByTag;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nexport default baseCreate;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nexport default initCloneObject;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nexport default baseClone;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n  return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n","import {arrayIsEqual} from './ArrayUtils';\nimport {isBoolean,isNumber,isString,isObject} from './Type';\nimport cloneDeep from 'lodash-es/cloneDeep';\nimport clone from 'lodash-es/clone';\n\nexport function getObjectMethodNames(obj: any): string[] {\n\tlet properties = new Set();\n\tlet currentObj = obj;\n\tdo {\n\t\tObject.getOwnPropertyNames(currentObj).map((item) => properties.add(item));\n\t} while ((currentObj = Object.getPrototypeOf(currentObj)));\n\treturn [...properties.keys()].filter((item) => typeof (obj as any)[item as string] === 'function') as string[];\n}\nexport function objectIsEqual(object0: any, object1: any): boolean {\n\tif (isBoolean(object0) && isBoolean(object1)) {\n\t\treturn object0 == object1;\n\t}\n\tif (isNumber(object0) && isNumber(object1)) {\n\t\treturn object0 == object1;\n\t}\n\tif (isString(object0) && isString(object1)) {\n\t\treturn object0 == object1;\n\t}\n\n\tif (isObject(object0) && isObject(object1)) {\n\t\tconst keys0 = Object.keys(object0);\n\t\tconst keys1 = Object.keys(object1);\n\t\tif (!arrayIsEqual(keys0, keys1)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn JSON.stringify(object0) == JSON.stringify(object1);\n\t}\n\treturn false;\n}\nexport function objectMerge(object0: object, object1: object): object {\n\treturn Object.assign(object0, object1);\n}\nexport function objectClone<T extends Array<any> | object | undefined>(value: T): T {\n\t// return this.cloneDeep(value);\n\treturn clone(value);\n\t// if (value) {\n\t// \tif (isArray(value)) {\n\t// \t\tconst newValues: Array<any> = value.map((v) => v);\n\t// \t\treturn newValues as T;\n\t// \t} else {\n\t// \t\treturn {...value};\n\t// \t}\n\t// }\n\t// return value;\n}\nexport function objectCloneDeep<T extends object | number | string | boolean | undefined>(value: T): T {\n\t// https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore/issues/121\n\t// let target = {};\n\t// for (const prop in src) {\n\t// \tif (src.hasOwnProperty(prop)) {\n\t// \t\tif ((src as any)[prop] != null && typeof (src as any)[prop] === 'object') {\n\t// \t\t\t(target as any)[prop] = this.cloneDeep((src as any)[prop]);\n\t// \t\t} else {\n\t// \t\t\t(target as any)[prop] = (src as any)[prop];\n\t// \t\t}\n\t// \t}\n\t// }\n\t// return target as T;\n\n\treturn cloneDeep(value);\n\t// if (isString(value) || isNumber(value) || isBoolean(value)) {\n\t// \treturn value;\n\t// }\n\t// if (this.isObject(value)) {\n\t// be careful, as this does not clone functions\n\t// \treturn JSON.parse(JSON.stringify(value));\n\t// }\n\t// return value;\n}\n","import {Raycaster} from 'three';\nimport {ThreeMeshBVHHelper} from './geometry/bvh/ThreeMeshBVHHelper';\n\nexport function createRaycaster() {\n\tconst raycaster = new Raycaster();\n\tThreeMeshBVHHelper.updateRaycaster(raycaster);\n\treturn raycaster;\n}\n","export function setFirstValue<K>(set: Set<K>): K | undefined {\n\tfor (const item of set) {\n\t\treturn item;\n\t}\n}\nlet i = 0;\nexport function setToArray<T>(set: Set<T>, target: T[]): T[] {\n\ttarget.length = set.size;\n\ti = 0;\n\tfor (const item of set) {\n\t\ttarget[i] = item;\n\t\ti++;\n\t}\n\treturn target;\n}\nexport function setCopy<T>(src: Set<T>, target: Set<T>): Set<T> {\n\ttarget.clear();\n\tfor (const item of src) {\n\t\ttarget.add(item);\n\t}\n\treturn target;\n}\nexport function setUnion<T extends string | number>(set0: Set<T>, set1: Set<T>, target: Set<T>): Set<T> {\n\ttarget.clear();\n\tfor (const item of set0) {\n\t\ttarget.add(item);\n\t}\n\tfor (const item of set1) {\n\t\ttarget.add(item);\n\t}\n\treturn target;\n}\nexport function setIntersection<T extends string | number>(set0: Set<T>, set1: Set<T>, target: Set<T>): Set<T> {\n\ttarget.clear();\n\tfor (const item of set0) {\n\t\tif (set1.has(item)) {\n\t\t\ttarget.add(item);\n\t\t}\n\t}\n\tfor (const item of set1) {\n\t\tif (set0.has(item)) {\n\t\t\ttarget.add(item);\n\t\t}\n\t}\n\treturn target;\n}\nexport function setDifference<T extends string | number>(set0: Set<T>, set1: Set<T>, target: Set<T>): Set<T> {\n\ttarget.clear();\n\tfor (const item of set0) {\n\t\tif (!set1.has(item)) {\n\t\t\ttarget.add(item);\n\t\t}\n\t}\n\treturn target;\n}\nexport function setXOR<T extends string | number>(set0: Set<T>, set1: Set<T>, target: Set<T>): Set<T> {\n\ttarget.clear();\n\tfor (const item of set0) {\n\t\tif (!set1.has(item)) {\n\t\t\ttarget.add(item);\n\t\t}\n\t}\n\tfor (const item of set1) {\n\t\tif (!set0.has(item)) {\n\t\t\ttarget.add(item);\n\t\t}\n\t}\n\treturn target;\n}\n","export class CoreSleep {\n\tstatic sleep(time: number): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tresolve();\n\t\t\t}, time);\n\t\t});\n\t}\n}\n","import {isNumberValid} from './Type';\nimport {arrayPushItems, arrayUniq, range} from './ArrayUtils';\n\nconst ATTRIB_NAMES_SEPARATOR = /[, ]/; //[',', ' ']\n\n// const LETTERS = 'abcdefghijklmnopqrstuvwxyz'\n// const LETTERS_UPPERCASE = LETTERS.toUpperCase()\n// const NUMBERS = '0123645789'\n// const ALL = LETTERS + LETTERS_UPPERCASE + NUMBERS\n\nconst TAIL_DIGIT_MATCH_REGEXP = /\\d+$/;\nconst LEADING_ZEROS_MATCH_REGEXP = /^0+/;\n// const DIGIT_PREDEDED_BY_UNDERSCOPE = /_\\d$/\nconst INDICES_LIST_SEPARATOR = /,| /;\nconst ZERO = '0';\nconst SPACE = ' ';\nconst RANGE_SEPARATOR = '-';\n\n// https://stackoverflow.com/questions/41856126/regexp-optional-dot-in-a-decimal-number\nconst NUM_REGEXP = /^-?\\d+\\.?\\d*$/;\nenum BooleanString {\n\tTRUE = 'true',\n\tFALSE = 'false',\n}\nexport function stringIsBoolean(word: string): boolean {\n\treturn word == BooleanString.TRUE || word == BooleanString.FALSE;\n}\nexport function stringToBoolean(word: string): boolean {\n\treturn word == BooleanString.TRUE;\n}\nexport function stringIsNumber(word: string): boolean {\n\treturn NUM_REGEXP.test(word);\n}\nexport function sanitizeName(word: string): string {\n\tword = word.replace(/[^A-Za-z0-9]/g, '_');\n\tword = word.replace(/^[0-9]/, '_'); // replace first char if not a letter\n\treturn word;\n}\n\nlet _tmp: string[] = [];\nexport function stringToAttribNames(word: string, target: string[]): string[] {\n\tconst elements = word.split(ATTRIB_NAMES_SEPARATOR);\n\t_tmp.length = 0;\n\tfor (const element of elements) {\n\t\tconst trimmed = element.trim();\n\t\tif (trimmed.length > 0) {\n\t\t\t_tmp.push(trimmed);\n\t\t}\n\t}\n\tarrayUniq(_tmp, target);\n\treturn target;\n}\nexport function stringTailDigits(word: string): number {\n\tconst match = word.match(TAIL_DIGIT_MATCH_REGEXP);\n\tif (match) {\n\t\treturn parseInt(match[0]);\n\t} else {\n\t\treturn 0;\n\t}\n}\nexport function stringIncrement(word: string): string {\n\tconst match = word.match(TAIL_DIGIT_MATCH_REGEXP);\n\tif (match) {\n\t\tlet numbers_as_str = match[0];\n\t\tlet zeros_prefix: string = '';\n\t\tconst leading_zeros_match = numbers_as_str.match(LEADING_ZEROS_MATCH_REGEXP);\n\t\tif (leading_zeros_match) {\n\t\t\tzeros_prefix = leading_zeros_match[0];\n\t\t}\n\n\t\tconst digits = parseInt(numbers_as_str);\n\t\tif (digits == 0) {\n\t\t\tif (zeros_prefix.length > 0) {\n\t\t\t\tif (zeros_prefix[zeros_prefix.length - 1] == ZERO) {\n\t\t\t\t\tzeros_prefix = zeros_prefix.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst prefix = word.substring(0, word.length - match[0].length);\n\t\treturn `${prefix}${zeros_prefix}${digits + 1}`;\n\t} else {\n\t\treturn `${word}1`;\n\t}\n}\nexport function stringPluralize(word: string): string {\n\tconst last_char = word[word.length - 1];\n\tif (last_char !== 's') {\n\t\treturn `${word}s`;\n\t} else {\n\t\treturn word;\n\t}\n}\nexport function stringCamelCase(str: string): string {\n\tconst elements = str.replace(/_/g, ' ').split(' ');\n\tlet newWord = '';\n\tfor (let i = 0; i < elements.length; i++) {\n\t\tlet element = elements[i].toLowerCase();\n\t\tif (i > 0) {\n\t\t\telement = stringUpperFirst(element);\n\t\t}\n\t\tnewWord += element;\n\t}\n\treturn newWord;\n\n\t// inspired from https://blog.bitsrc.io/5-string-manipulation-libraries-for-javascript-5de27e48ee62\n\t// return str.replace(/_/g, ' ').replace(/(?:^\\w|[A-Z0-9]|\\b\\w|\\s+)/g, function (match, index) {\n\t// \tconsole.log('match', match, index);\n\t// \tif (+match === 0) return ''; // or if (/\\s+/.test(match)) for white spaces\n\t// \treturn index === 0 ? match.toLowerCase() : match.toUpperCase();\n\t// });\n}\nexport function stringUpperFirst(word: string): string {\n\tif (word.length == 0) {\n\t\treturn word;\n\t}\n\tconst newString = word[0].toUpperCase() + word.substring(1);\n\treturn newString;\n}\nexport function stringTitleize(word: string): string {\n\tconst elements = word.split(/\\s|_/g);\n\tconst newElements = elements.map(stringUpperFirst);\n\treturn newElements.join(' ');\n}\nexport function precision(val: number, decimals: number = 2): string {\n\tdecimals = Math.max(decimals, 0);\n\tconst elements = `${val}`.split('.');\n\n\tif (decimals <= 0) {\n\t\treturn elements[0];\n\t}\n\n\tlet frac = elements[1];\n\tif (frac !== undefined) {\n\t\tif (frac.length > decimals) {\n\t\t\tfrac = frac.substring(0, decimals);\n\t\t}\n\n\t\tfrac = frac.padEnd(decimals, '0');\n\t\treturn `${elements[0]}.${frac}`;\n\t} else {\n\t\tconst string_to_pad = `${val}.`;\n\t\tconst pad = string_to_pad.length + decimals;\n\t\treturn string_to_pad.padEnd(pad, '0');\n\t}\n}\nexport function ensureFloat(num: number): string {\n\t// const integer = Math.floor(num)\n\t// const delta = num - integer\n\t// if(delta)\n\tconst num_as_string = `${num}`;\n\tconst dot_pos = num_as_string.indexOf('.');\n\tif (dot_pos >= 0) {\n\t\treturn num_as_string;\n\t} else {\n\t\treturn `${num_as_string}.0`;\n\t}\n}\nexport function ensureInteger(num: number): string {\n\tconst num_as_string = `${num}`;\n\tconst dot_pos = num_as_string.indexOf('.');\n\tif (dot_pos >= 0) {\n\t\treturn num_as_string.split('.')[0];\n\t} else {\n\t\treturn num_as_string;\n\t}\n}\n\n// let _elements: string[] = [];\n// let _inclusionFilters: string[] = [];\n// // https://stackoverflow.com/questions/26246601/wildcard-string-comparison-in-javascript#32402438\nexport function stringMatchMask(word: string, mask: string) {\n\tif (mask === '*') {\n\t\treturn true;\n\t}\n\tif (word == mask) {\n\t\treturn true;\n\t}\n\tconst elements = mask.split(SPACE);\n\t// const elements = _elements;\n\tconst exclusionFilters: string[] = [];\n\t// _inclusionFilters.length = 0;\n\tfor (const element of elements) {\n\t\tif (element.startsWith('^')) {\n\t\t\texclusionFilters.push(element.substring(1));\n\t\t} else {\n\t\t\t// _inclusionFilters.push(element);\n\t\t}\n\t}\n\t// const exclusionFilters = elements\n\t// \t.filter((element) => element.startsWith('^'))\n\t// \t.map((element) => element.substring(1));\n\tfor (const exclusionFilter of exclusionFilters) {\n\t\tconst match = stringMatchMask(word, exclusionFilter);\n\t\tif (match) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (elements.length > 1) {\n\t\tfor (const element of elements) {\n\t\t\tif (stringMatchMask(word, element)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// \".\"  => Find a single character, except newline or line terminator\n\t// \".*\" => Matches any string that contains zero or more characters\n\tmask = mask.split('*').join('.*');\n\n\t// ? needs to be escaped, otherwise it will be used inside the regex\n\tmask = mask.split('?').join('\\\\?');\n\n\t// \"^\"  => Matches any string with the following at the beginning of it\n\t// \"$\"  => Matches any string with that in front at the end of it\n\tmask = `^${mask}$`;\n\n\ttry {\n\t\t// Create a regular expression object for matching string\n\t\tconst regex = new RegExp(mask);\n\n\t\t// Returns true if it finds a match, otherwise it returns false\n\t\treturn regex.test(word);\n\t} catch (err) {\n\t\t// we need to wrap in a try catch in case it would create an invalid regex\n\t\treturn false;\n\t}\n}\nexport function stringMatchesOneMask(word: string, masks: string[]): boolean {\n\tfor (const mask of masks) {\n\t\tif (stringMatchMask(word, mask)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nlet _indices: number[] = [];\nlet _subIndices: number[] = [];\nexport function stringToIndices(indicesString: string, target: number[]): number[] {\n\ttarget.length = 0;\n\tconst elements = indicesString.split(INDICES_LIST_SEPARATOR);\n\tif (elements.length > 1) {\n\t\t_indices.length = 0;\n\t\tfor (const element of elements) {\n\t\t\tstringToIndices(element, _subIndices);\n\t\t\tarrayPushItems(_subIndices, _indices);\n\t\t}\n\t\t// const indices: number[] = elements.flatMap(stringToIndices);\n\t\t// const uniqIndices: number[] = [];\n\t\tarrayUniq(_indices, target);\n\t\treturn target.sort((a, b) => a - b);\n\t} else {\n\t\tconst element = elements[0];\n\t\tif (element) {\n\t\t\tif (element.indexOf(RANGE_SEPARATOR) > 0) {\n\t\t\t\tconst rangeElements = element.split(RANGE_SEPARATOR);\n\t\t\t\tconst rangeStart = rangeElements[0];\n\t\t\t\tconst rangeEnd = rangeElements[1];\n\t\t\t\tconst rangeStartI = parseInt(rangeStart);\n\t\t\t\tconst rangeEndI = parseInt(rangeEnd);\n\t\t\t\tif (isNumberValid(rangeStartI) && isNumberValid(rangeEndI)) {\n\t\t\t\t\treturn range(rangeStartI, rangeEndI + 1, 1, target);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst parsed = parseInt(element);\n\t\t\t\tif (isNumberValid(parsed)) {\n\t\t\t\t\ttarget.push(parsed);\n\t\t\t\t\treturn target;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n}\nexport function stringEscapeLineBreaks(word: string): string {\n\treturn word.replace(/(\\r\\n|\\n|\\r)/gm, '\\\\n');\n}\nexport class CoreString {\n\tstatic isBoolean = stringIsBoolean;\n\tstatic toBoolean = stringToBoolean;\n\tstatic isNumber = stringIsNumber;\n\tstatic tailDigits = stringTailDigits;\n\tstatic increment = stringIncrement;\n\tstatic pluralize = stringPluralize;\n\tstatic camelCase = stringCamelCase;\n\tstatic upperFirst = stringUpperFirst;\n\tstatic titleize = stringTitleize;\n\tstatic precision = precision;\n\tstatic ensureFloat = ensureFloat;\n\tstatic ensureInteger = ensureInteger;\n\tstatic matchMask = stringMatchMask;\n\tstatic matchesOneMask = stringMatchesOneMask;\n\tstatic attribNames = stringToAttribNames;\n\tstatic indices = stringToIndices;\n\tstatic escapeLineBreaks = stringEscapeLineBreaks;\n\tstatic sanitizeName = sanitizeName;\n}\n","import {ensureFloat, ensureInteger} from './String';\nimport {Color, Matrix3, Matrix4, Vector2, Vector3, Vector4} from 'three';\nimport {isString, isBoolean, isNumber, isArray} from './Type';\nimport {GlConnectionPointType} from '../engine/nodes/utils/io/connections/Gl';\n\nexport const COMPONENTS_BY_GL_TYPE = {\n\t[GlConnectionPointType.BOOL]: undefined,\n\t[GlConnectionPointType.INT]: undefined,\n\t[GlConnectionPointType.FLOAT]: undefined,\n\t[GlConnectionPointType.VEC2]: ['x', 'y'],\n\t[GlConnectionPointType.VEC3]: ['x', 'y', 'z'],\n\t[GlConnectionPointType.VEC4]: ['x', 'y', 'z', 'w'],\n\t[GlConnectionPointType.MAT3]: undefined,\n\t[GlConnectionPointType.MAT4]: undefined,\n\t[GlConnectionPointType.SAMPLER_2D]: undefined,\n\t[GlConnectionPointType.SAMPLER_2D_ARRAY]: undefined,\n\t[GlConnectionPointType.SAMPLER_3D]: undefined,\n\t[GlConnectionPointType.SAMPLER_CUBE]: undefined,\n\t[GlConnectionPointType.SSS_MODEL]: undefined,\n\t[GlConnectionPointType.SDF_CONTEXT]: undefined,\n\t[GlConnectionPointType.SDF_MATERIAL]: undefined,\n};\nexport class ThreeToGl {\n\tstatic glType(glType: GlConnectionPointType, value: string) {\n\t\tswitch (glType) {\n\t\t\tcase GlConnectionPointType.BOOL:\n\t\t\t\treturn this.bool(value);\n\t\t\tcase GlConnectionPointType.INT:\n\t\t\t\treturn this.integer(value);\n\t\t\tcase GlConnectionPointType.FLOAT:\n\t\t\t\treturn this.float(value);\n\t\t\tcase GlConnectionPointType.VEC2:\n\t\t\t\treturn this.vector2(value);\n\t\t\tcase GlConnectionPointType.VEC3:\n\t\t\t\treturn this.vector3(value);\n\t\t\tcase GlConnectionPointType.VEC4:\n\t\t\t\treturn this.vector4(value);\n\t\t}\n\t\treturn `no matching implementation for glType '${glType}' in ThreeToGl.glType`;\n\t\t// TypeAssert.unreachable(glType)\n\t}\n\tstatic any(value: any): string {\n\t\tif (isString(value)) {\n\t\t\treturn value;\n\t\t}\n\t\tif (isBoolean(value)) {\n\t\t\treturn `${value}`;\n\t\t}\n\t\tif (isNumber(value)) {\n\t\t\treturn `${ensureFloat(value)}`;\n\t\t}\n\t\tif (isArray(value)) {\n\t\t\treturn this.numeric_array(value);\n\t\t}\n\t\t// and if it is a vector\n\t\tif (\n\t\t\tvalue instanceof Vector2 ||\n\t\t\tvalue instanceof Vector3 ||\n\t\t\tvalue instanceof Vector4 ||\n\t\t\tvalue instanceof Color\n\t\t) {\n\t\t\treturn this.numeric_array(value.toArray());\n\t\t}\n\t\treturn `ThreeToGl error: unknown value type '${value}'`;\n\t}\n\n\tstatic numeric_array(values: number[]): string {\n\t\tconst values_str = new Array(values.length);\n\t\tfor (let i = 0; i < values.length; i++) {\n\t\t\tvalues_str[i] = `${ensureFloat(values[i])}`;\n\t\t}\n\t\tconst gl_type = `vec${values.length}`;\n\t\treturn `${gl_type}(${values_str.join(', ')})`;\n\t}\n\tstatic mat4(vec: Matrix4 | string): string {\n\t\tif (isString(vec)) {\n\t\t\treturn vec;\n\t\t}\n\t\tconst values = vec.toArray().map((v) => {\n\t\t\treturn `${ensureFloat(v)}`;\n\t\t});\n\t\treturn `mat4(${values.join(', ')})`;\n\t}\n\tstatic mat3(vec: Matrix3 | string): string {\n\t\tif (isString(vec)) {\n\t\t\treturn vec;\n\t\t}\n\t\tconst values = vec.toArray().map((v) => {\n\t\t\treturn `${ensureFloat(v)}`;\n\t\t});\n\t\treturn `mat3(${values.join(', ')})`;\n\t}\n\tstatic vector4(vec: Vector4 | string): string {\n\t\tif (isString(vec)) {\n\t\t\treturn vec;\n\t\t}\n\t\tconst values = vec.toArray().map((v) => {\n\t\t\treturn `${ensureFloat(v)}`;\n\t\t});\n\t\treturn `vec4(${values.join(', ')})`;\n\t}\n\tstatic vector3(vec: Vector3 | string): string {\n\t\tif (isString(vec)) {\n\t\t\treturn vec;\n\t\t}\n\t\tconst values = vec.toArray().map((v) => {\n\t\t\treturn `${ensureFloat(v)}`;\n\t\t});\n\t\treturn `vec3(${values.join(', ')})`;\n\t}\n\tstatic vector2(vec: Vector2 | string): string {\n\t\tif (isString(vec)) {\n\t\t\treturn vec;\n\t\t}\n\t\tconst values = vec.toArray().map((v) => {\n\t\t\treturn `${ensureFloat(v)}`;\n\t\t});\n\t\treturn `vec2(${values.join(', ')})`;\n\t}\n\n\tstatic vector3_float(vec: Vector3 | string, num: number | string): string {\n\t\tif (isNumber(num)) {\n\t\t\tnum = ensureFloat(num);\n\t\t}\n\t\treturn `vec4(${this.vector3(vec)}, ${num})`;\n\t}\n\n\tstatic float4(x: number | string, y: number | string, z: number | string, w: number | string) {\n\t\tif (isNumber(x)) {\n\t\t\tx = ensureFloat(x);\n\t\t}\n\t\tif (isNumber(y)) {\n\t\t\ty = ensureFloat(y);\n\t\t}\n\t\tif (isNumber(z)) {\n\t\t\tz = ensureFloat(z);\n\t\t}\n\t\tif (isNumber(w)) {\n\t\t\tw = ensureFloat(w);\n\t\t}\n\t\treturn `vec4(${x}, ${y}, ${z}, ${w})`;\n\t}\n\tstatic float3(x: number | string, y: number | string, z: number | string) {\n\t\tif (isNumber(x)) {\n\t\t\tx = ensureFloat(x);\n\t\t}\n\t\tif (isNumber(y)) {\n\t\t\ty = ensureFloat(y);\n\t\t}\n\t\tif (isNumber(z)) {\n\t\t\tz = ensureFloat(z);\n\t\t}\n\t\treturn `vec3(${x}, ${y}, ${z})`;\n\t}\n\tstatic float2(x: number | string, y: number | string) {\n\t\tif (isNumber(x)) {\n\t\t\tx = ensureFloat(x);\n\t\t}\n\t\tif (isNumber(y)) {\n\t\t\ty = ensureFloat(y);\n\t\t}\n\t\treturn `vec2(${x}, ${y})`;\n\t}\n\tstatic float(x: number | string): string {\n\t\tif (isNumber(x)) {\n\t\t\treturn ensureFloat(x);\n\t\t} else {\n\t\t\tconst converted = parseFloat(x);\n\t\t\tif (isNaN(converted)) {\n\t\t\t\treturn x;\n\t\t\t} else {\n\t\t\t\treturn ensureFloat(converted);\n\t\t\t}\n\t\t}\n\t}\n\tstatic integer(x: number | string): string {\n\t\tif (isNumber(x)) {\n\t\t\treturn ensureInteger(x);\n\t\t} else {\n\t\t\tconst converted = parseInt(x);\n\t\t\tif (isNaN(converted)) {\n\t\t\t\treturn x;\n\t\t\t} else {\n\t\t\t\treturn ensureInteger(converted);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic bool(x: boolean | string) {\n\t\tif (isBoolean(x)) {\n\t\t\treturn `${x}`;\n\t\t} else {\n\t\t\treturn x;\n\t\t}\n\t}\n}\n","import {CoreString} from './String';\nimport {isString,isBoolean,isNumber} from './Type';\nimport {JsConnectionPointType} from '../engine/nodes/utils/io/connections/Js';\n\nexport const COMPONENTS_BY_GL_TYPE = {\n\t[JsConnectionPointType.BOOLEAN]: undefined,\n\t[JsConnectionPointType.COLOR]: ['r', 'g', 'b'],\n\t[JsConnectionPointType.INT]: undefined,\n\t[JsConnectionPointType.FLOAT]: undefined,\n\t[JsConnectionPointType.VECTOR2]: ['x', 'y'],\n\t[JsConnectionPointType.VECTOR3]: ['x', 'y', 'z'],\n\t[JsConnectionPointType.VECTOR4]: ['x', 'y', 'z', 'w'],\n\t// [JsConnectionPointType.SAMPLER_2D]: undefined,\n\t// [JsConnectionPointType.SAMPLER_2D_ARRAY]: undefined,\n\t// [JsConnectionPointType.SAMPLER_3D]: undefined,\n\t// [JsConnectionPointType.SAMPLER_CUBE]: undefined,\n\t// [JsConnectionPointType.SSS_MODEL]: undefined,\n\t// [JsConnectionPointType.SDF_CONTEXT]: undefined,\n\t// [JsConnectionPointType.SDF_MATERIAL]: undefined,\n};\nexport class ThreeToJs {\n\t// static glType(glType: JsConnectionPointType, value: string) {\n\t// \tswitch (glType) {\n\t// \t\tcase JsConnectionPointType.BOOLEAN:\n\t// \t\t\treturn this.bool(value);\n\t// \t\tcase JsConnectionPointType.INT:\n\t// \t\t\treturn this.integer(value);\n\t// \t\tcase JsConnectionPointType.FLOAT:\n\t// \t\t\treturn this.float(value);\n\t// \t\tcase JsConnectionPointType.VECTOR2:\n\t// \t\t\treturn this.vector2(value);\n\t// \t\tcase JsConnectionPointType.VECTOR3:\n\t// \t\t\treturn this.vector3(value);\n\t// \t\tcase JsConnectionPointType.VECTOR4:\n\t// \t\t\treturn this.vector4(value);\n\t// \t}\n\t// \treturn `no matching implementation for glType '${glType}' in ThreeToGl.glType`;\n\t// \t// TypeAssert.unreachable(glType)\n\t// }\n\tstatic any(value: any): string {\n\t\tif (isString(value)) {\n\t\t\treturn value;\n\t\t}\n\t\tif (isBoolean(value)) {\n\t\t\treturn `${value}`;\n\t\t}\n\t\tif (isNumber(value)) {\n\t\t\treturn `${CoreString.ensureFloat(value)}`;\n\t\t}\n\t\tif (value == null) {\n\t\t\treturn 'null';\n\t\t}\n\t\t// if (isArray(value)) {\n\t\t// \treturn this.numeric_array(value);\n\t\t// }\n\t\t// and if it is a vector\n\t\t// if (\n\t\t// \tvalue instanceof Vector2 ||\n\t\t// \tvalue instanceof Vector3 ||\n\t\t// \tvalue instanceof Vector4 ||\n\t\t// \tvalue instanceof Color\n\t\t// ) {\n\t\t// \treturn this.numeric_array(value.toArray());\n\t\t// }\n\t\treturn `ThreeToJs error: unknown value type '${value}'`;\n\t}\n\n\t// static numeric_array(values: number[]): string {\n\t// \tconst values_str = new Array(values.length);\n\t// \tfor (let i = 0; i < values.length; i++) {\n\t// \t\tvalues_str[i] = `${CoreString.ensureFloat(values[i])}`;\n\t// \t}\n\t// \tconst gl_type = `vec${values.length}`;\n\t// \treturn `${gl_type}(${values_str.join(', ')})`;\n\t// }\n\t// static vector4(vec: Vector4 | string): string {\n\t// \tif (isString(vec)) {\n\t// \t\treturn vec;\n\t// \t}\n\t// \tconst values = vec.toArray().map((v) => {\n\t// \t\treturn `${CoreString.ensureFloat(v)}`;\n\t// \t});\n\t// \treturn `vec4(${values.join(', ')})`;\n\t// }\n\t// static vector3(vec: Vector3 | string): string {\n\t// \tif (isString(vec)) {\n\t// \t\treturn vec;\n\t// \t}\n\t// \tconst values = vec.toArray().map((v) => {\n\t// \t\treturn `${CoreString.ensureFloat(v)}`;\n\t// \t});\n\t// \treturn `vec3(${values.join(', ')})`;\n\t// }\n\t// static vector2(vec: Vector2 | string): string {\n\t// \tif (isString(vec)) {\n\t// \t\treturn vec;\n\t// \t}\n\t// \tconst values = vec.toArray().map((v) => {\n\t// \t\treturn `${CoreString.ensureFloat(v)}`;\n\t// \t});\n\t// \treturn `vec2(${values.join(', ')})`;\n\t// }\n\n\t// static vector3_float(vec: Vector3 | string, num: number | string): string {\n\t// \tif (isNumber(num)) {\n\t// \t\tnum = CoreString.ensureFloat(num);\n\t// \t}\n\t// \treturn `vec4(${this.vector3(vec)}, ${num})`;\n\t// }\n\n\t// static float4(x: number | string, y: number | string, z: number | string, w: number | string) {\n\t// \tif (isNumber(x)) {\n\t// \t\tx = CoreString.ensureFloat(x);\n\t// \t}\n\t// \tif (isNumber(y)) {\n\t// \t\ty = CoreString.ensureFloat(y);\n\t// \t}\n\t// \tif (isNumber(z)) {\n\t// \t\tz = CoreString.ensureFloat(z);\n\t// \t}\n\t// \tif (isNumber(w)) {\n\t// \t\tw = CoreString.ensureFloat(w);\n\t// \t}\n\t// \treturn `vec4(${x}, ${y}, ${z}, ${w})`;\n\t// }\n\t// static float3(x: number | string, y: number | string, z: number | string) {\n\t// \tif (isNumber(x)) {\n\t// \t\tx = CoreString.ensureFloat(x);\n\t// \t}\n\t// \tif (isNumber(y)) {\n\t// \t\ty = CoreString.ensureFloat(y);\n\t// \t}\n\t// \tif (isNumber(z)) {\n\t// \t\tz = CoreString.ensureFloat(z);\n\t// \t}\n\t// \treturn `vec3(${x}, ${y}, ${z})`;\n\t// }\n\t// static float2(x: number | string, y: number | string) {\n\t// \tif (isNumber(x)) {\n\t// \t\tx = CoreString.ensureFloat(x);\n\t// \t}\n\t// \tif (isNumber(y)) {\n\t// \t\ty = CoreString.ensureFloat(y);\n\t// \t}\n\t// \treturn `vec2(${x}, ${y})`;\n\t// }\n\t// static float(x: number | string): string {\n\t// \tif (isNumber(x)) {\n\t// \t\treturn CoreString.ensureFloat(x);\n\t// \t} else {\n\t// \t\tconst converted = parseFloat(x);\n\t// \t\tif (isNaN(converted)) {\n\t// \t\t\treturn x;\n\t// \t\t} else {\n\t// \t\t\treturn CoreString.ensureFloat(converted);\n\t// \t\t}\n\t// \t}\n\t// }\n\tstatic integer(x: number | string): string {\n\t\tif (isNumber(x)) {\n\t\t\treturn CoreString.ensureInteger(x);\n\t\t} else {\n\t\t\tconst converted = parseInt(x);\n\t\t\tif (isNaN(converted)) {\n\t\t\t\treturn x;\n\t\t\t} else {\n\t\t\t\treturn CoreString.ensureInteger(converted);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic bool(x: boolean | string) {\n\t\tif (isBoolean(x)) {\n\t\t\treturn `${x}`;\n\t\t} else {\n\t\t\treturn x;\n\t\t}\n\t}\n\n\tstatic valueWrap(x: string): string {\n\t\tif (x.endsWith('.value')) {\n\t\t\treturn x.replace('.value', '');\n\t\t} else {\n\t\t\t// TODO: this doesn't yet handle x if it was a string\n\t\t\treturn `{value: ${x}}`;\n\t\t}\n\t}\n}\n","import {Number3} from '../types/GlobalTypes';\nimport {MathUtils, BufferGeometry, Euler, Matrix4, Object3D, Vector3, Quaternion} from 'three';\n\nimport {BaseNodeType} from '../engine/nodes/_Base';\n\nexport enum TransformTargetType {\n\tOBJECT = 'object',\n\tGEOMETRY = 'geometry',\n}\nexport const TRANSFORM_TARGET_TYPES: TransformTargetType[] = [TransformTargetType.GEOMETRY, TransformTargetType.OBJECT];\n\nexport enum RotationOrder {\n\tXYZ = 'XYZ',\n\tXZY = 'XZY',\n\tYXZ = 'YXZ',\n\tYZX = 'YZX',\n\tZYX = 'ZYX',\n\tZXY = 'ZXY',\n}\nexport const ROTATION_ORDERS: RotationOrder[] = [\n\tRotationOrder.XYZ,\n\tRotationOrder.XZY,\n\tRotationOrder.YXZ,\n\tRotationOrder.YZX,\n\tRotationOrder.ZXY,\n\tRotationOrder.ZYX,\n];\nexport const DEFAULT_ROTATION_ORDER = RotationOrder.XYZ;\n\nexport interface SetParamsFromMatrixOptions {\n\tscale?: boolean;\n}\n\nconst eulerArray: Number3 = [0, 0, 0];\nconst _m = new Matrix4();\nconst _q = new Quaternion();\nconst _rotateDirOrigin = new Vector3();\nconst _rotateDirDest = new Vector3();\n\nexport function rotationMatrix(dirOrigin: Vector3, dirDest: Vector3, target: Matrix4) {\n\t_rotateDirDest.copy(dirDest).normalize();\n\t_rotateDirOrigin.copy(dirOrigin).normalize();\n\t_q.setFromUnitVectors(_rotateDirOrigin, _rotateDirDest);\n\ttarget.makeRotationFromQuaternion(_q);\n}\nexport function rotateGeometry(geometry: BufferGeometry, dirOrigin: Vector3, dirDest: Vector3) {\n\t_rotateDirDest.copy(dirDest).normalize();\n\t_rotateDirOrigin.copy(dirOrigin).normalize();\n\t_q.setFromUnitVectors(_rotateDirOrigin, _rotateDirDest);\n\t_m.makeRotationFromQuaternion(_q);\n\tgeometry.applyMatrix4(_m);\n}\nexport class CoreTransform {\n\tprivate static set_params_from_matrix_position = new Vector3();\n\tprivate static set_params_from_matrix_quaternion = new Quaternion();\n\tprivate static set_params_from_matrix_scale = new Vector3();\n\tprivate static set_params_from_matrix_euler = new Euler();\n\tprivate static set_params_from_matrix_rotation = new Vector3();\n\tprivate static set_params_from_matrix_t: Number3 = [0, 0, 0];\n\tprivate static set_params_from_matrix_r: Number3 = [0, 0, 0];\n\tprivate static set_params_from_matrix_s: Number3 = [0, 0, 0];\n\tstatic setParamsFromMatrix(matrix: Matrix4, node: BaseNodeType, options: SetParamsFromMatrixOptions = {}) {\n\t\tlet update_scale = options['scale'];\n\t\tif (update_scale == null) {\n\t\t\tupdate_scale = true;\n\t\t}\n\n\t\tmatrix.decompose(\n\t\t\tthis.set_params_from_matrix_position,\n\t\t\tthis.set_params_from_matrix_quaternion,\n\t\t\tthis.set_params_from_matrix_scale\n\t\t);\n\n\t\tthis.set_params_from_matrix_euler.setFromQuaternion(this.set_params_from_matrix_quaternion);\n\t\tthis.set_params_from_matrix_euler.toArray(eulerArray);\n\t\tthis.set_params_from_matrix_rotation.fromArray(eulerArray);\n\t\tthis.set_params_from_matrix_rotation.divideScalar(Math.PI / 180);\n\n\t\tthis.set_params_from_matrix_position.toArray(this.set_params_from_matrix_t);\n\t\tthis.set_params_from_matrix_rotation.toArray(this.set_params_from_matrix_r);\n\t\tthis.set_params_from_matrix_scale.toArray(this.set_params_from_matrix_s);\n\n\t\tnode.scene().batchUpdates(() => {\n\t\t\tnode.params.set_vector3('t', this.set_params_from_matrix_t);\n\t\t\tnode.params.set_vector3('r', this.set_params_from_matrix_r);\n\t\t\tnode.params.set_vector3('s', this.set_params_from_matrix_s);\n\t\t\tif (update_scale) {\n\t\t\t\tnode.params.set_float('scale', 1);\n\t\t\t}\n\t\t});\n\t}\n\n\tstatic set_params_from_object_position_array: Number3 = [0, 0, 0];\n\tstatic set_params_from_object_rotation_deg = new Vector3();\n\tstatic set_params_from_object_rotation_array: Number3 = [0, 0, 0];\n\tstatic setParamsFromObject(object: Object3D, node: BaseNodeType) {\n\t\tobject.position.toArray(this.set_params_from_object_position_array);\n\n\t\tobject.rotation.toArray(this.set_params_from_object_rotation_array);\n\t\tthis.set_params_from_object_rotation_deg.fromArray(this.set_params_from_object_rotation_array);\n\t\tthis.set_params_from_object_rotation_deg.multiplyScalar(180 / Math.PI);\n\t\tthis.set_params_from_object_rotation_deg.toArray(this.set_params_from_object_rotation_array);\n\n\t\tnode.scene().batchUpdates(() => {\n\t\t\tnode.params.set_vector3('t', this.set_params_from_object_position_array);\n\t\t\tnode.params.set_vector3('r', this.set_params_from_object_rotation_array);\n\t\t});\n\t}\n\n\tprivate _translation_matrix: Matrix4 = new Matrix4();\n\tprivate _translation_matrix_q = new Quaternion();\n\tprivate _translation_matrix_s = new Vector3(1, 1, 1);\n\ttranslationMatrix(t: Vector3): Matrix4 {\n\t\tthis._translation_matrix.compose(t, this._translation_matrix_q, this._translation_matrix_s);\n\t\treturn this._translation_matrix;\n\t}\n\n\tprivate _matrix = new Matrix4().identity();\n\tprivate _matrixQ = new Quaternion();\n\tprivate _matrixEuler = new Euler();\n\tprivate _matrixS = new Vector3();\n\tmatrix(t: Vector3, r: Vector3, s: Vector3, scale: number, rotationOrder: RotationOrder) {\n\t\tthis._matrixEuler.set(MathUtils.degToRad(r.x), MathUtils.degToRad(r.y), MathUtils.degToRad(r.z), rotationOrder);\n\t\tthis._matrixQ.setFromEuler(this._matrixEuler);\n\n\t\tthis._matrixS.copy(s).multiplyScalar(scale);\n\n\t\tthis._matrix.compose(t, this._matrixQ, this._matrixS);\n\t\treturn this._matrix;\n\t}\n\n\tstatic rotateObject(object: Object3D, dirOrigin: Vector3, dirDest: Vector3) {\n\t\t_rotateDirDest.copy(dirDest).normalize();\n\t\t_rotateDirOrigin.copy(dirOrigin).normalize();\n\t\t_q.setFromUnitVectors(_rotateDirOrigin, _rotateDirDest);\n\t\t// this._rotate_geometry_m.identity(); // not entirely sure this is necessary\n\t\t_m.makeRotationFromQuaternion(_q);\n\t\tobject.matrix.multiply(_m);\n\t\t// object.updateMatrix();\n\t\tobject.matrix.decompose(object.position, object.quaternion, object.scale);\n\t}\n\n\tstatic decomposeMatrix(object: Object3D) {\n\t\tobject.matrix.decompose(object.position, object.quaternion, object.scale);\n\t}\n}\n","import {Matrix4} from 'three';\nimport {TypeAssert} from '../engine/poly/Assert';\nimport {CoreObjectType, isObject3D, ObjectContent} from './geometry/ObjectContent';\n\nexport enum ObjectTransformSpace {\n\tPARENT = 'parent',\n\tLOCAL = 'local',\n}\nexport enum ObjectTransformMode {\n\tSET = 'set matrix',\n\tMULT = 'multiply matrix',\n}\nexport const OBJECT_TRANSFORM_SPACES: ObjectTransformSpace[] = [\n\tObjectTransformSpace.PARENT,\n\tObjectTransformSpace.LOCAL,\n];\nexport const OBJECT_TRANSFORM_MODES: ObjectTransformMode[] = [ObjectTransformMode.SET, ObjectTransformMode.MULT];\nexport const OBJECT_TRANSFORM_SPACE_MENU_ENTRIES = [\n\t{name: 'parent', value: OBJECT_TRANSFORM_SPACES.indexOf(ObjectTransformSpace.PARENT)},\n\t{name: 'local', value: OBJECT_TRANSFORM_SPACES.indexOf(ObjectTransformSpace.LOCAL)},\n];\n\nexport function applyTransformWithSpaceToObject(\n\tobject: ObjectContent<CoreObjectType>,\n\tmatrix: Matrix4,\n\ttransformSpace: ObjectTransformSpace,\n\ttransformMode: ObjectTransformMode\n) {\n\tswitch (transformSpace) {\n\t\tcase ObjectTransformSpace.PARENT: {\n\t\t\tif (isObject3D(object)) {\n\t\t\t\tobject.updateMatrix();\n\t\t\t\tobject.applyMatrix4(matrix);\n\t\t\t\tobject.matrix.decompose(object.position, object.quaternion, object.scale);\n\t\t\t} else {\n\t\t\t\tobject.applyMatrix4(matrix);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase ObjectTransformSpace.LOCAL: {\n\t\t\tif (isObject3D(object)) {\n\t\t\t\tobject.updateMatrix();\n\t\t\t\tif (transformMode == ObjectTransformMode.SET) {\n\t\t\t\t\tobject.matrix.copy(matrix);\n\t\t\t\t} else {\n\t\t\t\t\tobject.matrix.multiply(matrix);\n\t\t\t\t}\n\t\t\t\tobject.matrix.decompose(object.position, object.quaternion, object.scale);\n\t\t\t} else {\n\t\t\t\t// it should ideally multiply the existing matrix,\n\t\t\t\t// but I'm not sure how to do that with cad objects for now\n\t\t\t\tobject.applyMatrix4(matrix);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(transformSpace);\n}\n","import {Euler, Vector2, Vector3, Vector4, Quaternion, Color} from 'three';\n\nexport function isArray(value: any): value is any[] {\n\treturn Array.isArray(value);\n}\nexport function isBoolean(value: any): value is boolean {\n\treturn value === true || value === false;\n}\nexport function isNumber(value: any): value is number {\n\treturn typeof value == 'number';\n}\nexport function isNumberValid(value: any): value is number {\n\treturn isNumber(value) && !isNaN(value);\n}\nexport const coreTypeIsNaN = isNaN;\n// export function _isNaN(value: any): boolean {\n// \treturn isNaN(value);\n// }\nexport function isVector(value: any): value is Vector2 | Vector3 | Vector4 {\n\treturn value instanceof Vector2 || value instanceof Vector3 || value instanceof Vector4;\n}\nexport function isColor(value: any): value is Color {\n\treturn value instanceof Color;\n}\nexport function isEuler(value: any): value is Euler {\n\treturn value instanceof Euler;\n}\nexport function isQuaternion(value: any): value is Quaternion {\n\treturn value instanceof Quaternion;\n}\nexport function isString(value: any): value is string {\n\treturn typeof value == 'string';\n}\nexport function isObject(value: any): value is object {\n\tvar type = typeof value;\n\treturn value != null && (type == 'object' || type == 'function');\n}\nexport function isFunction(value: any): value is Function {\n\tvar type = typeof value;\n\treturn value != null && type == 'function';\n}\nexport function isPromise<T extends any>(value: any): value is Promise<T> {\n\treturn value instanceof Promise;\n}\n// a simple way to test the type and value of a param value\nexport function isBooleanTrue(value: boolean) {\n\treturn value;\n}\nexport function ensureString(value: string) {\n\treturn value;\n}\n\nexport class CoreType {\n\tstatic isNumber = isNumber;\n\tstatic isNumberValid = isNumberValid;\n\tstatic isVector = isVector;\n\tstatic isColor = isColor;\n\tstatic isEuler = isEuler;\n\tstatic isQuaternion = isQuaternion;\n\tstatic isString = isString;\n\tstatic isBoolean = isBoolean;\n\tstatic isNaN = coreTypeIsNaN;\n\tstatic isArray = isArray;\n\tstatic isObject = isObject;\n\tstatic isFunction = isFunction;\n}\n","export function sanitizeUrl(url: string) {\n\treturn url.replace(/([^:]\\/)\\/+/g, '$1').replace(/^\\/+/, '/');\n}\n","// let el: HTMLDivElement | undefined;\n// function _div() {\n// \treturn (el = el || document.createElement('div'));\n// }\n\nexport function isMobile(): boolean {\n\treturn /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\nexport function isIOS(): boolean {\n\treturn /(iPad|iPhone|iPod)/g.test(navigator.userAgent);\n}\nexport function isAndroid(): boolean {\n\treturn /(Android)/g.test(navigator.userAgent);\n}\nexport function isTouchDevice(): boolean {\n\treturn (\n\t\tisMobile() ||\n\t\tisIOS() ||\n\t\tisAndroid() ||\n\t\t'ontouchstart' in globalThis ||\n\t\t((globalThis as any).DocumentTouch != null && document instanceof (globalThis as any).DocumentTouch)\n\t);\n}\nexport function isChrome(): boolean {\n\treturn navigator && navigator.userAgent != null && navigator.userAgent.indexOf('Chrome') != -1;\n}\nexport function isSafari(): boolean {\n\treturn /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n}\nexport function isPortrait(): boolean {\n\treturn globalThis.innerHeight > globalThis.innerWidth;\n}\nexport function isLandscape(): boolean {\n\treturn !isPortrait();\n}\nexport function screenOrientation() {\n\tconst windowOrientation = globalThis.orientation;\n\tif (windowOrientation != null) {\n\t\treturn windowOrientation;\n\t}\n\tconst screenAngle: number | undefined = globalThis?.screen?.orientation?.angle || 0;\n\treturn screenAngle;\n}\n\nexport class CoreUserAgent {\n\t// user agent on linux with chrome\n\t// \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36\"\n\t// user agent on linux with firefox\n\t// \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0\"\n\tprivate static _isChrome: boolean | undefined;\n\tstatic isChrome(): boolean {\n\t\tif (this._isChrome == null) {\n\t\t\tthis._isChrome = isChrome();\n\t\t}\n\t\treturn this._isChrome;\n\t}\n\tprivate static _isSafari: boolean | undefined;\n\tstatic isSafari(): boolean {\n\t\tif (this._isSafari == null) {\n\t\t\tthis._isSafari = isSafari();\n\t\t}\n\t\treturn this._isSafari;\n\t}\n\tprivate static _isMobile: boolean | undefined;\n\tstatic isMobile(): boolean {\n\t\tif (this._isMobile == null) {\n\t\t\tthis._isMobile = isMobile();\n\t\t}\n\t\treturn this._isMobile;\n\t}\n\tprivate static _isiOS: boolean | undefined;\n\tstatic isiOS(): boolean {\n\t\tif (this._isiOS == null) {\n\t\t\tthis._isiOS = isIOS();\n\t\t}\n\t\treturn this._isiOS;\n\t}\n\tprivate static _isAndroid: boolean | undefined;\n\tstatic isAndroid(): boolean {\n\t\tif (this._isAndroid == null) {\n\t\t\tthis._isAndroid = isAndroid();\n\t\t}\n\t\treturn this._isAndroid;\n\t}\n\tprivate static _isTouchDevice: boolean | undefined;\n\tstatic isTouchDevice(): boolean {\n\t\t// https://stackoverflow.com/questions/6262584/how-to-determine-if-the-client-is-a-touch-device\n\t\t// the following would not work on android\n\t\t// const el = _div();\n\t\t// el.setAttribute('ongesturestart', 'return;'); // or try \"ontouchstart\"\n\t\t// return typeof (el as any).ongesturestart === 'function';\n\t\t// but this does work on android\n\t\t// return (this._isTouchDevice = this._isTouchDevice || document.documentElement.ontouchstart != null);\n\t\t// update:\n\t\tif (this._isTouchDevice == null) {\n\t\t\tthis._isTouchDevice = isTouchDevice();\n\t\t}\n\t\treturn this._isTouchDevice;\n\t}\n\tstatic isPortrait = isPortrait;\n\tstatic isLandscape = isLandscape;\n\tstatic screenOrientation = screenOrientation;\n}\n","export enum ObjectUserData {\n\tPATH = 'path',\n\tLOW_RES_SOFT_BODY_MESH = 'lowResSoftBodyMesh',\n}\n","export enum VideoEvent {\n\tPLAY = 'play',\n\tPAUSE = 'pause',\n\tTIME_UPDATE = 'timeupdate',\n\tVOLUME_CHANGE = 'volumechange',\n}\nexport const VIDEO_EVENTS: VideoEvent[] = [\n\tVideoEvent.PLAY,\n\tVideoEvent.PAUSE,\n\tVideoEvent.TIME_UPDATE,\n\tVideoEvent.VOLUME_CHANGE,\n];\nfunction _buildVideoEventIndices() {\n\tconst map: Map<VideoEvent, number> = new Map();\n\tlet i = 0;\n\tfor (const eventName of VIDEO_EVENTS) {\n\t\tmap.set(eventName, i);\n\t\ti++;\n\t}\n\treturn map;\n}\nexport const VIDEO_EVENT_INDICES = _buildVideoEventIndices();\n","import {Constructor} from './../types/GlobalTypes';\nimport {CoreGraphNode} from './graph/CoreGraphNode';\nimport {BaseNodeType} from '../engine/nodes/_Base';\nimport {BaseParamType} from '../engine/params/_Base';\nimport {DecomposedPath} from './DecomposedPath';\nimport {NodeContext, BaseNodeByContextMap} from '../engine/poly/NodeContext';\nimport {NodeErrorState} from '../engine/nodes/utils/states/Error';\nimport {ParamType} from '../engine/poly/ParamType';\nimport {ParamErrorState} from '../engine/params/utils/states/Error';\nimport {ParamConstructorMap} from '../engine/params/types/ParamConstructorMap';\n\ntype NodeOrParam = BaseNodeType | BaseParamType;\n\nexport const NODE_PATH_DEFAULT = {\n\tNODE: {\n\t\tEMPTY: '',\n\t\tUV: '/COP/imageUv',\n\t\tENV_MAP: '/COP/envMap',\n\t\tCUBE_MAP: '/COP/cubeCamera',\n\t},\n};\nconst _remainingElements: string[] = [];\nconst _ups: string[] = [];\n\nabstract class GraphNodePathParamValue<T extends CoreGraphNode> {\n\tprotected _graphNode: T | null = null;\n\tconstructor(protected _path: string = '') {}\n\tgraphNode() {\n\t\treturn this._graphNode;\n\t}\n\tprivate _setGraphNode(graphNode: T | null) {\n\t\tthis._graphNode = graphNode;\n\t}\n\tabstract graphNodePath(): string | undefined;\n\tpath() {\n\t\treturn this._path;\n\t}\n\tsetPath(path: string) {\n\t\tthis._path = path;\n\t}\n\tclone(): this {\n\t\tconst cloned = new (this.constructor as Constructor<GraphNodePathParamValue<T>>)(this._path);\n\t\tcloned._setGraphNode(this._graphNode);\n\t\treturn cloned as this;\n\t}\n}\n\nexport class TypedNodePathParamValue extends GraphNodePathParamValue<BaseNodeType> {\n\tsetNode(node: BaseNodeType | null) {\n\t\tthis._graphNode = node;\n\t}\n\n\tnode() {\n\t\treturn this._graphNode;\n\t}\n\tgraphNodePath() {\n\t\treturn this.node()?.path();\n\t}\n\n\tresolve(nodeStart: BaseNodeType, decomposedPath?: DecomposedPath) {\n\t\tthis._graphNode = CoreWalker.findNode(nodeStart, this._path, decomposedPath);\n\t}\n\n\tnodeWithContext<N extends NodeContext, K extends NodeContext>(\n\t\tcontext: N,\n\t\terrorState?: NodeErrorState<K>\n\t): BaseNodeByContextMap[N] | undefined {\n\t\tconst foundNode = this.node();\n\t\tif (!foundNode) {\n\t\t\terrorState?.set(`no node found at ${this.path()}`);\n\t\t\treturn;\n\t\t}\n\t\tconst nodeContext = foundNode.context();\n\t\tif (nodeContext == context) {\n\t\t\treturn foundNode as BaseNodeByContextMap[N];\n\t\t} else {\n\t\t\terrorState?.set(`expected ${context} node, but got a ${nodeContext}`);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport class TypedParamPathParamValue extends GraphNodePathParamValue<BaseParamType> {\n\tsetParam(param: BaseParamType | null) {\n\t\tthis._graphNode = param;\n\t}\n\tparam() {\n\t\treturn this._graphNode;\n\t}\n\tgraphNodePath() {\n\t\treturn this.param()?.path();\n\t}\n\n\tresolve(nodeStart: BaseNodeType, decomposedPath?: DecomposedPath) {\n\t\tthis._graphNode = CoreWalker.findParam(nodeStart, this._path, decomposedPath);\n\t}\n\n\tparamWithType<T extends ParamType>(\n\t\tparamType: T,\n\t\terror_state?: ParamErrorState\n\t): ParamConstructorMap[T] | undefined {\n\t\tconst foundParam = this.param();\n\t\tif (!foundParam) {\n\t\t\terror_state?.set(`no param found at ${this.path()}`);\n\t\t\treturn;\n\t\t}\n\t\tif (foundParam.type() == paramType) {\n\t\t\treturn foundParam as ParamConstructorMap[T];\n\t\t} else {\n\t\t\terror_state?.set(`expected ${paramType} node, but got a ${foundParam.type()}`);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport class CoreWalker {\n\tpublic static readonly SEPARATOR = '/';\n\tpublic static readonly DOT = '.';\n\tpublic static readonly CURRENT = CoreWalker.DOT;\n\tpublic static readonly PARENT = '..';\n\tpublic static readonly CURRENT_WITH_SLASH = `${CoreWalker.CURRENT}/`;\n\tpublic static readonly PARENT_WITH_SLASH = `${CoreWalker.PARENT}/`;\n\tpublic static readonly NON_LETTER_PREFIXES = [CoreWalker.SEPARATOR, CoreWalker.DOT];\n\n\tstatic splitParentChild(path: string) {\n\t\tconst elements: string[] = path.split(CoreWalker.SEPARATOR).filter((e) => e.length > 0);\n\t\tconst child_path = elements.pop();\n\t\tconst parent_path = elements.join(CoreWalker.SEPARATOR);\n\t\treturn {parent: parent_path, child: child_path};\n\t}\n\n\tstatic findNode(nodeSrc: BaseNodeType, path: string, decomposedPath?: DecomposedPath): BaseNodeType | null {\n\t\tif (!nodeSrc) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst elements: string[] = path.split(CoreWalker.SEPARATOR).filter((e) => e.length > 0);\n\t\tconst firstElement = elements[0];\n\n\t\tlet nextNode: BaseNodeType | null = null;\n\t\tif (path[0] === CoreWalker.SEPARATOR) {\n\t\t\tconst pathFromRoot = path.substring(1);\n\t\t\tnextNode = this.findNode(nodeSrc.root(), pathFromRoot, decomposedPath);\n\t\t} else {\n\t\t\tswitch (firstElement) {\n\t\t\t\tcase CoreWalker.PARENT:\n\t\t\t\t\tnextNode = nodeSrc.parent();\n\t\t\t\t\tif (nextNode) {\n\t\t\t\t\t\tdecomposedPath?.addPathElement({path: firstElement, node: nextNode});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase CoreWalker.CURRENT:\n\t\t\t\t\tnextNode = nodeSrc;\n\t\t\t\t\tdecomposedPath?.addPathElement({path: firstElement, node: nextNode});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tnextNode = nodeSrc.node(firstElement);\n\t\t\t\t\tif (nextNode) {\n\t\t\t\t\t\tdecomposedPath?.addNamedNode({name: firstElement, node: nextNode});\n\t\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nextNode != null && elements.length > 1) {\n\t\t\t\tconst remainder = elements.slice(1).join(CoreWalker.SEPARATOR);\n\t\t\t\tnextNode = this.findNode(nextNode, remainder, decomposedPath);\n\t\t\t}\n\t\t\treturn nextNode;\n\t\t}\n\n\t\treturn nextNode;\n\t}\n\n\tstatic findParam(nodeSrc: BaseNodeType, path: string, decomposedPath?: DecomposedPath): BaseParamType | null {\n\t\tif (!nodeSrc) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst elements = path.split(CoreWalker.SEPARATOR);\n\n\t\tif (elements.length === 1) {\n\t\t\treturn nodeSrc.params.get(elements[0]);\n\t\t} else {\n\t\t\tlet node: BaseNodeType | null = null;\n\t\t\tif (path[0] === CoreWalker.SEPARATOR && elements.length == 2) {\n\t\t\t\tnode = nodeSrc.root();\n\t\t\t} else {\n\t\t\t\tconst nodePath = elements.slice(0, +(elements.length - 2) + 1 || undefined).join(CoreWalker.SEPARATOR);\n\t\t\t\tnode = this.findNode(nodeSrc, nodePath, decomposedPath);\n\t\t\t}\n\t\t\tif (node != null) {\n\t\t\t\tconst paramName = elements[elements.length - 1];\n\t\t\t\tconst param = node.params.get(paramName);\n\t\t\t\tif (decomposedPath && param) {\n\t\t\t\t\tdecomposedPath.addNamedNode({name: paramName, node: param});\n\t\t\t\t}\n\t\t\t\treturn param;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t\t// throw `no node found for path ${node_path}`;\n\t\t\t}\n\t\t}\n\t}\n\tstatic relativePath(srcGraphNode: Readonly<BaseNodeType>, destGraphNode: Readonly<BaseNodeType>): string {\n\t\tconst parent = this.closestCommonParent(srcGraphNode, destGraphNode);\n\t\tif (!parent) {\n\t\t\treturn destGraphNode.path();\n\t\t} else {\n\t\t\tconst distance = this.distanceToParent(srcGraphNode, parent);\n\t\t\tlet up = '';\n\t\t\tif (distance > 0) {\n\t\t\t\tlet i = 0;\n\t\t\t\t_ups.length = 0;\n\t\t\t\twhile (i++ < distance) {\n\t\t\t\t\t_ups.push(CoreWalker.PARENT);\n\t\t\t\t}\n\t\t\t\tup = _ups.join(CoreWalker.SEPARATOR) + CoreWalker.SEPARATOR;\n\t\t\t}\n\n\t\t\tconst parent_path_elements = parent\n\t\t\t\t.path()\n\t\t\t\t.split(CoreWalker.SEPARATOR)\n\t\t\t\t.filter((e) => e.length > 0);\n\t\t\tconst dest_path_elements = destGraphNode\n\t\t\t\t.path()\n\t\t\t\t.split(CoreWalker.SEPARATOR)\n\t\t\t\t.filter((e) => e.length > 0);\n\t\t\t_remainingElements.length = 0;\n\t\t\tlet cmptr = 0;\n\t\t\tfor (const dest_path_element of dest_path_elements) {\n\t\t\t\tif (!parent_path_elements[cmptr]) {\n\t\t\t\t\t_remainingElements.push(dest_path_element);\n\t\t\t\t}\n\t\t\t\tcmptr++;\n\t\t\t}\n\t\t\tconst down = _remainingElements.join(CoreWalker.SEPARATOR);\n\t\t\treturn this.sanitizePath(`${up}${down}`);\n\t\t}\n\t}\n\tstatic sanitizePath(path: string) {\n\t\treturn path.replace(/\\/\\//g, '/');\n\t}\n\n\tstatic closestCommonParent(\n\t\tgraphNode1: Readonly<BaseNodeType>,\n\t\tgraphNode2: Readonly<BaseNodeType>\n\t): Readonly<BaseNodeType> | null {\n\t\tconst parents1 = this.parents(graphNode1).reverse().concat([graphNode1]);\n\t\tconst parents2 = this.parents(graphNode2).reverse().concat([graphNode2]);\n\n\t\tconst minDepth = Math.min(parents1.length, parents2.length);\n\t\tlet foundParent = null;\n\n\t\tfor (let i = 0; i < minDepth; i++) {\n\t\t\tif (parents1[i].graphNodeId() == parents2[i].graphNodeId()) {\n\t\t\t\tfoundParent = parents1[i];\n\t\t\t}\n\t\t}\n\t\treturn foundParent;\n\t}\n\tstatic parents(graphNode: Readonly<NodeOrParam>): Readonly<BaseNodeType>[] {\n\t\tconst parents = [];\n\t\tlet parent = graphNode.parent();\n\t\twhile (parent) {\n\t\t\tparents.push(parent);\n\t\t\tparent = parent.parent();\n\t\t}\n\t\treturn parents;\n\t}\n\tstatic distanceToParent(graphNode: Readonly<NodeOrParam>, dest: Readonly<BaseNodeType>): number {\n\t\tlet distance = 0;\n\t\tlet current: Readonly<NodeOrParam | null> = graphNode;\n\t\tconst destId = dest.graphNodeId();\n\t\twhile (current && current.graphNodeId() != destId) {\n\t\t\tdistance += 1;\n\t\t\tcurrent = current.parent();\n\t\t}\n\t\tif (current && current.graphNodeId() == destId) {\n\t\t\treturn distance;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tstatic makeAbsolutePath(nodeSrc: BaseNodeType | BaseParamType, path: string): string | null {\n\t\tif (path[0] == CoreWalker.SEPARATOR) {\n\t\t\treturn path;\n\t\t}\n\t\tconst pathElements = path.split(CoreWalker.SEPARATOR);\n\t\tconst firstElement = pathElements.shift();\n\n\t\tif (firstElement) {\n\t\t\tswitch (firstElement) {\n\t\t\t\tcase '..': {\n\t\t\t\t\tconst parent = nodeSrc.parent();\n\t\t\t\t\tif (parent) {\n\t\t\t\t\t\tif (parent == nodeSrc.scene().root()) {\n\t\t\t\t\t\t\treturn CoreWalker.SEPARATOR + pathElements.join(CoreWalker.SEPARATOR);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn this.makeAbsolutePath(parent, pathElements.join(CoreWalker.SEPARATOR));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase '.': {\n\t\t\t\t\treturn this.makeAbsolutePath(nodeSrc, pathElements.join(CoreWalker.SEPARATOR));\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\treturn [nodeSrc.path(), path].join(CoreWalker.SEPARATOR);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn nodeSrc.path();\n\t\t}\n\t}\n}\n","import {JsNodeFinder} from '../../engine/nodes/js/code/utils/NodeFinder';\nimport {ActorEvaluator} from '../../engine/nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {ActorEvaluatorGenerator} from '../../engine/nodes/js/code/assemblers/actor/ActorEvaluatorGenerator';\nimport {ActorFunctionData} from '../../engine/nodes/js/code/assemblers/actor/ActorPersistedConfig';\nimport {computed, ref, watch} from '../reactivity/CoreReactivity';\nimport {RegisterableVariable} from '../../engine/nodes/js/code/assemblers/_BaseJsPersistedConfigUtils';\nimport {ActorBuilderNode} from '../../engine/scene/utils/ActorsManager';\nimport {Object3D} from 'three';\nimport {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';\nimport {FUNC_POINTS_COUNT_FROM_OBJECT, FUNC_CORE_PRIMITIVE_CLASS_FACTORY} from '../../engine/nodes/js/utils/Common';\nimport {pointsCountFromObject} from '../geometry/entities/point/CorePointUtils';\nimport {corePrimitiveClassFactory} from '../geometry/CoreObjectFactory';\nimport {arrayToSet} from '../ArrayUtils';\n\nconst FUNCTION_ARGS_DICT = {\n\t[FUNC_POINTS_COUNT_FROM_OBJECT]: pointsCountFromObject,\n\t[FUNC_CORE_PRIMITIVE_CLASS_FACTORY]: corePrimitiveClassFactory,\n\tActorEvaluator,\n\tcomputed,\n\tref,\n\twatch,\n};\nconst FUNCTION_ARG_NAMES = Object.keys(FUNCTION_ARGS_DICT);\nconst FUNCTION_ARGS = FUNCTION_ARG_NAMES.map((argName) => (FUNCTION_ARGS_DICT as any)[argName]);\n\ntype OnCompilationCompletedHook = () => void;\nexport const ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT_NAME = 'ActorCompilationController-DUMMY';\nfunction _createDummyObject() {\n\tconst object = new Object3D();\n\tobject.name = ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT_NAME;\n\treturn object;\n}\nexport const ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT = _createDummyObject();\nexport class ActorCompilationController {\n\tconstructor(protected node: ActorBuilderNode) {}\n\n\tcompileIfRequired() {\n\t\tif (this.node.assemblerController()?.compileRequired()) {\n\t\t\tthis.compile();\n\t\t}\n\t\t// always clear objects,\n\t\t// so that we don't try and traverse physics objects that are not in the tree anymore\n\t\tthis._evaluatorGenerator.clearObjects();\n\t}\n\n\tprivate _evaluatorGenerator: ActorEvaluatorGenerator = new ActorEvaluatorGenerator(\n\t\t(object) => new ActorEvaluator(this.node, object)\n\t);\n\tevaluatorGenerator() {\n\t\treturn this._evaluatorGenerator;\n\t}\n\tprivate _functionData: ActorFunctionData | undefined;\n\tfunctionData() {\n\t\treturn this._functionData;\n\t}\n\tprivate _resetFunctionData() {\n\t\tthis._functionData = undefined;\n\t\t// if (!this.node.isDirty()) {\n\t\t// \tthis.node.setDirty();\n\t\t// }\n\t}\n\tupdateFromFunctionData(functionData: ActorFunctionData) {\n\t\tthis._functionData = functionData;\n\t\tconst {functionBody, variableNames, variablesByName, functionNames, functionsByName, paramConfigs, eventDatas} =\n\t\t\tthis._functionData;\n\n\t\tconst wrappedBody = `\n\t\t\ttry {\n\t\t\t\t${functionBody}\n\t\t\t} catch(e) {\n\t\t\t\tconsole.log(e);\n\t\t\t\t_setErrorFromError(e)\n\t\t\t\treturn null\n\t\t\t}`;\n\t\tconst _setErrorFromError = (e: Error) => {\n\t\t\tthis.node.states.error.set(e.message);\n\t\t};\n\n\t\tconst variables: RegisterableVariable[] = [];\n\t\tconst functions: Function[] = [];\n\t\tfor (const variableName of variableNames) {\n\t\t\tconst variable = variablesByName[variableName];\n\t\t\tvariables.push(variable);\n\t\t}\n\t\tfor (const functionName of functionNames) {\n\t\t\tconst _func = functionsByName[functionName];\n\t\t\tfunctions.push(_func);\n\t\t}\n\n\t\tconst paramConfigUniformNames: string[] = paramConfigs.map((pc) => pc.uniformName());\n\n\t\tparamConfigs.forEach((p) => p.applyToNode(this.node));\n\n\t\t// args & args names\n\t\tconst functionCreationArgs = [\n\t\t\t...FUNCTION_ARG_NAMES,\n\t\t\t'_setErrorFromError',\n\t\t\t...variableNames,\n\t\t\t...functionNames,\n\t\t\t// ...FUNCTION_UTILS.names,\n\t\t\t...paramConfigUniformNames,\n\t\t\twrappedBody,\n\t\t];\n\t\tconst functionEvalArgs = () => [\n\t\t\t...FUNCTION_ARGS,\n\t\t\t_setErrorFromError,\n\t\t\t// it is currently preferable to create a unique set of variables\n\t\t\t// for each evaluator\n\t\t\t...variables.map((v) => v.clone()),\n\t\t\t...functions,\n\t\t\t// ...FUNCTION_UTILS.functions,\n\t\t];\n\t\ttry {\n\t\t\tconst _function = new Function(...functionCreationArgs);\n\t\t\tconst _createEvaluator = (object: ObjectContent<CoreObjectType>) => {\n\t\t\t\tconst evaluatorClass = _function(...functionEvalArgs()) as typeof ActorEvaluator;\n\t\t\t\tconst evaluator = new evaluatorClass(this.node, object);\n\t\t\t\treturn evaluator;\n\t\t\t};\n\t\t\tconst evaluatorGenerator = new ActorEvaluatorGenerator((object) => {\n\t\t\t\tconst evaluator = _createEvaluator(object);\n\t\t\t\treturn this.node.scene().dispatchController.processActorEvaluator(evaluator) || evaluator;\n\t\t\t});\n\t\t\t//\n\t\t\tconst dummyEvaluator = _createEvaluator(ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT);\n\t\t\tevaluatorGenerator.setExpectedEvaluatorMethodNames(dummyEvaluator);\n\n\t\t\t//\n\t\t\t//\n\t\t\t// add inputEvents\n\t\t\t//\n\t\t\t//\n\t\t\tevaluatorGenerator.eventDatas = evaluatorGenerator.eventDatas || new Set();\n\t\t\tarrayToSet(eventDatas, evaluatorGenerator.eventDatas);\n\n\t\t\t//\n\t\t\t//\n\t\t\t// evaluator is ready\n\t\t\t//\n\t\t\t//\n\t\t\tthis._setEvaluatorGenerator(evaluatorGenerator);\n\t\t} catch (e) {\n\t\t\tconsole.warn(e);\n\t\t\tconsole.log(`failed to compile actor node ${this.node.path()}`);\n\t\t\tconsole.log({functionData});\n\t\t\tthis.node.states.error.set('failed to compile');\n\t\t}\n\t}\n\tprivate _setEvaluatorGenerator(evaluatorGenerator: ActorEvaluatorGenerator) {\n\t\tthis.node.scene().actorsManager.unregisterEvaluatorGenerator(this._evaluatorGenerator);\n\t\tthis._evaluatorGenerator.clearObjects();\n\t\tthis._evaluatorGenerator = evaluatorGenerator;\n\t\tthis.node.scene().actorsManager.registerEvaluatorGenerator(evaluatorGenerator);\n\t}\n\tcompile() {\n\t\tconst assemblerController = this.node.assemblerController();\n\t\tif (!assemblerController) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.node.states.error.clear();\n\t\t// main compilation (just used for reset in this assembler)\n\t\tassemblerController.assembler.updateFunction();\n\n\t\t// get functionData\n\t\tconst paramNodes = JsNodeFinder.findParamGeneratingNodes(this.node);\n\t\ttry {\n\t\t\tconst functionData = assemblerController.assembler.createFunctionData(paramNodes);\n\t\t\tif (!functionData) {\n\t\t\t\tthis._resetFunctionData();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.updateFromFunctionData(functionData);\n\t\t\tassemblerController.post_compile();\n\t\t} catch (err) {\n\t\t\tconsole.log(err);\n\t\t\tthis._resetFunctionData();\n\t\t\t// throw new Error(err);\n\t\t}\n\t\tthis._runOnCompilationCompletedCallbacks();\n\t}\n\n\tprivate _onCompilationCompletedCallbacks: Set<OnCompilationCompletedHook> | undefined;\n\taddOnCompilationCompleted(callback: OnCompilationCompletedHook) {\n\t\tthis._onCompilationCompletedCallbacks = this._onCompilationCompletedCallbacks || new Set();\n\t\tthis._onCompilationCompletedCallbacks.add(callback);\n\t}\n\tremoveOnCompilationCompleted(callback: OnCompilationCompletedHook) {\n\t\tif (!this._onCompilationCompletedCallbacks) {\n\t\t\treturn;\n\t\t}\n\t\tthis._onCompilationCompletedCallbacks.delete(callback);\n\t\tif (this._onCompilationCompletedCallbacks.size == 0) {\n\t\t\tthis._onCompilationCompletedCallbacks = undefined;\n\t\t}\n\t}\n\tprivate _runOnCompilationCompletedCallbacks() {\n\t\tif (!this._onCompilationCompletedCallbacks) {\n\t\t\treturn;\n\t\t}\n\t\tthis._onCompilationCompletedCallbacks.forEach((callback) => callback());\n\t}\n}\n","export enum AnimNodeEasing {\n\tNONE = 'none',\n\tPOWER1 = 'power1',\n\tPOWER2 = 'power2',\n\tPOWER3 = 'power3',\n\tPOWER4 = 'power4',\n\tBACK = 'back',\n\tELASTIC = 'elastic',\n\tBOUNCE = 'bounce',\n\t// rough\n\tSLOW = 'slow',\n\tSTEPS = 'steps',\n\tCIRC = 'circ',\n\tEXPO = 'expo',\n\tSINE = 'sine',\n\t// Custom\n}\nexport const EASINGS: AnimNodeEasing[] = [\n\tAnimNodeEasing.NONE,\n\tAnimNodeEasing.POWER1,\n\tAnimNodeEasing.POWER2,\n\tAnimNodeEasing.POWER3,\n\tAnimNodeEasing.POWER4,\n\tAnimNodeEasing.BACK,\n\tAnimNodeEasing.ELASTIC,\n\tAnimNodeEasing.BOUNCE,\n\n\tAnimNodeEasing.SLOW,\n\tAnimNodeEasing.STEPS,\n\tAnimNodeEasing.CIRC,\n\tAnimNodeEasing.EXPO,\n\tAnimNodeEasing.SINE,\n];\nexport enum InOutMode {\n\tIN = 'in',\n\tOUT = 'out',\n\tIN_OUT = 'inOut',\n}\nexport const IN_OUT_MODES: InOutMode[] = [InOutMode.IN, InOutMode.OUT, InOutMode.IN_OUT];\n","import {GsapTweenVars} from '../../thirdParty/gsap/gsapFactory';\nimport {AnimNodeEasing} from '../Constant';\nimport {TimelineBuilder} from '../TimelineBuilder';\n\nexport function animBuilderCommonVars(timelineBuilder: TimelineBuilder) {\n\tconst duration = timelineBuilder.duration();\n\tconst vars: GsapTweenVars = {duration: duration};\n\n\t// easing\n\tconst easing = timelineBuilder.easing() || AnimNodeEasing.NONE;\n\tif (easing) {\n\t\tvars.ease = easing;\n\t}\n\n\t// delay\n\tconst delay = timelineBuilder.delay();\n\tif (delay != null) {\n\t\tvars.delay = delay;\n\t}\n\n\t// repeat\n\tconst repeatParams = timelineBuilder.repeatParams();\n\tif (repeatParams) {\n\t\tvars.repeat = repeatParams.count;\n\t\tvars.repeatDelay = repeatParams.delay;\n\t\tvars.yoyo = repeatParams.yoyo;\n\t}\n\n\treturn vars;\n}\n","import {Object3D} from 'three';\nimport {ColorParam} from '../../engine/params/Color';\nimport {FloatParam} from '../../engine/params/Float';\nimport {IntegerParam} from '../../engine/params/Integer';\nimport {Vector2Param} from '../../engine/params/Vector2';\nimport {Vector3Param} from '../../engine/params/Vector3';\nimport {Vector4Param} from '../../engine/params/Vector4';\nimport {TimelineData} from '../thirdParty/gsap/gsap';\n\ninterface SceneGraphProperty {\n\tobject: Object3D;\n\tpropertyName: string;\n}\nexport type RegisterableProperty =\n\t| SceneGraphProperty\n\t| string\n\t| IntegerParam\n\t| FloatParam\n\t| Vector2Param\n\t| Vector3Param\n\t| Vector4Param\n\t| ColorParam;\n\nclass AnimatedPropertiesRegisterClass {\n\tprivate static _instance: AnimatedPropertiesRegisterClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new AnimatedPropertiesRegisterClass());\n\t}\n\tprivate _propertiesMap: Map<RegisterableProperty, TimelineData> = new Map();\n\tprivate constructor() {}\n\n\tregisterProp(property: RegisterableProperty, timelineData: TimelineData) {\n\t\tthis._propertiesMap.set(this._convert(property), timelineData);\n\t}\n\tdeRegisterProp(property: RegisterableProperty) {\n\t\tthis._propertiesMap.delete(this._convert(property));\n\t}\n\tregisteredTimelineForProperty(property: RegisterableProperty) {\n\t\treturn this._propertiesMap.get(this._convert(property));\n\t}\n\tregisteredPropertiesCount() {\n\t\tlet count = 0;\n\t\tthis._propertiesMap.forEach(() => {\n\t\t\tcount++;\n\t\t});\n\t\treturn count;\n\t}\n\n\tprivate _convert(property: RegisterableProperty) {\n\t\tif ((property as SceneGraphProperty).object) {\n\t\t\tconst sceneGraphProp = property as SceneGraphProperty;\n\t\t\treturn `${sceneGraphProp.object.uuid}:${sceneGraphProp.propertyName}`;\n\t\t} else {\n\t\t\treturn property;\n\t\t}\n\t}\n}\nexport const AnimatedPropertiesRegister = AnimatedPropertiesRegisterClass.instance();\n","import {AnimatedPropertiesRegister} from '../AnimatedPropertiesRegister';\nimport {StartOptions} from './AnimBuilderTypes';\n\nexport function animBuilderStartTimeline(options: StartOptions) {\n\tconst {timelineBuilder, timeline, vars, target, registerableProp, registerproperties} = options;\n\n\tconst position = timelineBuilder.position();\n\tconst positionParam = position ? position.toParameter() : undefined;\n\tconst existingTimeline = AnimatedPropertiesRegister.registeredTimelineForProperty(registerableProp);\n\tconst newTimeline = timeline.to(target, vars, positionParam);\n\n\tconst onStart = () => {\n\t\tif (existingTimeline) {\n\t\t\tif (existingTimeline.stoppable) {\n\t\t\t\texistingTimeline.timeline.kill();\n\t\t\t\tAnimatedPropertiesRegister.deRegisterProp(registerableProp);\n\t\t\t} else {\n\t\t\t\tnewTimeline.kill();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (registerproperties) {\n\t\t\tAnimatedPropertiesRegister.registerProp(registerableProp, {\n\t\t\t\ttimeline: newTimeline,\n\t\t\t\tstoppable: timelineBuilder.stoppable(),\n\t\t\t});\n\t\t}\n\t};\n\tconst onComplete = () => {\n\t\tAnimatedPropertiesRegister.deRegisterProp(registerableProp);\n\t};\n\n\tif (vars.onStart) {\n\t\tconst prevOnStart = vars.onStart;\n\t\tvars.onStart = () => {\n\t\t\tonStart();\n\t\t\tprevOnStart();\n\t\t};\n\t} else {\n\t\tvars.onStart = onStart;\n\t}\n\n\tif (vars.onComplete) {\n\t\tconst prevOnComplete = vars.onComplete;\n\t\tvars.onComplete = () => {\n\t\t\tonComplete();\n\t\t\tprevOnComplete();\n\t\t};\n\t} else {\n\t\tvars.onComplete = onComplete;\n\t}\n}\n","import {BaseNodeType} from '../../engine/nodes/_Base';\nimport {FloatParam} from '../../engine/params/Float';\nimport {Vector3Param} from '../../engine/params/Vector3';\nimport {BaseParamType} from '../../engine/params/_Base';\nimport {ParamType} from '../../engine/poly/ParamType';\nimport {Vector2} from 'three';\nimport {Vector3} from 'three';\nimport {Vector4} from 'three';\nimport {Color} from 'three';\nimport {Number2, Number3, Number4} from '../../types/GlobalTypes';\nimport {ColorParam} from '../../engine/params/Color';\nimport {Vector4Param} from '../../engine/params/Vector4';\nimport {Vector2Param} from '../../engine/params/Vector2';\nimport {IntegerParam} from '../../engine/params/Integer';\nimport {CubicInterpolant} from 'three';\n\nexport class FloatParamProxy {\n\tpublic proxyValue: number;\n\tconstructor(private param: FloatParam) {\n\t\tthis.proxyValue = param.value;\n\t}\n\tupdate(interpolant?: CubicInterpolant) {\n\t\tif (interpolant) {\n\t\t\tconst val = interpolant.evaluate(this.proxyValue)[0];\n\t\t\tthis.param.set(val);\n\t\t} else {\n\t\t\tthis.param.set(this.proxyValue);\n\t\t}\n\t}\n}\nexport class IntegerParamProxy {\n\tpublic proxyValue: number;\n\tconstructor(private param: IntegerParam) {\n\t\tthis.proxyValue = param.value;\n\t}\n\tupdate() {\n\t\tthis.param.set(this.proxyValue);\n\t}\n}\nexport class Vector2ParamProxy {\n\tpublic proxyValue: Vector2 = new Vector2();\n\tprivate _array: Number2 = [0, 0];\n\tconstructor(private param: Vector2Param) {\n\t\tthis.proxyValue.copy(param.value);\n\t}\n\tupdate() {\n\t\tthis.proxyValue.toArray(this._array);\n\t\tthis.param.set(this._array);\n\t}\n}\n\nexport class Vector3ParamProxy {\n\tpublic proxyValue: Vector3 = new Vector3();\n\tprivate _array: Number3 = [0, 0, 0];\n\tconstructor(private param: Vector3Param) {\n\t\tthis.proxyValue.copy(param.value);\n\t}\n\tupdate() {\n\t\tthis.proxyValue.toArray(this._array);\n\t\tthis.param.set(this._array);\n\t}\n}\n\nexport class Vector4ParamProxy {\n\tpublic proxyValue: Vector4 = new Vector4();\n\tprivate _array: Number4 = [0, 0, 0, 0];\n\tconstructor(private param: Vector4Param) {\n\t\tthis.proxyValue.copy(param.value);\n\t}\n\tupdate() {\n\t\tthis.proxyValue.toArray(this._array);\n\t\tthis.param.set(this._array);\n\t}\n}\nexport class ColorParamProxy {\n\tpublic proxyValue: Color = new Color();\n\tprivate _array: Number3 = [0, 0, 0];\n\tconstructor(private param: ColorParam) {\n\t\tthis.proxyValue.copy(param.valuePreConversion());\n\t}\n\tupdate() {\n\t\tthis.proxyValue.toArray(this._array);\n\t\tthis.param.set(this._array);\n\t}\n}\n\ntype AnimationParamProxy =\n\t| FloatParamProxy\n\t| IntegerParamProxy\n\t| Vector2ParamProxy\n\t| Vector3ParamProxy\n\t| ColorParamProxy\n\t| Vector4ParamProxy;\n\nexport class AnimationNodeParamsProxy {\n\tprivate _map: Map<BaseParamType, AnimationParamProxy> = new Map();\n\tconstructor(node: BaseNodeType) {\n\t\tconst params = node.params.all;\n\t\tfor (const param of params) {\n\t\t\tconst paramProxy = this._createParamProxy(param);\n\t\t\tif (paramProxy) {\n\t\t\t\tthis._map.set(param, paramProxy);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _createParamProxy(param: BaseParamType) {\n\t\tswitch (param.type()) {\n\t\t\tcase ParamType.INTEGER: {\n\t\t\t\treturn new IntegerParamProxy(param as IntegerParam);\n\t\t\t}\n\t\t\tcase ParamType.FLOAT: {\n\t\t\t\treturn new FloatParamProxy(param as FloatParam);\n\t\t\t}\n\t\t\tcase ParamType.VECTOR2: {\n\t\t\t\treturn new Vector2ParamProxy(param as Vector2Param);\n\t\t\t}\n\t\t\tcase ParamType.VECTOR3: {\n\t\t\t\treturn new Vector3ParamProxy(param as Vector3Param);\n\t\t\t}\n\t\t\tcase ParamType.COLOR: {\n\t\t\t\treturn new ColorParamProxy(param as ColorParam);\n\t\t\t}\n\t\t\tcase ParamType.VECTOR4: {\n\t\t\t\treturn new Vector4ParamProxy(param as Vector4Param);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetParamProxy(param: BaseParamType) {\n\t\treturn this._map.get(param);\n\t}\n}\n","import {BaseNodeType} from '../../engine/nodes/_Base';\nimport {BaseParamType} from '../../engine/params/_Base';\nimport {AnimationNodeParamsProxy} from './ParamProxy';\n\nclass NodeParamProxiesRegisterClass {\n\tprivate static _instance: NodeParamProxiesRegisterClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NodeParamProxiesRegisterClass());\n\t}\n\tprivate _map: Map<BaseNodeType, AnimationNodeParamsProxy> = new Map();\n\tprivate constructor() {}\n\n\tnodeProxy(node: BaseNodeType) {\n\t\tconst existingProxy = this._map.get(node);\n\t\tif (existingProxy) {\n\t\t\treturn existingProxy;\n\t\t}\n\t\tconst newProxy = new AnimationNodeParamsProxy(node);\n\t\tthis._map.set(node, newProxy);\n\t\treturn newProxy;\n\t}\n\tparamProxy(param: BaseParamType) {\n\t\treturn this.nodeProxy(param.node).getParamProxy(param);\n\t}\n}\nexport const NodeParamProxiesRegister = NodeParamProxiesRegisterClass.instance();\n","import {TypeAssert} from '../../../engine/poly/Assert';\nimport {Operation} from './AnimBuilderTypes';\n\nexport function AnimBuilderWithOp(currentValue: number, value: number, operation: Operation) {\n\tswitch (operation) {\n\t\tcase Operation.SET:\n\t\t\treturn value;\n\t\tcase Operation.ADD:\n\t\t\treturn currentValue + value;\n\t\tcase Operation.SUBTRACT:\n\t\t\treturn currentValue - value;\n\t}\n\tTypeAssert.unreachable(operation);\n}\n","import {Vector4} from 'three';\nimport {Vector4Param} from '../../../../engine/params/Vector4';\nimport {Poly} from '../../../../engine/Poly';\nimport {NodeParamProxiesRegister} from '../../NodeParamProxiesRegister';\nimport {Vector4ParamProxy} from '../../ParamProxy';\nimport {AnimPropertyTargetValue} from '../../TimelineBuilderProperty';\nimport {AddToTimelineOptions} from '../AnimBuilderTypes';\nimport {animBuilderCommonVars} from '../Common';\nimport {animBuilderStartTimeline} from '../StartTimeline';\nimport {AnimBuilderWithOp} from '../WithOp';\n\nexport function populateVarsForParamVector4(\n\tparam: Vector4Param,\n\ttargetValue: AnimPropertyTargetValue,\n\toptions: AddToTimelineOptions\n) {\n\tif (!(targetValue instanceof Vector4)) {\n\t\tPoly.warn(\n\t\t\t`TimelineBuilderProperty error: cannot animate vector4 param '${param.path()}' with targetValue`,\n\t\t\ttargetValue\n\t\t);\n\t\treturn;\n\t}\n\tconst proxy = NodeParamProxiesRegister.paramProxy(param) as Vector4ParamProxy;\n\tif (!proxy) {\n\t\treturn;\n\t}\n\tconst vars = animBuilderCommonVars(options.timelineBuilder);\n\tvars.onUpdate = () => {\n\t\tproxy.update();\n\t};\n\tconst operation = options.timelineBuilder.operation();\n\tvars.x = AnimBuilderWithOp(param.value.x, targetValue.x, operation);\n\tvars.y = AnimBuilderWithOp(param.value.y, targetValue.y, operation);\n\tvars.z = AnimBuilderWithOp(param.value.z, targetValue.z, operation);\n\tvars.w = AnimBuilderWithOp(param.value.w, targetValue.w, operation);\n\tanimBuilderStartTimeline({...options, vars, target: proxy.proxyValue, registerableProp: param});\n}\n","import {Color, Vector3} from 'three';\nimport {ColorParam} from '../../../../engine/params/Color';\nimport {Poly} from '../../../../engine/Poly';\nimport {NodeParamProxiesRegister} from '../../NodeParamProxiesRegister';\nimport {ColorParamProxy} from '../../ParamProxy';\nimport {AnimPropertyTargetValue} from '../../TimelineBuilderProperty';\nimport {AddToTimelineOptions} from '../AnimBuilderTypes';\nimport {animBuilderCommonVars} from '../Common';\nimport {animBuilderStartTimeline} from '../StartTimeline';\nimport {AnimBuilderWithOp} from '../WithOp';\nimport {Operation} from '../AnimBuilderTypes';\nimport {GsapTweenVars} from '../../../thirdParty/gsap/gsapFactory';\n\nexport function populateVarsForParamColor(\n\tparam: ColorParam,\n\ttargetValue: AnimPropertyTargetValue,\n\toptions: AddToTimelineOptions\n) {\n\tif (!(targetValue instanceof Color || targetValue instanceof Vector3)) {\n\t\tPoly.warn(\n\t\t\t`TimelineBuilderProperty error: cannot animate color param '${param.path()}' with targetValue`,\n\t\t\ttargetValue\n\t\t);\n\t\treturn;\n\t}\n\tconst proxy = NodeParamProxiesRegister.paramProxy(param) as ColorParamProxy;\n\tif (!proxy) {\n\t\treturn;\n\t}\n\tconst vars = animBuilderCommonVars(options.timelineBuilder);\n\tvars.onUpdate = () => {\n\t\tproxy.update();\n\t};\n\tconst operation = options.timelineBuilder.operation();\n\tconst x = targetValue instanceof Color ? targetValue.r : targetValue.x;\n\tconst y = targetValue instanceof Color ? targetValue.g : targetValue.y;\n\tconst z = targetValue instanceof Color ? targetValue.b : targetValue.z;\n\tvars.r = AnimBuilderWithOp(param.value.r, x, operation);\n\tvars.g = AnimBuilderWithOp(param.value.g, y, operation);\n\tvars.b = AnimBuilderWithOp(param.value.b, z, operation);\n\tanimBuilderStartTimeline({...options, vars, target: proxy.proxyValue, registerableProp: param});\n}\n\ninterface PopulateVarsForVector {\n\tvars: GsapTweenVars;\n\ttargetValue: Color;\n\ttargetProperty: Color;\n\tpropertyNames: string[];\n\toperation: Operation;\n}\nexport function populateVarsForColor(options: PopulateVarsForVector) {\n\tconst {vars, targetValue, targetProperty, propertyNames, operation} = options;\n\tfor (const propertyName of propertyNames) {\n\t\tvars[propertyName] = AnimBuilderWithOp(\n\t\t\ttargetProperty[propertyName as 'r'],\n\t\t\ttargetValue[propertyName as 'r'],\n\t\t\toperation\n\t\t);\n\t}\n}\n","import {Vector3} from 'three';\nimport {Vector3Param} from '../../../../engine/params/Vector3';\nimport {Poly} from '../../../../engine/Poly';\nimport {NodeParamProxiesRegister} from '../../NodeParamProxiesRegister';\nimport {Vector3ParamProxy} from '../../ParamProxy';\nimport {AnimPropertyTargetValue} from '../../TimelineBuilderProperty';\nimport {AddToTimelineOptions} from '../AnimBuilderTypes';\nimport {animBuilderCommonVars} from '../Common';\nimport {animBuilderStartTimeline} from '../StartTimeline';\nimport {AnimBuilderWithOp} from '../WithOp';\n\nexport function populateVarsForParamVector3(\n\tparam: Vector3Param,\n\ttargetValue: AnimPropertyTargetValue,\n\toptions: AddToTimelineOptions\n) {\n\tif (!(targetValue instanceof Vector3)) {\n\t\tPoly.warn(\n\t\t\t`TimelineBuilderProperty error: cannot animate vector3 param '${param.path()}' with targetValue`,\n\t\t\ttargetValue\n\t\t);\n\t\treturn;\n\t}\n\tconst proxy = NodeParamProxiesRegister.paramProxy(param) as Vector3ParamProxy;\n\tif (!proxy) {\n\t\treturn;\n\t}\n\tconst vars = animBuilderCommonVars(options.timelineBuilder);\n\tvars.onUpdate = () => {\n\t\tproxy.update();\n\t};\n\tconst operation = options.timelineBuilder.operation();\n\tvars.x = AnimBuilderWithOp(param.value.x, targetValue.x, operation);\n\tvars.y = AnimBuilderWithOp(param.value.y, targetValue.y, operation);\n\tvars.z = AnimBuilderWithOp(param.value.z, targetValue.z, operation);\n\tanimBuilderStartTimeline({...options, vars, target: proxy.proxyValue, registerableProp: param});\n}\n","import {Vector2} from 'three';\nimport {Vector2Param} from '../../../../engine/params/Vector2';\nimport {Poly} from '../../../../engine/Poly';\nimport {NodeParamProxiesRegister} from '../../NodeParamProxiesRegister';\nimport {Vector2ParamProxy} from '../../ParamProxy';\nimport {AnimPropertyTargetValue} from '../../TimelineBuilderProperty';\nimport {AddToTimelineOptions} from '../AnimBuilderTypes';\nimport {animBuilderCommonVars} from '../Common';\nimport {animBuilderStartTimeline} from '../StartTimeline';\nimport {AnimBuilderWithOp} from '../WithOp';\n\nexport function populateVarsForParamVector2(\n\tparam: Vector2Param,\n\ttargetValue: AnimPropertyTargetValue,\n\toptions: AddToTimelineOptions\n) {\n\tif (!(targetValue instanceof Vector2)) {\n\t\tPoly.warn(\n\t\t\t`TimelineBuilderProperty error: cannot animate vector2 param '${param.path()}' with targetValue`,\n\t\t\ttargetValue\n\t\t);\n\t\treturn;\n\t}\n\tconst proxy = NodeParamProxiesRegister.paramProxy(param) as Vector2ParamProxy;\n\tif (!proxy) {\n\t\treturn;\n\t}\n\tconst vars = animBuilderCommonVars(options.timelineBuilder);\n\tvars.onUpdate = () => {\n\t\tproxy.update();\n\t};\n\tconst operation = options.timelineBuilder.operation();\n\tvars.x = AnimBuilderWithOp(param.value.x, targetValue.x, operation);\n\tvars.y = AnimBuilderWithOp(param.value.y, targetValue.y, operation);\n\tanimBuilderStartTimeline({...options, vars, target: proxy.proxyValue, registerableProp: param});\n}\n","import {FloatParam} from '../../../../engine/params/Float';\nimport {IntegerParam} from '../../../../engine/params/Integer';\nimport {Poly} from '../../../../engine/Poly';\nimport {GsapTweenVars} from '../../../thirdParty/gsap/gsapFactory';\nimport {isNumber} from '../../../Type';\nimport {NodeParamProxiesRegister} from '../../NodeParamProxiesRegister';\nimport {FloatParamProxy, IntegerParamProxy} from '../../ParamProxy';\nimport {AnimPropertyTargetValue} from '../../TimelineBuilderProperty';\nimport {AddToTimelineOptions, Operation} from '../AnimBuilderTypes';\nimport {animBuilderCommonVars} from '../Common';\nimport {animBuilderStartTimeline} from '../StartTimeline';\nimport {AnimBuilderWithOp} from '../WithOp';\n\nexport function populateVarsForSingleNumber(\n\tparam: IntegerParam | FloatParam,\n\ttargetValue: AnimPropertyTargetValue,\n\toptions: AddToTimelineOptions\n) {\n\tif (!isNumber(targetValue)) {\n\t\tPoly.warn(\n\t\t\t`TimelineBuilderProperty error: cannot animate float/integer param '${param.path()}' with targetValue`,\n\t\t\ttargetValue\n\t\t);\n\t\treturn;\n\t}\n\tconst proxy = NodeParamProxiesRegister.paramProxy(param) as FloatParamProxy | IntegerParamProxy;\n\tif (!proxy) {\n\t\treturn;\n\t}\n\tconst keyframes = options.timelineBuilder.keyframes();\n\tconst interpolant = keyframes ? keyframes.createInterpolant() : undefined;\n\tconst vars = animBuilderCommonVars(options.timelineBuilder);\n\tvars.onUpdate = () => {\n\t\tproxy.update(interpolant);\n\t};\n\tif (keyframes) {\n\t\t// TODO: keyframes should change duration\n\t\t// vars.duration = 1\n\t\ttargetValue = 1;\n\t}\n\n\tconst operation = options.timelineBuilder.operation();\n\tvars.proxyValue = AnimBuilderWithOp(param.value, targetValue, operation);\n\tanimBuilderStartTimeline({...options, vars, target: proxy, registerableProp: param});\n}\n\ninterface PopulateVarsForNumber {\n\tvars: GsapTweenVars;\n\ttargetValue: number;\n\ttargetProperty: number;\n\tpropertyNames: string[];\n\toperation: Operation;\n}\nexport function populateVarsForNumber(options: PopulateVarsForNumber) {\n\tconst {vars, targetValue, targetProperty, propertyNames, operation} = options;\n\tfor (const property_name of propertyNames) {\n\t\tvars[property_name] = AnimBuilderWithOp(targetProperty, targetValue, operation);\n\t}\n}\n","import {Vector2, Vector3, Vector4} from 'three';\nimport {GsapTweenVars} from '../../../thirdParty/gsap/gsapFactory';\nimport {Operation} from '../AnimBuilderTypes';\nimport {AnimBuilderWithOp} from '../WithOp';\n\ntype Vector = Vector2 | Vector3 | Vector4;\ninterface PopulateVarsForVector {\n\tvars: GsapTweenVars;\n\ttargetValue: Vector;\n\ttargetProperty: Vector;\n\tpropertyNames: string[];\n\toperation: Operation;\n}\nexport function populateVarsForVector(options: PopulateVarsForVector) {\n\tconst {vars, targetValue, targetProperty, propertyNames, operation} = options;\n\tfor (const propertyName of propertyNames) {\n\t\tvars[propertyName] = AnimBuilderWithOp(\n\t\t\ttargetProperty[propertyName as 'x'],\n\t\t\ttargetValue[propertyName as 'x'],\n\t\t\toperation\n\t\t);\n\t}\n}\n","import {Quaternion} from 'three';\nimport {GsapTweenVars} from '../../../thirdParty/gsap/gsapFactory';\n\ninterface PopulateVarsForVector {\n\tvars: GsapTweenVars;\n\ttargetValue: Quaternion;\n\ttargetProperty: Quaternion;\n}\nexport function populateVarsAndCreateProxyForQuaternion(options: PopulateVarsForVector) {\n\tconst {vars, targetValue, targetProperty} = options;\n\tconst proxy = {value: 0};\n\tconst qTarget = targetProperty;\n\tconst qStart = new Quaternion().copy(targetProperty);\n\tconst qEnd = targetValue;\n\tvars.onUpdate = () => {\n\t\tqTarget.slerpQuaternions(qStart, qEnd, proxy.value);\n\t};\n\tvars.value = 1;\n\treturn proxy;\n}\n","import {Euler, Vector3} from 'three';\nimport {GsapTweenVars} from '../../../thirdParty/gsap/gsapFactory';\nimport {Operation} from '../AnimBuilderTypes';\nimport {AnimBuilderWithOp} from '../WithOp';\n\ninterface PopulateVarsForVector {\n\tvars: GsapTweenVars;\n\ttargetValue: Vector3;\n\ttargetProperty: Euler;\n\tpropertyNames: string[];\n\toperation: Operation;\n}\nexport function populateVarsForEuler(options: PopulateVarsForVector) {\n\tconst {vars, targetValue, targetProperty, propertyNames, operation} = options;\n\tfor (const propertyName of propertyNames) {\n\t\tvars[propertyName] = AnimBuilderWithOp(\n\t\t\ttargetProperty[propertyName as 'x'],\n\t\t\ttargetValue[propertyName as 'x'],\n\t\t\toperation\n\t\t);\n\t}\n}\n","import {Object3D,Quaternion,Color,Vector2,Vector3,Vector4} from 'three';\nimport {} from 'three';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport {BaseParamType} from '../../engine/params/_Base';\nimport {ParamType} from '../../engine/poly/ParamType';\nimport {Vector2Param} from '../../engine/params/Vector2';\nimport {Vector3Param} from '../../engine/params/Vector3';\nimport {Vector4Param} from '../../engine/params/Vector4';\nimport {Poly} from '../../engine/Poly';\nimport {isNumber,isEuler,isVector,isColor,isQuaternion} from '../Type';\nimport {ColorParam} from '../../engine/params/Color';\nimport {IntegerParam} from '../../engine/params/Integer';\nimport {RegisterableProperty} from './AnimatedPropertiesRegister';\nimport {animBuilderCommonVars} from './vars/Common';\nimport {AddToTimelineOptions, Operation} from './vars/AnimBuilderTypes';\nimport {animBuilderStartTimeline} from './vars/StartTimeline';\nimport {populateVarsForParamVector4} from './vars/type/Vector4';\nimport {populateVarsForColor, populateVarsForParamColor} from './vars/type/Color';\nimport {populateVarsForParamVector3} from './vars/type/Vector3';\nimport {populateVarsForParamVector2} from './vars/type/Vector2';\nimport {populateVarsForNumber, populateVarsForSingleNumber} from './vars/type/Number';\nimport {populateVarsForVector} from './vars/type/Vector';\nimport {populateVarsAndCreateProxyForQuaternion} from './vars/type/Quaternion';\nimport {populateVarsForEuler} from './vars/type/Euler';\nimport type {GsapTweenVars} from '../thirdParty/gsap/gsapFactory';\n\nexport type AnimPropertyTargetValue = number | Vector2 | Vector3 | Color | Vector4 | Quaternion;\n\ninterface Object3DProps {\n\ttargetProperty: AnimPropertyTargetValue;\n\ttoTarget: object;\n\tpropertyNames: string[];\n}\ninterface PopulateVarsOptions {\n\tvars: GsapTweenVars;\n\ttargetValue: AnimPropertyTargetValue;\n\ttargetProperty: AnimPropertyTargetValue;\n\tpropertyNames: string[];\n\toperation: Operation;\n}\n\nconst PROPERTY_SEPARATOR = '.';\n\nexport class TimelineBuilderProperty {\n\tprivate _propertyName: string | undefined;\n\tprivate _targetValue: AnimPropertyTargetValue | undefined;\n\tconstructor() {}\n\tsetName(name: string) {\n\t\tthis._propertyName = name;\n\t}\n\tsetTargetValue(value: AnimPropertyTargetValue) {\n\t\tthis._targetValue = value;\n\t}\n\tname() {\n\t\treturn this._propertyName;\n\t}\n\ttargetValue() {\n\t\treturn this._targetValue;\n\t}\n\n\tprivate _debug = false;\n\tsetDebug(debug: boolean) {\n\t\tthis._debug = debug;\n\t}\n\tprivate _printDebug(message: any) {\n\t\tif (!this._debug) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(message);\n\t}\n\n\tclone() {\n\t\tconst cloned = new TimelineBuilderProperty();\n\t\tif (this._propertyName) {\n\t\t\tcloned.setName(this._propertyName);\n\t\t}\n\t\tif (this._targetValue != null) {\n\t\t\tconst newTargetValue = isNumber(this._targetValue) ? this._targetValue : this._targetValue.clone();\n\t\t\tcloned.setTargetValue(newTargetValue);\n\t\t}\n\n\t\treturn cloned;\n\t}\n\n\taddToTimeline(options: AddToTimelineOptions) {\n\t\tconst target = options.propertyTarget || options.target;\n\t\tconst objects = target.objects() as Object3D[];\n\t\tconst node = target.node();\n\t\tthis._printDebug(['addToTimeline', target, objects, node]);\n\t\tif (objects) {\n\t\t\tthis._populateWithObjects(objects, options);\n\t\t}\n\t\tif (node) {\n\t\t\tthis._populateWithNode(node, options);\n\t\t}\n\t}\n\tprivate _populateWithObjects(objects: Object3D[], options: AddToTimelineOptions) {\n\t\tconst {timelineBuilder} = options;\n\t\tthis._printDebug(['_populateWithObjects', objects]);\n\t\tif (!this._propertyName) {\n\t\t\tPoly.warn('no property name given');\n\t\t\treturn;\n\t\t}\n\t\tif (this._targetValue == null) {\n\t\t\tPoly.warn('no target value given');\n\t\t\treturn;\n\t\t}\n\t\tconst operation = timelineBuilder.operation();\n\t\tconst updateCallback = timelineBuilder.updateCallback();\n\n\t\tfor (const object3d of objects) {\n\t\t\t// const target_property = (object3d as any)[this._property_name as any] as TargetValue;\n\t\t\t// let to_target: object | null = null;\n\t\t\tconst props = this._sceneGraphProps(object3d, this._propertyName);\n\t\t\tif (props) {\n\t\t\t\tconst registerableProp: RegisterableProperty = {\n\t\t\t\t\tobject: object3d,\n\t\t\t\t\tpropertyName: this._propertyName,\n\t\t\t\t};\n\t\t\t\tlet {targetProperty, toTarget, propertyNames} = props;\n\t\t\t\tconst vars = animBuilderCommonVars(timelineBuilder);\n\n\t\t\t\t// add update_matrix\n\t\t\t\tif (updateCallback && updateCallback.updateMatrix()) {\n\t\t\t\t\tconst oldMatrixAutoUpdate = object3d.matrixAutoUpdate;\n\t\t\t\t\t// matrixAutoUpdate should be set to true during onUpdate and not onStart\n\t\t\t\t\t// in case another timeline completes and sets it to false\n\t\t\t\t\tvars.onUpdate = () => {\n\t\t\t\t\t\tobject3d.matrixAutoUpdate = true;\n\t\t\t\t\t};\n\t\t\t\t\tvars.onComplete = () => {\n\t\t\t\t\t\tobject3d.matrixAutoUpdate = oldMatrixAutoUpdate;\n\t\t\t\t\t\t// we still need to update the matrix manually here,\n\t\t\t\t\t\t// as (it is specially noticeable on short animations)\n\t\t\t\t\t\t// the last step of the timeline will not have the matrix updated\n\t\t\t\t\t\t// and the object will therefore look like it has not fully completed\n\t\t\t\t\t\t// its animation.\n\t\t\t\t\t\tif (!object3d.matrixAutoUpdate) {\n\t\t\t\t\t\t\tobject3d.updateMatrix();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// handle quaternions as a special case\n\t\t\t\tif (targetProperty instanceof Quaternion && this._targetValue instanceof Quaternion) {\n\t\t\t\t\ttoTarget = populateVarsAndCreateProxyForQuaternion({\n\t\t\t\t\t\ttargetValue: this._targetValue,\n\t\t\t\t\t\tvars,\n\t\t\t\t\t\ttargetProperty,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis._populateVarsForObjectProperty({\n\t\t\t\t\ttargetValue: this._targetValue,\n\t\t\t\t\tvars,\n\t\t\t\t\ttargetProperty,\n\t\t\t\t\tpropertyNames,\n\t\t\t\t\toperation,\n\t\t\t\t});\n\n\t\t\t\tif (toTarget) {\n\t\t\t\t\tanimBuilderStartTimeline({...options, vars, target: toTarget, registerableProp});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _populateVarsForObjectProperty(options: PopulateVarsOptions) {\n\t\tconst {vars, targetValue, targetProperty, propertyNames, operation} = options;\n\t\tfunction warnMismatch(expectedType: string) {\n\t\t\tPoly.warn(\n\t\t\t\t`mismatch between targetValue and targetProperty (expected ${expectedType})`,\n\t\t\t\ttargetValue,\n\t\t\t\ttargetProperty\n\t\t\t);\n\t\t}\n\t\t// number\n\t\tif (isNumber(targetProperty)) {\n\t\t\tif (isNumber(targetValue)) {\n\t\t\t\treturn populateVarsForNumber({targetValue, vars, targetProperty, propertyNames, operation});\n\t\t\t}\n\t\t\treturn warnMismatch('number');\n\t\t}\n\t\t// euler (needs to be positioned before the isVector, as it would other be caught in the isVector )\n\t\t// note that for euler, we first test targetProperty, as otherwise a 'position' property would test true here\n\t\tif (isEuler(targetProperty)) {\n\t\t\tif (targetValue instanceof Vector3) {\n\t\t\t\treturn populateVarsForEuler({targetValue, vars, targetProperty, propertyNames, operation});\n\t\t\t}\n\t\t\treturn warnMismatch('euler');\n\t\t}\n\t\t// vector\n\t\tif (isVector(targetProperty)) {\n\t\t\tif (isVector(targetValue)) {\n\t\t\t\treturn populateVarsForVector({targetValue, vars, targetProperty, propertyNames, operation});\n\t\t\t}\n\t\t\treturn warnMismatch('vector');\n\t\t}\n\t\t// color\n\t\tif (isColor(targetProperty)) {\n\t\t\tif (isColor(targetValue)) {\n\t\t\t\treturn populateVarsForColor({targetValue, vars, targetProperty, propertyNames, operation});\n\t\t\t}\n\t\t\treturn warnMismatch('color');\n\t\t}\n\n\t\tif (isQuaternion(targetProperty)) {\n\t\t\t//\n\t\t}\n\t\tPoly.warn(`targetValue and targetProp are not recognized types`, targetValue, targetProperty);\n\t}\n\n\tprivate _sceneGraphProps(object: object, propertyName: string): Object3DProps | undefined {\n\t\tconst elements = propertyName.split(PROPERTY_SEPARATOR);\n\t\tif (elements.length > 1) {\n\t\t\tconst firstElement = elements.shift() as string;\n\t\t\tconst subObject = (object as any)[firstElement as any] as object;\n\t\t\tif (subObject) {\n\t\t\t\tconst subPropertyName = elements.join(PROPERTY_SEPARATOR);\n\t\t\t\treturn this._sceneGraphProps(subObject, subPropertyName);\n\t\t\t} else {\n\t\t\t\tPoly.warn(`property ${firstElement} not found on object`, object);\n\t\t\t}\n\t\t} else {\n\t\t\tconst targetProperty = (object as any)[propertyName as any] as AnimPropertyTargetValue;\n\t\t\tlet toTarget: object | null = null;\n\t\t\tconst propertyNames: string[] = [];\n\t\t\tif (isNumber(targetProperty)) {\n\t\t\t\ttoTarget = object;\n\t\t\t\tpropertyNames.push(propertyName);\n\t\t\t} else {\n\t\t\t\ttoTarget = targetProperty;\n\t\t\t\tif (this._targetValue instanceof Vector2) {\n\t\t\t\t\tpropertyNames.push('x', 'y');\n\t\t\t\t}\n\t\t\t\tif (this._targetValue instanceof Vector3) {\n\t\t\t\t\tpropertyNames.push('x', 'y', 'z');\n\t\t\t\t}\n\t\t\t\tif (this._targetValue instanceof Vector4) {\n\t\t\t\t\tpropertyNames.push('x', 'y', 'z', 'w');\n\t\t\t\t}\n\t\t\t\tif (this._targetValue instanceof Color) {\n\t\t\t\t\tpropertyNames.push('r', 'g', 'b');\n\t\t\t\t}\n\t\t\t\tif (this._targetValue instanceof Quaternion) {\n\t\t\t\t\t// is_quaternion = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttargetProperty: targetProperty,\n\t\t\t\ttoTarget: toTarget,\n\t\t\t\tpropertyNames: propertyNames,\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate _populateWithNode(node: BaseNodeType, options: AddToTimelineOptions) {\n\t\tthis._printDebug(['_populateWithNode', node]);\n\t\tconst targetParam = node.p[this._propertyName as any] as BaseParamType;\n\t\tthis._printDebug(['targetParam', targetParam]);\n\t\tif (!targetParam) {\n\t\t\tPoly.warn(`${this._propertyName} not found on node ${node.path()}`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (targetParam) {\n\t\t\tthis._populateVarsForParam(targetParam, options);\n\t\t}\n\t}\n\n\tprivate _populateVarsForParam(param: BaseParamType, options: AddToTimelineOptions) {\n\t\tthis._printDebug(['_populateVarsForParam', param]);\n\t\tif (this._targetValue == null) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (param.type()) {\n\t\t\tcase ParamType.INTEGER:\n\t\t\tcase ParamType.FLOAT: {\n\t\t\t\treturn populateVarsForSingleNumber(param as IntegerParam, this._targetValue, options);\n\t\t\t}\n\t\t\tcase ParamType.VECTOR2: {\n\t\t\t\treturn populateVarsForParamVector2(param as Vector2Param, this._targetValue, options);\n\t\t\t}\n\t\t\tcase ParamType.VECTOR3: {\n\t\t\t\treturn populateVarsForParamVector3(param as Vector3Param, this._targetValue, options);\n\t\t\t}\n\t\t\tcase ParamType.COLOR: {\n\t\t\t\treturn populateVarsForParamColor(param as ColorParam, this._targetValue, options);\n\t\t\t}\n\t\t\tcase ParamType.VECTOR4: {\n\t\t\t\treturn populateVarsForParamVector4(param as Vector4Param, this._targetValue, options);\n\t\t\t}\n\t\t}\n\t\tPoly.warn(`param type cannot be animated (yet): '${param.type()}' '${param.path()}'`);\n\t}\n}\n","import {TimelineBuilderProperty, AnimPropertyTargetValue} from './TimelineBuilderProperty';\nimport {AnimPropertyTarget} from './PropertyTarget';\nimport {AnimationPosition} from './Position';\nimport {AnimationUpdateCallback} from './UpdateCallback';\nimport {RampValue} from '../../engine/params/ramp/RampValue';\nimport {AnimationRepeatParams, Operation, RegisterOptions} from './vars/AnimBuilderTypes';\nimport type {GsapCoreTimeline} from '../thirdParty/gsap/gsapFactory';\nimport {gsapTimeline} from '../thirdParty/gsap/gsapFactory';\n\nexport class TimelineBuilder {\n\tprivate _timelineBuilders: TimelineBuilder[] = [];\n\tprivate _parent: TimelineBuilder | undefined;\n\tprivate _target: AnimPropertyTarget | undefined;\n\tprivate _duration: number = 1;\n\tprivate _keyframes: RampValue | undefined;\n\tprivate _easing: string | undefined;\n\tprivate _operation: Operation = Operation.SET;\n\tprivate _repeatParams: AnimationRepeatParams | undefined;\n\tprivate _delay: number = 0;\n\tprivate _position: AnimationPosition | undefined;\n\tprivate _property: TimelineBuilderProperty | undefined;\n\tprivate _updateCallback: AnimationUpdateCallback | undefined;\n\tprivate _stoppable = true;\n\n\tprivate _debug = false;\n\tsetDebug(debug: boolean) {\n\t\tthis._debug = debug;\n\t}\n\tprivate _printDebug(message: any) {\n\t\tif (!this._debug) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(message);\n\t}\n\n\taddTimelineBuilder(timeline_builder: TimelineBuilder) {\n\t\tthis._timelineBuilders.push(timeline_builder);\n\t\ttimeline_builder.setParent(this);\n\t}\n\ttimelineBuilders() {\n\t\treturn this._timelineBuilders;\n\t}\n\tsetParent(parent: TimelineBuilder) {\n\t\tthis._parent = parent;\n\t}\n\tparent() {\n\t\treturn this._parent;\n\t}\n\n\tsetTarget(target: AnimPropertyTarget) {\n\t\tthis._target = target;\n\t\tfor (const builder of this._timelineBuilders) {\n\t\t\tbuilder.setTarget(target);\n\t\t}\n\t}\n\ttarget() {\n\t\treturn this._target;\n\t}\n\tsetDuration(duration: number) {\n\t\tif (duration >= 0) {\n\t\t\tthis._duration = duration;\n\t\t\tfor (const builder of this._timelineBuilders) {\n\t\t\t\tbuilder.setDuration(duration);\n\t\t\t}\n\t\t}\n\t}\n\tduration() {\n\t\treturn this._duration;\n\t}\n\tsetKeyframes(keyframes: RampValue) {\n\t\tthis._keyframes = keyframes;\n\t}\n\tkeyframes() {\n\t\treturn this._keyframes;\n\t}\n\n\tsetEasing(easing: string) {\n\t\tthis._easing = easing;\n\t\tfor (const builder of this._timelineBuilders) {\n\t\t\tbuilder.setEasing(easing);\n\t\t}\n\t}\n\teasing() {\n\t\treturn this._easing;\n\t}\n\tsetOperation(operation: Operation) {\n\t\tthis._operation = operation;\n\t\tfor (const builder of this._timelineBuilders) {\n\t\t\tbuilder.setOperation(operation);\n\t\t}\n\t}\n\toperation() {\n\t\treturn this._operation;\n\t}\n\tsetRepeatParams(repeat_params: AnimationRepeatParams) {\n\t\tthis._repeatParams = repeat_params;\n\t\tfor (const builder of this._timelineBuilders) {\n\t\t\tbuilder.setRepeatParams(repeat_params);\n\t\t}\n\t}\n\trepeatParams() {\n\t\treturn this._repeatParams;\n\t}\n\tsetDelay(delay: number) {\n\t\tthis._delay = delay;\n\t\tfor (const builder of this._timelineBuilders) {\n\t\t\tbuilder.setDelay(delay);\n\t\t}\n\t}\n\tdelay() {\n\t\treturn this._delay;\n\t}\n\tsetPosition(position: AnimationPosition | undefined) {\n\t\tthis._position = position;\n\t\t// That should not be recursive here,\n\t\t// otherwise the merge node will override timelines whose position may already been set\n\t\t// for (let builder of this._timeline_builders) {\n\t\t// \tbuilder.setPosition(position);\n\t\t// }\n\t}\n\tposition() {\n\t\treturn this._position;\n\t}\n\tsetStoppable(state: boolean) {\n\t\tthis._stoppable = state;\n\t}\n\tstoppable() {\n\t\treturn this._stoppable;\n\t}\n\n\tsetUpdateCallback(update_callback: AnimationUpdateCallback) {\n\t\tthis._updateCallback = update_callback;\n\t}\n\tupdateCallback() {\n\t\treturn this._updateCallback;\n\t}\n\t// merge(timeline_builder?: TimelineBuilder) {\n\t// \tif (!timeline_builder) {\n\t// \t\treturn;\n\t// \t}\n\t// }\n\tclone() {\n\t\tconst newTimelineBuilder = new TimelineBuilder();\n\t\tnewTimelineBuilder.setDuration(this._duration);\n\t\tnewTimelineBuilder.setOperation(this._operation);\n\t\tnewTimelineBuilder.setDelay(this._delay);\n\n\t\tif (this._target) {\n\t\t\tnewTimelineBuilder.setTarget(this._target.clone());\n\t\t}\n\t\tif (this._easing) {\n\t\t\tnewTimelineBuilder.setEasing(this._easing);\n\t\t}\n\t\tif (this._keyframes) {\n\t\t\tnewTimelineBuilder.setKeyframes(this._keyframes);\n\t\t}\n\t\tif (this._delay) {\n\t\t\tnewTimelineBuilder.setDelay(this._delay);\n\t\t}\n\t\tif (this._updateCallback) {\n\t\t\tnewTimelineBuilder.setUpdateCallback(this._updateCallback.clone());\n\t\t}\n\t\tif (this._repeatParams) {\n\t\t\tnewTimelineBuilder.setRepeatParams({\n\t\t\t\tcount: this._repeatParams.count,\n\t\t\t\tdelay: this._repeatParams.delay,\n\t\t\t\tyoyo: this._repeatParams.yoyo,\n\t\t\t});\n\t\t}\n\t\tif (this._property) {\n\t\t\tconst name = this._property.name();\n\t\t\tif (name) {\n\t\t\t\tnewTimelineBuilder.setPropertyName(name);\n\t\t\t}\n\t\t\tconst targetValue = this._property.targetValue();\n\t\t\tif (targetValue != null) {\n\t\t\t\tnewTimelineBuilder.setPropertyValue(targetValue);\n\t\t\t}\n\t\t}\n\t\tif (this._position) {\n\t\t\tnewTimelineBuilder.setPosition(this._position.clone());\n\t\t}\n\t\tnewTimelineBuilder.setStoppable(this._stoppable);\n\t\tfor (const childTimelineBuilder of this._timelineBuilders) {\n\t\t\tconst newChildTimelineBuilder = childTimelineBuilder.clone();\n\t\t\tnewTimelineBuilder.addTimelineBuilder(newChildTimelineBuilder);\n\t\t}\n\t\treturn newTimelineBuilder;\n\t}\n\n\tsetPropertyName(name: string) {\n\t\tthis.property().setName(name);\n\t}\n\tproperty() {\n\t\treturn (this._property = this._property || new TimelineBuilderProperty());\n\t}\n\tpropertyName() {\n\t\treturn this.property().name();\n\t}\n\tsetPropertyValue(value: AnimPropertyTargetValue) {\n\t\tthis.property().setTargetValue(value);\n\t}\n\tpropertyValue() {\n\t\treturn this._property?.targetValue();\n\t}\n\n\tpopulate(timeline: GsapCoreTimeline, options: RegisterOptions) {\n\t\tthis._printDebug(['populate', this, timeline, this._timelineBuilders]);\n\t\tfor (const timelineBuilder of this._timelineBuilders) {\n\t\t\tconst subTimeline = gsapTimeline();\n\t\t\tif (!subTimeline) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttimelineBuilder.setDebug(this._debug);\n\t\t\ttimelineBuilder.populate(subTimeline, options);\n\n\t\t\tconst position_param = timelineBuilder.position()?.toParameter() || undefined;\n\t\t\ttimeline.add(subTimeline, position_param);\n\t\t}\n\n\t\tif (this._property && this._target) {\n\t\t\tthis._property.setDebug(this._debug);\n\t\t\tthis._property.addToTimeline({timelineBuilder: this, timeline, target: this._target, ...options});\n\t\t}\n\t}\n}\n","import type {GsapTweenVars, GsapCoreTimeline} from '../../thirdParty/gsap/gsapFactory';\nimport {RegisterableProperty} from '../AnimatedPropertiesRegister';\nimport {AnimPropertyTarget} from '../PropertyTarget';\nimport {TimelineBuilder} from '../TimelineBuilder';\n\nexport interface RegisterOptions {\n\tregisterproperties?: boolean;\n\tpropertyTarget?: AnimPropertyTarget;\n}\nexport interface StartOptions extends RegisterOptions {\n\ttimelineBuilder: TimelineBuilder;\n\ttimeline: GsapCoreTimeline;\n\tvars: GsapTweenVars;\n\ttarget: object;\n\tregisterableProp: RegisterableProperty;\n}\n\nexport interface AddToTimelineOptions extends RegisterOptions {\n\ttimelineBuilder: TimelineBuilder;\n\ttimeline: GsapCoreTimeline;\n\ttarget: AnimPropertyTarget;\n}\n\nexport enum Operation {\n\tSET = 'set',\n\tADD = 'add',\n\tSUBTRACT = 'subtract',\n}\nexport const OPERATIONS: Operation[] = [Operation.SET, Operation.ADD, Operation.SUBTRACT];\n\nexport interface AnimationRepeatParams {\n\tcount: number;\n\tdelay: number;\n\tyoyo: boolean;\n}\n","import {EnvelopeOptions} from 'tone';\nimport {ToneAudioNodeOptions, ToneAudioNode} from 'tone/build/esm/core/context/ToneAudioNode';\nimport {Instrument} from 'tone/build/esm/instrument/Instrument';\nimport {OmniOscillatorSynthOptions} from 'tone/build/esm/source/oscillator/OscillatorInterface';\nimport {Source} from 'tone/build/esm/source/Source';\nimport {UserMedia} from 'tone/build/esm/source/UserMedia';\n\nexport type SourceType = Source<any> | UserMedia;\nexport type InstrumentType = Instrument<any>;\nexport type EnvelopeParamsType = Partial<Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>>;\nexport type OscillatorParamsType = Partial<OmniOscillatorSynthOptions>;\n\nexport class AudioBuilder {\n\t// private _synth: SynthType | undefined;\n\tprivate _source: SourceType | undefined;\n\tprivate _instrument: InstrumentType | undefined;\n\tprivate _audioNode: ToneAudioNode | undefined;\n\tprivate _oscillatorParams: OscillatorParamsType | undefined;\n\tprivate _envelopeParams: EnvelopeParamsType | undefined;\n\n\tsetAudioNode(inputNode: ToneAudioNode | undefined) {\n\t\tthis._audioNode = inputNode;\n\t}\n\taudioNode() {\n\t\treturn this._audioNode;\n\t}\n\tsetSource(source: SourceType | undefined) {\n\t\tthis._source = source;\n\t\tif (!this._audioNode) {\n\t\t\tthis.setAudioNode(source);\n\t\t}\n\t}\n\tsource() {\n\t\treturn this._source;\n\t}\n\tsetInstrument(instrument: InstrumentType | undefined) {\n\t\tthis._instrument = instrument;\n\t\tif (!this._audioNode) {\n\t\t\tthis.setAudioNode(instrument);\n\t\t}\n\t}\n\tinstrument() {\n\t\treturn this._instrument;\n\t}\n\tsetOscillatorParams(params: OscillatorParamsType | undefined) {\n\t\tthis._oscillatorParams = params;\n\t}\n\toscillatorParams() {\n\t\treturn this._oscillatorParams;\n\t}\n\tsetEnvelopeParams(params: EnvelopeParamsType | undefined) {\n\t\tthis._envelopeParams = params;\n\t}\n\tenvelopeParams() {\n\t\treturn this._envelopeParams;\n\t}\n\n\tclone() {\n\t\tconst newAudioBuilder = new AudioBuilder();\n\t\tnewAudioBuilder.setAudioNode(this._audioNode);\n\t\tnewAudioBuilder.setSource(this._source);\n\t\tnewAudioBuilder.setInstrument(this._instrument);\n\t\tnewAudioBuilder.setEnvelopeParams(this._envelopeParams);\n\t\treturn newAudioBuilder;\n\t}\n}\n","import {Note} from 'tone/build/esm/core/type/NoteUnits';\nexport const DEFAULT_NOTE: Note = 'C1';\nexport const ALL_NOTES: Note[] = [\n\t'Cbb-4',\n\t'Cb-4',\n\t'C-4',\n\t'C#-4',\n\t'Cx-4',\n\t'Dbb-4',\n\t'Db-4',\n\t'D-4',\n\t'D#-4',\n\t'Dx-4',\n\t'Ebb-4',\n\t'Eb-4',\n\t'E-4',\n\t'E#-4',\n\t'Ex-4',\n\t'Fbb-4',\n\t'Fb-4',\n\t'F-4',\n\t'F#-4',\n\t'Fx-4',\n\t'Gbb-4',\n\t'Gb-4',\n\t'G-4',\n\t'G#-4',\n\t'Gx-4',\n\t'Abb-4',\n\t'Ab-4',\n\t'A-4',\n\t'A#-4',\n\t'Ax-4',\n\t'Bbb-4',\n\t'Bb-4',\n\t'B-4',\n\t'B#-4',\n\t'Bx-4',\n\t'Cbb-3',\n\t'Cb-3',\n\t'C-3',\n\t'C#-3',\n\t'Cx-3',\n\t'Dbb-3',\n\t'Db-3',\n\t'D-3',\n\t'D#-3',\n\t'Dx-3',\n\t'Ebb-3',\n\t'Eb-3',\n\t'E-3',\n\t'E#-3',\n\t'Ex-3',\n\t'Fbb-3',\n\t'Fb-3',\n\t'F-3',\n\t'F#-3',\n\t'Fx-3',\n\t'Gbb-3',\n\t'Gb-3',\n\t'G-3',\n\t'G#-3',\n\t'Gx-3',\n\t'Abb-3',\n\t'Ab-3',\n\t'A-3',\n\t'A#-3',\n\t'Ax-3',\n\t'Bbb-3',\n\t'Bb-3',\n\t'B-3',\n\t'B#-3',\n\t'Bx-3',\n\t'Cbb-2',\n\t'Cb-2',\n\t'C-2',\n\t'C#-2',\n\t'Cx-2',\n\t'Dbb-2',\n\t'Db-2',\n\t'D-2',\n\t'D#-2',\n\t'Dx-2',\n\t'Ebb-2',\n\t'Eb-2',\n\t'E-2',\n\t'E#-2',\n\t'Ex-2',\n\t'Fbb-2',\n\t'Fb-2',\n\t'F-2',\n\t'F#-2',\n\t'Fx-2',\n\t'Gbb-2',\n\t'Gb-2',\n\t'G-2',\n\t'G#-2',\n\t'Gx-2',\n\t'Abb-2',\n\t'Ab-2',\n\t'A-2',\n\t'A#-2',\n\t'Ax-2',\n\t'Bbb-2',\n\t'Bb-2',\n\t'B-2',\n\t'B#-2',\n\t'Bx-2',\n\t'Cbb-1',\n\t'Cb-1',\n\t'C-1',\n\t'C#-1',\n\t'Cx-1',\n\t'Dbb-1',\n\t'Db-1',\n\t'D-1',\n\t'D#-1',\n\t'Dx-1',\n\t'Ebb-1',\n\t'Eb-1',\n\t'E-1',\n\t'E#-1',\n\t'Ex-1',\n\t'Fbb-1',\n\t'Fb-1',\n\t'F-1',\n\t'F#-1',\n\t'Fx-1',\n\t'Gbb-1',\n\t'Gb-1',\n\t'G-1',\n\t'G#-1',\n\t'Gx-1',\n\t'Abb-1',\n\t'Ab-1',\n\t'A-1',\n\t'A#-1',\n\t'Ax-1',\n\t'Bbb-1',\n\t'Bb-1',\n\t'B-1',\n\t'B#-1',\n\t'Bx-1',\n\t'Cbb0',\n\t'Cb0',\n\t'C0',\n\t'C#0',\n\t'Cx0',\n\t'Dbb0',\n\t'Db0',\n\t'D0',\n\t'D#0',\n\t'Dx0',\n\t'Ebb0',\n\t'Eb0',\n\t'E0',\n\t'E#0',\n\t'Ex0',\n\t'Fbb0',\n\t'Fb0',\n\t'F0',\n\t'F#0',\n\t'Fx0',\n\t'Gbb0',\n\t'Gb0',\n\t'G0',\n\t'G#0',\n\t'Gx0',\n\t'Abb0',\n\t'Ab0',\n\t'A0',\n\t'A#0',\n\t'Ax0',\n\t'Bbb0',\n\t'Bb0',\n\t'B0',\n\t'B#0',\n\t'Bx0',\n\t'Cbb1',\n\t'Cb1',\n\t'C1',\n\t'C#1',\n\t'Cx1',\n\t'Dbb1',\n\t'Db1',\n\t'D1',\n\t'D#1',\n\t'Dx1',\n\t'Ebb1',\n\t'Eb1',\n\t'E1',\n\t'E#1',\n\t'Ex1',\n\t'Fbb1',\n\t'Fb1',\n\t'F1',\n\t'F#1',\n\t'Fx1',\n\t'Gbb1',\n\t'Gb1',\n\t'G1',\n\t'G#1',\n\t'Gx1',\n\t'Abb1',\n\t'Ab1',\n\t'A1',\n\t'A#1',\n\t'Ax1',\n\t'Bbb1',\n\t'Bb1',\n\t'B1',\n\t'B#1',\n\t'Bx1',\n\t'Cbb2',\n\t'Cb2',\n\t'C2',\n\t'C#2',\n\t'Cx2',\n\t'Dbb2',\n\t'Db2',\n\t'D2',\n\t'D#2',\n\t'Dx2',\n\t'Ebb2',\n\t'Eb2',\n\t'E2',\n\t'E#2',\n\t'Ex2',\n\t'Fbb2',\n\t'Fb2',\n\t'F2',\n\t'F#2',\n\t'Fx2',\n\t'Gbb2',\n\t'Gb2',\n\t'G2',\n\t'G#2',\n\t'Gx2',\n\t'Abb2',\n\t'Ab2',\n\t'A2',\n\t'A#2',\n\t'Ax2',\n\t'Bbb2',\n\t'Bb2',\n\t'B2',\n\t'B#2',\n\t'Bx2',\n\t'Cbb3',\n\t'Cb3',\n\t'C3',\n\t'C#3',\n\t'Cx3',\n\t'Dbb3',\n\t'Db3',\n\t'D3',\n\t'D#3',\n\t'Dx3',\n\t'Ebb3',\n\t'Eb3',\n\t'E3',\n\t'E#3',\n\t'Ex3',\n\t'Fbb3',\n\t'Fb3',\n\t'F3',\n\t'F#3',\n\t'Fx3',\n\t'Gbb3',\n\t'Gb3',\n\t'G3',\n\t'G#3',\n\t'Gx3',\n\t'Abb3',\n\t'Ab3',\n\t'A3',\n\t'A#3',\n\t'Ax3',\n\t'Bbb3',\n\t'Bb3',\n\t'B3',\n\t'B#3',\n\t'Bx3',\n\t'Cbb4',\n\t'Cb4',\n\t'C4',\n\t'C#4',\n\t'Cx4',\n\t'Dbb4',\n\t'Db4',\n\t'D4',\n\t'D#4',\n\t'Dx4',\n\t'Ebb4',\n\t'Eb4',\n\t'E4',\n\t'E#4',\n\t'Ex4',\n\t'Fbb4',\n\t'Fb4',\n\t'F4',\n\t'F#4',\n\t'Fx4',\n\t'Gbb4',\n\t'Gb4',\n\t'G4',\n\t'G#4',\n\t'Gx4',\n\t'Abb4',\n\t'Ab4',\n\t'A4',\n\t'A#4',\n\t'Ax4',\n\t'Bbb4',\n\t'Bb4',\n\t'B4',\n\t'B#4',\n\t'Bx4',\n\t'Cbb5',\n\t'Cb5',\n\t'C5',\n\t'C#5',\n\t'Cx5',\n\t'Dbb5',\n\t'Db5',\n\t'D5',\n\t'D#5',\n\t'Dx5',\n\t'Ebb5',\n\t'Eb5',\n\t'E5',\n\t'E#5',\n\t'Ex5',\n\t'Fbb5',\n\t'Fb5',\n\t'F5',\n\t'F#5',\n\t'Fx5',\n\t'Gbb5',\n\t'Gb5',\n\t'G5',\n\t'G#5',\n\t'Gx5',\n\t'Abb5',\n\t'Ab5',\n\t'A5',\n\t'A#5',\n\t'Ax5',\n\t'Bbb5',\n\t'Bb5',\n\t'B5',\n\t'B#5',\n\t'Bx5',\n\t'Cbb6',\n\t'Cb6',\n\t'C6',\n\t'C#6',\n\t'Cx6',\n\t'Dbb6',\n\t'Db6',\n\t'D6',\n\t'D#6',\n\t'Dx6',\n\t'Ebb6',\n\t'Eb6',\n\t'E6',\n\t'E#6',\n\t'Ex6',\n\t'Fbb6',\n\t'Fb6',\n\t'F6',\n\t'F#6',\n\t'Fx6',\n\t'Gbb6',\n\t'Gb6',\n\t'G6',\n\t'G#6',\n\t'Gx6',\n\t'Abb6',\n\t'Ab6',\n\t'A6',\n\t'A#6',\n\t'Ax6',\n\t'Bbb6',\n\t'Bb6',\n\t'B6',\n\t'B#6',\n\t'Bx6',\n\t'Cbb7',\n\t'Cb7',\n\t'C7',\n\t'C#7',\n\t'Cx7',\n\t'Dbb7',\n\t'Db7',\n\t'D7',\n\t'D#7',\n\t'Dx7',\n\t'Ebb7',\n\t'Eb7',\n\t'E7',\n\t'E#7',\n\t'Ex7',\n\t'Fbb7',\n\t'Fb7',\n\t'F7',\n\t'F#7',\n\t'Fx7',\n\t'Gbb7',\n\t'Gb7',\n\t'G7',\n\t'G#7',\n\t'Gx7',\n\t'Abb7',\n\t'Ab7',\n\t'A7',\n\t'A#7',\n\t'Ax7',\n\t'Bbb7',\n\t'Bb7',\n\t'B7',\n\t'B#7',\n\t'Bx7',\n\t'Cbb8',\n\t'Cb8',\n\t'C8',\n\t'C#8',\n\t'Cx8',\n\t'Dbb8',\n\t'Db8',\n\t'D8',\n\t'D#8',\n\t'Dx8',\n\t'Ebb8',\n\t'Eb8',\n\t'E8',\n\t'E#8',\n\t'Ex8',\n\t'Fbb8',\n\t'Fb8',\n\t'F8',\n\t'F#8',\n\t'Fx8',\n\t'Gbb8',\n\t'Gb8',\n\t'G8',\n\t'G#8',\n\t'Gx8',\n\t'Abb8',\n\t'Ab8',\n\t'A8',\n\t'A#8',\n\t'Ax8',\n\t'Bbb8',\n\t'Bb8',\n\t'B8',\n\t'B#8',\n\t'Bx8',\n\t'Cbb9',\n\t'Cb9',\n\t'C9',\n\t'C#9',\n\t'Cx9',\n\t'Dbb9',\n\t'Db9',\n\t'D9',\n\t'D#9',\n\t'Dx9',\n\t'Ebb9',\n\t'Eb9',\n\t'E9',\n\t'E#9',\n\t'Ex9',\n\t'Fbb9',\n\t'Fb9',\n\t'F9',\n\t'F#9',\n\t'Fx9',\n\t'Gbb9',\n\t'Gb9',\n\t'G9',\n\t'G#9',\n\t'Gx9',\n\t'Abb9',\n\t'Ab9',\n\t'A9',\n\t'A#9',\n\t'Ax9',\n\t'Bbb9',\n\t'Bb9',\n\t'B9',\n\t'B#9',\n\t'Bx9',\n\t'Cbb10',\n\t'Cb10',\n\t'C10',\n\t'C#10',\n\t'Cx10',\n\t'Dbb10',\n\t'Db10',\n\t'D10',\n\t'D#10',\n\t'Dx10',\n\t'Ebb10',\n\t'Eb10',\n\t'E10',\n\t'E#10',\n\t'Ex10',\n\t'Fbb10',\n\t'Fb10',\n\t'F10',\n\t'F#10',\n\t'Fx10',\n\t'Gbb10',\n\t'Gb10',\n\t'G10',\n\t'G#10',\n\t'Gx10',\n\t'Abb10',\n\t'Ab10',\n\t'A10',\n\t'A#10',\n\t'Ax10',\n\t'Bbb10',\n\t'Bb10',\n\t'B10',\n\t'B#10',\n\t'Bx10',\n\t'Cbb11',\n\t'Cb11',\n\t'C11',\n\t'C#11',\n\t'Cx11',\n\t'Dbb11',\n\t'Db11',\n\t'D11',\n\t'D#11',\n\t'Dx11',\n\t'Ebb11',\n\t'Eb11',\n\t'E11',\n\t'E#11',\n\t'Ex11',\n\t'Fbb11',\n\t'Fb11',\n\t'F11',\n\t'F#11',\n\t'Fx11',\n\t'Gbb11',\n\t'Gb11',\n\t'G11',\n\t'G#11',\n\t'Gx11',\n\t'Abb11',\n\t'Ab11',\n\t'A11',\n\t'A#11',\n\t'Ax11',\n\t'Bbb11',\n\t'Bb11',\n\t'B11',\n\t'B#11',\n\t'Bx11',\n];\n","import {Player} from 'tone/build/esm/source/buffer/Player';\n\nexport type OnBeforePlayCallback = (offset: number) => void;\nexport type OnPlaySuccessCallback = () => void;\nexport type OnPlayErrorCallback = (err: unknown) => void;\nexport type OnStopCallback = () => void;\nexport interface PlayerCallbacks {\n\tonBeforePlay?: Set<OnBeforePlayCallback>;\n\tonPlaySuccess?: Set<OnPlaySuccessCallback>;\n\tonPlayError?: Set<OnPlayErrorCallback>;\n\tonStop?: Set<OnStopCallback>;\n}\nexport type PlayerEventName = 'onBeforePlay' | 'onPlaySuccess' | 'onPlayError' | 'onStop';\n\ntype CallbackByEventNameGeneric = {\n\t[key in PlayerEventName]: OnBeforePlayCallback | OnPlaySuccessCallback | OnPlayErrorCallback | OnStopCallback;\n};\nexport interface CallbackByEventName extends CallbackByEventNameGeneric {\n\tonBeforePlay: OnBeforePlayCallback;\n\tonPlaySuccess: OnPlaySuccessCallback;\n\tonPlayError: OnPlayErrorCallback;\n\tonStop: OnStopCallback;\n}\n\nexport class AudioPlayerCallbacksManagerClass {\n\tprivate static _instance: AudioPlayerCallbacksManagerClass;\n\tprivate constructor() {}\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new AudioPlayerCallbacksManagerClass());\n\t}\n\n\tprivate _callbacksByPlayer: Map<Player, PlayerCallbacks> = new Map();\n\n\tregisterPlayer(player: Player) {\n\t\tif (this._callbacksByPlayer.get(player)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._callbacksByPlayer.set(player, {});\n\t}\n\tderegisterPlayer(player: Player) {\n\t\t// in order for deregister to work,\n\t\t// we need to make sure that the player is not registered somewhere else by another node.\n\t\t// so we may instead have the players created here?\n\t\tthis._callbacksByPlayer.delete(player);\n\t}\n\n\t// onBeforePlay\n\tonBeforePlay(player: Player, callback: OnBeforePlayCallback) {\n\t\tthis._on(player, 'onBeforePlay', callback);\n\t}\n\tremoveOnBeforePlay(player: Player, callback: OnStopCallback) {\n\t\tthis._removeCallback(player, 'onBeforePlay', callback);\n\t}\n\trunOnBeforePlayCallbacks(player: Player, offset: number) {\n\t\tthis._callbacksByPlayer.get(player)?.onBeforePlay?.forEach((callback) => callback(offset));\n\t}\n\t// onPlaySuccess\n\tonPlaySuccess(player: Player, callback: OnPlaySuccessCallback) {\n\t\tthis._on(player, 'onPlaySuccess', callback);\n\t}\n\tremoveOnPlaySuccess(player: Player, callback: OnStopCallback) {\n\t\tthis._removeCallback(player, 'onPlaySuccess', callback);\n\t}\n\trunOnPlaySuccessCallbacks(player: Player) {\n\t\tthis._callbacksByPlayer.get(player)?.onPlaySuccess?.forEach((callback) => callback());\n\t}\n\t// onPlayError\n\tonPlayError(player: Player, callback: OnPlayErrorCallback) {\n\t\tthis._on(player, 'onPlayError', callback);\n\t}\n\tremoveOnPlayError(player: Player, callback: OnStopCallback) {\n\t\tthis._removeCallback(player, 'onPlayError', callback);\n\t}\n\trunOnPlayErrorCallbacks(player: Player, err: unknown) {\n\t\tthis._callbacksByPlayer.get(player)?.onPlayError?.forEach((callback) => callback(err));\n\t}\n\t// onStop\n\tonStop(player: Player, callback: OnStopCallback) {\n\t\tthis._on(player, 'onStop', callback);\n\t}\n\tremoveOnStop(player: Player, callback: OnStopCallback) {\n\t\tthis._removeCallback(player, 'onStop', callback);\n\t}\n\trunOnStopCallbacks(player: Player) {\n\t\tthis._callbacksByPlayer.get(player)?.onStop?.forEach((callback) => callback());\n\t}\n\t// generic\n\tprivate _on<E extends PlayerEventName>(player: Player, eventName: E, callback: CallbackByEventName[E]) {\n\t\tlet map = this._callbacksByPlayer.get(player);\n\t\tif (!map) {\n\t\t\tthis.registerPlayer(player);\n\t\t\tmap = this._callbacksByPlayer.get(player);\n\t\t}\n\t\tif (!map) {\n\t\t\treturn;\n\t\t}\n\t\tmap[eventName] = map[eventName] || (new Set() as any);\n\t\tmap[eventName]?.add(callback as any);\n\t}\n\tprivate _removeCallback<E extends PlayerEventName>(player: Player, eventName: E, callback: CallbackByEventName[E]) {\n\t\tlet map = this._callbacksByPlayer.get(player);\n\t\tif (!map) {\n\t\t\tthis.registerPlayer(player);\n\t\t\tmap = this._callbacksByPlayer.get(player);\n\t\t}\n\t\tif (!map) {\n\t\t\treturn;\n\t\t}\n\t\tmap[eventName]?.delete(callback as any);\n\t}\n}\n\nexport const AudioPlayerCallbacksManager = AudioPlayerCallbacksManagerClass.instance();\n","import {Camera, Vector2} from 'three';\nimport {arrayCompact} from '../ArrayUtils';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\nimport {AttribValue} from '../../types/GlobalTypes';\n\nexport const CORE_CAMERA_DEFAULT = {\n\tnear: 0.1,\n\tfar: 100.0,\n};\n\nexport interface UpdateProjectionOptions {\n\tresolution?: Vector2;\n}\n\nexport enum CameraAttribute {\n\tNODE_ID = '_Camera_nodeGeneratorId__',\n\tCONTROLS_NODE_ID = '_Camera_controlsNodeId',\n\tCSS_RENDERER_NODE_ID = '_Camera_CSSRendererNodeId',\n\tFRAME_MODE = '_Camera_frameMode',\n\tFRAME_MODE_EXPECTED_ASPECT_RATIO = '_Camera_frameModeExpectedAspectRatio',\n\tMAX_FPS = 'maxFPS', // do not add _Camera_ prefix, to make it easier to change\n\tMAX_FPS_DYNAMIC_CHANGE = '_Camera_maxFPSDynamicChange',\n\tVIEW_OFFSET_MIN = '_Camera_viewOffsetMin',\n\tVIEW_OFFSET_MAX = '_Camera_viewOffsetMax',\n\tPOST_PROCESS_NODE_ID = '_Camera_postProcessNodeId',\n\tRENDER_SCENE_NODE_ID = '_Camera_renderSceneNodeId',\n\tRENDERER_NODE_ID = '_Camera_rendererNodeId',\n\tVIEWER_ID = '_Camera_viewerId',\n\t// VIEWER_SHADOW_ROOT = '_Camera_viewerShadowRoot',\n\tVIEWER_HTML = '_Camera_viewerHTML',\n\t// webXR\n\tWEBXR_AR = '_Camera_WebXR_AR',\n\tWEBXR_VR = '_Camera_WebXR_VR',\n\t// AR and VR attributes should be 2 different sets\n\t// to ensure that there will be no conflict\n\t// when a camera is set up with both\n\tWEBXR_AR_FEATURES_OPTIONAL = '_Camera_WebXR_AR_Features_Optional',\n\tWEBXR_AR_FEATURES_REQUIRED = '_Camera_WebXR_AR_Features_Required',\n\tWEBXR_AR_OVERRIDE_REFERENCE_SPACE_TYPE = '_Camera_WebXR_AR_overrideReferenceSpaceType',\n\tWEBXR_AR_REFERENCE_SPACE_TYPE = '_Camera_WebXR_AR_referenceSpaceType',\n\tWEBXR_VR_FEATURES_OPTIONAL = '_Camera_WebXR_VR_Features_Optional',\n\tWEBXR_VR_FEATURES_REQUIRED = '_Camera_WebXR_VR_Features_Required',\n\tWEBXR_VR_OVERRIDE_REFERENCE_SPACE_TYPE = '_Camera_WebXR_VR_overrideReferenceSpaceType',\n\tWEBXR_VR_REFERENCE_SPACE_TYPE = '_Camera_WebXR_VR_referenceSpaceType',\n\t// webXR + marker tracking\n\tWEBXR_AR_MARKER_TRACKING = '_Camera_WebXR_AR_markerTracking',\n\tWEBXR_AR_MARKER_TRACKING_SOURCE_MODE = '_Camera_WebXR_AR_markerTracking_sourceMode',\n\tWEBXR_AR_MARKER_TRACKING_SOURCE_URL = '_Camera_WebXR_AR_markerTracking_sourceUrl',\n\tWEBXR_AR_MARKER_TRACKING_BAR_CODE_TYPE = '_Camera_WebXR_AR_markerTracking_barCodeType',\n\tWEBXR_AR_MARKER_TRACKING_BAR_CODE_VALUE = '_Camera_WebXR_AR_markerTracking_barCodeValue',\n\tWEBXR_AR_MARKER_TRACKING_TRANSFORM_MODE = '_Camera_WebXR_AR_markerTracking_transformMode',\n\tWEBXR_AR_MARKER_TRACKING_SMOOTH = '_Camera_WebXR_AR_markerTracking_smooth',\n\tWEBXR_AR_MARKER_TRACKING_SMOOTH_COUNT = '_Camera_WebXR_AR_markerTracking_smoothCount',\n}\nexport const CAMERA_ATTRIBUTES: CameraAttribute[] = [\n\tCameraAttribute.NODE_ID,\n\tCameraAttribute.CONTROLS_NODE_ID,\n\tCameraAttribute.CSS_RENDERER_NODE_ID,\n\tCameraAttribute.FRAME_MODE,\n\tCameraAttribute.FRAME_MODE_EXPECTED_ASPECT_RATIO,\n\tCameraAttribute.VIEW_OFFSET_MIN,\n\tCameraAttribute.VIEW_OFFSET_MAX,\n\tCameraAttribute.POST_PROCESS_NODE_ID,\n\tCameraAttribute.RENDER_SCENE_NODE_ID,\n\tCameraAttribute.RENDERER_NODE_ID,\n\tCameraAttribute.WEBXR_AR,\n\tCameraAttribute.WEBXR_VR,\n\tCameraAttribute.WEBXR_AR_FEATURES_OPTIONAL,\n\tCameraAttribute.WEBXR_AR_FEATURES_REQUIRED,\n\tCameraAttribute.WEBXR_AR_OVERRIDE_REFERENCE_SPACE_TYPE,\n\tCameraAttribute.WEBXR_AR_REFERENCE_SPACE_TYPE,\n\tCameraAttribute.WEBXR_VR_FEATURES_OPTIONAL,\n\tCameraAttribute.WEBXR_VR_FEATURES_REQUIRED,\n\tCameraAttribute.WEBXR_VR_OVERRIDE_REFERENCE_SPACE_TYPE,\n\tCameraAttribute.WEBXR_VR_REFERENCE_SPACE_TYPE,\n];\nexport enum PerspectiveCameraAttribute {\n\tFOV = '_PerspectiveCamera_fov',\n}\nexport const PERSPECTIVE_CAMERA_ATTRIBUTES: PerspectiveCameraAttribute[] = [PerspectiveCameraAttribute.FOV];\nexport enum OrthographicCameraAttribute {\n\tSIZE = '_OrthographicCamera_size',\n}\nexport const ORTHOGRAPHIC_CAMERA_ATTRIBUTES: OrthographicCameraAttribute[] = [OrthographicCameraAttribute.SIZE];\n\nexport function serializeCamera<C extends Camera>(camera: C, attributeNames: string[]) {\n\tconst values = attributeNames.map((attribName) => {\n\t\tconst value = coreObjectClassFactory(camera).attribValue(camera, attribName);\n\t\tif (value != null) {\n\t\t\treturn {[attribName]: value};\n\t\t}\n\t});\n\tconst attribValues: (\n\t\t| {\n\t\t\t\t[x: string]: AttribValue;\n\t\t  }\n\t\t| undefined\n\t)[] = [];\n\treturn JSON.stringify({\n\t\tuuid: camera.uuid,\n\t\tattributes: arrayCompact(values, attribValues),\n\t});\n}\n","import {Camera} from 'three';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport type {CSS2DRendererRopNode} from '../../engine/nodes/rop/CSS2DRenderer';\nimport type {CSS3DRendererRopNode} from '../../engine/nodes/rop/CSS3DRenderer';\nimport type {BaseNodeType, TypedNode} from '../../engine/nodes/_Base';\nimport {RopType} from '../../engine/poly/registers/nodes/types/Rop';\nimport {CameraAttribute} from './CoreCamera';\nimport {isNumber} from '../Type';\nimport {CSS3DRenderer} from '../render/CSSRenderers/CSS3DRenderer';\nimport {CSS2DRenderer} from '../render/CSSRenderers/CSS2DRenderer';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\n\ninterface CreateCSSRendererOptions {\n\tscene: PolyScene;\n\tcamera: Camera;\n\tcanvas: HTMLCanvasElement;\n}\n\ntype CSSRendererRopNode = CSS3DRendererRopNode | CSS2DRendererRopNode;\ntype CSSRenderer = CSS3DRenderer | CSS2DRenderer;\nexport interface CSSRendererConfig {\n\tcssRenderer: CSSRenderer;\n\tcssRendererNode: CSSRendererRopNode;\n}\n\nexport class CoreCameraCSSRendererController {\n\tstatic isCSSRendererNode(node: BaseNodeType) {\n\t\treturn node.type() == RopType.CSS2D || node.type() == RopType.CSS3D;\n\t}\n\n\tstatic cssRendererConfig(options: CreateCSSRendererOptions): CSSRendererConfig | undefined {\n\t\tconst {canvas, scene, camera} = options;\n\n\t\tconst nodeId = coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.CSS_RENDERER_NODE_ID);\n\t\tif (nodeId == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isNumber(nodeId)) {\n\t\t\treturn;\n\t\t}\n\t\tconst foundNode = scene.graph.nodeFromId(nodeId);\n\t\tif (!foundNode) {\n\t\t\treturn;\n\t\t}\n\t\t// the test 'foundNode instanceof TypedNode' failed when loaded via a plugin and from the editor\n\t\tif (!this.isCSSRendererNode(foundNode as TypedNode<any, any>)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst cssRendererNode = foundNode as CSSRendererRopNode;\n\t\t// if cssRendererNode is not computed here, the CSS will not be loaded when using the example scene\n\t\t// <root_url>/demo?example=bynode/sop/css2dobject/basic\n\t\tcssRendererNode.compute();\n\t\tconst cssRenderer = cssRendererNode.renderer(canvas);\n\t\treturn {cssRenderer, cssRendererNode};\n\t}\n}\n","import {CameraControls} from './../../engine/nodes/event/_BaseCameraControls';\nimport {BaseViewerType} from './../../engine/viewers/_Base';\nimport {Camera, Vector3} from 'three';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport {CameraAttribute} from './CoreCamera';\nimport {isNumber} from '../Type';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\ninterface CreateControlsConfigOptions {\n\tscene: PolyScene;\n\tcamera: Camera;\n}\n\ntype GetTargetFunction = (target: Vector3) => void;\ntype SetTargetFunction = (target: Vector3) => void;\n\nexport interface ApplicableControlsNode {\n\ttype(): string;\n\tapplyControls: (camera: Camera, viewer: BaseViewerType) => Promise<CameraControls>;\n\ttarget?: GetTargetFunction;\n\tsetTarget?: SetTargetFunction;\n}\n\nexport class CoreCameraControlsController {\n\t// static isCameraControlsNode(node: BaseNodeType) {\n\t// \treturn CAMERA_CONTROLS_NODE_TYPES.includes(node.type());\n\t// }\n\n\tstatic controlsNode(options: CreateControlsConfigOptions): ApplicableControlsNode | undefined {\n\t\tconst {scene, camera} = options;\n\n\t\tlet controlsNode: ApplicableControlsNode | undefined; //TypedCameraControlsEventNode<any> | undefined;\n\t\tconst foundNodeId = coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.CONTROLS_NODE_ID);\n\t\tif (foundNodeId && isNumber(foundNodeId)) {\n\t\t\tconst foundNode = scene.graph.nodeFromId(foundNodeId);\n\t\t\t// if (foundNode && foundNode instanceof TypedNode && this.isCameraControlsNode(foundNode)) {\n\t\t\tif (foundNode && (foundNode as unknown as ApplicableControlsNode).applyControls) {\n\t\t\t\tcontrolsNode = foundNode as unknown as ApplicableControlsNode; //TypedCameraControlsEventNode<any>;\n\t\t\t}\n\t\t}\n\n\t\treturn controlsNode;\n\t}\n}\n","import {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {Constructor} from '../../types/GlobalTypes';\nimport {Camera} from 'three';\nimport {CameraAttribute} from './CoreCamera';\nimport {CameraFPSSopOperation} from '../../engine/operations/sop/CameraFPS';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\nconst DEFAULT = CameraFPSSopOperation.DEFAULT_PARAMS;\n\nexport function CoreCameraFPSParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param expected FPS */\n\t\tmaxFPS = ParamConfig.INTEGER(DEFAULT.maxFPS, {\n\t\t\trange: [0, 120],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param allow dynamic change. If this is true, the viewer will check the attribute on the camera at every frame, before adapting the FPS. This allows to change the FPS at a later stage */\n\t\tallowDynamicChange = ParamConfig.BOOLEAN(DEFAULT.allowDynamicChange);\n\t};\n}\n\ninterface CreateViewerFPSOptions {\n\tcamera: Camera;\n}\nexport interface ViewerFPSConfig {\n\tminDelta: () => number;\n}\nconst _getMinDelta = (fps: number) => {\n\treturn 1 / fps;\n};\nconst SAFETY_THRESHOLD = 0.1;\nexport function isDeltaValid(accumulatedDelta: number, condig: ViewerFPSConfig): boolean {\n\tconst minDelta = condig.minDelta();\n\t// if we have waited long enough to render this frame, we render it\n\tif (accumulatedDelta > minDelta) {\n\t\treturn true;\n\t}\n\t// if the accumulated delta is less than the minDelta, we don't render,\n\t// except if the difference between the 2 is below a threshold\n\tconst deltaDeltas = minDelta - accumulatedDelta;\n\tif (deltaDeltas > 0 && deltaDeltas / minDelta > SAFETY_THRESHOLD) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport class CoreCameraViewerFPSController {\n\tstatic viewerFPSConfig(options: CreateViewerFPSOptions): ViewerFPSConfig | undefined {\n\t\tconst {camera} = options;\n\n\t\tconst _getMaxFPSIfPreset = () => {\n\t\t\treturn coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.MAX_FPS) as number | null;\n\t\t};\n\n\t\tconst maxFPS = _getMaxFPSIfPreset();\n\t\tif (maxFPS == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst _minDelta = _getMinDelta(maxFPS);\n\t\tconst allowDynamicChange =\n\t\t\t(coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.MAX_FPS_DYNAMIC_CHANGE) as\n\t\t\t\t| boolean\n\t\t\t\t| null) || false;\n\n\t\tif (allowDynamicChange) {\n\t\t\tconst defaultMinDelta = _getMinDelta(60);\n\t\t\tconst config: ViewerFPSConfig = {\n\t\t\t\tminDelta: () => {\n\t\t\t\t\tconst maxFPS = _getMaxFPSIfPreset();\n\t\t\t\t\tif (maxFPS == null) {\n\t\t\t\t\t\treturn defaultMinDelta;\n\t\t\t\t\t}\n\t\t\t\t\treturn _getMinDelta(maxFPS);\n\t\t\t\t},\n\t\t\t};\n\t\t\treturn config;\n\t\t} else {\n\t\t\tconst config: ViewerFPSConfig = {\n\t\t\t\tminDelta: () => _minDelta,\n\t\t\t};\n\t\t\treturn config;\n\t\t}\n\t}\n}\n","import {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {Constructor} from '../../types/GlobalTypes';\n\nexport enum CameraFrameMode {\n\tDEFAULT = 'default',\n\tCOVER = 'cover',\n\tCONTAIN = 'contain',\n}\nexport const CAMERA_FRAME_MODES: CameraFrameMode[] = [\n\tCameraFrameMode.DEFAULT,\n\tCameraFrameMode.COVER,\n\tCameraFrameMode.CONTAIN,\n];\nexport function CoreCameraFrameParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param fov adjust mode */\n\t\tframeMode = ParamConfig.INTEGER(CAMERA_FRAME_MODES.indexOf(CameraFrameMode.DEFAULT), {\n\t\t\tmenu: {\n\t\t\t\tentries: CAMERA_FRAME_MODES.map((name, value) => {\n\t\t\t\t\treturn {name, value};\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t\t/** @param expected aspect ratio */\n\t\texpectedAspectRatio = ParamConfig.FLOAT('16/9', {\n\t\t\tvisibleIf: [\n\t\t\t\t{frameMode: CAMERA_FRAME_MODES.indexOf(CameraFrameMode.COVER)},\n\t\t\t\t{frameMode: CAMERA_FRAME_MODES.indexOf(CameraFrameMode.CONTAIN)},\n\t\t\t],\n\t\t\trange: [0, 2],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t// vertical_fov_range = ParamConfig.VECTOR2([0, 100], {visibleIf: {lock_width: 1}});\n\t\t// horizontal_fov_range = ParamConfig.VECTOR2([0, 100], {visibleIf: {lock_width: 0}});\n\t};\n}\n","import {Camera, Scene, WebGLRenderer} from 'three';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport type {BaseNetworkPostProcessNodeType} from '../../engine/nodes/post/utils/EffectComposerController';\nimport {BaseNodeType, TypedNode} from '../../engine/nodes/_Base';\nimport {CameraSopNodeType, NetworkNodeType, NodeContext} from '../../engine/poly/NodeContext';\nimport {isNumber} from '../Type';\nimport {CameraAttribute} from './CoreCamera';\nimport {BaseViewerType} from '../../engine/viewers/_Base';\nimport {AbstractRenderer} from '../../engine/viewers/Common';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\n\ninterface CreateComposerOptions {\n\trenderer: AbstractRenderer;\n\tscene: PolyScene;\n\tcamera: Camera;\n\trenderScene: Scene;\n\tviewer: BaseViewerType;\n}\n\nexport class CoreCameraPostProcessController {\n\tstatic isPostProcessNetworkNode(node: BaseNodeType) {\n\t\treturn (\n\t\t\tnode.type() == NetworkNodeType.POST ||\n\t\t\t(node.context() == NodeContext.SOP && node.type() == CameraSopNodeType.POST_PROCESS)\n\t\t);\n\t}\n\n\tstatic createComposer(options: CreateComposerOptions) {\n\t\tconst {renderer, scene, renderScene, camera, viewer} = options;\n\n\t\tlet postProcessNode: BaseNetworkPostProcessNodeType | undefined;\n\t\tconst postProcessNodeId = coreObjectClassFactory(camera).attribValue(\n\t\t\tcamera,\n\t\t\tCameraAttribute.POST_PROCESS_NODE_ID\n\t\t);\n\t\tif (postProcessNodeId && isNumber(postProcessNodeId)) {\n\t\t\tconst foundNode = scene.graph.nodeFromId(postProcessNodeId);\n\t\t\tif (foundNode && foundNode instanceof TypedNode && this.isPostProcessNetworkNode(foundNode)) {\n\t\t\t\tpostProcessNode = foundNode as BaseNetworkPostProcessNodeType;\n\t\t\t}\n\t\t}\n\n\t\tif (!postProcessNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(renderer instanceof WebGLRenderer)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn postProcessNode.effectsComposerController.createEffectsComposerAndBuildPasses({\n\t\t\trenderer,\n\t\t\tscene: renderScene,\n\t\t\tcamera,\n\t\t\tviewer,\n\t\t\t// resolution,\n\t\t\t// requester: this.node,\n\t\t\t// render_target: render_target,\n\t\t\t// prepend_render_pass: this.node.pv.prepend_render_pass,\n\t\t});\n\t}\n\n\t// private _clear_render_passes(composer: EffectComposer) {\n\t// \tlet render_pass: Pass | undefined;\n\t// \twhile ((render_pass = composer.passes.pop())) {\n\t// \t\tif (render_pass) {\n\t// \t\t\tconst disposable_pass: DisposablePass = render_pass as DisposablePass;\n\t// \t\t\tif (typeof disposable_pass.dispose === 'function') {\n\t// \t\t\t\ttry {\n\t// \t\t\t\t\tdisposable_pass.dispose();\n\t// \t\t\t\t} catch (e) {\n\t// \t\t\t\t\tconsole.warn(e);\n\t// \t\t\t\t}\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// }\n}\n","import {Camera} from 'three';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport {BaseNodeType, TypedNode} from '../../engine/nodes/_Base';\nimport {CameraAttribute} from './CoreCamera';\nimport {isNumber} from '../Type';\nimport {ObjType} from '../../engine/poly/registers/nodes/types/Obj';\nimport type {SceneObjNode} from '../../engine/nodes/obj/Scene';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\n\ninterface RenderSceneControllerOptions {\n\tscene: PolyScene;\n\tcamera: Camera;\n}\n\nexport class CoreCameraRenderSceneController {\n\tstatic isRenderSceneNode(node: BaseNodeType) {\n\t\treturn node.type() == ObjType.SCENE;\n\t}\n\n\tstatic renderScene(options: RenderSceneControllerOptions) {\n\t\tconst {scene, camera} = options;\n\n\t\tlet sceneNode: SceneObjNode | undefined;\n\t\tconst foundNodeId = coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.RENDER_SCENE_NODE_ID);\n\t\tif (foundNodeId && isNumber(foundNodeId)) {\n\t\t\tconst foundNode = scene.graph.nodeFromId(foundNodeId);\n\t\t\tif (foundNode && foundNode instanceof TypedNode && this.isRenderSceneNode(foundNode)) {\n\t\t\t\tsceneNode = foundNode as SceneObjNode;\n\t\t\t\treturn sceneNode.object;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Camera, Vector2, WebGLRenderer} from 'three';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport {Poly} from '../../engine/Poly';\nimport {\n\tDEFAULT_OUTPUT_COLOR_SPACE,\n\tDEFAULT_SHADOW_MAP_TYPE,\n\tDEFAULT_TONE_MAPPING,\n} from '../../engine/nodes/rop/WebGLRenderer';\nimport {defaultPixelRatio} from '../render/defaultPixelRatio';\nimport {CameraAttribute} from './CoreCamera';\nimport {isNumber} from '../Type';\nimport {RopType} from '../../engine/poly/registers/nodes/types/Rop';\nimport {NodeContext} from '../../engine/poly/NodeContext';\nimport {TypedNode} from '../../engine/nodes/_Base';\nimport {AbstractRenderer} from '../../engine/viewers/Common';\nimport type {PathTracingRendererRopNode} from '../../engine/nodes/rop/PathTracingRenderer';\nimport type {WebGLRendererRopNode} from '../../engine/nodes/rop/WebGLRenderer';\n// @ts-ignore\nimport type {PathTracingRenderer} from '../../core/thirdParty/three-gpu-pathtracer';\nimport {PathTracingRendererContainer} from '../../engine/nodes/rop/utils/pathTracing/PathTracingRendererContainer';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\n\nconst UPDATE_STYLE = false;\nconst SIZE_MULT = 1;\n\ninterface RendererRopOptions {\n\tcamera: Camera;\n\tscene: PolyScene;\n}\ninterface RendererConfigOptions {\n\tcamera: Camera;\n\tscene: PolyScene;\n\tcanvas: HTMLCanvasElement;\n\t// size: Vector2;\n\t// rendererROP?: WebGLRendererRopNode;\n}\n// type AvailableRopNode = WebGLRendererRopNode | PathTracingRendererRopNode;\n// type AvailableRenderer = WebGLRenderer | PathTracingRenderer;\n\n// export interface RendererConfig<A extends AvailableRenderer> {\n// \trenderer: A;\n// \trendererNode?: AvailableRopNode;\n// }\ninterface RendererConfigWebGL {\n\trenderer: WebGLRenderer;\n\trendererNode?: WebGLRendererRopNode;\n}\ninterface RendererConfigPathtracing {\n\trenderer: PathTracingRendererContainer;\n\trendererNode?: PathTracingRendererRopNode;\n}\nexport type AvailableRenderConfig = RendererConfigWebGL | RendererConfigPathtracing;\n\nexport class CoreCameraRendererController {\n\t// private static _resolutionByCanvas: Map<HTMLCanvasElement, Vector2> = new Map();\n\tprivate static _defaultRendererByContext: Map<WebGLRenderingContext, AbstractRenderer> = new Map();\n\tprivate static _renderersByCanvas: Map<HTMLCanvasElement, AbstractRenderer> = new Map();\n\t// private static _superSamplingSize = new Vector2();\n\n\t// static canvasResolution(canvas: HTMLCanvasElement) {\n\t// \treturn this._resolutionByCanvasId.get(canvas.id);\n\t// }\n\tstatic renderer(canvas: HTMLCanvasElement) {\n\t\treturn this._renderersByCanvas.get(canvas);\n\t}\n\n\tstatic rendererNode(options: RendererRopOptions) {\n\t\tconst {scene, camera} = options;\n\t\tconst rendererROPId = coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.RENDERER_NODE_ID);\n\t\tif (rendererROPId && isNumber(rendererROPId)) {\n\t\t\tconst rendererROP = scene.graph.nodeFromId(rendererROPId);\n\t\t\treturn rendererROP;\n\t\t}\n\t}\n\n\tstatic rendererConfig<A extends AvailableRenderConfig>(options: RendererConfigOptions): A | undefined {\n\t\tconst {canvas, scene} = options;\n\t\tconst gl = Poly.renderersController.getRenderingContext(canvas);\n\t\tif (!gl) {\n\t\t\tconsole.error('failed to create webgl context');\n\t\t\treturn;\n\t\t}\n\n\t\tlet renderer: A['renderer'] | undefined;\n\t\tlet rendererNode: A['rendererNode'] | undefined;\n\t\t// if (isBooleanTrue(this.node.pv.setRenderer)) {\n\t\t// await this._updateRenderer();\n\n\t\tconst rendererROP = this.rendererNode(options);\n\t\tif (rendererROP != null && rendererROP instanceof TypedNode && rendererROP.context() == NodeContext.ROP) {\n\t\t\tconst type = rendererROP.type();\n\t\t\tswitch (type) {\n\t\t\t\tcase RopType.WEBGL: {\n\t\t\t\t\trenderer = (rendererROP as WebGLRendererRopNode).createRenderer(canvas, gl);\n\t\t\t\t\trendererNode = rendererROP as WebGLRendererRopNode;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase RopType.PATH_TRACING: {\n\t\t\t\t\trenderer = (rendererROP as PathTracingRendererRopNode).renderer(canvas, gl);\n\t\t\t\t\trendererNode = rendererROP as PathTracingRendererRopNode;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// }\n\t\tif (!renderer) {\n\t\t\trenderer = this._defaultRendererByContext.get(gl) as A['renderer'] | undefined;\n\t\t\tif (!renderer) {\n\t\t\t\trenderer = CoreCameraRendererController.createDefaultRenderer(canvas, gl);\n\t\t\t\tthis._defaultRendererByContext.set(gl, renderer);\n\t\t\t}\n\t\t}\n\n\t\t// https://github.com/mrdoob/js/issues/15493\n\t\t// This below is an attempt to fix env map not being loaded in firefox, but that doesn't work.\n\t\t// Since the threejs example (https://threejs.org/examples/?q=exr#webgl_materials_envmaps_exr) also only works in chrome, not in firefox, I assume this is a firefox+linux bug\n\t\t// console.log(renderer.extensions)\n\t\t// renderer.extensions.get( 'EXT_color_buffer_float' );\n\n\t\t// attempt to have particle systems work in firefox on mobile\n\t\t// (current solution is to have the node SOP/particlesSystemGPU force webgl2 to be used)\n\t\t// renderer.extensions.get( 'WEBGL_color_buffer_float' );\n\t\t// renderer.extensions.get( 'WEBGL_draw_buffers' );\n\n\t\tscene.renderersRegister.registerRenderer(renderer);\n\t\tthis._renderersByCanvas.set(canvas, renderer);\n\t\t// this._superSamplingSize.copy(size);\n\t\t// this.setRendererSize(canvas, this._superSamplingSize);\n\t\t// remove devicePixelRatio for now, as this seems to double the size\n\t\t// of the canvas on high dpi screens\n\t\t// or if this is used, make sure to have the canvas at 100% width and height\n\t\t// renderer.setPixelRatio(window.devicePixelRatio);\n\t\t// UPDATE: favor using devicePixelRatio\n\t\t// to have nice subsampling feel, without needing antialias\n\n\t\tif (!renderer) {\n\t\t\treturn;\n\t\t}\n\t\tconst renderConfig: A = {\n\t\t\trenderer,\n\t\t\trendererNode,\n\t\t} as A;\n\t\treturn renderConfig;\n\t}\n\tstatic setRendererSize(canvas: HTMLCanvasElement, size: Vector2) {\n\t\tconst renderer = this.renderer(canvas);\n\t\tif (renderer) {\n\t\t\trenderer.setSize(SIZE_MULT * size.x, SIZE_MULT * size.y, UPDATE_STYLE);\n\t\t}\n\t}\n\tstatic createDefaultRenderer(canvas: HTMLCanvasElement, gl: WebGLRenderingContext) {\n\t\t// const params: WebGLRendererParameters = {\n\t\t// \t...WEBGL_RENDERER_DEFAULT_PARAMS,\n\t\t// \t// powerPreference: PowerPreference.HIGH,\n\t\t// \t// canvas: canvas,\n\t\t// \t// no anti alias with a pixel ratio of 2 is more performant\n\t\t// \t// but using a pixel ratio of 2 by default can also create hard to debug\n\t\t// \t// inconsistencies when using post processing\n\t\t// \t// antialias: true, //defaultPixelRatio() < 2,\n\t\t// \t// alpha: true, // let's use threejs default alpha\n\t\t// \tcontext: gl,\n\t\t// };\n\t\tconst renderer = Poly.renderersController.defaultWebGLRendererForCanvas(canvas);\n\t\tconst pixelRatio = defaultPixelRatio();\n\t\trenderer.setPixelRatio(pixelRatio);\n\n\t\trenderer.shadowMap.enabled = true;\n\t\trenderer.shadowMap.type = DEFAULT_SHADOW_MAP_TYPE;\n\n\t\t// // TODO: find a way to have those accessible via params\n\t\trenderer.toneMapping = DEFAULT_TONE_MAPPING;\n\t\trenderer.toneMappingExposure = 1;\n\t\trenderer.outputColorSpace = DEFAULT_OUTPUT_COLOR_SPACE;\n\n\t\tif (Poly.renderersController.printDebug()) {\n\t\t\tPoly.renderersController.printDebugMessage('create default renderer');\n\t\t\t// Poly.renderersController.printDebugMessage({\n\t\t\t// \tparams: params,\n\t\t\t// \tpixelRatio: pixelRatio,\n\t\t\t// });\n\t\t}\n\n\t\treturn renderer;\n\t}\n}\n","import {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {Constructor} from '../../types/GlobalTypes';\nimport {Camera, Vector2, PerspectiveCamera, OrthographicCamera} from 'three';\nimport {CameraAttribute} from './CoreCamera';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\nimport {CoreObjectType} from '../geometry/ObjectContent';\nimport type {BaseCoreObject} from '../geometry/entities/object/BaseCoreObject';\n\nexport function CoreCameraViewOffsetParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param min */\n\t\tmin = ParamConfig.VECTOR2([0, 0]);\n\t\t/** @param max */\n\t\tmax = ParamConfig.VECTOR2([1, 1]);\n\t};\n}\n\nfunction cameraViewOffsetMin<T extends CoreObjectType>(\n\tcoreObjectClass: typeof BaseCoreObject<T>,\n\tcamera: Camera,\n\ttarget: Vector2\n) {\n\ttarget.set(0, 0);\n\tcoreObjectClass.attribValue(camera, CameraAttribute.VIEW_OFFSET_MIN, 0, target);\n}\nfunction cameraViewOffsetMax<T extends CoreObjectType>(\n\tcoreObjectClass: typeof BaseCoreObject<T>,\n\tcamera: Camera,\n\ttarget: Vector2\n) {\n\ttarget.set(1, 1);\n\tcoreObjectClass.attribValue(camera, CameraAttribute.VIEW_OFFSET_MAX, 0, target);\n}\nconst _min = new Vector2();\nconst _max = new Vector2();\nexport function cameraSetViewOffset(camera: PerspectiveCamera | OrthographicCamera, resolution: Vector2) {\n\tconst coreObjectClass = coreObjectClassFactory(camera);\n\tconst hasMin = coreObjectClass.hasAttribute(camera, CameraAttribute.VIEW_OFFSET_MIN);\n\tconst hasMax = coreObjectClass.hasAttribute(camera, CameraAttribute.VIEW_OFFSET_MAX);\n\tif (!(hasMin && hasMax)) {\n\t\treturn;\n\t}\n\tcameraViewOffsetMin(coreObjectClass, camera, _min);\n\tcameraViewOffsetMax(coreObjectClass, camera, _max);\n\tcamera.setViewOffset(\n\t\tresolution.x,\n\t\tresolution.y,\n\t\t_min.x * resolution.x,\n\t\t_min.y * resolution.y,\n\t\t_max.x * resolution.x,\n\t\t_max.y * resolution.y\n\t);\n}\n","import {Camera} from 'three';\nimport {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {StringParamLanguage} from '../../engine/params/utils/OptionsController';\nimport {Constructor} from '../../types/GlobalTypes';\nimport {CameraAttribute} from './CoreCamera';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\n\nexport function CoreCameraViewerCodeParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param viewerId */\n\t\tviewerId = ParamConfig.STRING('my-viewer');\n\t\t/** @param shadow root */\n\t\t// shadowRoot = ParamConfig.BOOLEAN(false);\n\t\t/** @param HTML */\n\t\thtml = ParamConfig.STRING('', {\n\t\t\tlanguage: StringParamLanguage.HTML,\n\t\t});\n\t};\n}\n\ninterface CreateViewerCodeOptions {\n\tcamera: Camera;\n}\ninterface ViewerConfigOptions {\n\tviewerId: string;\n\t// shadowRoot: boolean;\n\thtml: string;\n}\ninterface CreateViewerElementOptions {\n\tdomElement: HTMLElement;\n\tcanvas: HTMLCanvasElement;\n\tCSSClass: string;\n}\nexport class ViewerCodeConfig {\n\tconstructor(public readonly options: ViewerConfigOptions) {}\n\tcreateViewerElement(options: CreateViewerElementOptions) {\n\t\tconst {viewerId, html} = this.options;\n\t\tconst {domElement, canvas, CSSClass} = options;\n\t\tconst _container = document.createElement('div');\n\t\t// function _createShadow(element: HTMLElement) {\n\t\t// \telement.attachShadow({mode: 'open'});\n\t\t// \treturn element;\n\t\t// }\n\t\tconst container = _container; //shadowRoot == true ? _createShadow(_container) : _container;\n\t\tcontainer.style.height = '100%';\n\t\tcontainer.innerHTML = html;\n\t\tdomElement?.appendChild(container);\n\t\tcontainer.classList.add(CSSClass);\n\t\tconst viewerElement = container.querySelector(`#${viewerId}`);\n\t\tif (!viewerElement) {\n\t\t\tconsole.error(`failed to find element with id ${viewerId}`);\n\t\t\treturn;\n\t\t}\n\t\tviewerElement.appendChild(canvas);\n\n\t\t// since <script> tags add with .innerHTML are not run,\n\t\t// we need to force them\n\t\tfunction executeScriptElements(containerElement: HTMLElement | ShadowRoot) {\n\t\t\tconst scriptElements = containerElement.querySelectorAll('script');\n\n\t\t\tArray.from(scriptElements).forEach((scriptElement) => {\n\t\t\t\tconst clonedElement = document.createElement('script');\n\n\t\t\t\tArray.from(scriptElement.attributes).forEach((attribute) => {\n\t\t\t\t\tclonedElement.setAttribute(attribute.name, attribute.value);\n\t\t\t\t});\n\n\t\t\t\tclonedElement.text = scriptElement.text;\n\n\t\t\t\tscriptElement.parentNode?.replaceChild(clonedElement, scriptElement);\n\t\t\t});\n\t\t}\n\t\texecuteScriptElements(container);\n\n\t\treturn viewerElement;\n\t}\n}\n\nexport class CoreCameraViewerCodeController {\n\tstatic viewerCodeConfig(options: CreateViewerCodeOptions): ViewerCodeConfig | undefined {\n\t\tconst {camera} = options;\n\t\tconst coreObjectClass = coreObjectClassFactory(camera);\n\t\tconst viewerId = coreObjectClass.attribValue(camera, CameraAttribute.VIEWER_ID) as string | null;\n\t\t// const shadowRoot = CoreObject.attribValue(camera, CameraAttribute.VIEWER_SHADOW_ROOT) as boolean | null;\n\t\tconst html = coreObjectClass.attribValue(camera, CameraAttribute.VIEWER_HTML) as string | null;\n\t\tif (viewerId == null || html == null) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn new ViewerCodeConfig({viewerId, html});\n\t}\n}\n","import {OrthographicCamera, Vector2} from 'three';\nimport {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {PolyEngine} from '../../engine/Poly';\nimport {CameraNodeType} from '../../engine/poly/NodeContext';\nimport {ViewerCallbackOptions} from '../../engine/poly/registers/cameras/PolyCamerasRegister';\nimport {OnNodeRegisterCallback} from '../../engine/poly/registers/nodes/NodesRegister';\nimport {ThreejsViewer} from '../../engine/viewers/Threejs';\nimport {Constructor} from '../../types/GlobalTypes';\nimport {CoreCameraOrthographicFrameMode} from './frameMode/CoreCameraOrthographicFrameMode';\n\nexport const ORTHOGRAPHIC_CAMERA_DEFAULT = {\n\tleft: -0.5,\n\tright: 0.5,\n\ttop: 0.5,\n\tbottom: -0.5,\n};\n\nexport function OrthographicCameraParamConfigMixin<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param size */\n\t\tsize = ParamConfig.FLOAT(1);\n\t};\n}\n\nexport const registerOrthographicCamera: OnNodeRegisterCallback = (poly: PolyEngine) => {\n\tpoly.registerCameraNodeType(CameraNodeType.ORTHOGRAPHIC);\n\n\tpoly.registerCamera<OrthographicCamera>(\n\t\tOrthographicCamera,\n\t\t(options: ViewerCallbackOptions<OrthographicCamera>) => {\n\t\t\tconst viewer = new ThreejsViewer<OrthographicCamera>({\n\t\t\t\t...options,\n\t\t\t\tupdateCameraAspect: (aspect, resolution: Vector2) => {\n\t\t\t\t\tCoreCameraOrthographicFrameMode.updateCameraAspect(options.camera, aspect, {resolution});\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn viewer;\n\t\t}\n\t);\n};\n","import {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {PolyEngine} from '../../engine/Poly';\nimport {CameraNodeType} from '../../engine/poly/NodeContext';\nimport {ViewerCallbackOptions} from '../../engine/poly/registers/cameras/PolyCamerasRegister';\nimport {OnNodeRegisterCallback} from '../../engine/poly/registers/nodes/NodesRegister';\nimport {ThreejsViewer} from '../../engine/viewers/Threejs';\nimport {Constructor, Number2} from '../../types/GlobalTypes';\nimport {CoreCameraPerspectiveFrameMode} from './frameMode/CoreCameraPerspectiveFrameMode';\nimport {PerspectiveCamera, Vector2} from 'three';\n\ninterface PerspectiveCameraDefault {\n\tfov: number;\n\tfovRange: Number2;\n}\nexport const PERSPECTIVE_CAMERA_DEFAULT: PerspectiveCameraDefault = {\n\tfov: 50,\n\tfovRange: [0.001, 180],\n};\n\nexport function PerspectiveCameraParamConfigMixin<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param field of view */\n\t\tfov = ParamConfig.FLOAT(PERSPECTIVE_CAMERA_DEFAULT.fov, {range: PERSPECTIVE_CAMERA_DEFAULT.fovRange});\n\t};\n}\n\nexport const registerPerspectiveCamera: OnNodeRegisterCallback = (poly: PolyEngine) => {\n\tpoly.registerCameraNodeType(CameraNodeType.PERSPECTIVE);\n\tpoly.registerCamera<PerspectiveCamera>(PerspectiveCamera, (options: ViewerCallbackOptions<PerspectiveCamera>) => {\n\t\tconst viewer = new ThreejsViewer<PerspectiveCamera>({\n\t\t\t...options,\n\t\t\tupdateCameraAspect: (aspect, resolution: Vector2) => {\n\t\t\t\tCoreCameraPerspectiveFrameMode.updateCameraAspect(options.camera, aspect, {resolution});\n\t\t\t},\n\t\t});\n\t\treturn viewer;\n\t});\n};\n","import {OrthographicCamera} from 'three';\nimport {OrthographicCameraAttribute, UpdateProjectionOptions} from '../CoreCamera';\nimport {CameraFrameMode} from '../CoreCameraFrameMode';\nimport {ORTHOGRAPHIC_CAMERA_DEFAULT} from '../CoreOrthographicCamera';\nimport {BaseCoreCameraFrameMode} from './_BaseCoreCameraFrameMode';\nimport {cameraSetViewOffset} from '../CoreCameraViewOffset';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\ninterface CoreCameraOrthographicFrameModeOptions {\n\tcamera: OrthographicCamera;\n\tmode: CameraFrameMode;\n\tsize: number;\n\taspect: number;\n\texpectedAspectRatio: number;\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\ntype BasicCoreCameraOrthographicFrameModeOptions = PartialBy<\n\tCoreCameraOrthographicFrameModeOptions,\n\t'expectedAspectRatio'\n>;\n\ninterface UpdateOptions extends UpdateProjectionOptions {\n\tcameraWithAttributes?: OrthographicCamera;\n}\nOrthographicCamera;\n\nexport class CoreCameraOrthographicFrameMode {\n\tstatic updateCameraAspect(camera: OrthographicCamera, aspect: number, options?: UpdateOptions) {\n\t\tconst cameraWithAttributes = options?.cameraWithAttributes || camera;\n\t\tconst frameMode = BaseCoreCameraFrameMode.frameMode(cameraWithAttributes);\n\t\tconst expectedAspectRatio = BaseCoreCameraFrameMode.expectedAspectRatio(cameraWithAttributes) as\n\t\t\t| number\n\t\t\t| undefined;\n\t\tconst size = coreObjectClassFactory(cameraWithAttributes).attribValue(\n\t\t\tcameraWithAttributes,\n\t\t\tOrthographicCameraAttribute.SIZE\n\t\t) as number | undefined;\n\t\tif (size != null) {\n\t\t\tthis._update({\n\t\t\t\tmode: frameMode,\n\t\t\t\tcamera: camera,\n\t\t\t\tsize: size,\n\t\t\t\taspect: aspect,\n\t\t\t\texpectedAspectRatio,\n\t\t\t});\n\t\t}\n\t\tif (options && options.resolution) {\n\t\t\tcameraSetViewOffset(camera, options.resolution);\n\t\t}\n\n\t\tcamera.updateProjectionMatrix();\n\t}\n\n\tprivate static _update(options: BasicCoreCameraOrthographicFrameModeOptions) {\n\t\tconst mode = options.mode;\n\n\t\tif (mode == CameraFrameMode.DEFAULT || options.expectedAspectRatio == null) {\n\t\t\tthis._adjustFOVFromModeDefault(options);\n\t\t} else {\n\t\t\tconst {expectedAspectRatio} = options;\n\t\t\tif (mode == CameraFrameMode.COVER) {\n\t\t\t\tthis._adjustFOVFromModeCover({...options, expectedAspectRatio});\n\t\t\t} else {\n\t\t\t\tthis._adjustFOVFromModeContain({...options, expectedAspectRatio});\n\t\t\t}\n\t\t}\n\n\t\t// switch (mode) {\n\t\t// \tcase CameraFrameMode.DEFAULT: {\n\t\t// \t\treturn this._adjustFOVFromModeDefault(options);\n\t\t// \t}\n\t\t// \tcase CameraFrameMode.COVER: {\n\t\t// \t\treturn this._adjustFOVFromModeCover(options);\n\t\t// \t}\n\t\t// \tcase CameraFrameMode.CONTAIN: {\n\t\t// \t\treturn this._adjustFOVFromModeContain(options);\n\t\t// \t}\n\t\t// }\n\t\t// TypeAssert.unreachable(mode);\n\t}\n\tprivate static _adjustFOVFromModeDefault(options: BasicCoreCameraOrthographicFrameModeOptions) {\n\t\tthis._adjustFOVFromSize(options.size != null ? options.size : 1, options);\n\t}\n\tprivate static _adjustFOVFromModeCover(options: CoreCameraOrthographicFrameModeOptions) {\n\t\tconst size = options.size != null ? options.size : 1;\n\t\tif (options.aspect > options.expectedAspectRatio) {\n\t\t\t// window too large\n\t\t\tthis._adjustFOVFromSize((options.expectedAspectRatio * size) / options.aspect, options);\n\t\t} else {\n\t\t\t// window too narrow\n\t\t\tthis._adjustFOVFromSize(size, options);\n\t\t}\n\t}\n\n\tprivate static _adjustFOVFromModeContain(options: CoreCameraOrthographicFrameModeOptions) {\n\t\tconst size = options.size != null ? options.size : 1;\n\t\tif (options.aspect > options.expectedAspectRatio) {\n\t\t\t// window too large\n\t\t\tthis._adjustFOVFromSize(size, options);\n\t\t} else {\n\t\t\t// window too narrow\n\t\t\tthis._adjustFOVFromSize((options.expectedAspectRatio * size) / options.aspect, options);\n\t\t}\n\t}\n\tprivate static _adjustFOVFromSize(size: number, options: BasicCoreCameraOrthographicFrameModeOptions) {\n\t\tconst horizontalSize = size * options.aspect;\n\t\tconst zoom = 1;\n\t\toptions.camera.left = ORTHOGRAPHIC_CAMERA_DEFAULT.left * horizontalSize * zoom;\n\t\toptions.camera.right = ORTHOGRAPHIC_CAMERA_DEFAULT.right * horizontalSize * zoom;\n\t\toptions.camera.top = ORTHOGRAPHIC_CAMERA_DEFAULT.top * size * zoom;\n\t\toptions.camera.bottom = ORTHOGRAPHIC_CAMERA_DEFAULT.bottom * size * zoom;\n\t}\n}\n","import {MathUtils, PerspectiveCamera} from 'three';\nimport {TypeAssert} from '../../../engine/poly/Assert';\nimport {PerspectiveCameraAttribute, UpdateProjectionOptions} from '../CoreCamera';\nimport {CameraFrameMode} from '../CoreCameraFrameMode';\nimport {BaseCoreCameraFrameMode} from './_BaseCoreCameraFrameMode';\nimport {cameraSetViewOffset} from '../CoreCameraViewOffset';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\ninterface CoreCameraPerspectiveFrameModeOptions {\n\tcamera: PerspectiveCamera;\n\tmode: CameraFrameMode;\n\tfov: number;\n\texpectedAspectRatio: number;\n}\ninterface UpdateOptions extends UpdateProjectionOptions {\n\tcameraWithAttributes?: PerspectiveCamera;\n}\n\nexport class CoreCameraPerspectiveFrameMode {\n\tstatic updateCameraAspect(camera: PerspectiveCamera, aspect: number, options?: UpdateOptions) {\n\t\tcamera.aspect = aspect;\n\t\tconst cameraWithAttributes = options?.cameraWithAttributes || camera;\n\n\t\tconst frameMode = BaseCoreCameraFrameMode.frameMode(cameraWithAttributes);\n\t\tconst expectedAspectRatio = BaseCoreCameraFrameMode.expectedAspectRatio(cameraWithAttributes) as\n\t\t\t| number\n\t\t\t| undefined;\n\t\tconst fov = coreObjectClassFactory(cameraWithAttributes).attribValue(\n\t\t\tcameraWithAttributes,\n\t\t\tPerspectiveCameraAttribute.FOV\n\t\t) as number | undefined;\n\t\tif (fov != null && expectedAspectRatio != null) {\n\t\t\tthis._update({\n\t\t\t\tmode: frameMode,\n\t\t\t\tcamera: camera,\n\t\t\t\tfov: fov,\n\t\t\t\texpectedAspectRatio: expectedAspectRatio,\n\t\t\t});\n\t\t}\n\n\t\tif (options && options.resolution) {\n\t\t\tcameraSetViewOffset(camera, options.resolution);\n\t\t}\n\n\t\tcamera.updateProjectionMatrix();\n\t}\n\tprivate static _update(options: CoreCameraPerspectiveFrameModeOptions) {\n\t\tconst mode = options.mode;\n\t\tswitch (mode) {\n\t\t\tcase CameraFrameMode.DEFAULT: {\n\t\t\t\treturn this._adjustFOVFromModeDefault(options);\n\t\t\t}\n\t\t\tcase CameraFrameMode.COVER: {\n\t\t\t\treturn this._adjustFOVFromModeCover(options);\n\t\t\t}\n\t\t\tcase CameraFrameMode.CONTAIN: {\n\t\t\t\treturn this._adjustFOVFromModeContain(options);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(mode);\n\t}\n\tprivate static _adjustFOVFromModeDefault(options: CoreCameraPerspectiveFrameModeOptions) {\n\t\toptions.camera.fov = options.fov;\n\t}\n\tprivate static _adjustFOVFromModeCover(options: CoreCameraPerspectiveFrameModeOptions) {\n\t\t// from\n\t\t// https://discourse.threejs.org/t/keeping-an-object-scaled-based-on-the-bounds-of-the-canvas-really-battling-to-explain-this-one/17574/10\n\t\t//\n\t\tif (options.camera.aspect > options.expectedAspectRatio) {\n\t\t\t// window too large\n\t\t\tconst cameraHeight = Math.tan(MathUtils.degToRad(options.fov / 2));\n\t\t\tconst ratio = options.camera.aspect / options.expectedAspectRatio;\n\t\t\tconst newCameraHeight = cameraHeight / ratio;\n\t\t\toptions.camera.fov = MathUtils.radToDeg(Math.atan(newCameraHeight)) * 2;\n\t\t} else {\n\t\t\toptions.camera.fov = options.fov;\n\t\t}\n\t}\n\n\tprivate static _adjustFOVFromModeContain(options: CoreCameraPerspectiveFrameModeOptions) {\n\t\tif (options.camera.aspect > options.expectedAspectRatio) {\n\t\t\t// window too large\n\t\t\toptions.camera.fov = options.fov;\n\t\t} else {\n\t\t\t// window too narrow\n\t\t\tconst cameraHeight = Math.tan(MathUtils.degToRad(options.fov / 2));\n\t\t\tconst ratio = options.camera.aspect / options.expectedAspectRatio;\n\t\t\tconst newCameraHeight = cameraHeight / ratio;\n\t\t\toptions.camera.fov = MathUtils.radToDeg(Math.atan(newCameraHeight)) * 2;\n\t\t}\n\t}\n}\n","import {Camera} from 'three';\nimport {isNumber} from '../../Type';\nimport {CameraAttribute} from '../CoreCamera';\nimport {CameraFrameMode, CAMERA_FRAME_MODES} from '../CoreCameraFrameMode';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\nexport class BaseCoreCameraFrameMode {\n\tstatic frameMode(camera: Camera) {\n\t\treturn this._getFrameMode(camera) || CameraFrameMode.DEFAULT;\n\t}\n\tstatic expectedAspectRatio(camera: Camera) {\n\t\treturn coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.FRAME_MODE_EXPECTED_ASPECT_RATIO);\n\t}\n\tprivate static _getFrameMode(camera: Camera) {\n\t\tconst frameModeAttribVal = coreObjectClassFactory(camera).attribValue(camera, CameraAttribute.FRAME_MODE);\n\t\tif (!frameModeAttribVal) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isNumber(frameModeAttribVal)) {\n\t\t\treturn;\n\t\t}\n\t\treturn CAMERA_FRAME_MODES[frameModeAttribVal];\n\t}\n}\n","import {Constructor} from '../../../types/GlobalTypes';\nimport {ParamConfig} from '../../../engine/nodes/utils/params/ParamsConfig';\nimport {\n\tMarkerTrackingControllerConfig,\n\tMarkerTrackingSourceMode,\n\tMARKER_TRACKING_SOURCE_MODES,\n\tMARKER_TRACKING_TRANSFORM_MODES,\n\tMarkerTrackingTransformMode,\n} from '../../webXR/markerTracking/Common';\nimport {CameraAttribute} from '../CoreCamera';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {CameraWebXRARMarkerTrackingSopOperation} from '../../../engine/operations/sop/CameraWebXRARMarkerTracking';\nimport {isString, isNumber} from '../../Type';\nimport {Camera} from 'three';\nimport {Poly} from '../../../engine/Poly';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../loader/FileExtensionRegister';\nimport {CameraSopNodeType, NodeContext} from '../../../engine/poly/NodeContext';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\nconst DEFAULT = CameraWebXRARMarkerTrackingSopOperation.DEFAULT_PARAMS;\n\nexport function CoreCameraMarkerTrackingParamConfig<TBase extends Constructor>(Base: TBase) {\n\t// the default bar code value is set here instead of taking it from the operation\n\t// as it would otherwise be set to an invalid value, since the operation is defined before\n\t// the plugin is loaded\n\tconst defaultBarCodeType = Poly.thirdParty.markerTracking().barCodeTypes()[0];\n\treturn class Mixin extends Base {\n\t\t/** @param select if you want to use the webcam or an image/video as tracking source */\n\t\tsourceMode = ParamConfig.INTEGER(DEFAULT.sourceMode, {\n\t\t\tmenu: {\n\t\t\t\tentries: MARKER_TRACKING_SOURCE_MODES.map((name, value) => ({name, value})),\n\t\t\t},\n\t\t});\n\t\t/** @param image or video url */\n\t\tsourceUrl = ParamConfig.STRING(DEFAULT.sourceUrl, {\n\t\t\tfileBrowse: {\n\t\t\t\textensions:\n\t\t\t\t\tEXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CameraSopNodeType.WEBXR_AR_MARKER_TRACKING],\n\t\t\t},\n\t\t\tvisibleIf: [\n\t\t\t\t{sourceMode: MARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.IMAGE)},\n\t\t\t\t{sourceMode: MARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.VIDEO)},\n\t\t\t],\n\t\t});\n\t\t/** @param transformMode */\n\t\ttransformMode = ParamConfig.INTEGER(DEFAULT.transformMode, {\n\t\t\tmenu: {\n\t\t\t\tentries: MARKER_TRACKING_TRANSFORM_MODES.map((name, value) => ({name, value})),\n\t\t\t},\n\t\t});\n\t\t/** @param smooth */\n\t\tsmooth = ParamConfig.BOOLEAN(DEFAULT.smooth, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param  smooth count */\n\t\tsmoothCount = ParamConfig.INTEGER(DEFAULT.smoothCount, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param barcode type */\n\t\tbarCodeType = ParamConfig.STRING(defaultBarCodeType, {\n\t\t\tseparatorBefore: true,\n\t\t\tmenuString: {\n\t\t\t\tentries: Poly.thirdParty\n\t\t\t\t\t.markerTracking()\n\t\t\t\t\t.barCodeTypes()\n\t\t\t\t\t.map((name, value) => ({name, value: name})),\n\t\t\t},\n\t\t});\n\t\t/** @param barcode value */\n\t\tbarCodeValue = ParamConfig.INTEGER(DEFAULT.barCodeValue, {\n\t\t\trange: [0, 511],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t};\n}\n\ninterface MarkerTrackingControllerOptions {\n\tcamera: Camera;\n\tscene: PolyScene;\n\t// renderer: WebGLRenderer;\n\tcanvas: HTMLCanvasElement;\n\tonError: (errorMessage: string) => void;\n}\n\nexport class CoreCameraMarkerTrackingController {\n\tstatic process(options: MarkerTrackingControllerOptions): MarkerTrackingControllerConfig | undefined {\n\t\tconst {canvas, scene, camera, onError} = options;\n\t\tconst coreObjectClass = coreObjectClassFactory(camera);\n\t\tconst isARjsTrackMarker = coreObjectClass.attribValue(camera, CameraAttribute.WEBXR_AR_MARKER_TRACKING) as\n\t\t\t| boolean\n\t\t\t| null;\n\t\tif (!isARjsTrackMarker) {\n\t\t\treturn;\n\t\t}\n\t\tconst sourceMode = coreObjectClass.attribValue(\n\t\t\tcamera,\n\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_SOURCE_MODE\n\t\t) as MarkerTrackingSourceMode | null;\n\t\tconst sourceUrl = coreObjectClass.attribValue(camera, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SOURCE_URL) as\n\t\t\t| string\n\t\t\t| undefined;\n\n\t\tconst barCodeType = coreObjectClass.attribValue(\n\t\t\tcamera,\n\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_BAR_CODE_TYPE\n\t\t) as string | null;\n\t\tconst barCodeValue = coreObjectClass.attribValue(\n\t\t\tcamera,\n\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_BAR_CODE_VALUE\n\t\t) as number | null;\n\t\tconst transformMode = coreObjectClass.attribValue(\n\t\t\tcamera,\n\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_TRANSFORM_MODE\n\t\t) as number | null;\n\n\t\tif (sourceMode == null || barCodeType == null || barCodeValue == null || transformMode == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (!MARKER_TRACKING_SOURCE_MODES.includes(sourceMode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\t[MarkerTrackingSourceMode.IMAGE, MarkerTrackingSourceMode.VIDEO].includes(sourceMode) &&\n\t\t\tsourceUrl == null\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isString(barCodeType)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isString(transformMode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!Poly.thirdParty.markerTracking().barCodeTypes().includes(barCodeType)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!MARKER_TRACKING_TRANSFORM_MODES.includes(transformMode as MarkerTrackingTransformMode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isNumber(barCodeValue)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst smooth =\n\t\t\t(coreObjectClass.attribValue(camera, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SMOOTH) as boolean | null) ||\n\t\t\tfalse;\n\t\tconst smoothCount =\n\t\t\t(coreObjectClass.attribValue(camera, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SMOOTH_COUNT) as\n\t\t\t\t| number\n\t\t\t\t| null) || 0;\n\n\t\ttry {\n\t\t\tconst controller = Poly.thirdParty.markerTracking().createController({\n\t\t\t\tsourceMode,\n\t\t\t\tsourceUrl,\n\t\t\t\tcanvas,\n\t\t\t\tcamera,\n\t\t\t\tscene: scene.threejsScene(),\n\t\t\t\ttransformMode: transformMode as MarkerTrackingTransformMode,\n\t\t\t\tbarCode: {\n\t\t\t\t\ttype: barCodeType,\n\t\t\t\t\tvalue: barCodeValue,\n\t\t\t\t},\n\t\t\t\tsmooth: {\n\t\t\t\t\tactive: smooth,\n\t\t\t\t\tcount: smoothCount,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst errorMessage = controller?.errorMessage();\n\t\t\tif (errorMessage) {\n\t\t\t\tonError(errorMessage);\n\t\t\t} else {\n\t\t\t\tif (!controller) {\n\t\t\t\t\tonError(\n\t\t\t\t\t\t'failed to create the MarkerTracking controller. Make sure you have loaded the plugin. See: `https://polygonjs.com/markerTracking`'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn controller?.config();\n\t\t} catch (err) {\n\t\t\tonError('There was an unknown error while using the MarkerTracking plugin');\n\t\t}\n\t}\n}\n","import {Constructor, PolyDictionary} from '../../types/GlobalTypes';\nimport * as THREE from 'three'; // three import required to give to the function builder\nimport {BaseNodeType} from '../../engine/nodes/_Base';\n\nexport class BaseCodeProcessor {\n\tconstructor(protected node: BaseNodeType) {}\n}\n\ninterface BuildCodeNodeFunctionOptions<T extends BaseCodeProcessor> {\n\tBaseCodeProcessor: Constructor<T>;\n\tBaseCodeProcessorName: string;\n\tnode: BaseNodeType;\n\tfunctionBody: string;\n\totherVariables?: PolyDictionary<any>;\n}\n\nexport function buildCodeNodeFunction<T extends BaseCodeProcessor>(options: BuildCodeNodeFunctionOptions<T>) {\n\tconst {BaseCodeProcessor, BaseCodeProcessorName, node, functionBody, otherVariables} = options;\n\n\tconst availableVariables: PolyDictionary<any> = {\n\t\t[BaseCodeProcessorName]: BaseCodeProcessor,\n\t\t...THREE,\n\t\tstates: node.states,\n\t};\n\tconst variableNames = Object.keys(availableVariables).concat(Object.keys(otherVariables || {}));\n\tconst sortedVariables = variableNames.map((varName) => {\n\t\tlet varValue = availableVariables[varName];\n\t\tif (varValue == null) {\n\t\t\tvarValue = (otherVariables || {})[varName];\n\t\t}\n\t\treturn varValue;\n\t});\n\tconst processorCreatorFunction = new Function(...variableNames, functionBody);\n\tconst ProcessorClass: typeof BaseCodeProcessor | undefined = processorCreatorFunction(...sortedVariables);\n\treturn ProcessorClass;\n}\n","import {Vector4} from 'three';\n\nexport const DEFAULT_POSITION = [\n\t0.597584068775177, 0.5122368931770325, -0.028051288798451424, 0.5967282652854919, 0.5585823059082031,\n\t-0.06827813386917114, 0.595363199710846, 0.5465003252029419, -0.031898822635412216, 0.6041821241378784,\n\t0.6086804866790771, -0.05589400976896286, 0.5962452292442322, 0.573085606098175, -0.07450614124536514,\n\t0.5946764349937439, 0.5931726098060608, -0.07159314304590225, 0.5899791717529297, 0.6430703401565552,\n\t-0.04436807334423065, 0.67838454246521, 0.6593220233917236, 0.016294442117214203, 0.5877543091773987,\n\t0.6745568513870239, -0.0413186177611351, 0.5869603753089905, 0.6935017108917236, -0.04745618626475334,\n\t0.5816501379013062, 0.779848039150238, -0.042868249118328094, 0.5978976488113403, 0.5054249167442322,\n\t-0.025547420606017113, 0.5978557467460632, 0.5013006925582886, -0.02036227099597454, 0.5973365902900696,\n\t0.5003284215927124, -0.014039026573300362, 0.5970479846000671, 0.49754413962364197, -0.011204810813069344,\n\t0.5973528623580933, 0.4921146035194397, -0.012626622803509235, 0.5977947115898132, 0.4853774905204773,\n\t-0.014603002928197384, 0.597919225692749, 0.47811874747276306, -0.012000382877886295, 0.597602367401123,\n\t0.46524766087532043, 0.001983312424272299, 0.5964838266372681, 0.5520298480987549, -0.06071425974369049,\n\t0.6072486042976379, 0.5549895167350769, -0.04127464070916176, 0.7217085957527161, 0.7237116098403931,\n\t0.07248257845640182, 0.6416465640068054, 0.6432689428329468, 0.0018072782550007105, 0.6546133160591125,\n\t0.6430615782737732, 0.0035426770336925983, 0.6671338677406311, 0.6445352435112, 0.00773812597617507,\n\t0.6832059621810913, 0.6544572710990906, 0.019097862765192986, 0.6311497688293457, 0.6458761692047119,\n\t0.0012961032334715128, 0.6586965322494507, 0.6754084229469299, -0.006046702153980732, 0.6450702548027039,\n\t0.6740657091140747, -0.007615192793309689, 0.6709392070770264, 0.6746220588684082, -0.000881765503436327,\n\t0.6791203022003174, 0.6716819405555725, 0.005486492067575455, 0.6946684122085571, 0.6456027030944824,\n\t0.02723051980137825, 0.6447452306747437, 0.44643864035606384, 0.02417730540037155, 0.6829148530960083,\n\t0.6629987955093384, 0.02015218324959278, 0.7309252023696899, 0.6593643426895142, 0.088451087474823,\n\t0.7088413834571838, 0.6560789346694946, 0.03979205712676048, 0.6565970778465271, 0.5812364220619202,\n\t-0.002463678363710642, 0.6127680540084839, 0.5154179334640503, -0.025404665619134903, 0.6107486486434937,\n\t0.5024060010910034, -0.01744835264980793, 0.6279534101486206, 0.513091504573822, -0.016086377203464508,\n\t0.6377556324005127, 0.5092297792434692, -0.0050071789883077145, 0.6215190291404724, 0.5028899908065796,\n\t-0.011300934478640556, 0.6301767230033875, 0.5032271146774292, -0.0014937336090952158, 0.6532092094421387,\n\t0.49195513129234314, 0.019588898867368698, 0.6071991920471191, 0.559777557849884, -0.06653857231140137,\n\t0.6086122393608093, 0.5737631916999817, -0.07219526916742325, 0.6991390585899353, 0.6851577162742615,\n\t0.0062843207269907, 0.6286460757255554, 0.6165348887443542, -0.011625250801444054, 0.6346508264541626,\n\t0.5690491199493408, -0.03137127682566643, 0.6347075700759888, 0.5773864984512329, -0.027967827394604683,\n\t0.6945300102233887, 0.5864663124084473, 0.016185779124498367, 0.6063978672027588, 0.5924419164657593,\n\t-0.06629480421543121, 0.6682231426239014, 0.6933223009109497, -0.02194802835583687, 0.6863858699798584,\n\t0.6918083429336548, -0.009778991341590881, 0.7091013789176941, 0.7469769716262817, 0.041038259863853455,\n\t0.6132028102874756, 0.6779560446739197, -0.035334259271621704, 0.6331472396850586, 0.670049786567688,\n\t-0.0037244763225317, 0.6630505919456482, 0.5049932599067688, 0.022168323397636414, 0.7215963006019592,\n\t0.5240747332572937, 0.1439662128686905, 0.6254160404205322, 0.5605108737945557, -0.025925854220986366,\n\t0.6150547862052917, 0.5550880432128906, -0.02817643992602825, 0.6485419273376465, 0.5037428736686707,\n\t0.019547492265701294, 0.6427199244499207, 0.504209041595459, 0.015221400186419487, 0.6931158304214478,\n\t0.7028365731239319, -0.004058110527694225, 0.634718656539917, 0.5636073350906372, -0.023171067237854004,\n\t0.6441227197647095, 0.6896411180496216, -0.03067934513092041, 0.6464415192604065, 0.7024542689323425,\n\t-0.03501669317483902, 0.65793776512146, 0.775926411151886, -0.018611056730151176, 0.7007876634597778,\n\t0.7261034250259399, 0.014999687671661377, 0.6509052515029907, 0.7411677241325378, -0.028157919645309448,\n\t0.7067745327949524, 0.6938604116439819, 0.017360538244247437, 0.714536190032959, 0.7084218859672546,\n\t0.043008968234062195, 0.612159252166748, 0.5072938203811646, -0.02286752313375473, 0.6244387030601501,\n\t0.5065721273422241, -0.014235980808734894, 0.6339299082756042, 0.505737841129303, -0.004287747200578451,\n\t0.6221928000450134, 0.5578425526618958, -0.02382677234709263, 0.6454678177833557, 0.5037370920181274,\n\t0.017182888463139534, 0.6400778293609619, 0.500971257686615, 0.008961204439401627, 0.6412352919578552,\n\t0.5049329400062561, 0.014591737650334835, 0.6196542382240295, 0.5631129741668701, -0.04575018957257271,\n\t0.6273888349533081, 0.5042110085487366, 0.0007319872383959591, 0.6187172532081604, 0.5031090378761292,\n\t-0.00584834860637784, 0.6086117625236511, 0.5015190243721008, -0.011396178044378757, 0.613655149936676,\n\t0.4667019844055176, 0.0034802076406776905, 0.6125679016113281, 0.4800979495048523, -0.010194817557930946,\n\t0.6117227077484131, 0.4876881241798401, -0.012622324749827385, 0.610632061958313, 0.49440231919288635,\n\t-0.010316146537661552, 0.6092167496681213, 0.49879127740859985, -0.008737782016396523, 0.6289371252059937,\n\t0.5021269917488098, 0.0022035834845155478, 0.630825400352478, 0.5005471110343933, 0.0003899023577105254,\n\t0.6336177587509155, 0.4973981976509094, -0.0005309130647219718, 0.6361297369003296, 0.4931390583515167,\n\t0.0024349421728402376, 0.6486418843269348, 0.5269691348075867, -0.0022767367772758007, 0.7312617301940918,\n\t0.5982346534729004, 0.15416981279850006, 0.5958456993103027, 0.5501752495765686, -0.04222862794995308,\n\t0.6345977187156677, 0.503113329410553, 0.00927984993904829, 0.6370877027511597, 0.502642035484314,\n\t0.008397147059440613, 0.6111913323402405, 0.5482578277587891, -0.027388937771320343, 0.6303856372833252,\n\t0.5550988912582397, -0.01301523670554161, 0.6131489872932434, 0.5514347553253174, -0.028308415785431862,\n\t0.6418907046318054, 0.6096106171607971, -0.004673521965742111, 0.6634712815284729, 0.6010817289352417,\n\t0.0013577090576291084, 0.6365949511528015, 0.5718649625778198, -0.019444353878498077, 0.6888689994812012,\n\t0.7648157477378845, 0.009132291190326214, 0.6802739500999451, 0.7375373244285583, -0.007788379210978746,\n\t0.6723787784576416, 0.7065309882164001, -0.020596865564584732, 0.6428448557853699, 0.48242488503456116,\n\t0.013434926979243755, 0.6172218322753906, 0.6972134709358215, -0.043508078902959824, 0.620203971862793,\n\t0.7410112619400024, -0.040685828775167465, 0.6236055493354797, 0.7805084586143494, -0.036001887172460556,\n\t0.6775220036506653, 0.6482770442962646, 0.013777976855635643, 0.7096003890037537, 0.6361182928085327,\n\t0.03694845736026764, 0.6245864033699036, 0.6487201452255249, 0.0023408399429172277, 0.6937344670295715,\n\t0.6699916124343872, 0.017328178510069847, 0.619555652141571, 0.6246581077575684, -0.018410902470350266,\n\t0.6276017427444458, 0.5722575783729553, -0.04580232873558998, 0.7234979271888733, 0.6281430721282959,\n\t0.054451946169137955, 0.7013242840766907, 0.6243062019348145, 0.026095718145370483, 0.6847876310348511,\n\t0.6169044971466064, 0.013293273746967316, 0.6595296859741211, 0.617617130279541, 0.004958524368703365,\n\t0.6412346959114075, 0.6225915551185608, 0.00026692773099057376, 0.6280146241188049, 0.628188967704773,\n\t-0.005619999021291733, 0.6025046110153198, 0.6403722167015076, -0.03756927326321602, 0.723274827003479,\n\t0.5964245796203613, 0.054969802498817444, 0.7047872543334961, 0.6727436780929565, 0.023484043776988983,\n\t0.602785050868988, 0.5530483722686768, -0.059398893266916275, 0.6287304759025574, 0.6011059284210205,\n\t-0.014482149854302406, 0.7315966486930847, 0.6642927527427673, 0.13364621996879578, 0.6182049512863159,\n\t0.6345085501670837, -0.009625561535358429, 0.6371392607688904, 0.5718885660171509, -0.005795842036604881,\n\t0.68679279088974, 0.6620866060256958, 0.02291913703083992, 0.6272032260894775, 0.5824096202850342,\n\t-0.04187924042344093, 0.7288002967834473, 0.5621649026870728, 0.15262971818447113, 0.6245347261428833,\n\t0.6542900800704956, 0.005082952324301004, 0.6172586679458618, 0.5888647437095642, -0.05669143795967102,\n\t0.698346734046936, 0.4834224283695221, 0.07442153245210648, 0.696480393409729, 0.46957191824913025,\n\t0.10064975917339325, 0.7339246869087219, 0.5966627597808838, 0.10488706827163696, 0.7136958241462708,\n\t0.5044869780540466, 0.08993417769670486, 0.7230542898178101, 0.686802864074707, 0.06924804300069809,\n\t0.6476432681083679, 0.4331321716308594, 0.034571852535009384, 0.6008877754211426, 0.5511133670806885,\n\t-0.04098920524120331, 0.6402345299720764, 0.5918145179748535, -0.00732794962823391, 0.7199708223342896,\n\t0.6551348567008972, 0.05448891222476959, 0.6656532883644104, 0.6534794569015503, 0.008269526064395905,\n\t0.6543117761611938, 0.6513825058937073, 0.004339221399277449, 0.6432578563690186, 0.4987879991531372,\n\t0.01176439132541418, 0.7219845652580261, 0.5669344663619995, 0.06350813806056976, 0.6248161792755127,\n\t0.413350373506546, 0.03935292363166809, 0.6613103151321411, 0.43515676259994507, 0.06608260422945023,\n\t0.6775713562965393, 0.4492267370223999, 0.0812063068151474, 0.5844548940658569, 0.738898515701294,\n\t-0.04618336632847786, 0.5988568663597107, 0.4088538885116577, 0.033782027661800385, 0.6435248851776123,\n\t0.6514523029327393, 0.002659075427800417, 0.6334372162818909, 0.652926504611969, 0.003352593397721648,\n\t0.6272942423820496, 0.653552770614624, 0.0052078706212341785, 0.7140105366706848, 0.6777069568634033,\n\t0.037286482751369476, 0.6350667476654053, 0.6650949716567993, 0.00025843404000625014, 0.6459973454475403,\n\t0.6697635650634766, -0.0017647934146225452, 0.6575464010238647, 0.6713786125183105, -0.00027374393539503217,\n\t0.668944776058197, 0.669925332069397, 0.0039377943612635136, 0.6759095191955566, 0.6669122576713562,\n\t0.009080639109015465, 0.7287253737449646, 0.6979261040687561, 0.10571884363889694, 0.6731349229812622,\n\t0.6563650965690613, 0.01263690460473299, 0.5959664583206177, 0.5358293056488037, -0.027530809864401817,\n\t0.6371495723724365, 0.5343661904335022, -0.011242687702178955, 0.6258845329284668, 0.5621902942657471,\n\t-0.03194599598646164, 0.6132814884185791, 0.535895049571991, -0.025143468752503395, 0.5883598923683167,\n\t0.6603836417198181, -0.03740541636943817, 0.6810069680213928, 0.46356669068336487, 0.06206328049302101,\n\t0.6649413108825684, 0.4483012557029724, 0.049313735216856, 0.6261347532272339, 0.42170408368110657,\n\t0.02103644795715809, 0.7104422450065613, 0.49282026290893555, 0.12410101294517517, 0.6278473138809204,\n\t0.6584839224815369, 0.0028743918519467115, 0.6124112010002136, 0.6176889538764954, -0.03677929937839508,\n\t0.5993651151657104, 0.41759443283081055, 0.01607094518840313, 0.6445260643959045, 0.42281869053840637,\n\t0.05040973052382469, 0.7313166260719299, 0.5639280676841736, 0.10714519768953323, 0.620040237903595,\n\t0.5004158020019531, -0.003688700729981065, 0.6219918727874756, 0.4974656403064728, -0.005657417234033346,\n\t0.6238498091697693, 0.49259135127067566, -0.006874070968478918, 0.625573456287384, 0.48571640253067017,\n\t-0.00424779811874032, 0.6298570036888123, 0.4738302230834961, 0.006881120149046183, 0.6378323435783386,\n\t0.5036218166351318, 0.0070981779135763645, 0.6415999531745911, 0.5046277642250061, 0.007165220566093922,\n\t0.6451493501663208, 0.5067276358604431, 0.00727017130702734, 0.6582596302032471, 0.516936182975769,\n\t0.00953766144812107, 0.7060785293579102, 0.5563026666641235, 0.035442110151052475, 0.6107326149940491,\n\t0.6334069967269897, -0.027013909071683884, 0.6143887042999268, 0.6611696481704712, -0.007210137322545052,\n\t0.622404158115387, 0.6606694459915161, -0.0009888665517792106, 0.6348552107810974, 0.5053471922874451,\n\t0.008530537597835064, 0.7080464363098145, 0.5226761102676392, 0.06089344993233681, 0.6043440699577332,\n\t0.6595162749290466, -0.025976156815886497, 0.6379470229148865, 0.4600217342376709, 0.016347840428352356,\n\t0.5930439829826355, 0.6101597547531128, -0.061806123703718185, 0.603573739528656, 0.6238319277763367,\n\t-0.04834100604057312, 0.5915900468826294, 0.6260727643966675, -0.052646420896053314, 0.6223673224449158,\n\t0.595625638961792, -0.03220928832888603, 0.5991707444190979, 0.431388258934021, 0.006417833734303713,\n\t0.5982794761657715, 0.44950008392333984, 0.00455165421590209, 0.6188966035842896, 0.45139080286026,\n\t0.008398615755140781, 0.6663227677345276, 0.48698094487190247, 0.029008174315094948, 0.6482332348823547,\n\t0.5613072514533997, -0.0009958110749721527, 0.653148889541626, 0.4718482494354248, 0.023432696238160133,\n\t0.6779701709747314, 0.5654428005218506, 0.006166939623653889, 0.6609395742416382, 0.5473595857620239,\n\t0.0038162865675985813, 0.6895847320556641, 0.5431552529335022, 0.021125176921486855, 0.6239569783210754,\n\t0.4347035586833954, 0.01167227141559124, 0.6295208930969238, 0.5891523957252502, -0.020675651729106903,\n\t0.6770794987678528, 0.4779151380062103, 0.044114693999290466, 0.6610342860221863, 0.4612909257411957,\n\t0.036272019147872925, 0.6765124201774597, 0.504513144493103, 0.029229845851659775, 0.7192245125770569,\n\t0.5419985055923462, 0.0715026780962944, 0.6924633383750916, 0.504946231842041, 0.04378980025649071,\n\t0.7257359623908997, 0.5334193110466003, 0.1051427498459816, 0.67176753282547, 0.5290332436561584,\n\t0.013140039518475533, 0.6204445362091064, 0.6098079085350037, -0.024873334914445877, 0.6237228512763977,\n\t0.5654788017272949, -0.04860622435808182, 0.6311215162277222, 0.5638071894645691, -0.032849524170160294,\n\t0.6186907291412354, 0.5734990835189819, -0.05987062305212021, 0.6236940622329712, 0.6712234020233154,\n\t-0.012376398779451847, 0.6441580057144165, 0.6785266399383545, -0.015088687650859356, 0.6621633768081665,\n\t0.6811156272888184, -0.013046788983047009, 0.6772578358650208, 0.6811863780021667, -0.006020528730005026,\n\t0.6878572702407837, 0.677674412727356, 0.003719285363331437, 0.6963497400283813, 0.6589553356170654,\n\t0.028900891542434692, 0.7341514229774475, 0.628466784954071, 0.0977800190448761, 0.6877315044403076,\n\t0.6383393406867981, 0.021072475239634514, 0.6747503280639648, 0.632607638835907, 0.01224662084132433,\n\t0.6573258638381958, 0.6314256191253662, 0.005778477061539888, 0.6409778594970703, 0.6337921023368835,\n\t0.002457024296745658, 0.6287280917167664, 0.6374652981758118, -0.0004955197800882161, 0.6203356385231018,\n\t0.6411440968513489, -0.002290617674589157, 0.7312328815460205, 0.6316544413566589, 0.14840449392795563,\n\t0.6304548978805542, 0.5608689188957214, -0.025829749181866646, 0.6139348149299622, 0.6035944819450378,\n\t-0.0447254404425621, 0.6154800653457642, 0.5630443096160889, -0.05955607816576958, 0.6083341240882874,\n\t0.5564923882484436, -0.05386507511138916, 0.6150166392326355, 0.5615125894546509, -0.05278380960226059,\n\t0.6267946362495422, 0.556524395942688, -0.02112100087106228, 0.6064229011535645, 0.554591953754425,\n\t-0.05736074596643448, 0.6046380996704102, 0.5525090098381042, -0.04112562537193298, 0.6203725337982178,\n\t0.6523374319076538, 0.002642096485942602, 0.6134874820709229, 0.6479132175445557, -0.00598163390532136,\n\t0.6104190945625305, 0.644288957118988, -0.015872271731495857, 0.6799477338790894, 0.6647332310676575,\n\t0.013891543261706829, 0.6858112812042236, 0.66835618019104, 0.014165334403514862, 0.5818506479263306,\n\t0.6075195670127869, -0.057939887046813965, 0.49214431643486023, 0.65007084608078, 0.0013647516025230289,\n\t0.5835508704185486, 0.5535887479782104, -0.04281783849000931, 0.4300937354564667, 0.7102481126785278,\n\t0.049473367631435394, 0.5321562886238098, 0.6378902792930603, -0.007908685132861137, 0.5187457203865051,\n\t0.636262059211731, -0.008012226782739162, 0.5054516196250916, 0.6363983750343323, -0.005750928074121475,\n\t0.4869355261325836, 0.644393801689148, 0.003300843993201852, 0.5429807901382446, 0.6416113972663879,\n\t-0.006265479605644941, 0.5116382241249084, 0.6688380241394043, -0.01829550415277481, 0.5259827375411987,\n\t0.6688980460166931, -0.01719263382256031, 0.49888715147972107, 0.6666198372840881, -0.014956877566874027,\n\t0.49017003178596497, 0.6626636981964111, -0.009829703718423843, 0.4750588834285736, 0.6342905759811401,\n\t0.01011670846492052, 0.5496111512184143, 0.4397387206554413, 0.017523333430290222, 0.48672279715538025,\n\t0.6534544229507446, 0.004513532388955355, 0.42744332551956177, 0.6438665390014648, 0.06474500894546509,\n\t0.45722436904907227, 0.6433544754981995, 0.02047058567404747, 0.5255895256996155, 0.573995053768158,\n\t-0.011942178942263126, 0.5817243456840515, 0.5137086510658264, -0.027815399691462517, 0.5842267274856567,\n\t0.5011433362960815, -0.0194685198366642, 0.5653993487358093, 0.5093858242034912, -0.020889965817332268,\n\t0.5546598434448242, 0.5044609308242798, -0.011751028709113598, 0.5721275210380554, 0.5002256035804749,\n\t-0.015554376877844334, 0.5623477697372437, 0.49918776750564575, -0.007049774285405874, 0.537401556968689,\n\t0.48475104570388794, 0.01100845169275999, 0.5858254432678223, 0.5586721897125244, -0.06784812361001968,\n\t0.5836111307144165, 0.5724018216133118, -0.07373113185167313, 0.46679335832595825, 0.674442708492279,\n\t-0.011749539524316788, 0.550311803817749, 0.6124117970466614, -0.017966121435165405, 0.5530810952186584,\n\t0.5642958879470825, -0.037261202931404114, 0.5514327883720398, 0.5725245475769043, -0.03411242365837097,\n\t0.48346590995788574, 0.5747482776641846, 0.00037908367812633514, 0.582703173160553, 0.5912188291549683,\n\t-0.06830978393554688, 0.5012876391410828, 0.6864969730377197, -0.03427444398403168, 0.4812491536140442,\n\t0.6827899217605591, -0.025466322898864746, 0.4445561170578003, 0.7353243827819824, 0.020364759489893913,\n\t0.5611920356750488, 0.6758191585540771, -0.03937689587473869, 0.538538932800293, 0.6658725738525391,\n\t-0.011571191251277924, 0.5264328718185425, 0.4968096911907196, 0.011668764054775238, 0.4463108777999878,\n\t0.5072990655899048, 0.12277233600616455, 0.5629951357841492, 0.5568661093711853, -0.03021933138370514,\n\t0.5742037296295166, 0.5526848435401917, -0.0302346833050251, 0.5419890880584717, 0.49731165170669556,\n\t0.010570643469691277, 0.5473287105560303, 0.49864470958709717, 0.007382293231785297, 0.4721071720123291,\n\t0.6932225227355957, -0.020623216405510902, 0.5524250864982605, 0.5589223504066467, -0.028958186507225037,\n\t0.5279378294944763, 0.6849754452705383, -0.039109185338020325, 0.5244609117507935, 0.6976950764656067,\n\t-0.04375867173075676, 0.5020346641540527, 0.7695508599281311, -0.030552521347999573, 0.4588877260684967,\n\t0.715364933013916, -0.003544924547895789, 0.514762282371521, 0.735663652420044, -0.03838041424751282,\n\t0.4565298855304718, 0.6823055148124695, -0.001983386930078268, 0.4433104991912842, 0.6957772374153137,\n\t0.022011971101164818, 0.5829482078552246, 0.5056677460670471, -0.025178268551826477, 0.5694928765296936,\n\t0.5032799243927002, -0.01878097839653492, 0.5586386919021606, 0.5013757348060608, -0.010522070340812206,\n\t0.5664116740226746, 0.5546143054962158, -0.027349766343832016, 0.5450059175491333, 0.49781179428100586,\n\t0.008866756223142147, 0.5509059429168701, 0.4958842694759369, 0.0019531159196048975, 0.5483735203742981,\n\t0.4996299147605896, 0.007014689035713673, 0.5703294277191162, 0.5603184700012207, -0.04979182407259941,\n\t0.5642762780189514, 0.5007290244102478, -0.00458340160548687, 0.5742692947387695, 0.5004604458808899,\n\t-0.009643666446208954, 0.5853822231292725, 0.5001454949378967, -0.013449915684759617, 0.5809279084205627,\n\t0.4644834101200104, 0.0015282470267266035, 0.5825574398040771, 0.47810137271881104, -0.012397948652505875,\n\t0.5830555558204651, 0.4860108494758606, -0.014821207150816917, 0.5836350321769714, 0.4925753176212311,\n\t-0.012557776644825935, 0.5841907858848572, 0.4969751834869385, -0.01094240602105856, 0.562343418598175,\n\t0.4981342852115631, -0.003060895251110196, 0.5608420968055725, 0.4963582754135132, -0.004891609773039818,\n\t0.5584792494773865, 0.49296125769615173, -0.006019322667270899, 0.5563141107559204, 0.48815980553627014,\n\t-0.003411252051591873, 0.5411506295204163, 0.5206871032714844, -0.010148998349905014, 0.4267213046550751,\n\t0.5813583731651306, 0.130332350730896, 0.5556686520576477, 0.49855491518974304, 0.0026110748294740915,\n\t0.5537115335464478, 0.4974842965602875, 0.0016000381438061595, 0.5790327787399292, 0.5463152527809143,\n\t-0.02947448194026947, 0.5572887659072876, 0.5508096814155579, -0.017527181655168533, 0.5767145156860352,\n\t0.5494547486305237, -0.03043963387608528, 0.5368266105651855, 0.6038581132888794, -0.013130576349794865,\n\t0.5153880715370178, 0.5929628610610962, -0.009959367103874683, 0.5491586327552795, 0.5667904019355774,\n\t-0.02580786682665348, 0.4673895239830017, 0.7555429339408875, -0.00786743126809597, 0.4818596839904785,\n\t0.7293239235877991, -0.022682422772049904, 0.495491623878479, 0.6994352340698242, -0.03373921662569046,\n\t0.5491659641265869, 0.47655290365219116, 0.006359810009598732, 0.5558041334152222, 0.6948980093002319,\n\t-0.047802869230508804, 0.5476680397987366, 0.7379486560821533, -0.04600735381245613, 0.5386999845504761,\n\t0.7770034670829773, -0.041968364268541336, 0.49371984601020813, 0.6390219330787659, -0.0011353716254234314,\n\t0.45924699306488037, 0.6230847239494324, 0.017909176647663116, 0.5497184991836548, 0.6451905369758606,\n\t-0.004511586390435696, 0.47387659549713135, 0.6592671275138855, -0.0002052539784926921, 0.559233546257019,\n\t0.6215396523475647, -0.023491984233260155, 0.5614129304885864, 0.5686260461807251, -0.05066792294383049,\n\t0.44358396530151367, 0.6133047342300415, 0.032851871103048325, 0.4708636999130249, 0.6121325492858887,\n\t0.008213784545660019, 0.49006566405296326, 0.6065746545791626, -0.0018736390629783273, 0.5168517231941223,\n\t0.6100423336029053, -0.0064359731040894985, 0.5354939103126526, 0.6170545220375061, -0.008524289354681969,\n\t0.5488735437393188, 0.6239800453186035, -0.01225472241640091, 0.5771933197975159, 0.6392103433609009,\n\t-0.03967931121587753, 0.44793638586997986, 0.5813608169555664, 0.03372591733932495, 0.4607813358306885,\n\t0.6608646512031555, 0.004454560577869415, 0.5899302363395691, 0.5523223876953125, -0.06039418652653694,\n\t0.5526745915412903, 0.5969607830047607, -0.02054455317556858, 0.42069560289382935, 0.6485627293586731,\n\t0.1089276522397995, 0.5587642192840576, 0.6315051317214966, -0.014726491644978523, 0.5475225448608398,\n\t0.5667782425880432, -0.01196714024990797, 0.48213472962379456, 0.6519812345504761, 0.00648120604455471,\n\t0.5598633885383606, 0.5786183476448059, -0.04674546793103218, 0.4334367513656616, 0.5449712872505188,\n\t0.1299823373556137, 0.5487878322601318, 0.6506414413452148, -0.0019911546260118484, 0.5709492564201355,\n\t0.5863202810287476, -0.06025518476963043, 0.48470547795295715, 0.46946802735328674, 0.058563053607940674,\n\t0.4842768907546997, 0.4550718665122986, 0.08459614217281342, 0.43073591589927673, 0.5799112319946289,\n\t0.08159306645393372, 0.4641961455345154, 0.4890005588531494, 0.07141872495412827, 0.43456146121025085,\n\t0.6727609634399414, 0.04671849310398102, 0.546826958656311, 0.4258698523044586, 0.02725791372358799,\n\t0.590745210647583, 0.5504941940307617, -0.04165741056203842, 0.5412954092025757, 0.586286187171936,\n\t-0.014774596318602562, 0.4436746835708618, 0.641162097454071, 0.033192217350006104, 0.5066189765930176,\n\t0.6455842852592468, -0.00486251525580883, 0.5184691548347473, 0.6446030139923096, -0.0072727142833173275,\n\t0.5479140281677246, 0.49320465326309204, 0.00425872253254056, 0.45175716280937195, 0.5515438318252563,\n\t0.04309084266424179, 0.5716689825057983, 0.4093017876148224, 0.03537257760763168, 0.5288559198379517,\n\t0.4254978597164154, 0.05574021860957146, 0.5085510611534119, 0.43727684020996094, 0.06812013685703278,\n\t0.5294480323791504, 0.6459577679634094, -0.007264253217726946, 0.5397399067878723, 0.6484366655349731,\n\t-0.005095430184155703, 0.5460420846939087, 0.6496260166168213, -0.002480139257386327, 0.448722779750824,\n\t0.664927065372467, 0.016700154170393944, 0.5367225408554077, 0.6604592800140381, -0.008525077253580093,\n\t0.5248774290084839, 0.6641359925270081, -0.011947032995522022, 0.5131126642227173, 0.6643978357315063,\n\t-0.01211329735815525, 0.5015378594398499, 0.6616957187652588, -0.009632859379053116, 0.49454179406166077,\n\t0.6581682562828064, -0.005386826116591692, 0.42287370562553406, 0.6830542087554932, 0.0815412774682045,\n\t0.49822375178337097, 0.6477406620979309, -0.001520255347713828, 0.5527865886688232, 0.5294815897941589,\n\t-0.01714099943637848, 0.5627815127372742, 0.5586988925933838, -0.03600528463721275, 0.5784335136413574,\n\t0.5339886546134949, -0.02759011648595333, 0.5061179995536804, 0.45171433687210083, 0.049434877932071686,\n\t0.5258903503417969, 0.4384379982948303, 0.03929493948817253, 0.5714614391326904, 0.4175550043582916,\n\t0.017135778442025185, 0.46368151903152466, 0.4770064651966095, 0.1051662415266037, 0.544999361038208,\n\t0.654644787311554, -0.0049626752734184265, 0.5698496103286743, 0.6155015230178833, -0.040174294263124466,\n\t0.5492998361587524, 0.4155541658401489, 0.04280807077884674, 0.43686404824256897, 0.5469575524330139,\n\t0.0849812850356102, 0.5724139213562012, 0.497525155544281, -0.0076819309033453465, 0.571051836013794,\n\t0.4942820966243744, -0.009672875516116619, 0.5695209503173828, 0.48912695050239563, -0.01125219278037548,\n\t0.568352222442627, 0.48185718059539795, -0.008894178085029125, 0.5634872913360596, 0.46922165155410767,\n\t0.0019267196767032146, 0.5532976388931274, 0.49877411127090454, 0.00014125469897408038, 0.5498378276824951,\n\t0.49937909841537476, -0.0003464771434664726, 0.5461046695709229, 0.5010014176368713, -0.000992517452687025,\n\t0.5314297676086426, 0.5094097256660461, -0.00024219641636591405, 0.4727921783924103, 0.5430164933204651,\n\t0.018606174737215042, 0.5684020519256592, 0.6312351822853088, -0.030571939423680305, 0.5593469142913818,\n\t0.658668041229248, -0.011915151961147785, 0.5505500435829163, 0.6574605703353882, -0.007653950247913599,\n\t0.5557359457015991, 0.5008780360221863, 0.0018296822672709823, 0.47189247608184814, 0.5085380673408508,\n\t0.04370076581835747, 0.5713229179382324, 0.6579681634902954, -0.028726855292916298, 0.5558371543884277,\n\t0.45455285906791687, 0.010696874000132084, 0.5793959498405457, 0.6226080656051636, -0.05018666386604309,\n\t0.5619624853134155, 0.592438817024231, -0.03683019056916237, 0.5770038962364197, 0.44832175970077515,\n\t0.005648030899465084, 0.5234298706054688, 0.4779168963432312, 0.018901698291301727, 0.5367434620857239,\n\t0.5548428893089294, -0.008794167079031467, 0.5384476780891418, 0.464290589094162, 0.015589773654937744,\n\t0.5045143961906433, 0.5556613802909851, -0.0058886404149234295, 0.5249708890914917, 0.5393781065940857,\n\t-0.005811261013150215, 0.493373304605484, 0.5317988991737366, 0.007190273609012365, 0.5732506513595581,\n\t0.4310152530670166, 0.008203170262277126, 0.5541122555732727, 0.5849836468696594, -0.02628961205482483,\n\t0.5112152695655823, 0.4670509099960327, 0.03230071812868118, 0.5303398966789246, 0.45231160521507263,\n\t0.027262849733233452, 0.5112295150756836, 0.49444466829299927, 0.017138518393039703, 0.456536203622818,\n\t0.5265907049179077, 0.05215836688876152, 0.49230098724365234, 0.4924716353416443, 0.02936984971165657,\n\t0.4462452232837677, 0.5166968703269958, 0.08419863879680634, 0.5152355432510376, 0.519903302192688,\n\t0.0018940692534670234, 0.561359703540802, 0.606576681137085, -0.02975572645664215, 0.5662010312080383,\n\t0.5621314644813538, -0.0529823824763298, 0.5572969913482666, 0.5595375299453735, -0.037801072001457214,\n\t0.5718374252319336, 0.5709333419799805, -0.06340378522872925, 0.5490903854370117, 0.6679622530937195,\n\t-0.018672054633498192, 0.527407169342041, 0.6734738349914551, -0.02419179491698742, 0.508400022983551,\n\t0.6744169592857361, -0.025058584287762642, 0.49211499094963074, 0.6726992130279541, -0.020663714036345482,\n\t0.48052042722702026, 0.6679982542991638, -0.012749302200973034, 0.4711986780166626, 0.6476268768310547,\n\t0.011171777732670307, 0.42707598209381104, 0.6122310161590576, 0.07379888743162155, 0.48382824659347534,\n\t0.6278980374336243, 0.0049666957929730415, 0.49855461716651917, 0.6234437227249146, -0.0017211008816957474,\n\t0.5171185731887817, 0.624201238155365, -0.005750505719333887, 0.5340672135353088, 0.6283735036849976,\n\t-0.006624019704759121, 0.5464488863945007, 0.6333011984825134, -0.007337295450270176, 0.5550276637077332,\n\t0.6379884481430054, -0.007992164231836796, 0.4233008325099945, 0.615493893623352, 0.12387336790561676,\n\t0.5576412081718445, 0.5564656257629395, -0.030713092535734177, 0.5713993310928345, 0.6012508869171143,\n\t-0.04824056476354599, 0.5761169791221619, 0.5607699751853943, -0.062473054975271225, 0.5830904841423035,\n\t0.5550482273101807, -0.055564187467098236, 0.5758211016654968, 0.5593001246452332, -0.05566483736038208,\n\t0.56142657995224, 0.5526345372200012, -0.025226224213838577, 0.5857090950012207, 0.5534002184867859,\n\t-0.05875344201922417, 0.5865271091461182, 0.551390528678894, -0.042232025414705276, 0.5537580847740173,\n\t0.6491919159889221, -0.0035402625799179077, 0.561633825302124, 0.6454389095306396, -0.010467290878295898,\n\t0.56614089012146, 0.6421998739242554, -0.01944989524781704, 0.4902435541152954, 0.6554324626922607,\n\t-0.0010803209152072668, 0.4830193519592285, 0.6585204005241394, -0.0019348353380337358,\n];\n\nexport const TRACKED_FACE_POINTS_COUNT = DEFAULT_POSITION.length / 3;\n\nexport function faceTrackingVector4Array(): Vector4[] {\n\tconst array: Vector4[] = new Array(TRACKED_FACE_POINTS_COUNT);\n\tfor (let i = 0; i < TRACKED_FACE_POINTS_COUNT; i++) {\n\t\tarray[i] = new Vector4();\n\t}\n\treturn array;\n}\n","import {Vector4} from 'three';\n\nexport const DEFAULT_POSITION = [\n\t0.6948906183242798, 0.1967242956161499, 5.073258648735646e-7, 0.6212931871414185, 0.22521686553955078,\n\t-0.024087004363536835, 0.5673462152481079, 0.2831047773361206, -0.038521330803632736, 0.5307766199111938,\n\t0.3381573557853699, -0.051391568034887314, 0.4988502264022827, 0.3788628578186035, -0.06560245156288147,\n\t0.6136432886123657, 0.36340397596359253, -0.04182826355099678, 0.5879948139190674, 0.44878923892974854,\n\t-0.06730060279369354, 0.5733367204666138, 0.504420280456543, -0.08276277035474777, 0.5637136101722717,\n\t0.5479186773300171, -0.0928623303771019, 0.6601388454437256, 0.3730699419975281, -0.04513520374894142,\n\t0.6477749347686768, 0.46681421995162964, -0.06917751580476761, 0.6429883241653442, 0.5282996892929077,\n\t-0.08472905308008194, 0.642918586730957, 0.5757699608802795, -0.09473923593759537, 0.7024123668670654,\n\t0.36396312713623047, -0.04996153712272644, 0.7081984281539917, 0.45005136728286743, -0.07315477728843689,\n\t0.714698076248169, 0.5070115327835083, -0.0867847129702568, 0.7199477553367615, 0.5526862740516663,\n\t-0.09518611431121826, 0.7381932735443115, 0.3403705954551697, -0.05621790513396263, 0.7606501579284668,\n\t0.40025031566619873, -0.07994739711284637, 0.7751006484031677, 0.44385266304016113, -0.09094072878360748,\n\t0.7855665683746338, 0.48222047090530396, -0.09607987850904465,\n];\n\nexport const TRACKED_HAND_POINTS_COUNT = DEFAULT_POSITION.length / 3;\n\nexport function handTrackingVector4Array(): Vector4[] {\n\tconst array: Vector4[] = new Array(TRACKED_HAND_POINTS_COUNT);\n\tfor (let i = 0; i < TRACKED_HAND_POINTS_COUNT; i++) {\n\t\tarray[i] = new Vector4();\n\t}\n\treturn array;\n}\n","import {\n\tColorSpace,\n\tNoColorSpace,\n\tSRGBColorSpace,\n\tLinearSRGBColorSpace,\n\tDisplayP3ColorSpace,\n\tLinearDisplayP3ColorSpace,\n} from 'three';\n// import {PolyDictionary} from '../../types/GlobalTypes';\n\nexport const COLOR_SPACES: Array<ColorSpace> = [\n\tNoColorSpace,\n\tSRGBColorSpace,\n\tLinearSRGBColorSpace,\n\tDisplayP3ColorSpace,\n\tLinearDisplayP3ColorSpace,\n];\nexport const COLOR_SPACES_BY_NAME: Array<Record<string, ColorSpace>> = [\n\t{Linear: NoColorSpace},\n\t{sRGB: SRGBColorSpace},\n\t{LinearSRGB: LinearSRGBColorSpace},\n\t{DisplayP3: DisplayP3ColorSpace},\n\t{LinearDisplayP3: LinearDisplayP3ColorSpace},\n];\nconst COLOR_SPACE_NAME_BY_COLOR_SPACE: Record<ColorSpace, string> = {\n\t[NoColorSpace]: Object.keys(COLOR_SPACES_BY_NAME[0])[0],\n\t[SRGBColorSpace]: Object.keys(COLOR_SPACES_BY_NAME[1])[0],\n\t[LinearSRGBColorSpace]: Object.keys(COLOR_SPACES_BY_NAME[2])[0],\n\t[DisplayP3ColorSpace]: Object.keys(COLOR_SPACES_BY_NAME[3])[0],\n\t[LinearDisplayP3ColorSpace]: Object.keys(COLOR_SPACES_BY_NAME[4])[0],\n};\n// for (let colorSpaceMap of COLOR_SPACES_BY_NAME) {\n// \tconst colorSpaceName = Object.keys(colorSpaceMap)[0];\n// \tconst colorSpaceValue = Object.values(colorSpaceMap)[0];\n// \tCOLOR_SPACE_NAME_BY_COLOR_SPACE[colorSpaceValue] = colorSpaceName;\n// }\nexport {COLOR_SPACE_NAME_BY_COLOR_SPACE};\n","import {\n\tLinearFilter,\n\tNearestFilter,\n\tNearestMipMapNearestFilter,\n\tNearestMipMapLinearFilter,\n\tLinearMipMapNearestFilter,\n\tLinearMipMapLinearFilter,\n} from 'three';\nimport {PolyDictionary} from '../../types/GlobalTypes';\n\nexport const MAG_FILTERS: PolyDictionary<number>[] = [{LinearFilter}, {NearestFilter}];\nexport const MIN_FILTERS: PolyDictionary<number>[] = [\n\t{NearestFilter},\n\t{NearestMipMapNearestFilter},\n\t{NearestMipMapLinearFilter},\n\t{LinearFilter},\n\t{LinearMipMapNearestFilter},\n\t{LinearMipMapLinearFilter},\n];\nexport const MAG_FILTER_DEFAULT_VALUE = Object.values(MAG_FILTERS[0])[0];\nexport const MIN_FILTER_DEFAULT_VALUE = Object.values(MIN_FILTERS[5])[0];\nexport const MAG_FILTER_MENU_ENTRIES = MAG_FILTERS.map((m) => {\n\treturn {\n\t\tname: Object.keys(m)[0],\n\t\tvalue: Object.values(m)[0] as number,\n\t};\n});\nexport const MIN_FILTER_MENU_ENTRIES = MIN_FILTERS.map((m) => {\n\treturn {\n\t\tname: Object.keys(m)[0],\n\t\tvalue: Object.values(m)[0] as number,\n\t};\n});\n","import {\n\tUVMapping,\n\tCubeReflectionMapping,\n\tCubeRefractionMapping,\n\tEquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping,\n\tCubeUVReflectionMapping,\n\t// CubeUVRefractionMapping,\n} from 'three';\n\nexport const MAPPINGS = [\n\t{UVMapping},\n\t{CubeReflectionMapping},\n\t{CubeRefractionMapping},\n\t{EquirectangularReflectionMapping},\n\t{EquirectangularRefractionMapping},\n\t{CubeUVReflectionMapping},\n\t// {CubeUVRefractionMapping},\n];\n","import {ClampToEdgeWrapping, RepeatWrapping, MirroredRepeatWrapping} from 'three';\nimport {PolyDictionary} from '../../types/GlobalTypes';\n\nexport const WRAPPINGS: PolyDictionary<number>[] = [{ClampToEdgeWrapping}, {RepeatWrapping}, {MirroredRepeatWrapping}];\n","export enum CoreEventEmitter {\n\tCANVAS = 'canvas',\n\tDOCUMENT = 'document',\n}\nexport const EVENT_EMITTERS: CoreEventEmitter[] = [CoreEventEmitter.CANVAS, CoreEventEmitter.DOCUMENT];\n\nexport const EVENT_EMITTER_PARAM_MENU_OPTIONS = {\n\tmenu: {\n\t\tentries: EVENT_EMITTERS.map((name, value) => {\n\t\t\treturn {name, value};\n\t\t}),\n\t},\n};\nexport type EmitterElementOrWindow = HTMLCanvasElement | Document | (Window & typeof globalThis);\n","import type {Vector2} from 'three';\n\nexport function isVector2Valid(vector: Vector2): boolean {\n\treturn !isNaN(vector.x) && !isNaN(vector.y) && isFinite(vector.x) && isFinite(vector.y);\n}\n","import type {Vector2} from 'three';\nimport {isVector2Valid} from '../Vector';\nimport type {EventContext} from './EventContextType';\nimport {CursorOffset, MouseHelper} from './MouseHelper';\n\nconst _offset: CursorOffset = {offsetX: 0, offsetY: 0};\n\nexport class CursorHelper {\n\tsetCursorForCPU(context: EventContext<MouseEvent | DragEvent | PointerEvent | TouchEvent>, target: Vector2) {\n\t\tthis.setCursor(context, target);\n\t\ttarget.x = target.x * 2 - 1;\n\t\ttarget.y = -target.y * 2 + 1;\n\t}\n\tsetCursorForGPU(context: EventContext<MouseEvent | DragEvent | PointerEvent | TouchEvent>, target: Vector2) {\n\t\tthis.setCursor(context, target);\n\t\ttarget.y = 1 - target.y;\n\t}\n\n\tprivate setCursor(context: EventContext<MouseEvent | DragEvent | PointerEvent | TouchEvent>, target: Vector2) {\n\t\tconst canvas = context.viewer?.canvas();\n\t\tif (!canvas) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst event = context.event;\n\t\tif (event instanceof PointerEvent || event instanceof MouseEvent || event instanceof DragEvent) {\n\t\t\tMouseHelper.setEventOffset(event, canvas, _offset);\n\t\t}\n\t\tif (\n\t\t\tglobalThis.TouchEvent /* check first that TouchEvent is defined, since it does on firefox desktop */ &&\n\t\t\tevent instanceof TouchEvent\n\t\t) {\n\t\t\tconst touch = event.touches[0];\n\t\t\t// no touch for touchend events\n\t\t\tif (touch) {\n\t\t\t\tMouseHelper.setEventOffset(touch, canvas, _offset);\n\t\t\t}\n\t\t}\n\t\tthis._updateFromCursor(canvas, target);\n\t}\n\tprivate _updateFromCursor(canvas: HTMLCanvasElement, target: Vector2) {\n\t\tif (canvas.offsetWidth <= 0 || canvas.offsetHeight <= 0) {\n\t\t\tconsole.warn('_updateFromCursor: zero size canvas');\n\t\t\t// the canvas can have a size of 0 if it has been removed from the scene\n\t\t\ttarget.set(0, 0);\n\t\t} else {\n\t\t\ttarget.x = _offset.offsetX / canvas.offsetWidth;\n\t\t\ttarget.y = _offset.offsetY / canvas.offsetHeight;\n\t\t\t// this._remapCursor();\n\t\t}\n\t\t// there can be some conditions leading to an infinite mouse number, so we check here what we got\n\t\tif (!isVector2Valid(target)) {\n\t\t\tconsole.warn('invalid number detected');\n\t\t\tconsole.warn(target.toArray(), _offset.offsetX, _offset.offsetY, canvas.offsetWidth, canvas.offsetHeight);\n\t\t\treturn;\n\t\t}\n\t}\n}\n","// https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API\nexport enum DragEventType {\n\tdragover = 'dragover',\n}\nexport const ACCEPTED_DRAG_EVENT_TYPES: DragEventType[] = [DragEventType.dragover];\n","// https://developer.mozilla.org/en-US/docs/Web/Events\nexport enum KeyboardEventType {\n\tkeydown = 'keydown',\n\tkeypress = 'keypress',\n\tkeyup = 'keyup',\n}\nexport const ACCEPTED_KEYBOARD_EVENT_TYPES: KeyboardEventType[] = [\n\tKeyboardEventType.keydown,\n\tKeyboardEventType.keypress,\n\tKeyboardEventType.keyup,\n];\n","// https://developer.mozilla.org/en-US/docs/Web/Events\nexport enum MouseEventType {\n\tauxclick = 'auxclick',\n\tclick = 'click',\n\tcontextmenu = 'contextmenu',\n\tdblclick = 'dblclick',\n\tmousedown = 'mousedown',\n\tmouseenter = 'mouseenter',\n\tmouseleave = 'mouseleave',\n\tmousemove = 'mousemove',\n\tmouseover = 'mouseover',\n\tmouseout = 'mouseout',\n\tmouseup = 'mouseup',\n\tpointerlockchange = 'pointerlockchange',\n\tpointerlockerror = 'pointerlockerror',\n\tselect = 'select',\n\twheel = 'wheel',\n}\nexport const ACCEPTED_MOUSE_EVENT_TYPES: MouseEventType[] = [\n\tMouseEventType.auxclick,\n\tMouseEventType.click,\n\tMouseEventType.contextmenu,\n\tMouseEventType.dblclick,\n\tMouseEventType.mousedown,\n\tMouseEventType.mouseenter,\n\tMouseEventType.mouseleave,\n\tMouseEventType.mousemove,\n\tMouseEventType.mouseover,\n\tMouseEventType.mouseout,\n\tMouseEventType.mouseup,\n\tMouseEventType.pointerlockchange,\n\tMouseEventType.pointerlockerror,\n\tMouseEventType.select,\n\tMouseEventType.wheel,\n];\n","export interface CursorOffset {\n\toffsetX: number;\n\toffsetY: number;\n}\nexport interface CursorPage {\n\tclientX: number;\n\tclientY: number;\n}\n\nclass MouseHelperClass {\n\tprivate static _instance: MouseHelperClass;\n\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new MouseHelperClass());\n\t}\n\tprivate constructor() {\n\t\t// We could potentially remove the 'resize' listener,\n\t\t// as the viewers do not rely on it anymore.\n\t\t// But this may still be required by the event nodes.\n\t\tglobalThis.addEventListener('resize', this._resetCacheBound);\n\t\tdocument.addEventListener('scroll', this._resetCacheBound);\n\t}\n\tprivate _rectByCanvas: Map<HTMLCanvasElement, DOMRect> = new Map();\n\n\tsetEventOffset(cursorPage: CursorPage, canvas: HTMLCanvasElement, offset: CursorOffset) {\n\t\tlet rect = this._rectByCanvas.get(canvas);\n\t\tif (!rect) {\n\t\t\trect = canvas.getBoundingClientRect();\n\t\t\tthis._rectByCanvas.set(canvas, rect);\n\t\t}\n\t\t// this function used to use cursorPage.pageX/pageY\n\t\t// but this was returning an incorrect position when the page was scrolled\n\t\toffset.offsetX = cursorPage.clientX - rect.left;\n\t\toffset.offsetY = cursorPage.clientY - rect.top;\n\t}\n\n\tprivate _resetCacheBound = this._resetCache.bind(this);\n\tprivate _resetCache() {\n\t\tthis._rectByCanvas.clear();\n\t}\n\tresetCacheForCanvas(canvas: HTMLCanvasElement) {\n\t\tthis._rectByCanvas.delete(canvas);\n\t}\n}\n\nexport const MouseHelper = MouseHelperClass.instance();\n","// https://developer.mozilla.org/en-US/docs/Web/Events\nexport enum PointerEventType {\n\t// click = 'click',\n\tcontextmenu = 'contextmenu',\n\tpointerdown = 'pointerdown',\n\tpointermove = 'pointermove',\n\tpointerup = 'pointerup',\n\ttouchstart = 'touchstart',\n\ttouchmove = 'touchmove',\n\ttouchend = 'touchend',\n}\n\nexport const ONLY_POINTER_EVENT_TYPES: PointerEventType[] = [\n\t// PointerEventType.click, // no click for event/pointer\n\tPointerEventType.pointerdown,\n\tPointerEventType.pointermove,\n\tPointerEventType.pointerup,\n];\n\nexport const ACCEPTED_POINTER_EVENT_TYPES: PointerEventType[] = [\n\t// PointerEventType.click,\n\tPointerEventType.contextmenu,\n\tPointerEventType.pointerdown,\n\tPointerEventType.pointermove,\n\tPointerEventType.pointerup,\n];\n","// https://developer.mozilla.org/en-US/docs/Web/API/Touch_events\nexport enum TouchEventType {\n\ttouchstart = 'touchstart',\n\ttouchmove = 'touchmove',\n\ttouchend = 'touchend',\n}\nexport const ACCEPTED_TOUCH_EVENT_TYPES: TouchEventType[] = [\n\tTouchEventType.touchstart,\n\tTouchEventType.touchmove,\n\tTouchEventType.touchend,\n];\n","// https://developer.mozilla.org/en-US/docs/Web/Events\nexport enum WindowEventType {\n\tresize = 'resize',\n}\n\nexport const ACCEPTED_WINDOW_EVENT_TYPES: WindowEventType[] = [WindowEventType.resize];\n","import {\n\tColor,\n\tVector2,\n\tVector3,\n\tVector4,\n\tBufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBufferAttribute,\n} from 'three';\nimport {AttribValue, PolyDictionary} from '../../types/GlobalTypes';\nimport {arrayUniq} from '../ArrayUtils';\nimport {stringToAttribNames, stringMatchMask} from '../String';\nimport {isString,isNumber,isArray} from '../Type';\nimport {AttribSize, GroupString} from './Constant';\n\nexport enum Attribute {\n\tPOINT_INDEX = 'ptnum',\n\tVERTEX_INDEX = 'vtxnum',\n\tPRIMITIVE_INDEX = 'primnum',\n\tOBJECT_INDEX = 'objnum',\n\tOBJECT_NAME = 'objname',\n\tCOLOR = 'color',\n\tNORMAL = 'normal',\n\tPOSITION = 'position',\n\tPSCALE = 'pscale',\n\tUP = 'up',\n\tUV = 'uv',\n\tSCALE = 'scale',\n\tTANGENT = 'tangent',\n\tID = 'id',\n}\nexport enum ObjectAttribute {\n\tHOVERED = 'hovered',\n}\n\nconst ATTRIB_NAME_MAP: PolyDictionary<string> = {\n\tP: Attribute.POSITION,\n\tN: Attribute.NORMAL,\n\tCd: Attribute.COLOR,\n};\nconst _matchingAttribNames: string[] = [];\nconst _masks: string[] = [];\n\nexport class CoreAttribute {\n\tstatic remapName(name: string): string {\n\t\treturn ATTRIB_NAME_MAP[name] || name;\n\t}\n\n\tstatic arrayToIndexedArrays(array: string[]) {\n\t\tconst index_by_value: PolyDictionary<number> = {};\n\t\tlet current_index = 0;\n\t\tconst indices = [];\n\t\tconst values = [];\n\n\t\tlet i = 0;\n\t\twhile (i < array.length) {\n\t\t\t//(value = array[i++])?\n\t\t\tconst value = array[i];\n\t\t\tconst index = index_by_value[value];\n\t\t\tif (index != null) {\n\t\t\t\tindices.push(index);\n\t\t\t} else {\n\t\t\t\tvalues.push(value);\n\t\t\t\tindices.push(current_index);\n\t\t\t\tindex_by_value[value] = current_index;\n\t\t\t\tcurrent_index += 1;\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\treturn {\n\t\t\tindices,\n\t\t\tvalues,\n\t\t};\n\t}\n\n\tstatic defaultValue(size: number) {\n\t\tswitch (size) {\n\t\t\tcase 1:\n\t\t\t\treturn 0;\n\t\t\tcase 2:\n\t\t\t\treturn new Vector2(0, 0);\n\t\t\tcase 3:\n\t\t\t\treturn new Vector3(0, 0, 0);\n\t\t\tdefault:\n\t\t\t\tthrow `size ${size} not yet implemented`;\n\t\t}\n\t}\n\n\tstatic copy(src: BufferAttribute, dest: BufferAttribute, markAsNeedsUpdate = true) {\n\t\tconst srcArray = src?.array;\n\t\tconst destArray = dest?.array;\n\t\tif (srcArray && destArray) {\n\t\t\tconst min_length = Math.min(srcArray.length, destArray.length);\n\t\t\tfor (let i = 0; i < min_length; i++) {\n\t\t\t\tdestArray[i] = srcArray[i];\n\t\t\t}\n\n\t\t\tif (markAsNeedsUpdate) {\n\t\t\t\tdest.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic attribSizeFromValue(val: AttribValue): AttribSize | null {\n\t\tif (isString(val) || isNumber(val)) {\n\t\t\treturn AttribSize.FLOAT;\n\t\t}\n\t\tif (isArray(val)) {\n\t\t\treturn val.length;\n\t\t}\n\n\t\tswitch (val.constructor) {\n\t\t\tcase Color:\n\t\t\t\treturn AttribSize.VECTOR3;\n\t\t\tcase Vector2:\n\t\t\t\treturn AttribSize.VECTOR2;\n\t\t\tcase Vector3:\n\t\t\t\treturn AttribSize.VECTOR3;\n\t\t\tcase Vector4:\n\t\t\t\treturn AttribSize.VECTOR4;\n\t\t}\n\t\treturn null;\n\t}\n\tstatic attribNamesMatchingMask(masksString: GroupString, existingAttribNames: string[]) {\n\t\tstringToAttribNames(masksString, _masks);\n\n\t\t_matchingAttribNames.length = 0;\n\t\tfor (const mask of _masks) {\n\t\t\tfor (const attribName of existingAttribNames) {\n\t\t\t\tif (stringMatchMask(attribName, mask)) {\n\t\t\t\t\t_matchingAttribNames.push(attribName);\n\t\t\t\t} else {\n\t\t\t\t\tconst remapped = CoreAttribute.remapName(mask);\n\t\t\t\t\tif (attribName == remapped) {\n\t\t\t\t\t\t_matchingAttribNames.push(attribName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst uniqAttributeNames: string[] = [];\n\t\treturn arrayUniq(_matchingAttribNames, uniqAttributeNames);\n\t}\n}\n\nexport function markAttributeAsNeedsUpdateForFrame(\n\tattribute: BufferAttribute | InstancedBufferAttribute | InterleavedBufferAttribute,\n\tframe: number\n) {\n\tif (attribute instanceof BufferAttribute || attribute instanceof InstancedBufferAttribute) {\n\t\t(attribute as BufferAttribute | InstancedBufferAttribute).version = frame;\n\t} else {\n\t\tif (attribute.data) {\n\t\t\tattribute.data.version = frame;\n\t\t}\n\t}\n}\n","import {isString,isArray} from '../Type';\nimport {AttribType} from './Constant';\n\nexport class CoreAttributeData {\n\tconstructor(private _size: number, private _type: AttribType) {}\n\n\tsize() {\n\t\treturn this._size;\n\t}\n\ttype() {\n\t\treturn this._type;\n\t}\n\n\tstatic from_value(attrib_value: any) {\n\t\tconst type = isString(attrib_value) ? AttribType.STRING : AttribType.NUMERIC;\n\t\tconst size = isArray(attrib_value) ? attrib_value.length : 1;\n\n\t\treturn new this(size, type);\n\t}\n}\n","import {BaseCoreObject} from '../geometry/entities/object/BaseCoreObject';\nimport type {Vector4, Vector3, Vector2} from 'three';\nimport {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';\n\n// vector\nexport function setObjectVector4(object: ObjectContent<CoreObjectType>, attribName: string, value: Vector4) {\n\tBaseCoreObject.addAttribute(object, attribName, value);\n}\nexport function getObjectVector4(object: ObjectContent<CoreObjectType>, attribName: string, target: Vector4) {\n\tBaseCoreObject.attribValue(object, attribName, 0, target);\n}\nexport function setObjectVector3(object: ObjectContent<CoreObjectType>, attribName: string, value: Vector3) {\n\tBaseCoreObject.addAttribute(object, attribName, value);\n}\nexport function getObjectVector3(object: ObjectContent<CoreObjectType>, attribName: string, target: Vector3) {\n\tBaseCoreObject.attribValue(object, attribName, 0, target);\n}\nexport function setObjectVector2(object: ObjectContent<CoreObjectType>, attribName: string, value: Vector2) {\n\tBaseCoreObject.addAttribute(object, attribName, value);\n}\nexport function getObjectVector2(object: ObjectContent<CoreObjectType>, attribName: string, target: Vector2) {\n\tBaseCoreObject.attribValue(object, attribName, 0, target);\n}\n// number\nexport function setObjectNumber(object: ObjectContent<CoreObjectType>, attribName: string, value: number) {\n\tBaseCoreObject.addAttribute(object, attribName, value);\n}\nexport function getObjectNumber(\n\tobject: ObjectContent<CoreObjectType>,\n\tattribName: string,\n\tdefaultValue: number\n): number {\n\tconst val = BaseCoreObject.attribValue(object, attribName, 0) as number | undefined;\n\tif (val == null) {\n\t\treturn defaultValue;\n\t}\n\treturn val;\n}\n// boolean\nexport function setObjectBoolean(object: ObjectContent<CoreObjectType>, attribName: string, value: boolean) {\n\tBaseCoreObject.addAttribute(object, attribName, value);\n}\nexport function getObjectBoolean(\n\tobject: ObjectContent<CoreObjectType>,\n\tattribName: string,\n\tdefaultValue: boolean\n): boolean {\n\tconst val = BaseCoreObject.attribValue(object, attribName, 0) as boolean | undefined;\n\tif (val == null) {\n\t\treturn defaultValue;\n\t}\n\treturn val;\n}\n// string\nexport function setObjectString(object: ObjectContent<CoreObjectType>, attribName: string, value: string) {\n\tBaseCoreObject.addAttribute(object, attribName, value);\n}\nexport function getObjectString(object: ObjectContent<CoreObjectType>, attribName: string): string | undefined {\n\treturn BaseCoreObject.attribValue(object, attribName, 0) as string | undefined;\n}\n","import {Number2} from '../../types/GlobalTypes';\nimport {\n\tObject3D,\n\tLineSegments,\n\tInstancedMesh,\n\tMesh,\n\tPoints,\n\tGroup,\n\tScene,\n\tMeshStandardMaterial,\n\tPointsMaterial,\n\tLineBasicMaterial,\n\tFrontSide,\n} from 'three';\nimport type {\n\tAmbientLight,\n\t// SkinnedMesh,\n\t// Bone,\n\tCubeCamera,\n\tDirectionalLight,\n\tHemisphereLight,\n\tLightProbe,\n\tMaterial,\n\tLOD,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tRectAreaLight,\n\tSpotLight,\n} from 'three';\nimport {GroupCollectionData} from './EntityGroupCollection';\nimport {CoreObjectType, ObjectContent} from './ObjectContent';\nimport type {PhysicalCamera, ShapedAreaLight, PhysicalSpotLight} from '../render/PBR/three-gpu-pathtracer';\n\n// import {Poly} from '../../engine/Poly';\n\ninterface MaterialsByString {\n\t[propName: string]: Material;\n}\n\nexport enum ObjectType {\n\tAMBIENT_LIGHT = 'AmbientLight',\n\tAREA_LIGHT = 'AreaLight',\n\t// BONE = 'Bone',\n\tCUBE_CAMERA = 'CubeCamera',\n\tDIRECTIONAL_LIGHT = 'DirectionalLight',\n\tGROUP = 'Group',\n\tHEMISPHERE_LIGHT = 'HemisphereLight',\n\tINSTANCED_MESH = 'InstancedMesh',\n\tLIGHT_PROBE = 'LightProbe',\n\tLINE_SEGMENTS = 'LineSegments',\n\tLOD = 'LOD',\n\tMESH = 'Mesh',\n\tOBJECT3D = 'Object3D',\n\tORTHOGRAPHIC_CAMERA = 'OrthographicCamera',\n\tPERSPECTIVE_CAMERA = 'PerspectiveCamera',\n\tPHYSICAL_CAMERA = 'PhysicalCamera',\n\tPHYSICAL_SPOT_LIGHT = 'PhysicalSpotLight',\n\tPOINT_LIGHT = 'PointLight',\n\tPOINTS = 'Points',\n\tSCENE = 'Scene',\n\tSHAPED_AREA_LIGHT = 'ShapedAreaLight',\n\t// SKINNED_MESH = 'SkinnedMesh',\n\tSPOT_LIGHT = 'SpotLight',\n\tUNKNOWN = 'Unknown',\n\tQUAD = 'Quad',\n}\nexport const OBJECT_TYPES: ObjectType[] = [\n\tObjectType.GROUP,\n\tObjectType.LINE_SEGMENTS,\n\tObjectType.MESH,\n\tObjectType.OBJECT3D,\n\tObjectType.POINTS,\n\tObjectType.SCENE,\n];\n\ninterface ObjectContentConstructor<T extends CoreObjectType> {\n\tnew (arg0: any, arg1?: any, arg2?: any): ObjectContent<T>;\n}\nexport type DefaultObjectContentConstructor = ObjectContentConstructor<CoreObjectType>;\n\nexport interface ObjectByObjectType {\n\t[ObjectType.AMBIENT_LIGHT]: AmbientLight;\n\t[ObjectType.AREA_LIGHT]: RectAreaLight;\n\t// [ObjectType.BONE]: typeof Bone;\n\t[ObjectType.CUBE_CAMERA]: CubeCamera;\n\t[ObjectType.DIRECTIONAL_LIGHT]: DirectionalLight;\n\t[ObjectType.GROUP]: Group;\n\t[ObjectType.HEMISPHERE_LIGHT]: HemisphereLight;\n\t[ObjectType.INSTANCED_MESH]: InstancedMesh;\n\t[ObjectType.LIGHT_PROBE]: LightProbe;\n\t[ObjectType.LINE_SEGMENTS]: LineSegments;\n\t[ObjectType.LOD]: LOD;\n\t[ObjectType.MESH]: Mesh;\n\t[ObjectType.OBJECT3D]: Object3D;\n\t[ObjectType.POINT_LIGHT]: PointLight;\n\t[ObjectType.POINTS]: Points;\n\t[ObjectType.ORTHOGRAPHIC_CAMERA]: OrthographicCamera;\n\t[ObjectType.PERSPECTIVE_CAMERA]: PerspectiveCamera;\n\t[ObjectType.PHYSICAL_CAMERA]: PhysicalCamera;\n\t[ObjectType.PHYSICAL_SPOT_LIGHT]: PhysicalSpotLight;\n\t// [ObjectType.POINTS]: typeof Points;\n\t[ObjectType.SCENE]: Scene;\n\t[ObjectType.SHAPED_AREA_LIGHT]: ShapedAreaLight;\n\t// [ObjectType.SKINNED_MESH]: typeof SkinnedMesh;\n\t[ObjectType.SPOT_LIGHT]: SpotLight;\n\t[ObjectType.UNKNOWN]: null;\n\t[ObjectType.QUAD]: null;\n}\n\nexport interface ObjectData {\n\ttype: ObjectType;\n\tname: string | null;\n\tchildrenCount: number;\n\tgroupData: GroupCollectionData;\n\tverticesCount: number;\n\tpointsCount: number;\n\tprimitivesCount: number;\n\tprimitiveName: string;\n}\n\nconst UNKNOWN_OBJECT_TYPE: ObjectTypeData = {\n\ttype: ObjectType.UNKNOWN,\n\tcheckFunc: (o) => ObjectType.UNKNOWN,\n\thumanName: 'Unknown',\n\tctor: null as any,\n};\n\n// type DataByConstructor = Map<DefaultObjectContentConstructor, ObjectTypeData>;\ntype ObjectTypeCheckFunction = (object: ObjectContent<CoreObjectType>) => ObjectType | undefined;\ntype DataByObjectType = Map<ObjectType, ObjectTypeData>;\nexport interface ObjectTypeData {\n\ttype: ObjectType;\n\tcheckFunc: ObjectTypeCheckFunction;\n\tctor: DefaultObjectContentConstructor;\n\thumanName: string;\n}\ninterface ObjectTypeConstructorRegisters {\n\tobjectTypeCheckFunctions: ObjectTypeCheckFunction[];\n\tdataByObjectType: DataByObjectType;\n}\n\nfunction _initializeObjectTypeFromConstructor() {\n\tconst objectTypeCheckFunctions: ObjectTypeCheckFunction[] = [];\n\tconst dataByObjectType: DataByObjectType = new Map();\n\tconst maps: ObjectTypeConstructorRegisters = {objectTypeCheckFunctions, dataByObjectType};\n\tfunction _register(\n\t\ttype: ObjectType,\n\t\tcheckFunc: ObjectTypeCheckFunction,\n\t\tctor: DefaultObjectContentConstructor,\n\t\thumanName?: string\n\t) {\n\t\t_registerObjectType_(maps, {\n\t\t\ttype,\n\t\t\tcheckFunc,\n\t\t\tctor,\n\t\t\thumanName: humanName || type,\n\t\t});\n\t}\n\t_register(\n\t\tObjectType.OBJECT3D,\n\t\t(o) => ((o as Object3D).isObject3D ? ObjectType.OBJECT3D : undefined),\n\t\tObject3D,\n\t\t'Object3D'\n\t);\n\t_register(ObjectType.MESH, (o) => ((o as Mesh).isMesh ? ObjectType.MESH : undefined), Mesh, 'Mesh');\n\t_register(ObjectType.GROUP, (o) => ((o as Group).isGroup ? ObjectType.GROUP : undefined), Group, 'Group');\n\t_register(\n\t\tObjectType.LINE_SEGMENTS,\n\t\t(o) => ((o as LineSegments).isLineSegments ? ObjectType.LINE_SEGMENTS : undefined),\n\t\tLineSegments,\n\t\t'LineSegments'\n\t);\n\t_register(\n\t\tObjectType.INSTANCED_MESH,\n\t\t(o) => ((o as InstancedMesh).isInstancedMesh ? ObjectType.INSTANCED_MESH : undefined),\n\t\tInstancedMesh,\n\t\t'InstancedMesh'\n\t);\n\t_register(ObjectType.POINTS, (o) => ((o as Points).isPoints ? ObjectType.POINTS : undefined), Points, 'Points');\n\t_register(ObjectType.SCENE, (o) => ((o as Scene).isScene ? ObjectType.SCENE : undefined), Scene, 'Scene');\n\treturn maps;\n}\nconst {objectTypeCheckFunctions, dataByObjectType}: ObjectTypeConstructorRegisters =\n\t_initializeObjectTypeFromConstructor();\nfunction _registerObjectType_(maps: ObjectTypeConstructorRegisters, data: ObjectTypeData) {\n\tmaps.objectTypeCheckFunctions.unshift(data.checkFunc);\n\tmaps.dataByObjectType.set(data.type, data);\n}\nexport function registerObjectType(data: ObjectTypeData) {\n\t_registerObjectType_({objectTypeCheckFunctions, dataByObjectType}, data);\n}\n\nexport function objectTypeFromObject(object: ObjectContent<CoreObjectType>): ObjectType {\n\treturn dataFromObject(object).type;\n}\n\nexport function dataFromObject(object: ObjectContent<CoreObjectType>): ObjectTypeData {\n\tfor (const checkFunc of objectTypeCheckFunctions) {\n\t\tconst objectType = checkFunc(object);\n\t\tif (objectType) {\n\t\t\treturn dataByObjectType.get(objectType) as ObjectTypeData;\n\t\t}\n\t}\n\treturn UNKNOWN_OBJECT_TYPE;\n}\n\nexport function objectConstructorByObjectType<O extends ObjectType>(objectType: O): ObjectByObjectType[O] {\n\tconst data = dataByObjectType.get(objectType);\n\tif (data) {\n\t\treturn data.ctor as any as ObjectByObjectType[O];\n\t} else {\n\t\tconsole.warn(`no constructor found for type '${objectType}'`);\n\t\treturn dataByObjectType.get(ObjectType.MESH) as any as ObjectByObjectType[O];\n\t}\n}\n\nexport const DEFAULT_MATERIALS: MaterialsByString = {\n\tMeshStandard: new MeshStandardMaterial({\n\t\tcolor: 0xffffff,\n\t\tside: FrontSide,\n\t\tmetalness: 0.5,\n\t\troughness: 0.9,\n\t}),\n\t// [ObjectType.MESH]: new MeshLambertMaterial({\n\t// \tcolor: new Color(1, 1, 1),\n\t// \tside: FrontSide,\n\t// \tvertexColors: false,\n\t// \ttransparent: true,\n\t// \tdepthTest: true,\n\t// }),\n\t[ObjectType.MESH]: new MeshStandardMaterial({\n\t\tcolor: 0xffffff,\n\t\tside: FrontSide,\n\t\tmetalness: 0.0,\n\t\troughness: 0.9,\n\t}),\n\t[ObjectType.POINTS]: new PointsMaterial({\n\t\tcolor: 0xffffff,\n\t\tsize: 0.1,\n\t\t//blending: AdditiveBlending\n\t\tdepthTest: true,\n\t}),\n\t[ObjectType.LINE_SEGMENTS]: new LineBasicMaterial({\n\t\tcolor: 0xffffff,\n\t\tlinewidth: 1,\n\t}),\n};\n\nexport enum AttribClass {\n\tPOINT = 'point',\n\tVERTEX = 'vertex',\n\tPRIMITIVE = 'primitive',\n\tOBJECT = 'object',\n\tCORE_GROUP = 'coreGroup',\n}\nexport const ATTRIBUTE_CLASSES: Array<AttribClass> = [\n\tAttribClass.POINT,\n\tAttribClass.VERTEX,\n\tAttribClass.PRIMITIVE,\n\tAttribClass.OBJECT,\n\tAttribClass.CORE_GROUP,\n];\nexport const ATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP: Array<AttribClass> = [\n\tAttribClass.POINT,\n\tAttribClass.VERTEX,\n\tAttribClass.PRIMITIVE,\n\tAttribClass.OBJECT,\n];\nexport const AttribClassMenuEntries = ATTRIBUTE_CLASSES.map((name, value) => ({name, value}));\nexport const AttribClassMenuEntriesWithoutCoreGroup = ATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP.map((name, value) => ({\n\tname,\n\tvalue,\n}));\n\nexport enum AttribType {\n\tNUMERIC = 'numeric',\n\tSTRING = 'string',\n}\nexport const ATTRIBUTE_TYPES: Array<AttribType> = [AttribType.NUMERIC, AttribType.STRING];\nexport const AttribTypeMenuEntries = ATTRIBUTE_TYPES.map((name, value) => ({name, value}));\n\nexport enum AttribSize {\n\tFLOAT = 1,\n\tVECTOR2 = 2,\n\tVECTOR3 = 3,\n\tVECTOR4 = 4,\n}\nexport const ATTRIBUTE_SIZES: Array<AttribSize> = [\n\tAttribSize.FLOAT,\n\tAttribSize.VECTOR2,\n\tAttribSize.VECTOR3,\n\tAttribSize.VECTOR4,\n];\nexport const ATTRIBUTE_SIZE_RANGE: Number2 = [AttribSize.FLOAT, AttribSize.VECTOR4];\n\n// export const CoreConstant = {\n// \tATTRIB_CLASS: {\n// \t\tVERTEX: AttribClass.POINT,\n// \t\tOBJECT: AttribClass.OBJECT,\n// \t},\n\n// \tOBJECT_TYPES: ObjectTypes,\n// \tCONSTRUCTOR_NAMES_BY_CONSTRUCTOR_NAME: {\n// \t\t[Scene.name]: 'Scene',\n// \t\t[Group.name]: 'Group',\n// \t\t[Object3D.name]: 'Object3D',\n// \t\t[Mesh.name]: 'Mesh',\n// \t\t[Points.name]: 'Points',\n// \t\t[LineSegments.name]: 'LineSegments',\n// \t\t[Bone.name]: 'Bone',\n// \t\t[SkinnedMesh.name]: 'SkinnedMesh',\n// \t},\n// \tCONSTRUCTORS_BY_NAME: {\n// \t\t[ObjectType.MESH]: Mesh,\n// \t\t[ObjectType.POINTS]: Points,\n// \t\t[ObjectType.LINE_SEGMENTS]: LineSegments,\n// \t},\n\n// \tMATERIALS: materials,\n// };\n\nexport enum ComponentName {\n\tx = 'x',\n\ty = 'y',\n\tz = 'z',\n\tw = 'w',\n\tr = 'r',\n\tg = 'g',\n\tb = 'b',\n}\nexport type ComponentIndex = 0 | 1 | 2 | 3;\nexport const COMPONENT_INDICES: Record<ComponentName, ComponentIndex> = {\n\tx: 0,\n\ty: 1,\n\tz: 2,\n\tw: 3,\n\tr: 0,\n\tg: 1,\n\tb: 2,\n};\nexport const DOT = '.';\n\nexport type GroupString = string;\n","import {AttribValue, Constructor, NumericAttribValue} from '../../types/GlobalTypes';\nimport {Vector2, Vector3, Vector4} from 'three';\nimport {CoreObjectType, ObjectBuilder, ObjectContent} from './ObjectContent';\nimport {AttribClass} from './Constant';\nimport type {CoreGroup} from './Group';\nimport {TraversedRelatedEntityData} from './entities/utils/TraversedRelatedEntities';\nimport {TypeAssert} from '../../engine/poly/Assert';\n\nconst _relatedPointIds: number[] = [];\nconst _relatedVertexIds: number[] = [];\nconst _relatedPrimitiveIds: number[] = [];\n\nexport abstract class CoreEntity {\n\tprotected _index: number = 0;\n\tconstructor(content?: any, index?: number) {\n\t\tif (index != null) {\n\t\t\tthis._index = index;\n\t\t}\n\t}\n\n\tindex() {\n\t\treturn this._index;\n\t}\n\tsetIndex(index: number) {\n\t\tthis._index = index;\n\t\treturn this;\n\t}\n\n\tabstract geometry(): any;\n\tabstract builder<T extends CoreObjectType>(): ObjectBuilder<T> | undefined;\n\tabstract setAttribValue(attribName: string, attribValue: NumericAttribValue | string): void;\n\tabstract attribValue(attribName: string, target?: Vector2 | Vector3 | Vector4): AttribValue | undefined;\n\tabstract stringAttribValue(attribName: string): string | null;\n\tabstract position(target: Vector3): Vector3;\n\tabstract relatedEntities(\n\t\tattribClass: AttribClass,\n\t\tcoreGroup: CoreGroup,\n\t\ttarget: CoreEntity[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void;\n}\n\nexport abstract class CoreEntityWithObject<T extends CoreObjectType> extends CoreEntity {\n\tprotected _object: ObjectContent<T>;\n\tconstructor(object: ObjectContent<T>, index?: number) {\n\t\tsuper(object, index);\n\t\tthis._object = object;\n\t}\n\tobject() {\n\t\treturn this._object;\n\t}\n\n\tstatic relatedPrimitiveIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\ttarget.length = 0;\n\t}\n\tstatic relatedVertexIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\ttarget.length = 0;\n\t}\n\tstatic relatedPointIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\ttarget.length = 0;\n\t}\n\n\trelatedPrimitiveIds(target: number[], traversedRelatedEntityData?: TraversedRelatedEntityData): void {\n\t\t(this.constructor as typeof CoreEntityWithObject).relatedPrimitiveIds(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n\trelatedVertexIds(target: number[], traversedRelatedEntityData?: TraversedRelatedEntityData): void {\n\t\t(this.constructor as typeof CoreEntityWithObject).relatedVertexIds(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n\trelatedPointIds(target: number[], traversedRelatedEntityData?: TraversedRelatedEntityData): void {\n\t\t(this.constructor as typeof CoreEntityWithObject).relatedPointIds(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n\tstatic relatedPointClass<T extends CoreObjectType>(object: ObjectContent<T>): typeof CoreEntityWithObject<T> {\n\t\treturn this.constructor as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic relatedVertexClass<T extends CoreObjectType>(object: ObjectContent<T>): typeof CoreEntityWithObject<T> {\n\t\treturn this.constructor as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic relatedPrimitiveClass<T extends CoreObjectType>(object: ObjectContent<T>): typeof CoreEntityWithObject<T> {\n\t\treturn this.constructor as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic relatedObjectClass<T extends CoreObjectType>(object: ObjectContent<T>): typeof CoreEntityWithObject<T> {\n\t\treturn this.constructor as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic relatedEntityClass<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tentityClass: AttribClass.POINT | AttribClass.VERTEX | AttribClass.PRIMITIVE | AttribClass.OBJECT\n\t): typeof CoreEntityWithObject<T> {\n\t\tswitch (entityClass) {\n\t\t\tcase AttribClass.POINT: {\n\t\t\t\treturn this.relatedPointClass(object);\n\t\t\t}\n\t\t\tcase AttribClass.VERTEX: {\n\t\t\t\treturn this.relatedVertexClass(object);\n\t\t\t}\n\t\t\tcase AttribClass.PRIMITIVE: {\n\t\t\t\treturn this.relatedPrimitiveClass(object);\n\t\t\t}\n\t\t\tcase AttribClass.OBJECT: {\n\t\t\t\treturn this.relatedObjectClass(object);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(entityClass);\n\t}\n\t//\n\tstatic relatedPoints<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tentityIndex: number,\n\t\ttarget: CoreEntityWithObject<T>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tthis.relatedPointIds(object, entityIndex, _relatedPointIds, traversedRelatedEntityData);\n\t\ttarget.length = _relatedPointIds.length;\n\t\tlet i = 0;\n\t\tconst entityClass = this.relatedPointClass(object) as any as Constructor<CoreEntityWithObject<T>>;\n\t\tfor (const id of _relatedPointIds) {\n\t\t\ttarget[i] = new entityClass(object, id);\n\t\t\ti++;\n\t\t}\n\t}\n\tstatic relatedVertices<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tentityIndex: number,\n\t\ttarget: CoreEntityWithObject<T>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tthis.relatedVertexIds(object, entityIndex, _relatedVertexIds, traversedRelatedEntityData);\n\t\ttarget.length = _relatedVertexIds.length;\n\t\tlet i = 0;\n\t\tconst entityClass = this.relatedVertexClass(object) as any as Constructor<CoreEntityWithObject<T>>;\n\t\tfor (const id of _relatedVertexIds) {\n\t\t\ttarget[i] = new entityClass(object, id);\n\t\t\ti++;\n\t\t}\n\t}\n\tstatic relatedPrimitives<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tentityIndex: number,\n\t\ttarget: CoreEntityWithObject<T>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tthis.relatedPrimitiveIds(object, entityIndex, _relatedPrimitiveIds, traversedRelatedEntityData);\n\t\ttarget.length = _relatedPrimitiveIds.length;\n\t\tlet i = 0;\n\t\tconst entityClass = this.relatedPrimitiveClass(object) as any as Constructor<CoreEntityWithObject<T>>;\n\t\tfor (const id of _relatedPrimitiveIds) {\n\t\t\ttarget[i] = new entityClass(object, id);\n\t\t\ti++;\n\t\t}\n\t}\n\tstatic relatedObjects<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tentityIndex: number,\n\t\ttarget: CoreEntityWithObject<T>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\ttarget.length = 1;\n\t\tconst entityClass = this.relatedObjectClass(object) as any as Constructor<CoreEntityWithObject<T>>;\n\t\ttarget[0] = new entityClass(object);\n\t}\n\trelatedPoints(target: CoreEntityWithObject<T>[], traversedRelatedEntityData?: TraversedRelatedEntityData): void {\n\t\t(this.constructor as typeof CoreEntityWithObject<T>).relatedPoints(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n\trelatedVertices(target: CoreEntityWithObject<T>[], traversedRelatedEntityData?: TraversedRelatedEntityData): void {\n\t\t(this.constructor as typeof CoreEntityWithObject<T>).relatedVertices(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n\trelatedPrimitives(\n\t\ttarget: CoreEntityWithObject<T>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\t(this.constructor as typeof CoreEntityWithObject<T>).relatedPrimitives(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n\trelatedObjects(target: CoreEntityWithObject<T>[], traversedRelatedEntityData?: TraversedRelatedEntityData): void {\n\t\t(this.constructor as typeof CoreEntityWithObject<T>).relatedObjects(\n\t\t\tthis._object,\n\t\t\tthis._index,\n\t\t\ttarget,\n\t\t\ttraversedRelatedEntityData\n\t\t);\n\t}\n}\n","import type {CoreObjectType, ObjectContent} from './ObjectContent';\nimport {\n\tobject3DFactory,\n\tpointClassFactoryEnsured,\n\tpointInstanceFactoryEnsured,\n\tvertexClassFactoryEnsured,\n\tvertexInstanceFactoryEnsured,\n\tprimitiveClassFactoryEnsured,\n\tprimitiveInstanceFactoryEnsured,\n\tobjectClassFactoryEnsured,\n\tobjectInstanceFactoryEnsured,\n} from './modules/three/ThreeModule';\nimport type {CorePoint} from './entities/point/CorePoint';\nimport type {CoreVertex} from './entities/vertex/CoreVertex';\nimport type {BaseCoreObject} from './entities/object/BaseCoreObject';\nimport type {CorePrimitive} from './entities/primitive/CorePrimitive';\nimport {AttribClass} from './Constant';\n\n// point return types\ntype BaseCorePointInstance = CorePoint<CoreObjectType>;\ntype BaseCorePointClassClass = typeof CorePoint<CoreObjectType>;\n// vertex return types\ntype BaseCoreVertexInstance = CoreVertex<CoreObjectType>;\ntype BaseCoreVertexClassClass = typeof CoreVertex<CoreObjectType>;\n// primitive return types\ntype BaseCorePrimitiveInstance = CorePrimitive<CoreObjectType>;\ntype BaseCorePrimitiveClassClass = typeof CorePrimitive<CoreObjectType>;\n// object return types\ntype BaseCoreObjectInstance = BaseCoreObject<CoreObjectType>;\ntype BaseCoreObjectClassClass = typeof BaseCoreObject<CoreObjectType>;\n\n// point methods\nexport type CorePointClassFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>\n) => BaseCorePointClassClass | undefined;\nexport type CorePointInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex: number\n) => BaseCorePointInstance | undefined;\n// vertex methods\nexport type CoreVertexClassFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>\n) => BaseCoreVertexClassClass | undefined;\nexport type CoreVertexInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex: number\n) => BaseCoreVertexInstance | undefined;\n// primitive methods\nexport type CorePrimitiveClassFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>\n) => BaseCorePrimitiveClassClass | undefined;\nexport type CorePrimitiveInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex: number\n) => BaseCorePrimitiveInstance | undefined;\n// object methods\nexport type CoreObjectClassFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>\n) => BaseCoreObjectClassClass | undefined;\nexport type CoreObjectInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex: number\n) => BaseCoreObjectInstance | undefined;\n\nexport interface CoreFactoryFunctions {\n\t// point\n\tpointClass: CorePointClassFactoryCheckFunction;\n\tpointInstance: CorePointInstanceFactoryCheckFunction;\n\t// vertex\n\tvertexClass: CoreVertexClassFactoryCheckFunction;\n\tvertexInstance: CoreVertexInstanceFactoryCheckFunction;\n\t// primitive\n\tprimitiveClass: CorePrimitiveClassFactoryCheckFunction;\n\tprimitiveInstance: CorePrimitiveInstanceFactoryCheckFunction;\n\t// object\n\tobjectClass: CoreObjectClassFactoryCheckFunction;\n\tobjectInstance: CoreObjectInstanceFactoryCheckFunction;\n}\n\nconst coreFactoryFunctions: CoreFactoryFunctions[] = [object3DFactory];\n\nexport function registerFactoryFunctions(checkFunctions: CoreFactoryFunctions) {\n\tcoreFactoryFunctions.push(checkFunctions);\n}\n\n// point creation methods\nexport function corePointClassFactory(object: ObjectContent<CoreObjectType>): BaseCorePointClassClass {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.pointClass(object);\n\t\tif (result) {\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn (object3DFactory.pointClass(object) || pointClassFactoryEnsured()) as BaseCorePointClassClass;\n}\n\nexport function corePointInstanceFactory<T extends CoreObjectType>(object: ObjectContent<T>, index = 0): CorePoint<T> {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.pointInstance(object, index);\n\t\tif (result) {\n\t\t\treturn result as CorePoint<T>;\n\t\t}\n\t}\n\treturn (object3DFactory.pointInstance(object, index) || pointInstanceFactoryEnsured(object, index)) as CorePoint<T>;\n}\n// vertex creation methods\nexport function coreVertexClassFactory(object: ObjectContent<CoreObjectType>): BaseCoreVertexClassClass {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.vertexClass(object);\n\t\tif (result) {\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn (object3DFactory.vertexClass(object) || vertexClassFactoryEnsured()) as BaseCoreVertexClassClass;\n}\n\nexport function coreVertexInstanceFactory<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tindex = 0\n): CoreVertex<T> {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.vertexInstance(object, index);\n\t\tif (result) {\n\t\t\treturn result as CoreVertex<T>;\n\t\t}\n\t}\n\treturn (object3DFactory.vertexInstance(object, index) ||\n\t\tvertexInstanceFactoryEnsured(object, index)) as CoreVertex<T>;\n}\n// primitive creation methods\nexport function corePrimitiveClassFactory(object: ObjectContent<CoreObjectType>): BaseCorePrimitiveClassClass {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.primitiveClass(object);\n\t\tif (result) {\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn (object3DFactory.primitiveClass(object) || primitiveClassFactoryEnsured()) as BaseCorePrimitiveClassClass;\n}\n\nexport function corePrimitiveInstanceFactory<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tindex = 0\n): CorePrimitive<T> {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.primitiveInstance(object, index);\n\t\tif (result) {\n\t\t\treturn result as CorePrimitive<T>;\n\t\t}\n\t}\n\treturn (object3DFactory.primitiveInstance(object, index) ||\n\t\tprimitiveInstanceFactoryEnsured(object, index)) as CorePrimitive<T>;\n}\n\n// object creation methods\nexport function coreObjectClassFactory(object: ObjectContent<CoreObjectType>): BaseCoreObjectClassClass {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.objectClass(object);\n\t\tif (result) {\n\t\t\treturn result;\n\t\t}\n\t}\n\t// we need objectClassFactoryEnsured()\n\t// in case we import multiple threejs,\n\t// and this ensures that this function never returns undefined\n\treturn object3DFactory.objectClass(object) || (objectClassFactoryEnsured() as BaseCoreObjectClassClass);\n}\n\nexport function coreObjectInstanceFactory<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tindex = 0\n): BaseCoreObject<T> {\n\tfor (const factoryFunction of coreFactoryFunctions) {\n\t\tconst result = factoryFunction.objectInstance(object, index);\n\t\tif (result) {\n\t\t\treturn result as BaseCoreObject<T>;\n\t\t}\n\t}\n\treturn (object3DFactory.objectInstance(object, index) ||\n\t\tobjectInstanceFactoryEnsured(object)) as any as BaseCoreObject<T>;\n}\n\nexport const ENTITY_CLASS_FACTORY = {\n\t[AttribClass.POINT]: corePointClassFactory,\n\t[AttribClass.VERTEX]: coreVertexClassFactory,\n\t[AttribClass.PRIMITIVE]: corePrimitiveClassFactory,\n\t[AttribClass.OBJECT]: coreObjectClassFactory,\n\t[AttribClass.CORE_GROUP]: null,\n};\nexport const ENTITY_INSTANCE_FACTORY = {\n\t[AttribClass.POINT]: corePointInstanceFactory,\n\t[AttribClass.VERTEX]: coreVertexInstanceFactory,\n\t[AttribClass.PRIMITIVE]: corePrimitiveInstanceFactory,\n\t[AttribClass.OBJECT]: coreObjectInstanceFactory,\n\t[AttribClass.CORE_GROUP]: null,\n};\n","import {stringMatchMask} from '../String';\nimport {ObjectContent, CoreObjectType} from './ObjectContent';\n\nexport const ROOT_NAME = '/';\n\nexport type CorePathObjCallback<T extends CoreObjectType> = (obj: ObjectContent<T>) => void;\nconst REGEX_PATH_SANITIZE = /\\/+/g;\n\nexport function findObjectByMask<T extends CoreObjectType>(\n\tmask: string,\n\tparent: ObjectContent<T>\n): ObjectContent<T> | undefined {\n\treturn findObjectByMaskInObject(mask, parent);\n}\nexport function findObjectByMaskInObject<T extends CoreObjectType>(\n\tmask: string,\n\tobject: ObjectContent<T>,\n\tobjectPath: string = ''\n): ObjectContent<T> | undefined {\n\tfor (const child of object.children) {\n\t\tconst childName = sanitizeObjectPath(child.name);\n\t\tconst path = sanitizeObjectPath(`${objectPath}/${childName}`);\n\t\tif (stringMatchMask(path, mask)) {\n\t\t\treturn child;\n\t\t}\n\t\tconst grandChild = findObjectByMaskInObject<T>(mask, child, path);\n\t\tif (grandChild) {\n\t\t\treturn grandChild;\n\t\t}\n\t}\n}\nexport function objectsByMask<T extends CoreObjectType>(\n\tmask: string,\n\tparent: ObjectContent<T>,\n\tinvertMask: boolean = false\n): ObjectContent<T>[] {\n\tconst list: ObjectContent<T>[] = [];\n\ttraverseObjectsWithMask(\n\t\tmask,\n\t\t(obj) => {\n\t\t\tlist.push(obj);\n\t\t},\n\t\tparent,\n\t\tinvertMask\n\t);\n\treturn list;\n}\nexport function objectsByMaskInObject<T extends CoreObjectType>(\n\tmask: string,\n\tobject: ObjectContent<T>,\n\tlist: ObjectContent<T>[] = [],\n\tobjectPath: string = ''\n) {\n\ttraverseObjectsWithMask(\n\t\tmask,\n\t\t(obj) => {\n\t\t\tlist.push(obj);\n\t\t},\n\t\tobject\n\t);\n\treturn list;\n}\nexport function traverseObjectsWithMask<T extends CoreObjectType>(\n\tmask: string,\n\tcallback: CorePathObjCallback<T>,\n\tobject: ObjectContent<T>,\n\tinvertMask: boolean = false\n) {\n\ttraverseObjectsWithMaskInObject(mask, object, callback, invertMask);\n}\nexport function traverseObjectsWithMaskInObject<T extends CoreObjectType>(\n\tmask: string,\n\tobject: ObjectContent<T>,\n\tcallback: CorePathObjCallback<T>,\n\tinvertMask: boolean,\n\tobjectPath?: string\n) {\n\tconst objectName = sanitizeObjectPath(object.name);\n\tconst path = sanitizeObjectPath(objectPath != null ? `${objectPath}/${objectName}` : objectName);\n\tlet match = stringMatchMask(path, mask);\n\tif (invertMask) {\n\t\tmatch = !match;\n\t}\n\tif (match) {\n\t\tcallback(object);\n\t}\n\n\tfor (const child of object.children) {\n\t\ttraverseObjectsWithMaskInObject(mask, child, callback, invertMask, path);\n\t}\n}\nexport function sanitizeObjectPath(path: string) {\n\treturn path.replace(REGEX_PATH_SANITIZE, '/');\n}\nexport function objectPath<T extends CoreObjectType>(object: ObjectContent<T>, topParent?: ObjectContent<T>): string {\n\tconst parent = object.parent;\n\tif (parent && object != topParent) {\n\t\tconst parentPath = objectPath(parent, topParent);\n\t\treturn sanitizeObjectPath(`${parentPath}/${object.name}`);\n\t} else {\n\t\treturn object.name;\n\t}\n}\n\nexport class CorePath {\n\tstatic findObjectByMask = findObjectByMask;\n\tstatic findObjectByMaskInObject = findObjectByMaskInObject;\n\tstatic objectsByMask = objectsByMask;\n\tstatic objectsByMaskInObject = objectsByMaskInObject;\n\tstatic traverseObjectsWithMask = traverseObjectsWithMask;\n\tstatic traverseObjectsWithMaskInObject = traverseObjectsWithMaskInObject;\n\tstatic objectPath = objectPath;\n\tstatic sanitizePath = sanitizeObjectPath;\n}\n","import {\n\tCoreEntitySelectionState,\n\tselectedIndicesFromSelectionStates,\n} from '../../engine/nodes/sop/utils/group/GroupCommon';\nimport {TypeAssert} from '../../engine/poly/Assert';\nimport {arrayToSet} from '../ArrayUtils';\nimport {setToArray, setDifference, setIntersection, setUnion} from '../SetUtils';\nimport {CoreObjectType, ObjectContent} from './ObjectContent';\n\nconst _currentIndicesSet: Set<number> = new Set();\nconst _newIndicesSet: Set<number> = new Set();\n\nexport enum GroupOperation {\n\tSET = 'replace existing',\n\tUNION = 'add to existing',\n\tSUBTRACT = 'subtract from existing',\n\tINTERSECT = 'intersect with existing',\n}\nexport const GROUP_OPERATIONS: GroupOperation[] = [\n\tGroupOperation.SET,\n\tGroupOperation.UNION,\n\tGroupOperation.SUBTRACT,\n\tGroupOperation.INTERSECT,\n];\n\nexport interface GroupData {\n\tname: string;\n\tentitiesCount: number;\n}\ntype GroupsDataForType = GroupData[];\nexport type GroupCollectionData = Record<string, GroupsDataForType>;\n\nexport enum EntityGroupType {\n\tPOINT = 'point',\n\tOBJECT = 'object',\n\tEDGE = 'edge',\n\tFACE = 'face',\n}\nexport interface UpdateGroupOptions {\n\ttype: EntityGroupType;\n\tgroupName: string;\n\toperation: GroupOperation;\n\tinvert: boolean;\n}\n\nconst USER_DATA_KEY_GROUPS = 'groups';\nexport type GroupsDictionary = Record<string, Record<string, number[]>>;\n\nexport class EntityGroupCollection {\n\t// private _groupsByNameByType: Map<GroupType, Map<string, EntityGroup>> = new Map();\n\n\tconstructor(private _object: ObjectContent<CoreObjectType>) {}\n\n\tattributesDictionary() {\n\t\treturn EntityGroupCollection.attributesDictionary(this._object);\n\t}\n\tstatic attributesDictionary<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn (\n\t\t\t(object.userData[USER_DATA_KEY_GROUPS] as GroupsDictionary) ||\n\t\t\tthis._createAttributesDictionaryIfNone(object)\n\t\t);\n\t}\n\tprivate static _createAttributesDictionaryIfNone<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tif (!object.userData[USER_DATA_KEY_GROUPS]) {\n\t\t\treturn (object.userData[USER_DATA_KEY_GROUPS] = {});\n\t\t}\n\t}\n\n\tfindOrCreateGroup(type: EntityGroupType, groupName: string) {\n\t\tconst dict = this.attributesDictionary();\n\t\tlet groupsByName = dict[type];\n\t\tif (!groupsByName) {\n\t\t\tgroupsByName = {};\n\t\t\tdict[type] = groupsByName;\n\t\t}\n\t\tlet group = groupsByName[groupName];\n\t\tif (!group) {\n\t\t\tgroup = [];\n\t\t\tgroupsByName[groupName] = group;\n\t\t}\n\t\treturn group;\n\t}\n\tdeleteGroup(type: EntityGroupType, groupName: string) {\n\t\tconst dict = this.attributesDictionary();\n\t\tconst groupsByName = dict[type];\n\t\tif (groupsByName) {\n\t\t\tdelete groupsByName[groupName];\n\t\t\t// clean if possible\n\t\t\tif (Object.keys(groupsByName).length == 0) {\n\t\t\t\tdelete dict[type];\n\t\t\t}\n\t\t}\n\t}\n\tstatic data<T extends CoreObjectType>(object: ObjectContent<T>): GroupCollectionData {\n\t\tconst dict = this.attributesDictionary(object);\n\t\tconst types = Object.keys(dict);\n\t\tconst data: GroupCollectionData = {};\n\t\tfor (const type of types) {\n\t\t\tconst dataForType: GroupsDataForType = [];\n\t\t\tdata[type] = dataForType;\n\t\t\tconst groupsForType = dict[type];\n\t\t\tconst groupNames = Object.keys(groupsForType);\n\t\t\tfor (const groupName of groupNames) {\n\t\t\t\tconst indices = groupsForType[groupName];\n\t\t\t\tconst groupData: GroupData = {\n\t\t\t\t\tname: groupName,\n\t\t\t\t\tentitiesCount: indices.length,\n\t\t\t\t};\n\t\t\t\tdataForType.push(groupData);\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t}\n\tindicesSet(type: EntityGroupType, groupName: string, target: Set<number>) {\n\t\tconst dict = this.attributesDictionary();\n\t\tconst groupsByName = dict[type];\n\t\ttarget.clear();\n\t\tif (groupsByName) {\n\t\t\tconst indices = groupsByName[groupName];\n\t\t\tif (indices) {\n\t\t\t\tarrayToSet(indices, target);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate selectedIndices: Set<number> = new Set();\n\tupdateGroup(options: UpdateGroupOptions, selectionStates: CoreEntitySelectionState) {\n\t\tconst {type, groupName, operation, invert} = options;\n\t\tconst currentIndices = this.findOrCreateGroup(type, groupName);\n\t\tconst _updateGroup = (newIndicesSet: Set<number>) => {\n\t\t\tconst dict = this.attributesDictionary();\n\t\t\tlet groupsByName = dict[type];\n\t\t\tif (!groupsByName) {\n\t\t\t\tgroupsByName = {};\n\t\t\t\tdict[type] = groupsByName;\n\t\t\t}\n\t\t\tconst newIndices: number[] = [];\n\t\t\tgroupsByName[groupName] = setToArray(newIndicesSet, newIndices);\n\t\t};\n\t\tthis.selectedIndices.clear();\n\t\tselectedIndicesFromSelectionStates(selectionStates, this.selectedIndices, invert);\n\t\tswitch (operation) {\n\t\t\tcase GroupOperation.SET: {\n\t\t\t\t_updateGroup(this.selectedIndices);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase GroupOperation.UNION: {\n\t\t\t\tarrayToSet(currentIndices, _currentIndicesSet);\n\t\t\t\tsetUnion(_currentIndicesSet, this.selectedIndices, _newIndicesSet);\n\t\t\t\t_updateGroup(_newIndicesSet);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase GroupOperation.SUBTRACT: {\n\t\t\t\tarrayToSet(currentIndices, _currentIndicesSet);\n\t\t\t\tsetDifference(_currentIndicesSet, this.selectedIndices, _newIndicesSet);\n\t\t\t\t_updateGroup(_newIndicesSet);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase GroupOperation.INTERSECT: {\n\t\t\t\tarrayToSet(currentIndices, _currentIndicesSet);\n\t\t\t\tsetIntersection(_currentIndicesSet, this.selectedIndices, _newIndicesSet);\n\t\t\t\t_updateGroup(_newIndicesSet);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(operation);\n\t}\n}\n","export enum ObjectEvent {\n\tBEFORE_DELETE = 'beforeDelete',\n}\n\nexport const ON_OBJECT_BEFORE_DELETE = {type: ObjectEvent.BEFORE_DELETE};\n","import {BufferAttribute, BufferGeometry, Object3D, Mesh} from 'three';\nimport {Object3DWithGeometry} from './Group';\nimport {ObjectContent, CoreObjectType, isObject3D} from './ObjectContent';\nimport type {QuadObject} from './modules/quad/QuadObject';\nimport {isQuadObject} from './modules/quad/QuadCoreType';\nimport {InstanceAttrib} from './Instancer';\n\nexport function bufferGeometryMaxGroupEnd(geometry: BufferGeometry): number {\n\tconst groups = geometry.groups;\n\tlet max = -1;\n\tfor (const group of groups) {\n\t\tconst groupEnd = group.start + group.count;\n\t\tif (groupEnd > max) {\n\t\t\tmax = groupEnd;\n\t\t}\n\t}\n\treturn max;\n}\nexport function truncateBufferGeometry(geometry: BufferGeometry, maxCount: number): void {\n\tconst attributeNames = Object.keys(geometry.attributes);\n\n\tfor (const attributeName of attributeNames) {\n\t\tconst attribute = geometry.getAttribute(attributeName) as BufferAttribute;\n\t\tconst originalArray = attribute.array;\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst expectedArraySize = maxCount * itemSize;\n\t\tconst newArray = originalArray.slice(0, expectedArraySize); //new Array(expectedArraySize);\n\t\t// for(let i=0;i<expectedArraySize;i++){\n\t\t// \tnewArray[i]=originalArray[i];\n\t\t// }\n\t\tgeometry.setAttribute(attributeName, new BufferAttribute(new Float32Array(newArray), itemSize));\n\t}\n}\n\nexport function object3DHasGeometry(o: Object3D): o is Object3DWithGeometry {\n\treturn (o as Mesh).geometry != null;\n}\nexport function objectContentHasGeometry(o: ObjectContent<CoreObjectType>): o is Object3DWithGeometry | QuadObject {\n\tif (isQuadObject(o)) {\n\t\treturn true;\n\t}\n\tif (isObject3D(o)) {\n\t\treturn (o as Mesh).geometry != null;\n\t}\n\treturn false;\n}\n\nexport function markedAsInstance(geometry: BufferGeometry): boolean {\n\treturn geometry.getAttribute(InstanceAttrib.POSITION) != null; //geometry.userData[IS_INSTANCE_KEY] === true;\n}\n","export enum GlConstant {\n\tTIME = 'time',\n\tDELTA_TIME = 'delta_time',\n}\n","import {CoreObjectType, ObjectContent, isObject3D} from '../../ObjectContent';\nimport {QUADObjectType, QUAD_OBJECT_TYPES_SET} from './QuadCommon';\nimport {QuadObject} from './QuadObject';\nimport {Object3D} from 'three';\n\nexport function isQuadObject(o: ObjectContent<CoreObjectType>): o is QuadObject {\n\treturn QUAD_OBJECT_TYPES_SET.has(o.type as QUADObjectType);\n}\nexport function isQuadOrThreejsObject(o: ObjectContent<CoreObjectType>): o is Object3D | QuadObject {\n\treturn isQuadObject(o) || isObject3D(o);\n}\n","import {AttribValue, NumericAttribValue} from './../../types/GlobalTypes';\nimport {PolyDictionary} from '../../types/GlobalTypes';\nimport {Box3, BufferGeometry, LineSegments, Mesh, Points, Object3D, Vector2, Vector3, Vector4} from 'three';\nimport {CoreAttribute} from './Attribute';\nimport {CoreString} from '../String';\nimport {AttribSize, ObjectData, AttribType, GroupString, AttribClass} from './Constant';\nimport {isString} from '../Type';\nimport {arraySum, arrayCompact, arrayPushItems, arrayCopy} from '../ArrayUtils';\nimport {Poly} from '../../engine/Poly';\nimport {CoreObjectType, ObjectBuilder, ObjectContent, isObject3D} from './ObjectContent';\nimport {coreObjectClassFactory, coreObjectInstanceFactory} from './CoreObjectFactory';\nimport {BaseCoreObject} from './entities/object/BaseCoreObject';\nimport {\n\tcoreObjectAttributeTypesByName,\n\tcoreObjectsAttribNames,\n\tcoreObjectsAttribSizesByName,\n} from './entities/object/BaseCoreObjectUtils';\nimport {attribValueNonPrimitive, cloneAttribValue} from './entities/utils/Common';\nimport {object3DHasGeometry} from './GeometryUtils';\n\n// entities\nimport {CoreEntity} from './CoreEntity';\nimport {\n\tpointsCountFromObject,\n\tpointAttributeNames,\n\thasPointAttribute,\n\tpointAttributeType,\n\tpointAttributeSizes,\n\tpointAttributeSize,\n\tpointsFromObjects,\n} from './entities/point/CorePointUtils';\nimport type {CorePoint} from './entities/point/CorePoint';\n\n// CAD\nimport type {CadGeometryType, CadGeometryTypeShape} from './modules/cad/CadCommon';\nimport type {CadObject} from './modules/cad/CadObject';\nimport {CoreCadType, isCADObject} from './modules/cad/CadCoreType';\n//\n// CSG\nimport type {CsgGeometryType} from './modules/csg/CsgCommon';\nimport type {CsgObject} from './modules/csg/CsgObject';\nimport {isCSGObject} from './modules/csg/CsgCoreType';\n//\n// QUAD\nimport type {QuadObject} from './modules/quad/QuadObject';\nimport {isQuadObject, isQuadOrThreejsObject} from './modules/quad/QuadCoreType';\n//\n// SDF\n// import type {SDFObjectType} from './sdf/SDFCommon';\n// import {SDF_OBJECT_TYPES_SET} from './sdf/SDFCommon';\n// import type {SDFObject} from './sdf/SDFObject';\n//\n// TET\nimport {isTetObject} from './modules/tet/TetCoreType';\nimport {TetObject} from './modules/tet/TetObject';\nimport {TypeAssert} from '../../engine/poly/Assert';\n\n// THREEJS\nimport {ThreejsCoreObject} from './modules/three/ThreejsCoreObject';\nimport {uniqRelatedEntities} from './entities/utils/Common';\nimport {CoreVertex} from './entities/vertex/CoreVertex';\nimport {CorePrimitive} from './entities/primitive/CorePrimitive';\nimport {TraversedRelatedEntityData} from './entities/utils/TraversedRelatedEntities';\n\ntype AttributeDictionary = PolyDictionary<AttribValue>;\n\nconst tmpBox3 = new Box3();\nconst tmpPos = new Vector3();\nconst _indices: number[] = [];\nconst _points: CorePoint<CoreObjectType>[] = [];\nconst _relatedPoints: CorePoint<CoreObjectType>[] = [];\nconst _relatedVertices: CoreVertex<CoreObjectType>[] = [];\nconst _relatedPrimitives: CorePrimitive<CoreObjectType>[] = [];\nconst _relatedPrimitivesForObject: CorePrimitive<CoreObjectType>[] = [];\n\nexport interface Object3DWithGeometry extends Object3D {\n\tgeometry: BufferGeometry;\n}\n\nfunction objectTotalPointsCount(object: ObjectContent<CoreObjectType>) {\n\tlet sum = 0;\n\tobject.traverse((child) => {\n\t\t// const geometry = (child as Mesh).geometry as BufferGeometry;\n\t\t// if (geometry) {\n\t\tsum += pointsCountFromObject(child);\n\t\t// }\n\t});\n\treturn sum;\n}\n\nexport class CoreGroup extends CoreEntity {\n\tprivate _timestamp: number | undefined;\n\tprivate _allObjects: ObjectContent<CoreObjectType>[] = [];\n\n\tconstructor() {\n\t\tsuper(undefined, 0);\n\t\tthis.touch();\n\t}\n\tdispose() {\n\t\tif (this._allObjects) {\n\t\t\tfor (const object of this._allObjects) {\n\t\t\t\tif (object.dispose) {\n\t\t\t\t\tobject.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._allObjects.length = 0;\n\t}\n\tgeometry() {\n\t\treturn null;\n\t}\n\tbuilder<T extends CoreObjectType>(): ObjectBuilder<T> | undefined {\n\t\treturn undefined;\n\t}\n\n\t//\n\t//\n\t// TIMESTAMP\n\t//\n\t//\n\ttimestamp() {\n\t\treturn this._timestamp;\n\t}\n\ttouch() {\n\t\tconst performance = Poly.performance.performanceManager();\n\t\tthis._timestamp = performance.now();\n\t\t// this.reset();\n\t}\n\t// reset() {\n\t// \t// this.resetBoundingBox();\n\t// \t// this._bounding_sphere = undefined;\n\t// \t// this._coreGeometries = undefined;\n\t// \t// this._coreObjects = undefined;\n\t// }\n\tresetBoundingBox() {\n\t\t// this._boundingBox = undefined;\n\t}\n\n\t//\n\t//\n\t// CLONE\n\t//\n\t//\n\tclone() {\n\t\tconst coreGroup = new CoreGroup();\n\t\t// all\n\t\tif (this._allObjects) {\n\t\t\tconst allCoreObjects = this.allCoreObjects();\n\t\t\tconst clonedObjects: ObjectContent<CoreObjectType>[] = [];\n\t\t\tfor (const coreObject of allCoreObjects) {\n\t\t\t\tconst clonedObject = coreObject.clone().object();\n\t\t\t\tif (clonedObject) {\n\t\t\t\t\tclonedObjects.push(clonedObject);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// for (let object of this._allObjects) {\n\t\t\t// \tallObjects.push(object.clone());\n\t\t\t// }\n\n\t\t\tcoreGroup.setAllObjects(clonedObjects);\n\t\t}\n\n\t\tconst attribNames = this.attribNames();\n\t\tfor (const attribName of attribNames) {\n\t\t\tconst value = this.attribValue(attribName);\n\t\t\tcoreGroup.addAttribute(attribName, value);\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\t//\n\t//\n\t// ALL OBJECTS\n\t//\n\t//\n\tsetAllObjects(objects: ObjectContent<CoreObjectType>[]) {\n\t\tthis._allObjects = objects;\n\t\tthis.touch();\n\t}\n\tallObjects() {\n\t\treturn this._allObjects;\n\t}\n\tallCoreObjects() {\n\t\treturn this.allObjects()?.map((o, i) => coreObjectInstanceFactory(o, i));\n\t}\n\t//\n\t//\n\t// CAD OBJECTS\n\t//\n\t//\n\tcadObjects() {\n\t\tconst list = this._allObjects?.filter(isCADObject) || undefined;\n\t\treturn list as CadObject<CadGeometryType>[] | undefined;\n\t}\n\tcadObjectsWithShape() {\n\t\treturn this.cadObjects()?.filter((o) => CoreCadType.isShape(o)) as\n\t\t\t| CadObject<CadGeometryTypeShape>[]\n\t\t\t| undefined;\n\t}\n\tcadCoreObjects() {\n\t\treturn this.cadObjects()?.map((o, i) => coreObjectInstanceFactory(o, i));\n\t}\n\t//\n\t//\n\t// CSG OBJECTS\n\t//\n\t//\n\tcsgObjects() {\n\t\tconst list = this._allObjects?.filter(isCSGObject) || undefined;\n\t\treturn list as CsgObject<CsgGeometryType>[] | undefined;\n\t}\n\tcsgCoreObjects() {\n\t\treturn this.csgObjects()?.map((o, i) => coreObjectInstanceFactory(o, i));\n\t}\n\t//\n\t//\n\t// QUAD OBJECTS\n\t//\n\t//\n\tquadObjects() {\n\t\tconst list = this._allObjects?.filter(isQuadObject) || undefined;\n\t\treturn list as QuadObject[] | undefined;\n\t}\n\tquadCoreObjects() {\n\t\treturn this.quadObjects()?.map((o, i) => coreObjectInstanceFactory(o, i));\n\t}\n\tthreejsOrQuadObjects(): Array<Object3D | QuadObject> {\n\t\treturn (this._allObjects ? this._allObjects.filter(isQuadOrThreejsObject) : []) as Array<Object3D | QuadObject>;\n\t}\n\tthreejsOrQuadCoreObjects() {\n\t\treturn this.threejsOrQuadObjects().map((o, i) => coreObjectInstanceFactory(o, i));\n\t}\n\t//\n\t//\n\t// SDF OBJECTS\n\t//\n\t//\n\t// SDFObjects() {\n\t// \tconst list = this._allObjects?.filter((o) => SDF_OBJECT_TYPES_SET.has(o.type as SDFObjectType)) || undefined;\n\t// \treturn list as SDFObject[] | undefined;\n\t// }\n\t// SDFCoreObjects() {\n\t// \treturn this.csgObjects()?.map((o, i) => coreObjectInstanceFactory(o, i));\n\t// }\n\n\t//\n\t//\n\t// TET OBJECTS\n\t//\n\t//\n\ttetObjects() {\n\t\tconst list = this._allObjects?.filter(isTetObject) || undefined;\n\t\treturn list as TetObject[] | undefined;\n\t}\n\ttetCoreObjects() {\n\t\treturn this.tetObjects()?.map((o, i) => coreObjectInstanceFactory(o, i));\n\t}\n\n\t//\n\t//\n\t// THREEJS OBJECTS\n\t//\n\t//\n\tthreejsObjects(): Object3D[] {\n\t\treturn this._allObjects ? this._allObjects.filter(isObject3D) : [];\n\t}\n\tthreejsObjectsWithGeo(): Object3DWithGeometry[] {\n\t\treturn this.threejsObjects().filter(object3DHasGeometry);\n\t}\n\tthreejsCoreObjects() {\n\t\treturn this.threejsObjects().map((o, i) => new ThreejsCoreObject(o, i));\n\t}\n\tgeometries(): BufferGeometry[] {\n\t\treturn this.threejsObjectsWithGeo().map((o) => o.geometry);\n\t}\n\t// coreGeometries(): CoreGeometry[] {\n\t// \treturn this.geometries().map((g) => new CoreGeometry(g));\n\t// }\n\n\t//\n\t//\n\t// POINTS\n\t//\n\t//\n\tpoints(target: CorePoint<CoreObjectType>[]) {\n\t\treturn pointsFromObjects(this.allObjects(), target);\n\t\t// return this.allObjects()\n\t\t// \t.map((o) => pointsFromObject(o))\n\t\t// \t.flat();\n\t\t// .map((g) => g.points())\n\t\t// .flat();\n\t}\n\tpointsCount() {\n\t\treturn arraySum(this.allObjects().map((g) => pointsCountFromObject(g)));\n\t}\n\ttotalPointsCount() {\n\t\tconst threejsObjects = this.threejsObjects();\n\t\tlet sum = 0;\n\t\tfor (const object of threejsObjects) {\n\t\t\tsum += objectTotalPointsCount(object);\n\t\t}\n\t\treturn sum;\n\t}\n\tpointsFromGroup(group: GroupString, target: CorePoint<CoreObjectType>[]) {\n\t\tif (group) {\n\t\t\tCoreString.indices(group, _indices);\n\t\t\tthis.points(_points);\n\t\t\tconst compactPoints: CorePoint<CoreObjectType>[] = [];\n\t\t\tconst pointsInGroup = arrayCompact(\n\t\t\t\t_indices.map((i) => _points[i]),\n\t\t\t\tcompactPoints\n\t\t\t);\n\t\t\ttarget.length = 0;\n\t\t\tarrayPushItems(pointsInGroup, target);\n\t\t\treturn target;\n\t\t} else {\n\t\t\treturn this.points(target);\n\t\t}\n\t}\n\tpointAttribNames(): string[] {\n\t\tconst firstObject = this.allObjects()[0];\n\t\tif (firstObject) {\n\t\t\treturn pointAttributeNames(firstObject);\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\thasPointAttrib(attribName: string): boolean {\n\t\tconst firstObject = this.allObjects()[0];\n\t\tif (firstObject) {\n\t\t\treturn hasPointAttribute(firstObject, attribName);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\tpointAttribType(attribName: string): AttribType {\n\t\tconst firstObject = this.allObjects()[0];\n\t\tif (firstObject) {\n\t\t\treturn pointAttributeType(firstObject, attribName);\n\t\t} else {\n\t\t\treturn AttribType.NUMERIC;\n\t\t}\n\t}\n\tpointAttribNamesMatchingMask(masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.pointAttribNames());\n\t}\n\tpointAttribSizes(): Record<string, number> {\n\t\tconst firstObject = this.allObjects()[0];\n\t\tif (firstObject) {\n\t\t\treturn pointAttributeSizes(firstObject);\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\tpointAttribSize(attribName: string): number {\n\t\tconst firstObject = this.allObjects()[0];\n\t\tif (firstObject) {\n\t\t\treturn pointAttributeSize(firstObject, attribName);\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t//\n\t//\n\t// OBJECTS\n\t//\n\t//\n\tstatic _fromObjects(objects: Object3D[]): CoreGroup {\n\t\tconst coreGroup = new CoreGroup();\n\t\tcoreGroup.setAllObjects(objects);\n\t\treturn coreGroup;\n\t}\n\tobjectAttribTypesByName() {\n\t\treturn coreObjectAttributeTypesByName(this.allCoreObjects());\n\t}\n\tobjectAttribNames() {\n\t\treturn coreObjectsAttribNames(this.allCoreObjects());\n\t}\n\tobjectAttribNamesMatchingMask(masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.objectAttribNames());\n\t}\n\tobjectAttribSizesByName(): PolyDictionary<AttribSize[]> {\n\t\treturn coreObjectsAttribSizesByName(this.allCoreObjects());\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\trenameAttribute(oldName: string, newName: string) {\n\t\tconst attribValue = this.attribValue(oldName);\n\t\tif (attribValue == null) {\n\t\t\treturn;\n\t\t}\n\t\tthis.addAttribute(newName, attribValue);\n\t\tthis.deleteAttribute(oldName);\n\t}\n\n\tattribNamesMatchingMask(masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.attribNames());\n\t}\n\thasAttribute(attribName: string): boolean {\n\t\treturn this.attribValue(attribName) != null;\n\t}\n\n\tprivate _attributes: AttributeDictionary = {};\n\taddAttribute(attribName: string, attribValue: AttribValue) {\n\t\tthis.attributes()[attribName] = attribValue;\n\t}\n\taddNumericAttribute<T extends CoreObjectType>(\n\t\tattribName: string,\n\t\tsize: AttribSize = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst attributes = this.attributes();\n\t\tif (defaultValue != null) {\n\t\t\tif (attribValueNonPrimitive(defaultValue)) {\n\t\t\t\tconst clonedDefaultValue = cloneAttribValue(defaultValue);\n\t\t\t\tif (clonedDefaultValue != null) {\n\t\t\t\t\tattributes[attribName] = clonedDefaultValue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tattributes[attribName] = defaultValue;\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (size) {\n\t\t\t\tcase 1: {\n\t\t\t\t\treturn (this.attributes()[attribName] = 0);\n\t\t\t\t}\n\t\t\t\tcase 2: {\n\t\t\t\t\treturn (this.attributes()[attribName] = new Vector2(0, 0));\n\t\t\t\t}\n\t\t\t\tcase 3: {\n\t\t\t\t\treturn (this.attributes()[attribName] = new Vector3(0, 0, 0));\n\t\t\t\t}\n\t\t\t\tcase 4: {\n\t\t\t\t\treturn (this.attributes()[attribName] = new Vector4(0, 0, 0, 0));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tdeleteAttribute(name: string) {\n\t\tdelete this.attributes()[name];\n\t}\n\tattribValue(attribName: string) {\n\t\treturn this._attributes && this._attributes[attribName];\n\t}\n\tattribNames(): string[] {\n\t\treturn this._attributes ? Object.keys(this._attributes) : [];\n\t}\n\tattribType(name: string) {\n\t\tconst val = this.attribValue(name);\n\t\tif (isString(val)) {\n\t\t\treturn AttribType.STRING;\n\t\t} else {\n\t\t\treturn AttribType.NUMERIC;\n\t\t}\n\t}\n\tattribSizes() {\n\t\tconst h: PolyDictionary<AttribSize> = {};\n\t\tfor (const attrib_name of this.attribNames()) {\n\t\t\tconst size = this.attribSize(attrib_name);\n\t\t\tif (size != null) {\n\t\t\t\th[attrib_name] = size;\n\t\t\t}\n\t\t}\n\t\treturn h;\n\t}\n\tattribSize(name: string): AttribSize | null {\n\t\tconst val = this.attribValue(name);\n\t\tif (val == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn CoreAttribute.attribSizeFromValue(val);\n\t}\n\tattributes() {\n\t\treturn this._attributes || this._createAttributesDictionaryIfNone();\n\t}\n\tprivate _createAttributesDictionaryIfNone() {\n\t\tif (!this._attributes) {\n\t\t\tthis._attributes = {};\n\t\t}\n\t\treturn this._attributes;\n\t}\n\t// override\n\tsetAttribValue(attribName: string, attribValue: AttribValue | string) {\n\t\tthis.addAttribute(attribName, attribValue);\n\t}\n\n\tstringAttribValue(attribName: string) {\n\t\treturn this.attribValue(attribName) as string | null;\n\t}\n\tposition(target: Vector3): Vector3 {\n\t\tconst objectsCount = this._allObjects.length;\n\t\ttarget.set(0, 0, 0);\n\t\tfor (const object of this._allObjects) {\n\t\t\tcoreObjectClassFactory(object).position(object, tmpPos);\n\t\t\ttarget.add(tmpPos);\n\t\t}\n\t\ttarget.divideScalar(objectsCount);\n\t\treturn target;\n\t}\n\tattributeNames(): string[] {\n\t\tconst attributes = this.attributes();\n\t\tif (!attributes) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys(attributes);\n\t}\n\tattributeNamesMatchingMask(masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.attributeNames());\n\t}\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\n\trelatedObjects(\n\t\ttarget: BaseCoreObject<CoreObjectType>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tarrayCopy(this.allCoreObjects(), target);\n\t}\n\n\trelatedPrimitives(\n\t\ttarget: CorePrimitive<CoreObjectType>[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\ttarget.length = 0;\n\t\tconst objects = this.allObjects();\n\t\tlet i = 0;\n\t\tfor (const object of objects) {\n\t\t\tcoreObjectClassFactory(object).relatedPrimitives(object, i, _relatedPrimitivesForObject);\n\t\t\tfor (const _relatedPrimitiveForObject of _relatedPrimitivesForObject) {\n\t\t\t\ttarget.push(_relatedPrimitiveForObject);\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\t}\n\trelatedVertices(target: CoreVertex<CoreObjectType>[], traversedRelatedEntityData?: TraversedRelatedEntityData) {\n\t\tthis.relatedPrimitives(_relatedPrimitives);\n\t\tuniqRelatedEntities(\n\t\t\t_relatedPrimitives,\n\t\t\t(primitive) => {\n\t\t\t\tprimitive.relatedVertices(_relatedVertices);\n\t\t\t\treturn _relatedVertices;\n\t\t\t},\n\t\t\ttarget\n\t\t);\n\t}\n\trelatedPoints(target: CorePoint<CoreObjectType>[], traversedRelatedEntityData?: TraversedRelatedEntityData) {\n\t\tthis.relatedVertices(_relatedVertices);\n\t\treturn uniqRelatedEntities(\n\t\t\t_relatedVertices,\n\t\t\t(vertex) => {\n\t\t\t\tvertex.relatedPoints(_relatedPoints);\n\t\t\t\treturn _relatedPoints;\n\t\t\t},\n\t\t\ttarget\n\t\t);\n\t}\n\trelatedEntities(\n\t\tattribClass: AttribClass,\n\t\tcoreGroup: CoreGroup,\n\t\ttarget: CoreEntity[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT: {\n\t\t\t\tthis.relatedPoints(target as CorePoint<CoreObjectType>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.VERTEX: {\n\t\t\t\tthis.relatedVertices(target as CoreVertex<CoreObjectType>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.PRIMITIVE: {\n\t\t\t\tthis.relatedPrimitives(target as CorePrimitive<CoreObjectType>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.OBJECT: {\n\t\t\t\tthis.relatedObjects(target as BaseCoreObject<CoreObjectType>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.CORE_GROUP: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = coreGroup;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n\n\t//\n\t//\n\t// UTILS\n\t//\n\t//\n\tobjectsData(): ObjectData[] {\n\t\treturn this._allObjects?.map((o) => coreObjectClassFactory(o).objectData(o)) || [];\n\t}\n\tboundingBox(target: Box3) {\n\t\ttarget.makeEmpty();\n\t\tconst coreObjects = this.allCoreObjects();\n\t\tfor (const coreObject of coreObjects) {\n\t\t\tcoreObject.boundingBox(tmpBox3);\n\t\t\ttarget.union(tmpBox3);\n\t\t}\n\t}\n\tstatic geometryFromObject(object: Object3D): BufferGeometry | null {\n\t\tif ((object as Mesh).isMesh || (object as LineSegments).isLine || (object as Points).isPoints) {\n\t\t\treturn (object as Mesh).geometry as BufferGeometry;\n\t\t}\n\t\treturn null;\n\t}\n}\n","import {\n\tBufferGeometry,\n\tInstancedBufferAttribute,\n\tInstancedBufferGeometry,\n\tMatrix4,\n\tQuaternion,\n\tVector2,\n\tVector3,\n} from 'three';\nimport {BaseCorePoint, CorePoint} from './entities/point/CorePoint';\nimport {CoreGroup} from './Group';\n// import {CoreGeometry} from './Geometry';\nimport {isNumber} from '../Type';\nimport {Attribute} from './Attribute';\nimport {PolyDictionary} from '../../types/GlobalTypes';\nimport {CoreObjectType} from './ObjectContent';\n\nconst DEFAULT = {\n\tSCALE: new Vector3(1, 1, 1),\n\tPSCALE: 1,\n\tEYE: new Vector3(0, 0, 0),\n\tUP: new Vector3(0, 1, 0),\n};\n\nconst DEFAULT_COLOR = new Vector3(1, 1, 1);\nconst DEFAULT_UV = new Vector2(0, 0);\nconst _position = new Vector3();\nconst _instancePts: CorePoint<CoreObjectType>[] = [];\n\nexport enum InstanceAttrib {\n\tPOSITION = 'instancePosition',\n\tSCALE = 'instanceScale',\n\tQUATERNION = 'instanceQuaternion',\n\tCOLOR = 'instanceColor',\n\tUV = 'instanceUv',\n}\n\nconst ATTRIB_NAME_MAP: PolyDictionary<string> = {\n\tP: InstanceAttrib.POSITION,\n\tN: InstanceAttrib.QUATERNION,\n\tup: InstanceAttrib.QUATERNION,\n\tCd: InstanceAttrib.COLOR,\n\t[Attribute.COLOR]: InstanceAttrib.COLOR,\n\t[Attribute.NORMAL]: InstanceAttrib.QUATERNION,\n\t[Attribute.POSITION]: InstanceAttrib.POSITION,\n\t[Attribute.PSCALE]: InstanceAttrib.SCALE,\n\t[Attribute.SCALE]: InstanceAttrib.SCALE,\n};\nexport class CoreInstancer {\n\tprivate _is_pscale_present: boolean = false;\n\tprivate _is_scale_present: boolean = false;\n\tprivate _is_normal_present: boolean = false;\n\tprivate _is_up_present: boolean = false;\n\tprivate _do_rotate_matrices: boolean = false;\n\t// private _matrices: PolyDictionary<Matrix4> = {};\n\tprivate _matrixT = new Matrix4();\n\tprivate _matrixR = new Matrix4();\n\tprivate _matrixS = new Matrix4();\n\n\tstatic transformAttributeNames: string[] = [\n\t\tInstanceAttrib.POSITION,\n\t\tInstanceAttrib.QUATERNION,\n\t\tInstanceAttrib.SCALE,\n\t];\n\n\tstatic remapName(name: string): string {\n\t\treturn ATTRIB_NAME_MAP[name] || name;\n\t}\n\n\tconstructor(private _coreGroup?: CoreGroup) {\n\t\tif (_coreGroup) {\n\t\t\tthis.setCoreGroup(_coreGroup);\n\t\t}\n\t}\n\tsetCoreGroup(coreGroup: CoreGroup) {\n\t\tthis._coreGroup = coreGroup;\n\t\tthis._is_pscale_present = this._coreGroup.hasPointAttrib(Attribute.PSCALE);\n\t\tthis._is_scale_present = this._coreGroup.hasPointAttrib(Attribute.SCALE);\n\n\t\tthis._is_normal_present = this._coreGroup.hasPointAttrib(Attribute.NORMAL);\n\t\tthis._is_up_present = this._coreGroup.hasPointAttrib(Attribute.UP);\n\n\t\tthis._do_rotate_matrices = this._is_normal_present; //&& this._is_up_present;\n\t}\n\n\tprivate _pointScale = new Vector3();\n\tprivate _pointNormal = new Vector3();\n\tprivate _pointUp = new Vector3();\n\t// private _point_m = new Matrix4()\n\tmatrixFromPoint(point: BaseCorePoint, targetMatrix: Matrix4) {\n\t\ttargetMatrix.identity();\n\t\tpoint.position(_position);\n\t\t//r = new Vector3(0,0,0)\n\t\tif (this._is_scale_present) {\n\t\t\tpoint.attribValue(Attribute.SCALE, this._pointScale);\n\t\t} else {\n\t\t\tthis._pointScale.copy(DEFAULT.SCALE);\n\t\t}\n\t\tconst pscale: number = this._is_pscale_present\n\t\t\t? (point.attribValue(Attribute.PSCALE) as number)\n\t\t\t: DEFAULT.PSCALE;\n\t\tthis._pointScale.multiplyScalar(pscale);\n\n\t\t//matrix = #Core.Transform.matrix(t, r, s, scale)\n\t\t// matrix.identity();\n\n\t\tconst scale_matrix = this._matrixS;\n\t\tscale_matrix.makeScale(this._pointScale.x, this._pointScale.y, this._pointScale.z);\n\n\t\tconst translate_matrix = this._matrixT;\n\t\ttranslate_matrix.makeTranslation(_position.x, _position.y, _position.z);\n\n\t\ttargetMatrix.multiply(translate_matrix);\n\n\t\tif (this._do_rotate_matrices) {\n\t\t\tconst rotate_matrix = this._matrixR;\n\t\t\tconst eye = DEFAULT.EYE;\n\t\t\tpoint.attribValue(Attribute.NORMAL, this._pointNormal);\n\t\t\tthis._pointNormal.multiplyScalar(-1);\n\t\t\tif (this._is_up_present) {\n\t\t\t\tpoint.attribValue(Attribute.UP, this._pointUp);\n\t\t\t} else {\n\t\t\t\tthis._pointUp.copy(DEFAULT.UP);\n\t\t\t}\n\t\t\tthis._pointUp.normalize();\n\t\t\trotate_matrix.lookAt(eye, this._pointNormal, this._pointUp);\n\n\t\t\ttargetMatrix.multiply(rotate_matrix);\n\t\t}\n\n\t\ttargetMatrix.multiply(scale_matrix);\n\t}\n\n\tprivate static _point_color = new Vector3();\n\tprivate static _point_uv = new Vector2();\n\tprivate static _position = new Vector3(0, 0, 0);\n\tprivate static _quaternion = new Quaternion();\n\tprivate static _scale = new Vector3(1, 1, 1);\n\tprivate static _tmpMatrix = new Matrix4();\n\tstatic updateTransformInstanceAttributes(\n\t\tinstancePts: BaseCorePoint[],\n\t\ttemplateCoreGroup: CoreGroup,\n\t\tgeometry: InstancedBufferGeometry\n\t) {\n\t\tconst instancesCount = instancePts.length;\n\t\tconst positions = new Float32Array(instancesCount * 3);\n\t\tconst scales = new Float32Array(instancesCount * 3);\n\t\tconst quaternions = new Float32Array(instancesCount * 4);\n\t\tconst instancer = new CoreInstancer(templateCoreGroup);\n\t\tlet i = 0;\n\t\tfor (const instancePt of instancePts) {\n\t\t\tinstancer.matrixFromPoint(instancePt, this._tmpMatrix);\n\t\t\tconst index3 = i * 3;\n\t\t\tconst index4 = i * 4;\n\n\t\t\tthis._tmpMatrix.decompose(this._position, this._quaternion, this._scale);\n\n\t\t\tthis._position.toArray(positions, index3);\n\t\t\tthis._quaternion.toArray(quaternions, index4);\n\t\t\tthis._scale.toArray(scales, index3);\n\t\t\ti++;\n\t\t}\n\t\tconst instancePosition = new InstancedBufferAttribute(positions, 3);\n\t\tconst instanceQuaternion = new InstancedBufferAttribute(quaternions, 4);\n\t\tconst instanceScale = new InstancedBufferAttribute(scales, 3);\n\n\t\tgeometry.setAttribute(InstanceAttrib.POSITION, instancePosition);\n\t\tgeometry.setAttribute(InstanceAttrib.QUATERNION, instanceQuaternion);\n\t\tgeometry.setAttribute(InstanceAttrib.SCALE, instanceScale);\n\t}\n\n\tstatic updateColorInstanceAttribute(\n\t\tinstancePts: BaseCorePoint[],\n\t\ttemplateCoreGroup: CoreGroup,\n\t\tgeometry: InstancedBufferGeometry\n\t) {\n\t\tconst instancesCount = instancePts.length;\n\t\tconst colors = new Float32Array(instancesCount * 3);\n\t\tconst hasColor = templateCoreGroup.hasPointAttrib(Attribute.COLOR);\n\t\tlet i = 0;\n\t\tfor (const instancePt of instancePts) {\n\t\t\tconst color = hasColor\n\t\t\t\t? (instancePt.attribValue(Attribute.COLOR, this._point_color) as Vector3)\n\t\t\t\t: DEFAULT_COLOR;\n\t\t\tcolor.toArray(colors, i * 3);\n\n\t\t\ti++;\n\t\t}\n\t\tgeometry.setAttribute(InstanceAttrib.COLOR, new InstancedBufferAttribute(colors, 3));\n\t}\n\n\tstatic createInstanceBufferGeometry(\n\t\tgeometryToInstance: BufferGeometry,\n\t\ttemplateCoreGroup: CoreGroup,\n\t\tattributesToCopy: string\n\t) {\n\t\ttemplateCoreGroup.points(_instancePts);\n\n\t\tconst geometry = new InstancedBufferGeometry();\n\t\tgeometry.copy(geometryToInstance as InstancedBufferGeometry);\n\t\tgeometry.instanceCount = Infinity;\n\n\t\tconst instancesCount = _instancePts.length;\n\n\t\tconst hasUV = templateCoreGroup.hasPointAttrib(Attribute.UV);\n\t\tif (hasUV) {\n\t\t\tconst uvs = new Float32Array(instancesCount * 2);\n\t\t\tlet i = 0;\n\t\t\tfor (const instancePt of _instancePts) {\n\t\t\t\tconst index2 = i * 2;\n\t\t\t\tconst uv = hasUV ? (instancePt.attribValue(Attribute.UV, this._point_uv) as Vector2) : DEFAULT_UV;\n\t\t\t\tuv.toArray(uvs, index2);\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tgeometry.setAttribute(InstanceAttrib.UV, new InstancedBufferAttribute(uvs, 2));\n\t\t}\n\t\tthis.updateTransformInstanceAttributes(_instancePts, templateCoreGroup, geometry);\n\t\tthis.updateColorInstanceAttribute(_instancePts, templateCoreGroup, geometry);\n\n\t\tconst attribNames = templateCoreGroup.pointAttribNamesMatchingMask(attributesToCopy);\n\n\t\tfor (const attribName of attribNames) {\n\t\t\tconst attribSize = templateCoreGroup.pointAttribSize(attribName);\n\t\t\tconst values = new Float32Array(instancesCount * attribSize);\n\t\t\tlet i = 0;\n\t\t\tfor (const pt of _instancePts) {\n\t\t\t\tconst value = pt.attribValue(attribName);\n\t\t\t\tif (isNumber(value)) {\n\t\t\t\t\tvalues[i] = value;\n\t\t\t\t} else {\n\t\t\t\t\t(value as Vector3).toArray(values, i * attribSize);\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tgeometry.setAttribute(attribName, new InstancedBufferAttribute(values, attribSize));\n\t\t}\n\n\t\treturn geometry;\n\t}\n}\n","import type {Object3D} from 'three';\nimport {stringMatchMask} from '../String';\nimport {coreTypeIsNaN} from '../Type';\nimport {CorePath} from './CorePath';\nimport type {CoreGroup} from './Group';\nimport {BaseCoreObject} from './entities/object/BaseCoreObject';\nimport type {ThreejsCoreObject} from './modules/three/ThreejsCoreObject';\nimport {CoreObjectType, ObjectContent} from './ObjectContent';\nimport {coreObjectInstanceFactory} from './CoreObjectFactory';\nimport type {QuadObject} from './modules/quad/QuadObject';\ninterface GroupOptions {\n\tgroup: string;\n}\nexport interface CoreMaskFilterOptions extends GroupOptions {\n\tinvert?: boolean;\n}\nexport function filterObjectsFromCoreGroup<T extends CoreObjectType>(\n\tcoreGroup: CoreGroup,\n\toptions: CoreMaskFilterOptions,\n\tcoreObjects?: BaseCoreObject<T>[]\n): ObjectContent<CoreObjectType>[] {\n\treturn filterCoreObjects(options.group, coreObjects || coreGroup.allCoreObjects()).map(\n\t\t(o) => o.object(),\n\t\toptions.invert\n\t);\n}\nexport function filterCoreObjectsFromCoreGroup<T extends CoreObjectType>(\n\tcoreGroup: CoreGroup,\n\toptions: CoreMaskFilterOptions,\n\tcoreObjects?: BaseCoreObject<T>[]\n): BaseCoreObject<CoreObjectType>[] {\n\treturn filterCoreObjects(options.group, coreObjects || coreGroup.allCoreObjects());\n}\nexport function filterThreejsCoreObjectsFromCoreGroup(\n\tcoreGroup: CoreGroup,\n\toptions: CoreMaskFilterOptions,\n\tcoreObjects?: ThreejsCoreObject[]\n): ThreejsCoreObject[] {\n\treturn filterCoreObjects(options.group, coreObjects || coreGroup.threejsCoreObjects()) as ThreejsCoreObject[];\n}\nexport function isInGroup<T extends CoreObjectType>(unSanitizedGroupString: string, coreObject: BaseCoreObject<T>) {\n\tconst group = unSanitizedGroupString.trim();\n\tif (group.length == 0) {\n\t\treturn true;\n\t}\n\n\tif (coreObject.object.name == group) {\n\t\treturn true;\n\t}\n\tif (stringMatchMask(coreObject.name(), group)) {\n\t\treturn true;\n\t}\n\n\tconst elements = group.split('=');\n\tconst attribNameWithPrefix = elements[0];\n\tif (attribNameWithPrefix[0] == '@') {\n\t\tconst attribName = attribNameWithPrefix.substring(1);\n\t\tconst expectedAttribValue = elements[1];\n\t\tconst currentAttribValue = coreObject.attribValue(attribName);\n\t\treturn expectedAttribValue == currentAttribValue;\n\t}\n\treturn false;\n}\n\nfunction filterCoreObjects<T extends CoreObjectType>(\n\tgroupString: string,\n\tcoreObjects: BaseCoreObject<T>[]\n): BaseCoreObject<T>[] {\n\tgroupString = groupString.trim();\n\n\tif (groupString == '') {\n\t\treturn coreObjects;\n\t}\n\tconst index = parseInt(groupString);\n\tif (!coreTypeIsNaN(index)) {\n\t\tconst coreObject = coreObjects[index];\n\t\tif (coreObject) {\n\t\t\treturn [coreObject];\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tconst selectedCoreObjects: Array<BaseCoreObject<T>> = [];\n\n\tfor (const rootObject of coreObjects) {\n\t\tlet added = false;\n\t\tconst object = rootObject.object();\n\t\tif (object) {\n\t\t\tconst objectsInMask = CorePath.objectsByMask(groupString, object);\n\t\t\tfor (const objectInMask of objectsInMask) {\n\t\t\t\tconst parent = objectInMask.parent;\n\t\t\t\tconst index = parent ? parent.children.indexOf(objectInMask) : 0;\n\t\t\t\tconst coreObject = coreObjectInstanceFactory<T>(objectInMask, index);\n\t\t\t\tselectedCoreObjects.push(coreObject);\n\t\t\t\tadded = true;\n\t\t\t}\n\t\t\tconst _isInGroup = isInGroup(groupString, rootObject);\n\t\t\tif (_isInGroup && !added) {\n\t\t\t\tselectedCoreObjects.push(rootObject);\n\t\t\t}\n\t\t}\n\t}\n\treturn selectedCoreObjects;\n}\nexport function filterThreejsObjects(coreGroup: CoreGroup, options: CoreMaskFilterOptions) {\n\treturn filterObjectsFromCoreGroup(coreGroup, options, coreGroup.threejsCoreObjects()) as Object3D[];\n}\nexport function filterThreejsOrQuadObjects(coreGroup: CoreGroup, options: CoreMaskFilterOptions) {\n\treturn filterObjectsFromCoreGroup(coreGroup, options, coreGroup.threejsOrQuadCoreObjects()) as Array<\n\t\tObject3D | QuadObject\n\t>;\n}\nexport function filterObjectsWithGroup(coreGroup: CoreGroup, options: GroupOptions) {\n\treturn filterObjectsFromCoreGroup(coreGroup, {\n\t\tgroup: options.group,\n\t});\n}\nexport function filterThreejsObjectsWithGroup(coreGroup: CoreGroup, options: GroupOptions) {\n\treturn filterThreejsObjects(coreGroup, {\n\t\tgroup: options.group,\n\t});\n}\nexport function filterThreejsOrQuadObjectsWithGroup(coreGroup: CoreGroup, options: GroupOptions) {\n\treturn filterThreejsOrQuadObjects(coreGroup, {\n\t\tgroup: options.group,\n\t});\n}\nexport class CoreMask {\n\tstatic filterObjects = filterObjectsFromCoreGroup;\n\tstatic filterCoreObjects = filterCoreObjectsFromCoreGroup;\n\tstatic filterThreejsObjects = filterThreejsObjects;\n\tstatic isInGroup = isInGroup;\n}\n","import {ShaderMaterial} from 'three';\nimport {Object3D} from 'three';\nimport {Mesh} from 'three';\nimport {Material} from 'three';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport {IUniform} from 'three';\nimport {UniformsUtils} from 'three';\nexport interface IUniforms {\n\t[uniform: string]: IUniform;\n}\nexport interface MaterialWithUniforms extends Material {\n\tuniforms: IUniforms;\n}\n\nexport enum CustomMaterialName {\n\tDISTANCE = 'customDistanceMaterial', // for point lights\n\tDEPTH = 'customDepthMaterial', // for spot lights and directional\n\tDEPTH_DOF = 'customDepthDOFMaterial', // for post/bokeh only (see in scene.)\n}\n\nexport interface ObjectWithCustomMaterials extends Mesh {\n\t// customDistanceMaterial?: Material;\n\t// customDepthMaterial?: Material;\n\tcustomDepthDOFMaterial?: Material;\n}\nexport interface MaterialWithCustomMaterials extends Material {\n\tcustomMaterials: {\n\t\t[key in CustomMaterialName]?: Material;\n\t};\n}\nexport interface ShaderMaterialWithCustomMaterials extends ShaderMaterial {\n\tcustomMaterials: {\n\t\t[key in CustomMaterialName]?: Material;\n\t};\n}\nexport interface MaterialWithSkinning extends Material {\n\tskinning: boolean;\n\tmorphTargets: boolean;\n}\n\nimport {WebGLRenderer} from 'three';\nimport {Scene} from 'three';\nimport {Camera} from 'three';\nimport {BufferGeometry} from 'three';\nimport {Group} from 'three';\nimport {ShaderAssemblerMaterial} from '../../engine/nodes/gl/code/assemblers/materials/_BaseMaterial';\nimport {\n\tassignUniformViaUserData,\n\tcopyOnBeforeCompileData,\n} from '../../engine/nodes/gl/code/assemblers/materials/OnBeforeCompile';\nimport {IUniformTexture} from '../../engine/nodes/utils/code/gl/Uniforms';\n\nexport type RenderHook = (\n\trenderer: WebGLRenderer,\n\tscene: Scene,\n\tcamera: Camera,\n\tgeometry: BufferGeometry,\n\tmaterial: Material,\n\tgroup: Group | null // it's only 'Group', and not 'Group|null' in threejs types, but got null sometimes\n) => void;\nexport type RenderHookWithObject = (\n\trenderer: WebGLRenderer,\n\tscene: Scene,\n\tcamera: Camera,\n\tgeometry: BufferGeometry,\n\tmaterial: Material,\n\tgroup: Group | null, // it's only 'Group', and not 'Group|null' in threejs types, but got null sometimes\n\tobject: Object3D\n) => void;\nconst RENDER_HOOK_USER_DATA_KEY = 'POLY_render_hook';\n\ninterface MaterialWithRenderHook extends Material {\n\tuserData: {\n\t\t[RENDER_HOOK_USER_DATA_KEY]?: RenderHookWithObject;\n\t};\n}\n\nconst EMPTY_RENDER_HOOK: RenderHook = (\n\trenderer: WebGLRenderer,\n\tscene: Scene,\n\tcamera: Camera,\n\tgeometry: BufferGeometry,\n\tmaterial: Material,\n\tgroup: Group | null\n) => {};\n\ninterface CloneOptions {\n\tshareCustomUniforms: boolean;\n\taddCustomMaterials: boolean;\n}\nexport function cloneMaterial(scene: PolyScene, srcMaterial: Material | ShaderMaterial, options: CloneOptions) {\n\tconst clonedMaterial = srcMaterial.clone();\n\tconst srcUniforms = (srcMaterial as ShaderMaterial).uniforms;\n\tif (srcUniforms) {\n\t\t(clonedMaterial as ShaderMaterial).uniforms = UniformsUtils.clone(srcUniforms);\n\t}\n\tcopyOnBeforeCompileData(scene, {\n\t\tsrc: srcMaterial,\n\t\tdest: clonedMaterial,\n\t\tshareCustomUniforms: options.shareCustomUniforms,\n\t});\n\n\tif ((srcMaterial as MaterialWithCustomMaterials).customMaterials && options.addCustomMaterials) {\n\t\tconst customNames = Object.keys((srcMaterial as MaterialWithCustomMaterials).customMaterials);\n\t\tif (customNames.length > 0) {\n\t\t\t(clonedMaterial as MaterialWithCustomMaterials).customMaterials = {};\n\t\t}\n\t\tfor (const customName of customNames) {\n\t\t\tconst matName = customName as CustomMaterialName;\n\t\t\tconst customMaterial = (srcMaterial as MaterialWithCustomMaterials).customMaterials[matName];\n\t\t\tif (customMaterial) {\n\t\t\t\tconst clonedCustomMaterial = cloneMaterial(scene, customMaterial, {\n\t\t\t\t\t...options,\n\t\t\t\t\taddCustomMaterials: false,\n\t\t\t\t});\n\t\t\t\t(clonedMaterial as MaterialWithCustomMaterials).customMaterials[matName] = clonedCustomMaterial;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn clonedMaterial;\n}\n\nexport function applyCustomMaterials(object: Object3D, material: Material) {\n\tconst materialWithCustom = material as MaterialWithCustomMaterials;\n\tif (materialWithCustom.customMaterials) {\n\t\tfor (const customName of Object.keys(materialWithCustom.customMaterials)) {\n\t\t\tconst matName = customName as CustomMaterialName;\n\t\t\t// http://blog.edankwan.com/post/three-js-advanced-tips-shadow\n\t\t\tconst customMaterial = materialWithCustom.customMaterials[matName];\n\t\t\tif (customMaterial) {\n\t\t\t\t(object as ObjectWithCustomMaterials)[matName] = customMaterial;\n\t\t\t\tcustomMaterial.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t\t// object.material = material.customMaterials.customDepthDOFMaterial\n\t\t// object.material = material.customMaterials.customDepthMaterial\n\t\t// object.material = material.customMaterials.customDistanceMaterial\n\t}\n}\n\n/*\n//\n// TODO:\n// this render hook system has a big limitation,\n// which is that if we clone the object, it may not be propagated correctly,\n// since this is assigned at render time.\n// This means that if we clone an object before it has been rendered,\n// it won't have the onBeforeRender function, and therefore won't pass it on to its clone.\n//\n*/\nexport function addUserDataRenderHook(material: Material, renderHook: RenderHookWithObject) {\n\tmaterial.userData[RENDER_HOOK_USER_DATA_KEY] = renderHook;\n}\nexport function applyRenderHook(object: Object3D, material: MaterialWithRenderHook) {\n\tif (material.userData) {\n\t\tconst renderHook: RenderHookWithObject | undefined = material.userData[RENDER_HOOK_USER_DATA_KEY];\n\t\tif (renderHook) {\n\t\t\tobject.onBeforeRender = (\n\t\t\t\trenderer: WebGLRenderer,\n\t\t\t\tscene: Scene,\n\t\t\t\tcamera: Camera,\n\t\t\t\tgeometry: BufferGeometry,\n\t\t\t\tmaterial: Material,\n\t\t\t\tgroup: Group | null\n\t\t\t) => {\n\t\t\t\trenderHook(renderer, scene, camera, geometry, material, group, object);\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\t}\n\t// make sure to reset the render hook if apply to a material that does not have any\n\tobject.onBeforeRender = EMPTY_RENDER_HOOK;\n}\nexport function assignUniforms(\n\tmat: Material,\n\tuniformName: string,\n\tuniform: IUniformTexture,\n\tassembler?: ShaderAssemblerMaterial\n) {\n\tassignUniformViaUserData(mat, uniformName, uniform);\n\tif (assembler) {\n\t\tassignUniformForOnBeforeCompile(mat, uniformName, uniform, assembler);\n\t}\n}\nexport function assignUniformForOnBeforeCompile(\n\tmat: Material,\n\tuniformName: string,\n\tuniform: IUniformTexture,\n\tassembler: ShaderAssemblerMaterial\n) {\n\tassembler.addAdditionalTextureUniforms(uniformName, uniform);\n}\nexport class CoreMaterial {\n\tstatic node(scene: PolyScene, material: Material) {\n\t\treturn scene.node(material.name);\n\t}\n\tstatic clone = cloneMaterial;\n\tstatic applyCustomMaterials = applyCustomMaterials;\n\tstatic assignUniforms = assignUniforms;\n\tstatic assignUniformForOnBeforeCompile = assignUniformForOnBeforeCompile;\n}\n","import {BufferGeometry, Object3D, Material, Matrix4, Object3DEventMap} from 'three';\nimport {objectCloneDeep} from '../ObjectUtils';\nimport type {CadGeometry} from './modules/cad/CadCommon';\nimport type {CsgGeometry} from './modules/csg/CsgCommon';\nimport type {QuadGeometry} from './modules/quad/QuadGeometry';\nimport type {SDFGeometry} from './modules/sdf/SDFCommon';\nimport type {TetGeometry} from './modules/tet/TetGeometry';\nimport {CoreEntity} from './CoreEntity';\n\nexport enum CoreObjectType {\n\tTHREEJS = 'Object3D',\n\tCAD = 'CADObject',\n\tCSG = 'CSGObject',\n\tQUAD = 'QUADObject',\n\tSDF = 'SDFObject',\n\tTET = 'TetObject',\n}\n\nexport interface ObjectGeometryMap {\n\t[CoreObjectType.THREEJS]: BufferGeometry;\n\t[CoreObjectType.CAD]: CadGeometry;\n\t[CoreObjectType.CSG]: CsgGeometry;\n\t[CoreObjectType.QUAD]: QuadGeometry;\n\t[CoreObjectType.SDF]: SDFGeometry;\n\t[CoreObjectType.TET]: TetGeometry;\n}\nexport interface ObjectContent<T extends CoreObjectType> {\n\ttype: string;\n\tgeometry?: ObjectGeometryMap[T];\n\tuserData: {[key: string]: any};\n\tname: string;\n\tvisible: boolean;\n\tcastShadow: boolean;\n\treceiveShadow: boolean;\n\trenderOrder: number;\n\tfrustumCulled: boolean;\n\tmatrixAutoUpdate: boolean;\n\tmaterial?: Material | Material[];\n\tchildren: ObjectContent<T>[];\n\tparent: ObjectContent<T> | null;\n\tclone: () => ObjectContent<T>;\n\tdispose?: () => void;\n\ttraverse(callback: (object: ObjectContent<T>) => any): void;\n\tapplyMatrix4(matrix: Matrix4): void;\n\tadd: (...object: any[]) => void;\n\tremove: (...object: any[]) => void;\n\tdispatchEvent: (event: {type: string | any}) => void;\n}\n\ntype Object3DEventMapExtended<T extends string> = Object3DEventMap & {\n\t[P in T]: any;\n};\nexport type Object3DWithEvent<T extends string> = Object3D<Object3DEventMapExtended<T>>;\n\nexport function isObject3D<T extends CoreObjectType>(o: ObjectContent<T>): o is Object3D {\n\treturn o instanceof Object3D || (o as Object3D).isObject3D == true;\n}\n\nexport interface ObjectContentCopyPropertiesOptions {\n\tcastShadow?: boolean;\n\treceiveShadow?: boolean;\n\tmaterial?: Material | Material[];\n}\nexport function objectContentCopyProperties(\n\tsrc: ObjectContent<CoreObjectType>,\n\ttarget: ObjectContent<CoreObjectType>,\n\toptions?: ObjectContentCopyPropertiesOptions\n) {\n\ttarget.visible = src.visible;\n\ttarget.name = src.name;\n\tif (options == null || options.castShadow == null || options.castShadow == true) {\n\t\ttarget.castShadow = src.castShadow;\n\t}\n\tif (options == null || options.receiveShadow == null || options.receiveShadow == true) {\n\t\ttarget.receiveShadow = src.receiveShadow;\n\t}\n\ttarget.renderOrder = src.renderOrder;\n\ttarget.frustumCulled = src.frustumCulled;\n\ttarget.matrixAutoUpdate = src.matrixAutoUpdate;\n\tif (src.material && options?.material == null) {\n\t\ttarget.material = src.material;\n\t}\n\ttarget.userData = objectCloneDeep(src.userData);\n}\n\nexport interface MergeCompactOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tmergedObjects: ObjectContent<CoreObjectType>[];\n\tmaterial?: Material;\n\tobjectType: string;\n\tonError: (message: string) => void;\n}\n\nexport type ObjectBuilder<T extends CoreObjectType> = (\n\tobject: ObjectContent<T>,\n\tentities: CoreEntity[]\n) => ObjectContent<T> | undefined;\n","// converts the given BVH raycast intersection to align with the three.js raycast\n// structure (include object, world space distance and point).\nexport function convertRaycastIntersect( hit, object, raycaster ) {\n\n\tif ( hit === null ) {\n\n\t\treturn null;\n\n\t}\n\n\thit.point.applyMatrix4( object.matrixWorld );\n\thit.distance = hit.point.distanceTo( raycaster.ray.origin );\n\thit.object = object;\n\n\treturn hit;\n\n}\n","import { Ray, Matrix4, Mesh, Vector3, Sphere, BatchedMesh, REVISION } from 'three';\nimport { convertRaycastIntersect } from './GeometryRayIntersectUtilities.js';\nimport { MeshBVH } from '../core/MeshBVH.js';\n\nconst IS_REVISION_166 = parseInt( REVISION ) >= 166;\nconst ray = /* @__PURE__ */ new Ray();\nconst direction = /* @__PURE__ */ new Vector3();\nconst tmpInverseMatrix = /* @__PURE__ */ new Matrix4();\nconst origMeshRaycastFunc = Mesh.prototype.raycast;\nconst origBatchedRaycastFunc = BatchedMesh.prototype.raycast;\nconst _worldScale = /* @__PURE__ */ new Vector3();\nconst _mesh = /* @__PURE__ */ new Mesh();\nconst _batchIntersects = [];\n\nexport function acceleratedRaycast( raycaster, intersects ) {\n\n\tif ( this.isBatchedMesh ) {\n\n\t\tacceleratedBatchedMeshRaycast.call( this, raycaster, intersects );\n\n\t} else {\n\n\t\tacceleratedMeshRaycast.call( this, raycaster, intersects );\n\n\t}\n\n}\n\nfunction acceleratedBatchedMeshRaycast( raycaster, intersects ) {\n\n\tif ( this.boundsTrees ) {\n\n\t\t// TODO: remove use of geometry info, instance info when r170 is minimum version\n\t\tconst boundsTrees = this.boundsTrees;\n\t\tconst drawInfo = this._drawInfo || this._instanceInfo;\n\t\tconst drawRanges = this._drawRanges || this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry = this.geometry;\n\n\t\tconst oldBoundsTree = _mesh.geometry.boundsTree;\n\t\tconst oldDrawRange = _mesh.geometry.drawRange;\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\t// TODO: provide new method to get instances count instead of 'drawInfo.length'\n\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! this.getVisibleAt( i ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// TODO: use getGeometryIndex\n\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\n\t\t\t_mesh.geometry.boundsTree = boundsTrees[ geometryId ];\n\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\n\t\t\tif ( ! _mesh.geometry.boundsTree ) {\n\n\t\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\n\t\t\t\tconst drawRange = drawRanges[ geometryId ];\n\t\t\t\t_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );\n\n\t\t\t}\n\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.geometry.boundsTree = oldBoundsTree;\n\t\t_mesh.geometry.drawRange = oldDrawRange;\n\t\t_mesh.material = null;\n\t\t_mesh.geometry = null;\n\n\t} else {\n\n\t\torigBatchedRaycastFunc.call( this, raycaster, intersects );\n\n\t}\n\n}\n\nfunction acceleratedMeshRaycast( raycaster, intersects ) {\n\n\tif ( this.geometry.boundsTree ) {\n\n\t\tif ( this.material === undefined ) return;\n\n\t\ttmpInverseMatrix.copy( this.matrixWorld ).invert();\n\t\tray.copy( raycaster.ray ).applyMatrix4( tmpInverseMatrix );\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\t\tdirection.copy( ray.direction ).multiply( _worldScale );\n\n\t\tconst scaleFactor = direction.length();\n\t\tconst near = raycaster.near / scaleFactor;\n\t\tconst far = raycaster.far / scaleFactor;\n\n\t\tconst bvh = this.geometry.boundsTree;\n\t\tif ( raycaster.firstHitOnly === true ) {\n\n\t\t\tconst hit = convertRaycastIntersect( bvh.raycastFirst( ray, this.material, near, far ), this, raycaster );\n\t\t\tif ( hit ) {\n\n\t\t\t\tintersects.push( hit );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst hits = bvh.raycast( ray, this.material, near, far );\n\t\t\tfor ( let i = 0, l = hits.length; i < l; i ++ ) {\n\n\t\t\t\tconst hit = convertRaycastIntersect( hits[ i ], this, raycaster );\n\t\t\t\tif ( hit ) {\n\n\t\t\t\t\tintersects.push( hit );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\torigMeshRaycastFunc.call( this, raycaster, intersects );\n\n\t}\n\n}\n\nexport function computeBoundsTree( options = {} ) {\n\n\tthis.boundsTree = new MeshBVH( this, options );\n\treturn this.boundsTree;\n\n}\n\nexport function disposeBoundsTree() {\n\n\tthis.boundsTree = null;\n\n}\n\nexport function computeBatchedBoundsTree( index = - 1, options = {} ) {\n\n\tif ( ! IS_REVISION_166 ) {\n\n\t\tthrow new Error( 'BatchedMesh: Three r166+ is required to compute bounds trees.' );\n\n\t}\n\n\tif ( options.indirect ) {\n\n\t\tconsole.warn( '\"Indirect\" is set to false because it is not supported for BatchedMesh.' );\n\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tindirect: false,\n\t\trange: null\n\t};\n\n\tconst drawRanges = this._drawRanges || this._geometryInfo;\n\tconst geometryCount = this._geometryCount;\n\tif ( ! this.boundsTrees ) {\n\n\t\tthis.boundsTrees = new Array( geometryCount ).fill( null );\n\n\t}\n\n\tconst boundsTrees = this.boundsTrees;\n\twhile ( boundsTrees.length < geometryCount ) {\n\n\t\tboundsTrees.push( null );\n\n\t}\n\n\tif ( index < 0 ) {\n\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\toptions.range = drawRanges[ i ];\n\t\t\tboundsTrees[ i ] = new MeshBVH( this.geometry, options );\n\n\t\t}\n\n\t\treturn boundsTrees;\n\n\t} else {\n\n\t\tif ( index < drawRanges.length ) {\n\n\t\t\toptions.range = drawRanges[ index ];\n\t\t\tboundsTrees[ index ] = new MeshBVH( this.geometry, options );\n\n\t\t}\n\n\t\treturn boundsTrees[ index ] || null;\n\n\t}\n\n}\n\nexport function disposeBatchedBoundsTree( index = - 1 ) {\n\n\tif ( index < 0 ) {\n\n\t\tthis.boundsTrees.fill( null );\n\n\t} else {\n\n\t\tif ( index < this.boundsTree.length ) {\n\n\t\t\tthis.boundsTrees[ index ] = null;\n\n\t\t}\n\n\t}\n\n}\n","import {Object3D, Raycaster, Mesh} from 'three';\nimport {MeshBVH, acceleratedRaycast, BufferGeometryWithBVH, CENTER, RaycasterForBVH} from './three-mesh-bvh';\n\nexport interface ThreeMeshBVHHelperOptions {\n\tstrategy: number;\n\tmaxLeafTris: number;\n\tmaxDepth: number;\n\tverbose: boolean;\n}\nexport interface MeshWithBVHGeometry extends Mesh {\n\tgeometry: BufferGeometryWithBVH;\n}\nexport class ThreeMeshBVHHelper {\n\tstatic assignBVH(mesh: Mesh, bvh: MeshBVH) {\n\t\tmesh.raycast = acceleratedRaycast;\n\t\t// bvh = bvh || new MeshBVH(mesh.geometry, {verbose: false});\n\t\t(mesh.geometry as BufferGeometryWithBVH).boundsTree = bvh;\n\t}\n\tstatic assignDefaultBVHIfNone(mesh: Mesh) {\n\t\tlet bvh = (mesh.geometry as BufferGeometryWithBVH).boundsTree || this.defaultBVH(mesh);\n\t\tthis.assignBVH(mesh, bvh);\n\t}\n\tstatic createBVH(mesh: Mesh, options: ThreeMeshBVHHelperOptions) {\n\t\treturn new MeshBVH(mesh.geometry, options);\n\t}\n\tprivate static defaultBVH(mesh: Mesh) {\n\t\treturn this.createBVH(mesh, {strategy: CENTER, maxLeafTris: 10, maxDepth: 40, verbose: false});\n\t}\n\tstatic copyBVH(meshDest: Mesh, meshSrc: Object3D) {\n\t\tconst existingBVH = ((meshSrc as Mesh).geometry as BufferGeometryWithBVH).boundsTree;\n\t\tif (existingBVH) {\n\t\t\tmeshDest.raycast = acceleratedRaycast;\n\t\t\tthis.assignBVH(meshDest, existingBVH);\n\t\t}\n\t}\n\tstatic updateRaycaster(raycaster: Raycaster) {\n\t\t(raycaster as RaycasterForBVH).firstHitOnly = true;\n\t}\n}\n","import {attribValueNonPrimitive, copyAttribValue} from '../geometry/entities/utils/Common';\nimport {ObjectXD, _getObjectAttributeRef_} from './ObjectAttributeReactivity';\nimport type {Ref} from '@vue/reactivity';\nimport type {AttribValue} from '../../types/GlobalTypes';\n\nfunction _copyObjectAttribToRef(attribValue: AttribValue, targetRef: Ref<AttribValue>) {\n\tif (attribValueNonPrimitive(attribValue) && attribValueNonPrimitive(targetRef.value)) {\n\t\tcopyAttribValue(attribValue, targetRef.value);\n\t} else {\n\t\ttargetRef.value = attribValue;\n\t}\n}\nexport function _updateObjectAttribRef(object3D: ObjectXD, attribName: string, newValue: AttribValue) {\n\tconst _ref = _getObjectAttributeRef_(object3D, attribName);\n\tif (!_ref) {\n\t\treturn;\n\t}\n\t_copyObjectAttribToRef(_ref.current.value, _ref.previous);\n\t_copyObjectAttribToRef(newValue, _ref.current);\n}\n","import {AttribValue, Number3, NumericAttribValue, PolyDictionary} from '../../../../types/GlobalTypes';\nimport {Box3, Color, Matrix4, Sphere, Vector2, Vector3, Vector4} from 'three';\nimport {Attribute, CoreAttribute} from '../../Attribute';\nimport {AttribType, AttribSize, ObjectData, GroupString, AttribClass} from '../../Constant';\nimport {CoreEntity, CoreEntityWithObject} from '../../CoreEntity';\nimport {isArray,isVector,isColor,isString} from '../../../Type';\nimport {\n\tObjectContent,\n\tCoreObjectType,\n\tObjectGeometryMap,\n\tMergeCompactOptions,\n\tObjectBuilder,\n} from '../../ObjectContent';\nimport {TransformTargetType} from '../../../Transform';\nimport {ObjectTransformMode, ObjectTransformSpace} from '../../../TransformSpace';\nimport {EntityGroupCollection} from '../../EntityGroupCollection';\nimport {_updateObjectAttribRef} from '../../../reactivity/ObjectAttributeReactivityUpdateRef';\nimport {AttributeDictionary} from '../object/BaseCoreObjectUtils';\nimport {attribValueNonPrimitive, copyAttribValue, cloneAttribValue, uniqRelatedEntityIds} from '../utils/Common';\nimport {getOrCreateObjectAttributeRef} from '../../../reactivity/ObjectAttributeReactivityCreateRef';\nimport {\n\tJsIConnectionPointTypeToDataTypeMap,\n\tParamConvertibleJsType,\n} from '../../../../engine/nodes/utils/io/connections/Js';\nimport {watch} from '../../../reactivity/CoreReactivity';\nimport {objectData} from './BaseCoreObjectUtils';\nimport {TypeAssert} from '../../../../engine/poly/Assert';\n// import {uniqRelatedEntityIds} from '../utils/Common';\nimport type {CoreGroup} from '../../Group';\nimport type {CorePrimitive} from '../primitive/CorePrimitive';\nimport {CoreVertex} from '../vertex/CoreVertex';\nimport {CorePoint} from '../point/CorePoint';\nimport {TraversedRelatedEntityData} from '../utils/TraversedRelatedEntities';\n\nenum PropertyName {\n\tNAME = 'name',\n\tPOSITION = 'position',\n}\nconst ATTRIBUTES = 'attributes';\n// const _relatedPoints: CorePoint<CoreObjectType>[] = [];\n// const _relatedVertices: CoreVertex<CoreObjectType>[] = [];\n// const _relatedPrimitives: CorePrimitive<CoreObjectType>[] = [];\n// const ATTRIBUTES_PREVIOUS_VALUES = 'attributesPreviousValues';\n\nconst ORIGIN = new Vector3(0, 0, 0);\nfunction _convertArrayToVector(value: number[]) {\n\tswitch (value.length) {\n\t\tcase 1:\n\t\t\treturn value[0];\n\t\tcase 2:\n\t\t\treturn new Vector2(value[0], value[1]);\n\t\tcase 3:\n\t\t\treturn new Vector3(value[0], value[1], value[2]);\n\t\tcase 4:\n\t\t\treturn new Vector4(value[0], value[1], value[2], value[3]);\n\t}\n}\nconst tmpVec3 = new Vector3();\nconst tmpN3: Number3 = [0, 0, 0];\n\ntype OnAttribChange<T extends ParamConvertibleJsType> = (\n\tnewValue: JsIConnectionPointTypeToDataTypeMap[T],\n\toldValue: JsIConnectionPointTypeToDataTypeMap[T]\n) => void;\n\nconst _relatedPrimitiveIds: number[] = [];\nconst _relatedVertexIds: number[] = [];\n\nexport abstract class BaseCoreObject<T extends CoreObjectType> extends CoreEntityWithObject<T> {\n\tdispose() {}\n\n\t// set_index(i: number) {\n\t// \tthis._index = i;\n\t// }\n\n\tgeometry(): ObjectGeometryMap[T] | null {\n\t\treturn this._object?.geometry || null; //(this._object as Mesh).geometry as BufferGeometry | null;\n\t}\n\tbuilder<T extends CoreObjectType>(): ObjectBuilder<T> | undefined {\n\t\treturn undefined;\n\t}\n\tstatic attributeRef<OT extends CoreObjectType, T extends ParamConvertibleJsType>(\n\t\tobject: ObjectContent<OT>,\n\t\tattribName: string,\n\t\ttype: T,\n\t\tdefaultValue: JsIConnectionPointTypeToDataTypeMap[T]\n\t) {\n\t\treturn getOrCreateObjectAttributeRef(object, attribName, type, defaultValue);\n\t}\n\tattributeRef<T extends ParamConvertibleJsType>(\n\t\tattribName: string,\n\t\ttype: T,\n\t\tdefaultValue: JsIConnectionPointTypeToDataTypeMap[T]\n\t) {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).attributeRef(\n\t\t\tthis._object,\n\t\t\tattribName,\n\t\t\ttype,\n\t\t\tdefaultValue\n\t\t);\n\t}\n\tstatic onAttribChange<OT extends CoreObjectType, T extends ParamConvertibleJsType>(\n\t\tobject: ObjectContent<OT>,\n\t\tattribName: string,\n\t\ttype: T,\n\t\tdefaultValue: JsIConnectionPointTypeToDataTypeMap[T],\n\t\tcallback: OnAttribChange<T>\n\t) {\n\t\tconst ref = this.attributeRef(object, attribName, type, defaultValue);\n\t\treturn watch(ref.current, callback);\n\t}\n\tonAttribChange<T extends ParamConvertibleJsType>(\n\t\tattribName: string,\n\t\ttype: T,\n\t\tdefaultValue: JsIConnectionPointTypeToDataTypeMap[T],\n\t\tcallback: OnAttribChange<T>\n\t) {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).onAttribChange(\n\t\t\tthis._object,\n\t\t\tattribName,\n\t\t\ttype,\n\t\t\tdefaultValue,\n\t\t\tcallback\n\t\t);\n\t}\n\tstatic setAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string, value: AttribValue) {\n\t\tthis.addAttribute(object, attribName, value);\n\t}\n\tstatic addAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string, value: AttribValue) {\n\t\tif (isArray(value)) {\n\t\t\tconst convertedValue = _convertArrayToVector(value);\n\t\t\tif (!convertedValue) {\n\t\t\t\tconst message = `value invalid`;\n\t\t\t\tconsole.error(message, value);\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\t\t}\n\n\t\tconst dict = this._attributesDictionary(object);\n\n\t\tconst currentValue = dict[attribName];\n\n\t\tif (attribValueNonPrimitive(value)) {\n\t\t\tif (currentValue == null) {\n\t\t\t\tconst cloned = cloneAttribValue(value);\n\t\t\t\tif (cloned) {\n\t\t\t\t\tdict[attribName] = cloned;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (attribValueNonPrimitive(currentValue)) {\n\t\t\t\t\tcopyAttribValue(value, currentValue);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tdict[attribName] = value;\n\t\t}\n\t\t_updateObjectAttribRef(object, attribName, value);\n\t}\n\tstatic addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: AttribSize = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tthis.addAttribute(object, attribName, defaultValue);\n\t}\n\taddAttribute(name: string, value: AttribValue) {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\t(this.constructor as any as typeof BaseCoreObject<CoreObjectType>).addAttribute(this._object, name, value);\n\t}\n\n\taddNumericAttrib(name: string, value: NumericAttribValue) {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\t(this.constructor as any as typeof BaseCoreObject<CoreObjectType>).addNumericAttribute(\n\t\t\tthis._object,\n\t\t\tname,\n\t\t\t1,\n\t\t\tvalue\n\t\t);\n\t}\n\tsetAttribValue(name: string, value: AttribValue) {\n\t\tthis.addAttribute(name, value);\n\t}\n\t// addNumericVertexAttrib(name: string, size: number, defaultValue: NumericAttribValue) {\n\t// \t// if (defaultValue == null) {\n\t// \t// \tdefaultValue = CoreAttribute.default_value(size);\n\t// \t// }\n\t// \t// this.coreGeometry()?.addNumericAttrib(name, size, defaultValue);\n\t// }\n\tprotected static _attributesDictionary<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn (object.userData[ATTRIBUTES] as AttributeDictionary) || this._createAttributesDictionaryIfNone(object);\n\t}\n\tstatic attributesDictionaryEntry<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tdefaultValue?: AttribValue\n\t) {\n\t\tconst dict =\n\t\t\t(object.userData[ATTRIBUTES] as AttributeDictionary) || this._createAttributesDictionaryIfNone(object);\n\t\tlet entry: AttribValue | undefined = dict[attribName];\n\t\tif (entry == null && defaultValue != null) {\n\t\t\tentry = defaultValue;\n\t\t\tdict[attribName] = entry;\n\t\t}\n\t\treturn entry;\n\t}\n\t// static attributesPreviousValuesDictionary<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t// \treturn (\n\t// \t\t(object.userData[ATTRIBUTES_PREVIOUS_VALUES] as AttributeDictionary) ||\n\t// \t\tthis._createAttributesPreviousValuesDictionaryIfNone(object)\n\t// \t);\n\t// }\n\tprivate static _createAttributesDictionaryIfNone<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tif (!object.userData[ATTRIBUTES]) {\n\t\t\treturn (object.userData[ATTRIBUTES] = {});\n\t\t}\n\t}\n\t// private static _createAttributesPreviousValuesDictionaryIfNone<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t// \tif (!object.userData[ATTRIBUTES_PREVIOUS_VALUES]) {\n\t// \t\treturn (object.userData[ATTRIBUTES_PREVIOUS_VALUES] = {});\n\t// \t}\n\t// }\n\n\tprivate _attributesDictionary() {\n\t\treturn (this.constructor as typeof BaseCoreObject<CoreObjectType>)._attributesDictionary(this._object);\n\t}\n\tstatic attributes<T extends CoreObjectType>(object: ObjectContent<T>): AttributeDictionary | undefined {\n\t\treturn this._attributesDictionary(object);\n\t}\n\tattributes(): AttributeDictionary | undefined {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\treturn (this.constructor as typeof BaseCoreObject<T>).attributes(this._object);\n\t}\n\tattributeNames(): string[] {\n\t\treturn this.attribNames();\n\t}\n\tstatic attribNames<T extends CoreObjectType>(object: ObjectContent<T>): string[] {\n\t\treturn Object.keys(this._attributesDictionary(object));\n\t}\n\tattribNames(): string[] {\n\t\treturn (this.constructor as typeof BaseCoreObject<CoreObjectType>).attribNames(this._object);\n\t}\n\n\tstatic hasAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\treturn attribName in this._attributesDictionary(object);\n\t}\n\thasAttribute(attribName: string): boolean {\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).hasAttribute(\n\t\t\tthis._object,\n\t\t\tattribName\n\t\t);\n\t}\n\tstatic attributeNames<T extends CoreObjectType>(object: ObjectContent<T>): string[] {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys(attributes);\n\t}\n\tstatic attributeNamesMatchingMask<T extends CoreObjectType>(object: ObjectContent<T>, masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.attributeNames(object));\n\t}\n\n\trenameAttribute(oldName: string, newName: string) {\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).renameAttribute(\n\t\t\tthis._object,\n\t\t\toldName,\n\t\t\tnewName\n\t\t);\n\t}\n\tstatic renameAttribute<T extends CoreObjectType>(object: ObjectContent<T>, oldName: string, newName: string) {\n\t\tconst currentValue = this.attribValue(object, oldName);\n\t\tif (currentValue != null) {\n\t\t\tthis.addAttribute(object, newName, currentValue);\n\t\t\tthis.deleteAttribute(object, oldName);\n\t\t} else {\n\t\t\tconsole.warn(`attribute ${oldName} not found`);\n\t\t}\n\t}\n\n\tdeleteAttribute(name: string) {\n\t\tdelete this._attributesDictionary()[name];\n\t}\n\tstatic deleteAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tdelete this._attributesDictionary(object)[attribName];\n\t}\n\t// static position:PositionStaticMethod<CoreObjectType> = DEFAULT_POSITION_STATIC_METHOD\n\tstatic position(object: ObjectContent<CoreObjectType>, target: Vector3) {\n\t\ttarget.copy(ORIGIN);\n\t}\n\tposition(target: Vector3): Vector3 {\n\t\t(this.constructor as typeof BaseCoreObject<CoreObjectType>).position(this._object, target);\n\t\treturn target;\n\t}\n\tstatic boundingBox(object: ObjectContent<CoreObjectType>, target: Box3) {\n\t\ttarget.makeEmpty();\n\t}\n\tboundingBox(target: Box3) {\n\t\t(this.constructor as typeof BaseCoreObject<CoreObjectType>).boundingBox(this._object, target);\n\t}\n\tstatic geometryBoundingBox(object: ObjectContent<CoreObjectType>, target: Box3) {\n\t\tthis.boundingBox(object, target);\n\t}\n\tgeometryBoundingBox(target: Box3) {\n\t\t(this.constructor as typeof BaseCoreObject<CoreObjectType>).geometryBoundingBox(this._object, target);\n\t}\n\tstatic boundingSphere(object: ObjectContent<CoreObjectType>, target: Sphere) {\n\t\ttarget.makeEmpty();\n\t}\n\tboundingSphere(target: Sphere) {\n\t\t(this.constructor as typeof BaseCoreObject<CoreObjectType>).boundingSphere(this._object, target);\n\t}\n\tstatic geometryBoundingSphere(object: ObjectContent<CoreObjectType>, target: Sphere) {\n\t\ttarget.makeEmpty();\n\t}\n\tgeometryBoundingSphere(target: Sphere) {\n\t\t(this.constructor as typeof BaseCoreObject<CoreObjectType>).geometryBoundingSphere(this._object, target);\n\t}\n\tstatic attribValue<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tindex: number = 0,\n\t\ttarget?: Color | Vector2 | Vector3 | Vector4\n\t): AttribValue | undefined {\n\t\tconst _attribFromProperty = () => {\n\t\t\tif (attribName == PropertyName.NAME) {\n\t\t\t\treturn object.name;\n\t\t\t}\n\t\t\tif (attribName == PropertyName.POSITION) {\n\t\t\t\tconst _target = target instanceof Vector3 ? target : tmpVec3;\n\t\t\t\tthis.position(object, _target);\n\t\t\t\t_target.toArray(tmpN3);\n\t\t\t\treturn tmpN3;\n\t\t\t}\n\t\t};\n\t\tif (attribName === Attribute.OBJECT_INDEX) {\n\t\t\treturn index;\n\t\t}\n\t\tif (attribName === Attribute.OBJECT_NAME) {\n\t\t\treturn object.name;\n\t\t}\n\t\tif (object.userData) {\n\t\t\tconst val = this.attributesDictionaryEntry(object, attribName);\n\t\t\t// const val = attribRef.value; //dict[attribName];\n\t\t\tif (val == null) {\n\t\t\t\treturn _attribFromProperty();\n\t\t\t} else {\n\t\t\t\t// const val = _ref.value;\n\t\t\t\tif (isVector(val) && target) {\n\t\t\t\t\tif (val instanceof Vector2 && target instanceof Vector2) {\n\t\t\t\t\t\treturn target.copy(val);\n\t\t\t\t\t}\n\t\t\t\t\tif (val instanceof Vector3 && target instanceof Vector3) {\n\t\t\t\t\t\treturn target.copy(val);\n\t\t\t\t\t}\n\t\t\t\t\tif (val instanceof Vector4 && target instanceof Vector4) {\n\t\t\t\t\t\treturn target.copy(val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isColor(val) && target) {\n\t\t\t\t\tif (val instanceof Color && target instanceof Color) {\n\t\t\t\t\t\treturn target.copy(val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray(val) && target) {\n\t\t\t\t\ttarget.fromArray(val);\n\t\t\t\t\treturn target;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// console.log(attribName, _ref, _ref.value);\n\t\t\treturn val; //_ref.value;\n\t\t}\n\t\treturn _attribFromProperty();\n\t}\n\t// static previousAttribValue<T extends CoreObjectType>(\n\t// \tobject: ObjectContent<T>,\n\t// \tattribName: string\n\t// ): AttribValue | undefined {\n\t// \tconst dict = this.attributesPreviousValuesDictionary(object);\n\t// \treturn dict[attribName];\n\t// }\n\n\tstatic stringAttribValue<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tindex: number = 0\n\t): string | null {\n\t\tconst str = this.attribValue(object, attribName, index);\n\t\tif (str != null) {\n\t\t\tif (isString(str)) {\n\t\t\t\treturn str;\n\t\t\t} else {\n\t\t\t\treturn `${str}`;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t// static makeAttribReactive<V extends AttribValue, T extends CoreObjectType>(\n\t// \tobject: ObjectContent<T>,\n\t// \tattribName: string,\n\t// \tcallback: AttributeReactiveCallback<V>\n\t// ) {\n\t// \tconst attributesDict = this.attributesDictionary(object);\n\t// \t// const attributesPreviousValuesDict = this.attributesPreviousValuesDictionary(object);\n\n\t// \tconst currentValue = attributesDict[attribName];\n\t// \tif (currentValue instanceof Vector4) {\n\t// \t\treturn makeAttribReactiveVector4(\n\t// \t\t\tobject,\n\t// \t\t\tattribName,\n\t// \t\t\t(<unknown>callback) as AttributeReactiveCallback<Vector4>\n\t// \t\t);\n\t// \t}\n\t// \tif (currentValue instanceof Vector3) {\n\t// \t\treturn makeAttribReactiveVector3(\n\t// \t\t\tobject,\n\t// \t\t\tattribName,\n\t// \t\t\t(<unknown>callback) as AttributeReactiveCallback<Vector3>\n\t// \t\t);\n\t// \t}\n\t// \tif (currentValue instanceof Vector2) {\n\t// \t\treturn makeAttribReactiveVector2(\n\t// \t\t\tobject,\n\t// \t\t\tattribName,\n\t// \t\t\t(<unknown>callback) as AttributeReactiveCallback<Vector2>\n\t// \t\t);\n\t// \t}\n\t// \treturn makeAttribReactiveSimple(\n\t// \t\tobject,\n\t// \t\tattribName,\n\t// \t\t(<unknown>callback) as AttributeReactiveCallback<string | number>\n\t// \t);\n\n\t// \t// // create a dummy val in case there is no attribute yet\n\t// \t// if (attributesDict[attribName] == null) {\n\t// \t// \tattributesDict[attribName] = 0;\n\t// \t// }\n\n\t// \t// const proxy: AttributeProxy<V> = {\n\t// \t// \tvalue: attributesDict[attribName] as V,\n\t// \t// \tpreviousValue: attributesDict[attribName] as V,\n\t// \t// };\n\t// \t// Object.defineProperties(attributesDict, {\n\t// \t// \t[attribName]: {\n\t// \t// \t\tget: function () {\n\t// \t// \t\t\treturn proxy.value;\n\t// \t// \t\t},\n\t// \t// \t\tset: function (x) {\n\t// \t// \t\t\tif (x != proxy.value) {\n\t// \t// \t\t\t\tproxy.previousValue = proxy.value;\n\t// \t// \t\t\t\tproxy.value = x;\n\t// \t// \t\t\t\tcallback(proxy.value, proxy.previousValue);\n\t// \t// \t\t\t}\n\t// \t// \t\t\treturn proxy.value;\n\t// \t// \t\t},\n\t// \t// \t\tconfigurable: true,\n\t// \t// \t},\n\t// \t// });\n\t// \t// Object.defineProperties(attributesPreviousValuesDict, {\n\t// \t// \t[attribName]: {\n\t// \t// \t\tget: function () {\n\t// \t// \t\t\treturn proxy.previousValue;\n\t// \t// \t\t},\n\t// \t// \t\tconfigurable: true,\n\t// \t// \t},\n\t// \t// });\n\t// }\n\n\tattribValue(attribName: string, target?: Vector2 | Vector3 | Vector4): AttribValue | undefined {\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).attribValue(\n\t\t\tthis._object,\n\t\t\tattribName,\n\t\t\tthis._index,\n\t\t\ttarget\n\t\t);\n\t}\n\tstringAttribValue(name: string) {\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).stringAttribValue(\n\t\t\tthis._object,\n\t\t\tname,\n\t\t\tthis._index\n\t\t);\n\t}\n\tname(): string {\n\t\treturn this.attribValue(PropertyName.NAME) as string;\n\t}\n\thumanType(): string {\n\t\treturn this._object.type;\n\t}\n\tattribTypes() {\n\t\tconst h: PolyDictionary<AttribType> = {};\n\t\tfor (const attrib_name of this.attribNames()) {\n\t\t\tconst type = this.attribType(attrib_name);\n\t\t\tif (type != null) {\n\t\t\t\th[attrib_name] = type;\n\t\t\t}\n\t\t}\n\t\treturn h;\n\t}\n\tstatic attribType<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tconst val = this.attribValue(object, attribName);\n\t\tif (isString(val)) {\n\t\t\treturn AttribType.STRING;\n\t\t} else {\n\t\t\treturn AttribType.NUMERIC;\n\t\t}\n\t}\n\tattribType(attribName: string) {\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).attribType(this._object, attribName);\n\t}\n\n\tattribSizes() {\n\t\tconst h: PolyDictionary<AttribSize> = {};\n\t\tconst attribNames = this.attribNames();\n\t\tfor (const attribName of attribNames) {\n\t\t\tconst size = this.attribSize(attribName);\n\t\t\tif (size != null) {\n\t\t\t\th[attribName] = size;\n\t\t\t}\n\t\t}\n\t\treturn h;\n\t}\n\tstatic attribSize<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): AttribSize | null {\n\t\tconst val = this.attribValue(object, attribName);\n\t\tif (val == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn CoreAttribute.attribSizeFromValue(val);\n\t}\n\tattribSize(attribName: string) {\n\t\treturn (this.constructor as any as typeof BaseCoreObject<CoreObjectType>).attribSize(this._object, attribName);\n\t}\n\n\tstatic objectData<T extends CoreObjectType>(object: ObjectContent<T>): ObjectData {\n\t\treturn objectData(object);\n\t}\n\n\tclone(): BaseCoreObject<T> {\n\t\tconst clonedObject = (this.constructor as typeof BaseCoreObject<CoreObjectType>).clone(this._object);\n\t\tconst cloned = new (this.constructor as any)(clonedObject, this._index);\n\t\treturn cloned;\n\t}\n\n\tstatic clone<T extends CoreObjectType>(srcObject: ObjectContent<T>): ObjectContent<T> {\n\t\treturn srcObject.clone() as ObjectContent<T>;\n\t}\n\n\tstatic applyMatrix(\n\t\tobject: ObjectContent<CoreObjectType>,\n\t\tmatrix: Matrix4,\n\t\ttransformTargetType: TransformTargetType,\n\t\ttransformSpace: ObjectTransformSpace,\n\t\ttransformMode: ObjectTransformMode\n\t) {\n\t\tconsole.warn('applyMatrix.override required', this);\n\t}\n\tstatic mergeCompact(options: MergeCompactOptions) {\n\t\tconsole.warn('mergeCompact.override required', this);\n\t}\n\n\t//\n\t//\n\t// ENTITY GROUPS\n\t//\n\t//\n\tgroupCollection() {\n\t\treturn new EntityGroupCollection(this._object);\n\t}\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedVertexIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tobjectIndex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst ids = traversedRelatedEntityData\n\t\t\t? traversedRelatedEntityData[AttribClass.PRIMITIVE].ids\n\t\t\t: _relatedPrimitiveIds;\n\t\tthis.relatedPrimitiveIds(object, objectIndex, ids, traversedRelatedEntityData);\n\t\tuniqRelatedEntityIds(\n\t\t\tids,\n\t\t\t(primitiveId, relatedEntityIds) => {\n\t\t\t\tthis.relatedPrimitiveClass(object).relatedVertexIds(object, primitiveId, relatedEntityIds);\n\t\t\t},\n\t\t\ttarget\n\t\t);\n\t}\n\tstatic override relatedPointIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tobjectIndex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst ids = traversedRelatedEntityData ? traversedRelatedEntityData[AttribClass.VERTEX].ids : _relatedVertexIds;\n\t\tthis.relatedVertexIds(object, objectIndex, ids, traversedRelatedEntityData);\n\t\tuniqRelatedEntityIds(\n\t\t\tids,\n\t\t\t(vertexId, relatedEntityIds) => {\n\t\t\t\tthis.relatedVertexClass(object).relatedPointIds(object, vertexId, relatedEntityIds);\n\t\t\t},\n\t\t\ttarget\n\t\t);\n\t}\n\trelatedEntities(\n\t\tattribClass: AttribClass,\n\t\tcoreGroup: CoreGroup,\n\t\ttarget: CoreEntity[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT: {\n\t\t\t\tthis.relatedPoints(target as CorePoint<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.VERTEX: {\n\t\t\t\tthis.relatedVertices(target as CoreVertex<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.PRIMITIVE: {\n\t\t\t\tthis.relatedPrimitives(target as CorePrimitive<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.OBJECT: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = this;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.CORE_GROUP: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = coreGroup;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n\n\tstatic override relatedPointClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn this.relatedVertexClass(object).relatedPointClass(object);\n\t}\n\tstatic override relatedVertexClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn this.relatedPrimitiveClass(object).relatedVertexClass(object);\n\t}\n}\n","import {AttribValue, PolyDictionary} from '../../../../types/GlobalTypes';\nimport {CoreObjectType, ObjectContent, isObject3D} from '../../ObjectContent';\nimport {AttribSize, AttribType, ObjectData, ObjectType, objectTypeFromObject} from '../../Constant';\nimport {EntityGroupCollection} from '../../EntityGroupCollection';\nimport type {BaseCoreObject} from '../../entities/object/BaseCoreObject';\nimport {addToSetAtEntry} from '../../../MapUtils';\nimport {setToArray} from '../../../SetUtils';\n\nexport type AttributeDictionary = PolyDictionary<AttribValue>;\n\nexport function objectData<T extends CoreObjectType>(object: ObjectContent<T>): ObjectData {\n\tconst childrenCount = isObject3D(object) ? object.children.length : 0;\n\tconst objectType = isObject3D(object) ? objectTypeFromObject(object) : (object.type as ObjectType);\n\tconst groupData = EntityGroupCollection.data(object);\n\treturn {\n\t\ttype: objectType,\n\t\tname: object.name,\n\t\tchildrenCount,\n\t\tgroupData,\n\t\tverticesCount: 0,\n\t\tpointsCount: 0,\n\t\tprimitivesCount: 0,\n\t\tprimitiveName: 'no name',\n\t};\n}\n\nexport function coreObjectsAttribSizesByName<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<T>[]\n): PolyDictionary<AttribSize[]> {\n\tconst _sizesByName: Map<string, Set<AttribSize>> = new Map();\n\tfor (const coreObject of coreObjects) {\n\t\tconst objectAttriNames = coreObject.attribNames();\n\t\tfor (const attribName of objectAttriNames) {\n\t\t\tconst attribSize = coreObject.attribSize(attribName);\n\t\t\taddToSetAtEntry(_sizesByName, attribName, attribSize);\n\t\t}\n\t}\n\n\tconst sizesByName: PolyDictionary<AttribSize[]> = {};\n\t_sizesByName.forEach((attribSizes, attribName) => {\n\t\tsizesByName[attribName] = setToArray(attribSizes, []);\n\t});\n\treturn sizesByName;\n}\nexport function coreObjectAttributeTypesByName<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<T>[]\n): PolyDictionary<AttribType[]> {\n\tconst _typesByName: Map<string, Set<AttribType>> = new Map();\n\tfor (const coreObject of coreObjects) {\n\t\tconst objectAttriNames = coreObject.attribNames();\n\t\tfor (const attribName of objectAttriNames) {\n\t\t\tconst attribType = coreObject.attribType(attribName);\n\t\t\taddToSetAtEntry(_typesByName, attribName, attribType);\n\t\t}\n\t}\n\n\tconst typesByName: PolyDictionary<AttribType[]> = {};\n\t_typesByName.forEach((attribTypes, attribName) => {\n\t\ttypesByName[attribName] = setToArray(attribTypes, []);\n\t});\n\treturn typesByName;\n\t// const core_object = this.firstCoreObject();\n\t// if (core_object) {\n\t// \tfor (let name of core_object.attribNames()) {\n\t// \t\ttypes_by_name[name] = core_object.attribType(name);\n\t// \t}\n\t// }\n\t// return types_by_name;\n}\nexport function coreObjectsAttribNames<T extends CoreObjectType>(coreObjects: BaseCoreObject<T>[]) {\n\tconst names: Set<string> = new Set();\n\tfor (const coreObject of coreObjects) {\n\t\tconst objectAttriNames = coreObject.attribNames();\n\t\tfor (const attribName of objectAttriNames) {\n\t\t\tnames.add(attribName);\n\t\t}\n\t}\n\n\treturn setToArray(names, []);\n}\n","import {\n\tAttribValue,\n\tColorLike,\n\tNumericAttribValue,\n\tVector2Like,\n\tVector3Like,\n\tVector4Like,\n} from '../../../../types/GlobalTypes';\nimport {BufferAttribute, Vector4, Vector3, Vector2, InterleavedBufferAttribute} from 'three';\nimport {Attribute, CoreAttribute} from '../../Attribute';\nimport {isArray} from '../../../Type';\nimport {CoreEntity, CoreEntityWithObject} from '../../CoreEntity';\nimport {\n\tDOT,\n\tComponentName,\n\tCOMPONENT_INDICES,\n\tAttribType,\n\tGroupString,\n\tAttribClass,\n\tAttribSize,\n\tComponentIndex,\n} from '../../Constant';\nimport {ObjectContent, CoreObjectType, ObjectBuilder} from '../../ObjectContent';\nimport {PointAttributesDict} from './Common';\nimport {CoreAttributeData} from '../../AttributeData';\nimport {coreObjectInstanceFactory} from '../../CoreObjectFactory';\nimport {TypeAssert} from '../../../../engine/poly/Assert';\nimport {uniqRelatedEntityIds} from '../utils/Common';\nimport type {CoreGroup} from '../../Group';\nimport {TraversedRelatedEntityData} from '../utils/TraversedRelatedEntities';\n\nconst _relatedPrimitiveIds: number[] = [];\n\nfunction _warnOverloadRequired(functionName: string) {\n\tconsole.warn(`CorePoint.${functionName} needs to be overloaded`);\n}\nexport abstract class CorePoint<T extends CoreObjectType> extends CoreEntityWithObject<T> {\n\t// protected _object?: ObjectContent<T>;\n\t// constructor(object?: ObjectContent<T>, index?: number) {\n\t// \tsuper(object, index);\n\t// \tthis._object = object;\n\t// }\n\n\tbuilder<T extends CoreObjectType>(): ObjectBuilder<T> | undefined {\n\t\treturn undefined;\n\t}\n\tstatic addAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribute: BufferAttribute\n\t) {\n\t\t_warnOverloadRequired('addAttribute');\n\t}\n\n\tstatic entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>): number {\n\t\treturn 0;\n\t}\n\n\tstatic attributes<T extends CoreObjectType>(object?: ObjectContent<T>): PointAttributesDict | undefined {\n\t\t_warnOverloadRequired('attributes');\n\t\treturn;\n\t}\n\tattributes(): PointAttributesDict | undefined {\n\t\t// if (!this._object) {\n\t\t// \treturn;\n\t\t// }\n\t\treturn (this.constructor as typeof CorePoint<T>).attributes(this._object);\n\t}\n\tstatic attribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string\n\t): BufferAttribute | InterleavedBufferAttribute | undefined {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\treturn attributes[attribName];\n\t}\n\tattribute(attribName: string): BufferAttribute | InterleavedBufferAttribute | undefined {\n\t\t// if (!this._object) {\n\t\t// \treturn;\n\t\t// }\n\t\treturn (this.constructor as typeof CorePoint<T>).attribute(this._object, attribName);\n\t}\n\n\tstatic attribSize<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): number {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn -1;\n\t\t}\n\t\tattribName = CoreAttribute.remapName(attribName);\n\t\treturn attributes[attribName].itemSize || 0;\n\t}\n\n\tattribSize(attribName: string): number {\n\t\t// if (!this._object) {\n\t\t// \treturn 0;\n\t\t// }\n\t\treturn (this.constructor as typeof CorePoint<T>).attribSize(this._object, attribName);\n\t}\n\tstatic hasAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): boolean {\n\t\tconst remappedName = CoreAttribute.remapName(attribName);\n\t\treturn this.attributes(object) ? this.attributes(object)![remappedName] != null : false;\n\t}\n\n\thasAttribute(attribName: string): boolean {\n\t\t// if (!this._object) {\n\t\t// \treturn false;\n\t\t// }\n\t\treturn (this.constructor as typeof CorePoint<T>).hasAttribute(this._object, attribName);\n\t}\n\n\t//\n\t//\n\t// INDEXED ATTRIBUTES\n\t//\n\t//\n\tstatic userDataAttribs<T extends CoreObjectType>(object?: ObjectContent<T>): Record<string, string[]> {\n\t\t_warnOverloadRequired('userDataAttribs');\n\t\treturn {};\n\t}\n\tuserDataAttribs(): Record<string, string[]> {\n\t\treturn this._object ? (this.constructor as typeof CorePoint).userDataAttribs(this._object) : {};\n\t}\n\tstatic userDataAttrib<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tattribName: string\n\t): string[] | undefined {\n\t\tattribName = CoreAttribute.remapName(attribName);\n\t\treturn this.userDataAttribs(object)[attribName];\n\t}\n\tuserDataAttrib(name: string) {\n\t\tname = CoreAttribute.remapName(name);\n\t\treturn this.userDataAttribs()[name];\n\t}\n\tstatic attributeNames<T extends CoreObjectType>(object?: ObjectContent<T>): string[] {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys(attributes);\n\t}\n\tstatic attributeNamesMatchingMask<T extends CoreObjectType>(object: ObjectContent<T>, masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.attributeNames(object));\n\t}\n\tstatic indexedAttributeNames<T extends CoreObjectType>(object?: ObjectContent<T>): string[] {\n\t\treturn object ? Object.keys(this.userDataAttribs(object) || {}) : [];\n\t}\n\tindexedAttributeNames(): string[] {\n\t\treturn this._object ? (this.constructor as typeof CorePoint).indexedAttributeNames(this._object) : [];\n\t\t// return Object.keys(this.userDataAttribs() || {});\n\t}\n\tstatic isAttribIndexed<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tattribName: string\n\t): boolean {\n\t\tattribName = CoreAttribute.remapName(attribName);\n\t\treturn this.userDataAttrib(object, attribName) != null;\n\t}\n\tisAttribIndexed(name: string): boolean {\n\t\tname = CoreAttribute.remapName(name);\n\t\treturn this.userDataAttrib(name) != null;\n\t}\n\tstatic setIndexedAttributeValues<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tattribName: string,\n\t\tvalues: string[]\n\t) {\n\t\tthis.userDataAttribs(object)[attribName] = values;\n\t}\n\tsetIndexedAttributeValues(attribName: string, values: string[]) {\n\t\treturn (this.constructor as typeof CorePoint).setIndexedAttributeValues(this._object, attribName, values);\n\t}\n\tstatic setIndexedAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tattribName: string,\n\t\tvalues: string[],\n\t\tindices: number[]\n\t) {\n\t\t_warnOverloadRequired('setIndexedAttribute');\n\t}\n\tsetIndexedAttribute(attribName: string, values: string[], indices: number[]) {\n\t\treturn (this.constructor as typeof CorePoint).setIndexedAttribute(this._object, attribName, values, indices);\n\t}\n\t//\n\tstatic indexedAttribValue<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tindex: number,\n\t\tattribName: string\n\t): string | null {\n\t\tconst valueIndex = this.attribValueIndex(object, index, attribName); //attrib.value()\n\t\tconst values = this.userDataAttrib(object, attribName);\n\t\treturn values ? values[valueIndex] : null;\n\t}\n\tindexedAttribValue(attribName: string): string | null {\n\t\treturn (this.constructor as typeof CorePoint).indexedAttribValue(this._object, this._index, attribName);\n\t}\n\tstatic stringAttribValue<T extends CoreObjectType>(object: ObjectContent<T>, index: number, attribName: string) {\n\t\treturn this.indexedAttribValue(object, index, attribName);\n\t}\n\tstringAttribValue(attribName: string) {\n\t\treturn this.indexedAttribValue(attribName);\n\t}\n\tstatic attribValueIndex<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tindex: number,\n\t\tattribName: string\n\t): number {\n\t\t_warnOverloadRequired('attribValueIndex');\n\t\treturn 0;\n\t}\n\tattribValueIndex(attribName: string): number {\n\t\treturn (this.constructor as typeof CorePoint).attribValueIndex(this._object, this._index, attribName);\n\t}\n\tstatic attribType<T extends CoreObjectType>(object: ObjectContent<T> | undefined, attribName: string): AttribType {\n\t\tif (this.isAttribIndexed(object, attribName)) {\n\t\t\treturn AttribType.STRING;\n\t\t} else {\n\t\t\treturn AttribType.NUMERIC;\n\t\t}\n\t}\n\tattribType(attribName: string): AttribType {\n\t\treturn (this.constructor as typeof CorePoint).attribType(this._object, attribName);\n\t}\n\tisStringAttribute(attribName: string): boolean {\n\t\treturn this.attribType(attribName) == AttribType.STRING;\n\t}\n\tsetAttribIndex(attribName: string, newValueIndex: number) {\n\t\tconst attribute = this.attribute(attribName);\n\t\tif (!attribute) {\n\t\t\treturn;\n\t\t}\n\t\tconst array = (attribute as BufferAttribute).array;\n\t\tarray[this._index] = newValueIndex;\n\t\treturn;\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\tstatic renameAttribute<T extends CoreObjectType>(object: ObjectContent<T>, oldName: string, newName: string) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tconst attribute = this.attribute(object, oldName);\n\t\tif (!attribute) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[newName] = attribute;\n\t\tdelete attributes[oldName];\n\t}\n\tstatic deleteAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tdelete attributes[attribName];\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\n\tstatic attribValue<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\tattribName: string,\n\t\ttarget?: Vector2 | Vector3 | Vector4\n\t): AttribValue {\n\t\tif (attribName === Attribute.POINT_INDEX) {\n\t\t\treturn index;\n\t\t} else {\n\t\t\tlet componentName: ComponentName | null = null;\n\t\t\tlet componentIndex: ComponentIndex | null = null;\n\t\t\tif (attribName[attribName.length - 2] === DOT) {\n\t\t\t\tcomponentName = attribName[attribName.length - 1] as ComponentName;\n\t\t\t\tcomponentIndex = COMPONENT_INDICES[componentName];\n\t\t\t\tattribName = attribName.substring(0, attribName.length - 2);\n\t\t\t}\n\t\t\tconst remapedName = CoreAttribute.remapName(attribName);\n\n\t\t\tconst attrib = this.attribute(object, remapedName);\n\t\t\tif (attrib) {\n\t\t\t\tconst {array} = attrib;\n\t\t\t\tif (this.isAttribIndexed(object, remapedName)) {\n\t\t\t\t\treturn this.indexedAttribValue(object, index, remapedName)!;\n\t\t\t\t} else {\n\t\t\t\t\tconst itemSize = attrib.itemSize;\n\t\t\t\t\tconst startIndex = index * itemSize;\n\n\t\t\t\t\tif (componentIndex == null) {\n\t\t\t\t\t\tswitch (itemSize) {\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn array[startIndex];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttarget = target || new Vector2();\n\t\t\t\t\t\t\t\ttarget.fromArray(array, startIndex);\n\t\t\t\t\t\t\t\treturn target;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttarget = target || new Vector3();\n\t\t\t\t\t\t\t\ttarget.fromArray(array, startIndex);\n\t\t\t\t\t\t\t\treturn target;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\ttarget = target || new Vector4();\n\t\t\t\t\t\t\t\ttarget.fromArray(array, startIndex);\n\t\t\t\t\t\t\t\treturn target;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow `size not valid (${itemSize})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (itemSize) {\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn array[startIndex];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\treturn array[startIndex + componentIndex];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst attributesDict = this.attributes() || {};\n\t\t\t\tconst attribNames: string[] = Object.keys(attributesDict);\n\t\t\t\tconst message = `attrib ${attribName} not found. availables are: ${attribNames.join(',')}`;\n\t\t\t\tconsole.warn(message);\n\t\t\t\tthrow message;\n\t\t\t}\n\t\t}\n\t}\n\tattribValue(attribName: string, target?: Vector2 | Vector3 | Vector4): AttribValue {\n\t\t// if (!this._object) {\n\t\t// \treturn 0;\n\t\t// }\n\t\treturn (this.constructor as typeof CorePoint<T>).attribValue(this._object, this._index, attribName, target);\n\t}\n\tattribValueNumber(attribName: string) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn attrib.array[this._index];\n\t}\n\tattribValueVector2(attribName: string, target: Vector2) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array, this._index * 2);\n\t\treturn target;\n\t}\n\tattribValueVector3(attribName: string, target: Vector3) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array, this._index * 3);\n\t\treturn target;\n\t}\n\tattribValueVector4(attribName: string, target: Vector4) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array, this._index * 4);\n\t\treturn target;\n\t}\n\n\tposition(target: Vector3): Vector3 {\n\t\t_warnOverloadRequired('position');\n\t\treturn target;\n\t}\n\tsetPosition(newPosition: Vector3) {\n\t\tthis.setAttribValueFromVector3(Attribute.POSITION, newPosition);\n\t}\n\n\tnormal(target: Vector3): Vector3 {\n\t\t_warnOverloadRequired('normal');\n\t\treturn target;\n\t}\n\tsetNormal(newNormal: Vector3) {\n\t\treturn this.setAttribValueFromVector3(Attribute.NORMAL, newNormal);\n\t}\n\tstatic computeNormals<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\t_warnOverloadRequired('computeNormals');\n\t}\n\n\tsetAttribValue(attribName: string, value: NumericAttribValue | string) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\tconst array = attrib.array;\n\t\tconst attribSize = attrib.itemSize;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < attribSize; i++) {\n\t\t\t\tarray[this._index * attribSize + i] = value[i];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (attribSize) {\n\t\t\tcase 1:\n\t\t\t\tarray[this._index] = value as number;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tconst v2 = value as Vector2Like;\n\t\t\t\tconst i2 = this._index * 2;\n\t\t\t\tarray[i2 + 0] = v2.x;\n\t\t\t\tarray[i2 + 1] = v2.y;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tconst isColor = (value as ColorLike).r != null;\n\t\t\t\tconst i3 = this._index * 3;\n\t\t\t\tif (isColor) {\n\t\t\t\t\tconst col = value as ColorLike;\n\t\t\t\t\tarray[i3 + 0] = col.r;\n\t\t\t\t\tarray[i3 + 1] = col.g;\n\t\t\t\t\tarray[i3 + 2] = col.b;\n\t\t\t\t} else {\n\t\t\t\t\tconst v3 = value as Vector3Like;\n\t\t\t\t\tarray[i3 + 0] = v3.x;\n\t\t\t\t\tarray[i3 + 1] = v3.y;\n\t\t\t\t\tarray[i3 + 2] = v3.z;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tconst v4 = value as Vector4Like;\n\t\t\t\tconst i4 = this._index * 4;\n\t\t\t\tarray[i4 + 0] = v4.x;\n\t\t\t\tarray[i4 + 1] = v4.y;\n\t\t\t\tarray[i4 + 2] = v4.z;\n\t\t\t\tarray[i4 + 3] = v4.w;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`CorePoint.setAttribValue does not yet allow attrib size ${attribSize}`);\n\t\t\t\tthrow `attrib size ${attribSize} not implemented`;\n\t\t}\n\t}\n\tsetAttribValueFromNumber(attribName: string, value: number) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\tconst array = attrib.array;\n\t\tarray[this._index] = value;\n\t}\n\tsetAttribValueFromVector2(attribName: string, value: Vector2) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || this.isStringAttribute(attribName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvalue.toArray(attrib.array, this._index * 2);\n\t}\n\tsetAttribValueFromVector3(attribName: string, value: Vector3) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || this.isStringAttribute(attribName)) {\n\t\t\treturn;\n\t\t}\n\t\tvalue.toArray(attrib.array, this._index * 3);\n\t}\n\tsetAttribValueFromVector4(attribName: string, value: Vector4) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || this.isStringAttribute(attribName)) {\n\t\t\treturn;\n\t\t}\n\t\tvalue.toArray(attrib.array, this._index * 4);\n\t}\n\n\t//\n\tstatic addAttributeFromAttribData<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribData: CoreAttributeData\n\t) {\n\t\tswitch (attribData.type()) {\n\t\t\tcase AttribType.STRING:\n\t\t\t\treturn console.log('TODO: to implement');\n\t\t\tcase AttribType.NUMERIC:\n\t\t\t\treturn this.addNumericAttribute(object, attribName, attribData.size());\n\t\t}\n\t}\n\tstatic addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: AttribSize = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\t_warnOverloadRequired('addNumericAttribute');\n\t}\n\t//\n\tstatic markAttribAsNeedsUpdate<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\t_warnOverloadRequired('markAttribAsNeedsUpdate');\n\t}\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedPrimitiveIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tpointIndex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst ids = traversedRelatedEntityData\n\t\t\t? traversedRelatedEntityData[AttribClass.VERTEX].ids\n\t\t\t: _relatedPrimitiveIds;\n\t\tthis.relatedVertexIds(object, pointIndex, ids);\n\t\tuniqRelatedEntityIds(\n\t\t\tids,\n\t\t\t(vertexId, relatedEntityIds) => {\n\t\t\t\tthis.relatedVertexClass(object).relatedPrimitiveIds(object, vertexId, relatedEntityIds);\n\t\t\t},\n\t\t\ttarget\n\t\t);\n\t}\n\tstatic override relatedPrimitiveClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn this.relatedVertexClass(object).relatedPrimitiveClass(object);\n\t}\n\tstatic override relatedObjectClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn this.relatedPrimitiveClass(object).relatedObjectClass(object);\n\t}\n\n\trelatedEntities(\n\t\tattribClass: AttribClass,\n\t\tcoreGroup: CoreGroup,\n\t\ttarget: CoreEntity[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = this;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.VERTEX: {\n\t\t\t\treturn this.relatedVertices(target as CoreEntityWithObject<T>[], traversedRelatedEntityData);\n\t\t\t}\n\t\t\tcase AttribClass.PRIMITIVE: {\n\t\t\t\treturn this.relatedPrimitives(target as CoreEntityWithObject<T>[], traversedRelatedEntityData);\n\t\t\t}\n\t\t\tcase AttribClass.OBJECT: {\n\t\t\t\tif (this._object) {\n\t\t\t\t\ttarget.length = 1;\n\t\t\t\t\ttarget[0] = coreObjectInstanceFactory(this._object) as any as CoreEntityWithObject<T>;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.length = 0;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.CORE_GROUP: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = coreGroup;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n}\n\nexport type BaseCorePoint = CorePoint<CoreObjectType>;\n","import {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {arrayCompact, arrayPushItems} from '../../../ArrayUtils';\nimport {CoreString} from '../../../String';\nimport {AttribSize, AttribType, GroupString} from '../../Constant';\nimport {corePointClassFactory, corePointInstanceFactory} from '../../CoreObjectFactory';\nimport {CoreGroup} from '../../Group';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport type {CorePoint} from './CorePoint';\nimport type {BaseCoreObject} from '../object/BaseCoreObject';\n\nconst _indices: number[] = [];\nconst _tmpPoints: CorePoint<CoreObjectType>[] = [];\n\nexport function pointsFromCoreGroup<T extends CoreObjectType>(coreGroup: CoreGroup, target: CorePoint<T>[]) {\n\treturn pointsFromObjects(coreGroup.allObjects(), target);\n}\nexport function pointsFromCoreObjects<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<CoreObjectType>[],\n\ttarget: CorePoint<T>[]\n) {\n\ttarget.length = 0;\n\tfor (const coreObject of coreObjects) {\n\t\tpointsFromObject(coreObject.object(), _tmpPoints);\n\t\tarrayPushItems(_tmpPoints, target);\n\t}\n\treturn target;\n}\nexport function pointsFromObjects<T extends CoreObjectType>(\n\tobjects: ObjectContent<CoreObjectType>[],\n\ttarget: CorePoint<T>[]\n) {\n\ttarget.length = 0;\n\tfor (const object of objects) {\n\t\tpointsFromObject(object, _tmpPoints);\n\t\tarrayPushItems(_tmpPoints, target);\n\t}\n\treturn target;\n}\nexport function pointsAttribNamesFromCoreGroup(coreGroup: CoreGroup): string[] {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn pointAttributeNames(firstObject);\n\t} else {\n\t\treturn [];\n\t}\n}\nexport function pointAttribSizesFromCoreGroup(coreGroup: CoreGroup): PolyDictionary<AttribSize> {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn pointAttributeSizes(firstObject);\n\t} else {\n\t\treturn {};\n\t}\n}\nexport function pointAttribTypesFromCoreGroup(coreGroup: CoreGroup): PolyDictionary<AttribType> {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn pointAttributeTypes(firstObject);\n\t} else {\n\t\treturn {};\n\t}\n}\n\nexport function pointsCountFromObject<T extends CoreObjectType>(object: ObjectContent<T>): number {\n\tconst pointClass = corePointClassFactory(object);\n\treturn pointClass.entitiesCount(object);\n}\nexport function pointsFromObject<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\ttarget: CorePoint<T>[]\n): CorePoint<T>[] {\n\tconst pointClass = corePointClassFactory(object);\n\tconst pointsCount = pointClass.entitiesCount(object);\n\ttarget.length = pointsCount;\n\tfor (let i = 0; i < pointsCount; i++) {\n\t\ttarget[i] = corePointInstanceFactory(object, i);\n\t}\n\treturn target;\n}\n\nexport function pointsFromObjectFromGroup<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tgroup: GroupString,\n\ttarget: CorePoint<T>[]\n): void {\n\tif (group) {\n\t\tCoreString.indices(group, _indices);\n\t\tconst points = pointsFromObject(object, _tmpPoints);\n\t\tconst compactPoints: CorePoint<T>[] = [];\n\t\tconst selectedPoints = arrayCompact(\n\t\t\t_indices.map((i) => points[i]),\n\t\t\tcompactPoints\n\t\t);\n\t\ttarget.length = 0;\n\t\tarrayPushItems(selectedPoints, target);\n\t} else {\n\t\tpointsFromObject(object, target);\n\t}\n}\n\nexport function hasPointAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): boolean {\n\tconst pointClass = corePointClassFactory(object);\n\tconst attributes = pointClass.attributes(object);\n\tif (!attributes) {\n\t\treturn false;\n\t}\n\treturn attribName in attributes;\n}\nexport function pointAttributeNames<T extends CoreObjectType>(object: ObjectContent<T>): string[] {\n\tconst pointClass = corePointClassFactory(object);\n\tconst attributes = pointClass.attributes(object);\n\tif (!attributes) {\n\t\treturn [];\n\t}\n\treturn Object.keys(attributes);\n}\nexport function pointAttributeSize<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): number {\n\tconst pointClass = corePointClassFactory(object);\n\tconst attributes = pointClass.attributes(object);\n\tif (!attributes) {\n\t\treturn 0;\n\t}\n\treturn attributes[attribName].itemSize;\n}\nexport function pointAttributeSizes<T extends CoreObjectType>(object: ObjectContent<T>): PolyDictionary<AttribSize> {\n\tconst pointClass = corePointClassFactory(object);\n\tconst attributes = pointClass.attributes(object);\n\tif (!attributes) {\n\t\treturn {};\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tconst h: PolyDictionary<AttribSize> = {};\n\tfor (const attribName of attribNames) {\n\t\th[attribName] = attributes[attribName].itemSize;\n\t}\n\treturn h;\n}\nexport function pointAttributeType<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): AttribType {\n\tconst pointClass = corePointClassFactory(object);\n\tconst attributes = pointClass.attributes(object);\n\tif (!attributes) {\n\t\treturn AttribType.NUMERIC;\n\t}\n\treturn pointClass.attribType(object, attribName);\n}\nexport function pointAttributeTypes<T extends CoreObjectType>(object: ObjectContent<T>): PolyDictionary<AttribType> {\n\tconst pointClass = corePointClassFactory(object);\n\tconst attributes = pointClass.attributes(object);\n\tif (!attributes) {\n\t\treturn {};\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tconst h: PolyDictionary<AttribType> = {};\n\tfor (const attribName of attribNames) {\n\t\th[attribName] = pointClass.attribType(object, attribName);\n\t}\n\treturn h;\n}\n","import {\n\tAttribValue,\n\tColorLike,\n\tNumericAttribValue,\n\tVector2Like,\n\tVector3Like,\n\tVector4Like,\n} from '../../../../types/GlobalTypes';\nimport {Vector4, Vector3, Vector2} from 'three';\nimport {Attribute, CoreAttribute} from '../../Attribute';\nimport {CoreEntity, CoreEntityWithObject} from '../../CoreEntity';\nimport {isArray} from '../../../Type';\nimport {BasePrimitiveAttribute} from './PrimitiveAttribute';\nimport {\n\tDOT,\n\tComponentName,\n\tCOMPONENT_INDICES,\n\tGroupString,\n\tAttribClass,\n\tAttribSize,\n\tAttribType,\n\tComponentIndex,\n} from '../../Constant';\nimport {PrimitiveAttributesDict} from './Common';\nimport {CoreObjectType, ObjectContent, ObjectBuilder} from '../../ObjectContent';\nimport {TypeAssert} from '../../../../engine/poly/Assert';\nimport {uniqRelatedEntityIds} from '../utils/Common';\nimport type {CoreVertex} from '../vertex/CoreVertex';\nimport type {CoreGroup} from '../../Group';\nimport type {PrimitiveGraph} from './PrimitiveGraph';\nimport {CorePoint} from '../point/CorePoint';\nimport {TraversedRelatedEntityData} from '../utils/TraversedRelatedEntities';\n\nfunction _warnOverloadRequired(functionName: string) {\n\tconsole.warn(`CorePrimitive.${functionName} needs to be overloaded`);\n}\nconst _ids: number[] = [];\nexport abstract class CorePrimitive<T extends CoreObjectType> extends CoreEntityWithObject<T> {\n\tbuilder<T extends CoreObjectType>(): ObjectBuilder<T> | undefined {\n\t\treturn undefined;\n\t}\n\tstatic entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn 0;\n\t}\n\n\tstatic addAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribute: BasePrimitiveAttribute\n\t) {\n\t\t_warnOverloadRequired('addAttribute');\n\t}\n\tstatic addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: AttribSize = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\t_warnOverloadRequired('addNumericAttribute');\n\t}\n\n\tstatic attributes<T extends CoreObjectType>(object?: ObjectContent<T>): PrimitiveAttributesDict | undefined {\n\t\t_warnOverloadRequired('attributes');\n\t\treturn;\n\t}\n\tattributes(): PrimitiveAttributesDict | undefined {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\treturn (this.constructor as typeof CorePrimitive<T>).attributes(this._object);\n\t}\n\tstatic attribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string\n\t): BasePrimitiveAttribute | undefined {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\treturn attributes[attribName];\n\t}\n\tattribute(attribName: string): BasePrimitiveAttribute | undefined {\n\t\tif (!this._object) {\n\t\t\treturn;\n\t\t}\n\t\treturn (this.constructor as typeof CorePrimitive<T>).attribute(this._object, attribName);\n\t}\n\tstatic renameAttribute<T extends CoreObjectType>(object: ObjectContent<T>, oldName: string, newName: string) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tconst attribute = this.attribute(object, oldName);\n\t\tif (!attribute) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[newName] = attribute;\n\t\tdelete attributes[oldName];\n\t}\n\tstatic deleteAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tdelete attributes[attribName];\n\t}\n\tstatic attribSize<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): number {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn -1;\n\t\t}\n\t\tattribName = CoreAttribute.remapName(attribName);\n\t\treturn attributes[attribName].itemSize || 0;\n\t}\n\n\tattribSize(attribName: string): number {\n\t\tif (!this._object) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn (this.constructor as typeof CorePrimitive<T>).attribSize(this._object, attribName);\n\t}\n\tstatic hasAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): boolean {\n\t\tconst remappedName = CoreAttribute.remapName(attribName);\n\t\treturn this.attributes(object) ? this.attributes(object)![remappedName] != null : false;\n\t}\n\thasAttribute(attribName: string): boolean {\n\t\tif (!this._object) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (this.constructor as typeof CorePrimitive<T>).hasAttribute(this._object, attribName);\n\t}\n\tstatic attributeNames<T extends CoreObjectType>(object?: ObjectContent<T>): string[] {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys(attributes);\n\t}\n\tstatic attributeNamesMatchingMask<T extends CoreObjectType>(object: ObjectContent<T>, masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.attributeNames(object));\n\t}\n\tstatic attribValue<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\tattribName: string,\n\t\ttarget?: Vector2 | Vector3 | Vector4\n\t): AttribValue {\n\t\tif (attribName === Attribute.PRIMITIVE_INDEX) {\n\t\t\treturn index;\n\t\t}\n\t\tlet componentName: ComponentName | null = null;\n\t\tlet componentIndex: ComponentIndex | null = null;\n\t\tif (attribName[attribName.length - 2] === DOT) {\n\t\t\tcomponentName = attribName[attribName.length - 1] as ComponentName;\n\t\t\tcomponentIndex = COMPONENT_INDICES[componentName];\n\t\t\tattribName = attribName.substring(0, attribName.length - 2);\n\t\t}\n\t\tconst remapedName = CoreAttribute.remapName(attribName);\n\n\t\tif (remapedName == Attribute.POSITION) {\n\t\t\treturn this.position(object, index, target as Vector3);\n\t\t}\n\t\tif (remapedName == Attribute.NORMAL) {\n\t\t\treturn this.normal(object, index, target as Vector3);\n\t\t}\n\n\t\tconst attrib = this.attribute(object, remapedName);\n\n\t\tif (attrib) {\n\t\t\tconst {array} = attrib;\n\n\t\t\tconst itemSize = attrib.itemSize;\n\t\t\tconst startIndex = index * itemSize;\n\n\t\t\tif (componentIndex == null) {\n\t\t\t\tswitch (itemSize) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\treturn array[startIndex];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\ttarget = target || new Vector2();\n\t\t\t\t\t\ttarget.fromArray(array as number[], startIndex);\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\ttarget = target || new Vector3();\n\t\t\t\t\t\ttarget.fromArray(array as number[], startIndex);\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\ttarget = target || new Vector4();\n\t\t\t\t\t\ttarget.fromArray(array as number[], startIndex);\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow `size not valid (${itemSize})`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (itemSize) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\treturn array[startIndex];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn array[startIndex + componentIndex];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// }\n\t\t} else {\n\t\t\tconst attributesDict = this.attributes(object) || {};\n\t\t\tconst attribNames: string[] = Object.keys(attributesDict);\n\t\t\tconst message = `attrib ${attribName} not found. availables are: ${attribNames.join(',')}`;\n\t\t\tconsole.warn(message);\n\t\t\tthrow message;\n\t\t}\n\t}\n\tattribValue(attribName: string, target?: Vector2 | Vector3 | Vector4): AttribValue {\n\t\tif (!this._object) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn (this.constructor as typeof CorePrimitive<T>).attribValue(this._object, this._index, attribName, target);\n\t}\n\tattribValueNumber(attribName: string) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn attrib.array[this._index];\n\t}\n\tattribValueVector2(attribName: string, target: Vector2) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array as number[], this._index * 2);\n\t\treturn target;\n\t}\n\tattribValueVector3(attribName: string, target: Vector3) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array as number[], this._index * 3);\n\t\treturn target;\n\t}\n\tattribValueVector4(attribName: string, target: Vector4) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array as number[], this._index * 4);\n\t\treturn target;\n\t}\n\tstatic attribType<T extends CoreObjectType>(object: ObjectContent<T> | undefined, attribName: string): AttribType {\n\t\tconst attribute = object ? this.attribute(object, attribName) : null;\n\t\tif (attribute && attribute?.isString == true) {\n\t\t\treturn AttribType.STRING;\n\t\t} else {\n\t\t\treturn AttribType.NUMERIC;\n\t\t}\n\t}\n\tattribType(attribName: string): AttribType {\n\t\treturn (this.constructor as typeof CorePrimitive).attribType(this._object, attribName);\n\t}\n\tstatic stringAttribValue<T extends CoreObjectType>(object: ObjectContent<T>, index: number, attribName: string) {\n\t\treturn this.attribValue(object, index, attribName);\n\t}\n\tstringAttribValue(attribName: string) {\n\t\treturn this.attribValue(attribName) as string;\n\t}\n\n\t// setPosition(newPosition: Vector3) {\n\t// \tthis.setAttribValueFromVector3(Attribute.POSITION, newPosition);\n\t// }\n\n\t// setNormal(newNormal: Vector3) {\n\t// \treturn this.setAttribValueFromVector3(Attribute.NORMAL, newNormal);\n\t// }\n\tstatic position<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\t_warnOverloadRequired('position');\n\t\treturn target;\n\t}\n\tstatic normal<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\t_warnOverloadRequired('normal');\n\t\treturn target;\n\t}\n\n\tstatic computeVertexNormalsIfAttributeVersionChanged<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\t_warnOverloadRequired('computeVertexNormalsIfAttributeVersionChanged');\n\t}\n\n\tsetAttribValue(attribName: string, value: NumericAttribValue | string) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\tconsole.warn(`no attribute ${attribName}`);\n\t\t\treturn;\n\t\t}\n\t\tconst array = attrib.array;\n\t\tconst attribSize = attrib.itemSize;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < attribSize; i++) {\n\t\t\t\tarray[this._index * attribSize + i] = value[i];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (attribSize) {\n\t\t\tcase 1:\n\t\t\t\tarray[this._index] = value as number | string;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tconst v2 = value as Vector2Like;\n\t\t\t\tconst i2 = this._index * 2;\n\t\t\t\tarray[i2 + 0] = v2.x;\n\t\t\t\tarray[i2 + 1] = v2.y;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tconst isColor = (value as ColorLike).r != null;\n\t\t\t\tconst i3 = this._index * 3;\n\t\t\t\tif (isColor) {\n\t\t\t\t\tconst col = value as ColorLike;\n\t\t\t\t\tarray[i3 + 0] = col.r;\n\t\t\t\t\tarray[i3 + 1] = col.g;\n\t\t\t\t\tarray[i3 + 2] = col.b;\n\t\t\t\t} else {\n\t\t\t\t\tconst v3 = value as Vector3Like;\n\t\t\t\t\tarray[i3 + 0] = v3.x;\n\t\t\t\t\tarray[i3 + 1] = v3.y;\n\t\t\t\t\tarray[i3 + 2] = v3.z;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tconst v4 = value as Vector4Like;\n\t\t\t\tconst i4 = this._index * 4;\n\t\t\t\tarray[i4 + 0] = v4.x;\n\t\t\t\tarray[i4 + 1] = v4.y;\n\t\t\t\tarray[i4 + 2] = v4.z;\n\t\t\t\tarray[i4 + 3] = v4.w;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`CorePrimitive.setAttribValue does not yet allow attribSize ${attribSize}`);\n\t\t\t\tthrow `attrib size ${attribSize} not implemented`;\n\t\t}\n\t}\n\tsetAttribValueFromNumber(attribName: string, value: number) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\tconst array = attrib.array as number[];\n\t\tarray[this._index] = value;\n\t}\n\tsetAttribValueFromVector2(attribName: string, value: Vector2) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || attrib.isString == true) {\n\t\t\treturn;\n\t\t}\n\n\t\tvalue.toArray(attrib.array as number[], this._index * 2);\n\t}\n\tsetAttribValueFromVector3(attribName: string, value: Vector3) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || attrib.isString == true) {\n\t\t\treturn;\n\t\t}\n\t\tvalue.toArray(attrib.array as number[], this._index * 3);\n\t}\n\tsetAttribValueFromVector4(attribName: string, value: Vector4) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || attrib.isString == true) {\n\t\t\treturn;\n\t\t}\n\t\tvalue.toArray(attrib.array as number[], this._index * 4);\n\t}\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedPointIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tpointIndex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst ids = traversedRelatedEntityData ? traversedRelatedEntityData[AttribClass.VERTEX].ids : _ids;\n\n\t\tthis.relatedVertexIds(object, pointIndex, ids);\n\t\tuniqRelatedEntityIds(\n\t\t\tids,\n\t\t\t(vertexId, relatedEntityIds) => {\n\t\t\t\tthis.relatedVertexClass(object).relatedPointIds(object, vertexId, relatedEntityIds);\n\t\t\t},\n\t\t\ttarget\n\t\t);\n\t}\n\n\tstatic override relatedPointClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn this.relatedVertexClass(object).relatedPointClass(object);\n\t}\n\n\trelatedEntities(\n\t\tattribClass: AttribClass,\n\t\tcoreGroup: CoreGroup,\n\t\ttarget: CoreEntity[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT: {\n\t\t\t\tthis.relatedPoints(target as CorePoint<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.VERTEX: {\n\t\t\t\tthis.relatedVertices(target as CoreVertex<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.PRIMITIVE: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = this;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.OBJECT: {\n\t\t\t\tthis.relatedObjects(target as CoreEntityWithObject<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.CORE_GROUP: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = coreGroup;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n\tstatic graph(object: ObjectContent<CoreObjectType>): PrimitiveGraph | undefined {\n\t\tconsole.warn('CorePrimitive.graph needs to be overriden');\n\t\treturn undefined;\n\t}\n}\n","import {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {arrayPushItems} from '../../../ArrayUtils';\nimport {stringToIndices} from '../../../String';\nimport {AttribSize, AttribType, GroupString} from '../../Constant';\nimport {corePrimitiveClassFactory, corePrimitiveInstanceFactory} from '../../CoreObjectFactory';\nimport {CoreGroup} from '../../Group';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {CorePrimitive} from './CorePrimitive';\n\nconst _indices: number[] = [];\nconst _tmpPrimitives: CorePrimitive<CoreObjectType>[] = [];\n\nexport function primitives<T extends CoreObjectType>(coreGroup: CoreGroup, target: CorePrimitive<T>[]) {\n\tconst allObjects = coreGroup.allObjects();\n\n\ttarget.length = 0;\n\tfor (const object of allObjects) {\n\t\tprimitivesFromObject(object, _tmpPrimitives);\n\t\tarrayPushItems(_tmpPrimitives, target);\n\t}\n\treturn target;\n\t// return coreGroup\n\t// \t.allCoreObjects()\n\t// \t.map((o) => primitivesFromObject(o.object()))\n\t// \t.flat();\n}\nexport function primitiveAttribNamesFromCoreGroup(coreGroup: CoreGroup): string[] {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn primitiveAttributeNames(firstObject);\n\t} else {\n\t\treturn [];\n\t}\n}\nexport function primitiveAttribSizesFromCoreGroup(coreGroup: CoreGroup): PolyDictionary<AttribSize> {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn primitiveAttributeSizes(firstObject);\n\t} else {\n\t\treturn {};\n\t}\n}\nexport function primitiveAttribTypesFromCoreGroup(coreGroup: CoreGroup): PolyDictionary<AttribType> {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn primitiveAttributeTypes(firstObject);\n\t} else {\n\t\treturn {};\n\t}\n}\nexport function primitivesCountFromObject<T extends CoreObjectType>(object: ObjectContent<T>): number {\n\tconst primitiveClass = corePrimitiveClassFactory(object);\n\treturn primitiveClass.entitiesCount(object);\n}\nexport function primitivesFromObject<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\ttarget: CorePrimitive<T>[]\n): CorePrimitive<T>[] {\n\tconst primitiveClass = corePrimitiveClassFactory(object);\n\tconst primitivesCount = primitiveClass.entitiesCount(object);\n\ttarget.length = primitivesCount;\n\tfor (let i = 0; i < primitivesCount; i++) {\n\t\ttarget[i] = corePrimitiveInstanceFactory(object, i);\n\t}\n\treturn target;\n}\nexport function primitivesFromObjectFromGroup<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tgroup: GroupString,\n\ttarget: CorePrimitive<T>[]\n): CorePrimitive<T>[] {\n\tif (group) {\n\t\tstringToIndices(group, _indices);\n\t\tprimitivesFromObject(object, _tmpPrimitives);\n\t\ttarget.length = 0;\n\t\tfor (const index of _indices) {\n\t\t\tconst primitive = _tmpPrimitives[index] as CorePrimitive<T> | undefined;\n\t\t\tif (primitive) {\n\t\t\t\ttarget.push(primitive);\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t} else {\n\t\treturn primitivesFromObject(object, target);\n\t}\n}\nexport function primitiveAttributeNames<T extends CoreObjectType>(object: ObjectContent<T>): string[] {\n\tconst primitiveClass = corePrimitiveClassFactory(object);\n\tconst attributes = primitiveClass.attributes(object);\n\tif (!attributes) {\n\t\treturn [];\n\t}\n\treturn Object.keys(attributes);\n}\nexport function primitiveAttributeSizes<T extends CoreObjectType>(\n\tobject: ObjectContent<T>\n): PolyDictionary<AttribSize> {\n\tconst primitiveClass = corePrimitiveClassFactory(object);\n\tconst attributes = primitiveClass.attributes(object);\n\tif (!attributes) {\n\t\treturn {};\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tconst h: PolyDictionary<AttribSize> = {};\n\tfor (const attribName of attribNames) {\n\t\th[attribName] = attributes[attribName].itemSize;\n\t}\n\treturn h;\n}\nexport function primitiveAttributeTypes<T extends CoreObjectType>(\n\tobject: ObjectContent<T>\n): PolyDictionary<AttribType> {\n\tconst primitiveClass = corePrimitiveClassFactory(object);\n\tconst attributes = primitiveClass.attributes(object);\n\tif (!attributes) {\n\t\treturn {};\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tconst h: PolyDictionary<AttribType> = {};\n\tfor (const attribName of attribNames) {\n\t\th[attribName] = attributes[attribName].isString == true ? AttribType.STRING : AttribType.NUMERIC;\n\t}\n\treturn h;\n}\n","export abstract class PrimitiveGraph {\n\tabstract neighboursCount(primitiveIndex: number, withSharedEdge: boolean): number;\n\tabstract neighbourIndex(primitiveIndex: number, neighbourIndex: number, withSharedEdge: boolean): number;\n}\n","import {CoreEntity} from '../../CoreEntity';\nimport {\n\tAttribValue,\n\tNumericAttribValue,\n\tVector2Like,\n\tVector3Like,\n\tVector4Like,\n\tColorLike,\n} from '../../../../types/GlobalTypes';\nimport {Color, Vector2, Vector3, Vector4} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {AttribSize} from '../../Constant';\nimport {isNumber, isArray} from '../../../Type';\n\ntype GetRelatedCallback<T extends CoreEntity, E extends CoreEntity> = (entity: T) => E[];\ntype GetRelatedIdCallback<E extends CoreEntity> = (id: number, target: number[]) => void;\n\nexport function uniqRelatedEntities<T extends CoreEntity, E extends CoreEntity>(\n\tentities: T[],\n\tcallback: GetRelatedCallback<T, E>,\n\ttarget: E[]\n): void {\n\ttarget.length = 0;\n\tconst entityByIndex: Map<number, E> = new Map();\n\tfor (const entity of entities) {\n\t\tconst relatedEntities = callback(entity);\n\t\tfor (const relatedEntity of relatedEntities) {\n\t\t\tlet newEntity = entityByIndex.get(relatedEntity.index());\n\t\t\tif (!newEntity) {\n\t\t\t\tnewEntity = relatedEntity;\n\t\t\t\tentityByIndex.set(newEntity.index(), newEntity);\n\t\t\t}\n\t\t}\n\t}\n\tentityByIndex.forEach((entity) => {\n\t\ttarget.push(entity);\n\t});\n}\nconst _relatedEntityIds: number[] = [];\nconst _entityIndices: Set<number> = new Set();\nexport function uniqRelatedEntityIds<E extends CoreEntity>(\n\tentityIds: number[],\n\tcallback: GetRelatedIdCallback<E>,\n\ttarget: number[]\n): void {\n\ttarget.length = 0;\n\t_entityIndices.clear();\n\tfor (const entityId of entityIds) {\n\t\tcallback(entityId, _relatedEntityIds);\n\t\tfor (const _relatedEntityId of _relatedEntityIds) {\n\t\t\t_entityIndices.add(_relatedEntityId);\n\t\t}\n\t}\n\t_entityIndices.forEach((entityId) => {\n\t\ttarget.push(entityId);\n\t});\n}\n\nexport function attribValueNonPrimitive(src: AttribValue) {\n\treturn src instanceof Color || src instanceof Vector2 || src instanceof Vector3 || src instanceof Vector4;\n}\nexport function copyAttribValue(src: AttribValue, target: AttribValue) {\n\tif (target instanceof Color && src instanceof Color) {\n\t\ttarget.copy(src);\n\t}\n\tif (target instanceof Vector2 && src instanceof Vector2) {\n\t\ttarget.copy(src);\n\t}\n\tif (target instanceof Vector3 && src instanceof Vector3) {\n\t\ttarget.copy(src);\n\t}\n\tif (target instanceof Vector4 && src instanceof Vector4) {\n\t\ttarget.copy(src);\n\t}\n}\n\nexport function cloneAttribValue(src: AttribValue) {\n\tif (src instanceof Color) {\n\t\treturn src.clone();\n\t}\n\tif (src instanceof Vector2) {\n\t\treturn src.clone();\n\t}\n\tif (src instanceof Vector3) {\n\t\treturn src.clone();\n\t}\n\tif (src instanceof Vector4) {\n\t\treturn src.clone();\n\t}\n}\n\nexport interface AttributeNumericValuesOptions {\n\tattributeAdded: boolean;\n\tvalues: number[];\n}\ntype EntitiesCountFunction<T extends CoreObjectType> = (object: ObjectContent<T>) => number;\nexport function attributeNumericValues<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tentitiesCountFunction: EntitiesCountFunction<T>,\n\tattribSize: AttribSize = 1,\n\tdefaultValue: NumericAttribValue = 0,\n\ttarget: AttributeNumericValuesOptions\n) {\n\ttarget.values.length = 0;\n\tconst values = target.values;\n\tconst entitiesCount = entitiesCountFunction(object);\n\n\tif (isNumber(defaultValue)) {\n\t\t// adding number\n\t\tfor (let i = 0; i < entitiesCount; i++) {\n\t\t\tfor (let j = 0; j < attribSize; j++) {\n\t\t\t\tvalues.push(defaultValue);\n\t\t\t}\n\t\t}\n\t\ttarget.attributeAdded = true;\n\t} else {\n\t\tif (attribSize > 1) {\n\t\t\tif (isArray(defaultValue)) {\n\t\t\t\t// adding array\n\t\t\t\tfor (let i = 0; i < entitiesCount; i++) {\n\t\t\t\t\tfor (let j = 0; j < attribSize; j++) {\n\t\t\t\t\t\tvalues.push(defaultValue[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttarget.attributeAdded = true;\n\t\t\t} else {\n\t\t\t\t// adding Vector2\n\t\t\t\tconst vec2 = defaultValue as Vector2Like;\n\t\t\t\tif (attribSize == 2 && vec2.x != null && vec2.y != null) {\n\t\t\t\t\tfor (let i = 0; i < entitiesCount; i++) {\n\t\t\t\t\t\tvalues.push(vec2.x);\n\t\t\t\t\t\tvalues.push(vec2.y);\n\t\t\t\t\t}\n\t\t\t\t\ttarget.attributeAdded = true;\n\t\t\t\t}\n\t\t\t\t// adding Vector3\n\t\t\t\tconst vec3 = defaultValue as Vector3Like;\n\t\t\t\tif (attribSize == 3 && vec3.x != null && vec3.y != null && vec3.z != null) {\n\t\t\t\t\tfor (let i = 0; i < entitiesCount; i++) {\n\t\t\t\t\t\tvalues.push(vec3.x);\n\t\t\t\t\t\tvalues.push(vec3.y);\n\t\t\t\t\t\tvalues.push(vec3.z);\n\t\t\t\t\t}\n\t\t\t\t\ttarget.attributeAdded = true;\n\t\t\t\t}\n\t\t\t\t// adding Color\n\t\t\t\tconst col = defaultValue as ColorLike;\n\t\t\t\tif (attribSize == 3 && col.r != null && col.g != null && col.b != null) {\n\t\t\t\t\tfor (let i = 0; i < entitiesCount; i++) {\n\t\t\t\t\t\tvalues.push(col.r);\n\t\t\t\t\t\tvalues.push(col.g);\n\t\t\t\t\t\tvalues.push(col.b);\n\t\t\t\t\t}\n\t\t\t\t\ttarget.attributeAdded = true;\n\t\t\t\t}\n\t\t\t\t// adding Vector4\n\t\t\t\tconst vec4 = defaultValue as Vector4Like;\n\t\t\t\tif (attribSize == 4 && vec4.x != null && vec4.y != null && vec4.z != null && vec4.w != null) {\n\t\t\t\t\tfor (let i = 0; i < entitiesCount; i++) {\n\t\t\t\t\t\tvalues.push(vec4.x);\n\t\t\t\t\t\tvalues.push(vec4.y);\n\t\t\t\t\t\tvalues.push(vec4.z);\n\t\t\t\t\t\tvalues.push(vec4.w);\n\t\t\t\t\t}\n\t\t\t\t\ttarget.attributeAdded = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {\n\tAttribValue,\n\tColorLike,\n\tNumericAttribValue,\n\tVector2Like,\n\tVector3Like,\n\tVector4Like,\n} from '../../../../types/GlobalTypes';\nimport {Vector4, Vector3, Vector2, BufferAttribute} from 'three';\nimport {Attribute, CoreAttribute} from '../../Attribute';\nimport {CoreEntity, CoreEntityWithObject} from '../../CoreEntity';\nimport {isArray} from '../../../Type';\nimport {BaseVertexAttribute} from './VertexAttribute';\nimport {\n\tDOT,\n\tComponentName,\n\tCOMPONENT_INDICES,\n\tGroupString,\n\tAttribClass,\n\tAttribSize,\n\tAttribType,\n\tComponentIndex,\n} from '../../Constant';\nimport {VertexAttributesDict} from './Common';\nimport {CoreObjectType, ObjectBuilder, ObjectContent} from '../../ObjectContent';\nimport type {CorePoint} from '../point/CorePoint';\nimport type {CorePrimitive} from '../primitive/CorePrimitive';\nimport {TypeAssert} from '../../../../engine/poly/Assert';\nimport {CoreGroup} from '../../Group';\nimport {TraversedRelatedEntityData} from '../utils/TraversedRelatedEntities';\n\nfunction _warnOverloadRequired(functionName: string) {\n\tconsole.warn(`CoreVertex.${functionName} needs to be overloaded`);\n}\nexport abstract class CoreVertex<T extends CoreObjectType> extends CoreEntityWithObject<T> {\n\tbuilder<T extends CoreObjectType>(): ObjectBuilder<T> | undefined {\n\t\treturn undefined;\n\t}\n\n\tstatic addAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribute: BaseVertexAttribute\n\t) {\n\t\t_warnOverloadRequired('addAttribute');\n\t}\n\tstatic addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: AttribSize = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\t_warnOverloadRequired('addNumericAttribute');\n\t}\n\n\tstatic entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn 0;\n\t}\n\n\tstatic attributes<T extends CoreObjectType>(object?: ObjectContent<T>): VertexAttributesDict | undefined {\n\t\t_warnOverloadRequired('attributes');\n\t\treturn;\n\t}\n\tattributes(): VertexAttributesDict | undefined {\n\t\treturn (this.constructor as typeof CoreVertex<T>).attributes(this._object);\n\t}\n\tstatic attribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string\n\t): BaseVertexAttribute | undefined {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\treturn attributes[attribName];\n\t}\n\tattribute(attribName: string): BaseVertexAttribute | undefined {\n\t\treturn (this.constructor as typeof CoreVertex<T>).attribute(this._object, attribName);\n\t}\n\tstatic indexAttribute<T extends CoreObjectType>(object: ObjectContent<T>): BufferAttribute | undefined | null {\n\t\t_warnOverloadRequired('indexAttribute');\n\t\treturn;\n\t}\n\tstatic setIndexAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: BufferAttribute | number[]\n\t): BufferAttribute | undefined {\n\t\tconsole.warn('CoreVertex.setIndexAttribute needs to be overloaded');\n\t\treturn;\n\t}\n\tstatic renameAttribute<T extends CoreObjectType>(object: ObjectContent<T>, oldName: string, newName: string) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tconst attribute = this.attribute(object, oldName);\n\t\tif (!attribute) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[newName] = attribute;\n\t\tdelete attributes[oldName];\n\t}\n\tstatic deleteAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tdelete attributes[attribName];\n\t}\n\tstatic attribSize<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): number {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn -1;\n\t\t}\n\t\tattribName = CoreAttribute.remapName(attribName);\n\t\treturn attributes[attribName].itemSize || 0;\n\t}\n\n\tattribSize(attribName: string): number {\n\t\treturn (this.constructor as typeof CoreVertex<T>).attribSize(this._object, attribName);\n\t}\n\tstatic hasAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string): boolean {\n\t\treturn this.attribute(object, attribName) != null;\n\t}\n\thasAttribute(attribName: string): boolean {\n\t\treturn (this.constructor as typeof CoreVertex<T>).hasAttribute(this._object, attribName);\n\t}\n\tstatic attributeNames<T extends CoreObjectType>(object?: ObjectContent<T>): string[] {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys(attributes);\n\t}\n\tstatic attributeNamesMatchingMask<T extends CoreObjectType>(object: ObjectContent<T>, masksString: GroupString) {\n\t\treturn CoreAttribute.attribNamesMatchingMask(masksString, this.attributeNames(object));\n\t}\n\tstatic attribValue<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\tattribName: string,\n\t\ttarget?: Vector2 | Vector3 | Vector4\n\t): AttribValue {\n\t\tif (attribName === Attribute.VERTEX_INDEX) {\n\t\t\treturn index;\n\t\t} else {\n\t\t\tlet componentName: ComponentName | null = null;\n\t\t\tlet componentIndex: ComponentIndex | null = null;\n\t\t\tif (attribName[attribName.length - 2] === DOT) {\n\t\t\t\tcomponentName = attribName[attribName.length - 1] as ComponentName;\n\t\t\t\tcomponentIndex = COMPONENT_INDICES[componentName];\n\t\t\t\tattribName = attribName.substring(0, attribName.length - 2);\n\t\t\t}\n\t\t\tconst remapedName = CoreAttribute.remapName(attribName);\n\n\t\t\tconst attrib = this.attribute(object, remapedName);\n\t\t\tif (attrib) {\n\t\t\t\tconst {array} = attrib;\n\n\t\t\t\tconst itemSize = attrib.itemSize;\n\t\t\t\tconst startIndex = index * itemSize;\n\n\t\t\t\tif (componentIndex == null) {\n\t\t\t\t\tswitch (itemSize) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\treturn array[startIndex];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\ttarget = target || new Vector2();\n\t\t\t\t\t\t\ttarget.fromArray(array as number[], startIndex);\n\t\t\t\t\t\t\treturn target;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\ttarget = target || new Vector3();\n\t\t\t\t\t\t\ttarget.fromArray(array as number[], startIndex);\n\t\t\t\t\t\t\treturn target;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\ttarget = target || new Vector4();\n\t\t\t\t\t\t\ttarget.fromArray(array as number[], startIndex);\n\t\t\t\t\t\t\treturn target;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow `size not valid (${itemSize})`;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch (itemSize) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\treturn array[startIndex];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn array[startIndex + componentIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tconst attributesDict = this.attributes() || {};\n\t\t\t\tconst attribNames: string[] = Object.keys(attributesDict);\n\t\t\t\tconst message = `attrib ${attribName} not found. availables are: ${attribNames.join(',')}`;\n\t\t\t\tconsole.warn(message);\n\t\t\t\tthrow message;\n\t\t\t}\n\t\t}\n\t}\n\tattribValue(attribName: string, target?: Vector2 | Vector3 | Vector4): AttribValue {\n\t\treturn (this.constructor as typeof CoreVertex<T>).attribValue(this._object, this._index, attribName, target);\n\t}\n\tattribValueNumber(attribName: string) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn attrib.array[this._index];\n\t}\n\tattribValueVector2(attribName: string, target: Vector2) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array as number[], this._index * 2);\n\t\treturn target;\n\t}\n\tattribValueVector3(attribName: string, target: Vector3) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array as number[], this._index * 3);\n\t\treturn target;\n\t}\n\tattribValueVector4(attribName: string, target: Vector4) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.fromArray(attrib.array as number[], this._index * 4);\n\t\treturn target;\n\t}\n\tstatic attribType<T extends CoreObjectType>(object: ObjectContent<T> | undefined, attribName: string): AttribType {\n\t\tconst attribute = object ? this.attribute(object, attribName) : null;\n\t\tif (attribute && attribute?.isString == true) {\n\t\t\treturn AttribType.STRING;\n\t\t} else {\n\t\t\treturn AttribType.NUMERIC;\n\t\t}\n\t}\n\tattribType(attribName: string): AttribType {\n\t\treturn (this.constructor as typeof CorePrimitive).attribType(this._object, attribName);\n\t}\n\tstatic stringAttribValue<T extends CoreObjectType>(object: ObjectContent<T>, index: number, attribName: string) {\n\t\treturn this.attribValue(object, index, attribName);\n\t}\n\tstringAttribValue(attribName: string) {\n\t\treturn this.attribValue(attribName) as string;\n\t}\n\n\tposition(target: Vector3): Vector3 {\n\t\t_warnOverloadRequired('position');\n\t\treturn target;\n\t}\n\tsetPosition(newPosition: Vector3) {\n\t\tthis.setAttribValueFromVector3(Attribute.POSITION, newPosition);\n\t}\n\n\tnormal(target: Vector3): Vector3 {\n\t\t_warnOverloadRequired('normal');\n\t\treturn target;\n\t}\n\tsetNormal(newNormal: Vector3) {\n\t\treturn this.setAttribValueFromVector3(Attribute.NORMAL, newNormal);\n\t}\n\n\tsetAttribValue(attribName: string, value: NumericAttribValue | string) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\tconsole.warn(`no attribute ${attribName}`);\n\t\t\treturn;\n\t\t}\n\t\tconst array = attrib.array;\n\t\tconst attribSize = attrib.itemSize;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < attribSize; i++) {\n\t\t\t\tarray[this._index * attribSize + i] = value[i];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (attribSize) {\n\t\t\tcase 1:\n\t\t\t\tarray[this._index] = value as number | string;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tconst v2 = value as Vector2Like;\n\t\t\t\tconst i2 = this._index * 2;\n\t\t\t\tarray[i2 + 0] = v2.x;\n\t\t\t\tarray[i2 + 1] = v2.y;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tconst isColor = (value as ColorLike).r != null;\n\t\t\t\tconst i3 = this._index * 3;\n\t\t\t\tif (isColor) {\n\t\t\t\t\tconst col = value as ColorLike;\n\t\t\t\t\tarray[i3 + 0] = col.r;\n\t\t\t\t\tarray[i3 + 1] = col.g;\n\t\t\t\t\tarray[i3 + 2] = col.b;\n\t\t\t\t} else {\n\t\t\t\t\tconst v3 = value as Vector3Like;\n\t\t\t\t\tarray[i3 + 0] = v3.x;\n\t\t\t\t\tarray[i3 + 1] = v3.y;\n\t\t\t\t\tarray[i3 + 2] = v3.z;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tconst v4 = value as Vector4Like;\n\t\t\t\tconst i4 = this._index * 4;\n\t\t\t\tarray[i4 + 0] = v4.x;\n\t\t\t\tarray[i4 + 1] = v4.y;\n\t\t\t\tarray[i4 + 2] = v4.z;\n\t\t\t\tarray[i4 + 3] = v4.w;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`CoreVertex.setAttribValue does not yet allow attrib size ${attribSize}`);\n\t\t\t\tthrow `attrib size ${attribSize} not implemented`;\n\t\t}\n\t}\n\tsetAttribValueFromNumber(attribName: string, value: number) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\tconst array = attrib.array as number[];\n\t\tarray[this._index] = value;\n\t}\n\tsetAttribValueFromVector2(attribName: string, value: Vector2) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || attrib.isString == true) {\n\t\t\treturn;\n\t\t}\n\n\t\tvalue.toArray(attrib.array as number[], this._index * 2);\n\t}\n\tsetAttribValueFromVector3(attribName: string, value: Vector3) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || attrib.isString == true) {\n\t\t\treturn;\n\t\t}\n\t\tvalue.toArray(attrib.array as number[], this._index * 3);\n\t}\n\tsetAttribValueFromVector4(attribName: string, value: Vector4) {\n\t\tconst attrib = this.attribute(attribName);\n\t\tif (!attrib || attrib.isString == true) {\n\t\t\treturn;\n\t\t}\n\t\tvalue.toArray(attrib.array as number[], this._index * 4);\n\t}\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedObjectClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn this.relatedPrimitiveClass(object).relatedObjectClass(object);\n\t}\n\n\trelatedEntities(\n\t\tattribClass: AttribClass,\n\t\tcoreGroup: CoreGroup,\n\t\ttarget: CoreEntity[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT: {\n\t\t\t\tthis.relatedPoints(target as CorePoint<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.VERTEX: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = this;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.PRIMITIVE: {\n\t\t\t\tthis.relatedPrimitives(target as CoreEntityWithObject<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.OBJECT: {\n\t\t\t\tthis.relatedObjects(target as CoreEntityWithObject<T>[], traversedRelatedEntityData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribClass.CORE_GROUP: {\n\t\t\t\ttarget.length = 1;\n\t\t\t\ttarget[0] = coreGroup;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n}\n","import {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {arrayPushItems} from '../../../ArrayUtils';\nimport {stringToIndices} from '../../../String';\nimport {AttribSize, AttribType, GroupString} from '../../Constant';\nimport {coreVertexClassFactory, coreVertexInstanceFactory} from '../../CoreObjectFactory';\nimport {CoreGroup} from '../../Group';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {CoreVertex} from './CoreVertex';\n\nconst _indices: number[] = [];\nconst _tmpVertices: CoreVertex<CoreObjectType>[] = [];\n\nexport function vertices<T extends CoreObjectType>(coreGroup: CoreGroup, target: CoreVertex<T>[]): CoreVertex<T>[] {\n\tconst allObjects = coreGroup.allObjects();\n\n\ttarget.length = 0;\n\tfor (const object of allObjects) {\n\t\tverticesFromObject(object, _tmpVertices);\n\t\tarrayPushItems(_tmpVertices, target);\n\t}\n\treturn target;\n\t// return coreGroup\n\t// \t.allCoreObjects()\n\t// \t.map((o) => verticesFromObject(o.object()))\n\t// \t.flat();\n}\nexport function vertexAttribNamesFromCoreGroup(coreGroup: CoreGroup): string[] {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn vertexAttributeNames(firstObject);\n\t} else {\n\t\treturn [];\n\t}\n}\nexport function vertexAttribSizesFromCoreGroup(coreGroup: CoreGroup): PolyDictionary<AttribSize> {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn vertexAttributeSizes(firstObject);\n\t} else {\n\t\treturn {};\n\t}\n}\nexport function vertexAttribTypesFromCoreGroup(coreGroup: CoreGroup): PolyDictionary<AttribType> {\n\tconst firstObject = coreGroup.allObjects()[0];\n\tif (firstObject) {\n\t\treturn vertexAttributeTypes(firstObject);\n\t} else {\n\t\treturn {};\n\t}\n}\nexport function verticesCountFromObject<T extends CoreObjectType>(object: ObjectContent<T>): number {\n\tconst vertexClass = coreVertexClassFactory(object);\n\treturn vertexClass.entitiesCount(object);\n}\nexport function verticesFromObject<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\ttarget: CoreVertex<T>[]\n): CoreVertex<T>[] {\n\tconst vertexClass = coreVertexClassFactory(object);\n\tconst verticesCount = vertexClass.entitiesCount(object);\n\ttarget.length = verticesCount;\n\tfor (let i = 0; i < verticesCount; i++) {\n\t\ttarget[i] = coreVertexInstanceFactory(object, i);\n\t}\n\treturn target;\n}\n\nexport function verticesFromObjectFromGroup<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tgroup: GroupString,\n\ttarget: CoreVertex<T>[]\n): CoreVertex<T>[] {\n\tif (group) {\n\t\ttarget.length = 0;\n\t\tstringToIndices(group, _indices);\n\t\tverticesFromObject(object, _tmpVertices);\n\t\tfor (const index of _indices) {\n\t\t\tconst vertex = _tmpVertices[index] as CoreVertex<T> | undefined;\n\t\t\tif (vertex) {\n\t\t\t\ttarget.push(vertex);\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t} else {\n\t\treturn verticesFromObject(object, target);\n\t}\n}\n\nexport function vertexAttributeNames<T extends CoreObjectType>(object: ObjectContent<T>): string[] {\n\tconst vertexClass = coreVertexClassFactory(object);\n\tconst attributes = vertexClass.attributes(object);\n\tif (!attributes) {\n\t\treturn [];\n\t}\n\treturn Object.keys(attributes);\n}\nexport function vertexAttributeSizes<T extends CoreObjectType>(object: ObjectContent<T>): PolyDictionary<AttribSize> {\n\tconst vertexClass = coreVertexClassFactory(object);\n\tconst attributes = vertexClass.attributes(object);\n\tif (!attributes) {\n\t\treturn {};\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tconst h: PolyDictionary<AttribSize> = {};\n\tfor (const attribName of attribNames) {\n\t\th[attribName] = attributes[attribName].itemSize;\n\t}\n\treturn h;\n}\nexport function vertexAttributeTypes<T extends CoreObjectType>(object: ObjectContent<T>): PolyDictionary<AttribType> {\n\tconst vertexClass = coreVertexClassFactory(object);\n\tconst attributes = vertexClass.attributes(object);\n\tif (!attributes) {\n\t\treturn {};\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tconst h: PolyDictionary<AttribType> = {};\n\tfor (const attribName of attribNames) {\n\t\th[attribName] = attributes[attribName].isString == true ? AttribType.STRING : AttribType.NUMERIC;\n\t}\n\treturn h;\n}\n","import {Color} from 'three';\n\nimport type {\n\tOpenCascadeInstance,\n\tTopoDS_Shape,\n\tTopoDS_Vertex,\n\tTopoDS_Edge,\n\tTopoDS_Wire,\n\tTopoDS_Face,\n\tTopoDS_Shell,\n\tTopoDS_Solid,\n\tTopoDS_CompSolid,\n\tTopoDS_Compound,\n\tGeom2d_Curve,\n\tGeom_Curve,\n\tBRepMesh_IncrementalMesh,\n\tgp_Pln,\n\tgp_Pnt2d,\n\tgp_Pnt,\n\tgp_Quaternion,\n\tgp_Vec2d,\n\tgp_Vec,\n\tBnd_Box,\n\tgp_Trsf,\n\tgp_Ax1,\n\tgp_Ax2,\n\tgp_Dir,\n\tgp_XYZ,\n\tTopAbs_ShapeEnum,\n\tTopExp,\n\tTopTools_IndexedMapOfShape,\n\tTopLoc_Location,\n\tMessage_ProgressRange,\n\tTopTools_ListOfShape,\n\tGProp_GProps,\n} from './build/polygonjs-occt';\n// } from 'opencascade.js';\nexport type {\n\tOpenCascadeInstance,\n\tBRepMesh_IncrementalMesh,\n\tTopoDS_Shape,\n\tTopoDS_Vertex,\n\tTopoDS_Face,\n\tTopoDS_Shell,\n\tTopoDS_Solid,\n\tTopoDS_CompSolid,\n\tTopoDS_Compound,\n\tTopoDS_Edge,\n\tTopoDS_Wire,\n\tGeom2d_Curve,\n\tGeom_Curve,\n\tBnd_Box,\n\tgp_Pln,\n\tgp_Pnt2d,\n\tgp_Pnt,\n\tgp_Quaternion,\n\tgp_Vec2d,\n\tgp_Vec,\n\tgp_Trsf,\n\tgp_Ax1,\n\tgp_Ax2,\n\tgp_Dir,\n\tgp_XYZ,\n\tTopAbs_ShapeEnum,\n\tTopExp,\n\tTopTools_IndexedMapOfShape,\n\tTopLoc_Location,\n\tMessage_ProgressRange,\n\tTopTools_ListOfShape,\n\tGProp_GProps,\n};\n\nexport type CadGeometry =\n\t| gp_Pnt2d\n\t| Geom2d_Curve\n\t// Geom_Curve |\n\t| TopoDS_Vertex\n\t| TopoDS_Edge\n\t| TopoDS_Wire\n\t| TopoDS_Shape;\n\nexport enum CadGeometryType {\n\tPOINT_2D = 'CADPoint2D',\n\tCURVE_2D = 'CADCurve2D',\n\t// CURVE_3D = 'curve3D',\n\tVERTEX = 'CADVertex',\n\tEDGE = 'CADEdge',\n\tWIRE = 'CADWire',\n\tFACE = 'CADFace',\n\tSHELL = 'CADShell',\n\tSOLID = 'CADSolid',\n\tCOMPSOLID = 'CADCompsolid',\n\tCOMPOUND = 'CADCompound',\n}\nconst CAD_GEOMETRY_TYPES: CadGeometryType[] = [\n\tCadGeometryType.POINT_2D,\n\tCadGeometryType.CURVE_2D,\n\tCadGeometryType.VERTEX,\n\tCadGeometryType.EDGE,\n\tCadGeometryType.WIRE,\n\tCadGeometryType.FACE,\n\tCadGeometryType.SHELL,\n\tCadGeometryType.SOLID,\n\tCadGeometryType.COMPSOLID,\n\tCadGeometryType.COMPOUND,\n];\nexport const CAD_GEOMETRY_TYPES_SET: Set<CadGeometryType> = new Set(CAD_GEOMETRY_TYPES);\nexport type CadGeometryTypeShape =\n\t| CadGeometryType.VERTEX\n\t| CadGeometryType.EDGE\n\t| CadGeometryType.WIRE\n\t| CadGeometryType.FACE\n\t| CadGeometryType.SHELL\n\t| CadGeometryType.SOLID\n\t| CadGeometryType.COMPSOLID\n\t| CadGeometryType.COMPOUND;\nexport const CAD_GEOMETRY_TYPES_SHAPE: CadGeometryTypeShape[] = [\n\tCadGeometryType.VERTEX,\n\tCadGeometryType.EDGE,\n\tCadGeometryType.WIRE,\n\tCadGeometryType.FACE,\n\tCadGeometryType.SHELL,\n\tCadGeometryType.SOLID,\n\tCadGeometryType.COMPSOLID,\n\tCadGeometryType.COMPOUND,\n];\nexport const CAD_GEOMETRY_TYPES_SET_SHAPE: Set<CadGeometryType> = new Set(CAD_GEOMETRY_TYPES_SHAPE);\n\nfunction _createShapeTypeToCadGeometryTypeMap(oc: OpenCascadeInstance): Map<TopAbs_ShapeEnum, CadGeometryTypeShape> {\n\tconst shapeEnum = oc.TopAbs_ShapeEnum;\n\tconst map = new Map([\n\t\t[shapeEnum.TopAbs_VERTEX, CadGeometryType.VERTEX],\n\t\t[shapeEnum.TopAbs_EDGE, CadGeometryType.EDGE],\n\t\t[shapeEnum.TopAbs_WIRE, CadGeometryType.WIRE],\n\t\t[shapeEnum.TopAbs_FACE, CadGeometryType.FACE],\n\t\t[shapeEnum.TopAbs_SHELL, CadGeometryType.SHELL],\n\t\t[shapeEnum.TopAbs_SOLID, CadGeometryType.SOLID],\n\t\t[shapeEnum.TopAbs_COMPSOLID, CadGeometryType.COMPSOLID],\n\t\t[shapeEnum.TopAbs_COMPOUND, CadGeometryType.COMPOUND],\n\t]);\n\treturn map as Map<TopAbs_ShapeEnum, CadGeometryTypeShape>;\n}\nexport type CadShape =\n\t| TopoDS_Vertex\n\t| TopoDS_Edge\n\t| TopoDS_Wire\n\t| TopoDS_Face\n\t| TopoDS_Shell\n\t| TopoDS_Solid\n\t| TopoDS_CompSolid\n\t| TopoDS_Compound;\ntype ShapeCaster = (S: TopoDS_Shape) => CadShape;\nfunction _createCastMapFromCadGeometryTypeMap(oc: OpenCascadeInstance): Map<TopAbs_ShapeEnum, ShapeCaster> {\n\tconst shapeEnum = oc.TopAbs_ShapeEnum;\n\tconst map = new Map([\n\t\t[shapeEnum.TopAbs_VERTEX, oc.TopoDS.Vertex_1],\n\t\t[shapeEnum.TopAbs_EDGE, oc.TopoDS.Edge_1],\n\t\t[shapeEnum.TopAbs_WIRE, oc.TopoDS.Wire_1],\n\t\t[shapeEnum.TopAbs_FACE, oc.TopoDS.Face_1],\n\t\t[shapeEnum.TopAbs_SHELL, oc.TopoDS.Shell_1],\n\t\t[shapeEnum.TopAbs_SOLID, oc.TopoDS.Solid_1],\n\t\t[shapeEnum.TopAbs_COMPSOLID, oc.TopoDS.CompSolid_1],\n\t\t[shapeEnum.TopAbs_COMPOUND, oc.TopoDS.Compound_1],\n\t]);\n\treturn map as Map<TopAbs_ShapeEnum, ShapeCaster>;\n}\nlet shapeTypeToCadGeometryTypeMap: Map<TopAbs_ShapeEnum, CadGeometryType> | undefined;\nlet shapeCasterByCadGeometryTypeMap: Map<TopAbs_ShapeEnum, ShapeCaster> | undefined;\nexport function cadGeometryTypeFromShape(oc: OpenCascadeInstance, shape: TopoDS_Shape) {\n\tshapeTypeToCadGeometryTypeMap = shapeTypeToCadGeometryTypeMap || _createShapeTypeToCadGeometryTypeMap(oc);\n\treturn shapeTypeToCadGeometryTypeMap.get(shape.ShapeType());\n}\nexport function cadDowncast(oc: OpenCascadeInstance, shape: TopoDS_Shape) {\n\tshapeCasterByCadGeometryTypeMap = shapeCasterByCadGeometryTypeMap || _createCastMapFromCadGeometryTypeMap(oc);\n\tconst caster = shapeCasterByCadGeometryTypeMap.get(shape.ShapeType())!;\n\treturn caster(shape);\n}\n\nexport interface CadTypeMap {\n\t[CadGeometryType.POINT_2D]: gp_Pnt2d;\n\t[CadGeometryType.CURVE_2D]: Geom2d_Curve;\n\t// [CadObjectType.CURVE_3D]: Geom_Curve;\n\t[CadGeometryType.VERTEX]: TopoDS_Vertex;\n\t[CadGeometryType.EDGE]: TopoDS_Edge;\n\t[CadGeometryType.WIRE]: TopoDS_Wire;\n\t[CadGeometryType.FACE]: TopoDS_Face;\n\t[CadGeometryType.SHELL]: TopoDS_Shell;\n\t[CadGeometryType.SOLID]: TopoDS_Solid;\n\t[CadGeometryType.COMPSOLID]: TopoDS_CompSolid;\n\t[CadGeometryType.COMPOUND]: TopoDS_Compound;\n}\nexport interface CachedCADTesselationParams {\n\tlinearTolerance: number;\n\tangularTolerance: number;\n\tcurveAbscissa: number;\n\tcurveTolerance: number;\n}\nexport interface CachedCADOBJTesselationParams {\n\tCADLinearTolerance: number;\n\tCADAngularTolerance: number;\n\tCADCurveAbscissa: number;\n\tCADCurveTolerance: number;\n}\n\nexport interface CADTesselationParams extends CachedCADTesselationParams {\n\twireframe: boolean;\n\tdisplayMeshes: boolean;\n\tdisplayEdges: boolean;\n\tmeshesColor: Color;\n\tedgesColor: Color;\n}\nexport interface CADOBJTesselationParams extends CachedCADOBJTesselationParams {\n\tCADWireframe: boolean;\n\tCADDisplayMeshes: boolean;\n\tCADDisplayEdges: boolean;\n\tCADMeshesColor: Color;\n\tCADEdgesColor: Color;\n}\n\nexport interface FaceData {\n\tpositions: number[];\n\tnormals: number[];\n\tindices: number[];\n}\nexport interface EdgeData {\n\tpositions: number[];\n}\nexport interface CadObjectData {\n\ttype: CadGeometryType;\n}\nexport interface CadNumberHandle {\n\tcurrent: number;\n}\nexport const _createCadNumberHandle: () => CadNumberHandle = () => ({current: 0});\nexport interface CadVector3Handle {\n\tx: CadNumberHandle;\n\ty: CadNumberHandle;\n\tz: CadNumberHandle;\n}\nexport const _createCadVector3Handle: () => CadVector3Handle = () => ({\n\tx: _createCadNumberHandle(),\n\ty: _createCadNumberHandle(),\n\tz: _createCadNumberHandle(),\n});\n\nexport interface CadBox3Handle {\n\tmin: CadVector3Handle;\n\tmax: CadVector3Handle;\n}\nexport const _createCadBox3Handle: () => CadBox3Handle = () => ({\n\tmin: _createCadVector3Handle(),\n\tmax: _createCadVector3Handle(),\n});\n\ninterface Deletable {\n\tdelete: () => void;\n}\nexport type GCRegisterFunction = <D extends Deletable>(deletable: D) => D;\ntype GCCallback<T> = (r: GCRegisterFunction) => T;\nexport class CadGC {\n\tstatic withGC<T>(callback: GCCallback<T>): T {\n\t\tconst deletables: Set<Deletable> = new Set();\n\t\tfunction r<D extends Deletable>(deletable: D): D {\n\t\t\tdeletables.add(deletable);\n\t\t\treturn deletable;\n\t\t}\n\n\t\tconst result = callback(r);\n\n\t\tdeletables.forEach((deletable) => {\n\t\t\tdeletable.delete();\n\t\t});\n\t\tdeletables.clear();\n\n\t\treturn result;\n\t}\n}\n","import {FrontSide, LineBasicMaterial, MeshStandardMaterial, PointsMaterial, Color} from 'three';\n// import {ObjectType} from '../Constant';\n// import {CsgObjectType} from './CsgToObject3D';\n\n// export interface CsgObjectData {\n// \ttype: CsgObjectType;\n// }\nexport const step = 0.000001;\n\n// interface MaterialPair<M extends Material> {\n// \tplain: M;\n// \twireframe: M;\n// }\nconst GROUP_COLOR = 0x11dd00;\nconst MESH_MAT = new MeshStandardMaterial({\n\tcolor: 0xffffff,\n\t// vertexColors: true,\n\tside: FrontSide,\n\tmetalness: 0.0,\n\troughness: 0.9,\n});\nconst MESH_GROUP_MAT = new MeshStandardMaterial({\n\tcolor: GROUP_COLOR,\n\t// vertexColors: true,\n\tside: FrontSide,\n\tmetalness: 0.0,\n\troughness: 0.9,\n\temissive: 0.5,\n});\n// const MESH_MAT_WIREFRAME = (() => {\n// \tconst mat = MESH_MAT.clone();\n// \tmat.wireframe = true;\n// \treturn mat;\n// })();\nconst LINES_MAT = new LineBasicMaterial({\n\tcolor: 0xffffff,\n\tlinewidth: 1,\n});\nconst LINES_GROUP_MAT = new LineBasicMaterial({\n\tcolor: GROUP_COLOR,\n\tlinewidth: 5,\n\t// depthWrite: false,\n});\nconst POINTS_MAT = new PointsMaterial({\n\tcolor: 0xffffff,\n\tsize: 0.1,\n});\n\n// interface CadMaterial {\n// \t[ObjectType.MESH]: MaterialPair<MeshStandardMaterial>;\n// \t[ObjectType.LINE_SEGMENTS]: LineBasicMaterial;\n// \t[ObjectType.POINTS]: PointsMaterial;\n// }\n\nexport function cadMaterialMesh(color: Color, wireframe: boolean) {\n\tconst mat = MESH_MAT.clone();\n\tmat.wireframe = wireframe;\n\tmat.color = color;\n\treturn mat;\n}\nexport function cadMaterialMeshGroup() {\n\treturn MESH_GROUP_MAT;\n}\nexport function cadMaterialLine(color: Color) {\n\tconst mat = LINES_MAT.clone();\n\tmat.color = color;\n\treturn mat;\n}\nexport function cadMaterialLineGroup() {\n\treturn LINES_GROUP_MAT;\n}\nexport function cadMaterialPoint() {\n\tconst mat = POINTS_MAT; //.clone();\n\t// mat.color = color;\n\treturn mat;\n}\n\n// export const CAD_MATERIAL: CadMaterial = {\n// \t[ObjectType.MESH]: {\n// \t\tplain: MESH_MAT,\n// \t\twireframe: MESH_MAT_WIREFRAME,\n// \t},\n// \t[ObjectType.LINE_SEGMENTS]: LINES_MAT,\n// \t[ObjectType.POINTS]: POINTS_MAT,\n// };\n\n// export const HASH_CODE_MAX = Number.MAX_SAFE_INTEGER;\n","import {CadGeometryType, CAD_GEOMETRY_TYPES_SET, CAD_GEOMETRY_TYPES_SET_SHAPE} from './CadCommon';\nimport type {CadGeometryTypeShape, CadTypeMap, CadShape} from './CadCommon';\nimport {isFunction} from '../../../Type';\nimport type {CadObject} from './CadObject';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\n\nexport function isCADObject(o: ObjectContent<CoreObjectType>) {\n\treturn CAD_GEOMETRY_TYPES_SET.has(o.type as CadGeometryType);\n}\nexport class CoreCadType {\n\tstatic isPoint2d(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.POINT_2D> {\n\t\treturn object.type == CadGeometryType.POINT_2D;\n\t}\n\tstatic isGeom2dCurve(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.CURVE_2D> {\n\t\treturn object.type == CadGeometryType.CURVE_2D;\n\t}\n\tstatic isVertex(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.VERTEX> {\n\t\treturn object.type == CadGeometryType.VERTEX;\n\t}\n\tstatic isEdge(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.EDGE> {\n\t\treturn object.type == CadGeometryType.EDGE;\n\t}\n\tstatic isWire(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.WIRE> {\n\t\treturn object.type == CadGeometryType.WIRE;\n\t}\n\tstatic isFace(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.FACE> {\n\t\treturn object.type == CadGeometryType.FACE;\n\t}\n\tstatic isShell(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.SHELL> {\n\t\treturn object.type == CadGeometryType.SHELL;\n\t}\n\tstatic isSolid(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.SOLID> {\n\t\treturn object.type == CadGeometryType.SOLID;\n\t}\n\tstatic isCompsolid(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.COMPSOLID> {\n\t\treturn object.type == CadGeometryType.COMPSOLID;\n\t}\n\tstatic isCompound(object: CadObject<CadGeometryType>): object is CadObject<CadGeometryType.COMPOUND> {\n\t\treturn object.type == CadGeometryType.COMPOUND;\n\t}\n\tstatic isShape(\n\t\tobject: CadObject<CadGeometryType>\n\t): object is\n\t\t| CadObject<CadGeometryType.VERTEX>\n\t\t| CadObject<CadGeometryType.EDGE>\n\t\t| CadObject<CadGeometryType.WIRE>\n\t\t| CadObject<CadGeometryType.FACE>\n\t\t| CadObject<CadGeometryType.SHELL>\n\t\t| CadObject<CadGeometryType.SOLID>\n\t\t| CadObject<CadGeometryType.COMPSOLID>\n\t\t| CadObject<CadGeometryType.COMPOUND> {\n\t\treturn CAD_GEOMETRY_TYPES_SET_SHAPE.has(object.type as CadGeometryTypeShape);\n\t}\n\tstatic isGeometryShape<T extends CadGeometryType>(geometry: CadTypeMap[T] | CadShape): geometry is CadShape {\n\t\treturn isFunction((geometry as CadShape).ShapeType);\n\t}\n}\n","import {arrayToSet} from '../../../ArrayUtils';\nimport {stringToIndices} from '../../../String';\nimport {coreObjectInstanceFactory} from '../../CoreObjectFactory';\nimport {EntityGroupType} from '../../EntityGroupCollection';\nimport {CadGeometryType, OpenCascadeInstance, TopoDS_Edge, TopoDS_Shape, TopoDS_Vertex, TopoDS_Wire} from './CadCommon';\nimport {CadLoaderSync} from './CadLoaderSync';\nimport {CadObject} from './CadObject';\n\ntype YieldedEntity = TopoDS_Vertex | TopoDS_Edge | TopoDS_Wire;\ntype EntityCallback<E extends YieldedEntity> = (entity: E, index: number) => void;\ntype TraverseEntitiesFunction<E extends YieldedEntity> = (\n\toc: OpenCascadeInstance,\n\tshape: TopoDS_Shape,\n\tcallback: EntityCallback<E>\n) => void;\n\nconst _indicesSet: Set<number> = new Set();\nconst _indices: number[] = [];\n\ninterface TraverseOptions<E extends YieldedEntity> {\n\tgroupName: string;\n\tgroupType: EntityGroupType;\n\tobject: CadObject<CadGeometryType>;\n\tshape: TopoDS_Shape;\n\ttraverseFunction: TraverseEntitiesFunction<E>;\n\tonEntityTraversed: EntityCallback<E>;\n\tonEntityNotInGroupTraversed?: EntityCallback<E>;\n}\n\nexport class CadEntityGroupCollection {\n\tstatic traverseEntitiesInGroup<E extends YieldedEntity>(options: TraverseOptions<E>) {\n\t\tconst {groupName, groupType, object, shape, traverseFunction, onEntityTraversed, onEntityNotInGroupTraversed} =\n\t\t\toptions;\n\t\tconst oc = CadLoaderSync.oc();\n\t\tif (groupName.trim() == '') {\n\t\t\t// no group\n\t\t\ttraverseFunction(oc, shape, onEntityTraversed);\n\t\t} else {\n\t\t\tstringToIndices(groupName, _indices);\n\t\t\tif (_indices.length != 0) {\n\t\t\t\t// group by indices\n\t\t\t\tarrayToSet(_indices, _indicesSet);\n\t\t\t\ttraverseFunction(oc, shape, (entity, i) => {\n\t\t\t\t\tif (_indicesSet.has(i)) {\n\t\t\t\t\t\tonEntityTraversed(entity, i);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst coreObject = coreObjectInstanceFactory(object);\n\t\t\t\tconst groupCollection = coreObject.groupCollection();\n\t\t\t\tgroupCollection.indicesSet(groupType, groupName, _indicesSet);\n\t\t\t\ttraverseFunction(oc, shape, (entity, i) => {\n\t\t\t\t\tif (_indicesSet.has(i)) {\n\t\t\t\t\t\tonEntityTraversed(entity, i);\n\t\t\t\t\t} else if (onEntityNotInGroupTraversed) {\n\t\t\t\t\t\tonEntityNotInGroupTraversed(entity, i);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n","// https://ocjs.org/docs/advanced/exceptions/catch-exceptions\n\nimport type {OpenCascadeInstance} from './CadCommon';\nimport {CadLoaderSync} from './CadLoaderSync';\n\ntype Callback = () => void;\nexport function withCadException<T>(oc: OpenCascadeInstance, callback: Callback): T | void {\n\ttry {\n\t\treturn callback();\n\t} catch (e) {\n\t\tconst message = cadProcessError(e);\n\t\tconsole.log(`That didn't work because: ${message}`);\n\t\tconsole.log(e, message);\n\t\t// if (typeof e === 'number') {\n\t\t// \t\tconst exceptionData = oc.OCJS.getStandard_FailureData(e);\n\t\t// \t} else {\n\t\t// \t\tconsole.log('Unkown error');\n\t\t// \t\tconsole.log(e);\n\t\t// \t}\n\t\t// }\n\t}\n}\ninterface ErrorWithMessage {\n\tmessage: string;\n}\n\nexport function cadProcessError(e: unknown) {\n\tconst oc = CadLoaderSync.oc();\n\tconsole.warn(e, typeof e === 'number');\n\tif (typeof e === 'number') {\n\t\tconst exceptionData = oc.OCJS.getStandard_FailureData(e);\n\t\tconsole.log(exceptionData.GetMessageString());\n\t\treturn exceptionData.GetMessageString();\n\t\t// console.log(`That didn't work because: ${exceptionData.GetMessageString()}`);\n\t\t// console.log(e, exceptionData);\n\t} else {\n\t\tconst message = (e as ErrorWithMessage).message;\n\t\tconsole.log(e, message);\n\t\tif (typeof message === 'string') {\n\t\t\treturn message;\n\t\t} else {\n\t\t\tconsole.log(e);\n\t\t\treturn 'Unknow CAD Error';\n\t\t}\n\t}\n}\n","\nvar Module = (() => {\n  var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\n  if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;\n  return (\nfunction(Module) {\n  Module = Module || {};\n\nvar Module=typeof Module!=\"undefined\"?Module:{};var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==\"object\";var ENVIRONMENT_IS_WORKER=typeof importScripts==\"function\";var ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\";var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err(\"exiting due to exception: \"+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require(\"path\").dirname(scriptDirectory)+\"/\"}else{scriptDirectory=__dirname+\"/\"}requireNodeFS=()=>{if(!nodePath){fs=require(\"fs\");nodePath=require(\"path\")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath[\"normalize\"](filename);return fs.readFileSync(filename,binary?undefined:\"utf8\")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{requireNodeFS();filename=nodePath[\"normalize\"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process[\"argv\"].length>1){thisProgram=process[\"argv\"][1].replace(/\\\\/g,\"/\")}arguments_=process[\"argv\"].slice(2);process[\"on\"](\"uncaughtException\",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process[\"on\"](\"unhandledRejection\",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process[\"exitCode\"]=status;throw toThrow}logExceptionOnExit(toThrow);process[\"exit\"](status)};Module[\"inspect\"]=function(){return\"[Emscripten Module object]\"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var POINTER_SIZE=4;function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\"}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str=\"\";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str=\"\";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module[\"HEAP8\"]=HEAP8=new Int8Array(buf);Module[\"HEAP16\"]=HEAP16=new Int16Array(buf);Module[\"HEAP32\"]=HEAP32=new Int32Array(buf);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buf);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buf);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buf);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buf);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module[\"INITIAL_MEMORY\"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module[\"noFSInit\"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith(\"file://\")}var wasmBinaryFile;wasmBinaryFile=\"polygonjs-occt.wasm\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw\"both async and sync fetching of the wasm failed\"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==\"function\"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:\"same-origin\"}).then(function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={\"a\":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module[\"asm\"]=exports;wasmMemory=Module[\"asm\"][\"qa\"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module[\"asm\"][\"xa\"];addOnInit(Module[\"asm\"][\"ra\"]);removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){receiveInstance(result[\"instance\"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err(\"failed to asynchronously prepare wasm: \"+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==\"function\"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch==\"function\"){return fetch(wasmBinaryFile,{credentials:\"same-origin\"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err(\"wasm streaming compile failed: \"+reason);err(\"falling back to ArrayBuffer instantiation\");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module[\"instantiateWasm\"]){try{var exports=Module[\"instantiateWasm\"](info,receiveInstance);return exports}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function OSD_MemInfo_getModuleHeapLength(){return Module.HEAP8.length}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback(Module);continue}var func=callback.func;if(typeof func==\"number\"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return\"(no stack trace available)\"}}return error.stack.toString()}function ___assert_fail(condition,filename,line,func){abort(\"Assertion failed: \"+UTF8ToString(condition)+\", at: \"+[filename?UTF8ToString(filename):\"unknown filename\",line,func?UTF8ToString(func):\"unknown function\"])}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}var PATH={isAbs:path=>path.charAt(0)===\"/\",splitPath:filename=>{var splitPathRe=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last===\".\"){parts.splice(i,1)}else if(last===\"..\"){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift(\"..\")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)===\"/\";path=PATH.normalizeArray(path.split(\"/\").filter(p=>!!p),!isAbsolute).join(\"/\");if(!path&&!isAbsolute){path=\".\"}if(path&&trailingSlash){path+=\"/\"}return(isAbsolute?\"/\":\"\")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return\".\"}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path===\"/\")return\"/\";path=PATH.normalize(path);path=path.replace(/\\/$/,\"\");var lastSlash=path.lastIndexOf(\"/\");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join(\"/\"))},join2:(l,r)=>{return PATH.normalize(l+\"/\"+r)}};function getRandomDevice(){if(typeof crypto==\"object\"&&typeof crypto[\"getRandomValues\"]==\"function\"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require(\"crypto\");return function(){return crypto_module[\"randomBytes\"](1)[0]}}catch(e){}}return function(){abort(\"randomDevice\")}}var PATH_FS={resolve:function(){var resolvedPath=\"\",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=\"string\"){throw new TypeError(\"Arguments to path.resolve must be strings\")}else if(!path){return\"\"}resolvedPath=path+\"/\"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split(\"/\").filter(p=>!!p),!resolvedAbsolute).join(\"/\");return(resolvedAbsolute?\"/\":\"\")+resolvedPath||\".\"},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!==\"\")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!==\"\")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split(\"/\"));var toParts=trim(to.split(\"/\"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push(\"..\")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join(\"/\")}};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.flush(stream.tty)},flush:function(stream){stream.tty.ops.flush(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;try{bytesRead=fs.readSync(process.stdin.fd,buf,0,BUFSIZE,-1)}catch(e){if(e.toString().includes(\"EOF\"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString(\"utf-8\")}else{result=null}}else if(typeof window!=\"undefined\"&&typeof window.prompt==\"function\"){result=window.prompt(\"Input: \");if(result!==null){result+=\"\\n\"}}else if(typeof readline==\"function\"){result=readline();if(result!==null){result+=\"\\n\"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function zeroMemory(address,size){HEAPU8.fill(0,address,address+size)}function alignMemory(size,alignment){return Math.ceil(size/alignment)*alignment}function mmapAlloc(size){size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;zeroMemory(ptr,size);return ptr}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,\"/\",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[\".\",\"..\"];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}HEAP8.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};function asyncLoad(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency(\"al \"+url):\"\";readAsync(url,function(arrayBuffer){assert(arrayBuffer,'Loading data file \"'+url+'\" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},function(event){if(onerror){onerror()}else{throw'Loading data file \"'+url+'\" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:\"\",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split(\"/\").filter(p=>!!p),false);var current=FS.root;var current_path=\"/\";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count+1});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!==\"/\"?mount+\"/\"+path:mount+path}path=path?node.name+\"/\"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{\"r\":0,\"r+\":2,\"w\":577,\"w+\":578,\"a\":1089,\"a+\":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags==\"undefined\"){throw new Error(\"Unknown file open mode: \"+str)}return flags},flagsToPermissionString:flag=>{var perms=[\"r\",\"w\",\"rw\"][flag&3];if(flag&512){perms+=\"w\"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes(\"r\")&&!(node.mode&292)){return 2}else if(perms.includes(\"w\")&&!(node.mode&146)){return 2}else if(perms.includes(\"x\")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,\"x\");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,\"wx\")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,\"wx\");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!==\"r\"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate==\"function\"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(\"warning: \"+FS.syncFSRequests+\" FS.syncfs operations in flight at once, probably just doing extra work\")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint===\"/\";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name===\".\"||name===\"..\"){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split(\"/\");var d=\"\";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+=\"/\"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev:(path,mode,dev)=>{if(typeof dev==\"undefined\"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,\"w\");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path==\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path==\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path==\"string\"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,\"w\");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===\"\"){throw new FS.ErrnoError(44)}flags=typeof flags==\"string\"?FS.modeStringToFlags(flags):flags;mode=typeof mode==\"undefined\"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==\"object\"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module[\"logReadFiles\"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!=\"undefined\";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!=\"undefined\";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||\"binary\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding===\"utf8\"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding===\"binary\"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data==\"string\"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error(\"Unsupported data type\")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,\"x\");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir(\"/tmp\");FS.mkdir(\"/home\");FS.mkdir(\"/home/web_user\")},createDefaultDevices:()=>{FS.mkdir(\"/dev\");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev(\"/dev/null\",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev(\"/dev/tty\",FS.makedev(5,0));FS.mkdev(\"/dev/tty1\",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice(\"/dev\",\"random\",random_device);FS.createDevice(\"/dev\",\"urandom\",random_device);FS.mkdir(\"/dev/shm\");FS.mkdir(\"/dev/shm/tmp\")},createSpecialDirectories:()=>{FS.mkdir(\"/proc\");var proc_self=FS.mkdir(\"/proc/self\");FS.mkdir(\"/proc/self/fd\");FS.mount({mount:()=>{var node=FS.createNode(proc_self,\"fd\",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:\"fake\"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},\"/proc/self/fd\")},createStandardStreams:()=>{if(Module[\"stdin\"]){FS.createDevice(\"/dev\",\"stdin\",Module[\"stdin\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdin\")}if(Module[\"stdout\"]){FS.createDevice(\"/dev\",\"stdout\",null,Module[\"stdout\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdout\")}if(Module[\"stderr\"]){FS.createDevice(\"/dev\",\"stderr\",null,Module[\"stderr\"])}else{FS.symlink(\"/dev/tty1\",\"/dev/stderr\")}var stdin=FS.open(\"/dev/stdin\",0);var stdout=FS.open(\"/dev/stdout\",1);var stderr=FS.open(\"/dev/stderr\",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message=\"FS error\"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=\"<generic error, no stack>\"})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},\"/\");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={\"MEMFS\":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module[\"stdin\"]=input||Module[\"stdin\"];Module[\"stdout\"]=output||Module[\"stdout\"];Module[\"stderr\"]=error||Module[\"stderr\"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},getMode:(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path===\"/\"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent==\"string\"?parent:FS.getPath(parent);var parts=path.split(\"/\").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent==\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent==\"string\"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==\"string\"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:(parent,name,input,output)=>{var path=PATH.join2(typeof parent==\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:(stream,buffer,offset,length,pos)=>{for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile:obj=>{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!=\"undefined\"){throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error(\"Cannot load without read() or XMLHttpRequest.\")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open(\"HEAD\",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);var datalength=Number(xhr.getResponseHeader(\"Content-length\"));var header;var hasByteServing=(header=xhr.getResponseHeader(\"Accept-Ranges\"))&&header===\"bytes\";var usesGzip=(header=xhr.getResponseHeader(\"Content-Encoding\"))&&header===\"gzip\";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error(\"invalid range (\"+from+\", \"+to+\") or no bytes requested!\");if(to>datalength-1)throw new Error(\"only \"+datalength+\" bytes available! programmer error!\");var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);if(datalength!==chunkSize)xhr.setRequestHeader(\"Range\",\"bytes=\"+from+\"-\"+to);xhr.responseType=\"arraybuffer\";if(xhr.overrideMimeType){xhr.overrideMimeType(\"text/plain; charset=x-user-defined\")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||\"\",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==\"undefined\"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==\"undefined\")throw new Error(\"doXHR failed!\");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out(\"LazyFiles on gzip forces download of the whole file when length is accessed\")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=\"undefined\"){if(!ENVIRONMENT_IS_WORKER)throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size}stream_ops.read=(stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(\"cp \"+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url==\"string\"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return\"EM_FS_\"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out(\"creating db\");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],\"readwrite\");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],\"readonly\")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms=\"\";if(amode&4)perms+=\"r\";if(amode&2)perms+=\"w\";if(amode&1)perms+=\"x\";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort(\"bad ioctl syscall \"+op)}}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~4352;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError(\"Unknown type size: \"+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret=\"\";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return\"_unknown\"}name=name.replace(/[^a-zA-Z0-9_]/g,\"$\");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return\"_\"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function(\"body\",\"return function \"+name+\"() {\\n\"+'    \"use strict\";'+\"    return body.apply(this, arguments);\\n\"+\"};\\n\")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+\"\\n\"+stack.replace(/^Error(:[^\\n]*)?\\n/,\"\")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+\": \"+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError(\"Mismatched type converter count\")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((dt,i)=>{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options={}){if(!(\"argPackAdvance\"in registeredInstance)){throw new TypeError(\"registerType registeredInstance requires argPackAdvance\")}var name=registeredInstance.name;if(!rawType){throwBindingError('type \"'+name+'\" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(\"Cannot register type '\"+name+\"' twice\")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,\"fromWireType\":function(wt){return!!wt},\"toWireType\":function(destructors,o){return o?trueValue:falseValue},\"argPackAdvance\":8,\"readValueFromPointer\":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError(\"Unknown boolean type size: \"+name)}return this[\"fromWireType\"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+\" instance already deleted\")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj[\"delete\"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module[\"getInheritedInstanceCount\"]=getInheritedInstanceCount;Module[\"getLiveInheritedInstances\"]=getLiveInheritedInstances;Module[\"flushPendingDeletes\"]=flushPendingDeletes;Module[\"setDelayFunction\"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError(\"ptr should not be undefined\")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError(\"makeClassHandle requires ptr and ptrType\")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError(\"Both smartPtrType and smartPtr must be specified\")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance[\"clone\"]()}else{var rv=registeredInstance[\"clone\"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if(\"undefined\"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError(\"Object already scheduled for deletion\")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError(\"Object already scheduled for deletion\")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype[\"isAliasOf\"]=ClassHandle_isAliasOf;ClassHandle.prototype[\"clone\"]=ClassHandle_clone;ClassHandle.prototype[\"delete\"]=ClassHandle_delete;ClassHandle.prototype[\"isDeleted\"]=ClassHandle_isDeleted;ClassHandle.prototype[\"deleteLater\"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError(\"Function '\"+humanName+\"' called with an invalid number of arguments (\"+arguments.length+\") - expects one of (\"+proto[methodName].overloadTable+\")!\")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(\"Cannot register public name '\"+name+\"' twice\")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError(\"Cannot register multiple overloads of a function with the same number of arguments (\"+numArguments+\")!\")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(\"Expected null or instance of \"+desiredClass.name+\", got an instance of \"+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(\"null is not a valid \"+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass \"'+_embind_repr(handle)+'\" as a '+this.name)}if(!handle.$$.ptr){throwBindingError(\"Cannot pass deleted object as a pointer of type \"+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(\"null is not a valid \"+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass \"'+_embind_repr(handle)+'\" as a '+this.name)}if(!handle.$$.ptr){throwBindingError(\"Cannot pass deleted object as a pointer of type \"+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(\"Cannot convert argument of type \"+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+\" to parameter type \"+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError(\"Passing raw pointer to smart pointer is illegal\")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError(\"Cannot convert argument of type \"+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+\" to parameter type \"+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle[\"clone\"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle[\"delete\"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError(\"Unsupporting sharing policy\")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(\"null is not a valid \"+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass \"'+_embind_repr(handle)+'\" as a '+this.name)}if(!handle.$$.ptr){throwBindingError(\"Cannot pass deleted object as a pointer of type \"+this.name)}if(handle.$$.ptrType.isConst){throwBindingError(\"Cannot convert argument of type \"+handle.$$.ptrType.name+\" to parameter type \"+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this[\"fromWireType\"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle[\"delete\"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype[\"argPackAdvance\"]=8;RegisteredPointer.prototype[\"readValueFromPointer\"]=simpleReadValueFromPointer;RegisteredPointer.prototype[\"deleteObject\"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype[\"fromWireType\"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this[\"toWireType\"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this[\"toWireType\"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this[\"toWireType\"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError(\"Replacing nonexistant public symbol\")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module[\"dynCall_\"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes(\"j\")){return dynCallLegacy(sig,ptr,args)}return getWasmTableEntry(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes(\"j\")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!=\"function\"){throwBindingError(\"unknown function pointer with signature \"+signature+\": \"+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+\": \"+unboundTypes.map(getTypeName).join([\", \"]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(\"Cannot construct \"+name+\" due to unbound types\",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError(\"Use 'new' to construct \"+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+\" has no accessible constructor\")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError(\"Tried to invoke ctor of \"+name+\" with invalid number of parameters (\"+arguments.length+\") - expected (\"+Object.keys(registeredClass.constructor_body).toString()+\") parameters instead!\")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+\"*\",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+\" const*\",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError(\"new_ called with constructor type \"+typeof constructor+\" which is not a function\")}var dummy=createNamedFunction(constructor.name||\"unknownFunctionName\",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError(\"argTypes array size mismatch! Must at least get return value and 'this' types!\")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!==\"void\";var argsList=\"\";var argsListWired=\"\";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?\", \":\"\")+\"arg\"+i;argsListWired+=(i!==0?\", \":\"\")+\"arg\"+i+\"Wired\"}var invokerFnBody=\"return function \"+makeLegalFunctionName(humanName)+\"(\"+argsList+\") {\\n\"+\"if (arguments.length !== \"+(argCount-2)+\") {\\n\"+\"throwBindingError('function \"+humanName+\" called with ' + arguments.length + ' arguments, expected \"+(argCount-2)+\" args!');\\n\"+\"}\\n\";if(needsDestructorStack){invokerFnBody+=\"var destructors = [];\\n\"}var dtorStack=needsDestructorStack?\"destructors\":\"null\";var args1=[\"throwBindingError\",\"invoker\",\"fn\",\"runDestructors\",\"retType\",\"classParam\"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+=\"var thisWired = classParam.toWireType(\"+dtorStack+\", this);\\n\"}for(var i=0;i<argCount-2;++i){invokerFnBody+=\"var arg\"+i+\"Wired = argType\"+i+\".toWireType(\"+dtorStack+\", arg\"+i+\"); // \"+argTypes[i+2].name+\"\\n\";args1.push(\"argType\"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired=\"thisWired\"+(argsListWired.length>0?\", \":\"\")+argsListWired}invokerFnBody+=(returns?\"var rv = \":\"\")+\"invoker(fn\"+(argsListWired.length>0?\", \":\"\")+argsListWired+\");\\n\";if(needsDestructorStack){invokerFnBody+=\"runDestructors(destructors);\\n\"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?\"thisWired\":\"arg\"+(i-2)+\"Wired\";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+\"_dtor(\"+paramName+\"); // \"+argTypes[i].name+\"\\n\";args1.push(paramName+\"_dtor\");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+=\"var ret = retType.fromWireType(rv);\\n\"+\"return ret;\\n\"}else{}invokerFnBody+=\"}\\n\";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+\".\"+methodName;function unboundTypesHandler(){throwUnboundTypeError(\"Cannot call \"+humanName+\" due to unbound types\",rawArgTypes)}if(methodName.startsWith(\"@@\")){methodName=Symbol[methodName.substring(2)]}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=\"constructor \"+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError(\"Cannot register multiple constructors with identical number of parameters (\"+(argCount-1)+\") for class '\"+classType.name+\"'! Overload resolution is currently only performed using the parameter count, not actual type info!\")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError(\"Cannot construct \"+classType.name+\" due to unbound types\",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+\".\"+methodName;if(methodName.startsWith(\"@@\")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError(\"Cannot call \"+humanName+\" due to unbound types\",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid \"this\": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with \"this\" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError(\"cannot call emscripten binding method \"+humanName+\" on deleted object\")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],function(classType){classType=classType[0];var humanName=classType.name+\".\"+fieldName;var desc={get:function(){throwUnboundTypeError(\"Cannot access \"+humanName+\" due to unbound types\",[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=()=>{throwUnboundTypeError(\"Cannot access \"+humanName+\" due to unbound types\",[getterReturnType,setterArgumentType])}}else{desc.set=v=>{throwBindingError(humanName+\" is a read-only property\")}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],function(types){var getterReturnType=types[0];var desc={get:function(){var ptr=validateThis(this,classType,humanName+\" getter\");return getterReturnType[\"fromWireType\"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+\" setter\");var destructors=[];setter(setterContext,ptr,setterArgumentType[\"toWireType\"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module[\"count_emval_handles\"]=count_emval_handles;Module[\"get_first_emval\"]=get_first_emval}var Emval={toValue:handle=>{if(!handle){throwBindingError(\"Cannot use deleted val. handle = \"+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,\"fromWireType\":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},\"toWireType\":function(destructors,value){return Emval.toHandle(value)},\"argPackAdvance\":8,\"readValueFromPointer\":simpleReadValueFromPointer,destructorFunction:null})}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return function(pointer){var heap=signed?HEAP8:HEAPU8;return this[\"fromWireType\"](heap[pointer])};case 1:return function(pointer){var heap=signed?HEAP16:HEAPU16;return this[\"fromWireType\"](heap[pointer>>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this[\"fromWireType\"](heap[pointer>>2])};default:throw new TypeError(\"Unknown integer type: \"+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,\"fromWireType\":function(c){return this.constructor.values[c]},\"toWireType\":function(destructors,c){return c.value},\"argPackAdvance\":8,\"readValueFromPointer\":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+\" has unknown type \"+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,\"enum\");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+\"_\"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return\"null\"}var t=typeof v;if(t===\"object\"||t===\"array\"||t===\"function\"){return v.toString()}else{return\"\"+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this[\"fromWireType\"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this[\"fromWireType\"](HEAPF64[pointer>>3])};default:throw new TypeError(\"Unknown float type: \"+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,\"fromWireType\":function(value){return value},\"toWireType\":function(destructors,value){return value},\"argPackAdvance\":8,\"readValueFromPointer\":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError(\"Unknown integer type: \"+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<<bitshift>>>bitshift}var isUnsignedType=name.includes(\"unsigned\");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,\"fromWireType\":fromWireType,\"toWireType\":toWireType,\"argPackAdvance\":8,\"readValueFromPointer\":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,\"fromWireType\":decodeMemoryView,\"argPackAdvance\":8,\"readValueFromPointer\":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name===\"std::string\";registerType(rawType,{name:name,\"fromWireType\":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join(\"\")}_free(value);return str},\"toWireType\":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==\"string\";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError(\"Cannot pass non-string to std::string\")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=()=>lengthBytesUTF8(value)}else{getLength=()=>value.length}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError(\"String has UTF-16 code units that do not fit in 8 bits\")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},\"argPackAdvance\":8,\"readValueFromPointer\":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=()=>HEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,\"fromWireType\":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},\"toWireType\":function(destructors,value){if(!(typeof value==\"string\")){throwBindingError(\"Cannot pass non-string to C++ string type \"+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},\"argPackAdvance\":8,\"readValueFromPointer\":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,\"argPackAdvance\":0,\"fromWireType\":function(){return undefined},\"toWireType\":function(destructors,o){return undefined}})}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emval_as(handle,returnType,destructorsRef){handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,\"emval::as\");var destructors=[];var rd=Emval.toHandle(destructors);HEAP32[destructorsRef>>2]=rd;return returnType[\"toWireType\"](destructors,handle)}function emval_allocateDestructors(destructorsRef){var destructors=[];HEAP32[destructorsRef>>2]=Emval.toHandle(destructors);return destructors}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol}var emval_methodCallers=[];function __emval_call_method(caller,handle,methodName,destructorsRef,args){caller=emval_methodCallers[caller];handle=Emval.toValue(handle);methodName=getStringOrSymbol(methodName);return caller(handle,methodName,emval_allocateDestructors(destructorsRef),args)}function emval_get_global(){if(typeof globalThis==\"object\"){return globalThis}return function(){return Function}()(\"return this\")()}function __emval_get_global(name){if(name===0){return Emval.toHandle(emval_get_global())}else{name=getStringOrSymbol(name);return Emval.toHandle(emval_get_global()[name])}}function emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAPU32[argTypes+i*POINTER_SIZE>>2],\"parameter \"+i)}return a}var emval_registeredMethods=[];function __emval_get_method_caller(argCount,argTypes){var types=emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+\"_$\"+types.slice(1).map(function(t){return t.name}).join(\"_\")+\"$\";var returnId=emval_registeredMethods[signatureName];if(returnId!==undefined){return returnId}var params=[\"retType\"];var args=[retType];var argsList=\"\";for(var i=0;i<argCount-1;++i){argsList+=(i!==0?\", \":\"\")+\"arg\"+i;params.push(\"argType\"+i);args.push(types[1+i])}var functionName=makeLegalFunctionName(\"methodCaller_\"+signatureName);var functionBody=\"return function \"+functionName+\"(handle, name, destructors, args) {\\n\";var offset=0;for(var i=0;i<argCount-1;++i){functionBody+=\"    var arg\"+i+\" = argType\"+i+\".readValueFromPointer(args\"+(offset?\"+\"+offset:\"\")+\");\\n\";offset+=types[i+1][\"argPackAdvance\"]}functionBody+=\"    var rv = handle[name](\"+argsList+\");\\n\";for(var i=0;i<argCount-1;++i){if(types[i+1][\"deleteObject\"]){functionBody+=\"    argType\"+i+\".deleteObject(arg\"+i+\");\\n\"}}if(!retType.isVoid){functionBody+=\"    return retType.toWireType(destructors, rv);\\n\"}functionBody+=\"};\\n\";params.push(functionBody);var invokerFunction=new_(Function,params).apply(null,args);returnId=emval_addMethodCaller(invokerFunction);emval_registeredMethods[signatureName]=returnId;return returnId}function __emval_get_property(handle,key){handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function __emval_new_cstring(v){return Emval.toHandle(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)}function __emval_set_property(handle,key,value){handle=Emval.toValue(handle);key=Emval.toValue(key);value=Emval.toValue(value);handle[key]=value}function __emval_take_value(type,argv){type=requireRegisteredType(type,\"_emval_take_value\");var v=type[\"readValueFromPointer\"](argv);return Emval.toHandle(v)}function __emval_typeof(handle){handle=Emval.toValue(handle);return Emval.toHandle(typeof handle)}function __localtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __munmap_js(addr,len,prot,flags,fd,offset){try{var stream=FS.getStream(fd);if(stream){if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function _tzset_impl(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return match?match[1]:\"GMT\"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset<winterOffset){HEAPU32[tzname>>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}function _abort(){abort(\"\")}function traverseStack(args){if(!args||!args.callee||!args.callee.name){return[null,\"\",\"\"]}var funstr=args.callee.toString();var funcname=args.callee.name;var str=\"(\";var first=true;for(var i in args){var a=args[i];if(!first){str+=\", \"}first=false;if(typeof a==\"number\"||typeof a==\"string\"){str+=a}else{str+=\"(\"+typeof a+\")\"}}str+=\")\";var caller=args.callee.caller;args=caller?caller.arguments:[];if(first)str=\"\";return[args,funcname,str]}function _emscripten_get_callstack_js(flags){var callstack=jsStackTrace();var iThisFunc=callstack.lastIndexOf(\"_emscripten_log\");var iThisFunc2=callstack.lastIndexOf(\"_emscripten_get_callstack\");var iNextLine=callstack.indexOf(\"\\n\",Math.max(iThisFunc,iThisFunc2))+1;callstack=callstack.slice(iNextLine);if(flags&32){warnOnce(\"EM_LOG_DEMANGLE is deprecated; ignoring\")}if(flags&8&&typeof emscripten_source_map==\"undefined\"){warnOnce('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with \"--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js\" linker flag to add source map loading to code.');flags^=8;flags|=16}var stack_args=null;if(flags&128){stack_args=traverseStack(arguments);while(stack_args[1].includes(\"_emscripten_\"))stack_args=traverseStack(stack_args[0])}var lines=callstack.split(\"\\n\");callstack=\"\";var newFirefoxRe=new RegExp(\"\\\\s*(.*?)@(.*?):([0-9]+):([0-9]+)\");var firefoxRe=new RegExp(\"\\\\s*(.*?)@(.*):(.*)(:(.*))?\");var chromeRe=new RegExp(\"\\\\s*at (.*?) \\\\((.*):(.*):(.*)\\\\)\");for(var l in lines){var line=lines[l];var symbolName=\"\";var file=\"\";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts&&parts.length==5){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]}else{parts=newFirefoxRe.exec(line);if(!parts)parts=firefoxRe.exec(line);if(parts&&parts.length>=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+\"\\n\";continue}}var haveSourceMap=false;if(flags&8){var orig=emscripten_source_map.originalPositionFor({line:lineno,column:column});haveSourceMap=orig&&orig.source;if(haveSourceMap){if(flags&64){orig.source=orig.source.substring(orig.source.replace(/\\\\/g,\"/\").lastIndexOf(\"/\")+1)}callstack+=\"    at \"+symbolName+\" (\"+orig.source+\":\"+orig.line+\":\"+orig.column+\")\\n\"}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\\\/g,\"/\").lastIndexOf(\"/\")+1)}callstack+=(haveSourceMap?\"     = \"+symbolName:\"    at \"+symbolName)+\" (\"+file+\":\"+lineno+\":\"+column+\")\\n\"}if(flags&128&&stack_args[0]){if(stack_args[1]==symbolName&&stack_args[2].length>0){callstack=callstack.replace(/\\s+$/,\"\");callstack+=\" with values: \"+stack_args[1]+stack_args[2]+\"\\n\"}stack_args=traverseStack(stack_args[0])}}callstack=callstack.replace(/\\s+$/,\"\");return callstack}function _emscripten_get_callstack(flags,str,maxbytes){var callstack=_emscripten_get_callstack_js(flags);if(!str||maxbytes<=0){return lengthBytesUTF8(callstack)+1}var bytesWrittenExcludingNull=stringToUTF8(callstack,str,maxbytes);return bytesWrittenExcludingNull+1}function getHeapMax(){return 2147483648}function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process[\"hrtime\"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||\"./this.program\"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator==\"object\"&&navigator.languages&&navigator.languages[0]||\"C\").replace(\"-\",\"_\")+\".UTF-8\";var env={\"USER\":\"web_user\",\"LOGNAME\":\"web_user\",\"PATH\":\"/\",\"PWD\":\"/\",\"HOME\":\"/home/web_user\",\"LANG\":lang,\"_\":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+\"=\"+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS==\"undefined\"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function inetPton4(str){var b=str.split(\".\");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|$))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str===\"::\"){return[0,0,0,0,0,0,0,0]}if(str.startsWith(\"::\")){str=str.replace(\"::\",\"Z:\")}else{str=str.replace(\"::\",\":Z:\")}if(str.indexOf(\".\")>0){str=str.replace(new RegExp(\"[.]\",\"g\"),\":\");words=str.split(\":\");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(\":\")}offset=0;z=0;for(w=0;w<words.length;w++){if(typeof words[w]==\"string\"){if(words[w]===\"Z\"){for(z=0;z<8-words.length+1;z++){parts[w+z]=0}offset=z-1}else{parts[w+offset]=_htons(parseInt(words[w],16))}}else{parts[w+offset]=words[w]}}return[parts[1]<<16|parts[0],parts[3]<<16|parts[2],parts[5]<<16|parts[4],parts[7]<<16|parts[6]]}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,\"exceeded max address mappings of 65535\");addr=\"172.29.\"+(id&255)+\".\"+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function getHostByName(name){var ret=_malloc(20);var nameBuf=_malloc(name.length+1);stringToUTF8(name,nameBuf,name.length+1);HEAPU32[ret>>2]=nameBuf;var aliasesBuf=_malloc(4);HEAPU32[aliasesBuf>>2]=0;HEAPU32[ret+4>>2]=aliasesBuf;var afinet=2;HEAP32[ret+8>>2]=afinet;HEAP32[ret+12>>2]=4;var addrListBuf=_malloc(12);HEAPU32[addrListBuf>>2]=addrListBuf+8;HEAPU32[addrListBuf+4>>2]=0;HEAP32[addrListBuf+8>>2]=inetPton4(DNS.lookup_name(name));HEAPU32[ret+16>>2]=addrListBuf;return ret}function _gethostbyname(name){return getHostByName(UTF8ToString(name))}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension(\"ANGLE_instanced_arrays\");if(ext){ctx[\"vertexAttribDivisor\"]=function(index,divisor){ext[\"vertexAttribDivisorANGLE\"](index,divisor)};ctx[\"drawArraysInstanced\"]=function(mode,first,count,primcount){ext[\"drawArraysInstancedANGLE\"](mode,first,count,primcount)};ctx[\"drawElementsInstanced\"]=function(mode,count,type,indices,primcount){ext[\"drawElementsInstancedANGLE\"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension(\"OES_vertex_array_object\");if(ext){ctx[\"createVertexArray\"]=function(){return ext[\"createVertexArrayOES\"]()};ctx[\"deleteVertexArray\"]=function(vao){ext[\"deleteVertexArrayOES\"](vao)};ctx[\"bindVertexArray\"]=function(vao){ext[\"bindVertexArrayOES\"](vao)};ctx[\"isVertexArray\"]=function(vao){return ext[\"isVertexArrayOES\"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension(\"WEBGL_draw_buffers\");if(ext){ctx[\"drawBuffers\"]=function(n,bufs){ext[\"drawBuffersWEBGL\"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension(\"WEBGL_multi_draw\"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i<ret;i++){table[i]=null}return ret},getSource:function(shader,count,string,length){var source=\"\";for(var i=0;i<count;++i){var len=length?HEAP32[length+i*4>>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver==\"webgl\"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=canvas.getContext(\"webgl\",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==\"undefined\"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==\"object\")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension(\"EXT_disjoint_timer_query\")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes(\"lose_context\")&&!ext.includes(\"debug\")){GLctx.getExtension(ext)}})}};function webglGetLeftBracePos(name){return name.slice(-1)==\"]\"&&name.lastIndexOf(\"[\")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i<GLctx.getProgramParameter(program,35718);++i){var u=GLctx.getActiveUniform(program,i);var nm=u.name;var sz=u.size;var lb=webglGetLeftBracePos(nm);var arrayName=lb>0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j<sz;++j){uniformLocsById[id]=j;program.uniformArrayNamesById[id++]=arrayName}}}}function _glGetUniformLocation(program,name){name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex<sizeAndId[0]){arrayIndex+=sizeAndId[1];if(uniformLocsById[arrayIndex]=uniformLocsById[arrayIndex]||GLctx.getUniformLocation(program,name)){return arrayIndex}}}else{GL.recordError(1281)}return-1}function webglGetUniformLocation(location){var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc==\"number\"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?\"[\"+webglLoc+\"]\":\"\"))}return webglLoc}else{GL.recordError(1282)}}function _glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}var miniTempWebGLFloatBuffers=[];function _glUniform2fv(location,count,value){if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}var __miniTempWebGLIntBuffers=[];function _glUniform2iv(location,count,value){if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _glUniform3fv(location,count,value){if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _glUniform3iv(location,count,value){if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}function _glUniform4fv(location,count,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _glUniform4iv(location,count,value){if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):\"\"};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={\"%c\":\"%a %b %d %H:%M:%S %Y\",\"%D\":\"%m/%d/%y\",\"%F\":\"%Y-%m-%d\",\"%h\":\"%b\",\"%r\":\"%I:%M:%S %p\",\"%R\":\"%H:%M\",\"%T\":\"%H:%M:%S\",\"%x\":\"%m/%d/%y\",\"%X\":\"%H:%M:%S\",\"%Ec\":\"%c\",\"%EC\":\"%C\",\"%Ex\":\"%m/%d/%y\",\"%EX\":\"%H:%M:%S\",\"%Ey\":\"%y\",\"%EY\":\"%Y\",\"%Od\":\"%d\",\"%Oe\":\"%e\",\"%OH\":\"%H\",\"%OI\":\"%I\",\"%Om\":\"%m\",\"%OM\":\"%M\",\"%OS\":\"%S\",\"%Ou\":\"%u\",\"%OU\":\"%U\",\"%OV\":\"%V\",\"%Ow\":\"%w\",\"%OW\":\"%W\",\"%Oy\":\"%y\"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,\"g\"),EXPANSION_RULES_1[rule])}var WEEKDAYS=[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"];var MONTHS=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];function leadingSomething(value,digits,character){var str=typeof value==\"number\"?value.toString():value||\"\";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,\"0\")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={\"%a\":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},\"%A\":function(date){return WEEKDAYS[date.tm_wday]},\"%b\":function(date){return MONTHS[date.tm_mon].substring(0,3)},\"%B\":function(date){return MONTHS[date.tm_mon]},\"%C\":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},\"%d\":function(date){return leadingNulls(date.tm_mday,2)},\"%e\":function(date){return leadingSomething(date.tm_mday,2,\" \")},\"%g\":function(date){return getWeekBasedYear(date).toString().substring(2)},\"%G\":function(date){return getWeekBasedYear(date)},\"%H\":function(date){return leadingNulls(date.tm_hour,2)},\"%I\":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},\"%j\":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},\"%m\":function(date){return leadingNulls(date.tm_mon+1,2)},\"%M\":function(date){return leadingNulls(date.tm_min,2)},\"%n\":function(){return\"\\n\"},\"%p\":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return\"AM\"}else{return\"PM\"}},\"%S\":function(date){return leadingNulls(date.tm_sec,2)},\"%t\":function(){return\"\\t\"},\"%u\":function(date){return date.tm_wday||7},\"%U\":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},\"%V\":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},\"%w\":function(date){return date.tm_wday},\"%W\":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},\"%y\":function(date){return(date.tm_year+1900).toString().substring(2)},\"%Y\":function(date){return date.tm_year+1900},\"%z\":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?\"+\":\"-\")+String(\"0000\"+off).slice(-4)},\"%Z\":function(date){return date.tm_zone},\"%%\":function(){return\"%\"}};pattern=pattern.replace(/%%/g,\"\\0\\0\");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,\"g\"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\\0\\0/g,\"%\");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();embind_init_charCodes();BindingError=Module[\"BindingError\"]=extendError(Error,\"BindingError\");InternalError=Module[\"InternalError\"]=extendError(Error,\"InternalError\");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module[\"UnboundTypeError\"]=extendError(Error,\"UnboundTypeError\");init_emval();var GLctx;var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={\"aa\":OSD_MemInfo_getModuleHeapLength,\"l\":___assert_fail,\"a\":___cxa_allocate_exception,\"b\":___cxa_throw,\"T\":___syscall_chmod,\"U\":___syscall_faccessat,\"q\":___syscall_fcntl64,\"M\":___syscall_fstat64,\"W\":___syscall_ioctl,\"J\":___syscall_lstat64,\"K\":___syscall_newfstatat,\"u\":___syscall_openat,\"L\":___syscall_stat64,\"A\":__embind_register_bigint,\"Y\":__embind_register_bool,\"d\":__embind_register_class,\"f\":__embind_register_class_class_function,\"e\":__embind_register_class_constructor,\"c\":__embind_register_class_function,\"j\":__embind_register_class_property,\"X\":__embind_register_emval,\"i\":__embind_register_enum,\"h\":__embind_register_enum_value,\"x\":__embind_register_float,\"k\":__embind_register_integer,\"g\":__embind_register_memory_view,\"w\":__embind_register_std_string,\"r\":__embind_register_std_wstring,\"Z\":__embind_register_void,\"P\":__emscripten_date_now,\"O\":__emscripten_get_now_is_monotonic,\"n\":__emval_as,\"na\":__emval_call_method,\"I\":__emval_decref,\"oa\":__emval_get_global,\"ma\":__emval_get_method_caller,\"s\":__emval_get_property,\"S\":__emval_incref,\"la\":__emval_new_cstring,\"pa\":__emval_run_destructors,\"o\":__emval_set_property,\"m\":__emval_take_value,\"y\":__emval_typeof,\"Q\":__localtime_js,\"F\":__munmap_js,\"R\":__tzset_js,\"t\":_abort,\"_\":_emscripten_get_callstack,\"E\":_emscripten_get_heap_max,\"N\":_emscripten_memcpy_big,\"D\":_emscripten_resize_heap,\"G\":_environ_get,\"H\":_environ_sizes_get,\"$\":_exit,\"p\":_fd_close,\"V\":_fd_read,\"z\":_fd_seek,\"v\":_fd_write,\"ba\":_gethostbyname,\"ka\":_glGetUniformLocation,\"ia\":_glUniform1f,\"ja\":_glUniform1i,\"ea\":_glUniform2fv,\"ha\":_glUniform2iv,\"da\":_glUniform3fv,\"ga\":_glUniform3iv,\"ca\":_glUniform4fv,\"fa\":_glUniform4iv,\"B\":_setTempRet0,\"C\":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module[\"___wasm_call_ctors\"]=function(){return(___wasm_call_ctors=Module[\"___wasm_call_ctors\"]=Module[\"asm\"][\"ra\"]).apply(null,arguments)};var _malloc=Module[\"_malloc\"]=function(){return(_malloc=Module[\"_malloc\"]=Module[\"asm\"][\"sa\"]).apply(null,arguments)};var ___errno_location=Module[\"___errno_location\"]=function(){return(___errno_location=Module[\"___errno_location\"]=Module[\"asm\"][\"ta\"]).apply(null,arguments)};var _free=Module[\"_free\"]=function(){return(_free=Module[\"_free\"]=Module[\"asm\"][\"ua\"]).apply(null,arguments)};var ___getTypeName=Module[\"___getTypeName\"]=function(){return(___getTypeName=Module[\"___getTypeName\"]=Module[\"asm\"][\"va\"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module[\"___embind_register_native_and_builtin_types\"]=function(){return(___embind_register_native_and_builtin_types=Module[\"___embind_register_native_and_builtin_types\"]=Module[\"asm\"][\"wa\"]).apply(null,arguments)};var _htons=Module[\"_htons\"]=function(){return(_htons=Module[\"_htons\"]=Module[\"asm\"][\"ya\"]).apply(null,arguments)};var _emscripten_builtin_memalign=Module[\"_emscripten_builtin_memalign\"]=function(){return(_emscripten_builtin_memalign=Module[\"_emscripten_builtin_memalign\"]=Module[\"asm\"][\"za\"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module[\"___cxa_is_pointer_type\"]=function(){return(___cxa_is_pointer_type=Module[\"___cxa_is_pointer_type\"]=Module[\"asm\"][\"Aa\"]).apply(null,arguments)};var dynCall_jiji=Module[\"dynCall_jiji\"]=function(){return(dynCall_jiji=Module[\"dynCall_jiji\"]=Module[\"asm\"][\"Ba\"]).apply(null,arguments)};var dynCall_viijii=Module[\"dynCall_viijii\"]=function(){return(dynCall_viijii=Module[\"dynCall_viijii\"]=Module[\"asm\"][\"Ca\"]).apply(null,arguments)};var dynCall_iiiiij=Module[\"dynCall_iiiiij\"]=function(){return(dynCall_iiiiij=Module[\"dynCall_iiiiij\"]=Module[\"asm\"][\"Da\"]).apply(null,arguments)};var dynCall_iiiiijj=Module[\"dynCall_iiiiijj\"]=function(){return(dynCall_iiiiijj=Module[\"dynCall_iiiiijj\"]=Module[\"asm\"][\"Ea\"]).apply(null,arguments)};var dynCall_iiiiiijj=Module[\"dynCall_iiiiiijj\"]=function(){return(dynCall_iiiiiijj=Module[\"dynCall_iiiiiijj\"]=Module[\"asm\"][\"Fa\"]).apply(null,arguments)};var dynCall_viiiiji=Module[\"dynCall_viiiiji\"]=function(){return(dynCall_viiiiji=Module[\"dynCall_viiiiji\"]=Module[\"asm\"][\"Ga\"]).apply(null,arguments)};Module[\"FS\"]=FS;var calledRun;function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}Module[\"run\"]=run;function exit(status,implicit){EXITSTATUS=status;procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module[\"onExit\"])Module[\"onExit\"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();\n\n\n  return Module.ready\n}\n);\n})();\nexport default Module;","import type {OpenCascadeInstance} from './CadCommon';\nimport {CadLoaderSync} from './CadLoaderSync';\n\n// 1 - full opencascade build\n// import initOpenCascade from 'opencascade.js';\n//\n// 2 - custom opencascade build\n// @ts-ignore\n// // import opencascadeCustomBuildWasm from './build/cadNodes.wasm';\ninterface InitOpenCascadeOption {\n\tmainJS: () => Promise<OpenCascadeInstance>;\n\tmainWasm: string;\n\tworker?: string;\n\tlibs?: string[];\n\tmodule?: Object;\n}\ntype InitCallback = (options: InitOpenCascadeOption) => Promise<OpenCascadeInstance>;\nimport opencascadeCustomBuild from './build/polygonjs-occt.js';\nconst initOpenCascade: InitCallback = (options) => {\n\tconst module = options.module || {};\n\treturn new Promise((resolve, reject) => {\n\t\tnew (options.mainJS as any)({\n\t\t\tlocateFile(path: string) {\n\t\t\t\tif (path.endsWith('.wasm')) {\n\t\t\t\t\treturn options.mainWasm;\n\t\t\t\t}\n\t\t\t\tif (path.endsWith('.worker.js') && !!options.worker) {\n\t\t\t\t\treturn options.worker;\n\t\t\t\t}\n\t\t\t\treturn path;\n\t\t\t},\n\t\t\t...module,\n\t\t}).then(async (oc: OpenCascadeInstance) => {\n\t\t\tif (options.libs) {\n\t\t\t\tfor (const lib of options.libs) {\n\t\t\t\t\tawait (oc as any).loadDynamicLibrary(lib, {\n\t\t\t\t\t\tloadAsync: true,\n\t\t\t\t\t\tglobal: true,\n\t\t\t\t\t\tnodelete: true,\n\t\t\t\t\t\tallowUndefined: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tresolve(oc);\n\t\t});\n\t});\n};\n\n// import initOpenCascade from 'opencascade.js';\n\n//\nimport {Poly} from '../../../../engine/Poly';\nimport {sanitizeUrl} from '../../../UrlHelper';\nimport {BaseNodeType} from '../../../../engine/nodes/_Base';\nimport {LIBRARY_INSTALL_HINT} from './../../../loader/common';\nimport {MathUtils} from 'three';\n\nlet _resolves: Resolve[] = [];\n// let _requestingNodes: BaseNodeType[] = [];\nlet _importStarted = false;\ntype Resolve = (value: OpenCascadeInstance | PromiseLike<OpenCascadeInstance>) => void;\nlet _oc: OpenCascadeInstance | undefined;\nexport class CadLoader {\n\tstatic async core(_?: BaseNodeType): Promise<OpenCascadeInstance> {\n\t\tif (_oc) {\n\t\t\treturn _oc;\n\t\t}\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (_importStarted) {\n\t\t\t\t_resolves.push(resolve);\n\t\t\t\t// _requestingNodes.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_importStarted = true;\n\n\t\t\tconst onError = () => {\n\t\t\t\t// console.log(err);\n\t\t\t\tconst message = `failed to load OpenCascade library. Make sure to install it to use CAD nodes (${LIBRARY_INSTALL_HINT})`;\n\t\t\t\t// console.log(message);\n\t\t\t\t// if (_requestingNodes.length > 0) {\n\t\t\t\t// \tfor (let node of _requestingNodes) {\n\t\t\t\t// \t\tnode.states.error.set(message);\n\t\t\t\t// \t}\n\t\t\t\t// }\n\n\t\t\t\treject(new Error(message));\n\t\t\t};\n\n\t\t\tconst root = Poly.libs.root();\n\t\t\tconst OCCTPath = Poly.libs.OCCTPath();\n\t\t\tif (root || OCCTPath) {\n\t\t\t\tconst version = Poly.version().replace(/\\./g, '-');\n\t\t\t\tconst id = process.env.NODE_ENV == 'development' ? MathUtils.generateUUID() : version;\n\t\t\t\tconst wasmUrl = sanitizeUrl(`${root || ''}${OCCTPath || ''}/polygonjs-occt.wasm?v=${id}`);\n\t\t\t\ttry {\n\t\t\t\t\t// prefetch wasm to get a proper error if wasm isn't found\n\t\t\t\t\tconst response = await fetch(wasmUrl, {method: 'HEAD'});\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tonError();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// fetch wasm\n\t\t\t\t\t// const startTime = performance.now();\n\t\t\t\t\t// 1 - full opencascade build\n\t\t\t\t\t// const oc = (await initOpenCascade()) as any as OpenCascadeInstance;\n\t\t\t\t\t// 2 - custom opencascade build\n\t\t\t\t\tconst oc = await initOpenCascade({\n\t\t\t\t\t\tmainJS: opencascadeCustomBuild,\n\t\t\t\t\t\tmainWasm: wasmUrl,\n\t\t\t\t\t});\n\t\t\t\t\t// .then((oc) => {\n\t\t\t\t\t//\n\t\t\t\t\t//\n\t\t\t\t\t// console.log('opencascade build loaded in:', performance.now() - startTime);\n\t\t\t\t\t_oc = oc;\n\n\t\t\t\t\tCadLoaderSync.__setOC(oc);\n\t\t\t\t\t// register blob\n\t\t\t\t\tPoly.blobs.fetchBlobGlobal(wasmUrl);\n\n\t\t\t\t\tresolve(oc);\n\t\t\t\t\tif (_resolves.length > 0) {\n\t\t\t\t\t\tfor (const _resolve of _resolves) {\n\t\t\t\t\t\t\t_resolve(oc);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_resolves.length = 0;\n\t\t\t\t\t}\n\t\t\t\t\t// })\n\t\t\t\t\t// .catch((err) => {\n\t\t\t\t\t// \tonError();\n\t\t\t\t\t// });\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonError();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import type {\n\tOpenCascadeInstance,\n\tgp_Pnt2d,\n\tgp_Vec2d,\n\tgp_Quaternion,\n\tgp_Vec,\n\tgp_Trsf,\n\tgp_Pnt,\n\tgp_Ax1,\n\tgp_Ax2,\n\tgp_Dir,\n\tgp_XYZ,\n\tgp_Pln,\n\tBnd_Box,\n\tTopLoc_Location,\n\tMessage_ProgressRange,\n\tTopTools_ListOfShape,\n\tGProp_GProps,\n} from './CadCommon';\n\nlet _oc: OpenCascadeInstance | undefined;\nexport class CadLoaderSync {\n\tstatic __setOC(oc: OpenCascadeInstance) {\n\t\t_oc = oc;\n\t\t// set globals\n\t\tthis.gp_Ax1 = new oc.gp_Ax1_1();\n\t\tthis.gp_Ax2 = new oc.gp_Ax2_1();\n\t\tthis.gp_Dir = new oc.gp_Dir_1();\n\t\tthis.gp_Pnt2d = new oc.gp_Pnt2d_1();\n\t\tthis.gp_Vec2d = new oc.gp_Vec2d_1();\n\t\tthis.gp_Pln = new oc.gp_Pln_1();\n\t\tthis.gp_Pnt = new oc.gp_Pnt_1();\n\t\tthis.gp_Quaternion = new oc.gp_Quaternion_1();\n\t\tthis.gp_Trsf = new oc.gp_Trsf_1();\n\t\tthis.gp_TrsfT = new oc.gp_Trsf_1();\n\t\tthis.gp_TrsfR = new oc.gp_Trsf_1();\n\t\tthis.gp_TrsfS = new oc.gp_Trsf_1();\n\t\t// this.gp_GTrsf = new oc.gp_GTrsf_1();\n\t\tthis.gp_Vec = new oc.gp_Vec_1();\n\t\tthis.gp_XYZ = new oc.gp_XYZ_1();\n\t\tthis.Bnd_Box = new oc.Bnd_Box_1();\n\t\tthis.TopLoc_Location = new oc.TopLoc_Location_1();\n\t\tthis.Message_ProgressRange = new oc.Message_ProgressRange_1();\n\t\tthis.TopTools_ListOfShape = new oc.TopTools_ListOfShape_1();\n\t\tthis.GProp_GProps = new oc.GProp_GProps_1();\n\t}\n\tstatic oc() {\n\t\treturn _oc!;\n\t}\n\n\tstatic gp_Ax1: gp_Ax1;\n\tstatic gp_Ax2: gp_Ax2;\n\tstatic gp_Dir: gp_Dir;\n\tstatic gp_Pln: gp_Pln;\n\tstatic gp_Pnt2d: gp_Pnt2d;\n\tstatic gp_Pnt: gp_Pnt;\n\tstatic gp_Vec2d: gp_Vec2d;\n\tstatic gp_Quaternion: gp_Quaternion;\n\tstatic gp_Trsf: gp_Trsf;\n\tstatic gp_TrsfT: gp_Trsf;\n\tstatic gp_TrsfR: gp_Trsf;\n\tstatic gp_TrsfS: gp_Trsf;\n\tstatic gp_Vec: gp_Vec;\n\tstatic gp_XYZ: gp_XYZ;\n\tstatic Bnd_Box: Bnd_Box;\n\tstatic TopLoc_Location: TopLoc_Location;\n\tstatic Message_ProgressRange: Message_ProgressRange;\n\tstatic TopTools_ListOfShape: TopTools_ListOfShape;\n\tstatic GProp_GProps: GProp_GProps;\n\t// static TopLoc_Location:TopLoc_Location\n}\n","import type {FaceData, OpenCascadeInstance, TopoDS_Face} from '../CadCommon';\nimport {CadGC} from '../CadCommon';\nimport {CadLoaderSync} from '../CadLoaderSync';\nenum FaceOrientation {\n\tBACKWARD = 0,\n\tFORWARD = 1,\n}\nfunction faceOrientation(oc: OpenCascadeInstance, face: TopoDS_Face): FaceOrientation {\n\treturn face.Orientation_1() === oc.TopAbs_Orientation.TopAbs_FORWARD\n\t\t? FaceOrientation.FORWARD\n\t\t: FaceOrientation.BACKWARD;\n}\nconst STRIDE = 3;\nexport function faceData(oc: OpenCascadeInstance, face: TopoDS_Face, index0 = 0): FaceData | void {\n\treturn CadGC.withGC((r) => {\n\t\tconst location = CadLoaderSync.TopLoc_Location;\n\t\tconst triangulation = oc.BRep_Tool.Triangulation(face, location, 0);\n\n\t\tif (triangulation.IsNull()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transformation = location.Transformation();\n\t\tconst tri = triangulation.get();\n\t\tconst nbNodes = tri.NbNodes();\n\n\t\t// init\n\t\tconst normalsArray = r(new oc.TColgp_Array1OfDir_2(1, nbNodes));\n\t\tconst pc = r(new oc.Poly_Connect_2(triangulation));\n\t\toc.StdPrs_ToolTriangulatedShape.Normal(face, pc, normalsArray);\n\t\tconst nbTriangles = tri.NbTriangles();\n\t\tconst faceData: FaceData = {\n\t\t\tpositions: new Array(nbNodes * 3),\n\t\t\tnormals: new Array(normalsArray.Length() * 3),\n\t\t\tindices: new Array(nbTriangles * 3),\n\t\t};\n\n\t\t// positions\n\t\tfor (let i = 1; i <= nbNodes; i++) {\n\t\t\tconst p = tri.Node(i).Transformed(transformation);\n\t\t\tconst index = (i - 1) * STRIDE;\n\t\t\tfaceData.positions[index] = p.X();\n\t\t\tfaceData.positions[index + 1] = p.Y();\n\t\t\tfaceData.positions[index + 2] = p.Z();\n\t\t}\n\n\t\t// normals\n\t\tfor (let i = normalsArray.Lower(); i <= normalsArray.Upper(); i++) {\n\t\t\tconst d = normalsArray.Value(i).Transformed(transformation);\n\t\t\tconst index = (i - 1) * STRIDE;\n\t\t\tfaceData.normals[index] = d.X();\n\t\t\tfaceData.normals[index + 1] = d.Y();\n\t\t\tfaceData.normals[index + 2] = d.Z();\n\t\t}\n\n\t\t// indices\n\t\tlet trisCount = 0;\n\t\tconst orientation = faceOrientation(oc, face);\n\t\tfor (let nt = 1; nt <= nbTriangles; nt++) {\n\t\t\tconst t = tri.Triangle(nt);\n\t\t\tlet n1 = t.Value(1);\n\t\t\tlet n2 = t.Value(2);\n\t\t\tconst n3 = t.Value(3);\n\t\t\tif (orientation == FaceOrientation.BACKWARD) {\n\t\t\t\tconst tmp = n1;\n\t\t\t\tn1 = n2;\n\t\t\t\tn2 = tmp;\n\t\t\t}\n\t\t\tconst index = trisCount * STRIDE;\n\t\t\tfaceData.indices[index] = n1 - 1 + index0;\n\t\t\tfaceData.indices[index + 1] = n2 - 1 + index0;\n\t\t\tfaceData.indices[index + 2] = n3 - 1 + index0;\n\t\t\ttrisCount++;\n\t\t}\n\t\treturn faceData;\n\t});\n}\n","import {traverseEdges, traverseFaces} from '../CadTraverse';\nimport type {\n\tOpenCascadeInstance,\n\tTopoDS_Shape,\n\tCADTesselationParams,\n\tCachedCADTesselationParams,\n\tCadGeometryTypeShape,\n\tTopoDS_Edge,\n\tTopoDS_Face,\n\tBRepMesh_IncrementalMesh,\n} from '../CadCommon';\nimport {faceData} from './CadTriangulationFaceUtils';\nimport {BufferGeometry, BufferAttribute, Object3D, Mesh} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {ObjectType} from '../../../Constant';\nimport {cadMaterialLineGroup, cadMaterialMesh, cadMaterialMeshGroup} from '../CadConstant';\nimport {cadEdgeToObject3D} from './CadEdge';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport {CadObject} from '../CadObject';\nimport {objectContentCopyProperties} from '../../../ObjectContent';\nimport {BaseSopNodeType} from '../../../../../engine/nodes/sop/_Base';\nimport {SopType} from '../../../../../engine/poly/registers/nodes/types/Sop';\nimport {CadEntityGroupCollection} from '../CadEntityGroupCollection';\nimport type {CADGroupSopNode} from '../../../../../engine/nodes/sop/CADGroup';\nimport {EntityGroupType} from '../../../EntityGroupCollection';\nimport {withCadException} from '../CadExceptionHandler';\nimport {arrayPushItems} from '../../../../ArrayUtils';\n\nfunction cachedTesselationParamsEqual(params1: CachedCADTesselationParams, params2: CachedCADTesselationParams) {\n\treturn (\n\t\tparams1.linearTolerance == params2.linearTolerance &&\n\t\tparams1.angularTolerance == params2.angularTolerance &&\n\t\tparams1.curveAbscissa == params2.curveAbscissa &&\n\t\tparams1.curveTolerance == params2.curveTolerance\n\t);\n}\n\nconst tesselationParamsByShape: WeakMap<TopoDS_Shape, CachedCADTesselationParams> = new WeakMap();\nexport function cadShapeToObject3D(\n\tcadObject: CadObject<CadGeometryTypeShape>,\n\ttesselationParams: CADTesselationParams,\n\tdisplayNode: BaseSopNodeType\n) {\n\tconst oc = CadLoaderSync.oc();\n\tconst shape = cadObject.cadGeometry();\n\tlet cachedParams = tesselationParamsByShape.get(shape);\n\tif (cachedParams && !cachedTesselationParamsEqual(cachedParams, tesselationParams)) {\n\t\toc.BRepTools.Clean(shape, true);\n\t}\n\ttesselationParamsByShape.set(shape, {...tesselationParams});\n\n\tconst objects: Object3D[] = [];\n\n\tfunction _processMesh(mesh?: Mesh) {\n\t\tif (mesh) {\n\t\t\tobjectContentCopyProperties(cadObject, mesh);\n\t\t\tobjects.push(mesh);\n\t\t}\n\t\treturn mesh;\n\t}\n\tfunction _processEdgeObject(edge: TopoDS_Edge) {\n\t\tconst edgeObject = cadEdgeToObject3D(edge, tesselationParams);\n\t\tif (edgeObject) {\n\t\t\t// it seems better to not have shadows from those edges\n\t\t\tedgeObject.castShadow = false;\n\t\t\tedgeObject.receiveShadow = false;\n\t\t\tobjects.push(edgeObject);\n\t\t}\n\t\treturn edgeObject;\n\t}\n\tfunction _displayNodeIsEdgeGroup() {\n\t\tif (displayNode.type() == SopType.CAD_GROUP) {\n\t\t\tconst groupNode = displayNode as CADGroupSopNode;\n\t\t\treturn groupNode.groupType() == EntityGroupType.EDGE;\n\t\t}\n\t\treturn false;\n\t}\n\tfunction _displayNodeIsFaceGroup() {\n\t\tif (displayNode.type() == SopType.CAD_GROUP) {\n\t\t\tconst groupNode = displayNode as CADGroupSopNode;\n\t\t\treturn groupNode.groupType() == EntityGroupType.FACE;\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (_displayNodeIsFaceGroup()) {\n\t\tconst groupNode = displayNode as CADGroupSopNode;\n\t\tconst groupName = groupNode.groupName();\n\t\tconst facesInGroup: TopoDS_Face[] = [];\n\t\tconst facesNotInGroup: TopoDS_Face[] = [];\n\t\tCadEntityGroupCollection.traverseEntitiesInGroup({\n\t\t\tgroupName,\n\t\t\tgroupType: EntityGroupType.FACE,\n\t\t\tobject: cadObject,\n\t\t\tshape,\n\t\t\ttraverseFunction: traverseFaces,\n\t\t\tonEntityTraversed: (face, i) => {\n\t\t\t\tfacesInGroup.push(face);\n\t\t\t},\n\t\t\tonEntityNotInGroupTraversed: (face, i) => {\n\t\t\t\tfacesNotInGroup.push(face);\n\t\t\t},\n\t\t});\n\t\tconst objectInGroup = _createMeshFromFaces(oc, shape, facesInGroup, tesselationParams);\n\t\tconst objectNotInGroup = _createMeshFromFaces(oc, shape, facesNotInGroup, tesselationParams);\n\t\tif (objectInGroup) {\n\t\t\tobjectInGroup.material = cadMaterialMeshGroup();\n\t\t}\n\t\t_processMesh(objectInGroup);\n\t\t_processMesh(objectNotInGroup);\n\t} else {\n\t\tif (tesselationParams.displayMeshes) {\n\t\t\tconst mesh = _createMesh(oc, shape, tesselationParams);\n\t\t\t_processMesh(mesh);\n\t\t}\n\t}\n\n\tif (_displayNodeIsEdgeGroup()) {\n\t\tconst groupNode = displayNode as CADGroupSopNode;\n\t\tconst groupName = groupNode.groupName();\n\t\tCadEntityGroupCollection.traverseEntitiesInGroup({\n\t\t\tgroupName,\n\t\t\tgroupType: EntityGroupType.EDGE,\n\t\t\tobject: cadObject,\n\t\t\tshape,\n\t\t\ttraverseFunction: traverseEdges,\n\t\t\tonEntityTraversed: (edge, i) => {\n\t\t\t\tconst edgeObject = _processEdgeObject(edge);\n\t\t\t\tif (edgeObject) {\n\t\t\t\t\tedgeObject.material = cadMaterialLineGroup();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEntityNotInGroupTraversed: _processEdgeObject,\n\t\t});\n\t} else {\n\t\tif (tesselationParams.displayEdges) {\n\t\t\ttraverseEdges(oc, shape, _processEdgeObject);\n\t\t}\n\t}\n\n\treturn objects;\n}\ninterface MeshBuffers {\n\tpositions: number[];\n\tnormals: number[];\n\tindices: number[];\n}\nfunction _createMesh(\n\toc: OpenCascadeInstance,\n\tobject: TopoDS_Shape,\n\ttesselationParams: CADTesselationParams\n): Mesh | undefined {\n\tconst mesher = withCadException<BRepMesh_IncrementalMesh>(oc, () => {\n\t\tconst _mesher = new oc.BRepMesh_IncrementalMesh_2(\n\t\t\tobject,\n\t\t\ttesselationParams.linearTolerance,\n\t\t\ttrue,\n\t\t\ttesselationParams.angularTolerance,\n\t\t\ttrue\n\t\t);\n\t\treturn _mesher;\n\t});\n\tif (!mesher) {\n\t\tconst updatedTesselationParams: CADTesselationParams = {...tesselationParams};\n\t\tupdatedTesselationParams.linearTolerance *= 2;\n\t\tupdatedTesselationParams.angularTolerance *= 2;\n\t\tupdatedTesselationParams.curveAbscissa *= 2;\n\t\tupdatedTesselationParams.curveTolerance *= 2;\n\t\treturn _createMesh(oc, object, updatedTesselationParams);\n\t}\n\tif (mesher.IsDone()) {\n\t\tconst positions: number[] = [];\n\t\tconst normals: number[] = [];\n\t\tconst indices: number[] = [];\n\t\tconst buffers: MeshBuffers = {positions, normals, indices};\n\t\ttraverseFaces(oc, object, (face) => {\n\t\t\t_updateBufferFromFace(oc, face, buffers);\n\t\t});\n\t\tmesher.delete();\n\n\t\treturn _createMeshFromBuffers(buffers, tesselationParams);\n\t}\n}\nfunction _createMeshFromFaces(\n\toc: OpenCascadeInstance,\n\tobject: TopoDS_Shape,\n\tfaces: TopoDS_Face[],\n\ttesselationParams: CADTesselationParams\n) {\n\tconst mesher = new oc.BRepMesh_IncrementalMesh_2(\n\t\tobject,\n\t\ttesselationParams.linearTolerance,\n\t\ttrue,\n\t\ttesselationParams.angularTolerance,\n\t\ttrue\n\t);\n\tif (mesher.IsDone()) {\n\t\tconst positions: number[] = [];\n\t\tconst normals: number[] = [];\n\t\tconst indices: number[] = [];\n\t\tconst buffers: MeshBuffers = {positions, normals, indices};\n\t\tfor (const face of faces) {\n\t\t\t_updateBufferFromFace(oc, face, buffers);\n\t\t}\n\t\tmesher.delete();\n\t\treturn _createMeshFromBuffers(buffers, tesselationParams);\n\t}\n}\n\nfunction _updateBufferFromFace(oc: OpenCascadeInstance, face: TopoDS_Face, buffers: MeshBuffers) {\n\tconst {positions, normals, indices} = buffers;\n\tconst data = faceData(oc, face, positions.length / 3);\n\n\tif (data) {\n\t\tarrayPushItems(data.positions, positions);\n\t\tarrayPushItems(data.normals, normals);\n\t\tarrayPushItems(data.indices, indices);\n\t}\n}\nfunction _createMeshFromBuffers(buffers: MeshBuffers, tesselationParams: CADTesselationParams) {\n\tconst {positions, normals, indices} = buffers;\n\n\tconst geo = new BufferGeometry();\n\tgeo.setAttribute('position', new BufferAttribute(new Float32Array(positions), 3));\n\tgeo.setAttribute('normal', new BufferAttribute(new Float32Array(normals), 3));\n\tgeo.setIndex(indices);\n\n\treturn BaseSopOperation.createObject(\n\t\tgeo,\n\t\tObjectType.MESH,\n\t\tcadMaterialMesh(tesselationParams.meshesColor, tesselationParams.wireframe)\n\t);\n}\n","import {\n\tGeom2d_Curve,\n\tTopoDS_Edge,\n\tTopoDS_Wire,\n\tTopoDS_Vertex,\n\tTopoDS_Shape,\n\tgp_Pnt2d,\n\tCadGeometryType,\n\tCadTypeMap,\n\tcadGeometryTypeFromShape,\n\tcadDowncast,\n\tCADTesselationParams,\n\tCadBox3Handle,\n\t_createCadBox3Handle,\n\tCadGeometryTypeShape,\n} from './CadCommon';\nimport {ObjectContent, CoreObjectType, ObjectGeometryMap, objectContentCopyProperties} from '../../ObjectContent';\nimport {cadPnt2dClone, cadPnt2dToObject3D} from './toObject3D/CadPnt2d';\nimport {cadVertexClone, cadVertexToObject3D} from './toObject3D/CadVertex';\nimport {\n\tcadGeom2dCurveClone,\n\tcadGeom2dCurveToBufferGeometry,\n\tcadGeom2dCurveToObject3D,\n\tCURVE_2D_TESSELATION_PARAMS,\n} from './toObject3D/CadGeom2dCurve';\nimport {cadEdgeClone, cadEdgeObjectToObject3D} from './toObject3D/CadEdge';\nimport {cadWireClone, cadWireToObject3D} from './toObject3D/CadWire';\nimport {CoreCadType} from './CadCoreType';\nimport {CadLoaderSync} from './CadLoaderSync';\nimport {cadShapeClone} from './toObject3D/CadShapeCommon';\nimport {TypeAssert} from '../../../../engine/poly/Assert';\nimport {cadShapeToObject3D} from './toObject3D/CadShape';\nimport {Object3D, Material, Matrix4, Box3, Vector3, Quaternion, Euler} from 'three';\nimport {cadGeometryTransform} from './operations/CadTransform';\nimport {BaseSopNodeType} from '../../../../engine/nodes/sop/_Base';\nimport {cadCompoundToObject3D} from './toObject3D/CadCompound';\nconst t = new Vector3();\nconst q = new Quaternion();\nconst s = new Vector3();\nconst euler = new Euler();\nconst r = new Vector3();\nconst pivot = new Vector3();\n\nconst DEFAULT_BND_BOX: CadBox3Handle = _createCadBox3Handle();\nconst BBOX_EMPTY = new Box3();\n\n// const DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\nexport class CadObject<T extends CadGeometryType> implements ObjectContent<CoreObjectType.CAD> {\n\tpublic visible = true;\n\tget geometry() {\n\t\treturn this._geometry as ObjectGeometryMap[CoreObjectType.CAD];\n\t}\n\tget type() {\n\t\treturn this._type;\n\t}\n\tuserData = {};\n\tname = '';\n\tcastShadow = true;\n\treceiveShadow = true;\n\trenderOrder = 0;\n\tfrustumCulled = true;\n\tmatrixAutoUpdate = false;\n\tmaterial: Material | undefined;\n\tchildren: ObjectContent<CoreObjectType.CAD>[] = [];\n\tparent: ObjectContent<CoreObjectType.CAD> | null = null;\n\tconstructor(private _geometry: CadTypeMap[T], private _type: T) {\n\t\tthis._validate();\n\t}\n\tsetGeometry<TE extends CadGeometryType>(geometry: CadTypeMap[TE], type: TE) {\n\t\tthis._geometry = geometry as CadTypeMap[T];\n\t\tthis._type = type as any as T;\n\t\tthis._validate();\n\t}\n\tprivate _validate() {\n\t\tif (CoreCadType.isGeometryShape(this._geometry)) {\n\t\t\tconst oc = CadLoaderSync.oc();\n\t\t\tif (oc) {\n\t\t\t\tthis._geometry = cadDowncast(oc, this._geometry) as CadTypeMap[T];\n\t\t\t\tconst type = cadGeometryTypeFromShape(oc, this._geometry as any) as T;\n\t\t\t\tif (type) {\n\t\t\t\t\tthis._type = type;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('no type for geometry', this._geometry);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.type == null) {\n\t\t\t\tconsole.error('type is required for geometry', this._geometry);\n\t\t\t}\n\t\t}\n\t}\n\t// static fromGeometry<T extends CadGeometryType>(geometry: CadTypeMap[T], type: T) {\n\t// \treturn new CadObject(geometry, type);\n\t// }\n\t// type() {\n\t// \treturn this._type!;\n\t// }\n\tcadGeometry() {\n\t\treturn this.geometry! as CadTypeMap[T];\n\t}\n\tdispose() {}\n\tapplyMatrix4(matrix: Matrix4) {\n\t\tmatrix.decompose(t, q, s);\n\t\teuler.setFromQuaternion(q);\n\t\tr.set(euler.x, euler.y, euler.z).multiplyScalar(RAD2DEG);\n\t\tconst newGeometry = cadGeometryTransform(this.type, this.cadGeometry(), t, r, s.x, pivot);\n\t\tif (newGeometry) {\n\t\t\tconst oc = CadLoaderSync.oc();\n\t\t\tif (CoreCadType.isGeometryShape(newGeometry)) {\n\t\t\t\tconst newType = cadGeometryTypeFromShape(oc, newGeometry);\n\t\t\t\tif (newType) {\n\t\t\t\t\tthis.setGeometry(newGeometry, newType);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// no need to re-add as it is transformed in place\n\t\t\t}\n\t\t}\n\t}\n\tadd(...object: ObjectContent<CoreObjectType>[]) {}\n\tremove(...object: ObjectContent<CoreObjectType>[]) {}\n\tdispatchEvent(event: {type: string}) {}\n\ttraverse(callback: (object: CadObject<T>) => any) {\n\t\tcallback(this);\n\t}\n\n\tclone(): CadObject<T> {\n\t\tconst geometry = cloneCadGeometry(this.type, this.cadGeometry());\n\t\tconst clone = new CadObject(geometry, this.type);\n\n\t\tobjectContentCopyProperties(this, clone);\n\t\treturn clone;\n\t}\n\ttoObject3D(\n\t\ttesselationParams: CADTesselationParams,\n\t\tdisplayNode: BaseSopNodeType\n\t): Object3D | Object3D[] | undefined {\n\t\treturn CadObject.toObject3D(this, this.type, tesselationParams, displayNode);\n\t}\n\n\tstatic toObject3D<T extends CadGeometryType>(\n\t\tcadObject: CadObject<T>,\n\t\ttype: T,\n\t\ttesselationParams: CADTesselationParams,\n\t\tdisplayNode: BaseSopNodeType\n\t): Object3D | Object3D[] | undefined {\n\t\tswitch (type) {\n\t\t\tcase CadGeometryType.POINT_2D: {\n\t\t\t\treturn cadPnt2dToObject3D(cadObject as CadObject<CadGeometryType.POINT_2D>);\n\t\t\t}\n\t\t\tcase CadGeometryType.CURVE_2D: {\n\t\t\t\treturn cadGeom2dCurveToObject3D(cadObject as CadObject<CadGeometryType.CURVE_2D>, tesselationParams);\n\t\t\t}\n\t\t\t// case CadObjectType.CURVE_3D: {\n\t\t\t// \treturn cadGeomCurveToObject3D(oc, object as Geom_Curve, tesselationParams);\n\t\t\t// }\n\t\t\tcase CadGeometryType.VERTEX: {\n\t\t\t\treturn cadVertexToObject3D(cadObject as CadObject<CadGeometryType.VERTEX>);\n\t\t\t}\n\t\t\tcase CadGeometryType.EDGE: {\n\t\t\t\treturn cadEdgeObjectToObject3D(cadObject as CadObject<CadGeometryType.EDGE>, tesselationParams);\n\t\t\t}\n\t\t\tcase CadGeometryType.WIRE: {\n\t\t\t\treturn cadWireToObject3D(cadObject as CadObject<CadGeometryType.WIRE>, tesselationParams);\n\t\t\t}\n\t\t\tcase CadGeometryType.FACE:\n\t\t\tcase CadGeometryType.SHELL:\n\t\t\tcase CadGeometryType.SOLID:\n\t\t\tcase CadGeometryType.COMPSOLID: {\n\t\t\t\treturn cadShapeToObject3D(cadObject as CadObject<CadGeometryTypeShape>, tesselationParams, displayNode);\n\t\t\t}\n\t\t\tcase CadGeometryType.COMPOUND: {\n\t\t\t\treturn cadCompoundToObject3D(\n\t\t\t\t\tcadObject as CadObject<CadGeometryType.COMPOUND>,\n\t\t\t\t\ttesselationParams,\n\t\t\t\t\tdisplayNode\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(type);\n\t}\n\n\tboundingBox(target: Box3): void {\n\t\tconst oc = CadLoaderSync.oc();\n\t\tconst Bnd_Box = CadLoaderSync.Bnd_Box;\n\t\tBnd_Box.SetVoid();\n\t\tconst useTriangulation = true;\n\t\tif (CoreCadType.isShape(this)) {\n\t\t\toc.BRepBndLib.Add(this.cadGeometry() as TopoDS_Shape, Bnd_Box, useTriangulation);\n\t\t\tBnd_Box.Get(\n\t\t\t\tDEFAULT_BND_BOX.min.x as any,\n\t\t\t\tDEFAULT_BND_BOX.min.y as any,\n\t\t\t\tDEFAULT_BND_BOX.min.z as any,\n\t\t\t\tDEFAULT_BND_BOX.max.x as any,\n\t\t\t\tDEFAULT_BND_BOX.max.y as any,\n\t\t\t\tDEFAULT_BND_BOX.max.z as any\n\t\t\t);\n\t\t\ttarget.min.x = DEFAULT_BND_BOX.min.x.current;\n\t\t\ttarget.min.y = DEFAULT_BND_BOX.min.y.current;\n\t\t\ttarget.min.z = DEFAULT_BND_BOX.min.z.current;\n\t\t\ttarget.max.x = DEFAULT_BND_BOX.max.x.current;\n\t\t\ttarget.max.y = DEFAULT_BND_BOX.max.y.current;\n\t\t\ttarget.max.z = DEFAULT_BND_BOX.max.z.current;\n\t\t\treturn;\n\t\t} else {\n\t\t\tswitch (this.type) {\n\t\t\t\tcase CadGeometryType.POINT_2D: {\n\t\t\t\t\tconst point = this.cadGeometry() as gp_Pnt2d;\n\t\t\t\t\ttarget.min.x = point.X();\n\t\t\t\t\ttarget.min.y = point.Y();\n\t\t\t\t\ttarget.min.z = 0;\n\t\t\t\t\ttarget.max.x = point.X();\n\t\t\t\t\ttarget.max.y = point.Y();\n\t\t\t\t\ttarget.max.z = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase CadGeometryType.CURVE_2D: {\n\t\t\t\t\tconst geometry = cadGeom2dCurveToBufferGeometry(\n\t\t\t\t\t\tthis as CadObject<CadGeometryType.CURVE_2D>,\n\t\t\t\t\t\tCURVE_2D_TESSELATION_PARAMS\n\t\t\t\t\t);\n\t\t\t\t\tgeometry.computeBoundingBox();\n\t\t\t\t\tif (geometry.boundingBox) {\n\t\t\t\t\t\ttarget.copy(geometry.boundingBox);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.copy(BBOX_EMPTY);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tconsole.warn('cad BoundingBox not implemented for type', this.type);\n\t\t\t\t\ttarget.copy(BBOX_EMPTY);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// switch (type) {\n\n\t\t// }\n\t}\n}\n\nfunction cloneCadGeometry<T extends CadGeometryType>(type: CadGeometryType, srcGeometry: CadTypeMap[T]): CadTypeMap[T] {\n\tswitch (type) {\n\t\tcase CadGeometryType.POINT_2D: {\n\t\t\treturn cadPnt2dClone(srcGeometry as gp_Pnt2d) as CadTypeMap[T];\n\t\t}\n\t\tcase CadGeometryType.CURVE_2D: {\n\t\t\treturn cadGeom2dCurveClone(srcGeometry as Geom2d_Curve) as CadTypeMap[T];\n\t\t}\n\t\t// case CadObjectType.CURVE_3D: {\n\t\t// \treturn cadGeomCurveClone(srcObject as Geom_Curve) as CadTypeMap[T];\n\t\t// }\n\t\tcase CadGeometryType.VERTEX: {\n\t\t\treturn cadVertexClone(srcGeometry as TopoDS_Vertex) as CadTypeMap[T];\n\t\t}\n\t\tcase CadGeometryType.EDGE: {\n\t\t\treturn cadEdgeClone(srcGeometry as TopoDS_Edge) as CadTypeMap[T];\n\t\t}\n\t\tcase CadGeometryType.WIRE: {\n\t\t\treturn cadWireClone(srcGeometry as TopoDS_Wire) as CadTypeMap[T];\n\t\t}\n\t\tcase CadGeometryType.FACE:\n\t\tcase CadGeometryType.SHELL:\n\t\tcase CadGeometryType.SOLID:\n\t\tcase CadGeometryType.COMPSOLID:\n\t\tcase CadGeometryType.COMPOUND: {\n\t\t\treturn cadShapeClone(srcGeometry as TopoDS_Shape) as CadTypeMap[T];\n\t\t}\n\t}\n\tTypeAssert.unreachable(type);\n}\n\n// const ORIGIN = new Vector3(0, 0, 0);\n// export function cadObjectPosition<T extends CadGeometryType>(cadObject: CadObject<T>) {\n// \tconsole.warn('cadObjectPosition not implemented');\n// \treturn ORIGIN;\n// }\n","import type {OpenCascadeInstance, TopoDS_Shape, TopoDS_Face, TopoDS_Edge,TopoDS_Vertex} from './CadCommon';\n\nexport function traverseFaces(\n\toc: OpenCascadeInstance,\n\tshape: TopoDS_Shape,\n\tcallback: (face: TopoDS_Face, index: number) => void\n): void {\n\tlet index = 0;\n\tconst explorer = new oc.TopExp_Explorer_2(\n\t\tshape,\n\t\toc.TopAbs_ShapeEnum.TopAbs_FACE as any,\n\t\toc.TopAbs_ShapeEnum.TopAbs_SHAPE as any\n\t);\n\n\twhile (explorer.More()) {\n\t\tconst explorerCurrent = explorer.Current();\n\t\tconst face = oc.TopoDS.Face_1(explorerCurrent);\n\t\tcallback(face, index);\n\t\t// face.delete();\n\t\tindex += 1;\n\t\texplorer.Next();\n\t}\n\texplorer.delete();\n}\nexport function traverseEdges(\n\toc: OpenCascadeInstance,\n\tshape: TopoDS_Shape,\n\tcallback: (edge: TopoDS_Edge, index: number) => void\n): void {\n\tlet index = 0;\n\tconst explorer = new oc.TopExp_Explorer_2(\n\t\tshape,\n\t\toc.TopAbs_ShapeEnum.TopAbs_EDGE as any,\n\t\toc.TopAbs_ShapeEnum.TopAbs_SHAPE as any\n\t);\n\twhile (explorer.More()) {\n\t\tconst edge = oc.TopoDS.Edge_1(explorer.Current());\n\t\tcallback(edge, index);\n\t\tindex += 1;\n\t\texplorer.Next();\n\t}\n\texplorer.delete();\n}\nexport function traverseVertices(\n\toc: OpenCascadeInstance,\n\tshape: TopoDS_Shape,\n\tcallback: (edge: TopoDS_Vertex, index: number) => void\n): void {\n\tlet index = 0;\n\tconst explorer = new oc.TopExp_Explorer_2(\n\t\tshape,\n\t\toc.TopAbs_ShapeEnum.TopAbs_VERTEX as any,\n\t\toc.TopAbs_ShapeEnum.TopAbs_SHAPE as any\n\t);\n\twhile (explorer.More()) {\n\t\tconst vertex = oc.TopoDS.Vertex_1(explorer.Current());\n\t\tcallback(vertex, index);\n\t\tindex += 1;\n\t\texplorer.Next();\n\t}\n\texplorer.delete();\n}\n","import {TopoDS_Shape, Geom2d_Curve, gp_Pnt2d, CadTypeMap, cadGeometryTypeFromShape} from '../CadCommon';\nimport {CadGeometryType} from '../CadCommon';\nimport {CadObject} from '../CadObject';\nimport {Vector2, Vector3} from 'three';\nimport {cadPnt2dTransform} from '../toObject3D/CadPnt2d';\nimport {cadGeom2dCurveTransform} from '../toObject3D/CadGeom2dCurve';\nimport {cadShapeTransform} from '../toObject3D/CadShapeCommon';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport {CoreCadType} from '../CadCoreType';\n// import {CadLoaderSync} from '../CadLoaderSync';\n\nconst t2 = new Vector2();\nconst p2 = new Vector2();\nexport function cadTransform(cadObject: CadObject<CadGeometryType>, t: Vector3, r: Vector3, s: number, p: Vector3) {\n\tconst newGeometry = cadGeometryTransform(cadObject.type, cadObject.cadGeometry(), t, r, s, p);\n\tif (newGeometry) {\n\t\tconst oc = CadLoaderSync.oc();\n\t\tif (CoreCadType.isGeometryShape(newGeometry)) {\n\t\t\tconst newType = cadGeometryTypeFromShape(oc, newGeometry);\n\t\t\tif (newType) {\n\t\t\t\tcadObject.setGeometry(newGeometry, newType);\n\t\t\t}\n\t\t} else {\n\t\t\t// no need to re-add as it is transformed in place\n\t\t}\n\t}\n\t// switch (cadObject.type) {\n\t// \tcase CadGeometryType.POINT_2D: {\n\t// \t\tt2.set(t.x, t.y);\n\t// \t\tcadPnt2dTransform(cadObject.cadGeometry() as gp_Pnt2d, t2);\n\t// \t\treturn cadObject;\n\t// \t}\n\t// \tcase CadGeometryType.CURVE_2D: {\n\t// \t\tt2.set(t.x, t.y);\n\t// \t\tp2.set(p.x, p.y);\n\t// \t\tcadGeom2dCurveTransform(cadObject.cadGeometry() as Geom2d_Curve, t2, r.z, s, p2);\n\t// \t\treturn cadObject;\n\t// \t}\n\n\t// \tcase CadGeometryType.VERTEX:\n\t// \tcase CadGeometryType.EDGE:\n\t// \tcase CadGeometryType.WIRE:\n\t// \tcase CadGeometryType.FACE:\n\t// \tcase CadGeometryType.SHELL:\n\t// \tcase CadGeometryType.SOLID:\n\t// \tcase CadGeometryType.COMPSOLID:\n\t// \tcase CadGeometryType.COMPOUND: {\n\t// \t\t// make sure to re-assign the object,\n\t// \t\t// since it is not modified in place\n\t// \t\tconst oc = CadLoaderSync.oc();\n\t// \t\tif (!oc) {\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t\tconst newShape = cadShapeTransform(cadObject.cadGeometry() as TopoDS_Shape, t, r, s, p);\n\t// \t\tif (!newShape) {\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t\tconst type = cadGeometryTypeFromShape(oc, newShape);\n\t// \t\tif (type) {\n\t// \t\t\treturn CadObject.fromGeometry(newShape, type);\n\t// \t\t} else {\n\t// \t\t\tconsole.log('no type', newShape);\n\t// \t\t}\n\t// \t\treturn;\n\t// \t}\n\t// }\n}\n\nexport function cadGeometryTransform<T extends CadGeometryType>(\n\ttype: T,\n\tgeometry: CadTypeMap[T],\n\tt: Vector3,\n\tr: Vector3,\n\ts: number,\n\tp: Vector3\n) {\n\tswitch (type) {\n\t\tcase CadGeometryType.POINT_2D: {\n\t\t\tt2.set(t.x, t.y);\n\t\t\tcadPnt2dTransform(geometry as gp_Pnt2d, t2);\n\t\t\treturn geometry;\n\t\t}\n\t\tcase CadGeometryType.CURVE_2D: {\n\t\t\tt2.set(t.x, t.y);\n\t\t\tp2.set(p.x, p.y);\n\t\t\tcadGeom2dCurveTransform(geometry as Geom2d_Curve, t2, r.z, s, p2);\n\t\t\treturn geometry;\n\t\t}\n\n\t\tcase CadGeometryType.VERTEX:\n\t\tcase CadGeometryType.EDGE:\n\t\tcase CadGeometryType.WIRE:\n\t\tcase CadGeometryType.FACE:\n\t\tcase CadGeometryType.SHELL:\n\t\tcase CadGeometryType.SOLID:\n\t\tcase CadGeometryType.COMPSOLID:\n\t\tcase CadGeometryType.COMPOUND: {\n\t\t\tconst newShape = cadShapeTransform(geometry as TopoDS_Shape, t, r, s, p);\n\t\t\treturn newShape;\n\t\t}\n\t}\n}\n","import {CADTesselationParams, cadDowncast, cadGeometryTypeFromShape, CadGeometryType} from '../CadCommon';\nimport {BaseSopNodeType} from '../../../../../engine/nodes/sop/_Base';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport {CadObject} from '../CadObject';\nimport {Object3D} from 'three';\nimport {isArray} from '../../../../Type';\nimport {MergeSopOperation} from '../../../../../engine/operations/sop/Merge';\nimport {isObject3D} from '../../../ObjectContent';\n\nexport function cadCompoundToObject3D(\n\tcadObject: CadObject<CadGeometryType.COMPOUND>,\n\ttesselationParams: CADTesselationParams,\n\tdisplayNode: BaseSopNodeType\n) {\n\tconst oc = CadLoaderSync.oc();\n\tconst compound = cadObject.cadGeometry();\n\n\tconst iterator = new oc.TopoDS_Iterator_2(compound, true, true);\n\tconst iteratedObjects: Object3D[] = [];\n\twhile (iterator.More()) {\n\t\tconst newShape = cadDowncast(oc, iterator.Value());\n\t\tconst type = cadGeometryTypeFromShape(oc, newShape);\n\t\tif (type) {\n\t\t\tconst newObject = new CadObject(newShape, type);\n\t\t\tconst result = newObject.toObject3D(tesselationParams, displayNode);\n\t\t\tif (result) {\n\t\t\t\tif (isArray(result)) {\n\t\t\t\t\titeratedObjects.push(...result);\n\t\t\t\t} else {\n\t\t\t\t\titeratedObjects.push(result);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\titerator.Next();\n\t}\n\titerator.delete();\n\n\tconst newObjects = MergeSopOperation.makeCompact(iteratedObjects, {preserveMaterials: false}).filter(isObject3D);\n\treturn newObjects;\n}\nexport function cadCompoundSubObjectsCount(cadObject: CadObject<CadGeometryType.COMPOUND>): number {\n\tconst oc = CadLoaderSync.oc();\n\tconst compound = cadObject.cadGeometry();\n\tlet count = 0;\n\tconst iterator = new oc.TopoDS_Iterator_2(compound, true, true);\n\twhile (iterator.More()) {\n\t\tcount++;\n\n\t\titerator.Next();\n\t}\n\titerator.delete();\n\treturn count;\n}\n","import {\n\tOpenCascadeInstance,\n\tTopoDS_Edge,\n\tCADTesselationParams,\n\tGeom_Curve,\n\tCadNumberHandle,\n\tCadGeometryType,\n\tCadGC,\n} from '../CadCommon';\nimport {BufferGeometry, Float32BufferAttribute} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {cadMaterialLine} from '../CadConstant';\n// import {withCadException} from '../CadExceptionHandler';\nimport {ObjectType} from '../../../Constant';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport {cadShapeClone} from './CadShapeCommon';\nimport {CadObject} from '../CadObject';\nimport {objectContentCopyProperties} from '../../../ObjectContent';\n\nconst STRIDE = 3;\n// let point: gp_Pnt | undefined;\nconst v0: CadNumberHandle = {current: 0};\nconst v1: CadNumberHandle = {current: 0};\n// const WITH_ORIENTATION = true;\nexport function cadEdgeObjectToObject3D(\n\tcadObject: CadObject<CadGeometryType.EDGE>,\n\ttesselationParams: CADTesselationParams\n) {\n\tconst object = cadEdgeToObject3D(cadObject.cadGeometry(), tesselationParams);\n\tif (object) {\n\t\tobjectContentCopyProperties(cadObject, object);\n\t}\n\treturn object;\n}\nexport function cadEdgeToObject3D(edge: TopoDS_Edge, tesselationParams: CADTesselationParams) {\n\tconst geometry = cadEdgeToBufferGeometry(edge, tesselationParams);\n\tif (!geometry) {\n\t\treturn;\n\t}\n\tconst object = BaseSopOperation.createObject(\n\t\tgeometry,\n\t\tObjectType.LINE_SEGMENTS,\n\t\tcadMaterialLine(tesselationParams.edgesColor)\n\t);\n\treturn object;\n}\n\nexport function cadEdgeToBufferGeometry(edge: TopoDS_Edge, tesselationParams: CADTesselationParams) {\n\t// TODO: in the build process,\n\t// update the types so that we replace:\n\t// type Standard_Real = number;\n\t// with:\n\t// type Standard_Real = number | { current: number };\n\t// oc.BRep_Tool.Range_1(edge, v0 as any, v1 as any);\n\tconst oc = CadLoaderSync.oc();\n\tconst handle = curveDataFromEdge(oc, edge).curveHandle; //oc.BRep_Tool.Curve_2(edge, v0.current, v1.current);\n\tconst curve = handle.get();\n\tif (!curve) {\n\t\treturn;\n\t}\n\n\treturn CadGC.withGC((r) => {\n\t\tconst geom2Dadaptor = r(new oc.GeomAdaptor_Curve_2(handle));\n\n\t\tconst uniformAbscissa = r(\n\t\t\tnew oc.GCPnts_UniformAbscissa_3(\n\t\t\t\tgeom2Dadaptor,\n\t\t\t\ttesselationParams.curveAbscissa,\n\t\t\t\tv0.current,\n\t\t\t\tv1.current,\n\t\t\t\ttesselationParams.curveTolerance\n\t\t\t)\n\t\t);\n\n\t\tlet positions: number[] | undefined;\n\t\tlet indices: number[] | undefined;\n\t\tconst point = CadLoaderSync.gp_Pnt;\n\n\t\tif (uniformAbscissa.IsDone()) {\n\t\t\tconst pointsCount = uniformAbscissa.NbPoints();\n\n\t\t\tpositions = new Array(pointsCount * 3);\n\t\t\tindices = new Array(pointsCount);\n\n\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\tcurve.D0(uniformAbscissa.Parameter(i + 1), point);\n\t\t\t\tconst index = i * STRIDE;\n\t\t\t\tpositions[index] = point.X();\n\t\t\t\tpositions[index + 1] = point.Y();\n\t\t\t\tpositions[index + 2] = point.Z();\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tindices[(i - 1) * 2] = i - 1;\n\t\t\t\t\tindices[(i - 1) * 2 + 1] = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions || [], 3));\n\t\tgeometry.setIndex(indices || []);\n\t\treturn geometry;\n\t});\n}\n\nexport function curveDataFromEdge(oc: OpenCascadeInstance, edge: TopoDS_Edge) {\n\toc.BRep_Tool.Range_1(edge, v0 as any, v1 as any);\n\tconst curveHandle = oc.BRep_Tool.Curve_2(edge, v0.current, v1.current);\n\treturn {\n\t\tcurveHandle,\n\t\tv0: v0.current,\n\t\tv1: v1.current,\n\t};\n}\n\nexport function cadEdgeCreate(oc: OpenCascadeInstance, curve: Geom_Curve): TopoDS_Edge {\n\treturn CadGC.withGC((r) => {\n\t\tconst curveHandle = r(new oc.Handle_Geom_Curve_2(curve));\n\t\tconst api = r(new oc.BRepBuilderAPI_MakeEdge_24(curveHandle));\n\t\tconst edge = api.Edge();\n\t\treturn edge;\n\t});\n}\n\n// let _t: gp_Vec | undefined;\n// // let _transform: gp_Trsf | undefined;\n// export function cadEdgeTransform(edge: TopoDS_Edge, t: Vector3, r: Vector3, s: Vector3) {\n// \tconst oc = CadLoader.oc();\n// \t_t = _t || new oc.gp_Vec_1();\n// \t// _pivot = _pivot || new oc.gp_Pnt2d_1();\n// \t_t.SetCoord_2(t.x, t.y, t.z);\n// \tconst curve = oc.BRep_Tool.Curve_2(edge, 0, 1).get();\n// \tcurve.Translate_1(_t);\n// \t// curve.Rotate(_pivot, MathUtils.degToRad(r));\n// \t// curve.Scale(_pivot, s);\n// \t// point.SetX(point.X() + t.x);\n// \t// point.SetY(point.Y() + t.y);\n// \t// const newPoint = new oc.gp_Pnt2d_3(point.X() + t.x, point.Y() + t.y);\n// \t// return newPoint;\n// \treturn cadEdgeCreate(oc, curve);\n// }\n\nexport function cadEdgeClone(src: TopoDS_Edge): TopoDS_Edge {\n\tconst oc = CadLoaderSync.oc();\n\treturn oc.TopoDS.Edge_1(cadShapeClone(src));\n}\n","import {Geom2d_Curve, CADTesselationParams, CadGeometryType, CadGC} from '../CadCommon';\nimport {BufferGeometry, Float32BufferAttribute, Vector2, MathUtils} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {cadMaterialLine} from '../CadConstant';\nimport {CadLoaderSync} from '../CadLoaderSync';\n// import {withCadException} from '../CadExceptionHandler';\nimport {ObjectType} from '../../../Constant';\nimport {CadObject} from '../CadObject';\nimport {objectContentCopyProperties} from '../../../ObjectContent';\nimport {Color} from 'three';\n\nexport const CURVE_2D_TESSELATION_PARAMS: CADTesselationParams = {\n\tlinearTolerance: 0.1,\n\tangularTolerance: 0.1,\n\tcurveAbscissa: 0.1,\n\tcurveTolerance: 0.1,\n\twireframe: false,\n\tdisplayMeshes: false,\n\tdisplayEdges: true,\n\tmeshesColor: new Color(),\n\tedgesColor: new Color(),\n};\n\nconst STRIDE = 3;\nexport function cadGeom2dCurveToObject3D(\n\tcadObject: CadObject<CadGeometryType.CURVE_2D>,\n\ttesselationParams: CADTesselationParams\n) {\n\tconst geometry = cadGeom2dCurveToBufferGeometry(cadObject, tesselationParams);\n\tconst object = BaseSopOperation.createObject(\n\t\tgeometry,\n\t\tObjectType.LINE_SEGMENTS,\n\t\tcadMaterialLine(tesselationParams.edgesColor)\n\t);\n\tobjectContentCopyProperties(cadObject, object);\n\treturn object;\n}\nexport function cadGeom2dCurveToBufferGeometry(\n\tcadObject: CadObject<CadGeometryType.CURVE_2D>,\n\ttesselationParams: CADTesselationParams\n) {\n\tconst oc = CadLoaderSync.oc();\n\n\treturn CadGC.withGC((r) => {\n\t\tconst curve = cadObject.cadGeometry();\n\t\tconst curveHandle = new oc.Handle_Geom2d_Curve_2(curve);\n\t\tconst geom2Dadaptor = r(new oc.Geom2dAdaptor_Curve_2(curveHandle));\n\n\t\tconst uniformAbscissa = r(\n\t\t\tnew oc.GCPnts_UniformAbscissa_6(\n\t\t\t\tgeom2Dadaptor,\n\t\t\t\ttesselationParams.curveAbscissa,\n\t\t\t\ttesselationParams.curveTolerance\n\t\t\t)\n\t\t);\n\n\t\tlet positions: number[] | undefined;\n\t\tlet indices: number[] | undefined;\n\t\tconst point = CadLoaderSync.gp_Pnt2d;\n\n\t\tif (uniformAbscissa.IsDone()) {\n\t\t\tconst pointsCount = uniformAbscissa.NbPoints();\n\n\t\t\tpositions = new Array(pointsCount * 3).fill(0);\n\t\t\tindices = new Array(pointsCount);\n\n\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\tcurve.D0(uniformAbscissa.Parameter(i + 1), point);\n\t\t\t\tconst index = i * STRIDE;\n\t\t\t\tpositions[index] = point.X();\n\t\t\t\tpositions[index + 1] = point.Y();\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tindices[(i - 1) * 2] = i - 1;\n\t\t\t\t\tindices[(i - 1) * 2 + 1] = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions || [], 3));\n\t\tgeometry.setIndex(indices || []);\n\t\treturn geometry;\n\t});\n}\n\n// let _t: gp_Vec2d | undefined;\n// let _pivot: gp_Pnt2d | undefined;\nexport function cadGeom2dCurveTransform(curve: Geom2d_Curve, t: Vector2, r: number, s: number, p: Vector2) {\n\tconst _t = CadLoaderSync.gp_Vec2d;\n\tconst _pivot = CadLoaderSync.gp_Pnt2d;\n\t_t.SetCoord_2(t.x, t.y);\n\t_pivot.SetCoord_2(p.x, p.y);\n\tcurve.Translate_1(_t);\n\tcurve.Rotate(_pivot, MathUtils.degToRad(r));\n\tcurve.Scale(_pivot, s);\n}\nexport function cadGeom2dCurveTranslate(curve: Geom2d_Curve, t: Vector2) {\n\tconst _t = CadLoaderSync.gp_Vec2d;\n\t_t.SetCoord_2(t.x, t.y);\n\tcurve.Translate_1(_t);\n}\n\nexport function cadGeom2dCurveClone(src: Geom2d_Curve): Geom2d_Curve {\n\t// Not great, not terrible\n\treturn src.Reversed().get().Reversed().get();\n}\n","import {BufferGeometry, BufferAttribute, Vector2} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {ObjectType} from '../../../Constant';\nimport {cadMaterialPoint} from '../CadConstant';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport type {CadGeometryType, gp_Pnt2d} from '../CadCommon';\nimport {CadObject} from '../CadObject';\nimport {objectContentCopyProperties} from '../../../ObjectContent';\n\nexport function cadPnt2dToObject3D(cadObject: CadObject<CadGeometryType.POINT_2D>) {\n\tconst point = cadObject.cadGeometry();\n\tconst geo = new BufferGeometry();\n\tconst positions: number[] = [point.X(), point.Y(), 0];\n\tgeo.setAttribute('position', new BufferAttribute(new Float32Array(positions), 3));\n\tconst object = BaseSopOperation.createObject(geo, ObjectType.POINTS, cadMaterialPoint());\n\tobjectContentCopyProperties(cadObject, object);\n\treturn object;\n}\n\nexport function cadPnt2dTransform(point: gp_Pnt2d, t: Vector2) {\n\tpoint.SetX(point.X() + t.x);\n\tpoint.SetY(point.Y() + t.y);\n}\n\nexport function cadPnt2dClone(src: gp_Pnt2d) {\n\tconst oc = CadLoaderSync.oc();\n\treturn new oc.gp_Pnt2d_3(src.X(), src.Y());\n}\n","import {CadLoaderSync} from '../CadLoaderSync';\nimport type {TopoDS_Shape} from '../CadCommon';\nimport {Vector3, MathUtils} from 'three';\nconst keepGeo = true;\nconst keepMesh = false;\nexport function cadShapeClone(shape: TopoDS_Shape) {\n\tconst oc = CadLoaderSync.oc();\n\n\tconst api = new oc.BRepBuilderAPI_Copy_1();\n\tapi.Perform(shape, keepGeo, keepMesh);\n\tconst newShape = api.Shape();\n\tapi.delete();\n\treturn newShape;\n}\n\n// https://dev.opencascade.org/doc/refman/html/class_b_rep_builder_a_p_i___transform.html#details\n// we set COPY_GEOMETRY to false,\n// so that in some cases, the shape is not duplicated,\n// which would be faster\nconst COPY_GEOMETRY = false;\nexport function cadShapeTransform(shape: TopoDS_Shape, t: Vector3, r: Vector3, s: number, p: Vector3) {\n\tconst oc = CadLoaderSync.oc();\n\n\tconst _t = CadLoaderSync.gp_Vec;\n\tconst _pivot = CadLoaderSync.gp_Pnt;\n\tconst _q = CadLoaderSync.gp_Quaternion;\n\tconst _transform = CadLoaderSync.gp_Trsf;\n\t// const _transformT = CadLoader.gp_TrsfT;\n\tconst _transformR = CadLoaderSync.gp_TrsfR;\n\tconst _transformS = CadLoaderSync.gp_TrsfS;\n\t_q.SetEulerAngles(\n\t\toc.gp_EulerSequence.gp_Extrinsic_XYZ as any,\n\t\tMathUtils.degToRad(r.x),\n\t\tMathUtils.degToRad(r.y),\n\t\tMathUtils.degToRad(r.z)\n\t);\n\t_t.SetCoord_2(t.x, t.y, t.z);\n\t_pivot.SetCoord_2(p.x, p.y, p.z);\n\t_transform.SetTranslation_1(_t);\n\t_transformR.SetRotation_2(_q);\n\t_transformS.SetScale(_pivot, s);\n\t_transform.Multiply(_transformR);\n\t_transform.Multiply(_transformS);\n\n\tconst api = new oc.BRepBuilderAPI_Transform_2(shape, _transform, COPY_GEOMETRY);\n\tconst newShape = api.Shape();\n\tapi.delete();\n\treturn newShape;\n}\n\nexport function cadShapeTranslate(shape: TopoDS_Shape, t: Vector3) {\n\tconst oc = CadLoaderSync.oc();\n\n\tconst transform = CadLoaderSync.gp_Trsf;\n\tconst translation = CadLoaderSync.gp_Vec;\n\ttranslation.SetCoord_2(t.x, t.y, t.z);\n\ttransform.SetTranslation_1(translation);\n\ttransform.SetScaleFactor(1);\n\tconst loc = new oc.TopLoc_Location_2(transform);\n\tconst newShape = shape.Moved(loc, false);\n\tloc.delete();\n\treturn newShape;\n}\n","import type {OpenCascadeInstance, TopoDS_Vertex, gp_Pnt, CadGeometryType} from '../CadCommon';\nimport {BufferGeometry, BufferAttribute, Vector3} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {ObjectType} from '../../../Constant';\nimport {cadMaterialPoint} from '../CadConstant';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport {cadShapeClone} from './CadShapeCommon';\nimport {CadObject} from '../CadObject';\nimport {objectContentCopyProperties} from '../../../ObjectContent';\n\nexport function cadVertexToObject3D(cadObject: CadObject<CadGeometryType.VERTEX>) {\n\tconst oc = CadLoaderSync.oc();\n\tconst vertex = cadObject.cadGeometry();\n\tconst point = oc.BRep_Tool.Pnt(vertex);\n\tconst geo = new BufferGeometry();\n\tconst positions: number[] = [point.X(), point.Y(), point.Z()];\n\tgeo.setAttribute('position', new BufferAttribute(new Float32Array(positions), 3));\n\tconst object = BaseSopOperation.createObject(geo, ObjectType.POINTS, cadMaterialPoint());\n\tobjectContentCopyProperties(cadObject, object);\n\treturn object;\n}\n\nexport function cadVertexCreate(oc: OpenCascadeInstance, t: Vector3): TopoDS_Vertex {\n\tconst point = new oc.gp_Pnt_3(t.x, t.y, t.z);\n\treturn _vertexFromPoint(oc, point);\n}\nfunction _vertexFromPoint(oc: OpenCascadeInstance, point: gp_Pnt): TopoDS_Vertex {\n\tconst api = new oc.BRepBuilderAPI_MakeVertex(point);\n\tconst vertex = api.Vertex();\n\tapi.delete();\n\treturn vertex;\n}\n\n// export function cadVertexTransform(src: TopoDS_Vertex, t: Vector3) {\n// \tconst oc = CadLoader.oc();\n// \tconst point = oc.BRep_Tool.Pnt(src);\n\n// \tpoint.SetX(point.X() + t.x);\n// \tpoint.SetY(point.Y() + t.y);\n// \tpoint.SetZ(point.Z() + t.z);\n// \treturn _vertexFromPoint(oc, point);\n// }\n\nexport function cadVertexClone(src: TopoDS_Vertex): TopoDS_Vertex {\n\tconst oc = CadLoaderSync.oc();\n\treturn oc.TopoDS.Vertex_1(cadShapeClone(src));\n}\n","import type {TopoDS_Wire, CADTesselationParams, CadGeometryType, OpenCascadeInstance, TopoDS_Edge} from '../CadCommon';\nimport {BufferGeometry} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {cadMaterialLine} from '../CadConstant';\nimport {ObjectType} from '../../../Constant';\n// import {CoreGeometryBuilderMerge} from '../../builders/Merge';\nimport {CadLoaderSync} from '../CadLoaderSync';\nimport {cadShapeClone} from './CadShapeCommon';\nimport {traverseEdges} from '../CadTraverse';\nimport {cadEdgeToBufferGeometry} from './CadEdge';\nimport {CadObject} from '../CadObject';\nimport {objectContentCopyProperties} from '../../../ObjectContent';\n\nexport function cadWireToObject3D(cadObject: CadObject<CadGeometryType.WIRE>, tesselationParams: CADTesselationParams) {\n\tconst wire = cadObject.cadGeometry();\n\tconst geometries: BufferGeometry[] = [];\n\tconst oc = CadLoaderSync.oc();\n\ttraverseEdges(oc, wire, (edge) => {\n\t\tconst geometry = cadEdgeToBufferGeometry(edge, tesselationParams);\n\t\tif (geometry) {\n\t\t\tgeometries.push(geometry);\n\t\t}\n\t});\n\t// do not merge here,\n\t// do it at the cadNetwork level to control perf\n\t// const geometry = CoreGeometryBuilderMerge.merge(geometries);\n\treturn geometries.map((geometry) => {\n\t\tconst object = BaseSopOperation.createObject(\n\t\t\tgeometry,\n\t\t\tObjectType.LINE_SEGMENTS,\n\t\t\tcadMaterialLine(tesselationParams.edgesColor)\n\t\t);\n\t\tobjectContentCopyProperties(cadObject, object);\n\t\treturn object;\n\t});\n\n\t// if (geometry) {\n\t// \treturn BaseSopOperation.createObject(\n\t// \t\tgeometry,\n\t// \t\tObjectType.LINE_SEGMENTS,\n\t// \t\tCAD_MATERIAL[ObjectType.LINE_SEGMENTS].plain\n\t// \t);\n\t// }\n}\n\n// export function cadWireTransform(edge: TopoDS_Wire, t: Vector3, r: Vector3, s: Vector3) {\n// \treturn cadShapeTransform(edge, t, r, s);\n// }\n\nexport function cadWireClone(src: TopoDS_Wire): TopoDS_Wire {\n\tconst oc = CadLoaderSync.oc();\n\treturn oc.TopoDS.Wire_1(cadShapeClone(src));\n}\n\nexport function cadWireFromEdge(oc: OpenCascadeInstance, edge: TopoDS_Edge) {\n\tconst api = new oc.BRepBuilderAPI_MakeWire_1();\n\tapi.Add_1(edge);\n\tconst wire = api.Wire();\n\tapi.delete();\n\treturn wire;\n}\n","import {ParamConfig} from '../../../../../engine/nodes/utils/params/ParamsConfig';\nimport {BaseNodeType} from '../../../../../engine/nodes/_Base';\nimport {Constructor, Number3} from '../../../../../types/GlobalTypes';\n\nconst DEFAULT = {\n\tedgesColor: [0.1, 0.7, 0.2] as Number3,\n};\n\nexport function SOPCADTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param linear Tolerance */\n\t\tlinearTolerance = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param angular Tolerance */\n\t\tangularTolerance = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param curve Abscissa */\n\t\tcurveAbscissa = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param curve Tolerance */\n\t\tcurveTolerance = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param display edges */\n\t\tdisplayEdges = ParamConfig.BOOLEAN(true, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param edges color */\n\t\tedgesColor = ParamConfig.COLOR(DEFAULT.edgesColor, {\n\t\t\tvisibleIf: {\n\t\t\t\tdisplayEdges: true,\n\t\t\t},\n\t\t});\n\t\t/** @param display meshes */\n\t\tdisplayMeshes = ParamConfig.BOOLEAN(true);\n\t\t/** @param meshes color */\n\t\tmeshesColor = ParamConfig.COLOR([1, 1, 1], {\n\t\t\tvisibleIf: {\n\t\t\t\tdisplayMeshes: true,\n\t\t\t},\n\t\t});\n\t\t/** @param wireframe */\n\t\twireframe = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {\n\t\t\t\tdisplayMeshes: true,\n\t\t\t},\n\t\t});\n\t};\n}\n\nexport function OBJCADTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param linear Tolerance */\n\t\tCADLinearTolerance = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param angular Tolerance */\n\t\tCADAngularTolerance = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param curve Abscissa */\n\t\tCADCurveAbscissa = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param curve Tolerance */\n\t\tCADCurveTolerance = ParamConfig.FLOAT(0.1, {\n\t\t\trange: [0.001, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param display edges */\n\t\tCADDisplayEdges = ParamConfig.BOOLEAN(true, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param edges color */\n\t\tCADEdgesColor = ParamConfig.COLOR(DEFAULT.edgesColor, {\n\t\t\tvisibleIf: {\n\t\t\t\tCADDisplayEdges: true,\n\t\t\t},\n\t\t});\n\t\t/** @param display meshes */\n\t\tCADDisplayMeshes = ParamConfig.BOOLEAN(true);\n\t\t/** @param meshes color */\n\t\tCADMeshesColor = ParamConfig.COLOR([1, 1, 1], {\n\t\t\tvisibleIf: {\n\t\t\t\tCADDisplayMeshes: true,\n\t\t\t},\n\t\t});\n\t\t/** @param wireframe */\n\t\tCADWireframe = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {\n\t\t\t\tCADDisplayMeshes: true,\n\t\t\t},\n\t\t});\n\t};\n}\n\nexport const TESSELATION_PARAM_NAMES = new Set<string>([\n\t'CADLinearTolerance',\n\t'CADAngularTolerance',\n\t'CADCurveAbscissa',\n\t'CADCurveTolerance',\n\t'CADDisplayEdges',\n\t'CADEdgesColor',\n\t'CADDisplayMeshes',\n\t'CADMeshesColor',\n\t'CADWireframe',\n]);\n\nexport function addCADTesselationParamsCallback(node: BaseNodeType, callback: () => void) {\n\tnode.params.onParamsCreated('CADtesselationParamsHooks', () => {\n\t\tconst params = node.params.all;\n\t\tfor (const param of params) {\n\t\t\tif (TESSELATION_PARAM_NAMES.has(param.name())) {\n\t\t\t\tparam.options.setOption('callback', callback);\n\t\t\t}\n\t\t}\n\t});\n}\n","import {Color} from 'three';\nimport type {geometries} from '@jscad/modeling';\nexport type CsgGeometry = geometries.path2.Path2 | geometries.geom2.Geom2 | geometries.geom3.Geom3;\n\nexport enum CsgGeometryType {\n\tPATH2 = 'CSGPath2',\n\tGEOM2 = 'CSGGeom2',\n\tGEOM3 = 'CSGGeom3',\n\t// UNKNOWN = 'unknown',\n}\nconst CSG_GEOMETRY_TYPES: CsgGeometryType[] = [CsgGeometryType.PATH2, CsgGeometryType.GEOM2, CsgGeometryType.GEOM3];\nexport const CSG_GEOMETRY_TYPES_SET: Set<CsgGeometryType> = new Set(CSG_GEOMETRY_TYPES);\n\nexport interface CsgTypeMap {\n\t[CsgGeometryType.PATH2]: geometries.path2.Path2;\n\t[CsgGeometryType.GEOM2]: geometries.geom2.Geom2;\n\t[CsgGeometryType.GEOM3]: geometries.geom3.Geom3;\n\t// [CsgGeometryType.UNKNOWN]: undefined;\n}\n\nexport interface CSGTesselationParams {\n\tfacetAngle: number;\n\twireframe: boolean;\n\tmeshesColor: Color;\n\tlinesColor: Color;\n}\nexport interface CSGOBJTesselationParams {\n\tCSGFacetAngle: number;\n\tCSGWireframe: boolean;\n\tCSGMeshesColor: Color;\n\tCSGLinesColor: Color;\n}\n","import {geometries} from '@jscad/modeling';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {CsgGeometryType, CsgGeometry, CsgTypeMap, CSG_GEOMETRY_TYPES_SET} from './CsgCommon';\n\nexport function isCSGObject(o: ObjectContent<CoreObjectType>) {\n\treturn CSG_GEOMETRY_TYPES_SET.has(o.type as CsgGeometryType);\n}\n\nexport function csgIsPath2(geometry: CsgGeometry): geometry is geometries.path2.Path2 {\n\t// DO NOT use this function 'geometries.path2'\n\t// out of this file, as the input isn't type\n\t// and can therefore be misleading\n\treturn geometries.path2.isA(geometry);\n}\nexport function csgIsGeom2(geometry: CsgGeometry): geometry is geometries.geom2.Geom2 {\n\t// DO NOT use this function 'geometries.path2'\n\t// out of this file, as the input isn't type\n\t// and can therefore be misleading\n\treturn geometries.geom2.isA(geometry);\n}\nexport function csgIsGeom3(geometry: CsgGeometry): geometry is geometries.geom3.Geom3 {\n\t// DO NOT use this function 'geometries.path2'\n\t// out of this file, as the input isn't type\n\t// and can therefore be misleading\n\treturn geometries.geom3.isA(geometry);\n}\n\nexport function csgGeometryTypeFromGeometry<T extends CsgGeometryType>(geometry: CsgTypeMap[T]): T {\n\tif (csgIsPath2(geometry)) {\n\t\treturn CsgGeometryType.PATH2 as T;\n\t}\n\tif (csgIsGeom2(geometry)) {\n\t\treturn CsgGeometryType.GEOM2 as T;\n\t}\n\tif (csgIsGeom3(geometry)) {\n\t\treturn CsgGeometryType.GEOM3 as T;\n\t}\n\treturn CsgGeometryType.GEOM3 as T;\n}\n","import {ParamConfig} from '../../../../../engine/nodes/utils/params/ParamsConfig';\nimport {BaseNodeType} from '../../../../../engine/nodes/_Base';\nimport {Constructor, Number3} from '../../../../../types/GlobalTypes';\n\nconst DEFAULT = {\n\tfacetAngle: 45,\n\tlinesColor: [0.4, 0.1, 0.6] as Number3,\n};\nexport function SOPCSGTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param linear Tolerance */\n\t\tfacetAngle = ParamConfig.FLOAT(DEFAULT.facetAngle, {\n\t\t\trange: [0, 180],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param edges color */\n\t\tlinesColor = ParamConfig.COLOR(DEFAULT.linesColor);\n\t\t/** @param meshes color */\n\t\tmeshesColor = ParamConfig.COLOR([1, 1, 1]);\n\t\t/** @param wireframe */\n\t\twireframe = ParamConfig.BOOLEAN(false);\n\t};\n}\n\nexport function OBJCSGTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param linear Tolerance */\n\t\tCSGFacetAngle = ParamConfig.FLOAT(DEFAULT.facetAngle, {\n\t\t\trange: [0, 180],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param edges color */\n\t\tCSGLinesColor = ParamConfig.COLOR(DEFAULT.linesColor);\n\t\t/** @param meshes color */\n\t\tCSGMeshesColor = ParamConfig.COLOR([1, 1, 1]);\n\t\t/** @param wireframe */\n\t\tCSGWireframe = ParamConfig.BOOLEAN(false);\n\t};\n}\n\nexport const TESSELATION_PARAM_NAMES = new Set<string>([\n\t'CSGFacetAngle',\n\t'CSGLinesColor',\n\t'CSGMeshesColor',\n\t'CSGWireframe',\n]);\n\nexport function addCSGTesselationParamsCallback(node: BaseNodeType, callback: () => void) {\n\tnode.params.onParamsCreated('CSGtesselationParamsHooks', () => {\n\t\tconst params = node.params.all;\n\t\tfor (const param of params) {\n\t\t\tif (TESSELATION_PARAM_NAMES.has(param.name())) {\n\t\t\t\tparam.options.setOption('callback', callback);\n\t\t\t}\n\t\t}\n\t});\n}\n","import {Color} from 'three';\n\nexport enum QUADObjectType {\n\tDEFAULT = 'Quad',\n}\n\nconst QUAD_OBJECT_TYPES: QUADObjectType[] = [QUADObjectType.DEFAULT];\nexport const QUAD_OBJECT_TYPES_SET: Set<QUADObjectType> = new Set(QUAD_OBJECT_TYPES);\n\nexport interface QUADTesselationParams {\n\ttriangles: boolean;\n\t//\n\twireframe: boolean;\n\tunsharedEdges: boolean;\n\twireframeColor: Color;\n\t//\n\tconnections: boolean;\n\tconnectionsBetweenQuadsSharingEdge: boolean;\n\tconnectionsBetweenQuadsSharingPointOnly: boolean;\n\tconnectionsColor: Color;\n\t//\n\tcenter: boolean;\n\tinnerRadius: boolean;\n\touterRadius: boolean;\n\tedgeCenterVectors: boolean;\n\tedgeNearestPointVectors: boolean;\n\t//\n\tsplitQuads: boolean;\n\tpointAttributes: string;\n\tprimitiveAttributes: string;\n}\nexport interface QUADOBJTesselationParams {\n\tQUADTriangles: boolean;\n\t//\n\tQUADWireframe: boolean;\n\tQUADUnsharedEdges: boolean;\n\tQUADWireframeColor: Color;\n\t//\n\tQUADConnections: boolean;\n\tQUADConnectionsBetweenQuadsSharingEdge: boolean;\n\tQUADConnectionsBetweenQuadsSharingPointOnly: boolean;\n\tQUADConnectionsColor: Color;\n\t//\n\tQUADCenter: boolean;\n\tQUADInnerRadius: boolean;\n\tQUADOuterRadius: boolean;\n\tQUADEdgeCenterVectors: boolean;\n\tQUADEdgeNearestPointVectors: boolean;\n\t//\n\tQUADSplitQuads: boolean;\n\tQUADPointAttributes: string;\n\tQUADPrimitiveAttributes: string;\n}\nexport enum QuadTriangulationAttribute {\n\tINNER_RADIUS = 'innerRadius',\n\tOUTER_RADIUS = 'outerRadius',\n\tEDGE_CENTER_VECTOR = 'edgeCenterVector',\n\tEDGE_NEAREST_POINT_VECTOR = 'edgeNearestPointVector',\n}\n","import {arrayIsEqual} from '../../../../ArrayUtils';\nimport {QuadGeometry} from '../QuadGeometry';\nimport {QuadObject} from '../QuadObject';\nimport {QuadPoint} from '../QuadPoint';\nimport {QuadVertex} from '../QuadVertex';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {BufferAttribute} from 'three';\nimport {BasePrimitiveAttribute} from '../../../entities/primitive/PrimitiveAttribute';\n\nfunction _attributesAreTheSame(\n\tquadObjects: QuadObject[],\n\tentityClass: typeof QuadPoint | typeof QuadVertex | typeof QuadPrimitive\n) {\n\tconst firstGeometryPointAttributeNames = entityClass.attributeNames(quadObjects[0]);\n\tfor (const quadObject of quadObjects) {\n\t\tconst attribNames = entityClass.attributeNames(quadObject);\n\t\tif (!arrayIsEqual(firstGeometryPointAttributeNames, attribNames)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction _mergePointAttributes(quadObjects: QuadObject[], target: QuadGeometry) {\n\tconst attributeNames = QuadPoint.attributeNames(quadObjects[0]);\n\tlet i = 0;\n\tfor (const attributeName of attributeNames) {\n\t\t_mergePointAttribute(quadObjects, attributeName, i == 0, target);\n\t\ti++;\n\t}\n}\nfunction _mergePointAttribute(\n\tquadObjects: QuadObject[],\n\tattributeName: string,\n\taddIndex: boolean,\n\ttarget: QuadGeometry\n) {\n\tconst firstAttribute = QuadPoint.attribute(quadObjects[0], attributeName)!;\n\tconst itemSize = firstAttribute.itemSize;\n\tconst values: number[] = [];\n\tconst indices: number[] = [];\n\tlet indexOffset = 0;\n\tfor (const object of quadObjects) {\n\t\tconst attribute = QuadPoint.attribute(object, attributeName)!;\n\t\tconst array = attribute.array;\n\t\tfor (const item of array) {\n\t\t\tvalues.push(item);\n\t\t}\n\n\t\tif (addIndex) {\n\t\t\tconst index = object.geometry.index;\n\t\t\tfor (const indexItem of index) {\n\t\t\t\tindices.push(indexItem + indexOffset);\n\t\t\t}\n\t\t}\n\n\t\tindexOffset += attribute.count;\n\t}\n\ttarget.setAttribute(attributeName, new BufferAttribute(new Float32Array(values), itemSize));\n\tif (addIndex) {\n\t\ttarget.setIndex(indices);\n\t}\n}\nfunction _mergeAttributes(\n\tquadObjects: QuadObject[],\n\tentityClass: typeof QuadPrimitive | typeof QuadVertex,\n\ttarget: QuadGeometry\n) {\n\tconst attributeNames = entityClass.attributeNames(quadObjects[0]);\n\tfor (const attributeName of attributeNames) {\n\t\t_mergeAttribute(quadObjects, attributeName, entityClass, target);\n\t}\n}\nfunction _mergeAttribute(\n\tquadObjects: QuadObject[],\n\tattributeName: string,\n\tentityClass: typeof QuadPrimitive | typeof QuadVertex,\n\ttarget: QuadGeometry\n) {\n\tconst firstAttribute = entityClass.attribute(quadObjects[0], attributeName)!;\n\tconst {itemSize, isString} = firstAttribute;\n\tconst values: number[] = [];\n\tfor (const object of quadObjects) {\n\t\tconst attribute = entityClass.attribute(object, attributeName)!;\n\t\tconst array = attribute.array as number[];\n\t\tfor (const item of array) {\n\t\t\tvalues.push(item);\n\t\t}\n\t}\n\tconst dummyObject = new QuadObject(target);\n\tconst attribute: BasePrimitiveAttribute = {\n\t\tisString,\n\t\tarray: values,\n\t\titemSize,\n\t};\n\tentityClass.addAttribute(dummyObject, attributeName, attribute);\n}\n\nexport function quadGeomeryMerge(quadObjects: QuadObject[]): QuadGeometry | undefined {\n\tif (\n\t\t!(\n\t\t\t_attributesAreTheSame(quadObjects, QuadPoint) &&\n\t\t\t_attributesAreTheSame(quadObjects, QuadVertex) &&\n\t\t\t_attributesAreTheSame(quadObjects, QuadPrimitive)\n\t\t)\n\t) {\n\t\treturn;\n\t}\n\n\tconst mergedGeometry = new QuadGeometry();\n\t_mergePointAttributes(quadObjects, mergedGeometry);\n\t_mergeAttributes(quadObjects, QuadPrimitive, mergedGeometry);\n\t_mergeAttributes(quadObjects, QuadVertex, mergedGeometry);\n\n\t//\n\treturn mergedGeometry;\n}\n","import {Matrix4, Box3, Sphere, Vector3} from 'three';\nimport {QuadObject} from './QuadObject';\nimport {BaseCoreObject} from '../../entities/object/BaseCoreObject';\nimport {CoreObjectType, MergeCompactOptions, ObjectContent, objectContentCopyProperties} from '../../ObjectContent';\nimport {TransformTargetType} from '../../../Transform';\nimport {ObjectTransformMode, ObjectTransformSpace} from '../../../TransformSpace';\nimport {QuadPrimitive} from './QuadPrimitive';\nimport {quadGeomeryMerge} from './builders/QuadGeometryMerge';\nimport {objectData} from '../../entities/object/BaseCoreObjectUtils';\nimport {QuadPoint} from './QuadPoint';\nimport {QuadVertex} from './QuadVertex';\nimport {AttribClass, ObjectData} from '../../Constant';\nimport {TraversedRelatedEntityData} from '../../entities/utils/TraversedRelatedEntities';\nimport {CoreEntityWithObject} from '../../CoreEntity';\nimport {arrayCopy} from '../../../ArrayUtils';\n\nconst _box = new Box3();\nexport class QuadCoreObject extends BaseCoreObject<CoreObjectType.QUAD> {\n\tprotected override _object: QuadObject;\n\tconstructor(_object: QuadObject, index: number) {\n\t\tsuper(_object, index);\n\t\tthis._object = _object;\n\t}\n\tstatic override position(object: QuadObject, target: Vector3) {\n\t\tobject.boundingBox(_box);\n\t\t_box.getCenter(target);\n\t}\n\toverride boundingBox(target: Box3) {\n\t\tthis._object.boundingBox(target);\n\t}\n\toverride boundingSphere(target: Sphere) {\n\t\tthis._object.boundingSphere(target);\n\t}\n\tstatic override objectData<T extends CoreObjectType>(object: ObjectContent<T>): ObjectData {\n\t\tconst data = objectData(object);\n\n\t\tdata.pointsCount = QuadPoint.entitiesCount(object);\n\t\tdata.verticesCount = QuadVertex.entitiesCount(object);\n\t\tdata.primitivesCount = QuadPrimitive.entitiesCount(object);\n\t\tdata.primitiveName = 'quad';\n\n\t\treturn data;\n\t}\n\n\tstatic override applyMatrix(\n\t\tobject: QuadObject,\n\t\tmatrix: Matrix4,\n\t\ttransformTargetType: TransformTargetType,\n\t\ttransformSpace: ObjectTransformSpace,\n\t\ttransformMode: ObjectTransformMode\n\t) {\n\t\tobject.applyMatrix4(matrix);\n\t}\n\tstatic override mergeCompact(options: MergeCompactOptions) {\n\t\tconst {objects, mergedObjects, onError} = options;\n\t\tconst firstObject = objects[0];\n\t\tif (!firstObject) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst quadObjects = objects as QuadObject[];\n\n\t\ttry {\n\t\t\tconst mergedGeometry = quadGeomeryMerge(quadObjects);\n\t\t\tif (mergedGeometry) {\n\t\t\t\tconst newObject = new QuadObject(mergedGeometry);\n\t\t\t\tobjectContentCopyProperties(firstObject, newObject);\n\t\t\t\tmergedObjects.push(newObject as QuadObject);\n\t\t\t} else {\n\t\t\t\tonError('merge failed, check that input geometries have the same attributes');\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tonError((e as Error).message || 'unknown error');\n\t\t}\n\t}\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedPrimitiveIds(\n\t\tobject: ObjectContent<CoreObjectType>,\n\t\tindex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst count = QuadPrimitive.entitiesCount(object as any as QuadObject);\n\t\ttarget.length = count;\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\ttarget[i] = i;\n\t\t}\n\t\tif (traversedRelatedEntityData && traversedRelatedEntityData[AttribClass.PRIMITIVE].ids != target) {\n\t\t\tarrayCopy(target, traversedRelatedEntityData[AttribClass.PRIMITIVE].ids);\n\t\t}\n\t}\n\n\tstatic override relatedPrimitiveClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn QuadPrimitive as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {Box3, Matrix4, Vector3, BufferAttribute} from 'three';\nimport {Attribute} from '../../Attribute';\nimport {objectCloneDeep} from '../../../ObjectUtils';\n\n// make count non-readonly\ntype QuadBufferAttribute = Omit<BufferAttribute, 'count'> & {\n\tcount: BufferAttribute['count'];\n};\n\nconst _v3 = new Vector3();\n\nexport class QuadGeometry {\n\tpublic attributes: Record<string, QuadBufferAttribute> = {};\n\tpublic index: number[] = [];\n\tpublic userData: {[key: string]: any} = {};\n\n\tsetAttribute(attribName: string, attribute: BufferAttribute) {\n\t\tthis.attributes[attribName] = attribute;\n\t}\n\n\tsetIndex(indices: number[]) {\n\t\tthis.index = indices;\n\t}\n\tquadsCount() {\n\t\treturn this.index.length / 4;\n\t}\n\n\tapplyMatrix(matrix: Matrix4): QuadGeometry {\n\t\tconst positionAttribute = this.attributes[Attribute.POSITION];\n\t\tconst positionArray = positionAttribute.array;\n\t\tconst pointsCount = positionArray.length / 3;\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t_v3.fromArray(positionArray, i * 3);\n\t\t\t_v3.applyMatrix4(matrix);\n\t\t\t_v3.toArray(positionArray, i * 3);\n\t\t}\n\n\t\treturn this;\n\t}\n\tclone() {\n\t\tconst clonedGeometry = new (this.constructor as typeof QuadGeometry)();\n\t\t// point attributes\n\t\tconst pointAttributeNames = Object.keys(this.attributes);\n\t\tfor (const attributeName of pointAttributeNames) {\n\t\t\tclonedGeometry.setAttribute(attributeName, this.attributes[attributeName].clone());\n\t\t}\n\t\tclonedGeometry.setIndex([...this.index]);\n\t\tclonedGeometry.userData = objectCloneDeep(this.userData);\n\t\t// prim attributes\n\t\t// const primAttributes = QuadPrimitive.attributesFromGeometry(this);\n\t\t// if (primAttributes) {\n\t\t// \tconst primAttributeNames = Object.keys(primAttributes);\n\t\t// \tfor (const attributeName of primAttributeNames) {\n\t\t// \t\tconst srcAttribute = primAttributes[attributeName];\n\t\t// \t\tconst clonedAttribute: BasePrimitiveAttribute = {\n\t\t// \t\t\tisString: srcAttribute.isString,\n\t\t// \t\t\tarray: srcAttribute.array.slice(),\n\t\t// \t\t\titemSize: srcAttribute.itemSize,\n\t\t// \t\t};\n\t\t// \t\tQuadPrimitive.addAttributeToGeometry(clonedGeometry, attributeName, clonedAttribute);\n\t\t// \t}\n\t\t// }\n\n\t\t//\n\t\treturn clonedGeometry;\n\t}\n\tboundingBox(target: Box3) {\n\t\ttarget.makeEmpty();\n\n\t\tconst positionAttribute = this.attributes[Attribute.POSITION];\n\t\tif (!positionAttribute) {\n\t\t\treturn;\n\t\t}\n\t\tconst positions = positionAttribute.array;\n\t\tconst arrayLength = positions.length;\n\t\tfor (let i = 0; i < arrayLength; i += 3) {\n\t\t\ttarget.expandByPoint(_v3.fromArray(positions, i));\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\n\nexport interface PrepareObjectOptions {\n\tshadow: boolean;\n}\nexport function prepareObject(object3D: Object3D, options: PrepareObjectOptions): void {\n\tobject3D.matrixAutoUpdate = false;\n\tobject3D.updateMatrix();\n\tobject3D.castShadow = options.shadow;\n\tobject3D.receiveShadow = options.shadow;\n}\n","import {BufferGeometry, Mesh, Vector4, Vector3, BufferAttribute} from 'three';\nimport {QUADTesselationParams} from '../QuadCommon';\nimport {QuadObject} from '../QuadObject';\nimport {ObjectType} from '../../../Constant';\nimport {Attribute} from '../../../Attribute';\nimport {DEFAULT_MATERIALS} from '../../../Constant';\nimport {stringMatchMask} from '../../../../String';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {ThreejsPrimitiveTriangle} from '../../three/ThreejsPrimitiveTriangle';\nimport {prepareObject} from './QuadToObject3DCommon';\n\nconst _v4 = new Vector4();\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\nconst _p2 = new Vector3();\nconst _p3 = new Vector3();\n\nexport function quadToMesh(quadObject: QuadObject, options: QUADTesselationParams) {\n\tconst quadGeometry = quadObject.geometry;\n\tconst quadsCount = quadGeometry.quadsCount();\n\tconst geometry = new BufferGeometry();\n\tconst mesh = new Mesh(geometry, DEFAULT_MATERIALS[ObjectType.MESH]);\n\n\t// indices and positions\n\tconst srcPositions = quadGeometry.attributes[Attribute.POSITION].array;\n\tconst indices = quadGeometry.index;\n\tconst newIndices = new Array(quadsCount * 6);\n\tif (options.splitQuads) {\n\t\tconst newPositions: number[] = [];\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\t_v4.fromArray(indices, i * 4);\n\n\t\t\t// new positions\n\t\t\t_p0.fromArray(srcPositions, _v4.x * 3);\n\t\t\t_p1.fromArray(srcPositions, _v4.y * 3);\n\t\t\t_p2.fromArray(srcPositions, _v4.z * 3);\n\t\t\t_p3.fromArray(srcPositions, _v4.w * 3);\n\t\t\tnewPositions.push(_p0.x, _p0.y, _p0.z);\n\t\t\tnewPositions.push(_p1.x, _p1.y, _p1.z);\n\t\t\tnewPositions.push(_p2.x, _p2.y, _p2.z);\n\t\t\tnewPositions.push(_p3.x, _p3.y, _p3.z);\n\n\t\t\t// index\n\t\t\tconst i6 = i * 6;\n\t\t\tconst i4 = i * 4;\n\t\t\tnewIndices[i6 + 0] = i4 + 0;\n\t\t\tnewIndices[i6 + 1] = i4 + 1;\n\t\t\tnewIndices[i6 + 2] = i4 + 2;\n\t\t\tnewIndices[i6 + 3] = i4 + 0;\n\t\t\tnewIndices[i6 + 4] = i4 + 2;\n\t\t\tnewIndices[i6 + 5] = i4 + 3;\n\t\t}\n\t\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(newPositions), 3));\n\t} else {\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\t_v4.fromArray(indices, i * 4);\n\t\t\tconst i6 = i * 6;\n\t\t\tnewIndices[i6 + 0] = _v4.x;\n\t\t\tnewIndices[i6 + 1] = _v4.y;\n\t\t\tnewIndices[i6 + 2] = _v4.z;\n\t\t\tnewIndices[i6 + 3] = _v4.x;\n\t\t\tnewIndices[i6 + 4] = _v4.z;\n\t\t\tnewIndices[i6 + 5] = _v4.w;\n\t\t}\n\t\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(srcPositions), 3));\n\t}\n\tgeometry.setIndex(newIndices);\n\n\t// point attributes (except position)\n\tconst pointAttributeNames = Object.keys(quadGeometry.attributes).filter(\n\t\t(attributeName) =>\n\t\t\tstringMatchMask(attributeName, options.pointAttributes) && attributeName != Attribute.POSITION\n\t);\n\tfor (const attribName of pointAttributeNames) {\n\t\tconst attribute = quadGeometry.attributes[attribName];\n\t\tconst values = attribute.array;\n\t\tgeometry.setAttribute(attribName, new BufferAttribute(new Float32Array(values), attribute.itemSize));\n\t}\n\n\t// update normals if not provided\n\tconst normalAttribute = geometry.attributes[Attribute.NORMAL];\n\tif (!normalAttribute) {\n\t\tgeometry.computeVertexNormals();\n\t}\n\n\t// primitive attributes\n\tconst primitiveAttributes = QuadPrimitive.attributesFromGeometry(quadGeometry);\n\tif (primitiveAttributes) {\n\t\tconst primitiveAttributeNames = Object.keys(primitiveAttributes).filter((attributeName) =>\n\t\t\tstringMatchMask(attributeName, options.primitiveAttributes)\n\t\t);\n\t\tfor (const primitiveAttributeName of primitiveAttributeNames) {\n\t\t\tconst srcAttribute = primitiveAttributes[primitiveAttributeName];\n\t\t\tconst destPrimitivesCount = quadsCount * 2;\n\t\t\tconst destAttribute = {\n\t\t\t\titemSize: srcAttribute.itemSize,\n\t\t\t\tisString: srcAttribute.isString,\n\t\t\t\tarray: new Array(destPrimitivesCount * srcAttribute.itemSize),\n\t\t\t};\n\t\t\tThreejsPrimitiveTriangle.addAttribute(mesh, primitiveAttributeName, destAttribute);\n\t\t\tconst srcArray = srcAttribute.array;\n\t\t\tconst destArray = destAttribute.array;\n\t\t\tconst srcArraySize = srcArray.length;\n\t\t\tlet j = 0;\n\t\t\tfor (let i = 0; i < srcArraySize; i++) {\n\t\t\t\t// 1 quad -> 2 triangles\n\t\t\t\tdestArray[j] = srcArray[i];\n\t\t\t\tdestArray[j + 1] = srcArray[i];\n\n\t\t\t\tj += 2;\n\t\t\t}\n\t\t}\n\t}\n\n\tprepareObject(mesh, {shadow: true});\n\treturn mesh;\n}\n","import {LineBasicMaterial, Color, Vector4, Vector3, BufferGeometry, BufferAttribute, LineSegments} from 'three';\nimport {QuadObject} from '../QuadObject';\nimport {QUADTesselationParams} from '../QuadCommon';\nimport {Attribute} from '../../../Attribute';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {stringMatchMask} from '../../../../String';\nimport {ThreejsPrimitiveTriangle} from '../../three/ThreejsPrimitiveTriangle';\nimport {prepareObject} from './QuadToObject3DCommon';\nimport {NEIGHBOUR_INDICES, HalfEdgeIndices, quadHalfEdgeIndices} from '../graph/QuadGraphCommon';\nimport {NeighbourData, QuadGraph} from '../graph/QuadGraph';\n\nconst _v4 = new Vector4();\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\nconst _p2 = new Vector3();\nconst _p3 = new Vector3();\n\nconst _neighbourData: NeighbourData = {\n\tquadNode: null,\n\tneighbourIndex: null,\n};\nconst _indices: HalfEdgeIndices = {\n\tindex0: -1,\n\tindex1: -1,\n};\n\nconst _lineMaterialByColorStyle: Map<string, LineBasicMaterial> = new Map();\nfunction _createOrFindLineMaterial(color: Color) {\n\tlet material = _lineMaterialByColorStyle.get(color.getStyle());\n\tif (!material) {\n\t\tmaterial = new LineBasicMaterial({\n\t\t\tcolor,\n\t\t\tlinewidth: 1,\n\t\t});\n\t\t_lineMaterialByColorStyle.set(color.getStyle(), material);\n\t}\n\treturn material;\n}\n\nexport function quadToLine(quadObject: QuadObject, graph:QuadGraph,options: QUADTesselationParams) {\n\tconst {splitQuads, unsharedEdges, wireframeColor} = options;\n\tconst quadGeometry = quadObject.geometry;\n\tconst quadsCount = quadGeometry.quadsCount();\n\tconst indices = quadGeometry.index;\n\tconst srcPositions = quadGeometry.attributes.position.array;\n\n\tconst edges = new Map<number, number>();\n\n\tconst buildUnsharedEdges = () => {\n\t\tconst newIndices: number[] = new Array();\n\t\tconst positions: number[] = [];\n\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\tconst currentNode = graph.quadNode(i)!;\n\n\t\t\tfor (const ni of NEIGHBOUR_INDICES) {\n\t\t\t\tgraph.neighbourData(i, ni, _neighbourData);\n\t\t\t\tif (_neighbourData.quadNode == null) {\n\t\t\t\t\tquadHalfEdgeIndices(currentNode.indices, ni, _indices);\n\t\t\t\t\tconst i0 = _indices.index0;\n\t\t\t\t\tconst i1 = _indices.index1;\n\t\t\t\t\t_p0.fromArray(srcPositions, i0 * 3);\n\t\t\t\t\t_p1.fromArray(srcPositions, i1 * 3);\n\t\t\t\t\tpositions.push(_p0.x, _p0.y, _p0.z);\n\t\t\t\t\tpositions.push(_p1.x, _p1.y, _p1.z);\n\t\t\t\t\tnewIndices.push(newIndices.length);\n\t\t\t\t\tnewIndices.push(newIndices.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(positions), 3));\n\t\tgeometry.setIndex(newIndices);\n\t\treturn geometry;\n\t};\n\n\tconst splitGeometry = () => {\n\t\tconst newIndices: number[] = new Array();\n\t\tconst positions: number[] = [];\n\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\t_v4.fromArray(indices, i * 4);\n\t\t\t_p0.fromArray(srcPositions, _v4.x * 3);\n\t\t\t_p1.fromArray(srcPositions, _v4.y * 3);\n\t\t\t_p2.fromArray(srcPositions, _v4.z * 3);\n\t\t\t_p3.fromArray(srcPositions, _v4.w * 3);\n\n\t\t\tconst j = i * 4 * 3;\n\t\t\tconst k = i * 8;\n\t\t\tconst m = i * 4;\n\t\t\t_p0.toArray(positions, j);\n\t\t\t_p1.toArray(positions, j + 3);\n\t\t\t_p2.toArray(positions, j + 6);\n\t\t\t_p3.toArray(positions, j + 9);\n\n\t\t\tnewIndices[k] = m;\n\t\t\tnewIndices[k + 1] = m + 1;\n\t\t\tnewIndices[k + 2] = m + 1;\n\t\t\tnewIndices[k + 3] = m + 2;\n\t\t\tnewIndices[k + 4] = m + 2;\n\t\t\tnewIndices[k + 5] = m + 3;\n\t\t\tnewIndices[k + 6] = m + 3;\n\t\t\tnewIndices[k + 7] = m;\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(positions), 3));\n\t\tgeometry.setIndex(newIndices);\n\t\treturn geometry;\n\t};\n\n\tconst unsplitGeometry = () => {\n\t\tconst newIndices: number[] = new Array();\n\t\tconst addEdgeUnsplit = (a: number, b: number) => {\n\t\t\tif (edges.get(a) == b || edges.get(b) == a) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tedges.set(a, b);\n\t\t\tedges.set(b, a);\n\t\t\tnewIndices.push(a, b);\n\t\t};\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\t_v4.fromArray(indices, i * 4);\n\t\t\taddEdgeUnsplit(_v4.x, _v4.y);\n\t\t\taddEdgeUnsplit(_v4.y, _v4.z);\n\t\t\taddEdgeUnsplit(_v4.z, _v4.w);\n\t\t\taddEdgeUnsplit(_v4.w, _v4.x);\n\t\t}\n\n\t\tconst positions = [...srcPositions];\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(positions), 3));\n\t\tgeometry.setIndex(newIndices);\n\t\treturn geometry;\n\t};\n\n\tconst geometry = unsharedEdges ? buildUnsharedEdges() : splitQuads ? splitGeometry() : unsplitGeometry();\n\tconst material = _createOrFindLineMaterial(wireframeColor);\n\tconst lineSegments = new LineSegments(geometry, material);\n\n\t// primitive attributes\n\tif (splitQuads) {\n\t\tconst primitiveAttributes = QuadPrimitive.attributesFromGeometry(quadGeometry);\n\t\tif (primitiveAttributes) {\n\t\t\tconst primitiveAttributeNames = Object.keys(primitiveAttributes).filter((attributeName) =>\n\t\t\t\tstringMatchMask(attributeName, options.primitiveAttributes)\n\t\t\t);\n\t\t\tfor (const primitiveAttributeName of primitiveAttributeNames) {\n\t\t\t\tconst srcAttribute = primitiveAttributes[primitiveAttributeName];\n\t\t\t\tconst destPrimitivesCount = quadsCount * 4;\n\t\t\t\tconst destAttribute = {\n\t\t\t\t\titemSize: srcAttribute.itemSize,\n\t\t\t\t\tisString: srcAttribute.isString,\n\t\t\t\t\tarray: new Array(destPrimitivesCount * srcAttribute.itemSize),\n\t\t\t\t};\n\t\t\t\tThreejsPrimitiveTriangle.addAttribute(lineSegments, primitiveAttributeName, destAttribute);\n\t\t\t\tconst srcArray = srcAttribute.array;\n\t\t\t\tconst destArray = destAttribute.array;\n\t\t\t\tconst srcArraySize = srcArray.length;\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = 0; i < srcArraySize; i++) {\n\t\t\t\t\t// 1 quad -> 4 lines\n\t\t\t\t\tdestArray[j] = srcArray[i];\n\t\t\t\t\tdestArray[j + 1] = srcArray[i];\n\t\t\t\t\tdestArray[j + 2] = srcArray[i];\n\t\t\t\t\tdestArray[j + 3] = srcArray[i];\n\n\t\t\t\t\tj += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprepareObject(lineSegments, {shadow: false});\n\treturn lineSegments;\n}\n","import {BufferAttribute, BufferGeometry, Points, Vector3, Vector4, Line3} from 'three';\nimport {QuadObject} from '../QuadObject';\nimport {QUADTesselationParams, QuadTriangulationAttribute} from '../QuadCommon';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {DEFAULT_MATERIALS, ObjectType} from '../../../Constant';\nimport {Attribute} from '../../../Attribute';\nimport {stringMatchMask} from '../../../../String';\nimport {quadInnerRadius, quadOuterRadius} from '../utils/QuadUtils';\nimport {prepareObject} from './QuadToObject3DCommon';\nimport {HalfEdgeIndices, quadHalfEdgeIndices} from '../graph/QuadGraphCommon';\nimport {Number4} from '../../../../../types/GlobalTypes';\n\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\nconst _center = new Vector3();\nconst _v4 = new Vector4();\nconst _v4Array: Number4 = [0, 0, 0, 0];\nconst _line = new Line3();\nconst _halfEdgeIndices: HalfEdgeIndices = {index0: 0, index1: 0};\n\nexport function quadToCenterEdgeCenterVectorAttributeName(edgeIndex: number) {\n\treturn `${QuadTriangulationAttribute.EDGE_CENTER_VECTOR}_${edgeIndex}`;\n}\nexport function quadToCenterEdgeNearestPointVectorAttributeName(edgeIndex: number) {\n\treturn `${QuadTriangulationAttribute.EDGE_NEAREST_POINT_VECTOR}_${edgeIndex}`;\n}\n\nexport function quadToCenter(quadObject: QuadObject, options: QUADTesselationParams) {\n\tconst quadGeometry = quadObject.geometry;\n\tconst quadsCount = quadGeometry.quadsCount();\n\n\tconst srcIndices = quadObject.geometry.index;\n\tconst srcPositionAttribute = quadGeometry.attributes[Attribute.POSITION];\n\tconst srcPositions = srcPositionAttribute.array;\n\n\tconst geometry = new BufferGeometry();\n\tconst newIndices = new Array(quadsCount);\n\tconst newPositions = new Array(quadsCount * 3);\n\tfor (let i = 0; i < quadsCount; i++) {\n\t\tQuadPrimitive.position(quadObject, i, _center);\n\t\t_center.toArray(newPositions, i * 3);\n\n\t\tnewIndices[i] = i;\n\t}\n\n\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(newPositions), 3));\n\tgeometry.setIndex(newIndices);\n\tconst points = new Points(geometry, DEFAULT_MATERIALS[ObjectType.POINTS]);\n\n\t// copy quad primitive attributes to new point attributes\n\tconst primitiveAttributes = QuadPrimitive.attributesFromGeometry(quadGeometry);\n\tif (primitiveAttributes) {\n\t\tconst primitiveAttributeNames = Object.keys(primitiveAttributes).filter((attributeName) =>\n\t\t\tstringMatchMask(attributeName, options.primitiveAttributes)\n\t\t);\n\t\tfor (const primitiveAttributeName of primitiveAttributeNames) {\n\t\t\tconst srcAttribute = primitiveAttributes[primitiveAttributeName];\n\t\t\tif (srcAttribute.isString == false) {\n\t\t\t\tconst destArray: number[] = [...(srcAttribute.array as number[])];\n\t\t\t\tconst destAttribute = new BufferAttribute(new Float32Array(destArray), srcAttribute.itemSize);\n\t\t\t\tgeometry.setAttribute(primitiveAttributeName, destAttribute);\n\t\t\t}\n\t\t}\n\t}\n\tif (options.innerRadius == true) {\n\t\tconst innerRadiusValues: number[] = new Array(quadsCount);\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\tconst innerRadius = quadInnerRadius(quadObject, i);\n\t\t\tinnerRadiusValues[i] = innerRadius;\n\t\t}\n\t\tgeometry.setAttribute(\n\t\t\tQuadTriangulationAttribute.INNER_RADIUS,\n\t\t\tnew BufferAttribute(new Float32Array(innerRadiusValues), 1)\n\t\t);\n\t}\n\tif (options.outerRadius == true) {\n\t\tconst outerRadiusValues: number[] = new Array(quadsCount);\n\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\tconst outerRadius = quadOuterRadius(quadObject, i);\n\t\t\touterRadiusValues[i] = outerRadius;\n\t\t}\n\t\tgeometry.setAttribute(\n\t\t\tQuadTriangulationAttribute.OUTER_RADIUS,\n\t\t\tnew BufferAttribute(new Float32Array(outerRadiusValues), 1)\n\t\t);\n\t}\n\tif (options.edgeCenterVectors == true) {\n\t\tfor (let edgeIndex = 0; edgeIndex < 4; edgeIndex++) {\n\t\t\tconst attributeName = quadToCenterEdgeCenterVectorAttributeName(edgeIndex);\n\t\t\tconst edgeCenterVectors: number[] = new Array(quadsCount * 3).fill(-1);\n\n\t\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\t\t//\n\t\t\t\t_v4.fromArray(srcIndices, i * 4);\n\t\t\t\t_v4.toArray(_v4Array);\n\t\t\t\tquadHalfEdgeIndices(_v4Array, edgeIndex, _halfEdgeIndices);\n\t\t\t\t_p0.fromArray(srcPositions, _halfEdgeIndices.index0 * 3);\n\t\t\t\t_p1.fromArray(srcPositions, _halfEdgeIndices.index1 * 3);\n\t\t\t\t_p0.add(_p1).multiplyScalar(0.5);\n\n\t\t\t\t//\n\t\t\t\tQuadPrimitive.position(quadObject, i, _center);\n\t\t\t\t_p0.sub(_center);\n\n\t\t\t\t//\n\t\t\t\t_p0.toArray(edgeCenterVectors, i * 3);\n\t\t\t}\n\t\t\tgeometry.setAttribute(attributeName, new BufferAttribute(new Float32Array(edgeCenterVectors), 3));\n\t\t}\n\t}\n\tif (options.edgeNearestPointVectors == true) {\n\t\tfor (let edgeIndex = 0; edgeIndex < 4; edgeIndex++) {\n\t\t\tconst attributeName = quadToCenterEdgeNearestPointVectorAttributeName(edgeIndex);\n\t\t\tconst edgeNearestPointVectors: number[] = new Array(quadsCount * 3).fill(-1);\n\n\t\t\tfor (let i = 0; i < quadsCount; i++) {\n\t\t\t\t//\n\t\t\t\tQuadPrimitive.position(quadObject, i, _center);\n\n\t\t\t\t//\n\t\t\t\t_v4.fromArray(srcIndices, i * 4);\n\t\t\t\t_v4.toArray(_v4Array);\n\t\t\t\tquadHalfEdgeIndices(_v4Array, edgeIndex, _halfEdgeIndices);\n\t\t\t\t_line.start.fromArray(srcPositions, _halfEdgeIndices.index0 * 3);\n\t\t\t\t_line.end.fromArray(srcPositions, _halfEdgeIndices.index1 * 3);\n\t\t\t\t_line.closestPointToPoint(_center, true, _p0);\n\n\t\t\t\t//\n\t\t\t\t_p0.sub(_center);\n\n\t\t\t\t//\n\t\t\t\t_p0.toArray(edgeNearestPointVectors, i * 3);\n\t\t\t}\n\t\t\tgeometry.setAttribute(attributeName, new BufferAttribute(new Float32Array(edgeNearestPointVectors), 3));\n\t\t}\n\t}\n\n\tprepareObject(points, {shadow: false});\n\treturn points;\n}\n","import {LineBasicMaterial, Color, Vector3, BufferGeometry, Float32BufferAttribute, LineSegments} from 'three';\nimport {QuadObject} from '../QuadObject';\nimport {QUADTesselationParams} from '../QuadCommon';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {prepareObject} from './QuadToObject3DCommon';\nimport {halfEdgeIndicesInCommonBetweenQuads, pointInCommonBetweenQuadsSharingPoint} from '../graph/QuadGraphUtils';\nimport {HalfEdgeIndices} from '../graph/QuadGraphCommon';\nimport {QuadGraph} from '../graph/QuadGraph';\nimport {CoreGeometryBuilderMerge} from '../../three/builders/Merge';\nimport {arrayDifference} from '../../../../ArrayUtils';\n\n// const _v4 = new Vector4();\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\n// const _p2 = new Vector3();\n// const _p3 = new Vector3();\nconst _neighbourIdsSharingEdge: number[] = [];\nconst _neighbourIdsSharingPoint: number[] = [];\nconst _neighbourIdsSharingPointOnly: number[] = [];\nconst _center = new Vector3();\nconst _halfEdgeIndices: HalfEdgeIndices = {\n\tindex0: -1,\n\tindex1: -1,\n};\nconst _quadCenter0 = new Vector3();\nconst _quadCenter1 = new Vector3();\n// const _neighbourData: NeighbourData = {\n// \tquadNode: null,\n// \tneighbourIndex: null,\n// };\n// const _indices: HalfEdgeIndices = {\n// \tindex0: -1,\n// \tindex1: -1,\n// };\n\nconst _lineMaterialByColorStyle: Map<string, LineBasicMaterial> = new Map();\nfunction _createOrFindLineMaterial(color: Color) {\n\tlet material = _lineMaterialByColorStyle.get(color.getStyle());\n\tif (!material) {\n\t\tmaterial = new LineBasicMaterial({\n\t\t\tcolor,\n\t\t\tlinewidth: 1,\n\t\t});\n\t\t_lineMaterialByColorStyle.set(color.getStyle(), material);\n\t}\n\treturn material;\n}\n\nexport function quadToConnections(quadObject: QuadObject, graph: QuadGraph, options: QUADTesselationParams) {\n\tconst {connectionsBetweenQuadsSharingEdge, connectionsBetweenQuadsSharingPointOnly, connectionsColor} = options;\n\tconst quadGeometry = quadObject.geometry;\n\tconst quadsCount = quadGeometry.quadsCount();\n\t// const indices = quadGeometry.index;\n\tconst srcPositions = quadGeometry.attributes.position.array;\n\n\tconst geometries: BufferGeometry[] = [];\n\tif (connectionsBetweenQuadsSharingEdge) {\n\t\tfor (let quadId0 = 0; quadId0 < quadsCount; quadId0++) {\n\t\t\tQuadPrimitive.position(quadObject, quadId0, _quadCenter0);\n\t\t\tgraph.neighbourIdsSharingEdge(quadId0, _neighbourIdsSharingEdge);\n\t\t\tfor (const neighbourId of _neighbourIdsSharingEdge) {\n\t\t\t\tif (neighbourId > quadId0) {\n\t\t\t\t\tQuadPrimitive.position(quadObject, neighbourId, _quadCenter1);\n\n\t\t\t\t\tconst geometry = new BufferGeometry();\n\t\t\t\t\thalfEdgeIndicesInCommonBetweenQuads({\n\t\t\t\t\t\tquadObject,\n\t\t\t\t\t\tquadId0,\n\t\t\t\t\t\tquadId1: neighbourId,\n\t\t\t\t\t\ttarget: _halfEdgeIndices,\n\t\t\t\t\t});\n\t\t\t\t\t_p0.fromArray(srcPositions, _halfEdgeIndices.index0 * 3);\n\t\t\t\t\t_p1.fromArray(srcPositions, _halfEdgeIndices.index1 * 3);\n\t\t\t\t\t_center.copy(_p0).add(_p1).multiplyScalar(0.5);\n\n\t\t\t\t\tconst positions: Float32Array = new Float32Array(9);\n\t\t\t\t\t_quadCenter0.toArray(positions, 0);\n\t\t\t\t\t_center.toArray(positions, 3);\n\t\t\t\t\t_quadCenter1.toArray(positions, 6);\n\n\t\t\t\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\t\t\t\t\tgeometry.setIndex([0, 1, 1, 2]);\n\t\t\t\t\tgeometries.push(geometry);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (connectionsBetweenQuadsSharingPointOnly) {\n\t\tfor (let quadId0 = 0; quadId0 < quadsCount; quadId0++) {\n\t\t\tQuadPrimitive.position(quadObject, quadId0, _quadCenter0);\n\t\t\tgraph.neighbourIdsSharingEdge(quadId0, _neighbourIdsSharingEdge);\n\t\t\tgraph.neighbourIdsSharingPoint(quadId0, _neighbourIdsSharingPoint);\n\t\t\tarrayDifference(_neighbourIdsSharingPoint, _neighbourIdsSharingEdge, _neighbourIdsSharingPointOnly);\n\t\t\tfor (const neighbourId of _neighbourIdsSharingPointOnly) {\n\t\t\t\tif (neighbourId > quadId0) {\n\t\t\t\t\tQuadPrimitive.position(quadObject, neighbourId, _quadCenter1);\n\t\t\t\t\tconst sharedPointId = pointInCommonBetweenQuadsSharingPoint(graph, quadId0, neighbourId);\n\t\t\t\t\tif (sharedPointId != null) {\n\t\t\t\t\t\tconst geometry = new BufferGeometry();\n\t\t\t\t\t\t_center.fromArray(srcPositions, sharedPointId * 3);\n\t\t\t\t\t\tconst positions: Float32Array = new Float32Array(9);\n\t\t\t\t\t\t_quadCenter0.toArray(positions, 0);\n\t\t\t\t\t\t_center.toArray(positions, 3);\n\t\t\t\t\t\t_quadCenter1.toArray(positions, 6);\n\t\t\t\t\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\t\t\t\t\t\tgeometry.setIndex([0, 1, 1, 2]);\n\t\t\t\t\t\tgeometries.push(geometry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tconst mergedGeometry = CoreGeometryBuilderMerge.merge(geometries);\n\tconst material = _createOrFindLineMaterial(connectionsColor);\n\tconst lineSegments = new LineSegments(mergedGeometry, material);\n\n\tprepareObject(lineSegments, {shadow: false});\n\treturn lineSegments;\n}\n","import {Object3D} from 'three';\nimport {QuadObject} from '../QuadObject';\nimport {QUADTesselationParams} from '../QuadCommon';\nimport {quadToMesh} from './QuadToMesh';\nimport {quadToLine} from './QuadToLine';\nimport {quadToCenter} from './QuadToPoint';\nimport {quadToConnections} from './QuadToConnections';\nimport {quadGraphFromQuadObject} from '../graph/QuadGraphUtils';\n\nexport function quadToObject3D(quadObject: QuadObject, options: QUADTesselationParams): Object3D[] | undefined {\n\tconst objects: Object3D[] = [];\n\n\tconst graph = options.wireframe || options.connections ? quadGraphFromQuadObject(quadObject) : null;\n\n\tif (options.triangles) {\n\t\tobjects.push(quadToMesh(quadObject, options));\n\t}\n\tif (options.wireframe && graph) {\n\t\tobjects.push(quadToLine(quadObject, graph, options));\n\t}\n\tif (options.connections && graph) {\n\t\tobjects.push(quadToConnections(quadObject, graph, options));\n\t}\n\tif (options.center) {\n\t\tobjects.push(quadToCenter(quadObject, options));\n\t}\n\treturn objects;\n}\n","import {Material, Matrix4, Box3, Sphere, Object3D, Vector3, Mesh} from 'three';\nimport {QUADObjectType, QUADTesselationParams} from './QuadCommon';\nimport {QuadGeometry} from './QuadGeometry';\nimport {\n\tObjectContent,\n\tCoreObjectType,\n\tObjectGeometryMap,\n\tobjectContentCopyProperties,\n\tObjectContentCopyPropertiesOptions,\n} from '../../ObjectContent';\nimport {quadToObject3D} from './toObject3D/QuadToObject3D';\nimport {isArray} from '../../../Type';\n\nconst _box = new Box3();\nconst _size = new Vector3();\n\nexport class QuadObject implements ObjectContent<CoreObjectType.QUAD> {\n\tpublic visible = true;\n\tget geometry() {\n\t\treturn this._geometry as ObjectGeometryMap[CoreObjectType.QUAD];\n\t}\n\tget type() {\n\t\treturn this._type;\n\t}\n\tuserData = {};\n\tname = '';\n\tcastShadow = true;\n\treceiveShadow = true;\n\trenderOrder = 0;\n\tfrustumCulled = true;\n\tmatrixAutoUpdate = false;\n\tmaterial: Material | undefined;\n\tchildren: ObjectContent<CoreObjectType.QUAD>[] = [];\n\tparent: ObjectContent<CoreObjectType.QUAD> | null = null;\n\tprivate _type: QUADObjectType;\n\tconstructor(private _geometry: QuadGeometry) {\n\t\tthis._type = QUADObjectType.DEFAULT;\n\t}\n\n\tquadGeometry() {\n\t\treturn this.geometry! as QuadGeometry;\n\t}\n\tdispose() {}\n\tapplyMatrix4(matrix: Matrix4) {\n\t\tthis._geometry.applyMatrix(matrix);\n\t}\n\tadd(...object: ObjectContent<CoreObjectType>[]) {}\n\tremove(...object: ObjectContent<CoreObjectType>[]) {}\n\tdispatchEvent(event: {type: string}) {}\n\ttraverse(callback: (object: QuadObject) => any) {\n\t\tcallback(this);\n\t}\n\n\tclone(): QuadObject {\n\t\tconst clonedGeometry = this.geometry.clone();\n\t\tconst clone = new QuadObject(clonedGeometry);\n\t\tobjectContentCopyProperties(this, clone);\n\t\treturn clone;\n\t}\n\ttoObject3D(tesselationParams: QUADTesselationParams): Object3D | Object3D[] | undefined {\n\t\tconst object = quadToObject3D(this, tesselationParams);\n\n\t\tconst _objectContentCopyProperties = (src: QuadObject, dest: Object3D) => {\n\t\t\tconst options: ObjectContentCopyPropertiesOptions = {\n\t\t\t\t// the lineSegments objects have castShadow and receiveShadow set to false,\n\t\t\t\t// we therefore should not take those properties into account\n\t\t\t\t// if they are false in the dest object\n\t\t\t\tcastShadow: dest.castShadow,\n\t\t\t\treceiveShadow: dest.receiveShadow,\n\t\t\t\t// lineSegments also have a material assigned\n\t\t\t\tmaterial: (dest as Mesh).material,\n\t\t\t};\n\t\t\tobjectContentCopyProperties(src, dest, options);\n\t\t};\n\t\tif (object) {\n\t\t\tif (isArray(object)) {\n\t\t\t\tfor (const element of object) {\n\t\t\t\t\t_objectContentCopyProperties(this, element);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_objectContentCopyProperties(this, object);\n\t\t\t}\n\t\t}\n\t\treturn object;\n\t}\n\n\tboundingBox(target: Box3): void {\n\t\tthis.geometry.boundingBox(target);\n\t}\n\tboundingSphere(target: Sphere): void {\n\t\tthis.boundingBox(_box);\n\t\t_box.getCenter(target.center);\n\t\t_box.getSize(_size);\n\t\tconst diameter = Math.max(_size.x, _size.y, _size.z);\n\t\ttarget.radius = diameter * 0.5;\n\t}\n}\n","import {Vector3, BufferAttribute} from 'three';\nimport {ObjectGeometryMap, CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {CorePoint} from '../../entities/point/CorePoint';\nimport {PointAttributesDict} from '../../entities/point/Common';\nimport {QuadObject} from './QuadObject';\nimport {Attribute} from '../../Attribute';\nimport {attributeNumericValues, AttributeNumericValuesOptions} from '../../entities/utils/Common';\nimport {NumericAttribValue} from '../../../../types/GlobalTypes';\nimport {pointsCountFromObject} from '../../entities/point/CorePointUtils';\nimport {QuadVertex} from './QuadVertex';\nimport {QuadGeometry} from './QuadGeometry';\nimport {quadGraphFromQuadObject} from './graph/QuadGraphUtils';\nimport {QuadPrimitive} from './QuadPrimitive';\nimport {QuadNode} from './graph/QuadNode';\nimport {pushOnArrayAtEntry} from '../../../MapUtils';\nimport {TraversedRelatedEntityData} from '../../entities/utils/TraversedRelatedEntities';\nimport {CoreEntityWithObject} from '../../CoreEntity';\nconst target: AttributeNumericValuesOptions = {\n\tattributeAdded: false,\n\tvalues: [],\n};\nconst _quadNodesByPointIndex: Map<number, QuadNode[]> = new Map();\nconst _n = new Vector3();\nconst _tmp = new Vector3();\n\nexport class QuadPoint extends CorePoint<CoreObjectType.QUAD> {\n\tprotected _geometry?: ObjectGeometryMap[CoreObjectType.QUAD];\n\tprotected override _object: QuadObject;\n\tconstructor(object: QuadObject, index: number) {\n\t\tsuper(object, index);\n\t\tthis._object = object;\n\t\tthis._updateGeometry();\n\t}\n\toverride object() {\n\t\treturn this._object;\n\t}\n\toverride setIndex(index: number, object?: QuadObject) {\n\t\tthis._index = index;\n\t\tif (object) {\n\t\t\tthis._object = object;\n\t\t\tthis._updateGeometry();\n\t\t}\n\t\treturn this;\n\t}\n\tprivate _updateGeometry() {\n\t\tconst geometry = this._object.geometry;\n\t\tif (geometry) {\n\t\t\tthis._geometry = geometry;\n\t\t}\n\t}\n\tgeometry() {\n\t\treturn this._geometry;\n\t}\n\tstatic override addAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribute: BufferAttribute\n\t) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[attribName] = attribute;\n\t}\n\tstatic override addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: number = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst geometry = (object as any as QuadObject).geometry;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tattributeNumericValues(object, pointsCountFromObject, size, defaultValue, target);\n\n\t\tif (target.attributeAdded) {\n\t\t\t// if (markedAsInstance(geometry)) {\n\t\t\t// \tconst valuesAsTypedArray = new Float32Array(target.values);\n\t\t\t// \tgeometry.setAttribute(attribName.trim(), new InstancedBufferAttribute(valuesAsTypedArray, size));\n\t\t\t// } else {\n\t\t\tgeometry.setAttribute(attribName.trim(), new BufferAttribute(new Float32Array(target.values), size));\n\t\t\t// }\n\t\t} else {\n\t\t\tconsole.warn(defaultValue);\n\t\t\tthrow `QuadPoint.addNumericAttrib error: no other default value allowed for now (default given: ${defaultValue})`;\n\t\t}\n\t}\n\tstatic override attributes<T extends CoreObjectType>(object: ObjectContent<T>): PointAttributesDict | undefined {\n\t\tconst geometry = (object as any as QuadObject).geometry;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\treturn geometry.attributes;\n\t}\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>): number {\n\t\tconst positionAttribute = this.attribute(object, Attribute.POSITION);\n\t\tif (!positionAttribute) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn positionAttribute.count;\n\t}\n\tstatic position<T extends CoreObjectType>(\n\t\tquadObject: ObjectContent<T> | undefined,\n\t\tpointIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(quadObject && quadObject.geometry)) {\n\t\t\treturn target;\n\t\t}\n\t\tconst attribute = (quadObject.geometry as QuadGeometry).attributes[Attribute.POSITION] as\n\t\t\t| BufferAttribute\n\t\t\t| undefined;\n\t\tif (!attribute) {\n\t\t\treturn target;\n\t\t}\n\t\treturn target.fromArray(attribute.array, pointIndex * 3);\n\t}\n\toverride position(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof QuadPoint).position(this._object, this._index, target);\n\t}\n\tstatic normal<T extends CoreObjectType>(\n\t\tquadObject: ObjectContent<T> | undefined,\n\t\tpointIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(quadObject && quadObject.geometry)) {\n\t\t\treturn target;\n\t\t}\n\t\tconst attribute = (quadObject.geometry as QuadGeometry).attributes[Attribute.NORMAL] as\n\t\t\t| BufferAttribute\n\t\t\t| undefined;\n\t\tif (!attribute) {\n\t\t\treturn target;\n\t\t}\n\t\treturn target.fromArray(attribute.array, pointIndex * 3);\n\t}\n\toverride normal(target: Vector3) {\n\t\treturn (this.constructor as typeof QuadPoint).normal(this._object, this._index, target);\n\t}\n\tstatic override computeNormals<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tif (!object.geometry) {\n\t\t\treturn;\n\t\t}\n\t\tconst graph = quadGraphFromQuadObject(object as any as QuadObject);\n\t\tconst pointsCount = this.entitiesCount(object);\n\t\tconst primitivesCount = QuadPrimitive.entitiesCount(object);\n\t\t_quadNodesByPointIndex.clear();\n\t\tfor (let i = 0; i < primitivesCount; i++) {\n\t\t\tconst quadNode = graph.quadNode(i);\n\t\t\tif (!quadNode) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst indices = quadNode.indices;\n\t\t\tfor (const index of indices) {\n\t\t\t\tpushOnArrayAtEntry(_quadNodesByPointIndex, index, quadNode);\n\t\t\t}\n\t\t}\n\t\tconst normals: number[] = new Array(pointsCount * 3);\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\tconst quadNodes = _quadNodesByPointIndex.get(i);\n\t\t\tif (!quadNodes) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t_n.set(0, 0, 0);\n\t\t\tfor (const quadNode of quadNodes) {\n\t\t\t\tQuadPrimitive.normal(object, quadNode.id, _tmp);\n\t\t\t\t_n.add(_tmp);\n\t\t\t}\n\t\t\t_n.divideScalar(quadNodes.length);\n\t\t\t_n.toArray(normals, i * 3);\n\t\t}\n\n\t\t// set attribute\n\t\tconst geometry = (object as any as QuadObject).geometry;\n\t\tconst position = new BufferAttribute(new Float32Array(normals), 3);\n\t\tgeometry.setAttribute(Attribute.NORMAL, position);\n\t}\n\tstatic override markAttribAsNeedsUpdate<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\tstatic override userDataAttribs<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn {};\n\t}\n\tstatic override setIndexedAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tvalues: string[],\n\t\tindices: number[]\n\t) {}\n\tstatic override attribValueIndex<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\tattribName: string\n\t): number {\n\t\treturn -1;\n\t}\n\t//\n\t//\n\t//\n\t//\n\t//\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedVertexIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tpointIndex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst geometry = (object as any as QuadObject).geometry as QuadGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tconst indexArray = geometry.index;\n\t\tlet i = 0;\n\t\tfor (const indexValue of indexArray) {\n\t\t\tif (indexValue == pointIndex) {\n\t\t\t\ttarget.push(i);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\tstatic override relatedVertexClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn QuadVertex as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {Vector4} from 'three';\nimport {CoreObjectType, ObjectBuilder, ObjectContent} from '../../../ObjectContent';\nimport {CoreEntity} from '../../../CoreEntity';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {QuadObject} from '../QuadObject';\n\nconst _v4 = new Vector4();\nconst STRIDE = 4;\nexport const quadObjectFromPrimitives: ObjectBuilder<CoreObjectType.QUAD> = (\n\tobject: ObjectContent<CoreObjectType.QUAD>,\n\tentities: CoreEntity[]\n) => {\n\tconst quadObject = object as ObjectContent<CoreObjectType.QUAD> as QuadObject;\n\tconst geometry = quadObject.geometry;\n\tif (!geometry) {\n\t\treturn undefined;\n\t}\n\tconst oldIndex = geometry.index;\n\tif (!oldIndex) {\n\t\treturn undefined;\n\t}\n\tconst oldIndexArray = [...oldIndex];\n\n\tconst entitiesCount = entities.length;\n\tconst newIndices = new Array(entitiesCount * STRIDE);\n\n\tlet i = 0;\n\tfor (const primitive of entities) {\n\t\t_v4.fromArray(oldIndexArray, primitive.index() * STRIDE);\n\t\t_v4.toArray(newIndices, i * STRIDE);\n\t\ti++;\n\t}\n\tgeometry.setIndex(newIndices);\n\n\t// update primitive attributes\n\tconst primitiveAttributes = QuadPrimitive.attributes(object);\n\tif (primitiveAttributes) {\n\t\tconst primitiveAttributeNames = Object.keys(primitiveAttributes);\n\t\tfor (const primitiveAttributeName of primitiveAttributeNames) {\n\t\t\tconst primitiveAttribute = primitiveAttributes[primitiveAttributeName];\n\t\t\tconst itemSize = primitiveAttribute.itemSize;\n\t\t\tconst srcArray = primitiveAttribute.array;\n\t\t\tconst newArray = new Array(entitiesCount * itemSize);\n\t\t\tlet i = 0;\n\t\t\tfor (const entity of entities) {\n\t\t\t\tconst index = entity.index();\n\t\t\t\tfor (let k = 0; k < itemSize; k++) {\n\t\t\t\t\tnewArray[i + k] = srcArray[index + k];\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tprimitiveAttribute.array = newArray;\n\t\t}\n\t}\n\n\treturn quadObject;\n};\n","import {Vector3, Vector4, BufferAttribute, Triangle} from 'three';\nimport {CoreObjectType, ObjectBuilder, ObjectContent} from '../../ObjectContent';\nimport {QuadObject} from './QuadObject';\nimport {QuadGeometry} from './QuadGeometry';\nimport {quadObjectFromPrimitives} from './builders/QuadPrimitiveBuilder';\nimport {CorePrimitive} from '../../entities/primitive/CorePrimitive';\nimport {PrimitiveAttributesDict, UserDataWithPrimitiveAttributes} from '../../entities/primitive/Common';\nimport {AttributeNumericValuesOptions, attributeNumericValues} from '../../entities/utils/Common';\nimport {BasePrimitiveAttribute, PrimitiveNumberAttribute} from '../../entities/primitive/PrimitiveAttribute';\nimport {QuadVertex} from './QuadVertex';\nimport {NumericAttribValue} from '../../../../types/GlobalTypes';\nimport {primitivesCountFromObject} from '../../entities/primitive/CorePrimitiveUtils';\nimport {Attribute} from '../../Attribute';\nimport {quadGraphFromQuadObject} from './graph/QuadGraphUtils';\nimport {CoreEntityWithObject} from '../../CoreEntity';\nimport {QuadCoreObject} from './QuadCoreObject';\n\nconst _triangle = new Triangle();\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\nconst _p2 = new Vector3();\nconst _p3 = new Vector3();\nconst _n0 = new Vector3();\nconst _n1 = new Vector3();\nconst _v4 = new Vector4();\nexport interface QuadGeometryWithPrimitiveAttributes extends QuadGeometry {\n\tuserData: UserDataWithPrimitiveAttributes;\n}\nconst target: AttributeNumericValuesOptions = {\n\tattributeAdded: false,\n\tvalues: [],\n};\nconst STRIDE = 4;\n\nexport class QuadPrimitive extends CorePrimitive<CoreObjectType.QUAD> {\n\tprotected _geometry?: QuadGeometryWithPrimitiveAttributes;\n\tconstructor(object: QuadObject, index: number) {\n\t\tsuper(object, index);\n\t\tthis._geometry = object.geometry as QuadGeometryWithPrimitiveAttributes;\n\t}\n\toverride setIndex(index: number, object?: QuadObject) {\n\t\tthis._index = index;\n\t\tif (object) {\n\t\t\tthis._object = object;\n\t\t\tthis._updateGeometry();\n\t\t}\n\t\treturn this;\n\t}\n\tprivate _updateGeometry() {\n\t\tconst geometry = (this._object as QuadObject).geometry as QuadGeometryWithPrimitiveAttributes | undefined;\n\t\tif (geometry) {\n\t\t\tthis._geometry = geometry;\n\t\t}\n\t}\n\tgeometry() {\n\t\treturn this._geometry;\n\t}\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn (object as any as QuadObject).geometry.quadsCount();\n\t}\n\toverride builder<T extends CoreObjectType>() {\n\t\treturn quadObjectFromPrimitives as any as ObjectBuilder<T>;\n\t}\n\n\t//\n\t//\n\t// ATTRIBUTES\n\t//\n\t//\n\tstatic override addAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribute: BasePrimitiveAttribute\n\t) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[attribName] = attribute;\n\t}\n\tstatic override addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: number = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst verticesCount = this.entitiesCount(object);\n\t\ttarget.values = new Array(verticesCount * size);\n\t\tattributeNumericValues(object, primitivesCountFromObject, size, defaultValue, target);\n\n\t\tconst attribute: PrimitiveNumberAttribute = {\n\t\t\tisString: false,\n\t\t\tarray: target.values,\n\t\t\titemSize: size,\n\t\t};\n\t\tthis.addAttribute(object, attribName, attribute);\n\t}\n\tstatic attributesFromGeometry(geometry: QuadGeometry): PrimitiveAttributesDict | undefined {\n\t\tif (!geometry.userData.primAttributes) {\n\t\t\tgeometry.userData.primAttributes = {};\n\t\t}\n\t\treturn geometry.userData.primAttributes;\n\t}\n\tstatic override attributes<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>\n\t): PrimitiveAttributesDict | undefined {\n\t\tconst geometry = (object as any as QuadObject).geometry as QuadGeometryWithPrimitiveAttributes | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\treturn this.attributesFromGeometry(geometry);\n\t}\n\n\t//\n\t//\n\t// POSITION AND NORMAL\n\t//\n\t//\n\tstatic override position<T extends CoreObjectType>(\n\t\tquadObject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(quadObject && quadObject.geometry)) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionAttribute = (quadObject as any as QuadObject).geometry.attributes[Attribute.POSITION] as\n\t\t\t| BufferAttribute\n\t\t\t| undefined;\n\t\tif (!positionAttribute) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionArray = positionAttribute.array;\n\t\tconst index = (quadObject as any as QuadObject).geometry.index;\n\t\t_v4.fromArray(index, primitiveIndex * STRIDE);\n\t\t_p0.fromArray(positionArray, _v4.x * 3);\n\t\t_p1.fromArray(positionArray, _v4.y * 3);\n\t\t_p2.fromArray(positionArray, _v4.z * 3);\n\t\t_p3.fromArray(positionArray, _v4.w * 3);\n\t\ttarget.copy(_p0).add(_p1).add(_p2).add(_p3).divideScalar(4);\n\t\treturn target;\n\t}\n\tstatic override normal<T extends CoreObjectType>(\n\t\tquadObject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(quadObject && quadObject.geometry)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tconst positionAttribute = (quadObject as any as QuadObject).geometry.attributes[Attribute.POSITION] as\n\t\t\t| BufferAttribute\n\t\t\t| undefined;\n\t\tif (!positionAttribute) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionArray = positionAttribute.array;\n\t\tconst index = (quadObject as any as QuadObject).geometry.index;\n\t\t_v4.fromArray(index, primitiveIndex * STRIDE);\n\t\t_triangle.a.fromArray(positionArray, _v4.x * 3);\n\t\t_triangle.b.fromArray(positionArray, _v4.y * 3);\n\t\t_triangle.c.fromArray(positionArray, _v4.z * 3);\n\t\t_triangle.getNormal(_n0);\n\t\t_triangle.a.fromArray(positionArray, _v4.z * 3);\n\t\t_triangle.b.fromArray(positionArray, _v4.w * 3);\n\t\t_triangle.c.fromArray(positionArray, _v4.x * 3);\n\t\t_triangle.getNormal(_n1);\n\t\treturn target.copy(_n0).add(_n1).divideScalar(2);\n\t}\n\tposition(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof QuadPrimitive).position(this._object, this._index, target);\n\t}\n\tnormal(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof QuadPrimitive).normal(this._object, this._index, target);\n\t}\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedVertexIds(\n\t\tobject: ObjectContent<CoreObjectType>,\n\t\tprimitiveIndex: number,\n\t\ttarget: number[]\n\t): void {\n\t\tconst geometry = (object as any as QuadObject).geometry as QuadGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\ttarget.length = 0;\n\t\t\treturn;\n\t\t}\n\t\ttarget.length = STRIDE;\n\t\tfor (let i = 0; i < STRIDE; i++) {\n\t\t\ttarget[i] = primitiveIndex * STRIDE + i;\n\t\t}\n\t}\n\tstatic override relatedVertexClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn QuadVertex as any as typeof CoreEntityWithObject<T>;\n\t}\n\n\tstatic override relatedObjectClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn QuadCoreObject as any as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic override graph(object: ObjectContent<CoreObjectType>) {\n\t\treturn quadGraphFromQuadObject(object as QuadObject);\n\t}\n}\n","import {Vector3} from 'three';\nimport {CoreVertex} from '../../entities/vertex/CoreVertex';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {UserDataWithVertexAttributes, VertexAttributesDict} from '../../entities/vertex/Common';\nimport {verticesCountFromObject} from '../../entities/vertex/CoreVertexUtils';\nimport {QuadGeometry} from './QuadGeometry';\nimport {QuadObject} from './QuadObject';\nimport {BaseVertexAttribute, VertexNumberAttribute} from '../../entities/vertex/VertexAttribute';\nimport {AttributeNumericValuesOptions, attributeNumericValues} from '../../entities/utils/Common';\nimport {NumericAttribValue} from '../../../../types/GlobalTypes';\nimport {QuadPoint} from './QuadPoint';\nimport {QuadPrimitive} from './QuadPrimitive';\nimport {CoreEntityWithObject} from '../../CoreEntity';\n\nexport interface QuadGeometryWithVertexAttributes extends QuadGeometry {\n\tuserData: UserDataWithVertexAttributes;\n}\nconst target: AttributeNumericValuesOptions = {\n\tattributeAdded: false,\n\tvalues: [],\n};\n\nexport class QuadVertex extends CoreVertex<CoreObjectType.QUAD> {\n\tprotected _geometry?: QuadGeometryWithVertexAttributes;\n\tconstructor(object: QuadObject, index: number) {\n\t\tsuper(object, index);\n\t\tthis._geometry = object.geometry as QuadGeometryWithVertexAttributes;\n\t}\n\toverride setIndex(index: number, object?: QuadObject) {\n\t\tthis._index = index;\n\t\tif (object) {\n\t\t\tthis._object = object;\n\t\t\tthis._updateGeometry();\n\t\t}\n\t\treturn this;\n\t}\n\tprivate _updateGeometry() {\n\t\tconst geometry = (this._object as QuadObject).geometry as QuadGeometryWithVertexAttributes | undefined;\n\t\tif (geometry) {\n\t\t\tthis._geometry = geometry;\n\t\t}\n\t}\n\tgeometry() {\n\t\treturn this._geometry;\n\t}\n\tstatic override addAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tattribute: BaseVertexAttribute\n\t) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[attribName] = attribute;\n\t}\n\tstatic override addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: number = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst verticesCount = this.entitiesCount(object);\n\t\ttarget.values = new Array(verticesCount * size);\n\t\tattributeNumericValues(object, verticesCountFromObject, size, defaultValue, target);\n\n\t\tconst attribute: VertexNumberAttribute = {\n\t\t\tisString: false,\n\t\t\tarray: target.values,\n\t\t\titemSize: size,\n\t\t};\n\t\tthis.addAttribute(object, attribName, attribute);\n\t}\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn (object as any as QuadObject).geometry.index.length;\n\t}\n\tstatic override attributes<T extends CoreObjectType>(object: ObjectContent<T>): VertexAttributesDict | undefined {\n\t\tconst geometry = (object as any as QuadObject).geometry as QuadGeometryWithVertexAttributes | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tif (!geometry.userData.vertexAttributes) {\n\t\t\tgeometry.userData.vertexAttributes = {};\n\t\t}\n\t\treturn geometry.userData.vertexAttributes;\n\t}\n\toverride position(target: Vector3): Vector3 {\n\t\tconsole.warn('QuadVertex.position not implemented');\n\t\treturn target;\n\t}\n\toverride normal(target: Vector3): Vector3 {\n\t\tconsole.warn('QuadVertex.normal not implemented');\n\t\treturn target;\n\t}\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedPrimitiveIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tvertexIndex: number,\n\t\ttarget: number[]\n\t): void {\n\t\ttarget.length = 1;\n\t\tconst index = Math.floor(vertexIndex / 4);\n\t\ttarget[0] = index;\n\t}\n\n\tstatic override relatedPointIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tvertexIndex: number,\n\t\ttarget: number[]\n\t): void {\n\t\ttarget.length = 0;\n\n\t\tconst geometry = (object as any as QuadObject).geometry as QuadGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tconst indexArray = geometry.index;\n\t\tconst indexValue = indexArray[vertexIndex];\n\t\ttarget[0] = indexValue;\n\t}\n\tstatic override relatedPointClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn QuadPoint as any as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic override relatedPrimitiveClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn QuadPrimitive as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {NeighbourIndex} from './QuadGraphCommon';\nexport interface QuadHalfEdgeOptions {\n\tquadId: number;\n\tindex0: number;\n\tindex1: number;\n\tsideIndex: NeighbourIndex;\n}\n\nexport class QuadHalfEdge {\n\tpublic readonly quadId: number;\n\tpublic readonly index0: number;\n\tpublic readonly index1: number;\n\tpublic readonly sideIndex: NeighbourIndex;\n\tconstructor(options: QuadHalfEdgeOptions) {\n\t\tthis.quadId = options.quadId;\n\t\tthis.index0 = options.index0;\n\t\tthis.index1 = options.index1;\n\t\tthis.sideIndex = options.sideIndex;\n\t}\n}\n","import {Number4} from '../../../../../types/GlobalTypes';\nexport class QuadNode {\n\tconstructor(public readonly id: number, public readonly indices: Number4) {}\n}\n","import {QuadHalfEdge} from './QuadHalfEdge';\nimport {QuadNode} from './QuadNode';\nimport {Number4} from '../../../../../types/GlobalTypes';\nimport {quadHalfEdgeIndices, HalfEdgeIndices, NeighbourIndex, NEIGHBOUR_INDICES} from './QuadGraphCommon';\nimport {addToMapAtEntry, getMapElementAtEntry} from '../../../../../core/MapUtils';\nimport {PrimitiveGraph} from '../../../entities/primitive/PrimitiveGraph';\nimport {setToArray} from '../../../../SetUtils';\n\nconst _indices: HalfEdgeIndices = {index0: 0, index1: 0};\nconst _neighbourIdsSet = new Set<number>();\nconst _neighbourIdsArray: number[] = [];\n\nexport interface NeighbourData {\n\tquadNode?: QuadNode | null;\n\tneighbourIndex: NeighbourIndex | null;\n}\n\nexport class QuadGraph extends PrimitiveGraph {\n\tprotected _quadsById: Map<number, QuadNode> = new Map();\n\tprotected _edgesByIndex: Map<number, Map<number, QuadHalfEdge>> = new Map();\n\tprotected _halfEdgeByHalfEdge: Map<QuadHalfEdge, QuadHalfEdge | undefined> = new Map();\n\tprotected _halfEdgeByQuadId: Map<number, Map<number, QuadHalfEdge>> = new Map();\n\tprotected _quadIdsByPointIndex: Map<number, Set<number>> = new Map();\n\taddQuad(quadId: number, quadIndices: Number4): QuadNode {\n\t\tconst quadNode = new QuadNode(quadId, quadIndices);\n\t\tthis._quadsById.set(quadId, quadNode);\n\n\t\t// add edges\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tquadHalfEdgeIndices(quadIndices, i, _indices);\n\t\t\tconst edge = new QuadHalfEdge({\n\t\t\t\tquadId,\n\t\t\t\tindex0: _indices.index0,\n\t\t\t\tindex1: _indices.index1,\n\t\t\t\tsideIndex: i as NeighbourIndex,\n\t\t\t});\n\t\t\taddToMapAtEntry(this._edgesByIndex, _indices.index0, _indices.index1, edge);\n\t\t\tconst oppositeHalfEdge = getMapElementAtEntry(this._edgesByIndex, _indices.index1, _indices.index0);\n\t\t\tif (oppositeHalfEdge) {\n\t\t\t\tthis._halfEdgeByHalfEdge.set(edge, oppositeHalfEdge);\n\t\t\t\tthis._halfEdgeByHalfEdge.set(oppositeHalfEdge, edge);\n\t\t\t\taddToMapAtEntry(this._halfEdgeByQuadId, quadNode.id, oppositeHalfEdge.quadId, edge);\n\t\t\t\taddToMapAtEntry(this._halfEdgeByQuadId, oppositeHalfEdge.quadId, quadNode.id, oppositeHalfEdge);\n\t\t\t}\n\t\t}\n\t\t// add points\n\t\tfor (const index of quadIndices) {\n\t\t\tlet quadIds = this._quadIdsByPointIndex.get(index);\n\t\t\tif (!quadIds) {\n\t\t\t\tquadIds = new Set();\n\t\t\t\tthis._quadIdsByPointIndex.set(index, quadIds);\n\t\t\t}\n\t\t\tquadIds.add(quadId);\n\t\t}\n\n\t\treturn quadNode;\n\t}\n\tquadNode(quadId: number) {\n\t\treturn this._quadsById.get(quadId);\n\t}\n\tquadIdsByPointIndex(pointIndex: number) {\n\t\treturn this._quadIdsByPointIndex.get(pointIndex);\n\t}\n\tneighbourData(quadId: number, sideIndex: NeighbourIndex, target: NeighbourData): void {\n\t\tconst quadNode = this._quadsById.get(quadId);\n\t\tif (!quadNode) {\n\t\t\ttarget.quadNode = null;\n\t\t\ttarget.neighbourIndex = null;\n\t\t\treturn;\n\t\t}\n\t\tquadHalfEdgeIndices(quadNode.indices, sideIndex, _indices);\n\t\tconst halfEdge = getMapElementAtEntry(this._edgesByIndex, _indices.index0, _indices.index1)!;\n\t\tconst oppositeHalfEdge = this._halfEdgeByHalfEdge.get(halfEdge);\n\t\tif (!oppositeHalfEdge) {\n\t\t\ttarget.quadNode = null;\n\t\t\ttarget.neighbourIndex = null;\n\t\t\treturn;\n\t\t}\n\t\tconst oppositeQuadId = oppositeHalfEdge.quadId;\n\t\ttarget.quadNode = this._quadsById.get(oppositeQuadId);\n\t\ttarget.neighbourIndex = oppositeHalfEdge.sideIndex;\n\t}\n\t// private _hasNeighbourSharingEdge(quadId: number, sideIndex: NeighbourIndex): boolean {\n\t// \tconst quadNode = this._quadsById.get(quadId);\n\t// \tif (!quadNode) {\n\t// \t\treturn false;\n\t// \t}\n\t// \tquadHalfEdgeIndices(quadNode.indices, sideIndex, _indices);\n\t// \tconst halfEdge = getMapElementAtEntry(this._edgesByIndex, _indices.index0, _indices.index1)!;\n\t// \treturn this._halfEdgeByHalfEdge.has(halfEdge);\n\t// }\n\tneighbourIdsSharingEdge(quadId: number, target: number[]): void {\n\t\ttarget.length = 0;\n\n\t\tconst quadNode = this._quadsById.get(quadId);\n\t\tif (!quadNode) {\n\t\t\treturn;\n\t\t}\n\t\t_neighbourIdsSet.clear();\n\t\tfor (const i of NEIGHBOUR_INDICES) {\n\t\t\tquadHalfEdgeIndices(quadNode.indices, i, _indices);\n\t\t\tconst halfEdge = getMapElementAtEntry(this._edgesByIndex, _indices.index0, _indices.index1)!;\n\t\t\tconst oppositeHalfEdge = this._halfEdgeByHalfEdge.get(halfEdge);\n\t\t\tif (oppositeHalfEdge) {\n\t\t\t\tconst oppositeQuadId = oppositeHalfEdge.quadId;\n\t\t\t\t_neighbourIdsSet.add(oppositeQuadId);\n\t\t\t}\n\t\t}\n\t\tsetToArray(_neighbourIdsSet, target);\n\t}\n\tneighbourIdsSharingPoint(quadId: number, target: number[]): void {\n\t\ttarget.length = 0;\n\n\t\tconst quadNode = this._quadsById.get(quadId);\n\t\tif (!quadNode) {\n\t\t\treturn;\n\t\t}\n\n\t\t_neighbourIdsSet.clear();\n\t\tconst indices = quadNode.indices;\n\t\tfor (const index of indices) {\n\t\t\tconst neighbourIndices = this._quadIdsByPointIndex.get(index);\n\t\t\tif (neighbourIndices) {\n\t\t\t\tfor (const neighbourIndex of neighbourIndices) {\n\t\t\t\t\tif (neighbourIndex != quadId) {\n\t\t\t\t\t\t_neighbourIdsSet.add(neighbourIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsetToArray(_neighbourIdsSet, target);\n\t}\n\toverride neighbourIndex(quadId: number, neighbourIndex: number, withSharedEdge: boolean): number {\n\t\tif (withSharedEdge == true) {\n\t\t\tthis.neighbourIdsSharingEdge(quadId, _neighbourIdsArray);\n\t\t} else {\n\t\t\tthis.neighbourIdsSharingPoint(quadId, _neighbourIdsArray);\n\t\t}\n\t\tconst neighbourId = _neighbourIdsArray[neighbourIndex];\n\t\tif (neighbourId != null) {\n\t\t\treturn neighbourId;\n\t\t}\n\t\treturn -1;\n\t}\n\toverride neighboursCount(quadId: number, withSharedEdge: boolean): number {\n\t\tif (withSharedEdge == true) {\n\t\t\tthis.neighbourIdsSharingEdge(quadId, _neighbourIdsArray);\n\t\t} else {\n\t\t\tthis.neighbourIdsSharingPoint(quadId, _neighbourIdsArray);\n\t\t}\n\t\treturn _neighbourIdsArray.length;\n\t}\n}\n","import {Number4} from '../../../../../types/GlobalTypes';\n\nexport type QuadHalfEdgeSide = 's' | 'n' | 'w' | 'e';\n// export const QUAD_HALF_EDGE_SIDES: QuadHalfEdgeSide[] = ['s', 'n', 'w', 'e'];\nexport const CCW_HALF_EDGE_SIDES: QuadHalfEdgeSide[] = ['s', 'e', 'n', 'w'];\n\nexport interface HalfEdgeIndices {\n\tindex0: number;\n\tindex1: number;\n}\nexport type NeighbourIndex = 0 | 1 | 2 | 3;\nexport const NEIGHBOUR_INDICES: NeighbourIndex[] = [0, 1, 2, 3];\n\nexport function quadHalfEdgeIndices(quad: Number4, edgeIndex: number, target: HalfEdgeIndices): void {\n\ttarget.index0 = quad[edgeIndex];\n\ttarget.index1 = quad[edgeIndex == 3 ? 0 : edgeIndex + 1];\n}\n","import {Vector4} from 'three';\nimport {QuadObject} from '../QuadObject';\nimport {QuadPrimitive} from '../QuadPrimitive';\nimport {QuadGraph} from './QuadGraph';\nimport {Number4} from '../../../../../types/GlobalTypes';\nimport {arrayDifference} from '../../../../ArrayUtils';\nimport {HalfEdgeIndices} from './QuadGraphCommon';\n\nconst _v4 = new Vector4();\nconst _v40 = new Vector4();\nconst _v41 = new Vector4();\nconst _quad0IndicesSet = new Set<number>();\n\nexport function quadGraphFromQuadObject(object: QuadObject) {\n\tconst quadGraph = new QuadGraph();\n\tconst indices = object.geometry.index;\n\tconst primitivesCount = QuadPrimitive.entitiesCount(object);\n\tfor (let i = 0; i < primitivesCount; i++) {\n\t\t_v4.fromArray(indices, i * 4);\n\t\tquadGraph.addQuad(i, _v4.toArray() as Number4);\n\t}\n\treturn quadGraph;\n}\n\nconst _neighbourIdsSharingEdge: number[] = [];\nconst _neighbourIdsSharingPoint: number[] = [];\nexport function quadGraphDirectDiagonalTiles(graph: QuadGraph, quadId: number, target: number[]) {\n\tgraph.neighbourIdsSharingPoint(quadId, _neighbourIdsSharingPoint);\n\tgraph.neighbourIdsSharingEdge(quadId, _neighbourIdsSharingEdge);\n\tarrayDifference(_neighbourIdsSharingPoint, _neighbourIdsSharingEdge, target);\n}\n\ninterface HalfEdgeIndicesInCommonBetweenQuadsOptions {\n\tquadObject: QuadObject;\n\tquadId0: number;\n\tquadId1: number;\n\ttarget: HalfEdgeIndices;\n}\nexport function halfEdgeIndicesInCommonBetweenQuads(options: HalfEdgeIndicesInCommonBetweenQuadsOptions) {\n\tconst {quadObject, quadId0, quadId1, target} = options;\n\tconst srcIndices = quadObject.geometry.index;\n\n\t_v40.fromArray(srcIndices, quadId0 * 4);\n\t_v41.fromArray(srcIndices, quadId1 * 4);\n\t_quad0IndicesSet.clear();\n\n\t_quad0IndicesSet.add(_v40.x);\n\t_quad0IndicesSet.add(_v40.y);\n\t_quad0IndicesSet.add(_v40.z);\n\t_quad0IndicesSet.add(_v40.w);\n\n\tlet firstPointAdded = false;\n\tif (_quad0IndicesSet.has(_v41.x)) {\n\t\ttarget.index0 = _v41.x;\n\t\tfirstPointAdded = true;\n\t}\n\tif (_quad0IndicesSet.has(_v41.y)) {\n\t\tif (firstPointAdded) {\n\t\t\ttarget.index1 = _v41.y;\n\t\t\treturn;\n\t\t}\n\t\ttarget.index0 = _v41.y;\n\t\tfirstPointAdded = true;\n\t}\n\tif (_quad0IndicesSet.has(_v41.z)) {\n\t\tif (firstPointAdded) {\n\t\t\ttarget.index1 = _v41.z;\n\t\t\treturn;\n\t\t}\n\t\ttarget.index0 = _v41.z;\n\t\tfirstPointAdded = true;\n\t}\n\tif (_quad0IndicesSet.has(_v41.w)) {\n\t\tif (firstPointAdded) {\n\t\t\ttarget.index1 = _v41.w;\n\t\t\treturn;\n\t\t}\n\t\ttarget.index0 = _v41.w;\n\t\tfirstPointAdded = true;\n\t}\n}\nexport function pointInCommonBetweenQuadsSharingPoint(graph: QuadGraph, quadId0: number, quadId1: number) {\n\tconst quadNode0 = graph.quadNode(quadId0);\n\tconst quadNode1 = graph.quadNode(quadId1);\n\tif (quadNode0 == null || quadNode1 == null) {\n\t\treturn;\n\t}\n\n\tconst indices0 = quadNode0.indices;\n\tconst indices1 = quadNode1.indices;\n\tfor (const index0 of indices0) {\n\t\tfor (const index1 of indices1) {\n\t\t\tif (index0 == index1) {\n\t\t\t\treturn index0;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Line3, Vector3} from 'three';\n\nexport interface ClosestPoints {\n\tpointOnLine1: Vector3;\n\tpointOnLine2: Vector3;\n}\n\nconst _u = new Vector3();\nconst _v = new Vector3();\nconst _w = new Vector3();\nconst EPS = 1e-4;\n\nexport function closestPointsBetweenLines(line1: Line3, line2: Line3, target: ClosestPoints) {\n\t_u.copy(line1.end).sub(line1.start);\n\t_v.copy(line2.end).sub(line2.start);\n\t_w.copy(line1.start).sub(line2.start);\n\n\tconst a = _u.dot(_u);\n\tconst b = _u.dot(_v);\n\tconst c = _v.dot(_v);\n\tconst d = _u.dot(_w);\n\tconst e = _v.dot(_w);\n\tconst D = a * c - b * b;\n\n\tlet sc: number;\n\tlet tc: number;\n\tif (D < EPS) {\n\t\t// The lines are almost parallel\n\t\tsc = 0;\n\t\ttc = b > c ? d / b : e / c; // Use the largest denominator\n\t} else {\n\t\tsc = (b * e - c * d) / D;\n\t\ttc = (a * e - b * d) / D;\n\t}\n\n\ttarget.pointOnLine1.addVectors(line1.start, _u.multiplyScalar(sc));\n\ttarget.pointOnLine2.addVectors(line2.start, _v.multiplyScalar(tc));\n}\n","import {Vector3, Vector4, Line3, BufferAttribute} from 'three';\n\nimport {QuadObject} from '../QuadObject';\nimport {Attribute} from '../../../Attribute';\nimport {closestPointsBetweenLines, ClosestPoints} from '../../../../LineUtils';\n\nconst _v4 = new Vector4();\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\nconst _p2 = new Vector3();\nconst _p3 = new Vector3();\nconst _center = new Vector3();\nconst _line01 = new Line3();\nconst _line12 = new Line3();\nconst _line23 = new Line3();\nconst _line30 = new Line3();\nconst _line0p = new Vector3();\nconst _line1p = new Vector3();\nconst _line2p = new Vector3();\nconst _line3p = new Vector3();\nconst _delta0 = new Vector3();\nconst _delta1 = new Vector3();\nconst _delta2 = new Vector3();\nconst _delta3 = new Vector3();\nconst _closestPoints: ClosestPoints = {\n\tpointOnLine1: new Vector3(),\n\tpointOnLine2: new Vector3(),\n};\n\nexport function quadInnerRadius(quadObject: QuadObject, i: number) {\n\tconst quadGeometry = quadObject.geometry;\n\tconst indices = quadGeometry.index;\n\tconst srcPositions = quadGeometry.attributes.position.array;\n\n\t_v4.fromArray(indices, i * 4);\n\t_p0.fromArray(srcPositions, _v4.x * 3);\n\t_p1.fromArray(srcPositions, _v4.y * 3);\n\t_p2.fromArray(srcPositions, _v4.z * 3);\n\t_p3.fromArray(srcPositions, _v4.w * 3);\n\t_center.copy(_p0).add(_p1).add(_p2).add(_p3).multiplyScalar(0.25);\n\n\t_line01.start.copy(_p0);\n\t_line01.end.copy(_p1);\n\t_line12.start.copy(_p1);\n\t_line12.end.copy(_p2);\n\t_line23.start.copy(_p2);\n\t_line23.end.copy(_p3);\n\t_line30.start.copy(_p3);\n\t_line30.end.copy(_p0);\n\n\t_line01.closestPointToPoint(_center, false, _line0p);\n\t_line12.closestPointToPoint(_center, false, _line1p);\n\t_line23.closestPointToPoint(_center, false, _line2p);\n\t_line30.closestPointToPoint(_center, false, _line3p);\n\n\tconst dist0 = _line0p.distanceTo(_center);\n\tconst dist1 = _line1p.distanceTo(_center);\n\tconst dist2 = _line2p.distanceTo(_center);\n\tconst dist3 = _line3p.distanceTo(_center);\n\n\tlet innerRadius = dist0;\n\tif (innerRadius > dist1) {\n\t\tinnerRadius = dist1;\n\t}\n\tif (innerRadius > dist2) {\n\t\tinnerRadius = dist2;\n\t}\n\tif (innerRadius > dist3) {\n\t\tinnerRadius = dist3;\n\t}\n\treturn innerRadius;\n}\n\nexport function quadOuterRadius(quadObject: QuadObject, i: number) {\n\tconst quadGeometry = quadObject.geometry;\n\tconst indices = quadGeometry.index;\n\tconst srcPositions = quadGeometry.attributes.position.array;\n\n\t_v4.fromArray(indices, i * 4);\n\t_p0.fromArray(srcPositions, _v4.x * 3);\n\t_p1.fromArray(srcPositions, _v4.y * 3);\n\t_p2.fromArray(srcPositions, _v4.z * 3);\n\t_p3.fromArray(srcPositions, _v4.w * 3);\n\t_center.copy(_p0).add(_p1).add(_p2).add(_p3).multiplyScalar(0.25);\n\n\tconst dist0 = _p0.distanceTo(_center);\n\tconst dist1 = _p1.distanceTo(_center);\n\tconst dist2 = _p2.distanceTo(_center);\n\tconst dist3 = _p3.distanceTo(_center);\n\n\tlet outerRadius = 0;\n\tif (outerRadius < dist0) {\n\t\touterRadius = dist0;\n\t}\n\tif (outerRadius < dist1) {\n\t\touterRadius = dist1;\n\t}\n\tif (outerRadius < dist2) {\n\t\touterRadius = dist2;\n\t}\n\tif (outerRadius < dist3) {\n\t\touterRadius = dist3;\n\t}\n\n\treturn outerRadius;\n}\n\nexport interface QuadPrimitivePointPositions {\n\tp0: Vector3;\n\tp1: Vector3;\n\tp2: Vector3;\n\tp3: Vector3;\n}\nexport interface QuadPrimitivePointIndices {\n\ti0: number;\n\ti1: number;\n\ti2: number;\n\ti3: number;\n}\nconst _indexIndices: QuadPrimitivePointIndices = {\n\ti0: 0,\n\ti1: 0,\n\ti2: 0,\n\ti3: 0,\n};\nconst _indices: QuadPrimitivePointIndices = {\n\ti0: 0,\n\ti1: 0,\n\ti2: 0,\n\ti3: 0,\n};\nconst stride = 4;\n\nexport function quadPrimitivePointIndexIndices(primitiveIndex: number, target: QuadPrimitivePointIndices) {\n\ttarget.i0 = primitiveIndex * stride + 0;\n\ttarget.i1 = primitiveIndex * stride + 1;\n\ttarget.i2 = primitiveIndex * stride + 2;\n\ttarget.i3 = primitiveIndex * stride + 3;\n}\nexport function quadPrimitivePointIndices(\n\tquadObject: QuadObject,\n\tprimitiveIndex: number,\n\ttarget: QuadPrimitivePointIndices\n) {\n\tquadPrimitivePointIndexIndices(primitiveIndex, _indexIndices);\n\tconst quadGeometry = quadObject.geometry;\n\tconst index = quadGeometry.index;\n\ttarget.i0 = index[_indexIndices.i0];\n\ttarget.i1 = index[_indexIndices.i1];\n\ttarget.i2 = index[_indexIndices.i2];\n\ttarget.i3 = index[_indexIndices.i3];\n}\n\nexport function quadPrimitivePointPositions(\n\tquadObject: QuadObject,\n\tprimitiveIndex: number,\n\ttarget: QuadPrimitivePointPositions\n) {\n\tconst quadGeometry = quadObject.geometry;\n\tconst positionAttribute = quadGeometry.attributes[Attribute.POSITION] as BufferAttribute | undefined;\n\tif (!positionAttribute) {\n\t\treturn target;\n\t}\n\n\tquadPrimitivePointIndices(quadObject, primitiveIndex, _indices);\n\tconst positionArray = positionAttribute.array;\n\n\ttarget.p0.fromArray(positionArray, _indices.i0 * 3);\n\ttarget.p1.fromArray(positionArray, _indices.i1 * 3);\n\ttarget.p2.fromArray(positionArray, _indices.i2 * 3);\n\ttarget.p3.fromArray(positionArray, _indices.i3 * 3);\n}\n\nfunction _prepareLine(line: Line3, start: Vector3, end: Vector3) {\n\tline.start.copy(start);\n\tline.end.copy(end);\n}\nexport function quadPointInset(\n\tpoints: QuadPrimitivePointPositions,\n\tunclampedInset: number,\n\ttarget: QuadPrimitivePointPositions\n) {\n\t_prepareLine(_line01, points.p0, points.p1);\n\t_prepareLine(_line12, points.p1, points.p2);\n\t_prepareLine(_line23, points.p2, points.p3);\n\t_prepareLine(_line30, points.p3, points.p0);\n\n\t_center.copy(points.p0).add(points.p1).add(points.p2).add(points.p3).multiplyScalar(0.25);\n\n\t_line01.closestPointToPoint(_center, false, _line0p);\n\t_line12.closestPointToPoint(_center, false, _line1p);\n\t_line23.closestPointToPoint(_center, false, _line2p);\n\t_line30.closestPointToPoint(_center, false, _line3p);\n\n\t_delta0.copy(_center).sub(_line0p);\n\t_delta1.copy(_center).sub(_line1p);\n\t_delta2.copy(_center).sub(_line2p);\n\t_delta3.copy(_center).sub(_line3p);\n\n\tconst maxInset = Math.min(_delta0.length(), _delta1.length(), _delta2.length(), _delta3.length());\n\tconst inset = Math.min(unclampedInset, maxInset);\n\n\tconst _offsetLine = (line: Line3, delta: Vector3) => {\n\t\tdelta.normalize().multiplyScalar(inset);\n\t\tline.start.add(delta);\n\t\tline.end.add(delta);\n\t};\n\t_offsetLine(_line01, _delta0);\n\t_offsetLine(_line12, _delta1);\n\t_offsetLine(_line23, _delta2);\n\t_offsetLine(_line30, _delta3);\n\n\tconst _getIntersect = (line0: Line3, line1: Line3, target: Vector3) => {\n\t\tclosestPointsBetweenLines(line0, line1, _closestPoints);\n\t\ttarget.copy(_closestPoints.pointOnLine1).add(_closestPoints.pointOnLine2).multiplyScalar(0.5);\n\t};\n\t_getIntersect(_line01, _line30, target.p0);\n\t_getIntersect(_line12, _line01, target.p1);\n\t_getIntersect(_line23, _line12, target.p2);\n\t_getIntersect(_line30, _line23, target.p3);\n}\n","import {ParamConfig} from '../../../../../engine/nodes/utils/params/ParamsConfig';\nimport {BaseNodeType} from '../../../../../engine/nodes/_Base';\nimport {Constructor} from '../../../../../types/GlobalTypes';\n\nexport function SOPQUADTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param triangles */\n\t\ttriangles = ParamConfig.BOOLEAN(true);\n\t\t/** @param wireframe */\n\t\twireframe = ParamConfig.BOOLEAN(true, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param unsharedEdges */\n\t\tunsharedEdges = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {wireframe: true},\n\t\t});\n\t\t/** @param wireframe color */\n\t\twireframeColor = ParamConfig.COLOR([0, 0, 0], {\n\t\t\tvisibleIf: {wireframe: true},\n\t\t});\n\t\t/** @param connections */\n\t\tconnections = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param connectionsBetweenQuadsSharingEdge */\n\t\tconnectionsBetweenQuadsSharingEdge = ParamConfig.BOOLEAN(true, {\n\t\t\tvisibleIf: {connections: true},\n\t\t});\n\t\t/** @param connectionsBetweenQuadsSharingPointOnly */\n\t\tconnectionsBetweenQuadsSharingPointOnly = ParamConfig.BOOLEAN(true, {\n\t\t\tvisibleIf: {connections: true},\n\t\t});\n\t\t/** @param connections color */\n\t\tconnectionsColor = ParamConfig.COLOR([0, 0, 0], {\n\t\t\tvisibleIf: {connections: true},\n\t\t});\n\t\t/** @param center */\n\t\tcenter = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param innerRadius */\n\t\tinnerRadius = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {center: true},\n\t\t});\n\t\t/** @param outerRadius */\n\t\touterRadius = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {center: true},\n\t\t});\n\t\t/** @param edgeCenterVectors */\n\t\tedgeCenterVectors = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {center: true},\n\t\t});\n\t\t/** @param edgeNearestPointVectors */\n\t\tedgeNearestPointVectors = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {center: true},\n\t\t});\n\t\t/** @param split quads */\n\t\tsplitQuads = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorBefore: true,\n\t\t\tvisibleIf: [{triangles: true}, {wireframe: true}],\n\t\t});\n\t\t/** @param pointAttributes */\n\t\tpointAttributes = ParamConfig.STRING('*', {\n\t\t\tvisibleIf: [{triangles: true}],\n\t\t});\n\t\t/** @param primitiveAttributes */\n\t\tprimitiveAttributes = ParamConfig.STRING('*');\n\t};\n}\n\nexport function OBJQUADTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param wireframe */\n\t\tQUADTriangles = ParamConfig.BOOLEAN(true);\n\t\t/** @param wireframe */\n\t\tQUADWireframe = ParamConfig.BOOLEAN(true, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param unsharedEdges */\n\t\tQUADUnsharedEdges = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {wireframe: true},\n\t\t});\n\t\t/** @param wireframe color */\n\t\tQUADWireframeColor = ParamConfig.COLOR([0, 0, 0], {\n\t\t\tvisibleIf: {QUADWireframe: true},\n\t\t});\n\t\t/** @param connections */\n\t\tQUADConnections = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param connectionsBetweenQuadsSharingEdge */\n\t\tQUADConnectionsBetweenQuadsSharingEdge = ParamConfig.BOOLEAN(true, {\n\t\t\tvisibleIf: {QuadConnections: true},\n\t\t});\n\t\t/** @param connectionsBetweenQuadsSharingPointOnly */\n\t\tQUADConnectionsBetweenQuadsSharingPointOnly = ParamConfig.BOOLEAN(true, {\n\t\t\tvisibleIf: {QuadConnections: true},\n\t\t});\n\t\t/** @param connections color */\n\t\tQUADConnectionsColor = ParamConfig.COLOR([0, 0, 0], {\n\t\t\tvisibleIf: {QuadConnections: true},\n\t\t});\n\t\t/** @param center */\n\t\tQUADCenter = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param QUADInnerRadius */\n\t\tQUADInnerRadius = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {QUADCenter: true},\n\t\t});\n\t\t/** @param QUADOuterRadius */\n\t\tQUADOuterRadius = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {QUADCenter: true},\n\t\t});\n\t\t/** @param QUADEdgeCenterVectors */\n\t\tQUADEdgeCenterVectors = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {QUADCenter: true},\n\t\t});\n\t\t/** @param QUADEdgeNearestPointVectors */\n\t\tQUADEdgeNearestPointVectors = ParamConfig.BOOLEAN(false, {\n\t\t\tvisibleIf: {QUADCenter: true},\n\t\t});\n\t\t/** @param split quads */\n\t\tQUADSplitQuads = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorBefore: true,\n\t\t\tvisibleIf: [{QUADTriangles: true}, {QUADWireframe: true}],\n\t\t});\n\t\t/** @param pointAttributes */\n\t\tQUADPointAttributes = ParamConfig.STRING('*', {\n\t\t\tvisibleIf: [{QUADTriangles: true}],\n\t\t});\n\t\t/** @param primitiveAttributes */\n\t\tQUADPrimitiveAttributes = ParamConfig.STRING('*');\n\t};\n}\n\nexport const TESSELATION_PARAM_NAMES = new Set<string>(['QUADTriangles', 'QUADWireframe']);\n\nexport function addQUADTesselationParamsCallback(node: BaseNodeType, callback: () => void) {\n\tnode.params.onParamsCreated('QUADtesselationParamsHooks', () => {\n\t\tconst params = node.params.all;\n\t\tfor (const param of params) {\n\t\t\tif (TESSELATION_PARAM_NAMES.has(param.name())) {\n\t\t\t\tparam.options.setOption('callback', callback);\n\t\t\t}\n\t\t}\n\t});\n}\n","// import type {ManifoldStatic, Manifold, Mesh} from 'manifold-3d';\n// import Module from 'manifold-3d';\nimport type {ManifoldToplevel, Manifold, Mesh, Mat4, Smoothness, Box} from './manifold/manifold';\nimport Module from './manifold/manifold';\nexport type {ManifoldToplevel, Manifold, Mesh, Mat4, Smoothness, Box};\nexport {Module};\nimport {Color} from 'three';\n\nexport type SDFGeometry = Manifold;\n\nexport enum SDFObjectType {\n\tDEFAULT = 'SDFManifold',\n}\n\nconst SDF_OBJECT_TYPES: SDFObjectType[] = [SDFObjectType.DEFAULT];\nexport const SDF_OBJECT_TYPES_SET: Set<SDFObjectType> = new Set(SDF_OBJECT_TYPES);\n\nexport interface SDFTesselationParams {\n\tfacetAngle: number;\n\tmeshesColor: Color;\n\twireframe: boolean;\n}\nexport interface SDFOBJTesselationParams {\n\tSDFFacetAngle: number;\n\tSDFMeshesColor: Color;\n\tSDFWireframe: boolean;\n}\n","import type {ManifoldToplevel} from './SDFCommon';\n\nlet _manifold: ManifoldToplevel | undefined;\nexport class SDFLoaderSync {\n\tstatic __setManifold(manifold: ManifoldToplevel) {\n\t\t_manifold = manifold;\n\t}\n\tstatic manifold() {\n\t\treturn _manifold!;\n\t}\n}\n","import {FrontSide, MeshStandardMaterial, Color} from 'three';\n\nexport const step = 0.000001;\n\nconst MESH_MAT = new MeshStandardMaterial({\n\tcolor: 0xffffff,\n\t// vertexColors: true,\n\tside: FrontSide,\n\tmetalness: 0.0,\n\troughness: 0.9,\n});\n\nexport function sdfMaterialMesh(color: Color, wireframe: boolean) {\n\tconst mat = MESH_MAT.clone();\n\tmat.wireframe = wireframe;\n\tmat.color = color;\n\treturn mat;\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param  {Array<BufferGeometry>} geometries\n * @param  {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '.  .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {BufferAttribute, BufferGeometry, MathUtils} from 'three';\nimport {BaseSopOperation} from '../../../../../engine/operations/sop/_Base';\nimport {ObjectType} from '../../../Constant';\nimport {SDFGeometry, SDFTesselationParams} from '../SDFCommon';\nimport {sdfMaterialMesh} from '../SDFConstant';\nimport {toCreasedNormals} from '../../../../../modules/three/examples/jsm/utils/BufferGeometryUtils';\n\nexport function SDFGeometryToObject3D(sdfGeometry: SDFGeometry, options: SDFTesselationParams) {\n\tconst geometry = SDFGeometryToBufferGeometry(sdfGeometry, options);\n\n\treturn BaseSopOperation.createObject(\n\t\tgeometry,\n\t\tObjectType.MESH,\n\t\tsdfMaterialMesh(options.meshesColor, options.wireframe)\n\t);\n}\n\nexport function SDFGeometryToBufferGeometry(sdfGeometry: SDFGeometry, options: SDFTesselationParams) {\n\tconst sdfMesh = sdfGeometry.getMesh();\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute('position', new BufferAttribute(sdfMesh.vertProperties, 3));\n\tgeometry.setIndex(new BufferAttribute(sdfMesh.triVerts, 1));\n\n\treturn toCreasedNormals(geometry, MathUtils.degToRad(options.facetAngle));\n}\n","import {Material, Matrix4, Box3, Sphere, Object3D, Vector3, Quaternion, Euler} from 'three';\nimport {SDFGeometry, SDFObjectType, SDFTesselationParams} from './SDFCommon';\nimport {ObjectContent, CoreObjectType, ObjectGeometryMap, objectContentCopyProperties} from '../../ObjectContent';\nimport {SDFGeometryToObject3D} from './toObject3D/SDFToObject3D';\nimport {isArray} from '../../../Type';\nimport {Number3} from '../../../../types/GlobalTypes';\nimport {SDFLoaderSync} from './SDFLoaderSync';\n\nconst _box = new Box3();\nconst _size = new Vector3();\nconst _t = new Vector3();\nconst _q = new Quaternion();\nconst _s = new Vector3();\nconst _euler = new Euler();\nconst _tN3: Number3 = [0, 0, 0];\nconst _rN3: Number3 = [0, 0, 0];\nconst _sN3: Number3 = [1, 1, 1];\n\n// function cloneFloat32Array(src: Float32Array) {\n// \tconst clone = new Float32Array(src.length);\n// \tlet i = 0;\n// \tfor (let elem of src) {\n// \t\tclone[i] = elem;\n// \t\ti++;\n// \t}\n// \tconsole.log(src, clone);\n// \treturn clone;\n// }\n// function cloneUint32Array(src: Uint32Array) {\n// \tconst clone = new Uint32Array(src.length);\n// \tlet i = 0;\n// \tfor (let elem of src) {\n// \t\tclone[i] = elem;\n// \t\ti++;\n// \t}\n// \tconsole.log(src, clone);\n// \treturn clone;\n// }\n// function cloneSDFMesh(mesh:Mesh){\n// \tconst manifold = SDFLoaderSync.manifold();\n// \t\t\tconst clonedMesh = new manifold.Mesh({\n// \t\t\tnumProp: mesh.numProp,\n// \t\t\tvertProperties: cloneFloat32Array(mesh.vertProperties),\n// \t\t\ttriVerts: cloneUint32Array(mesh.triVerts),\n// \t\t\tmergeFromVert: mesh.mergeFromVert ? cloneUint32Array(mesh.mergeFromVert) : undefined,\n// \t\t\tmergeToVert: mesh.mergeToVert ? cloneUint32Array(mesh.mergeToVert) : undefined,\n// \t\t\trunIndex: mesh.runIndex ? cloneUint32Array(mesh.runIndex) : undefined,\n// \t\t\trunOriginalID: mesh.runOriginalID ? cloneUint32Array(mesh.runOriginalID) : undefined,\n// \t\t\trunTransform: mesh.runTransform ? cloneFloat32Array(mesh.runTransform) : undefined,\n// \t\t\tfaceID: mesh.faceID ? cloneUint32Array(mesh.faceID) : undefined,\n// \t\t\thalfedgeTangent: mesh.halfedgeTangent ? cloneFloat32Array(mesh.halfedgeTangent) : undefined,\n// \t\t});\n// \t\treturn clonedMesh\n// }\n\nexport class SDFObject implements ObjectContent<CoreObjectType.SDF> {\n\tpublic visible = true;\n\tget geometry() {\n\t\treturn this._geometry as ObjectGeometryMap[CoreObjectType.SDF];\n\t}\n\tget type() {\n\t\treturn this._type;\n\t}\n\tuserData = {};\n\tname = '';\n\tcastShadow = true;\n\treceiveShadow = true;\n\trenderOrder = 0;\n\tfrustumCulled = true;\n\tmatrixAutoUpdate = false;\n\tmaterial: Material | undefined;\n\tchildren: ObjectContent<CoreObjectType.SDF>[] = [];\n\tparent: ObjectContent<CoreObjectType.SDF> | null = null;\n\tprivate _type: SDFObjectType;\n\tconstructor(private _geometry: SDFGeometry) {\n\t\tthis._type = SDFObjectType.DEFAULT;\n\t}\n\n\tSDFGeometry() {\n\t\treturn this.geometry! as SDFGeometry;\n\t}\n\tdispose() {}\n\tapplyMatrix4(matrix: Matrix4) {\n\t\t// matrix is decomposed so that we can use .translate.rotate.scale,\n\t\t// as .transform isn't yet available\n\t\tmatrix.decompose(_t, _q, _s);\n\t\t_euler.setFromQuaternion(_q);\n\t\t_t.toArray(_tN3);\n\t\t_s.toArray(_sN3);\n\n\t\t// euler.toArray makes the array becomes Number4\n\t\t_rN3[0] = _euler.x;\n\t\t_rN3[1] = _euler.y;\n\t\t_rN3[2] = _euler.z;\n\t\tconst geometry = this.geometry.translate(_tN3).rotate(_rN3).scale(_sN3);\n\t\tthis._geometry = geometry;\n\t}\n\tadd(...object: ObjectContent<CoreObjectType>[]) {}\n\tremove(...object: ObjectContent<CoreObjectType>[]) {}\n\tdispatchEvent(event: {type: string}) {}\n\ttraverse(callback: (object: SDFObject) => any) {\n\t\tcallback(this);\n\t}\n\n\tclone(): SDFObject {\n\t\tconst manifold = SDFLoaderSync.manifold();\n\t\tconst mesh = this.geometry.getMesh();\n\n\t\tconst clonedGeometry = new manifold.Manifold(mesh);\n\n\t\t// const clonedGeometry = this.geometry.asOriginal();\n\t\tconst clone = new SDFObject(clonedGeometry);\n\t\tobjectContentCopyProperties(this, clone);\n\t\treturn clone;\n\t}\n\ttoObject3D(tesselationParams: SDFTesselationParams): Object3D | Object3D[] | undefined {\n\t\tconst object = SDFGeometryToObject3D(this.geometry, tesselationParams);\n\t\tif (object) {\n\t\t\tif (isArray(object)) {\n\t\t\t\tfor (const element of object) {\n\t\t\t\t\tobjectContentCopyProperties(this, element);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tobjectContentCopyProperties(this, object);\n\t\t\t}\n\t\t}\n\t\treturn object;\n\t}\n\n\tboundingBox(target: Box3): void {\n\t\tconst bbox = this.geometry.boundingBox();\n\t\ttarget.min.fromArray(bbox.min);\n\t\ttarget.max.fromArray(bbox.max);\n\t}\n\tboundingSphere(target: Sphere): void {\n\t\tthis.boundingBox(_box);\n\t\t_box.getCenter(target.center);\n\t\t_box.getSize(_size);\n\t\tconst diameter = Math.max(_size.x, _size.y, _size.z);\n\t\ttarget.radius = diameter * 0.5;\n\t}\n}\n","import {CoreObjectType, ObjectContent} from '../../ObjectContent';\n\nexport function isTetObject(o: ObjectContent<CoreObjectType>) {\n\treturn o.type == CoreObjectType.TET;\n}\n","import {ParamConfig} from '../../../../../engine/nodes/utils/params/ParamsConfig';\nimport {BaseNodeType} from '../../../../../engine/nodes/_Base';\nimport {Constructor} from '../../../../../types/GlobalTypes';\n\nexport const DEFAULT = {\n\tscale: 1,\n\tdisplayOuterMesh: false,\n\tdisplayTetMesh: true,\n\tdisplayLines: false,\n\tdisplaySharedFaces: false,\n\tdisplayPoints: false,\n\tdisplayCenter: false,\n\tdisplaySphere: false,\n};\nexport function SOPTetTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param tet scale */\n\t\tscale = ParamConfig.FLOAT(DEFAULT.scale, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t\t/** @param display outer mesh */\n\t\tdisplayOuterMesh = ParamConfig.BOOLEAN(DEFAULT.displayOuterMesh);\n\t\t/** @param display tet mesh */\n\t\tdisplayTetMesh = ParamConfig.BOOLEAN(DEFAULT.displayTetMesh);\n\t\t/** @param display lines */\n\t\tdisplayLines = ParamConfig.BOOLEAN(DEFAULT.displayLines);\n\t\t/** @param display shared faces */\n\t\tdisplaySharedFaces = ParamConfig.BOOLEAN(DEFAULT.displaySharedFaces);\n\t\t/** @param display points */\n\t\tdisplayPoints = ParamConfig.BOOLEAN(DEFAULT.displayCenter);\n\t\t/** @param display center */\n\t\tdisplayCenter = ParamConfig.BOOLEAN(DEFAULT.displayCenter);\n\t\t/** @param display sphere */\n\t\tdisplaySphere = ParamConfig.BOOLEAN(DEFAULT.displaySphere);\n\t};\n}\n\nexport function OBJTetTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param tet scale */\n\t\tTetScale = ParamConfig.FLOAT(DEFAULT.scale, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t\t/** @param display outer mesh */\n\t\tTetDisplayOuterMesh = ParamConfig.BOOLEAN(DEFAULT.displayOuterMesh);\n\t\t/** @param display tet mesh */\n\t\tTetDisplayTetMesh = ParamConfig.BOOLEAN(DEFAULT.displayTetMesh);\n\t\t/** @param display lines */\n\t\tTetDisplayLines = ParamConfig.BOOLEAN(DEFAULT.displayLines);\n\t\t/** @param display lines */\n\t\tTetDisplaySharedFaces = ParamConfig.BOOLEAN(DEFAULT.displaySharedFaces);\n\t\t/** @param display points */\n\t\tTetDisplayPoints = ParamConfig.BOOLEAN(DEFAULT.displayPoints);\n\t\t/** @param display center */\n\t\tTetDisplayCenter = ParamConfig.BOOLEAN(DEFAULT.displayCenter);\n\t\t/** @param display sphere */\n\t\tTetDisplaySphere = ParamConfig.BOOLEAN(DEFAULT.displaySphere);\n\t};\n}\n\nexport const TESSELATION_PARAM_NAMES = new Set<string>([\n\t'TetScale',\n\t'TetDisplayMesh',\n\t'TetDisplayLines',\n\t'TetDisplaySharedFaces',\n\t'TetDisplayPoints',\n\t'TetDisplayCenter',\n\t'TetDisplaySphere',\n]);\n\nexport function addTetTesselationParamsCallback(node: BaseNodeType, callback: () => void) {\n\tnode.params.onParamsCreated('TettesselationParamsHooks', () => {\n\t\tconst params = node.params.all;\n\t\tfor (const param of params) {\n\t\t\tif (TESSELATION_PARAM_NAMES.has(param.name())) {\n\t\t\t\tparam.options.setOption('callback', callback);\n\t\t\t}\n\t\t}\n\t});\n}\n","import {BufferGeometry} from 'three';\nimport {markedAsInstance} from '../../GeometryUtils';\nimport {InstanceAttrib} from '../../Instancer';\nimport {Attribute} from '../../Attribute';\nimport {ThreejsPoint} from './ThreejsPoint';\nimport {Object3DWithGeometry} from '../../Group';\n\nexport function positionAttributeNameFromBufferGeometry(geometry: BufferGeometry) {\n\treturn markedAsInstance(geometry) ? InstanceAttrib.POSITION : Attribute.POSITION;\n}\nexport function pointsCountFromBufferGeometry(geometry: BufferGeometry): number {\n\tconst attribName = positionAttributeNameFromBufferGeometry(geometry);\n\tif (!attribName) {\n\t\treturn 0;\n\t}\n\tconst positionAttribute = geometry.getAttribute(attribName);\n\tif (!positionAttribute) {\n\t\treturn 0;\n\t}\n\treturn positionAttribute.count;\n}\n\n// using dummy object is dangerous, because when used multiple times,\n// the objects receives multiple geometries,\n// and on further calls, the first points then look up the incorrect geometry\n// export function pointsFromBufferGeometry(geometry: BufferGeometry, object): ThreejsPoint[] {\n// \tdummyMesh.geometry = geometry;\n// \tconst pointsCount = pointsCountFromBufferGeometry(geometry);\n// \tconst points: ThreejsPoint[] = new Array(pointsCount);\n// \tfor (let i = 0; i < pointsCount; i++) {\n// \t\tpoints[i] = new ThreejsPoint(dummyMesh, i);\n// \t}\n// \treturn points;\n// }\nexport function pointsFromThreejsObject(object: Object3DWithGeometry): ThreejsPoint[] {\n\tconst pointsCount = pointsCountFromBufferGeometry(object.geometry);\n\tconst points: ThreejsPoint[] = new Array(pointsCount);\n\tfor (let i = 0; i < pointsCount; i++) {\n\t\tpoints[i] = new ThreejsPoint(object, i);\n\t}\n\treturn points;\n}\n","import {BufferAttribute, LineSegments, Vector3, Mesh} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {ThreejsPrimitive} from './ThreejsPrimitive';\nimport {Attribute} from '../../Attribute';\n\nconst _p0 = new Vector3();\nconst _p1 = new Vector3();\nexport class ThreejsPrimitiveLineSegment extends ThreejsPrimitive {\n\tconstructor(object: LineSegments, index: number) {\n\t\tsuper(object, index);\n\t\tthis._geometry = object.geometry;\n\t}\n\tstatic primitiveName() {\n\t\treturn 'line';\n\t}\n\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as LineSegments).geometry;\n\t\tif (!geometry) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst index = geometry.getIndex();\n\t\tif (!index) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn index.count / 2;\n\t}\n\n\tstatic override position<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(object && object.geometry)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tconst positionAttribute = (object as any as Mesh).geometry.getAttribute(Attribute.POSITION) as BufferAttribute;\n\t\tif (!positionAttribute) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionArray = positionAttribute.array;\n\t\t_p0.fromArray(positionArray, primitiveIndex * 3 + 0);\n\t\t_p1.fromArray(positionArray, primitiveIndex * 3 + 1);\n\t\ttarget.copy(_p0).add(_p1).divideScalar(2);\n\t\treturn target;\n\t}\n\tstatic override normal<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(object && object.geometry)) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionAttribute = (object as any as Mesh).geometry.getAttribute(Attribute.POSITION) as BufferAttribute;\n\t\tif (!positionAttribute) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionArray = positionAttribute.array;\n\t\t_p0.fromArray(positionArray, primitiveIndex * 3 + 0);\n\t\t_p1.fromArray(positionArray, primitiveIndex * 3 + 1);\n\t\ttarget.copy(_p1).sub(_p1).normalize();\n\t\treturn target;\n\t}\n\tposition(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof ThreejsPrimitiveLineSegment).position(this._object, this._index, target);\n\t}\n\tnormal(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof ThreejsPrimitiveLineSegment).normal(this._object, this._index, target);\n\t}\n\tstatic override computeVertexNormalsIfAttributeVersionChanged<T extends CoreObjectType>(object: ObjectContent<T>) {}\n\tprotected static override stride() {\n\t\treturn 2;\n\t}\n}\n","import {Vector3, Points, BufferAttribute, Mesh} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {ThreejsPrimitive} from './ThreejsPrimitive';\nimport {Attribute} from '../../Attribute';\n\nconst _p0 = new Vector3();\nexport class ThreejsPrimitivePoint extends ThreejsPrimitive {\n\tconstructor(object: Points, index: number) {\n\t\tsuper(object, index);\n\t\tthis._geometry = object.geometry;\n\t}\n\tstatic primitiveName() {\n\t\treturn 'point';\n\t}\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Points).geometry;\n\t\tif (!geometry) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst index = geometry.getIndex();\n\t\tif (!index) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn index.count;\n\t}\n\tstatic override position<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tif (!(object && object.geometry)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tconst positionAttribute = (object as any as Mesh).geometry.getAttribute(Attribute.POSITION) as BufferAttribute;\n\t\tif (!positionAttribute) {\n\t\t\treturn target;\n\t\t}\n\t\tconst positionArray = positionAttribute.array;\n\t\t_p0.fromArray(positionArray, primitiveIndex * 3 + 0);\n\t\ttarget.copy(_p0);\n\t\treturn target;\n\t}\n\tstatic override normal<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\treturn target.set(0, 1, 0);\n\t}\n\tposition(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof ThreejsPrimitivePoint).position(this._object, this._index, target);\n\t}\n\tnormal(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof ThreejsPrimitivePoint).normal(this._object, this._index, target);\n\t}\n\tstatic override computeVertexNormalsIfAttributeVersionChanged<T extends CoreObjectType>(object: ObjectContent<T>) {}\n\tprotected static override stride() {\n\t\treturn 1;\n\t}\n}\n","import type {Mesh, LineSegments, Points, Object3D} from 'three';\nimport {\n\tCoreFactoryFunctions,\n\tCorePointClassFactoryCheckFunction,\n\tCorePointInstanceFactoryCheckFunction,\n\tCoreVertexClassFactoryCheckFunction,\n\tCoreVertexInstanceFactoryCheckFunction,\n\tCorePrimitiveClassFactoryCheckFunction,\n\tCorePrimitiveInstanceFactoryCheckFunction,\n\tCoreObjectClassFactoryCheckFunction,\n\tCoreObjectInstanceFactoryCheckFunction,\n} from '../../CoreObjectFactory';\nimport {CoreObjectType, ObjectContent, isObject3D} from '../../ObjectContent';\nimport {ThreejsPoint} from './ThreejsPoint';\nimport {ThreejsVertex} from './ThreejsVertex';\nimport {ThreejsCoreObject} from './ThreejsCoreObject';\nimport {ThreejsPrimitiveTriangle} from './ThreejsPrimitiveTriangle';\nimport {ThreejsPrimitiveLineSegment} from './ThreejsPrimitiveLineSegment';\nimport {ThreejsPrimitivePoint} from './ThreejsPrimitivePoint';\n\n// point methods\nconst pointClassFactory: CorePointClassFactoryCheckFunction = (object: ObjectContent<CoreObjectType>) => {\n\tif (isObject3D(object)) {\n\t\treturn ThreejsPoint;\n\t}\n};\nexport const pointClassFactoryEnsured = () => ThreejsPoint;\nconst pointInstanceFactory: CorePointInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex = 0\n) => {\n\tif (isObject3D(object)) {\n\t\treturn new ThreejsPoint(object, index);\n\t}\n};\nexport const pointInstanceFactoryEnsured = (object: ObjectContent<CoreObjectType>, index = 0) => {\n\treturn new ThreejsPoint(object as Object3D, index);\n};\n// vertex methods\nconst vertexClassFactory: CoreVertexClassFactoryCheckFunction = (object: ObjectContent<CoreObjectType>) => {\n\tif (isObject3D(object)) {\n\t\treturn ThreejsVertex;\n\t}\n};\nexport const vertexClassFactoryEnsured = () => ThreejsVertex;\nconst vertexInstanceFactory: CoreVertexInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex = 0\n) => {\n\tif (isObject3D(object)) {\n\t\treturn new ThreejsVertex(object, index);\n\t}\n};\nexport const vertexInstanceFactoryEnsured = (object: ObjectContent<CoreObjectType>, index = 0) => {\n\treturn new ThreejsVertex(object as Object3D, index);\n};\n// primitive methods\nexport const primitiveClassFactoryNonAbstract = (object: ObjectContent<CoreObjectType>) => {\n\tif (isObject3D(object)) {\n\t\tif ((object as Mesh).isMesh) {\n\t\t\treturn ThreejsPrimitiveTriangle;\n\t\t}\n\t\tif ((object as LineSegments).isLineSegments) {\n\t\t\treturn ThreejsPrimitiveLineSegment;\n\t\t}\n\t\tif ((object as Points).isPoints) {\n\t\t\treturn ThreejsPrimitivePoint;\n\t\t}\n\t\treturn ThreejsPrimitiveTriangle;\n\t}\n};\nexport const primitiveClassFactoryEnsured = () => ThreejsPrimitiveTriangle;\nconst primitiveClassFactory: CorePrimitiveClassFactoryCheckFunction = primitiveClassFactoryNonAbstract;\nexport const primitiveInstanceFactory: CorePrimitiveInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex = 0\n) => {\n\tif (isObject3D(object)) {\n\t\tif ((object as Mesh).isMesh) {\n\t\t\treturn new ThreejsPrimitiveTriangle(object as Mesh, index);\n\t\t}\n\t\tif ((object as LineSegments).isLineSegments) {\n\t\t\treturn new ThreejsPrimitiveLineSegment(object as LineSegments, index);\n\t\t}\n\t\tif ((object as Points).isPoints) {\n\t\t\treturn new ThreejsPrimitivePoint(object as Points, index);\n\t\t}\n\t}\n};\nexport const primitiveInstanceFactoryEnsured = (object: ObjectContent<CoreObjectType>, index = 0) => {\n\treturn new ThreejsPrimitiveTriangle(object as Mesh, index);\n};\nexport const primitiveVerticesCountFactory = (object: ObjectContent<CoreObjectType>): number => {\n\tif (isObject3D(object)) {\n\t\tif ((object as Mesh).isMesh) {\n\t\t\treturn 3;\n\t\t}\n\t\tif ((object as LineSegments).isLineSegments) {\n\t\t\treturn 2;\n\t\t}\n\t\tif ((object as Points).isPoints) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn 0;\n};\n// object methods\nconst objectClassFactory: CoreObjectClassFactoryCheckFunction = (object: ObjectContent<CoreObjectType>) => {\n\tif (isObject3D(object) || (object as Object3D).isObject3D) {\n\t\treturn ThreejsCoreObject;\n\t}\n};\nexport const objectClassFactoryEnsured = () => ThreejsCoreObject;\nconst objectInstanceFactory: CoreObjectInstanceFactoryCheckFunction = (\n\tobject: ObjectContent<CoreObjectType>,\n\tindex = 0\n) => {\n\tif (isObject3D(object)) {\n\t\treturn new ThreejsCoreObject(object, index);\n\t}\n};\nexport const objectInstanceFactoryEnsured = (object: ObjectContent<CoreObjectType>, index = 0) => {\n\treturn new ThreejsCoreObject(object as Object3D, index);\n};\n\n//\nexport const object3DFactory: CoreFactoryFunctions = {\n\tpointClass: pointClassFactory,\n\tpointInstance: pointInstanceFactory,\n\tvertexClass: vertexClassFactory,\n\tvertexInstance: vertexInstanceFactory,\n\tprimitiveClass: primitiveClassFactory,\n\tprimitiveInstance: primitiveInstanceFactory,\n\tobjectClass: objectClassFactory,\n\tobjectInstance: objectInstanceFactory,\n};\n","import {BufferGeometry} from 'three';\nimport {objectCloneDeep} from '../ObjectUtils';\n\nexport function cloneBufferGeometry(srcGeometry: BufferGeometry): BufferGeometry {\n\tconst clonedGeometry = srcGeometry.clone();\n\tif (srcGeometry.userData) {\n\t\tclonedGeometry.userData = objectCloneDeep(srcGeometry.userData);\n\t}\n\treturn clonedGeometry;\n}\n","import {\n\tBone,\n\tSkinnedMesh,\n\tMaterial,\n\tAnimationClip,\n\tBufferGeometry,\n\tColor,\n\tMesh,\n\tBox3,\n\tSphere,\n\tVector3,\n\tObject3D,\n\tMatrix4,\n} from 'three';\nimport {cloneBufferGeometry} from '../../Geometry';\nimport {Object3DWithGeometry} from '../../Group';\nimport {AttribClass, dataFromObject, ObjectData, ObjectType} from '../../Constant';\nimport {objectData} from '../../entities/object/BaseCoreObjectUtils';\nimport {MaterialWithCustomMaterials, applyCustomMaterials} from '../../Material';\nimport {objectCloneDeep} from '../../../ObjectUtils';\nimport {ThreeMeshBVHHelper} from '../../bvh/ThreeMeshBVHHelper';\nimport {CoreGeometryBuilderMerge} from './builders/Merge';\nimport {CoreObjectType, MergeCompactOptions, ObjectContent, objectContentCopyProperties} from '../../ObjectContent';\nimport {BaseCoreObject} from '../../entities/object/BaseCoreObject';\nimport {TransformTargetType} from '../../../Transform';\nimport {TypeAssert} from '../../../../engine/poly/Assert';\nimport {applyTransformWithSpaceToObject, ObjectTransformMode, ObjectTransformSpace} from '../../../TransformSpace';\nimport {BaseSopOperation} from '../../../../engine/operations/sop/_Base';\nimport {primitiveClassFactoryNonAbstract} from './ThreeModule';\nimport {ThreejsVertex} from './ThreejsVertex';\nimport {ThreejsPoint} from './ThreejsPoint';\nimport {TraversedRelatedEntityData} from '../../entities/utils/TraversedRelatedEntities';\nimport {CoreEntityWithObject} from '../../CoreEntity';\nimport {arrayCopy} from '../../../ArrayUtils';\n\ninterface Object3DWithAnimations extends Object3D {\n\tanimations: AnimationClip[];\n}\ninterface MaterialWithColor extends Material {\n\tcolor: Color;\n}\nconst COMPUTE_PRECISE_BOUNDS = true;\nconst SPHERE_EMPTY = new Sphere(new Vector3(0, 0, 0), 0);\n\nexport class ThreejsCoreObject extends BaseCoreObject<CoreObjectType.THREEJS> {\n\tprotected override _object: Object3D;\n\tconstructor(_object: Object3D, index: number) {\n\t\tsuper(_object, index);\n\t\tthis._object = _object;\n\t}\n\toverride humanType(): string {\n\t\treturn dataFromObject(this._object).humanName;\n\t}\n\toverride object() {\n\t\treturn this._object;\n\t}\n\toverride geometry(): BufferGeometry | null {\n\t\treturn (this._object as Mesh).geometry as BufferGeometry | null;\n\t}\n\t// object():Object3D{\n\t// \treturn this._object\n\t// }\n\t// coreGeometry(): CoreGeometry | null {\n\t// \tconst geo = this.geometry();\n\t// \tif (geo) {\n\t// \t\treturn new CoreGeometry(geo);\n\t// \t} else {\n\t// \t\treturn null;\n\t// \t}\n\t// \t// const geo = this.geometry()\n\t// \t// if (geo) {\n\t// \t// \treturn new CoreGeometry(geo)\n\t// \t// } else {\n\t// \t// \treturn null\n\t// \t// }\n\t// }\n\n\tstatic override objectData(object: Object3D): ObjectData {\n\t\tconst data = objectData(object);\n\t\tdata.verticesCount = ThreejsVertex.entitiesCount(object);\n\t\tdata.pointsCount = ThreejsPoint.entitiesCount(object);\n\t\tconst primitiveClass = primitiveClassFactoryNonAbstract(object);\n\t\tdata.primitivesCount = primitiveClass?.entitiesCount(object) || 0;\n\t\tdata.primitiveName = primitiveClass?.primitiveName() || '';\n\t\treturn data;\n\t}\n\n\tstatic override position(object: Object3D, target: Vector3) {\n\t\ttarget.copy(object.position);\n\t}\n\tstatic override boundingBox(object: Object3D, target: Box3) {\n\t\ttarget.setFromObject(object, COMPUTE_PRECISE_BOUNDS);\n\t}\n\tstatic override geometryBoundingBox(object: Object3D, target: Box3) {\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tif (geometry) {\n\t\t\tif (!geometry.boundingBox) {\n\t\t\t\tgeometry.computeBoundingBox();\n\t\t\t}\n\t\t\tif (geometry.boundingBox) {\n\t\t\t\ttarget.copy(geometry.boundingBox);\n\t\t\t}\n\t\t} else {\n\t\t\ttarget.makeEmpty();\n\t\t}\n\t}\n\tstatic override boundingSphere(object: Object3D, target: Sphere) {\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tif (!geometry) {\n\t\t\ttarget.copy(SPHERE_EMPTY);\n\t\t\treturn;\n\t\t}\n\t\tgeometry.computeBoundingSphere();\n\t\tconst computedSphere = geometry.boundingSphere;\n\t\tif (!computedSphere) {\n\t\t\ttarget.copy(SPHERE_EMPTY);\n\t\t\treturn;\n\t\t}\n\t\ttarget.copy(computedSphere);\n\t}\n\tstatic override geometryBoundingSphere(object: Object3D, target: Sphere): void {\n\t\tthis.boundingSphere(object, target);\n\t}\n\n\t// computeVertexNormals() {\n\t// \tthis.coreGeometry()?.computeVertexNormals();\n\t// }\n\tstatic override clone(srcObject: Object3D) {\n\t\tconst clonedObject = srcObject.clone();\n\t\tvar sourceLookup = new Map<Object3D, Object3D>();\n\t\tvar cloneLookup = new Map<Object3D, Object3D>();\n\t\tThreejsCoreObject.parallelTraverse(\n\t\t\tsrcObject,\n\t\t\tclonedObject,\n\t\t\tfunction (sourceNode: Object3D, clonedNode: Object3D) {\n\t\t\t\tsourceLookup.set(clonedNode, sourceNode);\n\t\t\t\tcloneLookup.set(sourceNode, clonedNode);\n\t\t\t}\n\t\t);\n\t\tclonedObject.traverse(function (node) {\n\t\t\tconst srcNode = sourceLookup.get(node) as SkinnedMesh | undefined;\n\t\t\tconst meshNode = node as Mesh;\n\n\t\t\tif (meshNode.geometry && srcNode && srcNode.geometry) {\n\t\t\t\tconst srcNodeGeometry = srcNode.geometry as BufferGeometry;\n\t\t\t\tmeshNode.geometry = cloneBufferGeometry(srcNodeGeometry);\n\t\t\t\tThreeMeshBVHHelper.copyBVH(meshNode, srcNode);\n\t\t\t\t// const mesh_node_geometry = meshNode.geometry as BufferGeometry;\n\t\t\t\t// if (mesh_node_geometry.userData) {\n\t\t\t\t// \tmesh_node_geometry.userData = objectCloneDeep(srcNodeGeometry.userData);\n\t\t\t\t// }\n\t\t\t}\n\t\t\tif (meshNode.material) {\n\t\t\t\t// no need to assign the material here\n\t\t\t\t// as this should already be done in the .clone() method.\n\t\t\t\t// Otherwise, when this is assigned here, some objects that rely on their own mat\n\t\t\t\t// such as sop/Reflector stop working when cloned\n\t\t\t\t// mesh_node.material = src_node.material;\n\t\t\t\tapplyCustomMaterials(node, meshNode.material as MaterialWithCustomMaterials);\n\n\t\t\t\t// prevents crashes for linesegments with shader material such as the line dashed instance\n\t\t\t\t// TODO: test\n\t\t\t\tconst material_with_color = meshNode.material as MaterialWithColor;\n\t\t\t\tif (material_with_color.color == null) {\n\t\t\t\t\tmaterial_with_color.color = new Color(1, 1, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (srcNode) {\n\t\t\t\tif (srcNode.userData) {\n\t\t\t\t\tnode.userData = objectCloneDeep(srcNode.userData);\n\t\t\t\t}\n\t\t\t\tconst src_node_with_animations = (<unknown>srcNode) as Object3DWithAnimations;\n\t\t\t\tif (src_node_with_animations.animations) {\n\t\t\t\t\t(node as Object3DWithAnimations).animations = src_node_with_animations.animations.map((animation) =>\n\t\t\t\t\t\tanimation.clone()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst skinned_node = node as SkinnedMesh;\n\t\t\t\tif (skinned_node.isSkinnedMesh) {\n\t\t\t\t\tvar clonedMesh = skinned_node;\n\t\t\t\t\tvar sourceMesh = srcNode;\n\t\t\t\t\tvar sourceBones = sourceMesh.skeleton.bones;\n\n\t\t\t\t\tclonedMesh.skeleton = sourceMesh.skeleton.clone();\n\t\t\t\t\tclonedMesh.bindMatrix.copy(sourceMesh.bindMatrix);\n\n\t\t\t\t\tconst new_bones = sourceBones.map(function (bone) {\n\t\t\t\t\t\treturn cloneLookup.get(bone);\n\t\t\t\t\t}) as Bone[];\n\n\t\t\t\t\tclonedMesh.skeleton.bones = new_bones;\n\n\t\t\t\t\tclonedMesh.bind(clonedMesh.skeleton, clonedMesh.bindMatrix);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn clonedObject;\n\t}\n\tstatic parallelTraverse(a: Object3D, b: Object3D, callback: (a: Object3D, b: Object3D) => void) {\n\t\tcallback(a, b);\n\t\tfor (var i = 0; i < a.children.length; i++) {\n\t\t\tconst childA = a.children[i];\n\t\t\tconst childB = b.children[i];\n\t\t\tif (childA && childB) {\n\t\t\t\tthis.parallelTraverse(childA, childB, callback);\n\t\t\t}\n\t\t}\n\t}\n\tstatic override applyMatrix(\n\t\tobject: Object3D,\n\t\tmatrix: Matrix4,\n\t\ttransformTargetType: TransformTargetType,\n\t\ttransformSpace: ObjectTransformSpace,\n\t\ttransformMode: ObjectTransformMode\n\t) {\n\t\tswitch (transformTargetType) {\n\t\t\tcase TransformTargetType.OBJECT: {\n\t\t\t\tapplyTransformWithSpaceToObject(object, matrix, transformSpace, transformMode);\n\t\t\t\t// this._applyMatrixToObject(object, matrix);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase TransformTargetType.GEOMETRY: {\n\t\t\t\tconst geometry = (object as Object3DWithGeometry).geometry;\n\t\t\t\tif (geometry) {\n\t\t\t\t\tgeometry.applyMatrix4(matrix);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(transformTargetType);\n\t}\n\tstatic override mergeCompact(options: MergeCompactOptions) {\n\t\tconst {objects, material, objectType, mergedObjects, onError} = options;\n\t\tconst firstObject = objects[0];\n\t\tif (!firstObject) {\n\t\t\treturn;\n\t\t}\n\t\tconst geometries: BufferGeometry[] = [];\n\t\tfor (const object of objects) {\n\t\t\tconst geometry = (object as Mesh).geometry;\n\t\t\tif (geometry) {\n\t\t\t\tgeometry.applyMatrix4((object as Mesh).matrix);\n\t\t\t\tgeometries.push(geometry);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst mergedGeometry = CoreGeometryBuilderMerge.merge(geometries);\n\t\t\tif (mergedGeometry) {\n\t\t\t\tconst newObject = BaseSopOperation.createObject(mergedGeometry, objectType as ObjectType, material);\n\t\t\t\tif (newObject) {\n\t\t\t\t\tobjectContentCopyProperties(firstObject, newObject);\n\t\t\t\t\tmergedObjects.push(newObject as Object3DWithGeometry);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tonError('merge failed, check that input geometries have the same attributes');\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tonError((e as Error).message || 'unknown error');\n\t\t}\n\t}\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedPrimitiveIds(\n\t\tobject: ObjectContent<CoreObjectType>,\n\t\tindex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst _primitiveClassFactory = primitiveClassFactoryNonAbstract(object as any as Object3D);\n\t\tif (!_primitiveClassFactory) {\n\t\t\ttarget.length = 0;\n\t\t\treturn;\n\t\t}\n\t\tconst count = _primitiveClassFactory?.entitiesCount(object as any as Object3D);\n\t\ttarget.length = count;\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\ttarget[i] = i;\n\t\t}\n\t\tif (traversedRelatedEntityData && traversedRelatedEntityData[AttribClass.PRIMITIVE].ids != target) {\n\t\t\tarrayCopy(target, traversedRelatedEntityData[AttribClass.PRIMITIVE].ids);\n\t\t}\n\t}\n\n\tstatic override relatedPrimitiveClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn primitiveClassFactoryNonAbstract(object as any as Mesh) as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {\n\tBufferGeometry,\n\tObject3D,\n\tMesh,\n\tVector3,\n\tBufferAttribute,\n\tFloat32BufferAttribute,\n\tInt32BufferAttribute,\n\tInstancedBufferAttribute,\n} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {CorePoint} from '../../entities/point/CorePoint';\nimport {PointAttributesDict} from '../../entities/point/Common';\nimport {Attribute} from '../../Attribute';\nimport {objectCloneDeep} from '../../../ObjectUtils';\nimport {NumericAttribValue} from '../../../../types/GlobalTypes';\nimport {markedAsInstance} from '../../GeometryUtils';\nimport {pointsCountFromBufferGeometry, positionAttributeNameFromBufferGeometry} from './CoreThreejsPointUtils';\nimport {attributeNumericValues, AttributeNumericValuesOptions} from '../../entities/utils/Common';\nimport {ThreejsVertex} from './ThreejsVertex';\nimport {pointsCountFromObject} from '../../entities/point/CorePointUtils';\nimport {TraversedRelatedEntityData} from '../../entities/utils/TraversedRelatedEntities';\nimport {CoreEntityWithObject} from '../../CoreEntity';\n\nconst INDEX_ATTRIB_VALUES = 'indexedAttribValues';\nconst target: AttributeNumericValuesOptions = {\n\tattributeAdded: false,\n\tvalues: [],\n};\n\nexport class ThreejsPoint extends CorePoint<CoreObjectType.THREEJS> {\n\tprotected _geometry?: BufferGeometry;\n\n\tconstructor(object: Object3D, index: number) {\n\t\tsuper(object, index);\n\t\tthis._updateGeometry();\n\t}\n\n\toverride setIndex(index: number, object?: Object3D) {\n\t\tthis._index = index;\n\t\tif (object) {\n\t\t\tthis._object = object;\n\t\t\tthis._updateGeometry();\n\t\t}\n\t\treturn this;\n\t}\n\tprivate _updateGeometry() {\n\t\tconst geometry = (this._object as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (geometry) {\n\t\t\tthis._geometry = geometry;\n\t\t}\n\t}\n\tgeometry() {\n\t\treturn this._geometry;\n\t}\n\tstatic override addAttribute(object: Object3D, attribName: string, attribute: BufferAttribute) {\n\t\tconst geometry = (object as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tgeometry.setAttribute(attribName, attribute);\n\t}\n\tstatic override attributes<T extends CoreObjectType>(object: ObjectContent<T>): PointAttributesDict | undefined {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\treturn geometry.attributes;\n\t}\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn pointsCountFromBufferGeometry(geometry);\n\t}\n\tstatic positionAttributeName<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn null;\n\t\t}\n\t\treturn positionAttributeNameFromBufferGeometry(geometry);\n\t}\n\tstatic position<T extends CoreObjectType>(object: ObjectContent<T>, index: number, target: Vector3) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn null;\n\t\t}\n\t\tconst {array} = geometry.getAttribute(Attribute.POSITION) as BufferAttribute;\n\t\treturn target.fromArray(array, index * 3);\n\t}\n\toverride position(target: Vector3): Vector3 {\n\t\tif (!this._geometry) {\n\t\t\treturn target;\n\t\t}\n\t\tconst {array} = this._geometry.getAttribute(Attribute.POSITION) as BufferAttribute;\n\t\treturn target.fromArray(array, this._index * 3);\n\t}\n\toverride normal(target: Vector3): Vector3 {\n\t\tif (!this._geometry) {\n\t\t\treturn target;\n\t\t}\n\t\tconst {array} = this._geometry.getAttribute(Attribute.NORMAL) as BufferAttribute;\n\t\treturn target.fromArray(array, this._index * 3);\n\t}\n\tstatic override computeNormals<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn null;\n\t\t}\n\t\tgeometry.computeVertexNormals();\n\t}\n\n\tstatic override markAttribAsNeedsUpdate<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn null;\n\t\t}\n\t\tconst attribute = geometry.getAttribute(attribName);\n\t\tif (!attribute) {\n\t\t\treturn;\n\t\t}\n\t\tattribute.needsUpdate = true;\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\tstatic override userDataAttribs<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn {};\n\t\t}\n\t\treturn (geometry.userData[INDEX_ATTRIB_VALUES] = geometry.userData[INDEX_ATTRIB_VALUES] || {});\n\t}\n\tstatic override setIndexedAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tvalues: string[],\n\t\tindices: number[]\n\t) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setIndexedAttributeValues(object, attribName, values);\n\t\tgeometry.setAttribute(attribName, new Int32BufferAttribute(indices, 1));\n\t\tgeometry.getAttribute(attribName).needsUpdate = true;\n\t}\n\tstatic override attribValueIndex<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: number,\n\t\tattribName: string\n\t): number {\n\t\tif (this.isAttribIndexed(object, attribName)) {\n\t\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\t\tif (geometry) {\n\t\t\t\treturn (geometry.getAttribute(attribName) as BufferAttribute).array[index];\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t//\n\t//\n\t//\n\t//\n\t//\n\tstatic override renameAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\toldName: string,\n\t\tnewName: string\n\t) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.isAttribIndexed(object, oldName)) {\n\t\t\tthis.userDataAttribs(object)[newName] = objectCloneDeep(this.userDataAttribs(object)[oldName]);\n\t\t\tdelete this.userDataAttribs(object)[oldName];\n\t\t}\n\n\t\tconst oldAttrib = geometry.getAttribute(oldName) as BufferAttribute;\n\t\tgeometry.setAttribute(newName, new Float32BufferAttribute(oldAttrib.array, oldAttrib.itemSize));\n\t\treturn geometry.deleteAttribute(oldName);\n\t}\n\n\tstatic override deleteAttribute<T extends CoreObjectType>(object: ObjectContent<T>, attribName: string) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.isAttribIndexed(object, attribName)) {\n\t\t\tdelete this.userDataAttribs(object)[attribName];\n\t\t}\n\n\t\treturn geometry.deleteAttribute(attribName);\n\t}\n\n\tstatic override addNumericAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tattribName: string,\n\t\tsize: number = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tattributeNumericValues(object, pointsCountFromObject, size, defaultValue, target);\n\n\t\tif (target.attributeAdded) {\n\t\t\tif (markedAsInstance(geometry)) {\n\t\t\t\tconst valuesAsTypedArray = new Float32Array(target.values);\n\t\t\t\tgeometry.setAttribute(attribName.trim(), new InstancedBufferAttribute(valuesAsTypedArray, size));\n\t\t\t} else {\n\t\t\t\tgeometry.setAttribute(attribName.trim(), new Float32BufferAttribute(target.values, size));\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(defaultValue);\n\t\t\tthrow `CoreThreejsPoint.addNumericAttrib error: no other default value allowed for now (default given: ${defaultValue})`;\n\t\t}\n\t}\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedVertexIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tpointIndex: number,\n\t\ttarget: number[],\n\t\ttraversedRelatedEntityData?: TraversedRelatedEntityData\n\t): void {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = geometry.getIndex();\n\t\tif (!index) {\n\t\t\treturn;\n\t\t}\n\t\tconst indexArray = index.array;\n\t\tlet i = 0;\n\t\tfor (const indexValue of indexArray) {\n\t\t\tif (indexValue == pointIndex) {\n\t\t\t\ttarget.push(i);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\tstatic override relatedVertexClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn ThreejsVertex as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {BufferGeometry, Object3D, Mesh} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {PrimitiveAttributesDict, UserDataWithPrimitiveAttributes} from '../../entities/primitive/Common';\nimport {CorePrimitive} from '../../entities/primitive/CorePrimitive';\nimport {BasePrimitiveAttribute, PrimitiveNumberAttribute} from '../../entities/primitive/PrimitiveAttribute';\nimport {primitivesCountFromObject} from '../../entities/primitive/CorePrimitiveUtils';\nimport {ThreejsVertex} from './ThreejsVertex';\nimport {NumericAttribValue} from '../../../../types/GlobalTypes';\nimport {AttributeNumericValuesOptions, attributeNumericValues} from '../../entities/utils/Common';\nimport {CoreEntityWithObject} from '../../CoreEntity';\nimport {ThreejsCoreObject} from './ThreejsCoreObject';\n\nexport interface BufferGeometryWithPrimitiveAttributes extends BufferGeometry {\n\tuserData: UserDataWithPrimitiveAttributes;\n}\nconst target: AttributeNumericValuesOptions = {\n\tattributeAdded: false,\n\tvalues: [],\n};\nexport abstract class ThreejsPrimitive extends CorePrimitive<CoreObjectType.THREEJS> {\n\tprotected _geometry?: BufferGeometry;\n\tconstructor(object: Object3D, index: number) {\n\t\tsuper(object, index);\n\t\tthis._updateGeometry();\n\t}\n\toverride setIndex(index: number, object?: Object3D) {\n\t\tthis._index = index;\n\t\tif (object) {\n\t\t\tthis._object = object;\n\t\t\tthis._updateGeometry();\n\t\t}\n\t\treturn this;\n\t}\n\tprivate _updateGeometry() {\n\t\tconst geometry = (this._object as Mesh).geometry as BufferGeometryWithPrimitiveAttributes | undefined;\n\t\tif (geometry) {\n\t\t\tthis._geometry = geometry;\n\t\t}\n\t}\n\tgeometry() {\n\t\treturn this._geometry;\n\t}\n\tstatic override addAttribute(object: Object3D, attribName: string, attribute: BasePrimitiveAttribute) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[attribName] = attribute;\n\t}\n\tstatic override addNumericAttribute(\n\t\tobject: Object3D,\n\t\tattribName: string,\n\t\tsize: number = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst primitivesCount = this.entitiesCount(object);\n\t\ttarget.values = new Array(primitivesCount * size);\n\t\tattributeNumericValues(object, primitivesCountFromObject, size, defaultValue, target);\n\n\t\tconst attribute: PrimitiveNumberAttribute = {\n\t\t\tisString: false,\n\t\t\tarray: target.values,\n\t\t\titemSize: size,\n\t\t};\n\t\tthis.addAttribute(object, attribName, attribute);\n\t}\n\tstatic override attributes<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>\n\t): PrimitiveAttributesDict | undefined {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometryWithPrimitiveAttributes | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tif (!geometry.userData.primAttributes) {\n\t\t\tgeometry.userData.primAttributes = {};\n\t\t}\n\t\treturn geometry.userData.primAttributes;\n\t}\n\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tprotected static stride() {\n\t\treturn 3;\n\t}\n\tstatic override relatedVertexIds(\n\t\tobject: ObjectContent<CoreObjectType>,\n\t\tprimitiveIndex: number,\n\t\ttarget: number[]\n\t): void {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\ttarget.length = 0;\n\t\t\treturn;\n\t\t}\n\t\tconst stride = this.stride();\n\t\ttarget.length = stride;\n\t\tfor (let i = 0; i < stride; i++) {\n\t\t\ttarget[i] = primitiveIndex * stride + i;\n\t\t}\n\t}\n\n\tstatic override relatedVertexClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn ThreejsVertex as any as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic override relatedObjectClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn ThreejsCoreObject as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {Triangle, Vector3, Mesh, BufferAttribute, BufferGeometry} from 'three';\nimport {CoreObjectType, ObjectBuilder, ObjectContent} from '../../ObjectContent';\nimport {ThreejsPrimitive} from './ThreejsPrimitive';\nimport {threeMeshFromPrimitives} from './builders/Mesh';\nimport {Attribute} from '../../Attribute';\n\nconst _triangle = new Triangle();\n\nconst normalsComputedWithPositionAttributeVersion: Map<string, number> = new Map();\nexport class ThreejsPrimitiveTriangle extends ThreejsPrimitive {\n\tconstructor(object: Mesh, index: number) {\n\t\tsuper(object, index);\n\t\tthis._geometry = object.geometry;\n\t}\n\tstatic primitiveName() {\n\t\treturn 'triangle';\n\t}\n\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry;\n\t\tif (!geometry) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst index = geometry.getIndex();\n\t\tif (!index) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn index.count / 3;\n\t}\n\tstatic override position<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tsetTriangle(object, primitiveIndex, _triangle);\n\t\ttarget.copy(_triangle.a).add(_triangle.b).add(_triangle.c).divideScalar(3);\n\t\treturn target;\n\t}\n\tstatic override normal<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Vector3\n\t): Vector3 {\n\t\tsetTriangle(object, primitiveIndex, _triangle);\n\t\t_triangle.getNormal(target);\n\t\treturn target;\n\t}\n\tposition(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof ThreejsPrimitiveTriangle).position(this._object, this._index, target);\n\t}\n\tnormal(target: Vector3): Vector3 {\n\t\treturn (this.constructor as typeof ThreejsPrimitiveTriangle).normal(this._object, this._index, target);\n\t}\n\tstatic override computeVertexNormalsIfAttributeVersionChanged<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn null;\n\t\t}\n\t\tconst positionAttribute = geometry.getAttribute(Attribute.POSITION);\n\t\tif (!positionAttribute) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(positionAttribute instanceof BufferAttribute)) {\n\t\t\treturn;\n\t\t}\n\t\tlet lastVersion = normalsComputedWithPositionAttributeVersion.get(geometry.uuid);\n\t\tif (lastVersion == null || lastVersion != positionAttribute.version) {\n\t\t\tgeometry.computeVertexNormals();\n\t\t\tnormalsComputedWithPositionAttributeVersion.set(geometry.uuid, positionAttribute.version);\n\t\t}\n\t}\n\toverride builder<T extends CoreObjectType>() {\n\t\treturn threeMeshFromPrimitives as any as ObjectBuilder<T>;\n\t}\n\tprotected static override stride() {\n\t\treturn 3;\n\t}\n\n\tstatic setTriangle<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T> | undefined,\n\t\tprimitiveIndex: number,\n\t\ttarget: Triangle\n\t) {\n\t\tsetTriangle(object, primitiveIndex, target);\n\t}\n}\n\nexport function triangleArea(triangle: ThreejsPrimitiveTriangle): number {\n\tsetTriangle(triangle.object(), triangle.index(), _triangle);\n\treturn _triangle.getArea();\n}\n\nexport function setTriangle<T extends CoreObjectType>(\n\tobject: ObjectContent<T> | undefined,\n\tprimitiveIndex: number,\n\ttarget: Triangle\n) {\n\tif (!(object && object.geometry)) {\n\t\treturn;\n\t}\n\tconst geometry = (object as any as Mesh).geometry;\n\tconst positionAttribute = geometry.getAttribute(Attribute.POSITION) as BufferAttribute;\n\tif (!positionAttribute) {\n\t\treturn;\n\t}\n\tconst index = geometry.getIndex();\n\tif (!index) {\n\t\treturn;\n\t}\n\tconst indexArray = index.array;\n\tconst positionArray = positionAttribute.array;\n\ttarget.a.fromArray(positionArray, indexArray[primitiveIndex * 3 + 0] * 3);\n\ttarget.b.fromArray(positionArray, indexArray[primitiveIndex * 3 + 1] * 3);\n\ttarget.c.fromArray(positionArray, indexArray[primitiveIndex * 3 + 2] * 3);\n}\n","import {BufferGeometry, Object3D, Mesh, Vector3, BufferAttribute} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../ObjectContent';\nimport {CoreVertex} from '../../entities/vertex/CoreVertex';\nimport {VertexAttributesDict, UserDataWithVertexAttributes} from '../../entities/vertex/Common';\nimport {BaseVertexAttribute, VertexNumberAttribute} from '../../entities/vertex/VertexAttribute';\nimport {verticesCountFromObject} from '../../entities/vertex/CoreVertexUtils';\nimport {primitiveClassFactoryNonAbstract, primitiveVerticesCountFactory} from './ThreeModule';\nimport {ThreejsPoint} from './ThreejsPoint';\nimport {NumericAttribValue} from '../../../../types/GlobalTypes';\nimport {AttributeNumericValuesOptions, attributeNumericValues} from '../../entities/utils/Common';\nimport {CoreEntityWithObject} from '../../CoreEntity';\n\nexport interface BufferGeometryWithVertexAttributes extends BufferGeometry {\n\tuserData: UserDataWithVertexAttributes;\n}\nconst target: AttributeNumericValuesOptions = {\n\tattributeAdded: false,\n\tvalues: [],\n};\n\nexport class ThreejsVertex extends CoreVertex<CoreObjectType.THREEJS> {\n\tprotected _geometry?: BufferGeometry;\n\n\tconstructor(object: Object3D, index: number) {\n\t\tsuper(object, index);\n\t\tthis._updateGeometry();\n\t}\n\toverride setIndex(index: number, object?: Object3D) {\n\t\tthis._index = index;\n\t\tif (object) {\n\t\t\tthis._object = object;\n\t\t\tthis._updateGeometry();\n\t\t}\n\t\treturn this;\n\t}\n\tprivate _updateGeometry() {\n\t\tconst geometry = (this._object as Mesh).geometry as BufferGeometryWithVertexAttributes | undefined;\n\t\tif (geometry) {\n\t\t\tthis._geometry = geometry;\n\t\t}\n\t}\n\tgeometry() {\n\t\treturn this._geometry;\n\t}\n\tstatic override addAttribute(object: Object3D, attribName: string, attribute: BaseVertexAttribute) {\n\t\tconst attributes = this.attributes(object);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tattributes[attribName] = attribute;\n\t}\n\tstatic override addNumericAttribute(\n\t\tobject: Object3D,\n\t\tattribName: string,\n\t\tsize: number = 1,\n\t\tdefaultValue: NumericAttribValue = 0\n\t) {\n\t\tconst verticesCount = this.entitiesCount(object);\n\t\ttarget.values = new Array(verticesCount * size);\n\t\tattributeNumericValues(object, verticesCountFromObject, size, defaultValue, target);\n\n\t\tconst attribute: VertexNumberAttribute = {\n\t\t\tisString: false,\n\t\t\tarray: target.values,\n\t\t\titemSize: size,\n\t\t};\n\t\tthis.addAttribute(object, attribName, attribute);\n\t}\n\tstatic override attributes<T extends CoreObjectType>(object: ObjectContent<T>): VertexAttributesDict | undefined {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometryWithVertexAttributes | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tif (!geometry.userData.vertexAttributes) {\n\t\t\tgeometry.userData.vertexAttributes = {};\n\t\t}\n\t\treturn geometry.userData.vertexAttributes;\n\t}\n\tstatic override indexAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>\n\t): BufferAttribute | undefined | null {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\treturn geometry.getIndex();\n\t}\n\tstatic override setIndexAttribute<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tindex: BufferAttribute | number[]\n\t): BufferAttribute | undefined {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tgeometry.setIndex(index);\n\t}\n\tstatic override entitiesCount<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst index = geometry.getIndex();\n\t\tif (!index) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn index.count;\n\t}\n\toverride position(target: Vector3): Vector3 {\n\t\tconsole.warn('CoreThreejsVertex.position not implemented');\n\t\treturn target;\n\t}\n\toverride normal(target: Vector3): Vector3 {\n\t\tconsole.warn('CoreThreejsVertex.normal not implemented');\n\t\treturn target;\n\t}\n\t//\n\t//\n\t// RELATED ENTITIES\n\t//\n\t//\n\tstatic override relatedPrimitiveIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tpointIndex: number,\n\t\ttarget: number[]\n\t): void {\n\t\ttarget.length = 1;\n\t\tconst index = Math.floor(pointIndex / primitiveVerticesCountFactory(object as any as Mesh));\n\t\ttarget[0] = index;\n\t}\n\t// static override  relatedPrimitives<T extends CoreObjectType>(object:BaseCoreObject<T>,vertexIndex:number,target: CorePrimitive<T>[]): void {\n\t// \tthis.relatedPrimitiveIds(object,vertexIndex,_ids)\n\t// \ttarget.length = _ids.length;\n\t// \tlet i=0\n\t// \tfor(const id of _ids){\n\t// \t\ttarget[i]=(primitiveInstanceFactory(object as any as Mesh,id)) as CorePrimitive<T>\n\t// \t\ti++\n\t// \t}\n\t// }\n\n\t// override relatedPrimitives<T extends CoreObjectType>(target: CorePrimitive<T>[]): void {\n\t// \ttarget.length = 0;\n\t// \tif (!this._object) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst index = Math.floor(this._index / primitiveVerticesCountFactory(this._object));\n\t// \tconst primitive = primitiveInstanceFactory(this._object, index) as CorePrimitive<T> | undefined;\n\t// \tif (!primitive) {\n\t// \t\treturn;\n\t// \t}\n\t// \ttarget.push(primitive);\n\t// }\n\n\tstatic override relatedPointIds<T extends CoreObjectType>(\n\t\tobject: ObjectContent<T>,\n\t\tpointIndex: number,\n\t\ttarget: number[]\n\t): void {\n\t\ttarget.length = 0;\n\n\t\tconst geometry = (object as any as Mesh).geometry as BufferGeometry | undefined;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = geometry.getIndex();\n\t\tif (!index) {\n\t\t\treturn;\n\t\t}\n\t\tconst indexArray = index.array;\n\t\tconst indexValue = indexArray[pointIndex];\n\t\ttarget[0] = indexValue;\n\t}\n\n\tstatic override relatedPointClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn ThreejsPoint as any as typeof CoreEntityWithObject<T>;\n\t}\n\tstatic override relatedPrimitiveClass<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\treturn primitiveClassFactoryNonAbstract(object as any as Mesh) as any as typeof CoreEntityWithObject<T>;\n\t}\n}\n","import {BufferGeometry, Mesh} from 'three';\nimport {mergeGeometries} from 'three/examples/jsm/utils/BufferGeometryUtils';\nimport {CoreGeometryIndexBuilder} from '../../../util/IndexBuilder';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\nimport {pointsFromThreejsObject} from '../CoreThreejsPointUtils';\nimport {ThreejsPoint} from '../ThreejsPoint';\nimport {setToArray} from '../../../../SetUtils';\n\nconst dummyMesh = new Mesh();\nexport class CoreGeometryBuilderMerge {\n\tstatic merge(geometries: BufferGeometry[]) {\n\t\tif (geometries.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t//\n\t\t// 1/4. add indices if none\n\t\t//\n\t\tfor (const geometry of geometries) {\n\t\t\tCoreGeometryIndexBuilder.createIndexIfNone(geometry);\n\t\t}\n\n\t\t//\n\t\t// 2/4. set the new attrib indices for the indexed attributes\n\t\t//\n\t\t// const core_geometries = geometries.map((geometry) => new CoreGeometry(geometry));\n\t\tdummyMesh.geometry = geometries[0];\n\t\tconst indexedAttributeNames = ThreejsPoint.indexedAttributeNames(dummyMesh);\n\n\t\tconst newValuesByAttributeName: PolyDictionary<string[]> = {};\n\t\tfor (const indexedAttributeName of indexedAttributeNames) {\n\t\t\tconst indexByValues: Map<string, number> = new Map();\n\t\t\tconst valuesSet: Set<string> = new Set();\n\t\t\tconst allGeometriesPoints: ThreejsPoint[] = [];\n\t\t\tfor (const geometry of geometries) {\n\t\t\t\tconst dummyMesh = new Mesh(geometry);\n\t\t\t\tconst points = pointsFromThreejsObject(dummyMesh);\n\t\t\t\tfor (const point of points) {\n\t\t\t\t\tallGeometriesPoints.push(point);\n\t\t\t\t\tconst value: string | null = point.indexedAttribValue(indexedAttributeName);\n\n\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\tif (!valuesSet.has(value)) {\n\t\t\t\t\t\t\tindexByValues.set(value, valuesSet.size);\n\t\t\t\t\t\t\tvaluesSet.add(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const point of allGeometriesPoints) {\n\t\t\t\tconst value = point.indexedAttribValue(indexedAttributeName);\n\t\t\t\tif (value != null) {\n\t\t\t\t\tconst newIndex = indexByValues.get(value);\n\t\t\t\t\tif (newIndex != null) {\n\t\t\t\t\t\tpoint.setAttribIndex(indexedAttributeName, newIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst values: string[] = [];\n\t\t\tsetToArray(valuesSet, values);\n\t\t\tnewValuesByAttributeName[indexedAttributeName] = values;\n\t\t}\n\n\t\t//\n\t\t// 3/4. merge the geos\n\t\t//\n\t\tconst mergedGeometry = mergeGeometries(geometries);\n\n\t\t//\n\t\t// 4/4. add the index attrib values\n\t\t//\n\n\t\tdummyMesh.geometry = mergedGeometry;\n\t\tObject.keys(newValuesByAttributeName).forEach((indexedAttributeName) => {\n\t\t\tconst values = newValuesByAttributeName[indexedAttributeName];\n\t\t\tThreejsPoint.setIndexedAttributeValues(dummyMesh, indexedAttributeName, values);\n\t\t});\n\n\t\tif (mergedGeometry) {\n\t\t\tdelete mergedGeometry.userData.mergedUserData;\n\t\t}\n\n\t\treturn mergedGeometry;\n\t}\n}\n","import {BufferGeometry, Mesh, Vector3} from 'three';\nimport {CoreGeometryBuilderBase} from './_Base';\nimport {BaseCorePoint} from '../../../entities/point/CorePoint';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\nimport {CoreObjectType, ObjectBuilder, ObjectContent} from '../../../ObjectContent';\nimport {CoreEntity} from '../../../CoreEntity';\nimport type {ThreejsPrimitiveTriangle} from '../ThreejsPrimitiveTriangle';\n\nexport class CoreGeometryBuilderMesh extends CoreGeometryBuilderBase {\n\tprotected _filterPoints(points: BaseCorePoint[]): BaseCorePoint[] {\n\t\t// ensures we only keep points that form a full face.\n\t\t// if a single point from a face is discarded, we remove all 3\n\n\t\tconst firstPoint = points[0];\n\t\tif (!firstPoint) {\n\t\t\treturn [];\n\t\t}\n\t\tconst geometry = firstPoint.geometry();\n\t\tif (!geometry) {\n\t\t\treturn [];\n\t\t}\n\t\tconst indices = geometry.getIndex()?.array;\n\t\tif (!indices) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst points_by_index: PolyDictionary<BaseCorePoint> = {};\n\t\tfor (const point of points) {\n\t\t\tpoints_by_index[point.index()] = point;\n\t\t}\n\t\tconst filteredPoints: BaseCorePoint[] = [];\n\n\t\tconst index_length = indices.length;\n\t\tlet pt0: BaseCorePoint;\n\t\tlet pt1: BaseCorePoint;\n\t\tlet pt2: BaseCorePoint;\n\t\tfor (let i = 0; i < index_length; i += 3) {\n\t\t\tpt0 = points_by_index[indices[i + 0]];\n\t\t\tpt1 = points_by_index[indices[i + 1]];\n\t\t\tpt2 = points_by_index[indices[i + 2]];\n\t\t\tif (pt0 && pt1 && pt2) {\n\t\t\t\tfilteredPoints.push(pt0);\n\t\t\t\tfilteredPoints.push(pt1);\n\t\t\t\tfilteredPoints.push(pt2);\n\t\t\t}\n\t\t}\n\n\t\treturn filteredPoints;\n\t}\n\n\tprotected _indicesFromPoints(new_index_by_old_index: PolyDictionary<number>, old_geometry: BufferGeometry) {\n\t\tconst index_attrib = old_geometry.index;\n\t\tif (index_attrib != null) {\n\t\t\tconst old_indices = index_attrib.array;\n\n\t\t\tconst new_indices: number[] = [];\n\n\t\t\tlet old_index0: number;\n\t\t\tlet old_index1: number;\n\t\t\tlet old_index2: number;\n\t\t\tlet new_index0: number;\n\t\t\tlet new_index1: number;\n\t\t\tlet new_index2: number;\n\t\t\tfor (let i = 0; i < old_indices.length; i += 3) {\n\t\t\t\told_index0 = old_indices[i + 0];\n\t\t\t\told_index1 = old_indices[i + 1];\n\t\t\t\told_index2 = old_indices[i + 2];\n\t\t\t\tnew_index0 = new_index_by_old_index[old_index0];\n\t\t\t\tnew_index1 = new_index_by_old_index[old_index1];\n\t\t\t\tnew_index2 = new_index_by_old_index[old_index2];\n\t\t\t\tif (new_index0 != null && new_index1 != null && new_index2 != null) {\n\t\t\t\t\tnew_indices.push(new_index0);\n\t\t\t\t\tnew_indices.push(new_index1);\n\t\t\t\t\tnew_indices.push(new_index2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new_indices;\n\t\t}\n\t}\n}\n\nconst _v3 = new Vector3();\nconst STRIDE = 3;\nexport const threeMeshFromPrimitives: ObjectBuilder<CoreObjectType.THREEJS> = (\n\tobject: ObjectContent<CoreObjectType.THREEJS>,\n\tentities: CoreEntity[]\n) => {\n\tconst mesh = object as ObjectContent<CoreObjectType.THREEJS> as Mesh;\n\tconst geometry = mesh.geometry;\n\tif (!geometry) {\n\t\treturn undefined;\n\t}\n\tconst oldIndex = geometry.getIndex();\n\tif (!oldIndex) {\n\t\treturn undefined;\n\t}\n\tconst oldIndexArray = oldIndex.array;\n\n\tconst primitives = entities as ThreejsPrimitiveTriangle[];\n\n\tconst newIndices = new Array(primitives.length * STRIDE);\n\n\tlet i = 0;\n\tfor (const primitive of primitives) {\n\t\t_v3.fromArray(oldIndexArray, primitive.index() * STRIDE);\n\t\t_v3.toArray(newIndices, i * STRIDE);\n\t\ti++;\n\t}\n\tgeometry.setIndex(newIndices);\n\n\treturn mesh;\n};\n","import {Vector3, BufferGeometry, Float32BufferAttribute} from 'three';\nimport {BaseCorePoint} from '../../../entities/point/CorePoint';\nimport {uniqWithoutPreservingOrder, arrayCompact} from '../../../../ArrayUtils';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\nimport {CoreObjectType, ObjectContent} from '../../../ObjectContent';\n\nexport abstract class CoreGeometryBuilderBase {\n\tfromPoints<T extends CoreObjectType>(object: ObjectContent<T>, points: BaseCorePoint[]): BufferGeometry {\n\t\tpoints = this._filterPoints(points);\n\t\tconst geometry = new BufferGeometry();\n\t\t// const coreGeometry = new CoreGeometry(geometry);\n\n\t\tconst firstPoint = points[0];\n\t\tif (!firstPoint) {\n\t\t\treturn geometry;\n\t\t}\n\t\tconst oldGeometry = firstPoint.geometry();\n\t\tif (!oldGeometry) {\n\t\t\treturn geometry;\n\t\t}\n\n\t\t// index\n\t\tconst new_index_by_old_index: PolyDictionary<number> = {};\n\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\tnew_index_by_old_index[points[i].index()] = i;\n\t\t}\n\n\t\tconst indices = this._indicesFromPoints(new_index_by_old_index, oldGeometry);\n\t\tif (indices) {\n\t\t\tgeometry.setIndex(indices);\n\t\t}\n\n\t\t// attributes\n\t\tconst {attributes} = oldGeometry;\n\t\t// const new_attributes = {}\n\t\tfor (const attribute_name of Object.keys(attributes)) {\n\t\t\tconst attrib_values = firstPoint.userDataAttribs()[attribute_name];\n\t\t\tconst is_attrib_indexed = attrib_values != null;\n\n\t\t\tif (is_attrib_indexed) {\n\t\t\t\tconst new_values: string[] = [];\n\t\t\t\tconst uniqValues: string[] = [];\n\t\t\t\tuniqWithoutPreservingOrder(\n\t\t\t\t\tpoints.map((point) => point.indexedAttribValue(attribute_name)),\n\t\t\t\t\tuniqValues\n\t\t\t\t);\n\t\t\t\tarrayCompact(uniqValues, new_values);\n\t\t\t\tconst new_index_by_value: PolyDictionary<number> = {};\n\t\t\t\tnew_values.forEach((new_value, i) => (new_index_by_value[new_value] = i));\n\n\t\t\t\tfirstPoint.userDataAttribs()[attribute_name] = new_values;\n\n\t\t\t\t// const old_attrib = old_geometry.getAttribute(attribute_name)\n\t\t\t\t// const old_attrib_array = old_attrib.array\n\t\t\t\tconst new_attrib_indices = [];\n\t\t\t\tfor (const point of points) {\n\t\t\t\t\t// const old_index = old_attrib_array[point.index()]\n\t\t\t\t\tconst oldIndex = point.indexedAttribValue(attribute_name);\n\t\t\t\t\tif (oldIndex) {\n\t\t\t\t\t\tconst new_index = new_index_by_value[oldIndex];\n\t\t\t\t\t\tnew_attrib_indices.push(new_index);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute(attribute_name, new Float32BufferAttribute(new_attrib_indices, 1));\n\t\t\t} else {\n\t\t\t\tconst attrib_size = attributes[attribute_name].itemSize;\n\t\t\t\tconst values: number[] = new Array(points.length * attrib_size);\n\t\t\t\tswitch (attrib_size) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\t\t\t\tvalues[i] = points[i].attribValue(attribute_name) as number;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tlet value: Vector3;\n\t\t\t\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\t\t\t\tvalue = points[i].attribValue(attribute_name) as Vector3;\n\t\t\t\t\t\t\tvalue.toArray(values, i * attrib_size);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute(attribute_name, new Float32BufferAttribute(values, attrib_size));\n\t\t\t}\n\t\t}\n\t\treturn geometry;\n\t}\n\n\tprotected abstract _filterPoints(points: BaseCorePoint[]): BaseCorePoint[];\n\tprotected abstract _indicesFromPoints(\n\t\tnew_index_by_old_index: PolyDictionary<number>,\n\t\told_geometry: BufferGeometry\n\t): number[] | undefined;\n}\n","import {BufferGeometry} from 'three';\nimport {CoreGeometryBuilderBase} from './_Base';\nimport {BaseCorePoint} from '../../../entities/point/CorePoint';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\n\nexport class CoreGeometryBuilderLineSegments extends CoreGeometryBuilderBase {\n\tprotected _filterPoints(points: BaseCorePoint[]): BaseCorePoint[] {\n\t\t// ensures we only keep points that form a full segment.\n\t\t// if a single point from a segment is discarded, we remove both\n\n\t\tconst firstPoint = points[0];\n\t\tif (!firstPoint) {\n\t\t\treturn [];\n\t\t}\n\t\tconst geometry = firstPoint.geometry();\n\t\tif (!geometry) {\n\t\t\treturn [];\n\t\t}\n\t\tconst indices = geometry.getIndex()?.array;\n\t\tif (!indices) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst points_by_index: PolyDictionary<BaseCorePoint> = {};\n\t\tfor (const point of points) {\n\t\t\tpoints_by_index[point.index()] = point;\n\t\t}\n\t\tconst filteredPoints: BaseCorePoint[] = [];\n\n\t\tconst index_length = indices.length;\n\t\tfor (let i = 0; i < index_length; i += 2) {\n\t\t\tconst pt0 = points_by_index[indices[i + 0]];\n\t\t\tconst pt1 = points_by_index[indices[i + 1]];\n\t\t\tif (pt0 && pt1) {\n\t\t\t\tfilteredPoints.push(pt0);\n\t\t\t\tfilteredPoints.push(pt1);\n\t\t\t}\n\t\t}\n\n\t\treturn filteredPoints;\n\t}\n\n\tprotected _indicesFromPoints(new_index_by_old_index: PolyDictionary<number>, old_geometry: BufferGeometry) {\n\t\tconst index_attrib = old_geometry.index;\n\t\tif (index_attrib != null) {\n\t\t\tconst old_indices = index_attrib.array;\n\n\t\t\tconst new_indices: number[] = [];\n\n\t\t\tlet old_index0: number;\n\t\t\tlet old_index1: number;\n\t\t\tlet new_index0: number;\n\t\t\tlet new_index1: number;\n\t\t\tfor (let i = 0; i < old_indices.length; i += 2) {\n\t\t\t\told_index0 = old_indices[i];\n\t\t\t\told_index1 = old_indices[i + 1];\n\t\t\t\tnew_index0 = new_index_by_old_index[old_index0];\n\t\t\t\tnew_index1 = new_index_by_old_index[old_index1];\n\t\t\t\tif (new_index0 != null && new_index1 != null) {\n\t\t\t\t\tnew_indices.push(new_index0);\n\t\t\t\t\tnew_indices.push(new_index1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new_indices;\n\t\t}\n\t}\n}\n","import {BufferGeometry} from 'three';\nimport {CoreGeometryBuilderBase} from './_Base';\nimport {BaseCorePoint} from '../../../entities/point/CorePoint';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\n\nexport class CoreGeometryBuilderPoints extends CoreGeometryBuilderBase {\n\tprotected _filterPoints(points: BaseCorePoint[]) {\n\t\treturn points;\n\t}\n\n\tprotected _indicesFromPoints(new_index_by_old_index: PolyDictionary<number>, old_geometry: BufferGeometry) {\n\t\tconst index_attrib = old_geometry.index;\n\t\tif (index_attrib != null) {\n\t\t\tconst old_indices = index_attrib.array;\n\n\t\t\tconst new_indices: number[] = [];\n\n\t\t\tlet old_index: number;\n\t\t\tlet new_index: number;\n\t\t\tfor (let i = 0; i < old_indices.length; i++) {\n\t\t\t\told_index = old_indices[i];\n\t\t\t\tnew_index = new_index_by_old_index[old_index];\n\t\t\t\tif (new_index != null) {\n\t\t\t\t\tnew_indices.push(new_index);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new_indices;\n\t\t}\n\t}\n}\n","// import {TypeAssert} from '../../../engine/poly/Assert';\nimport {ObjectType} from '../../../Constant';\nimport {CoreGeometryBuilderLineSegments} from './LineSegments';\nimport {CoreGeometryBuilderMesh} from './Mesh';\nimport {CoreGeometryBuilderPoints} from './Points';\n\nexport function geometryBuilder(objectType: ObjectType) {\n\tswitch (objectType) {\n\t\tcase ObjectType.MESH:\n\t\t\treturn new CoreGeometryBuilderMesh();\n\t\tcase ObjectType.POINTS:\n\t\t\treturn new CoreGeometryBuilderPoints();\n\t\tcase ObjectType.LINE_SEGMENTS:\n\t\t\treturn new CoreGeometryBuilderLineSegments();\n\t\tcase ObjectType.OBJECT3D:\n\t\t\treturn null;\n\t\tcase ObjectType.GROUP:\n\t\t\treturn null;\n\t\t// case ObjectType.LOD:\n\t\t// \treturn null;\n\t}\n\treturn null;\n\t// TypeAssert.unreachable(objectType);\n}\n","import {Vector2, BufferGeometry, BufferAttribute} from 'three';\n\nconst stepSize = new Vector2();\nconst stepsCount = new Vector2();\nexport class CoreGeometryOperationHexagon {\n\tconstructor(private _size: Vector2, private _hexagonRadius: number, private _pointsOnly: boolean) {}\n\n\tprocess(): BufferGeometry {\n\t\tconst sideLength = this._hexagonRadius;\n\t\tconst halfSideLength = sideLength * 0.5;\n\t\tstepSize.set(sideLength, Math.cos(Math.PI / 6) * this._hexagonRadius);\n\t\tstepsCount.set(Math.floor(this._size.x / stepSize.x), Math.floor(this._size.y / stepSize.y));\n\t\tlet positions: number[] = [];\n\t\tlet indices: number[] = [];\n\t\tconst addIndices = !this._pointsOnly;\n\t\tfor (let y = 0; y < stepsCount.y; y++) {\n\t\t\tfor (let x = 0; x < stepsCount.x; x++) {\n\t\t\t\tpositions.push(\n\t\t\t\t\t-(this._size.x * 0.5) + x * stepSize.x + (y % 2 == 0 ? halfSideLength : 0),\n\t\t\t\t\t-(this._size.y * 0.5) + y * stepSize.y,\n\t\t\t\t\t0\n\t\t\t\t);\n\n\t\t\t\tif (addIndices) {\n\t\t\t\t\tif (y >= 1) {\n\t\t\t\t\t\tif (x == 0 || x == stepsCount.x - 1) {\n\t\t\t\t\t\t\tif (x == 0) {\n\t\t\t\t\t\t\t\t// indices.push(\n\t\t\t\t\t\t\t\t// \tx + 1 + (y - 1) * stepsCount.x,\n\t\t\t\t\t\t\t\t// \tx + y * stepsCount.x,\n\t\t\t\t\t\t\t\t// \tx + (y - 1) * stepsCount.x\n\t\t\t\t\t\t\t\t// );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// indices.push(\n\t\t\t\t\t\t\t\t// \tx + y * stepsCount.x,\n\t\t\t\t\t\t\t\t// \tx - 1 + y * stepsCount.x,\n\t\t\t\t\t\t\t\t// \tx + (y - 1) * stepsCount.x\n\t\t\t\t\t\t\t\t// );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (y % 2 == 0) {\n\t\t\t\t\t\t\t\tindices.push(\n\t\t\t\t\t\t\t\t\tx + y * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx - 1 + y * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx + (y - 1) * stepsCount.x\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tindices.push(\n\t\t\t\t\t\t\t\t\tx + y * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx + (y - 1) * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx + 1 + (y - 1) * stepsCount.x\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tindices.push(\n\t\t\t\t\t\t\t\t\tx + (y - 1) * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx + y * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx - 1 + (y - 1) * stepsCount.x\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tindices.push(\n\t\t\t\t\t\t\t\t\tx + 1 + y * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx + y * stepsCount.x,\n\t\t\t\t\t\t\t\t\tx + (y - 1) * stepsCount.x\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute('position', new BufferAttribute(new Float32Array(positions), 3));\n\n\t\tif (addIndices) {\n\t\t\tgeometry.setIndex(indices);\n\t\t\tgeometry.computeVertexNormals();\n\t\t}\n\n\t\treturn geometry;\n\t}\n}\n","import {\n\tVector2,\n\tVector3,\n\tVector4,\n\tBufferGeometry,\n\tBufferAttribute,\n\tRGBAFormat,\n\tFloatType,\n\tDataTexture,\n\tNearestFilter,\n\tRepeatWrapping,\n\tMesh,\n} from 'three';\nimport {nearestPower2} from '../../math/_Module';\nimport {CoreAttribute} from '../Attribute';\nimport {pointsCountFromObject} from '../entities/point/CorePointUtils';\n\nconst _textureSize = new Vector2();\nconst _v2 = new Vector2();\nconst _v3 = new Vector3();\nconst _v4 = new Vector4();\nfunction _vectorFromAttribSize(attribSize: number) {\n\tswitch (attribSize) {\n\t\tcase 2:\n\t\t\treturn _v2;\n\t\tcase 3:\n\t\t\treturn _v3;\n\t\tcase 4:\n\t\t\treturn _v4;\n\t}\n}\n\nexport enum AttribLookup {\n\tID = 'attribLookupId',\n\tUV = 'attribLookupUv',\n}\n\nconst dummyMesh = new Mesh();\nexport function textureFromAttributePointsCount(geometry: BufferGeometry): number {\n\tdummyMesh.geometry = geometry;\n\treturn pointsCountFromObject(dummyMesh);\n}\n\nexport function textureSizeFromPointsCount(geometry: BufferGeometry, target: Vector2): void {\n\t// const position = geometry.attributes.position;\n\t// if (!(position instanceof BufferAttribute)) {\n\t// \tconsole.warn('position is not a BufferAttribute');\n\t// \treturn;\n\t// }\n\t// const pointsCount = position.count;\n\tconst pointsCount = textureFromAttributePointsCount(geometry);\n\n\t// const autoTexturesSize = CoreParticlesAttribute.getAutoTextureSize(object);\n\t// CoreParticlesAttribute.getMaxTextureSize(object, _maxTexturesSize);\n\t// CoreParticlesAttribute.getTextureSize(object, _texturesSize);\n\n\t// // get texture size\n\t// if (isBooleanTrue(autoTexturesSize)) {\n\tconst nearestPowerOfTwo = nearestPower2(Math.sqrt(pointsCount));\n\ttarget.x = nearestPowerOfTwo; //Math.min(nearestPowerOfTwo, _maxTexturesSize.x);\n\ttarget.y = nearestPowerOfTwo; //Math.min(nearestPowerOfTwo, _maxTexturesSize.y);\n\t// const pointsCount = position.count;\n\t// return nearestPower2(Math.sqrt(pointsCount));\n\t// return Math.ceil(Math.sqrt(pointsCount));\n}\nexport function textureFromAttributesMissingAttributes(geometry: BufferGeometry, attribNames: string[]): string[] {\n\tconst missingAttributes: string[] = [];\n\n\tfor (const attribName of attribNames) {\n\t\tconst attributeName = CoreAttribute.remapName(attribName);\n\t\tconst attribute = geometry.getAttribute(attributeName) as BufferAttribute;\n\t\tif (!attribute) {\n\t\t\tmissingAttributes.push(attribName);\n\t\t}\n\t}\n\treturn missingAttributes;\n}\nexport function textureFromAttributesTotalAttribSizes(geometry: BufferGeometry, attribNames: string[]) {\n\tlet currentSize = 0;\n\n\tfor (const attribName of attribNames) {\n\t\tconst attributeName = CoreAttribute.remapName(attribName);\n\t\tconst attribute = geometry.getAttribute(attributeName) as BufferAttribute;\n\t\tif (attribute) {\n\t\t\tcurrentSize += attribute.itemSize;\n\t\t}\n\t}\n\treturn currentSize;\n}\n\nexport function textureFromAttributes(geometry: BufferGeometry, attribNames: string[]) {\n\ttextureSizeFromPointsCount(geometry, _textureSize);\n\tconst pointsCount = textureFromAttributePointsCount(geometry);\n\n\tconst width = _textureSize.x;\n\tconst height = _textureSize.y;\n\n\tconst size = width * height * 4;\n\tconst pixelBuffer = new Float32Array(size);\n\n\tlet currentIndex = 0;\n\tfor (let attribName of attribNames) {\n\t\tattribName = CoreAttribute.remapName(attribName);\n\t\tconst attribute = geometry.getAttribute(attribName) as BufferAttribute;\n\n\t\tif (attribute) {\n\t\t\tconst attribSize = attribute.itemSize;\n\t\t\tconst attribArray = attribute.array;\n\t\t\tif (attribSize == 1) {\n\t\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\t\tpixelBuffer[i * 4 + currentIndex] = attribArray[i];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst vector = _vectorFromAttribSize(attribSize);\n\t\t\t\tif (!vector) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\t\tvector.fromArray(attribArray, i * attribSize);\n\t\t\t\t\tvector.toArray(pixelBuffer, i * 4 + currentIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrentIndex += attribSize;\n\t\t}\n\t}\n\n\tconst texture = new DataTexture(pixelBuffer, width, height, RGBAFormat, FloatType);\n\ttexture.minFilter = texture.magFilter = NearestFilter;\n\ttexture.wrapS = texture.wrapT = RepeatWrapping;\n\ttexture.needsUpdate = true;\n\treturn texture;\n}\n\nexport function textureFromAttribLookupUv(geometry: BufferGeometry) {\n\tconst attribSize = 2;\n\tconst pointsCount = textureFromAttributePointsCount(geometry);\n\ttextureSizeFromPointsCount(geometry, _textureSize);\n\tconst uvSize = 2;\n\tconst values = new Array(pointsCount * uvSize);\n\n\tfor (let pointIndex = 0; pointIndex < pointsCount; pointIndex++) {\n\t\t_v2.x = pointIndex % _textureSize.x;\n\t\t_v2.y = Math.floor(pointIndex / _textureSize.x);\n\t\t_v2.addScalar(0.5);\n\t\t_v2.divide(_textureSize);\n\t\t_v2.toArray(values, pointIndex * uvSize);\n\t}\n\tconst uvArray = new Float32Array(values);\n\tgeometry.setAttribute(AttribLookup.UV, new BufferAttribute(uvArray, attribSize));\n}\nexport function textureFromAttribLookupId(geometry: BufferGeometry) {\n\tconst pointsCount = textureFromAttributePointsCount(geometry);\n\tconst idSize = 1;\n\tconst values = new Array(pointsCount * idSize);\n\tfor (let pointIndex = 0; pointIndex < pointsCount; pointIndex++) {\n\t\tvalues[pointIndex] = pointIndex;\n\t}\n\tconst idArray = new Float32Array(values);\n\tgeometry.setAttribute(AttribLookup.ID, new BufferAttribute(idArray, idSize));\n}\n","import {Shape, ShapeGeometry} from 'three';\nimport {mergeGeometries} from 'three/examples/jsm/utils/BufferGeometryUtils';\ninterface TextFlatsParams {\n\tshapes?: Array<Array<Shape>>;\n}\ninterface TextFlatParams {\n\tshapes?: Shape[];\n}\n\nexport function createGeometriesFromTypeFlat(params: TextFlatsParams) {\n\treturn params.shapes?.map((shapes) => createGeometryFromTypeFlat({shapes}));\n}\nfunction createGeometryFromTypeFlat(params: TextFlatParams) {\n\tconst geometries = params.shapes?.map((s) => new ShapeGeometry(s)) || [];\n\tif (geometries == null || geometries.length == 0) {\n\t\treturn;\n\t}\n\treturn mergeGeometries(geometries);\n}\n","import {BufferAttribute, BufferGeometry} from 'three';\nimport {rangeWithEnd} from '../../ArrayUtils';\n\nconst POSITION = 'position';\nexport class CoreGeometryIndexBuilder {\n\tstatic createIndexIfNone(geometry: BufferGeometry) {\n\t\tif (!geometry.index) {\n\t\t\tconst position = geometry.getAttribute(POSITION) as BufferAttribute;\n\t\t\tif (position) {\n\t\t\t\tconst position_array = position.array;\n\t\t\t\tgeometry.setIndex(rangeWithEnd(position_array.length / 3));\n\t\t\t}\n\t\t}\n\t}\n}\n","import {CoreGraphNode} from './CoreGraphNode';\nimport {Poly} from '../../engine/Poly';\nimport {Cooker} from '../../engine/scene/utils/Cooker';\n\nexport type PostDirtyHook = (caller?: CoreGraphNode) => void;\n\nexport class DirtyController {\n\tprivate _dirtyCount: number = 0;\n\tprivate _dirty: boolean = true;\n\tprivate _dirtyTimestamp: number | undefined;\n\tprivate _cooker: Cooker;\n\t// hooks\n\tprivate _postDirtyHooks: PostDirtyHook[] | undefined;\n\tprivate _postDirtyHookNames: string[] | undefined;\n\n\tconstructor(private node: CoreGraphNode) {\n\t\tthis._cooker = node.scene().cooker;\n\t}\n\n\tdispose() {\n\t\tthis._postDirtyHooks = undefined;\n\t\tthis._postDirtyHookNames = undefined;\n\t}\n\n\tisDirty(): boolean {\n\t\treturn this._dirty === true;\n\t}\n\tdirtyTimestamp() {\n\t\treturn this._dirtyTimestamp;\n\t}\n\tdirtyCount(): number {\n\t\treturn this._dirtyCount;\n\t}\n\thasPostDirtyHooks(): boolean {\n\t\treturn this._postDirtyHookNames != null && this._postDirtyHookNames.length > 0;\n\t}\n\taddPostDirtyHook(name: string, method: PostDirtyHook) {\n\t\tthis._postDirtyHookNames = this._postDirtyHookNames || [];\n\t\tthis._postDirtyHooks = this._postDirtyHooks || [];\n\n\t\tif (!this._postDirtyHookNames.includes(name)) {\n\t\t\tthis._postDirtyHookNames.push(name);\n\t\t\tthis._postDirtyHooks.push(method);\n\t\t} else {\n\t\t\tconsole.warn(`hook with name ${name} already exists`, this.node);\n\t\t}\n\t}\n\tremovePostDirtyHook(name: string) {\n\t\tif (this._postDirtyHookNames && this._postDirtyHooks) {\n\t\t\tconst index = this._postDirtyHookNames.indexOf(name);\n\t\t\tif (index >= 0) {\n\t\t\t\tthis._postDirtyHookNames.splice(index, 1);\n\t\t\t\tthis._postDirtyHooks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\thasHook(name: string): boolean {\n\t\tif (this._postDirtyHookNames) {\n\t\t\treturn this._postDirtyHookNames.includes(name);\n\t\t}\n\t\treturn false;\n\t}\n\n\tremoveDirtyState(): void {\n\t\tthis._dirty = false;\n\t}\n\n\tsetDirty(originalTriggerGraphNode?: CoreGraphNode | null, propagate: boolean = true): void {\n\t\tif (originalTriggerGraphNode == null) {\n\t\t\toriginalTriggerGraphNode = this.node;\n\t\t}\n\t\tif (originalTriggerGraphNode == this.node && this.node.selfDirtyForbidden()) {\n\t\t\treturn;\n\t\t}\n\t\tthis._dirty = true;\n\t\tthis._dirtyTimestamp = Poly.performance.performanceManager().now();\n\t\tthis._dirtyCount += 1;\n\n\t\tthis.runPostDirtyHooks(originalTriggerGraphNode);\n\n\t\tif (propagate === true) {\n\t\t\tthis.setSuccessorsDirty(originalTriggerGraphNode);\n\t\t}\n\t}\n\n\trunPostDirtyHooks(originalTriggerGraphNode?: CoreGraphNode) {\n\t\tif (this._postDirtyHooks == null || this._postDirtyHooks.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._cooker.blocked()) {\n\t\t\tthis._cooker.enqueue(this.node, originalTriggerGraphNode);\n\t\t} else {\n\t\t\tfor (const hook of this._postDirtyHooks) {\n\t\t\t\thook(originalTriggerGraphNode);\n\t\t\t}\n\t\t}\n\t}\n\n\tsetSuccessorsDirty(originalTriggerGraphNode?: CoreGraphNode): void {\n\t\tif (originalTriggerGraphNode == null) {\n\t\t\toriginalTriggerGraphNode = this.node;\n\t\t}\n\n\t\tthis._cooker.block();\n\n\t\tconst allSuccessors = this.node.graphAllSuccessors();\n\t\tfor (const successor of allSuccessors) {\n\t\t\tsuccessor.dirtyController.setDirty(originalTriggerGraphNode, false);\n\t\t}\n\t\tthis._cooker.unblock();\n\t}\n}\n","import {CoreGraph, CoreGraphNodeId} from './CoreGraph';\nimport {DirtyController, PostDirtyHook} from './DirtyController';\nimport {PolyScene} from '../../engine/scene/PolyScene';\n\n/**\n *\n *\n * This is the base class for nodes and params, which are part of the same graph, and are connected to dependencies.\n *\n */\nexport class CoreGraphNode {\n\tprivate _graph: CoreGraph;\n\tprivate _graphNodeId: CoreGraphNodeId;\n\tprivate _dirtyController: DirtyController = new DirtyController(this);\n\tprivate _allPredecessors: CoreGraphNode[] = [];\n\tprivate _allSuccessors: CoreGraphNode[] = [];\n\tprivate _allPredecessorsDirty = true;\n\tprivate _allSuccessorsDirty = true;\n\tconstructor(protected _scene: PolyScene, protected _name: string) {\n\t\tthis._graphNodeId = _scene.graph.nextId();\n\t\t_scene.graph.addNode(this);\n\t\tthis._graph = _scene.graph;\n\t}\n\n\tprivate _disposed = false;\n\tdispose() {\n\t\tthis._dirtyController.dispose();\n\t\tthis._allPredecessors.length = 0;\n\t\tthis._allSuccessors.length = 0;\n\t\tthis.graphRemove();\n\t\tthis._disposed = true;\n\t}\n\tdisposed() {\n\t\treturn this._disposed;\n\t}\n\n\t/**\n\t * returns the name\n\t *\n\t */\n\tname(): string {\n\t\treturn this._name;\n\t}\n\tsetName(name: string) {\n\t\tthis._name = name;\n\t}\n\n\t/**\n\t * returns the scene\n\t *\n\t */\n\tscene(): PolyScene {\n\t\treturn this._scene;\n\t}\n\t/**\n\t * returns the id, which is unique for the scene\n\t *\n\t */\n\tgraphNodeId(): CoreGraphNodeId {\n\t\treturn this._graphNodeId;\n\t}\n\n\t//\n\t//\n\t// DIRTY CONTROLLER\n\t//\n\t//\n\tget dirtyController() {\n\t\treturn this._dirtyController;\n\t}\n\t/**\n\t * makes the graphNode dirty, which in turns makes its dependencies dirty\n\t *\n\t */\n\tsetDirty(trigger?: CoreGraphNode | null) {\n\t\ttrigger = trigger || this;\n\t\tthis._dirtyController.setDirty(trigger);\n\t}\n\t/**\n\t * makes dependencies dirty\n\t *\n\t */\n\tsetSuccessorsDirty(trigger?: CoreGraphNode) {\n\t\tthis._dirtyController.setSuccessorsDirty(trigger);\n\t}\n\t/**\n\t * removes the dirty state\n\t *\n\t */\n\tremoveDirtyState() {\n\t\tthis._dirtyController.removeDirtyState();\n\t}\n\tisDirty() {\n\t\treturn this._dirtyController.isDirty();\n\t}\n\t/**\n\t * adds a callback that gets run when the graphNode is dirty\n\t *\n\t */\n\taddPostDirtyHook(name: string, callback: PostDirtyHook) {\n\t\tthis._dirtyController.addPostDirtyHook(name, callback);\n\t}\n\tremovePostDirtyHook(name: string) {\n\t\tthis._dirtyController.removePostDirtyHook(name);\n\t}\n\n\t//\n\t//\n\t// GRAPH\n\t//\n\t//\n\n\tgraphRemove() {\n\t\tthis._graph.removeNode(this);\n\t}\n\n\taddGraphInput(src: CoreGraphNode, checkCycle = true): boolean {\n\t\treturn this._graph.connect(src, this, checkCycle);\n\t}\n\tremoveGraphInput(src: CoreGraphNode) {\n\t\tthis._graph.disconnect(src, this);\n\t}\n\n\tgraphDisconnectPredecessors() {\n\t\tthis._graph.disconnectPredecessors(this);\n\t}\n\tgraphDisconnectSuccessors() {\n\t\tthis._graph.disconnectSuccessors(this);\n\t}\n\n\tgraphPredecessorIds(): Readonly<CoreGraphNodeId[]> | undefined {\n\t\treturn this._graph.predecessorIds(this._graphNodeId);\n\t}\n\tgraphPredecessors(): Readonly<CoreGraphNode[]> | undefined {\n\t\treturn this._graph.predecessors(this);\n\t}\n\tgraphSuccessorIds(): Readonly<CoreGraphNodeId[]> | undefined {\n\t\treturn this._graph.successorIds(this._graphNodeId);\n\t}\n\tgraphSuccessors(): Readonly<CoreGraphNode[]> | undefined {\n\t\treturn this._graph.successors(this);\n\t}\n\tprivate _clearAllPredecessors() {\n\t\tthis._allPredecessorsDirty = true;\n\t}\n\tprivate _clearAllSuccessors() {\n\t\tthis._allSuccessorsDirty = true;\n\t}\n\tgraphAllPredecessors(): Readonly<CoreGraphNode[]> {\n\t\tif (this._allPredecessorsDirty) {\n\t\t\tthis._graph.allPredecessors(this, this._allPredecessors);\n\t\t\tthis._allPredecessorsDirty = false;\n\t\t}\n\t\treturn this._allPredecessors;\n\t\t// return Object.freeze([...this._allPredecessors]);\n\t}\n\tgraphAllSuccessors(): Readonly<CoreGraphNode[]> {\n\t\tif (this._allSuccessorsDirty) {\n\t\t\tthis._graph.allSuccessors(this, this._allSuccessors);\n\t\t\tthis._allSuccessorsDirty = false;\n\t\t}\n\t\treturn this._allSuccessors;\n\t\t// return Object.freeze([...this._allSuccessors]);\n\t}\n\thasPredecessor(node: CoreGraphNode): boolean {\n\t\treturn this.graphAllPredecessors().includes(node);\n\t}\n\tclearCachesWithPredecessorsAndSuccessors() {\n\t\tconst allPredecessors = this.graphAllPredecessors();\n\t\tconst allSuccessors = this.graphAllSuccessors();\n\t\tfor (const predecessor of allPredecessors) {\n\t\t\tpredecessor._clearAllSuccessors();\n\t\t}\n\t\tfor (const successor of allSuccessors) {\n\t\t\tsuccessor._clearAllPredecessors();\n\t\t}\n\t\tthis._clearAllPredecessors();\n\t\tthis._clearAllSuccessors();\n\t}\n\t//\n\tsetForbiddenTriggerNodes(nodes: CoreGraphNode | CoreGraphNode[]) {\n\t\tthis._graph.setForbiddenTriggerNodes(this, nodes);\n\t\tthis._clearAllSuccessors();\n\t}\n\tclearForbiddenTriggerNodes() {\n\t\tthis._graph.clearForbiddenTriggerNodes(this);\n\t\tthis._clearAllSuccessors();\n\t}\n\tsetSelfDirtyForbidden(state: boolean) {\n\t\tthis._graph.setSelfDirtyForbidden(this, state);\n\t}\n\tselfDirtyForbidden(): boolean {\n\t\treturn this._graph.selfDirtyForbidden(this);\n\t}\n}\n","import {\n\tBufferAttribute,\n\tCamera,\n\tPerspectiveCamera,\n\tVector3,\n\tLineSegments,\n\tColor,\n\tLineBasicMaterial,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n} from 'three';\nimport {PolyDictionary} from '../../types/GlobalTypes';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new PerspectiveCamera();\n\n/*\nThe CameraHelper is a modified version of the one shipped with Three.js.\nThe only modification is that the line\n\nthis.matrix = camera.matrixWorld;\n\nhas been commented out.\n*/\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n */\n\ntype PointMap = PolyDictionary<number[]>;\n\nfunction _createGeometry() {\n\tconst geometry = new BufferGeometry();\n\tconst colorFrustum = new Color(0xffaa00);\n\tconst colorCone = new Color(0xff0000);\n\tconst colorUp = new Color(0x00aaff);\n\tconst colorTarget = new Color(0xffffff);\n\tconst colorCross = new Color(0x333333);\n\n\tconst vertices: number[] = [];\n\tconst colors: number[] = [];\n\n\tconst pointMap: PointMap = {};\n\tfunction addLine(a: string, b: string, color: Color) {\n\t\taddPoint(a, color);\n\t\taddPoint(b, color);\n\t}\n\tfunction addPoint(id: string, color: Color) {\n\t\tvertices.push(0, 0, 0);\n\t\tcolors.push(color.r, color.g, color.b);\n\n\t\tif (pointMap[id] === undefined) {\n\t\t\tpointMap[id] = [];\n\t\t}\n\n\t\tpointMap[id].push(vertices.length / 3 - 1);\n\t}\n\n\t// near\n\n\taddLine('n1', 'n2', colorFrustum);\n\taddLine('n2', 'n4', colorFrustum);\n\taddLine('n4', 'n3', colorFrustum);\n\taddLine('n3', 'n1', colorFrustum);\n\n\t// far\n\n\taddLine('f1', 'f2', colorFrustum);\n\taddLine('f2', 'f4', colorFrustum);\n\taddLine('f4', 'f3', colorFrustum);\n\taddLine('f3', 'f1', colorFrustum);\n\n\t// sides\n\n\taddLine('n1', 'f1', colorFrustum);\n\taddLine('n2', 'f2', colorFrustum);\n\taddLine('n3', 'f3', colorFrustum);\n\taddLine('n4', 'f4', colorFrustum);\n\n\t// cone\n\n\taddLine('p', 'n1', colorCone);\n\taddLine('p', 'n2', colorCone);\n\taddLine('p', 'n3', colorCone);\n\taddLine('p', 'n4', colorCone);\n\n\t// up\n\n\taddLine('u1', 'u2', colorUp);\n\taddLine('u2', 'u3', colorUp);\n\taddLine('u3', 'u1', colorUp);\n\n\t// target\n\n\taddLine('c', 't', colorTarget);\n\taddLine('p', 'c', colorCross);\n\n\t// cross\n\n\taddLine('cn1', 'cn2', colorCross);\n\taddLine('cn3', 'cn4', colorCross);\n\n\taddLine('cf1', 'cf2', colorCross);\n\taddLine('cf3', 'cf4', colorCross);\n\n\tgeometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n\tgeometry.setAttribute('color', new Float32BufferAttribute(colors, 3));\n\n\treturn {geometry, pointMap};\n}\nfunction _createMaterial() {\n\treturn new LineBasicMaterial({color: 0xffffff, vertexColors: true, toneMapped: false});\n}\n\nclass CameraHelper extends LineSegments {\n\tpublic readonly camera: Camera;\n\tprivate _pointMap: PointMap = {};\n\tconstructor(camera: Camera) {\n\t\tsuper();\n\t\tthis.camera = camera;\n\t\tif ((this.camera as PerspectiveCamera).updateProjectionMatrix) {\n\t\t\t(this.camera as PerspectiveCamera).updateProjectionMatrix();\n\t\t}\n\n\t\tthis.name = 'CameraHelper';\n\t\t(this as any).type = 'CameraHelper';\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tconst {geometry, pointMap} = _createGeometry();\n\t\tthis.geometry = geometry;\n\t\tthis._pointMap = pointMap;\n\n\t\tthis.material = _createMaterial();\n\t}\n\t// private setCamera(camera: Camera) {\n\t// \tthis._camera = camera;\n\t// \tif ((this._camera as PerspectiveCamera).updateProjectionMatrix) {\n\t// \t\t(this._camera as PerspectiveCamera).updateProjectionMatrix();\n\t// \t}\n\t// \tthis.update();\n\t// }\n\n\toverride clone() {\n\t\tconst helper = new CameraHelper(this.camera);\n\t\treturn helper as this;\n\t}\n\n\tupdate() {\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this._pointMap;\n\n\t\tconst w = 1,\n\t\t\th = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);\n\n\t\t// center / target\n\n\t\tsetPoint('c', pointMap, geometry, _camera, 0, 0, -1);\n\t\tsetPoint('t', pointMap, geometry, _camera, 0, 0, 1);\n\n\t\t// near\n\n\t\tsetPoint('n1', pointMap, geometry, _camera, -w, -h, -1);\n\t\tsetPoint('n2', pointMap, geometry, _camera, w, -h, -1);\n\t\tsetPoint('n3', pointMap, geometry, _camera, -w, h, -1);\n\t\tsetPoint('n4', pointMap, geometry, _camera, w, h, -1);\n\n\t\t// far\n\n\t\tsetPoint('f1', pointMap, geometry, _camera, -w, -h, 1);\n\t\tsetPoint('f2', pointMap, geometry, _camera, w, -h, 1);\n\t\tsetPoint('f3', pointMap, geometry, _camera, -w, h, 1);\n\t\tsetPoint('f4', pointMap, geometry, _camera, w, h, 1);\n\n\t\t// up\n\n\t\tsetPoint('u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, -1);\n\t\tsetPoint('u2', pointMap, geometry, _camera, -w * 0.7, h * 1.1, -1);\n\t\tsetPoint('u3', pointMap, geometry, _camera, 0, h * 2, -1);\n\n\t\t// cross\n\n\t\tsetPoint('cf1', pointMap, geometry, _camera, -w, 0, 1);\n\t\tsetPoint('cf2', pointMap, geometry, _camera, w, 0, 1);\n\t\tsetPoint('cf3', pointMap, geometry, _camera, 0, -h, 1);\n\t\tsetPoint('cf4', pointMap, geometry, _camera, 0, h, 1);\n\n\t\tsetPoint('cn1', pointMap, geometry, _camera, -w, 0, -1);\n\t\tsetPoint('cn2', pointMap, geometry, _camera, w, 0, -1);\n\t\tsetPoint('cn3', pointMap, geometry, _camera, 0, -h, -1);\n\t\tsetPoint('cn4', pointMap, geometry, _camera, 0, h, -1);\n\n\t\tgeometry.getAttribute('position').needsUpdate = true;\n\t}\n}\n\nfunction setPoint(\n\tpoint: string,\n\tpointMap: PointMap,\n\tgeometry: BufferGeometry,\n\tcamera: Camera,\n\tx: number,\n\ty: number,\n\tz: number\n) {\n\t_vector.set(x, y, z).unproject(camera);\n\n\tconst points = pointMap[point];\n\n\tif (points !== undefined) {\n\t\tconst position = geometry.getAttribute('position') as BufferAttribute;\n\n\t\tfor (let i = 0, l = points.length; i < l; i++) {\n\t\t\tposition.setXYZ(points[i], _vector.x, _vector.y, _vector.z);\n\t\t}\n\t}\n}\n\nexport {CameraHelper};\n","import {CubicBezierCurve, LineCurve} from 'three';\nexport interface KeyframeTangent {\n\tslope: number;\n\taccel: number;\n}\n\nexport interface SearchRange {\n\tmin: number;\n\tmax: number;\n}\n\nexport interface KeyframeData {\n\tpos: number;\n\tvalue: number;\n\tin: KeyframeTangent;\n\tout?: KeyframeTangent;\n}\n\nexport enum ChannelInterpolation {\n\tLINEAR = 'linear',\n\tCUBIC = 'cubic',\n}\n\nexport type ChannelData = {\n\tkeyframes: KeyframeData[];\n\tinterpolation: ChannelInterpolation;\n};\nexport type ChannelDataByName = Record<string, ChannelData>;\n\nexport type InterpolationCurve = CubicBezierCurve | LineCurve;\nexport type SetCurveCallback = (keyframeStart: KeyframeData, keyframeEnd: KeyframeData) => void;\nexport type GetValueCallback = (pos: number) => number;\n","import {ChannelData, ChannelInterpolation} from './KeyframeCommon';\n\nconst SAMPLE_DATA0: ChannelData = {\n\tkeyframes: [\n\t\t{\n\t\t\tpos: 0,\n\t\t\tvalue: 0,\n\t\t\tin: {slope: 0, accel: 20},\n\t\t},\n\t\t{\n\t\t\tpos: 100,\n\t\t\tvalue: 1,\n\t\t\tin: {slope: 0, accel: 20},\n\t\t},\n\t\t{\n\t\t\tpos: 200,\n\t\t\tvalue: 0,\n\t\t\tin: {slope: 0, accel: 20},\n\t\t},\n\t],\n\tinterpolation: ChannelInterpolation.CUBIC,\n};\nconst SAMPLE_DATA: ChannelData[] = [SAMPLE_DATA0];\n\nexport function sampleData0() {\n\treturn JSON.parse(JSON.stringify(SAMPLE_DATA0)) as ChannelData;\n}\nexport function sampleData() {\n\treturn JSON.parse(JSON.stringify(SAMPLE_DATA)) as ChannelData[];\n}\n","import {isArray} from '../Type';\nimport {ChannelData, KeyframeData} from './KeyframeCommon';\nimport {createKeyframeTangent, copyKeyframeTangent} from './KeyframeTangent';\n\nexport function createKeyframeData(): KeyframeData {\n\treturn {pos: 0, value: 0, in: {slope: 0, accel: 0}};\n}\n\nexport function channelDataFromString(content: string, target: ChannelData[]) {\n\ttry {\n\t\tlet json = JSON.parse(content);\n\t\tif (isArray(json)) {\n\t\t\tlet i = 0;\n\t\t\tfor (const targetSubElement of target) {\n\t\t\t\tconst jsonElement = json[i] || json[0];\n\t\t\t\tcopyChannelData(jsonElement, targetSubElement);\n\t\t\t\ti++;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const targetSubElement of target) {\n\t\t\t\tcopyChannelData(json, targetSubElement);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn('invalid channel data');\n\t\tconsole.log(e);\n\t\tconsole.log(target);\n\t}\n}\n\nexport function channelDataToString(data: ChannelData[]): string {\n\tif (data.length == 1) {\n\t\treturn JSON.stringify(data[0]);\n\t}\n\treturn JSON.stringify(data);\n}\n\nexport function copyKeyframeData(src: KeyframeData, target: KeyframeData) {\n\ttarget.pos = src.pos;\n\ttarget.value = src.value;\n\tcopyKeyframeTangent(src.in, target.in);\n\tif (src.out) {\n\t\tif (!target.out) {\n\t\t\ttarget.out = createKeyframeTangent();\n\t\t}\n\t\tcopyKeyframeTangent(src.out, target.out);\n\t} else {\n\t\tdelete target.out;\n\t}\n}\n\nexport function copyChannelData(src: ChannelData, target: ChannelData) {\n\ttarget.interpolation = src.interpolation;\n\n\t// remove non existing keys\n\ttarget.keyframes.splice(src.keyframes.length, target.keyframes.length);\n\n\tconst srcKeyframes = src.keyframes;\n\tlet i = 0;\n\tfor (const srcKeyframe of srcKeyframes) {\n\t\tlet targetKeyframe = target.keyframes[i];\n\t\tif (!targetKeyframe) {\n\t\t\ttargetKeyframe = createKeyframeData();\n\t\t\ttarget.keyframes[i] = targetKeyframe;\n\t\t}\n\t\tcopyKeyframeData(srcKeyframe, targetKeyframe);\n\n\t\ti++;\n\t}\n}\n\n// function copyChannelsData(src: ChannelsData, target: ChannelsData) {\n// \t// const data: ChannelsData = {};\n// \tconst existingChannelNames = Object.keys(target);\n// \tfor (const channelName of existingChannelNames) {\n// \t\tdelete target[channelName];\n// \t}\n\n// \tconst channelNames = Object.keys(src);\n// \tfor (const channelName of channelNames) {\n// \t\tconst targetChannelData: ChannelData = {keyframes: [], interpolation: src[channelName].interpolation};\n// \t\tcopyChannelData(src[channelName], targetChannelData);\n// \t\ttarget[channelName] = targetChannelData;\n// \t}\n// }\n","import {KeyframeTangent, KeyframeData} from './KeyframeCommon';\nimport {Vector2} from 'three';\n\nexport function createKeyframeTangent(): KeyframeTangent {\n\treturn {slope: 0, accel: 0};\n}\nexport function getTangent(keyframe: KeyframeData, isInTangent: boolean): KeyframeTangent {\n\tif (isInTangent) {\n\t\treturn keyframe.in;\n\t} else {\n\t\treturn keyframe.out || keyframe.in;\n\t}\n}\n\nexport function keyframeTangentToEndPoint(keyframe: KeyframeData, isInTangent: boolean, target: Vector2) {\n\tconst tangent = getTangent(keyframe, isInTangent);\n\tconst angle = Math.asin(tangent.slope);\n\ttarget.x = Math.cos(angle) * tangent.accel;\n\ttarget.y = Math.sin(angle) * tangent.accel;\n}\nexport function endPointToKeyframeTangent(endPoint: Vector2, isInTangent: boolean, target: KeyframeTangent) {\n\tconst angle = endPoint.angle();\n\ttarget.slope = Math.sin(angle);\n\ttarget.accel = endPoint.length();\n}\n\nexport function keyframeTangentSplit(keyframe: KeyframeData) {\n\tif (!keyframe.out) {\n\t\tkeyframe.out = createKeyframeTangent();\n\t}\n\tcopyKeyframeTangent(keyframe.in, keyframe.out);\n}\nexport function keyframeTangentMerge(keyframe: KeyframeData) {\n\tconst _in = keyframe.in;\n\tconst _out = keyframe.out;\n\tif (!_out) {\n\t\treturn;\n\t}\n\tkeyframe.in.slope = (_in.slope + _out.slope) * 0.5;\n\tkeyframe.in.accel = (_in.accel + _out.accel) * 0.5;\n\tdelete keyframe.out;\n}\n\nexport function copyKeyframeTangent(src: KeyframeTangent, target: KeyframeTangent) {\n\ttarget.slope = src.slope;\n\ttarget.accel = src.accel;\n}\nexport function lerpKeyframeTangents(t1: KeyframeTangent, t2: KeyframeTangent, lerp: number, target: KeyframeTangent) {\n\ttarget.slope = t1.slope * (1 - lerp) + t2.slope * lerp;\n\ttarget.accel = t1.accel * (1 - lerp) + t2.accel * lerp;\n}\n","export enum LightUserDataRaymarching {\n\tPENUMBRA = 'raymarchingPenumbra',\n\tSHADOW_BIAS_ANGLE = 'raymarchingShadowBiasAngle',\n\tSHADOW_BIAS_DISTANCE = 'raymarchingShadowBiasDistance',\n}\n","import {CameraHelper} from './CameraHelper';\nexport class CoreCameraHelper extends CameraHelper {\n\toverride clone(recursive?: boolean): this {\n\t\treturn new CameraHelper(this.camera).copy(this, recursive) as this;\n\t}\n}\n","import {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {Constructor, Number3} from '../../types/GlobalTypes';\n// import {ColorConversion} from '../Color';\nimport {\n\tGroup,\n\tMesh,\n\tColor,\n\tVector2,\n\tDirectionalLight,\n\tLineBasicMaterial,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLine,\n} from 'three';\nimport {DefaultOperationParams} from '../operations/_Base';\n// import {CameraHelper} from 'three';\nimport {CoreCameraHelper} from '../helpers/CoreCameraHelper';\nimport {ObjectType, registerObjectType} from '../geometry/Constant';\nexport interface DirectionalLightParams extends DefaultOperationParams {\n\tcolor: Color;\n\tintensity: number;\n\tdistance: number;\n\t//\n\tshowHelper: boolean;\n\tname: string;\n\t//\n\tcastShadow: boolean;\n\tshadowAutoUpdate: boolean;\n\tshadowUpdateOnNextRender: boolean;\n\tshadowRes: Vector2;\n\tshadowSize: Vector2;\n\tshadowBias: number;\n\tshadowRadius: number;\n\t// debugShadow: boolean; // removed (see spotlight for explanation)\n\t//\n\traymarchingPenumbra: number;\n\traymarchingShadowBiasAngle: number;\n\traymarchingShadowBiasDistance: number;\n}\n\nexport const DEFAULT_DIRECTIONAL_LIGHT_PARAMS: DirectionalLightParams = {\n\tcolor: new Color(1, 1, 1),\n\tintensity: 1,\n\tdistance: 100,\n\t//\n\tshowHelper: false,\n\tname: 'directionalLight',\n\t//\n\tcastShadow: false,\n\tshadowAutoUpdate: true,\n\tshadowUpdateOnNextRender: false,\n\tshadowRes: new Vector2(1024, 1024),\n\tshadowSize: new Vector2(2, 2),\n\tshadowBias: 0.001,\n\tshadowRadius: 0,\n\tdebugShadow: false,\n\t//\n\traymarchingPenumbra: 0, // keep as 0 by default since it's more performant\n\traymarchingShadowBiasAngle: 0.01,\n\traymarchingShadowBiasDistance: 0.1,\n};\nconst DEFAULT = DEFAULT_DIRECTIONAL_LIGHT_PARAMS;\n\nexport function DirectionalLightParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tlight = ParamConfig.FOLDER();\n\t\t/** @param light color */\n\t\tcolor = ParamConfig.COLOR(DEFAULT.color.toArray() as Number3, {\n\t\t\t// conversion: ColorConversion.SRGB_TO_LINEAR,\n\t\t});\n\t\t/** @param light intensity */\n\t\tintensity = ParamConfig.FLOAT(DEFAULT.intensity, {\n\t\t\trange: [0, 2],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param light distance */\n\t\tdistance = ParamConfig.FLOAT(DEFAULT.distance, {\n\t\t\trange: [0, 100],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t// helper\n\t\t/** @param toggle to show helper */\n\t\tshowHelper = ParamConfig.BOOLEAN(DEFAULT.showHelper);\n\t\t/** @param light name */\n\t\tname = ParamConfig.STRING('`$OS`');\n\n\t\t// shadows\n\t\tshadow = ParamConfig.FOLDER();\n\t\t/** @param toggle on to cast shadows */\n\t\tcastShadow = ParamConfig.BOOLEAN(DEFAULT.castShadow);\n\t\t/** @param toggle off if the shadows do not need to be regenerated */\n\t\tshadowAutoUpdate = ParamConfig.BOOLEAN(DEFAULT.shadowAutoUpdate, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t});\n\t\t/** @param press button to update the shadows on next render */\n\t\tshadowUpdateOnNextRender = ParamConfig.BOOLEAN(DEFAULT.shadowUpdateOnNextRender, {\n\t\t\tvisibleIf: {castShadow: 1, shadowAutoUpdate: 0},\n\t\t});\n\t\t/** @param shadow resolution */\n\t\tshadowRes = ParamConfig.VECTOR2(DEFAULT.shadowRes.toArray(), {\n\t\t\tvisibleIf: {castShadow: true},\n\t\t});\n\t\t/** @param shadow size */\n\t\tshadowSize = ParamConfig.VECTOR2(DEFAULT.shadowSize.toArray(), {\n\t\t\tvisibleIf: {castShadow: true},\n\t\t});\n\t\t/** @param shadow bias */\n\t\tshadowBias = ParamConfig.FLOAT(DEFAULT.shadowBias, {\n\t\t\tvisibleIf: {castShadow: true},\n\t\t\trange: [-0.01, 0.01],\n\t\t\trangeLocked: [false, false],\n\t\t});\n\t\t/** @param shadows radius. This only has effect when setting the ROP/WebGLRenderer's shadowMapType to VSM */\n\t\tshadowRadius = ParamConfig.FLOAT(DEFAULT.shadowRadius, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param display shadow on a plane behind the light */\n\t\t// debugShadow = ParamConfig.BOOLEAN(DEFAULT.debugShadow, {\n\t\t// \tvisibleIf: {castShadow: 1},\n\t\t// });\n\t\t// raymarching\n\t\traymarching = ParamConfig.FOLDER();\n\t\t/** @param this affects the shadows cast inside raymarchingBuilder materials */\n\t\traymarchingPenumbra = ParamConfig.FLOAT(DEFAULT.raymarchingPenumbra);\n\t\t/** @param shadow bias */\n\t\traymarchingShadowBiasAngle = ParamConfig.FLOAT(DEFAULT.raymarchingShadowBiasAngle, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param shadow bias */\n\t\traymarchingShadowBiasDistance = ParamConfig.FLOAT(DEFAULT.raymarchingShadowBiasDistance, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\n\nexport interface DirectionalLightContainerParams {\n\tshowHelper: boolean;\n}\nexport class DirectionalLightContainer extends Group {\n\tprivate _light = new DirectionalLight();\n\tprivate _target = this._light.target;\n\tpublic showHelper = false;\n\tpublic override matrixAutoUpdate = false;\n\tconstructor(options: DirectionalLightContainerParams, public readonly nodeName: string) {\n\t\tsuper();\n\t\tregisterObjectType({\n\t\t\ttype: ObjectType.DIRECTIONAL_LIGHT,\n\t\t\tcheckFunc: (o) => {\n\t\t\t\tif ((o as DirectionalLight).isDirectionalLight) {\n\t\t\t\t\treturn ObjectType.DIRECTIONAL_LIGHT;\n\t\t\t\t}\n\t\t\t},\n\t\t\tctor: DirectionalLight,\n\t\t\thumanName: 'DirectionalLight',\n\t\t});\n\t\tthis.showHelper = options.showHelper;\n\t\t// set light pos to 0,0,1\n\t\t// in order to have it face z axis\n\t\tthis._light.position.set(0, 0, 1);\n\t\tthis._light.updateMatrix();\n\t\tthis._target.updateMatrix();\n\t\tthis._light.matrixAutoUpdate = false;\n\t\tthis._target.matrixAutoUpdate = false;\n\t\tthis.name = `DirectionalLightContainer_${nodeName}`;\n\t\tthis._light.name = `DirectionalLight_${nodeName}`;\n\t\tthis._target.name = `DirectionalLightTarget_${nodeName}`;\n\n\t\tthis.add(this._light);\n\t\tthis.add(this._target);\n\t\tthis.updateHelper();\n\t}\n\n\tlight() {\n\t\treturn this._light;\n\t}\n\toverride copy(source: this, recursive?: boolean): this {\n\t\tthis._light.copy(source.light(), false);\n\t\tsuper.copy(source, false);\n\n\t\tthis._light.target = this._target;\n\t\tthis.updateHelper();\n\n\t\treturn this as this;\n\t}\n\n\toverride clone(recursive?: boolean): this {\n\t\tconst cloned = new DirectionalLightContainer({showHelper: this.showHelper}, this.nodeName);\n\t\tcloned.copy(this);\n\n\t\treturn cloned as this;\n\t}\n\n\tupdateHelper() {\n\t\tif (this.showHelper) {\n\t\t\tthis.__helper__ = this.__helper__ || new CoreDirectionalLightHelper(this);\n\t\t\tthis.add(this.__helper__.object);\n\t\t\tthis.__helper__.update();\n\t\t} else {\n\t\t\tif (this.__helper__) {\n\t\t\t\tthis.remove(this.__helper__.object);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate __helper__: CoreDirectionalLightHelper | undefined;\n}\n\nexport class CoreDirectionalLightHelper {\n\tpublic object: Mesh = new Mesh();\n\tprivate _lineMaterial = new LineBasicMaterial();\n\tprivate _cameraHelper!: CoreCameraHelper;\n\tprivate _square = new Line();\n\n\tconstructor(public container: DirectionalLightContainer) {\n\t\tthis.createAndBuildObject();\n\t}\n\n\tcreateAndBuildObject() {\n\t\tthis.buildHelper();\n\t\tthis.update();\n\t}\n\n\tbuildHelper() {\n\t\tconst light = this.container.light();\n\t\tconst geometry = new BufferGeometry();\n\t\tconst size = 1;\n\t\tgeometry.setAttribute(\n\t\t\t'position',\n\t\t\tnew Float32BufferAttribute(\n\t\t\t\t[-size, size, 0, size, size, 0, size, -size, 0, -size, -size, 0, -size, size, 0],\n\t\t\t\t3\n\t\t\t)\n\t\t);\n\n\t\tthis._square.geometry = geometry;\n\t\tthis._square.material = this._lineMaterial;\n\t\t// this._square.rotateX(Math.PI * 0.5);\n\t\tthis._square.updateMatrix();\n\t\tthis._square.matrixAutoUpdate = false;\n\n\t\tthis.object.add(this._square);\n\n\t\tthis._cameraHelper = new CoreCameraHelper(light.shadow.camera);\n\t\t// this._cameraHelper.rotateX(-Math.PI * 0.5);\n\t\tthis._cameraHelper.updateMatrix();\n\t\tthis._cameraHelper.matrixAutoUpdate = false;\n\t\tthis.object.add(this._cameraHelper);\n\n\t\tthis.object.name = `CoreDirectionalLightHelper_${this.container.nodeName}`;\n\t\tthis._square.name = `CoreDirectionalLightHelperSquare_${this.container.nodeName}`;\n\t\tthis._cameraHelper.name = `CoreDirectionalLightHelperCameraHelper_${this.container.nodeName}`;\n\t}\n\n\tupdate() {\n\t\tthis.object.updateMatrix();\n\t\tthis._cameraHelper.update();\n\n\t\tthis._lineMaterial.color.copy(this.container.light().color);\n\t}\n}\n","export default \"varying vec3 vNormal;\\nvarying vec3 vWorldPosition;\\nvarying vec3 vWorldOrigin;\\n\\nvoid main(){\\n\\t// compute intensity\\n\\tvNormal\\t\\t= normalize( normalMatrix * normal );\\n\\n\\tvec4 worldPosition\\t= modelMatrix * vec4( position, 1.0 );\\n\\tvWorldPosition\\t\\t= worldPosition.xyz;\\n\\n\\tvec4 worldOrigin\\t= modelMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvWorldOrigin\\t\\t= worldOrigin.xyz;\\n\\n\\t// set gl_Position\\n\\tgl_Position\\t= projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\"","export default \"varying vec3 vNormal;\\nvarying vec3 vWorldPosition;\\nvarying vec3 vWorldOrigin;\\n\\nuniform vec3 lightColor;\\n\\n// uniform vec3 spotPosition;\\n\\nuniform float attenuation;\\nuniform float anglePower;\\n\\nvoid main(){\\n\\n\\t//////////////////////////////////////////////////////////\\n\\t// distance attenuation   //\\n\\t//////////////////////////////////////////////////////////\\n\\tfloat intensity = distance(vWorldPosition, vWorldOrigin) / attenuation;\\n\\tintensity = 1.0 - clamp(intensity, 0.0, 1.0);\\n\\n\\t//////////////////////////////////////////////////////////\\n\\t// intensity on angle   //\\n\\t//////////////////////////////////////////////////////////\\n\\tvec3 normal = vec3(vNormal.x, vNormal.y, abs(vNormal.z));\\n\\tfloat angleIntensity = pow( dot(normal, vec3(0.0, 0.0, 1.0)), anglePower );\\n\\tintensity = intensity * angleIntensity;\\n\\t// 'gl_FragColor = vec4( lightColor, intensity );\\n\\n\\t//////////////////////////////////////////////////////////\\n\\t// final color   //\\n\\t//////////////////////////////////////////////////////////\\n\\n\\t// set the final color\\n\\tgl_FragColor = vec4( lightColor, intensity);\\n}\"","import {BufferGeometry, Float32BufferAttribute, LineBasicMaterial, LineSegments, Mesh, Object3D, Vector3} from 'three';\nimport type {SpotLightContainer} from '../SpotLight';\n\nexport interface CoreSpotLightHelperParams {\n\thelperSize: number;\n}\nexport interface UpdateSpotLightConeObjectOptions {\n\tdistance: number;\n\tsizeMult: number;\n\tangle: number;\n}\n\nexport class CoreSpotLightHelper {\n\tpublic object: Mesh = new Mesh();\n\tprivate _cone = new LineSegments();\n\tprivate _lineMaterial = new LineBasicMaterial();\n\tconstructor(public container: SpotLightContainer) {\n\t\tthis.object.name = `CoreSpotLightHelper_${this.container.nodeName}`;\n\t\tthis.object.matrixAutoUpdate = false;\n\t\tthis.createAndBuildObject({helperSize: 1});\n\t}\n\n\tcreateAndBuildObject(params: CoreSpotLightHelperParams) {\n\t\tthis.buildHelper();\n\t\tthis.update(params);\n\t}\n\n\tbuildHelper() {\n\t\tthis._cone.geometry = CoreSpotLightHelper._buildConeGeometry();\n\t\tthis._cone.material = this._lineMaterial;\n\t\tthis._cone.matrixAutoUpdate = false;\n\t\tthis._cone.name = `CoreSpotLightHelperCone_${this.container.nodeName}`;\n\n\t\tthis.object.add(this._cone);\n\t}\n\n\tupdate(params: CoreSpotLightHelperParams) {\n\t\tconst light = this.container.light();\n\t\tCoreSpotLightHelper.transformObject(this._cone, {\n\t\t\tsizeMult: params.helperSize,\n\t\t\tdistance: light.distance,\n\t\t\tangle: light.angle,\n\t\t});\n\n\t\tthis._lineMaterial.color.copy(light.color);\n\t}\n\n\tprivate static _matrixScale = new Vector3();\n\tstatic transformObject(object: Object3D, options: UpdateSpotLightConeObjectOptions) {\n\t\tconst coneLength = (options.distance ? options.distance : 1000) * options.sizeMult;\n\t\tconst coneWidth = coneLength * Math.tan(options.angle);\n\n\t\tthis._matrixScale.set(coneWidth, coneWidth, coneLength);\n\t\tobject.matrix.identity();\n\t\tobject.matrix.makeRotationX(Math.PI * 1);\n\t\tobject.matrix.scale(this._matrixScale);\n\t}\n\tprivate static _buildConeGeometry() {\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1];\n\n\t\tfor (let i = 0, j = 1, l = 32; i < l; i++, j++) {\n\t\t\tconst p1 = (i / l) * Math.PI * 2;\n\t\t\tconst p2 = (j / l) * Math.PI * 2;\n\n\t\t\tpositions.push(Math.cos(p1), Math.sin(p1), 1, Math.cos(p2), Math.sin(p2), 1);\n\t\t}\n\n\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\t\treturn geometry;\n\t}\n}\n","// from\n// https://github.com/jeromeetienne/threex.volumetricspotlight\n\nimport {Mesh, ShaderMaterial, Color, Matrix4, ConeGeometry} from 'three';\n\nimport VERTEX from './glsl/vert.glsl';\nimport FRAGMENT from './glsl/frag.glsl';\nimport {isBooleanTrue} from '../../Type';\nimport type {SpotLightContainer} from '../SpotLight';\nimport {CoreSpotLightHelper} from './CoreSpotLightHelper';\n\ninterface SpotLightVolumetricMaterial extends ShaderMaterial {\n\tuniforms: {\n\t\tattenuation: {value: number};\n\t\tanglePower: {value: number};\n\t\t// spotPosition: {value: Vector3};\n\t\tlightColor: {value: Color};\n\t};\n}\n\nexport interface VolumetricSpotLightParams {\n\ttvolumetric: boolean;\n\tvolAttenuation: number;\n\tvolAnglePower: number;\n}\n\nexport class VolumetricSpotLight {\n\tprivate _mesh: Mesh<ConeGeometry, SpotLightVolumetricMaterial> | undefined;\n\tconstructor(public readonly container: SpotLightContainer) {}\n\n\tupdate(params: VolumetricSpotLightParams) {\n\t\tconst light = this.container.light();\n\t\tif (isBooleanTrue(params.tvolumetric)) {\n\t\t\tconst object = this.object();\n\n\t\t\tCoreSpotLightHelper.transformObject(object, {\n\t\t\t\tsizeMult: 1,\n\t\t\t\tdistance: light.distance,\n\t\t\t\tangle: light.angle,\n\t\t\t});\n\t\t\tconst uniforms = object.material.uniforms;\n\t\t\tuniforms.lightColor.value.copy(light.color);\n\t\t\tuniforms.attenuation.value = params.volAttenuation;\n\t\t\tuniforms.anglePower.value = params.volAnglePower;\n\n\t\t\tlight.add(object);\n\t\t} else {\n\t\t\tif (this._mesh) {\n\t\t\t\tlight.remove(this._mesh);\n\t\t\t}\n\t\t}\n\t}\n\n\tobject() {\n\t\treturn (this._mesh = this._mesh || this._createMesh());\n\t}\n\n\tprivate _createMesh() {\n\t\tconst radius = 1;\n\t\tconst height = 1;\n\t\tconst radialSegments = 128;\n\t\tconst heightSegments = 32;\n\t\t// TODO: consider using a tube instead of a cone, to allow:\n\t\t// - to have base with non zero radius\n\t\t// - possibly better normal interpolation\n\t\t// TODO: refactor the attenuation and anglePower in glsl\n\t\t// TODO: add a color ramp, or at least 2 colors, to allow for a brighter base\n\t\t// TODO: attenuation should depend on light.distance, not just on world distance\n\t\tconst geometry = new ConeGeometry(radius, height, radialSegments, heightSegments);\n\t\tgeometry.applyMatrix4(new Matrix4().makeTranslation(0, -0.5 * height, 0));\n\t\tgeometry.applyMatrix4(new Matrix4().makeRotationX(-Math.PI / 2));\n\t\tconst material = this._createMaterial();\n\t\tconst mesh = new Mesh(geometry, material);\n\t\tmesh.matrixAutoUpdate = false;\n\t\tmesh.name = `VolumetricSpotLight_${this.container.nodeName}`;\n\t\tmaterial.uniforms.lightColor.value.set('white');\n\n\t\treturn mesh;\n\t}\n\n\tprivate _createMaterial() {\n\t\tconst material = new ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\tattenuation: {\n\t\t\t\t\tvalue: 5.0,\n\t\t\t\t},\n\t\t\t\tanglePower: {\n\t\t\t\t\tvalue: 1.2,\n\t\t\t\t},\n\t\t\t\tlightColor: {\n\t\t\t\t\tvalue: new Color('cyan'),\n\t\t\t\t},\n\t\t\t},\n\t\t\tvertexShader: VERTEX,\n\t\t\tfragmentShader: FRAGMENT,\n\t\t\t// blending\t: THREE.AdditiveBlending,\n\t\t\ttransparent: true,\n\t\t\tdepthWrite: false,\n\t\t}) as SpotLightVolumetricMaterial;\n\t\treturn material;\n\t}\n}\n","import {ParamConfig} from '../../engine/nodes/utils/params/ParamsConfig';\nimport {Constructor, Number2, Number3} from '../../types/GlobalTypes';\n// import {ColorConversion} from '../Color';\nimport {DefaultOperationParams} from '../operations/_Base';\nimport {Object3D, Group, Vector2, Color, SpotLight} from 'three';\nimport {VolumetricSpotLight} from './spotlight/VolumetricSpotLight';\nimport {isBooleanTrue} from '../Type';\nimport {CoreSpotLightHelper, CoreSpotLightHelperParams} from './spotlight/CoreSpotLightHelper';\nimport {CoreSceneObjectsFactory, GeneratorName} from '../CoreSceneObjectsFactory';\nimport {TypedNodePathParamValue} from '../Walker';\nimport {NodeContext} from '../../engine/poly/NodeContext';\n\nexport interface SpotLightParams extends DefaultOperationParams {\n\tcolor: Color;\n\tintensity: number;\n\tangle: number;\n\tpenumbra: number;\n\tdecay: number;\n\tdistance: number;\n\t//\n\tshowHelper: boolean;\n\thelperSize: number;\n\t//\n\ttmap: boolean;\n\tmap: TypedNodePathParamValue;\n\t//\n\tname: string;\n\t//\n\tcastShadow: boolean;\n\tshadowAutoUpdate: boolean;\n\tshadowUpdateOnNextRender: boolean;\n\tshadowRes: Vector2;\n\t// shadowSize: Vector2;\n\tshadowBias: number;\n\tshadowNear: number;\n\tshadowFar: number;\n\tshadowRadius: number;\n\t//\n\t// debugShadow is temporarily removed,\n\t// as it only works for obj lights if toggled after the shadow has been created\n\t// it does not work for sop lights at all.\n\t// maybe there is a better way to generate those via actor nodes?\n\t// debugShadow: boolean;\n\t//\n\ttvolumetric: boolean;\n\tvolAttenuation: number;\n\tvolAnglePower: number;\n\t//\n\traymarchingPenumbra: number;\n\traymarchingShadowBiasAngle: number;\n\traymarchingShadowBiasDistance: number;\n}\n\nexport const DEFAULT_SPOT_LIGHT_PARAMS: SpotLightParams = {\n\tcolor: new Color(1, 1, 1),\n\tintensity: 2,\n\tangle: 45,\n\tpenumbra: 0.1,\n\tdecay: 2,\n\tdistance: 100,\n\t//\n\tshowHelper: false,\n\thelperSize: 1,\n\t//\n\ttmap: false,\n\tmap: new TypedNodePathParamValue(''),\n\t//\n\tname: 'pointLight',\n\t//\n\tcastShadow: false,\n\tshadowAutoUpdate: true,\n\tshadowUpdateOnNextRender: false,\n\tshadowRes: new Vector2(1024, 1024), // used to be 256 for performance, but is now higher to start with a better look dev\n\t// shadowSize: new Vector2(2, 2),\n\tshadowBias: 0.0001,\n\tshadowNear: 0.1,\n\tshadowFar: 100,\n\tshadowRadius: 0,\n\t// debugShadow: false,\n\t//\n\ttvolumetric: false,\n\tvolAttenuation: 5,\n\tvolAnglePower: 10,\n\t//\n\traymarchingPenumbra: 0, // keep as 0 by default since it's more performant\n\traymarchingShadowBiasAngle: 0.01,\n\traymarchingShadowBiasDistance: 0.1,\n};\nconst DEFAULT = DEFAULT_SPOT_LIGHT_PARAMS;\n\nexport function SpotLightParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tlight = ParamConfig.FOLDER();\n\t\t/** @param light color */\n\t\tcolor = ParamConfig.COLOR(DEFAULT.color.toArray() as Number3, {\n\t\t\t// conversion: ColorConversion.SRGB_TO_LINEAR,\n\t\t});\n\t\t/** @param light intensity */\n\t\tintensity = ParamConfig.FLOAT(DEFAULT.intensity, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param angle */\n\t\tangle = ParamConfig.FLOAT(DEFAULT.angle, {\n\t\t\trange: [0, 180],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param penumbra */\n\t\tpenumbra = ParamConfig.FLOAT(DEFAULT.penumbra, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t\t/** @param decay */\n\t\tdecay = ParamConfig.FLOAT(DEFAULT.decay, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param distance */\n\t\tdistance = ParamConfig.FLOAT(DEFAULT.distance, {\n\t\t\trange: [0, 100],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\n\t\t// helper\n\t\t/** @param toggle on to show helper */\n\t\tshowHelper = ParamConfig.BOOLEAN(DEFAULT.showHelper);\n\t\t/** @param helper size */\n\t\thelperSize = ParamConfig.FLOAT(DEFAULT.helperSize, {visibleIf: {showHelper: 1}});\n\t\t// helper\n\t\t/** @param toggle on to show helper */\n\t\ttmap = ParamConfig.BOOLEAN(DEFAULT.tmap);\n\t\t/** @param helper size */\n\t\tmap = ParamConfig.NODE_PATH('', {\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.COP,\n\t\t\t},\n\t\t\tdependentOnFoundNode: false,\n\t\t\tvisibleIf: {tmap: 1},\n\t\t});\n\t\t//\n\t\t/** @param light name */\n\t\tname = ParamConfig.STRING('`$OS`');\n\n\t\t// shadows\n\t\tshadow = ParamConfig.FOLDER();\n\t\t/** @param toggle on to cast shadows */\n\t\tcastShadow = ParamConfig.BOOLEAN(DEFAULT.castShadow);\n\t\t/** @param toggle off if the shadows do not need to be regenerated */\n\t\tshadowAutoUpdate = ParamConfig.BOOLEAN(DEFAULT.shadowAutoUpdate, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t});\n\t\t/** @param press button to update the shadows on next render */\n\t\tshadowUpdateOnNextRender = ParamConfig.BOOLEAN(DEFAULT.shadowUpdateOnNextRender, {\n\t\t\tvisibleIf: {castShadow: 1, shadowAutoUpdate: 0},\n\t\t});\n\t\t/** @param shadows res */\n\t\tshadowRes = ParamConfig.VECTOR2(DEFAULT.shadowRes.toArray() as Number2, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t});\n\t\t/** @param shadows bias */\n\t\tshadowBias = ParamConfig.FLOAT(DEFAULT.shadowBias, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t\trange: [-0.01, 0.01],\n\t\t\trangeLocked: [false, false],\n\t\t});\n\t\t/** @param shadows near */\n\t\tshadowNear = ParamConfig.FLOAT(DEFAULT.shadowNear, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t\trange: [0, 100],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param shadows far */\n\t\tshadowFar = ParamConfig.FLOAT(DEFAULT.shadowFar, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t\trange: [0, 100],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param shadows radius. This only has effect when setting the ROP/WebGLRenderer's shadowMapType to VSM */\n\t\tshadowRadius = ParamConfig.FLOAT(DEFAULT.shadowRadius, {\n\t\t\tvisibleIf: {castShadow: 1},\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param display shadow on a plane behind the light */\n\t\t// debugShadow = ParamConfig.BOOLEAN(DEFAULT.debugShadow, {\n\t\t// \tvisibleIf: {castShadow: 1},\n\t\t// });\n\n\t\t// shadows\n\t\tvolumetric = ParamConfig.FOLDER();\n\t\t/** @param toggle on to add a volumetric effect to the spotlight */\n\t\ttvolumetric = ParamConfig.BOOLEAN(DEFAULT.tvolumetric);\n\t\t/** @param volumetric attenuation */\n\t\tvolAttenuation = ParamConfig.FLOAT(DEFAULT.volAttenuation, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param volumetric angle power */\n\t\tvolAnglePower = ParamConfig.FLOAT(DEFAULT.volAnglePower, {\n\t\t\trange: [0, 20],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\n\t\t// raymarching\n\t\traymarching = ParamConfig.FOLDER();\n\t\t/** @param this affects the shadows cast inside raymarchingBuilder materials */\n\t\traymarchingPenumbra = ParamConfig.FLOAT(DEFAULT.raymarchingPenumbra);\n\t\t/** @param shadow bias */\n\t\traymarchingShadowBiasAngle = ParamConfig.FLOAT(DEFAULT.raymarchingShadowBiasAngle, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param shadow bias */\n\t\traymarchingShadowBiasDistance = ParamConfig.FLOAT(DEFAULT.raymarchingShadowBiasDistance, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\n\nexport interface SpotLightContainerParams extends CoreSpotLightHelperParams {\n\tshowHelper: boolean;\n\ttvolumetric: boolean;\n\tvolAnglePower: number;\n\tvolAttenuation: number;\n}\n\nexport class SpotLightContainer extends Group {\n\tprivate _light: SpotLight;\n\tprivate _target: Object3D = new Object3D();\n\tpublic override matrixAutoUpdate = false;\n\tpublic params: SpotLightContainerParams = {\n\t\tshowHelper: false,\n\t\thelperSize: 1,\n\t\ttvolumetric: false,\n\t\tvolAnglePower: 1,\n\t\tvolAttenuation: 1,\n\t};\n\tconstructor(params: Partial<SpotLightContainerParams>, public readonly nodeName: string) {\n\t\tsuper();\n\n\t\tif (params.showHelper != null) {\n\t\t\tthis.params.showHelper = params.showHelper;\n\t\t}\n\t\tif (params.tvolumetric != null) {\n\t\t\tthis.params.tvolumetric = params.tvolumetric;\n\t\t}\n\t\tif (params.volAnglePower != null) {\n\t\t\tthis.params.volAnglePower = params.volAnglePower;\n\t\t}\n\t\tif (params.volAttenuation != null) {\n\t\t\tthis.params.volAttenuation = params.volAttenuation;\n\t\t}\n\t\tthis._light = CoreSceneObjectsFactory.generator(GeneratorName.SPOT_LIGHT)();\n\t\tCoreSceneObjectsFactory.generator(GeneratorName.SPOT_LIGHT_UPDATE)({\n\t\t\tspotLight: this._light,\n\t\t\ttextureName: 'IES_PROFILE_LM_63_1995',\n\t\t});\n\t\tthis._target.copy(this._light.target, false);\n\t\tthis._light.target = this._target;\n\n\t\t// set light pos to 0,0,1\n\t\t// in order to have it face z axis\n\t\t// update: set z to 0.01 so that the spotlight volume can appear to be in the same position\n\t\t// update: move target to 0,0,-1 so that the spotlight can be used with lookAt\n\t\tthis._light.position.set(0, 0, 0.01);\n\t\tthis._light.target.position.set(0, 0, -1);\n\t\tthis._light.updateMatrix();\n\t\tthis._target.updateMatrix();\n\t\tthis._light.matrixAutoUpdate = false;\n\t\tthis._target.matrixAutoUpdate = false;\n\n\t\tthis.name = `SpotLightContainer_${this.nodeName}`;\n\t\tthis._light.name = `SpotLight_${this.nodeName}`;\n\t\tthis._target.name = `SpotLightDefaultTarget_${this.nodeName}`;\n\n\t\tthis.add(this._light);\n\t\tthis.add(this._target);\n\t\tthis.updateHelper();\n\t}\n\n\tupdateParams(params: Partial<SpotLightContainerParams>) {\n\t\tif (params.showHelper != null) {\n\t\t\tthis.params.showHelper = params.showHelper;\n\t\t}\n\t\tif (params.helperSize != null) {\n\t\t\tthis.params.helperSize = params.helperSize;\n\t\t}\n\t\tif (params.tvolumetric != null) {\n\t\t\tthis.params.tvolumetric = params.tvolumetric;\n\t\t}\n\t\tif (params.volAnglePower != null) {\n\t\t\tthis.params.volAnglePower = params.volAnglePower;\n\t\t}\n\t\tif (params.volAttenuation != null) {\n\t\t\tthis.params.volAttenuation = params.volAttenuation;\n\t\t}\n\t}\n\n\tlight() {\n\t\treturn this._light;\n\t}\n\toverride copy(source: this, recursive?: boolean): this {\n\t\tconst srcLight = source.light();\n\t\tthis._light.copy(srcLight);\n\t\tsuper.copy(source, false);\n\n\t\tthis.updateParams(source.params);\n\t\tthis.updateHelper();\n\n\t\tthis._light.target = this._target;\n\n\t\tif (recursive) {\n\t\t\tthis.updateVolumetric();\n\t\t}\n\t\treturn this as this;\n\t}\n\n\toverride clone(recursive?: boolean): this {\n\t\tconst cloned = new SpotLightContainer(this.params, this.nodeName);\n\t\tcloned.copy(this);\n\n\t\treturn cloned as this;\n\t}\n\n\tprivate __helper__: CoreSpotLightHelper | undefined;\n\tupdateHelper() {\n\t\tif (isBooleanTrue(this.params.showHelper)) {\n\t\t\tthis.__helper__ = this.__helper__ || new CoreSpotLightHelper(this);\n\t\t\tthis.add(this.__helper__.object);\n\t\t\tthis.__helper__.update({helperSize: this.params.helperSize});\n\t\t} else {\n\t\t\tif (this.__helper__) {\n\t\t\t\tthis.remove(this.__helper__.object);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate __volumetric__: VolumetricSpotLight | undefined;\n\tupdateVolumetric() {\n\t\tif (isBooleanTrue(this.params.tvolumetric)) {\n\t\t\tthis.__volumetric__ = this.__volumetric__ || new VolumetricSpotLight(this);\n\t\t\tthis.__volumetric__.update(this.params);\n\t\t} else {\n\t\t\tif (this.__volumetric__) {\n\t\t\t\tthis.__volumetric__.update(this.params);\n\t\t\t}\n\t\t}\n\t}\n}\n","export const ASSETS_ROOT = 'https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/';\n","import {CoreBaseLoader} from './_Base';\nimport {AudioContext, FileLoader, Loader, LoadingManager} from 'three';\n\n// rework three AudioLoader, as onError is not called when giving a url that cannot be decoded\n\ntype OnLoad = (buffer: AudioBuffer) => void;\ntype OnProgress = (buffer: ProgressEvent) => void;\ntype OnError = (event: unknown) => void;\n\nclass AudioLoader extends Loader<AudioBuffer> {\n\tconstructor(public override manager: LoadingManager) {\n\t\tsuper(manager);\n\t}\n\n\toverride load(url: string, onLoad: OnLoad, onProgress: OnProgress, onError: OnError) {\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader(this.manager);\n\t\tloader.setResponseType('arraybuffer');\n\t\tloader.setPath(this.path);\n\t\tloader.setRequestHeader(this.requestHeader);\n\t\tloader.setWithCredentials(this.withCredentials);\n\t\tloader.load(\n\t\t\turl,\n\t\t\tfunction (buffer) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(buffer instanceof ArrayBuffer)) {\n\t\t\t\t\t\tonError(new ErrorEvent('file content is not an ArrayBuffer'));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\t\tconst bufferCopy = buffer.slice(0);\n\n\t\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\t\tcontext.decodeAudioData(\n\t\t\t\t\t\tbufferCopy,\n\t\t\t\t\t\tfunction (audioBuffer) {\n\t\t\t\t\t\t\tonLoad(audioBuffer);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction (event: DOMException) {\n\t\t\t\t\t\t\tonError(new ErrorEvent('failed to decode file'));\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tonError(new ErrorEvent('failed to decode file'));\n\n\t\t\t\t\tscope.manager.itemError(url);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonProgress,\n\t\t\tonError\n\t\t);\n\t}\n}\n\nexport class CoreLoaderAudio extends CoreBaseLoader<string> {\n\tasync load(): Promise<AudioBuffer> {\n\t\tconst audioLoader = new AudioLoader(this.loadingManager);\n\t\tconst url = this._urlToLoad();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst onSuccess = (buffer: AudioBuffer) => {\n\t\t\t\t//console.log('success');\n\t\t\t\tresolve(buffer);\n\t\t\t};\n\t\t\tconst onProgress = (progress: ProgressEvent) => {\n\t\t\t\t//console.log(progress);\n\t\t\t};\n\t\t\tconst onError = (err: any) => {\n\t\t\t\tconsole.log(`error:`);\n\t\t\t\tconsole.log(err);\n\t\t\t\treject();\n\t\t\t};\n\t\t\taudioLoader.load(url, onSuccess, onProgress, onError);\n\t\t});\n\t}\n}\n","import {CameraSopNodeType, NodeContext} from '../../engine/poly/NodeContext';\nimport {AudioType} from '../../engine/poly/registers/nodes/types/Audio';\nimport {CopType, CopTypeImage} from '../../engine/poly/registers/nodes/types/Cop';\nimport {SopType, SopTypeFile, SopExporter, SopTypeFileMulti} from '../../engine/poly/registers/nodes/types/Sop';\nimport {\n\tGeometryExtension,\n\tAUDIO_EXTENSIONS,\n\tImageExtension,\n\tSDF_EXTENSIONS,\n\tVIDEO_EXTENSIONS,\n\tFontExtension,\n} from '../FileTypeController';\n\nexport const EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT: Record<NodeContext, Record<string, string[]>> = {\n\t[NodeContext.ANIM]: {},\n\t[NodeContext.AUDIO]: {\n\t\t[AudioType.FILE]: [...AUDIO_EXTENSIONS],\n\t},\n\t// [NodeContext.CAD]: {},\n\t[NodeContext.COP]: {\n\t\t[CopType.CUBE_MAP]: [ImageExtension.PNG, ImageExtension.JPEG, ImageExtension.JPG, ImageExtension.WEBP],\n\t\t[CopType.GIF]: [ImageExtension.GIF],\n\t\t[CopTypeImage.IMAGE]: [ImageExtension.PNG, ImageExtension.JPEG, ImageExtension.JPG, ImageExtension.WEBP],\n\t\t[CopTypeImage.IMAGE_EXR]: [ImageExtension.EXR],\n\t\t[CopTypeImage.IMAGE_HDR]: [ImageExtension.HDR],\n\t\t[CopTypeImage.IMAGE_KTX2]: [ImageExtension.KTX2],\n\t\t[CopType.LUT]: [ImageExtension.PNG],\n\t\t[CopType.SDF_FROM_URL]: [...SDF_EXTENSIONS],\n\t\t[CopType.TEXT]: [FontExtension.TTF],\n\t\t[CopType.VIDEO]: [...VIDEO_EXTENSIONS],\n\t},\n\t// [NodeContext.CSG]: {},\n\t[NodeContext.EVENT]: {},\n\t[NodeContext.GL]: {},\n\t[NodeContext.JS]: {},\n\t[NodeContext.MANAGER]: {},\n\t[NodeContext.MAT]: {},\n\t[NodeContext.OBJ]: {},\n\t[NodeContext.POST]: {},\n\t[NodeContext.ROP]: {},\n\t[NodeContext.SOP]: {\n\t\t[CameraSopNodeType.WEBXR_AR_MARKER_TRACKING]: [\n\t\t\tImageExtension.PNG,\n\t\t\tImageExtension.JPEG,\n\t\t\tImageExtension.JPG,\n\t\t\tImageExtension.WEBP,\n\t\t\t...VIDEO_EXTENSIONS,\n\t\t],\n\t\t[SopType.CAD_EXPORTER_STEP]: [GeometryExtension.STEP],\n\t\t[SopType.CAD_FILE_STEP]: [GeometryExtension.STEP],\n\t\t[SopType.DATA_URL]: [GeometryExtension.JSON],\n\t\t[SopExporter.EXPORTER_GLTF]: [GeometryExtension.GLB],\n\t\t[SopExporter.EXPORTER_OBJ]: [GeometryExtension.OBJ],\n\t\t[SopExporter.EXPORTER_PLY]: [GeometryExtension.PLY],\n\t\t[SopExporter.EXPORTER_STL]: [GeometryExtension.STL],\n\t\t[SopTypeFile.FILE_3DS]: [GeometryExtension.TDS],\n\t\t[SopTypeFile.FILE_GLTF]: [GeometryExtension.GLB, GeometryExtension.GLTF],\n\t\t[SopTypeFile.FILE_DRC]: [GeometryExtension.DRC],\n\t\t[SopTypeFile.FILE_FBX]: [GeometryExtension.FBX],\n\t\t[SopTypeFile.FILE_GEOJSON]: [GeometryExtension.GEOJSON],\n\t\t[SopTypeFile.FILE_JSON]: [GeometryExtension.JSON],\n\t\t[SopTypeFile.FILE_MPD]: [GeometryExtension.MPD],\n\t\t[SopTypeFileMulti.FILE_GLTF]: [GeometryExtension.GLTF, GeometryExtension.GLB],\n\t\t[SopTypeFileMulti.FILE_OBJ]: [GeometryExtension.OBJ],\n\t\t[SopTypeFile.FILE_OBJ]: [GeometryExtension.OBJ],\n\t\t[SopTypeFile.FILE_PDB]: [GeometryExtension.PDB],\n\t\t[SopTypeFile.FILE_PLY]: [GeometryExtension.PLY],\n\t\t[SopTypeFile.FILE_STL]: [GeometryExtension.STL],\n\t\t[SopTypeFile.FILE_SVG]: [GeometryExtension.SVG],\n\t\t[SopTypeFile.FILE_USDZ]: [GeometryExtension.USDZ],\n\t\t[SopTypeFile.FILE_VOX]: [GeometryExtension.VOX],\n\t\t[SopType.TEXT]: [FontExtension.TTF, FontExtension.JSON],\n\t},\n};\n","import {Poly} from '../../engine/Poly';\n\nexport class CoreStylesheetLoader {\n\tstatic loadUrl(url: string): Promise<void> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\t// add .js ext if not present\n\t\t\tconst elements = url.split('.');\n\t\t\tconst ext = elements[elements.length - 1];\n\t\t\tif (ext != 'css') {\n\t\t\t\turl = `${url}.css`;\n\t\t\t}\n\n\t\t\tif (!Poly.inWorkerThread()) {\n\t\t\t\tconst id = url.replace(/[\\W_]+/g, '_');\n\t\t\t\tlet stylesheet: HTMLLinkElement = document.getElementById(id) as HTMLLinkElement;\n\n\t\t\t\tif (!stylesheet) {\n\t\t\t\t\tstylesheet = document.createElement('link');\n\t\t\t\t\tstylesheet.type = 'text/css';\n\t\t\t\t\tstylesheet.rel = 'stylesheet';\n\n\t\t\t\t\tconst performance = Poly.performance.performanceManager();\n\t\t\t\t\tstylesheet.href = `${url}?${performance.now()}`;\n\t\t\t\t\tstylesheet.id = id;\n\t\t\t\t\tstylesheet.addEventListener('load', function () {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\n\t\t\t\t\tdocument.getElementsByTagName('head')[0].appendChild(stylesheet);\n\n\t\t\t\t\t// while (!this._isStylesheetLoaded(stylesheet)) {\n\t\t\t\t\t// \tawait CoreSleep.sleep(100);\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\t}\n}\n","import {Texture} from 'three';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport {CoreUserAgent} from '../UserAgent';\nimport {CoreBaseLoader} from './_Base';\n\ntype MaxConcurrentLoadsCountMethod = () => number;\n\nexport class CoreLoaderTexture extends CoreBaseLoader<string> {\n\tconstructor(_url: string, protected override _node: BaseNodeType) {\n\t\tsuper(_url, _node);\n\t}\n\n\t// static pixelData(texture: Texture) {\n\t// \tconst img = texture.image;\n\t// \tconst canvas = document.createElement('canvas');\n\t// \tcanvas.width = img.width;\n\t// \tcanvas.height = img.height;\n\t// \tconst context = canvas.getContext('2d');\n\t// \tif (context) {\n\t// \t\tcontext.drawImage(img, 0, 0, img.width, img.height);\n\t// \t\treturn context.getImageData(0, 0, img.width, img.height);\n\t// \t}\n\t// }\n\n\tstatic replaceExtension(url: string, new_extension: string) {\n\t\tconst elements = url.split('?');\n\t\tconst url_without_params = elements[0];\n\t\tconst url_elements = url_without_params.split('.');\n\t\turl_elements.pop();\n\t\turl_elements.push(new_extension);\n\t\treturn [url_elements.join('.'), elements[1]].join('?');\n\t}\n\n\t//\n\t//\n\t// CONCURRENT LOADS\n\t//\n\t//\n\tprivate static MAX_CONCURRENT_LOADS_COUNT: number = CoreLoaderTexture._init_max_concurrent_loads_count();\n\tprivate static CONCURRENT_LOADS_DELAY: number = CoreLoaderTexture._init_concurrent_loads_delay();\n\tprivate static in_progress_loads_count: number = 0;\n\tprivate static _queue: Array<() => void> = [];\n\tprivate static _maxConcurrentLoadsCountMethod: MaxConcurrentLoadsCountMethod | undefined;\n\tpublic static setMaxConcurrentLoadsCount(method: MaxConcurrentLoadsCountMethod | undefined) {\n\t\tthis._maxConcurrentLoadsCountMethod = method;\n\t}\n\tprivate static _init_max_concurrent_loads_count(): number {\n\t\tif (this._maxConcurrentLoadsCountMethod) {\n\t\t\treturn this._maxConcurrentLoadsCountMethod();\n\t\t}\n\t\treturn CoreUserAgent.isChrome() ? 10 : 4;\n\t\t// const parser = new UAParser();\n\t\t// const name = parser.getBrowser().name;\n\t\t// // limit to 4 for non chrome,\n\t\t// // as firefox was seen hanging trying to load multiple glb files\n\t\t// // limit to 1 for safari,\n\t\t// if (name) {\n\t\t// \tconst loads_count_by_browser: PolyDictionary<number> = {\n\t\t// \t\tChrome: 10,\n\t\t// \t\tFirefox: 4,\n\t\t// \t};\n\t\t// \tconst loads_count = loads_count_by_browser[name];\n\t\t// \tif (loads_count != null) {\n\t\t// \t\treturn loads_count;\n\t\t// \t}\n\t\t// }\n\t\t// return 1;\n\t}\n\tprivate static _init_concurrent_loads_delay(): number {\n\t\treturn CoreUserAgent.isChrome() ? 0 : 10;\n\t\t// const parser = new UAParser();\n\t\t// const name = parser.getBrowser().name;\n\t\t// // add a delay for browsers other than Chrome and Firefox\n\t\t// if (name) {\n\t\t// \tconst delay_by_browser: PolyDictionary<number> = {\n\t\t// \t\tChrome: 0,\n\t\t// \t\tFirefox: 10,\n\t\t// \t};\n\t\t// \tconst delay = delay_by_browser[name];\n\t\t// \tif (delay != null) {\n\t\t// \t\treturn delay;\n\t\t// \t}\n\t\t// }\n\t\t// return 100;\n\t}\n\t// public static override_max_concurrent_loads_count(count: number) {\n\t// \tthis.MAX_CONCURRENT_LOADS_COUNT = count;\n\t// }\n\n\tstatic incrementInProgressLoadsCount() {\n\t\tthis.in_progress_loads_count++;\n\t}\n\tstatic decrementInProgressLoadsCount(url: string, texture?: Texture) {\n\t\tthis.in_progress_loads_count--;\n\n\t\tconst queuedResolve = this._queue.pop();\n\t\tif (queuedResolve) {\n\t\t\tconst delay = this.CONCURRENT_LOADS_DELAY;\n\t\t\tsetTimeout(() => {\n\t\t\t\tqueuedResolve();\n\t\t\t}, delay);\n\t\t}\n\t\tthis._runOnAssetLoadedCallbacks(url, texture);\n\t}\n\n\tstatic async waitForMaxConcurrentLoadsQueueFreed(): Promise<void> {\n\t\tif (this.in_progress_loads_count <= this.MAX_CONCURRENT_LOADS_COUNT) {\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis._queue.push(resolve);\n\t\t\t});\n\t\t}\n\t}\n}\n","import {LoadingManager, Texture} from 'three';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport {Poly} from '../../engine/Poly';\nimport {BlobsControllerFetchNodeOptions} from '../../engine/poly/BlobsController';\nimport {isArray} from '../Type';\nimport {sanitizeUrl} from '../UrlHelper';\nimport type {BaseGeoLoaderOutput} from './geometry/Common';\n\nexport interface BaseLoaderLoadOptions {\n\tnode: BaseNodeType;\n}\n\nexport function modifyUrl(url: string) {\n\tconst remapedUrl = Poly.assetUrls.remapedUrl(url);\n\tif (remapedUrl) {\n\t\treturn remapedUrl;\n\t}\n\n\t// const blobUrl = Poly.blobs.blobUrl(url);\n\t// if (blobUrl) {\n\t// \treturn blobUrl;\n\t// }\n\n\treturn url;\n}\n\nexport function createLoadingManager() {\n\tconst loadingManager = new LoadingManager();\n\tloadingManager.setURLModifier(modifyUrl);\n\treturn loadingManager;\n}\n\nexport const LOADING_MANAGER = createLoadingManager();\n\ninterface MultipleDependenciesLoadFileOptions {\n\t// storedUrl: string;\n\tfullUrl: string;\n}\ninterface MultipleDependenciesLoadOptions {\n\tfiles: MultipleDependenciesLoadFileOptions[];\n\terror: string;\n\tnode?: BaseNodeType;\n}\n\ntype OnAssetLoadedCallback = (url: string, asset?: BaseGeoLoaderOutput | Texture) => void;\n\nexport class CoreBaseLoader<U extends string | Array<string>> {\n\tstatic readonly loadingManager = LOADING_MANAGER; // static\n\tpublic readonly loadingManager = LOADING_MANAGER; // not static\n\n\tconstructor(\n\t\tprotected _url: U,\n\t\tprotected _node?: BaseNodeType,\n\t\tpublic blobOptions: BlobsControllerFetchNodeOptions = {}\n\t) {\n\t\tif (isArray(this._url)) {\n\t\t\tthis._url = this._url.map(sanitizeUrl) as U;\n\t\t} else {\n\t\t\tthis._url = sanitizeUrl(this._url) as U;\n\t\t}\n\t}\n\n\tstatic extension(url: string) {\n\t\tlet ext: string | null = null;\n\n\t\ttry {\n\t\t\tconst _url = new URL(url);\n\t\t\text = _url.searchParams.get('ext');\n\t\t} catch (e) {}\n\t\t// the loader checks first an 'ext' in the query params\n\t\t// for urls such as http://domain.com/file?path=geometry.obj&t=aaa&ext=obj\n\t\t// to know what extension it is, since it may not be before the '?'.\n\t\t// But if there is not, the part before the '?' is used\n\t\tif (!ext) {\n\t\t\tconst url_without_params = url.split('?')[0];\n\t\t\tconst elements = url_without_params.split('.');\n\t\t\text = elements[elements.length - 1].toLowerCase();\n\t\t\t// if (this.ext === 'zip') {\n\t\t\t// \tthis.ext = elements[elements.length - 2];\n\t\t\t// }\n\t\t}\n\t\treturn ext;\n\t}\n\n\textension() {\n\t\treturn isArray(this._url) ? CoreBaseLoader.extension(this._url[0]) : CoreBaseLoader.extension(this._url);\n\t}\n\n\tprotected _urlToLoad(): U {\n\t\tconst blobOrFullUrl = (fullUrl: string) => {\n\t\t\tif (this._node) {\n\t\t\t\tconst assetsRoot = this._node.scene().assets.root();\n\t\t\t\tif (!fullUrl.startsWith('http')) {\n\t\t\t\t\tfullUrl = assetsRoot ? sanitizeUrl(`${assetsRoot}/${fullUrl}`) : fullUrl;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn fullUrl;\n\t\t};\n\n\t\tif (isArray(this._url)) {\n\t\t\treturn this._url.map(blobOrFullUrl) as U;\n\t\t} else {\n\t\t\treturn blobOrFullUrl(this._url) as U;\n\t\t}\n\t}\n\n\tprotected static async _loadMultipleUrlsGlobal(options: MultipleDependenciesLoadOptions) {\n\t\tconst promises: Promise<{error?: string}>[] = [];\n\t\tfor (const file of options.files) {\n\t\t\tconst fullUrl = file.fullUrl;\n\t\t\tconst _fetch = async () => {\n\t\t\t\tconst response = await fetch(fullUrl);\n\t\t\t\tif (response.ok) {\n\t\t\t\t\treturn {};\n\t\t\t\t} else {\n\t\t\t\t\treturn {error: `failed to fetch '${fullUrl}'`};\n\t\t\t\t}\n\t\t\t};\n\t\t\tpromises.push(_fetch());\n\t\t}\n\t\tconst responses = await Promise.all(promises);\n\t\tif (options.node) {\n\t\t\tfor (const response of responses) {\n\t\t\t\tif (response.error) {\n\t\t\t\t\toptions.node.states.error.set(options.error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static _onAssetLoadedCallbacks: OnAssetLoadedCallback[] | undefined;\n\tstatic onAssetLoaded(callback: OnAssetLoadedCallback) {\n\t\tthis._onAssetLoadedCallbacks = this._onAssetLoadedCallbacks || [];\n\t\tthis._onAssetLoadedCallbacks.push(callback);\n\t}\n\tstatic _runOnAssetLoadedCallbacks(url: string, asset?: BaseGeoLoaderOutput | Texture) {\n\t\tif (!this._onAssetLoadedCallbacks) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const callback of this._onAssetLoadedCallbacks) {\n\t\t\tcallback(url, asset);\n\t\t}\n\t}\n}\n","export const LIBRARY_INSTALL_HINT = 'From the top menu Windows -> Libraries';\n","/*\nThis replaces THREE's font, so that we can have one shape per character\n*/\n\nimport {Shape, ShapePath} from 'three';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\n\ninterface Glyph {\n\t_cachedOutline: any[];\n\tha: number;\n\to: string;\n}\n\nexport interface FontData {\n\tresolution: number;\n\tboundingBox: {\n\t\tyMax: number;\n\t\tyMin: number;\n\t};\n\tunderlineThickness: number;\n\tglyphs: PolyDictionary<Glyph>;\n\tfamilyName: string;\n}\n\nexport interface FontGenerateShapesOptions {\n\tsize?: number;\n\tisCCW?: boolean;\n\t// noHoles?: boolean;\n}\n\nexport class Font {\n\tpublic readonly isFont = true;\n\tpublic readonly type = 'font';\n\tconstructor(private data: FontData) {}\n\n\tgenerateShapes(text: string, options: FontGenerateShapesOptions = {}) {\n\t\tif (options.size == null) {\n\t\t\toptions.size = 100;\n\t\t}\n\t\tif (options.isCCW == null) {\n\t\t\toptions.isCCW = false;\n\t\t}\n\t\t// if (options.noHoles == null) {\n\t\t// \toptions.noHoles = false;\n\t\t// }\n\n\t\tconst allShapes: Array<Shape[]> = [];\n\t\tconst allPaths = createPaths(text, options.size, this.data);\n\n\t\tfor (const pathsForChar of allPaths) {\n\t\t\tconst shapesForChar: Shape[] = [];\n\t\t\tfor (const path of pathsForChar) {\n\t\t\t\tconst shapes = path.toShapes(options.isCCW);\n\t\t\t\tshapesForChar.push(...shapes);\n\t\t\t}\n\t\t\tallShapes.push(shapesForChar);\n\t\t}\n\n\t\treturn allShapes;\n\t}\n}\n\nfunction createPaths(text: string, size: number, data: FontData) {\n\tconst chars = Array.from(text);\n\tconst scale = size / data.resolution;\n\tconst lineHeight = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale;\n\n\tconst allPaths: Array<ShapePath[]> = [];\n\n\tlet offsetX = 0,\n\t\toffsetY = 0;\n\n\tfor (let i = 0; i < chars.length; i++) {\n\t\tconst char = chars[i];\n\n\t\tconst pathsForChar: ShapePath[] = [];\n\t\tif (char === '\\n') {\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= lineHeight;\n\t\t} else {\n\t\t\tconst ret = createPath(char, scale, offsetX, offsetY, data);\n\t\t\tif (ret) {\n\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\tpathsForChar.push(ret.path);\n\t\t\t}\n\t\t}\n\t\tallPaths.push(pathsForChar);\n\t}\n\n\treturn allPaths;\n}\n\nfunction createPath(char: string, scale: number, offsetX: number, offsetY: number, data: FontData) {\n\tconst glyph = data.glyphs[char] || data.glyphs['?'];\n\n\tif (!glyph) {\n\t\tconsole.error('THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.');\n\n\t\treturn;\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif (glyph.o) {\n\t\tconst outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '));\n\n\t\tfor (let i = 0, l = outline.length; i < l; ) {\n\t\t\tconst action = outline[i++];\n\t\t\tswitch (action) {\n\t\t\t\tcase 'm': // moveTo\n\t\t\t\t\tx = outline[i++] * scale + offsetX;\n\t\t\t\t\ty = outline[i++] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo(x, y);\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\t\t\t\t\tx = outline[i++] * scale + offsetX;\n\t\t\t\t\ty = outline[i++] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo(x, y);\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\t\t\t\t\tcpx = outline[i++] * scale + offsetX;\n\t\t\t\t\tcpy = outline[i++] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[i++] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[i++] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo(cpx1, cpy1, cpx, cpy);\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\t\t\t\t\tcpx = outline[i++] * scale + offsetX;\n\t\t\t\t\tcpy = outline[i++] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[i++] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[i++] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[i++] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[i++] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy);\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn {offsetX: glyph.ha * scale, path: path};\n}\n","import {FileLoader, Loader, LoadingManager} from 'three';\nimport {isString} from '../../Type';\nimport {Font, FontData} from './Font';\n\ntype OnLoad = (font: Font) => void;\ntype OnProgress = (event: ProgressEvent<EventTarget>) => void;\ntype OnError = (error: any) => void;\n\nexport class FontLoader extends Loader<Font> {\n\tconstructor(manager: LoadingManager) {\n\t\tsuper(manager);\n\t}\n\n\toverride load(url: string, onLoad: OnLoad, onProgress?: OnProgress, onError?: OnError) {\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader(this.manager);\n\t\tloader.setPath(this.path);\n\t\tloader.setRequestHeader(this.requestHeader);\n\t\tloader.setWithCredentials(scope.withCredentials);\n\t\tloader.load(\n\t\t\turl,\n\t\t\tfunction (text) {\n\t\t\t\tif (!isString(text)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet json: FontData | undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse(text as string);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.'\n\t\t\t\t\t);\n\t\t\t\t\tjson = JSON.parse((text as string).substring(65, text.length - 2));\n\t\t\t\t}\n\n\t\t\t\tif (!json) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst font = scope.parse(json);\n\n\t\t\t\tif (onLoad) onLoad(font);\n\t\t\t},\n\t\t\tonProgress,\n\t\t\tonError\n\t\t);\n\t}\n\n\tparse(json: FontData) {\n\t\treturn new Font(json);\n\t}\n}\n\n//\n","/**\n * https://opentype.js.org v1.3.4 | (c) Frederik De Bleser and other contributors | MIT License | Uses tiny-inflate by Devon Govett and string.prototype.codepointat polyfill by Mathias Bynens\n */\n\n/*! https://mths.be/codepointat v0.2.0 by @mathias */\nif (!String.prototype.codePointAt) {\n\t(function() {\n\t\tvar defineProperty = (function() {\n\t\t\t// IE 8 only supports `Object.defineProperty` on DOM elements\n\t\t\ttry {\n\t\t\t\tvar object = {};\n\t\t\t\tvar $defineProperty = Object.defineProperty;\n\t\t\t\tvar result = $defineProperty(object, object, object) && $defineProperty;\n\t\t\t} catch(error) {}\n\t\t\treturn result;\n\t\t}());\n\t\tvar codePointAt = function(position) {\n\t\t\tif (this == null) {\n\t\t\t\tthrow TypeError();\n\t\t\t}\n\t\t\tvar string = String(this);\n\t\t\tvar size = string.length;\n\t\t\t// `ToInteger`\n\t\t\tvar index = position ? Number(position) : 0;\n\t\t\tif (index != index) { // better `isNaN`\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\t// Account for out-of-bounds indices:\n\t\t\tif (index < 0 || index >= size) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// Get the first code unit\n\t\t\tvar first = string.charCodeAt(index);\n\t\t\tvar second;\n\t\t\tif ( // check if it’s the start of a surrogate pair\n\t\t\t\tfirst >= 0xD800 && first <= 0xDBFF && // high surrogate\n\t\t\t\tsize > index + 1 // there is a next code unit\n\t\t\t) {\n\t\t\t\tsecond = string.charCodeAt(index + 1);\n\t\t\t\tif (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate\n\t\t\t\t\t// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\t\t\t\t\treturn (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn first;\n\t\t};\n\t\tif (defineProperty) {\n\t\t\tdefineProperty(String.prototype, 'codePointAt', {\n\t\t\t\t'value': codePointAt,\n\t\t\t\t'configurable': true,\n\t\t\t\t'writable': true\n\t\t\t});\n\t\t} else {\n\t\t\tString.prototype.codePointAt = codePointAt;\n\t\t}\n\t}());\n}\n\nvar TINF_OK = 0;\nvar TINF_DATA_ERROR = -3;\n\nfunction Tree() {\n  this.table = new Uint16Array(16);   /* table of code length counts */\n  this.trans = new Uint16Array(288);  /* code -> symbol translation table */\n}\n\nfunction Data(source, dest) {\n  this.source = source;\n  this.sourceIndex = 0;\n  this.tag = 0;\n  this.bitcount = 0;\n  \n  this.dest = dest;\n  this.destLen = 0;\n  \n  this.ltree = new Tree();  /* dynamic length/symbol tree */\n  this.dtree = new Tree();  /* dynamic distance tree */\n}\n\n/* --------------------------------------------------- *\n * -- uninitialized global data (static structures) -- *\n * --------------------------------------------------- */\n\nvar sltree = new Tree();\nvar sdtree = new Tree();\n\n/* extra bits and base tables for length codes */\nvar length_bits = new Uint8Array(30);\nvar length_base = new Uint16Array(30);\n\n/* extra bits and base tables for distance codes */\nvar dist_bits = new Uint8Array(30);\nvar dist_base = new Uint16Array(30);\n\n/* special ordering of code length codes */\nvar clcidx = new Uint8Array([\n  16, 17, 18, 0, 8, 7, 9, 6,\n  10, 5, 11, 4, 12, 3, 13, 2,\n  14, 1, 15\n]);\n\n/* used by tinf_decode_trees, avoids allocations every call */\nvar code_tree = new Tree();\nvar lengths = new Uint8Array(288 + 32);\n\n/* ----------------------- *\n * -- utility functions -- *\n * ----------------------- */\n\n/* build extra bits and base tables */\nfunction tinf_build_bits_base(bits, base, delta, first) {\n  var i, sum;\n\n  /* build bits table */\n  for (i = 0; i < delta; ++i) { bits[i] = 0; }\n  for (i = 0; i < 30 - delta; ++i) { bits[i + delta] = i / delta | 0; }\n\n  /* build base table */\n  for (sum = first, i = 0; i < 30; ++i) {\n    base[i] = sum;\n    sum += 1 << bits[i];\n  }\n}\n\n/* build the fixed huffman trees */\nfunction tinf_build_fixed_trees(lt, dt) {\n  var i;\n\n  /* build fixed length tree */\n  for (i = 0; i < 7; ++i) { lt.table[i] = 0; }\n\n  lt.table[7] = 24;\n  lt.table[8] = 152;\n  lt.table[9] = 112;\n\n  for (i = 0; i < 24; ++i) { lt.trans[i] = 256 + i; }\n  for (i = 0; i < 144; ++i) { lt.trans[24 + i] = i; }\n  for (i = 0; i < 8; ++i) { lt.trans[24 + 144 + i] = 280 + i; }\n  for (i = 0; i < 112; ++i) { lt.trans[24 + 144 + 8 + i] = 144 + i; }\n\n  /* build fixed distance tree */\n  for (i = 0; i < 5; ++i) { dt.table[i] = 0; }\n\n  dt.table[5] = 32;\n\n  for (i = 0; i < 32; ++i) { dt.trans[i] = i; }\n}\n\n/* given an array of code lengths, build a tree */\nvar offs = new Uint16Array(16);\n\nfunction tinf_build_tree(t, lengths, off, num) {\n  var i, sum;\n\n  /* clear code length count table */\n  for (i = 0; i < 16; ++i) { t.table[i] = 0; }\n\n  /* scan symbol lengths, and sum code length counts */\n  for (i = 0; i < num; ++i) { t.table[lengths[off + i]]++; }\n\n  t.table[0] = 0;\n\n  /* compute offset table for distribution sort */\n  for (sum = 0, i = 0; i < 16; ++i) {\n    offs[i] = sum;\n    sum += t.table[i];\n  }\n\n  /* create code->symbol translation table (symbols sorted by code) */\n  for (i = 0; i < num; ++i) {\n    if (lengths[off + i]) { t.trans[offs[lengths[off + i]]++] = i; }\n  }\n}\n\n/* ---------------------- *\n * -- decode functions -- *\n * ---------------------- */\n\n/* get one bit from source stream */\nfunction tinf_getbit(d) {\n  /* check if tag is empty */\n  if (!d.bitcount--) {\n    /* load next tag */\n    d.tag = d.source[d.sourceIndex++];\n    d.bitcount = 7;\n  }\n\n  /* shift bit out of tag */\n  var bit = d.tag & 1;\n  d.tag >>>= 1;\n\n  return bit;\n}\n\n/* read a num bit value from a stream and add base */\nfunction tinf_read_bits(d, num, base) {\n  if (!num)\n    { return base; }\n\n  while (d.bitcount < 24) {\n    d.tag |= d.source[d.sourceIndex++] << d.bitcount;\n    d.bitcount += 8;\n  }\n\n  var val = d.tag & (0xffff >>> (16 - num));\n  d.tag >>>= num;\n  d.bitcount -= num;\n  return val + base;\n}\n\n/* given a data stream and a tree, decode a symbol */\nfunction tinf_decode_symbol(d, t) {\n  while (d.bitcount < 24) {\n    d.tag |= d.source[d.sourceIndex++] << d.bitcount;\n    d.bitcount += 8;\n  }\n  \n  var sum = 0, cur = 0, len = 0;\n  var tag = d.tag;\n\n  /* get more bits while code value is above sum */\n  do {\n    cur = 2 * cur + (tag & 1);\n    tag >>>= 1;\n    ++len;\n\n    sum += t.table[len];\n    cur -= t.table[len];\n  } while (cur >= 0);\n  \n  d.tag = tag;\n  d.bitcount -= len;\n\n  return t.trans[sum + cur];\n}\n\n/* given a data stream, decode dynamic trees from it */\nfunction tinf_decode_trees(d, lt, dt) {\n  var hlit, hdist, hclen;\n  var i, num, length;\n\n  /* get 5 bits HLIT (257-286) */\n  hlit = tinf_read_bits(d, 5, 257);\n\n  /* get 5 bits HDIST (1-32) */\n  hdist = tinf_read_bits(d, 5, 1);\n\n  /* get 4 bits HCLEN (4-19) */\n  hclen = tinf_read_bits(d, 4, 4);\n\n  for (i = 0; i < 19; ++i) { lengths[i] = 0; }\n\n  /* read code lengths for code length alphabet */\n  for (i = 0; i < hclen; ++i) {\n    /* get 3 bits code length (0-7) */\n    var clen = tinf_read_bits(d, 3, 0);\n    lengths[clcidx[i]] = clen;\n  }\n\n  /* build code length tree */\n  tinf_build_tree(code_tree, lengths, 0, 19);\n\n  /* decode code lengths for the dynamic trees */\n  for (num = 0; num < hlit + hdist;) {\n    var sym = tinf_decode_symbol(d, code_tree);\n\n    switch (sym) {\n      case 16:\n        /* copy previous code length 3-6 times (read 2 bits) */\n        var prev = lengths[num - 1];\n        for (length = tinf_read_bits(d, 2, 3); length; --length) {\n          lengths[num++] = prev;\n        }\n        break;\n      case 17:\n        /* repeat code length 0 for 3-10 times (read 3 bits) */\n        for (length = tinf_read_bits(d, 3, 3); length; --length) {\n          lengths[num++] = 0;\n        }\n        break;\n      case 18:\n        /* repeat code length 0 for 11-138 times (read 7 bits) */\n        for (length = tinf_read_bits(d, 7, 11); length; --length) {\n          lengths[num++] = 0;\n        }\n        break;\n      default:\n        /* values 0-15 represent the actual code lengths */\n        lengths[num++] = sym;\n        break;\n    }\n  }\n\n  /* build dynamic trees */\n  tinf_build_tree(lt, lengths, 0, hlit);\n  tinf_build_tree(dt, lengths, hlit, hdist);\n}\n\n/* ----------------------------- *\n * -- block inflate functions -- *\n * ----------------------------- */\n\n/* given a stream and two trees, inflate a block of data */\nfunction tinf_inflate_block_data(d, lt, dt) {\n  while (1) {\n    var sym = tinf_decode_symbol(d, lt);\n\n    /* check for end of block */\n    if (sym === 256) {\n      return TINF_OK;\n    }\n\n    if (sym < 256) {\n      d.dest[d.destLen++] = sym;\n    } else {\n      var length, dist, offs;\n      var i;\n\n      sym -= 257;\n\n      /* possibly get more bits from length code */\n      length = tinf_read_bits(d, length_bits[sym], length_base[sym]);\n\n      dist = tinf_decode_symbol(d, dt);\n\n      /* possibly get more bits from distance code */\n      offs = d.destLen - tinf_read_bits(d, dist_bits[dist], dist_base[dist]);\n\n      /* copy match */\n      for (i = offs; i < offs + length; ++i) {\n        d.dest[d.destLen++] = d.dest[i];\n      }\n    }\n  }\n}\n\n/* inflate an uncompressed block of data */\nfunction tinf_inflate_uncompressed_block(d) {\n  var length, invlength;\n  var i;\n  \n  /* unread from bitbuffer */\n  while (d.bitcount > 8) {\n    d.sourceIndex--;\n    d.bitcount -= 8;\n  }\n\n  /* get length */\n  length = d.source[d.sourceIndex + 1];\n  length = 256 * length + d.source[d.sourceIndex];\n\n  /* get one's complement of length */\n  invlength = d.source[d.sourceIndex + 3];\n  invlength = 256 * invlength + d.source[d.sourceIndex + 2];\n\n  /* check length */\n  if (length !== (~invlength & 0x0000ffff))\n    { return TINF_DATA_ERROR; }\n\n  d.sourceIndex += 4;\n\n  /* copy block */\n  for (i = length; i; --i)\n    { d.dest[d.destLen++] = d.source[d.sourceIndex++]; }\n\n  /* make sure we start next block on a byte boundary */\n  d.bitcount = 0;\n\n  return TINF_OK;\n}\n\n/* inflate stream from source to dest */\nfunction tinf_uncompress(source, dest) {\n  var d = new Data(source, dest);\n  var bfinal, btype, res;\n\n  do {\n    /* read final block flag */\n    bfinal = tinf_getbit(d);\n\n    /* read block type (2 bits) */\n    btype = tinf_read_bits(d, 2, 0);\n\n    /* decompress block */\n    switch (btype) {\n      case 0:\n        /* decompress uncompressed block */\n        res = tinf_inflate_uncompressed_block(d);\n        break;\n      case 1:\n        /* decompress block with fixed huffman trees */\n        res = tinf_inflate_block_data(d, sltree, sdtree);\n        break;\n      case 2:\n        /* decompress block with dynamic huffman trees */\n        tinf_decode_trees(d, d.ltree, d.dtree);\n        res = tinf_inflate_block_data(d, d.ltree, d.dtree);\n        break;\n      default:\n        res = TINF_DATA_ERROR;\n    }\n\n    if (res !== TINF_OK)\n      { throw new Error('Data error'); }\n\n  } while (!bfinal);\n\n  if (d.destLen < d.dest.length) {\n    if (typeof d.dest.slice === 'function')\n      { return d.dest.slice(0, d.destLen); }\n    else\n      { return d.dest.subarray(0, d.destLen); }\n  }\n  \n  return d.dest;\n}\n\n/* -------------------- *\n * -- initialization -- *\n * -------------------- */\n\n/* build fixed huffman trees */\ntinf_build_fixed_trees(sltree, sdtree);\n\n/* build extra bits and base tables */\ntinf_build_bits_base(length_bits, length_base, 4, 3);\ntinf_build_bits_base(dist_bits, dist_base, 2, 1);\n\n/* fix a special case */\nlength_bits[28] = 0;\nlength_base[28] = 258;\n\nvar tinyInflate = tinf_uncompress;\n\n// The Bounding Box object\n\nfunction derive(v0, v1, v2, v3, t) {\n    return Math.pow(1 - t, 3) * v0 +\n        3 * Math.pow(1 - t, 2) * t * v1 +\n        3 * (1 - t) * Math.pow(t, 2) * v2 +\n        Math.pow(t, 3) * v3;\n}\n/**\n * A bounding box is an enclosing box that describes the smallest measure within which all the points lie.\n * It is used to calculate the bounding box of a glyph or text path.\n *\n * On initialization, x1/y1/x2/y2 will be NaN. Check if the bounding box is empty using `isEmpty()`.\n *\n * @exports opentype.BoundingBox\n * @class\n * @constructor\n */\nfunction BoundingBox() {\n    this.x1 = Number.NaN;\n    this.y1 = Number.NaN;\n    this.x2 = Number.NaN;\n    this.y2 = Number.NaN;\n}\n\n/**\n * Returns true if the bounding box is empty, that is, no points have been added to the box yet.\n */\nBoundingBox.prototype.isEmpty = function() {\n    return isNaN(this.x1) || isNaN(this.y1) || isNaN(this.x2) || isNaN(this.y2);\n};\n\n/**\n * Add the point to the bounding box.\n * The x1/y1/x2/y2 coordinates of the bounding box will now encompass the given point.\n * @param {number} x - The X coordinate of the point.\n * @param {number} y - The Y coordinate of the point.\n */\nBoundingBox.prototype.addPoint = function(x, y) {\n    if (typeof x === 'number') {\n        if (isNaN(this.x1) || isNaN(this.x2)) {\n            this.x1 = x;\n            this.x2 = x;\n        }\n        if (x < this.x1) {\n            this.x1 = x;\n        }\n        if (x > this.x2) {\n            this.x2 = x;\n        }\n    }\n    if (typeof y === 'number') {\n        if (isNaN(this.y1) || isNaN(this.y2)) {\n            this.y1 = y;\n            this.y2 = y;\n        }\n        if (y < this.y1) {\n            this.y1 = y;\n        }\n        if (y > this.y2) {\n            this.y2 = y;\n        }\n    }\n};\n\n/**\n * Add a X coordinate to the bounding box.\n * This extends the bounding box to include the X coordinate.\n * This function is used internally inside of addBezier.\n * @param {number} x - The X coordinate of the point.\n */\nBoundingBox.prototype.addX = function(x) {\n    this.addPoint(x, null);\n};\n\n/**\n * Add a Y coordinate to the bounding box.\n * This extends the bounding box to include the Y coordinate.\n * This function is used internally inside of addBezier.\n * @param {number} y - The Y coordinate of the point.\n */\nBoundingBox.prototype.addY = function(y) {\n    this.addPoint(null, y);\n};\n\n/**\n * Add a Bézier curve to the bounding box.\n * This extends the bounding box to include the entire Bézier.\n * @param {number} x0 - The starting X coordinate.\n * @param {number} y0 - The starting Y coordinate.\n * @param {number} x1 - The X coordinate of the first control point.\n * @param {number} y1 - The Y coordinate of the first control point.\n * @param {number} x2 - The X coordinate of the second control point.\n * @param {number} y2 - The Y coordinate of the second control point.\n * @param {number} x - The ending X coordinate.\n * @param {number} y - The ending Y coordinate.\n */\nBoundingBox.prototype.addBezier = function(x0, y0, x1, y1, x2, y2, x, y) {\n    // This code is based on http://nishiohirokazu.blogspot.com/2009/06/how-to-calculate-bezier-curves-bounding.html\n    // and https://github.com/icons8/svg-path-bounding-box\n\n    var p0 = [x0, y0];\n    var p1 = [x1, y1];\n    var p2 = [x2, y2];\n    var p3 = [x, y];\n\n    this.addPoint(x0, y0);\n    this.addPoint(x, y);\n\n    for (var i = 0; i <= 1; i++) {\n        var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n        var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n        var c = 3 * p1[i] - 3 * p0[i];\n\n        if (a === 0) {\n            if (b === 0) { continue; }\n            var t = -c / b;\n            if (0 < t && t < 1) {\n                if (i === 0) { this.addX(derive(p0[i], p1[i], p2[i], p3[i], t)); }\n                if (i === 1) { this.addY(derive(p0[i], p1[i], p2[i], p3[i], t)); }\n            }\n            continue;\n        }\n\n        var b2ac = Math.pow(b, 2) - 4 * c * a;\n        if (b2ac < 0) { continue; }\n        var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n        if (0 < t1 && t1 < 1) {\n            if (i === 0) { this.addX(derive(p0[i], p1[i], p2[i], p3[i], t1)); }\n            if (i === 1) { this.addY(derive(p0[i], p1[i], p2[i], p3[i], t1)); }\n        }\n        var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n        if (0 < t2 && t2 < 1) {\n            if (i === 0) { this.addX(derive(p0[i], p1[i], p2[i], p3[i], t2)); }\n            if (i === 1) { this.addY(derive(p0[i], p1[i], p2[i], p3[i], t2)); }\n        }\n    }\n};\n\n/**\n * Add a quadratic curve to the bounding box.\n * This extends the bounding box to include the entire quadratic curve.\n * @param {number} x0 - The starting X coordinate.\n * @param {number} y0 - The starting Y coordinate.\n * @param {number} x1 - The X coordinate of the control point.\n * @param {number} y1 - The Y coordinate of the control point.\n * @param {number} x - The ending X coordinate.\n * @param {number} y - The ending Y coordinate.\n */\nBoundingBox.prototype.addQuad = function(x0, y0, x1, y1, x, y) {\n    var cp1x = x0 + 2 / 3 * (x1 - x0);\n    var cp1y = y0 + 2 / 3 * (y1 - y0);\n    var cp2x = cp1x + 1 / 3 * (x - x0);\n    var cp2y = cp1y + 1 / 3 * (y - y0);\n    this.addBezier(x0, y0, cp1x, cp1y, cp2x, cp2y, x, y);\n};\n\n// Geometric objects\n\n/**\n * A bézier path containing a set of path commands similar to a SVG path.\n * Paths can be drawn on a context using `draw`.\n * @exports opentype.Path\n * @class\n * @constructor\n */\nfunction Path() {\n    this.commands = [];\n    this.fill = 'black';\n    this.stroke = null;\n    this.strokeWidth = 1;\n}\n\n/**\n * @param  {number} x\n * @param  {number} y\n */\nPath.prototype.moveTo = function(x, y) {\n    this.commands.push({\n        type: 'M',\n        x: x,\n        y: y\n    });\n};\n\n/**\n * @param  {number} x\n * @param  {number} y\n */\nPath.prototype.lineTo = function(x, y) {\n    this.commands.push({\n        type: 'L',\n        x: x,\n        y: y\n    });\n};\n\n/**\n * Draws cubic curve\n * @function\n * curveTo\n * @memberof opentype.Path.prototype\n * @param  {number} x1 - x of control 1\n * @param  {number} y1 - y of control 1\n * @param  {number} x2 - x of control 2\n * @param  {number} y2 - y of control 2\n * @param  {number} x - x of path point\n * @param  {number} y - y of path point\n */\n\n/**\n * Draws cubic curve\n * @function\n * bezierCurveTo\n * @memberof opentype.Path.prototype\n * @param  {number} x1 - x of control 1\n * @param  {number} y1 - y of control 1\n * @param  {number} x2 - x of control 2\n * @param  {number} y2 - y of control 2\n * @param  {number} x - x of path point\n * @param  {number} y - y of path point\n * @see curveTo\n */\nPath.prototype.curveTo = Path.prototype.bezierCurveTo = function(x1, y1, x2, y2, x, y) {\n    this.commands.push({\n        type: 'C',\n        x1: x1,\n        y1: y1,\n        x2: x2,\n        y2: y2,\n        x: x,\n        y: y\n    });\n};\n\n/**\n * Draws quadratic curve\n * @function\n * quadraticCurveTo\n * @memberof opentype.Path.prototype\n * @param  {number} x1 - x of control\n * @param  {number} y1 - y of control\n * @param  {number} x - x of path point\n * @param  {number} y - y of path point\n */\n\n/**\n * Draws quadratic curve\n * @function\n * quadTo\n * @memberof opentype.Path.prototype\n * @param  {number} x1 - x of control\n * @param  {number} y1 - y of control\n * @param  {number} x - x of path point\n * @param  {number} y - y of path point\n */\nPath.prototype.quadTo = Path.prototype.quadraticCurveTo = function(x1, y1, x, y) {\n    this.commands.push({\n        type: 'Q',\n        x1: x1,\n        y1: y1,\n        x: x,\n        y: y\n    });\n};\n\n/**\n * Closes the path\n * @function closePath\n * @memberof opentype.Path.prototype\n */\n\n/**\n * Close the path\n * @function close\n * @memberof opentype.Path.prototype\n */\nPath.prototype.close = Path.prototype.closePath = function() {\n    this.commands.push({\n        type: 'Z'\n    });\n};\n\n/**\n * Add the given path or list of commands to the commands of this path.\n * @param  {Array} pathOrCommands - another opentype.Path, an opentype.BoundingBox, or an array of commands.\n */\nPath.prototype.extend = function(pathOrCommands) {\n    if (pathOrCommands.commands) {\n        pathOrCommands = pathOrCommands.commands;\n    } else if (pathOrCommands instanceof BoundingBox) {\n        var box = pathOrCommands;\n        this.moveTo(box.x1, box.y1);\n        this.lineTo(box.x2, box.y1);\n        this.lineTo(box.x2, box.y2);\n        this.lineTo(box.x1, box.y2);\n        this.close();\n        return;\n    }\n\n    Array.prototype.push.apply(this.commands, pathOrCommands);\n};\n\n/**\n * Calculate the bounding box of the path.\n * @returns {opentype.BoundingBox}\n */\nPath.prototype.getBoundingBox = function() {\n    var box = new BoundingBox();\n\n    var startX = 0;\n    var startY = 0;\n    var prevX = 0;\n    var prevY = 0;\n    for (var i = 0; i < this.commands.length; i++) {\n        var cmd = this.commands[i];\n        switch (cmd.type) {\n            case 'M':\n                box.addPoint(cmd.x, cmd.y);\n                startX = prevX = cmd.x;\n                startY = prevY = cmd.y;\n                break;\n            case 'L':\n                box.addPoint(cmd.x, cmd.y);\n                prevX = cmd.x;\n                prevY = cmd.y;\n                break;\n            case 'Q':\n                box.addQuad(prevX, prevY, cmd.x1, cmd.y1, cmd.x, cmd.y);\n                prevX = cmd.x;\n                prevY = cmd.y;\n                break;\n            case 'C':\n                box.addBezier(prevX, prevY, cmd.x1, cmd.y1, cmd.x2, cmd.y2, cmd.x, cmd.y);\n                prevX = cmd.x;\n                prevY = cmd.y;\n                break;\n            case 'Z':\n                prevX = startX;\n                prevY = startY;\n                break;\n            default:\n                throw new Error('Unexpected path command ' + cmd.type);\n        }\n    }\n    if (box.isEmpty()) {\n        box.addPoint(0, 0);\n    }\n    return box;\n};\n\n/**\n * Draw the path to a 2D context.\n * @param {CanvasRenderingContext2D} ctx - A 2D drawing context.\n */\nPath.prototype.draw = function(ctx) {\n    ctx.beginPath();\n    for (var i = 0; i < this.commands.length; i += 1) {\n        var cmd = this.commands[i];\n        if (cmd.type === 'M') {\n            ctx.moveTo(cmd.x, cmd.y);\n        } else if (cmd.type === 'L') {\n            ctx.lineTo(cmd.x, cmd.y);\n        } else if (cmd.type === 'C') {\n            ctx.bezierCurveTo(cmd.x1, cmd.y1, cmd.x2, cmd.y2, cmd.x, cmd.y);\n        } else if (cmd.type === 'Q') {\n            ctx.quadraticCurveTo(cmd.x1, cmd.y1, cmd.x, cmd.y);\n        } else if (cmd.type === 'Z') {\n            ctx.closePath();\n        }\n    }\n\n    if (this.fill) {\n        ctx.fillStyle = this.fill;\n        ctx.fill();\n    }\n\n    if (this.stroke) {\n        ctx.strokeStyle = this.stroke;\n        ctx.lineWidth = this.strokeWidth;\n        ctx.stroke();\n    }\n};\n\n/**\n * Convert the Path to a string of path data instructions\n * See http://www.w3.org/TR/SVG/paths.html#PathData\n * @param  {number} [decimalPlaces=2] - The amount of decimal places for floating-point values\n * @return {string}\n */\nPath.prototype.toPathData = function(decimalPlaces) {\n    decimalPlaces = decimalPlaces !== undefined ? decimalPlaces : 2;\n\n    function floatToString(v) {\n        if (Math.round(v) === v) {\n            return '' + Math.round(v);\n        } else {\n            return v.toFixed(decimalPlaces);\n        }\n    }\n\n    function packValues() {\n        var arguments$1 = arguments;\n\n        var s = '';\n        for (var i = 0; i < arguments.length; i += 1) {\n            var v = arguments$1[i];\n            if (v >= 0 && i > 0) {\n                s += ' ';\n            }\n\n            s += floatToString(v);\n        }\n\n        return s;\n    }\n\n    var d = '';\n    for (var i = 0; i < this.commands.length; i += 1) {\n        var cmd = this.commands[i];\n        if (cmd.type === 'M') {\n            d += 'M' + packValues(cmd.x, cmd.y);\n        } else if (cmd.type === 'L') {\n            d += 'L' + packValues(cmd.x, cmd.y);\n        } else if (cmd.type === 'C') {\n            d += 'C' + packValues(cmd.x1, cmd.y1, cmd.x2, cmd.y2, cmd.x, cmd.y);\n        } else if (cmd.type === 'Q') {\n            d += 'Q' + packValues(cmd.x1, cmd.y1, cmd.x, cmd.y);\n        } else if (cmd.type === 'Z') {\n            d += 'Z';\n        }\n    }\n\n    return d;\n};\n\n/**\n * Convert the path to an SVG <path> element, as a string.\n * @param  {number} [decimalPlaces=2] - The amount of decimal places for floating-point values\n * @return {string}\n */\nPath.prototype.toSVG = function(decimalPlaces) {\n    var svg = '<path d=\"';\n    svg += this.toPathData(decimalPlaces);\n    svg += '\"';\n    if (this.fill && this.fill !== 'black') {\n        if (this.fill === null) {\n            svg += ' fill=\"none\"';\n        } else {\n            svg += ' fill=\"' + this.fill + '\"';\n        }\n    }\n\n    if (this.stroke) {\n        svg += ' stroke=\"' + this.stroke + '\" stroke-width=\"' + this.strokeWidth + '\"';\n    }\n\n    svg += '/>';\n    return svg;\n};\n\n/**\n * Convert the path to a DOM element.\n * @param  {number} [decimalPlaces=2] - The amount of decimal places for floating-point values\n * @return {SVGPathElement}\n */\nPath.prototype.toDOMElement = function(decimalPlaces) {\n    var temporaryPath = this.toPathData(decimalPlaces);\n    var newPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n    newPath.setAttribute('d', temporaryPath);\n\n    return newPath;\n};\n\n// Run-time checking of preconditions.\n\nfunction fail(message) {\n    throw new Error(message);\n}\n\n// Precondition function that checks if the given predicate is true.\n// If not, it will throw an error.\nfunction argument(predicate, message) {\n    if (!predicate) {\n        fail(message);\n    }\n}\nvar check = { fail: fail, argument: argument, assert: argument };\n\n// Data types used in the OpenType font file.\n\nvar LIMIT16 = 32768; // The limit at which a 16-bit number switches signs == 2^15\nvar LIMIT32 = 2147483648; // The limit at which a 32-bit number switches signs == 2 ^ 31\n\n/**\n * @exports opentype.decode\n * @class\n */\nvar decode = {};\n/**\n * @exports opentype.encode\n * @class\n */\nvar encode = {};\n/**\n * @exports opentype.sizeOf\n * @class\n */\nvar sizeOf = {};\n\n// Return a function that always returns the same value.\nfunction constant(v) {\n    return function() {\n        return v;\n    };\n}\n\n// OpenType data types //////////////////////////////////////////////////////\n\n/**\n * Convert an 8-bit unsigned integer to a list of 1 byte.\n * @param {number}\n * @returns {Array}\n */\nencode.BYTE = function(v) {\n    check.argument(v >= 0 && v <= 255, 'Byte value should be between 0 and 255.');\n    return [v];\n};\n/**\n * @constant\n * @type {number}\n */\nsizeOf.BYTE = constant(1);\n\n/**\n * Convert a 8-bit signed integer to a list of 1 byte.\n * @param {string}\n * @returns {Array}\n */\nencode.CHAR = function(v) {\n    return [v.charCodeAt(0)];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.CHAR = constant(1);\n\n/**\n * Convert an ASCII string to a list of bytes.\n * @param {string}\n * @returns {Array}\n */\nencode.CHARARRAY = function(v) {\n    if (typeof v === 'undefined') {\n        v = '';\n        console.warn('Undefined CHARARRAY encountered and treated as an empty string. This is probably caused by a missing glyph name.');\n    }\n    var b = [];\n    for (var i = 0; i < v.length; i += 1) {\n        b[i] = v.charCodeAt(i);\n    }\n\n    return b;\n};\n\n/**\n * @param {Array}\n * @returns {number}\n */\nsizeOf.CHARARRAY = function(v) {\n    if (typeof v === 'undefined') {\n        return 0;\n    }\n    return v.length;\n};\n\n/**\n * Convert a 16-bit unsigned integer to a list of 2 bytes.\n * @param {number}\n * @returns {Array}\n */\nencode.USHORT = function(v) {\n    return [(v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.USHORT = constant(2);\n\n/**\n * Convert a 16-bit signed integer to a list of 2 bytes.\n * @param {number}\n * @returns {Array}\n */\nencode.SHORT = function(v) {\n    // Two's complement\n    if (v >= LIMIT16) {\n        v = -(2 * LIMIT16 - v);\n    }\n\n    return [(v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.SHORT = constant(2);\n\n/**\n * Convert a 24-bit unsigned integer to a list of 3 bytes.\n * @param {number}\n * @returns {Array}\n */\nencode.UINT24 = function(v) {\n    return [(v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.UINT24 = constant(3);\n\n/**\n * Convert a 32-bit unsigned integer to a list of 4 bytes.\n * @param {number}\n * @returns {Array}\n */\nencode.ULONG = function(v) {\n    return [(v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.ULONG = constant(4);\n\n/**\n * Convert a 32-bit unsigned integer to a list of 4 bytes.\n * @param {number}\n * @returns {Array}\n */\nencode.LONG = function(v) {\n    // Two's complement\n    if (v >= LIMIT32) {\n        v = -(2 * LIMIT32 - v);\n    }\n\n    return [(v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.LONG = constant(4);\n\nencode.FIXED = encode.ULONG;\nsizeOf.FIXED = sizeOf.ULONG;\n\nencode.FWORD = encode.SHORT;\nsizeOf.FWORD = sizeOf.SHORT;\n\nencode.UFWORD = encode.USHORT;\nsizeOf.UFWORD = sizeOf.USHORT;\n\n/**\n * Convert a 32-bit Apple Mac timestamp integer to a list of 8 bytes, 64-bit timestamp.\n * @param {number}\n * @returns {Array}\n */\nencode.LONGDATETIME = function(v) {\n    return [0, 0, 0, 0, (v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.LONGDATETIME = constant(8);\n\n/**\n * Convert a 4-char tag to a list of 4 bytes.\n * @param {string}\n * @returns {Array}\n */\nencode.TAG = function(v) {\n    check.argument(v.length === 4, 'Tag should be exactly 4 ASCII characters.');\n    return [v.charCodeAt(0),\n            v.charCodeAt(1),\n            v.charCodeAt(2),\n            v.charCodeAt(3)];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.TAG = constant(4);\n\n// CFF data types ///////////////////////////////////////////////////////////\n\nencode.Card8 = encode.BYTE;\nsizeOf.Card8 = sizeOf.BYTE;\n\nencode.Card16 = encode.USHORT;\nsizeOf.Card16 = sizeOf.USHORT;\n\nencode.OffSize = encode.BYTE;\nsizeOf.OffSize = sizeOf.BYTE;\n\nencode.SID = encode.USHORT;\nsizeOf.SID = sizeOf.USHORT;\n\n// Convert a numeric operand or charstring number to a variable-size list of bytes.\n/**\n * Convert a numeric operand or charstring number to a variable-size list of bytes.\n * @param {number}\n * @returns {Array}\n */\nencode.NUMBER = function(v) {\n    if (v >= -107 && v <= 107) {\n        return [v + 139];\n    } else if (v >= 108 && v <= 1131) {\n        v = v - 108;\n        return [(v >> 8) + 247, v & 0xFF];\n    } else if (v >= -1131 && v <= -108) {\n        v = -v - 108;\n        return [(v >> 8) + 251, v & 0xFF];\n    } else if (v >= -32768 && v <= 32767) {\n        return encode.NUMBER16(v);\n    } else {\n        return encode.NUMBER32(v);\n    }\n};\n\n/**\n * @param {number}\n * @returns {number}\n */\nsizeOf.NUMBER = function(v) {\n    return encode.NUMBER(v).length;\n};\n\n/**\n * Convert a signed number between -32768 and +32767 to a three-byte value.\n * This ensures we always use three bytes, but is not the most compact format.\n * @param {number}\n * @returns {Array}\n */\nencode.NUMBER16 = function(v) {\n    return [28, (v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.NUMBER16 = constant(3);\n\n/**\n * Convert a signed number between -(2^31) and +(2^31-1) to a five-byte value.\n * This is useful if you want to be sure you always use four bytes,\n * at the expense of wasting a few bytes for smaller numbers.\n * @param {number}\n * @returns {Array}\n */\nencode.NUMBER32 = function(v) {\n    return [29, (v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF];\n};\n\n/**\n * @constant\n * @type {number}\n */\nsizeOf.NUMBER32 = constant(5);\n\n/**\n * @param {number}\n * @returns {Array}\n */\nencode.REAL = function(v) {\n    var value = v.toString();\n\n    // Some numbers use an epsilon to encode the value. (e.g. JavaScript will store 0.0000001 as 1e-7)\n    // This code converts it back to a number without the epsilon.\n    var m = /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/.exec(value);\n    if (m) {\n        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));\n        value = (Math.round(v * epsilon) / epsilon).toString();\n    }\n\n    var nibbles = '';\n    for (var i = 0, ii = value.length; i < ii; i += 1) {\n        var c = value[i];\n        if (c === 'e') {\n            nibbles += value[++i] === '-' ? 'c' : 'b';\n        } else if (c === '.') {\n            nibbles += 'a';\n        } else if (c === '-') {\n            nibbles += 'e';\n        } else {\n            nibbles += c;\n        }\n    }\n\n    nibbles += (nibbles.length & 1) ? 'f' : 'ff';\n    var out = [30];\n    for (var i$1 = 0, ii$1 = nibbles.length; i$1 < ii$1; i$1 += 2) {\n        out.push(parseInt(nibbles.substr(i$1, 2), 16));\n    }\n\n    return out;\n};\n\n/**\n * @param {number}\n * @returns {number}\n */\nsizeOf.REAL = function(v) {\n    return encode.REAL(v).length;\n};\n\nencode.NAME = encode.CHARARRAY;\nsizeOf.NAME = sizeOf.CHARARRAY;\n\nencode.STRING = encode.CHARARRAY;\nsizeOf.STRING = sizeOf.CHARARRAY;\n\n/**\n * @param {DataView} data\n * @param {number} offset\n * @param {number} numBytes\n * @returns {string}\n */\ndecode.UTF8 = function(data, offset, numBytes) {\n    var codePoints = [];\n    var numChars = numBytes;\n    for (var j = 0; j < numChars; j++, offset += 1) {\n        codePoints[j] = data.getUint8(offset);\n    }\n\n    return String.fromCharCode.apply(null, codePoints);\n};\n\n/**\n * @param {DataView} data\n * @param {number} offset\n * @param {number} numBytes\n * @returns {string}\n */\ndecode.UTF16 = function(data, offset, numBytes) {\n    var codePoints = [];\n    var numChars = numBytes / 2;\n    for (var j = 0; j < numChars; j++, offset += 2) {\n        codePoints[j] = data.getUint16(offset);\n    }\n\n    return String.fromCharCode.apply(null, codePoints);\n};\n\n/**\n * Convert a JavaScript string to UTF16-BE.\n * @param {string}\n * @returns {Array}\n */\nencode.UTF16 = function(v) {\n    var b = [];\n    for (var i = 0; i < v.length; i += 1) {\n        var codepoint = v.charCodeAt(i);\n        b[b.length] = (codepoint >> 8) & 0xFF;\n        b[b.length] = codepoint & 0xFF;\n    }\n\n    return b;\n};\n\n/**\n * @param {string}\n * @returns {number}\n */\nsizeOf.UTF16 = function(v) {\n    return v.length * 2;\n};\n\n// Data for converting old eight-bit Macintosh encodings to Unicode.\n// This representation is optimized for decoding; encoding is slower\n// and needs more memory. The assumption is that all opentype.js users\n// want to open fonts, but saving a font will be comparatively rare\n// so it can be more expensive. Keyed by IANA character set name.\n//\n// Python script for generating these strings:\n//\n//     s = u''.join([chr(c).decode('mac_greek') for c in range(128, 256)])\n//     print(s.encode('utf-8'))\n/**\n * @private\n */\nvar eightBitMacEncodings = {\n    'x-mac-croatian':  // Python: 'mac_croatian'\n    'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø' +\n    '¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊©⁄€‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ',\n    'x-mac-cyrillic':  // Python: 'mac_cyrillic'\n    'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњ' +\n    'јЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю',\n    'x-mac-gaelic': // http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/GAELIC.TXT\n    'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØḂ±≤≥ḃĊċḊḋḞḟĠġṀæø' +\n    'ṁṖṗɼƒſṠ«»… ÀÃÕŒœ–—“”‘’ṡẛÿŸṪ€‹›Ŷŷṫ·Ỳỳ⁊ÂÊÁËÈÍÎÏÌÓÔ♣ÒÚÛÙıÝýŴŵẄẅẀẁẂẃ',\n    'x-mac-greek':  // Python: 'mac_greek'\n    'Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦€ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩ' +\n    'άΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ\\u00AD',\n    'x-mac-icelandic':  // Python: 'mac_iceland'\n    'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø' +\n    '¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n    'x-mac-inuit': // http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/INUIT.TXT\n    'ᐃᐄᐅᐆᐊᐋᐱᐲᐳᐴᐸᐹᑉᑎᑏᑐᑑᑕᑖᑦᑭᑮᑯᑰᑲᑳᒃᒋᒌᒍᒎᒐᒑ°ᒡᒥᒦ•¶ᒧ®©™ᒨᒪᒫᒻᓂᓃᓄᓅᓇᓈᓐᓯᓰᓱᓲᓴᓵᔅᓕᓖᓗ' +\n    'ᓘᓚᓛᓪᔨᔩᔪᔫᔭ… ᔮᔾᕕᕖᕗ–—“”‘’ᕘᕙᕚᕝᕆᕇᕈᕉᕋᕌᕐᕿᖀᖁᖂᖃᖄᖅᖏᖐᖑᖒᖓᖔᖕᙱᙲᙳᙴᙵᙶᖖᖠᖡᖢᖣᖤᖥᖦᕼŁł',\n    'x-mac-ce':  // Python: 'mac_latin2'\n    'ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅ' +\n    'ņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ',\n    macintosh:  // Python: 'mac_roman'\n    'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø' +\n    '¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n    'x-mac-romanian':  // Python: 'mac_romanian'\n    'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂȘ∞±≤≥¥µ∂∑∏π∫ªºΩăș' +\n    '¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›Țț‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n    'x-mac-turkish':  // Python: 'mac_turkish'\n    'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø' +\n    '¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙˆ˜¯˘˙˚¸˝˛ˇ'\n};\n\n/**\n * Decodes an old-style Macintosh string. Returns either a Unicode JavaScript\n * string, or 'undefined' if the encoding is unsupported. For example, we do\n * not support Chinese, Japanese or Korean because these would need large\n * mapping tables.\n * @param {DataView} dataView\n * @param {number} offset\n * @param {number} dataLength\n * @param {string} encoding\n * @returns {string}\n */\ndecode.MACSTRING = function(dataView, offset, dataLength, encoding) {\n    var table = eightBitMacEncodings[encoding];\n    if (table === undefined) {\n        return undefined;\n    }\n\n    var result = '';\n    for (var i = 0; i < dataLength; i++) {\n        var c = dataView.getUint8(offset + i);\n        // In all eight-bit Mac encodings, the characters 0x00..0x7F are\n        // mapped to U+0000..U+007F; we only need to look up the others.\n        if (c <= 0x7F) {\n            result += String.fromCharCode(c);\n        } else {\n            result += table[c & 0x7F];\n        }\n    }\n\n    return result;\n};\n\n// Helper function for encode.MACSTRING. Returns a dictionary for mapping\n// Unicode character codes to their 8-bit MacOS equivalent. This table\n// is not exactly a super cheap data structure, but we do not care because\n// encoding Macintosh strings is only rarely needed in typical applications.\nvar macEncodingTableCache = typeof WeakMap === 'function' && new WeakMap();\nvar macEncodingCacheKeys;\nvar getMacEncodingTable = function (encoding) {\n    // Since we use encoding as a cache key for WeakMap, it has to be\n    // a String object and not a literal. And at least on NodeJS 2.10.1,\n    // WeakMap requires that the same String instance is passed for cache hits.\n    if (!macEncodingCacheKeys) {\n        macEncodingCacheKeys = {};\n        for (var e in eightBitMacEncodings) {\n            /*jshint -W053 */  // Suppress \"Do not use String as a constructor.\"\n            macEncodingCacheKeys[e] = new String(e);\n        }\n    }\n\n    var cacheKey = macEncodingCacheKeys[encoding];\n    if (cacheKey === undefined) {\n        return undefined;\n    }\n\n    // We can't do \"if (cache.has(key)) {return cache.get(key)}\" here:\n    // since garbage collection may run at any time, it could also kick in\n    // between the calls to cache.has() and cache.get(). In that case,\n    // we would return 'undefined' even though we do support the encoding.\n    if (macEncodingTableCache) {\n        var cachedTable = macEncodingTableCache.get(cacheKey);\n        if (cachedTable !== undefined) {\n            return cachedTable;\n        }\n    }\n\n    var decodingTable = eightBitMacEncodings[encoding];\n    if (decodingTable === undefined) {\n        return undefined;\n    }\n\n    var encodingTable = {};\n    for (var i = 0; i < decodingTable.length; i++) {\n        encodingTable[decodingTable.charCodeAt(i)] = i + 0x80;\n    }\n\n    if (macEncodingTableCache) {\n        macEncodingTableCache.set(cacheKey, encodingTable);\n    }\n\n    return encodingTable;\n};\n\n/**\n * Encodes an old-style Macintosh string. Returns a byte array upon success.\n * If the requested encoding is unsupported, or if the input string contains\n * a character that cannot be expressed in the encoding, the function returns\n * 'undefined'.\n * @param {string} str\n * @param {string} encoding\n * @returns {Array}\n */\nencode.MACSTRING = function(str, encoding) {\n    var table = getMacEncodingTable(encoding);\n    if (table === undefined) {\n        return undefined;\n    }\n\n    var result = [];\n    for (var i = 0; i < str.length; i++) {\n        var c = str.charCodeAt(i);\n\n        // In all eight-bit Mac encodings, the characters 0x00..0x7F are\n        // mapped to U+0000..U+007F; we only need to look up the others.\n        if (c >= 0x80) {\n            c = table[c];\n            if (c === undefined) {\n                // str contains a Unicode character that cannot be encoded\n                // in the requested encoding.\n                return undefined;\n            }\n        }\n        result[i] = c;\n        // result.push(c);\n    }\n\n    return result;\n};\n\n/**\n * @param {string} str\n * @param {string} encoding\n * @returns {number}\n */\nsizeOf.MACSTRING = function(str, encoding) {\n    var b = encode.MACSTRING(str, encoding);\n    if (b !== undefined) {\n        return b.length;\n    } else {\n        return 0;\n    }\n};\n\n// Helper for encode.VARDELTAS\nfunction isByteEncodable(value) {\n    return value >= -128 && value <= 127;\n}\n\n// Helper for encode.VARDELTAS\nfunction encodeVarDeltaRunAsZeroes(deltas, pos, result) {\n    var runLength = 0;\n    var numDeltas = deltas.length;\n    while (pos < numDeltas && runLength < 64 && deltas[pos] === 0) {\n        ++pos;\n        ++runLength;\n    }\n    result.push(0x80 | (runLength - 1));\n    return pos;\n}\n\n// Helper for encode.VARDELTAS\nfunction encodeVarDeltaRunAsBytes(deltas, offset, result) {\n    var runLength = 0;\n    var numDeltas = deltas.length;\n    var pos = offset;\n    while (pos < numDeltas && runLength < 64) {\n        var value = deltas[pos];\n        if (!isByteEncodable(value)) {\n            break;\n        }\n\n        // Within a byte-encoded run of deltas, a single zero is best\n        // stored literally as 0x00 value. However, if we have two or\n        // more zeroes in a sequence, it is better to start a new run.\n        // Fore example, the sequence of deltas [15, 15, 0, 15, 15]\n        // becomes 6 bytes (04 0F 0F 00 0F 0F) when storing the zero\n        // within the current run, but 7 bytes (01 0F 0F 80 01 0F 0F)\n        // when starting a new run.\n        if (value === 0 && pos + 1 < numDeltas && deltas[pos + 1] === 0) {\n            break;\n        }\n\n        ++pos;\n        ++runLength;\n    }\n    result.push(runLength - 1);\n    for (var i = offset; i < pos; ++i) {\n        result.push((deltas[i] + 256) & 0xff);\n    }\n    return pos;\n}\n\n// Helper for encode.VARDELTAS\nfunction encodeVarDeltaRunAsWords(deltas, offset, result) {\n    var runLength = 0;\n    var numDeltas = deltas.length;\n    var pos = offset;\n    while (pos < numDeltas && runLength < 64) {\n        var value = deltas[pos];\n\n        // Within a word-encoded run of deltas, it is easiest to start\n        // a new run (with a different encoding) whenever we encounter\n        // a zero value. For example, the sequence [0x6666, 0, 0x7777]\n        // needs 7 bytes when storing the zero inside the current run\n        // (42 66 66 00 00 77 77), and equally 7 bytes when starting a\n        // new run (40 66 66 80 40 77 77).\n        if (value === 0) {\n            break;\n        }\n\n        // Within a word-encoded run of deltas, a single value in the\n        // range (-128..127) should be encoded within the current run\n        // because it is more compact. For example, the sequence\n        // [0x6666, 2, 0x7777] becomes 7 bytes when storing the value\n        // literally (42 66 66 00 02 77 77), but 8 bytes when starting\n        // a new run (40 66 66 00 02 40 77 77).\n        if (isByteEncodable(value) && pos + 1 < numDeltas && isByteEncodable(deltas[pos + 1])) {\n            break;\n        }\n\n        ++pos;\n        ++runLength;\n    }\n    result.push(0x40 | (runLength - 1));\n    for (var i = offset; i < pos; ++i) {\n        var val = deltas[i];\n        result.push(((val + 0x10000) >> 8) & 0xff, (val + 0x100) & 0xff);\n    }\n    return pos;\n}\n\n/**\n * Encode a list of variation adjustment deltas.\n *\n * Variation adjustment deltas are used in ‘gvar’ and ‘cvar’ tables.\n * They indicate how points (in ‘gvar’) or values (in ‘cvar’) get adjusted\n * when generating instances of variation fonts.\n *\n * @see https://www.microsoft.com/typography/otspec/gvar.htm\n * @see https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6gvar.html\n * @param {Array}\n * @return {Array}\n */\nencode.VARDELTAS = function(deltas) {\n    var pos = 0;\n    var result = [];\n    while (pos < deltas.length) {\n        var value = deltas[pos];\n        if (value === 0) {\n            pos = encodeVarDeltaRunAsZeroes(deltas, pos, result);\n        } else if (value >= -128 && value <= 127) {\n            pos = encodeVarDeltaRunAsBytes(deltas, pos, result);\n        } else {\n            pos = encodeVarDeltaRunAsWords(deltas, pos, result);\n        }\n    }\n    return result;\n};\n\n// Convert a list of values to a CFF INDEX structure.\n// The values should be objects containing name / type / value.\n/**\n * @param {Array} l\n * @returns {Array}\n */\nencode.INDEX = function(l) {\n    //var offset, offsets, offsetEncoder, encodedOffsets, encodedOffset, data,\n    //    i, v;\n    // Because we have to know which data type to use to encode the offsets,\n    // we have to go through the values twice: once to encode the data and\n    // calculate the offsets, then again to encode the offsets using the fitting data type.\n    var offset = 1; // First offset is always 1.\n    var offsets = [offset];\n    var data = [];\n    for (var i = 0; i < l.length; i += 1) {\n        var v = encode.OBJECT(l[i]);\n        Array.prototype.push.apply(data, v);\n        offset += v.length;\n        offsets.push(offset);\n    }\n\n    if (data.length === 0) {\n        return [0, 0];\n    }\n\n    var encodedOffsets = [];\n    var offSize = (1 + Math.floor(Math.log(offset) / Math.log(2)) / 8) | 0;\n    var offsetEncoder = [undefined, encode.BYTE, encode.USHORT, encode.UINT24, encode.ULONG][offSize];\n    for (var i$1 = 0; i$1 < offsets.length; i$1 += 1) {\n        var encodedOffset = offsetEncoder(offsets[i$1]);\n        Array.prototype.push.apply(encodedOffsets, encodedOffset);\n    }\n\n    return Array.prototype.concat(encode.Card16(l.length),\n                           encode.OffSize(offSize),\n                           encodedOffsets,\n                           data);\n};\n\n/**\n * @param {Array}\n * @returns {number}\n */\nsizeOf.INDEX = function(v) {\n    return encode.INDEX(v).length;\n};\n\n/**\n * Convert an object to a CFF DICT structure.\n * The keys should be numeric.\n * The values should be objects containing name / type / value.\n * @param {Object} m\n * @returns {Array}\n */\nencode.DICT = function(m) {\n    var d = [];\n    var keys = Object.keys(m);\n    var length = keys.length;\n\n    for (var i = 0; i < length; i += 1) {\n        // Object.keys() return string keys, but our keys are always numeric.\n        var k = parseInt(keys[i], 0);\n        var v = m[k];\n        // Value comes before the key.\n        d = d.concat(encode.OPERAND(v.value, v.type));\n        d = d.concat(encode.OPERATOR(k));\n    }\n\n    return d;\n};\n\n/**\n * @param {Object}\n * @returns {number}\n */\nsizeOf.DICT = function(m) {\n    return encode.DICT(m).length;\n};\n\n/**\n * @param {number}\n * @returns {Array}\n */\nencode.OPERATOR = function(v) {\n    if (v < 1200) {\n        return [v];\n    } else {\n        return [12, v - 1200];\n    }\n};\n\n/**\n * @param {Array} v\n * @param {string}\n * @returns {Array}\n */\nencode.OPERAND = function(v, type) {\n    var d = [];\n    if (Array.isArray(type)) {\n        for (var i = 0; i < type.length; i += 1) {\n            check.argument(v.length === type.length, 'Not enough arguments given for type' + type);\n            d = d.concat(encode.OPERAND(v[i], type[i]));\n        }\n    } else {\n        if (type === 'SID') {\n            d = d.concat(encode.NUMBER(v));\n        } else if (type === 'offset') {\n            // We make it easy for ourselves and always encode offsets as\n            // 4 bytes. This makes offset calculation for the top dict easier.\n            d = d.concat(encode.NUMBER32(v));\n        } else if (type === 'number') {\n            d = d.concat(encode.NUMBER(v));\n        } else if (type === 'real') {\n            d = d.concat(encode.REAL(v));\n        } else {\n            throw new Error('Unknown operand type ' + type);\n            // FIXME Add support for booleans\n        }\n    }\n\n    return d;\n};\n\nencode.OP = encode.BYTE;\nsizeOf.OP = sizeOf.BYTE;\n\n// memoize charstring encoding using WeakMap if available\nvar wmm = typeof WeakMap === 'function' && new WeakMap();\n\n/**\n * Convert a list of CharString operations to bytes.\n * @param {Array}\n * @returns {Array}\n */\nencode.CHARSTRING = function(ops) {\n    // See encode.MACSTRING for why we don't do \"if (wmm && wmm.has(ops))\".\n    if (wmm) {\n        var cachedValue = wmm.get(ops);\n        if (cachedValue !== undefined) {\n            return cachedValue;\n        }\n    }\n\n    var d = [];\n    var length = ops.length;\n\n    for (var i = 0; i < length; i += 1) {\n        var op = ops[i];\n        d = d.concat(encode[op.type](op.value));\n    }\n\n    if (wmm) {\n        wmm.set(ops, d);\n    }\n\n    return d;\n};\n\n/**\n * @param {Array}\n * @returns {number}\n */\nsizeOf.CHARSTRING = function(ops) {\n    return encode.CHARSTRING(ops).length;\n};\n\n// Utility functions ////////////////////////////////////////////////////////\n\n/**\n * Convert an object containing name / type / value to bytes.\n * @param {Object}\n * @returns {Array}\n */\nencode.OBJECT = function(v) {\n    var encodingFunction = encode[v.type];\n    check.argument(encodingFunction !== undefined, 'No encoding function for type ' + v.type);\n    return encodingFunction(v.value);\n};\n\n/**\n * @param {Object}\n * @returns {number}\n */\nsizeOf.OBJECT = function(v) {\n    var sizeOfFunction = sizeOf[v.type];\n    check.argument(sizeOfFunction !== undefined, 'No sizeOf function for type ' + v.type);\n    return sizeOfFunction(v.value);\n};\n\n/**\n * Convert a table object to bytes.\n * A table contains a list of fields containing the metadata (name, type and default value).\n * The table itself has the field values set as attributes.\n * @param {opentype.Table}\n * @returns {Array}\n */\nencode.TABLE = function(table) {\n    var d = [];\n    var length = table.fields.length;\n    var subtables = [];\n    var subtableOffsets = [];\n\n    for (var i = 0; i < length; i += 1) {\n        var field = table.fields[i];\n        var encodingFunction = encode[field.type];\n        check.argument(encodingFunction !== undefined, 'No encoding function for field type ' + field.type + ' (' + field.name + ')');\n        var value = table[field.name];\n        if (value === undefined) {\n            value = field.value;\n        }\n\n        var bytes = encodingFunction(value);\n\n        if (field.type === 'TABLE') {\n            subtableOffsets.push(d.length);\n            d = d.concat([0, 0]);\n            subtables.push(bytes);\n        } else {\n            d = d.concat(bytes);\n        }\n    }\n\n    for (var i$1 = 0; i$1 < subtables.length; i$1 += 1) {\n        var o = subtableOffsets[i$1];\n        var offset = d.length;\n        check.argument(offset < 65536, 'Table ' + table.tableName + ' too big.');\n        d[o] = offset >> 8;\n        d[o + 1] = offset & 0xff;\n        d = d.concat(subtables[i$1]);\n    }\n\n    return d;\n};\n\n/**\n * @param {opentype.Table}\n * @returns {number}\n */\nsizeOf.TABLE = function(table) {\n    var numBytes = 0;\n    var length = table.fields.length;\n\n    for (var i = 0; i < length; i += 1) {\n        var field = table.fields[i];\n        var sizeOfFunction = sizeOf[field.type];\n        check.argument(sizeOfFunction !== undefined, 'No sizeOf function for field type ' + field.type + ' (' + field.name + ')');\n        var value = table[field.name];\n        if (value === undefined) {\n            value = field.value;\n        }\n\n        numBytes += sizeOfFunction(value);\n\n        // Subtables take 2 more bytes for offsets.\n        if (field.type === 'TABLE') {\n            numBytes += 2;\n        }\n    }\n\n    return numBytes;\n};\n\nencode.RECORD = encode.TABLE;\nsizeOf.RECORD = sizeOf.TABLE;\n\n// Merge in a list of bytes.\nencode.LITERAL = function(v) {\n    return v;\n};\n\nsizeOf.LITERAL = function(v) {\n    return v.length;\n};\n\n// Table metadata\n\n/**\n * @exports opentype.Table\n * @class\n * @param {string} tableName\n * @param {Array} fields\n * @param {Object} options\n * @constructor\n */\nfunction Table(tableName, fields, options) {\n    // For coverage tables with coverage format 2, we do not want to add the coverage data directly to the table object,\n    // as this will result in wrong encoding order of the coverage data on serialization to bytes.\n    // The fallback of using the field values directly when not present on the table is handled in types.encode.TABLE() already.\n    if (fields.length && (fields[0].name !== 'coverageFormat' || fields[0].value === 1)) {\n        for (var i = 0; i < fields.length; i += 1) {\n            var field = fields[i];\n            this[field.name] = field.value;\n        }\n    }\n\n    this.tableName = tableName;\n    this.fields = fields;\n    if (options) {\n        var optionKeys = Object.keys(options);\n        for (var i$1 = 0; i$1 < optionKeys.length; i$1 += 1) {\n            var k = optionKeys[i$1];\n            var v = options[k];\n            if (this[k] !== undefined) {\n                this[k] = v;\n            }\n        }\n    }\n}\n\n/**\n * Encodes the table and returns an array of bytes\n * @return {Array}\n */\nTable.prototype.encode = function() {\n    return encode.TABLE(this);\n};\n\n/**\n * Get the size of the table.\n * @return {number}\n */\nTable.prototype.sizeOf = function() {\n    return sizeOf.TABLE(this);\n};\n\n/**\n * @private\n */\nfunction ushortList(itemName, list, count) {\n    if (count === undefined) {\n        count = list.length;\n    }\n    var fields = new Array(list.length + 1);\n    fields[0] = {name: itemName + 'Count', type: 'USHORT', value: count};\n    for (var i = 0; i < list.length; i++) {\n        fields[i + 1] = {name: itemName + i, type: 'USHORT', value: list[i]};\n    }\n    return fields;\n}\n\n/**\n * @private\n */\nfunction tableList(itemName, records, itemCallback) {\n    var count = records.length;\n    var fields = new Array(count + 1);\n    fields[0] = {name: itemName + 'Count', type: 'USHORT', value: count};\n    for (var i = 0; i < count; i++) {\n        fields[i + 1] = {name: itemName + i, type: 'TABLE', value: itemCallback(records[i], i)};\n    }\n    return fields;\n}\n\n/**\n * @private\n */\nfunction recordList(itemName, records, itemCallback) {\n    var count = records.length;\n    var fields = [];\n    fields[0] = {name: itemName + 'Count', type: 'USHORT', value: count};\n    for (var i = 0; i < count; i++) {\n        fields = fields.concat(itemCallback(records[i], i));\n    }\n    return fields;\n}\n\n// Common Layout Tables\n\n/**\n * @exports opentype.Coverage\n * @class\n * @param {opentype.Table}\n * @constructor\n * @extends opentype.Table\n */\nfunction Coverage(coverageTable) {\n    if (coverageTable.format === 1) {\n        Table.call(this, 'coverageTable',\n            [{name: 'coverageFormat', type: 'USHORT', value: 1}]\n            .concat(ushortList('glyph', coverageTable.glyphs))\n        );\n    } else if (coverageTable.format === 2) {\n        Table.call(this, 'coverageTable',\n            [{name: 'coverageFormat', type: 'USHORT', value: 2}]\n            .concat(recordList('rangeRecord', coverageTable.ranges, function(RangeRecord) {\n                return [\n                    {name: 'startGlyphID', type: 'USHORT', value: RangeRecord.start},\n                    {name: 'endGlyphID', type: 'USHORT', value: RangeRecord.end},\n                    {name: 'startCoverageIndex', type: 'USHORT', value: RangeRecord.index} ];\n            }))\n        );\n    } else {\n        check.assert(false, 'Coverage format must be 1 or 2.');\n    }\n}\nCoverage.prototype = Object.create(Table.prototype);\nCoverage.prototype.constructor = Coverage;\n\nfunction ScriptList(scriptListTable) {\n    Table.call(this, 'scriptListTable',\n        recordList('scriptRecord', scriptListTable, function(scriptRecord, i) {\n            var script = scriptRecord.script;\n            var defaultLangSys = script.defaultLangSys;\n            check.assert(!!defaultLangSys, 'Unable to write GSUB: script ' + scriptRecord.tag + ' has no default language system.');\n            return [\n                {name: 'scriptTag' + i, type: 'TAG', value: scriptRecord.tag},\n                {name: 'script' + i, type: 'TABLE', value: new Table('scriptTable', [\n                    {name: 'defaultLangSys', type: 'TABLE', value: new Table('defaultLangSys', [\n                        {name: 'lookupOrder', type: 'USHORT', value: 0},\n                        {name: 'reqFeatureIndex', type: 'USHORT', value: defaultLangSys.reqFeatureIndex}]\n                        .concat(ushortList('featureIndex', defaultLangSys.featureIndexes)))}\n                    ].concat(recordList('langSys', script.langSysRecords, function(langSysRecord, i) {\n                        var langSys = langSysRecord.langSys;\n                        return [\n                            {name: 'langSysTag' + i, type: 'TAG', value: langSysRecord.tag},\n                            {name: 'langSys' + i, type: 'TABLE', value: new Table('langSys', [\n                                {name: 'lookupOrder', type: 'USHORT', value: 0},\n                                {name: 'reqFeatureIndex', type: 'USHORT', value: langSys.reqFeatureIndex}\n                                ].concat(ushortList('featureIndex', langSys.featureIndexes)))}\n                        ];\n                    })))}\n            ];\n        })\n    );\n}\nScriptList.prototype = Object.create(Table.prototype);\nScriptList.prototype.constructor = ScriptList;\n\n/**\n * @exports opentype.FeatureList\n * @class\n * @param {opentype.Table}\n * @constructor\n * @extends opentype.Table\n */\nfunction FeatureList(featureListTable) {\n    Table.call(this, 'featureListTable',\n        recordList('featureRecord', featureListTable, function(featureRecord, i) {\n            var feature = featureRecord.feature;\n            return [\n                {name: 'featureTag' + i, type: 'TAG', value: featureRecord.tag},\n                {name: 'feature' + i, type: 'TABLE', value: new Table('featureTable', [\n                    {name: 'featureParams', type: 'USHORT', value: feature.featureParams} ].concat(ushortList('lookupListIndex', feature.lookupListIndexes)))}\n            ];\n        })\n    );\n}\nFeatureList.prototype = Object.create(Table.prototype);\nFeatureList.prototype.constructor = FeatureList;\n\n/**\n * @exports opentype.LookupList\n * @class\n * @param {opentype.Table}\n * @param {Object}\n * @constructor\n * @extends opentype.Table\n */\nfunction LookupList(lookupListTable, subtableMakers) {\n    Table.call(this, 'lookupListTable', tableList('lookup', lookupListTable, function(lookupTable) {\n        var subtableCallback = subtableMakers[lookupTable.lookupType];\n        check.assert(!!subtableCallback, 'Unable to write GSUB lookup type ' + lookupTable.lookupType + ' tables.');\n        return new Table('lookupTable', [\n            {name: 'lookupType', type: 'USHORT', value: lookupTable.lookupType},\n            {name: 'lookupFlag', type: 'USHORT', value: lookupTable.lookupFlag}\n        ].concat(tableList('subtable', lookupTable.subtables, subtableCallback)));\n    }));\n}\nLookupList.prototype = Object.create(Table.prototype);\nLookupList.prototype.constructor = LookupList;\n\n// Record = same as Table, but inlined (a Table has an offset and its data is further in the stream)\n// Don't use offsets inside Records (probable bug), only in Tables.\nvar table = {\n    Table: Table,\n    Record: Table,\n    Coverage: Coverage,\n    ScriptList: ScriptList,\n    FeatureList: FeatureList,\n    LookupList: LookupList,\n    ushortList: ushortList,\n    tableList: tableList,\n    recordList: recordList,\n};\n\n// Parsing utility functions\n\n// Retrieve an unsigned byte from the DataView.\nfunction getByte(dataView, offset) {\n    return dataView.getUint8(offset);\n}\n\n// Retrieve an unsigned 16-bit short from the DataView.\n// The value is stored in big endian.\nfunction getUShort(dataView, offset) {\n    return dataView.getUint16(offset, false);\n}\n\n// Retrieve a signed 16-bit short from the DataView.\n// The value is stored in big endian.\nfunction getShort(dataView, offset) {\n    return dataView.getInt16(offset, false);\n}\n\n// Retrieve an unsigned 32-bit long from the DataView.\n// The value is stored in big endian.\nfunction getULong(dataView, offset) {\n    return dataView.getUint32(offset, false);\n}\n\n// Retrieve a 32-bit signed fixed-point number (16.16) from the DataView.\n// The value is stored in big endian.\nfunction getFixed(dataView, offset) {\n    var decimal = dataView.getInt16(offset, false);\n    var fraction = dataView.getUint16(offset + 2, false);\n    return decimal + fraction / 65535;\n}\n\n// Retrieve a 4-character tag from the DataView.\n// Tags are used to identify tables.\nfunction getTag(dataView, offset) {\n    var tag = '';\n    for (var i = offset; i < offset + 4; i += 1) {\n        tag += String.fromCharCode(dataView.getInt8(i));\n    }\n\n    return tag;\n}\n\n// Retrieve an offset from the DataView.\n// Offsets are 1 to 4 bytes in length, depending on the offSize argument.\nfunction getOffset(dataView, offset, offSize) {\n    var v = 0;\n    for (var i = 0; i < offSize; i += 1) {\n        v <<= 8;\n        v += dataView.getUint8(offset + i);\n    }\n\n    return v;\n}\n\n// Retrieve a number of bytes from start offset to the end offset from the DataView.\nfunction getBytes(dataView, startOffset, endOffset) {\n    var bytes = [];\n    for (var i = startOffset; i < endOffset; i += 1) {\n        bytes.push(dataView.getUint8(i));\n    }\n\n    return bytes;\n}\n\n// Convert the list of bytes to a string.\nfunction bytesToString(bytes) {\n    var s = '';\n    for (var i = 0; i < bytes.length; i += 1) {\n        s += String.fromCharCode(bytes[i]);\n    }\n\n    return s;\n}\n\nvar typeOffsets = {\n    byte: 1,\n    uShort: 2,\n    short: 2,\n    uLong: 4,\n    fixed: 4,\n    longDateTime: 8,\n    tag: 4\n};\n\n// A stateful parser that changes the offset whenever a value is retrieved.\n// The data is a DataView.\nfunction Parser(data, offset) {\n    this.data = data;\n    this.offset = offset;\n    this.relativeOffset = 0;\n}\n\nParser.prototype.parseByte = function() {\n    var v = this.data.getUint8(this.offset + this.relativeOffset);\n    this.relativeOffset += 1;\n    return v;\n};\n\nParser.prototype.parseChar = function() {\n    var v = this.data.getInt8(this.offset + this.relativeOffset);\n    this.relativeOffset += 1;\n    return v;\n};\n\nParser.prototype.parseCard8 = Parser.prototype.parseByte;\n\nParser.prototype.parseUShort = function() {\n    var v = this.data.getUint16(this.offset + this.relativeOffset);\n    this.relativeOffset += 2;\n    return v;\n};\n\nParser.prototype.parseCard16 = Parser.prototype.parseUShort;\nParser.prototype.parseSID = Parser.prototype.parseUShort;\nParser.prototype.parseOffset16 = Parser.prototype.parseUShort;\n\nParser.prototype.parseShort = function() {\n    var v = this.data.getInt16(this.offset + this.relativeOffset);\n    this.relativeOffset += 2;\n    return v;\n};\n\nParser.prototype.parseF2Dot14 = function() {\n    var v = this.data.getInt16(this.offset + this.relativeOffset) / 16384;\n    this.relativeOffset += 2;\n    return v;\n};\n\nParser.prototype.parseULong = function() {\n    var v = getULong(this.data, this.offset + this.relativeOffset);\n    this.relativeOffset += 4;\n    return v;\n};\n\nParser.prototype.parseOffset32 = Parser.prototype.parseULong;\n\nParser.prototype.parseFixed = function() {\n    var v = getFixed(this.data, this.offset + this.relativeOffset);\n    this.relativeOffset += 4;\n    return v;\n};\n\nParser.prototype.parseString = function(length) {\n    var dataView = this.data;\n    var offset = this.offset + this.relativeOffset;\n    var string = '';\n    this.relativeOffset += length;\n    for (var i = 0; i < length; i++) {\n        string += String.fromCharCode(dataView.getUint8(offset + i));\n    }\n\n    return string;\n};\n\nParser.prototype.parseTag = function() {\n    return this.parseString(4);\n};\n\n// LONGDATETIME is a 64-bit integer.\n// JavaScript and unix timestamps traditionally use 32 bits, so we\n// only take the last 32 bits.\n// + Since until 2038 those bits will be filled by zeros we can ignore them.\nParser.prototype.parseLongDateTime = function() {\n    var v = getULong(this.data, this.offset + this.relativeOffset + 4);\n    // Subtract seconds between 01/01/1904 and 01/01/1970\n    // to convert Apple Mac timestamp to Standard Unix timestamp\n    v -= 2082844800;\n    this.relativeOffset += 8;\n    return v;\n};\n\nParser.prototype.parseVersion = function(minorBase) {\n    var major = getUShort(this.data, this.offset + this.relativeOffset);\n\n    // How to interpret the minor version is very vague in the spec. 0x5000 is 5, 0x1000 is 1\n    // Default returns the correct number if minor = 0xN000 where N is 0-9\n    // Set minorBase to 1 for tables that use minor = N where N is 0-9\n    var minor = getUShort(this.data, this.offset + this.relativeOffset + 2);\n    this.relativeOffset += 4;\n    if (minorBase === undefined) { minorBase = 0x1000; }\n    return major + minor / minorBase / 10;\n};\n\nParser.prototype.skip = function(type, amount) {\n    if (amount === undefined) {\n        amount = 1;\n    }\n\n    this.relativeOffset += typeOffsets[type] * amount;\n};\n\n///// Parsing lists and records ///////////////////////////////\n\n// Parse a list of 32 bit unsigned integers.\nParser.prototype.parseULongList = function(count) {\n    if (count === undefined) { count = this.parseULong(); }\n    var offsets = new Array(count);\n    var dataView = this.data;\n    var offset = this.offset + this.relativeOffset;\n    for (var i = 0; i < count; i++) {\n        offsets[i] = dataView.getUint32(offset);\n        offset += 4;\n    }\n\n    this.relativeOffset += count * 4;\n    return offsets;\n};\n\n// Parse a list of 16 bit unsigned integers. The length of the list can be read on the stream\n// or provided as an argument.\nParser.prototype.parseOffset16List =\nParser.prototype.parseUShortList = function(count) {\n    if (count === undefined) { count = this.parseUShort(); }\n    var offsets = new Array(count);\n    var dataView = this.data;\n    var offset = this.offset + this.relativeOffset;\n    for (var i = 0; i < count; i++) {\n        offsets[i] = dataView.getUint16(offset);\n        offset += 2;\n    }\n\n    this.relativeOffset += count * 2;\n    return offsets;\n};\n\n// Parses a list of 16 bit signed integers.\nParser.prototype.parseShortList = function(count) {\n    var list = new Array(count);\n    var dataView = this.data;\n    var offset = this.offset + this.relativeOffset;\n    for (var i = 0; i < count; i++) {\n        list[i] = dataView.getInt16(offset);\n        offset += 2;\n    }\n\n    this.relativeOffset += count * 2;\n    return list;\n};\n\n// Parses a list of bytes.\nParser.prototype.parseByteList = function(count) {\n    var list = new Array(count);\n    var dataView = this.data;\n    var offset = this.offset + this.relativeOffset;\n    for (var i = 0; i < count; i++) {\n        list[i] = dataView.getUint8(offset++);\n    }\n\n    this.relativeOffset += count;\n    return list;\n};\n\n/**\n * Parse a list of items.\n * Record count is optional, if omitted it is read from the stream.\n * itemCallback is one of the Parser methods.\n */\nParser.prototype.parseList = function(count, itemCallback) {\n    if (!itemCallback) {\n        itemCallback = count;\n        count = this.parseUShort();\n    }\n    var list = new Array(count);\n    for (var i = 0; i < count; i++) {\n        list[i] = itemCallback.call(this);\n    }\n    return list;\n};\n\nParser.prototype.parseList32 = function(count, itemCallback) {\n    if (!itemCallback) {\n        itemCallback = count;\n        count = this.parseULong();\n    }\n    var list = new Array(count);\n    for (var i = 0; i < count; i++) {\n        list[i] = itemCallback.call(this);\n    }\n    return list;\n};\n\n/**\n * Parse a list of records.\n * Record count is optional, if omitted it is read from the stream.\n * Example of recordDescription: { sequenceIndex: Parser.uShort, lookupListIndex: Parser.uShort }\n */\nParser.prototype.parseRecordList = function(count, recordDescription) {\n    // If the count argument is absent, read it in the stream.\n    if (!recordDescription) {\n        recordDescription = count;\n        count = this.parseUShort();\n    }\n    var records = new Array(count);\n    var fields = Object.keys(recordDescription);\n    for (var i = 0; i < count; i++) {\n        var rec = {};\n        for (var j = 0; j < fields.length; j++) {\n            var fieldName = fields[j];\n            var fieldType = recordDescription[fieldName];\n            rec[fieldName] = fieldType.call(this);\n        }\n        records[i] = rec;\n    }\n    return records;\n};\n\nParser.prototype.parseRecordList32 = function(count, recordDescription) {\n    // If the count argument is absent, read it in the stream.\n    if (!recordDescription) {\n        recordDescription = count;\n        count = this.parseULong();\n    }\n    var records = new Array(count);\n    var fields = Object.keys(recordDescription);\n    for (var i = 0; i < count; i++) {\n        var rec = {};\n        for (var j = 0; j < fields.length; j++) {\n            var fieldName = fields[j];\n            var fieldType = recordDescription[fieldName];\n            rec[fieldName] = fieldType.call(this);\n        }\n        records[i] = rec;\n    }\n    return records;\n};\n\n// Parse a data structure into an object\n// Example of description: { sequenceIndex: Parser.uShort, lookupListIndex: Parser.uShort }\nParser.prototype.parseStruct = function(description) {\n    if (typeof description === 'function') {\n        return description.call(this);\n    } else {\n        var fields = Object.keys(description);\n        var struct = {};\n        for (var j = 0; j < fields.length; j++) {\n            var fieldName = fields[j];\n            var fieldType = description[fieldName];\n            struct[fieldName] = fieldType.call(this);\n        }\n        return struct;\n    }\n};\n\n/**\n * Parse a GPOS valueRecord\n * https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#value-record\n * valueFormat is optional, if omitted it is read from the stream.\n */\nParser.prototype.parseValueRecord = function(valueFormat) {\n    if (valueFormat === undefined) {\n        valueFormat = this.parseUShort();\n    }\n    if (valueFormat === 0) {\n        // valueFormat2 in kerning pairs is most often 0\n        // in this case return undefined instead of an empty object, to save space\n        return;\n    }\n    var valueRecord = {};\n\n    if (valueFormat & 0x0001) { valueRecord.xPlacement = this.parseShort(); }\n    if (valueFormat & 0x0002) { valueRecord.yPlacement = this.parseShort(); }\n    if (valueFormat & 0x0004) { valueRecord.xAdvance = this.parseShort(); }\n    if (valueFormat & 0x0008) { valueRecord.yAdvance = this.parseShort(); }\n\n    // Device table (non-variable font) / VariationIndex table (variable font) not supported\n    // https://docs.microsoft.com/fr-fr/typography/opentype/spec/chapter2#devVarIdxTbls\n    if (valueFormat & 0x0010) { valueRecord.xPlaDevice = undefined; this.parseShort(); }\n    if (valueFormat & 0x0020) { valueRecord.yPlaDevice = undefined; this.parseShort(); }\n    if (valueFormat & 0x0040) { valueRecord.xAdvDevice = undefined; this.parseShort(); }\n    if (valueFormat & 0x0080) { valueRecord.yAdvDevice = undefined; this.parseShort(); }\n\n    return valueRecord;\n};\n\n/**\n * Parse a list of GPOS valueRecords\n * https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#value-record\n * valueFormat and valueCount are read from the stream.\n */\nParser.prototype.parseValueRecordList = function() {\n    var valueFormat = this.parseUShort();\n    var valueCount = this.parseUShort();\n    var values = new Array(valueCount);\n    for (var i = 0; i < valueCount; i++) {\n        values[i] = this.parseValueRecord(valueFormat);\n    }\n    return values;\n};\n\nParser.prototype.parsePointer = function(description) {\n    var structOffset = this.parseOffset16();\n    if (structOffset > 0) {\n        // NULL offset => return undefined\n        return new Parser(this.data, this.offset + structOffset).parseStruct(description);\n    }\n    return undefined;\n};\n\nParser.prototype.parsePointer32 = function(description) {\n    var structOffset = this.parseOffset32();\n    if (structOffset > 0) {\n        // NULL offset => return undefined\n        return new Parser(this.data, this.offset + structOffset).parseStruct(description);\n    }\n    return undefined;\n};\n\n/**\n * Parse a list of offsets to lists of 16-bit integers,\n * or a list of offsets to lists of offsets to any kind of items.\n * If itemCallback is not provided, a list of list of UShort is assumed.\n * If provided, itemCallback is called on each item and must parse the item.\n * See examples in tables/gsub.js\n */\nParser.prototype.parseListOfLists = function(itemCallback) {\n    var offsets = this.parseOffset16List();\n    var count = offsets.length;\n    var relativeOffset = this.relativeOffset;\n    var list = new Array(count);\n    for (var i = 0; i < count; i++) {\n        var start = offsets[i];\n        if (start === 0) {\n            // NULL offset\n            // Add i as owned property to list. Convenient with assert.\n            list[i] = undefined;\n            continue;\n        }\n        this.relativeOffset = start;\n        if (itemCallback) {\n            var subOffsets = this.parseOffset16List();\n            var subList = new Array(subOffsets.length);\n            for (var j = 0; j < subOffsets.length; j++) {\n                this.relativeOffset = start + subOffsets[j];\n                subList[j] = itemCallback.call(this);\n            }\n            list[i] = subList;\n        } else {\n            list[i] = this.parseUShortList();\n        }\n    }\n    this.relativeOffset = relativeOffset;\n    return list;\n};\n\n///// Complex tables parsing //////////////////////////////////\n\n// Parse a coverage table in a GSUB, GPOS or GDEF table.\n// https://www.microsoft.com/typography/OTSPEC/chapter2.htm\n// parser.offset must point to the start of the table containing the coverage.\nParser.prototype.parseCoverage = function() {\n    var startOffset = this.offset + this.relativeOffset;\n    var format = this.parseUShort();\n    var count = this.parseUShort();\n    if (format === 1) {\n        return {\n            format: 1,\n            glyphs: this.parseUShortList(count)\n        };\n    } else if (format === 2) {\n        var ranges = new Array(count);\n        for (var i = 0; i < count; i++) {\n            ranges[i] = {\n                start: this.parseUShort(),\n                end: this.parseUShort(),\n                index: this.parseUShort()\n            };\n        }\n        return {\n            format: 2,\n            ranges: ranges\n        };\n    }\n    throw new Error('0x' + startOffset.toString(16) + ': Coverage format must be 1 or 2.');\n};\n\n// Parse a Class Definition Table in a GSUB, GPOS or GDEF table.\n// https://www.microsoft.com/typography/OTSPEC/chapter2.htm\nParser.prototype.parseClassDef = function() {\n    var startOffset = this.offset + this.relativeOffset;\n    var format = this.parseUShort();\n    if (format === 1) {\n        return {\n            format: 1,\n            startGlyph: this.parseUShort(),\n            classes: this.parseUShortList()\n        };\n    } else if (format === 2) {\n        return {\n            format: 2,\n            ranges: this.parseRecordList({\n                start: Parser.uShort,\n                end: Parser.uShort,\n                classId: Parser.uShort\n            })\n        };\n    }\n    throw new Error('0x' + startOffset.toString(16) + ': ClassDef format must be 1 or 2.');\n};\n\n///// Static methods ///////////////////////////////////\n// These convenience methods can be used as callbacks and should be called with \"this\" context set to a Parser instance.\n\nParser.list = function(count, itemCallback) {\n    return function() {\n        return this.parseList(count, itemCallback);\n    };\n};\n\nParser.list32 = function(count, itemCallback) {\n    return function() {\n        return this.parseList32(count, itemCallback);\n    };\n};\n\nParser.recordList = function(count, recordDescription) {\n    return function() {\n        return this.parseRecordList(count, recordDescription);\n    };\n};\n\nParser.recordList32 = function(count, recordDescription) {\n    return function() {\n        return this.parseRecordList32(count, recordDescription);\n    };\n};\n\nParser.pointer = function(description) {\n    return function() {\n        return this.parsePointer(description);\n    };\n};\n\nParser.pointer32 = function(description) {\n    return function() {\n        return this.parsePointer32(description);\n    };\n};\n\nParser.tag = Parser.prototype.parseTag;\nParser.byte = Parser.prototype.parseByte;\nParser.uShort = Parser.offset16 = Parser.prototype.parseUShort;\nParser.uShortList = Parser.prototype.parseUShortList;\nParser.uLong = Parser.offset32 = Parser.prototype.parseULong;\nParser.uLongList = Parser.prototype.parseULongList;\nParser.struct = Parser.prototype.parseStruct;\nParser.coverage = Parser.prototype.parseCoverage;\nParser.classDef = Parser.prototype.parseClassDef;\n\n///// Script, Feature, Lookup lists ///////////////////////////////////////////////\n// https://www.microsoft.com/typography/OTSPEC/chapter2.htm\n\nvar langSysTable = {\n    reserved: Parser.uShort,\n    reqFeatureIndex: Parser.uShort,\n    featureIndexes: Parser.uShortList\n};\n\nParser.prototype.parseScriptList = function() {\n    return this.parsePointer(Parser.recordList({\n        tag: Parser.tag,\n        script: Parser.pointer({\n            defaultLangSys: Parser.pointer(langSysTable),\n            langSysRecords: Parser.recordList({\n                tag: Parser.tag,\n                langSys: Parser.pointer(langSysTable)\n            })\n        })\n    })) || [];\n};\n\nParser.prototype.parseFeatureList = function() {\n    return this.parsePointer(Parser.recordList({\n        tag: Parser.tag,\n        feature: Parser.pointer({\n            featureParams: Parser.offset16,\n            lookupListIndexes: Parser.uShortList\n        })\n    })) || [];\n};\n\nParser.prototype.parseLookupList = function(lookupTableParsers) {\n    return this.parsePointer(Parser.list(Parser.pointer(function() {\n        var lookupType = this.parseUShort();\n        check.argument(1 <= lookupType && lookupType <= 9, 'GPOS/GSUB lookup type ' + lookupType + ' unknown.');\n        var lookupFlag = this.parseUShort();\n        var useMarkFilteringSet = lookupFlag & 0x10;\n        return {\n            lookupType: lookupType,\n            lookupFlag: lookupFlag,\n            subtables: this.parseList(Parser.pointer(lookupTableParsers[lookupType])),\n            markFilteringSet: useMarkFilteringSet ? this.parseUShort() : undefined\n        };\n    }))) || [];\n};\n\nParser.prototype.parseFeatureVariationsList = function() {\n    return this.parsePointer32(function() {\n        var majorVersion = this.parseUShort();\n        var minorVersion = this.parseUShort();\n        check.argument(majorVersion === 1 && minorVersion < 1, 'GPOS/GSUB feature variations table unknown.');\n        var featureVariations = this.parseRecordList32({\n            conditionSetOffset: Parser.offset32,\n            featureTableSubstitutionOffset: Parser.offset32\n        });\n        return featureVariations;\n    }) || [];\n};\n\nvar parse = {\n    getByte: getByte,\n    getCard8: getByte,\n    getUShort: getUShort,\n    getCard16: getUShort,\n    getShort: getShort,\n    getULong: getULong,\n    getFixed: getFixed,\n    getTag: getTag,\n    getOffset: getOffset,\n    getBytes: getBytes,\n    bytesToString: bytesToString,\n    Parser: Parser,\n};\n\n// The `cmap` table stores the mappings from characters to glyphs.\n\nfunction parseCmapTableFormat12(cmap, p) {\n    //Skip reserved.\n    p.parseUShort();\n\n    // Length in bytes of the sub-tables.\n    cmap.length = p.parseULong();\n    cmap.language = p.parseULong();\n\n    var groupCount;\n    cmap.groupCount = groupCount = p.parseULong();\n    cmap.glyphIndexMap = {};\n\n    for (var i = 0; i < groupCount; i += 1) {\n        var startCharCode = p.parseULong();\n        var endCharCode = p.parseULong();\n        var startGlyphId = p.parseULong();\n\n        for (var c = startCharCode; c <= endCharCode; c += 1) {\n            cmap.glyphIndexMap[c] = startGlyphId;\n            startGlyphId++;\n        }\n    }\n}\n\nfunction parseCmapTableFormat4(cmap, p, data, start, offset) {\n    // Length in bytes of the sub-tables.\n    cmap.length = p.parseUShort();\n    cmap.language = p.parseUShort();\n\n    // segCount is stored x 2.\n    var segCount;\n    cmap.segCount = segCount = p.parseUShort() >> 1;\n\n    // Skip searchRange, entrySelector, rangeShift.\n    p.skip('uShort', 3);\n\n    // The \"unrolled\" mapping from character codes to glyph indices.\n    cmap.glyphIndexMap = {};\n    var endCountParser = new parse.Parser(data, start + offset + 14);\n    var startCountParser = new parse.Parser(data, start + offset + 16 + segCount * 2);\n    var idDeltaParser = new parse.Parser(data, start + offset + 16 + segCount * 4);\n    var idRangeOffsetParser = new parse.Parser(data, start + offset + 16 + segCount * 6);\n    var glyphIndexOffset = start + offset + 16 + segCount * 8;\n    for (var i = 0; i < segCount - 1; i += 1) {\n        var glyphIndex = (void 0);\n        var endCount = endCountParser.parseUShort();\n        var startCount = startCountParser.parseUShort();\n        var idDelta = idDeltaParser.parseShort();\n        var idRangeOffset = idRangeOffsetParser.parseUShort();\n        for (var c = startCount; c <= endCount; c += 1) {\n            if (idRangeOffset !== 0) {\n                // The idRangeOffset is relative to the current position in the idRangeOffset array.\n                // Take the current offset in the idRangeOffset array.\n                glyphIndexOffset = (idRangeOffsetParser.offset + idRangeOffsetParser.relativeOffset - 2);\n\n                // Add the value of the idRangeOffset, which will move us into the glyphIndex array.\n                glyphIndexOffset += idRangeOffset;\n\n                // Then add the character index of the current segment, multiplied by 2 for USHORTs.\n                glyphIndexOffset += (c - startCount) * 2;\n                glyphIndex = parse.getUShort(data, glyphIndexOffset);\n                if (glyphIndex !== 0) {\n                    glyphIndex = (glyphIndex + idDelta) & 0xFFFF;\n                }\n            } else {\n                glyphIndex = (c + idDelta) & 0xFFFF;\n            }\n\n            cmap.glyphIndexMap[c] = glyphIndex;\n        }\n    }\n}\n\n// Parse the `cmap` table. This table stores the mappings from characters to glyphs.\n// There are many available formats, but we only support the Windows format 4 and 12.\n// This function returns a `CmapEncoding` object or null if no supported format could be found.\nfunction parseCmapTable(data, start) {\n    var cmap = {};\n    cmap.version = parse.getUShort(data, start);\n    check.argument(cmap.version === 0, 'cmap table version should be 0.');\n\n    // The cmap table can contain many sub-tables, each with their own format.\n    // We're only interested in a \"platform 0\" (Unicode format) and \"platform 3\" (Windows format) table.\n    cmap.numTables = parse.getUShort(data, start + 2);\n    var offset = -1;\n    for (var i = cmap.numTables - 1; i >= 0; i -= 1) {\n        var platformId = parse.getUShort(data, start + 4 + (i * 8));\n        var encodingId = parse.getUShort(data, start + 4 + (i * 8) + 2);\n        if ((platformId === 3 && (encodingId === 0 || encodingId === 1 || encodingId === 10)) ||\n            (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 2 || encodingId === 3 || encodingId === 4))) {\n            offset = parse.getULong(data, start + 4 + (i * 8) + 4);\n            break;\n        }\n    }\n\n    if (offset === -1) {\n        // There is no cmap table in the font that we support.\n        throw new Error('No valid cmap sub-tables found.');\n    }\n\n    var p = new parse.Parser(data, start + offset);\n    cmap.format = p.parseUShort();\n\n    if (cmap.format === 12) {\n        parseCmapTableFormat12(cmap, p);\n    } else if (cmap.format === 4) {\n        parseCmapTableFormat4(cmap, p, data, start, offset);\n    } else {\n        throw new Error('Only format 4 and 12 cmap tables are supported (found format ' + cmap.format + ').');\n    }\n\n    return cmap;\n}\n\nfunction addSegment(t, code, glyphIndex) {\n    t.segments.push({\n        end: code,\n        start: code,\n        delta: -(code - glyphIndex),\n        offset: 0,\n        glyphIndex: glyphIndex\n    });\n}\n\nfunction addTerminatorSegment(t) {\n    t.segments.push({\n        end: 0xFFFF,\n        start: 0xFFFF,\n        delta: 1,\n        offset: 0\n    });\n}\n\n// Make cmap table, format 4 by default, 12 if needed only\nfunction makeCmapTable(glyphs) {\n    // Plan 0 is the base Unicode Plan but emojis, for example are on another plan, and needs cmap 12 format (with 32bit)\n    var isPlan0Only = true;\n    var i;\n\n    // Check if we need to add cmap format 12 or if format 4 only is fine\n    for (i = glyphs.length - 1; i > 0; i -= 1) {\n        var g = glyphs.get(i);\n        if (g.unicode > 65535) {\n            console.log('Adding CMAP format 12 (needed!)');\n            isPlan0Only = false;\n            break;\n        }\n    }\n\n    var cmapTable = [\n        {name: 'version', type: 'USHORT', value: 0},\n        {name: 'numTables', type: 'USHORT', value: isPlan0Only ? 1 : 2},\n\n        // CMAP 4 header\n        {name: 'platformID', type: 'USHORT', value: 3},\n        {name: 'encodingID', type: 'USHORT', value: 1},\n        {name: 'offset', type: 'ULONG', value: isPlan0Only ? 12 : (12 + 8)}\n    ];\n\n    if (!isPlan0Only)\n        { cmapTable = cmapTable.concat([\n            // CMAP 12 header\n            {name: 'cmap12PlatformID', type: 'USHORT', value: 3}, // We encode only for PlatformID = 3 (Windows) because it is supported everywhere\n            {name: 'cmap12EncodingID', type: 'USHORT', value: 10},\n            {name: 'cmap12Offset', type: 'ULONG', value: 0}\n        ]); }\n\n    cmapTable = cmapTable.concat([\n        // CMAP 4 Subtable\n        {name: 'format', type: 'USHORT', value: 4},\n        {name: 'cmap4Length', type: 'USHORT', value: 0},\n        {name: 'language', type: 'USHORT', value: 0},\n        {name: 'segCountX2', type: 'USHORT', value: 0},\n        {name: 'searchRange', type: 'USHORT', value: 0},\n        {name: 'entrySelector', type: 'USHORT', value: 0},\n        {name: 'rangeShift', type: 'USHORT', value: 0}\n    ]);\n\n    var t = new table.Table('cmap', cmapTable);\n\n    t.segments = [];\n    for (i = 0; i < glyphs.length; i += 1) {\n        var glyph = glyphs.get(i);\n        for (var j = 0; j < glyph.unicodes.length; j += 1) {\n            addSegment(t, glyph.unicodes[j], i);\n        }\n\n        t.segments = t.segments.sort(function (a, b) {\n            return a.start - b.start;\n        });\n    }\n\n    addTerminatorSegment(t);\n\n    var segCount = t.segments.length;\n    var segCountToRemove = 0;\n\n    // CMAP 4\n    // Set up parallel segment arrays.\n    var endCounts = [];\n    var startCounts = [];\n    var idDeltas = [];\n    var idRangeOffsets = [];\n    var glyphIds = [];\n\n    // CMAP 12\n    var cmap12Groups = [];\n\n    // Reminder this loop is not following the specification at 100%\n    // The specification -> find suites of characters and make a group\n    // Here we're doing one group for each letter\n    // Doing as the spec can save 8 times (or more) space\n    for (i = 0; i < segCount; i += 1) {\n        var segment = t.segments[i];\n\n        // CMAP 4\n        if (segment.end <= 65535 && segment.start <= 65535) {\n            endCounts = endCounts.concat({name: 'end_' + i, type: 'USHORT', value: segment.end});\n            startCounts = startCounts.concat({name: 'start_' + i, type: 'USHORT', value: segment.start});\n            idDeltas = idDeltas.concat({name: 'idDelta_' + i, type: 'SHORT', value: segment.delta});\n            idRangeOffsets = idRangeOffsets.concat({name: 'idRangeOffset_' + i, type: 'USHORT', value: segment.offset});\n            if (segment.glyphId !== undefined) {\n                glyphIds = glyphIds.concat({name: 'glyph_' + i, type: 'USHORT', value: segment.glyphId});\n            }\n        } else {\n            // Skip Unicode > 65535 (16bit unsigned max) for CMAP 4, will be added in CMAP 12\n            segCountToRemove += 1;\n        }\n\n        // CMAP 12\n        // Skip Terminator Segment\n        if (!isPlan0Only && segment.glyphIndex !== undefined) {\n            cmap12Groups = cmap12Groups.concat({name: 'cmap12Start_' + i, type: 'ULONG', value: segment.start});\n            cmap12Groups = cmap12Groups.concat({name: 'cmap12End_' + i, type: 'ULONG', value: segment.end});\n            cmap12Groups = cmap12Groups.concat({name: 'cmap12Glyph_' + i, type: 'ULONG', value: segment.glyphIndex});\n        }\n    }\n\n    // CMAP 4 Subtable\n    t.segCountX2 = (segCount - segCountToRemove) * 2;\n    t.searchRange = Math.pow(2, Math.floor(Math.log((segCount - segCountToRemove)) / Math.log(2))) * 2;\n    t.entrySelector = Math.log(t.searchRange / 2) / Math.log(2);\n    t.rangeShift = t.segCountX2 - t.searchRange;\n\n    t.fields = t.fields.concat(endCounts);\n    t.fields.push({name: 'reservedPad', type: 'USHORT', value: 0});\n    t.fields = t.fields.concat(startCounts);\n    t.fields = t.fields.concat(idDeltas);\n    t.fields = t.fields.concat(idRangeOffsets);\n    t.fields = t.fields.concat(glyphIds);\n\n    t.cmap4Length = 14 + // Subtable header\n        endCounts.length * 2 +\n        2 + // reservedPad\n        startCounts.length * 2 +\n        idDeltas.length * 2 +\n        idRangeOffsets.length * 2 +\n        glyphIds.length * 2;\n\n    if (!isPlan0Only) {\n        // CMAP 12 Subtable\n        var cmap12Length = 16 + // Subtable header\n            cmap12Groups.length * 4;\n\n        t.cmap12Offset = 12 + (2 * 2) + 4 + t.cmap4Length;\n        t.fields = t.fields.concat([\n            {name: 'cmap12Format', type: 'USHORT', value: 12},\n            {name: 'cmap12Reserved', type: 'USHORT', value: 0},\n            {name: 'cmap12Length', type: 'ULONG', value: cmap12Length},\n            {name: 'cmap12Language', type: 'ULONG', value: 0},\n            {name: 'cmap12nGroups', type: 'ULONG', value: cmap12Groups.length / 3}\n        ]);\n\n        t.fields = t.fields.concat(cmap12Groups);\n    }\n\n    return t;\n}\n\nvar cmap = { parse: parseCmapTable, make: makeCmapTable };\n\n// Glyph encoding\n\nvar cffStandardStrings = [\n    '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',\n    'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two',\n    'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',\n    'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',\n    'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n    'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',\n    'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling',\n    'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft',\n    'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph',\n    'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand',\n    'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring',\n    'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE',\n    'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',\n    'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn',\n    'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',\n    'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex',\n    'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',\n    'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute',\n    'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute',\n    'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute',\n    'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave',\n    'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior',\n    'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff', 'onedotenleader',\n    'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',\n    'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior',\n    'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n    'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl',\n    'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall',\n    'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall',\n    'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall',\n    'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',\n    'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall',\n    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',\n    'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n    'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',\n    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',\n    'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',\n    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',\n    'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall',\n    'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',\n    'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000',\n    '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];\n\nvar cffStandardEncoding = [\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',\n    'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two',\n    'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',\n    'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',\n    'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n    'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',\n    'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle',\n    'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger',\n    'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright',\n    'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde',\n    'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron',\n    'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '',\n    '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '',\n    'lslash', 'oslash', 'oe', 'germandbls'];\n\nvar cffExpertEncoding = [\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior',\n    'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader',\n    'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n    'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',\n    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior',\n    'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',\n    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl',\n    'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall',\n    'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall',\n    'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n    'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior',\n    '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',\n    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '',\n    '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n    'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',\n    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',\n    'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',\n    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',\n    'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall',\n    'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];\n\nvar standardNames = [\n    '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',\n    'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n    'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',\n    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave',\n    'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis',\n    'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section',\n    'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal',\n    'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation',\n    'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown',\n    'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright',\n    'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft',\n    'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',\n    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase',\n    'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',\n    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex',\n    'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',\n    'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth',\n    'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior',\n    'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla',\n    'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];\n\n/**\n * This is the encoding used for fonts created from scratch.\n * It loops through all glyphs and finds the appropriate unicode value.\n * Since it's linear time, other encodings will be faster.\n * @exports opentype.DefaultEncoding\n * @class\n * @constructor\n * @param {opentype.Font}\n */\nfunction DefaultEncoding(font) {\n    this.font = font;\n}\n\nDefaultEncoding.prototype.charToGlyphIndex = function(c) {\n    var code = c.codePointAt(0);\n    var glyphs = this.font.glyphs;\n    if (glyphs) {\n        for (var i = 0; i < glyphs.length; i += 1) {\n            var glyph = glyphs.get(i);\n            for (var j = 0; j < glyph.unicodes.length; j += 1) {\n                if (glyph.unicodes[j] === code) {\n                    return i;\n                }\n            }\n        }\n    }\n    return null;\n};\n\n/**\n * @exports opentype.CmapEncoding\n * @class\n * @constructor\n * @param {Object} cmap - a object with the cmap encoded data\n */\nfunction CmapEncoding(cmap) {\n    this.cmap = cmap;\n}\n\n/**\n * @param  {string} c - the character\n * @return {number} The glyph index.\n */\nCmapEncoding.prototype.charToGlyphIndex = function(c) {\n    return this.cmap.glyphIndexMap[c.codePointAt(0)] || 0;\n};\n\n/**\n * @exports opentype.CffEncoding\n * @class\n * @constructor\n * @param {string} encoding - The encoding\n * @param {Array} charset - The character set.\n */\nfunction CffEncoding(encoding, charset) {\n    this.encoding = encoding;\n    this.charset = charset;\n}\n\n/**\n * @param  {string} s - The character\n * @return {number} The index.\n */\nCffEncoding.prototype.charToGlyphIndex = function(s) {\n    var code = s.codePointAt(0);\n    var charName = this.encoding[code];\n    return this.charset.indexOf(charName);\n};\n\n/**\n * @exports opentype.GlyphNames\n * @class\n * @constructor\n * @param {Object} post\n */\nfunction GlyphNames(post) {\n    switch (post.version) {\n        case 1:\n            this.names = standardNames.slice();\n            break;\n        case 2:\n            this.names = new Array(post.numberOfGlyphs);\n            for (var i = 0; i < post.numberOfGlyphs; i++) {\n                if (post.glyphNameIndex[i] < standardNames.length) {\n                    this.names[i] = standardNames[post.glyphNameIndex[i]];\n                } else {\n                    this.names[i] = post.names[post.glyphNameIndex[i] - standardNames.length];\n                }\n            }\n\n            break;\n        case 2.5:\n            this.names = new Array(post.numberOfGlyphs);\n            for (var i$1 = 0; i$1 < post.numberOfGlyphs; i$1++) {\n                this.names[i$1] = standardNames[i$1 + post.glyphNameIndex[i$1]];\n            }\n\n            break;\n        case 3:\n            this.names = [];\n            break;\n        default:\n            this.names = [];\n            break;\n    }\n}\n\n/**\n * Gets the index of a glyph by name.\n * @param  {string} name - The glyph name\n * @return {number} The index\n */\nGlyphNames.prototype.nameToGlyphIndex = function(name) {\n    return this.names.indexOf(name);\n};\n\n/**\n * @param  {number} gid\n * @return {string}\n */\nGlyphNames.prototype.glyphIndexToName = function(gid) {\n    return this.names[gid];\n};\n\nfunction addGlyphNamesAll(font) {\n    var glyph;\n    var glyphIndexMap = font.tables.cmap.glyphIndexMap;\n    var charCodes = Object.keys(glyphIndexMap);\n\n    for (var i = 0; i < charCodes.length; i += 1) {\n        var c = charCodes[i];\n        var glyphIndex = glyphIndexMap[c];\n        glyph = font.glyphs.get(glyphIndex);\n        glyph.addUnicode(parseInt(c));\n    }\n\n    for (var i$1 = 0; i$1 < font.glyphs.length; i$1 += 1) {\n        glyph = font.glyphs.get(i$1);\n        if (font.cffEncoding) {\n            if (font.isCIDFont) {\n                glyph.name = 'gid' + i$1;\n            } else {\n                glyph.name = font.cffEncoding.charset[i$1];\n            }\n        } else if (font.glyphNames.names) {\n            glyph.name = font.glyphNames.glyphIndexToName(i$1);\n        }\n    }\n}\n\nfunction addGlyphNamesToUnicodeMap(font) {\n    font._IndexToUnicodeMap = {};\n\n    var glyphIndexMap = font.tables.cmap.glyphIndexMap;\n    var charCodes = Object.keys(glyphIndexMap);\n\n    for (var i = 0; i < charCodes.length; i += 1) {\n        var c = charCodes[i];\n        var glyphIndex = glyphIndexMap[c];\n        if (font._IndexToUnicodeMap[glyphIndex] === undefined) {\n            font._IndexToUnicodeMap[glyphIndex] = {\n                unicodes: [parseInt(c)]\n            };\n        } else {\n            font._IndexToUnicodeMap[glyphIndex].unicodes.push(parseInt(c));\n        }\n    }\n}\n\n/**\n * @alias opentype.addGlyphNames\n * @param {opentype.Font}\n * @param {Object}\n */\nfunction addGlyphNames(font, opt) {\n    if (opt.lowMemory) {\n        addGlyphNamesToUnicodeMap(font);\n    } else {\n        addGlyphNamesAll(font);\n    }\n}\n\n// Drawing utility functions.\n\n// Draw a line on the given context from point `x1,y1` to point `x2,y2`.\nfunction line(ctx, x1, y1, x2, y2) {\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.lineTo(x2, y2);\n    ctx.stroke();\n}\n\nvar draw = { line: line };\n\n// The Glyph object\n// import glyf from './tables/glyf' Can't be imported here, because it's a circular dependency\n\nfunction getPathDefinition(glyph, path) {\n    var _path = path || new Path();\n    return {\n        configurable: true,\n\n        get: function() {\n            if (typeof _path === 'function') {\n                _path = _path();\n            }\n\n            return _path;\n        },\n\n        set: function(p) {\n            _path = p;\n        }\n    };\n}\n/**\n * @typedef GlyphOptions\n * @type Object\n * @property {string} [name] - The glyph name\n * @property {number} [unicode]\n * @property {Array} [unicodes]\n * @property {number} [xMin]\n * @property {number} [yMin]\n * @property {number} [xMax]\n * @property {number} [yMax]\n * @property {number} [advanceWidth]\n */\n\n// A Glyph is an individual mark that often corresponds to a character.\n// Some glyphs, such as ligatures, are a combination of many characters.\n// Glyphs are the basic building blocks of a font.\n//\n// The `Glyph` class contains utility methods for drawing the path and its points.\n/**\n * @exports opentype.Glyph\n * @class\n * @param {GlyphOptions}\n * @constructor\n */\nfunction Glyph(options) {\n    // By putting all the code on a prototype function (which is only declared once)\n    // we reduce the memory requirements for larger fonts by some 2%\n    this.bindConstructorValues(options);\n}\n\n/**\n * @param  {GlyphOptions}\n */\nGlyph.prototype.bindConstructorValues = function(options) {\n    this.index = options.index || 0;\n\n    // These three values cannot be deferred for memory optimization:\n    this.name = options.name || null;\n    this.unicode = options.unicode || undefined;\n    this.unicodes = options.unicodes || options.unicode !== undefined ? [options.unicode] : [];\n\n    // But by binding these values only when necessary, we reduce can\n    // the memory requirements by almost 3% for larger fonts.\n    if ('xMin' in options) {\n        this.xMin = options.xMin;\n    }\n\n    if ('yMin' in options) {\n        this.yMin = options.yMin;\n    }\n\n    if ('xMax' in options) {\n        this.xMax = options.xMax;\n    }\n\n    if ('yMax' in options) {\n        this.yMax = options.yMax;\n    }\n\n    if ('advanceWidth' in options) {\n        this.advanceWidth = options.advanceWidth;\n    }\n\n    // The path for a glyph is the most memory intensive, and is bound as a value\n    // with a getter/setter to ensure we actually do path parsing only once the\n    // path is actually needed by anything.\n    Object.defineProperty(this, 'path', getPathDefinition(this, options.path));\n};\n\n/**\n * @param {number}\n */\nGlyph.prototype.addUnicode = function(unicode) {\n    if (this.unicodes.length === 0) {\n        this.unicode = unicode;\n    }\n\n    this.unicodes.push(unicode);\n};\n\n/**\n * Calculate the minimum bounding box for this glyph.\n * @return {opentype.BoundingBox}\n */\nGlyph.prototype.getBoundingBox = function() {\n    return this.path.getBoundingBox();\n};\n\n/**\n * Convert the glyph to a Path we can draw on a drawing context.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {Object=} options - xScale, yScale to stretch the glyph.\n * @param  {opentype.Font} if hinting is to be used, the font\n * @return {opentype.Path}\n */\nGlyph.prototype.getPath = function(x, y, fontSize, options, font) {\n    x = x !== undefined ? x : 0;\n    y = y !== undefined ? y : 0;\n    fontSize = fontSize !== undefined ? fontSize : 72;\n    var commands;\n    var hPoints;\n    if (!options) { options = { }; }\n    var xScale = options.xScale;\n    var yScale = options.yScale;\n\n    if (options.hinting && font && font.hinting) {\n        // in case of hinting, the hinting engine takes care\n        // of scaling the points (not the path) before hinting.\n        hPoints = this.path && font.hinting.exec(this, fontSize);\n        // in case the hinting engine failed hPoints is undefined\n        // and thus reverts to plain rending\n    }\n\n    if (hPoints) {\n        // Call font.hinting.getCommands instead of `glyf.getPath(hPoints).commands` to avoid a circular dependency\n        commands = font.hinting.getCommands(hPoints);\n        x = Math.round(x);\n        y = Math.round(y);\n        // TODO in case of hinting xyScaling is not yet supported\n        xScale = yScale = 1;\n    } else {\n        commands = this.path.commands;\n        var scale = 1 / (this.path.unitsPerEm || 1000) * fontSize;\n        if (xScale === undefined) { xScale = scale; }\n        if (yScale === undefined) { yScale = scale; }\n    }\n\n    var p = new Path();\n    for (var i = 0; i < commands.length; i += 1) {\n        var cmd = commands[i];\n        if (cmd.type === 'M') {\n            p.moveTo(x + (cmd.x * xScale), y + (-cmd.y * yScale));\n        } else if (cmd.type === 'L') {\n            p.lineTo(x + (cmd.x * xScale), y + (-cmd.y * yScale));\n        } else if (cmd.type === 'Q') {\n            p.quadraticCurveTo(x + (cmd.x1 * xScale), y + (-cmd.y1 * yScale),\n                               x + (cmd.x * xScale), y + (-cmd.y * yScale));\n        } else if (cmd.type === 'C') {\n            p.curveTo(x + (cmd.x1 * xScale), y + (-cmd.y1 * yScale),\n                      x + (cmd.x2 * xScale), y + (-cmd.y2 * yScale),\n                      x + (cmd.x * xScale), y + (-cmd.y * yScale));\n        } else if (cmd.type === 'Z') {\n            p.closePath();\n        }\n    }\n\n    return p;\n};\n\n/**\n * Split the glyph into contours.\n * This function is here for backwards compatibility, and to\n * provide raw access to the TrueType glyph outlines.\n * @return {Array}\n */\nGlyph.prototype.getContours = function() {\n    if (this.points === undefined) {\n        return [];\n    }\n\n    var contours = [];\n    var currentContour = [];\n    for (var i = 0; i < this.points.length; i += 1) {\n        var pt = this.points[i];\n        currentContour.push(pt);\n        if (pt.lastPointOfContour) {\n            contours.push(currentContour);\n            currentContour = [];\n        }\n    }\n\n    check.argument(currentContour.length === 0, 'There are still points left in the current contour.');\n    return contours;\n};\n\n/**\n * Calculate the xMin/yMin/xMax/yMax/lsb/rsb for a Glyph.\n * @return {Object}\n */\nGlyph.prototype.getMetrics = function() {\n    var commands = this.path.commands;\n    var xCoords = [];\n    var yCoords = [];\n    for (var i = 0; i < commands.length; i += 1) {\n        var cmd = commands[i];\n        if (cmd.type !== 'Z') {\n            xCoords.push(cmd.x);\n            yCoords.push(cmd.y);\n        }\n\n        if (cmd.type === 'Q' || cmd.type === 'C') {\n            xCoords.push(cmd.x1);\n            yCoords.push(cmd.y1);\n        }\n\n        if (cmd.type === 'C') {\n            xCoords.push(cmd.x2);\n            yCoords.push(cmd.y2);\n        }\n    }\n\n    var metrics = {\n        xMin: Math.min.apply(null, xCoords),\n        yMin: Math.min.apply(null, yCoords),\n        xMax: Math.max.apply(null, xCoords),\n        yMax: Math.max.apply(null, yCoords),\n        leftSideBearing: this.leftSideBearing\n    };\n\n    if (!isFinite(metrics.xMin)) {\n        metrics.xMin = 0;\n    }\n\n    if (!isFinite(metrics.xMax)) {\n        metrics.xMax = this.advanceWidth;\n    }\n\n    if (!isFinite(metrics.yMin)) {\n        metrics.yMin = 0;\n    }\n\n    if (!isFinite(metrics.yMax)) {\n        metrics.yMax = 0;\n    }\n\n    metrics.rightSideBearing = this.advanceWidth - metrics.leftSideBearing - (metrics.xMax - metrics.xMin);\n    return metrics;\n};\n\n/**\n * Draw the glyph on the given context.\n * @param  {CanvasRenderingContext2D} ctx - A 2D drawing context, like Canvas.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {Object=} options - xScale, yScale to stretch the glyph.\n */\nGlyph.prototype.draw = function(ctx, x, y, fontSize, options) {\n    this.getPath(x, y, fontSize, options).draw(ctx);\n};\n\n/**\n * Draw the points of the glyph.\n * On-curve points will be drawn in blue, off-curve points will be drawn in red.\n * @param  {CanvasRenderingContext2D} ctx - A 2D drawing context, like Canvas.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n */\nGlyph.prototype.drawPoints = function(ctx, x, y, fontSize) {\n    function drawCircles(l, x, y, scale) {\n        ctx.beginPath();\n        for (var j = 0; j < l.length; j += 1) {\n            ctx.moveTo(x + (l[j].x * scale), y + (l[j].y * scale));\n            ctx.arc(x + (l[j].x * scale), y + (l[j].y * scale), 2, 0, Math.PI * 2, false);\n        }\n\n        ctx.closePath();\n        ctx.fill();\n    }\n\n    x = x !== undefined ? x : 0;\n    y = y !== undefined ? y : 0;\n    fontSize = fontSize !== undefined ? fontSize : 24;\n    var scale = 1 / this.path.unitsPerEm * fontSize;\n\n    var blueCircles = [];\n    var redCircles = [];\n    var path = this.path;\n    for (var i = 0; i < path.commands.length; i += 1) {\n        var cmd = path.commands[i];\n        if (cmd.x !== undefined) {\n            blueCircles.push({x: cmd.x, y: -cmd.y});\n        }\n\n        if (cmd.x1 !== undefined) {\n            redCircles.push({x: cmd.x1, y: -cmd.y1});\n        }\n\n        if (cmd.x2 !== undefined) {\n            redCircles.push({x: cmd.x2, y: -cmd.y2});\n        }\n    }\n\n    ctx.fillStyle = 'blue';\n    drawCircles(blueCircles, x, y, scale);\n    ctx.fillStyle = 'red';\n    drawCircles(redCircles, x, y, scale);\n};\n\n/**\n * Draw lines indicating important font measurements.\n * Black lines indicate the origin of the coordinate system (point 0,0).\n * Blue lines indicate the glyph bounding box.\n * Green line indicates the advance width of the glyph.\n * @param  {CanvasRenderingContext2D} ctx - A 2D drawing context, like Canvas.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n */\nGlyph.prototype.drawMetrics = function(ctx, x, y, fontSize) {\n    var scale;\n    x = x !== undefined ? x : 0;\n    y = y !== undefined ? y : 0;\n    fontSize = fontSize !== undefined ? fontSize : 24;\n    scale = 1 / this.path.unitsPerEm * fontSize;\n    ctx.lineWidth = 1;\n\n    // Draw the origin\n    ctx.strokeStyle = 'black';\n    draw.line(ctx, x, -10000, x, 10000);\n    draw.line(ctx, -10000, y, 10000, y);\n\n    // This code is here due to memory optimization: by not using\n    // defaults in the constructor, we save a notable amount of memory.\n    var xMin = this.xMin || 0;\n    var yMin = this.yMin || 0;\n    var xMax = this.xMax || 0;\n    var yMax = this.yMax || 0;\n    var advanceWidth = this.advanceWidth || 0;\n\n    // Draw the glyph box\n    ctx.strokeStyle = 'blue';\n    draw.line(ctx, x + (xMin * scale), -10000, x + (xMin * scale), 10000);\n    draw.line(ctx, x + (xMax * scale), -10000, x + (xMax * scale), 10000);\n    draw.line(ctx, -10000, y + (-yMin * scale), 10000, y + (-yMin * scale));\n    draw.line(ctx, -10000, y + (-yMax * scale), 10000, y + (-yMax * scale));\n\n    // Draw the advance width\n    ctx.strokeStyle = 'green';\n    draw.line(ctx, x + (advanceWidth * scale), -10000, x + (advanceWidth * scale), 10000);\n};\n\n// The GlyphSet object\n\n// Define a property on the glyph that depends on the path being loaded.\nfunction defineDependentProperty(glyph, externalName, internalName) {\n    Object.defineProperty(glyph, externalName, {\n        get: function() {\n            // Request the path property to make sure the path is loaded.\n            glyph.path; // jshint ignore:line\n            return glyph[internalName];\n        },\n        set: function(newValue) {\n            glyph[internalName] = newValue;\n        },\n        enumerable: true,\n        configurable: true\n    });\n}\n\n/**\n * A GlyphSet represents all glyphs available in the font, but modelled using\n * a deferred glyph loader, for retrieving glyphs only once they are absolutely\n * necessary, to keep the memory footprint down.\n * @exports opentype.GlyphSet\n * @class\n * @param {opentype.Font}\n * @param {Array}\n */\nfunction GlyphSet(font, glyphs) {\n    this.font = font;\n    this.glyphs = {};\n    if (Array.isArray(glyphs)) {\n        for (var i = 0; i < glyphs.length; i++) {\n            var glyph = glyphs[i];\n            glyph.path.unitsPerEm = font.unitsPerEm;\n            this.glyphs[i] = glyph;\n        }\n    }\n\n    this.length = (glyphs && glyphs.length) || 0;\n}\n\n/**\n * @param  {number} index\n * @return {opentype.Glyph}\n */\nGlyphSet.prototype.get = function(index) {\n    // this.glyphs[index] is 'undefined' when low memory mode is on. glyph is pushed on request only.\n    if (this.glyphs[index] === undefined) {\n        this.font._push(index);\n        if (typeof this.glyphs[index] === 'function') {\n            this.glyphs[index] = this.glyphs[index]();\n        }\n\n        var glyph = this.glyphs[index];\n        var unicodeObj = this.font._IndexToUnicodeMap[index];\n\n        if (unicodeObj) {\n            for (var j = 0; j < unicodeObj.unicodes.length; j++)\n                { glyph.addUnicode(unicodeObj.unicodes[j]); }\n        }\n\n        if (this.font.cffEncoding) {\n            if (this.font.isCIDFont) {\n                glyph.name = 'gid' + index;\n            } else {\n                glyph.name = this.font.cffEncoding.charset[index];\n            }\n        } else if (this.font.glyphNames.names) {\n            glyph.name = this.font.glyphNames.glyphIndexToName(index);\n        }\n\n        this.glyphs[index].advanceWidth = this.font._hmtxTableData[index].advanceWidth;\n        this.glyphs[index].leftSideBearing = this.font._hmtxTableData[index].leftSideBearing;\n    } else {\n        if (typeof this.glyphs[index] === 'function') {\n            this.glyphs[index] = this.glyphs[index]();\n        }\n    }\n\n    return this.glyphs[index];\n};\n\n/**\n * @param  {number} index\n * @param  {Object}\n */\nGlyphSet.prototype.push = function(index, loader) {\n    this.glyphs[index] = loader;\n    this.length++;\n};\n\n/**\n * @alias opentype.glyphLoader\n * @param  {opentype.Font} font\n * @param  {number} index\n * @return {opentype.Glyph}\n */\nfunction glyphLoader(font, index) {\n    return new Glyph({index: index, font: font});\n}\n\n/**\n * Generate a stub glyph that can be filled with all metadata *except*\n * the \"points\" and \"path\" properties, which must be loaded only once\n * the glyph's path is actually requested for text shaping.\n * @alias opentype.ttfGlyphLoader\n * @param  {opentype.Font} font\n * @param  {number} index\n * @param  {Function} parseGlyph\n * @param  {Object} data\n * @param  {number} position\n * @param  {Function} buildPath\n * @return {opentype.Glyph}\n */\nfunction ttfGlyphLoader(font, index, parseGlyph, data, position, buildPath) {\n    return function() {\n        var glyph = new Glyph({index: index, font: font});\n\n        glyph.path = function() {\n            parseGlyph(glyph, data, position);\n            var path = buildPath(font.glyphs, glyph);\n            path.unitsPerEm = font.unitsPerEm;\n            return path;\n        };\n\n        defineDependentProperty(glyph, 'xMin', '_xMin');\n        defineDependentProperty(glyph, 'xMax', '_xMax');\n        defineDependentProperty(glyph, 'yMin', '_yMin');\n        defineDependentProperty(glyph, 'yMax', '_yMax');\n\n        return glyph;\n    };\n}\n/**\n * @alias opentype.cffGlyphLoader\n * @param  {opentype.Font} font\n * @param  {number} index\n * @param  {Function} parseCFFCharstring\n * @param  {string} charstring\n * @return {opentype.Glyph}\n */\nfunction cffGlyphLoader(font, index, parseCFFCharstring, charstring) {\n    return function() {\n        var glyph = new Glyph({index: index, font: font});\n\n        glyph.path = function() {\n            var path = parseCFFCharstring(font, glyph, charstring);\n            path.unitsPerEm = font.unitsPerEm;\n            return path;\n        };\n\n        return glyph;\n    };\n}\n\nvar glyphset = { GlyphSet: GlyphSet, glyphLoader: glyphLoader, ttfGlyphLoader: ttfGlyphLoader, cffGlyphLoader: cffGlyphLoader };\n\n// The `CFF` table contains the glyph outlines in PostScript format.\n\n// Custom equals function that can also check lists.\nfunction equals(a, b) {\n    if (a === b) {\n        return true;\n    } else if (Array.isArray(a) && Array.isArray(b)) {\n        if (a.length !== b.length) {\n            return false;\n        }\n\n        for (var i = 0; i < a.length; i += 1) {\n            if (!equals(a[i], b[i])) {\n                return false;\n            }\n        }\n\n        return true;\n    } else {\n        return false;\n    }\n}\n\n// Subroutines are encoded using the negative half of the number space.\n// See type 2 chapter 4.7 \"Subroutine operators\".\nfunction calcCFFSubroutineBias(subrs) {\n    var bias;\n    if (subrs.length < 1240) {\n        bias = 107;\n    } else if (subrs.length < 33900) {\n        bias = 1131;\n    } else {\n        bias = 32768;\n    }\n\n    return bias;\n}\n\n// Parse a `CFF` INDEX array.\n// An index array consists of a list of offsets, then a list of objects at those offsets.\nfunction parseCFFIndex(data, start, conversionFn) {\n    var offsets = [];\n    var objects = [];\n    var count = parse.getCard16(data, start);\n    var objectOffset;\n    var endOffset;\n    if (count !== 0) {\n        var offsetSize = parse.getByte(data, start + 2);\n        objectOffset = start + ((count + 1) * offsetSize) + 2;\n        var pos = start + 3;\n        for (var i = 0; i < count + 1; i += 1) {\n            offsets.push(parse.getOffset(data, pos, offsetSize));\n            pos += offsetSize;\n        }\n\n        // The total size of the index array is 4 header bytes + the value of the last offset.\n        endOffset = objectOffset + offsets[count];\n    } else {\n        endOffset = start + 2;\n    }\n\n    for (var i$1 = 0; i$1 < offsets.length - 1; i$1 += 1) {\n        var value = parse.getBytes(data, objectOffset + offsets[i$1], objectOffset + offsets[i$1 + 1]);\n        if (conversionFn) {\n            value = conversionFn(value);\n        }\n\n        objects.push(value);\n    }\n\n    return {objects: objects, startOffset: start, endOffset: endOffset};\n}\n\nfunction parseCFFIndexLowMemory(data, start) {\n    var offsets = [];\n    var count = parse.getCard16(data, start);\n    var objectOffset;\n    var endOffset;\n    if (count !== 0) {\n        var offsetSize = parse.getByte(data, start + 2);\n        objectOffset = start + ((count + 1) * offsetSize) + 2;\n        var pos = start + 3;\n        for (var i = 0; i < count + 1; i += 1) {\n            offsets.push(parse.getOffset(data, pos, offsetSize));\n            pos += offsetSize;\n        }\n\n        // The total size of the index array is 4 header bytes + the value of the last offset.\n        endOffset = objectOffset + offsets[count];\n    } else {\n        endOffset = start + 2;\n    }\n\n    return {offsets: offsets, startOffset: start, endOffset: endOffset};\n}\nfunction getCffIndexObject(i, offsets, data, start, conversionFn) {\n    var count = parse.getCard16(data, start);\n    var objectOffset = 0;\n    if (count !== 0) {\n        var offsetSize = parse.getByte(data, start + 2);\n        objectOffset = start + ((count + 1) * offsetSize) + 2;\n    }\n\n    var value = parse.getBytes(data, objectOffset + offsets[i], objectOffset + offsets[i + 1]);\n    if (conversionFn) {\n        value = conversionFn(value);\n    }\n    return value;\n}\n\n// Parse a `CFF` DICT real value.\nfunction parseFloatOperand(parser) {\n    var s = '';\n    var eof = 15;\n    var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];\n    while (true) {\n        var b = parser.parseByte();\n        var n1 = b >> 4;\n        var n2 = b & 15;\n\n        if (n1 === eof) {\n            break;\n        }\n\n        s += lookup[n1];\n\n        if (n2 === eof) {\n            break;\n        }\n\n        s += lookup[n2];\n    }\n\n    return parseFloat(s);\n}\n\n// Parse a `CFF` DICT operand.\nfunction parseOperand(parser, b0) {\n    var b1;\n    var b2;\n    var b3;\n    var b4;\n    if (b0 === 28) {\n        b1 = parser.parseByte();\n        b2 = parser.parseByte();\n        return b1 << 8 | b2;\n    }\n\n    if (b0 === 29) {\n        b1 = parser.parseByte();\n        b2 = parser.parseByte();\n        b3 = parser.parseByte();\n        b4 = parser.parseByte();\n        return b1 << 24 | b2 << 16 | b3 << 8 | b4;\n    }\n\n    if (b0 === 30) {\n        return parseFloatOperand(parser);\n    }\n\n    if (b0 >= 32 && b0 <= 246) {\n        return b0 - 139;\n    }\n\n    if (b0 >= 247 && b0 <= 250) {\n        b1 = parser.parseByte();\n        return (b0 - 247) * 256 + b1 + 108;\n    }\n\n    if (b0 >= 251 && b0 <= 254) {\n        b1 = parser.parseByte();\n        return -(b0 - 251) * 256 - b1 - 108;\n    }\n\n    throw new Error('Invalid b0 ' + b0);\n}\n\n// Convert the entries returned by `parseDict` to a proper dictionary.\n// If a value is a list of one, it is unpacked.\nfunction entriesToObject(entries) {\n    var o = {};\n    for (var i = 0; i < entries.length; i += 1) {\n        var key = entries[i][0];\n        var values = entries[i][1];\n        var value = (void 0);\n        if (values.length === 1) {\n            value = values[0];\n        } else {\n            value = values;\n        }\n\n        if (o.hasOwnProperty(key) && !isNaN(o[key])) {\n            throw new Error('Object ' + o + ' already has key ' + key);\n        }\n\n        o[key] = value;\n    }\n\n    return o;\n}\n\n// Parse a `CFF` DICT object.\n// A dictionary contains key-value pairs in a compact tokenized format.\nfunction parseCFFDict(data, start, size) {\n    start = start !== undefined ? start : 0;\n    var parser = new parse.Parser(data, start);\n    var entries = [];\n    var operands = [];\n    size = size !== undefined ? size : data.length;\n\n    while (parser.relativeOffset < size) {\n        var op = parser.parseByte();\n\n        // The first byte for each dict item distinguishes between operator (key) and operand (value).\n        // Values <= 21 are operators.\n        if (op <= 21) {\n            // Two-byte operators have an initial escape byte of 12.\n            if (op === 12) {\n                op = 1200 + parser.parseByte();\n            }\n\n            entries.push([op, operands]);\n            operands = [];\n        } else {\n            // Since the operands (values) come before the operators (keys), we store all operands in a list\n            // until we encounter an operator.\n            operands.push(parseOperand(parser, op));\n        }\n    }\n\n    return entriesToObject(entries);\n}\n\n// Given a String Index (SID), return the value of the string.\n// Strings below index 392 are standard CFF strings and are not encoded in the font.\nfunction getCFFString(strings, index) {\n    if (index <= 390) {\n        index = cffStandardStrings[index];\n    } else {\n        index = strings[index - 391];\n    }\n\n    return index;\n}\n\n// Interpret a dictionary and return a new dictionary with readable keys and values for missing entries.\n// This function takes `meta` which is a list of objects containing `operand`, `name` and `default`.\nfunction interpretDict(dict, meta, strings) {\n    var newDict = {};\n    var value;\n\n    // Because we also want to include missing values, we start out from the meta list\n    // and lookup values in the dict.\n    for (var i = 0; i < meta.length; i += 1) {\n        var m = meta[i];\n\n        if (Array.isArray(m.type)) {\n            var values = [];\n            values.length = m.type.length;\n            for (var j = 0; j < m.type.length; j++) {\n                value = dict[m.op] !== undefined ? dict[m.op][j] : undefined;\n                if (value === undefined) {\n                    value = m.value !== undefined && m.value[j] !== undefined ? m.value[j] : null;\n                }\n                if (m.type[j] === 'SID') {\n                    value = getCFFString(strings, value);\n                }\n                values[j] = value;\n            }\n            newDict[m.name] = values;\n        } else {\n            value = dict[m.op];\n            if (value === undefined) {\n                value = m.value !== undefined ? m.value : null;\n            }\n\n            if (m.type === 'SID') {\n                value = getCFFString(strings, value);\n            }\n            newDict[m.name] = value;\n        }\n    }\n\n    return newDict;\n}\n\n// Parse the CFF header.\nfunction parseCFFHeader(data, start) {\n    var header = {};\n    header.formatMajor = parse.getCard8(data, start);\n    header.formatMinor = parse.getCard8(data, start + 1);\n    header.size = parse.getCard8(data, start + 2);\n    header.offsetSize = parse.getCard8(data, start + 3);\n    header.startOffset = start;\n    header.endOffset = start + 4;\n    return header;\n}\n\nvar TOP_DICT_META = [\n    {name: 'version', op: 0, type: 'SID'},\n    {name: 'notice', op: 1, type: 'SID'},\n    {name: 'copyright', op: 1200, type: 'SID'},\n    {name: 'fullName', op: 2, type: 'SID'},\n    {name: 'familyName', op: 3, type: 'SID'},\n    {name: 'weight', op: 4, type: 'SID'},\n    {name: 'isFixedPitch', op: 1201, type: 'number', value: 0},\n    {name: 'italicAngle', op: 1202, type: 'number', value: 0},\n    {name: 'underlinePosition', op: 1203, type: 'number', value: -100},\n    {name: 'underlineThickness', op: 1204, type: 'number', value: 50},\n    {name: 'paintType', op: 1205, type: 'number', value: 0},\n    {name: 'charstringType', op: 1206, type: 'number', value: 2},\n    {\n        name: 'fontMatrix',\n        op: 1207,\n        type: ['real', 'real', 'real', 'real', 'real', 'real'],\n        value: [0.001, 0, 0, 0.001, 0, 0]\n    },\n    {name: 'uniqueId', op: 13, type: 'number'},\n    {name: 'fontBBox', op: 5, type: ['number', 'number', 'number', 'number'], value: [0, 0, 0, 0]},\n    {name: 'strokeWidth', op: 1208, type: 'number', value: 0},\n    {name: 'xuid', op: 14, type: [], value: null},\n    {name: 'charset', op: 15, type: 'offset', value: 0},\n    {name: 'encoding', op: 16, type: 'offset', value: 0},\n    {name: 'charStrings', op: 17, type: 'offset', value: 0},\n    {name: 'private', op: 18, type: ['number', 'offset'], value: [0, 0]},\n    {name: 'ros', op: 1230, type: ['SID', 'SID', 'number']},\n    {name: 'cidFontVersion', op: 1231, type: 'number', value: 0},\n    {name: 'cidFontRevision', op: 1232, type: 'number', value: 0},\n    {name: 'cidFontType', op: 1233, type: 'number', value: 0},\n    {name: 'cidCount', op: 1234, type: 'number', value: 8720},\n    {name: 'uidBase', op: 1235, type: 'number'},\n    {name: 'fdArray', op: 1236, type: 'offset'},\n    {name: 'fdSelect', op: 1237, type: 'offset'},\n    {name: 'fontName', op: 1238, type: 'SID'}\n];\n\nvar PRIVATE_DICT_META = [\n    {name: 'subrs', op: 19, type: 'offset', value: 0},\n    {name: 'defaultWidthX', op: 20, type: 'number', value: 0},\n    {name: 'nominalWidthX', op: 21, type: 'number', value: 0}\n];\n\n// Parse the CFF top dictionary. A CFF table can contain multiple fonts, each with their own top dictionary.\n// The top dictionary contains the essential metadata for the font, together with the private dictionary.\nfunction parseCFFTopDict(data, strings) {\n    var dict = parseCFFDict(data, 0, data.byteLength);\n    return interpretDict(dict, TOP_DICT_META, strings);\n}\n\n// Parse the CFF private dictionary. We don't fully parse out all the values, only the ones we need.\nfunction parseCFFPrivateDict(data, start, size, strings) {\n    var dict = parseCFFDict(data, start, size);\n    return interpretDict(dict, PRIVATE_DICT_META, strings);\n}\n\n// Returns a list of \"Top DICT\"s found using an INDEX list.\n// Used to read both the usual high-level Top DICTs and also the FDArray\n// discovered inside CID-keyed fonts.  When a Top DICT has a reference to\n// a Private DICT that is read and saved into the Top DICT.\n//\n// In addition to the expected/optional values as outlined in TOP_DICT_META\n// the following values might be saved into the Top DICT.\n//\n//    _subrs []        array of local CFF subroutines from Private DICT\n//    _subrsBias       bias value computed from number of subroutines\n//                      (see calcCFFSubroutineBias() and parseCFFCharstring())\n//    _defaultWidthX   default widths for CFF characters\n//    _nominalWidthX   bias added to width embedded within glyph description\n//\n//    _privateDict     saved copy of parsed Private DICT from Top DICT\nfunction gatherCFFTopDicts(data, start, cffIndex, strings) {\n    var topDictArray = [];\n    for (var iTopDict = 0; iTopDict < cffIndex.length; iTopDict += 1) {\n        var topDictData = new DataView(new Uint8Array(cffIndex[iTopDict]).buffer);\n        var topDict = parseCFFTopDict(topDictData, strings);\n        topDict._subrs = [];\n        topDict._subrsBias = 0;\n        topDict._defaultWidthX = 0;\n        topDict._nominalWidthX = 0;\n        var privateSize = topDict.private[0];\n        var privateOffset = topDict.private[1];\n        if (privateSize !== 0 && privateOffset !== 0) {\n            var privateDict = parseCFFPrivateDict(data, privateOffset + start, privateSize, strings);\n            topDict._defaultWidthX = privateDict.defaultWidthX;\n            topDict._nominalWidthX = privateDict.nominalWidthX;\n            if (privateDict.subrs !== 0) {\n                var subrOffset = privateOffset + privateDict.subrs;\n                var subrIndex = parseCFFIndex(data, subrOffset + start);\n                topDict._subrs = subrIndex.objects;\n                topDict._subrsBias = calcCFFSubroutineBias(topDict._subrs);\n            }\n            topDict._privateDict = privateDict;\n        }\n        topDictArray.push(topDict);\n    }\n    return topDictArray;\n}\n\n// Parse the CFF charset table, which contains internal names for all the glyphs.\n// This function will return a list of glyph names.\n// See Adobe TN #5176 chapter 13, \"Charsets\".\nfunction parseCFFCharset(data, start, nGlyphs, strings) {\n    var sid;\n    var count;\n    var parser = new parse.Parser(data, start);\n\n    // The .notdef glyph is not included, so subtract 1.\n    nGlyphs -= 1;\n    var charset = ['.notdef'];\n\n    var format = parser.parseCard8();\n    if (format === 0) {\n        for (var i = 0; i < nGlyphs; i += 1) {\n            sid = parser.parseSID();\n            charset.push(getCFFString(strings, sid));\n        }\n    } else if (format === 1) {\n        while (charset.length <= nGlyphs) {\n            sid = parser.parseSID();\n            count = parser.parseCard8();\n            for (var i$1 = 0; i$1 <= count; i$1 += 1) {\n                charset.push(getCFFString(strings, sid));\n                sid += 1;\n            }\n        }\n    } else if (format === 2) {\n        while (charset.length <= nGlyphs) {\n            sid = parser.parseSID();\n            count = parser.parseCard16();\n            for (var i$2 = 0; i$2 <= count; i$2 += 1) {\n                charset.push(getCFFString(strings, sid));\n                sid += 1;\n            }\n        }\n    } else {\n        throw new Error('Unknown charset format ' + format);\n    }\n\n    return charset;\n}\n\n// Parse the CFF encoding data. Only one encoding can be specified per font.\n// See Adobe TN #5176 chapter 12, \"Encodings\".\nfunction parseCFFEncoding(data, start, charset) {\n    var code;\n    var enc = {};\n    var parser = new parse.Parser(data, start);\n    var format = parser.parseCard8();\n    if (format === 0) {\n        var nCodes = parser.parseCard8();\n        for (var i = 0; i < nCodes; i += 1) {\n            code = parser.parseCard8();\n            enc[code] = i;\n        }\n    } else if (format === 1) {\n        var nRanges = parser.parseCard8();\n        code = 1;\n        for (var i$1 = 0; i$1 < nRanges; i$1 += 1) {\n            var first = parser.parseCard8();\n            var nLeft = parser.parseCard8();\n            for (var j = first; j <= first + nLeft; j += 1) {\n                enc[j] = code;\n                code += 1;\n            }\n        }\n    } else {\n        throw new Error('Unknown encoding format ' + format);\n    }\n\n    return new CffEncoding(enc, charset);\n}\n\n// Take in charstring code and return a Glyph object.\n// The encoding is described in the Type 2 Charstring Format\n// https://www.microsoft.com/typography/OTSPEC/charstr2.htm\nfunction parseCFFCharstring(font, glyph, code) {\n    var c1x;\n    var c1y;\n    var c2x;\n    var c2y;\n    var p = new Path();\n    var stack = [];\n    var nStems = 0;\n    var haveWidth = false;\n    var open = false;\n    var x = 0;\n    var y = 0;\n    var subrs;\n    var subrsBias;\n    var defaultWidthX;\n    var nominalWidthX;\n    if (font.isCIDFont) {\n        var fdIndex = font.tables.cff.topDict._fdSelect[glyph.index];\n        var fdDict = font.tables.cff.topDict._fdArray[fdIndex];\n        subrs = fdDict._subrs;\n        subrsBias = fdDict._subrsBias;\n        defaultWidthX = fdDict._defaultWidthX;\n        nominalWidthX = fdDict._nominalWidthX;\n    } else {\n        subrs = font.tables.cff.topDict._subrs;\n        subrsBias = font.tables.cff.topDict._subrsBias;\n        defaultWidthX = font.tables.cff.topDict._defaultWidthX;\n        nominalWidthX = font.tables.cff.topDict._nominalWidthX;\n    }\n    var width = defaultWidthX;\n\n    function newContour(x, y) {\n        if (open) {\n            p.closePath();\n        }\n\n        p.moveTo(x, y);\n        open = true;\n    }\n\n    function parseStems() {\n        var hasWidthArg;\n\n        // The number of stem operators on the stack is always even.\n        // If the value is uneven, that means a width is specified.\n        hasWidthArg = stack.length % 2 !== 0;\n        if (hasWidthArg && !haveWidth) {\n            width = stack.shift() + nominalWidthX;\n        }\n\n        nStems += stack.length >> 1;\n        stack.length = 0;\n        haveWidth = true;\n    }\n\n    function parse(code) {\n        var b1;\n        var b2;\n        var b3;\n        var b4;\n        var codeIndex;\n        var subrCode;\n        var jpx;\n        var jpy;\n        var c3x;\n        var c3y;\n        var c4x;\n        var c4y;\n\n        var i = 0;\n        while (i < code.length) {\n            var v = code[i];\n            i += 1;\n            switch (v) {\n                case 1: // hstem\n                    parseStems();\n                    break;\n                case 3: // vstem\n                    parseStems();\n                    break;\n                case 4: // vmoveto\n                    if (stack.length > 1 && !haveWidth) {\n                        width = stack.shift() + nominalWidthX;\n                        haveWidth = true;\n                    }\n\n                    y += stack.pop();\n                    newContour(x, y);\n                    break;\n                case 5: // rlineto\n                    while (stack.length > 0) {\n                        x += stack.shift();\n                        y += stack.shift();\n                        p.lineTo(x, y);\n                    }\n\n                    break;\n                case 6: // hlineto\n                    while (stack.length > 0) {\n                        x += stack.shift();\n                        p.lineTo(x, y);\n                        if (stack.length === 0) {\n                            break;\n                        }\n\n                        y += stack.shift();\n                        p.lineTo(x, y);\n                    }\n\n                    break;\n                case 7: // vlineto\n                    while (stack.length > 0) {\n                        y += stack.shift();\n                        p.lineTo(x, y);\n                        if (stack.length === 0) {\n                            break;\n                        }\n\n                        x += stack.shift();\n                        p.lineTo(x, y);\n                    }\n\n                    break;\n                case 8: // rrcurveto\n                    while (stack.length > 0) {\n                        c1x = x + stack.shift();\n                        c1y = y + stack.shift();\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        x = c2x + stack.shift();\n                        y = c2y + stack.shift();\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    }\n\n                    break;\n                case 10: // callsubr\n                    codeIndex = stack.pop() + subrsBias;\n                    subrCode = subrs[codeIndex];\n                    if (subrCode) {\n                        parse(subrCode);\n                    }\n\n                    break;\n                case 11: // return\n                    return;\n                case 12: // flex operators\n                    v = code[i];\n                    i += 1;\n                    switch (v) {\n                        case 35: // flex\n                            // |- dx1 dy1 dx2 dy2 dx3 dy3 dx4 dy4 dx5 dy5 dx6 dy6 fd flex (12 35) |-\n                            c1x = x   + stack.shift();    // dx1\n                            c1y = y   + stack.shift();    // dy1\n                            c2x = c1x + stack.shift();    // dx2\n                            c2y = c1y + stack.shift();    // dy2\n                            jpx = c2x + stack.shift();    // dx3\n                            jpy = c2y + stack.shift();    // dy3\n                            c3x = jpx + stack.shift();    // dx4\n                            c3y = jpy + stack.shift();    // dy4\n                            c4x = c3x + stack.shift();    // dx5\n                            c4y = c3y + stack.shift();    // dy5\n                            x = c4x   + stack.shift();    // dx6\n                            y = c4y   + stack.shift();    // dy6\n                            stack.shift();                // flex depth\n                            p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);\n                            p.curveTo(c3x, c3y, c4x, c4y, x, y);\n                            break;\n                        case 34: // hflex\n                            // |- dx1 dx2 dy2 dx3 dx4 dx5 dx6 hflex (12 34) |-\n                            c1x = x   + stack.shift();    // dx1\n                            c1y = y;                      // dy1\n                            c2x = c1x + stack.shift();    // dx2\n                            c2y = c1y + stack.shift();    // dy2\n                            jpx = c2x + stack.shift();    // dx3\n                            jpy = c2y;                    // dy3\n                            c3x = jpx + stack.shift();    // dx4\n                            c3y = c2y;                    // dy4\n                            c4x = c3x + stack.shift();    // dx5\n                            c4y = y;                      // dy5\n                            x = c4x + stack.shift();      // dx6\n                            p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);\n                            p.curveTo(c3x, c3y, c4x, c4y, x, y);\n                            break;\n                        case 36: // hflex1\n                            // |- dx1 dy1 dx2 dy2 dx3 dx4 dx5 dy5 dx6 hflex1 (12 36) |-\n                            c1x = x   + stack.shift();    // dx1\n                            c1y = y   + stack.shift();    // dy1\n                            c2x = c1x + stack.shift();    // dx2\n                            c2y = c1y + stack.shift();    // dy2\n                            jpx = c2x + stack.shift();    // dx3\n                            jpy = c2y;                    // dy3\n                            c3x = jpx + stack.shift();    // dx4\n                            c3y = c2y;                    // dy4\n                            c4x = c3x + stack.shift();    // dx5\n                            c4y = c3y + stack.shift();    // dy5\n                            x = c4x + stack.shift();      // dx6\n                            p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);\n                            p.curveTo(c3x, c3y, c4x, c4y, x, y);\n                            break;\n                        case 37: // flex1\n                            // |- dx1 dy1 dx2 dy2 dx3 dy3 dx4 dy4 dx5 dy5 d6 flex1 (12 37) |-\n                            c1x = x   + stack.shift();    // dx1\n                            c1y = y   + stack.shift();    // dy1\n                            c2x = c1x + stack.shift();    // dx2\n                            c2y = c1y + stack.shift();    // dy2\n                            jpx = c2x + stack.shift();    // dx3\n                            jpy = c2y + stack.shift();    // dy3\n                            c3x = jpx + stack.shift();    // dx4\n                            c3y = jpy + stack.shift();    // dy4\n                            c4x = c3x + stack.shift();    // dx5\n                            c4y = c3y + stack.shift();    // dy5\n                            if (Math.abs(c4x - x) > Math.abs(c4y - y)) {\n                                x = c4x + stack.shift();\n                            } else {\n                                y = c4y + stack.shift();\n                            }\n\n                            p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);\n                            p.curveTo(c3x, c3y, c4x, c4y, x, y);\n                            break;\n                        default:\n                            console.log('Glyph ' + glyph.index + ': unknown operator ' + 1200 + v);\n                            stack.length = 0;\n                    }\n                    break;\n                case 14: // endchar\n                    if (stack.length > 0 && !haveWidth) {\n                        width = stack.shift() + nominalWidthX;\n                        haveWidth = true;\n                    }\n\n                    if (open) {\n                        p.closePath();\n                        open = false;\n                    }\n\n                    break;\n                case 18: // hstemhm\n                    parseStems();\n                    break;\n                case 19: // hintmask\n                case 20: // cntrmask\n                    parseStems();\n                    i += (nStems + 7) >> 3;\n                    break;\n                case 21: // rmoveto\n                    if (stack.length > 2 && !haveWidth) {\n                        width = stack.shift() + nominalWidthX;\n                        haveWidth = true;\n                    }\n\n                    y += stack.pop();\n                    x += stack.pop();\n                    newContour(x, y);\n                    break;\n                case 22: // hmoveto\n                    if (stack.length > 1 && !haveWidth) {\n                        width = stack.shift() + nominalWidthX;\n                        haveWidth = true;\n                    }\n\n                    x += stack.pop();\n                    newContour(x, y);\n                    break;\n                case 23: // vstemhm\n                    parseStems();\n                    break;\n                case 24: // rcurveline\n                    while (stack.length > 2) {\n                        c1x = x + stack.shift();\n                        c1y = y + stack.shift();\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        x = c2x + stack.shift();\n                        y = c2y + stack.shift();\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    }\n\n                    x += stack.shift();\n                    y += stack.shift();\n                    p.lineTo(x, y);\n                    break;\n                case 25: // rlinecurve\n                    while (stack.length > 6) {\n                        x += stack.shift();\n                        y += stack.shift();\n                        p.lineTo(x, y);\n                    }\n\n                    c1x = x + stack.shift();\n                    c1y = y + stack.shift();\n                    c2x = c1x + stack.shift();\n                    c2y = c1y + stack.shift();\n                    x = c2x + stack.shift();\n                    y = c2y + stack.shift();\n                    p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    break;\n                case 26: // vvcurveto\n                    if (stack.length % 2) {\n                        x += stack.shift();\n                    }\n\n                    while (stack.length > 0) {\n                        c1x = x;\n                        c1y = y + stack.shift();\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        x = c2x;\n                        y = c2y + stack.shift();\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    }\n\n                    break;\n                case 27: // hhcurveto\n                    if (stack.length % 2) {\n                        y += stack.shift();\n                    }\n\n                    while (stack.length > 0) {\n                        c1x = x + stack.shift();\n                        c1y = y;\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        x = c2x + stack.shift();\n                        y = c2y;\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    }\n\n                    break;\n                case 28: // shortint\n                    b1 = code[i];\n                    b2 = code[i + 1];\n                    stack.push(((b1 << 24) | (b2 << 16)) >> 16);\n                    i += 2;\n                    break;\n                case 29: // callgsubr\n                    codeIndex = stack.pop() + font.gsubrsBias;\n                    subrCode = font.gsubrs[codeIndex];\n                    if (subrCode) {\n                        parse(subrCode);\n                    }\n\n                    break;\n                case 30: // vhcurveto\n                    while (stack.length > 0) {\n                        c1x = x;\n                        c1y = y + stack.shift();\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        x = c2x + stack.shift();\n                        y = c2y + (stack.length === 1 ? stack.shift() : 0);\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                        if (stack.length === 0) {\n                            break;\n                        }\n\n                        c1x = x + stack.shift();\n                        c1y = y;\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        y = c2y + stack.shift();\n                        x = c2x + (stack.length === 1 ? stack.shift() : 0);\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    }\n\n                    break;\n                case 31: // hvcurveto\n                    while (stack.length > 0) {\n                        c1x = x + stack.shift();\n                        c1y = y;\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        y = c2y + stack.shift();\n                        x = c2x + (stack.length === 1 ? stack.shift() : 0);\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                        if (stack.length === 0) {\n                            break;\n                        }\n\n                        c1x = x;\n                        c1y = y + stack.shift();\n                        c2x = c1x + stack.shift();\n                        c2y = c1y + stack.shift();\n                        x = c2x + stack.shift();\n                        y = c2y + (stack.length === 1 ? stack.shift() : 0);\n                        p.curveTo(c1x, c1y, c2x, c2y, x, y);\n                    }\n\n                    break;\n                default:\n                    if (v < 32) {\n                        console.log('Glyph ' + glyph.index + ': unknown operator ' + v);\n                    } else if (v < 247) {\n                        stack.push(v - 139);\n                    } else if (v < 251) {\n                        b1 = code[i];\n                        i += 1;\n                        stack.push((v - 247) * 256 + b1 + 108);\n                    } else if (v < 255) {\n                        b1 = code[i];\n                        i += 1;\n                        stack.push(-(v - 251) * 256 - b1 - 108);\n                    } else {\n                        b1 = code[i];\n                        b2 = code[i + 1];\n                        b3 = code[i + 2];\n                        b4 = code[i + 3];\n                        i += 4;\n                        stack.push(((b1 << 24) | (b2 << 16) | (b3 << 8) | b4) / 65536);\n                    }\n            }\n        }\n    }\n\n    parse(code);\n\n    glyph.advanceWidth = width;\n    return p;\n}\n\nfunction parseCFFFDSelect(data, start, nGlyphs, fdArrayCount) {\n    var fdSelect = [];\n    var fdIndex;\n    var parser = new parse.Parser(data, start);\n    var format = parser.parseCard8();\n    if (format === 0) {\n        // Simple list of nGlyphs elements\n        for (var iGid = 0; iGid < nGlyphs; iGid++) {\n            fdIndex = parser.parseCard8();\n            if (fdIndex >= fdArrayCount) {\n                throw new Error('CFF table CID Font FDSelect has bad FD index value ' + fdIndex + ' (FD count ' + fdArrayCount + ')');\n            }\n            fdSelect.push(fdIndex);\n        }\n    } else if (format === 3) {\n        // Ranges\n        var nRanges = parser.parseCard16();\n        var first = parser.parseCard16();\n        if (first !== 0) {\n            throw new Error('CFF Table CID Font FDSelect format 3 range has bad initial GID ' + first);\n        }\n        var next;\n        for (var iRange = 0; iRange < nRanges; iRange++) {\n            fdIndex = parser.parseCard8();\n            next = parser.parseCard16();\n            if (fdIndex >= fdArrayCount) {\n                throw new Error('CFF table CID Font FDSelect has bad FD index value ' + fdIndex + ' (FD count ' + fdArrayCount + ')');\n            }\n            if (next > nGlyphs) {\n                throw new Error('CFF Table CID Font FDSelect format 3 range has bad GID ' + next);\n            }\n            for (; first < next; first++) {\n                fdSelect.push(fdIndex);\n            }\n            first = next;\n        }\n        if (next !== nGlyphs) {\n            throw new Error('CFF Table CID Font FDSelect format 3 range has bad final GID ' + next);\n        }\n    } else {\n        throw new Error('CFF Table CID Font FDSelect table has unsupported format ' + format);\n    }\n    return fdSelect;\n}\n\n// Parse the `CFF` table, which contains the glyph outlines in PostScript format.\nfunction parseCFFTable(data, start, font, opt) {\n    font.tables.cff = {};\n    var header = parseCFFHeader(data, start);\n    var nameIndex = parseCFFIndex(data, header.endOffset, parse.bytesToString);\n    var topDictIndex = parseCFFIndex(data, nameIndex.endOffset);\n    var stringIndex = parseCFFIndex(data, topDictIndex.endOffset, parse.bytesToString);\n    var globalSubrIndex = parseCFFIndex(data, stringIndex.endOffset);\n    font.gsubrs = globalSubrIndex.objects;\n    font.gsubrsBias = calcCFFSubroutineBias(font.gsubrs);\n\n    var topDictArray = gatherCFFTopDicts(data, start, topDictIndex.objects, stringIndex.objects);\n    if (topDictArray.length !== 1) {\n        throw new Error('CFF table has too many fonts in \\'FontSet\\' - count of fonts NameIndex.length = ' + topDictArray.length);\n    }\n\n    var topDict = topDictArray[0];\n    font.tables.cff.topDict = topDict;\n\n    if (topDict._privateDict) {\n        font.defaultWidthX = topDict._privateDict.defaultWidthX;\n        font.nominalWidthX = topDict._privateDict.nominalWidthX;\n    }\n\n    if (topDict.ros[0] !== undefined && topDict.ros[1] !== undefined) {\n        font.isCIDFont = true;\n    }\n\n    if (font.isCIDFont) {\n        var fdArrayOffset = topDict.fdArray;\n        var fdSelectOffset = topDict.fdSelect;\n        if (fdArrayOffset === 0 || fdSelectOffset === 0) {\n            throw new Error('Font is marked as a CID font, but FDArray and/or FDSelect information is missing');\n        }\n        fdArrayOffset += start;\n        var fdArrayIndex = parseCFFIndex(data, fdArrayOffset);\n        var fdArray = gatherCFFTopDicts(data, start, fdArrayIndex.objects, stringIndex.objects);\n        topDict._fdArray = fdArray;\n        fdSelectOffset += start;\n        topDict._fdSelect = parseCFFFDSelect(data, fdSelectOffset, font.numGlyphs, fdArray.length);\n    }\n\n    var privateDictOffset = start + topDict.private[1];\n    var privateDict = parseCFFPrivateDict(data, privateDictOffset, topDict.private[0], stringIndex.objects);\n    font.defaultWidthX = privateDict.defaultWidthX;\n    font.nominalWidthX = privateDict.nominalWidthX;\n\n    if (privateDict.subrs !== 0) {\n        var subrOffset = privateDictOffset + privateDict.subrs;\n        var subrIndex = parseCFFIndex(data, subrOffset);\n        font.subrs = subrIndex.objects;\n        font.subrsBias = calcCFFSubroutineBias(font.subrs);\n    } else {\n        font.subrs = [];\n        font.subrsBias = 0;\n    }\n\n    // Offsets in the top dict are relative to the beginning of the CFF data, so add the CFF start offset.\n    var charStringsIndex;\n    if (opt.lowMemory) {\n        charStringsIndex = parseCFFIndexLowMemory(data, start + topDict.charStrings);\n        font.nGlyphs = charStringsIndex.offsets.length;\n    } else {\n        charStringsIndex = parseCFFIndex(data, start + topDict.charStrings);\n        font.nGlyphs = charStringsIndex.objects.length;\n    }\n\n    var charset = parseCFFCharset(data, start + topDict.charset, font.nGlyphs, stringIndex.objects);\n    if (topDict.encoding === 0) {\n        // Standard encoding\n        font.cffEncoding = new CffEncoding(cffStandardEncoding, charset);\n    } else if (topDict.encoding === 1) {\n        // Expert encoding\n        font.cffEncoding = new CffEncoding(cffExpertEncoding, charset);\n    } else {\n        font.cffEncoding = parseCFFEncoding(data, start + topDict.encoding, charset);\n    }\n\n    // Prefer the CMAP encoding to the CFF encoding.\n    font.encoding = font.encoding || font.cffEncoding;\n\n    font.glyphs = new glyphset.GlyphSet(font);\n    if (opt.lowMemory) {\n        font._push = function(i) {\n            var charString = getCffIndexObject(i, charStringsIndex.offsets, data, start + topDict.charStrings);\n            font.glyphs.push(i, glyphset.cffGlyphLoader(font, i, parseCFFCharstring, charString));\n        };\n    } else {\n        for (var i = 0; i < font.nGlyphs; i += 1) {\n            var charString = charStringsIndex.objects[i];\n            font.glyphs.push(i, glyphset.cffGlyphLoader(font, i, parseCFFCharstring, charString));\n        }\n    }\n}\n\n// Convert a string to a String ID (SID).\n// The list of strings is modified in place.\nfunction encodeString(s, strings) {\n    var sid;\n\n    // Is the string in the CFF standard strings?\n    var i = cffStandardStrings.indexOf(s);\n    if (i >= 0) {\n        sid = i;\n    }\n\n    // Is the string already in the string index?\n    i = strings.indexOf(s);\n    if (i >= 0) {\n        sid = i + cffStandardStrings.length;\n    } else {\n        sid = cffStandardStrings.length + strings.length;\n        strings.push(s);\n    }\n\n    return sid;\n}\n\nfunction makeHeader() {\n    return new table.Record('Header', [\n        {name: 'major', type: 'Card8', value: 1},\n        {name: 'minor', type: 'Card8', value: 0},\n        {name: 'hdrSize', type: 'Card8', value: 4},\n        {name: 'major', type: 'Card8', value: 1}\n    ]);\n}\n\nfunction makeNameIndex(fontNames) {\n    var t = new table.Record('Name INDEX', [\n        {name: 'names', type: 'INDEX', value: []}\n    ]);\n    t.names = [];\n    for (var i = 0; i < fontNames.length; i += 1) {\n        t.names.push({name: 'name_' + i, type: 'NAME', value: fontNames[i]});\n    }\n\n    return t;\n}\n\n// Given a dictionary's metadata, create a DICT structure.\nfunction makeDict(meta, attrs, strings) {\n    var m = {};\n    for (var i = 0; i < meta.length; i += 1) {\n        var entry = meta[i];\n        var value = attrs[entry.name];\n        if (value !== undefined && !equals(value, entry.value)) {\n            if (entry.type === 'SID') {\n                value = encodeString(value, strings);\n            }\n\n            m[entry.op] = {name: entry.name, type: entry.type, value: value};\n        }\n    }\n\n    return m;\n}\n\n// The Top DICT houses the global font attributes.\nfunction makeTopDict(attrs, strings) {\n    var t = new table.Record('Top DICT', [\n        {name: 'dict', type: 'DICT', value: {}}\n    ]);\n    t.dict = makeDict(TOP_DICT_META, attrs, strings);\n    return t;\n}\n\nfunction makeTopDictIndex(topDict) {\n    var t = new table.Record('Top DICT INDEX', [\n        {name: 'topDicts', type: 'INDEX', value: []}\n    ]);\n    t.topDicts = [{name: 'topDict_0', type: 'TABLE', value: topDict}];\n    return t;\n}\n\nfunction makeStringIndex(strings) {\n    var t = new table.Record('String INDEX', [\n        {name: 'strings', type: 'INDEX', value: []}\n    ]);\n    t.strings = [];\n    for (var i = 0; i < strings.length; i += 1) {\n        t.strings.push({name: 'string_' + i, type: 'STRING', value: strings[i]});\n    }\n\n    return t;\n}\n\nfunction makeGlobalSubrIndex() {\n    // Currently we don't use subroutines.\n    return new table.Record('Global Subr INDEX', [\n        {name: 'subrs', type: 'INDEX', value: []}\n    ]);\n}\n\nfunction makeCharsets(glyphNames, strings) {\n    var t = new table.Record('Charsets', [\n        {name: 'format', type: 'Card8', value: 0}\n    ]);\n    for (var i = 0; i < glyphNames.length; i += 1) {\n        var glyphName = glyphNames[i];\n        var glyphSID = encodeString(glyphName, strings);\n        t.fields.push({name: 'glyph_' + i, type: 'SID', value: glyphSID});\n    }\n\n    return t;\n}\n\nfunction glyphToOps(glyph) {\n    var ops = [];\n    var path = glyph.path;\n    ops.push({name: 'width', type: 'NUMBER', value: glyph.advanceWidth});\n    var x = 0;\n    var y = 0;\n    for (var i = 0; i < path.commands.length; i += 1) {\n        var dx = (void 0);\n        var dy = (void 0);\n        var cmd = path.commands[i];\n        if (cmd.type === 'Q') {\n            // CFF only supports bézier curves, so convert the quad to a bézier.\n            var _13 = 1 / 3;\n            var _23 = 2 / 3;\n\n            // We're going to create a new command so we don't change the original path.\n            // Since all coordinates are relative, we round() them ASAP to avoid propagating errors.\n            cmd = {\n                type: 'C',\n                x: cmd.x,\n                y: cmd.y,\n                x1: Math.round(_13 * x + _23 * cmd.x1),\n                y1: Math.round(_13 * y + _23 * cmd.y1),\n                x2: Math.round(_13 * cmd.x + _23 * cmd.x1),\n                y2: Math.round(_13 * cmd.y + _23 * cmd.y1)\n            };\n        }\n\n        if (cmd.type === 'M') {\n            dx = Math.round(cmd.x - x);\n            dy = Math.round(cmd.y - y);\n            ops.push({name: 'dx', type: 'NUMBER', value: dx});\n            ops.push({name: 'dy', type: 'NUMBER', value: dy});\n            ops.push({name: 'rmoveto', type: 'OP', value: 21});\n            x = Math.round(cmd.x);\n            y = Math.round(cmd.y);\n        } else if (cmd.type === 'L') {\n            dx = Math.round(cmd.x - x);\n            dy = Math.round(cmd.y - y);\n            ops.push({name: 'dx', type: 'NUMBER', value: dx});\n            ops.push({name: 'dy', type: 'NUMBER', value: dy});\n            ops.push({name: 'rlineto', type: 'OP', value: 5});\n            x = Math.round(cmd.x);\n            y = Math.round(cmd.y);\n        } else if (cmd.type === 'C') {\n            var dx1 = Math.round(cmd.x1 - x);\n            var dy1 = Math.round(cmd.y1 - y);\n            var dx2 = Math.round(cmd.x2 - cmd.x1);\n            var dy2 = Math.round(cmd.y2 - cmd.y1);\n            dx = Math.round(cmd.x - cmd.x2);\n            dy = Math.round(cmd.y - cmd.y2);\n            ops.push({name: 'dx1', type: 'NUMBER', value: dx1});\n            ops.push({name: 'dy1', type: 'NUMBER', value: dy1});\n            ops.push({name: 'dx2', type: 'NUMBER', value: dx2});\n            ops.push({name: 'dy2', type: 'NUMBER', value: dy2});\n            ops.push({name: 'dx', type: 'NUMBER', value: dx});\n            ops.push({name: 'dy', type: 'NUMBER', value: dy});\n            ops.push({name: 'rrcurveto', type: 'OP', value: 8});\n            x = Math.round(cmd.x);\n            y = Math.round(cmd.y);\n        }\n\n        // Contours are closed automatically.\n    }\n\n    ops.push({name: 'endchar', type: 'OP', value: 14});\n    return ops;\n}\n\nfunction makeCharStringsIndex(glyphs) {\n    var t = new table.Record('CharStrings INDEX', [\n        {name: 'charStrings', type: 'INDEX', value: []}\n    ]);\n\n    for (var i = 0; i < glyphs.length; i += 1) {\n        var glyph = glyphs.get(i);\n        var ops = glyphToOps(glyph);\n        t.charStrings.push({name: glyph.name, type: 'CHARSTRING', value: ops});\n    }\n\n    return t;\n}\n\nfunction makePrivateDict(attrs, strings) {\n    var t = new table.Record('Private DICT', [\n        {name: 'dict', type: 'DICT', value: {}}\n    ]);\n    t.dict = makeDict(PRIVATE_DICT_META, attrs, strings);\n    return t;\n}\n\nfunction makeCFFTable(glyphs, options) {\n    var t = new table.Table('CFF ', [\n        {name: 'header', type: 'RECORD'},\n        {name: 'nameIndex', type: 'RECORD'},\n        {name: 'topDictIndex', type: 'RECORD'},\n        {name: 'stringIndex', type: 'RECORD'},\n        {name: 'globalSubrIndex', type: 'RECORD'},\n        {name: 'charsets', type: 'RECORD'},\n        {name: 'charStringsIndex', type: 'RECORD'},\n        {name: 'privateDict', type: 'RECORD'}\n    ]);\n\n    var fontScale = 1 / options.unitsPerEm;\n    // We use non-zero values for the offsets so that the DICT encodes them.\n    // This is important because the size of the Top DICT plays a role in offset calculation,\n    // and the size shouldn't change after we've written correct offsets.\n    var attrs = {\n        version: options.version,\n        fullName: options.fullName,\n        familyName: options.familyName,\n        weight: options.weightName,\n        fontBBox: options.fontBBox || [0, 0, 0, 0],\n        fontMatrix: [fontScale, 0, 0, fontScale, 0, 0],\n        charset: 999,\n        encoding: 0,\n        charStrings: 999,\n        private: [0, 999]\n    };\n\n    var privateAttrs = {};\n\n    var glyphNames = [];\n    var glyph;\n\n    // Skip first glyph (.notdef)\n    for (var i = 1; i < glyphs.length; i += 1) {\n        glyph = glyphs.get(i);\n        glyphNames.push(glyph.name);\n    }\n\n    var strings = [];\n\n    t.header = makeHeader();\n    t.nameIndex = makeNameIndex([options.postScriptName]);\n    var topDict = makeTopDict(attrs, strings);\n    t.topDictIndex = makeTopDictIndex(topDict);\n    t.globalSubrIndex = makeGlobalSubrIndex();\n    t.charsets = makeCharsets(glyphNames, strings);\n    t.charStringsIndex = makeCharStringsIndex(glyphs);\n    t.privateDict = makePrivateDict(privateAttrs, strings);\n\n    // Needs to come at the end, to encode all custom strings used in the font.\n    t.stringIndex = makeStringIndex(strings);\n\n    var startOffset = t.header.sizeOf() +\n        t.nameIndex.sizeOf() +\n        t.topDictIndex.sizeOf() +\n        t.stringIndex.sizeOf() +\n        t.globalSubrIndex.sizeOf();\n    attrs.charset = startOffset;\n\n    // We use the CFF standard encoding; proper encoding will be handled in cmap.\n    attrs.encoding = 0;\n    attrs.charStrings = attrs.charset + t.charsets.sizeOf();\n    attrs.private[1] = attrs.charStrings + t.charStringsIndex.sizeOf();\n\n    // Recreate the Top DICT INDEX with the correct offsets.\n    topDict = makeTopDict(attrs, strings);\n    t.topDictIndex = makeTopDictIndex(topDict);\n\n    return t;\n}\n\nvar cff = { parse: parseCFFTable, make: makeCFFTable };\n\n// The `head` table contains global information about the font.\n\n// Parse the header `head` table\nfunction parseHeadTable(data, start) {\n    var head = {};\n    var p = new parse.Parser(data, start);\n    head.version = p.parseVersion();\n    head.fontRevision = Math.round(p.parseFixed() * 1000) / 1000;\n    head.checkSumAdjustment = p.parseULong();\n    head.magicNumber = p.parseULong();\n    check.argument(head.magicNumber === 0x5F0F3CF5, 'Font header has wrong magic number.');\n    head.flags = p.parseUShort();\n    head.unitsPerEm = p.parseUShort();\n    head.created = p.parseLongDateTime();\n    head.modified = p.parseLongDateTime();\n    head.xMin = p.parseShort();\n    head.yMin = p.parseShort();\n    head.xMax = p.parseShort();\n    head.yMax = p.parseShort();\n    head.macStyle = p.parseUShort();\n    head.lowestRecPPEM = p.parseUShort();\n    head.fontDirectionHint = p.parseShort();\n    head.indexToLocFormat = p.parseShort();\n    head.glyphDataFormat = p.parseShort();\n    return head;\n}\n\nfunction makeHeadTable(options) {\n    // Apple Mac timestamp epoch is 01/01/1904 not 01/01/1970\n    var timestamp = Math.round(new Date().getTime() / 1000) + 2082844800;\n    var createdTimestamp = timestamp;\n\n    if (options.createdTimestamp) {\n        createdTimestamp = options.createdTimestamp + 2082844800;\n    }\n\n    return new table.Table('head', [\n        {name: 'version', type: 'FIXED', value: 0x00010000},\n        {name: 'fontRevision', type: 'FIXED', value: 0x00010000},\n        {name: 'checkSumAdjustment', type: 'ULONG', value: 0},\n        {name: 'magicNumber', type: 'ULONG', value: 0x5F0F3CF5},\n        {name: 'flags', type: 'USHORT', value: 0},\n        {name: 'unitsPerEm', type: 'USHORT', value: 1000},\n        {name: 'created', type: 'LONGDATETIME', value: createdTimestamp},\n        {name: 'modified', type: 'LONGDATETIME', value: timestamp},\n        {name: 'xMin', type: 'SHORT', value: 0},\n        {name: 'yMin', type: 'SHORT', value: 0},\n        {name: 'xMax', type: 'SHORT', value: 0},\n        {name: 'yMax', type: 'SHORT', value: 0},\n        {name: 'macStyle', type: 'USHORT', value: 0},\n        {name: 'lowestRecPPEM', type: 'USHORT', value: 0},\n        {name: 'fontDirectionHint', type: 'SHORT', value: 2},\n        {name: 'indexToLocFormat', type: 'SHORT', value: 0},\n        {name: 'glyphDataFormat', type: 'SHORT', value: 0}\n    ], options);\n}\n\nvar head = { parse: parseHeadTable, make: makeHeadTable };\n\n// The `hhea` table contains information for horizontal layout.\n\n// Parse the horizontal header `hhea` table\nfunction parseHheaTable(data, start) {\n    var hhea = {};\n    var p = new parse.Parser(data, start);\n    hhea.version = p.parseVersion();\n    hhea.ascender = p.parseShort();\n    hhea.descender = p.parseShort();\n    hhea.lineGap = p.parseShort();\n    hhea.advanceWidthMax = p.parseUShort();\n    hhea.minLeftSideBearing = p.parseShort();\n    hhea.minRightSideBearing = p.parseShort();\n    hhea.xMaxExtent = p.parseShort();\n    hhea.caretSlopeRise = p.parseShort();\n    hhea.caretSlopeRun = p.parseShort();\n    hhea.caretOffset = p.parseShort();\n    p.relativeOffset += 8;\n    hhea.metricDataFormat = p.parseShort();\n    hhea.numberOfHMetrics = p.parseUShort();\n    return hhea;\n}\n\nfunction makeHheaTable(options) {\n    return new table.Table('hhea', [\n        {name: 'version', type: 'FIXED', value: 0x00010000},\n        {name: 'ascender', type: 'FWORD', value: 0},\n        {name: 'descender', type: 'FWORD', value: 0},\n        {name: 'lineGap', type: 'FWORD', value: 0},\n        {name: 'advanceWidthMax', type: 'UFWORD', value: 0},\n        {name: 'minLeftSideBearing', type: 'FWORD', value: 0},\n        {name: 'minRightSideBearing', type: 'FWORD', value: 0},\n        {name: 'xMaxExtent', type: 'FWORD', value: 0},\n        {name: 'caretSlopeRise', type: 'SHORT', value: 1},\n        {name: 'caretSlopeRun', type: 'SHORT', value: 0},\n        {name: 'caretOffset', type: 'SHORT', value: 0},\n        {name: 'reserved1', type: 'SHORT', value: 0},\n        {name: 'reserved2', type: 'SHORT', value: 0},\n        {name: 'reserved3', type: 'SHORT', value: 0},\n        {name: 'reserved4', type: 'SHORT', value: 0},\n        {name: 'metricDataFormat', type: 'SHORT', value: 0},\n        {name: 'numberOfHMetrics', type: 'USHORT', value: 0}\n    ], options);\n}\n\nvar hhea = { parse: parseHheaTable, make: makeHheaTable };\n\n// The `hmtx` table contains the horizontal metrics for all glyphs.\n\nfunction parseHmtxTableAll(data, start, numMetrics, numGlyphs, glyphs) {\n    var advanceWidth;\n    var leftSideBearing;\n    var p = new parse.Parser(data, start);\n    for (var i = 0; i < numGlyphs; i += 1) {\n        // If the font is monospaced, only one entry is needed. This last entry applies to all subsequent glyphs.\n        if (i < numMetrics) {\n            advanceWidth = p.parseUShort();\n            leftSideBearing = p.parseShort();\n        }\n\n        var glyph = glyphs.get(i);\n        glyph.advanceWidth = advanceWidth;\n        glyph.leftSideBearing = leftSideBearing;\n    }\n}\n\nfunction parseHmtxTableOnLowMemory(font, data, start, numMetrics, numGlyphs) {\n    font._hmtxTableData = {};\n\n    var advanceWidth;\n    var leftSideBearing;\n    var p = new parse.Parser(data, start);\n    for (var i = 0; i < numGlyphs; i += 1) {\n        // If the font is monospaced, only one entry is needed. This last entry applies to all subsequent glyphs.\n        if (i < numMetrics) {\n            advanceWidth = p.parseUShort();\n            leftSideBearing = p.parseShort();\n        }\n\n        font._hmtxTableData[i] = {\n            advanceWidth: advanceWidth,\n            leftSideBearing: leftSideBearing\n        };\n    }\n}\n\n// Parse the `hmtx` table, which contains the horizontal metrics for all glyphs.\n// This function augments the glyph array, adding the advanceWidth and leftSideBearing to each glyph.\nfunction parseHmtxTable(font, data, start, numMetrics, numGlyphs, glyphs, opt) {\n    if (opt.lowMemory)\n        { parseHmtxTableOnLowMemory(font, data, start, numMetrics, numGlyphs); }\n    else\n        { parseHmtxTableAll(data, start, numMetrics, numGlyphs, glyphs); }\n}\n\nfunction makeHmtxTable(glyphs) {\n    var t = new table.Table('hmtx', []);\n    for (var i = 0; i < glyphs.length; i += 1) {\n        var glyph = glyphs.get(i);\n        var advanceWidth = glyph.advanceWidth || 0;\n        var leftSideBearing = glyph.leftSideBearing || 0;\n        t.fields.push({name: 'advanceWidth_' + i, type: 'USHORT', value: advanceWidth});\n        t.fields.push({name: 'leftSideBearing_' + i, type: 'SHORT', value: leftSideBearing});\n    }\n\n    return t;\n}\n\nvar hmtx = { parse: parseHmtxTable, make: makeHmtxTable };\n\n// The `ltag` table stores IETF BCP-47 language tags. It allows supporting\n\nfunction makeLtagTable(tags) {\n    var result = new table.Table('ltag', [\n        {name: 'version', type: 'ULONG', value: 1},\n        {name: 'flags', type: 'ULONG', value: 0},\n        {name: 'numTags', type: 'ULONG', value: tags.length}\n    ]);\n\n    var stringPool = '';\n    var stringPoolOffset = 12 + tags.length * 4;\n    for (var i = 0; i < tags.length; ++i) {\n        var pos = stringPool.indexOf(tags[i]);\n        if (pos < 0) {\n            pos = stringPool.length;\n            stringPool += tags[i];\n        }\n\n        result.fields.push({name: 'offset ' + i, type: 'USHORT', value: stringPoolOffset + pos});\n        result.fields.push({name: 'length ' + i, type: 'USHORT', value: tags[i].length});\n    }\n\n    result.fields.push({name: 'stringPool', type: 'CHARARRAY', value: stringPool});\n    return result;\n}\n\nfunction parseLtagTable(data, start) {\n    var p = new parse.Parser(data, start);\n    var tableVersion = p.parseULong();\n    check.argument(tableVersion === 1, 'Unsupported ltag table version.');\n    // The 'ltag' specification does not define any flags; skip the field.\n    p.skip('uLong', 1);\n    var numTags = p.parseULong();\n\n    var tags = [];\n    for (var i = 0; i < numTags; i++) {\n        var tag = '';\n        var offset = start + p.parseUShort();\n        var length = p.parseUShort();\n        for (var j = offset; j < offset + length; ++j) {\n            tag += String.fromCharCode(data.getInt8(j));\n        }\n\n        tags.push(tag);\n    }\n\n    return tags;\n}\n\nvar ltag = { make: makeLtagTable, parse: parseLtagTable };\n\n// The `maxp` table establishes the memory requirements for the font.\n\n// Parse the maximum profile `maxp` table.\nfunction parseMaxpTable(data, start) {\n    var maxp = {};\n    var p = new parse.Parser(data, start);\n    maxp.version = p.parseVersion();\n    maxp.numGlyphs = p.parseUShort();\n    if (maxp.version === 1.0) {\n        maxp.maxPoints = p.parseUShort();\n        maxp.maxContours = p.parseUShort();\n        maxp.maxCompositePoints = p.parseUShort();\n        maxp.maxCompositeContours = p.parseUShort();\n        maxp.maxZones = p.parseUShort();\n        maxp.maxTwilightPoints = p.parseUShort();\n        maxp.maxStorage = p.parseUShort();\n        maxp.maxFunctionDefs = p.parseUShort();\n        maxp.maxInstructionDefs = p.parseUShort();\n        maxp.maxStackElements = p.parseUShort();\n        maxp.maxSizeOfInstructions = p.parseUShort();\n        maxp.maxComponentElements = p.parseUShort();\n        maxp.maxComponentDepth = p.parseUShort();\n    }\n\n    return maxp;\n}\n\nfunction makeMaxpTable(numGlyphs) {\n    return new table.Table('maxp', [\n        {name: 'version', type: 'FIXED', value: 0x00005000},\n        {name: 'numGlyphs', type: 'USHORT', value: numGlyphs}\n    ]);\n}\n\nvar maxp = { parse: parseMaxpTable, make: makeMaxpTable };\n\n// The `name` naming table.\n\n// NameIDs for the name table.\nvar nameTableNames = [\n    'copyright',              // 0\n    'fontFamily',             // 1\n    'fontSubfamily',          // 2\n    'uniqueID',               // 3\n    'fullName',               // 4\n    'version',                // 5\n    'postScriptName',         // 6\n    'trademark',              // 7\n    'manufacturer',           // 8\n    'designer',               // 9\n    'description',            // 10\n    'manufacturerURL',        // 11\n    'designerURL',            // 12\n    'license',                // 13\n    'licenseURL',             // 14\n    'reserved',               // 15\n    'preferredFamily',        // 16\n    'preferredSubfamily',     // 17\n    'compatibleFullName',     // 18\n    'sampleText',             // 19\n    'postScriptFindFontName', // 20\n    'wwsFamily',              // 21\n    'wwsSubfamily'            // 22\n];\n\nvar macLanguages = {\n    0: 'en',\n    1: 'fr',\n    2: 'de',\n    3: 'it',\n    4: 'nl',\n    5: 'sv',\n    6: 'es',\n    7: 'da',\n    8: 'pt',\n    9: 'no',\n    10: 'he',\n    11: 'ja',\n    12: 'ar',\n    13: 'fi',\n    14: 'el',\n    15: 'is',\n    16: 'mt',\n    17: 'tr',\n    18: 'hr',\n    19: 'zh-Hant',\n    20: 'ur',\n    21: 'hi',\n    22: 'th',\n    23: 'ko',\n    24: 'lt',\n    25: 'pl',\n    26: 'hu',\n    27: 'es',\n    28: 'lv',\n    29: 'se',\n    30: 'fo',\n    31: 'fa',\n    32: 'ru',\n    33: 'zh',\n    34: 'nl-BE',\n    35: 'ga',\n    36: 'sq',\n    37: 'ro',\n    38: 'cz',\n    39: 'sk',\n    40: 'si',\n    41: 'yi',\n    42: 'sr',\n    43: 'mk',\n    44: 'bg',\n    45: 'uk',\n    46: 'be',\n    47: 'uz',\n    48: 'kk',\n    49: 'az-Cyrl',\n    50: 'az-Arab',\n    51: 'hy',\n    52: 'ka',\n    53: 'mo',\n    54: 'ky',\n    55: 'tg',\n    56: 'tk',\n    57: 'mn-CN',\n    58: 'mn',\n    59: 'ps',\n    60: 'ks',\n    61: 'ku',\n    62: 'sd',\n    63: 'bo',\n    64: 'ne',\n    65: 'sa',\n    66: 'mr',\n    67: 'bn',\n    68: 'as',\n    69: 'gu',\n    70: 'pa',\n    71: 'or',\n    72: 'ml',\n    73: 'kn',\n    74: 'ta',\n    75: 'te',\n    76: 'si',\n    77: 'my',\n    78: 'km',\n    79: 'lo',\n    80: 'vi',\n    81: 'id',\n    82: 'tl',\n    83: 'ms',\n    84: 'ms-Arab',\n    85: 'am',\n    86: 'ti',\n    87: 'om',\n    88: 'so',\n    89: 'sw',\n    90: 'rw',\n    91: 'rn',\n    92: 'ny',\n    93: 'mg',\n    94: 'eo',\n    128: 'cy',\n    129: 'eu',\n    130: 'ca',\n    131: 'la',\n    132: 'qu',\n    133: 'gn',\n    134: 'ay',\n    135: 'tt',\n    136: 'ug',\n    137: 'dz',\n    138: 'jv',\n    139: 'su',\n    140: 'gl',\n    141: 'af',\n    142: 'br',\n    143: 'iu',\n    144: 'gd',\n    145: 'gv',\n    146: 'ga',\n    147: 'to',\n    148: 'el-polyton',\n    149: 'kl',\n    150: 'az',\n    151: 'nn'\n};\n\n// MacOS language ID → MacOS script ID\n//\n// Note that the script ID is not sufficient to determine what encoding\n// to use in TrueType files. For some languages, MacOS used a modification\n// of a mainstream script. For example, an Icelandic name would be stored\n// with smRoman in the TrueType naming table, but the actual encoding\n// is a special Icelandic version of the normal Macintosh Roman encoding.\n// As another example, Inuktitut uses an 8-bit encoding for Canadian Aboriginal\n// Syllables but MacOS had run out of available script codes, so this was\n// done as a (pretty radical) \"modification\" of Ethiopic.\n//\n// http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt\nvar macLanguageToScript = {\n    0: 0,  // langEnglish → smRoman\n    1: 0,  // langFrench → smRoman\n    2: 0,  // langGerman → smRoman\n    3: 0,  // langItalian → smRoman\n    4: 0,  // langDutch → smRoman\n    5: 0,  // langSwedish → smRoman\n    6: 0,  // langSpanish → smRoman\n    7: 0,  // langDanish → smRoman\n    8: 0,  // langPortuguese → smRoman\n    9: 0,  // langNorwegian → smRoman\n    10: 5,  // langHebrew → smHebrew\n    11: 1,  // langJapanese → smJapanese\n    12: 4,  // langArabic → smArabic\n    13: 0,  // langFinnish → smRoman\n    14: 6,  // langGreek → smGreek\n    15: 0,  // langIcelandic → smRoman (modified)\n    16: 0,  // langMaltese → smRoman\n    17: 0,  // langTurkish → smRoman (modified)\n    18: 0,  // langCroatian → smRoman (modified)\n    19: 2,  // langTradChinese → smTradChinese\n    20: 4,  // langUrdu → smArabic\n    21: 9,  // langHindi → smDevanagari\n    22: 21,  // langThai → smThai\n    23: 3,  // langKorean → smKorean\n    24: 29,  // langLithuanian → smCentralEuroRoman\n    25: 29,  // langPolish → smCentralEuroRoman\n    26: 29,  // langHungarian → smCentralEuroRoman\n    27: 29,  // langEstonian → smCentralEuroRoman\n    28: 29,  // langLatvian → smCentralEuroRoman\n    29: 0,  // langSami → smRoman\n    30: 0,  // langFaroese → smRoman (modified)\n    31: 4,  // langFarsi → smArabic (modified)\n    32: 7,  // langRussian → smCyrillic\n    33: 25,  // langSimpChinese → smSimpChinese\n    34: 0,  // langFlemish → smRoman\n    35: 0,  // langIrishGaelic → smRoman (modified)\n    36: 0,  // langAlbanian → smRoman\n    37: 0,  // langRomanian → smRoman (modified)\n    38: 29,  // langCzech → smCentralEuroRoman\n    39: 29,  // langSlovak → smCentralEuroRoman\n    40: 0,  // langSlovenian → smRoman (modified)\n    41: 5,  // langYiddish → smHebrew\n    42: 7,  // langSerbian → smCyrillic\n    43: 7,  // langMacedonian → smCyrillic\n    44: 7,  // langBulgarian → smCyrillic\n    45: 7,  // langUkrainian → smCyrillic (modified)\n    46: 7,  // langByelorussian → smCyrillic\n    47: 7,  // langUzbek → smCyrillic\n    48: 7,  // langKazakh → smCyrillic\n    49: 7,  // langAzerbaijani → smCyrillic\n    50: 4,  // langAzerbaijanAr → smArabic\n    51: 24,  // langArmenian → smArmenian\n    52: 23,  // langGeorgian → smGeorgian\n    53: 7,  // langMoldavian → smCyrillic\n    54: 7,  // langKirghiz → smCyrillic\n    55: 7,  // langTajiki → smCyrillic\n    56: 7,  // langTurkmen → smCyrillic\n    57: 27,  // langMongolian → smMongolian\n    58: 7,  // langMongolianCyr → smCyrillic\n    59: 4,  // langPashto → smArabic\n    60: 4,  // langKurdish → smArabic\n    61: 4,  // langKashmiri → smArabic\n    62: 4,  // langSindhi → smArabic\n    63: 26,  // langTibetan → smTibetan\n    64: 9,  // langNepali → smDevanagari\n    65: 9,  // langSanskrit → smDevanagari\n    66: 9,  // langMarathi → smDevanagari\n    67: 13,  // langBengali → smBengali\n    68: 13,  // langAssamese → smBengali\n    69: 11,  // langGujarati → smGujarati\n    70: 10,  // langPunjabi → smGurmukhi\n    71: 12,  // langOriya → smOriya\n    72: 17,  // langMalayalam → smMalayalam\n    73: 16,  // langKannada → smKannada\n    74: 14,  // langTamil → smTamil\n    75: 15,  // langTelugu → smTelugu\n    76: 18,  // langSinhalese → smSinhalese\n    77: 19,  // langBurmese → smBurmese\n    78: 20,  // langKhmer → smKhmer\n    79: 22,  // langLao → smLao\n    80: 30,  // langVietnamese → smVietnamese\n    81: 0,  // langIndonesian → smRoman\n    82: 0,  // langTagalog → smRoman\n    83: 0,  // langMalayRoman → smRoman\n    84: 4,  // langMalayArabic → smArabic\n    85: 28,  // langAmharic → smEthiopic\n    86: 28,  // langTigrinya → smEthiopic\n    87: 28,  // langOromo → smEthiopic\n    88: 0,  // langSomali → smRoman\n    89: 0,  // langSwahili → smRoman\n    90: 0,  // langKinyarwanda → smRoman\n    91: 0,  // langRundi → smRoman\n    92: 0,  // langNyanja → smRoman\n    93: 0,  // langMalagasy → smRoman\n    94: 0,  // langEsperanto → smRoman\n    128: 0,  // langWelsh → smRoman (modified)\n    129: 0,  // langBasque → smRoman\n    130: 0,  // langCatalan → smRoman\n    131: 0,  // langLatin → smRoman\n    132: 0,  // langQuechua → smRoman\n    133: 0,  // langGuarani → smRoman\n    134: 0,  // langAymara → smRoman\n    135: 7,  // langTatar → smCyrillic\n    136: 4,  // langUighur → smArabic\n    137: 26,  // langDzongkha → smTibetan\n    138: 0,  // langJavaneseRom → smRoman\n    139: 0,  // langSundaneseRom → smRoman\n    140: 0,  // langGalician → smRoman\n    141: 0,  // langAfrikaans → smRoman\n    142: 0,  // langBreton → smRoman (modified)\n    143: 28,  // langInuktitut → smEthiopic (modified)\n    144: 0,  // langScottishGaelic → smRoman (modified)\n    145: 0,  // langManxGaelic → smRoman (modified)\n    146: 0,  // langIrishGaelicScript → smRoman (modified)\n    147: 0,  // langTongan → smRoman\n    148: 6,  // langGreekAncient → smRoman\n    149: 0,  // langGreenlandic → smRoman\n    150: 0,  // langAzerbaijanRoman → smRoman\n    151: 0   // langNynorsk → smRoman\n};\n\n// While Microsoft indicates a region/country for all its language\n// IDs, we omit the region code if it's equal to the \"most likely\n// region subtag\" according to Unicode CLDR. For scripts, we omit\n// the subtag if it is equal to the Suppress-Script entry in the\n// IANA language subtag registry for IETF BCP 47.\n//\n// For example, Microsoft states that its language code 0x041A is\n// Croatian in Croatia. We transform this to the BCP 47 language code 'hr'\n// and not 'hr-HR' because Croatia is the default country for Croatian,\n// according to Unicode CLDR. As another example, Microsoft states\n// that 0x101A is Croatian (Latin) in Bosnia-Herzegovina. We transform\n// this to 'hr-BA' and not 'hr-Latn-BA' because Latin is the default script\n// for the Croatian language, according to IANA.\n//\n// http://www.unicode.org/cldr/charts/latest/supplemental/likely_subtags.html\n// http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry\nvar windowsLanguages = {\n    0x0436: 'af',\n    0x041C: 'sq',\n    0x0484: 'gsw',\n    0x045E: 'am',\n    0x1401: 'ar-DZ',\n    0x3C01: 'ar-BH',\n    0x0C01: 'ar',\n    0x0801: 'ar-IQ',\n    0x2C01: 'ar-JO',\n    0x3401: 'ar-KW',\n    0x3001: 'ar-LB',\n    0x1001: 'ar-LY',\n    0x1801: 'ary',\n    0x2001: 'ar-OM',\n    0x4001: 'ar-QA',\n    0x0401: 'ar-SA',\n    0x2801: 'ar-SY',\n    0x1C01: 'aeb',\n    0x3801: 'ar-AE',\n    0x2401: 'ar-YE',\n    0x042B: 'hy',\n    0x044D: 'as',\n    0x082C: 'az-Cyrl',\n    0x042C: 'az',\n    0x046D: 'ba',\n    0x042D: 'eu',\n    0x0423: 'be',\n    0x0845: 'bn',\n    0x0445: 'bn-IN',\n    0x201A: 'bs-Cyrl',\n    0x141A: 'bs',\n    0x047E: 'br',\n    0x0402: 'bg',\n    0x0403: 'ca',\n    0x0C04: 'zh-HK',\n    0x1404: 'zh-MO',\n    0x0804: 'zh',\n    0x1004: 'zh-SG',\n    0x0404: 'zh-TW',\n    0x0483: 'co',\n    0x041A: 'hr',\n    0x101A: 'hr-BA',\n    0x0405: 'cs',\n    0x0406: 'da',\n    0x048C: 'prs',\n    0x0465: 'dv',\n    0x0813: 'nl-BE',\n    0x0413: 'nl',\n    0x0C09: 'en-AU',\n    0x2809: 'en-BZ',\n    0x1009: 'en-CA',\n    0x2409: 'en-029',\n    0x4009: 'en-IN',\n    0x1809: 'en-IE',\n    0x2009: 'en-JM',\n    0x4409: 'en-MY',\n    0x1409: 'en-NZ',\n    0x3409: 'en-PH',\n    0x4809: 'en-SG',\n    0x1C09: 'en-ZA',\n    0x2C09: 'en-TT',\n    0x0809: 'en-GB',\n    0x0409: 'en',\n    0x3009: 'en-ZW',\n    0x0425: 'et',\n    0x0438: 'fo',\n    0x0464: 'fil',\n    0x040B: 'fi',\n    0x080C: 'fr-BE',\n    0x0C0C: 'fr-CA',\n    0x040C: 'fr',\n    0x140C: 'fr-LU',\n    0x180C: 'fr-MC',\n    0x100C: 'fr-CH',\n    0x0462: 'fy',\n    0x0456: 'gl',\n    0x0437: 'ka',\n    0x0C07: 'de-AT',\n    0x0407: 'de',\n    0x1407: 'de-LI',\n    0x1007: 'de-LU',\n    0x0807: 'de-CH',\n    0x0408: 'el',\n    0x046F: 'kl',\n    0x0447: 'gu',\n    0x0468: 'ha',\n    0x040D: 'he',\n    0x0439: 'hi',\n    0x040E: 'hu',\n    0x040F: 'is',\n    0x0470: 'ig',\n    0x0421: 'id',\n    0x045D: 'iu',\n    0x085D: 'iu-Latn',\n    0x083C: 'ga',\n    0x0434: 'xh',\n    0x0435: 'zu',\n    0x0410: 'it',\n    0x0810: 'it-CH',\n    0x0411: 'ja',\n    0x044B: 'kn',\n    0x043F: 'kk',\n    0x0453: 'km',\n    0x0486: 'quc',\n    0x0487: 'rw',\n    0x0441: 'sw',\n    0x0457: 'kok',\n    0x0412: 'ko',\n    0x0440: 'ky',\n    0x0454: 'lo',\n    0x0426: 'lv',\n    0x0427: 'lt',\n    0x082E: 'dsb',\n    0x046E: 'lb',\n    0x042F: 'mk',\n    0x083E: 'ms-BN',\n    0x043E: 'ms',\n    0x044C: 'ml',\n    0x043A: 'mt',\n    0x0481: 'mi',\n    0x047A: 'arn',\n    0x044E: 'mr',\n    0x047C: 'moh',\n    0x0450: 'mn',\n    0x0850: 'mn-CN',\n    0x0461: 'ne',\n    0x0414: 'nb',\n    0x0814: 'nn',\n    0x0482: 'oc',\n    0x0448: 'or',\n    0x0463: 'ps',\n    0x0415: 'pl',\n    0x0416: 'pt',\n    0x0816: 'pt-PT',\n    0x0446: 'pa',\n    0x046B: 'qu-BO',\n    0x086B: 'qu-EC',\n    0x0C6B: 'qu',\n    0x0418: 'ro',\n    0x0417: 'rm',\n    0x0419: 'ru',\n    0x243B: 'smn',\n    0x103B: 'smj-NO',\n    0x143B: 'smj',\n    0x0C3B: 'se-FI',\n    0x043B: 'se',\n    0x083B: 'se-SE',\n    0x203B: 'sms',\n    0x183B: 'sma-NO',\n    0x1C3B: 'sms',\n    0x044F: 'sa',\n    0x1C1A: 'sr-Cyrl-BA',\n    0x0C1A: 'sr',\n    0x181A: 'sr-Latn-BA',\n    0x081A: 'sr-Latn',\n    0x046C: 'nso',\n    0x0432: 'tn',\n    0x045B: 'si',\n    0x041B: 'sk',\n    0x0424: 'sl',\n    0x2C0A: 'es-AR',\n    0x400A: 'es-BO',\n    0x340A: 'es-CL',\n    0x240A: 'es-CO',\n    0x140A: 'es-CR',\n    0x1C0A: 'es-DO',\n    0x300A: 'es-EC',\n    0x440A: 'es-SV',\n    0x100A: 'es-GT',\n    0x480A: 'es-HN',\n    0x080A: 'es-MX',\n    0x4C0A: 'es-NI',\n    0x180A: 'es-PA',\n    0x3C0A: 'es-PY',\n    0x280A: 'es-PE',\n    0x500A: 'es-PR',\n\n    // Microsoft has defined two different language codes for\n    // “Spanish with modern sorting” and “Spanish with traditional\n    // sorting”. This makes sense for collation APIs, and it would be\n    // possible to express this in BCP 47 language tags via Unicode\n    // extensions (eg., es-u-co-trad is Spanish with traditional\n    // sorting). However, for storing names in fonts, the distinction\n    // does not make sense, so we give “es” in both cases.\n    0x0C0A: 'es',\n    0x040A: 'es',\n\n    0x540A: 'es-US',\n    0x380A: 'es-UY',\n    0x200A: 'es-VE',\n    0x081D: 'sv-FI',\n    0x041D: 'sv',\n    0x045A: 'syr',\n    0x0428: 'tg',\n    0x085F: 'tzm',\n    0x0449: 'ta',\n    0x0444: 'tt',\n    0x044A: 'te',\n    0x041E: 'th',\n    0x0451: 'bo',\n    0x041F: 'tr',\n    0x0442: 'tk',\n    0x0480: 'ug',\n    0x0422: 'uk',\n    0x042E: 'hsb',\n    0x0420: 'ur',\n    0x0843: 'uz-Cyrl',\n    0x0443: 'uz',\n    0x042A: 'vi',\n    0x0452: 'cy',\n    0x0488: 'wo',\n    0x0485: 'sah',\n    0x0478: 'ii',\n    0x046A: 'yo'\n};\n\n// Returns a IETF BCP 47 language code, for example 'zh-Hant'\n// for 'Chinese in the traditional script'.\nfunction getLanguageCode(platformID, languageID, ltag) {\n    switch (platformID) {\n        case 0:  // Unicode\n            if (languageID === 0xFFFF) {\n                return 'und';\n            } else if (ltag) {\n                return ltag[languageID];\n            }\n\n            break;\n\n        case 1:  // Macintosh\n            return macLanguages[languageID];\n\n        case 3:  // Windows\n            return windowsLanguages[languageID];\n    }\n\n    return undefined;\n}\n\nvar utf16 = 'utf-16';\n\n// MacOS script ID → encoding. This table stores the default case,\n// which can be overridden by macLanguageEncodings.\nvar macScriptEncodings = {\n    0: 'macintosh',           // smRoman\n    1: 'x-mac-japanese',      // smJapanese\n    2: 'x-mac-chinesetrad',   // smTradChinese\n    3: 'x-mac-korean',        // smKorean\n    6: 'x-mac-greek',         // smGreek\n    7: 'x-mac-cyrillic',      // smCyrillic\n    9: 'x-mac-devanagai',     // smDevanagari\n    10: 'x-mac-gurmukhi',     // smGurmukhi\n    11: 'x-mac-gujarati',     // smGujarati\n    12: 'x-mac-oriya',        // smOriya\n    13: 'x-mac-bengali',      // smBengali\n    14: 'x-mac-tamil',        // smTamil\n    15: 'x-mac-telugu',       // smTelugu\n    16: 'x-mac-kannada',      // smKannada\n    17: 'x-mac-malayalam',    // smMalayalam\n    18: 'x-mac-sinhalese',    // smSinhalese\n    19: 'x-mac-burmese',      // smBurmese\n    20: 'x-mac-khmer',        // smKhmer\n    21: 'x-mac-thai',         // smThai\n    22: 'x-mac-lao',          // smLao\n    23: 'x-mac-georgian',     // smGeorgian\n    24: 'x-mac-armenian',     // smArmenian\n    25: 'x-mac-chinesesimp',  // smSimpChinese\n    26: 'x-mac-tibetan',      // smTibetan\n    27: 'x-mac-mongolian',    // smMongolian\n    28: 'x-mac-ethiopic',     // smEthiopic\n    29: 'x-mac-ce',           // smCentralEuroRoman\n    30: 'x-mac-vietnamese',   // smVietnamese\n    31: 'x-mac-extarabic'     // smExtArabic\n};\n\n// MacOS language ID → encoding. This table stores the exceptional\n// cases, which override macScriptEncodings. For writing MacOS naming\n// tables, we need to emit a MacOS script ID. Therefore, we cannot\n// merge macScriptEncodings into macLanguageEncodings.\n//\n// http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt\nvar macLanguageEncodings = {\n    15: 'x-mac-icelandic',    // langIcelandic\n    17: 'x-mac-turkish',      // langTurkish\n    18: 'x-mac-croatian',     // langCroatian\n    24: 'x-mac-ce',           // langLithuanian\n    25: 'x-mac-ce',           // langPolish\n    26: 'x-mac-ce',           // langHungarian\n    27: 'x-mac-ce',           // langEstonian\n    28: 'x-mac-ce',           // langLatvian\n    30: 'x-mac-icelandic',    // langFaroese\n    37: 'x-mac-romanian',     // langRomanian\n    38: 'x-mac-ce',           // langCzech\n    39: 'x-mac-ce',           // langSlovak\n    40: 'x-mac-ce',           // langSlovenian\n    143: 'x-mac-inuit',       // langInuktitut\n    146: 'x-mac-gaelic'       // langIrishGaelicScript\n};\n\nfunction getEncoding(platformID, encodingID, languageID) {\n    switch (platformID) {\n        case 0:  // Unicode\n            return utf16;\n\n        case 1:  // Apple Macintosh\n            return macLanguageEncodings[languageID] || macScriptEncodings[encodingID];\n\n        case 3:  // Microsoft Windows\n            if (encodingID === 1 || encodingID === 10) {\n                return utf16;\n            }\n\n            break;\n    }\n\n    return undefined;\n}\n\n// Parse the naming `name` table.\n// FIXME: Format 1 additional fields are not supported yet.\n// ltag is the content of the `ltag' table, such as ['en', 'zh-Hans', 'de-CH-1904'].\nfunction parseNameTable(data, start, ltag) {\n    var name = {};\n    var p = new parse.Parser(data, start);\n    var format = p.parseUShort();\n    var count = p.parseUShort();\n    var stringOffset = p.offset + p.parseUShort();\n    for (var i = 0; i < count; i++) {\n        var platformID = p.parseUShort();\n        var encodingID = p.parseUShort();\n        var languageID = p.parseUShort();\n        var nameID = p.parseUShort();\n        var property = nameTableNames[nameID] || nameID;\n        var byteLength = p.parseUShort();\n        var offset = p.parseUShort();\n        var language = getLanguageCode(platformID, languageID, ltag);\n        var encoding = getEncoding(platformID, encodingID, languageID);\n        if (encoding !== undefined && language !== undefined) {\n            var text = (void 0);\n            if (encoding === utf16) {\n                text = decode.UTF16(data, stringOffset + offset, byteLength);\n            } else {\n                text = decode.MACSTRING(data, stringOffset + offset, byteLength, encoding);\n            }\n\n            if (text) {\n                var translations = name[property];\n                if (translations === undefined) {\n                    translations = name[property] = {};\n                }\n\n                translations[language] = text;\n            }\n        }\n    }\n\n    var langTagCount = 0;\n    if (format === 1) {\n        // FIXME: Also handle Microsoft's 'name' table 1.\n        langTagCount = p.parseUShort();\n    }\n\n    return name;\n}\n\n// {23: 'foo'} → {'foo': 23}\n// ['bar', 'baz'] → {'bar': 0, 'baz': 1}\nfunction reverseDict(dict) {\n    var result = {};\n    for (var key in dict) {\n        result[dict[key]] = parseInt(key);\n    }\n\n    return result;\n}\n\nfunction makeNameRecord(platformID, encodingID, languageID, nameID, length, offset) {\n    return new table.Record('NameRecord', [\n        {name: 'platformID', type: 'USHORT', value: platformID},\n        {name: 'encodingID', type: 'USHORT', value: encodingID},\n        {name: 'languageID', type: 'USHORT', value: languageID},\n        {name: 'nameID', type: 'USHORT', value: nameID},\n        {name: 'length', type: 'USHORT', value: length},\n        {name: 'offset', type: 'USHORT', value: offset}\n    ]);\n}\n\n// Finds the position of needle in haystack, or -1 if not there.\n// Like String.indexOf(), but for arrays.\nfunction findSubArray(needle, haystack) {\n    var needleLength = needle.length;\n    var limit = haystack.length - needleLength + 1;\n\n    loop:\n    for (var pos = 0; pos < limit; pos++) {\n        for (; pos < limit; pos++) {\n            for (var k = 0; k < needleLength; k++) {\n                if (haystack[pos + k] !== needle[k]) {\n                    continue loop;\n                }\n            }\n\n            return pos;\n        }\n    }\n\n    return -1;\n}\n\nfunction addStringToPool(s, pool) {\n    var offset = findSubArray(s, pool);\n    if (offset < 0) {\n        offset = pool.length;\n        var i = 0;\n        var len = s.length;\n        for (; i < len; ++i) {\n            pool.push(s[i]);\n        }\n\n    }\n\n    return offset;\n}\n\nfunction makeNameTable(names, ltag) {\n    var nameID;\n    var nameIDs = [];\n\n    var namesWithNumericKeys = {};\n    var nameTableIds = reverseDict(nameTableNames);\n    for (var key in names) {\n        var id = nameTableIds[key];\n        if (id === undefined) {\n            id = key;\n        }\n\n        nameID = parseInt(id);\n\n        if (isNaN(nameID)) {\n            throw new Error('Name table entry \"' + key + '\" does not exist, see nameTableNames for complete list.');\n        }\n\n        namesWithNumericKeys[nameID] = names[key];\n        nameIDs.push(nameID);\n    }\n\n    var macLanguageIds = reverseDict(macLanguages);\n    var windowsLanguageIds = reverseDict(windowsLanguages);\n\n    var nameRecords = [];\n    var stringPool = [];\n\n    for (var i = 0; i < nameIDs.length; i++) {\n        nameID = nameIDs[i];\n        var translations = namesWithNumericKeys[nameID];\n        for (var lang in translations) {\n            var text = translations[lang];\n\n            // For MacOS, we try to emit the name in the form that was introduced\n            // in the initial version of the TrueType spec (in the late 1980s).\n            // However, this can fail for various reasons: the requested BCP 47\n            // language code might not have an old-style Mac equivalent;\n            // we might not have a codec for the needed character encoding;\n            // or the name might contain characters that cannot be expressed\n            // in the old-style Macintosh encoding. In case of failure, we emit\n            // the name in a more modern fashion (Unicode encoding with BCP 47\n            // language tags) that is recognized by MacOS 10.5, released in 2009.\n            // If fonts were only read by operating systems, we could simply\n            // emit all names in the modern form; this would be much easier.\n            // However, there are many applications and libraries that read\n            // 'name' tables directly, and these will usually only recognize\n            // the ancient form (silently skipping the unrecognized names).\n            var macPlatform = 1;  // Macintosh\n            var macLanguage = macLanguageIds[lang];\n            var macScript = macLanguageToScript[macLanguage];\n            var macEncoding = getEncoding(macPlatform, macScript, macLanguage);\n            var macName = encode.MACSTRING(text, macEncoding);\n            if (macName === undefined) {\n                macPlatform = 0;  // Unicode\n                macLanguage = ltag.indexOf(lang);\n                if (macLanguage < 0) {\n                    macLanguage = ltag.length;\n                    ltag.push(lang);\n                }\n\n                macScript = 4;  // Unicode 2.0 and later\n                macName = encode.UTF16(text);\n            }\n\n            var macNameOffset = addStringToPool(macName, stringPool);\n            nameRecords.push(makeNameRecord(macPlatform, macScript, macLanguage,\n                                            nameID, macName.length, macNameOffset));\n\n            var winLanguage = windowsLanguageIds[lang];\n            if (winLanguage !== undefined) {\n                var winName = encode.UTF16(text);\n                var winNameOffset = addStringToPool(winName, stringPool);\n                nameRecords.push(makeNameRecord(3, 1, winLanguage,\n                                                nameID, winName.length, winNameOffset));\n            }\n        }\n    }\n\n    nameRecords.sort(function(a, b) {\n        return ((a.platformID - b.platformID) ||\n                (a.encodingID - b.encodingID) ||\n                (a.languageID - b.languageID) ||\n                (a.nameID - b.nameID));\n    });\n\n    var t = new table.Table('name', [\n        {name: 'format', type: 'USHORT', value: 0},\n        {name: 'count', type: 'USHORT', value: nameRecords.length},\n        {name: 'stringOffset', type: 'USHORT', value: 6 + nameRecords.length * 12}\n    ]);\n\n    for (var r = 0; r < nameRecords.length; r++) {\n        t.fields.push({name: 'record_' + r, type: 'RECORD', value: nameRecords[r]});\n    }\n\n    t.fields.push({name: 'strings', type: 'LITERAL', value: stringPool});\n    return t;\n}\n\nvar _name = { parse: parseNameTable, make: makeNameTable };\n\n// The `OS/2` table contains metrics required in OpenType fonts.\n\nvar unicodeRanges = [\n    {begin: 0x0000, end: 0x007F}, // Basic Latin\n    {begin: 0x0080, end: 0x00FF}, // Latin-1 Supplement\n    {begin: 0x0100, end: 0x017F}, // Latin Extended-A\n    {begin: 0x0180, end: 0x024F}, // Latin Extended-B\n    {begin: 0x0250, end: 0x02AF}, // IPA Extensions\n    {begin: 0x02B0, end: 0x02FF}, // Spacing Modifier Letters\n    {begin: 0x0300, end: 0x036F}, // Combining Diacritical Marks\n    {begin: 0x0370, end: 0x03FF}, // Greek and Coptic\n    {begin: 0x2C80, end: 0x2CFF}, // Coptic\n    {begin: 0x0400, end: 0x04FF}, // Cyrillic\n    {begin: 0x0530, end: 0x058F}, // Armenian\n    {begin: 0x0590, end: 0x05FF}, // Hebrew\n    {begin: 0xA500, end: 0xA63F}, // Vai\n    {begin: 0x0600, end: 0x06FF}, // Arabic\n    {begin: 0x07C0, end: 0x07FF}, // NKo\n    {begin: 0x0900, end: 0x097F}, // Devanagari\n    {begin: 0x0980, end: 0x09FF}, // Bengali\n    {begin: 0x0A00, end: 0x0A7F}, // Gurmukhi\n    {begin: 0x0A80, end: 0x0AFF}, // Gujarati\n    {begin: 0x0B00, end: 0x0B7F}, // Oriya\n    {begin: 0x0B80, end: 0x0BFF}, // Tamil\n    {begin: 0x0C00, end: 0x0C7F}, // Telugu\n    {begin: 0x0C80, end: 0x0CFF}, // Kannada\n    {begin: 0x0D00, end: 0x0D7F}, // Malayalam\n    {begin: 0x0E00, end: 0x0E7F}, // Thai\n    {begin: 0x0E80, end: 0x0EFF}, // Lao\n    {begin: 0x10A0, end: 0x10FF}, // Georgian\n    {begin: 0x1B00, end: 0x1B7F}, // Balinese\n    {begin: 0x1100, end: 0x11FF}, // Hangul Jamo\n    {begin: 0x1E00, end: 0x1EFF}, // Latin Extended Additional\n    {begin: 0x1F00, end: 0x1FFF}, // Greek Extended\n    {begin: 0x2000, end: 0x206F}, // General Punctuation\n    {begin: 0x2070, end: 0x209F}, // Superscripts And Subscripts\n    {begin: 0x20A0, end: 0x20CF}, // Currency Symbol\n    {begin: 0x20D0, end: 0x20FF}, // Combining Diacritical Marks For Symbols\n    {begin: 0x2100, end: 0x214F}, // Letterlike Symbols\n    {begin: 0x2150, end: 0x218F}, // Number Forms\n    {begin: 0x2190, end: 0x21FF}, // Arrows\n    {begin: 0x2200, end: 0x22FF}, // Mathematical Operators\n    {begin: 0x2300, end: 0x23FF}, // Miscellaneous Technical\n    {begin: 0x2400, end: 0x243F}, // Control Pictures\n    {begin: 0x2440, end: 0x245F}, // Optical Character Recognition\n    {begin: 0x2460, end: 0x24FF}, // Enclosed Alphanumerics\n    {begin: 0x2500, end: 0x257F}, // Box Drawing\n    {begin: 0x2580, end: 0x259F}, // Block Elements\n    {begin: 0x25A0, end: 0x25FF}, // Geometric Shapes\n    {begin: 0x2600, end: 0x26FF}, // Miscellaneous Symbols\n    {begin: 0x2700, end: 0x27BF}, // Dingbats\n    {begin: 0x3000, end: 0x303F}, // CJK Symbols And Punctuation\n    {begin: 0x3040, end: 0x309F}, // Hiragana\n    {begin: 0x30A0, end: 0x30FF}, // Katakana\n    {begin: 0x3100, end: 0x312F}, // Bopomofo\n    {begin: 0x3130, end: 0x318F}, // Hangul Compatibility Jamo\n    {begin: 0xA840, end: 0xA87F}, // Phags-pa\n    {begin: 0x3200, end: 0x32FF}, // Enclosed CJK Letters And Months\n    {begin: 0x3300, end: 0x33FF}, // CJK Compatibility\n    {begin: 0xAC00, end: 0xD7AF}, // Hangul Syllables\n    {begin: 0xD800, end: 0xDFFF}, // Non-Plane 0 *\n    {begin: 0x10900, end: 0x1091F}, // Phoenicia\n    {begin: 0x4E00, end: 0x9FFF}, // CJK Unified Ideographs\n    {begin: 0xE000, end: 0xF8FF}, // Private Use Area (plane 0)\n    {begin: 0x31C0, end: 0x31EF}, // CJK Strokes\n    {begin: 0xFB00, end: 0xFB4F}, // Alphabetic Presentation Forms\n    {begin: 0xFB50, end: 0xFDFF}, // Arabic Presentation Forms-A\n    {begin: 0xFE20, end: 0xFE2F}, // Combining Half Marks\n    {begin: 0xFE10, end: 0xFE1F}, // Vertical Forms\n    {begin: 0xFE50, end: 0xFE6F}, // Small Form Variants\n    {begin: 0xFE70, end: 0xFEFF}, // Arabic Presentation Forms-B\n    {begin: 0xFF00, end: 0xFFEF}, // Halfwidth And Fullwidth Forms\n    {begin: 0xFFF0, end: 0xFFFF}, // Specials\n    {begin: 0x0F00, end: 0x0FFF}, // Tibetan\n    {begin: 0x0700, end: 0x074F}, // Syriac\n    {begin: 0x0780, end: 0x07BF}, // Thaana\n    {begin: 0x0D80, end: 0x0DFF}, // Sinhala\n    {begin: 0x1000, end: 0x109F}, // Myanmar\n    {begin: 0x1200, end: 0x137F}, // Ethiopic\n    {begin: 0x13A0, end: 0x13FF}, // Cherokee\n    {begin: 0x1400, end: 0x167F}, // Unified Canadian Aboriginal Syllabics\n    {begin: 0x1680, end: 0x169F}, // Ogham\n    {begin: 0x16A0, end: 0x16FF}, // Runic\n    {begin: 0x1780, end: 0x17FF}, // Khmer\n    {begin: 0x1800, end: 0x18AF}, // Mongolian\n    {begin: 0x2800, end: 0x28FF}, // Braille Patterns\n    {begin: 0xA000, end: 0xA48F}, // Yi Syllables\n    {begin: 0x1700, end: 0x171F}, // Tagalog\n    {begin: 0x10300, end: 0x1032F}, // Old Italic\n    {begin: 0x10330, end: 0x1034F}, // Gothic\n    {begin: 0x10400, end: 0x1044F}, // Deseret\n    {begin: 0x1D000, end: 0x1D0FF}, // Byzantine Musical Symbols\n    {begin: 0x1D400, end: 0x1D7FF}, // Mathematical Alphanumeric Symbols\n    {begin: 0xFF000, end: 0xFFFFD}, // Private Use (plane 15)\n    {begin: 0xFE00, end: 0xFE0F}, // Variation Selectors\n    {begin: 0xE0000, end: 0xE007F}, // Tags\n    {begin: 0x1900, end: 0x194F}, // Limbu\n    {begin: 0x1950, end: 0x197F}, // Tai Le\n    {begin: 0x1980, end: 0x19DF}, // New Tai Lue\n    {begin: 0x1A00, end: 0x1A1F}, // Buginese\n    {begin: 0x2C00, end: 0x2C5F}, // Glagolitic\n    {begin: 0x2D30, end: 0x2D7F}, // Tifinagh\n    {begin: 0x4DC0, end: 0x4DFF}, // Yijing Hexagram Symbols\n    {begin: 0xA800, end: 0xA82F}, // Syloti Nagri\n    {begin: 0x10000, end: 0x1007F}, // Linear B Syllabary\n    {begin: 0x10140, end: 0x1018F}, // Ancient Greek Numbers\n    {begin: 0x10380, end: 0x1039F}, // Ugaritic\n    {begin: 0x103A0, end: 0x103DF}, // Old Persian\n    {begin: 0x10450, end: 0x1047F}, // Shavian\n    {begin: 0x10480, end: 0x104AF}, // Osmanya\n    {begin: 0x10800, end: 0x1083F}, // Cypriot Syllabary\n    {begin: 0x10A00, end: 0x10A5F}, // Kharoshthi\n    {begin: 0x1D300, end: 0x1D35F}, // Tai Xuan Jing Symbols\n    {begin: 0x12000, end: 0x123FF}, // Cuneiform\n    {begin: 0x1D360, end: 0x1D37F}, // Counting Rod Numerals\n    {begin: 0x1B80, end: 0x1BBF}, // Sundanese\n    {begin: 0x1C00, end: 0x1C4F}, // Lepcha\n    {begin: 0x1C50, end: 0x1C7F}, // Ol Chiki\n    {begin: 0xA880, end: 0xA8DF}, // Saurashtra\n    {begin: 0xA900, end: 0xA92F}, // Kayah Li\n    {begin: 0xA930, end: 0xA95F}, // Rejang\n    {begin: 0xAA00, end: 0xAA5F}, // Cham\n    {begin: 0x10190, end: 0x101CF}, // Ancient Symbols\n    {begin: 0x101D0, end: 0x101FF}, // Phaistos Disc\n    {begin: 0x102A0, end: 0x102DF}, // Carian\n    {begin: 0x1F030, end: 0x1F09F}  // Domino Tiles\n];\n\nfunction getUnicodeRange(unicode) {\n    for (var i = 0; i < unicodeRanges.length; i += 1) {\n        var range = unicodeRanges[i];\n        if (unicode >= range.begin && unicode < range.end) {\n            return i;\n        }\n    }\n\n    return -1;\n}\n\n// Parse the OS/2 and Windows metrics `OS/2` table\nfunction parseOS2Table(data, start) {\n    var os2 = {};\n    var p = new parse.Parser(data, start);\n    os2.version = p.parseUShort();\n    os2.xAvgCharWidth = p.parseShort();\n    os2.usWeightClass = p.parseUShort();\n    os2.usWidthClass = p.parseUShort();\n    os2.fsType = p.parseUShort();\n    os2.ySubscriptXSize = p.parseShort();\n    os2.ySubscriptYSize = p.parseShort();\n    os2.ySubscriptXOffset = p.parseShort();\n    os2.ySubscriptYOffset = p.parseShort();\n    os2.ySuperscriptXSize = p.parseShort();\n    os2.ySuperscriptYSize = p.parseShort();\n    os2.ySuperscriptXOffset = p.parseShort();\n    os2.ySuperscriptYOffset = p.parseShort();\n    os2.yStrikeoutSize = p.parseShort();\n    os2.yStrikeoutPosition = p.parseShort();\n    os2.sFamilyClass = p.parseShort();\n    os2.panose = [];\n    for (var i = 0; i < 10; i++) {\n        os2.panose[i] = p.parseByte();\n    }\n\n    os2.ulUnicodeRange1 = p.parseULong();\n    os2.ulUnicodeRange2 = p.parseULong();\n    os2.ulUnicodeRange3 = p.parseULong();\n    os2.ulUnicodeRange4 = p.parseULong();\n    os2.achVendID = String.fromCharCode(p.parseByte(), p.parseByte(), p.parseByte(), p.parseByte());\n    os2.fsSelection = p.parseUShort();\n    os2.usFirstCharIndex = p.parseUShort();\n    os2.usLastCharIndex = p.parseUShort();\n    os2.sTypoAscender = p.parseShort();\n    os2.sTypoDescender = p.parseShort();\n    os2.sTypoLineGap = p.parseShort();\n    os2.usWinAscent = p.parseUShort();\n    os2.usWinDescent = p.parseUShort();\n    if (os2.version >= 1) {\n        os2.ulCodePageRange1 = p.parseULong();\n        os2.ulCodePageRange2 = p.parseULong();\n    }\n\n    if (os2.version >= 2) {\n        os2.sxHeight = p.parseShort();\n        os2.sCapHeight = p.parseShort();\n        os2.usDefaultChar = p.parseUShort();\n        os2.usBreakChar = p.parseUShort();\n        os2.usMaxContent = p.parseUShort();\n    }\n\n    return os2;\n}\n\nfunction makeOS2Table(options) {\n    return new table.Table('OS/2', [\n        {name: 'version', type: 'USHORT', value: 0x0003},\n        {name: 'xAvgCharWidth', type: 'SHORT', value: 0},\n        {name: 'usWeightClass', type: 'USHORT', value: 0},\n        {name: 'usWidthClass', type: 'USHORT', value: 0},\n        {name: 'fsType', type: 'USHORT', value: 0},\n        {name: 'ySubscriptXSize', type: 'SHORT', value: 650},\n        {name: 'ySubscriptYSize', type: 'SHORT', value: 699},\n        {name: 'ySubscriptXOffset', type: 'SHORT', value: 0},\n        {name: 'ySubscriptYOffset', type: 'SHORT', value: 140},\n        {name: 'ySuperscriptXSize', type: 'SHORT', value: 650},\n        {name: 'ySuperscriptYSize', type: 'SHORT', value: 699},\n        {name: 'ySuperscriptXOffset', type: 'SHORT', value: 0},\n        {name: 'ySuperscriptYOffset', type: 'SHORT', value: 479},\n        {name: 'yStrikeoutSize', type: 'SHORT', value: 49},\n        {name: 'yStrikeoutPosition', type: 'SHORT', value: 258},\n        {name: 'sFamilyClass', type: 'SHORT', value: 0},\n        {name: 'bFamilyType', type: 'BYTE', value: 0},\n        {name: 'bSerifStyle', type: 'BYTE', value: 0},\n        {name: 'bWeight', type: 'BYTE', value: 0},\n        {name: 'bProportion', type: 'BYTE', value: 0},\n        {name: 'bContrast', type: 'BYTE', value: 0},\n        {name: 'bStrokeVariation', type: 'BYTE', value: 0},\n        {name: 'bArmStyle', type: 'BYTE', value: 0},\n        {name: 'bLetterform', type: 'BYTE', value: 0},\n        {name: 'bMidline', type: 'BYTE', value: 0},\n        {name: 'bXHeight', type: 'BYTE', value: 0},\n        {name: 'ulUnicodeRange1', type: 'ULONG', value: 0},\n        {name: 'ulUnicodeRange2', type: 'ULONG', value: 0},\n        {name: 'ulUnicodeRange3', type: 'ULONG', value: 0},\n        {name: 'ulUnicodeRange4', type: 'ULONG', value: 0},\n        {name: 'achVendID', type: 'CHARARRAY', value: 'XXXX'},\n        {name: 'fsSelection', type: 'USHORT', value: 0},\n        {name: 'usFirstCharIndex', type: 'USHORT', value: 0},\n        {name: 'usLastCharIndex', type: 'USHORT', value: 0},\n        {name: 'sTypoAscender', type: 'SHORT', value: 0},\n        {name: 'sTypoDescender', type: 'SHORT', value: 0},\n        {name: 'sTypoLineGap', type: 'SHORT', value: 0},\n        {name: 'usWinAscent', type: 'USHORT', value: 0},\n        {name: 'usWinDescent', type: 'USHORT', value: 0},\n        {name: 'ulCodePageRange1', type: 'ULONG', value: 0},\n        {name: 'ulCodePageRange2', type: 'ULONG', value: 0},\n        {name: 'sxHeight', type: 'SHORT', value: 0},\n        {name: 'sCapHeight', type: 'SHORT', value: 0},\n        {name: 'usDefaultChar', type: 'USHORT', value: 0},\n        {name: 'usBreakChar', type: 'USHORT', value: 0},\n        {name: 'usMaxContext', type: 'USHORT', value: 0}\n    ], options);\n}\n\nvar os2 = { parse: parseOS2Table, make: makeOS2Table, unicodeRanges: unicodeRanges, getUnicodeRange: getUnicodeRange };\n\n// The `post` table stores additional PostScript information, such as glyph names.\n\n// Parse the PostScript `post` table\nfunction parsePostTable(data, start) {\n    var post = {};\n    var p = new parse.Parser(data, start);\n    post.version = p.parseVersion();\n    post.italicAngle = p.parseFixed();\n    post.underlinePosition = p.parseShort();\n    post.underlineThickness = p.parseShort();\n    post.isFixedPitch = p.parseULong();\n    post.minMemType42 = p.parseULong();\n    post.maxMemType42 = p.parseULong();\n    post.minMemType1 = p.parseULong();\n    post.maxMemType1 = p.parseULong();\n    switch (post.version) {\n        case 1:\n            post.names = standardNames.slice();\n            break;\n        case 2:\n            post.numberOfGlyphs = p.parseUShort();\n            post.glyphNameIndex = new Array(post.numberOfGlyphs);\n            for (var i = 0; i < post.numberOfGlyphs; i++) {\n                post.glyphNameIndex[i] = p.parseUShort();\n            }\n\n            post.names = [];\n            for (var i$1 = 0; i$1 < post.numberOfGlyphs; i$1++) {\n                if (post.glyphNameIndex[i$1] >= standardNames.length) {\n                    var nameLength = p.parseChar();\n                    post.names.push(p.parseString(nameLength));\n                }\n            }\n\n            break;\n        case 2.5:\n            post.numberOfGlyphs = p.parseUShort();\n            post.offset = new Array(post.numberOfGlyphs);\n            for (var i$2 = 0; i$2 < post.numberOfGlyphs; i$2++) {\n                post.offset[i$2] = p.parseChar();\n            }\n\n            break;\n    }\n    return post;\n}\n\nfunction makePostTable() {\n    return new table.Table('post', [\n        {name: 'version', type: 'FIXED', value: 0x00030000},\n        {name: 'italicAngle', type: 'FIXED', value: 0},\n        {name: 'underlinePosition', type: 'FWORD', value: 0},\n        {name: 'underlineThickness', type: 'FWORD', value: 0},\n        {name: 'isFixedPitch', type: 'ULONG', value: 0},\n        {name: 'minMemType42', type: 'ULONG', value: 0},\n        {name: 'maxMemType42', type: 'ULONG', value: 0},\n        {name: 'minMemType1', type: 'ULONG', value: 0},\n        {name: 'maxMemType1', type: 'ULONG', value: 0}\n    ]);\n}\n\nvar post = { parse: parsePostTable, make: makePostTable };\n\n// The `GSUB` table contains ligatures, among other things.\n\nvar subtableParsers = new Array(9);         // subtableParsers[0] is unused\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#SS\nsubtableParsers[1] = function parseLookup1() {\n    var start = this.offset + this.relativeOffset;\n    var substFormat = this.parseUShort();\n    if (substFormat === 1) {\n        return {\n            substFormat: 1,\n            coverage: this.parsePointer(Parser.coverage),\n            deltaGlyphId: this.parseUShort()\n        };\n    } else if (substFormat === 2) {\n        return {\n            substFormat: 2,\n            coverage: this.parsePointer(Parser.coverage),\n            substitute: this.parseOffset16List()\n        };\n    }\n    check.assert(false, '0x' + start.toString(16) + ': lookup type 1 format must be 1 or 2.');\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#MS\nsubtableParsers[2] = function parseLookup2() {\n    var substFormat = this.parseUShort();\n    check.argument(substFormat === 1, 'GSUB Multiple Substitution Subtable identifier-format must be 1');\n    return {\n        substFormat: substFormat,\n        coverage: this.parsePointer(Parser.coverage),\n        sequences: this.parseListOfLists()\n    };\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#AS\nsubtableParsers[3] = function parseLookup3() {\n    var substFormat = this.parseUShort();\n    check.argument(substFormat === 1, 'GSUB Alternate Substitution Subtable identifier-format must be 1');\n    return {\n        substFormat: substFormat,\n        coverage: this.parsePointer(Parser.coverage),\n        alternateSets: this.parseListOfLists()\n    };\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#LS\nsubtableParsers[4] = function parseLookup4() {\n    var substFormat = this.parseUShort();\n    check.argument(substFormat === 1, 'GSUB ligature table identifier-format must be 1');\n    return {\n        substFormat: substFormat,\n        coverage: this.parsePointer(Parser.coverage),\n        ligatureSets: this.parseListOfLists(function() {\n            return {\n                ligGlyph: this.parseUShort(),\n                components: this.parseUShortList(this.parseUShort() - 1)\n            };\n        })\n    };\n};\n\nvar lookupRecordDesc = {\n    sequenceIndex: Parser.uShort,\n    lookupListIndex: Parser.uShort\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#CSF\nsubtableParsers[5] = function parseLookup5() {\n    var start = this.offset + this.relativeOffset;\n    var substFormat = this.parseUShort();\n\n    if (substFormat === 1) {\n        return {\n            substFormat: substFormat,\n            coverage: this.parsePointer(Parser.coverage),\n            ruleSets: this.parseListOfLists(function() {\n                var glyphCount = this.parseUShort();\n                var substCount = this.parseUShort();\n                return {\n                    input: this.parseUShortList(glyphCount - 1),\n                    lookupRecords: this.parseRecordList(substCount, lookupRecordDesc)\n                };\n            })\n        };\n    } else if (substFormat === 2) {\n        return {\n            substFormat: substFormat,\n            coverage: this.parsePointer(Parser.coverage),\n            classDef: this.parsePointer(Parser.classDef),\n            classSets: this.parseListOfLists(function() {\n                var glyphCount = this.parseUShort();\n                var substCount = this.parseUShort();\n                return {\n                    classes: this.parseUShortList(glyphCount - 1),\n                    lookupRecords: this.parseRecordList(substCount, lookupRecordDesc)\n                };\n            })\n        };\n    } else if (substFormat === 3) {\n        var glyphCount = this.parseUShort();\n        var substCount = this.parseUShort();\n        return {\n            substFormat: substFormat,\n            coverages: this.parseList(glyphCount, Parser.pointer(Parser.coverage)),\n            lookupRecords: this.parseRecordList(substCount, lookupRecordDesc)\n        };\n    }\n    check.assert(false, '0x' + start.toString(16) + ': lookup type 5 format must be 1, 2 or 3.');\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#CC\nsubtableParsers[6] = function parseLookup6() {\n    var start = this.offset + this.relativeOffset;\n    var substFormat = this.parseUShort();\n    if (substFormat === 1) {\n        return {\n            substFormat: 1,\n            coverage: this.parsePointer(Parser.coverage),\n            chainRuleSets: this.parseListOfLists(function() {\n                return {\n                    backtrack: this.parseUShortList(),\n                    input: this.parseUShortList(this.parseShort() - 1),\n                    lookahead: this.parseUShortList(),\n                    lookupRecords: this.parseRecordList(lookupRecordDesc)\n                };\n            })\n        };\n    } else if (substFormat === 2) {\n        return {\n            substFormat: 2,\n            coverage: this.parsePointer(Parser.coverage),\n            backtrackClassDef: this.parsePointer(Parser.classDef),\n            inputClassDef: this.parsePointer(Parser.classDef),\n            lookaheadClassDef: this.parsePointer(Parser.classDef),\n            chainClassSet: this.parseListOfLists(function() {\n                return {\n                    backtrack: this.parseUShortList(),\n                    input: this.parseUShortList(this.parseShort() - 1),\n                    lookahead: this.parseUShortList(),\n                    lookupRecords: this.parseRecordList(lookupRecordDesc)\n                };\n            })\n        };\n    } else if (substFormat === 3) {\n        return {\n            substFormat: 3,\n            backtrackCoverage: this.parseList(Parser.pointer(Parser.coverage)),\n            inputCoverage: this.parseList(Parser.pointer(Parser.coverage)),\n            lookaheadCoverage: this.parseList(Parser.pointer(Parser.coverage)),\n            lookupRecords: this.parseRecordList(lookupRecordDesc)\n        };\n    }\n    check.assert(false, '0x' + start.toString(16) + ': lookup type 6 format must be 1, 2 or 3.');\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#ES\nsubtableParsers[7] = function parseLookup7() {\n    // Extension Substitution subtable\n    var substFormat = this.parseUShort();\n    check.argument(substFormat === 1, 'GSUB Extension Substitution subtable identifier-format must be 1');\n    var extensionLookupType = this.parseUShort();\n    var extensionParser = new Parser(this.data, this.offset + this.parseULong());\n    return {\n        substFormat: 1,\n        lookupType: extensionLookupType,\n        extension: subtableParsers[extensionLookupType].call(extensionParser)\n    };\n};\n\n// https://www.microsoft.com/typography/OTSPEC/GSUB.htm#RCCS\nsubtableParsers[8] = function parseLookup8() {\n    var substFormat = this.parseUShort();\n    check.argument(substFormat === 1, 'GSUB Reverse Chaining Contextual Single Substitution Subtable identifier-format must be 1');\n    return {\n        substFormat: substFormat,\n        coverage: this.parsePointer(Parser.coverage),\n        backtrackCoverage: this.parseList(Parser.pointer(Parser.coverage)),\n        lookaheadCoverage: this.parseList(Parser.pointer(Parser.coverage)),\n        substitutes: this.parseUShortList()\n    };\n};\n\n// https://www.microsoft.com/typography/OTSPEC/gsub.htm\nfunction parseGsubTable(data, start) {\n    start = start || 0;\n    var p = new Parser(data, start);\n    var tableVersion = p.parseVersion(1);\n    check.argument(tableVersion === 1 || tableVersion === 1.1, 'Unsupported GSUB table version.');\n    if (tableVersion === 1) {\n        return {\n            version: tableVersion,\n            scripts: p.parseScriptList(),\n            features: p.parseFeatureList(),\n            lookups: p.parseLookupList(subtableParsers)\n        };\n    } else {\n        return {\n            version: tableVersion,\n            scripts: p.parseScriptList(),\n            features: p.parseFeatureList(),\n            lookups: p.parseLookupList(subtableParsers),\n            variations: p.parseFeatureVariationsList()\n        };\n    }\n\n}\n\n// GSUB Writing //////////////////////////////////////////////\nvar subtableMakers = new Array(9);\n\nsubtableMakers[1] = function makeLookup1(subtable) {\n    if (subtable.substFormat === 1) {\n        return new table.Table('substitutionTable', [\n            {name: 'substFormat', type: 'USHORT', value: 1},\n            {name: 'coverage', type: 'TABLE', value: new table.Coverage(subtable.coverage)},\n            {name: 'deltaGlyphID', type: 'USHORT', value: subtable.deltaGlyphId}\n        ]);\n    } else {\n        return new table.Table('substitutionTable', [\n            {name: 'substFormat', type: 'USHORT', value: 2},\n            {name: 'coverage', type: 'TABLE', value: new table.Coverage(subtable.coverage)}\n        ].concat(table.ushortList('substitute', subtable.substitute)));\n    }\n};\n\nsubtableMakers[2] = function makeLookup2(subtable) {\n    check.assert(subtable.substFormat === 1, 'Lookup type 2 substFormat must be 1.');\n    return new table.Table('substitutionTable', [\n        {name: 'substFormat', type: 'USHORT', value: 1},\n        {name: 'coverage', type: 'TABLE', value: new table.Coverage(subtable.coverage)}\n    ].concat(table.tableList('seqSet', subtable.sequences, function(sequenceSet) {\n        return new table.Table('sequenceSetTable', table.ushortList('sequence', sequenceSet));\n    })));\n};\n\nsubtableMakers[3] = function makeLookup3(subtable) {\n    check.assert(subtable.substFormat === 1, 'Lookup type 3 substFormat must be 1.');\n    return new table.Table('substitutionTable', [\n        {name: 'substFormat', type: 'USHORT', value: 1},\n        {name: 'coverage', type: 'TABLE', value: new table.Coverage(subtable.coverage)}\n    ].concat(table.tableList('altSet', subtable.alternateSets, function(alternateSet) {\n        return new table.Table('alternateSetTable', table.ushortList('alternate', alternateSet));\n    })));\n};\n\nsubtableMakers[4] = function makeLookup4(subtable) {\n    check.assert(subtable.substFormat === 1, 'Lookup type 4 substFormat must be 1.');\n    return new table.Table('substitutionTable', [\n        {name: 'substFormat', type: 'USHORT', value: 1},\n        {name: 'coverage', type: 'TABLE', value: new table.Coverage(subtable.coverage)}\n    ].concat(table.tableList('ligSet', subtable.ligatureSets, function(ligatureSet) {\n        return new table.Table('ligatureSetTable', table.tableList('ligature', ligatureSet, function(ligature) {\n            return new table.Table('ligatureTable',\n                [{name: 'ligGlyph', type: 'USHORT', value: ligature.ligGlyph}]\n                .concat(table.ushortList('component', ligature.components, ligature.components.length + 1))\n            );\n        }));\n    })));\n};\n\nsubtableMakers[6] = function makeLookup6(subtable) {\n    if (subtable.substFormat === 1) {\n        var returnTable = new table.Table('chainContextTable', [\n            {name: 'substFormat', type: 'USHORT', value: subtable.substFormat},\n            {name: 'coverage', type: 'TABLE', value: new table.Coverage(subtable.coverage)}\n        ].concat(table.tableList('chainRuleSet', subtable.chainRuleSets, function(chainRuleSet) {\n            return new table.Table('chainRuleSetTable', table.tableList('chainRule', chainRuleSet, function(chainRule) {\n                var tableData = table.ushortList('backtrackGlyph', chainRule.backtrack, chainRule.backtrack.length)\n                    .concat(table.ushortList('inputGlyph', chainRule.input, chainRule.input.length + 1))\n                    .concat(table.ushortList('lookaheadGlyph', chainRule.lookahead, chainRule.lookahead.length))\n                    .concat(table.ushortList('substitution', [], chainRule.lookupRecords.length));\n\n                chainRule.lookupRecords.forEach(function (record, i) {\n                    tableData = tableData\n                        .concat({name: 'sequenceIndex' + i, type: 'USHORT', value: record.sequenceIndex})\n                        .concat({name: 'lookupListIndex' + i, type: 'USHORT', value: record.lookupListIndex});\n                });\n                return new table.Table('chainRuleTable', tableData);\n            }));\n        })));\n        return returnTable;\n    } else if (subtable.substFormat === 2) {\n        check.assert(false, 'lookup type 6 format 2 is not yet supported.');\n    } else if (subtable.substFormat === 3) {\n        var tableData = [\n            {name: 'substFormat', type: 'USHORT', value: subtable.substFormat} ];\n\n        tableData.push({name: 'backtrackGlyphCount', type: 'USHORT', value: subtable.backtrackCoverage.length});\n        subtable.backtrackCoverage.forEach(function (coverage, i) {\n            tableData.push({name: 'backtrackCoverage' + i, type: 'TABLE', value: new table.Coverage(coverage)});\n        });\n        tableData.push({name: 'inputGlyphCount', type: 'USHORT', value: subtable.inputCoverage.length});\n        subtable.inputCoverage.forEach(function (coverage, i) {\n            tableData.push({name: 'inputCoverage' + i, type: 'TABLE', value: new table.Coverage(coverage)});\n        });\n        tableData.push({name: 'lookaheadGlyphCount', type: 'USHORT', value: subtable.lookaheadCoverage.length});\n        subtable.lookaheadCoverage.forEach(function (coverage, i) {\n            tableData.push({name: 'lookaheadCoverage' + i, type: 'TABLE', value: new table.Coverage(coverage)});\n        });\n\n        tableData.push({name: 'substitutionCount', type: 'USHORT', value: subtable.lookupRecords.length});\n        subtable.lookupRecords.forEach(function (record, i) {\n            tableData = tableData\n                .concat({name: 'sequenceIndex' + i, type: 'USHORT', value: record.sequenceIndex})\n                .concat({name: 'lookupListIndex' + i, type: 'USHORT', value: record.lookupListIndex});\n        });\n\n        var returnTable$1 = new table.Table('chainContextTable', tableData);\n\n        return returnTable$1;\n    }\n\n    check.assert(false, 'lookup type 6 format must be 1, 2 or 3.');\n};\n\nfunction makeGsubTable(gsub) {\n    return new table.Table('GSUB', [\n        {name: 'version', type: 'ULONG', value: 0x10000},\n        {name: 'scripts', type: 'TABLE', value: new table.ScriptList(gsub.scripts)},\n        {name: 'features', type: 'TABLE', value: new table.FeatureList(gsub.features)},\n        {name: 'lookups', type: 'TABLE', value: new table.LookupList(gsub.lookups, subtableMakers)}\n    ]);\n}\n\nvar gsub = { parse: parseGsubTable, make: makeGsubTable };\n\n// The `GPOS` table contains kerning pairs, among other things.\n\n// Parse the metadata `meta` table.\n// https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6meta.html\nfunction parseMetaTable(data, start) {\n    var p = new parse.Parser(data, start);\n    var tableVersion = p.parseULong();\n    check.argument(tableVersion === 1, 'Unsupported META table version.');\n    p.parseULong(); // flags - currently unused and set to 0\n    p.parseULong(); // tableOffset\n    var numDataMaps = p.parseULong();\n\n    var tags = {};\n    for (var i = 0; i < numDataMaps; i++) {\n        var tag = p.parseTag();\n        var dataOffset = p.parseULong();\n        var dataLength = p.parseULong();\n        var text = decode.UTF8(data, start + dataOffset, dataLength);\n\n        tags[tag] = text;\n    }\n    return tags;\n}\n\nfunction makeMetaTable(tags) {\n    var numTags = Object.keys(tags).length;\n    var stringPool = '';\n    var stringPoolOffset = 16 + numTags * 12;\n\n    var result = new table.Table('meta', [\n        {name: 'version', type: 'ULONG', value: 1},\n        {name: 'flags', type: 'ULONG', value: 0},\n        {name: 'offset', type: 'ULONG', value: stringPoolOffset},\n        {name: 'numTags', type: 'ULONG', value: numTags}\n    ]);\n\n    for (var tag in tags) {\n        var pos = stringPool.length;\n        stringPool += tags[tag];\n\n        result.fields.push({name: 'tag ' + tag, type: 'TAG', value: tag});\n        result.fields.push({name: 'offset ' + tag, type: 'ULONG', value: stringPoolOffset + pos});\n        result.fields.push({name: 'length ' + tag, type: 'ULONG', value: tags[tag].length});\n    }\n\n    result.fields.push({name: 'stringPool', type: 'CHARARRAY', value: stringPool});\n\n    return result;\n}\n\nvar meta = { parse: parseMetaTable, make: makeMetaTable };\n\n// The `COLR` table adds support for multi-colored glyphs\n\nfunction parseColrTable(data, start) {\n    var p = new Parser(data, start);\n    var version = p.parseUShort();\n    check.argument(version === 0x0000, 'Only COLRv0 supported.');\n    var numBaseGlyphRecords = p.parseUShort();\n    var baseGlyphRecordsOffset = p.parseOffset32();\n    var layerRecordsOffset = p.parseOffset32();\n    var numLayerRecords = p.parseUShort();\n    p.relativeOffset = baseGlyphRecordsOffset;\n    var baseGlyphRecords = p.parseRecordList(numBaseGlyphRecords, {\n        glyphID: Parser.uShort,\n        firstLayerIndex: Parser.uShort,\n        numLayers: Parser.uShort,\n    });\n    p.relativeOffset = layerRecordsOffset;\n    var layerRecords = p.parseRecordList(numLayerRecords, {\n        glyphID: Parser.uShort,\n        paletteIndex: Parser.uShort\n    });\n\n    return {\n        version: version,\n        baseGlyphRecords: baseGlyphRecords,\n        layerRecords: layerRecords,\n    };\n}\n\nfunction makeColrTable(ref) {\n    var version = ref.version; if ( version === void 0 ) version = 0x0000;\n    var baseGlyphRecords = ref.baseGlyphRecords; if ( baseGlyphRecords === void 0 ) baseGlyphRecords = [];\n    var layerRecords = ref.layerRecords; if ( layerRecords === void 0 ) layerRecords = [];\n\n    check.argument(version === 0x0000, 'Only COLRv0 supported.');\n    var baseGlyphRecordsOffset = 14;\n    var layerRecordsOffset = baseGlyphRecordsOffset + (baseGlyphRecords.length * 6);\n    return new table.Table('COLR', [\n        { name: 'version', type: 'USHORT', value: version },\n        { name: 'numBaseGlyphRecords', type: 'USHORT', value: baseGlyphRecords.length },\n        { name: 'baseGlyphRecordsOffset', type: 'ULONG', value: baseGlyphRecordsOffset },\n        { name: 'layerRecordsOffset', type: 'ULONG', value: layerRecordsOffset },\n        { name: 'numLayerRecords', type: 'USHORT', value: layerRecords.length } ].concat( baseGlyphRecords.map(function (glyph, i) { return [\n            { name: 'glyphID_' + i, type: 'USHORT', value: glyph.glyphID },\n            { name: 'firstLayerIndex_' + i, type: 'USHORT', value: glyph.firstLayerIndex },\n            { name: 'numLayers_' + i, type: 'USHORT', value: glyph.numLayers } ]; }).flat(),\n        layerRecords.map(function (layer, i) { return [\n            { name: 'LayerGlyphID_' + i, type: 'USHORT', value: layer.glyphID },\n            { name: 'paletteIndex_' + i, type: 'USHORT', value: layer.paletteIndex } ]; }).flat() ));\n}\n\nvar colr = { parse: parseColrTable, make: makeColrTable };\n\n// The `CPAL` define a contiguous list of colors (colorRecords)\n\n// Parse the header `head` table\nfunction parseCpalTable(data, start) {\n  var p = new Parser(data, start);\n  var version = p.parseShort();\n  var numPaletteEntries = p.parseShort();\n  var numPalettes = p.parseShort();\n  var numColorRecords = p.parseShort();\n  var colorRecordsArrayOffset = p.parseOffset32();\n  var colorRecordIndices = p.parseUShortList(numPalettes);\n  p.relativeOffset = colorRecordsArrayOffset;\n  var colorRecords = p.parseULongList(numColorRecords);\n  return {\n    version: version,\n    numPaletteEntries: numPaletteEntries,\n    colorRecords: colorRecords,\n    colorRecordIndices: colorRecordIndices,\n  };\n}\n\nfunction makeCpalTable(ref) {\n  var version = ref.version; if ( version === void 0 ) version = 0;\n  var numPaletteEntries = ref.numPaletteEntries; if ( numPaletteEntries === void 0 ) numPaletteEntries = 0;\n  var colorRecords = ref.colorRecords; if ( colorRecords === void 0 ) colorRecords = [];\n  var colorRecordIndices = ref.colorRecordIndices; if ( colorRecordIndices === void 0 ) colorRecordIndices = [0];\n\n  check.argument(version === 0, 'Only CPALv0 are supported.');\n  check.argument(colorRecords.length, 'No colorRecords given.');\n  check.argument(colorRecordIndices.length, 'No colorRecordIndices given.');\n  check.argument(!numPaletteEntries && colorRecordIndices.length == 1, 'Can\\'t infer numPaletteEntries on multiple colorRecordIndices');\n  return new table.Table('CPAL', [\n    { name: 'version', type: 'USHORT', value: version },\n    { name: 'numPaletteEntries', type: 'USHORT', value: numPaletteEntries || colorRecords.length },\n    { name: 'numPalettes', type: 'USHORT', value: colorRecordIndices.length },\n    { name: 'numColorRecords', type: 'USHORT', value: colorRecords.length },\n    { name: 'colorRecordsArrayOffset', type: 'ULONG', value: 12 + 2 * colorRecordIndices.length } ].concat( colorRecordIndices.map(function (palette, i) { return ({ name: 'colorRecordIndices_' + i, type: 'USHORT', value: palette }); }),\n    colorRecords.map(function (color, i) { return ({ name: 'colorRecords_' + i, type: 'ULONG', value: color }); }) ));\n}\n\nvar cpal = { parse: parseCpalTable, make: makeCpalTable };\n\n// The `sfnt` wrapper provides organization for the tables in the font.\n\nfunction log2(v) {\n    return Math.log(v) / Math.log(2) | 0;\n}\n\nfunction computeCheckSum(bytes) {\n    while (bytes.length % 4 !== 0) {\n        bytes.push(0);\n    }\n\n    var sum = 0;\n    for (var i = 0; i < bytes.length; i += 4) {\n        sum += (bytes[i] << 24) +\n            (bytes[i + 1] << 16) +\n            (bytes[i + 2] << 8) +\n            (bytes[i + 3]);\n    }\n\n    sum %= Math.pow(2, 32);\n    return sum;\n}\n\nfunction makeTableRecord(tag, checkSum, offset, length) {\n    return new table.Record('Table Record', [\n        {name: 'tag', type: 'TAG', value: tag !== undefined ? tag : ''},\n        {name: 'checkSum', type: 'ULONG', value: checkSum !== undefined ? checkSum : 0},\n        {name: 'offset', type: 'ULONG', value: offset !== undefined ? offset : 0},\n        {name: 'length', type: 'ULONG', value: length !== undefined ? length : 0}\n    ]);\n}\n\nfunction makeSfntTable(tables) {\n    var sfnt = new table.Table('sfnt', [\n        {name: 'version', type: 'TAG', value: 'OTTO'},\n        {name: 'numTables', type: 'USHORT', value: 0},\n        {name: 'searchRange', type: 'USHORT', value: 0},\n        {name: 'entrySelector', type: 'USHORT', value: 0},\n        {name: 'rangeShift', type: 'USHORT', value: 0}\n    ]);\n    sfnt.tables = tables;\n    sfnt.numTables = tables.length;\n    var highestPowerOf2 = Math.pow(2, log2(sfnt.numTables));\n    sfnt.searchRange = 16 * highestPowerOf2;\n    sfnt.entrySelector = log2(highestPowerOf2);\n    sfnt.rangeShift = sfnt.numTables * 16 - sfnt.searchRange;\n\n    var recordFields = [];\n    var tableFields = [];\n\n    var offset = sfnt.sizeOf() + (makeTableRecord().sizeOf() * sfnt.numTables);\n    while (offset % 4 !== 0) {\n        offset += 1;\n        tableFields.push({name: 'padding', type: 'BYTE', value: 0});\n    }\n\n    for (var i = 0; i < tables.length; i += 1) {\n        var t = tables[i];\n        check.argument(t.tableName.length === 4, 'Table name' + t.tableName + ' is invalid.');\n        var tableLength = t.sizeOf();\n        var tableRecord = makeTableRecord(t.tableName, computeCheckSum(t.encode()), offset, tableLength);\n        recordFields.push({name: tableRecord.tag + ' Table Record', type: 'RECORD', value: tableRecord});\n        tableFields.push({name: t.tableName + ' table', type: 'RECORD', value: t});\n        offset += tableLength;\n        check.argument(!isNaN(offset), 'Something went wrong calculating the offset.');\n        while (offset % 4 !== 0) {\n            offset += 1;\n            tableFields.push({name: 'padding', type: 'BYTE', value: 0});\n        }\n    }\n\n    // Table records need to be sorted alphabetically.\n    recordFields.sort(function(r1, r2) {\n        if (r1.value.tag > r2.value.tag) {\n            return 1;\n        } else {\n            return -1;\n        }\n    });\n\n    sfnt.fields = sfnt.fields.concat(recordFields);\n    sfnt.fields = sfnt.fields.concat(tableFields);\n    return sfnt;\n}\n\n// Get the metrics for a character. If the string has more than one character\n// this function returns metrics for the first available character.\n// You can provide optional fallback metrics if no characters are available.\nfunction metricsForChar(font, chars, notFoundMetrics) {\n    for (var i = 0; i < chars.length; i += 1) {\n        var glyphIndex = font.charToGlyphIndex(chars[i]);\n        if (glyphIndex > 0) {\n            var glyph = font.glyphs.get(glyphIndex);\n            return glyph.getMetrics();\n        }\n    }\n\n    return notFoundMetrics;\n}\n\nfunction average(vs) {\n    var sum = 0;\n    for (var i = 0; i < vs.length; i += 1) {\n        sum += vs[i];\n    }\n\n    return sum / vs.length;\n}\n\n// Convert the font object to a SFNT data structure.\n// This structure contains all the necessary tables and metadata to create a binary OTF file.\nfunction fontToSfntTable(font) {\n    var xMins = [];\n    var yMins = [];\n    var xMaxs = [];\n    var yMaxs = [];\n    var advanceWidths = [];\n    var leftSideBearings = [];\n    var rightSideBearings = [];\n    var firstCharIndex;\n    var lastCharIndex = 0;\n    var ulUnicodeRange1 = 0;\n    var ulUnicodeRange2 = 0;\n    var ulUnicodeRange3 = 0;\n    var ulUnicodeRange4 = 0;\n\n    for (var i = 0; i < font.glyphs.length; i += 1) {\n        var glyph = font.glyphs.get(i);\n        var unicode = glyph.unicode | 0;\n\n        if (isNaN(glyph.advanceWidth)) {\n            throw new Error('Glyph ' + glyph.name + ' (' + i + '): advanceWidth is not a number.');\n        }\n\n        if (firstCharIndex > unicode || firstCharIndex === undefined) {\n            // ignore .notdef char\n            if (unicode > 0) {\n                firstCharIndex = unicode;\n            }\n        }\n\n        if (lastCharIndex < unicode) {\n            lastCharIndex = unicode;\n        }\n\n        var position = os2.getUnicodeRange(unicode);\n        if (position < 32) {\n            ulUnicodeRange1 |= 1 << position;\n        } else if (position < 64) {\n            ulUnicodeRange2 |= 1 << position - 32;\n        } else if (position < 96) {\n            ulUnicodeRange3 |= 1 << position - 64;\n        } else if (position < 123) {\n            ulUnicodeRange4 |= 1 << position - 96;\n        } else {\n            throw new Error('Unicode ranges bits > 123 are reserved for internal usage');\n        }\n        // Skip non-important characters.\n        if (glyph.name === '.notdef') { continue; }\n        var metrics = glyph.getMetrics();\n        xMins.push(metrics.xMin);\n        yMins.push(metrics.yMin);\n        xMaxs.push(metrics.xMax);\n        yMaxs.push(metrics.yMax);\n        leftSideBearings.push(metrics.leftSideBearing);\n        rightSideBearings.push(metrics.rightSideBearing);\n        advanceWidths.push(glyph.advanceWidth);\n    }\n\n    var globals = {\n        xMin: Math.min.apply(null, xMins),\n        yMin: Math.min.apply(null, yMins),\n        xMax: Math.max.apply(null, xMaxs),\n        yMax: Math.max.apply(null, yMaxs),\n        advanceWidthMax: Math.max.apply(null, advanceWidths),\n        advanceWidthAvg: average(advanceWidths),\n        minLeftSideBearing: Math.min.apply(null, leftSideBearings),\n        maxLeftSideBearing: Math.max.apply(null, leftSideBearings),\n        minRightSideBearing: Math.min.apply(null, rightSideBearings)\n    };\n    globals.ascender = font.ascender;\n    globals.descender = font.descender;\n\n    var headTable = head.make({\n        flags: 3, // 00000011 (baseline for font at y=0; left sidebearing point at x=0)\n        unitsPerEm: font.unitsPerEm,\n        xMin: globals.xMin,\n        yMin: globals.yMin,\n        xMax: globals.xMax,\n        yMax: globals.yMax,\n        lowestRecPPEM: 3,\n        createdTimestamp: font.createdTimestamp\n    });\n\n    var hheaTable = hhea.make({\n        ascender: globals.ascender,\n        descender: globals.descender,\n        advanceWidthMax: globals.advanceWidthMax,\n        minLeftSideBearing: globals.minLeftSideBearing,\n        minRightSideBearing: globals.minRightSideBearing,\n        xMaxExtent: globals.maxLeftSideBearing + (globals.xMax - globals.xMin),\n        numberOfHMetrics: font.glyphs.length\n    });\n\n    var maxpTable = maxp.make(font.glyphs.length);\n\n    var os2Table = os2.make(Object.assign({\n        xAvgCharWidth: Math.round(globals.advanceWidthAvg),\n        usFirstCharIndex: firstCharIndex,\n        usLastCharIndex: lastCharIndex,\n        ulUnicodeRange1: ulUnicodeRange1,\n        ulUnicodeRange2: ulUnicodeRange2,\n        ulUnicodeRange3: ulUnicodeRange3,\n        ulUnicodeRange4: ulUnicodeRange4,\n        // See http://typophile.com/node/13081 for more info on vertical metrics.\n        // We get metrics for typical characters (such as \"x\" for xHeight).\n        // We provide some fallback characters if characters are unavailable: their\n        // ordering was chosen experimentally.\n        sTypoAscender: globals.ascender,\n        sTypoDescender: globals.descender,\n        sTypoLineGap: 0,\n        usWinAscent: globals.yMax,\n        usWinDescent: Math.abs(globals.yMin),\n        ulCodePageRange1: 1, // FIXME: hard-code Latin 1 support for now\n        sxHeight: metricsForChar(font, 'xyvw', {yMax: Math.round(globals.ascender / 2)}).yMax,\n        sCapHeight: metricsForChar(font, 'HIKLEFJMNTZBDPRAGOQSUVWXY', globals).yMax,\n        usDefaultChar: font.hasChar(' ') ? 32 : 0, // Use space as the default character, if available.\n        usBreakChar: font.hasChar(' ') ? 32 : 0, // Use space as the break character, if available.\n    }, font.tables.os2));\n\n    var hmtxTable = hmtx.make(font.glyphs);\n    var cmapTable = cmap.make(font.glyphs);\n\n    var englishFamilyName = font.getEnglishName('fontFamily');\n    var englishStyleName = font.getEnglishName('fontSubfamily');\n    var englishFullName = englishFamilyName + ' ' + englishStyleName;\n    var postScriptName = font.getEnglishName('postScriptName');\n    if (!postScriptName) {\n        postScriptName = englishFamilyName.replace(/\\s/g, '') + '-' + englishStyleName;\n    }\n\n    var names = {};\n    for (var n in font.names) {\n        names[n] = font.names[n];\n    }\n\n    if (!names.uniqueID) {\n        names.uniqueID = {en: font.getEnglishName('manufacturer') + ':' + englishFullName};\n    }\n\n    if (!names.postScriptName) {\n        names.postScriptName = {en: postScriptName};\n    }\n\n    if (!names.preferredFamily) {\n        names.preferredFamily = font.names.fontFamily;\n    }\n\n    if (!names.preferredSubfamily) {\n        names.preferredSubfamily = font.names.fontSubfamily;\n    }\n\n    var languageTags = [];\n    var nameTable = _name.make(names, languageTags);\n    var ltagTable = (languageTags.length > 0 ? ltag.make(languageTags) : undefined);\n\n    var postTable = post.make();\n    var cffTable = cff.make(font.glyphs, {\n        version: font.getEnglishName('version'),\n        fullName: englishFullName,\n        familyName: englishFamilyName,\n        weightName: englishStyleName,\n        postScriptName: postScriptName,\n        unitsPerEm: font.unitsPerEm,\n        fontBBox: [0, globals.yMin, globals.ascender, globals.advanceWidthMax]\n    });\n\n    var metaTable = (font.metas && Object.keys(font.metas).length > 0) ? meta.make(font.metas) : undefined;\n\n    // The order does not matter because makeSfntTable() will sort them.\n    var tables = [headTable, hheaTable, maxpTable, os2Table, nameTable, cmapTable, postTable, cffTable, hmtxTable];\n    if (ltagTable) {\n        tables.push(ltagTable);\n    }\n    // Optional tables\n    if (font.tables.gsub) {\n        tables.push(gsub.make(font.tables.gsub));\n    }\n    if (font.tables.cpal) {\n        tables.push(cpal.make(font.tables.cpal));\n    }\n    if (font.tables.colr) {\n        tables.push(colr.make(font.tables.colr));\n    }\n    if (metaTable) {\n        tables.push(metaTable);\n    }\n\n    var sfntTable = makeSfntTable(tables);\n\n    // Compute the font's checkSum and store it in head.checkSumAdjustment.\n    var bytes = sfntTable.encode();\n    var checkSum = computeCheckSum(bytes);\n    var tableFields = sfntTable.fields;\n    var checkSumAdjusted = false;\n    for (var i$1 = 0; i$1 < tableFields.length; i$1 += 1) {\n        if (tableFields[i$1].name === 'head table') {\n            tableFields[i$1].value.checkSumAdjustment = 0xB1B0AFBA - checkSum;\n            checkSumAdjusted = true;\n            break;\n        }\n    }\n\n    if (!checkSumAdjusted) {\n        throw new Error('Could not find head table with checkSum to adjust.');\n    }\n\n    return sfntTable;\n}\n\nvar sfnt = { make: makeSfntTable, fontToTable: fontToSfntTable, computeCheckSum: computeCheckSum };\n\n// The Layout object is the prototype of Substitution objects, and provides\n\nfunction searchTag(arr, tag) {\n    /* jshint bitwise: false */\n    var imin = 0;\n    var imax = arr.length - 1;\n    while (imin <= imax) {\n        var imid = (imin + imax) >>> 1;\n        var val = arr[imid].tag;\n        if (val === tag) {\n            return imid;\n        } else if (val < tag) {\n            imin = imid + 1;\n        } else { imax = imid - 1; }\n    }\n    // Not found: return -1-insertion point\n    return -imin - 1;\n}\n\nfunction binSearch(arr, value) {\n    /* jshint bitwise: false */\n    var imin = 0;\n    var imax = arr.length - 1;\n    while (imin <= imax) {\n        var imid = (imin + imax) >>> 1;\n        var val = arr[imid];\n        if (val === value) {\n            return imid;\n        } else if (val < value) {\n            imin = imid + 1;\n        } else { imax = imid - 1; }\n    }\n    // Not found: return -1-insertion point\n    return -imin - 1;\n}\n\n// binary search in a list of ranges (coverage, class definition)\nfunction searchRange(ranges, value) {\n    // jshint bitwise: false\n    var range;\n    var imin = 0;\n    var imax = ranges.length - 1;\n    while (imin <= imax) {\n        var imid = (imin + imax) >>> 1;\n        range = ranges[imid];\n        var start = range.start;\n        if (start === value) {\n            return range;\n        } else if (start < value) {\n            imin = imid + 1;\n        } else { imax = imid - 1; }\n    }\n    if (imin > 0) {\n        range = ranges[imin - 1];\n        if (value > range.end) { return 0; }\n        return range;\n    }\n}\n\n/**\n * @exports opentype.Layout\n * @class\n */\nfunction Layout(font, tableName) {\n    this.font = font;\n    this.tableName = tableName;\n}\n\nLayout.prototype = {\n\n    /**\n     * Binary search an object by \"tag\" property\n     * @instance\n     * @function searchTag\n     * @memberof opentype.Layout\n     * @param  {Array} arr\n     * @param  {string} tag\n     * @return {number}\n     */\n    searchTag: searchTag,\n\n    /**\n     * Binary search in a list of numbers\n     * @instance\n     * @function binSearch\n     * @memberof opentype.Layout\n     * @param  {Array} arr\n     * @param  {number} value\n     * @return {number}\n     */\n    binSearch: binSearch,\n\n    /**\n     * Get or create the Layout table (GSUB, GPOS etc).\n     * @param  {boolean} create - Whether to create a new one.\n     * @return {Object} The GSUB or GPOS table.\n     */\n    getTable: function(create) {\n        var layout = this.font.tables[this.tableName];\n        if (!layout && create) {\n            layout = this.font.tables[this.tableName] = this.createDefaultTable();\n        }\n        return layout;\n    },\n\n    /**\n     * Returns all scripts in the substitution table.\n     * @instance\n     * @return {Array}\n     */\n    getScriptNames: function() {\n        var layout = this.getTable();\n        if (!layout) { return []; }\n        return layout.scripts.map(function(script) {\n            return script.tag;\n        });\n    },\n\n    /**\n     * Returns the best bet for a script name.\n     * Returns 'DFLT' if it exists.\n     * If not, returns 'latn' if it exists.\n     * If neither exist, returns undefined.\n     */\n    getDefaultScriptName: function() {\n        var layout = this.getTable();\n        if (!layout) { return; }\n        var hasLatn = false;\n        for (var i = 0; i < layout.scripts.length; i++) {\n            var name = layout.scripts[i].tag;\n            if (name === 'DFLT') { return name; }\n            if (name === 'latn') { hasLatn = true; }\n        }\n        if (hasLatn) { return 'latn'; }\n    },\n\n    /**\n     * Returns all LangSysRecords in the given script.\n     * @instance\n     * @param {string} [script='DFLT']\n     * @param {boolean} create - forces the creation of this script table if it doesn't exist.\n     * @return {Object} An object with tag and script properties.\n     */\n    getScriptTable: function(script, create) {\n        var layout = this.getTable(create);\n        if (layout) {\n            script = script || 'DFLT';\n            var scripts = layout.scripts;\n            var pos = searchTag(layout.scripts, script);\n            if (pos >= 0) {\n                return scripts[pos].script;\n            } else if (create) {\n                var scr = {\n                    tag: script,\n                    script: {\n                        defaultLangSys: {reserved: 0, reqFeatureIndex: 0xffff, featureIndexes: []},\n                        langSysRecords: []\n                    }\n                };\n                scripts.splice(-1 - pos, 0, scr);\n                return scr.script;\n            }\n        }\n    },\n\n    /**\n     * Returns a language system table\n     * @instance\n     * @param {string} [script='DFLT']\n     * @param {string} [language='dlft']\n     * @param {boolean} create - forces the creation of this langSysTable if it doesn't exist.\n     * @return {Object}\n     */\n    getLangSysTable: function(script, language, create) {\n        var scriptTable = this.getScriptTable(script, create);\n        if (scriptTable) {\n            if (!language || language === 'dflt' || language === 'DFLT') {\n                return scriptTable.defaultLangSys;\n            }\n            var pos = searchTag(scriptTable.langSysRecords, language);\n            if (pos >= 0) {\n                return scriptTable.langSysRecords[pos].langSys;\n            } else if (create) {\n                var langSysRecord = {\n                    tag: language,\n                    langSys: {reserved: 0, reqFeatureIndex: 0xffff, featureIndexes: []}\n                };\n                scriptTable.langSysRecords.splice(-1 - pos, 0, langSysRecord);\n                return langSysRecord.langSys;\n            }\n        }\n    },\n\n    /**\n     * Get a specific feature table.\n     * @instance\n     * @param {string} [script='DFLT']\n     * @param {string} [language='dlft']\n     * @param {string} feature - One of the codes listed at https://www.microsoft.com/typography/OTSPEC/featurelist.htm\n     * @param {boolean} create - forces the creation of the feature table if it doesn't exist.\n     * @return {Object}\n     */\n    getFeatureTable: function(script, language, feature, create) {\n        var langSysTable = this.getLangSysTable(script, language, create);\n        if (langSysTable) {\n            var featureRecord;\n            var featIndexes = langSysTable.featureIndexes;\n            var allFeatures = this.font.tables[this.tableName].features;\n            // The FeatureIndex array of indices is in arbitrary order,\n            // even if allFeatures is sorted alphabetically by feature tag.\n            for (var i = 0; i < featIndexes.length; i++) {\n                featureRecord = allFeatures[featIndexes[i]];\n                if (featureRecord.tag === feature) {\n                    return featureRecord.feature;\n                }\n            }\n            if (create) {\n                var index = allFeatures.length;\n                // Automatic ordering of features would require to shift feature indexes in the script list.\n                check.assert(index === 0 || feature >= allFeatures[index - 1].tag, 'Features must be added in alphabetical order.');\n                featureRecord = {\n                    tag: feature,\n                    feature: { params: 0, lookupListIndexes: [] }\n                };\n                allFeatures.push(featureRecord);\n                featIndexes.push(index);\n                return featureRecord.feature;\n            }\n        }\n    },\n\n    /**\n     * Get the lookup tables of a given type for a script/language/feature.\n     * @instance\n     * @param {string} [script='DFLT']\n     * @param {string} [language='dlft']\n     * @param {string} feature - 4-letter feature code\n     * @param {number} lookupType - 1 to 9\n     * @param {boolean} create - forces the creation of the lookup table if it doesn't exist, with no subtables.\n     * @return {Object[]}\n     */\n    getLookupTables: function(script, language, feature, lookupType, create) {\n        var featureTable = this.getFeatureTable(script, language, feature, create);\n        var tables = [];\n        if (featureTable) {\n            var lookupTable;\n            var lookupListIndexes = featureTable.lookupListIndexes;\n            var allLookups = this.font.tables[this.tableName].lookups;\n            // lookupListIndexes are in no particular order, so use naive search.\n            for (var i = 0; i < lookupListIndexes.length; i++) {\n                lookupTable = allLookups[lookupListIndexes[i]];\n                if (lookupTable.lookupType === lookupType) {\n                    tables.push(lookupTable);\n                }\n            }\n            if (tables.length === 0 && create) {\n                lookupTable = {\n                    lookupType: lookupType,\n                    lookupFlag: 0,\n                    subtables: [],\n                    markFilteringSet: undefined\n                };\n                var index = allLookups.length;\n                allLookups.push(lookupTable);\n                lookupListIndexes.push(index);\n                return [lookupTable];\n            }\n        }\n        return tables;\n    },\n\n    /**\n     * Find a glyph in a class definition table\n     * https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#class-definition-table\n     * @param {object} classDefTable - an OpenType Layout class definition table\n     * @param {number} glyphIndex - the index of the glyph to find\n     * @returns {number} -1 if not found\n     */\n    getGlyphClass: function(classDefTable, glyphIndex) {\n        switch (classDefTable.format) {\n            case 1:\n                if (classDefTable.startGlyph <= glyphIndex && glyphIndex < classDefTable.startGlyph + classDefTable.classes.length) {\n                    return classDefTable.classes[glyphIndex - classDefTable.startGlyph];\n                }\n                return 0;\n            case 2:\n                var range = searchRange(classDefTable.ranges, glyphIndex);\n                return range ? range.classId : 0;\n        }\n    },\n\n    /**\n     * Find a glyph in a coverage table\n     * https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#coverage-table\n     * @param {object} coverageTable - an OpenType Layout coverage table\n     * @param {number} glyphIndex - the index of the glyph to find\n     * @returns {number} -1 if not found\n     */\n    getCoverageIndex: function(coverageTable, glyphIndex) {\n        switch (coverageTable.format) {\n            case 1:\n                var index = binSearch(coverageTable.glyphs, glyphIndex);\n                return index >= 0 ? index : -1;\n            case 2:\n                var range = searchRange(coverageTable.ranges, glyphIndex);\n                return range ? range.index + glyphIndex - range.start : -1;\n        }\n    },\n\n    /**\n     * Returns the list of glyph indexes of a coverage table.\n     * Format 1: the list is stored raw\n     * Format 2: compact list as range records.\n     * @instance\n     * @param  {Object} coverageTable\n     * @return {Array}\n     */\n    expandCoverage: function(coverageTable) {\n        if (coverageTable.format === 1) {\n            return coverageTable.glyphs;\n        } else {\n            var glyphs = [];\n            var ranges = coverageTable.ranges;\n            for (var i = 0; i < ranges.length; i++) {\n                var range = ranges[i];\n                var start = range.start;\n                var end = range.end;\n                for (var j = start; j <= end; j++) {\n                    glyphs.push(j);\n                }\n            }\n            return glyphs;\n        }\n    }\n\n};\n\n// The Position object provides utility methods to manipulate\n\n/**\n * @exports opentype.Position\n * @class\n * @extends opentype.Layout\n * @param {opentype.Font}\n * @constructor\n */\nfunction Position(font) {\n    Layout.call(this, font, 'gpos');\n}\n\nPosition.prototype = Layout.prototype;\n\n/**\n * Init some data for faster and easier access later.\n */\nPosition.prototype.init = function() {\n    var script = this.getDefaultScriptName();\n    this.defaultKerningTables = this.getKerningTables(script);\n};\n\n/**\n * Find a glyph pair in a list of lookup tables of type 2 and retrieve the xAdvance kerning value.\n *\n * @param {integer} leftIndex - left glyph index\n * @param {integer} rightIndex - right glyph index\n * @returns {integer}\n */\nPosition.prototype.getKerningValue = function(kerningLookups, leftIndex, rightIndex) {\n    for (var i = 0; i < kerningLookups.length; i++) {\n        var subtables = kerningLookups[i].subtables;\n        for (var j = 0; j < subtables.length; j++) {\n            var subtable = subtables[j];\n            var covIndex = this.getCoverageIndex(subtable.coverage, leftIndex);\n            if (covIndex < 0) { continue; }\n            switch (subtable.posFormat) {\n                case 1:\n                    // Search Pair Adjustment Positioning Format 1\n                    var pairSet = subtable.pairSets[covIndex];\n                    for (var k = 0; k < pairSet.length; k++) {\n                        var pair = pairSet[k];\n                        if (pair.secondGlyph === rightIndex) {\n                            return pair.value1 && pair.value1.xAdvance || 0;\n                        }\n                    }\n                    break;      // left glyph found, not right glyph - try next subtable\n                case 2:\n                    // Search Pair Adjustment Positioning Format 2\n                    var class1 = this.getGlyphClass(subtable.classDef1, leftIndex);\n                    var class2 = this.getGlyphClass(subtable.classDef2, rightIndex);\n                    var pair$1 = subtable.classRecords[class1][class2];\n                    return pair$1.value1 && pair$1.value1.xAdvance || 0;\n            }\n        }\n    }\n    return 0;\n};\n\n/**\n * List all kerning lookup tables.\n *\n * @param {string} [script='DFLT'] - use font.position.getDefaultScriptName() for a better default value\n * @param {string} [language='dflt']\n * @return {object[]} The list of kerning lookup tables (may be empty), or undefined if there is no GPOS table (and we should use the kern table)\n */\nPosition.prototype.getKerningTables = function(script, language) {\n    if (this.font.tables.gpos) {\n        return this.getLookupTables(script, language, 'kern', 2);\n    }\n};\n\n// The Substitution object provides utility methods to manipulate\n\n/**\n * @exports opentype.Substitution\n * @class\n * @extends opentype.Layout\n * @param {opentype.Font}\n * @constructor\n */\nfunction Substitution(font) {\n    Layout.call(this, font, 'gsub');\n}\n\n// Check if 2 arrays of primitives are equal.\nfunction arraysEqual(ar1, ar2) {\n    var n = ar1.length;\n    if (n !== ar2.length) { return false; }\n    for (var i = 0; i < n; i++) {\n        if (ar1[i] !== ar2[i]) { return false; }\n    }\n    return true;\n}\n\n// Find the first subtable of a lookup table in a particular format.\nfunction getSubstFormat(lookupTable, format, defaultSubtable) {\n    var subtables = lookupTable.subtables;\n    for (var i = 0; i < subtables.length; i++) {\n        var subtable = subtables[i];\n        if (subtable.substFormat === format) {\n            return subtable;\n        }\n    }\n    if (defaultSubtable) {\n        subtables.push(defaultSubtable);\n        return defaultSubtable;\n    }\n    return undefined;\n}\n\nSubstitution.prototype = Layout.prototype;\n\n/**\n * Create a default GSUB table.\n * @return {Object} gsub - The GSUB table.\n */\nSubstitution.prototype.createDefaultTable = function() {\n    // Generate a default empty GSUB table with just a DFLT script and dflt lang sys.\n    return {\n        version: 1,\n        scripts: [{\n            tag: 'DFLT',\n            script: {\n                defaultLangSys: { reserved: 0, reqFeatureIndex: 0xffff, featureIndexes: [] },\n                langSysRecords: []\n            }\n        }],\n        features: [],\n        lookups: []\n    };\n};\n\n/**\n * List all single substitutions (lookup type 1) for a given script, language, and feature.\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n * @param {string} feature - 4-character feature name ('aalt', 'salt', 'ss01'...)\n * @return {Array} substitutions - The list of substitutions.\n */\nSubstitution.prototype.getSingle = function(feature, script, language) {\n    var substitutions = [];\n    var lookupTables = this.getLookupTables(script, language, feature, 1);\n    for (var idx = 0; idx < lookupTables.length; idx++) {\n        var subtables = lookupTables[idx].subtables;\n        for (var i = 0; i < subtables.length; i++) {\n            var subtable = subtables[i];\n            var glyphs = this.expandCoverage(subtable.coverage);\n            var j = (void 0);\n            if (subtable.substFormat === 1) {\n                var delta = subtable.deltaGlyphId;\n                for (j = 0; j < glyphs.length; j++) {\n                    var glyph = glyphs[j];\n                    substitutions.push({ sub: glyph, by: glyph + delta });\n                }\n            } else {\n                var substitute = subtable.substitute;\n                for (j = 0; j < glyphs.length; j++) {\n                    substitutions.push({ sub: glyphs[j], by: substitute[j] });\n                }\n            }\n        }\n    }\n    return substitutions;\n};\n\n/**\n * List all multiple substitutions (lookup type 2) for a given script, language, and feature.\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n * @param {string} feature - 4-character feature name ('ccmp', 'stch')\n * @return {Array} substitutions - The list of substitutions.\n */\nSubstitution.prototype.getMultiple = function(feature, script, language) {\n    var substitutions = [];\n    var lookupTables = this.getLookupTables(script, language, feature, 2);\n    for (var idx = 0; idx < lookupTables.length; idx++) {\n        var subtables = lookupTables[idx].subtables;\n        for (var i = 0; i < subtables.length; i++) {\n            var subtable = subtables[i];\n            var glyphs = this.expandCoverage(subtable.coverage);\n            var j = (void 0);\n\n            for (j = 0; j < glyphs.length; j++) {\n                var glyph = glyphs[j];\n                var replacements = subtable.sequences[j];\n                substitutions.push({ sub: glyph, by: replacements });\n            }\n        }\n    }\n    return substitutions;\n};\n\n/**\n * List all alternates (lookup type 3) for a given script, language, and feature.\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n * @param {string} feature - 4-character feature name ('aalt', 'salt'...)\n * @return {Array} alternates - The list of alternates\n */\nSubstitution.prototype.getAlternates = function(feature, script, language) {\n    var alternates = [];\n    var lookupTables = this.getLookupTables(script, language, feature, 3);\n    for (var idx = 0; idx < lookupTables.length; idx++) {\n        var subtables = lookupTables[idx].subtables;\n        for (var i = 0; i < subtables.length; i++) {\n            var subtable = subtables[i];\n            var glyphs = this.expandCoverage(subtable.coverage);\n            var alternateSets = subtable.alternateSets;\n            for (var j = 0; j < glyphs.length; j++) {\n                alternates.push({ sub: glyphs[j], by: alternateSets[j] });\n            }\n        }\n    }\n    return alternates;\n};\n\n/**\n * List all ligatures (lookup type 4) for a given script, language, and feature.\n * The result is an array of ligature objects like { sub: [ids], by: id }\n * @param {string} feature - 4-letter feature name ('liga', 'rlig', 'dlig'...)\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n * @return {Array} ligatures - The list of ligatures.\n */\nSubstitution.prototype.getLigatures = function(feature, script, language) {\n    var ligatures = [];\n    var lookupTables = this.getLookupTables(script, language, feature, 4);\n    for (var idx = 0; idx < lookupTables.length; idx++) {\n        var subtables = lookupTables[idx].subtables;\n        for (var i = 0; i < subtables.length; i++) {\n            var subtable = subtables[i];\n            var glyphs = this.expandCoverage(subtable.coverage);\n            var ligatureSets = subtable.ligatureSets;\n            for (var j = 0; j < glyphs.length; j++) {\n                var startGlyph = glyphs[j];\n                var ligSet = ligatureSets[j];\n                for (var k = 0; k < ligSet.length; k++) {\n                    var lig = ligSet[k];\n                    ligatures.push({\n                        sub: [startGlyph].concat(lig.components),\n                        by: lig.ligGlyph\n                    });\n                }\n            }\n        }\n    }\n    return ligatures;\n};\n\n/**\n * Add or modify a single substitution (lookup type 1)\n * Format 2, more flexible, is always used.\n * @param {string} feature - 4-letter feature name ('liga', 'rlig', 'dlig'...)\n * @param {Object} substitution - { sub: id, by: id } (format 1 is not supported)\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n */\nSubstitution.prototype.addSingle = function(feature, substitution, script, language) {\n    var lookupTable = this.getLookupTables(script, language, feature, 1, true)[0];\n    var subtable = getSubstFormat(lookupTable, 2, {                // lookup type 1 subtable, format 2, coverage format 1\n        substFormat: 2,\n        coverage: {format: 1, glyphs: []},\n        substitute: []\n    });\n    check.assert(subtable.coverage.format === 1, 'Single: unable to modify coverage table format ' + subtable.coverage.format);\n    var coverageGlyph = substitution.sub;\n    var pos = this.binSearch(subtable.coverage.glyphs, coverageGlyph);\n    if (pos < 0) {\n        pos = -1 - pos;\n        subtable.coverage.glyphs.splice(pos, 0, coverageGlyph);\n        subtable.substitute.splice(pos, 0, 0);\n    }\n    subtable.substitute[pos] = substitution.by;\n};\n\n/**\n * Add or modify a multiple substitution (lookup type 2)\n * @param {string} feature - 4-letter feature name ('ccmp', 'stch')\n * @param {Object} substitution - { sub: id, by: [id] } for format 2.\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n */\nSubstitution.prototype.addMultiple = function(feature, substitution, script, language) {\n    check.assert(substitution.by instanceof Array && substitution.by.length > 1, 'Multiple: \"by\" must be an array of two or more ids');\n    var lookupTable = this.getLookupTables(script, language, feature, 2, true)[0];\n    var subtable = getSubstFormat(lookupTable, 1, {                // lookup type 2 subtable, format 1, coverage format 1\n        substFormat: 1,\n        coverage: {format: 1, glyphs: []},\n        sequences: []\n    });\n    check.assert(subtable.coverage.format === 1, 'Multiple: unable to modify coverage table format ' + subtable.coverage.format);\n    var coverageGlyph = substitution.sub;\n    var pos = this.binSearch(subtable.coverage.glyphs, coverageGlyph);\n    if (pos < 0) {\n        pos = -1 - pos;\n        subtable.coverage.glyphs.splice(pos, 0, coverageGlyph);\n        subtable.sequences.splice(pos, 0, 0);\n    }\n    subtable.sequences[pos] = substitution.by;\n};\n\n/**\n * Add or modify an alternate substitution (lookup type 3)\n * @param {string} feature - 4-letter feature name ('liga', 'rlig', 'dlig'...)\n * @param {Object} substitution - { sub: id, by: [ids] }\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n */\nSubstitution.prototype.addAlternate = function(feature, substitution, script, language) {\n    var lookupTable = this.getLookupTables(script, language, feature, 3, true)[0];\n    var subtable = getSubstFormat(lookupTable, 1, {                // lookup type 3 subtable, format 1, coverage format 1\n        substFormat: 1,\n        coverage: {format: 1, glyphs: []},\n        alternateSets: []\n    });\n    check.assert(subtable.coverage.format === 1, 'Alternate: unable to modify coverage table format ' + subtable.coverage.format);\n    var coverageGlyph = substitution.sub;\n    var pos = this.binSearch(subtable.coverage.glyphs, coverageGlyph);\n    if (pos < 0) {\n        pos = -1 - pos;\n        subtable.coverage.glyphs.splice(pos, 0, coverageGlyph);\n        subtable.alternateSets.splice(pos, 0, 0);\n    }\n    subtable.alternateSets[pos] = substitution.by;\n};\n\n/**\n * Add a ligature (lookup type 4)\n * Ligatures with more components must be stored ahead of those with fewer components in order to be found\n * @param {string} feature - 4-letter feature name ('liga', 'rlig', 'dlig'...)\n * @param {Object} ligature - { sub: [ids], by: id }\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n */\nSubstitution.prototype.addLigature = function(feature, ligature, script, language) {\n    var lookupTable = this.getLookupTables(script, language, feature, 4, true)[0];\n    var subtable = lookupTable.subtables[0];\n    if (!subtable) {\n        subtable = {                // lookup type 4 subtable, format 1, coverage format 1\n            substFormat: 1,\n            coverage: { format: 1, glyphs: [] },\n            ligatureSets: []\n        };\n        lookupTable.subtables[0] = subtable;\n    }\n    check.assert(subtable.coverage.format === 1, 'Ligature: unable to modify coverage table format ' + subtable.coverage.format);\n    var coverageGlyph = ligature.sub[0];\n    var ligComponents = ligature.sub.slice(1);\n    var ligatureTable = {\n        ligGlyph: ligature.by,\n        components: ligComponents\n    };\n    var pos = this.binSearch(subtable.coverage.glyphs, coverageGlyph);\n    if (pos >= 0) {\n        // ligatureSet already exists\n        var ligatureSet = subtable.ligatureSets[pos];\n        for (var i = 0; i < ligatureSet.length; i++) {\n            // If ligature already exists, return.\n            if (arraysEqual(ligatureSet[i].components, ligComponents)) {\n                return;\n            }\n        }\n        // ligature does not exist: add it.\n        ligatureSet.push(ligatureTable);\n    } else {\n        // Create a new ligatureSet and add coverage for the first glyph.\n        pos = -1 - pos;\n        subtable.coverage.glyphs.splice(pos, 0, coverageGlyph);\n        subtable.ligatureSets.splice(pos, 0, [ligatureTable]);\n    }\n};\n\n/**\n * List all feature data for a given script and language.\n * @param {string} feature - 4-letter feature name\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n * @return {Array} substitutions - The list of substitutions.\n */\nSubstitution.prototype.getFeature = function(feature, script, language) {\n    if (/ss\\d\\d/.test(feature)) {\n        // ss01 - ss20\n        return this.getSingle(feature, script, language);\n    }\n    switch (feature) {\n        case 'aalt':\n        case 'salt':\n            return this.getSingle(feature, script, language)\n                    .concat(this.getAlternates(feature, script, language));\n        case 'dlig':\n        case 'liga':\n        case 'rlig':\n            return this.getLigatures(feature, script, language);\n        case 'ccmp':\n            return this.getMultiple(feature, script, language)\n                .concat(this.getLigatures(feature, script, language));\n        case 'stch':\n            return this.getMultiple(feature, script, language);\n    }\n    return undefined;\n};\n\n/**\n * Add a substitution to a feature for a given script and language.\n * @param {string} feature - 4-letter feature name\n * @param {Object} sub - the substitution to add (an object like { sub: id or [ids], by: id or [ids] })\n * @param {string} [script='DFLT']\n * @param {string} [language='dflt']\n */\nSubstitution.prototype.add = function(feature, sub, script, language) {\n    if (/ss\\d\\d/.test(feature)) {\n        // ss01 - ss20\n        return this.addSingle(feature, sub, script, language);\n    }\n    switch (feature) {\n        case 'aalt':\n        case 'salt':\n            if (typeof sub.by === 'number') {\n                return this.addSingle(feature, sub, script, language);\n            }\n            return this.addAlternate(feature, sub, script, language);\n        case 'dlig':\n        case 'liga':\n        case 'rlig':\n            return this.addLigature(feature, sub, script, language);\n        case 'ccmp':\n            if (sub.by instanceof Array) {\n                return this.addMultiple(feature, sub, script, language);\n            }\n            return this.addLigature(feature, sub, script, language);\n    }\n    return undefined;\n};\n\nfunction checkArgument(expression, message) {\n    if (!expression) {\n        throw message;\n    }\n}\n\n// The `glyf` table describes the glyphs in TrueType outline format.\n\n// Parse the coordinate data for a glyph.\nfunction parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask, sameBitMask) {\n    var v;\n    if ((flag & shortVectorBitMask) > 0) {\n        // The coordinate is 1 byte long.\n        v = p.parseByte();\n        // The `same` bit is re-used for short values to signify the sign of the value.\n        if ((flag & sameBitMask) === 0) {\n            v = -v;\n        }\n\n        v = previousValue + v;\n    } else {\n        //  The coordinate is 2 bytes long.\n        // If the `same` bit is set, the coordinate is the same as the previous coordinate.\n        if ((flag & sameBitMask) > 0) {\n            v = previousValue;\n        } else {\n            // Parse the coordinate as a signed 16-bit delta value.\n            v = previousValue + p.parseShort();\n        }\n    }\n\n    return v;\n}\n\n// Parse a TrueType glyph.\nfunction parseGlyph(glyph, data, start) {\n    var p = new parse.Parser(data, start);\n    glyph.numberOfContours = p.parseShort();\n    glyph._xMin = p.parseShort();\n    glyph._yMin = p.parseShort();\n    glyph._xMax = p.parseShort();\n    glyph._yMax = p.parseShort();\n    var flags;\n    var flag;\n\n    if (glyph.numberOfContours > 0) {\n        // This glyph is not a composite.\n        var endPointIndices = glyph.endPointIndices = [];\n        for (var i = 0; i < glyph.numberOfContours; i += 1) {\n            endPointIndices.push(p.parseUShort());\n        }\n\n        glyph.instructionLength = p.parseUShort();\n        glyph.instructions = [];\n        for (var i$1 = 0; i$1 < glyph.instructionLength; i$1 += 1) {\n            glyph.instructions.push(p.parseByte());\n        }\n\n        var numberOfCoordinates = endPointIndices[endPointIndices.length - 1] + 1;\n        flags = [];\n        for (var i$2 = 0; i$2 < numberOfCoordinates; i$2 += 1) {\n            flag = p.parseByte();\n            flags.push(flag);\n            // If bit 3 is set, we repeat this flag n times, where n is the next byte.\n            if ((flag & 8) > 0) {\n                var repeatCount = p.parseByte();\n                for (var j = 0; j < repeatCount; j += 1) {\n                    flags.push(flag);\n                    i$2 += 1;\n                }\n            }\n        }\n\n        check.argument(flags.length === numberOfCoordinates, 'Bad flags.');\n\n        if (endPointIndices.length > 0) {\n            var points = [];\n            var point;\n            // X/Y coordinates are relative to the previous point, except for the first point which is relative to 0,0.\n            if (numberOfCoordinates > 0) {\n                for (var i$3 = 0; i$3 < numberOfCoordinates; i$3 += 1) {\n                    flag = flags[i$3];\n                    point = {};\n                    point.onCurve = !!(flag & 1);\n                    point.lastPointOfContour = endPointIndices.indexOf(i$3) >= 0;\n                    points.push(point);\n                }\n\n                var px = 0;\n                for (var i$4 = 0; i$4 < numberOfCoordinates; i$4 += 1) {\n                    flag = flags[i$4];\n                    point = points[i$4];\n                    point.x = parseGlyphCoordinate(p, flag, px, 2, 16);\n                    px = point.x;\n                }\n\n                var py = 0;\n                for (var i$5 = 0; i$5 < numberOfCoordinates; i$5 += 1) {\n                    flag = flags[i$5];\n                    point = points[i$5];\n                    point.y = parseGlyphCoordinate(p, flag, py, 4, 32);\n                    py = point.y;\n                }\n            }\n\n            glyph.points = points;\n        } else {\n            glyph.points = [];\n        }\n    } else if (glyph.numberOfContours === 0) {\n        glyph.points = [];\n    } else {\n        glyph.isComposite = true;\n        glyph.points = [];\n        glyph.components = [];\n        var moreComponents = true;\n        while (moreComponents) {\n            flags = p.parseUShort();\n            var component = {\n                glyphIndex: p.parseUShort(),\n                xScale: 1,\n                scale01: 0,\n                scale10: 0,\n                yScale: 1,\n                dx: 0,\n                dy: 0\n            };\n            if ((flags & 1) > 0) {\n                // The arguments are words\n                if ((flags & 2) > 0) {\n                    // values are offset\n                    component.dx = p.parseShort();\n                    component.dy = p.parseShort();\n                } else {\n                    // values are matched points\n                    component.matchedPoints = [p.parseUShort(), p.parseUShort()];\n                }\n\n            } else {\n                // The arguments are bytes\n                if ((flags & 2) > 0) {\n                    // values are offset\n                    component.dx = p.parseChar();\n                    component.dy = p.parseChar();\n                } else {\n                    // values are matched points\n                    component.matchedPoints = [p.parseByte(), p.parseByte()];\n                }\n            }\n\n            if ((flags & 8) > 0) {\n                // We have a scale\n                component.xScale = component.yScale = p.parseF2Dot14();\n            } else if ((flags & 64) > 0) {\n                // We have an X / Y scale\n                component.xScale = p.parseF2Dot14();\n                component.yScale = p.parseF2Dot14();\n            } else if ((flags & 128) > 0) {\n                // We have a 2x2 transformation\n                component.xScale = p.parseF2Dot14();\n                component.scale01 = p.parseF2Dot14();\n                component.scale10 = p.parseF2Dot14();\n                component.yScale = p.parseF2Dot14();\n            }\n\n            glyph.components.push(component);\n            moreComponents = !!(flags & 32);\n        }\n        if (flags & 0x100) {\n            // We have instructions\n            glyph.instructionLength = p.parseUShort();\n            glyph.instructions = [];\n            for (var i$6 = 0; i$6 < glyph.instructionLength; i$6 += 1) {\n                glyph.instructions.push(p.parseByte());\n            }\n        }\n    }\n}\n\n// Transform an array of points and return a new array.\nfunction transformPoints(points, transform) {\n    var newPoints = [];\n    for (var i = 0; i < points.length; i += 1) {\n        var pt = points[i];\n        var newPt = {\n            x: transform.xScale * pt.x + transform.scale01 * pt.y + transform.dx,\n            y: transform.scale10 * pt.x + transform.yScale * pt.y + transform.dy,\n            onCurve: pt.onCurve,\n            lastPointOfContour: pt.lastPointOfContour\n        };\n        newPoints.push(newPt);\n    }\n\n    return newPoints;\n}\n\nfunction getContours(points) {\n    var contours = [];\n    var currentContour = [];\n    for (var i = 0; i < points.length; i += 1) {\n        var pt = points[i];\n        currentContour.push(pt);\n        if (pt.lastPointOfContour) {\n            contours.push(currentContour);\n            currentContour = [];\n        }\n    }\n\n    check.argument(currentContour.length === 0, 'There are still points left in the current contour.');\n    return contours;\n}\n\n// Convert the TrueType glyph outline to a Path.\nfunction getPath(points) {\n    var p = new Path();\n    if (!points) {\n        return p;\n    }\n\n    var contours = getContours(points);\n\n    for (var contourIndex = 0; contourIndex < contours.length; ++contourIndex) {\n        var contour = contours[contourIndex];\n\n        var prev = null;\n        var curr = contour[contour.length - 1];\n        var next = contour[0];\n\n        if (curr.onCurve) {\n            p.moveTo(curr.x, curr.y);\n        } else {\n            if (next.onCurve) {\n                p.moveTo(next.x, next.y);\n            } else {\n                // If both first and last points are off-curve, start at their middle.\n                var start = {x: (curr.x + next.x) * 0.5, y: (curr.y + next.y) * 0.5};\n                p.moveTo(start.x, start.y);\n            }\n        }\n\n        for (var i = 0; i < contour.length; ++i) {\n            prev = curr;\n            curr = next;\n            next = contour[(i + 1) % contour.length];\n\n            if (curr.onCurve) {\n                // This is a straight line.\n                p.lineTo(curr.x, curr.y);\n            } else {\n                var prev2 = prev;\n                var next2 = next;\n\n                if (!prev.onCurve) {\n                    prev2 = { x: (curr.x + prev.x) * 0.5, y: (curr.y + prev.y) * 0.5 };\n                }\n\n                if (!next.onCurve) {\n                    next2 = { x: (curr.x + next.x) * 0.5, y: (curr.y + next.y) * 0.5 };\n                }\n\n                p.quadraticCurveTo(curr.x, curr.y, next2.x, next2.y);\n            }\n        }\n\n        p.closePath();\n    }\n    return p;\n}\n\nfunction buildPath(glyphs, glyph) {\n    if (glyph.isComposite) {\n        for (var j = 0; j < glyph.components.length; j += 1) {\n            var component = glyph.components[j];\n            var componentGlyph = glyphs.get(component.glyphIndex);\n            // Force the ttfGlyphLoader to parse the glyph.\n            componentGlyph.getPath();\n            if (componentGlyph.points) {\n                var transformedPoints = (void 0);\n                if (component.matchedPoints === undefined) {\n                    // component positioned by offset\n                    transformedPoints = transformPoints(componentGlyph.points, component);\n                } else {\n                    // component positioned by matched points\n                    if ((component.matchedPoints[0] > glyph.points.length - 1) ||\n                        (component.matchedPoints[1] > componentGlyph.points.length - 1)) {\n                        throw Error('Matched points out of range in ' + glyph.name);\n                    }\n                    var firstPt = glyph.points[component.matchedPoints[0]];\n                    var secondPt = componentGlyph.points[component.matchedPoints[1]];\n                    var transform = {\n                        xScale: component.xScale, scale01: component.scale01,\n                        scale10: component.scale10, yScale: component.yScale,\n                        dx: 0, dy: 0\n                    };\n                    secondPt = transformPoints([secondPt], transform)[0];\n                    transform.dx = firstPt.x - secondPt.x;\n                    transform.dy = firstPt.y - secondPt.y;\n                    transformedPoints = transformPoints(componentGlyph.points, transform);\n                }\n                glyph.points = glyph.points.concat(transformedPoints);\n            }\n        }\n    }\n\n    return getPath(glyph.points);\n}\n\nfunction parseGlyfTableAll(data, start, loca, font) {\n    var glyphs = new glyphset.GlyphSet(font);\n\n    // The last element of the loca table is invalid.\n    for (var i = 0; i < loca.length - 1; i += 1) {\n        var offset = loca[i];\n        var nextOffset = loca[i + 1];\n        if (offset !== nextOffset) {\n            glyphs.push(i, glyphset.ttfGlyphLoader(font, i, parseGlyph, data, start + offset, buildPath));\n        } else {\n            glyphs.push(i, glyphset.glyphLoader(font, i));\n        }\n    }\n\n    return glyphs;\n}\n\nfunction parseGlyfTableOnLowMemory(data, start, loca, font) {\n    var glyphs = new glyphset.GlyphSet(font);\n\n    font._push = function(i) {\n        var offset = loca[i];\n        var nextOffset = loca[i + 1];\n        if (offset !== nextOffset) {\n            glyphs.push(i, glyphset.ttfGlyphLoader(font, i, parseGlyph, data, start + offset, buildPath));\n        } else {\n            glyphs.push(i, glyphset.glyphLoader(font, i));\n        }\n    };\n\n    return glyphs;\n}\n\n// Parse all the glyphs according to the offsets from the `loca` table.\nfunction parseGlyfTable(data, start, loca, font, opt) {\n    if (opt.lowMemory)\n        { return parseGlyfTableOnLowMemory(data, start, loca, font); }\n    else\n        { return parseGlyfTableAll(data, start, loca, font); }\n}\n\nvar glyf = { getPath: getPath, parse: parseGlyfTable};\n\n/* A TrueType font hinting interpreter.\n*\n* (c) 2017 Axel Kittenberger\n*\n* This interpreter has been implemented according to this documentation:\n* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html\n*\n* According to the documentation F24DOT6 values are used for pixels.\n* That means calculation is 1/64 pixel accurate and uses integer operations.\n* However, Javascript has floating point operations by default and only\n* those are available. One could make a case to simulate the 1/64 accuracy\n* exactly by truncating after every division operation\n* (for example with << 0) to get pixel exactly results as other TrueType\n* implementations. It may make sense since some fonts are pixel optimized\n* by hand using DELTAP instructions. The current implementation doesn't\n* and rather uses full floating point precision.\n*\n* xScale, yScale and rotation is currently ignored.\n*\n* A few non-trivial instructions are missing as I didn't encounter yet\n* a font that used them to test a possible implementation.\n*\n* Some fonts seem to use undocumented features regarding the twilight zone.\n* Only some of them are implemented as they were encountered.\n*\n* The exports.DEBUG statements are removed on the minified distribution file.\n*/\n\nvar instructionTable;\nvar exec;\nvar execGlyph;\nvar execComponent;\n\n/*\n* Creates a hinting object.\n*\n* There ought to be exactly one\n* for each truetype font that is used for hinting.\n*/\nfunction Hinting(font) {\n    // the font this hinting object is for\n    this.font = font;\n\n    this.getCommands = function (hPoints) {\n        return glyf.getPath(hPoints).commands;\n    };\n\n    // cached states\n    this._fpgmState  =\n    this._prepState  =\n        undefined;\n\n    // errorState\n    // 0 ... all okay\n    // 1 ... had an error in a glyf,\n    //       continue working but stop spamming\n    //       the console\n    // 2 ... error at prep, stop hinting at this ppem\n    // 3 ... error at fpeg, stop hinting for this font at all\n    this._errorState = 0;\n}\n\n/*\n* Not rounding.\n*/\nfunction roundOff(v) {\n    return v;\n}\n\n/*\n* Rounding to grid.\n*/\nfunction roundToGrid(v) {\n    //Rounding in TT is supposed to \"symmetrical around zero\"\n    return Math.sign(v) * Math.round(Math.abs(v));\n}\n\n/*\n* Rounding to double grid.\n*/\nfunction roundToDoubleGrid(v) {\n    return Math.sign(v) * Math.round(Math.abs(v * 2)) / 2;\n}\n\n/*\n* Rounding to half grid.\n*/\nfunction roundToHalfGrid(v) {\n    return Math.sign(v) * (Math.round(Math.abs(v) + 0.5) - 0.5);\n}\n\n/*\n* Rounding to up to grid.\n*/\nfunction roundUpToGrid(v) {\n    return Math.sign(v) * Math.ceil(Math.abs(v));\n}\n\n/*\n* Rounding to down to grid.\n*/\nfunction roundDownToGrid(v) {\n    return Math.sign(v) * Math.floor(Math.abs(v));\n}\n\n/*\n* Super rounding.\n*/\nvar roundSuper = function (v) {\n    var period = this.srPeriod;\n    var phase = this.srPhase;\n    var threshold = this.srThreshold;\n    var sign = 1;\n\n    if (v < 0) {\n        v = -v;\n        sign = -1;\n    }\n\n    v += threshold - phase;\n\n    v = Math.trunc(v / period) * period;\n\n    v += phase;\n\n    // according to http://xgridfit.sourceforge.net/round.html\n    if (v < 0) { return phase * sign; }\n\n    return v * sign;\n};\n\n/*\n* Unit vector of x-axis.\n*/\nvar xUnitVector = {\n    x: 1,\n\n    y: 0,\n\n    axis: 'x',\n\n    // Gets the projected distance between two points.\n    // o1/o2 ... if true, respective original position is used.\n    distance: function (p1, p2, o1, o2) {\n        return (o1 ? p1.xo : p1.x) - (o2 ? p2.xo : p2.x);\n    },\n\n    // Moves point p so the moved position has the same relative\n    // position to the moved positions of rp1 and rp2 than the\n    // original positions had.\n    //\n    // See APPENDIX on INTERPOLATE at the bottom of this file.\n    interpolate: function (p, rp1, rp2, pv) {\n        var do1;\n        var do2;\n        var doa1;\n        var doa2;\n        var dm1;\n        var dm2;\n        var dt;\n\n        if (!pv || pv === this) {\n            do1 = p.xo - rp1.xo;\n            do2 = p.xo - rp2.xo;\n            dm1 = rp1.x - rp1.xo;\n            dm2 = rp2.x - rp2.xo;\n            doa1 = Math.abs(do1);\n            doa2 = Math.abs(do2);\n            dt = doa1 + doa2;\n\n            if (dt === 0) {\n                p.x = p.xo + (dm1 + dm2) / 2;\n                return;\n            }\n\n            p.x = p.xo + (dm1 * doa2 + dm2 * doa1) / dt;\n            return;\n        }\n\n        do1 = pv.distance(p, rp1, true, true);\n        do2 = pv.distance(p, rp2, true, true);\n        dm1 = pv.distance(rp1, rp1, false, true);\n        dm2 = pv.distance(rp2, rp2, false, true);\n        doa1 = Math.abs(do1);\n        doa2 = Math.abs(do2);\n        dt = doa1 + doa2;\n\n        if (dt === 0) {\n            xUnitVector.setRelative(p, p, (dm1 + dm2) / 2, pv, true);\n            return;\n        }\n\n        xUnitVector.setRelative(p, p, (dm1 * doa2 + dm2 * doa1) / dt, pv, true);\n    },\n\n    // Slope of line normal to this\n    normalSlope: Number.NEGATIVE_INFINITY,\n\n    // Sets the point 'p' relative to point 'rp'\n    // by the distance 'd'.\n    //\n    // See APPENDIX on SETRELATIVE at the bottom of this file.\n    //\n    // p   ... point to set\n    // rp  ... reference point\n    // d   ... distance on projection vector\n    // pv  ... projection vector (undefined = this)\n    // org ... if true, uses the original position of rp as reference.\n    setRelative: function (p, rp, d, pv, org) {\n        if (!pv || pv === this) {\n            p.x = (org ? rp.xo : rp.x) + d;\n            return;\n        }\n\n        var rpx = org ? rp.xo : rp.x;\n        var rpy = org ? rp.yo : rp.y;\n        var rpdx = rpx + d * pv.x;\n        var rpdy = rpy + d * pv.y;\n\n        p.x = rpdx + (p.y - rpdy) / pv.normalSlope;\n    },\n\n    // Slope of vector line.\n    slope: 0,\n\n    // Touches the point p.\n    touch: function (p) {\n        p.xTouched = true;\n    },\n\n    // Tests if a point p is touched.\n    touched: function (p) {\n        return p.xTouched;\n    },\n\n    // Untouches the point p.\n    untouch: function (p) {\n        p.xTouched = false;\n    }\n};\n\n/*\n* Unit vector of y-axis.\n*/\nvar yUnitVector = {\n    x: 0,\n\n    y: 1,\n\n    axis: 'y',\n\n    // Gets the projected distance between two points.\n    // o1/o2 ... if true, respective original position is used.\n    distance: function (p1, p2, o1, o2) {\n        return (o1 ? p1.yo : p1.y) - (o2 ? p2.yo : p2.y);\n    },\n\n    // Moves point p so the moved position has the same relative\n    // position to the moved positions of rp1 and rp2 than the\n    // original positions had.\n    //\n    // See APPENDIX on INTERPOLATE at the bottom of this file.\n    interpolate: function (p, rp1, rp2, pv) {\n        var do1;\n        var do2;\n        var doa1;\n        var doa2;\n        var dm1;\n        var dm2;\n        var dt;\n\n        if (!pv || pv === this) {\n            do1 = p.yo - rp1.yo;\n            do2 = p.yo - rp2.yo;\n            dm1 = rp1.y - rp1.yo;\n            dm2 = rp2.y - rp2.yo;\n            doa1 = Math.abs(do1);\n            doa2 = Math.abs(do2);\n            dt = doa1 + doa2;\n\n            if (dt === 0) {\n                p.y = p.yo + (dm1 + dm2) / 2;\n                return;\n            }\n\n            p.y = p.yo + (dm1 * doa2 + dm2 * doa1) / dt;\n            return;\n        }\n\n        do1 = pv.distance(p, rp1, true, true);\n        do2 = pv.distance(p, rp2, true, true);\n        dm1 = pv.distance(rp1, rp1, false, true);\n        dm2 = pv.distance(rp2, rp2, false, true);\n        doa1 = Math.abs(do1);\n        doa2 = Math.abs(do2);\n        dt = doa1 + doa2;\n\n        if (dt === 0) {\n            yUnitVector.setRelative(p, p, (dm1 + dm2) / 2, pv, true);\n            return;\n        }\n\n        yUnitVector.setRelative(p, p, (dm1 * doa2 + dm2 * doa1) / dt, pv, true);\n    },\n\n    // Slope of line normal to this.\n    normalSlope: 0,\n\n    // Sets the point 'p' relative to point 'rp'\n    // by the distance 'd'\n    //\n    // See APPENDIX on SETRELATIVE at the bottom of this file.\n    //\n    // p   ... point to set\n    // rp  ... reference point\n    // d   ... distance on projection vector\n    // pv  ... projection vector (undefined = this)\n    // org ... if true, uses the original position of rp as reference.\n    setRelative: function (p, rp, d, pv, org) {\n        if (!pv || pv === this) {\n            p.y = (org ? rp.yo : rp.y) + d;\n            return;\n        }\n\n        var rpx = org ? rp.xo : rp.x;\n        var rpy = org ? rp.yo : rp.y;\n        var rpdx = rpx + d * pv.x;\n        var rpdy = rpy + d * pv.y;\n\n        p.y = rpdy + pv.normalSlope * (p.x - rpdx);\n    },\n\n    // Slope of vector line.\n    slope: Number.POSITIVE_INFINITY,\n\n    // Touches the point p.\n    touch: function (p) {\n        p.yTouched = true;\n    },\n\n    // Tests if a point p is touched.\n    touched: function (p) {\n        return p.yTouched;\n    },\n\n    // Untouches the point p.\n    untouch: function (p) {\n        p.yTouched = false;\n    }\n};\n\nObject.freeze(xUnitVector);\nObject.freeze(yUnitVector);\n\n/*\n* Creates a unit vector that is not x- or y-axis.\n*/\nfunction UnitVector(x, y) {\n    this.x = x;\n    this.y = y;\n    this.axis = undefined;\n    this.slope = y / x;\n    this.normalSlope = -x / y;\n    Object.freeze(this);\n}\n\n/*\n* Gets the projected distance between two points.\n* o1/o2 ... if true, respective original position is used.\n*/\nUnitVector.prototype.distance = function(p1, p2, o1, o2) {\n    return (\n        this.x * xUnitVector.distance(p1, p2, o1, o2) +\n        this.y * yUnitVector.distance(p1, p2, o1, o2)\n    );\n};\n\n/*\n* Moves point p so the moved position has the same relative\n* position to the moved positions of rp1 and rp2 than the\n* original positions had.\n*\n* See APPENDIX on INTERPOLATE at the bottom of this file.\n*/\nUnitVector.prototype.interpolate = function(p, rp1, rp2, pv) {\n    var dm1;\n    var dm2;\n    var do1;\n    var do2;\n    var doa1;\n    var doa2;\n    var dt;\n\n    do1 = pv.distance(p, rp1, true, true);\n    do2 = pv.distance(p, rp2, true, true);\n    dm1 = pv.distance(rp1, rp1, false, true);\n    dm2 = pv.distance(rp2, rp2, false, true);\n    doa1 = Math.abs(do1);\n    doa2 = Math.abs(do2);\n    dt = doa1 + doa2;\n\n    if (dt === 0) {\n        this.setRelative(p, p, (dm1 + dm2) / 2, pv, true);\n        return;\n    }\n\n    this.setRelative(p, p, (dm1 * doa2 + dm2 * doa1) / dt, pv, true);\n};\n\n/*\n* Sets the point 'p' relative to point 'rp'\n* by the distance 'd'\n*\n* See APPENDIX on SETRELATIVE at the bottom of this file.\n*\n* p   ...  point to set\n* rp  ... reference point\n* d   ... distance on projection vector\n* pv  ... projection vector (undefined = this)\n* org ... if true, uses the original position of rp as reference.\n*/\nUnitVector.prototype.setRelative = function(p, rp, d, pv, org) {\n    pv = pv || this;\n\n    var rpx = org ? rp.xo : rp.x;\n    var rpy = org ? rp.yo : rp.y;\n    var rpdx = rpx + d * pv.x;\n    var rpdy = rpy + d * pv.y;\n\n    var pvns = pv.normalSlope;\n    var fvs = this.slope;\n\n    var px = p.x;\n    var py = p.y;\n\n    p.x = (fvs * px - pvns * rpdx + rpdy - py) / (fvs - pvns);\n    p.y = fvs * (p.x - px) + py;\n};\n\n/*\n* Touches the point p.\n*/\nUnitVector.prototype.touch = function(p) {\n    p.xTouched = true;\n    p.yTouched = true;\n};\n\n/*\n* Returns a unit vector with x/y coordinates.\n*/\nfunction getUnitVector(x, y) {\n    var d = Math.sqrt(x * x + y * y);\n\n    x /= d;\n    y /= d;\n\n    if (x === 1 && y === 0) { return xUnitVector; }\n    else if (x === 0 && y === 1) { return yUnitVector; }\n    else { return new UnitVector(x, y); }\n}\n\n/*\n* Creates a point in the hinting engine.\n*/\nfunction HPoint(\n    x,\n    y,\n    lastPointOfContour,\n    onCurve\n) {\n    this.x = this.xo = Math.round(x * 64) / 64; // hinted x value and original x-value\n    this.y = this.yo = Math.round(y * 64) / 64; // hinted y value and original y-value\n\n    this.lastPointOfContour = lastPointOfContour;\n    this.onCurve = onCurve;\n    this.prevPointOnContour = undefined;\n    this.nextPointOnContour = undefined;\n    this.xTouched = false;\n    this.yTouched = false;\n\n    Object.preventExtensions(this);\n}\n\n/*\n* Returns the next touched point on the contour.\n*\n* v  ... unit vector to test touch axis.\n*/\nHPoint.prototype.nextTouched = function(v) {\n    var p = this.nextPointOnContour;\n\n    while (!v.touched(p) && p !== this) { p = p.nextPointOnContour; }\n\n    return p;\n};\n\n/*\n* Returns the previous touched point on the contour\n*\n* v  ... unit vector to test touch axis.\n*/\nHPoint.prototype.prevTouched = function(v) {\n    var p = this.prevPointOnContour;\n\n    while (!v.touched(p) && p !== this) { p = p.prevPointOnContour; }\n\n    return p;\n};\n\n/*\n* The zero point.\n*/\nvar HPZero = Object.freeze(new HPoint(0, 0));\n\n/*\n* The default state of the interpreter.\n*\n* Note: Freezing the defaultState and then deriving from it\n* makes the V8 Javascript engine going awkward,\n* so this is avoided, albeit the defaultState shouldn't\n* ever change.\n*/\nvar defaultState = {\n    cvCutIn: 17 / 16,    // control value cut in\n    deltaBase: 9,\n    deltaShift: 0.125,\n    loop: 1,             // loops some instructions\n    minDis: 1,           // minimum distance\n    autoFlip: true\n};\n\n/*\n* The current state of the interpreter.\n*\n* env  ... 'fpgm' or 'prep' or 'glyf'\n* prog ... the program\n*/\nfunction State(env, prog) {\n    this.env = env;\n    this.stack = [];\n    this.prog = prog;\n\n    switch (env) {\n        case 'glyf' :\n            this.zp0 = this.zp1 = this.zp2 = 1;\n            this.rp0 = this.rp1 = this.rp2 = 0;\n            /* fall through */\n        case 'prep' :\n            this.fv = this.pv = this.dpv = xUnitVector;\n            this.round = roundToGrid;\n    }\n}\n\n/*\n* Executes a glyph program.\n*\n* This does the hinting for each glyph.\n*\n* Returns an array of moved points.\n*\n* glyph: the glyph to hint\n* ppem: the size the glyph is rendered for\n*/\nHinting.prototype.exec = function(glyph, ppem) {\n    if (typeof ppem !== 'number') {\n        throw new Error('Point size is not a number!');\n    }\n\n    // Received a fatal error, don't do any hinting anymore.\n    if (this._errorState > 2) { return; }\n\n    var font = this.font;\n    var prepState = this._prepState;\n\n    if (!prepState || prepState.ppem !== ppem) {\n        var fpgmState = this._fpgmState;\n\n        if (!fpgmState) {\n            // Executes the fpgm state.\n            // This is used by fonts to define functions.\n            State.prototype = defaultState;\n\n            fpgmState =\n            this._fpgmState =\n                new State('fpgm', font.tables.fpgm);\n\n            fpgmState.funcs = [ ];\n            fpgmState.font = font;\n\n            if (exports.DEBUG) {\n                console.log('---EXEC FPGM---');\n                fpgmState.step = -1;\n            }\n\n            try {\n                exec(fpgmState);\n            } catch (e) {\n                console.log('Hinting error in FPGM:' + e);\n                this._errorState = 3;\n                return;\n            }\n        }\n\n        // Executes the prep program for this ppem setting.\n        // This is used by fonts to set cvt values\n        // depending on to be rendered font size.\n\n        State.prototype = fpgmState;\n        prepState =\n        this._prepState =\n            new State('prep', font.tables.prep);\n\n        prepState.ppem = ppem;\n\n        // Creates a copy of the cvt table\n        // and scales it to the current ppem setting.\n        var oCvt = font.tables.cvt;\n        if (oCvt) {\n            var cvt = prepState.cvt = new Array(oCvt.length);\n            var scale = ppem / font.unitsPerEm;\n            for (var c = 0; c < oCvt.length; c++) {\n                cvt[c] = oCvt[c] * scale;\n            }\n        } else {\n            prepState.cvt = [];\n        }\n\n        if (exports.DEBUG) {\n            console.log('---EXEC PREP---');\n            prepState.step = -1;\n        }\n\n        try {\n            exec(prepState);\n        } catch (e) {\n            if (this._errorState < 2) {\n                console.log('Hinting error in PREP:' + e);\n            }\n            this._errorState = 2;\n        }\n    }\n\n    if (this._errorState > 1) { return; }\n\n    try {\n        return execGlyph(glyph, prepState);\n    } catch (e) {\n        if (this._errorState < 1) {\n            console.log('Hinting error:' + e);\n            console.log('Note: further hinting errors are silenced');\n        }\n        this._errorState = 1;\n        return undefined;\n    }\n};\n\n/*\n* Executes the hinting program for a glyph.\n*/\nexecGlyph = function(glyph, prepState) {\n    // original point positions\n    var xScale = prepState.ppem / prepState.font.unitsPerEm;\n    var yScale = xScale;\n    var components = glyph.components;\n    var contours;\n    var gZone;\n    var state;\n\n    State.prototype = prepState;\n    if (!components) {\n        state = new State('glyf', glyph.instructions);\n        if (exports.DEBUG) {\n            console.log('---EXEC GLYPH---');\n            state.step = -1;\n        }\n        execComponent(glyph, state, xScale, yScale);\n        gZone = state.gZone;\n    } else {\n        var font = prepState.font;\n        gZone = [];\n        contours = [];\n        for (var i = 0; i < components.length; i++) {\n            var c = components[i];\n            var cg = font.glyphs.get(c.glyphIndex);\n\n            state = new State('glyf', cg.instructions);\n\n            if (exports.DEBUG) {\n                console.log('---EXEC COMP ' + i + '---');\n                state.step = -1;\n            }\n\n            execComponent(cg, state, xScale, yScale);\n            // appends the computed points to the result array\n            // post processes the component points\n            var dx = Math.round(c.dx * xScale);\n            var dy = Math.round(c.dy * yScale);\n            var gz = state.gZone;\n            var cc = state.contours;\n            for (var pi = 0; pi < gz.length; pi++) {\n                var p = gz[pi];\n                p.xTouched = p.yTouched = false;\n                p.xo = p.x = p.x + dx;\n                p.yo = p.y = p.y + dy;\n            }\n\n            var gLen = gZone.length;\n            gZone.push.apply(gZone, gz);\n            for (var j = 0; j < cc.length; j++) {\n                contours.push(cc[j] + gLen);\n            }\n        }\n\n        if (glyph.instructions && !state.inhibitGridFit) {\n            // the composite has instructions on its own\n            state = new State('glyf', glyph.instructions);\n\n            state.gZone = state.z0 = state.z1 = state.z2 = gZone;\n\n            state.contours = contours;\n\n            // note: HPZero cannot be used here, since\n            //       the point might be modified\n            gZone.push(\n                new HPoint(0, 0),\n                new HPoint(Math.round(glyph.advanceWidth * xScale), 0)\n            );\n\n            if (exports.DEBUG) {\n                console.log('---EXEC COMPOSITE---');\n                state.step = -1;\n            }\n\n            exec(state);\n\n            gZone.length -= 2;\n        }\n    }\n\n    return gZone;\n};\n\n/*\n* Executes the hinting program for a component of a multi-component glyph\n* or of the glyph itself for a non-component glyph.\n*/\nexecComponent = function(glyph, state, xScale, yScale)\n{\n    var points = glyph.points || [];\n    var pLen = points.length;\n    var gZone = state.gZone = state.z0 = state.z1 = state.z2 = [];\n    var contours = state.contours = [];\n\n    // Scales the original points and\n    // makes copies for the hinted points.\n    var cp; // current point\n    for (var i = 0; i < pLen; i++) {\n        cp = points[i];\n\n        gZone[i] = new HPoint(\n            cp.x * xScale,\n            cp.y * yScale,\n            cp.lastPointOfContour,\n            cp.onCurve\n        );\n    }\n\n    // Chain links the contours.\n    var sp; // start point\n    var np; // next point\n\n    for (var i$1 = 0; i$1 < pLen; i$1++) {\n        cp = gZone[i$1];\n\n        if (!sp) {\n            sp = cp;\n            contours.push(i$1);\n        }\n\n        if (cp.lastPointOfContour) {\n            cp.nextPointOnContour = sp;\n            sp.prevPointOnContour = cp;\n            sp = undefined;\n        } else {\n            np = gZone[i$1 + 1];\n            cp.nextPointOnContour = np;\n            np.prevPointOnContour = cp;\n        }\n    }\n\n    if (state.inhibitGridFit) { return; }\n\n    if (exports.DEBUG) {\n        console.log('PROCESSING GLYPH', state.stack);\n        for (var i$2 = 0; i$2 < pLen; i$2++) {\n            console.log(i$2, gZone[i$2].x, gZone[i$2].y);\n        }\n    }\n\n    gZone.push(\n        new HPoint(0, 0),\n        new HPoint(Math.round(glyph.advanceWidth * xScale), 0)\n    );\n\n    exec(state);\n\n    // Removes the extra points.\n    gZone.length -= 2;\n\n    if (exports.DEBUG) {\n        console.log('FINISHED GLYPH', state.stack);\n        for (var i$3 = 0; i$3 < pLen; i$3++) {\n            console.log(i$3, gZone[i$3].x, gZone[i$3].y);\n        }\n    }\n};\n\n/*\n* Executes the program loaded in state.\n*/\nexec = function(state) {\n    var prog = state.prog;\n\n    if (!prog) { return; }\n\n    var pLen = prog.length;\n    var ins;\n\n    for (state.ip = 0; state.ip < pLen; state.ip++) {\n        if (exports.DEBUG) { state.step++; }\n        ins = instructionTable[prog[state.ip]];\n\n        if (!ins) {\n            throw new Error(\n                'unknown instruction: 0x' +\n                Number(prog[state.ip]).toString(16)\n            );\n        }\n\n        ins(state);\n\n        // very extensive debugging for each step\n        /*\n        if (exports.DEBUG) {\n            var da;\n            if (state.gZone) {\n                da = [];\n                for (let i = 0; i < state.gZone.length; i++)\n                {\n                    da.push(i + ' ' +\n                        state.gZone[i].x * 64 + ' ' +\n                        state.gZone[i].y * 64 + ' ' +\n                        (state.gZone[i].xTouched ? 'x' : '') +\n                        (state.gZone[i].yTouched ? 'y' : '')\n                    );\n                }\n                console.log('GZ', da);\n            }\n\n            if (state.tZone) {\n                da = [];\n                for (let i = 0; i < state.tZone.length; i++) {\n                    da.push(i + ' ' +\n                        state.tZone[i].x * 64 + ' ' +\n                        state.tZone[i].y * 64 + ' ' +\n                        (state.tZone[i].xTouched ? 'x' : '') +\n                        (state.tZone[i].yTouched ? 'y' : '')\n                    );\n                }\n                console.log('TZ', da);\n            }\n\n            if (state.stack.length > 10) {\n                console.log(\n                    state.stack.length,\n                    '...', state.stack.slice(state.stack.length - 10)\n                );\n            } else {\n                console.log(state.stack.length, state.stack);\n            }\n        }\n        */\n    }\n};\n\n/*\n* Initializes the twilight zone.\n*\n* This is only done if a SZPx instruction\n* refers to the twilight zone.\n*/\nfunction initTZone(state)\n{\n    var tZone = state.tZone = new Array(state.gZone.length);\n\n    // no idea if this is actually correct...\n    for (var i = 0; i < tZone.length; i++)\n    {\n        tZone[i] = new HPoint(0, 0);\n    }\n}\n\n/*\n* Skips the instruction pointer ahead over an IF/ELSE block.\n* handleElse .. if true breaks on matching ELSE\n*/\nfunction skip(state, handleElse)\n{\n    var prog = state.prog;\n    var ip = state.ip;\n    var nesting = 1;\n    var ins;\n\n    do {\n        ins = prog[++ip];\n        if (ins === 0x58) // IF\n            { nesting++; }\n        else if (ins === 0x59) // EIF\n            { nesting--; }\n        else if (ins === 0x40) // NPUSHB\n            { ip += prog[ip + 1] + 1; }\n        else if (ins === 0x41) // NPUSHW\n            { ip += 2 * prog[ip + 1] + 1; }\n        else if (ins >= 0xB0 && ins <= 0xB7) // PUSHB\n            { ip += ins - 0xB0 + 1; }\n        else if (ins >= 0xB8 && ins <= 0xBF) // PUSHW\n            { ip += (ins - 0xB8 + 1) * 2; }\n        else if (handleElse && nesting === 1 && ins === 0x1B) // ELSE\n            { break; }\n    } while (nesting > 0);\n\n    state.ip = ip;\n}\n\n/*----------------------------------------------------------*\n*          And then a lot of instructions...                *\n*----------------------------------------------------------*/\n\n// SVTCA[a] Set freedom and projection Vectors To Coordinate Axis\n// 0x00-0x01\nfunction SVTCA(v, state) {\n    if (exports.DEBUG) { console.log(state.step, 'SVTCA[' + v.axis + ']'); }\n\n    state.fv = state.pv = state.dpv = v;\n}\n\n// SPVTCA[a] Set Projection Vector to Coordinate Axis\n// 0x02-0x03\nfunction SPVTCA(v, state) {\n    if (exports.DEBUG) { console.log(state.step, 'SPVTCA[' + v.axis + ']'); }\n\n    state.pv = state.dpv = v;\n}\n\n// SFVTCA[a] Set Freedom Vector to Coordinate Axis\n// 0x04-0x05\nfunction SFVTCA(v, state) {\n    if (exports.DEBUG) { console.log(state.step, 'SFVTCA[' + v.axis + ']'); }\n\n    state.fv = v;\n}\n\n// SPVTL[a] Set Projection Vector To Line\n// 0x06-0x07\nfunction SPVTL(a, state) {\n    var stack = state.stack;\n    var p2i = stack.pop();\n    var p1i = stack.pop();\n    var p2 = state.z2[p2i];\n    var p1 = state.z1[p1i];\n\n    if (exports.DEBUG) { console.log('SPVTL[' + a + ']', p2i, p1i); }\n\n    var dx;\n    var dy;\n\n    if (!a) {\n        dx = p1.x - p2.x;\n        dy = p1.y - p2.y;\n    } else {\n        dx = p2.y - p1.y;\n        dy = p1.x - p2.x;\n    }\n\n    state.pv = state.dpv = getUnitVector(dx, dy);\n}\n\n// SFVTL[a] Set Freedom Vector To Line\n// 0x08-0x09\nfunction SFVTL(a, state) {\n    var stack = state.stack;\n    var p2i = stack.pop();\n    var p1i = stack.pop();\n    var p2 = state.z2[p2i];\n    var p1 = state.z1[p1i];\n\n    if (exports.DEBUG) { console.log('SFVTL[' + a + ']', p2i, p1i); }\n\n    var dx;\n    var dy;\n\n    if (!a) {\n        dx = p1.x - p2.x;\n        dy = p1.y - p2.y;\n    } else {\n        dx = p2.y - p1.y;\n        dy = p1.x - p2.x;\n    }\n\n    state.fv = getUnitVector(dx, dy);\n}\n\n// SPVFS[] Set Projection Vector From Stack\n// 0x0A\nfunction SPVFS(state) {\n    var stack = state.stack;\n    var y = stack.pop();\n    var x = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SPVFS[]', y, x); }\n\n    state.pv = state.dpv = getUnitVector(x, y);\n}\n\n// SFVFS[] Set Freedom Vector From Stack\n// 0x0B\nfunction SFVFS(state) {\n    var stack = state.stack;\n    var y = stack.pop();\n    var x = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SPVFS[]', y, x); }\n\n    state.fv = getUnitVector(x, y);\n}\n\n// GPV[] Get Projection Vector\n// 0x0C\nfunction GPV(state) {\n    var stack = state.stack;\n    var pv = state.pv;\n\n    if (exports.DEBUG) { console.log(state.step, 'GPV[]'); }\n\n    stack.push(pv.x * 0x4000);\n    stack.push(pv.y * 0x4000);\n}\n\n// GFV[] Get Freedom Vector\n// 0x0C\nfunction GFV(state) {\n    var stack = state.stack;\n    var fv = state.fv;\n\n    if (exports.DEBUG) { console.log(state.step, 'GFV[]'); }\n\n    stack.push(fv.x * 0x4000);\n    stack.push(fv.y * 0x4000);\n}\n\n// SFVTPV[] Set Freedom Vector To Projection Vector\n// 0x0E\nfunction SFVTPV(state) {\n    state.fv = state.pv;\n\n    if (exports.DEBUG) { console.log(state.step, 'SFVTPV[]'); }\n}\n\n// ISECT[] moves point p to the InterSECTion of two lines\n// 0x0F\nfunction ISECT(state)\n{\n    var stack = state.stack;\n    var pa0i = stack.pop();\n    var pa1i = stack.pop();\n    var pb0i = stack.pop();\n    var pb1i = stack.pop();\n    var pi = stack.pop();\n    var z0 = state.z0;\n    var z1 = state.z1;\n    var pa0 = z0[pa0i];\n    var pa1 = z0[pa1i];\n    var pb0 = z1[pb0i];\n    var pb1 = z1[pb1i];\n    var p = state.z2[pi];\n\n    if (exports.DEBUG) { console.log('ISECT[], ', pa0i, pa1i, pb0i, pb1i, pi); }\n\n    // math from\n    // en.wikipedia.org/wiki/Line%E2%80%93line_intersection#Given_two_points_on_each_line\n\n    var x1 = pa0.x;\n    var y1 = pa0.y;\n    var x2 = pa1.x;\n    var y2 = pa1.y;\n    var x3 = pb0.x;\n    var y3 = pb0.y;\n    var x4 = pb1.x;\n    var y4 = pb1.y;\n\n    var div = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n    var f1 = x1 * y2 - y1 * x2;\n    var f2 = x3 * y4 - y3 * x4;\n\n    p.x = (f1 * (x3 - x4) - f2 * (x1 - x2)) / div;\n    p.y = (f1 * (y3 - y4) - f2 * (y1 - y2)) / div;\n}\n\n// SRP0[] Set Reference Point 0\n// 0x10\nfunction SRP0(state) {\n    state.rp0 = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SRP0[]', state.rp0); }\n}\n\n// SRP1[] Set Reference Point 1\n// 0x11\nfunction SRP1(state) {\n    state.rp1 = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SRP1[]', state.rp1); }\n}\n\n// SRP1[] Set Reference Point 2\n// 0x12\nfunction SRP2(state) {\n    state.rp2 = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SRP2[]', state.rp2); }\n}\n\n// SZP0[] Set Zone Pointer 0\n// 0x13\nfunction SZP0(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SZP0[]', n); }\n\n    state.zp0 = n;\n\n    switch (n) {\n        case 0:\n            if (!state.tZone) { initTZone(state); }\n            state.z0 = state.tZone;\n            break;\n        case 1 :\n            state.z0 = state.gZone;\n            break;\n        default :\n            throw new Error('Invalid zone pointer');\n    }\n}\n\n// SZP1[] Set Zone Pointer 1\n// 0x14\nfunction SZP1(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SZP1[]', n); }\n\n    state.zp1 = n;\n\n    switch (n) {\n        case 0:\n            if (!state.tZone) { initTZone(state); }\n            state.z1 = state.tZone;\n            break;\n        case 1 :\n            state.z1 = state.gZone;\n            break;\n        default :\n            throw new Error('Invalid zone pointer');\n    }\n}\n\n// SZP2[] Set Zone Pointer 2\n// 0x15\nfunction SZP2(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SZP2[]', n); }\n\n    state.zp2 = n;\n\n    switch (n) {\n        case 0:\n            if (!state.tZone) { initTZone(state); }\n            state.z2 = state.tZone;\n            break;\n        case 1 :\n            state.z2 = state.gZone;\n            break;\n        default :\n            throw new Error('Invalid zone pointer');\n    }\n}\n\n// SZPS[] Set Zone PointerS\n// 0x16\nfunction SZPS(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SZPS[]', n); }\n\n    state.zp0 = state.zp1 = state.zp2 = n;\n\n    switch (n) {\n        case 0:\n            if (!state.tZone) { initTZone(state); }\n            state.z0 = state.z1 = state.z2 = state.tZone;\n            break;\n        case 1 :\n            state.z0 = state.z1 = state.z2 = state.gZone;\n            break;\n        default :\n            throw new Error('Invalid zone pointer');\n    }\n}\n\n// SLOOP[] Set LOOP variable\n// 0x17\nfunction SLOOP(state) {\n    state.loop = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SLOOP[]', state.loop); }\n}\n\n// RTG[] Round To Grid\n// 0x18\nfunction RTG(state) {\n    if (exports.DEBUG) { console.log(state.step, 'RTG[]'); }\n\n    state.round = roundToGrid;\n}\n\n// RTHG[] Round To Half Grid\n// 0x19\nfunction RTHG(state) {\n    if (exports.DEBUG) { console.log(state.step, 'RTHG[]'); }\n\n    state.round = roundToHalfGrid;\n}\n\n// SMD[] Set Minimum Distance\n// 0x1A\nfunction SMD(state) {\n    var d = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SMD[]', d); }\n\n    state.minDis = d / 0x40;\n}\n\n// ELSE[] ELSE clause\n// 0x1B\nfunction ELSE(state) {\n    // This instruction has been reached by executing a then branch\n    // so it just skips ahead until matching EIF.\n    //\n    // In case the IF was negative the IF[] instruction already\n    // skipped forward over the ELSE[]\n\n    if (exports.DEBUG) { console.log(state.step, 'ELSE[]'); }\n\n    skip(state, false);\n}\n\n// JMPR[] JuMP Relative\n// 0x1C\nfunction JMPR(state) {\n    var o = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'JMPR[]', o); }\n\n    // A jump by 1 would do nothing.\n    state.ip += o - 1;\n}\n\n// SCVTCI[] Set Control Value Table Cut-In\n// 0x1D\nfunction SCVTCI(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SCVTCI[]', n); }\n\n    state.cvCutIn = n / 0x40;\n}\n\n// DUP[] DUPlicate top stack element\n// 0x20\nfunction DUP(state) {\n    var stack = state.stack;\n\n    if (exports.DEBUG) { console.log(state.step, 'DUP[]'); }\n\n    stack.push(stack[stack.length - 1]);\n}\n\n// POP[] POP top stack element\n// 0x21\nfunction POP(state) {\n    if (exports.DEBUG) { console.log(state.step, 'POP[]'); }\n\n    state.stack.pop();\n}\n\n// CLEAR[] CLEAR the stack\n// 0x22\nfunction CLEAR(state) {\n    if (exports.DEBUG) { console.log(state.step, 'CLEAR[]'); }\n\n    state.stack.length = 0;\n}\n\n// SWAP[] SWAP the top two elements on the stack\n// 0x23\nfunction SWAP(state) {\n    var stack = state.stack;\n\n    var a = stack.pop();\n    var b = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SWAP[]'); }\n\n    stack.push(a);\n    stack.push(b);\n}\n\n// DEPTH[] DEPTH of the stack\n// 0x24\nfunction DEPTH(state) {\n    var stack = state.stack;\n\n    if (exports.DEBUG) { console.log(state.step, 'DEPTH[]'); }\n\n    stack.push(stack.length);\n}\n\n// LOOPCALL[] LOOPCALL function\n// 0x2A\nfunction LOOPCALL(state) {\n    var stack = state.stack;\n    var fn = stack.pop();\n    var c = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'LOOPCALL[]', fn, c); }\n\n    // saves callers program\n    var cip = state.ip;\n    var cprog = state.prog;\n\n    state.prog = state.funcs[fn];\n\n    // executes the function\n    for (var i = 0; i < c; i++) {\n        exec(state);\n\n        if (exports.DEBUG) { console.log(\n            ++state.step,\n            i + 1 < c ? 'next loopcall' : 'done loopcall',\n            i\n        ); }\n    }\n\n    // restores the callers program\n    state.ip = cip;\n    state.prog = cprog;\n}\n\n// CALL[] CALL function\n// 0x2B\nfunction CALL(state) {\n    var fn = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'CALL[]', fn); }\n\n    // saves callers program\n    var cip = state.ip;\n    var cprog = state.prog;\n\n    state.prog = state.funcs[fn];\n\n    // executes the function\n    exec(state);\n\n    // restores the callers program\n    state.ip = cip;\n    state.prog = cprog;\n\n    if (exports.DEBUG) { console.log(++state.step, 'returning from', fn); }\n}\n\n// CINDEX[] Copy the INDEXed element to the top of the stack\n// 0x25\nfunction CINDEX(state) {\n    var stack = state.stack;\n    var k = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'CINDEX[]', k); }\n\n    // In case of k == 1, it copies the last element after popping\n    // thus stack.length - k.\n    stack.push(stack[stack.length - k]);\n}\n\n// MINDEX[] Move the INDEXed element to the top of the stack\n// 0x26\nfunction MINDEX(state) {\n    var stack = state.stack;\n    var k = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'MINDEX[]', k); }\n\n    stack.push(stack.splice(stack.length - k, 1)[0]);\n}\n\n// FDEF[] Function DEFinition\n// 0x2C\nfunction FDEF(state) {\n    if (state.env !== 'fpgm') { throw new Error('FDEF not allowed here'); }\n    var stack = state.stack;\n    var prog = state.prog;\n    var ip = state.ip;\n\n    var fn = stack.pop();\n    var ipBegin = ip;\n\n    if (exports.DEBUG) { console.log(state.step, 'FDEF[]', fn); }\n\n    while (prog[++ip] !== 0x2D){ }\n\n    state.ip = ip;\n    state.funcs[fn] = prog.slice(ipBegin + 1, ip);\n}\n\n// MDAP[a] Move Direct Absolute Point\n// 0x2E-0x2F\nfunction MDAP(round, state) {\n    var pi = state.stack.pop();\n    var p = state.z0[pi];\n    var fv = state.fv;\n    var pv = state.pv;\n\n    if (exports.DEBUG) { console.log(state.step, 'MDAP[' + round + ']', pi); }\n\n    var d = pv.distance(p, HPZero);\n\n    if (round) { d = state.round(d); }\n\n    fv.setRelative(p, HPZero, d, pv);\n    fv.touch(p);\n\n    state.rp0 = state.rp1 = pi;\n}\n\n// IUP[a] Interpolate Untouched Points through the outline\n// 0x30\nfunction IUP(v, state) {\n    var z2 = state.z2;\n    var pLen = z2.length - 2;\n    var cp;\n    var pp;\n    var np;\n\n    if (exports.DEBUG) { console.log(state.step, 'IUP[' + v.axis + ']'); }\n\n    for (var i = 0; i < pLen; i++) {\n        cp = z2[i]; // current point\n\n        // if this point has been touched go on\n        if (v.touched(cp)) { continue; }\n\n        pp = cp.prevTouched(v);\n\n        // no point on the contour has been touched?\n        if (pp === cp) { continue; }\n\n        np = cp.nextTouched(v);\n\n        if (pp === np) {\n            // only one point on the contour has been touched\n            // so simply moves the point like that\n\n            v.setRelative(cp, cp, v.distance(pp, pp, false, true), v, true);\n        }\n\n        v.interpolate(cp, pp, np, v);\n    }\n}\n\n// SHP[] SHift Point using reference point\n// 0x32-0x33\nfunction SHP(a, state) {\n    var stack = state.stack;\n    var rpi = a ? state.rp1 : state.rp2;\n    var rp = (a ? state.z0 : state.z1)[rpi];\n    var fv = state.fv;\n    var pv = state.pv;\n    var loop = state.loop;\n    var z2 = state.z2;\n\n    while (loop--)\n    {\n        var pi = stack.pop();\n        var p = z2[pi];\n\n        var d = pv.distance(rp, rp, false, true);\n        fv.setRelative(p, p, d, pv);\n        fv.touch(p);\n\n        if (exports.DEBUG) {\n            console.log(\n                state.step,\n                (state.loop > 1 ?\n                   'loop ' + (state.loop - loop) + ': ' :\n                   ''\n                ) +\n                'SHP[' + (a ? 'rp1' : 'rp2') + ']', pi\n            );\n        }\n    }\n\n    state.loop = 1;\n}\n\n// SHC[] SHift Contour using reference point\n// 0x36-0x37\nfunction SHC(a, state) {\n    var stack = state.stack;\n    var rpi = a ? state.rp1 : state.rp2;\n    var rp = (a ? state.z0 : state.z1)[rpi];\n    var fv = state.fv;\n    var pv = state.pv;\n    var ci = stack.pop();\n    var sp = state.z2[state.contours[ci]];\n    var p = sp;\n\n    if (exports.DEBUG) { console.log(state.step, 'SHC[' + a + ']', ci); }\n\n    var d = pv.distance(rp, rp, false, true);\n\n    do {\n        if (p !== rp) { fv.setRelative(p, p, d, pv); }\n        p = p.nextPointOnContour;\n    } while (p !== sp);\n}\n\n// SHZ[] SHift Zone using reference point\n// 0x36-0x37\nfunction SHZ(a, state) {\n    var stack = state.stack;\n    var rpi = a ? state.rp1 : state.rp2;\n    var rp = (a ? state.z0 : state.z1)[rpi];\n    var fv = state.fv;\n    var pv = state.pv;\n\n    var e = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SHZ[' + a + ']', e); }\n\n    var z;\n    switch (e) {\n        case 0 : z = state.tZone; break;\n        case 1 : z = state.gZone; break;\n        default : throw new Error('Invalid zone');\n    }\n\n    var p;\n    var d = pv.distance(rp, rp, false, true);\n    var pLen = z.length - 2;\n    for (var i = 0; i < pLen; i++)\n    {\n        p = z[i];\n        fv.setRelative(p, p, d, pv);\n        //if (p !== rp) fv.setRelative(p, p, d, pv);\n    }\n}\n\n// SHPIX[] SHift point by a PIXel amount\n// 0x38\nfunction SHPIX(state) {\n    var stack = state.stack;\n    var loop = state.loop;\n    var fv = state.fv;\n    var d = stack.pop() / 0x40;\n    var z2 = state.z2;\n\n    while (loop--) {\n        var pi = stack.pop();\n        var p = z2[pi];\n\n        if (exports.DEBUG) {\n            console.log(\n                state.step,\n                (state.loop > 1 ? 'loop ' + (state.loop - loop) + ': ' : '') +\n                'SHPIX[]', pi, d\n            );\n        }\n\n        fv.setRelative(p, p, d);\n        fv.touch(p);\n    }\n\n    state.loop = 1;\n}\n\n// IP[] Interpolate Point\n// 0x39\nfunction IP(state) {\n    var stack = state.stack;\n    var rp1i = state.rp1;\n    var rp2i = state.rp2;\n    var loop = state.loop;\n    var rp1 = state.z0[rp1i];\n    var rp2 = state.z1[rp2i];\n    var fv = state.fv;\n    var pv = state.dpv;\n    var z2 = state.z2;\n\n    while (loop--) {\n        var pi = stack.pop();\n        var p = z2[pi];\n\n        if (exports.DEBUG) {\n            console.log(\n                state.step,\n                (state.loop > 1 ? 'loop ' + (state.loop - loop) + ': ' : '') +\n                'IP[]', pi, rp1i, '<->', rp2i\n            );\n        }\n\n        fv.interpolate(p, rp1, rp2, pv);\n\n        fv.touch(p);\n    }\n\n    state.loop = 1;\n}\n\n// MSIRP[a] Move Stack Indirect Relative Point\n// 0x3A-0x3B\nfunction MSIRP(a, state) {\n    var stack = state.stack;\n    var d = stack.pop() / 64;\n    var pi = stack.pop();\n    var p = state.z1[pi];\n    var rp0 = state.z0[state.rp0];\n    var fv = state.fv;\n    var pv = state.pv;\n\n    fv.setRelative(p, rp0, d, pv);\n    fv.touch(p);\n\n    if (exports.DEBUG) { console.log(state.step, 'MSIRP[' + a + ']', d, pi); }\n\n    state.rp1 = state.rp0;\n    state.rp2 = pi;\n    if (a) { state.rp0 = pi; }\n}\n\n// ALIGNRP[] Align to reference point.\n// 0x3C\nfunction ALIGNRP(state) {\n    var stack = state.stack;\n    var rp0i = state.rp0;\n    var rp0 = state.z0[rp0i];\n    var loop = state.loop;\n    var fv = state.fv;\n    var pv = state.pv;\n    var z1 = state.z1;\n\n    while (loop--) {\n        var pi = stack.pop();\n        var p = z1[pi];\n\n        if (exports.DEBUG) {\n            console.log(\n                state.step,\n                (state.loop > 1 ? 'loop ' + (state.loop - loop) + ': ' : '') +\n                'ALIGNRP[]', pi\n            );\n        }\n\n        fv.setRelative(p, rp0, 0, pv);\n        fv.touch(p);\n    }\n\n    state.loop = 1;\n}\n\n// RTG[] Round To Double Grid\n// 0x3D\nfunction RTDG(state) {\n    if (exports.DEBUG) { console.log(state.step, 'RTDG[]'); }\n\n    state.round = roundToDoubleGrid;\n}\n\n// MIAP[a] Move Indirect Absolute Point\n// 0x3E-0x3F\nfunction MIAP(round, state) {\n    var stack = state.stack;\n    var n = stack.pop();\n    var pi = stack.pop();\n    var p = state.z0[pi];\n    var fv = state.fv;\n    var pv = state.pv;\n    var cv = state.cvt[n];\n\n    if (exports.DEBUG) {\n        console.log(\n            state.step,\n            'MIAP[' + round + ']',\n            n, '(', cv, ')', pi\n        );\n    }\n\n    var d = pv.distance(p, HPZero);\n\n    if (round) {\n        if (Math.abs(d - cv) < state.cvCutIn) { d = cv; }\n\n        d = state.round(d);\n    }\n\n    fv.setRelative(p, HPZero, d, pv);\n\n    if (state.zp0 === 0) {\n        p.xo = p.x;\n        p.yo = p.y;\n    }\n\n    fv.touch(p);\n\n    state.rp0 = state.rp1 = pi;\n}\n\n// NPUSB[] PUSH N Bytes\n// 0x40\nfunction NPUSHB(state) {\n    var prog = state.prog;\n    var ip = state.ip;\n    var stack = state.stack;\n\n    var n = prog[++ip];\n\n    if (exports.DEBUG) { console.log(state.step, 'NPUSHB[]', n); }\n\n    for (var i = 0; i < n; i++) { stack.push(prog[++ip]); }\n\n    state.ip = ip;\n}\n\n// NPUSHW[] PUSH N Words\n// 0x41\nfunction NPUSHW(state) {\n    var ip = state.ip;\n    var prog = state.prog;\n    var stack = state.stack;\n    var n = prog[++ip];\n\n    if (exports.DEBUG) { console.log(state.step, 'NPUSHW[]', n); }\n\n    for (var i = 0; i < n; i++) {\n        var w = (prog[++ip] << 8) | prog[++ip];\n        if (w & 0x8000) { w = -((w ^ 0xffff) + 1); }\n        stack.push(w);\n    }\n\n    state.ip = ip;\n}\n\n// WS[] Write Store\n// 0x42\nfunction WS(state) {\n    var stack = state.stack;\n    var store = state.store;\n\n    if (!store) { store = state.store = []; }\n\n    var v = stack.pop();\n    var l = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'WS', v, l); }\n\n    store[l] = v;\n}\n\n// RS[] Read Store\n// 0x43\nfunction RS(state) {\n    var stack = state.stack;\n    var store = state.store;\n\n    var l = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'RS', l); }\n\n    var v = (store && store[l]) || 0;\n\n    stack.push(v);\n}\n\n// WCVTP[] Write Control Value Table in Pixel units\n// 0x44\nfunction WCVTP(state) {\n    var stack = state.stack;\n\n    var v = stack.pop();\n    var l = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'WCVTP', v, l); }\n\n    state.cvt[l] = v / 0x40;\n}\n\n// RCVT[] Read Control Value Table entry\n// 0x45\nfunction RCVT(state) {\n    var stack = state.stack;\n    var cvte = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'RCVT', cvte); }\n\n    stack.push(state.cvt[cvte] * 0x40);\n}\n\n// GC[] Get Coordinate projected onto the projection vector\n// 0x46-0x47\nfunction GC(a, state) {\n    var stack = state.stack;\n    var pi = stack.pop();\n    var p = state.z2[pi];\n\n    if (exports.DEBUG) { console.log(state.step, 'GC[' + a + ']', pi); }\n\n    stack.push(state.dpv.distance(p, HPZero, a, false) * 0x40);\n}\n\n// MD[a] Measure Distance\n// 0x49-0x4A\nfunction MD(a, state) {\n    var stack = state.stack;\n    var pi2 = stack.pop();\n    var pi1 = stack.pop();\n    var p2 = state.z1[pi2];\n    var p1 = state.z0[pi1];\n    var d = state.dpv.distance(p1, p2, a, a);\n\n    if (exports.DEBUG) { console.log(state.step, 'MD[' + a + ']', pi2, pi1, '->', d); }\n\n    state.stack.push(Math.round(d * 64));\n}\n\n// MPPEM[] Measure Pixels Per EM\n// 0x4B\nfunction MPPEM(state) {\n    if (exports.DEBUG) { console.log(state.step, 'MPPEM[]'); }\n    state.stack.push(state.ppem);\n}\n\n// FLIPON[] set the auto FLIP Boolean to ON\n// 0x4D\nfunction FLIPON(state) {\n    if (exports.DEBUG) { console.log(state.step, 'FLIPON[]'); }\n    state.autoFlip = true;\n}\n\n// LT[] Less Than\n// 0x50\nfunction LT(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'LT[]', e2, e1); }\n\n    stack.push(e1 < e2 ? 1 : 0);\n}\n\n// LTEQ[] Less Than or EQual\n// 0x53\nfunction LTEQ(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'LTEQ[]', e2, e1); }\n\n    stack.push(e1 <= e2 ? 1 : 0);\n}\n\n// GTEQ[] Greater Than\n// 0x52\nfunction GT(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'GT[]', e2, e1); }\n\n    stack.push(e1 > e2 ? 1 : 0);\n}\n\n// GTEQ[] Greater Than or EQual\n// 0x53\nfunction GTEQ(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'GTEQ[]', e2, e1); }\n\n    stack.push(e1 >= e2 ? 1 : 0);\n}\n\n// EQ[] EQual\n// 0x54\nfunction EQ(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'EQ[]', e2, e1); }\n\n    stack.push(e2 === e1 ? 1 : 0);\n}\n\n// NEQ[] Not EQual\n// 0x55\nfunction NEQ(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'NEQ[]', e2, e1); }\n\n    stack.push(e2 !== e1 ? 1 : 0);\n}\n\n// ODD[] ODD\n// 0x56\nfunction ODD(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'ODD[]', n); }\n\n    stack.push(Math.trunc(n) % 2 ? 1 : 0);\n}\n\n// EVEN[] EVEN\n// 0x57\nfunction EVEN(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'EVEN[]', n); }\n\n    stack.push(Math.trunc(n) % 2 ? 0 : 1);\n}\n\n// IF[] IF test\n// 0x58\nfunction IF(state) {\n    var test = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'IF[]', test); }\n\n    // if test is true it just continues\n    // if not the ip is skipped until matching ELSE or EIF\n    if (!test) {\n        skip(state, true);\n\n        if (exports.DEBUG) { console.log(state.step,  'EIF[]'); }\n    }\n}\n\n// EIF[] End IF\n// 0x59\nfunction EIF(state) {\n    // this can be reached normally when\n    // executing an else branch.\n    // -> just ignore it\n\n    if (exports.DEBUG) { console.log(state.step, 'EIF[]'); }\n}\n\n// AND[] logical AND\n// 0x5A\nfunction AND(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'AND[]', e2, e1); }\n\n    stack.push(e2 && e1 ? 1 : 0);\n}\n\n// OR[] logical OR\n// 0x5B\nfunction OR(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'OR[]', e2, e1); }\n\n    stack.push(e2 || e1 ? 1 : 0);\n}\n\n// NOT[] logical NOT\n// 0x5C\nfunction NOT(state) {\n    var stack = state.stack;\n    var e = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'NOT[]', e); }\n\n    stack.push(e ? 0 : 1);\n}\n\n// DELTAP1[] DELTA exception P1\n// DELTAP2[] DELTA exception P2\n// DELTAP3[] DELTA exception P3\n// 0x5D, 0x71, 0x72\nfunction DELTAP123(b, state) {\n    var stack = state.stack;\n    var n = stack.pop();\n    var fv = state.fv;\n    var pv = state.pv;\n    var ppem = state.ppem;\n    var base = state.deltaBase + (b - 1) * 16;\n    var ds = state.deltaShift;\n    var z0 = state.z0;\n\n    if (exports.DEBUG) { console.log(state.step, 'DELTAP[' + b + ']', n, stack); }\n\n    for (var i = 0; i < n; i++) {\n        var pi = stack.pop();\n        var arg = stack.pop();\n        var appem = base + ((arg & 0xF0) >> 4);\n        if (appem !== ppem) { continue; }\n\n        var mag = (arg & 0x0F) - 8;\n        if (mag >= 0) { mag++; }\n        if (exports.DEBUG) { console.log(state.step, 'DELTAPFIX', pi, 'by', mag * ds); }\n\n        var p = z0[pi];\n        fv.setRelative(p, p, mag * ds, pv);\n    }\n}\n\n// SDB[] Set Delta Base in the graphics state\n// 0x5E\nfunction SDB(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SDB[]', n); }\n\n    state.deltaBase = n;\n}\n\n// SDS[] Set Delta Shift in the graphics state\n// 0x5F\nfunction SDS(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SDS[]', n); }\n\n    state.deltaShift = Math.pow(0.5, n);\n}\n\n// ADD[] ADD\n// 0x60\nfunction ADD(state) {\n    var stack = state.stack;\n    var n2 = stack.pop();\n    var n1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'ADD[]', n2, n1); }\n\n    stack.push(n1 + n2);\n}\n\n// SUB[] SUB\n// 0x61\nfunction SUB(state) {\n    var stack = state.stack;\n    var n2 = stack.pop();\n    var n1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SUB[]', n2, n1); }\n\n    stack.push(n1 - n2);\n}\n\n// DIV[] DIV\n// 0x62\nfunction DIV(state) {\n    var stack = state.stack;\n    var n2 = stack.pop();\n    var n1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'DIV[]', n2, n1); }\n\n    stack.push(n1 * 64 / n2);\n}\n\n// MUL[] MUL\n// 0x63\nfunction MUL(state) {\n    var stack = state.stack;\n    var n2 = stack.pop();\n    var n1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'MUL[]', n2, n1); }\n\n    stack.push(n1 * n2 / 64);\n}\n\n// ABS[] ABSolute value\n// 0x64\nfunction ABS(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'ABS[]', n); }\n\n    stack.push(Math.abs(n));\n}\n\n// NEG[] NEGate\n// 0x65\nfunction NEG(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'NEG[]', n); }\n\n    stack.push(-n);\n}\n\n// FLOOR[] FLOOR\n// 0x66\nfunction FLOOR(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'FLOOR[]', n); }\n\n    stack.push(Math.floor(n / 0x40) * 0x40);\n}\n\n// CEILING[] CEILING\n// 0x67\nfunction CEILING(state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'CEILING[]', n); }\n\n    stack.push(Math.ceil(n / 0x40) * 0x40);\n}\n\n// ROUND[ab] ROUND value\n// 0x68-0x6B\nfunction ROUND(dt, state) {\n    var stack = state.stack;\n    var n = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'ROUND[]'); }\n\n    stack.push(state.round(n / 0x40) * 0x40);\n}\n\n// WCVTF[] Write Control Value Table in Funits\n// 0x70\nfunction WCVTF(state) {\n    var stack = state.stack;\n    var v = stack.pop();\n    var l = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'WCVTF[]', v, l); }\n\n    state.cvt[l] = v * state.ppem / state.font.unitsPerEm;\n}\n\n// DELTAC1[] DELTA exception C1\n// DELTAC2[] DELTA exception C2\n// DELTAC3[] DELTA exception C3\n// 0x73, 0x74, 0x75\nfunction DELTAC123(b, state) {\n    var stack = state.stack;\n    var n = stack.pop();\n    var ppem = state.ppem;\n    var base = state.deltaBase + (b - 1) * 16;\n    var ds = state.deltaShift;\n\n    if (exports.DEBUG) { console.log(state.step, 'DELTAC[' + b + ']', n, stack); }\n\n    for (var i = 0; i < n; i++) {\n        var c = stack.pop();\n        var arg = stack.pop();\n        var appem = base + ((arg & 0xF0) >> 4);\n        if (appem !== ppem) { continue; }\n\n        var mag = (arg & 0x0F) - 8;\n        if (mag >= 0) { mag++; }\n\n        var delta = mag * ds;\n\n        if (exports.DEBUG) { console.log(state.step, 'DELTACFIX', c, 'by', delta); }\n\n        state.cvt[c] += delta;\n    }\n}\n\n// SROUND[] Super ROUND\n// 0x76\nfunction SROUND(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'SROUND[]', n); }\n\n    state.round = roundSuper;\n\n    var period;\n\n    switch (n & 0xC0) {\n        case 0x00:\n            period = 0.5;\n            break;\n        case 0x40:\n            period = 1;\n            break;\n        case 0x80:\n            period = 2;\n            break;\n        default:\n            throw new Error('invalid SROUND value');\n    }\n\n    state.srPeriod = period;\n\n    switch (n & 0x30) {\n        case 0x00:\n            state.srPhase = 0;\n            break;\n        case 0x10:\n            state.srPhase = 0.25 * period;\n            break;\n        case 0x20:\n            state.srPhase = 0.5  * period;\n            break;\n        case 0x30:\n            state.srPhase = 0.75 * period;\n            break;\n        default: throw new Error('invalid SROUND value');\n    }\n\n    n &= 0x0F;\n\n    if (n === 0) { state.srThreshold = 0; }\n    else { state.srThreshold = (n / 8 - 0.5) * period; }\n}\n\n// S45ROUND[] Super ROUND 45 degrees\n// 0x77\nfunction S45ROUND(state) {\n    var n = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'S45ROUND[]', n); }\n\n    state.round = roundSuper;\n\n    var period;\n\n    switch (n & 0xC0) {\n        case 0x00:\n            period = Math.sqrt(2) / 2;\n            break;\n        case 0x40:\n            period = Math.sqrt(2);\n            break;\n        case 0x80:\n            period = 2 * Math.sqrt(2);\n            break;\n        default:\n            throw new Error('invalid S45ROUND value');\n    }\n\n    state.srPeriod = period;\n\n    switch (n & 0x30) {\n        case 0x00:\n            state.srPhase = 0;\n            break;\n        case 0x10:\n            state.srPhase = 0.25 * period;\n            break;\n        case 0x20:\n            state.srPhase = 0.5  * period;\n            break;\n        case 0x30:\n            state.srPhase = 0.75 * period;\n            break;\n        default:\n            throw new Error('invalid S45ROUND value');\n    }\n\n    n &= 0x0F;\n\n    if (n === 0) { state.srThreshold = 0; }\n    else { state.srThreshold = (n / 8 - 0.5) * period; }\n}\n\n// ROFF[] Round Off\n// 0x7A\nfunction ROFF(state) {\n    if (exports.DEBUG) { console.log(state.step, 'ROFF[]'); }\n\n    state.round = roundOff;\n}\n\n// RUTG[] Round Up To Grid\n// 0x7C\nfunction RUTG(state) {\n    if (exports.DEBUG) { console.log(state.step, 'RUTG[]'); }\n\n    state.round = roundUpToGrid;\n}\n\n// RDTG[] Round Down To Grid\n// 0x7D\nfunction RDTG(state) {\n    if (exports.DEBUG) { console.log(state.step, 'RDTG[]'); }\n\n    state.round = roundDownToGrid;\n}\n\n// SCANCTRL[] SCAN conversion ConTRoL\n// 0x85\nfunction SCANCTRL(state) {\n    var n = state.stack.pop();\n\n    // ignored by opentype.js\n\n    if (exports.DEBUG) { console.log(state.step, 'SCANCTRL[]', n); }\n}\n\n// SDPVTL[a] Set Dual Projection Vector To Line\n// 0x86-0x87\nfunction SDPVTL(a, state) {\n    var stack = state.stack;\n    var p2i = stack.pop();\n    var p1i = stack.pop();\n    var p2 = state.z2[p2i];\n    var p1 = state.z1[p1i];\n\n    if (exports.DEBUG) { console.log(state.step, 'SDPVTL[' + a + ']', p2i, p1i); }\n\n    var dx;\n    var dy;\n\n    if (!a) {\n        dx = p1.x - p2.x;\n        dy = p1.y - p2.y;\n    } else {\n        dx = p2.y - p1.y;\n        dy = p1.x - p2.x;\n    }\n\n    state.dpv = getUnitVector(dx, dy);\n}\n\n// GETINFO[] GET INFOrmation\n// 0x88\nfunction GETINFO(state) {\n    var stack = state.stack;\n    var sel = stack.pop();\n    var r = 0;\n\n    if (exports.DEBUG) { console.log(state.step, 'GETINFO[]', sel); }\n\n    // v35 as in no subpixel hinting\n    if (sel & 0x01) { r = 35; }\n\n    // TODO rotation and stretch currently not supported\n    // and thus those GETINFO are always 0.\n\n    // opentype.js is always gray scaling\n    if (sel & 0x20) { r |= 0x1000; }\n\n    stack.push(r);\n}\n\n// ROLL[] ROLL the top three stack elements\n// 0x8A\nfunction ROLL(state) {\n    var stack = state.stack;\n    var a = stack.pop();\n    var b = stack.pop();\n    var c = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'ROLL[]'); }\n\n    stack.push(b);\n    stack.push(a);\n    stack.push(c);\n}\n\n// MAX[] MAXimum of top two stack elements\n// 0x8B\nfunction MAX(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'MAX[]', e2, e1); }\n\n    stack.push(Math.max(e1, e2));\n}\n\n// MIN[] MINimum of top two stack elements\n// 0x8C\nfunction MIN(state) {\n    var stack = state.stack;\n    var e2 = stack.pop();\n    var e1 = stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'MIN[]', e2, e1); }\n\n    stack.push(Math.min(e1, e2));\n}\n\n// SCANTYPE[] SCANTYPE\n// 0x8D\nfunction SCANTYPE(state) {\n    var n = state.stack.pop();\n    // ignored by opentype.js\n    if (exports.DEBUG) { console.log(state.step, 'SCANTYPE[]', n); }\n}\n\n// INSTCTRL[] INSTCTRL\n// 0x8D\nfunction INSTCTRL(state) {\n    var s = state.stack.pop();\n    var v = state.stack.pop();\n\n    if (exports.DEBUG) { console.log(state.step, 'INSTCTRL[]', s, v); }\n\n    switch (s) {\n        case 1 : state.inhibitGridFit = !!v; return;\n        case 2 : state.ignoreCvt = !!v; return;\n        default: throw new Error('invalid INSTCTRL[] selector');\n    }\n}\n\n// PUSHB[abc] PUSH Bytes\n// 0xB0-0xB7\nfunction PUSHB(n, state) {\n    var stack = state.stack;\n    var prog = state.prog;\n    var ip = state.ip;\n\n    if (exports.DEBUG) { console.log(state.step, 'PUSHB[' + n + ']'); }\n\n    for (var i = 0; i < n; i++) { stack.push(prog[++ip]); }\n\n    state.ip = ip;\n}\n\n// PUSHW[abc] PUSH Words\n// 0xB8-0xBF\nfunction PUSHW(n, state) {\n    var ip = state.ip;\n    var prog = state.prog;\n    var stack = state.stack;\n\n    if (exports.DEBUG) { console.log(state.ip, 'PUSHW[' + n + ']'); }\n\n    for (var i = 0; i < n; i++) {\n        var w = (prog[++ip] << 8) | prog[++ip];\n        if (w & 0x8000) { w = -((w ^ 0xffff) + 1); }\n        stack.push(w);\n    }\n\n    state.ip = ip;\n}\n\n// MDRP[abcde] Move Direct Relative Point\n// 0xD0-0xEF\n// (if indirect is 0)\n//\n// and\n//\n// MIRP[abcde] Move Indirect Relative Point\n// 0xE0-0xFF\n// (if indirect is 1)\n\nfunction MDRP_MIRP(indirect, setRp0, keepD, ro, dt, state) {\n    var stack = state.stack;\n    var cvte = indirect && stack.pop();\n    var pi = stack.pop();\n    var rp0i = state.rp0;\n    var rp = state.z0[rp0i];\n    var p = state.z1[pi];\n\n    var md = state.minDis;\n    var fv = state.fv;\n    var pv = state.dpv;\n    var od; // original distance\n    var d; // moving distance\n    var sign; // sign of distance\n    var cv;\n\n    d = od = pv.distance(p, rp, true, true);\n    sign = d >= 0 ? 1 : -1; // Math.sign would be 0 in case of 0\n\n    // TODO consider autoFlip\n    d = Math.abs(d);\n\n    if (indirect) {\n        cv = state.cvt[cvte];\n\n        if (ro && Math.abs(d - cv) < state.cvCutIn) { d = cv; }\n    }\n\n    if (keepD && d < md) { d = md; }\n\n    if (ro) { d = state.round(d); }\n\n    fv.setRelative(p, rp, sign * d, pv);\n    fv.touch(p);\n\n    if (exports.DEBUG) {\n        console.log(\n            state.step,\n            (indirect ? 'MIRP[' : 'MDRP[') +\n            (setRp0 ? 'M' : 'm') +\n            (keepD ? '>' : '_') +\n            (ro ? 'R' : '_') +\n            (dt === 0 ? 'Gr' : (dt === 1 ? 'Bl' : (dt === 2 ? 'Wh' : ''))) +\n            ']',\n            indirect ?\n                cvte + '(' + state.cvt[cvte] + ',' +  cv + ')' :\n                '',\n            pi,\n            '(d =', od, '->', sign * d, ')'\n        );\n    }\n\n    state.rp1 = state.rp0;\n    state.rp2 = pi;\n    if (setRp0) { state.rp0 = pi; }\n}\n\n/*\n* The instruction table.\n*/\ninstructionTable = [\n    /* 0x00 */ SVTCA.bind(undefined, yUnitVector),\n    /* 0x01 */ SVTCA.bind(undefined, xUnitVector),\n    /* 0x02 */ SPVTCA.bind(undefined, yUnitVector),\n    /* 0x03 */ SPVTCA.bind(undefined, xUnitVector),\n    /* 0x04 */ SFVTCA.bind(undefined, yUnitVector),\n    /* 0x05 */ SFVTCA.bind(undefined, xUnitVector),\n    /* 0x06 */ SPVTL.bind(undefined, 0),\n    /* 0x07 */ SPVTL.bind(undefined, 1),\n    /* 0x08 */ SFVTL.bind(undefined, 0),\n    /* 0x09 */ SFVTL.bind(undefined, 1),\n    /* 0x0A */ SPVFS,\n    /* 0x0B */ SFVFS,\n    /* 0x0C */ GPV,\n    /* 0x0D */ GFV,\n    /* 0x0E */ SFVTPV,\n    /* 0x0F */ ISECT,\n    /* 0x10 */ SRP0,\n    /* 0x11 */ SRP1,\n    /* 0x12 */ SRP2,\n    /* 0x13 */ SZP0,\n    /* 0x14 */ SZP1,\n    /* 0x15 */ SZP2,\n    /* 0x16 */ SZPS,\n    /* 0x17 */ SLOOP,\n    /* 0x18 */ RTG,\n    /* 0x19 */ RTHG,\n    /* 0x1A */ SMD,\n    /* 0x1B */ ELSE,\n    /* 0x1C */ JMPR,\n    /* 0x1D */ SCVTCI,\n    /* 0x1E */ undefined,   // TODO SSWCI\n    /* 0x1F */ undefined,   // TODO SSW\n    /* 0x20 */ DUP,\n    /* 0x21 */ POP,\n    /* 0x22 */ CLEAR,\n    /* 0x23 */ SWAP,\n    /* 0x24 */ DEPTH,\n    /* 0x25 */ CINDEX,\n    /* 0x26 */ MINDEX,\n    /* 0x27 */ undefined,   // TODO ALIGNPTS\n    /* 0x28 */ undefined,\n    /* 0x29 */ undefined,   // TODO UTP\n    /* 0x2A */ LOOPCALL,\n    /* 0x2B */ CALL,\n    /* 0x2C */ FDEF,\n    /* 0x2D */ undefined,   // ENDF (eaten by FDEF)\n    /* 0x2E */ MDAP.bind(undefined, 0),\n    /* 0x2F */ MDAP.bind(undefined, 1),\n    /* 0x30 */ IUP.bind(undefined, yUnitVector),\n    /* 0x31 */ IUP.bind(undefined, xUnitVector),\n    /* 0x32 */ SHP.bind(undefined, 0),\n    /* 0x33 */ SHP.bind(undefined, 1),\n    /* 0x34 */ SHC.bind(undefined, 0),\n    /* 0x35 */ SHC.bind(undefined, 1),\n    /* 0x36 */ SHZ.bind(undefined, 0),\n    /* 0x37 */ SHZ.bind(undefined, 1),\n    /* 0x38 */ SHPIX,\n    /* 0x39 */ IP,\n    /* 0x3A */ MSIRP.bind(undefined, 0),\n    /* 0x3B */ MSIRP.bind(undefined, 1),\n    /* 0x3C */ ALIGNRP,\n    /* 0x3D */ RTDG,\n    /* 0x3E */ MIAP.bind(undefined, 0),\n    /* 0x3F */ MIAP.bind(undefined, 1),\n    /* 0x40 */ NPUSHB,\n    /* 0x41 */ NPUSHW,\n    /* 0x42 */ WS,\n    /* 0x43 */ RS,\n    /* 0x44 */ WCVTP,\n    /* 0x45 */ RCVT,\n    /* 0x46 */ GC.bind(undefined, 0),\n    /* 0x47 */ GC.bind(undefined, 1),\n    /* 0x48 */ undefined,   // TODO SCFS\n    /* 0x49 */ MD.bind(undefined, 0),\n    /* 0x4A */ MD.bind(undefined, 1),\n    /* 0x4B */ MPPEM,\n    /* 0x4C */ undefined,   // TODO MPS\n    /* 0x4D */ FLIPON,\n    /* 0x4E */ undefined,   // TODO FLIPOFF\n    /* 0x4F */ undefined,   // TODO DEBUG\n    /* 0x50 */ LT,\n    /* 0x51 */ LTEQ,\n    /* 0x52 */ GT,\n    /* 0x53 */ GTEQ,\n    /* 0x54 */ EQ,\n    /* 0x55 */ NEQ,\n    /* 0x56 */ ODD,\n    /* 0x57 */ EVEN,\n    /* 0x58 */ IF,\n    /* 0x59 */ EIF,\n    /* 0x5A */ AND,\n    /* 0x5B */ OR,\n    /* 0x5C */ NOT,\n    /* 0x5D */ DELTAP123.bind(undefined, 1),\n    /* 0x5E */ SDB,\n    /* 0x5F */ SDS,\n    /* 0x60 */ ADD,\n    /* 0x61 */ SUB,\n    /* 0x62 */ DIV,\n    /* 0x63 */ MUL,\n    /* 0x64 */ ABS,\n    /* 0x65 */ NEG,\n    /* 0x66 */ FLOOR,\n    /* 0x67 */ CEILING,\n    /* 0x68 */ ROUND.bind(undefined, 0),\n    /* 0x69 */ ROUND.bind(undefined, 1),\n    /* 0x6A */ ROUND.bind(undefined, 2),\n    /* 0x6B */ ROUND.bind(undefined, 3),\n    /* 0x6C */ undefined,   // TODO NROUND[ab]\n    /* 0x6D */ undefined,   // TODO NROUND[ab]\n    /* 0x6E */ undefined,   // TODO NROUND[ab]\n    /* 0x6F */ undefined,   // TODO NROUND[ab]\n    /* 0x70 */ WCVTF,\n    /* 0x71 */ DELTAP123.bind(undefined, 2),\n    /* 0x72 */ DELTAP123.bind(undefined, 3),\n    /* 0x73 */ DELTAC123.bind(undefined, 1),\n    /* 0x74 */ DELTAC123.bind(undefined, 2),\n    /* 0x75 */ DELTAC123.bind(undefined, 3),\n    /* 0x76 */ SROUND,\n    /* 0x77 */ S45ROUND,\n    /* 0x78 */ undefined,   // TODO JROT[]\n    /* 0x79 */ undefined,   // TODO JROF[]\n    /* 0x7A */ ROFF,\n    /* 0x7B */ undefined,\n    /* 0x7C */ RUTG,\n    /* 0x7D */ RDTG,\n    /* 0x7E */ POP, // actually SANGW, supposed to do only a pop though\n    /* 0x7F */ POP, // actually AA, supposed to do only a pop though\n    /* 0x80 */ undefined,   // TODO FLIPPT\n    /* 0x81 */ undefined,   // TODO FLIPRGON\n    /* 0x82 */ undefined,   // TODO FLIPRGOFF\n    /* 0x83 */ undefined,\n    /* 0x84 */ undefined,\n    /* 0x85 */ SCANCTRL,\n    /* 0x86 */ SDPVTL.bind(undefined, 0),\n    /* 0x87 */ SDPVTL.bind(undefined, 1),\n    /* 0x88 */ GETINFO,\n    /* 0x89 */ undefined,   // TODO IDEF\n    /* 0x8A */ ROLL,\n    /* 0x8B */ MAX,\n    /* 0x8C */ MIN,\n    /* 0x8D */ SCANTYPE,\n    /* 0x8E */ INSTCTRL,\n    /* 0x8F */ undefined,\n    /* 0x90 */ undefined,\n    /* 0x91 */ undefined,\n    /* 0x92 */ undefined,\n    /* 0x93 */ undefined,\n    /* 0x94 */ undefined,\n    /* 0x95 */ undefined,\n    /* 0x96 */ undefined,\n    /* 0x97 */ undefined,\n    /* 0x98 */ undefined,\n    /* 0x99 */ undefined,\n    /* 0x9A */ undefined,\n    /* 0x9B */ undefined,\n    /* 0x9C */ undefined,\n    /* 0x9D */ undefined,\n    /* 0x9E */ undefined,\n    /* 0x9F */ undefined,\n    /* 0xA0 */ undefined,\n    /* 0xA1 */ undefined,\n    /* 0xA2 */ undefined,\n    /* 0xA3 */ undefined,\n    /* 0xA4 */ undefined,\n    /* 0xA5 */ undefined,\n    /* 0xA6 */ undefined,\n    /* 0xA7 */ undefined,\n    /* 0xA8 */ undefined,\n    /* 0xA9 */ undefined,\n    /* 0xAA */ undefined,\n    /* 0xAB */ undefined,\n    /* 0xAC */ undefined,\n    /* 0xAD */ undefined,\n    /* 0xAE */ undefined,\n    /* 0xAF */ undefined,\n    /* 0xB0 */ PUSHB.bind(undefined, 1),\n    /* 0xB1 */ PUSHB.bind(undefined, 2),\n    /* 0xB2 */ PUSHB.bind(undefined, 3),\n    /* 0xB3 */ PUSHB.bind(undefined, 4),\n    /* 0xB4 */ PUSHB.bind(undefined, 5),\n    /* 0xB5 */ PUSHB.bind(undefined, 6),\n    /* 0xB6 */ PUSHB.bind(undefined, 7),\n    /* 0xB7 */ PUSHB.bind(undefined, 8),\n    /* 0xB8 */ PUSHW.bind(undefined, 1),\n    /* 0xB9 */ PUSHW.bind(undefined, 2),\n    /* 0xBA */ PUSHW.bind(undefined, 3),\n    /* 0xBB */ PUSHW.bind(undefined, 4),\n    /* 0xBC */ PUSHW.bind(undefined, 5),\n    /* 0xBD */ PUSHW.bind(undefined, 6),\n    /* 0xBE */ PUSHW.bind(undefined, 7),\n    /* 0xBF */ PUSHW.bind(undefined, 8),\n    /* 0xC0 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 0, 0),\n    /* 0xC1 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 0, 1),\n    /* 0xC2 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 0, 2),\n    /* 0xC3 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 0, 3),\n    /* 0xC4 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 1, 0),\n    /* 0xC5 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 1, 1),\n    /* 0xC6 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 1, 2),\n    /* 0xC7 */ MDRP_MIRP.bind(undefined, 0, 0, 0, 1, 3),\n    /* 0xC8 */ MDRP_MIRP.bind(undefined, 0, 0, 1, 0, 0),\n    /* 0xC9 */ MDRP_MIRP.bind(undefined, 0, 0, 1, 0, 1),\n    /* 0xCA */ MDRP_MIRP.bind(undefined, 0, 0, 1, 0, 2),\n    /* 0xCB */ MDRP_MIRP.bind(undefined, 0, 0, 1, 0, 3),\n    /* 0xCC */ MDRP_MIRP.bind(undefined, 0, 0, 1, 1, 0),\n    /* 0xCD */ MDRP_MIRP.bind(undefined, 0, 0, 1, 1, 1),\n    /* 0xCE */ MDRP_MIRP.bind(undefined, 0, 0, 1, 1, 2),\n    /* 0xCF */ MDRP_MIRP.bind(undefined, 0, 0, 1, 1, 3),\n    /* 0xD0 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 0, 0),\n    /* 0xD1 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 0, 1),\n    /* 0xD2 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 0, 2),\n    /* 0xD3 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 0, 3),\n    /* 0xD4 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 1, 0),\n    /* 0xD5 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 1, 1),\n    /* 0xD6 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 1, 2),\n    /* 0xD7 */ MDRP_MIRP.bind(undefined, 0, 1, 0, 1, 3),\n    /* 0xD8 */ MDRP_MIRP.bind(undefined, 0, 1, 1, 0, 0),\n    /* 0xD9 */ MDRP_MIRP.bind(undefined, 0, 1, 1, 0, 1),\n    /* 0xDA */ MDRP_MIRP.bind(undefined, 0, 1, 1, 0, 2),\n    /* 0xDB */ MDRP_MIRP.bind(undefined, 0, 1, 1, 0, 3),\n    /* 0xDC */ MDRP_MIRP.bind(undefined, 0, 1, 1, 1, 0),\n    /* 0xDD */ MDRP_MIRP.bind(undefined, 0, 1, 1, 1, 1),\n    /* 0xDE */ MDRP_MIRP.bind(undefined, 0, 1, 1, 1, 2),\n    /* 0xDF */ MDRP_MIRP.bind(undefined, 0, 1, 1, 1, 3),\n    /* 0xE0 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 0, 0),\n    /* 0xE1 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 0, 1),\n    /* 0xE2 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 0, 2),\n    /* 0xE3 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 0, 3),\n    /* 0xE4 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 1, 0),\n    /* 0xE5 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 1, 1),\n    /* 0xE6 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 1, 2),\n    /* 0xE7 */ MDRP_MIRP.bind(undefined, 1, 0, 0, 1, 3),\n    /* 0xE8 */ MDRP_MIRP.bind(undefined, 1, 0, 1, 0, 0),\n    /* 0xE9 */ MDRP_MIRP.bind(undefined, 1, 0, 1, 0, 1),\n    /* 0xEA */ MDRP_MIRP.bind(undefined, 1, 0, 1, 0, 2),\n    /* 0xEB */ MDRP_MIRP.bind(undefined, 1, 0, 1, 0, 3),\n    /* 0xEC */ MDRP_MIRP.bind(undefined, 1, 0, 1, 1, 0),\n    /* 0xED */ MDRP_MIRP.bind(undefined, 1, 0, 1, 1, 1),\n    /* 0xEE */ MDRP_MIRP.bind(undefined, 1, 0, 1, 1, 2),\n    /* 0xEF */ MDRP_MIRP.bind(undefined, 1, 0, 1, 1, 3),\n    /* 0xF0 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 0, 0),\n    /* 0xF1 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 0, 1),\n    /* 0xF2 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 0, 2),\n    /* 0xF3 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 0, 3),\n    /* 0xF4 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 1, 0),\n    /* 0xF5 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 1, 1),\n    /* 0xF6 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 1, 2),\n    /* 0xF7 */ MDRP_MIRP.bind(undefined, 1, 1, 0, 1, 3),\n    /* 0xF8 */ MDRP_MIRP.bind(undefined, 1, 1, 1, 0, 0),\n    /* 0xF9 */ MDRP_MIRP.bind(undefined, 1, 1, 1, 0, 1),\n    /* 0xFA */ MDRP_MIRP.bind(undefined, 1, 1, 1, 0, 2),\n    /* 0xFB */ MDRP_MIRP.bind(undefined, 1, 1, 1, 0, 3),\n    /* 0xFC */ MDRP_MIRP.bind(undefined, 1, 1, 1, 1, 0),\n    /* 0xFD */ MDRP_MIRP.bind(undefined, 1, 1, 1, 1, 1),\n    /* 0xFE */ MDRP_MIRP.bind(undefined, 1, 1, 1, 1, 2),\n    /* 0xFF */ MDRP_MIRP.bind(undefined, 1, 1, 1, 1, 3)\n];\n\n/*****************************\n  Mathematical Considerations\n******************************\n\nfv ... refers to freedom vector\npv ... refers to projection vector\nrp ... refers to reference point\np  ... refers to to point being operated on\nd  ... refers to distance\n\nSETRELATIVE:\n============\n\ncase freedom vector == x-axis:\n------------------------------\n\n                        (pv)\n                     .-'\n              rpd .-'\n               .-*\n          d .-'90°'\n         .-'       '\n      .-'           '\n   *-'               ' b\n  rp                  '\n                       '\n                        '\n            p *----------*-------------- (fv)\n                          pm\n\n  rpdx = rpx + d * pv.x\n  rpdy = rpy + d * pv.y\n\n  equation of line b\n\n   y - rpdy = pvns * (x- rpdx)\n\n   y = p.y\n\n   x = rpdx + ( p.y - rpdy ) / pvns\n\n\ncase freedom vector == y-axis:\n------------------------------\n\n    * pm\n    |\\\n    | \\\n    |  \\\n    |   \\\n    |    \\\n    |     \\\n    |      \\\n    |       \\\n    |        \\\n    |         \\ b\n    |          \\\n    |           \\\n    |            \\    .-' (pv)\n    |         90° \\.-'\n    |           .-'* rpd\n    |        .-'\n    *     *-'  d\n    p     rp\n\n  rpdx = rpx + d * pv.x\n  rpdy = rpy + d * pv.y\n\n  equation of line b:\n           pvns ... normal slope to pv\n\n   y - rpdy = pvns * (x - rpdx)\n\n   x = p.x\n\n   y = rpdy +  pvns * (p.x - rpdx)\n\n\n\ngeneric case:\n-------------\n\n\n                              .'(fv)\n                            .'\n                          .* pm\n                        .' !\n                      .'    .\n                    .'      !\n                  .'         . b\n                .'           !\n               *              .\n              p               !\n                         90°   .    ... (pv)\n                           ...-*-'''\n                  ...---'''    rpd\n         ...---'''   d\n   *--'''\n  rp\n\n    rpdx = rpx + d * pv.x\n    rpdy = rpy + d * pv.y\n\n equation of line b:\n    pvns... normal slope to pv\n\n    y - rpdy = pvns * (x - rpdx)\n\n equation of freedom vector line:\n    fvs ... slope of freedom vector (=fy/fx)\n\n    y - py = fvs * (x - px)\n\n\n  on pm both equations are true for same x/y\n\n    y - rpdy = pvns * (x - rpdx)\n\n    y - py = fvs * (x - px)\n\n  form to y and set equal:\n\n    pvns * (x - rpdx) + rpdy = fvs * (x - px) + py\n\n  expand:\n\n    pvns * x - pvns * rpdx + rpdy = fvs * x - fvs * px + py\n\n  switch:\n\n    fvs * x - fvs * px + py = pvns * x - pvns * rpdx + rpdy\n\n  solve for x:\n\n    fvs * x - pvns * x = fvs * px - pvns * rpdx - py + rpdy\n\n\n\n          fvs * px - pvns * rpdx + rpdy - py\n    x =  -----------------------------------\n                 fvs - pvns\n\n  and:\n\n    y = fvs * (x - px) + py\n\n\n\nINTERPOLATE:\n============\n\nExamples of point interpolation.\n\nThe weight of the movement of the reference point gets bigger\nthe further the other reference point is away, thus the safest\noption (that is avoiding 0/0 divisions) is to weight the\noriginal distance of the other point by the sum of both distances.\n\nIf the sum of both distances is 0, then move the point by the\narithmetic average of the movement of both reference points.\n\n\n\n\n           (+6)\n    rp1o *---->*rp1\n         .     .                          (+12)\n         .     .                  rp2o *---------->* rp2\n         .     .                       .           .\n         .     .                       .           .\n         .    10          20           .           .\n         |.........|...................|           .\n               .   .                               .\n               .   . (+8)                          .\n                po *------>*p                      .\n               .           .                       .\n               .    12     .          24           .\n               |...........|.......................|\n                                  36\n\n\n-------\n\n\n\n           (+10)\n    rp1o *-------->*rp1\n         .         .                      (-10)\n         .         .              rp2 *<---------* rpo2\n         .         .                   .         .\n         .         .                   .         .\n         .    10   .          30       .         .\n         |.........|.............................|\n                   .                   .\n                   . (+5)              .\n                po *--->* p            .\n                   .    .              .\n                   .    .   20         .\n                   |....|..............|\n                     5        15\n\n\n-------\n\n\n           (+10)\n    rp1o *-------->*rp1\n         .         .\n         .         .\n    rp2o *-------->*rp2\n\n\n                               (+10)\n                          po *-------->* p\n\n-------\n\n\n           (+10)\n    rp1o *-------->*rp1\n         .         .\n         .         .(+30)\n    rp2o *---------------------------->*rp2\n\n\n                                        (+25)\n                          po *----------------------->* p\n\n\n\nvim: set ts=4 sw=4 expandtab:\n*****/\n\n/**\n * Converts a string into a list of tokens.\n */\n\n/**\n * Create a new token\n * @param {string} char a single char\n */\nfunction Token(char) {\n    this.char = char;\n    this.state = {};\n    this.activeState = null;\n}\n\n/**\n * Create a new context range\n * @param {number} startIndex range start index\n * @param {number} endOffset range end index offset\n * @param {string} contextName owner context name\n */\nfunction ContextRange(startIndex, endOffset, contextName) {\n    this.contextName = contextName;\n    this.startIndex = startIndex;\n    this.endOffset = endOffset;\n}\n\n/**\n * Check context start and end\n * @param {string} contextName a unique context name\n * @param {function} checkStart a predicate function the indicates a context's start\n * @param {function} checkEnd a predicate function the indicates a context's end\n */\nfunction ContextChecker(contextName, checkStart, checkEnd) {\n    this.contextName = contextName;\n    this.openRange = null;\n    this.ranges = [];\n    this.checkStart = checkStart;\n    this.checkEnd = checkEnd;\n}\n\n/**\n * @typedef ContextParams\n * @type Object\n * @property {array} context context items\n * @property {number} currentIndex current item index\n */\n\n/**\n * Create a context params\n * @param {array} context a list of items\n * @param {number} currentIndex current item index\n */\nfunction ContextParams(context, currentIndex) {\n    this.context = context;\n    this.index = currentIndex;\n    this.length = context.length;\n    this.current = context[currentIndex];\n    this.backtrack = context.slice(0, currentIndex);\n    this.lookahead = context.slice(currentIndex + 1);\n}\n\n/**\n * Create an event instance\n * @param {string} eventId event unique id\n */\nfunction Event(eventId) {\n    this.eventId = eventId;\n    this.subscribers = [];\n}\n\n/**\n * Initialize a core events and auto subscribe required event handlers\n * @param {any} events an object that enlists core events handlers\n */\nfunction initializeCoreEvents(events) {\n    var this$1 = this;\n\n    var coreEvents = [\n        'start', 'end', 'next', 'newToken', 'contextStart',\n        'contextEnd', 'insertToken', 'removeToken', 'removeRange',\n        'replaceToken', 'replaceRange', 'composeRUD', 'updateContextsRanges'\n    ];\n\n    coreEvents.forEach(function (eventId) {\n        Object.defineProperty(this$1.events, eventId, {\n            value: new Event(eventId)\n        });\n    });\n\n    if (!!events) {\n        coreEvents.forEach(function (eventId) {\n            var event = events[eventId];\n            if (typeof event === 'function') {\n                this$1.events[eventId].subscribe(event);\n            }\n        });\n    }\n    var requiresContextUpdate = [\n        'insertToken', 'removeToken', 'removeRange',\n        'replaceToken', 'replaceRange', 'composeRUD'\n    ];\n    requiresContextUpdate.forEach(function (eventId) {\n        this$1.events[eventId].subscribe(\n            this$1.updateContextsRanges\n        );\n    });\n}\n\n/**\n * Converts a string into a list of tokens\n * @param {any} events tokenizer core events\n */\nfunction Tokenizer(events) {\n    this.tokens = [];\n    this.registeredContexts = {};\n    this.contextCheckers = [];\n    this.events = {};\n    this.registeredModifiers = [];\n\n    initializeCoreEvents.call(this, events);\n}\n\n/**\n * Sets the state of a token, usually called by a state modifier.\n * @param {string} key state item key\n * @param {any} value state item value\n */\nToken.prototype.setState = function(key, value) {\n    this.state[key] = value;\n    this.activeState = { key: key, value: this.state[key] };\n    return this.activeState;\n};\n\nToken.prototype.getState = function (stateId) {\n    return this.state[stateId] || null;\n};\n\n/**\n * Checks if an index exists in the tokens list.\n * @param {number} index token index\n */\nTokenizer.prototype.inboundIndex = function(index) {\n    return index >= 0 && index < this.tokens.length;\n};\n\n/**\n * Compose and apply a list of operations (replace, update, delete)\n * @param {array} RUDs replace, update and delete operations\n * TODO: Perf. Optimization (lengthBefore === lengthAfter ? dispatch once)\n */\nTokenizer.prototype.composeRUD = function (RUDs) {\n    var this$1 = this;\n\n    var silent = true;\n    var state = RUDs.map(function (RUD) { return (\n        this$1[RUD[0]].apply(this$1, RUD.slice(1).concat(silent))\n    ); });\n    var hasFAILObject = function (obj) { return (\n        typeof obj === 'object' &&\n        obj.hasOwnProperty('FAIL')\n    ); };\n    if (state.every(hasFAILObject)) {\n        return {\n            FAIL: \"composeRUD: one or more operations hasn't completed successfully\",\n            report: state.filter(hasFAILObject)\n        };\n    }\n    this.dispatch('composeRUD', [state.filter(function (op) { return !hasFAILObject(op); })]);\n};\n\n/**\n * Replace a range of tokens with a list of tokens\n * @param {number} startIndex range start index\n * @param {number} offset range offset\n * @param {token} tokens a list of tokens to replace\n * @param {boolean} silent dispatch events and update context ranges\n */\nTokenizer.prototype.replaceRange = function (startIndex, offset, tokens, silent) {\n    offset = offset !== null ? offset : this.tokens.length;\n    var isTokenType = tokens.every(function (token) { return token instanceof Token; });\n    if (!isNaN(startIndex) && this.inboundIndex(startIndex) && isTokenType) {\n        var replaced = this.tokens.splice.apply(\n            this.tokens, [startIndex, offset].concat(tokens)\n        );\n        if (!silent) { this.dispatch('replaceToken', [startIndex, offset, tokens]); }\n        return [replaced, tokens];\n    } else {\n        return { FAIL: 'replaceRange: invalid tokens or startIndex.' };\n    }\n};\n\n/**\n * Replace a token with another token\n * @param {number} index token index\n * @param {token} token a token to replace\n * @param {boolean} silent dispatch events and update context ranges\n */\nTokenizer.prototype.replaceToken = function (index, token, silent) {\n    if (!isNaN(index) && this.inboundIndex(index) && token instanceof Token) {\n        var replaced = this.tokens.splice(index, 1, token);\n        if (!silent) { this.dispatch('replaceToken', [index, token]); }\n        return [replaced[0], token];\n    } else {\n        return { FAIL: 'replaceToken: invalid token or index.' };\n    }\n};\n\n/**\n * Removes a range of tokens\n * @param {number} startIndex range start index\n * @param {number} offset range offset\n * @param {boolean} silent dispatch events and update context ranges\n */\nTokenizer.prototype.removeRange = function(startIndex, offset, silent) {\n    offset = !isNaN(offset) ? offset : this.tokens.length;\n    var tokens = this.tokens.splice(startIndex, offset);\n    if (!silent) { this.dispatch('removeRange', [tokens, startIndex, offset]); }\n    return tokens;\n};\n\n/**\n * Remove a token at a certain index\n * @param {number} index token index\n * @param {boolean} silent dispatch events and update context ranges\n */\nTokenizer.prototype.removeToken = function(index, silent) {\n    if (!isNaN(index) && this.inboundIndex(index)) {\n        var token = this.tokens.splice(index, 1);\n        if (!silent) { this.dispatch('removeToken', [token, index]); }\n        return token;\n    } else {\n        return { FAIL: 'removeToken: invalid token index.' };\n    }\n};\n\n/**\n * Insert a list of tokens at a certain index\n * @param {array} tokens a list of tokens to insert\n * @param {number} index insert the list of tokens at index\n * @param {boolean} silent dispatch events and update context ranges\n */\nTokenizer.prototype.insertToken = function (tokens, index, silent) {\n    var tokenType = tokens.every(\n        function (token) { return token instanceof Token; }\n    );\n    if (tokenType) {\n        this.tokens.splice.apply(\n            this.tokens, [index, 0].concat(tokens)\n        );\n        if (!silent) { this.dispatch('insertToken', [tokens, index]); }\n        return tokens;\n    } else {\n        return { FAIL: 'insertToken: invalid token(s).' };\n    }\n};\n\n/**\n * A state modifier that is called on 'newToken' event\n * @param {string} modifierId state modifier id\n * @param {function} condition a predicate function that returns true or false\n * @param {function} modifier a function to update token state\n */\nTokenizer.prototype.registerModifier = function(modifierId, condition, modifier) {\n    this.events.newToken.subscribe(function(token, contextParams) {\n        var conditionParams = [token, contextParams];\n        var canApplyModifier = (\n            condition === null ||\n            condition.apply(this, conditionParams) === true\n        );\n        var modifierParams = [token, contextParams];\n        if (canApplyModifier) {\n            var newStateValue = modifier.apply(this, modifierParams);\n            token.setState(modifierId, newStateValue);\n        }\n    });\n    this.registeredModifiers.push(modifierId);\n};\n\n/**\n * Subscribe a handler to an event\n * @param {function} eventHandler an event handler function\n */\nEvent.prototype.subscribe = function (eventHandler) {\n    if (typeof eventHandler === 'function') {\n        return ((this.subscribers.push(eventHandler)) - 1);\n    } else {\n        return { FAIL: (\"invalid '\" + (this.eventId) + \"' event handler\")};\n    }\n};\n\n/**\n * Unsubscribe an event handler\n * @param {string} subsId subscription id\n */\nEvent.prototype.unsubscribe = function (subsId) {\n    this.subscribers.splice(subsId, 1);\n};\n\n/**\n * Sets context params current value index\n * @param {number} index context params current value index\n */\nContextParams.prototype.setCurrentIndex = function(index) {\n    this.index = index;\n    this.current = this.context[index];\n    this.backtrack = this.context.slice(0, index);\n    this.lookahead = this.context.slice(index + 1);\n};\n\n/**\n * Get an item at an offset from the current value\n * example (current value is 3):\n *  1    2   [3]   4    5   |   items values\n * -2   -1    0    1    2   |   offset values\n * @param {number} offset an offset from current value index\n */\nContextParams.prototype.get = function (offset) {\n    switch (true) {\n        case (offset === 0):\n            return this.current;\n        case (offset < 0 && Math.abs(offset) <= this.backtrack.length):\n            return this.backtrack.slice(offset)[0];\n        case (offset > 0 && offset <= this.lookahead.length):\n            return this.lookahead[offset - 1];\n        default:\n            return null;\n    }\n};\n\n/**\n * Converts a context range into a string value\n * @param {contextRange} range a context range\n */\nTokenizer.prototype.rangeToText = function (range) {\n    if (range instanceof ContextRange) {\n        return (\n            this.getRangeTokens(range)\n                .map(function (token) { return token.char; }).join('')\n        );\n    }\n};\n\n/**\n * Converts all tokens into a string\n */\nTokenizer.prototype.getText = function () {\n    return this.tokens.map(function (token) { return token.char; }).join('');\n};\n\n/**\n * Get a context by name\n * @param {string} contextName context name to get\n */\nTokenizer.prototype.getContext = function (contextName) {\n    var context = this.registeredContexts[contextName];\n    return !!context ? context : null;\n};\n\n/**\n * Subscribes a new event handler to an event\n * @param {string} eventName event name to subscribe to\n * @param {function} eventHandler a function to be invoked on event\n */\nTokenizer.prototype.on = function(eventName, eventHandler) {\n    var event = this.events[eventName];\n    if (!!event) {\n        return event.subscribe(eventHandler);\n    } else {\n        return null;\n    }\n};\n\n/**\n * Dispatches an event\n * @param {string} eventName event name\n * @param {any} args event handler arguments\n */\nTokenizer.prototype.dispatch = function(eventName, args) {\n    var this$1 = this;\n\n    var event = this.events[eventName];\n    if (event instanceof Event) {\n        event.subscribers.forEach(function (subscriber) {\n            subscriber.apply(this$1, args || []);\n        });\n    }\n};\n\n/**\n * Register a new context checker\n * @param {string} contextName a unique context name\n * @param {function} contextStartCheck a predicate function that returns true on context start\n * @param {function} contextEndCheck  a predicate function that returns true on context end\n * TODO: call tokenize on registration to update context ranges with the new context.\n */\nTokenizer.prototype.registerContextChecker = function(contextName, contextStartCheck, contextEndCheck) {\n    if (!!this.getContext(contextName)) { return {\n        FAIL:\n        (\"context name '\" + contextName + \"' is already registered.\")\n    }; }\n    if (typeof contextStartCheck !== 'function') { return {\n        FAIL:\n        \"missing context start check.\"\n    }; }\n    if (typeof contextEndCheck !== 'function') { return {\n        FAIL:\n        \"missing context end check.\"\n    }; }\n    var contextCheckers = new ContextChecker(\n        contextName, contextStartCheck, contextEndCheck\n    );\n    this.registeredContexts[contextName] = contextCheckers;\n    this.contextCheckers.push(contextCheckers);\n    return contextCheckers;\n};\n\n/**\n * Gets a context range tokens\n * @param {contextRange} range a context range\n */\nTokenizer.prototype.getRangeTokens = function(range) {\n    var endIndex = range.startIndex + range.endOffset;\n    return [].concat(\n        this.tokens\n            .slice(range.startIndex, endIndex)\n    );\n};\n\n/**\n * Gets the ranges of a context\n * @param {string} contextName context name\n */\nTokenizer.prototype.getContextRanges = function(contextName) {\n    var context = this.getContext(contextName);\n    if (!!context) {\n        return context.ranges;\n    } else {\n        return { FAIL: (\"context checker '\" + contextName + \"' is not registered.\") };\n    }\n};\n\n/**\n * Resets context ranges to run context update\n */\nTokenizer.prototype.resetContextsRanges = function () {\n    var registeredContexts = this.registeredContexts;\n    for (var contextName in registeredContexts) {\n        if (registeredContexts.hasOwnProperty(contextName)) {\n            var context = registeredContexts[contextName];\n            context.ranges = [];\n        }\n    }\n};\n\n/**\n * Updates context ranges\n */\nTokenizer.prototype.updateContextsRanges = function () {\n    this.resetContextsRanges();\n    var chars = this.tokens.map(function (token) { return token.char; });\n    for (var i = 0; i < chars.length; i++) {\n        var contextParams = new ContextParams(chars, i);\n        this.runContextCheck(contextParams);\n    }\n    this.dispatch('updateContextsRanges', [this.registeredContexts]);\n};\n\n/**\n * Sets the end offset of an open range\n * @param {number} offset range end offset\n * @param {string} contextName context name\n */\nTokenizer.prototype.setEndOffset = function (offset, contextName) {\n    var startIndex = this.getContext(contextName).openRange.startIndex;\n    var range = new ContextRange(startIndex, offset, contextName);\n    var ranges = this.getContext(contextName).ranges;\n    range.rangeId = contextName + \".\" + (ranges.length);\n    ranges.push(range);\n    this.getContext(contextName).openRange = null;\n    return range;\n};\n\n/**\n * Runs a context check on the current context\n * @param {contextParams} contextParams current context params\n */\nTokenizer.prototype.runContextCheck = function(contextParams) {\n    var this$1 = this;\n\n    var index = contextParams.index;\n    this.contextCheckers.forEach(function (contextChecker) {\n        var contextName = contextChecker.contextName;\n        var openRange = this$1.getContext(contextName).openRange;\n        if (!openRange && contextChecker.checkStart(contextParams)) {\n            openRange = new ContextRange(index, null, contextName);\n            this$1.getContext(contextName).openRange = openRange;\n            this$1.dispatch('contextStart', [contextName, index]);\n        }\n        if (!!openRange && contextChecker.checkEnd(contextParams)) {\n            var offset = (index - openRange.startIndex) + 1;\n            var range = this$1.setEndOffset(offset, contextName);\n            this$1.dispatch('contextEnd', [contextName, range]);\n        }\n    });\n};\n\n/**\n * Converts a text into a list of tokens\n * @param {string} text a text to tokenize\n */\nTokenizer.prototype.tokenize = function (text) {\n    this.tokens = [];\n    this.resetContextsRanges();\n    var chars = Array.from(text);\n    this.dispatch('start');\n    for (var i = 0; i < chars.length; i++) {\n        var char = chars[i];\n        var contextParams = new ContextParams(chars, i);\n        this.dispatch('next', [contextParams]);\n        this.runContextCheck(contextParams);\n        var token = new Token(char);\n        this.tokens.push(token);\n        this.dispatch('newToken', [token, contextParams]);\n    }\n    this.dispatch('end', [this.tokens]);\n    return this.tokens;\n};\n\n// ╭─┄┄┄────────────────────────┄─────────────────────────────────────────────╮\n// ┊ Character Class Assertions ┊ Checks if a char belongs to a certain class ┊\n// ╰─╾──────────────────────────┄─────────────────────────────────────────────╯\n// jscs:disable maximumLineLength\n/**\n * Check if a char is Arabic\n * @param {string} c a single char\n */\nfunction isArabicChar(c) {\n    return /[\\u0600-\\u065F\\u066A-\\u06D2\\u06FA-\\u06FF]/.test(c);\n}\n\n/**\n * Check if a char is an isolated arabic char\n * @param {string} c a single char\n */\nfunction isIsolatedArabicChar(char) {\n    return /[\\u0630\\u0690\\u0621\\u0631\\u0661\\u0671\\u0622\\u0632\\u0672\\u0692\\u06C2\\u0623\\u0673\\u0693\\u06C3\\u0624\\u0694\\u06C4\\u0625\\u0675\\u0695\\u06C5\\u06E5\\u0676\\u0696\\u06C6\\u0627\\u0677\\u0697\\u06C7\\u0648\\u0688\\u0698\\u06C8\\u0689\\u0699\\u06C9\\u068A\\u06CA\\u066B\\u068B\\u06CB\\u068C\\u068D\\u06CD\\u06FD\\u068E\\u06EE\\u06FE\\u062F\\u068F\\u06CF\\u06EF]/.test(char);\n}\n\n/**\n * Check if a char is an Arabic Tashkeel char\n * @param {string} c a single char\n */\nfunction isTashkeelArabicChar(char) {\n    return /[\\u0600-\\u0605\\u060C-\\u060E\\u0610-\\u061B\\u061E\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED]/.test(char);\n}\n\n/**\n * Check if a char is Latin\n * @param {string} c a single char\n */\nfunction isLatinChar(c) {\n    return /[A-z]/.test(c);\n}\n\n/**\n * Check if a char is whitespace char\n * @param {string} c a single char\n */\nfunction isWhiteSpace(c) {\n    return /\\s/.test(c);\n}\n\n/**\n * Query a feature by some of it's properties to lookup a glyph substitution.\n */\n\n/**\n * Create feature query instance\n * @param {Font} font opentype font instance\n */\nfunction FeatureQuery(font) {\n    this.font = font;\n    this.features = {};\n}\n\n/**\n * @typedef SubstitutionAction\n * @type Object\n * @property {number} id substitution type\n * @property {string} tag feature tag\n * @property {any} substitution substitution value(s)\n */\n\n/**\n * Create a substitution action instance\n * @param {SubstitutionAction} action\n */\nfunction SubstitutionAction(action) {\n    this.id = action.id;\n    this.tag = action.tag;\n    this.substitution = action.substitution;\n}\n\n/**\n * Lookup a coverage table\n * @param {number} glyphIndex glyph index\n * @param {CoverageTable} coverage coverage table\n */\nfunction lookupCoverage(glyphIndex, coverage) {\n    if (!glyphIndex) { return -1; }\n    switch (coverage.format) {\n        case 1:\n            return coverage.glyphs.indexOf(glyphIndex);\n\n        case 2:\n            var ranges = coverage.ranges;\n            for (var i = 0; i < ranges.length; i++) {\n                var range = ranges[i];\n                if (glyphIndex >= range.start && glyphIndex <= range.end) {\n                    var offset = glyphIndex - range.start;\n                    return range.index + offset;\n                }\n            }\n            break;\n        default:\n            return -1; // not found\n    }\n    return -1;\n}\n\n/**\n * Handle a single substitution - format 1\n * @param {ContextParams} contextParams context params to lookup\n */\nfunction singleSubstitutionFormat1(glyphIndex, subtable) {\n    var substituteIndex = lookupCoverage(glyphIndex, subtable.coverage);\n    if (substituteIndex === -1) { return null; }\n    return glyphIndex + subtable.deltaGlyphId;\n}\n\n/**\n * Handle a single substitution - format 2\n * @param {ContextParams} contextParams context params to lookup\n */\nfunction singleSubstitutionFormat2(glyphIndex, subtable) {\n    var substituteIndex = lookupCoverage(glyphIndex, subtable.coverage);\n    if (substituteIndex === -1) { return null; }\n    return subtable.substitute[substituteIndex];\n}\n\n/**\n * Lookup a list of coverage tables\n * @param {any} coverageList a list of coverage tables\n * @param {ContextParams} contextParams context params to lookup\n */\nfunction lookupCoverageList(coverageList, contextParams) {\n    var lookupList = [];\n    for (var i = 0; i < coverageList.length; i++) {\n        var coverage = coverageList[i];\n        var glyphIndex = contextParams.current;\n        glyphIndex = Array.isArray(glyphIndex) ? glyphIndex[0] : glyphIndex;\n        var lookupIndex = lookupCoverage(glyphIndex, coverage);\n        if (lookupIndex !== -1) {\n            lookupList.push(lookupIndex);\n        }\n    }\n    if (lookupList.length !== coverageList.length) { return -1; }\n    return lookupList;\n}\n\n/**\n * Handle chaining context substitution - format 3\n * @param {ContextParams} contextParams context params to lookup\n */\nfunction chainingSubstitutionFormat3(contextParams, subtable) {\n    var lookupsCount = (\n        subtable.inputCoverage.length +\n        subtable.lookaheadCoverage.length +\n        subtable.backtrackCoverage.length\n    );\n    if (contextParams.context.length < lookupsCount) { return []; }\n    // INPUT LOOKUP //\n    var inputLookups = lookupCoverageList(\n        subtable.inputCoverage, contextParams\n    );\n    if (inputLookups === -1) { return []; }\n    // LOOKAHEAD LOOKUP //\n    var lookaheadOffset = subtable.inputCoverage.length - 1;\n    if (contextParams.lookahead.length < subtable.lookaheadCoverage.length) { return []; }\n    var lookaheadContext = contextParams.lookahead.slice(lookaheadOffset);\n    while (lookaheadContext.length && isTashkeelArabicChar(lookaheadContext[0].char)) {\n        lookaheadContext.shift();\n    }\n    var lookaheadParams = new ContextParams(lookaheadContext, 0);\n    var lookaheadLookups = lookupCoverageList(\n        subtable.lookaheadCoverage, lookaheadParams\n    );\n    // BACKTRACK LOOKUP //\n    var backtrackContext = [].concat(contextParams.backtrack);\n    backtrackContext.reverse();\n    while (backtrackContext.length && isTashkeelArabicChar(backtrackContext[0].char)) {\n        backtrackContext.shift();\n    }\n    if (backtrackContext.length < subtable.backtrackCoverage.length) { return []; }\n    var backtrackParams = new ContextParams(backtrackContext, 0);\n    var backtrackLookups = lookupCoverageList(\n        subtable.backtrackCoverage, backtrackParams\n    );\n    var contextRulesMatch = (\n        inputLookups.length === subtable.inputCoverage.length &&\n        lookaheadLookups.length === subtable.lookaheadCoverage.length &&\n        backtrackLookups.length === subtable.backtrackCoverage.length\n    );\n    var substitutions = [];\n    if (contextRulesMatch) {\n        for (var i = 0; i < subtable.lookupRecords.length; i++) {\n            var lookupRecord = subtable.lookupRecords[i];\n            var lookupListIndex = lookupRecord.lookupListIndex;\n            var lookupTable = this.getLookupByIndex(lookupListIndex);\n            for (var s = 0; s < lookupTable.subtables.length; s++) {\n                var subtable$1 = lookupTable.subtables[s];\n                var lookup = this.getLookupMethod(lookupTable, subtable$1);\n                var substitutionType = this.getSubstitutionType(lookupTable, subtable$1);\n                if (substitutionType === '12') {\n                    for (var n = 0; n < inputLookups.length; n++) {\n                        var glyphIndex = contextParams.get(n);\n                        var substitution = lookup(glyphIndex);\n                        if (substitution) { substitutions.push(substitution); }\n                    }\n                }\n            }\n        }\n    }\n    return substitutions;\n}\n\n/**\n * Handle ligature substitution - format 1\n * @param {ContextParams} contextParams context params to lookup\n */\nfunction ligatureSubstitutionFormat1(contextParams, subtable) {\n    // COVERAGE LOOKUP //\n    var glyphIndex = contextParams.current;\n    var ligSetIndex = lookupCoverage(glyphIndex, subtable.coverage);\n    if (ligSetIndex === -1) { return null; }\n    // COMPONENTS LOOKUP\n    // (!) note, components are ordered in the written direction.\n    var ligature;\n    var ligatureSet = subtable.ligatureSets[ligSetIndex];\n    for (var s = 0; s < ligatureSet.length; s++) {\n        ligature = ligatureSet[s];\n        for (var l = 0; l < ligature.components.length; l++) {\n            var lookaheadItem = contextParams.lookahead[l];\n            var component = ligature.components[l];\n            if (lookaheadItem !== component) { break; }\n            if (l === ligature.components.length - 1) { return ligature; }\n        }\n    }\n    return null;\n}\n\n/**\n * Handle decomposition substitution - format 1\n * @param {number} glyphIndex glyph index\n * @param {any} subtable subtable\n */\nfunction decompositionSubstitutionFormat1(glyphIndex, subtable) {\n    var substituteIndex = lookupCoverage(glyphIndex, subtable.coverage);\n    if (substituteIndex === -1) { return null; }\n    return subtable.sequences[substituteIndex];\n}\n\n/**\n * Get default script features indexes\n */\nFeatureQuery.prototype.getDefaultScriptFeaturesIndexes = function () {\n    var scripts = this.font.tables.gsub.scripts;\n    for (var s = 0; s < scripts.length; s++) {\n        var script = scripts[s];\n        if (script.tag === 'DFLT') { return (\n            script.script.defaultLangSys.featureIndexes\n        ); }\n    }\n    return [];\n};\n\n/**\n * Get feature indexes of a specific script\n * @param {string} scriptTag script tag\n */\nFeatureQuery.prototype.getScriptFeaturesIndexes = function(scriptTag) {\n    var tables = this.font.tables;\n    if (!tables.gsub) { return []; }\n    if (!scriptTag) { return this.getDefaultScriptFeaturesIndexes(); }\n    var scripts = this.font.tables.gsub.scripts;\n    for (var i = 0; i < scripts.length; i++) {\n        var script = scripts[i];\n        if (script.tag === scriptTag && script.script.defaultLangSys) {\n            return script.script.defaultLangSys.featureIndexes;\n        } else {\n            var langSysRecords = script.langSysRecords;\n            if (!!langSysRecords) {\n                for (var j = 0; j < langSysRecords.length; j++) {\n                    var langSysRecord = langSysRecords[j];\n                    if (langSysRecord.tag === scriptTag) {\n                        var langSys = langSysRecord.langSys;\n                        return langSys.featureIndexes;\n                    }\n                }\n            }\n        }\n    }\n    return this.getDefaultScriptFeaturesIndexes();\n};\n\n/**\n * Map a feature tag to a gsub feature\n * @param {any} features gsub features\n * @param {string} scriptTag script tag\n */\nFeatureQuery.prototype.mapTagsToFeatures = function (features, scriptTag) {\n    var tags = {};\n    for (var i = 0; i < features.length; i++) {\n        var tag = features[i].tag;\n        var feature = features[i].feature;\n        tags[tag] = feature;\n    }\n    this.features[scriptTag].tags = tags;\n};\n\n/**\n * Get features of a specific script\n * @param {string} scriptTag script tag\n */\nFeatureQuery.prototype.getScriptFeatures = function (scriptTag) {\n    var features = this.features[scriptTag];\n    if (this.features.hasOwnProperty(scriptTag)) { return features; }\n    var featuresIndexes = this.getScriptFeaturesIndexes(scriptTag);\n    if (!featuresIndexes) { return null; }\n    var gsub = this.font.tables.gsub;\n    features = featuresIndexes.map(function (index) { return gsub.features[index]; });\n    this.features[scriptTag] = features;\n    this.mapTagsToFeatures(features, scriptTag);\n    return features;\n};\n\n/**\n * Get substitution type\n * @param {any} lookupTable lookup table\n * @param {any} subtable subtable\n */\nFeatureQuery.prototype.getSubstitutionType = function(lookupTable, subtable) {\n    var lookupType = lookupTable.lookupType.toString();\n    var substFormat = subtable.substFormat.toString();\n    return lookupType + substFormat;\n};\n\n/**\n * Get lookup method\n * @param {any} lookupTable lookup table\n * @param {any} subtable subtable\n */\nFeatureQuery.prototype.getLookupMethod = function(lookupTable, subtable) {\n    var this$1 = this;\n\n    var substitutionType = this.getSubstitutionType(lookupTable, subtable);\n    switch (substitutionType) {\n        case '11':\n            return function (glyphIndex) { return singleSubstitutionFormat1.apply(\n                this$1, [glyphIndex, subtable]\n            ); };\n        case '12':\n            return function (glyphIndex) { return singleSubstitutionFormat2.apply(\n                this$1, [glyphIndex, subtable]\n            ); };\n        case '63':\n            return function (contextParams) { return chainingSubstitutionFormat3.apply(\n                this$1, [contextParams, subtable]\n            ); };\n        case '41':\n            return function (contextParams) { return ligatureSubstitutionFormat1.apply(\n                this$1, [contextParams, subtable]\n            ); };\n        case '21':\n            return function (glyphIndex) { return decompositionSubstitutionFormat1.apply(\n                this$1, [glyphIndex, subtable]\n            ); };\n        default:\n            throw new Error(\n                \"lookupType: \" + (lookupTable.lookupType) + \" - \" +\n                \"substFormat: \" + (subtable.substFormat) + \" \" +\n                \"is not yet supported\"\n            );\n    }\n};\n\n/**\n * [ LOOKUP TYPES ]\n * -------------------------------\n * Single                        1;\n * Multiple                      2;\n * Alternate                     3;\n * Ligature                      4;\n * Context                       5;\n * ChainingContext               6;\n * ExtensionSubstitution         7;\n * ReverseChainingContext        8;\n * -------------------------------\n *\n */\n\n/**\n * @typedef FQuery\n * @type Object\n * @param {string} tag feature tag\n * @param {string} script feature script\n * @param {ContextParams} contextParams context params\n */\n\n/**\n * Lookup a feature using a query parameters\n * @param {FQuery} query feature query\n */\nFeatureQuery.prototype.lookupFeature = function (query) {\n    var contextParams = query.contextParams;\n    var currentIndex = contextParams.index;\n    var feature = this.getFeature({\n        tag: query.tag, script: query.script\n    });\n    if (!feature) { return new Error(\n        \"font '\" + (this.font.names.fullName.en) + \"' \" +\n        \"doesn't support feature '\" + (query.tag) + \"' \" +\n        \"for script '\" + (query.script) + \"'.\"\n    ); }\n    var lookups = this.getFeatureLookups(feature);\n    var substitutions = [].concat(contextParams.context);\n    for (var l = 0; l < lookups.length; l++) {\n        var lookupTable = lookups[l];\n        var subtables = this.getLookupSubtables(lookupTable);\n        for (var s = 0; s < subtables.length; s++) {\n            var subtable = subtables[s];\n            var substType = this.getSubstitutionType(lookupTable, subtable);\n            var lookup = this.getLookupMethod(lookupTable, subtable);\n            var substitution = (void 0);\n            switch (substType) {\n                case '11':\n                    substitution = lookup(contextParams.current);\n                    if (substitution) {\n                        substitutions.splice(currentIndex, 1, new SubstitutionAction({\n                            id: 11, tag: query.tag, substitution: substitution\n                        }));\n                    }\n                    break;\n                case '12':\n                    substitution = lookup(contextParams.current);\n                    if (substitution) {\n                        substitutions.splice(currentIndex, 1, new SubstitutionAction({\n                            id: 12, tag: query.tag, substitution: substitution\n                        }));\n                    }\n                    break;\n                case '63':\n                    substitution = lookup(contextParams);\n                    if (Array.isArray(substitution) && substitution.length) {\n                        substitutions.splice(currentIndex, 1, new SubstitutionAction({\n                            id: 63, tag: query.tag, substitution: substitution\n                        }));\n                    }\n                    break;\n                case '41':\n                    substitution = lookup(contextParams);\n                    if (substitution) {\n                        substitutions.splice(currentIndex, 1, new SubstitutionAction({\n                            id: 41, tag: query.tag, substitution: substitution\n                        }));\n                    }\n                    break;\n                case '21':\n                    substitution = lookup(contextParams.current);\n                    if (substitution) {\n                        substitutions.splice(currentIndex, 1, new SubstitutionAction({\n                            id: 21, tag: query.tag, substitution: substitution\n                        }));\n                    }\n                    break;\n            }\n            contextParams = new ContextParams(substitutions, currentIndex);\n            if (Array.isArray(substitution) && !substitution.length) { continue; }\n            substitution = null;\n        }\n    }\n    return substitutions.length ? substitutions : null;\n};\n\n/**\n * Checks if a font supports a specific features\n * @param {FQuery} query feature query object\n */\nFeatureQuery.prototype.supports = function (query) {\n    if (!query.script) { return false; }\n    this.getScriptFeatures(query.script);\n    var supportedScript = this.features.hasOwnProperty(query.script);\n    if (!query.tag) { return supportedScript; }\n    var supportedFeature = (\n        this.features[query.script].some(function (feature) { return feature.tag === query.tag; })\n    );\n    return supportedScript && supportedFeature;\n};\n\n/**\n * Get lookup table subtables\n * @param {any} lookupTable lookup table\n */\nFeatureQuery.prototype.getLookupSubtables = function (lookupTable) {\n    return lookupTable.subtables || null;\n};\n\n/**\n * Get lookup table by index\n * @param {number} index lookup table index\n */\nFeatureQuery.prototype.getLookupByIndex = function (index) {\n    var lookups = this.font.tables.gsub.lookups;\n    return lookups[index] || null;\n};\n\n/**\n * Get lookup tables for a feature\n * @param {string} feature\n */\nFeatureQuery.prototype.getFeatureLookups = function (feature) {\n    // TODO: memoize\n    return feature.lookupListIndexes.map(this.getLookupByIndex.bind(this));\n};\n\n/**\n * Query a feature by it's properties\n * @param {any} query an object that describes the properties of a query\n */\nFeatureQuery.prototype.getFeature = function getFeature(query) {\n    if (!this.font) { return { FAIL: \"No font was found\"}; }\n    if (!this.features.hasOwnProperty(query.script)) {\n        this.getScriptFeatures(query.script);\n    }\n    var scriptFeatures = this.features[query.script];\n    if (!scriptFeatures) { return (\n        { FAIL: (\"No feature for script \" + (query.script))}\n    ); }\n    if (!scriptFeatures.tags[query.tag]) { return null; }\n    return this.features[query.script].tags[query.tag];\n};\n\n/**\n * Arabic word context checkers\n */\n\nfunction arabicWordStartCheck(contextParams) {\n    var char = contextParams.current;\n    var prevChar = contextParams.get(-1);\n    return (\n        // ? arabic first char\n        (prevChar === null && isArabicChar(char)) ||\n        // ? arabic char preceded with a non arabic char\n        (!isArabicChar(prevChar) && isArabicChar(char))\n    );\n}\n\nfunction arabicWordEndCheck(contextParams) {\n    var nextChar = contextParams.get(1);\n    return (\n        // ? last arabic char\n        (nextChar === null) ||\n        // ? next char is not arabic\n        (!isArabicChar(nextChar))\n    );\n}\n\nvar arabicWordCheck = {\n    startCheck: arabicWordStartCheck,\n    endCheck: arabicWordEndCheck\n};\n\n/**\n * Arabic sentence context checkers\n */\n\nfunction arabicSentenceStartCheck(contextParams) {\n    var char = contextParams.current;\n    var prevChar = contextParams.get(-1);\n    return (\n        // ? an arabic char preceded with a non arabic char\n        (isArabicChar(char) || isTashkeelArabicChar(char)) &&\n        !isArabicChar(prevChar)\n    );\n}\n\nfunction arabicSentenceEndCheck(contextParams) {\n    var nextChar = contextParams.get(1);\n    switch (true) {\n        case nextChar === null:\n            return true;\n        case (!isArabicChar(nextChar) && !isTashkeelArabicChar(nextChar)):\n            var nextIsWhitespace = isWhiteSpace(nextChar);\n            if (!nextIsWhitespace) { return true; }\n            if (nextIsWhitespace) {\n                var arabicCharAhead = false;\n                arabicCharAhead = (\n                    contextParams.lookahead.some(\n                        function (c) { return isArabicChar(c) || isTashkeelArabicChar(c); }\n                    )\n                );\n                if (!arabicCharAhead) { return true; }\n            }\n            break;\n        default:\n            return false;\n    }\n}\n\nvar arabicSentenceCheck = {\n    startCheck: arabicSentenceStartCheck,\n    endCheck: arabicSentenceEndCheck\n};\n\n/**\n * Apply single substitution format 1\n * @param {Array} substitutions substitutions\n * @param {any} tokens a list of tokens\n * @param {number} index token index\n */\nfunction singleSubstitutionFormat1$1(action, tokens, index) {\n    tokens[index].setState(action.tag, action.substitution);\n}\n\n/**\n * Apply single substitution format 2\n * @param {Array} substitutions substitutions\n * @param {any} tokens a list of tokens\n * @param {number} index token index\n */\nfunction singleSubstitutionFormat2$1(action, tokens, index) {\n    tokens[index].setState(action.tag, action.substitution);\n}\n\n/**\n * Apply chaining context substitution format 3\n * @param {Array} substitutions substitutions\n * @param {any} tokens a list of tokens\n * @param {number} index token index\n */\nfunction chainingSubstitutionFormat3$1(action, tokens, index) {\n    action.substitution.forEach(function (subst, offset) {\n        var token = tokens[index + offset];\n        token.setState(action.tag, subst);\n    });\n}\n\n/**\n * Apply ligature substitution format 1\n * @param {Array} substitutions substitutions\n * @param {any} tokens a list of tokens\n * @param {number} index token index\n */\nfunction ligatureSubstitutionFormat1$1(action, tokens, index) {\n    var token = tokens[index];\n    token.setState(action.tag, action.substitution.ligGlyph);\n    var compsCount = action.substitution.components.length;\n    for (var i = 0; i < compsCount; i++) {\n        token = tokens[index + i + 1];\n        token.setState('deleted', true);\n    }\n}\n\n/**\n * Supported substitutions\n */\nvar SUBSTITUTIONS = {\n    11: singleSubstitutionFormat1$1,\n    12: singleSubstitutionFormat2$1,\n    63: chainingSubstitutionFormat3$1,\n    41: ligatureSubstitutionFormat1$1\n};\n\n/**\n * Apply substitutions to a list of tokens\n * @param {Array} substitutions substitutions\n * @param {any} tokens a list of tokens\n * @param {number} index token index\n */\nfunction applySubstitution(action, tokens, index) {\n    if (action instanceof SubstitutionAction && SUBSTITUTIONS[action.id]) {\n        SUBSTITUTIONS[action.id](action, tokens, index);\n    }\n}\n\n/**\n * Apply Arabic presentation forms to a range of tokens\n */\n\n/**\n * Check if a char can be connected to it's preceding char\n * @param {ContextParams} charContextParams context params of a char\n */\nfunction willConnectPrev(charContextParams) {\n    var backtrack = [].concat(charContextParams.backtrack);\n    for (var i = backtrack.length - 1; i >= 0; i--) {\n        var prevChar = backtrack[i];\n        var isolated = isIsolatedArabicChar(prevChar);\n        var tashkeel = isTashkeelArabicChar(prevChar);\n        if (!isolated && !tashkeel) { return true; }\n        if (isolated) { return false; }\n    }\n    return false;\n}\n\n/**\n * Check if a char can be connected to it's proceeding char\n * @param {ContextParams} charContextParams context params of a char\n */\nfunction willConnectNext(charContextParams) {\n    if (isIsolatedArabicChar(charContextParams.current)) { return false; }\n    for (var i = 0; i < charContextParams.lookahead.length; i++) {\n        var nextChar = charContextParams.lookahead[i];\n        var tashkeel = isTashkeelArabicChar(nextChar);\n        if (!tashkeel) { return true; }\n    }\n    return false;\n}\n\n/**\n * Apply arabic presentation forms to a list of tokens\n * @param {ContextRange} range a range of tokens\n */\nfunction arabicPresentationForms(range) {\n    var this$1 = this;\n\n    var script = 'arab';\n    var tags = this.featuresTags[script];\n    var tokens = this.tokenizer.getRangeTokens(range);\n    if (tokens.length === 1) { return; }\n    var contextParams = new ContextParams(\n        tokens.map(function (token) { return token.getState('glyphIndex'); }\n    ), 0);\n    var charContextParams = new ContextParams(\n        tokens.map(function (token) { return token.char; }\n    ), 0);\n    tokens.forEach(function (token, index) {\n        if (isTashkeelArabicChar(token.char)) { return; }\n        contextParams.setCurrentIndex(index);\n        charContextParams.setCurrentIndex(index);\n        var CONNECT = 0; // 2 bits 00 (10: can connect next) (01: can connect prev)\n        if (willConnectPrev(charContextParams)) { CONNECT |= 1; }\n        if (willConnectNext(charContextParams)) { CONNECT |= 2; }\n        var tag;\n        switch (CONNECT) {\n            case 1: (tag = 'fina'); break;\n            case 2: (tag = 'init'); break;\n            case 3: (tag = 'medi'); break;\n        }\n        if (tags.indexOf(tag) === -1) { return; }\n        var substitutions = this$1.query.lookupFeature({\n            tag: tag, script: script, contextParams: contextParams\n        });\n        if (substitutions instanceof Error) { return console.info(substitutions.message); }\n        substitutions.forEach(function (action, index) {\n            if (action instanceof SubstitutionAction) {\n                applySubstitution(action, tokens, index);\n                contextParams.context[index] = action.substitution;\n            }\n        });\n    });\n}\n\n/**\n * Apply Arabic required ligatures feature to a range of tokens\n */\n\n/**\n * Update context params\n * @param {any} tokens a list of tokens\n * @param {number} index current item index\n */\nfunction getContextParams(tokens, index) {\n    var context = tokens.map(function (token) { return token.activeState.value; });\n    return new ContextParams(context, index || 0);\n}\n\n/**\n * Apply Arabic required ligatures to a context range\n * @param {ContextRange} range a range of tokens\n */\nfunction arabicRequiredLigatures(range) {\n    var this$1 = this;\n\n    var script = 'arab';\n    var tokens = this.tokenizer.getRangeTokens(range);\n    var contextParams = getContextParams(tokens);\n    contextParams.context.forEach(function (glyphIndex, index) {\n        contextParams.setCurrentIndex(index);\n        var substitutions = this$1.query.lookupFeature({\n            tag: 'rlig', script: script, contextParams: contextParams\n        });\n        if (substitutions.length) {\n            substitutions.forEach(\n                function (action) { return applySubstitution(action, tokens, index); }\n            );\n            contextParams = getContextParams(tokens);\n        }\n    });\n}\n\n/**\n * Latin word context checkers\n */\n\nfunction latinWordStartCheck(contextParams) {\n    var char = contextParams.current;\n    var prevChar = contextParams.get(-1);\n    return (\n        // ? latin first char\n        (prevChar === null && isLatinChar(char)) ||\n        // ? latin char preceded with a non latin char\n        (!isLatinChar(prevChar) && isLatinChar(char))\n    );\n}\n\nfunction latinWordEndCheck(contextParams) {\n    var nextChar = contextParams.get(1);\n    return (\n        // ? last latin char\n        (nextChar === null) ||\n        // ? next char is not latin\n        (!isLatinChar(nextChar))\n    );\n}\n\nvar latinWordCheck = {\n    startCheck: latinWordStartCheck,\n    endCheck: latinWordEndCheck\n};\n\n/**\n * Apply Latin ligature feature to a range of tokens\n */\n\n/**\n * Update context params\n * @param {any} tokens a list of tokens\n * @param {number} index current item index\n */\nfunction getContextParams$1(tokens, index) {\n    var context = tokens.map(function (token) { return token.activeState.value; });\n    return new ContextParams(context, index || 0);\n}\n\n/**\n * Apply Arabic required ligatures to a context range\n * @param {ContextRange} range a range of tokens\n */\nfunction latinLigature(range) {\n    var this$1 = this;\n\n    var script = 'latn';\n    var tokens = this.tokenizer.getRangeTokens(range);\n    var contextParams = getContextParams$1(tokens);\n    contextParams.context.forEach(function (glyphIndex, index) {\n        contextParams.setCurrentIndex(index);\n        var substitutions = this$1.query.lookupFeature({\n            tag: 'liga', script: script, contextParams: contextParams\n        });\n        if (substitutions.length) {\n            substitutions.forEach(\n                function (action) { return applySubstitution(action, tokens, index); }\n            );\n            contextParams = getContextParams$1(tokens);\n        }\n    });\n}\n\n/**\n * Infer bidirectional properties for a given text and apply\n * the corresponding layout rules.\n */\n\n/**\n * Create Bidi. features\n * @param {string} baseDir text base direction. value either 'ltr' or 'rtl'\n */\nfunction Bidi(baseDir) {\n    this.baseDir = baseDir || 'ltr';\n    this.tokenizer = new Tokenizer();\n    this.featuresTags = {};\n}\n\n/**\n * Sets Bidi text\n * @param {string} text a text input\n */\nBidi.prototype.setText = function (text) {\n    this.text = text;\n};\n\n/**\n * Store essential context checks:\n * arabic word check for applying gsub features\n * arabic sentence check for adjusting arabic layout\n */\nBidi.prototype.contextChecks = ({\n    latinWordCheck: latinWordCheck,\n    arabicWordCheck: arabicWordCheck,\n    arabicSentenceCheck: arabicSentenceCheck\n});\n\n/**\n * Register arabic word check\n */\nfunction registerContextChecker(checkId) {\n    var check = this.contextChecks[(checkId + \"Check\")];\n    return this.tokenizer.registerContextChecker(\n        checkId, check.startCheck, check.endCheck\n    );\n}\n\n/**\n * Perform pre tokenization procedure then\n * tokenize text input\n */\nfunction tokenizeText() {\n    registerContextChecker.call(this, 'latinWord');\n    registerContextChecker.call(this, 'arabicWord');\n    registerContextChecker.call(this, 'arabicSentence');\n    return this.tokenizer.tokenize(this.text);\n}\n\n/**\n * Reverse arabic sentence layout\n * TODO: check base dir before applying adjustments - priority low\n */\nfunction reverseArabicSentences() {\n    var this$1 = this;\n\n    var ranges = this.tokenizer.getContextRanges('arabicSentence');\n    ranges.forEach(function (range) {\n        var rangeTokens = this$1.tokenizer.getRangeTokens(range);\n        this$1.tokenizer.replaceRange(\n            range.startIndex,\n            range.endOffset,\n            rangeTokens.reverse()\n        );\n    });\n}\n\n/**\n * Register supported features tags\n * @param {script} script script tag\n * @param {Array} tags features tags list\n */\nBidi.prototype.registerFeatures = function (script, tags) {\n    var this$1 = this;\n\n    var supportedTags = tags.filter(\n        function (tag) { return this$1.query.supports({script: script, tag: tag}); }\n    );\n    if (!this.featuresTags.hasOwnProperty(script)) {\n        this.featuresTags[script] = supportedTags;\n    } else {\n        this.featuresTags[script] =\n        this.featuresTags[script].concat(supportedTags);\n    }\n};\n\n/**\n * Apply GSUB features\n * @param {Array} tagsList a list of features tags\n * @param {string} script a script tag\n * @param {Font} font opentype font instance\n */\nBidi.prototype.applyFeatures = function (font, features) {\n    if (!font) { throw new Error(\n        'No valid font was provided to apply features'\n    ); }\n    if (!this.query) { this.query = new FeatureQuery(font); }\n    for (var f = 0; f < features.length; f++) {\n        var feature = features[f];\n        if (!this.query.supports({script: feature.script})) { continue; }\n        this.registerFeatures(feature.script, feature.tags);\n    }\n};\n\n/**\n * Register a state modifier\n * @param {string} modifierId state modifier id\n * @param {function} condition a predicate function that returns true or false\n * @param {function} modifier a modifier function to set token state\n */\nBidi.prototype.registerModifier = function (modifierId, condition, modifier) {\n    this.tokenizer.registerModifier(modifierId, condition, modifier);\n};\n\n/**\n * Check if 'glyphIndex' is registered\n */\nfunction checkGlyphIndexStatus() {\n    if (this.tokenizer.registeredModifiers.indexOf('glyphIndex') === -1) {\n        throw new Error(\n            'glyphIndex modifier is required to apply ' +\n            'arabic presentation features.'\n        );\n    }\n}\n\n/**\n * Apply arabic presentation forms features\n */\nfunction applyArabicPresentationForms() {\n    var this$1 = this;\n\n    var script = 'arab';\n    if (!this.featuresTags.hasOwnProperty(script)) { return; }\n    checkGlyphIndexStatus.call(this);\n    var ranges = this.tokenizer.getContextRanges('arabicWord');\n    ranges.forEach(function (range) {\n        arabicPresentationForms.call(this$1, range);\n    });\n}\n\n/**\n * Apply required arabic ligatures\n */\nfunction applyArabicRequireLigatures() {\n    var this$1 = this;\n\n    var script = 'arab';\n    if (!this.featuresTags.hasOwnProperty(script)) { return; }\n    var tags = this.featuresTags[script];\n    if (tags.indexOf('rlig') === -1) { return; }\n    checkGlyphIndexStatus.call(this);\n    var ranges = this.tokenizer.getContextRanges('arabicWord');\n    ranges.forEach(function (range) {\n        arabicRequiredLigatures.call(this$1, range);\n    });\n}\n\n/**\n * Apply required arabic ligatures\n */\nfunction applyLatinLigatures() {\n    var this$1 = this;\n\n    var script = 'latn';\n    if (!this.featuresTags.hasOwnProperty(script)) { return; }\n    var tags = this.featuresTags[script];\n    if (tags.indexOf('liga') === -1) { return; }\n    checkGlyphIndexStatus.call(this);\n    var ranges = this.tokenizer.getContextRanges('latinWord');\n    ranges.forEach(function (range) {\n        latinLigature.call(this$1, range);\n    });\n}\n\n/**\n * Check if a context is registered\n * @param {string} contextId context id\n */\nBidi.prototype.checkContextReady = function (contextId) {\n    return !!this.tokenizer.getContext(contextId);\n};\n\n/**\n * Apply features to registered contexts\n */\nBidi.prototype.applyFeaturesToContexts = function () {\n    if (this.checkContextReady('arabicWord')) {\n        applyArabicPresentationForms.call(this);\n        applyArabicRequireLigatures.call(this);\n    }\n    if (this.checkContextReady('latinWord')) {\n        applyLatinLigatures.call(this);\n    }\n    if (this.checkContextReady('arabicSentence')) {\n        reverseArabicSentences.call(this);\n    }\n};\n\n/**\n * process text input\n * @param {string} text an input text\n */\nBidi.prototype.processText = function(text) {\n    if (!this.text || this.text !== text) {\n        this.setText(text);\n        tokenizeText.call(this);\n        this.applyFeaturesToContexts();\n    }\n};\n\n/**\n * Process a string of text to identify and adjust\n * bidirectional text entities.\n * @param {string} text input text\n */\nBidi.prototype.getBidiText = function (text) {\n    this.processText(text);\n    return this.tokenizer.getText();\n};\n\n/**\n * Get the current state index of each token\n * @param {text} text an input text\n */\nBidi.prototype.getTextGlyphs = function (text) {\n    this.processText(text);\n    var indexes = [];\n    for (var i = 0; i < this.tokenizer.tokens.length; i++) {\n        var token = this.tokenizer.tokens[i];\n        if (token.state.deleted) { continue; }\n        var index = token.activeState.value;\n        indexes.push(Array.isArray(index) ? index[0] : index);\n    }\n    return indexes;\n};\n\n// The Font object\n\n/**\n * @typedef FontOptions\n * @type Object\n * @property {Boolean} empty - whether to create a new empty font\n * @property {string} familyName\n * @property {string} styleName\n * @property {string=} fullName\n * @property {string=} postScriptName\n * @property {string=} designer\n * @property {string=} designerURL\n * @property {string=} manufacturer\n * @property {string=} manufacturerURL\n * @property {string=} license\n * @property {string=} licenseURL\n * @property {string=} version\n * @property {string=} description\n * @property {string=} copyright\n * @property {string=} trademark\n * @property {Number} unitsPerEm\n * @property {Number} ascender\n * @property {Number} descender\n * @property {Number} createdTimestamp\n * @property {string=} weightClass\n * @property {string=} widthClass\n * @property {string=} fsSelection\n */\n\n/**\n * A Font represents a loaded OpenType font file.\n * It contains a set of glyphs and methods to draw text on a drawing context,\n * or to get a path representing the text.\n * @exports opentype.Font\n * @class\n * @param {FontOptions}\n * @constructor\n */\nfunction Font(options) {\n    options = options || {};\n    options.tables = options.tables || {};\n\n    if (!options.empty) {\n        // Check that we've provided the minimum set of names.\n        checkArgument(options.familyName, 'When creating a new Font object, familyName is required.');\n        checkArgument(options.styleName, 'When creating a new Font object, styleName is required.');\n        checkArgument(options.unitsPerEm, 'When creating a new Font object, unitsPerEm is required.');\n        checkArgument(options.ascender, 'When creating a new Font object, ascender is required.');\n        checkArgument(options.descender <= 0, 'When creating a new Font object, negative descender value is required.');\n\n        // OS X will complain if the names are empty, so we put a single space everywhere by default.\n        this.names = {\n            fontFamily: {en: options.familyName || ' '},\n            fontSubfamily: {en: options.styleName || ' '},\n            fullName: {en: options.fullName || options.familyName + ' ' + options.styleName},\n            // postScriptName may not contain any whitespace\n            postScriptName: {en: options.postScriptName || (options.familyName + options.styleName).replace(/\\s/g, '')},\n            designer: {en: options.designer || ' '},\n            designerURL: {en: options.designerURL || ' '},\n            manufacturer: {en: options.manufacturer || ' '},\n            manufacturerURL: {en: options.manufacturerURL || ' '},\n            license: {en: options.license || ' '},\n            licenseURL: {en: options.licenseURL || ' '},\n            version: {en: options.version || 'Version 0.1'},\n            description: {en: options.description || ' '},\n            copyright: {en: options.copyright || ' '},\n            trademark: {en: options.trademark || ' '}\n        };\n        this.unitsPerEm = options.unitsPerEm || 1000;\n        this.ascender = options.ascender;\n        this.descender = options.descender;\n        this.createdTimestamp = options.createdTimestamp;\n        this.tables = Object.assign(options.tables, {\n            os2: Object.assign({\n                usWeightClass: options.weightClass || this.usWeightClasses.MEDIUM,\n                usWidthClass: options.widthClass || this.usWidthClasses.MEDIUM,\n                fsSelection: options.fsSelection || this.fsSelectionValues.REGULAR,\n            }, options.tables.os2)\n        });\n    }\n\n    this.supported = true; // Deprecated: parseBuffer will throw an error if font is not supported.\n    this.glyphs = new glyphset.GlyphSet(this, options.glyphs || []);\n    this.encoding = new DefaultEncoding(this);\n    this.position = new Position(this);\n    this.substitution = new Substitution(this);\n    this.tables = this.tables || {};\n\n    // needed for low memory mode only.\n    this._push = null;\n    this._hmtxTableData = {};\n\n    Object.defineProperty(this, 'hinting', {\n        get: function() {\n            if (this._hinting) { return this._hinting; }\n            if (this.outlinesFormat === 'truetype') {\n                return (this._hinting = new Hinting(this));\n            }\n        }\n    });\n}\n\n/**\n * Check if the font has a glyph for the given character.\n * @param  {string}\n * @return {Boolean}\n */\nFont.prototype.hasChar = function(c) {\n    return this.encoding.charToGlyphIndex(c) !== null;\n};\n\n/**\n * Convert the given character to a single glyph index.\n * Note that this function assumes that there is a one-to-one mapping between\n * the given character and a glyph; for complex scripts this might not be the case.\n * @param  {string}\n * @return {Number}\n */\nFont.prototype.charToGlyphIndex = function(s) {\n    return this.encoding.charToGlyphIndex(s);\n};\n\n/**\n * Convert the given character to a single Glyph object.\n * Note that this function assumes that there is a one-to-one mapping between\n * the given character and a glyph; for complex scripts this might not be the case.\n * @param  {string}\n * @return {opentype.Glyph}\n */\nFont.prototype.charToGlyph = function(c) {\n    var glyphIndex = this.charToGlyphIndex(c);\n    var glyph = this.glyphs.get(glyphIndex);\n    if (!glyph) {\n        // .notdef\n        glyph = this.glyphs.get(0);\n    }\n\n    return glyph;\n};\n\n/**\n * Update features\n * @param {any} options features options\n */\nFont.prototype.updateFeatures = function (options) {\n    // TODO: update all features options not only 'latn'.\n    return this.defaultRenderOptions.features.map(function (feature) {\n        if (feature.script === 'latn') {\n            return {\n                script: 'latn',\n                tags: feature.tags.filter(function (tag) { return options[tag]; })\n            };\n        } else {\n            return feature;\n        }\n    });\n};\n\n/**\n * Convert the given text to a list of Glyph objects.\n * Note that there is no strict one-to-one mapping between characters and\n * glyphs, so the list of returned glyphs can be larger or smaller than the\n * length of the given string.\n * @param  {string}\n * @param  {GlyphRenderOptions} [options]\n * @return {opentype.Glyph[]}\n */\nFont.prototype.stringToGlyphs = function(s, options) {\n    var this$1 = this;\n\n\n    var bidi = new Bidi();\n\n    // Create and register 'glyphIndex' state modifier\n    var charToGlyphIndexMod = function (token) { return this$1.charToGlyphIndex(token.char); };\n    bidi.registerModifier('glyphIndex', null, charToGlyphIndexMod);\n\n    // roll-back to default features\n    var features = options ?\n    this.updateFeatures(options.features) :\n    this.defaultRenderOptions.features;\n\n    bidi.applyFeatures(this, features);\n\n    var indexes = bidi.getTextGlyphs(s);\n\n    var length = indexes.length;\n\n    // convert glyph indexes to glyph objects\n    var glyphs = new Array(length);\n    var notdef = this.glyphs.get(0);\n    for (var i = 0; i < length; i += 1) {\n        glyphs[i] = this.glyphs.get(indexes[i]) || notdef;\n    }\n    return glyphs;\n};\n\n/**\n * @param  {string}\n * @return {Number}\n */\nFont.prototype.nameToGlyphIndex = function(name) {\n    return this.glyphNames.nameToGlyphIndex(name);\n};\n\n/**\n * @param  {string}\n * @return {opentype.Glyph}\n */\nFont.prototype.nameToGlyph = function(name) {\n    var glyphIndex = this.nameToGlyphIndex(name);\n    var glyph = this.glyphs.get(glyphIndex);\n    if (!glyph) {\n        // .notdef\n        glyph = this.glyphs.get(0);\n    }\n\n    return glyph;\n};\n\n/**\n * @param  {Number}\n * @return {String}\n */\nFont.prototype.glyphIndexToName = function(gid) {\n    if (!this.glyphNames.glyphIndexToName) {\n        return '';\n    }\n\n    return this.glyphNames.glyphIndexToName(gid);\n};\n\n/**\n * Retrieve the value of the kerning pair between the left glyph (or its index)\n * and the right glyph (or its index). If no kerning pair is found, return 0.\n * The kerning value gets added to the advance width when calculating the spacing\n * between glyphs.\n * For GPOS kerning, this method uses the default script and language, which covers\n * most use cases. To have greater control, use font.position.getKerningValue .\n * @param  {opentype.Glyph} leftGlyph\n * @param  {opentype.Glyph} rightGlyph\n * @return {Number}\n */\nFont.prototype.getKerningValue = function(leftGlyph, rightGlyph) {\n    leftGlyph = leftGlyph.index || leftGlyph;\n    rightGlyph = rightGlyph.index || rightGlyph;\n    var gposKerning = this.position.defaultKerningTables;\n    if (gposKerning) {\n        return this.position.getKerningValue(gposKerning, leftGlyph, rightGlyph);\n    }\n    // \"kern\" table\n    return this.kerningPairs[leftGlyph + ',' + rightGlyph] || 0;\n};\n\n/**\n * @typedef GlyphRenderOptions\n * @type Object\n * @property {string} [script] - script used to determine which features to apply. By default, 'DFLT' or 'latn' is used.\n *                               See https://www.microsoft.com/typography/otspec/scripttags.htm\n * @property {string} [language='dflt'] - language system used to determine which features to apply.\n *                                        See https://www.microsoft.com/typography/developers/opentype/languagetags.aspx\n * @property {boolean} [kerning=true] - whether to include kerning values\n * @property {object} [features] - OpenType Layout feature tags. Used to enable or disable the features of the given script/language system.\n *                                 See https://www.microsoft.com/typography/otspec/featuretags.htm\n */\nFont.prototype.defaultRenderOptions = {\n    kerning: true,\n    features: [\n        /**\n         * these 4 features are required to render Arabic text properly\n         * and shouldn't be turned off when rendering arabic text.\n         */\n        { script: 'arab', tags: ['init', 'medi', 'fina', 'rlig'] },\n        { script: 'latn', tags: ['liga', 'rlig'] }\n    ]\n};\n\n/**\n * Helper function that invokes the given callback for each glyph in the given text.\n * The callback gets `(glyph, x, y, fontSize, options)`.* @param  {string} text\n * @param {string} text - The text to apply.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {GlyphRenderOptions=} options\n * @param  {Function} callback\n */\nFont.prototype.forEachGlyph = function(text, x, y, fontSize, options, callback) {\n    x = x !== undefined ? x : 0;\n    y = y !== undefined ? y : 0;\n    fontSize = fontSize !== undefined ? fontSize : 72;\n    options = Object.assign({}, this.defaultRenderOptions, options);\n    var fontScale = 1 / this.unitsPerEm * fontSize;\n    var glyphs = this.stringToGlyphs(text, options);\n    var kerningLookups;\n    if (options.kerning) {\n        var script = options.script || this.position.getDefaultScriptName();\n        kerningLookups = this.position.getKerningTables(script, options.language);\n    }\n    for (var i = 0; i < glyphs.length; i += 1) {\n        var glyph = glyphs[i];\n        callback.call(this, glyph, x, y, fontSize, options);\n        if (glyph.advanceWidth) {\n            x += glyph.advanceWidth * fontScale;\n        }\n\n        if (options.kerning && i < glyphs.length - 1) {\n            // We should apply position adjustment lookups in a more generic way.\n            // Here we only use the xAdvance value.\n            var kerningValue = kerningLookups ?\n                  this.position.getKerningValue(kerningLookups, glyph.index, glyphs[i + 1].index) :\n                  this.getKerningValue(glyph, glyphs[i + 1]);\n            x += kerningValue * fontScale;\n        }\n\n        if (options.letterSpacing) {\n            x += options.letterSpacing * fontSize;\n        } else if (options.tracking) {\n            x += (options.tracking / 1000) * fontSize;\n        }\n    }\n    return x;\n};\n\n/**\n * Create a Path object that represents the given text.\n * @param  {string} text - The text to create.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {GlyphRenderOptions=} options\n * @return {opentype.Path}\n */\nFont.prototype.getPath = function(text, x, y, fontSize, options) {\n    var fullPath = new Path();\n    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {\n        var glyphPath = glyph.getPath(gX, gY, gFontSize, options, this);\n        fullPath.extend(glyphPath);\n    });\n    return fullPath;\n};\n\n/**\n * Create an array of Path objects that represent the glyphs of a given text.\n * @param  {string} text - The text to create.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {GlyphRenderOptions=} options\n * @return {opentype.Path[]}\n */\nFont.prototype.getPaths = function(text, x, y, fontSize, options) {\n    var glyphPaths = [];\n    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {\n        var glyphPath = glyph.getPath(gX, gY, gFontSize, options, this);\n        glyphPaths.push(glyphPath);\n    });\n\n    return glyphPaths;\n};\n\n/**\n * Returns the advance width of a text.\n *\n * This is something different than Path.getBoundingBox() as for example a\n * suffixed whitespace increases the advanceWidth but not the bounding box\n * or an overhanging letter like a calligraphic 'f' might have a quite larger\n * bounding box than its advance width.\n *\n * This corresponds to canvas2dContext.measureText(text).width\n *\n * @param  {string} text - The text to create.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {GlyphRenderOptions=} options\n * @return advance width\n */\nFont.prototype.getAdvanceWidth = function(text, fontSize, options) {\n    return this.forEachGlyph(text, 0, 0, fontSize, options, function() {});\n};\n\n/**\n * Draw the text on the given drawing context.\n * @param  {CanvasRenderingContext2D} ctx - A 2D drawing context, like Canvas.\n * @param  {string} text - The text to create.\n * @param  {number} [x=0] - Horizontal position of the beginning of the text.\n * @param  {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param  {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param  {GlyphRenderOptions=} options\n */\nFont.prototype.draw = function(ctx, text, x, y, fontSize, options) {\n    this.getPath(text, x, y, fontSize, options).draw(ctx);\n};\n\n/**\n * Draw the points of all glyphs in the text.\n * On-curve points will be drawn in blue, off-curve points will be drawn in red.\n * @param {CanvasRenderingContext2D} ctx - A 2D drawing context, like Canvas.\n * @param {string} text - The text to create.\n * @param {number} [x=0] - Horizontal position of the beginning of the text.\n * @param {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param {GlyphRenderOptions=} options\n */\nFont.prototype.drawPoints = function(ctx, text, x, y, fontSize, options) {\n    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {\n        glyph.drawPoints(ctx, gX, gY, gFontSize);\n    });\n};\n\n/**\n * Draw lines indicating important font measurements for all glyphs in the text.\n * Black lines indicate the origin of the coordinate system (point 0,0).\n * Blue lines indicate the glyph bounding box.\n * Green line indicates the advance width of the glyph.\n * @param {CanvasRenderingContext2D} ctx - A 2D drawing context, like Canvas.\n * @param {string} text - The text to create.\n * @param {number} [x=0] - Horizontal position of the beginning of the text.\n * @param {number} [y=0] - Vertical position of the *baseline* of the text.\n * @param {number} [fontSize=72] - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`.\n * @param {GlyphRenderOptions=} options\n */\nFont.prototype.drawMetrics = function(ctx, text, x, y, fontSize, options) {\n    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {\n        glyph.drawMetrics(ctx, gX, gY, gFontSize);\n    });\n};\n\n/**\n * @param  {string}\n * @return {string}\n */\nFont.prototype.getEnglishName = function(name) {\n    var translations = this.names[name];\n    if (translations) {\n        return translations.en;\n    }\n};\n\n/**\n * Validate\n */\nFont.prototype.validate = function() {\n    var _this = this;\n\n    function assert(predicate, message) {\n    }\n\n    function assertNamePresent(name) {\n        var englishName = _this.getEnglishName(name);\n        assert(englishName && englishName.trim().length > 0);\n    }\n\n    // Identification information\n    assertNamePresent('fontFamily');\n    assertNamePresent('weightName');\n    assertNamePresent('manufacturer');\n    assertNamePresent('copyright');\n    assertNamePresent('version');\n\n    // Dimension information\n    assert(this.unitsPerEm > 0);\n};\n\n/**\n * Convert the font object to a SFNT data structure.\n * This structure contains all the necessary tables and metadata to create a binary OTF file.\n * @return {opentype.Table}\n */\nFont.prototype.toTables = function() {\n    return sfnt.fontToTable(this);\n};\n/**\n * @deprecated Font.toBuffer is deprecated. Use Font.toArrayBuffer instead.\n */\nFont.prototype.toBuffer = function() {\n    console.warn('Font.toBuffer is deprecated. Use Font.toArrayBuffer instead.');\n    return this.toArrayBuffer();\n};\n/**\n * Converts a `opentype.Font` into an `ArrayBuffer`\n * @return {ArrayBuffer}\n */\nFont.prototype.toArrayBuffer = function() {\n    var sfntTable = this.toTables();\n    var bytes = sfntTable.encode();\n    var buffer = new ArrayBuffer(bytes.length);\n    var intArray = new Uint8Array(buffer);\n    for (var i = 0; i < bytes.length; i++) {\n        intArray[i] = bytes[i];\n    }\n\n    return buffer;\n};\n\n/**\n * Initiate a download of the OpenType font.\n */\nFont.prototype.download = function(fileName) {\n    var familyName = this.getEnglishName('fontFamily');\n    var styleName = this.getEnglishName('fontSubfamily');\n    fileName = fileName || familyName.replace(/\\s/g, '') + '-' + styleName + '.otf';\n    var arrayBuffer = this.toArrayBuffer();\n\n    window.URL = window.URL || window.webkitURL;\n\n    if (window.URL) {\n        var dataView = new DataView(arrayBuffer);\n        var blob = new Blob([dataView], {type: 'font/opentype'});\n\n        var link = document.createElement('a');\n        link.href = window.URL.createObjectURL(blob);\n        link.download = fileName;\n\n        var event = document.createEvent('MouseEvents');\n        event.initEvent('click', true, false);\n        link.dispatchEvent(event);\n    } else {\n        console.warn('Font file could not be downloaded. Try using a different browser.');\n    }\n};\n/**\n * @private\n */\nFont.prototype.fsSelectionValues = {\n    ITALIC:              0x001, //1\n    UNDERSCORE:          0x002, //2\n    NEGATIVE:            0x004, //4\n    OUTLINED:            0x008, //8\n    STRIKEOUT:           0x010, //16\n    BOLD:                0x020, //32\n    REGULAR:             0x040, //64\n    USER_TYPO_METRICS:   0x080, //128\n    WWS:                 0x100, //256\n    OBLIQUE:             0x200  //512\n};\n\n/**\n * @private\n */\nFont.prototype.usWidthClasses = {\n    ULTRA_CONDENSED: 1,\n    EXTRA_CONDENSED: 2,\n    CONDENSED: 3,\n    SEMI_CONDENSED: 4,\n    MEDIUM: 5,\n    SEMI_EXPANDED: 6,\n    EXPANDED: 7,\n    EXTRA_EXPANDED: 8,\n    ULTRA_EXPANDED: 9\n};\n\n/**\n * @private\n */\nFont.prototype.usWeightClasses = {\n    THIN: 100,\n    EXTRA_LIGHT: 200,\n    LIGHT: 300,\n    NORMAL: 400,\n    MEDIUM: 500,\n    SEMI_BOLD: 600,\n    BOLD: 700,\n    EXTRA_BOLD: 800,\n    BLACK:    900\n};\n\n// The `fvar` table stores font variation axes and instances.\n\nfunction addName(name, names) {\n    var nameString = JSON.stringify(name);\n    var nameID = 256;\n    for (var nameKey in names) {\n        var n = parseInt(nameKey);\n        if (!n || n < 256) {\n            continue;\n        }\n\n        if (JSON.stringify(names[nameKey]) === nameString) {\n            return n;\n        }\n\n        if (nameID <= n) {\n            nameID = n + 1;\n        }\n    }\n\n    names[nameID] = name;\n    return nameID;\n}\n\nfunction makeFvarAxis(n, axis, names) {\n    var nameID = addName(axis.name, names);\n    return [\n        {name: 'tag_' + n, type: 'TAG', value: axis.tag},\n        {name: 'minValue_' + n, type: 'FIXED', value: axis.minValue << 16},\n        {name: 'defaultValue_' + n, type: 'FIXED', value: axis.defaultValue << 16},\n        {name: 'maxValue_' + n, type: 'FIXED', value: axis.maxValue << 16},\n        {name: 'flags_' + n, type: 'USHORT', value: 0},\n        {name: 'nameID_' + n, type: 'USHORT', value: nameID}\n    ];\n}\n\nfunction parseFvarAxis(data, start, names) {\n    var axis = {};\n    var p = new parse.Parser(data, start);\n    axis.tag = p.parseTag();\n    axis.minValue = p.parseFixed();\n    axis.defaultValue = p.parseFixed();\n    axis.maxValue = p.parseFixed();\n    p.skip('uShort', 1);  // reserved for flags; no values defined\n    axis.name = names[p.parseUShort()] || {};\n    return axis;\n}\n\nfunction makeFvarInstance(n, inst, axes, names) {\n    var nameID = addName(inst.name, names);\n    var fields = [\n        {name: 'nameID_' + n, type: 'USHORT', value: nameID},\n        {name: 'flags_' + n, type: 'USHORT', value: 0}\n    ];\n\n    for (var i = 0; i < axes.length; ++i) {\n        var axisTag = axes[i].tag;\n        fields.push({\n            name: 'axis_' + n + ' ' + axisTag,\n            type: 'FIXED',\n            value: inst.coordinates[axisTag] << 16\n        });\n    }\n\n    return fields;\n}\n\nfunction parseFvarInstance(data, start, axes, names) {\n    var inst = {};\n    var p = new parse.Parser(data, start);\n    inst.name = names[p.parseUShort()] || {};\n    p.skip('uShort', 1);  // reserved for flags; no values defined\n\n    inst.coordinates = {};\n    for (var i = 0; i < axes.length; ++i) {\n        inst.coordinates[axes[i].tag] = p.parseFixed();\n    }\n\n    return inst;\n}\n\nfunction makeFvarTable(fvar, names) {\n    var result = new table.Table('fvar', [\n        {name: 'version', type: 'ULONG', value: 0x10000},\n        {name: 'offsetToData', type: 'USHORT', value: 0},\n        {name: 'countSizePairs', type: 'USHORT', value: 2},\n        {name: 'axisCount', type: 'USHORT', value: fvar.axes.length},\n        {name: 'axisSize', type: 'USHORT', value: 20},\n        {name: 'instanceCount', type: 'USHORT', value: fvar.instances.length},\n        {name: 'instanceSize', type: 'USHORT', value: 4 + fvar.axes.length * 4}\n    ]);\n    result.offsetToData = result.sizeOf();\n\n    for (var i = 0; i < fvar.axes.length; i++) {\n        result.fields = result.fields.concat(makeFvarAxis(i, fvar.axes[i], names));\n    }\n\n    for (var j = 0; j < fvar.instances.length; j++) {\n        result.fields = result.fields.concat(makeFvarInstance(j, fvar.instances[j], fvar.axes, names));\n    }\n\n    return result;\n}\n\nfunction parseFvarTable(data, start, names) {\n    var p = new parse.Parser(data, start);\n    var tableVersion = p.parseULong();\n    check.argument(tableVersion === 0x00010000, 'Unsupported fvar table version.');\n    var offsetToData = p.parseOffset16();\n    // Skip countSizePairs.\n    p.skip('uShort', 1);\n    var axisCount = p.parseUShort();\n    var axisSize = p.parseUShort();\n    var instanceCount = p.parseUShort();\n    var instanceSize = p.parseUShort();\n\n    var axes = [];\n    for (var i = 0; i < axisCount; i++) {\n        axes.push(parseFvarAxis(data, start + offsetToData + i * axisSize, names));\n    }\n\n    var instances = [];\n    var instanceStart = start + offsetToData + axisCount * axisSize;\n    for (var j = 0; j < instanceCount; j++) {\n        instances.push(parseFvarInstance(data, instanceStart + j * instanceSize, axes, names));\n    }\n\n    return {axes: axes, instances: instances};\n}\n\nvar fvar = { make: makeFvarTable, parse: parseFvarTable };\n\n// The `GDEF` table contains various glyph properties\n\nvar attachList = function() {\n    return {\n        coverage: this.parsePointer(Parser.coverage),\n        attachPoints: this.parseList(Parser.pointer(Parser.uShortList))\n    };\n};\n\nvar caretValue = function() {\n    var format = this.parseUShort();\n    check.argument(format === 1 || format === 2 || format === 3,\n        'Unsupported CaretValue table version.');\n    if (format === 1) {\n        return { coordinate: this.parseShort() };\n    } else if (format === 2) {\n        return { pointindex: this.parseShort() };\n    } else if (format === 3) {\n        // Device / Variation Index tables unsupported\n        return { coordinate: this.parseShort() };\n    }\n};\n\nvar ligGlyph = function() {\n    return this.parseList(Parser.pointer(caretValue));\n};\n\nvar ligCaretList = function() {\n    return {\n        coverage: this.parsePointer(Parser.coverage),\n        ligGlyphs: this.parseList(Parser.pointer(ligGlyph))\n    };\n};\n\nvar markGlyphSets = function() {\n    this.parseUShort(); // Version\n    return this.parseList(Parser.pointer(Parser.coverage));\n};\n\nfunction parseGDEFTable(data, start) {\n    start = start || 0;\n    var p = new Parser(data, start);\n    var tableVersion = p.parseVersion(1);\n    check.argument(tableVersion === 1 || tableVersion === 1.2 || tableVersion === 1.3,\n        'Unsupported GDEF table version.');\n    var gdef = {\n        version: tableVersion,\n        classDef: p.parsePointer(Parser.classDef),\n        attachList: p.parsePointer(attachList),\n        ligCaretList: p.parsePointer(ligCaretList),\n        markAttachClassDef: p.parsePointer(Parser.classDef)\n    };\n    if (tableVersion >= 1.2) {\n        gdef.markGlyphSets = p.parsePointer(markGlyphSets);\n    }\n    return gdef;\n}\nvar gdef = { parse: parseGDEFTable };\n\n// The `GPOS` table contains kerning pairs, among other things.\n\nvar subtableParsers$1 = new Array(10);         // subtableParsers[0] is unused\n\n// https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#lookup-type-1-single-adjustment-positioning-subtable\n// this = Parser instance\nsubtableParsers$1[1] = function parseLookup1() {\n    var start = this.offset + this.relativeOffset;\n    var posformat = this.parseUShort();\n    if (posformat === 1) {\n        return {\n            posFormat: 1,\n            coverage: this.parsePointer(Parser.coverage),\n            value: this.parseValueRecord()\n        };\n    } else if (posformat === 2) {\n        return {\n            posFormat: 2,\n            coverage: this.parsePointer(Parser.coverage),\n            values: this.parseValueRecordList()\n        };\n    }\n    check.assert(false, '0x' + start.toString(16) + ': GPOS lookup type 1 format must be 1 or 2.');\n};\n\n// https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#lookup-type-2-pair-adjustment-positioning-subtable\nsubtableParsers$1[2] = function parseLookup2() {\n    var start = this.offset + this.relativeOffset;\n    var posFormat = this.parseUShort();\n    check.assert(posFormat === 1 || posFormat === 2, '0x' + start.toString(16) + ': GPOS lookup type 2 format must be 1 or 2.');\n    var coverage = this.parsePointer(Parser.coverage);\n    var valueFormat1 = this.parseUShort();\n    var valueFormat2 = this.parseUShort();\n    if (posFormat === 1) {\n        // Adjustments for Glyph Pairs\n        return {\n            posFormat: posFormat,\n            coverage: coverage,\n            valueFormat1: valueFormat1,\n            valueFormat2: valueFormat2,\n            pairSets: this.parseList(Parser.pointer(Parser.list(function() {\n                return {        // pairValueRecord\n                    secondGlyph: this.parseUShort(),\n                    value1: this.parseValueRecord(valueFormat1),\n                    value2: this.parseValueRecord(valueFormat2)\n                };\n            })))\n        };\n    } else if (posFormat === 2) {\n        var classDef1 = this.parsePointer(Parser.classDef);\n        var classDef2 = this.parsePointer(Parser.classDef);\n        var class1Count = this.parseUShort();\n        var class2Count = this.parseUShort();\n        return {\n            // Class Pair Adjustment\n            posFormat: posFormat,\n            coverage: coverage,\n            valueFormat1: valueFormat1,\n            valueFormat2: valueFormat2,\n            classDef1: classDef1,\n            classDef2: classDef2,\n            class1Count: class1Count,\n            class2Count: class2Count,\n            classRecords: this.parseList(class1Count, Parser.list(class2Count, function() {\n                return {\n                    value1: this.parseValueRecord(valueFormat1),\n                    value2: this.parseValueRecord(valueFormat2)\n                };\n            }))\n        };\n    }\n};\n\nsubtableParsers$1[3] = function parseLookup3() { return { error: 'GPOS Lookup 3 not supported' }; };\nsubtableParsers$1[4] = function parseLookup4() { return { error: 'GPOS Lookup 4 not supported' }; };\nsubtableParsers$1[5] = function parseLookup5() { return { error: 'GPOS Lookup 5 not supported' }; };\nsubtableParsers$1[6] = function parseLookup6() { return { error: 'GPOS Lookup 6 not supported' }; };\nsubtableParsers$1[7] = function parseLookup7() { return { error: 'GPOS Lookup 7 not supported' }; };\nsubtableParsers$1[8] = function parseLookup8() { return { error: 'GPOS Lookup 8 not supported' }; };\nsubtableParsers$1[9] = function parseLookup9() { return { error: 'GPOS Lookup 9 not supported' }; };\n\n// https://docs.microsoft.com/en-us/typography/opentype/spec/gpos\nfunction parseGposTable(data, start) {\n    start = start || 0;\n    var p = new Parser(data, start);\n    var tableVersion = p.parseVersion(1);\n    check.argument(tableVersion === 1 || tableVersion === 1.1, 'Unsupported GPOS table version ' + tableVersion);\n\n    if (tableVersion === 1) {\n        return {\n            version: tableVersion,\n            scripts: p.parseScriptList(),\n            features: p.parseFeatureList(),\n            lookups: p.parseLookupList(subtableParsers$1)\n        };\n    } else {\n        return {\n            version: tableVersion,\n            scripts: p.parseScriptList(),\n            features: p.parseFeatureList(),\n            lookups: p.parseLookupList(subtableParsers$1),\n            variations: p.parseFeatureVariationsList()\n        };\n    }\n\n}\n\n// GPOS Writing //////////////////////////////////////////////\n// NOT SUPPORTED\nvar subtableMakers$1 = new Array(10);\n\nfunction makeGposTable(gpos) {\n    return new table.Table('GPOS', [\n        {name: 'version', type: 'ULONG', value: 0x10000},\n        {name: 'scripts', type: 'TABLE', value: new table.ScriptList(gpos.scripts)},\n        {name: 'features', type: 'TABLE', value: new table.FeatureList(gpos.features)},\n        {name: 'lookups', type: 'TABLE', value: new table.LookupList(gpos.lookups, subtableMakers$1)}\n    ]);\n}\n\nvar gpos = { parse: parseGposTable, make: makeGposTable };\n\n// The `kern` table contains kerning pairs.\n\nfunction parseWindowsKernTable(p) {\n    var pairs = {};\n    // Skip nTables.\n    p.skip('uShort');\n    var subtableVersion = p.parseUShort();\n    check.argument(subtableVersion === 0, 'Unsupported kern sub-table version.');\n    // Skip subtableLength, subtableCoverage\n    p.skip('uShort', 2);\n    var nPairs = p.parseUShort();\n    // Skip searchRange, entrySelector, rangeShift.\n    p.skip('uShort', 3);\n    for (var i = 0; i < nPairs; i += 1) {\n        var leftIndex = p.parseUShort();\n        var rightIndex = p.parseUShort();\n        var value = p.parseShort();\n        pairs[leftIndex + ',' + rightIndex] = value;\n    }\n    return pairs;\n}\n\nfunction parseMacKernTable(p) {\n    var pairs = {};\n    // The Mac kern table stores the version as a fixed (32 bits) but we only loaded the first 16 bits.\n    // Skip the rest.\n    p.skip('uShort');\n    var nTables = p.parseULong();\n    //check.argument(nTables === 1, 'Only 1 subtable is supported (got ' + nTables + ').');\n    if (nTables > 1) {\n        console.warn('Only the first kern subtable is supported.');\n    }\n    p.skip('uLong');\n    var coverage = p.parseUShort();\n    var subtableVersion = coverage & 0xFF;\n    p.skip('uShort');\n    if (subtableVersion === 0) {\n        var nPairs = p.parseUShort();\n        // Skip searchRange, entrySelector, rangeShift.\n        p.skip('uShort', 3);\n        for (var i = 0; i < nPairs; i += 1) {\n            var leftIndex = p.parseUShort();\n            var rightIndex = p.parseUShort();\n            var value = p.parseShort();\n            pairs[leftIndex + ',' + rightIndex] = value;\n        }\n    }\n    return pairs;\n}\n\n// Parse the `kern` table which contains kerning pairs.\nfunction parseKernTable(data, start) {\n    var p = new parse.Parser(data, start);\n    var tableVersion = p.parseUShort();\n    if (tableVersion === 0) {\n        return parseWindowsKernTable(p);\n    } else if (tableVersion === 1) {\n        return parseMacKernTable(p);\n    } else {\n        throw new Error('Unsupported kern table version (' + tableVersion + ').');\n    }\n}\n\nvar kern = { parse: parseKernTable };\n\n// The `loca` table stores the offsets to the locations of the glyphs in the font.\n\n// Parse the `loca` table. This table stores the offsets to the locations of the glyphs in the font,\n// relative to the beginning of the glyphData table.\n// The number of glyphs stored in the `loca` table is specified in the `maxp` table (under numGlyphs)\n// The loca table has two versions: a short version where offsets are stored as uShorts, and a long\n// version where offsets are stored as uLongs. The `head` table specifies which version to use\n// (under indexToLocFormat).\nfunction parseLocaTable(data, start, numGlyphs, shortVersion) {\n    var p = new parse.Parser(data, start);\n    var parseFn = shortVersion ? p.parseUShort : p.parseULong;\n    // There is an extra entry after the last index element to compute the length of the last glyph.\n    // That's why we use numGlyphs + 1.\n    var glyphOffsets = [];\n    for (var i = 0; i < numGlyphs + 1; i += 1) {\n        var glyphOffset = parseFn.call(p);\n        if (shortVersion) {\n            // The short table version stores the actual offset divided by 2.\n            glyphOffset *= 2;\n        }\n\n        glyphOffsets.push(glyphOffset);\n    }\n\n    return glyphOffsets;\n}\n\nvar loca = { parse: parseLocaTable };\n\n// opentype.js\n\n/**\n * The opentype library.\n * @namespace opentype\n */\n\n// File loaders /////////////////////////////////////////////////////////\n\n/**\n * Loads a font from a URL. The callback throws an error message as the first parameter if it fails\n * and the font as an ArrayBuffer in the second parameter if it succeeds.\n * @param  {string} url - The URL of the font file.\n * @param  {Function} callback - The function to call when the font load completes\n */\nfunction loadFromUrl(url, callback) {\n    var request = new XMLHttpRequest();\n    request.open('get', url, true);\n    request.responseType = 'arraybuffer';\n    request.onload = function() {\n        if (request.response) {\n            return callback(null, request.response);\n        } else {\n            return callback('Font could not be loaded: ' + request.statusText);\n        }\n    };\n\n    request.onerror = function () {\n        callback('Font could not be loaded');\n    };\n\n    request.send();\n}\n\n// Table Directory Entries //////////////////////////////////////////////\n/**\n * Parses OpenType table entries.\n * @param  {DataView}\n * @param  {Number}\n * @return {Object[]}\n */\nfunction parseOpenTypeTableEntries(data, numTables) {\n    var tableEntries = [];\n    var p = 12;\n    for (var i = 0; i < numTables; i += 1) {\n        var tag = parse.getTag(data, p);\n        var checksum = parse.getULong(data, p + 4);\n        var offset = parse.getULong(data, p + 8);\n        var length = parse.getULong(data, p + 12);\n        tableEntries.push({tag: tag, checksum: checksum, offset: offset, length: length, compression: false});\n        p += 16;\n    }\n\n    return tableEntries;\n}\n\n/**\n * Parses WOFF table entries.\n * @param  {DataView}\n * @param  {Number}\n * @return {Object[]}\n */\nfunction parseWOFFTableEntries(data, numTables) {\n    var tableEntries = [];\n    var p = 44; // offset to the first table directory entry.\n    for (var i = 0; i < numTables; i += 1) {\n        var tag = parse.getTag(data, p);\n        var offset = parse.getULong(data, p + 4);\n        var compLength = parse.getULong(data, p + 8);\n        var origLength = parse.getULong(data, p + 12);\n        var compression = (void 0);\n        if (compLength < origLength) {\n            compression = 'WOFF';\n        } else {\n            compression = false;\n        }\n\n        tableEntries.push({tag: tag, offset: offset, compression: compression,\n            compressedLength: compLength, length: origLength});\n        p += 20;\n    }\n\n    return tableEntries;\n}\n\n/**\n * @typedef TableData\n * @type Object\n * @property {DataView} data - The DataView\n * @property {number} offset - The data offset.\n */\n\n/**\n * @param  {DataView}\n * @param  {Object}\n * @return {TableData}\n */\nfunction uncompressTable(data, tableEntry) {\n    if (tableEntry.compression === 'WOFF') {\n        var inBuffer = new Uint8Array(data.buffer, tableEntry.offset + 2, tableEntry.compressedLength - 2);\n        var outBuffer = new Uint8Array(tableEntry.length);\n        tinyInflate(inBuffer, outBuffer);\n        if (outBuffer.byteLength !== tableEntry.length) {\n            throw new Error('Decompression error: ' + tableEntry.tag + ' decompressed length doesn\\'t match recorded length');\n        }\n\n        var view = new DataView(outBuffer.buffer, 0);\n        return {data: view, offset: 0};\n    } else {\n        return {data: data, offset: tableEntry.offset};\n    }\n}\n\n// Public API ///////////////////////////////////////////////////////////\n\n/**\n * Parse the OpenType file data (as an ArrayBuffer) and return a Font object.\n * Throws an error if the font could not be parsed.\n * @param  {ArrayBuffer}\n * @param  {Object} opt - options for parsing\n * @return {opentype.Font}\n */\nfunction parseBuffer(buffer, opt) {\n    opt = (opt === undefined || opt === null) ?  {} : opt;\n\n    var indexToLocFormat;\n    var ltagTable;\n\n    // Since the constructor can also be called to create new fonts from scratch, we indicate this\n    // should be an empty font that we'll fill with our own data.\n    var font = new Font({empty: true});\n\n    // OpenType fonts use big endian byte ordering.\n    // We can't rely on typed array view types, because they operate with the endianness of the host computer.\n    // Instead we use DataViews where we can specify endianness.\n    var data = new DataView(buffer, 0);\n    var numTables;\n    var tableEntries = [];\n    var signature = parse.getTag(data, 0);\n    if (signature === String.fromCharCode(0, 1, 0, 0) || signature === 'true' || signature === 'typ1') {\n        font.outlinesFormat = 'truetype';\n        numTables = parse.getUShort(data, 4);\n        tableEntries = parseOpenTypeTableEntries(data, numTables);\n    } else if (signature === 'OTTO') {\n        font.outlinesFormat = 'cff';\n        numTables = parse.getUShort(data, 4);\n        tableEntries = parseOpenTypeTableEntries(data, numTables);\n    } else if (signature === 'wOFF') {\n        var flavor = parse.getTag(data, 4);\n        if (flavor === String.fromCharCode(0, 1, 0, 0)) {\n            font.outlinesFormat = 'truetype';\n        } else if (flavor === 'OTTO') {\n            font.outlinesFormat = 'cff';\n        } else {\n            throw new Error('Unsupported OpenType flavor ' + signature);\n        }\n\n        numTables = parse.getUShort(data, 12);\n        tableEntries = parseWOFFTableEntries(data, numTables);\n    } else {\n        throw new Error('Unsupported OpenType signature ' + signature);\n    }\n\n    var cffTableEntry;\n    var fvarTableEntry;\n    var glyfTableEntry;\n    var gdefTableEntry;\n    var gposTableEntry;\n    var gsubTableEntry;\n    var hmtxTableEntry;\n    var kernTableEntry;\n    var locaTableEntry;\n    var nameTableEntry;\n    var metaTableEntry;\n    var p;\n\n    for (var i = 0; i < numTables; i += 1) {\n        var tableEntry = tableEntries[i];\n        var table = (void 0);\n        switch (tableEntry.tag) {\n            case 'cmap':\n                table = uncompressTable(data, tableEntry);\n                font.tables.cmap = cmap.parse(table.data, table.offset);\n                font.encoding = new CmapEncoding(font.tables.cmap);\n                break;\n            case 'cvt ' :\n                table = uncompressTable(data, tableEntry);\n                p = new parse.Parser(table.data, table.offset);\n                font.tables.cvt = p.parseShortList(tableEntry.length / 2);\n                break;\n            case 'fvar':\n                fvarTableEntry = tableEntry;\n                break;\n            case 'fpgm' :\n                table = uncompressTable(data, tableEntry);\n                p = new parse.Parser(table.data, table.offset);\n                font.tables.fpgm = p.parseByteList(tableEntry.length);\n                break;\n            case 'head':\n                table = uncompressTable(data, tableEntry);\n                font.tables.head = head.parse(table.data, table.offset);\n                font.unitsPerEm = font.tables.head.unitsPerEm;\n                indexToLocFormat = font.tables.head.indexToLocFormat;\n                break;\n            case 'hhea':\n                table = uncompressTable(data, tableEntry);\n                font.tables.hhea = hhea.parse(table.data, table.offset);\n                font.ascender = font.tables.hhea.ascender;\n                font.descender = font.tables.hhea.descender;\n                font.numberOfHMetrics = font.tables.hhea.numberOfHMetrics;\n                break;\n            case 'hmtx':\n                hmtxTableEntry = tableEntry;\n                break;\n            case 'ltag':\n                table = uncompressTable(data, tableEntry);\n                ltagTable = ltag.parse(table.data, table.offset);\n                break;\n            case 'COLR':\n                table = uncompressTable(data, tableEntry);\n                font.tables.colr = colr.parse(table.data, table.offset);\n                break;\n            case 'CPAL':\n                table = uncompressTable(data, tableEntry);\n                font.tables.cpal = cpal.parse(table.data, table.offset);\n                break;\n            case 'maxp':\n                table = uncompressTable(data, tableEntry);\n                font.tables.maxp = maxp.parse(table.data, table.offset);\n                font.numGlyphs = font.tables.maxp.numGlyphs;\n                break;\n            case 'name':\n                nameTableEntry = tableEntry;\n                break;\n            case 'OS/2':\n                table = uncompressTable(data, tableEntry);\n                font.tables.os2 = os2.parse(table.data, table.offset);\n                break;\n            case 'post':\n                table = uncompressTable(data, tableEntry);\n                font.tables.post = post.parse(table.data, table.offset);\n                font.glyphNames = new GlyphNames(font.tables.post);\n                break;\n            case 'prep' :\n                table = uncompressTable(data, tableEntry);\n                p = new parse.Parser(table.data, table.offset);\n                font.tables.prep = p.parseByteList(tableEntry.length);\n                break;\n            case 'glyf':\n                glyfTableEntry = tableEntry;\n                break;\n            case 'loca':\n                locaTableEntry = tableEntry;\n                break;\n            case 'CFF ':\n                cffTableEntry = tableEntry;\n                break;\n            case 'kern':\n                kernTableEntry = tableEntry;\n                break;\n            case 'GDEF':\n                gdefTableEntry = tableEntry;\n                break;\n            case 'GPOS':\n                gposTableEntry = tableEntry;\n                break;\n            case 'GSUB':\n                gsubTableEntry = tableEntry;\n                break;\n            case 'meta':\n                metaTableEntry = tableEntry;\n                break;\n        }\n    }\n\n    var nameTable = uncompressTable(data, nameTableEntry);\n    font.tables.name = _name.parse(nameTable.data, nameTable.offset, ltagTable);\n    font.names = font.tables.name;\n\n    if (glyfTableEntry && locaTableEntry) {\n        var shortVersion = indexToLocFormat === 0;\n        var locaTable = uncompressTable(data, locaTableEntry);\n        var locaOffsets = loca.parse(locaTable.data, locaTable.offset, font.numGlyphs, shortVersion);\n        var glyfTable = uncompressTable(data, glyfTableEntry);\n        font.glyphs = glyf.parse(glyfTable.data, glyfTable.offset, locaOffsets, font, opt);\n    } else if (cffTableEntry) {\n        var cffTable = uncompressTable(data, cffTableEntry);\n        cff.parse(cffTable.data, cffTable.offset, font, opt);\n    } else {\n        throw new Error('Font doesn\\'t contain TrueType or CFF outlines.');\n    }\n\n    var hmtxTable = uncompressTable(data, hmtxTableEntry);\n    hmtx.parse(font, hmtxTable.data, hmtxTable.offset, font.numberOfHMetrics, font.numGlyphs, font.glyphs, opt);\n    addGlyphNames(font, opt);\n\n    if (kernTableEntry) {\n        var kernTable = uncompressTable(data, kernTableEntry);\n        font.kerningPairs = kern.parse(kernTable.data, kernTable.offset);\n    } else {\n        font.kerningPairs = {};\n    }\n\n    if (gdefTableEntry) {\n        var gdefTable = uncompressTable(data, gdefTableEntry);\n        font.tables.gdef = gdef.parse(gdefTable.data, gdefTable.offset);\n    }\n\n    if (gposTableEntry) {\n        var gposTable = uncompressTable(data, gposTableEntry);\n        font.tables.gpos = gpos.parse(gposTable.data, gposTable.offset);\n        font.position.init();\n    }\n\n    if (gsubTableEntry) {\n        var gsubTable = uncompressTable(data, gsubTableEntry);\n        font.tables.gsub = gsub.parse(gsubTable.data, gsubTable.offset);\n    }\n\n    if (fvarTableEntry) {\n        var fvarTable = uncompressTable(data, fvarTableEntry);\n        font.tables.fvar = fvar.parse(fvarTable.data, fvarTable.offset, font.names);\n    }\n\n    if (metaTableEntry) {\n        var metaTable = uncompressTable(data, metaTableEntry);\n        font.tables.meta = meta.parse(metaTable.data, metaTable.offset);\n        font.metas = font.tables.meta;\n    }\n\n    return font;\n}\n\n/**\n * Asynchronously load the font from a URL or a filesystem. When done, call the callback\n * with two arguments `(err, font)`. The `err` will be null on success,\n * the `font` is a Font object.\n * We use the node.js callback convention so that\n * opentype.js can integrate with frameworks like async.js.\n * @alias opentype.load\n * @param  {string} url - The URL of the font to load.\n * @param  {Function} callback - The callback.\n */\nfunction load(url, callback, opt) {\n    opt = (opt === undefined || opt === null) ?  {} : opt;\n\n    return new Promise(function (resolve, reject) {\n        loadFromUrl(url, function(err, arrayBuffer) {\n            if (err) {\n                if (callback) {\n                    return callback(err);\n                } else {\n                    reject(err);\n                }\n            }\n            var font;\n            try {\n                font = parseBuffer(arrayBuffer, opt);\n            } catch (e) {\n                if (callback) {\n                    return callback(e, null);\n                } else {\n                    reject(e);\n                }\n            }\n            if (callback) {\n                return callback(null, font);\n            } else {\n                resolve(font);\n            }\n        });\n    });\n}\n\nvar opentype = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tFont: Font,\n\tGlyph: Glyph,\n\tPath: Path,\n\tBoundingBox: BoundingBox,\n\t_parse: parse,\n\tparse: parseBuffer,\n\tload: load,\n});\n\nexport default opentype;\nexport { BoundingBox, Font, Glyph, Path, parse as _parse, load, parseBuffer as parse };\n","import {\n\tFileLoader,\n\tLoader\n} from 'three';\nimport opentype from '../libs/opentype.module.js';\n\n/**\n * Requires opentype.js to be included in the project.\n * Loads TTF files and converts them into typeface JSON that can be used directly\n * to create THREE.Font objects.\n */\n\nclass TTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.reversed = false;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( arraybuffer ) {\n\n\t\tfunction convert( font, reversed ) {\n\n\t\t\tconst round = Math.round;\n\n\t\t\tconst glyphs = {};\n\t\t\tconst scale = ( 100000 ) / ( ( font.unitsPerEm || 2048 ) * 72 );\n\n\t\t\tconst glyphIndexMap = font.encoding.cmap.glyphIndexMap;\n\t\t\tconst unicodes = Object.keys( glyphIndexMap );\n\n\t\t\tfor ( let i = 0; i < unicodes.length; i ++ ) {\n\n\t\t\t\tconst unicode = unicodes[ i ];\n\t\t\t\tconst glyph = font.glyphs.glyphs[ glyphIndexMap[ unicode ] ];\n\n\t\t\t\tif ( unicode !== undefined ) {\n\n\t\t\t\t\tconst token = {\n\t\t\t\t\t\tha: round( glyph.advanceWidth * scale ),\n\t\t\t\t\t\tx_min: round( glyph.xMin * scale ),\n\t\t\t\t\t\tx_max: round( glyph.xMax * scale ),\n\t\t\t\t\t\to: ''\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\tglyph.path.commands = reverseCommands( glyph.path.commands );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tglyph.path.commands.forEach( function ( command ) {\n\n\t\t\t\t\t\tif ( command.type.toLowerCase() === 'c' ) {\n\n\t\t\t\t\t\t\tcommand.type = 'b';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoken.o += command.type.toLowerCase() + ' ';\n\n\t\t\t\t\t\tif ( command.x !== undefined && command.y !== undefined ) {\n\n\t\t\t\t\t\t\ttoken.o += round( command.x * scale ) + ' ' + round( command.y * scale ) + ' ';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( command.x1 !== undefined && command.y1 !== undefined ) {\n\n\t\t\t\t\t\t\ttoken.o += round( command.x1 * scale ) + ' ' + round( command.y1 * scale ) + ' ';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( command.x2 !== undefined && command.y2 !== undefined ) {\n\n\t\t\t\t\t\t\ttoken.o += round( command.x2 * scale ) + ' ' + round( command.y2 * scale ) + ' ';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tglyphs[ String.fromCodePoint( glyph.unicode ) ] = token;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tglyphs: glyphs,\n\t\t\t\tfamilyName: font.getEnglishName( 'fullName' ),\n\t\t\t\tascender: round( font.ascender * scale ),\n\t\t\t\tdescender: round( font.descender * scale ),\n\t\t\t\tunderlinePosition: font.tables.post.underlinePosition,\n\t\t\t\tunderlineThickness: font.tables.post.underlineThickness,\n\t\t\t\tboundingBox: {\n\t\t\t\t\txMin: font.tables.head.xMin,\n\t\t\t\t\txMax: font.tables.head.xMax,\n\t\t\t\t\tyMin: font.tables.head.yMin,\n\t\t\t\t\tyMax: font.tables.head.yMax\n\t\t\t\t},\n\t\t\t\tresolution: 1000,\n\t\t\t\toriginal_font_information: font.tables.name\n\t\t\t};\n\n\t\t}\n\n\t\tfunction reverseCommands( commands ) {\n\n\t\t\tconst paths = [];\n\t\t\tlet path;\n\n\t\t\tcommands.forEach( function ( c ) {\n\n\t\t\t\tif ( c.type.toLowerCase() === 'm' ) {\n\n\t\t\t\t\tpath = [ c ];\n\t\t\t\t\tpaths.push( path );\n\n\t\t\t\t} else if ( c.type.toLowerCase() !== 'z' ) {\n\n\t\t\t\t\tpath.push( c );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst reversed = [];\n\n\t\t\tpaths.forEach( function ( p ) {\n\n\t\t\t\tconst result = {\n\t\t\t\t\ttype: 'm',\n\t\t\t\t\tx: p[ p.length - 1 ].x,\n\t\t\t\t\ty: p[ p.length - 1 ].y\n\t\t\t\t};\n\n\t\t\t\treversed.push( result );\n\n\t\t\t\tfor ( let i = p.length - 1; i > 0; i -- ) {\n\n\t\t\t\t\tconst command = p[ i ];\n\t\t\t\t\tconst result = { type: command.type };\n\n\t\t\t\t\tif ( command.x2 !== undefined && command.y2 !== undefined ) {\n\n\t\t\t\t\t\tresult.x1 = command.x2;\n\t\t\t\t\t\tresult.y1 = command.y2;\n\t\t\t\t\t\tresult.x2 = command.x1;\n\t\t\t\t\t\tresult.y2 = command.y1;\n\n\t\t\t\t\t} else if ( command.x1 !== undefined && command.y1 !== undefined ) {\n\n\t\t\t\t\t\tresult.x1 = command.x1;\n\t\t\t\t\t\tresult.y1 = command.y1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresult.x = p[ i - 1 ].x;\n\t\t\t\t\tresult.y = p[ i - 1 ].y;\n\t\t\t\t\treversed.push( result );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn reversed;\n\n\t\t}\n\n\t\treturn convert( opentype.parse( arraybuffer ), this.reversed );\n\n\t}\n\n}\n\nexport { TTFLoader };\n","import {Poly} from '../../../engine/Poly';\nimport {CoreBaseLoader} from './../_Base';\nimport {FontLoader} from './FontLoader';\nimport {Font, FontData} from './Font';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {SVGLoader} from 'three/examples/jsm/loaders/SVGLoader';\nimport {TTFLoader} from 'three/examples/jsm/loaders/TTFLoader';\n\nenum FileFontFormat {\n\tJSON = 'json',\n\tTTF = 'ttf',\n}\n\nconst FILE_FONT_FORMATS: string[] = [FileFontFormat.JSON, FileFontFormat.TTF];\nexport function isExtFont(ext: string) {\n\treturn FILE_FONT_FORMATS.includes(ext);\n}\nexport class CoreLoaderFont extends CoreBaseLoader<string> {\n\tprivate _fontLoader: FontLoader;\n\n\tconstructor(url: string, _node?: BaseNodeType) {\n\t\tsuper(url, _node);\n\n\t\tthis._fontLoader = new FontLoader(this.loadingManager);\n\t}\n\n\tasync load() {\n\t\tif (this._node) {\n\t\t\tPoly.blobs.clearBlobsForNode(this._node);\n\t\t}\n\t\tconst ext = this.extension();\n\t\tconst url = this._urlToLoad();\n\t\tswitch (ext) {\n\t\t\tcase 'ttf': {\n\t\t\t\treturn this._loadTTF(url);\n\t\t\t}\n\t\t\tcase 'json': {\n\t\t\t\treturn this._loadJSON(url);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _loadTTF(url: string): Promise<Font> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst loadedModule = await this._loadTTFLoader();\n\t\t\tif (!loadedModule) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tloadedModule.load(\n\t\t\t\turl,\n\t\t\t\t(fnt: object) => {\n\t\t\t\t\tconst parsed = this._fontLoader.parse(fnt as FontData);\n\t\t\t\t\tresolve(parsed);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t(err) => {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\tprivate _loadJSON(url: string): Promise<Font> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._fontLoader.load(\n\t\t\t\turl,\n\t\t\t\t(font: Font) => {\n\t\t\t\t\tresolve(font);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t() => {\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate async _loadTTFLoader() {\n\t\treturn new TTFLoader(this.loadingManager);\n\t}\n\tstatic async loadSVGLoader() {\n\t\treturn SVGLoader;\n\t}\n}\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example  path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetDDSLoader() {\n\n\t\tthrow new Error(\n\n\t\t\t'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".'\n\n\t\t);\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t                        // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param  {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {LIBRARY_INSTALL_HINT} from './../common';\nimport {Object3D} from 'three';\nimport {Poly} from '../../../engine/Poly';\nimport {DRACOLoader} from 'three/examples/jsm/loaders/DRACOLoader';\nimport {GLTFLoader, GLTF} from 'three/examples/jsm/loaders/GLTFLoader';\nimport {BaseLoaderLoadOptions, CoreBaseLoader} from '../_Base';\nimport {BaseGeoLoader, BaseObject3DLoaderHandler} from './_BaseLoaderHandler';\nimport {KTX2TextureLoader} from '../texture/KTX2';\nimport {KTX2Loader} from 'three/examples/jsm/loaders/KTX2Loader';\nimport {sanitizeUrl} from '../../UrlHelper';\n\ninterface GLTFLoaderLoadOptions extends BaseLoaderLoadOptions {\n\tdraco: boolean;\n\tktx2: boolean;\n}\n\nexport class GLTFLoaderHandler extends BaseObject3DLoaderHandler<GLTF> {\n\t//\n\tprivate _gltfLoader: GLTFLoader | undefined;\n\tprivate _gltfdracoLoader: GLTFLoader | undefined;\n\tprivate _ktx2gltfLoader: GLTFLoader | undefined;\n\tprivate _ktx2gltfdracoLoader: GLTFLoader | undefined;\n\t//\n\tprivate _dracoLoader: DRACOLoader | undefined;\n\tprivate _ktx2Loader: KTX2Loader | undefined;\n\toverride reset() {\n\t\tsuper.reset();\n\t\tthis._dracoLoader?.dispose();\n\t\tthis._gltfLoader = undefined;\n\t\tthis._gltfdracoLoader = undefined;\n\t\tthis._dracoLoader = undefined;\n\t\tthis._ktx2Loader = undefined;\n\t}\n\toverride async load(options: GLTFLoaderLoadOptions): Promise<Object3D[] | undefined> {\n\t\treturn super.load(options);\n\t}\n\n\tprotected async _getLoader(options: GLTFLoaderLoadOptions): Promise<BaseGeoLoader<GLTF>> {\n\t\tif (options.ktx2) {\n\t\t\tif (options.draco) {\n\t\t\t\treturn (this._ktx2gltfdracoLoader =\n\t\t\t\t\tthis._ktx2gltfdracoLoader || (await this._createGLTFLoader(options)));\n\t\t\t} else {\n\t\t\t\treturn (this._ktx2gltfLoader = this._ktx2gltfLoader || (await this._createGLTFLoader(options)));\n\t\t\t}\n\t\t} else {\n\t\t\tif (options.draco) {\n\t\t\t\treturn (this._gltfdracoLoader = this._gltfdracoLoader || (await this._createGLTFLoader(options)));\n\t\t\t} else {\n\t\t\t\treturn (this._gltfLoader = this._gltfLoader || (await this._createGLTFLoader(options)));\n\t\t\t}\n\t\t}\n\t}\n\tprivate async _createGLTFLoader(options: GLTFLoaderLoadOptions) {\n\t\tconst loader = new GLTFLoader(this.loadingManager);\n\t\tif (options.draco) {\n\t\t\tawait this._setupDRACO(loader, options);\n\t\t}\n\t\tif (options.ktx2) {\n\t\t\tawait this._setupKTX2(loader, options);\n\t\t}\n\t\treturn loader;\n\t}\n\n\t// private async _createGLTFLoaderWithDRACO(options: BaseLoaderLoadOptions) {\n\t// \tconst loader = new GLTFLoader(this.loadingManager);\n\t// \tawait this._setupDRACO(loader, options);\n\t// \tawait this._setupKTX2(loader, options);\n\t// \treturn loader;\n\t// }\n\n\tprivate async _setupDRACO(gltfLoader: GLTFLoader, options: BaseLoaderLoadOptions) {\n\t\tthis._dracoLoader = this._dracoLoader || (await this._createDRACOLoader(options));\n\t\tgltfLoader.setDRACOLoader(this._dracoLoader);\n\t}\n\tprotected async _setupKTX2(gltfLoader: GLTFLoader, options: BaseLoaderLoadOptions) {\n\t\tthis._ktx2Loader = this._ktx2Loader || (await KTX2TextureLoader.getLoader(options));\n\t\tgltfLoader.setKTX2Loader(this._ktx2Loader);\n\t}\n\tprivate async _createDRACOLoader(options: BaseLoaderLoadOptions) {\n\t\tconst useJS = false;\n\t\tconst node = options.node;\n\t\tconst dracoLoader = new DRACOLoader(this.loadingManager);\n\t\tconst root = Poly.libs.root();\n\t\tconst DRACOGLTFPath = Poly.libs.DRACOGLTFPath();\n\t\tif (root || DRACOGLTFPath) {\n\t\t\tconst decoderPath = sanitizeUrl(`${root || ''}${DRACOGLTFPath || ''}/`);\n\t\t\tconst timestamp = Date.now();\n\t\t\tconst files = useJS ? ['draco_decoder.js'] : ['draco_decoder.wasm', 'draco_wasm_wrapper.js'];\n\t\t\tawait CoreBaseLoader._loadMultipleUrlsGlobal({\n\t\t\t\tfiles: files.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfullUrl: `${decoderPath}${file}?t=${timestamp}`,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t\tnode,\n\t\t\t\terror: `failed to load draco libraries. Make sure to install them to load .glb files (${LIBRARY_INSTALL_HINT})`,\n\t\t\t});\n\t\t\tdracoLoader.setDecoderPath(decoderPath);\n\t\t} else {\n\t\t\t(dracoLoader as any).setDecoderPath(undefined);\n\t\t}\n\t\t// not having this uses wasm if the relevant libraries are found\n\t\tdracoLoader.setDecoderConfig({type: useJS ? 'js' : 'wasm'});\n\t\tdracoLoader.preload();\n\t\treturn dracoLoader;\n\t}\n\tprotected override _onLoadSuccess(gltf: GLTF): Object3D[] {\n\t\tconst scene = gltf.scene || gltf.scenes[0];\n\t\tscene.animations = gltf.animations;\n\n\t\treturn [scene];\n\t}\n}\n","import {BufferGeometry, Float32BufferAttribute, Mesh} from 'three';\nimport {stringMatchesOneMask, stringToAttribNames} from '../../String';\nimport {AttribType} from '../../geometry/Constant';\nimport {CoreAttributeData} from '../../geometry/AttributeData';\nimport {Attribute, CoreAttribute} from '../../geometry/Attribute';\nimport {isString, isObject, isArray} from '../../Type';\nimport {PolyDictionary, StringOrNumber} from '../../../types/GlobalTypes';\nimport {ThreejsPoint} from '../../geometry/modules/three/ThreejsPoint';\n\nconst DEEP_ATTRIB_SEPARATOR = ':';\nconst dummyMesh = new Mesh();\n\nexport interface JsonDataLoaderOptions {\n\tdataKeysPrefix?: string;\n\tskipEntries?: string;\n\tdoConvert?: boolean;\n\tconvertToNumeric?: string;\n}\n\nfunction initPositionAttribute(geometry: BufferGeometry, pointsCount: number) {\n\tconst values: number[] = new Array(pointsCount * 3).fill(0);\n\n\treturn geometry.setAttribute(Attribute.POSITION, new Float32BufferAttribute(values, 3));\n}\n\nexport class JSONDataParser {\n\tprivate _json: any[] | undefined;\n\tprivate _attribute_datas_by_name: PolyDictionary<CoreAttributeData> = {};\n\tprivate _options: JsonDataLoaderOptions = {};\n\n\tconstructor(options: JsonDataLoaderOptions = {}) {\n\t\tthis._options.dataKeysPrefix = options.dataKeysPrefix;\n\t\tthis._options.skipEntries = options.skipEntries;\n\t\tthis._options.doConvert = options.doConvert || false;\n\t\tthis._options.convertToNumeric = options.convertToNumeric;\n\t}\n\n\tdataKeysPrefix() {\n\t\treturn this._options.dataKeysPrefix;\n\t}\n\n\tget_prefixed_json(json: any, prefixes: string[]): any[] {\n\t\tif (prefixes.length == 0) {\n\t\t\treturn json;\n\t\t} else {\n\t\t\tconst first_prefix = prefixes.shift();\n\t\t\tif (first_prefix) {\n\t\t\t\treturn this.get_prefixed_json(json[first_prefix], prefixes);\n\t\t\t}\n\t\t}\n\t\treturn [];\n\t}\n\n\tsetJSON(json: any) {\n\t\treturn (this._json = json);\n\t}\n\n\tcreateObject() {\n\t\tconst geometry = new BufferGeometry();\n\t\tdummyMesh.geometry = geometry;\n\t\tconst corePointClass = ThreejsPoint;\n\n\t\tif (this._json != null) {\n\t\t\tconst pointsCount = this._json.length;\n\t\t\tinitPositionAttribute(geometry, pointsCount);\n\n\t\t\tthis._find_attributes();\n\n\t\t\tconst convert_to_numeric_masks: string[] = [];\n\t\t\tif (this._options.convertToNumeric) {\n\t\t\t\tstringToAttribNames(this._options.convertToNumeric, convert_to_numeric_masks);\n\t\t\t}\n\n\t\t\t// set values\n\t\t\tfor (const attrib_name of Object.keys(this._attribute_datas_by_name)) {\n\t\t\t\tconst geo_attrib_name = CoreAttribute.remapName(attrib_name);\n\t\t\t\tlet attrib_values = this._attribute_values_for_name(attrib_name).flat();\n\n\t\t\t\tconst data = this._attribute_datas_by_name[attrib_name];\n\t\t\t\tconst size = data.size();\n\n\t\t\t\tif (data.type() === AttribType.STRING) {\n\t\t\t\t\tif (this._options.doConvert && stringMatchesOneMask(attrib_name, convert_to_numeric_masks)) {\n\t\t\t\t\t\tconst numerical_attrib_values: number[] = attrib_values.map((v) => {\n\t\t\t\t\t\t\tif (isString(v)) {\n\t\t\t\t\t\t\t\treturn parseFloat(v) || 0;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn v;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tgeometry.setAttribute(\n\t\t\t\t\t\t\tgeo_attrib_name,\n\t\t\t\t\t\t\tnew Float32BufferAttribute(numerical_attrib_values, size)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst index_data = CoreAttribute.arrayToIndexedArrays(attrib_values as string[]);\n\t\t\t\t\t\tcorePointClass.setIndexedAttribute(\n\t\t\t\t\t\t\tdummyMesh,\n\t\t\t\t\t\t\tgeo_attrib_name,\n\t\t\t\t\t\t\tindex_data['values'],\n\t\t\t\t\t\t\tindex_data['indices']\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst numerical_attrib_values = attrib_values as number[];\n\t\t\t\t\tgeometry.setAttribute(geo_attrib_name, new Float32BufferAttribute(numerical_attrib_values, size));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn geometry;\n\t}\n\n\tprivate _find_attributes() {\n\t\tlet first_pt;\n\n\t\tconst masks: string[] = [];\n\t\tif (this._options.skipEntries) {\n\t\t\tstringToAttribNames(this._options.skipEntries, masks);\n\t\t}\n\n\t\tif (this._json) {\n\t\t\tif ((first_pt = this._json[0]) != null) {\n\t\t\t\tfor (const attrib_name of Object.keys(first_pt)) {\n\t\t\t\t\tconst attrib_value = first_pt[attrib_name];\n\n\t\t\t\t\tif (this._value_has_subentries(attrib_value)) {\n\t\t\t\t\t\tconst keys = Object.keys(attrib_value);\n\t\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\t\tconst deep_attrib_name = [attrib_name, key].join(DEEP_ATTRIB_SEPARATOR);\n\t\t\t\t\t\t\tconst deep_attrib_value = attrib_value[attrib_name];\n\n\t\t\t\t\t\t\tif (!stringMatchesOneMask(deep_attrib_name, masks)) {\n\t\t\t\t\t\t\t\tthis._attribute_datas_by_name[deep_attrib_name] =\n\t\t\t\t\t\t\t\t\tCoreAttributeData.from_value(deep_attrib_value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!stringMatchesOneMask(attrib_name, masks)) {\n\t\t\t\t\t\t\tthis._attribute_datas_by_name[attrib_name] = CoreAttributeData.from_value(attrib_value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _attribute_values_for_name(attrib_name: string): StringOrNumber[] {\n\t\tif (this._json) {\n\t\t\treturn this._json.map((json_element: PolyDictionary<any>) => {\n\t\t\t\tconst prefix = attrib_name.split(DEEP_ATTRIB_SEPARATOR)[0];\n\t\t\t\tconst value = json_element[prefix];\n\t\t\t\tif (this._value_has_subentries(value)) {\n\t\t\t\t\tconst deep_attrib_name = attrib_name.substring(prefix.length + 1);\n\t\t\t\t\treturn value[deep_attrib_name] || 0;\n\t\t\t\t} else {\n\t\t\t\t\treturn value || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t_value_has_subentries(value: any): boolean {\n\t\treturn isObject(value) && !isArray(value);\n\t}\n}\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMaterial,\n\tMesh,\n\tMeshPhongMaterial,\n\tPoints,\n\tPointsMaterial,\n\tVector3,\n\tColor\n} from 'three';\n\n// o object_name | g group_name\nconst _object_pattern = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst _material_library_pattern = /^mtllib /;\n// usemtl material_name\nconst _material_use_pattern = /^usemtl /;\n// usemap map_name\nconst _map_use_pattern = /^usemap /;\nconst _face_vertex_data_separator_pattern = /\\s+/;\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _ab = new Vector3();\nconst _cb = new Vector3();\n\nconst _color = new Color();\n\nfunction ParserState() {\n\n\tconst state = {\n\t\tobjects: [],\n\t\tobject: {},\n\n\t\tvertices: [],\n\t\tnormals: [],\n\t\tcolors: [],\n\t\tuvs: [],\n\n\t\tmaterials: {},\n\t\tmaterialLibraries: [],\n\n\t\tstartObject: function ( name, fromDeclaration ) {\n\n\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\n\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\n\t\t\tif ( this.object && this.object.fromDeclaration === false ) {\n\n\t\t\t\tthis.object.name = name;\n\t\t\t\tthis.object.fromDeclaration = ( fromDeclaration !== false );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t\tthis.object = {\n\t\t\t\tname: name || '',\n\t\t\t\tfromDeclaration: ( fromDeclaration !== false ),\n\n\t\t\t\tgeometry: {\n\t\t\t\t\tvertices: [],\n\t\t\t\t\tnormals: [],\n\t\t\t\t\tcolors: [],\n\t\t\t\t\tuvs: [],\n\t\t\t\t\thasUVIndices: false\n\t\t\t\t},\n\t\t\t\tmaterials: [],\n\t\t\t\tsmooth: true,\n\n\t\t\t\tstartMaterial: function ( name, libraries ) {\n\n\t\t\t\t\tconst previous = this._finalize( false );\n\n\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\n\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\n\t\t\t\t\tif ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n\t\t\t\t\t\tthis.materials.splice( previous.index, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst material = {\n\t\t\t\t\t\tindex: this.materials.length,\n\t\t\t\t\t\tname: name || '',\n\t\t\t\t\t\tmtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n\t\t\t\t\t\tsmooth: ( previous !== undefined ? previous.smooth : this.smooth ),\n\t\t\t\t\t\tgroupStart: ( previous !== undefined ? previous.groupEnd : 0 ),\n\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\tinherited: false,\n\n\t\t\t\t\t\tclone: function ( index ) {\n\n\t\t\t\t\t\t\tconst cloned = {\n\t\t\t\t\t\t\t\tindex: ( typeof index === 'number' ? index : this.index ),\n\t\t\t\t\t\t\t\tname: this.name,\n\t\t\t\t\t\t\t\tmtllib: this.mtllib,\n\t\t\t\t\t\t\t\tsmooth: this.smooth,\n\t\t\t\t\t\t\t\tgroupStart: 0,\n\t\t\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\t\t\tinherited: false\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcloned.clone = this.clone.bind( cloned );\n\t\t\t\t\t\t\treturn cloned;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.materials.push( material );\n\n\t\t\t\t\treturn material;\n\n\t\t\t\t},\n\n\t\t\t\tcurrentMaterial: function () {\n\n\t\t\t\t\tif ( this.materials.length > 0 ) {\n\n\t\t\t\t\t\treturn this.materials[ this.materials.length - 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t},\n\n\t\t\t\t_finalize: function ( end ) {\n\n\t\t\t\t\tconst lastMultiMaterial = this.currentMaterial();\n\t\t\t\t\tif ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {\n\n\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n\t\t\t\t\t\tlastMultiMaterial.inherited = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\n\t\t\t\t\tif ( end && this.materials.length > 1 ) {\n\n\t\t\t\t\t\tfor ( let mi = this.materials.length - 1; mi >= 0; mi -- ) {\n\n\t\t\t\t\t\t\tif ( this.materials[ mi ].groupCount <= 0 ) {\n\n\t\t\t\t\t\t\t\tthis.materials.splice( mi, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Guarantee at least one empty material, this makes the creation later more straight forward.\n\t\t\t\t\tif ( end && this.materials.length === 0 ) {\n\n\t\t\t\t\t\tthis.materials.push( {\n\t\t\t\t\t\t\tname: '',\n\t\t\t\t\t\t\tsmooth: this.smooth\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn lastMultiMaterial;\n\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Inherit previous objects material.\n\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\n\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\n\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\n\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n\t\t\tif ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n\t\t\t\tconst declared = previousMaterial.clone( 0 );\n\t\t\t\tdeclared.inherited = true;\n\t\t\t\tthis.object.materials.push( declared );\n\n\t\t\t}\n\n\t\t\tthis.objects.push( this.object );\n\n\t\t},\n\n\t\tfinalize: function () {\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t},\n\n\t\tparseVertexIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseNormalIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseUVIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n\t\t},\n\n\t\taddVertex: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddVertexPoint: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddVertexLine: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.normals;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddFaceNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\t_vA.fromArray( src, a );\n\t\t\t_vB.fromArray( src, b );\n\t\t\t_vC.fromArray( src, c );\n\n\t\t\t_cb.subVectors( _vC, _vB );\n\t\t\t_ab.subVectors( _vA, _vB );\n\t\t\t_cb.cross( _ab );\n\n\t\t\t_cb.normalize();\n\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\n\t\t},\n\n\t\taddColor: function ( a, b, c ) {\n\n\t\t\tconst src = this.colors;\n\t\t\tconst dst = this.object.geometry.colors;\n\n\t\t\tif ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tif ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tif ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddUV: function ( a, b, c ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ] );\n\n\t\t},\n\n\t\taddDefaultUV: function () {\n\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\n\t\t},\n\n\t\taddUVLine: function ( a ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\n\t\t},\n\n\t\taddFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tlet ia = this.parseVertexIndex( a, vLen );\n\t\t\tlet ib = this.parseVertexIndex( b, vLen );\n\t\t\tlet ic = this.parseVertexIndex( c, vLen );\n\n\t\t\tthis.addVertex( ia, ib, ic );\n\t\t\tthis.addColor( ia, ib, ic );\n\n\t\t\t// normals\n\n\t\t\tif ( na !== undefined && na !== '' ) {\n\n\t\t\t\tconst nLen = this.normals.length;\n\n\t\t\t\tia = this.parseNormalIndex( na, nLen );\n\t\t\t\tib = this.parseNormalIndex( nb, nLen );\n\t\t\t\tic = this.parseNormalIndex( nc, nLen );\n\n\t\t\t\tthis.addNormal( ia, ib, ic );\n\n\t\t\t} else {\n\n\t\t\t\tthis.addFaceNormal( ia, ib, ic );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( ua !== undefined && ua !== '' ) {\n\n\t\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\t\tia = this.parseUVIndex( ua, uvLen );\n\t\t\t\tib = this.parseUVIndex( ub, uvLen );\n\t\t\t\tic = this.parseUVIndex( uc, uvLen );\n\n\t\t\t\tthis.addUV( ia, ib, ic );\n\n\t\t\t\tthis.object.geometry.hasUVIndices = true;\n\n\t\t\t} else {\n\n\t\t\t\t// add placeholder values (for inconsistent face definitions)\n\n\t\t\t\tthis.addDefaultUV();\n\n\t\t\t}\n\n\t\t},\n\n\t\taddPointGeometry: function ( vertices ) {\n\n\t\t\tthis.object.geometry.type = 'Points';\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tconst index = this.parseVertexIndex( vertices[ vi ], vLen );\n\n\t\t\t\tthis.addVertexPoint( index );\n\t\t\t\tthis.addColor( index );\n\n\t\t\t}\n\n\t\t},\n\n\t\taddLineGeometry: function ( vertices, uvs ) {\n\n\t\t\tthis.object.geometry.type = 'Line';\n\n\t\t\tconst vLen = this.vertices.length;\n\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tthis.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t}\n\n\t\t\tfor ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n\t\t\t\tthis.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tstate.startObject( '', false );\n\n\treturn state;\n\n}\n\n//\n\nclass OBJLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.materials = null;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tsetMaterials( materials ) {\n\n\t\tthis.materials = materials;\n\n\t\treturn this;\n\n\t}\n\n\tparse( text ) {\n\n\t\tconst state = new ParserState();\n\n\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t}\n\n\t\tif ( text.indexOf( '\\\\\\n' ) !== - 1 ) {\n\n\t\t\t// join lines separated by a line continuation character (\\)\n\t\t\ttext = text.replace( /\\\\\\n/g, '' );\n\n\t\t}\n\n\t\tconst lines = text.split( '\\n' );\n\t\tlet result = [];\n\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tconst line = lines[ i ].trimStart();\n\n\t\t\tif ( line.length === 0 ) continue;\n\n\t\t\tconst lineFirstChar = line.charAt( 0 );\n\n\t\t\t// @todo invoke passed in handler if any\n\t\t\tif ( lineFirstChar === '#' ) continue; // skip comments\n\n\t\t\tif ( lineFirstChar === 'v' ) {\n\n\t\t\t\tconst data = line.split( _face_vertex_data_separator_pattern );\n\n\t\t\t\tswitch ( data[ 0 ] ) {\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tstate.vertices.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( data.length >= 7 ) {\n\n\t\t\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\t\t\tparseFloat( data[ 4 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 5 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 6 ] )\n\t\t\t\t\t\t\t).convertSRGBToLinear();\n\n\t\t\t\t\t\t\tstate.colors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// if no colors are defined, add placeholders so color and vertex indices match\n\n\t\t\t\t\t\t\tstate.colors.push( undefined, undefined, undefined );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vn':\n\t\t\t\t\t\tstate.normals.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vt':\n\t\t\t\t\t\tstate.uvs.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'f' ) {\n\n\t\t\t\tconst lineData = line.slice( 1 ).trim();\n\t\t\t\tconst vertexData = lineData.split( _face_vertex_data_separator_pattern );\n\t\t\t\tconst faceVertices = [];\n\n\t\t\t\t// Parse the face vertex data into an easy to work with format\n\n\t\t\t\tfor ( let j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst vertex = vertexData[ j ];\n\n\t\t\t\t\tif ( vertex.length > 0 ) {\n\n\t\t\t\t\t\tconst vertexParts = vertex.split( '/' );\n\t\t\t\t\t\tfaceVertices.push( vertexParts );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n\t\t\t\tconst v1 = faceVertices[ 0 ];\n\n\t\t\t\tfor ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n\t\t\t\t\tconst v2 = faceVertices[ j ];\n\t\t\t\t\tconst v3 = faceVertices[ j + 1 ];\n\n\t\t\t\t\tstate.addFace(\n\t\t\t\t\t\tv1[ 0 ], v2[ 0 ], v3[ 0 ],\n\t\t\t\t\t\tv1[ 1 ], v2[ 1 ], v3[ 1 ],\n\t\t\t\t\t\tv1[ 2 ], v2[ 2 ], v3[ 2 ]\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'l' ) {\n\n\t\t\t\tconst lineParts = line.substring( 1 ).trim().split( ' ' );\n\t\t\t\tlet lineVertices = [];\n\t\t\t\tconst lineUVs = [];\n\n\t\t\t\tif ( line.indexOf( '/' ) === - 1 ) {\n\n\t\t\t\t\tlineVertices = lineParts;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n\t\t\t\t\t\tconst parts = lineParts[ li ].split( '/' );\n\n\t\t\t\t\t\tif ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] );\n\t\t\t\t\t\tif ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.addLineGeometry( lineVertices, lineUVs );\n\n\t\t\t} else if ( lineFirstChar === 'p' ) {\n\n\t\t\t\tconst lineData = line.slice( 1 ).trim();\n\t\t\t\tconst pointData = lineData.split( ' ' );\n\n\t\t\t\tstate.addPointGeometry( pointData );\n\n\t\t\t} else if ( ( result = _object_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// o object_name\n\t\t\t\t// or\n\t\t\t\t// g group_name\n\n\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n\t\t\t\t// let name = result[ 0 ].slice( 1 ).trim();\n\t\t\t\tconst name = ( ' ' + result[ 0 ].slice( 1 ).trim() ).slice( 1 );\n\n\t\t\t\tstate.startObject( name );\n\n\t\t\t} else if ( _material_use_pattern.test( line ) ) {\n\n\t\t\t\t// material\n\n\t\t\t\tstate.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n\t\t\t} else if ( _material_library_pattern.test( line ) ) {\n\n\t\t\t\t// mtl file\n\n\t\t\t\tstate.materialLibraries.push( line.substring( 7 ).trim() );\n\n\t\t\t} else if ( _map_use_pattern.test( line ) ) {\n\n\t\t\t\t// the line is parsed but ignored since the loader assumes textures are defined MTL files\n\t\t\t\t// (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method)\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Rendering identifier \"usemap\" not supported. Textures must be defined in MTL files.' );\n\n\t\t\t} else if ( lineFirstChar === 's' ) {\n\n\t\t\t\tresult = line.split( ' ' );\n\n\t\t\t\t// smooth shading\n\n\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n\t\t\t\t// but does not define a usemtl for each face set.\n\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n\t\t\t\t// where explicit usemtl defines geometry groups.\n\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n\t\t\t\t/*\n\t\t\t\t\t * http://paulbourke.net/dataformats/obj/\n\t\t\t\t\t *\n\t\t\t\t\t * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n\t\t\t\t\t * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n\t\t\t\t\t * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n\t\t\t\t\t * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n\t\t\t\t\t * than 0.\"\n\t\t\t\t\t */\n\t\t\t\tif ( result.length > 1 ) {\n\n\t\t\t\t\tconst value = result[ 1 ].trim().toLowerCase();\n\t\t\t\t\tstate.object.smooth = ( value !== '0' && value !== 'off' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// ZBrush can produce \"s\" lines #11707\n\t\t\t\t\tstate.object.smooth = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = state.object.currentMaterial();\n\t\t\t\tif ( material ) material.smooth = state.object.smooth;\n\n\t\t\t} else {\n\n\t\t\t\t// Handle null terminated files without exception\n\t\t\t\tif ( line === '\\0' ) continue;\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Unexpected line: \"' + line + '\"' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.finalize();\n\n\t\tconst container = new Group();\n\t\tcontainer.materialLibraries = [].concat( state.materialLibraries );\n\n\t\tconst hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );\n\n\t\tif ( hasPrimitives === true ) {\n\n\t\t\tfor ( let i = 0, l = state.objects.length; i < l; i ++ ) {\n\n\t\t\t\tconst object = state.objects[ i ];\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst materials = object.materials;\n\t\t\t\tconst isLine = ( geometry.type === 'Line' );\n\t\t\t\tconst isPoints = ( geometry.type === 'Points' );\n\t\t\t\tlet hasVertexColors = false;\n\n\t\t\t\t// Skip o/g line declarations that did not follow with any faces\n\t\t\t\tif ( geometry.vertices.length === 0 ) continue;\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );\n\n\t\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\t\thasVertexColors = true;\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.hasUVIndices === true ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Create materials\n\n\t\t\t\tconst createdMaterials = [];\n\n\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\tconst materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;\n\t\t\t\t\tlet material = state.materials[ materialHash ];\n\n\t\t\t\t\tif ( this.materials !== null ) {\n\n\t\t\t\t\t\tmaterial = this.materials.create( sourceMaterial.name );\n\n\t\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n\t\t\t\t\t\tif ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialLine = new LineBasicMaterial();\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialLine, material );\n\t\t\t\t\t\t\tmaterialLine.color.copy( material.color );\n\t\t\t\t\t\t\tmaterial = materialLine;\n\n\t\t\t\t\t\t} else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } );\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialPoints, material );\n\t\t\t\t\t\t\tmaterialPoints.color.copy( material.color );\n\t\t\t\t\t\t\tmaterialPoints.map = material.map;\n\t\t\t\t\t\t\tmaterial = materialPoints;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( material === undefined ) {\n\n\t\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\t\tmaterial = new LineBasicMaterial();\n\n\t\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\t\tmaterial = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterial.name = sourceMaterial.name;\n\t\t\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? false : true;\n\t\t\t\t\t\tmaterial.vertexColors = hasVertexColors;\n\n\t\t\t\t\t\tstate.materials[ materialHash ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcreatedMaterials.push( material );\n\n\t\t\t\t}\n\n\t\t\t\t// Create mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tif ( createdMaterials.length > 1 ) {\n\n\t\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\t\tbuffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = object.name;\n\n\t\t\t\tcontainer.add( mesh );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// if there is only the default parser state object with no geometry data, interpret data as point cloud\n\n\t\t\tif ( state.vertices.length > 0 ) {\n\n\t\t\t\tconst material = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) );\n\n\t\t\t\tif ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst points = new Points( buffergeometry, material );\n\t\t\t\tcontainer.add( points );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn container;\n\n\t}\n\n}\n\nexport { OBJLoader };\n","import {Object3D} from 'three';\nimport {OBJLoader} from 'three/examples/jsm/loaders/OBJLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nexport class OBJLoaderHandler extends BaseObject3DLoaderHandler<Object3D> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<Object3D>> {\n\t\treturn (this._loader = this._loader || (await new OBJLoader(this.loadingManager)));\n\t}\n}\n","import {Data3DTexture, RedFormat, LinearFilter, HalfFloatType, FloatType, ClampToEdgeWrapping, Vector3} from 'three';\nimport {CoreBaseLoader} from '../_Base';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {CoreUserAgent} from '../../UserAgent';\n\nexport interface SDFLoaderOptions {}\n\nexport class SDFLoader extends CoreBaseLoader<string> {\n\tconstructor(url: string, protected override _node?: BaseNodeType) {\n\t\tsuper(url, _node);\n\t}\n\n\tasync load(\n\t\tsuccessCallback: (geometry: Data3DTexture) => void,\n\t\tprogressCallback: (() => void) | undefined,\n\t\terrorCallback: (error: ErrorEvent) => void | undefined\n\t) {\n\t\tconst url =  this._urlToLoad();\n\n\t\t// const loader = new FileLoader(this.loadingManager);\n\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\n\t\t\tvar fileReader = new FileReader();\n\t\t\tfileReader.onload = function (event) {\n\t\t\t\ttry {\n\t\t\t\t\tconst arrayBuffer = event.target?.result;\n\t\t\t\t\tif (arrayBuffer && arrayBuffer instanceof ArrayBuffer) {\n\t\t\t\t\t\tconst texture = loadSDFMetadata(arrayBuffer);\n\t\t\t\t\t\tsuccessCallback(texture);\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrorCallback(new ErrorEvent('content is not an arrayBuffer'));\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terrorCallback(err instanceof ErrorEvent ? err : new ErrorEvent('fail to read SDF file'));\n\t\t\t\t}\n\t\t\t};\n\t\t\tfileReader.onerror = () => {\n\t\t\t\terrorCallback(new ErrorEvent('failure to read response content'));\n\t\t\t};\n\t\t\tfileReader.readAsArrayBuffer(blob);\n\t\t} catch (err) {\n\t\t\terrorCallback(err as ErrorEvent);\n\t\t}\n\t}\n}\n\ninterface MetadataOptions {\n\tboundMin: Vector3;\n\tboundMax: Vector3;\n\tresolution: Vector3;\n}\nexport interface SDFDataContainer {\n\twidth: number;\n\theight: number;\n\tdepth: number;\n\tboundMinx: number;\n\tboundMiny: number;\n\tboundMinz: number;\n\tboundMaxx: number;\n\tboundMaxy: number;\n\tboundMaxz: number;\n\tresolutionx: number;\n\tresolutiony: number;\n\tresolutionz: number;\n\tdata: Float32Array;\n}\nexport function addSDFMetadataToContainer(texture: Data3DTexture, options: MetadataOptions) {\n\tconst dataContainer = texture?.image as unknown as SDFDataContainer;\n\tif (!dataContainer) {\n\t\tthrow new Error('the input must be a 3D texture');\n\t\treturn;\n\t}\n\tdataContainer.boundMinx = options.boundMin.x;\n\tdataContainer.boundMiny = options.boundMin.y;\n\tdataContainer.boundMinz = options.boundMin.z;\n\tdataContainer.boundMaxx = options.boundMax.x;\n\tdataContainer.boundMaxy = options.boundMax.y;\n\tdataContainer.boundMaxz = options.boundMax.z;\n\tdataContainer.resolutionx = options.resolution.x;\n\tdataContainer.resolutiony = options.resolution.y;\n\tdataContainer.resolutionz = options.resolution.z;\n}\nexport function readSDFMetadataFromContainer(texture: Data3DTexture) {\n\tconst dataContainer = texture?.image as unknown as SDFDataContainer;\n\tif (!dataContainer) {\n\t\tthrow new Error('the input must be a 3D texture');\n\t\treturn;\n\t}\n\treturn dataContainer;\n}\nexport function saveSDFMetadata(texture: Data3DTexture) {\n\tconst dataContainer = readSDFMetadataFromContainer(texture);\n\tif (!dataContainer) {\n\t\tthrow new Error('the input must be a 3D texture');\n\t\treturn;\n\t}\n\tconst data: Float32Array = dataContainer.data;\n\n\tconst metadataSizes = {\n\t\tmetadataLength: 1,\n\t\tdimensions: 3,\n\t\tbounds: 6,\n\t\tresolution: 3,\n\t};\n\tconst metadataLength =\n\t\tmetadataSizes.metadataLength + metadataSizes.dimensions + metadataSizes.bounds + metadataSizes.resolution;\n\n\t// add metadata\n\tconst currentLength = data.length;\n\tconst dataWithMetadata = new Float32Array(currentLength + metadataLength);\n\t// 1. numbers 0 is length of metadata\n\tdataWithMetadata[0] = metadataLength;\n\t// 2. numbers 1 to 3 are the resolution\n\tdataWithMetadata[1] = dataContainer.width;\n\tdataWithMetadata[2] = dataContainer.height;\n\tdataWithMetadata[3] = dataContainer.depth;\n\t// 3. numbers 4 to 9 are the bounds\n\tdataWithMetadata[4] = dataContainer.boundMinx;\n\tdataWithMetadata[5] = dataContainer.boundMiny;\n\tdataWithMetadata[6] = dataContainer.boundMinz;\n\tdataWithMetadata[7] = dataContainer.boundMaxx;\n\tdataWithMetadata[8] = dataContainer.boundMaxy;\n\tdataWithMetadata[9] = dataContainer.boundMaxz;\n\t// 4. numbers 10 to 12 are the resolution\n\tdataWithMetadata[10] = dataContainer.resolutionx;\n\tdataWithMetadata[11] = dataContainer.resolutiony;\n\tdataWithMetadata[12] = dataContainer.resolutionz;\n\t// 5. create new array\n\tfor (let i = 0; i < currentLength; i++) {\n\t\tdataWithMetadata[i + metadataLength] = data[i];\n\t}\n\treturn dataWithMetadata;\n}\n\nfunction loadSDFMetadata(arrayBuffer: ArrayBuffer): Data3DTexture {\n\tconst float32Array = new Float32Array(arrayBuffer);\n\tconst currentLength = float32Array.length;\n\t// 1. numbers 0 is length of metadata\n\tconst metadataLength = float32Array[0];\n\t// 2. numbers 1 to 3 are the resolution\n\tconst width = float32Array[1];\n\tconst height = float32Array[2];\n\tconst depth = float32Array[3];\n\t// 3. numbers 4 to 9 are the bounds\n\tconst boundMinx = float32Array[4];\n\tconst boundMiny = float32Array[5];\n\tconst boundMinz = float32Array[6];\n\tconst boundMaxx = float32Array[7];\n\tconst boundMaxy = float32Array[8];\n\tconst boundMaxz = float32Array[9];\n\t// 4. numbers 10 to 12 are the resolution\n\tconst resolutionx = float32Array[10];\n\tconst resolutiony = float32Array[11];\n\tconst resolutionz = float32Array[12];\n\n\t// 3. create new array\n\tconst texture = createSDFTexture(width, height, depth);\n\tconst dataWithoutMetadata = texture.image.data;\n\tfor (let i = 0; i < currentLength; i++) {\n\t\tdataWithoutMetadata[i] = float32Array[i + metadataLength];\n\t}\n\n\tconst dataContainer = texture.image as unknown as SDFDataContainer;\n\tdataContainer.boundMinx = boundMinx;\n\tdataContainer.boundMiny = boundMiny;\n\tdataContainer.boundMinz = boundMinz;\n\tdataContainer.boundMaxx = boundMaxx;\n\tdataContainer.boundMaxy = boundMaxy;\n\tdataContainer.boundMaxz = boundMaxz;\n\tdataContainer.resolutionx = resolutionx;\n\tdataContainer.resolutiony = resolutiony;\n\tdataContainer.resolutionz = resolutionz;\n\n\treturn texture;\n}\n\nexport function createSDFTexture(width: number, height: number, depth: number) {\n\tconst texture = new Data3DTexture(new Float32Array(width * height * depth).fill(0), width, height, depth);\n\ttexture.format = RedFormat;\n\ttexture.minFilter = LinearFilter;\n\ttexture.magFilter = LinearFilter;\n\ttexture.wrapS = ClampToEdgeWrapping;\n\ttexture.wrapT = ClampToEdgeWrapping;\n\t(texture as any).wrapR = ClampToEdgeWrapping;\n\ttexture.unpackAlignment = 1;\n\ttexture.needsUpdate = true;\n\ttexture.type = CoreUserAgent.isiOS() ? HalfFloatType : FloatType;\n\treturn texture;\n}\n","import {CoreUserAgent} from '../UserAgent';\nimport {CoreBaseLoader} from './_Base';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport type {BaseGeoLoaderOutput} from './geometry/Common';\n\nexport enum GeometryFormat {\n\tAUTO = 'auto',\n\tJSON = 'json',\n}\nexport const GEOMETRY_FORMATS: GeometryFormat[] = [GeometryFormat.AUTO, GeometryFormat.JSON];\n\ntype MaxConcurrentLoadsCountMethod = () => number;\ninterface CoreLoaderGeometryOptions {\n\turl: string;\n\tformat: GeometryFormat;\n}\nexport class CoreLoaderGeometry extends CoreBaseLoader<string> {\n\tconstructor(protected _options: CoreLoaderGeometryOptions, protected override _node: BaseNodeType) {\n\t\tsuper(_options.url, _node);\n\t}\n\n\t//\n\t//\n\t// CONCURRENT LOADS\n\t//\n\t//\n\tprivate static MAX_CONCURRENT_LOADS_COUNT: number = CoreLoaderGeometry._initMaxConcurrentLoadsCount();\n\tprivate static CONCURRENT_LOADS_DELAY: number = CoreLoaderGeometry._initConcurrentLoadsDelay();\n\tprivate static _inProgressLoadsCount: number = 0;\n\tprivate static _queue: Array<() => void> = [];\n\tprivate static _maxConcurrentLoadsCountMethod: MaxConcurrentLoadsCountMethod | undefined;\n\tpublic static setMaxConcurrentLoadsCount(method: MaxConcurrentLoadsCountMethod | undefined) {\n\t\tthis._maxConcurrentLoadsCountMethod = method;\n\t}\n\tprivate static _initMaxConcurrentLoadsCount(): number {\n\t\tif (this._maxConcurrentLoadsCountMethod) {\n\t\t\treturn this._maxConcurrentLoadsCountMethod();\n\t\t}\n\t\treturn CoreUserAgent.isChrome() ? 4 : 1;\n\t\t// const parser = new UAParser();\n\t\t// const name = parser.getBrowser().name;\n\t\t// // limit to 4 for non chrome,\n\t\t// // as firefox was seen hanging trying to load multiple glb files\n\t\t// // limit to 1 for safari,\n\t\t// if (name) {\n\t\t// \tconst loads_count_by_browser: PolyDictionary<number> = {\n\t\t// \t\tChrome: 10,\n\t\t// \t\tFirefox: 4,\n\t\t// \t};\n\t\t// \tconst loads_count = loads_count_by_browser[name];\n\t\t// \tif (loads_count != null) {\n\t\t// \t\treturn loads_count;\n\t\t// \t}\n\t\t// }\n\t\t// return 1;\n\t}\n\tprivate static _initConcurrentLoadsDelay(): number {\n\t\treturn CoreUserAgent.isChrome() ? 1 : 10;\n\t\t// const parser = new UAParser();\n\t\t// const name = parser.getBrowser().name;\n\t\t// // add a delay for browsers other than Chrome and Firefox\n\t\t// if (name) {\n\t\t// \tconst delay_by_browser: PolyDictionary<number> = {\n\t\t// \t\tChrome: 1,\n\t\t// \t\tFirefox: 10,\n\t\t// \t\tSafari: 10,\n\t\t// \t};\n\t\t// \tconst delay = delay_by_browser[name];\n\t\t// \tif (delay != null) {\n\t\t// \t\treturn delay;\n\t\t// \t}\n\t\t// }\n\t\t// return 10;\n\t}\n\t// public static override_max_concurrent_loads_count(count: number) {\n\t// \tthis.MAX_CONCURRENT_LOADS_COUNT = count;\n\t// }\n\n\tstatic incrementInProgressLoadsCount() {\n\t\tthis._inProgressLoadsCount++;\n\t}\n\tstatic decrementInProgressLoadsCount(url: string, object?: BaseGeoLoaderOutput) {\n\t\tthis._inProgressLoadsCount--;\n\n\t\tconst queuedResolve = this._queue.pop();\n\t\tif (queuedResolve) {\n\t\t\tconst delay = this.CONCURRENT_LOADS_DELAY;\n\t\t\tsetTimeout(() => {\n\t\t\t\tqueuedResolve();\n\t\t\t}, delay);\n\t\t}\n\t\tthis._runOnAssetLoadedCallbacks(url, object);\n\t}\n\n\tstatic async waitForMaxConcurrentLoadsQueueFreed(): Promise<void> {\n\t\tif (this._inProgressLoadsCount <= this.MAX_CONCURRENT_LOADS_COUNT) {\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis._queue.push(resolve);\n\t\t\t});\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../geometry/ObjectContent';\nimport {CoreLoaderGeometry} from '../Geometry';\nimport {BaseLoaderLoadOptions, CoreBaseLoader} from '../_Base';\n\nimport type {BaseGeoLoaderOutput, OnSuccess, OnProgress, OnError} from './Common';\nimport {isPromise} from '../../Type';\n\nexport abstract class BaseGeoLoader<O extends BaseGeoLoaderOutput> {\n\tabstract load: (url: string, onSuccess: OnSuccess<O>, onProgress?: OnProgress, onError?: OnError) => void;\n}\n\nexport abstract class BaseLoaderHandler<\n\tO extends BaseGeoLoaderOutput,\n\tOC extends ObjectContent<CoreObjectType>\n> extends CoreBaseLoader<string> {\n\tprotected _loader: BaseGeoLoader<O> | undefined;\n\n\treset() {\n\t\tthis._loader = undefined;\n\t}\n\n\tasync load(options: BaseLoaderLoadOptions): Promise<OC[] | undefined> {\n\t\tconst loader = await this._getLoader(options);\n\t\tif (!loader) {\n\t\t\tconsole.warn('no loader', this);\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = this._urlToLoad();\n\n\t\treturn new Promise(async (resolve) => {\n\t\t\tCoreLoaderGeometry.incrementInProgressLoadsCount();\n\t\t\tawait CoreLoaderGeometry.waitForMaxConcurrentLoadsQueueFreed();\n\t\t\tloader.load(\n\t\t\t\turl,\n\t\t\t\t(object: O) => {\n\t\t\t\t\tCoreLoaderGeometry.decrementInProgressLoadsCount(url, object);\n\t\t\t\t\tconst result = this._onLoadSuccess(object);\n\t\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\t\tresult.then((newObjects) => {\n\t\t\t\t\t\t\tresolve(newObjects);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t(progress) => {},\n\t\t\t\t(event: ErrorEvent) => {\n\t\t\t\t\tCoreLoaderGeometry.decrementInProgressLoadsCount(url);\n\t\t\t\t\tconst message = this._errorMessage(url, event);\n\t\t\t\t\toptions.node?.states.error.set(message);\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\tprotected _errorMessage(url: string, event: ErrorEvent) {\n\t\treturn `could not load geometry from ${url} (Error: ${event.message})`;\n\t}\n\n\tprotected abstract _getLoader(options: BaseLoaderLoadOptions): Promise<BaseGeoLoader<O>>;\n\tprotected abstract _onLoadSuccess(o: O): OC[] | Promise<OC[]>;\n}\n\nexport abstract class BaseObject3DLoaderHandler<O extends BaseGeoLoaderOutput> extends BaseLoaderHandler<O, Object3D> {\n\tprotected _onLoadSuccess(o: O): Object3D[] | Promise<Object3D[]> {\n\t\tif (o instanceof Object3D) {\n\t\t\treturn [o];\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n","/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor( pool = 4 ) {\n\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n","const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,U=161,c=162,h=163,_=0,p=1,g=0,y=1,x=2,u=3,b=4,d=5,m=6,w=7,D=8,B=9,L=10,A=11,k=12,v=13,S=14,I=15,O=16,T=17,V=18,E=0,F=1,P=2,C=3,z=4,M=5,W=6,N=7,H=8,K=9,X=10,j=11,R=0,Y=1,q=2,G=13,J=14,Q=15,Z=128,$=64,tt=32,et=16,nt=0,it=1,st=2,at=3,rt=4,ot=5,lt=6,ft=7,Ut=8,ct=9,ht=10,_t=13,pt=14,gt=15,yt=16,xt=17,ut=20,bt=21,dt=22,mt=23,wt=24,Dt=27,Bt=28,Lt=29,At=30,kt=31,vt=34,St=35,It=36,Ot=37,Tt=38,Vt=41,Et=42,Ft=43,Pt=44,Ct=45,zt=48,Mt=49,Wt=50,Nt=58,Ht=59,Kt=62,Xt=63,jt=64,Rt=65,Yt=68,qt=69,Gt=70,Jt=71,Qt=74,Zt=75,$t=76,te=77,ee=78,ne=81,ie=82,se=83,ae=84,re=85,oe=88,le=89,fe=90,Ue=91,ce=92,he=95,_e=96,pe=97,ge=98,ye=99,xe=100,ue=101,be=102,de=103,me=104,we=105,De=106,Be=107,Le=108,Ae=109,ke=110,ve=111,Se=112,Ie=113,Oe=114,Te=115,Ve=116,Ee=117,Fe=118,Pe=119,Ce=120,ze=121,Me=122,We=123,Ne=124,He=125,Ke=126,Xe=127,je=128,Re=129,Ye=130,qe=131,Ge=132,Je=133,Qe=134,Ze=135,$e=136,tn=137,en=138,nn=139,sn=140,an=141,rn=142,on=143,ln=144,fn=145,Un=146,cn=147,hn=148,_n=149,pn=150,gn=151,yn=152,xn=153,un=154,bn=155,dn=156,mn=157,wn=158,Dn=159,Bn=160,Ln=161,An=162,kn=163,vn=164,Sn=165,In=166,On=167,Tn=168,Vn=169,En=170,Fn=171,Pn=172,Cn=173,zn=174,Mn=175,Wn=176,Nn=177,Hn=178,Kn=179,Xn=180,jn=181,Rn=182,Yn=183,qn=184,Gn=1000156007,Jn=1000156008,Qn=1000156009,Zn=1000156010,$n=1000156011,ti=1000156017,ei=1000156018,ni=1000156019,ii=1000156020,si=1000156021,ai=1000054e3,ri=1000054001,oi=1000054002,li=1000054003,fi=1000054004,Ui=1000054005,ci=1000054006,hi=1000054007,_i=1000066e3,pi=1000066001,gi=1000066002,yi=1000066003,xi=1000066004,ui=1000066005,bi=1000066006,di=1000066007,mi=1000066008,wi=1000066009,Di=1000066010,Bi=1000066011,Li=1000066012,Ai=1000066013,ki=100034e4,vi=1000340001;class Si{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Ii{constructor(t,e,n,i){this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_skip(t){return this._offset+=t,this}_scan(t,e=0){const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}const Oi=new Uint8Array([0]),Ti=[171,75,84,88,32,50,48,187,13,10,26,10];function Vi(t){return\"undefined\"!=typeof TextEncoder?(new TextEncoder).encode(t):Buffer.from(t)}function Ei(t){return\"undefined\"!=typeof TextDecoder?(new TextDecoder).decode(t):Buffer.from(t).toString(\"utf8\")}function Fi(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function Pi(t){const e=new Uint8Array(t.buffer,t.byteOffset,Ti.length);if(e[0]!==Ti[0]||e[1]!==Ti[1]||e[2]!==Ti[2]||e[3]!==Ti[3]||e[4]!==Ti[4]||e[5]!==Ti[5]||e[6]!==Ti[6]||e[7]!==Ti[7]||e[8]!==Ti[8]||e[9]!==Ti[9]||e[10]!==Ti[10]||e[11]!==Ti[11])throw new Error(\"Missing KTX 2.0 identifier.\");const n=new Si,i=17*Uint32Array.BYTES_PER_ELEMENT,s=new Ii(t,Ti.length,i,!0);n.vkFormat=s._nextUint32(),n.typeSize=s._nextUint32(),n.pixelWidth=s._nextUint32(),n.pixelHeight=s._nextUint32(),n.pixelDepth=s._nextUint32(),n.layerCount=s._nextUint32(),n.faceCount=s._nextUint32();const a=s._nextUint32();n.supercompressionScheme=s._nextUint32();const r=s._nextUint32(),o=s._nextUint32(),l=s._nextUint32(),f=s._nextUint32(),U=s._nextUint64(),c=s._nextUint64(),h=new Ii(t,Ti.length+i,3*a*8,!0);for(let e=0;e<a;e++)n.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+h._nextUint64(),h._nextUint64()),uncompressedByteLength:h._nextUint64()});const _=new Ii(t,r,o,!0),p={vendorId:_._skip(4)._nextUint16(),descriptorType:_._nextUint16(),versionNumber:_._nextUint16(),descriptorBlockSize:_._nextUint16(),colorModel:_._nextUint8(),colorPrimaries:_._nextUint8(),transferFunction:_._nextUint8(),flags:_._nextUint8(),texelBlockDimension:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],bytesPlane:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],samples:[]},g=(p.descriptorBlockSize/4-6)/4;for(let t=0;t<g;t++){const e={bitOffset:_._nextUint16(),bitLength:_._nextUint8(),channelType:_._nextUint8(),samplePosition:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],sampleLower:-Infinity,sampleUpper:Infinity};64&e.channelType?(e.sampleLower=_._nextInt32(),e.sampleUpper=_._nextInt32()):(e.sampleLower=_._nextUint32(),e.sampleUpper=_._nextUint32()),p.samples[t]=e}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(p);const y=new Ii(t,l,f,!0);for(;y._offset<f;){const t=y._nextUint32(),e=y._scan(t),i=Ei(e),s=y._scan(t-e.byteLength);n.keyValue[i]=i.match(/^ktx/i)?Ei(s):s,y._offset%4&&y._skip(4-y._offset%4)}if(c<=0)return n;const x=new Ii(t,U,c,!0),u=x._nextUint16(),b=x._nextUint16(),d=x._nextUint32(),m=x._nextUint32(),w=x._nextUint32(),D=x._nextUint32(),B=[];for(let t=0;t<a;t++)B.push({imageFlags:x._nextUint32(),rgbSliceByteOffset:x._nextUint32(),rgbSliceByteLength:x._nextUint32(),alphaSliceByteOffset:x._nextUint32(),alphaSliceByteLength:x._nextUint32()});const L=U+x._offset,A=L+d,k=A+m,v=k+w,S=new Uint8Array(t.buffer,t.byteOffset+L,d),I=new Uint8Array(t.buffer,t.byteOffset+A,m),O=new Uint8Array(t.buffer,t.byteOffset+k,w),T=new Uint8Array(t.buffer,t.byteOffset+v,D);return n.globalData={endpointCount:u,selectorCount:b,imageDescs:B,endpointsData:S,selectorsData:I,tablesData:O,extendedData:T},n}function Ci(){return(Ci=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}const zi={keepWriter:!1};function Mi(t,e={}){e=Ci({},zi,e);let n=new ArrayBuffer(0);if(t.globalData){const e=new ArrayBuffer(20+5*t.globalData.imageDescs.length*4),i=new DataView(e);i.setUint16(0,t.globalData.endpointCount,!0),i.setUint16(2,t.globalData.selectorCount,!0),i.setUint32(4,t.globalData.endpointsData.byteLength,!0),i.setUint32(8,t.globalData.selectorsData.byteLength,!0),i.setUint32(12,t.globalData.tablesData.byteLength,!0),i.setUint32(16,t.globalData.extendedData.byteLength,!0);for(let e=0;e<t.globalData.imageDescs.length;e++){const n=t.globalData.imageDescs[e];i.setUint32(20+5*e*4+0,n.imageFlags,!0),i.setUint32(20+5*e*4+4,n.rgbSliceByteOffset,!0),i.setUint32(20+5*e*4+8,n.rgbSliceByteLength,!0),i.setUint32(20+5*e*4+12,n.alphaSliceByteOffset,!0),i.setUint32(20+5*e*4+16,n.alphaSliceByteLength,!0)}n=Fi([e,t.globalData.endpointsData,t.globalData.selectorsData,t.globalData.tablesData,t.globalData.extendedData])}const i=[];let s=t.keyValue;e.keepWriter||(s=Ci({},t.keyValue,{KTXwriter:\"KTX-Parse v0.3.1\"}));for(const t in s){const e=s[t],n=Vi(t),a=\"string\"==typeof e?Vi(e):e,r=n.byteLength+1+a.byteLength+1,o=r%4?4-r%4:0;i.push(Fi([new Uint32Array([r]),n,Oi,a,Oi,new Uint8Array(o).fill(0)]))}const a=Fi(i);if(1!==t.dataFormatDescriptor.length||0!==t.dataFormatDescriptor[0].descriptorType)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const r=t.dataFormatDescriptor[0],o=new ArrayBuffer(28+16*r.samples.length),l=new DataView(o),f=24+16*r.samples.length;if(l.setUint32(0,o.byteLength,!0),l.setUint16(4,r.vendorId,!0),l.setUint16(6,r.descriptorType,!0),l.setUint16(8,r.versionNumber,!0),l.setUint16(10,f,!0),l.setUint8(12,r.colorModel),l.setUint8(13,r.colorPrimaries),l.setUint8(14,r.transferFunction),l.setUint8(15,r.flags),!Array.isArray(r.texelBlockDimension))throw new Error(\"texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.\");l.setUint8(16,r.texelBlockDimension[0]),l.setUint8(17,r.texelBlockDimension[1]),l.setUint8(18,r.texelBlockDimension[2]),l.setUint8(19,r.texelBlockDimension[3]);for(let t=0;t<8;t++)l.setUint8(20+t,r.bytesPlane[t]);for(let t=0;t<r.samples.length;t++){const e=r.samples[t],n=28+16*t;if(e.channelID)throw new Error(\"channelID has been renamed to channelType.\");l.setUint16(n+0,e.bitOffset,!0),l.setUint8(n+2,e.bitLength),l.setUint8(n+3,e.channelType),l.setUint8(n+4,e.samplePosition[0]),l.setUint8(n+5,e.samplePosition[1]),l.setUint8(n+6,e.samplePosition[2]),l.setUint8(n+7,e.samplePosition[3]),64&e.channelType?(l.setInt32(n+8,e.sampleLower,!0),l.setInt32(n+12,e.sampleUpper,!0)):(l.setUint32(n+8,e.sampleLower,!0),l.setUint32(n+12,e.sampleUpper,!0))}const U=Ti.length+68+3*t.levels.length*8,c=U+o.byteLength;let h=n.byteLength>0?c+a.byteLength:0;h%8&&(h+=8-h%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8));let g=(h||c+a.byteLength)+n.byteLength;for(let e=0;e<t.levels.length;e++){const n=t.levels[e];_.push(n.levelData),p.setBigUint64(24*e+0,BigInt(g),!0),p.setBigUint64(24*e+8,BigInt(n.levelData.byteLength),!0),p.setBigUint64(24*e+16,BigInt(n.uncompressedByteLength),!0),g+=n.levelData.byteLength}const y=new ArrayBuffer(68),x=new DataView(y);return x.setUint32(0,t.vkFormat,!0),x.setUint32(4,t.typeSize,!0),x.setUint32(8,t.pixelWidth,!0),x.setUint32(12,t.pixelHeight,!0),x.setUint32(16,t.pixelDepth,!0),x.setUint32(20,t.layerCount,!0),x.setUint32(24,t.faceCount,!0),x.setUint32(28,t.levels.length,!0),x.setUint32(32,t.supercompressionScheme,!0),x.setUint32(36,U,!0),x.setUint32(40,o.byteLength,!0),x.setUint32(44,c,!0),x.setUint32(48,a.byteLength,!0),x.setBigUint64(52,BigInt(n.byteLength>0?h:0),!0),x.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Fi([new Uint8Array(Ti).buffer,y,p.buffer,o,a,h>0?new ArrayBuffer(h-(c+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Q as KHR_DF_CHANNEL_RGBSDA_ALPHA,q as KHR_DF_CHANNEL_RGBSDA_BLUE,J as KHR_DF_CHANNEL_RGBSDA_DEPTH,Y as KHR_DF_CHANNEL_RGBSDA_GREEN,R as KHR_DF_CHANNEL_RGBSDA_RED,G as KHR_DF_CHANNEL_RGBSDA_STENCIL,p as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,_ as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,c as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,h as KHR_DF_MODEL_ETC1S,U as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,o as KHR_DF_MODEL_UNSPECIFIED,W as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,j as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,P as KHR_DF_PRIMARIES_BT601_EBU,C as KHR_DF_PRIMARIES_BT601_SMPTE,F as KHR_DF_PRIMARIES_BT709,M as KHR_DF_PRIMARIES_CIEXYZ,X as KHR_DF_PRIMARIES_DISPLAYP3,H as KHR_DF_PRIMARIES_NTSC1953,K as KHR_DF_PRIMARIES_PAL525,E as KHR_DF_PRIMARIES_UNSPECIFIED,tt as KHR_DF_SAMPLE_DATATYPE_EXPONENT,Z as KHR_DF_SAMPLE_DATATYPE_FLOAT,et as KHR_DF_SAMPLE_DATATYPE_LINEAR,$ as KHR_DF_SAMPLE_DATATYPE_SIGNED,O as KHR_DF_TRANSFER_ACESCC,T as KHR_DF_TRANSFER_ACESCCT,V as KHR_DF_TRANSFER_ADOBERGB,w as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,B as KHR_DF_TRANSFER_HLG_EOTF,D as KHR_DF_TRANSFER_HLG_OETF,u as KHR_DF_TRANSFER_ITU,y as KHR_DF_TRANSFER_LINEAR,b as KHR_DF_TRANSFER_NTSC,S as KHR_DF_TRANSFER_PAL625_EOTF,v as KHR_DF_TRANSFER_PAL_OETF,L as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,d as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,x as KHR_DF_TRANSFER_SRGB,I as KHR_DF_TRANSFER_ST240,g as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Si as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,qt as VK_FORMAT_A2B10G10R10_SINT_PACK32,Rt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,Yt as VK_FORMAT_A2B10G10R10_UINT_PACK32,jt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Ht as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Kt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Bi as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Xn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Kn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,wi as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Wn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Mn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,Li as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,jn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,qn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,_i as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,wn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,pi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Bn as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Dn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,Ln as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,yi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,In as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,Sn as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,ui as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,On as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,En as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,Vn as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Pn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,Me as VK_FORMAT_B10G11R11_UFLOAT_PACK32,$n as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,si as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,at as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ft as VK_FORMAT_B5G5R5A1_UNORM_PACK16,ot as VK_FORMAT_B5G6R5_UNORM_PACK16,Mt as VK_FORMAT_B8G8R8A8_SINT,Ct as VK_FORMAT_B8G8R8A8_SNORM,Wt as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Pt as VK_FORMAT_B8G8R8A8_UNORM,St as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,It as VK_FORMAT_B8G8R8_SRGB,vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Qe as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Je as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Ge as VK_FORMAT_BC1_RGB_SRGB_BLOCK,qe as VK_FORMAT_BC1_RGB_UNORM_BLOCK,$e as VK_FORMAT_BC2_SRGB_BLOCK,Ze as VK_FORMAT_BC2_UNORM_BLOCK,en as VK_FORMAT_BC3_SRGB_BLOCK,tn as VK_FORMAT_BC3_UNORM_BLOCK,sn as VK_FORMAT_BC4_SNORM_BLOCK,nn as VK_FORMAT_BC4_UNORM_BLOCK,rn as VK_FORMAT_BC5_SNORM_BLOCK,an as VK_FORMAT_BC5_UNORM_BLOCK,ln as VK_FORMAT_BC6H_SFLOAT_BLOCK,on as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,fn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,je as VK_FORMAT_D16_UNORM_S8_UINT,Re as VK_FORMAT_D24_UNORM_S8_UINT,Ke as VK_FORMAT_D32_SFLOAT,Ye as VK_FORMAT_D32_SFLOAT_S8_UINT,We as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,dn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,bn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,un as VK_FORMAT_EAC_R11_SNORM_BLOCK,xn as VK_FORMAT_EAC_R11_UNORM_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,hn as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,Zn as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,ii as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,fi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ai as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,hi as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Qn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Jn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Gn as VK_FORMAT_R10X6_UNORM_PACK16,ni as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ei as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ti as VK_FORMAT_R12X4_UNORM_PACK16,pe as VK_FORMAT_R16G16B16A16_SFLOAT,_e as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,he as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,fe as VK_FORMAT_R16G16B16_SFLOAT,le as VK_FORMAT_R16G16B16_SINT,re as VK_FORMAT_R16G16B16_SNORM,oe as VK_FORMAT_R16G16B16_UINT,ae as VK_FORMAT_R16G16B16_UNORM,se as VK_FORMAT_R16G16_SFLOAT,ie as VK_FORMAT_R16G16_SINT,ee as VK_FORMAT_R16G16_SNORM,ne as VK_FORMAT_R16G16_UINT,te as VK_FORMAT_R16G16_UNORM,$t as VK_FORMAT_R16_SFLOAT,Zt as VK_FORMAT_R16_SINT,Jt as VK_FORMAT_R16_SNORM,Qt as VK_FORMAT_R16_UINT,Gt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,Le as VK_FORMAT_R32G32B32A32_SINT,Be as VK_FORMAT_R32G32B32A32_UINT,De as VK_FORMAT_R32G32B32_SFLOAT,we as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,de as VK_FORMAT_R32G32_SFLOAT,be as VK_FORMAT_R32G32_SINT,ue as VK_FORMAT_R32G32_UINT,xe as VK_FORMAT_R32_SFLOAT,ye as VK_FORMAT_R32_SINT,ge as VK_FORMAT_R32_UINT,st as VK_FORMAT_R4G4B4A4_UNORM_PACK16,it as VK_FORMAT_R4G4_UNORM_PACK8,lt as VK_FORMAT_R5G5B5A1_UNORM_PACK16,rt as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Ce as VK_FORMAT_R64G64B64A64_SINT,Pe as VK_FORMAT_R64G64B64A64_UINT,Fe as VK_FORMAT_R64G64B64_SFLOAT,Ee as VK_FORMAT_R64G64B64_SINT,Ve as VK_FORMAT_R64G64B64_UINT,Te as VK_FORMAT_R64G64_SFLOAT,Oe as VK_FORMAT_R64G64_SINT,Ie as VK_FORMAT_R64G64_UINT,Se as VK_FORMAT_R64_SFLOAT,ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Et as VK_FORMAT_R8G8B8A8_SINT,Tt as VK_FORMAT_R8G8B8A8_SNORM,Ft as VK_FORMAT_R8G8B8A8_SRGB,Vt as VK_FORMAT_R8G8B8A8_UINT,Ot as VK_FORMAT_R8G8B8A8_UNORM,Bt as VK_FORMAT_R8G8B8_SINT,wt as VK_FORMAT_R8G8B8_SNORM,Lt as VK_FORMAT_R8G8B8_SRGB,Dt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,bt as VK_FORMAT_R8G8_SINT,xt as VK_FORMAT_R8G8_SNORM,dt as VK_FORMAT_R8G8_SRGB,ut as VK_FORMAT_R8G8_UINT,yt as VK_FORMAT_R8G8_UNORM,pt as VK_FORMAT_R8_SINT,ht as VK_FORMAT_R8_SNORM,gt as VK_FORMAT_R8_SRGB,_t as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Xe as VK_FORMAT_S8_UINT,nt as VK_FORMAT_UNDEFINED,He as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Mi as write};\n","let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigCACACaiAAQQZ2IgFBAnRBsB5qKAIAaiAAQSBxIgBFaiABRSAAQQV2cWoFQbh/CwsdACAAKAKQ4gEQWiAAQQA2AqDiASAAQgA3A5DiAQu1AwEFfyMAQZACayIKJABBuH8hBgJAIAVFDQAgBCwAACIIQf8BcSEHAkAgCEF/TARAIAdBgn9qQQF2IgggBU8NAkFsIQYgB0GBf2oiBUGAAk8NAiAEQQFqIQdBACEGA0AgBiAFTwRAIAUhBiAIIQcMAwUgACAGaiAHIAZBAXZqIgQtAABBBHY6AAAgACAGQQFyaiAELQAAQQ9xOgAAIAZBAmohBgwBCwAACwALIAcgBU8NASAAIARBAWogByAKEFMiBhADDQELIAYhBEEAIQYgAUEAQTQQECEJQQAhBQNAIAQgBkcEQCAAIAZqIggtAAAiAUELSwRAQWwhBgwDBSAJIAFBAnRqIgEgASgCAEEBajYCACAGQQFqIQZBASAILQAAdEEBdSAFaiEFDAILAAsLQWwhBiAFRQ0AIAUQFEEBaiIBQQxLDQAgAyABNgIAQQFBASABdCAFayIDEBQiAXQgA0cNACAAIARqIAFBAWoiADoAACAJIABBAnRqIgAgACgCAEEBajYCACAJKAIEIgBBAkkgAEEBcXINACACIARBAWo2AgAgB0EBaiEGCyAKQZACaiQAIAYLxhEBDH8jAEHwAGsiBSQAQWwhCwJAIANBCkkNACACLwAAIQogAi8AAiEJIAIvAAQhByAFQQhqIAQQDgJAIAMgByAJIApqakEGaiIMSQ0AIAUtAAohCCAFQdgAaiACQQZqIgIgChAGIgsQAw0BIAVBQGsgAiAKaiICIAkQBiILEAMNASAFQShqIAIgCWoiAiAHEAYiCxADDQEgBUEQaiACIAdqIAMgDGsQBiILEAMNASAAIAFqIg9BfWohECAEQQRqIQZBASELIAAgAUEDakECdiIDaiIMIANqIgIgA2oiDiEDIAIhBCAMIQcDQCALIAMgEElxBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgCS0AAyELIAcgBiAFQUBrIAgQAkECdGoiCS8BADsAACAFQUBrIAktAAIQASAJLQADIQogBCAGIAVBKGogCBACQQJ0aiIJLwEAOwAAIAVBKGogCS0AAhABIAktAAMhCSADIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgDS0AAyENIAAgC2oiCyAGIAVB2ABqIAgQAkECdGoiAC8BADsAACAFQdgAaiAALQACEAEgAC0AAyEAIAcgCmoiCiAGIAVBQGsgCBACQQJ0aiIHLwEAOwAAIAVBQGsgBy0AAhABIActAAMhByAEIAlqIgkgBiAFQShqIAgQAkECdGoiBC8BADsAACAFQShqIAQtAAIQASAELQADIQQgAyANaiIDIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgACALaiEAIAcgCmohByAEIAlqIQQgAyANLQADaiEDIAVB2ABqEA0gBUFAaxANciAFQShqEA1yIAVBEGoQDXJFIQsMAQsLIAQgDksgByACS3INAEFsIQsgACAMSw0BIAxBfWohCQNAQQAgACAJSSAFQdgAahAEGwRAIAAgBiAFQdgAaiAIEAJBAnRqIgovAQA7AAAgBUHYAGogCi0AAhABIAAgCi0AA2oiACAGIAVB2ABqIAgQAkECdGoiCi8BADsAACAFQdgAaiAKLQACEAEgACAKLQADaiEADAEFIAxBfmohCgNAIAVB2ABqEAQgACAKS3JFBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgACAJLQADaiEADAELCwNAIAAgCk0EQCAAIAYgBUHYAGogCBACQQJ0aiIJLwEAOwAAIAVB2ABqIAktAAIQASAAIAktAANqIQAMAQsLAkAgACAMTw0AIAAgBiAFQdgAaiAIEAIiAEECdGoiDC0AADoAACAMLQADQQFGBEAgBUHYAGogDC0AAhABDAELIAUoAlxBH0sNACAFQdgAaiAGIABBAnRqLQACEAEgBSgCXEEhSQ0AIAVBIDYCXAsgAkF9aiEMA0BBACAHIAxJIAVBQGsQBBsEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiIAIAYgBUFAayAIEAJBAnRqIgcvAQA7AAAgBUFAayAHLQACEAEgACAHLQADaiEHDAEFIAJBfmohDANAIAVBQGsQBCAHIAxLckUEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwNAIAcgDE0EQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwJAIAcgAk8NACAHIAYgBUFAayAIEAIiAEECdGoiAi0AADoAACACLQADQQFGBEAgBUFAayACLQACEAEMAQsgBSgCREEfSw0AIAVBQGsgBiAAQQJ0ai0AAhABIAUoAkRBIUkNACAFQSA2AkQLIA5BfWohAgNAQQAgBCACSSAFQShqEAQbBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2oiACAGIAVBKGogCBACQQJ0aiIELwEAOwAAIAVBKGogBC0AAhABIAAgBC0AA2ohBAwBBSAOQX5qIQIDQCAFQShqEAQgBCACS3JFBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsDQCAEIAJNBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsCQCAEIA5PDQAgBCAGIAVBKGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBKGogAi0AAhABDAELIAUoAixBH0sNACAFQShqIAYgAEECdGotAAIQASAFKAIsQSFJDQAgBUEgNgIsCwNAQQAgAyAQSSAFQRBqEAQbBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2oiACAGIAVBEGogCBACQQJ0aiICLwEAOwAAIAVBEGogAi0AAhABIAAgAi0AA2ohAwwBBSAPQX5qIQIDQCAFQRBqEAQgAyACS3JFBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsDQCADIAJNBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsCQCADIA9PDQAgAyAGIAVBEGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBEGogAi0AAhABDAELIAUoAhRBH0sNACAFQRBqIAYgAEECdGotAAIQASAFKAIUQSFJDQAgBUEgNgIUCyABQWwgBUHYAGoQCiAFQUBrEApxIAVBKGoQCnEgBUEQahAKcRshCwwJCwAACwALAAALAAsAAAsACwAACwALQWwhCwsgBUHwAGokACALC7UEAQ5/IwBBEGsiBiQAIAZBBGogABAOQVQhBQJAIARB3AtJDQAgBi0ABCEHIANB8ARqQQBB7AAQECEIIAdBDEsNACADQdwJaiIJIAggBkEIaiAGQQxqIAEgAhAxIhAQA0UEQCAGKAIMIgQgB0sNASADQdwFaiEPIANBpAVqIREgAEEEaiESIANBqAVqIQEgBCEFA0AgBSICQX9qIQUgCCACQQJ0aigCAEUNAAsgAkEBaiEOQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgASALaiAKNgIAIAVBAWohBSAKIAxqIQoMAQsLIAEgCjYCAEEAIQUgBigCCCELA0AgBSALRkUEQCABIAUgCWotAAAiDEECdGoiDSANKAIAIg1BAWo2AgAgDyANQQF0aiINIAw6AAEgDSAFOgAAIAVBAWohBQwBCwtBACEBIANBADYCqAUgBEF/cyAHaiEJQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgAyALaiABNgIAIAwgBSAJanQgAWohASAFQQFqIQUMAQsLIAcgBEEBaiIBIAJrIgRrQQFqIQgDQEEBIQUgBCAIT0UEQANAIAUgDk9FBEAgBUECdCIJIAMgBEE0bGpqIAMgCWooAgAgBHY2AgAgBUEBaiEFDAELCyAEQQFqIQQMAQsLIBIgByAPIAogESADIAIgARBkIAZBAToABSAGIAc6AAYgACAGKAIENgIACyAQIQULIAZBEGokACAFC8ENAQt/IwBB8ABrIgUkAEFsIQkCQCADQQpJDQAgAi8AACEKIAIvAAIhDCACLwAEIQYgBUEIaiAEEA4CQCADIAYgCiAMampBBmoiDUkNACAFLQAKIQcgBUHYAGogAkEGaiICIAoQBiIJEAMNASAFQUBrIAIgCmoiAiAMEAYiCRADDQEgBUEoaiACIAxqIgIgBhAGIgkQAw0BIAVBEGogAiAGaiADIA1rEAYiCRADDQEgACABaiIOQX1qIQ8gBEEEaiEGQQEhCSAAIAFBA2pBAnYiAmoiCiACaiIMIAJqIg0hAyAMIQQgCiECA0AgCSADIA9JcQRAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAACAGIAVBQGsgBxACQQF0aiIILQAAIQsgBUFAayAILQABEAEgAiALOgAAIAYgBUEoaiAHEAJBAXRqIggtAAAhCyAFQShqIAgtAAEQASAEIAs6AAAgBiAFQRBqIAcQAkEBdGoiCC0AACELIAVBEGogCC0AARABIAMgCzoAACAGIAVB2ABqIAcQAkEBdGoiCC0AACELIAVB2ABqIAgtAAEQASAAIAs6AAEgBiAFQUBrIAcQAkEBdGoiCC0AACELIAVBQGsgCC0AARABIAIgCzoAASAGIAVBKGogBxACQQF0aiIILQAAIQsgBUEoaiAILQABEAEgBCALOgABIAYgBUEQaiAHEAJBAXRqIggtAAAhCyAFQRBqIAgtAAEQASADIAs6AAEgA0ECaiEDIARBAmohBCACQQJqIQIgAEECaiEAIAkgBUHYAGoQDUVxIAVBQGsQDUVxIAVBKGoQDUVxIAVBEGoQDUVxIQkMAQsLIAQgDUsgAiAMS3INAEFsIQkgACAKSw0BIApBfWohCQNAIAVB2ABqEAQgACAJT3JFBEAgBiAFQdgAaiAHEAJBAXRqIggtAAAhCyAFQdgAaiAILQABEAEgACALOgAAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAASAAQQJqIQAMAQsLA0AgBUHYAGoQBCAAIApPckUEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCwNAIAAgCkkEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCyAMQX1qIQADQCAFQUBrEAQgAiAAT3JFBEAgBiAFQUBrIAcQAkEBdGoiCi0AACEJIAVBQGsgCi0AARABIAIgCToAACAGIAVBQGsgBxACQQF0aiIKLQAAIQkgBUFAayAKLQABEAEgAiAJOgABIAJBAmohAgwBCwsDQCAFQUBrEAQgAiAMT3JFBEAgBiAFQUBrIAcQAkEBdGoiAC0AACEKIAVBQGsgAC0AARABIAIgCjoAACACQQFqIQIMAQsLA0AgAiAMSQRAIAYgBUFAayAHEAJBAXRqIgAtAAAhCiAFQUBrIAAtAAEQASACIAo6AAAgAkEBaiECDAELCyANQX1qIQADQCAFQShqEAQgBCAAT3JFBEAgBiAFQShqIAcQAkEBdGoiAi0AACEKIAVBKGogAi0AARABIAQgCjoAACAGIAVBKGogBxACQQF0aiICLQAAIQogBUEoaiACLQABEAEgBCAKOgABIARBAmohBAwBCwsDQCAFQShqEAQgBCANT3JFBEAgBiAFQShqIAcQAkEBdGoiAC0AACECIAVBKGogAC0AARABIAQgAjoAACAEQQFqIQQMAQsLA0AgBCANSQRAIAYgBUEoaiAHEAJBAXRqIgAtAAAhAiAFQShqIAAtAAEQASAEIAI6AAAgBEEBaiEEDAELCwNAIAVBEGoQBCADIA9PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIAYgBUEQaiAHEAJBAXRqIgAtAAAhAiAFQRBqIAAtAAEQASADIAI6AAEgA0ECaiEDDAELCwNAIAVBEGoQBCADIA5PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIANBAWohAwwBCwsDQCADIA5JBEAgBiAFQRBqIAcQAkEBdGoiAC0AACECIAVBEGogAC0AARABIAMgAjoAACADQQFqIQMMAQsLIAFBbCAFQdgAahAKIAVBQGsQCnEgBUEoahAKcSAFQRBqEApxGyEJDAELQWwhCQsgBUHwAGokACAJC8oCAQR/IwBBIGsiBSQAIAUgBBAOIAUtAAIhByAFQQhqIAIgAxAGIgIQA0UEQCAEQQRqIQIgACABaiIDQX1qIQQDQCAFQQhqEAQgACAET3JFBEAgAiAFQQhqIAcQAkEBdGoiBi0AACEIIAVBCGogBi0AARABIAAgCDoAACACIAVBCGogBxACQQF0aiIGLQAAIQggBUEIaiAGLQABEAEgACAIOgABIABBAmohAAwBCwsDQCAFQQhqEAQgACADT3JFBEAgAiAFQQhqIAcQAkEBdGoiBC0AACEGIAVBCGogBC0AARABIAAgBjoAACAAQQFqIQAMAQsLA0AgACADT0UEQCACIAVBCGogBxACQQF0aiIELQAAIQYgBUEIaiAELQABEAEgACAGOgAAIABBAWohAAwBCwsgAUFsIAVBCGoQChshAgsgBUEgaiQAIAILtgMBCX8jAEEQayIGJAAgBkEANgIMIAZBADYCCEFUIQQCQAJAIANBQGsiDCADIAZBCGogBkEMaiABIAIQMSICEAMNACAGQQRqIAAQDiAGKAIMIgcgBi0ABEEBaksNASAAQQRqIQogBkEAOgAFIAYgBzoABiAAIAYoAgQ2AgAgB0EBaiEJQQEhBANAIAQgCUkEQCADIARBAnRqIgEoAgAhACABIAU2AgAgACAEQX9qdCAFaiEFIARBAWohBAwBCwsgB0EBaiEHQQAhBSAGKAIIIQkDQCAFIAlGDQEgAyAFIAxqLQAAIgRBAnRqIgBBASAEdEEBdSILIAAoAgAiAWoiADYCACAHIARrIQhBACEEAkAgC0EDTQRAA0AgBCALRg0CIAogASAEakEBdGoiACAIOgABIAAgBToAACAEQQFqIQQMAAALAAsDQCABIABPDQEgCiABQQF0aiIEIAg6AAEgBCAFOgAAIAQgCDoAAyAEIAU6AAIgBCAIOgAFIAQgBToABCAEIAg6AAcgBCAFOgAGIAFBBGohAQwAAAsACyAFQQFqIQUMAAALAAsgAiEECyAGQRBqJAAgBAutAQECfwJAQYQgKAIAIABHIAAoAgBBAXYiAyABa0F4aiICQXhxQQhHcgR/IAIFIAMQJ0UNASACQQhqC0EQSQ0AIAAgACgCACICQQFxIAAgAWpBD2pBeHEiASAAa0EBdHI2AgAgASAANgIEIAEgASgCAEEBcSAAIAJBAXZqIAFrIgJBAXRyNgIAQYQgIAEgAkH/////B3FqQQRqQYQgKAIAIABGGyABNgIAIAEQJQsLygIBBX8CQAJAAkAgAEEIIABBCEsbZ0EfcyAAaUEBR2oiAUEESSAAIAF2cg0AIAFBAnRB/B5qKAIAIgJFDQADQCACQXhqIgMoAgBBAXZBeGoiBSAATwRAIAIgBUEIIAVBCEsbZ0Efc0ECdEGAH2oiASgCAEYEQCABIAIoAgQ2AgALDAMLIARBHksNASAEQQFqIQQgAigCBCICDQALC0EAIQMgAUEgTw0BA0AgAUECdEGAH2ooAgAiAkUEQCABQR5LIQIgAUEBaiEBIAJFDQEMAwsLIAIgAkF4aiIDKAIAQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgBGBEAgASACKAIENgIACwsgAigCACIBBEAgASACKAIENgIECyACKAIEIgEEQCABIAIoAgA2AgALIAMgAygCAEEBcjYCACADIAAQNwsgAwvhCwINfwV+IwBB8ABrIgckACAHIAAoAvDhASIINgJcIAEgAmohDSAIIAAoAoDiAWohDwJAAkAgBUUEQCABIQQMAQsgACgCxOABIRAgACgCwOABIREgACgCvOABIQ4gAEEBNgKM4QFBACEIA0AgCEEDRwRAIAcgCEECdCICaiAAIAJqQazQAWooAgA2AkQgCEEBaiEIDAELC0FsIQwgB0EYaiADIAQQBhADDQEgB0EsaiAHQRhqIAAoAgAQEyAHQTRqIAdBGGogACgCCBATIAdBPGogB0EYaiAAKAIEEBMgDUFgaiESIAEhBEEAIQwDQCAHKAIwIAcoAixBA3RqKQIAIhRCEIinQf8BcSEIIAcoAkAgBygCPEEDdGopAgAiFUIQiKdB/wFxIQsgBygCOCAHKAI0QQN0aikCACIWQiCIpyEJIBVCIIghFyAUQiCIpyECAkAgFkIQiKdB/wFxIgNBAk8EQAJAIAZFIANBGUlyRQRAIAkgB0EYaiADQSAgBygCHGsiCiAKIANLGyIKEAUgAyAKayIDdGohCSAHQRhqEAQaIANFDQEgB0EYaiADEAUgCWohCQwBCyAHQRhqIAMQBSAJaiEJIAdBGGoQBBoLIAcpAkQhGCAHIAk2AkQgByAYNwNIDAELAkAgA0UEQCACBEAgBygCRCEJDAMLIAcoAkghCQwBCwJAAkAgB0EYakEBEAUgCSACRWpqIgNBA0YEQCAHKAJEQX9qIgMgA0VqIQkMAQsgA0ECdCAHaigCRCIJIAlFaiEJIANBAUYNAQsgByAHKAJINgJMCwsgByAHKAJENgJIIAcgCTYCRAsgF6chAyALBEAgB0EYaiALEAUgA2ohAwsgCCALakEUTwRAIAdBGGoQBBoLIAgEQCAHQRhqIAgQBSACaiECCyAHQRhqEAQaIAcgB0EYaiAUQhiIp0H/AXEQCCAUp0H//wNxajYCLCAHIAdBGGogFUIYiKdB/wFxEAggFadB//8DcWo2AjwgB0EYahAEGiAHIAdBGGogFkIYiKdB/wFxEAggFqdB//8DcWo2AjQgByACNgJgIAcoAlwhCiAHIAk2AmggByADNgJkAkACQAJAIAQgAiADaiILaiASSw0AIAIgCmoiEyAPSw0AIA0gBGsgC0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n","/**\n * Loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader\n * supports Basis Universal GPU textures, which can be quickly transcoded to\n * a wide variety of GPU texture compression formats, as well as some\n * uncompressed DataTexture and Data3DTexture formats.\n *\n * References:\n * - KTX: http://github.khronos.org/KTX-Specification/\n * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor\n */\n\nimport {\n\tCompressedTexture,\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tData3DTexture,\n\tDataTexture,\n\tDisplayP3ColorSpace,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearDisplayP3ColorSpace,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRedFormat,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGBA_S3TC_DXT1_Format,\n\tRGBAFormat,\n\tRGFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_UNDEFINED,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( num ) {\n\n\t\tthis.workerPool.setWorkerLimit( num );\n\n\t\treturn this;\n\n\t}\n\n\tasync detectSupportAsync( renderer ) {\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),\n\t\t\tetc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),\n\t\t\tetc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),\n\t\t\tdxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),\n\t\t\tbptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),\n\t\t\tpvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )\n\t\t};\n\n\t\treturn this;\n\n\t}\n\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bptc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t\t// again from this thread.\n\t\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t\t}\n\n\t\t\tthis._createTexture( buffer )\n\t\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t\t.catch( onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { faces, width, height, format, type, error, dfdFlags } = transcodeResult;\n\n\t\tif ( type === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, UnsignedByteType );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, UnsignedByteType )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, UnsignedByteType );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {object?} config\n\t * @return {Promise<CompressedTexture|CompressedArrayTexture|DataTexture|Data3DTexture>}\n\t */\n\tasync _createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\tif ( container.vkFormat !== VK_FORMAT_UNDEFINED ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC_4x4: 1,\n};\n\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format,\n};\n\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, faces, width, height, hasAlpha, format, dfdFlags }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tconst basisFormat = ktx2File.isUASTC() ? BasisFormat.UASTC_4x4 : BasisFormat.ETC1S;\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, format: engineFormat, dfdFlags };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC),\n\t// device capabilities, and texture dimensions. The list below ranks the formats separately\n\t// for ETC1S and UASTC.\n\t//\n\t// In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at\n\t// significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently\n\t// chooses RGBA32 only as a last resort and does not expose that option to the caller.\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t];\n\n\tconst ETC1S_OPTIONS = FORMAT_OPTIONS.sort( function ( a, b ) {\n\n\t\treturn a.priorityETC1S - b.priorityETC1S;\n\n\t} );\n\tconst UASTC_OPTIONS = FORMAT_OPTIONS.sort( function ( a, b ) {\n\n\t\treturn a.priorityUASTC - b.priorityUASTC;\n\n\t} );\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tlet transcoderFormat;\n\t\tlet engineFormat;\n\n\t\tconst options = basisFormat === BasisFormat.ETC1S ? ETC1S_OPTIONS : UASTC_OPTIONS;\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\ttranscoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tengineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat };\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.' );\n\n\t\ttranscoderFormat = TranscoderFormat.RGBA32;\n\t\tengineFormat = EngineFormat.RGBAFormat;\n\n\t\treturn { transcoderFormat, engineFormat };\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/** Concatenates N byte arrays. */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n};\n\n//\n// Parsing for non-Basis textures. These textures are may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n","import {LIBRARY_INSTALL_HINT} from './../common';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {ASSETS_ROOT} from './../AssetsUtils';\nimport {BaseCoreImageLoader, BaseImageLoader, TextureLoadOptions} from './_BaseImageLoader';\nimport {KTX2Loader} from 'three/examples/jsm/loaders/KTX2Loader';\nimport {Poly} from '../../../engine/Poly';\nimport {BaseLoaderLoadOptions, CoreBaseLoader} from '../_Base';\nimport {sanitizeUrl} from '../../UrlHelper';\nimport {WebGLRenderer} from 'three';\n\ntype Resolve = (loader: KTX2Loader) => void;\nexport class KTX2TextureLoader extends BaseCoreImageLoader {\n\tstatic PARAM_ENV_DEFAULT = `${ASSETS_ROOT}/textures/sample_uastc_zstd.ktx2`;\n\tprivate static _loadStarted = false;\n\tprivate static _resolves: Resolve[] = [];\n\n\tconstructor(_url: string, _node: BaseNodeType) {\n\t\tsuper(_url, _node);\n\t}\n\n\tprotected async _getLoader(options: TextureLoadOptions) {\n\t\treturn (await KTX2TextureLoader.getLoader({node: this._node})) as BaseImageLoader;\n\t}\n\n\tprivate static _loader: KTX2Loader | undefined;\n\tstatic async getLoader(options: BaseLoaderLoadOptions) {\n\t\treturn (this._loader = this._loader || (await this._createLoaderOrQueue(options)));\n\t}\n\tprivate static async _createLoaderOrQueue(options: BaseLoaderLoadOptions): Promise<KTX2Loader> {\n\t\tif (this._loadStarted) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis._resolves.push(resolve);\n\t\t\t});\n\t\t} else {\n\t\t\tthis._loadStarted = true;\n\t\t\treturn this.__createLoader(options);\n\t\t}\n\t}\n\tprivate static async __createLoader(options: BaseLoaderLoadOptions) {\n\t\tconst loader = new KTX2Loader(this.loadingManager);\n\t\tconst root = Poly.libs.root();\n\t\tconst KTX2Path = Poly.libs.KTX2Path();\n\t\tif (root || KTX2Path) {\n\t\t\tconst decoderPath = sanitizeUrl(`${root || ''}${KTX2Path || ''}/`);\n\n\t\t\tif (options.node) {\n\t\t\t\tconst files = ['basis_transcoder.js', 'basis_transcoder.wasm'];\n\t\t\t\tawait CoreBaseLoader._loadMultipleUrlsGlobal({\n\t\t\t\t\tfiles: files.map((file) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tfullUrl: `${decoderPath}${file}`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t\tnode: options.node,\n\t\t\t\t\terror: `failed to load basis libraries. Make sure to install them to load .basis files (${LIBRARY_INSTALL_HINT})`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tloader.setTranscoderPath(decoderPath);\n\t\t} else {\n\t\t\t(loader as any).setTranscoderPath(undefined);\n\t\t}\n\t\tconst renderer = await options.node.scene().renderersRegister.waitForRenderer();\n\t\tif (renderer) {\n\t\t\tif (renderer instanceof WebGLRenderer) {\n\t\t\t\tloader.detectSupport(renderer);\n\t\t\t} else {\n\t\t\t\tPoly.warn('renderer found is not a WebGLRenderer');\n\t\t\t}\n\t\t} else {\n\t\t\tPoly.warn('texture loader found no renderer for KTX2Loader');\n\t\t}\n\n\t\tfor (const resolve of this._resolves) {\n\t\t\tresolve(loader);\n\t\t}\n\n\t\treturn loader;\n\t}\n}\n","import {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {CoreBaseLoader} from './../_Base';\n\nexport class BaseTextureLoader extends CoreBaseLoader<string> {\n\tconstructor(_url: string, protected override _node: BaseNodeType) {\n\t\tsuper(_url, _node);\n\t}\n}\n","import {Texture, TextureDataType} from 'three';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {Poly} from '../../../engine/Poly';\nimport {CoreLoaderTexture} from '../Texture';\nimport {BaseTextureLoader} from './_BaseTextureLoader';\n\nexport interface TextureLoadOptions {\n\ttdataType: boolean;\n\tdataType: TextureDataType;\n}\n\ntype OnSuccess = (o: Texture) => void;\ntype OnProgress = (n: ProgressEvent<EventTarget>) => void;\ntype OnError = (event: ErrorEvent) => void;\n\nexport abstract class BaseImageLoader {\n\tabstract load: (url: string, onSuccess: OnSuccess, onProgress?: OnProgress, onError?: OnError) => void;\n}\n\nexport abstract class BaseCoreImageLoader extends BaseTextureLoader {\n\tconstructor(_url: string, protected override _node: BaseNodeType) {\n\t\tsuper(_url, _node);\n\t}\n\n\tasync loadImage(options: TextureLoadOptions): Promise<Texture> {\n\t\tconst url = this._urlToLoad();\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst loader = await this._getLoader(options);\n\t\t\tCoreLoaderTexture.incrementInProgressLoadsCount();\n\t\t\tawait CoreLoaderTexture.waitForMaxConcurrentLoadsQueueFreed();\n\t\t\tloader.load(\n\t\t\t\turl,\n\t\t\t\t(texture: Texture) => {\n\t\t\t\t\ttexture.matrixAutoUpdate = false;\n\t\t\t\t\tCoreLoaderTexture.decrementInProgressLoadsCount(url, texture);\n\n\t\t\t\t\tresolve(texture);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t(error: any) => {\n\t\t\t\t\tCoreLoaderTexture.decrementInProgressLoadsCount(url);\n\t\t\t\t\tPoly.warn('error', error);\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected abstract _getLoader(options: TextureLoadOptions): Promise<BaseImageLoader>;\n}\n","export class BaseCoreLogger {\n\tlog(message?: any, ...optionalParams: any[]) {}\n\twarn(message?: any, ...optionalParams: any[]) {}\n\terror(message?: any, ...optionalParams: any[]) {}\n}\n","import {BaseCoreLogger} from './Base';\n\nexport class ConsoleLogger extends BaseCoreLogger {\n\toverride log(message?: any, ...optionalParams: any[]) {\n\t\tconsole.log(...[message, ...optionalParams]);\n\t}\n\toverride warn(...args: any) {\n\t\tconsole.warn(...args);\n\t}\n\toverride error(...args: any) {\n\t\tconsole.error(...args);\n\t}\n}\n\nexport function logBlue(message: string) {\n\tconsole.log('%c' + message, 'color:blue; font-weight:bold;');\n}\nexport function logRedBg(message: string) {\n\tlogStyled(message, {\n\t\tbackgroundColor: 'red',\n\t\tcolor: 'white',\n\t\tfontWeight: 'bold',\n\t\tpadding: {x: 10, y: 5},\n\t});\n}\nexport function logGreenBg(message: string) {\n\tlogStyled(message, {\n\t\tbackgroundColor: 'green',\n\t\tcolor: 'white',\n\t\tfontWeight: 'bold',\n\t\tpadding: {x: 10, y: 5},\n\t});\n}\nexport function logBlueBg(message: string) {\n\tlogStyled(message, {\n\t\tbackgroundColor: 'blue',\n\t\tcolor: 'white',\n\t\tfontWeight: 'bold',\n\t\tpadding: {x: 10, y: 5},\n\t});\n}\nexport interface LogStyle {\n\tbackgroundColor?: string;\n\tcolor?: string;\n\tfontWeight?: string;\n\tpadding?: {\n\t\tx?: number;\n\t\ty?: number;\n\t};\n}\nexport function logStyled(message: string, style: LogStyle) {\n\tconst styleString = Object.entries(style)\n\t\t.map(([key, value]) => {\n\t\t\tconst propName = key.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`);\n\t\t\tif (key == 'padding') {\n\t\t\t\tconst padding = value as {x?: number; y?: number};\n\t\t\t\treturn `padding: ${padding.y || 0}px ${padding.x || 0}px`;\n\t\t\t} else {\n\t\t\t\treturn `${propName}: ${value}`;\n\t\t\t}\n\t\t})\n\t\t.join('; ');\n\tconsole.log('%c' + message, styleString);\n}\nexport function logDefault(message: string) {\n\tconsole.log(message);\n}\n","export const UNIFORM_PARAM_PREFIX = `v_POLY_param_`;\nexport const UNIFORM_TEXTURE_PREFIX = `v_POLY_texture_`;\n","// https://gist.github.com/gre/1650294\n\n// const ease_in = function(t:number, power:number){return Math.pow(t, power)}\n// const ease_on = function(t:number, power:number){return 1 - Math.abs(Math.pow(t-1, power))}\n// const ease_ion = function(t:number, power:number){return t<.5 ? ease_i(power)(t*2)/2 : ease_o(power)(t*2 - 1)/2+0.5}\n\nconst easeI = function (power: number) {\n\treturn function (t: number) {\n\t\treturn Math.pow(t, power);\n\t};\n};\nconst easeO = function (power: number) {\n\treturn function (t: number) {\n\t\treturn 1 - Math.abs(Math.pow(t - 1, power));\n\t};\n};\nconst easeIO = function (power: number) {\n\treturn function (t: number) {\n\t\treturn t < 0.5 ? easeI(power)(t * 2) / 2 : easeO(power)(t * 2 - 1) / 2 + 0.5;\n\t};\n};\n\ntype EasingFunction = (num: number) => number;\nexport interface EasingDictionary {\n\teaseI2: EasingFunction;\n\teaseO2: EasingFunction;\n\teaseIO2: EasingFunction;\n\teaseI3: EasingFunction;\n\teaseO3: EasingFunction;\n\teaseIO3: EasingFunction;\n\teaseI4: EasingFunction;\n\teaseO4: EasingFunction;\n\teaseIO4: EasingFunction;\n\teaseSinI: EasingFunction;\n\teaseSinO: EasingFunction;\n\teaseSinIO: EasingFunction;\n\teaseElasticI: EasingFunction;\n\teaseElasticO: EasingFunction;\n\teaseElasticIO: EasingFunction;\n}\nexport const EASING_NAMES: Array<keyof EasingDictionary> = [\n\t'easeI2',\n\t'easeO2',\n\t'easeIO2',\n\t'easeI3',\n\t'easeO3',\n\t'easeIO3',\n\t'easeI4',\n\t'easeO4',\n\t'easeIO4',\n\t'easeSinI',\n\t'easeSinO',\n\t'easeSinIO',\n\t'easeElasticI',\n\t'easeElasticO',\n\t'easeElasticIO',\n];\n\nexport const easeI2 = easeI(2);\nexport const easeO2 = easeO(2);\nexport const easeIO2 = easeIO(2);\n\nexport const easeI3 = easeI(3);\nexport const easeO3 = easeO(3);\nexport const easeIO3 = easeIO(3);\n\nexport const easeI4 = easeI(4);\nexport const easeO4 = easeO(4);\nexport const easeIO4 = easeIO(4);\n\nexport function easeSinI(t: number) {\n\treturn 1 + Math.sin((Math.PI / 2) * t - Math.PI / 2);\n}\nexport function easeSinO(t: number) {\n\treturn Math.sin((Math.PI / 2) * t);\n}\nexport function easeSinIO(t: number) {\n\treturn (1 + Math.sin(Math.PI * t - Math.PI / 2)) / 2;\n}\n\nexport function easeElasticI(t: number) {\n\treturn t == 0 ? 0 : (0.04 - 0.04 / t) * Math.sin(25 * t) + 1;\n}\nexport function easeElasticO(t: number) {\n\treturn t == 1 ? 1 : ((0.04 * t) / --t) * Math.sin(25 * t);\n}\nexport function easeElasticIO(t: number) {\n\treturn t == 0.5\n\t\t? 0\n\t\t: (t -= 0.5) < 0\n\t\t? (0.02 + 0.01 / t) * Math.sin(50 * t)\n\t\t: (0.02 - 0.01 / t) * Math.sin(50 * t) + 1;\n}\n\nexport const Easing: EasingDictionary = {\n\t// linear: ease_io(1),\n\n\t// ease_i: function (t: number, power: number) {\n\t// \treturn ease_i(power)(t);\n\t// },\n\t// ease_o: function (t: number, power: number) {\n\t// \treturn ease_o(power)(t);\n\t// },\n\t// ease_io: function (t: number, power: number) {\n\t// \treturn ease_io(power)(t);\n\t// },\n\n\teaseI2,\n\teaseO2,\n\teaseIO2,\n\n\teaseI3,\n\teaseO3,\n\teaseIO3,\n\n\teaseI4,\n\teaseO4,\n\teaseIO4,\n\t// easeInQuart: EaseIn(4),\n\t// easeOutQuart: EaseOut(4),\n\t// easeInOutQuart: EaseInOut(4),\n\t// easeInQuint: EaseIn(5),\n\t// easeOutQuint: EaseOut(5),\n\t// easeInOutQuint: EaseInOut(5)\n\n\teaseSinI,\n\teaseSinO,\n\teaseSinIO,\n\n\teaseElasticI,\n\teaseElasticO,\n\teaseElasticIO,\n};\n\n// export class Easing {\n//   // no easing, no acceleration\n//   static linear(t:number):number{ return t }\n//   // accelerating from zero velocity\n//   static easeinquad (t:number):number{ return t*t }\n//   // decelerating to zero velocity\n//   static easeoutquad (t:number):number{ return t*(2-t) }\n//   // acceleration until halfway, then deceleration\n//   static easeinoutquad (t:number):number{ return t<.5 ? 2*t*t : -1+(4-2*t)*t }\n//   // accelerating from zero velocity\n//   static easeincubic (t:number):number{ return t*t*t }\n//   // decelerating to zero velocity\n//   static easeoutcubic (t:number):number{ return (--t)*t*t+1 }\n//   // acceleration until halfway, then deceleration\n//   static easeinoutcubic (t:number):number{ return t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1 }\n//   // accelerating from zero velocity\n//   static easeinquart (t:number):number{ return t*t*t*t }\n//   // decelerating to zero velocity\n//   static easeoutquart (t:number):number{ return 1-(--t)*t*t*t }\n//   // acceleration until halfway, then deceleration\n//   static easeinoutquart (t:number):number{ return t<.5 ? 8*t*t*t*t : 1-8*(--t)*t*t*t }\n//   // accelerating from zero velocity\n//   static easeinquint (t:number):number{ return t*t*t*t*t }\n//   // decelerating to zero velocity\n//   static easeoutquint (t:number):number{ return 1+(--t)*t*t*t*t }\n//   // acceleration until halfway, then deceleration\n//   static easeinoutquint (t:number):number{ return t<.5 ? 16*t*t*t*t*t : 1+16*(--t)*t*t*t*t }\n// }\n","import {LngLatLike, Vector2Like} from '../../types/GlobalTypes';\nimport {Vector3, Triangle} from 'three';\nimport {\n\tdegToRad as _degToRad,\n\tradToDeg as _radToDeg,\n\tsmoothstep as _smoothstep,\n\tsmootherstep as _smootherstep,\n} from 'three/src/math/MathUtils';\nimport {Easing} from './Easing';\nimport {isNumber} from '../Type';\n\nconst RAND_A = 12.9898;\nconst RAND_B = 78.233;\nconst RAND_C = 43758.5453;\n\nexport const degToRad = _degToRad;\nexport const radToDeg = _radToDeg;\n\nexport function clamp(val: number, min: number, max: number): number {\n\tif (val < min) {\n\t\treturn min;\n\t} else if (val > max) {\n\t\treturn max;\n\t} else {\n\t\treturn val;\n\t}\n}\nexport const smoothstep = _smoothstep;\nexport const smootherstep = _smootherstep;\nexport function fit(val: number, srcMin: number, srcMax: number, destMin: number, destMax: number): number {\n\tconst src_range = srcMax - srcMin;\n\tconst dest_range = destMax - destMin;\n\n\tconst r = (val - srcMin) / src_range;\n\treturn r * dest_range + destMin;\n}\nexport function fit01(val: number, destMin: number, destMax: number): number {\n\t// const size = max - min;\n\t// return (val - min) / size;\n\treturn fit(val, 0, 1, destMin, destMax);\n}\nexport function fitClamp(val: number, srcMin: number, srcMax: number, destMin: number, destMax: number): number {\n\tconst r = fit(val, srcMin, srcMax, destMin, destMax);\n\treturn clamp(r, destMin, destMax);\n}\nexport function mix(num0: number, num1: number, blend: number) {\n\treturn (1 - blend) * num0 + blend * num1;\n}\nexport const fract = (number: number) => number - Math.floor(number);\nconst DEFAULT_Y = 136574;\nconst _vec = {x: 0, y: DEFAULT_Y};\nexport function randFloat(x: number, y: number = DEFAULT_Y): number {\n\t_vec.x = x;\n\t_vec.y = y;\n\treturn randVec2(_vec);\n}\n\nexport function randVec2(uv: Vector2Like) {\n\tconst dt = uv.x * RAND_A + uv.y * RAND_B; //dot( uv.xy, vec2( a,b ) )\n\tconst sn = dt % Math.PI;\n\treturn fract(Math.sin(sn) * RAND_C);\n}\nexport function rand(number: number | Vector2Like): number {\n\tif (isNumber(number)) {\n\t\treturn randFloat(number);\n\t} else {\n\t\treturn randVec2(number);\n\t}\n}\nexport function round(number: number, stepSize: number): number {\n\tconst stepsCount = number / stepSize;\n\tconst roundedStepsCount = number < 0 ? Math.ceil(stepsCount) : Math.floor(stepsCount);\n\treturn roundedStepsCount * stepSize;\n}\nexport function mod(number: number, _mod: number) {\n\treturn ((number % _mod) + _mod) % _mod;\n}\nexport function highestEven(number: number): number {\n\treturn 2 * Math.ceil(number * 0.5);\n}\nexport function nearestPower2(num: number) {\n\treturn Math.pow(2, Math.ceil(Math.log(num) / Math.log(2)));\n}\nexport function pow2Inverse(num: number) {\n\treturn Math.log(num) / Math.log(2);\n}\n// https://www.movable-type.co.uk/scripts/latlong.html\nexport function geodesicDistance(lnglat1: LngLatLike, lnglat2: LngLatLike): number {\n\tvar R = 6371e3; // metres\n\tvar d1 = degToRad(lnglat1.lat);\n\tvar d2 = degToRad(lnglat2.lat);\n\tvar ad1 = degToRad(lnglat2.lat - lnglat1.lat);\n\tvar ad2 = degToRad(lnglat2.lng - lnglat1.lng);\n\n\tvar a = Math.sin(ad1 / 2) * Math.sin(ad1 / 2) + Math.cos(d1) * Math.cos(d2) * Math.sin(ad2 / 2) * Math.sin(ad2 / 2);\n\tvar c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n\tvar d = R * c;\n\treturn d;\n}\nconst _triangleMid = new Vector3();\nconst _triangleMidToCorner = new Vector3();\nexport function expandTriangle(triangle: Triangle, margin: number) {\n\ttriangle.getMidpoint(_triangleMid);\n\n\t// a\n\t_triangleMidToCorner.copy(triangle.a).sub(_triangleMid);\n\t_triangleMidToCorner.normalize().multiplyScalar(margin);\n\ttriangle.a.add(_triangleMidToCorner);\n\t// b\n\t_triangleMidToCorner.copy(triangle.b).sub(_triangleMid);\n\t_triangleMidToCorner.normalize().multiplyScalar(margin);\n\ttriangle.b.add(_triangleMidToCorner);\n\t// c\n\t_triangleMidToCorner.copy(triangle.c).sub(_triangleMid);\n\t_triangleMidToCorner.normalize().multiplyScalar(margin);\n\ttriangle.c.add(_triangleMidToCorner);\n}\n\nexport function lerpFloat(current: number, target: number, blend: number) {\n\treturn current * (1 - blend) + target * blend;\n}\n\nexport class CoreMath {\n\tstatic Easing = Easing; // used in expressions\n\tstatic degToRad = degToRad; // used in expressions\n\tstatic radToDeg = radToDeg; // used in expressions\n\tstatic clamp = clamp; // used in expressions\n\tstatic smoothstep = smoothstep;\n\tstatic smootherstep = smootherstep;\n\tstatic fit01 = fit01; // used in expressions\n\tstatic fit = fit; // used in expressions\n\tstatic fitClamp = fitClamp; // used in expressions\n\tstatic mix = mix; // used in expressions\n\tstatic fract = fract; // used in expressions\n\tstatic rand = rand; // from threejs glsl rand\n\tstatic round = round;\n\n\tstatic highestEven = highestEven;\n\tstatic nearestPower2 = nearestPower2;\n\tstatic pow2Inverse = pow2Inverse;\n\n\tstatic randFloat = randFloat;\n\tstatic randVec2 = randVec2;\n\n\tstatic lerpFloat = lerpFloat;\n}\n","import {SpotLight} from 'three';\n\nexport function monkeyPatchSpotLight(spotLight: SpotLight) {\n\tconst previousCopy = spotLight.copy.bind(spotLight);\n\tspotLight.copy = function (source: SpotLight, recursive: boolean) {\n\t\tconst clonedSpotLight = previousCopy(source, recursive);\n\t\tclonedSpotLight.map = source.map;\n\t\tmonkeyPatchSpotLight(clonedSpotLight);\n\t\treturn clonedSpotLight;\n\t};\n}\n","import {Material, Mesh} from 'three';\nimport {objectCloneDeep} from '../ObjectUtils';\nimport {BaseBuilderMatNodeType} from '../../engine/nodes/mat/_BaseBuilder';\n// import {ParticlesSystemGpuSopNode} from '../../ParticlesSystemGpu';\nimport {assignUniforms, applyCustomMaterials, ShaderMaterialWithCustomMaterials} from '../geometry/Material';\n// import {CoreGroup} from '../geometry/Group';\nimport {ShaderName} from '../../engine/nodes/utils/shaders/ShaderName';\nimport {TextureAllocationsControllerData} from '../../engine/nodes/gl/code/utils/TextureAllocationsController';\nimport {GlobalsTextureHandler, GlobalsTextureHandlerPurpose} from '../../engine/nodes/gl/code/globals/Texture';\n// import {NodeContext} from '../../engine/poly/NodeContext';\nimport {ShaderAssemblerMaterial} from '../../engine/nodes/gl/code/assemblers/materials/_BaseMaterial';\nimport {IUniformTexture} from '../../engine/nodes/utils/code/gl/Uniforms';\nimport {CoreParticlesController} from './CoreParticlesController';\nimport {CoreParticlesAttribute} from './CoreParticlesAttribute';\nimport {\n\tOnBeforeCompileDataHandler,\n\tassignOnBeforeCompileDataAndFunction,\n} from '../../engine/nodes/gl/code/assemblers/materials/OnBeforeCompile';\n\nexport class CoreParticlesRenderController {\n\tprivate _renderMaterial: Material | undefined;\n\t// protected _particlesGroupObjects: Object3D[] = [];\n\t// private _allShaderNames: ShaderName[] = [];\n\tprivate _uniformByShaderName: Map<ShaderName, IUniformTexture> = new Map();\n\t// private _allUniformNames: string[] = [];\n\tprivate _texture_allocations_json: TextureAllocationsControllerData | undefined;\n\tprivate _materialGlobalsHandler = new GlobalsTextureHandler(\n\t\tGlobalsTextureHandler.UV_VARYING,\n\t\tGlobalsTextureHandlerPurpose.MATERIAL\n\t);\n\tprivate _matNodeAssembler: ShaderAssemblerMaterial | undefined;\n\t// public readonly object: Object3D;\n\tconstructor(private mainController: CoreParticlesController) {\n\t\t// this.object = this.mainController.object;\n\t}\n\n\t// setShadersByName(shadersByName: Map<ShaderName, string>) {\n\t// \tthis._allShaderNames = [];\n\t// \tthis._uniformByShaderName.clear();\n\t// \tthis._allUniformNames = [];\n\t// \tshadersByName.forEach((shader, name) => {\n\t// \t\tthis._allShaderNames.push(name);\n\t// \t\tthis._allUniformNames.push(`texture_${name}`);\n\t// \t});\n\n\t// \tthis.resetRenderMaterial();\n\t// }\n\tdispose() {}\n\treset() {\n\t\tthis._renderMaterial = undefined;\n\t\t// this.resetRenderMaterial();\n\t}\n\t// resetRenderMaterial() {\n\t// \t// this._particlesGroupObjects = [];\n\t// }\n\tassignRenderMaterial() {\n\t\tif (!this._renderMaterial) {\n\t\t\tconsole.warn('no renderMaterial');\n\t\t\treturn;\n\t\t}\n\t\tconst object = this.mainController.object();\n\t\tif (!object) {\n\t\t\tconsole.warn('no object');\n\t\t\treturn;\n\t\t}\n\t\t// for (let object3d of this._particlesGroupObjects) {\n\t\t// \tconst object = object3d as Mesh;\n\t\t// if (object.geometry) {\n\t\t(object as Mesh).material = this._renderMaterial;\n\t\tapplyCustomMaterials(object, this._renderMaterial as ShaderMaterialWithCustomMaterials);\n\t\tobject.matrixAutoUpdate = false;\n\t\tobject.updateMatrix();\n\t\t// }\n\t\t// }\n\t\t// if this material is recomputed on a frame after the frame_start\n\t\t// we need to:\n\t\t// - mark the material as needsUpdate (to ensure it gets recompiled by the renderer)\n\t\t// - update the uniforms (to ensure the material gets the right values, as the uniforms have been reset)\n\t\tthis.updateRenderMaterialUniforms();\n\t\tthis._renderMaterial.needsUpdate = true;\n\t}\n\tupdateRenderMaterialUniforms() {\n\t\tif (!this._renderMaterial) {\n\t\t\tconsole.warn('no renderMaterial');\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = OnBeforeCompileDataHandler.getData(this._renderMaterial);\n\n\t\tlet uniformName: string;\n\t\tlet shaderName: ShaderName;\n\t\tconst shaderNames = this.mainController.shaderNames();\n\t\tconst uniformNames = this.mainController.uniformNames();\n\t\tfor (let i = 0; i < shaderNames.length; i++) {\n\t\t\tshaderName = shaderNames[i];\n\t\t\tuniformName = uniformNames[i];\n\t\t\tlet uniform = this._uniformByShaderName.get(shaderName);\n\t\t\tif (!uniform) {\n\t\t\t\tuniform = {value: null};\n\t\t\t\tthis._uniformByShaderName.set(shaderName, uniform);\n\t\t\t}\n\t\t\tconst texture = this.mainController.gpuController.getCurrentRenderTarget(shaderName)?.texture;\n\t\t\tuniform.value = texture || null;\n\t\t\t// Setting needsUpdate to true was an attempt at fixing the bug\n\t\t\t// where a particle system with no output on scene load\n\t\t\t// fails to render when adding outputs later.\n\t\t\t// At least until the scene is fully reloaded\n\t\t\t// texture.needsUpdate = true;\n\t\t\t// UPDATE:\n\t\t\t// instead of needsUpdate, we need to force a recompilation\n\t\t\t// with assignOnBeforeCompileDataAndFunction below\n\t\t\t// after having added the new uniforms to the data from OnBeforeCompileDataHandler.getData\n\t\t\tassignUniforms(this._renderMaterial, uniformName, uniform, this._matNodeAssembler);\n\t\t\tif (data) {\n\t\t\t\tdata.additionalTextureUniforms[uniformName] = uniform;\n\t\t\t}\n\n\t\t\t// this._renderMaterial.uniforms[uniformName].value = texture;\n\t\t\t// CoreMaterial.assignCustomUniforms(this._renderMaterial, uniformName, texture);\n\t\t}\n\t\tif (data) {\n\t\t\tassignOnBeforeCompileDataAndFunction(this.mainController.scene, this._renderMaterial, data);\n\t\t}\n\t}\n\n\tmaterial() {\n\t\treturn this._renderMaterial;\n\t}\n\t// initialized(): boolean {\n\t// \treturn this._renderMaterial != null;\n\t// }\n\n\t// initCoreGroup(core_group: CoreGroup) {\n\t// \tfor (let child of core_group.objectsWithGeo()) {\n\t// \t\tthis._particlesGroupObjects.push(child);\n\t// \t}\n\t// }\n\tasync init() {\n\t\tconst object = this.mainController.object();\n\t\tif (!object) {\n\t\t\tconsole.warn('no object');\n\t\t\treturn;\n\t\t}\n\t\tconst node = this.mainController.node();\n\t\tconst assembler = node.assemblerController()?.assembler;\n\n\t\tif (this._renderMaterial) {\n\t\t\tconsole.warn('no render material');\n\t\t\treturn;\n\t\t}\n\t\t// TODO: try and find a way so that the material can be found without accessing the node\n\t\t// if (node.p.material.isDirty()) {\n\t\t// \tthis.mainController.debugMessage('renderController: this.node.p.material.compute() START');\n\t\t// \tawait node.p.material.compute();\n\t\t// \tthis.mainController.debugMessage('renderController: this.node.p.material.compute() END');\n\t\t// }\n\t\t// const matNode = node.pv.material.nodeWithContext(NodeContext.MAT, node.states.error) as BaseBuilderMatNodeType;\n\t\tconst matNodeId = CoreParticlesAttribute.getMaterialNodeId(object);\n\t\tconst matNode = this.mainController.scene.graph.nodeFromId(matNodeId) as BaseBuilderMatNodeType | undefined;\n\t\tif (matNode) {\n\t\t\tif (assembler) {\n\t\t\t\tconst new_texture_allocations_json: TextureAllocationsControllerData = assembler\n\t\t\t\t\t.textureAllocationsController()\n\t\t\t\t\t.toJSON(this.mainController.scene);\n\n\t\t\t\tconst matNodeAssemblerController = matNode.assemblerController();\n\t\t\t\tif (matNodeAssemblerController) {\n\t\t\t\t\tthis._materialGlobalsHandler.set_texture_allocations_controller(\n\t\t\t\t\t\tassembler.textureAllocationsController()\n\t\t\t\t\t);\n\t\t\t\t\tmatNodeAssemblerController.setAssemblerGlobalsHandler(this._materialGlobalsHandler);\n\t\t\t\t\tthis._matNodeAssembler = matNodeAssemblerController.assembler; //.setAdditionalUniformNames(this._allUniformNames);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!this._texture_allocations_json ||\n\t\t\t\t\tJSON.stringify(this._texture_allocations_json) != JSON.stringify(new_texture_allocations_json)\n\t\t\t\t) {\n\t\t\t\t\t// we need to set the node to dirty if a recompile is needed\n\t\t\t\t\t// otherwise it won't cook\n\t\t\t\t\t// but we also need to check if the texture_allocation has changed,\n\t\t\t\t\t// otherwise we'll have an infinite loop\n\t\t\t\t\tthis._texture_allocations_json = objectCloneDeep(new_texture_allocations_json);\n\t\t\t\t\t// setting the material to dirty is not enough. We need to make it clear a recompile is required.\n\t\t\t\t\t// This is necessary since if inputs of output or any export note are changed, the texture allocation will change. If the mat node was to not recompile, it would fetch attributes such as position from an incorrect or non existing texture.\n\t\t\t\t\tif (matNodeAssemblerController) {\n\t\t\t\t\t\tmatNodeAssemblerController.setCompilationRequiredAndDirty();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.mainController.debugMessage('renderController: matNode.compute() START');\n\t\t\tconst container = await matNode.compute();\n\t\t\tthis.mainController.debugMessage('renderController: matNode.compute() END');\n\t\t\tthis._renderMaterial = container.material();\n\t\t}\n\t\t// add uniforms\n\t\t// if (this._renderMaterial) {\n\t\t// \tconst uniforms = this._renderMaterial.uniforms;\n\t\t// \tconsole.log('this._allUniformNames', this._allUniformNames);\n\t\t// \tfor (let uniformName of this._allUniformNames) {\n\t\t// \t\tconst uniformValue = {value: null};\n\t\t// \t\tuniforms[uniformName] = uniformValue;\n\t\t// \t\tif (this._renderMaterial) {\n\t\t// \t\t\tCoreMaterial.initCustomMaterialUniforms(this._renderMaterial, uniformName, uniformValue);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tthis.assignRenderMaterial();\n\t}\n}\n","import {Object3D} from 'three';\nimport {AbstractRenderer} from '../../engine/viewers/Common';\nimport {CoreParticlesAttribute} from './CoreParticlesAttribute';\nimport {CoreParticlesGpuComputeController} from './CoreParticlesGpuComputeController';\nimport {CoreParticlesRenderController} from './CoreParticlesRenderController';\nimport type {PolyScene} from '../../engine/scene/PolyScene';\nimport {ShaderName} from '../../engine/nodes/utils/shaders/ShaderName';\nimport {ParticlesSystemGpuSopNode} from '../../engine/nodes/sop/ParticlesSystemGpu';\nimport {TextureAllocationsController} from '../../engine/nodes/gl/code/utils/TextureAllocationsController';\nimport {GPUComputationConfigRef} from './gpuCompute/GPUComputationRenderer';\n// import {CoreGroup} from '../geometry/Group';\n\nexport class CoreParticlesController {\n\tpublic readonly gpuController: CoreParticlesGpuComputeController;\n\tpublic readonly renderController: CoreParticlesRenderController;\n\tprivate _shadersByName: Map<ShaderName, string> = new Map();\n\tprivate _shaderNames: ShaderName[] = [];\n\tprivate _uniformNames: string[] = [];\n\tprotected _object: Object3D | undefined;\n\tprotected _renderer: AbstractRenderer | undefined;\n\tconstructor(public readonly scene: PolyScene, private _node: ParticlesSystemGpuSopNode) {\n\t\tthis.gpuController = new CoreParticlesGpuComputeController(this);\n\t\tthis.renderController = new CoreParticlesRenderController(this);\n\n\t\tthis._node.initCoreParticlesControllerFromPersistedConfig(this);\n\t}\n\tobject() {\n\t\treturn this._object;\n\t}\n\trenderer() {\n\t\treturn this._renderer;\n\t}\n\tdispose() {\n\t\tthis.gpuController.dispose();\n\t\tthis.renderController.dispose();\n\t}\n\tasync init(object: Object3D, renderer: AbstractRenderer) {\n\t\tthis._object = object;\n\t\tthis._renderer = renderer;\n\t\tthis.setShadersByName(this._node.shadersByName());\n\n\t\t// const coreGroup = new CoreGroup();\n\t\t// coreGroup.setObjects([this.object]);\n\n\t\t// if (isOnStartFrame) {\n\t\t// this._coreGroupSet = false;\n\t\tthis.gpuController.reset();\n\t\t// this.gpuController.resetParticleGroups();\n\t\t// }\n\n\t\t// if (!this.gpuController.initialized()) {\n\t\t// this.debugMessage('particles:this.gpuController.init(coreGroup) START');\n\t\tconst configRef = this.gpuController.init();\n\t\tif (!configRef) {\n\t\t\tconsole.warn('no configRef created');\n\t\t\treturn;\n\t\t}\n\t\t// this.debugMessage('particles:this.gpuController.init(coreGroup) END');\n\t\t// }\n\n\t\t// if (!this.renderController.initialized()) {\n\t\t// this.renderController.init();\n\t\t// this.debugMessage('particles:this.renderController.initRenderMaterial() START');\n\t\tawait this.renderController.init();\n\t\t// this.debugMessage('particles:this.renderController.initRenderMaterial() END');\n\t\t// }\n\n\t\t// this.gpuController.restartSimulationIfRequired();\n\t\t// this.gpuController.computeSimulationIfRequired(0);\n\n\t\tconst preRollFramesCount = CoreParticlesAttribute.getPreRollFramesCount(this._object);\n\n\t\tfor (let i = 0; i < preRollFramesCount; i++) {\n\t\t\tthis.gpuController.computeSimulation(1 / 60, configRef);\n\t\t}\n\t\treturn configRef;\n\t}\n\tstepSimulation(delta: number, configRef: GPUComputationConfigRef) {\n\t\tthis.gpuController.computeSimulation(delta, configRef);\n\t}\n\tasync reset() {\n\t\tthis.gpuController.reset();\n\t\tthis.renderController.reset();\n\t\tif (this._object && this._renderer) {\n\t\t\treturn await this.init(this._object, this._renderer);\n\t\t} else {\n\t\t\tconsole.log('no object or renderer', this._object, this._renderer);\n\t\t}\n\t}\n\tsetError(message: string) {\n\t\tthis._node.states.error.set(message);\n\t}\n\t// assemblerController(){\n\t// \treturn this._node.assemblerController()\n\t// }\n\tnode() {\n\t\treturn this._node;\n\t}\n\n\tsetShadersByName(shadersByName: Map<ShaderName, string>) {\n\t\tthis._shadersByName.clear();\n\t\tthis._shaderNames.length = 0;\n\t\tthis._uniformNames.length = 0;\n\t\tshadersByName.forEach((shader, shaderName) => {\n\t\t\tthis._shadersByName.set(shaderName, shader);\n\t\t\tthis._shaderNames.push(shaderName);\n\t\t\tthis._uniformNames.push(`texture_${shaderName}`);\n\t\t});\n\t}\n\tshadersByName() {\n\t\treturn this._shadersByName;\n\t}\n\tshaderNames() {\n\t\treturn this._shaderNames;\n\t}\n\tuniformNames() {\n\t\treturn this._uniformNames;\n\t}\n\tsetPersistedTextureAllocationController(controller: TextureAllocationsController) {\n\t\tthis.gpuController.setPersistedTextureAllocationController(controller);\n\t}\n\tprivate _debugCook = false;\n\tdebugMessage(message: string) {\n\t\tif (!this._debugCook) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(message);\n\t}\n}\n","import {Object3D} from 'three';\nimport {CoreParticlesController} from './CoreParticlesController';\nimport {CoreParticlesAttribute} from './CoreParticlesAttribute';\nimport type {PolyScene} from '../../engine/scene/PolyScene';\nimport {CoreGraphNodeId} from '../graph/CoreGraph';\nimport {ParticlesSystemGpuSopNode} from '../../engine/nodes/sop/ParticlesSystemGpu';\nimport {AbstractRenderer} from '../../engine/viewers/Common';\nimport {GPUComputationConfigRef} from './gpuCompute/GPUComputationRenderer';\n\nconst coreParticlesControllerByNodeId: Map<CoreGraphNodeId, CoreParticlesController> = new Map();\nconst rendererByNodeId: Map<CoreGraphNodeId, AbstractRenderer> = new Map();\nexport async function createOrFindParticlesController(object: Object3D, scene: PolyScene) {\n\tconst nodeId = CoreParticlesAttribute.getParticlesNodeId(object);\n\n\t// using a particlesSystemId attribute,\n\t// we could use multiple particle system per node.\n\t// But for now, we only have one and re-use it\n\tlet controller = coreParticlesControllerByNodeId.get(nodeId);\n\tif (!controller) {\n\t\tconst node = scene.graph.nodeFromId(nodeId) as ParticlesSystemGpuSopNode;\n\t\tif (node) {\n\t\t\tcontroller = new CoreParticlesController(scene, node);\n\t\t\tcoreParticlesControllerByNodeId.set(nodeId, controller);\n\t\t}\n\t}\n\tif (controller) {\n\t\tconst renderer = rendererByNodeId.get(nodeId);\n\t\tif (renderer) {\n\t\t\tcontroller.init(object, renderer);\n\t\t}\n\t}\n}\nexport function setParticleRenderer(nodeId: CoreGraphNodeId, renderer: AbstractRenderer) {\n\trendererByNodeId.set(nodeId, renderer);\n}\nexport function stepParticles(object: Object3D, delta: number, configRef: GPUComputationConfigRef) {\n\tcoreParticlesControllerFromObject(object)?.stepSimulation(delta, configRef);\n}\nexport function resetParticles(object: Object3D) {\n\tcoreParticlesControllerFromObject(object)?.reset();\n}\nexport function disposeParticlesFromNode(node: ParticlesSystemGpuSopNode) {\n\tconst nodeId = node.graphNodeId();\n\tconst controller = coreParticlesControllerByNodeId.get(nodeId);\n\tcontroller?.dispose();\n\tcoreParticlesControllerByNodeId.delete(nodeId);\n}\n\n// utils\nfunction coreParticlesControllerFromObject(object: Object3D) {\n\tconst nodeId = CoreParticlesAttribute.getParticlesNodeId(object);\n\treturn coreParticlesControllerByNodeId.get(nodeId);\n}\n\nexport function coreParticlesControllerFromNode(node: ParticlesSystemGpuSopNode) {\n\treturn coreParticlesControllerByNodeId.get(node.graphNodeId());\n}\nexport function gpuControllerFromNode(node: ParticlesSystemGpuSopNode) {\n\treturn coreParticlesControllerFromNode(node)?.gpuController;\n}\nexport function renderControllerFromNode(node: ParticlesSystemGpuSopNode) {\n\treturn coreParticlesControllerFromNode(node)?.renderController;\n}\n","import {Object3D, Vector2} from 'three';\nimport {coreObjectClassFactory} from '../geometry/CoreObjectFactory';\nexport enum ParticlesAttribute {\n\tPARTICLES_NODE_ID = 'particles_nodeId',\n\tMATERIAL_NODE_ID = 'particles_materialNodeId',\n\tDATA_TYPE = 'particles_dataType',\n\t// AUTO_TEXTURE_SIZE = 'particles_autoTexturesSize',\n\t// MAX_TEXTURE_SIZE = 'particles_maxTexturesSize',\n\t// TEXTURE_SIZE = 'particles_texturesSize',\n\tPRE_ROLL_FRAMES_COUNT = 'particles_preRollFramesCount',\n}\n\nexport class CoreParticlesBaseAttribute {\n\tprotected static _setVector2(object: Object3D, attribName: ParticlesAttribute, value: Vector2) {\n\t\tcoreObjectClassFactory(object).addAttribute(object, attribName, value);\n\t}\n\tprotected static _getVector2(object: Object3D, attribName: ParticlesAttribute, target: Vector2) {\n\t\tcoreObjectClassFactory(object).attribValue(object, attribName, 0, target);\n\t}\n\tprotected static _setNumber(object: Object3D, attribName: ParticlesAttribute, value: number) {\n\t\tcoreObjectClassFactory(object).addAttribute(object, attribName, value);\n\t}\n\tprotected static _setBoolean(object: Object3D, attribName: ParticlesAttribute, value: boolean) {\n\t\tcoreObjectClassFactory(object).addAttribute(object, attribName, value);\n\t}\n\tprotected static _getNumber(object: Object3D, attribName: ParticlesAttribute, defaultValue: number): number {\n\t\tconst val = coreObjectClassFactory(object).attribValue(object, attribName, 0) as number | undefined;\n\t\tif (val == null) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\treturn val;\n\t}\n\tprotected static _getBoolean(object: Object3D, attribName: ParticlesAttribute, defaultValue: boolean): boolean {\n\t\tconst val = coreObjectClassFactory(object).attribValue(object, attribName, 0) as boolean | undefined;\n\t\tif (val == null) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\treturn val;\n\t}\n\t// protected static _setString(object: Object3D, attribName: ParticlesAttribute, value: string) {\n\t// \tCoreObject.addAttribute(object, attribName, value);\n\t// }\n\t// protected static _getString(object: Object3D, attribName: ParticlesAttribute): string | undefined {\n\t// \treturn CoreObject.attribValue(object, attribName, 0) as string | undefined;\n\t// }\n}\n\nexport class CoreParticlesAttribute extends CoreParticlesBaseAttribute {\n\tstatic setParticlesNodeId(object: Object3D, value: number) {\n\t\tthis._setNumber(object, ParticlesAttribute.PARTICLES_NODE_ID, value);\n\t}\n\tstatic getMaterialNodeId(object: Object3D): number {\n\t\treturn this._getNumber(object, ParticlesAttribute.MATERIAL_NODE_ID, -1) as number;\n\t}\n\tstatic setMaterialNodeId(object: Object3D, value: number) {\n\t\tthis._setNumber(object, ParticlesAttribute.MATERIAL_NODE_ID, value);\n\t}\n\tstatic getParticlesNodeId(object: Object3D): number {\n\t\treturn this._getNumber(object, ParticlesAttribute.PARTICLES_NODE_ID, -1) as number;\n\t}\n\n\tstatic setDataType(object: Object3D, value: number) {\n\t\tthis._setNumber(object, ParticlesAttribute.DATA_TYPE, value);\n\t}\n\tstatic getDataType(object: Object3D) {\n\t\treturn this._getNumber(object, ParticlesAttribute.DATA_TYPE, 0);\n\t}\n\t// static setAutoTextureSize(object: Object3D, value: boolean) {\n\t// \tthis._setBoolean(object, ParticlesAttribute.AUTO_TEXTURE_SIZE, value);\n\t// }\n\t// static getAutoTextureSize(object: Object3D) {\n\t// \treturn this._getBoolean(object, ParticlesAttribute.AUTO_TEXTURE_SIZE, true);\n\t// }\n\t// static setMaxTextureSize(object: Object3D, value: Vector2) {\n\t// \tthis._setVector2(object, ParticlesAttribute.MAX_TEXTURE_SIZE, value);\n\t// }\n\t// static getMaxTextureSize(object: Object3D, target: Vector2) {\n\t// \treturn this._getVector2(object, ParticlesAttribute.MAX_TEXTURE_SIZE, target);\n\t// }\n\t// static setTextureSize(object: Object3D, value: Vector2) {\n\t// \tthis._setVector2(object, ParticlesAttribute.TEXTURE_SIZE, value);\n\t// }\n\t// static getTextureSize(object: Object3D, target: Vector2) {\n\t// \treturn this._getVector2(object, ParticlesAttribute.TEXTURE_SIZE, target);\n\t// }\n\tstatic setPreRollFramesCount(object: Object3D, value: number) {\n\t\tthis._setNumber(object, ParticlesAttribute.PRE_ROLL_FRAMES_COUNT, value);\n\t}\n\tstatic getPreRollFramesCount(object: Object3D) {\n\t\treturn this._getNumber(object, ParticlesAttribute.PRE_ROLL_FRAMES_COUNT, 0);\n\t}\n}\n","/**\n * GPUComputationRenderer, based on SimulationRenderer by zz85\n *\n * The GPUComputationRenderer uses the concept of variables. These variables are RGBA float textures that hold 4 floats\n * for each compute element (texel)\n *\n * Each variable has a fragment shader that defines the computation made to obtain the variable in question.\n * You can use as many variables you need, and make dependencies so you can use textures of other variables in the shader\n * (the sampler uniforms are added automatically) Most of the variables will need themselves as dependency.\n *\n * The renderer has actually two render targets per variable, to make ping-pong. Textures from the current frame are used\n * as inputs to render the textures of the next frame.\n *\n * The render targets of the variables can be used as input textures for your visualization shaders.\n *\n * Variable names should be valid identifiers and should not collide with THREE GLSL used identifiers.\n * a common approach could be to use 'texture' prefixing the variable name; i.e texturePosition, textureVelocity...\n *\n * The size of the computation (sizeX * sizeY) is defined as 'resolution' automatically in the shader. For example:\n * #DEFINE resolution vec2( 1024.0, 1024.0 )\n *\n * -------------\n *\n * Basic use:\n *\n * // Initialization...\n *\n * // Create computation renderer\n * var gpuCompute = new GPUComputationRenderer( 1024, 1024, renderer );\n *\n * // Create initial state float textures\n * var pos0 = gpuCompute.createTexture();\n * var vel0 = gpuCompute.createTexture();\n * // and fill in here the texture data...\n *\n * // Add texture variables\n * var velVar = gpuCompute.addVariable( \"textureVelocity\", fragmentShaderVel, pos0 );\n * var posVar = gpuCompute.addVariable( \"texturePosition\", fragmentShaderPos, vel0 );\n *\n * // Add variable dependencies\n * gpuCompute.setVariableDependencies( velVar, [ velVar, posVar ] );\n * gpuCompute.setVariableDependencies( posVar, [ velVar, posVar ] );\n *\n * // Add custom uniforms\n * velVar.material.uniforms.time = { value: 0.0 };\n *\n * // Check for completeness\n * var error = gpuCompute.init();\n * if ( error !== null ) {\n *\t\tconsole.error( error );\n * }\n *\n *\n * // In each frame...\n *\n * // Compute!\n * gpuCompute.compute();\n *\n * // Update texture uniforms in your visualization materials with the gpu renderer output\n * myMaterial.uniforms.myTexture.value = gpuCompute.getCurrentRenderTarget( posVar ).texture;\n *\n * // Do your rendering\n * renderer.render( myScene, myCamera );\n *\n * -------------\n *\n * Also, you can use utility functions to create ShaderMaterial and perform computations (rendering between textures)\n * Note that the shaders can have multiple input textures.\n *\n * var myFilter1 = gpuCompute.createShaderMaterial( myFilterFragmentShader1, { theTexture: { value: null } } );\n * var myFilter2 = gpuCompute.createShaderMaterial( myFilterFragmentShader2, { theTexture: { value: null } } );\n *\n * var inputTexture = gpuCompute.createTexture();\n *\n * // Fill in here inputTexture...\n *\n * myFilter1.uniforms.theTexture.value = inputTexture;\n *\n * var myRenderTarget = gpuCompute.createRenderTarget();\n * myFilter2.uniforms.theTexture.value = myRenderTarget.texture;\n *\n * var outputRenderTarget = gpuCompute.createRenderTarget();\n *\n * // Now use the output texture where you want:\n * myMaterial.uniforms.map.value = outputRenderTarget.texture;\n *\n * // And compute each frame, before rendering to screen:\n * gpuCompute.doRenderTarget( myFilter1, myRenderTarget );\n * gpuCompute.doRenderTarget( myFilter2, outputRenderTarget );\n *\n *\n *\n * @param {int} sizeX Computation problem size is always 2d: sizeX * sizeY elements.\n * @param {int} sizeY Computation problem size is always 2d: sizeX * sizeY elements.\n * @param {WebGLRenderer} renderer The renderer\n */\n\nimport {\n\tCamera,\n\tClampToEdgeWrapping,\n\tFloatType,\n\tNearestFilter,\n\tRGBAFormat,\n\tDataTexture,\n\tMesh,\n\tPlaneGeometry,\n\tScene,\n\tShaderMaterial,\n\tWebGLRenderTarget,\n} from 'three';\nimport {ref} from '@vue/reactivity';\n\nvar GPUComputationRenderer = function (sizeX, sizeY, renderer) {\n\tthis.variables = [];\n\n\tthis.currentTextureIndex = 0;\n\n\tvar dataType = FloatType;\n\n\tvar scene = new Scene();\n\tscene.matrixAutoUpdate = false;\n\n\tvar camera = new Camera();\n\tcamera.position.z = 1;\n\tcamera.matrixAutoUpdate = false;\n\tcamera.updateMatrix();\n\n\tvar passThruUniforms = {\n\t\tpassThruTexture: {value: null},\n\t};\n\n\tvar passThruShader = createShaderMaterial(getPassThroughFragmentShader(), passThruUniforms);\n\n\tconst plane = new PlaneGeometry(2, 2);\n\tvar mesh = new Mesh(plane, passThruShader);\n\tmesh.matrixAutoUpdate = false;\n\tmesh.updateMatrix();\n\tscene.add(mesh);\n\n\tthis.dispose = function () {\n\t\t// scene.dispose();\n\t\tpassThruShader.dispose();\n\t\tplane.dispose();\n\t};\n\n\tthis.setDataType = function (type) {\n\t\tdataType = type;\n\t\treturn this;\n\t};\n\n\tthis.addVariable = function (variableName, computeFragmentShader, initialValueTexture) {\n\t\tvar material = this.createShaderMaterial(computeFragmentShader);\n\n\t\tvar variable = {\n\t\t\tname: variableName,\n\t\t\tinitialValueTexture: initialValueTexture,\n\t\t\tmaterial: material,\n\t\t\tdependencies: null,\n\t\t\trenderTargets: [],\n\t\t\twrapS: null,\n\t\t\twrapT: null,\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t};\n\n\t\tthis.variables.push(variable);\n\n\t\treturn variable;\n\t};\n\n\tthis.setVariableDependencies = function (variable, dependencies) {\n\t\tvariable.dependencies = dependencies;\n\t};\n\n\tthis.init = function () {\n\t\tif (renderer.capabilities.isWebGL2 === false && renderer.extensions.has('OES_texture_float') === false) {\n\t\t\treturn 'No OES_texture_float support for float textures.';\n\t\t}\n\n\t\tif (renderer.capabilities.maxVertexTextures === 0) {\n\t\t\treturn 'No support for vertex shader textures.';\n\t\t}\n\n\t\tconst configRef = {};\n\t\tfor (let i = 0; i < this.variables.length; i++) {\n\t\t\tconst variable = this.variables[i];\n\n\t\t\tconfigRef[variable.name] = ref(null);\n\n\t\t\t// Creates rendertargets and initialize them with input texture\n\t\t\tvariable.renderTargets[0] = this.createRenderTarget(\n\t\t\t\tsizeX,\n\t\t\t\tsizeY,\n\t\t\t\tvariable.wrapS,\n\t\t\t\tvariable.wrapT,\n\t\t\t\tvariable.minFilter,\n\t\t\t\tvariable.magFilter\n\t\t\t);\n\t\t\tvariable.renderTargets[1] = this.createRenderTarget(\n\t\t\t\tsizeX,\n\t\t\t\tsizeY,\n\t\t\t\tvariable.wrapS,\n\t\t\t\tvariable.wrapT,\n\t\t\t\tvariable.minFilter,\n\t\t\t\tvariable.magFilter\n\t\t\t);\n\t\t\tthis.renderTexture(variable.initialValueTexture, variable.renderTargets[0]);\n\t\t\tthis.renderTexture(variable.initialValueTexture, variable.renderTargets[1]);\n\n\t\t\t// Adds dependencies uniforms to the ShaderMaterial\n\t\t\tvar material = variable.material;\n\t\t\tvar uniforms = material.uniforms;\n\n\t\t\tif (variable.dependencies !== null) {\n\t\t\t\tfor (var d = 0; d < variable.dependencies.length; d++) {\n\t\t\t\t\tvar depVar = variable.dependencies[d];\n\n\t\t\t\t\tif (depVar.name !== variable.name) {\n\t\t\t\t\t\t// Checks if variable exists\n\t\t\t\t\t\tvar found = false;\n\t\t\t\t\t\tfor (var j = 0; j < this.variables.length; j++) {\n\t\t\t\t\t\t\tif (depVar.name === this.variables[j].name) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!found) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t'Variable dependency not found. Variable=' +\n\t\t\t\t\t\t\t\t\tvariable.name +\n\t\t\t\t\t\t\t\t\t', dependency=' +\n\t\t\t\t\t\t\t\t\tdepVar.name\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tuniforms[depVar.name] = {value: null};\n\n\t\t\t\t\t// material.fragmentShader = '\\nuniform sampler2D ' + depVar.name + ';\\n' + material.fragmentShader;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.currentTextureIndex = 0;\n\n\t\treturn configRef;\n\t};\n\n\tthis.compute = function (configRef) {\n\t\tvar currentTextureIndex = this.currentTextureIndex;\n\t\tvar nextTextureIndex = this.currentTextureIndex === 0 ? 1 : 0;\n\n\t\tfor (var i = 0, il = this.variables.length; i < il; i++) {\n\t\t\tvar variable = this.variables[i];\n\n\t\t\t// Sets texture dependencies uniforms\n\t\t\tif (variable.dependencies !== null) {\n\t\t\t\tvar uniforms = variable.material.uniforms;\n\t\t\t\tfor (var d = 0, dl = variable.dependencies.length; d < dl; d++) {\n\t\t\t\t\tvar depVar = variable.dependencies[d];\n\n\t\t\t\t\tuniforms[depVar.name].value = depVar.renderTargets[currentTextureIndex].texture;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Performs the computation for this variable\n\t\t\tconst renderTarget = variable.renderTargets[nextTextureIndex];\n\t\t\tthis.doRenderTarget(variable.material, renderTarget);\n\t\t\tif (configRef[variable.name]) {\n\t\t\t\tconfigRef[variable.name].value = renderTarget.texture;\n\t\t\t} // else {\n\t\t\t//\tconsole.log('variable not found', variable.name);\n\t\t\t//}\n\t\t}\n\n\t\tthis.currentTextureIndex = nextTextureIndex;\n\t};\n\n\tthis.getCurrentRenderTarget = function (variable) {\n\t\treturn variable.renderTargets[this.currentTextureIndex];\n\t};\n\n\tthis.getAlternateRenderTarget = function (variable) {\n\t\treturn variable.renderTargets[this.currentTextureIndex === 0 ? 1 : 0];\n\t};\n\n\tfunction addResolutionDefine(materialShader) {\n\t\tmaterialShader.defines.resolution = 'vec2( ' + sizeX.toFixed(1) + ', ' + sizeY.toFixed(1) + ' )';\n\t}\n\n\tthis.addResolutionDefine = addResolutionDefine;\n\n\t// The following functions can be used to compute things manually\n\n\tfunction createShaderMaterial(computeFragmentShader, uniforms) {\n\t\tuniforms = uniforms || {};\n\n\t\tvar material = new ShaderMaterial({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: getPassThroughVertexShader(),\n\t\t\tfragmentShader: computeFragmentShader,\n\t\t});\n\n\t\taddResolutionDefine(material);\n\n\t\treturn material;\n\t}\n\n\tthis.createShaderMaterial = createShaderMaterial;\n\n\tthis.createRenderTarget = function (sizeXTexture, sizeYTexture, wrapS, wrapT, minFilter, magFilter) {\n\t\tsizeXTexture = sizeXTexture || sizeX;\n\t\tsizeYTexture = sizeYTexture || sizeY;\n\n\t\twrapS = wrapS || ClampToEdgeWrapping;\n\t\twrapT = wrapT || ClampToEdgeWrapping;\n\n\t\tminFilter = minFilter || NearestFilter;\n\t\tmagFilter = magFilter || NearestFilter;\n\n\t\tvar renderTarget = new WebGLRenderTarget(sizeXTexture, sizeYTexture, {\n\t\t\twrapS: wrapS,\n\t\t\twrapT: wrapT,\n\t\t\tminFilter: minFilter,\n\t\t\tmagFilter: magFilter,\n\t\t\tformat: RGBAFormat,\n\t\t\ttype: dataType,\n\t\t\tdepthBuffer: false,\n\t\t});\n\n\t\treturn renderTarget;\n\t};\n\n\tthis.createTexture = function () {\n\t\tvar data = new Float32Array(sizeX * sizeY * 4);\n\t\treturn new DataTexture(data, sizeX, sizeY, RGBAFormat, FloatType);\n\t};\n\n\tthis.renderTexture = function (input, output) {\n\t\t// Takes a texture, and render out in rendertarget\n\t\t// input = Texture\n\t\t// output = RenderTarget\n\n\t\tpassThruUniforms.passThruTexture.value = input;\n\n\t\tthis.doRenderTarget(passThruShader, output);\n\n\t\tpassThruUniforms.passThruTexture.value = null;\n\t};\n\n\tthis.doRenderTarget = function (material, output) {\n\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\tmesh.material = material;\n\t\trenderer.setRenderTarget(output);\n\t\trenderer.render(scene, camera);\n\t\tmesh.material = passThruShader;\n\n\t\trenderer.setRenderTarget(currentRenderTarget);\n\t};\n\n\t// Shaders\n\n\tfunction getPassThroughVertexShader() {\n\t\treturn 'void main()\t{\\n' + '\\n' + '\tgl_Position = vec4( position, 1.0 );\\n' + '\\n' + '}\\n';\n\t}\n\n\tfunction getPassThroughFragmentShader() {\n\t\treturn (\n\t\t\t'uniform sampler2D passThruTexture;\\n' +\n\t\t\t'\\n' +\n\t\t\t'void main() {\\n' +\n\t\t\t'\\n' +\n\t\t\t'\tvec2 uv = gl_FragCoord.xy / resolution.xy;\\n' +\n\t\t\t'\\n' +\n\t\t\t'\tgl_FragColor = texture2D( passThruTexture, uv );\\n' +\n\t\t\t'\\n' +\n\t\t\t'}\\n'\n\t\t);\n\t}\n};\n\nexport {GPUComputationRenderer};\n","import {DataTexture, Mesh, Vector2, Vector3, Vector4, FloatType, HalfFloatType, ShaderMaterial, Object3D} from 'three';\nimport {GlConstant} from '../geometry/GlConstant';\nimport {\n\tGPUComputationConfigRef,\n\tGPUComputationRenderer,\n\tGPUComputationRendererVariable,\n} from './gpuCompute/GPUComputationRenderer';\nimport {ShaderName} from '../../engine/nodes/utils/shaders/ShaderName';\nimport {TextureAllocationsController} from '../../engine/nodes/gl/code/utils/TextureAllocationsController';\nimport {GlParamConfig} from '../../engine/nodes/gl/code/utils/GLParamConfig';\nimport {TextureAllocation} from '../../engine/nodes/gl/code/utils/TextureAllocation';\nimport {CoreUserAgent} from '../UserAgent';\nimport type {CoreParticlesController} from './CoreParticlesController';\nimport {CoreParticlesAttribute} from './CoreParticlesAttribute';\nimport {coreParticlesInitParticlesUVs} from './CoreParticlesInit';\nimport {textureFromAttributePointsCount, textureSizeFromPointsCount} from '../geometry/operation/TextureFromAttribute';\nimport {corePointClassFactory} from '../geometry/CoreObjectFactory';\n\nexport enum ParticlesDataType {\n\tAUTO = 'Auto',\n\tFLOAT = 'Float',\n\tHALF_FLOAT = 'HalfFloat',\n}\nexport const PARTICLE_DATA_TYPES: ParticlesDataType[] = [\n\tParticlesDataType.AUTO,\n\tParticlesDataType.FLOAT,\n\tParticlesDataType.HALF_FLOAT,\n];\nconst DATA_TYPE_BY_ENUM = {\n\t[ParticlesDataType.AUTO]: CoreUserAgent.isiOS() ? HalfFloatType : FloatType,\n\t[ParticlesDataType.FLOAT]: FloatType,\n\t[ParticlesDataType.HALF_FLOAT]: HalfFloatType,\n};\n\nfunction dataType(object: Object3D) {\n\tconst dataType = CoreParticlesAttribute.getDataType(object);\n\tconst dataTypeName = PARTICLE_DATA_TYPES[dataType];\n\treturn DATA_TYPE_BY_ENUM[dataTypeName];\n}\nconst tmpV2 = new Vector2();\nconst tmpV3 = new Vector3();\nconst tmpV4 = new Vector4();\n\nexport class CoreParticlesGpuComputeController {\n\tprotected _gpuCompute: GPUComputationRenderer | undefined;\n\tprivate _variablesByName: Map<ShaderName, GPUComputationRendererVariable> = new Map();\n\tprivate _allVariables: GPUComputationRendererVariable[] = [];\n\tprivate _createdTexturesByName: Map<ShaderName, DataTexture> = new Map();\n\tprotected _lastSimulatedFrame: number | undefined;\n\tprivate _texturesSize: Vector2 = new Vector2();\n\tprivate _persistedTextureAllocationsController: TextureAllocationsController | undefined;\n\n\tconstructor(private mainController: CoreParticlesController) {}\n\n\tdispose() {\n\t\tif (this._gpuCompute) {\n\t\t\tthis._gpuCompute.dispose();\n\t\t\tthis._gpuCompute = undefined;\n\t\t}\n\n\t\tthis._variablesByName.clear();\n\t\tthis._allVariables.splice(0, this._allVariables.length);\n\t\tthis._createdTexturesByName.clear();\n\n\t\tif (this._persistedTextureAllocationsController) {\n\t\t\tthis._persistedTextureAllocationsController.dispose();\n\t\t\tthis._persistedTextureAllocationsController = undefined;\n\t\t}\n\t}\n\n\tsetPersistedTextureAllocationController(controller: TextureAllocationsController) {\n\t\tthis._persistedTextureAllocationsController = controller;\n\t}\n\n\tallVariables() {\n\t\treturn this._allVariables;\n\t}\n\n\tinit() {\n\t\tthis._initPoints();\n\t\treturn this.createGPUCompute();\n\t}\n\n\tprivate _initPoints() {\n\t\tthis.resetGpuCompute();\n\t}\n\tprivate _initParticlesUVs(object: Object3D) {\n\t\tcoreParticlesInitParticlesUVs(object, this._texturesSize);\n\t}\n\n\tcreateGPUCompute() {\n\t\tconst object = this.mainController.object();\n\t\tconst renderer = this.mainController.renderer();\n\t\tif (!(object && renderer)) {\n\t\t\treturn;\n\t\t}\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\n\t\ttextureSizeFromPointsCount(geometry, this._texturesSize);\n\t\tthis._initParticlesUVs(object);\n\t\t// we need to recreate the material if the texture allocation changes\n\t\tthis.mainController.renderController.reset();\n\n\t\tif (this._gpuCompute) {\n\t\t\tthis._gpuCompute.dispose();\n\t\t}\n\t\tthis._gpuCompute = new GPUComputationRenderer(this._texturesSize.x, this._texturesSize.y, renderer);\n\n\t\tthis._gpuCompute.setDataType(dataType(object));\n\n\t\tthis._lastSimulatedFrame = undefined;\n\n\t\tthis._variablesByName.forEach((variable, shader_name) => {\n\t\t\tvariable.renderTargets[0].dispose();\n\t\t\tvariable.renderTargets[1].dispose();\n\t\t\tthis._variablesByName.delete(shader_name);\n\t\t});\n\t\t// for (let shader_name of Object.keys(this._shaders_by_name)) {\n\t\tthis._allVariables = [];\n\t\tthis.mainController.shadersByName().forEach((shader, shader_name) => {\n\t\t\tif (this._gpuCompute) {\n\t\t\t\tconst gpuVariable = this._gpuCompute.addVariable(\n\t\t\t\t\tthis._textureNameForShaderName(shader_name),\n\t\t\t\t\tshader,\n\t\t\t\t\tthis._createdTexturesByName.get(shader_name)!\n\t\t\t\t);\n\t\t\t\tthis._variablesByName.set(shader_name, gpuVariable);\n\t\t\t\tthis._allVariables.push(gpuVariable);\n\t\t\t}\n\t\t});\n\n\t\tthis._variablesByName?.forEach((variable, shader_name) => {\n\t\t\tif (this._gpuCompute) {\n\t\t\t\tthis._gpuCompute.setVariableDependencies(\n\t\t\t\t\tvariable,\n\t\t\t\t\tthis._allVariables // currently all depend on all\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tthis._createTextureRenderTargets();\n\t\tthis._fillTextures(object);\n\t\tthis._createSimulationMaterialUniforms();\n\n\t\tconst configRef = this._gpuCompute.init();\n\n\t\tif (!configRef) {\n\t\t\t// console.error(error);\n\t\t\tthis.mainController.setError(`failed to generate the simulation shader`);\n\t\t}\n\t\treturn configRef;\n\t}\n\n\tpublic computeSimulation(delta: number, configRef: GPUComputationConfigRef) {\n\t\tif (!this._gpuCompute /* || this._lastSimulatedTime == null*/) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._gpuCompute.compute(configRef);\n\t\tthis.mainController.renderController.updateRenderMaterialUniforms();\n\t\tthis._updateSimulationMaterialUniforms(delta);\n\t}\n\n\tgetCurrentRenderTarget(shader_name: ShaderName) {\n\t\tconst variable = this._variablesByName.get(shader_name);\n\t\tif (variable) {\n\t\t\treturn this._gpuCompute?.getCurrentRenderTarget(variable);\n\t\t}\n\t}\n\tprivate _textureNameForShaderName(shaderName: ShaderName) {\n\t\treturn `texture_${shaderName}`;\n\t}\n\tmaterials() {\n\t\tconst materials: ShaderMaterial[] = [];\n\t\tthis._variablesByName.forEach((variable, shader_name) => {\n\t\t\tmaterials.push(variable.material);\n\t\t});\n\t\treturn materials;\n\t}\n\n\tprivate _createSimulationMaterialUniforms() {\n\t\tconst node = this.mainController.node();\n\t\tconst assemblerController = node.assemblerController();\n\t\tconst assembler = assemblerController?.assembler;\n\t\tif (!assembler && !this._persistedTextureAllocationsController) {\n\t\t\treturn;\n\t\t}\n\t\tconst all_materials: ShaderMaterial[] = [];\n\t\tthis._variablesByName.forEach((variable, shader_name) => {\n\t\t\t// const uniforms = variable.material.uniforms;\n\t\t\tall_materials.push(variable.material);\n\t\t});\n\t\tconst readonlyAllocations = this._readonlyAllocations();\n\t\tfor (const material of all_materials) {\n\t\t\tmaterial.uniforms[GlConstant.TIME] = this.mainController.scene.timeController.timeUniform();\n\t\t\tmaterial.uniforms[GlConstant.DELTA_TIME] = this.mainController.scene.timeController.timeDeltaUniform();\n\t\t\t// and we add the readonly textures\n\t\t\tif (readonlyAllocations) {\n\t\t\t\tthis._assignReadonlyTextures(material, readonlyAllocations);\n\t\t\t}\n\t\t}\n\n\t\tif (assembler) {\n\t\t\tfor (const material of all_materials) {\n\t\t\t\tfor (const param_config of assembler.param_configs()) {\n\t\t\t\t\tmaterial.uniforms[param_config.uniformName()] = param_config.uniform();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst persisted_data = node.persisted_config.loaded_data();\n\t\t\tif (persisted_data) {\n\t\t\t\tconst persisted_uniforms = node.persisted_config.uniforms();\n\t\t\t\tif (persisted_uniforms) {\n\t\t\t\t\tconst param_uniform_pairs = persisted_data.param_uniform_pairs;\n\t\t\t\t\tfor (const pair of param_uniform_pairs) {\n\t\t\t\t\t\tconst param_name = pair[0];\n\t\t\t\t\t\tconst uniform_name = pair[1];\n\t\t\t\t\t\tconst param = node.params.get(param_name);\n\t\t\t\t\t\tconst uniform = persisted_uniforms[uniform_name];\n\t\t\t\t\t\tfor (const material of all_materials) {\n\t\t\t\t\t\t\tmaterial.uniforms[uniform_name] = uniform;\n\t\t\t\t\t\t\tif (readonlyAllocations) {\n\t\t\t\t\t\t\t\tthis._assignReadonlyTextures(material, readonlyAllocations);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (param && uniform) {\n\t\t\t\t\t\t\tconst callback = () => {\n\t\t\t\t\t\t\t\tfor (const material of all_materials) {\n\t\t\t\t\t\t\t\t\tGlParamConfig.callback(param, material.uniforms[uniform_name]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tparam.options.setOption('callback', callback);\n\t\t\t\t\t\t\t// just like texture and material persistedconfigs\n\t\t\t\t\t\t\t// the callback should be run a first time\n\t\t\t\t\t\t\t// so that ramp params can be set correctly\n\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _assignReadonlyTextures(material: ShaderMaterial, readonlyAllocations: TextureAllocation[]) {\n\t\tfor (const allocation of readonlyAllocations) {\n\t\t\tconst shaderName = allocation.shaderName();\n\t\t\tconst texture = this._createdTexturesByName.get(shaderName);\n\t\t\tif (texture) {\n\t\t\t\tconst uniformName = this._textureNameForShaderName(shaderName);\n\t\t\t\tmaterial.uniforms[uniformName] = {value: texture};\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _updateSimulationMaterialUniforms(delta: number) {\n\t\tfor (const variable of this._allVariables) {\n\t\t\tvariable.material.uniforms[GlConstant.TIME].value += delta;\n\t\t\tvariable.material.uniforms[GlConstant.DELTA_TIME].value = delta;\n\t\t}\n\t}\n\n\tcreatedTexturesByName(): Readonly<Map<ShaderName, DataTexture>> {\n\t\treturn this._createdTexturesByName;\n\t}\n\n\tprivate _fillTextures(object: Object3D) {\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\t\tconst corePointClass = corePointClassFactory(object);\n\t\tconst pointsCount = textureFromAttributePointsCount(geometry);\n\t\tconst texture_allocations_controller = this._textureAllocationsController();\n\t\tif (!texture_allocations_controller) {\n\t\t\treturn;\n\t\t}\n\t\tthis._createdTexturesByName.forEach((texture, shader_name) => {\n\t\t\tconst texture_allocation = texture_allocations_controller.allocationForShaderName(shader_name);\n\t\t\tif (!texture_allocation) {\n\t\t\t\tconsole.warn(`no allocation found for shader ${shader_name}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst texture_variables = texture_allocation.variables();\n\t\t\tif (!texture_variables) {\n\t\t\t\tconsole.warn(`allocation has no variables`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst array = texture.image.data;\n\n\t\t\tfor (const texture_variable of texture_variables) {\n\t\t\t\tconst texture_position = texture_variable.position();\n\t\t\t\tlet variable_name = texture_variable.name();\n\n\t\t\t\t// const first_point = this._points[0];\n\t\t\t\t// if (first_point) {\n\t\t\t\tconst has_attrib = corePointClass.hasAttribute(object, variable_name);\n\t\t\t\tif (has_attrib) {\n\t\t\t\t\tconst attrib_size = corePointClass.attribSize(object, variable_name);\n\t\t\t\t\tlet cmptr = texture_position;\n\t\t\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\t\t\tswitch (attrib_size) {\n\t\t\t\t\t\t\tcase 1: {\n\t\t\t\t\t\t\t\tconst val: number = corePointClass.attribValue(object, i, variable_name) as number;\n\t\t\t\t\t\t\t\tarray[cmptr] = val;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase 2: {\n\t\t\t\t\t\t\t\tcorePointClass.attribValue(object, i, variable_name, tmpV2);\n\t\t\t\t\t\t\t\ttmpV2.toArray(array, cmptr);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase 3: {\n\t\t\t\t\t\t\t\tcorePointClass.attribValue(object, i, variable_name, tmpV3);\n\t\t\t\t\t\t\t\ttmpV3.toArray(array, cmptr);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase 4: {\n\t\t\t\t\t\t\t\tcorePointClass.attribValue(object, i, variable_name, tmpV4);\n\t\t\t\t\t\t\t\ttmpV4.toArray(array, cmptr);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if (attrib_size == 1) {\n\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t// \t(CorePoint.attribValue(geometry, i,variable_name) as Vector2).toArray(array, cmptr);\n\t\t\t\t\t\t// }\n\t\t\t\t\t\tcmptr += 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// }\n\t\t\t}\n\t\t\ttexture.needsUpdate = true;\n\t\t});\n\t}\n\treset() {\n\t\tthis.resetGpuCompute();\n\t}\n\tprivate resetGpuCompute() {\n\t\tthis._gpuCompute?.dispose();\n\t\tthis._gpuCompute = undefined;\n\t}\n\n\tprivate _createTextureRenderTargets() {\n\t\tthis._createdTexturesByName.forEach((texture, shader_name) => {\n\t\t\ttexture.dispose();\n\t\t});\n\n\t\tthis._createdTexturesByName.clear();\n\t\tthis._variablesByName.forEach((texture_variable, shader_name) => {\n\t\t\tif (this._gpuCompute) {\n\t\t\t\tthis._createdTexturesByName.set(shader_name, this._gpuCompute.createTexture());\n\t\t\t}\n\t\t});\n\t\t// we also need to create textures for readonly variables\n\t\tconst readonlyAllocations = this._readonlyAllocations();\n\t\tif (readonlyAllocations && this._gpuCompute) {\n\t\t\tfor (const readonlyAllocation of readonlyAllocations) {\n\t\t\t\tthis._createdTexturesByName.set(readonlyAllocation.shaderName(), this._gpuCompute.createTexture());\n\t\t\t}\n\t\t}\n\t}\n\tprivate _textureAllocationsController() {\n\t\tconst node = this.mainController.node();\n\t\treturn (\n\t\t\tnode.assemblerController()?.assembler.textureAllocationsController() ||\n\t\t\tthis._persistedTextureAllocationsController\n\t\t);\n\t}\n\tprivate _readonlyAllocations() {\n\t\treturn this._textureAllocationsController()?.readonlyAllocations();\n\t}\n}\n","import {Object3D, Vector2, Mesh, BufferAttribute, InstancedBufferAttribute} from 'three';\nimport {GlobalsTextureHandler} from '../../engine/nodes/gl/code/globals/Texture';\nimport {textureFromAttributePointsCount} from '../geometry/operation/TextureFromAttribute';\nimport {markedAsInstance} from '../geometry/GeometryUtils';\n\nexport function coreParticlesInitParticlesUVs(object: Object3D, texturesSize: Vector2) {\n\tconst geometry = (object as Mesh).geometry;\n\tif (!geometry) {\n\t\treturn;\n\t}\n\tconst pointsCount = textureFromAttributePointsCount(geometry);\n\tvar uvs = new Float32Array(pointsCount * 2);\n\n\tlet p = 0;\n\tvar cmptr = 0;\n\tfor (var j = 0; j < texturesSize.x; j++) {\n\t\tfor (var i = 0; i < texturesSize.y; i++) {\n\t\t\tuvs[p++] = i / (texturesSize.x - 1);\n\t\t\tuvs[p++] = j / (texturesSize.y - 1);\n\n\t\t\tcmptr += 2;\n\t\t\tif (cmptr >= uvs.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst uv_attrib_name = GlobalsTextureHandler.PARTICLES_SIM_UV_ATTRIB;\n\tconst attribute_constructor = markedAsInstance(geometry) ? InstancedBufferAttribute : BufferAttribute;\n\t// if (this._particlesCoreGroup) {\n\t// for (let core_geometry of this._particlesCoreGroup.coreGeometries()) {\n\t// const geometry = core_geometry.geometry();\n\n\tgeometry.setAttribute(uv_attrib_name, new attribute_constructor(uvs, 2));\n\t// }\n\t// }\n}\n","//\n// https://antfu.me/posts/watch-with-reactivity\n//\n\nimport {computed, Ref, ref} from '@vue/reactivity';\nimport {watch} from '@vue-reactivity/watch';\n\n// function traverse(value: any, seen: Set<any>) {\n// \tconsole.log(value);\n// \tif (seen.has(value)) {\n// \t\treturn value;\n// \t}\n// \tif (!isObject(value)) {\n// \t\treturn value;\n// \t}\n\n// \tseen.add(value); // prevent circular reference\n// \tif (isArray(value)) {\n// \t\tfor (let i = 0; i < value.length; i++) traverse(value[i], seen);\n// \t} else {\n// \t\tfor (const key of Object.keys(value)) traverse((value as any)[key], seen);\n// \t}\n// \treturn value;\n// }\n\n// interface WatchOptions {\n// \tdeep: boolean;\n// \tlazy?: boolean;\n// }\n// function watch(source: any, fn: EffectScheduler, options?: WatchOptions) {\n// \toptions = options || {deep: false, lazy: false};\n// \tconst {deep, lazy} = options;\n// \tlet getter = isRef(source) ? () => source.value : isReactive(source) ? () => source : source;\n// \tconsole.log({source, isRef: isRef(source), getter, fn});\n// \tif (deep) {\n// \t\tconst seen = new Set();\n// \t\tconst _getter = () => traverse(getter(), seen);\n// \t\tgetter = _getter;\n// \t}\n\n// \tconst runner = effect(getter, {\n// \t\tlazy,\n// \t\tscheduler: fn,\n// \t});\n// \tconsole.log(runner);\n\n// \treturn () => stop(runner);\n// }\n\nconst MAX = Math.floor(Number.MAX_SAFE_INTEGER / 100);\nexport function incrementRefSafely(_ref: Ref<number>) {\n\tif (_ref.value > MAX) {\n\t\t_ref.value = 0;\n\t} else {\n\t\t_ref.value += 1;\n\t}\n}\nexport function dummyReadRefVal(value: number) {\n\t// we just need this method to force a call to .value\n\t// and ensure that we have a dependency with the ref()\n}\n\nexport {computed, ref, watch};\n","import {Ref} from '@vue/reactivity';\nimport {incrementRefSafely, ref} from '../../core/reactivity/CoreReactivity';\n\nconst refByNodePath: Map<string, Ref<number>> = new Map();\nexport function getOrCreateNodeRef(nodePath: string) {\n\treturn getNodeRef(nodePath) || createNodeRef(nodePath);\n}\nexport function getNodeRef(nodePath: string) {\n\treturn refByNodePath.get(nodePath);\n}\nexport function createNodeRef(nodePath: string) {\n\tlet refForNodePath = refByNodePath.get(nodePath);\n\tif (!refForNodePath) {\n\t\trefForNodePath = ref(0);\n\t\trefByNodePath.set(nodePath, refForNodePath);\n\t}\n\treturn refForNodePath;\n}\n\nexport function touchNodeRef(nodePath: string) {\n\tconst _ref = getNodeRef(nodePath);\n\tif (!_ref) {\n\t\treturn;\n\t}\n\tincrementRefSafely(_ref);\n}\n","// import {ref} from './CoreReactivity';\nimport type {Ref} from '@vue/reactivity';\n// import type{ Vector2} from 'three';\n// import { ParamConvertibleJsType} from '../../engine/nodes/utils/io/connections/Js';\n\nimport type {AttribValue} from '../../types/GlobalTypes';\n\nimport type {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';\nimport {JsIConnectionPointTypeToDataTypeMap, ParamConvertibleJsType} from '../../engine/nodes/utils/io/connections/Js';\n\nexport interface AttribRefs<T extends ParamConvertibleJsType> {\n\tcurrent: Ref<JsIConnectionPointTypeToDataTypeMap[T]>;\n\tprevious: Ref<JsIConnectionPointTypeToDataTypeMap[T]>;\n}\n\nexport type ObjectXD = ObjectContent<CoreObjectType>;\nexport const refByObjectUuidByAttribName: WeakMap<\n\tObjectXD,\n\tMap<string, AttribRefs<ParamConvertibleJsType>>\n> = new WeakMap();\n\nexport function _getObjectAttributeRef_(\n\tobject3D: ObjectXD,\n\tattribName: string\n\t// type: ParamConvertibleJsType\n): AttribRefs<ParamConvertibleJsType> | undefined {\n\treturn refByObjectUuidByAttribName.get(object3D)?.get(attribName);\n}\n\n// export function _getOrCreateObjectAttributeRef(\n// \tobject3D: ObjectXD,\n// \tattribName: string,\n// \ttype: ParamConvertibleJsType\n// ): AttribRefs {\n// \tlet mapForObject = refByObjectUuidByAttribName.get(object3D);\n// \tif (!mapForObject) {\n// \t\tmapForObject = new Map();\n// \t\trefByObjectUuidByAttribName.set(object3D, mapForObject);\n// \t}\n// \tlet refForAttribName = mapForObject.get(attribName);\n// \tif (!refForAttribName) {\n// \t\tlet _defaultValue = defaultValue(type);\n// \t\tlet _previousValue = defaultValue(type);\n// \t\tconst currentValue = CoreObject.attribValue(object3D, attribName, 0, _defaultValue as any as Vector2);\n// \t\tconst previousValue = CoreObject.attribValue(object3D, attribName, 0, _previousValue as any as Vector2);\n// \t\tif (currentValue == null || previousValue == null) {\n// \t\t\trefForAttribName = {\n// \t\t\t\tcurrent: ref(defaultValue(type)),\n// \t\t\t\tprevious: ref(defaultValue(type)),\n// \t\t\t};\n// \t\t} else {\n// \t\t\trefForAttribName = {\n// \t\t\t\tcurrent: ref(currentValue),\n// \t\t\t\tprevious: ref(previousValue),\n// \t\t\t};\n// \t\t}\n// \t\tmapForObject.set(attribName, refForAttribName);\n// \t}\n// \treturn refForAttribName;\n// }\nexport function _dummyReadAttributeRefVal(value: AttribValue) {\n\t// \t// console.log('_dummyReadAttributeRefVal', value);\n\t// \t// we just need this method to force a call to .value\n\t// \t// and ensure that we have a dependency with the ref()\n}\n\n// export function touchObjectAttribute(object3D: Object3D, attribName: string) {\n// \t// const _ref = _getObjectAttributeRef(object3D, attribName);\n// \t// incrementRefSafely(_ref);\n// }\n","import {ObjectXD, _getObjectAttributeRef_, refByObjectUuidByAttribName, AttribRefs} from './ObjectAttributeReactivity';\nimport {Color, Vector2, Vector3, Vector4} from 'three';\nimport {\n\tJsConnectionPointType,\n\tJsIConnectionPointTypeToDataTypeMap,\n\tParamConvertibleJsType,\n} from '../../engine/nodes/utils/io/connections/Js';\nimport {TypeAssert} from '../../engine/poly/Assert';\nimport {BaseCoreObject} from '../geometry/entities/object/BaseCoreObject';\nimport type {AttribValue} from '../../types/GlobalTypes';\nimport {ref} from './CoreReactivity';\nimport {Ref} from '@vue/reactivity';\n\nfunction defaultValue<T extends ParamConvertibleJsType>(type: T): JsIConnectionPointTypeToDataTypeMap[T] {\n\tswitch (type) {\n\t\tcase JsConnectionPointType.BOOLEAN: {\n\t\t\treturn false as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.COLOR: {\n\t\t\treturn new Color() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.FLOAT: {\n\t\t\treturn 0 as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.INT: {\n\t\t\treturn 0 as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.STRING: {\n\t\t\treturn '' as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\treturn new Vector2() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\treturn new Vector3() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\treturn new Vector4() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t}\n\tTypeAssert.unreachable(type);\n}\nfunction cloneDefaultValue<T extends ParamConvertibleJsType>(\n\tvalue: JsIConnectionPointTypeToDataTypeMap[T],\n\ttype: T\n): JsIConnectionPointTypeToDataTypeMap[T] {\n\tswitch (type) {\n\t\tcase JsConnectionPointType.BOOLEAN: {\n\t\t\treturn value as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.COLOR: {\n\t\t\treturn (value as Color).clone() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.FLOAT: {\n\t\t\treturn value as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.INT: {\n\t\t\treturn value as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.STRING: {\n\t\t\treturn value as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\treturn (value as Vector2).clone() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\treturn (value as Vector3).clone() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\treturn (value as Vector4).clone() as JsIConnectionPointTypeToDataTypeMap[T];\n\t\t}\n\t}\n\tTypeAssert.unreachable(type);\n}\n\nexport function getOrCreateObjectAttributeRef<T extends ParamConvertibleJsType>(\n\tobject3D: ObjectXD,\n\tattribName: string,\n\ttype: T,\n\tdefaultAttribValue?: JsIConnectionPointTypeToDataTypeMap[T]\n): AttribRefs<T> {\n\tlet mapForObject = refByObjectUuidByAttribName.get(object3D);\n\tif (!mapForObject) {\n\t\tmapForObject = new Map();\n\t\trefByObjectUuidByAttribName.set(object3D, mapForObject);\n\t}\n\tlet refForAttribName: AttribRefs<T> = mapForObject.get(attribName) as AttribRefs<T>;\n\tif (!refForAttribName) {\n\t\tlet _defaultValue = defaultAttribValue != null ? defaultAttribValue : defaultValue(type);\n\t\tlet _previousValue = cloneDefaultValue(_defaultValue, type);\n\t\tconst currentValue = BaseCoreObject.attribValue(\n\t\t\tobject3D,\n\t\t\tattribName,\n\t\t\t0,\n\t\t\t_defaultValue as unknown as Vector2\n\t\t) as JsIConnectionPointTypeToDataTypeMap[T] | undefined;\n\t\tconst previousValue = BaseCoreObject.attribValue(object3D, attribName, 0, _previousValue as any as Vector2) as\n\t\t\t| JsIConnectionPointTypeToDataTypeMap[T]\n\t\t\t| undefined;\n\t\tif (currentValue == null || previousValue == null) {\n\t\t\trefForAttribName = {\n\t\t\t\tcurrent: ref(_defaultValue) as Ref<JsIConnectionPointTypeToDataTypeMap[T]>,\n\t\t\t\tprevious: ref<JsIConnectionPointTypeToDataTypeMap[T]>(_previousValue) as Ref<\n\t\t\t\t\tJsIConnectionPointTypeToDataTypeMap[T]\n\t\t\t\t>,\n\t\t\t};\n\t\t} else {\n\t\t\trefForAttribName = {\n\t\t\t\tcurrent: ref(currentValue) as Ref<JsIConnectionPointTypeToDataTypeMap[T]>,\n\t\t\t\tprevious: ref(previousValue) as Ref<JsIConnectionPointTypeToDataTypeMap[T]>,\n\t\t\t};\n\t\t}\n\t\tmapForObject.set(attribName, refForAttribName);\n\t}\n\treturn refForAttribName;\n}\nexport function _dummyReadAttributeRefVal(value: AttribValue) {\n\t// \t// console.log('_dummyReadAttributeRefVal', value);\n\t// \t// we just need this method to force a call to .value\n\t// \t// and ensure that we have a dependency with the ref()\n}\n\n// export function touchObjectAttribute(object3D: Object3D, attribName: string) {\n// \t// const _ref = _getObjectAttributeRef(object3D, attribName);\n// \t// incrementRefSafely(_ref);\n// }\n","import {Ref} from '@vue/reactivity';\nimport {ref} from '../../core/reactivity/CoreReactivity';\nimport {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';\n\nconst refChildrenCountByUuid: WeakMap<ObjectContent<CoreObjectType>, Ref<number>> = new WeakMap();\nexport function getObjectChildrenCountRef(object: ObjectContent<CoreObjectType>) {\n\tlet _ref = refChildrenCountByUuid.get(object);\n\tif (!_ref) {\n\t\t_ref = ref(object.children.length);\n\t\trefChildrenCountByUuid.set(object, _ref);\n\t}\n\treturn _ref;\n}\n\nexport function updateObjectChildrenCountRef(object: ObjectContent<CoreObjectType>) {\n\tgetObjectChildrenCountRef(object).value = object.children.length;\n}\n","import {Ref} from '@vue/reactivity';\nimport {incrementRefSafely, ref} from '../../core/reactivity/CoreReactivity';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport {BaseParamType} from '../../engine/params/_Base';\n\nconst refByNodePathByParamName: Map<string, Map<string, Ref<number>>> = new Map();\nexport function getOrCreateParamRef(node: BaseNodeType, paramName: string) {\n\treturn getParamRef(node, paramName) || createParamRef(node, paramName);\n}\nexport function getParamRef(node: BaseNodeType, paramName: string) {\n\treturn refByNodePathByParamName.get(node.path())?.get(paramName);\n}\nexport function createParamRef(node: BaseNodeType, paramName: string) {\n\tlet mapForNode = refByNodePathByParamName.get(node.path());\n\tif (!mapForNode) {\n\t\tmapForNode = new Map();\n\t\trefByNodePathByParamName.set(node.path(), mapForNode);\n\t}\n\tlet refForParam = mapForNode.get(paramName);\n\tif (!refForParam) {\n\t\trefForParam = ref(0);\n\t\tmapForNode.set(paramName, refForParam);\n\t}\n\treturn refForParam;\n}\n\nexport function touchParamRef(node: BaseNodeType, paramName: string) {\n\tconst _ref = getParamRef(node, paramName);\n\tif (!_ref) {\n\t\treturn;\n\t}\n\tincrementRefSafely(_ref);\n}\nexport function touchParamRefFromParam(param: BaseParamType) {\n\tif (!param.node) {\n\t\treturn;\n\t}\n\tconst _ref = getParamRef(param.node, param.name());\n\tif (!_ref) {\n\t\treturn;\n\t}\n\tincrementRefSafely(_ref);\n}\n","import {Object3D} from 'three';\nimport {CSSObjectElementCopyObjectAttributes} from './CSSObjectAttribute';\n\nexport class CSS2DObject extends Object3D {\n\tpublic readonly isCSS2DObject = true;\n\n\tconstructor(public element = document.createElement('div')) {\n\t\tsuper();\n\n\t\tthis.element.style.position = 'absolute';\n\n\t\tthis.element.setAttribute('draggable', false as any);\n\n\t\t// this.addEventListener( 'removed', function () {\n\n\t\t// \tthis.traverse( function ( object ) {\n\n\t\t// \t\tif ( object.element instanceof Element && object.element.parentNode !== null ) {\n\n\t\t// \t\t\tobject.element.parentNode.removeChild( object.element );\n\n\t\t// \t\t}\n\n\t\t// \t} );\n\n\t\t// } );\n\t}\n\n\toverride copy(source: CSS2DObject, recursive: boolean) {\n\t\tsuper.copy(source as this, recursive);\n\n\t\tthis.element = source.element.cloneNode(true) as HTMLDivElement;\n\n\t\treturn this;\n\t}\n}\n\nexport interface CSS2DObjectOptions {\n\tobject?: Object3D;\n\tid: string;\n\tclassName: string;\n\thtml: string;\n\tcopyAttributes: boolean;\n\tattributesToCopy: string[];\n}\n\nexport function createCSS2DObject(options: CSS2DObjectOptions) {\n\tconst {id, className, html} = options;\n\tconst element = document.createElement('div');\n\telement.id = id;\n\telement.className = className;\n\telement.innerHTML = html;\n\tconst CSSObject = new CSS2DObject(element);\n\tCSSObject.matrixAutoUpdate = false;\n\n\tif (options.object) {\n\t\tCSSObjectElementCopyObjectAttributes(element, {\n\t\t\t...options,\n\t\t\tobject: options.object,\n\t\t\tCSSObject,\n\t\t});\n\t\t// ensure children are also copied\n\t\tlet child: Object3D | undefined;\n\t\twhile ((child = options.object.children.pop())) {\n\t\t\tCSSObject.add(child);\n\t\t}\n\n\t\tCSSObject.position.copy(options.object.position);\n\t\t// CSSObject.quaternion.copy(options.object.quaternion);\n\t\t// CSSObject.scale.copy(options.object.scale);\n\t\tCSSObject.updateMatrix();\n\t}\n\n\treturn CSSObject;\n}\n","import {CoreObjectType, ObjectContent} from '../../geometry/ObjectContent';\nimport {\n\tsetObjectNumber,\n\tgetObjectNumber,\n\tsetObjectBoolean,\n\tgetObjectBoolean,\n\tgetObjectString,\n\tsetObjectString,\n} from '../../geometry/AttributeUtils';\nimport {Object3D} from 'three';\nimport {isString, isNumber} from '../../Type';\nimport type {CSS2DObject} from './CSS2DObject';\nimport type {CSS3DObject} from './CSS3DObject';\nimport {objectCloneDeep} from '../../ObjectUtils';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\n// export enum CSSObjectAttributeId {\n// \tNODE_ID = 'CSSObject_nodeId',\n// }\n\nexport enum CSSObjectAttribute {\n\tID = 'htmlId',\n\tCLASS = 'htmlClass',\n\tHTML = 'html',\n\tCOPY_ATTRIBUTES = 'htmlCopyAttributes',\n\tATTRIBUTES_TO_COPY = 'htmlAttributesToCopy',\n\tSCALE = 'htmlScale',\n}\n\nexport const DEFAULT_CSS2DOBJECT = {\n\tid: 'myCSSObject',\n\tclassName: 'CSS2DObject',\n\thtml: '<div>default html</div>',\n};\nexport const DEFAULT_CSS3DOBJECT = {\n\tid: 'myCSSObject',\n\tclassName: 'CSS3DObject',\n\thtml: '<div>default html</div>',\n};\n\nexport class CoreCSSObjectAttribute {\n\t// node id\n\t// static setNodeId(object: ObjectContent<CoreObjectType>, value: number) {\n\t// \tsetObjectNumber(object, CSSObjectAttributeId.NODE_ID, value);\n\t// }\n\t// static getNodeId(object: ObjectContent<CoreObjectType>): number {\n\t// \treturn getObjectNumber(object, CSSObjectAttributeId.NODE_ID, -1);\n\t// }\n\t// html properties\n\tstatic setElementId(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, CSSObjectAttribute.ID, value);\n\t}\n\tstatic getElementId(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, CSSObjectAttribute.ID) as string;\n\t}\n\tstatic setElementClass(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, CSSObjectAttribute.CLASS, value);\n\t}\n\tstatic getElementClass(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, CSSObjectAttribute.CLASS) as string;\n\t}\n\tstatic setElementHTML(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, CSSObjectAttribute.HTML, value);\n\t}\n\tstatic getElementHTML(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, CSSObjectAttribute.HTML) as string;\n\t}\n\t// attributes copy\n\tstatic setCopyAttributes(object: ObjectContent<CoreObjectType>, value: boolean) {\n\t\tsetObjectBoolean(object, CSSObjectAttribute.COPY_ATTRIBUTES, value);\n\t}\n\tstatic getCopyAttributes(object: ObjectContent<CoreObjectType>): boolean {\n\t\treturn getObjectBoolean(object, CSSObjectAttribute.COPY_ATTRIBUTES, false) as boolean;\n\t}\n\tstatic setAttributesToCopy(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, CSSObjectAttribute.ATTRIBUTES_TO_COPY, value);\n\t}\n\tstatic getAttributesToCopy(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, CSSObjectAttribute.ATTRIBUTES_TO_COPY) as string;\n\t}\n\t// CSS3DObject\n\tstatic setScale(object: ObjectContent<CoreObjectType>, value: number) {\n\t\tsetObjectNumber(object, CSSObjectAttribute.SCALE, value);\n\t}\n\tstatic getScale(object: ObjectContent<CoreObjectType>): number {\n\t\treturn getObjectNumber(object, CSSObjectAttribute.SCALE, 1);\n\t}\n}\n\ninterface CopyAttributesOptions {\n\tCSSObject: CSS2DObject | CSS3DObject;\n\tcopyAttributes: boolean;\n\tattributesToCopy: string[];\n\tobject: Object3D;\n}\nexport function CSSObjectElementCopyObjectAttributes(element: HTMLElement, options: CopyAttributesOptions) {\n\tconst {CSSObject, copyAttributes, attributesToCopy, object} = options;\n\n\tCSSObject.name = object.name;\n\tCSSObject.userData = objectCloneDeep(object.userData);\n\n\tif (copyAttributes == true) {\n\t\tconst coreObjectClass = coreObjectClassFactory(object);\n\t\tfor (const attribName of attributesToCopy) {\n\t\t\tconst attribValue = coreObjectClass.attribValue(object, attribName);\n\t\t\tif (isString(attribValue)) {\n\t\t\t\telement.setAttribute(attribName, attribValue);\n\t\t\t} else {\n\t\t\t\tif (isNumber(attribValue)) {\n\t\t\t\t\telement.setAttribute(attribName, `${attribValue}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {WebGLRendererParameters} from 'three';\n\nexport enum PowerPreference {\n\tHIGH = 'high-performance',\n\tLOW = 'low-power',\n\tDEFAULT = 'default',\n}\nexport const POWER_PREFERENCES: PowerPreference[] = [\n\tPowerPreference.HIGH,\n\tPowerPreference.LOW,\n\tPowerPreference.DEFAULT,\n];\n\nexport enum RendererPrecision {\n\tHIGH = 'highp',\n\tMEDIUM = 'mediump',\n\tLOW = 'lowp',\n}\n\nexport const RENDERER_PRECISIONS: RendererPrecision[] = [\n\tRendererPrecision.HIGH,\n\tRendererPrecision.MEDIUM,\n\tRendererPrecision.LOW,\n];\n\nexport const WEBGL_RENDERER_DEFAULT_PARAMS: WebGLRendererParameters = {\n\talpha: true,\n\tprecision: RendererPrecision.HIGH,\n\tpremultipliedAlpha: true,\n\tantialias: true,\n\tpreserveDrawingBuffer: false,\n\tpowerPreference: PowerPreference.DEFAULT,\n\tdepth: true,\n\tstencil: true,\n\tlogarithmicDepthBuffer: false,\n};\n","import {Object3D} from 'three';\nimport {Mesh} from 'three';\nimport {Material} from 'three';\nimport {Side} from 'three';\nimport {DoubleSide} from 'three';\nimport {isArray} from '../Type';\nimport {CoreGroup} from '../geometry/Group';\n\nexport class MatDoubleSideTmpSetter {\n\tprivate _sidePropertyByMaterial: WeakMap<Material, Side> = new WeakMap();\n\tprivate _bound_setMat = this._setObjectMaterialDoubleSided.bind(this);\n\tprivate _bound_restoreMat = this._restoreObjectMaterialSide.bind(this);\n\n\tsetCoreGroupMaterialDoubleSided(core_group: CoreGroup) {\n\t\tconst objects = core_group.threejsObjects();\n\t\tfor (const object of objects) {\n\t\t\tobject.traverse(this._bound_setMat);\n\t\t}\n\t}\n\trestoreMaterialSideProperty(core_group: CoreGroup) {\n\t\tconst objects = core_group.threejsObjects();\n\t\tfor (const object of objects) {\n\t\t\tobject.traverse(this._bound_restoreMat);\n\t\t}\n\t}\n\tprivate _setObjectMaterialDoubleSided(object: Object3D) {\n\t\tconst mat = (object as Mesh).material;\n\t\tif (mat) {\n\t\t\tif (isArray(mat)) {\n\t\t\t\tfor (const mati of mat) {\n\t\t\t\t\tthis._setMaterialDoubleSided(mati);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._setMaterialDoubleSided(mat);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _restoreObjectMaterialSide(object: Object3D) {\n\t\tconst mat = (object as Mesh).material;\n\t\tif (mat) {\n\t\t\tif (isArray(mat)) {\n\t\t\t\tfor (const mati of mat) {\n\t\t\t\t\tthis._restoreMaterialDoubleSided(mati);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._restoreMaterialDoubleSided(mat);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _setMaterialDoubleSided(mat: Material) {\n\t\tthis._sidePropertyByMaterial.set(mat, mat.side);\n\t\tmat.side = DoubleSide;\n\t}\n\tprivate _restoreMaterialDoubleSided(mat: Material) {\n\t\tmat.side = this._sidePropertyByMaterial.get(mat) || DoubleSide;\n\t}\n}\n","export function defaultPixelRatio() {\n\t// pixel ratio used to be set to:\n\t// - for mobile: 1\n\t// - for desktop: Math.max(2, window.devicePixelRatio)\n\t// using return CoreUserAgent.isMobile() ? 1 : Math.max(2, window.devicePixelRatio);\n\t// I've considerred keeping it simple and setting to window.devicePixelRatio for every device,\n\t// but the loss of resolution is noticeable on desktop.\n\t// so Math.max(2, window.devicePixelRatio) seems like a good compromise between\n\t// simplicity and result.\n\t// Any further customisation can be done with the rop/WebGLRenderer node\n\t// return Math.max(2, window.devicePixelRatio);\n\t// using a fixed value of 2 now,\n\t// since high dpi devices probably don't need higher\n\treturn 2;\n}\n","import {PolyScene} from '../../../../src/engine/scene/PolyScene';\nexport function coreGetDefaultCamera(scene: PolyScene) {\n\treturn (\n\t\tscene.root().mainCameraController.cameraSync() ||\n\t\tscene.viewersRegister.lastRenderedViewer()?.camera() ||\n\t\tscene.root().mainCameraController.dummyPerspectiveCamera()\n\t);\n}\n","export default \"varying vec2 vUv;\\n\\nvoid main() {\\n\\tvUv = uv;\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\n}\"","export default \"#include <packing>\\n\\nvarying vec2 vUv;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tDepth;\\nuniform float cameraNear;\\nuniform float cameraFar;\\n\\n\\nfloat readDepth( sampler2D depthSampler, vec2 coord ) {\\n\\tfloat fragCoordZ = texture2D( depthSampler, coord ).x;\\n\\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\\n\\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\\n}\\n\\nvoid main() {\\n\\tfloat alpha = texture2D( tDiffuse, vUv ).a;\\n\\tfloat depth = readDepth( tDepth, vUv );\\n\\n\\tgl_FragColor.rgb = vec3( depth );\\n\\tgl_FragColor.a = alpha;\\n}\"","import {\n\tWebGLRenderTarget,\n\tCamera,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tScene,\n\tShaderMaterial,\n\tTexture,\n\tPlaneGeometry,\n\tMesh,\n} from 'three';\nimport VERTEX from './depthRead/DepthRead.vert.glsl';\nimport FRAGMENT from './depthRead/DepthRead.frag.glsl';\n\nexport interface DepthReadMaterial extends ShaderMaterial {\n\tunifoms: {\n\t\tcameraNear: {value: number};\n\t\tcameraFar: {value: number};\n\t\ttDiffuse: {value: Texture | null};\n\t\ttDepth: {value: Texture | null};\n\t};\n}\nexport interface DepthSetup {\n\tscene: Scene;\n\tcamera: OrthographicCamera;\n\tmaterial: DepthReadMaterial;\n}\n\nexport function setupDepthReadScene(): DepthSetup {\n\t// Setup post processing stage\n\tconst camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\tconst material = new ShaderMaterial({\n\t\tvertexShader: VERTEX,\n\t\tfragmentShader: FRAGMENT,\n\t\tuniforms: {\n\t\t\tcameraNear: {value: camera.near},\n\t\t\tcameraFar: {value: camera.far},\n\t\t\ttDiffuse: {value: null},\n\t\t\ttDepth: {value: null},\n\t\t},\n\t}) as DepthReadMaterial;\n\tconst postPlane = new PlaneGeometry(2, 2);\n\tconst postQuad = new Mesh(postPlane, material);\n\tconst scene = new Scene();\n\tscene.add(postQuad);\n\n\treturn {scene, camera, material};\n}\nexport function updateDepthSetup(setup: DepthSetup, camera: Camera, renderTarget: WebGLRenderTarget) {\n\tif ((camera as PerspectiveCamera).isPerspectiveCamera || (camera as OrthographicCamera).isOrthographicCamera) {\n\t\tsetup.material.uniforms.cameraNear.value = (camera as PerspectiveCamera | OrthographicCamera).near;\n\t\tsetup.material.uniforms.cameraFar.value = (camera as PerspectiveCamera | OrthographicCamera).far;\n\t\tsetup.material.uniforms.tDiffuse.value = renderTarget.texture;\n\t\tsetup.material.uniforms.tDepth.value = renderTarget.depthTexture;\n\t} else {\n\t\tconsole.warn('camera is not a PerspectiveCamera or OrthographicCamera');\n\t}\n}\n","import {\n\tObject3D,\n\tMaterial,\n\tVector2,\n\tVector4,\n\tCamera,\n\tWebGLRenderTarget,\n\tNearestFilter,\n\tRGBAFormat,\n\tFloatType,\n\tWebGLRenderer,\n\tScene,\n\tNoToneMapping,\n\tNoColorSpace,\n\tColor,\n\tColorSpace,\n\tToneMapping,\n\tDepthTexture,\n\tUnsignedInt248Type,\n} from 'three';\nimport {coreGetDefaultCamera} from './CoreGetDefautCamera';\nimport {PolyScene} from '../../../../src/engine/scene/PolyScene';\nimport {setupDepthReadScene, updateDepthSetup} from './DepthRead';\n\nexport function coreCursorToUv(cursor: Vector2, target: Vector2) {\n\ttarget.x = 0.5 * (cursor.x + 1);\n\ttarget.y = 0.5 * (1 - cursor.y);\n}\n\ninterface Object3DRestoreContext {\n\tparent: Object3D | null;\n}\n\ninterface RendererRestoreContext {\n\ttoneMapping: ToneMapping;\n\toutputColorSpace: ColorSpace;\n}\ninterface RestoreContext {\n\tobject: Object3DRestoreContext;\n\trenderer: RendererRestoreContext;\n}\nfunction _createDepthTexture() {\n\tconst texture = new DepthTexture(1, 1);\n\ttexture.type = UnsignedInt248Type;\n\treturn texture;\n}\n\nexport class RenderPixelController {\n\t// Note for this to work on iOS:\n\t// The materials used for picking should have their transparency OFF.\n\t// This could potentially be done automatically by traversing the scene first.\n\tprivate _colorWriteRenderTarget: WebGLRenderTarget = new WebGLRenderTarget(1, 1, {\n\t\tminFilter: NearestFilter,\n\t\tmagFilter: NearestFilter,\n\t\tformat: RGBAFormat,\n\t\ttype: FloatType,\n\t\tcolorSpace: NoColorSpace,\n\t\tdepthTexture: _createDepthTexture(),\n\t});\n\tprivate _depthReadRenderTarget: WebGLRenderTarget = new WebGLRenderTarget(1, 1, {\n\t\tminFilter: NearestFilter,\n\t\tmagFilter: NearestFilter,\n\t\tformat: RGBAFormat,\n\t\ttype: FloatType,\n\t\tcolorSpace: NoColorSpace,\n\t});\n\tprivate _renderScene = new Scene();\n\tprivate _depthReadSetup = setupDepthReadScene();\n\tprivate _restoreContext: RestoreContext = {\n\t\tobject: {\n\t\t\tparent: null,\n\t\t},\n\t\t// scene: {\n\t\t// \toverrideMaterial: null,\n\t\t// },\n\t\trenderer: {\n\t\t\ttoneMapping: NoToneMapping,\n\t\t\toutputColorSpace: NoColorSpace,\n\t\t},\n\t};\n\tprivate _read = new Float32Array(4);\n\n\trenderColor(\n\t\tscene: PolyScene,\n\t\tobject3D: Object3D,\n\t\tmaterial: Material | null,\n\t\tcamera: Camera,\n\t\tbackgroundColor: Color | null,\n\t\tuv: Vector2,\n\t\ttarget: Vector4\n\t): Vector4 {\n\t\tthis._doRender(scene, object3D, camera, material, backgroundColor, uv, target, false);\n\n\t\treturn target;\n\t}\n\trenderDepth(\n\t\tscene: PolyScene,\n\t\tobject3D: Object3D,\n\t\tcamera: Camera,\n\t\tbackgroundColor: Color | null,\n\t\tuv: Vector2,\n\t\ttarget: Vector4\n\t): Vector4 {\n\t\tthis._doRender(scene, object3D, camera, null, backgroundColor, uv, target, true);\n\n\t\treturn target;\n\t}\n\tprivate _doRender(\n\t\tscene: PolyScene,\n\t\tobject3D: Object3D,\n\t\tcamera: Camera,\n\t\tmaterial: Material | null,\n\t\tbackgroundColor: Color | null,\n\t\tuv: Vector2,\n\t\ttarget: Vector4,\n\t\trenderDepth: boolean\n\t) {\n\t\tconst renderer = scene.renderersRegister.lastRegisteredRenderer();\n\t\tif (!renderer) {\n\t\t\treturn target;\n\t\t}\n\t\tif (!(renderer instanceof WebGLRenderer)) {\n\t\t\tconsole.log('renderPixel: renderer found is not WebGLRenderer');\n\t\t\treturn target;\n\t\t}\n\t\tif (camera == null) {\n\t\t\tcamera = coreGetDefaultCamera(scene);\n\t\t}\n\n\t\tthis._prepare(object3D, material, backgroundColor, renderer);\n\t\tthis._render(uv, camera, renderer, target, renderDepth);\n\t\tthis._restore(object3D, renderer);\n\n\t\treturn target;\n\t}\n\n\tprivate _prepare(\n\t\tobject3D: Object3D,\n\t\tmaterial: Material | null,\n\t\tbackgroundColor: Color | null,\n\t\trenderer: WebGLRenderer\n\t) {\n\t\t// save context\n\t\tthis._restoreContext.renderer.outputColorSpace = renderer.outputColorSpace;\n\t\tthis._restoreContext.renderer.toneMapping = renderer.toneMapping;\n\t\tthis._restoreContext.object.parent = object3D.parent;\n\n\t\t// set context\n\t\tthis._renderScene.background = backgroundColor;\n\t\tthis._renderScene.overrideMaterial = material || null;\n\t\tthis._renderScene.attach(object3D);\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.outputColorSpace = NoColorSpace;\n\t}\n\tprivate _render(uv: Vector2, camera: Camera, renderer: WebGLRenderer, target: Vector4, readDepth: boolean) {\n\t\t(camera as any).setViewOffset(\n\t\t\trenderer.domElement.width,\n\t\t\trenderer.domElement.height,\n\t\t\tuv.x * renderer.domElement.width,\n\t\t\tuv.y * renderer.domElement.height,\n\t\t\t1,\n\t\t\t1\n\t\t);\n\n\t\trenderer.setRenderTarget(this._colorWriteRenderTarget);\n\t\trenderer.clear();\n\t\trenderer.render(this._renderScene, camera);\n\n\t\tif (readDepth) {\n\t\t\t// read depth\n\t\t\tupdateDepthSetup(this._depthReadSetup, camera, this._colorWriteRenderTarget);\n\t\t\trenderer.setRenderTarget(this._depthReadRenderTarget);\n\t\t\trenderer.render(this._depthReadSetup.scene, this._depthReadSetup.camera);\n\t\t\trenderer.readRenderTargetPixels(this._depthReadRenderTarget, 0, 0, 1, 1, this._read);\n\t\t} else {\n\t\t\t// There are some cases where .readRenderTargetPixels is slow,\n\t\t\t// and this seems to be due to the calls to _gl.getParameters.\n\t\t\t// Here we are bypassing it.\n\t\t\t// Note: this attempt to bypass needs \"properties\", which is internal to WebGLRenderer.\n\t\t\t// const context = renderer.getContext();\n\t\t\t// const textureFormat = context.RGBA; // RGBAFormat see three/WebGLUtils.js\n\t\t\t// const textureType = context.FLOAT; // FloatType see three/WebGLUtils.js\n\t\t\t// context.readPixels(0, 0, 1, 1, textureFormat, textureType, this._read);\n\t\t\trenderer.readRenderTargetPixels(this._colorWriteRenderTarget, 0, 0, 1, 1, this._read);\n\t\t}\n\n\t\trenderer.setRenderTarget(null);\n\t\t(camera as any).clearViewOffset();\n\n\t\t// read buffer into target vector\n\t\ttarget.fromArray(this._read);\n\t}\n\tprivate _restore(object3D: Object3D, renderer: WebGLRenderer) {\n\t\trenderer.outputColorSpace = this._restoreContext.renderer.outputColorSpace;\n\t\trenderer.toneMapping = this._restoreContext.renderer.toneMapping;\n\t\tthis._restoreContext.object.parent?.attach(object3D);\n\t}\n}\n","export enum MapboxCameraAttribute {\n\tSTYLE = 'mapbox-camera-attrib-style',\n\tLONGITUDE = 'mapbox-camera-attrib-longitude',\n\tLATITUDE = 'mapbox-camera-attrib-latitude',\n\tZOOM = 'mapbox-camera-attrib-zoom',\n\tMIN_ZOOM = 'mapbox-camera-attrib-minZoom',\n\tMAX_ZOOM = 'mapbox-camera-attrib-maxZoom',\n\tPITCH = 'mapbox-camera-attrib-pitch',\n\tBEARING = 'mapbox-camera-attrib-bearing',\n\tALLOW_DRAG_ROTATE = 'mapbox-camera-attrib-allowDragRotate',\n\tADD_ZOOM_CONTROL = 'mapbox-camera-attrib-addZoomControl',\n\tLAYER_BUILDINGS = 'mapbox-camera-attrib-tlayerBuildings',\n\tLAYER_3D = 'mapbox-camera-attrib-tlayer3D',\n\tLAYER_SKY = 'mapbox-camera-attrib-tlayerSky',\n}\n","import {CoreMapboxTransform} from '../Transform';\nimport {\n\t// Mesh,\n\tCamera,\n\tMatrix4,\n\tScene,\n\tVector3,\n\tWebGLRenderer,\n\tMatrix4Tuple,\n\t// Vector2,\n\t// PlaneGeometry,\n} from 'three';\nimport mapboxgl from 'mapbox-gl';\nimport {PolyScene} from '../../../../engine/scene/PolyScene';\nimport {MapboxViewer} from '../../../../engine/viewers/Mapbox';\n// import {TIME_CONTROLLER_UPDATE_TIME_OPTIONS_DEFAULT} from '../../../../engine/scene/utils/TimeController';\n// import {CoreCameraCSSRendererController, CSSRendererConfig} from '../../../camera/CoreCameraCSSRendererController';\nimport {LngLat} from '../Common';\n\nconst ID = 'threejs_layer';\nexport type ThreejsLayerRenderFunc = (renderer: WebGLRenderer) => void;\n\nexport interface ThreejsLayerOptions {\n\tmap: mapboxgl.Map;\n\tscene: PolyScene;\n\tcamera: Camera;\n\tcanvas: HTMLCanvasElement;\n\tlngLat: LngLat;\n\tviewer: MapboxViewer;\n\trenderFunc: ThreejsLayerRenderFunc;\n}\n\nexport class ThreejsLayer {\n\tpublic readonly id: string = ID;\n\tpublic readonly type: 'custom' = 'custom';\n\tpublic readonly renderingMode: '3d' = '3d'; // 2d or 3d, the threejs will be either as an overlay or intersecting with buildings\n\tprivate _renderer: WebGLRenderer | undefined;\n\tprivate _displayScene: Scene;\n\tprivate _map: mapboxgl.Map;\n\tprivate _viewer: MapboxViewer;\n\t// private _gl: WebGLRenderingContext | undefined;\n\tprivate _renderFunc: ThreejsLayerRenderFunc;\n\t// private _renderCSSFunc: RenderFunc | undefined;\n\t// private _cssRendererConfig: CSSRendererConfig | undefined;\n\n\tprivate _camera: Camera;\n\t// private _scene: PolyScene;\n\t// private _canvas: HTMLCanvasElement;\n\tprivate _lngLat: LngLat;\n\tconstructor(options: ThreejsLayerOptions) {\n\t\tthis._map = options.map;\n\t\tthis._camera = options.camera;\n\t\t// this._scene = options.scene;\n\t\t// this._canvas = options.canvas;\n\t\tthis._lngLat = options.lngLat;\n\t\tthis._displayScene = options.scene.threejsScene();\n\t\tthis._renderFunc = options.renderFunc;\n\t\tthis._viewer = options.viewer;\n\t}\n\n\tonAdd(map: mapboxgl.Map, gl: WebGLRenderingContext) {\n\t\t// this._map = map;\n\t\t// this._gl = gl;\n\t\t// console.log(this._gl);\n\t\tthis.createRenderer(gl);\n\t}\n\t// onRemove() {\n\t// \tthis._renderer?.dispose();\n\t// }\n\tprivate createRenderer(gl: WebGLRenderingContext) {\n\t\t// if (this._renderer != null) {\n\t\t// \tthis._renderer.dispose();\n\t\t// }\n\t\t// if (!this._map) {\n\t\t// \tconsole.error('no map given');\n\t\t// \treturn;\n\t\t// }\n\t\t// if (!this._gl) {\n\t\t// \tconsole.error('no gl context given');\n\t\t// \treturn;\n\t\t// }\n\t\tthis._renderer = new WebGLRenderer({\n\t\t\t// alpha: true\n\t\t\tantialias: true,\n\t\t\tcanvas: this._map.getCanvas(),\n\t\t\tcontext: gl,\n\t\t});\n\t\tthis._viewer.setRenderer(this._renderer);\n\n\t\tthis._renderer.autoClear = false;\n\t\tthis._renderer.shadowMap.enabled = true;\n\n\t\t// this._cssRendererConfig = CoreCameraCSSRendererController.cssRendererConfig({\n\t\t// \tscene: this._scene,\n\t\t// \tcamera: this._camera,\n\t\t// \tcanvas: this._canvas,\n\t\t// });\n\t\t// const cssRendererNode = this._cssRendererConfig?.cssRendererNode;\n\t\t// if (cssRendererNode) {\n\t\t// \tcssRendererNode.mountRenderer(this._canvas);\n\t\t// }\n\t\t// const cssRenderer = this._cssRendererConfig?.cssRenderer;\n\t\t// if (cssRenderer) {\n\t\t// \tcssRenderer.domElement.style.zIndex = '99999';\n\t\t// }\n\t\t// this._renderCSSFunc = cssRenderer ? () => cssRenderer.render(this._displayScene, this._camera) : undefined;\n\n\t\t// this._hack();\n\t}\n\n\t// resize(size: Vector2) {\n\t// \t// TODO: resize is currently broken.\n\t// \t// re-creating a renderer is the only way I found to reliably resize.\n\t// \t// It seems that if I only resize,\n\t// \t// the render will appear to be the right size (as in no antialiasing issue)\n\t// \t// but 3d object end up slipping on the map (as opposed to staying anchored where they are expected to)\n\t// \tthis.createRenderer();\n\t// \t// this._renderer?.setSize(size.x, size.y);\n\t// \t// this._cssRendererConfig?.cssRenderer.setSize(size.x, size.y);\n\t// }\n\n\tasync render(gl: WebGLRenderingContext, matrix: number[]) {\n\t\t// if (!this._renderer || !this._map) {\n\t\t// \tconsole.warn('no renderer');\n\t\t// \treturn;\n\t\t// }\n\t\tif (!this._renderer) {\n\t\t\tconsole.warn('no renderer');\n\t\t\treturn;\n\t\t}\n\n\t\tlet previousBackground = this._displayScene.background;\n\t\tif (this._displayScene.background) {\n\t\t\t// console.warn('scene background is not null, this will cover the map and prevent it from being seen');\n\t\t\tthis._displayScene.background = null;\n\t\t}\n\n\t\t// this._scene.timeController.updateClockDelta();\n\t\t// this._scene.timeController.incrementTimeIfPlaying(TIME_CONTROLLER_UPDATE_TIME_OPTIONS_DEFAULT);\n\t\t// const delta = this._scene.timeController.updateClockDelta();\n\n\t\tthis._updateCameraMatrix(matrix);\n\n\t\t// this._renderer.state.reset();\n\t\tthis._renderer.resetState();\n\n\t\tthis._renderFunc(this._renderer);\n\t\t// const delta = this._scene.timeController.updateClockDelta();\n\t\t// this._runOnBeforeTickCallbacks(delta);\n\t\t// this.scene().update(delta);\n\t\t// this._runOnAfterTickCallbacks(delta);\n\t\t// // this._markerTrackingConfig?.renderFunction();\n\t\t// this.render(delta);\n\t\t// this._renderer.render(this._displayScene, this._camera);\n\t\tthis._map.triggerRepaint();\n\n\t\tthis._displayScene.background = previousBackground;\n\n\t\t// if (this._renderCSSFunc) {\n\t\t// \tthis._renderCSSFunc();\n\t\t// }\n\t}\n\n\t// from https://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/\n\t// this now rotates objects correctly\n\tprivate _vX = new Vector3(1, 0, 0);\n\tprivate _vY = new Vector3(0, 1, 0);\n\tprivate _vZ = new Vector3(0, 0, 1);\n\tprivate mRX = new Matrix4();\n\tprivate mRY = new Matrix4();\n\tprivate mRZ = new Matrix4();\n\tprivate s = new Vector3();\n\tprivate m = new Matrix4();\n\tprivate l = new Matrix4();\n\t_updateCameraMatrix(matrix: number[]) {\n\t\t// const lng_lat = this._viewer.cameraLngLat();\n\t\t// if (!lng_lat) {\n\t\t// \treturn;\n\t\t// }\n\t\tconst mercator = mapboxgl.MercatorCoordinate.fromLngLat([this._lngLat.lng, this._lngLat.lat], 0);\n\t\tconst transform = {\n\t\t\tposition: mercator,\n\t\t\trotation: {x: Math.PI / 2, y: 0, z: 0},\n\t\t\tscale: CoreMapboxTransform.WORLD_SCALE,\n\t\t};\n\n\t\tthis.mRX.identity();\n\t\tthis.mRY.identity();\n\t\tthis.mRZ.identity();\n\t\tconst rotationX = this.mRX.makeRotationAxis(this._vX, transform.rotation.x);\n\t\tconst rotationY = this.mRY.makeRotationAxis(this._vY, transform.rotation.y);\n\t\tconst rotationZ = this.mRZ.makeRotationAxis(this._vZ, transform.rotation.z);\n\n\t\tthis.s.x = transform.scale;\n\t\tthis.s.y = -transform.scale;\n\t\tthis.s.z = transform.scale;\n\t\tthis.m.fromArray(matrix);\n\t\tthis.l.identity();\n\t\tthis.l\n\t\t\t.makeTranslation(1 * transform.position.x, 1 * transform.position.y, 1 * (transform.position.z || 0))\n\t\t\t.scale(this.s)\n\t\t\t.multiply(rotationX)\n\t\t\t.multiply(rotationY)\n\t\t\t.multiply(rotationZ);\n\n\t\tthis._camera.projectionMatrix.elements = matrix as Matrix4Tuple;\n\t\tthis._camera.projectionMatrix = this.m.multiply(this.l);\n\t}\n\n\t// This is a very dirty hack that seems to allow objects to render properly.\n\t// If this was not called,\n\t// all objects created would render for a couple frames and then disappear.\n\t// There sometimes would be an WebGL warning along the lines of \"buffer not large enough\"\n\t// but it is completely unclear what could have caused it.\n\t//\n\t// What I tried to debug this:\n\t//\n\t// - upgrade from mapbox 1 to 2\n\t// this made no difference\n\t//\n\t// - using Babylon Spector\n\t// but I was unable to isolate which call was problematic\n\t//\n\t// - fiddle with renderes options\n\t// that solved nothing\n\t//\n\t// - integrate the mapbox example as a layer instead of this one\n\t// When using the example layer and its included THREE.Scene,\n\t// it renders just fine.\n\t// But as soon as I replace the included scene with the one created by Polygonjs,\n\t// Then the problem reappears.\n\t// That's even if the scene is as simple as a Hemisphere Light and a Plane.\n\t// So that did not allow me to find a solution.\n\t//\n\t// - use src/debug.js (I forgot now where I copied it from)\n\t// to help find bad webgl calls.\n\t// but that didn't help.\n\t//\n\t// - setting Polygonjs scene's objects to\n\t// matrixAutoUpdate = true\n\t// or\n\t// frustumCulled = false\n\t// But that solved nothing.\n\t//\n\t// In short.... WFT?!?!\n\t// But for now, with this hack, it seems to work fine.\n\t// private _hack() {\n\t// \tconst hackObject = new Mesh(new PlaneGeometry());\n\t// \thackObject.frustumCulled = false;\n\t// \thackObject.position.z = -1000;\n\t// \thackObject.scale.set(0.01, 0.01, 0.01);\n\t// \tconst scene = this._scene.threejsScene();\n\t// \tscene.add(hackObject);\n\t// }\n}\n","import type {AnyLayer} from 'mapbox-gl';\n\nexport const BuildingsLayer: AnyLayer = {\n\tid: '3d-buildings',\n\tsource: 'composite',\n\t'source-layer': 'building',\n\tfilter: ['==', 'extrude', 'true'],\n\ttype: 'fill-extrusion',\n\tminzoom: 15,\n\tpaint: {\n\t\t'fill-extrusion-color': '#aaa',\n\n\t\t// use an 'interpolate' expression to add a smooth transition effect to the\n\t\t// buildings as the user zooms in\n\t\t'fill-extrusion-height': ['interpolate', ['linear'], ['zoom'], 15, 0, 15.05, ['get', 'height']],\n\t\t'fill-extrusion-base': ['interpolate', ['linear'], ['zoom'], 15, 0, 15.05, ['get', 'min_height']],\n\t\t'fill-extrusion-opacity': 0.6,\n\t},\n};\n","import mapboxgl from 'mapbox-gl';\nimport {ThreejsLayer, ThreejsLayerOptions, ThreejsLayerRenderFunc} from './layers/MapboxThreejsLayer';\nimport {BuildingsLayer} from './layers/Buildings';\nimport {\n\t// Vector2,\n\tScene,\n\tCamera,\n} from 'three';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {LngLat} from './Common';\nimport {MapboxViewer} from '../../../engine/viewers/Mapbox';\n\nexport interface LayersOptions {\n\tmap: mapboxgl.Map;\n\tscene: PolyScene;\n\tcamera: Camera;\n\tdisplayScene: Scene;\n\tlngLat: LngLat;\n\trenderFunc: ThreejsLayerRenderFunc;\n\tviewer: MapboxViewer;\n\tzoomControls: boolean;\n\tlayer3D: boolean;\n\tlayerBuildings: boolean;\n\tlayerSky: boolean;\n}\n\nexport class MapboxLayersController {\n\tpublic _threejsLayer: ThreejsLayer | undefined;\n\tconstructor(private _options: LayersOptions) {}\n\n\taddLayers() {\n\t\t// if (!this._viewer.mapLoaded()) {\n\t\t// \tconsole.warn('map not loaded');\n\t\t// \treturn;\n\t\t// }\n\t\t// const map = this._viewer.map();\n\t\t// if (!map) {\n\t\t// \tconsole.warn('no map found');\n\t\t// \treturn;\n\t\t// }\n\n\t\tconst current_style = this._options.map.getStyle();\n\t\tconst layers = current_style.layers;\n\t\tif (!layers) {\n\t\t\tconsole.warn('no layers found');\n\t\t\treturn;\n\t\t}\n\n\t\tlet label_layer_id = null;\n\t\tfor (const layer of layers) {\n\t\t\tif (layer.type == 'symbol' && (layer.layout as mapboxgl.SymbolLayout)['text-field']) {\n\t\t\t\tlabel_layer_id = layer.id;\n\t\t\t}\n\t\t}\n\t\t// const cameraNode = this._viewer.cameraNode();\n\n\t\tif (label_layer_id != null) {\n\t\t\tthis._addLayerBuildings(label_layer_id);\n\t\t\tthis._addLayerThreejs(label_layer_id);\n\t\t}\n\n\t\tthis._addLayer3D();\n\t\tthis._addLayerSky();\n\t\tthis._addZoomControls();\n\t}\n\t// resize(size: Vector2) {\n\t// \tthis._threejsLayer?.resize(size);\n\t// }\n\tprivate _addZoomControls() {\n\t\tif (!this._options.zoomControls) {\n\t\t\treturn;\n\t\t}\n\t\t// let nav_control = this._controls_by_container_id.get(container_id);\n\t\t// if (nav_control) {\n\t\t// \tif (!isBooleanTrue(this.pv.addZoomControl)) {\n\t\t// \t\tmap.removeControl(nav_control);\n\t\t// \t\tthis._controls_by_container_id.delete(container_id);\n\t\t// \t}\n\t\t// } else {\n\t\t// \tif (isBooleanTrue(this.pv.addZoomControl)) {\n\t\tconst navControl = new mapboxgl.NavigationControl();\n\t\tthis._options.map.addControl(navControl, 'bottom-right');\n\t\t// this._controls_by_container_id.set(container_id, nav_control);\n\t\t// }\n\t\t// }\n\t}\n\tprotected _addLayer3D() {\n\t\tif (!this._options.layer3D) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._options.displayScene.background != null) {\n\t\t\tconsole.warn(\n\t\t\t\t'the scene has the background set, which may prevent the layers from displaying correctly. Make sure to remove the background.'\n\t\t\t);\n\t\t}\n\n\t\tthis._options.map.addSource('mapbox-dem', {\n\t\t\ttype: 'raster-dem',\n\t\t\turl: 'mapbox://mapbox.mapbox-terrain-dem-v1',\n\t\t\ttileSize: 512,\n\t\t\tmaxzoom: 14,\n\t\t});\n\t\t// add the DEM source as a terrain layer with exaggerated height\n\t\tthis._options.map.setTerrain({source: 'mapbox-dem', exaggeration: 1.5});\n\t}\n\tprivate _addLayerSky() {\n\t\tif (!this._options.layerSky) {\n\t\t\treturn;\n\t\t}\n\t\t// add a sky layer that will show when the map is highly pitched\n\t\tthis._options.map.addLayer({\n\t\t\tid: 'sky',\n\t\t\ttype: 'sky',\n\t\t\tpaint: {\n\t\t\t\t'sky-type': 'atmosphere',\n\t\t\t\t'sky-atmosphere-sun': [0.0, 0.0],\n\t\t\t\t'sky-atmosphere-sun-intensity': 15,\n\t\t\t},\n\t\t});\n\t}\n\tprivate _addLayerBuildings(label_layer_id: string) {\n\t\tif (!this._options.layerBuildings) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._hasLayerId(BuildingsLayer.id)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._options.map.addLayer(BuildingsLayer, label_layer_id);\n\t}\n\n\tprotected _addLayerThreejs(label_layer_id: string) {\n\t\tconst options: ThreejsLayerOptions = {\n\t\t\tmap: this._options.map,\n\t\t\tscene: this._options.scene,\n\t\t\tcamera: this._options.camera,\n\t\t\tcanvas: this._options.map.getCanvas(),\n\t\t\tlngLat: this._options.lngLat,\n\t\t\trenderFunc: this._options.renderFunc,\n\t\t\tviewer: this._options.viewer,\n\t\t};\n\t\tthis._threejsLayer = new ThreejsLayer(options);\n\t\tthis._options.map.addLayer(this._threejsLayer, label_layer_id);\n\t\t// const threejsScene = camera_node.scene().threejsScene();\n\t\t// const layer = Threejs3LayerBuilder(threejsScene);\n\t\t// map.addLayer(layer, label_layer_id);\n\t}\n\tprivate _hasLayerId(layer_id: string): boolean {\n\t\tconst current_style = this._options.map.getStyle();\n\t\tconst layer_ids = current_style.layers?.map((l) => l.id) || [];\n\t\treturn layer_ids.includes(layer_id);\n\t}\n}\n","import mapboxgl from 'mapbox-gl';\nimport {Camera} from 'three';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {MapboxCameraAttribute} from './MapboxCameraAttribute';\nimport {MapboxLayersController, LayersOptions} from './LayersController';\nimport {ThreejsLayerRenderFunc} from './layers/MapboxThreejsLayer';\nimport {MapboxViewer} from '../../../engine/viewers/Mapbox';\n// import {NodeContext} from '../../../engine/poly/NodeContext';\nimport {JsType} from '../../../engine/poly/registers/nodes/types/Js';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\ninterface CreateMapboxMapOptions {\n\tcamera: Camera;\n\tcontainer: HTMLElement;\n\tscene: PolyScene;\n\trenderFunc: ThreejsLayerRenderFunc;\n\tviewer: MapboxViewer;\n}\ntype MapRegisterCallback = (value: mapboxgl.Map) => void;\n\n// const CAMERA_MOVE_EVENT: Event = {\n// \ttype: 'cameraMove',\n// };\n\nclass MapboxMapsControllerClass {\n\tprivate static _instance: MapboxMapsControllerClass;\n\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new MapboxMapsControllerClass());\n\t}\n\tprivate constructor() {}\n\n\tprivate _scene: PolyScene | undefined;\n\tprivate _mapByCameraName: Map<string, mapboxgl.Map> = new Map();\n\tprivate _lastCreatedMap: mapboxgl.Map | undefined;\n\tprivate _resolves: MapRegisterCallback[] = [];\n\tasync waitForMap(): Promise<mapboxgl.Map> {\n\t\tif (this._lastCreatedMap) {\n\t\t\treturn this._lastCreatedMap;\n\t\t} else {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis._resolves.push(resolve);\n\t\t\t});\n\t\t}\n\t}\n\tprivate _styleFlushed = false;\n\tprivate _flushCallbacksWithMap(map: mapboxgl.Map) {\n\t\tif (this._styleFlushed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._styleFlushed = true;\n\t\tconst callbacks: MapRegisterCallback[] = [...this._resolves];\n\t\tthis._resolves.length = 0;\n\t\tfor (const c of callbacks) {\n\t\t\tc(map);\n\t\t}\n\t}\n\n\tcreateMap(options: CreateMapboxMapOptions) {\n\t\tconst {camera, container, scene, renderFunc, viewer} = options;\n\t\tthis._scene = scene;\n\t\tconst coreObjectClass = coreObjectClassFactory(camera);\n\t\tconst style = coreObjectClass.attribValue(camera, MapboxCameraAttribute.STYLE) as string;\n\t\tconst longitude = coreObjectClass.attribValue(camera, MapboxCameraAttribute.LONGITUDE) as number;\n\t\tconst latitude = coreObjectClass.attribValue(camera, MapboxCameraAttribute.LATITUDE) as number;\n\t\tconst zoom = coreObjectClass.attribValue(camera, MapboxCameraAttribute.ZOOM) as number;\n\t\tconst minZoom = coreObjectClass.attribValue(camera, MapboxCameraAttribute.MIN_ZOOM) as number;\n\t\tconst maxZoom = coreObjectClass.attribValue(camera, MapboxCameraAttribute.MAX_ZOOM) as number;\n\t\tconst pitch = coreObjectClass.attribValue(camera, MapboxCameraAttribute.PITCH) as number;\n\t\tconst bearing = coreObjectClass.attribValue(camera, MapboxCameraAttribute.BEARING) as number;\n\n\t\tconst allowDragRotate = coreObjectClass.attribValue(camera, MapboxCameraAttribute.ALLOW_DRAG_ROTATE) as boolean;\n\t\tconst addZoomControl = coreObjectClass.attribValue(camera, MapboxCameraAttribute.ADD_ZOOM_CONTROL) as boolean;\n\t\tconst tlayerBuildings = coreObjectClass.attribValue(camera, MapboxCameraAttribute.LAYER_BUILDINGS) as boolean;\n\t\tconst tlayer3D = coreObjectClass.attribValue(camera, MapboxCameraAttribute.LAYER_3D) as boolean;\n\t\tconst tlayerSky = coreObjectClass.attribValue(camera, MapboxCameraAttribute.LAYER_SKY) as boolean;\n\n\t\tconst mapOptions: mapboxgl.MapboxOptions = {\n\t\t\tstyle,\n\t\t\tcontainer,\n\t\t\tcenter: [longitude, latitude],\n\t\t\tzoom,\n\t\t\tminZoom,\n\t\t\tmaxZoom,\n\t\t\tpitch,\n\t\t\tbearing,\n\t\t\t// preserveDrawingBuffer: true,\n\t\t\tdragRotate: allowDragRotate,\n\t\t\tpitchWithRotate: allowDragRotate,\n\t\t\tantialias: true,\n\t\t\tinteractive: true,\n\t\t\t// useWebGL2: true,\n\t\t};\n\t\t// webgl2 required since three 150 addition of textureLod in common.glsl\n\t\t(mapOptions as any).useWebGL2 = true;\n\t\tconst map = new mapboxgl.Map(mapOptions);\n\n\t\tconst layersOptions: LayersOptions = {\n\t\t\tmap,\n\t\t\tscene,\n\t\t\tcamera,\n\t\t\trenderFunc,\n\t\t\tviewer,\n\t\t\tlngLat: {\n\t\t\t\tlng: longitude,\n\t\t\t\tlat: latitude,\n\t\t\t},\n\t\t\tdisplayScene: scene.threejsScene(),\n\t\t\tzoomControls: addZoomControl,\n\t\t\tlayer3D: tlayer3D,\n\t\t\tlayerBuildings: tlayerBuildings,\n\t\t\tlayerSky: tlayerSky,\n\t\t};\n\t\tconst layersController = new MapboxLayersController(layersOptions);\n\t\tmap.on('load', () => {\n\t\t\tlayersController.addLayers();\n\t\t\t// this.mapboxEventController.camera_node_move_end(); // to update mapbox planes\n\t\t\tglobalThis.dispatchEvent(new Event('resize')); // helps making sure it is resized correctly\n\t\t});\n\n\t\tmap.on('styledata', () => {\n\t\t\t// console.log('A styledata event occurred.', map.isStyleLoaded());\n\t\t\tif (map.isStyleLoaded()) {\n\t\t\t\tif (!this._styleFlushed && this._lastCreatedMap) {\n\t\t\t\t\tthis._flushCallbacksWithMap(this._lastCreatedMap);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tmap.on('move', () => this._dispatchCameraMove(JsType.ON_MAPBOX_CAMERA_MOVE));\n\t\tmap.on('movestart', () => this._dispatchCameraMove(JsType.ON_MAPBOX_CAMERA_MOVE_START));\n\t\tmap.on('moveend', () => this._dispatchCameraMove(JsType.ON_MAPBOX_CAMERA_MOVE_END));\n\t\t// map.on('styledataloading', () => {\n\t\t// \tconsole.log('A styledataloading event occurred.', map.isStyleLoaded());\n\t\t// });\n\n\t\t// this._updateCameraAttributes();\n\t\t// this._addRemoveControls(map, container.id);\n\n\t\t// this._maps_by_container_id.set(container.id, map);\n\t\t// this._map_containers_by_container_id.set(container.id, container);\n\t\t// this._canvases_by_container_id.set(container.id, container.querySelector('canvas')!);\n\n\t\tthis._mapByCameraName.set(camera.name, map);\n\t\tthis._lastCreatedMap = map;\n\t\t// if (this._mapByCameraName.size == 1) {\n\t\t// \tthis._flushCallbacksWithMap(map);\n\t\t// }\n\n\t\treturn {map, layersController};\n\t}\n\tprivate _dispatchCameraMove(\n\t\ttype: JsType.ON_MAPBOX_CAMERA_MOVE | JsType.ON_MAPBOX_CAMERA_MOVE_START | JsType.ON_MAPBOX_CAMERA_MOVE_END\n\t) {\n\t\tif (!this._scene) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._scene.threejsScene().traverse((object) => {\n\t\t\tthis._scene?.actorsManager.triggerEventNodes(object, type);\n\t\t});\n\t}\n}\nexport const MapboxMapsController = MapboxMapsControllerClass.instance();\n","import {PerspectiveCamera} from 'three';\n\nexport class MapboxPerspectiveCamera extends PerspectiveCamera {}\n","export const MAPBOX_TILES_ROOT_URL = 'https://api.mapbox.com/v4';\n","import {Vector3, Matrix4, LinearInterpolant, Group, Object3D, BufferGeometry, Mesh, Box3} from 'three';\nimport {CoreGroup} from '../../geometry/Group';\nimport {CoreMapboxUtils} from './Utils';\nimport mapboxgl from 'mapbox-gl';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {LngLat} from './Common';\nimport {pointsFromObject} from '../../geometry/entities/point/CorePointUtils';\nimport { CorePoint } from '../../geometry/entities/point/CorePoint';\nimport { CoreObjectType } from '../../geometry/ObjectContent';\n\nconst dummyMesh = new Mesh();\nconst tmpBox = new Box3();\nconst tmpCenter = new Vector3();\nconst tmpSize = new Vector3();\nconst _position = new Vector3();\nconst _points:CorePoint<CoreObjectType>[]=[]\n\nconst MAT_RX = new Matrix4().makeRotationAxis(new Vector3(1, 0, 0), -Math.PI / 2);\nconst POSITION_ATTRIB_NAME = 'position';\n\nconst STEP_SIZE_BY_ZOOM: PolyDictionary<number> = {\n\t1: 1802297.1652004332,\n\t2: 901148.582600187,\n\t3: 450574.29129994207,\n\t4: 225287.14564998331,\n\t5: 112643.57282498456,\n\t6: 56321.78641249478,\n\t7: 28160.89320639847,\n\t8: 14080.446603198769,\n\t9: 7040.223301600898,\n\t10: 3520.1116506467515,\n\t11: 1760.0558254750213,\n\t12: 880.027912584861,\n\t13: 440.01395644506556,\n\t14: 220.00697807141114,\n\t15: 110.00348918733653,\n\t16: 55.0017445946869,\n\t17: 27.50087214470841,\n\t18: 13.750436073372839,\n\t19: 6.8752180371957365,\n\t20: 3.437609169195639,\n\t21: 1.7188044319627807,\n\t22: 0.8594022154866252,\n\t23: 0.42970126142608933,\n};\n\nexport class CoreMapboxTransform {\n\tstatic WORLD_SCALE = 5.41843220338983e-8;\n\n\tprivate pos_offset: [number, number] = [0, 0];\n\n\tsetLngLat(lngLat: LngLat) {\n\t\treturn (this.pos_offset = CoreMapboxUtils.fromLL(lngLat.lng, lngLat.lat));\n\t}\n\n\t// transform_geometry(geometry: BufferGeometry) {\n\t// \tconst max_ratio = this.geometry_bbox_ratio(geometry);\n\t// \tthis.transform_geometry_with_max_ratio(geometry, max_ratio);\n\t// }\n\n\ttransform_group2(group: Group) {\n\t\tconst coreGroup = new CoreGroup();\n\t\tcoreGroup.setAllObjects(group.children);\n\t\tcoreGroup.boundingBox(tmpBox);\n\t\ttmpBox.getCenter(tmpCenter);\n\t\ttmpBox.getSize(tmpSize);\n\n\t\tconst new_center = CoreMapboxUtils.fromLLv(tmpCenter);\n\t\tconst new_min = CoreMapboxUtils.fromLLv(tmpBox.min);\n\t\tconst new_max = CoreMapboxUtils.fromLLv(tmpBox.max);\n\n\t\tconst new_size = new_max /*().clone()*/\n\t\t\t.sub(new_min);\n\n\t\t// const tr_offset = center.clone().sub(new_center)\n\t\tconst s_offset = tmpSize /*.clone()*/\n\t\t\t.multiply(new_size);\n\t\ts_offset.x = Math.abs(s_offset.x);\n\t\ts_offset.z = Math.abs(s_offset.z);\n\t\ts_offset.y = 0.5 * (s_offset.x + s_offset.z);\n\n\t\tconst mat_tr = new Matrix4();\n\t\tconst mat_tr_reset = new Matrix4();\n\t\tconst mat_s = new Matrix4();\n\t\tmat_tr_reset.makeTranslation(-tmpCenter.x, -tmpCenter.y, -tmpCenter.z);\n\t\tmat_tr.makeTranslation(new_center.x - this.pos_offset[0], new_center.y, new_center.z - this.pos_offset[1]);\n\t\tmat_s.makeScale(s_offset.x, s_offset.y, s_offset.z);\n\n\t\tgroup.traverse((object) => {\n\t\t\tconst geometry = (object as Mesh).geometry as BufferGeometry;\n\n\t\t\tif (geometry) {\n\t\t\t\tgeometry.applyMatrix4(mat_tr_reset);\n\t\t\t\tgeometry.applyMatrix4(mat_s);\n\t\t\t\tgeometry.applyMatrix4(mat_tr);\n\t\t\t\t// this.transform_geometry_with_max_ratio(geometry, max_ratio)\n\n\t\t\t\tgeometry.applyMatrix4(MAT_RX);\n\t\t\t\tif (geometry.attributes.normal) {\n\t\t\t\t\tgeometry.computeVertexNormals();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\ttransform_groupGeometry_FINAL(object: Object3D) {\n\t\tthis.transform_group3(object);\n\t}\n\ttransform_groupObject_FINAL(object: Object3D) {\n\t\t// this.transform_group3(object);\n\t\tthis.transform_position_FINAL(object.position);\n\t\tobject.updateMatrix();\n\t}\n\ttransform_geometry_FINAL(geometry: BufferGeometry) {\n\t\tthis.transform_geometry3(geometry);\n\t}\n\ttransform_position_FINAL(position: Vector3): Vector3 {\n\t\treturn this.transform_position3(position);\n\t}\n\tuntransform_position_FINAL(position: Vector3): Vector3 {\n\t\treturn this.untransform_position3(position);\n\t}\n\n\ttransform_group3(group: Object3D) {\n\t\t// const max_ratio = this.group_bbox_ratio(group);\n\n\t\tgroup.traverse((object) => {\n\t\t\tconst geometry = (object as Mesh).geometry as BufferGeometry;\n\t\t\tif (geometry) {\n\t\t\t\tthis.transform_geometry_FINAL(geometry);\n\t\t\t}\n\t\t});\n\t}\n\n\ttransform_group(group: Group) {\n\t\tconst max_ratio = this.group_bbox_ratio(group);\n\n\t\tgroup.traverse((object) => {\n\t\t\tconst geometry = (object as Mesh).geometry as BufferGeometry;\n\t\t\tif (geometry) {\n\t\t\t\tthis.transform_geometry_with_max_ratio(geometry, max_ratio);\n\t\t\t}\n\t\t});\n\t}\n\t// transform_positions(positions: Vector3[]){\n\t// \tconst min = new Vector3(\n\t// \t\tArrayUtils.min(positions.map(v=>v.x)),\n\t// \t\tArrayUtils.min(positions.map(v=>v.y)),\n\t// \t\tArrayUtils.min(positions.map(v=>v.z))\n\t// \t)\n\t// \tconst max = new Vector3(\n\t// \t\tArrayUtils.max(positions.map(v=>v.x)),\n\t// \t\tArrayUtils.max(positions.map(v=>v.y)),\n\t// \t\tArrayUtils.max(positions.map(v=>v.z))\n\t// \t)\n\t// \tconst bbox = new Box3(min, max)\n\t// \tconst max_ratio = this.bbox_ratio(bbox)\n\t// \tpositions.forEach(position=>{\n\t// \t\tthis.transform_position_with_max_ratio(position, max_ratio)\n\t// \t})\n\t// }\n\tprivate transform_geometry3(geometry: BufferGeometry) {\n\t\tdummyMesh.geometry = geometry;\n\t\tpointsFromObject(dummyMesh,_points);\n\t\tfor (const point of _points) {\n\t\t\tpoint.position(_position);\n\t\t\tthis.transform_position_FINAL(_position);\n\t\t\tpoint.setAttribValue(POSITION_ATTRIB_NAME, _position);\n\t\t}\n\n\t\t// geometry.applyMatrix(MAT_RX);\n\t\t// geometry.computeVertexNormals(); // this messes up when transforming points\n\t}\n\n\tprivate transform_geometry_with_max_ratio(geometry: BufferGeometry, max_ratio: number) {\n\t\tdummyMesh.geometry = geometry;\n\t\tpointsFromObject(dummyMesh,_points);\n\t\tfor (const point of _points) {\n\t\t\tpoint.position(_position);\n\t\t\tthis.transform_position_with_max_ratio(_position, max_ratio);\n\t\t\tpoint.setAttribValue(POSITION_ATTRIB_NAME, _position);\n\t\t}\n\n\t\tgeometry.applyMatrix4(MAT_RX);\n\t\tif (geometry.attributes.normal) {\n\t\t\tgeometry.computeVertexNormals();\n\t\t}\n\t}\n\tprivate transform_position3(position: Vector3): Vector3 {\n\t\tconst lon = position.x;\n\t\tconst altitude = position.y;\n\t\tconst lat = position.z;\n\t\t// const pos = Utils.fromLL(lon, lat);\n\t\tconst mercator_pos = mapboxgl.MercatorCoordinate.fromLngLat([lon, lat], altitude);\n\t\tposition.x = mercator_pos.x - this.pos_offset[0];\n\t\tposition.y = mercator_pos.z || 0;\n\t\t// position.y *= -max_ratio;\n\t\tposition.z = mercator_pos.y - this.pos_offset[1];\n\n\t\tposition.divideScalar(CoreMapboxTransform.WORLD_SCALE);\n\t\treturn position;\n\t}\n\tprivate untransform_position3(position: Vector3): Vector3 {\n\t\tposition.multiplyScalar(CoreMapboxTransform.WORLD_SCALE);\n\n\t\tconst lon = position.x + this.pos_offset[0];\n\t\tconst altitude = position.y;\n\t\tconst lat = position.z + this.pos_offset[1];\n\t\t// const pos = Utils.fromLL(lon, lat);\n\t\tconst mercator = new mapboxgl.MercatorCoordinate(lon, lat, altitude);\n\t\tconst lng_lat_like = mercator.toLngLat();\n\t\tposition.x = lng_lat_like.lng;\n\t\tposition.y = altitude;\n\t\t// position.y *= -max_ratio;\n\t\tposition.z = lng_lat_like.lat;\n\n\t\treturn position;\n\t}\n\tprivate transform_position_with_max_ratio(position: Vector3, max_ratio: number) {\n\t\tconst lon = position.x;\n\t\tconst lat = position.z;\n\t\tconst pos = CoreMapboxUtils.fromLL(lon, lat);\n\t\tposition.x = pos[0] - this.pos_offset[0];\n\t\tposition.y *= -max_ratio;\n\t\tposition.z = pos[1] - this.pos_offset[1];\n\t}\n\n\tprivate group_bbox_ratio(group: Group): number {\n\t\tconst core_group = new CoreGroup();\n\t\tcore_group.setAllObjects(group.children);\n\t\tcore_group.boundingBox(tmpBox);\n\t\treturn this.bbox_ratio(tmpBox);\n\t}\n\t// private geometry_bbox_ratio(geometry: BufferGeometry): number {\n\t// \tgeometry.computeBoundingBox();\n\t// \treturn geometry.boundingBox;\n\t// }\n\n\tprivate bbox_ratio(bbox: Box3): number {\n\t\tconst new_bbox_min = CoreMapboxUtils.fromLL(bbox.min.x, bbox.min.z);\n\t\tconst new_bbox_max = CoreMapboxUtils.fromLL(bbox.max.x, bbox.max.z);\n\t\tconst new_bbox_size = [new_bbox_max[1] - new_bbox_min[1], new_bbox_max[0] - new_bbox_min[0]];\n\t\tconst old_bbox_size = [bbox.max.x - bbox.min.x, bbox.max.z - bbox.min.z];\n\t\tconst bbox_ratio = [new_bbox_size[0] / old_bbox_size[0], new_bbox_size[1] / old_bbox_size[1]];\n\t\treturn Math.max(bbox_ratio[0], bbox_ratio[1]);\n\t}\n\n\t//\n\t//\n\t// ZOOM INTERPOLANT\n\t//\n\t//\n\tprivate static _interpolant: LinearInterpolant | undefined;\n\tstatic _step_size_from_zoom_interpolant() {\n\t\treturn (this._interpolant = this._interpolant || this._create_step_size_from_zoom_interpolant());\n\t}\n\tstatic _create_step_size_from_zoom_interpolant() {\n\t\tconst positions = Object.keys(STEP_SIZE_BY_ZOOM)\n\t\t\t.map((p) => parseFloat(p))\n\t\t\t.sort();\n\t\tconst values = [];\n\t\tfor (const position of positions) {\n\t\t\tvalues.push(STEP_SIZE_BY_ZOOM[position]);\n\t\t}\n\n\t\tconst values_count = 1;\n\t\tconst interpolated_values = new Float32Array(values_count);\n\t\treturn new LinearInterpolant(positions, values, values_count, interpolated_values);\n\t}\n\tstatic step_size_from_zoom(zoom: number): number {\n\t\treturn this._step_size_from_zoom_interpolant().evaluate(zoom)[0];\n\t}\n}\n","const WORLD_SIZE = 512;\nconst MERCATOR_A = 6378137.0;\n\nexport const CoreMapboxConstants = {\n\tWORLD_SIZE: WORLD_SIZE,\n\tPROJECTION_WORLD_SIZE: WORLD_SIZE / (MERCATOR_A * Math.PI) / 2,\n\tMERCATOR_A: MERCATOR_A, // 900913 projection property\n\tDEG2RAD: Math.PI / 180,\n\tRAD2DEG: 180 / Math.PI,\n\tEARTH_CIRCUMFERENCE: 40075000,\n};\n","// THREE = require(\"../three97.js\"); # Modified version to use 64-bit double precision floats for matrix math\nimport {Vector3, Matrix4, Matrix4Tuple} from 'three';\nimport mapboxgl from 'mapbox-gl';\n\nimport {CoreMapboxConstants} from './Constants';\nimport {Number3} from '../../../types/GlobalTypes';\nconst Constants = CoreMapboxConstants;\n\nexport class CoreMapboxUtils {\n\tstatic verticalNearLngLatPoints(map: mapboxgl.Map) {\n\t\tconst canvas = map.getCanvas();\n\t\tconst x = canvas.clientWidth;\n\t\tconst y = canvas.clientHeight;\n\n\t\treturn [map.unproject([0, y]), map.unproject([x, y])];\n\t}\n\tstatic verticalFarLngLatPoints(map: mapboxgl.Map) {\n\t\tconst canvas = map.getCanvas();\n\t\tconst x = canvas.clientWidth;\n\t\tconst y = 0;\n\n\t\treturn [map.unproject([0, y]), map.unproject([x, y])];\n\t}\n\tstatic horizontalLngLatPoints(map: mapboxgl.Map) {\n\t\tconst canvas = map.getCanvas();\n\t\tconst y = canvas.clientHeight / 2;\n\t\treturn [map.unproject([0, y]), map.unproject([100, y])];\n\t}\n\n\tstatic makePerspectiveMatrix(fovy: number, aspect: number, near: number, far: number) {\n\t\tconst out = new Matrix4();\n\t\tconst f = 1.0 / Math.tan(fovy / 2);\n\t\tconst nf = 1 / (near - far);\n\n\t\tconst newMatrix: Matrix4Tuple = [\n\t\t\tf / aspect,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tf,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t(far + near) * nf,\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t2 * far * near * nf,\n\t\t\t0,\n\t\t];\n\n\t\tout.elements = newMatrix;\n\t\treturn out;\n\t}\n\n\t// #gimme radians\n\t// function radify(deg){\n\n\t//     if (typeof deg === 'object'){\n\t//         return deg.map(function(degree){\n\t//             return Math.PI*2*degree/360\n\t//         })\n\t//     }\n\n\t//     else return Math.PI*2*deg/360\n\t// }\n\n\t// #gimme degrees\n\t// function degreeify(rad){\n\t//     return 360*rad/(Math.PI*2)\n\t// }\n\n\tstatic projectToWorld(lnglat: Number3) {\n\t\t// Spherical mercator forward projection, re-scaling to WORLD_SIZE\n\t\tconst projected = [\n\t\t\t-Constants.MERCATOR_A * lnglat[0] * Constants.DEG2RAD * Constants.PROJECTION_WORLD_SIZE,\n\t\t\t-Constants.MERCATOR_A *\n\t\t\t\tMath.log(Math.tan(Math.PI * 0.25 + 0.5 * lnglat[1] * Constants.DEG2RAD)) *\n\t\t\t\tConstants.PROJECTION_WORLD_SIZE,\n\t\t];\n\n\t\tconst pixelsPerMeter = this.projectedUnitsPerMeter(lnglat[1]);\n\n\t\t//z dimension\n\t\tlet height = lnglat[2];\n\t\tif (height == null) {\n\t\t\theight = 0;\n\t\t}\n\t\tprojected.push(height * pixelsPerMeter);\n\n\t\treturn new Vector3(projected[0], projected[1], projected[2]);\n\t}\n\n\tstatic projectedUnitsPerMeter(latitude: number): number {\n\t\treturn Math.abs(\n\t\t\t(Constants.WORLD_SIZE * (1 / Math.cos((latitude * Math.PI) / 180))) / Constants.EARTH_CIRCUMFERENCE\n\t\t);\n\t}\n\n\tstatic fromLL(lon: number, lat: number): [number, number] {\n\t\t// derived from https://gist.github.com/springmeyer/871897\n\t\tconst extent = 20037508.34;\n\t\tconst x = (lon * extent) / 180;\n\t\tlet y = Math.log(Math.tan(((90 + lat) * Math.PI) / 360)) / (Math.PI / 180);\n\t\ty = (y * extent) / 180;\n\t\treturn [(x + extent) / (2 * extent), 1 - (y + extent) / (2 * extent)];\n\t}\n\tstatic fromLLv(position: Vector3): Vector3 {\n\t\tconst ll = this.fromLL(position.x, position.z);\n\t\treturn new Vector3(ll[0], position.y, ll[1]);\n\t}\n\n\t// https://github.com/mapbox/mapbox-gl-js/blob/5bebe1cd725e9af0c6be25928bdbde468bebdf61/src/ui/control/scale_control.js#L61-L127\n\tstatic get_distance(latlng1: mapboxgl.LngLat, latlng2: mapboxgl.LngLat) {\n\t\t// Uses spherical law of cosines approximation.\n\t\tconst R = 6371000;\n\n\t\tconst rad = Math.PI / 180,\n\t\t\tlat1 = latlng1.lat * rad,\n\t\t\tlat2 = latlng2.lat * rad,\n\t\t\ta =\n\t\t\t\tMath.sin(lat1) * Math.sin(lat2) +\n\t\t\t\tMath.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n\t\tconst maxMeters = R * Math.acos(Math.min(a, 1));\n\t\treturn maxMeters;\n\t}\n\n\t// https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Lon..2Flat._to_tile_numbers_3\n\tstatic lnglatToTileNumber(latDeg: number, lngDeg: number, zoom: number) {\n\t\tconst latRad = (latDeg / 180) * Math.PI;\n\t\tconst n = 2.0 ** zoom;\n\t\tconst x = Math.floor(((lngDeg + 180.0) / 360.0) * n);\n\t\tconst y = Math.floor(((1.0 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2.0) * n);\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t};\n\t}\n\tstatic tile_number_to_lnglat(xtile: number, ytile: number, zoom: number) {\n\t\tconst n = 2.0 ** zoom;\n\t\tconst lon_deg = (xtile / n) * 360.0 - 180.0;\n\t\tconst lat_rad = Math.atan(Math.sinh(Math.PI * (1 - (2 * ytile) / n)));\n\t\tconst lat_deg = 180.0 * (lat_rad / Math.PI);\n\n\t\treturn {\n\t\t\tlat: lat_deg,\n\t\t\tlng: lon_deg,\n\t\t};\n\t}\n}\n\n// module.exports.prettyPrintMatrix = prettyPrintMatrix;\n// module.exports.makePerspectiveMatrix = makePerspectiveMatrix;\n// module.exports.radify = radify;\n// module.exports.degreeify = degreeify;\n","import {PolyEngine} from '../../../engine/Poly';\nimport {OnNodeRegisterCallback} from '../../../engine/poly/registers/nodes/NodesRegister';\nimport {MapboxViewer} from '../../../engine/viewers/Mapbox';\nimport {MapboxPerspectiveCamera} from './MapboxPerspectiveCamera';\n\nexport type MapboxCameraObjNodeType = 'mapboxCamera';\nexport const MAPBOX_CAMERA_OBJ_NODE_TYPE: MapboxCameraObjNodeType = 'mapboxCamera';\n\nexport const registerMapboxCamera: OnNodeRegisterCallback = (poly: PolyEngine) => {\n\tpoly.registerCameraNodeType(MAPBOX_CAMERA_OBJ_NODE_TYPE);\n\n\tpoly.registerCamera<MapboxPerspectiveCamera>(MapboxPerspectiveCamera, (options) => {\n\t\tconst {camera, scene} = options;\n\t\t// since the camera is only created via the obj node for now,\n\t\t// we can assume that the path of the camera object and the camera node are the same\n\t\t// const cameraPath = CorePath.objectPath(camera);\n\t\t// const cameraNode = scene.node(cameraPath) as MapboxCameraObjNode;\n\n\t\tconst viewer = new MapboxViewer({\n\t\t\t// cameraNode,\n\t\t\tcamera,\n\t\t\tscene,\n\t\t\tupdateCameraAspect: (aspect) => {\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\t// camera.updateProjectionMatrix();\n\t\t\t\t// CoreCameraPerspectiveFrameMode.updateCameraAspect(camera, aspect);\n\t\t\t},\n\t\t});\n\t\treturn viewer;\n\t});\n};\n","type GsapCoreTimeline = gsap.core.Timeline;\ntype GsapCoreTimelineVars = gsap.TimelineVars;\ntype GsapTweenVars = gsap.TweenVars;\n\nexport interface GsapFactory {\n\tgsap: typeof gsap | undefined;\n\ttimeline: (vars?: GsapCoreTimelineVars | undefined) => GsapCoreTimeline | undefined;\n}\nexport const GSAP_FACTORY: GsapFactory = {\n\tgsap: undefined,\n\ttimeline: (vars?: GsapCoreTimelineVars | undefined) => {\n\t\treturn undefined;\n\t},\n};\nfunction gsapTimeline(vars?: GsapCoreTimelineVars | undefined) {\n\treturn GSAP_FACTORY.timeline(vars);\n\t// return gsap.timeline(vars);\n}\nfunction gsapLib() {\n\treturn GSAP_FACTORY.gsap;\n}\n\nexport {gsapTimeline, gsapLib, GsapCoreTimeline, GsapCoreTimelineVars, GsapTweenVars};\n","export enum BaseXRSessionEventName {\n\tCONNECTED = 'connected',\n\tDISCONNECTED = 'disconnected',\n\tSELECT = 'select',\n\tSELECT_START = 'selectstart',\n\tSELECT_END = 'selectend',\n}\n\nexport const BASE_XR_SESSION_EVENT_NAMES: BaseXRSessionEventName[] = [\n\tBaseXRSessionEventName.CONNECTED,\n\tBaseXRSessionEventName.DISCONNECTED,\n\tBaseXRSessionEventName.SELECT,\n\tBaseXRSessionEventName.SELECT_START,\n\tBaseXRSessionEventName.SELECT_END,\n];\nfunction _buildEventIndices() {\n\tconst map: Map<BaseXRSessionEventName, number> = new Map();\n\tlet i = 0;\n\tfor (const eventName of BASE_XR_SESSION_EVENT_NAMES) {\n\t\tmap.set(eventName, i);\n\t\ti++;\n\t}\n\treturn map;\n}\nexport const BASE_XR_EVENT_INDICES = _buildEventIndices();\n\nexport const WEBXR_REFERENCE_SPACE_TYPES: XRReferenceSpaceType[] = [\n\t'viewer',\n\t'local',\n\t'local-floor',\n\t'bounded-floor',\n\t'unbounded',\n];\nexport const DEFAULT_WEBXR_REFERENCE_SPACE_TYPE: XRReferenceSpaceType = 'local-floor';\n\nexport type WebXRRenderFunction = () => void;\nexport type WebXRControllerMountFunction = () => void;\nexport type WebXRControllerUnmountFunction = () => void;\n\nexport enum WebXRFeatureStatus {\n\tNOT_USED = 'not used',\n\tOPTIONAL = 'optional',\n\tREQUIRED = 'required',\n}\nexport const WEBXR_FEATURE_STATUSES: WebXRFeatureStatus[] = [\n\tWebXRFeatureStatus.NOT_USED,\n\tWebXRFeatureStatus.OPTIONAL,\n\tWebXRFeatureStatus.REQUIRED,\n];\nexport const WEBXR_FEATURE_STATUS_OPTIONAL_INDEX = WEBXR_FEATURE_STATUSES.indexOf(WebXRFeatureStatus.OPTIONAL);\nexport const WEBXR_FEATURE_PARAM_OPTIONS = {\n\tmenu: {\n\t\tentries: WEBXR_FEATURE_STATUSES.map((name, value) => ({name, value})),\n\t},\n};\n\nexport interface CoreWebXRControllerOptions {\n\toverrideReferenceSpaceType: boolean;\n\treferenceSpaceType?: XRReferenceSpaceType;\n}\n","import {BaseEvent, Camera, EventDispatcher, Ray, WebGLRenderer, XRTargetRaySpace} from 'three';\nimport {BASE_XR_SESSION_EVENT_NAMES, BaseXRSessionEventName} from './Common';\nimport {removeFromParent} from '../../engine/poly/PolyOnObjectsAddRemoveHooksController';\nimport {PolyScene} from '../../engine/scene/PolyScene';\n\nexport interface BaseCoreXRControllerEvent extends BaseEvent {\n\tcontrollerContainer: CoreWebXRControllerContainer;\n}\n\nexport function webXRControllerName(controllerIndex: number): string {\n\treturn `webXRController-${controllerIndex}`;\n}\ninterface CoreWebXRControllerContainerEventMap {\n\t[BaseXRSessionEventName.CONNECTED]: any;\n\t[BaseXRSessionEventName.DISCONNECTED]: any;\n\t[BaseXRSessionEventName.SELECT]: any;\n\t[BaseXRSessionEventName.SELECT_START]: any;\n\t[BaseXRSessionEventName.SELECT_END]: any;\n}\nexport class CoreWebXRControllerContainer extends EventDispatcher<CoreWebXRControllerContainerEventMap> {\n\tpublic readonly ray: Ray = new Ray();\n\tpublic readonly controller: XRTargetRaySpace;\n\tconstructor(\n\t\tpublic readonly scene: PolyScene,\n\t\tpublic readonly renderer: WebGLRenderer,\n\t\tpublic readonly index: number\n\t) {\n\t\tsuper();\n\n\t\tthis.controller = this.renderer.xr.getController(this.index);\n\n\t\tfor (const eventName of BASE_XR_SESSION_EVENT_NAMES) {\n\t\t\tconst event: BaseCoreXRControllerEvent = {type: eventName, controllerContainer: this};\n\t\t\tthis.controller.addEventListener(eventName, (controllerEvent) => {\n\t\t\t\tthis.dispatchEvent(event);\n\t\t\t});\n\t\t}\n\t\tthis.controller.name = webXRControllerName(this.index);\n\t}\n\tinitialize(camera: Camera | null) {\n\t\tif (camera == null) {\n\t\t\tremoveFromParent(this.scene, this.controller);\n\t\t\treturn;\n\t\t}\n\n\t\tconst cameraParent = camera.parent;\n\t\tif (cameraParent) {\n\t\t\tcameraParent.add(this.controller);\n\t\t} else {\n\t\t\tconsole.warn('camera has no parent, webXR controls cannot be added to the scene');\n\t\t}\n\t}\n}\n","import {Camera, Matrix4, WebGLRenderer} from 'three';\nimport type {PolyScene} from '../../engine/scene/PolyScene';\nimport {isBooleanTrue} from '../Type';\nimport {CoreWebXRControllerOptions, DEFAULT_WEBXR_REFERENCE_SPACE_TYPE} from './Common';\nimport {CoreWebXRControllerContainer} from './CoreWebXRControllerContainer';\nconst tempMatrix = new Matrix4();\nconst webXRButtonsContainerClass = 'polygonjs-webxr-buttons-container';\n\nexport type OnWebXRSessionStartedCallback = (session: XRSession) => Promise<void>;\nexport abstract class BaseCoreWebXRController {\n\tprotected controllerContainers: CoreWebXRControllerContainer[] = [];\n\tconstructor(\n\t\tprotected scene: PolyScene,\n\t\tprotected renderer: WebGLRenderer,\n\t\tprotected camera: Camera,\n\t\tprivate canvas: HTMLCanvasElement,\n\t\tprotected options: CoreWebXRControllerOptions\n\t) {\n\t\trenderer.xr.enabled = true;\n\n\t\tif (isBooleanTrue(options.overrideReferenceSpaceType) && options.referenceSpaceType) {\n\t\t\trenderer.xr.setReferenceSpaceType(options.referenceSpaceType);\n\t\t} else {\n\t\t\trenderer.xr.setReferenceSpaceType(DEFAULT_WEBXR_REFERENCE_SPACE_TYPE);\n\t\t}\n\t}\n\tgetController(controllerIndex: number) {\n\t\treturn this.controllerContainers[controllerIndex] || this._createController(controllerIndex);\n\t}\n\n\tmount() {\n\t\t// sessionstart and sessionend events\n\t\t// are only added right before the session request\n\t\t// and not when mounting the button.\n\t\t// Otherwise, when mounting both AR and VR buttons,\n\t\t// both AR and VR controllers would react to a sessionstart event.\n\t\t// By adding the events only when doing the session request,\n\t\t// we ensure that only one controller has those events added\n\t\tthis._mountButton();\n\t}\n\tunmount() {\n\t\tthis._removedStartEndEvents();\n\t\tthis._unmountButton();\n\t}\n\trequestSession(sessionInit: XRSessionInit, callback: OnWebXRSessionStartedCallback) {\n\t\tthis._addStartEndEvents();\n\t}\n\tprivate _addStartEndEvents() {\n\t\tthis.renderer.xr.addEventListener('sessionstart', this._onSessionStartBound);\n\t\tthis.renderer.xr.addEventListener('sessionend', this._onSessionEndBound);\n\t}\n\tprivate _removedStartEndEvents() {\n\t\tthis.renderer.xr.removeEventListener('sessionstart', this._onSessionStartBound);\n\t\tthis.renderer.xr.removeEventListener('sessionend', this._onSessionEndBound);\n\t}\n\n\tprivate _createController(controllerIndex: number): CoreWebXRControllerContainer {\n\t\tconst controllerContainer = new CoreWebXRControllerContainer(this.scene, this.renderer, controllerIndex);\n\t\tcontrollerContainer.initialize(this.camera);\n\t\tthis.controllerContainers.push(controllerContainer);\n\t\tthis._addControllerEvents(controllerContainer, controllerIndex);\n\t\treturn controllerContainer;\n\t}\n\tprotected _addControllerEvents(controllerContainer: CoreWebXRControllerContainer, controllerIndex: number): void {}\n\tprocess(frame?: XRFrame) {\n\t\tfor (const controllerContainer of this.controllerContainers) {\n\t\t\ttempMatrix.identity().extractRotation(controllerContainer.controller.matrixWorld);\n\t\t\tcontrollerContainer.ray.origin.setFromMatrixPosition(controllerContainer.controller.matrixWorld);\n\t\t\tcontrollerContainer.ray.direction.set(0, 0, -1).applyMatrix4(tempMatrix);\n\t\t}\n\t}\n\n\tprivate _onSessionStartBound = this._onSessionStart.bind(this);\n\tprivate _onSessionEndBound = this._onSessionEnd.bind(this);\n\tprotected _onSessionStart() {\n\t\tfor (const controllerContainer of this.controllerContainers) {\n\t\t\tcontrollerContainer.initialize(this.camera);\n\t\t}\n\t\tthis.scene.play();\n\t}\n\tprotected _onSessionEnd() {\n\t\tthis._removedStartEndEvents();\n\t\tfor (const controllerContainer of this.controllerContainers) {\n\t\t\tcontrollerContainer.initialize(null);\n\t\t}\n\t\tthis.scene.pause();\n\t}\n\n\t/**\n\t *\n\t * BUTTONS\n\t *\n\t */\n\tprivate _buttonByCanvasId: Map<string, HTMLElement> = new Map();\n\tabstract createButton(): HTMLElement;\n\n\tprivate _mountButton() {\n\t\tif (!this.renderer.xr.enabled) {\n\t\t\tconsole.warn('renderer.xr is not enabled, not mounting webXR button');\n\t\t\treturn;\n\t\t}\n\t\tconst parent = this.canvas.parentElement;\n\t\tif (parent) {\n\t\t\tlet buttonsContainer: HTMLElement | null = parent.querySelector(`.${webXRButtonsContainerClass}`);\n\t\t\tif (!buttonsContainer) {\n\t\t\t\tbuttonsContainer = document.createElement('div');\n\t\t\t\tbuttonsContainer.classList.add(webXRButtonsContainerClass);\n\t\t\t\tparent.prepend(buttonsContainer);\n\t\t\t\tbuttonsContainer.style.position = 'absolute';\n\t\t\t\tbuttonsContainer.style.bottom = '20px';\n\t\t\t\tbuttonsContainer.style.textAlign = 'center';\n\t\t\t\tbuttonsContainer.style.width = '100%';\n\t\t\t}\n\t\t\tconst button = this.createButton();\n\t\t\tthis.attachButton(buttonsContainer, button);\n\t\t\tthis._buttonByCanvasId.set(this.canvas.id, button);\n\t\t} else {\n\t\t\tconsole.warn('canvas has no parent');\n\t\t}\n\t}\n\tabstract attachButton(parentElement: HTMLElement, buttonElement: HTMLElement): void;\n\tprivate _unmountButton() {\n\t\tconst button = this._buttonByCanvasId.get(this.canvas.id);\n\t\tif (!button) {\n\t\t\treturn;\n\t\t}\n\t\tbutton.parentElement?.removeChild(button);\n\t}\n}\n","const WEBXR_NOT_SUPPORTED_COLOR = `rgb(61 20 35 / 95%)`;\n\nexport function setErrorStyle(element: HTMLElement) {\n\telement.style.background = WEBXR_NOT_SUPPORTED_COLOR;\n}\n\nexport function applyDefaultStyle(element: HTMLElement) {\n\telement.style.margin = '0px 6px';\n\telement.style.padding = '12px 6px';\n\telement.style.border = '1px solid #fff';\n\telement.style.borderRadius = '4px';\n\telement.style.color = '#fff';\n\t// element.style.font = 'normal 13px sans-serif';\n\telement.style.textAlign = 'center';\n\telement.style.opacity = '0.8';\n\telement.style.outline = 'none';\n\telement.style.zIndex = '999';\n\telement.style.whiteSpace = 'nowrap';\n}\n\nexport function createInfoLink() {\n\tconst message = document.createElement('a');\n\n\tif (globalThis.isSecureContext === false) {\n\t\tmessage.href = document.location.href.replace(/^http:/, 'https:');\n\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS';\n\t} else {\n\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\t}\n\n\tmessage.style.left = 'calc(50% - 90px)';\n\t// message.style.width = '180px';\n\tmessage.style.textDecoration = 'none';\n\treturn message;\n}\n\nexport function disableButtonElement(button: HTMLElement) {\n\tbutton.style.display = '';\n\n\tbutton.style.cursor = 'auto';\n\tbutton.style.left = 'calc(50% - 75px)';\n\t// button.style.width = '150px';\n\tbutton.onmouseenter = null;\n\tbutton.onmouseleave = null;\n\n\tbutton.onclick = null;\n}\n","import {Camera, Scene} from 'three';\n\nexport type MarkerTrackingControllerRenderFunction = () => void;\nexport type MarkerTrackingControllerMountFunction = () => void;\nexport type MarkerTrackingControllerUnmountFunction = () => void;\n\nexport interface MarkerTrackingControllerConfig {\n\trenderFunction: MarkerTrackingControllerRenderFunction;\n\tmountFunction: MarkerTrackingControllerMountFunction;\n\tunmountFunction: MarkerTrackingControllerUnmountFunction;\n}\n\nexport enum MarkerTrackingSourceMode {\n\tWEBCAM = 'webcam',\n\tIMAGE = 'image',\n\tVIDEO = 'video',\n}\nexport const MARKER_TRACKING_SOURCE_MODES: MarkerTrackingSourceMode[] = [\n\tMarkerTrackingSourceMode.WEBCAM,\n\tMarkerTrackingSourceMode.IMAGE,\n\tMarkerTrackingSourceMode.VIDEO,\n];\n\nexport enum MarkerTrackingTransformMode {\n\tCAMERA = 'camera',\n\tMARKER = 'marker',\n}\nexport const MARKER_TRACKING_TRANSFORM_MODES: MarkerTrackingTransformMode[] = [\n\tMarkerTrackingTransformMode.CAMERA,\n\tMarkerTrackingTransformMode.MARKER,\n];\n\nexport interface CoreMarkerTrackingControllerOptions {\n\tsourceMode: MarkerTrackingSourceMode;\n\tsourceUrl?: string;\n\tcanvas: HTMLCanvasElement;\n\tcamera: Camera;\n\tscene: Scene;\n\tbarCode: {\n\t\ttype: string;\n\t\tvalue: number;\n\t};\n\ttransformMode: MarkerTrackingTransformMode;\n\tsmooth: {\n\t\tactive: boolean;\n\t\tcount: number;\n\t};\n}\n","import {CoreWebXRControllerOptions} from '../Common';\n\nexport enum WebXRARFeature {\n\tHIT_TEST = 'hit-test',\n\tLIGHT_ESTIMATION = 'light-estimation',\n\t// CAMERA_ACCESS = 'camera-access',\n}\n\nexport const WEBXR_AR_FEATURES: WebXRARFeature[] = [\n\tWebXRARFeature.HIT_TEST,\n\tWebXRARFeature.LIGHT_ESTIMATION,\n\t// WebXRARFeature.CAMERA_ACCESS,\n];\n\nexport interface CoreWebXRARControllerOptions extends CoreWebXRControllerOptions {\n\toptionalFeatures: WebXRARFeature[];\n\trequiredFeatures: WebXRARFeature[];\n}\n\n// https://immersive-web.github.io/raw-camera-access/#xrcamera\nexport interface XRCamera {\n\twidth: number;\n\theight: number;\n}\nexport interface ExtentedXRView extends XRView {\n\tcamera?: XRCamera;\n}\n// export abstract class ExtendedXRWebGLBinding extends XRWebGLBinding {\n// \tabstract getCameraImage(camera: XRCamera): WebGLTexture | undefined;\n// }\n","import {\n\tDirectionalLight,\n\tGroup,\n\tLightProbe,\n\tWebGLCubeRenderTarget\n} from 'three';\n\nclass SessionLightProbe {\n\n\tconstructor( xrLight, renderer, lightProbe, environmentEstimation, estimationStartCallback ) {\n\n\t\tthis.xrLight = xrLight;\n\t\tthis.renderer = renderer;\n\t\tthis.lightProbe = lightProbe;\n\t\tthis.xrWebGLBinding = null;\n\t\tthis.estimationStartCallback = estimationStartCallback;\n\t\tthis.frameCallback = this.onXRFrame.bind( this );\n\n\t\tconst session = renderer.xr.getSession();\n\n\t\t// If the XRWebGLBinding class is available then we can also query an\n\t\t// estimated reflection cube map.\n\t\tif ( environmentEstimation && 'XRWebGLBinding' in window ) {\n\n\t\t\t// This is the simplest way I know of to initialize a WebGL cubemap in Three.\n\t\t\tconst cubeRenderTarget = new WebGLCubeRenderTarget( 16 );\n\t\t\txrLight.environment = cubeRenderTarget.texture;\n\n\t\t\tconst gl = renderer.getContext();\n\n\t\t\t// Ensure that we have any extensions needed to use the preferred cube map format.\n\t\t\tswitch ( session.preferredReflectionFormat ) {\n\n\t\t\t\tcase 'srgba8':\n\t\t\t\t\tgl.getExtension( 'EXT_sRGB' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rgba16f':\n\t\t\t\t\tgl.getExtension( 'OES_texture_half_float' );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.xrWebGLBinding = new XRWebGLBinding( session, gl );\n\n\t\t\tthis.lightProbe.addEventListener( 'reflectionchange', () => {\n\n\t\t\t\tthis.updateReflection();\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Start monitoring the XR animation frame loop to look for lighting\n\t\t// estimation changes.\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t}\n\n\tupdateReflection() {\n\n\t\tconst textureProperties = this.renderer.properties.get( this.xrLight.environment );\n\n\t\tif ( textureProperties ) {\n\n\t\t\tconst cubeMap = this.xrWebGLBinding.getReflectionCubeMap( this.lightProbe );\n\n\t\t\tif ( cubeMap ) {\n\n\t\t\t\ttextureProperties.__webglTexture = cubeMap;\n\n\t\t\t\tthis.xrLight.environment.needsPMREMUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tonXRFrame( time, xrFrame ) {\n\n\t\t// If either this obejct or the XREstimatedLight has been destroyed, stop\n\t\t// running the frame loop.\n\t\tif ( ! this.xrLight ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst session = xrFrame.session;\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t\tconst lightEstimate = xrFrame.getLightEstimate( this.lightProbe );\n\t\tif ( lightEstimate ) {\n\n\t\t\t// We can copy the estimate's spherical harmonics array directly into the light probe.\n\t\t\tthis.xrLight.lightProbe.sh.fromArray( lightEstimate.sphericalHarmonicsCoefficients );\n\t\t\tthis.xrLight.lightProbe.intensity = 1.0;\n\n\t\t\t// For the directional light we have to normalize the color and set the scalar as the\n\t\t\t// intensity, since WebXR can return color values that exceed 1.0.\n\t\t\tconst intensityScalar = Math.max( 1.0,\n\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.x,\n\t\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.y,\n\t\t\t\t\t\tlightEstimate.primaryLightIntensity.z ) ) );\n\n\t\t\tthis.xrLight.directionalLight.color.setRGB(\n\t\t\t\tlightEstimate.primaryLightIntensity.x / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.y / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.z / intensityScalar );\n\t\t\tthis.xrLight.directionalLight.intensity = intensityScalar;\n\t\t\tthis.xrLight.directionalLight.position.copy( lightEstimate.primaryLightDirection );\n\n\t\t\tif ( this.estimationStartCallback ) {\n\n\t\t\t\tthis.estimationStartCallback();\n\t\t\t\tthis.estimationStartCallback = null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.xrLight = null;\n\t\tthis.renderer = null;\n\t\tthis.lightProbe = null;\n\t\tthis.xrWebGLBinding = null;\n\n\t}\n\n}\n\nexport class XREstimatedLight extends Group {\n\n\tconstructor( renderer, environmentEstimation = true ) {\n\n\t\tsuper();\n\n\t\tthis.lightProbe = new LightProbe();\n\t\tthis.lightProbe.intensity = 0;\n\t\tthis.add( this.lightProbe );\n\n\t\tthis.directionalLight = new DirectionalLight();\n\t\tthis.directionalLight.intensity = 0;\n\t\tthis.add( this.directionalLight );\n\n\t\t// Will be set to a cube map in the SessionLightProbe if environment estimation is\n\t\t// available and requested.\n\t\tthis.environment = null;\n\n\t\tlet sessionLightProbe = null;\n\t\tlet estimationStarted = false;\n\t\trenderer.xr.addEventListener( 'sessionstart', () => {\n\n\t\t\tconst session = renderer.xr.getSession();\n\n\t\t\tif ( 'requestLightProbe' in session ) {\n\n\t\t\t\tsession.requestLightProbe( {\n\n\t\t\t\t\treflectionFormat: session.preferredReflectionFormat\n\n\t\t\t\t} ).then( ( probe ) => {\n\n\t\t\t\t\tsessionLightProbe = new SessionLightProbe( this, renderer, probe, environmentEstimation, () => {\n\n\t\t\t\t\t\testimationStarted = true;\n\n\t\t\t\t\t\t// Fired to indicate that the estimated lighting values are now being updated.\n\t\t\t\t\t\tthis.dispatchEvent( { type: 'estimationstart' } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderer.xr.addEventListener( 'sessionend', () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tif ( estimationStarted ) {\n\n\t\t\t\t// Fired to indicate that the estimated lighting values are no longer being updated.\n\t\t\t\tthis.dispatchEvent( { type: 'estimationend' } );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Done inline to provide access to sessionLightProbe.\n\t\tthis.dispose = () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tthis.remove( this.lightProbe );\n\t\t\tthis.lightProbe = null;\n\n\t\t\tthis.remove( this.directionalLight );\n\t\t\tthis.directionalLight = null;\n\n\t\t\tthis.environment = null;\n\n\t\t};\n\n\t}\n\n}\n","import {DirectionalLight, LightProbe, Object3D, Texture, WebGLRenderer} from 'three';\nimport {XREstimatedLight} from 'three/examples/jsm/webxr/XREstimatedLight';\n// import {BaseCopNodeType} from '../../../engine/nodes/cop/_Base';\n// import {TypedNode} from '../../../engine/nodes/_Base';\n// import {NodeContext} from '../../../engine/poly/NodeContext';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\nconst ATTRIB_NAME = {\n\tIS_ESTIMATED_LIGHT: 'CoreWebXRAREstimatedLight_isEstimatedLight',\n\tIS_DEFAULT_LIGHTS_PARENT: 'CoreWebXRAREstimatedLight_defaultLightsParent',\n\t// DEFAULT_ENVIRONMENT_COP_NODE_ID: 'CoreWebXRAREstimatedLight_defaultEnvCopNodeId',\n\tAPPLY_ENV: 'CoreWebXRAREstimatedLight_applyEnv',\n\tAPPLY_LIGHT_PROBE: 'CoreWebXRAREstimatedLight_applyLightProbe',\n\tAPPLY_DIR_LIGHT: 'CoreWebXRAREstimatedLight_applyDirLight',\n\t// DIR_LIGHT_INTENSITY: 'CoreWebXRAREstimatedLight_dirLightIntensity',\n};\nexport class CoreWebXRAREstimatedLightController {\n\tstatic ATTRIB_NAME = ATTRIB_NAME;\n\n\tinitialize(scene: PolyScene, renderer: WebGLRenderer) {\n\t\tthis._estimatedLightSourceObject = undefined;\n\t\tscene.threejsScene().traverse((object) => {\n\t\t\tif (this._estimatedLightSourceObject) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst coreObjectClass = coreObjectClassFactory(object);\n\n\t\t\tconst isEstimatedLight = coreObjectClass.attribValue(object, ATTRIB_NAME.IS_ESTIMATED_LIGHT) as\n\t\t\t\t| boolean\n\t\t\t\t| null;\n\t\t\tif (isEstimatedLight == true) {\n\t\t\t\tthis._estimatedLightSourceObject = object;\n\t\t\t\tthis._initEstimatedLight(scene, renderer);\n\t\t\t}\n\t\t});\n\t}\n\tprivate _estimatedLightSourceObject: Object3D | undefined;\n\tprivate _estimatedLight: XREstimatedLight | undefined;\n\t// const estimatedLight = new XREstimatedLight(renderer);\n\tprivate async _initEstimatedLight(scene: PolyScene, renderer: WebGLRenderer) {\n\t\tif (!this._estimatedLightSourceObject) {\n\t\t\treturn;\n\t\t}\n\n\t\t// default lights\n\t\tconst estimatedLightSourceObject = this._estimatedLightSourceObject;\n\t\tconst defaultLightsParent = this._estimatedLightSourceObject.children.find((child) => {\n\t\t\tconst coreObjectClass = coreObjectClassFactory(child);\n\t\t\tcoreObjectClass.attribValue(child, ATTRIB_NAME.IS_DEFAULT_LIGHTS_PARENT);\n\t\t});\n\n\t\t// default envs\n\t\t// const defaultEnvNodeId = CoreObject.attribValue(\n\t\t// \tthis._estimatedLightSourceObject,\n\t\t// \tATTRIB_NAME.DEFAULT_ENVIRONMENT_COP_NODE_ID\n\t\t// ) as number | null;\n\t\t// const defaultEnvGraphNode = defaultEnvNodeId ? scene.graph.nodeFromId(defaultEnvNodeId) : undefined;\n\t\t// let defaultEnvTexture: Texture | undefined;\n\t\t// if (\n\t\t// \tdefaultEnvGraphNode != null &&\n\t\t// \tdefaultEnvGraphNode instanceof TypedNode &&\n\t\t// \tdefaultEnvGraphNode.context() == NodeContext.COP\n\t\t// ) {\n\t\t// \tconst defaultEnvNode = defaultEnvGraphNode as BaseCopNodeType;\n\t\t// \tconst container = await defaultEnvNode.compute();\n\t\t// \tdefaultEnvTexture = container.texture();\n\t\t// }\n\t\tconst coreObjectClass = coreObjectClassFactory(estimatedLightSourceObject);\n\n\t\t// lights customisation\n\t\tconst applyEnv =\n\t\t\t(coreObjectClass.attribValue(estimatedLightSourceObject, ATTRIB_NAME.APPLY_ENV) as boolean | null) || false;\n\t\tconst applyLightProbe =\n\t\t\t(coreObjectClass.attribValue(estimatedLightSourceObject, ATTRIB_NAME.APPLY_LIGHT_PROBE) as\n\t\t\t\t| boolean\n\t\t\t\t| null) || false;\n\t\tconst applyDirLight =\n\t\t\t(coreObjectClass.attribValue(estimatedLightSourceObject, ATTRIB_NAME.APPLY_DIR_LIGHT) as boolean | null) ||\n\t\t\tfalse;\n\t\t// const dirLightIntensity =\n\t\t// \t(CoreObject.attribValue(estimatedLightSourceObject, ATTRIB_NAME.DIR_LIGHT_INTENSITY) as number | null) || 1;\n\n\t\t// estimation init\n\t\tif (this._estimatedLight) {\n\t\t\tthis._estimatedLightSourceObject.remove(this._estimatedLight);\n\t\t}\n\t\t// estimation init\n\t\tthis._estimatedLight = new XREstimatedLight(renderer);\n\t\tthis._estimatedLightSourceObject.add(this._estimatedLight);\n\t\tconst threejsScene = scene.threejsScene();\n\n\t\tlet previousEnv: Texture | null = null;\n\t\tconst estimatedLight = this._estimatedLight;\n\t\tthis._estimatedLight.addEventListener('estimationstart', () => {\n\t\t\t// Swap the default light out for the estimated one one we start getting some estimated values.\n\t\t\testimatedLightSourceObject.add(estimatedLight);\n\t\t\tif (defaultLightsParent) {\n\t\t\t\testimatedLightSourceObject.remove(defaultLightsParent);\n\t\t\t}\n\n\t\t\t// remove/tweak lights\n\t\t\testimatedLight.traverse((child) => {\n\t\t\t\tif (child instanceof LightProbe) {\n\t\t\t\t\tif (applyLightProbe == false) {\n\t\t\t\t\t\tchild.removeFromParent();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (child instanceof DirectionalLight) {\n\t\t\t\t\tif (applyDirLight == false) {\n\t\t\t\t\t\tchild.removeFromParent();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// The estimated lighting also provides an environment cubemap, which we can apply here.\n\t\t\tif (applyEnv && estimatedLight.environment) {\n\t\t\t\tpreviousEnv = threejsScene.environment;\n\t\t\t\tthreejsScene.environment = estimatedLight.environment;\n\t\t\t}\n\t\t});\n\n\t\testimatedLight.addEventListener('estimationend', () => {\n\t\t\t// Swap the lights back when we stop receiving estimated values.\n\t\t\tif (defaultLightsParent) {\n\t\t\t\testimatedLightSourceObject.add(defaultLightsParent);\n\t\t\t}\n\t\t\testimatedLightSourceObject.remove(estimatedLight);\n\n\t\t\t// Revert back to the default environment.\n\t\t\tthreejsScene.environment = previousEnv;\n\n\t\t\t// estimatedLight.dispose()\n\t\t});\n\t}\n\n\tdispose() {\n\t\tif (this._estimatedLight) {\n\t\t\tthis._estimatedLightSourceObject?.remove(this._estimatedLight);\n\t\t\tthis._estimatedLight = undefined;\n\t\t}\n\t}\n}\n","import {CoreWebXRControllerOptions} from '../Common';\n\nexport enum WebXRVRFeature {\n\tLOCAL_FLOOR = 'local-floor',\n\tBOUNDED_FLOOR = 'bounded-floor',\n\tHAND_TRACKING = 'hand-tracking',\n\tLAYERS = 'layers',\n}\n\nexport const WEBXR_VR_FEATURES: WebXRVRFeature[] = [\n\tWebXRVRFeature.LOCAL_FLOOR,\n\tWebXRVRFeature.BOUNDED_FLOOR,\n\tWebXRVRFeature.HAND_TRACKING,\n\tWebXRVRFeature.LAYERS,\n];\n\nexport interface CoreWebXRVRControllerOptions extends CoreWebXRControllerOptions {\n\trequiredFeatures: WebXRVRFeature[];\n\toptionalFeatures: WebXRVRFeature[];\n}\n","import {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';\nimport {\n\tsetObjectBoolean,\n\tgetObjectBoolean,\n\tgetObjectString,\n\tsetObjectString,\n\tsetObjectNumber,\n\tgetObjectNumber,\n} from '../geometry/AttributeUtils';\nimport {WFCTileSide, WFC_ALL_HORIZONTAL_SIDES} from './WFCCommon';\nimport {TypeAssert} from '../../engine/poly/Assert';\n\nexport enum WFCQuadAttribute {\n\tQUAD_ID = 'quadId',\n\tFLOOR_INDEX = 'floorIndex',\n\tTILE_ID = 'tileId',\n\tSOLVE_ALLOWED = 'solveAllowed',\n\t// solver output\n\tSOLVED_TILE_CONFIGS = 'solvedTileConfigs',\n}\n\nexport enum WFCTileAttribute {\n\t// IS_TILE = 'WFCTileAttribute_isTile',\n\tTILE_ID = 'WFCTileAttribute_tileId',\n\tROTATION_Y_ALLOWED = 'WFCTileAttribute_rotationYAllowed',\n\tWEIGHT = 'WFCTileAttribute_weight',\n\tIS_ERROR_TILE = 'WFCTileAttribute_isErrorTile',\n\tIS_UNRESOLVED_TILE = 'WFCTileAttribute_isUnresolvedTile',\n\n\t// sidename\n\tSIDE_NAME_S = 'WFCTileAttribute_sideNameS',\n\tSIDE_NAME_N = 'WFCTileAttribute_sideNameN',\n\tSIDE_NAME_W = 'WFCTileAttribute_sideNameW',\n\tSIDE_NAME_E = 'WFCTileAttribute_sideNameE',\n\tSIDE_NAME_H = 'WFCTileAttribute_sideNameAllHorizontalSides',\n\tSIDE_NAME_B = 'WFCTileAttribute_sideNameB',\n\tSIDE_NAME_T = 'WFCTileAttribute_sideNameT',\n\n\t// solver output\n\t// ENTROPY = 'WFCTileAttribute_entropy',\n\t// STEP = 'WFCTileAttribute_step',\n}\nexport enum WFCConnectionAttribute {\n\t// IS_CONNECTION = 'WFCTileAttribute_isConnection',\n\tID0 = 'WFCTileAttribute_tileId0',\n\tID1 = 'WFCTileAttribute_tileId1',\n\tSIDE0 = 'WFCTileAttribute_tileSide0',\n\tSIDE1 = 'WFCTileAttribute_tileSide1',\n}\n\ntype WFCTileSideAttribute =\n\t| WFCTileAttribute.SIDE_NAME_S\n\t| WFCTileAttribute.SIDE_NAME_N\n\t| WFCTileAttribute.SIDE_NAME_W\n\t| WFCTileAttribute.SIDE_NAME_E\n\t| WFCTileAttribute.SIDE_NAME_H\n\t| WFCTileAttribute.SIDE_NAME_B\n\t| WFCTileAttribute.SIDE_NAME_T;\nfunction _sideNameAttribute(side: WFCTileSide): WFCTileSideAttribute {\n\tswitch (side) {\n\t\tcase 'n':\n\t\t\treturn WFCTileAttribute.SIDE_NAME_N;\n\t\tcase 's':\n\t\t\treturn WFCTileAttribute.SIDE_NAME_S;\n\t\tcase 'w':\n\t\t\treturn WFCTileAttribute.SIDE_NAME_W;\n\t\tcase 'e':\n\t\t\treturn WFCTileAttribute.SIDE_NAME_E;\n\t\tcase WFC_ALL_HORIZONTAL_SIDES:\n\t\t\treturn WFCTileAttribute.SIDE_NAME_H;\n\t\tcase 'b':\n\t\t\treturn WFCTileAttribute.SIDE_NAME_B;\n\t\tcase 't':\n\t\t\treturn WFCTileAttribute.SIDE_NAME_T;\n\t}\n\tTypeAssert.unreachable(side);\n}\n\nexport class CoreWFCTileAttribute {\n\t// static setIsTile(object: ObjectContent<CoreObjectType>, value: boolean) {\n\t// \tsetObjectBoolean(object, WFCTileAttribute.IS_TILE, value);\n\t// }\n\tstatic getIsTile(object: ObjectContent<CoreObjectType>) {\n\t\treturn this.getTileId(object) != null; //getObjectBoolean(object, WFCTileAttribute.IS_TILE, false);\n\t}\n\tstatic setTileId(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, WFCTileAttribute.TILE_ID, value);\n\t}\n\tstatic getTileId(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, WFCTileAttribute.TILE_ID) as string;\n\t}\n\tstatic setRotationYAllowed(object: ObjectContent<CoreObjectType>, value: boolean) {\n\t\tsetObjectBoolean(object, WFCTileAttribute.ROTATION_Y_ALLOWED, value);\n\t}\n\tstatic getRotationYAllowed(object: ObjectContent<CoreObjectType>) {\n\t\treturn getObjectBoolean(object, WFCTileAttribute.ROTATION_Y_ALLOWED, false);\n\t}\n\tstatic setWeight(object: ObjectContent<CoreObjectType>, value: number) {\n\t\tsetObjectNumber(object, WFCTileAttribute.WEIGHT, value);\n\t}\n\tstatic getWeight(object: ObjectContent<CoreObjectType>) {\n\t\treturn getObjectNumber(object, WFCTileAttribute.WEIGHT, 1);\n\t}\n\tstatic setIsErrorTile(object: ObjectContent<CoreObjectType>, value: boolean) {\n\t\tsetObjectBoolean(object, WFCTileAttribute.IS_ERROR_TILE, value);\n\t}\n\tstatic getIsErrorTile(object: ObjectContent<CoreObjectType>): boolean {\n\t\treturn getObjectBoolean(object, WFCTileAttribute.IS_ERROR_TILE, false) as boolean;\n\t}\n\tstatic setIsUnresolvedTile(object: ObjectContent<CoreObjectType>, value: boolean) {\n\t\tsetObjectBoolean(object, WFCTileAttribute.IS_UNRESOLVED_TILE, value);\n\t}\n\tstatic getIsUnresolvedTile(object: ObjectContent<CoreObjectType>): boolean {\n\t\treturn getObjectBoolean(object, WFCTileAttribute.IS_UNRESOLVED_TILE, false) as boolean;\n\t}\n\t// static setEntropy(object: ObjectContent<CoreObjectType>, value: number) {\n\t// \tsetObjectNumber(object, WFCTileAttribute.ENTROPY, value);\n\t// }\n\tstatic getSideName(object: ObjectContent<CoreObjectType>, side: WFCTileSide): string | undefined {\n\t\treturn getObjectString(object, _sideNameAttribute(side));\n\t}\n\tstatic setSideName(object: ObjectContent<CoreObjectType>, side: WFCTileSide, value: string) {\n\t\tsetObjectString(object, _sideNameAttribute(side), value);\n\t}\n}\nexport class CoreWFCRuleAttribute {\n\t// static setIsConnection(object: ObjectContent<CoreObjectType>, value: boolean) {\n\t// \tsetObjectBoolean(object, WFCConnectionAttribute.IS_CONNECTION, value);\n\t// }\n\tstatic getIsConnection(object: ObjectContent<CoreObjectType>) {\n\t\treturn this.getId0(object) && this.getId1(object) && this.getSide0(object) && this.getSide1(object); //getObjectBoolean(object, WFCConnectionAttribute.IS_CONNECTION, false);\n\t}\n\tstatic setId0(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, WFCConnectionAttribute.ID0, value);\n\t}\n\tstatic getId0(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, WFCConnectionAttribute.ID0) as string;\n\t}\n\tstatic setId1(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, WFCConnectionAttribute.ID1, value);\n\t}\n\tstatic getId1(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, WFCConnectionAttribute.ID1) as string;\n\t}\n\tstatic setSide0(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, WFCConnectionAttribute.SIDE0, value);\n\t}\n\tstatic getSide0(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, WFCConnectionAttribute.SIDE0) as string;\n\t}\n\tstatic setSide1(object: ObjectContent<CoreObjectType>, value: string) {\n\t\tsetObjectString(object, WFCConnectionAttribute.SIDE1, value);\n\t}\n\tstatic getSide1(object: ObjectContent<CoreObjectType>): string {\n\t\treturn getObjectString(object, WFCConnectionAttribute.SIDE1) as string;\n\t}\n}\n","import {mod} from '../math/_Module';\nimport {TileConfig} from './WFCTileConfig';\nimport {EMPTY_TILE_ID} from './WFCConstant';\nimport {QuadPrimitivePointPositions} from '../geometry/modules/quad/utils/QuadUtils';\n\nexport interface TileCorners extends QuadPrimitivePointPositions {\n\theight: number;\n}\nexport type WFCAllHorizontalSides = 'snwe';\nexport const WFC_ALL_HORIZONTAL_SIDES: WFCAllHorizontalSides = 'snwe';\nexport const ALL_HORIZONTAL_SIDES: WFCAllHorizontalSides = 'snwe';\nexport type WFCTileSide = 's' | 'n' | 'w' | 'e' | 'b' | 't' | WFCAllHorizontalSides;\nexport const ALL_SIDES: WFCTileSide[] = ['s', 'n', 'w', 'e', 'b', 't'];\nexport interface WFCRule {\n\treadonly id0: string;\n\treadonly id1: string;\n\treadonly side0: WFCTileSide;\n\treadonly side1: WFCTileSide;\n}\n\n// export enum WFCLookAtSide {\n// \tSOUTH = 's',\n// \tNORTH = 'n',\n// \tWEST = 'w',\n// \tEAST = 'e',\n// }\n// export const WFC_LOOK_AT_SIDES: WFCLookAtSide[] = [\n// \tWFCLookAtSide.NORTH,\n// \tWFCLookAtSide.EAST,\n// \tWFCLookAtSide.SOUTH,\n// \tWFCLookAtSide.WEST,\n// ];\n\n// export interface PotentialNeighbour {\n// \tid: string;\n// \tside: WFCTileSide;\n// }\n// export type WFCAvailableTileNeighbours = Record<WFCTileSide, PotentialNeighbour[]>;\n// export function createEmptyAvailableTileNeighbours(): WFCAvailableTileNeighbours {\n// \treturn {\n// \t\ts: [],\n// \t\tn: [],\n// \t\tw: [],\n// \t\te: [],\n// \t\tb: [],\n// \t\tt: [],\n// \t};\n// }\n\nexport const CLOCK_WISE_TILE_SIDES: WFCTileSide[] = ['n', 'e', 's', 'w'];\nexport function rotatedSide(side: WFCTileSide, rotation: number): WFCTileSide {\n\tif (side == 't' || side == 'b') {\n\t\treturn side;\n\t}\n\tconst index = CLOCK_WISE_TILE_SIDES.indexOf(side);\n\treturn CLOCK_WISE_TILE_SIDES[mod(index + rotation, 4)];\n}\n\nexport interface TileConfigStats {\n\tsolid: number;\n\tempty: number;\n}\nexport function configTilesStats(tileConfigs: TileConfig[], target: TileConfigStats) {\n\ttarget.solid = 0;\n\ttarget.empty = 0;\n\tfor (const config of tileConfigs) {\n\t\tif (config.tileId == EMPTY_TILE_ID) {\n\t\t\ttarget.empty++;\n\t\t} else {\n\t\t\ttarget.solid++;\n\t\t}\n\t}\n}\nexport function solidTilesStats(tileConfigs: TileConfig[]): TileConfig[] {\n\treturn tileConfigs.filter((config) => config.tileId != EMPTY_TILE_ID);\n}\n\nexport interface SortedTileIds {\n\tfirst: string;\n\tsecond: string;\n}\nexport function sortTileIds(id0: string, id1: string, target: SortedTileIds, invert = false) {\n\tif (invert) {\n\t\tif (id0 > id1) {\n\t\t\ttarget.first = id0;\n\t\t\ttarget.second = id1;\n\t\t} else {\n\t\t\ttarget.first = id1;\n\t\t\ttarget.second = id0;\n\t\t}\n\t} else {\n\t\tif (id0 < id1) {\n\t\t\ttarget.first = id0;\n\t\t\ttarget.second = id1;\n\t\t} else {\n\t\t\ttarget.first = id1;\n\t\t\ttarget.second = id0;\n\t\t}\n\t}\n}\n\nexport function tileSideUnrotated(xOffset: number, yOffset: number, zOffset: number): WFCTileSide {\n\treturn xOffset < 0 ? 's' : xOffset > 0 ? 'n' : zOffset < 0 ? 'w' : zOffset > 0 ? 'e' : yOffset < 0 ? 'b' : 't';\n}\nexport function neighbourTileSideUnrotated(xOffset: number, yOffset: number, zOffset: number): WFCTileSide {\n\treturn xOffset < 0 ? 'n' : xOffset > 0 ? 's' : zOffset < 0 ? 'e' : zOffset > 0 ? 'w' : yOffset < 0 ? 't' : 'b';\n}\n","export const EMPTY_TILE_ID = '__EMPTY_TILE__';\nexport const GRID_BORDER_ID = '__GRID_BORDER__';\nexport const GRID_BORDER_SIDE_NAME = 'b';\nexport const ERROR_TILE_ID = '__ERROR_TILE__';\nexport const UNRESOLVED_TILE_ID = '__UNRESOLVED_TILE__';\nexport const EMPTY_SIDE_NAME = 'empty';\n","import {Mesh, MeshBasicMaterial, BoxGeometry, Vector3, Object3D} from 'three';\nimport {CoreWFCTileAttribute} from './WFCAttributes';\nimport {EMPTY_SIDE_NAME, EMPTY_TILE_ID, ERROR_TILE_ID, UNRESOLVED_TILE_ID} from './WFCConstant';\nimport {BoxLinesSopOperation} from '../../engine/operations/sop/BoxLines';\n\nconst sizes = new Vector3(1, 1, 1);\nconst divisions = new Vector3(1, 1, 1);\nconst center = new Vector3(0, 0, 0);\nexport function createDefaultEmptyTileObject() {\n\tconst object = BoxLinesSopOperation.createLines({\n\t\tsize: 0.95,\n\t\tsizes,\n\t\tdivisions,\n\t\tcenter,\n\t});\n\tobject.name = EMPTY_TILE_ID;\n\treturn object;\n}\n\nconst SCALE = 0.8;\nexport function createDefaultErrorTileObject() {\n\tconst geometry = new BoxGeometry(SCALE, SCALE, SCALE);\n\tconst material = new MeshBasicMaterial({color: 0xff0000});\n\tconst mesh = new Mesh(geometry, material);\n\tmesh.name = ERROR_TILE_ID;\n\treturn mesh;\n}\nexport function createDefaultUnresolvedTileObject() {\n\tconst geometry = new BoxGeometry(SCALE, SCALE, SCALE);\n\tconst material = new MeshBasicMaterial({color: 0xff00ff});\n\tconst mesh = new Mesh(geometry, material);\n\tmesh.name = UNRESOLVED_TILE_ID;\n\treturn mesh;\n}\nexport function addEmptyTileObjectAttributes(object: Object3D) {\n\tCoreWFCTileAttribute.setTileId(object, EMPTY_TILE_ID);\n\tobject.name = EMPTY_TILE_ID;\n\tCoreWFCTileAttribute.setSideName(object, 's', EMPTY_SIDE_NAME);\n\tCoreWFCTileAttribute.setSideName(object, 'n', EMPTY_SIDE_NAME);\n\tCoreWFCTileAttribute.setSideName(object, 'w', EMPTY_SIDE_NAME);\n\tCoreWFCTileAttribute.setSideName(object, 'e', EMPTY_SIDE_NAME);\n\tCoreWFCTileAttribute.setSideName(object, 'b', EMPTY_SIDE_NAME);\n\tCoreWFCTileAttribute.setSideName(object, 't', EMPTY_SIDE_NAME);\n\n\treturn object;\n}\nexport function addErrorTileObjectAttributes(object: Object3D) {\n\tCoreWFCTileAttribute.setIsErrorTile(object, true);\n\tobject.name = ERROR_TILE_ID;\n\treturn object;\n}\nexport function addUnresolvedTileObjectAttributes(object: Object3D) {\n\tCoreWFCTileAttribute.setIsUnresolvedTile(object, true);\n\tobject.name = UNRESOLVED_TILE_ID;\n\treturn object;\n}\n","import {Group, Object3D} from 'three';\nimport {CoreObjectType, ObjectContent} from '../geometry/ObjectContent';\nimport {CoreWFCRuleAttribute} from './WFCAttributes';\nimport {WFCTileSide, WFCRule} from './WFCCommon';\n\nexport function validRuleObject(object: ObjectContent<CoreObjectType>) {\n\tconst id0 = CoreWFCRuleAttribute.getId0(object) as string | undefined;\n\tconst id1 = CoreWFCRuleAttribute.getId1(object) as string | undefined;\n\tconst side0 = CoreWFCRuleAttribute.getSide0(object) as WFCTileSide | undefined;\n\tconst side1 = CoreWFCRuleAttribute.getSide1(object) as WFCTileSide | undefined;\n\treturn id0 != undefined && id1 != undefined && side0 != undefined && side1 != undefined;\n}\nexport function wfcRuleFromObject(object: ObjectContent<CoreObjectType>): WFCRule {\n\tconst connection: WFCRule = {\n\t\tid0: CoreWFCRuleAttribute.getId0(object),\n\t\tid1: CoreWFCRuleAttribute.getId1(object),\n\t\tside0: CoreWFCRuleAttribute.getSide0(object) as WFCTileSide,\n\t\tside1: CoreWFCRuleAttribute.getSide1(object) as WFCTileSide,\n\t};\n\treturn connection;\n}\nexport function createRuleObject(rule: WFCRule): Object3D {\n\tconst group = new Group();\n\t// CoreWFCConnectionAttribute.setIsConnection(group, true);\n\tCoreWFCRuleAttribute.setId0(group, rule.id0);\n\tCoreWFCRuleAttribute.setId1(group, rule.id1);\n\tCoreWFCRuleAttribute.setSide0(group, rule.side0);\n\tCoreWFCRuleAttribute.setSide1(group, rule.side1);\n\treturn group;\n}\n// export class WFCConnection {\n// \tpublic readonly id0: string;\n// \tpublic readonly id1: string;\n// \tpublic readonly side0: WFCTileSide;\n// \tpublic readonly side1: WFCTileSide;\n// \tconstructor(object: ObjectContent<CoreObjectType>) {\n// \t\tthis.id0 = CoreWFCConnectionAttribute.getId0(object);\n// \t\tthis.id1 = CoreWFCConnectionAttribute.getId1(object);\n// \t\tthis.side0 = CoreWFCConnectionAttribute.getSide0(object) as WFCTileSide;\n// \t\tthis.side1 = CoreWFCConnectionAttribute.getSide1(object) as WFCTileSide;\n// \t}\n// \tstatic validConnectionObject(object: ObjectContent<CoreObjectType>) {\n// \t\tconst id0 = CoreWFCConnectionAttribute.getId0(object) as string | undefined;\n// \t\tconst id1 = CoreWFCConnectionAttribute.getId1(object) as string | undefined;\n// \t\tconst side0 = CoreWFCConnectionAttribute.getSide0(object) as WFCTileSide | undefined;\n// \t\tconst side1 = CoreWFCConnectionAttribute.getSide1(object) as WFCTileSide | undefined;\n// \t\treturn id0 != undefined && id1 != undefined && side0 != undefined && side1 != undefined;\n// \t}\n// }\n","import {NeighbourIndex} from '../geometry/modules/quad/graph/QuadGraphCommon';\nimport {ERROR_TILE_ID, UNRESOLVED_TILE_ID} from './WFCConstant';\nexport type TileRotation = NeighbourIndex;\nexport interface TileConfig {\n\ttileId: string;\n\trotation: TileRotation;\n}\nexport const UNRESOLVED_TILE_CONFIG: TileConfig = {tileId: UNRESOLVED_TILE_ID, rotation: 0};\nexport const ERRORED_TILE_CONFIG: TileConfig = {tileId: ERROR_TILE_ID, rotation: 0};\n\nconst TILE_CONFIG_ELEMENT_SEPARATOR = ':';\nconst TILE_CONFIGS_SEPARATOR = ',';\nexport function tileConfigToString(tileConfig: TileConfig): string {\n\treturn `${tileConfig.tileId}${TILE_CONFIG_ELEMENT_SEPARATOR}${tileConfig.rotation}`;\n}\nexport function tileConfigsToString(tileConfigs: TileConfig[]): string {\n\treturn tileConfigs.map(tileConfigToString).join(TILE_CONFIGS_SEPARATOR);\n}\nexport function stringToTileConfigs(tileConfigsString: string): TileConfig[] {\n\tconst tileConfigElements = tileConfigsString.split(TILE_CONFIGS_SEPARATOR);\n\treturn tileConfigElements.map((tileConfigString) => {\n\t\tconst tileConfigElements = tileConfigString.split(TILE_CONFIG_ELEMENT_SEPARATOR);\n\t\treturn {\n\t\t\ttileId: tileConfigElements[0],\n\t\t\trotation: parseInt(tileConfigElements[1]) as TileRotation,\n\t\t};\n\t});\n}\n","// import {pushOnArrayAtEntry} from '../MapUtils';\nimport {CoreWFCTileAttribute} from './WFCAttributes';\nimport {WFCTileSide, WFCRule, sortTileIds, SortedTileIds, ALL_SIDES} from './WFCCommon';\nimport {createDefaultErrorTileObject, createDefaultUnresolvedTileObject} from './WFCDebugTileObjects';\nimport {validRuleObject, wfcRuleFromObject} from './WFCRule';\nimport {filterTileObjects, filterRuleObjects} from './WFCUtils';\nimport {Object3D} from 'three';\n\nconst _sortedTileIds: SortedTileIds = {\n\tfirst: '',\n\tsecond: '',\n};\ntype TraverseRulesCallback = (id0: string, id1: string, side0: WFCTileSide, side1: WFCTileSide) => void;\ntype TraverseUnconnectedSidesCallback = (side: WFCTileSide[]) => void;\n\ntype RulesByTileId = Map<string, Map<string, Map<WFCTileSide, Set<WFCTileSide>>>>;\nfunction _addRule(rule: WFCRule, rulesByTileId: RulesByTileId, invert: boolean) {\n\tsortTileIds(rule.id0, rule.id1, _sortedTileIds, invert);\n\tlet mapForId0 = rulesByTileId.get(_sortedTileIds.first);\n\tif (!mapForId0) {\n\t\tmapForId0 = new Map();\n\t\trulesByTileId.set(_sortedTileIds.first, mapForId0);\n\t}\n\tlet sides = mapForId0.get(_sortedTileIds.second);\n\tif (!sides) {\n\t\tsides = new Map();\n\t\tmapForId0.set(_sortedTileIds.second, sides);\n\t}\n\tlet inverted = rule.id0 != _sortedTileIds.first;\n\tconst _side0 = inverted ? rule.side1 : rule.side0;\n\tconst _side1 = inverted ? rule.side0 : rule.side1;\n\tconst side0s = _side0.split('') as WFCTileSide[];\n\tconst side1s = _side1.split('') as WFCTileSide[];\n\tfor (const side0 of side0s) {\n\t\tfor (const side1 of side1s) {\n\t\t\tlet side1s = sides.get(side0);\n\t\t\tif (!side1s) {\n\t\t\t\tside1s = new Set();\n\t\t\t\tsides.set(side0, side1s);\n\t\t\t}\n\t\t\tif (!side1s.has(side1)) {\n\t\t\t\tside1s.add(side1);\n\t\t\t}\n\t\t}\n\t}\n}\ninterface WFCTilesCollectionOptions {\n\ttileAndRuleObjects: Object3D[];\n}\nexport class WFCTilesCollection {\n\tprivate _tiles: Object3D[];\n\tprivate _tilesById: Map<string, Object3D>;\n\tprivate _rulesByTileId: RulesByTileId = new Map();\n\t//\n\t// private _emptyTileObject: Object3D | null;\n\tprivate _errorTileObject: Object3D | null;\n\tprivate _unresolvedTileObject: Object3D | null;\n\t//\n\tconstructor(options: WFCTilesCollectionOptions) {\n\t\tthis._errorTileObject =\n\t\t\toptions.tileAndRuleObjects.find((o) => CoreWFCTileAttribute.getIsErrorTile(o)) ||\n\t\t\tcreateDefaultErrorTileObject();\n\t\tthis._unresolvedTileObject =\n\t\t\toptions.tileAndRuleObjects.find((o) => CoreWFCTileAttribute.getIsUnresolvedTile(o)) ||\n\t\t\tcreateDefaultUnresolvedTileObject();\n\t\tthis._tiles = filterTileObjects(options.tileAndRuleObjects);\n\t\tthis._tilesById = new Map();\n\t\tfor (const tile of this._tiles) {\n\t\t\tthis._tilesById.set(CoreWFCTileAttribute.getTileId(tile), tile);\n\t\t}\n\n\t\t// create connections from connection objects\n\t\tconst ruleObjects = filterRuleObjects(options.tileAndRuleObjects);\n\t\tconst rules = ruleObjects.filter(validRuleObject).map(wfcRuleFromObject);\n\t\tfor (const rule of rules) {\n\t\t\tsortTileIds(rule.id0, rule.id1, _sortedTileIds);\n\t\t\t_addRule(rule, this._rulesByTileId, false);\n\t\t\t_addRule(rule, this._rulesByTileId, true);\n\t\t}\n\t}\n\ttiles() {\n\t\treturn this._tiles;\n\t}\n\ttile(tileId: string) {\n\t\treturn this._tilesById.get(tileId);\n\t}\n\terrorTile() {\n\t\treturn this._errorTileObject;\n\t}\n\tunresolvedTile() {\n\t\treturn this._unresolvedTileObject;\n\t}\n\ttraverseRules(id0: string, id1: string, callback: TraverseRulesCallback): void {\n\t\tsortTileIds(id0, id1, _sortedTileIds);\n\t\tconst mapForFirst = this._rulesByTileId.get(_sortedTileIds.first);\n\t\tif (!mapForFirst) {\n\t\t\treturn;\n\t\t}\n\t\tconst sides = mapForFirst.get(_sortedTileIds.second);\n\t\tif (!sides) {\n\t\t\treturn;\n\t\t}\n\t\tsides.forEach((side1s, side0) => {\n\t\t\tside1s.forEach((side1) => {\n\t\t\t\tcallback(_sortedTileIds.first, _sortedTileIds.second, side0, side1);\n\t\t\t});\n\t\t});\n\t}\n\ttraverseUnconnectedSides(id: string, callback: TraverseUnconnectedSidesCallback): void {\n\t\tconst mapForFirst = this._rulesByTileId.get(id);\n\t\tif (!mapForFirst) {\n\t\t\tcallback(ALL_SIDES);\n\t\t\treturn;\n\t\t}\n\t\tconst unconnectedSides = [...ALL_SIDES];\n\t\tmapForFirst.forEach((sides, id1) => {\n\t\t\tsides.forEach((side1s, side0) => {\n\t\t\t\tconst index = unconnectedSides.indexOf(side0);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\tunconnectedSides.splice(index, 1);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tcallback(unconnectedSides);\n\t}\n\tallowedTileConfig(id0: string, side0: WFCTileSide, id1: string, side1: WFCTileSide): boolean {\n\t\t// console.log('allowedTileConfig', {id0, side0, id1, side1});\n\t\tsortTileIds(id0, id1, _sortedTileIds);\n\t\tconst mapForFirst = this._rulesByTileId.get(_sortedTileIds.first);\n\t\tif (!mapForFirst) {\n\t\t\treturn false;\n\t\t}\n\t\tconst sides = mapForFirst.get(_sortedTileIds.second);\n\t\tif (!sides) {\n\t\t\treturn false;\n\t\t}\n\t\tlet inverted = id0 != _sortedTileIds.first;\n\t\tconst key = inverted ? side1 : side0;\n\t\tconst value = inverted ? side0 : side1;\n\t\tconst side1s = sides.get(key);\n\t\tif (!side1s) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn side1s.has(value);\n\t}\n}\n","import {CoreObjectType, ObjectContent, isObject3D} from '../geometry/ObjectContent';\nimport {QuadObject} from '../geometry/modules/quad/QuadObject';\nimport {QuadPrimitive} from '../geometry/modules/quad/QuadPrimitive';\nimport {CoreWFCTileAttribute, CoreWFCRuleAttribute, WFCQuadAttribute} from './WFCAttributes';\n\nexport function filterTileObjects(objects: ObjectContent<CoreObjectType>[]) {\n\treturn objects.filter((object) => CoreWFCTileAttribute.getIsTile(object)).filter(isObject3D);\n}\nexport function filterRuleObjects(objects: ObjectContent<CoreObjectType>[]) {\n\treturn objects.filter((object) => CoreWFCRuleAttribute.getIsConnection(object));\n}\n\nexport function isQuadNodeSolveAllowed(quadObject: QuadObject, index: number): boolean {\n\tconst hasSolveAllowedAttribute = QuadPrimitive.hasAttribute(quadObject, WFCQuadAttribute.SOLVE_ALLOWED);\n\tif (!hasSolveAllowedAttribute) {\n\t\t// if the solveAllowed attribute is not found,\n\t\t// the quadNode is considered solveAllowed==true\n\t\treturn true;\n\t}\n\n\tconst solveAllowed: boolean | undefined = QuadPrimitive.attribValue(\n\t\tquadObject,\n\t\tindex,\n\t\tWFCQuadAttribute.SOLVE_ALLOWED\n\t) as boolean | undefined;\n\tif (solveAllowed == null) {\n\t\treturn true;\n\t}\n\treturn solveAllowed;\n}\nexport function quadPrimitiveFloorIndex(quadObject: QuadObject, index: number): number {\n\tconst floorIndex = QuadPrimitive.attribValue(quadObject, index, WFCQuadAttribute.FLOOR_INDEX) as number | undefined;\n\tif (floorIndex == null) {\n\t\treturn 0;\n\t}\n\treturn floorIndex;\n}\nexport function quadId(quadObject: QuadObject, index: number): number {\n\tconst quadId = QuadPrimitive.attribValue(quadObject, index, WFCQuadAttribute.QUAD_ID) as number | undefined;\n\tif (quadId == null) {\n\t\treturn -1;\n\t}\n\treturn quadId;\n}\n","import {\n\tWebGLRenderer,\n\tWebGLRendererParameters,\n\tWebGLRenderTarget,\n\tRenderTargetOptions,\n\tNoColorSpace,\n\tNoToneMapping,\n} from 'three';\nimport type {AbstractRenderer} from '../viewers/Common';\nimport {WEBGL_RENDERER_DEFAULT_PARAMS} from '../../core/render/Common';\nimport {PolyEngine} from '../Poly';\n\nexport interface WithPolyId {\n\t_polygonId?: number;\n}\nexport interface WithContextId {\n\t_polygonjsContextId?: number;\n}\nexport interface POLYAbstractRenderer extends AbstractRenderer, WithPolyId {}\nexport interface CanvasContext extends WebGLRenderingContext, WithContextId {}\n\nconst CONTEXT_OPTIONS: WebGLContextAttributes = {\n\t// powerPreference: 'high-performance', // attempt to fix issues in safari\n\t// antialias: false, // leave that to the renderer node\n\t// preserveDrawingBuffer: true, // this could only be useful to capture static images\n};\n\nenum WebGLContext {\n\tWEBGL = 'webgl',\n\tWEBGL2 = 'webgl2',\n\tEXPERIMENTAL_WEBGL = 'experimental-webgl',\n\tEXPERIMENTAL_WEBGL2 = 'experimental-webgl2',\n}\nlet nextRendererId: number = 0;\n\nexport class RenderersController {\n\tprivate static _nextGlContextId = 0;\n\t// private _firstRenderer: WebGLRenderer | null = null;\n\t// private _lastRenderer: WebGLRenderer | null = null;\n\tprivate _printDebug = false;\n\tprivate _requireWebGL2: boolean = false;\n\t// private _resolves: Callback[] = [];\n\tprivate _webgl2_available: boolean | undefined;\n\t// private _env_maps: TextureByString = {};\n\t// private _next_env_map_id: number = 0;\n\tprivate _webGLContextByCanvas: Map<HTMLCanvasElement, WebGLRenderingContext> = new Map();\n\tprivate _defaultRendererByCanvas = new Map<HTMLCanvasElement, WebGLRenderer>();\n\n\tconstructor(public readonly poly: PolyEngine) {}\n\n\tdispose() {\n\t\tthis._webGLContextByCanvas.clear();\n\t\tthis._defaultRendererByCanvas.forEach((renderer) => {\n\t\t\trenderer.dispose();\n\t\t});\n\t\tthis._defaultRendererByCanvas.clear();\n\t}\n\n\tsetPrintDebug(state: boolean = true) {\n\t\tthis._printDebug = state;\n\t}\n\tprintDebug() {\n\t\treturn this._printDebug;\n\t}\n\tprintDebugMessage(message: any) {\n\t\tif (!this._printDebug) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.warn('[Poly debug]', message);\n\t}\n\n\tsetRequireWebGL2() {\n\t\tif (!this._requireWebGL2) {\n\t\t\tthis._requireWebGL2 = true;\n\t\t}\n\t}\n\twebGL2Available(canvas?: HTMLCanvasElement) {\n\t\tif (this._webgl2_available === undefined) {\n\t\t\tthis._webgl2_available = this._getWebGL2Available(canvas);\n\t\t}\n\t\treturn this._webgl2_available;\n\t}\n\tprivate _getWebGL2Available(canvas?: HTMLCanvasElement) {\n\t\tcanvas = canvas || this.poly.canvasRegister.dummyCanvas();\n\t\treturn (globalThis.WebGL2RenderingContext && canvas.getContext(WebGLContext.WEBGL2)) != null;\n\t}\n\tdefaultWebGLRendererForCanvas(canvas: HTMLCanvasElement) {\n\t\tlet renderer = this._defaultRendererByCanvas.get(canvas);\n\t\tif (!renderer) {\n\t\t\tconst context = this.getRenderingContext(canvas)!;\n\t\t\trenderer = this.createWebGLRenderer({...WEBGL_RENDERER_DEFAULT_PARAMS, canvas, context});\n\t\t\tthis._defaultRendererByCanvas.set(canvas, renderer);\n\t\t}\n\t\treturn renderer;\n\t}\n\t// disposeWebGLRendererForCanvas(canvas: HTMLCanvasElement) {\n\t// \tconst renderer = this._defaultRendererByCanvas.get(canvas);\n\t// \tif (renderer) {\n\t// \t\trenderer.dispose();\n\t// \t\tthis._defaultRendererByCanvas.delete(canvas);\n\t// \t}\n\t// }\n\n\tcreateWebGLRenderer(params: WebGLRendererParameters) {\n\t\tconst renderer = new WebGLRenderer(params);\n\t\tif (params.canvas != null && params.canvas instanceof HTMLCanvasElement) {\n\t\t\tthis.poly.canvasRegister.registerCanvas(params.canvas, renderer);\n\t\t} else {\n\t\t\tconsole.warn('canvas not registerable');\n\t\t\tconsole.log(params.canvas);\n\t\t}\n\n\t\t// renderer.debug.checkShaderErrors = true;\n\t\t// renderer.debug.onShaderError = (gl, program, glVertexShader, glFragmentShader) => {\n\t\t// \tconsole.log('onShaderError', {gl, program, glVertexShader, glFragmentShader});\n\t\t// \tconsole.log(gl.getShaderSource(glVertexShader));\n\t\t// \tconsole.log(gl.getShaderSource(glFragmentShader));\n\t\t// };\n\n\t\tthis.assignIdToRenderer(renderer);\n\n\t\tthis.printDebugMessage([`create renderer:`, params]);\n\t\treturn renderer;\n\t}\n\n\tassignIdToRenderer(renderer: AbstractRenderer) {\n\t\tif ((renderer as POLYAbstractRenderer)._polygonId != null) {\n\t\t\t// we do not re-assign the id if there is already one\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextId = (nextRendererId += 1);\n\t\t(renderer as POLYAbstractRenderer)._polygonId = nextId;\n\t}\n\trendererId(renderer: AbstractRenderer) {\n\t\tconst id = (renderer as POLYAbstractRenderer)._polygonId;\n\n\t\tif (id == null) {\n\t\t\tconsole.error('renderer has no _polygonId');\n\t\t\treturn;\n\t\t}\n\t\treturn id;\n\t}\n\n\tgetRenderingContext(canvas: HTMLCanvasElement): WebGLRenderingContext | null {\n\t\tlet gl: WebGLRenderingContext | undefined = this._webGLContextByCanvas.get(canvas);\n\t\tif (gl) {\n\t\t\treturn gl;\n\t\t}\n\t\t// if (this._require_webgl2) {\n\t\tgl = this._getRenderingContextWebgl(canvas, true);\n\t\tif (!gl) {\n\t\t\tconsole.warn('failed to create webgl2 context');\n\t\t}\n\t\t// }\n\t\tif (!gl) {\n\t\t\tgl = this._getRenderingContextWebgl(canvas, false);\n\t\t}\n\n\t\tif (!gl) {\n\t\t\tconsole.error('failed to create webgl context');\n\t\t\treturn null;\n\t\t}\n\n\t\tif ((gl as CanvasContext)._polygonjsContextId == null) {\n\t\t\t(gl as CanvasContext)._polygonjsContextId = RenderersController._nextGlContextId++;\n\t\t}\n\t\tthis._webGLContextByCanvas.set(canvas, gl);\n\n\t\t// gl.getExtension('OES_standard_derivatives') // for derivative normals, but it cannot work at the moment (see node Gl/DerivativeNormals)\n\t\t// to test data texture\n\t\t// gl.getExtension('OES_texture_float')\n\t\t// gl.getExtension('OES_texture_float_linear')\n\n\t\treturn gl;\n\t}\n\tprivate _getRenderingContextWebgl(canvas: HTMLCanvasElement, webgl2: boolean): WebGLRenderingContext | undefined {\n\t\tlet contextName: WebGLContext;\n\t\tif (this.webGL2Available(canvas)) {\n\t\t\tcontextName = WebGLContext.WEBGL2;\n\t\t} else {\n\t\t\tcontextName = webgl2 ? WebGLContext.WEBGL2 : WebGLContext.WEBGL;\n\t\t}\n\t\tlet gl = canvas.getContext(contextName, CONTEXT_OPTIONS);\n\t\tif (gl) {\n\t\t\tthis.printDebugMessage(`create gl context: ${contextName}.`);\n\t\t} else {\n\t\t\tcontextName = webgl2 ? WebGLContext.EXPERIMENTAL_WEBGL2 : WebGLContext.EXPERIMENTAL_WEBGL;\n\t\t\tthis.printDebugMessage(`create gl context: ${contextName}.`);\n\t\t\tgl = canvas.getContext(contextName, CONTEXT_OPTIONS);\n\t\t}\n\n\t\treturn gl as WebGLRenderingContext | undefined;\n\t}\n\n\tcreateRenderTarget(width: number, height: number, parameters: RenderTargetOptions) {\n\t\tif (this.webGL2Available()) {\n\t\t\tconst multiSampleRenderTarget = new WebGLRenderTarget(width, height, parameters);\n\t\t\tmultiSampleRenderTarget.samples = 2;\n\t\t\treturn multiSampleRenderTarget;\n\t\t} else {\n\t\t\treturn new WebGLRenderTarget(width, height, parameters);\n\t\t}\n\t}\n\n\t/*\n\t *\n\t * Linear renderer, used for cop/builder, cop/render\n\t *\n\t */\n\tprivate _linearRenderer: WebGLRenderer | undefined;\n\tlinearRenderer() {\n\t\treturn (this._linearRenderer = this._linearRenderer || this._createLinearRenderer());\n\t}\n\tprivate _createLinearRenderer() {\n\t\tconst canvas = this.poly.canvasRegister.findOrCreateCanvas();\n\t\tconst gl = this.getRenderingContext(canvas);\n\t\tif (!gl) {\n\t\t\treturn;\n\t\t}\n\t\tconst renderer = this.createWebGLRenderer({\n\t\t\t// antialias: true,\n\t\t\t// stencil: true,\n\t\t\t// depth: false,\n\t\t\talpha: true,\n\t\t\tpremultipliedAlpha: true,\n\t\t\tcanvas,\n\t\t\tcontext: gl,\n\t\t});\n\t\tthis.poly.canvasRegister.registerCanvas(canvas, renderer);\n\t\trenderer.outputColorSpace = NoColorSpace;\n\t\trenderer.toneMapping = NoToneMapping;\n\t\treturn renderer;\n\t}\n}\n","// import {OffscreenCanvas} from 'three';\nimport {PolyEngine} from '../Poly';\nimport {AbstractRenderer} from '../viewers/Common';\n\ntype AvailableCanvas = HTMLCanvasElement; // | OffscreenCanvas;\n\nexport class PolyCanvasRegister {\n\tprivate _rendererByCanvas: Map<AvailableCanvas, AbstractRenderer | null> = new Map();\n\tconstructor(public readonly poly: PolyEngine) {}\n\n\tfindOrCreateCanvas() {\n\t\tconst canvas = this._findAvailableCanvas() || this._createCanvas();\n\t\treturn canvas;\n\t}\n\tprivate _findAvailableCanvas() {\n\t\tlet foundCanvas: AvailableCanvas | undefined;\n\t\tthis._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tif (foundCanvas == null && renderer == null) {\n\t\t\t\tfoundCanvas = canvas;\n\t\t\t}\n\t\t});\n\t\treturn foundCanvas;\n\t}\n\tprivate _createCanvas() {\n\t\treturn document.createElement('canvas');\n\t}\n\tregisterCanvas(canvas: AvailableCanvas, renderer: AbstractRenderer) {\n\t\tthis._rendererByCanvas.set(canvas, renderer);\n\t}\n\tderegisterCanvas(canvas: AvailableCanvas) {\n\t\tthis._rendererByCanvas.set(canvas, null);\n\t}\n\n\tprivate _dummyCanvas: AvailableCanvas | undefined;\n\tdummyCanvas() {\n\t\treturn this._dummyCanvas || (this._dummyCanvas = document.createElement('canvas'));\n\t}\n}\n","export class PolyLibsController {\n\tprivate _rootPrefix: string = '';\n\tprivate _root: string | null = '/three/js/libs';\n\n\troot() {\n\t\tif (this._root) {\n\t\t\tif (this._rootPrefix.length > 0) {\n\t\t\t\t// remove heading dots if any\n\t\t\t\tconst root = this._root.replace(/^(\\.)/, '');\n\t\t\t\treturn `${this._rootPrefix}${root}`;\n\t\t\t} else {\n\t\t\t\treturn this._root;\n\t\t\t}\n\t\t}\n\t}\n\tsetRoot(url: string | null) {\n\t\tthis._root = url;\n\t}\n\tsetRootPrefix(prefix: string) {\n\t\tthis._rootPrefix = prefix;\n\t}\n\t//\n\t//\n\t// KTX2\n\t//\n\t//\n\tprivate _KTX2Path: string | null = '/ktx2';\n\tKTX2Path() {\n\t\treturn this._KTX2Path;\n\t}\n\t//\n\t//\n\t// DRACO\n\t//\n\t//\n\tprivate _DRACOPath: string | null = '/draco';\n\t// setDRACOPath(path: string | null) {\n\t// \tthis._DRACOPath = path;\n\t// }\n\tDRACOPath() {\n\t\treturn this._DRACOPath;\n\t}\n\t//\n\t//\n\t// DRACO GLTF\n\t//\n\t//\n\tprivate _DRACOGLTFPath: string | null = '/draco/gltf';\n\t// setDRACOGLTFPath(path: string | null) {\n\t// \tthis._DRACOGLTFPath = path;\n\t// }\n\tDRACOGLTFPath() {\n\t\treturn this._DRACOGLTFPath;\n\t}\n\t//\n\t//\n\t// XATLAS\n\t//\n\t//\n\tprivate _XATLASPath: string | null = '/xatlas';\n\t// setDRACOGLTFPath(path: string | null) {\n\t// \tthis._DRACOGLTFPath = path;\n\t// }\n\tXATLASPath() {\n\t\treturn this._XATLASPath;\n\t}\n\t//\n\t//\n\t// OCCT\n\t//\n\t//\n\tprivate _OCCTPath: string | null = '/occt';\n\tOCCTPath() {\n\t\treturn this._OCCTPath;\n\t}\n\t//\n\t//\n\t// MANIFOLD\n\t//\n\t//\n\tprivate _ManifoldPath: string | null = '/manifold';\n\tManifoldPath() {\n\t\treturn this._ManifoldPath;\n\t}\n}\n","import {BaseNodeType} from '../nodes/_Base';\nimport {PolyEngine} from '../Poly';\nimport {CoreGraphNodeId} from '../../core/graph/CoreGraph';\nexport interface BlobUrlData {\n\tblobUrl: string;\n}\nexport interface BlobsControllerFetchNodeOptions {\n\tmultiAssetsForNode?: boolean;\n}\nexport interface FetchNodeBlobUrlOptions extends BlobsControllerFetchNodeOptions {\n\tfullUrl: string;\n\tnode: BaseNodeType;\n}\n\nexport interface FetchBlobResponse {\n\tblobWrapper?: BlobWrapper;\n\terror?: string;\n}\n\ninterface BlobWrapper {\n\tblob: Blob;\n\tblobUrl: string;\n\treferringNodeIds: Set<CoreGraphNodeId>;\n}\n\ninterface BlobData {\n\turl: string;\n\tblobWrapper: BlobWrapper;\n}\ntype BlobDataCallback = (params: BlobData) => void;\nexport class BlobsController {\n\tconstructor(private poly: PolyEngine) {}\n\n\trecording() {\n\t\treturn !this.poly.playerMode();\n\t}\n\n\tclear() {}\n\tclearBlobsForNode(node: BaseNodeType) {}\n\n\tasync setVirtualFile(file: File, uniqueId: string) {}\n\n\tasync fetchBlobGlobal(url: string): Promise<FetchBlobResponse | void> {}\n\n\ttraverse(callback: BlobDataCallback) {}\n}\n","import {PolyDictionary} from '../../types/GlobalTypes';\n\nexport class AssetUrlsController {\n\tprivate _map: PolyDictionary<string> | undefined;\n\n\tsetMap(map: PolyDictionary<string>) {\n\t\tthis._map = map;\n\t}\n\n\tremapedUrl(url: string) {\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\t\tconst elements = url.split('?');\n\t\tconst preQuery = elements[0];\n\t\tconst query = elements[1];\n\t\tconst remapedUrl = this._map[preQuery];\n\t\tif (remapedUrl) {\n\t\t\tif (query) {\n\t\t\t\treturn `${remapedUrl}?${query}`;\n\t\t\t} else {\n\t\t\t\treturn remapedUrl;\n\t\t\t}\n\t\t}\n\t}\n}\n","interface PerformanceManager {\n\tnow: () => number;\n}\n\nexport class PolyPerformanceformanceController {\n\tprivate _performanceManager: PerformanceManager | undefined;\n\tsetPerformanceManager(p: PerformanceManager) {\n\t\tthis._performanceManager = p;\n\t}\n\tperformanceManager(): PerformanceManager {\n\t\treturn this._performanceManager || globalThis.performance;\n\t}\n}\n","import {PolyScene} from '../scene/PolyScene';\n\nexport class ScenesRegister {\n\tprivate _lastRegisteredScene: PolyScene | undefined;\n\tprivate _scenes: Set<PolyScene> = new Set();\n\tprivate _registerTimeByScene: Map<PolyScene, number> = new Map();\n\n\tregisterScene(scene: PolyScene) {\n\t\tif (this._scenes.has(scene)) {\n\t\t\tconsole.warn('scene was already registered');\n\t\t\treturn;\n\t\t}\n\n\t\tthis._scenes.add(scene);\n\t\tthis._registerTimeByScene.set(scene, performance.now());\n\t\tthis._updateCache();\n\t}\n\tderegisterScene(scene: PolyScene) {\n\t\tthis._scenes.delete(scene);\n\t\tthis._registerTimeByScene.delete(scene);\n\t\tthis._updateCache();\n\t}\n\tdispose() {\n\t\tconst scenes = this.scenes();\n\t\tfor (const scene of scenes) {\n\t\t\tscene.dispose();\n\t\t}\n\t}\n\tlastRegisteredScene() {\n\t\treturn this._lastRegisteredScene;\n\t}\n\tscenes() {\n\t\tconst scenes: PolyScene[] = [];\n\t\tthis._scenes.forEach((scene) => scenes.push(scene));\n\t\treturn scenes;\n\t}\n\n\tprivate _updateCache() {\n\t\tthis._lastRegisteredScene = undefined;\n\t\tthis._registerTimeByScene.forEach((registerTime, scene) => {\n\t\t\tif (this._lastRegisteredScene == undefined) {\n\t\t\t\tthis._lastRegisteredScene = scene;\n\t\t\t} else {\n\t\t\t\tconst lastRegisterTime = this._registerTimeByScene.get(this._lastRegisteredScene);\n\t\t\t\tif (registerTime != null && lastRegisterTime != null) {\n\t\t\t\t\tif (registerTime > lastRegisterTime) {\n\t\t\t\t\t\tthis._lastRegisteredScene = scene;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import type {CoreMarkerTrackingController} from '../../../core/webXR/markerTracking/MarkerTrackingController';\nimport type {CoreMarkerTrackingControllerOptions} from '../../../core/webXR/markerTracking/Common';\n\nexport type MarkerTrackingControllerCreateFunc = (\n\toptions: CoreMarkerTrackingControllerOptions\n) => CoreMarkerTrackingController;\nexport type MarkerTrackingBarCodeUrlFunc = (type: string, value: number) => string;\n\nexport interface MarkerTrackingConfig {\n\tbarcodeUrl: MarkerTrackingBarCodeUrlFunc;\n\tcreateController: MarkerTrackingControllerCreateFunc;\n\tbarCodes: {\n\t\ttypes: string[];\n\t\tvaluesCountByType: Record<string, number>;\n\t};\n}\n\nexport class PolyMarkerTrackingController {\n\tprivate _config: MarkerTrackingConfig | undefined;\n\tprivate _controller: CoreMarkerTrackingController | null = null;\n\tsetConfig(config: MarkerTrackingConfig) {\n\t\tthis._config = config;\n\t}\n\tbarCodeUrl(type: string, value: number): string | void {\n\t\tif (this._config) {\n\t\t\treturn this._config.barcodeUrl(type, value);\n\t\t}\n\t}\n\tbarCodeTypes() {\n\t\treturn this._config?.barCodes.types || [''];\n\t}\n\tconfig() {\n\t\treturn this._config;\n\t}\n\n\thasController(): boolean {\n\t\treturn this._config != null;\n\t}\n\n\tcreateController(options: CoreMarkerTrackingControllerOptions) {\n\t\tif (!this._config) {\n\t\t\treturn;\n\t\t}\n\t\tconst controller = this._config.createController(options);\n\t\tthis._controller = controller;\n\t\treturn controller;\n\t}\n\n\tcontroller() {\n\t\treturn this._controller;\n\t}\n}\n","import {PolyThirdPartyMapboxController} from './thirdParty/Mapbox';\nimport {PolyMarkerTrackingController} from './thirdParty/MarkerTracking';\n\nexport class PolyThirdPartyController {\n\t//\n\tprivate _markerTracking: PolyMarkerTrackingController | undefined;\n\tmarkerTracking() {\n\t\treturn (this._markerTracking = this._markerTracking || new PolyMarkerTrackingController());\n\t}\n\t//\n\tprivate _mapbox: PolyThirdPartyMapboxController | undefined;\n\tmapbox() {\n\t\treturn (this._mapbox = this._mapbox || new PolyThirdPartyMapboxController());\n\t}\n}\n","import {BaseNodeType} from '../nodes/_Base';\n\ntype Hook = () => void;\ntype HookByNode = Map<BaseNodeType, Hook>;\n\nexport class PolyOnSceneUpdatedHooksController {\n\tprivate _map: HookByNode = new Map();\n\tprivate _hooks: Hook[] | undefined;\n\tregisterHook(node: BaseNodeType, hook: Hook) {\n\t\tthis._map.set(node, hook);\n\t\tthis._updateCache();\n\t}\n\tunregisterHook(node: BaseNodeType) {\n\t\tthis._map.delete(node);\n\t\tthis._updateCache();\n\t}\n\trunHooks() {\n\t\tconst hooks = this._hooks;\n\t\tif (!hooks) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let hook of hooks) {\n\t\t\thook();\n\t\t}\n\t}\n\thookedNodes() {\n\t\treturn Array.from(this._map.keys());\n\t}\n\tprivate _updateCache() {\n\t\tif (this._map.size == 0) {\n\t\t\tthis._hooks = undefined;\n\t\t} else {\n\t\t\tthis._hooks = this._hooks || [];\n\t\t\tthis._hooks.length = 0;\n\t\t\tconst hooks = this._hooks;\n\t\t\tthis._map.forEach((hook) => hooks.push(hook));\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {CoreGroup} from '../../core/geometry/Group';\nimport {BaseSopNodeType} from '../nodes/sop/_Base';\nimport type {CSGOBJTesselationParams} from '../../core/geometry/modules/csg/CsgCommon';\nimport type {CADOBJTesselationParams} from '../../core/geometry/modules/cad/CadCommon';\nimport type {QUADOBJTesselationParams} from '../../core/geometry/modules/quad/QuadCommon';\nimport type {TetOBJTesselationParams} from '../../core/geometry/modules/tet/TetCommon';\n// import type {SDFOBJTesselationParams} from '../../core/geometry/modules/sdf/SDFCommon';\ninterface Params\n\textends CSGOBJTesselationParams,\n\t\tCADOBJTesselationParams,\n\t\tQUADOBJTesselationParams /*, SDFOBJTesselationParams*/,\n\t\tTetOBJTesselationParams {}\n\nexport type SpecializedChildrenHook = (\n\tdisplayNode: BaseSopNodeType,\n\tcoreGroup: CoreGroup,\n\tnewObjects: Object3D[],\n\tparams: Params\n) => boolean;\ntype HookByName = Map<string, SpecializedChildrenHook>;\n\nexport class PolySpecializedChildrenController {\n\tprivate _map: HookByName = new Map();\n\tprivate _hooks: Array<SpecializedChildrenHook> | undefined;\n\tregisterHook(hookName: string, hook: SpecializedChildrenHook) {\n\t\tthis._map.set(hookName, hook);\n\t\tthis._updateCache();\n\t}\n\tprivate _updateCache() {\n\t\tthis._hooks = [];\n\t\tconst hooks = this._hooks;\n\t\tthis._map.forEach((hook) => {\n\t\t\thooks.push(hook);\n\t\t});\n\t}\n\trunHooks(displayNode: BaseSopNodeType, coreGroup: CoreGroup, newObjects: Object3D[], params: Params): boolean {\n\t\tlet newObjectsAreDifferent = false;\n\t\tif (this._hooks) {\n\t\t\tfor (let hook of this._hooks) {\n\t\t\t\tconst _newObjectsAreDifferent = hook(displayNode, coreGroup, newObjects, params);\n\t\t\t\tif (_newObjectsAreDifferent) {\n\t\t\t\t\tnewObjectsAreDifferent = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn newObjectsAreDifferent;\n\t}\n}\n","import type {PolyEngine} from '../../../Poly';\n\ntype PolyPluginCallback = (poly: PolyEngine) => void;\ninterface PolyPluginOptions {\n\tlibraryName: string;\n\tlibraryImportPath: string;\n\t// no need yet to have a CND entry\n\t// as using the plugins is currently only possible\n\t// when doing js or ts export, NOT with html export\n}\nexport interface PolyPluginData {\n\tname: string;\n\tlibraryName: string;\n\tlibraryImportPath: string;\n}\n\nexport class PolyPlugin {\n\tconstructor(\n\t\tprotected _name: string,\n\t\tprotected _callback: PolyPluginCallback,\n\t\tprotected _options: PolyPluginOptions\n\t) {}\n\n\tname() {\n\t\treturn this._name;\n\t}\n\tlibraryName() {\n\t\treturn this._options.libraryName;\n\t}\n\n\tinit(poly: PolyEngine) {\n\t\tthis._callback(poly);\n\t}\n\n\ttoJSON(): PolyPluginData {\n\t\treturn {\n\t\t\tname: this._name,\n\t\t\tlibraryName: this._options.libraryName,\n\t\t\tlibraryImportPath: this._options.libraryImportPath,\n\t\t};\n\t}\n}\n\nexport type PolyPluginInterface = Pick<PolyPlugin, 'name' | 'libraryName' | 'init' | 'toJSON'>;\n","import {PolyEngine} from '../../../Poly';\nimport {PolyPlugin, PolyPluginData, PolyPluginInterface} from './Plugin';\nimport {BaseNodeConstructor, BaseOperationConstructor} from '../nodes/NodesRegister';\nimport {NodeContext} from '../../NodeContext';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\n\nexport interface PluginsRegisterData {\n\tplugins: PolyDictionary<PolyPluginData>;\n\tnodes: PolyDictionary<PolyDictionary<string>>;\n\toperations: PolyDictionary<PolyDictionary<string>>;\n}\nexport type WrapConfigurePolygonjsCallback = () => void | Promise<void>;\n\nexport class PluginsRegister {\n\t// private _inConfigurePolygonjs: boolean = false;\n\tprivate _configurePolygonjsPlugin: PolyPlugin | undefined;\n\n\tprivate _currentPlugin: PolyPluginInterface | undefined;\n\tprivate _pluginsByName: Map<string, PolyPluginInterface> = new Map();\n\tprivate _pluginNameByNodeContextByType: Map<NodeContext, Map<string, string>> = new Map();\n\tprivate _pluginNameByOperationContextByType: Map<NodeContext, Map<string, string>> = new Map();\n\n\tconstructor(private poly: PolyEngine) {}\n\n\tasync wrapConfigurePolygonjs(callback: WrapConfigurePolygonjsCallback) {\n\t\tthis._configurePolygonjsPlugin =\n\t\t\tthis._configurePolygonjsPlugin ||\n\t\t\tnew PolyPlugin('configurePolygonjs', () => {}, {libraryImportPath: '../PolyConfig', libraryName: ''});\n\n\t\tthis._currentPlugin = this._configurePolygonjsPlugin;\n\t\tthis._pluginsByName.set(this._currentPlugin.name(), this._currentPlugin);\n\t\tawait callback();\n\t\tthis._currentPlugin = undefined;\n\t}\n\n\tregister(plugin: PolyPluginInterface) {\n\t\tconst previousCurrentPlugin = this._currentPlugin;\n\t\tthis._currentPlugin = plugin;\n\t\tthis._pluginsByName.set(plugin.name(), plugin);\n\t\tplugin.init(this.poly);\n\t\tthis._currentPlugin = previousCurrentPlugin;\n\t}\n\tpluginByName(pluginName: string) {\n\t\treturn this._pluginsByName.get(pluginName);\n\t}\n\n\tregisterNode(node: BaseNodeConstructor) {\n\t\tif (!this._currentPlugin) {\n\t\t\treturn;\n\t\t}\n\t\tconst context = node.context();\n\t\tconst type = node.type();\n\t\tlet mapForContext = this._pluginNameByNodeContextByType.get(context);\n\t\tif (!mapForContext) {\n\t\t\tmapForContext = new Map();\n\t\t\tthis._pluginNameByNodeContextByType.set(context, mapForContext);\n\t\t}\n\t\tmapForContext.set(type, this._currentPlugin.name());\n\t}\n\tregisterOperation(operation: BaseOperationConstructor) {\n\t\tif (!this._currentPlugin) {\n\t\t\treturn;\n\t\t}\n\t\tconst context = operation.context();\n\t\tconst type = operation.type();\n\t\tlet mapForContext = this._pluginNameByOperationContextByType.get(context);\n\t\tif (!mapForContext) {\n\t\t\tmapForContext = new Map();\n\t\t\tthis._pluginNameByOperationContextByType.set(context, mapForContext);\n\t\t}\n\t\tmapForContext.set(type, this._currentPlugin.name());\n\t}\n\n\ttoJson() {\n\t\tconst data: PluginsRegisterData = {\n\t\t\tplugins: {},\n\t\t\tnodes: {},\n\t\t\toperations: {},\n\t\t};\n\n\t\tthis._pluginsByName.forEach((plugin, name) => {\n\t\t\tdata.plugins[name] = plugin.toJSON();\n\t\t});\n\n\t\tthis._pluginNameByNodeContextByType.forEach((mapForContext, context) => {\n\t\t\tdata.nodes[context] = {};\n\t\t\tmapForContext.forEach((pluginName, type) => {\n\t\t\t\tdata.nodes[context][type] = pluginName;\n\t\t\t});\n\t\t});\n\t\tthis._pluginNameByOperationContextByType.forEach((mapForContext, context) => {\n\t\t\tdata.operations[context] = {};\n\t\t\tmapForContext.forEach((pluginName, type) => {\n\t\t\t\tdata.operations[context][type] = pluginName;\n\t\t\t});\n\t\t});\n\n\t\treturn data;\n\t}\n}\n","import {Camera, Object3D} from 'three';\nimport {PolyScene} from '../../../scene/PolyScene';\nimport {PolyEngine} from '../../../Poly';\nimport {TypedViewer} from '../../../viewers/_Base';\nimport {AbstractRenderer} from '../../../viewers/Common';\n\nexport interface ViewerCallbackOptions<C extends Camera> {\n\tcamera: C;\n\tscene: PolyScene;\n\tcanvas?: HTMLCanvasElement;\n\trenderer?: AbstractRenderer;\n}\n\nexport type ViewerCreateCallback<C extends Camera> = (options: ViewerCallbackOptions<C>) => TypedViewer<C>;\n\nexport class PolyCamerasRegister {\n\tprivate _cameraNodeTypes: string[] = [];\n\tprivate _registeredViewerCreateCallbackByCamera: Map<typeof Camera, ViewerCreateCallback<Camera>> = new Map();\n\n\tconstructor(poly: PolyEngine) {}\n\n\tregisterNodeType(nodeType: string) {\n\t\tif (!this._cameraNodeTypes.includes(nodeType)) {\n\t\t\tthis._cameraNodeTypes.push(nodeType);\n\t\t}\n\t}\n\tregisteredNodeTypes() {\n\t\treturn this._cameraNodeTypes;\n\t}\n\tregister<C extends Camera>(cameraClass: any, viewerCreateCallback: ViewerCreateCallback<C>) {\n\t\tthis._registeredViewerCreateCallbackByCamera.set(cameraClass, viewerCreateCallback as any);\n\t}\n\tcreateViewer<C extends Camera>(options: ViewerCallbackOptions<C>) {\n\t\tconst callback = this._registeredViewerCreateCallbackByCamera.get(options.camera.constructor as typeof Camera);\n\t\tif (!callback) {\n\t\t\tconsole.error('no createViewer callback available');\n\t\t\tconsole.log(\n\t\t\t\t'createViewer',\n\t\t\t\toptions.camera,\n\t\t\t\toptions.camera.constructor,\n\t\t\t\tthis._registeredViewerCreateCallbackByCamera\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\treturn callback(options);\n\t}\n\tobjectRegistered(object: Object3D) {\n\t\tconst callback = this._registeredViewerCreateCallbackByCamera.get(object.constructor as typeof Camera);\n\t\treturn callback != null;\n\t}\n}\n","import {PolyEngine} from '../../../Poly';\nimport {ModuleName} from './Common';\nimport {BaseModule} from './_BaseModule';\n\nexport interface ModuleRegisterOptions {\n\tprintWarnings?: boolean;\n}\nexport class BaseModulesRegister {\n\tprivate _moduleByName: Map<ModuleName, any> = new Map();\n\tconstructor(private poly: PolyEngine) {}\n\tregister<K extends ModuleName>(moduleName: K, module: BaseModule<K>, options?: ModuleRegisterOptions) {\n\t\tlet printWarnings = options?.printWarnings;\n\t\tif (printWarnings == null) {\n\t\t\tprintWarnings = true;\n\t\t}\n\n\t\tif (this._moduleByName.has(moduleName) && printWarnings) {\n\t\t\tconsole.warn('module already registered', moduleName);\n\t\t\treturn;\n\t\t}\n\t\tthis._moduleByName.set(moduleName, module);\n\t\tmodule.onRegister(this.poly);\n\t}\n\n\tmoduleNames() {\n\t\tconst list: ModuleName[] = [];\n\t\tthis._moduleByName.forEach((module, moduleName) => {\n\t\t\tlist.push(moduleName);\n\t\t});\n\t\treturn list;\n\t}\n}\n","// import {ModulesMap} from './All';\nimport {BaseModulesRegister} from './_BaseRegister';\n\nexport class DynamicModulesRegister extends BaseModulesRegister {\n\t// module<K extends keyof ModulesMap>(moduleName: K): ModulesMap[K] {\n\t// \treturn super.module(moduleName as any);\n\t// }\n}\n","import {ExpressionType} from '../../../expressions/methods/Common';\nimport {BaseMethod} from '../../../expressions/methods/_Base';\n\nexport class BaseExpressionRegister {\n\tprivate _methodsNames: ExpressionType[] = [];\n\tprivate _methodsByName: Map<ExpressionType, typeof BaseMethod> = new Map();\n\n\tregister(expression: typeof BaseMethod, name: ExpressionType) {\n\t\tthis._methodsNames.push(name);\n\t\tthis._methodsByName.set(name, expression);\n\t}\n\tgetMethod(name: ExpressionType) {\n\t\treturn this._methodsByName.get(name);\n\t}\n\tavailableMethods(): ExpressionType[] {\n\t\treturn this._methodsNames;\n\t}\n}\n","import {BaseExpressionRegister} from './_BaseRegister';\nimport {ExpressionMap} from './All';\n\nexport class ExpressionRegister extends BaseExpressionRegister {\n\toverride getMethod<K extends keyof ExpressionMap>(name: K): ExpressionMap[K] | undefined {\n\t\treturn super.getMethod(name as any);\n\t}\n}\n","import {AssemblersMap} from './All';\nimport {BaseAssemblersRegister, AssemblerName} from './_BaseRegister';\nimport {BaseNodeType} from '../../../nodes/_Base';\n\nexport class AssemblersRegister extends BaseAssemblersRegister {\n\tassembler<K extends keyof AssemblersMap>(node: BaseNodeType, name: K): AssemblersMap[K]['controller'] | undefined {\n\t\tconst pair = this._controllerAssemblerByName.get(name as AssemblerName);\n\t\tif (pair) {\n\t\t\tconst {controller, assembler} = pair;\n\t\t\treturn new controller(node, assembler);\n\t\t}\n\t\treturn pair;\n\t}\n\n\toverride unregister<K extends keyof AssemblersMap>(name: K) {\n\t\tconst pair = this._controllerAssemblerByName.get(name as AssemblerName);\n\t\tsuper.unregister(name as AssemblerName);\n\t\treturn pair;\n\t}\n}\n","import {BaseNodeClass, BaseNodeType} from '../../../nodes/_Base';\nimport {BaseOperation} from '../../../operations/_Base';\nimport {NodeContext} from '../../NodeContext';\nimport {PolyEngine} from '../../../Poly';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {isArray} from '../../../../core/Type';\n\nexport interface OperationRegisterOptions {\n\tprintWarnings?: boolean;\n}\nexport interface NodeRegisterOptions {\n\tonly?: string[];\n\texcept?: string[];\n\tuserAllowed?: boolean;\n\tpolyNode?: boolean;\n\tprintWarnings?: boolean;\n}\n\n// export interface BaseNodeConstructor {\n// \tnew (): BaseNode;\n// }\n\nexport type BaseNodeConstructor = typeof BaseNodeClass;\ntype NodeConstructorByType = Map<string, BaseNodeConstructor>;\ntype NodeConstructorByTypeByContext = Map<NodeContext, NodeConstructorByType>;\ntype TabMenuByTypeByContext = Map<NodeContext, Map<string, string[]>>;\ntype RegisterOptionsByTypeByContext = Map<NodeContext, Map<string, NodeRegisterOptions>>;\n\nexport type BaseOperationConstructor = typeof BaseOperation;\ntype OperationConstructorByType = Map<string, BaseOperationConstructor>;\ntype OperationConstructorByTypeByContext = Map<NodeContext, OperationConstructorByType>;\n\nexport type OnNodeRegisterCallback = (poly: PolyEngine) => void;\nexport type OnOperationRegisterCallback = (poly: PolyEngine) => void;\n\nexport class NodesRegister {\n\tprivate _nodesRegister: NodeConstructorByTypeByContext = new Map();\n\tprivate _nodesRegisterCategories: TabMenuByTypeByContext = new Map();\n\tprivate _nodesRegisterOptions: RegisterOptionsByTypeByContext = new Map();\n\n\tconstructor(private poly: PolyEngine) {}\n\n\tprivate static type(node: BaseNodeType | BaseNodeConstructor) {\n\t\treturn this.filterType(node.type());\n\t}\n\tprivate static filterType(nodeType: string) {\n\t\treturn nodeType.toLowerCase();\n\t}\n\n\tregister(node: BaseNodeConstructor, tabMenuCategory?: string | string[], options?: NodeRegisterOptions) {\n\t\tconst context = node.context();\n\t\t// if (node.type()[0].toLowerCase() != node.type()[0]) {\n\t\t// \tconsole.warn(`node type '${node.context()}/${node.type()}' should start with a lower case letter`);\n\t\t// }\n\t\tconst nodeType = NodesRegister.type(node);\n\t\tlet printWarnings = options?.printWarnings;\n\t\tif (printWarnings == null) {\n\t\t\tprintWarnings = true;\n\t\t}\n\n\t\tlet current_nodes_for_context = this._nodesRegister.get(context);\n\t\tif (!current_nodes_for_context) {\n\t\t\tcurrent_nodes_for_context = new Map();\n\t\t\tthis._nodesRegister.set(context, current_nodes_for_context);\n\t\t}\n\n\t\tconst alreadyRegisteredNode = current_nodes_for_context.get(nodeType);\n\t\tif (alreadyRegisteredNode) {\n\t\t\t// if the node that is already registered is a polyNode, it can be overwritten by another polyNode.\n\t\t\tconst isAlreadyRegisteredNodePolyNode =\n\t\t\t\tthis._nodesRegisterOptions.get(context)?.get(nodeType)?.polyNode == true;\n\t\t\tconst isNewNodePolyNode = options?.polyNode == true;\n\t\t\tif (isAlreadyRegisteredNodePolyNode && isNewNodePolyNode) {\n\t\t\t\t// we don't show a warning or return if both are polyNodes\n\t\t\t} else {\n\t\t\t\tif (printWarnings) {\n\t\t\t\t\tconsole.warn(`node ${context}/${nodeType} already registered`);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tcurrent_nodes_for_context.set(nodeType, node);\n\t\tif (node.onRegister) {\n\t\t\tnode.onRegister(this.poly);\n\t\t}\n\n\t\tif (tabMenuCategory) {\n\t\t\tlet current_categories = this._nodesRegisterCategories.get(context);\n\t\t\tif (!current_categories) {\n\t\t\t\tcurrent_categories = new Map();\n\t\t\t\tthis._nodesRegisterCategories.set(context, current_categories);\n\t\t\t}\n\t\t\tconst savedCategory = isArray(tabMenuCategory) ? tabMenuCategory : [tabMenuCategory];\n\t\t\tcurrent_categories.set(nodeType, savedCategory);\n\t\t}\n\n\t\tif (options) {\n\t\t\tlet current_options = this._nodesRegisterOptions.get(context);\n\t\t\tif (!current_options) {\n\t\t\t\tcurrent_options = new Map();\n\t\t\t\tthis._nodesRegisterOptions.set(context, current_options);\n\t\t\t}\n\t\t\tcurrent_options.set(nodeType, options);\n\t\t}\n\t\tthis.poly.pluginsRegister.registerNode(node);\n\t}\n\tderegister(context: NodeContext, nodeType: string) {\n\t\tnodeType = NodesRegister.filterType(nodeType);\n\t\tthis._nodesRegister.get(context)?.delete(nodeType);\n\t\tthis._nodesRegisterCategories.get(context)?.delete(nodeType);\n\t\tthis._nodesRegisterOptions.get(context)?.delete(nodeType);\n\t}\n\tisRegistered(context: NodeContext, nodeType: string): boolean {\n\t\tconst nodes_for_context = this._nodesRegister.get(context);\n\t\tif (!nodes_for_context) {\n\t\t\treturn false;\n\t\t}\n\t\tnodeType = NodesRegister.filterType(nodeType);\n\t\treturn nodes_for_context.get(nodeType) != null;\n\t}\n\tnodeOptions(context: NodeContext, nodeType: string): NodeRegisterOptions | undefined {\n\t\tnodeType = NodesRegister.filterType(nodeType);\n\t\treturn this._nodesRegisterOptions.get(context)?.get(nodeType);\n\t}\n\tregisteredNodesForParentNode(parentNode: BaseNodeType) {\n\t\tconst context = parentNode.childrenController?.context;\n\t\tif (!context) {\n\t\t\treturn [];\n\t\t}\n\t\tconst map = this._nodesRegister.get(context);\n\t\tif (map) {\n\t\t\tconst nodes_for_context: BaseNodeConstructor[] = [];\n\t\t\tthis._nodesRegister.get(context)?.forEach((node, type) => {\n\t\t\t\tnodes_for_context.push(node);\n\t\t\t});\n\t\t\treturn nodes_for_context.filter((node) => {\n\t\t\t\tconst nodeType = NodesRegister.type(node);\n\t\t\t\tconst options = this.nodeOptions(context, nodeType);\n\t\t\t\tif (!options) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tconst parentOptions = this.nodeOptions(parentNode.context(), parentNode.type());\n\t\t\t\t\tif (parentOptions?.polyNode == true) {\n\t\t\t\t\t\t// if parentNode is a polyNode, we should be able to create any node,\n\t\t\t\t\t\t// otherwise we would not be able to create gl/subnetInput and gl/subnetOutput\n\t\t\t\t\t\t// which would be problematic\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tconst option_only = options['only'];\n\t\t\t\t\tconst option_except = options['except'];\n\t\t\t\t\tconst context_and_type = `${parentNode.context()}/${parentNode.type()}`;\n\t\t\t\t\tif (option_only) {\n\t\t\t\t\t\treturn option_only.includes(context_and_type);\n\t\t\t\t\t}\n\t\t\t\t\tif (option_except) {\n\t\t\t\t\t\treturn !option_except.includes(context_and_type);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\tregisteredNodes(parentNode: BaseNodeType): PolyDictionary<BaseNodeConstructor> {\n\t\tconst nodesByType: PolyDictionary<BaseNodeConstructor> = {};\n\t\tconst nodes = this.registeredNodesForParentNode(parentNode);\n\t\tfor (let node of nodes) {\n\t\t\tconst nodeType = NodesRegister.type(node);\n\t\t\tnodesByType[nodeType] = node;\n\t\t}\n\t\treturn nodesByType;\n\t}\n\tregisteredCategory(context: NodeContext, nodeType: string) {\n\t\tnodeType = NodesRegister.filterType(nodeType);\n\t\treturn this._nodesRegisterCategories.get(context)?.get(nodeType);\n\t}\n\n\tmap() {\n\t\treturn this._nodesRegister;\n\t}\n}\n\nexport class OperationsRegister {\n\tprivate _operation_register: OperationConstructorByTypeByContext = new Map();\n\n\tconstructor(private poly: PolyEngine) {}\n\n\tprivate static type(node: BaseOperationConstructor) {\n\t\treturn this.filterType(node.type());\n\t}\n\tprivate static filterType(nodeType: string) {\n\t\treturn nodeType.toLowerCase();\n\t}\n\n\tregister(operation: BaseOperationConstructor, options?: OperationRegisterOptions) {\n\t\tlet printWarnings = options?.printWarnings;\n\t\tif (printWarnings == null) {\n\t\t\tprintWarnings = true;\n\t\t}\n\n\t\tconst context = operation.context();\n\t\tlet current_operations_for_context = this._operation_register.get(context);\n\t\tif (!current_operations_for_context) {\n\t\t\tcurrent_operations_for_context = new Map();\n\t\t\tthis._operation_register.set(context, current_operations_for_context);\n\t\t}\n\n\t\tconst operationType = OperationsRegister.type(operation);\n\t\tconst already_registered_operation = current_operations_for_context.get(operationType);\n\t\tif (already_registered_operation) {\n\t\t\tif (printWarnings) {\n\t\t\t\tconst message = `operation ${context}/${operationType} already registered`;\n\t\t\t\tconsole.warn(message);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcurrent_operations_for_context.set(operationType, operation);\n\t\tif (operation.onRegister) {\n\t\t\toperation.onRegister(this.poly);\n\t\t}\n\t\tthis.poly.pluginsRegister.registerOperation(operation);\n\t}\n\n\tregisteredOperationsForContextAndParentType(context: NodeContext, parentNodeType: string) {\n\t\tconst map = this._operation_register.get(context);\n\t\tif (map) {\n\t\t\tconst nodes_for_context: BaseOperationConstructor[] = [];\n\t\t\tthis._operation_register.get(context)?.forEach((operation, type) => {\n\t\t\t\tnodes_for_context.push(operation);\n\t\t\t});\n\t\t\treturn nodes_for_context;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\tregisteredOperation(context: NodeContext, operationType: string): BaseOperationConstructor | undefined {\n\t\tconst current_operations_for_context = this._operation_register.get(context);\n\t\tif (current_operations_for_context) {\n\t\t\toperationType = OperationsRegister.filterType(operationType);\n\t\t\treturn current_operations_for_context.get(operationType);\n\t\t}\n\t}\n}\n","import {BaseNamedFunction} from '../../../functions/_Base';\n\nexport interface NamedFunctionRegisterOptions {\n\tprintWarnings?: boolean;\n}\nexport class BaseNamedFunctionRegister {\n\tprotected _functionByName: Map<string, typeof BaseNamedFunction> = new Map();\n\n\tregister(namedFunction: typeof BaseNamedFunction, options?: NamedFunctionRegisterOptions) {\n\t\tlet printWarnings = options?.printWarnings;\n\t\tif (printWarnings == null) {\n\t\t\tprintWarnings = true;\n\t\t}\n\n\t\tconst type = namedFunction.type();\n\t\tif (this._functionByName.has(type) && printWarnings) {\n\t\t\tconsole.warn(`namedFunction already registered`, type);\n\t\t}\n\n\t\tthis._functionByName.set(type, namedFunction);\n\t}\n}\n","import {JsLinesCollectionController} from '../../../nodes/js/code/utils/JsLinesCollectionController';\nimport {BaseNodeType} from '../../../nodes/_Base';\nimport {NamedFunctionMap} from './All';\nimport {BaseNamedFunctionRegister} from './_BaseRegister';\n\nexport class NamedFunctionRegister extends BaseNamedFunctionRegister {\n\tgetFunction<K extends keyof NamedFunctionMap>(\n\t\tfunctionName: K,\n\t\tnode: BaseNodeType,\n\t\tshadersCollectionController?: JsLinesCollectionController\n\t): NamedFunctionMap[K] {\n\t\tconst funcClass = this._functionByName.get(functionName);\n\t\tif (!funcClass) {\n\t\t\tconsole.error(`function not registered:'${functionName}'`);\n\t\t}\n\t\tconst func = new (funcClass as any)(node, shadersCollectionController);\n\t\treturn func;\n\t\t// return func as unknown as NamedFunctionMap[K];\n\t}\n}\n","import {BaseNodeClass, BaseNodeType} from './nodes/_Base';\nimport {PolyScene} from './scene/PolyScene';\nimport {RenderersController} from './poly/RenderersController';\nimport {PolyCanvasRegister} from './poly/PolyCanvasRegister';\nimport {PolyLibsController} from './poly/PolyLibsController';\n\nimport {NodeContext} from './poly/NodeContext';\nimport {BaseCoreLogger} from '../core/logger/Base';\nimport {BaseOperation} from './operations/_Base';\nimport {PolyDictionary} from '../types/GlobalTypes';\nimport {BlobsController} from './poly/BlobsController';\nimport {AssetUrlsController} from './poly/AssetUrlsController';\n// import {SelfContainedScenesLoader} from './poly/SelfContainedSceneLoader';\nimport {PolyPerformanceformanceController} from './poly/PerformanceController';\nimport {ScenesRegister} from './poly/ScenesRegister';\n// import {LogoController} from './poly/LogoController';\nimport {PolyThirdPartyController} from './poly/ThirdPartyController';\nimport {PolyOnObjectsAddRemoveHooksController} from './poly/PolyOnObjectsAddRemoveHooksController';\nimport {PolyOnSceneUpdatedHooksController} from './poly/PolyOnSceneUpdatedHooksController';\nimport {PolySpecializedChildrenController} from './poly/PolySpecializedChildrenController';\nimport {Camera} from 'three';\n\n// registers\nimport {PluginsRegister, WrapConfigurePolygonjsCallback} from './poly/registers/plugins/PluginsRegister';\nimport {PolyCamerasRegister, ViewerCreateCallback} from './poly/registers/cameras/PolyCamerasRegister';\nimport {BaseModule} from './poly/registers/modules/_BaseModule';\nimport {ModuleName} from './poly/registers/modules/Common';\nimport {DynamicModulesRegister} from './poly/registers/modules/DynamicModulesRegister';\nimport {ExpressionRegister} from './poly/registers/expressions/ExpressionRegister';\nimport {AssemblersRegister} from './poly/registers/assemblers/AssemblersRegistry';\nimport {\n\tNodesRegister,\n\tNodeRegisterOptions,\n\tOperationRegisterOptions,\n\tBaseNodeConstructor,\n\tOperationsRegister,\n} from './poly/registers/nodes/NodesRegister';\nimport {PolyPluginInterface} from './poly/registers/plugins/Plugin';\nimport {NamedFunctionRegister} from './poly/registers/functions/FunctionsRegister';\nimport {NamedFunctionRegisterOptions} from './poly/registers/functions/_BaseRegister';\nimport {ModuleRegisterOptions} from './poly/registers/modules/_BaseRegister';\nimport {BaseNamedFunction} from './functions/_Base';\n//\n\ndeclare global {\n\tvar __POLYGONJS_POLY_INSTANCE__: PolyEngine;\n}\n\n// having __POLYGONJS_VERSION__ here really adds friction\n// for compiling this after exporting from the editor\n// UPDATE: it can be used now as the editor does not compile anymore\n// and we would use that to check if the editor is the same version as the installed one\ndeclare var __POLYGONJS_VERSION__: string;\nconst POLYGONJS_VERSION = __POLYGONJS_VERSION__;\nexport class PolyEngine {\n\t// static _instance: Poly | undefined;\n\tpublic readonly renderersController: RenderersController = new RenderersController(this);\n\tpublic readonly canvasRegister: PolyCanvasRegister = new PolyCanvasRegister(this);\n\tpublic readonly scenesRegister: ScenesRegister = new ScenesRegister();\n\tpublic readonly nodesRegister: NodesRegister = new NodesRegister(this);\n\tpublic readonly operationsRegister: OperationsRegister = new OperationsRegister(this);\n\tpublic readonly expressionsRegister: ExpressionRegister = new ExpressionRegister();\n\tpublic readonly assemblersRegister: AssemblersRegister = new AssemblersRegister();\n\tpublic readonly pluginsRegister: PluginsRegister = new PluginsRegister(this);\n\tpublic readonly camerasRegister: PolyCamerasRegister = new PolyCamerasRegister(this);\n\tpublic readonly modulesRegister: DynamicModulesRegister = new DynamicModulesRegister(this);\n\tpublic readonly namedFunctionsRegister: NamedFunctionRegister = new NamedFunctionRegister();\n\tpublic readonly blobs: BlobsController = new BlobsController(this);\n\tpublic readonly assetUrls: AssetUrlsController = new AssetUrlsController();\n\t// public readonly logo = new LogoController();\n\tpublic readonly thirdParty = new PolyThirdPartyController();\n\tpublic readonly onObjectsAddRemoveHooks = new PolyOnObjectsAddRemoveHooksController();\n\tpublic readonly onSceneUpdatedHooks = new PolyOnSceneUpdatedHooksController();\n\tpublic readonly specializedChildren = new PolySpecializedChildrenController();\n\t// public readonly selfContainedScenesLoader: SelfContainedScenesLoader = new SelfContainedScenesLoader();\n\tpublic readonly performance: PolyPerformanceformanceController = new PolyPerformanceformanceController();\n\tscenesByUuid: PolyDictionary<PolyScene> = {};\n\t_env: string | undefined;\n\tprivate _playerMode: boolean = true;\n\tprivate _logger: BaseCoreLogger | null = null;\n\n\tstatic _instance_() {\n\t\t// we are using a window globals to ensure 2 instances can never be created\n\t\t// even when the js are compiled by different means,\n\t\t// which can happen in the editor.\n\t\tif (globalThis.__POLYGONJS_POLY_INSTANCE__) {\n\t\t\treturn globalThis.__POLYGONJS_POLY_INSTANCE__;\n\t\t} else {\n\t\t\tconst instance = new PolyEngine();\n\t\t\tglobalThis.__POLYGONJS_POLY_INSTANCE__ = instance;\n\t\t\t// this._instance = instance\n\t\t\treturn globalThis.__POLYGONJS_POLY_INSTANCE__;\n\t\t}\n\t\t// return (this._instance = this._instance || new Poly());\n\t}\n\tprivate constructor() {}\n\n\tversion() {\n\t\treturn POLYGONJS_VERSION;\n\t}\n\n\tsetPlayerMode(mode: boolean) {\n\t\tthis._playerMode = mode;\n\t}\n\tplayerMode() {\n\t\treturn this._playerMode;\n\t}\n\tdispose() {\n\t\tthis.scenesRegister.dispose();\n\t\tthis.renderersController.dispose();\n\t}\n\n\tregisterNode(node: BaseNodeConstructor, tab_menu_category?: string | string[], options?: NodeRegisterOptions) {\n\t\tthis.nodesRegister.register(node, tab_menu_category, options);\n\t}\n\tregisterOperation(operation: typeof BaseOperation, options?: OperationRegisterOptions) {\n\t\tthis.operationsRegister.register(operation, options);\n\t}\n\tregisterNamedFunction(namedFunction: typeof BaseNamedFunction, options?: NamedFunctionRegisterOptions) {\n\t\tthis.namedFunctionsRegister.register(namedFunction, options);\n\t}\n\n\tregisterCamera<C extends Camera>(cameraClass: any, viewerCreateCallback: ViewerCreateCallback<C>) {\n\t\tthis.camerasRegister.register(cameraClass, viewerCreateCallback);\n\t}\n\tregisterCameraNodeType(nodeType: string) {\n\t\tthis.camerasRegister.registerNodeType(nodeType);\n\t}\n\tregisterPlugin(plugin: PolyPluginInterface) {\n\t\tthis.pluginsRegister.register(plugin);\n\t}\n\twrapConfigurePolygonjs(callback: WrapConfigurePolygonjsCallback) {\n\t\tthis.pluginsRegister.wrapConfigurePolygonjs(callback);\n\t}\n\n\tregisteredNodes(parentNode: BaseNodeType): PolyDictionary<typeof BaseNodeClass> {\n\t\treturn this.nodesRegister.registeredNodes(parentNode);\n\t}\n\tregisteredOperation(parent_context: NodeContext, operation_type: string): typeof BaseOperation | undefined {\n\t\treturn this.operationsRegister.registeredOperation(parent_context, operation_type);\n\t}\n\t// registeredCameraTypes() {\n\t// \treturn this.camerasRegister.registeredTypes();\n\t// }\n\tregisterModule(module: BaseModule<ModuleName>, options?: ModuleRegisterOptions) {\n\t\tthis.modulesRegister.register(module.moduleName, module /*.module()*/, options);\n\t}\n\n\tinWorkerThread() {\n\t\treturn false;\n\t}\n\n\t//\n\t//\n\t// LIBS\n\t//\n\t//\n\tprivate _libs_controller: PolyLibsController | undefined;\n\tget libs() {\n\t\treturn (this._libs_controller = this._libs_controller || new PolyLibsController());\n\t}\n\n\t//\n\t//\n\t// ENV\n\t//\n\t//\n\tsetEnv(env: string) {\n\t\tthis._env = env;\n\t}\n\tenv() {\n\t\treturn this._env;\n\t}\n\n\t//\n\t//\n\t// LOGGER\n\t//\n\t//\n\tsetLogger(logger: BaseCoreLogger | null) {\n\t\tthis._logger = logger;\n\t}\n\tlogger() {\n\t\treturn this._logger;\n\t}\n\n\tlog(message?: any, ...optionalParams: any[]) {\n\t\tthis._logger?.log(...[message, ...optionalParams]);\n\t}\n\twarn(message?: any, ...optionalParams: any[]) {\n\t\tthis._logger?.warn(...[message, ...optionalParams]);\n\t}\n\terror(message?: any, ...optionalParams: any[]) {\n\t\tthis._logger?.error(...[message, ...optionalParams]);\n\t}\n}\n\nexport const Poly = PolyEngine._instance_();\n","import {BaseMethodFindDependencyArgs} from './methods/_Base';\nimport {DecomposedPath} from '../../core/DecomposedPath';\nimport {CoreGraphNode} from '../../core/graph/CoreGraphNode';\nimport {BaseParamType} from '../params/_Base';\nimport {BaseNodeType} from '../nodes/_Base';\nimport jsep from 'jsep';\nimport {isString} from '../../core/Type';\n\nexport class MethodDependency extends CoreGraphNode {\n\tpublic jsep_node: jsep.Expression | undefined;\n\tpublic resolved_graph_node: CoreGraphNode | undefined;\n\tpublic unresolved_path: string | undefined;\n\tprivate _updateFromNameChangeBound = this._updateFromNameChange.bind(this);\n\n\tconstructor(\n\t\tpublic param: BaseParamType,\n\t\tpublic pathArgs: BaseMethodFindDependencyArgs,\n\t\tpublic decomposedPath?: DecomposedPath\n\t) {\n\t\tsuper(param.scene(), 'MethodDependency');\n\n\t\tparam.expressionController?.registerMethodDependency(this);\n\n\t\tthis.addPostDirtyHook('_updateFromNameChange', this._updateFromNameChangeBound);\n\t}\n\tprivate _updateFromNameChange(trigger?: CoreGraphNode) {\n\t\tif (trigger && this.decomposedPath) {\n\t\t\tconst node = trigger as BaseNodeType;\n\t\t\tthis.decomposedPath.updateFromNameChange(node);\n\t\t\tconst new_path = this.decomposedPath.toPath();\n\n\t\t\tconst literal = this.jsep_node as jsep.Literal;\n\t\t\tconst {indexOrPath} = this.pathArgs;\n\t\t\tif (literal && isString(indexOrPath)) {\n\t\t\t\tliteral.value = `${literal.value}`.replace(`${indexOrPath}`, new_path);\n\t\t\t\tliteral.raw = literal.raw.replace(`${indexOrPath}`, new_path);\n\t\t\t}\n\t\t\tif (this.param.expressionController) {\n\t\t\t\tthis.param.expressionController.updateFromMethodDependencyNameChange();\n\t\t\t}\n\t\t}\n\t}\n\treset() {\n\t\tthis.graphDisconnectPredecessors();\n\t}\n\n\tlisten_for_name_changes() {\n\t\tif (this.jsep_node && this.decomposedPath) {\n\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\tthis.decomposedPath.namedNodes(nodes);\n\t\t\tfor (const nodeInPath of nodes) {\n\t\t\t\tif (nodeInPath) {\n\t\t\t\t\tconst node = nodeInPath as BaseNodeType;\n\t\t\t\t\tif (node.nameController) {\n\t\t\t\t\t\tthis.addGraphInput(node.nameController.graphNode());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tset_jsep_node(jsep_node: jsep.Expression) {\n\t\tthis.jsep_node = jsep_node;\n\t}\n\tset_resolved_graph_node(node: CoreGraphNode) {\n\t\tthis.resolved_graph_node = node;\n\t}\n\tset_unresolved_path(path: string) {\n\t\tthis.unresolved_path = path;\n\t}\n\n\tstatic create(\n\t\tparam: BaseParamType,\n\t\tpathArgs: BaseMethodFindDependencyArgs,\n\t\tnode: CoreGraphNode,\n\t\tdecomposedPath?: DecomposedPath\n\t) {\n\t\t// if(!decomposed_path){\n\t\t// \tconsole.log('nodes_in_path', decomposed_path.named_nodes);\n\t\t// \tfor (let node_in_path of decomposed_path.named_nodes) {\n\t\t// \t\tif (node_in_path) {\n\t\t// \t\t\tdecomposed_path.add_node(node_in_path.name, node_in_path);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tconst instance = new MethodDependency(param, pathArgs, decomposedPath);\n\t\tif (node) {\n\t\t\tinstance.set_resolved_graph_node(node);\n\t\t} else {\n\t\t\tconst {indexOrPath} = pathArgs;\n\t\t\tif (isString(indexOrPath)) {\n\t\t\t\tinstance.set_unresolved_path(indexOrPath);\n\t\t\t}\n\t\t}\n\t\treturn instance;\n\t}\n}\n","/**\n * @implements {IHooks}\n */\nclass Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n\n//     JavaScript Expression Parser (JSEP) 1.0.2\n\nclass Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '1.0.2';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn  (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t  ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop)};\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\twhile ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE) {\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.PERIOD_CODE) {\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tlet quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: quote + str + quote\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND:        'Compound',\n\tSEQUENCE_EXP:    'SequenceExpression',\n\tIDENTIFIER:      'Identifier',\n\tMEMBER_EXP:      'MemberExpression',\n\tLITERAL:         'Literal',\n\tTHIS_EXP:        'ThisExpression',\n\tCALL_EXP:        'CallExpression',\n\tUNARY_EXP:       'UnaryExpression',\n\tBINARY_EXP:      'BinaryExpression',\n\tARRAY_EXP:       'ArrayExpression',\n\n\tTAB_CODE:    9,\n\tLF_CODE:     10,\n\tCR_CODE:     13,\n\tSPACE_CODE:  32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE:  44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE:  58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10\n\t},\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst staticMethods = Object.getOwnPropertyNames(Jsep);\nstaticMethods\n\t.forEach((m) => {\n\t\tif (jsep[m] === undefined && m !== 'prototype') {\n\t\t\tjsep[m] = Jsep[m];\n\t\t}\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\n\nvar ternary = {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// if binary operator is custom-added (i.e. object plugin), then correct it to a ternary node:\n\t\t\t\telse if (consequent.operator === ':') {\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent: consequent.left,\n\t\t\t\t\t\talternate: consequent.right,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nexport { Jsep, jsep as default };\n","import jsep from 'jsep';\nimport {isString} from '../../../core/Type';\nimport {BaseParamType} from '../../params/_Base';\njsep.addUnaryOp('@');\nlet precedence = 10;\njsep.addBinaryOp('**', precedence);\n// precedence = 1\n// jsep.addBinaryOp('`', precedence)\n// const HOUDINI_QUOTE_CODE = 96; // houdini quote\n// const JSEP_COMPOUND = 'Compound'\nconst JSEP_IDENTIFIER = 'Identifier';\nconst JSEP_LITERAL = 'Literal';\n// const JSEP_BINARY_EXPRESSION = 'BynaryExpression'\nconst JSEP_CALL_EXPRESSION = 'CallExpression';\nconst STRING_EXPRESSION_SEPARATOR = '`';\n\nexport function stringValueElements(v: string): string[] {\n\tif (v != null) {\n\t\tif (isString(v)) {\n\t\t\treturn v.split(STRING_EXPRESSION_SEPARATOR);\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexport class ParsedTree {\n\tprivate _node: jsep.Expression | undefined;\n\tprivate _errorMessage: string | undefined;\n\n\tconstructor(private _param: BaseParamType) {}\n\tnode() {\n\t\treturn this._node;\n\t}\n\terrorMessage() {\n\t\treturn this._errorMessage;\n\t}\n\n\tparseExpression(string: string) {\n\t\ttry {\n\t\t\tthis.reset();\n\t\t\tthis._node = jsep(string);\n\t\t} catch (e) {\n\t\t\tconst message = `could not parse the expression '${string}' (error: ${e})`;\n\t\t\tthis._errorMessage = message;\n\t\t}\n\t}\n\tparseExpressionForStringParam(string: string) {\n\t\ttry {\n\t\t\tthis.reset();\n\n\t\t\tconst elements = stringValueElements(string);\n\t\t\tconst nodes = [];\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\tconst element = elements[i];\n\t\t\t\tlet node: jsep.Expression;\n\t\t\t\tif (i % 2 == 1) {\n\t\t\t\t\tnode = jsep(element);\n\t\t\t\t} else {\n\t\t\t\t\t// if the expression is like:\n\t\t\t\t\t//\n\t\t\t\t\t// <div style='will-change: transform, opacity;'>`@ptnum`</div>\n\t\t\t\t\t//\n\t\t\t\t\t// then the first element here will be:\n\t\t\t\t\t//\n\t\t\t\t\t// <div style='will-change: transform, opacity;'>\n\t\t\t\t\t//\n\t\t\t\t\t// and if we surround it by single quotes (')\n\t\t\t\t\t// the the quotes already inside the element will create a parsing error.\n\t\t\t\t\t// We therefore need to escape them first.\n\t\t\t\t\tconst sanitizedElement = element.replace(/\\'/g, \"\\\\'\");\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: JSEP_LITERAL,\n\t\t\t\t\t\tvalue: `'${sanitizedElement}'`,\n\t\t\t\t\t\traw: `'${sanitizedElement}'`,\n\t\t\t\t\t};\n\t\t\t\t\t// we must add this node to the ignore list of the missing references controller.\n\t\t\t\t\t// If it is not added, a param with the name of the element will be searched for.\n\t\t\t\t\tthis._param.scene().missingExpressionReferencesController.registerToIgnore(node);\n\t\t\t\t}\n\t\t\t\tnodes.push(node);\n\t\t\t\t// nodes.push({\n\t\t\t\t// \ttype: JSEP_CALL_EXPRESSION,\n\t\t\t\t// \targuments: [node],\n\t\t\t\t// \tcallee: {\n\t\t\t\t// \t\ttype: JSEP_IDENTIFIER,\n\t\t\t\t// \t\tname: 'toString',\n\t\t\t\t// \t}\n\t\t\t\t// })\n\t\t\t}\n\t\t\t// let last_plus_node;\n\t\t\t// for(let i=0; i<(nodes.length-1); i++){\n\t\t\t// \tconst plus_node = {\n\t\t\t// \t\ttype: JSEP_BINARY_EXPRESSION,\n\t\t\t// \t\toperator: '+',\n\t\t\t// \t\tleft: last_plus_node || nodes[i],\n\t\t\t// \t\tright: nodes[i+1],\n\t\t\t// \t}\n\t\t\t// \tlast_plus_node = plus_node;\n\t\t\t// }\n\t\t\t// this.node = last_plus_node\n\t\t\tthis._node = (<unknown>{\n\t\t\t\ttype: JSEP_CALL_EXPRESSION,\n\t\t\t\targuments: nodes,\n\t\t\t\tcallee: {\n\t\t\t\t\ttype: JSEP_IDENTIFIER,\n\t\t\t\t\tname: 'strConcat',\n\t\t\t\t},\n\t\t\t}) as jsep.Compound;\n\t\t} catch (e) {\n\t\t\tconst message = `could not parse the expression '${string}' (error: ${e})`;\n\t\t\tthis._errorMessage = message;\n\t\t}\n\t}\n\n\t// static string_value_contains_expression(v:string): boolean{\n\t// \treturn ((this.string_value_elements(v).length - 1) % 2) === 0;\n\t// }\n\n\t// deep_parse_for_string_expressions(){\n\t// \t// for string expressions which have more than a single `<expr>` element\n\t// \t// pt_`@ptnum`\n\t// \t// `@ptnum`_pt\n\t// \t// pt_`@ptnum`_`1+1`\n\t// \tif(this.node.type == JSEP_COMPOUND){\n\t// \t\tconst args = this.node.body\n\t// \t\tlet arg;\n\t// \t\tfor(let i=0; i<args.length; i++){\n\t// \t\t\targ = args[i]\n\t// \t\t\tif(arg.type == JSEP_LITERAL){\n\t// \t\t\t\tconst arg_node = jsep(arg.value)\n\t// \t\t\t\targs[i] = arg_node\n\t// \t\t\t}\n\t// \t\t}\n\t// \t} else {\n\t// \t\t// for string expressions which havea single `<expr>` element\n\t// \t\t// `@ptnum`\n\t// \t\tif(this.node.type == JSEP_LITERAL){\n\t// \t\t\tconst raw = this.node.raw\n\t// \t\t\tconst first_char_code = raw.charCodeAt(0)\n\t// \t\t\tconst last_char_code = raw.charCodeAt(raw.length-1)\n\t// \t\t\tif(first_char_code == HOUDINI_QUOTE_CODE && last_char_code == HOUDINI_QUOTE_CODE){\n\t// \t\t\t\tthis.node = jsep(\"''+\"+this.node.value) // add the prefix ''+ to ensure we have a string as a result, and not a number\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// }\n\n\tprivate reset() {\n\t\tthis._node = undefined;\n\t\tthis._errorMessage = undefined;\n\t}\n}\n","import {createVariable} from '../nodes/js/code/assemblers/_BaseJsPersistedConfigUtils';\nimport {JsConnectionPointType} from '../nodes/utils/io/connections/Js';\n\nexport function _matchArrayLength<T1, T2>(src: T1[], target: T2[], _createElement: () => T2): void {\n\t_setArrayLength(target, src.length, _createElement);\n\t// if (target.length == src.length) {\n\t// \treturn;\n\t// }\n\t// if (target.length > src.length) {\n\t// \ttarget.length = src.length;\n\t// } else {\n\t// \tconst srcLength = src.length;\n\t// \tfor (let i = target.length; i < srcLength; i++) {\n\t// \t\ttarget[i] = _createElement();\n\t// \t}\n\t// }\n}\nexport function _setArrayLength<T>(target: T[], length: number, _createElement: () => T): void {\n\tif (target.length == length) {\n\t\treturn;\n\t}\n\tif (target.length > length) {\n\t\ttarget.length = length;\n\t} else {\n\t\tconst srcLength = length;\n\t\tfor (let i = target.length; i < srcLength; i++) {\n\t\t\ttarget[i] = _createElement();\n\t\t}\n\t}\n}\nexport function _matchArrayLengthWithType<T1, T2>(src: T1[], target: T2[], type: JsConnectionPointType): void {\n\tif (target.length == src.length) {\n\t\treturn;\n\t}\n\tif (target.length > src.length) {\n\t\ttarget.length = src.length;\n\t} else {\n\t\tconst srcLength = src.length;\n\t\tfor (let i = target.length; i < srcLength; i++) {\n\t\t\ttarget[i] = createVariable(type) as T2;\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {PolyScene} from '../scene/PolyScene';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {BaseJsNodeType} from '../nodes/js/_Base';\nimport {JsLinesCollectionController} from '../nodes/js/code/utils/JsLinesCollectionController';\nimport {NodeContext} from '../poly/NodeContext';\nimport {AssemblerControllerNode} from '../nodes/js/code/Controller';\nimport {TimeController} from '../scene/utils/TimeController';\nimport {BaseJsShaderAssembler} from '../nodes/js/code/assemblers/_Base';\nimport {\n\tTuple1,\n\tTuple2,\n\tTuple3,\n\tTuple4,\n\tTuple5,\n\tTuple6,\n\tTuple7,\n\tTuple8,\n\tTuple9,\n\tTuple10,\n\tTuple11,\n\tTuple12,\n\tTuple13,\n\tTuple14,\n\tTuple15,\n\tTuple16,\n\tTuple17,\n\tTuple18,\n\tTuple19,\n\tTuple20,\n\tTuple21,\n\tTuple22,\n} from '../../types/GlobalTypes';\n\nexport abstract class BaseNamedFunction {\n\t// abstract type: string;\n\tstatic type(): string {\n\t\tthrow 'type to be overriden';\n\t}\n\ttype() {\n\t\tconst c = this.constructor as typeof BaseNamedFunction;\n\t\treturn c.type();\n\t}\n\tpublic readonly scene: PolyScene;\n\tpublic readonly jsNode?: BaseJsNodeType;\n\tpublic readonly functionNode: AssemblerControllerNode<BaseJsShaderAssembler>;\n\tpublic readonly timeController: TimeController;\n\tconstructor(\n\t\tpublic readonly node: BaseNodeType,\n\t\tpublic readonly shadersCollectionController?: JsLinesCollectionController\n\t) {\n\t\tthis.scene = node.scene();\n\t\tthis.timeController = this.scene.timeController;\n\t\tif (node.context() == NodeContext.JS) {\n\t\t\tthis.jsNode = node as BaseJsNodeType;\n\t\t\tthis.functionNode = this.jsNode.functionNode()!;\n\t\t} else {\n\t\t\tthis.jsNode = undefined;\n\t\t\tthis.functionNode = node as AssemblerControllerNode<BaseJsShaderAssembler>;\n\t\t}\n\t}\n\tabstract func(...args: any): any;\n\tasString(...args: any): string {\n\t\tif (this.shadersCollectionController) {\n\t\t\tif (this.jsNode) {\n\t\t\t\tthis.shadersCollectionController.addFunction(this.jsNode, this);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('no shadersCollectionController in func', this.type());\n\t\t}\n\t\treturn '';\n\t}\n}\nexport abstract class NamedFunction<ARGS extends Array<any>, ARGS_STR extends Array<string>> extends BaseNamedFunction {\n\tabstract override func(...args: ARGS): any;\n\tpublic async = false;\n\toverride asString(...args: ARGS_STR): string {\n\t\tsuper.asString(...args);\n\t\tconst functionCall = `${this.type()}(${args.join(', ')})`;\n\t\treturn this.async ? `await ${functionCall}` : functionCall;\n\t}\n}\n\nexport abstract class NamedFunction0 extends NamedFunction<[], []> {}\n\nexport abstract class NamedFunction1<ARGS extends Tuple1<any>> extends NamedFunction<ARGS, Tuple1<any>> {}\nexport abstract class NamedFunction2<ARGS extends Tuple2<any>> extends NamedFunction<ARGS, Tuple2<string>> {}\nexport abstract class NamedFunction3<ARGS extends Tuple3<any>> extends NamedFunction<ARGS, Tuple3<string>> {}\nexport abstract class NamedFunction4<ARGS extends Tuple4<any>> extends NamedFunction<ARGS, Tuple4<string>> {}\nexport abstract class NamedFunction5<ARGS extends Tuple5<any>> extends NamedFunction<ARGS, Tuple5<string>> {}\nexport abstract class NamedFunction6<ARGS extends Tuple6<any>> extends NamedFunction<ARGS, Tuple6<string>> {}\nexport abstract class NamedFunction7<ARGS extends Tuple7<any>> extends NamedFunction<ARGS, Tuple7<string>> {}\nexport abstract class NamedFunction8<ARGS extends Tuple8<any>> extends NamedFunction<ARGS, Tuple8<string>> {}\nexport abstract class NamedFunction9<ARGS extends Tuple9<any>> extends NamedFunction<ARGS, Tuple9<string>> {}\n//\n//\n// OBJECT\n//\n//\nabstract class ObjectNamedFunction<ARGS extends Array<any>, ARGS_STR extends Array<string>> extends BaseNamedFunction {\n\tabstract override func(object: Object3D, ...args: ARGS): any;\n\toverride asString(...args: ARGS_STR): string {\n\t\tsuper.asString(...args);\n\t\treturn `${this.type()}(${args.join(', ')})`;\n\t}\n}\nexport abstract class ObjectNamedFunction0 extends ObjectNamedFunction<[], Tuple1<string>> {}\nexport abstract class ObjectNamedFunction1<ARGS extends Tuple1<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple2<string>\n> {}\nexport abstract class ObjectNamedFunction2<ARGS extends Tuple2<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple3<string>\n> {}\nexport abstract class ObjectNamedFunction3<ARGS extends Tuple3<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple4<string>\n> {}\nexport abstract class ObjectNamedFunction4<ARGS extends Tuple4<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple5<string>\n> {}\nexport abstract class ObjectNamedFunction5<ARGS extends Tuple5<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple6<string>\n> {}\nexport abstract class ObjectNamedFunction6<ARGS extends Tuple6<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple7<string>\n> {}\nexport abstract class ObjectNamedFunction7<ARGS extends Tuple7<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple8<string>\n> {}\nexport abstract class ObjectNamedFunction8<ARGS extends Tuple8<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple9<string>\n> {}\nexport abstract class ObjectNamedFunction9<ARGS extends Tuple9<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple10<string>\n> {}\nexport abstract class ObjectNamedFunction10<ARGS extends Tuple10<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple11<string>\n> {}\nexport abstract class ObjectNamedFunction11<ARGS extends Tuple11<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple12<string>\n> {}\nexport abstract class ObjectNamedFunction12<ARGS extends Tuple12<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple13<string>\n> {}\nexport abstract class ObjectNamedFunction13<ARGS extends Tuple13<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple14<string>\n> {}\nexport abstract class ObjectNamedFunction14<ARGS extends Tuple14<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple15<string>\n> {}\nexport abstract class ObjectNamedFunction15<ARGS extends Tuple15<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple16<string>\n> {}\nexport abstract class ObjectNamedFunction16<ARGS extends Tuple16<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple17<string>\n> {}\nexport abstract class ObjectNamedFunction17<ARGS extends Tuple17<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple18<string>\n> {}\nexport abstract class ObjectNamedFunction18<ARGS extends Tuple18<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple19<string>\n> {}\nexport abstract class ObjectNamedFunction19<ARGS extends Tuple19<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple20<string>\n> {}\nexport abstract class ObjectNamedFunction20<ARGS extends Tuple20<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple21<string>\n> {}\nexport abstract class ObjectNamedFunction21<ARGS extends Tuple21<any>> extends ObjectNamedFunction<\n\tARGS,\n\tTuple22<string>\n> {}\n\n//\n//\n// SCENE\n//\n//\n// abstract class SceneNamedFunction<ARGS extends Array<any>, ARGS_STR extends Array<string>> extends BaseNamedFunction {\n// \tabstract override func(object: PolyScene, ...args: ARGS): any;\n// \toverride asString(...args: ARGS_STR): string {\n// \t\tsuper.asString(...args);\n// \t\treturn `${this.type()}(${EvaluatorConstant.SCENE}, ${args.join(', ')})`;\n// \t}\n// }\n// export abstract class SceneNamedFunction0 extends SceneNamedFunction<[], []> {}\n","import {stringMatchMask} from '../../core/String';\nimport {NamedFunction5} from './_Base';\n\nexport enum KeyModifierRequirement {\n\tOPTIONAL = 'optional',\n\tPRESSED = 'pressed',\n\tNOT_PRESSED = 'not pressed',\n}\nexport const KEY_MODIFIER_REQUIREMENTS: KeyModifierRequirement[] = [\n\tKeyModifierRequirement.OPTIONAL,\n\tKeyModifierRequirement.PRESSED,\n\tKeyModifierRequirement.NOT_PRESSED,\n];\nfunction modifierMatchesRequirement(modifier: boolean, requirement: KeyModifierRequirement): boolean {\n\tif (requirement == KeyModifierRequirement.OPTIONAL) {\n\t\treturn true;\n\t}\n\tif (requirement == KeyModifierRequirement.PRESSED && modifier == true) {\n\t\treturn true;\n\t}\n\tif (requirement == KeyModifierRequirement.NOT_PRESSED && modifier == false) {\n\t\treturn true;\n\t}\n\treturn false;\n}\nexport class keyboardEventMatchesConfig extends NamedFunction5<[string, number, number, number, number]> {\n\tstatic override type() {\n\t\treturn 'keyboardEventMatchesConfig';\n\t}\n\tfunc(keyCodes: string, _ctrlKey: number, _shiftKey: number, _altKey: number, _metaKey: number): boolean {\n\t\tconst events = this.scene.eventsDispatcher.keyboardEventsController.currentEvents();\n\t\tif (events.length == 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst eventMatchesAtLeastOneModifier = () => {\n\t\t\tconst ctrlKey = KEY_MODIFIER_REQUIREMENTS[_ctrlKey];\n\t\t\tfor (let event of events) {\n\t\t\t\tif (modifierMatchesRequirement(event.ctrlKey, ctrlKey)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst shiftKey = KEY_MODIFIER_REQUIREMENTS[_shiftKey];\n\t\t\tfor (let event of events) {\n\t\t\t\tif (modifierMatchesRequirement(event.shiftKey, shiftKey)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst altKey = KEY_MODIFIER_REQUIREMENTS[_altKey];\n\t\t\tfor (let event of events) {\n\t\t\t\tif (modifierMatchesRequirement(event.altKey, altKey)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst metaKey = KEY_MODIFIER_REQUIREMENTS[_metaKey];\n\t\t\tfor (let event of events) {\n\t\t\t\tif (modifierMatchesRequirement(event.metaKey, metaKey)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst eventMatchesAtLeastOneKeyCode = () => {\n\t\t\tfor (let event of events) {\n\t\t\t\tif (keyCodes == '' || stringMatchMask(event.code, keyCodes)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tif (!eventMatchesAtLeastOneModifier()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!eventMatchesAtLeastOneKeyCode()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import {CoreString} from '../../../../core/String';\n\nexport function sanitizeExportedString(word: string): string {\n\tword = word.replace(/'/g, \"'\"); // escapes ' (used to be with 2 /, but now only one to have Ian's Mediation saved and loaded correctly - but is actually 2 in Code Exporter)\n\tword = CoreString.escapeLineBreaks(word);\n\treturn word;\n}\n","import {PersistedConfigWithShaders} from './../../../nodes/utils/BasePersistedConfig';\nimport {Number2, PolyDictionary} from '../../../../types/GlobalTypes';\nimport {BaseNodeType, TypedNode} from '../../../nodes/_Base';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport type {JsonExportDispatcher} from './Dispatcher';\nimport {ParamJsonExporterData} from '../../../nodes/utils/io/IOController';\nimport {ParamType} from '../../../poly/ParamType';\nimport {BaseConnectionPointData} from '../../../nodes/utils/io/connections/_Base';\nimport {sanitizeExportedString} from './sanitize';\nimport {isString} from '../../../../core/Type';\nimport {VelocityColliderFunctionBody} from '../../../nodes/js/code/assemblers/_Base';\n\n// revert to using index instead of name\n// for gl nodes such as the if node, whose input names\n// changes depending on the input\ninterface NamedInputData {\n\tindex?: number;\n\tinputName?: string;\n\tnode: string;\n\toutput: string;\n}\ntype IndexedInputData = string | null;\nexport type InputData = NamedInputData | IndexedInputData;\n\ninterface FlagsData {\n\tbypass?: boolean;\n\tdisplay?: boolean;\n\toptimize?: boolean;\n}\nexport interface IoConnectionPointsData {\n\tin?: BaseConnectionPointData[];\n\tout?: BaseConnectionPointData[];\n}\n\nexport interface NodeJsonExporterData {\n\ttype: string;\n\tnodes?: PolyDictionary<NodeJsonExporterData>;\n\tchildren_context?: NodeContext;\n\tparams?: PolyDictionary<ParamJsonExporterData<ParamType>>;\n\tmaxInputsCount?: number;\n\tinputs?: InputData[];\n\tconnection_points?: IoConnectionPointsData;\n\n\tflags?: FlagsData;\n\tcloned_state_overriden?: boolean;\n\tpersisted_config?: PersistedConfigWithShaders;\n\tpolyNode?: {\n\t\tlocked: boolean;\n\t};\n}\n\nexport interface NodeJsonExporterUIData {\n\tpos?: Number2;\n\tcomment?: string;\n\tselection?: string[];\n\tnodes?: PolyDictionary<NodeJsonExporterUIData>;\n}\nexport type NodeJSONShadersData = PolyDictionary<PolyDictionary<string>>;\nexport type NodeJSONFunctionBodiesData = PolyDictionary<string | PolyDictionary<string>>;\n\ntype BaseNodeTypeWithIO = TypedNode<NodeContext, any>;\n\nexport interface JSONExporterDataRequestOption {\n\tshowPolyNodesData?: boolean;\n\twithPersistedConfig?: boolean;\n}\n\nexport class NodeJsonExporter<T extends BaseNodeTypeWithIO> {\n\tprivate _data: NodeJsonExporterData | undefined; // = {} as NodeJsonExporterData;\n\tconstructor(protected _node: T, protected dispatcher: JsonExportDispatcher) {}\n\n\tasync data(options: JSONExporterDataRequestOption): Promise<NodeJsonExporterData> {\n\t\tif (!this._isRoot()) {\n\t\t\tthis._node.scene().nodesController.registerNodeContextSignature(this._node);\n\t\t}\n\t\tthis._data = {\n\t\t\ttype: this._node.type(),\n\t\t} as NodeJsonExporterData;\n\n\t\tif (this._node.polyNodeController) {\n\t\t\tthis._data['polyNode'] = {\n\t\t\t\tlocked: this._node.polyNodeController.locked(),\n\t\t\t};\n\t\t}\n\n\t\t// const required_imports = this._node.required_imports()\n\t\t// if(required_imports){\n\t\t// \tthis._data['required_imports'] = required_imports\n\t\t// }\n\n\t\tconst nodes_data = await this.nodes_data(options);\n\t\tif (Object.keys(nodes_data).length > 0) {\n\t\t\tthis._data['nodes'] = nodes_data;\n\n\t\t\t// required by the Store::Scene::Exporter.rb\n\t\t\t// Update: removed as there should be a better way\n\t\t\t// const context = this._node.childrenController?.context;\n\t\t\t// if (context) {\n\t\t\t// \tthis._data['children_context'] = context;\n\t\t\t// }\n\t\t}\n\n\t\tconst params_data = this.params_data();\n\t\tif (Object.keys(params_data).length > 0) {\n\t\t\tthis._data['params'] = params_data;\n\t\t}\n\t\tif (!this._isRoot()) {\n\t\t\t//data['custom'] = []\n\t\t\tif (this._node.io.inputs.maxInputsCountOverriden()) {\n\t\t\t\tthis._data['maxInputsCount'] = this._node.io.inputs.maxInputsCount();\n\t\t\t}\n\n\t\t\tconst inputs_data = this.inputs_data();\n\t\t\tif (inputs_data.length > 0) {\n\t\t\t\tthis._data['inputs'] = inputs_data;\n\t\t\t}\n\t\t\tconst connection_points_data = this.connection_points_data();\n\t\t\tif (connection_points_data) {\n\t\t\t\tthis._data['connection_points'] = connection_points_data;\n\t\t\t}\n\t\t}\n\n\t\tif (this._node.flags) {\n\t\t\tconst flags_data: FlagsData = {};\n\t\t\tif (this._node.flags.hasBypass() || this._node.flags.hasDisplay() || this._node.flags.hasOptimize()) {\n\t\t\t\tif (this._node.flags.hasBypass()) {\n\t\t\t\t\tif (this._node.flags.bypass?.active()) {\n\t\t\t\t\t\tflags_data['bypass'] = this._node.flags.bypass.active();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this._node.flags.hasDisplay()) {\n\t\t\t\t\t// only save the display flag if it is true, or if the parent does not have a displayNodeController\n\t\t\t\t\t// This will then always save it for OBJ\n\t\t\t\t\t// And only if true for SOP\n\t\t\t\t\tif (this._node.flags.display?.active() || !this._node.parent()?.displayNodeController) {\n\t\t\t\t\t\tflags_data['display'] = this._node.flags.display?.active();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this._node.flags.hasOptimize()) {\n\t\t\t\t\tif (this._node.flags.optimize?.active()) {\n\t\t\t\t\t\tflags_data['optimize'] = this._node.flags.optimize?.active();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(flags_data).length > 0) {\n\t\t\t\tthis._data['flags'] = flags_data;\n\t\t\t}\n\t\t}\n\n\t\t// inputs clone\n\t\tif (this._node.io.inputs.overrideClonedStateAllowed()) {\n\t\t\tconst overriden = this._node.io.inputs.clonedStateOverriden();\n\t\t\tif (overriden) {\n\t\t\t\tthis._data['cloned_state_overriden'] = overriden;\n\t\t\t}\n\t\t}\n\n\t\t// persisted config\n\t\tconst withPersistedConfig = options.withPersistedConfig == null ? true : options.withPersistedConfig;\n\t\tif (withPersistedConfig == true) {\n\t\t\tconst persisted_config = this._node.persisted_config;\n\t\t\tif (persisted_config) {\n\t\t\t\tconst persisted_config_data = options.showPolyNodesData\n\t\t\t\t\t? await persisted_config.toData()\n\t\t\t\t\t: await persisted_config.toDataWithoutShaders();\n\t\t\t\tif (persisted_config_data) {\n\t\t\t\t\tthis._data.persisted_config = persisted_config_data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// custom\n\t\tthis.add_custom();\n\n\t\treturn this._data;\n\t}\n\n\tuiData(options: JSONExporterDataRequestOption): NodeJsonExporterUIData {\n\t\tconst data: NodeJsonExporterUIData = this.ui_data_without_children();\n\t\tconst children = this._node.children();\n\t\tif (children.length > 0) {\n\t\t\tconst nodesData: PolyDictionary<NodeJsonExporterUIData> = {};\n\t\t\tfor (let child of children) {\n\t\t\t\tconst node_exporter = this.dispatcher.dispatchNode(child); //.visit(JsonExporterVisitor); //.json_exporter()\n\t\t\t\tnodesData[child.name()] = node_exporter.uiData(options);\n\t\t\t}\n\t\t\tdata['nodes'] = nodesData;\n\t\t}\n\n\t\treturn data;\n\t}\n\tprotected ui_data_without_children(): NodeJsonExporterUIData {\n\t\tconst data: NodeJsonExporterUIData = {} as NodeJsonExporterUIData;\n\t\tif (!this._isRoot()) {\n\t\t\tconst ui_data = this._node.uiData;\n\t\t\tdata['pos'] = ui_data.position().toArray() as Number2;\n\t\t\tconst comment = ui_data.comment();\n\t\t\tif (comment) {\n\t\t\t\tdata['comment'] = sanitizeExportedString(comment);\n\t\t\t}\n\n\t\t\t// selection\n\t\t\tif (this._node.childrenAllowed()) {\n\t\t\t\tconst selection = this._node.childrenController?.selection;\n\t\t\t\tif (selection && this._node.children().length > 0) {\n\t\t\t\t\t// only save the nodes that are still present, in case the selection just got deleted\n\t\t\t\t\tconst selected_children: BaseNodeTypeWithIO[] = [];\n\t\t\t\t\tconst selected_ids: PolyDictionary<boolean> = {};\n\t\t\t\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\t\t\t\tselection.nodes(selectedNodes);\n\t\t\t\t\tfor (const selected_node of selectedNodes) {\n\t\t\t\t\t\tselected_ids[selected_node.graphNodeId()] = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const child of this._node.children()) {\n\t\t\t\t\t\tif (child.graphNodeId() in selected_ids) {\n\t\t\t\t\t\t\tselected_children.push(child);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst selection_data = selected_children.map((n) => n.name());\n\t\t\t\t\tif (selection_data.length > 0) {\n\t\t\t\t\t\tdata['selection'] = selection_data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t}\n\tasync persistedConfigData(\n\t\tshadersData: NodeJSONShadersData,\n\t\tjsFunctionBodiesData: NodeJSONFunctionBodiesData,\n\t\toptions: JSONExporterDataRequestOption\n\t): Promise<void> {\n\t\tconst children = this._node.children();\n\t\tif (children.length > 0) {\n\t\t\tfor (let child of children) {\n\t\t\t\tconst node_exporter = this.dispatcher.dispatchNode(child);\n\t\t\t\tawait node_exporter.persistedConfigData(shadersData, jsFunctionBodiesData, options);\n\t\t\t}\n\t\t}\n\n\t\tif (this._node.persisted_config) {\n\t\t\tconst persisted_config_data = await this._node.persisted_config.toData();\n\t\t\tif (persisted_config_data) {\n\t\t\t\tif (persisted_config_data.shaders) {\n\t\t\t\t\tshadersData[this._node.path()] = persisted_config_data.shaders;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (persisted_config_data.functionBody != null) {\n\t\t\t\t\tif (isString(persisted_config_data.functionBody)) {\n\t\t\t\t\t\tjsFunctionBodiesData[this._node.path()] = persisted_config_data.functionBody;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst dict: Record<string, string> = {};\n\t\t\t\t\t\tconst keys = Object.keys(persisted_config_data.functionBody) as Array<\n\t\t\t\t\t\t\tkeyof VelocityColliderFunctionBody\n\t\t\t\t\t\t>;\n\t\t\t\t\t\tfor (let key of keys) {\n\t\t\t\t\t\t\tdict[key] = persisted_config_data.functionBody[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tjsFunctionBodiesData[this._node.path()] = dict;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole.warn(`persisted config data not handled`, persisted_config_data);\n\t\t\t}\n\t\t}\n\t}\n\t// async jsFunctionBodies(data: NodeJSONFunctionBodiesData, options: JSONExporterDataRequestOption = {}): Promise<void> {\n\t// \tconst children = this._node.children();\n\t// \tif (children.length > 0) {\n\t// \t\tfor (let child of children) {\n\t// \t\t\tconst node_exporter = this.dispatcher.dispatchNode(child);\n\t// \t\t\tawait node_exporter.jsFunctionBodies(data);\n\t// \t\t}\n\t// \t}\n\n\t// \tif (this._node.persisted_config) {\n\t// \t\tconst persisted_config_data = await this._node.persisted_config.toData();\n\t// \t\tif (persisted_config_data && persisted_config_data.functionBody) {\n\t// \t\t\tdata[this._node.path()] = persisted_config_data.functionBody\n\t// \t\t}\n\t// \t}\n\t// }\n\n\tprivate _isRoot() {\n\t\treturn this._node.parent() === null && this._node.graphNodeId() == this._node.root().graphNodeId();\n\t}\n\n\tprotected inputs_data() {\n\t\tconst data: InputData[] = [];\n\t\tthis._node.io.inputs.inputs().forEach((input, input_index) => {\n\t\t\tif (input) {\n\t\t\t\tconst connection = this._node.io.connections.inputConnection(input_index)!;\n\t\t\t\tif (this._node.io.inputs.hasNamedInputs()) {\n\t\t\t\t\tconst inputConnectionPoints = this._node.io.inputs.namedInputConnectionPoints();\n\t\t\t\t\tconst outputConnectionPoints = input.io.outputs.namedOutputConnectionPoints();\n\t\t\t\t\tif (inputConnectionPoints && outputConnectionPoints) {\n\t\t\t\t\t\tconst inputName = inputConnectionPoints[input_index]?.name();\n\t\t\t\t\t\tconst output_index = connection.outputIndex();\n\t\t\t\t\t\tconst output_name = outputConnectionPoints[output_index]?.name();\n\t\t\t\t\t\tif (output_name) {\n\t\t\t\t\t\t\tdata[input_index] = {\n\t\t\t\t\t\t\t\tindex: input_index,\n\t\t\t\t\t\t\t\tinputName: inputName,\n\t\t\t\t\t\t\t\tnode: input.name(),\n\t\t\t\t\t\t\t\toutput: output_name,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdata[input_index] = input.name();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n\n\tprotected connection_points_data() {\n\t\tif (!this._node.io.has_connection_points_controller) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._node.io.connection_points.initialized()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._node.io.inputs.hasNamedInputs() || this._node.io.outputs.hasNamedOutputs()) {\n\t\t\tconst data: IoConnectionPointsData = {};\n\t\t\tif (this._node.io.inputs.hasNamedInputs()) {\n\t\t\t\tdata['in'] = [];\n\t\t\t\tconst connectionPoints = this._node.io.inputs.namedInputConnectionPoints();\n\t\t\t\tif (connectionPoints) {\n\t\t\t\t\tfor (let cp of connectionPoints) {\n\t\t\t\t\t\tif (cp) {\n\t\t\t\t\t\t\tdata['in'].push(cp.toJSON());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._node.io.outputs.hasNamedOutputs()) {\n\t\t\t\tdata['out'] = [];\n\t\t\t\tconst connectionPoints = this._node.io.outputs.namedOutputConnectionPoints();\n\t\t\t\tif (connectionPoints) {\n\t\t\t\t\tfor (let cp of connectionPoints) {\n\t\t\t\t\t\tif (cp) {\n\t\t\t\t\t\t\tdata['out'].push(cp.toJSON());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t}\n\t}\n\n\tprotected params_data() {\n\t\tconst data: PolyDictionary<ParamJsonExporterData<ParamType>> = {};\n\n\t\tfor (let param_name of this._node.params.names) {\n\t\t\tconst param = this._node.params.get(param_name);\n\t\t\tif (param && !param.parentParam()) {\n\t\t\t\tconst param_exporter = this.dispatcher.dispatchParam(param);\n\t\t\t\tif (param_exporter.required()) {\n\t\t\t\t\tconst params_data = param_exporter.data();\n\t\t\t\t\tdata[param.name()] = params_data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tprotected async nodes_data(options: JSONExporterDataRequestOption) {\n\t\tconst data: PolyDictionary<NodeJsonExporterData> = {};\n\t\tfor (let child of this._node.children()) {\n\t\t\tconst node_exporter = this.dispatcher.dispatchNode(child); //.json_exporter()\n\t\t\tdata[child.name()] = await node_exporter.data(options);\n\t\t}\n\t\treturn data;\n\t}\n\n\tprotected add_custom() {}\n}\n","import {BaseParamType} from '../../../params/_Base';\nimport {ParamType} from '../../../poly/ParamType';\nimport {ParamOptions} from '../../../params/utils/OptionsController';\nimport {OverridenOptions, ComplexParamJsonExporterData} from '../../../nodes/utils/io/IOController';\nimport {isString,isNumber} from '../../../../core/Type';\n\nexport class ParamJsonExporter<T extends BaseParamType> {\n\t// protected _simple_data: SimpleParamJsonExporterData<ParamType>=0;\n\tprotected _complex_data: ComplexParamJsonExporterData<ParamType> = {};\n\tconstructor(protected _param: T) {}\n\n\trequired(): boolean {\n\t\tconst is_spare_and_not_component = this._param.options.isSpare() && !this._param.parentParam();\n\n\t\t// we should not need to check if it has an expression anymore,\n\t\t// as it could have an expression AND be of default value\n\t\tconst value_changed = !this._param.isDefault(); //|| this._param.has_expression();\n\t\t// const referencing_asset = this._param.is_referencing_asset()\n\t\treturn is_spare_and_not_component || value_changed || this._param.options.hasOptionsOverridden();\n\t}\n\n\tdata() {\n\t\tif (this._param.parentParam()) {\n\t\t\tconsole.warn('no component should be saved');\n\t\t\tthrow 'no component should be saved';\n\t\t}\n\n\t\tif (this._require_data_complex()) {\n\t\t\treturn this._data_complex();\n\t\t} else {\n\t\t\treturn this._data_simple();\n\t\t}\n\t}\n\n\tprivate _data_simple() {\n\t\treturn this._param.rawInputSerialized();\n\t}\n\n\tprivate _data_complex() {\n\t\tthis._complex_data = {};\n\n\t\tif (this._param.options.isSpare() && !this._param.parentParam()) {\n\t\t\tthis._complex_data['type'] = this._param.type();\n\t\t\tthis._complex_data['default_value'] = this._param.defaultValueSerialized();\n\t\t\tthis._complex_data['options'] = this._param.options.current();\n\t\t}\n\n\t\tif (!this._param.isDefault()) {\n\t\t\tthis._complex_data['raw_input'] = this._param.rawInputSerialized();\n\t\t}\n\n\t\tif (this._param.options.hasOptionsOverridden()) {\n\t\t\tconst overridden_options: OverridenOptions = {};\n\t\t\tconst options_overridden = this._param.options.overriddenOptions();\n\t\t\tfor (let option_name of Object.keys(options_overridden)) {\n\t\t\t\tconst option_value = options_overridden[option_name as keyof ParamOptions];\n\t\t\t\tif (isString(option_value) || isNumber(option_value)) {\n\t\t\t\t\toverridden_options[option_name] = option_value;\n\t\t\t\t} else {\n\t\t\t\t\toverridden_options[option_name] = JSON.stringify(option_value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._complex_data['overriden_options'] = overridden_options;\n\t\t}\n\t\treturn this._complex_data;\n\t}\n\n\tprotected _require_data_complex() {\n\t\tif (this._param.options.isSpare()) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this._param.options.hasOptionsOverridden()) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// default_value(): ParamValueSerialized {\n\t// \treturn this._param.defaultValueSerialized();\n\t// }\n\n\t// cannot remember why this is useful, but it messes up\n\t// with gl nodes like the noise node, as the default value\n\t// gets saved as a string '[1,1]' instead of an array [1,1] (should be without quotes)\n\t// protected default_value(){\n\t// \tlet default_value = this._param.default_value()\n\t// \tif(isString(default_value)){\n\t// \t\tdefault_value = `'${default_value}'`\n\t// \t}\n\t// \tif (isArray(default_value)){\n\t// \t\tdefault_value = `[${default_value}]`\n\t// \t}\n\t// \treturn default_value\n\t// }\n\n\tprotected add_main() {}\n}\n","import {ParamJsonExporter} from '../Param';\nimport {TypedNumericParam} from '../../../../params/_Numeric';\nimport {ParamType} from '../../../../poly/ParamType';\n\nexport class ParamNumericJsonExporter extends ParamJsonExporter<TypedNumericParam<ParamType>> {\n\toverride add_main() {\n\t\t// if (this._param.hasExpression() && this._param.expressionController?.expression) {\n\t\t// \t// const escaped_expression = this._param.expression().replace(/'/g, \"\\\\'\");\n\t\t// \tthis._data['expression'] = this._param.expressionController?.expression;\n\t\t// } else {\n\t\tif (this._require_data_complex()) {\n\t\t\tthis._complex_data['raw_input'] = this._param.rawInputSerialized();\n\t\t} else {\n\t\t\treturn this._param.rawInputSerialized();\n\t\t}\n\t\t// }\n\t}\n}\n","import {ParamJsonExporter} from '../Param';\nimport {NodePathParam} from '../../../../params/NodePath';\nimport {sanitizeExportedString} from '../sanitize';\n\nexport class ParamNodePathJsonExporter extends ParamJsonExporter<NodePathParam> {\n\toverride add_main() {\n\t\tlet val = this._param.rawInput();\n\t\t// val = val.replace(/'/g, \"\\\\'\");\n\t\tval = sanitizeExportedString(val);\n\n\t\tif (this._require_data_complex()) {\n\t\t\tthis._complex_data['raw_input'] = val;\n\t\t} else {\n\t\t\treturn val;\n\t\t}\n\t}\n}\n","import {ParamJsonExporter} from '../Param';\nimport {ParamPathParam} from '../../../../params/ParamPath';\nimport {sanitizeExportedString} from '../sanitize';\n\nexport class ParamParamPathJsonExporter extends ParamJsonExporter<ParamPathParam> {\n\toverride add_main() {\n\t\tlet val = this._param.rawInput();\n\t\t// val = val.replace(/'/g, \"\\\\'\");\n\t\tval = sanitizeExportedString(val);\n\n\t\tif (this._require_data_complex()) {\n\t\t\tthis._complex_data['raw_input'] = val;\n\t\t} else {\n\t\t\treturn val;\n\t\t}\n\t}\n}\n","import {ParamJsonExporter} from '../Param';\nimport {StringParam} from '../../../../params/String';\nimport {sanitizeExportedString} from '../sanitize';\n\nexport class ParamStringJsonExporter extends ParamJsonExporter<StringParam> {\n\toverride add_main() {\n\t\t// let val = this._param.input_value();\n\t\tlet val = this._param.rawInput();\n\t\t// if (isString(val)){\n\t\tval = sanitizeExportedString(val);\n\t\t// }\n\t\tif (this._require_data_complex()) {\n\t\t\tthis._complex_data['raw_input'] = val;\n\t\t} else {\n\t\t\treturn val;\n\t\t}\n\t}\n}\n","import {ParamJsonExporter} from '../Param';\nimport {RampParam} from '../../../../params/Ramp';\n\nexport class ParamRampJsonExporter extends ParamJsonExporter<RampParam> {\n\toverride add_main() {\n\t\tif (this._require_data_complex()) {\n\t\t\tthis._complex_data['raw_input'] = this._param.rawInputSerialized();\n\t\t} else {\n\t\t\treturn this._param.rawInputSerialized();\n\t\t}\n\t}\n}\n","import {NodeJSONFunctionBodiesData, NodeJSONShadersData} from './../Node';\nimport {NodeJsonExporter, NodeJsonExporterUIData, JSONExporterDataRequestOption} from '../Node';\n\nexport class PolyNodeJsonExporter extends NodeJsonExporter<any> {\n\tprotected override async nodes_data(options: JSONExporterDataRequestOption) {\n\t\tif (options.showPolyNodesData || !this._node.polyNodeController?.locked()) {\n\t\t\treturn await super.nodes_data(options);\n\t\t}\n\t\t// the PolyNode does not save it children\n\t\treturn {};\n\t}\n\toverride uiData(options: JSONExporterDataRequestOption): NodeJsonExporterUIData {\n\t\tif (options.showPolyNodesData || !this._node.polyNodeController?.locked()) {\n\t\t\treturn super.uiData(options);\n\t\t} else {\n\t\t\treturn this.ui_data_without_children();\n\t\t}\n\t}\n\toverride async persistedConfigData(\n\t\tshadersData: NodeJSONShadersData,\n\t\tjsFunctionBodiesData: NodeJSONFunctionBodiesData,\n\t\toptions: JSONExporterDataRequestOption\n\t): Promise<void> {\n\t\tif (options.showPolyNodesData || !this._node.polyNodeController?.locked()) {\n\t\t\treturn await super.persistedConfigData(shadersData, jsFunctionBodiesData, options);\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../../../nodes/_Base';\nimport {BaseParamType} from '../../../params/_Base';\n\nimport {NodeJsonExporter} from './Node';\n// import {BaseNodeObjJsonExporter} from './node/Obj';\n// import {BaseNodeSopSubnetworkJsonExporter} from './node/Subnetwork';\n\nimport {ParamJsonExporter} from './Param';\n// import {ParamMultipleJsonExporter} from './param/Multiple';\nimport {ParamNumericJsonExporter} from './param/Numeric';\n// import {ParamOperatorPathJsonExporter} from './param/OperatorPath';\nimport {ParamNodePathJsonExporter} from './param/NodePath';\nimport {ParamParamPathJsonExporter} from './param/ParamPath';\n\nimport {ParamStringJsonExporter} from './param/String';\nimport {ParamRampJsonExporter} from './param/Ramp';\n// import {TypedObjNode} from '../../../nodes/obj/_Base';\n// import {TypedMultipleParam} from '../../../params/_Multiple';\nimport {TypedNumericParam} from '../../../params/_Numeric';\n// import {OperatorPathParam} from '../../../params/OperatorPath';\nimport {NodePathParam} from '../../../params/NodePath';\nimport {ParamPathParam} from '../../../params/ParamPath';\nimport {StringParam} from '../../../params/String';\nimport {RampParam} from '../../../params/Ramp';\n// import {PolySopNode} from '../../../nodes/sop/Poly';\n// import {PolyObjNode} from '../../../nodes/obj/Poly';\nimport {PolyNodeJsonExporter} from './nodes/Poly';\n\nexport class JsonExportDispatcher {\n\tdispatchNode(node: BaseNodeType) {\n\t\t// using PolySopNode and PolyObjNode seem to create circular dependency with webpack\n\t\t// if (node instanceof PolySopNode || node instanceof PolyObjNode)\n\t\tif (node.polyNodeController) {\n\t\t\treturn new PolyNodeJsonExporter(node, this);\n\t\t}\n\t\treturn new NodeJsonExporter(node, this);\n\t}\n\n\tdispatchParam(param: BaseParamType) {\n\t\t// if (param instanceof TypedMultipleParam) {\n\t\t// \treturn new ParamMultipleJsonExporter(param);\n\t\t// }\n\t\tif (param instanceof TypedNumericParam) {\n\t\t\treturn new ParamNumericJsonExporter(param);\n\t\t}\n\t\t// if (param instanceof OperatorPathParam) {\n\t\t// \treturn new ParamOperatorPathJsonExporter(param);\n\t\t// }\n\t\tif (param instanceof NodePathParam) {\n\t\t\treturn new ParamNodePathJsonExporter(param);\n\t\t}\n\t\tif (param instanceof ParamPathParam) {\n\t\t\treturn new ParamParamPathJsonExporter(param);\n\t\t}\n\t\tif (param instanceof StringParam) {\n\t\t\treturn new ParamStringJsonExporter(param);\n\t\t}\n\t\tif (param instanceof RampParam) {\n\t\t\treturn new ParamRampJsonExporter(param);\n\t\t}\n\t\treturn new ParamJsonExporter(param);\n\t}\n}\n","import {TypedNode} from '../../../nodes/_Base';\nimport {Vector2} from 'three';\nimport type {JsonImportDispatcher} from './Dispatcher';\nimport {ParamType} from '../../../poly/ParamType';\nimport {ParamsUpdateOptions} from '../../../nodes/utils/params/ParamsController';\nimport {SceneJsonImporter} from '../../../io/json/import/Scene';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {NodeJsonExporterData, NodeJsonExporterUIData, InputData, IoConnectionPointsData} from '../export/Node';\nimport {\n\tParamJsonExporterData,\n\tSimpleParamJsonExporterData,\n\tComplexParamJsonExporterData,\n} from '../../../nodes/utils/io/IOController';\nimport type {NodesJsonImporter} from './Nodes';\nimport {Poly} from '../../../Poly';\nimport { isString,isNumber,isArray,isBoolean,isObject} from '../../../../core/Type';\n// import {CoreString} from '../../../../core/String';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {VelocityColliderFunctionBody} from '../../../nodes/js/code/assemblers/_Base';\n\nconst COMPLEX_PARAM_DATA_KEYS: Readonly<string[]> = ['overriden_options', 'type'];\n\ntype BaseNodeTypeWithIO = TypedNode<NodeContext, any>;\nexport class NodeJsonImporter<T extends BaseNodeTypeWithIO> {\n\tconstructor(\n\t\tprotected _node: T,\n\t\tprivate dispatcher: JsonImportDispatcher,\n\t\tprotected nodesImporter: NodesJsonImporter<any>\n\t) {}\n\n\tprocess_data(scene_importer: SceneJsonImporter, data: NodeJsonExporterData) {\n\t\tif (this._node.sceneReadonly()) {\n\t\t\tscene_importer.report.markAsLoadedWithoutAssemblers();\n\t\t}\n\n\t\tthis.set_connection_points(data['connection_points']);\n\n\t\t// rather than having the children creation dependent on the persisted config and player mode, use the childrenAllowed() method\n\t\t// const skip_create_children = Poly.playerMode() && data.persisted_config;\n\t\tif (this._node.childrenAllowed()) {\n\t\t\tthis.create_nodes(scene_importer, data['nodes'], data);\n\t\t}\n\n\t\t// inputs clone\n\t\tif (this._node.io.inputs.overrideClonedStateAllowed()) {\n\t\t\tconst override = data['cloned_state_overriden'];\n\t\t\tif (override) {\n\t\t\t\tthis._node.io.inputs.overrideClonedState(override);\n\t\t\t}\n\t\t}\n\n\t\tthis.set_flags(data);\n\n\t\t// params\n\t\t// const spare_params_data = ParamJsonImporter.spare_params_data(data['params']);\n\t\t// this.set_params(spare_params_data);\n\t\tthis.set_params(data);\n\n\t\tif (data.persisted_config) {\n\t\t\tconst shadersData = scene_importer.shadersData();\n\t\t\tconst jsFunctionBodiesData = scene_importer.jsFunctionBodiesData();\n\t\t\tif (shadersData) {\n\t\t\t\tlet shaders = shadersData[this._node.path()];\n\t\t\t\t// make sure this is never undefined\n\t\t\t\tif (!shaders) {\n\t\t\t\t\tshaders = {};\n\t\t\t\t}\n\t\t\t\tdata.persisted_config.shaders = shaders;\n\t\t\t}\n\t\t\tif (jsFunctionBodiesData) {\n\t\t\t\tconst jsFunctionBodyData = jsFunctionBodiesData[this._node.path()];\n\t\t\t\tif (jsFunctionBodyData) {\n\t\t\t\t\tif (isString(jsFunctionBodyData)) {\n\t\t\t\t\t\tdata.persisted_config.functionBody = jsFunctionBodyData;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata.persisted_config.functionBody = jsFunctionBodyData as any as VelocityColliderFunctionBody;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.set_persisted_config(data.persisted_config);\n\t\t}\n\n\t\tthis.setCustomData(data);\n\n\t\t// already called in create_node()\n\t\t// this._node.lifecycle.set_creation_completed();\n\t}\n\tprocess_inputs_data(scene_importer: SceneJsonImporter, data: NodeJsonExporterData) {\n\t\tconst maxInputsCount = data.maxInputsCount;\n\t\tif (maxInputsCount != null) {\n\t\t\tconst minCount = this._node.io.inputs.minCount();\n\t\t\tthis._node.io.inputs.setCount(minCount, maxInputsCount);\n\t\t}\n\n\t\ttry {\n\t\t\tthis.setInputs(data['inputs']);\n\t\t} catch (err) {\n\t\t\tconst message = (err as ErrorEvent).message || `failed connecting inputs of node ${data['type']}`;\n\t\t\tscene_importer.report.addWarning(message);\n\t\t\tconsole.warn(data['inputs']);\n\t\t}\n\t}\n\n\tprocess_ui_data(scene_importer: SceneJsonImporter, data: NodeJsonExporterUIData) {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tif (Poly.playerMode()) {\n\t\t\treturn;\n\t\t}\n\t\tconst ui_data = this._node.uiData;\n\t\tconst pos = data['pos'];\n\t\tif (pos) {\n\t\t\tconst vector = new Vector2().fromArray(pos);\n\t\t\tui_data.setPosition(vector);\n\t\t}\n\t\tconst comment = data['comment'];\n\t\tif (comment) {\n\t\t\tui_data.setComment(comment);\n\t\t}\n\t\tconst selection = data['selection'];\n\t\tif (selection) {\n\t\t\tthis.set_selection(selection);\n\t\t}\n\t\tif (this._node.childrenAllowed()) {\n\t\t\tconst nodesData = data['nodes'];\n\t\t\tif (nodesData) {\n\t\t\t\tthis.processNodesUiData(scene_importer, nodesData);\n\t\t\t}\n\t\t}\n\t}\n\n\tcreate_nodes(\n\t\tscene_importer: SceneJsonImporter,\n\t\tdata: PolyDictionary<NodeJsonExporterData> | undefined,\n\t\tnodeData: NodeJsonExporterData\n\t) {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\n\t\t// const nodes_importer = new NodesJsonImporter(this._node);\n\t\tthis.nodesImporter.process_data(scene_importer, data);\n\t}\n\tset_selection(data?: string[]) {\n\t\tif (this._node.childrenAllowed() && this._node.childrenController) {\n\t\t\tif (data && data.length > 0) {\n\t\t\t\tconst selected_nodes: BaseNodeTypeWithIO[] = [];\n\t\t\t\tdata.forEach((node_name) => {\n\t\t\t\t\tconst node = this._node.node(node_name);\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tselected_nodes.push(node);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis._node.childrenController.selection.set(selected_nodes);\n\t\t\t}\n\t\t}\n\t}\n\n\tset_flags(data: NodeJsonExporterData) {\n\t\tconst flags = data['flags'];\n\t\tif (flags) {\n\t\t\tconst bypass = flags['bypass'];\n\t\t\tif (bypass != null) {\n\t\t\t\tthis._node.flags?.bypass?.set(bypass);\n\t\t\t}\n\t\t\tconst display = flags['display'];\n\t\t\tif (display != null) {\n\t\t\t\tthis._node.flags?.display?.set(display);\n\t\t\t}\n\t\t\tconst optimize = flags['optimize'];\n\t\t\tif (optimize != null) {\n\t\t\t\tthis._node.flags?.optimize?.set(optimize);\n\t\t\t}\n\t\t}\n\t}\n\n\tset_connection_points(connection_points_data: IoConnectionPointsData | undefined) {\n\t\tif (!connection_points_data) {\n\t\t\treturn;\n\t\t}\n\t\tif (connection_points_data['in']) {\n\t\t\tthis._node.io.saved_connection_points_data.set_in(connection_points_data['in']);\n\t\t}\n\t\tif (connection_points_data['out']) {\n\t\t\tthis._node.io.saved_connection_points_data.set_out(connection_points_data['out']);\n\t\t}\n\n\t\tif (this._node.io.has_connection_points_controller) {\n\t\t\tthis._node.io.connection_points.update_signature_if_required();\n\t\t}\n\t}\n\n\tprivate setInputs(inputsData?: InputData[]) {\n\t\tif (!inputsData) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet inputData: InputData;\n\t\tfor (let i = 0; i < inputsData.length; i++) {\n\t\t\tinputData = inputsData[i];\n\t\t\tif (inputData && this._node.parent()) {\n\t\t\t\tif (isString(inputData)) {\n\t\t\t\t\tconst inputNodeName = inputData;\n\t\t\t\t\tconst inputNode = this._node.nodeSibling(inputNodeName);\n\t\t\t\t\tthis._node.setInput(i, inputNode);\n\t\t\t\t} else {\n\t\t\t\t\tconst inputNode = this._node.nodeSibling(inputData['node']);\n\t\t\t\t\tlet inputIndex = inputData['index'];\n\t\t\t\t\tconst inputName = inputData['inputName'];\n\t\t\t\t\tlet outputName = inputData['output'];\n\t\t\t\t\tif (inputName != null) {\n\t\t\t\t\t\t// If we have inputName, try and find the input index matching it.\n\t\t\t\t\t\t// If we find nothing, we use inputIndex\n\t\t\t\t\t\tconst connectionPoints = this._node.io.inputs.namedInputConnectionPoints();\n\t\t\t\t\t\tif (connectionPoints) {\n\t\t\t\t\t\t\tconst connectionPointIndex = connectionPoints\n\t\t\t\t\t\t\t\t.map((point) => point?.name().toLowerCase())\n\t\t\t\t\t\t\t\t.indexOf(inputName.toLowerCase());\n\t\t\t\t\t\t\tif (connectionPointIndex >= 0) {\n\t\t\t\t\t\t\t\tinputIndex = connectionPointIndex;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (inputNode != null && outputName != null) {\n\t\t\t\t\t\t// If we have outtputName, try and find the input index matching it.\n\n\t\t\t\t\t\tconst connectionPoints = inputNode.io.outputs.namedOutputConnectionPoints();\n\t\t\t\t\t\tif (connectionPoints) {\n\t\t\t\t\t\t\tfor (let connectionPoint of connectionPoints) {\n\t\t\t\t\t\t\t\tif (connectionPoint) {\n\t\t\t\t\t\t\t\t\tif (connectionPoint.name().toLowerCase() == outputName.toLowerCase()) {\n\t\t\t\t\t\t\t\t\t\toutputName = connectionPoint.name();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (inputIndex != null) {\n\t\t\t\t\t\tthis._node.setInput(inputIndex, inputNode, outputName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprocessNodesUiData(scene_importer: SceneJsonImporter, data: PolyDictionary<NodeJsonExporterUIData>) {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tif (Poly.playerMode()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst node_names = Object.keys(data);\n\t\tfor (let node_name of node_names) {\n\t\t\tconst node = this._node.node(node_name);\n\t\t\tif (node) {\n\t\t\t\tconst node_data = data[node_name];\n\t\t\t\tthis.dispatcher.dispatchNode(node).process_ui_data(scene_importer, node_data);\n\t\t\t\t// node.visit(JsonImporterVisitor).process_ui_data(node_data);\n\t\t\t}\n\t\t}\n\t}\n\n\t//\n\t//\n\t// PARAMS\n\t//\n\t//\n\tset_params(nodeData: NodeJsonExporterData) {\n\t\tconst data = nodeData['params'];\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tconst param_names = Object.keys(data);\n\n\t\tconst params_update_options: ParamsUpdateOptions = {};\n\t\tfor (let param_name of param_names) {\n\t\t\tconst param_data = data[param_name] as ComplexParamJsonExporterData<ParamType>;\n\t\t\tif (param_data != null) {\n\t\t\t\tconst options = param_data['options'];\n\t\t\t\t// const is_spare = options && options['spare'] === true;\n\n\t\t\t\t// make camelCase if required\n\t\t\t\t// if (false && param_name.includes('_')) {\n\t\t\t\t// \tparam_name = CoreString.camelCase(param_name);\n\t\t\t\t// }\n\n\t\t\t\tlet param_type = param_data['type']!;\n\n\t\t\t\tconst has_param = this._node.params.has_param(param_name);\n\t\t\t\tlet has_param_and_same_type = false;\n\t\t\t\tlet param;\n\t\t\t\tif (has_param) {\n\t\t\t\t\tparam = this._node.params.get(param_name);\n\t\t\t\t\t// we can safely consider same type if param_type is not mentioned\n\t\t\t\t\tif ((param && param.type() == param_type) || param_type == null) {\n\t\t\t\t\t\thas_param_and_same_type = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (has_param_and_same_type) {\n\t\t\t\t\tif (this._is_param_data_complex(param_data)) {\n\t\t\t\t\t\tthis._process_param_data_complex(param_name, param_data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._process_param_data_simple(\n\t\t\t\t\t\t\tparam_name,\n\t\t\t\t\t\t\tparam_data as SimpleParamJsonExporterData<ParamType>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// it the param is a spare one,\n\t\t\t\t\t// we check if it is currently exists with same type first.\n\t\t\t\t\t// - if it is, we only update the value\n\t\t\t\t\t// - if it's not, we delete it and add it again\n\t\t\t\t\tparams_update_options.namesToDelete = params_update_options.namesToDelete || [];\n\t\t\t\t\tparams_update_options.namesToDelete.push(param_name);\n\t\t\t\t\tparams_update_options.toAdd = params_update_options.toAdd || [];\n\t\t\t\t\tparams_update_options.toAdd.push({\n\t\t\t\t\t\tname: param_name,\n\t\t\t\t\t\ttype: param_type,\n\t\t\t\t\t\tinitValue: param_data['default_value'] as any,\n\t\t\t\t\t\trawInput: param_data['raw_input'] as any,\n\t\t\t\t\t\toptions: options,\n\t\t\t\t\t});\n\n\t\t\t\t\t// if (options && param_type) {\n\t\t\t\t\t// \tif (param_data['default_value']) {\n\t\t\t\t\t// \t\tif (has_param) {\n\t\t\t\t\t// \t\t\tthis._node.params.delete_param(param_name);\n\t\t\t\t\t// \t\t}\n\t\t\t\t\t// \t\tparam = this._node.add_param(param_type, param_name, param_data['default_value'], options);\n\t\t\t\t\t// \t\tif (param) {\n\t\t\t\t\t// \t\t\tJsonImportDispatcher.dispatch_param(param).process_data(param_data);\n\t\t\t\t\t// \t\t}\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// delete and create the spare params we need to\n\t\tconst params_delete_required =\n\t\t\tparams_update_options.namesToDelete && params_update_options.namesToDelete.length > 0;\n\t\tconst params_add_required = params_update_options.toAdd && params_update_options.toAdd.length > 0;\n\n\t\tif (params_delete_required || params_add_required) {\n\t\t\tthis._node.params.updateParams(params_update_options);\n\t\t\t// update them based on the imported data\n\t\t\tfor (let spare_param of this._node.params.spare) {\n\t\t\t\tconst param_data = data[spare_param.name()] as ComplexParamJsonExporterData<ParamType>;\n\t\t\t\t// JsonImportDispatcher.dispatch_param(spare_param).process_data(param_data);\n\t\t\t\tif (!spare_param.parentParam() && param_data) {\n\t\t\t\t\tif (this._is_param_data_complex(param_data)) {\n\t\t\t\t\t\tthis._process_param_data_complex(spare_param.name(), param_data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._process_param_data_simple(\n\t\t\t\t\t\t\tspare_param.name(),\n\t\t\t\t\t\t\tparam_data as SimpleParamJsonExporterData<ParamType>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// those hooks are useful for some gl nodes,\n\t\t// such as the constant, which needs to update its connections\n\t\t// based on another parameter, which will be set just before\n\t\tthis._node.params.runOnSceneLoadHooks();\n\t}\n\n\tprivate _process_param_data_simple(param_name: string, param_data: SimpleParamJsonExporterData<ParamType>) {\n\t\tthis._node.params.get(param_name)?.set(param_data);\n\t}\n\n\tprivate _process_param_data_complex(param_name: string, param_data: ComplexParamJsonExporterData<ParamType>) {\n\t\tconst param = this._node.params.get(param_name);\n\t\tif (param) {\n\t\t\tthis.dispatcher.dispatchParam(param).process_data(param_data);\n\t\t}\n\t\t// return\n\t\t// const has_param = this._node.params.has_param(param_name);\n\t\t// const param_type = param_data['type']!;\n\n\t\t// let has_param_and_same_type = false;\n\t\t// let param;\n\t\t// if (has_param) {\n\t\t// \tparam = this._node.params.get(param_name);\n\t\t// \t// we can safely consider same type if param_type is not mentioned\n\t\t// \tif ((param && param.type == param_type) || param_type == null) {\n\t\t// \t\thas_param_and_same_type = true;\n\t\t// \t}\n\t\t// }\n\t\t// if (has_param_and_same_type) {\n\t\t// \tparam = this._node.params.get(param_name);\n\t\t// \tif (param) {\n\t\t// \t\tJsonImportDispatcher.dispatch_param(param).process_data(param_data);\n\t\t// \t\t// param.visit(JsonImporterVisitor).process_data(param_data);\n\t\t// \t}\n\t\t// } else {\n\t\t// \tconst options = param_data['options'];\n\t\t// \tif (options && param_type) {\n\t\t// \t\tconst is_spare = options['spare'] === true;\n\t\t// \t\tif (is_spare && param_data['default_value']) {\n\t\t// \t\t\tif (has_param) {\n\t\t// \t\t\t\tthis._node.params.delete_param(param_name);\n\t\t// \t\t\t}\n\t\t// \t\t\tparam = this._node.add_param(param_type, param_name, param_data['default_value'], options);\n\t\t// \t\t\tif (param) {\n\t\t// \t\t\t\tJsonImportDispatcher.dispatch_param(param).process_data(param_data);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\t}\n\n\tprivate _is_param_data_complex(param_data: ParamJsonExporterData<ParamType>): boolean {\n\t\t// we can test here most param value serialized, except for ramp\n\t\tif (\n\t\t\tisString(param_data) ||\n\t\t\tisNumber(param_data) ||\n\t\t\tisArray(param_data) ||\n\t\t\tisBoolean(param_data)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (isObject(param_data)) {\n\t\t\tconst keys = Object.keys(param_data);\n\t\t\tfor (let complex_key of COMPLEX_PARAM_DATA_KEYS) {\n\t\t\t\tif (keys.includes(complex_key)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tset_persisted_config(persisted_config_data: object) {\n\t\tif (this._node.persisted_config) {\n\t\t\tthis._node.persisted_config.load(persisted_config_data);\n\t\t}\n\t}\n\n\tsetCustomData(data: NodeJsonExporterData) {}\n}\n","import {ParamJsonImporter} from '../Param';\nimport {ComplexParamJsonExporterData} from '../../../../nodes/utils/io/IOController';\nimport {TypedMultipleParam} from '../../../../params/_Multiple';\nimport {ParamType} from '../../../../poly/ParamType';\n\nexport class ParamMultipleJsonImporter extends ParamJsonImporter<TypedMultipleParam<ParamType>> {\n\toverride add_main(data: ComplexParamJsonExporterData<ParamType>) {\n\t\t// const components = data['components'];\n\t\t// if (components) {\n\t\t// \tObject.keys(components).forEach((component_name) => {\n\t\t// \t\tconst param_name = `${this._param.name}${component_name}`;\n\t\t// \t\tconst component_param = this._param.node.params\n\t\t// \t\t\t.get(this._param.name)\n\t\t// \t\t\t?.components?.filter((c) => c.name == param_name)[0];\n\t\t// \t\tif (component_param) {\n\t\t// \t\t\tconst component_data = components[component_name];\n\t\t// \t\t\tJsonImportDispatcher.dispatch_param(component_param as FloatParam).process_data(component_data);\n\t\t// \t\t}\n\t\t// \t});\n\t\t// }\n\t}\n}\n","import {ParamJsonImporter} from '../Param';\nimport {ComplexParamJsonExporterData} from '../../../../nodes/utils/io/IOController';\nimport {StringParam} from '../../../../params/String';\nimport {ParamType} from '../../../../poly/ParamType';\n\nconst LINE_BREAK_REGEXP = /\\\\n+/g;\n\nexport class ParamStringJsonImporter extends ParamJsonImporter<StringParam> {\n\toverride add_main(data: ComplexParamJsonExporterData<ParamType.STRING>) {\n\t\tlet raw_input = data['raw_input'];\n\t\tif (raw_input !== undefined) {\n\t\t\t// if (isString(value)) {\n\t\t\traw_input = raw_input.replace(LINE_BREAK_REGEXP, '\\n');\n\t\t\tthis._param.set(raw_input);\n\t\t\t// }\n\t\t}\n\t}\n}\n","import {ParamJsonImporter} from '../Param';\n// import {RampValueJson} from '../../../../params/ramp/RampValue';\nimport {ComplexParamJsonExporterData} from '../../../../nodes/utils/io/IOController';\nimport {RampParam} from '../../../../params/Ramp';\nimport {ParamType} from '../../../../poly/ParamType';\n\nexport class ParamRampJsonImporter extends ParamJsonImporter<RampParam> {\n\toverride add_main(data: ComplexParamJsonExporterData<ParamType.RAMP>) {\n\t\tconst raw_input = data['raw_input']; // as RampValueJson;\n\t\tif (raw_input) {\n\t\t\t// const ramp_value = RampValue.from_json(value);\n\t\t\tthis._param.set(raw_input);\n\t\t}\n\t}\n}\n","import {NodeJsonImporter} from '../Node';\nimport {NodeJsonExporterData} from '../../export/Node';\nimport {SceneJsonImporter} from '../Scene';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\nimport {PolyNodeController} from '../../../../nodes/utils/poly/PolyNodeController';\n\nexport class PolyNodeJsonImporter extends NodeJsonImporter<any> {\n\toverride create_nodes(\n\t\tscene_importer: SceneJsonImporter,\n\t\tdata: PolyDictionary<NodeJsonExporterData>,\n\t\tnodeData: NodeJsonExporterData\n\t) {\n\t\tconst node = this._node;\n\t\tconst polyNodeController = node.polyNodeController as PolyNodeController;\n\t\t// const oldLockedState = polyNodeController.locked();\n\t\tpolyNodeController.setLockedState(false);\n\t\tif (this._isDataLocked(nodeData)) {\n\t\t\tpolyNodeController.createChildNodesFromDefinition();\n\t\t} else {\n\t\t\tsuper.create_nodes(scene_importer, data, nodeData);\n\t\t}\n\t\t// polyNodeController.setLockedState(oldLockedState);\n\t}\n\toverride setCustomData(data: NodeJsonExporterData): void {\n\t\tif (this._node.polyNodeController) {\n\t\t\tthis._node.polyNodeController.setLockedState(this._isDataLocked(data));\n\t\t}\n\t}\n\tprivate _isDataLocked(data: NodeJsonExporterData): boolean {\n\t\tif (data['polyNode']) {\n\t\t\treturn data['polyNode']['locked'];\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n","import type {TypedNode, BaseNodeType} from '../../../nodes/_Base';\nimport type {JsonImportDispatcher} from './Dispatcher';\nimport type {SceneJsonImporter} from '../../../io/json/import/Scene';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport type {NodeJsonExporterData} from '../export/Node';\nimport {ParamJsonImporter} from './Param';\nimport {OptimizedNodesJsonImporter} from './OptimizedNodes';\nimport type {PolyNodeJsonImporter} from './nodes/Poly';\nimport {Poly} from '../../../Poly';\nimport type {NodeJsonImporter} from './Node';\nimport {CoreString} from '../../../../core/String';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\nimport type {NodeCreateOptions} from '../../../nodes/utils/hierarchy/ChildrenController';\n\ntype BaseNodeTypeWithIO = TypedNode<NodeContext, any>;\nexport class NodesJsonImporter<T extends BaseNodeTypeWithIO> {\n\tconstructor(protected _node: T, protected dispatcher: JsonImportDispatcher) {}\n\n\tprocess_data(sceneImporter: SceneJsonImporter, data?: PolyDictionary<NodeJsonExporterData>) {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(this._node.childrenAllowed() && this._node.childrenController)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst {optimized_names, non_optimized_names} = OptimizedNodesJsonImporter.child_names_by_optimized_state(data);\n\t\tconst nonOptimizedNodes: BaseNodeTypeWithIO[] = [];\n\t\tconst migrateHelper = sceneImporter.migrateHelper();\n\t\tfor (let nodeName of non_optimized_names) {\n\t\t\tconst node_data = data[nodeName];\n\t\t\tconst nodeType = migrateHelper ? migrateHelper.migrateNodeType(this._node, node_data) : node_data.type;\n\t\t\tmigrateHelper?.migrateParams(this._node, node_data);\n\t\t\tconst paramsInitValueOverrides = ParamJsonImporter.non_spare_params_data_value(node_data['params']);\n\t\t\tconst nodeCreateOptions: NodeCreateOptions = {\n\t\t\t\tparamsInitValueOverrides,\n\t\t\t\tnodeName,\n\t\t\t};\n\n\t\t\tconst loadNodeAttempt = (nodeType: string, nodeCreateOptions: NodeCreateOptions) => {\n\t\t\t\ttry {\n\t\t\t\t\t// try with current type\n\t\t\t\t\tconst node = this._node.createNode(nodeType, nodeCreateOptions);\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`error importing node: cannot create with type ${nodeType}`, e);\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet node = loadNodeAttempt(nodeType, nodeCreateOptions);\n\n\t\t\tif (!node) {\n\t\t\t\t// try with camelCased type\n\t\t\t\tconst nodeTypeCamelCase = CoreString.camelCase(nodeType);\n\t\t\t\tnode = loadNodeAttempt(nodeTypeCamelCase, nodeCreateOptions);\n\t\t\t}\n\t\t\tif (!node) {\n\t\t\t\t// add Network\n\t\t\t\tconst nodeTypeWithNetwork = `${nodeType}Network`;\n\t\t\t\tnode = loadNodeAttempt(nodeTypeWithNetwork, nodeCreateOptions);\n\t\t\t}\n\t\t\tif (node) {\n\t\t\t\tnonOptimizedNodes.push(node);\n\t\t\t} else {\n\t\t\t\tconst message = `failed to create node with type '${nodeType}' (in '${this._node.path()}')`;\n\t\t\t\tsceneImporter.report.addWarning(message);\n\t\t\t\tPoly.warn(message);\n\t\t\t}\n\n\t\t\t// try {\n\t\t\t// \t// try with current type\n\t\t\t// \tconst node = this._node.createNode(nodeType, nodeCreateOptions);\n\t\t\t// \tif (node) {\n\t\t\t// \t\t// node.setName(node_name);\n\t\t\t// \t\tnonOptimizedNodes.push(node);\n\t\t\t// \t}\n\t\t\t// } catch (e) {\n\t\t\t// \t// try with camelCased type\n\t\t\t// \tconsole.error(`error importing node: cannot create with type ${nodeType}`, e);\n\t\t\t// \tconst nodeTypeCamelCase = CoreString.camelCase(nodeType);\n\t\t\t// \ttry {\n\t\t\t// \t\tconst node = this._node.createNode(nodeTypeCamelCase, nodeCreateOptions);\n\t\t\t// \t\tif (node) {\n\t\t\t// \t\t\t// node.setName(node_name);\n\t\t\t// \t\t\tnonOptimizedNodes.push(node);\n\t\t\t// \t\t}\n\t\t\t// \t} catch (e) {\n\t\t\t// \t\t// add Network\n\t\t\t// \t\tconst nodeTypeWithNetwork = `${nodeType}Network`;\n\t\t\t// \t\ttry {\n\t\t\t// \t\t\tconst node = this._node.createNode(nodeTypeWithNetwork, nodeCreateOptions);\n\t\t\t// \t\t\tif (node) {\n\t\t\t// \t\t\t\t// node.setName(node_name);\n\t\t\t// \t\t\t\tnonOptimizedNodes.push(node);\n\t\t\t// \t\t\t}\n\t\t\t// \t\t} catch (e) {\n\t\t\t// \t\t\tconst message = `failed to create node with type '${nodeType}', '${nodeTypeCamelCase}' or '${nodeTypeWithNetwork}'`;\n\t\t\t// \t\t\tscene_importer.report.addWarning(message);\n\t\t\t// \t\t\tPoly.warn(message, e);\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// }\n\t\t}\n\n\t\tif (optimized_names.length > 0) {\n\t\t\tconst optimized_nodes_importer = new OptimizedNodesJsonImporter(this._node);\n\t\t\toptimized_nodes_importer.process_data(sceneImporter, data);\n\n\t\t\t// ensure that the display node is still created\n\t\t\t// as it may not be if the display flag is set to a node that will\n\t\t\t// be part of an optimized series of nodes\n\t\t\t// for instance\n\t\t\t// A -> B > C\n\t\t\t// D -> E\n\t\t\t// if A, B and C are optimized,\n\t\t\t// and D, E are not\n\t\t\t// And B has the display flag,\n\t\t\t// what will happen is that B will not exist anymore\n\t\t\t// and the display flag will end up in either C, D or E\n\t\t\t// which can lead to unexpected display in the player\n\t\t\tif (this._node.childrenController.context == NodeContext.SOP) {\n\t\t\t\tconst nodeNames = Object.keys(data);\n\t\t\t\tlet nodeNameWithDisplayFlag: string | undefined = undefined;\n\t\t\t\tfor (let nodeName of nodeNames) {\n\t\t\t\t\tconst nodeData = data[nodeName];\n\t\t\t\t\tif (nodeData.flags?.display) {\n\t\t\t\t\t\tnodeNameWithDisplayFlag = nodeName;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (nodeNameWithDisplayFlag) {\n\t\t\t\t\tconst existingNodeNames = nonOptimizedNodes.map((n) => n.name());\n\t\t\t\t\tconst optimizedNodes = optimized_nodes_importer.nodes();\n\t\t\t\t\tfor (let optimizedNode of optimizedNodes) {\n\t\t\t\t\t\texistingNodeNames.push(optimizedNode.name());\n\t\t\t\t\t}\n\t\t\t\t\tif (!existingNodeNames.includes(nodeNameWithDisplayFlag)) {\n\t\t\t\t\t\tconst parentFullPath = this._node.path();\n\t\t\t\t\t\tconst nodeFullPath = `${parentFullPath}/${nodeNameWithDisplayFlag}`;\n\t\t\t\t\t\tconst message = `node '${nodeFullPath}' with display flag has been optimized and does not exist in player mode`;\n\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst importers_by_node_name: Map<string, PolyNodeJsonImporter | NodeJsonImporter<BaseNodeType>> = new Map();\n\t\tfor (let node of nonOptimizedNodes) {\n\t\t\tconst child_data = data[node.name()];\n\t\t\tif (child_data) {\n\t\t\t\tconst importer = this.dispatcher.dispatchNode(node);\n\t\t\t\timporters_by_node_name.set(node.name(), importer);\n\t\t\t\timporter.process_data(sceneImporter, data[node.name()]);\n\t\t\t} else {\n\t\t\t\tPoly.warn(`possible import error for node ${node.name()}`);\n\t\t\t\tPoly.log('available names are', Object.keys(data).sort(), data);\n\t\t\t}\n\t\t}\n\t\tfor (let node of nonOptimizedNodes) {\n\t\t\tconst importer = importers_by_node_name.get(node.name());\n\t\t\tif (importer) {\n\t\t\t\timporter.process_inputs_data(sceneImporter, data[node.name()]);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../../../nodes/_Base';\nimport {BaseParamType} from '../../../params/_Base';\n\nimport {NodeJsonImporter} from './Node';\n// import {BaseNodeObjJsonImporter} from './node/Obj';\n// import {BaseNodeSopSubnetworkJsonImporter} from './node/Subnetwork';\n\nimport {ParamJsonImporter} from './Param';\nimport {ParamMultipleJsonImporter} from './param/Multiple';\nimport {ParamStringJsonImporter} from './param/String';\nimport {ParamRampJsonImporter} from './param/Ramp';\n// import {TypedObjNode} from '../../../nodes/obj/_Base';\nimport {TypedMultipleParam} from '../../../params/_Multiple';\nimport {StringParam} from '../../../params/String';\nimport {RampParam} from '../../../params/Ramp';\n// import {PolySopNode} from '../../../nodes/sop/Poly';\n// import {PolyObjNode} from '../../../nodes/obj/Poly';\nimport {PolyNodeJsonImporter} from './nodes/Poly';\nimport {NodesJsonImporter} from './Nodes';\n\nexport class JsonImportDispatcher {\n\tdispatchNode(node: BaseNodeType) {\n\t\t// using PolySopNode and PolyObjNode seem to create circular dependency with webpack\n\t\t// if (node instanceof PolySopNode || node instanceof PolyObjNode)\n\t\tif (node.polyNodeController) {\n\t\t\treturn this._dispatchPolyNode(node);\n\t\t}\n\t\treturn this.dispatchNonPolyNode(node);\n\t}\n\tprivate _dispatchPolyNode(node: BaseNodeType) {\n\t\tconst nodesImporter = new NodesJsonImporter(node, this);\n\t\treturn new PolyNodeJsonImporter(node, this, nodesImporter);\n\t}\n\tdispatchNonPolyNode(node: BaseNodeType) {\n\t\tconst nodesImporter = new NodesJsonImporter(node, this);\n\t\treturn new NodeJsonImporter(node, this, nodesImporter);\n\t}\n\n\tdispatchParam(param: BaseParamType) {\n\t\tif (param instanceof TypedMultipleParam) {\n\t\t\treturn new ParamMultipleJsonImporter(param);\n\t\t}\n\t\tif (param instanceof StringParam) {\n\t\t\treturn new ParamStringJsonImporter(param);\n\t\t}\n\t\tif (param instanceof RampParam) {\n\t\t\treturn new ParamRampJsonImporter(param);\n\t\t}\n\t\treturn new ParamJsonImporter(param);\n\t}\n}\n\n// export class CodeImporterVisitor {\n// \tstatic node(node: BaseNode): NodeCodeImporter {\n// \t\treturn new NodeCodeImporter(node);\n// \t}\n// \tstatic node_obj(node: BaseNode) {\n// \t\treturn new BaseNodeObjCodeImporter(node);\n// \t}\n// \tstatic node_sop_subnetwork(node: BaseNode) {\n// \t\treturn new BaseNodeSopSubnetworkCodeImporter(node);\n// \t}\n\n// \tstatic visit_param(param: BaseParam) {\n// \t\treturn new ParamCodeImporter(param);\n// \t}\n// \tstatic param_multiple(param: BaseParam) {\n// \t\treturn new ParamMultipleCodeImporter(param);\n// \t}\n// \tstatic param_numeric(param: BaseParam) {\n// \t\treturn new ParamNumericCodeImporter(param);\n// \t}\n// \tstatic param_operator_path(param: BaseParam) {\n// \t\treturn new ParamOperatorPathCodeImporter(param);\n// \t}\n// \tstatic param_string(param: BaseParam) {\n// \t\treturn new ParamStringCodeImporter(param);\n// \t}\n// \tstatic param_ramp(param: BaseParam) {\n// \t\treturn new ParamRampCodeImporter(param);\n// \t}\n// }\n","import {TypedNode, BaseNodeType} from '../../../nodes/_Base';\nimport {SceneJsonImporter} from '../../../io/json/import/Scene';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {NodeJsonExporterData} from '../export/Node';\nimport {ParamJsonImporter} from './Param';\nimport {Poly} from '../../../Poly';\nimport {OperationsComposerSopNode} from '../../../nodes/sop/OperationsComposer';\nimport {SopOperationContainer} from '../../../../engine/operations/container/sop';\nimport {OPERATIONS_COMPOSER_NODE_TYPE} from '../../../operations/_Base';\nimport {isString} from '../../../../core/Type';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {NodeCreateOptions} from '../../../nodes/utils/hierarchy/ChildrenController';\nimport {TypedNodeConnection} from '../../../nodes/utils/io/NodeConnection';\n\ntype BaseNodeTypeWithIO = TypedNode<NodeContext, any>;\n\ninterface RootNodeGenericData {\n\toutputs_count: number;\n\tnon_optimized_count: number;\n}\n\nexport class OptimizedNodesJsonImporter<T extends BaseNodeTypeWithIO> {\n\tconstructor(protected _node: T) {}\n\n\tprivate _nodes: BaseNodeTypeWithIO[] = [];\n\tprivate _optimized_root_node_names: Set<string> = new Set();\n\tprivate _operation_containers_by_name: Map<string, SopOperationContainer> = new Map();\n\tnodes() {\n\t\treturn this._nodes;\n\t}\n\n\tprocess_data(scene_importer: SceneJsonImporter, data?: PolyDictionary<NodeJsonExporterData>) {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(this._node.childrenAllowed() && this._node.childrenController)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst {optimized_names} = OptimizedNodesJsonImporter.child_names_by_optimized_state(data);\n\n\t\tthis._nodes = [];\n\t\tthis._optimized_root_node_names = new Set();\n\t\tfor (let node_name of optimized_names) {\n\t\t\tif (OptimizedNodesJsonImporter.is_optimized_root_node(data, node_name)) {\n\t\t\t\tthis._optimized_root_node_names.add(node_name);\n\t\t\t}\n\t\t}\n\n\t\tfor (let nodeName of this._optimized_root_node_names) {\n\t\t\tconst node_data = data[nodeName];\n\t\t\tconst nodeCreateOptions: NodeCreateOptions = {\n\t\t\t\tnodeName,\n\t\t\t};\n\t\t\tconst node = this._node.createNode(OPERATIONS_COMPOSER_NODE_TYPE, nodeCreateOptions);\n\t\t\tif (node) {\n\t\t\t\tthis._nodes.push(node);\n\n\t\t\t\t// ensure the display flag is set accordingly\n\t\t\t\tif (node_data.flags?.display) {\n\t\t\t\t\tnode.flags?.display?.set(true);\n\t\t\t\t}\n\t\t\t\tconst operation_container = this._createOperationContainer(\n\t\t\t\t\tscene_importer,\n\t\t\t\t\tnode as OperationsComposerSopNode,\n\t\t\t\t\tnode_data,\n\t\t\t\t\tnode.name()\n\t\t\t\t);\n\t\t\t\t(node as OperationsComposerSopNode).setOutputOperationContainer(\n\t\t\t\t\toperation_container as SopOperationContainer\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfor (let node of this._nodes) {\n\t\t\tconst operation_container = (node as OperationsComposerSopNode).outputOperationContainer();\n\t\t\tif (operation_container) {\n\t\t\t\tthis._node_inputs = [];\n\t\t\t\tthis._add_optimized_node_inputs(\n\t\t\t\t\tscene_importer,\n\t\t\t\t\tnode as OperationsComposerSopNode,\n\t\t\t\t\tdata,\n\t\t\t\t\tnode.name(),\n\t\t\t\t\toperation_container\n\t\t\t\t);\n\t\t\t\tnode.io.inputs.setCount(this._node_inputs.length);\n\t\t\t\tfor (let i = 0; i < this._node_inputs.length; i++) {\n\t\t\t\t\tnode.setInput(i, this._node_inputs[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _node_inputs: BaseNodeType[] = [];\n\tprivate _add_optimized_node_inputs(\n\t\tscene_importer: SceneJsonImporter,\n\t\tnode: OperationsComposerSopNode,\n\t\tdata: PolyDictionary<NodeJsonExporterData>,\n\t\tnode_name: string,\n\t\tcurrent_operation_container: SopOperationContainer\n\t) {\n\t\tconst node_data: NodeJsonExporterData = data[node_name];\n\t\tconst inputs_data = node_data['inputs'];\n\t\tif (!inputs_data) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let input_data of inputs_data) {\n\t\t\tif (isString(input_data)) {\n\t\t\t\tconst input_node_data = data[input_data];\n\t\t\t\tif (input_node_data) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tOptimizedNodesJsonImporter.is_node_optimized(input_node_data) &&\n\t\t\t\t\t\t!this._optimized_root_node_names.has(input_data) // ensure it is not a root\n\t\t\t\t\t) {\n\t\t\t\t\t\t// ensure we do not create multiple operation containers from the same node\n\t\t\t\t\t\tlet operation_container = this._operation_containers_by_name.get(input_data);\n\t\t\t\t\t\tif (!operation_container) {\n\t\t\t\t\t\t\t// if the input is an optimized node, we create an operation and go recursive\n\t\t\t\t\t\t\toperation_container = this._createOperationContainer(\n\t\t\t\t\t\t\t\tscene_importer,\n\t\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\tinput_node_data,\n\t\t\t\t\t\t\t\tinput_data\n\t\t\t\t\t\t\t) as SopOperationContainer;\n\t\t\t\t\t\t\tif (operation_container) {\n\t\t\t\t\t\t\t\tthis._add_optimized_node_inputs(\n\t\t\t\t\t\t\t\t\tscene_importer,\n\t\t\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\tinput_data,\n\t\t\t\t\t\t\t\t\toperation_container\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent_operation_container.addInput(operation_container);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// if the input is NOT an optimized node, we set the input to the node\n\t\t\t\t\t\tconst input_node = node.parent()?.node(input_data);\n\t\t\t\t\t\tif (input_node) {\n\t\t\t\t\t\t\tthis._node_inputs.push(input_node);\n\t\t\t\t\t\t\tconst node_input_index = this._node_inputs.length - 1;\n\t\t\t\t\t\t\t// node.setInput(node_input_index, input_node as BaseSopNodeType);\n\t\t\t\t\t\t\tnode.addInputConfig(current_operation_container, {\n\t\t\t\t\t\t\t\toperation_input_index: current_operation_container.currentInputIndex(),\n\t\t\t\t\t\t\t\tnode_input_index: node_input_index,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcurrent_operation_container.incrementInputIndex();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// once the inputs have been set, we can initialize the inputs_clone_state\n\t\tif (node_data.cloned_state_overriden == true) {\n\t\t\tcurrent_operation_container.overrideInputCloneState(node_data.cloned_state_overriden);\n\t\t}\n\t}\n\n\tstatic child_names_by_optimized_state(data: PolyDictionary<NodeJsonExporterData>) {\n\t\tconst node_names = Object.keys(data);\n\t\tconst optimized_names: string[] = [];\n\t\tconst non_optimized_names: string[] = [];\n\t\tfor (let node_name of node_names) {\n\t\t\tconst node_data = data[node_name];\n\t\t\tconst optimized_state = Poly.playerMode() && this.is_node_optimized(node_data);\n\t\t\tif (optimized_state) {\n\t\t\t\toptimized_names.push(node_name);\n\t\t\t} else {\n\t\t\t\tnon_optimized_names.push(node_name);\n\t\t\t}\n\t\t}\n\t\treturn {optimized_names, non_optimized_names};\n\t}\n\n\t// private _optimized_names_for_root(\n\t// \tdata: PolyDictionary<NodeJsonExporterData>,\n\t// \tcurrent_node_name: string,\n\t// \tcurrent_node_data: NodeJsonExporterData,\n\t// \tinput_names: string[] = []\n\t// ) {\n\t// \tinput_names.push(current_node_name);\n\t// \tconst inputs = current_node_data['inputs'];\n\t// \tif (inputs) {\n\t// \t\tfor (let input_data of inputs) {\n\t// \t\t\tif (isString(input_data)) {\n\t// \t\t\t\tconst input_node_name = input_data;\n\t// \t\t\t\t// if (input_node_name != current_node_name) {\n\t// \t\t\t\tconst input_node_data = data[input_node_name];\n\n\t// \t\t\t\tif (input_node_data) {\n\t// \t\t\t\t\tif (\n\t// \t\t\t\t\t\tOptimizedNodesJsonImporter.is_node_optimized(input_node_data) &&\n\t// \t\t\t\t\t\t!this._is_optimized_root_node(data, input_node_name, input_node_data)\n\t// \t\t\t\t\t) {\n\t// \t\t\t\t\t\tthis._optimized_names_for_root(data, input_node_name, input_node_data, input_names);\n\t// \t\t\t\t\t}\n\t// \t\t\t\t}\n\t// \t\t\t\t// }\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \treturn input_names;\n\t// }\n\n\t// a node will be considered optimized root node if:\n\t// - it has no output\n\t// - at least one output is not optimized (as it if it has 2 outputs, and only 1 is optimized, it will not be considered root)\n\tstatic is_optimized_root_node_generic(data: RootNodeGenericData): boolean {\n\t\tif (data.outputs_count == 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (data.non_optimized_count > 0) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tstatic is_optimized_root_node(data: PolyDictionary<NodeJsonExporterData>, current_node_name: string) {\n\t\tconst output_names = this.node_outputs(data, current_node_name);\n\n\t\tlet non_optimized_count = 0;\n\t\toutput_names.forEach((node_name) => {\n\t\t\tconst node_data = data[node_name];\n\t\t\tif (!this.is_node_optimized(node_data)) {\n\t\t\t\tnon_optimized_count++;\n\t\t\t}\n\t\t});\n\n\t\treturn this.is_optimized_root_node_generic({\n\t\t\toutputs_count: output_names.size,\n\t\t\tnon_optimized_count: non_optimized_count,\n\t\t});\n\t}\n\t// same algo as is_optimized_root_node, but for a node\n\tstatic is_optimized_root_node_from_node<NC extends NodeContext>(node: TypedNode<NC, any>) {\n\t\tif (!node.flags?.optimize?.active()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst outputConnections: TypedNodeConnection<NC>[] = [];\n\t\tnode.io.connections.outputConnections(outputConnections);\n\t\tconst outputNodes = outputConnections.map((c) => c.nodeDest());\n\t\tlet non_optimized_count = 0;\n\t\tfor (let output_node of outputNodes) {\n\t\t\tif (!output_node.flags?.optimize?.active()) {\n\t\t\t\tnon_optimized_count++;\n\t\t\t}\n\t\t}\n\t\treturn this.is_optimized_root_node_generic({\n\t\t\toutputs_count: outputNodes.length,\n\t\t\tnon_optimized_count: non_optimized_count,\n\t\t});\n\t}\n\n\tstatic node_outputs(\n\t\tdata: PolyDictionary<NodeJsonExporterData>,\n\t\tcurrent_node_name: string\n\t\t// current_node_data: NodeJsonExporterData\n\t) {\n\t\tconst node_names = Object.keys(data);\n\t\tconst output_node_names: Set<string> = new Set();\n\t\tfor (let node_name of node_names) {\n\t\t\tif (node_name != current_node_name) {\n\t\t\t\tconst node_data = data[node_name];\n\t\t\t\tconst inputs = node_data['inputs'];\n\t\t\t\tif (inputs) {\n\t\t\t\t\tfor (let input_data of inputs) {\n\t\t\t\t\t\tif (isString(input_data)) {\n\t\t\t\t\t\t\tconst input_node_name = input_data;\n\t\t\t\t\t\t\tif (input_node_name == current_node_name) {\n\t\t\t\t\t\t\t\toutput_node_names.add(node_name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output_node_names;\n\t}\n\n\tprivate _createOperationContainer(\n\t\tscene_importer: SceneJsonImporter,\n\t\tnode: OperationsComposerSopNode,\n\t\tnode_data: NodeJsonExporterData,\n\t\tnode_name: string\n\t) {\n\t\tconst paramsInitValueOverrides = ParamJsonImporter.non_spare_params_data_value(node_data['params']);\n\t\tconst operation_type = OptimizedNodesJsonImporter.operation_type(node_data);\n\t\tconst createOptions: NodeCreateOptions = {paramsInitValueOverrides};\n\t\tconst operation_container = this._node.createOperationContainer(\n\t\t\toperation_type,\n\t\t\tnode_name,\n\t\t\tcreateOptions\n\t\t) as SopOperationContainer;\n\t\tif (operation_container) {\n\t\t\t// ensure we do not create another operation container from the same node\n\t\t\tthis._operation_containers_by_name.set(node_name, operation_container);\n\n\t\t\t// store for path_param resolve when all nodes are created\n\t\t\tif (operation_container.pathParamResolveRequired()) {\n\t\t\t\tnode.addOperationContainerWithPathParamResolveRequired(operation_container);\n\t\t\t\tscene_importer.add_operations_composer_node_with_path_param_resolve_required(node);\n\t\t\t}\n\t\t}\n\n\t\treturn operation_container;\n\t}\n\n\tstatic operation_type(node_data: NodeJsonExporterData) {\n\t\tif (OptimizedNodesJsonImporter.is_node_bypassed(node_data)) {\n\t\t\treturn 'null';\n\t\t}\n\t\treturn node_data['type'];\n\t}\n\n\tstatic is_node_optimized(node_data: NodeJsonExporterData) {\n\t\tconst node_flags = node_data['flags'];\n\t\tif (node_flags && node_flags['optimize']) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tstatic is_node_bypassed(node_data: NodeJsonExporterData) {\n\t\tconst node_flags = node_data['flags'];\n\t\tif (node_flags && node_flags['bypass']) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n","import {BaseParamType} from '../../../params/_Base';\nimport {\n\tComplexParamJsonExporterData,\n\tParamJsonExporterData,\n\tParamsJsonExporterData,\n\tSimpleParamJsonExporterData,\n\tParamsInitData,\n} from '../../../nodes/utils/io/IOController';\nimport {ParamType} from '../../../poly/ParamType';\n\nexport class ParamJsonImporter<T extends BaseParamType> {\n\tconstructor(protected _param: T) {}\n\n\tprocess_data(data: ComplexParamJsonExporterData<ParamType>) {\n\t\tconst raw_input = data['raw_input'];\n\t\t// const expression = data['expression'];\n\t\t// const components = data['components'];\n\t\t// if (expression !== undefined) {\n\t\t// \tthis._param.set(expression);\n\t\t// }\n\t\tif (raw_input !== undefined) {\n\t\t\tthis._param.set(raw_input);\n\t\t}\n\n\t\t// const referenced_asset = data['referenced_asset']\n\t\t// if(referenced_asset){\n\t\t// \tthis._param.mark_as_referencing_asset(referenced_asset)\n\t\t// }\n\n\t\tthis.add_main(data);\n\t}\n\n\tadd_main(data: ComplexParamJsonExporterData<ParamType>) {}\n\n\tstatic spare_params_data(params_data?: ParamsJsonExporterData) {\n\t\treturn this.params_data(true, params_data);\n\t}\n\n\tstatic non_spare_params_data_value(params_data?: ParamsJsonExporterData): ParamsInitData | undefined {\n\t\treturn this.params_data_value(false, params_data);\n\t}\n\tstatic params_data(spare: boolean, params_data?: ParamsJsonExporterData): ParamsJsonExporterData | undefined {\n\t\tlet non_spare_params_data: ParamsJsonExporterData | undefined;\n\t\tif (params_data) {\n\t\t\tnon_spare_params_data = {};\n\t\t\tconst param_names = Object.keys(params_data);\n\t\t\tlet param_data: ParamJsonExporterData<ParamType>;\n\t\t\tfor (let param_name of param_names) {\n\t\t\t\tparam_data = params_data[param_name];\n\t\t\t\tif (param_data) {\n\t\t\t\t\tnon_spare_params_data[param_name] = params_data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn non_spare_params_data;\n\t}\n\tprivate static params_data_value(spare: boolean, params_data?: ParamsJsonExporterData): ParamsInitData | undefined {\n\t\tlet non_spare_params_data: ParamsInitData | undefined;\n\t\tif (params_data) {\n\t\t\tnon_spare_params_data = {};\n\t\t\tconst param_names = Object.keys(params_data);\n\t\t\tlet param_data: ParamJsonExporterData<ParamType>;\n\t\t\tfor (let param_name of param_names) {\n\t\t\t\tparam_data = params_data[param_name];\n\t\t\t\tif (param_data != null) {\n\t\t\t\t\tconst options = (param_data as ComplexParamJsonExporterData<ParamType>).options;\n\t\t\t\t\tconst overriden_options = (param_data as ComplexParamJsonExporterData<ParamType>).overriden_options;\n\t\t\t\t\tif (options || overriden_options) {\n\t\t\t\t\t\tconst complex_data = param_data as ComplexParamJsonExporterData<ParamType>;\n\t\t\t\t\t\tif (options && options.spare == spare) {\n\t\t\t\t\t\t\tif (complex_data.raw_input != null) {\n\t\t\t\t\t\t\t\tnon_spare_params_data[param_name] = {complex_data: complex_data};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// TODO: THIS IS A MESS\n\t\t\t\t\t\t\tif (overriden_options) {\n\t\t\t\t\t\t\t\tnon_spare_params_data[param_name] = {complex_data: complex_data};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// TODO: THIS IS A MESS\n\t\t\t\t\t\tconst simple_data = param_data as SimpleParamJsonExporterData<ParamType>;\n\t\t\t\t\t\tif (overriden_options || simple_data != null) {\n\t\t\t\t\t\t\tnon_spare_params_data[param_name] = {\n\t\t\t\t\t\t\t\tsimple_data: simple_data,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn non_spare_params_data;\n\t}\n}\n","import {CoreFeaturesController} from './../../../../core/FeaturesController';\nimport {SceneJsonImporter} from './Scene';\n\nexport class ImportReport {\n\tprivate _warnings: string[] = [];\n\tprivate _readonly: boolean = false;\n\tprivate _loadedWithoutAssemblers: boolean = false;\n\tconstructor(_sceneImporter: SceneJsonImporter) {}\n\n\twarnings() {\n\t\treturn this._warnings;\n\t}\n\treadonly() {\n\t\treturn this._readonly;\n\t}\n\tloadedWithoutAssemblers() {\n\t\treturn this._loadedWithoutAssemblers;\n\t}\n\n\treset() {\n\t\tthis._warnings = [];\n\t}\n\n\tmarkAsLoadedWithoutAssemblers() {\n\t\tthis._readonly = true;\n\t\tthis._loadedWithoutAssemblers = true;\n\t}\n\taddWarning(message: string) {\n\t\tthis._warnings.push(message);\n\t\tif (CoreFeaturesController.debugLoadProgress()) {\n\t\t\tconsole.warn(message);\n\t\t}\n\t}\n}\n","import {CoreFeaturesController} from './../../../../core/FeaturesController';\nimport {NodeJsonExporterData} from './../export/Node';\nimport {BaseNodeType} from './../../../nodes/_Base';\nimport {NodeContext} from './../../../poly/NodeContext';\nimport {PolyNodeController} from './../../../nodes/utils/poly/PolyNodeController';\nimport {PolyScene} from '../../../scene/PolyScene';\n// import {JsonImporterVisitor} from './Visitor'\nimport {SceneJsonExporterData} from '../export/Scene';\nimport {JsonImportDispatcher} from './Dispatcher';\nimport {ImportReport} from './ImportReport';\nimport {OperationsComposerSopNode} from '../../../nodes/sop/OperationsComposer';\nimport {TimeController} from '../../../scene/utils/TimeController';\nimport {ParamJsonImporter} from './Param';\nimport {NodeCreateOptions} from '../../../nodes/utils/hierarchy/ChildrenController';\nimport {ROOT_NODE_NAME} from '../../../nodes/manager/Root';\nimport {CoreNodeSerializer} from '../../../nodes/utils/CoreNodeSerializer';\nimport {CoreParamSerializer} from '../../../params/utils/CoreParamSerializer';\nimport type {ParamType} from '../../../poly/ParamType';\nexport type ConfigureSceneCallback = (scene: PolyScene) => void;\nexport type NodeCookWatchCallback = (scene: PolyScene) => void;\n\nexport interface SerializerOptions {\n\tnodeSerializerClass: typeof CoreNodeSerializer;\n\tparamsSerializerClass: typeof CoreParamSerializer<ParamType>;\n}\ninterface SceneJSONImporterOptions {\n\tsceneName?: string;\n\tconfigureScene?: ConfigureSceneCallback;\n\tnodeCookWatcher?: NodeCookWatchCallback;\n\tmeasurePerformanceOnLoad?: boolean;\n\tserializers?: SerializerOptions;\n}\n\ninterface MigrateHelper {\n\tmigrateData: (data: SceneJsonExporterData) => SceneJsonExporterData;\n\tmigrateNodeType: (parentNode: BaseNodeType, nodeData: NodeJsonExporterData) => string;\n\tmigrateParams: (parentNode: BaseNodeType, nodeData: NodeJsonExporterData) => void;\n}\n\nexport class SceneJsonImporter {\n\tpublic readonly report = new ImportReport(this);\n\tprivate _base_operations_composer_nodes_with_resolve_required: OperationsComposerSopNode[] | undefined;\n\tconstructor(private _data: SceneJsonExporterData, private _options?: SceneJSONImporterOptions) {}\n\n\tstatic async loadData(data: SceneJsonExporterData, options?: SceneJSONImporterOptions) {\n\t\tconst importer = new SceneJsonImporter(data, options);\n\t\treturn await importer.scene(options?.serializers);\n\t}\n\tprivate _migrateHelper: MigrateHelper | undefined;\n\tsetMigrateHelper(migrateHelper: MigrateHelper) {\n\t\tthis._migrateHelper = migrateHelper;\n\t}\n\tmigrateHelper() {\n\t\treturn this._migrateHelper;\n\t}\n\toldPolygonjsSceneVersion() {\n\t\tconst properties = this._data['properties'];\n\t\tif (properties) {\n\t\t\treturn properties.versions?.polygonjs;\n\t\t}\n\t}\n\n\tscene(options?: SerializerOptions): PolyScene {\n\t\tif (this._migrateHelper) {\n\t\t\tthis._data = this._migrateHelper.migrateData(this._data);\n\t\t}\n\n\t\tif (CoreFeaturesController.debugLoadProgress()) {\n\t\t\tconsole.log(`polygonjs version:${this.oldPolygonjsSceneVersion()}`);\n\t\t}\n\t\tconst rootData = this._data['root']!;\n\t\tconst paramsInitValueOverrides = ParamJsonImporter.non_spare_params_data_value(rootData['params']);\n\t\tconst nodeCreateOptions: NodeCreateOptions = {\n\t\t\tparamsInitValueOverrides,\n\t\t\tnodeName: ROOT_NODE_NAME,\n\t\t\tserializerClass: options?.nodeSerializerClass,\n\t\t};\n\n\t\tconst embeddedPolyNodes = this._data.embeddedPolyNodes;\n\t\tif (embeddedPolyNodes) {\n\t\t\tconst keys = Object.keys(embeddedPolyNodes);\n\t\t\tfor (let key of keys) {\n\t\t\t\tconst elements = key.split('/');\n\t\t\t\tconst nodeContext = elements[0] as NodeContext;\n\t\t\t\tconst nodeType = elements[1];\n\t\t\t\tconst data = embeddedPolyNodes[key];\n\t\t\t\tPolyNodeController.createNodeClassAndRegister({\n\t\t\t\t\tnode_context: nodeContext,\n\t\t\t\t\tnode_type: nodeType,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst scene = new PolyScene({root: nodeCreateOptions, paramsSerializerClass: options?.paramsSerializerClass});\n\t\tif (this._options) {\n\t\t\tif (this._options.sceneName) {\n\t\t\t\tscene.setName(this._options.sceneName);\n\t\t\t}\n\t\t\tif (this._options.measurePerformanceOnLoad == true) {\n\t\t\t\tscene.performance.start();\n\t\t\t}\n\t\t}\n\t\tscene.loadingController.markAsLoading();\n\n\t\t// scene.set_js_version(this._data['__js_version'])\n\t\tconst properties = this._data['properties'];\n\t\tif (properties) {\n\t\t\t// properties.versions?.polygonjs\n\t\t\t// scene.setName(properties['name'])\n\t\t\tconst maxFrame = properties['maxFrame'] || 600;\n\t\t\tscene.timeController.setMaxFrame(maxFrame);\n\t\t\tconst maxFrameLocked = properties['maxFrameLocked'];\n\t\t\tif (maxFrameLocked) {\n\t\t\t\tscene.timeController.setMaxFrameLocked(maxFrameLocked);\n\t\t\t}\n\t\t\tconst realtimeState = properties['realtimeState'];\n\t\t\tif (realtimeState != null) {\n\t\t\t\tscene.timeController.setRealtimeState(realtimeState);\n\t\t\t}\n\t\t\t// set frame after the range has been set, to avoid clamping\n\t\t\tscene.setFrame(properties['frame'] || TimeController.START_FRAME);\n\n\t\t\t// scene.time_controller.set_fps(properties['fps'] || 30);\n\t\t\tconst mainCameraPath = properties['mainCameraNodePath'] || properties['mainCameraPath'];\n\t\t\tif (mainCameraPath) {\n\t\t\t\tscene.camerasController.setMainCameraPath(mainCameraPath);\n\t\t\t}\n\t\t}\n\n\t\t// we block to ensure that nodes will not run their dirty_hooks\n\t\t// which would trigger operator_path params to search for nodes that\n\t\t// may not exist yet\n\t\tscene.cooker.block();\n\n\t\tthis._base_operations_composer_nodes_with_resolve_required = undefined;\n\n\t\tconst dispatcher = new JsonImportDispatcher();\n\t\tconst importer = dispatcher.dispatchNode(scene.root());\n\n\t\tif (rootData) {\n\t\t\timporter.process_data(this, rootData);\n\t\t}\n\t\tconst uiData = this._data['ui'];\n\t\tif (uiData) {\n\t\t\timporter.process_ui_data(this, uiData);\n\t\t}\n\n\t\tthis._resolve_operation_containers_with_path_param_resolve();\n\n\t\tif (this._options) {\n\t\t\tif (this._options.nodeCookWatcher) {\n\t\t\t\tthis._options.nodeCookWatcher(scene);\n\t\t\t}\n\t\t\tif (this._options.configureScene) {\n\t\t\t\t// make sure configureScene is called after the setName above\n\t\t\t\tthis._options.configureScene(scene);\n\t\t\t}\n\t\t}\n\t\tscene.loadingController.markAsLoaded();\n\t\tscene.cooker.unblock();\n\n\t\t// DO NOT wait for cooks here,\n\t\t// as a viewer will only be created once everything has cooked\n\t\t// which would be a problem for envMap or other nodes relying on the renderer being created\n\t\t// await scene.waitForCooksCompleted();\n\n\t\treturn scene;\n\t}\n\tshadersData() {\n\t\treturn this._data['shaders'];\n\t}\n\tjsFunctionBodiesData() {\n\t\treturn this._data['jsFunctionBodies'];\n\t}\n\n\t//\n\t//\n\t// OPERATION CONTAINER RESOLVE\n\t//\n\t//\n\tadd_operations_composer_node_with_path_param_resolve_required(operations_composer_node: OperationsComposerSopNode) {\n\t\tif (!this._base_operations_composer_nodes_with_resolve_required) {\n\t\t\tthis._base_operations_composer_nodes_with_resolve_required = [];\n\t\t}\n\t\tthis._base_operations_composer_nodes_with_resolve_required.push(operations_composer_node);\n\t}\n\tprivate _resolve_operation_containers_with_path_param_resolve() {\n\t\tif (!this._base_operations_composer_nodes_with_resolve_required) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let operations_composer_node of this._base_operations_composer_nodes_with_resolve_required) {\n\t\t\toperations_composer_node.resolveOperationContainersPathParams();\n\t\t}\n\t}\n}\n","import {Vector2} from 'three';\nimport {Color} from 'three';\nimport {BaseNodeType} from '../_Base';\nimport {NodeEvent} from '../../poly/NodeEvent';\nimport {isNumber} from '../../../core/Type';\n\nexport interface NodeUIDataJson {\n\tx: number;\n\ty: number;\n\tcomment?: string;\n}\n\nexport class UIData {\n\tprivate _position: Vector2 = new Vector2();\n\tprotected _width: number = 50;\n\t// private _border_radius: number = 3;\n\tprivate _color: Color = new Color(0.75, 0.75, 0.75);\n\t// private _icon: string | null = null;\n\tprivate _layoutVertical: boolean = true;\n\tprivate _comment: string | undefined;\n\tprivate _json: NodeUIDataJson = {\n\t\tx: 0,\n\t\ty: 0,\n\t};\n\n\tconstructor(private node: BaseNodeType, x: number = 0, y: number = 0) {\n\t\tthis._position.x = x;\n\t\tthis._position.y = y;\n\t}\n\tdispose() {\n\t\tthis._comment = undefined;\n\t}\n\n\tsetComment(comment: string | undefined) {\n\t\tthis._comment = comment;\n\t\tthis.node.emit(NodeEvent.UI_DATA_COMMENT_UPDATED);\n\t}\n\tcomment(): string | undefined {\n\t\treturn this._comment;\n\t}\n\tsetColor(color: Color) {\n\t\tthis._color = color;\n\t}\n\tcolor() {\n\t\treturn this._color;\n\t}\n\t// setIcon(icon: string) {\n\t// \tthis._icon = icon;\n\t// }\n\t// icon() {\n\t// \treturn this._icon;\n\t// }\n\tsetLayoutHorizontal() {\n\t\tthis._layoutVertical = false;\n\t}\n\tisLayoutVertical() {\n\t\treturn this._layoutVertical;\n\t}\n\n\tcopy(ui_data: UIData) {\n\t\tthis._position.copy(ui_data.position());\n\t\tthis._color.copy(ui_data.color());\n\t}\n\n\tposition() {\n\t\treturn this._position;\n\t}\n\n\tsetPosition(newPosition: Vector2 | number, y: number = 0) {\n\t\tif (isNumber(newPosition)) {\n\t\t\tconst x = newPosition;\n\t\t\tthis._position.set(x, y);\n\t\t} else {\n\t\t\tthis._position.copy(newPosition);\n\t\t}\n\t\tthis.node.emit(NodeEvent.UI_DATA_POSITION_UPDATED);\n\t\treturn this;\n\t}\n\n\ttranslate(offset: Vector2, snap: boolean = false) {\n\t\tthis._position.add(offset);\n\n\t\tif (snap) {\n\t\t\tthis._position.x = Math.round(this._position.x);\n\t\t\tthis._position.y = Math.round(this._position.y);\n\t\t}\n\n\t\tthis.node.emit(NodeEvent.UI_DATA_POSITION_UPDATED);\n\t\treturn this;\n\t}\n\n\ttoJSON(): NodeUIDataJson {\n\t\tthis._json.x = this._position.x;\n\t\tthis._json.y = this._position.y;\n\t\tthis._json.comment = this._comment;\n\t\treturn this._json;\n\t}\n}\n","import {NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\n\nexport class NodeBaseState<NC extends NodeContext> {\n\tconstructor(protected node: TypedNode<NC, any>) {}\n}\n","import {NodeContext} from '../../../poly/NodeContext';\nimport {NodeBaseState} from './Base';\n\nexport class NodeTimeDependentState<NC extends NodeContext> extends NodeBaseState<NC> {\n\tactive() {\n\t\treturn this.paramsTimeDependent() || this.inputsTimeDependent();\n\t}\n\n\tparamsTimeDependent(): boolean {\n\t\tconst paramNames = this.node.params.names;\n\t\tfor (const paramName of paramNames) {\n\t\t\tconst param = this.node.params.get(paramName);\n\t\t\tif (param && param.states.timeDependent.active()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tinputsTimeDependent(): boolean {\n\t\tconst inputs = this.node.io.inputs.inputs();\n\t\tfor (const input of inputs) {\n\t\t\tif (input && input.states.timeDependent.active()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tforceTimeDependent() {\n\t\tconst predecessorIds = this.node.graphPredecessorIds();\n\t\tconst frameNode = this.node.scene().timeController.graphNode;\n\t\tif (predecessorIds == null || !predecessorIds.includes(frameNode.graphNodeId())) {\n\t\t\tthis.node.addGraphInput(frameNode, false);\n\t\t}\n\t}\n\tunforceTimeDependent() {\n\t\tconst frameNode = this.node.scene().timeController.graphNode;\n\t\tthis.node.removeGraphInput(frameNode);\n\t}\n}\n","import {NodeEvent} from '../../../poly/NodeEvent';\nimport {NodeBaseState} from './Base';\nimport {Poly} from '../../../Poly';\nimport {NodeContext} from '../../../poly/NodeContext';\n\nexport class NodeErrorState<NC extends NodeContext> extends NodeBaseState<NC> {\n\tprivate _message: string | undefined;\n\n\tset(message: string | undefined) {\n\t\tif (this._message != message) {\n\t\t\tif (message) {\n\t\t\t\tPoly.error(`[${this.node.path()}] error: '${message}' (from '${this._message}')`);\n\t\t\t} else {\n\t\t\t\tPoly.warn(`[${this.node.path()}] clear error`);\n\t\t\t}\n\t\t\tthis._message = message;\n\t\t\tthis.onUpdate();\n\t\t}\n\t}\n\tmessage() {\n\t\treturn this._message;\n\t}\n\tclear() {\n\t\tthis.set(undefined);\n\t}\n\tactive(): boolean {\n\t\treturn this._message != null;\n\t}\n\n\tprotected onUpdate() {\n\t\tif (this._message != null) {\n\t\t\t// console.warn(\"new error\", message, this.self.path())\n\t\t\tthis.node._setContainer(null as any /*, `from error '${this._message}'`*/);\n\t\t}\n\n\t\tthis.node.emit(NodeEvent.ERROR_UPDATED);\n\t}\n}\n","import {BaseNodeType} from '../_Base';\n\nimport {NodeTimeDependentState} from './states/TimeDependent';\nimport {NodeErrorState} from './states/Error';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport class NodeStatesController<NC extends NodeContext> {\n\ttimeDependent = new NodeTimeDependentState(this.node);\n\terror = new NodeErrorState(this.node);\n\tconstructor(protected node: BaseNodeType) {}\n}\n","import {BaseNodeType} from '../../_Base';\n// import {NodeTypeMap} from '../../../containers/utils/ContainerMap';\n\ntype NodeParentControllerCallback = () => void;\nimport {CoreWalker} from '../../../../core/Walker';\nimport {BaseNodeByContextMap, NodeContext} from '../../../poly/NodeContext';\n\nexport class HierarchyParentController {\n\tprivate _parent: BaseNodeType | null = null;\n\tprivate _on_set_parent_hooks: NodeParentControllerCallback[] | undefined;\n\n\tconstructor(protected node: BaseNodeType) {}\n\n\tparent() {\n\t\treturn this._parent;\n\t}\n\n\tsetParent(parent: BaseNodeType | null) {\n\t\tif (parent != this.node.parentController.parent()) {\n\t\t\tthis._parent = parent;\n\t\t\tif (this._parent) {\n\t\t\t\tthis.node.nameController.requestNameToParent(this.node.name());\n\t\t\t}\n\t\t}\n\t}\n\tfirstAncestorWithContext<N extends NodeContext>(context: N): BaseNodeByContextMap[N] | null {\n\t\tif (this._parent) {\n\t\t\tif (this._parent.context() == context) {\n\t\t\t\treturn this._parent as BaseNodeByContextMap[N];\n\t\t\t} else {\n\t\t\t\treturn this._parent.parentController.firstAncestorWithContext(context);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\tfindParent(callback: (parent: BaseNodeType) => boolean): BaseNodeType | null {\n\t\tif (this._parent) {\n\t\t\tif (callback(this._parent) == true) {\n\t\t\t\treturn this._parent;\n\t\t\t} else {\n\t\t\t\treturn this._parent.parentController.findParent(callback);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpath(relativeToParent?: BaseNodeType): string {\n\t\t// if (this.node.disposed) {\n\t\t// \tconsole.warn('.path() called from a disposed node, this may return an invalid path', this.node);\n\t\t// }\n\n\t\tconst separator = CoreWalker.SEPARATOR;\n\t\tif (this._parent != null) {\n\t\t\tif (this._parent == relativeToParent) {\n\t\t\t\treturn this.node.name();\n\t\t\t} else {\n\t\t\t\tconst parent_fullPath = this._parent.path(relativeToParent);\n\t\t\t\tif (parent_fullPath === separator) {\n\t\t\t\t\treturn parent_fullPath + this.node.name();\n\t\t\t\t} else {\n\t\t\t\t\treturn parent_fullPath + separator + this.node.name();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn separator;\n\t\t}\n\t}\n\n\tonSetParent() {\n\t\tif (this._on_set_parent_hooks) {\n\t\t\tfor (const hook of this._on_set_parent_hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n\tfindNode(path: string | null): BaseNodeType | null {\n\t\tif (path == null) {\n\t\t\treturn null;\n\t\t}\n\t\tif (path == CoreWalker.CURRENT || path == CoreWalker.CURRENT_WITH_SLASH) {\n\t\t\treturn this.node;\n\t\t}\n\t\tif (path == CoreWalker.PARENT || path == CoreWalker.PARENT_WITH_SLASH) {\n\t\t\treturn this.node.parent();\n\t\t}\n\n\t\tconst separator = CoreWalker.SEPARATOR;\n\t\tif (path === separator) {\n\t\t\treturn this.node.scene().root();\n\t\t}\n\t\tif (path[0] === separator) {\n\t\t\tpath = path.substring(1, path.length);\n\t\t\treturn this.node.scene().root().node(path);\n\t\t}\n\n\t\t// check that path is a string, since there has been errors where it wasn't the case\n\t\tif (path.split) {\n\t\t\tconst elements = path.split(separator);\n\t\t\tif (elements.length === 1) {\n\t\t\t\tconst name = elements[0];\n\t\t\t\tif (this.node.childrenController) {\n\t\t\t\t\treturn this.node.childrenController.childByName(name);\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn CoreWalker.findNode(this.node, path);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error('unexpected path given:', path);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../engine/nodes/_Base';\nimport {NodeEvent} from '../engine/poly/NodeEvent';\nimport {CoreGraphNodeId} from './graph/CoreGraph';\nimport {arrayIsEqual, arrayUnion, arrayDifference, arrayMap, arrayCopy} from './ArrayUtils';\n\nconst _nodes: BaseNodeType[] = [];\nconst _nodeIds: number[] = [];\nexport class CoreNodeSelection {\n\tprivate _nodeIds: CoreGraphNodeId[] = [];\n\tconstructor(private _node: BaseNodeType) {}\n\n\tnode() {\n\t\treturn this._node;\n\t}\n\tnodeIds() {\n\t\treturn this._nodeIds;\n\t}\n\n\tnodeFromIndex(index: number): BaseNodeType | undefined {\n\t\tthis._node.scene().graph.nodesFromIds(this._nodeIds, _nodes);\n\t\treturn _nodes[index];\n\t}\n\tnodes(target: BaseNodeType[]): BaseNodeType[] {\n\t\tthis._node.scene().graph.nodesFromIds(this._nodeIds, target);\n\t\treturn target;\n\t}\n\n\tcontains(node: BaseNodeType): boolean {\n\t\treturn this._nodeIds.includes(node.graphNodeId());\n\t}\n\tequals(nodes: BaseNodeType[]): boolean {\n\t\tarrayMap(nodes, (node) => node.graphNodeId(), _nodeIds);\n\t\t_nodeIds.sort();\n\t\treturn arrayIsEqual(_nodeIds, this._nodeIds);\n\t}\n\n\tclear() {\n\t\tthis._nodeIds.length = 0;\n\t\tthis._sendUpdateEvent();\n\t}\n\tset(nodes: Readonly<BaseNodeType[]>) {\n\t\tthis._nodeIds.length = 0;\n\t\tthis.add(nodes);\n\t}\n\n\tadd(nodesToAdd: Readonly<BaseNodeType[]>) {\n\t\tarrayMap(nodesToAdd, (node) => node.graphNodeId(), _nodeIds);\n\t\tarrayUnion(this._nodeIds, _nodeIds, this._nodeIds);\n\n\t\tthis._sendUpdateEvent();\n\t}\n\n\tremove(nodesToRemove: Readonly<BaseNodeType[]>) {\n\t\tarrayMap(nodesToRemove, (node) => node.graphNodeId(), _nodeIds);\n\t\tarrayDifference(this._nodeIds, _nodeIds, this._nodeIds);\n\n\t\tthis._sendUpdateEvent();\n\t}\n\n\tprivate _checkValidity() {\n\t\tthis.nodes(_nodes);\n\t\tif (_nodes.length != this._nodeIds.length) {\n\t\t\tconsole.error('selection invalid: at least one node is not part of the graph');\n\t\t\treturn;\n\t\t}\n\t\tfor (const node of _nodes) {\n\t\t\tif (node.parent() != this._node) {\n\t\t\t\tconsole.error('selection invalid: at least one node is not has another parent');\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _sendUpdateEvent() {\n\t\tthis._checkValidity();\n\t\tthis._node.emit(NodeEvent.SELECTION_UPDATED);\n\t}\n\n\ttoJSON(target: CoreGraphNodeId[]): void {\n\t\tarrayCopy(this._nodeIds, target);\n\t}\n}\n","import {OperationInputsController} from '../InputsController';\nimport {InputCloneMode} from '../../../../../engine/poly/InputCloneMode';\nimport {TypeAssert} from '../../../../../engine/poly/Assert';\nimport {isArray} from '../../../../../core/Type';\nimport {NodeContext} from '../../../../poly/NodeContext';\n\nexport class ClonedStatesController<NC extends NodeContext> {\n\tprivate _cloned_states: InputCloneMode[] | undefined;\n\tprivate _cloned_state: InputCloneMode | undefined;\n\tprivate _clone_required_states: boolean[] = [];\n\tprivate _overridden: boolean = false;\n\n\tconstructor(protected inputs_controller: OperationInputsController<NC>) {}\n\tinitInputsClonedState(states: InputCloneMode | InputCloneMode[]) {\n\t\tif (isArray(states)) {\n\t\t\tthis._cloned_states = states;\n\t\t} else {\n\t\t\tthis._cloned_state = states;\n\t\t}\n\n\t\tthis._update_clone_required_state();\n\t}\n\n\toverride_cloned_state_allowed() {\n\t\tif (this._cloned_states) {\n\t\t\tfor (let state of this._cloned_states) {\n\t\t\t\tif (state == InputCloneMode.FROM_NODE) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this._cloned_state) {\n\t\t\treturn this._cloned_state == InputCloneMode.FROM_NODE;\n\t\t}\n\t\treturn false;\n\t}\n\n\tclone_required_state(index: number): boolean {\n\t\treturn this._clone_required_states[index];\n\t}\n\tclone_required_states(): boolean | boolean[] {\n\t\treturn this._clone_required_states;\n\t}\n\n\tprivate _get_clone_required_state(index: number): boolean {\n\t\tconst states = this._cloned_states;\n\t\tif (states) {\n\t\t\tconst state = states[index];\n\t\t\tif (state != null) {\n\t\t\t\treturn this.clone_required_from_state(state);\n\t\t\t}\n\t\t}\n\t\tif (this._cloned_state) {\n\t\t\treturn this.clone_required_from_state(this._cloned_state);\n\t\t}\n\t\treturn true;\n\t}\n\tprivate clone_required_from_state(state: InputCloneMode) {\n\t\tswitch (state) {\n\t\t\tcase InputCloneMode.ALWAYS:\n\t\t\t\treturn true;\n\t\t\tcase InputCloneMode.NEVER:\n\t\t\t\treturn false;\n\t\t\tcase InputCloneMode.FROM_NODE:\n\t\t\t\treturn !this._overridden;\n\t\t}\n\t\treturn TypeAssert.unreachable(state);\n\t}\n\n\toverride_cloned_state(state: boolean) {\n\t\tthis._overridden = state;\n\t\tthis._update_clone_required_state();\n\t}\n\toverriden() {\n\t\treturn this._overridden;\n\t}\n\tprivate _update_clone_required_state() {\n\t\tif (this._cloned_states) {\n\t\t\tconst states: boolean[] = [];\n\t\t\tfor (let i = 0; i < this._cloned_states.length; i++) {\n\t\t\t\tstates[i] = this._get_clone_required_state(i);\n\t\t\t}\n\t\t\tthis._clone_required_states = states;\n\t\t\treturn;\n\t\t}\n\t\tif (this._cloned_state) {\n\t\t\tconst max_inputs = this.inputs_controller.inputsCount();\n\t\t\tconst states: boolean[] = [];\n\t\t\tfor (let i = 0; i < max_inputs; i++) {\n\t\t\t\tstates[i] = this._get_clone_required_state(i);\n\t\t\t}\n\t\t\tthis._clone_required_states = states;\n\t\t\treturn;\n\t\t}\n\t}\n}\n","import {ClonedStatesController} from './inputs/ClonedStatesController';\nimport {InputCloneMode} from '../../../../engine/poly/InputCloneMode';\nimport {BaseOperationContainer} from '../_Base';\nimport {NodeContext} from '../../../poly/NodeContext';\n\nexport class OperationInputsController<NC extends NodeContext> {\n\tconstructor(private operationContainer: BaseOperationContainer<NC>) {}\n\tinputsCount() {\n\t\treturn this.operationContainer.inputsCount();\n\t}\n\n\t//\n\t//\n\t// CLONABLE STATES\n\t//\n\t//\n\tprivate _clonedStatesController: ClonedStatesController<NC> | undefined;\n\tinitInputsClonedState(states: InputCloneMode | InputCloneMode[]) {\n\t\tif (!this._clonedStatesController) {\n\t\t\tthis._clonedStatesController = new ClonedStatesController(this);\n\t\t\tthis._clonedStatesController.initInputsClonedState(states);\n\t\t}\n\t}\n\n\tcloneRequired(index: number) {\n\t\tconst state = this._clonedStatesController?.clone_required_state(index);\n\t\tif (state != null) {\n\t\t\treturn state;\n\t\t}\n\t\treturn true;\n\t}\n\toverride_cloned_state(state: boolean) {\n\t\tthis._clonedStatesController?.override_cloned_state(state);\n\t}\n}\n","import {ParamsInitData} from '../../../engine/nodes/utils/io/IOController';\nimport {ParamType} from '../../../engine/poly/ParamType';\nimport {Color} from 'three';\nimport {Vector2} from 'three';\nimport {Vector3} from 'three';\nimport {Vector4} from 'three';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {BaseOperation} from '../_Base';\nimport {OperationInputsController} from './utils/InputsController';\nimport {isNumber, isBoolean, isString} from '../../../core/Type';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {DefaultOperationParam, DefaultOperationParams} from '../../../core/operations/_Base';\n\nexport class BaseOperationContainer<NC extends NodeContext> {\n\tprotected params: DefaultOperationParams = {};\n\tprivate _path_params: TypedNodePathParamValue[] | undefined;\n\n\tconstructor(protected operation: BaseOperation<NC>, protected name: string, init_params: ParamsInitData) {\n\t\tthis._applyDefaultParams();\n\t\tthis._applyInitParams(init_params);\n\t\tthis._initClonedStates();\n\t}\n\n\t//\n\t//\n\t// PATH PARAMS\n\t//\n\t//\n\tpathParamResolveRequired() {\n\t\treturn this._path_params != null;\n\t}\n\tresolvePathParams(node_start: BaseNodeType) {\n\t\tif (!this._path_params) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let path_param of this._path_params) {\n\t\t\tpath_param.resolve(node_start);\n\t\t}\n\t}\n\n\t//\n\t//\n\t// PARAM VALUES CONVERSION\n\t//\n\t//\n\tprivate _applyDefaultParams() {\n\t\tconst default_params = (this.operation.constructor as typeof BaseOperation).DEFAULT_PARAMS;\n\t\tconst param_names = Object.keys(default_params);\n\t\tfor (let param_name of param_names) {\n\t\t\tconst param_data = default_params[param_name];\n\t\t\tconst clone_param_data = this._convertParamData(param_name, param_data);\n\t\t\tif (clone_param_data != undefined) {\n\t\t\t\tthis.params[param_name] = clone_param_data;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _applyInitParams(init_params: ParamsInitData) {\n\t\tconst paramNames = Object.keys(init_params);\n\t\tfor (let paramName of paramNames) {\n\t\t\tconst param_data = init_params[paramName];\n\t\t\tif (param_data.simple_data != null) {\n\t\t\t\tconst simple_data = param_data.simple_data;\n\t\t\t\tconst clone_param_data = this.operation.convertExportParamData({\n\t\t\t\t\tparamName,\n\t\t\t\t\tparamData: simple_data,\n\t\t\t\t\tparams: this.params,\n\t\t\t\t});\n\t\t\t\tif (clone_param_data != undefined) {\n\t\t\t\t\tthis.params[paramName] = clone_param_data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _convertParamData(param_name: string, param_data: DefaultOperationParam<ParamType>) {\n\t\tif (isNumber(param_data) || isBoolean(param_data) || isString(param_data)) {\n\t\t\treturn param_data;\n\t\t}\n\t\tif (param_data instanceof TypedNodePathParamValue) {\n\t\t\tconst cloned = param_data.clone();\n\t\t\tif (!this._path_params) {\n\t\t\t\tthis._path_params = [];\n\t\t\t}\n\t\t\tthis._path_params.push(cloned);\n\t\t\treturn cloned;\n\t\t}\n\t\tif (\n\t\t\tparam_data instanceof Color ||\n\t\t\tparam_data instanceof Vector2 ||\n\t\t\tparam_data instanceof Vector3 ||\n\t\t\tparam_data instanceof Vector4\n\t\t) {\n\t\t\treturn param_data.clone();\n\t\t}\n\t}\n\n\t//\n\t//\n\t// INPUTS\n\t//\n\t//\n\tprotected _inputs: BaseOperationContainer<NC>[] | undefined;\n\tsetInput(index: number, input: BaseOperationContainer<NC>) {\n\t\tthis._inputs = this._inputs || [];\n\t\tthis._inputs[index] = input;\n\t}\n\tinputsCount() {\n\t\tif (this._inputs) {\n\t\t\treturn this._inputs.length;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tprivate _inputsController: OperationInputsController<NC> | undefined;\n\tprotected inputsController() {\n\t\treturn (this._inputsController = this._inputsController || new OperationInputsController<NC>(this));\n\t}\n\tprivate _initClonedStates() {\n\t\tconst default_cloned_states = (this.operation.constructor as typeof BaseOperation).INPUT_CLONED_STATE;\n\t\tthis.inputsController().initInputsClonedState(default_cloned_states);\n\t}\n\tinputCloneRequired(index: number): boolean {\n\t\tif (!this._inputsController) {\n\t\t\treturn true;\n\t\t}\n\t\treturn this._inputsController.cloneRequired(index);\n\t}\n\toverrideInputCloneState(state: boolean) {\n\t\tthis.inputsController().override_cloned_state(state);\n\t}\n\n\t//\n\t//\n\t// COOK\n\t//\n\t//\n\tcook(input_contents: any[]) {\n\t\treturn this.operation.cook(input_contents, this.params);\n\t}\n}\n","import {BaseOperationContainer} from './_Base';\nimport {BaseSopOperation} from '../sop/_Base';\nimport {ParamsInitData} from '../../../engine/nodes/utils/io/IOController';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport type OperationInputsMap = WeakMap<SopOperationContainer, Map<number, number>>;\n\nexport class SopOperationContainer extends BaseOperationContainer<NodeContext.SOP> {\n\tconstructor(\n\t\tprotected override operation: BaseSopOperation,\n\t\tprotected override name: string,\n\t\tprotected init_params: ParamsInitData\n\t) {\n\t\tsuper(operation, name, init_params);\n\t}\n\n\toperationType() {\n\t\treturn this.operation.type();\n\t}\n\n\t// TODO: there may a better to overload add_input\n\tprotected override _inputs: SopOperationContainer[] = [];\n\tprivate _currentInputIndex: number = 0;\n\taddInput(input: SopOperationContainer) {\n\t\tsuper.setInput(this._currentInputIndex, input);\n\t\tthis.incrementInputIndex();\n\t}\n\tincrementInputIndex() {\n\t\tthis._currentInputIndex++;\n\t}\n\tcurrentInputIndex() {\n\t\treturn this._currentInputIndex;\n\t}\n\n\tprivate _computeResult: CoreGroup | undefined;\n\tprivate _dirty: boolean = true;\n\tsetDirty() {\n\t\tif (this._dirty) {\n\t\t\treturn;\n\t\t}\n\t\tthis._computeResult = undefined;\n\t\tfor (let i = 0; i < this._inputs.length; i++) {\n\t\t\tconst inputOperation = this._inputs[i];\n\t\t\tinputOperation.setDirty();\n\t\t}\n\t}\n\n\tasync compute(input_contents: CoreGroup[], operation_inputs_map: OperationInputsMap) {\n\t\tif (this._computeResult) {\n\t\t\treturn this._computeResult;\n\t\t}\n\n\t\tconst operationInputContents: CoreGroup[] = [];\n\n\t\t// process node inputs\n\t\tconst nodeInputsMap = operation_inputs_map.get(this);\n\t\tif (nodeInputsMap) {\n\t\t\tnodeInputsMap.forEach((node_input_index: number, operation_input_index: number) => {\n\t\t\t\toperationInputContents[operation_input_index] = input_contents[node_input_index];\n\t\t\t});\n\t\t}\n\n\t\t// process operation inputs\n\t\tfor (let i = 0; i < this._inputs.length; i++) {\n\t\t\tconst inputOperation = this._inputs[i];\n\t\t\tlet result = await inputOperation.compute(input_contents, operation_inputs_map);\n\t\t\tif (result) {\n\t\t\t\tif (this.inputCloneRequired(i)) {\n\t\t\t\t\tresult = result.clone();\n\t\t\t\t}\n\t\t\t\toperationInputContents[i] = result;\n\t\t\t}\n\t\t}\n\n\t\t// cook and store result\n\t\tconst result = this.operation.cook(operationInputContents, this.params);\n\t\tif (result) {\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tthis._computeResult = await result;\n\t\t\t} else {\n\t\t\t\tthis._computeResult = result;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._computeResult = undefined;\n\t\t}\n\t\tthis._dirty = false;\n\t\treturn this._computeResult;\n\t}\n}\n","import {BaseNodeClass, BaseNodeType} from '../_Base';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {NodeEvent} from '../../poly/NodeEvent';\nimport {coreTypeIsNaN} from '../../../core/Type';\n\ntype NameControllerCallback = () => void;\n\nexport class NameController {\n\tprivate _graphNode: CoreGraphNode;\n\tprivate _onSetNameHooks: NameControllerCallback[] | undefined;\n\tprivate _onSetFullPathHooks: NameControllerCallback[] | undefined;\n\n\tconstructor(protected node: BaseNodeType) {\n\t\tthis._graphNode = new CoreGraphNode(node.scene(), 'nodeNameController');\n\t\t// this._graph_node.setScene(this.node.scene);\n\t}\n\n\tdispose() {\n\t\tthis._graphNode.dispose();\n\t\tthis._onSetNameHooks = undefined;\n\t\tthis._onSetFullPathHooks = undefined;\n\t}\n\n\tgraphNode() {\n\t\treturn this._graphNode;\n\t}\n\n\tstatic baseName(node: BaseNodeType | typeof BaseNodeClass) {\n\t\tlet base: string = node.type();\n\t\tconst last_char = base[base.length - 1];\n\t\tif (!coreTypeIsNaN(parseInt(last_char))) {\n\t\t\tbase += '_';\n\t\t}\n\t\treturn `${base}1`;\n\t}\n\n\trequestNameToParent(newName: string) {\n\t\tconst parent = this.node.parent();\n\t\tif (parent && parent.childrenAllowed() && parent.childrenController) {\n\t\t\tparent.childrenController.setChildName(this.node, newName);\n\t\t} else {\n\t\t\tconsole.warn('requestNameToParent failed, no parent found');\n\t\t}\n\t}\n\tsetName(newName: string) {\n\t\tif (newName != this.node.name()) {\n\t\t\tif (this.node.insideALockedParent()) {\n\t\t\t\tconst lockedParent = this.node.lockedParent();\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`node '${this.node.path()}' cannot have its name changed, since it is inside '${\n\t\t\t\t\t\tlockedParent ? lockedParent.path() : ''\n\t\t\t\t\t}', which is locked`\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.requestNameToParent(newName);\n\t\t}\n\t}\n\tupdateNameFromParent(new_name: string) {\n\t\tthis.node._setCoreName(new_name);\n\t\tthis._postSetName();\n\t\tthis.runPostSetFullPathHooks();\n\t\tif (this.node.childrenAllowed()) {\n\t\t\tconst children = this.node.childrenController?.children();\n\t\t\tif (children) {\n\t\t\t\tfor (const child_node of children) {\n\t\t\t\t\tchild_node.nameController.runPostSetFullPathHooks();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.node.lifecycle.creationCompleted() && this.node.scene().loadingController.loaded()) {\n\t\t\tthis.node.scene().missingExpressionReferencesController.checkForMissingNodeReferences(this.node);\n\t\t\tthis.node.scene().expressionsController.regenerateReferringExpressions(this.node);\n\t\t}\n\t\tthis.node.scene().referencesController.notifyNameUpdated(this.node);\n\t\tthis.node.emit(NodeEvent.NAME_UPDATED);\n\t}\n\n\tadd_post_set_name_hook(hook: NameControllerCallback) {\n\t\tthis._onSetNameHooks = this._onSetNameHooks || [];\n\t\tthis._onSetNameHooks.push(hook);\n\t}\n\tadd_post_set_fullPath_hook(hook: NameControllerCallback) {\n\t\tthis._onSetFullPathHooks = this._onSetFullPathHooks || [];\n\t\tthis._onSetFullPathHooks.push(hook);\n\t}\n\n\tprivate _postSetName() {\n\t\tif (this._onSetNameHooks) {\n\t\t\tfor (const hook of this._onSetNameHooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n\trunPostSetFullPathHooks() {\n\t\tif (this._onSetFullPathHooks) {\n\t\t\tfor (const hook of this._onSetFullPathHooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {CoreString} from '../../../../core/String';\nimport {BaseNodeClass, BaseNodeType} from '../../_Base';\nimport {NodeEvent} from '../../../poly/NodeEvent';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {CoreNodeSelection} from '../../../../core/NodeSelection';\nimport {Poly} from '../../../Poly';\nimport {ParamsInitData} from '../io/IOController';\nimport {CoreGraphNodeId} from '../../../../core/graph/CoreGraph';\nimport {BaseOperationContainer} from '../../../operations/container/_Base';\nimport {SopOperationContainer} from '../../../operations/container/sop';\nimport {BaseSopOperation} from '../../../operations/sop/_Base';\nimport {\n\taddToSetAtEntry,\n\tpushOnArrayAtEntry,\n\tremoveFromSetAtEntry,\n\tpopFromArrayAtEntry,\n} from '../../../../core/MapUtils';\nimport {NameController} from '../NameController';\nimport {CoreNodeSerializer} from '../CoreNodeSerializer';\nimport {TypedNodeConnection} from '../io/NodeConnection';\nimport {arrayCopy} from '../../../../core/ArrayUtils';\n\ntype OutputNodeFindMethod = (() => BaseNodeType) | undefined;\ntype TraverseNodeCallback = (node: BaseNodeType) => void;\ntype TraverseNodeConditionCallback = (node: BaseNodeType) => boolean;\n\nexport interface NodeCreateOptions {\n\tparamsInitValueOverrides?: ParamsInitData;\n\tnodeName?: string;\n\tserializerClass?: typeof CoreNodeSerializer;\n}\n\nexport class HierarchyChildrenController {\n\tprivate _childrenByName: Map<string, BaseNodeType> = new Map();\n\tprivate _childrenIdByType: Map<string, Set<CoreGraphNodeId>> = new Map();\n\tprivate _childrenByType: Map<string, Array<BaseNodeType>> = new Map();\n\tprivate _childrenAndGrandchildrenByContext: Map<NodeContext, Set<CoreGraphNodeId>> = new Map();\n\n\tprivate _selection: CoreNodeSelection | undefined;\n\tget selection(): CoreNodeSelection {\n\t\treturn (this._selection = this._selection || new CoreNodeSelection(this.node));\n\t}\n\tconstructor(protected node: BaseNodeType, private _context: NodeContext) {}\n\n\tdispose() {\n\t\tconst _tmpChildren: BaseNodeType[] = [];\n\t\tarrayCopy(this.children(), _tmpChildren);\n\t\tfor (const child of _tmpChildren) {\n\t\t\tthis.node.removeNode(child);\n\t\t}\n\t\t_tmpChildren.length = 0;\n\t\tthis._selection = undefined;\n\t}\n\n\tget context() {\n\t\treturn this._context;\n\t}\n\n\t//\n\t//\n\t// OUTPUT NODE\n\t//\n\t//\n\tprivate _outputNodeFindMethod: (() => BaseNodeType) | undefined;\n\tsetOutputNodeFindMethod(method: OutputNodeFindMethod) {\n\t\tthis._outputNodeFindMethod = method;\n\t}\n\toutputNode() {\n\t\tif (this._outputNodeFindMethod) {\n\t\t\treturn this._outputNodeFindMethod();\n\t\t}\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\n\tsetChildName(node: BaseNodeType, newName: string): void {\n\t\tlet currentChildWithName: BaseNodeType | undefined;\n\t\tnewName = CoreString.sanitizeName(newName);\n\n\t\tif ((currentChildWithName = this._childrenByName.get(newName)) != null) {\n\t\t\t// only return if found node is same as argument node, and if new_name is same as current_name\n\t\t\tif (node.name() === newName && currentChildWithName.graphNodeId() === node.graphNodeId()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// increment new_name\n\t\t\tnewName = CoreString.increment(newName);\n\n\t\t\treturn this.setChildName(node, newName);\n\t\t} else {\n\t\t\tconst currentName = node.name();\n\n\t\t\t// delete old entry if node was in _children with old name\n\t\t\tconst currentChild = this._childrenByName.get(currentName);\n\t\t\tif (currentChild) {\n\t\t\t\tthis._childrenByName.delete(currentName);\n\t\t\t}\n\n\t\t\t// add to new name\n\t\t\tthis._childrenByName.set(newName, node);\n\t\t\tthis._updateCache();\n\t\t\tnode.nameController.updateNameFromParent(newName);\n\n\t\t\tthis.node.scene().nodesController.addToInstanciatedNode(node);\n\t\t\tthis.node.scene().graphNodesController.notifyNodePathChanged(node);\n\t\t}\n\t}\n\tprivate _nextAvailableChildName(nodeName: string): string {\n\t\tnodeName = CoreString.sanitizeName(nodeName);\n\t\treturn this._childrenByName.get(nodeName)\n\t\t\t? this._nextAvailableChildName(CoreString.increment(nodeName))\n\t\t\t: nodeName;\n\t}\n\n\tnodeContextSignature() {\n\t\treturn `${this.node.context()}/${this.node.type()}`;\n\t}\n\n\tavailableChildrenClasses() {\n\t\treturn Poly.registeredNodes(this.node);\n\t}\n\n\tisValidChildType(node_type: string): boolean {\n\t\tconst node_class = this.availableChildrenClasses()[node_type];\n\t\treturn node_class != null;\n\t}\n\n\t// create_node(node_type: string, options?: NodeCreateOptions): BaseNodeType {\n\t// \tconst node_class = this.available_children_classes()[node_type];\n\n\t// \tif (node_class == null) {\n\t// \t\tconst message = `child node type '${node_type}' not found for node '${this.node.path()}'. Available types are: ${Object.keys(\n\t// \t\t\tthis.available_children_classes()\n\t// \t\t).join(', ')}, ${this._context}, ${this.node.type}`;\n\t// \t\tconsole.error(message);\n\t// \t\tthrow message;\n\t// \t} else {\n\t// \t\tconst child_node = new node_class(this.node.scene, `child_node_${node_type}`, paramsInitValueOverrides);\n\t// \t\tchild_node.initialize_base_and_node();\n\t// \t\tthis.add_node(child_node);\n\t// \t\tchild_node.lifecycle.set_creation_completed();\n\t// \t\treturn child_node;\n\t// \t}\n\t// }\n\tcreateNode<K extends BaseNodeType>(nodeClassOrString: string | Constructor<K>, options?: NodeCreateOptions): K {\n\t\t// adding a test here means that this function could return undefined\n\t\t// which would all the existing calls\n\t\t// if (this.node.lockedOrInsideALockedParent()) {\n\t\t// \tconst lockedParent = this.node.lockedParent();\n\t\t// \tconsole.error(\n\t\t// \t\t`node '${this.node.path()}' cannot create nodes, since it is inside '${\n\t\t// \t\t\tlockedParent ? lockedParent.path() : ''\n\t\t// \t\t}', which is locked`\n\t\t// \t);\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (typeof nodeClassOrString == 'string') {\n\t\t\tconst nodeClass = this._findNodeClass(nodeClassOrString);\n\t\t\treturn this._createAndInitNode(nodeClass, options) as K;\n\t\t} else {\n\t\t\treturn this._createAndInitNode(nodeClassOrString, options);\n\t\t}\n\t}\n\tprivate _createAndInitNode<K extends BaseNodeType>(nodeClass: Constructor<K>, options?: NodeCreateOptions) {\n\t\tconst requestedNodeName =\n\t\t\toptions?.nodeName || NameController.baseName((<unknown>nodeClass) as typeof BaseNodeClass);\n\t\tconst nodeName = this._nextAvailableChildName(requestedNodeName);\n\t\tconst childNode = new nodeClass(this.node.scene(), nodeName, {\n\t\t\t...options,\n\t\t\tserializerClass: this.node.serializer?.constructor,\n\t\t});\n\t\tchildNode.initializeBaseAndNode();\n\t\tthis._addNode(childNode);\n\t\tchildNode.lifecycle.setCreationCompleted();\n\t\treturn childNode;\n\t}\n\tprivate _findNodeClass(node_type: string) {\n\t\tconst nodeClass = this.availableChildrenClasses()[node_type.toLowerCase()];\n\n\t\tif (nodeClass == null) {\n\t\t\tconst message = `child node type '${node_type}' not found for node '${this.node.path()}'. Available types are: ${Object.keys(\n\t\t\t\tthis.availableChildrenClasses()\n\t\t\t).join(', ')}, ${this._context}, ${this.node.type()}`;\n\t\t\tconsole.error(message);\n\t\t\tthrow message;\n\t\t}\n\t\treturn nodeClass;\n\t}\n\tcreateOperationContainer(\n\t\toperationType: string,\n\t\toperationContainerName: string,\n\t\toptions?: NodeCreateOptions\n\t): BaseOperationContainer<any> {\n\t\tconst operationClass = Poly.registeredOperation(this._context, operationType);\n\n\t\tif (operationClass == null) {\n\t\t\tconst message = `no operation found with context ${this._context}/${operationType}`;\n\t\t\tconsole.error(message);\n\t\t\tthrow message;\n\t\t} else {\n\t\t\tconst operation = new operationClass(this.node.scene()) as BaseSopOperation;\n\t\t\tconst operation_container = new SopOperationContainer(\n\t\t\t\toperation,\n\t\t\t\toperationContainerName,\n\t\t\t\toptions?.paramsInitValueOverrides || {}\n\t\t\t);\n\t\t\treturn operation_container;\n\t\t}\n\t}\n\n\tprivate _addNode(childNode: BaseNodeType) {\n\t\tchildNode.setParent(this.node);\n\t\tthis._addToNodesByType(childNode);\n\t\tchildNode.params.init();\n\t\tchildNode.parentController.onSetParent();\n\t\tchildNode.nameController.runPostSetFullPathHooks();\n\t\tif (childNode.childrenAllowed() && childNode.childrenController) {\n\t\t\tfor (const child of childNode.childrenController.children()) {\n\t\t\t\tchild.nameController.runPostSetFullPathHooks();\n\t\t\t}\n\t\t}\n\t\tif (this.node.serializer) {\n\t\t\tconst childNodeJSON = childNode.toJSON();\n\t\t\tif (childNodeJSON) {\n\t\t\t\tthis.node.emit(NodeEvent.CREATED, {child_node_json: childNodeJSON});\n\t\t\t}\n\t\t}\n\t\tif (this.node.scene().lifecycleController.onAfterCreatedCallbackAllowed()) {\n\t\t\tchildNode.lifecycle.runOnAfterCreatedCallbacks();\n\t\t}\n\t\tchildNode.lifecycle.runOnAfterAddedCallbacks();\n\t\tthis.node.lifecycle.runOnChildAddCallbacks(childNode);\n\n\t\tif (childNode.requireWebGL2()) {\n\t\t\tthis.node.scene().webglController.setRequireWebGL2();\n\t\t}\n\n\t\tthis.node.scene().missingExpressionReferencesController.checkForMissingNodeReferences(childNode);\n\n\t\treturn childNode;\n\t}\n\n\tremoveNode(childNode: BaseNodeType): void {\n\t\tif (this.node.lockedOrInsideALockedParent()) {\n\t\t\tconst lockedNode = this.node.selfOrLockedParent();\n\t\t\tconst reason =\n\t\t\t\tlockedNode == this.node\n\t\t\t\t\t? `it is locked`\n\t\t\t\t\t: `it is inside '${lockedNode ? lockedNode.path() : ''}', which is locked`;\n\t\t\tconsole.warn(`node '${this.node.path()}' cannot remove nodes, since ${reason}`);\n\t\t\tconsole.log(this.node.graphNodeId(), this.node.name());\n\t\t\treturn;\n\t\t}\n\n\t\tif (childNode.parent() != this.node) {\n\t\t\treturn console.warn(`node ${childNode.name()} not under parent ${this.node.path()}`);\n\t\t} else {\n\t\t\tchildNode.polyNodeController?.setLockedState(false); // makes it easier to dispose its content\n\n\t\t\tchildNode.lifecycle.runOnBeforeDeleteCallbacks();\n\t\t\tif (this.selection.contains(childNode)) {\n\t\t\t\tthis.selection.remove([childNode]);\n\t\t\t}\n\n\t\t\tconst firstConnection = childNode.io.connections.firstInputConnection();\n\t\t\tconst inputConnections = childNode.io.connections.inputConnections();\n\t\t\tconst outputConnections: TypedNodeConnection<NodeContext>[] = [];\n\t\t\tchildNode.io.connections.outputConnections(outputConnections);\n\t\t\tif (inputConnections) {\n\t\t\t\tfor (const inputConnection of inputConnections) {\n\t\t\t\t\tif (inputConnection) {\n\t\t\t\t\t\tinputConnection.disconnect({setInput: true});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (outputConnections) {\n\t\t\t\tfor (const outputConnection of outputConnections) {\n\t\t\t\t\tif (outputConnection) {\n\t\t\t\t\t\toutputConnection.disconnect({setInput: true});\n\t\t\t\t\t\tif (firstConnection) {\n\t\t\t\t\t\t\tconst oldSrc = firstConnection.nodeSrc();\n\t\t\t\t\t\t\tconst oldOutputIndex = firstConnection.outputIndex();\n\t\t\t\t\t\t\tconst oldDest = outputConnection.nodeDest();\n\t\t\t\t\t\t\tconst oldInputIndex = outputConnection.inputIndex();\n\t\t\t\t\t\t\toldDest.io.inputs.setInput(oldInputIndex, oldSrc, oldOutputIndex);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// remove from children\n\t\t\tchildNode.setParent(null);\n\t\t\tthis._childrenByName.delete(childNode.name());\n\t\t\tthis._updateCache();\n\t\t\tthis._removeFromNodesByType(childNode);\n\t\t\tthis.node.scene().nodesController.removeFromInstanciatedNode(childNode);\n\n\t\t\t// set other dependencies dirty\n\t\t\t// Note that this call to set_dirty was initially before this._children_node.remove_graph_input\n\t\t\t// but that prevented the obj/geo node to properly clear its sopGroup if this was the last node\n\t\t\t// if (this._is_dependent_on_children && this._children_node) {\n\t\t\t// \tthis._children_node.set_successors_dirty(this.node);\n\t\t\t// }\n\t\t\tchildNode.setSuccessorsDirty(this.node);\n\t\t\t// disconnect successors\n\t\t\tchildNode.graphDisconnectSuccessors();\n\n\t\t\tthis.node.lifecycle.runOnChildRemoveCallbacks(childNode);\n\t\t\tchildNode.lifecycle.runOnDeleteCallbacks();\n\t\t\tchildNode.dispose();\n\t\t\tchildNode.emit(NodeEvent.DELETED, {parent_id: this.node.graphNodeId()});\n\t\t\tthis.node.scene().graphNodesController.notifyNodePathChanged(childNode);\n\t\t}\n\t}\n\n\tprivate _addToNodesByType(node: BaseNodeType) {\n\t\tconst nodeId = node.graphNodeId();\n\t\tconst type = node.type();\n\n\t\taddToSetAtEntry(this._childrenIdByType, type, nodeId);\n\t\tpushOnArrayAtEntry(this._childrenByType, type, node);\n\n\t\tthis._addToChildrenAndGrandchildrenByContext(node);\n\t}\n\tprivate _removeFromNodesByType(node: BaseNodeType) {\n\t\tconst nodeId = node.graphNodeId();\n\t\tconst type = node.type();\n\n\t\tremoveFromSetAtEntry(this._childrenIdByType, type, nodeId);\n\t\tpopFromArrayAtEntry(this._childrenByType, type, node);\n\t\tthis._removeFromChildrenAndGrandchildrenByContext(node);\n\t}\n\tprivate _addToChildrenAndGrandchildrenByContext(node: BaseNodeType) {\n\t\tconst nodeId = node.graphNodeId();\n\t\tconst nodeContext = node.context();\n\n\t\taddToSetAtEntry(this._childrenAndGrandchildrenByContext, nodeContext, nodeId);\n\t\tconst parent = this.node.parent();\n\t\tif (parent && parent.childrenAllowed()) {\n\t\t\tparent.childrenController?._addToChildrenAndGrandchildrenByContext(node);\n\t\t}\n\t}\n\tprivate _removeFromChildrenAndGrandchildrenByContext(node: BaseNodeType) {\n\t\tconst nodeId = node.graphNodeId();\n\t\tconst type = node.context();\n\n\t\tremoveFromSetAtEntry(this._childrenAndGrandchildrenByContext, type, nodeId);\n\t\tconst parent = this.node.parent();\n\t\tif (parent && parent.childrenAllowed()) {\n\t\t\tparent.childrenController?._removeFromChildrenAndGrandchildrenByContext(node);\n\t\t}\n\t}\n\n\tnodesByType(type: string, target: BaseNodeType[] = []): BaseNodeType[] {\n\t\tconst nodes = this._childrenByType.get(type);\n\t\t// if (!nodes) {\n\t\t// \tnodes = [];\n\t\t// \tthis._childrenByType.set(type, nodes);\n\t\t// }\n\t\t// ensure we don't return the same array,\n\t\t// otherwise a previous call to .nodesByType()\n\t\t// would share the same array,\n\t\t// which is not what we want, when we aim to compare\n\t\t// different results after different node creation/deletion\n\t\ttarget.length = nodes ? nodes.length : 0;\n\t\tif (nodes) {\n\t\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\t\ttarget[i] = nodes[i];\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t}\n\tchildByName(name: string) {\n\t\treturn this._childrenByName.get(name) || null;\n\t}\n\n\thasChildrenAndGrandchildrenWithContext(context: NodeContext) {\n\t\treturn this._childrenAndGrandchildrenByContext.get(context) != null;\n\t}\n\n\tprivate _children: BaseNodeType[] = [];\n\tprivate _childrenNames: string[] = [];\n\tprivate _updateCache() {\n\t\tthis._children.length = 0;\n\t\tthis._childrenNames.length = 0;\n\t\tthis._childrenByName.forEach((node) => {\n\t\t\tthis._children.push(node);\n\t\t\tthis._childrenNames.push(node.name());\n\t\t});\n\t}\n\tchildren(): Readonly<BaseNodeType[]> {\n\t\treturn this._children;\n\t}\n\tchildrenNames(): Readonly<string[]> {\n\t\treturn this._childrenNames;\n\t}\n\n\ttraverseChildren(callback: TraverseNodeCallback, conditionCallback?: TraverseNodeConditionCallback) {\n\t\tthis._childrenByName.forEach((childNode) => {\n\t\t\tcallback(childNode);\n\t\t\tif (conditionCallback == null || conditionCallback(childNode) == true) {\n\t\t\t\tchildNode.childrenController?.traverseChildren(callback);\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseNodeType} from '../_Base';\n\ntype NodeLifeCycleControllerCallback = () => void;\ntype NodeLifeCycleControllerCallbackWithChildNode = (childNode: BaseNodeType) => void;\n\nexport class NodeLifeCycleController {\n\tprotected _creationCompleted = false;\n\tprotected _onChildAddCallbacks: NodeLifeCycleControllerCallbackWithChildNode[] | undefined;\n\tprivate _onChildRemoveCallbacks: NodeLifeCycleControllerCallbackWithChildNode[] | undefined;\n\t// _on_creation_completed_hooks are used in the importer, once the node has been created, added and params are set\n\t// private _on_creation_completed_hooks: Callback[] | undefined;\n\tprivate _onAfterCreatedCallbacks: NodeLifeCycleControllerCallback[] | undefined;\n\tprivate _onAfterAddedCallbacks: NodeLifeCycleControllerCallback[] | undefined;\n\tprivate _onBeforeDeletedCallbacks: NodeLifeCycleControllerCallback[] | undefined;\n\tprivate _onAfterDeletedCallbacks: NodeLifeCycleControllerCallback[] | undefined;\n\tconstructor(protected node: BaseNodeType) {}\n\n\tdispose() {\n\t\tthis._onChildAddCallbacks = undefined;\n\t\tthis._onChildRemoveCallbacks = undefined;\n\t\tthis._onAfterCreatedCallbacks = undefined;\n\t\tthis._onAfterAddedCallbacks = undefined;\n\t\tthis._onBeforeDeletedCallbacks = undefined;\n\t\tthis._onAfterDeletedCallbacks = undefined;\n\t}\n\n\tsetCreationCompleted() {\n\t\tif (!this._creationCompleted) {\n\t\t\tthis._creationCompleted = true;\n\t\t\t// this.run_on_creation_completed_hooks();\n\t\t}\n\t}\n\tcreationCompleted() {\n\t\treturn this.node.scene().loadingController.loaded() && this._creationCompleted;\n\t}\n\t//\n\t//\n\t// ON CREATION COMPLETED\n\t//\n\t//\n\t// add_on_creation_completed_hook(callback: Callback) {\n\t// \tthis._on_creation_completed_hooks = this._on_creation_completed_hooks || [];\n\t// \tthis._on_creation_completed_hooks.push(callback);\n\t// }\n\t// private run_on_creation_completed_hooks() {\n\t// \tif (this._on_creation_completed_hooks) {\n\t// \t\tconsole.log('run_on_creation_completed_hooks', this.node.name);\n\t// \t}\n\t// \tthis.execute_hooks(this._on_creation_completed_hooks);\n\t// }\n\t//\n\t//\n\t// ON CHILD ADD\n\t//\n\t//\n\tonChildAdd(callback: NodeLifeCycleControllerCallbackWithChildNode) {\n\t\tthis._onChildAddCallbacks = this._onChildAddCallbacks || [];\n\t\tthis._onChildAddCallbacks.push(callback);\n\t}\n\trunOnChildAddCallbacks(node: BaseNodeType) {\n\t\tthis._runCallbacksWithChildNode(this._onChildAddCallbacks, node);\n\t}\n\n\t//\n\t//\n\t// ON CHILD REMOVE\n\t//\n\t//\n\tonChildRemove(callback: NodeLifeCycleControllerCallbackWithChildNode) {\n\t\tthis._onChildRemoveCallbacks = this._onChildRemoveCallbacks || [];\n\t\tthis._onChildRemoveCallbacks.push(callback);\n\t}\n\trunOnChildRemoveCallbacks(node: BaseNodeType) {\n\t\tthis._runCallbacksWithChildNode(this._onChildRemoveCallbacks, node);\n\t}\n\n\t//\n\t//\n\t// ON CREATE\n\t//\n\t//\n\tonAfterCreated(callback: NodeLifeCycleControllerCallback) {\n\t\tthis._onAfterCreatedCallbacks = this._onAfterCreatedCallbacks || [];\n\t\tthis._onAfterCreatedCallbacks.push(callback);\n\t}\n\trunOnAfterCreatedCallbacks() {\n\t\tthis._runCallbacks(this._onAfterCreatedCallbacks);\n\t}\n\n\t//\n\t//\n\t// ON ADD\n\t//\n\t//\n\tonAfterAdded(callback: NodeLifeCycleControllerCallback) {\n\t\tthis._onAfterAddedCallbacks = this._onAfterAddedCallbacks || [];\n\t\tthis._onAfterAddedCallbacks.push(callback);\n\t}\n\trunOnAfterAddedCallbacks() {\n\t\tthis._runCallbacks(this._onAfterAddedCallbacks);\n\t}\n\n\t//\n\t//\n\t// ON DELETE\n\t//\n\t//\n\tonBeforeDeleted(callback: NodeLifeCycleControllerCallback) {\n\t\tthis._onBeforeDeletedCallbacks = this._onBeforeDeletedCallbacks || [];\n\t\tthis._onBeforeDeletedCallbacks.push(callback);\n\t}\n\trunOnBeforeDeleteCallbacks() {\n\t\tthis._runCallbacks(this._onBeforeDeletedCallbacks);\n\t}\n\t// TODO: onAfterDeleted is not very different than methods in .dispose\n\t// so this should probably be removed/refactored\n\tonAfterDeleted(callback: NodeLifeCycleControllerCallback) {\n\t\tthis._onAfterDeletedCallbacks = this._onAfterDeletedCallbacks || [];\n\t\tthis._onAfterDeletedCallbacks.push(callback);\n\t}\n\trunOnDeleteCallbacks() {\n\t\tthis._runCallbacks(this._onAfterDeletedCallbacks);\n\t}\n\n\t//\n\t//\n\t// UTILS\n\t//\n\t//\n\tprotected _runCallbacks(hooks: NodeLifeCycleControllerCallback[] | undefined) {\n\t\tif (!hooks) {\n\t\t\treturn;\n\t\t}\n\t\tlet hook: NodeLifeCycleControllerCallback | undefined;\n\t\t// do not flush, as this MAY BE needed multiple times\n\t\tfor (hook of hooks) {\n\t\t\thook();\n\t\t}\n\t}\n\tprotected _runCallbacksWithChildNode(\n\t\thooks: NodeLifeCycleControllerCallbackWithChildNode[] | undefined,\n\t\tchildNode: BaseNodeType\n\t) {\n\t\tif (!hooks) {\n\t\t\treturn;\n\t\t}\n\t\tlet hook: NodeLifeCycleControllerCallbackWithChildNode | undefined;\n\t\t// do not flush, as this is needed multiple times\n\t\tfor (hook of hooks) {\n\t\t\thook(childNode);\n\t\t}\n\t}\n}\n","import {CoreGroup} from '../../../core/geometry/Group';\nimport {Material, Texture, Object3D} from 'three';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\nimport {AudioBuilder} from '../../../core/audio/AudioBuilder';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport interface ContainableMap {\n\t[NodeContext.ANIM]: TimelineBuilder;\n\t[NodeContext.AUDIO]: AudioBuilder;\n\t[NodeContext.COP]: Texture;\n\t[NodeContext.EVENT]: string;\n\t[NodeContext.GL]: string;\n\t[NodeContext.JS]: string;\n\t[NodeContext.MANAGER]: boolean;\n\t[NodeContext.MAT]: Material;\n\t[NodeContext.OBJ]: Object3D;\n\t[NodeContext.ROP]: any;\n\t[NodeContext.POST]: number;\n\t[NodeContext.SOP]: CoreGroup;\n}\n\nexport const ContainableClassMap = {\n\t[NodeContext.ANIM]: TimelineBuilder,\n\t[NodeContext.AUDIO]: AudioBuilder,\n\t[NodeContext.COP]: Texture,\n\t[NodeContext.EVENT]: String,\n\t[NodeContext.GL]: String,\n\t[NodeContext.JS]: String,\n\t[NodeContext.MANAGER]: Boolean,\n\t[NodeContext.MAT]: Material,\n\t[NodeContext.OBJ]: Object3D,\n\t[NodeContext.ROP]: String,\n\t[NodeContext.POST]: Number,\n\t[NodeContext.SOP]: CoreGroup,\n\t// JS: JsContainer;\n};\n","import {TypedNode} from '../nodes/_Base';\n\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport abstract class TypedContainer<NC extends NodeContext> {\n\tprotected _content!: ContainableMap[NC];\n\n\tconstructor(protected _node: TypedNode<NC, any>) {\n\t\t// this.update_eval_key();\n\t\t// this.set_content(this._default_content());\n\t}\n\n\tset_node(node: TypedNode<NC, any>) {\n\t\tthis._node = node;\n\t}\n\tnode(): TypedNode<NC, any> {\n\t\treturn this._node;\n\t}\n\n\t// clone() {\n\t// \tlet content;\n\t// \tconst cloned_container = new (<any>this.constructor)() as TypedContainer<T>;\n\t// \tcloned_container.set_node(this.node());\n\t// \tif ((content = this.content()) != null) {\n\t// \t\tcloned_container.set_content(content); //, this.eval_key() );\n\t// \t}\n\t// \treturn cloned_container;\n\t// }\n\t// reset_caches() {}\n\n\tset_content(content: ContainableMap[NC]) {\n\t\t// this.reset_caches();\n\t\tthis._content = content;\n\t\tthis._post_set_content();\n\t}\n\thas_content(): boolean {\n\t\treturn this._content != null;\n\t}\n\n\tcontent() {\n\t\treturn this._content;\n\t}\n\tprotected _post_set_content() {}\n\tpublic coreContent(): ContainableMap[NC] | undefined {\n\t\treturn this._content;\n\t}\n\tpublic coreContentCloned(): ContainableMap[NC] | undefined {\n\t\treturn this._content;\n\t}\n\t// abstract clone_content(): T\n\n\t// update_eval_key(eval_key?: number){\n\t// \tthis._eval_key = eval_key || performance.now();\n\t// }\n\t// eval_key(): number {\n\t// \treturn this._eval_key;\n\t// }\n\n\tinfos(): any {\n\t\treturn [];\n\t}\n}\n\nexport class BaseContainer extends TypedContainer<any> {}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {TimelineBuilder} from '../../core/animation/TimelineBuilder';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class AnimationContainer extends TypedContainer<NodeContext.ANIM> {\n\toverride set_content(content: ContainableMap[NodeContext.ANIM]) {\n\t\tsuper.set_content(content);\n\t}\n\tsetTimelineBuilder(timeline_builder: TimelineBuilder) {\n\t\treturn this.set_content(timeline_builder);\n\t}\n\ttimelineBuilder() {\n\t\treturn this.content();\n\t}\n\n\toverride coreContentCloned() {\n\t\tif (this._content) {\n\t\t\treturn this._content.clone();\n\t\t}\n\t}\n\n\t// infos() {\n\t// \tconst node = this.node()\n\t// \treturn [\n\t// \t\t`full path: ${node.path()}`,\n\t// \t\t`${node.cooks_count()} cooks`,\n\t// \t\t`cook time: ${node.cook_time()}`,\n\t// \t\tthis.content(),\n\t// \t]\n\t// }\n}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\nimport {AudioBuilder} from '../../core/audio/AudioBuilder';\n\nexport class AudioContainer extends TypedContainer<NodeContext.AUDIO> {\n\tsetContent(content: ContainableMap[NodeContext.AUDIO]) {\n\t\tsuper.set_content(content);\n\t}\n\tsetAudioBuilder(audioBuilder: AudioBuilder) {\n\t\treturn this.set_content(audioBuilder);\n\t}\n\taudioBuilder() {\n\t\treturn this.content();\n\t}\n\n\toverride coreContentCloned() {\n\t\tif (this._content) {\n\t\t\treturn this._content.clone();\n\t\t}\n\t}\n}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class EventContainer extends TypedContainer<NodeContext.EVENT> {\n\toverride set_content(content: ContainableMap[NodeContext.EVENT]) {\n\t\tsuper.set_content(content);\n\t}\n}\n","import {TypedContainer} from './_Base';\nimport type {CoreGroup} from '../../core/geometry/Group';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class GeometryContainer extends TypedContainer<NodeContext.SOP> {\n\toverride coreContentCloned(): CoreGroup | undefined {\n\t\tif (this._content) {\n\t\t\treturn this._content.clone();\n\t\t}\n\t}\n\n\toverride set_content(content: ContainableMap[NodeContext.SOP]) {\n\t\tsuper.set_content(content);\n\t}\n\n\t// pointsCount(): number {\n\t// \tif (this._content) {\n\t// \t\treturn this._content.pointsCount();\n\t// \t} else {\n\t// \t\treturn 0;\n\t// \t}\n\t// }\n}\n","import {TypedContainer} from './_Base';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class GlContainer extends TypedContainer<NodeContext.GL> {\n\tobject() {\n\t\treturn this._content;\n\t}\n}\n","import {TypedContainer} from './_Base';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class JsContainer extends TypedContainer<NodeContext.JS> {\n\tobject() {\n\t\treturn this._content;\n\t}\n}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class ManagerContainer extends TypedContainer<NodeContext.MANAGER> {\n\toverride set_content(content: ContainableMap[NodeContext.MANAGER]) {\n\t\tsuper.set_content(content);\n\t}\n}\n","import {Material} from 'three';\nimport {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\nimport {CoreMaterial} from '../../core/geometry/Material';\n\nexport class MaterialContainer extends TypedContainer<NodeContext.MAT> {\n\toverride set_content(content: ContainableMap[NodeContext.MAT]) {\n\t\tsuper.set_content(content);\n\t}\n\toverride coreContentCloned(): ContainableMap[NodeContext.MAT] | undefined {\n\t\tif (this._content) {\n\t\t\tconst cloned = CoreMaterial.clone(this._node.scene(), this._content, {\n\t\t\t\tshareCustomUniforms: true,\n\t\t\t\taddCustomMaterials: true,\n\t\t\t}); //.clone();\n\t\t\t// const cloned = this._content.clone();\n\t\t\treturn cloned;\n\t\t}\n\t}\n\tset_material(material: Material) {\n\t\tif (this._content != null) {\n\t\t\tthis._content.dispose();\n\t\t}\n\t\tthis.set_content(material);\n\t}\n\thas_material() {\n\t\treturn this.has_content();\n\t}\n\tmaterial() {\n\t\treturn this.content();\n\t}\n}\n","import {Object3D} from 'three';\nimport {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class ObjectContainer extends TypedContainer<NodeContext.OBJ> {\n\toverride set_content(content: ContainableMap[NodeContext.OBJ]) {\n\t\tsuper.set_content(content);\n\t}\n\tset_object(object: Object3D) {\n\t\treturn this.set_content(object);\n\t}\n\thas_object() {\n\t\treturn this.has_content();\n\t}\n\tobject() {\n\t\treturn this.content();\n\t}\n\n\t// infos() {\n\t// \tconst node = this.node()\n\t// \treturn [\n\t// \t\t`full path: ${node.path()}`,\n\t// \t\t`${node.cooks_count()} cooks`,\n\t// \t\t`cook time: ${node.cook_time()}`,\n\t// \t\tthis.content(),\n\t// \t]\n\t// }\n}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\nimport {Number2} from '../../types/GlobalTypes';\nimport {isNumber} from '../../core/Type';\n\nexport class TextureContainer extends TypedContainer<NodeContext.COP> {\n\toverride set_content(content: ContainableMap[NodeContext.COP]) {\n\t\tsuper.set_content(content);\n\t}\n\n\ttexture(): ContainableMap[NodeContext.COP] {\n\t\treturn this._content;\n\t}\n\toverride coreContent(): ContainableMap[NodeContext.COP] {\n\t\treturn this._content;\n\t}\n\toverride coreContentCloned(): ContainableMap[NodeContext.COP] | undefined {\n\t\tconst texture = this._content?.clone();\n\t\tif (texture) {\n\t\t\ttexture.needsUpdate = true;\n\t\t}\n\t\treturn texture;\n\t}\n\n\tobject() {\n\t\treturn this.texture();\n\t}\n\n\toverride infos() {\n\t\tif (this._content != null) {\n\t\t\treturn [this._content];\n\t\t}\n\t}\n\tresolution(): Number2 {\n\t\tfunction _resolutionFromHTMLVideoElement(video: HTMLVideoElement): Number2 {\n\t\t\treturn [video.videoWidth, video.videoHeight];\n\t\t}\n\n\t\tif (this._content) {\n\t\t\tconst image = this._content.image;\n\t\t\tif (image) {\n\t\t\t\t// check if normal image or gif\n\t\t\t\tif (\n\t\t\t\t\timage instanceof HTMLImageElement ||\n\t\t\t\t\timage instanceof Image ||\n\t\t\t\t\timage instanceof ImageData ||\n\t\t\t\t\timage instanceof HTMLCanvasElement // HTMLCanvasElement for gif\n\t\t\t\t) {\n\t\t\t\t\treturn [image.width, image.height];\n\t\t\t\t}\n\t\t\t\t// check if video\n\t\t\t\tif (image instanceof HTMLVideoElement) {\n\t\t\t\t\treturn _resolutionFromHTMLVideoElement(image);\n\t\t\t\t}\n\t\t\t\t// check if image data\n\t\t\t\tif (isNumber(image.width) && isNumber(image.height)) {\n\t\t\t\t\treturn [image.width, image.height];\n\t\t\t\t}\n\n\t\t\t\t// if just an object like {width: 2, height: 2}\n\t\t\t\t// which can be returned by\n\t\t\t}\n\t\t\tconst source = this._content.source;\n\t\t\tif (source) {\n\t\t\t\tif (source instanceof HTMLVideoElement) {\n\t\t\t\t\treturn _resolutionFromHTMLVideoElement(source);\n\t\t\t\t}\n\n\t\t\t\tconst data = source.data;\n\t\t\t\tif (data && isNumber(data.width) && isNumber(data.height)) {\n\t\t\t\t\treturn [data.width, data.height];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn [-1, -1];\n\t}\n}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class PostProcessContainer extends TypedContainer<NodeContext.POST> {\n\t// _content: any;\n\n\t// constructor() {\n\t// \tsuper();\n\t// }\n\toverride set_content(content: ContainableMap[NodeContext.POST]) {\n\t\tsuper.set_content(content);\n\t}\n\trender_pass() {\n\t\treturn this._content;\n\t}\n\n\tobject(options = {}) {\n\t\treturn this.render_pass();\n\t}\n\n\t// infos() {\n\t// \tif (this._content) {\n\t// \t\treturn [this._content];\n\t// \t}\n\t// }\n}\n","import {TypedContainer} from './_Base';\nimport {ContainableMap} from './utils/ContainableMap';\nimport {NodeContext} from '../poly/NodeContext';\n\nexport class RopContainer extends TypedContainer<NodeContext.ROP> {\n\toverride set_content(content: ContainableMap[NodeContext.ROP]) {\n\t\tsuper.set_content(content);\n\t}\n\trenderer() {\n\t\treturn this._content;\n\t}\n}\n","import {NodeContext} from '../../poly/NodeContext';\nimport {TypedContainer} from '../_Base';\nimport {AnimationContainer} from '../Animation';\nimport {AudioContainer} from '../Audio';\nimport {EventContainer} from '../Event';\nimport {GeometryContainer} from '../Geometry';\nimport {GlContainer} from '../Gl';\nimport {JsContainer} from '../Js';\nimport {ManagerContainer} from '../Manager';\nimport {MaterialContainer} from '../Material';\nimport {ObjectContainer} from '../Object';\nimport {TextureContainer} from '../Texture';\nimport {PostProcessContainer} from '../PostProcess';\nimport {RopContainer} from '../Rop';\n\nexport type ContainerClassMapGeneric = {[key in NodeContext]: TypedContainer<key>};\nexport const ContainerClassMap = {\n\t[NodeContext.ANIM]: AnimationContainer,\n\t[NodeContext.AUDIO]: AudioContainer,\n\t[NodeContext.COP]: TextureContainer,\n\t[NodeContext.EVENT]: EventContainer,\n\t[NodeContext.GL]: GlContainer,\n\t[NodeContext.JS]: JsContainer,\n\t[NodeContext.MANAGER]: ManagerContainer,\n\t[NodeContext.MAT]: MaterialContainer,\n\t[NodeContext.OBJ]: ObjectContainer,\n\t[NodeContext.ROP]: RopContainer,\n\t[NodeContext.POST]: PostProcessContainer,\n\t[NodeContext.SOP]: GeometryContainer,\n};\n\ntype ContainerMapGeneric = {[key in NodeContext]: TypedContainer<key>};\n\nexport interface ContainerMap extends ContainerMapGeneric {\n\t[NodeContext.ANIM]: AnimationContainer;\n\t[NodeContext.AUDIO]: AudioContainer;\n\t[NodeContext.COP]: TextureContainer;\n\t[NodeContext.EVENT]: EventContainer;\n\t[NodeContext.GL]: GlContainer;\n\t[NodeContext.JS]: JsContainer;\n\t[NodeContext.MANAGER]: ManagerContainer;\n\t[NodeContext.MAT]: MaterialContainer;\n\t[NodeContext.OBJ]: ObjectContainer;\n\t[NodeContext.ROP]: RopContainer;\n\t[NodeContext.POST]: PostProcessContainer;\n\t[NodeContext.SOP]: GeometryContainer;\n}\n","import {ContainableMap} from './../../../../src/engine/containers/utils/ContainableMap';\nimport {ContainableClassMap} from './../../containers/utils/ContainableMap';\nimport {TypedNode} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {ContainerMap, ContainerClassMap} from '../../containers/utils/ContainerMap';\n\ntype NodeContainerControllerCallback<NC extends NodeContext> = (container: ContainerMap[NC] | undefined) => void;\n\nexport class TypedContainerController<NC extends NodeContext> {\n\tprivate _callbacks: NodeContainerControllerCallback<NC>[] = [];\n\tprivate _callbacksTmp: NodeContainerControllerCallback<NC>[] = [];\n\tprotected _container: ContainerMap[NC];\n\n\tconstructor(protected node: TypedNode<NC, any>) {\n\t\tthis._container = this._createContainer();\n\t}\n\n\tcontainer() {\n\t\treturn this._container;\n\t}\n\tprivate _createContainer() {\n\t\tconst ContainerClass = ContainerClassMap[this.node.context()];\n\t\treturn new ContainerClass(this.node as any) as ContainerMap[NC];\n\t}\n\tprivate _createContainerWithContent() {\n\t\tconst container = this._createContainer();\n\t\tconst ContentClass = ContainableClassMap[this.node.context()];\n\t\tconst content = new ContentClass() as ContainableMap[NC];\n\t\tcontainer.set_content(<never>content);\n\t\treturn container;\n\t}\n\n\tfirstNonBypassedNode() {\n\t\tif (this.node.flags?.bypass?.active()) {\n\t\t\tconst inputNode = (<unknown>this.node.io.inputs.input(0)) as TypedNode<NC, any>;\n\t\t\treturn inputNode;\n\t\t} else {\n\t\t\treturn this.node;\n\t\t}\n\t}\n\n\tcontainerUnlessBypassed(): ContainerMap[NC] | undefined {\n\t\tif (this.node.flags?.bypass?.active()) {\n\t\t\tthis.node.states.error.clear();\n\t\t\tconst inputNode = (<unknown>this.node.io.inputs.input(0)) as TypedNode<NC, any>;\n\t\t\tif (inputNode) {\n\t\t\t\treturn inputNode.containerController.containerUnlessBypassed();\n\t\t\t} else {\n\t\t\t\treturn this._createContainerWithContent();\n\t\t\t}\n\t\t} else {\n\t\t\treturn this.container();\n\t\t}\n\t}\n\n\tasync compute(): Promise<ContainerMap[NC]> {\n\t\tif (this.node.disposed()) {\n\t\t\tconsole.warn('.compute() requested from a disposed node', this.node);\n\t\t}\n\t\tif (this.node.flags?.bypass?.active()) {\n\t\t\tthis.node.states.error.clear();\n\t\t\tconst inputNode = (<unknown>this.node.io.inputs.input(0)) as TypedNode<NC, any>;\n\t\t\tif (inputNode) {\n\t\t\t\tconst container = (await this.requestInputContainer(0)) || this._container;\n\t\t\t\tthis.node.cookController.endCook();\n\t\t\t\treturn container;\n\t\t\t} else {\n\t\t\t\treturn this._createContainerWithContent();\n\t\t\t}\n\t\t}\n\t\tif (this.node.isDirty()) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis._callbacks.push(resolve as () => ContainerMap[NC]);\n\t\t\t\tif (this.node.flags?.bypass?.active()) {\n\t\t\t\t\tthrow 'we should not be here';\n\t\t\t\t}\n\t\t\t\tthis.node.cookController.cookMain();\n\t\t\t});\n\t\t}\n\t\treturn this._container;\n\t}\n\t// async requestContainerTEST(): Promise<ContainerMap[NC]> {\n\t// \tif (this.node.flags?.bypass?.active()) {\n\t// \t\tconst container = await this.requestInputContainer(0);\n\t// \t\treturn container || this._container;\n\t// \t}\n\t// \tif (this.node.isDirty()) {\n\t// \t\tawait this.node.cookController.cook_main();\n\t// \t}\n\t// \treturn this._container;\n\t// }\n\n\t// TODO: should I merge this into the method above?\n\t// private process_container_request() {\n\t// \tif (this.node.flags?.bypass?.active()) {\n\t// \t\tconst input_index = 0;\n\t// \t\tthis.requestInputContainer(input_index).then((container) => {\n\t// \t\t\tthis.node.removeDirtyState();\n\t// \t\t\tif (container) {\n\t// \t\t\t\tthis.notify_requesters(container);\n\t// \t\t\t} else {\n\t// \t\t\t\tthis.node.states.error.set('input invalid');\n\t// \t\t\t}\n\t// \t\t});\n\t// \t} else {\n\t// \t\tif (this.node.isDirty()) {\n\t// \t\t\tthis.node.cookController.cook_main();\n\t// \t\t} else {\n\t// \t\t\tthis.notify_requesters();\n\t// \t\t}\n\t// \t}\n\t// }\n\n\tasync requestInputContainer(inputIndex: number) {\n\t\tconst inputNode = (<unknown>this.node.io.inputs.input(inputIndex)) as TypedNode<NC, any>;\n\t\tif (inputNode) {\n\t\t\treturn await inputNode.compute();\n\t\t} else {\n\t\t\tthis.node.states.error.set(`input ${inputIndex} required`);\n\t\t\tthis.notifyRequesters();\n\t\t\treturn null;\n\t\t}\n\t}\n\tnotifyRequesters(container?: ContainerMap[NC]) {\n\t\t// make a copy of the callbacks first,\n\t\t// to ensure that new ones are not added to this list\n\t\t// in side effects from those callbacks\n\t\t// (the test suite for the File SOP is a good test for this)\n\t\tthis._callbacksTmp = this._callbacks.slice(); // clone\n\t\tthis._callbacks.splice(0, this._callbacks.length); // empty\n\n\t\tif (!container) {\n\t\t\tcontainer = this.node.containerController.container();\n\t\t}\n\t\tlet callback: NodeContainerControllerCallback<NC> | undefined;\n\t\twhile ((callback = this._callbacksTmp.pop())) {\n\t\t\tcallback(container);\n\t\t}\n\t\tthis.node.scene().cookController.removeNode(this.node);\n\t}\n}\n\nexport class BaseContainerController extends TypedContainerController<any> {}\n","import {Poly} from '../../../Poly';\nimport {NodeCookController} from '../CookController';\n\nexport interface NodePerformanceData {\n\tinputsTime: number;\n\tparamsTime: number;\n\tcookTime: number;\n}\n\nconst performance = Poly.performance.performanceManager();\nexport class NodeCookPerformanceformanceController {\n\tprivate _inputsStart: number = 0;\n\tprivate _inputsTime: number = 0;\n\tprivate _paramsStart: number = 0;\n\tprivate _paramsTime: number = 0;\n\tprivate _cookStart: number = 0;\n\tprivate _cookTime: number = 0;\n\tprivate _cooksCount: number = 0;\n\tprivate _data: NodePerformanceData = {\n\t\tinputsTime: 0,\n\t\tparamsTime: 0,\n\t\tcookTime: 0,\n\t};\n\n\tconstructor(private cookController: NodeCookController<any>) {}\n\n\tcooksCount() {\n\t\treturn this._cooksCount;\n\t}\n\tdata() {\n\t\tthis._data.inputsTime = this._inputsTime;\n\t\tthis._data.paramsTime = this._paramsTime;\n\t\tthis._data.cookTime = this._cookTime;\n\t\treturn this._data;\n\t}\n\n\tactive(): boolean {\n\t\treturn this.cookController.performanceRecordStarted();\n\t}\n\n\t//\n\t// INPUTS\n\t//\n\trecordInputsStart() {\n\t\tif (this.active()) {\n\t\t\tthis._inputsStart = performance.now();\n\t\t}\n\t}\n\trecordInputsEnd() {\n\t\tif (this.active()) {\n\t\t\tthis._inputsTime = performance.now() - this._inputsStart;\n\t\t}\n\t}\n\t//\n\t// PARAMS\n\t//\n\trecordParamsStart() {\n\t\tif (this.active()) {\n\t\t\tthis._paramsStart = performance.now();\n\t\t}\n\t}\n\trecordParamsEnd() {\n\t\tif (this.active()) {\n\t\t\tthis._paramsTime = performance.now() - this._paramsStart;\n\t\t}\n\t}\n\t//\n\t// COOK\n\t//\n\trecordCookStart() {\n\t\tif (this.active()) {\n\t\t\tthis._cookStart = performance.now();\n\t\t}\n\t}\n\trecordCookEnd() {\n\t\tif (this.active()) {\n\t\t\tthis._cookTime = performance.now() - this._cookStart;\n\t\t\tthis._cooksCount += 1;\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../_Base';\nimport {Poly} from '../../Poly';\nimport {CorePerformance} from '../../../core/performance/CorePerformance';\nimport {NodeCookPerformanceformanceController} from './cook/PerformanceController';\nimport {ContainerMap} from '../../containers/utils/ContainerMap';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {ContainableMap} from '../../containers/utils/ContainableMap';\nimport {touchNodeRef} from '../../../core/reactivity/NodeReactivity';\nimport {NodeInputsController} from './io/InputsController';\n\nenum ErrorType {\n\tFROM_INPUTS = 'node inputs error',\n\tINTERNAL = 'node internal error',\n}\n\nexport type OnCookCompleteHook = () => void;\n\nexport class NodeCookController<NC extends NodeContext> {\n\tprivate _corePerformance: CorePerformance;\n\tprivate _cooking: boolean = false;\n\tprivate _cookingDirtyTimestamp: number | undefined;\n\tprivate _performanceController: NodeCookPerformanceformanceController = new NodeCookPerformanceformanceController(\n\t\tthis\n\t);\n\tprivate _inputContainers: Array<ContainerMap[NC] | null> = [];\n\tprivate _inputContents: ContainableMap[NC][] = [];\n\tprivate _EMPTY_ARRAY: ContainableMap[NC][] = [];\n\n\tconstructor(private node: BaseNodeType) {\n\t\tthis._corePerformance = this.node.scene().performance;\n\t}\n\tperformanceRecordStarted() {\n\t\treturn this._corePerformance.started();\n\t}\n\tdispose() {\n\t\tthis._clearHooks();\n\t}\n\n\t// Disallowing inputs evaluation is important for switch nodes (such as SOP and COP)\n\t// that should not evaluate all inputs, but only a single one, depending on a param value\n\t// currently only for switch SOP and COP\n\tprivate _inputsEvaluationRequired: boolean = true;\n\tdisallowInputsEvaluation() {\n\t\tthis._inputsEvaluationRequired = false;\n\t}\n\n\tisCooking(): boolean {\n\t\treturn this._cooking === true;\n\t}\n\n\tprivate _startCookIfNoErrors(inputContents: ContainableMap[NC][]) {\n\t\tif (this.node.states.error.active() || this.node.disposed() == true) {\n\t\t\tthis.endCook();\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis._performanceController.recordCookStart();\n\t\t\t\t// make sure we treat rejected promise\n\t\t\t\t// if cook is async\n\t\t\t\tconst promise = this.node.cook(inputContents);\n\t\t\t\tif (promise != null) {\n\t\t\t\t\tpromise.catch((e: any) => {\n\t\t\t\t\t\tthis._onError(e, ErrorType.INTERNAL, false);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis._onError(e, ErrorType.INTERNAL);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync cookMain() {\n\t\tif (this.isCooking()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.node.disposed() == true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._initCookingState();\n\t\tthis.node.states.error.clear();\n\t\tthis.node.scene().cookController.addNode(this.node);\n\n\t\ttry {\n\t\t\t// we need to try/catch inputs fetching,\n\t\t\t// as some nodes like the sop/normalsHelper\n\t\t\t// currently fail when being cloned\n\t\t\t// const inputContents: ContainableMap[NC][] | undefined = this._inputsEvaluationRequired\n\t\t\t// \t? await this._evaluateInputs()\n\t\t\t// \t: undefined;\n\t\t\tthis._inputContents.length = 0;\n\t\t\tif (this._inputsEvaluationRequired) {\n\t\t\t\tawait this._evaluateInputs(this._inputContents);\n\t\t\t}\n\n\t\t\tif (this.node.params.paramsEvalRequired()) {\n\t\t\t\tawait this._evaluateParams();\n\t\t\t}\n\t\t\tthis._startCookIfNoErrors(this._inputContents);\n\t\t} catch (e) {\n\t\t\tthis._onError(e, ErrorType.FROM_INPUTS);\n\t\t}\n\t}\n\tprivate _onError(e: unknown, errorType: ErrorType, alwaysSet: boolean = true) {\n\t\tif (alwaysSet || !this.node.states.error.active()) {\n\t\t\tconst processedError = this.node.processError(e);\n\t\t\tthis.node.states.error.set(`${errorType}: '${processedError}'.`);\n\t\t\tPoly.warn(e);\n\t\t}\n\t\tthis.endCook();\n\t}\n\n\tasync cookMainWithoutInputs() {\n\t\tthis.node.scene().cookController.addNode(this.node);\n\t\tif (this.isCooking()) {\n\t\t\t// TODO:\n\t\t\t// this seems to happen because when we flush the cooker queue,\n\t\t\t// some graph nodes will trigger more updates, which will then make dependent nodes\n\t\t\t// dirty again\n\t\t\tPoly.warn('cook_main_without_inputs already cooking', this.node.path());\n\t\t\treturn;\n\t\t}\n\t\tthis._initCookingState();\n\t\tthis.node.states.error.clear();\n\n\t\tif (this.node.params.paramsEvalRequired()) {\n\t\t\tawait this._evaluateParams();\n\t\t}\n\t\tthis._startCookIfNoErrors(this._EMPTY_ARRAY);\n\t}\n\n\tendCook(/*message?: string | null*/) {\n\t\tthis._finalizeCookPerformance();\n\n\t\tconst dirtyTimestamp = this.node.dirtyController.dirtyTimestamp();\n\t\tconst timestampUnchangedSinceCookStarted =\n\t\t\tdirtyTimestamp == null || dirtyTimestamp === this._cookingDirtyTimestamp;\n\t\tif (\n\t\t\ttimestampUnchangedSinceCookStarted ||\n\t\t\tthis.node.flags?.bypass?.active() /* || this._scenePlayingAndNodeAlreadyCookedForCurrentFrame()*/\n\t\t) {\n\t\t\tthis.node.removeDirtyState();\n\t\t\tthis._terminateCookProcess();\n\t\t} else {\n\t\t\tif (this.node.disposed() == true) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tPoly.log('COOK AGAIN', dirtyTimestamp, this._cookingDirtyTimestamp, this.node.path());\n\t\t\tthis._cooking = false;\n\t\t\tthis.cookMain();\n\t\t}\n\t}\n\t// private _lastFrameCooked: number | undefined;\n\t// private _scenePlayingAndNodeAlreadyCookedForCurrentFrame() {\n\t// \tif (this.node.scene().timeController.playing()) {\n\t// \t\treturn this._lastFrameCooked == this.node.scene().frame();\n\t// \t}\n\t// \treturn false;\n\t// }\n\tprivate _initCookingState() {\n\t\tthis._cooking = true;\n\t\t// this._lastFrameCooked = this.node.scene().frame();\n\t\tthis._cookingDirtyTimestamp = this.node.dirtyController.dirtyTimestamp();\n\t}\n\tprivate _terminateCookProcess() {\n\t\tif (this.isCooking() || this.node.flags?.bypass?.active()) {\n\t\t\tthis._cooking = false;\n\n\t\t\t// setTimeout(this.node.containerController.notifyRequesters.bind(this.node.containerController), 0);\n\t\t\tthis.node.containerController.notifyRequesters();\n\t\t\tthis._runOnCookCompleteHooks();\n\t\t\tif (this.node.disposed() == true) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttouchNodeRef(this.node.path());\n\t\t}\n\t}\n\n\tprivate async _evaluateInputs(inputContents: ContainableMap[NC][]): Promise<ContainableMap[NC][]> {\n\t\tthis._performanceController.recordInputsStart();\n\n\t\tconst ioOnputs: NodeInputsController<NC> = this.node.io.inputs;\n\n\t\t// const inputContainers: (ContainerMap[NC] | null)[] = this._inputsEvaluationRequired\n\t\t// \t? ioOnputs.isGraphNodeDirty()\n\t\t// \t\t? await ioOnputs.evalRequiredInputs()\n\t\t// \t\t: ioOnputs.containersWithoutEvaluation()\n\t\t// \t: [];\n\n\t\tthis._inputContainers.length = 0;\n\t\tif (this._inputsEvaluationRequired) {\n\t\t\tif (ioOnputs.isGraphNodeDirty()) {\n\t\t\t\tawait ioOnputs.evalRequiredInputs(this._inputContainers);\n\t\t\t} else {\n\t\t\t\tioOnputs.containersWithoutEvaluation(this._inputContainers);\n\t\t\t}\n\t\t}\n\n\t\tconst inputs = ioOnputs.inputs();\n\t\t// const inputContents: ContainableMap[NC][] = [];\n\t\tlet inputContainer: ContainerMap[NC] | null;\n\t\tfor (let i = 0; i < inputs.length; i++) {\n\t\t\tinputContainer = this._inputContainers[i];\n\t\t\tif (inputContainer) {\n\t\t\t\tif (ioOnputs.cloneRequired(i)) {\n\t\t\t\t\tinputContents[i] = inputContainer.coreContentCloned() as ContainableMap[NC];\n\t\t\t\t} else {\n\t\t\t\t\tinputContents[i] = inputContainer.coreContent() as ContainableMap[NC];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._performanceController.recordInputsEnd();\n\t\treturn inputContents;\n\t}\n\tprivate async _evaluateParams() {\n\t\tthis._performanceController.recordParamsStart();\n\t\tawait this.node.params.evalAll();\n\t\tthis._performanceController.recordParamsEnd();\n\t}\n\n\t//\n\t//\n\t// PERFORMANCE\n\t//\n\t//\n\tcooksCount(): number {\n\t\treturn this._performanceController.cooksCount();\n\t}\n\tcookTime(): number {\n\t\treturn this._performanceController.data().cookTime;\n\t}\n\n\tprivate _finalizeCookPerformance() {\n\t\tif (!this._corePerformance.started()) {\n\t\t\treturn;\n\t\t}\n\t\tthis._performanceController.recordCookEnd();\n\n\t\tthis._corePerformance.recordNodeCookData(this.node, this._performanceController.data());\n\t}\n\n\t//\n\t//\n\t// HOOK\n\t//\n\t//\n\tprivate _onCookCompleteHookNames: string[] | undefined;\n\tprivate _onCookCompleteHooks: OnCookCompleteHook[] | undefined;\n\tregisterOnCookEnd(callbackName: string, callback: OnCookCompleteHook) {\n\t\tthis._onCookCompleteHookNames = this._onCookCompleteHookNames || [];\n\t\tthis._onCookCompleteHooks = this._onCookCompleteHooks || [];\n\t\tthis._onCookCompleteHookNames.push(callbackName);\n\t\tthis._onCookCompleteHooks.push(callback);\n\t}\n\tprivate _clearHooks() {\n\t\tif (!this._onCookCompleteHookNames || !this._onCookCompleteHooks) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const hookName of this._onCookCompleteHookNames) {\n\t\t\tthis.deregisterOnCookEnd(hookName);\n\t\t}\n\t}\n\tderegisterOnCookEnd(callbackName: string) {\n\t\tif (!this._onCookCompleteHookNames || !this._onCookCompleteHooks) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = this._onCookCompleteHookNames?.indexOf(callbackName);\n\t\tthis._onCookCompleteHookNames.splice(index, 1);\n\t\tthis._onCookCompleteHooks.splice(index, 1);\n\t\tif (this._onCookCompleteHookNames.length == 0) {\n\t\t\tthis._onCookCompleteHookNames = undefined;\n\t\t}\n\t\tif (this._onCookCompleteHooks.length == 0) {\n\t\t\tthis._onCookCompleteHooks = undefined;\n\t\t}\n\t}\n\tprivate _runOnCookCompleteHooks() {\n\t\tif (this._onCookCompleteHooks) {\n\t\t\tconst hooks = [...this._onCookCompleteHooks];\n\t\t\tfor (let hook of hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n\tonCookEndCallbackNames() {\n\t\treturn this._onCookCompleteHookNames;\n\t}\n}\n","import {TypedParam} from './_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\n\nexport class ButtonParam extends TypedParam<ParamType.BUTTON> {\n\tstatic override type() {\n\t\treturn ParamType.BUTTON;\n\t}\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn this._raw_input;\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value;\n\t}\n\tprotected override _copyValue(param: ButtonParam) {}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.BUTTON],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.BUTTON]\n\t) {\n\t\treturn true;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.BUTTON],\n\t\tval2: ParamValuesTypeMap[ParamType.BUTTON]\n\t) {\n\t\treturn true;\n\t}\n\tasync pressButton() {\n\t\t// cook the node in case it requires it, since the callback will not be ran if the node is cooking\n\t\tif (this.node.isDirty() || this.node.cookController.isCooking()) {\n\t\t\tawait this.node.compute();\n\t\t}\n\t\tawait this.options.executeCallback();\n\t}\n}\n","import {TypedParam} from './_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\n\nexport class FolderParam extends TypedParam<ParamType.FOLDER> {\n\tstatic override type() {\n\t\treturn ParamType.FOLDER;\n\t}\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn this._raw_input;\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value;\n\t}\n\tprotected override _copyValue(param: FolderParam) {}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.FOLDER],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.FOLDER]\n\t) {\n\t\treturn true;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.FOLDER],\n\t\tval2: ParamValuesTypeMap[ParamType.FOLDER]\n\t) {\n\t\treturn true;\n\t}\n}\n","import {BooleanParam} from '../Boolean';\nimport {ButtonParam} from '../Button';\nimport {ColorParam} from '../Color';\nimport {FloatParam} from '../Float';\nimport {FolderParam} from '../Folder';\nimport {IntegerParam} from '../Integer';\n// import {OperatorPathParam} from '../OperatorPath';\nimport {ParamPathParam} from '../ParamPath';\nimport {NodePathParam} from '../NodePath';\nimport {RampParam} from '../Ramp';\nimport {StringParam} from '../String';\nimport {Vector2Param} from '../Vector2';\nimport {Vector3Param} from '../Vector3';\nimport {Vector4Param} from '../Vector4';\n\nimport {ParamType} from '../../poly/ParamType';\n\ntype ParamClassMapType = {[key in ParamType]: any};\nexport const ParamConstructorByType: ParamClassMapType = {\n\t[ParamType.BOOLEAN]: BooleanParam,\n\t[ParamType.BUTTON]: ButtonParam,\n\t[ParamType.COLOR]: ColorParam,\n\t[ParamType.FLOAT]: FloatParam,\n\t[ParamType.FOLDER]: FolderParam,\n\t[ParamType.INTEGER]: IntegerParam,\n\t// [ParamType.OPERATOR_PATH]: OperatorPathParam,\n\t[ParamType.PARAM_PATH]: ParamPathParam,\n\t[ParamType.NODE_PATH]: NodePathParam,\n\t[ParamType.RAMP]: RampParam,\n\t[ParamType.STRING]: StringParam,\n\t[ParamType.VECTOR2]: Vector2Param,\n\t[ParamType.VECTOR3]: Vector3Param,\n\t[ParamType.VECTOR4]: Vector4Param,\n};\n","import {BaseNodeType} from '../../_Base';\nimport {BaseParamType} from '../../../params/_Base';\nimport {ParamOptions} from '../../../params/utils/OptionsController';\nimport {CoreGraphNode} from '../../../../core/graph/CoreGraphNode';\nimport {FloatParam} from '../../../params/Float';\nimport {ParamType} from '../../../poly/ParamType';\nimport {ParamTemplate} from './ParamsConfig';\nimport {ParamConstructorMap} from '../../../params/types/ParamConstructorMap';\nimport {ParamConstructorByType} from '../../../params/types/ParamConstructorByType';\nimport {ParamInitValuesTypeMap} from '../../../params/types/ParamInitValuesTypeMap';\nimport {ParamValuesTypeMap} from '../../../params/types/ParamValuesTypeMap';\nimport {NodeEvent} from '../../../poly/NodeEvent';\nimport {ParamInitValueSerializedTypeMap} from '../../../params/types/ParamInitValueSerializedTypeMap';\nimport {Poly} from '../../../Poly';\nimport {ParamInitData} from '../io/IOController';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {arrayCopy} from '../../../../core/ArrayUtils';\n\nconst NODE_SIMPLE_NAME = 'params';\n\nexport type OnSceneLoadHook = () => void;\ntype PostCreateParamsHook = () => void;\n\nexport interface ParamOptionToAdd<T extends ParamType> {\n\tname: string;\n\ttype: T;\n\tinitValue: ParamInitValueSerializedTypeMap[T];\n\trawInput: ParamInitValueSerializedTypeMap[T];\n\toptions?: ParamOptions;\n}\nexport interface ParamsUpdateOptions {\n\tnamesToDelete?: string[];\n\ttoAdd?: ParamOptionToAdd<ParamType>[];\n}\nconst _tmpAll: BaseParamType[] = [];\n\nexport class ParamsController {\n\tprivate _param_create_mode: boolean = false;\n\tprivate _params_created: boolean = false;\n\tprivate _paramsByName: Map<string, BaseParamType> = new Map();\n\t// caches\n\tprivate _paramsList: BaseParamType[] = [];\n\tprivate _paramNames: string[] = [];\n\tprivate _non_spare_params: BaseParamType[] = [];\n\tprivate _spare_params: BaseParamType[] = [];\n\tprivate _non_spare_param_names: string[] = [];\n\tprivate _spare_param_names: string[] = [];\n\n\tprivate _params_node: CoreGraphNode | undefined;\n\t// private _params_eval_key: string;\n\tprivate _params_added_since_last_params_eval: boolean = false;\n\t// private _current_param_folder_name: string | undefined;\n\n\t// hooks\n\tprivate _post_create_params_hook_names: string[] | undefined;\n\tprivate _post_create_params_hooks: PostCreateParamsHook[] | undefined;\n\tprivate _on_scene_load_hooks: OnSceneLoadHook[] | undefined;\n\tprivate _on_scene_load_hook_names: string[] | undefined;\n\n\tconstructor(public readonly node: BaseNodeType) {}\n\n\tdispose() {\n\t\tif (this._params_node) {\n\t\t\tthis._params_node.dispose();\n\t\t}\n\n\t\t// dispose params\n\t\tarrayCopy(this.all, _tmpAll);\n\t\tfor (const param of _tmpAll) {\n\t\t\tparam.dispose();\n\t\t}\n\n\t\t// hooks\n\t\tthis._post_create_params_hook_names = undefined;\n\t\tthis._post_create_params_hooks = undefined;\n\t\tthis._on_scene_load_hooks = undefined;\n\t\tthis._on_scene_load_hook_names = undefined;\n\t}\n\n\tprivate initDependencyNode() {\n\t\tif (!this._params_node) {\n\t\t\t// TODO: consider not having a params_node for nodes which have no parameters\n\t\t\tthis._params_node = new CoreGraphNode(this.node.scene(), NODE_SIMPLE_NAME);\n\t\t\t// this._params_node.setScene(this.node.scene);\n\t\t\tthis.node.addGraphInput(this._params_node, false);\n\t\t}\n\t}\n\n\tinit() {\n\t\tthis.initDependencyNode();\n\t\t// this.reset_params()\n\t\tthis._param_create_mode = true;\n\n\t\tthis._initFromParamsConfig();\n\t\tthis.node.createParams();\n\t\tthis._postCreateParams();\n\t}\n\tprivate _postCreateParams() {\n\t\tthis._updateCaches();\n\t\t// this._create_params_ui_data_dependencies();\n\t\tthis._initParamAccessors();\n\t\tthis._param_create_mode = false;\n\t\tthis._params_created = true;\n\n\t\tthis._runPostCreateParamsHooks();\n\n\t\t// This was to debug a weird bug where I was adding nodes to the list\n\t\t// of params, from the DependenciesController\n\t\t// this._params_list.push = (...items: BaseParamType[]) => {\n\t\t// \tif (items[0] && !items[0].compute) {\n\t\t// \t\tPoly.warn('adding params', items);\n\t\t// \t}\n\t\t// \tfor (let i of items) {\n\t\t// \t\tthis._params_list[this._params_list.length] = i;\n\t\t// \t}\n\t\t// \treturn 0;\n\t\t// };\n\t}\n\tpostCreateSpareParams() {\n\t\tthis._updateCaches();\n\t\tthis._initParamAccessors();\n\t\t// param.emit(ParamEvent.DELETED);\n\t\tthis.node.scene().referencesController.notifyParamsUpdated(this.node);\n\t\tthis.node.emit(NodeEvent.PARAMS_UPDATED);\n\t}\n\tupdateParams(options: ParamsUpdateOptions) {\n\t\tlet hasCreatedAParam = false;\n\t\tlet hasDeletedAParam = false;\n\t\tconst addedParams: BaseParamType[] = [];\n\t\tif (options.namesToDelete) {\n\t\t\tfor (const param_name of options.namesToDelete) {\n\t\t\t\tif (this.has(param_name)) {\n\t\t\t\t\tthis._deleteParam(param_name);\n\t\t\t\t\thasDeletedAParam = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (options.toAdd) {\n\t\t\tfor (const paramData of options.toAdd) {\n\t\t\t\tconst param = this.addParam(paramData.type, paramData.name, paramData.initValue, paramData.options);\n\t\t\t\tif (param) {\n\t\t\t\t\tif (paramData.rawInput != null) {\n\t\t\t\t\t\tparam.set(paramData.rawInput as never);\n\t\t\t\t\t}\n\t\t\t\t\thasCreatedAParam = true;\n\t\t\t\t\taddedParams.push(param);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDeletedAParam || hasCreatedAParam) {\n\t\t\tthis.postCreateSpareParams();\n\t\t}\n\t\tfor (const param of addedParams) {\n\t\t\tthis.node.scene().missingExpressionReferencesController.checkForMissingParamReferences(param);\n\t\t}\n\t}\n\n\tprivate _initFromParamsConfig() {\n\t\tconst paramsConfig = this.node.paramsConfig as PolyDictionary<ParamTemplate<ParamType>>;\n\t\tlet init_values_used = false;\n\t\tif (paramsConfig) {\n\t\t\tconst paramsInitValueOverrides = this.node.createOptions?.paramsInitValueOverrides;\n\t\t\tconst names = Object.keys(paramsConfig);\n\t\t\tfor (const name of names) {\n\t\t\t\tconst config = paramsConfig[name];\n\t\t\t\tlet init_value: ParamInitData<ParamType> | undefined;\n\t\t\t\tif (paramsInitValueOverrides) {\n\t\t\t\t\tinit_value = paramsInitValueOverrides[name];\n\t\t\t\t\tinit_values_used = true;\n\t\t\t\t}\n\t\t\t\tthis.addParam(config.type, name, config.init_value, config.options, init_value);\n\t\t\t}\n\t\t}\n\t\t// this set dirty may not be necessary, but when starting a scene with a spotlight\n\t\t// with a non default t (ie: [2,2,0]), it would not be positionned correctly and would require\n\t\t// a cook\n\t\tif (init_values_used) {\n\t\t\tthis.node.setDirty();\n\t\t}\n\t\tif (this.node.createOptions) {\n\t\t\tthis.node.createOptions.paramsInitValueOverrides = undefined;\n\t\t}\n\t}\n\tprivate _initParamAccessors() {\n\t\tlet currentNamesInAccessor = Object.getOwnPropertyNames(this.node.pv);\n\t\tthis._removeUnneededAccessors(currentNamesInAccessor);\n\t\t// update var after having removed accessors\n\t\tcurrentNamesInAccessor = Object.getOwnPropertyNames(this.node.pv);\n\t\tconst all = this.all;\n\t\tfor (const param of all) {\n\t\t\tconst isSpare: boolean = param.options.isSpare();\n\n\t\t\tconst paramNotYetInAccessors = !currentNamesInAccessor.includes(param.name());\n\n\t\t\ttry {\n\t\t\t\t// this currently fails\n\t\t\t\t// when copy/pasting the js/getObjectAttribute node\n\t\t\t\tif (paramNotYetInAccessors || isSpare) {\n\t\t\t\t\tObject.defineProperty(this.node.pv, param.name(), {\n\t\t\t\t\t\tget: () => {\n\t\t\t\t\t\t\treturn param.value;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// only spare parameters can be removed\n\t\t\t\t\t\tconfigurable: isSpare,\n\t\t\t\t\t});\n\t\t\t\t\tObject.defineProperty(this.node.p, param.name(), {\n\t\t\t\t\t\tget: () => {\n\t\t\t\t\t\t\treturn param;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tconfigurable: isSpare,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (err) {}\n\t\t}\n\t}\n\tprivate _removeUnneededAccessors(current_names_in_accessor: string[]) {\n\t\tconst current_param_names = this._paramNames;\n\t\tconst names_to_remove = [];\n\t\tfor (const current_name_in_accessor of current_names_in_accessor) {\n\t\t\tif (!current_param_names.includes(current_name_in_accessor)) {\n\t\t\t\tnames_to_remove.push(current_name_in_accessor);\n\t\t\t}\n\t\t}\n\n\t\tfor (const name_to_remove of names_to_remove) {\n\t\t\tObject.defineProperty(this.node.pv, name_to_remove, {\n\t\t\t\tget: () => {\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t\tObject.defineProperty(this.node.p, name_to_remove, {\n\t\t\t\tget: () => {\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t}\n\t}\n\n\tget params_node() {\n\t\treturn this._params_node;\n\t}\n\tget all() {\n\t\treturn this._paramsList;\n\t}\n\tget non_spare() {\n\t\treturn this._non_spare_params;\n\t}\n\tget spare() {\n\t\treturn this._spare_params;\n\t}\n\tget names(): string[] {\n\t\treturn this._paramNames;\n\t}\n\tget non_spare_names(): string[] {\n\t\treturn this._non_spare_param_names;\n\t}\n\tget spare_names(): string[] {\n\t\treturn this._spare_param_names;\n\t}\n\n\tprivate set_with_type<T extends ParamType>(paramName: string, value: ParamInitValuesTypeMap[T], type: T) {\n\t\tconst param = this.paramWithType(paramName, type);\n\t\tif (param) {\n\t\t\tparam.set(value as never);\n\t\t} else {\n\t\t\tPoly.warn(`param ${paramName} not found with type ${type}`);\n\t\t}\n\t}\n\tset_float(paramName: string, value: ParamInitValuesTypeMap[ParamType.FLOAT]) {\n\t\tthis.set_with_type(paramName, value, ParamType.FLOAT);\n\t}\n\tset_vector3(paramName: string, value: ParamInitValuesTypeMap[ParamType.VECTOR3]) {\n\t\tthis.set_with_type(paramName, value, ParamType.VECTOR3);\n\t}\n\n\thas_param(paramName: string) {\n\t\treturn this._paramsByName.has(paramName);\n\t}\n\thas(paramName: string) {\n\t\treturn this.has_param(paramName);\n\t}\n\tget(paramName: string) {\n\t\treturn this.param(paramName);\n\t}\n\tparamWithType<T extends ParamType>(param_name: string, type: T): ParamConstructorMap[T] | undefined {\n\t\tconst param = this.param(param_name);\n\t\tif (param && param.type() == type) {\n\t\t\treturn param as ParamConstructorMap[T];\n\t\t}\n\t}\n\tgetFloat(param_name: string): FloatParam {\n\t\treturn this.paramWithType(param_name, ParamType.FLOAT) as FloatParam;\n\t}\n\t// get_operator_path(param_name: string): OperatorPathParam {\n\t// \treturn this.paramWithType(param_name, ParamType.OPERATOR_PATH) as OperatorPathParam;\n\t// }\n\tvalue(paramName: string) {\n\t\treturn this.param(paramName)?.value;\n\t}\n\tvalueWithType<T extends ParamType>(paramName: string, type: T): ParamValuesTypeMap[T] {\n\t\treturn this.paramWithType(paramName, type)?.value as ParamValuesTypeMap[T];\n\t\t// const param = this.param(name);\n\t\t// if (param && param.type() == type) {\n\t\t// \treturn param.value();\n\t\t// }\n\t}\n\tboolean(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.BOOLEAN);\n\t}\n\tfloat(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.FLOAT);\n\t}\n\tinteger(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.INTEGER);\n\t}\n\tstring(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.STRING);\n\t}\n\tvector2(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.VECTOR2);\n\t}\n\tvector3(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.VECTOR3);\n\t}\n\tcolor(paramName: string) {\n\t\treturn this.valueWithType(paramName, ParamType.COLOR);\n\t}\n\n\tparam(paramName: string) {\n\t\tconst p = this._paramsByName.get(paramName);\n\t\tif (p != null) {\n\t\t\treturn p;\n\t\t} else {\n\t\t\tPoly.warn(\n\t\t\t\t`tried to access param '${paramName}' in node ${this.node.path()}, but existing params are: ${\n\t\t\t\t\tthis.names\n\t\t\t\t} on node ${this.node.path()}`\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\t// param_cache_name(param_name: string) {\n\t// \treturn `_param_${param_name}`;\n\t// }\n\n\t// delete_params(param_names: string[]) {\n\t// \tfor (let param_name of param_names) {\n\t// \t\tthis.delete_param(param_name);\n\t// \t}\n\n\t// }\n\t// call update_params instead\n\tprivate _deleteParam(paramName: string) {\n\t\tconst param = this._paramsByName.get(paramName);\n\t\tif (param) {\n\t\t\tif (this._params_node) {\n\t\t\t\tthis._params_node.removeGraphInput(param);\n\t\t\t}\n\t\t\tparam._setupNodeDependencies(null);\n\t\t\tthis._paramsByName.delete(paramName);\n\t\t\tif (param.isMultiple() && param.components) {\n\t\t\t\tfor (const component of param.components) {\n\t\t\t\t\tconst childName = component.name();\n\t\t\t\t\tthis._paramsByName.delete(childName);\n\t\t\t\t}\n\t\t\t}\n\t\t\tparam.dispose();\n\t\t\tparam.scene().graphNodesController.notifyParamPathChanged(param);\n\n\t\t\t// const name_index = this._param_names.indexOf(param_name)\n\t\t\t// if(name_index >= 0){\n\t\t\t// \tthis._param_names.splice(name_index, 1)\n\t\t\t// }\n\t\t\t// param.emit(ParamEvent.DELETED);\n\t\t} else {\n\t\t\tthrow new Error(`param '${paramName}' does not exist on node ${this.node.path()}`);\n\t\t}\n\t}\n\n\taddParam<T extends ParamType>(\n\t\ttype: T,\n\t\tparamName: string,\n\t\tdefaultValue: ParamInitValuesTypeMap[T],\n\t\toptions: ParamOptions = {},\n\t\tinitData?: ParamInitData<T>\n\t): ParamConstructorMap[T] | undefined {\n\t\tconst isSpare = options['spare'] || false;\n\t\tif (this._param_create_mode === false && !isSpare) {\n\t\t\tPoly.warn(\n\t\t\t\t`node ${this.node.path()} (${this.node.type()}) param '${paramName}' cannot be created outside of createParams`\n\t\t\t);\n\t\t}\n\t\tif (this.node.scene() == null) {\n\t\t\tPoly.warn(`node ${this.node.path()} (${this.node.type()}) has no scene assigned`);\n\t\t}\n\n\t\tconst constructor = ParamConstructorByType[type];\n\t\tif (constructor != null) {\n\t\t\tconst existing_param = this._paramsByName.get(paramName);\n\t\t\tif (existing_param) {\n\t\t\t\tif (isSpare) {\n\t\t\t\t\t// delete the old one, otherwise the gl nodes when saved will attempt to set the value\n\t\t\t\t\t// of a param with the potentially wrong type\n\t\t\t\t\tif (existing_param.type() != type) {\n\t\t\t\t\t\tthis._deleteParam(existing_param.name());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// check that the param is spare, so that the ones generated by gl nodes are not generating an exception\n\t\t\t\t\tPoly.warn(`a param named ${paramName} already exists`, this.node);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst param: ParamConstructorMap[T] = new constructor(this.node.scene(), this.node, {\n\t\t\t\tserializerClass: this.node.scene().paramSerializerClass(),\n\t\t\t});\n\t\t\tparam.options.set(options);\n\n\t\t\tparam.setName(paramName);\n\t\t\tparam.setInitValue(defaultValue as never);\n\t\t\tparam.initComponents();\n\n\t\t\t// set param value\n\t\t\t// and overriden options\n\t\t\tif (initData == null) {\n\t\t\t\tparam.set(defaultValue as never);\n\t\t\t} else {\n\t\t\t\t// If is_expression_for_entities is true, we need to call param.set with default_value first, such as for attribCreate.\n\t\t\t\t// Otherwise, as it would fail if the attribute was a vector\n\t\t\t\t// since that attribute would have .value equal to {x: undefined, y: undefined, z:undefined}\n\t\t\t\tif (param.options.isExpressionForEntities()) {\n\t\t\t\t\tparam.set(defaultValue as never);\n\t\t\t\t}\n\n\t\t\t\tif (initData.raw_input != null) {\n\t\t\t\t\tparam.set(initData.raw_input as never);\n\t\t\t\t} else {\n\t\t\t\t\tif (initData.simple_data != null) {\n\t\t\t\t\t\tparam.set(initData.simple_data as never);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (initData.complex_data != null) {\n\t\t\t\t\t\t\tconst raw_input = initData.complex_data.raw_input;\n\t\t\t\t\t\t\tif (raw_input) {\n\t\t\t\t\t\t\t\tparam.set(raw_input as never);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tparam.set(defaultValue as never);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst overriden_options = initData.complex_data.overriden_options;\n\t\t\t\t\t\t\tif (overriden_options != null) {\n\t\t\t\t\t\t\t\tconst keys = Object.keys(overriden_options);\n\t\t\t\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\t\t\t\tparam.options.setOption(key as keyof ParamOptions, overriden_options[key]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tparam.postOptionsInitialize();\n\t\t\tparam._setupNodeDependencies(this.node);\n\n\t\t\tthis._paramsByName.set(param.name(), param as BaseParamType);\n\n\t\t\t// we add the components, so that we can access them with expressions like ch('ty')\n\t\t\tif (param.isMultiple() && param.components) {\n\t\t\t\tfor (const component of param.components) {\n\t\t\t\t\tthis._paramsByName.set(component.name(), component as BaseParamType);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._params_added_since_last_params_eval = true;\n\n\t\t\tparam.scene().graphNodesController.notifyParamPathChanged(param);\n\t\t\treturn param;\n\t\t}\n\t}\n\n\tprivate _updateCaches() {\n\t\tthis._paramsList.splice(0, this._paramsList.length);\n\t\tthis._paramsByName.forEach((param) => {\n\t\t\tthis._paramsList.push(param);\n\t\t});\n\t\tthis._paramNames = this._paramsList.map((param) => param.name());\n\t\tthis._non_spare_params = this._paramsList.filter((p) => !p.options.isSpare());\n\t\tthis._spare_params = this._paramsList.filter((p) => p.options.isSpare());\n\t\tthis._non_spare_param_names = this._non_spare_params.map((p) => p.name());\n\t\tthis._spare_param_names = this._spare_params.map((p) => p.name());\n\t}\n\n\tasync _evalParam(param: BaseParamType) {\n\t\tif (param.isDirty()) {\n\t\t\tawait param.compute();\n\t\t\tif (param.states.error.active() && param.disposed() == false) {\n\t\t\t\tthis.node.states.error.set(`param '${param.name()}' error: ${param.states.error.message()}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _promises: Promise<void>[] = [];\n\tasync evalParams(params: BaseParamType[]) {\n\t\tlet dirtyParamsCount = 0;\n\t\tfor (const param of params) {\n\t\t\tif (param.isDirty()) {\n\t\t\t\tdirtyParamsCount += 1;\n\t\t\t}\n\t\t}\n\t\tthis._promises.length = dirtyParamsCount;\n\t\tlet i = 0;\n\t\tfor (const param of params) {\n\t\t\tif (param.isDirty()) {\n\t\t\t\tthis._promises[i] = this._evalParam(param);\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\n\t\tawait Promise.all(this._promises);\n\n\t\tif (this.node.states.error.active()) {\n\t\t\tthis.node._setContainer(null);\n\t\t}\n\t}\n\n\tparamsEvalRequired(): boolean {\n\t\treturn this._params_node != null && (this._params_node.isDirty() || this._params_added_since_last_params_eval);\n\t}\n\tasync evalAll() {\n\t\tif (this.paramsEvalRequired()) {\n\t\t\tawait this.evalParams(this._paramsList);\n\n\t\t\tthis._params_node?.removeDirtyState();\n\t\t\tthis._params_added_since_last_params_eval = false;\n\t\t}\n\t}\n\n\t//\n\t//\n\t// HOOKS\n\t//\n\t//\n\tonParamsCreated(hook_name: string, hook: PostCreateParamsHook) {\n\t\tif (this._params_created) {\n\t\t\thook();\n\t\t} else {\n\t\t\tif (this._post_create_params_hook_names && this._post_create_params_hook_names.includes(hook_name)) {\n\t\t\t\tPoly.error(`hook name ${hook_name} already exists`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._post_create_params_hook_names = this._post_create_params_hook_names || [];\n\t\t\tthis._post_create_params_hook_names.push(hook_name);\n\t\t\tthis._post_create_params_hooks = this._post_create_params_hooks || [];\n\t\t\tthis._post_create_params_hooks.push(hook);\n\t\t}\n\t}\n\taddOnSceneLoadHook(param_name: string, method: OnSceneLoadHook) {\n\t\tthis._on_scene_load_hook_names = this._on_scene_load_hook_names || [];\n\t\tthis._on_scene_load_hooks = this._on_scene_load_hooks || [];\n\n\t\tif (!this._on_scene_load_hook_names.includes(param_name)) {\n\t\t\tthis._on_scene_load_hook_names.push(param_name);\n\t\t\tthis._on_scene_load_hooks.push(method);\n\t\t} else {\n\t\t\tPoly.warn(`hook with name ${param_name} already exists`, this.node);\n\t\t}\n\t}\n\tprivate _runPostCreateParamsHooks() {\n\t\tif (this._post_create_params_hooks) {\n\t\t\tfor (const hook of this._post_create_params_hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n\trunOnSceneLoadHooks() {\n\t\tif (this._on_scene_load_hooks) {\n\t\t\tfor (const hook of this._on_scene_load_hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n}\n","import {NodeParamsConfig} from './ParamsConfig';\n// import {ParamValuesTypeMap} from './ParamsController';\n// import {ParamType} from '../../../poly/ParamType';\n\n// function getProperty<T, K extends keyof T>(o: T, propertyName: K): T[K] {\n// \treturn o[propertyName]; // o[propertyName] is of type T[K]\n// }\n\n// let t: getProperty(ParamConfig, 'type')\n// function prop<T, K extends keyof T>(obj: T, key: K) {\n// \treturn typeof obj[key];\n// }\n// type test = Pick<ParamConfig<ParamType.FLOAT>, 'default_value'>;\n\nexport type ParamsValueAccessorType<T extends NodeParamsConfig> = {\n\treadonly // @ts-ignore\n\t[P in keyof T]: T[P]['value_type'];\n};\n\nexport class ParamsValueAccessor<T extends NodeParamsConfig> {\n\tconstructor() {\n\t\t// console.log('accessor', this);\n\t}\n}\n","import {NodeContext} from '../../../../poly/NodeContext';\nimport {InputCloneMode} from '../../../../poly/InputCloneMode';\nimport {NodeInputsController} from '../InputsController';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {NodeEvent} from '../../../../poly/NodeEvent';\nimport {TypedNode} from '../../../_Base';\nimport {isArray} from '../../../../../core/Type';\n\nexport class ClonedStatesController<NC extends NodeContext> {\n\t// private _user_inputs_clonable_states: InputCloneMode[] | undefined;\n\tprivate _clonedStates: InputCloneMode[] | undefined;\n\tprivate _clonedState: InputCloneMode | undefined;\n\tprivate _cloneRequiredStates: boolean[] = [];\n\t// private _cloneRequiredStatesMap: Map<number, boolean> = new Map();\n\tprivate _overridden: boolean = false;\n\n\tprivate node: TypedNode<NC, any>;\n\tconstructor(private inputsController: NodeInputsController<NC>) {\n\t\tthis.node = inputsController.node;\n\t}\n\tinitInputsClonedState(states: InputCloneMode | InputCloneMode[]) {\n\t\t// if (values) {\n\t\t// \tthis._user_inputs_clonable_states = values;\n\t\t// }\n\t\tif (isArray(states)) {\n\t\t\tthis._clonedStates = states; //this._user_inputs_clonable_states || this._default_inputs_clonale_state_values();\n\t\t} else {\n\t\t\tthis._clonedState = states;\n\t\t}\n\n\t\tthis.updateCloneRequiredState();\n\t}\n\n\toverrideClonedStateAllowed() {\n\t\tif (this._clonedStates) {\n\t\t\tfor (const state of this._clonedStates) {\n\t\t\t\tif (state == InputCloneMode.FROM_NODE) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this._clonedState) {\n\t\t\treturn this._clonedState == InputCloneMode.FROM_NODE;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// private get inputs_clonable_state(): InputCloneMode[] {\n\t// \treturn (this._inputs_clonable_states = this._inputs_clonable_states || this.init_inputs_clonable_state());\n\t// }\n\tcloneRequiredState(index: number): boolean | undefined {\n\t\tconst result = this._cloneRequiredStates[index]; //this._cloneRequiredStatesMap.get(index);\n\t\t// TODO: rework this and test with sop/merge\n\t\t// if (result == null) {\n\t\t// \t// If we do not have a value for index,\n\t\t// \t// we can use the last of the array.\n\t\t// \t// This is useful for sop/merge\n\t\t// \tconsole.log(this._cloneRequiredStates, this._cloneRequiredStates[this._cloneRequiredStates.length - 1]);\n\t\t// \treturn this._cloneRequiredStates[this._cloneRequiredStates.length - 1];\n\t\t// }\n\t\treturn result;\n\t}\n\tcloneRequiredStates(): boolean[] {\n\t\treturn this._cloneRequiredStates;\n\t}\n\t// inputs_clonable_state_with_override(): boolean[] {\n\t// \t// const list = [];\n\t// \t// const states = this.inputs_clonable_state();\n\t// \t// for (let i = 0; i < states.length; i++) {\n\t// \t// \tlist.push(this.input_clonable_state_with_override(i));\n\t// \t// }\n\t// \t// return list;\n\t// \treturn this._inputs_cloned_state;\n\t// }\n\tprivate _getCloneRequiredState(index: number): boolean {\n\t\tconst states = this._clonedStates;\n\t\tif (states) {\n\t\t\tconst state = states[index];\n\t\t\tif (state != null) {\n\t\t\t\treturn this._cloneRequiredFromState(state);\n\t\t\t}\n\t\t}\n\t\tif (this._clonedState) {\n\t\t\treturn this._cloneRequiredFromState(this._clonedState);\n\t\t}\n\t\treturn true;\n\t}\n\tprivate _cloneRequiredFromState(state: InputCloneMode) {\n\t\tswitch (state) {\n\t\t\tcase InputCloneMode.ALWAYS:\n\t\t\t\treturn true;\n\t\t\tcase InputCloneMode.NEVER:\n\t\t\t\treturn false;\n\t\t\tcase InputCloneMode.FROM_NODE:\n\t\t\t\treturn !this._overridden;\n\t\t}\n\t\treturn TypeAssert.unreachable(state);\n\t}\n\n\t// private _default_inputs_clonale_state_values() {\n\t// \tconst list = [];\n\t// \tfor (let i = 0; i < this.inputs_controller.max_inputs_count; i++) {\n\t// \t\tlist.push(InputCloneMode.ALWAYS);\n\t// \t}\n\t// \treturn list;\n\t// }\n\n\toverrideClonedState(state: boolean) {\n\t\tthis._overridden = state;\n\t\tthis.updateCloneRequiredState();\n\t}\n\toverriden() {\n\t\treturn this._overridden;\n\t}\n\tupdateCloneRequiredState() {\n\t\tif (this._clonedStates) {\n\t\t\tconst states: boolean[] = [];\n\t\t\tfor (let i = 0; i < this._clonedStates.length; i++) {\n\t\t\t\tstates[i] = this._getCloneRequiredState(i);\n\t\t\t}\n\t\t\tthis._cloneRequiredStates = states;\n\t\t} else {\n\t\t\tif (this._clonedState) {\n\t\t\t\tconst max_inputs = this.inputsController.maxInputsCount();\n\t\t\t\tconst states: boolean[] = [];\n\t\t\t\tfor (let i = 0; i < max_inputs; i++) {\n\t\t\t\t\tstates[i] = this._getCloneRequiredState(i);\n\t\t\t\t}\n\t\t\t\tthis._cloneRequiredStates = states;\n\t\t\t}\n\t\t}\n\t\t// no need to trigger updates\n\t\t// if the node is not in the hierarchy\n\t\tif (this.node.parent()) {\n\t\t\tthis.node.emit(NodeEvent.OVERRIDE_CLONABLE_STATE_UPDATE);\n\t\t\tthis.node.setDirty();\n\t\t}\n\t\t// update map\n\t\t// this._cloneRequiredStatesMap.clear();\n\t\t// if (this._cloneRequiredStates) {\n\t\t// \tfor (let i = 0; i < this._cloneRequiredStates.length; i++) {\n\t\t// \t\tthis._cloneRequiredStatesMap.set(i, this._cloneRequiredStates[i]);\n\t\t// \t}\n\t\t// }\n\t}\n}\n","import {TypedNodeConnection} from './NodeConnection';\nimport {CoreGraphNode} from '../../../../core/graph/CoreGraphNode';\nimport {NodeEvent} from '../../../poly/NodeEvent';\nimport {BaseNodeByContextMap, NodeContext} from '../../../poly/NodeContext';\nimport {ConnectionPointTypeMap} from './connections/ConnectionMap';\nimport {TypedNode} from '../../_Base';\nimport {ContainerMap} from '../../../containers/utils/ContainerMap';\nimport {ClonedStatesController} from './utils/ClonedStatesController';\nimport {InputCloneMode} from '../../../poly/InputCloneMode';\nimport {BaseConnectionPoint} from './connections/_Base';\nimport {isString} from '../../../../core/Type';\nimport {arrayShallowClone} from '../../../../core/ArrayUtils';\n\ntype OnUpdateHook = () => void;\ntype OnEvalSingleInputListen = () => Promise<void>;\nconst _existingInputIndices: number[] = [];\nexport interface SetInputsOptions {\n\tnoExceptionOnInvalidInput?: boolean;\n\tignoreLockedState?: boolean;\n}\n\nconst MAX_INPUTS_COUNT_UNSET = 0;\nexport class NodeInputsController<NC extends NodeContext> {\n\tprivate _graphNode: CoreGraphNode | undefined;\n\tprivate _graphNodeInputs: CoreGraphNode[] = [];\n\tprivate _inputs: Array<BaseNodeByContextMap[NC] | null> = [];\n\tprivate _has_named_inputs: boolean = false;\n\tprivate _named_input_connection_points: ConnectionPointTypeMap[NC][] | undefined;\n\tprivate _minInputsCount: number = 0;\n\tprivate _maxInputsCount: number = MAX_INPUTS_COUNT_UNSET;\n\tprivate _maxInputsCountOnInput: number = MAX_INPUTS_COUNT_UNSET;\n\tprivate _depends_on_inputs: boolean = true;\n\n\t// hooks\n\tprivate _on_update_hooks: OnUpdateHook[] | undefined;\n\tprivate _on_update_hook_names: string[] | undefined;\n\n\t// clonable\n\n\tdispose() {\n\t\tif (this._graphNode) {\n\t\t\tthis._graphNode.dispose();\n\t\t}\n\t\tfor (const graph_node of this._graphNodeInputs) {\n\t\t\tif (graph_node) {\n\t\t\t\tgraph_node.dispose();\n\t\t\t}\n\t\t}\n\t\t// hooks\n\t\tthis._on_update_hooks = undefined;\n\t\tthis._on_update_hook_names = undefined;\n\t}\n\n\t// private _user_inputs_clonable_states: InputCloneMode[] | undefined;\n\t// private _inputs_clonable_states: InputCloneMode[] | undefined;\n\t// private _inputs_cloned_state: boolean[] = [];\n\t// private _override_clonable_state: boolean = false;\n\n\tconstructor(public node: TypedNode<NC, any>) {}\n\n\tsetDependsOnInputs(depends_on_inputs: boolean) {\n\t\tthis._depends_on_inputs = depends_on_inputs;\n\t}\n\tprivate setMinCount(minInputsCount: number) {\n\t\tthis._minInputsCount = minInputsCount;\n\t}\n\tminCount() {\n\t\treturn this._minInputsCount;\n\t}\n\n\tprivate setMaxCount(maxInputsCount: number) {\n\t\tif (this._maxInputsCount == MAX_INPUTS_COUNT_UNSET) {\n\t\t\tthis._maxInputsCountOnInput = maxInputsCount;\n\t\t}\n\t\tthis._maxInputsCount = maxInputsCount;\n\t\tthis._initGraphNodeInputs();\n\t\t// we need to update the cloneRequiredState here,\n\t\t// in case the inputsCount changes\n\t\tthis._updateCloneRequiredState();\n\t}\n\tprivate _singleInputIndexListenedTo: number | null = null;\n\tlistenToSingleInputIndex(index: number) {\n\t\tthis._singleInputIndexListenedTo = index;\n\t}\n\tprivate _onEnsureListenToSingleInputIndexUpdatedCallback: OnEvalSingleInputListen | undefined;\n\tonEnsureListenToSingleInputIndexUpdated(callback: OnEvalSingleInputListen) {\n\t\tthis._onEnsureListenToSingleInputIndexUpdatedCallback = callback;\n\t}\n\n\tnamedInputConnectionPointsByName(name: string): ConnectionPointTypeMap[NC] | undefined {\n\t\tif (this._named_input_connection_points) {\n\t\t\tfor (const connection_point of this._named_input_connection_points) {\n\t\t\t\tif (connection_point && connection_point.name() == name) {\n\t\t\t\t\treturn connection_point;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetNamedInputConnectionPoints(newConnectionPoints: ConnectionPointTypeMap[NC][]) {\n\t\tthis._has_named_inputs = true;\n\n\t\tconst connectionPointsToKeep =\n\t\t\tthis._named_input_connection_points?.filter((cp) => cp?.inNodeDefinition()) || [];\n\n\t\t// ensure names are unique\n\t\tconst allNewConnectionPoints: ConnectionPointTypeMap[NC][] = arrayShallowClone(connectionPointsToKeep);\n\t\tconst currentNames: Set<string> = new Set();\n\t\tfor (const connectionPointToKeep of connectionPointsToKeep) {\n\t\t\tif (connectionPointToKeep) {\n\t\t\t\tcurrentNames.add(connectionPointToKeep.name());\n\t\t\t}\n\t\t}\n\t\tfor (const newConnectionPoint of newConnectionPoints) {\n\t\t\tif (newConnectionPoint) {\n\t\t\t\tif (!currentNames.has(newConnectionPoint.name())) {\n\t\t\t\t\tcurrentNames.add(newConnectionPoint.name());\n\t\t\t\t\tallNewConnectionPoints.push(newConnectionPoint);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// disconnect if the number of inputs changes\n\t\tconst connections = this.node.io.connections.inputConnections();\n\t\tif (connections) {\n\t\t\tfor (const connection of connections) {\n\t\t\t\tif (connection) {\n\t\t\t\t\t// assume we only work with indices for now, not with connection point names\n\t\t\t\t\t// so we only need to check again the new max number of connection points.\n\t\t\t\t\tif (connection.inputIndex() >= allNewConnectionPoints.length) {\n\t\t\t\t\t\tconnection.disconnect({setInput: true, ignoreLockedState: true});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// update connections\n\t\tthis._named_input_connection_points = allNewConnectionPoints;\n\t\tthis.setMinCount(0);\n\t\tthis.setMaxCount(this._named_input_connection_points.length);\n\t\tthis._initGraphNodeInputs();\n\t\tthis.node.emit(NodeEvent.NAMED_INPUTS_UPDATED);\n\t}\n\t// private _has_connected_inputs() {\n\t// \tfor (let input of this._inputs) {\n\t// \t\tif (input != null) {\n\t// \t\t\treturn true;\n\t// \t\t}\n\t// \t}\n\t// \treturn false;\n\t// }\n\n\t// private _check_name_changed(connection_points: ConnectionPointTypeMap[NC][]) {\n\t// \tif (this._named_input_connection_points) {\n\t// \t\tif (this._named_input_connection_points.length != connection_points.length) {\n\t// \t\t\treturn true;\n\t// \t\t} else {\n\t// \t\t\tfor (let i = 0; i < this._named_input_connection_points.length; i++) {\n\t// \t\t\t\tif (this._named_input_connection_points[i]?.name != connection_points[i]?.name) {\n\t// \t\t\t\t\treturn true;\n\t// \t\t\t\t}\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \treturn false;\n\t// }\n\n\thasNamedInputs() {\n\t\treturn this._has_named_inputs;\n\t}\n\tnamedInputConnectionPoints(): ConnectionPointTypeMap[NC][] | undefined {\n\t\treturn this._named_input_connection_points;\n\t}\n\tprivate _initGraphNodeInputs() {\n\t\tfor (let i = 0; i < this._maxInputsCount; i++) {\n\t\t\tthis._graphNodeInputs[i] = this._graphNodeInputs[i] || this._createGraphNodeInput(i);\n\t\t}\n\t}\n\tprivate _createGraphNodeInput(index: number): CoreGraphNode {\n\t\tconst graphInputNode = new CoreGraphNode(this.node.scene(), `input_${index}`);\n\t\tthis.graphNode().addGraphInput(graphInputNode, false);\n\t\treturn graphInputNode;\n\t}\n\tgraphNode() {\n\t\treturn (this._graphNode = this._graphNode || this._createGraphNode());\n\t}\n\tprivate _createGraphNode() {\n\t\tconst graphNode = new CoreGraphNode(this.node.scene(), 'inputs');\n\t\tthis.node.addGraphInput(graphNode, false);\n\t\treturn graphNode;\n\t}\n\n\tmaxInputsCount(): number {\n\t\treturn this._maxInputsCount || 0;\n\t}\n\tmaxInputsCountOverriden(): boolean {\n\t\treturn this._maxInputsCount != this._maxInputsCountOnInput;\n\t}\n\tinputGraphNode(input_index: number): CoreGraphNode {\n\t\treturn this._graphNodeInputs[input_index];\n\t}\n\n\tsetCount(min: number, max?: number) {\n\t\tif (max == null) {\n\t\t\tmax = min;\n\t\t}\n\t\tthis.setMinCount(min);\n\t\tthis.setMaxCount(max);\n\n\t\t// this._clonable_states_controller.init_inputs_clonable_state();\n\t\tthis._initConnectionControllerInputs();\n\t}\n\tprivate _initConnectionControllerInputs() {\n\t\tthis.node.io.connections.initInputs();\n\t}\n\n\tisGraphNodeDirty() {\n\t\t// Update:\n\t\t// we cannot simply check if this._graphNode is dirty,\n\t\t// as with the following case:\n\t\t// a merge node has 2 nodes as input\n\t\t// both those nodes are set to dirty (without using the scene batching)\n\t\t// then\n\t\t// - the merge node with be set dirty a first time as the first input is made dirty.\n\t\t// - the merge node starts cooking\n\t\t// - the merge node is made dirty a second time\n\t\t// - the merge node completes its first cook, having only processed the new content of the first input\n\t\t// - when the merge node completes, it realises it needs to cook a second time, since it was made dirty after starting the cook\n\t\t// - but when it attempts to get the content of the second node, the .isAnyInputDirty returns false when it should return true\n\t\t// because this._graphNode is not dirty anymore\n\t\t// OR...\n\t\t// we can instead make sure that this._graphNode is only made un-dirty if all inputs are clean too.\n\n\t\treturn this._graphNode?.isDirty() || false;\n\t}\n\tprivate _isAnyInputDirty() {\n\t\t// let anyDirty=false\n\t\t// const inputNodes = this.inputs()\n\t\tfor (const input of this._inputs) {\n\t\t\tif (input && input.isDirty()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t\t// if (this._maxInputsCount > 0) {\n\t\t// \tfor (let i = 0; i < this._inputs.length; i++) {\n\t\t// \t\tif (this._inputs[i]?.isDirty()) {\n\t\t// \t\t\treturn true;\n\t\t// \t\t}\n\t\t// \t}\n\t\t// } else {\n\t\t// \treturn false;\n\t\t// }\n\t}\n\tcontainersWithoutEvaluation(target: Array<ContainerMap[NC] | null>) {\n\t\ttarget.length = 0;\n\t\tfor (let i = 0; i < this._inputs.length; i++) {\n\t\t\tconst inputNode = this._inputs[i];\n\t\t\tlet container: ContainerMap[NC] | null = null;\n\t\t\tif (inputNode) {\n\t\t\t\t// container = (await inputNode.compute()) as ContainerMap[NC];\n\t\t\t\t// we do not need a promise using await here,\n\t\t\t\t// as we know that the input node is not dirty\n\t\t\t\t// therefore we can simply request the container\n\t\t\t\t// and only check if it is bypassed or not\n\t\t\t\tcontainer = inputNode.containerController.containerUnlessBypassed() as ContainerMap[NC] | null;\n\t\t\t}\n\t\t\ttarget.push(container);\n\t\t}\n\t\treturn target;\n\t}\n\n\tprivate _existingInputIndices(target: number[]) {\n\t\ttarget.length = 0;\n\t\tif (this._maxInputsCount > 0) {\n\t\t\tfor (let i = 0; i < this._inputs.length; i++) {\n\t\t\t\tif (this._inputs[i]) {\n\t\t\t\t\ttarget.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t}\n\n\tasync evalRequiredInputs(\n\t\ttarget: Array<ContainerMap[NC] | null | undefined>\n\t): Promise<Array<ContainerMap[NC] | null | undefined>> {\n\t\ttarget.length = 0;\n\t\t// let containers: Array<ContainerMap[NC] | null | undefined> = [];\n\t\tif (this.node.disposed() == true) {\n\t\t\treturn target;\n\t\t}\n\t\tif (this._maxInputsCount > 0) {\n\t\t\tthis._existingInputIndices(_existingInputIndices);\n\t\t\tif (_existingInputIndices.length < this._minInputsCount) {\n\t\t\t\tthis.node.states.error.set('inputs are missing');\n\t\t\t} else {\n\t\t\t\tif (_existingInputIndices.length > 0) {\n\t\t\t\t\tif (this._onEnsureListenToSingleInputIndexUpdatedCallback) {\n\t\t\t\t\t\tawait this._onEnsureListenToSingleInputIndexUpdatedCallback();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._maxInputsCount == 1) {\n\t\t\t\t\t\tconst container = await this.evalRequiredInput(0);\n\t\t\t\t\t\ttarget.push(container as ContainerMap[NC]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst promises: Promise<ContainerMap[NC] | null>[] = [];\n\t\t\t\t\t\tif (this._singleInputIndexListenedTo != null) {\n\t\t\t\t\t\t\tpromises.push(\n\t\t\t\t\t\t\t\tthis.evalRequiredInput(this._singleInputIndexListenedTo) as Promise<ContainerMap[NC]>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lastExistingInputIndex = _existingInputIndices[_existingInputIndices.length - 1];\n\t\t\t\t\t\t\t// let input: BaseNodeByContextMap[NC] | null;\n\t\t\t\t\t\t\tfor (let i = 0; i < this._inputs.length; i++) {\n\t\t\t\t\t\t\t\tconst input = this._inputs[i];\n\t\t\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\t\t\t// I tried here to only use a promise for dirty inputs,\n\t\t\t\t\t\t\t\t\t// but that messes up with the order\n\t\t\t\t\t\t\t\t\t// if (input.isDirty()) {\n\t\t\t\t\t\t\t\t\t// \tcontainers.push(input.containerController.container as ContainerMap[NC]);\n\t\t\t\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t\t\t\tpromises.push(this.evalRequiredInput(i) as Promise<ContainerMap[NC]>);\n\t\t\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// we need to add an empty container,\n\t\t\t\t\t\t\t\t\t// for non connected inputs.\n\t\t\t\t\t\t\t\t\t// otherwise, if input 0 is not connected,\n\t\t\t\t\t\t\t\t\t// and input 1 is, then we get only 1 container\n\t\t\t\t\t\t\t\t\t// which appears to be from input 0\n\t\t\t\t\t\t\t\t\tif (i <= lastExistingInputIndex) {\n\t\t\t\t\t\t\t\t\t\tpromises.push(undefined as any);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst results = await Promise.all(promises);\n\t\t\t\t\t\tfor (const result of results) {\n\t\t\t\t\t\t\ttarget.push(result);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this._isAnyInputDirty()) {\n\t\t\t\t\t\tthis._graphNode?.removeDirtyState();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t}\n\n\tasync evalRequiredInput(inputIndex: number) {\n\t\tlet container: ContainerMap[NC] | undefined = undefined;\n\t\tconst inputNode = this.input(inputIndex);\n\t\t// if (input_node && !input_node.isDirty()) {\n\t\t// \tcontainer = input_node.containerController.container as ContainerMap[NC] | null;\n\t\t// } else {\n\t\t// \tcontainer = await this.node.containerController.requestInputContainer(input_index);\n\t\t// \tthis._graph_node_inputs[input_index].removeDirtyState();\n\t\t// }\n\t\tif (inputNode) {\n\t\t\tcontainer = (await inputNode.compute()) as ContainerMap[NC];\n\t\t\tthis._graphNodeInputs[inputIndex].removeDirtyState();\n\t\t}\n\n\t\t// we do not clone here, as we just check if a group is present\n\t\tif (container && container.coreContent()) {\n\t\t\t// return container;\n\t\t} else {\n\t\t\t// const input_node = this.input(input_index);\n\t\t\tif (inputNode) {\n\t\t\t\tconst inputErrorMessage = inputNode.states.error.message();\n\t\t\t\tif (inputErrorMessage && this.node.disposed() == false) {\n\t\t\t\t\tthis.node.states.error.set(`input ${inputIndex} is invalid (error: ${inputErrorMessage})`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn container;\n\t}\n\n\tgetNamedInputIndex(name: string): number {\n\t\tif (this._named_input_connection_points) {\n\t\t\tfor (let i = 0; i < this._named_input_connection_points.length; i++) {\n\t\t\t\tif (this._named_input_connection_points[i]?.name() == name) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\tgetInputIndex(input_index_or_name: number | string): number {\n\t\tif (isString(input_index_or_name)) {\n\t\t\tif (this.hasNamedInputs()) {\n\t\t\t\treturn this.getNamedInputIndex(input_index_or_name);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`node ${this.node.path()} has no named inputs`);\n\t\t\t}\n\t\t} else {\n\t\t\treturn input_index_or_name;\n\t\t}\n\t}\n\n\tsetInput(\n\t\tinputIndexOrName: number | string,\n\t\tnode: BaseNodeByContextMap[NC] | null,\n\t\toutputIndexOrName?: number | string,\n\t\toptions?: Readonly<SetInputsOptions>\n\t) {\n\t\tconst ignoreLockedState = options?.ignoreLockedState || false;\n\t\tif (ignoreLockedState == false && this.node.insideALockedParent()) {\n\t\t\tconst lockedParent = this.node.lockedParent();\n\t\t\tconsole.warn(\n\t\t\t\t`node '${this.node.path()}' cannot have its inputs changed, since it is inside '${\n\t\t\t\t\tlockedParent ? lockedParent.path() : ''\n\t\t\t\t}', which is locked`\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (outputIndexOrName == null) {\n\t\t\toutputIndexOrName = 0;\n\t\t}\n\t\tconst noExceptionOnInvalidInput = options?.noExceptionOnInvalidInput || false;\n\t\tconst inputIndex = this.getInputIndex(inputIndexOrName) || 0;\n\t\tif (inputIndex < 0) {\n\t\t\tconst message = `invalid input (${inputIndexOrName}) for node ${this.node.path()}`;\n\t\t\tif (!noExceptionOnInvalidInput) {\n\t\t\t\tconsole.warn(message);\n\t\t\t\tthrow new Error(message);\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet outputIndex = 0;\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\toutputIndex = node.io.outputs.getOutputIndex(outputIndexOrName);\n\t\t\t\tif (outputIndex == null || outputIndex < 0) {\n\t\t\t\t\tconst connection_points = node.io.outputs.namedOutputConnectionPoints() as\n\t\t\t\t\t\t| BaseConnectionPoint[]\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst names: string[] = connection_points ? connection_points.map((cp) => cp.name()) : [];\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`node ${node.path()} does not have an output named ${outputIndexOrName}. inputs are: ${names.join(\n\t\t\t\t\t\t\t', '\n\t\t\t\t\t\t)}`\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// check that parents exists and are the same\n\n\t\t\tconst nodeParent = node.parent();\n\t\t\tconst currentNodeParent = this.node.parent();\n\t\t\tif (!(nodeParent && currentNodeParent && nodeParent.graphNodeId() == currentNodeParent.graphNodeId())) {\n\t\t\t\tconsole.warn(`node ${node.path()} does not have the same parent as ${this.node.path()}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst graphInputNode = this._graphNodeInputs[inputIndex];\n\t\tif (graphInputNode == null) {\n\t\t\tconst message = `no input at index ${inputIndex} (name: ${inputIndexOrName}) for node '${this.node.name()}' at path '${this.node.path()}'`;\n\t\t\tconsole.warn(message);\n\t\t\tthrow new Error(message);\n\t\t}\n\n\t\tif (node && this.node.parent() != node.parent()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst oldInputNode = this._inputs[inputIndex];\n\t\tlet oldOutputIndex: number | null = null;\n\t\tlet oldConnection: TypedNodeConnection<NC> | undefined = undefined;\n\t\tif (this.node.io.connections) {\n\t\t\toldConnection = this.node.io.connections.inputConnection(inputIndex);\n\t\t}\n\t\tif (oldConnection) {\n\t\t\toldOutputIndex = oldConnection.outputIndex();\n\t\t}\n\n\t\tif (node !== oldInputNode || outputIndex != oldOutputIndex) {\n\t\t\t// TODO: test: add test to make sure this is necessary\n\t\t\tif (oldInputNode != null) {\n\t\t\t\tif (this._depends_on_inputs) {\n\t\t\t\t\tgraphInputNode.removeGraphInput(oldInputNode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node != null) {\n\t\t\t\tconst connectionResult = graphInputNode.addGraphInput(node);\n\t\t\t\tif (connectionResult) {\n\t\t\t\t\t// we do test if we can create the graph connection\n\t\t\t\t\t// to ensure we are not in a cyclical graph,\n\t\t\t\t\t// but we delete it right after\n\t\t\t\t\tif (!this._depends_on_inputs) {\n\t\t\t\t\t\tgraphInputNode.removeGraphInput(node);\n\t\t\t\t\t}\n\n\t\t\t\t\t// this._input_connections[input_index] = new NodeConnection(node, this.self, outputIndex, input_index);\n\t\t\t\t\tif (oldConnection) {\n\t\t\t\t\t\toldConnection.disconnect({setInput: false});\n\t\t\t\t\t}\n\t\t\t\t\tthis._inputs[inputIndex] = node;\n\t\t\t\t\tnew TypedNodeConnection<NC>(\n\t\t\t\t\t\t(<unknown>node) as TypedNode<NC, any>,\n\t\t\t\t\t\tthis.node,\n\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\tinputIndex\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`cannot connect ${node.path()} to ${this.node.path()}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._inputs[inputIndex] = null;\n\t\t\t\tif (oldConnection) {\n\t\t\t\t\toldConnection.disconnect({setInput: false});\n\t\t\t\t}\n\t\t\t\t// this._input_connections[input_index] = null;\n\t\t\t}\n\n\t\t\tthis._run_on_set_input_hooks();\n\t\t\tgraphInputNode.setSuccessorsDirty();\n\t\t\t// this.node.set_dirty(node);\n\t\t\tthis.node.emit(NodeEvent.INPUTS_UPDATED);\n\t\t}\n\t}\n\n\t// remove_input(node: BaseNodeByContextMap[NC]) {\n\t// \tconst inputs = this.inputs();\n\t// \tlet input: BaseNodeByContextMap[NC] | null;\n\t// \tfor (let i = 0; i < inputs.length; i++) {\n\t// \t\tinput = inputs[i];\n\t// \t\tif (input != null && node != null) {\n\t// \t\t\tif (input.graphNodeId() === node.graphNodeId()) {\n\t// \t\t\t\tthis.setInput(i, null);\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// }\n\n\tinput(input_index: number): BaseNodeByContextMap[NC] | null {\n\t\treturn this._inputs[input_index];\n\t}\n\tnamed_input(input_name: string): BaseNodeByContextMap[NC] | null {\n\t\tif (this.hasNamedInputs()) {\n\t\t\tconst input_index = this.getInputIndex(input_name);\n\t\t\treturn this._inputs[input_index];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\tnamed_input_connection_point(input_name: string): ConnectionPointTypeMap[NC] | undefined {\n\t\tif (this.hasNamedInputs() && this._named_input_connection_points) {\n\t\t\tconst input_index = this.getInputIndex(input_name);\n\t\t\treturn this._named_input_connection_points[input_index];\n\t\t}\n\t}\n\thas_named_input(name: string): boolean {\n\t\treturn this.getNamedInputIndex(name) >= 0;\n\t}\n\thasInput(input_index: number): boolean {\n\t\treturn this._inputs[input_index] != null;\n\t}\n\tinputs() {\n\t\treturn this._inputs;\n\t}\n\n\t//\n\t//\n\t// CLONABLE STATES\n\t//\n\t//\n\tprivate _clonedStatesController: ClonedStatesController<NC> | undefined;\n\tinitInputsClonedState(states: InputCloneMode | InputCloneMode[]) {\n\t\tif (!this._clonedStatesController) {\n\t\t\tthis._clonedStatesController = new ClonedStatesController(this);\n\t\t\tthis._clonedStatesController.initInputsClonedState(states);\n\t\t}\n\t}\n\toverrideClonedStateAllowed(): boolean {\n\t\treturn this._clonedStatesController?.overrideClonedStateAllowed() || false;\n\t}\n\toverrideClonedState(state: boolean) {\n\t\tthis._clonedStatesController?.overrideClonedState(state);\n\t}\n\tclonedStateOverriden() {\n\t\treturn this._clonedStatesController?.overriden() || false;\n\t}\n\tcloneRequired(index: number) {\n\t\tconst state = this._clonedStatesController?.cloneRequiredState(index);\n\t\tif (state != null) {\n\t\t\treturn state;\n\t\t}\n\t\treturn true;\n\t}\n\tcloneRequiredStates(): boolean | boolean[] {\n\t\tconst states = this._clonedStatesController?.cloneRequiredStates();\n\t\tif (states != null) {\n\t\t\treturn states;\n\t\t}\n\t\treturn true;\n\t}\n\tprivate _updateCloneRequiredState() {\n\t\tthis._clonedStatesController?.updateCloneRequiredState();\n\t}\n\n\t//\n\t//\n\t// HOOKS\n\t//\n\t//\n\tadd_on_set_input_hook(name: string, hook: OnUpdateHook) {\n\t\tthis._on_update_hooks = this._on_update_hooks || [];\n\t\tthis._on_update_hook_names = this._on_update_hook_names || [];\n\n\t\tif (!this._on_update_hook_names.includes(name)) {\n\t\t\tthis._on_update_hooks.push(hook);\n\t\t\tthis._on_update_hook_names.push(name);\n\t\t} else {\n\t\t\tconsole.warn(`hook with name ${name} already exists`, this.node);\n\t\t}\n\t}\n\tprivate _run_on_set_input_hooks() {\n\t\tif (this._on_update_hooks) {\n\t\t\tfor (const hook of this._on_update_hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n}\n","import {NodeEvent} from '../../../poly/NodeEvent';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {ConnectionPointTypeMap} from './connections/ConnectionMap';\nimport {TypedNode} from '../../_Base';\nimport {isNumber, isString} from '../../../../core/Type';\nimport {arrayUniq} from '../../../../core/ArrayUtils';\nimport {TypedNodeConnection} from './NodeConnection';\n\nconst _uniqOutputIndices: number[] = [];\nconst _usedOutputIndices: number[] = [];\n\nexport class OutputsController<NC extends NodeContext> {\n\tprivate _has_outputs: boolean = false;\n\tprivate _named_output_connection_points: ConnectionPointTypeMap[NC][] | undefined;\n\tprivate _has_named_outputs: boolean = false;\n\tprivate _connections: TypedNodeConnection<NC>[] = [];\n\n\tconstructor(private node: TypedNode<NC, any>) {\n\t\tthis.node.scene().timeController.onPlayingStateChange(this._onPlayingStateChangeBound);\n\t}\n\n\tprivate _onPlayingStateChangeBound = this._onPlayingStateChange.bind(this);\n\tprivate _onPlayingStateChange() {\n\t\tthis._clearCache();\n\t}\n\tprivate _outputIndexCache: Map<number | string, number> = new Map();\n\tprivate _clearCache() {\n\t\tthis._outputIndexCache.clear();\n\t}\n\n\tdispose() {\n\t\tthis.node.scene().timeController.removeOnPlayingStateChange(this._onPlayingStateChangeBound);\n\t\tif (this._named_output_connection_points) {\n\t\t\tthis._named_output_connection_points.splice(0, this._named_output_connection_points.length);\n\t\t}\n\t}\n\n\tsetHasOneOutput() {\n\t\tthis._has_outputs = true;\n\t}\n\tsetHasNoOutput() {\n\t\tthis._has_outputs = false;\n\t}\n\n\thasOutputs() {\n\t\treturn this._has_outputs;\n\t}\n\thasNamedOutputs() {\n\t\treturn this._has_named_outputs;\n\t}\n\thasNamedOutput(name: string): boolean {\n\t\treturn this.getNamedOutputIndex(name) >= 0;\n\t}\n\tnamedOutputConnectionPoints(): Readonly<ConnectionPointTypeMap[NC][]> | undefined {\n\t\treturn this._named_output_connection_points;\n\t}\n\tnamedOutputConnection(index: number): Readonly<ConnectionPointTypeMap[NC]> | undefined {\n\t\tif (this._named_output_connection_points) {\n\t\t\treturn this._named_output_connection_points[index];\n\t\t}\n\t}\n\n\tgetNamedOutputIndex(name: string): number {\n\t\tif (this._named_output_connection_points) {\n\t\t\tlet i = 0;\n\t\t\tfor (const connectionPoint of this._named_output_connection_points) {\n\t\t\t\tif (connectionPoint && connectionPoint.name() == name) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\tgetOutputIndex(output_index_or_name: number | string): number {\n\t\tlet currentCache = this._outputIndexCache.get(output_index_or_name);\n\t\tif (currentCache == null) {\n\t\t\tcurrentCache = this._getOutputIndex(output_index_or_name);\n\t\t\tthis._outputIndexCache.set(output_index_or_name, currentCache);\n\t\t}\n\t\treturn currentCache;\n\t}\n\tprivate _getOutputIndex(output_index_or_name: number | string): number {\n\t\tif (output_index_or_name != null) {\n\t\t\tif (isString(output_index_or_name)) {\n\t\t\t\tif (this.hasNamedOutputs()) {\n\t\t\t\t\treturn this.getNamedOutputIndex(output_index_or_name);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`node ${this.node.path()} has no named outputs`);\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn output_index_or_name;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tnamedOutputConnectionPointsByName(name: string): ConnectionPointTypeMap[NC] | undefined {\n\t\tif (this._named_output_connection_points) {\n\t\t\tfor (const connection_point of this._named_output_connection_points) {\n\t\t\t\tif (connection_point?.name() == name) {\n\t\t\t\t\treturn connection_point;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetNamedOutputConnectionPoints(connection_points: ConnectionPointTypeMap[NC][], set_dirty: boolean = true) {\n\t\tthis._has_named_outputs = true;\n\n\t\tthis.node.io.connections.outputConnections(this._connections);\n\t\tfor (const connection of this._connections) {\n\t\t\tif (connection) {\n\t\t\t\t// assume we only work with indices for now, not with connection point names\n\t\t\t\t// so we only need to check again the new max number of connection points.\n\t\t\t\tif (connection.outputIndex() >= connection_points.length) {\n\t\t\t\t\tconnection.disconnect({setInput: true});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// update connections\n\t\tthis._named_output_connection_points = connection_points;\n\t\tif (set_dirty && this.node.scene()) {\n\t\t\t// why do I need this set dirty here?\n\t\t\t// I currently have to have a flag to optionally prevent this,\n\t\t\t// for instance from gl nodes which have their outputs updated in a post dirty hook\n\t\t\tthis.node.setDirty(this.node);\n\t\t}\n\t\tthis.node.emit(NodeEvent.NAMED_OUTPUTS_UPDATED);\n\t}\n\tused_output_names(): string[] {\n\t\t// target.length = 0;\n\t\tconst target: string[] = [];\n\t\tconst connectionsController = this.node.io.connections;\n\t\tif (connectionsController) {\n\t\t\tconnectionsController.outputConnections(this._connections);\n\n\t\t\tarrayUniq(\n\t\t\t\tthis._connections.map((connection) => (connection ? connection.outputIndex() : null)),\n\t\t\t\t_uniqOutputIndices\n\t\t\t);\n\t\t\t// outputIndices = arrayUniq(output_indices);\n\t\t\t// const used_output_indices: number[] = [];\n\t\t\t_usedOutputIndices.length = 0;\n\t\t\tfor (const index of _uniqOutputIndices) {\n\t\t\t\tif (isNumber(index)) {\n\t\t\t\t\t_usedOutputIndices.push(index);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// const used_output_names: string[] = [];\n\t\t\tconst connectionPoints = this.namedOutputConnectionPoints();\n\t\t\tif (connectionPoints) {\n\t\t\t\tfor (const index of _usedOutputIndices) {\n\t\t\t\t\tconst name = connectionPoints[index]?.name();\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\ttarget.push(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t}\n}\n","import {TypedNodeConnection} from './NodeConnection';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\n\nexport class ConnectionsController<NC extends NodeContext> {\n\tprivate _inputConnections: Array<TypedNodeConnection<NC> | undefined> | undefined;\n\tprivate _outputConnections: Map<number, Map<number, TypedNodeConnection<NC>>> = new Map();\n\n\tconstructor(protected _node: TypedNode<NC, any>) {}\n\n\tinitInputs() {\n\t\tconst count = this._node.io.inputs.maxInputsCount();\n\t\tthis._inputConnections = this._inputConnections || new Array(count);\n\t\t// adjust the array if this method is called more than once\n\t\t// which can be the case for nodes that have adjustable input counts\n\t\t// such as sop/merge\n\t\twhile (this._inputConnections.length < count) {\n\t\t\tthis._inputConnections.push(undefined);\n\t\t}\n\t}\n\tdispose() {\n\t\tif (this._inputConnections) {\n\t\t\tthis._inputConnections.splice(0, this._inputConnections.length);\n\t\t}\n\t\tif (this._outputConnections) {\n\t\t\tthis._outputConnections.clear();\n\t\t}\n\t}\n\n\t//\n\t//\n\t// INPUT CONNECTIONS\n\t//\n\t//\n\taddInputConnection(connection: TypedNodeConnection<NC>) {\n\t\tif (this._inputConnections) {\n\t\t\t// if (connection.input_index < this._input_connections.length) {\n\t\t\tthis._inputConnections[connection.inputIndex()] = connection;\n\t\t\t// } else {\n\t\t\t// \tconsole.warn(`attempt to add an input connection at index ${connection.input_index}`);\n\t\t\t// }\n\t\t} else {\n\t\t\tconsole.warn(`input connections array not initialized`);\n\t\t}\n\t}\n\tremoveInputConnection(connection: TypedNodeConnection<NC>) {\n\t\tif (this._inputConnections) {\n\t\t\tif (connection.inputIndex() < this._inputConnections.length) {\n\t\t\t\tthis._inputConnections[connection.inputIndex()] = undefined;\n\t\t\t\t// if all connections after are also undefined, we can safely shrink the array\n\t\t\t\tlet all_connections_after_are_undefined = true;\n\t\t\t\tfor (let i = connection.inputIndex(); i < this._inputConnections.length; i++) {\n\t\t\t\t\tif (this._inputConnections[i]) {\n\t\t\t\t\t\tall_connections_after_are_undefined = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (all_connections_after_are_undefined) {\n\t\t\t\t\tthis._inputConnections = this._inputConnections.slice(0, connection.inputIndex());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.warn(`attempt to remove an input connection at index ${connection.inputIndex()}`);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(`input connections array not initialized`);\n\t\t}\n\t}\n\tinputConnection(index: number): TypedNodeConnection<NC> | undefined {\n\t\tif (this._inputConnections) {\n\t\t\treturn this._inputConnections[index];\n\t\t}\n\t}\n\tfirstInputConnection(): TypedNodeConnection<NC> | null {\n\t\tif (this._inputConnections) {\n\t\t\tfor (const connection of this._inputConnections) {\n\t\t\t\tif (connection) {\n\t\t\t\t\treturn connection;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\tinputConnections() {\n\t\treturn this._inputConnections;\n\t}\n\texistingInputConnections() {\n\t\tconst current_connections = this._inputConnections;\n\t\tif (current_connections) {\n\t\t\t// remove the last one if it is undefined\n\t\t\twhile (\n\t\t\t\tcurrent_connections.length > 1 &&\n\t\t\t\tcurrent_connections[current_connections.length - 1] === undefined\n\t\t\t) {\n\t\t\t\tcurrent_connections.pop();\n\t\t\t}\n\t\t}\n\t\treturn current_connections;\n\t}\n\n\t//\n\t//\n\t// OUTPUT CONNECTIONS\n\t//\n\t//\n\taddOutputConnection(connection: TypedNodeConnection<NC>) {\n\t\tconst output_index = connection.outputIndex();\n\t\tconst id = connection.id();\n\t\tlet connections_by_id = this._outputConnections.get(output_index);\n\t\tif (!connections_by_id) {\n\t\t\tconnections_by_id = new Map<number, TypedNodeConnection<NC>>();\n\t\t\tthis._outputConnections.set(output_index, connections_by_id);\n\t\t}\n\t\tconnections_by_id.set(id, connection);\n\t\t// this._output_connections[output_index] = this._output_connections[output_index] || {};\n\t\t// this._output_connections[output_index][id] = connection;\n\t}\n\tremoveOutputConnection(connection: TypedNodeConnection<NC>) {\n\t\tconst output_index = connection.outputIndex();\n\t\tconst id = connection.id();\n\t\tlet connections_by_id = this._outputConnections.get(output_index);\n\t\tif (connections_by_id) {\n\t\t\tconnections_by_id.delete(id);\n\t\t}\n\t\t// delete this._output_connections[output_index][id];\n\t}\n\toutputConnectionsByOutputIndex(outputIndex: number) {\n\t\treturn this._outputConnections.get(outputIndex);\n\t}\n\n\toutputConnections(target: TypedNodeConnection<NC>[]) {\n\t\ttarget.length = 0;\n\t\tthis._outputConnections.forEach((connections_by_id, output_index) => {\n\t\t\tconnections_by_id.forEach((connection, id) => {\n\t\t\t\tif (connection) {\n\t\t\t\t\ttarget.push(connection);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t// Object.keys(this._output_connections).forEach((index) => {\n\t\t// \tconst connections_for_index = this._output_connections[index];\n\t\t// \tObject.keys(connections_for_index).forEach((id) => {\n\t\t// \t\tlist.push(connections_for_index[id]);\n\t\t// \t});\n\t\t// });\n\t\treturn target;\n\t}\n}\n","import {NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\nimport {BaseConnectionPointData} from './connections/_Base';\n\nexport class SavedConnectionPointsDataController<NC extends NodeContext> {\n\tprivate _in: BaseConnectionPointData[] | undefined;\n\tprivate _out: BaseConnectionPointData[] | undefined;\n\n\tconstructor(protected _node: TypedNode<NC, any>) {}\n\n\tset_in(data: BaseConnectionPointData[]) {\n\t\tthis._in = data;\n\t}\n\tset_out(data: BaseConnectionPointData[]) {\n\t\tthis._out = data;\n\t}\n\tclear() {\n\t\tthis._in = undefined;\n\t\tthis._out = undefined;\n\t}\n\tin() {\n\t\treturn this._in;\n\t}\n\tout() {\n\t\treturn this._out;\n\t}\n}\n","import {NodeContext, NodeContextUnion} from '../../../../poly/NodeContext';\nimport {\n\tBaseGlConnectionPoint,\n\tGlConnectionPointType,\n\tGlConnectionPoint,\n\tGLParamTypeToConnectionPointTypeMap,\n} from './Gl';\nimport {\n\tBaseJsConnectionPoint,\n\tJsConnectionPointType,\n\tJsConnectionPoint,\n\tJsParamTypeToConnectionPointTypeMap,\n} from './Js';\nimport {BaseEventConnectionPoint, EventConnectionPoint, EventConnectionPointType} from './Event';\n\ntype ConnectionPointTypeMapGeneric = {\n\t[key in NodeContext]: BaseEventConnectionPoint | BaseGlConnectionPoint | BaseJsConnectionPoint | undefined;\n};\n\nexport interface ConnectionPointTypeMap extends ConnectionPointTypeMapGeneric {\n\t[NodeContext.ANIM]: undefined;\n\t[NodeContext.AUDIO]: undefined;\n\t// [NodeContext.CAD]: undefined;\n\t[NodeContext.COP]: undefined;\n\t// [NodeContext.CSG]: undefined;\n\t[NodeContext.EVENT]: BaseEventConnectionPoint;\n\t[NodeContext.GL]: BaseGlConnectionPoint;\n\t[NodeContext.JS]: BaseJsConnectionPoint;\n\t[NodeContext.MANAGER]: undefined;\n\t[NodeContext.MAT]: undefined;\n\t[NodeContext.OBJ]: undefined;\n\t[NodeContext.POST]: undefined;\n\t[NodeContext.ROP]: undefined;\n\t[NodeContext.SOP]: undefined;\n}\ntype ConnectionPointEnumMapGeneric = {\n\t[key in NodeContext]: EventConnectionPointType | GlConnectionPointType | JsConnectionPointType | undefined;\n};\n\nexport interface ConnectionPointEnumMap extends ConnectionPointEnumMapGeneric {\n\t[NodeContext.ANIM]: undefined;\n\t[NodeContext.AUDIO]: undefined;\n\t// [NodeContext.CAD]: undefined;\n\t[NodeContext.COP]: undefined;\n\t// [NodeContext.CSG]: undefined;\n\t[NodeContext.EVENT]: EventConnectionPointType;\n\t[NodeContext.GL]: GlConnectionPointType;\n\t[NodeContext.JS]: JsConnectionPointType;\n\t[NodeContext.MANAGER]: undefined;\n\t[NodeContext.MAT]: undefined;\n\t[NodeContext.OBJ]: undefined;\n\t[NodeContext.POST]: undefined;\n\t[NodeContext.ROP]: undefined;\n\t[NodeContext.SOP]: undefined;\n}\n\ntype IConnectionPointEnumMap = {[key in NodeContextUnion]: ConnectionPointEnumMap[key]};\n\nexport const DEFAULT_CONNECTION_POINT_ENUM_MAP: IConnectionPointEnumMap = {\n\t[NodeContext.ANIM]: undefined,\n\t[NodeContext.AUDIO]: undefined,\n\t// [NodeContext.CAD]: undefined,\n\t[NodeContext.COP]: undefined,\n\t// [NodeContext.CSG]: undefined,\n\t[NodeContext.EVENT]: EventConnectionPointType.BASE,\n\t[NodeContext.GL]: GlConnectionPointType.FLOAT,\n\t[NodeContext.JS]: JsConnectionPointType.FLOAT,\n\t[NodeContext.MANAGER]: undefined,\n\t[NodeContext.MAT]: undefined,\n\t[NodeContext.OBJ]: undefined,\n\t[NodeContext.POST]: undefined,\n\t[NodeContext.ROP]: undefined,\n\t[NodeContext.SOP]: undefined,\n};\n\nexport function createConnectionPoint<NC extends NodeContext>(\n\tcontext: NC,\n\tname: string,\n\ttype: ConnectionPointEnumMap[NC]\n) {\n\tswitch (context) {\n\t\tcase NodeContext.EVENT: {\n\t\t\treturn new EventConnectionPoint(name, type as EventConnectionPointType);\n\t\t}\n\t\tcase NodeContext.GL: {\n\t\t\treturn new GlConnectionPoint(name, type as GlConnectionPointType);\n\t\t}\n\t\tcase NodeContext.JS: {\n\t\t\treturn new JsConnectionPoint(name, type as JsConnectionPointType);\n\t\t}\n\t\tdefault: {\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n\nexport function paramTypeToConnectionPointTypeMap<NC extends NodeContext>(context: NC) {\n\tswitch (context) {\n\t\tcase NodeContext.EVENT: {\n\t\t\treturn undefined;\n\t\t}\n\t\tcase NodeContext.GL: {\n\t\t\treturn GLParamTypeToConnectionPointTypeMap;\n\t\t}\n\t\tcase NodeContext.JS: {\n\t\t\treturn JsParamTypeToConnectionPointTypeMap;\n\t\t}\n\t\tdefault: {\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n","import {Number2} from '../../../../types/GlobalTypes';\nimport {\n\tConnectionPointTypeMap,\n\tConnectionPointEnumMap,\n\tparamTypeToConnectionPointTypeMap,\n\tcreateConnectionPoint,\n} from './connections/ConnectionMap';\nimport {ParamType} from '../../../poly/ParamType';\nimport {ParamsUpdateOptions} from '../params/ParamsController';\nimport {ParamInitValueSerialized} from '../../../params/types/ParamInitValueSerialized';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\nimport {isArray,isNumber} from '../../../../core/Type';\nimport {objectClone} from '../../../../core/ObjectUtils';\n\n/*\nGlNodeSpareParamsController creates spare params from inputs on gl nodes\n*/\nexport class ConnectionPointsSpareParamsController<NC extends NodeContext> {\n\t// private _allow_inputs_created_from_params: boolean = true;\n\tprivate _inputlessParamNames: string[] | undefined;\n\tprivate _raw_input_serialized_by_param_name: Map<string, ParamInitValueSerialized> = new Map();\n\tprivate _default_value_serialized_by_param_name: Map<string, ParamInitValueSerialized> = new Map();\n\tconstructor(private node: TypedNode<NC, any>, private _context: NC) {}\n\n\t// disallow_inputs_created_from_params() {\n\t// \tthis._allow_inputs_created_from_params = false;\n\t// }\n\n\tprivate _initialized = false;\n\tinitializeNode() {\n\t\tif (this._initialized) {\n\t\t\tconsole.warn('already initialized', this.node);\n\t\t\treturn;\n\t\t}\n\t\tthis._initialized = true;\n\t\tthis.node.params.onParamsCreated('createInputsFromParams', this._createInputsFromParams.bind(this));\n\t}\n\tinitialized() {\n\t\treturn this._initialized;\n\t}\n\n\tprivate _createInputsFromParams() {\n\t\t// if (!this._allow_inputs_created_from_params) {\n\t\t// \treturn;\n\t\t// }\n\t\tconst connectionTypeMap = paramTypeToConnectionPointTypeMap(this._context);\n\t\tif (!connectionTypeMap) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst connectionPoints: ConnectionPointTypeMap[NC][] = [];\n\t\tfor (const paramName of this.node.params.names) {\n\t\t\tlet addInput = true;\n\t\t\tif (\n\t\t\t\tthis._inputlessParamNames &&\n\t\t\t\tthis._inputlessParamNames.length > 0 &&\n\t\t\t\tthis._inputlessParamNames.includes(paramName)\n\t\t\t) {\n\t\t\t\taddInput = false;\n\t\t\t}\n\t\t\tif (addInput) {\n\t\t\t\tif (this.node.params.has(paramName)) {\n\t\t\t\t\tconst param = this.node.params.get(paramName);\n\t\t\t\t\tif (param && !param.parentParam()) {\n\t\t\t\t\t\tconst connectionType = connectionTypeMap[param.type()] as ConnectionPointEnumMap[NC];\n\t\t\t\t\t\tif (connectionType) {\n\t\t\t\t\t\t\tconst connectionPoint = createConnectionPoint(\n\t\t\t\t\t\t\t\tthis._context,\n\t\t\t\t\t\t\t\tparam.name(),\n\t\t\t\t\t\t\t\tconnectionType\n\t\t\t\t\t\t\t) as ConnectionPointTypeMap[NC];\n\t\t\t\t\t\t\tif (connectionPoint) {\n\t\t\t\t\t\t\t\tconnectionPoints.push(connectionPoint);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.node.io.inputs.setNamedInputConnectionPoints(connectionPoints);\n\t}\n\n\tsetInputlessParamNames(names: string[]) {\n\t\treturn (this._inputlessParamNames = names);\n\t}\n\n\t//\n\t// Create spare params on gl nodes\n\t//\n\tcreateSpareParameters() {\n\t\tif (this.node.scene().loadingController.isLoading()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current_param_names: string[] = this.node.params.spare_names;\n\t\tconst params_update_options: ParamsUpdateOptions = {};\n\n\t\tfor (const param_name of current_param_names) {\n\t\t\tif (this.node.params.has(param_name)) {\n\t\t\t\tconst param = this.node.params.get(param_name);\n\t\t\t\tif (param) {\n\t\t\t\t\tthis._raw_input_serialized_by_param_name.set(param_name, param.rawInputSerialized());\n\t\t\t\t\tthis._default_value_serialized_by_param_name.set(param_name, param.defaultValueSerialized());\n\t\t\t\t\tparams_update_options.namesToDelete = params_update_options.namesToDelete || [];\n\t\t\t\t\tparams_update_options.namesToDelete.push(param_name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst inputConnectionPoints = this.node.io.inputs.namedInputConnectionPoints();\n\t\tif (inputConnectionPoints) {\n\t\t\tlet i = 0;\n\t\t\tfor (const connection_point of inputConnectionPoints) {\n\t\t\t\tif (connection_point) {\n\t\t\t\t\tconst isConnected = this.node.io.inputs.input(i) != null;\n\t\t\t\t\tconst param_name = connection_point.name();\n\t\t\t\t\tconst paramType: ParamType | null = connection_point.param_type;\n\t\t\t\t\tif (paramType) {\n\t\t\t\t\t\tlet init_value = connection_point.init_value;\n\n\t\t\t\t\t\tconst last_param_init_value = this._default_value_serialized_by_param_name.get(param_name);\n\t\t\t\t\t\tlet default_value_from_name = this.node.paramDefaultValue(param_name);\n\n\t\t\t\t\t\tif (default_value_from_name != null) {\n\t\t\t\t\t\t\tinit_value = default_value_from_name;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (last_param_init_value != null) {\n\t\t\t\t\t\t\t\tinit_value = last_param_init_value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tinit_value = connection_point.init_value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isArray(connection_point.init_value)) {\n\t\t\t\t\t\t\t// if we need to use an init_value from a float to an array\n\t\t\t\t\t\t\tif (isNumber(init_value)) {\n\t\t\t\t\t\t\t\tconst array = new Array(connection_point.init_value.length) as Number2;\n\t\t\t\t\t\t\t\tarray.fill(init_value);\n\t\t\t\t\t\t\t\tinit_value = array;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// if we need to use an init_value from a array to an array, we need to check their length.\n\t\t\t\t\t\t\t// if they are different, we need to match them.\n\t\t\t\t\t\t\telse if (isArray(init_value)) {\n\t\t\t\t\t\t\t\t// if (init_value.length < connection_point.init_value.length) {\n\t\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t\t// if (init_value.length > connection_point.init_value.length) {\n\t\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t\tif (init_value.length == connection_point.init_value.length) {\n\t\t\t\t\t\t\t\t\tif (last_param_init_value != null) {\n\t\t\t\t\t\t\t\t\t\tinit_value = connection_point.init_value;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (init_value != null && paramType != ParamType.BUTTON) {\n\t\t\t\t\t\t\tparams_update_options.toAdd = params_update_options.toAdd || [];\n\t\t\t\t\t\t\tparams_update_options.toAdd.push({\n\t\t\t\t\t\t\t\tname: param_name,\n\t\t\t\t\t\t\t\ttype: paramType,\n\t\t\t\t\t\t\t\t// TODO: I should really treat differently init_value and raw_input here\n\t\t\t\t\t\t\t\tinitValue: objectClone(init_value as any),\n\t\t\t\t\t\t\t\trawInput: objectClone(init_value as any),\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\tspare: true,\n\t\t\t\t\t\t\t\t\teditable: !isConnected,\n\t\t\t\t\t\t\t\t\t// computeOnDirty should be false for PARAM_PATH\n\t\t\t\t\t\t\t\t\t// so that js/setParam and js/getParam can link to a parameter\n\t\t\t\t\t\t\t\t\t// without having their parent node actor being recooked\n\t\t\t\t\t\t\t\t\tcomputeOnDirty: paramType != ParamType.PARAM_PATH,\n\t\t\t\t\t\t\t\t\t// dependentOnFoundParam should be false for PARAM_PATH\n\t\t\t\t\t\t\t\t\t// so that js/setParam and js/getParam can link to a parameter\n\t\t\t\t\t\t\t\t\t// without having their parent node actor being recooked\n\t\t\t\t\t\t\t\t\tdependentOnFoundParam: false,\n\t\t\t\t\t\t\t\t\t// dependentOnFoundNode: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\t// if (!this.node.scene.loading_controller.isLoading()) {\n\t\tthis.node.params.updateParams(params_update_options);\n\n\t\tfor (const spare_param of this.node.params.spare) {\n\t\t\tif (!spare_param.parentParam()) {\n\t\t\t\tconst raw_input = this._raw_input_serialized_by_param_name.get(spare_param.name());\n\t\t\t\tif (raw_input) {\n\t\t\t\t\tspare_param.set(raw_input as any);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// }\n\t}\n}\n","import {CoreGraphNode} from '../../../../core/graph/CoreGraphNode';\nimport {\n\tConnectionPointTypeMap,\n\tConnectionPointEnumMap,\n\tDEFAULT_CONNECTION_POINT_ENUM_MAP,\n\tcreateConnectionPoint,\n} from './connections/ConnectionMap';\nimport {TypedNode} from '../../_Base';\nimport {ConnectionPointsSpareParamsController} from './ConnectionPointsSpareParamsController';\nimport {NodeContext, NetworkChildNodeType} from '../../../poly/NodeContext';\nimport {arrayCopy} from '../../../../core/ArrayUtils';\n\ntype IONameFunction = (index: number) => string;\ntype ExpectedConnectionTypesFunction<NC extends NodeContext> = () => ConnectionPointEnumMap[NC][];\nfunction arraysMatch<T>(array0: Array<T>, array1: Array<T>): boolean {\n\tif (array0.length != array1.length) {\n\t\treturn false;\n\t}\n\tfor (let i = 0; i < array0.length; i++) {\n\t\tif (array0[i] != array1[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nexport class ConnectionPointsController<NC extends NodeContext> {\n\tprivate _spare_params_controller: ConnectionPointsSpareParamsController<NC>;\n\tprivate _create_spare_params_from_inputs = true;\n\tprivate _functions_overridden = false;\n\n\tconstructor(private node: TypedNode<NC, any>, private _context: NC) {\n\t\tthis._spare_params_controller = new ConnectionPointsSpareParamsController(this.node, this._context);\n\t}\n\n\tprivate _input_name_function: IONameFunction = (index: number) => {\n\t\treturn `in${index}`;\n\t};\n\tprivate _output_name_function: IONameFunction = (index: number) => {\n\t\treturn index == 0 ? 'val' : `val${index}`;\n\t};\n\t// private _default_input_type: ConnectionPointType = ConnectionPointType.FLOAT;\n\tprivate _expected_input_types_function: ExpectedConnectionTypesFunction<NC> = () => {\n\t\tconst type = this.first_input_connection_type() || this.default_connection_type();\n\t\treturn [type, type];\n\t};\n\tprivate _expected_output_types_function: ExpectedConnectionTypesFunction<NC> = () => {\n\t\treturn [this._expected_input_types_function()[0]];\n\t};\n\tprotected default_connection_type(): ConnectionPointEnumMap[NC] {\n\t\treturn DEFAULT_CONNECTION_POINT_ENUM_MAP[this._context];\n\t}\n\tprotected createConnectionPoint(name: string, type: ConnectionPointEnumMap[NC]): ConnectionPointTypeMap[NC] {\n\t\treturn createConnectionPoint(this._context, name, type) as ConnectionPointTypeMap[NC];\n\t}\n\n\tfunctions_overridden(): boolean {\n\t\treturn this._functions_overridden;\n\t}\n\tinitialized(): boolean {\n\t\treturn this._initialized;\n\t}\n\n\tset_create_spare_params_from_inputs(state: boolean) {\n\t\tthis._create_spare_params_from_inputs = state;\n\t}\n\n\tset_input_name_function(func: IONameFunction) {\n\t\tthis._initialize_if_required();\n\t\tthis._input_name_function = func;\n\t}\n\tset_output_name_function(func: IONameFunction) {\n\t\tthis._initialize_if_required();\n\t\tthis._output_name_function = func;\n\t}\n\n\t// set_default_input_type(type: ConnectionPointType) {\n\t// \tthis._default_input_type = type;\n\t// }\n\tset_expected_input_types_function(func: ExpectedConnectionTypesFunction<NC>) {\n\t\tthis._initialize_if_required();\n\t\tthis._functions_overridden = true;\n\t\tthis._expected_input_types_function = func;\n\t}\n\tset_expected_output_types_function(func: ExpectedConnectionTypesFunction<NC>) {\n\t\tthis._initialize_if_required();\n\t\tthis._functions_overridden = true;\n\t\tthis._expected_output_types_function = func;\n\t}\n\n\tinput_name(index: number) {\n\t\treturn this._wrapped_input_name_function(index);\n\t}\n\toutput_name(index: number) {\n\t\treturn this._wrapped_output_name_function(index);\n\t}\n\n\tprivate _update_signature_if_required_bound = this.update_signature_if_required.bind(this);\n\tprivate _initialized: boolean = false;\n\tinitializeNode() {\n\t\t// I don't want this check here, as I should refactor to have the has_named_inputs\n\t\t// be initialized from here\n\t\t// if (!this.node.io.inputs.hasNamedInputs()) {\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (this._initialized) {\n\t\t\tconsole.warn('already initialized', this.node);\n\t\t\treturn;\n\t\t}\n\t\tthis._initialized = true;\n\n\t\t// hooks\n\t\tthis.node.io.inputs.add_on_set_input_hook(\n\t\t\t'_update_signature_if_required',\n\t\t\tthis._update_signature_if_required_bound\n\t\t);\n\t\t// this.node.lifecycle.onAfterAdded(this._update_signature_if_required_bound);\n\t\tthis.node.params.addOnSceneLoadHook('_update_signature_if_required', this._update_signature_if_required_bound);\n\t\tthis.node.params.onParamsCreated(\n\t\t\t'_update_signature_if_required_bound',\n\t\t\tthis._update_signature_if_required_bound\n\t\t);\n\t\tthis.node.addPostDirtyHook('_update_signature_if_required', this._update_signature_if_required_bound);\n\n\t\tif (!this._spare_params_controller.initialized()) {\n\t\t\tthis._spare_params_controller.initializeNode();\n\t\t}\n\t}\n\tprivate _initialize_if_required() {\n\t\tif (!this._initialized) {\n\t\t\tthis.initializeNode();\n\t\t}\n\t}\n\n\tget spare_params() {\n\t\treturn this._spare_params_controller;\n\t}\n\n\tupdate_signature_if_required() {\n\t\tif (!this.node.lifecycle.creationCompleted() || !this._inputsOutputsMatchExpectations()) {\n\t\t\tthis.update_connection_types();\n\t\t\tthis.node.removeDirtyState();\n\n\t\t\t// no need to update the successors when loading,\n\t\t\t// since the connection point types are stored in the scene data\n\t\t\tif (!this.node.scene().loadingController.isLoading()) {\n\t\t\t\tthis.make_successors_update_signatures();\n\t\t\t}\n\t\t}\n\t}\n\n\t// used when a node changes its signature, adn the output nodes need to adapt their own signatures\n\tprivate _successorsCopy: CoreGraphNode[] = [];\n\tprivate make_successors_update_signatures() {\n\t\tconst successors = this.node.graphAllSuccessors();\n\t\tarrayCopy(successors, this._successorsCopy);\n\t\tif (this.node.childrenAllowed()) {\n\t\t\tconst subnet_inputs = this.node.nodesByType(NetworkChildNodeType.INPUT);\n\t\t\tconst subnet_outputs = this.node.nodesByType(NetworkChildNodeType.OUTPUT);\n\t\t\tfor (const subnet_input of subnet_inputs) {\n\t\t\t\tthis._successorsCopy.push(subnet_input);\n\t\t\t}\n\t\t\tfor (const subnet_output of subnet_outputs) {\n\t\t\t\tthis._successorsCopy.push(subnet_output);\n\t\t\t}\n\t\t}\n\n\t\tfor (const graphNode of this._successorsCopy) {\n\t\t\tconst node = graphNode as TypedNode<NC, any>;\n\t\t\t// we need to check if node.io exists to be sure it is a node, not just a graph_node\n\t\t\tif (node.io && node.io.has_connection_points_controller && node.io.connection_points.initialized()) {\n\t\t\t\tnode.io.connection_points.update_signature_if_required();\n\t\t\t}\n\t\t}\n\t\t// we also need to have subnet_output nodes update their parents\n\t\t// if (this.node.type == NetworkChildNodeType.OUTPUT) {\n\t\t// this.node.parent?.io.connection_points.update_signature_if_required(this.node);\n\t\t// }\n\t}\n\n\tupdate_connection_types() {\n\t\tconst set_dirty = false;\n\t\tconst expected_input_types = this._wrapped_expected_input_types_function();\n\t\tconst expected_output_types = this._wrapped_expected_output_types_function();\n\n\t\tconst named_input_connection_points: ConnectionPointTypeMap[NC][] = [];\n\t\tfor (let i = 0; i < expected_input_types.length; i++) {\n\t\t\tconst type = expected_input_types[i];\n\t\t\tconst point = this.createConnectionPoint(this._wrapped_input_name_function(i), type);\n\t\t\tnamed_input_connection_points.push(point);\n\t\t}\n\t\tconst named_output_connect_points: ConnectionPointTypeMap[NC][] = [];\n\t\tfor (let i = 0; i < expected_output_types.length; i++) {\n\t\t\tconst type = expected_output_types[i];\n\t\t\tconst point = this.createConnectionPoint(this._wrapped_output_name_function(i), type);\n\t\t\tnamed_output_connect_points.push(point);\n\t\t}\n\n\t\tthis.node.io.inputs.setNamedInputConnectionPoints(named_input_connection_points);\n\n\t\tthis.node.io.outputs.setNamedOutputConnectionPoints(named_output_connect_points, set_dirty);\n\t\tif (this._create_spare_params_from_inputs) {\n\t\t\tthis._spare_params_controller.createSpareParameters();\n\t\t}\n\t}\n\n\tprotected _inputsOutputsMatchExpectations(): boolean {\n\t\tconst namedInputConnections = this.node.io.inputs.namedInputConnectionPoints();\n\t\tconst namedOutputConnections = this.node.io.outputs.namedOutputConnectionPoints();\n\t\tif (!(namedInputConnections && namedOutputConnections)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst inputTypesMatch = arraysMatch(\n\t\t\t// make sure to test the expected ones against all except the inNodeDefinition ones\n\t\t\tnamedInputConnections.filter((c) => !c?.inNodeDefinition()).map((c) => c?.type()),\n\t\t\tthis._wrapped_expected_input_types_function()\n\t\t);\n\t\tconst outputTypesMatch = arraysMatch(\n\t\t\tnamedOutputConnections.map((c) => c?.type()),\n\t\t\tthis._wrapped_expected_output_types_function()\n\t\t);\n\t\tconst inputNamesMatch = arraysMatch(\n\t\t\t// make sure to test the expected ones against all except the inNodeDefinition ones\n\t\t\tnamedInputConnections.filter((c) => !c?.inNodeDefinition()).map((c) => c?.name()),\n\t\t\tnamedInputConnections\n\t\t\t\t.filter((c) => !c?.inNodeDefinition())\n\t\t\t\t.map((c, i) => this._wrapped_input_name_function(i))\n\t\t);\n\t\tconst outputNamesMatch = arraysMatch(\n\t\t\tnamedOutputConnections.map((c) => c?.name()),\n\t\t\tnamedOutputConnections.map((c, i) => this._wrapped_output_name_function(i))\n\t\t);\n\n\t\treturn inputTypesMatch && outputTypesMatch && inputNamesMatch && outputNamesMatch;\n\t}\n\n\t//\n\t//\n\t// WRAPPPED METHOD\n\t// the goal here is to use the types data saved in the scene file\n\t// when the scene is loading. That has 2 purposes:\n\t// - avoid an update cascade during loading, where nodes with many inputs are updated\n\t//\t several times.\n\t// - allow the subnet_input to load with the connection_points it had on save,\n\t//   which in turn allows connected nodes to not lose their connections.\n\t//\n\tprivate _wrapped_expected_input_types_function() {\n\t\tif (this.node.scene().loadingController.isLoading()) {\n\t\t\tconst in_data = this.node.io.saved_connection_points_data.in();\n\t\t\tif (in_data) {\n\t\t\t\treturn in_data.map((d) => d.type as ConnectionPointEnumMap[NC]);\n\t\t\t}\n\t\t}\n\t\treturn this._expected_input_types_function();\n\t}\n\tprivate _wrapped_expected_output_types_function() {\n\t\tif (this.node.scene().loadingController.isLoading()) {\n\t\t\tconst out_data = this.node.io.saved_connection_points_data.out();\n\t\t\tif (out_data) {\n\t\t\t\treturn out_data.map((d) => d.type as ConnectionPointEnumMap[NC]);\n\t\t\t}\n\t\t}\n\t\treturn this._expected_output_types_function();\n\t}\n\tprivate _wrapped_input_name_function(index: number) {\n\t\tif (this.node.scene().loadingController.isLoading()) {\n\t\t\tconst in_data = this.node.io.saved_connection_points_data.in();\n\t\t\tif (in_data) {\n\t\t\t\treturn in_data[index].name;\n\t\t\t}\n\t\t}\n\t\treturn this._input_name_function(index);\n\t}\n\tprivate _wrapped_output_name_function(index: number) {\n\t\tif (this.node.scene().loadingController.isLoading()) {\n\t\t\tconst out_data = this.node.io.saved_connection_points_data.out();\n\t\t\tif (out_data) {\n\t\t\t\treturn out_data[index].name;\n\t\t\t}\n\t\t}\n\t\treturn this._output_name_function(index);\n\t}\n\n\t// protected input_connection_type() {\n\t// \treturn this.first_input_connection_type();\n\t// }\n\t// protected output_connection_type() {\n\t// \treturn this.first_input_connection_type();\n\t// }\n\n\tfirst_input_connection_type(): ConnectionPointEnumMap[NC] | undefined {\n\t\treturn this.input_connection_type(0);\n\t}\n\tinput_connection_type(index: number): ConnectionPointEnumMap[NC] | undefined {\n\t\tconst connections = this.node.io.connections.inputConnections();\n\t\tif (!connections) {\n\t\t\treturn;\n\t\t}\n\t\tconst connection = connections[index];\n\t\tif (!connection) {\n\t\t\treturn;\n\t\t}\n\t\tconst connectionPoint = connection.srcConnectionPoint();\n\t\tif (!connectionPoint) {\n\t\t\treturn;\n\t\t}\n\t\treturn connectionPoint.type() as ConnectionPointEnumMap[NC];\n\t}\n\t// input_connection_point_from_connection(connection: TypedNodeConnection<NC>): ConnectionPointTypeMap[NC] {\n\t// \tconst node_dest = connection.node_dest;\n\t// \tconst output_index = connection.output_index;\n\t// \treturn node_dest.io.outputs.namedOutputConnectionPoints()[output_index] as ConnectionPointTypeMap[NC];\n\t// }\n\t// output_connection_point_from_connection(connection: TypedNodeConnection<NC>): ConnectionPointTypeMap[NC] {\n\t// \tconst node_src = connection.node_src;\n\t// \tconst output_index = connection.output_index;\n\t// \treturn node_src.io.outputs.namedOutputConnectionPoints()[output_index] as ConnectionPointTypeMap[NC];\n\t// }\n\t// connection_point_type_from_connection(connection: TypedNodeConnection<NC>): ConnectionPointEnumMap[NC] {\n\t// \treturn connection.dest_connection_point()?.type as ConnectionPointEnumMap[NC];\n\t// \t// const connection_point = this.output_connection_point_from_connection(connection)!;\n\t// \t// return connection_point.type as ConnectionPointEnumMap[NC];\n\t// }\n\t// connection_point_name_from_connection(connection: TypedNodeConnection<NC>): string {\n\t// \treturn connection.dest_connection_point()!.name\n\t// \t// const connection_point = this.output_connection_point_from_connection(connection)!;\n\t// \t// return connection_point.name;\n\t// }\n}\n","import {NodeInputsController} from './InputsController';\nimport {OutputsController} from './OutputsController';\nimport {ConnectionsController} from './ConnectionsController';\nimport {SavedConnectionPointsDataController} from './SavedConnectionPointsDataController';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\nimport {ConnectionPointsController} from './ConnectionPointsController';\nimport {ParamType} from '../../../poly/ParamType';\nimport {ParamInitValueSerializedTypeMap} from '../../../params/types/ParamInitValueSerializedTypeMap';\nimport {ParamOptions} from '../../../params/utils/OptionsController';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\n\nexport type OverridenOptions = PolyDictionary<string | number>;\n\nexport type SimpleParamJsonExporterData<T extends ParamType> = ParamInitValueSerializedTypeMap[T];\n\nexport interface ComplexParamJsonExporterData<T extends ParamType> {\n\ttype?: T;\n\tdefault_value?: ParamInitValueSerializedTypeMap[T];\n\traw_input?: ParamInitValueSerializedTypeMap[T];\n\toptions?: ParamOptions;\n\toverriden_options?: OverridenOptions;\n\t// components?: ParamJsonExporterDataByName;\n\t// expression?: string;\n}\nexport type ParamJsonExporterData<T extends ParamType> =\n\t| SimpleParamJsonExporterData<T>\n\t| ComplexParamJsonExporterData<T>;\nexport type ParamJsonExporterDataByName = PolyDictionary<ParamJsonExporterData<ParamType>>;\n\nexport type ParamsJsonExporterData = PolyDictionary<ParamJsonExporterData<ParamType>>;\n\nexport interface ParamInitData<T extends ParamType> {\n\traw_input?: ParamInitValueSerializedTypeMap[T];\n\tsimple_data?: SimpleParamJsonExporterData<T>;\n\tcomplex_data?: ComplexParamJsonExporterData<T>;\n}\nexport type ParamsInitData = PolyDictionary<ParamInitData<ParamType>>;\n\nexport class IOController<NC extends NodeContext> {\n\tprotected _inputs: NodeInputsController<NC> | undefined;\n\tprotected _outputs: OutputsController<NC> | undefined;\n\tprotected _connections: ConnectionsController<NC> = new ConnectionsController(this.node);\n\tprotected _saved_connection_points_data: SavedConnectionPointsDataController<NC> | undefined;\n\tprotected _connection_points: ConnectionPointsController<NC> | undefined;\n\n\tconstructor(protected node: TypedNode<NC, any>) {}\n\n\tdispose() {\n\t\tthis.inputs.dispose();\n\t\tthis.outputs.dispose();\n\t\tthis.connections.dispose();\n\t}\n\n\tget connections() {\n\t\treturn this._connections;\n\t}\n\n\t//\n\t//\n\t// inputs\n\t//\n\t//\n\tget inputs(): NodeInputsController<NC> {\n\t\treturn (this._inputs = this._inputs || new NodeInputsController(this.node));\n\t}\n\thasInputs() {\n\t\treturn this._inputs != null;\n\t}\n\n\t//\n\t//\n\t// outputs\n\t//\n\t//\n\tget outputs(): OutputsController<NC> {\n\t\treturn (this._outputs = this._outputs || new OutputsController(this.node));\n\t}\n\thas_outputs() {\n\t\treturn this._outputs != null;\n\t}\n\n\t//\n\t//\n\t// connection_points\n\t//\n\t//\n\tget connection_points(): ConnectionPointsController<NC> {\n\t\treturn (this._connection_points =\n\t\t\tthis._connection_points || new ConnectionPointsController(this.node, this.node.context() as NC));\n\t}\n\tget has_connection_points_controller(): boolean {\n\t\treturn this._connection_points != null;\n\t}\n\n\t//\n\t//\n\t// saved connection points data\n\t//\n\t//\n\tget saved_connection_points_data() {\n\t\treturn (this._saved_connection_points_data =\n\t\t\tthis._saved_connection_points_data || new SavedConnectionPointsDataController(this.node));\n\t}\n\tclear_saved_connection_points_data() {\n\t\tif (this._saved_connection_points_data) {\n\t\t\tthis._saved_connection_points_data.clear();\n\t\t\tthis._saved_connection_points_data = undefined;\n\t\t}\n\t}\n}\n","import {NodeParamsConfig} from './ParamsConfig';\n// import {ParamValuesTypeMap} from './ParamsController';\n// import {ParamType} from '../../../poly/ParamType';\n\n// function getProperty<T, K extends keyof T>(o: T, propertyName: K): T[K] {\n// \treturn o[propertyName]; // o[propertyName] is of type T[K]\n// }\n\n// let t: getProperty(ParamConfig, 'type')\n// function prop<T, K extends keyof T>(obj: T, key: K) {\n// \treturn typeof obj[key];\n// }\n// type test = Pick<ParamConfig<ParamType.FLOAT>, 'default_value'>;\n\nexport type ParamsAccessorType<T extends NodeParamsConfig> = {\n\treadonly // @ts-ignore\n\t[P in keyof T]: T[P]['param_class'];\n};\n\nexport class ParamsAccessor<T extends NodeParamsConfig> {\n\tconstructor() {\n\t\t// console.log('accessor', this);\n\t}\n}\n","import {PolyScene} from '../scene/PolyScene';\nimport {CoreGraphNode} from '../../core/graph/CoreGraphNode';\nimport {UIData} from './utils/UIData';\nimport {FlagsController, FlagsControllerD} from './utils/FlagsController';\nimport {NodeStatesController} from './utils/StatesController';\nimport {HierarchyParentController} from './utils/hierarchy/ParentController';\nimport {HierarchyChildrenController, NodeCreateOptions} from './utils/hierarchy/ChildrenController';\nimport {NodeLifeCycleController} from './utils/LifeCycleController';\nimport {TypedContainerController} from './utils/ContainerController';\nimport {NodeCookController, OnCookCompleteHook} from './utils/CookController';\nimport {NameController} from './utils/NameController';\nimport {CoreNodeSerializer, NodeSerializerData} from './utils/CoreNodeSerializer';\nimport {ParamsController} from './utils/params/ParamsController';\nimport {ParamConstructorMap} from '../params/types/ParamConstructorMap';\nimport {ParamInitValuesTypeMap} from '../params/types/ParamInitValuesTypeMap';\nimport {NodeParamsConfig} from './utils/params/ParamsConfig';\nimport {ParamsValueAccessor, ParamsValueAccessorType} from './utils/params/ParamsValueAccessor';\n// import {ProcessingContext} from './utils/ProcessingContext';\nimport {IOController} from './utils/io/IOController';\nimport {NodeEvent} from '../poly/NodeEvent';\nimport {BaseNodeByContextMap, NodeContext} from '../poly/NodeContext';\nimport {ParamsAccessorType, ParamsAccessor} from './utils/params/ParamsAccessor';\n// import {ContainerMap, ContainerType} from '../containers/utils/ContainerMap';\nimport {ContainableMap} from '../containers/utils/ContainableMap';\nimport {ParamOptions} from '../params/utils/OptionsController';\nimport {ParamType} from '../poly/ParamType';\nimport {DisplayNodeController} from './utils/DisplayNodeController';\n// import {NodeTypeMap} from '../containers/utils/ContainerMap';\nimport {ParamInitValueSerialized} from '../params/types/ParamInitValueSerialized';\nimport {ModuleName} from '../poly/registers/modules/Common';\nimport {BasePersistedConfig} from './utils/BasePersistedConfig';\nimport {AssemblerName} from '../poly/registers/assemblers/_BaseRegister';\nimport {PolyNodeController} from './utils/poly/PolyNodeController';\nimport {CoreGraphNodeId} from '../../core/graph/CoreGraph';\nimport {PolyDictionary} from '../../types/GlobalTypes';\nimport {SetInputsOptions} from './utils/io/InputsController';\nimport {OnNodeRegisterCallback} from '../poly/registers/nodes/NodesRegister';\nimport {EventDispatcher, BaseEvent, EventListener} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../core/geometry/ObjectContent';\nexport interface NodeDeletedEmitData {\n\tparent_id: CoreGraphNodeId;\n}\ntype AnyString= 'any-string'\nconst ANY_STRING:AnyString='any-string'\nexport interface NodeCreatedEmitData {\n\tchild_node_json: NodeSerializerData;\n}\ntype EmitDataByNodeEventMapGeneric = {[key in NodeEvent]: any};\nexport interface EmitDataByNodeEventMap extends EmitDataByNodeEventMapGeneric {\n\t[NodeEvent.CREATED]: NodeCreatedEmitData;\n\t[NodeEvent.DELETED]: NodeDeletedEmitData;\n\t[NodeEvent.ERROR_UPDATED]: undefined;\n}\nexport interface IntegrationData {\n\tname: string;\n\tdata: PolyDictionary<string>;\n}\n\nexport interface BaseNodeEvent extends BaseEvent {\n\ttarget?: BaseNodeType;\n\t// [attachment: string]: any;\n}\nexport type NodeEventListener = EventListener<BaseNodeEvent, string, EventDispatcher<BaseNodeEvent>>;\nexport const DEFAULT_DATA_TYPE = 'default';\n\n/**\n *\n *\n * TypedNode is the base class that all nodes inherit from. This inherits from [CoreGraphNode](/docs/api/CoreGraphNode).\n *\n */\nexport class TypedNode<NC extends NodeContext, K extends NodeParamsConfig> extends CoreGraphNode {\n\tcontainerController: TypedContainerController<NC> = new TypedContainerController<NC>(this);\n\n\tprivate _parentController: HierarchyParentController | undefined;\n\n\tprivate _uiData: UIData | undefined;\n\n\tprivate _states: NodeStatesController<NC> | undefined;\n\tprivate _lifecycle: NodeLifeCycleController | undefined;\n\tprivate _serializer: CoreNodeSerializer | undefined;\n\tprivate _cookController: NodeCookController<NC> | undefined;\n\tpublic readonly flags: FlagsController | undefined;\n\tpublic readonly displayNodeController: DisplayNodeController | undefined;\n\tpublic readonly persisted_config: BasePersistedConfig | undefined;\n\n\tprivate _paramsController: ParamsController | undefined;\n\treadonly paramsConfig: K | undefined;\n\treadonly pv: ParamsValueAccessorType<K> = (<unknown>new ParamsValueAccessor<K>()) as ParamsValueAccessorType<K>;\n\t// readonly pv: ParamsValueAccessor<K> = new ParamsValueAccessor<K>(this);\n\treadonly p: ParamsAccessorType<K> = (<unknown>new ParamsAccessor<K>()) as ParamsAccessorType<K>;\n\tcopy_param_values(node: TypedNode<NC, K>) {\n\t\tconst non_spare = this.params.non_spare;\n\t\tfor (const param of non_spare) {\n\t\t\tconst other_param = node.params.get(param.name());\n\t\t\tif (other_param) {\n\t\t\t\tparam.copyValue(other_param);\n\t\t\t}\n\t\t}\n\t}\n\tdataType(): string {\n\t\treturn DEFAULT_DATA_TYPE;\n\t}\n\n\tprivate _nameController: NameController | undefined;\n\tget parentController(): HierarchyParentController {\n\t\treturn (this._parentController = this._parentController || new HierarchyParentController(this));\n\t}\n\tstatic displayedInputNames(): string[] | undefined {\n\t\treturn undefined;\n\t}\n\tdisplayedInputNames(): string[] | undefined {\n\t\treturn (this.constructor as any as TypedNode<NC, K>).displayedInputNames();\n\t}\n\n\tprivate _childrenController: HierarchyChildrenController | undefined;\n\tprotected _childrenControllerContext: NodeContext | undefined;\n\tchildrenControllerContext() {\n\t\treturn this._childrenControllerContext;\n\t}\n\tprivate _create_childrenController(): HierarchyChildrenController | undefined {\n\t\tif (this._childrenControllerContext) {\n\t\t\treturn new HierarchyChildrenController(this, this._childrenControllerContext);\n\t\t}\n\t}\n\tget childrenController(): HierarchyChildrenController | undefined {\n\t\treturn (this._childrenController = this._childrenController || this._create_childrenController());\n\t}\n\tchildrenAllowed(): boolean {\n\t\treturn this._childrenControllerContext != null;\n\t}\n\tsceneReadonly(): boolean {\n\t\treturn false;\n\t}\n\n\tget uiData(): UIData {\n\t\treturn (this._uiData = this._uiData || new UIData(this));\n\t}\n\n\tget states(): NodeStatesController<NC> {\n\t\treturn (this._states = this._states || new NodeStatesController(this));\n\t}\n\tget lifecycle(): NodeLifeCycleController {\n\t\treturn (this._lifecycle = this._lifecycle || new NodeLifeCycleController(this));\n\t}\n\n\tget serializer(): CoreNodeSerializer | undefined {\n\t\treturn this._serializer;\n\t}\n\n\tget cookController(): NodeCookController<NC> {\n\t\treturn (this._cookController = this._cookController || new NodeCookController(this));\n\t}\n\tprotected _io: IOController<NC> | undefined;\n\tget io(): IOController<NC> {\n\t\treturn (this._io = this._io || new IOController(this));\n\t}\n\tget nameController(): NameController {\n\t\treturn (this._nameController = this._nameController || new NameController(this));\n\t}\n\t/**\n\t * sets the name of a node. Note that if a sibling node already has that name, it will be updated to be unique.\n\t *\n\t */\n\toverride setName(name: string) {\n\t\tthis.nameController.setName(name);\n\t}\n\t_setCoreName(name: string) {\n\t\tthis._name = name;\n\t}\n\n\tget params(): ParamsController {\n\t\treturn (this._paramsController = this._paramsController || new ParamsController(this));\n\t}\n\t// get processing_context(): ProcessingContext {\n\t// \treturn (this._processing_context = this._processing_context || new ProcessingContext(this));\n\t// }\n\n\tconstructor(scene: PolyScene, nodeName: string = 'BaseNode', public createOptions?: NodeCreateOptions) {\n\t\tsuper(scene, nodeName);\n\t\tconst serializerClass = createOptions?.serializerClass;\n\t\tif (serializerClass) {\n\t\t\tthis._serializer = new serializerClass(this);\n\t\t}\n\t}\n\n\tprivate _initialized: boolean = false;\n\tpublic initializeBaseAndNode() {\n\t\tif (!this._initialized) {\n\t\t\tthis._initialized = true;\n\n\t\t\tthis.displayNodeController?.initializeNode();\n\n\t\t\tthis.initializeBaseNode(); // for base classes of Sop, Obj...\n\t\t\tthis.initializeNode(); // for Derivated node clases, like BoxSop, TransformSop...\n\t\t\tif (this.polyNodeController) {\n\t\t\t\tthis.polyNodeController.initializeNode();\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('node already initialized');\n\t\t}\n\t}\n\tprotected initializeBaseNode() {}\n\tprotected initializeNode() {}\n\n\tstatic type(): string {\n\t\tthrow 'type to be overriden';\n\t}\n\tstatic onRegister: OnNodeRegisterCallback | undefined;\n\t/**\n\t * returns the type of the node.\n\t *\n\t */\n\ttype() {\n\t\tconst c = this.constructor as typeof BaseNodeClass;\n\t\treturn c.type();\n\t}\n\tstatic context(): NodeContext {\n\t\tconsole.error('node has no node_context', this);\n\t\tthrow 'context requires override';\n\t}\n\t/**\n\t * returns the context.\n\t *\n\t */\n\tcontext(): NodeContext {\n\t\tconst c = this.constructor as typeof BaseNodeClass;\n\t\treturn c.context();\n\t}\n\n\tstatic requireWebGL2(): boolean {\n\t\treturn false;\n\t}\n\trequireWebGL2(): boolean {\n\t\tconst c = this.constructor as typeof BaseNodeClass;\n\t\treturn c.requireWebGL2();\n\t}\n\n\tsetParent(parent: BaseNodeType | null) {\n\t\tthis.parentController.setParent(parent);\n\t}\n\t/**\n\t * returns the parent.\n\t *\n\t */\n\tparent() {\n\t\treturn this.parentController.parent();\n\t}\n\tinsideALockedParent(): boolean {\n\t\treturn this.lockedParent() != null;\n\t}\n\tlockedOrInsideALockedParent(): boolean {\n\t\treturn this.polyNodeController?.locked() || this.insideALockedParent();\n\t}\n\tselfOrLockedParent(): BaseNodeType | null {\n\t\tif (this.polyNodeController?.locked()) {\n\t\t\treturn this;\n\t\t}\n\t\treturn this.lockedParent();\n\t}\n\tlockedParent(): BaseNodeType | null {\n\t\tconst parent = this.parent();\n\t\tif (!parent) {\n\t\t\treturn null;\n\t\t}\n\t\tif (parent.polyNodeController && parent.polyNodeController.locked()) {\n\t\t\treturn parent;\n\t\t}\n\t\treturn parent.lockedParent();\n\t}\n\tfirstAncestorWithContext<N extends NodeContext>(context: N) {\n\t\treturn this.parentController.firstAncestorWithContext(context);\n\t}\n\troot() {\n\t\treturn this._scene.root();\n\t}\n\t/**\n\t * returns the path.\n\t *\n\t */\n\tpath(relative_to_parent?: BaseNodeType): string {\n\t\treturn this.parentController.path(relative_to_parent);\n\t}\n\n\t// params\n\tcreateParams() {}\n\taddParam<T extends ParamType>(\n\t\ttype: T,\n\t\tname: string,\n\t\tdefault_value: ParamInitValuesTypeMap[T],\n\t\toptions?: ParamOptions\n\t): ParamConstructorMap[T] | undefined {\n\t\treturn this._paramsController?.addParam(type, name, default_value, options);\n\t}\n\tparamDefaultValue(name: string): ParamInitValueSerialized {\n\t\treturn null;\n\t}\n\n\t// cook\n\tcook(inputContents: any[]): any {\n\t\treturn null;\n\t}\n\t/**\n\t * registers a callback that will be run every time the node finishes cooking.\n\t *\n\t */\n\tonCookEnd(callbackName: string, callback: OnCookCompleteHook) {\n\t\tthis.cookController.registerOnCookEnd(callbackName, callback);\n\t}\n\n\t/**\n\t * returns a promise that will be resolved when the node finishes cooking.\n\t *\n\t */\n\tasync compute() {\n\t\tif (this.isDirty() || this.flags?.bypass?.active()) {\n\t\t\treturn await this.containerController.compute();\n\t\t} else {\n\t\t\treturn this.containerController.container();\n\t\t}\n\t}\n\t_setContainer(content: ContainableMap[NC] /*, message: string | null = null*/) {\n\t\t// TODO: typescript: why is this a type of never\n\t\tthis.containerController.container().set_content(content as never); //, this.self.cook_eval_key());\n\t\t// if (content != null) {\n\t\t// \t// if (content.name==null) {\n\t\t// \t// \tcontent.name = this.path();\n\t\t// \t// }\n\t\t// \t// if (!(content as any).node) {\n\t\t// \t// \t(content as any).node = this;\n\t\t// \t// }\n\t\t// }\n\t\tthis.cookController.endCook(/*message*/);\n\t}\n\n\t/**\n\t * create a node.\n\t *\n\t */\n\tcreateNode(nodeClass: any, options?: NodeCreateOptions) {\n\t\treturn this.childrenController?.createNode(nodeClass, options);\n\t}\n\tcreateOperationContainer(type: string, operation_container_name: string, options?: NodeCreateOptions) {\n\t\treturn this.childrenController?.createOperationContainer(type, operation_container_name, options);\n\t}\n\t/**\n\t * removes a child node\n\t *\n\t */\n\tremoveNode(node: BaseNodeType) {\n\t\tthis.childrenController?.removeNode(node);\n\t}\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis.setParent(null);\n\t\tif (this._nameController) {\n\t\t\tthis._nameController.dispose();\n\t\t\tthis._nameController = undefined;\n\t\t}\n\t\tif (this._io) {\n\t\t\tthis._io.dispose();\n\t\t\tthis._io = undefined;\n\t\t}\n\t\tif (this._lifecycle) {\n\t\t\tthis._lifecycle.dispose();\n\t\t\tthis._lifecycle = undefined;\n\t\t}\n\t\tif (this.displayNodeController) {\n\t\t\tthis.displayNodeController.dispose();\n\t\t\t// this.displayNodeController = undefined\n\t\t}\n\t\tif (this._childrenController) {\n\t\t\tthis._childrenController.dispose();\n\t\t\tthis._childrenController = undefined;\n\t\t}\n\t\tif (this._paramsController) {\n\t\t\tthis._paramsController.dispose();\n\t\t\tthis._paramsController = undefined;\n\t\t}\n\t\tif (this._cookController) {\n\t\t\tthis._cookController.dispose();\n\t\t\tthis._cookController = undefined;\n\t\t}\n\t\tif (this._serializer) {\n\t\t\tthis._serializer.dispose();\n\t\t\tthis._serializer = undefined;\n\t\t}\n\t\tif (this._uiData) {\n\t\t\tthis._uiData.dispose();\n\t\t\tthis._uiData = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * returns the list of children\n\t *\n\t */\n\tchildren(): Readonly<BaseNodeType[]> {\n\t\treturn this.childrenController?.children() || [];\n\t}\n\t/**\n\t * returns a child node\n\t *\n\t */\n\tnode(path: string) {\n\t\treturn this.parentController?.findNode(path) || null;\n\t}\n\t/**\n\t * returns a sibling node\n\t *\n\t */\n\tnodeSibling(name: string): BaseNodeByContextMap[NC] | null {\n\t\tconst parent = this.parent();\n\t\tif (parent) {\n\t\t\tconst node = parent.childrenController?.childByName(name);\n\t\t\tif (node) {\n\t\t\t\treturn node as BaseNodeByContextMap[NC];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t/**\n\t * returns the children matching the type\n\t *\n\t */\n\tnodesByType(type: string) {\n\t\treturn this.childrenController?.nodesByType(type) || [];\n\t}\n\n\t/**\n\t * sets a node as input\n\t *\n\t */\n\tsetInput(\n\t\tinputIndexOrName: number | string,\n\t\tnode: BaseNodeByContextMap[NC] | null,\n\t\toutputIndexOrName?: number | string,\n\t\toptions?: SetInputsOptions\n\t) {\n\t\tthis.io.inputs.setInput(inputIndexOrName, node, outputIndexOrName, options);\n\t}\n\n\t// emit\n\temit(event_name: NodeEvent.CREATED, data: EmitDataByNodeEventMap[NodeEvent.CREATED]): void;\n\temit(event_name: NodeEvent.DELETED, data: EmitDataByNodeEventMap[NodeEvent.DELETED]): void;\n\temit(event_name: NodeEvent.NAME_UPDATED): void;\n\temit(event_name: NodeEvent.OVERRIDE_CLONABLE_STATE_UPDATE): void;\n\temit(event_name: NodeEvent.NAMED_INPUTS_UPDATED): void;\n\temit(event_name: NodeEvent.NAMED_OUTPUTS_UPDATED): void;\n\temit(event_name: NodeEvent.INPUTS_UPDATED): void;\n\temit(event_name: NodeEvent.PARAMS_UPDATED): void;\n\temit(event_name: NodeEvent.UI_DATA_POSITION_UPDATED): void;\n\temit(event_name: NodeEvent.UI_DATA_COMMENT_UPDATED): void;\n\temit(event_name: NodeEvent.ERROR_UPDATED): void;\n\temit(event_name: NodeEvent.FLAG_BYPASS_UPDATED): void;\n\temit(event_name: NodeEvent.FLAG_DISPLAY_UPDATED): void;\n\temit(event_name: NodeEvent.FLAG_OPTIMIZE_UPDATED): void;\n\temit(event_name: NodeEvent.SELECTION_UPDATED): void;\n\temit(event_name: NodeEvent.POLY_NODE_LOCK_STATE_UPDATED): void;\n\temit(event_name: NodeEvent, data: object | null = null): void {\n\t\tthis.scene().dispatchController.dispatch(this, event_name, data);\n\t}\n\tprivate __eventsDispatcher: EventDispatcher<{[ANY_STRING]:any}> | undefined;\n\tprivate _eventsDispatcher() {\n\t\treturn (this.__eventsDispatcher = this.__eventsDispatcher || new EventDispatcher());\n\t}\n\tdispatchEvent(event: BaseEvent<string>) {\n\t\tthis._eventsDispatcher().dispatchEvent(event);\n\t}\n\taddEventListener(type: string, listener: NodeEventListener) {\n\t\tthis._eventsDispatcher().addEventListener(type as AnyString, listener);\n\t}\n\tremoveEventListener(type: string, listener: NodeEventListener) {\n\t\tthis._eventsDispatcher().removeEventListener(type as AnyString, listener);\n\t}\n\n\t// serializer\n\ttoJSON(includeParamComponents: boolean = false) {\n\t\tif (!this._serializer) {\n\t\t\treturn;\n\t\t}\n\t\treturn this._serializer.toJSON(includeParamComponents);\n\t}\n\n\t// modules\n\tpublic requiredModules(): ModuleName[] | void {}\n\tpublic usedAssembler(): AssemblerName | void {}\n\tpublic integrationData(): IntegrationData | void {}\n\n\t// poly nodes\n\tpublic readonly polyNodeController: PolyNodeController | undefined;\n\n\t// error processing\n\tprocessError(e: unknown) {\n\t\treturn e;\n\t}\n\n\tpublic updateObjectOnAdd(object: ObjectContent<CoreObjectType>, parent: ObjectContent<CoreObjectType>) {}\n\tpublic updateObjectOnRemove(object: ObjectContent<CoreObjectType>, parent: ObjectContent<CoreObjectType>) {}\n}\n\nexport type BaseNodeType = TypedNode<any, any>;\nexport class BaseNodeClass extends TypedNode<any, any> {}\n\nexport class BaseNodeClassWithDisplayFlag extends TypedNode<any, any> {\n\tpublic override readonly flags: FlagsControllerD = new FlagsControllerD(this);\n}\n","/**\n * shows controls to play and pause animation properties\n *\n */\nimport {TypedAnimNode} from './_Base';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\nimport {BaseNodeType} from '../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {Poly} from '../../Poly';\nimport {gsapTimeline, GsapCoreTimeline} from '../../../core/thirdParty/gsap/gsapFactory';\n\nclass NullAnimParamsConfig extends NodeParamsConfig {\n\t/** @param play the animations */\n\tplay = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tNullAnimNode.PARAM_CALLBACK_play(node as NullAnimNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param pause the animations */\n\tpause = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tNullAnimNode.PARAM_CALLBACK_pause(node as NullAnimNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param sets if the animations created can be stopped when a new animation in generated on the same property */\n\tstoppable = ParamConfig.BOOLEAN(1);\n\t/** @param toggle to see debug infos printed in the console */\n\tdebug = ParamConfig.BOOLEAN(0);\n}\nconst ParamsConfig = new NullAnimParamsConfig();\n\nexport class NullAnimNode extends TypedAnimNode<NullAnimParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'null';\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t}\n\n\toverride cook(inputContents: TimelineBuilder[]) {\n\t\tconst timelineBuilder = inputContents[0] || new TimelineBuilder();\n\t\ttimelineBuilder.setDebug(isBooleanTrue(this.pv.debug));\n\t\ttimelineBuilder.setStoppable(this.pv.stoppable);\n\t\tthis.setTimelineBuilder(timelineBuilder);\n\t}\n\n\t// private _timelineBuilder: TimelineBuilder | undefined;\n\tprivate _timeline: GsapCoreTimeline | undefined;\n\tasync timelineBuilder() {\n\t\tconst container = await this.compute();\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\t\tconst timelineBuilder = container.coreContent();\n\t\tif (!timelineBuilder) {\n\t\t\treturn;\n\t\t}\n\t\treturn timelineBuilder;\n\t}\n\tasync play(): Promise<void> {\n\t\treturn new Promise(async (playResolve) => {\n\t\t\tif (isBooleanTrue(this.pv.debug)) {\n\t\t\t\tPoly.log(`play from '${this.path()}'`);\n\t\t\t}\n\n\t\t\tlet resolved = false;\n\t\t\tfunction resolveOnce() {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tplayResolve();\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst timelineBuilder = await this.timelineBuilder();\n\t\t\tif (!timelineBuilder) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._timeline = gsapTimeline({onComplete: resolveOnce});\n\t\t\tif (!this._timeline) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttimelineBuilder.populate(this._timeline, {registerproperties: true});\n\t\t\t// if the timeline is empty, we resolve the promise now\n\t\t\t// not needed since gsap 3.7.0 ( https://github.com/greensock/GSAP/issues/448 )\n\t\t\t// if (this._timeline.getChildren().length == 0 || this._timeline.totalDuration() == 0) {\n\t\t\t// \tPoly.warn(`timeline created by ${this.path()} is empty`);\n\t\t\t// \tresolveOnce();\n\t\t\t// }\n\t\t});\n\t}\n\tasync pause() {\n\t\tif (this._timeline) {\n\t\t\tthis._timeline.pause();\n\t\t}\n\t}\n\tstatic PARAM_CALLBACK_play(node: NullAnimNode) {\n\t\tnode.play();\n\t}\n\tstatic PARAM_CALLBACK_pause(node: NullAnimNode) {\n\t\tnode.pause();\n\t}\n}\n","/**\n * shows controls to play, reset and seek an animation setup\n *\n */\nimport {TypedAnimNode} from './_Base';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\nimport {BaseNodeType} from '../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {Poly} from '../../Poly';\nimport {GsapCoreTimeline, gsapLib, gsapTimeline} from '../../../core/thirdParty/gsap/gsapFactory';\nimport {AnimType} from '../../poly/registers/nodes/types/Anim';\n\nclass PlayAnimParamsConfig extends NodeParamsConfig {\n\t/** @param play the animations */\n\tplay = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tPlayAnimNode.PARAM_CALLBACK_play(node as PlayAnimNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param pause the animations */\n\tpause = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tPlayAnimNode.PARAM_CALLBACK_pause(node as PlayAnimNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param reset the animations */\n\treset = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tPlayAnimNode.PARAM_CALLBACK_reset(node as PlayAnimNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param sets if the animations created can be stopped when a new animation in generated on the same property */\n\tstoppable = ParamConfig.BOOLEAN(1);\n\t/** @param toggle to see debug infos printed in the console */\n\tdebug = ParamConfig.BOOLEAN(0);\n\n\t/** @param seek */\n\tseek = ParamConfig.FLOAT(0, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, true],\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tPlayAnimNode.PARAM_CALLBACK_seek(node as PlayAnimNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new PlayAnimParamsConfig();\n\nexport class PlayAnimNode extends TypedAnimNode<PlayAnimParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tpublic gsap = gsapLib(); // give access to gsap to external scripts\n\tstatic override type() {\n\t\treturn AnimType.PLAY;\n\t}\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(2);\n\t}\n\n\toverride cook(inputContents: TimelineBuilder[]) {\n\t\tconst timelineBuilder = inputContents[0] || new TimelineBuilder();\n\t\tthis.setTimelineBuilder(timelineBuilder);\n\t}\n\n\t// private _timelineBuilder: TimelineBuilder | undefined;\n\tprivate _timeline: GsapCoreTimeline | undefined;\n\tasync timelineBuilder(inputIndex: number) {\n\t\tconst inputNode = this.io.inputs.input(inputIndex);\n\t\tif (!inputNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst container = await inputNode.compute();\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\t\tconst timelineBuilder = container.coreContentCloned();\n\t\tif (!timelineBuilder) {\n\t\t\treturn;\n\t\t}\n\t\ttimelineBuilder.setDebug(isBooleanTrue(this.pv.debug));\n\t\ttimelineBuilder.setStoppable(this.pv.stoppable);\n\n\t\treturn timelineBuilder;\n\t}\n\tprivate async _playFromInput(inputIndex: number): Promise<void> {\n\t\treturn new Promise(async (playResolve) => {\n\t\t\tlet resolved = false;\n\t\t\tfunction resolveOnce() {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tplayResolve();\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst timelineBuilder = await this.timelineBuilder(inputIndex);\n\t\t\tif (!timelineBuilder) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._timeline = gsapTimeline({onComplete: resolveOnce});\n\t\t\tif (!this._timeline) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttimelineBuilder.populate(this._timeline, {registerproperties: true});\n\t\t});\n\t}\n\tasync play(): Promise<void> {\n\t\tif (isBooleanTrue(this.pv.debug)) {\n\t\t\tPoly.log(`play from '${this.path()}'`);\n\t\t}\n\t\treturn await this._playFromInput(1);\n\t}\n\tasync reset(): Promise<void> {\n\t\tif (isBooleanTrue(this.pv.debug)) {\n\t\t\tPoly.log(`reset from '${this.path()}'`);\n\t\t}\n\t\treturn await this._playFromInput(0);\n\t}\n\tasync pause() {\n\t\tif (this._timeline) {\n\t\t\tthis._timeline.pause();\n\t\t}\n\t}\n\tasync seek() {\n\t\tconst timelineBuilder0 = await this.timelineBuilder(0);\n\t\tconst timelineBuilder1 = await this.timelineBuilder(1);\n\t\tif (!(timelineBuilder0 && timelineBuilder1)) {\n\t\t\treturn;\n\t\t}\n\t\t// reset\n\t\tconst timeline0 = gsapTimeline({paused: true});\n\t\tif (!timeline0) {\n\t\t\treturn;\n\t\t}\n\t\ttimelineBuilder0.populate(timeline0, {registerproperties: false});\n\t\ttimeline0.seek(timeline0.duration());\n\t\ttimeline0.kill();\n\n\t\t// seek\n\t\tconst timeline1 = gsapTimeline({paused: true});\n\t\tif (!timeline1) {\n\t\t\treturn;\n\t\t}\n\t\ttimelineBuilder1.populate(timeline1, {registerproperties: false});\n\t\ttimeline1.seek(this.pv.seek * timeline1.duration(), false);\n\t\ttimeline1.kill();\n\t}\n\tstatic PARAM_CALLBACK_play(node: PlayAnimNode) {\n\t\tnode.play();\n\t}\n\tstatic PARAM_CALLBACK_pause(node: PlayAnimNode) {\n\t\tnode.pause();\n\t}\n\tstatic PARAM_CALLBACK_reset(node: PlayAnimNode) {\n\t\tnode.reset();\n\t}\n\tstatic PARAM_CALLBACK_seek(node: PlayAnimNode) {\n\t\tnode.seek();\n\t}\n}\n","/**\n * Name of the property the animation will be applied to\n *\n *\n */\nimport {TypedAnimNode} from './_Base';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nclass PropertyNameAnimParamsConfig extends NodeParamsConfig {\n\t/** @param name */\n\tname = ParamConfig.STRING('position');\n}\nconst ParamsConfig = new PropertyNameAnimParamsConfig();\n\nexport class PropertyNameAnimNode extends TypedAnimNode<PropertyNameAnimParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'propertyName';\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t}\n\n\toverride cook(inputContents: TimelineBuilder[]) {\n\t\tconst timelineBuilder = inputContents[0] || new TimelineBuilder();\n\n\t\ttimelineBuilder.setPropertyName(this.pv.name);\n\n\t\tthis.setTimelineBuilder(timelineBuilder);\n\t}\n}\n","/**\n * A subnet to create ANIM nodes\n *\n */\nimport {TypedAnimNode} from './_Base';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {NetworkNodeType, NodeContext} from '../../poly/NodeContext';\nimport {AnimNodeChildrenMap} from '../../poly/registers/nodes/Anim';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {BaseAnimNodeType} from './_Base';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\nimport {SubnetOutputAnimNode} from './SubnetOutput';\nclass ParamLessSubnetAnimParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new ParamLessSubnetAnimParamsConfig();\n\nexport class BaseSubnetAnimNode<K extends NodeParamsConfig> extends TypedAnimNode<K> {\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 4);\n\t}\n\n\tprotected override _childrenControllerContext = NodeContext.ANIM;\n\n\toverride createNode<S extends keyof AnimNodeChildrenMap>(\n\t\tnodeClass: S,\n\t\toptions?: NodeCreateOptions\n\t): AnimNodeChildrenMap[S];\n\toverride createNode<K extends valueof<AnimNodeChildrenMap>>(\n\t\tnodeClass: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<AnimNodeChildrenMap>>(\n\t\tnodeClass: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(nodeClass, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseAnimNodeType[];\n\t}\n\toverride nodesByType<K extends keyof AnimNodeChildrenMap>(type: K): AnimNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as AnimNodeChildrenMap[K][];\n\t}\n\n\toverride async cook(inputContents: TimelineBuilder[]) {\n\t\tconst subnetOutput = this.nodesByType(SubnetOutputAnimNode.type())[0];\n\t\tif (!subnetOutput) {\n\t\t\tthis.states.error.set('no output node found inside subnet');\n\t\t\treturn this.cookController.endCook();\n\t\t}\n\t\tconst container = await subnetOutput.compute();\n\t\tconst timelineBuilder = container.coreContent();\n\t\tif (!timelineBuilder) {\n\t\t\tthis.states.error.set('invalid subnetOutput');\n\t\t\treturn this.cookController.endCook();\n\t\t}\n\t\tthis.setTimelineBuilder(timelineBuilder);\n\t}\n}\n\nexport class SubnetAnimNode extends BaseSubnetAnimNode<ParamLessSubnetAnimParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn NetworkNodeType.SUBNET;\n\t}\n}\n","/**\n * Sets which node is used as the output of a parent subnet node.\n *\n * @remarks\n * Can only be created inside a subnet ANIM node.\n *\n */\nimport {TypedAnimNode} from './_Base';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {NetworkChildNodeType} from '../../poly/NodeContext';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\nclass AnimSubnetOutputSopParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new AnimSubnetOutputSopParamsConfig();\n\nexport class SubnetOutputAnimNode extends TypedAnimNode<AnimSubnetOutputSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<NetworkChildNodeType.OUTPUT> {\n\t\treturn NetworkChildNodeType.OUTPUT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.outputs.setHasNoOutput();\n\n\t\tthis.lifecycle.onAfterAdded(this._setParentDirtyBound);\n\t\tthis.addPostDirtyHook('makeParentDirty', this._setParentDirtyBound);\n\t}\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis._setParentDirty();\n\t}\n\n\toverride cook(inputContents: TimelineBuilder[]) {\n\t\tconst timelineBuilder = inputContents[0];\n\t\tthis.setTimelineBuilder(timelineBuilder);\n\t}\n\n\tprivate _setParentDirtyBound = this._setParentDirty.bind(this);\n\tprivate _setParentDirty() {\n\t\tthis.parent()?.setDirty();\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {FlagsControllerB} from '../utils/FlagsController';\nimport {TimelineBuilder} from '../../../core/animation/TimelineBuilder';\nimport {ModuleName} from '../../poly/registers/modules/Common';\n\n/**\n *\n *\n * TypedAnimNode is the base class for all nodes that process animations. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\nexport class TypedAnimNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.ANIM, K> {\n\tpublic override readonly flags: FlagsControllerB = new FlagsControllerB(this);\n\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.ANIM;\n\t}\n\toverride requiredModules() {\n\t\treturn [ModuleName.GSAP];\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis.io.outputs.setHasOneOutput();\n\t}\n\tprotected setTimelineBuilder(timeline_builder: TimelineBuilder) {\n\t\tthis._setContainer(timeline_builder);\n\t}\n}\n\nexport type BaseAnimNodeType = TypedAnimNode<NodeParamsConfig>;\nexport class BaseAnimNodeClass extends TypedAnimNode<NodeParamsConfig> {}\n","/**\n * imports an audio file\n *\n *\n */\nimport {TypedAudioNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {AudioBuilder} from '../../../core/audio/AudioBuilder';\nimport {Player} from 'tone/build/esm/source/buffer/Player';\nimport {CoreLoaderAudio} from '../../../core/loader/Audio';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {BaseNodeType} from '../_Base';\nimport {Poly} from '../../Poly';\nimport {\n\tAudioPlayerCallbacksManager,\n\tOnBeforePlayCallback,\n\tOnPlaySuccessCallback,\n\tOnPlayErrorCallback,\n\tOnStopCallback,\n\tPlayerCallbacks,\n\tPlayerEventName,\n\tCallbackByEventName,\n} from './../../../core/audio/PlayerCallbacksManager';\nimport {AudioType} from '../../poly/registers/nodes/types/Audio';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\nconst EPSILON = 1e-6;\n\nconst LOOP_OPTIONS = {\n\tcook: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tFileAudioNode.PARAM_CALLBACK_updateLoop(node as FileAudioNode);\n\t},\n};\n\nclass FileAudioParamsConfig extends NodeParamsConfig {\n\t/** @param url to fetch the audio file from */\n\turl = ParamConfig.STRING('', {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.AUDIO][AudioType.FILE]},\n\t});\n\t/** @param auto start */\n\tautostart = ParamConfig.BOOLEAN(1);\n\n\t/** @param duration */\n\tduration = ParamConfig.FLOAT(-1, {\n\t\tcook: false,\n\t\teditable: false,\n\t});\n\t/** @param display currentTime param */\n\tupdateCurrentTimeParam = ParamConfig.BOOLEAN(0, {\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_updateUpdateCurrentTimeParam(node as FileAudioNode);\n\t\t},\n\t});\n\t/** @param currentTime */\n\tcurrentTime = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {updateCurrentTimeParam: 1},\n\t\trange: [0, 100],\n\t\teditable: false,\n\t\tcook: false,\n\t});\n\n\t/** @param loop */\n\tloop = ParamConfig.BOOLEAN(1, {\n\t\t...LOOP_OPTIONS,\n\t});\n\t/** @param useLoopRange */\n\t// useLoopRange = ParamConfig.BOOLEAN(0, {\n\t// \tvisibleIf: {loop: 1},\n\t// \t...LOOP_OPTIONS,\n\t// });\n\t/** @param loop Range */\n\t// loopRange = ParamConfig.VECTOR2([-1, -1], {\n\t// \tvisibleIf: {loop: 1, useLoopRange: 1},\n\t// \t...LOOP_OPTIONS,\n\t// });\n\n\t/** @param play the audio */\n\tplay = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_play(node as FileAudioNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param stop the audio */\n\tpause = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_pause(node as FileAudioNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param restart the audio */\n\trestart = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_restart(node as FileAudioNode);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param seek 10 seconds back */\n\tseekM10 = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_seekOffset(node as FileAudioNode, -10);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param seek 5 seconds back */\n\tseekM5 = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_seekOffset(node as FileAudioNode, -5);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param seek 5 seconds forward */\n\tseekP5 = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_seekOffset(node as FileAudioNode, +5);\n\t\t},\n\t\thidden: true,\n\t});\n\t/** @param seek 10 seconds forward */\n\tseekP10 = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileAudioNode.PARAM_CALLBACK_seekOffset(node as FileAudioNode, +10);\n\t\t},\n\t\thidden: true,\n\t});\n}\nconst ParamsConfig = new FileAudioParamsConfig();\n\nexport class FileAudioNode extends TypedAudioNode<FileAudioParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn AudioType.FILE;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tif (this._player) {\n\t\t\tthis.pause();\n\t\t\tthis._player.dispose();\n\t\t}\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\n\tprivate _startedAt: number | undefined;\n\tprivate _stoppedAt: number = 0;\n\n\toverride async cook(inputContents: AudioBuilder[]) {\n\t\tawait this._loadUrl();\n\t\tthis._updateOnTickHook();\n\t\tif (this._player) {\n\t\t\tconst audioBuilder = new AudioBuilder();\n\t\t\taudioBuilder.setSource(this._player);\n\t\t\tthis.setAudioBuilder(audioBuilder);\n\t\t} else {\n\t\t\tthis.cookController.endCook();\n\t\t}\n\t}\n\tprivate _player: Player | undefined;\n\tprivate async _loadUrl(): Promise<Player | void> {\n\t\ttry {\n\t\t\tconst loader = new CoreLoaderAudio(this.pv.url, this);\n\t\t\tconst buffer: AudioBuffer = await loader.load();\n\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tif (this._player) {\n\t\t\t\t\tthis._player.dispose();\n\t\t\t\t}\n\n\t\t\t\tconst player = new Player({\n\t\t\t\t\turl: buffer,\n\t\t\t\t\tloop: isBooleanTrue(this.pv.loop),\n\t\t\t\t\tvolume: 0,\n\t\t\t\t\t// no onload event if a buffer is provided instead of a url\n\t\t\t\t\t// onload: () => {\n\t\t\t\t\t// \tresolve(player);\n\t\t\t\t\t// },\n\t\t\t\t\t// make sure to have the param loop set to false for the onstop callbacks to be run.\n\t\t\t\t\tonstop: () => {\n\t\t\t\t\t\tthis._runOnStop(player);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tthis._player = player;\n\n\t\t\t\tthis._reset();\n\t\t\t\tthis.p.duration.set(buffer.duration);\n\t\t\t\t// this.p.loopRange.set([0, buffer.duration]);\n\t\t\t\tif (isBooleanTrue(this.pv.autostart)) {\n\t\t\t\t\tthis.play();\n\t\t\t\t}\n\t\t\t\tAudioPlayerCallbacksManager.registerPlayer(this._player);\n\t\t\t\tresolve(this._player);\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthis.states.error.set(`failed to load url '${this.pv.url}'`);\n\t\t\treturn;\n\t\t}\n\t}\n\tasync play() {\n\t\tif (!this._player) {\n\t\t\treturn;\n\t\t}\n\t\t// const offset = this._stoppedAt;\n\t\t// using pv.currentTime is useful when reloading the page\n\t\t// and still starting from where we were\n\t\tconst offset = isBooleanTrue(this.pv.updateCurrentTimeParam) ? this.pv.currentTime : this._currentTime();\n\t\t// always add 2 * EPSILON in the offset, which will not be noticeable\n\t\t// but helps avoiding errors when restarting\n\t\tconst sanitizedOffset = Math.max(offset + 2 * EPSILON, 0);\n\t\ttry {\n\t\t\tthis._runOnBeforePlay(this._player, sanitizedOffset);\n\t\t\tthis._player.start(0, sanitizedOffset);\n\t\t\tthis._runOnPlaySuccess(this._player);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\tthis._runOnPlayError(this._player, err);\n\t\t}\n\t\tthis._startedAt = this._player.now() - this._stoppedAt;\n\t\tthis._stoppedAt = 0;\n\t}\n\tasync pause() {\n\t\tif (!this._player) {\n\t\t\tconsole.warn('no player');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._player.state != 'started') {\n\t\t\tconsole.warn(`player state is not \"started\", but \"${this._player.state}\"`);\n\t\t\treturn;\n\t\t}\n\t\tif (this._startedAt != null) {\n\t\t\tconst elapsed = this._player.now() - this._startedAt;\n\t\t\tthis._stoppedAt = elapsed;\n\t\t}\n\t\tthis._player.stop();\n\t}\n\tprivate _reset() {\n\t\tthis._stoppedAt = 0;\n\t\tthis._startedAt = undefined;\n\t\tthis.p.currentTime.set(0);\n\t}\n\tasync restart() {\n\t\tif (!this._player) {\n\t\t\treturn;\n\t\t}\n\t\tthis._player.seek(0, 0);\n\t\tthis._reset();\n\t\tthis.play();\n\t}\n\tseekOffset(offset: number) {\n\t\tif (!this._player) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._startedAt == null) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentTime = this._currentTime();\n\t\tthis._startedAt -= offset;\n\t\tthis._player.seek(currentTime + offset);\n\t}\n\n\t/*\n\t * UPDATE CURRENT TIME PARAM\n\t */\n\tstatic PARAM_CALLBACK_updateUpdateCurrentTimeParam(node: FileAudioNode) {\n\t\tnode._updateCurrentTimeParam();\n\t\tnode._updateOnTickHook();\n\t}\n\n\tprivate _updateCurrentTimeParam() {\n\t\tif (!this._player) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentTime = this._currentTime();\n\t\tthis.p.currentTime.set(currentTime);\n\t}\n\tprivate _currentTime() {\n\t\tif (this._stoppedAt) {\n\t\t\treturn this._stoppedAt;\n\t\t}\n\t\tif (this._player && this._startedAt != null) {\n\t\t\tlet current = this._player.now() - this._startedAt;\n\t\t\tconst duration = this.pv.duration;\n\t\t\tif (current > duration) {\n\t\t\t\tcurrent -= duration;\n\t\t\t}\n\t\t\treturn current;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/*\n\t * LOOP\n\t */\n\tstatic PARAM_CALLBACK_updateLoop(node: FileAudioNode) {\n\t\tnode._updateLoop();\n\t}\n\tprivate _updateLoop() {\n\t\tif (!this._player) {\n\t\t\treturn;\n\t\t}\n\t\tthis._player.loop = this.pv.loop;\n\t\t// if (this._player.loop) {\n\t\t// \tif (isBooleanTrue(this.pv.useLoopRange)) {\n\t\t// \t\tthis._player.setLoopPoints(this.pv.loopRange.x, this.pv.loopRange.y);\n\t\t// \t}\n\t\t// }\n\t}\n\t/*\n\t * REGISTER TICK CALLBACK\n\t */\n\tprivate _updateOnTickHook() {\n\t\tif (isBooleanTrue(this.pv.updateCurrentTimeParam)) {\n\t\t\tthis._registerOnTickHook();\n\t\t} else {\n\t\t\tthis._unRegisterOnTickHook();\n\t\t}\n\t}\n\tprivate async _registerOnTickHook() {\n\t\tif (this.scene().registeredBeforeTickCallbacks().has(this._tickCallbackName())) {\n\t\t\treturn;\n\t\t}\n\t\tthis.scene().registerOnBeforeTick(this._tickCallbackName(), this._updateCurrentTimeParam.bind(this));\n\t}\n\tprivate async _unRegisterOnTickHook() {\n\t\tthis.scene().unRegisterOnBeforeTick(this._tickCallbackName());\n\t}\n\tprivate _tickCallbackName() {\n\t\treturn `audio/File-${this.graphNodeId()}`;\n\t}\n\n\t/*\n\t * STATIC CALLBACKS\n\t */\n\tstatic PARAM_CALLBACK_seekOffset(node: FileAudioNode, offset: number) {\n\t\tnode.seekOffset(offset);\n\t}\n\tstatic PARAM_CALLBACK_play(node: FileAudioNode) {\n\t\tnode.play();\n\t}\n\tstatic PARAM_CALLBACK_pause(node: FileAudioNode) {\n\t\tnode.pause();\n\t}\n\tstatic PARAM_CALLBACK_restart(node: FileAudioNode) {\n\t\tnode.restart();\n\t}\n\n\t/*\n\t * HOOKS\n\t */\n\n\tprivate _playerCallbacks: PlayerCallbacks = {};\n\t// onBeforePlay\n\tonBeforePlay(callback: OnBeforePlayCallback) {\n\t\tthis._on('onBeforePlay', callback);\n\t}\n\tprivate _runOnBeforePlay(player: Player, offset: number) {\n\t\tthis._playerCallbacks.onBeforePlay?.forEach((callback) => callback(offset));\n\t\tAudioPlayerCallbacksManager.runOnBeforePlayCallbacks(player, offset);\n\t}\n\n\t// onPlaySuccess\n\tonPlaySuccess(callback: OnPlaySuccessCallback) {\n\t\tthis._on('onPlaySuccess', callback);\n\t}\n\tprivate _runOnPlaySuccess(player: Player) {\n\t\tthis._playerCallbacks.onPlaySuccess?.forEach((callback) => callback());\n\t\tAudioPlayerCallbacksManager.runOnPlaySuccessCallbacks(player);\n\t}\n\n\t// onPlayError\n\tonPlayError(callback: OnPlayErrorCallback) {\n\t\tthis._on('onPlayError', callback);\n\t}\n\tprivate _runOnPlayError(player: Player, err: unknown) {\n\t\tthis._playerCallbacks.onPlayError?.forEach((callback) => callback(err));\n\t\tAudioPlayerCallbacksManager.runOnPlayErrorCallbacks(player, err);\n\t}\n\n\t// onStop\n\tonStop(callback: OnStopCallback) {\n\t\tthis._on('onStop', callback);\n\t}\n\tremoveOnStop(callback: OnStopCallback) {\n\t\tthis._removeCallback('onStop', callback);\n\t}\n\tprivate _runOnStop(player: Player) {\n\t\tthis._playerCallbacks.onStop?.forEach((callback) => callback());\n\t\tAudioPlayerCallbacksManager.runOnStopCallbacks(player);\n\t}\n\t// generic\n\tprivate _on<E extends PlayerEventName>(eventName: E, callback: CallbackByEventName[E]) {\n\t\tthis._playerCallbacks[eventName] = this._playerCallbacks[eventName] || (new Set() as any);\n\t\tthis._playerCallbacks[eventName]?.add(callback as any);\n\t}\n\tprivate _removeCallback<E extends PlayerEventName>(eventName: E, callback: CallbackByEventName[E]) {\n\t\tthis._playerCallbacks[eventName]?.delete(callback as any);\n\t}\n}\n","/**\n * this node does not change its input, but displays a piano 🎹 to play the instrument (such as a synthetizer) from the input, if there is one.\n *\n *\n */\nimport {TypedAudioNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {AudioBuilder} from '../../../core/audio/AudioBuilder';\nimport {ALL_NOTES, DEFAULT_NOTE} from '../../../core/audio/Notes';\n\nclass PlayInstrumentAudioParamsConfig extends NodeParamsConfig {\n\t/** @param note */\n\tnote = ParamConfig.STRING(DEFAULT_NOTE, {\n\t\tmenuString: {\n\t\t\tentries: ALL_NOTES.sort().map((note) => {\n\t\t\t\treturn {value: note, name: note};\n\t\t\t}),\n\t\t},\n\t\tcook: false,\n\t});\n\t/** @param duration */\n\tduration = ParamConfig.FLOAT(0.125, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t\tcook: false,\n\t});\n\t/** @param play the audio */\n\t// play = ParamConfig.BUTTON(null, {\n\t// \tcallback: (node: BaseNodeType) => {\n\t// \t\tPlayInstrumentAudioNode.PARAM_CALLBACK_play(node as PlayInstrumentAudioNode);\n\t// \t},\n\t// });\n\t/** @param stop the audio */\n\t// stop = ParamConfig.BUTTON(null, {\n\t// \tcallback: (node: BaseNodeType) => {\n\t// \t\tPlayInstrumentAudioNode.PARAM_CALLBACK_stop(node as PlayInstrumentAudioNode);\n\t// \t},\n\t// });\n\tshowNotes = ParamConfig.BOOLEAN(0, {separatorBefore: true});\n\tshowKeys = ParamConfig.BOOLEAN(0);\n\tstartOctave = ParamConfig.INTEGER(2, {range: [1, 8], rangeLocked: [false, false]});\n\tendOctave = ParamConfig.INTEGER(4, {range: [1, 8], rangeLocked: [false, false]});\n\tupdateNoteFromInstrument = ParamConfig.BOOLEAN(0);\n}\nconst ParamsConfig = new PlayInstrumentAudioParamsConfig();\n\nexport class PlayInstrumentAudioNode extends TypedAudioNode<PlayInstrumentAudioParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'playInstrument';\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t}\n\n\toverride cook(inputContents: AudioBuilder[]) {\n\t\tconst audioBuilder = inputContents[0];\n\t\tthis.setAudioBuilder(audioBuilder);\n\t}\n\tasync play(): Promise<void> {\n\t\tconst instrument = await this._getInstrument();\n\t\tif (!instrument) {\n\t\t\tconsole.log('no instrument');\n\t\t\treturn;\n\t\t}\n\t\t// await AudioController.start();\n\t\tinstrument.triggerAttackRelease(this.pv.note, this.pv.duration);\n\t}\n\t// async stop() {\n\t// \tconst instrument = await this._getInstrument();\n\t// \tif (!instrument) {\n\t// \t\treturn;\n\t// \t}\n\t// \t// TODO: find out how to properly call triggerRelease, without or without the argument\n\t// }\n\tprivate async _getInstrument() {\n\t\tif (this.isDirty()) {\n\t\t\tawait this.compute();\n\t\t}\n\t\tconst audioBuilder = this.containerController.container().coreContent();\n\t\tif (!audioBuilder) {\n\t\t\treturn;\n\t\t}\n\t\treturn audioBuilder.instrument();\n\t}\n\n\t// static PARAM_CALLBACK_play(node: PlayInstrumentAudioNode) {\n\t// \tnode.play();\n\t// }\n\t// static PARAM_CALLBACK_stop(node: PlayInstrumentAudioNode) {\n\t// \tnode.stop();\n\t// }\n}\n","import { Tone } from \"../Tone\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { noOp } from \"../util/Interface\";\nimport { isString } from \"../util/TypeCheck\";\nimport { ToneAudioBuffer } from \"./ToneAudioBuffer\";\nimport { assert } from \"../util/Debug\";\n/**\n * A data structure for holding multiple buffers in a Map-like datastructure.\n *\n * @example\n * const pianoSamples = new Tone.ToneAudioBuffers({\n * \tA1: \"https://tonejs.github.io/audio/casio/A1.mp3\",\n * \tA2: \"https://tonejs.github.io/audio/casio/A2.mp3\",\n * }, () => {\n * \tconst player = new Tone.Player().toDestination();\n * \t// play one of the samples when they all load\n * \tplayer.buffer = pianoSamples.get(\"A2\");\n * \tplayer.start();\n * });\n * @example\n * // To pass in additional parameters in the second parameter\n * const buffers = new Tone.ToneAudioBuffers({\n * \t urls: {\n * \t\t A1: \"A1.mp3\",\n * \t\t A2: \"A2.mp3\",\n * \t },\n * \t onload: () => console.log(\"loaded\"),\n * \t baseUrl: \"https://tonejs.github.io/audio/casio/\"\n * });\n * @category Core\n */\nexport class ToneAudioBuffers extends Tone {\n    constructor() {\n        super();\n        this.name = \"ToneAudioBuffers\";\n        /**\n         * All of the buffers\n         */\n        this._buffers = new Map();\n        /**\n         * Keep track of the number of loaded buffers\n         */\n        this._loadingCount = 0;\n        const options = optionsFromArguments(ToneAudioBuffers.getDefaults(), arguments, [\"urls\", \"onload\", \"baseUrl\"], \"urls\");\n        this.baseUrl = options.baseUrl;\n        // add each one\n        Object.keys(options.urls).forEach(name => {\n            this._loadingCount++;\n            const url = options.urls[name];\n            this.add(name, url, this._bufferLoaded.bind(this, options.onload), options.onerror);\n        });\n    }\n    static getDefaults() {\n        return {\n            baseUrl: \"\",\n            onerror: noOp,\n            onload: noOp,\n            urls: {},\n        };\n    }\n    /**\n     * True if the buffers object has a buffer by that name.\n     * @param  name  The key or index of the buffer.\n     */\n    has(name) {\n        return this._buffers.has(name.toString());\n    }\n    /**\n     * Get a buffer by name. If an array was loaded,\n     * then use the array index.\n     * @param  name  The key or index of the buffer.\n     */\n    get(name) {\n        assert(this.has(name), `ToneAudioBuffers has no buffer named: ${name}`);\n        return this._buffers.get(name.toString());\n    }\n    /**\n     * A buffer was loaded. decrement the counter.\n     */\n    _bufferLoaded(callback) {\n        this._loadingCount--;\n        if (this._loadingCount === 0 && callback) {\n            callback();\n        }\n    }\n    /**\n     * If the buffers are loaded or not\n     */\n    get loaded() {\n        return Array.from(this._buffers).every(([_, buffer]) => buffer.loaded);\n    }\n    /**\n     * Add a buffer by name and url to the Buffers\n     * @param  name      A unique name to give the buffer\n     * @param  url  Either the url of the bufer, or a buffer which will be added with the given name.\n     * @param  callback  The callback to invoke when the url is loaded.\n     * @param  onerror  Invoked if the buffer can't be loaded\n     */\n    add(name, url, callback = noOp, onerror = noOp) {\n        if (isString(url)) {\n            this._buffers.set(name.toString(), new ToneAudioBuffer(this.baseUrl + url, callback, onerror));\n        }\n        else {\n            this._buffers.set(name.toString(), new ToneAudioBuffer(url, callback, onerror));\n        }\n        return this;\n    }\n    dispose() {\n        super.dispose();\n        this._buffers.forEach(buffer => buffer.dispose());\n        this._buffers.clear();\n        return this;\n    }\n}\n//# sourceMappingURL=ToneAudioBuffers.js.map","import { __decorate } from \"tslib\";\nimport { ToneAudioBuffers } from \"../core/context/ToneAudioBuffers\";\nimport { ftomf, intervalToFrequencyRatio } from \"../core/type/Conversions\";\nimport { FrequencyClass } from \"../core/type/Frequency\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { noOp } from \"../core/util/Interface\";\nimport { isArray, isNote, isNumber } from \"../core/util/TypeCheck\";\nimport { Instrument } from \"../instrument/Instrument\";\nimport { ToneBufferSource } from \"../source/buffer/ToneBufferSource\";\nimport { timeRange } from \"../core/util/Decorator\";\nimport { assert } from \"../core/util/Debug\";\n/**\n * Pass in an object which maps the note's pitch or midi value to the url,\n * then you can trigger the attack and release of that note like other instruments.\n * By automatically repitching the samples, it is possible to play pitches which\n * were not explicitly included which can save loading time.\n *\n * For sample or buffer playback where repitching is not necessary,\n * use [[Player]].\n * @example\n * const sampler = new Tone.Sampler({\n * \turls: {\n * \t\tA1: \"A1.mp3\",\n * \t\tA2: \"A2.mp3\",\n * \t},\n * \tbaseUrl: \"https://tonejs.github.io/audio/casio/\",\n * \tonload: () => {\n * \t\tsampler.triggerAttackRelease([\"C1\", \"E1\", \"G1\", \"B1\"], 0.5);\n * \t}\n * }).toDestination();\n * @category Instrument\n */\nexport class Sampler extends Instrument {\n    constructor() {\n        super(optionsFromArguments(Sampler.getDefaults(), arguments, [\"urls\", \"onload\", \"baseUrl\"], \"urls\"));\n        this.name = \"Sampler\";\n        /**\n         * The object of all currently playing BufferSources\n         */\n        this._activeSources = new Map();\n        const options = optionsFromArguments(Sampler.getDefaults(), arguments, [\"urls\", \"onload\", \"baseUrl\"], \"urls\");\n        const urlMap = {};\n        Object.keys(options.urls).forEach((note) => {\n            const noteNumber = parseInt(note, 10);\n            assert(isNote(note)\n                || (isNumber(noteNumber) && isFinite(noteNumber)), `url key is neither a note or midi pitch: ${note}`);\n            if (isNote(note)) {\n                // convert the note name to MIDI\n                const mid = new FrequencyClass(this.context, note).toMidi();\n                urlMap[mid] = options.urls[note];\n            }\n            else if (isNumber(noteNumber) && isFinite(noteNumber)) {\n                // otherwise if it's numbers assume it's midi\n                urlMap[noteNumber] = options.urls[noteNumber];\n            }\n        });\n        this._buffers = new ToneAudioBuffers({\n            urls: urlMap,\n            onload: options.onload,\n            baseUrl: options.baseUrl,\n            onerror: options.onerror,\n        });\n        this.attack = options.attack;\n        this.release = options.release;\n        this.curve = options.curve;\n        // invoke the callback if it's already loaded\n        if (this._buffers.loaded) {\n            // invoke onload deferred\n            Promise.resolve().then(options.onload);\n        }\n    }\n    static getDefaults() {\n        return Object.assign(Instrument.getDefaults(), {\n            attack: 0,\n            baseUrl: \"\",\n            curve: \"exponential\",\n            onload: noOp,\n            onerror: noOp,\n            release: 0.1,\n            urls: {},\n        });\n    }\n    /**\n     * Returns the difference in steps between the given midi note at the closets sample.\n     */\n    _findClosest(midi) {\n        // searches within 8 octaves of the given midi note\n        const MAX_INTERVAL = 96;\n        let interval = 0;\n        while (interval < MAX_INTERVAL) {\n            // check above and below\n            if (this._buffers.has(midi + interval)) {\n                return -interval;\n            }\n            else if (this._buffers.has(midi - interval)) {\n                return interval;\n            }\n            interval++;\n        }\n        throw new Error(`No available buffers for note: ${midi}`);\n    }\n    /**\n     * @param  notes\tThe note to play, or an array of notes.\n     * @param  time     When to play the note\n     * @param  velocity The velocity to play the sample back.\n     */\n    triggerAttack(notes, time, velocity = 1) {\n        this.log(\"triggerAttack\", notes, time, velocity);\n        if (!Array.isArray(notes)) {\n            notes = [notes];\n        }\n        notes.forEach(note => {\n            const midiFloat = ftomf(new FrequencyClass(this.context, note).toFrequency());\n            const midi = Math.round(midiFloat);\n            const remainder = midiFloat - midi;\n            // find the closest note pitch\n            const difference = this._findClosest(midi);\n            const closestNote = midi - difference;\n            const buffer = this._buffers.get(closestNote);\n            const playbackRate = intervalToFrequencyRatio(difference + remainder);\n            // play that note\n            const source = new ToneBufferSource({\n                url: buffer,\n                context: this.context,\n                curve: this.curve,\n                fadeIn: this.attack,\n                fadeOut: this.release,\n                playbackRate,\n            }).connect(this.output);\n            source.start(time, 0, buffer.duration / playbackRate, velocity);\n            // add it to the active sources\n            if (!isArray(this._activeSources.get(midi))) {\n                this._activeSources.set(midi, []);\n            }\n            this._activeSources.get(midi).push(source);\n            // remove it when it's done\n            source.onended = () => {\n                if (this._activeSources && this._activeSources.has(midi)) {\n                    const sources = this._activeSources.get(midi);\n                    const index = sources.indexOf(source);\n                    if (index !== -1) {\n                        sources.splice(index, 1);\n                    }\n                }\n            };\n        });\n        return this;\n    }\n    /**\n     * @param  notes\tThe note to release, or an array of notes.\n     * @param  time     \tWhen to release the note.\n     */\n    triggerRelease(notes, time) {\n        this.log(\"triggerRelease\", notes, time);\n        if (!Array.isArray(notes)) {\n            notes = [notes];\n        }\n        notes.forEach(note => {\n            const midi = new FrequencyClass(this.context, note).toMidi();\n            // find the note\n            if (this._activeSources.has(midi) && this._activeSources.get(midi).length) {\n                const sources = this._activeSources.get(midi);\n                time = this.toSeconds(time);\n                sources.forEach(source => {\n                    source.stop(time);\n                });\n                this._activeSources.set(midi, []);\n            }\n        });\n        return this;\n    }\n    /**\n     * Release all currently active notes.\n     * @param  time     \tWhen to release the notes.\n     */\n    releaseAll(time) {\n        const computedTime = this.toSeconds(time);\n        this._activeSources.forEach(sources => {\n            while (sources.length) {\n                const source = sources.shift();\n                source.stop(computedTime);\n            }\n        });\n        return this;\n    }\n    sync() {\n        if (this._syncState()) {\n            this._syncMethod(\"triggerAttack\", 1);\n            this._syncMethod(\"triggerRelease\", 1);\n        }\n        return this;\n    }\n    /**\n     * Invoke the attack phase, then after the duration, invoke the release.\n     * @param  notes\tThe note to play and release, or an array of notes.\n     * @param  duration The time the note should be held\n     * @param  time     When to start the attack\n     * @param  velocity The velocity of the attack\n     */\n    triggerAttackRelease(notes, duration, time, velocity = 1) {\n        const computedTime = this.toSeconds(time);\n        this.triggerAttack(notes, computedTime, velocity);\n        if (isArray(duration)) {\n            assert(isArray(notes), \"notes must be an array when duration is array\");\n            notes.forEach((note, index) => {\n                const d = duration[Math.min(index, duration.length - 1)];\n                this.triggerRelease(note, computedTime + this.toSeconds(d));\n            });\n        }\n        else {\n            this.triggerRelease(notes, computedTime + this.toSeconds(duration));\n        }\n        return this;\n    }\n    /**\n     * Add a note to the sampler.\n     * @param  note      The buffer's pitch.\n     * @param  url  Either the url of the buffer, or a buffer which will be added with the given name.\n     * @param  callback  The callback to invoke when the url is loaded.\n     */\n    add(note, url, callback) {\n        assert(isNote(note) || isFinite(note), `note must be a pitch or midi: ${note}`);\n        if (isNote(note)) {\n            // convert the note name to MIDI\n            const mid = new FrequencyClass(this.context, note).toMidi();\n            this._buffers.add(mid, url, callback);\n        }\n        else {\n            // otherwise if it's numbers assume it's midi\n            this._buffers.add(note, url, callback);\n        }\n        return this;\n    }\n    /**\n     * If the buffers are loaded or not\n     */\n    get loaded() {\n        return this._buffers.loaded;\n    }\n    /**\n     * Clean up\n     */\n    dispose() {\n        super.dispose();\n        this._buffers.dispose();\n        this._activeSources.forEach(sources => {\n            sources.forEach(source => source.dispose());\n        });\n        this._activeSources.clear();\n        return this;\n    }\n}\n__decorate([\n    timeRange(0)\n], Sampler.prototype, \"attack\", void 0);\n__decorate([\n    timeRange(0)\n], Sampler.prototype, \"release\", void 0);\n//# sourceMappingURL=Sampler.js.map","/**\n * allows to import multiple audio files to use as samples\n *\n *\n */\nimport {TypedAudioNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {AudioBuilder} from '../../../core/audio/AudioBuilder';\nimport {Sampler, SamplerOptions} from 'tone/build/esm/instrument/Sampler';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {StringParamLanguage} from '../../params/utils/OptionsController';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {CoreLoaderAudio} from '../../../core/loader/Audio';\nimport {Poly} from '../../Poly';\nimport {AudioType} from '../../poly/registers/nodes/types/Audio';\n\nexport const SAMPLER_DEFAULTS: Partial<SamplerOptions> = {\n\tattack: 0.01,\n\trelease: 1,\n};\n\nconst DEFAULT_NOTE_MAP = {\n\tA0: 'A0',\n\tC1: 'C1',\n\t'D#1': 'Ds1',\n\t'F#1': 'Fs1',\n\tA1: 'A1',\n\tC2: 'C2',\n\t'D#2': 'Ds2',\n\t'F#2': 'Fs2',\n\tA2: 'A2',\n\tC3: 'C3',\n\t'D#3': 'Ds3',\n\t'F#3': 'Fs3',\n\tA3: 'A3',\n\tC4: 'C4',\n\t'D#4': 'Ds4',\n\t'F#4': 'Fs4',\n\tA4: 'A4',\n\tC5: 'C5',\n\t'D#5': 'Ds5',\n\t'F#5': 'Fs5',\n\tA5: 'A5',\n\tC6: 'C6',\n\t'D#6': 'Ds6',\n\t'F#6': 'Fs6',\n\tA6: 'A6',\n\tC7: 'C7',\n\t'D#7': 'Ds7',\n\t'F#7': 'Fs7',\n\tA7: 'A7',\n\tC8: 'C8',\n};\n\nclass SamplerAudioParamsConfig extends NodeParamsConfig {\n\t/** @param map of notes to load */\n\turlsMap = ParamConfig.STRING(JSON.stringify(DEFAULT_NOTE_MAP, null, 2), {\n\t\tlanguage: StringParamLanguage.JSON,\n\t});\n\t/** @param base url */\n\tbaseUrl = ParamConfig.STRING('./');\n\t/** @param extension */\n\textension = ParamConfig.STRING('mp3');\n}\nconst ParamsConfig = new SamplerAudioParamsConfig();\n\nexport class SamplerAudioNode extends TypedAudioNode<SamplerAudioParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn AudioType.SAMPLER;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\n\toverride async cook(inputContents: AudioBuilder[]) {\n\t\tconst envelopeBuilder = inputContents[0];\n\t\tconst envelopeParams = envelopeBuilder.envelopeParams() || SAMPLER_DEFAULTS;\n\n\t\tlet urlsJSON: PolyDictionary<string> = {};\n\t\tlet urls: string[] = [];\n\t\ttry {\n\t\t\tconst extension = this.pv.extension;\n\t\t\turlsJSON = JSON.parse(this.pv.urlsMap);\n\t\t\tconst noteNames = Object.keys(urlsJSON);\n\t\t\tfor (const noteName of noteNames) {\n\t\t\t\tconst urlFileName = urlsJSON[noteName];\n\t\t\t\tconst url = `${this.pv.baseUrl}/${urlFileName}.${extension}`;\n\t\t\t\turlsJSON[noteName] = sanitizeUrl(url);\n\t\t\t\turls.push(url);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.states.error.set('urlsMap is invalid JSON');\n\t\t}\n\n\t\t// preload urls for export\n\t\tconst loaders: CoreLoaderAudio[] = urls.map(\n\t\t\t(url) => new CoreLoaderAudio(url, this, {multiAssetsForNode: true})\n\t\t);\n\t\tawait Promise.all(loaders.map((loader) => loader.load()));\n\n\t\t// create sample\n\t\tconst sampler = new Sampler({\n\t\t\turls: urlsJSON,\n\t\t\tattack: envelopeParams.attack,\n\t\t\trelease: envelopeParams.release,\n\t\t\tbaseUrl: '',\n\t\t\tonerror: (err) => {\n\t\t\t\tthis.states.error.set(err.message);\n\t\t\t},\n\t\t\tonload: () => {\n\t\t\t\tconst audioBuilder = new AudioBuilder();\n\t\t\t\taudioBuilder.setInstrument(sampler);\n\n\t\t\t\tthis.setAudioBuilder(audioBuilder);\n\t\t\t},\n\t\t});\n\t}\n}\n","/**\n * switches between different inputs\n *\n *\n */\n\nimport {TypedAudioNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {AudioBuilder} from '../../../core/audio/AudioBuilder';\nimport {BaseNodeType} from '../_Base';\nimport {NodeEvent} from '../../poly/NodeEvent';\nimport {AudioType} from '../../poly/registers/nodes/types/Audio';\n\nconst DEFAULT_INPUTS_COUNT = 4;\nclass SwitchAudioParamsConfig extends NodeParamsConfig {\n\t/** @param sets which input is used */\n\tinput = ParamConfig.INTEGER(0, {\n\t\trange: [0, 3],\n\t\trangeLocked: [true, true],\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tSwitchAudioNode.PARAM_CALLBACK_setInputsEvaluation(node as SwitchAudioNode);\n\t\t},\n\t});\n\t/** @param number of inputs that this node can merge geometries from */\n\tinputsCount = ParamConfig.INTEGER(DEFAULT_INPUTS_COUNT, {\n\t\trange: [1, 32],\n\t\trangeLocked: [true, false],\n\t\tseparatorBefore: true,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tSwitchAudioNode.PARAM_CALLBACK_setInputsCount(node as SwitchAudioNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new SwitchAudioParamsConfig();\n\nexport class SwitchAudioNode extends TypedAudioNode<SwitchAudioParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn AudioType.SWITCH;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 4);\n\n\t\tthis.io.inputs.onEnsureListenToSingleInputIndexUpdated(async () => {\n\t\t\tawait this._callbackUpdateInputsEvaluation();\n\t\t});\n\t\tthis.params.onParamsCreated('update inputs', () => {\n\t\t\tthis._callbackUpdateInputsCount();\n\t\t});\n\t}\n\n\toverride async cook(inputContents: AudioBuilder[]) {\n\t\tconst inputIndex = this.pv.input;\n\t\tif (this.io.inputs.hasInput(inputIndex)) {\n\t\t\tconst container = await this.containerController.requestInputContainer(inputIndex);\n\t\t\tif (container) {\n\t\t\t\tconst audioBuilder = container.coreContent();\n\t\t\t\tif (audioBuilder) {\n\t\t\t\t\tthis.setAudioBuilder(audioBuilder);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.states.error.set(`no input ${inputIndex}`);\n\t\t}\n\t}\n\n\tprivate async _callbackUpdateInputsEvaluation() {\n\t\tif (this.p.input.isDirty()) {\n\t\t\tawait this.p.input.compute();\n\t\t}\n\n\t\tthis.io.inputs.listenToSingleInputIndex(this.pv.input);\n\t}\n\tstatic PARAM_CALLBACK_setInputsEvaluation(node: SwitchAudioNode) {\n\t\tnode._callbackUpdateInputsEvaluation();\n\t}\n\n\tprivate _callbackUpdateInputsCount() {\n\t\tthis.io.inputs.setCount(1, this.pv.inputsCount);\n\t\tthis.emit(NodeEvent.INPUTS_UPDATED);\n\t}\n\tstatic PARAM_CALLBACK_setInputsCount(node: SwitchAudioNode) {\n\t\tnode._callbackUpdateInputsCount();\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {FlagsControllerB} from '../utils/FlagsController';\nimport {AudioBuilder} from '../../../core/audio/AudioBuilder';\n\n/**\n *\n *\n * TypedAnimNode is the base class for all nodes that process animations. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\nexport class TypedAudioNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.AUDIO, K> {\n\tpublic override readonly flags: FlagsControllerB = new FlagsControllerB(this);\n\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.AUDIO;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis.io.outputs.setHasOneOutput();\n\t}\n\tprotected setAudioBuilder(audioBuilder: AudioBuilder) {\n\t\tthis._setContainer(audioBuilder);\n\t}\n}\n\nexport type BaseAudioNodeType = TypedAudioNode<NodeParamsConfig>;\nexport class BaseAudioNodeClass extends TypedAudioNode<NodeParamsConfig> {}\n","/**\n * Generates a texture from audio analyse nodes, such as [FFT](/docs/nodes/audio/FFT), [Meter](/docs/nodes/audio/meter) and [Waveform](/docs/nodes/audio/waveform).\n *\n *\n */\nimport {TypedCopNode} from './_Base';\nimport {DataTexture} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {AUDIO_ANALYSER_NODES, NodeContext} from '../../poly/NodeContext';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {BooleanParam} from '../../params/Boolean';\nimport {NodePathParam} from '../../params/NodePath';\nimport {Vector2Param} from '../../params/Vector2';\nimport {BaseAnalyserAudioNode} from '../audio/_BaseAnalyser';\nimport {NearestFilter, RGBAFormat, FloatType} from 'three';\nimport {FloatParam} from '../../params/Float';\n\ninterface ToneAudioByChannel {\n\tR?: BaseAnalyserAudioNode<any>;\n\tG?: BaseAnalyserAudioNode<any>;\n\tB?: BaseAnalyserAudioNode<any>;\n\tA?: BaseAnalyserAudioNode<any>;\n}\ninterface ParamSet {\n\tactive: BooleanParam;\n\tnode: NodePathParam;\n\trange: Vector2Param;\n\tspeedMult: FloatParam;\n}\ninterface ParamSetByChannel {\n\tR: ParamSet;\n\tG: ParamSet;\n\tB: ParamSet;\n\tA: ParamSet;\n}\ntype Channel = keyof ParamSetByChannel;\nconst OFFSET_BY_CHANNEL = {\n\tR: 0,\n\tG: 1,\n\tB: 2,\n\tA: 3,\n};\ntype AnalyserValues = number[] | Float32Array;\ninterface ValuesByChannel {\n\tR?: AnalyserValues;\n\tG?: AnalyserValues;\n\tB?: AnalyserValues;\n\tA?: AnalyserValues;\n}\nconst CHANNELS: Channel[] = ['R', 'G', 'B', 'A'];\n\nconst TEXTURE_ROWS = 2;\nconst BYTE_SIZE = 1;\n// const HALF_BYTE_SIZE = Math.floor(BYTE_SIZE * 0.5);\nconst DEFAULT_SPEED = 0.04;\nclass AudioAnalyserCopParamsConfig extends NodeParamsConfig {\n\t/** @param if off, the texture will not be updated */\n\tactiveR = ParamConfig.BOOLEAN(0);\n\t/** @param audio node to read data from, into the RED channel */\n\taudioNodeR = ParamConfig.NODE_PATH('', {\n\t\tnodeSelection: {\n\t\t\tcontext: NodeContext.AUDIO,\n\t\t\ttypes: AUDIO_ANALYSER_NODES,\n\t\t},\n\t\tvisibleIf: {activeR: 1},\n\t});\n\t/** @param decibel range */\n\trangeR = ParamConfig.VECTOR2([0, 1], {\n\t\tvisibleIf: {activeR: 1},\n\t});\n\t/** @param speed mult */\n\tspeedMultR = ParamConfig.FLOAT(DEFAULT_SPEED, {\n\t\tvisibleIf: {activeR: 1},\n\t\tseparatorAfter: true,\n\t});\n\n\t/** @param if off, the texture will not be updated */\n\tactiveG = ParamConfig.BOOLEAN(0);\n\t/** @param audio node to read data from, into the GREEN channel */\n\taudioNodeG = ParamConfig.NODE_PATH('', {\n\t\tnodeSelection: {\n\t\t\tcontext: NodeContext.AUDIO,\n\t\t\ttypes: AUDIO_ANALYSER_NODES,\n\t\t},\n\t\tvisibleIf: {activeG: 1},\n\t});\n\t/** @param decibel range */\n\trangeG = ParamConfig.VECTOR2([0, 1], {\n\t\tvisibleIf: {activeG: 1},\n\t});\n\t/** @param speed mult */\n\tspeedMultG = ParamConfig.FLOAT(DEFAULT_SPEED, {\n\t\tvisibleIf: {activeG: 1},\n\t\tseparatorAfter: true,\n\t});\n\n\t/** @param if off, the texture will not be updated */\n\tactiveB = ParamConfig.BOOLEAN(0);\n\t/** @param audio node to read data from, into the BLUE channel */\n\taudioNodeB = ParamConfig.NODE_PATH('', {\n\t\tnodeSelection: {\n\t\t\tcontext: NodeContext.AUDIO,\n\t\t\ttypes: AUDIO_ANALYSER_NODES,\n\t\t},\n\t\tvisibleIf: {activeB: 1},\n\t});\n\t/** @param decibel range */\n\trangeB = ParamConfig.VECTOR2([0, 1], {\n\t\tvisibleIf: {activeB: 1},\n\t});\n\t/** @param speed mult */\n\tspeedMultB = ParamConfig.FLOAT(DEFAULT_SPEED, {\n\t\tvisibleIf: {activeB: 1},\n\t\tseparatorAfter: true,\n\t});\n\n\t/** @param if off, the texture will not be updated */\n\tactiveA = ParamConfig.BOOLEAN(0);\n\t/** @param audio node to read data from, into the ALPHA channel */\n\taudioNodeA = ParamConfig.NODE_PATH('', {\n\t\tnodeSelection: {\n\t\t\tcontext: NodeContext.AUDIO,\n\t\t\ttypes: AUDIO_ANALYSER_NODES,\n\t\t},\n\t\tvisibleIf: {activeA: 1},\n\t});\n\t/** @param decibel range */\n\trangeA = ParamConfig.VECTOR2([0, 1], {\n\t\tvisibleIf: {activeA: 1},\n\t});\n\t/** @param speed mult */\n\tspeedMultA = ParamConfig.FLOAT(DEFAULT_SPEED, {\n\t\tvisibleIf: {activeA: 1},\n\t\tseparatorAfter: true,\n\t});\n}\nconst ParamsConfig = new AudioAnalyserCopParamsConfig();\n\nexport class AudioAnalyserCopNode extends TypedCopNode<AudioAnalyserCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'audioAnalyser';\n\t}\n\n\toverride async cook() {\n\t\tthis._initParamsByChannel();\n\t\tawait this._getAudioNodes();\n\t\tthis._registerOnTickHook();\n\t\tthis._updateTexture(1);\n\n\t\tthis.cookController.endCook();\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis._unRegisterOnTickHook();\n\t}\n\n\tprivate _audioNodesByChannel: ToneAudioByChannel = {};\n\tprivate _valuesByChannel: ValuesByChannel = {};\n\tprivate async _getAudioNodes() {\n\t\tconst promises = [\n\t\t\tthis._getAudioNode('R'),\n\t\t\tthis._getAudioNode('G'),\n\t\t\tthis._getAudioNode('B'),\n\t\t\tthis._getAudioNode('A'),\n\t\t];\n\t\tawait Promise.all(promises);\n\t}\n\tprivate async _getAudioNode(channel: Channel) {\n\t\tif (!this._paramSetByChannel) {\n\t\t\treturn;\n\t\t}\n\t\tconst paramSet = this._paramSetByChannel[channel];\n\t\tif (!isBooleanTrue(paramSet.active.value)) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodeParam = paramSet.node;\n\t\tconst audioNode = nodeParam.value.nodeWithContext(NodeContext.AUDIO);\n\t\tif (!audioNode) {\n\t\t\tthis.states.error.set('no audio analyser node found');\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tconst audioAnalyserNode = audioNode as BaseAnalyserAudioNode<any>;\n\t\tif (!audioAnalyserNode.getAnalyserValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait audioNode.compute();\n\t\tthis._audioNodesByChannel[channel] = audioAnalyserNode;\n\t}\n\n\tprivate _updateTexture(delta: number) {\n\t\tif (!this._paramSetByChannel) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet maxSize = -1;\n\t\tfor (const channel of CHANNELS) {\n\t\t\tconst values = this._valuesForChannel(channel, this._paramSetByChannel[channel]);\n\n\t\t\tthis._valuesByChannel[channel] = values;\n\t\t\tif (values) {\n\t\t\t\tconst size = values.length;\n\t\t\t\tif (maxSize < size) {\n\t\t\t\t\tmaxSize = size;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this._dataTexture) {\n\t\t\tthis._createDataTexture(maxSize);\n\t\t} else {\n\t\t\tif (this._dataTexture.image.width != maxSize) {\n\t\t\t\t// regenerate a texture if size is different\n\t\t\t\tthis._createDataTexture(maxSize);\n\t\t\t}\n\t\t}\n\t\tif (!this._dataTexture) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const channel of CHANNELS) {\n\t\t\tconst values = this._valuesByChannel[channel];\n\t\t\tif (values) {\n\t\t\t\tthis._updateTextureChannel(channel, this._paramSetByChannel[channel], values, this._dataTexture, delta);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _valuesForChannel(channel: Channel, paramSet: ParamSet) {\n\t\tconst audioNode = this._audioNodesByChannel[channel];\n\t\tif (!audioNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isBooleanTrue(paramSet.active.value)) {\n\t\t\treturn;\n\t\t}\n\t\treturn audioNode.getAnalyserValue();\n\t}\n\tprivate async _updateTextureChannel(\n\t\tchannel: Channel,\n\t\tparamSet: ParamSet,\n\t\tvalues: AnalyserValues,\n\t\ttexture: DataTexture,\n\t\tdelta: number\n\t) {\n\t\tif (!this._dataTexture) {\n\t\t\treturn;\n\t\t}\n\t\tconst columns = this._dataTexture.image.width;\n\n\t\tconst offset = OFFSET_BY_CHANNEL[channel];\n\n\t\tconst min = paramSet.range.x.value;\n\t\tconst max = paramSet.range.y.value;\n\t\tconst data = texture.image.data;\n\n\t\tconst row2Offset = columns * 4;\n\t\tconst speedMult = paramSet.speedMult.value;\n\t\tfor (let i = 0; i < columns; i++) {\n\t\t\tconst normalized = (values[i] - min) / (max - min);\n\t\t\tconst clamped = Math.max(0, Math.min(1, normalized));\n\t\t\tconst v = clamped * BYTE_SIZE;\n\t\t\tconst arrayIndex = i * 4 + offset;\n\t\t\tconst prevValue = data[arrayIndex];\n\t\t\tdata[arrayIndex] = v;\n\t\t\tconst speed = (speedMult * (v - prevValue)) / delta;\n\t\t\tdata[row2Offset + arrayIndex] = /*HALF_BYTE_SIZE +*/ speed;\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate _dataTexture: DataTexture | undefined;\n\tprivate _createDataTexture(valuesSize: number) {\n\t\tif (valuesSize <= 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst height = TEXTURE_ROWS;\n\t\tconst width = valuesSize;\n\t\tconst size = width * height * 4;\n\t\tconst pixelBuffer = new Float32Array(size);\n\t\tpixelBuffer.fill(0);\n\t\t// file alpha to 1\n\t\t// so that this can be set as a color texture without the material becoming transparent\n\t\tfor (let i = 0; i < size; i++) {\n\t\t\tpixelBuffer[i * 4 + 3] = BYTE_SIZE;\n\t\t}\n\t\tconst texture = new DataTexture(pixelBuffer, width, height, RGBAFormat, FloatType);\n\t\ttexture.minFilter = NearestFilter;\n\t\ttexture.magFilter = NearestFilter;\n\t\tthis._dataTexture = texture;\n\t\tthis.setTexture(this._dataTexture);\n\t}\n\n\t/*\n\t * INIT\n\t */\n\tprivate _paramSetByChannel: ParamSetByChannel | undefined;\n\tprivate _initParamsByChannel() {\n\t\tthis._paramSetByChannel = this._paramSetByChannel || {\n\t\t\tR: {\n\t\t\t\tactive: this.p.activeR,\n\t\t\t\tnode: this.p.audioNodeR,\n\t\t\t\trange: this.p.rangeR,\n\t\t\t\tspeedMult: this.p.speedMultR,\n\t\t\t},\n\t\t\tG: {\n\t\t\t\tactive: this.p.activeG,\n\t\t\t\tnode: this.p.audioNodeG,\n\t\t\t\trange: this.p.rangeG,\n\t\t\t\tspeedMult: this.p.speedMultG,\n\t\t\t},\n\t\t\tB: {\n\t\t\t\tactive: this.p.activeB,\n\t\t\t\tnode: this.p.audioNodeB,\n\t\t\t\trange: this.p.rangeB,\n\t\t\t\tspeedMult: this.p.speedMultB,\n\t\t\t},\n\t\t\tA: {\n\t\t\t\tactive: this.p.activeA,\n\t\t\t\tnode: this.p.audioNodeA,\n\t\t\t\trange: this.p.rangeA,\n\t\t\t\tspeedMult: this.p.speedMultA,\n\t\t\t},\n\t\t};\n\t}\n\n\t/*\n\t * REGISTER TICK CALLBACK\n\t */\n\tprivate async _registerOnTickHook() {\n\t\tif (this.scene().registeredBeforeTickCallbacks().has(this._tickCallbackName())) {\n\t\t\treturn;\n\t\t}\n\t\tthis.scene().registerOnBeforeTick(this._tickCallbackName(), this._updateTexture.bind(this));\n\t}\n\tprivate async _unRegisterOnTickHook() {\n\t\tthis.scene().unRegisterOnBeforeTick(this._tickCallbackName());\n\t}\n\tprivate _tickCallbackName() {\n\t\treturn `cop/audioAnalyserNode-${this.graphNodeId()}`;\n\t}\n}\n","import {ASSETS_ROOT} from '../AssetsUtils';\nimport {TextureLoadOptions} from './_BaseImageLoader';\nimport {CubeTextureLoader, Texture} from 'three';\nimport {CoreBaseLoader} from '../_Base';\nimport {CoreLoaderTexture} from '../Texture';\nimport {Poly} from '../../../engine/Poly';\n\nexport class CoreCubeTextureLoader extends CoreBaseLoader<string[]> {\n\tstatic PARAM_DEFAULT_PREFIX = `${ASSETS_ROOT}/textures/cube`;\n\tstatic PARAM_DEFAULT_SUFFIX = `.jpg`;\n\n\tasync loadImage(options: TextureLoadOptions): Promise<Texture> {\n\t\tconst urls = this._urlToLoad();\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst loader = await this._getLoader(options);\n\n\t\t\turls.forEach((url) => CoreLoaderTexture.incrementInProgressLoadsCount());\n\t\t\tawait CoreLoaderTexture.waitForMaxConcurrentLoadsQueueFreed();\n\t\t\tloader.load(\n\t\t\t\turls,\n\t\t\t\t(texture: Texture) => {\n\t\t\t\t\turls.forEach((url, i) => {\n\t\t\t\t\t\tconst isLast = i == urls.length - 1;\n\t\t\t\t\t\tCoreLoaderTexture.decrementInProgressLoadsCount(url, isLast ? texture : undefined);\n\t\t\t\t\t});\n\n\t\t\t\t\tresolve(texture);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t(error: any) => {\n\t\t\t\t\turls.forEach((url) => CoreLoaderTexture.decrementInProgressLoadsCount(url));\n\t\t\t\t\tPoly.warn('error', error);\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected async _getLoader(options: TextureLoadOptions) {\n\t\tconst loader = new CubeTextureLoader(this.loadingManager);\n\t\treturn loader;\n\t}\n}\n","/**\n * Creates a cube map\n *\n *\n */\nimport {Texture, TextureDataType} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CopType} from '../../poly/registers/nodes/types/Cop';\nimport {BaseNodeType} from '../_Base';\nimport {ParamEvent} from '../../poly/ParamEvent';\nimport {Poly} from '../../Poly';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {TextureParamConfig, TextureParamsController} from './utils/TextureParamsController';\nimport {Constructor} from '../../../types/GlobalTypes';\nimport {CoreCubeTextureLoader} from '../../../core/loader/texture/Cube';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport enum CubeMapUrlKey {\n\tP = 'p',\n\tN = 'n',\n}\n// const URL_KEYS:UrlKey[]=[UrlKey.N,UrlKey.P]\nexport enum CubeMapUrlAxis {\n\tX = 'x',\n\tY = 'y',\n\tZ = 'z',\n}\n// const URL_AXISES:UrlAxis[]=[UrlAxis.X,UrlAxis.Y,UrlAxis.Z]\n\nexport function cubeMapUrlExpression(urlKey: CubeMapUrlKey, urlAxis: CubeMapUrlAxis) {\n\treturn `\\`ch('prefix')\\`${urlKey}${urlAxis}\\`ch('suffix')\\``;\n}\n\nfunction CubeMapCopParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param url prefix */\n\t\tprefix = ParamConfig.STRING('', {\n\t\t\tfileBrowse: {\n\t\t\t\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.CUBE_MAP],\n\t\t\t},\n\t\t});\n\t\t/** @param url prefix */\n\t\tsuffix = ParamConfig.STRING('.png');\n\t\t/** @param reload the image */\n\t\treload = ParamConfig.BUTTON(null, {\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tCubeMapCopNode.PARAM_CALLBACK_reload(node as CubeMapCopNode);\n\t\t\t},\n\t\t});\n\t\t/** @param px url */\n\t\tpx = ParamConfig.STRING(cubeMapUrlExpression(CubeMapUrlKey.P, CubeMapUrlAxis.X));\n\t\t/** @param nx url */\n\t\tnx = ParamConfig.STRING(cubeMapUrlExpression(CubeMapUrlKey.N, CubeMapUrlAxis.X));\n\t\t/** @param py url */\n\t\tpy = ParamConfig.STRING(cubeMapUrlExpression(CubeMapUrlKey.P, CubeMapUrlAxis.Y));\n\t\t/** @param ny url */\n\t\tny = ParamConfig.STRING(cubeMapUrlExpression(CubeMapUrlKey.N, CubeMapUrlAxis.Y));\n\t\t/** @param pz url */\n\t\tpz = ParamConfig.STRING(cubeMapUrlExpression(CubeMapUrlKey.P, CubeMapUrlAxis.Z));\n\t\t/** @param nz url */\n\t\tnz = ParamConfig.STRING(cubeMapUrlExpression(CubeMapUrlKey.N, CubeMapUrlAxis.Z));\n\t};\n}\n\nclass CubeMapCopParamsConfig extends TextureParamConfig(CubeMapCopParamConfig(NodeParamsConfig)) {}\nconst ParamsConfig = new CubeMapCopParamsConfig();\nexport class CubeMapCopNode extends TypedCopNode<CubeMapCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CopType.CUBE_MAP;\n\t}\n\n\tpublic readonly textureParamsController: TextureParamsController = new TextureParamsController(this);\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\toverride async cook(inputContents: Texture[]) {\n\t\tconst texture = await this._loadTexture();\n\n\t\tif (texture) {\n\t\t\tconst inputTexture = inputContents[0];\n\t\t\tif (inputTexture) {\n\t\t\t\tTextureParamsController.copyTextureAttributes(texture, inputTexture);\n\t\t\t}\n\n\t\t\tawait this.textureParamsController.update(texture);\n\t\t\tthis.setTexture(texture);\n\t\t} else {\n\t\t\tthis._clearTexture();\n\t\t}\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\n\tprivate async _loadTexture() {\n\t\tconst pv = this.pv;\n\t\tconst urls: string[] = [pv.px, pv.nx, pv.py, pv.ny, pv.pz, pv.nz];\n\t\tlet texture: Texture | null = null;\n\t\ttry {\n\t\t\tconst loader = new CoreCubeTextureLoader(urls, this);\n\t\t\ttexture = await loader.loadImage({\n\t\t\t\ttdataType: this.pv.ttype && this.pv.tadvanced,\n\t\t\t\tdataType: this.pv.type as TextureDataType,\n\t\t\t});\n\t\t\tif (texture) {\n\t\t\t\ttexture.matrixAutoUpdate = false;\n\t\t\t}\n\t\t} catch (e) {}\n\t\tif (!texture) {\n\t\t\tthis.states.error.set(`could not load texture '${urls.join(' ')}'`);\n\t\t}\n\t\treturn texture;\n\t}\n\n\tstatic PARAM_CALLBACK_reload(node: CubeMapCopNode) {\n\t\tnode.paramCallbackReload();\n\t}\n\tprivate paramCallbackReload() {\n\t\tthis.p.px.setDirty();\n\t\tthis.p.px.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t}\n}\n","/**\n * Reads an attribute from a geometry and fills a texture with the values.\n *\n * @remarks\n *\n * This can be used to lookup geometry attributes inside a shader.\n *\n *\n */\nimport {TypedCopNode} from './_Base';\nimport {DataTexture, Mesh, Object3D, Texture} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {CoreMask} from '../../../core/geometry/Mask';\nimport {\n\ttextureFromAttributes,\n\t// textureFromAttributesMissingAttributes,\n\ttextureFromAttributesTotalAttribSizes,\n} from '../../../core/geometry/operation/TextureFromAttribute';\nimport {CoreAttribute} from '../../../core/geometry/Attribute';\nimport {corePointClassFactory} from '../../../core/geometry/CoreObjectFactory';\n\nclass GeometryAttributeCopParamsConfig extends NodeParamsConfig {\n\t/** @param sop node */\n\tnode = ParamConfig.NODE_PATH('', {\n\t\tnodeSelection: {\n\t\t\tcontext: NodeContext.SOP,\n\t\t},\n\t});\n\t/** @param group to read the material from */\n\tgroup = ParamConfig.STRING('', {\n\t\tobjectMask: true,\n\t});\n\t/** @param attribute name */\n\tattribute = ParamConfig.STRING('P');\n}\nconst ParamsConfig = new GeometryAttributeCopParamsConfig();\n\nexport class GeometryAttributeCopNode extends TypedCopNode<GeometryAttributeCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): 'geometryAttribute' {\n\t\treturn 'geometryAttribute';\n\t}\n\n\toverride async cook() {\n\t\tconst geometryNode = this.pv.node.nodeWithContext(NodeContext.SOP, this.states.error);\n\t\tif (!geometryNode) {\n\t\t\tthis.states.error.set(`node not found at path '${this.pv.node.path()}'`);\n\t\t\treturn;\n\t\t}\n\t\tconst container = await geometryNode.compute();\n\t\tconst coreGroup = container.coreContent();\n\t\tif (!coreGroup) {\n\t\t\tthis.states.error.set(`geometry invalid`);\n\t\t\treturn;\n\t\t}\n\t\tconst selectedObjects = CoreMask.filterThreejsObjects(coreGroup, this.pv);\n\t\tif (selectedObjects.length == 0) {\n\t\t\tthis.states.error.set(`no object matching group`);\n\t\t\treturn;\n\t\t}\n\t\tlet texture: Texture | undefined;\n\t\tfor (const selectedObject of selectedObjects) {\n\t\t\tconst geometry = (selectedObject as Mesh).geometry;\n\t\t\tif (geometry) {\n\t\t\t\ttexture = texture || this._textureFromGeometry(selectedObject);\n\t\t\t}\n\t\t}\n\t\tif (!texture) {\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tthis.setTexture(texture);\n\t}\n\tprivate _textureFromGeometry(object: Object3D): DataTexture | undefined {\n\t\tconst corePointClass = corePointClassFactory(object);\n\t\tconst geoAttribNames = corePointClass.attributeNames(object);\n\t\tconst attribNames = CoreAttribute.attribNamesMatchingMask(this.pv.attribute, geoAttribNames);\n\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\n\t\t// the missing attributes is currently not working, since we use a mask check first\n\t\t// const missingAttributes = textureFromAttributesMissingAttributes(geometry, attribNames);\n\t\t// if (missingAttributes.length > 0) {\n\t\t// \tthis.states.error.set(`missing attributes: ${missingAttributes.join(',')}`);\n\t\t// \treturn;\n\t\t// }\n\t\tconst totalSize = textureFromAttributesTotalAttribSizes(geometry, attribNames);\n\t\tif (totalSize > 4) {\n\t\t\tthis.states.error.set(`total size of attributes is ${totalSize}, but maximum is 4`);\n\t\t\treturn;\n\t\t}\n\n\t\treturn textureFromAttributes(geometry, attribNames);\n\t\t// const position = geometry.attributes.position;\n\t\t// if (!(position instanceof BufferAttribute)) {\n\t\t// \tthis.states.error.set('position is not a BufferAttribute');\n\t\t// \treturn;\n\t\t// }\n\t\t// const pointsCount = position.count;\n\t\t// const attributeName = CoreAttribute.remapName(this.pv.attribute);\n\t\t// const attribute = geometry.getAttribute(attributeName) as BufferAttribute;\n\t\t// if (!attribute) {\n\t\t// \tthis.states.error.set(`attribute '${attributeName}' not found`);\n\t\t// \treturn;\n\t\t// }\n\t\t// const attribSize = attribute.itemSize;\n\t\t// textureFromAttributeSize(geometry, textureSize);\n\n\t\t// const width = textureSize.x;\n\t\t// const height = textureSize.y;\n\n\t\t// const size = width * height * 4;\n\t\t// const pixelBuffer = new Float32Array(size);\n\n\t\t// const attribArray = attribute.array as number[];\n\t\t// if (attribSize == 1) {\n\t\t// \tfor (let i = 0; i < pointsCount; i++) {\n\t\t// \t\tpixelBuffer[i * 4] = attribArray[i];\n\t\t// \t}\n\t\t// } else {\n\t\t// \tconst vector = _vectorFromAttribSize(attribSize);\n\t\t// \tif (!vector) {\n\t\t// \t\treturn;\n\t\t// \t}\n\t\t// \tfor (let i = 0; i < pointsCount; i++) {\n\t\t// \t\tvector.fromArray(attribArray, i * attribSize);\n\t\t// \t\tvector.toArray(pixelBuffer, i * 4);\n\t\t// \t}\n\t\t// }\n\t\t// const texture = new DataTexture(pixelBuffer, width, height, RGBAFormat, FloatType);\n\t\t// texture.minFilter = texture.magFilter = NearestFilter;\n\t\t// texture.wrapS = texture.wrapT = RepeatWrapping;\n\t\t// texture.needsUpdate = true;\n\t\t// return texture;\n\t}\n}\n","import {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {ASSETS_ROOT} from '../AssetsUtils';\nimport {BaseCoreImageLoader, BaseImageLoader, TextureLoadOptions} from './_BaseImageLoader';\nimport {TextureLoader} from 'three';\n\nexport class ImageDefaultTextureLoader extends BaseCoreImageLoader {\n\tstatic PARAM_DEFAULT = `${ASSETS_ROOT}/textures/uv.jpg`;\n\n\tconstructor(_url: string, _node: BaseNodeType) {\n\t\tsuper(_url, _node);\n\t}\n\n\tprotected async _getLoader(options: TextureLoadOptions) {\n\t\tconst loader = new TextureLoader(this.loadingManager);\n\t\treturn loader as BaseImageLoader;\n\t}\n}\n","/**\n * Imports an  image file.\n *\n * @remarks\n * Performance tip: If possible, try to set min filter to LinearFilter in order to avoid the generation of mipmaps.\n * [https://discourse.threejs.org/t/threejs-app-performance-point-click-game/18491](https://discourse.threejs.org/t/threejs-app-performance-point-click-game/18491)\n */\nimport {copImageNodeFactoryFactory} from './utils/image/_BaseImage';\nimport {ImageDefaultTextureLoader} from '../../../core/loader/texture/ImageDefault';\nimport {BaseNodeType} from '../_Base';\nimport {CopTypeImage} from '../../poly/registers/nodes/types/Cop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class ImageCopNode extends copImageNodeFactoryFactory({\n\ttype: CopTypeImage.IMAGE,\n\tdefaultUrl: ImageDefaultTextureLoader.PARAM_DEFAULT,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopTypeImage.IMAGE],\n\tgetLoader: (url: string, node: BaseNodeType) => new ImageDefaultTextureLoader(url, node),\n}) {}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearSRGBColorSpace,\n\tRedFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n * implementation, so I have preserved their copyright notices.\n */\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above copyright\n//       notice, this list of conditions and the following disclaimer in the\n//       documentation and/or other materials provided with the distribution.\n//     * Neither the name of the Syoyo Fujita nor the\n//       names of its contributors may be used to endorse or promote products\n//       derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // *       Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // *       Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // *       Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\nclass EXRLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], true );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.columns * info.lines * ( info.inputChannels.length * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.inputChannels.length );\n\t\t\tfor ( let i = 0, il = info.inputChannels.length; i < il; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.columns;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.inputChannels.length; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.inputChannels.length; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\n\t\t\tconst byteSize = info.inputChannels.length * info.lines * info.columns * info.totalBytes;\n\t\t\tconst tmpBuffer = new ArrayBuffer( byteSize );\n\t\t\tconst viewer = new DataView( tmpBuffer );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.inputChannels.length; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tconst type = info.inputChannels[ c ].pixelType;\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.columns;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.columns;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.columns; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\tviewer.setUint16( writePtr, pixel, true );\n\t\t\t\t\t\t\t\twritePtr += 2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.columns;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.columns;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.columns;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.columns; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\tviewer.setUint32( writePtr, pixel, true );\n\t\t\t\t\t\t\t\twritePtr += 4;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn viewer;\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.columns * info.lines * ( info.inputChannels.length * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.inputChannels.length );\n\n\t\t\tfor ( let i = 0; i < info.inputChannels.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.columns;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.inputChannels.length; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Lossy DCT decode RGB channels\n\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseInt32( dataView, offset );\n\t\t\tconst yMin = parseInt32( dataView, offset );\n\t\t\tconst xMax = parseInt32( dataView, offset );\n\t\t\tconst yMax = parseInt32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y',\n\t\t\t\t'DECREASING_Y',\n\t\t\t\t'RANDOM_Y',\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseEnvmap( dataView, offset ) {\n\n\t\t\tconst envmaps = [\n\t\t\t\t'ENVMAP_LATLONG',\n\t\t\t\t'ENVMAP_CUBE'\n\t\t\t];\n\n\t\t\tconst envmap = parseUint8( dataView, offset );\n\n\t\t\treturn envmaps[ envmap ];\n\n\t\t}\n\n\t\tfunction parseTiledesc( dataView, offset ) {\n\n\t\t\tconst levelModes = [\n\t\t\t\t'ONE_LEVEL',\n\t\t\t\t'MIPMAP_LEVELS',\n\t\t\t\t'RIPMAP_LEVELS',\n\t\t\t];\n\n\t\t\tconst roundingModes = [\n\t\t\t\t'ROUND_DOWN',\n\t\t\t\t'ROUND_UP',\n\t\t\t];\n\n\t\t\tconst xSize = parseUint32( dataView, offset );\n\t\t\tconst ySize = parseUint32( dataView, offset );\n\t\t\tconst modes = parseUint8( dataView, offset );\n\n\t\t\treturn {\n\t\t\t\txSize: xSize,\n\t\t\t\tySize: ySize,\n\t\t\t\tlevelMode: levelModes[ modes & 0xf ],\n\t\t\t\troundingMode: roundingModes[ modes >> 4 ]\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'envmap' ) {\n\n\t\t\t\treturn parseEnvmap( dataView, offset );\n\n\t\t\t} else if ( type === 'tiledesc' ) {\n\n\t\t\t\treturn parseTiledesc( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction roundLog2( x, mode ) {\n\n\t\t\tconst log2 = Math.log2( x );\n\t\t\treturn mode == 'ROUND_DOWN' ? Math.floor( log2 ) : Math.ceil( log2 );\n\n\t\t}\n\n\t\tfunction calculateTileLevels( tiledesc, w, h ) {\n\n\t\t\tlet num = 0;\n\n\t\t\tswitch ( tiledesc.levelMode ) {\n\n\t\t\t\tcase 'ONE_LEVEL':\n\t\t\t\t\tnum = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MIPMAP_LEVELS':\n\t\t\t\t\tnum = roundLog2( Math.max( w, h ), tiledesc.roundingMode ) + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RIPMAP_LEVELS':\n\t\t\t\t\tthrow new Error( 'THREE.EXRLoader: RIPMAP_LEVELS tiles currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn num;\n\n\t\t}\n\n\t\tfunction calculateTiles( count, dataSize, size, roundingMode ) {\n\n\t\t\tconst tiles = new Array( count );\n\n\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\tconst b = ( 1 << i );\n\t\t\t\tlet s = ( dataSize / b ) | 0;\n\n\t\t\t\tif ( roundingMode == 'ROUND_UP' && s * b < dataSize ) s += 1;\n\n\t\t\t\tconst l = Math.max( s, 1 );\n\n\t\t\t\ttiles[ i ] = ( ( l + size - 1 ) / size ) | 0;\n\n\t\t\t}\n\n\t\t\treturn tiles;\n\n\t\t}\n\n\t\tfunction parseTiles() {\n\n\t\t\tconst EXRDecoder = this;\n\t\t\tconst offset = EXRDecoder.offset;\n\t\t\tconst tmpOffset = { value: 0 };\n\n\t\t\tfor ( let tile = 0; tile < EXRDecoder.tileCount; tile ++ ) {\n\n\t\t\t\tconst tileX = parseInt32( EXRDecoder.viewer, offset );\n\t\t\t\tconst tileY = parseInt32( EXRDecoder.viewer, offset );\n\t\t\t\toffset.value += 8; // skip levels - only parsing top-level\n\t\t\t\tEXRDecoder.size = parseUint32( EXRDecoder.viewer, offset );\n\n\t\t\t\tconst startX = tileX * EXRDecoder.blockWidth;\n\t\t\t\tconst startY = tileY * EXRDecoder.blockHeight;\n\t\t\t\tEXRDecoder.columns = ( startX + EXRDecoder.blockWidth > EXRDecoder.width ) ? EXRDecoder.width - startX : EXRDecoder.blockWidth;\n\t\t\t\tEXRDecoder.lines = ( startY + EXRDecoder.blockHeight > EXRDecoder.height ) ? EXRDecoder.height - startY : EXRDecoder.blockHeight;\n\n\t\t\t\tconst bytesBlockLine = EXRDecoder.columns * EXRDecoder.totalBytes;\n\t\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * bytesBlockLine;\n\t\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\t\tfor ( let line = 0; line < EXRDecoder.lines; line ++ ) {\n\n\t\t\t\t\tconst lineOffset = line * EXRDecoder.columns * EXRDecoder.totalBytes;\n\n\t\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.inputChannels.length; channelID ++ ) {\n\n\t\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\t\tconst lOff = EXRDecoder.channelByteOffsets[ name ] * EXRDecoder.columns;\n\t\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\t\t\t\t\t\tconst outLineOffset = ( EXRDecoder.height - ( 1 + startY + line ) ) * EXRDecoder.outLineWidth;\n\n\t\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.columns; x ++ ) {\n\n\t\t\t\t\t\t\tconst outIndex = outLineOffset + ( x + startX ) * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseScanline() {\n\n\t\t\tconst EXRDecoder = this;\n\t\t\tconst offset = EXRDecoder.offset;\n\t\t\tconst tmpOffset = { value: 0 };\n\n\t\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.blockHeight; scanlineBlockIdx ++ ) {\n\n\t\t\t\tconst line = parseInt32( EXRDecoder.viewer, offset ) - EXRHeader.dataWindow.yMin; // line_no\n\t\t\t\tEXRDecoder.size = parseUint32( EXRDecoder.viewer, offset ); // data_len\n\t\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.blockHeight > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.blockHeight );\n\n\t\t\t\tconst bytesPerLine = EXRDecoder.columns * EXRDecoder.totalBytes;\n\t\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * bytesPerLine;\n\t\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.blockHeight; line_y ++ ) {\n\n\t\t\t\t\tconst scan_y = scanlineBlockIdx * EXRDecoder.blockHeight;\n\t\t\t\t\tconst true_y = line_y + EXRDecoder.scanOrder( scan_y );\n\t\t\t\t\tif ( true_y >= EXRDecoder.height ) continue;\n\n\t\t\t\t\tconst lineOffset = line_y * bytesPerLine;\n\t\t\t\t\tconst outLineOffset = ( EXRDecoder.height - 1 - true_y ) * EXRDecoder.outLineWidth;\n\n\t\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.inputChannels.length; channelID ++ ) {\n\n\t\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\t\tconst lOff = EXRDecoder.channelByteOffsets[ name ] * EXRDecoder.columns;\n\t\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\n\t\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.columns; x ++ ) {\n\n\t\t\t\t\t\t\tconst outIndex = outLineOffset + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName == 0 ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `THREE.EXRLoader: Skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( spec & ~ 0x06 ) != 0 ) { // unsupported deep-image, multi-part\n\n\t\t\t\tconsole.error( 'THREE.EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tinputChannels: EXRHeader.channels,\n\t\t\t\tchannelByteOffsets: {},\n\t\t\t\tscanOrder: null,\n\t\t\t\ttotalBytes: null,\n\t\t\t\tcolumns: null,\n\t\t\t\tlines: null,\n\t\t\t\ttype: null,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tconst channels = {};\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tswitch ( channel.name ) {\n\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\tcase 'R':\n\t\t\t\t\tcase 'G':\n\t\t\t\t\tcase 'B':\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tchannels[ channel.name ] = true;\n\t\t\t\t\t\tEXRDecoder.type = channel.pixelType;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tlet fillAlpha = false;\n\n\t\t\tif ( channels.R && channels.G && channels.B ) {\n\n\t\t\t\tfillAlpha = ! channels.A;\n\t\t\t\tEXRDecoder.outputChannels = 4;\n\t\t\t\tEXRDecoder.decodeChannels = { R: 0, G: 1, B: 2, A: 3 };\n\n\t\t\t} else if ( channels.Y ) {\n\n\t\t\t\tEXRDecoder.outputChannels = 1;\n\t\t\t\tEXRDecoder.decodeChannels = { Y: 0 };\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: file contains unsupported data channels.' );\n\n\t\t\t}\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.columns = EXRDecoder.width;\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlet byteOffset = 0;\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tif ( EXRDecoder.decodeChannels[ channel.name ] !== undefined ) {\n\n\t\t\t\t\tEXRDecoder.channelByteOffsets[ channel.name ] = byteOffset;\n\n\t\t\t\t}\n\n\t\t\t\tbyteOffset += channel.pixelType * 2;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.totalBytes = byteOffset;\n\t\t\tEXRDecoder.outLineWidth = EXRDecoder.width * EXRDecoder.outputChannels;\n\n\t\t\tif ( EXRHeader.lineOrder === 'INCREASING_Y' ) {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => y;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => EXRDecoder.height - 1 - y;\n\n\t\t\t}\n\n\t\t\tif ( EXRDecoder.outputChannels == 4 ) {\n\n\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\tEXRDecoder.colorSpace = NoColorSpace;\n\n\t\t\t}\n\n\t\t\tif ( EXRHeader.spec.singleTile ) {\n\n\t\t\t\tEXRDecoder.blockHeight = EXRHeader.tiles.ySize;\n\t\t\t\tEXRDecoder.blockWidth = EXRHeader.tiles.xSize;\n\n\t\t\t\tconst numXLevels = calculateTileLevels( EXRHeader.tiles, EXRDecoder.width, EXRDecoder.height );\n\t\t\t\t// const numYLevels = calculateTileLevels( EXRHeader.tiles, EXRDecoder.width, EXRDecoder.height );\n\n\t\t\t\tconst numXTiles = calculateTiles( numXLevels, EXRDecoder.width, EXRHeader.tiles.xSize, EXRHeader.tiles.roundingMode );\n\t\t\t\tconst numYTiles = calculateTiles( numXLevels, EXRDecoder.height, EXRHeader.tiles.ySize, EXRHeader.tiles.roundingMode );\n\n\t\t\t\tEXRDecoder.tileCount = numXTiles[ 0 ] * numYTiles[ 0 ];\n\n\t\t\t\tfor ( let l = 0; l < numXLevels; l ++ )\n\t\t\t\t\tfor ( let y = 0; y < numYTiles[ l ]; y ++ )\n\t\t\t\t\t\tfor ( let x = 0; x < numXTiles[ l ]; x ++ )\n\t\t\t\t\t\t\tparseInt64( dataView, offset ); // tileOffset\n\n\t\t\t\tEXRDecoder.decode = parseTiles.bind( EXRDecoder );\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.blockWidth = EXRDecoder.width;\n\t\t\t\tconst blockCount = Math.ceil( EXRDecoder.height / EXRDecoder.blockHeight );\n\n\t\t\t\tfor ( let i = 0; i < blockCount; i ++ )\n\t\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t\tEXRDecoder.decode = parseScanline.bind( EXRDecoder );\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\t\tconst offset = { value: 0 };\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );\n\n\t\t// parse input data\n\t\tEXRDecoder.decode();\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tcolorSpace: EXRDecoder.colorSpace,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.colorSpace = texData.colorSpace;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n","import {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {ASSETS_ROOT} from './../AssetsUtils';\nimport {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader';\nimport {BaseCoreImageLoader, BaseImageLoader, TextureLoadOptions} from './_BaseImageLoader';\n\nexport class EXRTextureLoader extends BaseCoreImageLoader {\n\tstatic PARAM_ENV_DEFAULT = `${ASSETS_ROOT}/textures/piz_compressed.exr`;\n\n\tconstructor(_url: string, _node: BaseNodeType) {\n\t\tsuper(_url, _node);\n\t}\n\n\tprotected async _getLoader(options: TextureLoadOptions) {\n\t\tconst loader = new EXRLoader(this.loadingManager);\n\t\tif (options.tdataType) {\n\t\t\tloader.setDataType(options.dataType);\n\t\t}\n\t\treturn loader as BaseImageLoader;\n\t}\n}\n","/**\n * Imports an EXR image file.\n *\n * @remarks\n * Performance tip: If possible, try to set min filter to LinearFilter in order to avoid the generation of mipmaps.\n * [https://discourse.threejs.org/t/threejs-app-performance-point-click-game/18491](https://discourse.threejs.org/t/threejs-app-performance-point-click-game/18491)\n */\n\nimport {copImageNodeFactoryFactory} from './utils/image/_BaseImage';\nimport {EXRTextureLoader} from '../../../core/loader/texture/EXR';\nimport {BaseNodeType} from '../_Base';\nimport {CopTypeImage} from '../../poly/registers/nodes/types/Cop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport class ImageEXRCopNode extends copImageNodeFactoryFactory({\n\ttype: CopTypeImage.IMAGE_EXR,\n\tdefaultUrl: EXRTextureLoader.PARAM_ENV_DEFAULT,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopTypeImage.IMAGE_EXR],\n\tgetLoader: (url: string, node: BaseNodeType) => new EXRTextureLoader(url, node),\n}) {}\n","/**\n * Imports a LUT to be used in Post nodes\n *\n */\nimport {ParamEvent} from './../../poly/ParamEvent';\nimport {ClampToEdgeWrapping, LinearFilter, Texture, TextureLoader} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {BaseNodeType} from '../_Base';\nimport {BaseParamType} from '../../params/_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {LUT3dlLoader, LUTCubeLoader} from 'postprocessing';\nimport {LOADING_MANAGER} from '../../../core/loader/_Base';\nimport {CopType} from '../../poly/registers/nodes/types/Cop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\ntype OnTextureLoad = (texture: Texture) => void;\nclass LutCopParamsConfig extends NodeParamsConfig {\n\t/** @param url to fetch the lut from */\n\turl = ParamConfig.STRING('', {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.LUT]},\n\t});\n\t/** @param reload the image */\n\treload = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\tLutCopNode.PARAM_CALLBACK_reload(node as LutCopNode);\n\t\t},\n\t});\n}\n\nconst ParamsConfig = new LutCopParamsConfig();\n\nexport class LutCopNode extends TypedCopNode<LutCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CopType.LUT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0);\n\t}\n\toverride async cook(input_contents: Texture[]) {\n\t\tconst textureLoader = new TextureLoader(LOADING_MANAGER);\n\n\t\tlet loader: TextureLoader | LUT3dlLoader | LUTCubeLoader = textureLoader;\n\t\tlet onLoad: OnTextureLoad | null = (texture) => {\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.wrapS = ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = ClampToEdgeWrapping;\n\t\t\ttexture.flipY = false;\n\t\t};\n\t\tconst {url} = this.pv;\n\t\tif (/.3dl$/im.test(url)) {\n\t\t\tloader = new LUT3dlLoader(LOADING_MANAGER);\n\t\t\tonLoad = null;\n\t\t}\n\t\tif (/.cube$/im.test(url)) {\n\t\t\tloader = new LUTCubeLoader(LOADING_MANAGER);\n\t\t\tonLoad = null;\n\t\t}\n\t\tloader.load(this.pv.url, (texture: Texture) => {\n\t\t\tconsole.log(texture);\n\t\t\tif (loader instanceof TextureLoader)\n\t\t\t\tif (onLoad) {\n\t\t\t\t\t// texture.name = entry[0];\n\t\t\t\t\tonLoad(texture);\n\t\t\t\t}\n\n\t\t\tthis.setTexture(texture);\n\t\t});\n\t}\n\tstatic PARAM_CALLBACK_reload(node: LutCopNode) {\n\t\tnode.paramCallbackReload();\n\t}\n\tprivate paramCallbackReload() {\n\t\t// set the param dirty is preferable to just the successors, in case the expression result needs to be updated\n\t\t// this.p.url.set_successors_dirty();\n\t\tthis.p.url.setDirty();\n\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t}\n}\n","/**\n * Imports a mapbox tile.\n *\n * @remarks\n * Note that this node requires a mapbox account.\n */\n\nimport {DataTexture, LinearFilter, RGBAFormat, FloatType} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {CoreMapboxUtils} from '../../../core/thirdParty/Mapbox/Utils';\nimport {CoreImage} from '../../../core/Image';\nimport {Poly} from '../../Poly';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {MAPBOX_TOKEN_MISSING_ERROR_MESSAGE} from '../../poly/thirdParty/Mapbox';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {MAPBOX_TILES_ROOT_URL} from '../../../core/thirdParty/Mapbox/MapboxTile';\n\nconst M1 = 256;\nconst M2 = M1 * M1;\nconst M2_INVERTED = 1 / M2;\n\nclass MapboxElevationCopParamsConfig extends NodeParamsConfig {\n\t/** @param longitude */\n\tlongitude = ParamConfig.FLOAT(0, {\n\t\trange: [-180, 180],\n\t});\n\t/** @param latitude */\n\tlatitude = ParamConfig.FLOAT(0, {\n\t\trange: [-90, 90],\n\t});\n\t/** @param zoom value */\n\tzoom = ParamConfig.INTEGER(12, {\n\t\trange: [1, 24],\n\t\trangeLocked: [true, true],\n\t});\n\t/** @param highres */\n\thighres = ParamConfig.BOOLEAN(1);\n\t/** @param source range */\n\tsourceRange = ParamConfig.VECTOR2([0, 0], {\n\t\tcook: false,\n\t\teditable: false,\n\t});\n\t/** @param updateRange */\n\tupdateRange = ParamConfig.BOOLEAN(0);\n\t/** @param min */\n\tmin = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {updateRange: true},\n\t\trange: [-10, 10],\n\t});\n\t/** @param mult */\n\tmult = ParamConfig.FLOAT(1, {\n\t\tvisibleIf: {updateRange: true},\n\t\trange: [-10, 10],\n\t});\n}\n\nconst ParamsConfig = new MapboxElevationCopParamsConfig();\n\nexport class MapboxElevationCopNode extends TypedCopNode<MapboxElevationCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'mapboxElevation';\n\t}\n\n\toverride async cook() {\n\t\tconst token = await Poly.thirdParty.mapbox().token();\n\t\tif (!token) {\n\t\t\tthis.states.error.set(MAPBOX_TOKEN_MISSING_ERROR_MESSAGE);\n\t\t\treturn;\n\t\t}\n\n\t\tconst texture = await this._cookForElevation(token);\n\t\tif (texture) {\n\t\t\t// not sure why .needsUpdate is required\n\t\t\t// since the textures are new on every cook,\n\t\t\t// but it is!\n\t\t\ttexture.needsUpdate = true;\n\t\t\tthis.setTexture(texture);\n\t\t}\n\t}\n\n\tprivate async _cookForElevation(token: string) {\n\t\tconst url = await this._url('mapbox.terrain-rgb', token);\n\t\tconst image_data_rgba = await CoreImage.data_from_url(url);\n\t\tif (!image_data_rgba) {\n\t\t\tthis.states.error.set('invalid image');\n\t\t\treturn;\n\t\t}\n\t\tconst data_rgba = image_data_rgba.data;\n\t\tconst pixelsCount = image_data_rgba.width * image_data_rgba.height;\n\t\tconst bufferSize = 4 * pixelsCount;\n\t\tconst texture = this._createTexture(image_data_rgba.width, image_data_rgba.height);\n\t\tconst dest_data = texture.image.data;\n\t\tlet elevation: number, R: number, G: number, B: number;\n\t\tconst elevations: number[] = new Array(pixelsCount);\n\t\tlet pixelIndex = 0;\n\t\tfor (let i = 0; i < bufferSize; i += 4) {\n\t\t\tR = data_rgba[i + 0];\n\t\t\tG = data_rgba[i + 1];\n\t\t\tB = data_rgba[i + 2];\n\t\t\televation = /*-10000 +*/ (R * M2 + G * M1 + B) * M2_INVERTED;\n\t\t\tdest_data[i + 0] = elevation;\n\t\t\tdest_data[i + 1] = elevation;\n\t\t\tdest_data[i + 2] = elevation;\n\t\t\televations[pixelIndex] = elevation;\n\t\t\tpixelIndex++;\n\t\t}\n\t\tconst sortedElevations = elevations.sort((a, b) => (a > b ? 1 : -1));\n\t\tconst sourceMin = sortedElevations[0];\n\t\tconst sourceMax = sortedElevations[sortedElevations.length - 1];\n\t\tthis.p.sourceRange.set([sourceMin, sourceMax]);\n\n\t\tif (isBooleanTrue(this.pv.updateRange)) {\n\t\t\tconst minElevation = this.pv.min;\n\t\t\tconst mult = this.pv.mult;\n\t\t\tfor (let i = 0; i < bufferSize; i += 4) {\n\t\t\t\tconst currentElevation = dest_data[i + 0];\n\t\t\t\tconst newElevation = (currentElevation - sourceMin) * mult + minElevation;\n\t\t\t\tdest_data[i + 0] = newElevation;\n\t\t\t\tdest_data[i + 1] = newElevation;\n\t\t\t\tdest_data[i + 2] = newElevation;\n\t\t\t}\n\t\t}\n\n\t\t// }\n\t\treturn texture;\n\t}\n\n\tprivate async _url(endpoint: string, token: string) {\n\t\tconst tileNumber = CoreMapboxUtils.lnglatToTileNumber(this.pv.latitude, this.pv.longitude, this.pv.zoom);\n\t\tconst x = tileNumber.x;\n\t\tconst y = tileNumber.y;\n\t\tconst z = this.pv.zoom;\n\n\t\tconst res = isBooleanTrue(this.pv.highres) ? '@2x' : '';\n\n\t\treturn `${MAPBOX_TILES_ROOT_URL}/${endpoint}/${z}/${x}/${y}${res}.pngraw?access_token=${token}`;\n\t}\n\n\tprivate _createTexture(width: number, height: number) {\n\t\tconst texture = new DataTexture(new Float32Array(4 * width * height), width, height, RGBAFormat, FloatType);\n\t\ttexture.image.data.fill(1);\n\t\ttexture.minFilter = LinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.flipY = true; // necessary otherwise the texture is misplaced\n\t\treturn texture;\n\t}\n}\n","/**\n * Imports a mapbox satellite tile.\n *\n * @remarks\n * Note that this node requires a mapbox account.\n */\n\nimport {DataTexture, LinearFilter} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {CoreMapboxUtils} from '../../../core/thirdParty/Mapbox/Utils';\nimport {CoreImage} from '../../../core/Image';\nimport {Poly} from '../../Poly';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {MAPBOX_TOKEN_MISSING_ERROR_MESSAGE} from '../../poly/thirdParty/Mapbox';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {MAPBOX_TILES_ROOT_URL} from '../../../core/thirdParty/Mapbox/MapboxTile';\n\nclass MapboxSatelliteCopParamsConfig extends NodeParamsConfig {\n\t/** @param longitude */\n\tlongitude = ParamConfig.FLOAT(0, {\n\t\trange: [-180, 180],\n\t});\n\t/** @param latitude */\n\tlatitude = ParamConfig.FLOAT(0, {\n\t\trange: [-90, 90],\n\t});\n\t/** @param zoom value */\n\tzoom = ParamConfig.INTEGER(12, {\n\t\trange: [1, 24],\n\t\trangeLocked: [true, true],\n\t});\n\t/** @param highres */\n\thighres = ParamConfig.BOOLEAN(1);\n}\n\nconst ParamsConfig = new MapboxSatelliteCopParamsConfig();\n\nexport class MapboxSatelliteCopNode extends TypedCopNode<MapboxSatelliteCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'mapboxSatellite';\n\t}\n\n\toverride async cook() {\n\t\tconst token = await Poly.thirdParty.mapbox().token();\n\t\tif (!token) {\n\t\t\tthis.states.error.set(MAPBOX_TOKEN_MISSING_ERROR_MESSAGE);\n\t\t\treturn;\n\t\t}\n\n\t\tconst texture = await this._cookForSatellite(token);\n\t\tif (texture) {\n\t\t\t// not sure why .needsUpdate is required\n\t\t\t// since the textures are new on every cook,\n\t\t\t// but it is!\n\t\t\ttexture.needsUpdate = true;\n\t\t\tthis.setTexture(texture);\n\t\t}\n\t}\n\n\tprivate async _cookForSatellite(token: string) {\n\t\tconst url = await this._url('mapbox.satellite', token);\n\t\tconst image_data_rgba = await CoreImage.data_from_url(url);\n\t\tif (!image_data_rgba) {\n\t\t\tthis.states.error.set('invalid image');\n\t\t\treturn;\n\t\t}\n\t\tconst w = image_data_rgba.width;\n\t\tconst h = image_data_rgba.height;\n\t\tconst texture = this._createTexture(w, h);\n\t\tconst data_rgba = image_data_rgba.data;\n\t\tconst bufferSize = 4 * w * h;\n\t\tconst dest_data = texture.image.data;\n\t\tfor (let i = 0; i < bufferSize; i += 4) {\n\t\t\tdest_data[i + 0] = data_rgba[i + 0];\n\t\t\tdest_data[i + 1] = data_rgba[i + 1];\n\t\t\tdest_data[i + 2] = data_rgba[i + 2];\n\t\t}\n\n\t\treturn texture;\n\t}\n\n\tprivate async _url(endpoint: string, token: string) {\n\t\tconst tileNumber = CoreMapboxUtils.lnglatToTileNumber(this.pv.latitude, this.pv.longitude, this.pv.zoom);\n\t\tconst x = tileNumber.x;\n\t\tconst y = tileNumber.y;\n\t\tconst z = this.pv.zoom;\n\n\t\tconst res = isBooleanTrue(this.pv.highres) ? '@2x' : '';\n\n\t\treturn `${MAPBOX_TILES_ROOT_URL}/${endpoint}/${z}/${x}/${y}${res}.pngraw?access_token=${token}`;\n\t}\n\n\tprivate _createTexture(width: number, height: number) {\n\t\tconst texture = new DataTexture(new Uint8Array(4 * width * height), width, height);\n\t\ttexture.image.data.fill(255);\n\t\ttexture.minFilter = LinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.flipY = true; // necessary otherwise the texture is misplaced\n\t\treturn texture;\n\t}\n}\n","/**\n * Export an SDF texture created by [mat/raymarchingBuilder](/doc/nodes/mat/raymarchingBuilder) to disk\n *\n *\n */\nimport {Data3DTexture, Texture} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../_Base';\nimport {downloadBlob} from '../../../core/BlobUtils';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {saveSDFMetadata} from '../../../core/loader/geometry/SDF';\n\nclass SDFExporterCopParamsConfig extends NodeParamsConfig {\n\t/** @param fileName */\n\tfileName = ParamConfig.STRING('`$OS`');\n\t/** @param download texture */\n\tdownload = ParamConfig.BUTTON(null, {\n\t\thidden: true,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tSDFExporterCopNode.PARAM_CALLBACK_download(node as SDFExporterCopNode);\n\t\t},\n\t});\n}\n\nconst ParamsConfig = new SDFExporterCopParamsConfig();\n\nexport class SDFExporterCopNode extends TypedCopNode<SDFExporterCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'SDFExporter';\n\t}\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\toverride async cook(inputContents: Texture[]) {\n\t\tthis.setTexture(inputContents[0]);\n\t}\n\n\t/*\n\t *\n\t * CALLBACK\n\t *\n\t */\n\tstatic PARAM_CALLBACK_download(node: SDFExporterCopNode) {\n\t\tnode._downloadTexture();\n\t}\n\tprivate async _downloadTexture() {\n\t\tconst container = await this.compute();\n\t\tconst texture = container.content() as Data3DTexture;\n\t\tconst dataContainer = texture?.image;\n\t\tif (!dataContainer) {\n\t\t\tthis.states.error.set('the input must be a 3D texture');\n\t\t\treturn;\n\t\t}\n\n\t\tconst dataWithMetadata = saveSDFMetadata(texture);\n\t\tif (!dataWithMetadata) {\n\t\t\treturn;\n\t\t}\n\n\t\t// download blob\n\t\tconst blob = new Blob([dataWithMetadata], {type: 'octet/stream'});\n\t\tif (this.p.fileName.isDirty()) {\n\t\t\tawait this.p.fileName.compute();\n\t\t}\n\t\tconst fileNameShort = this.pv.fileName;\n\t\tdownloadBlob(blob, `${fileNameShort}.bin`);\n\t}\n}\n","/**\n * Loads an SDF created by [mat/raymarchingBuilder](/doc/nodes/mat/raymarchingBuilder) from a url.\n *\n *\n */\nimport {SDFDataContainer, SDFLoader} from './../../../core/loader/geometry/SDF';\nimport {Texture} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../_Base';\nimport {CopType} from '../../poly/registers/nodes/types/Cop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\nclass SDFFromUrlCopParamsConfig extends NodeParamsConfig {\n\t/** @param url to fetch the image from */\n\turl = ParamConfig.STRING('', {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.SDF_FROM_URL]},\n\t});\n\n\t/** @param reload */\n\treload = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tSDFFromUrlCopNode.PARAM_CALLBACK_reload(node as SDFFromUrlCopNode);\n\t\t},\n\t});\n\t/** @param resolution */\n\tresolution = ParamConfig.VECTOR3([-1, -1, -1], {\n\t\tcook: false,\n\t\teditable: false,\n\t\tseparatorBefore: true,\n\t});\n\t/** @param boundMin */\n\tboundMin = ParamConfig.VECTOR3([-1, -1, -1], {\n\t\tcook: false,\n\t\teditable: false,\n\t});\n\t/** @param boundMax */\n\tboundMax = ParamConfig.VECTOR3([1, 1, 1], {\n\t\tcook: false,\n\t\teditable: false,\n\t});\n}\n\nconst ParamsConfig = new SDFFromUrlCopParamsConfig();\n\nexport class SDFFromUrlCopNode extends TypedCopNode<SDFFromUrlCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CopType.SDF_FROM_URL;\n\t}\n\n\toverride async cook(inputContents: Texture[]) {\n\t\tconst url = this.pv.url;\n\t\tconst loader = new SDFLoader(url, this);\n\t\tloader.load(\n\t\t\t(texture) => {\n\t\t\t\tconst dataContainer = texture.image as unknown as SDFDataContainer;\n\t\t\t\tthis.scene().batchUpdates(() => {\n\t\t\t\t\tthis.p.resolution.set([\n\t\t\t\t\t\tdataContainer.resolutionx,\n\t\t\t\t\t\tdataContainer.resolutiony,\n\t\t\t\t\t\tdataContainer.resolutionz,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.p.boundMin.set([dataContainer.boundMinx, dataContainer.boundMiny, dataContainer.boundMinz]);\n\t\t\t\t\tthis.p.boundMax.set([dataContainer.boundMaxx, dataContainer.boundMaxy, dataContainer.boundMaxz]);\n\t\t\t\t});\n\t\t\t\tthis.setTexture(texture);\n\t\t\t},\n\t\t\t() => {},\n\t\t\t(err) => {\n\t\t\t\tthis.states.error.set(err.message || 'loading failed');\n\t\t\t}\n\t\t);\n\t}\n\n\t/*\n\t *\n\t * CALLBACK\n\t *\n\t */\n\tstatic PARAM_CALLBACK_reload(node: SDFFromUrlCopNode) {\n\t\tnode.p.url.setDirty();\n\t}\n}\n","import {DataTexture, Vector2, Color} from 'three';\nimport FontFaceObserver from 'fontfaceobserver';\n\nfunction colorStyleWithAlpha(color: Color, alpha: number): string {\n\tconst rgb = color.getStyle();\n\tconst elements = rgb.split('(')[1].split(')')[0].split(',');\n\treturn `rgba(${elements[0]},${elements[1]},${elements[2]},${alpha})`;\n}\n\ninterface WriteTextToCanvasOptions {\n\ttexture: DataTexture;\n\ttext: string;\n\tfontFamily: string;\n\tfontSize: number;\n\tresolution: Vector2;\n\tbgColor: Color;\n\tbgAlpha: number;\n\ttextColor: Color;\n\ttextAlpha: number;\n}\ninterface LoadAndUseFontOtions extends WriteTextToCanvasOptions {\n\tfontUrl: string;\n}\n\nfunction writeTextToCanvas(options: WriteTextToCanvasOptions) {\n\tconst {texture, text, fontSize, resolution, bgColor, bgAlpha, textColor, textAlpha, fontFamily} = options;\n\tconst canvas = document.createElement('canvas');\n\tcanvas.width = resolution.x;\n\tcanvas.height = resolution.y;\n\tconst ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n\t// draw bg\n\tctx.fillStyle = colorStyleWithAlpha(bgColor, bgAlpha);\n\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\n\t// draw text\n\tctx.font = fontFamily;\n\tctx.fillStyle = colorStyleWithAlpha(textColor, textAlpha);\n\n\tlet usedFontSize = fontSize;\n\tconst metrix = () => ctx.measureText(text);\n\tconst usedFont = () => `${usedFontSize}px ${fontFamily}`;\n\tconst textWidth = (m: TextMetrics) => m.width;\n\tconst textHeight = (m: TextMetrics) => m.actualBoundingBoxAscent + m.actualBoundingBoxDescent;\n\tconst isFontTooLarge = (m: TextMetrics) => {\n\t\treturn textWidth(m) > canvas.width || textHeight(m) > canvas.height;\n\t};\n\t// reduce the font size until the text is contained in the canvas\n\tctx.font = usedFont();\n\tlet m = metrix();\n\twhile (isFontTooLarge(m)) {\n\t\tusedFontSize--;\n\t\tctx.font = usedFont();\n\t\tm = metrix();\n\t}\n\tconst positionX = (canvas.width - textWidth(m)) / 2;\n\tconst positionY = (canvas.height + textHeight(m) / 2) / 2;\n\tctx.fillText(text, positionX, positionY);\n\n\tconst imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\n\ttexture.source.data = imageData;\n\ttexture.needsUpdate = true;\n}\n\nexport async function loadAndUseFont(options: LoadAndUseFontOtions) {\n\tconst {fontFamily, fontUrl} = options;\n\n\tconst font = new FontFaceObserver(fontFamily);\n\n\ttry {\n\t\t// Create a new stylesheet\n\t\tconst style = document.createElement('style');\n\t\tdocument.head.appendChild(style);\n\n\t\t// Inject font-face rule\n\t\tstyle.sheet?.insertRule(\n\t\t\t`\n    @font-face {\n      font-family: '${fontFamily}';\n      src: url('${fontUrl}');\n    }\n  `,\n\t\t\t0\n\t\t);\n\t\t// Wait for font to be loaded\n\t\tawait font.load();\n\n\t\twriteTextToCanvas({\n\t\t\t...options,\n\t\t});\n\t\t// Use the loaded font\n\t\t// const writer = new CanvasTextWriter({resolution});\n\t\t// writer.writeText(text, '50px ' + fontFamily, 'black');\n\t} catch (err) {\n\t\tconsole.log(`Font is not available: ${err}`);\n\t}\n}\n\n// loadAndUseFont('MyCustomFont', 'path-to-your-font/your-font-file.woff', 'yourCanvasId', 'Hello, World!', 800, 600);\n","/**\n * Creates a texture from text\n *\n *\n */\nimport {DataTexture, Vector2, RGBAFormat, UnsignedByteType} from 'three';\nimport {TypedCopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {TextureParamsController, TextureParamConfig} from './utils/TextureParamsController';\nimport {Constructor} from '../../../types/GlobalTypes';\nimport {DEFAULT_FONT_URL_TTF} from '../../../core/Assets';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {CopType} from '../../poly/registers/nodes/types/Cop';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {loadAndUseFont} from '../../../core/Text';\nimport {sanitizeName} from '../../../core/String';\n\nconst _v2 = new Vector2();\n\nexport function TextCopNodeParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param font used */\n\t\tfont = ParamConfig.STRING(DEFAULT_FONT_URL_TTF, {\n\t\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.TEXT]},\n\t\t});\n\t\t/** @param text created */\n\t\ttext = ParamConfig.STRING('polygonjs', {\n\t\t\tmultiline: true,\n\t\t});\n\t\t/** @param render resolution */\n\t\tresolution = ParamConfig.VECTOR2([256, 256]);\n\t\t/** @param font size */\n\t\tfontSize = ParamConfig.INTEGER(32, {\n\t\t\trange: [0, 256],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param background color */\n\t\tbgColor = ParamConfig.COLOR([0, 0, 0]);\n\t\t/** @param background alpha */\n\t\tbgAlpha = ParamConfig.FLOAT(0);\n\t\t/** @param text color */\n\t\ttextColor = ParamConfig.COLOR([1, 1, 1]);\n\t\t/** @param text alpha */\n\t\ttextAlpha = ParamConfig.FLOAT(1);\n\t};\n}\nclass TextCopParamConfig extends TextureParamConfig(TextCopNodeParamConfig(NodeParamsConfig)) {}\n\nconst ParamsConfig = new TextCopParamConfig();\n\nexport class TextCopNode extends TypedCopNode<TextCopParamConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<CopType.TEXT> {\n\t\treturn CopType.TEXT;\n\t}\n\tpublic readonly textureParamsController: TextureParamsController = new TextureParamsController(this);\n\n\tprivate _dataTexture: DataTexture | undefined;\n\toverride async cook() {\n\t\tthis._dataTexture = this._findOrCreateDataTexture();\n\n\t\tconst url = this.pv.font.split('/');\n\t\tconst fontNameFromUrl = url[url.length - 1].split('.')[0];\n\t\tawait loadAndUseFont({\n\t\t\ttexture: this._dataTexture,\n\t\t\ttext: this.pv.text,\n\t\t\tfontFamily: sanitizeName(this.path()) + fontNameFromUrl,\n\t\t\tfontSize: this.pv.fontSize,\n\t\t\tfontUrl: this.pv.font,\n\t\t\tresolution: this.pv.resolution,\n\t\t\tbgColor: this.pv.bgColor,\n\t\t\tbgAlpha: this.pv.bgAlpha,\n\t\t\ttextColor: this.pv.textColor,\n\t\t\ttextAlpha: this.pv.textAlpha,\n\t\t});\n\n\t\tawait this.textureParamsController.update(this._dataTexture);\n\n\t\tthis.setTexture(this._dataTexture);\n\t}\n\n\tprivate _dataTextureResolutionValid(texture: DataTexture) {\n\t\tconst image = texture.source.data;\n\t\tthis._requestedResolution(_v2);\n\t\treturn image.width == _v2.x && image.height == _v2.y;\n\t}\n\tprivate _requestedResolution(target: Vector2) {\n\t\ttarget.copy(this.pv.resolution);\n\t}\n\tprivate _findOrCreateDataTexture() {\n\t\tthis._requestedResolution(_v2);\n\t\tif (this._dataTexture && this._dataTextureResolutionValid(this._dataTexture)) {\n\t\t\treturn this._dataTexture;\n\t\t}\n\t\tconst size = _v2.x * _v2.y * 4;\n\t\tconst pixelBuffer = new Uint8Array(size);\n\n\t\tconst dataTexture = new DataTexture(pixelBuffer, _v2.x, _v2.y, RGBAFormat, UnsignedByteType);\n\t\treturn dataTexture;\n\t}\n}\n","import {VideoTexture, LoadingManager, Loader} from 'three';\n// import {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {CoreLoaderTexture} from '../Texture';\nimport {CoreBaseLoader} from './../_Base';\n// import {BaseTextureLoader,} from './_BaseTextureLoader';\n// import {TextureLoadOptions} from './_BaseImageLoader';\nimport {Poly} from '../../../engine/Poly';\ninterface VideoSourceTypeByExt {\n\togg: string;\n\togv: string;\n\tmp4: string;\n}\nconst VIDEO_SOURCE_TYPE_BY_EXT: VideoSourceTypeByExt = {\n\togg: 'video/ogg; codecs=\"theora, vorbis\"',\n\togv: 'video/ogg; codecs=\"theora, vorbis\"',\n\tmp4: 'video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"',\n};\n\ntype OnLoad = (texture: VideoTexture) => void;\ntype OnProgress = (progress: number) => void;\ntype OnError = (error: Error) => void;\nclass VideoTextureLoader extends Loader<VideoTexture> {\n\tconstructor(manager: LoadingManager, protected originalUrls: string[]) {\n\t\tsuper(manager);\n\t}\n\tloadMultipleUrls(urls: string[], onLoad: OnLoad, onProgress?: OnProgress, onError?: OnError) {\n\t\tconst video = document.createElement('video');\n\t\tvideo.setAttribute('crossOrigin', 'anonymous');\n\t\tvideo.setAttribute('playinline', `${true}`);\n\t\tvideo.setAttribute('muted', `${true}`);\n\t\tvideo.setAttribute('autoplay', `${true}`); // to ensure it loads\n\t\tvideo.style.display = 'none';\n\n\t\t// DO NOT WAIT FOR onloadedmetadata event\n\t\t// to create the VideoTexture\n\t\t// as this breaks loading\n\t\t// when using a texture that has both mp4 and ogv\n\t\tconst texture = new VideoTexture(video);\n\t\tvideo.onloadedmetadata = () => {\n\t\t\t// video.pause();\n\t\t\t// const texture = new VideoTexture(video);\n\t\t\t// video.setAttribute('controls', true)\n\t\t\t// video.style=\"display:none\"\n\t\t\tonLoad(texture);\n\t\t};\n\t\tvideo.onprogress = (ev) => {\n\t\t\tif (onProgress) {\n\t\t\t\tonProgress(ev.loaded / ev.total);\n\t\t\t}\n\t\t};\n\t\tconst _onError = (error: string | Event) => {\n\t\t\tif (onError) {\n\t\t\t\tonError(new Error('failed to load video'));\n\t\t\t}\n\t\t};\n\t\tvideo.onerror = _onError;\n\t\t// video.addEventListener('abort', _onError);\n\t\t// video.addEventListener('suspend', _onError);\n\t\t// video.addEventListener('stalled', _onError);\n\n\t\tconst urlsCount = urls.length;\n\t\tfor (let i = 0; i < urlsCount; i++) {\n\t\t\tconst blobUrl = urls[i];\n\t\t\tconst originalUrl = this.originalUrls[i];\n\n\t\t\tconst ext = CoreBaseLoader.extension(originalUrl) as keyof VideoSourceTypeByExt;\n\t\t\tconst type = VIDEO_SOURCE_TYPE_BY_EXT[ext] || `video/${ext}`;\n\n\t\t\tconst source = document.createElement('source');\n\t\t\tsource.src = blobUrl;\n\t\t\tsource.type = type;\n\t\t\tvideo.append(source);\n\t\t}\n\t}\n}\nexport class CoreVideoTextureLoader extends CoreBaseLoader<string[]> {\n\tasync loadVideo(): Promise<VideoTexture> {\n\t\tconst urls = this._urlToLoad();\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst loader = await this._getLoader();\n\n\t\t\turls.forEach((url) => CoreLoaderTexture.incrementInProgressLoadsCount());\n\t\t\tawait CoreLoaderTexture.waitForMaxConcurrentLoadsQueueFreed();\n\t\t\tloader.loadMultipleUrls(\n\t\t\t\turls,\n\t\t\t\t(texture: VideoTexture) => {\n\t\t\t\t\turls.forEach((url, i) => {\n\t\t\t\t\t\tconst isLast = i == urls.length - 1;\n\t\t\t\t\t\tCoreLoaderTexture.decrementInProgressLoadsCount(url, isLast ? texture : undefined);\n\t\t\t\t\t});\n\n\t\t\t\t\tresolve(texture);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t(error: any) => {\n\t\t\t\t\turls.forEach((url) => CoreLoaderTexture.decrementInProgressLoadsCount(url));\n\t\t\t\t\tPoly.warn('error', error);\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected async _getLoader() {\n\t\tconst loader = new VideoTextureLoader(this.loadingManager, this._url);\n\t\treturn loader;\n\t}\n\n\t// constructor(protected override _url: string, protected override _node: BaseNodeType) {\n\t// \tsuper(_url, _node);\n\t// }\n\n\t// loadVideo(): Promise<VideoTexture> {\n\t// \t// if (1 + 1) {\n\t// \t// \treturn this._loadVideoFull();\n\t// \t// } else {\n\t// \treturn this._loadVideoDefault();\n\t// \t// }\n\t// }\n\t// // private _loadVideoFull(): Promise<VideoTexture> {\n\t// // \treturn new Promise(async (resolve) => {\n\t// // \t\tconst url = await this._urlToLoad();\n\t// // \t\tconsole.log(url);\n\t// // \t\tfetch(url, {mode: 'no-cors'}).then(async (response) => {\n\t// // \t\t\tconsole.log({response});\n\t// // \t\t\tconst blob = await response.blob();\n\t// // \t\t\tconsole.log({blob});\n\t// // \t\t\tconst source = URL.createObjectURL(blob);\n\t// // \t\t\tconsole.log(source);\n\t// // \t\t\tconst video = document.createElement('video');\n\t// // \t\t\tvideo.src = source;\n\n\t// // \t\t\tconst texture = new VideoTexture(video);\n\t// // \t\t\t//    document.body.append(video)\n\t// // \t\t\tresolve(texture);\n\t// // \t\t});\n\t// // \t});\n\t// // }\n\t// private _loadVideoDefault(): Promise<VideoTexture> {\n\t// \treturn new Promise(async (resolve, reject) => {\n\t// \t\tconst url = await this._urlToLoad();\n\t// \t\tCoreLoaderTexture.incrementInProgressLoadsCount();\n\t// \t\tawait CoreLoaderTexture.waitForMaxConcurrentLoadsQueueFreed();\n\n\t// \t\tconst video = document.createElement('video');\n\t// \t\tvideo.setAttribute('crossOrigin', 'anonymous');\n\t// \t\tvideo.setAttribute('autoplay', `${true}`); // to ensure it loads\n\t// \t\tvideo.setAttribute('loop', `${true}`);\n\t// \t\t// wait for onloadedmetadata to ensure that we have a duration\n\t// \t\t// video.onloadeddata = function (e) {\n\t// \t\t// \tconsole.log('onloadeddata', e);\n\t// \t\t// };\n\t// \t\tvideo.onloadedmetadata = function () {\n\t// \t\t\tvideo.pause();\n\t// \t\t\tconst texture = new VideoTexture(video);\n\t// \t\t\t// video.setAttribute('controls', true)\n\t// \t\t\t// video.style=\"display:none\"\n\t// \t\t\tCoreLoaderTexture.decrementInProgressLoadsCount(url, texture);\n\t// \t\t\tresolve(texture);\n\t// \t\t};\n\n\t// \t\t// add source as is\n\t// \t\tconst originalSource = document.createElement('source');\n\t// \t\tconst originalExt = CoreBaseLoader.extension(url) as keyof VideoSourceTypeByExt;\n\t// \t\tlet type: string = VideoTextureLoader.VIDEO_SOURCE_TYPE_BY_EXT[originalExt];\n\t// \t\ttype = type || VideoTextureLoader._default_video_source_type(url);\n\t// \t\toriginalSource.setAttribute('type', type);\n\t// \t\toriginalSource.setAttribute('src', url);\n\t// \t\tvideo.appendChild(originalSource);\n\n\t// \t\t// add secondary source, either mp4 or ogv depending on the first url\n\t// \t\tlet secondaryUrl: string | undefined;\n\t// \t\tif (originalExt == 'mp4') {\n\t// \t\t\t// add ogv\n\t// \t\t\tsecondaryUrl = CoreLoaderTexture.replaceExtension(url, 'ogv');\n\t// \t\t} else {\n\t// \t\t\t// add mp4\n\t// \t\t\tsecondaryUrl = CoreLoaderTexture.replaceExtension(url, 'mp4');\n\t// \t\t}\n\t// \t\tconst secondary_source = document.createElement('source');\n\t// \t\tconst secondary_ext = CoreBaseLoader.extension(secondaryUrl) as keyof VideoSourceTypeByExt;\n\t// \t\ttype = VideoTextureLoader.VIDEO_SOURCE_TYPE_BY_EXT[secondary_ext];\n\t// \t\ttype = type || VideoTextureLoader._default_video_source_type(url);\n\t// \t\tsecondary_source.setAttribute('type', type);\n\t// \t\tsecondary_source.setAttribute('src', url);\n\t// \t\tvideo.appendChild(secondary_source);\n\t// \t});\n\t// }\n\n\t// static _default_video_source_type(url: string) {\n\t// \tconst ext = CoreBaseLoader.extension(url);\n\t// \treturn `video/${ext}`;\n\t// }\n}\n","/**\n * Imports a video\n *\n * @remarks\n * TIP: to ensure that your video starts as soon as possible, make sure to pre-process it with a tool like qt-faststart. There are many places where you can find it, but here are some suggestions:\n *\n * - download it from [https://pypi.org/project/qtfaststart/](https://pypi.org/project/qtfaststart/)\n * - download it from [https://manpages.debian.org/stretch/ffmpeg/qt-faststart.1.en.html](https://manpages.debian.org/stretch/ffmpeg/qt-faststart.1.en.html)\n * - with ffmpeg, you can use the following command line: `ffmpeg -i in.mp4 -c copy -map 0 -movflags +faststart out.mp4\n`\n\nIn a future version of this node, it will also be possible to link it to a video tag that could already be in your html DOM. This way, you could sets multiple source tags (one with mp4 and one with ogv) instead of a single url.\n\n */\nimport {ParamEvent} from './../../poly/ParamEvent';\nimport {Constructor} from '../../../types/GlobalTypes';\nimport {VideoTexture} from 'three';\nimport {Texture} from 'three';\nimport {TypedCopNode} from './_Base';\n\nimport {BaseNodeType} from '../_Base';\nimport {BaseParamType} from '../../params/_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isUrlVideo} from '../../../core/FileTypeController';\nimport {TextureParamsController, TextureParamConfig} from './utils/TextureParamsController';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {CopType} from '../../poly/registers/nodes/types/Cop';\nimport {FileTypeCheckCopParamConfig} from './utils/CheckFileType';\nimport {Poly} from '../../Poly';\nimport {CoreVideoTextureLoader} from '../../../core/loader/texture/Video';\nimport {VideoEvent, VIDEO_EVENTS} from '../../../core/VideoEvent';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {isHTMLVideoElementLoaded} from '../../../core/DomUtils';\nimport {NodeContext} from '../../poly/NodeContext';\n// import {TypeAssert} from '../../poly/Assert'\nimport {StringParam} from '../../params/String';\n\nexport enum VideoMode {\n\tFROM_URLS = 'From Urls',\n\tFROM_HTML_ELEMENT = 'From HTML Element',\n}\nconst VIDEO_MODES: VideoMode[] = [VideoMode.FROM_URLS, VideoMode.FROM_HTML_ELEMENT];\nconst VIDEO_MODE_ENTRIES = VIDEO_MODES.map((name, value) => ({name, value}));\nconst VIDEO_MODE_FROM_URLS = VIDEO_MODES.indexOf(VideoMode.FROM_URLS);\nconst VIDEO_MODE_FROM_HTML_ELEMENT = VIDEO_MODES.indexOf(VideoMode.FROM_HTML_ELEMENT);\n\nfunction VideoCopParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param mode */\n\t\tmode = ParamConfig.INTEGER(VIDEO_MODE_FROM_URLS, {\n\t\t\tmenu: {\n\t\t\t\tentries: VIDEO_MODE_ENTRIES,\n\t\t\t},\n\t\t});\n\t\t/** @param number of video files to fetch */\n\t\turlsCount = ParamConfig.INTEGER(2, {\n\t\t\trange: [1, 3],\n\t\t\trangeLocked: [true, true],\n\t\t\tvisibleIf: {\n\t\t\t\tmode: VIDEO_MODE_FROM_URLS,\n\t\t\t},\n\t\t});\n\t\t/** @param url to fetch the video from */\n\t\turl1 = ParamConfig.STRING('', {\n\t\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.VIDEO]},\n\t\t});\n\t\t/** @param url to fetch the video from */\n\t\turl2 = ParamConfig.STRING('', {\n\t\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.VIDEO]},\n\t\t\tvisibleIf: [\n\t\t\t\t{mode: VIDEO_MODE_FROM_URLS, urlsCount: 2},\n\t\t\t\t{mode: VIDEO_MODE_FROM_URLS, urlsCount: 3},\n\t\t\t],\n\t\t});\n\t\t/** @param url to fetch the video from */\n\t\turl3 = ParamConfig.STRING('', {\n\t\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.COP][CopType.VIDEO]},\n\t\t\tvisibleIf: {mode: VIDEO_MODE_FROM_URLS, urlsCount: 3},\n\t\t});\n\t\t/** @param selector */\n\t\tselector = ParamConfig.STRING('', {\n\t\t\tvisibleIf: {mode: VIDEO_MODE_FROM_HTML_ELEMENT},\n\t\t});\n\t\t/** @param reload the video */\n\t\treload = ParamConfig.BUTTON(null, {\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tVideoCopNode.PARAM_CALLBACK_reload(node as VideoCopNode, param);\n\t\t\t},\n\t\t});\n\t\t/** @param play the video */\n\t\tplay = ParamConfig.BOOLEAN(1, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tVideoCopNode.PARAM_CALLBACK_videoUpdatePlay(node as VideoCopNode);\n\t\t\t},\n\t\t});\n\t\t/** @param set the video muted attribute */\n\t\tmuted = ParamConfig.BOOLEAN(1, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tVideoCopNode.PARAM_CALLBACK_videoUpdateMuted(node as VideoCopNode);\n\t\t\t},\n\t\t});\n\t\t/** @param set the video loop attribute */\n\t\tloop = ParamConfig.BOOLEAN(1, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tVideoCopNode.PARAM_CALLBACK_videoUpdateLoop(node as VideoCopNode);\n\t\t\t},\n\t\t});\n\t\t/** @param set the video time */\n\t\tvideoTime = ParamConfig.FLOAT(0, {\n\t\t\tcook: false,\n\t\t\t// do not use videoTime, as calling \"this._video.currentTime =\" every frame is really expensive\n\t\t});\n\t\t/** @param seek the video at the time specified in videoTime */\n\t\tsetVideoTime = ParamConfig.BUTTON(null, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tVideoCopNode.PARAM_CALLBACK_videoUpdateTime(node as VideoCopNode);\n\t\t\t},\n\t\t});\n\t};\n}\n\nclass VideoCopParamsConfig extends FileTypeCheckCopParamConfig(\n\tTextureParamConfig(VideoCopParamConfig(NodeParamsConfig))\n) {}\n\nconst ParamsConfig = new VideoCopParamsConfig();\n\nexport class VideoCopNode extends TypedCopNode<VideoCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CopType.VIDEO;\n\t}\n\n\tprivate _video: HTMLVideoElement | undefined;\n\tHTMLVideoElement() {\n\t\treturn this._video;\n\t}\n\t// private _data_texture_controller: DataTextureController | undefined;\n\tpublic readonly textureParamsController: TextureParamsController = new TextureParamsController(this);\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis._disposeHTMLVideoElement();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\tprivate _disposeHTMLVideoElement() {\n\t\tif (this._video) {\n\t\t\tthis._removeVideoEvents(this._video);\n\t\t\tthis._video.parentElement?.removeChild(this._video);\n\t\t}\n\t}\n\tsetMode(mode: VideoMode) {\n\t\tthis.p.mode.set(VIDEO_MODES.indexOf(mode));\n\t}\n\tmode() {\n\t\treturn VIDEO_MODES[this.pv.mode];\n\t}\n\n\toverride async cook(input_contents: Texture[]) {\n\t\tconst mode = this.mode();\n\t\tif (mode == VideoMode.FROM_URLS && isBooleanTrue(this.pv.checkFileType)) {\n\t\t\tconst setUrlNotVideoError = (param: StringParam) => {\n\t\t\t\tthis.states.error.set(`url from param ${param.name()} is not a video ('${param.value}')`);\n\t\t\t};\n\t\t\tif (!isUrlVideo(this.pv.url1)) {\n\t\t\t\treturn setUrlNotVideoError(this.p.url1);\n\t\t\t}\n\t\t\tconst urlsCount = this.pv.urlsCount;\n\t\t\tif (urlsCount >= 2) {\n\t\t\t\tif (!isUrlVideo(this.pv.url2)) {\n\t\t\t\t\treturn setUrlNotVideoError(this.p.url2);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (urlsCount >= 3) {\n\t\t\t\tif (!isUrlVideo(this.pv.url3)) {\n\t\t\t\t\treturn setUrlNotVideoError(this.p.url3);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst texture =\n\t\t\tmode == VideoMode.FROM_URLS ? await this._loadTexture() : await this._videoTextureFromSelector();\n\t\tif (texture) {\n\t\t\tthis._disposeHTMLVideoElement();\n\t\t\tthis._video = texture.image;\n\t\t\tif (this._video) {\n\t\t\t\tthis._addVideoEvents(this._video);\n\t\t\t\t// document.body.appendChild(this._video);\n\t\t\t}\n\t\t\tconst inputTexture = input_contents[0];\n\t\t\tif (inputTexture) {\n\t\t\t\tTextureParamsController.copyTextureAttributes(texture, inputTexture);\n\t\t\t}\n\n\t\t\tthis.videoUpdateLoop();\n\t\t\tthis.videoUpdateMuted();\n\t\t\tthis.videoUpdatePlay();\n\t\t\tthis.videoUpdateTime();\n\t\t\tawait this.textureParamsController.update(texture);\n\t\t\tthis.setTexture(texture);\n\t\t} else {\n\t\t\tthis.cookController.endCook();\n\t\t}\n\t}\n\tprivate _videoBoundEvents: Record<VideoEvent, () => void> = {\n\t\tplay: this._onVideoEventPlay.bind(this),\n\t\tpause: this._onVideoEventPause.bind(this),\n\t\ttimeupdate: this._onVideoEventTimeUpdate.bind(this),\n\t\tvolumechange: this._onVideoEventVolumeChange.bind(this),\n\t};\n\tprivate _addVideoEvents(video: HTMLVideoElement) {\n\t\tfor (const eventName of VIDEO_EVENTS) {\n\t\t\tvideo.addEventListener(eventName, this._videoBoundEvents[eventName]);\n\t\t}\n\t}\n\tprivate _removeVideoEvents(video: HTMLVideoElement) {\n\t\tfor (const eventName of VIDEO_EVENTS) {\n\t\t\tvideo.removeEventListener(eventName, this._videoBoundEvents[eventName]);\n\t\t}\n\t}\n\tprivate _onVideoEvent(eventName: VideoEvent) {\n\t\tthis.dispatchEvent({type: eventName});\n\t}\n\n\tprivate _onVideoEventPlay() {\n\t\tthis._onVideoEvent(VideoEvent.PLAY);\n\t}\n\tprivate _onVideoEventPause() {\n\t\tthis._onVideoEvent(VideoEvent.PAUSE);\n\t}\n\tprivate _onVideoEventTimeUpdate() {\n\t\tthis._onVideoEvent(VideoEvent.TIME_UPDATE);\n\t}\n\tprivate _onVideoEventVolumeChange() {\n\t\tthis._onVideoEvent(VideoEvent.VOLUME_CHANGE);\n\t}\n\tvideoStatePlaying() {\n\t\treturn this._video ? !this._video.paused : false;\n\t}\n\tvideoStateMuted() {\n\t\treturn this._video ? this._video.muted : true;\n\t}\n\tvideoDuration() {\n\t\treturn this._video?.duration || 0;\n\t}\n\tvideoCurrentTime() {\n\t\treturn this._video?.currentTime || 0;\n\t}\n\n\t//\n\t//\n\t// VIDEO STATE\n\t//\n\t//\n\t//\n\n\t// time\n\tstatic PARAM_CALLBACK_videoUpdateTime(node: VideoCopNode) {\n\t\tnode.videoUpdateTime();\n\t}\n\tprivate async videoUpdateTime() {\n\t\tif (this._video) {\n\t\t\tconst param = this.p.videoTime;\n\t\t\tif (param.isDirty()) {\n\t\t\t\tawait param.compute();\n\t\t\t}\n\t\t\tthis._videoUpdateTime(this._video);\n\t\t}\n\t}\n\tprivate async _videoUpdateTime(video: HTMLVideoElement) {\n\t\tvideo.currentTime = this.pv.videoTime;\n\t}\n\t// play\n\tstatic PARAM_CALLBACK_videoUpdatePlay(node: VideoCopNode) {\n\t\tnode.videoUpdatePlay();\n\t}\n\tprivate videoUpdatePlay() {\n\t\tif (this._video) {\n\t\t\tthis._videoUpdatePlay(this._video);\n\t\t}\n\t}\n\tprivate _videoUpdatePlay(video: HTMLVideoElement) {\n\t\tif (isBooleanTrue(this.pv.play)) {\n\t\t\tvideo.play();\n\t\t} else {\n\t\t\tvideo.pause();\n\t\t}\n\t}\n\t// muted\n\tstatic PARAM_CALLBACK_videoUpdateMuted(node: VideoCopNode) {\n\t\tnode.videoUpdateMuted();\n\t}\n\tprivate videoUpdateMuted() {\n\t\tif (this._video) {\n\t\t\tthis._videoUpdateMuted(this._video);\n\t\t}\n\t}\n\tprivate _videoUpdateMuted(video: HTMLVideoElement) {\n\t\tvideo.muted = isBooleanTrue(this.pv.muted);\n\t}\n\t// loop\n\tstatic PARAM_CALLBACK_videoUpdateLoop(node: VideoCopNode) {\n\t\tnode.videoUpdateLoop();\n\t}\n\tprivate videoUpdateLoop() {\n\t\tif (this._video) {\n\t\t\tthis._videoUpdateLoop(this._video);\n\t\t}\n\t}\n\tprivate _videoUpdateLoop(video: HTMLVideoElement) {\n\t\tvideo.loop = isBooleanTrue(this.pv.loop);\n\t}\n\t//\n\t// VIDEO CREATE / GET\n\t//\n\t//\n\t// private _createVideoElement(){\n\t// \tconst mode = VIDEO_MODES[this.pv.mode]\n\t// \tswitch(mode){\n\t// \t\tcase VideoMode.FROM_URLS:{\n\t// \t\t\treturn this._videoElementFromUrls()\n\t// \t\t}\n\t// \t\tcase VideoMode.FROM_HTML_ELEMENT:{\n\t// \t\t\treturn this._videoElementFromSelector()\n\t// \t\t}\n\t// \t}\n\t// \tTypeAssert.unreachable(mode)\n\t// }\n\t// private _videoElementFromUrls(){\n\t// \tconst _createVideoTag=()=>{\n\t// \t\tconst video = document.createElement('video')\n\t// \t\tthis._videoUpdateLoop(video)\n\t// \t\tthis._videoUpdateMuted(video)\n\t// \t\tvideo.setAttribute('crossOrigin', 'anonymous');\n\t// \t\tvideo.setAttribute('autoplay', `${true}`); // to ensure it loads\n\t// \t\treturn video\n\t// \t}\n\t// \tconst _addUrls=(video:HTMLVideoElement, urls:string[])=>{\n\t// \t\tfor(let url of urls){\n\t// \t\t\tconst source = document.createElement('source')\n\t// \t\t\tsource.src = url;\n\t// \t\t\tvideo.append(source)\n\t// \t\t\t}\n\t// \t}\n\t// \treturn _addUrls(_createVideoTag(),this._urlParams().map(p=>p.value))\n\n\t// }\n\tprivate async _videoTextureFromSelector(): Promise<VideoTexture | undefined> {\n\t\tconst selector = this.pv.selector;\n\t\tconst element = document.querySelector(selector);\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(element instanceof HTMLVideoElement)) {\n\t\t\tthis.states.error.set(`element found with selector '${selector}' is not a video`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst texture = new VideoTexture(element);\n\t\treturn new Promise((resolve) => {\n\t\t\tif (isHTMLVideoElementLoaded(element)) {\n\t\t\t\tresolve(texture);\n\t\t\t}\n\t\t\telement.onloadedmetadata = () => {\n\t\t\t\tresolve(texture);\n\t\t\t};\n\t\t});\n\t}\n\n\t//\n\t//\n\t// UTILS\n\t//\n\t//\n\turlParams() {\n\t\tconst urlsCount = this.pv.urlsCount;\n\t\tswitch (urlsCount) {\n\t\t\tcase 1: {\n\t\t\t\treturn [this.p.url1];\n\t\t\t}\n\t\t\tcase 2: {\n\t\t\t\treturn [this.p.url1, this.p.url2];\n\t\t\t}\n\t\t\tcase 3: {\n\t\t\t\treturn [this.p.url1, this.p.url2, this.p.url3];\n\t\t\t}\n\t\t}\n\t\treturn [];\n\t}\n\tprivate _urlsToLoad() {\n\t\treturn this.urlParams().map((p) => p.value);\n\t}\n\tstatic PARAM_CALLBACK_reload(node: VideoCopNode, param: BaseParamType) {\n\t\tnode.paramCallbackReload();\n\t}\n\tprivate paramCallbackReload() {\n\t\t// set the param dirty is preferable to just the successors, in case the expression result needs to be updated\n\t\t// this.p.url.set_successors_dirty();\n\t\t// this.p.url.setDirty();\n\t\t// this.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t\tconst urlParams = this.urlParams();\n\t\tfor (const urlParam of urlParams) {\n\t\t\turlParam.setDirty();\n\t\t\turlParam.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t\t}\n\t}\n\n\tprivate async _loadTexture() {\n\t\tconst urls = this._urlsToLoad();\n\t\tlet texture: Texture | VideoTexture | null = null;\n\t\tconst loader = new CoreVideoTextureLoader(urls, this);\n\t\ttry {\n\t\t\ttexture = await loader.loadVideo();\n\t\t\tif (texture) {\n\t\t\t\ttexture.matrixAutoUpdate = false;\n\t\t\t}\n\t\t} catch (e) {}\n\t\tif (!texture) {\n\t\t\tthis.states.error.set(`could not load video from textures '${urls.join(',')}'`);\n\t\t}\n\t\treturn texture;\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {Texture} from 'three';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {FlagsControllerBO} from '../utils/FlagsController';\nimport {DataTexture} from 'three';\nimport {LuminanceFormat, HalfFloatType} from 'three';\n\nvar size = 32;\nvar data = new Uint16Array(size);\nfor (var i = 0; i < size; i++) {\n\tdata[i] = 0x70e2; // Half float 10000\n}\nconst EMPTY_DATA_TEXTURE = new DataTexture(data, size, 1, LuminanceFormat, HalfFloatType);\n\n/**\n *\n *\n * TypedCopNode is the base class for all nodes that process textures. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\n\nexport class TypedCopNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.COP, K> {\n\tpublic override readonly flags: FlagsControllerBO = new FlagsControllerBO(this);\n\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.COP;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis.io.outputs.setHasOneOutput();\n\t}\n\n\tprivate ___textureSync: Texture | undefined;\n\t__textureSync__(): Texture | undefined {\n\t\treturn this.___textureSync;\n\t}\n\n\tsetTexture(texture: Texture) {\n\t\tthis.___textureSync = texture;\n\t\ttexture.name = this.path();\n\n\t\t// the behavior below was an attempt at copying all properties\n\t\t// of a new texture to the current texture,\n\t\t// in the hope that it would make it easy for materials using it to update.\n\t\t// But that only partially worked, and created more confusion\n\t\t// as the materials updated only once or twice.\n\t\t// So now it is the material's responsibility to update the texture\n\t\t// when this file is dirty.\n\t\t// const currentTexture = this.containerController.container().texture();\n\t\t// if (currentTexture) {\n\t\t// \t// this method to change the texture of a cop/image\n\t\t// \t// and have the material update could potentially work.\n\t\t// \t// But at the moment, when loading a 2nd texture,\n\t\t// \t// This overrides the properties of the 1st texture.\n\t\t// \t// So that when we try and reload that 1st texture, it has become the 2nd.\n\t\t// \t// And even with more texture, the behavior still seems to keep the 2nd texture\n\t\t// \tif (currentTexture.uuid != texture.uuid) {\n\t\t// \t\tconst newPropNames = Object.keys(texture) as Array<keyof Texture>;\n\t\t// \t\tfor (let newPropName of newPropNames) {\n\t\t// \t\t\t(currentTexture as any)[newPropName] = texture[newPropName];\n\t\t// \t\t}\n\t\t// \t\t// document.body.append((currentTexture as any).image);\n\t\t// \t\t// document.body.style.overflow = 'auto';\n\t\t// \t\tcurrentTexture.needsUpdate = true;\n\t\t// \t}\n\t\t// \tthis._setContainer(currentTexture);\n\t\t// } else {\n\t\tthis._setContainer(texture);\n\t\t// }\n\t\t// this._copy_texture(texture);\n\t}\n\tprotected _clearTexture() {\n\t\tthis._setContainer(EMPTY_DATA_TEXTURE);\n\t}\n\t// this methods leads to webgl errors quite deep in threejs renderer\n\t// private _copytexture(texture: Texture, target: Texture) {\n\t// \tconst newPropNames = Object.keys(texture) as Array<keyof Texture>;\n\t// \tfor (let newPropName of newPropNames) {\n\t// \t\t(target as any)[newPropName] = texture[newPropName];\n\t// \t\tconsole.log('prop', newPropName);\n\t// \t}\n\t// \ttarget.needsUpdate = true;\n\t// }\n}\n\nexport type BaseCopNodeType = TypedCopNode<any>;\nexport class BaseCopNodeClass extends TypedCopNode<any> {}\n","import {ParamConfig} from '../../utils/params/ParamsConfig';\nimport {Constructor} from '../../../../types/GlobalTypes';\n\nexport function FileTypeCheckCopParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param check url extension */\n\t\tcheckFileType = ParamConfig.BOOLEAN(true);\n\t};\n}\n","import {TypedCopNode} from '../_Base';\nimport {NodeParamsConfig} from '../../utils/params/ParamsConfig';\nclass BaseCopRendererCopParamsConfig extends NodeParamsConfig {\n\t// useCameraRenderer = ParamConfig.BOOLEAN(0);\n}\nconst ParamsConfig = new BaseCopRendererCopParamsConfig();\nexport class BaseCopRendererCopNode extends TypedCopNode<BaseCopRendererCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n}\n\nexport class CopRendererController {\n\t// private _renderer: WebGLRenderer | undefined;\n\n\tconstructor(protected node: BaseCopRendererCopNode) {}\n\n\t// async renderer() {\n\t// \t// if a renderer is created when we do not need to check the current renderer limit,\n\t// \t// this means that each texture node which has useCameraRenderer = false\n\t// \t// will create one.\n\t// \t// This will lead to a loss of WebGL Content on scene load\n\t// \t// if (isBooleanTrue(this.node.pv.useCameraRenderer)) {\n\t// \treturn await this.cameraRenderer();\n\t// \t// } else {\n\t// \t// \treturn (this._renderer = this._renderer || this._createRenderer());\n\t// \t// }\n\t// }\n\t// reset() {\n\t// \tthis._renderer?.dispose();\n\t// \tthis._renderer = undefined;\n\t// }\n\n\tasync waitForRenderer() {\n\t\treturn await this.node.scene().renderersRegister.waitForRenderer();\n\t}\n\n\t// saveState() {\n\t// \t// const prev_target = renderer.getRenderTarget();\n\t// \t// renderer.getSize(this._prev_renderer_size);\n\t// \t// console.log('texture', texture);\n\t// \t// const prev_pixel_aspect_ratio = renderer.getPixelRatio();\n\t// \t// const prev_auto_clear: boolean = renderer.autoClear;\n\t// \t// renderer.toneMappingExposure = 1;\n\t// \t// renderer.outputEncoding = sRGBEncoding; // should be linear\n\n\t// \tthis._makeLinear();\n\t// }\n\n\t// private _makeLinear() {\n\t// \t// renderer.outputEncoding = LinearEncoding\n\t// }\n\n\t// restoreState() {\n\t// \t// renderer.setRenderTarget(prev_target);\n\t// \t// renderer.setSize(this._prev_renderer_size.x, this._prev_renderer_size.y);\n\t// \t// renderer.setPixelRatio(prev_pixel_aspect_ratio);\n\t// \t// renderer.autoClear = prev_auto_clear;\n\t// }\n}\n","import {\n\tUnsignedByteType,\n\tByteType,\n\tShortType,\n\tUnsignedShortType,\n\tIntType,\n\tUnsignedIntType,\n\tFloatType,\n\tHalfFloatType,\n\tUnsignedShort4444Type,\n\tUnsignedShort5551Type,\n\tUnsignedInt248Type,\n} from 'three';\n\nexport const TEXTURE_TYPES = [\n\t{UnsignedByteType},\n\t{ByteType},\n\t{ShortType},\n\t{UnsignedShortType},\n\t{IntType},\n\t{UnsignedIntType},\n\t{FloatType},\n\t{HalfFloatType},\n\t{UnsignedShort4444Type},\n\t{UnsignedShort5551Type},\n\t{UnsignedInt248Type},\n];\n","import {\n\tAlphaFormat,\n\tRedFormat,\n\tRedIntegerFormat,\n\tRGFormat,\n\tRGIntegerFormat,\n\t// RGBFormat,\n\tRGBAFormat,\n\tRGBAIntegerFormat,\n\tLuminanceFormat,\n\tLuminanceAlphaFormat,\n\t// RGBEFormat, //  removing as it is set to same value as RGBAFormat, so can be confusing\n\tDepthFormat,\n\tDepthStencilFormat,\n} from 'three';\n\nexport const TEXTURE_FORMATS = [\n\t{AlphaFormat},\n\t{RedFormat},\n\t{RedIntegerFormat},\n\t{RGFormat},\n\t{RGIntegerFormat},\n\t// {RGBFormat},\n\t{RGBAFormat},\n\t{RGBAIntegerFormat},\n\t{LuminanceFormat},\n\t{LuminanceAlphaFormat},\n\t// {RGBEFormat},\n\t{DepthFormat},\n\t{DepthStencilFormat},\n];\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {TypedCopNode} from '../_Base';\nimport {ColorSpace, Texture} from 'three';\nimport {\n\tRGBAFormat,\n\tUnsignedByteType,\n\tNoColorSpace,\n\tUVMapping,\n\tRepeatWrapping,\n\tLinearFilter,\n\tAnyPixelFormat,\n\tTextureDataType,\n\tAnyMapping,\n\tWrapping,\n\tMinificationTextureFilter,\n\tMagnificationTextureFilter,\n} from 'three';\nimport {\n\tMAG_FILTERS,\n\tMAG_FILTER_DEFAULT_VALUE,\n\tMAG_FILTER_MENU_ENTRIES,\n\tMIN_FILTERS,\n\tMIN_FILTER_DEFAULT_VALUE,\n\tMIN_FILTER_MENU_ENTRIES,\n} from '../../../../core/cop/Filter';\n\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {CopRendererController} from './RendererController';\nimport {BaseNodeType} from '../../_Base';\nimport {isBooleanTrue} from '../../../../core/BooleanValue';\nimport {ParamsValueAccessorType} from '../../utils/params/ParamsValueAccessor';\nimport {COLOR_SPACES, COLOR_SPACE_NAME_BY_COLOR_SPACE} from '../../../../core/cop/ColorSpace';\nimport {WRAPPINGS} from '../../../../core/cop/Wrapping';\nimport {MAPPINGS} from '../../../../core/cop/Mapping';\nimport {TEXTURE_TYPES} from '../../../../core/cop/Type';\nimport {TEXTURE_FORMATS} from '../../../../core/cop/Format';\n\ntype AvailableCallbackMethod = Extract<\n\tkeyof typeof TextureParamsController,\n\t| 'PARAM_CALLBACK_update_encoding'\n\t| 'PARAM_CALLBACK_update_mapping'\n\t| 'PARAM_CALLBACK_update_wrap'\n\t| 'PARAM_CALLBACK_update_filter'\n\t| 'PARAM_CALLBACK_update_anisotropy'\n\t| 'PARAM_CALLBACK_update_flipY'\n\t| 'PARAM_CALLBACK_update_transform'\n\t| 'PARAM_CALLBACK_update_repeat'\n\t| 'PARAM_CALLBACK_update_offset'\n\t| 'PARAM_CALLBACK_update_center'\n\t| 'PARAM_CALLBACK_update_rotation'\n\t| 'PARAM_CALLBACK_update_advanced'\n>;\n\nfunction callbackParams(method: AvailableCallbackMethod) {\n\treturn {\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tTextureParamsController[method](node as TextureCopNode);\n\t\t},\n\t};\n}\n\nconst DEFAULT = {\n\tCOLOR_SPACE: NoColorSpace,\n\tFORMAT: RGBAFormat,\n\tMAPPING: UVMapping,\n\tMIN_FILTER: LinearFilter,\n\tMAG_FILTER: LinearFilter,\n\tTYPE: UnsignedByteType,\n\tWRAPPING: RepeatWrapping,\n};\n\nconst CALLBACK_PARAMS_ENCODING = callbackParams('PARAM_CALLBACK_update_encoding');\nconst CALLBACK_PARAMS_MAPPING = callbackParams('PARAM_CALLBACK_update_mapping');\nconst CALLBACK_PARAMS_WRAP = callbackParams('PARAM_CALLBACK_update_wrap');\nconst CALLBACK_PARAMS_FILTER = callbackParams('PARAM_CALLBACK_update_filter');\nconst CALLBACK_PARAMS_ANISOTROPY = callbackParams('PARAM_CALLBACK_update_anisotropy');\nconst CALLBACK_PARAMS_FLIPY = callbackParams('PARAM_CALLBACK_update_flipY');\nconst CALLBACK_PARAMS_TRANSFORM_TRANSFORM = callbackParams('PARAM_CALLBACK_update_transform');\nconst CALLBACK_PARAMS_TRANSFORM_REPEAT = callbackParams('PARAM_CALLBACK_update_repeat');\nconst CALLBACK_PARAMS_TRANSFORM_OFFSET = callbackParams('PARAM_CALLBACK_update_offset');\nconst CALLBACK_PARAMS_TRANSFORM_ROTATION = callbackParams('PARAM_CALLBACK_update_rotation');\nconst CALLBACK_PARAMS_TRANSFORM_CENTER = callbackParams('PARAM_CALLBACK_update_center');\nconst CALLBACK_PARAMS_ADVANCED = callbackParams('PARAM_CALLBACK_update_advanced');\n\ninterface TextureParamConfigDefaults {\n\ttcolorSpace: boolean | number;\n\tcolorSpace: string;\n}\nexport function TextureParamConfig<TBase extends Constructor>(Base: TBase, defaults?: TextureParamConfigDefaults) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle on to allow updating the texture encoding */\n\t\ttcolorSpace = ParamConfig.BOOLEAN(defaults?.tcolorSpace || 0, {\n\t\t\t...CALLBACK_PARAMS_ENCODING,\n\t\t});\n\t\t/** @param sets the texture encoding */\n\t\tcolorSpace = ParamConfig.STRING(defaults?.colorSpace || DEFAULT.COLOR_SPACE, {\n\t\t\tvisibleIf: {tcolorSpace: 1},\n\t\t\tmenuString: {\n\t\t\t\tentries: COLOR_SPACES.map((colorSpace) => ({\n\t\t\t\t\tname: COLOR_SPACE_NAME_BY_COLOR_SPACE[colorSpace],\n\t\t\t\t\tvalue: colorSpace,\n\t\t\t\t})),\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_ENCODING,\n\t\t});\n\n\t\t/** @param toggle on to allow updating the texture mapping */\n\t\ttmapping = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_MAPPING,\n\t\t});\n\t\t/** @param sets the texture mapping */\n\t\tmapping = ParamConfig.INTEGER(DEFAULT.MAPPING, {\n\t\t\tvisibleIf: {tmapping: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: MAPPINGS.map((m) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: Object.keys(m)[0],\n\t\t\t\t\t\tvalue: Object.values(m)[0] as number,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_MAPPING,\n\t\t});\n\t\t/** @param toggle on to allow updating the texture wrap */\n\t\ttwrap = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_WRAP,\n\t\t});\n\t\t/** @param sets the texture wrapS */\n\t\twrapS = ParamConfig.INTEGER(DEFAULT.WRAPPING, {\n\t\t\tvisibleIf: {twrap: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: WRAPPINGS.map((m) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: Object.keys(m)[0],\n\t\t\t\t\t\tvalue: Object.values(m)[0] as number,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_WRAP,\n\t\t});\n\t\t/** @param sets the texture wrapT */\n\t\twrapT = ParamConfig.INTEGER(DEFAULT.WRAPPING, {\n\t\t\tvisibleIf: {twrap: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: WRAPPINGS.map((m) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: Object.keys(m)[0],\n\t\t\t\t\t\tvalue: Object.values(m)[0] as number,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t},\n\t\t\tseparatorAfter: true,\n\t\t\t...CALLBACK_PARAMS_WRAP,\n\t\t});\n\t\t/** @param toggle on to allow updating the texture min filter */\n\t\ttminFilter = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_FILTER,\n\t\t});\n\t\t/** @param sets the texture min filter */\n\t\tminFilter = ParamConfig.INTEGER(MIN_FILTER_DEFAULT_VALUE, {\n\t\t\tvisibleIf: {tminFilter: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: MIN_FILTER_MENU_ENTRIES,\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_FILTER,\n\t\t});\n\t\t/** @param toggle on to allow updating the texture mag filter */\n\t\ttmagFilter = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_FILTER,\n\t\t});\n\t\t/** @param sets the texture mag filter */\n\t\tmagFilter = ParamConfig.INTEGER(MAG_FILTER_DEFAULT_VALUE, {\n\t\t\tvisibleIf: {tmagFilter: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: MAG_FILTER_MENU_ENTRIES,\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_FILTER,\n\t\t});\n\t\t/** @param toggle on to allow updating the texture anisotropy */\n\t\ttanisotropy = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_ANISOTROPY,\n\t\t});\n\t\t/** @param sets the anisotropy from the max value allowed by the renderer */\n\t\tuseRendererMaxAnisotropy = ParamConfig.BOOLEAN(0, {\n\t\t\tvisibleIf: {tanisotropy: 1},\n\t\t\t...CALLBACK_PARAMS_ANISOTROPY,\n\t\t});\n\t\t/** @param sets the anisotropy manually */\n\t\tanisotropy = ParamConfig.INTEGER(2, {\n\t\t\tvisibleIf: {tanisotropy: 1, useRendererMaxAnisotropy: 0},\n\t\t\trange: [0, 32],\n\t\t\trangeLocked: [true, false],\n\t\t\t...CALLBACK_PARAMS_ANISOTROPY,\n\t\t});\n\n\t\t/** @param Toggle on to update the flipY */\n\t\ttflipY = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_FLIPY,\n\t\t});\n\t\t/** @param sets the flipY */\n\t\tflipY = ParamConfig.BOOLEAN(0, {\n\t\t\tvisibleIf: {tflipY: 1},\n\t\t\t...CALLBACK_PARAMS_FLIPY,\n\t\t});\n\n\t\t/** @param toggle on to update the texture transform */\n\t\tttransform = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_TRANSFORM_TRANSFORM,\n\t\t});\n\t\t/** @param updates the texture offset */\n\t\toffset = ParamConfig.VECTOR2([0, 0], {\n\t\t\tvisibleIf: {ttransform: 1},\n\t\t\t...CALLBACK_PARAMS_TRANSFORM_OFFSET,\n\t\t});\n\t\t/** @param updates the texture repeat */\n\t\trepeat = ParamConfig.VECTOR2([1, 1], {\n\t\t\tvisibleIf: {ttransform: 1},\n\t\t\t...CALLBACK_PARAMS_TRANSFORM_REPEAT,\n\t\t});\n\t\t/** @param updates the texture rotation */\n\t\trotation = ParamConfig.FLOAT(0, {\n\t\t\trange: [-1, 1],\n\t\t\tvisibleIf: {ttransform: 1},\n\t\t\t...CALLBACK_PARAMS_TRANSFORM_ROTATION,\n\t\t});\n\t\t/** @param updates the texture center */\n\t\tcenter = ParamConfig.VECTOR2([0, 0], {\n\t\t\tvisibleIf: {ttransform: 1},\n\t\t\t...CALLBACK_PARAMS_TRANSFORM_CENTER,\n\t\t});\n\n\t\t/** @param toggle on to display advanced parameters */\n\t\ttadvanced = ParamConfig.BOOLEAN(0, {\n\t\t\t...CALLBACK_PARAMS_ADVANCED,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param toggle on to allow overriding the texture format */\n\t\ttformat = ParamConfig.BOOLEAN(0, {\n\t\t\tvisibleIf: {tadvanced: 1},\n\t\t\t...CALLBACK_PARAMS_ADVANCED,\n\t\t});\n\t\t/** @param sets the texture format */\n\t\tformat = ParamConfig.INTEGER(DEFAULT.FORMAT, {\n\t\t\tvisibleIf: {tadvanced: 1, tformat: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: TEXTURE_FORMATS.map((m) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: Object.keys(m)[0],\n\t\t\t\t\t\tvalue: Object.values(m)[0] as number,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_ADVANCED,\n\t\t});\n\n\t\t/** @param toggle on to allow overriding the texture type */\n\t\tttype = ParamConfig.BOOLEAN(0, {\n\t\t\tvisibleIf: {tadvanced: 1},\n\t\t\t...CALLBACK_PARAMS_ADVANCED,\n\t\t});\n\t\t/** @param sets the texture ty[e] */\n\t\ttype = ParamConfig.INTEGER(DEFAULT.TYPE, {\n\t\t\tvisibleIf: {tadvanced: 1, ttype: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: TEXTURE_TYPES.map((m) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: Object.keys(m)[0],\n\t\t\t\t\t\tvalue: Object.values(m)[0] as number,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t},\n\t\t\t...CALLBACK_PARAMS_ADVANCED,\n\t\t});\n\t};\n}\n\n// export function TextureParamConfigFactory<TBase extends Constructor>(defaults: TextureParamConfigDefaults) {\n// \treturn (Base: TBase) => {\n// \t\treturn TextureParamConfig(Base, defaults);\n// \t};\n// }\n\nclass CopTextureParamsConfig extends TextureParamConfig(NodeParamsConfig) {}\nconst ParamsConfig = new CopTextureParamsConfig();\nclass TextureCopNode extends TypedCopNode<CopTextureParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tpublic readonly textureParamsController = new TextureParamsController(this);\n}\n\nexport class TextureParamsController {\n\tconstructor(protected node: TextureCopNode) {}\n\tasync update(texture: Texture) {\n\t\tconst pv = this.node.pv;\n\t\tthis._updateColorSpace(texture, pv);\n\t\tthis._updateAdvanced(texture, pv);\n\t\tthis._updateMapping(texture, pv);\n\t\tthis._updateWrap(texture, pv);\n\t\tthis._updateFilter(texture, pv);\n\t\tthis._updateFlip(texture, pv);\n\t\tawait this._updateAnisotropy(texture, pv);\n\t\tthis._updateTransform(texture);\n\t}\n\tprivate _updateColorSpace(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\tif (isBooleanTrue(pv.tcolorSpace)) {\n\t\t\ttexture.colorSpace = pv.colorSpace as ColorSpace;\n\t\t} else {\n\t\t\ttexture.colorSpace = DEFAULT.COLOR_SPACE;\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate _updateAdvanced(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\tif (isBooleanTrue(pv.tadvanced)) {\n\t\t\tif (isBooleanTrue(pv.tformat)) {\n\t\t\t\ttexture.format = pv.format as AnyPixelFormat;\n\t\t\t} else {\n\t\t\t\ttexture.format = DEFAULT.FORMAT;\n\t\t\t}\n\t\t\tif (isBooleanTrue(pv.ttype)) {\n\t\t\t\ttexture.type = pv.type as TextureDataType;\n\t\t\t} else {\n\t\t\t\ttexture.type = DEFAULT.TYPE;\n\t\t\t}\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate _updateMapping(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\tif (isBooleanTrue(pv.tmapping)) {\n\t\t\ttexture.mapping = pv.mapping as AnyMapping;\n\t\t} else {\n\t\t\ttexture.mapping = DEFAULT.MAPPING;\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate _updateWrap(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\tif (isBooleanTrue(pv.twrap)) {\n\t\t\ttexture.wrapS = pv.wrapS as Wrapping;\n\t\t\ttexture.wrapT = pv.wrapT as Wrapping;\n\t\t} else {\n\t\t\ttexture.wrapS = DEFAULT.WRAPPING;\n\t\t\ttexture.wrapT = DEFAULT.WRAPPING;\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate _updateFilter(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\tif (isBooleanTrue(pv.tminFilter)) {\n\t\t\ttexture.minFilter = pv.minFilter as MinificationTextureFilter;\n\t\t} else {\n\t\t\t// It makes more sense to:\n\t\t\t// - use LinearFilter by default when tfilter is off\n\t\t\t// - show LinearMipMapLinearFilter + LinearFilter when on to show the right combination.\n\t\t\t// rather than:\n\t\t\t// - use LinearMipMapLinearFilter + LinearFilter\n\t\t\t// as this would not work when importing a texture to be fed to a cop/envMap\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t}\n\t\tif (isBooleanTrue(pv.tmagFilter)) {\n\t\t\ttexture.magFilter = pv.magFilter as MagnificationTextureFilter;\n\t\t} else {\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate _updateFlip(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\t// do not have this in an if block,\n\t\t// as to be sure this is set to false in case it is set to true\n\t\t// by the texture loader\n\t\ttexture.flipY = pv.tflipY && pv.flipY;\n\t\ttexture.needsUpdate = true;\n\t}\n\n\tprivate _rendererController: CopRendererController | undefined;\n\tprivate async _updateAnisotropy(texture: Texture, pv: ParamsValueAccessorType<CopTextureParamsConfig>) {\n\t\tif (!isBooleanTrue(pv.tanisotropy)) {\n\t\t\ttexture.anisotropy = 1;\n\t\t\treturn;\n\t\t}\n\n\t\tif (isBooleanTrue(pv.useRendererMaxAnisotropy)) {\n\t\t\ttexture.anisotropy = await this._maxRendererAnisotropy();\n\t\t} else {\n\t\t\tconst anisotropy = pv.anisotropy;\n\t\t\t// if the requested anisotropy is 2 or less,\n\t\t\t// we can assume that the current renderer can provide it,\n\t\t\t// without having to wait for it to be created\n\t\t\tif (anisotropy <= 2) {\n\t\t\t\ttexture.anisotropy = anisotropy;\n\t\t\t} else {\n\t\t\t\ttexture.anisotropy = Math.min(anisotropy, await this._maxRendererAnisotropy());\n\t\t\t}\n\t\t}\n\t\ttexture.needsUpdate = true;\n\t}\n\tprivate async _maxRendererAnisotropy(): Promise<number> {\n\t\tthis._rendererController = this._rendererController || new CopRendererController(this.node);\n\t\tconst renderer = await this._rendererController.waitForRenderer();\n\t\tif (!renderer) {\n\t\t\treturn 1;\n\t\t}\n\t\tconst maxAnisotropy = renderer.capabilities.getMaxAnisotropy();\n\t\treturn maxAnisotropy;\n\t}\n\n\tprivate _updateTransform(texture: Texture) {\n\t\tif (!isBooleanTrue(this.node.pv.ttransform)) {\n\t\t\ttexture.offset.set(0, 0);\n\t\t\ttexture.rotation = 0;\n\t\t\ttexture.repeat.set(1, 1);\n\t\t\ttexture.center.set(0, 0);\n\t\t\treturn;\n\t\t}\n\t\tthis._updateTransformOffset(texture, false);\n\t\tthis._updateTransformRepeat(texture, false);\n\t\tthis._updateTransformRotation(texture, false);\n\t\tthis._updateTransformCenter(texture, false);\n\t\ttexture.updateMatrix();\n\t}\n\tprivate async _updateTransformOffset(texture: Texture, updateMatrix: boolean) {\n\t\ttexture.offset.copy(this.node.pv.offset);\n\t\tif (updateMatrix) {\n\t\t\ttexture.updateMatrix();\n\t\t}\n\t}\n\tprivate async _updateTransformRepeat(texture: Texture, updateMatrix: boolean) {\n\t\ttexture.repeat.copy(this.node.pv.repeat);\n\t\tif (updateMatrix) {\n\t\t\ttexture.updateMatrix();\n\t\t}\n\t}\n\tprivate async _updateTransformRotation(texture: Texture, updateMatrix: boolean) {\n\t\ttexture.rotation = this.node.pv.rotation;\n\t\tif (updateMatrix) {\n\t\t\ttexture.updateMatrix();\n\t\t}\n\t}\n\tprivate async _updateTransformCenter(texture: Texture, updateMatrix: boolean) {\n\t\ttexture.center.copy(this.node.pv.center);\n\t\tif (updateMatrix) {\n\t\t\ttexture.updateMatrix();\n\t\t}\n\t}\n\t//\n\t//\n\t// CALLBACK\n\t//\n\t//\n\tstatic PARAM_CALLBACK_update_encoding(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateColorSpace(texture, node.pv);\n\t}\n\tstatic PARAM_CALLBACK_update_mapping(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateMapping(texture, node.pv);\n\t}\n\tstatic PARAM_CALLBACK_update_wrap(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateWrap(texture, node.pv);\n\t}\n\tstatic PARAM_CALLBACK_update_filter(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateFilter(texture, node.pv);\n\t}\n\tstatic PARAM_CALLBACK_update_anisotropy(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateAnisotropy(texture, node.pv);\n\t}\n\tstatic PARAM_CALLBACK_update_flipY(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateFlip(texture, node.pv);\n\t}\n\tstatic PARAM_CALLBACK_update_transform(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateTransform(texture);\n\t}\n\tstatic PARAM_CALLBACK_update_offset(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateTransformOffset(texture, true);\n\t}\n\tstatic PARAM_CALLBACK_update_repeat(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateTransformRepeat(texture, true);\n\t}\n\tstatic PARAM_CALLBACK_update_rotation(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateTransformRotation(texture, true);\n\t}\n\tstatic PARAM_CALLBACK_update_center(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateTransformCenter(texture, true);\n\t}\n\tstatic PARAM_CALLBACK_update_advanced(node: TextureCopNode) {\n\t\tconst texture = node.containerController.container().texture();\n\t\tif (!texture) {\n\t\t\treturn;\n\t\t}\n\t\tnode.textureParamsController._updateAdvanced(texture, node.pv);\n\t}\n\t//\n\t//\n\t// UTILS\n\t//\n\t//\n\tstatic copyTextureAttributes(texture: Texture, inputTexture: Texture) {\n\t\ttexture.colorSpace = inputTexture.colorSpace;\n\t\ttexture.mapping = inputTexture.mapping;\n\t\ttexture.wrapS = inputTexture.wrapS;\n\t\ttexture.wrapT = inputTexture.wrapT;\n\t\ttexture.minFilter = inputTexture.minFilter;\n\t\ttexture.magFilter = inputTexture.magFilter;\n\t\ttexture.magFilter = inputTexture.magFilter;\n\t\ttexture.anisotropy = inputTexture.anisotropy;\n\t\ttexture.flipY = inputTexture.flipY;\n\t\ttexture.repeat.copy(inputTexture.repeat);\n\t\ttexture.offset.copy(inputTexture.offset);\n\t\ttexture.center.copy(inputTexture.center);\n\t\ttexture.rotation = inputTexture.rotation;\n\t\ttexture.type = inputTexture.type;\n\t\ttexture.format = inputTexture.format;\n\t\ttexture.needsUpdate = true;\n\t}\n\tparamLabelsParams() {\n\t\tconst p = this.node.p;\n\t\treturn [\n\t\t\t// colorSpace\n\t\t\tp.tcolorSpace,\n\t\t\tp.colorSpace,\n\t\t\t// mapping\n\t\t\tp.tmapping,\n\t\t\tp.mapping,\n\t\t\t// wrap\n\t\t\tp.twrap,\n\t\t\tp.wrapS,\n\t\t\tp.wrapT,\n\t\t\t// filter\n\t\t\tp.tminFilter,\n\t\t\tp.minFilter,\n\t\t\tp.tmagFilter,\n\t\t\tp.magFilter,\n\t\t\t// flipY\n\t\t\tp.tflipY,\n\t\t\tp.flipY,\n\t\t];\n\t}\n\tparamLabels() {\n\t\tconst labels: string[] = [];\n\t\tconst pv = this.node.pv;\n\t\tif (isBooleanTrue(pv.tcolorSpace)) {\n\t\t\tfor (const colorSpace of COLOR_SPACES) {\n\t\t\t\tif (colorSpace == pv.colorSpace) {\n\t\t\t\t\tlabels.push(`colorSpace: ${colorSpace}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isBooleanTrue(pv.tmapping)) {\n\t\t\tfor (const mapping of MAPPINGS) {\n\t\t\t\tconst mappingName = Object.keys(mapping)[0];\n\t\t\t\tconst mappingValue = (mapping as any)[mappingName];\n\t\t\t\tif (mappingValue == pv.mapping) {\n\t\t\t\t\tlabels.push(`mapping: ${mappingName}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isBooleanTrue(pv.twrap)) {\n\t\t\tfunction setWrapping(wrappingAxis: 'wrapS' | 'wrapT') {\n\t\t\t\tfor (const wrapping of WRAPPINGS) {\n\t\t\t\t\tconst wrappingName = Object.keys(wrapping)[0];\n\t\t\t\t\tconst wrappingValue = (wrapping as any)[wrappingName];\n\t\t\t\t\tif (wrappingValue == pv[wrappingAxis]) {\n\t\t\t\t\t\tlabels.push(`${wrappingAxis}: ${wrappingName}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetWrapping('wrapS');\n\t\t\tsetWrapping('wrapT');\n\t\t}\n\t\tif (isBooleanTrue(pv.tminFilter)) {\n\t\t\tfor (const minFilter of MIN_FILTERS) {\n\t\t\t\tconst minFilterName = Object.keys(minFilter)[0];\n\t\t\t\tconst minFilterValue = (minFilter as any)[minFilterName];\n\t\t\t\tif (minFilterValue == pv.minFilter) {\n\t\t\t\t\tlabels.push(`minFilter: ${minFilterName}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isBooleanTrue(pv.tmagFilter)) {\n\t\t\tfor (const magFilter of MAG_FILTERS) {\n\t\t\t\tconst magFilterName = Object.keys(magFilter)[0];\n\t\t\t\tconst magFilterValue = (magFilter as any)[magFilterName];\n\t\t\t\tif (magFilterValue == pv.magFilter) {\n\t\t\t\t\tlabels.push(`magFilter: ${magFilterName}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isBooleanTrue(pv.tflipY)) {\n\t\t\tlabels.push(`flipY: ${pv.flipY}`);\n\t\t}\n\n\t\treturn labels;\n\t}\n}\n","import {ParamEvent} from './../../../../poly/ParamEvent';\nimport {Constructor} from '../../../../../types/GlobalTypes';\nimport {Texture, TextureDataType} from 'three';\nimport {TypedCopNode} from './../../_Base';\nimport {BaseNodeType} from '../../../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {TextureParamsController, TextureParamConfig} from './../../utils/TextureParamsController';\nimport {isUrlStaticImage} from '../../../../../core/FileTypeController';\nimport {InputCloneMode} from '../../../../poly/InputCloneMode';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\nimport {FileTypeCheckCopParamConfig} from './../../utils/CheckFileType';\nimport {Poly} from '../../../../Poly';\nimport {BaseCoreImageLoader} from '../../../../../core/loader/texture/_BaseImageLoader';\n\ninterface CopImageNodeFactoryOptions {\n\ttype: string;\n\tdefaultUrl: string;\n\textensions: string[];\n\tgetLoader: (url: string, node: BaseNodeType) => BaseCoreImageLoader;\n}\n\nfunction imageCopParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param url to fetch the image from */\n\t\turl = ParamConfig.STRING('');\n\t\t/** @param reload the image */\n\t\treload = ParamConfig.BUTTON(null);\n\t};\n}\n\nclass BaseImageCopParamsConfig extends FileTypeCheckCopParamConfig(\n\tTextureParamConfig(imageCopParamConfig(NodeParamsConfig))\n) {}\n\nconst ParamsConfig = new BaseImageCopParamsConfig();\n\nexport class copImageNodeFactoryFactoryResult extends TypedCopNode<BaseImageCopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tpublic readonly textureParamsController: TextureParamsController = new TextureParamsController(this);\n}\n\nexport function copImageNodeFactoryFactory(\n\toptions: CopImageNodeFactoryOptions\n): typeof copImageNodeFactoryFactoryResult {\n\tfunction imageCopParamConfig<TBase extends Constructor>(Base: TBase) {\n\t\treturn class Mixin extends Base {\n\t\t\t/** @param url to fetch the image from */\n\t\t\turl = ParamConfig.STRING(options.defaultUrl, {\n\t\t\t\tfileBrowse: {extensions: options.extensions},\n\t\t\t});\n\t\t\t/** @param reload the image */\n\t\t\treload = ParamConfig.BUTTON(null, {\n\t\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\t\tBaseImageCopNode.PARAM_CALLBACK_reload(node as BaseImageCopNode);\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t}\n\n\tclass BaseImageCopParamsConfig extends FileTypeCheckCopParamConfig(\n\t\tTextureParamConfig(imageCopParamConfig(NodeParamsConfig))\n\t) {}\n\n\tconst ParamsConfig = new BaseImageCopParamsConfig();\n\n\tclass BaseImageCopNode extends TypedCopNode<BaseImageCopParamsConfig> {\n\t\toverride paramsConfig = ParamsConfig;\n\t\tstatic override type() {\n\t\t\treturn options.type;\n\t\t}\n\n\t\tpublic readonly textureParamsController: TextureParamsController = new TextureParamsController(this);\n\n\t\toverride dispose(): void {\n\t\t\tsuper.dispose();\n\t\t\tPoly.blobs.clearBlobsForNode(this);\n\t\t}\n\n\t\toverride initializeNode() {\n\t\t\tthis.io.inputs.setCount(0, 1);\n\t\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t\t}\n\t\toverride async cook(inputContents: Texture[]) {\n\t\t\tif (isBooleanTrue(this.pv.checkFileType) && !isUrlStaticImage(this.pv.url)) {\n\t\t\t\tthis.states.error.set('url is not an image');\n\t\t\t} else {\n\t\t\t\tconst texture = await this._loadTexture();\n\n\t\t\t\tif (texture) {\n\t\t\t\t\tconst inputTexture = inputContents[0];\n\t\t\t\t\tif (inputTexture) {\n\t\t\t\t\t\tTextureParamsController.copyTextureAttributes(texture, inputTexture);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.textureParamsController.update(texture);\n\t\t\t\t\tthis.setTexture(texture);\n\t\t\t\t} else {\n\t\t\t\t\tthis._clearTexture();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\t//\n\t\t// UTILS\n\t\t//\n\t\t//\n\t\tstatic PARAM_CALLBACK_reload(node: BaseImageCopNode) {\n\t\t\tnode.paramCallbackReload();\n\t\t}\n\t\tprivate paramCallbackReload() {\n\t\t\t// this.clearLoadedBlob();\n\t\t\t// set the param dirty is preferable to just the successors, in case the expression result needs to be updated\n\t\t\t// this.p.url.set_successors_dirty();\n\t\t\tthis.p.url.setDirty();\n\t\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t\t}\n\t\tprotected _loader() {\n\t\t\treturn options.getLoader(this.pv.url, this);\n\t\t}\n\n\t\tprivate async _loadTexture() {\n\t\t\tlet texture: Texture | null = null;\n\n\t\t\ttry {\n\t\t\t\tconst loader = this._loader();\n\t\t\t\ttexture = await loader.loadImage({\n\t\t\t\t\ttdataType: this.pv.ttype && this.pv.tadvanced,\n\t\t\t\t\tdataType: this.pv.type as TextureDataType,\n\t\t\t\t});\n\t\t\t\tif (texture) {\n\t\t\t\t\ttexture.matrixAutoUpdate = false;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t\tif (!texture) {\n\t\t\t\t// we don't override the error,\n\t\t\t\t// in case it comes from the loader itself,\n\t\t\t\t// which would have hints to install the library.\n\t\t\t\tif (!this.states.error.active()) {\n\t\t\t\t\tthis.states.error.set(`could not load texture '${this.pv.url}'`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn texture;\n\t\t}\n\t\t// clearLoadedBlob() {\n\t\t// \tconst loader = this._loader();\n\t\t// \tloader.deregisterUrl();\n\t\t// }\n\t}\n\n\treturn BaseImageCopNode;\n}\n","import {MeshPhongMaterial, WebGLRenderTarget, Texture} from 'three';\n// export const UV_LIGHT_MAP_FLIPPED_ATTRIB_NAME = 'uvLightmapFlipped';\nexport const DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME = 'uvLightMap';\n\nexport interface LightMapMaterial extends MeshPhongMaterial {\n\tuniforms: {\n\t\tpreviousLightMap: {value: Texture | null};\n\t\tlightMapMult: {value: number};\n\t\t// flipped: {value: boolean};\n\t};\n}\nexport interface LightMapMatOptions {\n\tlightMap: WebGLRenderTarget;\n\t// uv: string;\n\t// lightMapMult: number;\n}\nexport function setLightMapMaterial(mat: LightMapMaterial, options: LightMapMatOptions) {\n\tmat.uniforms.previousLightMap.value = options.lightMap.texture;\n\t// mat.customProgramCacheKey = ()=> options.uv\n\t// mat.uniforms.lightMapMult.value = options.lightMapMult;\n}\n\nexport function createLightMapMaterial() {\n\tconst mat = new MeshPhongMaterial() as LightMapMaterial;\n\tmat.uniforms = {\n\t\tpreviousLightMap: {value: null},\n\t\t// iterationBlend: {value: DEFAULT_ITERATION_BLEND},\n\t\tlightMapMult: {value: 1},\n\t\t// flipped: {value: false},\n\t};\n\t// mat.transparent = true;\n\t// mat.blending = AdditiveBlending;\n\t// mat.alphaTest = 0.5;\n\tmat.name = 'lightMapMaterial';\n\tmat.onBeforeCompile = (shader) => {\n\t\t// Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n\t\tshader.vertexShader = `#define USE_LIGHTMAP\n#define LIGHTMAP_UV ${DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME}\nattribute vec2 LIGHTMAP_UV;\nvarying vec2 vUvLightMap;\n// varying float vUvLightMapFlipped;\n${shader.vertexShader.slice(0, -2)}\n\tvUvLightMap = LIGHTMAP_UV;\n\tgl_Position = vec4((LIGHTMAP_UV - 0.5) * 2.0, 1.0, 1.0);\n}`;\n\n\t\t// Fragment Shader: Set Pixels to average in the Previous frame's Shadows\n\t\tconst bodyStart = shader.fragmentShader.indexOf('void main() {');\n\t\tshader.fragmentShader = `#define USE_LIGHTMAP\nvarying vec2 vUvLightMap;\n// varying float vUvLightMapFlipped;\n${shader.fragmentShader.slice(0, bodyStart)}\nuniform sampler2D previousLightMap;\n// uniform float iterationBlend;\nuniform float lightMapMult;\n// uniform bool flipped;\n${shader.fragmentShader.slice(bodyStart - 1, -2)}\n\tvec3 texelOld = texture2D(previousLightMap, vUvLightMap).rgb;\n\t// gl_FragColor.rgb = gl_FragColor.rgb + texelOld / totalIterationsCount;\n\t// gl_FragColor.a = flipped ? vUvLightMapFlipped : 1.-vUvLightMapFlipped;\n\tgl_FragColor.rgb = texelOld + gl_FragColor.rgb * lightMapMult;// * gl_FragColor.a;\n\t// gl_FragColor.a = lightMapMult;\n\t// gl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, iterationBlend);\n\t// gl_FragColor.rgb = vec3(vUvLightMap);\n}\n`;\n\n\t\t// Set the Previous Frame's Texture Buffer and Averaging Window\n\t\t// const uniforms = {\n\t\t// \tpreviousShadowMap: {value: renderTarget.texture}, //this.progressiveLightMap1.texture},\n\t\t// \titerationBlend: {value: DEFAULT_ITERATION_BLEND},\n\t\t// };\n\t\tshader.uniforms.previousLightMap = mat.uniforms.previousLightMap; //{value: renderTarget.texture}; //uniforms.previousShadowMap;\n\t\tshader.uniforms.lightMapMult = mat.uniforms.lightMapMult; //{value: 0};\n\t\t// shader.uniforms.flipped = mat.uniforms.flipped;\n\t\t// shader.uniforms.iterationBlend = uniforms.iterationBlend;\n\t\t// mat.uniforms = shader.uniforms as any;\n\t\t// mat.uniforms.previousShadowMap = uniforms.previousShadowMap;\n\t\t// mat.uniforms.iterationBlend = uniforms.iterationBlend;\n\n\t\t// Set the new Shader to this\n\t\tmat.userData.shader = shader;\n\t};\n\treturn mat;\n}\n","/**\n * Creates a THREE OrbitControls\n *\n *\n */\nimport {Number3} from '../../../types/GlobalTypes';\nimport {Camera, Vector3, MOUSE, TOUCH} from 'three';\nimport {TypedCameraControlsEventNode} from './_BaseCameraControls';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {EventConnectionPoint, EventConnectionPointType} from '../utils/io/connections/Event';\nimport {BaseNodeType} from '../_Base';\nimport {CameraControlsNodeType} from '../../poly/NodeContext';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\n\n// Note:\n// currently keep using module from modules/core/controls/...\n// as otherwise there is a conflict when a TransformControls\n// is displayed, where the orbitControl seems to not release on pointerup,\n// which is really jarring\nimport {OrbitControls} from '../../../modules/core/controls/OrbitControls';\n// import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls';\nexport {OrbitControls};\n\nconst OUTPUT_START = 'start';\nconst OUTPUT_CHANGE = 'change';\nconst OUTPUT_END = 'end';\nconst _targetArray: Number3 = [0, 0, 0];\n\nexport enum MouseControl {\n\tROTATE = 'rotate',\n\tPAN = 'pan',\n\tDOLLY = 'dolly',\n}\nexport const MOUSE_CONTROLS: MouseControl[] = [MouseControl.ROTATE, MouseControl.DOLLY, MouseControl.PAN];\nenum TouchControl {\n\tROTATE = 'rotate',\n\tPAN = 'pan',\n\tDOLLY_PAN = 'dolly + pan',\n\tDOLLY_ROTATE = 'dolly + rotate',\n}\nconst TOUCH_CONTROLS: TouchControl[] = [\n\tTouchControl.ROTATE,\n\tTouchControl.PAN,\n\tTouchControl.DOLLY_PAN,\n\tTouchControl.DOLLY_ROTATE,\n];\n\ntype ThreeMouseControl = 0 | 1 | 2;\ntype ThreeTouchControl = 0 | 1 | 2 | 3;\n\nconst THREE_MOUSE_BY_MOUSE_CONTROL: Record<MouseControl, ThreeMouseControl> = {\n\t[MouseControl.ROTATE]: MOUSE.ROTATE,\n\t[MouseControl.DOLLY]: MOUSE.DOLLY,\n\t[MouseControl.PAN]: MOUSE.PAN,\n};\nconst THREE_TOUCH_BY_TOUCH_CONTROL: Record<TouchControl, ThreeTouchControl> = {\n\t[TouchControl.ROTATE]: TOUCH.ROTATE,\n\t[TouchControl.PAN]: TOUCH.PAN,\n\t[TouchControl.DOLLY_PAN]: TOUCH.DOLLY_PAN,\n\t[TouchControl.DOLLY_ROTATE]: TOUCH.DOLLY_ROTATE,\n};\n\n// enum KeysMode {\n// \tPAN = 'pan',\n// \tROTATE = 'rotate',\n// }\n// const KEYS_MODES: KeysMode[] = [KeysMode.PAN, KeysMode.ROTATE];\n\nclass CameraOrbitEventParamsConfig extends NodeParamsConfig {\n\tmain = ParamConfig.FOLDER();\n\t/** @param enable/disable */\n\tenabled = ParamConfig.BOOLEAN(1);\n\t/** @param toggle on to allow pan */\n\tallowPan = ParamConfig.BOOLEAN(1);\n\t/** @param toggle on to allow rotate */\n\tallowRotate = ParamConfig.BOOLEAN(1);\n\t/** @param toggle on to allow zoom */\n\tallowZoom = ParamConfig.BOOLEAN(1);\n\t/** @param zoom speed */\n\tzoomSpeed = ParamConfig.FLOAT(1, {\n\t\trange: [0, 2],\n\t\trangeLocked: [true, false],\n\t\tvisibleIf: {\n\t\t\tallowZoom: 1,\n\t\t},\n\t});\n\t/** @param zoom to cursor */\n\tzoomToCursor = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {\n\t\t\tallowZoom: 1,\n\t\t},\n\t});\n\t/** @param toggle on to have damping */\n\ttdamping = ParamConfig.BOOLEAN(1);\n\t/** @param damping value */\n\tdamping = ParamConfig.FLOAT(0.1, {\n\t\tvisibleIf: {tdamping: true},\n\t});\n\t/** @param toggle on to have the pan in screen space */\n\tscreenSpacePanning = ParamConfig.BOOLEAN(1);\n\t/** @param rotation speed */\n\trotateSpeed = ParamConfig.FLOAT(0.5);\n\tlimits = ParamConfig.FOLDER();\n\t/** @param smallest distance the camera can go to the target (perspective cameras only) */\n\tminDistance = ParamConfig.FLOAT(0.1, {\n\t\trange: [0.1, 100],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param max distance the camera can go away the target (perspective cameras only) */\n\tmaxDistance = ParamConfig.FLOAT(50, {\n\t\trange: [0, 100],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param min zoom (orthographic cameras only) */\n\tminZoom = ParamConfig.FLOAT(0.01, {\n\t\trange: [0.01, 100],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param max zoom (orthographic cameras only) */\n\tmaxZoom = ParamConfig.FLOAT(50, {\n\t\trange: [0, 100],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param toggle on to limit the azimuth (up-down) angle */\n\tlimitAzimuthAngle = ParamConfig.BOOLEAN(0);\n\t/** @param azimuth angle range */\n\tazimuthAngleRange = ParamConfig.VECTOR2(['-2*$PI', '2*$PI'], {\n\t\tvisibleIf: {limitAzimuthAngle: 1},\n\t});\n\t/** @param polar (left-right) angle range */\n\tpolarAngleRange = ParamConfig.VECTOR2([0, '$PI']);\n\t/** @param clamp position */\n\tclampPosition = ParamConfig.BOOLEAN(false);\n\t/** @param min position */\n\tpositionMin = ParamConfig.VECTOR3([-10, -10, -10], {\n\t\tvisibleIf: {clampPosition: 1},\n\t});\n\t/** @param max position */\n\tpositionMax = ParamConfig.VECTOR3([10, 10, 10], {\n\t\tvisibleIf: {clampPosition: 1},\n\t});\n\tcontrols = ParamConfig.FOLDER();\n\t/** @param leftMouseButton */\n\tleftMouseButton = ParamConfig.INTEGER(MOUSE_CONTROLS.indexOf(MouseControl.ROTATE), {\n\t\tmenu: {\n\t\t\tentries: MOUSE_CONTROLS.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t/** @param leftMouseButton */\n\tmiddleMouseButton = ParamConfig.INTEGER(MOUSE_CONTROLS.indexOf(MouseControl.DOLLY), {\n\t\tmenu: {\n\t\t\tentries: MOUSE_CONTROLS.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t/** @param leftMouseButton */\n\trightMouseButton = ParamConfig.INTEGER(MOUSE_CONTROLS.indexOf(MouseControl.PAN), {\n\t\tmenu: {\n\t\t\tentries: MOUSE_CONTROLS.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t/** @param 1 finger touch */\n\toneFingerTouch = ParamConfig.INTEGER(TOUCH_CONTROLS.indexOf(TouchControl.ROTATE), {\n\t\tmenu: {\n\t\t\tentries: TOUCH_CONTROLS.map((name, value) => ({name, value})),\n\t\t},\n\t\tseparatorBefore: true,\n\t});\n\t/** @param 2 fingers touch */\n\ttwoFingersTouch = ParamConfig.INTEGER(TOUCH_CONTROLS.indexOf(TouchControl.DOLLY_PAN), {\n\t\tmenu: {\n\t\t\tentries: TOUCH_CONTROLS.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\tmisc = ParamConfig.FOLDER();\n\tupdateTargetEndMoveEnd = ParamConfig.BOOLEAN(1);\n\t/** @param target position. This is updated automatically as the camera is controlled by user events */\n\ttarget = ParamConfig.VECTOR3([0, 0, 0], {\n\t\tcook: false,\n\t\tcomputeOnDirty: true,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tCameraOrbitControlsEventNode.PARAM_CALLBACK_updateTarget(node as CameraOrbitControlsEventNode);\n\t\t},\n\t});\n\t/** @param toggle on to enable keys */\n\t// enableKeys = ParamConfig.BOOLEAN(0);\n\t// /** @param key modes (pan or rotate) */\n\t// keysMode = ParamConfig.INTEGER(KEYS_MODES.indexOf(KeysMode.PAN), {\n\t// \tvisibleIf: {enableKeys: 1},\n\t// \tmenu: {\n\t// \t\tentries: KEYS_MODES.map((name, value) => {\n\t// \t\t\treturn {name, value};\n\t// \t\t}),\n\t// \t},\n\t// });\n\t// /** @param keys pan speed */\n\t// keysPanSpeed = ParamConfig.FLOAT(7, {\n\t// \trange: [0, 10],\n\t// \trangeLocked: [false, false],\n\t// \tvisibleIf: {enableKeys: 1, keysMode: KEYS_MODES.indexOf(KeysMode.PAN)},\n\t// });\n\t// /** @param keys rotate speed vertical */\n\t// keysRotateSpeedVertical = ParamConfig.FLOAT(1, {\n\t// \trange: [0, 1],\n\t// \trangeLocked: [false, false],\n\t// \tvisibleIf: {enableKeys: 1, keysMode: KEYS_MODES.indexOf(KeysMode.ROTATE)},\n\t// });\n\t// /** @param keys rotate speed horizontal */\n\t// keysRotateSpeedHorizontal = ParamConfig.FLOAT(1, {\n\t// \trange: [0, 1],\n\t// \trangeLocked: [false, false],\n\t// \tvisibleIf: {enableKeys: 1, keysMode: KEYS_MODES.indexOf(KeysMode.ROTATE)},\n\t// });\n}\nconst ParamsConfig = new CameraOrbitEventParamsConfig();\n\nexport class CameraOrbitControlsEventNode extends TypedCameraControlsEventNode<CameraOrbitEventParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CameraControlsNodeType.ORBIT;\n\t}\n\tendEventName() {\n\t\treturn 'end';\n\t}\n\toverride initializeNode() {\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew EventConnectionPoint(OUTPUT_START, EventConnectionPointType.BASE),\n\t\t\tnew EventConnectionPoint(OUTPUT_CHANGE, EventConnectionPointType.BASE),\n\t\t\tnew EventConnectionPoint(OUTPUT_END, EventConnectionPointType.BASE),\n\t\t]);\n\t}\n\n\tprivate _controlsByElementId: Map<string, OrbitControls> = new Map();\n\tprivate _firstControls: OrbitControls | undefined;\n\n\tprotected _createControls(camera: Camera, element: HTMLElement) {\n\t\treturn new OrbitControls(camera, element);\n\t}\n\tasync createControlsInstance(camera: Camera, element: HTMLElement) {\n\t\tconst controls = this._createControls(camera, element);\n\t\tcontrols.addEventListener('end', () => {\n\t\t\tthis._on_controls_end(controls);\n\t\t});\n\n\t\tthis._controlsByElementId.set(element.id, controls);\n\t\tthis._updateCache();\n\t\tthis._bind_listeners_to_controls_instance(controls);\n\t\treturn controls;\n\t}\n\tprotected _bind_listeners_to_controls_instance(controls: OrbitControls) {\n\t\tcontrols.addEventListener('start', () => {\n\t\t\tthis.dispatchEventToOutput(OUTPUT_START, {});\n\t\t});\n\t\tcontrols.addEventListener('change', () => {\n\t\t\tthis.dispatchEventToOutput(OUTPUT_CHANGE, {});\n\t\t});\n\t\tcontrols.addEventListener('end', () => {\n\t\t\tthis.dispatchEventToOutput(OUTPUT_END, {});\n\t\t});\n\t}\n\n\tsetupControls(controls: OrbitControls) {\n\t\tcontrols.enabled = isBooleanTrue(this.pv.enabled);\n\n\t\tcontrols.enablePan = isBooleanTrue(this.pv.allowPan);\n\t\tcontrols.enableRotate = isBooleanTrue(this.pv.allowRotate);\n\t\tcontrols.enableZoom = isBooleanTrue(this.pv.allowZoom);\n\t\tcontrols.zoomSpeed = this.pv.zoomSpeed;\n\t\tcontrols.zoomToCursor = isBooleanTrue(this.pv.zoomToCursor);\n\n\t\tcontrols.enableDamping = isBooleanTrue(this.pv.tdamping);\n\t\tcontrols.dampingFactor = this.pv.damping;\n\n\t\tcontrols.rotateSpeed = this.pv.rotateSpeed;\n\n\t\tcontrols.screenSpacePanning = isBooleanTrue(this.pv.screenSpacePanning);\n\n\t\tcontrols.minDistance = this.pv.minDistance;\n\t\tcontrols.maxDistance = this.pv.maxDistance;\n\t\tcontrols.minZoom = this.pv.minZoom;\n\t\tcontrols.maxZoom = this.pv.maxZoom;\n\t\tcontrols.clampPosition = this.pv.clampPosition;\n\t\tcontrols.positionBounds.min.copy(this.pv.positionMin);\n\t\tcontrols.positionBounds.max.copy(this.pv.positionMax);\n\n\t\tthis._set_azimuth_angle(controls);\n\t\tcontrols.minPolarAngle = this.pv.polarAngleRange.x;\n\t\tcontrols.maxPolarAngle = this.pv.polarAngleRange.y;\n\t\tcontrols.target.copy(this.pv.target);\n\t\tif (controls.enabled) {\n\t\t\tcontrols.update(); // necessary if target is not 0,0,0\n\t\t}\n\n\t\t// overrides\n\t\tcontrols.mouseButtons.LEFT = THREE_MOUSE_BY_MOUSE_CONTROL[MOUSE_CONTROLS[this.pv.leftMouseButton]];\n\t\tcontrols.mouseButtons.MIDDLE = THREE_MOUSE_BY_MOUSE_CONTROL[MOUSE_CONTROLS[this.pv.middleMouseButton]];\n\t\tcontrols.mouseButtons.RIGHT = THREE_MOUSE_BY_MOUSE_CONTROL[MOUSE_CONTROLS[this.pv.rightMouseButton]];\n\t\tcontrols.touches.ONE = THREE_TOUCH_BY_TOUCH_CONTROL[TOUCH_CONTROLS[this.pv.oneFingerTouch]];\n\t\tcontrols.touches.TWO = THREE_TOUCH_BY_TOUCH_CONTROL[TOUCH_CONTROLS[this.pv.twoFingersTouch]];\n\t\t// controls.touches.ONE = TOUCH.ROTATE;\n\t\t// controls.touches.TWO = TOUCH.DOLLY_PAN;\n\n\t\t// controls.enableKeys = isBooleanTrue(this.pv.enableKeys);\n\t\t// if (controls.enableKeys) {\n\t\t// \tcontrols.keyMode = KEYS_MODES[this.pv.keysMode];\n\t\t// \tcontrols.keyRotateSpeedVertical = this.pv.keysRotateSpeedVertical;\n\t\t// \tcontrols.keyRotateSpeedHorizontal = this.pv.keysRotateSpeedHorizontal;\n\t\t// \tcontrols.keyPanSpeed = this.pv.keysPanSpeed;\n\t\t// }\n\t}\n\tprivate _set_azimuth_angle(controls: OrbitControls) {\n\t\tif (isBooleanTrue(this.pv.limitAzimuthAngle)) {\n\t\t\tcontrols.minAzimuthAngle = this.pv.azimuthAngleRange.x;\n\t\t\tcontrols.maxAzimuthAngle = this.pv.azimuthAngleRange.y;\n\t\t} else {\n\t\t\tcontrols.minAzimuthAngle = Infinity;\n\t\t\tcontrols.maxAzimuthAngle = Infinity;\n\t\t}\n\t}\n\n\tupdateRequired(): boolean {\n\t\treturn isBooleanTrue(this.pv.tdamping);\n\t}\n\n\t// set_from_camera_node(controls: CameraControls, camera_node: BaseCameraObjNodeType): void {\n\t// \tconst target = camera_node.params.vector3('target');\n\t// \tcontrols.target.copy(target);\n\t// \tconsole.warn('set from camera node');\n\t// }\n\n\tprivate _on_controls_end(controls: OrbitControls) {\n\t\tif (!isBooleanTrue(this.pv.updateTargetEndMoveEnd)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isBooleanTrue(this.pv.allowPan)) {\n\t\t\t// target should not be updated if pan is not allowed\n\t\t\treturn;\n\t\t}\n\t\tcontrols.target.toArray(_targetArray);\n\t\tthis.p.target.set(_targetArray);\n\t}\n\n\tstatic PARAM_CALLBACK_updateTarget(node: CameraOrbitControlsEventNode) {\n\t\tnode._updateTarget();\n\t}\n\tprivate _updateTarget() {\n\t\tthis.setTarget(this.pv.target);\n\t}\n\ttarget(target: Vector3) {\n\t\tif (!this._firstControls) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.copy(this._firstControls.target);\n\t}\n\tsetTarget(newTarget: Vector3) {\n\t\tthis._controlsByElementId.forEach((control, element_id) => {\n\t\t\tconst destTarget = control.target;\n\t\t\tif (!destTarget.equals(newTarget)) {\n\t\t\t\tdestTarget.copy(newTarget);\n\t\t\t\tcontrol.update();\n\t\t\t}\n\t\t});\n\t}\n\n\tdisposeControlsForHtmlElementId(html_element_id: string) {\n\t\t// this method is important so that we can do the following steps:\n\t\t// 1. assign an orbit_controls to the camera\n\t\t// 2. remove the controls\n\t\t// 3. update the target param of the controls, and this doesn't affect the camera (nor should it!)\n\t\tconst controls = this._controlsByElementId.get(html_element_id);\n\t\tif (controls) {\n\t\t\t// controls.dispose(); // no need to dispose here, as it is done by the viewer for now\n\t\t\tthis._controlsByElementId.delete(html_element_id);\n\t\t}\n\t\tthis._updateCache();\n\t}\n\tprivate _updateCache() {\n\t\tthis._firstControls = undefined;\n\t\tthis._controlsByElementId.forEach((controls) => {\n\t\t\tthis._firstControls = this._firstControls || controls;\n\t\t});\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {BaseEventConnectionPoint} from '../utils/io/connections/Event';\nimport {pushOnArrayAtEntry} from '../../../core/MapUtils';\nimport {Poly} from '../../Poly';\nimport { EventContext } from '../../../core/event/EventContextType';\n\ntype DispatchHook = (event_context: EventContext<Event>) => void;\n\n/**\n *\n *\n * TypedEventNode is the base class for all nodes that process events. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\n\nexport class TypedEventNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.EVENT, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.EVENT;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis.uiData.setLayoutHorizontal();\n\t\t// this.addPostDirtyHook('_eval_all_params_on_dirty', this._eval_all_params_on_dirty_bound);\n\t\t// cook is required for some nodes like event/animation\n\t\tthis.addPostDirtyHook('cookWithoutInputsOnDirty', this._cookWithoutInputsBound);\n\n\t\tthis.io.inputs.setDependsOnInputs(false);\n\t\tthis.io.connections.initInputs();\n\t\tthis.io.connection_points.spare_params.initializeNode();\n\t}\n\n\t// ensures that event nodes are cooked when scene is loaded\n\t// private _eval_all_params_on_dirty_bound = this._eval_all_params_on_dirty.bind(this);\n\t// _eval_all_params_on_dirty() {\n\t// \tthis.params.eval_all();\n\t// }\n\tprivate _cookWithoutInputsBound = this._cookWithoutInputs.bind(this);\n\t_cookWithoutInputs() {\n\t\tthis.cookController.cookMainWithoutInputs();\n\t}\n\toverride cook() {\n\t\tthis.cookController.endCook();\n\t}\n\t// eval_params_and_processEvent(event_context: EventContext<Event>, connection_point: BaseEventConnectionPoint) {\n\t// \t// not evaluation params now, since we are evaluating them on dirty\n\t// \t// this.params.eval_all().then(()=>{\n\t// \t\tthis.processEvent(event_context, connection_point)\n\t// \t// })\n\t// }\n\tprocessEventViaConnectionPoint(eventContext: EventContext<Event>, connectionPoint: BaseEventConnectionPoint) {\n\t\tif (connectionPoint.event_listener) {\n\t\t\tconnectionPoint.event_listener(eventContext);\n\t\t} else {\n\t\t\tthis.processEvent(eventContext);\n\t\t}\n\t}\n\tprocessEvent(event_context: EventContext<Event>) {}\n\n\t//\n\t//\n\t// It may be more practical to use cook, rather than process_event\n\t// to benefit from params evaluation.\n\t// But that would mean that each node receiving an event would make the successors dirty,\n\t// which may also be problematic. So for now, I use process_event\n\t//\n\t//\n\tprotected async dispatchEventToOutput(output_name: string, event_context: EventContext<Event>) {\n\t\tthis.run_on_dispatch_hook(output_name, event_context);\n\t\tconst index = this.io.outputs.getOutputIndex(output_name);\n\t\tif (index >= 0) {\n\t\t\t// const connections = this.io.connections.outputConnections();\n\t\t\t// const current_connections = connections.filter((connection) => connection.output_index == index);\n\t\t\tconst outputConnections = this.io.connections.outputConnectionsByOutputIndex(index);\n\t\t\tif (outputConnections) {\n\t\t\t\tlet destNode: BaseEventNodeType;\n\n\t\t\t\tif (!Poly.playerMode()) {\n\t\t\t\t\tconst dispatcher = this.scene().eventsDispatcher.connectionTriggerDispatcher;\n\t\t\t\t\toutputConnections.forEach((connection) => {\n\t\t\t\t\t\tdispatcher.dispatchTrigger(connection);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\toutputConnections.forEach((connection) => {\n\t\t\t\t\tdestNode = connection.nodeDest();\n\t\t\t\t\tconst destNodeConnectionPoints = destNode.io.inputs.namedInputConnectionPoints();\n\t\t\t\t\tif (destNodeConnectionPoints) {\n\t\t\t\t\t\tconst connection_point = destNodeConnectionPoints[connection.inputIndex()];\n\t\t\t\t\t\tdestNode.processEventViaConnectionPoint(event_context, connection_point);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// let destNode: BaseEventNodeType;\n\t\t\t// for (let connection of current_connections) {\n\t\t\t// \tdestNode = connection.node_dest;\n\t\t\t// \tconst connection_point = destNode.io.inputs.namedInputConnectionPoints()[connection.input_index];\n\t\t\t// \tdestNode.processEventViaConnectionPoint(event_context, connection_point);\n\t\t\t// }\n\t\t\t// const nodes = current_connections.map((connection) => connection.node_dest);\n\t\t\t// for (let node of nodes) {\n\t\t\t// \tnode.processEvent(event_context);\n\t\t\t// }\n\t\t} else {\n\t\t\tconsole.warn(`requested output '${output_name}' does not exist on node '${this.path()}'`);\n\t\t}\n\t}\n\n\tprivate _on_dispatch_hooks_by_output_name: Map<string, DispatchHook[]> | undefined;\n\t/**\n\t * onDispatch is called when an output triggers an event.\n\t *\n\t * Here is an example usage to listen to events:\n\t *\n\t * ``` ts\n\t *let _currentState = false;\n\t *function setHit( newState ){\n\t *  if( _currentState != newState ){\n\t *    if( newState ){\n\t *      playSound();\n\t *    }\n\t *    _currentState = newState;\n\t *  }\n\t *}\n\t *\n\t *const raycastNode = scene.node('<path to the node>');\n\t *raycastNode.onDispatch('hit', ()=>setHit(true) );\n\t *raycastNode.onDispatch('miss', ()=>setHit(false) );\n\t * ```\n\t *\n\t * Alternatively, you can also have the following arguments from the callback\n\t *\n\t * - viewer: the [viewer](https://polygonjs.com/docs/api/TypedViewer) displaying the scene.\n\t * - event: the mouse/pointer/keyboard event that originally triggered the event\n\t * - emitter: the domElement the event was triggered from (either the canvas or the document)\n\t * - value: an optional value linked to the event.\n\t *\n\t * ``` ts\n\t *raycastNode.onDispatch('hit',(eventContext)=>{\n\t *  const {viewer, event, emitter, value} = eventContext;\n\t *});\n\t * ```\n\t *\n\t */\n\tpublic onDispatch(outputName: string, callback: DispatchHook) {\n\t\tthis._on_dispatch_hooks_by_output_name = this._on_dispatch_hooks_by_output_name || new Map();\n\t\tpushOnArrayAtEntry(this._on_dispatch_hooks_by_output_name, outputName, callback);\n\t}\n\tprivate run_on_dispatch_hook(output_name: string, event_context: EventContext<Event>) {\n\t\tif (this._on_dispatch_hooks_by_output_name) {\n\t\t\tconst hooks = this._on_dispatch_hooks_by_output_name.get(output_name);\n\t\t\tif (hooks) {\n\t\t\t\tfor (const hook of hooks) {\n\t\t\t\t\thook(event_context);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type BaseEventNodeType = TypedEventNode<any>;\nexport class BaseEventNodeClass extends TypedEventNode<any> {}\n","import {Camera} from 'three';\nimport {TypedEventNode} from './_Base';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {BaseViewerType} from '../../viewers/_Base';\nimport {Poly} from '../../Poly';\n\nexport interface CameraControls {\n\tname?: string;\n\tenabled?: boolean;\n\tdispose: () => void;\n\tupdate: (delta: number) => void;\n\taddEventListener: (eventName: string, callback: () => void) => void;\n\tremoveEventListener: (eventName: string, callback: () => void) => void;\n}\n\nexport abstract class TypedCameraControlsEventNode<K extends NodeParamsConfig> extends TypedEventNode<K> {\n\tprivate _controls_by_viewer: Map<BaseViewerType, CameraControls> = new Map();\n\n\tasync applyControls(camera: Camera, viewer: BaseViewerType) {\n\t\t// I don't think I can just assign the camera at the moment\n\t\t// so the controls may need to be re-created everytime\n\t\t// TODO: the controls should be created (and disposed?) by the viewer\n\t\t//this.dispose_controls()\n\t\t// viewer.controlsController()?.dispose_controls();\n\t\tconst canvas = viewer.canvas();\n\t\tif (!canvas) {\n\t\t\treturn;\n\t\t}\n\t\t// ensure the params are computed\n\t\t// as otherwise, their values would be null\n\t\t// if they are tied to an expression, for instance\n\t\t// when inside a polyNode\n\t\tconst ensureParamsAreComputed = async () => {\n\t\t\tlet promises: Array<Promise<void>> | undefined;\n\t\t\tfor (const param of this.params.all) {\n\t\t\t\tif (param.isDirty() && !param.parentParam()) {\n\t\t\t\t\tpromises = promises || [];\n\t\t\t\t\tpromises.push(param.compute());\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (promises) {\n\t\t\t\tawait Promise.all(promises);\n\t\t\t}\n\t\t};\n\t\tawait ensureParamsAreComputed();\n\t\t//\n\t\tconst controls = await this.createControlsInstance(camera, canvas);\n\t\tconst currentControls = this._controls_by_viewer.get(viewer);\n\t\tif (currentControls) {\n\t\t\tcurrentControls.dispose();\n\t\t}\n\t\tthis._controls_by_viewer.set(viewer, controls);\n\t\tconst performance = Poly.performance.performanceManager();\n\t\tconst timestamp = performance.now();\n\t\tcontrols.name = `${this.path()}:${camera.name}:${timestamp}:${this.controls_id()}`;\n\t\tawait this.params.evalAll();\n\t\tthis.setupControls(controls);\n\t\treturn controls;\n\t}\n\tcontrols_id() {\n\t\treturn JSON.stringify(this.params.all.map((p) => p.valueSerialized()));\n\t}\n\tabstract updateRequired(): boolean;\n\toverride cook(): void {\n\t\tthis._controls_by_viewer.forEach((controls) => {\n\t\t\tthis.setupControls(controls);\n\t\t});\n\t\tthis.cookController.endCook();\n\t}\n\n\tabstract setupControls(controls: CameraControls): void;\n\tabstract disposeControlsForHtmlElementId(html_element_id: string): void;\n\tabstract createControlsInstance(camera: Camera, element: HTMLElement): Promise<CameraControls>;\n\tabstract endEventName(): string;\n}\n\nexport type BaseCameraControlsEventNodeType = TypedCameraControlsEventNode<any>;\n","/**\n * Allows to feed a vertex attribute into the shader\n *\n *\n */\nimport {GlType} from './../../poly/registers/nodes/types/Gl';\nimport {TypedGlNode, BaseGlNodeType} from './_Base';\nimport {GlConnectionPointType, BaseGlConnectionPoint} from '../utils/io/connections/Gl';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\n\nexport const ATTRIBUTE_NODE_AVAILABLE_GL_TYPES = [\n\tGlConnectionPointType.FLOAT,\n\tGlConnectionPointType.VEC2,\n\tGlConnectionPointType.VEC3,\n\tGlConnectionPointType.VEC4,\n];\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nclass AttributeGlParamsConfig extends NodeParamsConfig {\n\t/** @param attribute name */\n\tname = ParamConfig.STRING('attribute1');\n\t/** @param attribute type (float, vec2, vec3, vec4) */\n\ttype = ParamConfig.INTEGER(0, {\n\t\tmenu: {\n\t\t\tentries: ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param allows to export the attribute to a material (when used inside a particles system) */\n\ttexportWhenConnected = ParamConfig.BOOLEAN(0, {hidden: true});\n\t/** @param allows to export the attribute to a material (when used inside a particles system) */\n\texportWhenConnected = ParamConfig.BOOLEAN(0, {visibleIf: {texportWhenConnected: 1}});\n}\nconst ParamsConfig = new AttributeGlParamsConfig();\n\nexport class AttributeGlNode extends TypedGlNode<AttributeGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<GlType.ATTRIBUTE> {\n\t\treturn GlType.ATTRIBUTE;\n\t}\n\tstatic readonly INPUT_NAME = 'in';\n\tstatic readonly OUTPUT_NAME = 'val';\n\n\t// private _update_signature_if_required_bound = this._update_signature_if_required.bind(this);\n\t// public readonly gl_connections_controller: GlConnectionsController = new GlConnectionsController(this);\n\toverride initializeNode() {\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompileIfIsExporting.bind(this));\n\t\tthis.io.connection_points.initializeNode();\n\n\t\tthis.io.connection_points.set_expected_input_types_function(() => {\n\t\t\tif (this.materialNode()?.assemblerController()?.allow_attribute_exports()) {\n\t\t\t\treturn [ATTRIBUTE_NODE_AVAILABLE_GL_TYPES[this.pv.type]];\n\t\t\t} else {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t});\n\t\tthis.io.connection_points.set_input_name_function((index: number) => {\n\t\t\treturn AttributeGlNode.INPUT_NAME;\n\t\t});\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [\n\t\t\tATTRIBUTE_NODE_AVAILABLE_GL_TYPES[this.pv.type],\n\t\t]);\n\t\t// this.params.add_on_scene_load_hook('_update_signature_if_required', this._update_signature_if_required_bound);\n\t\t// this.params.set_post_create_params_hook(this._update_signature_if_required_bound);\n\t\t// this.addPostDirtyHook('_update_signature_if_required', this._update_signature_if_required_bound);\n\n\t\tthis.lifecycle.onAfterAdded(this._bound_setExportWhenConnectedStatus);\n\t\tthis.params.addOnSceneLoadHook('prepare params', this._bound_setExportWhenConnectedStatus);\n\t}\n\tprivate _bound_setExportWhenConnectedStatus = this._setExportWhenConnectedStatus.bind(this);\n\tprivate _setExportWhenConnectedStatus() {\n\t\tif (this.materialNode()?.assemblerController()?.allow_attribute_exports()) {\n\t\t\tthis.p.texportWhenConnected.set(1);\n\t\t}\n\t}\n\tsetAttribSize(size: number) {\n\t\tthis.p.type.set(size - 1);\n\t}\n\n\t// createParams() {}\n\t// inputless_params_names(): string[] {\n\t// \treturn ['type'];\n\t// }\n\n\tinputName() {\n\t\treturn AttributeGlNode.INPUT_NAME;\n\t}\n\toutputName() {\n\t\treturn AttributeGlNode.OUTPUT_NAME;\n\t}\n\t// TODO:\n\t// ideally glVarName should know which shader it is being called in.\n\t// so that if it is in a vertex shader, it can return the name of the attribute directly.\n\t// and if it is in a fragment, it would behave as usual.\n\t// override glVarName() {\n\t// \t// if (name) {\n\t// \t// \treturn super.glVarName(name);\n\t// \t// }\n\t// \t// return this.varyingName();\n\t// }\n\tvaryingName() {\n\t\treturn `v_POLY_attribute_${this.pv.name}`;\n\t}\n\n\t// private create_inputs_from_params() {\n\t// \tif (this.materialNode().allow_attribute_exports) {\n\t// \t\t// this.set_named_inputs([new TypedConnectionFloat(AttributeGlNode.input_name())]);\n\t// \t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t// \t\t\tnew TypedNamedConnectionPoint(INPUT_NAME, ConnectionPointTypes[this.pv.type]),\n\t// \t\t]);\n\t// \t\t// this._init_graph_node_inputs();\n\t// \t}\n\t// }\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst assembler = shadersCollectionController.assembler() as BaseGlShaderAssembler;\n\t\tassembler.setNodeLinesAttribute(this, shadersCollectionController);\n\t}\n\n\t// update_output_type(constructor) {\n\t// \tconst named_output = new constructor(Attribute.output_name());\n\t// \tthis.set_named_outputs([named_output]);\n\t// }\n\t// update_input_type(constructor) {\n\t// \tconst named_input = new constructor(Attribute.input_name());\n\t// \tthis.set_named_inputs([named_input]);\n\t// \tthis._init_graph_node_inputs();\n\t// }\n\n\tattributeName(): string {\n\t\treturn this.pv.name.trim();\n\t}\n\tglType(): GlConnectionPointType {\n\t\tconst outputConnectionPoints = this.io.outputs.namedOutputConnectionPoints();\n\t\tif (!outputConnectionPoints) {\n\t\t\treturn GlConnectionPointType.FLOAT;\n\t\t}\n\t\treturn outputConnectionPoints[0].type();\n\t}\n\tsetGlType(type: GlConnectionPointType) {\n\t\tthis.p.type.set(ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.indexOf(type));\n\t}\n\t//\n\t//\n\t// Utility methods for SOP/ParticlesSystemGPU and Assembler/Particles\n\t//\n\t//\n\tconnected_input_node(): BaseGlNodeType | null {\n\t\t// if (this.io.inputs.hasNamedInputs()) {\n\t\treturn this.io.inputs.named_input(AttributeGlNode.INPUT_NAME);\n\t\t// }\n\t}\n\tconnected_input_connection_point(): BaseGlConnectionPoint | undefined {\n\t\treturn this.io.inputs.named_input_connection_point(AttributeGlNode.INPUT_NAME);\n\t}\n\t// connected_input(): NamedConnection {\n\t// \tconst connection_point = this.connected_input_connection_point();\n\t// \tif (connection_point) {\n\t// \t\treturn this.io.inputs.named_inputs().filter((ni) => ni.name() == Attribute.input_name())[0];\n\t// \t}\n\t// }\n\toutput_connection_point(): BaseGlConnectionPoint | undefined {\n\t\t// if (this.io.inputs.hasNamedInputs()) {\n\t\treturn this.io.outputs.namedOutputConnectionPointsByName(this.outputName());\n\t\t// }\n\t}\n\t// connected_output(): NamedConnection {\n\t// \tconst output = this.named_output(0);\n\t// \tif (output) {\n\t// \t\treturn output; //this.named_inputs().filter(ni=>ni.name() == Attribute.input_name())[0]\n\t// \t}\n\t// }\n\tisImporting(): boolean {\n\t\treturn this.io.outputs.used_output_names().length > 0; // TODO: ensure that we can check that the connected outputs are part of the nodes retrieved by the node traverser\n\t}\n\tisExporting(): boolean {\n\t\tif (isBooleanTrue(this.pv.exportWhenConnected)) {\n\t\t\tconst input_node = this.io.inputs.named_input(AttributeGlNode.INPUT_NAME);\n\t\t\treturn input_node != null;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\tprivate _setMatToRecompileIfIsExporting() {\n\t\t//if (this.isExporting()) {\n\t\t// we cannot just use .isExporting()\n\t\t// as the node must also set the parent to recompile\n\t\t// when its input is being removed\n\t\t// (in which case .isExporting() would always return false)\n\t\tif (isBooleanTrue(this.pv.exportWhenConnected)) {\n\t\t\tthis._setMatToRecompile();\n\t\t}\n\t}\n\n\t//\n\t//\n\t// SIGNATURE\n\t//\n\t//\n\t// private _update_signature_if_required(dirty_trigger?: CoreGraphNode) {\n\t// \tif (!this.lifecycle.creation_completed || dirty_trigger == this.p.type) {\n\t// \t\tthis.update_input_and_output_types();\n\t// \t\tthis.removeDirtyState();\n\t// \t\tthis.make_output_nodes_dirty();\n\t// \t}\n\t// \tthis.materialNode()?.assembler_controller.set_compilation_required_and_dirty(this);\n\t// }\n\t// private update_input_and_output_types() {\n\t// \tconst set_dirty = false;\n\t// \tthis.io.outputs.setNamedOutputConnectionPoints(\n\t// \t\t[new TypedNamedConnectionPoint(this.output_name, ConnectionPointTypesAvailableForAttribute[this.pv.type])],\n\t// \t\tset_dirty\n\t// \t);\n\t// \tif (this.materialNode()?.assembler_controller.allow_attribute_exports()) {\n\t// \t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t// \t\t\tnew TypedNamedConnectionPoint(this.input_name, ConnectionPointTypesAvailableForAttribute[this.pv.type]),\n\t// \t\t]);\n\t// \t}\n\t// }\n}\n","/**\n * creates a for loop, executing the nodes inside it on each loop\n *\n *\n *\n */\n\nimport {TypedSubnetGlNode, TypedSubnetGlParamsConfigMixin} from './Subnet';\n// import {GlConnectionPointType} from '../utils/io/connections/Gl';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {SubnetInputGlNode} from './SubnetInput';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {GlConnectionPointType} from '../utils/io/connections/Gl';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {GlType} from '../../poly/registers/nodes/types/Gl';\n// import {ArrayUtils} from '../../../core/ArrayUtils';\n\nenum ForLoopInput {\n\tSTART = 'start',\n\tMAX = 'max',\n\tSTEP = 'step',\n\tI = 'i',\n}\nconst DEFAULT_VALUES: PolyDictionary<number> = {\n\t[ForLoopInput.START]: 0,\n\t[ForLoopInput.MAX]: 10,\n\t[ForLoopInput.STEP]: 1,\n};\nconst OFFSET = 0;\n\nclass ForLoopGlParamsConfig extends TypedSubnetGlParamsConfigMixin(NodeParamsConfig) {\n\tstart = ParamConfig.FLOAT(0);\n\tmax = ParamConfig.FLOAT(10, {\n\t\trange: [0, 100],\n\t\trangeLocked: [false, false],\n\t});\n\tstep = ParamConfig.FLOAT(1);\n\tasFloat = ParamConfig.BOOLEAN(0, {\n\t\tseparatorAfter: true,\n\t\t// hide the param until I can find a way for the subnet outputs\n\t\t// to change type when asFloat is true\n\t\thidden: true,\n\t});\n}\nconst ParamsConfig = new ForLoopGlParamsConfig();\n\nexport class ForLoopGlNode extends TypedSubnetGlNode<ForLoopGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn GlType.FOR_LOOP;\n\t}\n\n\toverride paramDefaultValue(name: string) {\n\t\treturn DEFAULT_VALUES[name];\n\t}\n\n\toverride childExpectedInputConnectionPointTypes() {\n\t\tconst {glType} = this._typesData();\n\t\tconst forLoopInputTypes: GlConnectionPointType[] = [glType, glType, glType, glType];\n\t\treturn forLoopInputTypes.concat(super._expectedInputTypes());\n\t}\n\toverride childExpectedInputConnectionPointName(index: number) {\n\t\tconst forLoopInputNames: string[] = ['start', 'end', 'step', 'i'];\n\t\tif (index <= 3) {\n\t\t\treturn forLoopInputNames[index];\n\t\t} else {\n\t\t\treturn super._expectedInputName(index - 4);\n\t\t}\n\t}\n\n\t// protected override _expectedInputsCount() {\n\t// \tconst current_connections = this.io.connections.inputConnections();\n\t// \treturn current_connections ? ArrayUtils.compact(current_connections).length + 1 : 1;\n\t// }\n\n\t// protected override _expectedInputTypes(): GlConnectionPointType[] {\n\t// \tconst types: GlConnectionPointType[] = [\n\t// \t\t// GlConnectionPointType.FLOAT,\n\t// \t\t// GlConnectionPointType.FLOAT,\n\t// \t\t// GlConnectionPointType.FLOAT,\n\t// \t];\n\n\t// \tconst default_type = GlConnectionPointType.FLOAT;\n\t// \tconst current_connections = this.io.connections.inputConnections();\n\n\t// \tconst expected_count = this._expectedInputsCount();\n\t// \tfor (let i = OFFSET; i < expected_count; i++) {\n\t// \t\tif (current_connections) {\n\t// \t\t\tconst connection = current_connections[i];\n\t// \t\t\tif (connection) {\n\t// \t\t\t\tconst type = connection.src_connection_point().type();\n\t// \t\t\t\ttypes.push(type);\n\t// \t\t\t} else {\n\t// \t\t\t\ttypes.push(default_type);\n\t// \t\t\t}\n\t// \t\t} else {\n\t// \t\t\ttypes.push(default_type);\n\t// \t\t}\n\t// \t}\n\t// \treturn types;\n\t// }\n\n\t// protected override _expectedOutputTypes() {\n\t// \tconst types: GlConnectionPointType[] = [];\n\t// \tconst input_types = this._expectedInputTypes();\n\t// \tfor (let i = OFFSET; i < input_types.length; i++) {\n\t// \t\ttypes.push(input_types[i]);\n\t// \t}\n\t// \treturn types;\n\t// }\n\t// protected override _expectedInputName(index: number) {\n\t// \t// switch (index) {\n\t// \t// \tcase 0:\n\t// \t// \t\treturn ForLoopInput.START_INDEX;\n\t// \t// \tcase 1:\n\t// \t// \t\treturn ForLoopInput.MAX;\n\t// \t// \tcase 2:\n\t// \t// \t\treturn ForLoopInput.STEP;\n\t// \t// \tdefault: {\n\t// \tconst connection = this.io.connections.inputConnection(index);\n\t// \tif (connection) {\n\t// \t\tconst name = connection.src_connection_point().name();\n\t// \t\treturn name;\n\t// \t} else {\n\t// \t\treturn `in${index}`;\n\t// \t}\n\t// \t// }\n\t// \t// }\n\t// }\n\t// protected override _expectedOutputName(index: number) {\n\t// \treturn this._expectedInputName(index + OFFSET);\n\t// }\n\n\t//\n\t//\n\t// set_lines\n\t//\n\t//\n\tprotected override setLinesBlockStart(shaders_collection_controller: ShadersCollectionController) {\n\t\tconst body_lines: string[] = [];\n\t\t// const connection_points = this.io.inputs.namedInputConnectionPoints();\n\t\t// for (let i = OFFSET; i < connection_points.length; i++) {\n\t\t// \tconst connection_point = connection_points[i];\n\t\t// \tconst gl_type = connection_point.type();\n\t\t// \tconst out = this.glVarName(connection_point.name());\n\t\t// \tconst in_value = ThreeToGl.any(this.variableForInput(connection_point.name()));\n\t\t// \tconst body_line = `${gl_type} ${out} = ${in_value}`;\n\t\t// \tbody_lines.push(body_line);\n\t\t// }\n\t\t// const connections = this.io.connections.inputConnections();\n\t\t// if (connections) {\n\t\t// \tfor (let connection of connections) {\n\t\t// \t\tif (connection) {\n\t\t// \t\t\tif (connection.input_index >= OFFSET) {\n\t\t// \t\t\t\tconst connection_point = connection.dest_connection_point();\n\t\t// \t\t\t\tconst in_value = ThreeToGl.any(this.variableForInput(connection_point.name()));\n\t\t// \t\t\t\tconst gl_type = connection_point.type();\n\t\t// \t\t\t\tconst out = this.glVarName(connection_point.name());\n\t\t// \t\t\t\tconst body_line = `${gl_type} ${out} = ${in_value}`;\n\t\t// \t\t\t\tbody_lines.push(body_line);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tconst start: number = this.pv.start;\n\t\tconst max: number = this.pv.max;\n\t\tconst step: number = this.pv.step;\n\t\tconst {glType, convertMethod} = this._typesData();\n\t\tconst start_str = convertMethod(start);\n\t\tconst max_str = convertMethod(max);\n\t\tconst step_str = convertMethod(step);\n\t\tconst iterator_name = this.glVarName(ForLoopInput.I);\n\t\tconst open_for_loop_line = `for(${glType} ${iterator_name} = ${start_str}; ${iterator_name} < ${max_str}; ${iterator_name}+= ${step_str}){`;\n\t\tbody_lines.push(open_for_loop_line);\n\n\t\tshaders_collection_controller.addBodyLines(this, body_lines);\n\t}\n\toverride setSubnetInputLines(\n\t\tshadersCollectionController: ShadersCollectionController,\n\t\tchildNode: SubnetInputGlNode\n\t) {\n\t\tconst {glType, convertMethod} = this._typesData();\n\n\t\tconst body_lines: string[] = [];\n\n\t\t// i\n\t\tconst iterator_name = this.glVarName(ForLoopInput.I);\n\t\tconst i = childNode.glVarName(ForLoopInput.I);\n\t\tbody_lines.push(`\t${glType} ${i} = ${iterator_name}`);\n\t\t// start\n\t\tconst start = childNode.glVarName(ForLoopInput.START);\n\t\tbody_lines.push(`\t${glType} ${start} = ${convertMethod(this.pv.start)}`);\n\t\t// end\n\t\tconst max = childNode.glVarName(ForLoopInput.MAX);\n\t\tbody_lines.push(`\t${glType} ${max} = ${convertMethod(this.pv.max)}`);\n\t\t// step\n\t\tconst step = childNode.glVarName(ForLoopInput.STEP);\n\t\tbody_lines.push(`\t${glType} ${step} = ${convertMethod(this.pv.step)}`);\n\n\t\tconst connections = this.io.connections.inputConnections();\n\t\tif (connections) {\n\t\t\tfor (const connection of connections) {\n\t\t\t\tif (connection) {\n\t\t\t\t\tif (connection.inputIndex() >= OFFSET) {\n\t\t\t\t\t\tconst connection_point = connection.destConnectionPoint();\n\t\t\t\t\t\tif (connection_point) {\n\t\t\t\t\t\t\tconst in_value = this.glVarName(connection_point.name());\n\t\t\t\t\t\t\tconst gl_type = connection_point.type();\n\t\t\t\t\t\t\tconst out = childNode.glVarName(connection_point.name());\n\t\t\t\t\t\t\tconst body_line = `\t${gl_type} ${out} = ${in_value}`;\n\t\t\t\t\t\t\tbody_lines.push(body_line);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tshadersCollectionController.addBodyLines(childNode, body_lines);\n\t}\n\n\tprivate _typesData() {\n\t\tconst asFloat = isBooleanTrue(this.pv.asFloat);\n\t\tconst convertMethod = asFloat ? ThreeToGl.float : ThreeToGl.integer;\n\t\tconst glType = asFloat ? GlConnectionPointType.FLOAT : GlConnectionPointType.INT;\n\t\treturn {convertMethod, glType};\n\t}\n\n\t// override setLines(shaders_collection_controller: ShadersCollectionController) {}\n}\n","/**\n * Allows to access global variables\n *\n *\n */\nimport {TypedGlNode} from './_Base';\nimport {GlType} from './../../poly/registers/nodes/types/Gl';\n// list of globals\n// https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL)\n// gl_PointCoord\n\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nclass GlobalsGlParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new GlobalsGlParamsConfig();\n\nexport class GlobalsGlNode extends TypedGlNode<GlobalsGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn GlType.GLOBALS;\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.lifecycle.onAfterAdded(() => {\n\t\t\tthis.materialNode()?.assemblerController()?.add_globals_outputs(this);\n\t\t});\n\t}\n\n\toverride setLines(shaders_collection_controller: ShadersCollectionController) {\n\t\tconst assembler = shaders_collection_controller.assembler() as BaseGlShaderAssembler;\n\t\tassembler.set_node_lines_globals(this, shaders_collection_controller);\n\t}\n}\n","/**\n * executes the nodes inside it based on an input condition\n *\n *\n *\n */\n\nimport {TypedSubnetGlNode, TypedSubnetGlParamsConfigMixin} from './Subnet';\nimport {GlConnectionPointType} from '../utils/io/connections/Gl';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\n// import {SubnetInputGlNode} from './SubnetInput';\n// import {ArrayUtils} from '../../../core/ArrayUtils';\nimport {SubnetInputGlNode} from './SubnetInput';\nimport {GlType} from '../../poly/registers/nodes/types/Gl';\n\nconst CONDITION_INPUT_NAME = 'condition';\n\nclass IfThenGlParamsConfig extends TypedSubnetGlParamsConfigMixin(NodeParamsConfig) {}\nconst ParamsConfig = new IfThenGlParamsConfig();\n\nexport class IfThenGlNode extends TypedSubnetGlNode<IfThenGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<GlType.IF_THEN> {\n\t\treturn GlType.IF_THEN;\n\t}\n\n\t// protected override _expectedInputsCount() {\n\t// \tconst current_connections = this.io.connections.inputConnections();\n\t// \treturn current_connections ? Math.max(ArrayUtils.compact(current_connections).length + 1, 2) : 2;\n\t// }\n\n\tprotected override _expectedInputTypes(): GlConnectionPointType[] {\n\t\treturn [GlConnectionPointType.BOOL, ...super._expectedInputTypes()];\n\t}\n\n\tprotected override _expectedInputName(index: number) {\n\t\tif (index == 0) {\n\t\t\treturn CONDITION_INPUT_NAME;\n\t\t} else {\n\t\t\treturn super._expectedInputName(index - 1);\n\t\t}\n\t}\n\toverride childExpectedInputConnectionPointTypes() {\n\t\tconst subnetInputTypes = super.childExpectedInputConnectionPointTypes();\n\t\tconst types: GlConnectionPointType[] = [];\n\t\tfor (let i = 1; i < subnetInputTypes.length; i++) {\n\t\t\ttypes.push(subnetInputTypes[i]);\n\t\t}\n\t\treturn types;\n\t}\n\toverride childExpectedInputConnectionPointName(index: number) {\n\t\treturn super.childExpectedInputConnectionPointName(index + 1);\n\t}\n\n\t//\n\t//\n\t// set_lines\n\t//\n\t//\n\tprotected override _setLinesPreBlock(shadersCollectionController: ShadersCollectionController) {\n\t\tconst body_lines: string[] = [];\n\t\tconst connectionPoints = this.io.inputs.namedInputConnectionPoints();\n\t\tif (!connectionPoints) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let i = 0; i < connectionPoints.length; i++) {\n\t\t\tconst connectionPoint = connectionPoints[i];\n\t\t\tconst connectionPointName = connectionPoint.name();\n\t\t\tif (connectionPointName != CONDITION_INPUT_NAME) {\n\t\t\t\tconst gl_type = connectionPoint.type();\n\t\t\t\tconst out = this.glVarName(connectionPointName);\n\t\t\t\tconst in_value = ThreeToGl.any(this.variableForInput(connectionPointName));\n\t\t\t\tconst body_line = `${gl_type} ${out} = ${in_value}`;\n\t\t\t\tbody_lines.push(body_line);\n\t\t\t}\n\t\t}\n\n\t\tshadersCollectionController.addBodyLines(this, body_lines);\n\t}\n\toverride setSubnetInputLines(\n\t\tshadersCollectionController: ShadersCollectionController,\n\t\tchildNode: SubnetInputGlNode\n\t) {\n\t\tconst connections = this.io.connections.inputConnections();\n\t\tif (!connections) {\n\t\t\treturn;\n\t\t}\n\t\tconst body_lines: string[] = [];\n\t\tfor (let connection of connections) {\n\t\t\tif (connection) {\n\t\t\t\tconst connectionPoint = connection.destConnectionPoint();\n\t\t\t\tif (connectionPoint) {\n\t\t\t\t\tconst connectionPointName = connectionPoint.name();\n\t\t\t\t\tif (connectionPointName != CONDITION_INPUT_NAME) {\n\t\t\t\t\t\tconst in_value = ThreeToGl.any(this.variableForInput(connectionPointName));\n\t\t\t\t\t\tconst gl_type = connectionPoint.type();\n\t\t\t\t\t\tconst out = childNode.glVarName(connectionPointName);\n\t\t\t\t\t\tconst body_line = `\t${gl_type} ${out} = ${in_value}`;\n\t\t\t\t\t\tbody_lines.push(body_line);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tshadersCollectionController.addBodyLines(childNode, body_lines);\n\t}\n\tprotected override setLinesBlockStart(shaders_collection_controller: ShadersCollectionController) {\n\t\tconst body_lines: string[] = [];\n\t\tconst condition_value = ThreeToGl.any(this.variableForInput(CONDITION_INPUT_NAME));\n\t\tconst open_if_line = `if(${condition_value}){`;\n\t\tbody_lines.push(open_if_line);\n\n\t\tshaders_collection_controller.addBodyLines(this, body_lines);\n\t}\n}\n","export default \"\\n\\nvec3 __FUNCTION__NAME__(\\n\\tsampler2D texturePosition,\\n\\tvec2 particleUv,\\n\\tvec3 currentPosition,\\n\\t// attract\\n\\tfloat amount,\\n\\tfloat startDist,\\n\\tfloat midDist,\\n\\tfloat endDist\\n\\t){\\n\\n\\tvec3 otherPosition, otherVelocity, dir;\\n\\tfloat distSquared, dist;\\n\\tvec3 attractForce = vec3( 0.0, 0.0, 0.0);\\n\\tint attractorsCount = 0;\\n\\n\\tfloat range0 = abs(midDist - startDist);\\n\\tfloat range1 = abs(endDist - midDist);\\n\\n\\tconst float width = resolution.x;\\n\\tconst float height = resolution.y;\\n\\tfor ( float y = 0.0; y < height; y++ ) {\\n\\t\\tfor ( float x = 0.0; x < width; x++ ) {\\n\\n\\t\\t\\t// ignore if this is self\\n\\t\\t\\tif(x == particleUv.x && y == particleUv.y) continue;\\n\\n\\t\\t\\tvec2 ref = vec2( x + 0.5, y + 0.5 ) / resolution.xy;\\n\\t\\t\\totherPosition = texture2D( texturePosition, ref ).__COMPONENT__;\\n\\n\\t\\t\\tdir = otherPosition - currentPosition;\\n\\t\\t\\tdist = length( dir );\\n\\n\\t\\t\\tif( dist > startDist && dist < midDist ){\\n\\t\\t\\t\\tfloat attractRatio0 = (dist - startDist) / range0;\\n\\t\\t\\t\\tattractForce += amount * attractRatio0 * dir;\\n\\t\\t\\t\\tattractorsCount++;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif( dist > midDist && dist < endDist ){\\n\\t\\t\\t\\t\\tfloat attractRatio1 = (dist - midDist) / range1;\\n\\t\\t\\t\\t\\tattractForce += amount * (1.0-attractRatio1) * dir;\\n\\t\\t\\t\\t\\tattractorsCount++;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tvec3 force = vec3( 0.0, 0.0, 0.0);\\n\\tif(attractorsCount > 0){\\n\\t\\tforce += attractForce / float(attractorsCount);\\n\\t}\\n\\treturn force;\\n\\n}\"","/**\n * NeighbourAttract is used in particles systems to create flocking behaviours\n *\n *\n *\n */\n\nimport Attract from './gl/neighbour/attract.glsl';\nimport {TypedGlNode} from './_Base';\nimport {ThreeToGl} from '../../../../src/core/ThreeToGl';\nimport {ParamConfig, NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {GlConnectionPointType, GlConnectionPoint} from '../utils/io/connections/Gl';\nimport {FunctionGLDefinition} from './utils/GLDefinition';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nimport {GlobalsTextureHandler} from './code/globals/Texture';\n\nconst OUTPUT_NAME = 'force';\n\nclass NeighbourAttractGlParamsConfig extends NodeParamsConfig {\n\tpositionAttribName = ParamConfig.STRING('position');\n\tposition = ParamConfig.VECTOR3([0, 0, 0]);\n\tamount = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\tstartDist = ParamConfig.FLOAT(3, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\tmidDist = ParamConfig.FLOAT(4, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\tendDist = ParamConfig.FLOAT(5, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n}\nconst ParamsConfig = new NeighbourAttractGlParamsConfig();\nexport class NeighbourAttractGlNode extends TypedGlNode<NeighbourAttractGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'neighbourAttract';\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(OUTPUT_NAME, GlConnectionPointType.VEC3),\n\t\t]);\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst bodyLines: string[] = [];\n\n\t\tconst position = ThreeToGl.vector3(this.variableForInputParam(this.p.position));\n\t\tconst amount = ThreeToGl.float(this.variableForInputParam(this.p.amount));\n\t\tconst startDist = ThreeToGl.float(this.variableForInputParam(this.p.startDist));\n\t\tconst midDist = ThreeToGl.float(this.variableForInputParam(this.p.midDist));\n\t\tconst endDist = ThreeToGl.float(this.variableForInputParam(this.p.endDist));\n\n\t\t// TODO:\n\t\t// - ensure that in the for loop the number of particles is known so that we don't look up non existing ones\n\t\tconst out = this.glVarName(OUTPUT_NAME);\n\t\tconst assembler = shadersCollectionController.assembler() as BaseGlShaderAssembler;\n\t\tconst globalsHandler = assembler.globalsHandler();\n\t\tif (!globalsHandler) {\n\t\t\treturn;\n\t\t}\n\t\tif ((globalsHandler as GlobalsTextureHandler).attribTextureData) {\n\t\t\tconst globalsTextureHandler = globalsHandler as GlobalsTextureHandler;\n\t\t\tconst textureData = globalsTextureHandler.attribTextureData(this.pv.positionAttribName);\n\t\t\tif (textureData) {\n\t\t\t\tconst {textureName, component, uvName} = textureData;\n\t\t\t\tconst args = [\n\t\t\t\t\ttextureName,\n\t\t\t\t\tuvName,\n\t\t\t\t\tposition,\n\t\t\t\t\t// attract\n\t\t\t\t\tamount,\n\t\t\t\t\tstartDist,\n\t\t\t\t\tmidDist,\n\t\t\t\t\tendDist,\n\t\t\t\t].join(', ');\n\n\t\t\t\tconst {functionName, functionDeclaration} = this._templateFunctionDefinition(component);\n\t\t\t\tshadersCollectionController.addDefinitions(this, [new FunctionGLDefinition(this, functionDeclaration)]);\n\n\t\t\t\tbodyLines.push(`vec3 ${out} = ${functionName}(${args})`);\n\t\t\t}\n\t\t}\n\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t}\n\n\tprivate _templateFunctionDefinition(component: string) {\n\t\tconst functionName = `${this.type()}${this.graphNodeId()}`;\n\t\tconst functionDeclaration = Attract.replace('__FUNCTION__NAME__', functionName).replace(\n\t\t\t'__COMPONENT__',\n\t\t\tcomponent\n\t\t);\n\t\treturn {\n\t\t\tfunctionName,\n\t\t\tfunctionDeclaration,\n\t\t};\n\t}\n}\n","export default \"const float width = resolution.x;\\nconst float height = resolution.y;\\n\\nvec3 __FUNCTION__NAME__(\\n\\tsampler2D texturePosition,\\n\\tvec2 particleUv,\\n\\tvec3 currentPosition,\\n\\t// repulse\\n\\tbool repulse,\\n\\tfloat repulseAmount,\\n\\tfloat repulseMinDist,\\n\\tfloat repulseMaxDist,\\n\\t// attract\\n\\tbool attract,\\n\\tfloat attractAmount,\\n\\tfloat attractStartDist,\\n\\tfloat attractMidDist,\\n\\tfloat attractEndDist\\n\\t){\\n\\n\\tvec3 otherPosition, dir;\\n\\tfloat distSquared, dist;\\n\\tvec3 repulseForce = vec3( 0.0, 0.0, 0.0);\\n\\tvec3 attractForce = vec3( 0.0, 0.0, 0.0);\\n\\tint repulsorsCount = 0;\\n\\tint attractorsCount = 0;\\n\\n\\tfloat repulseRange = abs(repulseMaxDist - repulseMinDist);\\n\\tfloat attractRange0 = abs(attractMidDist - attractStartDist);\\n\\tfloat attractRange1 = abs(attractEndDist - attractMidDist);\\n\\n\\tfor ( float y = 0.0; y < height; y++ ) {\\n\\t\\tfor ( float x = 0.0; x < width; x++ ) {\\n\\n\\t\\t\\t// ignore if this is self\\n\\t\\t\\tif(x == particleUv.x && y == particleUv.y) continue;\\n\\n\\t\\t\\tvec2 ref = vec2( x + 0.5, y + 0.5 ) / resolution.xy;\\n\\t\\t\\totherPosition = texture2D( texturePosition, ref ).__COMPONENT__;\\n\\n\\t\\t\\tdir = otherPosition - currentPosition;\\n\\t\\t\\tdist = length( dir );\\n\\n\\t\\t\\tif(repulse){\\n\\t\\t\\t\\tif(dist < repulseMaxDist){\\n\\t\\t\\t\\t\\tfloat repulseRatio = (dist - repulseMinDist) / repulseRange;\\n\\t\\t\\t\\t\\trepulseRatio = max(repulseRatio, 0.0);\\n\\t\\t\\t\\t\\trepulseForce += -repulseAmount * (1.0 - repulseRatio) * dir;\\n\\t\\t\\t\\t\\trepulsorsCount++;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif(attract){\\n\\t\\t\\t\\tif( dist > attractStartDist && dist < attractMidDist ){\\n\\t\\t\\t\\t\\tfloat attractRatio0 = (dist - attractStartDist) / attractRange0;\\n\\t\\t\\t\\t\\tattractForce += attractAmount * attractRatio0 * dir;\\n\\t\\t\\t\\t\\tattractorsCount++;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tif( dist > attractMidDist && dist < attractEndDist ){\\n\\t\\t\\t\\t\\t\\tfloat attractRatio1 = (dist - attractMidDist) / attractRange1;\\n\\t\\t\\t\\t\\t\\tattractForce += attractAmount * (1.0-attractRatio1) * dir;\\n\\t\\t\\t\\t\\t\\tattractorsCount++;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tvec3 force = vec3( 0.0, 0.0, 0.0);\\n\\tif(repulsorsCount > 0){\\n\\t\\tforce += repulseForce / float(repulsorsCount);\\n\\t}\\n\\tif(attractorsCount > 0){\\n\\t\\tforce += attractForce / float(attractorsCount);\\n\\t}\\n\\treturn force;\\n\\n}\"","/**\n * NeighbourAttractRepulse is used in particles systems to create flocking behaviours\n *\n *\n *\n */\n\nimport AttractRepulse from './gl/neighbour/attractRepulse.glsl';\nimport {TypedGlNode} from './_Base';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {ParamConfig, NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {GlConnectionPointType, GlConnectionPoint} from '../utils/io/connections/Gl';\nimport {FunctionGLDefinition} from './utils/GLDefinition';\nimport {ParamOptions} from '../../params/utils/OptionsController';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nimport {GlobalsTextureHandler} from './code/globals/Texture';\n\nconst OUTPUT_NAME = 'force';\n\nconst visibleIfRepulse: ParamOptions = {\n\tvisibleIf: {repulse: true},\n};\nconst visibleIfAttract: ParamOptions = {\n\tvisibleIf: {attract: true},\n};\nclass NeighbourAttractRepulseParamsConfig extends NodeParamsConfig {\n\tpositionAttribName = ParamConfig.STRING('position');\n\tposition = ParamConfig.VECTOR3([0, 0, 0]);\n\trepulse = ParamConfig.BOOLEAN(1, {\n\t\tseparatorBefore: true,\n\t});\n\trepulseAmount = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfRepulse,\n\t});\n\trepulseMinDist = ParamConfig.FLOAT(1, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfRepulse,\n\t});\n\trepulseMaxDist = ParamConfig.FLOAT(2, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfRepulse,\n\t});\n\tattract = ParamConfig.BOOLEAN(1, {\n\t\tseparatorBefore: true,\n\t});\n\tattractAmount = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfAttract,\n\t});\n\tattractStartDist = ParamConfig.FLOAT(3, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfAttract,\n\t});\n\tattractMidDist = ParamConfig.FLOAT(4, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfAttract,\n\t});\n\tattractEndDist = ParamConfig.FLOAT(5, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\t...visibleIfAttract,\n\t});\n}\nconst ParamsConfig = new NeighbourAttractRepulseParamsConfig();\nexport class NeighbourAttractRepulseGlNode extends TypedGlNode<NeighbourAttractRepulseParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'neighbourAttractRepulse';\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(OUTPUT_NAME, GlConnectionPointType.VEC3),\n\t\t]);\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst bodyLines: string[] = [];\n\n\t\tconst position = ThreeToGl.vector3(this.variableForInputParam(this.p.position));\n\t\tconst repulse = ThreeToGl.bool(this.variableForInputParam(this.p.repulse));\n\t\tconst repulseAmount = ThreeToGl.float(this.variableForInputParam(this.p.repulseAmount));\n\t\tconst repulseMinDist = ThreeToGl.float(this.variableForInputParam(this.p.repulseMinDist));\n\t\tconst repulseMaxDist = ThreeToGl.float(this.variableForInputParam(this.p.repulseMaxDist));\n\t\tconst attract = ThreeToGl.float(this.variableForInputParam(this.p.attract));\n\t\tconst attractAmount = ThreeToGl.float(this.variableForInputParam(this.p.attractAmount));\n\t\tconst attractStartDist = ThreeToGl.float(this.variableForInputParam(this.p.attractStartDist));\n\t\tconst attractMidDist = ThreeToGl.float(this.variableForInputParam(this.p.attractMidDist));\n\t\tconst attractEndDist = ThreeToGl.float(this.variableForInputParam(this.p.attractEndDist));\n\n\t\t// TODO:\n\t\t// - work out better math so that repulse/attract functions\n\t\t// - link position and vel textures in the function (vel may not yet be needed)\n\t\t// - how could I just have repulse?\n\t\t// - ensure that in the for loop the number of particles is known so that we don't look up non existing ones\n\t\t// - this node should probably be only available in particles\n\t\tconst out = this.glVarName(OUTPUT_NAME);\n\t\tconst assembler = shadersCollectionController.assembler() as BaseGlShaderAssembler;\n\t\tconst globalsHandler = assembler.globalsHandler();\n\t\tif (!globalsHandler) {\n\t\t\treturn;\n\t\t}\n\t\tif ((globalsHandler as GlobalsTextureHandler).attribTextureData) {\n\t\t\tconst globalsTextureHandler = globalsHandler as GlobalsTextureHandler;\n\t\t\tconst textureData = globalsTextureHandler.attribTextureData(this.pv.positionAttribName);\n\t\t\tif (textureData) {\n\t\t\t\tconst {textureName, component, uvName} = textureData;\n\t\t\t\tconst args = [\n\t\t\t\t\ttextureName,\n\t\t\t\t\tuvName,\n\t\t\t\t\tposition,\n\t\t\t\t\t// repulse\n\t\t\t\t\trepulse,\n\t\t\t\t\trepulseAmount,\n\t\t\t\t\trepulseMinDist,\n\t\t\t\t\trepulseMaxDist,\n\t\t\t\t\t// attract\n\t\t\t\t\tattract,\n\t\t\t\t\tattractAmount,\n\t\t\t\t\tattractStartDist,\n\t\t\t\t\tattractMidDist,\n\t\t\t\t\tattractEndDist,\n\t\t\t\t].join(', ');\n\n\t\t\t\tconst {functionName, functionDeclaration} = this._templateFlocking(component, );\n\t\t\t\tshadersCollectionController.addDefinitions(this, [new FunctionGLDefinition(this, functionDeclaration)]);\n\n\t\t\t\tbodyLines.push(`vec3 ${out} = ${functionName}(${args})`);\n\t\t\t}\n\t\t}\n\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t}\n\n\tprivate _templateFlocking(component: string) {\n\t\tconst functionName = `flocking${this.graphNodeId()}`;\n\t\tconst functionDeclaration = AttractRepulse.replace('__FUNCTION__NAME__', functionName).replace(\n\t\t\t'__COMPONENT__',\n\t\t\tcomponent\n\t\t);\n\t\treturn {\n\t\t\tfunctionName,\n\t\t\tfunctionDeclaration,\n\t\t};\n\t}\n}\n","export default \"\\nvec3 __FUNCTION__NAME__(\\n\\tsampler2D texturePosition,\\n\\tvec2 particleUv,\\n\\tvec3 currentPosition,\\n\\t// repulse\\n\\tfloat amount,\\n\\tfloat minDist,\\n\\tfloat maxDist\\n\\t){\\n\\n\\tvec3 otherPosition, otherVelocity, dir;\\n\\tfloat distSquared, dist;\\n\\tvec3 repulseForce = vec3( 0.0, 0.0, 0.0 );\\n\\tint repulsorsCount = 0;\\n\\n\\tfloat range = abs(maxDist - minDist);\\n\\n\\tconst float width = resolution.x;\\n\\tconst float height = resolution.y;\\n\\tfor ( float y = 0.0; y < height; y++ ) {\\n\\t\\tfor ( float x = 0.0; x < width; x++ ) {\\n\\n\\t\\t\\t// ignore if this is self\\n\\t\\t\\tif(x == particleUv.x && y == particleUv.y) continue;\\n\\n\\t\\t\\tvec2 ref = vec2( x + 0.5, y + 0.5 ) / resolution.xy;\\n\\t\\t\\totherPosition = texture2D( texturePosition, ref ).__COMPONENT__;\\n\\n\\t\\t\\tdir = otherPosition - currentPosition;\\n\\t\\t\\tdist = length( dir );\\n\\n\\t\\t\\t// if the distance is too small, ignore this point\\n\\t\\t\\tif (dist < 0.0001) continue;\\n\\n\\t\\t\\tif(dist < maxDist){\\n\\t\\t\\t\\tfloat ratio = (dist - minDist) / range;\\n\\t\\t\\t\\tratio = max(ratio, 0.0);\\n\\t\\t\\t\\trepulseForce += -amount * (1.0 - ratio) * dir;\\n\\t\\t\\t\\trepulsorsCount++;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tvec3 force = vec3( 0.0, 0.0, 0.0);\\n\\tif(repulsorsCount > 0){\\n\\t\\tforce += repulseForce / float(repulsorsCount);\\n\\t}\\n\\treturn force;\\n\\n}\"","/**\n * NeighbourRepulse is used in particles systems to create flocking behaviours\n *\n *\n *\n */\n\nimport Repulse from './gl/neighbour/repulse.glsl';\nimport {TypedGlNode} from './_Base';\nimport {ThreeToGl} from '../../../../src/core/ThreeToGl';\nimport {ParamConfig, NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {GlConnectionPointType, GlConnectionPoint} from '../utils/io/connections/Gl';\nimport {FunctionGLDefinition} from './utils/GLDefinition';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nimport {GlobalsTextureHandler} from './code/globals/Texture';\n\nconst OUTPUT_NAME = 'force';\n\nclass NeighbourRepulseGlParamsConfig extends NodeParamsConfig {\n\tpositionAttribName = ParamConfig.STRING('position');\n\tposition = ParamConfig.VECTOR3([0, 0, 0]);\n\tamount = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\tminDist = ParamConfig.FLOAT(1, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\tmaxDist = ParamConfig.FLOAT(2, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n}\nconst ParamsConfig = new NeighbourRepulseGlParamsConfig();\nexport class NeighbourRepulseGlNode extends TypedGlNode<NeighbourRepulseGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'neighbourRepulse';\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(OUTPUT_NAME, GlConnectionPointType.VEC3),\n\t\t]);\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst bodyLines: string[] = [];\n\n\t\tconst position = ThreeToGl.vector3(this.variableForInputParam(this.p.position));\n\t\tconst amount = ThreeToGl.float(this.variableForInputParam(this.p.amount));\n\t\tconst minDist = ThreeToGl.float(this.variableForInputParam(this.p.minDist));\n\t\tconst maxDist = ThreeToGl.float(this.variableForInputParam(this.p.maxDist));\n\n\t\t// TODO:\n\t\t// - ensure that in the for loop the number of particles is known so that we don't look up non existing ones\n\t\tconst out = this.glVarName(OUTPUT_NAME);\n\t\tconst assembler = shadersCollectionController.assembler() as BaseGlShaderAssembler;\n\t\tconst globalsHandler = assembler.globalsHandler();\n\t\tif (!globalsHandler) {\n\t\t\treturn;\n\t\t}\n\t\tif ((globalsHandler as GlobalsTextureHandler).attribTextureData) {\n\t\t\tconst globalsTextureHandler = globalsHandler as GlobalsTextureHandler;\n\t\t\tconst textureData = globalsTextureHandler.attribTextureData(this.pv.positionAttribName);\n\t\t\tif (textureData) {\n\t\t\t\tconst {textureName, component, uvName} = textureData;\n\t\t\t\tconst args = [\n\t\t\t\t\ttextureName,\n\t\t\t\t\tuvName,\n\t\t\t\t\tposition,\n\t\t\t\t\t// repulse\n\t\t\t\t\tamount,\n\t\t\t\t\tminDist,\n\t\t\t\t\tmaxDist,\n\t\t\t\t].join(', ');\n\n\t\t\t\tconst {functionName, functionDeclaration} = this._templateFunctionDefinition(component);\n\t\t\t\tshadersCollectionController.addDefinitions(this, [new FunctionGLDefinition(this, functionDeclaration)]);\n\n\t\t\t\tbodyLines.push(`vec3 ${out} = ${functionName}(${args})`);\n\t\t\t}\n\t\t}\n\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t}\n\n\tprivate _templateFunctionDefinition(component: string) {\n\t\tconst functionName = `${this.type()}${this.graphNodeId()}`;\n\t\tconst functionDeclaration = Repulse.replace('__FUNCTION__NAME__', functionName).replace(\n\t\t\t'__COMPONENT__',\n\t\t\tcomponent\n\t\t);\n\t\treturn {\n\t\t\tfunctionName,\n\t\t\tfunctionDeclaration,\n\t\t};\n\t}\n}\n","/**\n * Allows to set the result of the shader\n *\n *\n */\nimport {GlType} from './../../poly/registers/nodes/types/Gl';\nimport {TypedGlNode} from './_Base';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nclass OutputGlParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new OutputGlParamsConfig();\n\nexport class OutputGlNode extends TypedGlNode<OutputGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn GlType.OUTPUT;\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\n\t\tthis.lifecycle.onAfterAdded(() => {\n\t\t\tthis.materialNode()?.assemblerController()?.add_output_inputs(this);\n\t\t\tthis._setMatToRecompile();\n\t\t});\n\t}\n\n\toverride setLines(shaders_collection_controller: ShadersCollectionController) {\n\t\t// if (shaders_collection_controller.shader_name) {\n\t\tconst assembler = shaders_collection_controller.assembler() as BaseGlShaderAssembler;\n\t\tassembler.set_node_lines_output(this, shaders_collection_controller);\n\t\t// }\n\t}\n\n\t// set_color_declaration(color_declaration: string){\n\t// \tthis._color_declaration = color_declaration\n\t// }\n}\n","/**\n * Allows to create a uniform which can be modified from the material params panel\n *\n *\n */\nimport {GlType} from './../../poly/registers/nodes/types/Gl';\nimport {TypedGlNode} from './_Base';\nimport {\n\tGL_CONNECTION_POINT_TYPES,\n\tGlConnectionPointType,\n\tGlConnectionPointInitValueMap,\n\tGlConnectionPointTypeToParamTypeMap,\n} from '../utils/io/connections/Gl';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {ParamType} from '../../poly/ParamType';\nimport {UniformGLDefinition} from './utils/GLDefinition';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {GlParamConfig} from './code/utils/GLParamConfig';\nimport {isArray} from '../../../core/Type';\nimport {UNIFORM_PARAM_PREFIX} from '../../../core/material/uniform';\n\nclass ParamGlParamsConfig extends NodeParamsConfig {\n\tname = ParamConfig.STRING('param1');\n\ttype = ParamConfig.INTEGER(GL_CONNECTION_POINT_TYPES.indexOf(GlConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: GL_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n\tasColor = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {type: GL_CONNECTION_POINT_TYPES.indexOf(GlConnectionPointType.VEC3)},\n\t});\n}\nconst ParamsConfig = new ParamGlParamsConfig();\n\nexport class ParamGlNode extends TypedGlNode<ParamGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<GlType.PARAM> {\n\t\treturn GlType.PARAM;\n\t}\n\t// protected _allow_inputs_created_from_params: boolean = false;\n\toverride initializeNode() {\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onAfterAdded(this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onBeforeDeleted(this._setMatToRecompile.bind(this));\n\t\tthis.io.connection_points.initializeNode();\n\n\t\tthis.io.connection_points.set_expected_input_types_function(() => []);\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [GL_CONNECTION_POINT_TYPES[this.pv.type]]);\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst glType = GL_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tconst uniformName = this.uniformName();\n\t\tconst namedOutputConnectionPoints = this.io.outputs.namedOutputConnectionPoints();\n\t\tif (!namedOutputConnectionPoints) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst output_connection_point = namedOutputConnectionPoints[0];\n\t\tif (output_connection_point) {\n\t\t\t// a body is needed for each node,\n\t\t\t// otherwise, if there are 2 params referencing the same uniform\n\t\t\t// that creates conflicts\n\t\t\tconst output_name = output_connection_point.name();\n\t\t\tconst out = this.glVarName(output_name);\n\n\t\t\tconst bodyLine = `${glType} ${out} = ${uniformName}`;\n\t\t\tshadersCollectionController.addBodyLines(this, [bodyLine]);\n\t\t}\n\n\t\tconst definition = new UniformGLDefinition(this, glType, uniformName);\n\t\tshadersCollectionController.addDefinitions(this, [definition]);\n\t}\n\toverride paramsGenerating() {\n\t\treturn true;\n\t}\n\toverride setParamConfigs() {\n\t\tconst gl_type = GL_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tconst default_value = GlConnectionPointInitValueMap[gl_type];\n\t\tlet param_type = GlConnectionPointTypeToParamTypeMap[gl_type];\n\n\t\tthis._param_configs_controller = this._param_configs_controller || new ParamConfigsController();\n\t\tthis._param_configs_controller.reset();\n\n\t\tif (\n\t\t\tparam_type == ParamType.VECTOR3 &&\n\t\t\tthis.p.asColor.value &&\n\t\t\tisArray(default_value) &&\n\t\t\tdefault_value.length == 3\n\t\t) {\n\t\t\tconst param_config = new GlParamConfig(ParamType.COLOR, this.pv.name, default_value, this.uniformName());\n\t\t\tthis._param_configs_controller.push(param_config);\n\t\t} else {\n\t\t\tconst param_config = new GlParamConfig(param_type, this.pv.name, default_value, this.uniformName());\n\t\t\tthis._param_configs_controller.push(param_config);\n\t\t}\n\t}\n\t// override glVarName(name?: string) {\n\t// \tif (name) {\n\t// \t\treturn super.glVarName(name);\n\t// \t}\n\t// \treturn `v_POLY_param_${this.pv.name}`;\n\t// }\n\tuniformName() {\n\t\treturn `${UNIFORM_PARAM_PREFIX}${this.pv.name}`;\n\t\t// const output_connection_point = this.io.outputs.namedOutputConnectionPoints()[0];\n\t\t// const var_name = this.glVarName(/*output_connection_point.name()*/);\n\t\t// return var_name;\n\t}\n\tsetGlType(type: GlConnectionPointType) {\n\t\tconst index = GL_CONNECTION_POINT_TYPES.indexOf(type);\n\t\tthis.p.type.set(index);\n\t}\n\tglType() {\n\t\treturn GL_CONNECTION_POINT_TYPES[this.pv.type];\n\t}\n}\n","/**\n * generates a ramp as a spare parameter, which can then be used to interpolate an input value.\n *\n *\n *\n */\n\nimport {TypedGlNode} from './_Base';\nimport {GlConnectionPoint, GlConnectionPointType} from '../utils/io/connections/Gl';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {UniformGLDefinition} from './utils/GLDefinition';\nimport {RampParam} from '../../params/Ramp';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {ParamType} from '../../poly/ParamType';\n\nconst OUTPUT_NAME = 'val';\n\nimport {GlParamConfig} from './code/utils/GLParamConfig';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport { GlType } from '../../poly/registers/nodes/types/Gl';\nclass RampGlParamsConfig extends NodeParamsConfig {\n\tname = ParamConfig.STRING('ramp1');\n\tinput = ParamConfig.FLOAT(0);\n}\nconst ParamsConfig = new RampGlParamsConfig();\nexport class RampGlNode extends TypedGlNode<RampGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<GlType.RAMP> {\n\t\treturn GlType.RAMP;\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onAfterAdded(this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onBeforeDeleted(this._setMatToRecompile.bind(this));\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(OUTPUT_NAME, GlConnectionPointType.FLOAT),\n\t\t]);\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\t// const tmpTextureGlType = GlConnectionPointType.VEC3;\n\t\t// const tmpTexureVarName = super.glVarName('tmpTexureVarName');\n\t\tconst glType = GlConnectionPointType.FLOAT;\n\t\tconst texture_name = this.uniformName();\n\t\tconst varName = super.glVarName(OUTPUT_NAME);\n\n\t\tconst definition = new UniformGLDefinition(this, GlConnectionPointType.SAMPLER_2D, texture_name);\n\t\tshadersCollectionController.addDefinitions(this, [definition]);\n\n\t\tconst inputVal = this.variableForInputParam(this.p.input);\n\t\t// const bodyLines = [\n\t\t// \t`${tmpTextureGlType} ${tmpTexureVarName} = texture2D(${this.uniformName()}, vec2(${inputVal}, 0.0)).xyz`,\n\t\t// \t`${glType} ${varName} = -1.0 + ${tmpTexureVarName}.x + ${tmpTexureVarName}.y + ${tmpTexureVarName}.z`,\n\t\t// ];\n\t\tconst bodyLines = [`${glType} ${varName} = texture2D(${this.uniformName()}, vec2(${inputVal}, 0.0)).x`];\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t}\n\toverride paramsGenerating() {\n\t\treturn true;\n\t}\n\toverride setParamConfigs() {\n\t\tthis._param_configs_controller = this._param_configs_controller || new ParamConfigsController();\n\t\tthis._param_configs_controller.reset();\n\t\tconst param_config = new GlParamConfig(\n\t\t\tParamType.RAMP,\n\t\t\tthis.pv.name,\n\t\t\tRampParam.DEFAULT_VALUE,\n\t\t\tthis.uniformName()\n\t\t);\n\t\tthis._param_configs_controller.push(param_config);\n\t}\n\t// override glVarName(name?: string): string {\n\t// \tif (name) {\n\t// \t\treturn super.glVarName(name);\n\t// \t}\n\t// \treturn `v_POLY_ramp_${this.pv.name}`;\n\t// }\n\tuniformName() {\n\t\treturn `v_POLY_ramp_${this.pv.name}`;\n\t}\n}\n","export default \"\\nstruct EnvMapProps {\\n\\tvec3 tint;\\n\\tfloat intensity;\\n\\tfloat roughness;\\n\\tfloat fresnel;\\n\\tfloat fresnelPower;\\n};\\nuniform sampler2D envMap;\\nuniform float envMapIntensity;\\nuniform float roughness;\\n#ifdef ROTATE_ENV_MAP_Y\\n\\tuniform float envMapRotationY;\\n#endif\\nvec3 envMapSample(vec3 rayDir, float envMapRoughness){\\n\\t// http://www.pocketgl.com/reflections/\\n\\tvec3 env = vec3(0.);\\n\\t// vec2 uv = vec2( atan( -rayDir.z, -rayDir.x ) * RECIPROCAL_PI2 + 0.5, rayDir.y * 0.5 + 0.5 );\\n\\t// vec3 env = texture2D(map, uv).rgb;\\n\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t#ifdef ROTATE_ENV_MAP_Y\\n\\t\\t\\trayDir = rotateWithAxisAngle(rayDir, vec3(0.,1.,0.), envMapRotationY);\\n\\t\\t#endif\\n\\t\\tenv = textureCubeUV(envMap, rayDir, envMapRoughness * roughness).rgb;\\n\\t#endif\\n\\treturn env;\\n}\\nvec3 envMapSampleWithFresnel(vec3 rayDir, EnvMapProps envMapProps, vec3 n, vec3 cameraPosition){\\n\\t// http://www.pocketgl.com/reflections/\\n\\tvec3 env = envMapSample(rayDir, envMapProps.roughness);\\n\\tfloat fresnel = pow(1.-dot(normalize(cameraPosition), n), envMapProps.fresnelPower);\\n\\tfloat fresnelFactor = (1.-envMapProps.fresnel) + envMapProps.fresnel*fresnel;\\n\\treturn env * envMapIntensity * envMapProps.tint * envMapProps.intensity * fresnelFactor;\\n}\"","export default \"vec3 rayDir = normalize(reflect(rayDir, n));\\nEnvMapProps envMapProps;\\nenvMapProps.tint = __envMapTint__;\\nenvMapProps.intensity = __envMapIntensity__;\\nenvMapProps.roughness = __envMapRoughness__;\\nenvMapProps.fresnel = __envMapFresnel__;\\nenvMapProps.fresnelPower = __envMapFresnelPower__;\\ncol += envMapSampleWithFresnel(rayDir, envMapProps, n, cameraPosition);\"","export default \"// --- REFLECTION - START\\nvec3 reflectedColor = GetReflection(p, n, rayDir, __reflectionBiasMult__, __envMapRoughness__, __reflectionDepth__, sdfContext);\\ncol += reflectedColor * __reflectionTint__ * __reflectivity__;\\n// --- REFLECTION - END\"","/**\n * Creates an SDF material\n *\n */\nimport {NodeContext} from './../../poly/NodeContext';\nimport {GlType} from './../../poly/registers/nodes/types/Gl';\nimport {ParamConfig} from './../utils/params/ParamsConfig';\nimport {FunctionGLDefinition, BaseGLDefinition} from './utils/GLDefinition';\nimport {TypedGlNode} from './_Base';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {GlConnectionPoint, GlConnectionPointType} from '../utils/io/connections/Gl';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport SDF_ENV_MAP_SAMPLE from './gl/raymarching/sdfEnvMapSample.glsl';\nimport SDF_ENV_MAP from './gl/raymarching/sdfEnvMap.glsl';\nimport SDF_REFLECTION from './gl/raymarching/sdfReflection.glsl';\nimport Quaternion from './gl/quaternion.glsl';\n\nclass BodyLine {\n\tconstructor(private _content: string) {}\n\tcontent() {\n\t\treturn this._content;\n\t}\n\tlines() {\n\t\treturn this._content.split('\\n');\n\t}\n\treplaceVars(vars: PolyDictionary<string>) {\n\t\tconst varNames = Object.keys(vars);\n\t\tfor (let varName of varNames) {\n\t\t\tthis._replaceVar(varName, vars[varName]);\n\t\t}\n\t}\n\taddTabs(tabsCount: number) {\n\t\tconst lines = this._content.split('\\n');\n\t\tconst newLines: string[] = [];\n\t\tfor (let line of lines) {\n\t\t\tconst prefix = '\\t'.repeat(tabsCount);\n\t\t\tnewLines.push(`${prefix}${line}`);\n\t\t}\n\t\tthis._content = newLines.join('\\n');\n\t}\n\tprivate _replaceVar(varName: string, replacement: string) {\n\t\tconst regex = new RegExp(`__${varName}__`, 'g');\n\t\tthis._content = this._content.replace(regex, replacement);\n\t}\n}\n\nconst OUTPUT_NAME = GlType.SDF_MATERIAL;\nclass SDFMaterialGlParamsConfig extends NodeParamsConfig {\n\t// globals\n\tglobals = ParamConfig.FOLDER();\n\tcolor = ParamConfig.COLOR([1, 1, 1]);\n\tuseEnvMap = ParamConfig.BOOLEAN(0);\n\tuseReflection = ParamConfig.BOOLEAN(0);\n\tuseRefraction = ParamConfig.BOOLEAN(0);\n\t// lighting\n\tlighting = ParamConfig.FOLDER();\n\tuseLights = ParamConfig.BOOLEAN(1);\n\tdiffuse = ParamConfig.COLOR([1, 1, 1], {\n\t\tvisibleIf: {useLights: 1},\n\t});\n\temissive = ParamConfig.COLOR([0, 0, 0]);\n\t// envMap\n\tenvMap = ParamConfig.FOLDER();\n\tenvMapTint = ParamConfig.COLOR([1, 1, 1], {\n\t\tvisibleIf: {useEnvMap: 1},\n\t});\n\tenvMapIntensity = ParamConfig.FLOAT(1, {\n\t\tvisibleIf: {useEnvMap: 1},\n\t});\n\tenvMapRoughness = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {useEnvMap: 1},\n\t});\n\tenvMapFresnel = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {useEnvMap: 1},\n\t});\n\tenvMapFresnelPower = ParamConfig.FLOAT(5, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\tvisibleIf: {useEnvMap: 1},\n\t});\n\t// reflection\n\treflection = ParamConfig.FOLDER();\n\treflectionTint = ParamConfig.COLOR([1, 1, 1], {\n\t\tvisibleIf: {useReflection: 1},\n\t});\n\treflectionDepth = ParamConfig.INTEGER(3, {\n\t\tvisibleIf: {useReflection: 1},\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\treflectivity = ParamConfig.FLOAT(0.5, {\n\t\tvisibleIf: {useReflection: 1},\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\treflectionBiasMult = ParamConfig.FLOAT(2, {\n\t\tvisibleIf: {useReflection: 1},\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\t// refraction\n\trefraction = ParamConfig.FOLDER();\n\trefractionTint = ParamConfig.COLOR([1, 1, 1], {\n\t\tvisibleIf: {useRefraction: 1},\n\t});\n\tior = ParamConfig.FLOAT(1.45, {\n\t\tvisibleIf: {useRefraction: 1},\n\t\trange: [0, 2],\n\t\trangeLocked: [true, false],\n\t});\n\tsplitRGB = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {useRefraction: 1},\n\t});\n\tiorOffset = ParamConfig.VECTOR3([-0.01, 0, 0.01], {\n\t\tvisibleIf: {useRefraction: 1, splitRGB: 1},\n\t});\n\ttransmission = ParamConfig.FLOAT(0.5, {\n\t\tvisibleIf: {useRefraction: 1},\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\tabsorption = ParamConfig.FLOAT(0.5, {\n\t\tvisibleIf: {useRefraction: 1},\n\t\trange: [0, 5],\n\t\trangeLocked: [false, false],\n\t});\n\trefractionDepth = ParamConfig.INTEGER(3, {\n\t\tvisibleIf: {useRefraction: 1},\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t\tseparatorBefore: true,\n\t});\n\trefractionMaxDist = ParamConfig.FLOAT(100, {\n\t\tvisibleIf: {useRefraction: 1},\n\t\trange: [0, 100],\n\t\trangeLocked: [true, false],\n\t\tstep: 0.0001,\n\t});\n\trefractionBiasMult = ParamConfig.FLOAT(2, {\n\t\tvisibleIf: {useRefraction: 1},\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\tsampleEnvMapOnLastRefractionRay = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {useRefraction: 1},\n\t});\n\trefractionStartOutsideMedium = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {useRefraction: 1},\n\t});\n}\nconst ParamsConfig = new SDFMaterialGlParamsConfig();\nexport class SDFMaterialGlNode extends TypedGlNode<SDFMaterialGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn GlType.SDF_MATERIAL;\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames([\n\t\t\t'useLights',\n\t\t\t'useEnvMap',\n\t\t\t'useReflection',\n\t\t\t'reflectionDepth',\n\t\t\t'useRefraction',\n\t\t\t'refractionDepth',\n\t\t\t'splitRGB',\n\t\t\t'sampleEnvMapOnLastRefractionRay',\n\t\t\t'refractionStartOutsideMedium',\n\t\t]);\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(OUTPUT_NAME, GlConnectionPointType.SDF_MATERIAL),\n\t\t]);\n\t}\n\n\tmaterialIdName(): string {\n\t\treturn this.path().replace(/\\//g, '_').toUpperCase();\n\t}\n\tprivate _materialId(): number {\n\t\tconst parentMatNode = this.parentController.firstAncestorWithContext(NodeContext.MAT);\n\t\tif (!parentMatNode) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (!parentMatNode.childrenController) {\n\t\t\treturn 0;\n\t\t}\n\t\tlet i = 0;\n\t\tlet matId = 0;\n\t\tparentMatNode.childrenController.traverseChildren((childNode) => {\n\t\t\tif (childNode.context() == NodeContext.GL && childNode.type() == SDFMaterialGlNode.type()) {\n\t\t\t\ti++;\n\t\t\t\tif (childNode.graphNodeId() == this.graphNodeId()) {\n\t\t\t\t\tmatId = i;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn matId;\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst matId = this._materialId();\n\t\tconst matIdName = this.materialIdName();\n\t\tconst definitions: BaseGLDefinition[] = [];\n\t\tconst useEnvMap = isBooleanTrue(this.pv.useEnvMap);\n\t\tconst useReflection = isBooleanTrue(this.pv.useReflection);\n\t\tconst useRefraction = isBooleanTrue(this.pv.useRefraction);\n\t\tconst envMapRoughness = ThreeToGl.float(this.variableForInputParam(this.p.envMapRoughness));\n\n\t\tconst defineDeclaration = `const int ${matIdName} = ${matId};`;\n\t\tdefinitions.push(new FunctionGLDefinition(this, defineDeclaration));\n\t\tdefinitions.push(new FunctionGLDefinition(this, Quaternion));\n\t\tdefinitions.push(new FunctionGLDefinition(this, SDF_ENV_MAP_SAMPLE));\n\n\t\tconst color = ThreeToGl.vector3(this.variableForInputParam(this.p.color));\n\t\tconst diffuse = ThreeToGl.vector3(this.variableForInputParam(this.p.diffuse));\n\t\tconst emissive = ThreeToGl.vector3(this.variableForInputParam(this.p.emissive));\n\n\t\tconst bodyLines: string[] = [`if(mat == ${matIdName}){`];\n\t\tbodyLines.push(`\tcol = vec3(0., 0., 0.);`);\n\n\t\t/**\n\t\t *\n\t\t * LIGHTS\n\t\t *\n\t\t */\n\t\tconst useLights = isBooleanTrue(this.pv.useLights);\n\t\tif (useLights) {\n\t\t\tbodyLines.push(`\tvec3 diffuse = ${color} * ${diffuse} * GetLight(p, n, sdfContext);`);\n\t\t\tbodyLines.push(`\tcol += diffuse;`);\n\t\t}\n\t\tbodyLines.push(`\tcol += ${emissive};`);\n\n\t\t/**\n\t\t *\n\t\t * ENV MAP\n\t\t *\n\t\t */\n\n\t\tif (useEnvMap) {\n\t\t\tconst envMapTint = ThreeToGl.vector3(this.variableForInputParam(this.p.envMapTint));\n\t\t\tconst envMapIntensity = ThreeToGl.float(this.variableForInputParam(this.p.envMapIntensity));\n\t\t\tconst envMapFresnel = ThreeToGl.float(this.variableForInputParam(this.p.envMapFresnel));\n\t\t\tconst envMapFresnelPower = ThreeToGl.float(this.variableForInputParam(this.p.envMapFresnelPower));\n\n\t\t\tconst lineEnvMap = new BodyLine(SDF_ENV_MAP);\n\t\t\tlineEnvMap.replaceVars({\n\t\t\t\tenvMapTint,\n\t\t\t\tenvMapIntensity,\n\t\t\t\tenvMapRoughness,\n\t\t\t\tenvMapFresnel,\n\t\t\t\tenvMapFresnelPower,\n\t\t\t});\n\t\t\tlineEnvMap.addTabs(1);\n\t\t\tbodyLines.push(...lineEnvMap.lines());\n\t\t}\n\t\t/**\n\t\t *\n\t\t * REFLECTION\n\t\t *\n\t\t */\n\n\t\tif (useReflection) {\n\t\t\tconst reflectionDepth = `${this.pv.reflectionDepth}`;\n\t\t\tconst reflectionTint = ThreeToGl.vector3(this.variableForInputParam(this.p.reflectionTint));\n\t\t\tconst reflectivity = ThreeToGl.float(this.variableForInputParam(this.p.reflectivity));\n\t\t\tconst reflectionBiasMult = ThreeToGl.float(this.variableForInputParam(this.p.reflectionBiasMult));\n\t\t\tconst lineReflection = new BodyLine(SDF_REFLECTION);\n\t\t\tlineReflection.replaceVars({\n\t\t\t\treflectionTint,\n\t\t\t\treflectionDepth,\n\t\t\t\treflectivity,\n\t\t\t\treflectionBiasMult,\n\t\t\t\tenvMapRoughness,\n\t\t\t});\n\t\t\tlineReflection.addTabs(1);\n\t\t\tbodyLines.push(...lineReflection.lines());\n\t\t\tdefinitions.push(new FunctionGLDefinition(this, '#define RAYMARCHED_REFLECTIONS 1'));\n\t\t}\n\t\t/**\n\t\t *\n\t\t * REFRACTION\n\t\t *\n\t\t */\n\n\t\tif (useRefraction) {\n\t\t\tconst refractionTint = ThreeToGl.vector3(this.variableForInputParam(this.p.refractionTint));\n\t\t\tconst refractionDepth = this.pv.refractionDepth;\n\t\t\tconst ior = ThreeToGl.float(this.variableForInputParam(this.p.ior));\n\t\t\tconst transmission = ThreeToGl.float(this.variableForInputParam(this.p.transmission));\n\t\t\tconst absorption = ThreeToGl.float(this.variableForInputParam(this.p.absorption));\n\t\t\tconst refractionBiasMult = ThreeToGl.float(this.variableForInputParam(this.p.refractionBiasMult));\n\t\t\tconst refractionMaxDist = ThreeToGl.float(this.variableForInputParam(this.p.refractionMaxDist));\n\t\t\tconst splitRGB = isBooleanTrue(this.pv.splitRGB);\n\t\t\tconst iorOffset = ThreeToGl.vector3(this.variableForInputParam(this.p.iorOffset));\n\n\t\t\tbodyLines.push(`\n\t\t// --- REFRACTION - START\n\t\tvec3 refractedColor = vec3(0.);\n\t\tfloat ior = ${ior};\n\t\tfloat biasMult = ${refractionBiasMult};\n\t\tvec3 baseValue = ${color};\n\t\tvec3 tint = ${refractionTint};\n\t\tfloat absorption = ${absorption};\n\t\t\t`);\n\t\t\tif (splitRGB) {\n\t\t\t\tbodyLines.push(`\n\t\tvec3 offset = ${iorOffset};\n\t\tvec4 refractedDataR = GetRefractedData(p, n, rayDir, ior+offset.x, biasMult, ${envMapRoughness}, ${refractionMaxDist}, ${refractionDepth}, sdfContext);\n\t\tvec4 refractedDataG = GetRefractedData(p, n, rayDir, ior+offset.y, biasMult, ${envMapRoughness}, ${refractionMaxDist}, ${refractionDepth}, sdfContext);\n\t\tvec4 refractedDataB = GetRefractedData(p, n, rayDir, ior+offset.z, biasMult, ${envMapRoughness}, ${refractionMaxDist}, ${refractionDepth}, sdfContext);\n\t\trefractedColor.r = applyRefractionAbsorption(refractedDataR.r, baseValue.r, tint.r, refractedDataR.w, absorption);\n\t\trefractedColor.g = applyRefractionAbsorption(refractedDataG.g, baseValue.g, tint.g, refractedDataG.w, absorption);\n\t\trefractedColor.b = applyRefractionAbsorption(refractedDataB.b, baseValue.b, tint.b, refractedDataB.w, absorption);\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tbodyLines.push(`\n\t\tvec4 refractedData = GetRefractedData(p, n, rayDir, ior, biasMult, ${envMapRoughness}, ${refractionMaxDist}, ${refractionDepth}, sdfContext);\n\t\trefractedColor = applyRefractionAbsorption(refractedData.rgb, baseValue, tint, refractedData.w, absorption);\n\t\t\t\t`);\n\t\t\t}\n\t\t\tbodyLines.push(`\n\t\tcol += refractedColor * ${transmission};\n\t\t// --- REFRACTION - END\n\t`);\n\t\t\tdefinitions.push(new FunctionGLDefinition(this, '#define RAYMARCHED_REFRACTIONS 1'));\n\t\t\tif (isBooleanTrue(this.pv.sampleEnvMapOnLastRefractionRay)) {\n\t\t\t\tdefinitions.push(\n\t\t\t\t\tnew FunctionGLDefinition(this, '#define RAYMARCHED_REFRACTIONS_SAMPLE_ENV_MAP_ON_LAST 1')\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (isBooleanTrue(this.pv.refractionStartOutsideMedium)) {\n\t\t\t\tdefinitions.push(\n\t\t\t\t\tnew FunctionGLDefinition(this, '#define RAYMARCHED_REFRACTIONS_START_OUTSIDE_MEDIUM 1')\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tbodyLines.push(`}`);\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t\tshadersCollectionController.addDefinitions(this, definitions);\n\t}\n}\n","/**\n * a subnet can contain many nodes and is very useful to organise your shaders\n *\n *\n *\n */\nimport {GlType} from './../../poly/registers/nodes/types/Gl';\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {TypedGlNode, BaseGlNodeType} from './_Base';\nimport {GlConnectionPointType, GL_CONNECTION_POINT_TYPES} from '../utils/io/connections/Gl';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {NetworkChildNodeType, NetworkNodeType, NodeContext} from '../../poly/NodeContext';\nimport {GlNodeChildrenMap} from '../../poly/registers/nodes/Gl';\nimport {SubnetOutputGlNode} from './SubnetOutput';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {SubnetInputGlNode} from './SubnetInput';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {rangeStartEnd} from '../../../core/ArrayUtils';\nimport {IntegerParam} from '../../params/Integer';\nimport {StringParam} from '../../params/String';\nimport {TypedNodeTraverser} from '../utils/shaders/NodeTraverser';\nimport {CodeBuilder} from './code/utils/CodeBuilder';\nimport {LineType} from './code/utils/LineType';\nimport {BaseGLDefinition, FunctionGLDefinition} from './utils/GLDefinition';\nimport {CodeFormatter} from './code/utils/CodeFormatter';\nimport {ShaderName} from '../utils/shaders/ShaderName';\nimport {AddBodyLinesOptions} from './code/utils/LinesController';\n\nexport const ADD_BODY_LINES_OPTIONS: AddBodyLinesOptions = {\n\tmakeUniq: false,\n};\n\nfunction visibleIfInputsCountAtLeast(index: number) {\n\treturn {\n\t\tvisibleIf: rangeStartEnd(index + 1, 10).map((i) => ({inputsCount: i})),\n\t};\n}\n\nfunction inputTypeParam(index: number) {\n\treturn ParamConfig.INTEGER(GL_CONNECTION_POINT_TYPES.indexOf(GlConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: GL_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t\tseparatorBefore: true,\n\t\t...visibleIfInputsCountAtLeast(index),\n\t});\n}\n\nfunction inputNameParam(index: number) {\n\treturn ParamConfig.STRING(`input${index}`, {\n\t\t...visibleIfInputsCountAtLeast(index),\n\t});\n}\n\nexport function TypedSubnetGlParamsConfigMixin<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tinputs = ParamConfig.FOLDER();\n\t\tinputsCount = ParamConfig.INTEGER(1, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t\tinputType0 = inputTypeParam(0);\n\t\tinputName0 = inputNameParam(0);\n\t\tinputType1 = inputTypeParam(1);\n\t\tinputName1 = inputNameParam(1);\n\t\tinputType2 = inputTypeParam(2);\n\t\tinputName2 = inputNameParam(2);\n\t\tinputType3 = inputTypeParam(3);\n\t\tinputName3 = inputNameParam(3);\n\t\tinputType4 = inputTypeParam(4);\n\t\tinputName4 = inputNameParam(4);\n\t\tinputType5 = inputTypeParam(5);\n\t\tinputName5 = inputNameParam(5);\n\t\tinputType6 = inputTypeParam(6);\n\t\tinputName6 = inputNameParam(6);\n\t\tinputType7 = inputTypeParam(7);\n\t\tinputName7 = inputNameParam(7);\n\t\tinputType8 = inputTypeParam(8);\n\t\tinputName8 = inputNameParam(8);\n\t\tinputType9 = inputTypeParam(9);\n\t\tinputName9 = inputNameParam(9);\n\t\tspare = ParamConfig.FOLDER();\n\t};\n}\nclass TypedSubnetGlParamsConfig extends TypedSubnetGlParamsConfigMixin(NodeParamsConfig) {}\nexport class AbstractTypedSubnetGlNode<K extends NodeParamsConfig> extends TypedGlNode<K> {\n\tprotected override _childrenControllerContext = NodeContext.GL;\n\n\toverride initializeNode() {\n\t\tthis.childrenController?.setOutputNodeFindMethod(() => {\n\t\t\treturn this.nodesByType(SubnetOutputGlNode.type())[0];\n\t\t});\n\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputName.bind(this));\n\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputName.bind(this));\n\t}\n\tprotected _expectedInputTypes(): GlConnectionPointType[] {\n\t\treturn [];\n\t}\n\tprotected _expectedInputName(index: number) {\n\t\treturn 'default';\n\t}\n\n\tprotected _expectedOutputTypes() {\n\t\treturn this._expectedInputTypes();\n\t}\n\n\tprotected _expectedOutputName(index: number) {\n\t\treturn this._expectedInputName(index);\n\t}\n\t//\n\t//\n\t// defines the outputs for the child subnet input\n\t//\n\t//\n\tchildExpectedInputConnectionPointTypes() {\n\t\treturn this._expectedInputTypes();\n\t}\n\tchildExpectedOutputConnectionPointTypes() {\n\t\treturn this._expectedOutputTypes();\n\t}\n\tchildExpectedInputConnectionPointName(index: number) {\n\t\treturn this._expectedInputName(index);\n\t}\n\tchildExpectedOutputConnectionPointName(index: number) {\n\t\treturn this._expectedOutputName(index);\n\t}\n\n\t//\n\t//\n\t// CHILDREN\n\t//\n\t//\n\toverride createNode<S extends keyof GlNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): GlNodeChildrenMap[S];\n\toverride createNode<K extends valueof<GlNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<GlNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseGlNodeType[];\n\t}\n\toverride nodesByType<K extends keyof GlNodeChildrenMap>(type: K): GlNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as GlNodeChildrenMap[K][];\n\t}\n\n\t//\n\t//\n\t// set_lines\n\t//\n\t//\n\tprotected _setLinesPreBlock(shadersCollectionController: ShadersCollectionController) {\n\t\tconst bodyLines: string[] = [];\n\t\tconst connection_points = this.io.inputs.namedInputConnectionPoints();\n\t\tif (!connection_points) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let i = 0; i < connection_points.length; i++) {\n\t\t\tconst connection_point = connection_points[i];\n\t\t\tconst gl_type = connection_point.type();\n\t\t\tconst out = this.glVarName(connection_point.name());\n\t\t\tconst in_value = ThreeToGl.any(this.variableForInput(connection_point.name()));\n\t\t\tconst body_line = `${gl_type} ${out} = ${in_value}`;\n\t\t\tbodyLines.push(body_line);\n\t\t}\n\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t}\n\tprotected setLinesBlockStart(shadersCollectionController: ShadersCollectionController) {\n\t\tshadersCollectionController.addBodyLines(this, [`if(true){`]);\n\t}\n\tprotected setLinesBlockEnd(shadersCollectionController: ShadersCollectionController) {\n\t\tshadersCollectionController.addBodyLines(this, ['}']);\n\t}\n\tsetSubnetInputLines(shadersCollectionController: ShadersCollectionController, childNode: SubnetInputGlNode) {\n\t\tconst connections = this.io.connections.inputConnections();\n\t\tif (!connections) {\n\t\t\treturn;\n\t\t}\n\t\tconst bodyLines: string[] = [];\n\t\tfor (const connection of connections) {\n\t\t\tif (connection) {\n\t\t\t\tconst connection_point = connection.destConnectionPoint();\n\t\t\t\tif (connection_point) {\n\t\t\t\t\tconst in_value = ThreeToGl.any(this.variableForInput(connection_point.name()));\n\t\t\t\t\tconst gl_type = connection_point.type();\n\t\t\t\t\tconst out = childNode.glVarName(connection_point.name());\n\t\t\t\t\tconst body_line = `\t${gl_type} ${out} = ${in_value}`;\n\t\t\t\t\tbodyLines.push(body_line);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tshadersCollectionController.addBodyLines(childNode, bodyLines, undefined, ADD_BODY_LINES_OPTIONS);\n\t}\n\tprivate subnetOutputLines(childNode: SubnetOutputGlNode): string[] {\n\t\tconst connections = childNode.io.connections.inputConnections();\n\t\tif (!connections) {\n\t\t\treturn [];\n\t\t}\n\t\tconst bodyLines: string[] = [];\n\n\t\tfor (const connection of connections) {\n\t\t\tif (connection) {\n\t\t\t\tconst connectionPoint = connection.destConnectionPoint();\n\t\t\t\tif (connectionPoint) {\n\t\t\t\t\tconst in_value = ThreeToGl.any(childNode.variableForInput(connectionPoint.name()));\n\t\t\t\t\tconst out = this.glVarName(connectionPoint.name());\n\t\t\t\t\t// const body_line = `${gl_type} ${out} = ${in_value}`;\n\t\t\t\t\t// do not use the type, to avoid re-defining a variable that should be defined in the parent node\n\t\t\t\t\tconst bodyLine = `\t${out} = ${in_value}`;\n\t\t\t\t\tbodyLines.push(bodyLine);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn bodyLines;\n\t}\n\tsetSubnetOutputLines(shadersCollectionController: ShadersCollectionController, childNode: SubnetOutputGlNode) {\n\t\tconst bodyLines: string[] = this.subnetOutputLines(childNode);\n\t\tshadersCollectionController.addBodyLines(childNode, bodyLines, undefined, ADD_BODY_LINES_OPTIONS);\n\t}\n\n\t// set_lines_block_end(shadersCollectionController: ShadersCollectionController, childNode: SubnetOutputGlNode) {\n\t// \tshadersCollectionController.addBodyLines(childNode, ['}']);\n\t// }\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tthis._setLinesPreBlock(shadersCollectionController);\n\t\tthis.setLinesBlockStart(shadersCollectionController);\n\t\tthis._setLinesBlockContent(shadersCollectionController);\n\t\tthis.setLinesBlockEnd(shadersCollectionController);\n\t}\n\tprotected linesBlockContent(shadersCollectionController: ShadersCollectionController) {\n\t\tconst codeBuilder = this._runCodeBuilder(shadersCollectionController);\n\t\tif (!codeBuilder) {\n\t\t\treturn;\n\t\t}\n\t\tconst shadername = shadersCollectionController.currentShaderName();\n\t\tconst bodyLines = codeBuilder.lines(shadername, LineType.BODY);\n\t\treturn this._sanitizeBodyLines(bodyLines);\n\t}\n\tprivate _setLinesBlockContent(shadersCollectionController: ShadersCollectionController) {\n\t\tconst bodyLines = this.linesBlockContent(shadersCollectionController);\n\t\tif (!bodyLines) {\n\t\t\treturn;\n\t\t}\n\t\tshadersCollectionController.addBodyLines(this, bodyLines, undefined, ADD_BODY_LINES_OPTIONS);\n\t}\n\tprotected _runCodeBuilder(shadersCollectionController: ShadersCollectionController) {\n\t\t// I potentially could look for attribute nodes to use as output,\n\t\t// but for now, I'll enforce a rule that attribute nodes must be at the top level\n\t\tconst outputNodes: SubnetOutputGlNode[] = this.nodesByType(NetworkChildNodeType.OUTPUT);\n\t\tconst matNode = this.materialNode();\n\t\tif (!matNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (outputNodes.length == 0) {\n\t\t\tmatNode.states.error.set(`${this.path()}:one output node is required`);\n\t\t}\n\t\tif (outputNodes.length > 1) {\n\t\t\tmatNode.states.error.set(`${this.path()}:only one output node allowed`);\n\t\t}\n\t\tconst subnetOutput = outputNodes[0];\n\t\tconst subnetOutputInputConnectionPoints = subnetOutput.io.inputs.namedInputConnectionPoints();\n\n\t\tconst subnetOutputInputNames = subnetOutputInputConnectionPoints\n\t\t\t? subnetOutputInputConnectionPoints.map((cp) => cp.name())\n\t\t\t: [];\n\n\t\tconst assembler = shadersCollectionController.assembler();\n\n\t\tconst nodeTraverser = new TypedNodeTraverser<NodeContext.GL>(\n\t\t\tthis,\n\t\t\tshadersCollectionController.shaderNames(),\n\t\t\t(rootNode, shaderName) => {\n\t\t\t\treturn subnetOutputInputNames;\n\t\t\t}\n\t\t);\n\t\tconst codeBuilder = new CodeBuilder(\n\t\t\tnodeTraverser,\n\t\t\t(shaderName, rootNodes) => {\n\t\t\t\t// return [subnetOutput];\n\t\t\t\treturn assembler.rootNodesByShaderName(shaderName, rootNodes);\n\t\t\t},\n\t\t\tassembler\n\t\t);\n\t\tconst paramNodes: BaseGlNodeType[] = [];\n\t\tcodeBuilder.buildFromNodes(outputNodes, paramNodes);\n\t\tthis._addCodeBuilderDefinition(codeBuilder, shadersCollectionController);\n\t\treturn codeBuilder;\n\t}\n\tprivate _addCodeBuilderDefinition(\n\t\tcodeBuilder: CodeBuilder,\n\t\tshadersCollectionController: ShadersCollectionController\n\t) {\n\t\tconst internalShadersCollectionController = codeBuilder.shadersCollectionController();\n\t\tif (!internalShadersCollectionController) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentShaderName = shadersCollectionController.currentShaderName();\n\t\tinternalShadersCollectionController.setCurrentShaderName(currentShaderName);\n\n\t\t// 1- add all definitions for each shaderName\n\t\tconst shaderNames = shadersCollectionController.shaderNames();\n\t\tfor (const shaderName of shaderNames) {\n\t\t\tconst definitions: BaseGLDefinition[] = [];\n\t\t\tinternalShadersCollectionController.traverseDefinitions(shaderName, (definition) => {\n\t\t\t\t// only add function if it is for the current shader\n\t\t\t\tconst isNotFunction = !(definition instanceof FunctionGLDefinition);\n\t\t\t\tconst isCurrentShader = shaderName == currentShaderName;\n\t\t\t\tif (isNotFunction || isCurrentShader) {\n\t\t\t\t\tdefinitions.push(definition);\n\t\t\t\t}\n\t\t\t});\n\t\t\tshadersCollectionController.addDefinitions(this, definitions, shaderName);\n\t\t}\n\t\t// 2- add vertex body lines if current shader name is fragment\n\t\tif (currentShaderName != ShaderName.VERTEX) {\n\t\t\tconst attribNodes = this.nodesByType(GlType.ATTRIBUTE);\n\t\t\tconst bodyLines: string[] = [];\n\t\t\tfor (const attribNode of attribNodes) {\n\t\t\t\tconst linesForNode = internalShadersCollectionController.bodyLines(ShaderName.VERTEX, attribNode);\n\t\t\t\tif (linesForNode) {\n\t\t\t\t\tbodyLines.push(...linesForNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tshadersCollectionController.addBodyLines(this, bodyLines, ShaderName.VERTEX, ADD_BODY_LINES_OPTIONS);\n\t\t}\n\t}\n\n\t// align with the right number of tabs\n\tprotected _sanitizeBodyLines(lines: string[]): string[] {\n\t\tconst level = CodeFormatter.nodeDistanceToMaterial(this);\n\t\tconst prefix = `\\t`.repeat(level);\n\n\t\treturn lines.map((line) => {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (trimmed.length == 0) {\n\t\t\t\treturn '';\n\t\t\t} else {\n\t\t\t\treturn `${prefix}${trimmed}`;\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport class TypedSubnetGlNode<K extends TypedSubnetGlParamsConfig> extends AbstractTypedSubnetGlNode<K> {\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputName.bind(this));\n\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputName.bind(this));\n\t}\n\tprotected _inputTypeParams(): IntegerParam[] {\n\t\treturn [\n\t\t\tthis.p.inputType0,\n\t\t\tthis.p.inputType1,\n\t\t\tthis.p.inputType2,\n\t\t\tthis.p.inputType3,\n\t\t\tthis.p.inputType4,\n\t\t\tthis.p.inputType5,\n\t\t\tthis.p.inputType6,\n\t\t\tthis.p.inputType7,\n\t\t\tthis.p.inputType8,\n\t\t\tthis.p.inputType9,\n\t\t];\n\t}\n\tprotected _inputNameParams(): StringParam[] {\n\t\treturn [\n\t\t\tthis.p.inputName0,\n\t\t\tthis.p.inputName1,\n\t\t\tthis.p.inputName2,\n\t\t\tthis.p.inputName3,\n\t\t\tthis.p.inputName4,\n\t\t\tthis.p.inputName5,\n\t\t\tthis.p.inputName6,\n\t\t\tthis.p.inputName7,\n\t\t\tthis.p.inputName8,\n\t\t\tthis.p.inputName9,\n\t\t];\n\t}\n\n\tsetInputType(index: number, type: GlConnectionPointType) {\n\t\tconst param = this._inputTypeParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tparam.set(GL_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tsetInputName(index: number, inputName: string) {\n\t\tconst param = this._inputNameParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tparam.set(inputName);\n\t}\n\n\tprotected _expectedInputsCount(): number {\n\t\treturn this.pv.inputsCount;\n\t}\n\n\tprotected override _expectedInputTypes(): GlConnectionPointType[] {\n\t\tconst count = this.pv.inputsCount;\n\t\tconst params: IntegerParam[] = this._inputTypeParams();\n\t\treturn rangeStartEnd(0, count).map((value, i) => GL_CONNECTION_POINT_TYPES[params[i].value]);\n\t}\n\tprotected override _expectedInputName(index: number) {\n\t\tconst params: StringParam[] = this._inputNameParams();\n\t\tconst param = params[index];\n\t\treturn param ? param.value : GlConnectionPointType.FLOAT;\n\t}\n\n\tprotected override _expectedOutputTypes() {\n\t\tconst count = this.pv.inputsCount;\n\t\tconst params: IntegerParam[] = this._inputTypeParams();\n\t\treturn rangeStartEnd(0, count).map((value, i) => GL_CONNECTION_POINT_TYPES[params[i].value]);\n\t}\n\n\tprotected override _expectedOutputName(index: number) {\n\t\t// return this._expected_input_name(index);\n\t\tconst params: StringParam[] = this._inputNameParams();\n\t\treturn params[index].value;\n\t}\n}\n\nclass SubnetGlParamsConfig extends TypedSubnetGlParamsConfigMixin(NodeParamsConfig) {}\nconst ParamsConfig = new SubnetGlParamsConfig();\n\nexport class SubnetGlNode extends TypedSubnetGlNode<SubnetGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn NetworkNodeType.SUBNET;\n\t}\n}\n","/**\n * a subnet output is the output of a... subnet!\n *\n *\n *\n */\n\nimport {TypedGlNode} from './_Base';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {NetworkChildNodeType} from '../../poly/NodeContext';\nimport {SubnetGlNode} from './Subnet';\nclass SubnetOutputGlParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new SubnetOutputGlParamsConfig();\n\nexport class SubnetOutputGlNode extends TypedGlNode<SubnetOutputGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<NetworkChildNodeType.OUTPUT> {\n\t\treturn NetworkChildNodeType.OUTPUT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.connection_points.set_input_name_function(this._expected_input_name.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(() => []);\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expected_input_types.bind(this));\n\t\tthis.io.connection_points.set_create_spare_params_from_inputs(false);\n\n\t\tthis.addPostDirtyHook('setParentDirty', () => {\n\t\t\tthis.parent()?.setDirty(this);\n\t\t});\n\t}\n\toverride parent() {\n\t\treturn super.parent() as SubnetGlNode | null;\n\t}\n\n\tprotected _expected_input_name(index: number) {\n\t\tconst parent = this.parent();\n\t\treturn parent?.childExpectedOutputConnectionPointName(index) || `in${index}`;\n\t}\n\n\tprotected _expected_input_types() {\n\t\tconst parent = this.parent();\n\t\treturn parent?.childExpectedOutputConnectionPointTypes() || [];\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst parent = this.parent();\n\t\tparent?.setSubnetOutputLines(shadersCollectionController, this);\n\t}\n}\n","export default \"vec4 textureBlur3x1(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offset = vec2(1.0/resolution.x, 0.0);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offset) +\\n\\t\\ttexture2D(map, uv+offset);\\n\\n\\treturn blurResult / 3.0;\\n}\\n\\nvec4 textureBlur5x1(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offset1 = vec2(1.0/resolution.x, 0.0);\\n\\tvec2 offset2 = vec2(2.0/resolution.x, 0.0);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offset1) +\\n\\t\\ttexture2D(map, uv+offset1) +\\n\\t\\ttexture2D(map, uv-offset2) +\\n\\t\\ttexture2D(map, uv+offset2);\\n\\n\\treturn blurResult * 0.2;\\n}\\nvec4 textureBlur7x1(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offset1 = vec2(1.0/resolution.x, 0.0);\\n\\tvec2 offset2 = vec2(2.0/resolution.x, 0.0);\\n\\tvec2 offset3 = vec2(3.0/resolution.x, 0.0);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offset1) +\\n\\t\\ttexture2D(map, uv+offset1) +\\n\\t\\ttexture2D(map, uv-offset2) +\\n\\t\\ttexture2D(map, uv+offset2) +\\n\\t\\ttexture2D(map, uv-offset3) +\\n\\t\\ttexture2D(map, uv+offset3);\\n\\n\\treturn blurResult / 7.0;\\n}\\n\\nvec4 textureBlur1x3(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offset = vec2(0.0, 1.0/resolution.y);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offset) +\\n\\t\\ttexture2D(map, uv+offset);\\n\\n\\treturn blurResult / 3.0;\\n}\\nvec4 textureBlur1x5(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offset1 = vec2(0.0, 1.0/resolution.x);\\n\\tvec2 offset2 = vec2(0.0, 2.0/resolution.x);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offset1) +\\n\\t\\ttexture2D(map, uv+offset1) +\\n\\t\\ttexture2D(map, uv-offset2) +\\n\\t\\ttexture2D(map, uv+offset2);\\n\\n\\treturn blurResult * 0.2;\\n}\\nvec4 textureBlur1x7(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offset1 = vec2(0.0, 1.0/resolution.x);\\n\\tvec2 offset2 = vec2(0.0, 2.0/resolution.x);\\n\\tvec2 offset3 = vec2(0.0, 3.0/resolution.x);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offset1) +\\n\\t\\ttexture2D(map, uv+offset1) +\\n\\t\\ttexture2D(map, uv-offset2) +\\n\\t\\ttexture2D(map, uv+offset2) +\\n\\t\\ttexture2D(map, uv-offset3) +\\n\\t\\ttexture2D(map, uv+offset3);\\n\\n\\treturn blurResult / 7.0;\\n}\\n\\nvec4 textureBlur3x3(sampler2D map, vec2 uv, vec2 resolution){\\n\\n\\tvec2 offsetX = vec2(1.0/resolution.x, 0.0);\\n\\tvec2 offsetY = vec2(0.0, 1.0/resolution.y);\\n\\tvec4 blurResult = texture2D(map, uv) +\\n\\t\\ttexture2D(map, uv-offsetY) +\\n\\t\\ttexture2D(map, uv+offsetX-offsetY) +\\n\\t\\ttexture2D(map, uv+offsetX) +\\n\\t\\ttexture2D(map, uv+offsetX+offsetY) +\\n\\t\\ttexture2D(map, uv+offsetY) +\\n\\t\\ttexture2D(map, uv-offsetX+offsetY) +\\n\\t\\ttexture2D(map, uv-offsetX) +\\n\\t\\ttexture2D(map, uv-offsetX-offsetY);\\n\\n\\treturn blurResult / 9.0;\\n}\\nvec4 textureBlur3x5(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-3;x<=3;x++){\\n\\t\\tfor(int y=-5;y<=5;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 77.0;\\n}\\nvec4 textureBlur5x3(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-5;x<=5;x++){\\n\\t\\tfor(int y=-3;y<=3;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 77.0;\\n}\\nvec4 textureBlur5x5(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-5;x<=5;x++){\\n\\t\\tfor(int y=-5;y<=5;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 121.0;\\n}\\nvec4 textureBlur3x7(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-3;x<=3;x++){\\n\\t\\tfor(int y=-7;y<=7;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 105.0;\\n}\\nvec4 textureBlur7x3(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-7;x<=7;x++){\\n\\t\\tfor(int y=-3;y<=3;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 105.0;\\n}\\nvec4 textureBlur5x7(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-5;x<=5;x++){\\n\\t\\tfor(int y=-7;y<=7;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 165.0;\\n}\\nvec4 textureBlur7x5(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-7;x<=7;x++){\\n\\t\\tfor(int y=-5;y<=5;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 165.0;\\n}\\nvec4 textureBlur7x7(sampler2D map, vec2 uv, vec2 resolution){\\n\\tvec4 blurResult = vec4(0.0);\\n\\tfor(int x=-7;x<=7;x++){\\n\\t\\tfor(int y=-7;y<=7;y++){\\n\\t\\t\\tblurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n\\t\\t}\\n\\t}\\n\\treturn blurResult / 225.0;\\n}\\n\\n// vec4 textureBlurXY(sampler2D map, vec2 uv, vec2 resolution, int pixelsX, int pixelsY){\\n// \\tvec4 blurResult = vec4(0.0);\\n// \\t// this loop unrolling does not work on iphone\\n// \\tfor(int x = -1*pixelsX; x <= pixelsX; x+=1 ){\\n// \\t\\t// for(int y = -pixelsY; y <= pixelsY; y++ ){\\n// \\t\\t\\t// blurResult += texture2D(map, uv + vec2(float(x)/resolution.x, float(y)/resolution.x));\\n// \\t\\t// }\\n// \\t}\\n// \\treturn blurResult / ((float(pixelsX)*2.0+1.0) * (float(pixelsY)*2.0+1.0));\\n// }\\n\\nvec4 textureBlur(sampler2D map, vec2 uv, vec2 resolution, int pixelsX, int pixelsY){\\n\\t// the clamp are added in js when calling this function;\\n\\t// UPDATE: clamp, min or max seem to create issues on iphone, so they are skipped for now\\n\\t// pixelsX = clamp(pixelsX, 1, 4);\\n\\t// pixelsY = clamp(pixelsY, 1, 4);\\n\\n\\tif(pixelsX == 1){\\n\\t\\tif(pixelsY == 1){ return texture2D(map, uv); }\\n\\t\\tif(pixelsY == 2){ return textureBlur1x3(map, uv, resolution); }\\n\\t\\tif(pixelsY == 3){ return textureBlur1x5(map, uv, resolution); }\\n\\t\\tif(pixelsY == 4){ return textureBlur1x7(map, uv, resolution); }\\n\\t}\\n\\tif(pixelsX == 2){\\n\\t\\tif(pixelsY == 1){ return textureBlur3x1(map, uv, resolution); }\\n\\t\\tif(pixelsY == 2){ return textureBlur3x3(map, uv, resolution); }\\n\\t\\tif(pixelsY == 3){ return textureBlur3x5(map, uv, resolution); }\\n\\t\\tif(pixelsY == 4){ return textureBlur3x7(map, uv, resolution); }\\n\\t}\\n\\tif(pixelsX == 3){\\n\\t\\tif(pixelsY == 1){ return textureBlur5x1(map, uv, resolution); }\\n\\t\\tif(pixelsY == 2){ return textureBlur5x3(map, uv, resolution); }\\n\\t\\tif(pixelsY == 3){ return textureBlur5x5(map, uv, resolution); }\\n\\t\\tif(pixelsY == 4){ return textureBlur5x7(map, uv, resolution); }\\n\\t}\\n\\tif(pixelsX == 4){\\n\\t\\tif(pixelsY == 1){ return textureBlur7x1(map, uv, resolution); }\\n\\t\\tif(pixelsY == 2){ return textureBlur7x3(map, uv, resolution); }\\n\\t\\tif(pixelsY == 3){ return textureBlur7x5(map, uv, resolution); }\\n\\t\\tif(pixelsY == 4){ return textureBlur7x7(map, uv, resolution); }\\n\\t}\\n\\n\\treturn texture2D(map, uv);\\n}\"","/**\n * the texture node allows you to import a texture into your shaders.\n *\n * @remarks\n *\n * When this node is used inside a material or particles systems, a spare param will be added to the node, allowing you to select the texture node.\n * You'll then be able to read the texture values based on a uv input.\n *\n * And note that the uv input does not necessarily need to be an actual uv attribute on your geometry. It can be any attribute, any globals (like time) or function.\n *\n *\n *\n */\n\nimport {TypedGlNode} from './_Base';\nimport TextureBlur from './gl/textureBlur.glsl';\nimport {GlConnectionPointType, GlConnectionPoint} from '../utils/io/connections/Gl';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {BaseGLDefinition, FunctionGLDefinition, UniformGLDefinition} from './utils/GLDefinition';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {ParamType} from '../../poly/ParamType';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {GlParamConfig} from './code/utils/GLParamConfig';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {ParamOptions} from '../../params/utils/OptionsController';\nimport {UNIFORM_TEXTURE_PREFIX} from '../../../core/material/uniform';\nimport {GlType} from '../../poly/registers/nodes/types/Gl';\n\nconst blurParamVisibility: ParamOptions = {\n\tvisibleIf: {tblur: 1},\n};\nclass TextureGlParamsConfig extends NodeParamsConfig {\n\tparamName = ParamConfig.STRING('texture1');\n\t// defaultValue = ParamConfig.STRING('');\n\tuv = ParamConfig.VECTOR2([0, 0]);\n\ttblur = ParamConfig.BOOLEAN(0);\n\tresolution = ParamConfig.VECTOR2([256, 256], blurParamVisibility);\n\tblurPixelsCountX = ParamConfig.INTEGER(1, {\n\t\trange: [1, 4],\n\t\trangeLocked: [true, true],\n\t\t...blurParamVisibility,\n\t});\n\tblurPixelsCountY = ParamConfig.INTEGER(1, {\n\t\trange: [1, 4],\n\t\trangeLocked: [true, true],\n\t\t...blurParamVisibility,\n\t});\n}\nconst ParamsConfig = new TextureGlParamsConfig();\nexport class TextureGlNode extends TypedGlNode<TextureGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<GlType.TEXTURE> {\n\t\treturn GlType.TEXTURE;\n\t}\n\tstatic readonly OUTPUT_NAME = 'rgba';\n\toverride initializeNode() {\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onAfterAdded(this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onBeforeDeleted(this._setMatToRecompile.bind(this));\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(TextureGlNode.OUTPUT_NAME, GlConnectionPointType.VEC4),\n\t\t]);\n\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['tblur', 'resolution']);\n\t}\n\n\toverride setLines(shaders_collection_controller: ShadersCollectionController) {\n\t\tconst uv = ThreeToGl.vector2(this.variableForInputParam(this.p.uv));\n\n\t\tconst rgba = this.glVarName(TextureGlNode.OUTPUT_NAME);\n\t\tconst map = this.uniformName();\n\t\tconst definitions: BaseGLDefinition[] = [new UniformGLDefinition(this, GlConnectionPointType.SAMPLER_2D, map)];\n\t\tconst bodyLines: string[] = [];\n\n\t\tif (isBooleanTrue(this.pv.tblur)) {\n\t\t\tconst resolution = ThreeToGl.vector2(this.variableForInputParam(this.p.resolution));\n\t\t\tconst blurPixelsCountX = ThreeToGl.integer(this.variableForInputParam(this.p.blurPixelsCountX));\n\t\t\tconst blurPixelsCountY = ThreeToGl.integer(this.variableForInputParam(this.p.blurPixelsCountY));\n\t\t\tconst body_line = `vec4 ${rgba} = textureBlur(\n\t\t\t\t${map},\n\t\t\t\t${uv},\n\t\t\t\t${resolution},\n\t\t\t\t${blurPixelsCountX},\n\t\t\t\t${blurPixelsCountY}\n\t\t\t\t)`;\n\t\t\tbodyLines.push(body_line);\n\t\t\tdefinitions.push(new FunctionGLDefinition(this, TextureBlur));\n\t\t} else {\n\t\t\tconst body_line = `vec4 ${rgba} = texture2D(${map}, ${uv})`;\n\t\t\tbodyLines.push(body_line);\n\t\t}\n\n\t\tshaders_collection_controller.addDefinitions(this, definitions);\n\t\tshaders_collection_controller.addBodyLines(this, bodyLines);\n\t}\n\toverride paramsGenerating() {\n\t\treturn true;\n\t}\n\n\toverride setParamConfigs() {\n\t\tthis._param_configs_controller = this._param_configs_controller || new ParamConfigsController();\n\t\tthis._param_configs_controller.reset();\n\n\t\tconst param_config = new GlParamConfig(\n\t\t\tParamType.NODE_PATH,\n\t\t\tthis.pv.paramName,\n\t\t\t'', //this.pv.defaultValue,\n\t\t\tthis.uniformName()\n\t\t);\n\t\tthis._param_configs_controller.push(param_config);\n\t}\n\t// override glVarName(name?: string) {\n\t// \tif (name) {\n\t// \t\treturn super.glVarName(name);\n\t// \t}\n\t// \treturn `v_POLY_texture_${this.pv.paramName}`;\n\t// }\n\tuniformName() {\n\t\treturn `${UNIFORM_TEXTURE_PREFIX}${this.pv.paramName}`;\n\t}\n}\n","/**\n * the texture node allows you to import a texture into your shaders.\n *\n * @remarks\n *\n * When this node is used inside a material or particles systems, a spare param will be added to the node, allowing you to select the texture node.\n * You'll then be able to read the texture values based on a uv input.\n *\n * And note that the uv input does not necessarily need to be an actual uv attribute on your geometry. It can be any attribute, any globals (like time) or function.\n *\n *\n *\n */\nimport {PrecisionGLDefinition} from './utils/GLDefinition';\nimport {TypedGlNode} from './_Base';\nimport {GlConnectionPointType, GlConnectionPoint} from '../utils/io/connections/Gl';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {BaseGLDefinition, UniformGLDefinition} from './utils/GLDefinition';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {ParamType} from '../../poly/ParamType';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {GlParamConfig} from './code/utils/GLParamConfig';\nimport {UNIFORM_TEXTURE_PREFIX} from '../../../core/material/uniform';\n\nclass Texture2DArrayGlParamsConfig extends NodeParamsConfig {\n\tparamName = ParamConfig.STRING('texture3D1');\n\t// defaultValue = ParamConfig.STRING('');\n\tuv = ParamConfig.VECTOR2([0, 0]);\n\tlayer = ParamConfig.INTEGER(4, {\n\t\trange: [1, 31],\n\t});\n}\nconst ParamsConfig = new Texture2DArrayGlParamsConfig();\nexport class Texture2DArrayGlNode extends TypedGlNode<Texture2DArrayGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<'texture2DArray'> {\n\t\treturn 'texture2DArray';\n\t}\n\tstatic readonly OUTPUT_NAME = 'rgba';\n\toverride initializeNode() {\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onAfterAdded(this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onBeforeDeleted(this._setMatToRecompile.bind(this));\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(Texture2DArrayGlNode.OUTPUT_NAME, GlConnectionPointType.VEC4),\n\t\t]);\n\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['tblur', 'resolution']);\n\t}\n\n\toverride setLines(shaders_collection_controller: ShadersCollectionController) {\n\t\tconst uv = ThreeToGl.vector2(this.variableForInputParam(this.p.uv));\n\t\tconst layer = ThreeToGl.float(this.variableForInputParam(this.p.layer));\n\n\t\tconst rgba = this.glVarName(Texture2DArrayGlNode.OUTPUT_NAME);\n\t\tconst map = this.uniformName();\n\t\tconst definitions: BaseGLDefinition[] = [\n\t\t\tnew PrecisionGLDefinition(this, GlConnectionPointType.SAMPLER_2D_ARRAY, 'highp'),\n\t\t\tnew UniformGLDefinition(this, GlConnectionPointType.SAMPLER_2D_ARRAY, map),\n\t\t];\n\t\tconst bodyLines: string[] = [`vec4 ${rgba} = texture(${map}, vec3(${uv},${layer}))`];\n\n\t\tshaders_collection_controller.addDefinitions(this, definitions);\n\t\tshaders_collection_controller.addBodyLines(this, bodyLines);\n\t}\n\toverride paramsGenerating() {\n\t\treturn true;\n\t}\n\n\toverride setParamConfigs() {\n\t\tthis._param_configs_controller = this._param_configs_controller || new ParamConfigsController();\n\t\tthis._param_configs_controller.reset();\n\n\t\tconst param_config = new GlParamConfig(\n\t\t\tParamType.NODE_PATH,\n\t\t\tthis.pv.paramName,\n\t\t\t'', //this.pv.defaultValue,\n\t\t\tthis.uniformName()\n\t\t);\n\t\tthis._param_configs_controller.push(param_config);\n\t}\n\t// override glVarName(name?: string) {\n\t// \tif (name) {\n\t// \t\treturn super.glVarName(name);\n\t// \t}\n\t// \treturn `v_POLY_texture_${this.pv.paramName}`;\n\t// }\n\tuniformName() {\n\t\treturn `${UNIFORM_TEXTURE_PREFIX}${this.pv.paramName}`;\n\t}\n}\n","/**\n * loads an SDF texture, which is used in raymarching materials.\n *\n *\n *\n *\n */\nimport {GlConnectionPointType, GlConnectionPoint} from '../utils/io/connections/Gl';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {BaseGLDefinition, PrecisionGLDefinition, UniformGLDefinition} from './utils/GLDefinition';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {ParamType} from '../../poly/ParamType';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {GlParamConfig} from './code/utils/GLParamConfig';\nimport {BaseSDFGlNode} from './_BaseSDF';\nimport {isBooleanTrue} from '../../../core/Type';\nimport { GlType } from '../../poly/registers/nodes/types/Gl';\n\nclass TextureSDFGlParamsConfig extends NodeParamsConfig {\n\tparamName = ParamConfig.STRING('texture1');\n\tposition = ParamConfig.VECTOR3([0, 0, 0], {hidden: true});\n\tcenter = ParamConfig.VECTOR3([0, 0, 0]);\n\tboundMin = ParamConfig.VECTOR3([0, 0, 0]);\n\tboundMax = ParamConfig.VECTOR3([1, 1, 1]);\n\tboundScale = ParamConfig.VECTOR3([1, 1, 1]);\n\tbias = ParamConfig.FLOAT(0.01);\n\ttblur = ParamConfig.BOOLEAN(0);\n\tblurDist = ParamConfig.FLOAT(0.01, {\n\t\tvisibleIf: {tblur: 1},\n\t});\n\t// voxelSizes = ParamConfig.VECTOR3([1, 1, 1]);\n}\nconst ParamsConfig = new TextureSDFGlParamsConfig();\nexport class TextureSDFGlNode extends BaseSDFGlNode<TextureSDFGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<GlType.TEXTURE_SDF> {\n\t\treturn GlType.TEXTURE_SDF;\n\t}\n\tstatic readonly OUTPUT_NAME = 'd';\n\toverride initializeNode() {\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onAfterAdded(this._setMatToRecompile.bind(this));\n\t\tthis.lifecycle.onBeforeDeleted(this._setMatToRecompile.bind(this));\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew GlConnectionPoint(TextureSDFGlNode.OUTPUT_NAME, GlConnectionPointType.FLOAT),\n\t\t]);\n\t}\n\n\toverride setLines(shadersCollectionController: ShadersCollectionController) {\n\t\tconst position = this.position();\n\t\tconst center = ThreeToGl.vector3(this.variableForInputParam(this.p.center));\n\t\tconst boundMin = ThreeToGl.vector3(this.variableForInputParam(this.p.boundMin));\n\t\tconst boundMax = ThreeToGl.vector3(this.variableForInputParam(this.p.boundMax));\n\t\tconst boundScale = ThreeToGl.vector3(this.variableForInputParam(this.p.boundScale));\n\t\tconst bias = ThreeToGl.float(this.variableForInputParam(this.p.bias));\n\t\t// const voxelSizes = ThreeToGl.vector3(this.variableForInputParam(this.p.voxelSizes));\n\n\t\tconst d = this.glVarName(TextureSDFGlNode.OUTPUT_NAME);\n\t\tconst boundCenter = this.glVarName('boundCenter');\n\t\tconst boundSize = this.glVarName('boundSize');\n\t\tconst sdBox = this.glVarName('sdBox');\n\t\tconst positionNormalised = this.glVarName('positionNormalised');\n\t\tconst map = this.uniformName();\n\t\tconst definitions: BaseGLDefinition[] = [\n\t\t\tnew PrecisionGLDefinition(this, GlConnectionPointType.SAMPLER_3D, 'highp'),\n\t\t\tnew UniformGLDefinition(this, GlConnectionPointType.SAMPLER_3D, map),\n\t\t];\n\t\tconst bodyLines: string[] = [\n\t\t\t`vec3 ${boundCenter} = (${boundMax} + ${boundMin})*0.5`,\n\t\t\t`vec3 ${boundSize} = (${boundMax} - ${boundMin})`,\n\t\t\t// `vec3 ${positionRefit} = ((${position} - (${boundMin} + (${voxelSizes}*0.0))) / ${boundSize})`,\n\t\t\t`vec3 ${positionNormalised} = ((${position} - ${boundMin}) / ${boundSize})`,\n\t\t\t`float ${sdBox} = sdBox(${position}-${boundCenter}, ${boundSize}*${boundScale})`,\n\t\t];\n\t\tif (isBooleanTrue(this.pv.tblur)) {\n\t\t\tconst blurDist = ThreeToGl.float(this.variableForInputParam(this.p.blurDist));\n\t\t\tconst offsets: number[] = [-1, 0, 1];\n\t\t\tconst textureBlurLines: string[] = [];\n\t\t\tfor (let z of offsets) {\n\t\t\t\tfor (let y of offsets) {\n\t\t\t\t\tfor (let x of offsets) {\n\t\t\t\t\t\tconst offset = `vec3(${ThreeToGl.float(x)}*${ThreeToGl.float(blurDist)},${ThreeToGl.float(\n\t\t\t\t\t\t\ty\n\t\t\t\t\t\t)}*${ThreeToGl.float(blurDist)},${ThreeToGl.float(z)}*${ThreeToGl.float(blurDist)})`;\n\t\t\t\t\t\tconst line = `texture(${map}, ${positionNormalised} - ${center}+${offset}).r`;\n\t\t\t\t\t\ttextureBlurLines.push(line);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbodyLines.push(\n\t\t\t\t`float ${d} = ${sdBox} < ${bias} ? ((\n\t\t\t\t\t${textureBlurLines.join(' +\\n')}\n\t\t\t\t)/27.0) : ${sdBox}`\n\t\t\t);\n\t\t} else {\n\t\t\tbodyLines.push(\n\t\t\t\t`float ${d} = ${sdBox} < ${bias} ? texture(${map}, ${positionNormalised} - ${center}).r : ${sdBox}`\n\t\t\t);\n\t\t}\n\n\t\tshadersCollectionController.addDefinitions(this, definitions);\n\t\tshadersCollectionController.addBodyLines(this, bodyLines);\n\t\tthis._addSDFMethods(shadersCollectionController);\n\t}\n\toverride paramsGenerating() {\n\t\treturn true;\n\t}\n\n\toverride setParamConfigs() {\n\t\tthis._param_configs_controller = this._param_configs_controller || new ParamConfigsController();\n\t\tthis._param_configs_controller.reset();\n\n\t\tconst param_config = new GlParamConfig(\n\t\t\tParamType.NODE_PATH,\n\t\t\tthis.pv.paramName,\n\t\t\t'', //this.pv.defaultValue,\n\t\t\tthis.uniformName()\n\t\t);\n\t\tthis._param_configs_controller.push(param_config);\n\t}\n\t// override glVarName(name?: string) {\n\t// \tif (name) {\n\t// \t\treturn super.glVarName(name);\n\t// \t}\n\t// \treturn `v_POLY_texture_${this.pv.paramName}`;\n\t// }\n\tuniformName() {\n\t\treturn `v_POLY_textureSDF_${this.pv.paramName}`;\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {ThreeToGl} from '../../../core/ThreeToGl';\nimport {BaseGlShaderAssembler} from './code/assemblers/_Base';\nimport {AssemblerGlControllerNode} from './code/Controller';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {ParamInitValueSerialized} from '../../params/types/ParamInitValueSerialized';\nimport {GlParamConfig} from './code/utils/GLParamConfig';\nimport {ParamType} from '../../poly/ParamType';\nimport {IntegerParam} from '../../params/Integer';\nimport {FloatParam} from '../../params/Float';\nimport {Vector2Param} from '../../params/Vector2';\nimport {Vector3Param} from '../../params/Vector3';\nimport {Vector4Param} from '../../params/Vector4';\nimport {ColorParam} from '../../params/Color';\nimport {BooleanParam} from '../../params/Boolean';\nimport {ParamsEditableStateController} from '../utils/io/ParamsEditableStateController';\n\n// const REGEX_PATH_SANITIZE = /\\/+/g;\nconst GL_VAR_NAME_PREFIX = 'v_POLY';\n// function _wrapGlVarName(nodesGlVarName:string[], varName:string):string{\n// \treturn `${GL_VAR_NAME_PREFIX}_${nodesGlVarName}_${varName}`\n// }\n\n/**\n *\n *\n * TypedGlNode is the base class for all nodes that process GLSL code. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\nexport class TypedGlNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.GL, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.GL;\n\t}\n\n\tprotected _param_configs_controller: ParamConfigsController<GlParamConfig<ParamType>> | undefined;\n\tprotected _assembler: BaseGlShaderAssembler | undefined;\n\tprivate _paramsEditableStatesController = new ParamsEditableStateController(this);\n\n\toverride initializeBaseNode() {\n\t\tthis.uiData.setLayoutHorizontal();\n\t\tthis.io.connections.initInputs();\n\n\t\tthis.io.connection_points.spare_params.initializeNode();\n\t\tthis._paramsEditableStatesController.initializeNode();\n\t}\n\n\toverride cook() {\n\t\tconsole.warn('gl node cooking');\n\t}\n\n\tprotected _setMatToRecompile() {\n\t\tthis.materialNode()?.assemblerController()?.setCompilationRequiredAndDirty(this);\n\t}\n\tmaterialNode(): AssemblerGlControllerNode | undefined {\n\t\tconst parent = this.parent();\n\t\tif (parent) {\n\t\t\tif (parent.context() == NodeContext.GL) {\n\t\t\t\treturn (parent as BaseGlNodeType)?.materialNode();\n\t\t\t} else {\n\t\t\t\treturn parent as AssemblerGlControllerNode;\n\t\t\t}\n\t\t}\n\t}\n\n\t//\n\t//\n\t// VARIABLES\n\t//\n\t//\n\tglVarName(varName: string) {\n\t\tconst nodes: BaseGlNodeType[] = [this];\n\t\tlet currentNode: BaseGlNodeType = this;\n\t\twhile (currentNode.parent() && currentNode.parent() != this.materialNode()) {\n\t\t\tconst parent = currentNode.parent() as BaseGlNodeType;\n\t\t\tif (parent) {\n\t\t\t\tnodes.unshift(parent);\n\t\t\t\tcurrentNode = parent;\n\t\t\t}\n\t\t}\n\t\tconst baseGlVarNames = nodes.map((node) => node._glVarNameBase());\n\t\t// if(this.parent()==this.materialNode()){\n\t\t// \treturn `${GL_VAR_NAME_PREFIX}_${this.name()}`\n\t\t// }\n\t\t// const pathSanitized = this.path(this.materialNode()).replace(REGEX_PATH_SANITIZE, '_');\n\t\treturn `${GL_VAR_NAME_PREFIX}_${baseGlVarNames.join('_')}_${varName}`;\n\t}\n\tprotected _glVarNameBase() {\n\t\treturn this.name();\n\t}\n\n\tvariableForInputParam(\n\t\tparam: IntegerParam | FloatParam | Vector2Param | Vector3Param | Vector4Param | ColorParam | BooleanParam\n\t) {\n\t\treturn this.variableForInput(param.name());\n\t}\n\n\tvariableForInput(inputName: string): string {\n\t\tconst input_index = this.io.inputs.getInputIndex(inputName);\n\t\tconst connection = this.io.connections.inputConnection(input_index);\n\t\tif (connection) {\n\t\t\tconst input_node = (<unknown>connection.nodeSrc()) as BaseGlNodeType;\n\t\t\tconst outputConnectionPoints = input_node.io.outputs.namedOutputConnectionPoints()\n\t\t\tif(outputConnectionPoints){\n\t\t\t\tconst output_connection_point =\n\t\t\t\toutputConnectionPoints[connection.outputIndex()];\n\t\t\t\tif (output_connection_point) {\n\t\t\t\t\tconst output_name = output_connection_point.name();\n\t\t\t\t\treturn input_node.glVarName(output_name);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`no output called '${inputName}' for gl node ${input_node.path()}`);\n\t\t\t\t\tthrow 'variable_for_input ERROR';\n\t\t\t\t}\n\t\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.params.has(inputName)) {\n\t\t\t\treturn ThreeToGl.any(this.params.get(inputName)?.value);\n\t\t\t} else {\n\t\t\t\tconst inputConnectionPoints = this.io.inputs.namedInputConnectionPoints()\n\t\t\t\tif(inputConnectionPoints){\n\t\t\t\t\tconst connection_point = inputConnectionPoints[input_index];\n\t\t\t\t\treturn ThreeToGl.any(connection_point.init_value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow 'variable_for_input ERROR';\n\t}\n\n\t//\n\t//\n\t// ADDED LINES\n\t//\n\t//\n\tsetLines(shaders_collection_controller: ShadersCollectionController) {}\n\n\treset_code() {\n\t\tthis._param_configs_controller?.reset();\n\t\t// this.resetLines();\n\t}\n\n\t//\n\t//\n\t// PARAM CONFIGS\n\t//\n\t//\n\tpublic setParamConfigs() {}\n\tparam_configs() {\n\t\treturn this._param_configs_controller?.list();\n\t}\n\tparamsGenerating() {\n\t\treturn false;\n\t}\n\n\t//\n\t//\n\t// INPUT\n\t//\n\t//\n\toverride paramDefaultValue(name: string): ParamInitValueSerialized {\n\t\treturn null;\n\t}\n}\n\nexport type BaseGlNodeType = TypedGlNode<NodeParamsConfig>;\nexport class BaseGlNodeClass extends TypedGlNode<NodeParamsConfig> {}\n\nclass ParamlessGlParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new ParamlessGlParamsConfig();\nexport class ParamlessTypedGlNode extends TypedGlNode<ParamlessGlParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n}\n","export default \"// https://iquilezles.org/articles/distfunctions/\\n\\n\\n/*\\n*\\n* SDF PRIMITIVES\\n*\\n*/\\nfloat sdSphere( vec3 p, float s )\\n{\\n\\treturn length(p)-s;\\n}\\nfloat sdCutSphere( vec3 p, float r, float h )\\n{\\n\\t// sampling independent computations (only depend on shape)\\n\\tfloat w = sqrt(r*r-h*h);\\n\\n\\t// sampling dependant computations\\n\\tvec2 q = vec2( length(p.xz), p.y );\\n\\tfloat s = max( (h-r)*q.x*q.x+w*w*(h+r-2.0*q.y), h*q.x-w*q.y );\\n\\treturn (s<0.0) ? length(q)-r :\\n\\t\\t\\t\\t(q.x<w) ? h - q.y :\\n\\t\\t\\t\\t\\tlength(q-vec2(w,h));\\n}\\nfloat sdCutHollowSphere( vec3 p, float r, float h, float t )\\n{\\n\\t// sampling independent computations (only depend on shape)\\n\\tfloat w = sqrt(r*r-h*h);\\n\\t\\n\\t// sampling dependant computations\\n\\tvec2 q = vec2( length(p.xz), p.y );\\n\\treturn ((h*q.x<w*q.y) ? length(q-vec2(w,h)) : \\n\\t\\t\\t\\t\\t\\t\\tabs(length(q)-r) ) - t;\\n}\\n\\nfloat sdBox( vec3 p, vec3 b )\\n{\\n\\tvec3 q = abs(p) - b*0.5;\\n\\treturn length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0);\\n}\\nfloat sdRoundBox( vec3 p, vec3 b, float r )\\n{\\n\\tvec3 q = abs(p) - b*0.5;\\n\\treturn length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0) - r;\\n}\\n\\n\\nfloat sdBoxFrame( vec3 p, vec3 b, float e )\\n{\\n\\t\\tp = abs(p  )-b*0.5;\\n\\tvec3 q = abs(p+e)-e;\\n\\treturn min(min(\\n\\t\\tlength(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0),\\n\\t\\tlength(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)),\\n\\t\\tlength(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0));\\n}\\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r )\\n{\\n\\tvec3 pa = p - a, ba = b - a;\\n\\tfloat h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\\n\\treturn length( pa - ba*h ) - r;\\n}\\nfloat sdVerticalCapsule( vec3 p, float h, float r )\\n{\\n\\tp.y -= clamp( p.y, 0.0, h );\\n\\treturn length( p ) - r;\\n}\\nfloat sdCone( in vec3 p, in vec2 c, float h )\\n{\\n\\t// c is the sin/cos of the angle, h is height\\n\\t// Alternatively pass q instead of (c,h),\\n\\t// which is the point at the base in 2D\\n\\tvec2 q = h*vec2(c.x/c.y,-1.0);\\n\\n\\tvec2 w = vec2( length(p.xz), p.y );\\n\\tvec2 a = w - q*clamp( dot(w,q)/dot(q,q), 0.0, 1.0 );\\n\\tvec2 b = w - q*vec2( clamp( w.x/q.x, 0.0, 1.0 ), 1.0 );\\n\\tfloat k = sign( q.y );\\n\\tfloat d = min(dot( a, a ),dot(b, b));\\n\\tfloat s = max( k*(w.x*q.y-w.y*q.x),k*(w.y-q.y)  );\\n\\treturn sqrt(d)*sign(s);\\n}\\nfloat sdConeWrapped(vec3 pos, float angle, float height){\\n\\treturn sdCone(pos, vec2(sin(angle), cos(angle)), height);\\n}\\nfloat sdRoundCone( vec3 p, float r1, float r2, float h )\\n{\\n\\tfloat b = (r1-r2)/h;\\n\\tfloat a = sqrt(1.0-b*b);\\n\\n\\tvec2 q = vec2( length(p.xz), p.y );\\n\\tfloat k = dot(q,vec2(-b,a));\\n\\tif( k<0.0 ) return length(q) - r1;\\n\\tif( k>a*h ) return length(q-vec2(0.0,h)) - r2;\\n\\treturn dot(q, vec2(a,b) ) - r1;\\n}\\nfloat sdOctogonPrism( in vec3 p, in float r, float h )\\n{\\n\\tconst vec3 k = vec3(-0.9238795325,  // sqrt(2+sqrt(2))/2 \\n\\t\\t\\t\\t\\t\\t0.3826834323,   // sqrt(2-sqrt(2))/2\\n\\t\\t\\t\\t\\t\\t0.4142135623 ); // sqrt(2)-1 \\n\\t// reflections\\n\\tp = abs(p);\\n\\tp.xy -= 2.0*min(dot(vec2( k.x,k.y),p.xy),0.0)*vec2( k.x,k.y);\\n\\tp.xy -= 2.0*min(dot(vec2(-k.x,k.y),p.xy),0.0)*vec2(-k.x,k.y);\\n\\t// polygon side\\n\\tp.xy -= vec2(clamp(p.x, -k.z*r, k.z*r), r);\\n\\tvec2 d = vec2( length(p.xy)*sign(p.y), p.z-h );\\n\\treturn min(max(d.x,d.y),0.0) + length(max(d,0.0));\\n}\\nfloat sdHexPrism( vec3 p, vec2 h )\\n{\\n\\tconst vec3 k = vec3(-0.8660254, 0.5, 0.57735);\\n\\tp = abs(p);\\n\\tp.xy -= 2.0*min(dot(k.xy, p.xy), 0.0)*k.xy;\\n\\tvec2 d = vec2(\\n\\t\\tlength(p.xy-vec2(clamp(p.x,-k.z*h.x,k.z*h.x), h.x))*sign(p.y-h.x),\\n\\t\\tp.z-h.y );\\n\\treturn min(max(d.x,d.y),0.0) + length(max(d,0.0));\\n}\\nfloat sdHorseshoe( in vec3 p, in float angle, in float r, in float le, vec2 w )\\n{\\n\\tvec2 c = vec2(cos(angle),sin(angle));\\n\\tp.x = abs(p.x);\\n\\tfloat l = length(p.xy);\\n\\tp.xy = mat2(-c.x, c.y, \\n\\t\\t\\tc.y, c.x)*p.xy;\\n\\tp.xy = vec2((p.y>0.0 || p.x>0.0)?p.x:l*sign(-c.x),\\n\\t\\t\\t\\t(p.x>0.0)?p.y:l );\\n\\tp.xy = vec2(p.x,abs(p.y-r))-vec2(le,0.0);\\n\\t\\n\\tvec2 q = vec2(length(max(p.xy,0.0)) + min(0.0,max(p.x,p.y)),p.z);\\n\\tvec2 d = abs(q) - w;\\n\\treturn min(max(d.x,d.y),0.0) + length(max(d,0.0));\\n}\\nfloat sdTriPrism( vec3 p, vec2 h )\\n{\\n\\tvec3 q = abs(p);\\n\\treturn max(q.z-h.y,max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5);\\n}\\nfloat sdPyramid( vec3 p, float h)\\n{\\n\\tfloat m2 = h*h + 0.25;\\n\\n\\tp.xz = abs(p.xz);\\n\\tp.xz = (p.z>p.x) ? p.zx : p.xz;\\n\\tp.xz -= 0.5;\\n\\n\\tvec3 q = vec3( p.z, h*p.y - 0.5*p.x, h*p.x + 0.5*p.y);\\n\\n\\tfloat s = max(-q.x,0.0);\\n\\tfloat t = clamp( (q.y-0.5*p.z)/(m2+0.25), 0.0, 1.0 );\\n\\n\\tfloat a = m2*(q.x+s)*(q.x+s) + q.y*q.y;\\n\\tfloat b = m2*(q.x+0.5*t)*(q.x+0.5*t) + (q.y-m2*t)*(q.y-m2*t);\\n\\n\\tfloat d2 = min(q.y,-q.x*m2-q.y*0.5) > 0.0 ? 0.0 : min(a,b);\\n\\n\\treturn sqrt( (d2+q.z*q.z)/m2 ) * sign(max(q.z,-p.y));\\n}\\n\\nfloat sdPlane( vec3 p, vec3 n, float h )\\n{\\n\\t// n must be normalized\\n\\treturn dot(p,n) + h;\\n}\\n\\nfloat sdTorus( vec3 p, vec2 t )\\n{\\n\\tvec2 q = vec2(length(p.xz)-t.x,p.y);\\n\\treturn length(q)-t.y;\\n}\\nfloat sdCappedTorus(in vec3 p, in float an, in float ra, in float rb)\\n{\\n\\tvec2 sc = vec2(sin(an),cos(an));\\n\\tp.x = abs(p.x);\\n\\tfloat k = (sc.y*p.x>sc.x*p.z) ? dot(p.xz,sc) : length(p.xz);\\n\\treturn sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;\\n}\\nfloat sdLink( vec3 p, float le, float r1, float r2 )\\n{\\n  vec3 q = vec3( p.x, max(abs(p.y)-le,0.0), p.z );\\n  return length(vec2(length(q.xy)-r1,q.z)) - r2;\\n}\\n// c is the sin/cos of the desired cone angle\\nfloat sdSolidAngle(vec3 pos, vec2 c, float radius)\\n{\\n\\tvec2 p = vec2( length(pos.xz), pos.y );\\n\\tfloat l = length(p) - radius;\\n\\tfloat m = length(p - c*clamp(dot(p,c),0.0,radius) );\\n\\treturn max(l,m*sign(c.y*p.x-c.x*p.y));\\n}\\nfloat sdSolidAngleWrapped(vec3 pos, float angle, float radius){\\n\\treturn sdSolidAngle(pos, vec2(sin(angle), cos(angle)), radius);\\n}\\nfloat sdTube( vec3 p, float r )\\n{\\n\\treturn length(p.xz)-r;\\n}\\nfloat sdTubeCapped( vec3 p, float h, float r )\\n{\\n\\tvec2 d = abs(vec2(length(p.xz),p.y)) - vec2(r,h);\\n\\treturn min(max(d.x,d.y),0.0) + length(max(d,0.0));\\n}\\nfloat sdOctahedron( vec3 p, float s)\\n{\\n  p = abs(p);\\n  float m = p.x+p.y+p.z-s;\\n  vec3 q;\\n       if( 3.0*p.x < m ) q = p.xyz;\\n  else if( 3.0*p.y < m ) q = p.yzx;\\n  else if( 3.0*p.z < m ) q = p.zxy;\\n  else return m*0.57735027;\\n    \\n  float k = clamp(0.5*(q.z-q.y+s),0.0,s); \\n  return length(vec3(q.x,q.y-s+k,q.z-k)); \\n}\\nfloat udTriangle( vec3 p, vec3 a, vec3 b, vec3 c, float thickness )\\n{\\n\\tvec3 ba = b - a; vec3 pa = p - a;\\n\\tvec3 cb = c - b; vec3 pb = p - b;\\n\\tvec3 ac = a - c; vec3 pc = p - c;\\n\\tvec3 nor = cross( ba, ac );\\n\\n\\treturn - thickness + sqrt(\\n\\t\\t(sign(dot(cross(ba,nor),pa)) +\\n\\t\\tsign(dot(cross(cb,nor),pb)) +\\n\\t\\tsign(dot(cross(ac,nor),pc))<2.0)\\n\\t\\t?\\n\\t\\tmin( min(\\n\\t\\tdot2(ba*clamp(dot(ba,pa)/dot2(ba),0.0,1.0)-pa),\\n\\t\\tdot2(cb*clamp(dot(cb,pb)/dot2(cb),0.0,1.0)-pb) ),\\n\\t\\tdot2(ac*clamp(dot(ac,pc)/dot2(ac),0.0,1.0)-pc) )\\n\\t\\t:\\n\\t\\tdot(nor,pa)*dot(nor,pa)/dot2(nor) );\\n}\\nfloat udQuad( vec3 p, vec3 a, vec3 b, vec3 c, vec3 d, float thickness )\\n{\\n\\tvec3 ba = b - a; vec3 pa = p - a;\\n\\tvec3 cb = c - b; vec3 pb = p - b;\\n\\tvec3 dc = d - c; vec3 pc = p - c;\\n\\tvec3 ad = a - d; vec3 pd = p - d;\\n\\tvec3 nor = cross( ba, ad );\\n\\n\\treturn - thickness + sqrt(\\n\\t\\t(sign(dot(cross(ba,nor),pa)) +\\n\\t\\tsign(dot(cross(cb,nor),pb)) +\\n\\t\\tsign(dot(cross(dc,nor),pc)) +\\n\\t\\tsign(dot(cross(ad,nor),pd))<3.0)\\n\\t\\t?\\n\\t\\tmin( min( min(\\n\\t\\tdot2(ba*clamp(dot(ba,pa)/dot2(ba),0.0,1.0)-pa),\\n\\t\\tdot2(cb*clamp(dot(cb,pb)/dot2(cb),0.0,1.0)-pb) ),\\n\\t\\tdot2(dc*clamp(dot(dc,pc)/dot2(dc),0.0,1.0)-pc) ),\\n\\t\\tdot2(ad*clamp(dot(ad,pd)/dot2(ad),0.0,1.0)-pd) )\\n\\t\\t:\\n\\t\\tdot(nor,pa)*dot(nor,pa)/dot2(nor) );\\n}\\n\\n/*\\n*\\n* SDF OPERATIONS\\n*\\n*/\\nfloat SDFUnion( float d1, float d2 ) { return min(d1,d2); }\\nfloat SDFSubtract( float d1, float d2 ) { return max(-d1,d2); }\\nfloat SDFIntersect( float d1, float d2 ) { return max(d1,d2); }\\n\\nfloat SDFSmoothUnion( float d1, float d2, float k ) {\\n\\tfloat h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );\\n\\treturn mix( d2, d1, h ) - k*h*(1.0-h);\\n}\\n\\nfloat SDFSmoothSubtract( float d1, float d2, float k ) {\\n\\tfloat h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );\\n\\treturn mix( d2, -d1, h ) + k*h*(1.0-h);\\n}\\n\\nfloat SDFSmoothIntersect( float d1, float d2, float k ) {\\n\\tfloat h = clamp( 0.5 - 0.5*(d2-d1)/k, 0.0, 1.0 );\\n\\treturn mix( d2, d1, h ) + k*h*(1.0-h);\\n}\\n\\nvec4 SDFElongateFast( in vec3 p, in vec3 h )\\n{\\n\\treturn vec4( p-clamp(p,-h,h), 0.0 );\\n}\\nvec4 SDFElongateSlow( in vec3 p, in vec3 h )\\n{\\n\\tvec3 q = abs(p)-h;\\n\\treturn vec4( max(q,0.0), min(max(q.x,max(q.y,q.z)),0.0) );\\n}\\n\\nfloat SDFOnion( in float sdf, in float thickness )\\n{\\n\\treturn abs(sdf)-thickness;\\n}\"","import {FunctionGLDefinition} from './utils/GLDefinition';\nimport {ShadersCollectionController} from './code/utils/ShadersCollectionController';\nimport {TypedGlNode, BaseGlNodeType} from './_Base';\nimport {ThreeToGl} from '../../../../src/core/ThreeToGl';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport SDFMethodsCommon from './gl/raymarching/sdfCommon.glsl';\nimport SDFMethods from './gl/raymarching/sdf.glsl';\n\nconst VARS = {\n\tposition: 'p',\n};\nclass BaseSDFGlParamsConfig extends NodeParamsConfig {\n\tposition = ParamConfig.VECTOR3([0, 0, 0]);\n}\n\nexport class BaseSDFGlNode<K extends BaseSDFGlParamsConfig> extends TypedGlNode<K> {\n\tprotected position() {\n\t\tconst inputPosition = this.io.inputs.named_input(this.p.position.name());\n\t\tconst position = inputPosition\n\t\t\t? ThreeToGl.vector3(this.variableForInputParam(this.p.position))\n\t\t\t: this._defaultPosition();\n\t\treturn position;\n\t}\n\tprivate _defaultPosition(): string {\n\t\treturn VARS.position;\n\t}\n\n\tprotected _addSDFMethods(shadersCollectionController: ShadersCollectionController) {\n\t\tBaseSDFGlNode.addSDFMethods(shadersCollectionController, this);\n\t}\n\tstatic addSDFMethods(shadersCollectionController: ShadersCollectionController, node: BaseGlNodeType) {\n\t\tshadersCollectionController.addDefinitions(node, [new FunctionGLDefinition(node, SDFMethodsCommon)]);\n\t\tshadersCollectionController.addDefinitions(node, [new FunctionGLDefinition(node, SDFMethods)]);\n\t}\n}\n","import {ShaderMaterial, Material, IUniform, WebGLProgramParametersWithUniforms} from 'three';\nimport {PolyScene} from '../../../../../scene/PolyScene';\nimport {GlParamConfig, GlParamConfigJSON} from '../../utils/GLParamConfig';\nimport {ParamType} from '../../../../../poly/ParamType';\nimport {PolyDictionary} from '../../../../../../types/GlobalTypes';\nimport {IUniformTexture} from '../../../../utils/code/gl/Uniforms';\n\nexport interface OnBeforeCompileData {\n\tvertexShader: string;\n\tfragmentShader: string;\n\tparamConfigs: readonly GlParamConfig<ParamType>[];\n\t// additionalUniformNames: string[];\n\tadditionalTextureUniforms: PolyDictionary<IUniformTexture>;\n\ttimeDependent: boolean;\n\tresolutionDependent: boolean;\n\traymarchingLightsWorldCoordsDependent: boolean;\n}\ninterface CloneOptions {\n\tclonedParamConfigName: string;\n\tclonedParamConfig?: GlParamConfig<ParamType>;\n}\nexport function cloneOnBeforeCompileData(data: OnBeforeCompileData, options: CloneOptions): OnBeforeCompileData {\n\tconst {clonedParamConfigName} = options;\n\tlet {clonedParamConfig} = options;\n\tconst json = OnBeforeCompileDataConverter.toJSON(data);\n\tconst clonedData = OnBeforeCompileDataConverter.fromJSON(json);\n\n\tconst preservedParamConfigs = data.paramConfigs.filter((p) => p.name() != clonedParamConfigName);\n\n\tif (!clonedParamConfig) {\n\t\tclonedParamConfig = clonedData.paramConfigs.find((p) => p.name() == clonedParamConfigName);\n\t}\n\n\tconst paramConfigs = preservedParamConfigs;\n\tif (clonedParamConfig) {\n\t\tparamConfigs.push(clonedParamConfig);\n\t}\n\treturn {\n\t\t...clonedData,\n\t\tparamConfigs,\n\t};\n}\n\n// from https://www.typescriptlang.org/docs/handbook/2/mapped-types.html\ntype RemoveParamConfigField<Type> = {\n\t[Property in keyof Type as Exclude<Property, 'paramConfigs' | 'additionalTextureUniforms'>]: Type[Property];\n};\nexport interface OnBeforeCompileDataJSON extends RemoveParamConfigField<OnBeforeCompileData> {\n\tparamConfigs: GlParamConfigJSON<ParamType>[];\n}\ntype OnBeforeCompile = (shader: WebGLProgramParametersWithUniforms) => void;\n\nexport function assignUniformViaUserData(material: Material, uniformName: string, newUniform: IUniformTexture) {\n\tconst uniforms = MaterialUserDataUniforms.getUniforms(material);\n\tif (uniforms) {\n\t\tconst currentUniform = uniforms[uniformName];\n\t\tif (currentUniform) {\n\t\t\tcurrentUniform.value = newUniform.value;\n\t\t} else {\n\t\t\tuniforms[uniformName] = newUniform;\n\t\t}\n\t} else {\n\t\t// if there are no uniforms, the material has not been compiled yet.\n\t\t// we therefore must add those to userData so that they are picked up in onBeforeCompile.\n\t\t// For instance, this can be the case for materials assigned to particles, when run without assemblers.\n\t\t// Since the assembler is responsible for assigning the additionalTextures, this is not done when they are not loaded.\n\t\t// But for this to work, we also need to make sure that the persistedConfig will not contain the uniforms in the userData\n\t\t// so those must be stripped out when saving it\n\t\tOnBeforeCompileDataHandler.addAdditionalTexture(material, uniformName, newUniform);\n\t}\n}\n\nexport class MaterialUserDataUniforms {\n\tstatic getUniforms(material: Material): PolyDictionary<IUniform> | undefined {\n\t\treturn material.userData?.uniforms || (material as ShaderMaterial).uniforms;\n\t}\n\tstatic setUniforms(material: Material, uniforms: PolyDictionary<IUniform>) {\n\t\tmaterial.userData.uniforms = uniforms;\n\t}\n\tstatic removeUniforms(material: Material) {\n\t\tconst uniforms = this.getUniforms(material);\n\t\tif (uniforms) {\n\t\t\tconst userData = material.userData;\n\t\t\tdelete userData['uniforms'];\n\t\t}\n\t\treturn uniforms;\n\t}\n}\n\nexport function assignOnBeforeCompileDataAndFunction(scene: PolyScene, material: Material, data: OnBeforeCompileData) {\n\tOnBeforeCompileDataHandler.setData(material, data);\n\tmaterial.onBeforeCompile = _createOnBeforeCompile(scene, material);\n\t// it is important that customProgramCacheKey is also set when there are no assemblers\n\t// as otherwise the material will all use the same key, and will override each other\n\tconst key = `${material.uuid}:${performance.now()}`;\n\tmaterial.customProgramCacheKey = () => key;\n}\ninterface CopyParams {\n\tsrc: Material;\n\tdest: Material;\n\tshareCustomUniforms: boolean;\n}\nexport function copyOnBeforeCompileData(scene: PolyScene, params: CopyParams) {\n\tconst {src, dest, shareCustomUniforms} = params;\n\tconst data = OnBeforeCompileDataHandler.getData(src);\n\tif (data) {\n\t\tfunction cloneData(data: OnBeforeCompileData) {\n\t\t\tconst json = OnBeforeCompileDataConverter.toJSON(data);\n\t\t\treturn OnBeforeCompileDataConverter.fromJSON(json);\n\t\t}\n\t\tconst newData = shareCustomUniforms ? data : cloneData(data);\n\t\tassignOnBeforeCompileDataAndFunction(scene, dest, newData);\n\t}\n}\n\nfunction _createOnBeforeCompile(scene: PolyScene, material: Material): OnBeforeCompile {\n\tconst onBeforeCompile = (shader: WebGLProgramParametersWithUniforms) => {\n\t\tconst data = OnBeforeCompileDataHandler.getData(material);\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tconst {\n\t\t\tvertexShader,\n\t\t\tfragmentShader,\n\t\t\tparamConfigs,\n\t\t\tadditionalTextureUniforms,\n\t\t\ttimeDependent,\n\t\t\tresolutionDependent,\n\t\t\traymarchingLightsWorldCoordsDependent,\n\t\t} = data;\n\t\tshader.vertexShader = vertexShader;\n\t\tshader.fragmentShader = fragmentShader;\n\t\tscene.uniformsController.addUniforms(shader.uniforms, {\n\t\t\tparamConfigs,\n\t\t\tadditionalTextureUniforms,\n\t\t\ttimeDependent,\n\t\t\tresolutionDependent,\n\t\t\traymarchingLightsWorldCoordsDependent,\n\t\t});\n\n\t\t// also add to the material itself so that the material is easy to debug in the console, as well as in tests\n\t\tconst shaderMaterial = material as ShaderMaterial;\n\t\tshaderMaterial.vertexShader = shader.vertexShader;\n\t\tshaderMaterial.fragmentShader = shader.fragmentShader;\n\t\tMaterialUserDataUniforms.setUniforms(material, shader.uniforms);\n\t\t// saving the compilations count here\n\t\t// seems to have side effects and make tests fail.\n\t\t// so not using it for now\n\t\t// shaderMaterial.userData.compilationsCount = shaderMaterial.userData.compilationsCount || 0;\n\t\t// shaderMaterial.userData.compilationsCount++;\n\t};\n\n\treturn onBeforeCompile;\n}\n\nexport class OnBeforeCompileDataHandler {\n\tstatic setData(material: Material, data: OnBeforeCompileData) {\n\t\tmaterial.userData.onBeforeCompileData = data;\n\t}\n\tstatic addAdditionalTexture(material: Material, uniformName: string, newUniform: IUniformTexture) {\n\t\tconst data = this.getData(material);\n\t\tif (data) {\n\t\t\tconst currentUniform = data.additionalTextureUniforms[uniformName];\n\t\t\tif (currentUniform == null) {\n\t\t\t\tdata.additionalTextureUniforms[uniformName] = newUniform;\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('no data found on material', material);\n\t\t}\n\t}\n\tstatic getData(material: Material): OnBeforeCompileData | undefined {\n\t\treturn material.userData.onBeforeCompileData;\n\t}\n\tstatic removeData(material: Material): OnBeforeCompileData | undefined {\n\t\tconst data = this.getData(material);\n\t\tif (data) {\n\t\t\tconst userData = material.userData;\n\t\t\tdelete userData['onBeforeCompileData'];\n\t\t}\n\t\treturn data;\n\t}\n}\n\nexport class OnBeforeCompileDataConverter {\n\tstatic toJSON(onBeforeCompileData: OnBeforeCompileData): OnBeforeCompileDataJSON {\n\t\tconst onBeforeCompileDataJSON: OnBeforeCompileDataJSON = {\n\t\t\tvertexShader: onBeforeCompileData.vertexShader,\n\t\t\tfragmentShader: onBeforeCompileData.fragmentShader,\n\t\t\ttimeDependent: onBeforeCompileData.timeDependent,\n\t\t\tresolutionDependent: onBeforeCompileData.resolutionDependent,\n\t\t\traymarchingLightsWorldCoordsDependent: onBeforeCompileData.raymarchingLightsWorldCoordsDependent,\n\t\t\tparamConfigs: onBeforeCompileData.paramConfigs.map((pc) => pc.toJSON()),\n\t\t};\n\t\treturn onBeforeCompileDataJSON;\n\t}\n\tstatic fromJSON(json: OnBeforeCompileDataJSON): OnBeforeCompileData {\n\t\tconst onBeforeCompileData: OnBeforeCompileData = {\n\t\t\t...json,\n\t\t\tadditionalTextureUniforms: {},\n\t\t\tparamConfigs: json.paramConfigs.map((json) => GlParamConfig.fromJSON(json)),\n\t\t};\n\t\treturn onBeforeCompileData;\n\t}\n}\n","export enum GlobalsOutput {\n\tTIME = 'time',\n\tRESOLUTION = 'resolution',\n\tMV_POSITION = 'mvPosition',\n\tGL_POSITION = 'gl_Position',\n\tGL_FRAGCOORD = 'gl_FragCoord',\n\tGL_POINTCOORD = 'gl_PointCoord',\n\tGL_POINTSIZE = 'gl_PointSize',\n\tWORLD_POSITION = 'worldPosition',\n\tWORLD_NORMAL = 'worldNormal',\n\tMODEL_MATRIX = 'modelMatrix', // object.matrixWorld\n\tMODEL_VIEW_MATRIX = 'modelViewMatrix', // object.modelViewMatrix\n\tNORMAL_MATRIX = 'normalMatrix', // object.normalMatrix\n}\n","export enum GlobalsBaseControllerType {\n\tGEOMETRY = 'geometry',\n\tTEXTURE = 'texture',\n}\n","import {GlobalsBaseController} from './_Base';\nimport {GlobalsGlNode} from '../../Globals';\nimport {AttributeGlNode} from '../../Attribute';\n// import {Definition} from '../../Definition/_Module';\n// import {DefinitionBaseConfig} from '../Config/DefinitionBaseConfig';\n// import {BaseGlNodeType} from '../../_Base';\nimport {VaryingGLDefinition, AttributeGLDefinition} from '../../utils/GLDefinition';\nimport {GlConnectionPointType} from '../../../utils/io/connections/Gl';\n// import {TypeAssert} from '../../../../poly/Assert';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {ShaderName} from '../../../utils/shaders/ShaderName';\nimport {BaseGlNodeType} from '../../_Base';\nimport {ShadersCollectionController} from '../utils/ShadersCollectionController';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\nimport {GlobalsOutput} from '../assemblers/materials/common/GlobalOutput';\nimport {GlobalsBaseControllerType} from './Common';\n\nconst VARIABLE_CONFIG_DEFAULT_BY_NAME: PolyDictionary<string> = {\n\tposition: 'vec3( position )',\n};\n\nexport class GlobalsGeometryHandler extends GlobalsBaseController {\n\tstatic PRE_DEFINED_ATTRIBUTES = [\n\t\t'position',\n\t\t'color',\n\t\t'normal',\n\t\t'uv',\n\t\t'uv2',\n\t\t'morphTarget0',\n\t\t'morphTarget1',\n\t\t'morphTarget2',\n\t\t'morphTarget3',\n\t\t'skinIndex',\n\t\t'skinWeight',\n\t];\n\n\tstatic IF_RULE = {\n\t\tuv: 'defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )',\n\t};\n\n\ttype() {\n\t\treturn GlobalsBaseControllerType.GEOMETRY;\n\t}\n\n\toverride handleGlobalsNode(\n\t\tglobals_node: GlobalsGlNode,\n\t\toutput_name: string,\n\t\tshaders_collection_controller: ShadersCollectionController\n\t\t// definitions_by_shader_name: Map<ShaderName, BaseGLDefinition[]>,\n\t\t// body_lines_by_shader_name: Map<ShaderName, string[]>,\n\t\t// body_lines: string[],\n\t\t// dependencies: ShaderName[],\n\t\t// shader_name: ShaderName\n\t): void {\n\t\tconst connection_point = globals_node.io.outputs.namedOutputConnectionPointsByName(output_name);\n\t\tif (!connection_point) {\n\t\t\treturn;\n\t\t}\n\t\tconst glType = connection_point.type();\n\n\t\tthis.handleGlobalVar(globals_node, output_name, glType, shaders_collection_controller);\n\t}\n\toverride handleGlobalVar(\n\t\tglobals_node: BaseGlNodeType,\n\t\toutput_name: string,\n\t\tglType: GlConnectionPointType,\n\t\tshaders_collection_controller: ShadersCollectionController\n\t): void {\n\t\tconst var_name = globals_node.glVarName(output_name);\n\t\tconst definition = new VaryingGLDefinition(globals_node, glType, var_name);\n\n\t\t// push_on_array_at_entry(definitions_by_shader_name, shader_name, definition);\n\t\tshaders_collection_controller.addDefinitions(globals_node, [definition]);\n\t\t// definitions_by_shader_name.get(shader_name)!.push(definition);\n\t\tconst assembler = globals_node.materialNode()?.assemblerController()?.assembler;\n\t\tif (!assembler) {\n\t\t\treturn;\n\t\t}\n\t\tconst shader_config = assembler.shader_config(shaders_collection_controller.currentShaderName());\n\t\tif (!shader_config) {\n\t\t\treturn;\n\t\t}\n\t\tconst dependencies = shader_config.dependencies();\n\n\t\tconst body_lines: string[] = [];\n\t\tconst worldPositionLine = `${var_name} = modelMatrix * vec4( position, 1.0 )`;\n\t\tconst worldNormalLine = `${var_name} = normalize( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal )`;\n\t\t// const ILine = `${var_name} = worldPosition.xyz - cameraPosition`;\n\t\tswitch (output_name) {\n\t\t\tcase GlobalsOutput.WORLD_POSITION: {\n\t\t\t\tbody_lines.push(worldPositionLine);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase GlobalsOutput.WORLD_NORMAL: {\n\t\t\t\tbody_lines.push(worldNormalLine);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// case 'I': {\n\t\t\t// \tbody_lines.push(worldPositionLine);\n\t\t\t// \tbody_lines.push(ILine);\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\tdefault: {\n\t\t\t\tbody_lines.push(`${var_name} = ${glType}(${output_name})`);\n\t\t\t}\n\t\t}\n\t\tfor (const dependency of dependencies) {\n\t\t\t// push_on_array_at_entry(definitions_by_shader_name, dependency, definition);\n\t\t\t// push_on_array_at_entry(body_lines_by_shader_name, dependency, body_line);\n\t\t\tshaders_collection_controller.addDefinitions(globals_node, [definition], dependency);\n\t\t\tshaders_collection_controller.addBodyLines(globals_node, body_lines, dependency);\n\t\t}\n\t\tif (dependencies.length == 0) {\n\t\t\t// body_lines.push(body_line);\n\t\t\tshaders_collection_controller.addBodyLines(globals_node, body_lines);\n\t\t}\n\t}\n\n\tstatic variable_config_default(variable_name: string): string | undefined {\n\t\treturn VARIABLE_CONFIG_DEFAULT_BY_NAME[variable_name];\n\t}\n\tvariable_config_default(variable_name: string): string | undefined {\n\t\treturn GlobalsGeometryHandler.variable_config_default(variable_name);\n\t}\n\t// variable_config_required_definitions(variable_name:string):DefinitionBaseConfig[]{\n\t// \treturn null\n\t// }\n\treadAttribute(\n\t\tnode: BaseGlNodeType,\n\t\tgl_type: GlConnectionPointType,\n\t\tattrib_name: string,\n\t\tshaders_collection_controller: ShadersCollectionController\n\t) {\n\t\treturn GlobalsGeometryHandler.readAttribute(node, gl_type, attrib_name, shaders_collection_controller);\n\t}\n\n\tstatic readAttribute(\n\t\tnode: BaseGlNodeType,\n\t\tgl_type: GlConnectionPointType,\n\t\tattrib_name: string,\n\t\tshaders_collection_controller: ShadersCollectionController\n\t): string | undefined {\n\t\tif (GlobalsGeometryHandler.PRE_DEFINED_ATTRIBUTES.indexOf(attrib_name) < 0) {\n\t\t\tshaders_collection_controller.addDefinitions(\n\t\t\t\tnode,\n\t\t\t\t[new AttributeGLDefinition(node, gl_type, attrib_name)],\n\t\t\t\tShaderName.VERTEX\n\t\t\t);\n\t\t} else {\n\t\t\t// const if_rule = GlobalsGeometryHandler.IF_RULE[attrib_name]\n\t\t\t// if(if_rule){\n\t\t\t// \tconst definition = new Definition.Attribute(node, gl_type, attrib_name)\n\t\t\t// \tdefinition.set_if_rule(if_rule)\n\t\t\t// \tnode.addDefinitions([definition])\n\t\t\t// }\n\t\t}\n\n\t\t// if (!shader_name) {\n\t\t// \tthrow 'no shader name';\n\t\t// }\n\t\tconst shader_name = shaders_collection_controller.currentShaderName();\n\t\tswitch (shader_name) {\n\t\t\tcase ShaderName.VERTEX: {\n\t\t\t\treturn attrib_name;\n\t\t\t}\n\t\t\tcase ShaderName.FRAGMENT: {\n\t\t\t\t// let's assume it can only be an attribute gl node\n\t\t\t\tif (!(node instanceof AttributeGlNode)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst attribNode = node as AttributeGlNode;\n\n\t\t\t\tconst var_name = attribNode.varyingName(); //'varying_' + node.glVarName(node.outputName());\n\t\t\t\tconst varying_definition = new VaryingGLDefinition(node, gl_type, var_name);\n\n\t\t\t\tconst definitions_by_shader_name: Map<ShaderName, VaryingGLDefinition[]> = new Map();\n\t\t\t\t// definitions_by_shader_name.set(ShaderName.VERTEX, [])\n\t\t\t\tdefinitions_by_shader_name.set(ShaderName.FRAGMENT, []);\n\t\t\t\t// {\n\t\t\t\t// \t[ShaderName.VERTEX]: [],\n\t\t\t\t// \t[ShaderName.FRAGMENT]: [],\n\t\t\t\t// };\n\t\t\t\tconst body_lines_by_shader_name: Map<ShaderName, string[]> = new Map();\n\t\t\t\t// body_lines_by_shader_name.set(ShaderName.VERTEX, [])\n\t\t\t\tbody_lines_by_shader_name.set(ShaderName.FRAGMENT, []);\n\t\t\t\tpushOnArrayAtEntry(definitions_by_shader_name, shader_name, varying_definition);\n\n\t\t\t\tconst set_varying_body_line = `${var_name} = ${gl_type}(${attrib_name})`;\n\n\t\t\t\tconst shader_config = node.materialNode()?.assemblerController()?.assembler.shader_config(shader_name);\n\t\t\t\tif (shader_config) {\n\t\t\t\t\tconst dependencies = shader_config.dependencies();\n\t\t\t\t\tfor (const dependency of dependencies) {\n\t\t\t\t\t\tpushOnArrayAtEntry(definitions_by_shader_name, dependency, varying_definition);\n\t\t\t\t\t\tpushOnArrayAtEntry(body_lines_by_shader_name, dependency, set_varying_body_line);\n\t\t\t\t\t}\n\t\t\t\t\tdefinitions_by_shader_name.forEach((definitions, shader_name) => {\n\t\t\t\t\t\tshaders_collection_controller.addDefinitions(node, definitions, shader_name);\n\t\t\t\t\t});\n\t\t\t\t\tbody_lines_by_shader_name.forEach((body_lines, shader_name) => {\n\t\t\t\t\t\tshaders_collection_controller.addBodyLines(node, body_lines, shader_name);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn var_name;\n\t\t\t}\n\t\t}\n\t\t// TypeAssert.unreachable(shader_name);\n\n\t\t// const shader_name = node._shader_name // TODO: this is hack\n\t\t// const varying_definition = new Definition.Varying(node, gl_type, attrib_name)\n\t\t// const var_name = varying_definition.name()\n\t\t// definitions_by_shader_name[shader_name].push(varying_definition)\n\t\t// const shader_config = node.shader_config(shader_name)\n\t\t// const dependencies = shader_config.dependencies()\n\t\t// const body_line = `${var_name} = ${gl_type}(${attrib_name})`\n\t\t// for(let dependency of dependencies){\n\t\t// \tdefinitions_by_shader_name[dependency].push(varying_definition)\n\t\t// \tbody_lines_by_shader_name[dependency].push(body_line)\n\t\t// }\n\t\t// // if(dependencies.length == 0){\n\t\t// \t// body_lines.push(body_line)\n\t\t// \tnode.addBodyLines([body_line])\n\t\t// // }\n\t\t// for(let shader_name of Object.keys(definitions_by_shader_name)){\n\t\t// \tnode.addDefinitions(definitions_by_shader_name[shader_name], shader_name)\n\t\t// }\n\t\t// for(let shader_name of Object.keys(body_lines_by_shader_name)){\n\t\t// \tnode.addBodyLines(body_lines_by_shader_name[shader_name], shader_name)\n\t\t// }\n\t\t// node.addBodyLines(body_lines)\n\t}\n\thandle_attribute_node(\n\t\tnode: AttributeGlNode,\n\t\tgl_type: GlConnectionPointType,\n\t\tattrib_name: string,\n\t\tshaders_collection_controller: ShadersCollectionController\n\t) {\n\t\treturn GlobalsGeometryHandler.readAttribute(node, gl_type, attrib_name, shaders_collection_controller);\n\t}\n}\n","import {GlobalsBaseController} from './_Base';\nimport {GlobalsGlNode} from '../../Globals';\nimport {BaseGlNodeType} from '../../_Base';\n// import {Definition} from '../../Definition/_Module'\n// import { VariableConfig } from '../Config/VariableConfig';\nimport {TextureAllocationsController} from '../utils/TextureAllocationsController';\nimport {GlobalsGeometryHandler} from './Geometry';\nimport {ShaderName} from '../../../utils/shaders/ShaderName';\nimport {UniformGLDefinition, AttributeGLDefinition, VaryingGLDefinition} from '../../utils/GLDefinition';\nimport {GlConnectionPointType} from '../../../utils/io/connections/Gl';\nimport {ShadersCollectionController} from '../utils/ShadersCollectionController';\nimport {TextureVariable} from '../utils/TextureVariable';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {GlobalsBaseControllerType} from './Common';\n\n// import {DefinitionBaseConfig} from '../Config/DefinitionBaseConfig'\n// import {UniformConfig} from '../Config/UniformConfig'\n// import {AttributeConfig} from '../Config/AttributeConfig'\n// import { Attribute } from '../../Attribute';\n\nexport enum GlobalsTextureHandlerPurpose {\n\tPARTICLES_SHADER = 'particles_shader',\n\tMATERIAL = 'material',\n}\nexport interface GlobalsTextureHandlerData {\n\ttextureName: string;\n\tcomponent: string;\n\tuvName: string;\n}\n\nexport class GlobalsTextureHandler extends GlobalsBaseController {\n\tprivate _textureAllocationsController: TextureAllocationsController | undefined;\n\n\tstatic PARTICLES_SIM_UV_ATTRIB = 'particlesSimUv';\n\tstatic UV_VARYING = 'particlesSimUvVarying';\n\tstatic PARTICLE_SIM_UV = 'particleUv';\n\n\tprivate _globalsGeometryHandler: GlobalsGeometryHandler | undefined;\n\n\tconstructor(private _uvName: string, private _purpose: GlobalsTextureHandlerPurpose) {\n\t\tsuper();\n\t}\n\ttype() {\n\t\treturn GlobalsBaseControllerType.TEXTURE;\n\t}\n\n\tset_texture_allocations_controller(controller: TextureAllocationsController) {\n\t\tthis._textureAllocationsController = controller;\n\t}\n\n\toverride handleGlobalsNode(\n\t\tglobals_node: GlobalsGlNode,\n\t\toutput_name: string,\n\t\tshaders_collection_controller: ShadersCollectionController\n\t\t// definitions_by_shader_name: Map<ShaderName, BaseGLDefinition[]>,\n\t\t// body_lines_by_shader_name: Map<ShaderName, string[]>,\n\t\t// body_lines: string[],\n\t\t// dependencies: ShaderName[],\n\t\t// shader_name: ShaderName\n\t) {\n\t\tif (!this._textureAllocationsController) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst connection_point = globals_node.io.outputs.namedOutputConnectionPointsByName(output_name);\n\t\tconst var_name = globals_node.glVarName(output_name);\n\n\t\tconst variable = this._textureAllocationsController.variable(output_name);\n\n\t\tif (variable && connection_point) {\n\t\t\tconst gl_type = connection_point.type();\n\t\t\tconst new_value = this.readAttribute(globals_node, gl_type, output_name, shaders_collection_controller);\n\t\t\tconst body_line = `${gl_type} ${var_name} = ${new_value}`;\n\t\t\tshaders_collection_controller.addBodyLines(globals_node, [body_line]);\n\t\t} else {\n\t\t\tthis._globalsGeometryHandler = this._globalsGeometryHandler || new GlobalsGeometryHandler();\n\t\t\tthis._globalsGeometryHandler.handleGlobalsNode(globals_node, output_name, shaders_collection_controller);\n\t\t}\n\t}\n\n\tprivate _textureVariableUsable(textureVariable: TextureVariable) {\n\t\tswitch (this._purpose) {\n\t\t\tcase GlobalsTextureHandlerPurpose.PARTICLES_SHADER: {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcase GlobalsTextureHandlerPurpose.MATERIAL: {\n\t\t\t\treturn !textureVariable.readonly();\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(this._purpose);\n\t}\n\n\tattribTextureData(attribName: string): GlobalsTextureHandlerData | undefined {\n\t\tif (!this._textureAllocationsController) {\n\t\t\tconsole.warn('no texture allocation controller');\n\t\t\treturn;\n\t\t}\n\t\tconst textureVariable = this._textureAllocationsController.variable(attribName);\n\t\tif (textureVariable && this._textureVariableUsable(textureVariable)) {\n\t\t\tconst allocation = textureVariable.allocation();\n\t\t\tif (allocation) {\n\t\t\t\tconst component = textureVariable.component();\n\t\t\t\tconst attribTextureName = allocation.textureName();\n\t\t\t\treturn {\n\t\t\t\t\ttextureName: attribTextureName,\n\t\t\t\t\tcomponent: component,\n\t\t\t\t\tuvName: this._uvName,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\treadAttribute(\n\t\tnode: BaseGlNodeType,\n\t\tgl_type: GlConnectionPointType,\n\t\tattribName: string,\n\t\tshadersCollectionController: ShadersCollectionController\n\t) {\n\t\tif (!this._textureAllocationsController) {\n\t\t\tconsole.warn('no texture allocation controller');\n\t\t\treturn;\n\t\t}\n\t\t// attrib_name = GlobalsTextureHandler.remap_instance_attribute(attrib_name)\n\n\t\tconst textureVariable = this._textureAllocationsController.variable(attribName);\n\t\tif (textureVariable && this._textureVariableUsable(textureVariable)) {\n\t\t\tthis.addParticlesSimUvAttribute(node, shadersCollectionController);\n\n\t\t\tconst textureData = this.attribTextureData(attribName);\n\t\t\tif (textureData) {\n\t\t\t\tconst {textureName, component, uvName} = textureData;\n\t\t\t\tconst texture_definition = new UniformGLDefinition(node, GlConnectionPointType.SAMPLER_2D, textureName);\n\t\t\t\t// definitions_by_shader_name[shader_name].push(texture_definition)\n\n\t\t\t\tshadersCollectionController.addDefinitions(node, [texture_definition]);\n\n\t\t\t\tconst body_line = `texture2D( ${textureName}, ${uvName} ).${component}`;\n\t\t\t\treturn body_line;\n\t\t\t}\n\t\t} else {\n\t\t\treturn GlobalsGeometryHandler.readAttribute(node, gl_type, attribName, shadersCollectionController);\n\t\t}\n\t}\n\n\taddParticlesSimUvAttribute(node: BaseGlNodeType, shaders_collection_controller: ShadersCollectionController) {\n\t\t// const shader_names = ['vertex', 'fragment'];\n\t\t// const definitions_by_shader_name:Map<ShaderName, BaseGLDefinition[]> = new Map();\n\t\t// definitions_by_shader_name.set(ShaderName.VERTEX, [])\n\t\t// definitions_by_shader_name.set(ShaderName.FRAGMENT, [])\n\t\t// for (let shader_name of shader_names) {\n\t\t// \tdefinitions_by_shader_name[shader_name] = [];\n\t\t// }\n\n\t\tconst particlesSimUvAttribDefinition = new AttributeGLDefinition(\n\t\t\tnode,\n\t\t\tGlConnectionPointType.VEC2,\n\t\t\tGlobalsTextureHandler.PARTICLES_SIM_UV_ATTRIB\n\t\t);\n\t\tconst particlesSimUvVaryingDefinition = new VaryingGLDefinition(\n\t\t\tnode,\n\t\t\tGlConnectionPointType.VEC2,\n\t\t\tGlobalsTextureHandler.UV_VARYING\n\t\t);\n\n\t\tshaders_collection_controller.addDefinitions(\n\t\t\tnode,\n\t\t\t[particlesSimUvAttribDefinition, particlesSimUvVaryingDefinition],\n\t\t\tShaderName.VERTEX\n\t\t);\n\t\tshaders_collection_controller.addDefinitions(node, [particlesSimUvVaryingDefinition], ShaderName.FRAGMENT);\n\n\t\tshaders_collection_controller.addBodyLines(\n\t\t\tnode,\n\t\t\t[`${GlobalsTextureHandler.UV_VARYING} = ${GlobalsTextureHandler.PARTICLES_SIM_UV_ATTRIB}`],\n\t\t\tShaderName.VERTEX\n\t\t);\n\t}\n}\n","import {GlobalsGlNode} from '../../Globals';\nimport {GlConnectionPointType} from '../../../utils/io/connections/Gl';\nimport {BaseGlNodeType} from '../../_Base';\nimport {ShadersCollectionController} from '../utils/ShadersCollectionController';\nimport {GlobalsBaseControllerType} from './Common';\n\nexport abstract class GlobalsBaseController {\n\t// private static __nextId: number = 0;\n\t// private _id: number;\n\n\t// constructor() {\n\t// \tthis._id = GlobalsBaseController.__nextId++;\n\t// }\n\t// id() {\n\t// \treturn this._id;\n\t// }\n\tabstract type(): GlobalsBaseControllerType;\n\n\thandleGlobalsNode(\n\t\tglobalsNode: GlobalsGlNode,\n\t\toutputName: string,\n\t\tshadersCollectionController: ShadersCollectionController\n\t\t// definitions_by_shader_name: Map<ShaderName, BaseGLDefinition[]>,\n\t\t// body_lines_by_shader_name: Map<ShaderName, string[]>,\n\t\t// body_lines: string[],\n\t\t// dependencies: ShaderName[],\n\t\t// shader_name: ShaderName\n\t): void {}\n\n\thandleGlobalVar(\n\t\tglobalsNode: BaseGlNodeType,\n\t\toutputName: string,\n\t\tglType: GlConnectionPointType,\n\t\tshadersCollectionController: ShadersCollectionController\n\t): void {}\n\n\tabstract readAttribute(\n\t\tnode: BaseGlNodeType,\n\t\tglType: GlConnectionPointType,\n\t\tattribName: string,\n\t\tshadersCollectionController: ShadersCollectionController\n\t): string | undefined;\n}\n","import {ShaderName} from '../../../utils/shaders/ShaderName';\nimport {BaseGLDefinition} from '../../utils/GLDefinition';\nimport {BaseGlNodeType} from '../../_Base';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {CoreGraphNodeId} from '../../../../../core/graph/CoreGraph';\n\nexport type DefinitionTraverseCallback = (definition: BaseGLDefinition) => void;\n// export type BodyLinesTraverseCallback = (lines: string[]) => void;\n\nexport interface AddBodyLinesOptions {\n\tmakeUniq: boolean;\n}\nexport class LinesController {\n\tprivate _definitionsByNodeId: Map<CoreGraphNodeId, BaseGLDefinition[]> = new Map();\n\tprivate _bodyLinesByNodeId: Map<CoreGraphNodeId, string[]> = new Map();\n\n\tconstructor(private _shader_name: ShaderName) {}\n\n\tget shader_name() {\n\t\treturn this._shader_name;\n\t}\n\n\t// merge(otherLinesController: LinesController) {\n\t// \tconsole.log('merge start');\n\t// \totherLinesController._definitionsByNodeId.forEach((definitions, nodeId) => {\n\t// \t\tthis._addDefinitionsForNodeId(nodeId, definitions);\n\t// \t});\n\t// \totherLinesController._bodyLinesByNodeId.forEach((lines, nodeId) => {\n\t// \t\tthis._addBodyLinesForNodeId(nodeId, lines);\n\t// \t});\n\t// \tconsole.log('merge end');\n\t// }\n\n\taddDefinitions(node: BaseGlNodeType, definitions: BaseGLDefinition[]) {\n\t\tthis._addDefinitionsForNodeId(node.graphNodeId(), definitions);\n\t}\n\tprivate _addDefinitionsForNodeId(nodeId: CoreGraphNodeId, definitions: BaseGLDefinition[]) {\n\t\tfor (const definition of definitions) {\n\t\t\tpushOnArrayAtEntry(this._definitionsByNodeId, nodeId, definition);\n\t\t}\n\t}\n\tdefinitions(node: BaseGlNodeType): BaseGLDefinition[] | undefined {\n\t\treturn this._definitionsByNodeId.get(node.graphNodeId());\n\t}\n\ttraverseDefinitions(callback: DefinitionTraverseCallback) {\n\t\tthis._definitionsByNodeId.forEach((definitions) => {\n\t\t\tfor (const definition of definitions) {\n\t\t\t\tcallback(definition);\n\t\t\t}\n\t\t});\n\t}\n\t// all_definition_nodes(scene: PolyScene) {\n\t// \tconst nodes: BaseGlNodeType[] = [];\n\t// \tthis._definitions_by_node_id.forEach((lines, node_id) => {\n\t// \t\tconst node = scene.graph.node_from_id(node_id) as BaseGlNodeType;\n\t// \t\tnodes.push(node);\n\t// \t});\n\t// \treturn nodes;\n\t// }\n\n\taddBodyLines(node: BaseGlNodeType, lines: string[], options?: AddBodyLinesOptions) {\n\t\tthis._addBodyLinesForNodeId(node.graphNodeId(), lines);\n\t}\n\tprivate _addBodyLinesForNodeId(nodeId: CoreGraphNodeId, lines: string[], options?: AddBodyLinesOptions) {\n\t\tlet makeUniq = true;\n\t\tif (options && options.makeUniq != null) {\n\t\t\tmakeUniq = options.makeUniq;\n\t\t}\n\n\t\tconst linesToUsed: string[] = [];\n\t\tif (makeUniq) {\n\t\t\tconst currentLines = this._bodyLinesByNodeId.get(nodeId);\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (currentLines) {\n\t\t\t\t\tif (!currentLines.includes(line)) {\n\t\t\t\t\t\tlinesToUsed.push(line);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlinesToUsed.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const line of lines) {\n\t\t\t\tlinesToUsed.push(line);\n\t\t\t}\n\t\t}\n\n\t\tfor (const line of linesToUsed) {\n\t\t\tpushOnArrayAtEntry(this._bodyLinesByNodeId, nodeId, line);\n\t\t}\n\t}\n\tbodyLines(node: BaseGlNodeType): string[] | undefined {\n\t\treturn this._bodyLinesByNodeId.get(node.graphNodeId());\n\t}\n\t// traverseBodyLines(callback: BodyLinesTraverseCallback) {\n\t// \tthis._bodyLinesByNodeId.forEach((lines) => {\n\t// \t\tcallback(lines);\n\t// \t});\n\t// }\n\t// all_body_line_nodes(scene: PolyScene) {\n\t// \tconst nodes: BaseGlNodeType[] = [];\n\t// \tthis._body_lines_by_node_id.forEach((lines, node_id) => {\n\t// \t\tconst node = scene.graph.node_from_id(node_id) as BaseGlNodeType;\n\t// \t\tnodes.push(node);\n\t// \t});\n\t// \treturn nodes;\n\t// }\n}\n","import {ShaderName} from '../../../utils/shaders/ShaderName';\nimport {BaseGLDefinition} from '../../utils/GLDefinition';\nimport {LinesController, DefinitionTraverseCallback, AddBodyLinesOptions} from './LinesController';\nimport {BaseGlNodeType} from '../../_Base';\nimport {TypedAssembler} from '../../../utils/shaders/BaseAssembler';\nimport {NodeContext} from '../../../../poly/NodeContext';\n\nexport class ShadersCollectionController {\n\tprivate _linesControllerByShaderName: Map<ShaderName, LinesController> = new Map();\n\n\tconstructor(\n\t\tprivate _shaderNames: ShaderName[],\n\t\tprivate _currentShaderName: ShaderName,\n\t\tprivate _assembler: TypedAssembler<NodeContext.GL>\n\t) {\n\t\tfor (const shaderName of this._shaderNames) {\n\t\t\tthis._linesControllerByShaderName.set(shaderName, new LinesController(shaderName));\n\t\t}\n\t}\n\n\t// mergeDefinitions(shadersCollectionController: ShadersCollectionController) {\n\t// \tfor (let shaderName of this._shaderNames) {\n\t// \t\t// this._linesControllerByShaderName.set(shaderName, new LinesController(shaderName));\n\t// \t\tshadersCollectionController.traverseDefinitions(shaderName, (definition: BaseGLDefinition) => {\n\t// \t\t\tthis.addDefinitions(definition.node, [definition], shaderName);\n\t// \t\t\tconsole.log('add', definition.node, definition);\n\t// \t\t});\n\t// \t}\n\t// }\n\n\tassembler() {\n\t\treturn this._assembler;\n\t}\n\n\tlinesController(shaderName: ShaderName) {\n\t\treturn this._linesControllerByShaderName.get(shaderName);\n\t}\n\n\tshaderNames() {\n\t\treturn this._shaderNames;\n\t}\n\n\tsetCurrentShaderName(shaderName: ShaderName) {\n\t\tthis._currentShaderName = shaderName;\n\t}\n\tcurrentShaderName() {\n\t\treturn this._currentShaderName;\n\t}\n\n\taddDefinitions(node: BaseGlNodeType, definitions: BaseGLDefinition[], shaderName?: ShaderName) {\n\t\tif (definitions.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tshaderName = shaderName || this._currentShaderName;\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\tlinesController.addDefinitions(node, definitions);\n\t\t}\n\t}\n\tdefinitions(shaderName: ShaderName, node: BaseGlNodeType) {\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\treturn linesController.definitions(node);\n\t\t}\n\t}\n\ttraverseDefinitions(shaderName: ShaderName, callback: DefinitionTraverseCallback) {\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\tlinesController.traverseDefinitions(callback);\n\t\t}\n\t}\n\t// all_definition_nodes(shader_name: ShaderName, scene: PolyScene) {\n\t// \treturn this._lines_controller_by_shader_name.get(shader_name)?.all_definition_nodes(scene) || [];\n\t// }\n\n\taddBodyLines(node: BaseGlNodeType, lines: string[], shaderName?: ShaderName, options?: AddBodyLinesOptions) {\n\t\tif (lines.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tshaderName = shaderName || this._currentShaderName;\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\tlinesController.addBodyLines(node, lines, options);\n\t\t}\n\t}\n\tbodyLines(shaderName: ShaderName, node: BaseGlNodeType) {\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\treturn linesController.bodyLines(node);\n\t\t}\n\t}\n\t// traverseBodyLines(shaderName: ShaderName, callback: BodyLinesTraverseCallback) {\n\t// \tconst lines_controller = this._linesControllerByShaderName.get(shaderName);\n\t// \tif (lines_controller) {\n\t// \t\treturn lines_controller.traverseBodyLines(callback);\n\t// \t}\n\t// }\n\t// all_body_line_nodes(shader_name: ShaderName, scene: PolyScene) {\n\t// \treturn this._lines_controller_by_shader_name.get(shader_name)?.all_body_line_nodes(scene) || [];\n\t// }\n}\n","import {BaseGlNodeType} from '../../_Base';\nimport {TypedNodeTraverser} from '../../../utils/shaders/NodeTraverser';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {ShaderName} from '../../../utils/shaders/ShaderName';\nimport {GLDefinitionType, BaseGLDefinition} from '../../utils/GLDefinition';\nimport {TypedGLDefinitionCollection} from '../../utils/GLDefinitionCollection';\nimport {ParamConfigsController} from '../../../../nodes/utils/code/controllers/ParamConfigsController';\nimport {ShadersCollectionController} from './ShadersCollectionController';\nimport {CodeFormatter} from './CodeFormatter';\n\nimport {LineType} from './LineType';\nimport {GlParamConfig} from './GLParamConfig';\nimport {ParamType} from '../../../../poly/ParamType';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {CoreGraphNodeId} from '../../../../../core/graph/CoreGraph';\nimport {arrayUniq} from '../../../../../core/ArrayUtils';\nimport {TypedAssembler} from '../../../utils/shaders/BaseAssembler';\n\ntype RootNodesForShaderMethod = (shader_name: ShaderName, rootNodes: BaseGlNodeType[]) => BaseGlNodeType[];\n// let nextId = 1;\n\nexport interface CodeBuilderSetCodeLinesOptions {\n\totherFragmentShaderCollectionController?: ShadersCollectionController;\n}\n\nexport class CodeBuilder {\n\t// private _id = (nextId += 1);\n\tprivate _param_configs_controller: ParamConfigsController<GlParamConfig<ParamType>> = new ParamConfigsController();\n\tprivate _param_configs_set_allowed: boolean = true;\n\n\tprivate _shadersCollectionController: ShadersCollectionController | undefined;\n\tprivate _lines: Map<ShaderName, Map<LineType, string[]>> = new Map();\n\t// _function_declared: Map<ShaderName, Map<string, boolean>> = new Map();\n\n\tconstructor(\n\t\tprivate _nodeTraverser: TypedNodeTraverser<NodeContext.GL>,\n\t\tprivate _root_nodes_for_shader_method: RootNodesForShaderMethod,\n\t\tprivate _assembler: TypedAssembler<NodeContext.GL>\n\t) {}\n\tnodeTraverser() {\n\t\treturn this._nodeTraverser;\n\t}\n\tshaderNames() {\n\t\treturn this._nodeTraverser.shaderNames();\n\t}\n\tbuildFromNodes(\n\t\trootNodes: BaseGlNodeType[],\n\t\tparamNodes: BaseGlNodeType[],\n\t\tsetCodeLinesOptions?: CodeBuilderSetCodeLinesOptions\n\t) {\n\t\tthis._nodeTraverser.traverse(rootNodes);\n\n\t\tconst nodesByShaderName: Map<ShaderName, BaseGlNodeType[]> = new Map();\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst nodes = this._nodeTraverser.nodesForShaderName(shaderName);\n\t\t\tnodesByShaderName.set(shaderName, nodes);\n\t\t}\n\t\tconst sortedNodes = this._nodeTraverser.sortedNodes();\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst rootNodesForShader = this._root_nodes_for_shader_method(shaderName, rootNodes);\n\n\t\t\tfor (const rootNode of rootNodesForShader) {\n\t\t\t\tpushOnArrayAtEntry(nodesByShaderName, shaderName, rootNode);\n\t\t\t}\n\t\t}\n\n\t\t// ensure nodes are not added if already present\n\t\tconst sorted_node_ids: Map<CoreGraphNodeId, boolean> = new Map();\n\t\tfor (const node of sortedNodes) {\n\t\t\tsorted_node_ids.set(node.graphNodeId(), true);\n\t\t}\n\n\t\tfor (const rootNode of rootNodes) {\n\t\t\tif (!sorted_node_ids.get(rootNode.graphNodeId())) {\n\t\t\t\tsortedNodes.push(rootNode);\n\t\t\t\tsorted_node_ids.set(rootNode.graphNodeId(), true);\n\t\t\t}\n\t\t}\n\t\tfor (const node of sortedNodes) {\n\t\t\tnode.reset_code();\n\t\t}\n\t\tfor (const node of paramNodes) {\n\t\t\tnode.reset_code();\n\t\t}\n\t\t// for (let node of sorted_nodes) {\n\t\t// \tawait node.params.eval_all();\n\t\t// }\n\n\t\t// const param_promises = sorted_nodes.map(node=>{\n\t\t// \treturn node.eval_all_params()\n\t\t// })\n\t\t// await Promise.all(param_promises)\n\n\t\tthis._shadersCollectionController = new ShadersCollectionController(\n\t\t\tthis.shaderNames(),\n\t\t\tthis.shaderNames()[0],\n\t\t\tthis._assembler\n\t\t);\n\t\tthis.reset();\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst nodes: BaseGlNodeType[] = [];\n\t\t\tconst nonUniqNodes = nodesByShaderName.get(shaderName);\n\t\t\tif (nonUniqNodes) {\n\t\t\t\tarrayUniq(nonUniqNodes, nodes);\n\t\t\t}\n\n\t\t\tthis._shadersCollectionController.setCurrentShaderName(shaderName);\n\t\t\tif (nodes) {\n\t\t\t\tfor (const node of nodes) {\n\t\t\t\t\tnode.setLines(this._shadersCollectionController);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// set param configs\n\t\tif (this._param_configs_set_allowed) {\n\t\t\tfor (const param_node of paramNodes) {\n\t\t\t\ttry {\n\t\t\t\t\tparam_node.states.error.clear();\n\t\t\t\t\tparam_node.setParamConfigs();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message: string = (err as any).message || 'failed to create spare param';\n\t\t\t\t\tparam_node.states.error.set(message);\n\t\t\t\t\tthrow new Error(`${param_node.name()} cannot create spare parameter`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.setParamConfigs(paramNodes);\n\t\t}\n\n\t\t// finalize\n\t\tthis._setCodeLines(sortedNodes, setCodeLinesOptions);\n\t}\n\n\tshadersCollectionController() {\n\t\treturn this._shadersCollectionController;\n\t}\n\n\tdisallow_new_param_configs() {\n\t\tthis._param_configs_set_allowed = false;\n\t}\n\tallow_new_param_configs() {\n\t\tthis._param_configs_set_allowed = true;\n\t}\n\n\tprivate reset() {\n\t\tfor (const shader_name of this.shaderNames()) {\n\t\t\tconst lines_map = new Map();\n\t\t\t// for (let line_type of LINE_TYPES) {\n\t\t\t// \tlines_map.set(line_type, []);\n\t\t\t// }\n\t\t\tthis._lines.set(shader_name, lines_map);\n\t\t\t// this._function_declared.set(shader_name, new Map());\n\t\t}\n\t}\n\n\tparam_configs() {\n\t\treturn this._param_configs_controller.list() || [];\n\t}\n\tlines(shader_name: ShaderName, line_type: LineType) {\n\t\treturn this._lines.get(shader_name)?.get(line_type) || [];\n\t}\n\tall_lines() {\n\t\treturn this._lines;\n\t}\n\n\tsetParamConfigs(nodes: BaseGlNodeType[]) {\n\t\tthis._param_configs_controller.reset();\n\t\tfor (const node of nodes) {\n\t\t\tconst param_configs = node.param_configs();\n\t\t\tif (param_configs) {\n\t\t\t\tfor (const param_config of param_configs) {\n\t\t\t\t\tthis._param_configs_controller.push(param_config);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _setCodeLines(nodes: BaseGlNodeType[], options?: CodeBuilderSetCodeLinesOptions) {\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst additionalDefinitions: BaseGLDefinition[] = [];\n\t\t\tif (shaderName == ShaderName.FRAGMENT) {\n\t\t\t\tif (this._shadersCollectionController && options && options.otherFragmentShaderCollectionController) {\n\t\t\t\t\t// for (let shaderName of options.otherShadersCollectionController.shaderNames()) {\n\t\t\t\t\t// this._linesControllerByShaderName.set(shaderName, new LinesController(shaderName));\n\t\t\t\t\toptions.otherFragmentShaderCollectionController.traverseDefinitions(\n\t\t\t\t\t\tShaderName.FRAGMENT,\n\t\t\t\t\t\t(definition: BaseGLDefinition) => {\n\t\t\t\t\t\t\tadditionalDefinitions.push(definition);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._addCodeLines(nodes, shaderName, additionalDefinitions);\n\t\t}\n\t}\n\n\tprivate _addCodeLines(nodes: BaseGlNodeType[], shaderName: ShaderName, additionalDefinitions?: BaseGLDefinition[]) {\n\t\tthis.addDefinitions(nodes, shaderName, GLDefinitionType.PRECISION, LineType.DEFINE, additionalDefinitions);\n\t\tthis.addDefinitions(\n\t\t\tnodes,\n\t\t\tshaderName,\n\t\t\tGLDefinitionType.FUNCTION,\n\t\t\tLineType.FUNCTION_DECLARATION,\n\t\t\tadditionalDefinitions\n\t\t);\n\t\tthis.addDefinitions(nodes, shaderName, GLDefinitionType.UNIFORM, LineType.DEFINE, additionalDefinitions);\n\t\tthis.addDefinitions(nodes, shaderName, GLDefinitionType.VARYING, LineType.DEFINE, additionalDefinitions);\n\t\tthis.addDefinitions(nodes, shaderName, GLDefinitionType.ATTRIBUTE, LineType.DEFINE, additionalDefinitions);\n\n\t\tthis.add_code_line_for_nodes_and_line_type(nodes, shaderName, LineType.BODY);\n\t}\n\n\tprivate addDefinitions(\n\t\tnodes: BaseGlNodeType[],\n\t\tshaderName: ShaderName,\n\t\tdefinitionType: GLDefinitionType,\n\t\tlineType: LineType,\n\t\tadditionalDefinitions?: BaseGLDefinition[]\n\t) {\n\t\tif (!this._shadersCollectionController) {\n\t\t\treturn;\n\t\t}\n\t\tconst definitions: BaseGLDefinition[] = [];\n\t\tfor (const node of nodes) {\n\t\t\tlet nodeDefinitions = this._shadersCollectionController.definitions(shaderName, node);\n\t\t\tif (nodeDefinitions) {\n\t\t\t\tnodeDefinitions = nodeDefinitions.filter((d) => d.definition_type == definitionType);\n\t\t\t\tfor (const definition of nodeDefinitions) {\n\t\t\t\t\tdefinitions.push(definition);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (additionalDefinitions) {\n\t\t\tconst filteredAdditionalDefinitions = additionalDefinitions.filter(\n\t\t\t\t(d) => d.definition_type == definitionType\n\t\t\t);\n\t\t\tfor (const definition of filteredAdditionalDefinitions) {\n\t\t\t\tdefinitions.push(definition);\n\t\t\t}\n\t\t}\n\n\t\tif (definitions.length > 0) {\n\t\t\tconst collection = new TypedGLDefinitionCollection<GLDefinitionType>(definitions);\n\t\t\tconst uniqDefinitions = collection.uniq();\n\t\t\tif (collection.errored) {\n\t\t\t\t// TODO: handle error\n\t\t\t\tthrow `code builder error: ${collection.error_message}`;\n\t\t\t}\n\n\t\t\tconst definitions_by_node_id: Map<CoreGraphNodeId, BaseGLDefinition[]> = new Map();\n\t\t\tconst nodeIds: Map<CoreGraphNodeId, boolean> = new Map();\n\t\t\tfor (const definition of uniqDefinitions) {\n\t\t\t\tconst nodeId = definition.node.graphNodeId();\n\t\t\t\tif (!nodeIds.has(nodeId)) {\n\t\t\t\t\tnodeIds.set(nodeId, true);\n\t\t\t\t}\n\t\t\t\tpushOnArrayAtEntry(definitions_by_node_id, nodeId, definition);\n\t\t\t}\n\t\t\tconst lines_for_shader = this._lines.get(shaderName)!;\n\t\t\tnodeIds.forEach((_, nodeId) => {\n\t\t\t\tconst definitions = definitions_by_node_id.get(nodeId);\n\t\t\t\tif (definitions) {\n\t\t\t\t\tconst first_definition = definitions[0];\n\n\t\t\t\t\tif (first_definition) {\n\t\t\t\t\t\tconst comment = CodeFormatter.nodeComment(first_definition.node, lineType);\n\t\t\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, comment);\n\n\t\t\t\t\t\tfor (const definition of definitions) {\n\t\t\t\t\t\t\tconst line = CodeFormatter.lineWrap(first_definition.node, definition.line, lineType);\n\t\t\t\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, line);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst separator = CodeFormatter.post_line_separator(lineType);\n\t\t\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, separator);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tadd_code_line_for_nodes_and_line_type(nodes: BaseGlNodeType[], shader_name: ShaderName, line_type: LineType) {\n\t\tnodes = nodes.filter((node) => {\n\t\t\tif (this._shadersCollectionController) {\n\t\t\t\tconst lines = this._shadersCollectionController.bodyLines(shader_name, node);\n\t\t\t\treturn lines && lines.length > 0;\n\t\t\t}\n\t\t});\n\n\t\tvar nodes_count = nodes.length;\n\t\tfor (let i = 0; i < nodes_count; i++) {\n\t\t\tconst is_last = i == nodes.length - 1;\n\t\t\tthis.add_code_line_for_node_and_line_type(nodes[i], shader_name, line_type, is_last);\n\t\t}\n\t}\n\tadd_code_line_for_node_and_line_type(\n\t\tnode: BaseGlNodeType,\n\t\tshader_name: ShaderName,\n\t\tline_type: LineType,\n\t\tis_last: boolean\n\t): void {\n\t\tif (!this._shadersCollectionController) {\n\t\t\treturn;\n\t\t}\n\t\tconst lines = this._shadersCollectionController.bodyLines(shader_name, node);\n\n\t\tif (lines && lines.length > 0) {\n\t\t\tconst lines_for_shader = this._lines.get(shader_name)!;\n\t\t\tconst comment = CodeFormatter.nodeComment(node, line_type);\n\t\t\tpushOnArrayAtEntry(lines_for_shader, line_type, comment);\n\t\t\tlines.forEach((line) => {\n\t\t\t\tline = CodeFormatter.lineWrap(node, line, line_type);\n\t\t\t\tpushOnArrayAtEntry(lines_for_shader, line_type, line);\n\t\t\t});\n\t\t\tif (!(line_type == LineType.BODY && is_last)) {\n\t\t\t\tconst separator = CodeFormatter.post_line_separator(line_type);\n\t\t\t\tpushOnArrayAtEntry(lines_for_shader, line_type, separator);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseGlNodeType} from '../../_Base';\nimport {LineType} from './LineType';\nimport {BaseNodeType} from '../../../_Base';\nimport {NetworkChildNodeType} from '../../../../poly/NodeContext';\n\nconst LINE_SUFFIXES = {\n\t[LineType.FUNCTION_DECLARATION]: '',\n\t[LineType.DEFINE]: ';',\n\t[LineType.BODY]: ';',\n};\n\nconst LINE_PREFIXES = {\n\t[LineType.FUNCTION_DECLARATION]: '',\n\t[LineType.DEFINE]: '',\n\t[LineType.BODY]: '\t',\n};\nconst BLOCK_START_LAST_CHAR = '{';\nconst BLOCK_END_LAST_CHAR = '}';\n\nexport class CodeFormatter {\n\tstatic nodeComment(node: BaseGlNodeType, lineType: LineType): string {\n\t\tlet line = `// ${node.path()}`;\n\t\tlet prefix: string = LINE_PREFIXES[lineType];\n\t\tif (lineType == LineType.BODY) {\n\t\t\tlet distance = this.nodeDistanceToMaterial(node);\n\t\t\t// special case for subnet_output, so that the comment is offset correctly\n\t\t\tif (node.type() == NetworkChildNodeType.OUTPUT) {\n\t\t\t\tdistance += 1;\n\t\t\t}\n\t\t\tprefix = prefix.repeat(distance);\n\t\t}\n\t\tif (lineType == LineType.BODY) {\n\t\t\tline = `${prefix}${line}`;\n\t\t}\n\t\treturn line;\n\t}\n\tstatic lineWrap(node: BaseGlNodeType, line: string, lineType: LineType) {\n\t\tlet add_suffix = true;\n\t\tif (\n\t\t\tline.includes('#if') ||\n\t\t\tline.includes('#else') ||\n\t\t\tline.includes('#endif') ||\n\t\t\tline.includes('#pragma unroll_loop_')\n\t\t) {\n\t\t\tadd_suffix = false;\n\t\t}\n\t\tlet prefix: string = LINE_PREFIXES[lineType];\n\t\tif (lineType == LineType.BODY) {\n\t\t\tprefix = prefix.repeat(this.nodeDistanceToMaterial(node));\n\t\t}\n\t\tline = `${prefix}${line}`;\n\t\tif (add_suffix) {\n\t\t\tconst last_char = line[line.length - 1];\n\t\t\tconst suffix = LINE_SUFFIXES[lineType];\n\t\t\tconst lineIsEmpty = line.trim().length == 0;\n\t\t\tconst lineIsComment = line.trim().startsWith('//');\n\t\t\tif (\n\t\t\t\tlast_char != suffix &&\n\t\t\t\tlast_char != BLOCK_START_LAST_CHAR &&\n\t\t\t\tlast_char != BLOCK_END_LAST_CHAR &&\n\t\t\t\t!lineIsEmpty &&\n\t\t\t\t!lineIsComment\n\t\t\t) {\n\t\t\t\tline += suffix;\n\t\t\t}\n\t\t}\n\t\treturn line;\n\t}\n\tstatic post_line_separator(lineType: LineType) {\n\t\treturn lineType == LineType.BODY ? '\t' : '';\n\t}\n\n\tstatic nodeDistanceToMaterial(node: BaseNodeType): number {\n\t\tconst parent = node.parent();\n\t\tif (!parent) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (parent.context() != node.context()) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 1 + this.nodeDistanceToMaterial(parent);\n\t\t\t// we do not have an offset of 1 for subnet_input and subnet_output\n\t\t\t// so that those nodes can control the tabs themselves in setLines()\n\t\t\t// let offset = 1;\n\t\t\t// if (node.type() == NetworkChildNodeType.INPUT || node.type() == NetworkChildNodeType.OUTPUT) {\n\t\t\t// \toffset = 0;\n\t\t\t// }\n\t\t\t// return offset + this.node_distance_to_material(parent);\n\t\t}\n\t}\n}\n","import {ShaderChunk} from 'three';\n\nexport function expandShader(shaderString: string) {\n\tfunction parseIncludes(string: string) {\n\t\tconst pattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\t\tfunction replace(match: string, include: string): string {\n\t\t\tconst replace = ShaderChunk[include as keyof typeof ShaderChunk];\n\n\t\t\tif (replace === undefined) {\n\t\t\t\tthrow new Error('Can not resolve #include <' + include + '>');\n\t\t\t}\n\n\t\t\treturn parseIncludes(replace);\n\t\t}\n\n\t\treturn string.replace(pattern, replace);\n\t}\n\treturn parseIncludes(shaderString);\n}\n","import {IUniform, Color, Vector2, Vector3, Vector4} from 'three';\nimport {ParamType} from '../../../../poly/ParamType';\nimport {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';\nimport {BaseNodeType} from '../../../_Base';\nimport {BaseParamType} from '../../../../params/_Base';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {RampParam} from '../../../../params/Ramp';\nimport {BaseParamConfig} from '../../../utils/code/configs/BaseParamConfig';\nimport {NodePathParam} from '../../../../params/NodePath';\nimport {NodeContext} from '../../../../poly/NodeContext';\n\nexport interface GlParamConfigJSON<T extends ParamType> {\n\ttype: T;\n\tname: string;\n\tdefaultValue: ParamInitValuesTypeMap[T];\n\tuniformName: string;\n}\nexport class GlParamConfig<T extends ParamType> extends BaseParamConfig<T> {\n\tprivate _uniform: IUniform | undefined;\n\n\tconstructor(_type: T, _name: string, _defaultValue: ParamInitValuesTypeMap[T], private _uniformName: string) {\n\t\tsuper(_type, _name, _defaultValue);\n\t}\n\n\ttoJSON(): GlParamConfigJSON<T> {\n\t\treturn {\n\t\t\ttype: this._type,\n\t\t\tname: this._name,\n\t\t\tdefaultValue: this._defaultValue,\n\t\t\tuniformName: this._uniformName,\n\t\t};\n\t}\n\tstatic fromJSON(json: GlParamConfigJSON<ParamType>): GlParamConfig<ParamType> {\n\t\treturn new GlParamConfig(json.type, json.name, json.defaultValue, json.uniformName);\n\t}\n\n\tuniformName() {\n\t\treturn this._uniformName;\n\t}\n\n\tuniform() {\n\t\treturn (this._uniform = this._uniform || this._createUniform());\n\t}\n\n\tprivate _createUniform() {\n\t\treturn GlParamConfig.uniformByType(this._type);\n\t}\n\n\tprotected override _callback(node: BaseNodeType, param: BaseParamType) {\n\t\tGlParamConfig.callback(param, this.uniform());\n\t\t// switch (param.type) {\n\t\t// \tcase ParamType.RAMP:\n\t\t// \t\tthis.uniform.value = (param as RampParam).rampTexture();\n\t\t// \t\treturn;\n\t\t// \tcase ParamType.OPERATOR_PATH:\n\t\t// \t\tGlParamConfig.set_uniform_value_from_texture(param as OperatorPathParam, this.uniform);\n\t\t// \t\treturn;\n\t\t// \tdefault:\n\t\t// \t\tthis.uniform.value = param.value;\n\t\t// }\n\t}\n\n\tstatic callback(param: BaseParamType, uniform: IUniform) {\n\t\tswitch (param.type()) {\n\t\t\tcase ParamType.RAMP:\n\t\t\t\tuniform.value = (param as RampParam).rampTexture();\n\t\t\t\treturn;\n\t\t\t// case ParamType.OPERATOR_PATH:\n\t\t\t// \tGlParamConfig.set_uniform_value_from_texture(param as OperatorPathParam, uniform);\n\t\t\t// \treturn;\n\t\t\tcase ParamType.NODE_PATH:\n\t\t\t\tGlParamConfig.setUniformValueFromTextureFromNodePathParam(param as NodePathParam, uniform);\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tuniform.value = param.value;\n\t\t}\n\t}\n\n\t// TODO: refactor that to use the default values map?\n\tstatic uniformByType(type: ParamType): IUniform {\n\t\tswitch (type) {\n\t\t\tcase ParamType.BOOLEAN:\n\t\t\t\treturn {value: 0};\n\t\t\tcase ParamType.BUTTON:\n\t\t\t\treturn {value: 0};\n\t\t\tcase ParamType.COLOR:\n\t\t\t\treturn {value: new Color(0, 0, 0)};\n\t\t\tcase ParamType.FLOAT:\n\t\t\t\treturn {value: 0};\n\t\t\tcase ParamType.FOLDER:\n\t\t\t\treturn {value: 0};\n\t\t\tcase ParamType.INTEGER:\n\t\t\t\treturn {value: 0};\n\t\t\t// case ParamType.OPERATOR_PATH:\n\t\t\t// \treturn {value: 0};\n\t\t\tcase ParamType.NODE_PATH:\n\t\t\t\treturn {value: 0};\n\t\t\tcase ParamType.PARAM_PATH:\n\t\t\t\treturn {value: 0};\n\t\t\t// case ParamType.STRING: return {type: 't', value: null} // new Texture()}\n\t\t\tcase ParamType.RAMP:\n\t\t\t\treturn {value: null}; // new Texture()}\n\t\t\tcase ParamType.STRING:\n\t\t\t\treturn {value: null};\n\t\t\tcase ParamType.VECTOR2:\n\t\t\t\treturn {value: new Vector2(0, 0)};\n\t\t\tcase ParamType.VECTOR3:\n\t\t\t\treturn {value: new Vector3(0, 0, 0)};\n\t\t\tcase ParamType.VECTOR4:\n\t\t\t\treturn {value: new Vector4(0, 0, 0, 0)};\n\t\t}\n\t\tTypeAssert.unreachable(type);\n\t}\n\n\t// private static set_uniform_value_from_texture(param: OperatorPathParam, uniform: IUniform) {\n\t// \tconst found_node = param.found_node();\n\t// \tif (found_node) {\n\t// \t\tif (found_node.isDirty()) {\n\t// \t\t\tfound_node.compute().then((container) => {\n\t// \t\t\t\tconst texture = container.texture();\n\t// \t\t\t\tuniform.value = texture;\n\t// \t\t\t});\n\t// \t\t} else {\n\t// \t\t\tconst container = found_node.containerController.container();\n\t// \t\t\tconst texture = container.texture();\n\t// \t\t\tuniform.value = texture;\n\t// \t\t}\n\t// \t} else {\n\t// \t\tuniform.value = null;\n\t// \t}\n\t// }\n\tprivate static async setUniformValueFromTextureFromNodePathParam(param: NodePathParam, uniform: IUniform) {\n\t\tif (param.isDirty()) {\n\t\t\tawait param.compute();\n\t\t}\n\t\tconst node = param.value.nodeWithContext(NodeContext.COP);\n\t\tif (node) {\n\t\t\tif (node.isDirty()) {\n\t\t\t\tawait node.compute();\n\t\t\t}\n\t\t\tconst container = node.containerController.container();\n\t\t\tconst texture = container.texture();\n\t\t\tuniform.value = texture;\n\t\t} else {\n\t\t\tuniform.value = null;\n\t\t}\n\t}\n}\n","export enum LineType {\n\tFUNCTION_DECLARATION = 'function_declaration',\n\tDEFINE = 'define',\n\tBODY = 'body',\n}\n","import {GlType} from './../../../../poly/registers/nodes/types/Gl';\nimport {NodeContext} from './../../../../poly/NodeContext';\nimport {BaseGlParentNode} from '../Controller';\nimport {BaseGlNodeType} from '../../_Base';\n\nexport class GlNodeFinder {\n\tstatic findOutputNodes(node: BaseGlParentNode) {\n\t\tconst output_nodes = node.nodesByType(GlType.OUTPUT);\n\t\treturn output_nodes;\n\t}\n\tstatic findParamGeneratingNodes(node: BaseGlParentNode) {\n\t\tconst list: BaseGlNodeType[] = [];\n\t\tnode.childrenController?.traverseChildren(\n\t\t\t(child) => {\n\t\t\t\tconst childGlNode = child as BaseGlNodeType;\n\t\t\t\tif (childGlNode.paramsGenerating()) {\n\t\t\t\t\tlist.push(childGlNode);\n\t\t\t\t}\n\t\t\t},\n\t\t\t(child) => {\n\t\t\t\tif (!child.childrenController) {\n\t\t\t\t\treturn child.context() == NodeContext.GL;\n\t\t\t\t} else {\n\t\t\t\t\treturn child.context() == NodeContext.GL && child.childrenController.context == NodeContext.GL;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\treturn list;\n\t}\n\tstatic findVaryingNodes(node: BaseGlParentNode) {\n\t\tconst nodes = node.nodesByType(GlType.VARYING_WRITE);\n\t\treturn nodes;\n\t}\n\tstatic findAttributeExportNodes(node: BaseGlParentNode) {\n\t\tconst nodes = node.nodesByType(GlType.ATTRIBUTE);\n\t\treturn nodes.filter((node) => {\n\t\t\t// do not use attributes that are used as an input, as export\n\t\t\t// return (node.used_output_names().length == 0) &&\n\t\t\treturn node.isExporting();\n\t\t});\n\t}\n\tstatic findAjacencyNodes(node: BaseGlParentNode) {\n\t\tconst nodes = node.nodesByType(GlType.ADJACENT_POINTS_ATTRIB_SMOOTH);\n\t\treturn nodes;\n\t}\n}\n","import {GlType} from './../../../../poly/registers/nodes/types/Gl';\nimport {TextureVariable, TextureVariableData} from './TextureVariable';\nimport {BaseGlNodeType} from '../../_Base';\nimport {PolyScene} from '../../../../scene/PolyScene';\nimport {AttributeGlNode} from '../../Attribute';\nimport {ShaderName} from '../../../utils/shaders/ShaderName';\nexport type TextureAllocationData = TextureVariableData[];\n\nexport const TEXTURE_ALLOCATION_PREFIX = 'texture_';\nexport const TEXTURE_ALLOCATION_NAMES_SEPARATOR = '_x_';\n\nexport class TextureAllocation {\n\tprivate _variables: TextureVariable[] | undefined;\n\tprivate _size: number = 0;\n\n\tconstructor(/*private _shader_name: ShaderName*/) {}\n\n\taddVariable(variable: TextureVariable) {\n\t\tthis._variables = this._variables || [];\n\t\tthis._variables.push(variable);\n\t\tvariable.setPosition(this._size);\n\t\tvariable.setAllocation(this);\n\t\tthis._size += variable.size();\n\t}\n\n\thasSpaceForVariable(variable: TextureVariable): boolean {\n\t\treturn this._size + variable.size() <= 4;\n\t}\n\n\tshaderName() {\n\t\t// return this._shader_name; //this._variables[0].name()\n\t\tconst names = this.variables()?.map((v) => v.name()) || ['no_variables_allocated'];\n\t\treturn names.join(TEXTURE_ALLOCATION_NAMES_SEPARATOR) as ShaderName;\n\t}\n\ttextureName(): string {\n\t\treturn `${TEXTURE_ALLOCATION_PREFIX}${this.shaderName()}`;\n\t}\n\n\tvariables(): TextureVariable[] | undefined {\n\t\treturn this._variables;\n\t}\n\tvariablesForInputNode(root_node: BaseGlNodeType): TextureVariable[] | undefined {\n\t\treturn this._variables?.filter((variable) => variable.graphNodeIds()?.has(root_node.graphNodeId()) || false);\n\t}\n\tinputNamesForNode(root_node: BaseGlNodeType): string[] | undefined {\n\t\tconst variables = this.variablesForInputNode(root_node);\n\t\tif (variables) {\n\t\t\tif (root_node.type() == GlType.ATTRIBUTE) {\n\t\t\t\t// if the AttributeGlNode exports an attribute called restP,\n\t\t\t\t// the variable will be named also restP.\n\t\t\t\t// And the input of the AttributeGlNode will not be called restP,\n\t\t\t\t// so I need to make sure I only return the actual name of its input here\n\t\t\t\treturn [AttributeGlNode.INPUT_NAME];\n\t\t\t} else {\n\t\t\t\treturn variables.map((v) => v.name());\n\t\t\t}\n\t\t}\n\t\t// return ?.map((v) => v.name);\n\t}\n\t// find_variable_with_node(root_node: BaseNodeGl, input_name: string): TextureVariable{\n\t// \treturn this.variables_for_input_node(root_node).filter(v=>v.name() == input_name)[0]\n\t// }\n\t// find_variable_without_node(input_name: string): TextureVariable{\n\t// \treturn this._variables.filter(v=>v.name() == input_name)[0]\n\t// }\n\tvariable(variable_name: string) {\n\t\tif (this._variables) {\n\t\t\tfor (const variable of this._variables) {\n\t\t\t\tif (variable.name() == variable_name) {\n\t\t\t\t\treturn variable;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic fromJSON(data: TextureAllocationData): TextureAllocation {\n\t\tconst texture_allocation = new TextureAllocation();\n\t\tfor (const datum of data) {\n\t\t\tconst texture_variable = TextureVariable.fromJSON(datum);\n\t\t\ttexture_allocation.addVariable(texture_variable);\n\t\t}\n\t\treturn texture_allocation;\n\t}\n\n\ttoJSON(scene: PolyScene): TextureAllocationData {\n\t\tif (this._variables) {\n\t\t\treturn this._variables.map((v) => v.toJSON(scene));\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t\t// for(let variable of this._variables){\n\t\t// \tdata[variable.name()] = variable.toJSON(scene)\n\t\t// }\n\t\t// return data\n\t}\n}\n","import {TextureAllocation, TextureAllocationData} from './TextureAllocation';\nimport {BaseGlNodeType} from '../../_Base';\n\n// import {TypedConnection, COMPONENTS_COUNT_BY_TYPE} from '../../../../../Engine/Node/Gl/GlData';\nimport {TextureVariable} from './TextureVariable';\nimport {ShaderConfig} from '../configs/ShaderConfig';\nimport {ShaderName} from '../../../utils/shaders/ShaderName';\nimport {PolyScene} from '../../../../scene/PolyScene';\nimport {\n\tGlConnectionPointComponentsCountMap,\n\tBaseGlConnectionPoint,\n\tGlConnectionPointType,\n} from '../../../utils/io/connections/Gl';\nimport {AttributeGlNode} from '../../Attribute';\nimport {GlobalsGlNode} from '../../Globals';\nimport {OutputGlNode} from '../../Output';\nimport {arrayUniq} from '../../../../../core/ArrayUtils';\nimport {PolyDictionary} from '../../../../../types/GlobalTypes';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {GlType} from '../../../../poly/registers/nodes/types/Gl';\nimport {AdjacentPointsAttribSmoothGlNode} from '../../AdjacentPointsAttribSmooth';\n\nexport type TextureAllocationsControllerData = {\n\twritable: PolyDictionary<TextureAllocationData>[];\n\treadonly: PolyDictionary<TextureAllocationData>[];\n};\nconst OUTPUT_NAME_ATTRIBUTES = ['position', 'normal', 'color', 'uv'];\n\nexport class TextureAllocationsController {\n\tprivate _writableAllocations: TextureAllocation[] = [];\n\tprivate _readonlyAllocations: TextureAllocation[] = [];\n\t// private _next_allocation_index: number = 0;\n\n\tconstructor() {}\n\n\tdispose() {\n\t\tthis._writableAllocations.splice(0, this._writableAllocations.length);\n\t\tthis._readonlyAllocations.splice(0, this._readonlyAllocations.length);\n\t}\n\n\tprivate static _sortNodes(rootNodes: BaseGlNodeType[]): BaseGlNodeType[] {\n\t\t//let's go through the output node first, in case there is a name conflict, it will have priority\n\t\tconst outputNodes = rootNodes.filter((node) => node.type() == OutputGlNode.type());\n\t\tconst sortedRootNodes: BaseGlNodeType[] = outputNodes;\n\t\t// we also sort them by name, to add some predictability to the generated shaders\n\t\tconst nonOutputNodes = rootNodes.filter((node) => node.type() != OutputGlNode.type());\n\t\t// but make sure not to use .name() here,\n\t\t// as otherwise, 2 nodes where 1 is at top leve and 1 in a subnet\n\t\t// could override one another if they have the same name\n\t\tconst nonOutputNodeNames = nonOutputNodes.map((n) => n.path()).sort();\n\t\tconst nonOutputNodesByName: Map<string, BaseGlNodeType> = new Map();\n\t\tfor (const node of nonOutputNodes) {\n\t\t\tnonOutputNodesByName.set(node.path(), node);\n\t\t}\n\t\tfor (const nodeName of nonOutputNodeNames) {\n\t\t\tconst node = nonOutputNodesByName.get(nodeName);\n\t\t\tif (node) {\n\t\t\t\tsortedRootNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\treturn sortedRootNodes;\n\t}\n\n\tallocateConnectionsFromRootNodes(rootNodes: BaseGlNodeType[], leafNodes: BaseGlNodeType[]) {\n\t\tconst variables = [];\n\n\t\trootNodes = TextureAllocationsController._sortNodes(rootNodes);\n\t\tleafNodes = TextureAllocationsController._sortNodes(leafNodes);\n\n\t\tfor (const node of rootNodes) {\n\t\t\tconst node_id = node.graphNodeId();\n\t\t\tswitch (node.type()) {\n\t\t\t\tcase OutputGlNode.type(): {\n\t\t\t\t\tconst connectionPoints = node.io.inputs.namedInputConnectionPoints();\n\t\t\t\t\tif (connectionPoints) {\n\t\t\t\t\t\tfor (const connection_point of connectionPoints) {\n\t\t\t\t\t\t\tconst input = node.io.inputs.named_input(connection_point.name());\n\t\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\t\t// connections_by_node_id[node_id] = connections_by_node_id[node_id] || []\n\t\t\t\t\t\t\t\t// connections_by_node_id[node_id].push(named_input)\n\t\t\t\t\t\t\t\tconst variable = new TextureVariable(\n\t\t\t\t\t\t\t\t\tconnection_point.name(),\n\t\t\t\t\t\t\t\t\tGlConnectionPointComponentsCountMap[connection_point.type()]\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tvariable.addGraphNodeId(node_id);\n\t\t\t\t\t\t\t\tvariables.push(variable);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase AttributeGlNode.type(): {\n\t\t\t\t\tconst attrib_node = node as AttributeGlNode;\n\t\t\t\t\tconst named_input: BaseGlNodeType | null = attrib_node.connected_input_node();\n\t\t\t\t\tconst connection_point: BaseGlConnectionPoint | undefined =\n\t\t\t\t\t\tattrib_node.connected_input_connection_point();\n\t\t\t\t\tif (named_input && connection_point) {\n\t\t\t\t\t\t// connections_by_node_id[node_id] = connections_by_node_id[node_id] || []\n\t\t\t\t\t\t// connections_by_node_id[node_id].push(named_input)\n\t\t\t\t\t\tconst variable = new TextureVariable(\n\t\t\t\t\t\t\tattrib_node.attributeName(),\n\t\t\t\t\t\t\tGlConnectionPointComponentsCountMap[connection_point.type()]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tvariable.addGraphNodeId(node_id);\n\t\t\t\t\t\tvariables.push(variable);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase GlType.ADJACENT_POINTS_ATTRIB_SMOOTH: {\n\t\t\t\t\tconst adjacentPointsAttribSmoothNode = node as AdjacentPointsAttribSmoothGlNode;\n\t\t\t\t\tconst data = adjacentPointsAttribSmoothNode.textureAllocationData();\n\t\t\t\t\tfor (const attribName of data) {\n\t\t\t\t\t\tconst variable = new TextureVariable(\n\t\t\t\t\t\t\tattribName,\n\t\t\t\t\t\t\tGlConnectionPointComponentsCountMap[GlConnectionPointType.VEC2]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tvariable.setReadonly(true);\n\t\t\t\t\t\tvariable.addGraphNodeId(node_id);\n\t\t\t\t\t\tvariables.push(variable);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const node of leafNodes) {\n\t\t\tconst node_id = node.graphNodeId();\n\t\t\tswitch (node.type()) {\n\t\t\t\tcase GlobalsGlNode.type(): {\n\t\t\t\t\tconst globals_node = node as GlobalsGlNode;\n\t\t\t\t\t// const output_names_not_attributes = ['frame', 'gl_FragCoord', 'gl_PointCoord'];\n\t\t\t\t\tfor (const output_name of globals_node.io.outputs.used_output_names()) {\n\t\t\t\t\t\t// is_attribute, as opposed to frame, gl_FragCoord and gl_PointCoord which are either uniforms or provided by the renderer\n\t\t\t\t\t\tconst is_attribute = OUTPUT_NAME_ATTRIBUTES.includes(output_name);\n\n\t\t\t\t\t\tif (is_attribute) {\n\t\t\t\t\t\t\tconst connection_point =\n\t\t\t\t\t\t\t\tglobals_node.io.outputs.namedOutputConnectionPointsByName(output_name);\n\t\t\t\t\t\t\tif (connection_point) {\n\t\t\t\t\t\t\t\tconst gl_type = connection_point.type();\n\t\t\t\t\t\t\t\tconst variable = new TextureVariable(\n\t\t\t\t\t\t\t\t\toutput_name,\n\t\t\t\t\t\t\t\t\tGlConnectionPointComponentsCountMap[gl_type]\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tvariable.addGraphNodeId(node_id);\n\t\t\t\t\t\t\t\tvariables.push(variable);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase AttributeGlNode.type(): {\n\t\t\t\t\tconst attribute_node = node as AttributeGlNode;\n\t\t\t\t\tconst connection_point = attribute_node.output_connection_point();\n\t\t\t\t\tif (connection_point) {\n\t\t\t\t\t\t// connections_by_node_id[node_id] = connections_by_node_id[node_id] || []\n\t\t\t\t\t\t// connections_by_node_id[node_id].push(named_output)\n\t\t\t\t\t\tconst variable = new TextureVariable(\n\t\t\t\t\t\t\tattribute_node.attributeName(),\n\t\t\t\t\t\t\tGlConnectionPointComponentsCountMap[connection_point.type()]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!attribute_node.isExporting()) {\n\t\t\t\t\t\t\tvariable.setReadonly(true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvariable.addGraphNodeId(node_id);\n\t\t\t\t\t\tvariables.push(variable);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._allocateVariables(variables);\n\t}\n\tprivate _allocateVariables(variables: TextureVariable[]) {\n\t\tconst uniqVariables = this._ensureVariablesAreUnique(variables);\n\n\t\tconst variablesBySizeInverse = uniqVariables.sort((v0: TextureVariable, v1: TextureVariable) => {\n\t\t\treturn v0.size() < v1.size() ? 1 : -1;\n\t\t});\n\n\t\tfor (const variable of variablesBySizeInverse) {\n\t\t\tif (variable.readonly()) {\n\t\t\t\tthis._allocateVariable(variable, this._readonlyAllocations);\n\t\t\t} else {\n\t\t\t\tthis._allocateVariable(variable, this._writableAllocations);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _ensureVariablesAreUnique(variables: TextureVariable[]) {\n\t\tconst variableByName: Map<string, TextureVariable[]> = new Map();\n\t\tfor (const variable of variables) {\n\t\t\tpushOnArrayAtEntry(variableByName, variable.name(), variable);\n\t\t}\n\t\tconst uniqVariables: TextureVariable[] = [];\n\t\tvariableByName.forEach((variablesForName, variableName) => {\n\t\t\tconst firstVariable = variablesForName[0];\n\t\t\tuniqVariables.push(firstVariable);\n\t\t\tfor (let i = 1; i < variablesForName.length; i++) {\n\t\t\t\tconst otherVariable = variablesForName[i];\n\t\t\t\tfirstVariable.merge(otherVariable);\n\t\t\t}\n\t\t});\n\t\treturn uniqVariables;\n\t}\n\tprivate _allocateVariable(newVariable: TextureVariable, allocations: TextureAllocation[]) {\n\t\tlet isAllocated = this.hasVariable(newVariable.name());\n\t\tif (isAllocated) {\n\t\t\tthrow 'no variable should be allocated since they have been made unique before';\n\t\t\t// const allocated_variable = this.variables().filter((v) => v.name() == new_variable.name())[0];\n\t\t\t// allocated_variable.merge(new_variable);\n\t\t} else {\n\t\t\tfor (const allocation of allocations) {\n\t\t\t\tif (!isAllocated && allocation.hasSpaceForVariable(newVariable)) {\n\t\t\t\t\tallocation.addVariable(newVariable);\n\t\t\t\t\tisAllocated = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!isAllocated) {\n\t\t\t\tconst newAllocation = new TextureAllocation(/*this.nextAllocationName()*/);\n\t\t\t\tallocations.push(newAllocation);\n\t\t\t\tnewAllocation.addVariable(newVariable);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _addWritableAllocation(allocation: TextureAllocation) {\n\t\tthis._writableAllocations.push(allocation);\n\t}\n\tprivate _addReadonlyAllocation(allocation: TextureAllocation) {\n\t\tthis._readonlyAllocations.push(allocation);\n\t}\n\treadonlyAllocations() {\n\t\treturn this._readonlyAllocations;\n\t}\n\n\t// private _nextAllocationName(): ShaderName {\n\t// \tconst name = ParticleShaderNames[this._next_allocation_index];\n\t// \tthis._next_allocation_index += 1;\n\t// \treturn name;\n\t// }\n\n\tshaderNames(): ShaderName[] {\n\t\tconst explicitShaderNames = this._writableAllocations.map((a) => a.shaderName());\n\t\tconst uniqShaderNames: ShaderName[] = [];\n\t\tarrayUniq(explicitShaderNames, uniqShaderNames);\n\t\treturn uniqShaderNames;\n\t}\n\tcreateShaderConfigs(): ShaderConfig[] {\n\t\treturn [\n\t\t\t// new ShaderConfig('position', ['position'], []),\n\t\t\t// new ShaderConfig('fragment', ['color', 'alpha'], ['vertex']),\n\t\t];\n\t}\n\tallocationForShaderName(shader_name: ShaderName): TextureAllocation | undefined {\n\t\tconst writeableAllocation = this._writableAllocations.filter((a) => a.shaderName() == shader_name)[0];\n\t\tif (writeableAllocation) {\n\t\t\treturn writeableAllocation;\n\t\t}\n\t\treturn this._readonlyAllocations.filter((a) => a.shaderName() == shader_name)[0];\n\t}\n\tinputNamesForShaderName(root_node: BaseGlNodeType, shader_name: ShaderName) {\n\t\tconst allocation = this.allocationForShaderName(shader_name);\n\t\tif (allocation) {\n\t\t\treturn allocation.inputNamesForNode(root_node);\n\t\t}\n\t}\n\t// find_variable(root_node: BaseNodeGl, shader_name: ShaderName, input_name: string): TextureVariable{\n\t// \tconst allocation = this.allocation_for_shader_name(shader_name)\n\t// \tif(allocation){\n\t// \t\treturn allocation.find_variable_with_node(root_node, input_name)\n\t// \t}\n\t// }\n\tvariable(variable_name: string): TextureVariable | undefined {\n\t\tfor (const allocation of this._writableAllocations) {\n\t\t\tconst variable = allocation.variable(variable_name);\n\t\t\tif (variable) {\n\t\t\t\treturn variable;\n\t\t\t}\n\t\t}\n\t\tfor (const allocation of this._readonlyAllocations) {\n\t\t\tconst variable = allocation.variable(variable_name);\n\t\t\tif (variable) {\n\t\t\t\treturn variable;\n\t\t\t}\n\t\t}\n\t}\n\tvariables(): TextureVariable[] {\n\t\tconst writableVariables = this._writableAllocations.map((a) => a.variables() || []).flat();\n\t\tconst readonlyVariables = this._writableAllocations.map((a) => a.variables() || []).flat();\n\t\treturn writableVariables.concat(readonlyVariables);\n\t}\n\thasVariable(name: string): boolean {\n\t\tconst names = this.variables().map((v) => v.name());\n\t\treturn names.includes(name);\n\t}\n\n\tstatic fromJSON(data: TextureAllocationsControllerData): TextureAllocationsController {\n\t\tconst controller = new TextureAllocationsController();\n\t\tfor (const datum of data.writable) {\n\t\t\tconst shader_name = Object.keys(datum)[0] as ShaderName;\n\t\t\tconst allocation_data = datum[shader_name];\n\t\t\tconst new_allocation = TextureAllocation.fromJSON(allocation_data);\n\t\t\tcontroller._addWritableAllocation(new_allocation);\n\t\t}\n\t\tfor (const datum of data.readonly) {\n\t\t\tconst shader_name = Object.keys(datum)[0] as ShaderName;\n\t\t\tconst allocation_data = datum[shader_name];\n\t\t\tconst new_allocation = TextureAllocation.fromJSON(allocation_data);\n\t\t\tcontroller._addReadonlyAllocation(new_allocation);\n\t\t}\n\t\treturn controller;\n\t}\n\ttoJSON(scene: PolyScene): TextureAllocationsControllerData {\n\t\tconst writable = this._writableAllocations.map((allocation: TextureAllocation) => {\n\t\t\tconst data = {\n\t\t\t\t[allocation.shaderName()]: allocation.toJSON(scene),\n\t\t\t};\n\t\t\treturn data;\n\t\t});\n\t\tconst readonly = this._readonlyAllocations.map((allocation: TextureAllocation) => {\n\t\t\tconst data = {\n\t\t\t\t[allocation.shaderName()]: allocation.toJSON(scene),\n\t\t\t};\n\t\t\treturn data;\n\t\t});\n\t\treturn {writable, readonly};\n\t}\n\tprint(scene: PolyScene) {\n\t\tconsole.warn(JSON.stringify(this.toJSON(scene), [''], 2));\n\t}\n}\n","import {TextureAllocation} from './TextureAllocation';\nimport {PolyScene} from '../../../../scene/PolyScene';\nimport {CoreGraphNodeId} from '../../../../../core/graph/CoreGraph';\nimport {BaseGlNodeType} from '../../_Base';\n\nexport interface TextureVariableData {\n\tname: string;\n\tsize: number;\n\tnodes: string[];\n}\n\nexport class TextureVariable {\n\tprivate _allocation: TextureAllocation | undefined;\n\tprivate _position: number = -1;\n\tprivate _readonly = false;\n\n\tprivate _graphNodeIds: Set<CoreGraphNodeId> | undefined;\n\n\tconstructor(private _name: string, private _size: number) {\n\t\tif (!_name) {\n\t\t\tthrow 'TextureVariable requires a name';\n\t\t}\n\t}\n\n\tmerge(variable: TextureVariable) {\n\t\tif (!variable.readonly()) {\n\t\t\tthis.setReadonly(false);\n\t\t}\n\n\t\tvariable.graphNodeIds()?.forEach((graphNodeId) => {\n\t\t\tthis.addGraphNodeId(graphNodeId);\n\t\t});\n\t}\n\n\tsetReadonly(state: boolean) {\n\t\tthis._readonly = state;\n\t}\n\treadonly() {\n\t\treturn this._readonly;\n\t}\n\n\tsetAllocation(allocation: TextureAllocation) {\n\t\tthis._allocation = allocation;\n\t}\n\tallocation() {\n\t\treturn this._allocation;\n\t}\n\n\tgraphNodeIds() {\n\t\treturn this._graphNodeIds;\n\t}\n\taddGraphNodeId(id: CoreGraphNodeId) {\n\t\tthis._graphNodeIds = this._graphNodeIds || new Set();\n\t\tthis._graphNodeIds.add(id);\n\t}\n\tname() {\n\t\treturn this._name;\n\t}\n\tsize() {\n\t\treturn this._size;\n\t}\n\n\tsetPosition(position: number) {\n\t\tthis._position = position;\n\t}\n\tposition() {\n\t\treturn this._position;\n\t}\n\tcomponent(): string {\n\t\treturn 'xyzw'.split('').splice(this._position, this._size).join('');\n\t}\n\n\tstatic fromJSON(data: TextureVariableData): TextureVariable {\n\t\treturn new TextureVariable(data.name, data.size);\n\t}\n\n\ttoJSON(scene: PolyScene): TextureVariableData {\n\t\tconst names: string[] = [];\n\t\tif (this._graphNodeIds) {\n\t\t\tthis._graphNodeIds.forEach((graphNodeId) => {\n\t\t\t\tconst node = scene.graph.nodeFromId(graphNodeId) as BaseGlNodeType;\n\t\t\t\tif (node) {\n\t\t\t\t\tconst name = node.path();\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\tnames.push(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tname: this.name(),\n\t\t\tsize: this.size(),\n\t\t\tnodes: names,\n\t\t};\n\t}\n}\n","import {BaseGlNodeType} from '../_Base';\nimport {TypedGLDefinitionCollection} from './GLDefinitionCollection';\nimport {GlConnectionPointType} from '../../utils/io/connections/Gl';\n\nexport enum GLDefinitionType {\n\tATTRIBUTE = 'attribute',\n\tFUNCTION = 'function',\n\tPRECISION = 'precision',\n\tUNIFORM = 'uniform',\n\tVARYING = 'varying',\n}\n\nexport abstract class TypedGLDefinition<T extends GLDefinitionType> {\n\t// constructor(protected _node: BaseGlNodeType, protected _name: string) {}\n\tconstructor(\n\t\tprotected _definition_type: T,\n\t\tprotected _data_type: GlConnectionPointType,\n\t\tprotected _node: BaseGlNodeType,\n\t\tprotected _name: string\n\t) {\n\t\t// super(_node, _name);\n\t}\n\n\tget definition_type() {\n\t\treturn this._definition_type;\n\t}\n\tget data_type() {\n\t\treturn this._data_type;\n\t}\n\tget node() {\n\t\treturn this._node;\n\t}\n\tname() {\n\t\treturn this._name;\n\t}\n\t// get id() {\n\t// \treturn this._data_type;\n\t// }\n\n\tabstract get line(): string;\n\tcollection_instance() {\n\t\treturn new TypedGLDefinitionCollection<T>();\n\t}\n}\n\nexport class AttributeGLDefinition extends TypedGLDefinition<GLDefinitionType.ATTRIBUTE> {\n\tconstructor(\n\t\tprotected override _node: BaseGlNodeType,\n\t\tprotected override _data_type: GlConnectionPointType,\n\t\tprotected override _name: string\n\t) {\n\t\tsuper(GLDefinitionType.ATTRIBUTE, _data_type, _node, _name);\n\t}\n\tget line() {\n\t\treturn `attribute ${this.data_type} ${this.name()}`;\n\t}\n}\n\nexport class FunctionGLDefinition extends TypedGLDefinition<GLDefinitionType.FUNCTION> {\n\tconstructor(protected override _node: BaseGlNodeType, protected override _name: string) {\n\t\tsuper(GLDefinitionType.FUNCTION, GlConnectionPointType.FLOAT, _node, _name);\n\t}\n\tget line() {\n\t\treturn this.name();\n\t}\n}\n\nexport class UniformGLDefinition extends TypedGLDefinition<GLDefinitionType.UNIFORM> {\n\tconstructor(\n\t\tprotected override _node: BaseGlNodeType,\n\t\tprotected override _data_type: GlConnectionPointType,\n\t\tprotected override _name: string\n\t) {\n\t\tsuper(GLDefinitionType.UNIFORM, _data_type, _node, _name);\n\t}\n\tget line() {\n\t\treturn `uniform ${this.data_type} ${this.name()}`;\n\t}\n}\nexport class PrecisionGLDefinition extends TypedGLDefinition<GLDefinitionType.PRECISION> {\n\tconstructor(\n\t\tprotected override _node: BaseGlNodeType,\n\t\tprotected override _data_type: GlConnectionPointType,\n\t\tprotected override _name: string = 'highp'\n\t) {\n\t\tsuper(GLDefinitionType.PRECISION, _data_type, _node, _name);\n\t}\n\tget line() {\n\t\treturn `precision ${this.name()} ${this.data_type}`;\n\t}\n}\n\nexport class VaryingGLDefinition extends TypedGLDefinition<GLDefinitionType.VARYING> {\n\tconstructor(\n\t\tprotected override _node: BaseGlNodeType,\n\t\tprotected override _data_type: GlConnectionPointType,\n\t\tprotected override _name: string\n\t) {\n\t\tsuper(GLDefinitionType.VARYING, _data_type, _node, _name);\n\t}\n\tget line() {\n\t\treturn `varying ${this.data_type} ${this.name()}`;\n\t}\n}\nexport type BaseGLDefinition = TypedGLDefinition<GLDefinitionType>;\n","import {TypedGLDefinition, GLDefinitionType} from './GLDefinition';\n\nexport class TypedGLDefinitionCollection<T extends GLDefinitionType> {\n\t_errored: boolean = false;\n\t_error_message: string | undefined;\n\n\tconstructor(private _definitions: TypedGLDefinition<T>[] = []) {}\n\n\tget errored() {\n\t\treturn this._errored;\n\t}\n\tget error_message() {\n\t\treturn this._error_message;\n\t}\n\n\tuniq(): TypedGLDefinition<T>[] {\n\t\tconst definitions_by_name: Map<string, TypedGLDefinition<T>> = new Map();\n\t\tconst names: string[] = [];\n\n\t\tfor (const definition of this._definitions) {\n\t\t\tif (!this._errored) {\n\t\t\t\tconst name = definition.name();\n\t\t\t\tconst existing = definitions_by_name.get(name);\n\t\t\t\tif (existing) {\n\t\t\t\t\tif (existing.data_type != definition.data_type) {\n\t\t\t\t\t\tthis._errored = true;\n\t\t\t\t\t\tthis._error_message = `attempt to create '${definition.name()}' with types '${\n\t\t\t\t\t\t\tdefinition.data_type\n\t\t\t\t\t\t}' by node '${definition.node.path()}', when there is already an existing with type ${\n\t\t\t\t\t\t\texisting.data_type\n\t\t\t\t\t\t} from node '${existing.node.path()}'`;\n\t\t\t\t\t\tconsole.warn('emitting error message:', this._error_message);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdefinitions_by_name.set(name, definition);\n\t\t\t\t\tnames.push(name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst uniq_definitions: TypedGLDefinition<T>[] = [];\n\t\tfor (const name of names) {\n\t\t\tconst definition = definitions_by_name.get(name);\n\t\t\tif (definition) {\n\t\t\t\tuniq_definitions.push(definition);\n\t\t\t}\n\t\t}\n\t\t// sorting may make dependencies be declared after the function calling them\n\t\t// const sorted_definitions = sortBy(uniq_definitions, (d)=>d.name())\n\t\treturn uniq_definitions;\n\t}\n}\n","/**\n * reads or writes a position or geometry attribute\n *\n *\n */\nimport {TypedJsNode, BaseJsNodeType} from './_Base';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {JsConnectionPointType, BaseJsConnectionPoint} from '../utils/io/connections/Js';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\n\nexport const ATTRIBUTE_NODE_AVAILABLE_JS_TYPES = [\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n];\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {PointBuilderFunctionDataAttributeDataItem} from './code/assemblers/pointBuilder/_BasePointBuilderPersistedConfig';\n\nexport enum AttributeJsNodeInput {\n\tEXPORT = 'export',\n}\nexport enum AttributeJsNodeOutput {\n\tVAL = 'val',\n}\n\nclass AttributeJsParamsConfig extends NodeParamsConfig {\n\tname = ParamConfig.STRING('');\n\ttype = ParamConfig.INTEGER(0, {\n\t\tmenu: {\n\t\t\tentries: ATTRIBUTE_NODE_AVAILABLE_JS_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param allows to export the attribute */\n\texportWhenConnected = ParamConfig.BOOLEAN(0);\n}\nconst ParamsConfig = new AttributeJsParamsConfig();\n\nexport class AttributeJsNode extends TypedJsNode<AttributeJsParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.ATTRIBUTE;\n\t}\n\n\t// private _update_signature_if_required_bound = this._update_signature_if_required.bind(this);\n\toverride initializeNode() {\n\t\t// this.addPostDirtyHook('_setMatToRecompile', this._setMatToRecompile.bind(this));\n\t\tthis.io.connection_points.initializeNode();\n\n\t\tthis.io.connection_points.set_expected_input_types_function(() => this._expectedInputTypes());\n\t\tthis.io.connection_points.set_input_name_function((index: number) => this.inputName());\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [this._expectedOutputType()]);\n\t\t// this.params.add_on_scene_load_hook('_update_signature_if_required', this._update_signature_if_required_bound);\n\t\t// this.params.set_post_create_params_hook(this._update_signature_if_required_bound);\n\t\t// this.addPostDirtyHook('_update_signature_if_required', this._update_signature_if_required_bound);\n\t}\n\n\t// inputless_params_names(): string[] {\n\t// \treturn ['type'];\n\t// }\n\tprivate _expectedInputTypes() {\n\t\treturn this.pv.exportWhenConnected ? [this._expectedOutputType()] : [];\n\t}\n\tprivate _expectedOutputType() {\n\t\treturn ATTRIBUTE_NODE_AVAILABLE_JS_TYPES[this.pv.type];\n\t}\n\n\tinputName() {\n\t\treturn AttributeJsNodeInput.EXPORT;\n\t}\n\toutputName() {\n\t\treturn AttributeJsNodeOutput.VAL;\n\t}\n\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\t// if (lines_controller.shader_name) {\n\t\tthis.functionNode()?.assemblerController()?.assembler.setNodeLinesAttribute(this, linesController);\n\t\t// }\n\t}\n\tattribData(): PointBuilderFunctionDataAttributeDataItem {\n\t\treturn {\n\t\t\tattribName: this.attributeName(),\n\t\t\tattribType: this.jsType(),\n\t\t};\n\t}\n\tattributeName(): string {\n\t\treturn this.pv.name.trim();\n\t}\n\tjsType() {\n\t\tconst connectionPoints = this.io.outputs.namedOutputConnectionPoints();\n\t\tif (!connectionPoints) {\n\t\t\treturn JsConnectionPointType.FLOAT;\n\t\t}\n\t\treturn connectionPoints[0].type();\n\t}\n\tsetJsType(type: JsConnectionPointType) {\n\t\tthis.p.type.set(ATTRIBUTE_NODE_AVAILABLE_JS_TYPES.indexOf(type));\n\t}\n\t//\n\t//\n\t// Utility methods for SOP/ParticlesSystemGPU and Assembler/Particles\n\t//\n\t//\n\tconnected_input_node(): BaseJsNodeType | null {\n\t\treturn this.io.inputs.named_input(AttributeJsNodeInput.EXPORT) as BaseJsNodeType | null;\n\t}\n\tconnected_input_connection_point(): BaseJsConnectionPoint | undefined {\n\t\treturn this.io.inputs.named_input_connection_point(AttributeJsNodeInput.EXPORT);\n\t}\n\n\toutput_connection_point(): BaseJsConnectionPoint | undefined {\n\t\t// if (this.io.inputs.hasNamedInputs()) {\n\t\treturn this.io.outputs.namedOutputConnectionPointsByName(this.inputName());\n\t\t// }\n\t}\n\n\tisImporting(): boolean {\n\t\treturn this.io.outputs.used_output_names().length > 0; // TODO: ensure that we can check that the connected outputs are part of the nodes retrived by the node traverser\n\t}\n\tisExporting(): boolean {\n\t\tif (isBooleanTrue(this.pv.exportWhenConnected)) {\n\t\t\tconst inputNode = this.io.inputs.named_input(AttributeJsNodeInput.EXPORT);\n\t\t\treturn inputNode != null;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// private _set_mat_to_recompile_if_is_exporting() {\n\t// \tif (this.is_exporting) {\n\t// \t\tthis._set_function_node_to_recompile();\n\t// \t}\n\t// }\n}\n","/**\n * displays the input value\n *\n *\n *\n */\nimport {JsConnectionPointType} from '../utils/io/connections/Js';\nimport {TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {Poly} from '../../Poly';\nimport {inputObject3D} from './_BaseObject3D';\nimport {DebugOptions} from '../../functions/_Debug';\n\ninterface FunctionOptions {\n\tlinesController: JsLinesCollectionController;\n\tinputValue?: string;\n}\n\nclass DebugJsParamsConfig extends NodeParamsConfig {\n\tdisplayValue = ParamConfig.BOOLEAN(1);\n\tdisplayFrame = ParamConfig.BOOLEAN(1);\n\tdisplayTime = ParamConfig.BOOLEAN(0);\n\tdisplayNodePath = ParamConfig.BOOLEAN(1);\n\tmessage = ParamConfig.STRING('');\n\tbundleByObject = ParamConfig.BOOLEAN(1);\n}\nconst ParamsConfig = new DebugJsParamsConfig();\n\nexport class DebugJsNode extends TypedJsNode<DebugJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'debug';\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['displayValue']);\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputName.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputName.bind(this));\n\t}\n\n\tprotected _expectedInputTypes(): [JsConnectionPointType] {\n\t\tconst firstType = this.io.connection_points.first_input_connection_type() || JsConnectionPointType.FLOAT;\n\t\treturn [firstType];\n\t}\n\n\tprotected _expectedInputName(index: number): string {\n\t\treturn [`in`][index];\n\t}\n\tprotected _expectedOutputName(index: number): string {\n\t\tconst type = this._expectedOutputTypes()[0];\n\t\treturn `${type}`;\n\t}\n\tprotected _expectedOutputTypes() {\n\t\treturn this._expectedInputTypes();\n\t}\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tconst dataType = this._expectedInputTypes()[0];\n\t\tconst varName = this.jsVarName(this._expectedOutputName(0));\n\t\tconst inputValue = this.variableForInput(linesController, this._expectedInputName(0));\n\n\t\tlinesController.addBodyOrComputed(this, [\n\t\t\t{\n\t\t\t\tdataType,\n\t\t\t\tvarName,\n\t\t\t\tvalue: this._function({\n\t\t\t\t\tlinesController,\n\t\t\t\t\tinputValue,\n\t\t\t\t}),\n\t\t\t},\n\t\t]);\n\t}\n\toverride setTriggerableLines(linesController: JsLinesCollectionController) {\n\t\tconst bodyLine = this._function({\n\t\t\tlinesController,\n\t\t});\n\t\tlinesController.addTriggerableLines(this, [bodyLine]);\n\t}\n\n\tprivate _function(options: FunctionOptions): string {\n\t\tconst {linesController, inputValue} = options;\n\t\tconst object3D = inputObject3D(this, linesController);\n\t\tconst nodePath = `'${this.path()}'`;\n\t\tconst debugOptions: DebugOptions = {\n\t\t\tdisplayValue: this.pv.displayValue,\n\t\t\tdisplayFrame: this.pv.displayFrame,\n\t\t\tdisplayTime: this.pv.displayTime,\n\t\t\tdisplayNodePath: this.pv.displayNodePath,\n\t\t\tmessage: this.pv.message,\n\t\t\tbundleByObject: this.pv.bundleByObject,\n\t\t};\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('debug', this, linesController);\n\n\t\treturn func.asString(object3D, nodePath, inputValue || `''`, JSON.stringify(debugOptions));\n\t}\n}\n","/**\n * get an object's children attributes and returns an array\n *\n *\n */\n\nimport {TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {\n\tJsConnectionPoint,\n\tJsConnectionPointType,\n\tJsConnectionPointTypeToArrayTypeMap,\n\tJS_CONNECTION_POINT_IN_NODE_DEF,\n\tParamConvertibleJsType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../utils/io/connections/Js';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {inputObject3D} from './_BaseObject3D';\nimport {Poly} from '../../Poly';\nimport {createVariable} from './code/assemblers/_BaseJsPersistedConfigUtils';\nimport {StringParam} from '../../params/String';\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nenum GetChildrenAttributesInputName {\n\tattribName = 'attribName',\n}\n\nclass GetChildrenAttributesJsParamsConfig extends NodeParamsConfig {\n\t// attribName = ParamConfig.STRING('');\n\ttype = ParamConfig.INTEGER(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n}\nconst ParamsConfig = new GetChildrenAttributesJsParamsConfig();\n\nexport class GetChildrenAttributesJsNode extends TypedJsNode<GetChildrenAttributesJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'getChildrenAttributes';\n\t}\n\n\tstatic readonly OUTPUT_NAME = 'val';\n\toverride initializeNode() {\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(\n\t\t\t\tGetChildrenAttributesInputName.attribName,\n\t\t\t\tJsConnectionPointType.STRING,\n\t\t\t\tCONNECTION_OPTIONS\n\t\t\t),\n\t\t]);\n\n\t\tthis.io.connection_points.set_expected_input_types_function(() => []);\n\t\tthis.io.connection_points.set_output_name_function((index: number) => GetChildrenAttributesJsNode.OUTPUT_NAME);\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [this._currentConnectionType()]);\n\t}\n\tprivate _currentConnectionType() {\n\t\tif (this.pv.type == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\tconst connectionType = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tif (connectionType == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\tconst arrayConnectionType = JsConnectionPointTypeToArrayTypeMap[connectionType];\n\t\treturn arrayConnectionType;\n\t}\n\t// this is used to allow setting attribName before the parameter is created\n\tprivate _nextAttribName: string = '';\n\toverride paramDefaultValue(name: GetChildrenAttributesInputName) {\n\t\treturn {\n\t\t\t[GetChildrenAttributesInputName.attribName]: this._nextAttribName,\n\t\t}[name];\n\t}\n\n\tsetAttribType(type: ParamConvertibleJsType) {\n\t\tthis.p.type.set(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tattribType(): JsConnectionPointType {\n\t\treturn PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t}\n\tsetAttribName(attribName: string) {\n\t\tconst param = this.params.get(GetChildrenAttributesInputName.attribName) as StringParam | undefined;\n\t\tif (param) {\n\t\t\tparam.set(attribName);\n\t\t} else {\n\t\t\tthis._nextAttribName = attribName;\n\t\t}\n\t}\n\tattribName() {\n\t\treturn (this.params.get(GetChildrenAttributesInputName.attribName) as StringParam).value;\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\t\tconst attribName = this.variableForInput(\n\t\t\tshadersCollectionController,\n\t\t\tGetChildrenAttributesInputName.attribName\n\t\t);\n\t\tconst varName = this.jsVarName(GetChildrenAttributesJsNode.OUTPUT_NAME);\n\t\tconst dataType = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\n\t\tconst arrayType = JsConnectionPointTypeToArrayTypeMap[dataType];\n\t\tconst variable = createVariable(arrayType);\n\t\tconst tmpVarName = variable ? shadersCollectionController.addVariable(this, variable) : undefined;\n\t\tif (!tmpVarName) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst func = Poly.namedFunctionsRegister.getFunction(\n\t\t\t'getChildrenAttributes',\n\t\t\tthis,\n\t\t\tshadersCollectionController\n\t\t);\n\t\tconst bodyLine = func.asString(object3D, attribName, `'${dataType}'`, tmpVarName);\n\t\tshadersCollectionController.addBodyOrComputed(this, [{dataType, varName, value: bodyLine}]);\n\t}\n}\n","/**\n * get an object attribute\n *\n *\n */\n\nimport {TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {\n\tJsConnectionPointType,\n\tParamConvertibleJsType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../utils/io/connections/Js';\nimport {inputObject3D} from './_BaseObject3D';\nimport {Poly} from '../../Poly';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {StringParam} from '../../params/String';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {TypeAssert} from '../../poly/Assert';\n\n// function typedVisibleOptions(type: ParamConvertibleJsType, otherParamVal: Record<string, number | boolean> = {}) {\n// \tconst val = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(type);\n// \treturn {visibleIf: {type: val, ...otherParamVal}};\n// }\nenum GetObjectAttributeInputName {\n\tattribName = 'attribName',\n}\nenum GetObjectAttributeOutputName {\n\tVALUE = 'val',\n}\n\nclass GetObjectAttributeJsParamsConfig extends NodeParamsConfig {\n\t// attribName = ParamConfig.STRING('');\n\ttype = ParamConfig.INTEGER(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t// defaultBoolean = ParamConfig.BOOLEAN(0, typedVisibleOptions(JsConnectionPointType.BOOLEAN));\n\t// defaultColor = ParamConfig.COLOR([0, 0, 0], typedVisibleOptions(JsConnectionPointType.COLOR));\n\t// defaultFloat = ParamConfig.FLOAT(0, typedVisibleOptions(JsConnectionPointType.FLOAT));\n\t// defaultInteger = ParamConfig.INTEGER(0, typedVisibleOptions(JsConnectionPointType.INT));\n\t// defaultString = ParamConfig.STRING('', typedVisibleOptions(JsConnectionPointType.STRING));\n\t// defaultVector2 = ParamConfig.VECTOR2([0, 0], typedVisibleOptions(JsConnectionPointType.VECTOR2));\n\t// defaultVector3 = ParamConfig.VECTOR3([0, 0, 0], typedVisibleOptions(JsConnectionPointType.VECTOR3));\n\t// defaultVector4 = ParamConfig.VECTOR4([0, 0, 0, 0], typedVisibleOptions(JsConnectionPointType.VECTOR4));\n}\nconst ParamsConfig = new GetObjectAttributeJsParamsConfig();\n\nexport class GetObjectAttributeJsNode extends TypedJsNode<GetObjectAttributeJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.GET_OBJECT_ATTRIBUTE;\n\t}\n\n\toverride initializeNode() {\n\t\t// this.io.inputs.setNamedInputConnectionPoints([\n\t\t// \tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t// \tnew JsConnectionPoint(\n\t\t// \t\tGetObjectAttributeInputName.attribName,\n\t\t// \t\tJsConnectionPointType.STRING,\n\t\t// \t\tCONNECTION_OPTIONS\n\t\t// \t),\n\t\t// ]);\n\n\t\t// this.io.connection_points.spare_params.setInputlessParamNames([\n\t\t// \t'attribName',\n\t\t// \t'type',\n\t\t// \t'boolean',\n\t\t// \t'color',\n\t\t// \t'float',\n\t\t// \t'integer',\n\t\t// \t'vector2',\n\t\t// \t'vector3',\n\t\t// \t'vector4',\n\t\t// ]);\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputNames.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputNames.bind(this));\n\t}\n\tprivate _expectedInputTypes() {\n\t\treturn [JsConnectionPointType.OBJECT_3D, JsConnectionPointType.STRING, this._currentConnectionType()];\n\t}\n\tprivate _expectedInputNames(index: number) {\n\t\treturn [JsConnectionPointType.OBJECT_3D, GetObjectAttributeInputName.attribName, this.defaultValueName()][\n\t\t\tindex\n\t\t];\n\t}\n\tprivate _expectedOutputTypes() {\n\t\treturn [this._currentConnectionType()];\n\t}\n\tprivate _expectedOutputNames(index: number) {\n\t\treturn [GetObjectAttributeOutputName.VALUE][index];\n\t}\n\tprivate _currentConnectionType() {\n\t\tif (this.pv.type == null) {\n\t\t\tconsole.warn(`${this.type()} js node type not valid`);\n\t\t}\n\t\tconst connection_type = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tif (connection_type == null) {\n\t\t\tconsole.warn(`${this.type()} js node type not valid`);\n\t\t}\n\t\treturn connection_type;\n\t}\n\t// defaultValueParam() {\n\t// \tconst type = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type] as ParamConvertibleJsType;\n\t// \tswitch (type) {\n\t// \t\tcase JsConnectionPointType.BOOLEAN: {\n\t// \t\t\treturn this.p.defaultBoolean;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.COLOR: {\n\t// \t\t\treturn this.p.defaultColor;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.FLOAT: {\n\t// \t\t\treturn this.p.defaultFloat;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.INT: {\n\t// \t\t\treturn this.p.defaultInteger;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.STRING: {\n\t// \t\t\treturn this.p.defaultString;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.VECTOR2: {\n\t// \t\t\treturn this.p.defaultVector2;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.VECTOR3: {\n\t// \t\t\treturn this.p.defaultVector3;\n\t// \t\t}\n\t// \t\tcase JsConnectionPointType.VECTOR4: {\n\t// \t\t\treturn this.p.defaultVector4;\n\t// \t\t}\n\t// \t}\n\t// \tTypeAssert.unreachable(type);\n\t// }\n\tdefaultValueName(): string {\n\t\tconst type = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type] as ParamConvertibleJsType;\n\t\tswitch (type) {\n\t\t\tcase JsConnectionPointType.BOOLEAN: {\n\t\t\t\treturn 'defaultBoolean';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.COLOR: {\n\t\t\t\treturn 'defaultColor';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.FLOAT: {\n\t\t\t\treturn 'defaultFloat';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.INT: {\n\t\t\t\treturn 'defaultInteger';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.STRING: {\n\t\t\t\treturn 'defaultString';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\t\treturn 'defaultVector2';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\t\treturn 'defaultVector3';\n\t\t\t}\n\t\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\t\treturn 'defaultVector4';\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(type);\n\t}\n\tprivate _nextAttribName: string = '';\n\toverride paramDefaultValue(name: GetObjectAttributeInputName) {\n\t\treturn {\n\t\t\t[GetObjectAttributeInputName.attribName]: this._nextAttribName,\n\t\t}[name];\n\t}\n\tsetAttribType(type: ParamConvertibleJsType) {\n\t\tthis.p.type.set(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tsetAttribName(attribName: string) {\n\t\tconst param = this.params.get(GetObjectAttributeInputName.attribName) as StringParam | undefined;\n\t\tif (param) {\n\t\t\tparam.set(attribName);\n\t\t} else {\n\t\t\tthis._nextAttribName = attribName;\n\t\t}\n\t}\n\tattributeName() {\n\t\treturn (this.params.get(GetObjectAttributeInputName.attribName) as StringParam).value;\n\t}\n\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tconst object3D = inputObject3D(this, linesController);\n\t\tconst attribName = this.variableForInput(linesController, GetObjectAttributeInputName.attribName);\n\t\t// const defaultParam = this.defaultValueParam();\n\t\t// const defaultValue = this.variableForInputParam(linesController, defaultParam);\n\t\tconst defaultValue = this.variableForInput(linesController, this.defaultValueName());\n\t\tconst out = this.jsVarName(GetObjectAttributeOutputName.VALUE);\n\t\tconst dataType = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('getObjectAttribute', this, linesController);\n\t\tconst bodyLine = func.asString(object3D, attribName, `'${dataType}'`, defaultValue);\n\t\tlinesController.addBodyOrComputed(this, [{dataType, varName: out, value: bodyLine}]);\n\t}\n}\n","/**\n * get an object user data\n *\n *\n */\n\nimport {TypedJsNode} from './_Base';\nimport {\n\tJsConnectionPoint,\n\tJsConnectionPointType,\n\tJS_CONNECTION_POINT_TYPES,\n\tJS_CONNECTION_POINT_IN_NODE_DEF,\n} from '../utils/io/connections/Js';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {inputObject3D} from './_BaseObject3D';\nimport {Poly} from '../../Poly';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nclass GetObjectUserDataJsParamsConfig extends NodeParamsConfig {\n\ttype = ParamConfig.INTEGER(JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n\tname = ParamConfig.STRING('');\n}\nconst ParamsConfig = new GetObjectUserDataJsParamsConfig();\n\nexport class GetObjectUserDataJsNode extends TypedJsNode<GetObjectUserDataJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.GET_OBJECT_USER_DATA;\n\t}\n\n\tstatic readonly OUTPUT_NAME = 'val';\n\toverride initializeNode() {\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t]);\n\t\tthis.io.connection_points.set_output_name_function((index: number) => GetObjectUserDataJsNode.OUTPUT_NAME);\n\t\tthis.io.connection_points.set_expected_input_types_function(() => []);\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [this._currentConnectionType()]);\n\t}\n\tprivate _currentConnectionType() {\n\t\tif (this.pv.type == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\tconst connectionType = JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tif (connectionType == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\treturn connectionType;\n\t}\n\tsetUserDataType(type: JsConnectionPointType) {\n\t\tthis.p.type.set(JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\t// const usedOutputNames = this.io.outputs.used_output_names();\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\n\t\tconst userDataName = this.variableForInputParam(shadersCollectionController, this.p.name);\n\t\tconst dataType = this._currentConnectionType();\n\t\tconst varName = this.jsVarName(GetObjectUserDataJsNode.OUTPUT_NAME);\n\t\t// const _f = (propertyName: string, type: JsConnectionPointType) => {\n\t\t// if (!usedOutputNames.includes(userDataName)) {\n\t\t// \treturn;\n\t\t// }\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('getObjectUserData', this, shadersCollectionController);\n\t\tshadersCollectionController.addBodyOrComputed(this, [\n\t\t\t{\n\t\t\t\tdataType,\n\t\t\t\tvarName,\n\t\t\t\tvalue: func.asString(object3D, userDataName),\n\t\t\t},\n\t\t]);\n\t\t// };\n\n\t\t// OBJECT_VECTOR3_PROPERTIES.forEach((propertyName) => {\n\t\t// \t_f(propertyName, JsConnectionPointType.VECTOR3);\n\t\t// });\n\t\t// OBJECT_BOOLEAN_PROPERTIES.forEach((propertyName) => {\n\t\t// \t_f(propertyName, JsConnectionPointType.BOOLEAN);\n\t\t// });\n\t\t// _f('quaternion', JsConnectionPointType.QUATERNION);\n\t\t// _f('matrix', JsConnectionPointType.MATRIX4);\n\t\t// _f('material', JsConnectionPointType.MATERIAL);\n\t}\n\n\t// public override outputValue(\n\t// \tcontext: JsNodeTriggerContext,\n\t// \toutputName: string\n\t// ): ReturnValueTypeByJsConnectionPointType[JsConnectionPointType] | undefined {\n\t// \tconst Object3D =\n\t// \t\tthis._inputValue<JsConnectionPointType.OBJECT_3D>(JsConnectionPointType.OBJECT_3D, context) ||\n\t// \t\tcontext.Object3D;\n\n\t// \treturn Object3D.userData[this.pv.name];\n\t// }\n}\n","/**\n * allows to set up complex animations using keyframes\n *\n *\n */\n\nimport {NodeParamsConfig, ParamConfig} from './../utils/params/ParamsConfig';\nimport {TypedJsNode} from './_Base';\nimport {JsConnectionPointType} from '../utils/io/connections/Js';\nimport {ChannelData} from '../../../core/keyframes/KeyframeCommon';\nimport {sampleData, sampleData0} from '../../../core/keyframes/KeyframeSamples';\nimport {rangeStartEnd} from '../../../core/ArrayUtils';\nimport {IntegerParam} from '../../params/Integer';\nimport {StringParam} from '../../params/String';\nimport {ConstantJsDefinition} from './utils/JsDefinition';\nimport {Poly} from '../../Poly';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {channelDataToString} from '../../../core/keyframes/KeyframeSerialize';\nimport {createVariable} from './code/assemblers/_BaseJsPersistedConfigUtils';\nimport {isArray} from '../../../core/Type';\nimport {_setArrayLength} from '../../functions/_ArrayUtils';\n\ninterface VectorLinesOptions {\n\toutputName: string;\n\tchannelIndex: number;\n\tdataType: JsConnectionPointType.VECTOR2 | JsConnectionPointType.VECTOR3 | JsConnectionPointType.VECTOR4;\n\tchannelCreate: 'channelVector2' | 'channelVector3' | 'channelVector4';\n\tchannelGetValue: 'channelValueVector2' | 'channelValueVector3' | 'channelValueVector4';\n}\n\n// const INIT_DATA: ChannelsData = {\n// \tdepth: SAMPLE_DATA\n// };\nenum KeyframesJsNodeInputName {\n\ttime = 'time',\n}\n\ntype AvailableJsConnectionType =\n\t| JsConnectionPointType.FLOAT\n\t| JsConnectionPointType.VECTOR2\n\t| JsConnectionPointType.VECTOR3\n\t| JsConnectionPointType.VECTOR4;\nexport const AVAILABLE_JS_CONNECTION_POINT_TYPES: AvailableJsConnectionType[] = [\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n];\nexport const ARRAY_SIZE_BY_TYPE: Record<AvailableJsConnectionType, number> = {\n\t[JsConnectionPointType.FLOAT]: 1,\n\t[JsConnectionPointType.VECTOR2]: 2,\n\t[JsConnectionPointType.VECTOR3]: 3,\n\t[JsConnectionPointType.VECTOR4]: 4,\n};\nexport const CHANNEL_SUFFIX_BY_CHANNEL_INDEX: string[] = ['x', 'y', 'z', 'w'];\n\nfunction visibleIfChannelsCountAtLeast(index: number) {\n\treturn {\n\t\tvisibleIf: rangeStartEnd(index + 1, 10).map((i) => ({channelsCount: i})),\n\t};\n}\nfunction channelTypeParam(index: number) {\n\treturn ParamConfig.INTEGER(AVAILABLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: AVAILABLE_JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t\tseparatorBefore: true,\n\t\t...visibleIfChannelsCountAtLeast(index),\n\t});\n}\nfunction channelNameParam(index: number) {\n\treturn ParamConfig.STRING(`channel${index}`, {\n\t\t...visibleIfChannelsCountAtLeast(index),\n\t});\n}\nfunction channelDataParam(index: number) {\n\treturn ParamConfig.STRING(channelDataToString(sampleData()), {\n\t\t...visibleIfChannelsCountAtLeast(index),\n\t});\n}\nexport function channelDataInputName(index: number) {\n\treturn `data${index}`;\n}\nclass KeyframesJsParamsConfig extends NodeParamsConfig {\n\t// main = ParamConfig.FOLDER();\n\t// time = ParamConfig.FLOAT(0, {\n\t// \tstep: 0.001,\n\t// });\n\tchannels = ParamConfig.FOLDER();\n\tchannelsCount = ParamConfig.INTEGER(1, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, true],\n\t});\n\tchannelType0 = channelTypeParam(0);\n\tchannelName0 = channelNameParam(0);\n\tdata0 = channelDataParam(0);\n\tchannelType1 = channelTypeParam(1);\n\tchannelName1 = channelNameParam(1);\n\tdata1 = channelDataParam(1);\n\tchannelType2 = channelTypeParam(2);\n\tchannelName2 = channelNameParam(2);\n\tdata2 = channelDataParam(2);\n\tchannelType3 = channelTypeParam(3);\n\tchannelName3 = channelNameParam(3);\n\tdata3 = channelDataParam(3);\n\tchannelType4 = channelTypeParam(4);\n\tchannelName4 = channelNameParam(4);\n\tdata4 = channelDataParam(4);\n\tchannelType5 = channelTypeParam(5);\n\tchannelName5 = channelNameParam(5);\n\tdata5 = channelDataParam(5);\n\tchannelType6 = channelTypeParam(6);\n\tchannelName6 = channelNameParam(6);\n\tdata6 = channelDataParam(6);\n\tchannelType7 = channelTypeParam(7);\n\tchannelName7 = channelNameParam(7);\n\tdata7 = channelDataParam(7);\n\tchannelType8 = channelTypeParam(8);\n\tchannelName8 = channelNameParam(8);\n\tdata8 = channelDataParam(8);\n\tchannelType9 = channelTypeParam(9);\n\tchannelName9 = channelNameParam(9);\n\tdata9 = channelDataParam(9);\n\tspare = ParamConfig.FOLDER();\n}\nconst ParamsConfig = new KeyframesJsParamsConfig();\n\nexport class KeyframesJsNode extends TypedJsNode<KeyframesJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.KEYFRAMES;\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputName.bind(this));\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputName.bind(this));\n\t}\n\n\tchannelTypeParams(): IntegerParam[] {\n\t\treturn [\n\t\t\tthis.p.channelType0,\n\t\t\tthis.p.channelType1,\n\t\t\tthis.p.channelType2,\n\t\t\tthis.p.channelType3,\n\t\t\tthis.p.channelType4,\n\t\t\tthis.p.channelType5,\n\t\t\tthis.p.channelType6,\n\t\t\tthis.p.channelType7,\n\t\t\tthis.p.channelType8,\n\t\t\tthis.p.channelType9,\n\t\t];\n\t}\n\tchannelNameParams(): StringParam[] {\n\t\treturn [\n\t\t\tthis.p.channelName0,\n\t\t\tthis.p.channelName1,\n\t\t\tthis.p.channelName2,\n\t\t\tthis.p.channelName3,\n\t\t\tthis.p.channelName4,\n\t\t\tthis.p.channelName5,\n\t\t\tthis.p.channelName6,\n\t\t\tthis.p.channelName7,\n\t\t\tthis.p.channelName8,\n\t\t\tthis.p.channelName9,\n\t\t];\n\t}\n\tchannelDataParams(): StringParam[] {\n\t\treturn [\n\t\t\tthis.p.data0,\n\t\t\tthis.p.data1,\n\t\t\tthis.p.data2,\n\t\t\tthis.p.data3,\n\t\t\tthis.p.data4,\n\t\t\tthis.p.data5,\n\t\t\tthis.p.data6,\n\t\t\tthis.p.data7,\n\t\t\tthis.p.data8,\n\t\t\tthis.p.data9,\n\t\t];\n\t}\n\t// dataParam(channelName: string) {\n\t// \tconst paramIndex = this.channelNameParams().findIndex((param) => param.value === channelName);\n\t// \treturn this.channelDataParams()[paramIndex];\n\t// }\n\n\t// channelsData(target: ChannelsData) {\n\t// \t// const data: ChannelsData = {};\n\t// \tconst existingChannelNames = Object.keys(target);\n\t// \tfor (const channelName of existingChannelNames) {\n\t// \t\tdelete target[channelName];\n\t// \t}\n\n\t// \tconst count = this.pv.channelsCount;\n\t// \tfor (let i = 0; i < count; i++) {\n\t// \t\tconst channelName = this._channelNameParams()[i].value;\n\t// \t\tconst channelData = JSON.parse(this.channelDataParams()[i].value);\n\t// \t\ttarget[channelName] = channelData;\n\t// \t}\n\t// }\n\n\tsetChannelType(index: number, type: AvailableJsConnectionType) {\n\t\tconst param = this.channelTypeParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tparam.set(AVAILABLE_JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tsetChannelName(index: number, inputName: string) {\n\t\tconst param = this.channelNameParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tparam.set(inputName);\n\t}\n\tsetChannelData(index: number, data: ChannelData[]) {\n\t\tconst param = this.channelDataParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tconst expectedArraySize = ARRAY_SIZE_BY_TYPE[this._expectedOutputTypes()[index]];\n\t\tif (expectedArraySize > 1) {\n\t\t\tparam.set(JSON.stringify(data));\n\t\t} else {\n\t\t\tconst firstElem = data[0];\n\t\t\tparam.set(JSON.stringify(firstElem));\n\t\t}\n\t}\n\tchannelData(index: number): ChannelData | ChannelData[] | undefined {\n\t\tconst param = this.channelDataParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tconst data = JSON.parse(param.value) as ChannelData | ChannelData[];\n\t\tconst expectedArraySize = ARRAY_SIZE_BY_TYPE[this._expectedOutputTypes()[index]];\n\t\tif (expectedArraySize > 1) {\n\t\t\t// make array if not already one\n\t\t\tif (isArray(data)) {\n\t\t\t\tif (data.length != expectedArraySize) {\n\t\t\t\t\t_setArrayLength(data, expectedArraySize, sampleData0);\n\t\t\t\t}\n\t\t\t\treturn data as ChannelData[];\n\t\t\t} else {\n\t\t\t\tconst newData = [data];\n\t\t\t\t_setArrayLength(newData, expectedArraySize, sampleData0);\n\t\t\t\treturn newData;\n\t\t\t}\n\t\t} else {\n\t\t\t// use first element if array\n\t\t\tif (isArray(data)) {\n\t\t\t\treturn data[0];\n\t\t\t} else {\n\t\t\t\treturn data;\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _channelsCount(): number {\n\t\treturn this.pv.channelsCount;\n\t}\n\n\tprotected _expectedInputTypes(): JsConnectionPointType[] {\n\t\t// const count = this.pv.channelsCount;\n\t\treturn [JsConnectionPointType.FLOAT]; //, ...ArrayUtils.range(0, count).map(() => JsConnectionPointType.STRING)];\n\t}\n\tprotected _expectedInputName(index: number) {\n\t\t// const count = this.pv.channelsCount;\n\t\t// const dataNames: string[] = ArrayUtils.range(0, count).map((i) =>\n\t\t// \tchannelDataInputName(this._expectedOutputName(i))\n\t\t// );\n\t\treturn [KeyframesJsNodeInputName.time][index];\n\t}\n\n\tprotected _expectedOutputTypes() {\n\t\tconst count = this._channelsCount();\n\t\tconst params: IntegerParam[] = this.channelTypeParams();\n\t\treturn rangeStartEnd(0, count).map((value, i) => AVAILABLE_JS_CONNECTION_POINT_TYPES[params[i].value]);\n\t}\n\n\tprotected _expectedOutputName(index: number) {\n\t\tconst params: StringParam[] = this.channelNameParams();\n\t\treturn params[index].value;\n\t}\n\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tconst time = this.variableForInput(linesController, KeyframesJsNodeInputName.time);\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\n\t\tconst _f = (outputName: string, channelIndex: number) => {\n\t\t\tif (!usedOutputNames.includes(outputName)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst funcCurve = Poly.namedFunctionsRegister.getFunction('channelFloat', this, linesController);\n\t\t\tconst funcCurveValue = Poly.namedFunctionsRegister.getFunction('channelValueFloat', this, linesController);\n\t\t\tconst curve = this.jsVarName(`${outputName}_CURVE`);\n\t\t\tconst out = this.jsVarName(outputName);\n\t\t\tlinesController.addDefinitions(this, [\n\t\t\t\tnew ConstantJsDefinition(\n\t\t\t\t\tthis,\n\t\t\t\t\tlinesController,\n\t\t\t\t\tJsConnectionPointType.FLOAT,\n\t\t\t\t\tcurve,\n\t\t\t\t\tfuncCurve.asString(this.channelDataParams()[channelIndex].value)\n\t\t\t\t),\n\t\t\t]);\n\n\t\t\tlinesController.addBodyOrComputed(this, [\n\t\t\t\t{\n\t\t\t\t\tdataType: JsConnectionPointType.FLOAT,\n\t\t\t\t\tvarName: out,\n\t\t\t\t\tvalue: funcCurveValue.asString(linesController.assembler().memberReference(curve), time),\n\t\t\t\t},\n\t\t\t]);\n\t\t};\n\t\tconst _v = (options: VectorLinesOptions) => {\n\t\t\tconst {outputName, channelIndex, dataType, channelCreate, channelGetValue} = options;\n\t\t\tif (!usedOutputNames.includes(outputName)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst funcCurve = Poly.namedFunctionsRegister.getFunction(channelCreate, this, linesController);\n\t\t\tconst funcCurveValue = Poly.namedFunctionsRegister.getFunction(channelGetValue, this, linesController);\n\t\t\tconst variable = createVariable(dataType);\n\n\t\t\tconst curve = this.jsVarName(`${outputName}_CURVE`);\n\t\t\tconst out = this.jsVarName(outputName);\n\t\t\tlinesController.addDefinitions(this, [\n\t\t\t\tnew ConstantJsDefinition(\n\t\t\t\t\tthis,\n\t\t\t\t\tlinesController,\n\t\t\t\t\tdataType,\n\t\t\t\t\tcurve,\n\t\t\t\t\tfuncCurve.asString(this.channelDataParams()[channelIndex].value)\n\t\t\t\t),\n\t\t\t]);\n\t\t\tif (variable) {\n\t\t\t\tconst tmpVarName = linesController.addVariable(this, variable);\n\t\t\t\tlinesController.addBodyOrComputed(this, [\n\t\t\t\t\t{\n\t\t\t\t\t\tdataType,\n\t\t\t\t\t\tvarName: out,\n\t\t\t\t\t\tvalue: funcCurveValue.asString(\n\t\t\t\t\t\t\tlinesController.assembler().memberReference(curve),\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t\ttmpVarName\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t}\n\t\t};\n\n\t\tconst channelsCount = this._channelsCount();\n\t\tfor (let channelIndex = 0; channelIndex < channelsCount; channelIndex++) {\n\t\t\tconst outputName = this._expectedOutputName(channelIndex);\n\t\t\tconst channelType = this._expectedOutputTypes()[channelIndex];\n\t\t\tswitch (channelType) {\n\t\t\t\tcase JsConnectionPointType.FLOAT: {\n\t\t\t\t\t_f(outputName, channelIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\t\t\t_v({\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\tchannelIndex,\n\t\t\t\t\t\tdataType: channelType,\n\t\t\t\t\t\tchannelCreate: 'channelVector2',\n\t\t\t\t\t\tchannelGetValue: 'channelValueVector2',\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\t\t\t_v({\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\tchannelIndex,\n\t\t\t\t\t\tdataType: channelType,\n\t\t\t\t\t\tchannelCreate: 'channelVector3',\n\t\t\t\t\t\tchannelGetValue: 'channelValueVector3',\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\t\t\t_v({\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\tchannelIndex,\n\t\t\t\t\t\tdataType: channelType,\n\t\t\t\t\t\tchannelCreate: 'channelVector4',\n\t\t\t\t\t\tchannelGetValue: 'channelValueVector4',\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * sends a trigger when a child attribute has been updated\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME, TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {\n\tJsConnectionPoint,\n\tJsConnectionPointType,\n\tJsConnectionPointTypeToArrayTypeMap,\n\tJS_CONNECTION_POINT_IN_NODE_DEF,\n\tParamConvertibleJsType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../utils/io/connections/Js';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {StringParam} from '../../params/String';\nimport {inputObject3D} from './_BaseObject3D';\nimport {Poly} from '../../Poly';\nimport {WatchedValueJsDefinition} from './utils/JsDefinition';\nimport {nodeMethodName} from './code/assemblers/actor/ActorAssemblerUtils';\nimport {createVariable} from './code/assemblers/_BaseJsPersistedConfigUtils';\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nenum OnChildAttributeUpdateInputName {\n\tattribName = 'attribName',\n}\n\nclass OnChildAttributeUpdateJsParamsConfig extends NodeParamsConfig {\n\t// attribName = ParamConfig.STRING('');\n\ttype = ParamConfig.INTEGER(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n}\nconst ParamsConfig = new OnChildAttributeUpdateJsParamsConfig();\n\nexport class OnChildAttributeUpdateJsNode extends TypedJsNode<OnChildAttributeUpdateJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.ON_CHILD_ATTRIBUTE_UPDATE;\n\t}\n\toverride isTriggering() {\n\t\treturn true;\n\t}\n\n\tstatic readonly OUTPUT_NEW_VALUES = 'newValues';\n\tstatic readonly OUTPUT_PREV_VALUES = 'previousValues';\n\toverride initializeNode() {\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(\n\t\t\t\tOnChildAttributeUpdateInputName.attribName,\n\t\t\t\tJsConnectionPointType.STRING,\n\t\t\t\tCONNECTION_OPTIONS\n\t\t\t),\n\t\t]);\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS),\n\t\t]);\n\n\t\tthis.io.connection_points.set_expected_input_types_function(() => []);\n\t\tthis.io.connection_points.set_output_name_function(\n\t\t\t(index: number) =>\n\t\t\t\t[\n\t\t\t\t\tTRIGGER_CONNECTION_NAME,\n\t\t\t\t\tOnChildAttributeUpdateJsNode.OUTPUT_NEW_VALUES,\n\t\t\t\t\tOnChildAttributeUpdateJsNode.OUTPUT_PREV_VALUES,\n\t\t\t\t][index]\n\t\t);\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [\n\t\t\tJsConnectionPointType.TRIGGER,\n\t\t\t...this._currentConnectionType(),\n\t\t]);\n\t}\n\tprivate _currentConnectionType() {\n\t\tif (this.pv.type == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\tconst connectionType = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tif (connectionType == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\tconst arrayConnectionType = JsConnectionPointTypeToArrayTypeMap[connectionType];\n\t\treturn [arrayConnectionType, arrayConnectionType];\n\t}\n\n\tprivate _nextAttribName: string = '';\n\toverride paramDefaultValue(name: OnChildAttributeUpdateInputName) {\n\t\treturn {\n\t\t\t[OnChildAttributeUpdateInputName.attribName]: this._nextAttribName,\n\t\t}[name];\n\t}\n\tsetAttribType(type: ParamConvertibleJsType) {\n\t\tthis.p.type.set(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tattribType(): JsConnectionPointType {\n\t\treturn PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t}\n\tsetAttribName(attribName: string) {\n\t\tconst param = this.params.get(OnChildAttributeUpdateInputName.attribName) as StringParam | undefined;\n\t\tif (param) {\n\t\t\tparam.set(attribName);\n\t\t} else {\n\t\t\tthis._nextAttribName = attribName;\n\t\t}\n\t}\n\tattributeName() {\n\t\treturn (this.params.get(OnChildAttributeUpdateInputName.attribName) as StringParam).value;\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst type = this.attribType();\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\t\tconst attribName = this.variableForInput(\n\t\t\tshadersCollectionController,\n\t\t\tOnChildAttributeUpdateInputName.attribName\n\t\t);\n\n\t\tconst getChildrenAttributesRef = Poly.namedFunctionsRegister.getFunction(\n\t\t\t'getChildrenAttributesRef',\n\t\t\tthis,\n\t\t\tshadersCollectionController\n\t\t);\n\n\t\tconst varName = this.jsVarName('in');\n\t\tconst variable = createVariable(JsConnectionPointTypeToArrayTypeMap[type]);\n\t\tconst tmpVarName = variable ? shadersCollectionController.addVariable(this, variable, varName) : undefined;\n\t\tif (tmpVarName) {\n\t\t\tshadersCollectionController.addDefinitions(this, [\n\t\t\t\tnew WatchedValueJsDefinition(\n\t\t\t\t\tthis,\n\t\t\t\t\tshadersCollectionController,\n\t\t\t\t\ttype,\n\t\t\t\t\tgetChildrenAttributesRef.asString(object3D, attribName, `'${type}'`, tmpVarName),\n\t\t\t\t\t`this.${nodeMethodName(this)}()`,\n\t\t\t\t\t{\n\t\t\t\t\t\tdeep: true,\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t]);\n\t\t}\n\n\t\t// outputs\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\t\tconst _val = (\n\t\t\tpropertyName: string,\n\t\t\tfunctionName: 'getChildrenAttributes' | 'getChildrenAttributesPrevious',\n\t\t\ttype: JsConnectionPointType\n\t\t) => {\n\t\t\tif (!usedOutputNames.includes(propertyName)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController);\n\t\t\tconst varName = this.jsVarName(propertyName);\n\t\t\tconst variable = createVariable(JsConnectionPointTypeToArrayTypeMap[type]);\n\t\t\tconst tmpVarName = variable ? shadersCollectionController.addVariable(this, variable, varName) : undefined;\n\t\t\tif (tmpVarName) {\n\t\t\t\tshadersCollectionController.addBodyOrComputed(this, [\n\t\t\t\t\t{\n\t\t\t\t\t\tdataType: type,\n\t\t\t\t\t\tvarName,\n\t\t\t\t\t\tvalue: func.asString(object3D, attribName, `'${type}'`, tmpVarName),\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t}\n\t\t};\n\n\t\t_val(OnChildAttributeUpdateJsNode.OUTPUT_NEW_VALUES, 'getChildrenAttributes', type);\n\t\t_val(OnChildAttributeUpdateJsNode.OUTPUT_PREV_VALUES, 'getChildrenAttributesPrevious', type);\n\t}\n\n\toverride setTriggeringLines(shadersCollectionController: JsLinesCollectionController, triggeredMethods: string) {\n\t\tconst type = this.attribType();\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\t\tconst attribName = this.variableForInput(\n\t\t\tshadersCollectionController,\n\t\t\tOnChildAttributeUpdateInputName.attribName\n\t\t);\n\t\tconst getChildrenAttributesRef = Poly.namedFunctionsRegister.getFunction(\n\t\t\t'getChildrenAttributesRef',\n\t\t\tthis,\n\t\t\tshadersCollectionController\n\t\t);\n\t\tconst varName = this.jsVarName('in');\n\t\tconst variable = createVariable(JsConnectionPointTypeToArrayTypeMap[type]);\n\t\tconst tmpVarName = variable ? shadersCollectionController.addVariable(this, variable, varName) : undefined;\n\t\tif (tmpVarName) {\n\t\t\tshadersCollectionController.addDefinitions(this, [\n\t\t\t\tnew WatchedValueJsDefinition(\n\t\t\t\t\tthis,\n\t\t\t\t\tshadersCollectionController,\n\t\t\t\t\ttype,\n\t\t\t\t\tgetChildrenAttributesRef.asString(object3D, attribName, `'${type}'`, tmpVarName),\n\t\t\t\t\t`this.${nodeMethodName(this)}()`,\n\t\t\t\t\t{\n\t\t\t\t\t\tdeep: true,\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t]);\n\t\t}\n\n\t\tshadersCollectionController.addTriggeringLines(this, [triggeredMethods], {\n\t\t\tgatherable: false,\n\t\t});\n\t}\n}\n","/**\n * sends a trigger when a keyboard key is pressed or released\n *\n *\n */\n\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {EvaluatorEventData} from './code/assemblers/actor/ActorEvaluator';\nimport {KeyboardEventType} from '../../../core/event/KeyboardEventType';\nimport {BaseOnKeyEventJsNode} from './_BaseOnKeyEvent';\n\nexport class OnKeyJsNode extends BaseOnKeyEventJsNode {\n\tstatic override type() {\n\t\treturn JsType.ON_KEY;\n\t}\n\toverride eventData(): EvaluatorEventData[] | undefined {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: KeyboardEventType.keydown,\n\t\t\t\temitter: this.eventEmitter(),\n\t\t\t\tjsType: JsType.ON_KEY,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: KeyboardEventType.keyup,\n\t\t\t\temitter: this.eventEmitter(),\n\t\t\t\tjsType: JsType.ON_KEY,\n\t\t\t},\n\t\t];\n\t}\n}\n","/**\n * sends a trigger when an object attribute has been updated\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME, TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {\n\tJsConnectionPoint,\n\tJsConnectionPointType,\n\tJS_CONNECTION_POINT_IN_NODE_DEF,\n\tParamConvertibleJsType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../utils/io/connections/Js';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {inputObject3D} from './_BaseObject3D';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {WatchedValueJsDefinition} from './utils/JsDefinition';\nimport {Poly} from '../../Poly';\nimport {nodeMethodName} from './code/assemblers/actor/ActorAssemblerUtils';\nimport {createVariable} from './code/assemblers/_BaseJsPersistedConfigUtils';\nimport {StringParam} from '../../params/String';\nenum OnObjectAttributeUpdateInputName {\n\tattribName = 'attribName',\n}\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\nclass OnObjectAttributeUpdateJsParamsConfig extends NodeParamsConfig {\n\t/** @param type */\n\ttype = ParamConfig.INTEGER(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n}\nconst ParamsConfig = new OnObjectAttributeUpdateJsParamsConfig();\n\nexport class OnObjectAttributeUpdateJsNode extends TypedJsNode<OnObjectAttributeUpdateJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.ON_OBJECT_ATTRIBUTE_UPDATE;\n\t}\n\toverride isTriggering() {\n\t\treturn true;\n\t}\n\n\tstatic readonly OUTPUT_NEW_VAL = 'newValue';\n\tstatic readonly OUTPUT_PREV_VAL = 'previousValue';\n\toverride initializeNode() {\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['type']);\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(\n\t\t\t\tOnObjectAttributeUpdateInputName.attribName,\n\t\t\t\tJsConnectionPointType.STRING,\n\t\t\t\tCONNECTION_OPTIONS\n\t\t\t),\n\t\t]);\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS),\n\t\t]);\n\n\t\tthis.io.connection_points.set_expected_input_types_function(() => []);\n\t\tthis.io.connection_points.set_output_name_function(\n\t\t\t(index: number) =>\n\t\t\t\t[\n\t\t\t\t\tTRIGGER_CONNECTION_NAME,\n\t\t\t\t\tOnObjectAttributeUpdateJsNode.OUTPUT_NEW_VAL,\n\t\t\t\t\tOnObjectAttributeUpdateJsNode.OUTPUT_PREV_VAL,\n\t\t\t\t][index]\n\t\t);\n\t\tthis.io.connection_points.set_expected_output_types_function(() => [\n\t\t\tJsConnectionPointType.TRIGGER,\n\t\t\t...this._currentConnectionType(),\n\t\t]);\n\t}\n\tprivate _currentConnectionType() {\n\t\tif (this.pv.type == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\tconst connectionType = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t\tif (connectionType == null) {\n\t\t\tconsole.warn(`${this.type()} actor node type not valid`);\n\t\t}\n\t\treturn [connectionType, connectionType];\n\t}\n\n\tsetAttribType(type: ParamConvertibleJsType) {\n\t\tthis.p.type.set(PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tattribType(): JsConnectionPointType {\n\t\treturn PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES[this.pv.type];\n\t}\n\tsetAttribName(attribName: string) {\n\t\t(this.params.get(OnObjectAttributeUpdateInputName.attribName) as StringParam).set(attribName);\n\t}\n\tattributeName() {\n\t\treturn (this.params.get(OnObjectAttributeUpdateInputName.attribName) as StringParam).value;\n\t}\n\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tconst type = this.attribType();\n\t\tconst object3D = inputObject3D(this, linesController);\n\t\tconst attribName = this.variableForInput(linesController, OnObjectAttributeUpdateInputName.attribName);\n\n\t\t// outputs\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\t\tconst _val = (\n\t\t\tpropertyName: string,\n\t\t\tfunctionName: 'getObjectAttributeAutoDefault' | 'getObjectAttributePrevious',\n\t\t\ttype: JsConnectionPointType\n\t\t) => {\n\t\t\tif (!usedOutputNames.includes(propertyName)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, linesController);\n\t\t\tconst varName = this.jsVarName(propertyName);\n\t\t\tconst variable = createVariable(type);\n\t\t\tif (variable) {\n\t\t\t\tlinesController.addVariable(this, variable);\n\t\t\t}\n\t\t\tlinesController.addBodyOrComputed(this, [\n\t\t\t\t{\n\t\t\t\t\tdataType: type,\n\t\t\t\t\tvarName,\n\t\t\t\t\tvalue: func.asString(object3D, attribName, `'${type}'`),\n\t\t\t\t},\n\t\t\t]);\n\t\t};\n\n\t\t_val(OnObjectAttributeUpdateJsNode.OUTPUT_NEW_VAL, 'getObjectAttributeAutoDefault', type);\n\t\t_val(OnObjectAttributeUpdateJsNode.OUTPUT_PREV_VAL, 'getObjectAttributePrevious', type);\n\t}\n\n\toverride setTriggeringLines(linesController: JsLinesCollectionController, triggeredMethods: string) {\n\t\tconst type = this.attribType();\n\t\tconst object3D = inputObject3D(this, linesController);\n\t\tconst attribName = this.variableForInput(linesController, OnObjectAttributeUpdateInputName.attribName);\n\n\t\tconst getObjectAttributeRef = Poly.namedFunctionsRegister.getFunction(\n\t\t\t'getObjectAttributeRef',\n\t\t\tthis,\n\t\t\tlinesController\n\t\t);\n\n\t\tlinesController.addDefinitions(this, [\n\t\t\tnew WatchedValueJsDefinition(\n\t\t\t\tthis,\n\t\t\t\tlinesController,\n\t\t\t\ttype,\n\t\t\t\tgetObjectAttributeRef.asString(object3D, attribName, `'${type}'`),\n\t\t\t\t`this.${nodeMethodName(this)}()`,\n\t\t\t\t{\n\t\t\t\t\tdeep: true,\n\t\t\t\t}\n\t\t\t),\n\t\t]);\n\n\t\tlinesController.addTriggeringLines(this, [triggeredMethods], {\n\t\t\tgatherable: false,\n\t\t});\n\t}\n}\n","/**\n * sends a trigger when the viewer swipes on an object\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME} from './_Base';\nimport {JsConnectionPoint, JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF} from '../utils/io/connections/Js';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {EvaluatorEventData} from './code/assemblers/actor/ActorEvaluator';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {\n\tCPUOnObjectPointerEventJsParamsConfig,\n\tExtendableOnObjectPointerEventJsNode,\n\tPointerEventConfigParamConfig,\n\tpointerButtonConfig,\n} from './_BaseOnObjectPointerEvent';\nimport {PointerEventType} from '../../../core/event/PointerEventType';\nimport {inputObject3D} from './_BaseObject3D';\nimport {Poly} from '../../Poly';\nimport {InitFunctionJsDefinition, RefJsDefinition} from './utils/JsDefinition';\nimport {\n\tObjectToSwipeOptionsAsString,\n\tSwipeParamConfig,\n} from '../../scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsSwipeController';\nimport {nodeMethodName} from './code/assemblers/actor/ActorAssemblerUtils';\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nexport class OnObjectSwipeJsParamsConfig extends PointerEventConfigParamConfig(\n\tSwipeParamConfig(CPUOnObjectPointerEventJsParamsConfig)\n) {}\nconst ParamsConfig = new OnObjectSwipeJsParamsConfig();\n\nexport class OnObjectSwipeJsNode extends ExtendableOnObjectPointerEventJsNode<OnObjectSwipeJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.ON_OBJECT_SWIPE;\n\t}\n\n\toverride eventData(): EvaluatorEventData[] | undefined {\n\t\t// we need both pointerdown and pointerup events,\n\t\t// to ensure that the raycaster gets its cursor updated\n\t\t// on each event\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: PointerEventType.pointerdown,\n\t\t\t\temitter: this.eventEmitter(),\n\t\t\t\tjsType: JsType.ON_OBJECT_POINTERDOWN,\n\t\t\t},\n\t\t\t// pointerup is currently needed to update the pointerEventsController cursor\n\t\t\t{\n\t\t\t\ttype: PointerEventType.pointerup,\n\t\t\t\temitter: this.eventEmitter(),\n\t\t\t\tjsType: JsType.ON_OBJECT_POINTERUP,\n\t\t\t},\n\t\t];\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(\n\t\t\t\tJsConnectionPointType.INTERSECTION,\n\t\t\t\tJsConnectionPointType.INTERSECTION,\n\t\t\t\tCONNECTION_OPTIONS\n\t\t\t),\n\t\t]);\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['pointsThreshold', 'lineThreshold', 'element']);\n\t}\n\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\t\tif (usedOutputNames.includes(JsConnectionPointType.INTERSECTION)) {\n\t\t\tthis._addIntersectionRef(linesController);\n\t\t}\n\t}\n\toverride setTriggeringLines(linesController: JsLinesCollectionController, triggeredMethods: string) {\n\t\tconst object3D = inputObject3D(this, linesController);\n\t\tconst blockObjectsBehind = this.variableForInputParam(linesController, this.p.blockObjectsBehind);\n\t\tconst skipIfObjectsInFront = this.variableForInputParam(linesController, this.p.skipIfObjectsInFront);\n\t\tconst traverseChildren = this.variableForInputParam(linesController, this.p.traverseChildren);\n\t\tconst lineThreshold = this.variableForInputParam(linesController, this.p.lineThreshold);\n\t\tconst pointsThreshold = this.variableForInputParam(linesController, this.p.pointsThreshold);\n\t\tconst angle = this.variableForInputParam(linesController, this.p.angle);\n\t\tconst angleMargin = this.variableForInputParam(linesController, this.p.angleMargin);\n\t\tconst minDistance = this.variableForInputParam(linesController, this.p.minDistance);\n\t\tconst intersectionRef = this._addIntersectionRef(linesController);\n\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('addObjectToObjectSwipeCheck', this, linesController);\n\t\tconst options: ObjectToSwipeOptionsAsString = {\n\t\t\tpriority: {\n\t\t\t\tblockObjectsBehind,\n\t\t\t\tskipIfObjectsInFront,\n\t\t\t},\n\t\t\tcpu: {\n\t\t\t\ttraverseChildren,\n\t\t\t\tpointsThreshold,\n\t\t\t\tlineThreshold,\n\t\t\t\tintersectionRef: `this.${intersectionRef}`,\n\t\t\t},\n\t\t\tswipe: {\n\t\t\t\tangle,\n\t\t\t\tangleMargin,\n\t\t\t\tminDistance,\n\t\t\t\tcallback: `this.${nodeMethodName(this)}.bind(this)`,\n\t\t\t},\n\t\t\tconfig: pointerButtonConfig(this, linesController),\n\t\t};\n\t\tconst jsonOptions = JSON.stringify(options).replace(/\"/g, '');\n\t\tconst bodyLine = func.asString(object3D, `this`, jsonOptions);\n\t\tlinesController.addDefinitions(this, [\n\t\t\tnew InitFunctionJsDefinition(this, linesController, JsConnectionPointType.OBJECT_3D, this.path(), bodyLine),\n\t\t]);\n\n\t\tlinesController.addTriggeringLines(this, [triggeredMethods], {gatherable: true});\n\t}\n\n\tprivate _addIntersectionRef(linesController: JsLinesCollectionController) {\n\t\tconst outIntersection = this.jsVarName(JsConnectionPointType.INTERSECTION);\n\t\tlinesController.addDefinitions(this, [\n\t\t\tnew RefJsDefinition(this, linesController, JsConnectionPointType.INTERSECTION, outIntersection, `null`),\n\t\t]);\n\t\treturn outIntersection;\n\t}\n}\n","/**\n * sends a trigger when the viewer swipes on an object\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME} from './_Base';\nimport {JsConnectionPoint, JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF} from '../utils/io/connections/Js';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {EvaluatorEventData} from './code/assemblers/actor/ActorEvaluator';\nimport {\n\tOnObjectPointerEventGPUJsNodeInputName,\n\tOnObjectPointerEventGPUJsNodeOutputName,\n\tCPUOnObjectPointerEventJsParamsConfig,\n\tExtendableOnObjectPointerEventJsNode,\n\tPointerEventConfigParamConfig,\n\tpointerButtonConfig,\n} from './_BaseOnObjectPointerEvent';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {PointerEventType} from '../../../core/event/PointerEventType';\nimport {inputObject3D} from './_BaseObject3D';\nimport {Poly} from '../../Poly';\nimport {InitFunctionJsDefinition, RefJsDefinition} from './utils/JsDefinition';\nimport {nodeMethodName} from './code/assemblers/actor/ActorAssemblerUtils';\nimport {\n\tObjectToSwipeOptionsAsString,\n\tSwipeParamConfig,\n} from '../../scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsSwipeController';\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nexport class OnObjectSwipeGPUJsParamsConfig extends PointerEventConfigParamConfig(\n\tSwipeParamConfig(CPUOnObjectPointerEventJsParamsConfig)\n) {}\nconst ParamsConfig = new OnObjectSwipeGPUJsParamsConfig();\n\nexport class OnObjectSwipeGPUJsNode extends ExtendableOnObjectPointerEventJsNode<OnObjectSwipeGPUJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.ON_OBJECT_SWIPE_GPU;\n\t}\n\toverride isTriggering() {\n\t\treturn true;\n\t}\n\n\toverride eventData(): EvaluatorEventData[] | undefined {\n\t\t// we need both pointerdown and pointerup events,\n\t\t// to ensure that the raycaster gets its cursor updated\n\t\t// on each event\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: PointerEventType.pointerdown,\n\t\t\t\temitter: this.eventEmitter(),\n\t\t\t\tjsType: JsType.ON_OBJECT_POINTERDOWN,\n\t\t\t},\n\t\t\t// pointerup is currently needed to update the pointerEventsController cursor\n\t\t\t{\n\t\t\t\ttype: PointerEventType.pointerup,\n\t\t\t\temitter: this.eventEmitter(),\n\t\t\t\tjsType: JsType.ON_OBJECT_POINTERUP,\n\t\t\t},\n\t\t];\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(\n\t\t\t\tOnObjectPointerEventGPUJsNodeInputName.worldPosMaterial,\n\t\t\t\tJsConnectionPointType.MATERIAL,\n\t\t\t\tCONNECTION_OPTIONS\n\t\t\t),\n\t\t]);\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(\n\t\t\t\tOnObjectPointerEventGPUJsNodeOutputName.distance,\n\t\t\t\tJsConnectionPointType.FLOAT,\n\t\t\t\tCONNECTION_OPTIONS\n\t\t\t),\n\t\t]);\n\t}\n\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\t\tif (usedOutputNames.includes(OnObjectPointerEventGPUJsNodeOutputName.distance)) {\n\t\t\tthis._addDistanceRef(linesController);\n\t\t}\n\t}\n\n\toverride setTriggeringLines(linesController: JsLinesCollectionController, triggeredMethods: string) {\n\t\tconst object3D = inputObject3D(this, linesController);\n\t\tconst blockObjectsBehind = this.variableForInputParam(linesController, this.p.blockObjectsBehind);\n\t\tconst skipIfObjectsInFront = this.variableForInputParam(linesController, this.p.skipIfObjectsInFront);\n\t\tconst worldPosMaterial = this.variableForInput(\n\t\t\tlinesController,\n\t\t\tOnObjectPointerEventGPUJsNodeInputName.worldPosMaterial\n\t\t);\n\t\tconst distanceRef = this._addDistanceRef(linesController);\n\t\tconst angle = this.variableForInputParam(linesController, this.p.angle);\n\t\tconst angleMargin = this.variableForInputParam(linesController, this.p.angleMargin);\n\t\tconst minDistance = this.variableForInputParam(linesController, this.p.minDistance);\n\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('addObjectToObjectSwipeCheck', this, linesController);\n\t\tconst options: ObjectToSwipeOptionsAsString = {\n\t\t\tpriority: {\n\t\t\t\tblockObjectsBehind,\n\t\t\t\tskipIfObjectsInFront,\n\t\t\t},\n\t\t\tgpu: {\n\t\t\t\tworldPosMaterial,\n\t\t\t\tdistanceRef: `this.${distanceRef}`,\n\t\t\t},\n\t\t\tswipe: {\n\t\t\t\tangle,\n\t\t\t\tangleMargin,\n\t\t\t\tminDistance,\n\t\t\t\tcallback: `this.${nodeMethodName(this)}.bind(this)`,\n\t\t\t},\n\t\t\tconfig: pointerButtonConfig(this, linesController),\n\t\t};\n\t\tconst jsonOptions = JSON.stringify(options).replace(/\"/g, '');\n\t\tconst bodyLine = func.asString(object3D, `this`, jsonOptions);\n\t\tlinesController.addDefinitions(this, [\n\t\t\tnew InitFunctionJsDefinition(this, linesController, JsConnectionPointType.OBJECT_3D, this.path(), bodyLine),\n\t\t]);\n\n\t\tlinesController.addTriggeringLines(this, [triggeredMethods], {gatherable: true});\n\t}\n\n\tprivate _addDistanceRef(linesController: JsLinesCollectionController) {\n\t\tconst outDistance = this.jsVarName(OnObjectPointerEventGPUJsNodeOutputName.distance);\n\t\tlinesController.addDefinitions(this, [\n\t\t\tnew RefJsDefinition(this, linesController, JsConnectionPointType.FLOAT, outDistance, `-1`),\n\t\t]);\n\t\treturn outDistance;\n\t}\n}\n","/**\n * gets the ray from a camera\n *\n * @remarks\n *\n * the parameter x and y should be in the [-1,1] range\n *\n * x = 0, y = 0  : canvas center\n * x = -1, y = -1: bottom left corner\n * x = -1, y = 1 : top left corner\n * x = 1, y = -1 : bottom right corner\n * x = 1, y = 1  : top right corner\n *\n */\n\nimport {TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsConnectionPoint, JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF} from '../utils/io/connections/Js';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {Ray} from 'three';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {Poly} from '../../Poly';\n\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nclass RayFromCameraJsParamsConfig extends NodeParamsConfig {\n\t/** @param x position in screen space  */\n\tx = ParamConfig.FLOAT(0, {\n\t\trange: [-1, 1],\n\t});\n\t/** @param y position in screen space */\n\ty = ParamConfig.FLOAT(0, {\n\t\trange: [-1, 1],\n\t});\n}\nconst ParamsConfig = new RayFromCameraJsParamsConfig();\nexport class RayFromCameraJsNode extends TypedJsNode<RayFromCameraJsParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn JsType.RAY_FROM_CAMERA;\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.CAMERA, JsConnectionPointType.CAMERA, CONNECTION_OPTIONS),\n\t\t]);\n\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.RAY, JsConnectionPointType.RAY),\n\t\t]);\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst camera = this.variableForInput(shadersCollectionController, JsConnectionPointType.CAMERA);\n\t\tconst x = this.variableForInputParam(shadersCollectionController, this.p.x);\n\t\tconst y = this.variableForInputParam(shadersCollectionController, this.p.y);\n\t\tconst out = this.jsVarName(JsConnectionPointType.RAY);\n\n\t\tconst tmpVarName = shadersCollectionController.addVariable(this, new Ray());\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('rayFromCamera', this, shadersCollectionController);\n\t\tconst bodyLine = func.asString(camera, x, y, tmpVarName);\n\t\tshadersCollectionController.addBodyOrComputed(this, [\n\t\t\t{dataType: JsConnectionPointType.FLOAT, varName: out, value: bodyLine},\n\t\t]);\n\t}\n}\n","/**\n * Update the material uniform\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME, TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsConnectionPointType} from '../utils/io/connections/Js';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {Poly} from '../../Poly';\nimport {\n\tfloatOutputFromInput,\n\tstringOutputFromInput,\n\tanyTypeOutputFromInput,\n\tinputObject3DMaterial,\n\tsetObject3DMaterialOutputLine,\n} from './_BaseObject3D';\n\ntype AvailableJsType =\n\t| JsConnectionPointType.COLOR\n\t| JsConnectionPointType.FLOAT\n\t| JsConnectionPointType.INT\n\t| JsConnectionPointType.TEXTURE\n\t| JsConnectionPointType.VECTOR2\n\t| JsConnectionPointType.VECTOR3\n\t| JsConnectionPointType.VECTOR4;\n\nexport const JS_CONNECTION_POINT_TYPES: Array<AvailableJsType> = [\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.TEXTURE,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n];\nconst NUMBER_TYPES = new Set([JsConnectionPointType.FLOAT, JsConnectionPointType.INT]);\nconst VECTOR_COLOR_TYPES = new Set([\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n]);\nconst DEFAULT_PARAM_VALUES = {lerp: 1, addPrefix: 1};\n\nenum SetMaterialUniformJsNodeInputName {\n\tuniformName = 'uniformName',\n\tlerp = 'lerp',\n}\n\nclass SetMaterialUniformJsParamsConfig extends NodeParamsConfig {\n\t/** @param printWarnings */\n\tprintWarnings = ParamConfig.BOOLEAN(1);\n\t/** @param add prefix */\n\taddPrefix = ParamConfig.BOOLEAN(1);\n\t/** @param uniform type */\n\ttype = ParamConfig.INTEGER(JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t\tseparatorBefore: true,\n\t});\n}\nconst ParamsConfig = new SetMaterialUniformJsParamsConfig();\n\nexport class SetMaterialUniformJsNode extends TypedJsNode<SetMaterialUniformJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'setMaterialUniform';\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['type']);\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputNames.bind(this));\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputType.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedInputNames.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedInputType.bind(this));\n\t}\n\tprivate _expectedInputNames(index: number) {\n\t\tconst list = [\n\t\t\tTRIGGER_CONNECTION_NAME,\n\t\t\tJsConnectionPointType.MATERIAL,\n\t\t\tthis.uniformType(),\n\t\t\tSetMaterialUniformJsNodeInputName.uniformName,\n\t\t];\n\t\tif (this._lerpAllowed()) {\n\t\t\tlist.push(SetMaterialUniformJsNodeInputName.lerp);\n\t\t}\n\t\treturn list[index];\n\t}\n\tprivate _expectedInputType() {\n\t\tconst list = [\n\t\t\tJsConnectionPointType.TRIGGER,\n\t\t\tJsConnectionPointType.MATERIAL,\n\t\t\tthis.uniformType(),\n\t\t\tJsConnectionPointType.STRING,\n\t\t];\n\t\tif (this._lerpAllowed()) {\n\t\t\tlist.push(JsConnectionPointType.FLOAT);\n\t\t}\n\t\treturn list;\n\t}\n\n\toverride paramDefaultValue(name: 'lerp') {\n\t\treturn DEFAULT_PARAM_VALUES[name];\n\t}\n\tuniformType() {\n\t\treturn JS_CONNECTION_POINT_TYPES[this.pv.type] || JsConnectionPointType.FLOAT;\n\t}\n\n\tsetUniformType(type: AvailableJsType) {\n\t\tthis.p.type.set(JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tsetObject3DMaterialOutputLine(this, linesController);\n\n\t\tanyTypeOutputFromInput(this, this.uniformType(), linesController);\n\t\tfloatOutputFromInput(this, SetMaterialUniformJsNodeInputName.lerp, linesController);\n\t\tstringOutputFromInput(this, SetMaterialUniformJsNodeInputName.uniformName, linesController);\n\t}\n\toverride setTriggerableLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst material = inputObject3DMaterial(this, shadersCollectionController);\n\t\tconst uniformName = this.variableForInput(\n\t\t\tshadersCollectionController,\n\t\t\tSetMaterialUniformJsNodeInputName.uniformName\n\t\t);\n\t\tconst uniformValue = this.variableForInput(shadersCollectionController, this.uniformType());\n\t\tconst printWarnings = this.pv.printWarnings ? 'true' : 'false';\n\t\tconst addPrefix = this.pv.addPrefix ? 'true' : 'false';\n\n\t\tif (this._isUniformNumber() || this._isUniformVectorColor()) {\n\t\t\tconst lerp = this.variableForInput(shadersCollectionController, SetMaterialUniformJsNodeInputName.lerp);\n\t\t\tif (this._isUniformNumber()) {\n\t\t\t\tconst functionName = 'setMaterialUniformNumber';\n\t\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController);\n\t\t\t\tconst bodyLine = func.asString(material, uniformName, uniformValue, lerp, addPrefix, printWarnings);\n\t\t\t\tshadersCollectionController.addTriggerableLines(this, [bodyLine]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._isUniformVectorColor()) {\n\t\t\t\tconst functionName = 'setMaterialUniformVectorColor';\n\t\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController);\n\t\t\t\tconst bodyLine = func.asString(material, uniformName, uniformValue, lerp, addPrefix, printWarnings);\n\t\t\t\tshadersCollectionController.addTriggerableLines(this, [bodyLine]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tconst functionName = 'setMaterialUniformTexture';\n\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController);\n\t\t\tconst bodyLine = func.asString(material, uniformName, uniformValue, addPrefix, printWarnings);\n\t\t\tshadersCollectionController.addTriggerableLines(this, [bodyLine]);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate _isUniformNumber() {\n\t\treturn NUMBER_TYPES.has(this.uniformType());\n\t}\n\tprivate _isUniformVectorColor() {\n\t\treturn VECTOR_COLOR_TYPES.has(this.uniformType());\n\t}\n\tprivate _lerpAllowed() {\n\t\treturn this._isUniformNumber() || this._isUniformVectorColor();\n\t}\n}\n","/**\n * a subnet can contain many nodes and is very useful to organise other nodes\n *\n *\n *\n */\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {TypedJsNode, BaseJsNodeType} from './_Base';\nimport {JsConnectionPointType, JS_CONNECTION_POINT_TYPES} from '../utils/io/connections/Js';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {NetworkChildNodeType, NetworkNodeType, NodeContext} from '../../poly/NodeContext';\nimport {JsNodeChildrenMap} from '../../poly/registers/nodes/Js';\nimport {SubnetInputJsNode} from './SubnetInput';\nimport {SubnetOutputJsNode} from './SubnetOutput';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {rangeStartEnd} from '../../../core/ArrayUtils';\nimport {IntegerParam} from '../../params/Integer';\nimport {StringParam} from '../../params/String';\nimport type {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {LineType} from './code/utils/LineType';\nimport {TypedNodeTraverser} from '../utils/shaders/NodeTraverser';\nimport {JsCodeBuilder} from './code/utils/CodeBuilder';\nimport {BaseJsDefinition} from './utils/JsDefinition';\nimport {AddBodyLinesOptions} from './code/utils/LinesController';\n\nexport const ADD_BODY_LINES_OPTIONS: AddBodyLinesOptions = {\n\tmakeUniq: false,\n};\n\nfunction visibleIfInputsCountAtLeast(index: number) {\n\treturn {\n\t\tvisibleIf: rangeStartEnd(index + 1, 10).map((i) => ({inputsCount: i})),\n\t};\n}\n\nfunction inputTypeParam(index: number) {\n\treturn ParamConfig.INTEGER(JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.FLOAT), {\n\t\tmenu: {\n\t\t\tentries: JS_CONNECTION_POINT_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t\tseparatorBefore: true,\n\t\t...visibleIfInputsCountAtLeast(index),\n\t});\n}\n\nfunction inputNameParam(index: number) {\n\treturn ParamConfig.STRING(`input${index}`, {\n\t\t...visibleIfInputsCountAtLeast(index),\n\t});\n}\n\nexport function TypedSubnetJsParamsConfigMixin<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tmain = ParamConfig.FOLDER();\n\t\ttime = ParamConfig.FLOAT(0, {\n\t\t\tstep: 0.001,\n\t\t});\n\t\tinputs = ParamConfig.FOLDER();\n\t\tinputsCount = ParamConfig.INTEGER(1, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t\tinputType0 = inputTypeParam(0);\n\t\tinputName0 = inputNameParam(0);\n\t\tinputType1 = inputTypeParam(1);\n\t\tinputName1 = inputNameParam(1);\n\t\tinputType2 = inputTypeParam(2);\n\t\tinputName2 = inputNameParam(2);\n\t\tinputType3 = inputTypeParam(3);\n\t\tinputName3 = inputNameParam(3);\n\t\tinputType4 = inputTypeParam(4);\n\t\tinputName4 = inputNameParam(4);\n\t\tinputType5 = inputTypeParam(5);\n\t\tinputName5 = inputNameParam(5);\n\t\tinputType6 = inputTypeParam(6);\n\t\tinputName6 = inputNameParam(6);\n\t\tinputType7 = inputTypeParam(7);\n\t\tinputName7 = inputNameParam(7);\n\t\tinputType8 = inputTypeParam(8);\n\t\tinputName8 = inputNameParam(8);\n\t\tinputType9 = inputTypeParam(9);\n\t\tinputName9 = inputNameParam(9);\n\t\tspare = ParamConfig.FOLDER();\n\t};\n}\nclass TypedSubnetJsParamsConfig extends TypedSubnetJsParamsConfigMixin(NodeParamsConfig) {}\nexport class AbstractTypedSubnetJsNode<K extends NodeParamsConfig> extends TypedJsNode<K> {\n\tprotected override _childrenControllerContext = NodeContext.JS;\n\n\toverride initializeNode() {\n\t\tthis.childrenController?.setOutputNodeFindMethod(() => {\n\t\t\treturn this.nodesByType(SubnetOutputJsNode.type())[0];\n\t\t});\n\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputName.bind(this));\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputName.bind(this));\n\t}\n\tprotected _expectedInputTypes(): JsConnectionPointType[] {\n\t\treturn [];\n\t}\n\tprotected _expectedInputName(index: number) {\n\t\treturn 'default';\n\t}\n\n\tprotected _expectedOutputTypes() {\n\t\treturn this._expectedInputTypes();\n\t}\n\n\tprotected _expectedOutputName(index: number) {\n\t\treturn this._expectedInputName(index);\n\t}\n\t//\n\t//\n\t// defines the outputs for the child subnet input\n\t//\n\t//\n\tchildExpectedInputConnectionPointTypes() {\n\t\treturn this._expectedInputTypes();\n\t}\n\tchildExpectedOutputConnectionPointTypes() {\n\t\treturn this._expectedOutputTypes();\n\t}\n\tchildExpectedInputConnectionPointName(index: number) {\n\t\treturn this._expectedInputName(index);\n\t}\n\tchildExpectedOutputConnectionPointName(index: number) {\n\t\treturn this._expectedOutputName(index);\n\t}\n\n\t//\n\t//\n\t// CHILDREN\n\t//\n\t//\n\toverride createNode<S extends keyof JsNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): JsNodeChildrenMap[S];\n\toverride createNode<K extends valueof<JsNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<JsNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseJsNodeType[];\n\t}\n\toverride nodesByType<K extends keyof JsNodeChildrenMap>(type: K): JsNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as JsNodeChildrenMap[K][];\n\t}\n}\n\nexport class TypedSubnetJsNode<K extends TypedSubnetJsParamsConfig> extends AbstractTypedSubnetJsNode<K> {\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\n\t\tthis.io.connection_points.set_input_name_function(this._expectedInputName.bind(this));\n\t\tthis.io.connection_points.set_expected_input_types_function(this._expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(this._expectedOutputTypes.bind(this));\n\t\tthis.io.connection_points.set_output_name_function(this._expectedOutputName.bind(this));\n\t}\n\tprotected _inputTypeParams(): IntegerParam[] {\n\t\treturn [\n\t\t\tthis.p.inputType0,\n\t\t\tthis.p.inputType1,\n\t\t\tthis.p.inputType2,\n\t\t\tthis.p.inputType3,\n\t\t\tthis.p.inputType4,\n\t\t\tthis.p.inputType5,\n\t\t\tthis.p.inputType6,\n\t\t\tthis.p.inputType7,\n\t\t\tthis.p.inputType8,\n\t\t\tthis.p.inputType9,\n\t\t];\n\t}\n\tprotected _inputNameParams(): StringParam[] {\n\t\treturn [\n\t\t\tthis.p.inputName0,\n\t\t\tthis.p.inputName1,\n\t\t\tthis.p.inputName2,\n\t\t\tthis.p.inputName3,\n\t\t\tthis.p.inputName4,\n\t\t\tthis.p.inputName5,\n\t\t\tthis.p.inputName6,\n\t\t\tthis.p.inputName7,\n\t\t\tthis.p.inputName8,\n\t\t\tthis.p.inputName9,\n\t\t];\n\t}\n\n\tsetInputType(index: number, type: JsConnectionPointType) {\n\t\tconst param = this._inputTypeParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tparam.set(JS_CONNECTION_POINT_TYPES.indexOf(type));\n\t}\n\tsetInputName(index: number, inputName: string) {\n\t\tconst param = this._inputNameParams()[index];\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tparam.set(inputName);\n\t}\n\n\tprotected _expectedInputsCount(): number {\n\t\treturn this.pv.inputsCount;\n\t}\n\n\tprotected override _expectedInputTypes(): JsConnectionPointType[] {\n\t\tconst count = this.pv.inputsCount;\n\t\tconst params: IntegerParam[] = this._inputTypeParams();\n\t\treturn rangeStartEnd(0, count).map((value, i) => JS_CONNECTION_POINT_TYPES[params[i].value]);\n\t}\n\tprotected override _expectedInputName(index: number) {\n\t\tconst params: StringParam[] = this._inputNameParams();\n\t\tconst param = params[index];\n\t\treturn param ? param.value : JsConnectionPointType.FLOAT;\n\t}\n\n\tprotected override _expectedOutputTypes() {\n\t\tconst count = this.pv.inputsCount;\n\t\tconst params: IntegerParam[] = this._inputTypeParams();\n\t\treturn rangeStartEnd(0, count).map((value, i) => JS_CONNECTION_POINT_TYPES[params[i].value]);\n\t}\n\n\tprotected override _expectedOutputName(index: number) {\n\t\t// return this._expected_input_name(index);\n\t\tconst params: StringParam[] = this._inputNameParams();\n\t\treturn params[index].value;\n\t}\n\toverride setLines(linesController: JsLinesCollectionController) {\n\t\tthis._setLinesPreBlock(linesController);\n\t\tthis.setLinesBlockStart(linesController);\n\t\tthis._setLinesBlockContent(linesController);\n\t\tthis.setLinesBlockEnd(linesController);\n\t}\n\tprotected linesBlockContent(linesController: JsLinesCollectionController) {\n\t\tconst codeBuilder = this._runCodeBuilder(linesController);\n\t\tif (!codeBuilder) {\n\t\t\treturn;\n\t\t}\n\t\tconst shadername = linesController.currentShaderName();\n\t\tconst bodyLines = codeBuilder.lines(shadername, LineType.BODY);\n\t\treturn this._sanitizeBodyLines(bodyLines);\n\t}\n\tprotected _setLinesPreBlock(linesController: JsLinesCollectionController) {\n\t\tif (this._traverseChildren(linesController)) {\n\t\t\treturn;\n\t\t}\n\t\tconst bodyLines: string[] = [];\n\t\tconst connection_points = this.io.inputs.namedInputConnectionPoints();\n\t\tif (!connection_points) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let i = 0; i < connection_points.length; i++) {\n\t\t\tconst connection_point = connection_points[i];\n\t\t\t// const gl_type = connection_point.type();\n\t\t\tconst out = this.jsVarName(connection_point.name());\n\t\t\tconst in_value = this.variableForInput(linesController, connection_point.name());\n\t\t\tconst body_line = `let ${out} = ${in_value}`;\n\t\t\tbodyLines.push(body_line);\n\t\t}\n\n\t\tlinesController._addBodyLines(this, bodyLines);\n\t}\n\tprotected setLinesBlockStart(linesController: JsLinesCollectionController) {\n\t\tif (this._traverseChildren(linesController)) {\n\t\t\treturn;\n\t\t}\n\t\tlinesController._addBodyLines(this, [`if(true){`]);\n\t}\n\tprotected _setLinesBlockContent(linesController: JsLinesCollectionController) {\n\t\tconst bodyLines = this.linesBlockContent(linesController);\n\t\tif (!bodyLines) {\n\t\t\treturn;\n\t\t}\n\t\tlinesController._addBodyLines(this, bodyLines, undefined, ADD_BODY_LINES_OPTIONS);\n\t}\n\tprotected setLinesBlockEnd(linesController: JsLinesCollectionController) {\n\t\tif (this._traverseChildren(linesController)) {\n\t\t\treturn;\n\t\t}\n\t\tlinesController._addBodyLines(this, [`}`]);\n\t}\n\n\tprotected _runCodeBuilder(linesController: JsLinesCollectionController) {\n\t\t// I potentially could look for attribute nodes to use as output,\n\t\t// but for now, I'll enforce a rule that attribute nodes must be at the top level\n\t\tconst outputNodes: SubnetOutputJsNode[] = this.nodesByType(NetworkChildNodeType.OUTPUT);\n\t\tconst functionNode = this.functionNode();\n\t\tif (!functionNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (outputNodes.length == 0) {\n\t\t\tfunctionNode.states.error.set(`${this.path()}:one output node is required`);\n\t\t}\n\t\tif (outputNodes.length > 1) {\n\t\t\tfunctionNode.states.error.set(`${this.path()}:only one output node allowed`);\n\t\t}\n\t\tconst subnetOutput = outputNodes[0];\n\t\tconst subnetOutputInputConnectionPoints = subnetOutput.io.inputs.namedInputConnectionPoints();\n\n\t\tconst subnetOutputInputNames = subnetOutputInputConnectionPoints\n\t\t\t? subnetOutputInputConnectionPoints.map((cp) => cp.name())\n\t\t\t: [];\n\n\t\tconst assembler = linesController.assembler();\n\n\t\tconst nodeTraverser = new TypedNodeTraverser<NodeContext.JS>(\n\t\t\tthis,\n\t\t\tlinesController.shaderNames(),\n\t\t\t(rootNode, shaderName) => {\n\t\t\t\treturn subnetOutputInputNames;\n\t\t\t}\n\t\t);\n\t\tconst codeBuilder = new JsCodeBuilder(\n\t\t\tnodeTraverser,\n\t\t\t(shaderName, rootNodes) => {\n\t\t\t\t// return [subnetOutput];\n\t\t\t\treturn assembler.rootNodesByShaderName(shaderName, rootNodes);\n\t\t\t},\n\t\t\tassembler\n\t\t);\n\t\tconst paramNodes: BaseJsNodeType[] = [];\n\t\tcodeBuilder.buildFromNodes(outputNodes, paramNodes);\n\t\tthis._addCodeBuilderDefinition(codeBuilder, linesController);\n\t\treturn codeBuilder;\n\t}\n\tprivate _addCodeBuilderDefinition(codeBuilder: JsCodeBuilder, linesController: JsLinesCollectionController) {\n\t\tconst internalShadersCollectionController = codeBuilder.shadersCollectionController();\n\t\tif (!internalShadersCollectionController) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentShaderName = linesController.currentShaderName();\n\t\tinternalShadersCollectionController.setCurrentShaderName(currentShaderName);\n\n\t\t// 1- add all definitions for each shaderName\n\t\tconst shaderNames = linesController.shaderNames();\n\t\tfor (const shaderName of shaderNames) {\n\t\t\tconst definitions: BaseJsDefinition[] = [];\n\t\t\tinternalShadersCollectionController.traverseDefinitions(shaderName, (definition) => {\n\t\t\t\t// only add function if it is for the current shader\n\t\t\t\tconst isNotFunction = true; //!(definition instanceof FunctionGLDefinition);\n\t\t\t\tconst isCurrentShader = shaderName == currentShaderName;\n\t\t\t\tif (isNotFunction || isCurrentShader) {\n\t\t\t\t\tdefinitions.push(definition);\n\t\t\t\t}\n\t\t\t});\n\t\t\tlinesController.addDefinitions(this, definitions, shaderName);\n\t\t}\n\t\t// 2- add vertex body lines if current shader name is fragment\n\t\t// if (currentShaderName != JsFunctionName.VERTEX) {\n\t\t// \tconst attribNodes = this.nodesByType(GlType.ATTRIBUTE);\n\t\t// \tconst bodyLines: string[] = [];\n\t\t// \tfor (const attribNode of attribNodes) {\n\t\t// \t\tconst linesForNode = internalShadersCollectionController.bodyLines(ShaderName.VERTEX, attribNode);\n\t\t// \t\tif (linesForNode) {\n\t\t// \t\t\tbodyLines.push(...linesForNode);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// \tlinesController.addBodyLines(this, bodyLines, ShaderName.VERTEX, ADD_BODY_LINES_OPTIONS);\n\t\t// }\n\t}\n\tsetSubnetInputLines(linesController: JsLinesCollectionController, childNode: SubnetInputJsNode) {\n\t\tconst outputTypes = childNode.expectedOutputTypes();\n\t\tlet i = 0;\n\n\t\tfor (const _ of outputTypes) {\n\t\t\tconst inputName = this.inputNameForSubnetInput(i);\n\t\t\tconst inputValue = this.variableForInput(linesController, inputName);\n\t\t\tconst dataType = outputTypes[0];\n\t\t\tconst varName = childNode.jsVarName(inputName);\n\t\t\tlinesController.addBodyOrComputed(childNode, [\n\t\t\t\t{\n\t\t\t\t\tdataType,\n\t\t\t\t\tvarName,\n\t\t\t\t\tvalue: inputValue,\n\t\t\t\t},\n\t\t\t]);\n\t\t\ti++;\n\t\t}\n\t}\n\tsetSubnetOutputLines(linesController: JsLinesCollectionController, childNode: SubnetOutputJsNode) {\n\t\t// const bodyLines: string[] = this.subnetOutputLines(childNode);\n\t\t// shadersCollectionController.addBodyLines(childNode, bodyLines, undefined, ADD_BODY_LINES_OPTIONS);\n\t\tconst inputTypes = childNode.expectedInputTypes();\n\t\tlet i = 0;\n\n\t\tconst addLineIfNotConnected = this._traverseChildren(linesController);\n\n\t\tfor (const _ of inputTypes) {\n\t\t\tconst inputName = childNode.expectedInputName(i);\n\t\t\tconst inputValue = childNode.variableForInput(linesController, inputName);\n\t\t\tconst dataType = inputTypes[0];\n\t\t\tconst varName = this.jsVarName(this.outputNameForSubnetOutput(i) || '');\n\n\t\t\tconst isInputConnected = childNode.io.inputs.named_input(inputName);\n\t\t\tconst addLine = isInputConnected || addLineIfNotConnected;\n\n\t\t\tif (addLine) {\n\t\t\t\tlinesController.addBodyOrComputed(\n\t\t\t\t\tchildNode,\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdataType,\n\t\t\t\t\t\t\tvarName,\n\t\t\t\t\t\t\tvalue: inputValue,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tconstPrefix: false,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\t}\n\tprivate _traverseChildren(linesController: JsLinesCollectionController) {\n\t\treturn linesController.assembler().computedVariablesAllowed();\n\t}\n\tinputNameForSubnetInput(index: number) {\n\t\treturn this._expectedInputName(index);\n\t}\n\toutputNameForSubnetOutput(index: number) {\n\t\treturn this._expectedOutputName(index);\n\t}\n\n\t// align with the right number of tabs\n\tprotected _sanitizeBodyLines(lines: string[]): string[] {\n\t\treturn lines;\n\t\t// const level = CodeFormatter.nodeDistanceToMaterial(this);\n\t\t// const prefix = `\\t`.repeat(level);\n\n\t\t// return lines.map((line) => {\n\t\t// \tconst trimmed = line.trim();\n\t\t// \tif (trimmed.length == 0) {\n\t\t// \t\treturn '';\n\t\t// \t} else {\n\t\t// \t\treturn `${prefix}${trimmed}`;\n\t\t// \t}\n\t\t// });\n\t}\n}\n\nclass SubnetJsParamsConfig extends TypedSubnetJsParamsConfigMixin(NodeParamsConfig) {}\nconst ParamsConfig = new SubnetJsParamsConfig();\n\nexport class SubnetJsNode extends TypedSubnetJsNode<SubnetJsParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn NetworkNodeType.SUBNET;\n\t}\n\n\t// public override outputValue(context: JsNodeTriggerContext, outputName: string) {\n\t// \tconst subnetOutput = this.nodesByType(NetworkChildNodeType.OUTPUT)[0];\n\t// \tif (subnetOutput) {\n\t// \t\treturn subnetOutput.outputValue(context, outputName);\n\t// \t} else {\n\t// \t\treturn 0;\n\t// \t}\n\t// }\n\t// inputValueForSubnetInput(context: JsNodeTriggerContext, outputName: string) {\n\t// \treturn this._inputValue<JsConnectionPointType>(outputName, context) || 0;\n\t// }\n\t// override inputNameForSubnetInput(index: number) {\n\t// \treturn this._expectedInputName(index);\n\t// }\n\t// override outputNameForSubnetOutput(index: number) {\n\t// \treturn this._expectedOutputName(index);\n\t// }\n}\n","/**\n * a subnet output is the output of a... subnet!\n *\n *\n *\n */\n\nimport {TypedJsNode} from './_Base';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {NetworkChildNodeType} from '../../poly/NodeContext';\nimport {SubnetJsNode} from './Subnet';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nclass SubnetOutputJsParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new SubnetOutputJsParamsConfig();\n\nexport class SubnetOutputJsNode extends TypedJsNode<SubnetOutputJsParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<NetworkChildNodeType.OUTPUT> {\n\t\treturn NetworkChildNodeType.OUTPUT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.connection_points.set_input_name_function(this.expectedInputName.bind(this));\n\t\tthis.io.connection_points.set_expected_output_types_function(() => []);\n\t\tthis.io.connection_points.set_expected_input_types_function(this.expectedInputTypes.bind(this));\n\t\tthis.io.connection_points.set_create_spare_params_from_inputs(false);\n\t}\n\toverride parent() {\n\t\treturn super.parent() as SubnetJsNode | null;\n\t}\n\n\texpectedInputName(index: number) {\n\t\tconst parent = this.parent();\n\t\treturn parent?.childExpectedOutputConnectionPointName(index) || `in${index}`;\n\t}\n\n\texpectedInputTypes() {\n\t\tconst parent = this.parent();\n\t\treturn parent?.childExpectedOutputConnectionPointTypes() || [];\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst parent = this.parent();\n\t\tparent?.setSubnetOutputLines(shadersCollectionController, this);\n\t\t// const inputTypes = this._expectedInputTypes();\n\t\t// let i = 0;\n\n\t\t// const subnetParent = this.parent() as SubnetJsNode;\n\t\t// for (const _ of inputTypes) {\n\t\t// \tconst inputName = this._expectedInputName(i);\n\t\t// \tconst inputValue = this.variableForInput(shadersCollectionController, inputName);\n\t\t// \tconst dataType = this._expectedInputTypes()[0];\n\t\t// \tconst varName = subnetParent.jsVarName(subnetParent.outputNameForSubnetOutput(i) || '');\n\t\t// \tshadersCollectionController.addBodyOrComputed(this, [\n\t\t// \t\t{\n\t\t// \t\t\tdataType,\n\t\t// \t\t\tvarName,\n\t\t// \t\t\tvalue: inputValue,\n\t\t// \t\t},\n\t\t// \t]);\n\t\t// \ti++;\n\t\t// }\n\t}\n\n\t// public override outputValue(context: JsNodeTriggerContext, outputName: string) {\n\t// \treturn this._inputValue<JsConnectionPointType>(outputName, context) || 0;\n\t// }\n}\n","/**\n * track face features from image, video or webcam\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME, TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsConnectionPoint, JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF} from '../utils/io/connections/Js';\n\nimport {inputObject3D} from './_BaseObject3D';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {Poly} from '../../Poly';\nimport {VectorArray} from './code/assemblers/_BaseJsPersistedConfigUtils';\nimport {faceTrackingVector4Array} from '../../../core/computerVision/face/Data';\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nexport enum TrackFaceJsNodeOutput {\n\tLANDMARKS = 'landmarks',\n}\n\nclass TrackFaceJsParamsConfig extends NodeParamsConfig {\n\tfaceIndex = ParamConfig.INTEGER(0, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n}\nconst ParamsConfig = new TrackFaceJsParamsConfig();\n\nexport class TrackFaceJsNode extends TypedJsNode<TrackFaceJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'trackFace';\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.TEXTURE, JsConnectionPointType.TEXTURE, CONNECTION_OPTIONS),\n\t\t]);\n\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TrackFaceJsNodeOutput.LANDMARKS, JsConnectionPointType.VECTOR4_ARRAY),\n\t\t]);\n\t}\n\n\toverride setTriggerableLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\n\t\t// action\n\t\tconst texture = this.variableForInput(shadersCollectionController, JsConnectionPointType.TEXTURE);\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('trackFace', this, shadersCollectionController);\n\t\tconst bodyLine = func.asString(object3D, texture);\n\t\tshadersCollectionController.addTriggerableLines(this, [bodyLine]);\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\n\t\t// get\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\t\tconst faceIndex = this.variableForInputParam(shadersCollectionController, this.p.faceIndex);\n\t\tconst _v4 = (\n\t\t\tpropertyName: TrackFaceJsNodeOutput,\n\t\t\tfunctionName: 'trackFaceGetLandmarks',\n\t\t\ttype: JsConnectionPointType\n\t\t) => {\n\t\t\tif (!usedOutputNames.includes(propertyName)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst varName = this.jsVarName(propertyName);\n\t\t\tconst tmpVarName =shadersCollectionController.addVariable(this,  new VectorArray(faceTrackingVector4Array()));\n\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController);\n\t\t\tshadersCollectionController.addBodyOrComputed(this, [\n\t\t\t\t{\n\t\t\t\t\tdataType: type,\n\t\t\t\t\tvarName,\n\t\t\t\t\tvalue: func.asString(object3D, faceIndex, tmpVarName),\n\t\t\t\t},\n\t\t\t]);\n\t\t};\n\t\t_v4(TrackFaceJsNodeOutput.LANDMARKS, 'trackFaceGetLandmarks', JsConnectionPointType.VECTOR4_ARRAY);\n\t}\n}\n","/**\n * track hand features from image, video or webcam\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME, TypedJsNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsConnectionPoint, JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF} from '../utils/io/connections/Js';\nimport {inputObject3D} from './_BaseObject3D';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {Poly} from '../../Poly';\nimport {handTrackingVector4Array} from '../../../core/computerVision/hand/Data';\nimport {VectorArray} from './code/assemblers/_BaseJsPersistedConfigUtils';\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nexport enum TrackHandJsNodeOutput {\n\tNORMALIZED_LANDMARKS = 'normalizedLandmarks',\n\tWORLD_LANDMARKS = 'worldLandmarks',\n}\n\nclass TrackHandJsParamsConfig extends NodeParamsConfig {\n\thandIndex = ParamConfig.INTEGER(0, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n}\nconst ParamsConfig = new TrackHandJsParamsConfig();\n\nexport class TrackHandJsNode extends TypedJsNode<TrackHandJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'trackHand';\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.TEXTURE, JsConnectionPointType.TEXTURE, CONNECTION_OPTIONS),\n\t\t]);\n\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TrackHandJsNodeOutput.NORMALIZED_LANDMARKS, JsConnectionPointType.VECTOR4_ARRAY),\n\t\t\tnew JsConnectionPoint(TrackHandJsNodeOutput.WORLD_LANDMARKS, JsConnectionPointType.VECTOR4_ARRAY),\n\t\t]);\n\t}\n\n\toverride setTriggerableLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\n\t\t// action\n\t\tconst texture = this.variableForInput(shadersCollectionController, JsConnectionPointType.TEXTURE);\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('trackHand', this, shadersCollectionController);\n\t\tconst bodyLine = func.asString(object3D, texture);\n\t\tshadersCollectionController.addTriggerableLines(this, [bodyLine]);\n\t}\n\n\toverride setLines(shadersCollectionController: JsLinesCollectionController) {\n\t\tconst object3D = inputObject3D(this, shadersCollectionController);\n\n\t\t// get\n\t\tconst usedOutputNames = this.io.outputs.used_output_names();\n\t\tconst handIndex = this.variableForInputParam(shadersCollectionController, this.p.handIndex);\n\t\tconst _v4 = (\n\t\t\tpropertyName: TrackHandJsNodeOutput,\n\t\t\tfunctionName: 'trackHandGetNormalizedLandmarks' | 'trackHandGetWorldLandmarks',\n\t\t\ttype: JsConnectionPointType\n\t\t) => {\n\t\t\tif (!usedOutputNames.includes(propertyName)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst varName = this.jsVarName(propertyName);\n\t\t\tconst tmpVarName = shadersCollectionController.addVariable(\n\t\t\t\tthis,\n\t\t\t\tnew VectorArray(handTrackingVector4Array())\n\t\t\t);\n\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController);\n\t\t\tshadersCollectionController.addBodyOrComputed(this, [\n\t\t\t\t{\n\t\t\t\t\tdataType: type,\n\t\t\t\t\tvarName,\n\t\t\t\t\tvalue: func.asString(object3D, handIndex, tmpVarName),\n\t\t\t\t},\n\t\t\t]);\n\t\t};\n\t\t_v4(\n\t\t\tTrackHandJsNodeOutput.NORMALIZED_LANDMARKS,\n\t\t\t'trackHandGetNormalizedLandmarks',\n\t\t\tJsConnectionPointType.VECTOR4_ARRAY\n\t\t);\n\t\t_v4(TrackHandJsNodeOutput.WORLD_LANDMARKS, 'trackHandGetWorldLandmarks', JsConnectionPointType.VECTOR4_ARRAY);\n\t}\n}\n","import {JsConnectionPointType} from '../../../utils/io/connections/Js';\n\nexport function jsFunctionName(prefix: string, type: JsConnectionPointType): string {\n\treturn `${prefix}_${type}`.replace('[]', '_Array');\n}\nexport function sanitizeJsVarName(varName: string): string {\n\treturn varName.replace(/\\[\\]$/g, '').replace(/[^a-zA-Z0-9_]/g, '_');\n}\n","import {TypedNode} from '../_Base';\n// import {BaseJsFunctionAssembler} from './code/assemblers/_Base';\nimport {AssemblerControllerNode} from './code/Controller';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {ParamConfigsController} from '../utils/code/controllers/ParamConfigsController';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\n// import {ParamInitValueSerialized} from '../../params/types/ParamInitValueSerialized';\nimport {JsParamConfig} from './code/utils/JsParamConfig';\nimport {ParamType} from '../../poly/ParamType';\n// import {BaseGlConnectionPoint} from '../utils/io/connections/Gl';\n// import {IOController} from '../utils/io/IOController';\nimport {IntegerParam} from '../../params/Integer';\nimport {FloatParam} from '../../params/Float';\nimport {Vector2Param} from '../../params/Vector2';\nimport {Vector3Param} from '../../params/Vector3';\nimport {Vector4Param} from '../../params/Vector4';\nimport {ColorParam} from '../../params/Color';\nimport {BooleanParam} from '../../params/Boolean';\nimport {ThreeToJs} from '../../../core/ThreeToJs';\nimport {ParamsEditableStateController} from '../utils/io/ParamsEditableStateController';\nimport {Color, Quaternion, Vector2, Vector3, Vector4} from 'three';\nimport {sanitizeName} from '../../../core/String';\nimport {BaseParamType} from '../../params/_Base';\nimport {EvaluatorEventData} from './code/assemblers/actor/ActorEvaluator';\nimport {StringParam} from '../../params/String';\nimport {sanitizeJsVarName} from './code/assemblers/JsTypeUtils';\nimport {Poly} from '../../Poly';\nimport {BaseJsShaderAssembler} from './code/assemblers/_Base';\n\nexport const TRIGGER_CONNECTION_NAME = 'trigger';\n\nexport interface WrappedBodyLines {\n\tmethodNames: string[];\n\twrappedLines: string;\n}\n\nfunction wrapComputed(varName: string): string {\n\treturn `this.${varName}.value`;\n}\nexport function wrapIfComputed(varName: string, linesController: JsLinesCollectionController): string {\n\tif (linesController.registeredAsComputed(varName)) {\n\t\treturn wrapComputed(varName);\n\t} else {\n\t\treturn varName;\n\t}\n}\n\nexport function variableFromParamRequired(\n\tparam: BaseParamType\n): param is ColorParam | Vector2Param | Vector3Param | Vector4Param {\n\treturn (\n\t\tparam instanceof ColorParam ||\n\t\tparam instanceof Vector2Param ||\n\t\tparam instanceof Vector3Param ||\n\t\tparam instanceof Vector4Param\n\t);\n}\nexport function createVariableFromParam(param: ColorParam | Vector2Param | Vector3Param | Vector4Param) {\n\tif (param instanceof ColorParam) {\n\t\treturn new Color();\n\t}\n\tif (param instanceof Vector2Param) {\n\t\treturn new Vector2();\n\t}\n\tif (param instanceof Vector3Param) {\n\t\treturn new Vector3();\n\t}\n\tif (param instanceof Vector4Param) {\n\t\tif (param.options.asQuaternion()) {\n\t\t\treturn new Quaternion();\n\t\t} else {\n\t\t\treturn new Vector4();\n\t\t}\n\t}\n\treturn new Vector4();\n}\nexport class TypedJsNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.JS, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.JS;\n\t}\n\n\tprotected _param_configs_controller: ParamConfigsController<JsParamConfig<ParamType>> | undefined;\n\t// protected _assembler: BaseJsFunctionAssembler | undefined;\n\tprivate _paramsEditableStatesController = new ParamsEditableStateController(this);\n\teventData(): EvaluatorEventData | EvaluatorEventData[] | undefined {\n\t\treturn undefined;\n\t}\n\tisTriggering() {\n\t\treturn false;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis.uiData.setLayoutHorizontal();\n\t\tthis.io.connections.initInputs();\n\n\t\tthis.io.connection_points.spare_params.initializeNode();\n\t\tthis._paramsEditableStatesController.initializeNode();\n\n\t\tthis.addPostDirtyHook('_setMatToRecompile', this._setFunctionNodeToRecompile.bind(this));\n\t\tthis.lifecycle.onBeforeDeleted(this._setFunctionNodeToRecompile.bind(this));\n\t}\n\toverride cook() {\n\t\tthis.cookController.endCook();\n\t}\n\n\tprivate __setFunctionNodeToRecompileAllowed = true;\n\tprotected _setFunctionNodeToRecompileAllowed(state: boolean) {\n\t\tthis.__setFunctionNodeToRecompileAllowed = state;\n\t}\n\tprotected _setFunctionNodeToRecompile() {\n\t\tif (this.__setFunctionNodeToRecompileAllowed == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis.functionNode()?.assemblerController()?.setCompilationRequiredAndDirty(this);\n\t}\n\tfunctionNode(): AssemblerControllerNode<BaseJsShaderAssembler> | undefined {\n\t\tconst parent = this.parent();\n\t\tif (parent) {\n\t\t\tif (parent.context() == NodeContext.JS) {\n\t\t\t\treturn (parent as BaseJsNodeType)?.functionNode();\n\t\t\t} else {\n\t\t\t\treturn parent as AssemblerControllerNode<BaseJsShaderAssembler>;\n\t\t\t}\n\t\t}\n\t}\n\n\t// //\n\t// //\n\t// // VARIABLES\n\t// //\n\t// //\n\tjsVarName(name: string) {\n\t\tconst functionNode = this.functionNode();\n\t\tconst fullPathWithFunctionNodeRemoved = (_functionNode: AssemblerControllerNode<BaseJsShaderAssembler>) => {\n\t\t\tconst functionNodePath = _functionNode.path();\n\t\t\tconst path = this.path();\n\t\t\treturn path.slice(functionNodePath.length + 1);\n\t\t};\n\t\tconst baseName = functionNode ? fullPathWithFunctionNodeRemoved(functionNode) : this.name();\n\n\t\treturn sanitizeJsVarName(`v_POLY_${baseName}_${name}`);\n\t}\n\tinputVarName(inputName: string): string {\n\t\treturn TypedJsNode.inputVarName(this, inputName);\n\t\t// const sanitizedNodePath = sanitizeName(this.path().replace(this.functionNode()?.path() || '', ''));\n\t\t// const varName = `${sanitizedNodePath}_${inputName}`;\n\t\t// return varName;\n\t}\n\tstatic inputVarName(node: BaseJsNodeType, inputName: string) {\n\t\tconst sanitizedNodePath = sanitizeName(node.path().replace(node.functionNode()?.path() || '', ''));\n\t\tconst varName = `${sanitizedNodePath}_${inputName}`;\n\t\treturn varName;\n\t}\n\n\tvariableForInputParam(\n\t\tshadersCollectionController: JsLinesCollectionController,\n\t\tparam:\n\t\t\t| IntegerParam\n\t\t\t| FloatParam\n\t\t\t| Vector2Param\n\t\t\t| Vector3Param\n\t\t\t| Vector4Param\n\t\t\t| ColorParam\n\t\t\t| BooleanParam\n\t\t\t| StringParam\n\t) {\n\t\treturn this.variableForInput(shadersCollectionController, param.name());\n\t}\n\tvariableForInput(shadersCollectionController: JsLinesCollectionController, inputName: string): string {\n\t\tconst varName = this._variableForInput(shadersCollectionController, inputName);\n\t\treturn wrapIfComputed(varName, shadersCollectionController);\n\t}\n\tprivate _variableForInput(shadersCollectionController: JsLinesCollectionController, inputName: string): string {\n\t\tconst inputIndex = this.io.inputs.getInputIndex(inputName);\n\t\tconst connection = this.io.connections.inputConnection(inputIndex);\n\t\tlet outputJsVarName: string | undefined;\n\t\tif (connection) {\n\t\t\tconst inputNode = (<unknown>connection.nodeSrc()) as BaseJsNodeType;\n\t\t\tconst connectionPoints = inputNode.io.outputs.namedOutputConnectionPoints();\n\t\t\tif (connectionPoints) {\n\t\t\t\tconst outputConnectionPoint = connectionPoints[connection.outputIndex()];\n\t\t\t\tif (outputConnectionPoint) {\n\t\t\t\t\tconst outputName = outputConnectionPoint.name();\n\t\t\t\t\toutputJsVarName = inputNode.jsVarName(outputName);\n\t\t\t\t\t// console.log({outputJsVarName});\n\t\t\t\t\t// return outputJsVarName;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`no output called '${inputName}' for js node ${inputNode.path()}`);\n\t\t\t\t\tthrow 'variable_for_input ERROR';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.params.has(inputName)) {\n\t\t\tconst param = this.params.get(inputName);\n\t\t\tif (param) {\n\t\t\t\tif (param.type() == ParamType.STRING) {\n\t\t\t\t\treturn outputJsVarName != null ? outputJsVarName : `'${param.value}'`;\n\t\t\t\t}\n\t\t\t\tif (variableFromParamRequired(param)) {\n\t\t\t\t\tconst varName = `VAR_` + this.inputVarName(inputName);\n\t\t\t\t\tshadersCollectionController.addVariable(this, createVariableFromParam(param), varName);\n\n\t\t\t\t\tconst _copy = (_outputJsVarName: string) => {\n\t\t\t\t\t\treturn `${varName}.copy(${wrapIfComputed(_outputJsVarName, shadersCollectionController)})`;\n\t\t\t\t\t};\n\t\t\t\t\tconst _set = () => {\n\t\t\t\t\t\tif (param.type() == ParamType.COLOR) {\n\t\t\t\t\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(\n\t\t\t\t\t\t\t\t'colorSetRGB',\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\tshadersCollectionController\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst {r, g, b} = (param as ColorParam).value;\n\t\t\t\t\t\t\treturn func.asString(varName, `${r}`, `${g}`, `${b}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn `${varName}.set(${param.value.toArray().join(', ')})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\treturn outputJsVarName ? _copy(outputJsVarName) : _set();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn outputJsVarName || ThreeToJs.any(this.params.get(inputName)?.value);\n\t\t} else {\n\t\t\tif (outputJsVarName != null) {\n\t\t\t\treturn outputJsVarName;\n\t\t\t}\n\t\t\tconst connectionPoints = this.io.inputs.namedInputConnectionPoints();\n\t\t\tif (connectionPoints) {\n\t\t\t\tconst connectionPoint = connectionPoints[inputIndex];\n\t\t\t\tif (!connectionPoint) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`connectionPoint not created for index ${inputIndex} (inputName: '${inputName}', node: ${this.path()})`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn outputJsVarName || connectionPoint ? ThreeToJs.any(connectionPoint.init_value) : '0';\n\t\t\t}\n\t\t\tthrow 'variable_for_input ERROR';\n\t\t}\n\t}\n\n\t// variableForInput(name: string): string {\n\t// \tconst input_index = this.io.inputs.getInputIndex(name);\n\t// \tconst connection = this.io.connections.inputConnection(input_index);\n\t// \tif (connection) {\n\t// \t\tconst input_node = (<unknown>connection.node_src) as BaseJsNodeType;\n\t// \t\tconst output_connection_point =\n\t// \t\t\tinput_node.io.outputs.namedOutputConnectionPoints()[connection.output_index];\n\t// \t\tif (output_connection_point) {\n\t// \t\t\tconst output_name = output_connection_point.name();\n\t// \t\t\treturn input_node.js_var_name(output_name);\n\t// \t\t} else {\n\t// \t\t\tconsole.warn(`no output called '${name}' for gl node ${input_node.path()}`);\n\t// \t\t\tthrow 'variable_for_input ERROR';\n\t// \t\t}\n\t// \t} else {\n\t// \t\treturn 'to debug...'; //ThreeToGl.any(this.params.get(name)?.value);\n\t// \t}\n\t// }\n\n\t// //\n\t// //\n\t// // ADDED LINES\n\t// //\n\t// //\n\tsetLines(shadersCollectionController: JsLinesCollectionController) {\n\t\t// console.warn(`setLines not defined for node '${this.path()}'`);\n\t}\n\tsetTriggeringLines(shadersCollectionController: JsLinesCollectionController, triggeredMethods: string): void {\n\t\tconsole.warn(`setTriggeringLines not defined for node '${this.path()}'`);\n\t\t// if (!this.isTriggering()) {\n\t\t// \tconsole.error(`node '${this.path()}' is not triggering`);\n\t\t// }\n\t\t// shadersCollectionController.addTriggeringLines(this, [triggeredMethods]);\n\t}\n\tsetTriggerableLines(shadersCollectionController: JsLinesCollectionController): void {\n\t\t// console.warn(`setLines not defined for node '${this.path()}'`);\n\t}\n\t// addConstructorInitFunctionLines(shadersCollectionController: ShadersCollectionController): void {}\n\t// wrappedBodyLinesMethodName() {\n\t// \treturn this.type();\n\t// }\n\t// wrappedBodyLines(\n\t// \tshadersCollectionController: ShadersCollectionController,\n\t// \tbodyLines: string[],\n\t// \texistingMethodNames: Set<string>\n\t// ): WrappedBodyLines | undefined {\n\t// \tconst methodName = this.wrappedBodyLinesMethodName();\n\t// \tif (existingMethodNames.has(methodName)) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst wrappedLines = `${methodName}(){\n\t// \t\t${bodyLines.join('\\n')}\n\t// \t}`;\n\t// \treturn {\n\t// \t\tmethodNames: [methodName],\n\t// \t\twrappedLines,\n\t// \t};\n\t// }\n\n\treset_code() {\n\t\tthis._param_configs_controller?.reset();\n\t\t// this.resetLines();\n\t}\n\n\t// //\n\t// //\n\t// // PARAM CONFIGS\n\t// //\n\t// //\n\tparamsGenerating() {\n\t\treturn false;\n\t}\n\tpublic setParamConfigs() {}\n\tparam_configs() {\n\t\treturn this._param_configs_controller?.list();\n\t}\n\n\t// //\n\t// //\n\t// // INPUT\n\t// //\n\t// //\n\t// js_input_default_value(name: string): ParamInitValueSerialized {\n\t// \treturn null;\n\t// }\n}\n\nexport type BaseJsNodeType = TypedJsNode<NodeParamsConfig>;\nexport class BaseJsNodeClass extends TypedJsNode<NodeParamsConfig> {}\n\nclass ParamlessJsParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new ParamlessJsParamsConfig();\nexport class ParamlessTypedJsNode extends TypedJsNode<ParamlessJsParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n}\n","import {BaseJsNodeType, wrapIfComputed} from './_Base';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {JsConnectionPointType} from '../utils/io/connections/Js';\nimport {Poly} from '../../Poly';\nimport {DecomposedPath} from '../../../core/DecomposedPath';\nimport {BooleanParam} from '../../params/Boolean';\nimport {FloatParam} from '../../params/Float';\nimport {IntegerParam} from '../../params/Integer';\nimport {StringParam} from '../../params/String';\nimport {Vector2Param} from '../../params/Vector2';\nimport {Vector3Param} from '../../params/Vector3';\nimport {Vector4Param} from '../../params/Vector4';\nimport {Attribute} from '../../../core/geometry/Attribute';\nimport {ParamPathParam} from '../../params/ParamPath';\nimport {NodePathParam} from '../../params/NodePath';\n\nexport function defaultObject(linesController: JsLinesCollectionController): string {\n\treturn linesController.assembler().defaultObjectVariable();\n}\nfunction _defaultObject3DMaterial(linesController: JsLinesCollectionController): string {\n\treturn linesController.assembler().defaultObject3DMaterialVariable();\n}\nexport function defaultPrimitiveGraph(linesController: JsLinesCollectionController): string {\n\treturn linesController.assembler().defaultPrimitiveGraph();\n}\nfunction _defaultPointIndex(node: BaseJsNodeType, linesController: JsLinesCollectionController): string {\n\t// return linesController.assembler().defaultPointIndexVariable();\n\tconst func = Poly.namedFunctionsRegister.getFunction('getPointIndex', node, linesController);\n\treturn func.asString(inputObject3D(node, linesController));\n}\n\nexport function inputObject3D(node: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst inputObject3D = node.io.inputs.named_input(JsConnectionPointType.OBJECT_3D);\n\tconst object3D = inputObject3D\n\t\t? node.variableForInput(linesController, JsConnectionPointType.OBJECT_3D)\n\t\t: defaultObject(linesController);\n\treturn object3D;\n}\n\nexport function inputObject3DMaterial(node: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst inputMaterial = node.io.inputs.named_input(JsConnectionPointType.MATERIAL);\n\tconst material = inputMaterial\n\t\t? node.variableForInput(linesController, JsConnectionPointType.MATERIAL)\n\t\t: _defaultObject3DMaterial(linesController);\n\treturn material;\n}\n\nexport function inputPointIndex(node: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst inputPoint = node.io.inputs.named_input(Attribute.POINT_INDEX);\n\tconst object3D = inputPoint\n\t\t? node.variableForInput(linesController, Attribute.POINT_INDEX)\n\t\t: _defaultPointIndex(node, linesController);\n\treturn object3D;\n}\n\nexport function setObject3DMaterialOutputLine(node: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tif (!usedOutputNames.includes(JsConnectionPointType.MATERIAL)) {\n\t\treturn;\n\t}\n\n\tconst material = inputObject3DMaterial(node, linesController);\n\tconst out = node.jsVarName(JsConnectionPointType.MATERIAL);\n\n\tlinesController.addBodyOrComputed(node, [\n\t\t{dataType: JsConnectionPointType.OBJECT_3D, varName: out, value: material},\n\t]);\n}\n\nexport function setObject3DOutputLine(node: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tif (!usedOutputNames.includes(JsConnectionPointType.OBJECT_3D)) {\n\t\treturn;\n\t}\n\n\tconst object3D = inputObject3D(node, linesController);\n\tconst out = node.jsVarName(JsConnectionPointType.OBJECT_3D);\n\n\tlinesController.addBodyOrComputed(node, [\n\t\t{dataType: JsConnectionPointType.OBJECT_3D, varName: out, value: object3D},\n\t]);\n}\n\nexport function inputParam(node: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst inputParam = node.io.inputs.named_input(JsConnectionPointType.PARAM);\n\n\tconst _getParam = (linesController: JsLinesCollectionController) => {\n\t\tconst paramPathParam = node.params.get(JsConnectionPointType.PARAM) as ParamPathParam;\n\n\t\t// instead of using the path of the found param,\n\t\t// or the value of the param,\n\t\t// we use the resolved absolute path,\n\t\t// so that it works when the js node is not created from the player\n\t\tconst decomposedPath = new DecomposedPath();\n\t\tparamPathParam.value.resolve(node, decomposedPath);\n\t\tconst absolutePath = decomposedPath.toAbsolutePath();\n\n\t\tconst out = node.jsVarName('getParamSinceNoInput');\n\t\t// if (foundParam) {\n\t\t// do not create the variable only if param has been found,\n\t\t// as we also need to handle cases where it will be found later\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('getParam', node, linesController);\n\t\tconst bodyLine = func.asString(`'${absolutePath}'`);\n\t\tlinesController.addBodyOrComputed(node, [\n\t\t\t{dataType: JsConnectionPointType.PARAM, varName: out, value: bodyLine},\n\t\t]);\n\t\treturn wrapIfComputed(out, linesController);\n\t};\n\n\tconst param = inputParam\n\t\t? node.variableForInput(linesController, JsConnectionPointType.PARAM)\n\t\t: _getParam(linesController);\n\treturn param;\n}\nexport function inputNode(jsNode: BaseJsNodeType, linesController: JsLinesCollectionController) {\n\tconst inputNode = jsNode.io.inputs.named_input(JsConnectionPointType.NODE);\n\n\tconst _getNode = (linesController: JsLinesCollectionController) => {\n\t\tconst nodePathParam = jsNode.params.get(JsConnectionPointType.NODE) as NodePathParam;\n\n\t\t// instead of using the path of the found param,\n\t\t// or the value of the param,\n\t\t// we use the resolved absolute path,\n\t\t// so that it works when the js node is not created from the player\n\t\tconst decomposedPath = new DecomposedPath();\n\t\tnodePathParam.value.resolve(jsNode, decomposedPath);\n\t\tconst absolutePath = decomposedPath.toAbsolutePath();\n\n\t\tconst out = jsNode.jsVarName('getNodeSinceNoInput');\n\t\t// if (foundParam) {\n\t\t// do not create the variable only if param has been found,\n\t\t// as we also need to handle cases where it will be found later\n\t\tconst func = Poly.namedFunctionsRegister.getFunction('getNode', jsNode, linesController);\n\t\tconst bodyLine = func.asString(`'${absolutePath}'`);\n\t\tlinesController.addBodyOrComputed(jsNode, [\n\t\t\t{dataType: JsConnectionPointType.NODE, varName: out, value: bodyLine},\n\t\t]);\n\t\treturn wrapIfComputed(out, linesController);\n\t};\n\n\tconst foundNode = inputNode\n\t\t? jsNode.variableForInput(linesController, JsConnectionPointType.NODE)\n\t\t: _getNode(linesController);\n\treturn foundNode;\n}\n\nexport function vector2OutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: Vector2Param,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.VECTOR2,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\nexport function vector2OutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.VECTOR2,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\n\nexport function vector3OutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: Vector3Param,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.VECTOR3,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\nexport function vector3OutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.VECTOR3,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\n\nexport function vector4OutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: Vector4Param,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.VECTOR4,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\nexport function vector4OutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.VECTOR4,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\n\nexport function floatOutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: FloatParam,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.FLOAT,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\nexport function floatOutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.FLOAT,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\nexport function integerOutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: IntegerParam,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.INT,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\nexport function integerOutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.INT,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\nexport function stringOutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: StringParam,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.STRING,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\nexport function stringOutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.STRING,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\nexport function booleanOutputFromParam(\n\tnode: BaseJsNodeType,\n\tparam: BooleanParam,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = param.name();\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.BOOLEAN,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInputParam(linesController, param),\n\t\t},\n\t]);\n}\n\nexport function anyTypeOutputFromInput(\n\tnode: BaseJsNodeType,\n\tinputName: string,\n\tlinesController: JsLinesCollectionController\n) {\n\tconst usedOutputNames = node.io.outputs.used_output_names();\n\n\tconst propertyName = inputName;\n\tif (!usedOutputNames.includes(propertyName)) {\n\t\treturn;\n\t}\n\tlinesController.addBodyOrComputed(node, [\n\t\t{\n\t\t\tdataType: JsConnectionPointType.FLOAT,\n\t\t\tvarName: node.jsVarName(propertyName),\n\t\t\tvalue: node.variableForInput(linesController, inputName),\n\t\t},\n\t]);\n}\n","/**\n * sends a trigger when a keyboard key is pressed\n *\n *\n */\n\nimport {TRIGGER_CONNECTION_NAME} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {JsConnectionPoint, JsConnectionPointType} from '../utils/io/connections/Js';\nimport {BaseUserInputJsNode} from './_BaseUserInput';\nimport {CoreEventEmitter, EVENT_EMITTERS, EVENT_EMITTER_PARAM_MENU_OPTIONS} from '../../../core/event/CoreEventEmitter';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nimport {Poly} from '../../Poly';\nimport {KeyModifierRequirement, KEY_MODIFIER_REQUIREMENTS} from '../../functions/_KeyboardEventMatchesConfig';\n\nconst KEY_MENU_ENTRIES = {menu: {entries: KEY_MODIFIER_REQUIREMENTS.map((name, value) => ({name, value}))}};\nconst OPTIONAL_ENTRY = KEY_MODIFIER_REQUIREMENTS.indexOf(KeyModifierRequirement.OPTIONAL);\n\nclass BaseOnKeyEventJsParamsConfig extends NodeParamsConfig {\n\t/** @param set which element triggers the event */\n\telement = ParamConfig.INTEGER(EVENT_EMITTERS.indexOf(CoreEventEmitter.CANVAS), {\n\t\t...EVENT_EMITTER_PARAM_MENU_OPTIONS,\n\t\tseparatorAfter: true,\n\t});\n\t/** @param space separated list of accepted key codes. If this is empty then any key is accepted. */\n\tkeyCodes = ParamConfig.STRING('Digit1 KeyE ArrowDown');\n\t/** @param requires ctrlKey */\n\tctrlKey = ParamConfig.INTEGER(OPTIONAL_ENTRY, KEY_MENU_ENTRIES);\n\t/** @param requires altKey */\n\taltKey = ParamConfig.INTEGER(OPTIONAL_ENTRY, KEY_MENU_ENTRIES);\n\t/** @param requires shiftKey */\n\tshiftKey = ParamConfig.INTEGER(OPTIONAL_ENTRY, KEY_MENU_ENTRIES);\n\t/** @param requires metaKey */\n\tmetaKey = ParamConfig.INTEGER(OPTIONAL_ENTRY, KEY_MENU_ENTRIES);\n}\nconst ParamsConfig = new BaseOnKeyEventJsParamsConfig();\n\nexport abstract class BaseOnKeyEventJsNode extends BaseUserInputJsNode<BaseOnKeyEventJsParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\toverride isTriggering() {\n\t\treturn true;\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(['element']);\n\t\tthis.io.outputs.setNamedOutputConnectionPoints([\n\t\t\tnew JsConnectionPoint(TRIGGER_CONNECTION_NAME, JsConnectionPointType.TRIGGER),\n\t\t]);\n\t}\n\toverride eventEmitter(): CoreEventEmitter {\n\t\treturn EVENT_EMITTERS[this.pv.element];\n\t}\n\tsetEventEmitter(emitter: CoreEventEmitter) {\n\t\tthis.p.element.set(EVENT_EMITTERS.indexOf(emitter));\n\t}\n\toverride setTriggeringLines(shadersCollectionController: JsLinesCollectionController, triggeredMethods: string) {\n\t\tconst keyCodes = this.variableForInputParam(shadersCollectionController, this.p.keyCodes);\n\t\tconst ctrlKey = this.variableForInputParam(shadersCollectionController, this.p.ctrlKey);\n\t\tconst altKey = this.variableForInputParam(shadersCollectionController, this.p.altKey);\n\t\tconst shiftKey = this.variableForInputParam(shadersCollectionController, this.p.shiftKey);\n\t\tconst metaKey = this.variableForInputParam(shadersCollectionController, this.p.metaKey);\n\t\tconst func = Poly.namedFunctionsRegister.getFunction(\n\t\t\t'keyboardEventMatchesConfig',\n\t\t\tthis,\n\t\t\tshadersCollectionController\n\t\t);\n\t\tconst condition = func.asString(keyCodes, ctrlKey, altKey, shiftKey, metaKey);\n\n\t\tconst bodyLines: string[] = [`if( ${condition}==false ){return}`, triggeredMethods];\n\n\t\tshadersCollectionController.addTriggeringLines(this, bodyLines, {\n\t\t\tgatherable: true,\n\t\t});\n\t}\n}\n","/**\n * sends a trigger when an object is hovered\n *\n *\n */\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseUserInputJsNode} from './_BaseUserInput';\nimport {CoreEventEmitter} from '../../../core/event/CoreEventEmitter';\nimport {JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF, JsConnectionPoint} from '../utils/io/connections/Js';\nimport {Constructor} from '../../../types/GlobalTypes';\nimport {\n\tButtonAndModifierOptionsAsString,\n\tButtonsAndModifierOptionsAsString,\n\tDEFAULT_STATUS_OPTION,\n\tModifierOptionsAsString,\n\tSTATUS_MENU_OPTIONS,\n} from '../../scene/utils/actors/rayObjectIntersection/Common';\nimport {JsLinesCollectionController} from './code/utils/JsLinesCollectionController';\nconst CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF;\n\nconst INPUT_LESS_PARAM_NAMES = ['element'];\n\nexport function MouseEventConfigParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tbuttonLeft = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, {...STATUS_MENU_OPTIONS, separatorBefore: true});\n\t\tbuttonMiddle = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\tbuttonRight = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\tctrl = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\tshift = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\talt = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t};\n}\nexport function MouseDoubleClickConfigParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tctrl = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\tshift = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\talt = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t};\n}\n\nexport function PointerEventConfigParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tbuttonLeft = ParamConfig.BOOLEAN(1, {separatorBefore: true});\n\t\tbuttonMiddle = ParamConfig.BOOLEAN(1);\n\t\tbuttonRight = ParamConfig.BOOLEAN(1);\n\t\tctrl = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\tshift = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t\talt = ParamConfig.INTEGER(DEFAULT_STATUS_OPTION, STATUS_MENU_OPTIONS);\n\t};\n}\nexport class BaseMouseConfigParamsConfig extends MouseEventConfigParamConfig(NodeParamsConfig) {}\nconst baseMouseConfigParamsConfig = new BaseMouseConfigParamsConfig();\nexport class BaseMouseDoubleClickConfigParamsConfig extends MouseDoubleClickConfigParamConfig(NodeParamsConfig) {}\nconst baseMouseDoubleClickConfigParamsConfig = new BaseMouseDoubleClickConfigParamsConfig();\nexport class BasePointerConfigParamsConfig extends PointerEventConfigParamConfig(NodeParamsConfig) {}\nconst basePointerConfigParamsConfig = new BasePointerConfigParamsConfig();\n\nexport class BaseOnObjectPointerEventBaseJsParamsConfig extends NodeParamsConfig {\n\t/** @param blockObjectsBehind */\n\tblockObjectsBehind = ParamConfig.BOOLEAN(1);\n\t/** @param skipIfObjectsInFront */\n\tskipIfObjectsInFront = ParamConfig.BOOLEAN(0);\n}\nexport class CPUOnObjectPointerEventJsParamsConfig extends BaseOnObjectPointerEventBaseJsParamsConfig {\n\t/** @param include children */\n\ttraverseChildren = ParamConfig.BOOLEAN(1);\n\t/** @param pointsThreshold */\n\tpointsThreshold = ParamConfig.FLOAT(0.1);\n\t/** @param lineThreshold */\n\tlineThreshold = ParamConfig.FLOAT(0.1);\n}\nconst CPUParamsConfig = new CPUOnObjectPointerEventJsParamsConfig();\nexport class GPUOnObjectPointerEventJsParamsConfig extends BaseOnObjectPointerEventBaseJsParamsConfig {\n\t/** @param alpha test */\n\t// alphaTest = ParamConfig.FLOAT(0.1);\n}\nconst GPUParamsConfig = new GPUOnObjectPointerEventJsParamsConfig();\n\nexport abstract class ExtendableOnObjectPointerEventJsNode<\n\tT extends BaseOnObjectPointerEventBaseJsParamsConfig\n> extends BaseUserInputJsNode<T> {\n\toverride isTriggering() {\n\t\treturn true;\n\t}\n\toverride eventEmitter() {\n\t\treturn CoreEventEmitter.CANVAS;\n\t}\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.inputs.setNamedInputConnectionPoints([\n\t\t\tnew JsConnectionPoint(JsConnectionPointType.OBJECT_3D, JsConnectionPointType.OBJECT_3D, CONNECTION_OPTIONS),\n\t\t]);\n\t\tthis.io.connection_points.spare_params.setInputlessParamNames(INPUT_LESS_PARAM_NAMES);\n\t}\n\tprotected _additionalInputs(): JsConnectionPoint<JsConnectionPointType>[] {\n\t\treturn [];\n\t}\n}\nexport abstract class BaseOnObjectPointerEventJsNode extends ExtendableOnObjectPointerEventJsNode<CPUOnObjectPointerEventJsParamsConfig> {\n\toverride readonly paramsConfig = CPUParamsConfig;\n}\n\nexport abstract class BaseOnObjectPointerGPUEventJsNode extends ExtendableOnObjectPointerEventJsNode<GPUOnObjectPointerEventJsParamsConfig> {\n\toverride readonly paramsConfig = GPUParamsConfig;\n}\n\nexport abstract class BaseMouseConfigJsNode extends BaseUserInputJsNode<BaseMouseConfigParamsConfig> {\n\toverride readonly paramsConfig = baseMouseConfigParamsConfig;\n}\nexport abstract class BaseMouseDoubleClickConfigJsNode extends BaseUserInputJsNode<BaseMouseDoubleClickConfigParamsConfig> {\n\toverride readonly paramsConfig = baseMouseDoubleClickConfigParamsConfig;\n}\nexport abstract class BasePointerConfigJsNode extends BaseUserInputJsNode<BasePointerConfigParamsConfig> {\n\toverride readonly paramsConfig = basePointerConfigParamsConfig;\n}\nexport function pointerButtonConfig(\n\tnode: BasePointerConfigJsNode,\n\tlinesController: JsLinesCollectionController\n): ButtonAndModifierOptionsAsString {\n\tconst left = node.variableForInputParam(linesController, node.p.buttonLeft);\n\tconst middle = node.variableForInputParam(linesController, node.p.buttonMiddle);\n\tconst right = node.variableForInputParam(linesController, node.p.buttonRight);\n\tconst ctrl = node.variableForInputParam(linesController, node.p.ctrl);\n\tconst shift = node.variableForInputParam(linesController, node.p.shift);\n\tconst alt = node.variableForInputParam(linesController, node.p.alt);\n\treturn {\n\t\tbutton: {\n\t\t\tleft,\n\t\t\tmiddle,\n\t\t\tright,\n\t\t},\n\t\tmodifier: {\n\t\t\tctrl,\n\t\t\tshift,\n\t\t\talt,\n\t\t},\n\t};\n}\nexport function mouseButtonsConfig(\n\tnode: BaseMouseConfigJsNode,\n\tlinesController: JsLinesCollectionController\n): ButtonsAndModifierOptionsAsString {\n\tconst left = node.variableForInputParam(linesController, node.p.buttonLeft);\n\tconst middle = node.variableForInputParam(linesController, node.p.buttonMiddle);\n\tconst right = node.variableForInputParam(linesController, node.p.buttonRight);\n\tconst ctrl = node.variableForInputParam(linesController, node.p.ctrl);\n\tconst shift = node.variableForInputParam(linesController, node.p.shift);\n\tconst alt = node.variableForInputParam(linesController, node.p.alt);\n\treturn {\n\t\tbutton: {\n\t\t\tleft,\n\t\t\tmiddle,\n\t\t\tright,\n\t\t},\n\t\tmodifier: {\n\t\t\tctrl,\n\t\t\tshift,\n\t\t\talt,\n\t\t},\n\t};\n}\nexport function mouseDoubleClickButtonsConfig(\n\tnode: BaseMouseDoubleClickConfigJsNode,\n\tlinesController: JsLinesCollectionController\n): ModifierOptionsAsString {\n\tconst ctrl = node.variableForInputParam(linesController, node.p.ctrl);\n\tconst shift = node.variableForInputParam(linesController, node.p.shift);\n\tconst alt = node.variableForInputParam(linesController, node.p.alt);\n\treturn {\n\t\tmodifier: {\n\t\t\tctrl,\n\t\t\tshift,\n\t\t\talt,\n\t\t},\n\t};\n}\n\nexport enum OnObjectPointerEventGPUJsNodeInputName {\n\tworldPosMaterial = 'worldPosMaterial',\n}\n\nexport enum OnObjectPointerEventGPUJsNodeOutputName {\n\tdistance = 'distance',\n}\n","import {TypedJsNode} from './_Base';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {CoreEventEmitter} from '../../../core/event/CoreEventEmitter';\n\nexport abstract class BaseUserInputJsNode<K extends NodeParamsConfig> extends TypedJsNode<K> {\n\toverride isTriggering() {\n\t\treturn true;\n\t}\n\teventEmitter(): CoreEventEmitter {\n\t\treturn CoreEventEmitter.CANVAS;\n\t}\n}\n\nclass BaseUserInputJsParamsConfig extends NodeParamsConfig {}\n\nexport type BaseUserInputJsNodeType = BaseUserInputJsNode<BaseUserInputJsParamsConfig>;\n","import {PersistedConfigWithShaders} from '../../.././utils/BasePersistedConfig';\nimport {BaseJsShaderAssembler, BaseFunctionData} from './_Base';\nimport {\n\tRegisterableVariable,\n\tSerializedVariable,\n\tSerializedVariableType,\n\tisVariableSerializable,\n\tserializeVariable,\n\tdeserializeVariable,\n} from './_BaseJsPersistedConfigUtils';\n// import {SDFBuilderSopNode} from '../../../../sop/SDFBuilder';\nimport {Poly} from '../../../../Poly';\nimport {NamedFunctionMap} from '../../../../poly/registers/functions/All';\nimport {JsParamConfigJSON} from '../utils/JsParamConfig';\nimport {ParamType} from '../../../../poly/ParamType';\nimport {AssemblerControllerNode} from '../Controller';\n\nexport interface PersistedConfigBaseJsData extends PersistedConfigWithShaders {\n\tvariableNames: string[];\n\tvariables: SerializedVariable<SerializedVariableType>[];\n\tfunctionNames: Array<keyof NamedFunctionMap>;\n\tserializedParamConfigs: JsParamConfigJSON<ParamType>[];\n}\nexport interface SingleBodyPersistedConfigBaseJsData extends PersistedConfigBaseJsData {\n\tfunctionBody: string;\n}\n\nexport function serializedVariablesFromFunctionData(functionData: BaseFunctionData) {\n\tconst {variableNames, variablesByName} = functionData;\n\tconst serializedVariables: SerializedVariable<SerializedVariableType>[] = [];\n\tfor (const variableName of variableNames) {\n\t\tconst variable = variablesByName[variableName];\n\t\tif (variable != null && isVariableSerializable(variable)) {\n\t\t\tconst serialized = serializeVariable(variable);\n\t\t\tserializedVariables.push(serialized);\n\t\t}\n\t}\n\treturn serializedVariables;\n}\nexport function variablesByNameFromPersistedConfigData(data: PersistedConfigBaseJsData) {\n\tconst {variableNames, variables} = data;\n\tconst variablesByName: Record<string, RegisterableVariable> = {};\n\tlet i = 0;\n\tfor (const variableName of variableNames) {\n\t\tconst serialized = variables[i];\n\t\tconst deserialized = deserializeVariable(serialized);\n\t\tvariablesByName[variableName] = deserialized;\n\t\ti++;\n\t}\n\treturn variablesByName;\n}\nexport function functionsByNameFromPersistedConfigData(\n\tdata: PersistedConfigBaseJsData,\n\tnode: AssemblerControllerNode<BaseJsShaderAssembler>\n) {\n\tconst {functionNames} = data;\n\tconst functionsByName: Record<string, Function> = {};\n\t// let i = 0;\n\tfor (const functionName of functionNames) {\n\t\tconst namedFunction = Poly.namedFunctionsRegister.getFunction(functionName, node);\n\t\tif (namedFunction) {\n\t\t\tfunctionsByName[functionName] = namedFunction.func.bind(namedFunction);\n\t\t}\n\t\t// i++;\n\t}\n\treturn functionsByName;\n}\n","import {\n\tBox3,\n\tColor,\n\tVector2,\n\tVector3,\n\tVector4,\n\tPlane,\n\tRay,\n\tSphere,\n\tQuaternion,\n\tMatrix4,\n\tEuler,\n\tEulerOrder,\n} from 'three';\nimport {isBoolean, isNumber, isString} from '../../../../../core/Type';\nimport {Number2, Number3, Number4, Number16} from '../../../../../types/GlobalTypes';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {\n\tJsConnectionPointType,\n\tPrimitiveArrayElement,\n\tVectorArrayElement,\n\tJsConnectionPointTypeFromArrayTypeMap,\n} from '../../../utils/io/connections/Js';\nexport type RegisterableVariable =\n\t| Box3\n\t| Color\n\t| Euler\n\t| Plane\n\t| Quaternion\n\t| Matrix4\n\t| Ray\n\t| Sphere\n\t| Vector2\n\t| Vector3\n\t| Vector4\n\t| PrimitiveArray<PrimitiveArrayElement>\n\t| VectorArray<VectorArrayElement>;\n// | PrimitiveArray<PrimitiveArrayElement>\n// | VectorArray<Color>\n// | VectorArray<Matrix4>\n// | VectorArray<Quaternion>\n// | VectorArray<Vector2>\n// | VectorArray<Vector3>\n// | VectorArray<Vector4>;\n\nexport class PrimitiveArray<V extends PrimitiveArrayElement> {\n\tpublic readonly isPrimitiveArray = true;\n\tconstructor(protected _elements: V[]) {}\n\telements() {\n\t\treturn this._elements;\n\t}\n\tclone(): V[] {\n\t\treturn this._elements.map((v) => v as V);\n\t}\n}\nexport class VectorArray<V extends VectorArrayElement> {\n\tpublic readonly isVectorArray = true;\n\tconstructor(protected _elements: V[]) {}\n\telements() {\n\t\treturn this._elements;\n\t}\n\tclone(): V[] {\n\t\treturn this._elements.map((v) => v.clone() as V);\n\t}\n}\n// Color | Vector2 | Vector3 | Vector4 | Matrix4 | Quaternion\nexport function createVariable(type: JsConnectionPointType) {\n\tswitch (type) {\n\t\tcase JsConnectionPointType.BOOLEAN:\n\t\tcase JsConnectionPointType.INT:\n\t\tcase JsConnectionPointType.FLOAT:\n\t\tcase JsConnectionPointType.STRING: {\n\t\t\treturn null;\n\t\t}\n\t\tcase JsConnectionPointType.COLOR: {\n\t\t\treturn new Color();\n\t\t}\n\t\tcase JsConnectionPointType.EULER: {\n\t\t\treturn new Euler();\n\t\t}\n\t\tcase JsConnectionPointType.MATRIX4: {\n\t\t\treturn new Matrix4();\n\t\t}\n\t\tcase JsConnectionPointType.QUATERNION: {\n\t\t\treturn new Quaternion();\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\treturn new Vector2();\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\treturn new Vector3();\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\treturn new Vector4();\n\t\t}\n\t\tcase JsConnectionPointType.BOX3: {\n\t\t\treturn new Box3();\n\t\t}\n\t\tcase JsConnectionPointType.PLANE: {\n\t\t\treturn new Plane();\n\t\t}\n\t\tcase JsConnectionPointType.RAY: {\n\t\t\treturn new Ray();\n\t\t}\n\t\tcase JsConnectionPointType.SPHERE: {\n\t\t\treturn new Sphere();\n\t\t}\n\t\tcase JsConnectionPointType.BOOLEAN_ARRAY:\n\t\tcase JsConnectionPointType.FLOAT_ARRAY:\n\t\tcase JsConnectionPointType.INT_ARRAY:\n\t\tcase JsConnectionPointType.STRING_ARRAY: {\n\t\t\treturn createPrimitiveArray(type);\n\t\t}\n\t\tcase JsConnectionPointType.MATRIX4_ARRAY:\n\t\tcase JsConnectionPointType.QUATERNION_ARRAY:\n\t\tcase JsConnectionPointType.TEXTURE_ARRAY:\n\t\tcase JsConnectionPointType.COLOR_ARRAY:\n\t\tcase JsConnectionPointType.EULER_ARRAY:\n\t\tcase JsConnectionPointType.OBJECT_3D_ARRAY:\n\t\tcase JsConnectionPointType.VECTOR2_ARRAY:\n\t\tcase JsConnectionPointType.VECTOR3_ARRAY:\n\t\tcase JsConnectionPointType.VECTOR4_ARRAY: {\n\t\t\treturn createVectorArray(type);\n\t\t}\n\t\tcase JsConnectionPointType.ANIMATION_MIXER:\n\t\tcase JsConnectionPointType.ANIMATION_ACTION:\n\t\tcase JsConnectionPointType.CAMERA:\n\t\tcase JsConnectionPointType.CATMULL_ROM_CURVE3:\n\t\tcase JsConnectionPointType.INTERSECTION:\n\t\tcase JsConnectionPointType.INTERSECTION_ARRAY:\n\t\tcase JsConnectionPointType.MATERIAL:\n\t\tcase JsConnectionPointType.NODE:\n\t\tcase JsConnectionPointType.OBJECT_3D:\n\t\tcase JsConnectionPointType.PARAM:\n\t\tcase JsConnectionPointType.TEXTURE:\n\t\tcase JsConnectionPointType.TEXTURE_ARRAY:\n\t\tcase JsConnectionPointType.TRIGGER: {\n\t\t\t// console.warn('no variable can be created for type', type);\n\t\t\treturn null;\n\t\t}\n\t}\n\tconsole.warn('createVariable not implemented with type', type);\n\tTypeAssert.unreachable(type);\n}\n\nexport function createPrimitiveArray<V extends PrimitiveArrayElement>(type: JsConnectionPointType): PrimitiveArray<V> {\n\ttype = JsConnectionPointTypeFromArrayTypeMap[type];\n\tswitch (type) {\n\t\tcase JsConnectionPointType.BOOLEAN: {\n\t\t\treturn new PrimitiveArray([false]) as PrimitiveArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.INT: {\n\t\t\treturn new PrimitiveArray([0]) as PrimitiveArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.FLOAT: {\n\t\t\treturn new PrimitiveArray([0]) as PrimitiveArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.STRING: {\n\t\t\treturn new PrimitiveArray(['']) as PrimitiveArray<V>;\n\t\t}\n\t}\n\tconsole.warn('createPrimitiveArray not implemented for type:', type);\n\treturn new PrimitiveArray([0]) as PrimitiveArray<V>;\n}\nexport function createVectorArray<V extends VectorArrayElement>(type: JsConnectionPointType): VectorArray<V> {\n\ttype = JsConnectionPointTypeFromArrayTypeMap[type];\n\tswitch (type) {\n\t\tcase JsConnectionPointType.COLOR: {\n\t\t\treturn new VectorArray([new Color()]) as VectorArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.EULER: {\n\t\t\treturn new VectorArray([new Euler()]) as VectorArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.MATRIX4: {\n\t\t\treturn new VectorArray([new Matrix4()]) as VectorArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.QUATERNION: {\n\t\t\treturn new VectorArray([new Quaternion()]) as VectorArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\treturn new VectorArray([new Vector2()]) as VectorArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\treturn new VectorArray([new Vector3()]) as VectorArray<V>;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\treturn new VectorArray([new Vector4()]) as VectorArray<V>;\n\t\t}\n\t}\n\tconsole.warn('createVectorArray not implemented for type:', type);\n\treturn new VectorArray([new Vector4()]) as VectorArray<V>;\n}\n\nexport enum SerializedVariableType {\n\tBox3 = 'Box3',\n\tColor = 'Color',\n\tEuler = 'Euler',\n\tMatrix4 = 'Matrix4',\n\tPlane = 'Plane',\n\tQuaternion = 'Quaternion',\n\tRay = 'Ray',\n\tSphere = 'Sphere',\n\tVector2 = 'Vector2',\n\tVector3 = 'Vector3',\n\tVector4 = 'Vector4',\n\t// prim array\n\tboolean_Array = 'boolean[]',\n\tnumber_Array = 'number[]',\n\tstring_Array = 'string[]',\n\t// vector array\n\tColor_Array = 'Color[]',\n\tEuler_Array = 'Euler[]',\n\t// Intersection_Array = 'Intersection[]',\n\tMatrix4_Array = 'Matrix4[]',\n\tQuaternion_Array = 'Quaternion[]',\n\t// Texture_Array = 'Texture[]',\n\tVector2_Array = 'Vector2[]',\n\tVector3_Array = 'Vector3[]',\n\tVector4_Array = 'Vector4[]',\n}\ninterface EulerSerialized {\n\trotation: Number3;\n\trotationOrder: EulerOrder;\n}\ninterface SerializedDataByType {\n\t[SerializedVariableType.Box3]: {min: Number3; max: Number3};\n\t[SerializedVariableType.Color]: Number3;\n\t[SerializedVariableType.Euler]: EulerSerialized;\n\t[SerializedVariableType.Matrix4]: Number16;\n\t[SerializedVariableType.Plane]: {normal: Number3; constant: number};\n\t[SerializedVariableType.Quaternion]: Number4;\n\t[SerializedVariableType.Ray]: {origin: Number3; direction: Number3};\n\t[SerializedVariableType.Sphere]: {center: Number3; radius: number};\n\t[SerializedVariableType.Vector2]: Number2;\n\t[SerializedVariableType.Vector3]: Number3;\n\t[SerializedVariableType.Vector4]: Number4;\n\t// prim array\n\t[SerializedVariableType.boolean_Array]: boolean[];\n\t[SerializedVariableType.number_Array]: number[];\n\t[SerializedVariableType.string_Array]: string[];\n\t// vector array\n\t[SerializedVariableType.Color_Array]: Number3[];\n\t[SerializedVariableType.Euler_Array]: EulerSerialized[];\n\t[SerializedVariableType.Matrix4_Array]: Number16[];\n\t[SerializedVariableType.Quaternion_Array]: Number4[];\n\t[SerializedVariableType.Vector2_Array]: Number2[];\n\t[SerializedVariableType.Vector3_Array]: Number3[];\n\t[SerializedVariableType.Vector4_Array]: Number4[];\n}\ninterface VariableByType {\n\t[SerializedVariableType.Box3]: Box3;\n\t[SerializedVariableType.Color]: Color;\n\t[SerializedVariableType.Euler]: Euler;\n\t[SerializedVariableType.Matrix4]: Matrix4;\n\t[SerializedVariableType.Plane]: Plane;\n\t[SerializedVariableType.Quaternion]: Quaternion;\n\t[SerializedVariableType.Ray]: Ray;\n\t[SerializedVariableType.Sphere]: Sphere;\n\t[SerializedVariableType.Vector2]: Vector2;\n\t[SerializedVariableType.Vector3]: Vector3;\n\t[SerializedVariableType.Vector4]: Vector4;\n\t// prim array\n\t[SerializedVariableType.boolean_Array]: PrimitiveArray<boolean>;\n\t[SerializedVariableType.number_Array]: PrimitiveArray<number>;\n\t[SerializedVariableType.string_Array]: PrimitiveArray<string>;\n\t// vector array\n\t[SerializedVariableType.Color_Array]: VectorArray<Color>;\n\t[SerializedVariableType.Euler_Array]: VectorArray<Euler>;\n\t[SerializedVariableType.Matrix4_Array]: VectorArray<Matrix4>;\n\t[SerializedVariableType.Quaternion_Array]: VectorArray<Quaternion>;\n\t[SerializedVariableType.Vector2_Array]: VectorArray<Vector2>;\n\t[SerializedVariableType.Vector3_Array]: VectorArray<Vector3>;\n\t[SerializedVariableType.Vector4_Array]: VectorArray<Vector4>;\n}\ntype SerializableVariable =\n\t| Box3\n\t| Color\n\t| Euler\n\t| Matrix4\n\t| Plane\n\t| Quaternion\n\t| Ray\n\t| Sphere\n\t| Vector2\n\t| Vector3\n\t| Vector4;\n\nexport interface SerializedVariable<T extends SerializedVariableType> {\n\ttype: SerializedVariableType;\n\tdata: SerializedDataByType[T];\n}\n\nexport function isVariableSerializable(variable: any): variable is SerializableVariable {\n\tif (\n\t\tvariable instanceof Box3 ||\n\t\tvariable instanceof Color ||\n\t\tvariable instanceof Euler ||\n\t\tvariable instanceof Matrix4 ||\n\t\tvariable instanceof Plane ||\n\t\tvariable instanceof Quaternion ||\n\t\tvariable instanceof Ray ||\n\t\tvariable instanceof Sphere ||\n\t\tvariable instanceof Vector2 ||\n\t\tvariable instanceof Vector3 ||\n\t\tvariable instanceof Vector4 ||\n\t\tvariable instanceof PrimitiveArray ||\n\t\tvariable instanceof VectorArray\n\t) {\n\t\treturn true;\n\t} else {\n\t\tconsole.warn('not serializable', variable);\n\t\treturn false;\n\t}\n}\n\nexport function serializeVariable<T extends SerializedVariableType>(\n\tvariable: VariableByType[T]\n): SerializedVariable<T> {\n\tif (variable instanceof Box3) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Box3> = {\n\t\t\ttype: SerializedVariableType.Box3,\n\t\t\tdata: {\n\t\t\t\tmin: variable.min.toArray() as Number3,\n\t\t\t\tmax: variable.min.toArray() as Number3,\n\t\t\t},\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Color) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Color> = {\n\t\t\ttype: SerializedVariableType.Color,\n\t\t\tdata: variable.toArray() as Number3,\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Euler) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Euler> = {\n\t\t\ttype: SerializedVariableType.Euler,\n\t\t\tdata: {\n\t\t\t\trotation: variable.toArray() as Number3,\n\t\t\t\trotationOrder: variable.order,\n\t\t\t},\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Matrix4) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Matrix4> = {\n\t\t\ttype: SerializedVariableType.Matrix4,\n\t\t\tdata: variable.toArray() as Number16,\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Plane) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Plane> = {\n\t\t\ttype: SerializedVariableType.Plane,\n\t\t\tdata: {\n\t\t\t\tnormal: variable.normal.toArray() as Number3,\n\t\t\t\tconstant: variable.constant,\n\t\t\t},\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Quaternion) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Quaternion> = {\n\t\t\ttype: SerializedVariableType.Quaternion,\n\t\t\tdata: variable.toArray() as Number4,\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Ray) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Ray> = {\n\t\t\ttype: SerializedVariableType.Ray,\n\t\t\tdata: {\n\t\t\t\torigin: variable.origin.toArray() as Number3,\n\t\t\t\tdirection: variable.direction.toArray() as Number3,\n\t\t\t},\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Sphere) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Sphere> = {\n\t\t\ttype: SerializedVariableType.Sphere,\n\t\t\tdata: {\n\t\t\t\tcenter: variable.center.toArray() as Number3,\n\t\t\t\tradius: variable.radius,\n\t\t\t},\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Vector2) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Vector2> = {\n\t\t\ttype: SerializedVariableType.Vector2,\n\t\t\tdata: variable.toArray() as Number2,\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Vector3) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Vector3> = {\n\t\t\ttype: SerializedVariableType.Vector3,\n\t\t\tdata: variable.toArray() as Number3,\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif (variable instanceof Vector4) {\n\t\tconst data: SerializedVariable<SerializedVariableType.Vector4> = {\n\t\t\ttype: SerializedVariableType.Vector4,\n\t\t\tdata: variable.toArray() as Number4,\n\t\t};\n\t\treturn data as SerializedVariable<T>;\n\t}\n\tif ((variable as PrimitiveArray<any>).isPrimitiveArray) {\n\t\tconst elements = variable.elements();\n\t\tconst firstElement = elements[0];\n\t\tif (isBoolean(firstElement)) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.boolean_Array> = {\n\t\t\t\ttype: SerializedVariableType.boolean_Array,\n\t\t\t\tdata: elements.map((v) => v as boolean),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (isNumber(firstElement)) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.number_Array> = {\n\t\t\t\ttype: SerializedVariableType.number_Array,\n\t\t\t\tdata: elements.map((v) => v as number),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (isString(firstElement)) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.string_Array> = {\n\t\t\t\ttype: SerializedVariableType.string_Array,\n\t\t\t\tdata: elements.map((v) => v as string),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t}\n\tif ((variable as VectorArray<any>).isVectorArray) {\n\t\tconst elements = (variable as VectorArray<any>).elements();\n\t\tconst firstElement = elements[0];\n\t\tif (firstElement instanceof Color) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Color_Array> = {\n\t\t\t\ttype: SerializedVariableType.Color_Array,\n\t\t\t\tdata: elements.map((v) => v.toArray() as Number3),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (firstElement instanceof Euler) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Euler_Array> = {\n\t\t\t\ttype: SerializedVariableType.Euler_Array,\n\t\t\t\tdata: elements.map((v) => ({\n\t\t\t\t\trotation: v.toArray() as Number3,\n\t\t\t\t\trotationOrder: (v as Euler).order,\n\t\t\t\t})),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (firstElement instanceof Matrix4) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Matrix4_Array> = {\n\t\t\t\ttype: SerializedVariableType.Matrix4_Array,\n\t\t\t\tdata: elements.map((v) => v.toArray() as Number16),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (firstElement instanceof Quaternion) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Quaternion_Array> = {\n\t\t\t\ttype: SerializedVariableType.Quaternion_Array,\n\t\t\t\tdata: elements.map((v) => v.toArray() as Number4),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (firstElement instanceof Vector2) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Vector2_Array> = {\n\t\t\t\ttype: SerializedVariableType.Vector2_Array,\n\t\t\t\tdata: elements.map((v) => v.toArray() as Number2),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (firstElement instanceof Vector3) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Vector3_Array> = {\n\t\t\t\ttype: SerializedVariableType.Vector3_Array,\n\t\t\t\tdata: elements.map((v) => v.toArray() as Number3),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tif (firstElement instanceof Vector4) {\n\t\t\tconst data: SerializedVariable<SerializedVariableType.Vector4_Array> = {\n\t\t\t\ttype: SerializedVariableType.Vector4_Array,\n\t\t\t\tdata: elements.map((v) => v.toArray() as Number4),\n\t\t\t};\n\t\t\treturn data as SerializedVariable<T>;\n\t\t}\n\t\tconsole.log('array variable serialization not implemeted', variable, firstElement);\n\t}\n\n\tconsole.log('variable serialization not implemeted', variable);\n\n\tconst data: SerializedVariable<SerializedVariableType.Vector3> = {\n\t\ttype: SerializedVariableType.Vector3,\n\t\tdata: new Vector3().toArray() as Number3,\n\t};\n\treturn data as SerializedVariable<T>;\n}\nexport function deserializeVariable<T extends SerializedVariableType>(\n\tserialized: SerializedVariable<T>\n): VariableByType[T] {\n\tconst type = serialized.type;\n\tswitch (type) {\n\t\tcase SerializedVariableType.Box3: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Box3>).data;\n\t\t\tconst box3 = new Box3();\n\t\t\tbox3.min.set(data.min[0], data.min[1], data.min[2]);\n\t\t\tbox3.max.set(data.max[0], data.max[1], data.max[2]);\n\t\t\treturn box3 as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Color: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Color>).data;\n\t\t\tconst color = new Color();\n\t\t\tcolor.r = data[0];\n\t\t\tcolor.g = data[1];\n\t\t\tcolor.b = data[2];\n\t\t\treturn color as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Euler: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Euler>).data;\n\t\t\tconst euler = new Euler(data.rotation[0], data.rotation[1], data.rotation[2], data.rotationOrder);\n\t\t\treturn euler as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Matrix4: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Matrix4>).data;\n\t\t\tconst matrix = new Matrix4();\n\t\t\tmatrix.set(...data);\n\t\t\treturn matrix as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Plane: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Plane>).data;\n\t\t\tconst plane = new Plane();\n\t\t\tplane.normal.set(...data.normal);\n\t\t\tplane.constant = data.constant;\n\t\t\treturn plane as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Quaternion: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Quaternion>).data;\n\t\t\tconst vector = new Quaternion();\n\t\t\tvector.set(...data);\n\t\t\treturn vector as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Ray: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Ray>).data;\n\t\t\tconst ray = new Ray();\n\t\t\tray.origin.set(...data.origin);\n\t\t\tray.direction.set(...data.direction);\n\t\t\treturn ray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Sphere: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Sphere>).data;\n\t\t\tconst sphere = new Sphere();\n\t\t\tsphere.center.set(...data.center);\n\t\t\tsphere.radius = data.radius;\n\t\t\treturn sphere as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Vector2: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Vector2>).data;\n\t\t\tconst vector = new Vector2();\n\t\t\tvector.set(...data);\n\t\t\treturn vector as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Vector3: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Vector3>).data;\n\t\t\tconst vector = new Vector3();\n\t\t\tvector.set(...data);\n\t\t\treturn vector as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Vector4: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Vector4>).data;\n\t\t\tconst vector = new Vector4();\n\t\t\tvector.set(...data);\n\t\t\treturn vector as VariableByType[T];\n\t\t}\n\t\t// prim array\n\t\tcase SerializedVariableType.boolean_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.boolean_Array>).data;\n\t\t\tconst values = [...data];\n\t\t\tconst numberArray = new PrimitiveArray(values);\n\t\t\treturn numberArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.number_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.number_Array>).data;\n\t\t\tconst values = [...data];\n\t\t\tconst numberArray = new PrimitiveArray(values);\n\t\t\treturn numberArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.string_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.string_Array>).data;\n\t\t\tconst values = [...data];\n\t\t\tconst numberArray = new PrimitiveArray(values);\n\t\t\treturn numberArray as VariableByType[T];\n\t\t}\n\t\t// vector array\n\t\tcase SerializedVariableType.Color_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Color_Array>).data;\n\t\t\tconst vectors = data.map((d) => {\n\t\t\t\tconst color = new Color();\n\t\t\t\tcolor.r = d[0];\n\t\t\t\tcolor.g = d[1];\n\t\t\t\tcolor.b = d[2];\n\t\t\t\treturn color;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(vectors);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Euler_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Euler_Array>).data;\n\t\t\tconst eulers = data.map((d) => {\n\t\t\t\tconst euler = new Euler(d.rotation[0], d.rotation[1], d.rotation[2], d.rotationOrder);\n\t\t\t\treturn euler;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(eulers);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Matrix4_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Matrix4_Array>).data;\n\t\t\tconst vectors = data.map((d) => {\n\t\t\t\tconst v = new Matrix4();\n\t\t\t\tv.set(...d);\n\t\t\t\treturn v;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(vectors);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Quaternion_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Quaternion_Array>).data;\n\t\t\tconst vectors = data.map((d) => {\n\t\t\t\tconst v = new Quaternion();\n\t\t\t\tv.set(...d);\n\t\t\t\treturn v;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(vectors);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\n\t\tcase SerializedVariableType.Vector2_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Vector2_Array>).data;\n\t\t\tconst vectors = data.map((d) => {\n\t\t\t\tconst v = new Vector2();\n\t\t\t\tv.set(...d);\n\t\t\t\treturn v;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(vectors);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Vector3_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Vector3_Array>).data;\n\t\t\tconst vectors = data.map((d) => {\n\t\t\t\tconst v = new Vector3();\n\t\t\t\tv.set(...d);\n\t\t\t\treturn v;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(vectors);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\t\tcase SerializedVariableType.Vector4_Array: {\n\t\t\tconst data = (serialized as SerializedVariable<SerializedVariableType.Vector4_Array>).data;\n\t\t\tconst vectors = data.map((d) => {\n\t\t\t\tconst v = new Vector4();\n\t\t\t\tv.set(...d);\n\t\t\t\treturn v;\n\t\t\t});\n\t\t\tconst vectorArray = new VectorArray(vectors);\n\t\t\treturn vectorArray as VariableByType[T];\n\t\t}\n\t}\n\tTypeAssert.unreachable(type);\n}\n","export enum ActorAssemblerConstant {\n\tOBJECT_3D = 'this.object3D',\n\tMATERIAL = 'this.object3D.material',\n\tGEOMETRY = 'this.object3D.geometry',\n\tPTNUM = 'this.ptnum',\n\tPRIMITIVE_GRAPH = 'null',\n}\n","import {addToSetAtEntry} from '../../../../../../core/MapUtils';\nimport {setToArray} from '../../../../../../core/SetUtils';\nimport {sanitizeName} from '../../../../../../core/String';\nimport {NodeContext} from '../../../../../poly/NodeContext';\nimport {ActorBuilderNode} from '../../../../../scene/utils/ActorsManager';\n// import {ActorSopNode} from '../../../../sop/Actor';\nimport {BaseJsConnectionPoint, JsConnectionPointType} from '../../../../utils/io/connections/Js';\nimport {BaseJsNodeType} from '../../../_Base';\n\ntype ConnectionPointCallback = (connectionPoint: BaseJsConnectionPoint) => boolean;\n\nexport function nodeMethodName(node: BaseJsNodeType, outputName?: string): string {\n\tconst functionNode = node.functionNode();\n\tif (functionNode == null) {\n\t\treturn node.name();\n\t}\n\tconst pathWithoutParentPath = node.path().replace(functionNode.path(), '');\n\tconst sanitizedPath = sanitizeName(pathWithoutParentPath);\n\tconst pathWithoutForwardSlash = sanitizedPath.substring(1);\n\t// we remove the underscore inside the name,\n\t// so that we can find the method and highlight it in the editor,\n\t// without assuming that what's after the underscore is the name of the output\n\tconst pathWithoutUnderscore = pathWithoutForwardSlash.replace(/_/g, '');\n\tconst sanitized = pathWithoutUnderscore;\n\tif (outputName) {\n\t\treturn `${sanitized}_${outputName}`;\n\t} else {\n\t\treturn sanitized;\n\t}\n}\ninterface MethodNameData {\n\toutputName: string;\n\tnodeName: string;\n\tmethodNameWithoutOutputName: string;\n}\nexport function methodNameData(methodName: string): MethodNameData {\n\tconst elements = methodName.split('_');\n\tif (elements.length > 1) {\n\t\tconst outputName = elements[elements.length - 1];\n\t\tconst nodeName = elements[elements.length - 2];\n\t\telements.pop();\n\t\tconst methodNameWithoutOutputName = elements.join('_');\n\t\treturn {outputName, nodeName, methodNameWithoutOutputName};\n\t} else {\n\t\tconst outputName = JsConnectionPointType.TRIGGER;\n\t\tconst nodeName = elements[elements.length - 2];\n\t\tconst methodNameWithoutOutputName = methodName;\n\t\treturn {outputName, nodeName, methodNameWithoutOutputName};\n\t}\n}\n\nfunction isTriggeringNode(node: BaseJsNodeType): boolean {\n\treturn node.isTriggering() && _hasTriggerOutputConnected(node);\n\t// if(!node.isTriggering()){\n\t// \treturn false\n\t// }\n\t// const cp = node.io.outputs.namedOutputConnectionPointsByName(TRIGGER_CONNECTION_NAME);\n\t// return cp != null && cp.type() == JsConnectionPointType.TRIGGER;\n}\nfunction _hasTriggerOutputConnected(node: BaseJsNodeType): boolean {\n\tconst outputConnectionPoints = node.io.outputs.namedOutputConnectionPoints();\n\tlet triggerOutputIndices: number[] = [];\n\tlet i = 0;\n\tif (outputConnectionPoints) {\n\t\tfor (const outputConnectionPoint of outputConnectionPoints) {\n\t\t\tif (outputConnectionPoint.type() == JsConnectionPointType.TRIGGER) {\n\t\t\t\ttriggerOutputIndices.push(i);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\tfor (const triggerOutputIndex of triggerOutputIndices) {\n\t\tconst triggerConnections = node.io.connections.outputConnectionsByOutputIndex(triggerOutputIndex);\n\t\tif (triggerConnections != null && triggerConnections.size > 0) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n// function isTriggerableNode(node: BaseJsNodeType): boolean {\n// \tconst cp = node.io.inputs.namedInputConnectionPointsByName(TRIGGER_CONNECTION_NAME);\n// \treturn cp != null && cp.type() == JsConnectionPointType.TRIGGER;\n// }\nfunction evalChildren(\n\tparent: ActorBuilderNode,\n\tnodes: Set<BaseJsNodeType>,\n\ttestFunction: (node: BaseJsNodeType) => boolean\n): void {\n\tnodes.clear();\n\tparent.childrenController?.traverseChildren((child) => {\n\t\tif (child.context() == NodeContext.JS) {\n\t\t\tconst jsChild = child as BaseJsNodeType;\n\t\t\tif (testFunction(jsChild)) {\n\t\t\t\tnodes.add(jsChild);\n\t\t\t}\n\t\t}\n\t});\n}\nexport function findTriggeringNodes(parent: ActorBuilderNode): Set<BaseJsNodeType> {\n\tconst nodes: Set<BaseJsNodeType> = new Set();\n\tevalChildren(parent, nodes, isTriggeringNode);\n\treturn nodes;\n}\n// export function findTriggeringNodesNonTriggerable(parent: ActorJsSopNode): Set<BaseJsNodeType> {\n// \tconst nodes: Set<BaseJsNodeType> = new Set();\n// \tconst _func = (node: BaseJsNodeType) => isTriggeringNode(node) && !isTriggerableNode(node);\n// \tevalChildren(parent, nodes, _func);\n// \treturn nodes;\n// }\n// export function findTriggerableNodes(triggeringNodes:Set<BaseJsNodeType> ):Set<BaseJsNodeType>{\n// \tconst nodes:Set<BaseJsNodeType> = new Set()\n\n// \ttriggeringNodes.forEach(triggeringNode=>{\n\n// \t})\n\n// \treturn nodes\n// }\n// export function findTriggerableNodes(parent: ActorJsSopNode, nodes: Set<BaseJsNodeType>) {\n// \tevalChildren(parent, nodes, isTriggerableNode);\n// }\n\nexport function groupNodesByType(nodes: Set<BaseJsNodeType>, nodesByType: Map<string, Set<BaseJsNodeType>>) {\n\tnodesByType.clear();\n\tnodes.forEach((node) => {\n\t\taddToSetAtEntry(nodesByType, node.type(), node);\n\t});\n}\n\nexport function getOutputIndices(node: BaseJsNodeType, callback: ConnectionPointCallback) {\n\tlet triggerOutputIndices: number[] = [];\n\tconst outputConnectionPoints = node.io.outputs.namedOutputConnectionPoints();\n\tif (outputConnectionPoints) {\n\t\tlet i = 0;\n\t\tfor (const outputConnectionPoint of outputConnectionPoints) {\n\t\t\tif (callback(outputConnectionPoint) == true) {\n\t\t\t\ttriggerOutputIndices.push(i);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\treturn triggerOutputIndices;\n}\nexport function getInputIndices(node: BaseJsNodeType, callback: ConnectionPointCallback) {\n\tlet triggerInputIndices: number[] = [];\n\tconst inputConnectionPoints = node.io.inputs.namedInputConnectionPoints();\n\tif (inputConnectionPoints) {\n\t\tlet i = 0;\n\t\tfor (const inputConnectionPoint of inputConnectionPoints) {\n\t\t\tif (callback(inputConnectionPoint) == true) {\n\t\t\t\ttriggerInputIndices.push(i);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\treturn triggerInputIndices;\n}\ninterface GetConnectedOutputNodesOptions {\n\tnode: BaseJsNodeType;\n\ttriggerOutputIndices: number[];\n\ttriggerableNodes: Set<BaseJsNodeType>;\n\trecursive: boolean;\n}\n\nexport function getConnectedOutputNodes(options: GetConnectedOutputNodesOptions) {\n\tconst {node, triggerOutputIndices, triggerableNodes, recursive} = options;\n\tfor (const triggerOutputIndex of triggerOutputIndices) {\n\t\tconst triggerConnections = node.io.connections.outputConnectionsByOutputIndex(triggerOutputIndex);\n\t\tif (triggerConnections) {\n\t\t\ttriggerConnections.forEach((triggerConnection) => {\n\t\t\t\ttriggerableNodes.add(triggerConnection.nodeDest());\n\t\t\t\tif (recursive) {\n\t\t\t\t\tconnectedTriggerableNodes({\n\t\t\t\t\t\ttriggeringNodes: new Set([triggerConnection.nodeDest()]),\n\t\t\t\t\t\ttriggerableNodes,\n\t\t\t\t\t\trecursive,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n\ninterface ConnectedTriggerableNodesOptions {\n\ttriggeringNodes: Set<BaseJsNodeType>;\n\ttriggerableNodes: Set<BaseJsNodeType>;\n\trecursive: boolean;\n}\nexport function connectedTriggerableNodes(options: ConnectedTriggerableNodesOptions) {\n\tconst {triggeringNodes, triggerableNodes, recursive} = options;\n\ttriggeringNodes.forEach((node) => {\n\t\tconst triggerOutputIndices = getOutputIndices(node, (c) => c.type() == JsConnectionPointType.TRIGGER);\n\t\t// get output connection points with type trigger\n\t\t// let triggerOutputIndices: number[] = [];\n\t\t// const outputConnectionPoints = node.io.outputs.namedOutputConnectionPoints();\n\t\t// let i = 0;\n\t\t// for (let outputConnectionPoint of outputConnectionPoints) {\n\t\t// \tif (outputConnectionPoint.type() == JsConnectionPointType.TRIGGER) {\n\t\t// \t\ttriggerOutputIndices.push(i);\n\t\t// \t}\n\t\t// \ti++;\n\t\t// }\n\t\tgetConnectedOutputNodes({node, triggerOutputIndices, triggerableNodes, recursive});\n\t\t// get connected nodes\n\t\t// for (let triggerOutputIndex of triggerOutputIndices) {\n\t\t// \tconst triggerConnections = node.io.connections.outputConnectionsByOutputIndex(triggerOutputIndex);\n\t\t// \tif (triggerConnections) {\n\t\t// \t\ttriggerConnections.forEach((triggerConnection) => {\n\t\t// \t\t\ttriggerableNodes.add(triggerConnection.node_dest);\n\t\t// \t\t\tif (recursive) {\n\t\t// \t\t\t\tconnectedTriggerableNodes({\n\t\t// \t\t\t\t\ttriggeringNodes: new Set([triggerConnection.node_dest]),\n\t\t// \t\t\t\t\ttriggerableNodes,\n\t\t// \t\t\t\t\trecursive,\n\t\t// \t\t\t\t});\n\t\t// \t\t\t}\n\t\t// \t\t});\n\t\t// \t}\n\t\t// }\n\t});\n}\n\nconst _nonTriggerInputNodes: Set<BaseJsNodeType> = new Set();\nconst _nonTriggerInputIndices: number[] = [];\nfunction _inputNodesFromConnectionWithCallback(\n\tnode: BaseJsNodeType,\n\tcallback: ConnectionPointCallback,\n\ttarget: BaseJsNodeType[]\n) {\n\t_nonTriggerInputNodes.clear();\n\t_nonTriggerInputIndices.length = 0;\n\tconst inputConnectionPoints = node.io.inputs.namedInputConnectionPoints();\n\tif (inputConnectionPoints) {\n\t\tlet i = 0;\n\t\tfor (const outputConnectionPoint of inputConnectionPoints) {\n\t\t\tif (callback(outputConnectionPoint)) {\n\t\t\t\t_nonTriggerInputIndices.push(i);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\tfor (const nonTriggerInputIndex of _nonTriggerInputIndices) {\n\t\tconst connection = node.io.connections.inputConnection(nonTriggerInputIndex);\n\t\tif (connection) {\n\t\t\t_nonTriggerInputNodes.add(connection.nodeSrc());\n\t\t}\n\t}\n\treturn setToArray(_nonTriggerInputNodes, target);\n}\nexport function inputNodesExceptTrigger(node: BaseJsNodeType, target: BaseJsNodeType[]) {\n\t// return inputNodesFromConnectionWithCallback(node, (c) => c.type() != JsConnectionPointType.TRIGGER);\n\t// update:\n\t// I initially thought we should not take into account node when only connected via a trigger connection,\n\t// but that fails with the onObjectAttributeUpdate,\n\t// if it is only connected via its trigger, as its inputs are then not parsed,\n\t// which is very much needed when using a different object as input\n\treturn _inputNodesFromConnectionWithCallback(node, (c) => true, target);\n}\n\nexport function triggerInputIndex(triggeringNode: BaseJsNodeType, triggeredNode: BaseJsNodeType): number | null {\n\tconst triggerOutputIndices = getOutputIndices(triggeringNode, (c) => c.type() == JsConnectionPointType.TRIGGER);\n\n\tlet index: number | null = null;\n\tfor (const triggerOutputIndex of triggerOutputIndices) {\n\t\tconst triggerConnections = triggeringNode.io.connections.outputConnectionsByOutputIndex(triggerOutputIndex);\n\t\tif (triggerConnections) {\n\t\t\ttriggerConnections.forEach((triggerConnection) => {\n\t\t\t\tif (triggerConnection.nodeDest() == triggeredNode) {\n\t\t\t\t\tindex = triggerConnection.inputIndex();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn index;\n}\n\nconst _triggerableNodesSet = new Set<BaseJsNodeType>();\nconst _triggerableNodes: BaseJsNodeType[] = [];\nexport function triggerableMethodCalls(triggeringNode: BaseJsNodeType) {\n\t_triggerableNodesSet.clear();\n\tconnectedTriggerableNodes({\n\t\ttriggeringNodes: new Set([triggeringNode]),\n\t\ttriggerableNodes: _triggerableNodesSet,\n\t\trecursive: false,\n\t});\n\tsetToArray(_triggerableNodesSet, _triggerableNodes);\n\n\tconst methodCalls: string[] = [];\n\tfor (const triggerableNode of _triggerableNodes) {\n\t\tconst methodName = nodeMethodName(triggerableNode);\n\t\tconst argIndex = triggerInputIndex(triggeringNode, triggerableNode);\n\t\t// argIndex is used to highlight the connection\n\t\tconst methodCall = `this.${methodName}(${argIndex});`;\n\t\tmethodCalls.push(methodCall);\n\t}\n\treturn methodCalls.join('\\n');\n\t// const triggerableMethodCalls = triggerableMethodNames\n\t// \t.map((methodName) => `this.${methodName}(${})`)\n\t// \t.join('\\n');\n}\n","import {PolyScene} from '../../../../scene/PolyScene';\nimport {BaseNodeType} from '../../../../nodes/_Base';\nimport {TimeController} from '../../../../scene/utils/TimeController';\nimport {WatchStopHandle} from '@vue-reactivity/watch';\n\ntype OnDisposeCallback = () => void;\nexport class BaseEvaluator {\n\tprotected scene: PolyScene;\n\tprotected timeController: TimeController;\n\tprotected _watchStopHandles: WatchStopHandle[] = [];\n\tconstructor(public readonly node: BaseNodeType) {\n\t\tthis.scene = node.scene();\n\t\tthis.timeController = this.scene.timeController;\n\t}\n\n\t// dispose logic\n\t_onDisposeCallbacks?: OnDisposeCallback[];\n\tonDispose(callback: OnDisposeCallback) {\n\t\tthis._onDisposeCallbacks = this._onDisposeCallbacks || [];\n\t\tthis._onDisposeCallbacks.push(callback);\n\t}\n\tdispose() {\n\t\tconst _disposeWatchEffects = () => {\n\t\t\tif (!this._watchStopHandles) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet watchStopHandle: WatchStopHandle | undefined;\n\t\t\twhile ((watchStopHandle = this._watchStopHandles.pop())) {\n\t\t\t\twatchStopHandle();\n\t\t\t}\n\t\t};\n\n\t\tconst _runOnDisposeCallback = () => {\n\t\t\tif (!this._onDisposeCallbacks) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet callback: OnDisposeCallback | undefined;\n\t\t\twhile ((callback = this._onDisposeCallbacks.pop())) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t};\n\t\t_runOnDisposeCallback();\n\t\t_disposeWatchEffects();\n\t}\n}\n","// shared by ALL objects\n// shared between 2 triggers nodes depending on it\n// function getSin(object){\n// \treturn Math.sin(time)\n// }\n\nimport {Object3D} from 'three';\nimport {JsType} from '../../../../../poly/registers/nodes/types/Js';\nimport {EventData} from '../../../../../../core/event/EventData';\nimport {ActorBuilderNode} from '../../../../../scene/utils/ActorsManager';\nimport {BaseEvaluator} from '../_BaseEvaluator';\nimport {CoreObjectType, ObjectContent} from '../../../../../../core/geometry/ObjectContent';\n// import {watch} from '../../../../../../core/reactivity/CoreReactivity';\n// import {getObjectAttributeRef} from '../../../../../../core/reactivity/ObjectAttributeReactivity';\n// import {ref} from '../../../../../../core/reactivity';\n\n// // updateObjectPosition\n// function runUpdatePosition(object){\n\n// \tobject.position.y = getSin(object)\n// \tobject.updateMatrix();\n\n// \t// fire trigger\n// \trunUpdatePosition(object)\n// }\n\n// // updateObjectRotation\n// function runUpdateRotation(object){\n\n// \tobject.rotation.y = getSin(object)\n// \tobject.updateMatrix();\n// }\n\n//////////////\n// import {Ref, ref, computed} from '@vue/reactivity';\n// import {Vector3, Object3D} from 'three';\n// import {PolyScene} from '../../../../../scene/PolyScene';\n// import {ActorNodeTriggerContext} from '../../../../actor/_Base';\n// const _v3 = new Vector3();\n// export class JsActorEvaluator {\n// \tpublic globalsTime = ref(0);\n// \tpublic targetObject: Ref<Object3D | null> = ref(null);\n// \t// public sinNodeValue = computed(()=>Math.sin(globalsTime.value)); // only depends on time\n// \tpublic sinNodePos = computed(() => {\n// \t\t// _var.y = sinNodeValue.value;\n// \t\tconst globalsTime = this.scene.timeController.timeUniform();\n// \t\t_v3.y = Math.sin(globalsTime.value); // only depends on time\n// \t\treturn _v3;\n// \t});\n// \t// public getMaterial = computed(()=> ... )// depends on a string\n// \tconstructor(private scene: PolyScene) {}\n\n// \t// time could be a reactive element inside the timeController\n// \ttriggerOnTick(context: ActorNodeTriggerContext) {\n// \t\tconst Object3D = this.targetObject.value!;\n// \t\tthis.targetObject.value = Object3D;\n\n// \t\t//\n// \t\tObject3D.position.copy(this.sinNodePos.value);\n// \t\t// object.updateMatrix(); // not generated?\n\n// \t\tthis.trigger2(context);\n// \t}\n// \ttrigger2(context: ActorNodeTriggerContext) {\n// \t\tconst Object3D = this.targetObject.value!;\n// \t\tthis.targetObject.value = Object3D; // does not trigger a change\n\n// \t\tObject3D.rotation.setFromVector3(this.sinNodePos.value);\n// \t\tObject3D.updateMatrix();\n// \t}\n// }\nexport interface EvaluationContext {\n\tObject3D: Object3D;\n}\ntype TriggerCallback = () => void;\n// type KeyboardTriggerCallback = (event: KeyboardEvent) => void;\nexport type EvaluatorKeyboardMethod = JsType.ON_KEY | JsType.ON_KEYDOWN | JsType.ON_KEYPRESS | JsType.ON_KEYUP;\nexport type EvaluatorPointerMethod =\n\t// | JsType.ON_OBJECT_CLICK\n\t// | 'onClick'\n\t| 'onContextMenu'\n\t// | JsType.ON_OBJECT_HOVER\n\t// | 'onPointerdown'\n\t| 'onPointermove'\n\t// | 'onPointerup'\n\t// | JsType.ON_OBJECT_POINTERDOWN\n\t// | JsType.ON_OBJECT_POINTERUP\n\t| JsType.ON_POINTERDOWN\n\t| JsType.ON_POINTERUP;\n\nexport type EvaluatorMethodName =\n\t| JsType.ON_KEY\n\t| JsType.ON_KEYDOWN\n\t| JsType.ON_KEYPRESS\n\t| JsType.ON_KEYUP\n\t// | JsType.ON_MANUAL_TRIGGER\n\t| JsType.ON_MAPBOX_CAMERA_MOVE\n\t| JsType.ON_MAPBOX_CAMERA_MOVE_START\n\t| JsType.ON_MAPBOX_CAMERA_MOVE_END\n\t| JsType.ON_OBJECT_ATTRIBUTE_UPDATE\n\t// | JsType.ON_OBJECT_CLICK\n\t// | 'onClick'\n\t| 'onContextMenu'\n\t| JsType.ON_OBJECT_DISPATCH_EVENT\n\t// | JsType.ON_OBJECT_HOVER\n\t// | JsType.ON_OBJECT_POINTERDOWN\n\t// | JsType.ON_OBJECT_POINTERUP\n\t| JsType.ON_PERFORMANCE_CHANGE\n\t| JsType.ON_POINTERDOWN\n\t| 'onPointermove'\n\t| JsType.ON_POINTERUP\n\t| JsType.ON_SCENE_PAUSE\n\t| JsType.ON_SCENE_PLAY\n\t| JsType.ON_SCENE_RESET\n\t| JsType.ON_TICK\n\t| JsType.ON_VIDEO_EVENT\n\t| JsType.ON_WEBXR_CONTROLLER_EVENT;\nexport const EVALUATOR_METHOD_NAMES: Array<EvaluatorMethodName> = [\n\tJsType.ON_KEY,\n\tJsType.ON_KEYDOWN,\n\tJsType.ON_KEYPRESS,\n\tJsType.ON_KEYUP,\n\t// JsType.ON_MANUAL_TRIGGER,\n\tJsType.ON_MAPBOX_CAMERA_MOVE,\n\tJsType.ON_MAPBOX_CAMERA_MOVE_START,\n\tJsType.ON_MAPBOX_CAMERA_MOVE_END,\n\tJsType.ON_OBJECT_ATTRIBUTE_UPDATE,\n\t// JsType.ON_OBJECT_CLICK,\n\t// 'onClick',\n\tJsType.ON_OBJECT_DISPATCH_EVENT,\n\t// JsType.ON_OBJECT_HOVER,\n\t// JsType.ON_OBJECT_POINTERDOWN,\n\t// JsType.ON_OBJECT_POINTERUP,\n\tJsType.ON_PERFORMANCE_CHANGE,\n\tJsType.ON_POINTERDOWN,\n\t'onPointermove',\n\tJsType.ON_POINTERUP,\n\tJsType.ON_SCENE_PAUSE,\n\tJsType.ON_SCENE_PLAY,\n\tJsType.ON_SCENE_RESET,\n\tJsType.ON_TICK,\n\tJsType.ON_VIDEO_EVENT,\n\tJsType.ON_WEBXR_CONTROLLER_EVENT,\n];\n\nexport interface EvaluatorEventData extends EventData {\n\tjsType: JsType;\n\t// methodName: EvaluatorMethodName;\n}\nexport class ActorEvaluator extends BaseEvaluator {\n\tconstructor(\n\t\tpublic override readonly node: ActorBuilderNode,\n\t\t// make sure the name of this member 'object3D'\n\t\t// remains consistent with this.object3D used in the ActorAssembler\n\t\tpublic readonly object3D: ObjectContent<CoreObjectType>\n\t) {\n\t\tsuper(node);\n\t}\n\n\tonKey?: TriggerCallback;\n\tonKeydown?: TriggerCallback;\n\tonKeypress?: TriggerCallback;\n\tonKeyup?: TriggerCallback;\n\tonPlayerEvent?: TriggerCallback;\n\t// onManualTrigger?: TriggerCallback;\n\tonMapboxCameraMove?: TriggerCallback;\n\tonMapboxCameraMoveStart?: TriggerCallback;\n\tonMapboxCameraMoveEnd?: TriggerCallback;\n\tonObjectAttributeUpdate?: TriggerCallback;\n\tonObjectClick?: TriggerCallback;\n\tonObjectDispatchEvent?: TriggerCallback;\n\tonObjectHover?: TriggerCallback;\n\tonObjectPointerdown?: TriggerCallback;\n\tonObjectPointerup?: TriggerCallback;\n\tonPerformanceChange?: TriggerCallback;\n\tonPointerdown?: TriggerCallback;\n\tonPointerup?: TriggerCallback;\n\tonScenePause?: TriggerCallback;\n\tonScenePlay?: TriggerCallback;\n\tonSceneReset?: TriggerCallback;\n\tonTick?: TriggerCallback;\n\tonVideoEvent?: TriggerCallback;\n\tonWebXRControllerEvent?: TriggerCallback;\n}\n","import {EvaluatorEventData, ActorEvaluator, EvaluatorMethodName} from './ActorEvaluator';\nimport {CoreObjectType, ObjectContent} from '../../../../../../core/geometry/ObjectContent';\nimport {getObjectMethodNames} from '../../../../../../core/ObjectUtils';\n\ntype GeneratorFunction = (object: ObjectContent<CoreObjectType>) => ActorEvaluator;\ntype EvaluatorCallback = (evaluator: ActorEvaluator) => void;\n\nconst evaluatorGeneratorByObject: WeakMap<ObjectContent<CoreObjectType>, Set<ActorEvaluatorGenerator>> = new WeakMap();\nfunction registerGeneratorForObject(object: ObjectContent<CoreObjectType>, generator: ActorEvaluatorGenerator) {\n\tlet set = evaluatorGeneratorByObject.get(object);\n\tif (!set) {\n\t\tset = new Set();\n\t\tevaluatorGeneratorByObject.set(object, set);\n\t}\n\tset.add(generator);\n}\nfunction deregisterGeneratorForObject(object: ObjectContent<CoreObjectType>, generator: ActorEvaluatorGenerator) {\n\tlet set = evaluatorGeneratorByObject.get(object);\n\tif (!set) {\n\t\treturn;\n\t}\n\tset.delete(generator);\n}\nexport function deregisterGeneratorsForObject(object: ObjectContent<CoreObjectType>) {\n\tlet set = evaluatorGeneratorByObject.get(object);\n\tif (!set) {\n\t\treturn;\n\t}\n\tset.forEach((evaluatorGenerator) => {\n\t\tevaluatorGenerator.disposeEvaluator(object);\n\t});\n\n\tevaluatorGeneratorByObject.delete(object);\n}\nexport function generatorsForObject(object: ObjectContent<CoreObjectType>) {\n\treturn evaluatorGeneratorByObject.get(object);\n}\n\nconst NOT_STORABLE_METHOD_NAMES = new Set([\n\t'constructor',\n\t'onDispose',\n\t'dispose',\n\t'__defineGetter__',\n\t'__defineSetter__',\n\t'hasOwnProperty',\n\t'__lookupGetter__',\n\t'__lookupSetter__',\n\t'isPrototypeOf',\n\t'propertyIsEnumerable',\n\t'toString',\n\t'valueOf',\n\t'toLocaleString',\n]);\n\nexport class ActorEvaluatorGenerator {\n\t// the possible method names are not only EvaluatorMethodName,\n\t// but can be any string, such as \"onManualTrigger1\"\n\tprivate _expectedEvaluatorMethodNames: Set<string> = new Set();\n\tconstructor(private _func: GeneratorFunction) {}\n\tprivate _evaluatorByObject: Map<ObjectContent<CoreObjectType>, ActorEvaluator> = new Map();\n\teventDatas?: Set<EvaluatorEventData>;\n\tprivate _createEvaluator(object: ObjectContent<CoreObjectType>) {\n\t\treturn this._func(object);\n\t}\n\tsetExpectedEvaluatorMethodNames(dummyEvaluator: ActorEvaluator) {\n\t\tthis._expectedEvaluatorMethodNames.clear();\n\t\tconst methodNames = getObjectMethodNames(dummyEvaluator);\n\t\tfor (const methodName of methodNames) {\n\t\t\tif ((dummyEvaluator as any)[methodName] && !NOT_STORABLE_METHOD_NAMES.has(methodName)) {\n\t\t\t\tthis._expectedEvaluatorMethodNames.add(methodName);\n\t\t\t}\n\t\t}\n\t}\n\thasExpectedEvaluatorMethodName(methodName: EvaluatorMethodName): boolean {\n\t\treturn this._expectedEvaluatorMethodNames.has(methodName);\n\t}\n\tsize(): number {\n\t\treturn this._evaluatorByObject.size;\n\t}\n\tdisposeEvaluator(object: ObjectContent<CoreObjectType>) {\n\t\tconst evaluator = this._evaluatorByObject.get(object);\n\t\tif (!evaluator) {\n\t\t\treturn;\n\t\t}\n\t\tevaluator.dispose();\n\t\tthis._evaluatorByObject.delete(object);\n\t}\n\tfindOrCreateEvaluator(object: ObjectContent<CoreObjectType>) {\n\t\tlet evaluator = this._evaluatorByObject.get(object);\n\t\tif (!evaluator) {\n\t\t\tevaluator = this._createEvaluator(object);\n\t\t\tthis._evaluatorByObject.set(object, evaluator);\n\t\t\tregisterGeneratorForObject(object, this);\n\t\t}\n\t\treturn evaluator;\n\t}\n\ttraverseEvaluator(callback: EvaluatorCallback) {\n\t\tthis._evaluatorByObject.forEach(callback);\n\t}\n\tclearObjects() {\n\t\tthis._evaluatorByObject.forEach((evaluator, object) => {\n\t\t\tevaluator.dispose();\n\t\t\tderegisterGeneratorForObject(object, this);\n\t\t});\n\n\t\tthis._evaluatorByObject.clear();\n\t}\n}\n","import {BaseJsNodeType} from '../../_Base';\nimport {LineType} from './LineType';\nimport {BaseNodeType} from '../../../_Base';\nimport {NetworkChildNodeType} from '../../../../poly/NodeContext';\n\nconst LINE_SUFFIXES: Record<LineType, string> = {\n\t[LineType.MEMBER]: '',\n\t[LineType.CONSTRUCTOR]: '',\n\t[LineType.DEFINE]: '',\n\t[LineType.BODY]: ';',\n\t// [LineType.TRIGGER]: ';',\n\t// [LineType.TRIGGERABLE]: ';',\n};\n\nconst LINE_PREFIXES: Record<LineType, string> = {\n\t[LineType.MEMBER]: '',\n\t[LineType.CONSTRUCTOR]: '',\n\t[LineType.DEFINE]: '',\n\t[LineType.BODY]: '\t',\n\t// [LineType.TRIGGER]: '\t',\n\t// [LineType.TRIGGERABLE]: '\t',\n};\nconst BLOCK_START_LAST_CHAR = '{';\nconst BLOCK_END_LAST_CHAR = '}';\n\nexport class CodeFormatter {\n\tstatic nodeComment(node: BaseJsNodeType, lineType: LineType): string {\n\t\tlet line = `// ${node.path()}`;\n\t\tlet prefix: string = LINE_PREFIXES[lineType];\n\t\tif (lineType == LineType.BODY) {\n\t\t\tlet distance = this.nodeDistanceToMaterial(node);\n\t\t\t// special case for subnet_output, so that the comment is offset correctly\n\t\t\tif (node.type() == NetworkChildNodeType.OUTPUT) {\n\t\t\t\tdistance += 1;\n\t\t\t}\n\t\t\tprefix = prefix.repeat(distance);\n\t\t}\n\t\tif (lineType == LineType.BODY) {\n\t\t\tline = `${prefix}${line}`;\n\t\t}\n\t\treturn line;\n\t}\n\tstatic lineWrap(node: BaseJsNodeType, line: string, lineType: LineType) {\n\t\tlet add_suffix = true;\n\t\tif (line.includes('#if') || line.includes('#endif') || line.includes('#pragma unroll_loop_')) {\n\t\t\tadd_suffix = false;\n\t\t}\n\t\tlet prefix: string = LINE_PREFIXES[lineType];\n\t\tif (lineType == LineType.BODY) {\n\t\t\tprefix = prefix.repeat(this.nodeDistanceToMaterial(node));\n\t\t}\n\t\tline = `${prefix}${line}`;\n\t\tif (add_suffix) {\n\t\t\tconst last_char = line[line.length - 1];\n\t\t\tconst suffix = LINE_SUFFIXES[lineType];\n\t\t\tconst lineIsEmpty = line.trim().length == 0;\n\t\t\tconst lineIsComment = line.trim().startsWith('//');\n\t\t\tif (\n\t\t\t\tlast_char != suffix &&\n\t\t\t\tlast_char != BLOCK_START_LAST_CHAR &&\n\t\t\t\tlast_char != BLOCK_END_LAST_CHAR &&\n\t\t\t\t!lineIsEmpty &&\n\t\t\t\t!lineIsComment\n\t\t\t) {\n\t\t\t\tline += suffix;\n\t\t\t}\n\t\t}\n\t\treturn line;\n\t}\n\tstatic post_line_separator(lineType: LineType) {\n\t\treturn lineType == LineType.BODY ? '\t' : '';\n\t}\n\n\tstatic nodeDistanceToMaterial(node: BaseNodeType): number {\n\t\tconst parent = node.parent();\n\t\tif (!parent) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (parent.context() != node.context()) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 1 + this.nodeDistanceToMaterial(parent);\n\t\t\t// we do not have an offset of 1 for subnet_input and subnet_output\n\t\t\t// so that those nodes can control the tabs themselves in setLines()\n\t\t\t// let offset = 1;\n\t\t\t// if (node.type() == NetworkChildNodeType.INPUT || node.type() == NetworkChildNodeType.OUTPUT) {\n\t\t\t// \toffset = 0;\n\t\t\t// }\n\t\t\t// return offset + this.node_distance_to_material(parent);\n\t\t}\n\t}\n}\n","import {BaseJsNodeType} from '../../_Base';\nimport {TypedNodeTraverser} from '../../../utils/shaders/NodeTraverser';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {JsFunctionName} from '../../../utils/shaders/ShaderName';\nimport {JsDefinitionType, BaseJsDefinition, JsDefinitionTypeMap, TypedJsDefinition} from '../../utils/JsDefinition';\nimport {TypedJsDefinitionCollection} from '../../utils/JsDefinitionCollection';\nimport {ParamConfigsController} from '../../../../nodes/utils/code/controllers/ParamConfigsController';\nimport {JsLinesCollectionController} from './JsLinesCollectionController';\nimport {CodeFormatter} from './CodeFormatter';\nimport {LineType} from './LineType';\nimport {JsParamConfig} from './JsParamConfig';\nimport {ParamType} from '../../../../poly/ParamType';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {CoreGraphNodeId} from '../../../../../core/graph/CoreGraph';\nimport {arrayUniq} from '../../../../../core/ArrayUtils';\nimport {BaseJsShaderAssembler} from '../assemblers/_Base';\n// import {sanitizeName} from '../../../../../core/String';\nimport {triggerableMethodCalls} from '../assemblers/actor/ActorAssemblerUtils';\nimport {setToArray} from '../../../../../core/SetUtils';\nimport {ActorBuilderNode} from '../../../../scene/utils/ActorsManager';\nimport {JsType} from '../../../../poly/registers/nodes/types/Js';\nimport {CodeJsNode} from '../../Code';\n// import {connectedTriggerableNodes} from '../assemblers/actor/ActorAssemblerUtils';\n\ntype RootNodesForJsFunctionMethod = (shader_name: JsFunctionName, rootNodes: BaseJsNodeType[]) => BaseJsNodeType[];\n// let nextId = 1;\n\nexport interface CodeBuilderSetCodeLinesOptions {\n\totherFragmentShaderCollectionController?: JsLinesCollectionController;\n\tactor: {\n\t\ttriggeringNodes: Set<BaseJsNodeType>;\n\t\ttriggerableNodes: Set<BaseJsNodeType>;\n\t\tfunctionNode: ActorBuilderNode;\n\t\t// triggerNodesByType: Map<string, Set<BaseJsNodeType>>;\n\t};\n}\n\nexport class JsCodeBuilder {\n\t// private _id = (nextId += 1);\n\tprivate _param_configs_controller: ParamConfigsController<JsParamConfig<ParamType>> = new ParamConfigsController();\n\tprivate _param_configs_set_allowed: boolean = true;\n\n\tprivate _shadersCollectionController: JsLinesCollectionController | undefined;\n\tprivate _lines: Map<JsFunctionName, Map<LineType, string[]>> = new Map();\n\t// _function_declared: Map<ShaderName, Map<string, boolean>> = new Map();\n\n\tconstructor(\n\t\tprivate _nodeTraverser: TypedNodeTraverser<NodeContext.JS>,\n\t\tprivate _rootNodesByShaderName: RootNodesForJsFunctionMethod,\n\t\tprivate _assembler: BaseJsShaderAssembler\n\t) {}\n\tnodeTraverser() {\n\t\treturn this._nodeTraverser;\n\t}\n\tshaderNames() {\n\t\treturn this._nodeTraverser.shaderNames();\n\t}\n\tbuildFromNodes(\n\t\trootNodes: BaseJsNodeType[],\n\t\tparamNodes: BaseJsNodeType[],\n\t\tsetCodeLinesOptions?: CodeBuilderSetCodeLinesOptions\n\t) {\n\t\tthis._nodeTraverser.traverse(rootNodes);\n\n\t\tconst nodesByShaderName: Map<JsFunctionName, BaseJsNodeType[]> = new Map();\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst nodes = this._nodeTraverser.nodesForShaderName(shaderName);\n\t\t\tnodesByShaderName.set(shaderName, nodes);\n\t\t}\n\t\tconst sortedNodes = this._nodeTraverser.sortedNodes();\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst rootNodesForShader = this._rootNodesByShaderName(shaderName, rootNodes);\n\n\t\t\tfor (const rootNode of rootNodesForShader) {\n\t\t\t\tpushOnArrayAtEntry(nodesByShaderName, shaderName, rootNode);\n\t\t\t}\n\t\t}\n\n\t\t// ensure nodes are not added if already present\n\t\tconst sorted_node_ids: Map<CoreGraphNodeId, boolean> = new Map();\n\t\tfor (const node of sortedNodes) {\n\t\t\tsorted_node_ids.set(node.graphNodeId(), true);\n\t\t}\n\n\t\tfor (const rootNode of rootNodes) {\n\t\t\tif (!sorted_node_ids.get(rootNode.graphNodeId())) {\n\t\t\t\tsortedNodes.push(rootNode);\n\t\t\t\tsorted_node_ids.set(rootNode.graphNodeId(), true);\n\t\t\t}\n\t\t}\n\t\tfor (const node of sortedNodes) {\n\t\t\tnode.reset_code();\n\t\t}\n\t\tfor (const node of paramNodes) {\n\t\t\tnode.reset_code();\n\t\t}\n\n\t\t// compile code nodes\n\t\t// compiling code nodes here cannot work,\n\t\t// as this may recreate new connections on the node,\n\t\t// which will in turn retrigger this function,\n\t\t// which easily becomes an infinite loop\n\t\tconst nodesToBeComputed = [...sortedNodes];\n\t\tif (setCodeLinesOptions?.actor) {\n\t\t\tconst {triggeringNodes, triggerableNodes} = setCodeLinesOptions.actor;\n\t\t\tnodesToBeComputed.push(...triggeringNodes, ...triggerableNodes);\n\t\t}\n\t\tconst codeNodes = nodesToBeComputed.filter((n) => n.type() == JsType.CODE) as CodeJsNode[];\n\t\tfor (const node of codeNodes) {\n\t\t\tif (!node.compiled()) {\n\t\t\t\t// try {\n\t\t\t\t// node.functionNode()?.dirtyController.setForbiddenTriggerNodes([node]);\n\t\t\t\tconst functionNode = node.functionNode();\n\t\t\t\tif (functionNode) {\n\t\t\t\t\tnode.setForbiddenTriggerNodes(functionNode);\n\t\t\t\t}\n\t\t\t\tnode.compile({triggerFunctionNode: false});\n\t\t\t\tnode.clearForbiddenTriggerNodes();\n\t\t\t\t// node.functionNode()?.dirtyController.setForbiddenTriggerNodes([]);\n\t\t\t\tif (node.states.error.active() || !node.compiled()) {\n\t\t\t\t\tconst message = `failed to generated code (see node ${node.path()})`;\n\t\t\t\t\t// node.functionNode()?.states.error.set(message);\n\t\t\t\t\t// this._setCodeLines([], setCodeLinesOptions);\n\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t// return;\n\t\t\t\t} // else {\n\t\t\t\t//\tconsole.log('OK');\n\t\t\t\t//}\n\t\t\t\t// } catch (err) {\n\t\t\t\t// \tconsole.log('NOT OK', node.path(), node.states.error.active());\n\t\t\t\t// \tnode.states.error.set(`failed to generated code`);\n\t\t\t\t// \tnode.functionNode()?.states.error.set(`node ${node.path()} failed to generated code`);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\n\t\t// const param_promises = sorted_nodes.map(node=>{\n\t\t// \treturn node.eval_all_params()\n\t\t// })\n\t\t// await Promise.all(param_promises)\n\n\t\tthis._shadersCollectionController = new JsLinesCollectionController(\n\t\t\tthis.shaderNames(),\n\t\t\tthis.shaderNames()[0],\n\t\t\tthis._assembler\n\t\t);\n\n\t\tthis.reset();\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tlet notUniqNodes = nodesByShaderName.get(shaderName) || [];\n\t\t\tconst nodes: BaseJsNodeType[] = [];\n\t\t\tarrayUniq(notUniqNodes, nodes);\n\t\t\tthis._shadersCollectionController.setCurrentShaderName(shaderName);\n\t\t\tif (nodes) {\n\t\t\t\tfor (const node of nodes) {\n\t\t\t\t\tnode.setLines(this._shadersCollectionController);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (setCodeLinesOptions?.actor) {\n\t\t\t\tconst {triggeringNodes, triggerableNodes} = setCodeLinesOptions.actor;\n\t\t\t\t// triggering nodes\n\t\t\t\tfor (const triggeringNode of triggeringNodes) {\n\t\t\t\t\t// const currentTriggerableNodes = new Set<BaseJsNodeType>();\n\t\t\t\t\t// connectedTriggerableNodes({\n\t\t\t\t\t// \ttriggeringNodes: new Set([triggeringNode]),\n\t\t\t\t\t// \ttriggerableNodes: currentTriggerableNodes,\n\t\t\t\t\t// \trecursive: false,\n\t\t\t\t\t// });\n\t\t\t\t\t// const triggerableMethodNames = setToArray(currentTriggerableNodes).map((n) =>\n\t\t\t\t\t// \tnodeMethodName(n)\n\t\t\t\t\t// );\n\t\t\t\t\t// const triggerableMethodCalls = triggerableMethodNames\n\t\t\t\t\t// \t.map((methodName) => `this.${methodName}(${0})`)\n\t\t\t\t\t// \t.join('\\n');\n\t\t\t\t\tconst _triggerableMethodCalls = triggerableMethodCalls(triggeringNode);\n\t\t\t\t\ttriggeringNode.setTriggeringLines(this._shadersCollectionController, _triggerableMethodCalls);\n\t\t\t\t}\n\t\t\t\t// triggerable nodes\n\t\t\t\tfor (const triggerableNode of triggerableNodes) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttriggerableNode.setTriggerableLines(this._shadersCollectionController);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\ttriggerableNode.states.error.set(`failed to generate code`);\n\t\t\t\t\t\tthrow new Error(`node ${triggerableNode.path()} failed to generated code`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//\n\t\t\t//\n\t\t\t// create triggerable methods\n\t\t\t//\n\t\t\t//\n\t\t\t// if (setCodeLinesOptions) {\n\t\t\t// \tconst shadersCollectionController = this._shadersCollectionController;\n\t\t\t// \tshadersCollectionController.withAllowActionLines(() => {\n\t\t\t// \t\tconst {functionNode, triggerNodesByType} = setCodeLinesOptions;\n\t\t\t// \t\tconst nodeMethodName = (node: BaseJsNodeType) =>\n\t\t\t// \t\t\tsanitizeName(node.path().replace(functionNode.path(), ''));\n\n\t\t\t// \t\t// const triggerableFunctionLines: string[] = [];\n\t\t\t// \t\ttriggerNodesByType.forEach((triggerNodes, nodeType) => {\n\t\t\t// \t\t\tconst triggerableNodes: Set<BaseJsNodeType> = new Set();\n\t\t\t// \t\t\tconnectedTriggerableNodes({triggerNodes, triggerableNodes, recursive: true});\n\t\t\t// \t\t\tfor (let node of triggerableNodes) {\n\t\t\t// \t\t\t\t// const shadersCollectionController = new ShadersCollectionController(\n\t\t\t// \t\t\t\t// \tthis.shaderNames(),\n\t\t\t// \t\t\t\t// \tthis.shaderNames()[0],\n\t\t\t// \t\t\t\t// \tthis\n\t\t\t// \t\t\t\t// );\n\t\t\t// \t\t\t\t// shadersCollectionController.setAllowActionLines(true);\n\t\t\t// \t\t\t\tnode.setLines(shadersCollectionController);\n\t\t\t// \t\t\t\tconst bodyLines = shadersCollectionController.bodyLines(ShaderName.FRAGMENT, node);\n\t\t\t// \t\t\t\tconsole.log(bodyLines);\n\t\t\t// \t\t\t\tif (bodyLines) {\n\t\t\t// \t\t\t\t\tconst methodName = nodeMethodName(node);\n\t\t\t// \t\t\t\t\tconst wrappedLines = `${methodName}(){\n\t\t\t// \t${bodyLines.join('\\n')}\n\t\t\t// }`;\n\t\t\t// \t\t\t\t\t// triggerableFunctionLines.push(wrappedLines);\n\t\t\t// \t\t\t\t\tconsole.log({wrappedLines});\n\t\t\t// \t\t\t\t\tshadersCollectionController._addBodyLines(node, [wrappedLines], shaderName);\n\t\t\t// \t\t\t\t}\n\t\t\t// \t\t\t}\n\t\t\t// \t\t});\n\t\t\t// \t});\n\t\t\t// }\n\n\t\t\t// trigger node lines\n\t\t\t// const triggerNodes = setCodeLinesOptions?.actor.triggerNodes;\n\t\t\t// if (triggerNodes) {\n\t\t\t// \tfor (let triggerNode of triggerNodes) {\n\t\t\t// \t\ttriggerNode.addConstructorInitFunctionLines(this._shadersCollectionController);\n\t\t\t// \t}\n\t\t\t// }\n\t\t}\n\n\t\t// set param configs\n\t\tif (this._param_configs_set_allowed) {\n\t\t\tfor (const param_node of paramNodes) {\n\t\t\t\ttry {\n\t\t\t\t\tparam_node.states.error.clear();\n\t\t\t\t\tparam_node.setParamConfigs();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message: string = (err as any).message || 'failed to create spare param';\n\t\t\t\t\tparam_node.states.error.set(message);\n\t\t\t\t\tthrow new Error(`${param_node.name()} cannot create spare parameter`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.setParamConfigs(paramNodes);\n\t\t}\n\n\t\t// finalize\n\t\tthis._setCodeLines(sortedNodes, setCodeLinesOptions);\n\t}\n\n\tshadersCollectionController() {\n\t\treturn this._shadersCollectionController;\n\t}\n\n\tdisallow_new_param_configs() {\n\t\tthis._param_configs_set_allowed = false;\n\t}\n\tallow_new_param_configs() {\n\t\tthis._param_configs_set_allowed = true;\n\t}\n\n\tprivate reset() {\n\t\tfor (let shader_name of this.shaderNames()) {\n\t\t\tconst lines_map = new Map();\n\t\t\t// for (let line_type of LINE_TYPES) {\n\t\t\t// \tlines_map.set(line_type, []);\n\t\t\t// }\n\t\t\tthis._lines.set(shader_name, lines_map);\n\t\t\t// this._function_declared.set(shader_name, new Map());\n\t\t}\n\t}\n\n\tparam_configs() {\n\t\treturn this._param_configs_controller.list() || [];\n\t}\n\tlines(shader_name: JsFunctionName, line_type: LineType) {\n\t\treturn this._lines.get(shader_name)?.get(line_type) || [];\n\t}\n\tall_lines() {\n\t\treturn this._lines;\n\t}\n\n\tsetParamConfigs(nodes: BaseJsNodeType[]) {\n\t\tthis._param_configs_controller.reset();\n\t\tfor (const node of nodes) {\n\t\t\tconst param_configs = node.param_configs();\n\t\t\tif (param_configs) {\n\t\t\t\tfor (const param_config of param_configs) {\n\t\t\t\t\tthis._param_configs_controller.push(param_config);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _setCodeLines(nodes: BaseJsNodeType[], options?: CodeBuilderSetCodeLinesOptions) {\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tconst additionalDefinitions: BaseJsDefinition[] = [];\n\t\t\t// if (shaderName == JsFunctionName.MAIN) {\n\t\t\tif (this._shadersCollectionController && options && options.otherFragmentShaderCollectionController) {\n\t\t\t\t// for (const shaderName of options.otherShadersCollectionController.shaderNames()) {\n\t\t\t\t// this._linesControllerByShaderName.set(shaderName, new LinesController(shaderName));\n\t\t\t\toptions.otherFragmentShaderCollectionController.traverseDefinitions(\n\t\t\t\t\tshaderName,\n\t\t\t\t\t(definition: BaseJsDefinition) => {\n\t\t\t\t\t\tadditionalDefinitions.push(definition);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t// }\n\t\t\t}\n\t\t\t// }\n\n\t\t\tthis._addCodeLines(nodes, shaderName, additionalDefinitions, options);\n\t\t}\n\t}\n\n\tprivate _addCodeLines(\n\t\tnodes: BaseJsNodeType[],\n\t\tshaderName: JsFunctionName,\n\t\tadditionalDefinitions?: BaseJsDefinition[],\n\t\toptions?: CodeBuilderSetCodeLinesOptions\n\t) {\n\t\t// this.addDefinitions(nodes, shaderName, JsDefinitionType.PRECISION, LineType.DEFINE, additionalDefinitions);\n\t\t// this.addDefinitions(\n\t\t// \tnodes,\n\t\t// \tshaderName,\n\t\t// \tJsDefinitionType.FUNCTION,\n\t\t// \tLineType.FUNCTION_DECLARATION,\n\t\t// \tadditionalDefinitions\n\t\t// );\n\t\t// this.addDefinitions(nodes, shaderName, JsDefinitionType.UNIFORM, LineType.DEFINE, additionalDefinitions);\n\t\t// this.addDefinitions(nodes, shaderName, JsDefinitionType.VARYING, LineType.DEFINE, additionalDefinitions);\n\t\t// this.addDefinitions(nodes, shaderName, JsDefinitionType.ATTRIBUTE, LineType.DEFINE, additionalDefinitions);\n\t\t// this.addDefinitions(nodes, shaderName, JsDefinitionType.INIT, LineType.DEFINE, additionalDefinitions);\n\t\tconst allNodes =\n\t\t\toptions && options.actor\n\t\t\t\t? nodes\n\t\t\t\t\t\t.concat(setToArray(options.actor.triggeringNodes, []))\n\t\t\t\t\t\t.concat(setToArray(options.actor.triggerableNodes, []))\n\t\t\t\t: nodes;\n\n\t\tthis.addDefinitions(nodes, shaderName, JsDefinitionType.LOCAL_FUNCTION, LineType.DEFINE, additionalDefinitions);\n\t\tthis.addDefinitions(allNodes, shaderName, JsDefinitionType.COMPUTED, LineType.MEMBER, additionalDefinitions);\n\t\tthis.addDefinitions(nodes, shaderName, JsDefinitionType.CONSTANT, LineType.MEMBER, additionalDefinitions);\n\t\tthis.addDefinitions(allNodes, shaderName, JsDefinitionType.REF, LineType.MEMBER, additionalDefinitions);\n\n\t\t// console.log(\n\t\t// \t'triggerNodes',\n\t\t// \toptions?.triggerNodes?.map((n) => n.name())\n\t\t// );\n\n\t\t// const initFunctionNodes = nodes.concat(options?.actor.triggerNodes || []);\n\t\tthis.addDefinitions(\n\t\t\tallNodes,\n\t\t\tshaderName,\n\t\t\tJsDefinitionType.INIT_FUNCTION,\n\t\t\tLineType.CONSTRUCTOR,\n\t\t\tadditionalDefinitions\n\t\t);\n\t\tthis.addDefinitions(allNodes, shaderName, JsDefinitionType.WATCH, LineType.CONSTRUCTOR, additionalDefinitions);\n\t\tif (options?.actor.triggeringNodes) {\n\t\t\tthis.addDefinitions(\n\t\t\t\t// we currently add all nodes here,\n\t\t\t\t// so that nodes which have an intersection output\n\t\t\t\t// can have their triggering method added,\n\t\t\t\t// even if only the intersection output is used\n\t\t\t\tallNodes, //setToArray(options.actor.triggeringNodes),\n\t\t\t\tshaderName,\n\t\t\t\tJsDefinitionType.TRIGGERING,\n\t\t\t\tLineType.BODY,\n\t\t\t\tadditionalDefinitions\n\t\t\t);\n\t\t}\n\t\tif (options?.actor.triggerableNodes) {\n\t\t\tthis.addDefinitions(\n\t\t\t\tsetToArray(options.actor.triggerableNodes, []),\n\t\t\t\tshaderName,\n\t\t\t\tJsDefinitionType.TRIGGERABLE,\n\t\t\t\tLineType.BODY,\n\t\t\t\tadditionalDefinitions\n\t\t\t);\n\t\t}\n\n\t\tthis.add_code_line_for_nodes_and_line_type(allNodes, shaderName, LineType.BODY);\n\t}\n\n\tprivate addDefinitions(\n\t\tnodes: BaseJsNodeType[],\n\t\tshaderName: JsFunctionName,\n\t\tdefinitionType: JsDefinitionType,\n\t\tlineType: LineType,\n\t\tadditionalDefinitions?: BaseJsDefinition[]\n\t) {\n\t\tif (!this._shadersCollectionController) {\n\t\t\treturn;\n\t\t}\n\t\tconst definitions: TypedJsDefinition<JsDefinitionType>[] = [];\n\t\tfor (const node of nodes) {\n\t\t\tlet nodeDefinitions = this._shadersCollectionController.definitions(shaderName, node);\n\t\t\tif (nodeDefinitions) {\n\t\t\t\tnodeDefinitions = nodeDefinitions.filter((d) => d.definitionType() == definitionType);\n\t\t\t\tfor (const definition of nodeDefinitions) {\n\t\t\t\t\tdefinitions.push(definition);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (additionalDefinitions) {\n\t\t\tconst filteredAdditionalDefinitions = additionalDefinitions.filter(\n\t\t\t\t(d) => d.definitionType() == definitionType\n\t\t\t);\n\t\t\tfor (const definition of filteredAdditionalDefinitions) {\n\t\t\t\tdefinitions.push(definition);\n\t\t\t}\n\t\t}\n\t\tif (definitions.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst collection = new TypedJsDefinitionCollection<JsDefinitionType>(definitions);\n\t\tconst uniqDefinitions = collection.uniq();\n\t\tif (collection.errored) {\n\t\t\t// TODO: handle error\n\t\t\tthrow `code builder error: ${collection.error_message}`;\n\t\t}\n\n\t\tconst definitions_by_node_id: Map<CoreGraphNodeId, BaseJsDefinition[]> = new Map();\n\t\tconst nodeIds: Map<CoreGraphNodeId, boolean> = new Map();\n\t\tfor (const definition of uniqDefinitions) {\n\t\t\tconst nodeId = definition.node().graphNodeId();\n\t\t\tif (!nodeIds.has(nodeId)) {\n\t\t\t\tnodeIds.set(nodeId, true);\n\t\t\t}\n\t\t\tpushOnArrayAtEntry(definitions_by_node_id, nodeId, definition);\n\t\t}\n\t\tconst lines_for_shader = this._lines.get(shaderName)!;\n\n\t\t// gather\n\t\tconst definitionClass = JsDefinitionTypeMap[definitionType];\n\t\tdefinitionClass.gather(definitions, lines_for_shader, lineType);\n\n\t\t// process definition for each node\n\t\tnodeIds.forEach((_, nodeId) => {\n\t\t\tconst definitions = definitions_by_node_id.get(nodeId);\n\t\t\tif (definitions) {\n\t\t\t\tconst first_definition = definitions[0];\n\n\t\t\t\tif (first_definition) {\n\t\t\t\t\tconst comment = CodeFormatter.nodeComment(first_definition.node(), lineType);\n\t\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, comment);\n\n\t\t\t\t\tfor (const definition of definitions) {\n\t\t\t\t\t\tconst line = CodeFormatter.lineWrap(first_definition.node(), definition.line(), lineType);\n\t\t\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, line);\n\t\t\t\t\t}\n\t\t\t\t\tconst separator = CodeFormatter.post_line_separator(lineType);\n\t\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, separator);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tadd_code_line_for_nodes_and_line_type(nodes: BaseJsNodeType[], shaderName: JsFunctionName, lineType: LineType) {\n\t\tnodes = nodes.filter((node) => {\n\t\t\tif (this._shadersCollectionController) {\n\t\t\t\tconst lines = this._shadersCollectionController.bodyLines(shaderName, node);\n\t\t\t\treturn lines && lines.length > 0;\n\t\t\t}\n\t\t});\n\n\t\tvar nodesCount = nodes.length;\n\t\tfor (let i = 0; i < nodesCount; i++) {\n\t\t\tconst isLast = i == nodes.length - 1;\n\t\t\tthis.add_code_line_for_node_and_line_type(nodes[i], shaderName, lineType, isLast);\n\t\t}\n\t}\n\tadd_code_line_for_node_and_line_type(\n\t\tnode: BaseJsNodeType,\n\t\tshaderName: JsFunctionName,\n\t\tlineType: LineType,\n\t\tisLast: boolean\n\t): void {\n\t\tif (!this._shadersCollectionController) {\n\t\t\treturn;\n\t\t}\n\t\tconst lines = this._shadersCollectionController.bodyLines(shaderName, node);\n\n\t\tif (lines && lines.length > 0) {\n\t\t\tconst lines_for_shader = this._lines.get(shaderName)!;\n\t\t\tconst comment = CodeFormatter.nodeComment(node, lineType);\n\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, comment);\n\t\t\tlines.forEach((line) => {\n\t\t\t\tline = CodeFormatter.lineWrap(node, line, lineType);\n\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, line);\n\t\t\t});\n\t\t\tif (!(lineType == LineType.BODY && isLast)) {\n\t\t\t\tconst separator = CodeFormatter.post_line_separator(lineType);\n\t\t\t\tpushOnArrayAtEntry(lines_for_shader, lineType, separator);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {JsFunctionName} from '../../../utils/shaders/ShaderName';\nimport {BaseJsDefinition} from '../../utils/JsDefinition';\nimport {BaseJsNodeType} from '../../_Base';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {CoreGraphNodeId} from '../../../../../core/graph/CoreGraph';\n\nexport type DefinitionTraverseCallback = (definition: BaseJsDefinition) => void;\n// export type BodyLinesTraverseCallback = (lines: string[]) => void;\n\nexport interface AddBodyLinesOptions {\n\tmakeUniq: boolean;\n}\nexport class JsLinesController {\n\tprivate _definitionsByNodeId: Map<CoreGraphNodeId, BaseJsDefinition[]> = new Map();\n\tprivate _bodyLinesByNodeId: Map<CoreGraphNodeId, string[]> = new Map();\n\n\tconstructor(private _shader_name: JsFunctionName) {}\n\n\tget shader_name() {\n\t\treturn this._shader_name;\n\t}\n\n\taddDefinitions(node: BaseJsNodeType, definitions: BaseJsDefinition[]) {\n\t\tthis._addDefinitionsForNodeId(node.graphNodeId(), definitions);\n\t}\n\tprivate _addDefinitionsForNodeId(nodeId: CoreGraphNodeId, definitions: BaseJsDefinition[]) {\n\t\tfor (const definition of definitions) {\n\t\t\tpushOnArrayAtEntry(this._definitionsByNodeId, nodeId, definition);\n\t\t}\n\t}\n\tdefinitions(node: BaseJsNodeType): BaseJsDefinition[] | undefined {\n\t\treturn this._definitionsByNodeId.get(node.graphNodeId());\n\t}\n\ttraverseDefinitions(callback: DefinitionTraverseCallback) {\n\t\tthis._definitionsByNodeId.forEach((definitions) => {\n\t\t\tfor (const definition of definitions) {\n\t\t\t\tcallback(definition);\n\t\t\t}\n\t\t});\n\t}\n\t// all_definition_nodes(scene: PolyScene) {\n\t// \tconst nodes: BaseGlNodeType[] = [];\n\t// \tthis._definitions_by_node_id.forEach((lines, node_id) => {\n\t// \t\tconst node = scene.graph.node_from_id(node_id) as BaseGlNodeType;\n\t// \t\tnodes.push(node);\n\t// \t});\n\t// \treturn nodes;\n\t// }\n\n\taddBodyLines(node: BaseJsNodeType, lines: string[], options?: AddBodyLinesOptions) {\n\t\tthis._addBodyLinesForNodeId(node.graphNodeId(), lines);\n\t}\n\tprivate _addBodyLinesForNodeId(nodeId: CoreGraphNodeId, lines: string[], options?: AddBodyLinesOptions) {\n\t\tlet makeUniq = true;\n\t\tif (options && options.makeUniq != null) {\n\t\t\tmakeUniq = options.makeUniq;\n\t\t}\n\n\t\tconst linesToUsed: string[] = [];\n\t\tif (makeUniq) {\n\t\t\tconst currentLines = this._bodyLinesByNodeId.get(nodeId);\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (currentLines) {\n\t\t\t\t\tif (!currentLines.includes(line)) {\n\t\t\t\t\t\tlinesToUsed.push(line);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlinesToUsed.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const line of lines) {\n\t\t\t\tlinesToUsed.push(line);\n\t\t\t}\n\t\t}\n\n\t\tfor (const line of linesToUsed) {\n\t\t\tpushOnArrayAtEntry(this._bodyLinesByNodeId, nodeId, line);\n\t\t}\n\t}\n\tbodyLines(node: BaseJsNodeType): string[] | undefined {\n\t\treturn this._bodyLinesByNodeId.get(node.graphNodeId());\n\t}\n\t// traverseBodyLines(callback: BodyLinesTraverseCallback) {\n\t// \tthis._bodyLinesByNodeId.forEach((lines) => {\n\t// \t\tcallback(lines);\n\t// \t});\n\t// }\n\t// all_body_line_nodes(scene: PolyScene) {\n\t// \tconst nodes: BaseGlNodeType[] = [];\n\t// \tthis._body_lines_by_node_id.forEach((lines, node_id) => {\n\t// \t\tconst node = scene.graph.node_from_id(node_id) as BaseGlNodeType;\n\t// \t\tnodes.push(node);\n\t// \t});\n\t// \treturn nodes;\n\t// }\n}\n","import {JsFunctionName} from '../../../utils/shaders/ShaderName';\nimport {\n\tBaseJsDefinition,\n\tComputedValueJsDefinition,\n\tTriggerableJsDefinition,\n\tTriggerableJsDefinitionOptions,\n\tTriggeringJsDefinition,\n} from '../../utils/JsDefinition';\nimport {JsLinesController, DefinitionTraverseCallback, AddBodyLinesOptions} from './LinesController';\nimport {BaseJsNodeType} from '../../_Base';\nimport {BaseJsShaderAssembler} from '../assemblers/_Base';\nimport {RegisterableVariable} from '../assemblers/_BaseJsPersistedConfigUtils';\nimport {JsConnectionPointType} from '../../../utils/io/connections/Js';\nimport {BaseNamedFunction} from '../../../../functions/_Base';\nimport {nodeMethodName, triggerableMethodCalls} from '../assemblers/actor/ActorAssemblerUtils';\nimport {EvaluatorMethodName} from '../assemblers/actor/ActorEvaluator';\n\nexport interface ComputedValueJsDefinitionData {\n\tdataType: JsConnectionPointType;\n\tvarName: string;\n\tvalue: string;\n}\ninterface TriggeringJsDefinitionOptionsExtended {\n\tgatherable: boolean;\n\ttriggeringMethodName?: EvaluatorMethodName;\n\tnodeMethodName?: string;\n}\ninterface TriggerableJsDefinitionOptionsExtended extends TriggerableJsDefinitionOptions {\n\taddTriggeredLines?: boolean;\n}\ninterface AddBodyOrComputedOptions {\n\tconstPrefix?: boolean;\n}\n\nexport class JsLinesCollectionController {\n\tprivate _linesControllerByShaderName: Map<JsFunctionName, JsLinesController> = new Map();\n\n\tconstructor(\n\t\tprivate _shaderNames: JsFunctionName[],\n\t\tprivate _currentShaderName: JsFunctionName,\n\t\tprivate _assembler: BaseJsShaderAssembler\n\t) {\n\t\tfor (const shaderName of this._shaderNames) {\n\t\t\tthis._linesControllerByShaderName.set(shaderName, new JsLinesController(shaderName));\n\t\t}\n\t}\n\n\t// private _allowActionLines = false;\n\t// withAllowActionLines(callback: () => void) {\n\t// \tthis._allowActionLines = true;\n\t// \tcallback();\n\t// \tthis._allowActionLines = false;\n\t// }\n\n\t// mergeDefinitions(shadersCollectionController: ShadersCollectionController) {\n\t// \tfor (let shaderName of this._shaderNames) {\n\t// \t\t// this._linesControllerByShaderName.set(shaderName, new LinesController(shaderName));\n\t// \t\tshadersCollectionController.traverseDefinitions(shaderName, (definition: BaseGLDefinition) => {\n\t// \t\t\tthis.addDefinitions(definition.node, [definition], shaderName);\n\t// \t\t\tconsole.log('add', definition.node, definition);\n\t// \t\t});\n\t// \t}\n\t// }\n\n\tassembler() {\n\t\treturn this._assembler;\n\t}\n\n\tlinesController(shaderName: JsFunctionName) {\n\t\treturn this._linesControllerByShaderName.get(shaderName);\n\t}\n\n\tshaderNames() {\n\t\treturn this._shaderNames;\n\t}\n\n\tsetCurrentShaderName(shaderName: JsFunctionName) {\n\t\tthis._currentShaderName = shaderName;\n\t}\n\tcurrentShaderName() {\n\t\treturn this._currentShaderName;\n\t}\n\t//\n\t//\n\t// REGISTERED VARIABLES\n\t//\n\t//\n\taddVariable(node: BaseJsNodeType, variable: RegisterableVariable, varName?: string) {\n\t\treturn this.assembler().addVariable(node, variable, varName);\n\t}\n\t//\n\t//\n\t// REGISTERED FUNCTIONS\n\t//\n\t//\n\taddFunction(node: BaseJsNodeType, namedFunction: BaseNamedFunction) {\n\t\treturn this.assembler().addFunction(node, namedFunction);\n\t}\n\taddTriggeringLines(\n\t\tnode: BaseJsNodeType,\n\t\ttriggeringLines: string[],\n\t\toptions: TriggeringJsDefinitionOptionsExtended\n\t) {\n\t\tconst gatherable = options?.gatherable != null ? options.gatherable : false;\n\t\tconst triggeringMethodName =\n\t\t\toptions?.triggeringMethodName != null ? options.triggeringMethodName : (node.type() as EvaluatorMethodName);\n\n\t\tconst value = triggeringLines.join('\\n');\n\t\tconst varName = options.nodeMethodName || nodeMethodName(node); //.wrappedBodyLinesMethodName();\n\t\tconst dataType = JsConnectionPointType.BOOLEAN; // unused\n\t\t// if (!EVALUATOR_METHOD_NAMES.includes(triggeringMethodName as EvaluatorMethodName)) {\n\t\t// \tconsole.warn(`method '${triggeringMethodName}' is not included`);\n\t\t// }\n\t\tthis.addDefinitions(node, [\n\t\t\tnew TriggeringJsDefinition(node, this, dataType, varName, value, {\n\t\t\t\ttriggeringMethodName,\n\t\t\t\tgatherable,\n\t\t\t\tperPoint: this._assembler.perPoint(),\n\t\t\t\tnodeMethodName: options.nodeMethodName,\n\t\t\t}),\n\t\t]);\n\t}\n\taddTriggerableLines(\n\t\tnode: BaseJsNodeType,\n\t\ttriggerableLines: string[],\n\t\toptions?: TriggerableJsDefinitionOptionsExtended\n\t) {\n\t\tconst addTriggeredLines = options?.addTriggeredLines != null ? options.addTriggeredLines : true;\n\t\tif (addTriggeredLines) {\n\t\t\t// const currentTriggerableNodes = new Set<BaseJsNodeType>();\n\t\t\t// connectedTriggerableNodes({\n\t\t\t// \ttriggeringNodes: new Set([node]),\n\t\t\t// \ttriggerableNodes: currentTriggerableNodes,\n\t\t\t// \trecursive: false,\n\t\t\t// });\n\t\t\t// const triggerableMethodNames = setToArray(currentTriggerableNodes).map((n) => nodeMethodName(n));\n\t\t\t// triggerableLines.push(...triggerableMethodNames.map((m) => `this.${m}()`));\n\t\t\tconst _triggerableMethodCalls = triggerableMethodCalls(node);\n\t\t\ttriggerableLines.push(_triggerableMethodCalls);\n\t\t}\n\n\t\tconst value = triggerableLines.join('\\n');\n\t\tconst varName = node.name();\n\t\tconst dataType = JsConnectionPointType.BOOLEAN; // unused\n\t\tthis.addDefinitions(node, [new TriggerableJsDefinition(node, this, dataType, varName, value, options)]);\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\n\taddComputedVarName(varName: string) {\n\t\tthis._assembler.addComputedVarName(varName);\n\t}\n\tregisteredAsComputed(varName: string): boolean {\n\t\treturn this._assembler.registeredAsComputed(varName);\n\t}\n\taddBodyOrComputed(\n\t\tnode: BaseJsNodeType,\n\t\tlinesData: ComputedValueJsDefinitionData[],\n\t\toptions?: AddBodyOrComputedOptions\n\t) {\n\t\tif (this._assembler.computedVariablesAllowed()) {\n\t\t\tthis.addComputed(node, linesData);\n\t\t} else {\n\t\t\tconst constPrefix = options?.constPrefix != null ? options.constPrefix : true;\n\t\t\tthis._addBodyLines(\n\t\t\t\tnode,\n\t\t\t\tlinesData.map((lineData) => {\n\t\t\t\t\tconst {varName, value} = lineData;\n\t\t\t\t\tconst bodyLine = `${constPrefix ? 'const' : ''} ${varName} = ${value}`;\n\t\t\t\t\treturn bodyLine;\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\taddComputed(node: BaseJsNodeType, linesData: ComputedValueJsDefinitionData[]) {\n\t\tthis.addDefinitions(\n\t\t\tnode,\n\t\t\tlinesData.map((lineData) => {\n\t\t\t\tconst {dataType, varName, value} = lineData;\n\t\t\t\treturn new ComputedValueJsDefinition(node, this, dataType, varName, value);\n\t\t\t})\n\t\t);\n\t}\n\n\taddDefinitions(node: BaseJsNodeType, definitions: BaseJsDefinition[], shaderName?: JsFunctionName) {\n\t\tif (definitions.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tshaderName = shaderName || this._currentShaderName;\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\tlinesController.addDefinitions(node, definitions);\n\t\t}\n\t}\n\tdefinitions(shaderName: JsFunctionName, node: BaseJsNodeType) {\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\treturn linesController.definitions(node);\n\t\t}\n\t}\n\ttraverseDefinitions(shaderName: JsFunctionName, callback: DefinitionTraverseCallback) {\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\tlinesController.traverseDefinitions(callback);\n\t\t}\n\t}\n\t// all_definition_nodes(shader_name: ShaderName, scene: PolyScene) {\n\t// \treturn this._lines_controller_by_shader_name.get(shader_name)?.all_definition_nodes(scene) || [];\n\t// }\n\t// addActionBodyLines(node: BaseJsNodeType, lines: string[]) {\n\t// \t// if (!this._allowActionLines) {\n\t// \t// \treturn;\n\t// \t// }\n\t// \tthis.addBodyLines(node, lines);\n\t// }\n\n\t_addBodyLines(node: BaseJsNodeType, lines: string[], shaderName?: JsFunctionName, options?: AddBodyLinesOptions) {\n\t\tif (lines.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tshaderName = shaderName || this._currentShaderName;\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\tlinesController.addBodyLines(node, lines, options);\n\t\t}\n\t}\n\tbodyLines(shaderName: JsFunctionName, node: BaseJsNodeType) {\n\t\tconst linesController = this._linesControllerByShaderName.get(shaderName);\n\t\tif (linesController) {\n\t\t\treturn linesController.bodyLines(node);\n\t\t}\n\t}\n\t// traverseBodyLines(shaderName: ShaderName, callback: BodyLinesTraverseCallback) {\n\t// \tconst lines_controller = this._linesControllerByShaderName.get(shaderName);\n\t// \tif (lines_controller) {\n\t// \t\treturn lines_controller.traverseBodyLines(callback);\n\t// \t}\n\t// }\n\t// all_body_line_nodes(shader_name: ShaderName, scene: PolyScene) {\n\t// \treturn this._lines_controller_by_shader_name.get(shader_name)?.all_body_line_nodes(scene) || [];\n\t// }\n}\n","// import {IUniform, Color, Vector2, Vector3, Vector4} from 'three';\nimport {ParamType} from '../../../../poly/ParamType';\nimport {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';\n// import {BaseNodeType} from '../../../_Base';\n// import {BaseParamType} from '../../../../params/_Base';\n// import {TypeAssert} from '../../../../poly/Assert';\n// import {RampParam} from '../../../../params/Ramp';\n// import {OperatorPathParam} from '../../../../params/OperatorPath';\nimport {BaseParamConfig} from '../../../utils/code/configs/BaseParamConfig';\nimport {BaseNodeType} from '../../../_Base';\nimport {BaseParamType} from '../../../../params/_Base';\nimport {touchParamRef} from '../../../../../core/reactivity/ParamReactivity';\n// import {NodePathParam} from '../../../../params/NodePath';\n// import {NodeContext} from '../../../../poly/NodeContext';\n\nexport interface JsParamConfigJSON<T extends ParamType> {\n\ttype: T;\n\tname: string;\n\tdefaultValue: ParamInitValuesTypeMap[T];\n\tuniformName: string;\n}\nexport class JsParamConfig<T extends ParamType> extends BaseParamConfig<T> {\n\t// private _uniform: IUniform | undefined;\n\n\tconstructor(_type: T, _name: string, _defaultValue: ParamInitValuesTypeMap[T], private _uniformName: string) {\n\t\tsuper(_type, _name, _defaultValue);\n\t}\n\n\ttoJSON(): JsParamConfigJSON<T> {\n\t\treturn {\n\t\t\ttype: this._type,\n\t\t\tname: this._name,\n\t\t\tdefaultValue: this._defaultValue,\n\t\t\tuniformName: this._uniformName,\n\t\t};\n\t}\n\tstatic fromJSON(json: JsParamConfigJSON<ParamType>): JsParamConfig<ParamType> {\n\t\treturn new JsParamConfig(json.type, json.name, json.defaultValue, json.uniformName);\n\t}\n\n\tuniformName() {\n\t\treturn this._uniformName;\n\t}\n\n\t// override applyToNode(node: BaseNodeType) {\n\t// \tconsole.warn('not needed in js context');\n\t// }\n\n\t// uniform() {\n\t// \treturn (this._uniform = this._uniform || this._createUniform());\n\t// }\n\n\t// private _createUniform() {\n\t// \treturn JsParamConfig.uniformByType(this._type);\n\t// }\n\n\tprotected override _callback(node: BaseNodeType, param: BaseParamType) {\n\t\tJsParamConfig.callback(node, param.name());\n\t\t// switch (param.type) {\n\t\t// \tcase ParamType.RAMP:\n\t\t// \t\tthis.uniform.value = (param as RampParam).rampTexture();\n\t\t// \t\treturn;\n\t\t// \tcase ParamType.OPERATOR_PATH:\n\t\t// \t\tGlParamConfig.set_uniform_value_from_texture(param as OperatorPathParam, this.uniform);\n\t\t// \t\treturn;\n\t\t// \tdefault:\n\t\t// \t\tthis.uniform.value = param.value;\n\t\t// }\n\t}\n\n\tstatic callback(node: BaseNodeType, paramName: string) {\n\t\ttouchParamRef(node, paramName);\n\t\t// switch (param.type()) {\n\t\t// \tcase ParamType.RAMP:\n\t\t// \t\tuniform.value = (param as RampParam).rampTexture();\n\t\t// \t\treturn;\n\t\t// \t// case ParamType.OPERATOR_PATH:\n\t\t// \t// \tGlParamConfig.set_uniform_value_from_texture(param as OperatorPathParam, uniform);\n\t\t// \t// \treturn;\n\t\t// \tcase ParamType.NODE_PATH:\n\t\t// \t\t// JsParamConfig.setUniformValueFromTextureFromNodePathParam(param as NodePathParam, uniform);\n\t\t// \t\treturn;\n\t\t// \tdefault:\n\t\t// \t\tuniform.value = param.value;\n\t\t// }\n\t}\n\n\t// TODO: refactor that to use the default values map?\n\t// static uniformByType(type: ParamType): IUniform {\n\t// \tswitch (type) {\n\t// \t\tcase ParamType.BOOLEAN:\n\t// \t\t\treturn {value: 0};\n\t// \t\tcase ParamType.BUTTON:\n\t// \t\t\treturn {value: 0};\n\t// \t\tcase ParamType.COLOR:\n\t// \t\t\treturn {value: new Color(0, 0, 0)};\n\t// \t\tcase ParamType.FLOAT:\n\t// \t\t\treturn {value: 0};\n\t// \t\tcase ParamType.FOLDER:\n\t// \t\t\treturn {value: 0};\n\t// \t\tcase ParamType.INTEGER:\n\t// \t\t\treturn {value: 0};\n\t// \t\t// case ParamType.OPERATOR_PATH:\n\t// \t\t// \treturn {value: 0};\n\t// \t\tcase ParamType.NODE_PATH:\n\t// \t\t\treturn {value: 0};\n\t// \t\tcase ParamType.PARAM_PATH:\n\t// \t\t\treturn {value: 0};\n\t// \t\t// case ParamType.STRING: return {type: 't', value: null} // new Texture()}\n\t// \t\tcase ParamType.RAMP:\n\t// \t\t\treturn {value: null}; // new Texture()}\n\t// \t\tcase ParamType.STRING:\n\t// \t\t\treturn {value: null};\n\t// \t\tcase ParamType.VECTOR2:\n\t// \t\t\treturn {value: new Vector2(0, 0)};\n\t// \t\tcase ParamType.VECTOR3:\n\t// \t\t\treturn {value: new Vector3(0, 0, 0)};\n\t// \t\tcase ParamType.VECTOR4:\n\t// \t\t\treturn {value: new Vector4(0, 0, 0, 0)};\n\t// \t}\n\t// \tTypeAssert.unreachable(type);\n\t// }\n\n\t// private static set_uniform_value_from_texture(param: OperatorPathParam, uniform: IUniform) {\n\t// \tconst found_node = param.found_node();\n\t// \tif (found_node) {\n\t// \t\tif (found_node.isDirty()) {\n\t// \t\t\tfound_node.compute().then((container) => {\n\t// \t\t\t\tconst texture = container.texture();\n\t// \t\t\t\tuniform.value = texture;\n\t// \t\t\t});\n\t// \t\t} else {\n\t// \t\t\tconst container = found_node.containerController.container();\n\t// \t\t\tconst texture = container.texture();\n\t// \t\t\tuniform.value = texture;\n\t// \t\t}\n\t// \t} else {\n\t// \t\tuniform.value = null;\n\t// \t}\n\t// }\n\t// private static async setUniformValueFromTextureFromNodePathParam(param: NodePathParam, uniform: IUniform) {\n\t// \tif (param.isDirty()) {\n\t// \t\tawait param.compute();\n\t// \t}\n\t// \tconst node = param.value.nodeWithContext(NodeContext.COP);\n\t// \tif (node) {\n\t// \t\tif (node.isDirty()) {\n\t// \t\t\tawait node.compute();\n\t// \t\t}\n\t// \t\tconst container = node.containerController.container();\n\t// \t\tconst texture = container.texture();\n\t// \t\tuniform.value = texture;\n\t// \t} else {\n\t// \t\tuniform.value = null;\n\t// \t}\n\t// }\n}\n","export enum LineType {\n\t// FUNCTION_DECLARATION = 'function_declaration',\n\tMEMBER = 'member',\n\tCONSTRUCTOR = 'constructor',\n\tDEFINE = 'define',\n\tBODY = 'body',\n\t// TRIGGER = 'trigger',\n\t// TRIGGERABLE = 'triggerable',\n}\n","import {JsType} from './../../../../poly/registers/nodes/types/Js';\nimport {NodeContext} from './../../../../poly/NodeContext';\nimport {AssemblerControllerNode} from '../Controller';\nimport {BaseJsNodeType} from '../../_Base';\nimport {BaseJsShaderAssembler} from '../assemblers/_Base';\n\nexport class JsNodeFinder {\n\tstatic findOutputNodes(node: AssemblerControllerNode<BaseJsShaderAssembler>) {\n\t\tconst output = node.nodesByType(JsType.OUTPUT);\n\t\tconst outputAmbientLight = node.nodesByType(JsType.OUTPUT_AMBIENT_LIGHT);\n\t\tconst outputAreaLight = node.nodesByType(JsType.OUTPUT_AREA_LIGHT);\n\t\tconst outputDirectionalLight = node.nodesByType(JsType.OUTPUT_DIRECTIONAL_LIGHT);\n\t\tconst outputHemisphereLight = node.nodesByType(JsType.OUTPUT_HEMISPHERE_LIGHT);\n\t\tconst outputPointLight = node.nodesByType(JsType.OUTPUT_POINT_LIGHT);\n\t\tconst outputSpotLight = node.nodesByType(JsType.OUTPUT_SPOT_LIGHT);\n\n\t\treturn output\n\t\t\t.concat(outputAmbientLight)\n\t\t\t.concat(outputAreaLight)\n\t\t\t.concat(outputDirectionalLight)\n\t\t\t.concat(outputHemisphereLight)\n\t\t\t.concat(outputPointLight)\n\t\t\t.concat(outputSpotLight);\n\t}\n\tstatic findParamGeneratingNodes(node: AssemblerControllerNode<BaseJsShaderAssembler>) {\n\t\tconst list: BaseJsNodeType[] = [];\n\t\tnode.childrenController?.traverseChildren(\n\t\t\t(child) => {\n\t\t\t\tconst childJsNode = child as BaseJsNodeType;\n\t\t\t\tif (childJsNode.paramsGenerating()) {\n\t\t\t\t\tlist.push(childJsNode);\n\t\t\t\t}\n\t\t\t},\n\t\t\t(child) => {\n\t\t\t\tif (!child.childrenController) {\n\t\t\t\t\treturn child.context() == NodeContext.GL;\n\t\t\t\t} else {\n\t\t\t\t\treturn child.context() == NodeContext.GL && child.childrenController.context == NodeContext.GL;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\treturn list;\n\t}\n\t// static findVaryingNodes(node: BaseJsParentNode) {\n\t// \tconst nodes = node.nodesByType(JsType.VARYING_WRITE);\n\t// \treturn nodes;\n\t// }\n\tstatic findAttributeExportNodes(node: AssemblerControllerNode<BaseJsShaderAssembler>) {\n\t\tconst nodes = node.nodesByType(JsType.ATTRIBUTE);\n\t\treturn nodes.filter((node) => {\n\t\t\t// do not use attributes that are used as an input, as export\n\t\t\t// return (node.used_output_names().length == 0) &&\n\t\t\treturn node.isExporting();\n\t\t});\n\t}\n}\n","export const FUNC_POINTS_COUNT_FROM_OBJECT = `pointsCountFromObject`;\nexport const FUNC_CORE_PRIMITIVE_CLASS_FACTORY = `corePrimitiveClassFactory`;\n","import {BaseJsNodeType} from '../_Base';\nimport {TypedJsDefinitionCollection} from './JsDefinitionCollection';\nimport {JsConnectionPointType} from '../../utils/io/connections/Js';\nimport {JsLinesCollectionController} from '../code/utils/JsLinesCollectionController';\nimport {nodeMethodName} from '../code/assemblers/actor/ActorAssemblerUtils';\nimport {LineType} from '../code/utils/LineType';\nimport {pushOnArrayAtEntry, mapGroupBy} from '../../../../core/MapUtils';\nimport {EvaluatorMethodName} from '../code/assemblers/actor/ActorEvaluator';\nimport {arrayUniq} from '../../../../core/ArrayUtils';\nimport {ActorAssemblerConstant} from '../code/assemblers/actor/ActorAssemblerCommon';\nimport {Poly} from '../../../Poly';\nimport {inputObject3D} from '../_BaseObject3D';\nimport {FUNC_POINTS_COUNT_FROM_OBJECT, FUNC_CORE_PRIMITIVE_CLASS_FACTORY} from './Common';\n\nexport enum JsDefinitionType {\n\t// ATTRIBUTE = 'attribute',\n\tLOCAL_FUNCTION = 'localFunction',\n\tCOMPUTED = 'computed',\n\tCONSTANT = 'constant',\n\tREF = 'ref',\n\tWATCH = 'watch',\n\tINIT_FUNCTION = 'initFunction',\n\tTRIGGERING = 'triggering',\n\tTRIGGERABLE = 'triggerable',\n}\n\nexport abstract class TypedJsDefinition<T extends JsDefinitionType> {\n\tconstructor(\n\t\tprotected _definitionType: T,\n\t\tprotected _node: BaseJsNodeType,\n\t\tprotected _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected _dataType: JsConnectionPointType,\n\t\tprotected _name: string\n\t) {\n\t\t// super(_node, _name);\n\t}\n\tstatic gather(definitions: BaseJsDefinition[], linesForShader: Map<LineType, string[]>, lineType: LineType) {}\n\n\tdefinitionType() {\n\t\treturn this._definitionType;\n\t}\n\tdataType() {\n\t\treturn this._dataType;\n\t}\n\tnode() {\n\t\treturn this._node;\n\t}\n\tname() {\n\t\treturn this._name;\n\t}\n\n\tabstract line(): string;\n\tcollectionInstance() {\n\t\treturn new TypedJsDefinitionCollection<T>();\n\t}\n}\n\n// export class AttributeGLDefinition extends TypedJsDefinition<JsDefinitionType.ATTRIBUTE> {\n// \tconstructor(\n// \t\tprotected override _node: BaseJsNodeType,\n// \t\tprotected override _data_type: JsConnectionPointType,\n// \t\tprotected override _name: string\n// \t) {\n// \t\tsuper(JsDefinitionType.ATTRIBUTE, _data_type, _node, _name);\n// \t}\n// \tget line() {\n// \t\treturn `attribute ${this.data_type} ${this.name()}`;\n// \t}\n// }\n\nexport class LocalFunctionJsDefinition extends TypedJsDefinition<JsDefinitionType.LOCAL_FUNCTION> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _functionDefinition: string\n\t) {\n\t\tsuper(JsDefinitionType.LOCAL_FUNCTION, _node, _shaderCollectionController, _dataType, _name);\n\t}\n\tline() {\n\t\treturn this._functionDefinition;\n\t}\n\t// functionDefinition() {\n\t// \treturn this._functionDefinition;\n\t// }\n}\n\n// export class UniformJsDefinition extends TypedJsDefinition<JsDefinitionType.UNIFORM> {\n// \tconstructor(\n// \t\tprotected override _node: BaseJsNodeType,\n// \t\tprotected override _data_type: JsConnectionPointType,\n// \t\tprotected override _name: string\n// \t) {\n// \t\tsuper(JsDefinitionType.UNIFORM, _data_type, _node, _name);\n// \t}\n// \tget line() {\n// \t\treturn `uniform ${this.data_type} ${this.name()}`;\n// \t}\n// }\n\n// export class InitJsDefinition extends TypedJsDefinition<JsDefinitionType.INIT> {\n// \tconstructor(\n// \t\tprotected override _node: BaseJsNodeType,\n// \t\tprotected override _shaderCollectionController: ShadersCollectionController,\n// \t\tprotected override _dataType: JsConnectionPointType,\n// \t\tprotected override _name: string,\n// \t\tprotected _value: string\n// \t) {\n// \t\tsuper(JsDefinitionType.INIT, _node, _shaderCollectionController, _dataType, _name);\n// \t\t_shaderCollectionController.addComputedVarName(this.name());\n// \t}\n// \tline() {\n// \t\treturn `\tthis.${this.name()} = computed(()=> ${this._value} )`;\n// \t}\n// }\n\nexport class ComputedValueJsDefinition extends TypedJsDefinition<JsDefinitionType.COMPUTED> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string\n\t) {\n\t\tsuper(JsDefinitionType.COMPUTED, _node, _shaderCollectionController, _dataType, _name);\n\t\t_shaderCollectionController.addComputedVarName(this.name());\n\t}\n\tline() {\n\t\treturn `\t${this.name()} = computed(()=> ${this._value} )`;\n\t}\n}\nexport class ConstantJsDefinition extends TypedJsDefinition<JsDefinitionType.CONSTANT> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string\n\t) {\n\t\tsuper(JsDefinitionType.CONSTANT, _node, _shaderCollectionController, _dataType, _name);\n\t\tif (this._shaderCollectionController.assembler().computedVariablesAllowed()) {\n\t\t\t_shaderCollectionController.addComputedVarName(this.name());\n\t\t}\n\t}\n\tline() {\n\t\tif (this._shaderCollectionController.assembler().computedVariablesAllowed()) {\n\t\t\treturn `\t${this.name()} = {value:${this._value}}`;\n\t\t} else {\n\t\t\treturn `\t${this.name()} = ${this._value}`;\n\t\t}\n\t}\n}\nexport class RefJsDefinition extends TypedJsDefinition<JsDefinitionType.REF> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string\n\t) {\n\t\tsuper(JsDefinitionType.REF, _node, _shaderCollectionController, _dataType, _name);\n\t\t_shaderCollectionController.addComputedVarName(this.name());\n\t}\n\tline() {\n\t\treturn `\t${this.name()} = ref(${this._value})`;\n\t}\n}\ninterface WatchedValueJsDefinitionOptions {\n\t// onChange: (prevVal: string) => string;\n\tdeep?: boolean;\n}\nexport class WatchedValueJsDefinition extends TypedJsDefinition<JsDefinitionType.WATCH> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string,\n\t\tprotected _options: WatchedValueJsDefinitionOptions\n\t) {\n\t\tsuper(JsDefinitionType.WATCH, _node, _shaderCollectionController, _dataType, _name);\n\t\t_shaderCollectionController.addComputedVarName(this.name());\n\t}\n\tline() {\n\t\tconst deep = this._options.deep != null ? this._options.deep : false;\n\t\treturn `\n\t\tthis._watchStopHandles.push(\n\t\t\twatch(\n\t\t\t\t${this.name()},\n\t\t\t\t( )=> {\n\t\t\t\t\t${this._value}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdeep: ${deep}\n\t\t\t\t}\n\t\t\t)\n\t\t)`;\n\t}\n}\nexport class InitFunctionJsDefinition extends TypedJsDefinition<JsDefinitionType.INIT_FUNCTION> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string\n\t) {\n\t\tsuper(JsDefinitionType.INIT_FUNCTION, _node, _shaderCollectionController, _dataType, _name);\n\t\t// _shaderCollectionController.addComputedVarName(this.name());\n\t}\n\tline() {\n\t\treturn `\t${this._value}`;\n\t}\n}\ninterface TriggeringJsDefinitionOptions {\n\ttriggeringMethodName: EvaluatorMethodName;\n\tgatherable: boolean;\n\tnodeMethodName?: string;\n\tperPoint?: boolean;\n}\nexport class TriggeringJsDefinition extends TypedJsDefinition<JsDefinitionType.TRIGGERING> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string,\n\t\tprotected _options: TriggeringJsDefinitionOptions\n\t) {\n\t\tsuper(JsDefinitionType.TRIGGERING, _node, _shaderCollectionController, _dataType, _name);\n\t\t// _shaderCollectionController.addComputedVarName(this.name());\n\t}\n\toverride name() {\n\t\treturn this._options.nodeMethodName || nodeMethodName(this._node);\n\t}\n\tline() {\n\t\tconst methodName = this._options.nodeMethodName || nodeMethodName(this._node);\n\t\tif (this._options.perPoint) {\n\t\t\tconst func = Poly.namedFunctionsRegister.getFunction(\n\t\t\t\t'setPointIndex',\n\t\t\t\tthis._node,\n\t\t\t\tthis._shaderCollectionController\n\t\t\t);\n\t\t\tconst setPointIndex = func.asString(inputObject3D(this._node, this._shaderCollectionController), 'i');\n\n\t\t\treturn `${methodName}(){\n\t\t\t\tconst pointsCount = ${FUNC_POINTS_COUNT_FROM_OBJECT}(${ActorAssemblerConstant.OBJECT_3D});\n\t\t\t\tfor( let i = 0; i < pointsCount; i++ ) {\n\t\t\t\t\t${setPointIndex}\n\t\t\t\t\t${this._value}\n\t\t\t\t}\n\t\t\t\tif( ${ActorAssemblerConstant.OBJECT_3D}.isMesh ){\n\t\t\t\t\t${FUNC_CORE_PRIMITIVE_CLASS_FACTORY}(${ActorAssemblerConstant.OBJECT_3D}).computeVertexNormalsIfAttributeVersionChanged(${ActorAssemblerConstant.GEOMETRY});\n\t\t\t\t}\n\t\t\t}`;\n\t\t} else {\n\t\t\treturn `${methodName}(){\n\t\t\t\t${this._value}\n\t\t\t}`;\n\t\t}\n\t}\n\tstatic override gather(\n\t\t_definitions: TypedJsDefinition<JsDefinitionType>[],\n\t\tlinesForShader: Map<LineType, string[]>,\n\t\tlineType: LineType\n\t) {\n\t\tconst triggeringDefinitions = (\n\t\t\t_definitions.filter((d) => d.definitionType() == JsDefinitionType.TRIGGERING) as TriggeringJsDefinition[]\n\t\t).filter((d) => d._options.gatherable == true);\n\t\tconst definitionGroups = mapGroupBy(\n\t\t\ttriggeringDefinitions,\n\t\t\t(definition) => definition._options.triggeringMethodName\n\t\t);\n\t\tdefinitionGroups.forEach((definitions, triggeringMethodName) => {\n\t\t\tconst uniqFunctionCalls: string[] = [];\n\t\t\tarrayUniq(\n\t\t\t\tdefinitions.map((d) => `this.${d.name()}()`),\n\t\t\t\tuniqFunctionCalls\n\t\t\t);\n\t\t\tconst definitionMethodCalls = uniqFunctionCalls.join(';');\n\t\t\tconst line = `${triggeringMethodName}(){\n\t\t\t\t${definitionMethodCalls}\n\t\t\t}`;\n\n\t\t\tpushOnArrayAtEntry(linesForShader, lineType, line);\n\t\t});\n\t}\n}\nexport interface TriggerableJsDefinitionOptions {\n\tasync?: boolean;\n\tmethodName?: string;\n}\nexport class TriggerableJsDefinition extends TypedJsDefinition<JsDefinitionType.TRIGGERABLE> {\n\tconstructor(\n\t\tprotected override _node: BaseJsNodeType,\n\t\tprotected override _shaderCollectionController: JsLinesCollectionController,\n\t\tprotected override _dataType: JsConnectionPointType,\n\t\tprotected override _name: string,\n\t\tprotected _value: string,\n\t\tprotected _options?: TriggerableJsDefinitionOptions\n\t) {\n\t\tsuper(JsDefinitionType.TRIGGERABLE, _node, _shaderCollectionController, _dataType, _name);\n\t\t// _shaderCollectionController.addComputedVarName(this.name());\n\t}\n\tline() {\n\t\tconst _async = this._options?.async == true;\n\t\tconst functionPrefix = _async ? 'async' : '';\n\t\tconst methodName = this._options?.methodName != null ? this._options?.methodName : nodeMethodName(this._node);\n\t\treturn `${functionPrefix} ${methodName}(){\n\t\t\t${this._value}\n\t\t}`;\n\t}\n}\n\n// type DefinitionTypeMapGeneric = {[key in JsDefinitionType]: any};\n\nexport interface DefinitionTypeMap {\n\t[JsDefinitionType.LOCAL_FUNCTION]: typeof LocalFunctionJsDefinition;\n\t[JsDefinitionType.COMPUTED]: typeof ComputedValueJsDefinition;\n\t[JsDefinitionType.CONSTANT]: typeof ConstantJsDefinition;\n\t[JsDefinitionType.REF]: typeof RefJsDefinition;\n\t[JsDefinitionType.WATCH]: typeof WatchedValueJsDefinition;\n\t[JsDefinitionType.INIT_FUNCTION]: typeof InitFunctionJsDefinition;\n\t[JsDefinitionType.TRIGGERING]: typeof TriggeringJsDefinition;\n\t[JsDefinitionType.TRIGGERABLE]: typeof TriggerableJsDefinition;\n}\nexport const JsDefinitionTypeMap: DefinitionTypeMap = {\n\t[JsDefinitionType.LOCAL_FUNCTION]: LocalFunctionJsDefinition,\n\t[JsDefinitionType.COMPUTED]: ComputedValueJsDefinition,\n\t[JsDefinitionType.CONSTANT]: ConstantJsDefinition,\n\t[JsDefinitionType.REF]: RefJsDefinition,\n\t[JsDefinitionType.WATCH]: WatchedValueJsDefinition,\n\t[JsDefinitionType.INIT_FUNCTION]: InitFunctionJsDefinition,\n\t[JsDefinitionType.TRIGGERING]: TriggeringJsDefinition,\n\t[JsDefinitionType.TRIGGERABLE]: TriggerableJsDefinition,\n};\n\nexport type BaseJsDefinition = TypedJsDefinition<JsDefinitionType>;\n","import {TypedJsDefinition, JsDefinitionType} from './JsDefinition';\n\nexport class TypedJsDefinitionCollection<T extends JsDefinitionType> {\n\t_errored: boolean = false;\n\t_error_message: string | undefined;\n\n\tconstructor(private _definitions: TypedJsDefinition<T>[] = []) {}\n\n\tget errored() {\n\t\treturn this._errored;\n\t}\n\tget error_message() {\n\t\treturn this._error_message;\n\t}\n\n\tuniq(): TypedJsDefinition<T>[] {\n\t\tconst definitions_by_name: Map<string, TypedJsDefinition<T>> = new Map();\n\t\tconst names: string[] = [];\n\n\t\tfor (const definition of this._definitions) {\n\t\t\tif (!this._errored) {\n\t\t\t\tconst name = definition.name();\n\t\t\t\tconst existing = definitions_by_name.get(name);\n\t\t\t\tif (existing) {\n\t\t\t\t\tif (existing.dataType() != definition.dataType()) {\n\t\t\t\t\t\tthis._errored = true;\n\t\t\t\t\t\tthis._error_message = `attempt to create '${definition.name()}' with types '${definition.dataType()}' by node '${definition\n\t\t\t\t\t\t\t.node()\n\t\t\t\t\t\t\t.path()}', when there is already an existing with type ${existing.dataType()} from node '${existing\n\t\t\t\t\t\t\t.node()\n\t\t\t\t\t\t\t.path()}'`;\n\t\t\t\t\t\tconsole.warn('emitting error message:', this._error_message);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdefinitions_by_name.set(name, definition);\n\t\t\t\t\tnames.push(name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst uniq_definitions: TypedJsDefinition<T>[] = [];\n\t\tfor (const name of names) {\n\t\t\tconst definition = definitions_by_name.get(name);\n\t\t\tif (definition) {\n\t\t\t\tuniq_definitions.push(definition);\n\t\t\t}\n\t\t}\n\t\t// sorting may make dependencies be declared after the function calling them\n\t\t// const sorted_definitions = ArrayUtils.sortBy(uniq_definitions, (d)=>d.name())\n\t\treturn uniq_definitions;\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nexport class TypedBaseManagerNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.MANAGER, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.MANAGER;\n\t}\n}\n\nexport type BaseManagerNodeType = TypedBaseManagerNode<any>;\nexport class BaseManagerNodeClass extends TypedBaseManagerNode<any> {}\n","import type {Constructor} from '../../../../../types/GlobalTypes';\nimport type {BaseNodeType} from '../../../_Base';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport type {RootManagerNode} from '../../Root';\nimport {isBooleanTrue} from '../../../../../core/Type';\nimport type {AudioListenerObjNode} from '../../../obj/AudioListener';\n\nconst CallbackOptions = {\n\tcomputeOnDirty: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tRootAudioController.update(node as RootManagerNode);\n\t},\n};\n\nexport function RootAudioParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t// audio\n\t\t/** @param set if a audio icon is shown in the viewer to toggle sound on/off */\n\t\tdisplayAudioIcon = ParamConfig.BOOLEAN(0, {\n\t\t\t...CallbackOptions,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param icon color */\n\t\taudioIconColor = ParamConfig.COLOR([0, 0, 0], {\n\t\t\t...CallbackOptions,\n\t\t\tvisibleIf: {displayAudioIcon: 1},\n\t\t});\n\t\t/** @param icon style properties */\n\t\taudioIconStyle = ParamConfig.STRING(\n\t\t\t'position: absolute; top: 10px; right: 10px; width: 24px; height: 24px; cursor: pointer',\n\t\t\t{\n\t\t\t\t...CallbackOptions,\n\t\t\t\tvisibleIf: {displayAudioIcon: 1},\n\t\t\t}\n\t\t);\n\t};\n}\n\ntype onToggleSoundCallback = (soundOn: boolean) => void;\nexport class RootAudioController {\n\tconstructor(protected node: RootManagerNode) {}\n\n\tasync toggleSound() {\n\t\tthis.audioListeners().forEach((node) => {\n\t\t\tnode.toggleSound();\n\t\t});\n\n\t\tthis.update();\n\t\tthis._runOnToggleSoundCallbacks();\n\t}\n\tsoundOn() {\n\t\tconst listener = this.audioListeners()[0];\n\t\tif (listener) {\n\t\t\treturn isBooleanTrue(listener.pv.soundOn) || false;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tupdate() {\n\t\tthis._updateViewers();\n\t}\n\taudioListeners(): AudioListenerObjNode[] {\n\t\treturn this.node.nodesByType('audioListener') as AudioListenerObjNode[];\n\t}\n\n\tprivate _updateViewers() {\n\t\tthis.node.scene().viewersRegister.traverseViewers((viewer) => {\n\t\t\tviewer.audioController().update();\n\t\t});\n\t}\n\tstatic update(node: RootManagerNode) {\n\t\tnode.audioController.update();\n\t}\n\n\t/*\n\t *\n\t * CALLBACKS\n\t *\n\t */\n\tprivate _callbacksByName = new Map<string, onToggleSoundCallback>();\n\tonToggleSound(callbackName: string, callback: onToggleSoundCallback) {\n\t\tif (this._callbacksByName.get(callbackName)) {\n\t\t\tconsole.warn(`callback already registered ith name '${callbackName}'`);\n\t\t\treturn;\n\t\t}\n\t\tthis._callbacksByName.set(callbackName, callback);\n\t}\n\tprivate _runOnToggleSoundCallbacks() {\n\t\tconst soundOn = this.soundOn();\n\t\tthis._callbacksByName.forEach((callback) => {\n\t\t\tcallback(soundOn);\n\t\t});\n\t}\n}\n","import {CoreFeaturesController} from './../../../../../core/FeaturesController';\nimport {Constructor} from '../../../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../_Base';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {RootManagerNode} from '../../Root';\nimport {PolyScene} from '../../../../scene/PolyScene';\nimport {setToArray} from '../../../../../core/SetUtils';\nimport {Poly} from '../../../../Poly';\nimport {arrayUniq, arrayCompact, arrayToSet} from '../../../../../core/ArrayUtils';\nimport {BaseObjNodeType} from '../../../obj/_Base';\nimport {GeoObjNode} from '../../../obj/Geo';\n\nclass NodeGroup {\n\tpublic readonly totalCount: number;\n\tprivate _processed: Set<BaseNodeType>;\n\tprivate _remaining: Set<BaseNodeType> = new Set();\n\tconstructor(public readonly nodes: BaseNodeType[]) {\n\t\tif (CoreFeaturesController.debugLoadProgress()) {\n\t\t\tconsole.log(nodes);\n\t\t}\n\t\tthis.totalCount = nodes.length;\n\t\tthis._processed = new Set();\n\t\tarrayToSet(nodes, this._remaining);\n\t}\n\tmarkNodeAsProcessed(node: BaseNodeType) {\n\t\tthis._processed.add(node);\n\t\tthis._remaining.delete(node);\n\t\tif (CoreFeaturesController.debugLoadProgress()) {\n\t\t\tconsole.log('markNodeAsProcessed', node.path(), {\n\t\t\t\tprocessed: setToArray(this._processed, []).map((n) => n.path()),\n\t\t\t\tremaining: setToArray(this._remaining, []).map((n) => n.path()),\n\t\t\t});\n\t\t}\n\t}\n\tisNodeProcessed(node: BaseNodeType) {\n\t\treturn this._processed.has(node);\n\t}\n\tprocessedCount(): number {\n\t\treturn this._processed.size;\n\t}\n}\ninterface NodeGroups {\n\ttoCook: NodeGroup;\n\tsopGroupToUpdate: NodeGroup;\n}\n\nexport interface OnProgressArguments {\n\tscene: PolyScene;\n\ttriggerNode?: BaseNodeType;\n\tgroups: NodeGroups;\n}\nexport type OnProgressUpdateCallback = (progressRatio: number, args: OnProgressArguments) => void;\n\nexport function RootLoadProgressParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param when the scene loads, nodes that match the mask will update the progress bar as they cook */\n\t\tnodesMask = ParamConfig.STRING('*/image* */envMap*', {\n\t\t\tcook: false,\n\t\t\tseparatorBefore: true,\n\t\t\tobjectMask: false, // do not use objectMask, since it is a node mask, not object\n\t\t});\n\t\t/** @param prints which nodes match the mask in the console */\n\t\tprintNodes = ParamConfig.BUTTON(null, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tRootLoadProgressController.PARAM_CALLBACK_printResolve(node as RootManagerNode);\n\t\t\t},\n\t\t\t// objectMask: false // do not use objectMask, since it is a node mask, not object\n\t\t});\n\t};\n}\n\nexport class RootLoadProgressController {\n\tconstructor(protected node: RootManagerNode) {}\n\n\tstatic async PARAM_CALLBACK_printResolve(node: RootManagerNode) {\n\t\tconst nodes = await node.loadProgress.resolvedNodes();\n\t\tconsole.log(nodes);\n\t\tconst nodePaths = nodes.map((node) => node.path()).sort();\n\t\tconsole.log(nodePaths);\n\t}\n\tasync resolvedNodes() {\n\t\tconst param = this.node.p.nodesMask;\n\t\tif (param.isDirty()) {\n\t\t\tawait param.compute();\n\t\t}\n\t\tconst mask = param.value;\n\t\tconst scene = this.node.scene();\n\t\tconst nodes = scene.nodesController.nodesFromMask(mask || '');\n\n\t\tconst nodeDisplayNodes = await this._loadDisplayNodes();\n\t\tconst uniqNodes: BaseNodeType[] = [];\n\t\tarrayUniq(nodes.concat(nodeDisplayNodes), uniqNodes);\n\t\treturn uniqNodes;\n\t}\n\tprivate async _loadDisplayNodes() {\n\t\tconst scene = this.node.scene();\n\t\t// we also need to get the cameras at the obj level\n\t\tconst cameraNodeTypes = Poly.camerasRegister.registeredNodeTypes();\n\t\tconst cameraNodes = cameraNodeTypes.map((type) => scene.nodesByType(type)).flat();\n\t\t// and we also need to get the displayed nodes\n\t\tconst displayNodes = this._displayNodes();\n\t\tconst nodes = cameraNodes.concat(displayNodes);\n\t\tconst cameraCreatorNode = await this.cameraCreatorNode();\n\t\tif (cameraCreatorNode) {\n\t\t\tnodes.push(cameraCreatorNode);\n\t\t}\n\t\tconst uniqNodes: BaseNodeType[] = [];\n\t\tarrayUniq(nodes, uniqNodes);\n\t\treturn uniqNodes;\n\t}\n\tprivate _displayNodes() {\n\t\tconst objNodesWithDisplayNodeController = this._objectNodesWithDisplayNodeController() as GeoObjNode[];\n\t\tconst displayNodes: BaseNodeType[] = [];\n\t\tarrayCompact(\n\t\t\tobjNodesWithDisplayNodeController.map((node) => node.displayNodeController.firstNonBypassedDisplayNode()),\n\t\t\tdisplayNodes\n\t\t);\n\t\treturn displayNodes;\n\t}\n\tprivate _objectNodesWithDisplayNodeController() {\n\t\tconst scene = this.node.scene();\n\t\tconst objNodesWithDisplayNodeController = scene\n\t\t\t.root()\n\t\t\t.children()\n\t\t\t.filter((node) => (node as BaseObjNodeType).displayNodeController != null)\n\t\t\t.filter((node) => node.flags?.display?.active());\n\t\treturn objNodesWithDisplayNodeController;\n\t}\n\t// private _getNodesWithSopGroup() {\n\t// \treturn this._displayNodes().filter((node) => (node as GeoObjNode).childrenDisplayController != null);\n\t// }\n\tpublic cameraCreatorNode() {\n\t\treturn this.node.mainCameraController.cameraCreatorNode();\n\t}\n\n\tprivate _nodeGroups: NodeGroups | undefined;\n\t// private _toCook: NodeGroup | undefined;\n\t// private _sopGroupToUpdate: NodeGroup | undefined;\n\tprivate _onProgressUpdateCallback: OnProgressUpdateCallback | undefined;\n\tprivate _runCallback(progress: number, nodeTrigger?: BaseNodeType) {\n\t\tthis._debug2('_runCallback', {progress, nodeTrigger});\n\t\tif (!(this._onProgressUpdateCallback && this._nodeGroups)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._debug2('_onProgressUpdateCallback', this._nodeGroups);\n\t\tthis._onProgressUpdateCallback(progress, {\n\t\t\tscene: this.node.scene(),\n\t\t\ttriggerNode: undefined,\n\t\t\tgroups: this._nodeGroups,\n\t\t});\n\t}\n\tprivate _updateProgressAndRunCallback(nodeTrigger: BaseNodeType) {\n\t\tif (!(this._onProgressUpdateCallback && this._nodeGroups)) {\n\t\t\treturn;\n\t\t}\n\t\tconst totalNodesCount = this._nodeGroups.toCook.totalCount + this._nodeGroups.sopGroupToUpdate.totalCount;\n\t\tconst processedNodesCount =\n\t\t\tthis._nodeGroups.toCook.processedCount() + this._nodeGroups.sopGroupToUpdate.processedCount();\n\t\tconst progress = processedNodesCount / totalNodesCount;\n\t\tthis._runCallback(progress, nodeTrigger);\n\t}\n\n\tasync watchNodesProgress(callback: OnProgressUpdateCallback) {\n\t\tthis._onProgressUpdateCallback = callback;\n\t\tconst resolvedNodes = await this.resolvedNodes();\n\t\tconst nodesToCook = resolvedNodes.filter((node) => node.isDirty());\n\t\tthis._debug({nodesToCook});\n\t\tconst nodesToUpdateSopGroup = this._objectNodesWithDisplayNodeController()\n\t\t\t.filter((node) => {\n\t\t\t\tconst displayNode = (node as GeoObjNode).displayNodeController.displayNode();\n\t\t\t\treturn displayNode != null && !displayNode.flags.bypass?.active();\n\t\t\t})\n\t\t\t.filter((node) => node.isDirty());\n\t\tthis._debug({nodesToUpdateSopGroup});\n\t\tthis._nodeGroups = {\n\t\t\ttoCook: new NodeGroup(nodesToCook),\n\t\t\tsopGroupToUpdate: new NodeGroup(nodesToUpdateSopGroup),\n\t\t};\n\t\tconst totalNodesCount = this._nodeGroups.toCook.totalCount + this._nodeGroups.sopGroupToUpdate.totalCount;\n\t\tthis._debug({totalNodesCount});\n\t\tif (totalNodesCount == 0) {\n\t\t\tthis._runCallback(1);\n\t\t\treturn;\n\t\t}\n\t\tthis._watchNodesWithSopGroup();\n\t\tthis._watchNodesToCook();\n\t}\n\tprivate async _watchNodesToCook() {\n\t\tconst nodesGroup = this._nodeGroups?.toCook;\n\t\tif (!nodesGroup) {\n\t\t\treturn;\n\t\t}\n\t\tconst callbackName = 'RootLoadProgressController';\n\n\t\tconst onNodeCooked = (node: BaseNodeType) => {\n\t\t\tif (!nodesGroup.isNodeProcessed(node)) {\n\t\t\t\tnodesGroup.markNodeAsProcessed(node);\n\n\t\t\t\tthis._updateProgressAndRunCallback(node);\n\n\t\t\t\tnode.cookController.deregisterOnCookEnd(callbackName);\n\t\t\t}\n\t\t};\n\n\t\tfor (const node of nodesGroup.nodes) {\n\t\t\tnode.cookController.registerOnCookEnd(callbackName, () => {\n\t\t\t\tthis._debug2('nodeToCook - completed', node.path());\n\t\t\t\tonNodeCooked(node);\n\t\t\t});\n\t\t\t// we force nodes to compute\n\t\t\t// in case they do not have a display flag on, or are not connected\n\t\t\t// as it would get the loading stuck\n\t\t\tthis._debug2('nodeToCook - start', node.path());\n\t\t\tnode.compute();\n\t\t}\n\t}\n\tprivate _watchNodesWithSopGroup() {\n\t\tconst nodesGroup = this._nodeGroups?.sopGroupToUpdate;\n\t\tif (!nodesGroup) {\n\t\t\treturn;\n\t\t}\n\t\tconst callbackName = 'RootLoadProgressController';\n\n\t\tconst onNodeCooked = (node: BaseNodeType) => {\n\t\t\tif (!nodesGroup.isNodeProcessed(node)) {\n\t\t\t\tnodesGroup.markNodeAsProcessed(node);\n\n\t\t\t\tthis._updateProgressAndRunCallback(node);\n\n\t\t\t\tconst childrenDisplayController = (node as GeoObjNode).childrenDisplayController;\n\t\t\t\tchildrenDisplayController.deregisterOnSopGroupUpdated(callbackName);\n\t\t\t}\n\t\t};\n\n\t\tfor (const node of nodesGroup.nodes) {\n\t\t\tconst childrenDisplayController = (node as GeoObjNode).childrenDisplayController;\n\t\t\tthis._debug2('nodeWithSopGroup - watch', node.path());\n\t\t\tchildrenDisplayController.registerOnSopGroupUpdated(callbackName, () => {\n\t\t\t\tthis._debug2('nodeWithSopGroup - completed', node.path());\n\t\t\t\tonNodeCooked(node);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected static debugActive(): boolean {\n\t\treturn CoreFeaturesController.debugLoadProgress();\n\t}\n\tstatic debug(arg0: any) {\n\t\tif (!this.debugActive()) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(arg0);\n\t}\n\tstatic debug2(arg0: any, arg1: any) {\n\t\tif (!this.debugActive()) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(arg0, arg1);\n\t}\n\tprotected _debug(arg0: any) {\n\t\tRootLoadProgressController.debug(arg0);\n\t}\n\tprotected _debug2(arg0: any, arg1: any) {\n\t\tRootLoadProgressController.debug2(arg0, arg1);\n\t}\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {RootManagerNode} from '../../Root';\nimport {Camera, PerspectiveCamera} from 'three';\nimport {CoreWalker} from '../../../../../core/Walker';\nimport {GeoObjNode} from '../../../obj/Geo';\nimport {CorePath} from '../../../../../core/geometry/CorePath';\n\nlet __defaultDummyPerspectiveCamera: PerspectiveCamera | undefined;\nexport function _defaultDummyPerspectiveCamera() {\n\treturn (__defaultDummyPerspectiveCamera = __defaultDummyPerspectiveCamera || new PerspectiveCamera());\n}\n\nexport function RootMainCameraParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param path to the main camera object that will be used when the scene loads outside of the editor */\n\t\tmainCameraPath = ParamConfig.STRING('', {\n\t\t\tcook: false,\n\t\t\tseparatorBefore: true,\n\t\t\tobjectMask: true,\n\t\t});\n\t};\n}\n\nexport class RootMainCameraController {\n\tconstructor(protected node: RootManagerNode) {}\n\n\tsetCamera(object: Camera) {\n\t\tconst path = CorePath.objectPath(object);\n\t\tthis.setCameraPath(path);\n\t}\n\tsetCameraPath(path: string) {\n\t\tthis.mainCameraPathParam().set(path);\n\t}\n\tmainCameraPathParam() {\n\t\treturn this.node.p.mainCameraPath;\n\t}\n\trawCameraPath() {\n\t\treturn this.mainCameraPathParam().rawInput();\n\t}\n\tasync cameraPath() {\n\t\tconst param = this.mainCameraPathParam();\n\t\tif (param.isDirty()) {\n\t\t\tawait param.compute();\n\t\t}\n\t\treturn param.value;\n\t}\n\tprivate _cameraPathSync() {\n\t\tconst param = this.mainCameraPathParam();\n\t\treturn param.value;\n\t}\n\tcameraSync() {\n\t\tconst path = this._cameraPathSync();\n\t\tconst object = this.node.scene().objectsController.findObjectByMask(path) as Camera | undefined;\n\t\treturn object;\n\t}\n\tdummyPerspectiveCamera() {\n\t\treturn _defaultDummyPerspectiveCamera();\n\t}\n\tcameraSyncOrDummy() {\n\t\treturn this.cameraSync(); // || this.dummyPerspectiveCamera();\n\t}\n\tasync camera() {\n\t\tconst path = await this.cameraPath();\n\t\tconst object = this.node.scene().objectsController.findObjectByMask(path) as Camera | undefined;\n\t\treturn object;\n\t}\n\tasync cameraCreatorNode() {\n\t\tconst path = await this.cameraPath();\n\t\tconst elements = path.split(CoreWalker.SEPARATOR);\n\t\tconst nodeName = elements[1];\n\t\tconst objNode = this.node.node(nodeName);\n\t\tif (objNode && elements.length != 2) {\n\t\t\tconst displayNodeController = (objNode as GeoObjNode).displayNodeController;\n\t\t\tif (displayNodeController) {\n\t\t\t\treturn (objNode as GeoObjNode).displayNodeController.displayNode() || objNode;\n\t\t\t}\n\t\t}\n\t\treturn objNode;\n\t}\n}\n","/**\n * the node to rull them all\n *\n * @remarks\n *\n * The root node is unique in the scene. it is the higest parent, just above the [obj](/docs/nodes/obj) nodes.\n *\n * It allows you to control the following scene properties:\n *\n * - the scene background (which can be nothing, a plain color, or a texture)\n * - which camera is used when exporting the scene\n * - the fog\n * - an environment map which would override every material's environment map\n * - a material which would override every other material\n * - the display of an audio icon in the viewer, which is useful when using sound in your scene, and allowing users to turn it on/off\n *\n */\nimport {TypedBaseManagerNode} from './_Base';\nimport {BaseObjNodeType} from '../obj/_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {ObjNodeChildrenMap} from '../../poly/registers/nodes/Obj';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../_Base';\nimport {HierarchyObjNode} from '../obj/utils/HierarchyController';\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {ROOT_NAME} from '../../scene/utils/ObjectsController';\nimport {Scene} from 'three';\n\nimport {RootAudioController, RootAudioParamConfig} from './utils/Scene/Audio';\nimport {SceneAutoUpdateParamConfig, SceneAutoUpdateController} from './utils/Scene/AutoUpdate';\nimport {SceneBackgroundParamConfig, SceneBackgroundController} from './utils/Scene/Background';\nimport {SceneEnvParamConfig, SceneEnvController} from './utils/Scene/Env';\nimport {SceneFogParamConfig, SceneFogController} from './utils/Scene/Fog';\nimport {RootLoadProgressParamConfig, RootLoadProgressController} from './utils/Scene/LoadProgress';\nimport {SceneMaterialOverrideParamConfig, SceneMaterialOverrideController} from './utils/Scene/MaterialOverride';\nimport {RootMainCameraController, RootMainCameraParamConfig} from './utils/Scene/RootMainCamera';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\n\nexport const ROOT_NODE_NAME = 'RootNode';\nclass ObjectsManagerParamsConfig extends RootLoadProgressParamConfig(\n\tRootAudioParamConfig(\n\t\tSceneMaterialOverrideParamConfig(\n\t\t\tSceneEnvParamConfig(\n\t\t\t\tSceneFogParamConfig(\n\t\t\t\t\tRootMainCameraParamConfig(SceneBackgroundParamConfig(SceneAutoUpdateParamConfig(NodeParamsConfig)))\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t)\n) {}\nconst ParamsConfig = new ObjectsManagerParamsConfig();\n\nexport class RootManagerNode extends TypedBaseManagerNode<ObjectsManagerParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'root';\n\t}\n\n\tprotected _object: Scene = this._createScene();\n\tprivate _queuedNodesById: Map<number, BaseObjNodeType> = new Map();\n\t// private _expected_geo_nodes: PolyDictionary<GeoObjNode> = {};\n\t// private _process_queue_start: number = -1;\n\treadonly audioController: RootAudioController = new RootAudioController(this);\n\treadonly sceneAutoUpdateController: SceneAutoUpdateController = new SceneAutoUpdateController(this);\n\treadonly sceneBackgroundController: SceneBackgroundController = new SceneBackgroundController(this);\n\treadonly sceneEnvController: SceneEnvController = new SceneEnvController(this);\n\treadonly sceneFogController: SceneFogController = new SceneFogController(this);\n\treadonly loadProgress: RootLoadProgressController = new RootLoadProgressController(this);\n\treadonly sceneMaterialOverrideController: SceneMaterialOverrideController = new SceneMaterialOverrideController(\n\t\tthis as any\n\t);\n\treadonly mainCameraController: RootMainCameraController = new RootMainCameraController(this);\n\n\toverride cook() {\n\t\t// the cook method is necessary here,\n\t\t// with the .endCook()\n\t\t// Without it, the button param of this node would not execute\n\t\t// its callback, as this node would not be perceived as cooking done\n\t\tthis.cookController.endCook();\n\t}\n\n\tprotected override _childrenControllerContext = NodeContext.OBJ;\n\toverride initializeNode() {\n\t\t// this.children_controller?.init({dependent: false});\n\n\t\tthis.params.onParamsCreated('init controllers', () => {\n\t\t\tthis.sceneEnvController.addHooks();\n\t\t\tthis.sceneBackgroundController.addHooks();\n\t\t});\n\n\t\tthis.lifecycle.onChildAdd(this._onChildAdd.bind(this));\n\t\tthis.lifecycle.onChildRemove(this._onChildRemove.bind(this));\n\t}\n\n\tprivate _createScene() {\n\t\tconst scene = new Scene();\n\t\tscene.name = ROOT_NAME;\n\t\t// DO NOT set matrixAutoUpdate to false\n\t\t// on the scene, as this has too many side effects\n\t\t// and is probably an over optimisation anyway\n\t\tscene.matrixAutoUpdate = true;\n\t\treturn scene;\n\t}\n\n\tget object() {\n\t\treturn this._object;\n\t}\n\toverride createNode<S extends keyof ObjNodeChildrenMap>(\n\t\tnodeClass: S,\n\t\toptions?: NodeCreateOptions\n\t): ObjNodeChildrenMap[S];\n\toverride createNode<K extends valueof<ObjNodeChildrenMap>>(\n\t\tnodeClass: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<ObjNodeChildrenMap>>(\n\t\tnodeClass: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(nodeClass, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseObjNodeType[];\n\t}\n\toverride nodesByType<K extends keyof ObjNodeChildrenMap>(type: K): ObjNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as ObjNodeChildrenMap[K][];\n\t}\n\n\t// multiple_display_flags_allowed() {\n\t// \treturn true;\n\t// }\n\tprivate _updateScene() {\n\t\tthis.sceneAutoUpdateController.update();\n\t\tthis.sceneBackgroundController.update();\n\t\tthis.sceneEnvController.update();\n\t\tthis.sceneFogController.update();\n\t\tthis.sceneMaterialOverrideController.update();\n\t}\n\n\tprivate _addToQueue(node: BaseObjNodeType) {\n\t\tconst id = node.graphNodeId();\n\t\tif (!this._queuedNodesById.has(id)) {\n\t\t\tthis._queuedNodesById.set(id, node);\n\t\t}\n\t\treturn node;\n\t}\n\n\tprocessQueue() {\n\t\tthis._updateScene();\n\n\t\tconst queuedNodesByPath: Map<string, BaseObjNodeType> = new Map();\n\t\tconst paths: string[] = [];\n\t\tthis._queuedNodesById.forEach((node, id) => {\n\t\t\tconst fullPath = `_____${node.renderOrder}__${node.path()}`;\n\t\t\tpaths.push(fullPath);\n\t\t\tqueuedNodesByPath.set(fullPath, node);\n\t\t});\n\t\tthis._queuedNodesById.clear();\n\n\t\t// const promises = [];\n\t\tfor (const path_id of paths) {\n\t\t\tconst node = queuedNodesByPath.get(path_id);\n\t\t\tif (node) {\n\t\t\t\tqueuedNodesByPath.delete(path_id);\n\t\t\t\tthis._addToScene(node);\n\t\t\t\t// promises.push();\n\t\t\t}\n\t\t}\n\t\t// this._expected_geo_nodes = this._expected_geo_nodes || (await this.expected_loading_geo_nodes_by_id());\n\n\t\t// this._process_queue_start = performance.now();\n\t\t// Promise.all(promises).then(() => {\n\t\t// \t// Poly.log(`SCENE LOADED '${this.scene.name}`);\n\t\t// \t// `SCENE LOADED '${this.scene.name}' in ${performance.now() - this._process_queue_start}`\n\t\t// \t// this.scene().performance().print()\n\t\t// \t// do the update here if there are no objects to load\n\t\t// \t// otherwise an empty scene will have a loader that never gets removed\n\t\t// \t// if (Object.keys(this._expected_geo_nodes).length == 0) {\n\t\t// \t// \tthis.update_on_all_objects_loaded();\n\t\t// \t// }\n\t\t// });\n\t}\n\n\tprivate _updateObject(node: BaseObjNodeType) {\n\t\tif (!this.scene().loadingController.autoUpdating()) {\n\t\t\treturn this._addToQueue(node);\n\t\t} else {\n\t\t\t// update 25/01/2022: the light obj nodes, the null obj do not cook when created.\n\t\t\t// this aims to solve this.\n\t\t\t// and only once the scene has loaded\n\t\t\tif (node.isDisplayed() && !node.cookController.isCooking()) {\n\t\t\t\tnode.compute();\n\t\t\t}\n\t\t\treturn this._addToScene(node);\n\t\t}\n\t}\n\n\t//\n\t//\n\t// OBJ PARENTING\n\t//\n\t//\n\tgetParentForNode(node: BaseObjNodeType) {\n\t\tif (node.attachableToHierarchy()) {\n\t\t\tconst node_input = node.io.inputs.input(0);\n\t\t\tif (node_input) {\n\t\t\t\treturn node_input.childrenGroup();\n\t\t\t} else {\n\t\t\t\treturn this._object;\n\t\t\t}\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate _addToScene(node: BaseObjNodeType): void {\n\t\tif (node.attachableToHierarchy()) {\n\t\t\tconst parentObject = this.getParentForNode(node);\n\t\t\tif (parentObject) {\n\t\t\t\t// await node.params.eval_all().then((params_eval_key) => {\n\t\t\t\t// \tnode.compute();\n\t\t\t\t// });\n\n\t\t\t\tif (node.usedInScene()) {\n\t\t\t\t\t// I need to query the displayNodeController here,\n\t\t\t\t\t// for geo obj whose display_node is a node without inputs.\n\t\t\t\t\t// Since that node will not be made dirty, it seems that there is\n\t\t\t\t\t// nothing triggering the obj to request it itself.\n\t\t\t\t\t// TODO: investigate if it has a performance cost, or if it could be done\n\t\t\t\t\t// only when scene loads. Or if the displayNodeController itself could be improved\n\t\t\t\t\t// to take care of it itself.\n\t\t\t\t\t// node.compute();\n\n\t\t\t\t\tif (node.childrenDisplayController) {\n\t\t\t\t\t\tnode.childrenDisplayController.requestDisplayNodeContainer();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.compute();\n\t\t\t\t\t}\n\n\t\t\t\t\tnode.addObjectToParent(parentObject);\n\t\t\t\t} else {\n\t\t\t\t\tnode.removeObjectFromParent();\n\t\t\t\t\t// parent_object.remove(node.object);\n\t\t\t\t}\n\n\t\t\t\t// node.request_display_node();\n\t\t\t} else {\n\t\t\t\t// node.compute().then(() => {\n\t\t\t\t// \t// force events and mat to cook and remove the dirty state\n\t\t\t\t// \t// ensure that pickers are cooked\n\t\t\t\t// \t// TODO: although there has been cases with two picker and\n\t\t\t\t// \t// one referencing the other with an expression, and that\n\t\t\t\t// \t// expression be evaluated before the second was created\n\t\t\t\t// \t// which led to an error. This should not happen\n\t\t\t\t// \tnode.children_controller.traverse_children((child) => child.setDirty());\n\t\t\t\t// });\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _removeFromScene(node: BaseObjNodeType) {\n\t\tnode.removeObjectFromParent();\n\t}\n\tareChildrenCooking(): boolean {\n\t\tconst children = this.children();\n\t\tfor (const child of children) {\n\t\t\tif (child.cookController.isCooking() || child.isDisplayNodeCooking()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// private async expected_loading_geo_nodes_by_id() {\n\t// \tconst geo_nodes = this.nodesByType('geo');\n\t// \tconst node_by_id: PolyDictionary<GeoObjNode> = {};\n\t// \tfor (let geo_node of geo_nodes) {\n\t// \t\tconst isDisplayed = await geo_node.isDisplayed();\n\t// \t\tif (isDisplayed) {\n\t// \t\t\tnode_by_id[geo_node.graphNodeId()] = geo_node;\n\t// \t\t}\n\t// \t}\n\t// \treturn node_by_id;\n\t// }\n\n\taddToParentTransform(node: HierarchyObjNode) {\n\t\tthis._updateObject(node);\n\t}\n\n\tremoveFromParentTransform(node: HierarchyObjNode) {\n\t\tthis._updateObject(node);\n\t}\n\n\tprivate _onChildAdd(node?: BaseNodeType) {\n\t\tif (node) {\n\t\t\tthis._updateObject(node as BaseObjNodeType);\n\t\t}\n\t}\n\tprivate _onChildRemove(node?: BaseNodeType) {\n\t\tif (node) {\n\t\t\tthis._removeFromScene(node as BaseObjNodeType);\n\t\t}\n\t}\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../_Base';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\nimport {RootManagerNode} from '../../Root';\n\nconst CallbackOptions = {\n\tcomputeOnDirty: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tSceneAutoUpdateController.update(node as RootManagerNode);\n\t},\n};\n\nexport function SceneAutoUpdateParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param autoUpdate */\n\t\tautoUpdate = ParamConfig.BOOLEAN(1, {\n\t\t\t...CallbackOptions,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t};\n}\n// class SceneAutoUpdateParamsConfig extends SceneAutoUpdateParamConfig(NodeParamsConfig) {}\n// abstract class SceneAutoUpdateNode extends TypedNode<any, SceneAutoUpdateParamsConfig> {\n// \treadonly sceneAutoUpdateController = new SceneAutoUpdateController(this);\n// \tprotected _object = new Scene();\n// \tget object() {\n// \t\treturn this._object;\n// \t}\n// }\n\nexport class SceneAutoUpdateController {\n\tconstructor(protected node: RootManagerNode) {}\n\n\tasync update() {\n\t\tconst scene = this.node.object;\n\t\tconst pv = this.node.pv;\n\n\t\tif (isBooleanTrue(pv.autoUpdate) != scene.matrixWorldAutoUpdate) {\n\t\t\tscene.matrixWorldAutoUpdate = isBooleanTrue(pv.autoUpdate);\n\t\t}\n\t}\n\n\tstatic async update(node: RootManagerNode) {\n\t\tnode.sceneAutoUpdateController.update();\n\t}\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../_Base';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {RootManagerNode} from '../../Root';\n// import {ColorConversion} from '../../../../../core/Color';\nimport {Color} from 'three';\nimport {TypeAssert} from '../../../../poly/Assert';\n\nexport enum BackgroundMode {\n\tNONE = 'none',\n\tCOLOR = 'color',\n\tTEXTURE = 'texture',\n}\nexport const BACKGROUND_MODES: BackgroundMode[] = [BackgroundMode.NONE, BackgroundMode.COLOR, BackgroundMode.TEXTURE];\n\nconst CallbackOptions = {\n\tcook: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tSceneBackgroundController.update(node as RootManagerNode);\n\t},\n};\n\nexport function SceneBackgroundParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t// background\n\t\t/** @param set background mode (none, color or texture). Note that in order to have a transparent background, you also need to set the renderer's alpha to true. In order to do so, you may need to create a rop/WebGLRenderer node, set it alpha parameter, and assign the node to your camera. */\n\t\tbackgroundMode = ParamConfig.INTEGER(BACKGROUND_MODES.indexOf(BackgroundMode.COLOR), {\n\t\t\tmenu: {\n\t\t\t\tentries: BACKGROUND_MODES.map((mode, i) => {\n\t\t\t\t\treturn {name: mode, value: i};\n\t\t\t\t}),\n\t\t\t},\n\t\t\t...CallbackOptions,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param background color */\n\t\tbgColor = ParamConfig.COLOR([0.01, 0.01, 0.01], {\n\t\t\tvisibleIf: {backgroundMode: BACKGROUND_MODES.indexOf(BackgroundMode.COLOR)},\n\t\t\t...CallbackOptions,\n\t\t\t// conversion: ColorConversion.SRGB_TO_LINEAR,\n\t\t});\n\t\t/** @param background texture */\n\t\tbgTexture = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {backgroundMode: BACKGROUND_MODES.indexOf(BackgroundMode.TEXTURE)},\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.COP,\n\t\t\t},\n\t\t\t// dependentOnFoundNode: false,\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param background blur */\n\t\tbgBlur = ParamConfig.FLOAT(0, {\n\t\t\tvisibleIf: {backgroundMode: BACKGROUND_MODES.indexOf(BackgroundMode.TEXTURE)},\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param background intensity */\n\t\tbgIntensity = ParamConfig.FLOAT(1, {\n\t\t\tvisibleIf: {backgroundMode: BACKGROUND_MODES.indexOf(BackgroundMode.TEXTURE)},\n\t\t\trange: [0, 2],\n\t\t\trangeLocked: [true, false],\n\t\t\t...CallbackOptions,\n\t\t});\n\t};\n}\n\nconst CALLBACK_NAME = 'SceneBackgroundController';\nexport class SceneBackgroundController {\n\tconstructor(protected node: RootManagerNode) {}\n\taddHooks() {\n\t\tconst p = this.node.p;\n\t\tconst params = [p.backgroundMode, p.bgColor, p.bgTexture];\n\t\tfor (const param of params) {\n\t\t\tparam.addPostDirtyHook(CALLBACK_NAME, this._updateBound);\n\t\t}\n\t}\n\n\tsetMode(mode: BackgroundMode) {\n\t\tthis.node.p.backgroundMode.set(BACKGROUND_MODES.indexOf(mode));\n\t}\n\tbackgroundMode(): BackgroundMode {\n\t\treturn BACKGROUND_MODES[this.node.pv.backgroundMode];\n\t}\n\tprivate _updateBound = this.update.bind(this);\n\tasync update() {\n\t\tconst backgroundMode = this.backgroundMode();\n\t\tswitch (backgroundMode) {\n\t\t\tcase BackgroundMode.NONE: {\n\t\t\t\treturn this._setBackgroundNone();\n\t\t\t}\n\t\t\tcase BackgroundMode.COLOR: {\n\t\t\t\treturn await this._setBackgroundColor();\n\t\t\t}\n\t\t\tcase BackgroundMode.TEXTURE: {\n\t\t\t\treturn await this._setBackgroundTexture();\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(backgroundMode);\n\t}\n\n\tprivate _setBackgroundNone() {\n\t\tconst scene = this.node.object;\n\t\tscene.background = null;\n\t}\n\tprivate async _setBackgroundColor() {\n\t\tconst scene = this.node.object;\n\t\tconst pv = this.node.pv;\n\t\tawait this.node.p.bgColor.compute();\n\t\tif (scene.background && scene.background instanceof Color) {\n\t\t\tscene.background.copy(pv.bgColor);\n\t\t} else {\n\t\t\tscene.background = pv.bgColor;\n\t\t}\n\t}\n\tprivate async _setBackgroundTexture() {\n\t\tconst scene = this.node.object;\n\t\tconst pv = this.node.pv;\n\t\tconst node = pv.bgTexture.nodeWithContext(NodeContext.COP);\n\t\tif (node) {\n\t\t\tconst container = await node.compute();\n\t\t\tscene.background = container.texture();\n\t\t} else {\n\t\t\tthis.node.states.error.set('bgTexture node not found');\n\t\t\tscene.background = null;\n\t\t}\n\t\tscene.backgroundBlurriness = pv.bgBlur;\n\t\tscene.backgroundIntensity = pv.bgIntensity;\n\t}\n\n\tstatic update(node: RootManagerNode) {\n\t\tnode.sceneBackgroundController.update();\n\t}\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../_Base';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {RootManagerNode} from '../../Root';\nimport {Euler, Vector3} from 'three';\nimport {degToRad} from 'three/src/math/MathUtils';\n\nconst _rotationInDegrees = new Vector3();\nconst _euler = new Euler();\n\nconst CallbackOptions = {\n\tcook: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tSceneEnvController.update(node as RootManagerNode);\n\t},\n};\n\nexport function SceneEnvParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle on to use an environment map */\n\t\tuseEnvironment = ParamConfig.BOOLEAN(0, {\n\t\t\t...CallbackOptions,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param environment map */\n\t\tenvironment = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {useEnvironment: 1},\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.COP,\n\t\t\t},\n\t\t\t// dependentOnFoundNode: false,\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param environment map intensity */\n\t\tenvironmentIntensity = ParamConfig.FLOAT(1, {visibleIf: {useEnvironment: 1}, ...CallbackOptions});\n\t\t/** @param environment map rotation */\n\t\tenvironmentRotation = ParamConfig.VECTOR3([0, 0, 0], {visibleIf: {useEnvironment: 1}, ...CallbackOptions});\n\t};\n}\n\nconst CALLBACK_NAME = 'SceneEnvController';\nexport class SceneEnvController {\n\tconstructor(protected node: RootManagerNode) {}\n\taddHooks() {\n\t\tconst p = this.node.p;\n\t\tconst params = [p.useEnvironment, p.environment];\n\t\tfor (const param of params) {\n\t\t\tparam.addPostDirtyHook(CALLBACK_NAME, this._updateBound);\n\t\t}\n\t}\n\n\tprivate _updateBound = this.update.bind(this);\n\tasync update() {\n\t\tconst scene = this.node.object;\n\t\tconst pv = this.node.pv;\n\n\t\tif (isBooleanTrue(pv.useEnvironment)) {\n\t\t\tconst node = pv.environment.nodeWithContext(NodeContext.COP);\n\t\t\tif (node) {\n\t\t\t\tnode.compute().then((container) => {\n\t\t\t\t\tscene.environment = container.texture();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscene.environment = null;\n\t\t\t\tthis.node.states.error.set('environment node not found');\n\t\t\t}\n\t\t\tscene.environmentIntensity = pv.environmentIntensity;\n\t\t\t_rotationInDegrees.copy(pv.environmentRotation);\n\t\t\tconst x = degToRad(_rotationInDegrees.x);\n\t\t\tconst y = degToRad(_rotationInDegrees.y);\n\t\t\tconst z = degToRad(_rotationInDegrees.z);\n\t\t\t_euler.set(x, y, z);\n\t\t\tscene.environmentRotation.copy(_euler);\n\t\t} else {\n\t\t\tscene.environment = null;\n\t\t}\n\t}\n\n\tstatic async update(node: RootManagerNode) {\n\t\tnode.sceneEnvController.update();\n\t}\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\nimport {Fog} from 'three';\nimport {FogExp2} from 'three';\nimport {ParamsValueAccessorType} from '../../../utils/params/ParamsValueAccessor';\nimport {RootManagerNode} from '../../Root';\n\nconst CallbackOptions = {\n\tcomputeOnDirty: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tSceneFogController.update(node as RootManagerNode);\n\t},\n};\n\nexport enum FogType {\n\tLINEAR = 'linear',\n\tEXPONENTIAL = 'exponential',\n}\nexport const FOG_TYPES: FogType[] = [FogType.LINEAR, FogType.EXPONENTIAL];\n\nexport function SceneFogParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle on to use fog */\n\t\tuseFog = ParamConfig.BOOLEAN(0, {\n\t\t\t...CallbackOptions,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param fog type */\n\t\tfogType = ParamConfig.INTEGER(FOG_TYPES.indexOf(FogType.EXPONENTIAL), {\n\t\t\tvisibleIf: {useFog: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: FOG_TYPES.map((mode, i) => {\n\t\t\t\t\treturn {name: mode, value: i};\n\t\t\t\t}),\n\t\t\t},\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param fog color */\n\t\tfogColor = ParamConfig.COLOR([1, 1, 1], {\n\t\t\tvisibleIf: {useFog: 1},\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param fog near */\n\t\tfogNear = ParamConfig.FLOAT(1, {\n\t\t\trange: [0, 100],\n\t\t\trangeLocked: [true, false],\n\t\t\tvisibleIf: {useFog: 1, fogType: FOG_TYPES.indexOf(FogType.LINEAR)},\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param fog far */\n\t\tfogFar = ParamConfig.FLOAT(100, {\n\t\t\trange: [0, 100],\n\t\t\trangeLocked: [true, false],\n\t\t\tvisibleIf: {useFog: 1, fogType: FOG_TYPES.indexOf(FogType.LINEAR)},\n\t\t\t...CallbackOptions,\n\t\t});\n\t\t/** @param fog density */\n\t\tfogDensity = ParamConfig.FLOAT(0.00025, {\n\t\t\tvisibleIf: {useFog: 1, fogType: FOG_TYPES.indexOf(FogType.EXPONENTIAL)},\n\t\t\t...CallbackOptions,\n\t\t});\n\t};\n}\nclass SceneFogParamsConfig extends SceneFogParamConfig(NodeParamsConfig) {}\n\nexport class SceneFogController {\n\tconstructor(protected node: RootManagerNode) {}\n\tprivate _fog: Fog | undefined;\n\tprivate _fogExp2: FogExp2 | undefined;\n\n\tasync update() {\n\t\tconst scene = this.node.object;\n\t\tconst pv = this.node.pv;\n\n\t\tif (isBooleanTrue(pv.useFog)) {\n\t\t\tif (pv.fogType == FOG_TYPES.indexOf(FogType.LINEAR)) {\n\t\t\t\tconst fog = this.fog2(pv);\n\t\t\t\tscene.fog = fog;\n\t\t\t\tfog.color = pv.fogColor;\n\t\t\t\tfog.near = pv.fogNear;\n\t\t\t\tfog.far = pv.fogFar;\n\t\t\t} else {\n\t\t\t\tconst fogExp2 = this.fogExp2(pv);\n\t\t\t\tscene.fog = this.fogExp2(pv);\n\t\t\t\tfogExp2.color = pv.fogColor;\n\t\t\t\tfogExp2.density = pv.fogDensity;\n\t\t\t}\n\t\t} else {\n\t\t\tconst current_fog = scene.fog;\n\t\t\tif (current_fog) {\n\t\t\t\tscene.fog = null;\n\t\t\t}\n\t\t}\n\t}\n\tfog2(pv: ParamsValueAccessorType<SceneFogParamsConfig>) {\n\t\treturn (this._fog = this._fog || new Fog(0xffffff, pv.fogNear, pv.fogFar));\n\t}\n\tfogExp2(pv: ParamsValueAccessorType<SceneFogParamsConfig>) {\n\t\treturn (this._fogExp2 = this._fogExp2 || new FogExp2(0xffffff, pv.fogDensity));\n\t}\n\n\tstatic async update(node: RootManagerNode) {\n\t\tnode.sceneFogController.update();\n\t}\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../_Base';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {RootManagerNode} from '../../Root';\n\nconst CallbackOptions = {\n\tcomputeOnDirty: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tSceneMaterialOverrideController.update(node as RootManagerNode);\n\t},\n};\n\nexport function SceneMaterialOverrideParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle on to override all materials */\n\t\tuseOverrideMaterial = ParamConfig.BOOLEAN(0, {\n\t\t\t...CallbackOptions,\n\t\t\tseparatorBefore: true,\n\t\t});\n\t\t/** @param material */\n\t\toverrideMaterial = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {useOverrideMaterial: 1},\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.MAT,\n\t\t\t},\n\t\t\tdependentOnFoundNode: false,\n\t\t\t...CallbackOptions,\n\t\t});\n\t};\n}\n// class SceneMaterialOverrideParamsConfig extends SceneMaterialOverrideParamConfig(NodeParamsConfig) {}\n// abstract class SceneMaterialOverrideNode extends TypedNode<any, SceneMaterialOverrideParamsConfig> {\n// \treadonly sceneMaterialOverrideController = new SceneMaterialOverrideController(this);\n// \tprotected _object = new Scene();\n// \tget object() {\n// \t\treturn this._object;\n// \t}\n// }\n\nexport class SceneMaterialOverrideController {\n\tconstructor(protected node: RootManagerNode) {}\n\n\tasync update() {\n\t\tconst scene = this.node.object;\n\t\tconst pv = this.node.pv;\n\n\t\tif (isBooleanTrue(pv.useOverrideMaterial)) {\n\t\t\tconst node = pv.overrideMaterial.nodeWithContext(NodeContext.MAT);\n\t\t\tif (node) {\n\t\t\t\tconst container = await node.compute();\n\t\t\t\tscene.overrideMaterial = container.material();\n\t\t\t} else {\n\t\t\t\tscene.overrideMaterial = null;\n\t\t\t\tthis.node.states.error.set('overrideMaterial node not found');\n\t\t\t}\n\t\t} else {\n\t\t\tscene.overrideMaterial = null;\n\t\t}\n\t}\n\n\tstatic async update(node: RootManagerNode) {\n\t\tnode.sceneMaterialOverrideController.update();\n\t}\n}\n","/**\n * Creates a material for which you can write GLSL code\n *\n *\n */\nimport {ShaderMaterial} from 'three';\nimport {FrontSide} from 'three';\nimport {PrimitiveMatNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {\n\tAdvancedCommonController,\n\tAdvancedCommonParamConfig,\n\tAdvancedCommonControllers,\n} from './utils/AdvancedCommonController';\nimport {\n\tUniformsTransparencyParamConfig,\n\tUniformsTransparencyController,\n\tUniformsTransparencyControllers,\n} from './utils/UniformsTransparencyController';\n\nimport {\n\tWireframeShaderMaterialController,\n\tWireframeShaderMaterialParamsConfig,\n\tWireframeShaderMaterialControllers,\n} from './utils/WireframeShaderMaterialController';\nimport {FogController, FogParamConfig, FogControllers} from './utils/FogController';\nimport {AdvancedFolderParamConfig} from './utils/AdvancedFolder';\nimport {StringParamLanguage} from '../../params/utils/OptionsController';\nimport {Constructor} from '../../../types/GlobalTypes';\nimport {isBooleanTrue} from '../../../core/Type';\n\nexport const VERTEX_DEFAULT = `\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\tvWorldPosition = worldPosition.xyz;\n\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}`;\nconst FRAGMENT_DEFAULT = `\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n\n}`;\n\ninterface CodeControllers\n\textends AdvancedCommonControllers,\n\t\tFogControllers,\n\t\tUniformsTransparencyControllers,\n\t\tWireframeShaderMaterialControllers {}\n\nexport function CodeParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tvertexShader = ParamConfig.FOLDER(null);\n\t\tvertex = ParamConfig.STRING(VERTEX_DEFAULT, {\n\t\t\tlanguage: StringParamLanguage.GLSL,\n\t\t\thideLabel: true,\n\t\t});\n\t\tfragmentShader = ParamConfig.FOLDER(null);\n\t\tfragment = ParamConfig.STRING(FRAGMENT_DEFAULT, {\n\t\t\tlanguage: StringParamLanguage.GLSL,\n\t\t\thideLabel: true,\n\t\t});\n\t\textensions = ParamConfig.FOLDER(null);\n\t\tclipCullDistance = ParamConfig.BOOLEAN(1);\n\t\tmultiDraw = ParamConfig.BOOLEAN(1);\n\t};\n}\n\nclass CodeMatParamsConfig extends FogParamConfig(\n\tWireframeShaderMaterialParamsConfig(\n\t\tAdvancedCommonParamConfig(\n\t\t\tUniformsTransparencyParamConfig(\n\t\t\t\t/* advanced */\n\t\t\t\tAdvancedFolderParamConfig(\n\t\t\t\t\t/* textures */\n\t\t\t\t\tCodeParamConfig(NodeParamsConfig)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t)\n) {}\nconst ParamsConfig = new CodeMatParamsConfig();\n\nexport class CodeMatNode extends PrimitiveMatNode<ShaderMaterial, CodeMatParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'code';\n\t}\n\n\toverride createMaterial() {\n\t\treturn new ShaderMaterial({\n\t\t\tvertexColors: false,\n\t\t\tside: FrontSide,\n\t\t\topacity: 1,\n\t\t});\n\t}\n\treadonly controllers: CodeControllers = {\n\t\tadvancedCommon: new AdvancedCommonController(this),\n\t\tfog: new FogController(this),\n\t\tuniformTransparency: new UniformsTransparencyController(this),\n\t\twireframeShader: new WireframeShaderMaterialController(this),\n\t};\n\tprotected override controllersList = Object.values(this.controllers);\n\n\toverride async cook() {\n\t\tthis._material = this._material || this.createMaterial();\n\t\tawait Promise.all(this.controllersPromises(this._material));\n\n\t\tthis._material.vertexShader = this.pv.vertex;\n\t\tthis._material.fragmentShader = this.pv.fragment;\n\t\tthis._material.extensions.clipCullDistance = isBooleanTrue(this.pv.clipCullDistance);\n\t\tthis._material.extensions.multiDraw = isBooleanTrue(this.pv.multiDraw);\n\t\tthis._material.needsUpdate = true;\n\n\t\tthis.setMaterial(this._material);\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {Material} from 'three';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {FlagsControllerB} from '../utils/FlagsController';\nimport {BaseController, MaterialTexturesRecord, SetParamsTextureNodesRecord} from './utils/_BaseController';\nimport {arrayCompact} from '../../../core/ArrayUtils';\nimport {Poly} from '../../Poly';\n\n/**\n *\n *\n * TypedMatNode is the base class for all nodes that process materials. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\nexport abstract class TypedMatNode<M extends Material, K extends NodeParamsConfig> extends TypedNode<\n\tNodeContext.MAT,\n\tK\n> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.MAT;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tsuper.initializeBaseNode();\n\t\tthis.io.outputs.setHasOneOutput();\n\n\t\tthis.addPostDirtyHook('_cookWhenDirty', () => {\n\t\t\tsetTimeout(this._cookWhenDirtyBound, 0);\n\t\t});\n\t}\n\n\tprotected _cookWhenDirtyBound = this._cookMainWithoutInputsWhenDirty.bind(this);\n\tprotected async _cookMainWithoutInputsWhenDirty() {\n\t\tawait this.cookController.cookMainWithoutInputs();\n\t}\n\n\tabstract material(): Promise<M | undefined>;\n\n\tsetMaterial(material: M) {\n\t\tPoly.onSceneUpdatedHooks.runHooks();\n\t\tthis._setContainer(material);\n\t}\n}\n\nexport abstract class PrimitiveMatNode<M extends Material, K extends NodeParamsConfig> extends TypedMatNode<M, K> {\n\tprotected _material: M | undefined;\n\tabstract createMaterial(): M;\n\t__materialSync__() {\n\t\treturn (this._material = this._material || this.createMaterial());\n\t}\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\t// return this.materialSync();\n\t\treturn container.material() as M;\n\t}\n\toverride initializeBaseNode() {\n\t\tsuper.initializeBaseNode();\n\t\tthis.nameController.add_post_set_fullPath_hook(this.set_material_name.bind(this));\n\t}\n\tprivate set_material_name() {\n\t\tif (this._material) {\n\t\t\tthis._material.name = this.path();\n\t\t}\n\t}\n\toverride setMaterial(material: M) {\n\t\tthis._material = material;\n\t\tsuper.setMaterial(material);\n\t}\n\tgetTextures(material: M, record: MaterialTexturesRecord) {\n\t\tfor (const controller of this.controllersList) {\n\t\t\tcontroller.getTextures(material, record);\n\t\t}\n\t}\n\tsetParamsFromMaterial(material: M, record: SetParamsTextureNodesRecord) {\n\t\tfor (const controller of this.controllersList) {\n\t\t\tcontroller.setParamsFromMaterial(material, record);\n\t\t}\n\t}\n\n\tprotected controllersList: Array<BaseController> = [];\n\tprotected controllersPromises(material: M): Array<void | Promise<void>> {\n\t\tconst promises = this.controllersList.map((controller) => controller.updateMaterial(material));\n\t\tconst compactPromises: Promise<void>[] = [];\n\t\tarrayCompact(promises, compactPromises);\n\t\treturn compactPromises;\n\t}\n\toverride initializeNode() {\n\t\tthis.params.onParamsCreated('init controllers', () => {\n\t\t\tfor (const controller of this.controllersList) {\n\t\t\t\tcontroller.initializeNode();\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport class UpdateMatNode<M extends Material, K extends NodeParamsConfig> extends TypedMatNode<M, K> {\n\tpublic override readonly flags: FlagsControllerB = new FlagsControllerB(this);\n\n\tprotected override _cookWhenDirtyBound = this._cookMainWithoutInputsWhenDirty.bind(this);\n\tprotected override async _cookMainWithoutInputsWhenDirty() {\n\t\tawait this.cookController.cookMain();\n\t}\n\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\treturn container.material() as M | undefined;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tsuper.initializeBaseNode();\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.ALWAYS);\n\t}\n}\n\nexport type BaseMatNodeType = TypedMatNode<Material, any>;\nexport type BasePrimitiveMatNodeType = PrimitiveMatNode<Material, any>;\nexport class BaseMatNodeClass extends TypedMatNode<Material, any> {\n\t// createMaterial() {\n\t// \treturn new Material();\n\t// }\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\treturn container.material() as Material | undefined;\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {\n\tMaterial,\n\tBlending,\n\tNoBlending,\n\tNormalBlending,\n\tAdditiveBlending,\n\tSubtractiveBlending,\n\tMultiplyBlending,\n} from 'three';\nimport {TypedMatNode} from '../_Base';\nimport {BaseController, SetParamsTextureNodesRecord} from './_BaseController';\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../../_Base';\nimport {BaseParamType} from '../../../params/_Base';\nimport {updateMaterialSideWithShadow, updateNodeSideWithShadow} from './helpers/MaterialSideHelper';\nconst BLENDING_VALUES = {\n\tNoBlending,\n\tNormalBlending,\n\tAdditiveBlending,\n\tSubtractiveBlending,\n\tMultiplyBlending,\n};\nconst BLENDING_VALUE_NAMES = Object.keys(BLENDING_VALUES);\n\nexport function AdvancedCommonParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param defines if the material is double sided or not */\n\t\tdoubleSided = ParamConfig.BOOLEAN(0);\n\t\t/** @param if the material is not double sided, it can be front sided, or back sided */\n\t\tfront = ParamConfig.BOOLEAN(1, {visibleIf: {doubleSided: false}});\n\t\t/** @param override the default shadowSide behavior */\n\t\toverrideShadowSide = ParamConfig.BOOLEAN(0);\n\t\t/** @param defines which side(s) are used when rendering shadows */\n\t\tshadowDoubleSided = ParamConfig.BOOLEAN(0, {visibleIf: {overrideShadowSide: true}});\n\t\t/** @param if the material is not double sided, it can be front sided, or back sided, when computing shadows */\n\t\tshadowFront = ParamConfig.BOOLEAN(1, {visibleIf: {overrideShadowSide: true, shadowDoubleSided: false}});\n\t\t/** @param defines if the objects using this material will be rendered in the color buffer. Setting it to false can have those objects occlude the ones behind */\n\t\tcolorWrite = ParamConfig.BOOLEAN(1, {\n\t\t\tseparatorBefore: true,\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tAdvancedCommonController.update(node as AdvancedCommonMapMatNode);\n\t\t\t},\n\t\t});\n\t\t/** @param defines if the objects using this material will be rendered in the depth buffer. This can often help transparent objects */\n\t\tdepthWrite = ParamConfig.BOOLEAN(1, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tAdvancedCommonController.update(node as AdvancedCommonMapMatNode);\n\t\t\t},\n\t\t});\n\t\t/** @param toggle depth test */\n\t\tdepthTest = ParamConfig.BOOLEAN(1, {\n\t\t\tcook: false,\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tAdvancedCommonController.update(node as AdvancedCommonMapMatNode);\n\t\t\t},\n\t\t});\n\t\t/** @param premultipliedAlpha */\n\t\tpremultipliedAlpha = ParamConfig.BOOLEAN(false, {\n\t\t\tseparatorAfter: true,\n\t\t});\n\t\t/** @param blending */\n\t\tblending = ParamConfig.INTEGER(NormalBlending, {\n\t\t\tmenu: {\n\t\t\t\tentries: BLENDING_VALUE_NAMES.map((name) => {\n\t\t\t\t\treturn {name: name, value: (BLENDING_VALUES as any)[name]};\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t\t/** @param dithering, which can be useful when using postprocessing and banding appears on some objects */\n\t\tdithering = ParamConfig.BOOLEAN(0);\n\t\t/** @param activate polygon offset */\n\t\tpolygonOffset = ParamConfig.BOOLEAN(false, {separatorBefore: true});\n\t\tpolygonOffsetFactor = ParamConfig.INTEGER(0, {range: [0, 1000], visibleIf: {polygonOffset: 1}});\n\t\tpolygonOffsetUnits = ParamConfig.INTEGER(0, {range: [0, 1000], visibleIf: {polygonOffset: 1}});\n\t};\n}\n\nclass AdvancedCommonParamsConfig extends AdvancedCommonParamConfig(NodeParamsConfig) {}\nexport interface AdvancedCommonControllers {\n\tadvancedCommon: AdvancedCommonController;\n}\nabstract class AdvancedCommonMapMatNode extends TypedMatNode<Material, AdvancedCommonParamsConfig> {\n\tcontrollers!: AdvancedCommonControllers;\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\treturn container.material() as Material | undefined;\n\t}\n}\n\nexport class AdvancedCommonController extends BaseController {\n\tconstructor(protected override node: AdvancedCommonMapMatNode) {\n\t\tsuper(node);\n\t}\n\n\tstatic async update(node: AdvancedCommonMapMatNode) {\n\t\tconst material = await node.material();\n\t\tif (!material) {\n\t\t\treturn;\n\t\t}\n\t\tnode.controllers.advancedCommon.updateMaterial(material);\n\t}\n\toverride updateMaterial(material: Material) {\n\t\tconst pv = this.node.pv;\n\t\tupdateMaterialSideWithShadow(material, pv);\n\n\t\tmaterial.colorWrite = pv.colorWrite;\n\t\tmaterial.depthWrite = pv.depthWrite;\n\t\tmaterial.depthTest = pv.depthTest;\n\t\tmaterial.blending = pv.blending as Blending;\n\t\tmaterial.premultipliedAlpha = pv.premultipliedAlpha;\n\t\tmaterial.dithering = pv.dithering;\n\t\tmaterial.polygonOffset = pv.polygonOffset;\n\t\tif (material.polygonOffset) {\n\t\t\tmaterial.polygonOffsetFactor = pv.polygonOffsetFactor;\n\t\t\tmaterial.polygonOffsetUnits = pv.polygonOffsetUnits;\n\t\t\tmaterial.needsUpdate = true;\n\t\t}\n\t}\n\n\toverride setParamsFromMaterial(material: Material, record: SetParamsTextureNodesRecord) {\n\t\tconst p = this.node.p;\n\t\tupdateNodeSideWithShadow(material, p);\n\n\t\tp.colorWrite.set(material.colorWrite);\n\t\tp.depthWrite.set(material.depthWrite);\n\t\tp.depthTest.set(material.depthTest);\n\t\tp.blending.set(material.blending);\n\t\tp.premultipliedAlpha.set(material.premultipliedAlpha);\n\t\tp.dithering.set(material.dithering);\n\t\tp.polygonOffset.set(material.polygonOffset);\n\t\tif (material.polygonOffset) {\n\t\t\tp.polygonOffsetFactor.set(material.polygonOffsetFactor);\n\t\t\tp.polygonOffsetUnits.set(material.polygonOffsetUnits);\n\t\t}\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {ParamConfig} from '../../utils/params/ParamsConfig';\nexport function AdvancedFolderParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tadvanced = ParamConfig.FOLDER(null);\n\t};\n}\n","import type {Material, ShaderMaterial} from 'three';\nimport {Constructor} from '../../../../types/GlobalTypes';\nimport {BaseController} from './_BaseController';\nimport {TypedMatNode} from '../_Base';\nimport {\n\tMeshPhysicalMaterial,\n\tMeshToonMaterial,\n\tMeshStandardMaterial,\n\tMeshPhongMaterial,\n\tMeshMatcapMaterial,\n\tMeshLambertMaterial,\n\tMeshBasicMaterial,\n} from 'three';\n\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../core/BooleanValue';\n\nexport interface FogControllers {\n\tfog: FogController;\n}\n\nexport function FogParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle on if you have a fog in the scene and the material should be affected by it */\n\t\tuseFog = ParamConfig.BOOLEAN(0);\n\t};\n}\ntype FoggableMaterial =\n\t| ShaderMaterial\n\t| MeshToonMaterial\n\t| MeshStandardMaterial\n\t| MeshPhysicalMaterial\n\t| MeshPhongMaterial\n\t| MeshMatcapMaterial\n\t| MeshLambertMaterial\n\t| MeshBasicMaterial;\nexport function isValidMaterial(material?: Material): material is FoggableMaterial {\n\tif (!material) {\n\t\treturn false;\n\t}\n\treturn (material as MeshBasicMaterial).fog != null;\n}\nclass FogParamsConfig extends FogParamConfig(NodeParamsConfig) {}\nabstract class FogMatNode extends TypedMatNode<FoggableMaterial, FogParamsConfig> {\n\tcontrollers!: FogControllers;\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\treturn container.material() as FoggableMaterial | undefined;\n\t}\n}\n\nexport class FogController extends BaseController {\n\tconstructor(protected override node: FogMatNode) {\n\t\tsuper(node);\n\t}\n\tstatic async update(node: FogMatNode) {\n\t\tconst container = await node.compute();\n\t\tconst material = container.material();\n\t\tif (!isValidMaterial(material)) {\n\t\t\treturn;\n\t\t}\n\t\tnode.controllers.fog.updateMaterial(material);\n\t}\n\toverride updateMaterial(material: FoggableMaterial) {\n\t\tconst pv = this.node.pv;\n\t\tmaterial.fog = isBooleanTrue(pv.useFog);\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {BaseController} from './_BaseController';\nimport {TypedMatNode} from '../_Base';\nimport {Material} from 'three';\nimport {ShaderMaterial} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {CustomMaterialName, ShaderMaterialWithCustomMaterials} from '../../../../core/geometry/Material';\nimport {isBooleanTrue} from '../../../../core/BooleanValue';\nimport {ParamsValueAccessorType} from '../../utils/params/ParamsValueAccessor';\n\nexport interface UniformsTransparencyControllers {\n\tuniformTransparency: UniformsTransparencyController;\n}\nexport function UniformsTransparencyParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param sets the material to transparent */\n\t\ttransparent = ParamConfig.BOOLEAN(0);\n\t\t/** @param sets the material opacity */\n\t\topacity = ParamConfig.FLOAT(1);\n\t\t/** @param sets the min alpha below which the material is invisible */\n\t\talphaTest = ParamConfig.FLOAT(0);\n\t};\n}\n\ntype TransparencyMaterial = Material;\n// class TransparencyMaterial extends Material {\n// \t// transparent!: boolean;\n// \t// depthTest!: boolean;\n// \t// alphaTest!: number;\n// \t// uniforms!: IUniforms;\n// }\nclass TransparencyParamsConfig extends UniformsTransparencyParamConfig(NodeParamsConfig) {}\n\nclass TransparencyMatNode extends TypedMatNode<TransparencyMaterial, TransparencyParamsConfig> {\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\treturn container.material() as TransparencyMaterial | undefined;\n\t}\n\tcontrollers!: UniformsTransparencyControllers;\n}\n\nexport class UniformsTransparencyController extends BaseController {\n\tconstructor(protected override node: TransparencyMatNode) {\n\t\tsuper(node);\n\t}\n\tstatic async update(node: TransparencyMatNode) {\n\t\tconst material = await node.material();\n\t\tif (!material) {\n\t\t\treturn;\n\t\t}\n\t\tnode.controllers.uniformTransparency.updateMaterial(material);\n\t}\n\toverride updateMaterial(material: TransparencyMaterial) {\n\t\tconst pv = this.node.pv;\n\n\t\tthis._updateTransparency(material, pv);\n\t}\n\n\tprivate _updateTransparency(mat: TransparencyMaterial, pv: ParamsValueAccessorType<TransparencyParamsConfig>) {\n\t\t// transparent is currently only changed for the main material,\n\t\t// not for the customMaterials,\n\t\t// as that currently makes them disappear.\n\t\t// Also, we do not use the alternative condition  || pv.opacity < 1;\n\t\t// to set a material transparent, as this can be useful to have those params independent,\n\t\t// especially for shadow materials\n\t\tmat.transparent = isBooleanTrue(pv.transparent);\n\t\tthis._updateCommon(mat, pv);\n\t}\n\tprivate _updateCommon(mat: TransparencyMaterial, pv: ParamsValueAccessorType<TransparencyParamsConfig>) {\n\t\tconst shaderMaterial = mat as ShaderMaterial;\n\n\t\tif (shaderMaterial.uniforms && shaderMaterial.uniforms.opacity) {\n\t\t\tshaderMaterial.uniforms.opacity.value = pv.opacity;\n\t\t}\n\t\tmat.opacity = pv.opacity;\n\n\t\tif (shaderMaterial.uniforms && shaderMaterial.uniforms.alphaTest) {\n\t\t\tshaderMaterial.uniforms.alphaTest.value = pv.alphaTest;\n\t\t}\n\t\tmat.alphaTest = pv.alphaTest;\n\n\t\tconst customMaterials = (mat as ShaderMaterialWithCustomMaterials).customMaterials;\n\t\tif (customMaterials) {\n\t\t\tconst customNames: CustomMaterialName[] = Object.keys(customMaterials) as CustomMaterialName[];\n\t\t\tfor (const customName of customNames) {\n\t\t\t\tconst customMaterial = customMaterials[customName];\n\t\t\t\tif (customMaterial) {\n\t\t\t\t\tthis._updateCommon(customMaterial as ShaderMaterial, pv);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {BaseController} from './_BaseController';\nimport {TypedMatNode} from '../_Base';\nimport {Material} from 'three';\nimport {ShaderMaterial} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../core/BooleanValue';\n\nexport interface WireframeShaderMaterialControllers {\n\twireframeShader: WireframeShaderMaterialController;\n}\n\nexport function WireframeShaderMaterialParamsConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle on to set material to wireframe */\n\t\twireframe = ParamConfig.BOOLEAN(0);\n\t\t/** @param wireframe line width */\n\t\twireframeLinewidth = ParamConfig.FLOAT(1, {\n\t\t\trange: [0, 5],\n\t\t\trangeLocked: [true, false],\n\t\t\tvisibleIf: {wireframe: 1},\n\t\t});\n\t};\n}\n\nclass WireframeShaderParamsConfig extends WireframeShaderMaterialParamsConfig(NodeParamsConfig) {}\nclass WireframedShaderMatNode extends TypedMatNode<Material, WireframeShaderParamsConfig> {\n\tasync material() {\n\t\tconst container = await this.compute();\n\t\treturn container.material() as Material | undefined;\n\t}\n\tcontrollers!: WireframeShaderMaterialControllers;\n}\n\nexport class WireframeShaderMaterialController extends BaseController {\n\tconstructor(protected override node: WireframedShaderMatNode) {\n\t\tsuper(node);\n\t}\n\tstatic async update(node: WireframedShaderMatNode) {\n\t\tconst material = await node.material();\n\t\tif (!material) {\n\t\t\treturn;\n\t\t}\n\t\tnode.controllers.wireframeShader.updateMaterial(material);\n\t}\n\toverride updateMaterial(material: Material) {\n\t\tconst pv = this.node.pv;\n\n\t\tconst shaderMaterial = material as ShaderMaterial;\n\t\tif (shaderMaterial.wireframe != null) {\n\t\t\tshaderMaterial.wireframe = isBooleanTrue(pv.wireframe);\n\t\t\tshaderMaterial.wireframeLinewidth = pv.wireframeLinewidth;\n\t\t\tshaderMaterial.needsUpdate = true;\n\t\t}\n\t}\n}\n","import {Material, Texture} from 'three';\nimport {BaseCopNodeType} from '../../cop/_Base';\nimport {BaseNodeType} from '../../_Base';\n\nexport type MaterialTexturesRecord = Map<string, Texture | null>;\nexport type SetParamsTextureNodesRecord = Map<string, BaseCopNodeType>;\nexport abstract class BaseController {\n\tconstructor(protected node: BaseNodeType) {}\n\t// add_params() {}\n\n\tinitializeNode() {}\n\tabstract updateMaterial(material: Material): void | Promise<void>;\n\tsetParamsFromMaterial(material: Material, record: SetParamsTextureNodesRecord) {}\n\tgetTextures(material: Material, record: MaterialTexturesRecord) {}\n\n\t// get material() {\n\t// \treturn this.node.material;\n\t// }\n}\n","import {Material} from 'three';\nimport {isBooleanTrue} from '../../../../../core/Type';\nimport {FrontSide, BackSide, DoubleSide} from 'three';\nimport {CustomMaterialName, MaterialWithCustomMaterials} from '../../../../../core/geometry/Material';\nimport {BooleanParam} from '../../../../params/Boolean';\n\ninterface SideUpdateParamValues {\n\tdoubleSided: boolean;\n\tfront: boolean;\n}\ninterface SideUpdateParams {\n\tdoubleSided: BooleanParam;\n\tfront: BooleanParam;\n}\n\ninterface SideWithShadowUpdateParamValues extends SideUpdateParamValues {\n\toverrideShadowSide: boolean;\n\tshadowDoubleSided: boolean;\n\tshadowFront: boolean;\n}\ninterface SideWithShadowUpdateParams extends SideUpdateParams {\n\toverrideShadowSide: BooleanParam;\n\tshadowDoubleSided: BooleanParam;\n\tshadowFront: BooleanParam;\n}\nexport function updateMaterialSide(mat: Material, params: SideUpdateParamValues) {\n\t// normal render\n\tconst singleSide = isBooleanTrue(params.front) ? FrontSide : BackSide;\n\tconst newSide = isBooleanTrue(params.doubleSided) ? DoubleSide : singleSide;\n\tif (newSide != mat.side) {\n\t\tmat.side = newSide;\n\t\tmat.forceSinglePass = !isBooleanTrue(params.doubleSided);\n\t\tmat.needsUpdate = true;\n\t}\n}\nfunction updateNodeSide(mat: Material, params: SideUpdateParams) {\n\tswitch (mat.side) {\n\t\tcase FrontSide: {\n\t\t\tparams.doubleSided.set(false);\n\t\t\tparams.front.set(true);\n\t\t\treturn;\n\t\t}\n\t\tcase BackSide: {\n\t\t\tparams.doubleSided.set(false);\n\t\t\tparams.front.set(false);\n\t\t\treturn;\n\t\t}\n\t\tcase DoubleSide: {\n\t\t\tparams.doubleSided.set(true);\n\t\t\tparams.front.set(true);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function updateMaterialSideWithShadow(mat: Material, params: SideWithShadowUpdateParamValues) {\n\t// normal render\n\tupdateMaterialSide(mat, params);\n\t// shadow render\n\tif (isBooleanTrue(params.overrideShadowSide)) {\n\t\tconst singleSide = isBooleanTrue(params.shadowFront) ? FrontSide : BackSide;\n\t\tconst newSide = isBooleanTrue(params.shadowDoubleSided) ? DoubleSide : singleSide;\n\t\tif (newSide != mat.shadowSide) {\n\t\t\tmat.shadowSide = newSide;\n\t\t\tmat.needsUpdate = true;\n\t\t}\n\t} else {\n\t\t/* TODO: update types */\n\t\t(mat as any).shadowSide = null;\n\t}\n\n\tconst customMaterials = (mat as MaterialWithCustomMaterials).customMaterials;\n\tif (customMaterials) {\n\t\tconst customNames: CustomMaterialName[] = Object.keys(customMaterials) as CustomMaterialName[];\n\t\tfor (const customName of customNames) {\n\t\t\tconst customMaterial = customMaterials[customName];\n\t\t\tif (customMaterial) {\n\t\t\t\tupdateMaterialSideWithShadow(customMaterial, params);\n\t\t\t}\n\t\t}\n\t}\n}\nexport function updateNodeSideWithShadow(mat: Material, params: SideWithShadowUpdateParams) {\n\t// normal render\n\tupdateNodeSide(mat, params);\n\t// shadow render\n\tif (mat.shadowSide != null) {\n\t\tparams.overrideShadowSide.set(true);\n\t\tswitch (mat.shadowSide) {\n\t\t\tcase FrontSide: {\n\t\t\t\tparams.shadowDoubleSided.set(false);\n\t\t\t\tparams.shadowFront.set(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase BackSide: {\n\t\t\t\tparams.shadowDoubleSided.set(false);\n\t\t\t\tparams.shadowFront.set(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase DoubleSide: {\n\t\t\t\tparams.shadowDoubleSided.set(true);\n\t\t\t\tparams.shadowFront.set(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst customMaterials = (mat as MaterialWithCustomMaterials).customMaterials;\n\tif (customMaterials) {\n\t\tconst customNames: CustomMaterialName[] = Object.keys(customMaterials) as CustomMaterialName[];\n\t\tfor (const customName of customNames) {\n\t\t\tconst customMaterial = customMaterials[customName];\n\t\t\tif (customMaterial) {\n\t\t\t\tupdateNodeSideWithShadow(customMaterial, params);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {DisplayNodeController} from '../../utils/DisplayNodeController';\nimport {ObjChildrenDisplayController} from './ObjChildrenDisplayController';\nimport {TesselationParamsObjNode} from './TesselationParams';\nimport {CoreGroup} from '../../../../core/geometry/Group';\nimport {Poly} from '../../../Poly';\nimport {BaseSopNodeType} from '../../sop/_Base';\n\ninterface BaseObjNodeClassWithDisplayNode extends TesselationParamsObjNode {\n\tdisplayNodeController: DisplayNodeController;\n}\n\nexport class ChildrenDisplayControllerSpecialized extends ObjChildrenDisplayController {\n\tconstructor(protected override node: BaseObjNodeClassWithDisplayNode) {\n\t\tsuper(node);\n\t}\n\n\toverride _addSpecializedObjects(displayNode: BaseSopNodeType, coreGroup: CoreGroup, newObjects: Object3D[]) {\n\t\tconst _newObjectsAreDifferent = Poly.specializedChildren.runHooks(\n\t\t\tdisplayNode,\n\t\t\tcoreGroup,\n\t\t\tnewObjects,\n\t\t\tthis.node.pv\n\t\t);\n\t\tif (_newObjectsAreDifferent) {\n\t\t\tthis._newObjectsAreDifferent = _newObjectsAreDifferent;\n\t\t}\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {TypedObjNode} from '../_Base';\nimport {Object3D} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {OBJCADTesselationParamConfig} from '../../../../core/geometry/modules/cad/utils/TesselationParamsConfig';\nimport {OBJCSGTesselationParamConfig} from '../../../../core/geometry/modules/csg/utils/TesselationParamsConfig';\nimport {OBJQUADTesselationParamConfig} from '../../../../core/geometry/modules/quad/utils/TesselationParamsConfig';\n// import {OBJSDFTesselationParamConfig} from '../../../../core/geometry/modules/sdf/utils/TesselationParamsConfig';\nimport {OBJTetTesselationParamConfig} from '../../../../core/geometry/modules/tet/utils/TesselationParamsConfig';\n\nexport function ObjCADTesselationFolderParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tCAD = ParamConfig.FOLDER();\n\t};\n}\nexport function ObjCSGTesselationFolderParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tCSG = ParamConfig.FOLDER();\n\t};\n}\nexport function ObjQUADTesselationFolderParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tQUAD = ParamConfig.FOLDER();\n\t};\n}\n// export function ObjSDFTesselationFolderParamConfig<TBase extends Constructor>(Base: TBase) {\n// \treturn class Mixin extends Base {\n// \t\tSDF = ParamConfig.FOLDER();\n// \t};\n// }\nexport function ObjTetTesselationFolderParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tTET = ParamConfig.FOLDER();\n\t};\n}\nexport function ObjTesselationParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin //OBJSDFTesselationParamConfig(\n\t\t//ObjSDFTesselationFolderParamConfig(\n\t\textends OBJTetTesselationParamConfig(\n\t\t\tObjTetTesselationFolderParamConfig(\n\t\t\t\tOBJQUADTesselationParamConfig(\n\t\t\t\t\tObjQUADTesselationFolderParamConfig(\n\t\t\t\t\t\tOBJCSGTesselationParamConfig(\n\t\t\t\t\t\t\tObjCSGTesselationFolderParamConfig(\n\t\t\t\t\t\t\t\tOBJCADTesselationParamConfig(ObjCADTesselationFolderParamConfig(Base))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t//\t\t)\n\t\t\t\t\t//)\n\t\t\t\t)\n\t\t\t)\n\t\t) {};\n}\nclass TesselationParamParamsConfig extends ObjTesselationParamConfig(NodeParamsConfig) {}\nexport class TesselationParamsObjNode extends TypedObjNode<Object3D, TesselationParamParamsConfig> {}\n","/**\n * Parent for SOP nodes\n *\n * @remarks\n * This node also has its own transforms. And if it is set as input of other nodes, their objects will be added as children to the object of this node.\n *\n */\nimport {TypedObjNode} from './_Base';\nimport {Group} from 'three';\nimport {BaseNodeType} from '../_Base';\nimport {DisplayNodeController} from '../utils/DisplayNodeController';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {BaseSopNodeType} from '../sop/_Base';\nimport {GeoNodeChildrenMap} from '../../poly/registers/nodes/Sop';\nimport {FlagsControllerD} from '../utils/FlagsController';\nimport {HierarchyController} from './utils/HierarchyController';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {ChildrenDisplayControllerSpecialized} from './utils/ChildrenDisplayControllerSpecialized';\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {ObjType} from '../../poly/registers/nodes/types/Obj';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {TransformedParamConfig, TransformController} from './utils/TransformController';\nimport {ObjTesselationParamConfig} from './utils/TesselationParams';\nimport {addCADTesselationParamsCallback} from '../../../core/geometry/modules/cad/utils/TesselationParamsConfig';\nimport {addCSGTesselationParamsCallback} from '../../../core/geometry/modules/csg/utils/TesselationParamsConfig';\nimport {addQUADTesselationParamsCallback} from '../../../core/geometry/modules/quad/utils/TesselationParamsConfig';\n// import {addSDFTesselationParamsCallback} from '../../../core/geometry/modules/sdf/utils/TesselationParamsConfig';\nimport {addTetTesselationParamsCallback} from '../../../core/geometry/modules/tet/utils/TesselationParamsConfig';\n\nexport function GeoParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param toggle off to hide */\n\t\tdisplay = ParamConfig.BOOLEAN(1);\n\t\t/** @param set render order */\n\t\trenderOrder = ParamConfig.INTEGER(0, {\n\t\t\trange: [0, 10],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\nclass GeoObjParamConfig extends ObjTesselationParamConfig(GeoParamConfig(TransformedParamConfig(NodeParamsConfig))) {}\nconst ParamsConfig = new GeoObjParamConfig();\n\nexport class GeoObjNode extends TypedObjNode<Group, GeoObjParamConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn ObjType.GEO;\n\t}\n\toverride readonly hierarchyController: HierarchyController = new HierarchyController(this);\n\toverride readonly transformController: TransformController = new TransformController(this);\n\tpublic override readonly flags: FlagsControllerD = new FlagsControllerD(this);\n\toverride createObject() {\n\t\tconst group = new Group();\n\t\tgroup.matrixAutoUpdate = false;\n\t\treturn group;\n\t}\n\n\t// display_node and children_display controllers\n\tpublic override readonly childrenDisplayController: ChildrenDisplayControllerSpecialized =\n\t\tnew ChildrenDisplayControllerSpecialized(this);\n\tpublic override readonly displayNodeController: DisplayNodeController = new DisplayNodeController(\n\t\tthis,\n\t\tthis.childrenDisplayController.displayNodeControllerCallbacks()\n\t);\n\t//\n\n\tprotected override _childrenControllerContext = NodeContext.SOP;\n\n\tprivate _onChildAddBound = this._onChildAdd.bind(this);\n\toverride initializeNode() {\n\t\t// this.lifecycle.onCreated(this._on_create_bound);\n\t\tthis.lifecycle.onChildAdd(this._onChildAddBound);\n\n\t\tthis.hierarchyController.initializeNode();\n\t\tthis.transformController.initializeNode();\n\n\t\tthis.childrenDisplayController.initializeNode();\n\n\t\tconst _updateSpecializedChildren = () => {\n\t\t\tthis.childrenDisplayController.requestDisplayNodeContainer();\n\t\t};\n\t\taddCADTesselationParamsCallback(this, _updateSpecializedChildren);\n\t\taddCSGTesselationParamsCallback(this, _updateSpecializedChildren);\n\t\taddQUADTesselationParamsCallback(this, _updateSpecializedChildren);\n\t\t// addSDFTesselationParamsCallback(this, _updateSpecializedChildren);\n\t\taddTetTesselationParamsCallback(this, _updateSpecializedChildren);\n\t}\n\n\t// override isDisplayNodeCooking(): boolean {\n\t// \tif (this.flags.display.active()) {\n\t// \t\tconst displayNode = this.displayNodeController.displayNode();\n\t// \t\treturn displayNode ? displayNode.isDirty() : false;\n\t// \t} else {\n\t// \t\treturn false;\n\t// \t}\n\t// }\n\n\toverride createNode<S extends keyof GeoNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): GeoNodeChildrenMap[S];\n\toverride createNode<K extends valueof<GeoNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<GeoNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseSopNodeType[];\n\t}\n\toverride nodesByType<K extends keyof GeoNodeChildrenMap>(type: K): GeoNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as GeoNodeChildrenMap[K][];\n\t}\n\n\t//\n\t//\n\t// HOOK\n\t//\n\t//\n\tprivate _onChildAdd(node: BaseNodeType) {\n\t\tif (this.scene().loadingController.loaded()) {\n\t\t\tif (this.children().length == 1) {\n\t\t\t\tnode.flags?.display?.set(true);\n\t\t\t}\n\t\t}\n\t}\n\n\t//\n\t//\n\t// COOK\n\t//\n\t//\n\toverride cook() {\n\t\tthis.transformController.update();\n\t\tthis.object.visible = isBooleanTrue(this.pv.display);\n\t\tthis.object.renderOrder = this.pv.renderOrder;\n\t\tthis.cookController.endCook();\n\t}\n}\n","/**\n * Creates an orthographic camera.\n *\n *\n */\nimport {OrthographicCamera} from 'three';\nimport {TypedThreejsCameraObjNode, ThreejsCameraTransformParamConfig, CameraMainCameraParamConfig} from './_BaseCamera';\n\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {CameraRenderParamConfig} from './utils/cameras/RenderController';\nimport {LayerParamConfig} from './utils/LayersController';\nimport {TransformedParamConfig} from './utils/TransformController';\nimport {CameraNodeType} from '../../poly/NodeContext';\nimport {CameraPostProcessParamConfig} from './utils/cameras/PostProcessParamOptions';\nimport {\n\tOrthographicCameraParamConfigMixin,\n\tORTHOGRAPHIC_CAMERA_DEFAULT,\n\tregisterOrthographicCamera,\n} from '../../../core/camera/CoreOrthographicCamera';\nimport {CORE_CAMERA_DEFAULT} from '../../../core/camera/CoreCamera';\nimport {CoreCameraFrameParamConfig} from '../../../core/camera/CoreCameraFrameMode';\nimport {OrthographicCameraSopOperation} from '../../operations/sop/OrthographicCamera';\nimport {OnNodeRegisterCallback} from '../../poly/registers/nodes/NodesRegister';\n\nclass OrthographicCameraObjParamConfig extends CameraPostProcessParamConfig(\n\tCameraRenderParamConfig(\n\t\tLayerParamConfig(\n\t\t\tCameraMainCameraParamConfig(\n\t\t\t\tCoreCameraFrameParamConfig(\n\t\t\t\t\tOrthographicCameraParamConfigMixin(\n\t\t\t\t\t\tThreejsCameraTransformParamConfig(\n\t\t\t\t\t\t\tTransformedParamConfig(NodeParamsConfig, {matrixAutoUpdate: true})\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t)\n) {}\nconst ParamsConfig = new OrthographicCameraObjParamConfig();\n\nexport class OrthographicCameraObjNode extends TypedThreejsCameraObjNode<\n\tOrthographicCamera,\n\tOrthographicCameraObjParamConfig\n> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<CameraNodeType.ORTHOGRAPHIC> {\n\t\treturn CameraNodeType.ORTHOGRAPHIC;\n\t}\n\tstatic override onRegister: OnNodeRegisterCallback = registerOrthographicCamera;\n\n\toverride createObject() {\n\t\tconst camera = OrthographicCameraSopOperation.createCamera(\n\t\t\t{\n\t\t\t\tsize: this.pv.size,\n\t\t\t\t...CORE_CAMERA_DEFAULT,\n\t\t\t},\n\t\t\tthis\n\t\t);\n\t\tOrthographicCameraSopOperation.setCameraAttributes(camera, {size: this.pv.size});\n\t\treturn camera;\n\t\t// return new OrthographicCamera(\n\t\t// \tORTHOGRAPHIC_CAMERA_DEFAULT.left * 2,\n\t\t// \tORTHOGRAPHIC_CAMERA_DEFAULT.right * 2,\n\t\t// \tORTHOGRAPHIC_CAMERA_DEFAULT.top * 2,\n\t\t// \tORTHOGRAPHIC_CAMERA_DEFAULT.bottom * 2,\n\t\t// \tCORE_CAMERA_DEFAULT.near,\n\t\t// \tCORE_CAMERA_DEFAULT.far\n\t\t// );\n\t}\n\n\toverride updateCamera() {\n\t\tconst {size} = this.pv;\n\t\tthis._object.left = ORTHOGRAPHIC_CAMERA_DEFAULT.left * size;\n\t\tthis._object.right = ORTHOGRAPHIC_CAMERA_DEFAULT.right * size;\n\t\tthis._object.top = ORTHOGRAPHIC_CAMERA_DEFAULT.top * size;\n\t\tthis._object.bottom = ORTHOGRAPHIC_CAMERA_DEFAULT.bottom * size;\n\n\t\tOrthographicCameraSopOperation.setCameraAttributes(this._object, this.pv);\n\n\t\t// this._updateForAspectRatio();\n\n\t\tthis._object.updateProjectionMatrix();\n\t}\n\n\t// protected override _updateForAspectRatio() {\n\t// \tCoreCameraOrthographicFrameMode.updateCameraAspect(this._object, this._aspect);\n\t// }\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nexport function CameraWebXRParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param allows this camera to be used in AR (augmented reality) or VR (virtual reality) */\n\t\tuseWebXR = ParamConfig.BOOLEAN(0);\n\t\t/** @param activates AR (augmented reality) */\n\t\tuseAR = ParamConfig.BOOLEAN(1, {\n\t\t\tvisibleIf: {useWebXR: 1},\n\t\t});\n\t\t/** @param activates VR (virtual reality) */\n\t\tuseVR = ParamConfig.BOOLEAN(1, {\n\t\t\tvisibleIf: {useWebXR: 1},\n\t\t});\n\t};\n}\n","/**\n * Creates a perspective camera.\n *\n *\n */\nimport {PerspectiveCamera} from 'three';\nimport {TypedThreejsCameraObjNode, ThreejsCameraTransformParamConfig, CameraMainCameraParamConfig} from './_BaseCamera';\n\n// const EVENT_CHANGE = { type: 'change' };\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {CameraRenderParamConfig} from './utils/cameras/RenderController';\nimport {LayerParamConfig} from './utils/LayersController';\nimport {TransformedParamConfig} from './utils/TransformController';\nimport {CameraNodeType} from '../../poly/NodeContext';\nimport {CameraPostProcessParamConfig} from './utils/cameras/PostProcessParamOptions';\nimport {\n\tPerspectiveCameraParamConfigMixin,\n\tPERSPECTIVE_CAMERA_DEFAULT,\n\tregisterPerspectiveCamera,\n} from '../../../core/camera/CorePerspectiveCamera';\nimport {CORE_CAMERA_DEFAULT} from '../../../core/camera/CoreCamera';\nimport {CoreCameraFrameParamConfig} from '../../../core/camera/CoreCameraFrameMode';\nimport {PerspectiveCameraSopOperation} from '../../operations/sop/PerspectiveCamera';\nimport {OnNodeRegisterCallback} from '../../poly/registers/nodes/NodesRegister';\nimport {CameraWebXRParamConfig} from './utils/cameras/WebXRParamOptions';\nimport {CameraWebXRARSopOperation} from '../../operations/sop/CameraWebXRAR';\nimport {CameraWebXRVRSopOperation} from '../../operations/sop/CameraWebXRVR';\n\nclass PerspectiveCameraObjParamConfig extends CameraWebXRParamConfig(\n\tCameraPostProcessParamConfig(\n\t\tCameraRenderParamConfig(\n\t\t\tLayerParamConfig(\n\t\t\t\tCameraMainCameraParamConfig(\n\t\t\t\t\tCoreCameraFrameParamConfig(\n\t\t\t\t\t\tPerspectiveCameraParamConfigMixin(\n\t\t\t\t\t\t\tThreejsCameraTransformParamConfig(\n\t\t\t\t\t\t\t\tTransformedParamConfig(NodeParamsConfig, {matrixAutoUpdate: true})\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t)\n) {}\nconst ParamsConfig = new PerspectiveCameraObjParamConfig();\n\nexport class PerspectiveCameraObjNode extends TypedThreejsCameraObjNode<\n\tPerspectiveCamera,\n\tPerspectiveCameraObjParamConfig\n> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<CameraNodeType.PERSPECTIVE> {\n\t\treturn CameraNodeType.PERSPECTIVE;\n\t}\n\tstatic override onRegister: OnNodeRegisterCallback = registerPerspectiveCamera;\n\n\toverride createObject() {\n\t\tconst camera = PerspectiveCameraSopOperation.createCamera(\n\t\t\t{\n\t\t\t\t...PERSPECTIVE_CAMERA_DEFAULT,\n\t\t\t\t...CORE_CAMERA_DEFAULT,\n\t\t\t},\n\t\t\tthis\n\t\t);\n\t\tPerspectiveCameraSopOperation.setCameraAttributes(camera, {fov: PERSPECTIVE_CAMERA_DEFAULT.fov});\n\n\t\treturn camera;\n\t}\n\n\toverride updateCamera() {\n\t\tif (this._object.fov != this.pv.fov) {\n\t\t\tthis._object.fov = this.pv.fov;\n\t\t\tPerspectiveCameraSopOperation.setCameraAttributes(this._object, this.pv);\n\t\t\tthis._object.updateProjectionMatrix();\n\t\t}\n\n\t\tconst objects = [this._object];\n\n\t\t// webXR is only for perspectiveCamera for now, not for orthographic\n\t\tCameraWebXRARSopOperation.updateObject({\n\t\t\tscene: this.scene(),\n\t\t\tobjects,\n\t\t\tparams: CameraWebXRARSopOperation.DEFAULT_PARAMS,\n\t\t\tactive: this.pv.useWebXR && this.pv.useAR,\n\t\t});\n\t\tCameraWebXRVRSopOperation.updateObject({\n\t\t\tscene: this.scene(),\n\t\t\tobjects,\n\t\t\tparams: CameraWebXRVRSopOperation.DEFAULT_PARAMS,\n\t\t\tactive: this.pv.useWebXR && this.pv.useVR,\n\t\t});\n\t}\n\n\t// protected override _updateForAspectRatio() {\n\t// \tCoreCameraPerspectiveFrameMode.updateCameraAspect(this._object, this._aspect);\n\t// }\n}\n","import {Object3D} from 'three';\nimport {TypedNode, BaseNodeType} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {Group} from 'three';\nimport {ObjChildrenDisplayController} from './utils/ObjChildrenDisplayController';\nimport {TransformController} from './utils/TransformController';\nimport {HierarchyController} from './utils/HierarchyController';\nimport {Poly} from '../../Poly';\n\ninterface Object3DWithNode extends Object3D {\n\tnode: BaseNodeType;\n}\n\nexport enum ObjNodeRenderOrder {\n\tMANAGER = 0,\n\tCAMERA = 2,\n\tLIGHT = 3,\n}\n\n/**\n *\n *\n * TypedObjNode is the base class for all nodes that process objects and hierarchies. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\nexport class TypedObjNode<O extends Object3D, K extends NodeParamsConfig> extends TypedNode<NodeContext.OBJ, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.OBJ;\n\t}\n\n\tpublic readonly renderOrder: number = ObjNodeRenderOrder.MANAGER;\n\treadonly transformController: TransformController | undefined;\n\treadonly hierarchyController: HierarchyController | undefined;\n\n\tprotected _children_group = this._create_children_group();\n\tprotected _object!: O;\n\n\tprivate _create_children_group() {\n\t\tconst group = new Group();\n\t\tgroup.matrixAutoUpdate = false;\n\t\treturn group;\n\t}\n\n\tprotected _attachableToHierarchy: boolean = true;\n\tattachableToHierarchy() {\n\t\treturn this._attachableToHierarchy;\n\t}\n\tprotected _usedInScene: boolean = true;\n\tusedInScene() {\n\t\treturn this._usedInScene && this.disposed() == false;\n\t}\n\t// TODO call set_used_in_scene(false) when node is deleted\n\t// set_used_in_scene(state: boolean) {\n\t// \tthis._used_in_scene = state;\n\t// \tif (!this.scene.loading_controller.isLoading()) {\n\t// \t\tconst root = this.parent as ObjectsManagerNode;\n\t// \t\tif (root) {\n\t// \t\t\troot.update_object(this);\n\t// \t\t}\n\t// \t}\n\t// }\n\taddObjectToParent(parent: Object3D) {\n\t\tif (this.attachableToHierarchy()) {\n\t\t\tparent.add(this.object);\n\t\t\tPoly.onObjectsAddRemoveHooks.runOnAddHookOnObject(this._scene, this.object);\n\t\t}\n\t}\n\tremoveObjectFromParent() {\n\t\tif (this.attachableToHierarchy()) {\n\t\t\tconst parent = this.object.parent;\n\t\t\tif (parent) {\n\t\t\t\tPoly.onObjectsAddRemoveHooks.runOnRemoveHookOnObject(this._scene, this.object);\n\t\t\t\tparent.remove(this.object);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic readonly childrenDisplayController: ObjChildrenDisplayController | undefined;\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.childrenDisplayController?.dispose();\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis._object = this._create_object_with_attributes();\n\t\tthis.nameController.add_post_set_fullPath_hook(this.set_object_name.bind(this));\n\t\tthis.set_object_name();\n\t}\n\n\tchildrenGroup() {\n\t\treturn this._children_group;\n\t}\n\tget object() {\n\t\treturn this._object;\n\t}\n\n\t_create_object_with_attributes(): O {\n\t\tconst object = this.createObject();\n\t\t(object as Object3DWithNode).node = this;\n\t\tobject.add(this._children_group);\n\t\treturn object as O;\n\t}\n\tprotected set_object_name() {\n\t\tif (this._object) {\n\t\t\tthis._object.name = this.path();\n\t\t\tthis._children_group.name = `${this.path()}:parentedOutputs`;\n\t\t}\n\t}\n\n\tcreateObject(): Object3D {\n\t\tconst object = new Object3D();\n\t\tobject.matrixAutoUpdate = false;\n\t\treturn object;\n\t}\n\n\tisDisplayNodeCooking(): boolean {\n\t\tif (this.flags?.display?.active()) {\n\t\t\tconst displayNode = this.displayNodeController?.displayNode();\n\t\t\tif (displayNode) {\n\t\t\t\treturn displayNode.cookController.isCooking();\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tisDisplayed(): boolean {\n\t\treturn this.flags?.display?.active() || false;\n\t}\n}\n\nexport type BaseObjNodeType = TypedObjNode<Object3D, any>;\nexport class BaseObjNodeClass extends TypedObjNode<Object3D, any> {}\n","import {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {BaseEvent, Camera} from 'three';\nimport {CoreTransform} from '../../../core/Transform';\nimport {ObjNodeRenderOrder} from './_Base';\nimport {LayersController, LayerParamConfig} from './utils/LayersController';\nimport {CameraRenderParamConfig} from './utils/cameras/RenderController';\nimport {TransformedParamConfig, TransformController} from './utils/TransformController';\nimport {ObjChildrenDisplayController} from './utils/ObjChildrenDisplayController';\nimport {DisplayNodeController} from '../utils/DisplayNodeController';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {ThreejsViewer} from '../../viewers/Threejs';\nimport {FlagsControllerD} from '../utils/FlagsController';\nimport {BaseParamType} from '../../params/_Base';\nimport {BaseNodeType} from '../_Base';\nimport {BaseSopNodeType} from '../sop/_Base';\nimport {TypedObjNode} from './_Base';\nimport {BaseViewerType} from '../../viewers/_Base';\nimport {HierarchyController} from './utils/HierarchyController';\nimport {GeoNodeChildrenMap} from '../../poly/registers/nodes/Sop';\nimport {CameraHelper} from '../../../core/helpers/CameraHelper';\nimport {ParamConfig, NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {CameraPostProcessParamConfig} from './utils/cameras/PostProcessParamOptions';\nimport {Poly} from '../../Poly';\nimport {CORE_CAMERA_DEFAULT} from '../../../core/camera/CoreCamera';\nimport {CameraControlsSopOperation} from '../../operations/sop/CameraControls';\nimport {CameraRendererSopOperation} from '../../operations/sop/CameraRenderer';\nimport {CameraCSSRendererSopOperation} from '../../operations/sop/CameraCSSRenderer';\nimport {CameraPostProcessSopOperation} from '../../operations/sop/CameraPostProcess';\nimport {CameraRenderSceneSopOperation} from '../../operations/sop/CameraRenderScene';\nimport {CameraFrameModeSopOperation} from '../../operations/sop/CameraFrameMode';\nimport {CoreCameraFrameParamConfig} from '../../../core/camera/CoreCameraFrameMode';\nimport {CorePath} from '../../../core/geometry/CorePath';\nimport {Object3DWithEvent} from '../../../core/geometry/ObjectContent';\nexport interface OrthoOrPerspCamera extends Camera {\n\tnear: number;\n\tfar: number;\n\tupdateProjectionMatrix: () => void;\n\tgetFocalLength?: () => void;\n}\n\nconst EVENT_CHANGE: BaseEvent<'change'> = {type: 'change'};\n\nexport function CameraMainCameraParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tsetMainCamera = ParamConfig.BUTTON(null, {\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tBaseCameraObjNodeClass.PARAM_CALLBACK_setMainCamera(node as BaseCameraObjNodeType);\n\t\t\t},\n\t\t});\n\t};\n}\n\nexport function ThreejsCameraTransformParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tcamera = ParamConfig.FOLDER();\n\t\t/** @param controls node to allow the camera to be moved by user input */\n\t\tcontrols = ParamConfig.NODE_PATH('', {\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.EVENT,\n\t\t\t},\n\t\t\tdependentOnFoundNode: true,\n\t\t});\n\n\t\t/** @param near */\n\t\tnear = ParamConfig.FLOAT(CORE_CAMERA_DEFAULT.near, {\n\t\t\trange: [0.1, 100],\n\t\t\tcook: false,\n\t\t\tcomputeOnDirty: true,\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tBaseThreejsCameraObjNodeClass.PARAM_CALLBACK_update_near_far_from_param(\n\t\t\t\t\tnode as BaseThreejsCameraObjNodeType,\n\t\t\t\t\tparam\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t\t/** @param far */\n\t\tfar = ParamConfig.FLOAT(CORE_CAMERA_DEFAULT.far, {\n\t\t\trange: [0, 100],\n\t\t\tcook: false,\n\t\t\tcomputeOnDirty: true,\n\t\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\t\tBaseThreejsCameraObjNodeClass.PARAM_CALLBACK_update_near_far_from_param(\n\t\t\t\t\tnode as BaseThreejsCameraObjNodeType,\n\t\t\t\t\tparam\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t\t// aspect = ParamConfig.FLOAT(1);\n\t\t// lock_width = ParamConfig.BOOLEAN(1);\n\t\t// look_at = ParamConfig.OPERATOR_PATH('');\n\t\t/** @param display */\n\t\tdisplay = ParamConfig.BOOLEAN(1);\n\t\t/** @param show helper */\n\t\tshowHelper = ParamConfig.BOOLEAN(0);\n\t};\n}\n\nexport class BaseCameraObjParamsConfig extends CameraMainCameraParamConfig(NodeParamsConfig) {}\nexport class BaseThreejsCameraObjParamsConfig extends CameraPostProcessParamConfig(\n\tCameraRenderParamConfig(\n\t\tCoreCameraFrameParamConfig(\n\t\t\tTransformedParamConfig(\n\t\t\t\tLayerParamConfig(ThreejsCameraTransformParamConfig(CameraMainCameraParamConfig(NodeParamsConfig)))\n\t\t\t)\n\t\t)\n\t)\n) {}\n\nexport interface BaseViewerOptions {\n\telement?: HTMLElement;\n\tupdateAutoRenderOnIntersectionChange?: boolean;\n}\n\nexport abstract class TypedCameraObjNode<\n\tO extends OrthoOrPerspCamera,\n\tK extends BaseCameraObjParamsConfig\n> extends TypedObjNode<O, K> {\n\t// public readonly flags: FlagsControllerD = new FlagsControllerD(this);\n\tpublic override readonly renderOrder: number = ObjNodeRenderOrder.CAMERA;\n\tprotected override _object!: O;\n\tprotected _aspect: number = -1;\n\toverride get object() {\n\t\treturn this._object;\n\t}\n\n\toverride async cook() {\n\t\tthis.updateCamera();\n\t\t(this._object as Object3DWithEvent<'change'>).dispatchEvent(EVENT_CHANGE);\n\t\tthis.cookController.endCook();\n\t}\n\n\t// prepareRaycaster(mouse: Vector2, raycaster: Raycaster) {}\n\n\tcamera() {\n\t\treturn this._object;\n\t}\n\tupdateCamera() {}\n\n\tstatic PARAM_CALLBACK_setMainCamera(node: BaseCameraObjNodeType) {\n\t\tnode.setAsMainCamera();\n\t}\n\tsetAsMainCamera() {\n\t\tconst path = CorePath.objectPath(this.object);\n\t\tthis.scene().camerasController.setMainCameraPath(path);\n\t}\n\n\tsetupForAspectRatio(aspect: number) {}\n\t// protected _updateForAspectRatio(): void {}\n\n\tupdate_transform_params_from_object() {\n\t\t// CoreTransform.set_params_from_matrix(this._object.matrix, this, {scale: false})\n\t\tCoreTransform.setParamsFromObject(this._object, this);\n\t}\n\tabstract createViewer(options?: BaseViewerOptions | HTMLElement): Promise<BaseViewerType | undefined>;\n\n\tstatic PARAM_CALLBACK_update_from_param(node: BaseCameraObjNodeType, param: BaseParamType) {\n\t\t(node.object as any)[param.name()] = (node.pv as any)[param.name()];\n\t}\n}\n\n// interface ThreejsViewerOptions extends BaseViewerOptions {\n// \tviewerProperties?: ThreejsViewerProperties;\n// }\nexport class TypedThreejsCameraObjNode<\n\tO extends OrthoOrPerspCamera,\n\tK extends BaseThreejsCameraObjParamsConfig\n> extends TypedCameraObjNode<O, K> {\n\tpublic override readonly flags: FlagsControllerD = new FlagsControllerD(this);\n\toverride readonly hierarchyController: HierarchyController = new HierarchyController(this);\n\toverride readonly transformController: TransformController = new TransformController(this);\n\t// protected _controlsController: ThreejsCameraControlsController | undefined;\n\t// controlsController(): ThreejsCameraControlsController {\n\t// \treturn (this._controlsController = this._controlsController || new ThreejsCameraControlsController(this));\n\t// }\n\tprotected __layersController__: LayersController | undefined;\n\tprivate _layersController() {\n\t\treturn (this.__layersController__ = this.__layersController__ || new LayersController(this));\n\t}\n\t// protected _renderController: RenderController | undefined;\n\t// renderController(): RenderController {\n\t// \treturn (this._renderController = this._renderController || new RenderController(this));\n\t// }\n\t// protected _postProcessController: PostProcessController | undefined;\n\t// postProcessController(): PostProcessController {\n\t// \treturn (this._postProcessController = this._postProcessController || new PostProcessController(this));\n\t// }\n\n\t// display_node and children_display controllers\n\tpublic override readonly childrenDisplayController: ObjChildrenDisplayController = new ObjChildrenDisplayController(\n\t\tthis\n\t);\n\tpublic override readonly displayNodeController: DisplayNodeController = new DisplayNodeController(\n\t\tthis,\n\t\tthis.childrenDisplayController.displayNodeControllerCallbacks()\n\t);\n\t//\n\tprotected override _childrenControllerContext = NodeContext.SOP;\n\n\toverride initializeBaseNode() {\n\t\tsuper.initializeBaseNode();\n\t\tthis.io.outputs.setHasOneOutput();\n\t\tthis.hierarchyController.initializeNode();\n\t\tthis.transformController.initializeNode();\n\n\t\tthis.childrenDisplayController.initializeNode();\n\t\tthis.initHelperHook();\n\t}\n\n\toverride createNode<S extends keyof GeoNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): GeoNodeChildrenMap[S];\n\toverride createNode<K extends valueof<GeoNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<GeoNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseSopNodeType[];\n\t}\n\toverride nodesByType<K extends keyof GeoNodeChildrenMap>(type: K): GeoNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as GeoNodeChildrenMap[K][];\n\t}\n\n\t// override prepareRaycaster(mouse: Vector2, raycaster: Raycaster) {\n\t// \traycaster.setFromCamera(mouse, this._object);\n\t// }\n\n\toverride async cook() {\n\t\tthis.transformController.update();\n\t\tthis._layersController().update();\n\t\t// await this.background_controller.update();\n\n\t\tthis.updateNearFar();\n\n\t\t// this.renderController().update();\n\t\tthis.updateCamera();\n\t\tthis._updateHelper();\n\t\t// this.controlsController().update_controls();\n\n\t\tconst objects = [this._object];\n\t\tconst node = this;\n\t\tconst hierachyParams = {\n\t\t\tgroup: '',\n\t\t};\n\t\tCameraControlsSopOperation.updateObject({\n\t\t\tobjects,\n\t\t\tparams: {\n\t\t\t\tnode: this.pv.controls,\n\t\t\t\t...hierachyParams,\n\t\t\t},\n\t\t\tnode,\n\t\t\tactive: true,\n\t\t\terrorIfNodeNotFound: false,\n\t\t});\n\t\tCameraRendererSopOperation.updateObject({\n\t\t\tobjects,\n\t\t\tparams: {\n\t\t\t\tnode: this.pv.renderer,\n\t\t\t\t...hierachyParams,\n\t\t\t},\n\t\t\tnode,\n\t\t\tactive: this.pv.setRenderer,\n\t\t});\n\t\tCameraCSSRendererSopOperation.updateObject({\n\t\t\tobjects,\n\t\t\tparams: {\n\t\t\t\tnode: this.pv.CSSRenderer,\n\t\t\t\t...hierachyParams,\n\t\t\t},\n\t\t\tnode,\n\t\t\tactive: this.pv.setCSSRenderer,\n\t\t});\n\t\tCameraPostProcessSopOperation.updateObject({\n\t\t\tobjects,\n\t\t\tparams: {\n\t\t\t\tnode: this.pv.postProcessNode,\n\t\t\t\tuseOtherNode: false,\n\t\t\t\t...hierachyParams,\n\t\t\t},\n\t\t\tnode,\n\t\t\tactive: this.pv.doPostProcess,\n\t\t});\n\t\tCameraRenderSceneSopOperation.updateObject({\n\t\t\tobjects,\n\t\t\tparams: {\n\t\t\t\tnode: this.pv.scene,\n\t\t\t\t...hierachyParams,\n\t\t\t},\n\t\t\tnode,\n\t\t\tactive: this.pv.setScene,\n\t\t});\n\t\tCameraFrameModeSopOperation.updateObject({\n\t\t\tobjects,\n\t\t\tparams: {\n\t\t\t\tframeMode: this.pv.frameMode,\n\t\t\t\texpectedAspectRatio: this.pv.expectedAspectRatio,\n\t\t\t\t...hierachyParams,\n\t\t\t},\n\t\t});\n\n\t\t// TODO: ideally the update transform and update camera\n\t\t// can both return if the camera has changed\n\t\t// and we can run this here instead of inside the update_transform and update_camera\n\t\t// this._object.dispatchEvent( EVENT_CHANGE )\n\t\t(this._object as Object3DWithEvent<'change'>).dispatchEvent(EVENT_CHANGE);\n\t\tthis.scene().camerasController.updateFromChangeInObject(this.object);\n\t\tthis.cookController.endCook();\n\t}\n\n\tstatic PARAM_CALLBACK_update_near_far_from_param(node: BaseThreejsCameraObjNodeType, param: BaseParamType) {\n\t\tnode.updateNearFar();\n\t}\n\tupdateNearFar() {\n\t\tif (this._object.near != this.pv.near || this._object.far != this.pv.far) {\n\t\t\tthis._object.near = this.pv.near;\n\t\t\tthis._object.far = this.pv.far;\n\t\t\tthis._object.updateProjectionMatrix();\n\t\t\tthis._updateHelper();\n\t\t}\n\t}\n\n\t// override setupForAspectRatio(aspect: number) {\n\t// \tif (isNaN(aspect)) {\n\t// \t\treturn;\n\t// \t}\n\t// \tif (aspect && this._aspect != aspect) {\n\t// \t\tthis._aspect = aspect;\n\t// \t\tthis._updateForAspectRatio();\n\t// \t}\n\t// }\n\n\tasync createViewer(options?: BaseViewerOptions | HTMLElement): Promise<ThreejsViewer<Camera> | undefined> {\n\t\tif (this.isDirty()) {\n\t\t\t// make sure that every parameter is cooked,\n\t\t\t// so that the camera object has all the attributes required\n\t\t\tawait this.compute();\n\t\t}\n\n\t\tconst viewer = Poly.camerasRegister.createViewer({camera: this.object, scene: this.scene()}) as\n\t\t\t| ThreejsViewer<Camera>\n\t\t\t| undefined;\n\t\tlet element: HTMLElement | undefined;\n\n\t\tlet updateAutoRenderOnIntersectionChange: boolean | undefined;\n\t\tif (options && options instanceof HTMLElement) {\n\t\t\telement = options;\n\t\t} else {\n\t\t\telement = options?.element;\n\t\t\tupdateAutoRenderOnIntersectionChange = options?.updateAutoRenderOnIntersectionChange;\n\t\t}\n\t\tif (viewer) {\n\t\t\tif (element) {\n\t\t\t\tviewer.mount(element, {\n\t\t\t\t\tupdateAutoRenderOnIntersectionChange,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn viewer;\n\t}\n\n\t//\n\t//\n\t// HELPER\n\t//\n\t//\n\tprivate _helper: CameraHelper | undefined;\n\n\tinitHelperHook() {\n\t\tthis.flags.display.onUpdate(() => {\n\t\t\tthis._updateHelper();\n\t\t});\n\t}\n\n\thelperVisible() {\n\t\treturn this.flags.display.active() && isBooleanTrue(this.pv.showHelper);\n\t}\n\n\tprivate _createHelper(): CameraHelper {\n\t\tconst helper = new CameraHelper(this.object);\n\t\thelper.update();\n\t\treturn helper;\n\t}\n\n\t_updateHelper() {\n\t\tif (this.helperVisible()) {\n\t\t\tif (!this._helper) {\n\t\t\t\tthis._helper = this._createHelper();\n\t\t\t}\n\t\t\tif (this._helper) {\n\t\t\t\tthis.object.add(this._helper);\n\t\t\t\tthis._helper.update();\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._helper) {\n\t\t\t\tthis.object.remove(this._helper);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type BaseCameraObjNodeType = TypedCameraObjNode<OrthoOrPerspCamera, BaseCameraObjParamsConfig>;\nexport abstract class BaseCameraObjNodeClass extends TypedCameraObjNode<\n\tOrthoOrPerspCamera,\n\tBaseCameraObjParamsConfig\n> {}\n\nexport type BaseThreejsCameraObjNodeType = TypedThreejsCameraObjNode<\n\tOrthoOrPerspCamera,\n\tBaseThreejsCameraObjParamsConfig\n>;\nexport class BaseThreejsCameraObjNodeClass extends TypedThreejsCameraObjNode<\n\tOrthoOrPerspCamera,\n\tBaseThreejsCameraObjParamsConfig\n> {\n\tPARAM_CALLBACK_update_effects_composer(node: BaseNodeType) {}\n}\n","import {NodeParamsConfig} from '../../utils/params/ParamsConfig';\nimport {TypedObjNode, BaseObjNodeType} from '../_Base';\nimport {Object3D} from 'three';\nimport {TransformController, TransformedObjNode} from './TransformController';\n\nclass HierarchyParamsConfig extends NodeParamsConfig {}\nexport class HierarchyObjNode extends TypedObjNode<Object3D, HierarchyParamsConfig> {\n\toverride readonly hierarchyController: HierarchyController = new HierarchyController(this);\n}\n\nexport class HierarchyController {\n\tconstructor(private node: HierarchyObjNode) {}\n\n\tinitializeNode() {\n\t\tthis.node.io.inputs.setCount(0, 1);\n\t\tthis.node.io.inputs.setDependsOnInputs(false);\n\t\tthis.node.io.outputs.setHasOneOutput();\n\t\tthis.node.io.inputs.add_on_set_input_hook('on_input_updated:update_parent', () => {\n\t\t\tthis.on_input_updated();\n\t\t});\n\t}\n\n\tstatic on_input_updated(node: BaseObjNodeType) {\n\t\tconst parent_object = node.root().getParentForNode(node);\n\t\tif (node.transformController && parent_object) {\n\t\t\tTransformController.update_node_transform_params_if_required(node as TransformedObjNode, parent_object);\n\t\t}\n\n\t\tif (node.io.inputs.input(0) != null) {\n\t\t\tnode.root().addToParentTransform(node as HierarchyObjNode);\n\t\t} else {\n\t\t\tnode.root().removeFromParentTransform(node as HierarchyObjNode);\n\t\t}\n\t}\n\ton_input_updated() {\n\t\tHierarchyController.on_input_updated(this.node);\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {BaseObjNodeType} from '../_Base';\n\nconst PARAM_NAME = 'layer';\n\nimport {ParamConfig} from '../../utils/params/ParamsConfig';\nexport function LayerParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tlayer = ParamConfig.INTEGER(0, {\n\t\t\trange: [0, 31],\n\t\t\trangeLocked: [true, true],\n\t\t});\n\t};\n}\n\nexport class LayersController {\n\tconstructor(private node: BaseObjNodeType) {}\n\n\tupdate() {\n\t\tconst object = this.node.object;\n\t\tobject.layers.set(0);\n\t\tobject.layers.enable(this.node.params.integer(PARAM_NAME));\n\t}\n}\n","import {BaseObjNodeClass} from '../_Base';\nimport {Object3D} from 'three';\nimport {DisplayNodeController, DisplayNodeControllerCallbacks} from '../../utils/DisplayNodeController';\nimport {Group} from 'three';\nimport {BaseSopNodeType} from '../../sop/_Base';\nimport {Poly} from '../../../Poly';\nimport {CoreGroup} from '../../../../core/geometry/Group';\nimport {PolyScene} from '../../../scene/PolyScene';\n// import {TesselationParams} from '../../../../core/geometry/modules/cad/CadCommon';\n\nconst DISPLAY_PARAM_NAME = 'display';\n\nexport type OnSopGroupUpdatedHook = () => void;\ninterface BaseObjNodeClassWithDisplayNode extends BaseObjNodeClass {\n\tdisplayNodeController: DisplayNodeController;\n\t// pv: TesselationParams;\n}\n\nexport class ObjChildrenDisplayController {\n\tprotected _childrenUuids: Set<string> = new Set();\n\tprotected _sopGroup = this._createSopGroup();\n\tprotected _newSpecializedObjects: Object3D[] = [];\n\tprotected _newObjectsAreDifferent: boolean = false;\n\tprivate _scene: PolyScene;\n\tconstructor(protected node: BaseObjNodeClassWithDisplayNode) {\n\t\tthis._scene = this.node.scene();\n\t}\n\n\tprivate _createSopGroup() {\n\t\t// This may need to be a Mesh for the rivet to update correctly\n\t\t// But when it is not used for a rivet, there is a place where a MeshBasicMaterial\n\t\t// is added to it, making it an additional webgl program for the renderer.\n\t\t// const mesh = new Mesh();\n\t\tconst group = new Group();\n\t\tgroup.matrixAutoUpdate = false;\n\t\treturn group;\n\t}\n\tsopGroup() {\n\t\treturn this._sopGroup;\n\t}\n\tsetSopGroupName() {\n\t\tthis._sopGroup.name = `${this.node.name()}:sopGroup`;\n\t}\n\tdispose() {\n\t\tthis._clearHooks();\n\t}\n\n\tdisplayNodeControllerCallbacks(): DisplayNodeControllerCallbacks {\n\t\treturn {\n\t\t\tonDisplayNodeRemove: () => {\n\t\t\t\tthis.removeChildren();\n\t\t\t},\n\t\t\tonDisplayNodeSet: () => {\n\t\t\t\t// use a timeout here, so that the node isn't cooked too early when being copy/pasted, if it had the display flag on.\n\t\t\t\t// This would make nodes error\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.requestDisplayNodeContainer();\n\t\t\t\t}, 0);\n\t\t\t},\n\t\t\tonDisplayNodeUpdate: () => {\n\t\t\t\tif (!this.node.scene().loadingController.loaded()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.requestDisplayNodeContainer();\n\t\t\t},\n\t\t};\n\t}\n\n\tinitializeNode() {\n\t\tthis.node.object.add(this.sopGroup());\n\t\tthis.node.nameController.add_post_set_fullPath_hook(this.setSopGroupName.bind(this));\n\t\tthis._createSopGroup();\n\n\t\tconst displayFlag = this.node.flags?.display;\n\t\tif (displayFlag) {\n\t\t\tdisplayFlag.onUpdate(() => {\n\t\t\t\tthis._updateSopGroupHierarchy();\n\t\t\t\tif (displayFlag.active()) {\n\t\t\t\t\tthis.requestDisplayNodeContainer();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tprivate _updateSopGroupHierarchy() {\n\t\tconst displayFlag = this.node.flags?.display;\n\t\tif (displayFlag) {\n\t\t\tconst sopGroup = this.sopGroup();\n\t\t\tif (this.usedInScene()) {\n\t\t\t\tsopGroup.visible = true;\n\t\t\t\tthis.node.object.add(sopGroup);\n\t\t\t\tsopGroup.updateMatrix();\n\t\t\t} else {\n\t\t\t\tsopGroup.visible = false;\n\t\t\t\tthis.node.object.remove(sopGroup);\n\t\t\t}\n\t\t\tPoly.onSceneUpdatedHooks.runHooks();\n\t\t}\n\t}\n\n\tusedInScene(): boolean {\n\t\tconst node = this.node;\n\t\tif (node.disposed() == true) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst usedInScene = node.usedInScene();\n\t\tif (!usedInScene) {\n\t\t\treturn false;\n\t\t}\n\t\tconst displayFlagOn = node.flags?.display?.active() || false;\n\t\tif (!displayFlagOn) {\n\t\t\treturn false;\n\t\t}\n\t\tconst params = node.params;\n\t\tconst hasActiveParam = params.has(DISPLAY_PARAM_NAME);\n\t\tconst isActiveParamOn = node.params.boolean(DISPLAY_PARAM_NAME);\n\t\tconst paramActiveOn = !hasActiveParam || isActiveParamOn;\n\n\t\treturn paramActiveOn;\n\t}\n\n\tasync requestDisplayNodeContainer() {\n\t\tif (!this._scene.loadingController.loaded()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.usedInScene()) {\n\t\t\tawait this._setContentUnderSopGroup();\n\t\t}\n\t}\n\n\tprivate removeChildren() {\n\t\tif (this._sopGroup.children.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tlet child: Object3D | undefined;\n\t\tPoly.onObjectsAddRemoveHooks.runOnRemoveHooks(this._scene, this._sopGroup);\n\t\twhile ((child = this._sopGroup.children[0])) {\n\t\t\tthis._sopGroup.remove(child);\n\t\t}\n\t\tthis._childrenUuids.clear();\n\n\t\tthis._notifyCamerasController();\n\t}\n\n\tasync _setContentUnderSopGroup() {\n\t\t// we also check that the parent are the same, in case the node has been deleted\n\t\t// TODO: there should be a wider refactor where deleted node cannot raise callbacks such as flags update\n\t\tconst displayNode = this.node.displayNodeController.displayNode() as BaseSopNodeType;\n\n\t\tif (displayNode && displayNode.parent()?.graphNodeId() == this.node.graphNodeId()) {\n\t\t\tconst container = await displayNode.compute();\n\t\t\tconst coreGroup = container.coreContent();\n\t\t\tif (coreGroup) {\n\t\t\t\t// check if the new objects are different\n\t\t\t\tconst newObjects = coreGroup.threejsObjects();\n\t\t\t\tconst _checkObjectsHaveChanged = () => {\n\t\t\t\t\tconst objectsCountChanged = newObjects.length != this._childrenUuids.size;\n\t\t\t\t\tif (objectsCountChanged) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const object of newObjects) {\n\t\t\t\t\t\tif (!this._childrenUuids.has(object.uuid)) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t\tthis._newObjectsAreDifferent = _checkObjectsHaveChanged();\n\t\t\t\tthis._newSpecializedObjects.length = 0;\n\t\t\t\tthis._addSpecializedObjects(displayNode, coreGroup, this._newSpecializedObjects);\n\n\t\t\t\t// update hierarchy if different\n\t\t\t\tif (this._newObjectsAreDifferent) {\n\t\t\t\t\tthis.removeChildren();\n\t\t\t\t\tconst addObject = (object: Object3D) => {\n\t\t\t\t\t\tthis._sopGroup.add(object);\n\t\t\t\t\t\t// ensure the matrix of the parent is used\n\t\t\t\t\t\tobject.updateMatrix();\n\t\t\t\t\t\tthis._childrenUuids.add(object.uuid);\n\t\t\t\t\t};\n\t\t\t\t\tfor (const object of newObjects) {\n\t\t\t\t\t\taddObject(object);\n\t\t\t\t\t}\n\t\t\t\t\tfor (const object of this._newSpecializedObjects) {\n\t\t\t\t\t\taddObject(object);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis._notifyCamerasController();\n\t\t\t\tthis._runOnSopGroupUpdatedHooks();\n\t\t\t\tif (this._scene.loadingController.loaded()) {\n\t\t\t\t\tPoly.onObjectsAddRemoveHooks.runOnAddHooks(this._scene, this._sopGroup);\n\t\t\t\t\tPoly.onSceneUpdatedHooks.runHooks();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.removeChildren();\n\t\tthis._runOnSopGroupUpdatedHooks();\n\t\tif (this._scene.loadingController.loaded()) {\n\t\t\tPoly.onSceneUpdatedHooks.runHooks();\n\t\t}\n\t}\n\tprivate _notifyCamerasController() {\n\t\tthis._scene.camerasController.updateFromChangeInObject(this._sopGroup);\n\t}\n\tprotected _addSpecializedObjects(displayNode: BaseSopNodeType, coreGroup: CoreGroup, newObjects: Object3D[]) {}\n\n\t//\n\t//\n\t// CALLBACKS\n\t//\n\t//\n\tprivate _onSopGroupUpdatedHookNames: string[] | undefined;\n\tprivate _onSopGroupUpdatedHooks: OnSopGroupUpdatedHook[] | undefined;\n\tregisterOnSopGroupUpdated(callbackName: string, callback: OnSopGroupUpdatedHook) {\n\t\tthis._onSopGroupUpdatedHookNames = this._onSopGroupUpdatedHookNames || [];\n\t\tthis._onSopGroupUpdatedHooks = this._onSopGroupUpdatedHooks || [];\n\t\tthis._onSopGroupUpdatedHookNames.push(callbackName);\n\t\tthis._onSopGroupUpdatedHooks.push(callback);\n\t}\n\tprivate _clearHooks() {\n\t\tif (!this._onSopGroupUpdatedHookNames || !this._onSopGroupUpdatedHooks) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const hookName of this._onSopGroupUpdatedHookNames) {\n\t\t\tthis.deregisterOnSopGroupUpdated(hookName);\n\t\t}\n\t}\n\tderegisterOnSopGroupUpdated(callbackName: string) {\n\t\tif (!this._onSopGroupUpdatedHookNames || !this._onSopGroupUpdatedHooks) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = this._onSopGroupUpdatedHookNames?.indexOf(callbackName);\n\t\tthis._onSopGroupUpdatedHookNames.splice(index, 1);\n\t\tthis._onSopGroupUpdatedHooks.splice(index, 1);\n\t\tif (this._onSopGroupUpdatedHookNames.length == 0) {\n\t\t\tthis._onSopGroupUpdatedHookNames = undefined;\n\t\t}\n\t\tif (this._onSopGroupUpdatedHooks.length == 0) {\n\t\t\tthis._onSopGroupUpdatedHooks = undefined;\n\t\t}\n\t}\n\tprivate _runOnSopGroupUpdatedHooks() {\n\t\tif (this._onSopGroupUpdatedHooks) {\n\t\t\tconst hooks = [...this._onSopGroupUpdatedHooks];\n\t\t\tfor (const hook of hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n\tonSopGroupUpdatedCallbackNames() {\n\t\treturn this._onSopGroupUpdatedHookNames;\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {TypedObjNode} from '../_Base';\nimport {Matrix4} from 'three';\nimport {CoreTransform, SetParamsFromMatrixOptions, ROTATION_ORDERS, RotationOrder} from '../../../../core/Transform';\nimport {Object3D} from 'three';\n// import {Vector3} from 'three';\n// import {Quaternion} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../../_Base';\nimport {isBooleanTrue} from '../../../../core/BooleanValue';\nimport {Poly} from '../../../Poly';\nimport {Object3DWithEvent} from '../../../../core/geometry/ObjectContent';\n\ninterface TransformedParamConfigDefaultParams {\n\tmatrixAutoUpdate?: boolean;\n}\n\nexport function TransformedParamConfig<TBase extends Constructor>(\n\tBase: TBase,\n\tdefault_params?: TransformedParamConfigDefaultParams\n) {\n\tconst matrixAutoUpdate = default_params?.matrixAutoUpdate || false;\n\treturn class Mixin extends Base {\n\t\ttransform = ParamConfig.FOLDER();\n\t\t/** @param toggle on to keep world position when adding a parent or removing from one */\n\t\tkeepPosWhenParenting = ParamConfig.BOOLEAN(0);\n\t\t/** @param rotation order */\n\t\trotationOrder = ParamConfig.INTEGER(ROTATION_ORDERS.indexOf(RotationOrder.XYZ), {\n\t\t\tmenu: {\n\t\t\t\tentries: ROTATION_ORDERS.map((order, v) => {\n\t\t\t\t\treturn {name: order, value: v};\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t\t/** @param translate */\n\t\tt = ParamConfig.VECTOR3([0, 0, 0]);\n\t\t/** @param rotation */\n\t\tr = ParamConfig.VECTOR3([0, 0, 0]);\n\t\t/** @param scale */\n\t\ts = ParamConfig.VECTOR3([1, 1, 1]);\n\t\t/** @param scale */\n\t\tscale = ParamConfig.FLOAT(1);\n\t\t// pivot = ParamConfig.VECTOR3([0, 0, 0]);\n\t\t/** @param set for the matrix to be updated every frame */\n\t\tmatrixAutoUpdate = ParamConfig.BOOLEAN(matrixAutoUpdate ? 1 : 0);\n\t\tupdateTransformFromObject = ParamConfig.BUTTON(null, {\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tTransformController.PARAM_CALLBACK_update_transform_from_object(node as TransformedObjNode);\n\t\t\t},\n\t\t});\n\t\t// tlookAt = ParamConfig.BOOLEAN(0);\n\t\t// lookAtPos = ParamConfig.VECTOR3([0, 0, 0], {\n\t\t// \tvisibleIf: {tlookAt: 1},\n\t\t// });\n\t\t// look_at = ParamConfig.OPERATOR_PATH('', {\n\t\t// \tvisibleIf: {tlookAt: 1},\n\t\t// \tnodeSelection: {context: NodeContext.OBJ},\n\t\t// });\n\t\t// up = ParamConfig.VECTOR3([0, 1, 0], {\n\t\t// \tvisibleIf: {tlookAt: 1},\n\t\t// });\n\t};\n}\nclass TransformedParamsConfig extends TransformedParamConfig(NodeParamsConfig) {}\nexport class TransformedObjNode extends TypedObjNode<Object3D, TransformedParamsConfig> {\n\toverride readonly transformController: TransformController = new TransformController(this);\n}\n\nconst HOOK_NAME = '_cook_main_without_inputs_when_dirty';\nexport class TransformController {\n\tconstructor(private node: TransformedObjNode) {}\n\n\tinitializeNode() {\n\t\tif (!this.node.dirtyController.hasHook(HOOK_NAME)) {\n\t\t\tthis.node.dirtyController.addPostDirtyHook(HOOK_NAME, this._cook_main_without_inputs_when_dirty_bound);\n\t\t}\n\t}\n\t// TODO: this will have to be checked via the parent, when I will have obj managers at lower levels than root\n\tprivate _cook_main_without_inputs_when_dirty_bound = this._cook_main_without_inputs_when_dirty.bind(this);\n\tprivate async _cook_main_without_inputs_when_dirty() {\n\t\tawait this.node.cookController.cookMainWithoutInputs();\n\t}\n\n\tupdate() {\n\t\tthis.update_transform_with_matrix();\n\t\tconst object = this.node.object;\n\t\tobject.matrixAutoUpdate = isBooleanTrue(this.node.pv.matrixAutoUpdate);\n\t\tPoly.onSceneUpdatedHooks.runHooks();\n\t}\n\n\tupdate_transform_with_matrix(matrix?: Matrix4) {\n\t\tconst object = this.node.object;\n\t\tif (matrix != null && !matrix.equals(object.matrix)) {\n\t\t\t// do not apply to cameras with control\n\n\t\t\t// object.matrixAutoUpdate = false;\n\t\t\tobject.matrix.copy(matrix);\n\n\t\t\t(object as Object3DWithEvent<'change'>).dispatchEvent({type: 'change'});\n\t\t} else {\n\t\t\tthis._update_matrix_from_params_with_core_transform();\n\t\t\t// this.update_transform_from_params();\n\t\t}\n\t}\n\n\tprivate _core_transform = new CoreTransform();\n\tprivate _update_matrix_from_params_with_core_transform() {\n\t\tconst object = this.node.object;\n\n\t\tlet prev_auto_update = object.matrixAutoUpdate;\n\t\tif (prev_auto_update) {\n\t\t\tobject.matrixAutoUpdate = false;\n\t\t}\n\t\tconst matrix = this._core_transform.matrix(\n\t\t\tthis.node.pv.t,\n\t\t\tthis.node.pv.r,\n\t\t\tthis.node.pv.s,\n\t\t\tthis.node.pv.scale,\n\t\t\tROTATION_ORDERS[this.node.pv.rotationOrder]\n\t\t);\n\t\tobject.matrix.identity();\n\t\tobject.applyMatrix4(matrix);\n\t\tthis._apply_look_at();\n\t\tobject.updateMatrix();\n\n\t\tif (prev_auto_update) {\n\t\t\tobject.matrixAutoUpdate = true;\n\t\t}\n\n\t\t(object as Object3DWithEvent<'change'>).dispatchEvent({type: 'change'});\n\t}\n\n\t// private _look_at_target_t = new Vector3();\n\t// private _look_at_target_q = new Quaternion();\n\t// private _look_at_target_s = new Vector3();\n\tprivate _apply_look_at() {\n\t\t// const pv = this.node.pv;\n\t\t// if (!pv.tlookAt) {\n\t\t// \treturn;\n\t\t// }\n\t\t// this.node.object.up.copy(pv.up);\n\t\t// this.node.object.lookAt(pv.lookAtPos);\n\t\t// const target_node = this.node.p.look_at.found_node_with_context(NodeContext.OBJ);\n\t\t// if (target_node) {\n\t\t// \tconst target_object = target_node.object;\n\t\t// \ttarget_object.ma.decompose(this._look_at_target_t, this._look_at_target_q, this._look_at_target_s);\n\t\t// \tthis.node.object.up.copy(this.node.pv.up);\n\t\t// \tthis.node.object.lookAt(this._look_at_target_t);\n\t\t// \tconsole.log('lookat', this.node.object, target_object, this._look_at_target_t);\n\t\t// }\n\t}\n\n\tset_params_from_matrix(matrix: Matrix4, options: SetParamsFromMatrixOptions = {}) {\n\t\tCoreTransform.setParamsFromMatrix(matrix, this.node, options);\n\t}\n\n\t//\n\t//\n\t// KEEP POS WHEN PARENTING\n\t//\n\t//\n\tstatic update_node_transform_params_if_required(node: TransformedObjNode, new_parent_object: Object3D) {\n\t\tnode.transformController.update_node_transform_params_if_required(new_parent_object);\n\t}\n\t// private _keep_pos_when_parenting_t = new Vector3();\n\t// private _keep_pos_when_parenting_q = new Quaternion();\n\t// private _keep_pos_when_parenting_s = new Vector3();\n\tprivate _keep_pos_when_parenting_m_object = new Matrix4();\n\tprivate _keep_pos_when_parenting_m_new_parent_inv = new Matrix4();\n\tupdate_node_transform_params_if_required(new_parent_object: Object3D) {\n\t\tif (!isBooleanTrue(this.node.pv.keepPosWhenParenting)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.node.scene().loadingController.loaded()) {\n\t\t\treturn;\n\t\t}\n\t\tif (new_parent_object == this.node.object.parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst object = this.node.object;\n\t\tobject.updateMatrixWorld(true);\n\t\tnew_parent_object.updateMatrixWorld(true);\n\t\t// compute mat\n\t\tthis._keep_pos_when_parenting_m_object.copy(object.matrixWorld);\n\t\tthis._keep_pos_when_parenting_m_new_parent_inv.copy(new_parent_object.matrixWorld);\n\t\tthis._keep_pos_when_parenting_m_new_parent_inv.invert();\n\t\tthis._keep_pos_when_parenting_m_object.premultiply(this._keep_pos_when_parenting_m_new_parent_inv);\n\t\t// apply mat\n\t\tCoreTransform.setParamsFromMatrix(this._keep_pos_when_parenting_m_object, this.node, {scale: true});\n\t}\n\tupdate_node_transform_params_from_object(update_matrix = false) {\n\t\tconst object = this.node.object;\n\t\tif (update_matrix) {\n\t\t\tobject.updateMatrix();\n\t\t}\n\t\tCoreTransform.setParamsFromMatrix(object.matrix, this.node, {scale: true});\n\t}\n\n\t//\n\t//\n\t// CALLBACK\n\t//\n\t//\n\tstatic PARAM_CALLBACK_update_transform_from_object(node: TransformedObjNode) {\n\t\tnode.transformController.update_node_transform_params_from_object();\n\t}\n}\n","// import type {BaseThreejsCameraObjNodeType} from '../../_BaseCamera';\n// import {BaseNodeType} from '../../../_Base';\nimport {Constructor} from '../../../../../types/GlobalTypes';\nimport {NetworkNodeType} from '../../../../poly/NodeContext';\n// interface DisposablePass extends Pass {\n// \tdispose: () => void;\n// }\n// const POST_PROCESS_PARAM_OPTIONS = {\n// \tcallback: (node: BaseNodeType) => {\n// \t\t// PARAM_CALLBACK_reset_effects_composer(node as BaseThreejsCameraObjNodeType);\n// \t},\n// };\n\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\n// import {PARAM_CALLBACK_reset_effects_composer} from './postProcessParamCallback';\nexport function CameraPostProcessParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tdoPostProcess = ParamConfig.BOOLEAN(0);\n\t\tpostProcessNode = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {\n\t\t\t\tdoPostProcess: 1,\n\t\t\t},\n\t\t\tnodeSelection: {\n\t\t\t\ttypes: [NetworkNodeType.POST],\n\t\t\t},\n\t\t\t// cook: false,\n\t\t\t// ...POST_PROCESS_PARAM_OPTIONS,\n\t\t\tdependentOnFoundNode: false,\n\t\t});\n\t\t// prepend_render_pass = ParamConfig.BOOLEAN(1, {\n\t\t// \tvisibleIf: {\n\t\t// \t\tdoPostProcess: 1,\n\t\t// \t},\n\t\t// });\n\t\t// use_render_target = ParamConfig.BOOLEAN(0, {\n\t\t// \tvisibleIf: {\n\t\t// \t\tdoPostProcess: 1,\n\t\t// \t},\n\t\t// \t...POST_PROCESS_PARAM_OPTIONS,\n\t\t// });\n\t};\n}\n","import {Constructor} from '../../../../../types/GlobalTypes';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {RopType} from '../../../../poly/registers/nodes/types/Rop';\nimport {ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {ObjType} from '../../../../poly/registers/nodes/types/Obj';\n\nexport function CameraRenderParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\trender = ParamConfig.FOLDER();\n\n\t\t/** @param toggle on to override rendered scene */\n\t\tsetScene = ParamConfig.BOOLEAN(0);\n\t\t/** @param override rendered scene */\n\t\tscene = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {setScene: 1},\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.OBJ,\n\t\t\t\ttypes: [ObjType.SCENE],\n\t\t\t},\n\t\t});\n\n\t\t/** @param toggle on to override the renderer */\n\t\tsetRenderer = ParamConfig.BOOLEAN(0);\n\t\t/** @param override renderer used */\n\t\trenderer = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {setRenderer: 1},\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.ROP,\n\t\t\t\ttypes: [RopType.WEBGL],\n\t\t\t},\n\t\t\tdependentOnFoundNode: true,\n\t\t});\n\n\t\t/** @param toggle on to add a CSSRenderer to have html elements on top of the 3D objects */\n\t\tsetCSSRenderer = ParamConfig.BOOLEAN(0);\n\t\t/** @param add a css renderer */\n\t\tCSSRenderer = ParamConfig.NODE_PATH('', {\n\t\t\tvisibleIf: {setCSSRenderer: 1},\n\t\t\tnodeSelection: {\n\t\t\t\tcontext: NodeContext.ROP,\n\t\t\t\ttypes: [RopType.CSS2D, RopType.CSS3D],\n\t\t\t},\n\t\t\tdependentOnFoundNode: true,\n\t\t});\n\t};\n}\n","/**\n * Adds an effect pass, which can combine multiples passes into 1.\n *\n *\n */\nimport {TypedPostNode, TypedPostNodeContext} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {Effect, EffectPass, Pass} from 'postprocessing';\nimport {rangeWithEnd, arrayCompact} from '../../../core/ArrayUtils';\nimport {BaseNodeType} from '../_Base';\nimport {NodeEvent} from '../../poly/NodeEvent';\nimport {PostType} from '../../poly/registers/nodes/types/Post';\n\nconst POSSIBLE_COMBINED_PASSES_COUNT = 5;\nexport const RANGE = rangeWithEnd(POSSIBLE_COMBINED_PASSES_COUNT);\nconst DEFAULT_INPUTS_COUNT = POSSIBLE_COMBINED_PASSES_COUNT + 1;\n\nclass EffectPassPostParamsConfig extends NodeParamsConfig {\n\t/** @param number of inputs that this node can merge geometries from */\n\tinputsCount = ParamConfig.INTEGER(DEFAULT_INPUTS_COUNT, {\n\t\trange: [1, 32],\n\t\trangeLocked: [true, false],\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tEffectPassPostNode.PARAM_CALLBACK_setInputsCount(node as EffectPassPostNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new EffectPassPostParamsConfig();\nexport class EffectPassPostNode extends TypedPostNode<EffectPass, EffectPassPostParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn PostType.EFFECT_PASS;\n\t}\n\n\toverride initializeNode() {\n\t\tsuper.initializeNode();\n\t\tthis.io.inputs.setCount(DEFAULT_INPUTS_COUNT);\n\n\t\tthis.params.onParamsCreated('update inputs', () => {\n\t\t\tthis._callbackUpdateInputsCount();\n\t\t});\n\t}\n\n\toverride _setupComposerIfActive(context: TypedPostNodeContext): void {\n\t\tconst inputIndices = RANGE.map((i) => i + 1);\n\t\tconst passesToCombine: Pass[] = [];\n\t\tarrayCompact(\n\t\t\tinputIndices.map((index) => {\n\t\t\t\tconst input = this.io.inputs.input(index);\n\t\t\t\tif (input) {\n\t\t\t\t\tif (!input.flags.bypass.active()) {\n\t\t\t\t\t\treturn input.createPassForContext(context);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t\tpassesToCombine\n\t\t).flat();\n\n\t\tconst effectLists: Effect[][] = [];\n\t\tarrayCompact(\n\t\t\tpassesToCombine.map((pass) => {\n\t\t\t\treturn (pass as any).effects as undefined | Effect[];\n\t\t\t}),\n\t\t\teffectLists\n\t\t);\n\t\tconst effects = effectLists.flat();\n\t\tconst pass = new EffectPass(context.camera, ...effects);\n\t\tcontext.composerController.addPassByNodeInBuildPassesProcess(this, pass, context.composer);\n\t}\n\n\toverride updatePass(pass: EffectPass) {}\n\n\tprivate _callbackUpdateInputsCount() {\n\t\tthis.io.inputs.setCount(1, this.pv.inputsCount);\n\t\tthis.emit(NodeEvent.INPUTS_UPDATED);\n\t}\n\tstatic PARAM_CALLBACK_setInputsCount(node: EffectPassPostNode) {\n\t\tnode._callbackUpdateInputsCount();\n\t}\n}\n","import {Camera, Scene, WebGLRenderer} from 'three';\nimport {TypedNode, BaseNodeType} from '../_Base';\nimport {EffectComposer, Pass} from 'postprocessing';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {FlagsControllerDB} from '../utils/FlagsController';\nimport {BaseParamType} from '../../params/_Base';\nimport {ParamOptions} from '../../params/utils/OptionsController';\nimport {BaseNetworkPostProcessNodeType, EffectComposerController} from './utils/EffectComposerController';\nimport {CoreCameraPostProcessController} from '../../../core/camera/CoreCameraPostProcessController';\nimport {isArray} from '../../../core/Type';\nimport {BaseViewerType} from '../../viewers/_Base';\n\nexport interface TypedPostNodeContext {\n\tcomposerController: EffectComposerController;\n\tcomposer: EffectComposer;\n\tcamera: Camera;\n\trenderer: WebGLRenderer;\n\t// resolution: Vector2;\n\tscene: Scene;\n\t// requester: BaseNodeType;\n\tviewer: BaseViewerType;\n}\n\nfunction PostParamCallback(node: BaseNodeType, param: BaseParamType) {\n\tTypedPostNode.PARAM_CALLBACK_updatePasses(node as BasePostProcessNodeType);\n}\nexport const PostParamOptions: ParamOptions = {\n\tcook: false,\n\tcallback: PostParamCallback,\n\tcomputeOnDirty: true, // important if an expression drives a param\n};\n\n/**\n *\n *\n * TypedPostNode is the base class for all nodes that create post-processing passes. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\n\nexport class TypedPostNode<P extends Pass, K extends NodeParamsConfig> extends TypedNode<NodeContext.POST, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.POST;\n\t}\n\n\tpublic override readonly flags: FlagsControllerDB = new FlagsControllerDB(this);\n\n\tprotected _passesByEffectsComposer: Map<EffectComposer, P | P[]> = new Map();\n\n\toverride initializeNode() {\n\t\tthis.flags.display.set(false);\n\t\tthis.flags.display.onUpdate(() => {\n\t\t\tif (!this.flags.display.active()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst parent = this.parent();\n\t\t\tif (!(parent && parent.displayNodeController)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tparent.displayNodeController.setDisplayNode(this);\n\t\t});\n\n\t\tthis.io.inputs.setCount(0, 1);\n\t\tthis.io.outputs.setHasOneOutput();\n\t}\n\n\toverride cook() {\n\t\tthis.cookController.endCook();\n\t}\n\tsetupComposer(context: TypedPostNodeContext) {\n\t\tthis._addPassFromInput(0, context);\n\n\t\tif (!this.flags.bypass.active()) {\n\t\t\tthis._setupComposerIfActive(context);\n\t\t}\n\t}\n\tprotected _setupComposerIfActive(context: TypedPostNodeContext) {\n\t\tconst pass = this.createPassForContext(context);\n\t\tif (pass) {\n\t\t\tconst array = isArray(pass) ? pass : [pass];\n\t\t\tfor (const p of array) {\n\t\t\t\tcontext.composerController.addPassByNodeInBuildPassesProcess(this, p, context.composer);\n\t\t\t}\n\t\t}\n\t}\n\tpassesByComposer(composer: EffectComposer) {\n\t\treturn this._passesByEffectsComposer.get(composer);\n\t}\n\n\tprotected _addPassFromInput(index: number, context: TypedPostNodeContext) {\n\t\tconst input = this.io.inputs.input(index);\n\t\tif (input) {\n\t\t\tinput.setupComposer(context);\n\t\t}\n\t}\n\tcreatePassForContext(context: TypedPostNodeContext) {\n\t\tlet pass = this._passesByEffectsComposer.get(context.composer);\n\t\tif (!pass) {\n\t\t\tpass = this.createPass(context);\n\t\t\tif (pass) {\n\t\t\t\tthis._passesByEffectsComposer.set(context.composer, pass);\n\t\t\t}\n\t\t}\n\t\treturn pass;\n\t}\n\tcreatePass(context: TypedPostNodeContext): P | P[] | undefined {\n\t\treturn undefined;\n\t}\n\n\tstatic PARAM_CALLBACK_updatePasses(node: BasePostProcessNodeType) {\n\t\tnode._updatePasses();\n\t}\n\tprotected _updatePasses() {\n\t\tthis._passesByEffectsComposer.forEach((passOrPasses) => {\n\t\t\tconst passes = isArray(passOrPasses) ? passOrPasses : [passOrPasses];\n\t\t\tfor (const pass of passes) {\n\t\t\t\tthis.updatePass(pass);\n\t\t\t}\n\t\t});\n\t}\n\tprotected updatePass(pass: P) {}\n\n\tprotected _postProcessNetworkNode(): BaseNetworkPostProcessNodeType {\n\t\tconst parentNode = this.parent()!;\n\t\tif (CoreCameraPostProcessController.isPostProcessNetworkNode(parentNode)) {\n\t\t\treturn parentNode as BaseNetworkPostProcessNodeType;\n\t\t} else {\n\t\t\tconsole.error('parent is neither a POST NETWORK or a POST node', parentNode);\n\t\t\tconst parentPostNode = parentNode as BasePostProcessNodeType;\n\t\t\treturn parentPostNode._postProcessNetworkNode();\n\t\t}\n\t}\n\t// protected _createRenderTarget(renderer: WebGLRenderer, options?: RenderTargetCreateOptions) {\n\t// \tconst parentNode = this._postProcessNetworkNode();\n\t// \treturn parentNode.effectsComposerController.createRenderTarget(renderer);\n\t// }\n\t// protected _createEffectComposer(renderer: WebGLRenderer, renderTarget?: WebGLRenderTarget) {\n\t// \treturn new EffectComposer(renderer, renderTarget);\n\t// }\n}\n\nexport type BasePostProcessNodeType = TypedPostNode<Pass, NodeParamsConfig>;\nexport class BasePostProcessNodeClass extends TypedPostNode<Pass, NodeParamsConfig> {}\n","import {Constructor, PolyDictionary, valueof} from '../../../../types/GlobalTypes';\nimport {WebGLRenderer, Scene, Camera, UnsignedByteType, HalfFloatType, FloatType} from 'three';\nimport {EffectComposer, RenderPass, Pass} from 'postprocessing';\nimport {DisplayNodeController, DisplayNodeControllerCallbacks} from '../../utils/DisplayNodeController';\nimport {PostNodeChildrenMap} from '../../../poly/registers/nodes/Post';\nimport {BaseNodeType, TypedNode} from '../../_Base';\nimport {BasePostProcessNodeType} from '../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../../core/BooleanValue';\nimport {BaseViewerType} from '../../../viewers/_Base';\nimport {WithPolyId} from '../../../poly/RenderersController';\n\nexport interface POLYEffectComposer extends EffectComposer, WithPolyId {}\n\nexport type PostProcessingTextureType = typeof UnsignedByteType | typeof HalfFloatType | typeof FloatType;\nconst RENDER_TARGET_TEXTURE_TYPE_OPTIONS: PolyDictionary<PostProcessingTextureType> = {\n\tUnsignedByteType: UnsignedByteType,\n\tHalfFloatType: HalfFloatType,\n\tFloatType: FloatType,\n};\nconst RENDER_TARGET_TEXTURE_TYPE_MENU_ENTRIES = Object.keys(RENDER_TARGET_TEXTURE_TYPE_OPTIONS).map((name) => {\n\treturn {\n\t\tname,\n\t\tvalue: RENDER_TARGET_TEXTURE_TYPE_OPTIONS[name] as number,\n\t};\n});\nexport function postProcessTextureTypeLabel(value: number) {\n\tfor (const entry of RENDER_TARGET_TEXTURE_TYPE_MENU_ENTRIES) {\n\t\tif (entry.value == value) {\n\t\t\treturn entry.name;\n\t\t}\n\t}\n}\n\nexport function PostProcessNetworkParamsConfigMixin<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tprependRenderPass = ParamConfig.BOOLEAN(1, {\n\t\t\tseparatorAfter: true,\n\t\t});\n\t\tdepthBuffer = ParamConfig.BOOLEAN(1);\n\t\tstencilBuffer = ParamConfig.BOOLEAN(0);\n\t\tsampling = ParamConfig.INTEGER(0, {\n\t\t\trange: [0, 4],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\ttTextureType = ParamConfig.BOOLEAN(0);\n\t\ttextureType = ParamConfig.INTEGER(UnsignedByteType, {\n\t\t\tvisibleIf: {tTextureType: 1},\n\t\t\tmenu: {\n\t\t\t\tentries: RENDER_TARGET_TEXTURE_TYPE_MENU_ENTRIES,\n\t\t\t},\n\t\t});\n\t};\n}\nexport class PostProcessNetworkParamsConfig extends PostProcessNetworkParamsConfigMixin(NodeParamsConfig) {}\nexport interface BaseNetworkPostProcessNodeType extends TypedNode<any, PostProcessNetworkParamsConfig> {\n\treadonly displayNodeController: DisplayNodeController;\n\tcreateNode<S extends keyof PostNodeChildrenMap>(node_class: S): PostNodeChildrenMap[S];\n\tcreateNode<K extends valueof<PostNodeChildrenMap>>(node_class: Constructor<K>): K;\n\tchildren(): BasePostProcessNodeType[];\n\tnodesByType<K extends keyof PostNodeChildrenMap>(type: K): PostNodeChildrenMap[K][];\n\n\treadonly effectsComposerController: EffectComposerController;\n}\n\ninterface CreateEffectsComposerOptions {\n\trenderer: WebGLRenderer;\n\tscene: Scene;\n\tcamera: Camera;\n\tviewer: BaseViewerType;\n\t// resolution: Vector2;\n\t// render_target?: WebGLRenderTarget;\n\t// requester: BaseNodeType;\n\t// useRenderTarget?: boolean;\n\t// prepend_render_pass?: boolean;\n}\ninterface ComposerAndOptions {\n\toptions: CreateEffectsComposerOptions;\n\tcomposer: EffectComposer;\n}\nexport interface RenderTargetCreateOptions {\n\twidth: number;\n\theight: number;\n}\n\nexport class EffectComposerController {\n\tprivate _composerAndOptionsByCamera: Map<Camera, ComposerAndOptions> = new Map();\n\tconstructor(private node: BaseNetworkPostProcessNodeType) {\n\t\tthis.node.dirtyController.addPostDirtyHook('EffectComposerController', () => {\n\t\t\tthis._updateComposers();\n\t\t});\n\t}\n\n\tdisplayNodeControllerCallbacks(): DisplayNodeControllerCallbacks {\n\t\treturn {\n\t\t\tonDisplayNodeRemove: () => {},\n\t\t\tonDisplayNodeSet: () => {\n\t\t\t\tthis.node.setDirty();\n\t\t\t},\n\t\t\tonDisplayNodeUpdate: () => {\n\t\t\t\tthis.node.setDirty();\n\t\t\t},\n\t\t};\n\t}\n\tprivate _nextId = 0;\n\tcreateEffectsComposer(options: CreateEffectsComposerOptions) {\n\t\tconst renderer = options.renderer;\n\n\t\tconst pv = this.node.pv;\n\n\t\tconst composer = new EffectComposer(renderer, {\n\t\t\tdepthBuffer: isBooleanTrue(pv.depthBuffer),\n\t\t\tstencilBuffer: isBooleanTrue(pv.stencilBuffer),\n\t\t\tmultisampling: pv.sampling,\n\t\t\tframeBufferType: isBooleanTrue(pv.tTextureType) ? pv.textureType : undefined,\n\t\t});\n\t\t(composer as POLYEffectComposer)._polygonId = this._nextId++;\n\t\treturn composer;\n\t}\n\n\tcreateEffectsComposerAndBuildPasses(options: CreateEffectsComposerOptions) {\n\t\tconst composer = this.createEffectsComposer(options);\n\t\tthis._composerAndOptionsByCamera.set(options.camera, {composer, options});\n\n\t\tthis._buildPasses(composer, options);\n\n\t\treturn composer;\n\t}\n\n\tprivate _updateComposers() {\n\t\tthis._composerAndOptionsByCamera.forEach(({composer, options}) => {\n\t\t\tthis._buildPasses(composer, options);\n\t\t});\n\t}\n\n\tprivate _passByNodeInBuildPassesProcess: Map<BaseNodeType, Pass> = new Map();\n\taddPassByNodeInBuildPassesProcess(node: BaseNodeType, pass: Pass, composer: EffectComposer) {\n\t\tthis._passByNodeInBuildPassesProcess.set(node, pass);\n\t\tcomposer.addPass(pass);\n\t}\n\t// passByNodeInBuildPassesProcess(node: BaseNodeType) {\n\t// \treturn this._passByNodeInBuildPassesProcess.get(node);\n\t// }\n\tprivate _buildPasses(composer: EffectComposer, options: CreateEffectsComposerOptions) {\n\t\tthis._passByNodeInBuildPassesProcess.clear();\n\n\t\tcomposer.removeAllPasses();\n\n\t\tif (isBooleanTrue(this.node.pv.prependRenderPass)) {\n\t\t\tconst renderPass = new RenderPass(options.scene, options.camera);\n\t\t\tcomposer.addPass(renderPass);\n\t\t}\n\n\t\tconst postNode = this.node.displayNodeController.displayNode() as BasePostProcessNodeType;\n\t\tif (postNode) {\n\t\t\tpostNode.setupComposer({\n\t\t\t\tcomposerController: this,\n\t\t\t\tcomposer: composer,\n\t\t\t\tcamera: options.camera,\n\t\t\t\trenderer: options.renderer,\n\t\t\t\t// resolution: options.resolution,\n\t\t\t\tscene: options.scene,\n\t\t\t\t// requester: options.requester,\n\t\t\t\tviewer: options.viewer,\n\t\t\t});\n\t\t} else {\n\t\t\tconsole.warn(`no displayNode found inside '${this.node.path()}'`);\n\t\t}\n\t\tthis._passByNodeInBuildPassesProcess.clear();\n\t}\n}\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import { NoBlending } from 'three';\nimport { MaterialBase } from '../MaterialBase.js';\n\nexport class BlendMaterial extends MaterialBase {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\tblending: NoBlending,\n\n\t\t\tuniforms: {\n\n\t\t\t\ttarget1: { value: null },\n\t\t\t\ttarget2: { value: null },\n\t\t\t\topacity: { value: 1.0 },\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform float opacity;\n\n\t\t\t\tuniform sampler2D target1;\n\t\t\t\tuniform sampler2D target2;\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec4 color1 = texture2D( target1, vUv );\n\t\t\t\t\tvec4 color2 = texture2D( target2, vUv );\n\n\t\t\t\t\tfloat invOpacity = 1.0 - opacity;\n\t\t\t\t\tfloat totalAlpha = color1.a * invOpacity + color2.a * opacity;\n\n\t\t\t\t\tif ( color1.a != 0.0 || color2.a != 0.0 ) {\n\n\t\t\t\t\t\tgl_FragColor.rgb = color1.rgb * ( invOpacity * color1.a / totalAlpha ) + color2.rgb * ( opacity * color2.a / totalAlpha );\n\t\t\t\t\t\tgl_FragColor.a = totalAlpha;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl_FragColor = vec4( 0.0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}`\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n","// References\n// - https://jcgt.org/published/0009/04/01/\n// - Code from https://www.shadertoy.com/view/WtGyDm\n\n// functions to generate multi-dimensions variables of the same functions\n// to support 1, 2, 3, and 4 dimensional sobol sampling.\nfunction generateSobolFunctionVariants( dim = 1 ) {\n\n\tlet type = 'uint';\n\tif ( dim > 1 ) {\n\n\t\ttype = 'uvec' + dim;\n\n\t}\n\n\treturn /* glsl */`\n\t\t${ type } sobolReverseBits( ${ type } x ) {\n\n\t\t\tx = ( ( ( x & 0xaaaaaaaau ) >> 1 ) | ( ( x & 0x55555555u ) << 1 ) );\n\t\t\tx = ( ( ( x & 0xccccccccu ) >> 2 ) | ( ( x & 0x33333333u ) << 2 ) );\n\t\t\tx = ( ( ( x & 0xf0f0f0f0u ) >> 4 ) | ( ( x & 0x0f0f0f0fu ) << 4 ) );\n\t\t\tx = ( ( ( x & 0xff00ff00u ) >> 8 ) | ( ( x & 0x00ff00ffu ) << 8 ) );\n\t\t\treturn ( ( x >> 16 ) | ( x << 16 ) );\n\n\t\t}\n\n\t\t${ type } sobolHashCombine( uint seed, ${ type } v ) {\n\n\t\t\treturn seed ^ ( v + ${ type }( ( seed << 6 ) + ( seed >> 2 ) ) );\n\n\t\t}\n\n\t\t${ type } sobolLaineKarrasPermutation( ${ type } x, ${ type } seed ) {\n\n\t\t\tx += seed;\n\t\t\tx ^= x * 0x6c50b47cu;\n\t\t\tx ^= x * 0xb82f1e52u;\n\t\t\tx ^= x * 0xc7afe638u;\n\t\t\tx ^= x * 0x8d22f6e6u;\n\t\t\treturn x;\n\n\t\t}\n\n\t\t${ type } nestedUniformScrambleBase2( ${ type } x, ${ type } seed ) {\n\n\t\t\tx = sobolLaineKarrasPermutation( x, seed );\n\t\t\tx = sobolReverseBits( x );\n\t\t\treturn x;\n\n\t\t}\n\t`;\n\n}\n\nfunction generateSobolSampleFunctions( dim = 1 ) {\n\n\tlet utype = 'uint';\n\tlet vtype = 'float';\n\tlet num = '';\n\tlet components = '.r';\n\tlet combineValues = '1u';\n\tif ( dim > 1 ) {\n\n\t\tutype = 'uvec' + dim;\n\t\tvtype = 'vec' + dim;\n\t\tnum = dim + '';\n\t\tif ( dim === 2 ) {\n\n\t\t\tcomponents = '.rg';\n\t\t\tcombineValues = 'uvec2( 1u, 2u )';\n\n\t\t} else if ( dim === 3 ) {\n\n\t\t\tcomponents = '.rgb';\n\t\t\tcombineValues = 'uvec3( 1u, 2u, 3u )';\n\n\t\t} else {\n\n\t\t\tcomponents = '';\n\t\t\tcombineValues = 'uvec4( 1u, 2u, 3u, 4u )';\n\n\t\t}\n\n\t}\n\n\treturn /* glsl */`\n\n\t\t${ vtype } sobol${ num }( int effect ) {\n\n\t\t\tuint seed = sobolGetSeed( sobolBounceIndex, uint( effect ) );\n\t\t\tuint index = sobolPathIndex;\n\n\t\t\tuint shuffle_seed = sobolHashCombine( seed, 0u );\n\t\t\tuint shuffled_index = nestedUniformScrambleBase2( sobolReverseBits( index ), shuffle_seed );\n\t\t\t${ vtype } sobol_pt = sobolGetTexturePoint( shuffled_index )${ components };\n\t\t\t${ utype } result = ${ utype }( sobol_pt * 16777216.0 );\n\n\t\t\t${ utype } seed2 = sobolHashCombine( seed, ${ combineValues } );\n\t\t\tresult = nestedUniformScrambleBase2( result, seed2 );\n\n\t\t\treturn SOBOL_FACTOR * ${ vtype }( result >> 8 );\n\n\t\t}\n\t`;\n\n}\n\nexport const sobolCommonGLSL = /* glsl */`\n\n\t// Utils\n\tconst float SOBOL_FACTOR = 1.0 / 16777216.0;\n\tconst uint SOBOL_MAX_POINTS = 256u * 256u;\n\n\t${ generateSobolFunctionVariants( 1 ) }\n\t${ generateSobolFunctionVariants( 2 ) }\n\t${ generateSobolFunctionVariants( 3 ) }\n\t${ generateSobolFunctionVariants( 4 ) }\n\n\tuint sobolHash( uint x ) {\n\n\t\t// finalizer from murmurhash3\n\t\tx ^= x >> 16;\n\t\tx *= 0x85ebca6bu;\n\t\tx ^= x >> 13;\n\t\tx *= 0xc2b2ae35u;\n\t\tx ^= x >> 16;\n\t\treturn x;\n\n\t}\n\n`;\n\nexport const sobolGenerationGLSL = /* glsl */`\n\n\tconst uint SOBOL_DIRECTIONS_1[ 32 ] = uint[ 32 ](\n\t\t0x80000000u, 0xc0000000u, 0xa0000000u, 0xf0000000u,\n\t\t0x88000000u, 0xcc000000u, 0xaa000000u, 0xff000000u,\n\t\t0x80800000u, 0xc0c00000u, 0xa0a00000u, 0xf0f00000u,\n\t\t0x88880000u, 0xcccc0000u, 0xaaaa0000u, 0xffff0000u,\n\t\t0x80008000u, 0xc000c000u, 0xa000a000u, 0xf000f000u,\n\t\t0x88008800u, 0xcc00cc00u, 0xaa00aa00u, 0xff00ff00u,\n\t\t0x80808080u, 0xc0c0c0c0u, 0xa0a0a0a0u, 0xf0f0f0f0u,\n\t\t0x88888888u, 0xccccccccu, 0xaaaaaaaau, 0xffffffffu\n\t);\n\n\tconst uint SOBOL_DIRECTIONS_2[ 32 ] = uint[ 32 ](\n\t\t0x80000000u, 0xc0000000u, 0x60000000u, 0x90000000u,\n\t\t0xe8000000u, 0x5c000000u, 0x8e000000u, 0xc5000000u,\n\t\t0x68800000u, 0x9cc00000u, 0xee600000u, 0x55900000u,\n\t\t0x80680000u, 0xc09c0000u, 0x60ee0000u, 0x90550000u,\n\t\t0xe8808000u, 0x5cc0c000u, 0x8e606000u, 0xc5909000u,\n\t\t0x6868e800u, 0x9c9c5c00u, 0xeeee8e00u, 0x5555c500u,\n\t\t0x8000e880u, 0xc0005cc0u, 0x60008e60u, 0x9000c590u,\n\t\t0xe8006868u, 0x5c009c9cu, 0x8e00eeeeu, 0xc5005555u\n\t);\n\n\tconst uint SOBOL_DIRECTIONS_3[ 32 ] = uint[ 32 ](\n\t\t0x80000000u, 0xc0000000u, 0x20000000u, 0x50000000u,\n\t\t0xf8000000u, 0x74000000u, 0xa2000000u, 0x93000000u,\n\t\t0xd8800000u, 0x25400000u, 0x59e00000u, 0xe6d00000u,\n\t\t0x78080000u, 0xb40c0000u, 0x82020000u, 0xc3050000u,\n\t\t0x208f8000u, 0x51474000u, 0xfbea2000u, 0x75d93000u,\n\t\t0xa0858800u, 0x914e5400u, 0xdbe79e00u, 0x25db6d00u,\n\t\t0x58800080u, 0xe54000c0u, 0x79e00020u, 0xb6d00050u,\n\t\t0x800800f8u, 0xc00c0074u, 0x200200a2u, 0x50050093u\n\t);\n\n\tconst uint SOBOL_DIRECTIONS_4[ 32 ] = uint[ 32 ](\n\t\t0x80000000u, 0x40000000u, 0x20000000u, 0xb0000000u,\n\t\t0xf8000000u, 0xdc000000u, 0x7a000000u, 0x9d000000u,\n\t\t0x5a800000u, 0x2fc00000u, 0xa1600000u, 0xf0b00000u,\n\t\t0xda880000u, 0x6fc40000u, 0x81620000u, 0x40bb0000u,\n\t\t0x22878000u, 0xb3c9c000u, 0xfb65a000u, 0xddb2d000u,\n\t\t0x78022800u, 0x9c0b3c00u, 0x5a0fb600u, 0x2d0ddb00u,\n\t\t0xa2878080u, 0xf3c9c040u, 0xdb65a020u, 0x6db2d0b0u,\n\t\t0x800228f8u, 0x400b3cdcu, 0x200fb67au, 0xb00ddb9du\n\t);\n\n\tuint getMaskedSobol( uint index, uint directions[ 32 ] ) {\n\n\t\tuint X = 0u;\n\t\tfor ( int bit = 0; bit < 32; bit ++ ) {\n\n\t\t\tuint mask = ( index >> bit ) & 1u;\n\t\t\tX ^= mask * directions[ bit ];\n\n\t\t}\n\t\treturn X;\n\n\t}\n\n\tvec4 generateSobolPoint( uint index ) {\n\n\t\tif ( index >= SOBOL_MAX_POINTS ) {\n\n\t\t\treturn vec4( 0.0 );\n\n\t\t}\n\n\t\t// NOTEL this sobol \"direction\" is also available but we can't write out 5 components\n\t\t// uint x = index & 0x00ffffffu;\n\t\tuint x = sobolReverseBits( getMaskedSobol( index, SOBOL_DIRECTIONS_1 ) ) & 0x00ffffffu;\n\t\tuint y = sobolReverseBits( getMaskedSobol( index, SOBOL_DIRECTIONS_2 ) ) & 0x00ffffffu;\n\t\tuint z = sobolReverseBits( getMaskedSobol( index, SOBOL_DIRECTIONS_3 ) ) & 0x00ffffffu;\n\t\tuint w = sobolReverseBits( getMaskedSobol( index, SOBOL_DIRECTIONS_4 ) ) & 0x00ffffffu;\n\n\t\treturn vec4( x, y, z, w ) * SOBOL_FACTOR;\n\n\t}\n\n`;\n\nexport const sobolSamplingGLSL = /* glsl */`\n\n\t// Seeds\n\tuniform sampler2D sobolTexture;\n\tuint sobolPixelIndex = 0u;\n\tuint sobolPathIndex = 0u;\n\tuint sobolBounceIndex = 0u;\n\n\tuint sobolGetSeed( uint bounce, uint effect ) {\n\n\t\treturn sobolHash(\n\t\t\tsobolHashCombine(\n\t\t\t\tsobolHashCombine(\n\t\t\t\t\tsobolHash( bounce ),\n\t\t\t\t\tsobolPixelIndex\n\t\t\t\t),\n\t\t\t\teffect\n\t\t\t)\n\t\t);\n\n\t}\n\n\tvec4 sobolGetTexturePoint( uint index ) {\n\n\t\tif ( index >= SOBOL_MAX_POINTS ) {\n\n\t\t\tindex = index % SOBOL_MAX_POINTS;\n\n\t\t}\n\n\t\tuvec2 dim = uvec2( textureSize( sobolTexture, 0 ).xy );\n\t\tuint y = index / dim.x;\n\t\tuint x = index - y * dim.x;\n\t\tvec2 uv = vec2( x, y ) / vec2( dim );\n\t\treturn texture( sobolTexture, uv );\n\n\t}\n\n\t${ generateSobolSampleFunctions( 1 ) }\n\t${ generateSobolSampleFunctions( 2 ) }\n\t${ generateSobolSampleFunctions( 3 ) }\n\t${ generateSobolSampleFunctions( 4 ) }\n\n`;\n","import { FloatType, NearestFilter, NoBlending, RGBAFormat, Vector2, WebGLRenderTarget } from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { MaterialBase } from '../materials/MaterialBase.js';\nimport { sobolCommonGLSL, sobolGenerationGLSL } from '../shader/rand/sobol.glsl.js';\n\nclass SobolNumbersMaterial extends MaterialBase {\n\n\tconstructor() {\n\n\t\tsuper( {\n\n\t\t\tblending: NoBlending,\n\n\t\t\tuniforms: {\n\n\t\t\t\tresolution: { value: new Vector2() },\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\t${ sobolCommonGLSL }\n\t\t\t\t${ sobolGenerationGLSL }\n\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform vec2 resolution;\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tuint index = uint( gl_FragCoord.y ) * uint( resolution.x ) + uint( gl_FragCoord.x );\n\t\t\t\t\tgl_FragColor = generateSobolPoint( index );\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t} );\n\n\t}\n\n}\n\nexport class SobolNumberMapGenerator {\n\n\tgenerate( renderer, dimensions = 256 ) {\n\n\t\tconst target = new WebGLRenderTarget( dimensions, dimensions, {\n\n\t\t\ttype: FloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\tgenerateMipmaps: false,\n\n\t\t} );\n\n\t\tconst ogTarget = renderer.getRenderTarget();\n\t\trenderer.setRenderTarget( target );\n\n\t\tconst quad = new FullScreenQuad( new SobolNumbersMaterial() );\n\t\tquad.material.resolution.set( dimensions, dimensions );\n\t\tquad.render( renderer );\n\n\t\trenderer.setRenderTarget( ogTarget );\n\t\tquad.dispose();\n\n\t\treturn target;\n\n\t}\n\n}\n","import { RGBAFormat, FloatType, HalfFloatType, Color, Vector2, WebGLRenderTarget, NoBlending, NormalBlending, Vector4 } from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { BlendMaterial } from '../materials/fullscreen/BlendMaterial.js';\nimport { SobolNumberMapGenerator } from '../utils/SobolNumberMapGenerator.js';\n\nconst _scissor = new Vector4();\nconst _viewport = new Vector4();\n\nfunction* renderTask() {\n\n\tconst {\n\t\t_renderer,\n\t\t_fsQuad,\n\t\t_blendQuad,\n\t\t_primaryTarget,\n\t\t_blendTargets,\n\t\t_sobolTarget,\n\t\t_subframe,\n\t\talpha,\n\t\tcamera,\n\t\tmaterial,\n\t} = this;\n\tconst _ogScissor = new Vector4();\n\tconst _ogViewport = new Vector4();\n\n\tconst blendMaterial = _blendQuad.material;\n\tlet [ blendTarget1, blendTarget2 ] = _blendTargets;\n\n\twhile ( true ) {\n\n\t\tif ( alpha ) {\n\n\t\t\tblendMaterial.opacity = this._opacityFactor / ( this._samples + 1 );\n\t\t\tmaterial.blending = NoBlending;\n\t\t\tmaterial.opacity = 1;\n\n\t\t} else {\n\n\t\t\tmaterial.opacity = this._opacityFactor / ( this._samples + 1 );\n\t\t\tmaterial.blending = NormalBlending;\n\n\t\t}\n\n\t\tconst [ subX, subY, subW, subH ] = _subframe;\n\n\t\tconst w = _primaryTarget.width;\n\t\tconst h = _primaryTarget.height;\n\t\tmaterial.resolution.set( w * subW, h * subH );\n\t\tmaterial.sobolTexture = _sobolTarget.texture;\n\t\tmaterial.seed ++;\n\n\t\tconst tilesX = this.tiles.x || 1;\n\t\tconst tilesY = this.tiles.y || 1;\n\t\tconst totalTiles = tilesX * tilesY;\n\t\tconst dprInv = ( 1 / _renderer.getPixelRatio() );\n\n\t\tfor ( let y = 0; y < tilesY; y ++ ) {\n\n\t\t\tfor ( let x = 0; x < tilesX; x ++ ) {\n\n\t\t\t\tmaterial.cameraWorldMatrix.copy( camera.matrixWorld );\n\t\t\t\tmaterial.invProjectionMatrix.copy( camera.projectionMatrixInverse );\n\n\t\t\t\t// Perspective camera (default)\n\t\t\t\tlet cameraType = 0;\n\n\t\t\t\t// An orthographic projection matrix will always have the bottom right element == 1\n\t\t\t\t// And a perspective projection matrix will always have the bottom right element == 0\n\t\t\t\tif ( camera.projectionMatrix.elements[ 15 ] > 0 ) {\n\n\t\t\t\t\t// Orthographic\n\t\t\t\t\tcameraType = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( camera.isEquirectCamera ) {\n\n\t\t\t\t\t// Equirectangular\n\t\t\t\t\tcameraType = 2;\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.setDefine( 'CAMERA_TYPE', cameraType );\n\n\t\t\t\t// store og state\n\t\t\t\tconst ogRenderTarget = _renderer.getRenderTarget();\n\t\t\t\tconst ogAutoClear = _renderer.autoClear;\n\t\t\t\tconst ogScissorTest = _renderer.getScissorTest();\n\t\t\t\t_renderer.getScissor( _ogScissor );\n\t\t\t\t_renderer.getViewport( _ogViewport );\n\n\t\t\t\tlet tx = x;\n\t\t\t\tlet ty = y;\n\t\t\t\tif ( ! this.stableTiles ) {\n\n\t\t\t\t\tconst tileIndex = ( this._currentTile ) % ( tilesX * tilesY );\n\t\t\t\t\ttx = tileIndex % tilesX;\n\t\t\t\t\tty = ~ ~ ( tileIndex / tilesX );\n\n\t\t\t\t\tthis._currentTile = tileIndex + 1;\n\n\t\t\t\t}\n\n\t\t\t\t// three.js renderer takes values relative to the current pixel ratio\n\t\t\t\t_renderer.setRenderTarget( _primaryTarget );\n\t\t\t\t_renderer.setScissorTest( true );\n\n\t\t\t\t// set the scissor window for a subtile\n\t\t\t\t_scissor.x = tx * w / tilesX;\n\t\t\t\t_scissor.y = ( tilesY - ty - 1 ) * h / tilesY;\n\t\t\t\t_scissor.z = w / tilesX;\n\t\t\t\t_scissor.w = h / tilesY;\n\n\t\t\t\t// adjust for the subframe\n\t\t\t\t_scissor.x = subX * w + subW * _scissor.x;\n\t\t\t\t_scissor.y = subY * h + subH * _scissor.y;\n\t\t\t\t_scissor.z = subW * _scissor.z;\n\t\t\t\t_scissor.w = subH * _scissor.w;\n\n\t\t\t\t// round for floating point cases\n\t\t\t\t_scissor.x = _scissor.x;\n\t\t\t\t_scissor.y = _scissor.y;\n\t\t\t\t_scissor.z = _scissor.z;\n\t\t\t\t_scissor.w = _scissor.w;\n\n\t\t\t\t// multiply inverse of DPR in because threes multiplies it in\n\t\t\t\t_scissor.multiplyScalar( dprInv ).ceil();\n\n\t\t\t\t_viewport.x = subX * w;\n\t\t\t\t_viewport.y = subY * h;\n\t\t\t\t_viewport.z = subW * w;\n\t\t\t\t_viewport.w = subH * h;\n\t\t\t\t_viewport.multiplyScalar( dprInv ).ceil();\n\n\t\t\t\t_renderer.setScissor( _scissor );\n\t\t\t\t_renderer.setViewport( _viewport );\n\n\t\t\t\t_renderer.autoClear = false;\n\t\t\t\t_fsQuad.render( _renderer );\n\n\t\t\t\t// reset original renderer state\n\t\t\t\t_renderer.setViewport( _ogViewport );\n\t\t\t\t_renderer.setScissor( _ogScissor );\n\t\t\t\t_renderer.setScissorTest( ogScissorTest );\n\t\t\t\t_renderer.setRenderTarget( ogRenderTarget );\n\t\t\t\t_renderer.autoClear = ogAutoClear;\n\n\t\t\t\t// swap and blend alpha targets\n\t\t\t\tif ( alpha ) {\n\n\t\t\t\t\tblendMaterial.target1 = blendTarget1.texture;\n\t\t\t\t\tblendMaterial.target2 = _primaryTarget.texture;\n\n\t\t\t\t\t_renderer.setRenderTarget( blendTarget2 );\n\t\t\t\t\t_blendQuad.render( _renderer );\n\t\t\t\t\t_renderer.setRenderTarget( ogRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tthis._samples += ( 1 / totalTiles );\n\n\t\t\t\t// round the samples value if we've finished the tiles\n\t\t\t\tif ( x === tilesX - 1 && y === tilesY - 1 ) {\n\n\t\t\t\t\tthis._samples = Math.round( this._samples );\n\n\t\t\t\t}\n\n\t\t\t\tyield;\n\n\t\t\t}\n\n\t\t}\n\n\t\t[ blendTarget1, blendTarget2 ] = [ blendTarget2, blendTarget1 ];\n\n\t}\n\n}\n\nconst ogClearColor = new Color();\nexport class PathTracingRenderer {\n\n\tget material() {\n\n\t\treturn this._fsQuad.material;\n\n\t}\n\n\tset material( v ) {\n\n\t\tthis._fsQuad.material = v;\n\n\t}\n\n\tget target() {\n\n\t\treturn this._alpha ? this._blendTargets[ 1 ] : this._primaryTarget;\n\n\t}\n\n\tset alpha( v ) {\n\n\t\tif ( this._alpha === v ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( ! v ) {\n\n\t\t\tthis._blendTargets[ 0 ].dispose();\n\t\t\tthis._blendTargets[ 1 ].dispose();\n\n\t\t}\n\n\t\tthis._alpha = v;\n\t\tthis.reset();\n\n\t}\n\n\tget alpha() {\n\n\t\treturn this._alpha;\n\n\t}\n\n\tget samples() {\n\n\t\treturn this._samples;\n\n\t}\n\n\tconstructor( renderer ) {\n\n\t\tthis.camera = null;\n\t\tthis.tiles = new Vector2( 1, 1 );\n\n\t\tthis.stableNoise = false;\n\t\tthis.stableTiles = true;\n\n\t\tthis._samples = 0;\n\t\tthis._subframe = new Vector4( 0, 0, 1, 1 );\n\t\tthis._opacityFactor = 1.0;\n\t\tthis._renderer = renderer;\n\t\tthis._alpha = false;\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\t\tthis._blendQuad = new FullScreenQuad( new BlendMaterial() );\n\t\tthis._task = null;\n\t\tthis._currentTile = 0;\n\n\t\tthis._sobolTarget = new SobolNumberMapGenerator().generate( renderer );\n\n\t\t// will be null if extension not supported\n\t\tconst floatLinearExtensionSupported = renderer.extensions.get( 'OES_texture_float_linear' );\n\n\t\tthis._primaryTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\tformat: RGBAFormat,\n\t\t\ttype: floatLinearExtensionSupported ? FloatType : HalfFloatType,\n\t\t} );\n\t\tthis._blendTargets = [\n\t\t\tnew WebGLRenderTarget( 1, 1, {\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\ttype: floatLinearExtensionSupported ? FloatType : HalfFloatType,\n\t\t\t} ),\n\t\t\tnew WebGLRenderTarget( 1, 1, {\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\ttype: floatLinearExtensionSupported ? FloatType : HalfFloatType,\n\t\t\t} ),\n\t\t];\n\n\t}\n\n\tsetSize( w, h ) {\n\n\t\tw = Math.ceil( w );\n\t\th = Math.ceil( h );\n\n\t\tif ( this._primaryTarget.width === w && this._primaryTarget.height === h ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._primaryTarget.setSize( w, h );\n\t\tthis._blendTargets[ 0 ].setSize( w, h );\n\t\tthis._blendTargets[ 1 ].setSize( w, h );\n\t\tthis.reset();\n\n\t}\n\n\tdispose() {\n\n\t\tthis._primaryTarget.dispose();\n\t\tthis._blendTargets[ 0 ].dispose();\n\t\tthis._blendTargets[ 1 ].dispose();\n\t\tthis._sobolTarget.dispose();\n\n\t\tthis._fsQuad.dispose();\n\t\tthis._blendQuad.dispose();\n\t\tthis._task = null;\n\n\t}\n\n\treset() {\n\n\t\tconst { _renderer, _primaryTarget, _blendTargets } = this;\n\t\tconst ogRenderTarget = _renderer.getRenderTarget();\n\t\tconst ogClearAlpha = _renderer.getClearAlpha();\n\t\t_renderer.getClearColor( ogClearColor );\n\n\t\t_renderer.setRenderTarget( _primaryTarget );\n\t\t_renderer.setClearColor( 0, 0 );\n\t\t_renderer.clearColor();\n\n\t\t_renderer.setRenderTarget( _blendTargets[ 0 ] );\n\t\t_renderer.setClearColor( 0, 0 );\n\t\t_renderer.clearColor();\n\n\t\t_renderer.setRenderTarget( _blendTargets[ 1 ] );\n\t\t_renderer.setClearColor( 0, 0 );\n\t\t_renderer.clearColor();\n\n\t\t_renderer.setClearColor( ogClearColor, ogClearAlpha );\n\t\t_renderer.setRenderTarget( ogRenderTarget );\n\n\t\tthis._samples = 0;\n\t\tthis._task = null;\n\n\t\tif ( this.stableNoise ) {\n\n\t\t\tthis.material.seed = 0;\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tif ( ! this._task ) {\n\n\t\t\tthis._task = renderTask.call( this );\n\n\t\t}\n\n\t\tthis._task.next();\n\n\t}\n\n}\n","import {\n\tDataTexture,\n\tFloatType,\n\tIntType,\n\tUnsignedIntType,\n\tByteType,\n\tUnsignedByteType,\n\tShortType,\n\tUnsignedShortType,\n\n\tRedFormat,\n\tRGFormat,\n\tRGBAFormat,\n\n\tRedIntegerFormat,\n\tRGIntegerFormat,\n\tRGBAIntegerFormat,\n\n\tNearestFilter,\n} from 'three';\n\nfunction countToStringFormat( count ) {\n\n\tswitch ( count ) {\n\n\t\tcase 1: return 'R';\n\t\tcase 2: return 'RG';\n\t\tcase 3: return 'RGBA';\n\t\tcase 4: return 'RGBA';\n\n\t}\n\n\tthrow new Error();\n\n}\n\nfunction countToFormat( count ) {\n\n\tswitch ( count ) {\n\n\t\tcase 1: return RedFormat;\n\t\tcase 2: return RGFormat;\n\t\tcase 3: return RGBAFormat;\n\t\tcase 4: return RGBAFormat;\n\n\t}\n\n}\n\nfunction countToIntFormat( count ) {\n\n\tswitch ( count ) {\n\n\t\tcase 1: return RedIntegerFormat;\n\t\tcase 2: return RGIntegerFormat;\n\t\tcase 3: return RGBAIntegerFormat;\n\t\tcase 4: return RGBAIntegerFormat;\n\n\t}\n\n}\n\nexport class VertexAttributeTexture extends DataTexture {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis.minFilter = NearestFilter;\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.generateMipmaps = false;\n\t\tthis.overrideItemSize = null;\n\t\tthis._forcedType = null;\n\n\t}\n\n\tupdateFrom( attr ) {\n\n\t\tconst overrideItemSize = this.overrideItemSize;\n\t\tconst originalItemSize = attr.itemSize;\n\t\tconst originalCount = attr.count;\n\t\tif ( overrideItemSize !== null ) {\n\n\t\t\tif ( ( originalItemSize * originalCount ) % overrideItemSize !== 0.0 ) {\n\n\t\t\t\tthrow new Error( 'VertexAttributeTexture: overrideItemSize must divide evenly into buffer length.' );\n\n\t\t\t}\n\n\t\t\tattr.itemSize = overrideItemSize;\n\t\t\tattr.count = originalCount * originalItemSize / overrideItemSize;\n\n\t\t}\n\n\t\tconst itemSize = attr.itemSize;\n\t\tconst count = attr.count;\n\t\tconst normalized = attr.normalized;\n\t\tconst originalBufferCons = attr.array.constructor;\n\t\tconst byteCount = originalBufferCons.BYTES_PER_ELEMENT;\n\t\tlet targetType = this._forcedType;\n\t\tlet finalStride = itemSize;\n\n\t\t// derive the type of texture this should be in the shader\n\t\tif ( targetType === null ) {\n\n\t\t\tswitch ( originalBufferCons ) {\n\n\t\t\t\tcase Float32Array:\n\t\t\t\t\ttargetType = FloatType;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase Uint8Array:\n\t\t\t\tcase Uint16Array:\n\t\t\t\tcase Uint32Array:\n\t\t\t\t\ttargetType = UnsignedIntType;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase Int8Array:\n\t\t\t\tcase Int16Array:\n\t\t\t\tcase Int32Array:\n\t\t\t\t\ttargetType = IntType;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// get the target format to store the texture as\n\t\tlet type, format, normalizeValue, targetBufferCons;\n\t\tlet internalFormat = countToStringFormat( itemSize );\n\t\tswitch ( targetType ) {\n\n\t\t\tcase FloatType:\n\t\t\t\tnormalizeValue = 1.0;\n\t\t\t\tformat = countToFormat( itemSize );\n\n\t\t\t\tif ( normalized && byteCount === 1 ) {\n\n\t\t\t\t\ttargetBufferCons = originalBufferCons;\n\t\t\t\t\tinternalFormat += '8';\n\n\t\t\t\t\tif ( originalBufferCons === Uint8Array ) {\n\n\t\t\t\t\t\ttype = UnsignedByteType;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttype = ByteType;\n\t\t\t\t\t\tinternalFormat += '_SNORM';\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetBufferCons = Float32Array;\n\t\t\t\t\tinternalFormat += '32F';\n\t\t\t\t\ttype = FloatType;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase IntType:\n\t\t\t\tinternalFormat += byteCount * 8 + 'I';\n\t\t\t\tnormalizeValue = normalized ? Math.pow( 2, originalBufferCons.BYTES_PER_ELEMENT * 8 - 1 ) : 1.0;\n\t\t\t\tformat = countToIntFormat( itemSize );\n\n\t\t\t\tif ( byteCount === 1 ) {\n\n\t\t\t\t\ttargetBufferCons = Int8Array;\n\t\t\t\t\ttype = ByteType;\n\n\t\t\t\t} else if ( byteCount === 2 ) {\n\n\t\t\t\t\ttargetBufferCons = Int16Array;\n\t\t\t\t\ttype = ShortType;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetBufferCons = Int32Array;\n\t\t\t\t\ttype = IntType;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase UnsignedIntType:\n\t\t\t\tinternalFormat += byteCount * 8 + 'UI';\n\t\t\t\tnormalizeValue = normalized ? Math.pow( 2, originalBufferCons.BYTES_PER_ELEMENT * 8 - 1 ) : 1.0;\n\t\t\t\tformat = countToIntFormat( itemSize );\n\n\t\t\t\tif ( byteCount === 1 ) {\n\n\t\t\t\t\ttargetBufferCons = Uint8Array;\n\t\t\t\t\ttype = UnsignedByteType;\n\n\t\t\t\t} else if ( byteCount === 2 ) {\n\n\t\t\t\t\ttargetBufferCons = Uint16Array;\n\t\t\t\t\ttype = UnsignedShortType;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetBufferCons = Uint32Array;\n\t\t\t\t\ttype = UnsignedIntType;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// there will be a mismatch between format length and final length because\n\t\t// RGBFormat and RGBIntegerFormat was removed\n\t\tif ( finalStride === 3 && ( format === RGBAFormat || format === RGBAIntegerFormat ) ) {\n\n\t\t\tfinalStride = 4;\n\n\t\t}\n\n\t\t// copy the data over to the new texture array\n\t\tconst dimension = Math.ceil( Math.sqrt( count ) ) || 1;\n\t\tconst length = finalStride * dimension * dimension;\n\t\tconst dataArray = new targetBufferCons( length );\n\n\t\t// temporarily set the normalized state to false since we have custom normalization logic\n\t\tconst originalNormalized = attr.normalized;\n\t\tattr.normalized = false;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tconst ii = finalStride * i;\n\t\t\tdataArray[ ii ] = attr.getX( i ) / normalizeValue;\n\n\t\t\tif ( itemSize >= 2 ) {\n\n\t\t\t\tdataArray[ ii + 1 ] = attr.getY( i ) / normalizeValue;\n\n\t\t\t}\n\n\t\t\tif ( itemSize >= 3 ) {\n\n\t\t\t\tdataArray[ ii + 2 ] = attr.getZ( i ) / normalizeValue;\n\n\t\t\t\tif ( finalStride === 4 ) {\n\n\t\t\t\t\tdataArray[ ii + 3 ] = 1.0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( itemSize >= 4 ) {\n\n\t\t\t\tdataArray[ ii + 3 ] = attr.getW( i ) / normalizeValue;\n\n\t\t\t}\n\n\t\t}\n\n\t\tattr.normalized = originalNormalized;\n\n\t\tthis.internalFormat = internalFormat;\n\t\tthis.format = format;\n\t\tthis.type = type;\n\t\tthis.image.width = dimension;\n\t\tthis.image.height = dimension;\n\t\tthis.image.data = dataArray;\n\t\tthis.needsUpdate = true;\n\t\tthis.dispose();\n\n\t\tattr.itemSize = originalItemSize;\n\t\tattr.count = originalCount;\n\n\t}\n\n}\n\nexport class UIntVertexAttributeTexture extends VertexAttributeTexture {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis._forcedType = UnsignedIntType;\n\n\t}\n\n}\n\nexport class IntVertexAttributeTexture extends VertexAttributeTexture {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis._forcedType = IntType;\n\n\t}\n\n\n}\n\nexport class FloatVertexAttributeTexture extends VertexAttributeTexture {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis._forcedType = FloatType;\n\n\t}\n\n}\n","import {\n\tDataTexture,\n\tFloatType,\n\tUnsignedIntType,\n\tRGBAFormat,\n\tRGIntegerFormat,\n\tNearestFilter,\n\tBufferAttribute,\n} from 'three';\nimport {\n\tFloatVertexAttributeTexture,\n\tUIntVertexAttributeTexture,\n} from './VertexAttributeTexture.js';\nimport { BYTES_PER_NODE } from '../core/Constants.js';\nimport {\n\tBOUNDING_DATA_INDEX,\n\tCOUNT,\n\tIS_LEAF,\n\tRIGHT_NODE,\n\tOFFSET,\n\tSPLIT_AXIS,\n} from '../core/utils/nodeBufferUtils.js';\nimport { getIndexArray, getVertexCount } from '../core/build/geometryUtils.js';\n\nexport class MeshBVHUniformStruct {\n\n\tconstructor() {\n\n\t\tthis.index = new UIntVertexAttributeTexture();\n\t\tthis.position = new FloatVertexAttributeTexture();\n\t\tthis.bvhBounds = new DataTexture();\n\t\tthis.bvhContents = new DataTexture();\n\t\tthis._cachedIndexAttr = null;\n\n\t\tthis.index.overrideItemSize = 3;\n\n\t}\n\n\tupdateFrom( bvh ) {\n\n\t\tconst { geometry } = bvh;\n\t\tbvhToTextures( bvh, this.bvhBounds, this.bvhContents );\n\n\t\tthis.position.updateFrom( geometry.attributes.position );\n\n\t\t// dereference a new index attribute if we're using indirect storage\n\t\tif ( bvh.indirect ) {\n\n\t\t\tconst indirectBuffer = bvh._indirectBuffer;\n\t\t\tif (\n\t\t\t\tthis._cachedIndexAttr === null ||\n\t\t\t\tthis._cachedIndexAttr.count !== indirectBuffer.length\n\t\t\t) {\n\n\t\t\t\tif ( geometry.index ) {\n\n\t\t\t\t\tthis._cachedIndexAttr = geometry.index.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst array = getIndexArray( getVertexCount( geometry ) );\n\t\t\t\t\tthis._cachedIndexAttr = new BufferAttribute( array, 1, false );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdereferenceIndex( geometry, indirectBuffer, this._cachedIndexAttr );\n\t\t\tthis.index.updateFrom( this._cachedIndexAttr );\n\n\t\t} else {\n\n\t\t\tthis.index.updateFrom( geometry.index );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tconst { index, position, bvhBounds, bvhContents } = this;\n\n\t\tif ( index ) index.dispose();\n\t\tif ( position ) position.dispose();\n\t\tif ( bvhBounds ) bvhBounds.dispose();\n\t\tif ( bvhContents ) bvhContents.dispose();\n\n\t}\n\n}\n\nfunction dereferenceIndex( geometry, indirectBuffer, target ) {\n\n\tconst unpacked = target.array;\n\tconst indexArray = geometry.index ? geometry.index.array : null;\n\tfor ( let i = 0, l = indirectBuffer.length; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst v3 = 3 * indirectBuffer[ i ];\n\t\tfor ( let c = 0; c < 3; c ++ ) {\n\n\t\t\tunpacked[ i3 + c ] = indexArray ? indexArray[ v3 + c ] : v3 + c;\n\n\t\t}\n\n\t}\n\n}\n\nfunction bvhToTextures( bvh, boundsTexture, contentsTexture ) {\n\n\tconst roots = bvh._roots;\n\n\tif ( roots.length !== 1 ) {\n\n\t\tthrow new Error( 'MeshBVHUniformStruct: Multi-root BVHs not supported.' );\n\n\t}\n\n\tconst root = roots[ 0 ];\n\tconst uint16Array = new Uint16Array( root );\n\tconst uint32Array = new Uint32Array( root );\n\tconst float32Array = new Float32Array( root );\n\n\t// Both bounds need two elements per node so compute the height so it's twice as long as\n\t// the width so we can expand the row by two and still have a square texture\n\tconst nodeCount = root.byteLength / BYTES_PER_NODE;\n\tconst boundsDimension = 2 * Math.ceil( Math.sqrt( nodeCount / 2 ) );\n\tconst boundsArray = new Float32Array( 4 * boundsDimension * boundsDimension );\n\n\tconst contentsDimension = Math.ceil( Math.sqrt( nodeCount ) );\n\tconst contentsArray = new Uint32Array( 2 * contentsDimension * contentsDimension );\n\n\tfor ( let i = 0; i < nodeCount; i ++ ) {\n\n\t\tconst nodeIndex32 = i * BYTES_PER_NODE / 4;\n\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\tconst boundsIndex = BOUNDING_DATA_INDEX( nodeIndex32 );\n\t\tfor ( let b = 0; b < 3; b ++ ) {\n\n\t\t\tboundsArray[ 8 * i + 0 + b ] = float32Array[ boundsIndex + 0 + b ];\n\t\t\tboundsArray[ 8 * i + 4 + b ] = float32Array[ boundsIndex + 3 + b ];\n\n\t\t}\n\n\t\tif ( IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\n\t\t\tconst mergedLeafCount = 0xffff0000 | count;\n\t\t\tcontentsArray[ i * 2 + 0 ] = mergedLeafCount;\n\t\t\tcontentsArray[ i * 2 + 1 ] = offset;\n\n\t\t} else {\n\n\t\t\tconst rightIndex = 4 * RIGHT_NODE( nodeIndex32, uint32Array ) / BYTES_PER_NODE;\n\t\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\n\t\t\tcontentsArray[ i * 2 + 0 ] = splitAxis;\n\t\t\tcontentsArray[ i * 2 + 1 ] = rightIndex;\n\n\t\t}\n\n\t}\n\n\tboundsTexture.image.data = boundsArray;\n\tboundsTexture.image.width = boundsDimension;\n\tboundsTexture.image.height = boundsDimension;\n\tboundsTexture.format = RGBAFormat;\n\tboundsTexture.type = FloatType;\n\tboundsTexture.internalFormat = 'RGBA32F';\n\tboundsTexture.minFilter = NearestFilter;\n\tboundsTexture.magFilter = NearestFilter;\n\tboundsTexture.generateMipmaps = false;\n\tboundsTexture.needsUpdate = true;\n\tboundsTexture.dispose();\n\n\tcontentsTexture.image.data = contentsArray;\n\tcontentsTexture.image.width = contentsDimension;\n\tcontentsTexture.image.height = contentsDimension;\n\tcontentsTexture.format = RGIntegerFormat;\n\tcontentsTexture.type = UnsignedIntType;\n\tcontentsTexture.internalFormat = 'RG32UI';\n\tcontentsTexture.minFilter = NearestFilter;\n\tcontentsTexture.magFilter = NearestFilter;\n\tcontentsTexture.generateMipmaps = false;\n\tcontentsTexture.needsUpdate = true;\n\tcontentsTexture.dispose();\n\n}\n","export const common_functions = /* glsl */`\n\n// A stack of uint32 indices can can store the indices for\n// a perfectly balanced tree with a depth up to 31. Lower stack\n// depth gets higher performance.\n//\n// However not all trees are balanced. Best value to set this to\n// is the trees max depth.\n#ifndef BVH_STACK_DEPTH\n#define BVH_STACK_DEPTH 60\n#endif\n\n#ifndef INFINITY\n#define INFINITY 1e20\n#endif\n\n// Utilities\nuvec4 uTexelFetch1D( usampler2D tex, uint index ) {\n\n\tuint width = uint( textureSize( tex, 0 ).x );\n\tuvec2 uv;\n\tuv.x = index % width;\n\tuv.y = index / width;\n\n\treturn texelFetch( tex, ivec2( uv ), 0 );\n\n}\n\nivec4 iTexelFetch1D( isampler2D tex, uint index ) {\n\n\tuint width = uint( textureSize( tex, 0 ).x );\n\tuvec2 uv;\n\tuv.x = index % width;\n\tuv.y = index / width;\n\n\treturn texelFetch( tex, ivec2( uv ), 0 );\n\n}\n\nvec4 texelFetch1D( sampler2D tex, uint index ) {\n\n\tuint width = uint( textureSize( tex, 0 ).x );\n\tuvec2 uv;\n\tuv.x = index % width;\n\tuv.y = index / width;\n\n\treturn texelFetch( tex, ivec2( uv ), 0 );\n\n}\n\nvec4 textureSampleBarycoord( sampler2D tex, vec3 barycoord, uvec3 faceIndices ) {\n\n\treturn\n\t\tbarycoord.x * texelFetch1D( tex, faceIndices.x ) +\n\t\tbarycoord.y * texelFetch1D( tex, faceIndices.y ) +\n\t\tbarycoord.z * texelFetch1D( tex, faceIndices.z );\n\n}\n\nvoid ndcToCameraRay(\n\tvec2 coord, mat4 cameraWorld, mat4 invProjectionMatrix,\n\tout vec3 rayOrigin, out vec3 rayDirection\n) {\n\n\t// get camera look direction and near plane for camera clipping\n\tvec4 lookDirection = cameraWorld * vec4( 0.0, 0.0, - 1.0, 0.0 );\n\tvec4 nearVector = invProjectionMatrix * vec4( 0.0, 0.0, - 1.0, 1.0 );\n\tfloat near = abs( nearVector.z / nearVector.w );\n\n\t// get the camera direction and position from camera matrices\n\tvec4 origin = cameraWorld * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec4 direction = invProjectionMatrix * vec4( coord, 0.5, 1.0 );\n\tdirection /= direction.w;\n\tdirection = cameraWorld * direction - origin;\n\n\t// slide the origin along the ray until it sits at the near clip plane position\n\torigin.xyz += direction.xyz * near / dot( direction, lookDirection );\n\n\trayOrigin = origin.xyz;\n\trayDirection = direction.xyz;\n\n}\n`;\n","// Note that a struct cannot be used for the hit record including faceIndices, faceNormal, barycoord,\n// side, and dist because on some mobile GPUS (such as Adreno) numbers are afforded less precision specifically\n// when in a struct leading to inaccurate hit results. See KhronosGroup/WebGL#3351 for more details.\nexport const bvh_struct_definitions = /* glsl */`\nstruct BVH {\n\n\tusampler2D index;\n\tsampler2D position;\n\n\tsampler2D bvhBounds;\n\tusampler2D bvhContents;\n\n};\n`;\n","export const bvh_ray_functions = /* glsl */`\n\n#ifndef TRI_INTERSECT_EPSILON\n#define TRI_INTERSECT_EPSILON 1e-5\n#endif\n\n// Raycasting\nbool intersectsBounds( vec3 rayOrigin, vec3 rayDirection, vec3 boundsMin, vec3 boundsMax, out float dist ) {\n\n\t// https://www.reddit.com/r/opengl/comments/8ntzz5/fast_glsl_ray_box_intersection/\n\t// https://tavianator.com/2011/ray_box.html\n\tvec3 invDir = 1.0 / rayDirection;\n\n\t// find intersection distances for each plane\n\tvec3 tMinPlane = invDir * ( boundsMin - rayOrigin );\n\tvec3 tMaxPlane = invDir * ( boundsMax - rayOrigin );\n\n\t// get the min and max distances from each intersection\n\tvec3 tMinHit = min( tMaxPlane, tMinPlane );\n\tvec3 tMaxHit = max( tMaxPlane, tMinPlane );\n\n\t// get the furthest hit distance\n\tvec2 t = max( tMinHit.xx, tMinHit.yz );\n\tfloat t0 = max( t.x, t.y );\n\n\t// get the minimum hit distance\n\tt = min( tMaxHit.xx, tMaxHit.yz );\n\tfloat t1 = min( t.x, t.y );\n\n\t// set distance to 0.0 if the ray starts inside the box\n\tdist = max( t0, 0.0 );\n\n\treturn t1 >= dist;\n\n}\n\nbool intersectsTriangle(\n\tvec3 rayOrigin, vec3 rayDirection, vec3 a, vec3 b, vec3 c,\n\tout vec3 barycoord, out vec3 norm, out float dist, out float side\n) {\n\n\t// https://stackoverflow.com/questions/42740765/intersection-between-line-and-triangle-in-3d\n\tvec3 edge1 = b - a;\n\tvec3 edge2 = c - a;\n\tnorm = cross( edge1, edge2 );\n\n\tfloat det = - dot( rayDirection, norm );\n\tfloat invdet = 1.0 / det;\n\n\tvec3 AO = rayOrigin - a;\n\tvec3 DAO = cross( AO, rayDirection );\n\n\tvec4 uvt;\n\tuvt.x = dot( edge2, DAO ) * invdet;\n\tuvt.y = - dot( edge1, DAO ) * invdet;\n\tuvt.z = dot( AO, norm ) * invdet;\n\tuvt.w = 1.0 - uvt.x - uvt.y;\n\n\t// set the hit information\n\tbarycoord = uvt.wxy; // arranged in A, B, C order\n\tdist = uvt.z;\n\tside = sign( det );\n\tnorm = side * normalize( norm );\n\n\t// add an epsilon to avoid misses between triangles\n\tuvt += vec4( TRI_INTERSECT_EPSILON );\n\n\treturn all( greaterThanEqual( uvt, vec4( 0.0 ) ) );\n\n}\n\nbool intersectTriangles(\n\t// geometry info and triangle range\n\tsampler2D positionAttr, usampler2D indexAttr, uint offset, uint count,\n\n\t// ray\n\tvec3 rayOrigin, vec3 rayDirection,\n\n\t// outputs\n\tinout float minDistance, inout uvec4 faceIndices, inout vec3 faceNormal, inout vec3 barycoord,\n\tinout float side, inout float dist\n) {\n\n\tbool found = false;\n\tvec3 localBarycoord, localNormal;\n\tfloat localDist, localSide;\n\tfor ( uint i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\tuvec3 indices = uTexelFetch1D( indexAttr, i ).xyz;\n\t\tvec3 a = texelFetch1D( positionAttr, indices.x ).rgb;\n\t\tvec3 b = texelFetch1D( positionAttr, indices.y ).rgb;\n\t\tvec3 c = texelFetch1D( positionAttr, indices.z ).rgb;\n\n\t\tif (\n\t\t\tintersectsTriangle( rayOrigin, rayDirection, a, b, c, localBarycoord, localNormal, localDist, localSide )\n\t\t\t&& localDist < minDistance\n\t\t) {\n\n\t\t\tfound = true;\n\t\t\tminDistance = localDist;\n\n\t\t\tfaceIndices = uvec4( indices.xyz, i );\n\t\t\tfaceNormal = localNormal;\n\n\t\t\tside = localSide;\n\t\t\tbarycoord = localBarycoord;\n\t\t\tdist = localDist;\n\n\t\t}\n\n\t}\n\n\treturn found;\n\n}\n\nbool intersectsBVHNodeBounds( vec3 rayOrigin, vec3 rayDirection, sampler2D bvhBounds, uint currNodeIndex, out float dist ) {\n\n\tuint cni2 = currNodeIndex * 2u;\n\tvec3 boundsMin = texelFetch1D( bvhBounds, cni2 ).xyz;\n\tvec3 boundsMax = texelFetch1D( bvhBounds, cni2 + 1u ).xyz;\n\treturn intersectsBounds( rayOrigin, rayDirection, boundsMin, boundsMax, dist );\n\n}\n\n// use a macro to hide the fact that we need to expand the struct into separate fields\n#define\\\n\tbvhIntersectFirstHit(\\\n\t\tbvh,\\\n\t\trayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist\\\n\t)\\\n\t_bvhIntersectFirstHit(\\\n\t\tbvh.position, bvh.index, bvh.bvhBounds, bvh.bvhContents,\\\n\t\trayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist\\\n\t)\n\nbool _bvhIntersectFirstHit(\n\t// bvh info\n\tsampler2D bvh_position, usampler2D bvh_index, sampler2D bvh_bvhBounds, usampler2D bvh_bvhContents,\n\n\t// ray\n\tvec3 rayOrigin, vec3 rayDirection,\n\n\t// output variables split into separate variables due to output precision\n\tinout uvec4 faceIndices, inout vec3 faceNormal, inout vec3 barycoord,\n\tinout float side, inout float dist\n) {\n\n\t// stack needs to be twice as long as the deepest tree we expect because\n\t// we push both the left and right child onto the stack every traversal\n\tint ptr = 0;\n\tuint stack[ BVH_STACK_DEPTH ];\n\tstack[ 0 ] = 0u;\n\n\tfloat triangleDistance = INFINITY;\n\tbool found = false;\n\twhile ( ptr > - 1 && ptr < BVH_STACK_DEPTH ) {\n\n\t\tuint currNodeIndex = stack[ ptr ];\n\t\tptr --;\n\n\t\t// check if we intersect the current bounds\n\t\tfloat boundsHitDistance;\n\t\tif (\n\t\t\t! intersectsBVHNodeBounds( rayOrigin, rayDirection, bvh_bvhBounds, currNodeIndex, boundsHitDistance )\n\t\t\t|| boundsHitDistance > triangleDistance\n\t\t) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tuvec2 boundsInfo = uTexelFetch1D( bvh_bvhContents, currNodeIndex ).xy;\n\t\tbool isLeaf = bool( boundsInfo.x & 0xffff0000u );\n\n\t\tif ( isLeaf ) {\n\n\t\t\tuint count = boundsInfo.x & 0x0000ffffu;\n\t\t\tuint offset = boundsInfo.y;\n\n\t\t\tfound = intersectTriangles(\n\t\t\t\tbvh_position, bvh_index, offset, count,\n\t\t\t\trayOrigin, rayDirection, triangleDistance,\n\t\t\t\tfaceIndices, faceNormal, barycoord, side, dist\n\t\t\t) || found;\n\n\t\t} else {\n\n\t\t\tuint leftIndex = currNodeIndex + 1u;\n\t\t\tuint splitAxis = boundsInfo.x & 0x0000ffffu;\n\t\t\tuint rightIndex = boundsInfo.y;\n\n\t\t\tbool leftToRight = rayDirection[ splitAxis ] >= 0.0;\n\t\t\tuint c1 = leftToRight ? leftIndex : rightIndex;\n\t\t\tuint c2 = leftToRight ? rightIndex : leftIndex;\n\n\t\t\t// set c2 in the stack so we traverse it later. We need to keep track of a pointer in\n\t\t\t// the stack while we traverse. The second pointer added is the one that will be\n\t\t\t// traversed first\n\t\t\tptr ++;\n\t\t\tstack[ ptr ] = c2;\n\n\t\t\tptr ++;\n\t\t\tstack[ ptr ] = c1;\n\n\t\t}\n\n\t}\n\n\treturn found;\n\n}\n`;\n","import { PhysicalCamera } from '../objects/PhysicalCamera.js';\nexport class PhysicalCameraUniform {\n\n\tconstructor() {\n\n\t\tthis.bokehSize = 0;\n\t\tthis.apertureBlades = 0;\n\t\tthis.apertureRotation = 0;\n\t\tthis.focusDistance = 10;\n\t\tthis.anamorphicRatio = 1;\n\n\t}\n\n\tupdateFrom( camera ) {\n\n\t\tif ( camera instanceof PhysicalCamera ) {\n\n\t\t\tthis.bokehSize = camera.bokehSize;\n\t\t\tthis.apertureBlades = camera.apertureBlades;\n\t\t\tthis.apertureRotation = camera.apertureRotation;\n\t\t\tthis.focusDistance = camera.focusDistance;\n\t\t\tthis.anamorphicRatio = camera.anamorphicRatio;\n\n\t\t} else {\n\n\t\t\tthis.bokehSize = 0;\n\t\t\tthis.apertureRotation = 0;\n\t\t\tthis.apertureBlades = 0;\n\t\t\tthis.focusDistance = 10;\n\t\t\tthis.anamorphicRatio = 1;\n\n\t\t}\n\n\t}\n\n}\n","import { DataTexture, RedFormat, LinearFilter, DataUtils, HalfFloatType, Source, RepeatWrapping, RGBAFormat } from 'three';\nimport { toHalfFloatArray } from '../utils/TextureUtils.js';\n\nfunction binarySearchFindClosestIndexOf( array, targetValue, offset = 0, count = array.length ) {\n\n\tlet lower = offset;\n\tlet upper = offset + count - 1;\n\n\twhile ( lower < upper ) {\n\n\t\t// calculate the midpoint for this iteration using a bitwise shift right operator to save 1 floating point multiplication\n\t\t// and 1 truncation from the double tilde operator to improve performance\n\t\t// this results in much better performance over using standard \"~ ~ ( (lower + upper) ) / 2\" to calculate the midpoint\n\t\tconst mid = ( lower + upper ) >> 1;\n\n\t\t// check if the middle array value is above or below the target and shift\n\t\t// which half of the array we're looking at\n\t\tif ( array[ mid ] < targetValue ) {\n\n\t\t\tlower = mid + 1;\n\n\t\t} else {\n\n\t\t\tupper = mid;\n\n\t\t}\n\n\t}\n\n\treturn lower - offset;\n\n}\n\nfunction colorToLuminance( r, g, b ) {\n\n\t// https://en.wikipedia.org/wiki/Relative_luminance\n\treturn 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n}\n\n// ensures the data is all floating point values and flipY is false\nfunction preprocessEnvMap( envMap ) {\n\n\tconst map = envMap.clone();\n\tmap.source = new Source( { ...map.image } );\n\tconst { width, height, data } = map.image;\n\n\t// TODO: is there a simple way to avoid cloning and adjusting the env map data here?\n\t// convert the data from half float uint 16 arrays to float arrays for cdf computation\n\tlet newData = data;\n\tif ( map.type === HalfFloatType ) {\n\n\t\tnewData = new Uint16Array( data.length );\n\t\tfor ( const i in data ) {\n\n\t\t\tnewData[ i ] = data[ i ];\n\n\t\t}\n\n\t\tmap.image.data = newData;\n\t\tmap.type = HalfFloatType;\n\n\t}\n\n\t// remove any y flipping for cdf computation\n\tif ( map.flipY ) {\n\n\t\tconst ogData = newData;\n\t\tnewData = newData.slice();\n\t\tfor ( let y = 0; y < height; y ++ ) {\n\n\t\t\tfor ( let x = 0; x < width; x ++ ) {\n\n\t\t\t\tconst newY = height - y - 1;\n\t\t\t\tconst ogIndex = 4 * ( y * width + x );\n\t\t\t\tconst newIndex = 4 * ( newY * width + x );\n\n\t\t\t\tnewData[ newIndex + 0 ] = ogData[ ogIndex + 0 ];\n\t\t\t\tnewData[ newIndex + 1 ] = ogData[ ogIndex + 1 ];\n\t\t\t\tnewData[ newIndex + 2 ] = ogData[ ogIndex + 2 ];\n\t\t\t\tnewData[ newIndex + 3 ] = ogData[ ogIndex + 3 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tmap.flipY = false;\n\t\tmap.image.data = newData;\n\n\t}\n\n\treturn map;\n\n}\n\nexport class EquirectHdrInfoUniform {\n\n\tconstructor() {\n\n\t\t// Default to a white texture and associated weights so we don't\n\t\t// just render black initially.\n\t\tconst whiteTex = new DataTexture( toHalfFloatArray( new Float32Array( [ 1, 1, 1, 1 ] ) ), 1, 1 );\n\t\twhiteTex.type = HalfFloatType;\n\t\twhiteTex.format = RGBAFormat;\n\t\twhiteTex.minFilter = LinearFilter;\n\t\twhiteTex.magFilter = LinearFilter;\n\t\twhiteTex.wrapS = RepeatWrapping;\n\t\twhiteTex.wrapT = RepeatWrapping;\n\t\twhiteTex.generateMipmaps = false;\n\t\twhiteTex.needsUpdate = true;\n\n\t\t// Stores a map of [0, 1] value -> cumulative importance row & pdf\n\t\t// used to sampling a random value to a relevant row to sample from\n\t\tconst marginalWeights = new DataTexture( toHalfFloatArray( new Float32Array( [ 0, 1 ] ) ), 1, 2 );\n\t\tmarginalWeights.type = HalfFloatType;\n\t\tmarginalWeights.format = RedFormat;\n\t\tmarginalWeights.minFilter = LinearFilter;\n\t\tmarginalWeights.magFilter = LinearFilter;\n\t\tmarginalWeights.generateMipmaps = false;\n\t\tmarginalWeights.needsUpdate = true;\n\n\t\t// Stores a map of [0, 1] value -> cumulative importance column & pdf\n\t\t// used to sampling a random value to a relevant pixel to sample from\n\t\tconst conditionalWeights = new DataTexture( toHalfFloatArray( new Float32Array( [ 0, 0, 1, 1 ] ) ), 2, 2 );\n\t\tconditionalWeights.type = HalfFloatType;\n\t\tconditionalWeights.format = RedFormat;\n\t\tconditionalWeights.minFilter = LinearFilter;\n\t\tconditionalWeights.magFilter = LinearFilter;\n\t\tconditionalWeights.generateMipmaps = false;\n\t\tconditionalWeights.needsUpdate = true;\n\n\t\tthis.map = whiteTex;\n\t\tthis.marginalWeights = marginalWeights;\n\t\tthis.conditionalWeights = conditionalWeights;\n\t\tthis.totalSum = 1;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.marginalWeights.dispose();\n\t\tthis.conditionalWeights.dispose();\n\t\tthis.map.dispose();\n\n\t}\n\n\tupdateFrom( hdr ) {\n\n\t\t// https://github.com/knightcrawler25/GLSL-PathTracer/blob/3c6fd9b6b3da47cd50c527eeb45845eef06c55c3/src/loaders/hdrloader.cpp\n\t\t// https://pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Sampling_Light_Sources#InfiniteAreaLights\n\t\tconst map = preprocessEnvMap( hdr );\n\t\tmap.wrapS = RepeatWrapping;\n\t\tmap.wrapT = RepeatWrapping;\n\n\t\tconst { width, height, data } = map.image;\n\n\t\t// \"conditional\" = \"pixel relative to row pixels sum\"\n\t\t// \"marginal\" = \"row relative to row sum\"\n\n\t\t// track the importance of any given pixel in the image by tracking its weight relative to other pixels in the image\n\t\tconst pdfConditional = new Float32Array( width * height );\n\t\tconst cdfConditional = new Float32Array( width * height );\n\n\t\tconst pdfMarginal = new Float32Array( height );\n\t\tconst cdfMarginal = new Float32Array( height );\n\n\t\tlet totalSumValue = 0.0;\n\t\tlet cumulativeWeightMarginal = 0.0;\n\t\tfor ( let y = 0; y < height; y ++ ) {\n\n\t\t\tlet cumulativeRowWeight = 0.0;\n\t\t\tfor ( let x = 0; x < width; x ++ ) {\n\n\t\t\t\tconst i = y * width + x;\n\t\t\t\tconst r = DataUtils.fromHalfFloat( data[ 4 * i + 0 ] );\n\t\t\t\tconst g = DataUtils.fromHalfFloat( data[ 4 * i + 1 ] );\n\t\t\t\tconst b = DataUtils.fromHalfFloat( data[ 4 * i + 2 ] );\n\n\t\t\t\t// the probability of the pixel being selected in this row is the\n\t\t\t\t// scale of the luminance relative to the rest of the pixels.\n\t\t\t\t// TODO: this should also account for the solid angle of the pixel when sampling\n\t\t\t\tconst weight = colorToLuminance( r, g, b );\n\t\t\t\tcumulativeRowWeight += weight;\n\t\t\t\ttotalSumValue += weight;\n\n\t\t\t\tpdfConditional[ i ] = weight;\n\t\t\t\tcdfConditional[ i ] = cumulativeRowWeight;\n\n\t\t\t}\n\n\t\t\t// can happen if the row is all black\n\t\t\tif ( cumulativeRowWeight !== 0 ) {\n\n\t\t\t\t// scale the pdf and cdf to [0.0, 1.0]\n\t\t\t\tfor ( let i = y * width, l = y * width + width; i < l; i ++ ) {\n\n\t\t\t\t\tpdfConditional[ i ] /= cumulativeRowWeight;\n\t\t\t\t\tcdfConditional[ i ] /= cumulativeRowWeight;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcumulativeWeightMarginal += cumulativeRowWeight;\n\n\t\t\t// compute the marginal pdf and cdf along the height of the map.\n\t\t\tpdfMarginal[ y ] = cumulativeRowWeight;\n\t\t\tcdfMarginal[ y ] = cumulativeWeightMarginal;\n\n\t\t}\n\n\t\t// can happen if the texture is all black\n\t\tif ( cumulativeWeightMarginal !== 0 ) {\n\n\t\t\t// scale the marginal pdf and cdf to [0.0, 1.0]\n\t\t\tfor ( let i = 0, l = pdfMarginal.length; i < l; i ++ ) {\n\n\t\t\t\tpdfMarginal[ i ] /= cumulativeWeightMarginal;\n\t\t\t\tcdfMarginal[ i ] /= cumulativeWeightMarginal;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute a sorted index of distributions and the probabilities along them for both\n\t\t// the marginal and conditional data. These will be used to sample with a random number\n\t\t// to retrieve a uv value to sample in the environment map.\n\t\t// These values continually increase so it's okay to interpolate between them.\n\t\tconst marginalDataArray = new Uint16Array( height );\n\t\tconst conditionalDataArray = new Uint16Array( width * height );\n\n\t\t// we add a half texel offset so we're sampling the center of the pixel\n\t\tfor ( let i = 0; i < height; i ++ ) {\n\n\t\t\tconst dist = ( i + 1 ) / height;\n\t\t\tconst row = binarySearchFindClosestIndexOf( cdfMarginal, dist );\n\n\t\t\tmarginalDataArray[ i ] = DataUtils.toHalfFloat( ( row + 0.5 ) / height );\n\n\t\t}\n\n\t\tfor ( let y = 0; y < height; y ++ ) {\n\n\t\t\tfor ( let x = 0; x < width; x ++ ) {\n\n\t\t\t\tconst i = y * width + x;\n\t\t\t\tconst dist = ( x + 1 ) / width;\n\t\t\t\tconst col = binarySearchFindClosestIndexOf( cdfConditional, dist, y * width, width );\n\n\t\t\t\tconditionalDataArray[ i ] = DataUtils.toHalfFloat( ( col + 0.5 ) / width );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispose();\n\n\t\tconst { marginalWeights, conditionalWeights } = this;\n\t\tmarginalWeights.image = { width: height, height: 1, data: marginalDataArray };\n\t\tmarginalWeights.needsUpdate = true;\n\n\t\tconditionalWeights.image = { width, height, data: conditionalDataArray };\n\t\tconditionalWeights.needsUpdate = true;\n\n\t\tthis.totalSum = totalSumValue;\n\t\tthis.map = map;\n\n\t}\n\n}\n","import { DataTexture, RGBAFormat, ClampToEdgeWrapping, FloatType, Vector3, Quaternion, Matrix4, NearestFilter } from 'three';\n\nconst LIGHT_PIXELS = 6;\nconst RECT_AREA_LIGHT = 0;\nconst CIRC_AREA_LIGHT = 1;\nconst SPOT_LIGHT = 2;\nconst DIR_LIGHT = 3;\nconst POINT_LIGHT = 4;\nexport class LightsInfoUniformStruct {\n\n\tconstructor() {\n\n\t\tconst tex = new DataTexture( new Float32Array( 4 ), 1, 1 );\n\t\ttex.format = RGBAFormat;\n\t\ttex.type = FloatType;\n\t\ttex.wrapS = ClampToEdgeWrapping;\n\t\ttex.wrapT = ClampToEdgeWrapping;\n\t\ttex.generateMipmaps = false;\n\t\ttex.minFilter = NearestFilter;\n\t\ttex.magFilter = NearestFilter;\n\n\t\tthis.tex = tex;\n\t\tthis.count = 0;\n\n\t}\n\n\tupdateFrom( lights, iesTextures = [] ) {\n\n\t\tconst tex = this.tex;\n\t\tconst pixelCount = Math.max( lights.length * LIGHT_PIXELS, 1 );\n\t\tconst dimension = Math.ceil( Math.sqrt( pixelCount ) );\n\n\t\tif ( tex.image.width !== dimension ) {\n\n\t\t\ttex.dispose();\n\n\t\t\ttex.image.data = new Float32Array( dimension * dimension * 4 );\n\t\t\ttex.image.width = dimension;\n\t\t\ttex.image.height = dimension;\n\n\t\t}\n\n\t\tconst floatArray = tex.image.data;\n\n\t\tconst u = new Vector3();\n\t\tconst v = new Vector3();\n\t\tconst m = new Matrix4();\n\t\tconst worldQuaternion = new Quaternion();\n\t\tconst eye = new Vector3();\n\t\tconst target = new Vector3();\n\t\tconst up = new Vector3( 0, 1, 0 );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst l = lights[ i ];\n\n\t\t\tconst baseIndex = i * LIGHT_PIXELS * 4;\n\t\t\tlet index = 0;\n\n\t\t\t// sample 1\n\t\t    // position\n\t\t\tl.getWorldPosition( v );\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.x;\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.y;\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.z;\n\n\t\t\t// type\n\t\t\tlet type = RECT_AREA_LIGHT;\n\t\t\tif ( l.isRectAreaLight && l.isCircular ) {\n\n\t\t\t\ttype = CIRC_AREA_LIGHT;\n\n\t\t\t} else if ( l.isSpotLight ) {\n\n\t\t\t\ttype = SPOT_LIGHT;\n\n\t\t\t} else if ( l.isDirectionalLight ) {\n\n\t\t\t\ttype = DIR_LIGHT;\n\n\t\t\t} else if ( l.isPointLight ) {\n\n\t\t\t\ttype = POINT_LIGHT;\n\n\t\t\t}\n\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = type;\n\n\t\t\t// sample 2\n\t\t\t// color\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.color.r;\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.color.g;\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.color.b;\n\n\t\t\t// intensity\n\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.intensity;\n\n\t\t\tl.getWorldQuaternion( worldQuaternion );\n\n\t\t\tif ( l.isRectAreaLight ) {\n\n\t\t\t\t// sample 3\n\t\t\t\t// u vector\n\t\t\t\tu.set( l.width, 0, 0 ).applyQuaternion( worldQuaternion );\n\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.x;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.y;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.z;\n\t\t\t\tindex ++;\n\n\t\t\t\t// sample 4\n\t\t\t\t// v vector\n\t\t\t\tv.set( 0, l.height, 0 ).applyQuaternion( worldQuaternion );\n\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.x;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.y;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.z;\n\n\t\t\t\t// area\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.cross( v ).length() * ( l.isCircular ? ( Math.PI / 4.0 ) : 1.0 );\n\n\t\t\t} else if ( l.isSpotLight ) {\n\n\t\t\t\tconst radius = l.radius;\n\t\t\t\teye.setFromMatrixPosition( l.matrixWorld );\n\t\t\t\ttarget.setFromMatrixPosition( l.target.matrixWorld );\n\t\t\t\tm.lookAt( eye, target, up );\n\t\t\t\tworldQuaternion.setFromRotationMatrix( m );\n\n\t\t\t\t// sample 3\n\t\t\t\t// u vector\n\t\t\t\tu.set( 1, 0, 0 ).applyQuaternion( worldQuaternion );\n\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.x;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.y;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = u.z;\n\t\t\t\tindex ++;\n\n\t\t\t\t// sample 4\n\t\t\t\t// v vector\n\t\t\t\tv.set( 0, 1, 0 ).applyQuaternion( worldQuaternion );\n\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.x;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.y;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = v.z;\n\n\t\t\t\t// area\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = Math.PI * radius * radius;\n\n\t\t\t\t// sample 5\n\t\t\t\t// radius\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = radius;\n\n\t\t\t\t// near\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.shadow.camera.near;\n\n\t\t\t\t// decay\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.decay;\n\n\t\t\t\t// distance\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.distance;\n\n\t\t\t\t// sample 6\n\t\t\t\t// coneCos\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = Math.cos( l.angle );\n\n\t\t\t\t// penumbraCos\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = Math.cos( l.angle * ( 1 - l.penumbra ) );\n\n\t\t\t\t// iesProfile\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = iesTextures.indexOf( l.iesTexture );\n\n\t\t\t} else if ( l.isPointLight ) {\n\n\t\t\t\tconst worldPosition = u.setFromMatrixPosition( l.matrixWorld );\n\n\t\t\t\t// sample 3\n\t\t\t\t// u vector\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = worldPosition.x;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = worldPosition.y;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = worldPosition.z;\n\t\t\t\tindex ++;\n\n\t\t\t\t// sample 4\n\t\t\t\tindex += 4;\n\n\t\t\t\t// sample 5\n\t\t\t\tindex += 2;\n\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.decay;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = l.distance;\n\n\t\t\t} else if ( l.isDirectionalLight ) {\n\n\t\t\t\tconst worldPosition = u.setFromMatrixPosition( l.matrixWorld );\n\t\t\t\tconst targetPosition = v.setFromMatrixPosition( l.target.matrixWorld );\n\t\t\t\ttarget.subVectors( worldPosition, targetPosition ).normalize();\n\n\t\t\t\t// sample 3\n\t\t\t\t// u vector\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = target.x;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = target.y;\n\t\t\t\tfloatArray[ baseIndex + ( index ++ ) ] = target.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\ttex.needsUpdate = true;\n\t\tthis.count = lights.length;\n\n\t}\n\n}\n","import {\n\tClampToEdgeWrapping,\n\tColor,\n\tHalfFloatType,\n\tLinearFilter,\n\tMeshBasicMaterial,\n\tNoToneMapping,\n\tRGBAFormat,\n\tWebGLArrayRenderTarget,\n} from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { IESLoader } from '../utils/IESLoader.js';\n\nconst prevColor = new Color();\nexport class IESProfilesTexture extends WebGLArrayRenderTarget {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tconst tex = this.texture;\n\t\ttex.format = RGBAFormat;\n\t\ttex.type = HalfFloatType;\n\t\ttex.minFilter = LinearFilter;\n\t\ttex.magFilter = LinearFilter;\n\t\ttex.wrapS = ClampToEdgeWrapping;\n\t\ttex.wrapT = ClampToEdgeWrapping;\n\t\ttex.generateMipmaps = false;\n\n\t\ttex.updateFrom = ( ...args ) => {\n\n\t\t\tthis.updateFrom( ...args );\n\n\t\t};\n\n\t\tconst fsQuad = new FullScreenQuad( new MeshBasicMaterial() );\n\t\tthis.fsQuad = fsQuad;\n\n\t\tthis.iesLoader = new IESLoader();\n\n\t}\n\n\tasync updateFrom( renderer, textures ) {\n\n\t\t// save previous renderer state\n\t\tconst prevRenderTarget = renderer.getRenderTarget();\n\t\tconst prevToneMapping = renderer.toneMapping;\n\t\tconst prevAlpha = renderer.getClearAlpha();\n\t\trenderer.getClearColor( prevColor );\n\n\t\t// resize the render target and ensure we don't have an empty texture\n\t\t// render target depth must be >= 1 to avoid unbound texture error on android devices\n\t\tconst depth = textures.length || 1;\n\t\tthis.setSize( 360, 180, depth );\n\t\trenderer.setClearColor( 0, 0 );\n\t\trenderer.toneMapping = NoToneMapping;\n\n\t\t// render each texture into each layer of the target\n\t\tconst fsQuad = this.fsQuad;\n\t\tfor ( let i = 0, l = depth; i < l; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\t\t\tif ( texture ) {\n\n\t\t\t\t// revert to default texture transform before rendering\n\t\t\t\ttexture.matrixAutoUpdate = false;\n\t\t\t\ttexture.matrix.identity();\n\n\t\t\t\tfsQuad.material.map = texture;\n\t\t\t\tfsQuad.material.transparent = true;\n\n\t\t\t\trenderer.setRenderTarget( this, i );\n\t\t\t\tfsQuad.render( renderer );\n\n\t\t\t\t// restore custom texture transform\n\t\t\t\ttexture.updateMatrix();\n\t\t\t\ttexture.matrixAutoUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// reset the renderer\n\t\tfsQuad.material.map = null;\n\t\trenderer.setClearColor( prevColor, prevAlpha );\n\t\trenderer.setRenderTarget( prevRenderTarget );\n\t\trenderer.toneMapping = prevToneMapping;\n\n\t\tfsQuad.dispose();\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n","import { DataArrayTexture, FloatType, RGBAFormat } from 'three';\nimport { FloatVertexAttributeTexture } from 'three-mesh-bvh';\n\nfunction copyArrayToArray( fromArray, fromStride, toArray, toStride, offset ) {\n\n\tif ( fromStride > toStride ) {\n\n\t\tthrow new Error();\n\n\t}\n\n\t// scale non-float values to their normalized range\n\tconst count = fromArray.length / fromStride;\n\tconst bpe = fromArray.constructor.BYTES_PER_ELEMENT * 8;\n\tlet maxValue = 1.0;\n\tswitch ( fromArray.constructor ) {\n\n\tcase Uint8Array:\n\tcase Uint16Array:\n\tcase Uint32Array:\n\t\tmaxValue = 2 ** bpe - 1;\n\t\tbreak;\n\n\tcase Int8Array:\n\tcase Int16Array:\n\tcase Int32Array:\n\t\tmaxValue = 2 ** ( bpe - 1 ) - 1;\n\t\tbreak;\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tconst i4 = 4 * i;\n\t\tconst is = fromStride * i;\n\t\tfor ( let j = 0; j < toStride; j ++ ) {\n\n\t\t\ttoArray[ offset + i4 + j ] = fromStride >= j + 1 ? fromArray[ is + j ] / maxValue : 0;\n\n\t\t}\n\n\t}\n\n}\n\nexport class FloatAttributeTextureArray extends DataArrayTexture {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis._textures = [];\n\t\tthis.type = FloatType;\n\t\tthis.format = RGBAFormat;\n\t\tthis.internalFormat = 'RGBA32F';\n\n\t}\n\n\tupdateAttribute( index, attr ) {\n\n\t\t// update the texture\n\t\tconst tex = this._textures[ index ];\n\t\ttex.updateFrom( attr );\n\n\t\t// ensure compatibility\n\t\tconst baseImage = tex.image;\n\t\tconst image = this.image;\n\t\tif ( baseImage.width !== image.width || baseImage.height !== image.height ) {\n\n\t\t\tthrow new Error( 'FloatAttributeTextureArray: Attribute must be the same dimensions when updating single layer.' );\n\n\t\t}\n\n\t\t// update the image\n\t\tconst { width, height, data } = image;\n\t\tconst length = width * height * 4;\n\t\tconst offset = length * index;\n\t\tlet itemSize = attr.itemSize;\n\t\tif ( itemSize === 3 ) {\n\n\t\t\titemSize = 4;\n\n\t\t}\n\n\t\t// copy the data\n\t\tcopyArrayToArray( tex.image.data, itemSize, data, 4, offset );\n\n\t\tthis.dispose();\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tsetAttributes( attrs ) {\n\n\t\t// ensure the attribute count\n\t\tconst itemCount = attrs[ 0 ].count;\n\t\tconst attrsLength = attrs.length;\n\t\tfor ( let i = 0, l = attrsLength; i < l; i ++ ) {\n\n\t\t\tif ( attrs[ i ].count !== itemCount ) {\n\n\t\t\t\tthrow new Error( 'FloatAttributeTextureArray: All attributes must have the same item count.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// initialize all textures\n\t\tconst textures = this._textures;\n\t\twhile ( textures.length < attrsLength ) {\n\n\t\t\tconst tex = new FloatVertexAttributeTexture();\n\t\t\ttextures.push( tex );\n\n\t\t}\n\n\t\twhile ( textures.length > attrsLength ) {\n\n\t\t\ttextures.pop();\n\n\t\t}\n\n\t\t// update all textures\n\t\tfor ( let i = 0, l = attrsLength; i < l; i ++ ) {\n\n\t\t\ttextures[ i ].updateFrom( attrs[ i ] );\n\n\t\t}\n\n\t\t// determine if we need to create a new array\n\t\tconst baseTexture = textures[ 0 ];\n\t\tconst baseImage = baseTexture.image;\n\t\tconst image = this.image;\n\n\t\tif ( baseImage.width !== image.width || baseImage.height !== image.height || baseImage.depth !== attrsLength ) {\n\n\t\t\timage.width = baseImage.width;\n\t\t\timage.height = baseImage.height;\n\t\t\timage.depth = attrsLength;\n\t\t\timage.data = new Float32Array( image.width * image.height * image.depth * 4 );\n\n\t\t}\n\n\t\t// copy the other texture data into the data array texture\n\t\tconst { data, width, height } = image;\n\t\tfor ( let i = 0, l = attrsLength; i < l; i ++ ) {\n\n\t\t\tconst tex = textures[ i ];\n\t\t\tconst length = width * height * 4;\n\t\t\tconst offset = length * i;\n\n\t\t\tlet itemSize = attrs[ i ].itemSize;\n\t\t\tif ( itemSize === 3 ) {\n\n\t\t\t\titemSize = 4;\n\n\t\t\t}\n\n\t\t\tcopyArrayToArray( tex.image.data, itemSize, data, 4, offset );\n\n\t\t}\n\n\t\t// reset the texture\n\t\tthis.dispose();\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\n}\n","import { FloatAttributeTextureArray } from './FloatAttributeTextureArray.js';\n\nexport class AttributesTextureArray extends FloatAttributeTextureArray {\n\n\tupdateNormalAttribute( attr ) {\n\n\t\tthis.updateAttribute( 0, attr );\n\n\t}\n\n\tupdateTangentAttribute( attr ) {\n\n\t\tthis.updateAttribute( 1, attr );\n\n\t}\n\n\tupdateUvAttribute( attr ) {\n\n\t\tthis.updateAttribute( 2, attr );\n\n\t}\n\n\tupdateColorAttribute( attr ) {\n\n\t\tthis.updateAttribute( 3, attr );\n\n\t}\n\n\tupdateFrom( normal, tangent, uv, color ) {\n\n\t\tthis.setAttributes( [ normal, tangent, uv, color ] );\n\n\t}\n\n}\n","// we must hash the texture to determine uniqueness using the encoding, as well, because the\n// when rendering each texture to the texture array they must have a consistent color space.\nexport function getTextureHash( t ) {\n\n\treturn `${ t.source.uuid }:${ t.encoding }`;\n\n}\n\n// reduce the set of textures to just those with a unique source while retaining\n// the order of the textures.\nexport function reduceTexturesToUniqueSources( textures ) {\n\n\tconst sourceSet = new Set();\n\tconst result = [];\n\tfor ( let i = 0, l = textures.length; i < l; i ++ ) {\n\n\t\tconst tex = textures[ i ];\n\t\tconst hash = getTextureHash( tex );\n\t\tif ( ! sourceSet.has( hash ) ) {\n\n\t\t\tsourceSet.add( hash );\n\t\t\tresult.push( tex );\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n","import { DataTexture, RGBAFormat, ClampToEdgeWrapping, FloatType, FrontSide, BackSide, DoubleSide, NearestFilter } from 'three';\nimport { reduceTexturesToUniqueSources, getTextureHash } from './utils.js';\n\nconst MATERIAL_PIXELS = 45;\nconst MATERIAL_STRIDE = MATERIAL_PIXELS * 4;\n\nconst MATTE_OFFSET = 14 * 4 + 0; // s14.r\nconst SHADOW_OFFSET = 14 * 4 + 1; // s14.g\n\nclass MaterialFeatures {\n\n\tconstructor() {\n\n\t\tthis._features = {};\n\n\t}\n\n\tisUsed( feature ) {\n\n\t\treturn feature in this._features;\n\n\t}\n\n\tsetUsed( feature, used = true ) {\n\n\t\tif ( used === false ) {\n\n\t\t\tdelete this._features[ feature ];\n\n\t\t} else {\n\n\t\t\tthis._features[ feature ] = true;\n\n\t\t}\n\n\t}\n\n\treset() {\n\n\t\tthis._features = {};\n\n\t}\n\n}\n\nexport class MaterialsTexture extends DataTexture {\n\n\tconstructor() {\n\n\t\tsuper( new Float32Array( 4 ), 1, 1 );\n\n\t\tthis.format = RGBAFormat;\n\t\tthis.type = FloatType;\n\t\tthis.wrapS = ClampToEdgeWrapping;\n\t\tthis.wrapT = ClampToEdgeWrapping;\n\t\tthis.minFilter = NearestFilter;\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.generateMipmaps = false;\n\t\tthis.threeCompatibilityTransforms = false;\n\t\tthis.features = new MaterialFeatures();\n\n\t}\n\n\tsetCastShadow( materialIndex, cast ) {\n\n\t\t// invert the shadow value so we default to \"true\" when initializing a material\n\t\tconst array = this.image.data;\n\t\tconst index = materialIndex * MATERIAL_STRIDE + SHADOW_OFFSET;\n\t\tarray[ index ] = ! cast ? 1 : 0;\n\n\t}\n\n\tgetCastShadow( materialIndex ) {\n\n\t\tconst array = this.image.data;\n\t\tconst index = materialIndex * MATERIAL_STRIDE + SHADOW_OFFSET;\n\t\treturn ! Boolean( array[ index ] );\n\n\t}\n\n\tsetMatte( materialIndex, matte ) {\n\n\t\tconst array = this.image.data;\n\t\tconst index = materialIndex * MATERIAL_STRIDE + MATTE_OFFSET;\n\t\tarray[ index ] = matte ? 1 : 0;\n\n\t}\n\n\tgetMatte( materialIndex ) {\n\n\t\tconst array = this.image.data;\n\t\tconst index = materialIndex * MATERIAL_STRIDE + MATTE_OFFSET;\n\t\treturn Boolean( array[ index ] );\n\n\t}\n\n\tupdateFrom( materials, textures ) {\n\n\t\tfunction getTexture( material, key, def = - 1 ) {\n\n\t\t\tif ( key in material && material[ key ] ) {\n\n\t\t\t\tconst hash = getTextureHash( material[ key ] );\n\t\t\t\treturn uniqueTextureLookup[ hash ];\n\n\t\t\t} else {\n\n\t\t\t\treturn def;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getField( material, key, def ) {\n\n\t\t\treturn key in material ? material[ key ] : def;\n\n\t\t}\n\n\t\tfunction getUVTransformTexture( material ) {\n\n\t\t\t// https://github.com/mrdoob/three.js/blob/f3a832e637c98a404c64dae8174625958455e038/src/renderers/webgl/WebGLMaterials.js#L204-L306\n\t\t\t// https://threejs.org/docs/#api/en/textures/Texture.offset\n\t\t\t// fallback order of textures to use as a common uv transform\n\t\t\treturn material.map ||\n\t\t\t\tmaterial.specularMap ||\n\t\t\t\tmaterial.displacementMap ||\n\t\t\t\tmaterial.normalMap ||\n\t\t\t\tmaterial.bumpMap ||\n\t\t\t\tmaterial.roughnessMap ||\n\t\t\t\tmaterial.metalnessMap ||\n\t\t\t\tmaterial.alphaMap ||\n\t\t\t\tmaterial.emissiveMap ||\n\t\t\t\tmaterial.clearcoatMap ||\n\t\t\t\tmaterial.clearcoatNormalMap ||\n\t\t\t\tmaterial.clearcoatRoughnessMap ||\n\t\t\t\tmaterial.iridescenceMap ||\n\t\t\t\tmaterial.iridescenceThicknessMap ||\n\t\t\t\tmaterial.specularIntensityMap ||\n\t\t\t\tmaterial.specularColorMap ||\n\t\t\t\tmaterial.transmissionMap ||\n\t\t\t\tmaterial.thicknessMap ||\n\t\t\t\tmaterial.sheenColorMap ||\n\t\t\t\tmaterial.sheenRoughnessMap ||\n\t\t\t\tnull;\n\n\t\t}\n\n\t\tfunction writeTextureMatrixToArray( material, textureKey, array, offset ) {\n\n\t\t\tlet texture;\n\t\t\tif ( threeCompatibilityTransforms ) {\n\n\t\t\t\ttexture = getUVTransformTexture( material );\n\n\t\t\t} else {\n\n\t\t\t\ttexture = material[ textureKey ] && material[ textureKey ].isTexture ? material[ textureKey ] : null;\n\n\t\t\t}\n\n\t\t\t// check if texture exists\n\t\t\tif ( texture ) {\n\n\t\t\t\tconst elements = texture.matrix.elements;\n\n\t\t\t\tlet i = 0;\n\n\t\t\t\t// first row\n\t\t\t\tarray[ offset + i ++ ] = elements[ 0 ];\n\t\t\t\tarray[ offset + i ++ ] = elements[ 3 ];\n\t\t\t\tarray[ offset + i ++ ] = elements[ 6 ];\n\t\t\t\ti ++;\n\n\t\t\t\t// second row\n\t\t\t\tarray[ offset + i ++ ] = elements[ 1 ];\n\t\t\t\tarray[ offset + i ++ ] = elements[ 4 ];\n\t\t\t\tarray[ offset + i ++ ] = elements[ 7 ];\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn 8;\n\n\t\t}\n\n\t\tlet index = 0;\n\t\tconst pixelCount = materials.length * MATERIAL_PIXELS;\n\t\tconst dimension = Math.ceil( Math.sqrt( pixelCount ) );\n\t\tconst { threeCompatibilityTransforms, image, features } = this;\n\n\t\t// get the list of textures with unique sources\n\t\tconst uniqueTextures = reduceTexturesToUniqueSources( textures );\n\t\tconst uniqueTextureLookup = {};\n\t\tfor ( let i = 0, l = uniqueTextures.length; i < l; i ++ ) {\n\n\t\t\tuniqueTextureLookup[ getTextureHash( uniqueTextures[ i ] ) ] = i;\n\n\t\t}\n\n\t\tif ( image.width !== dimension ) {\n\n\t\t\tthis.dispose();\n\n\t\t\timage.data = new Float32Array( dimension * dimension * 4 );\n\t\t\timage.width = dimension;\n\t\t\timage.height = dimension;\n\n\t\t}\n\n\t\tconst floatArray = image.data;\n\n\t\t// on some devices (Google Pixel 6) the \"floatBitsToInt\" function does not work correctly so we\n\t\t// can't encode texture ids that way.\n\t\t// const intArray = new Int32Array( floatArray.buffer );\n\n\t\tfeatures.reset();\n\t\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\tconst m = materials[ i ];\n\n\t\t\tif ( m.isFogVolumeMaterial ) {\n\n\t\t\t\tfeatures.setUsed( 'FOG' );\n\n\t\t\t\tfor ( let j = 0; j < MATERIAL_STRIDE; j ++ ) {\n\n\t\t\t\t\tfloatArray[ index + j ] = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// sample 0 .rgb\n\t\t\t\tfloatArray[ index + 0 * 4 + 0 ] = m.color.r;\n\t\t\t\tfloatArray[ index + 0 * 4 + 1 ] = m.color.g;\n\t\t\t\tfloatArray[ index + 0 * 4 + 2 ] = m.color.b;\n\n\t\t\t\t// sample 2 .a\n\t\t\t\tfloatArray[ index + 2 * 4 + 3 ] = getField( m, 'emissiveIntensity', 0.0 );\n\n\t\t\t\t// sample 3 .rgb\n\t\t\t\tfloatArray[ index + 3 * 4 + 0 ] = m.emissive.r;\n\t\t\t\tfloatArray[ index + 3 * 4 + 1 ] = m.emissive.g;\n\t\t\t\tfloatArray[ index + 3 * 4 + 2 ] = m.emissive.b;\n\n\t\t\t\t// sample 13 .g\n\t\t\t\t// reusing opacity field\n\t\t\t\tfloatArray[ index + 13 * 4 + 1 ] = m.density;\n\n\t\t\t\t// side\n\t\t\t\tfloatArray[ index + 13 * 4 + 3 ] = 0.0;\n\n\t\t\t\t// sample 14 .b\n\t\t\t\tfloatArray[ index + 14 * 4 + 2 ] = 1 << 2;\n\n\t\t\t\tindex += MATERIAL_STRIDE;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// sample 0\n\t\t\t// color\n\t\t\tfloatArray[ index ++ ] = m.color.r;\n\t\t\tfloatArray[ index ++ ] = m.color.g;\n\t\t\tfloatArray[ index ++ ] = m.color.b;\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'map' );\n\n\t\t\t// sample 1\n\t\t\t// metalness & roughness\n\t\t\tfloatArray[ index ++ ] = getField( m, 'metalness', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'metalnessMap' );\n\t\t\tfloatArray[ index ++ ] = getField( m, 'roughness', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'roughnessMap' );\n\n\t\t\t// sample 2\n\t\t\t// transmission & emissiveIntensity\n\t\t\t// three.js assumes a default f0 of 0.04 if no ior is provided which equates to an ior of 1.5\n\t\t\tfloatArray[ index ++ ] = getField( m, 'ior', 1.5 );\n\t\t\tfloatArray[ index ++ ] = getField( m, 'transmission', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'transmissionMap' );\n\t\t\tfloatArray[ index ++ ] = getField( m, 'emissiveIntensity', 0.0 );\n\n\t\t\t// sample 3\n\t\t\t// emission\n\t\t\tif ( 'emissive' in m ) {\n\n\t\t\t\tfloatArray[ index ++ ] = m.emissive.r;\n\t\t\t\tfloatArray[ index ++ ] = m.emissive.g;\n\t\t\t\tfloatArray[ index ++ ] = m.emissive.b;\n\n\t\t\t} else {\n\n\t\t\t\tfloatArray[ index ++ ] = 0.0;\n\t\t\t\tfloatArray[ index ++ ] = 0.0;\n\t\t\t\tfloatArray[ index ++ ] = 0.0;\n\n\t\t\t}\n\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'emissiveMap' );\n\n\t\t\t// sample 4\n\t\t\t// normals\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'normalMap' );\n\t\t\tif ( 'normalScale' in m ) {\n\n\t\t\t\tfloatArray[ index ++ ] = m.normalScale.x;\n\t\t\t\tfloatArray[ index ++ ] = m.normalScale.y;\n\n \t\t\t} else {\n\n \t\t\t\tfloatArray[ index ++ ] = 1;\n \t\t\t\tfloatArray[ index ++ ] = 1;\n\n \t\t\t}\n\n\t\t\t// clearcoat\n\t\t\tfloatArray[ index ++ ] = getField( m, 'clearcoat', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'clearcoatMap' ); // sample 5\n\n\t\t\tfloatArray[ index ++ ] = getField( m, 'clearcoatRoughness', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'clearcoatRoughnessMap' );\n\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'clearcoatNormalMap' );\n\n\t\t\t// sample 6\n\t\t\tif ( 'clearcoatNormalScale' in m ) {\n\n\t\t\t\tfloatArray[ index ++ ] = m.clearcoatNormalScale.x;\n\t\t\t\tfloatArray[ index ++ ] = m.clearcoatNormalScale.y;\n\n\t\t\t} else {\n\n\t\t\t\tfloatArray[ index ++ ] = 1;\n\t\t\t\tfloatArray[ index ++ ] = 1;\n\n\t\t\t}\n\n\t\t\tindex ++;\n\t\t\tfloatArray[ index ++ ] = getField( m, 'sheen', 0.0 );\n\n\t\t\t// sample 7\n\t\t\t// sheen\n\t\t\tif ( 'sheenColor' in m ) {\n\n\t\t\t\tfloatArray[ index ++ ] = m.sheenColor.r;\n\t\t\t\tfloatArray[ index ++ ] = m.sheenColor.g;\n\t\t\t\tfloatArray[ index ++ ] = m.sheenColor.b;\n\n\t\t\t} else {\n\n\t\t\t\tfloatArray[ index ++ ] = 0.0;\n\t\t\t\tfloatArray[ index ++ ] = 0.0;\n\t\t\t\tfloatArray[ index ++ ] = 0.0;\n\n\t\t\t}\n\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'sheenColorMap' );\n\n\t\t\t// sample 8\n\t\t\tfloatArray[ index ++ ] = getField( m, 'sheenRoughness', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'sheenRoughnessMap' );\n\n\t\t\t// iridescence\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'iridescenceMap' );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'iridescenceThicknessMap' );\n\n\t\t\t// sample 9\n\t\t\tfloatArray[ index ++ ] = getField( m, 'iridescence', 0.0 );\n\t\t\tfloatArray[ index ++ ] = getField( m, 'iridescenceIOR', 1.3 );\n\n\t\t\tconst iridescenceThicknessRange = getField( m, 'iridescenceThicknessRange', [ 100, 400 ] );\n\t\t\tfloatArray[ index ++ ] = iridescenceThicknessRange[ 0 ];\n\t\t\tfloatArray[ index ++ ] = iridescenceThicknessRange[ 1 ];\n\n\t\t\t// sample 10\n\t\t\t// specular color\n\t\t\tif ( 'specularColor' in m ) {\n\n\t\t\t\tfloatArray[ index ++ ] = m.specularColor.r;\n\t\t\t\tfloatArray[ index ++ ] = m.specularColor.g;\n\t\t\t\tfloatArray[ index ++ ] = m.specularColor.b;\n\n\t\t\t} else {\n\n\t\t\t\tfloatArray[ index ++ ] = 1.0;\n\t\t\t\tfloatArray[ index ++ ] = 1.0;\n\t\t\t\tfloatArray[ index ++ ] = 1.0;\n\n\t\t\t}\n\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'specularColorMap' );\n\n\t\t\t// sample 11\n\t\t\t// specular intensity\n\t\t\tfloatArray[ index ++ ] = getField( m, 'specularIntensity', 1.0 );\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'specularIntensityMap' );\n\n\t\t\t// isThinFilm\n\t\t\tconst isThinFilm = getField( m, 'thickness', 0.0 ) === 0.0 && getField( m, 'attenuationDistance', Infinity ) === Infinity;\n\t\t\tfloatArray[ index ++ ] = Number( isThinFilm );\n\t\t\tindex ++;\n\n\t\t\t// sample 12\n\t\t\tif ( 'attenuationColor' in m ) {\n\n\t\t\t\tfloatArray[ index ++ ] = m.attenuationColor.r;\n\t\t\t\tfloatArray[ index ++ ] = m.attenuationColor.g;\n\t\t\t\tfloatArray[ index ++ ] = m.attenuationColor.b;\n\n\t\t\t} else {\n\n\t\t\t\tfloatArray[ index ++ ] = 1.0;\n\t\t\t\tfloatArray[ index ++ ] = 1.0;\n\t\t\t\tfloatArray[ index ++ ] = 1.0;\n\n\t\t\t}\n\n\t\t\tfloatArray[ index ++ ] = getField( m, 'attenuationDistance', Infinity );\n\n\t\t\t// sample 13\n\t\t\t// alphaMap\n\t\t\tfloatArray[ index ++ ] = getTexture( m, 'alphaMap' );\n\n\t\t\t// side & matte\n\t\t\tfloatArray[ index ++ ] = m.opacity;\n\t\t\tfloatArray[ index ++ ] = m.alphaTest;\n\t\t\tif ( ! isThinFilm && m.transmission > 0.0 ) {\n\n\t\t\t\tfloatArray[ index ++ ] = 0;\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( m.side ) {\n\n\t\t\t\tcase FrontSide:\n\t\t\t\t\tfloatArray[ index ++ ] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BackSide:\n\t\t\t\t\tfloatArray[ index ++ ] = - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase DoubleSide:\n\t\t\t\t\tfloatArray[ index ++ ] = 0;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// sample 14\n\t\t\tindex ++; // matte\n\t\t\tindex ++; // shadow\n\t\t\tfloatArray[ index ++ ] = Number( m.vertexColors ) | ( Number( m.flatShading ) << 1 ); // vertexColors & flatShading\n\t\t\tfloatArray[ index ++ ] = Number( m.transparent ); // transparent\n\n\t\t\t// map transform 15\n\t\t\tindex += writeTextureMatrixToArray( m, 'map', floatArray, index );\n\n\t\t\t// metalnessMap transform 17\n\t\t\tindex += writeTextureMatrixToArray( m, 'metalnessMap', floatArray, index );\n\n\t\t\t// roughnessMap transform 19\n\t\t\tindex += writeTextureMatrixToArray( m, 'roughnessMap', floatArray, index );\n\n\t\t\t// transmissionMap transform 21\n\t\t\tindex += writeTextureMatrixToArray( m, 'transmissionMap', floatArray, index );\n\n\t\t\t// emissiveMap transform 22\n\t\t\tindex += writeTextureMatrixToArray( m, 'emissiveMap', floatArray, index );\n\n\t\t\t// normalMap transform 25\n\t\t\tindex += writeTextureMatrixToArray( m, 'normalMap', floatArray, index );\n\n\t\t\t// clearcoatMap transform 27\n\t\t\tindex += writeTextureMatrixToArray( m, 'clearcoatMap', floatArray, index );\n\n\t\t\t// clearcoatNormalMap transform 29\n\t\t\tindex += writeTextureMatrixToArray( m, 'clearcoatNormalMap', floatArray, index );\n\n\t\t\t// clearcoatRoughnessMap transform 31\n\t\t\tindex += writeTextureMatrixToArray( m, 'clearcoatRoughnessMap', floatArray, index );\n\n\t\t\t// sheenColorMap transform 33\n\t\t\tindex += writeTextureMatrixToArray( m, 'sheenColorMap', floatArray, index );\n\n\t\t\t// sheenRoughnessMap transform 35\n\t\t\tindex += writeTextureMatrixToArray( m, 'sheenRoughnessMap', floatArray, index );\n\n\t\t\t// iridescenceMap transform 37\n\t\t\tindex += writeTextureMatrixToArray( m, 'iridescenceMap', floatArray, index );\n\n\t\t\t// iridescenceThicknessMap transform 39\n\t\t\tindex += writeTextureMatrixToArray( m, 'iridescenceThicknessMap', floatArray, index );\n\n\t\t\t// specularColorMap transform 41\n\t\t\tindex += writeTextureMatrixToArray( m, 'specularColorMap', floatArray, index );\n\n\t\t\t// specularIntensityMap transform 43\n\t\t\tindex += writeTextureMatrixToArray( m, 'specularIntensityMap', floatArray, index );\n\n\t\t}\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n","import {\n\tWebGLArrayRenderTarget,\n\tRGBAFormat,\n\tUnsignedByteType,\n\tMeshBasicMaterial,\n\tColor,\n\tRepeatWrapping,\n\tLinearFilter,\n\tNoToneMapping,\n} from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { reduceTexturesToUniqueSources } from './utils.js';\n\nconst prevColor = new Color();\nexport class RenderTarget2DArray extends WebGLArrayRenderTarget {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tconst tex = this.texture;\n\t\ttex.format = RGBAFormat;\n\t\ttex.type = UnsignedByteType;\n\t\ttex.minFilter = LinearFilter;\n\t\ttex.magFilter = LinearFilter;\n\t\ttex.wrapS = RepeatWrapping;\n\t\ttex.wrapT = RepeatWrapping;\n\t\ttex.setTextures = ( ...args ) => {\n\n\t\t\tthis.setTextures( ...args );\n\n\t\t};\n\n\t\tconst fsQuad = new FullScreenQuad( new MeshBasicMaterial() );\n\t\tthis.fsQuad = fsQuad;\n\n\t}\n\n\tsetTextures( renderer, width, height, textures ) {\n\n\t\t// get the list of textures with unique sources\n\t\tconst uniqueTextures = reduceTexturesToUniqueSources( textures );\n\n\t\t// save previous renderer state\n\t\tconst prevRenderTarget = renderer.getRenderTarget();\n\t\tconst prevToneMapping = renderer.toneMapping;\n\t\tconst prevAlpha = renderer.getClearAlpha();\n\t\trenderer.getClearColor( prevColor );\n\n\t\t// resize the render target and ensure we don't have an empty texture\n\t\t// render target depth must be >= 1 to avoid unbound texture error on android devices\n\t\tconst depth = uniqueTextures.length || 1;\n\t\tthis.setSize( width, height, depth );\n\t\trenderer.setClearColor( 0, 0 );\n\t\trenderer.toneMapping = NoToneMapping;\n\n\t\t// render each texture into each layer of the target\n\t\tconst fsQuad = this.fsQuad;\n\t\tfor ( let i = 0, l = depth; i < l; i ++ ) {\n\n\t\t\tconst texture = uniqueTextures[ i ];\n\t\t\tif ( texture ) {\n\n\t\t\t\t// revert to default texture transform before rendering\n\t\t\t\ttexture.matrixAutoUpdate = false;\n\t\t\t\ttexture.matrix.identity();\n\n\t\t\t\tfsQuad.material.map = texture;\n\t\t\t\tfsQuad.material.transparent = true;\n\n\t\t\t\trenderer.setRenderTarget( this, i );\n\t\t\t\tfsQuad.render( renderer );\n\n\t\t\t\t// restore custom texture transform\n\t\t\t\ttexture.updateMatrix();\n\t\t\t\ttexture.matrixAutoUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// reset the renderer\n\t\tfsQuad.material.map = null;\n\t\trenderer.setClearColor( prevColor, prevAlpha );\n\t\trenderer.setRenderTarget( prevRenderTarget );\n\t\trenderer.toneMapping = prevToneMapping;\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n","export const cameraStructGLSL = /* glsl */`\n\n\tstruct PhysicalCamera {\n\n\t\tfloat focusDistance;\n\t\tfloat anamorphicRatio;\n\t\tfloat bokehSize;\n\t\tint apertureBlades;\n\t\tfloat apertureRotation;\n\n\t};\n\n`;\n","export const equirectStructGLSL = /* glsl */`\n\n\tstruct EquirectHdrInfo {\n\n\t\tsampler2D marginalWeights;\n\t\tsampler2D conditionalWeights;\n\t\tsampler2D map;\n\n\t\tfloat totalSum;\n\n\t};\n\n`;\n","export const lightsStructGLSL = /* glsl */`\n\n\t#define RECT_AREA_LIGHT_TYPE 0\n\t#define CIRC_AREA_LIGHT_TYPE 1\n\t#define SPOT_LIGHT_TYPE 2\n\t#define DIR_LIGHT_TYPE 3\n\t#define POINT_LIGHT_TYPE 4\n\n\tstruct LightsInfo {\n\n\t\tsampler2D tex;\n\t\tuint count;\n\n\t};\n\n\tstruct Light {\n\n\t\tvec3 position;\n\t\tint type;\n\n\t\tvec3 color;\n\t\tfloat intensity;\n\n\t\tvec3 u;\n\t\tvec3 v;\n\t\tfloat area;\n\n\t\t// spot light fields\n\t\tfloat radius;\n\t\tfloat near;\n\t\tfloat decay;\n\t\tfloat distance;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint iesProfile;\n\n\t};\n\n\tLight readLightInfo( sampler2D tex, uint index ) {\n\n\t\tuint i = index * 6u;\n\n\t\tvec4 s0 = texelFetch1D( tex, i + 0u );\n\t\tvec4 s1 = texelFetch1D( tex, i + 1u );\n\t\tvec4 s2 = texelFetch1D( tex, i + 2u );\n\t\tvec4 s3 = texelFetch1D( tex, i + 3u );\n\n\t\tLight l;\n\t\tl.position = s0.rgb;\n\t\tl.type = int( round( s0.a ) );\n\n\t\tl.color = s1.rgb;\n\t\tl.intensity = s1.a;\n\n\t\tl.u = s2.rgb;\n\t\tl.v = s3.rgb;\n\t\tl.area = s3.a;\n\n\t\tif ( l.type == SPOT_LIGHT_TYPE || l.type == POINT_LIGHT_TYPE ) {\n\n\t\t\tvec4 s4 = texelFetch1D( tex, i + 4u );\n\t\t\tvec4 s5 = texelFetch1D( tex, i + 5u );\n\t\t\tl.radius = s4.r;\n\t\t\tl.near = s4.g;\n\t\t\tl.decay = s4.b;\n\t\t\tl.distance = s4.a;\n\n\t\t\tl.coneCos = s5.r;\n\t\t\tl.penumbraCos = s5.g;\n\t\t\tl.iesProfile = int( round( s5.b ) );\n\n\t\t} else {\n\n\t\t\tl.radius = 0.0;\n\t\t\tl.near = 0.0;\n\t\t\tl.decay = 0.0;\n\t\t\tl.distance = 0.0;\n\n\t\t\tl.coneCos = 0.0;\n\t\t\tl.penumbraCos = 0.0;\n\t\t\tl.iesProfile = - 1;\n\n\t\t}\n\n\t\treturn l;\n\n\t}\n\n`;\n","export const materialStructGLSL = /* glsl */ `\n\n\tstruct Material {\n\n\t\tvec3 color;\n\t\tint map;\n\n\t\tfloat metalness;\n\t\tint metalnessMap;\n\n\t\tfloat roughness;\n\t\tint roughnessMap;\n\n\t\tfloat ior;\n\t\tfloat transmission;\n\t\tint transmissionMap;\n\n\t\tfloat emissiveIntensity;\n\t\tvec3 emissive;\n\t\tint emissiveMap;\n\n\t\tint normalMap;\n\t\tvec2 normalScale;\n\n\t\tfloat clearcoat;\n\t\tint clearcoatMap;\n\t\tint clearcoatNormalMap;\n\t\tvec2 clearcoatNormalScale;\n\t\tfloat clearcoatRoughness;\n\t\tint clearcoatRoughnessMap;\n\n\t\tint iridescenceMap;\n\t\tint iridescenceThicknessMap;\n\t\tfloat iridescence;\n\t\tfloat iridescenceIor;\n\t\tfloat iridescenceThicknessMinimum;\n\t\tfloat iridescenceThicknessMaximum;\n\n\t\tvec3 specularColor;\n\t\tint specularColorMap;\n\n\t\tfloat specularIntensity;\n\t\tint specularIntensityMap;\n\t\tbool thinFilm;\n\n\t\tvec3 attenuationColor;\n\t\tfloat attenuationDistance;\n\n\t\tint alphaMap;\n\n\t\tbool castShadow;\n\t\tfloat opacity;\n\t\tfloat alphaTest;\n\n\t\tfloat side;\n\t\tbool matte;\n\n\t\tfloat sheen;\n\t\tvec3 sheenColor;\n\t\tint sheenColorMap;\n\t\tfloat sheenRoughness;\n\t\tint sheenRoughnessMap;\n\n\t\tbool vertexColors;\n\t\tbool flatShading;\n\t\tbool transparent;\n\t\tbool fogVolume;\n\n\t\tmat3 mapTransform;\n\t\tmat3 metalnessMapTransform;\n\t\tmat3 roughnessMapTransform;\n\t\tmat3 transmissionMapTransform;\n\t\tmat3 emissiveMapTransform;\n\t\tmat3 normalMapTransform;\n\t\tmat3 clearcoatMapTransform;\n\t\tmat3 clearcoatNormalMapTransform;\n\t\tmat3 clearcoatRoughnessMapTransform;\n\t\tmat3 sheenColorMapTransform;\n\t\tmat3 sheenRoughnessMapTransform;\n\t\tmat3 iridescenceMapTransform;\n\t\tmat3 iridescenceThicknessMapTransform;\n\t\tmat3 specularColorMapTransform;\n\t\tmat3 specularIntensityMapTransform;\n\n\t};\n\n\tmat3 readTextureTransform( sampler2D tex, uint index ) {\n\n\t\tmat3 textureTransform;\n\n\t\tvec4 row1 = texelFetch1D( tex, index );\n\t\tvec4 row2 = texelFetch1D( tex, index + 1u );\n\n\t\ttextureTransform[0] = vec3(row1.r, row2.r, 0.0);\n\t\ttextureTransform[1] = vec3(row1.g, row2.g, 0.0);\n\t\ttextureTransform[2] = vec3(row1.b, row2.b, 1.0);\n\n\t\treturn textureTransform;\n\n\t}\n\n\tMaterial readMaterialInfo( sampler2D tex, uint index ) {\n\n\t\tuint i = index * 45u;\n\n\t\tvec4 s0 = texelFetch1D( tex, i + 0u );\n\t\tvec4 s1 = texelFetch1D( tex, i + 1u );\n\t\tvec4 s2 = texelFetch1D( tex, i + 2u );\n\t\tvec4 s3 = texelFetch1D( tex, i + 3u );\n\t\tvec4 s4 = texelFetch1D( tex, i + 4u );\n\t\tvec4 s5 = texelFetch1D( tex, i + 5u );\n\t\tvec4 s6 = texelFetch1D( tex, i + 6u );\n\t\tvec4 s7 = texelFetch1D( tex, i + 7u );\n\t\tvec4 s8 = texelFetch1D( tex, i + 8u );\n\t\tvec4 s9 = texelFetch1D( tex, i + 9u );\n\t\tvec4 s10 = texelFetch1D( tex, i + 10u );\n\t\tvec4 s11 = texelFetch1D( tex, i + 11u );\n\t\tvec4 s12 = texelFetch1D( tex, i + 12u );\n\t\tvec4 s13 = texelFetch1D( tex, i + 13u );\n\t\tvec4 s14 = texelFetch1D( tex, i + 14u );\n\n\t\tMaterial m;\n\t\tm.color = s0.rgb;\n\t\tm.map = int( round( s0.a ) );\n\n\t\tm.metalness = s1.r;\n\t\tm.metalnessMap = int( round( s1.g ) );\n\t\tm.roughness = s1.b;\n\t\tm.roughnessMap = int( round( s1.a ) );\n\n\t\tm.ior = s2.r;\n\t\tm.transmission = s2.g;\n\t\tm.transmissionMap = int( round( s2.b ) );\n\t\tm.emissiveIntensity = s2.a;\n\n\t\tm.emissive = s3.rgb;\n\t\tm.emissiveMap = int( round( s3.a ) );\n\n\t\tm.normalMap = int( round( s4.r ) );\n\t\tm.normalScale = s4.gb;\n\n\t\tm.clearcoat = s4.a;\n\t\tm.clearcoatMap = int( round( s5.r ) );\n\t\tm.clearcoatRoughness = s5.g;\n\t\tm.clearcoatRoughnessMap = int( round( s5.b ) );\n\t\tm.clearcoatNormalMap = int( round( s5.a ) );\n\t\tm.clearcoatNormalScale = s6.rg;\n\n\t\tm.sheen = s6.a;\n\t\tm.sheenColor = s7.rgb;\n\t\tm.sheenColorMap = int( round( s7.a ) );\n\t\tm.sheenRoughness = s8.r;\n\t\tm.sheenRoughnessMap = int( round( s8.g ) );\n\n\t\tm.iridescenceMap = int( round( s8.b ) );\n\t\tm.iridescenceThicknessMap = int( round( s8.a ) );\n\t\tm.iridescence = s9.r;\n\t\tm.iridescenceIor = s9.g;\n\t\tm.iridescenceThicknessMinimum = s9.b;\n\t\tm.iridescenceThicknessMaximum = s9.a;\n\n\t\tm.specularColor = s10.rgb;\n\t\tm.specularColorMap = int( round( s10.a ) );\n\n\t\tm.specularIntensity = s11.r;\n\t\tm.specularIntensityMap = int( round( s11.g ) );\n\t\tm.thinFilm = bool( s11.b );\n\n\t\tm.attenuationColor = s12.rgb;\n\t\tm.attenuationDistance = s12.a;\n\n\t\tm.alphaMap = int( round( s13.r ) );\n\n\t\tm.opacity = s13.g;\n\t\tm.alphaTest = s13.b;\n\t\tm.side = s13.a;\n\n\t\tm.matte = bool( s14.r );\n\t\tm.castShadow = ! bool( s14.g );\n\t\tm.vertexColors = bool( int( s14.b ) & 1 );\n\t\tm.flatShading = bool( int( s14.b ) & 2 );\n\t\tm.fogVolume = bool( int( s14.b ) & 4 );\n\t\tm.transparent = bool( s14.a );\n\n\t\tuint firstTextureTransformIdx = i + 15u;\n\n\t\t// mat3( 1.0 ) is an identity matrix\n\t\tm.mapTransform = m.map == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx );\n\t\tm.metalnessMapTransform = m.metalnessMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 2u );\n\t\tm.roughnessMapTransform = m.roughnessMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 4u );\n\t\tm.transmissionMapTransform = m.transmissionMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 6u );\n\t\tm.emissiveMapTransform = m.emissiveMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 8u );\n\t\tm.normalMapTransform = m.normalMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 10u );\n\t\tm.clearcoatMapTransform = m.clearcoatMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 12u );\n\t\tm.clearcoatNormalMapTransform = m.clearcoatNormalMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 14u );\n\t\tm.clearcoatRoughnessMapTransform = m.clearcoatRoughnessMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 16u );\n\t\tm.sheenColorMapTransform = m.sheenColorMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 18u );\n\t\tm.sheenRoughnessMapTransform = m.sheenRoughnessMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 20u );\n\t\tm.iridescenceMapTransform = m.iridescenceMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 22u );\n\t\tm.iridescenceThicknessMapTransform = m.iridescenceThicknessMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 24u );\n\t\tm.specularColorMapTransform = m.specularColorMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 26u );\n\t\tm.specularIntensityMapTransform = m.specularIntensityMap == - 1 ? mat3( 1.0 ) : readTextureTransform( tex, firstTextureTransformIdx + 28u );\n\n\t\treturn m;\n\n\t}\n\n`;\n","export const fogMaterialBvhGLSL = /* glsl */`\n\n#ifndef FOG_CHECK_ITERATIONS\n#define FOG_CHECK_ITERATIONS 30\n#endif\n\n// returns whether the given material is a fog material or not\nbool isMaterialFogVolume( sampler2D materials, uint materialIndex ) {\n\n\tuint i = materialIndex * 45u;\n\tvec4 s14 = texelFetch1D( materials, i + 14u );\n\treturn bool( int( s14.b ) & 4 );\n\n}\n\n// returns true if we're within the first fog volume we hit\nbool bvhIntersectFogVolumeHit(\n\tvec3 rayOrigin, vec3 rayDirection,\n\tusampler2D materialIndexAttribute, sampler2D materials,\n\tinout Material material\n) {\n\n\tmaterial.fogVolume = false;\n\n\tfor ( int i = 0; i < FOG_CHECK_ITERATIONS; i ++ ) {\n\n\t\t// find nearest hit\n\t\tuvec4 faceIndices = uvec4( 0u );\n\t\tvec3 faceNormal = vec3( 0.0, 0.0, 1.0 );\n\t\tvec3 barycoord = vec3( 0.0 );\n\t\tfloat side = 1.0;\n\t\tfloat dist = 0.0;\n\t\tbool hit = bvhIntersectFirstHit( bvh, rayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist );\n\t\tif ( hit ) {\n\n\t\t\t// if it's a fog volume return whether we hit the front or back face\n\t\t\tuint materialIndex = uTexelFetch1D( materialIndexAttribute, faceIndices.x ).r;\n\t\t\tif ( isMaterialFogVolume( materials, materialIndex ) ) {\n\n\t\t\t\tmaterial = readMaterialInfo( materials, materialIndex );\n\t\t\t\treturn side == - 1.0;\n\n\t\t\t} else {\n\n\t\t\t\t// move the ray forward\n\t\t\t\trayOrigin = stepRayOrigin( rayOrigin, rayDirection, - faceNormal, dist );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\n`;\n","export const ggxGLSL = /* glsl */`\n\n\t// The GGX functions provide sampling and distribution information for normals as output so\n\t// in order to get probability of scatter direction the half vector must be computed and provided.\n\t// [0] https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf\n\t// [1] https://hal.archives-ouvertes.fr/hal-01509746/document\n\t// [2] http://jcgt.org/published/0007/04/01/\n\t// [4] http://jcgt.org/published/0003/02/03/\n\n\t// trowbridge-reitz === GGX === GTR\n\n\tvec3 ggxDirection( vec3 incidentDir, vec2 roughness, vec2 uv ) {\n\n\t\t// TODO: try GGXVNDF implementation from reference [2], here. Needs to update ggxDistribution\n\t\t// function below, as well\n\n\t\t// Implementation from reference [1]\n\t\t// stretch view\n\t\tvec3 V = normalize( vec3( roughness * incidentDir.xy, incidentDir.z ) );\n\n\t\t// orthonormal basis\n\t\tvec3 T1 = ( V.z < 0.9999 ) ? normalize( cross( V, vec3( 0.0, 0.0, 1.0 ) ) ) : vec3( 1.0, 0.0, 0.0 );\n\t\tvec3 T2 = cross( T1, V );\n\n\t\t// sample point with polar coordinates (r, phi)\n\t\tfloat a = 1.0 / ( 1.0 + V.z );\n\t\tfloat r = sqrt( uv.x );\n\t\tfloat phi = ( uv.y < a ) ? uv.y / a * PI : PI + ( uv.y - a ) / ( 1.0 - a ) * PI;\n\t\tfloat P1 = r * cos( phi );\n\t\tfloat P2 = r * sin( phi ) * ( ( uv.y < a ) ? 1.0 : V.z );\n\n\t\t// compute normal\n\t\tvec3 N = P1 * T1 + P2 * T2 + V * sqrt( max( 0.0, 1.0 - P1 * P1 - P2 * P2 ) );\n\n\t\t// unstretch\n\t\tN = normalize( vec3( roughness * N.xy, max( 0.0, N.z ) ) );\n\n\t\treturn N;\n\n\t}\n\n\t// Below are PDF and related functions for use in a Monte Carlo path tracer\n\t// as specified in Appendix B of the following paper\n\t// See equation (34) from reference [0]\n\tfloat ggxLamda( float theta, float roughness ) {\n\n\t\tfloat tanTheta = tan( theta );\n\t\tfloat tanTheta2 = tanTheta * tanTheta;\n\t\tfloat alpha2 = roughness * roughness;\n\n\t\tfloat numerator = - 1.0 + sqrt( 1.0 + alpha2 * tanTheta2 );\n\t\treturn numerator / 2.0;\n\n\t}\n\n\t// See equation (34) from reference [0]\n\tfloat ggxShadowMaskG1( float theta, float roughness ) {\n\n\t\treturn 1.0 / ( 1.0 + ggxLamda( theta, roughness ) );\n\n\t}\n\n\t// See equation (125) from reference [4]\n\tfloat ggxShadowMaskG2( vec3 wi, vec3 wo, float roughness ) {\n\n\t\tfloat incidentTheta = acos( wi.z );\n\t\tfloat scatterTheta = acos( wo.z );\n\t\treturn 1.0 / ( 1.0 + ggxLamda( incidentTheta, roughness ) + ggxLamda( scatterTheta, roughness ) );\n\n\t}\n\n\t// See equation (33) from reference [0]\n\tfloat ggxDistribution( vec3 halfVector, float roughness ) {\n\n\t\tfloat a2 = roughness * roughness;\n\t\ta2 = max( EPSILON, a2 );\n\t\tfloat cosTheta = halfVector.z;\n\t\tfloat cosTheta4 = pow( cosTheta, 4.0 );\n\n\t\tif ( cosTheta == 0.0 ) return 0.0;\n\n\t\tfloat theta = acosSafe( halfVector.z );\n\t\tfloat tanTheta = tan( theta );\n\t\tfloat tanTheta2 = pow( tanTheta, 2.0 );\n\n\t\tfloat denom = PI * cosTheta4 * pow( a2 + tanTheta2, 2.0 );\n\t\treturn ( a2 / denom );\n\n\t}\n\n\t// See equation (3) from reference [2]\n\tfloat ggxPDF( vec3 wi, vec3 halfVector, float roughness ) {\n\n\t\tfloat incidentTheta = acos( wi.z );\n\t\tfloat D = ggxDistribution( halfVector, roughness );\n\t\tfloat G1 = ggxShadowMaskG1( incidentTheta, roughness );\n\n\t\treturn D * G1 * max( 0.0, dot( wi, halfVector ) ) / wi.z;\n\n\t}\n\n`;\n","export const sheenGLSL = /* glsl */`\n\n\t// See equation (2) in http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf\n\tfloat velvetD( float cosThetaH, float roughness ) {\n\n\t\tfloat alpha = max( roughness, 0.07 );\n\t\talpha = alpha * alpha;\n\n\t\tfloat invAlpha = 1.0 / alpha;\n\n\t\tfloat sqrCosThetaH = cosThetaH * cosThetaH;\n\t\tfloat sinThetaH = max( 1.0 - sqrCosThetaH, 0.001 );\n\n\t\treturn ( 2.0 + invAlpha ) * pow( sinThetaH, 0.5 * invAlpha ) / ( 2.0 * PI );\n\n\t}\n\n\tfloat velvetParamsInterpolate( int i, float oneMinusAlphaSquared ) {\n\n\t\tconst float p0[5] = float[5]( 25.3245, 3.32435, 0.16801, -1.27393, -4.85967 );\n\t\tconst float p1[5] = float[5]( 21.5473, 3.82987, 0.19823, -1.97760, -4.32054 );\n\n\t\treturn mix( p1[i], p0[i], oneMinusAlphaSquared );\n\n\t}\n\n\tfloat velvetL( float x, float alpha ) {\n\n\t\tfloat oneMinusAlpha = 1.0 - alpha;\n\t\tfloat oneMinusAlphaSquared = oneMinusAlpha * oneMinusAlpha;\n\n\t\tfloat a = velvetParamsInterpolate( 0, oneMinusAlphaSquared );\n\t\tfloat b = velvetParamsInterpolate( 1, oneMinusAlphaSquared );\n\t\tfloat c = velvetParamsInterpolate( 2, oneMinusAlphaSquared );\n\t\tfloat d = velvetParamsInterpolate( 3, oneMinusAlphaSquared );\n\t\tfloat e = velvetParamsInterpolate( 4, oneMinusAlphaSquared );\n\n\t\treturn a / ( 1.0 + b * pow( abs( x ), c ) ) + d * x + e;\n\n\t}\n\n\t// See equation (3) in http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf\n\tfloat velvetLambda( float cosTheta, float alpha ) {\n\n\t\treturn abs( cosTheta ) < 0.5 ? exp( velvetL( cosTheta, alpha ) ) : exp( 2.0 * velvetL( 0.5, alpha ) - velvetL( 1.0 - cosTheta, alpha ) );\n\n\t}\n\n\t// See Section 3, Shadowing Term, in http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf\n\tfloat velvetG( float cosThetaO, float cosThetaI, float roughness ) {\n\n\t\tfloat alpha = max( roughness, 0.07 );\n\t\talpha = alpha * alpha;\n\n\t\treturn 1.0 / ( 1.0 + velvetLambda( cosThetaO, alpha ) + velvetLambda( cosThetaI, alpha ) );\n\n\t}\n\n\tfloat directionalAlbedoSheen( float cosTheta, float alpha ) {\n\n\t\tcosTheta = saturate( cosTheta );\n\n\t\tfloat c = 1.0 - cosTheta;\n\t\tfloat c3 = c * c * c;\n\n\t\treturn 0.65584461 * c3 + 1.0 / ( 4.16526551 + exp( -7.97291361 * sqrt( alpha ) + 6.33516894 ) );\n\n\t}\n\n\tfloat sheenAlbedoScaling( vec3 wo, vec3 wi, SurfaceRecord surf ) {\n\n\t\tfloat alpha = max( surf.sheenRoughness, 0.07 );\n\t\talpha = alpha * alpha;\n\n\t\tfloat maxSheenColor = max( max( surf.sheenColor.r, surf.sheenColor.g ), surf.sheenColor.b );\n\n\t\tfloat eWo = directionalAlbedoSheen( saturateCos( wo.z ), alpha );\n\t\tfloat eWi = directionalAlbedoSheen( saturateCos( wi.z ), alpha );\n\n\t\treturn min( 1.0 - maxSheenColor * eWo, 1.0 - maxSheenColor * eWi );\n\n\t}\n\n\t// See Section 5, Layering, in http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf\n\tfloat sheenAlbedoScaling( vec3 wo, SurfaceRecord surf ) {\n\n\t\tfloat alpha = max( surf.sheenRoughness, 0.07 );\n\t\talpha = alpha * alpha;\n\n\t\tfloat maxSheenColor = max( max( surf.sheenColor.r, surf.sheenColor.g ), surf.sheenColor.b );\n\n\t\tfloat eWo = directionalAlbedoSheen( saturateCos( wo.z ), alpha );\n\n\t\treturn 1.0 - maxSheenColor * eWo;\n\n\t}\n\n`;\n","export const iridescenceGLSL = /* glsl */`\n\n\t// XYZ to sRGB color space\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t3.2404542, -0.9692660,  0.0556434,\n\t\t-1.5371385,  1.8760108, -0.2040259,\n\t\t-0.4985314,  0.0415560,  1.0572252\n\t);\n\n\tvec3 fresnel0ToIor( vec3 fresnel0 ) {\n\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\n\t}\n\n\t// Conversion FO/IOR\n\tvec3 iorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\n\t\treturn square( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\n\t}\n\n\t// ior is a value between 1.0 and 3.0. 1.0 is air interface\n\tfloat iorToFresnel0( float transmittedIor, float incidentIor ) {\n\n\t\treturn square( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ) );\n\n\t}\n\n\t// Fresnel equations for dielectric/dielectric interfaces. See https://belcour.github.io/blog/research/2017/05/01/brdf-thin-film.html\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - square( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * square( phase ) );\n\t\txyz /= 1.0685e-7;\n\n\t\tvec3 srgb = XYZ_TO_REC709 * xyz;\n\t\treturn srgb;\n\n\t}\n\n\t// See Section 4. Analytic Spectral Integration, A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence, https://hal.archives-ouvertes.fr/hal-01518344/document\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\n\t\tvec3 I;\n\n\t\t// Force iridescenceIor -> outsideIOR when thinFilmThickness -> 0.0\n\t\tfloat iridescenceIor = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\n\t\t// Evaluate the cosTheta on the base layer (Snell law)\n\t\tfloat sinTheta2Sq = square( outsideIOR / iridescenceIor ) * ( 1.0 - square( cosTheta1 ) );\n\n\t\t// Handle TIR:\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\n\t\t\treturn vec3( 1.0 );\n\n\t\t}\n\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\n\t\t// First interface\n\t\tfloat R0 = iorToFresnel0( iridescenceIor, outsideIOR );\n\t\tfloat R12 = schlickFresnel( cosTheta1, R0 );\n\t\tfloat R21 = R12;\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIor < outsideIOR ) {\n\n\t\t\tphi12 = PI;\n\n\t\t}\n\n\t\tfloat phi21 = PI - phi12;\n\n\t\t// Second interface\n\t\tvec3 baseIOR = fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) ); // guard against 1.0\n\t\tvec3 R1 = iorToFresnel0( baseIOR, iridescenceIor );\n\t\tvec3 R23 = schlickFresnel( cosTheta2, R1 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[0] < iridescenceIor ) {\n\n\t\t\tphi23[ 0 ] = PI;\n\n\t\t}\n\n\t\tif ( baseIOR[1] < iridescenceIor ) {\n\n\t\t\tphi23[ 1 ] = PI;\n\n\t\t}\n\n\t\tif ( baseIOR[2] < iridescenceIor ) {\n\n\t\t\tphi23[ 2 ] = PI;\n\n\t\t}\n\n\t\t// Phase shift\n\t\tfloat OPD = 2.0 * iridescenceIor * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\n\t\t// Compound terms\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = square( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\n\t\t// Reflectance term for m = 0 (DC term amplitude)\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\n\t\t// Reflectance term for m > 0 (pairs of diracs)\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\n\t\t}\n\n\t\t// Since out of gamut colors might be produced, negative color values are clamped to 0.\n\t\treturn max( I, vec3( 0.0 ) );\n\n\t}\n\n`;\n","import { ggxGLSL } from './ggx.glsl.js';\nimport { sheenGLSL } from './sheen.glsl.js';\nimport { iridescenceGLSL } from './iridescence.glsl.js';\n\n/*\nwi     : incident vector or light vector (pointing toward the light)\nwo     : outgoing vector or view vector (pointing towards the camera)\nwh     : computed half vector from wo and wi\nEval   : Get the color and pdf for a direction\nSample : Get the direction, color, and pdf for a sample\neta    : Greek character used to denote the \"ratio of ior\"\nf0     : Amount of light reflected when looking at a surface head on - \"fresnel 0\"\nf90    : Amount of light reflected at grazing angles\n*/\n\nexport const bsdfSamplingGLSL = /* glsl */`\n\n\tstruct SurfaceRecord {\n\n\t\t// surface type\n\t\tbool volumeParticle;\n\n\t\t// geometry\n\t\tvec3 faceNormal;\n\t\tbool frontFace;\n\t\tvec3 normal;\n\t\tmat3 normalBasis;\n\t\tmat3 normalInvBasis;\n\n\t\t// cached properties\n\t\tfloat eta;\n\t\tfloat f0;\n\n\t\t// material\n\t\tfloat roughness;\n\t\tfloat filteredRoughness;\n\t\tfloat metalness;\n\t\tvec3 color;\n\t\tvec3 emission;\n\n\t\t// transmission\n\t\tfloat ior;\n\t\tfloat transmission;\n\t\tbool thinFilm;\n\t\tvec3 attenuationColor;\n\t\tfloat attenuationDistance;\n\n\t\t// clearcoat\n\t\tvec3 clearcoatNormal;\n\t\tmat3 clearcoatBasis;\n\t\tmat3 clearcoatInvBasis;\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tfloat filteredClearcoatRoughness;\n\n\t\t// sheen\n\t\tfloat sheen;\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\n\t\t// iridescence\n\t\tfloat iridescence;\n\t\tfloat iridescenceIor;\n\t\tfloat iridescenceThickness;\n\n\t\t// specular\n\t\tvec3 specularColor;\n\t\tfloat specularIntensity;\n\t};\n\n\tstruct ScatterRecord {\n\t\tfloat specularPdf;\n\t\tfloat pdf;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\n\t${ ggxGLSL }\n\t${ sheenGLSL }\n\t${ iridescenceGLSL }\n\n\t// diffuse\n\tfloat diffuseEval( vec3 wo, vec3 wi, vec3 wh, SurfaceRecord surf, inout vec3 color ) {\n\n\t\t// https://schuttejoe.github.io/post/disneybsdf/\n\t\tfloat fl = schlickFresnel( wi.z, 0.0 );\n\t\tfloat fv = schlickFresnel( wo.z, 0.0 );\n\n\t\tfloat metalFactor = ( 1.0 - surf.metalness );\n\t\tfloat transFactor = ( 1.0 - surf.transmission );\n\t\tfloat rr = 0.5 + 2.0 * surf.roughness * fl * fl;\n\t\tfloat retro = rr * ( fl + fv + fl * fv * ( rr - 1.0f ) );\n\t\tfloat lambert = ( 1.0f - 0.5f * fl ) * ( 1.0f - 0.5f * fv );\n\n\t\t// TODO: subsurface approx?\n\n\t\tfloat F = evaluateFresnelWeight( dot( wo, wh ), surf.eta, surf.f0 );\n\t\tcolor = ( 1.0 - F ) * transFactor * metalFactor * wi.z * surf.color * ( retro + lambert ) / PI;\n\t\treturn wi.z / PI;\n\n\t}\n\n\tvec3 diffuseDirection( vec3 wo, SurfaceRecord surf ) {\n\n\t\tvec3 lightDirection = sampleSphere( sobol2( 11 ) );\n\t\tlightDirection.z += 1.0;\n\t\tlightDirection = normalize( lightDirection );\n\n\t\treturn lightDirection;\n\n\t}\n\n\t// specular\n\tfloat specularEval( vec3 wo, vec3 wi, vec3 wh, SurfaceRecord surf, inout vec3 color ) {\n\n\t\t// if roughness is set to 0 then D === NaN which results in black pixels\n\t\tfloat metalness = surf.metalness;\n\t\tfloat roughness = surf.filteredRoughness;\n\n\t\tfloat eta = surf.eta;\n\t\tfloat f0 = surf.f0;\n\n\t\tvec3 f0Color = mix( f0 * surf.specularColor * surf.specularIntensity, surf.color, surf.metalness );\n\t\tvec3 f90Color = vec3( mix( surf.specularIntensity, 1.0, surf.metalness ) );\n\t\tvec3 F = evaluateFresnel( dot( wo, wh ), eta, f0Color, f90Color );\n\n\t\tvec3 iridescenceF = evalIridescence( 1.0, surf.iridescenceIor, dot( wi, wh ), surf.iridescenceThickness, f0Color );\n\t\tF = mix( F, iridescenceF,  surf.iridescence );\n\n\t\t// PDF\n\t\t// See 14.1.1 Microfacet BxDFs in https://www.pbr-book.org/\n\t\tfloat incidentTheta = acos( wo.z );\n\t\tfloat G = ggxShadowMaskG2( wi, wo, roughness );\n\t\tfloat D = ggxDistribution( wh, roughness );\n\t\tfloat G1 = ggxShadowMaskG1( incidentTheta, roughness );\n\t\tfloat ggxPdf = D * G1 * max( 0.0, abs( dot( wo, wh ) ) ) / abs ( wo.z );\n\n\t\tcolor = wi.z * F * G * D / ( 4.0 * abs( wi.z * wo.z ) );\n\t\treturn ggxPdf / ( 4.0 * dot( wo, wh ) );\n\n\t}\n\n\tvec3 specularDirection( vec3 wo, SurfaceRecord surf ) {\n\n\t\t// sample ggx vndf distribution which gives a new normal\n\t\tfloat roughness = surf.filteredRoughness;\n\t\tvec3 halfVector = ggxDirection(\n\t\t\two,\n\t\t\tvec2( roughness ),\n\t\t\tsobol2( 12 )\n\t\t);\n\n\t\t// apply to new ray by reflecting off the new normal\n\t\treturn - reflect( wo, halfVector );\n\n\t}\n\n\n\t// transmission\n\t/*\n\tfloat transmissionEval( vec3 wo, vec3 wi, vec3 wh, SurfaceRecord surf, inout vec3 color ) {\n\n\t\t// See section 4.2 in https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf\n\n\t\tfloat filteredRoughness = surf.filteredRoughness;\n\t\tfloat eta = surf.eta;\n\t\tbool frontFace = surf.frontFace;\n\t\tbool thinFilm = surf.thinFilm;\n\n\t\tcolor = surf.transmission * surf.color;\n\n\t\tfloat denom = pow( eta * dot( wi, wh ) + dot( wo, wh ), 2.0 );\n\t\treturn ggxPDF( wo, wh, filteredRoughness ) / denom;\n\n\t}\n\n\tvec3 transmissionDirection( vec3 wo, SurfaceRecord surf ) {\n\n\t\tfloat filteredRoughness = surf.filteredRoughness;\n\t\tfloat eta = surf.eta;\n\t\tbool frontFace = surf.frontFace;\n\n\t\t// sample ggx vndf distribution which gives a new normal\n\t\tvec3 halfVector = ggxDirection(\n\t\t\two,\n\t\t\tvec2( filteredRoughness ),\n\t\t\tsobol2( 13 )\n\t\t);\n\n\t\tvec3 lightDirection = refract( normalize( - wo ), halfVector, eta );\n\t\tif ( surf.thinFilm ) {\n\n\t\t\tlightDirection = - refract( normalize( - lightDirection ), - vec3( 0.0, 0.0, 1.0 ), 1.0 / eta );\n\n\t\t}\n\n\t\treturn normalize( lightDirection );\n\n\t}\n\t*/\n\n\t// TODO: This is just using a basic cosine-weighted specular distribution with an\n\t// incorrect PDF value at the moment. Update it to correctly use a GGX distribution\n\tfloat transmissionEval( vec3 wo, vec3 wi, vec3 wh, SurfaceRecord surf, inout vec3 color ) {\n\n\t\tcolor = surf.transmission * surf.color;\n\n\t\t// PDF\n\t\tfloat F = evaluateFresnelWeight( dot( wo, wh ), surf.eta, surf.f0 );\n\t\tif ( F >= 1.0 ) {\n\n\t\t\treturn 0.0;\n\n\t\t}\n\n\t\treturn 1.0 / ( 1.0 - F );\n\n\t}\n\n\tvec3 transmissionDirection( vec3 wo, SurfaceRecord surf ) {\n\n\t\tfloat roughness = surf.filteredRoughness;\n\t\tfloat eta = surf.eta;\n\t\tvec3 halfVector = normalize( vec3( 0.0, 0.0, 1.0 ) + sampleSphere( sobol2( 13 ) ) * roughness );\n\t\tvec3 lightDirection = refract( normalize( - wo ), halfVector, eta );\n\n\t\tif ( surf.thinFilm ) {\n\n\t\t\tlightDirection = - refract( normalize( - lightDirection ), - vec3( 0.0, 0.0, 1.0 ), 1.0 / eta );\n\n\t\t}\n\t\treturn normalize( lightDirection );\n\n\t}\n\n\t// clearcoat\n\tfloat clearcoatEval( vec3 wo, vec3 wi, vec3 wh, SurfaceRecord surf, inout vec3 color ) {\n\n\t\tfloat ior = 1.5;\n\t\tfloat f0 = iorRatioToF0( ior );\n\t\tbool frontFace = surf.frontFace;\n\t\tfloat roughness = surf.filteredClearcoatRoughness;\n\n\t\tfloat eta = frontFace ? 1.0 / ior : ior;\n\t\tfloat G = ggxShadowMaskG2( wi, wo, roughness );\n\t\tfloat D = ggxDistribution( wh, roughness );\n\t\tfloat F = schlickFresnel( dot( wi, wh ), f0 );\n\n\t\tfloat fClearcoat = F * D * G / ( 4.0 * abs( wi.z * wo.z ) );\n\t\tcolor = color * ( 1.0 - surf.clearcoat * F ) + fClearcoat * surf.clearcoat * wi.z;\n\n\t\t// PDF\n\t\t// See equation (27) in http://jcgt.org/published/0003/02/03/\n\t\treturn ggxPDF( wo, wh, roughness ) / ( 4.0 * dot( wi, wh ) );\n\n\t}\n\n\tvec3 clearcoatDirection( vec3 wo, SurfaceRecord surf ) {\n\n\t\t// sample ggx vndf distribution which gives a new normal\n\t\tfloat roughness = surf.filteredClearcoatRoughness;\n\t\tvec3 halfVector = ggxDirection(\n\t\t\two,\n\t\t\tvec2( roughness ),\n\t\t\tsobol2( 14 )\n\t\t);\n\n\t\t// apply to new ray by reflecting off the new normal\n\t\treturn - reflect( wo, halfVector );\n\n\t}\n\n\t// sheen\n\tvec3 sheenColor( vec3 wo, vec3 wi, vec3 wh, SurfaceRecord surf ) {\n\n\t\tfloat cosThetaO = saturateCos( wo.z );\n\t\tfloat cosThetaI = saturateCos( wi.z );\n\t\tfloat cosThetaH = wh.z;\n\n\t\tfloat D = velvetD( cosThetaH, surf.sheenRoughness );\n\t\tfloat G = velvetG( cosThetaO, cosThetaI, surf.sheenRoughness );\n\n\t\t// See equation (1) in http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf\n\t\tvec3 color = surf.sheenColor;\n\t\tcolor *= D * G / ( 4.0 * abs( cosThetaO * cosThetaI ) );\n\t\tcolor *= wi.z;\n\n\t\treturn color;\n\n\t}\n\n\t// bsdf\n\tvoid getLobeWeights(\n\t\tvec3 wo, vec3 wi, vec3 wh, vec3 clearcoatWo, SurfaceRecord surf,\n\t\tinout float diffuseWeight, inout float specularWeight, inout float transmissionWeight, inout float clearcoatWeight\n\t) {\n\n\t\tfloat metalness = surf.metalness;\n\t\tfloat transmission = surf.transmission;\n\t\tfloat fEstimate = evaluateFresnelWeight( dot( wo, wh ), surf.eta, surf.f0 );\n\n\t\tfloat transSpecularProb = mix( max( 0.25, fEstimate ), 1.0, metalness );\n\t\tfloat diffSpecularProb = 0.5 + 0.5 * metalness;\n\n\t\tdiffuseWeight = ( 1.0 - transmission ) * ( 1.0 - diffSpecularProb );\n\t\tspecularWeight = transmission * transSpecularProb + ( 1.0 - transmission ) * diffSpecularProb;\n\t\ttransmissionWeight = transmission * ( 1.0 - transSpecularProb );\n\t\tclearcoatWeight = surf.clearcoat * schlickFresnel( clearcoatWo.z, 0.04 );\n\n\t\tfloat totalWeight = diffuseWeight + specularWeight + transmissionWeight + clearcoatWeight;\n\t\tdiffuseWeight /= totalWeight;\n\t\tspecularWeight /= totalWeight;\n\t\ttransmissionWeight /= totalWeight;\n\t\tclearcoatWeight /= totalWeight;\n\t}\n\n\tfloat bsdfEval(\n\t\tvec3 wo, vec3 clearcoatWo, vec3 wi, vec3 clearcoatWi, SurfaceRecord surf,\n\t\tfloat diffuseWeight, float specularWeight, float transmissionWeight, float clearcoatWeight, inout float specularPdf, inout vec3 color\n\t) {\n\n\t\tfloat metalness = surf.metalness;\n\t\tfloat transmission = surf.transmission;\n\n\t\tfloat spdf = 0.0;\n\t\tfloat dpdf = 0.0;\n\t\tfloat tpdf = 0.0;\n\t\tfloat cpdf = 0.0;\n\t\tcolor = vec3( 0.0 );\n\n\t\tvec3 halfVector = getHalfVector( wi, wo, surf.eta );\n\n\t\t// diffuse\n\t\tif ( diffuseWeight > 0.0 && wi.z > 0.0 ) {\n\n\t\t\tdpdf = diffuseEval( wo, wi, halfVector, surf, color );\n\t\t\tcolor *= 1.0 - surf.transmission;\n\n\t\t}\n\n\t\t// ggx specular\n\t\tif ( specularWeight > 0.0 && wi.z > 0.0 ) {\n\n\t\t\tvec3 outColor;\n\t\t\tspdf = specularEval( wo, wi, getHalfVector( wi, wo ), surf, outColor );\n\t\t\tcolor += outColor;\n\n\t\t}\n\n\t\t// transmission\n\t\tif ( transmissionWeight > 0.0 && wi.z < 0.0 ) {\n\n\t\t\ttpdf = transmissionEval( wo, wi, halfVector, surf, color );\n\n\t\t}\n\n\t\t// sheen\n\t\tcolor *= mix( 1.0, sheenAlbedoScaling( wo, wi, surf ), surf.sheen );\n\t\tcolor += sheenColor( wo, wi, halfVector, surf ) * surf.sheen;\n\n\t\t// clearcoat\n\t\tif ( clearcoatWi.z >= 0.0 && clearcoatWeight > 0.0 ) {\n\n\t\t\tvec3 clearcoatHalfVector = getHalfVector( clearcoatWo, clearcoatWi );\n\t\t\tcpdf = clearcoatEval( clearcoatWo, clearcoatWi, clearcoatHalfVector, surf, color );\n\n\t\t}\n\n\t\tfloat pdf =\n\t\t\tdpdf * diffuseWeight\n\t\t\t+ spdf * specularWeight\n\t\t\t+ tpdf * transmissionWeight\n\t\t\t+ cpdf * clearcoatWeight;\n\n\t\t// retrieve specular rays for the shadows flag\n\t\tspecularPdf = spdf * specularWeight + cpdf * clearcoatWeight;\n\n\t\treturn pdf;\n\n\t}\n\n\tfloat bsdfResult( vec3 worldWo, vec3 worldWi, SurfaceRecord surf, inout vec3 color ) {\n\n\t\tif ( surf.volumeParticle ) {\n\n\t\t\tcolor = surf.color / ( 4.0 * PI );\n\t\t\treturn 1.0 / ( 4.0 * PI );\n\n\t\t}\n\n\t\tvec3 wo = normalize( surf.normalInvBasis * worldWo );\n\t\tvec3 wi = normalize( surf.normalInvBasis * worldWi );\n\n\t\tvec3 clearcoatWo = normalize( surf.clearcoatInvBasis * worldWo );\n\t\tvec3 clearcoatWi = normalize( surf.clearcoatInvBasis * worldWi );\n\n\t\tvec3 wh = getHalfVector( wo, wi, surf.eta );\n\t\tfloat diffuseWeight;\n\t\tfloat specularWeight;\n\t\tfloat transmissionWeight;\n\t\tfloat clearcoatWeight;\n\t\tgetLobeWeights( wo, wi, wh, clearcoatWo, surf, diffuseWeight, specularWeight, transmissionWeight, clearcoatWeight );\n\n\t\tfloat specularPdf;\n\t\treturn bsdfEval( wo, clearcoatWo, wi, clearcoatWi, surf, diffuseWeight, specularWeight, transmissionWeight, clearcoatWeight, specularPdf, color );\n\n\t}\n\n\tScatterRecord bsdfSample( vec3 worldWo, SurfaceRecord surf ) {\n\n\t\tif ( surf.volumeParticle ) {\n\n\t\t\tScatterRecord sampleRec;\n\t\t\tsampleRec.specularPdf = 0.0;\n\t\t\tsampleRec.pdf = 1.0 / ( 4.0 * PI );\n\t\t\tsampleRec.direction = sampleSphere( sobol2( 16 ) );\n\t\t\tsampleRec.color = surf.color / ( 4.0 * PI );\n\t\t\treturn sampleRec;\n\n\t\t}\n\n\t\tvec3 wo = normalize( surf.normalInvBasis * worldWo );\n\t\tvec3 clearcoatWo = normalize( surf.clearcoatInvBasis * worldWo );\n\t\tmat3 normalBasis = surf.normalBasis;\n\t\tmat3 invBasis = surf.normalInvBasis;\n\t\tmat3 clearcoatNormalBasis = surf.clearcoatBasis;\n\t\tmat3 clearcoatInvBasis = surf.clearcoatInvBasis;\n\n\t\tfloat diffuseWeight;\n\t\tfloat specularWeight;\n\t\tfloat transmissionWeight;\n\t\tfloat clearcoatWeight;\n\t\t// using normal and basically-reflected ray since we don't have proper half vector here\n\t\tgetLobeWeights( wo, wo, vec3( 0, 0, 1 ), clearcoatWo, surf, diffuseWeight, specularWeight, transmissionWeight, clearcoatWeight );\n\n\t\tfloat pdf[4];\n\t\tpdf[0] = diffuseWeight;\n\t\tpdf[1] = specularWeight;\n\t\tpdf[2] = transmissionWeight;\n\t\tpdf[3] = clearcoatWeight;\n\n\t\tfloat cdf[4];\n\t\tcdf[0] = pdf[0];\n\t\tcdf[1] = pdf[1] + cdf[0];\n\t\tcdf[2] = pdf[2] + cdf[1];\n\t\tcdf[3] = pdf[3] + cdf[2];\n\n\t\tif( cdf[3] != 0.0 ) {\n\n\t\t\tfloat invMaxCdf = 1.0 / cdf[3];\n\t\t\tcdf[0] *= invMaxCdf;\n\t\t\tcdf[1] *= invMaxCdf;\n\t\t\tcdf[2] *= invMaxCdf;\n\t\t\tcdf[3] *= invMaxCdf;\n\n\t\t} else {\n\n\t\t\tcdf[0] = 1.0;\n\t\t\tcdf[1] = 0.0;\n\t\t\tcdf[2] = 0.0;\n\t\t\tcdf[3] = 0.0;\n\n\t\t}\n\n\t\tvec3 wi;\n\t\tvec3 clearcoatWi;\n\n\t\tfloat r = sobol( 15 );\n\t\tif ( r <= cdf[0] ) { // diffuse\n\n\t\t\twi = diffuseDirection( wo, surf );\n\t\t\tclearcoatWi = normalize( clearcoatInvBasis * normalize( normalBasis * wi ) );\n\n\t\t} else if ( r <= cdf[1] ) { // specular\n\n\t\t\twi = specularDirection( wo, surf );\n\t\t\tclearcoatWi = normalize( clearcoatInvBasis * normalize( normalBasis * wi ) );\n\n\t\t} else if ( r <= cdf[2] ) { // transmission / refraction\n\n\t\t\twi = transmissionDirection( wo, surf );\n\t\t\tclearcoatWi = normalize( clearcoatInvBasis * normalize( normalBasis * wi ) );\n\n\t\t} else if ( r <= cdf[3] ) { // clearcoat\n\n\t\t\tclearcoatWi = clearcoatDirection( clearcoatWo, surf );\n\t\t\twi = normalize( invBasis * normalize( clearcoatNormalBasis * clearcoatWi ) );\n\n\t\t}\n\n\t\tScatterRecord result;\n\t\tresult.pdf = bsdfEval( wo, clearcoatWo, wi, clearcoatWi, surf, diffuseWeight, specularWeight, transmissionWeight, clearcoatWeight, result.specularPdf, result.color );\n\t\tresult.direction = normalize( surf.normalBasis * wi );\n\n\t\treturn result;\n\n\t}\n\n`;\n","export const fogGLSL = /* glsl */`\n\n\t// returns the hit distance given the material density\n\tfloat intersectFogVolume( Material material, float u ) {\n\n\t\t// https://raytracing.github.io/books/RayTracingTheNextWeek.html#volumes/constantdensitymediums\n\t\treturn material.opacity == 0.0 ? INFINITY : ( - 1.0 / material.opacity ) * log( u );\n\n\t}\n\n\tScatterRecord sampleFogVolume( SurfaceRecord surf, vec2 uv ) {\n\n\t\tScatterRecord sampleRec;\n\t\tsampleRec.specularPdf = 0.0;\n\t\tsampleRec.pdf = 1.0 / ( 2.0 * PI );\n\t\tsampleRec.direction = sampleSphere( uv );\n\t\tsampleRec.color = surf.color;\n\t\treturn sampleRec;\n\n\t}\n\n`;\n","export const equirectSamplingGLSL = /* glsl */`\n\n\t// samples the the given environment map in the given direction\n\tvec3 sampleEquirectColor( sampler2D envMap, vec3 direction ) {\n\n\t\treturn texture2D( envMap, equirectDirectionToUv( direction ) ).rgb;\n\n\t}\n\n\t// gets the pdf of the given direction to sample\n\tfloat equirectDirectionPdf( vec3 direction ) {\n\n\t\tvec2 uv = equirectDirectionToUv( direction );\n\t\tfloat theta = uv.y * PI;\n\t\tfloat sinTheta = sin( theta );\n\t\tif ( sinTheta == 0.0 ) {\n\n\t\t\treturn 0.0;\n\n\t\t}\n\n\t\treturn 1.0 / ( 2.0 * PI * PI * sinTheta );\n\n\t}\n\n\t// samples the color given env map with CDF and returns the pdf of the direction\n\tfloat sampleEquirect( vec3 direction, inout vec3 color ) {\n\n\t\tvec2 uv = equirectDirectionToUv( direction );\n\t\tcolor = texture2D( envMapInfo.map, uv ).rgb;\n\n\t\tfloat totalSum = envMapInfo.totalSum;\n\t\tfloat lum = luminance( color );\n\t\tivec2 resolution = textureSize( envMapInfo.map, 0 );\n\t\tfloat pdf = lum / totalSum;\n\n\t\treturn float( resolution.x * resolution.y ) * pdf * equirectDirectionPdf( direction );\n\n\t}\n\n\t// samples a direction of the envmap with color and retrieves pdf\n\tfloat sampleEquirectProbability( vec2 r, inout vec3 color, inout vec3 direction ) {\n\n\t\t// sample env map cdf\n\t\tfloat v = texture2D( envMapInfo.marginalWeights, vec2( r.x, 0.0 ) ).x;\n\t\tfloat u = texture2D( envMapInfo.conditionalWeights, vec2( r.y, v ) ).x;\n\t\tvec2 uv = vec2( u, v );\n\n\t\tvec3 derivedDirection = equirectUvToDirection( uv );\n\t\tdirection = derivedDirection;\n\t\tcolor = texture2D( envMapInfo.map, uv ).rgb;\n\n\t\tfloat totalSum = envMapInfo.totalSum;\n\t\tfloat lum = luminance( color );\n\t\tivec2 resolution = textureSize( envMapInfo.map, 0 );\n\t\tfloat pdf = lum / totalSum;\n\n\t\treturn float( resolution.x * resolution.y ) * pdf * equirectDirectionPdf( direction );\n\n\t}\n\n`;\n","export const lightSamplingGLSL = /* glsl */`\n\n\tfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\n\t\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n\n\t}\n\n\tfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\n\t\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t\t// page 32, equation 26: E[window1]\n\t\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), EPSILON );\n\n\t\tif ( cutoffDistance > 0.0 ) {\n\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\n\t\t}\n\n\t\treturn distanceFalloff;\n\n\t}\n\n\tfloat getPhotometricAttenuation( sampler2DArray iesProfiles, int iesProfile, vec3 posToLight, vec3 lightDir, vec3 u, vec3 v ) {\n\n\t\tfloat cosTheta = dot( posToLight, lightDir );\n\t\tfloat angle = acos( cosTheta ) * ( 1.0 / PI );\n\n\t\treturn texture2D( iesProfiles, vec3( 0.0, angle, iesProfile ) ).r;\n\n\t}\n\n\tstruct LightRecord {\n\n\t\tfloat dist;\n\t\tvec3 direction;\n\t\tfloat pdf;\n\t\tvec3 emission;\n\t\tint type;\n\n\t};\n\n\tbool intersectLightAtIndex( sampler2D lights, vec3 rayOrigin, vec3 rayDirection, uint l, inout LightRecord lightRec ) {\n\n\t\tbool didHit = false;\n\t\tLight light = readLightInfo( lights, l );\n\n\t\tvec3 u = light.u;\n\t\tvec3 v = light.v;\n\n\t\t// check for backface\n\t\tvec3 normal = normalize( cross( u, v ) );\n\t\tif ( dot( normal, rayDirection ) > 0.0 ) {\n\n\t\t\tu *= 1.0 / dot( u, u );\n\t\t\tv *= 1.0 / dot( v, v );\n\n\t\t\tfloat dist;\n\n\t\t\t// MIS / light intersection is not supported for punctual lights.\n\t\t\tif(\n\t\t\t\t( light.type == RECT_AREA_LIGHT_TYPE && intersectsRectangle( light.position, normal, u, v, rayOrigin, rayDirection, dist ) ) ||\n\t\t\t\t( light.type == CIRC_AREA_LIGHT_TYPE && intersectsCircle( light.position, normal, u, v, rayOrigin, rayDirection, dist ) )\n\t\t\t) {\n\n\t\t\t\tfloat cosTheta = dot( rayDirection, normal );\n\t\t\t\tdidHit = true;\n\t\t\t\tlightRec.dist = dist;\n\t\t\t\tlightRec.pdf = ( dist * dist ) / ( light.area * cosTheta );\n\t\t\t\tlightRec.emission = light.color * light.intensity;\n\t\t\t\tlightRec.direction = rayDirection;\n\t\t\t\tlightRec.type = light.type;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn didHit;\n\n\t}\n\n\tLightRecord randomAreaLightSample( Light light, vec3 rayOrigin, vec2 ruv ) {\n\n\t\tvec3 randomPos;\n\t\tif( light.type == RECT_AREA_LIGHT_TYPE ) {\n\n\t\t\t// rectangular area light\n\t\t\trandomPos = light.position + light.u * ( ruv.x - 0.5 ) + light.v * ( ruv.y - 0.5 );\n\n\t\t} else if( light.type == CIRC_AREA_LIGHT_TYPE ) {\n\n\t\t\t// circular area light\n\t\t\tfloat r = 0.5 * sqrt( ruv.x );\n\t\t\tfloat theta = ruv.y * 2.0 * PI;\n\t\t\tfloat x = r * cos( theta );\n\t\t\tfloat y = r * sin( theta );\n\n\t\t\trandomPos = light.position + light.u * x + light.v * y;\n\n\t\t}\n\n\t\tvec3 toLight = randomPos - rayOrigin;\n\t\tfloat lightDistSq = dot( toLight, toLight );\n\t\tfloat dist = sqrt( lightDistSq );\n\t\tvec3 direction = toLight / dist;\n\t\tvec3 lightNormal = normalize( cross( light.u, light.v ) );\n\n\t\tLightRecord lightRec;\n\t\tlightRec.type = light.type;\n\t\tlightRec.emission = light.color * light.intensity;\n\t\tlightRec.dist = dist;\n\t\tlightRec.direction = direction;\n\n\t\t// TODO: the denominator is potentially zero\n\t\tlightRec.pdf = lightDistSq / ( light.area * dot( direction, lightNormal ) );\n\n\t\treturn lightRec;\n\n\t}\n\n\tLightRecord randomSpotLightSample( Light light, sampler2DArray iesProfiles, vec3 rayOrigin, vec2 ruv ) {\n\n\t\tfloat radius = light.radius * sqrt( ruv.x );\n\t\tfloat theta = ruv.y * 2.0 * PI;\n\t\tfloat x = radius * cos( theta );\n\t\tfloat y = radius * sin( theta );\n\n\t\tvec3 u = light.u;\n\t\tvec3 v = light.v;\n\t\tvec3 normal = normalize( cross( u, v ) );\n\n\t\tfloat angle = acos( light.coneCos );\n\t\tfloat angleTan = tan( angle );\n\t\tfloat startDistance = light.radius / max( angleTan, EPSILON );\n\n\t\tvec3 randomPos = light.position - normal * startDistance + u * x + v * y;\n\t\tvec3 toLight = randomPos - rayOrigin;\n\t\tfloat lightDistSq = dot( toLight, toLight );\n\t\tfloat dist = sqrt( lightDistSq );\n\n\t\tvec3 direction = toLight / max( dist, EPSILON );\n\t\tfloat cosTheta = dot( direction, normal );\n\n\t\tfloat spotAttenuation = light.iesProfile != - 1 ?\n\t\t\tgetPhotometricAttenuation( iesProfiles, light.iesProfile, direction, normal, u, v ) :\n\t\t\tgetSpotAttenuation( light.coneCos, light.penumbraCos, cosTheta );\n\n\t\tfloat distanceAttenuation = getDistanceAttenuation( dist, light.distance, light.decay );\n\t\tLightRecord lightRec;\n\t\tlightRec.type = light.type;\n\t\tlightRec.dist = dist;\n\t\tlightRec.direction = direction;\n\t\tlightRec.emission = light.color * light.intensity * distanceAttenuation * spotAttenuation;\n\t\tlightRec.pdf = 1.0;\n\n\t\treturn lightRec;\n\n\t}\n\n\tLightRecord randomLightSample( sampler2D lights, sampler2DArray iesProfiles, uint lightCount, vec3 rayOrigin, vec3 ruv ) {\n\n\t\tLightRecord result;\n\n\t\t// pick a random light\n\t\tuint l = uint( ruv.x * float( lightCount ) );\n\t\tLight light = readLightInfo( lights, l );\n\n\t\tif ( light.type == SPOT_LIGHT_TYPE ) {\n\n\t\t\tresult = randomSpotLightSample( light, iesProfiles, rayOrigin, ruv.yz );\n\n\t\t} else if ( light.type == POINT_LIGHT_TYPE ) {\n\n\t\t\tvec3 lightRay = light.u - rayOrigin;\n\t\t\tfloat lightDist = length( lightRay );\n\t\t\tfloat cutoffDistance = light.distance;\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDist, light.decay ), 0.01 );\n\t\t\tif ( cutoffDistance > 0.0 ) {\n\n\t\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDist / cutoffDistance ) ) );\n\n\t\t\t}\n\n\t\t\tLightRecord rec;\n\t\t\trec.direction = normalize( lightRay );\n\t\t\trec.dist = length( lightRay );\n\t\t\trec.pdf = 1.0;\n\t\t\trec.emission = light.color * light.intensity * distanceFalloff;\n\t\t\trec.type = light.type;\n\t\t\tresult = rec;\n\n\t\t} else if ( light.type == DIR_LIGHT_TYPE ) {\n\n\t\t\tLightRecord rec;\n\t\t\trec.dist = 1e10;\n\t\t\trec.direction = light.u;\n\t\t\trec.pdf = 1.0;\n\t\t\trec.emission = light.color * light.intensity;\n\t\t\trec.type = light.type;\n\n\t\t\tresult = rec;\n\n\t\t} else {\n\n\t\t\t// sample the light\n\t\t\tresult = randomAreaLightSample( light, rayOrigin, ruv.yz );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n`;\n","export const shapeSamplingGLSL = /* glsl */`\n\n\tvec3 sampleHemisphere( vec3 n, vec2 uv ) {\n\n\t\t// https://www.rorydriscoll.com/2009/01/07/better-sampling/\n\t\t// https://graphics.pixar.com/library/OrthonormalB/paper.pdf\n\t\tfloat sign = n.z == 0.0 ? 1.0 : sign( n.z );\n\t\tfloat a = - 1.0 / ( sign + n.z );\n\t\tfloat b = n.x * n.y * a;\n\t\tvec3 b1 = vec3( 1.0 + sign * n.x * n.x * a, sign * b, - sign * n.x );\n\t\tvec3 b2 = vec3( b, sign + n.y * n.y * a, - n.y );\n\n\t\tfloat r = sqrt( uv.x );\n\t\tfloat theta = 2.0 * PI * uv.y;\n\t\tfloat x = r * cos( theta );\n\t\tfloat y = r * sin( theta );\n\t\treturn x * b1 + y * b2 + sqrt( 1.0 - uv.x ) * n;\n\n\t}\n\n\tvec2 sampleTriangle( vec2 a, vec2 b, vec2 c, vec2 r ) {\n\n\t\t// get the edges of the triangle and the diagonal across the\n\t\t// center of the parallelogram\n\t\tvec2 e1 = a - b;\n\t\tvec2 e2 = c - b;\n\t\tvec2 diag = normalize( e1 + e2 );\n\n\t\t// pick the point in the parallelogram\n\t\tif ( r.x + r.y > 1.0 ) {\n\n\t\t\tr = vec2( 1.0 ) - r;\n\n\t\t}\n\n\t\treturn e1 * r.x + e2 * r.y;\n\n\t}\n\n\tvec2 sampleCircle( vec2 uv ) {\n\n\t\tfloat angle = 2.0 * PI * uv.x;\n\t\tfloat radius = sqrt( uv.y );\n\t\treturn vec2( cos( angle ), sin( angle ) ) * radius;\n\n\t}\n\n\tvec3 sampleSphere( vec2 uv ) {\n\n\t\tfloat u = ( uv.x - 0.5 ) * 2.0;\n\t\tfloat t = uv.y * PI * 2.0;\n\t\tfloat f = sqrt( 1.0 - u * u );\n\n\t\treturn vec3( f * cos( t ), f * sin( t ), u );\n\n\t}\n\n\tvec2 sampleRegularPolygon( int sides, vec3 uvw ) {\n\n\t\tsides = max( sides, 3 );\n\n\t\tvec3 r = uvw;\n\t\tfloat anglePerSegment = 2.0 * PI / float( sides );\n\t\tfloat segment = floor( float( sides ) * r.x );\n\n\t\tfloat angle1 = anglePerSegment * segment;\n\t\tfloat angle2 = angle1 + anglePerSegment;\n\t\tvec2 a = vec2( sin( angle1 ), cos( angle1 ) );\n\t\tvec2 b = vec2( 0.0, 0.0 );\n\t\tvec2 c = vec2( sin( angle2 ), cos( angle2 ) );\n\n\t\treturn sampleTriangle( a, b, c, r.yz );\n\n\t}\n\n\t// samples an aperture shape with the given number of sides. 0 means circle\n\tvec2 sampleAperture( int blades, vec3 uvw ) {\n\n\t\treturn blades == 0 ?\n\t\t\tsampleCircle( uvw.xy ) :\n\t\t\tsampleRegularPolygon( blades, uvw );\n\n\t}\n\n\n`;\n","export const intersectShapesGLSL = /* glsl */`\n\n\t// Finds the point where the ray intersects the plane defined by u and v and checks if this point\n\t// falls in the bounds of the rectangle on that same plane.\n\t// Plane intersection: https://lousodrome.net/blog/light/2020/07/03/intersection-of-a-ray-and-a-plane/\n\tbool intersectsRectangle( vec3 center, vec3 normal, vec3 u, vec3 v, vec3 rayOrigin, vec3 rayDirection, inout float dist ) {\n\n\t\tfloat t = dot( center - rayOrigin, normal ) / dot( rayDirection, normal );\n\n\t\tif ( t > EPSILON ) {\n\n\t\t\tvec3 p = rayOrigin + rayDirection * t;\n\t\t\tvec3 vi = p - center;\n\n\t\t\t// check if p falls inside the rectangle\n\t\t\tfloat a1 = dot( u, vi );\n\t\t\tif ( abs( a1 ) <= 0.5 ) {\n\n\t\t\t\tfloat a2 = dot( v, vi );\n\t\t\t\tif ( abs( a2 ) <= 0.5 ) {\n\n\t\t\t\t\tdist = t;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t// Finds the point where the ray intersects the plane defined by u and v and checks if this point\n\t// falls in the bounds of the circle on that same plane. See above URL for a description of the plane intersection algorithm.\n\tbool intersectsCircle( vec3 position, vec3 normal, vec3 u, vec3 v, vec3 rayOrigin, vec3 rayDirection, inout float dist ) {\n\n\t\tfloat t = dot( position - rayOrigin, normal ) / dot( rayDirection, normal );\n\n\t\tif ( t > EPSILON ) {\n\n\t\t\tvec3 hit = rayOrigin + rayDirection * t;\n\t\t\tvec3 vi = hit - position;\n\n\t\t\tfloat a1 = dot( u, vi );\n\t\t\tfloat a2 = dot( v, vi );\n\n\t\t\tif( length( vec2( a1, a2 ) ) <= 0.5 ) {\n\n\t\t\t\tdist = t;\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n`;\n","export const mathGLSL = /* glsl */`\n\n\t// Fast arccos approximation used to remove banding artifacts caused by numerical errors in acos.\n\t// This is a cubic Lagrange interpolating polynomial for x = [-1, -1/2, 0, 1/2, 1].\n\t// For more information see: https://github.com/gkjohnson/three-gpu-pathtracer/pull/171#issuecomment-1152275248\n\tfloat acosApprox( float x ) {\n\n\t\tx = clamp( x, -1.0, 1.0 );\n\t\treturn ( - 0.69813170079773212 * x * x - 0.87266462599716477 ) * x + 1.5707963267948966;\n\n\t}\n\n\t// An acos with input values bound to the range [-1, 1].\n\tfloat acosSafe( float x ) {\n\n\t\treturn acos( clamp( x, -1.0, 1.0 ) );\n\n\t}\n\n\tfloat saturateCos( float val ) {\n\n\t\treturn clamp( val, 0.001, 1.0 );\n\n\t}\n\n\tfloat square( float t ) {\n\n\t\treturn t * t;\n\n\t}\n\n\tvec2 square( vec2 t ) {\n\n\t\treturn t * t;\n\n\t}\n\n\tvec3 square( vec3 t ) {\n\n\t\treturn t * t;\n\n\t}\n\n\tvec4 square( vec4 t ) {\n\n\t\treturn t * t;\n\n\t}\n\n\tvec2 rotateVector( vec2 v, float t ) {\n\n\t\tfloat ac = cos( t );\n\t\tfloat as = sin( t );\n\t\treturn vec2(\n\t\t\tv.x * ac - v.y * as,\n\t\t\tv.x * as + v.y * ac\n\t\t);\n\n\t}\n\n\t// forms a basis with the normal vector as Z\n\tmat3 getBasisFromNormal( vec3 normal ) {\n\n\t\tvec3 other;\n\t\tif ( abs( normal.x ) > 0.5 ) {\n\n\t\t\tother = vec3( 0.0, 1.0, 0.0 );\n\n\t\t} else {\n\n\t\t\tother = vec3( 1.0, 0.0, 0.0 );\n\n\t\t}\n\n\t\tvec3 ortho = normalize( cross( normal, other ) );\n\t\tvec3 ortho2 = normalize( cross( normal, ortho ) );\n\t\treturn mat3( ortho2, ortho, normal );\n\n\t}\n\n`;\n","export const fresnelGLSL = /* glsl */`\n\n\tbool totalInternalReflection( float cosTheta, float eta ) {\n\n\t\tfloat sinTheta = sqrt( 1.0 - cosTheta * cosTheta );\n\t\treturn eta * sinTheta > 1.0;\n\n\t}\n\n\t// https://google.github.io/filament/Filament.md.html#materialsystem/diffusebrdf\n\tfloat schlickFresnel( float cosine, float f0 ) {\n\n\t\treturn f0 + ( 1.0 - f0 ) * pow( 1.0 - cosine, 5.0 );\n\n\t}\n\n\tvec3 schlickFresnel( float cosine, vec3 f0 ) {\n\n\t\treturn f0 + ( 1.0 - f0 ) * pow( 1.0 - cosine, 5.0 );\n\n\t}\n\n\tvec3 schlickFresnel( float cosine, vec3 f0, vec3 f90 ) {\n\n\t\treturn f0 + ( f90 - f0 ) * pow( 1.0 - cosine, 5.0 );\n\n\t}\n\n\tfloat dielectricFresnel( float cosThetaI, float eta ) {\n\n\t\t// https://schuttejoe.github.io/post/disneybsdf/\n\t\tfloat ni = eta;\n\t\tfloat nt = 1.0;\n\n\t\t// Check for total internal reflection\n\t\tfloat sinThetaISq = 1.0f - cosThetaI * cosThetaI;\n\t\tfloat sinThetaTSq = eta * eta * sinThetaISq;\n\t\tif( sinThetaTSq >= 1.0 ) {\n\n\t\t\treturn 1.0;\n\n\t\t}\n\n\t\tfloat sinThetaT = sqrt( sinThetaTSq );\n\n\t\tfloat cosThetaT = sqrt( max( 0.0, 1.0f - sinThetaT * sinThetaT ) );\n\t\tfloat rParallel = ( ( nt * cosThetaI ) - ( ni * cosThetaT ) ) / ( ( nt * cosThetaI ) + ( ni * cosThetaT ) );\n\t\tfloat rPerpendicular = ( ( ni * cosThetaI ) - ( nt * cosThetaT ) ) / ( ( ni * cosThetaI ) + ( nt * cosThetaT ) );\n\t\treturn ( rParallel * rParallel + rPerpendicular * rPerpendicular ) / 2.0;\n\n\t}\n\n\t// https://raytracing.github.io/books/RayTracingInOneWeekend.html#dielectrics/schlickapproximation\n\tfloat iorRatioToF0( float eta ) {\n\n\t\treturn pow( ( 1.0 - eta ) / ( 1.0 + eta ), 2.0 );\n\n\t}\n\n\tvec3 evaluateFresnel( float cosTheta, float eta, vec3 f0, vec3 f90 ) {\n\n\t\tif ( totalInternalReflection( cosTheta, eta ) ) {\n\n\t\t\treturn f90;\n\n\t\t}\n\n\t\treturn schlickFresnel( cosTheta, f0, f90 );\n\n\t}\n\n\tfloat evaluateFresnelWeight( float cosTheta, float eta, float f0 ) {\n\n\t\tif ( totalInternalReflection( cosTheta, eta ) ) {\n\n\t\t\treturn 1.0;\n\n\t\t}\n\n\t\treturn schlickFresnel( cosTheta, f0 );\n\n\t}\n\n\t/*\n\t// https://schuttejoe.github.io/post/disneybsdf/\n\tfloat disneyFresnel( vec3 wo, vec3 wi, vec3 wh, float f0, float eta, float metalness ) {\n\n\t\tfloat dotHV = dot( wo, wh );\n\t\tfloat dotHL = dot( wi, wh );\n\n\t\tfloat dielectricFresnel = dielectricFresnel( abs( dotHV ), eta );\n\t\tfloat metallicFresnel = schlickFresnel( dotHL, f0 );\n\n\t\treturn mix( dielectricFresnel, metallicFresnel, metalness );\n\n\t}\n\t*/\n`;\n","\nexport const arraySamplerTexelFetchGLSL = /*glsl */`\n\n\t// add texel fetch functions for texture arrays\n\tvec4 texelFetch1D( sampler2DArray tex, int layer, uint index ) {\n\n\t\tuint width = uint( textureSize( tex, 0 ).x );\n\t\tuvec2 uv;\n\t\tuv.x = index % width;\n\t\tuv.y = index / width;\n\n\t\treturn texelFetch( tex, ivec3( uv, layer ), 0 );\n\n\t}\n\n\tvec4 textureSampleBarycoord( sampler2DArray tex, int layer, vec3 barycoord, uvec3 faceIndices ) {\n\n\t\treturn\n\t\t\tbarycoord.x * texelFetch1D( tex, layer, faceIndices.x ) +\n\t\t\tbarycoord.y * texelFetch1D( tex, layer, faceIndices.y ) +\n\t\t\tbarycoord.z * texelFetch1D( tex, layer, faceIndices.z );\n\n\t}\n\n`;\n","export const pcgGLSL = /* glsl */`\n\n\t// https://www.shadertoy.com/view/wltcRS\n\tuvec4 WHITE_NOISE_SEED;\n\n\tvoid rng_initialize( vec2 p, int frame ) {\n\n\t\t// white noise seed\n\t\tWHITE_NOISE_SEED = uvec4( p, uint( frame ), uint( p.x ) + uint( p.y ) );\n\n\t}\n\n\t// https://www.pcg-random.org/\n\tvoid pcg4d( inout uvec4 v ) {\n\n\t\tv = v * 1664525u + 1013904223u;\n\t\tv.x += v.y * v.w;\n\t\tv.y += v.z * v.x;\n\t\tv.z += v.x * v.y;\n\t\tv.w += v.y * v.z;\n\t\tv = v ^ ( v >> 16u );\n\t\tv.x += v.y*v.w;\n\t\tv.y += v.z*v.x;\n\t\tv.z += v.x*v.y;\n\t\tv.w += v.y*v.z;\n\n\t}\n\n\t// returns [ 0, 1 ]\n\tfloat rand() {\n\n\t\tpcg4d( WHITE_NOISE_SEED );\n\t\treturn float( WHITE_NOISE_SEED.x ) / float( 0xffffffffu );\n\n\t}\n\n\tvec2 rand2() {\n\n\t\tpcg4d( WHITE_NOISE_SEED );\n\t\treturn vec2( WHITE_NOISE_SEED.xy ) / float(0xffffffffu);\n\n\t}\n\n\tvec3 rand3() {\n\n\t\tpcg4d( WHITE_NOISE_SEED );\n\t\treturn vec3( WHITE_NOISE_SEED.xyz ) / float( 0xffffffffu );\n\n\t}\n\n\tvec4 rand4() {\n\n\t\tpcg4d( WHITE_NOISE_SEED );\n\t\treturn vec4( WHITE_NOISE_SEED ) / float( 0xffffffffu );\n\n\t}\n`;\n","export const renderStructsGLSL = /* glsl */`\n\n\tstruct Ray {\n\n\t\tvec3 origin;\n\t\tvec3 direction;\n\n\t};\n\n\tstruct SurfaceHit {\n\n\t\tuvec4 faceIndices;\n\t\tvec3 barycoord;\n\t\tvec3 faceNormal;\n\t\tfloat side;\n\t\tfloat dist;\n\n\t};\n\n\tstruct RenderState {\n\n\t\tbool firstRay;\n\t\tbool transmissiveRay;\n\t\tbool isShadowRay;\n\t\tfloat accumulatedRoughness;\n\t\tint transmissiveTraversals;\n\t\tint traversals;\n\t\tuint depth;\n\t\tvec3 throughputColor;\n\t\tMaterial fogMaterial;\n\n\t};\n\n\tRenderState initRenderState() {\n\n\t\tRenderState result;\n\t\tresult.firstRay = true;\n\t\tresult.transmissiveRay = true;\n\t\tresult.isShadowRay = false;\n\t\tresult.accumulatedRoughness = 0.0;\n\t\tresult.transmissiveTraversals = 0;\n\t\tresult.traversals = 0;\n\t\tresult.throughputColor = vec3( 1.0 );\n\t\tresult.depth = 0u;\n\t\tresult.fogMaterial.fogVolume = false;\n\t\treturn result;\n\n\t}\n\n`;\n","export const cameraUtilsGLSL = /* glsl */`\n\n\tvec3 ndcToRayOrigin( vec2 coord ) {\n\n\t\tvec4 rayOrigin4 = cameraWorldMatrix * invProjectionMatrix * vec4( coord, - 1.0, 1.0 );\n\t\treturn rayOrigin4.xyz / rayOrigin4.w;\n\t}\n\n\tRay getCameraRay() {\n\n\t\tvec2 ssd = vec2( 1.0 ) / resolution;\n\n\t\t// Jitter the camera ray by finding a uv coordinate at a random sample\n\t\t// around this pixel's UV coordinate for AA\n\t\tvec2 ruv = sobol2( 0 );\n\t\tvec2 jitteredUv = vUv + vec2( tentFilter( ruv.x ) * ssd.x, tentFilter( ruv.y ) * ssd.y );\n\t\tRay ray;\n\n\t\t#if CAMERA_TYPE == 2\n\n\t\t\t// Equirectangular projection\n\t\t\tvec4 rayDirection4 = vec4( equirectUvToDirection( jitteredUv ), 0.0 );\n\t\t\tvec4 rayOrigin4 = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\trayDirection4 = cameraWorldMatrix * rayDirection4;\n\t\t\trayOrigin4 = cameraWorldMatrix * rayOrigin4;\n\n\t\t\tray.direction = normalize( rayDirection4.xyz );\n\t\t\tray.origin = rayOrigin4.xyz / rayOrigin4.w;\n\n\t\t#else\n\n\t\t\t// get [- 1, 1] normalized device coordinates\n\t\t\tvec2 ndc = 2.0 * jitteredUv - vec2( 1.0 );\n\t\t\tray.origin = ndcToRayOrigin( ndc );\n\n\t\t\t#if CAMERA_TYPE == 1\n\n\t\t\t\t// Orthographic projection\n\t\t\t\tray.direction = ( cameraWorldMatrix * vec4( 0.0, 0.0, - 1.0, 0.0 ) ).xyz;\n\t\t\t\tray.direction = normalize( ray.direction );\n\n\t\t\t#else\n\n\t\t\t\t// Perspective projection\n\t\t\t\tray.direction = normalize( mat3( cameraWorldMatrix ) * ( invProjectionMatrix * vec4( ndc, 0.0, 1.0 ) ).xyz );\n\n\t\t\t#endif\n\n\t\t#endif\n\n\t\t#if FEATURE_DOF\n\t\t{\n\n\t\t\t// depth of field\n\t\t\tvec3 focalPoint = ray.origin + normalize( ray.direction ) * physicalCamera.focusDistance;\n\n\t\t\t// get the aperture sample\n\t\t\t// if blades === 0 then we assume a circle\n\t\t\tvec3 shapeUVW= sobol3( 1 );\n\t\t\tint blades = physicalCamera.apertureBlades;\n\t\t\tfloat anamorphicRatio = physicalCamera.anamorphicRatio;\n\t\t\tvec2 apertureSample = blades == 0 ? sampleCircle( shapeUVW.xy ) : sampleRegularPolygon( blades, shapeUVW );\n\t\t\tapertureSample *= physicalCamera.bokehSize * 0.5 * 1e-3;\n\n\t\t\t// rotate the aperture shape\n\t\t\tapertureSample =\n\t\t\t\trotateVector( apertureSample, physicalCamera.apertureRotation ) *\n\t\t\t\tsaturate( vec2( anamorphicRatio, 1.0 / anamorphicRatio ) );\n\n\t\t\t// create the new ray\n\t\t\tray.origin += ( cameraWorldMatrix * vec4( apertureSample, 0.0, 0.0 ) ).xyz;\n\t\t\tray.direction = focalPoint - ray.origin;\n\n\t\t}\n\t\t#endif\n\n\t\tray.direction = normalize( ray.direction );\n\n\t\treturn ray;\n\n\t}\n\n`;\n","export const attenuateHitGLSL = /* glsl */`\n\n\t// step through multiple surface hits and accumulate color attenuation based on transmissive surfaces\n\t// returns true if a solid surface was hit\n\tbool attenuateHit(\n\t\tRenderState state,\n\t\tRay ray, float rayDist,\n\t\tout vec3 color\n\t) {\n\n\t\tint traversals = state.traversals;\n\t\tint transmissiveTraversals = state.transmissiveTraversals;\n\t\tbool isShadowRay = state.isShadowRay;\n\t\tMaterial fogMaterial = state.fogMaterial;\n\n\t\tvec3 startPoint = ray.origin;\n\n\t\t// hit results\n\t\tSurfaceHit surfaceHit;\n\n\t\tcolor = vec3( 1.0 );\n\n\t\t// TODO: we should be using sobol sampling here instead of rand but the sobol bounce and path indices need to be incremented\n\t\t// and then reset.\n\t\tfor ( int i = 0; i < traversals; i ++ ) {\n\n\t\t\tint hitType = traceScene( ray, fogMaterial, surfaceHit );\n\n\t\t\tif ( hitType == FOG_HIT ) {\n\n\t\t\t\treturn true;\n\n\t\t\t} else if ( hitType == SURFACE_HIT ) {\n\n\t\t\t\tfloat totalDist = distance( startPoint, ray.origin + ray.direction * surfaceHit.dist );\n\t\t\t\tif ( totalDist > rayDist ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\t// TODO: attenuate the contribution based on the PDF of the resulting ray including refraction values\n\t\t\t\t// Should be able to work using the material BSDF functions which will take into account specularity, etc.\n\t\t\t\t// TODO: should we account for emissive surfaces here?\n\n\t\t\t\tuint materialIndex = uTexelFetch1D( materialIndexAttribute, surfaceHit.faceIndices.x ).r;\n\t\t\t\tMaterial material = readMaterialInfo( materials, materialIndex );\n\n\t\t\t\t// adjust the ray to the new surface\n\t\t\t\tbool isEntering = surfaceHit.side == 1.0;\n\t\t\t\tray.origin = stepRayOrigin( ray.origin, ray.direction, - surfaceHit.faceNormal, surfaceHit.dist );\n\n\t\t\t\t#if FEATURE_FOG\n\n\t\t\t\tif ( material.fogVolume ) {\n\n\t\t\t\t\tfogMaterial = material;\n\t\t\t\t\tfogMaterial.fogVolume = surfaceHit.side == 1.0;\n\t\t\t\t\ti -= sign( transmissiveTraversals );\n\t\t\t\t\ttransmissiveTraversals --;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t\tif ( ! material.castShadow && isShadowRay ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvec2 uv = textureSampleBarycoord( attributesArray, ATTR_UV, surfaceHit.barycoord, surfaceHit.faceIndices.xyz ).xy;\n\t\t\t\tvec4 vertexColor = textureSampleBarycoord( attributesArray, ATTR_COLOR, surfaceHit.barycoord, surfaceHit.faceIndices.xyz );\n\n\t\t\t\t// albedo\n\t\t\t\tvec4 albedo = vec4( material.color, material.opacity );\n\t\t\t\tif ( material.map != - 1 ) {\n\n\t\t\t\t\tvec3 uvPrime = material.mapTransform * vec3( uv, 1 );\n\t\t\t\t\talbedo *= texture2D( textures, vec3( uvPrime.xy, material.map ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.vertexColors ) {\n\n\t\t\t\t\talbedo *= vertexColor;\n\n\t\t\t\t}\n\n\t\t\t\t// alphaMap\n\t\t\t\tif ( material.alphaMap != - 1 ) {\n\n\t\t\t\t\talbedo.a *= texture2D( textures, vec3( uv, material.alphaMap ) ).x;\n\n\t\t\t\t}\n\n\t\t\t\t// transmission\n\t\t\t\tfloat transmission = material.transmission;\n\t\t\t\tif ( material.transmissionMap != - 1 ) {\n\n\t\t\t\t\tvec3 uvPrime = material.transmissionMapTransform * vec3( uv, 1 );\n\t\t\t\t\ttransmission *= texture2D( textures, vec3( uvPrime.xy, material.transmissionMap ) ).r;\n\n\t\t\t\t}\n\n\t\t\t\t// metalness\n\t\t\t\tfloat metalness = material.metalness;\n\t\t\t\tif ( material.metalnessMap != - 1 ) {\n\n\t\t\t\t\tvec3 uvPrime = material.metalnessMapTransform * vec3( uv, 1 );\n\t\t\t\t\tmetalness *= texture2D( textures, vec3( uvPrime.xy, material.metalnessMap ) ).b;\n\n\t\t\t\t}\n\n\t\t\t\tfloat alphaTest = material.alphaTest;\n\t\t\t\tbool useAlphaTest = alphaTest != 0.0;\n\t\t\t\tfloat transmissionFactor = ( 1.0 - metalness ) * transmission;\n\t\t\t\tif (\n\t\t\t\t\ttransmissionFactor < rand() && ! (\n\t\t\t\t\t\t// material sidedness\n\t\t\t\t\t\tmaterial.side != 0.0 && surfaceHit.side == material.side\n\n\t\t\t\t\t\t// alpha test\n\t\t\t\t\t\t|| useAlphaTest && albedo.a < alphaTest\n\n\t\t\t\t\t\t// opacity\n\t\t\t\t\t\t|| material.transparent && ! useAlphaTest && albedo.a < rand()\n\t\t\t\t\t)\n\t\t\t\t) {\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\tif ( surfaceHit.side == 1.0 && isEntering ) {\n\n\t\t\t\t\t// only attenuate by surface color on the way in\n\t\t\t\t\tcolor *= mix( vec3( 1.0 ), albedo.rgb, transmissionFactor );\n\n\t\t\t\t} else if ( surfaceHit.side == - 1.0 ) {\n\n\t\t\t\t\t// attenuate by medium once we hit the opposite side of the model\n\t\t\t\t\tcolor *= transmissionAttenuation( surfaceHit.dist, material.attenuationColor, material.attenuationDistance );\n\n\t\t\t\t}\n\n\t\t\t\tbool isTransmissiveRay = dot( ray.direction, surfaceHit.faceNormal * surfaceHit.side ) < 0.0;\n\t\t\t\tif ( ( isTransmissiveRay || isEntering ) && transmissiveTraversals > 0 ) {\n\n\t\t\t\t\ti -= sign( transmissiveTraversals );\n\t\t\t\t\ttransmissiveTraversals --;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n`;\n","export const traceSceneGLSL = /* glsl */`\n\n\t#define NO_HIT 0\n\t#define SURFACE_HIT 1\n\t#define LIGHT_HIT 2\n\t#define FOG_HIT 3\n\n\t// Passing the global variable 'lights' into this function caused shader program errors.\n\t// So global variables like 'lights' and 'bvh' were moved out of the function parameters.\n\t// For more information, refer to: https://github.com/gkjohnson/three-gpu-pathtracer/pull/457\n\tint traceScene(\n\n\t\tRay ray, Material fogMaterial, inout SurfaceHit surfaceHit\n\n\t) {\n\n\t\tint result = NO_HIT;\n\t\tbool hit = bvhIntersectFirstHit( bvh, ray.origin, ray.direction, surfaceHit.faceIndices, surfaceHit.faceNormal, surfaceHit.barycoord, surfaceHit.side, surfaceHit.dist );\n\n\t\t#if FEATURE_FOG\n\n\t\tif ( fogMaterial.fogVolume ) {\n\n\t\t\t// offset the distance so we don't run into issues with particles on the same surface\n\t\t\t// as other objects\n\t\t\tfloat particleDist = intersectFogVolume( fogMaterial, sobol( 1 ) );\n\t\t\tif ( particleDist + RAY_OFFSET < surfaceHit.dist ) {\n\n\t\t\t\tsurfaceHit.side = 1.0;\n\t\t\t\tsurfaceHit.faceNormal = normalize( - ray.direction );\n\t\t\t\tsurfaceHit.dist = particleDist;\n\t\t\t\treturn FOG_HIT;\n\n\t\t\t}\n\n\t\t}\n\n\t\t#endif\n\n\t\tif ( hit ) {\n\n\t\t\tresult = SURFACE_HIT;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n`;\n","\nexport const getSurfaceRecordGLSL = /* glsl */`\n\n\t#define SKIP_SURFACE 0\n\t#define HIT_SURFACE 1\n\tint getSurfaceRecord(\n\t\tMaterial material, SurfaceHit surfaceHit, sampler2DArray attributesArray,\n\t\tfloat accumulatedRoughness,\n\t\tinout SurfaceRecord surf\n\t) {\n\n\t\tif ( material.fogVolume ) {\n\n\t\t\tvec3 normal = vec3( 0, 0, 1 );\n\n\t\t\tSurfaceRecord fogSurface;\n\t\t\tfogSurface.volumeParticle = true;\n\t\t\tfogSurface.color = material.color;\n\t\t\tfogSurface.emission = material.emissiveIntensity * material.emissive;\n\t\t\tfogSurface.normal = normal;\n\t\t\tfogSurface.faceNormal = normal;\n\t\t\tfogSurface.clearcoatNormal = normal;\n\n\t\t\tsurf = fogSurface;\n\t\t\treturn HIT_SURFACE;\n\n\t\t}\n\n\t\t// uv coord for textures\n\t\tvec2 uv = textureSampleBarycoord( attributesArray, ATTR_UV, surfaceHit.barycoord, surfaceHit.faceIndices.xyz ).xy;\n\t\tvec4 vertexColor = textureSampleBarycoord( attributesArray, ATTR_COLOR, surfaceHit.barycoord, surfaceHit.faceIndices.xyz );\n\n\t\t// albedo\n\t\tvec4 albedo = vec4( material.color, material.opacity );\n\t\tif ( material.map != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.mapTransform * vec3( uv, 1 );\n\t\t\talbedo *= texture2D( textures, vec3( uvPrime.xy, material.map ) );\n\t\t}\n\n\t\tif ( material.vertexColors ) {\n\n\t\t\talbedo *= vertexColor;\n\n\t\t}\n\n\t\t// alphaMap\n\t\tif ( material.alphaMap != - 1 ) {\n\n\t\t\talbedo.a *= texture2D( textures, vec3( uv, material.alphaMap ) ).x;\n\n\t\t}\n\n\t\t// possibly skip this sample if it's transparent, alpha test is enabled, or we hit the wrong material side\n\t\t// and it's single sided.\n\t\t// - alpha test is disabled when it === 0\n\t\t// - the material sidedness test is complicated because we want light to pass through the back side but still\n\t\t// be able to see the front side. This boolean checks if the side we hit is the front side on the first ray\n\t\t// and we're rendering the other then we skip it. Do the opposite on subsequent bounces to get incoming light.\n\t\tfloat alphaTest = material.alphaTest;\n\t\tbool useAlphaTest = alphaTest != 0.0;\n\t\tif (\n\t\t\t// material sidedness\n\t\t\tmaterial.side != 0.0 && surfaceHit.side != material.side\n\n\t\t\t// alpha test\n\t\t\t|| useAlphaTest && albedo.a < alphaTest\n\n\t\t\t// opacity\n\t\t\t|| material.transparent && ! useAlphaTest && albedo.a < sobol( 3 )\n\t\t) {\n\n\t\t\treturn SKIP_SURFACE;\n\n\t\t}\n\n\t\t// fetch the interpolated smooth normal\n\t\tvec3 normal = normalize( textureSampleBarycoord(\n\t\t\tattributesArray,\n\t\t\tATTR_NORMAL,\n\t\t\tsurfaceHit.barycoord,\n\t\t\tsurfaceHit.faceIndices.xyz\n\t\t).xyz );\n\n\t\t// roughness\n\t\tfloat roughness = material.roughness;\n\t\tif ( material.roughnessMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.roughnessMapTransform * vec3( uv, 1 );\n\t\t\troughness *= texture2D( textures, vec3( uvPrime.xy, material.roughnessMap ) ).g;\n\n\t\t}\n\n\t\t// metalness\n\t\tfloat metalness = material.metalness;\n\t\tif ( material.metalnessMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.metalnessMapTransform * vec3( uv, 1 );\n\t\t\tmetalness *= texture2D( textures, vec3( uvPrime.xy, material.metalnessMap ) ).b;\n\n\t\t}\n\n\t\t// emission\n\t\tvec3 emission = material.emissiveIntensity * material.emissive;\n\t\tif ( material.emissiveMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.emissiveMapTransform * vec3( uv, 1 );\n\t\t\temission *= texture2D( textures, vec3( uvPrime.xy, material.emissiveMap ) ).xyz;\n\n\t\t}\n\n\t\t// transmission\n\t\tfloat transmission = material.transmission;\n\t\tif ( material.transmissionMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.transmissionMapTransform * vec3( uv, 1 );\n\t\t\ttransmission *= texture2D( textures, vec3( uvPrime.xy, material.transmissionMap ) ).r;\n\n\t\t}\n\n\t\t// normal\n\t\tif ( material.flatShading ) {\n\n\t\t\t// if we're rendering a flat shaded object then use the face normals - the face normal\n\t\t\t// is provided based on the side the ray hits the mesh so flip it to align with the\n\t\t\t// interpolated vertex normals.\n\t\t\tnormal = surfaceHit.faceNormal * surfaceHit.side;\n\n\t\t}\n\n\t\tvec3 baseNormal = normal;\n\t\tif ( material.normalMap != - 1 ) {\n\n\t\t\tvec4 tangentSample = textureSampleBarycoord(\n\t\t\t\tattributesArray,\n\t\t\t\tATTR_TANGENT,\n\t\t\t\tsurfaceHit.barycoord,\n\t\t\t\tsurfaceHit.faceIndices.xyz\n\t\t\t);\n\n\t\t\t// some provided tangents can be malformed (0, 0, 0) causing the normal to be degenerate\n\t\t\t// resulting in NaNs and slow path tracing.\n\t\t\tif ( length( tangentSample.xyz ) > 0.0 ) {\n\n\t\t\t\tvec3 tangent = normalize( tangentSample.xyz );\n\t\t\t\tvec3 bitangent = normalize( cross( normal, tangent ) * tangentSample.w );\n\t\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\n\t\t\t\tvec3 uvPrime = material.normalMapTransform * vec3( uv, 1 );\n\t\t\t\tvec3 texNormal = texture2D( textures, vec3( uvPrime.xy, material.normalMap ) ).xyz * 2.0 - 1.0;\n\t\t\t\ttexNormal.xy *= material.normalScale;\n\t\t\t\tnormal = vTBN * texNormal;\n\n\t\t\t}\n\n\t\t}\n\n\t\tnormal *= surfaceHit.side;\n\n\t\t// clearcoat\n\t\tfloat clearcoat = material.clearcoat;\n\t\tif ( material.clearcoatMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.clearcoatMapTransform * vec3( uv, 1 );\n\t\t\tclearcoat *= texture2D( textures, vec3( uvPrime.xy, material.clearcoatMap ) ).r;\n\n\t\t}\n\n\t\t// clearcoatRoughness\n\t\tfloat clearcoatRoughness = material.clearcoatRoughness;\n\t\tif ( material.clearcoatRoughnessMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.clearcoatRoughnessMapTransform * vec3( uv, 1 );\n\t\t\tclearcoatRoughness *= texture2D( textures, vec3( uvPrime.xy, material.clearcoatRoughnessMap ) ).g;\n\n\t\t}\n\n\t\t// clearcoatNormal\n\t\tvec3 clearcoatNormal = baseNormal;\n\t\tif ( material.clearcoatNormalMap != - 1 ) {\n\n\t\t\tvec4 tangentSample = textureSampleBarycoord(\n\t\t\t\tattributesArray,\n\t\t\t\tATTR_TANGENT,\n\t\t\t\tsurfaceHit.barycoord,\n\t\t\t\tsurfaceHit.faceIndices.xyz\n\t\t\t);\n\n\t\t\t// some provided tangents can be malformed (0, 0, 0) causing the normal to be degenerate\n\t\t\t// resulting in NaNs and slow path tracing.\n\t\t\tif ( length( tangentSample.xyz ) > 0.0 ) {\n\n\t\t\t\tvec3 tangent = normalize( tangentSample.xyz );\n\t\t\t\tvec3 bitangent = normalize( cross( clearcoatNormal, tangent ) * tangentSample.w );\n\t\t\t\tmat3 vTBN = mat3( tangent, bitangent, clearcoatNormal );\n\n\t\t\t\tvec3 uvPrime = material.clearcoatNormalMapTransform * vec3( uv, 1 );\n\t\t\t\tvec3 texNormal = texture2D( textures, vec3( uvPrime.xy, material.clearcoatNormalMap ) ).xyz * 2.0 - 1.0;\n\t\t\t\ttexNormal.xy *= material.clearcoatNormalScale;\n\t\t\t\tclearcoatNormal = vTBN * texNormal;\n\n\t\t\t}\n\n\t\t}\n\n\t\tclearcoatNormal *= surfaceHit.side;\n\n\t\t// sheenColor\n\t\tvec3 sheenColor = material.sheenColor;\n\t\tif ( material.sheenColorMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.sheenColorMapTransform * vec3( uv, 1 );\n\t\t\tsheenColor *= texture2D( textures, vec3( uvPrime.xy, material.sheenColorMap ) ).rgb;\n\n\t\t}\n\n\t\t// sheenRoughness\n\t\tfloat sheenRoughness = material.sheenRoughness;\n\t\tif ( material.sheenRoughnessMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.sheenRoughnessMapTransform * vec3( uv, 1 );\n\t\t\tsheenRoughness *= texture2D( textures, vec3( uvPrime.xy, material.sheenRoughnessMap ) ).a;\n\n\t\t}\n\n\t\t// iridescence\n\t\tfloat iridescence = material.iridescence;\n\t\tif ( material.iridescenceMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.iridescenceMapTransform * vec3( uv, 1 );\n\t\t\tiridescence *= texture2D( textures, vec3( uvPrime.xy, material.iridescenceMap ) ).r;\n\n\t\t}\n\n\t\t// iridescence thickness\n\t\tfloat iridescenceThickness = material.iridescenceThicknessMaximum;\n\t\tif ( material.iridescenceThicknessMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.iridescenceThicknessMapTransform * vec3( uv, 1 );\n\t\t\tfloat iridescenceThicknessSampled = texture2D( textures, vec3( uvPrime.xy, material.iridescenceThicknessMap ) ).g;\n\t\t\tiridescenceThickness = mix( material.iridescenceThicknessMinimum, material.iridescenceThicknessMaximum, iridescenceThicknessSampled );\n\n\t\t}\n\n\t\tiridescence = iridescenceThickness == 0.0 ? 0.0 : iridescence;\n\n\t\t// specular color\n\t\tvec3 specularColor = material.specularColor;\n\t\tif ( material.specularColorMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.specularColorMapTransform * vec3( uv, 1 );\n\t\t\tspecularColor *= texture2D( textures, vec3( uvPrime.xy, material.specularColorMap ) ).rgb;\n\n\t\t}\n\n\t\t// specular intensity\n\t\tfloat specularIntensity = material.specularIntensity;\n\t\tif ( material.specularIntensityMap != - 1 ) {\n\n\t\t\tvec3 uvPrime = material.specularIntensityMapTransform * vec3( uv, 1 );\n\t\t\tspecularIntensity *= texture2D( textures, vec3( uvPrime.xy, material.specularIntensityMap ) ).a;\n\n\t\t}\n\n\t\tsurf.volumeParticle = false;\n\n\t\tsurf.faceNormal = surfaceHit.faceNormal;\n\t\tsurf.normal = normal;\n\n\t\tsurf.metalness = metalness;\n\t\tsurf.color = albedo.rgb;\n\t\tsurf.emission = emission;\n\n\t\tsurf.ior = material.ior;\n\t\tsurf.transmission = transmission;\n\t\tsurf.thinFilm = material.thinFilm;\n\t\tsurf.attenuationColor = material.attenuationColor;\n\t\tsurf.attenuationDistance = material.attenuationDistance;\n\n\t\tsurf.clearcoatNormal = clearcoatNormal;\n\t\tsurf.clearcoat = clearcoat;\n\n\t\tsurf.sheen = material.sheen;\n\t\tsurf.sheenColor = sheenColor;\n\n\t\tsurf.iridescence = iridescence;\n\t\tsurf.iridescenceIor = material.iridescenceIor;\n\t\tsurf.iridescenceThickness = iridescenceThickness;\n\n\t\tsurf.specularColor = specularColor;\n\t\tsurf.specularIntensity = specularIntensity;\n\n\t\t// apply perceptual roughness factor from gltf. sheen perceptual roughness is\n\t\t// applied by its brdf function\n\t\t// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#microfacet-surfaces\n\t\tsurf.roughness = roughness * roughness;\n\t\tsurf.clearcoatRoughness = clearcoatRoughness * clearcoatRoughness;\n\t\tsurf.sheenRoughness = sheenRoughness;\n\n\t\t// frontFace is used to determine transmissive properties and PDF. If no transmission is used\n\t\t// then we can just always assume this is a front face.\n\t\tsurf.frontFace = surfaceHit.side == 1.0 || transmission == 0.0;\n\t\tsurf.eta = material.thinFilm || surf.frontFace ? 1.0 / material.ior : material.ior;\n\t\tsurf.f0 = iorRatioToF0( surf.eta );\n\n\t\t// Compute the filtered roughness value to use during specular reflection computations.\n\t\t// The accumulated roughness value is scaled by a user setting and a \"magic value\" of 5.0.\n\t\t// If we're exiting something transmissive then scale the factor down significantly so we can retain\n\t\t// sharp internal reflections\n\t\tsurf.filteredRoughness = applyFilteredGlossy( surf.roughness, accumulatedRoughness );\n\t\tsurf.filteredClearcoatRoughness = applyFilteredGlossy( surf.clearcoatRoughness, accumulatedRoughness );\n\n\t\t// get the normal frames\n\t\tsurf.normalBasis = getBasisFromNormal( surf.normal );\n\t\tsurf.normalInvBasis = inverse( surf.normalBasis );\n\n\t\tsurf.clearcoatBasis = getBasisFromNormal( surf.clearcoatNormal );\n\t\tsurf.clearcoatInvBasis = inverse( surf.clearcoatBasis );\n\n\t\treturn HIT_SURFACE;\n\n\t}\n`;\n","export const directLightContributionGLSL = /*glsl*/`\n\n\tvec3 directLightContribution( vec3 worldWo, SurfaceRecord surf, RenderState state, vec3 rayOrigin ) {\n\n\t\tvec3 result = vec3( 0.0 );\n\n\t\t// uniformly pick a light or environment map\n\t\tif( lightsDenom != 0.0 && sobol( 5 ) < float( lights.count ) / lightsDenom ) {\n\n\t\t\t// sample a light or environment\n\t\t\tLightRecord lightRec = randomLightSample( lights.tex, iesProfiles, lights.count, rayOrigin, sobol3( 6 ) );\n\n\t\t\tbool isSampleBelowSurface = ! surf.volumeParticle && dot( surf.faceNormal, lightRec.direction ) < 0.0;\n\t\t\tif ( isSampleBelowSurface ) {\n\n\t\t\t\tlightRec.pdf = 0.0;\n\n\t\t\t}\n\n\t\t\t// check if a ray could even reach the light area\n\t\t\tRay lightRay;\n\t\t\tlightRay.origin = rayOrigin;\n\t\t\tlightRay.direction = lightRec.direction;\n\t\t\tvec3 attenuatedColor;\n\t\t\tif (\n\t\t\t\tlightRec.pdf > 0.0 &&\n\t\t\t\tisDirectionValid( lightRec.direction, surf.normal, surf.faceNormal ) &&\n\t\t\t\t! attenuateHit( state, lightRay, lightRec.dist, attenuatedColor )\n\t\t\t) {\n\n\t\t\t\t// get the material pdf\n\t\t\t\tvec3 sampleColor;\n\t\t\t\tfloat lightMaterialPdf = bsdfResult( worldWo, lightRec.direction, surf, sampleColor );\n\t\t\t\tbool isValidSampleColor = all( greaterThanEqual( sampleColor, vec3( 0.0 ) ) );\n\t\t\t\tif ( lightMaterialPdf > 0.0 && isValidSampleColor ) {\n\n\t\t\t\t\t// weight the direct light contribution\n\t\t\t\t\tfloat lightPdf = lightRec.pdf / lightsDenom;\n\t\t\t\t\tfloat misWeight = lightRec.type == SPOT_LIGHT_TYPE || lightRec.type == DIR_LIGHT_TYPE || lightRec.type == POINT_LIGHT_TYPE ? 1.0 : misHeuristic( lightPdf, lightMaterialPdf );\n\t\t\t\t\tresult = attenuatedColor * lightRec.emission * state.throughputColor * sampleColor * misWeight / lightPdf;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// find a sample in the environment map to include in the contribution\n\t\t\tvec3 envColor, envDirection;\n\t\t\tfloat envPdf = sampleEquirectProbability( sobol2( 7 ), envColor, envDirection );\n\t\t\tenvDirection = invEnvRotation3x3 * envDirection;\n\n\t\t\t// this env sampling is not set up for transmissive sampling and yields overly bright\n\t\t\t// results so we ignore the sample in this case.\n\t\t\t// TODO: this should be improved but how? The env samples could traverse a few layers?\n\t\t\tbool isSampleBelowSurface = ! surf.volumeParticle && dot( surf.faceNormal, envDirection ) < 0.0;\n\t\t\tif ( isSampleBelowSurface ) {\n\n\t\t\t\tenvPdf = 0.0;\n\n\t\t\t}\n\n\t\t\t// check if a ray could even reach the surface\n\t\t\tRay envRay;\n\t\t\tenvRay.origin = rayOrigin;\n\t\t\tenvRay.direction = envDirection;\n\t\t\tvec3 attenuatedColor;\n\t\t\tif (\n\t\t\t\tenvPdf > 0.0 &&\n\t\t\t\tisDirectionValid( envDirection, surf.normal, surf.faceNormal ) &&\n\t\t\t\t! attenuateHit( state, envRay, INFINITY, attenuatedColor )\n\t\t\t) {\n\n\t\t\t\t// get the material pdf\n\t\t\t\tvec3 sampleColor;\n\t\t\t\tfloat envMaterialPdf = bsdfResult( worldWo, envDirection, surf, sampleColor );\n\t\t\t\tbool isValidSampleColor = all( greaterThanEqual( sampleColor, vec3( 0.0 ) ) );\n\t\t\t\tif ( envMaterialPdf > 0.0 && isValidSampleColor ) {\n\n\t\t\t\t\t// weight the direct light contribution\n\t\t\t\t\tenvPdf /= lightsDenom;\n\t\t\t\t\tfloat misWeight = misHeuristic( envPdf, envMaterialPdf );\n\t\t\t\t\tresult = attenuatedColor * environmentIntensity * envColor * state.throughputColor * sampleColor * misWeight / envPdf;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Function changed to have a single return statement to potentially help with crashes on Mac OS.\n\t\t// See issue #470\n\t\treturn result;\n\n\t}\n\n`;\n","import { Matrix4, Vector2 } from 'three';\nimport { MaterialBase } from '../MaterialBase.js';\nimport {\n\tMeshBVHUniformStruct, UIntVertexAttributeTexture,\n\tBVHShaderGLSL,\n} from 'three-mesh-bvh';\n\n// uniforms\nimport { PhysicalCameraUniform } from '../../uniforms/PhysicalCameraUniform.js';\nimport { EquirectHdrInfoUniform } from '../../uniforms/EquirectHdrInfoUniform.js';\nimport { LightsInfoUniformStruct } from '../../uniforms/LightsInfoUniformStruct.js';\nimport { IESProfilesTexture } from '../../uniforms/IESProfilesTexture.js';\nimport { AttributesTextureArray } from '../../uniforms/AttributesTextureArray.js';\nimport { MaterialsTexture } from '../../uniforms/MaterialsTexture.js';\nimport { RenderTarget2DArray } from '../../uniforms/RenderTarget2DArray.js';\n\n// glsl\nimport { cameraStructGLSL } from '../../shader/structs/cameraStruct.glsl.js';\nimport { equirectStructGLSL } from '../../shader/structs/equirectStruct.glsl.js';\nimport { lightsStructGLSL } from '../../shader/structs/lightsStruct.glsl.js';\nimport { materialStructGLSL } from '../../shader/structs/materialStruct.glsl.js';\nimport { fogMaterialBvhGLSL } from '../../shader/structs/fogMaterialBvh.glsl.js';\n\n// material sampling\nimport { bsdfSamplingGLSL } from '../../shader/bsdf/bsdfSampling.glsl.js';\nimport { fogGLSL } from '../../shader/bsdf/fog.glsl.js';\n\n// sampling\nimport { equirectSamplingGLSL } from '../../shader/sampling/equirectSampling.glsl.js';\nimport { lightSamplingGLSL } from '../../shader/sampling/lightSampling.glsl.js';\nimport { shapeSamplingGLSL } from '../../shader/sampling/shapeSampling.glsl.js';\n\n// common glsl\nimport { intersectShapesGLSL } from '../../shader/common/intersectShapes.glsl.js';\nimport { mathGLSL } from '../../shader/common/math.glsl.js';\nimport { utilsGLSL } from '../../shader/common/utils.glsl.js';\nimport { fresnelGLSL } from '../../shader/common/fresnel.glsl.js';\nimport { arraySamplerTexelFetchGLSL } from '../../shader/common/arraySamplerTexelFetch.glsl.js';\n\n// random glsl\nimport { pcgGLSL } from '../../shader/rand/pcg.glsl.js';\nimport { sobolCommonGLSL, sobolSamplingGLSL } from '../../shader/rand/sobol.glsl.js';\n\n// path tracer utils\nimport { renderStructsGLSL } from './glsl/renderStructs.glsl.js';\nimport { cameraUtilsGLSL } from './glsl/cameraUtils.glsl.js';\nimport { attenuateHitGLSL } from './glsl/attenuateHit.glsl.js';\nimport { traceSceneGLSL } from './glsl/traceScene.glsl.js';\nimport { getSurfaceRecordGLSL } from './glsl/getSurfaceRecord.glsl.js';\nimport { directLightContributionGLSL } from './glsl/directLightContribution.glsl.js';\n\nexport class PhysicalPathTracingMaterial extends MaterialBase {\n\n\tonBeforeRender() {\n\n\t\tthis.setDefine( 'FEATURE_DOF', this.physicalCamera.bokehSize === 0 ? 0 : 1 );\n\t\tthis.setDefine( 'FEATURE_BACKGROUND_MAP', this.backgroundMap ? 1 : 0 );\n\t\tthis.setDefine( 'FEATURE_FOG', this.materials.features.isUsed( 'FOG' ) ? 1 : 0 );\n\n\t}\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttransparent: true,\n\t\t\tdepthWrite: false,\n\n\t\t\tdefines: {\n\t\t\t\tFEATURE_MIS: 1,\n\t\t\t\tFEATURE_RUSSIAN_ROULETTE: 1,\n\t\t\t\tFEATURE_DOF: 1,\n\t\t\t\tFEATURE_BACKGROUND_MAP: 0,\n\t\t\t\tFEATURE_FOG: 1,\n\t\t\t\tFEATURE_SOBOL: 0,\n\t\t\t\t// 0 = Perspective\n\t\t\t\t// 1 = Orthographic\n\t\t\t\t// 2 = Equirectangular\n\t\t\t\tCAMERA_TYPE: 0,\n\n\t\t\t\tDEBUG_MODE: 0,\n\n\t\t\t\tATTR_NORMAL: 0,\n\t\t\t\tATTR_TANGENT: 1,\n\t\t\t\tATTR_UV: 2,\n\t\t\t\tATTR_COLOR: 3,\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\tresolution: { value: new Vector2() },\n\n\t\t\t\tbounces: { value: 10 },\n\t\t\t\ttransmissiveBounces: { value: 10 },\n\t\t\t\tphysicalCamera: { value: new PhysicalCameraUniform() },\n\n\t\t\t\tbvh: { value: new MeshBVHUniformStruct() },\n\t\t\t\tattributesArray: { value: new AttributesTextureArray() },\n\t\t\t\tmaterialIndexAttribute: { value: new UIntVertexAttributeTexture() },\n\t\t\t\tmaterials: { value: new MaterialsTexture() },\n\t\t\t\ttextures: { value: new RenderTarget2DArray().texture },\n\t\t\t\tlights: { value: new LightsInfoUniformStruct() },\n\t\t\t\tiesProfiles: { value: new IESProfilesTexture().texture },\n\t\t\t\tcameraWorldMatrix: { value: new Matrix4() },\n\t\t\t\tinvProjectionMatrix: { value: new Matrix4() },\n\t\t\t\tbackgroundBlur: { value: 0.0 },\n\t\t\t\tenvironmentIntensity: { value: 1.0 },\n\t\t\t\tenvironmentRotation: { value: new Matrix4() },\n\t\t\t\tenvMapInfo: { value: new EquirectHdrInfoUniform() },\n\t\t\t\tbackgroundMap: { value: null },\n\n\t\t\t\tseed: { value: 0 },\n\t\t\t\topacity: { value: 1 },\n\t\t\t\tfilterGlossyFactor: { value: 0.0 },\n\n\t\t\t\tbackgroundAlpha: { value: 1.0 },\n\t\t\t\tsobolTexture: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec4 mvPosition = vec4( position, 1.0 );\n\t\t\t\t\tmvPosition = modelViewMatrix * mvPosition;\n\t\t\t\t\tgl_Position = projectionMatrix * mvPosition;\n\n\t\t\t\t\tvUv = uv;\n\n\t\t\t\t}\n\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\t\t\t\t#define RAY_OFFSET 1e-4\n\t\t\t\t#define INFINITY 1e20\n\n\t\t\t\tprecision highp isampler2D;\n\t\t\t\tprecision highp usampler2D;\n\t\t\t\tprecision highp sampler2DArray;\n\t\t\t\tvec4 envMapTexelToLinear( vec4 a ) { return a; }\n\t\t\t\t#include <common>\n\n\t\t\t\t// bvh intersection\n\t\t\t\t${ BVHShaderGLSL.common_functions }\n\t\t\t\t${ BVHShaderGLSL.bvh_struct_definitions }\n\t\t\t\t${ BVHShaderGLSL.bvh_ray_functions }\n\n\t\t\t\t// uniform structs\n\t\t\t\t${ cameraStructGLSL }\n\t\t\t\t${ lightsStructGLSL }\n\t\t\t\t${ equirectStructGLSL }\n\t\t\t\t${ materialStructGLSL }\n\n\t\t\t\t// random\n\t\t\t\t${ pcgGLSL }\n\t\t\t\t#if FEATURE_SOBOL\n\n\t\t\t\t\t${ sobolCommonGLSL }\n\t\t\t\t\t${ sobolSamplingGLSL }\n\n\t\t\t\t#else\n\n\t\t\t\t\t// Using the sobol functions seems to break the the compiler on MacOS\n\t\t\t\t\t// - specifically the \"sobolReverseBits\" function.\n\t\t\t\t\tuint sobolPixelIndex = 0u;\n\t\t\t\t\tuint sobolPathIndex = 0u;\n\t\t\t\t\tuint sobolBounceIndex = 0u;\n\t\t\t\t\tfloat sobol( int v ) { return rand(); }\n\t\t\t\t\tvec2 sobol2( int v ) { return rand2(); }\n\t\t\t\t\tvec3 sobol3( int v ) { return rand3(); }\n\t\t\t\t\tvec4 sobol4( int v ) { return rand4(); }\n\n\t\t\t\t#endif\n\n\t\t\t\t// common\n\t\t\t\t${ arraySamplerTexelFetchGLSL }\n\t\t\t\t${ fresnelGLSL }\n\t\t\t\t${ utilsGLSL }\n\t\t\t\t${ mathGLSL }\n\t\t\t\t${ intersectShapesGLSL }\n\n\t\t\t\t// environment\n\t\t\t\tuniform EquirectHdrInfo envMapInfo;\n\t\t\t\tuniform mat4 environmentRotation;\n\t\t\t\tuniform float environmentIntensity;\n\n\t\t\t\t// lighting\n\t\t\t\tuniform sampler2DArray iesProfiles;\n\t\t\t\tuniform LightsInfo lights;\n\n\t\t\t\t// background\n\t\t\t\tuniform float backgroundBlur;\n\t\t\t\tuniform float backgroundAlpha;\n\t\t\t\t#if FEATURE_BACKGROUND_MAP\n\n\t\t\t\tuniform sampler2D backgroundMap;\n\n\t\t\t\t#endif\n\n\t\t\t\t// camera\n\t\t\t\tuniform mat4 cameraWorldMatrix;\n\t\t\t\tuniform mat4 invProjectionMatrix;\n\t\t\t\t#if FEATURE_DOF\n\n\t\t\t\tuniform PhysicalCamera physicalCamera;\n\n\t\t\t\t#endif\n\n\t\t\t\t// geometry\n\t\t\t\tuniform sampler2DArray attributesArray;\n\t\t\t\tuniform usampler2D materialIndexAttribute;\n\t\t\t\tuniform sampler2D materials;\n\t\t\t\tuniform sampler2DArray textures;\n\t\t\t\tuniform BVH bvh;\n\n\t\t\t\t// path tracer\n\t\t\t\tuniform int bounces;\n\t\t\t\tuniform int transmissiveBounces;\n\t\t\t\tuniform float filterGlossyFactor;\n\t\t\t\tuniform int seed;\n\n\t\t\t\t// image\n\t\t\t\tuniform vec2 resolution;\n\t\t\t\tuniform float opacity;\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t// globals\n\t\t\t\tmat3 envRotation3x3;\n\t\t\t\tmat3 invEnvRotation3x3;\n\t\t\t\tfloat lightsDenom;\n\n\t\t\t\t// sampling\n\t\t\t\t${ fogMaterialBvhGLSL }\n\t\t\t\t${ shapeSamplingGLSL }\n\t\t\t\t${ bsdfSamplingGLSL }\n\t\t\t\t${ equirectSamplingGLSL }\n\t\t\t\t${ lightSamplingGLSL }\n\t\t\t\t${ fogGLSL }\n\n\t\t\t\tfloat applyFilteredGlossy( float roughness, float accumulatedRoughness ) {\n\n\t\t\t\t\treturn clamp(\n\t\t\t\t\t\tmax(\n\t\t\t\t\t\t\troughness,\n\t\t\t\t\t\t\taccumulatedRoughness * filterGlossyFactor * 5.0 ),\n\t\t\t\t\t\t0.0,\n\t\t\t\t\t\t1.0\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tvec3 sampleBackground( vec3 direction, vec2 uv ) {\n\n\t\t\t\t\tvec3 sampleDir = normalize( direction + sampleHemisphere( direction, uv ) * 0.5 * backgroundBlur );\n\n\t\t\t\t\t#if FEATURE_BACKGROUND_MAP\n\n\t\t\t\t\treturn sampleEquirectColor( backgroundMap, sampleDir );\n\n\t\t\t\t\t#else\n\n\t\t\t\t\treturn environmentIntensity * sampleEquirectColor( envMapInfo.map, sampleDir );\n\n\t\t\t\t\t#endif\n\n\t\t\t\t}\n\n\t\t\t\t${ renderStructsGLSL }\n\t\t\t\t${ cameraUtilsGLSL }\n\t\t\t\t${ traceSceneGLSL }\n\t\t\t\t${ attenuateHitGLSL }\n\t\t\t\t${ directLightContributionGLSL }\n\t\t\t\t${ getSurfaceRecordGLSL }\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t// init\n\t\t\t\t\trng_initialize( gl_FragCoord.xy, seed );\n\t\t\t\t\tsobolPixelIndex = ( uint( gl_FragCoord.x ) << 16 ) | uint( gl_FragCoord.y );\n\t\t\t\t\tsobolPathIndex = uint( seed );\n\n\t\t\t\t\t// get camera ray\n\t\t\t\t\tRay ray = getCameraRay();\n\n\t\t\t\t\t// inverse environment rotation\n\t\t\t\t\tenvRotation3x3 = mat3( environmentRotation );\n\t\t\t\t\tinvEnvRotation3x3 = inverse( envRotation3x3 );\n\t\t\t\t\tlightsDenom = environmentIntensity == 0.0 && lights.count != 0u ? float( lights.count ) : float( lights.count + 1u );\n\n\t\t\t\t\t// final color\n\t\t\t\t\tgl_FragColor = vec4( 0, 0, 0, 1 );\n\n\t\t\t\t\t// surface results\n\t\t\t\t\tSurfaceHit surfaceHit;\n\t\t\t\t\tScatterRecord scatterRec;\n\n\t\t\t\t\t// path tracing state\n\t\t\t\t\tRenderState state = initRenderState();\n\t\t\t\t\tstate.transmissiveTraversals = transmissiveBounces;\n\t\t\t\t\t#if FEATURE_FOG\n\n\t\t\t\t\tstate.fogMaterial.fogVolume = bvhIntersectFogVolumeHit(\n\t\t\t\t\t\tray.origin, - ray.direction,\n\t\t\t\t\t\tmaterialIndexAttribute, materials,\n\t\t\t\t\t\tstate.fogMaterial\n\t\t\t\t\t);\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfor ( int i = 0; i < bounces; i ++ ) {\n\n\t\t\t\t\t\tsobolBounceIndex ++;\n\n\t\t\t\t\t\tstate.depth ++;\n\t\t\t\t\t\tstate.traversals = bounces - i;\n\t\t\t\t\t\tstate.firstRay = i == 0 && state.transmissiveTraversals == transmissiveBounces;\n\n\t\t\t\t\t\tint hitType = traceScene( ray, state.fogMaterial, surfaceHit );\n\n\t\t\t\t\t\t// check if we intersect any lights and accumulate the light contribution\n\t\t\t\t\t\t// TODO: we can add support for light surface rendering in the else condition if we\n\t\t\t\t\t\t// add the ability to toggle visibility of the the light\n\t\t\t\t\t\tif ( ! state.firstRay && ! state.transmissiveRay ) {\n\n\t\t\t\t\t\t\tLightRecord lightRec;\n\t\t\t\t\t\t\tfloat lightDist = hitType == NO_HIT ? INFINITY : surfaceHit.dist;\n\t\t\t\t\t\t\tfor ( uint i = 0u; i < lights.count; i ++ ) {\n\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tintersectLightAtIndex( lights.tex, ray.origin, ray.direction, i, lightRec ) &&\n\t\t\t\t\t\t\t\t\tlightRec.dist < lightDist\n\t\t\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\t\t\t#if FEATURE_MIS\n\n\t\t\t\t\t\t\t\t\t// weight the contribution\n\t\t\t\t\t\t\t\t\t// NOTE: Only area lights are supported for forward sampling and can be hit\n\t\t\t\t\t\t\t\t\tfloat misWeight = misHeuristic( scatterRec.pdf, lightRec.pdf / lightsDenom );\n\t\t\t\t\t\t\t\t\tgl_FragColor.rgb += lightRec.emission * state.throughputColor * misWeight;\n\n\t\t\t\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\t\t\tgl_FragColor.rgb += lightRec.emission * state.throughputColor;\n\n\t\t\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hitType == NO_HIT ) {\n\n\t\t\t\t\t\t\tif ( state.firstRay || state.transmissiveRay ) {\n\n\t\t\t\t\t\t\t\tgl_FragColor.rgb += sampleBackground( envRotation3x3 * ray.direction, sobol2( 2 ) ) * state.throughputColor;\n\t\t\t\t\t\t\t\tgl_FragColor.a = backgroundAlpha;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t#if FEATURE_MIS\n\n\t\t\t\t\t\t\t\t// get the PDF of the hit envmap point\n\t\t\t\t\t\t\t\tvec3 envColor;\n\t\t\t\t\t\t\t\tfloat envPdf = sampleEquirect( envRotation3x3 * ray.direction, envColor );\n\t\t\t\t\t\t\t\tenvPdf /= lightsDenom;\n\n\t\t\t\t\t\t\t\t// and weight the contribution\n\t\t\t\t\t\t\t\tfloat misWeight = misHeuristic( scatterRec.pdf, envPdf );\n\t\t\t\t\t\t\t\tgl_FragColor.rgb += environmentIntensity * envColor * state.throughputColor * misWeight;\n\n\t\t\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\t\tgl_FragColor.rgb +=\n\t\t\t\t\t\t\t\t\tenvironmentIntensity *\n\t\t\t\t\t\t\t\t\tsampleEquirectColor( envMapInfo.map, envRotation3x3 * ray.direction ) *\n\t\t\t\t\t\t\t\t\tstate.throughputColor;\n\n\t\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuint materialIndex = uTexelFetch1D( materialIndexAttribute, surfaceHit.faceIndices.x ).r;\n\t\t\t\t\t\tMaterial material = readMaterialInfo( materials, materialIndex );\n\n\t\t\t\t\t\t#if FEATURE_FOG\n\n\t\t\t\t\t\tif ( hitType == FOG_HIT ) {\n\n\t\t\t\t\t\t\tmaterial = state.fogMaterial;\n\t\t\t\t\t\t\tstate.accumulatedRoughness += 0.2;\n\n\t\t\t\t\t\t} else if ( material.fogVolume ) {\n\n\t\t\t\t\t\t\tstate.fogMaterial = material;\n\t\t\t\t\t\t\tstate.fogMaterial.fogVolume = surfaceHit.side == 1.0;\n\n\t\t\t\t\t\t\tray.origin = stepRayOrigin( ray.origin, ray.direction, - surfaceHit.faceNormal, surfaceHit.dist );\n\n\t\t\t\t\t\t\ti -= sign( state.transmissiveTraversals );\n\t\t\t\t\t\t\tstate.transmissiveTraversals -= sign( state.transmissiveTraversals );\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// early out if this is a matte material\n\t\t\t\t\t\tif ( material.matte && state.firstRay ) {\n\n\t\t\t\t\t\t\tgl_FragColor = vec4( 0.0 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if we've determined that this is a shadow ray and we've hit an item with no shadow casting\n\t\t\t\t\t\t// then skip it\n\t\t\t\t\t\tif ( ! material.castShadow && state.isShadowRay ) {\n\n\t\t\t\t\t\t\tray.origin = stepRayOrigin( ray.origin, ray.direction, - surfaceHit.faceNormal, surfaceHit.dist );\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tSurfaceRecord surf;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tgetSurfaceRecord(\n\t\t\t\t\t\t\t\tmaterial, surfaceHit, attributesArray, state.accumulatedRoughness,\n\t\t\t\t\t\t\t\tsurf\n\t\t\t\t\t\t\t) == SKIP_SURFACE\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\t// only allow a limited number of transparency discards otherwise we could\n\t\t\t\t\t\t\t// crash the context with too long a loop.\n\t\t\t\t\t\t\ti -= sign( state.transmissiveTraversals );\n\t\t\t\t\t\t\tstate.transmissiveTraversals -= sign( state.transmissiveTraversals );\n\n\t\t\t\t\t\t\tray.origin = stepRayOrigin( ray.origin, ray.direction, - surfaceHit.faceNormal, surfaceHit.dist );\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tscatterRec = bsdfSample( - ray.direction, surf );\n\t\t\t\t\t\tstate.isShadowRay = scatterRec.specularPdf < sobol( 4 );\n\n\t\t\t\t\t\tbool isBelowSurface = ! surf.volumeParticle && dot( scatterRec.direction, surf.faceNormal ) < 0.0;\n\t\t\t\t\t\tvec3 hitPoint = stepRayOrigin( ray.origin, ray.direction, isBelowSurface ? - surf.faceNormal : surf.faceNormal, surfaceHit.dist );\n\n\t\t\t\t\t\t// next event estimation\n\t\t\t\t\t\t#if FEATURE_MIS\n\n\t\t\t\t\t\tgl_FragColor.rgb += directLightContribution( - ray.direction, surf, state, hitPoint );\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// accumulate a roughness value to offset diffuse, specular, diffuse rays that have high contribution\n\t\t\t\t\t\t// to a single pixel resulting in fireflies\n\t\t\t\t\t\t// TODO: handle transmissive surfaces\n\t\t\t\t\t\tif ( ! surf.volumeParticle && ! isBelowSurface ) {\n\n\t\t\t\t\t\t\t// determine if this is a rough normal or not by checking how far off straight up it is\n\t\t\t\t\t\t\tvec3 halfVector = normalize( - ray.direction + scatterRec.direction );\n\t\t\t\t\t\t\tstate.accumulatedRoughness += max(\n\t\t\t\t\t\t\t\tsin( acosApprox( dot( halfVector, surf.normal ) ) ),\n\t\t\t\t\t\t\t\tsin( acosApprox( dot( halfVector, surf.clearcoatNormal ) ) )\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tstate.transmissiveRay = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// accumulate emissive color\n\t\t\t\t\t\tgl_FragColor.rgb += ( surf.emission * state.throughputColor );\n\n\t\t\t\t\t\t// skip the sample if our PDF or ray is impossible\n\t\t\t\t\t\tif ( scatterRec.pdf <= 0.0 || ! isDirectionValid( scatterRec.direction, surf.normal, surf.faceNormal ) ) {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if we're bouncing around the inside a transmissive material then decrement\n\t\t\t\t\t\t// perform this separate from a bounce\n\t\t\t\t\t\tbool isTransmissiveRay = ! surf.volumeParticle && dot( scatterRec.direction, surf.faceNormal * surfaceHit.side ) < 0.0;\n\t\t\t\t\t\tif ( ( isTransmissiveRay || isBelowSurface ) && state.transmissiveTraversals > 0 ) {\n\n\t\t\t\t\t\t\tstate.transmissiveTraversals --;\n\t\t\t\t\t\t\ti --;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//\n\n\t\t\t\t\t\t// handle throughput color transformation\n\t\t\t\t\t\t// attenuate the throughput color by the medium color\n\t\t\t\t\t\tif ( ! surf.frontFace ) {\n\n\t\t\t\t\t\t\tstate.throughputColor *= transmissionAttenuation( surfaceHit.dist, surf.attenuationColor, surf.attenuationDistance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#if FEATURE_RUSSIAN_ROULETTE\n\n\t\t\t\t\t\t// russian roulette path termination\n\t\t\t\t\t\t// https://www.arnoldrenderer.com/research/physically_based_shader_design_in_arnold.pdf\n\t\t\t\t\t\tuint minBounces = 3u;\n\t\t\t\t\t\tfloat depthProb = float( state.depth < minBounces );\n\n\t\t\t\t\t\tfloat rrProb = luminance( state.throughputColor * scatterRec.color / scatterRec.pdf );\n\t\t\t\t\t\trrProb /= luminance( state.throughputColor );\n\t\t\t\t\t\trrProb = sqrt( rrProb );\n\t\t\t\t\t\trrProb = max( rrProb, depthProb );\n\t\t\t\t\t\trrProb = min( rrProb, 1.0 );\n\t\t\t\t\t\tif ( sobol( 8 ) > rrProb ) {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// perform sample clamping here to avoid bright pixels\n\t\t\t\t\t\tstate.throughputColor *= min( 1.0 / rrProb, 20.0 );\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// adjust the throughput and discard and exit if we find discard the sample if there are any NaNs\n\t\t\t\t\t\tstate.throughputColor *= scatterRec.color / scatterRec.pdf;\n\t\t\t\t\t\tif ( any( isnan( state.throughputColor ) ) || any( isinf( state.throughputColor ) ) ) {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//\n\n\t\t\t\t\t\t// prepare for next ray\n\t\t\t\t\t\tray.direction = scatterRec.direction;\n\t\t\t\t\t\tray.origin = hitPoint;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl_FragColor.a *= opacity;\n\n\t\t\t\t\t#if DEBUG_MODE == 1\n\n\t\t\t\t\t// output the number of rays checked in the path and number of\n\t\t\t\t\t// transmissive rays encountered.\n\t\t\t\t\tgl_FragColor.rgb = vec3(\n\t\t\t\t\t\tfloat( state.depth ),\n\t\t\t\t\t\ttransmissiveBounces - state.transmissiveTraversals,\n\t\t\t\t\t\t0.0\n\t\t\t\t\t);\n\t\t\t\t\tgl_FragColor.a = 1.0;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t}\n\n\t\t\t`\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n","import { NoBlending } from 'three';\nimport { MaterialBase } from '../MaterialBase.js';\n\nexport class DenoiseMaterial extends MaterialBase {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\tblending: NoBlending,\n\n\t\t\ttransparent: false,\n\n\t\t\tdepthWrite: false,\n\n\t\t\tdepthTest: false,\n\n\t\t\tdefines: {\n\n\t\t\t\tUSE_SLIDER: 0,\n\n\t\t\t},\n\n\t\t\tuniforms: {\n\n\t\t\t\tsigma: { value: 5.0 },\n\t\t\t\tthreshold: { value: 0.03 },\n\t\t\t\tkSigma: { value: 1.0 },\n\n\t\t\t\tmap: { value: null },\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\t//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t\t//  Copyright (c) 2018-2019 Michele Morrone\n\t\t\t\t//  All rights reserved.\n\t\t\t\t//\n\t\t\t\t//  https://michelemorrone.eu - https://BrutPitt.com\n\t\t\t\t//\n\t\t\t\t//  me@michelemorrone.eu - brutpitt@gmail.com\n\t\t\t\t//  twitter: @BrutPitt - github: BrutPitt\n\t\t\t\t//\n\t\t\t\t//  https://github.com/BrutPitt/glslSmartDeNoise/\n\t\t\t\t//\n\t\t\t\t//  This software is distributed under the terms of the BSD 2-Clause license\n\t\t\t\t//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\t\t\t\tuniform sampler2D map;\n\n\t\t\t\tuniform float sigma;\n\t\t\t\tuniform float threshold;\n\t\t\t\tuniform float kSigma;\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#define INV_SQRT_OF_2PI 0.39894228040143267793994605993439\n\t\t\t\t#define INV_PI 0.31830988618379067153776752674503\n\n\t\t\t\t// Parameters:\n\t\t\t\t//\t sampler2D tex\t - sampler image / texture\n\t\t\t\t//\t vec2 uv\t\t   - actual fragment coord\n\t\t\t\t//\t float sigma  >  0 - sigma Standard Deviation\n\t\t\t\t//\t float kSigma >= 0 - sigma coefficient\n\t\t\t\t//\t\t kSigma * sigma  -->  radius of the circular kernel\n\t\t\t\t//\t float threshold   - edge sharpening threshold\n\t\t\t\tvec4 smartDeNoise( sampler2D tex, vec2 uv, float sigma, float kSigma, float threshold ) {\n\n\t\t\t\t\tfloat radius = round( kSigma * sigma );\n\t\t\t\t\tfloat radQ = radius * radius;\n\n\t\t\t\t\tfloat invSigmaQx2 = 0.5 / ( sigma * sigma );\n\t\t\t\t\tfloat invSigmaQx2PI = INV_PI * invSigmaQx2;\n\n\t\t\t\t\tfloat invThresholdSqx2 = 0.5 / ( threshold * threshold );\n\t\t\t\t\tfloat invThresholdSqrt2PI = INV_SQRT_OF_2PI / threshold;\n\n\t\t\t\t\tvec4 centrPx = texture2D( tex, uv );\n\t\t\t\t\tcentrPx.rgb *= centrPx.a;\n\n\t\t\t\t\tfloat zBuff = 0.0;\n\t\t\t\t\tvec4 aBuff = vec4( 0.0 );\n\t\t\t\t\tvec2 size = vec2( textureSize( tex, 0 ) );\n\n\t\t\t\t\tvec2 d;\n\t\t\t\t\tfor ( d.x = - radius; d.x <= radius; d.x ++ ) {\n\n\t\t\t\t\t\tfloat pt = sqrt( radQ - d.x * d.x );\n\n\t\t\t\t\t\tfor ( d.y = - pt; d.y <= pt; d.y ++ ) {\n\n\t\t\t\t\t\t\tfloat blurFactor = exp( - dot( d, d ) * invSigmaQx2 ) * invSigmaQx2PI;\n\n\t\t\t\t\t\t\tvec4 walkPx = texture2D( tex, uv + d / size );\n\t\t\t\t\t\t\twalkPx.rgb *= walkPx.a;\n\n\t\t\t\t\t\t\tvec4 dC = walkPx - centrPx;\n\t\t\t\t\t\t\tfloat deltaFactor = exp( - dot( dC.rgba, dC.rgba ) * invThresholdSqx2 ) * invThresholdSqrt2PI * blurFactor;\n\n\t\t\t\t\t\t\tzBuff += deltaFactor;\n\t\t\t\t\t\t\taBuff += deltaFactor * walkPx;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn aBuff / zBuff;\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = smartDeNoise( map, vec2( vUv.x, vUv.y ), sigma, kSigma, threshold );\n\t\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t\t#include <colorspace_fragment>\n\t\t\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t\t\t}\n\n\t\t\t`\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n","/**\n * Creates a WebGLRenderer\n *\n * @param\n * By default, a camera will create its own renderer, with sensible defaults. But there may be cases where you want to override those defaults. In those situation, simply create this node, and set the camera renderer param to it.\n *\n */\nimport {TypedRopNode} from './_Base';\nimport {RopType} from '../../poly/registers/nodes/types/Rop';\nimport type {WebGLRenderer} from 'three';\nimport {MeshBasicMaterial, CustomBlending} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {Poly} from '../../Poly';\n// import {isBooleanTrue} from '../../../core/BooleanValue';\n// import {WEBGL_RENDERER_DEFAULT_PARAMS} from './WebGLRenderer';\n// <<<<<<< HEAD\nimport {FullScreenQuad} from '../../../modules/three/examples/jsm/postprocessing/Pass';\nimport {\n\tPathTracingRenderer,\n\tPhysicalPathTracingMaterial,\n\tDenoiseMaterial,\n} from '../../../core/render/PBR/three-gpu-pathtracer';\n// =======\n// import {FullScreenQuad} from 'three/examples/jsm/postprocessing/Pass';\n// import {\n// \tPathTracingRenderer,\n// \tPhysicalPathTracingMaterial,\n// \tPhysicalCamera,\n// \tShapedAreaLight,\n// \tPhysicalSpotLight,\n// \tIESLoader,\n// \t// @ts-ignore\n// } from '../../core/thirdParty/three-gpu-pathtracer';\n// >>>>>>> master\nimport {PathTracingRendererContainer} from './utils/pathTracing/PathTracingRendererContainer';\nimport {BaseNodeType} from '../_Base';\nimport {ModuleName} from '../../poly/registers/modules/Common';\n\nconst updateWithoutCook = {\n\tcook: false,\n\tcallback: (node: BaseNodeType) => {\n\t\tPathTracingRendererRopNode.PARAM_CALLBACK_update(node as PathTracingRendererRopNode);\n\t},\n};\n\nclass PathTracingRendererRopParamsConfig extends NodeParamsConfig {\n\trealtime = ParamConfig.FOLDER();\n\t/** @param display samples count */\n\tdisplayDebug = ParamConfig.BOOLEAN(1);\n\t/** @param useWorker */\n\tuseWorker = ParamConfig.BOOLEAN(0);\n\t/** @param samples */\n\tmaxSamplesCount = ParamConfig.INTEGER(2 ** 12, {\n\t\trange: [1, 2 ** 12],\n\t\trangeLocked: [true, false],\n\t\tstep: 1,\n\t});\n\n\t/** @param resolutionScale */\n\tresolutionScale = ParamConfig.FLOAT(0.5, {\n\t\trange: [0.1, 1],\n\t\trangeLocked: [true, true],\n\t\tstep: 0.01,\n\t\tseparatorAfter: true,\n\t});\n\t/** @param bounces */\n\tbounces = ParamConfig.INTEGER(3, {\n\t\trange: [1, 10],\n\t\trangeLocked: [true, false],\n\t\t...updateWithoutCook,\n\t});\n\t/** @param bounces inside transmissive material */\n\ttransmissiveBounces = ParamConfig.INTEGER(3, {\n\t\trange: [1, 10],\n\t\trangeLocked: [true, false],\n\t\t...updateWithoutCook,\n\t});\n\t/** @param stableNoise*/\n\tstableNoise = ParamConfig.BOOLEAN(1, {\n\t\t...updateWithoutCook,\n\t});\n\t/** @param multipleImportanceSampling */\n\tmultipleImportanceSampling = ParamConfig.BOOLEAN(1, {\n\t\t...updateWithoutCook,\n\t});\n\t/** @param filterGlossyFactor */\n\tfilterGlossyFactor = ParamConfig.FLOAT(0.5, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, true],\n\t\t...updateWithoutCook,\n\t});\n\t/** @param backgroundBlur*/\n\tbackgroundBlur = ParamConfig.FLOAT(0, {\n\t\t// ...updateWithoutCook,\n\t});\n\t/** @param environmentIntensity*/\n\tenvironmentIntensity = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t\t...updateWithoutCook,\n\t});\n\tdenoise = ParamConfig.BOOLEAN(1, {\n\t\tseparatorBefore: true,\n\t\t...updateWithoutCook,\n\t});\n\tdenoiseSigma = ParamConfig.FLOAT(2.5, {\n\t\trange: [0.01, 12.0],\n\t\trangeLocked: [true, true],\n\t\t...updateWithoutCook,\n\t});\n\tdenoiseThreshold = ParamConfig.FLOAT(0.1, {\n\t\trange: [0.01, 1.0],\n\t\trangeLocked: [true, true],\n\t\t...updateWithoutCook,\n\t});\n\tdenoiseKSigma = ParamConfig.FLOAT(1.0, {\n\t\trange: [0.0, 12.0],\n\t\trangeLocked: [true, true],\n\t\t...updateWithoutCook,\n\t});\n\t/** @param toggle on to have alpha on (change requires page reload) */\n\t// alpha = ParamConfig.BOOLEAN(1);\n\t/** @param toggle on to have antialias on (change requires page reload) */\n\t// antialias = ParamConfig.BOOLEAN(1);\n\t/** @param tiles */\n\ttiles = ParamConfig.VECTOR2([2, 2], {\n\t\tseparatorBefore: true,\n\t\t...updateWithoutCook,\n\t});\n\t/** @param force update */\n\t// generate = ParamConfig.BUTTON(null, {\n\t// \tcallback: (node: BaseNodeType) => {\n\t// \t\tPathTracingRendererRopNode.PARAM_CALLBACK_generate(node as PathTracingRendererRopNode);\n\t// \t},\n\t// });\n\t// /** @param reset */\n\t// reset = ParamConfig.BUTTON(null, {\n\t// \tcallback: (node: BaseNodeType) => {\n\t// \t\tPathTracingRendererRopNode.PARAM_CALLBACK_reset(node as PathTracingRendererRopNode);\n\t// \t},\n\t// });\n\tsequenceRender = ParamConfig.FOLDER();\n\t/** @param frame range */\n\tf = ParamConfig.VECTOR2([0, 100], {\n\t\tlabel: 'Frame Range',\n\t\t...updateWithoutCook,\n\t});\n\t/** @param samples */\n\tsamplesPerAnimationFrame = ParamConfig.INTEGER(20, {\n\t\trange: [1, 1000],\n\t\trangeLocked: [true, false],\n\t\t...updateWithoutCook,\n\t});\n\t/** @param resolution */\n\tresolution = ParamConfig.VECTOR2([512, 512], {\n\t\t...updateWithoutCook,\n\t});\n\t/** @param fileName */\n\tfileName = ParamConfig.STRING('`$OS`', {\n\t\t...updateWithoutCook,\n\t});\n\tframePadding = ParamConfig.INTEGER(4, {\n\t\trange: [2, 6],\n\t\trangeLocked: [true, false],\n\t\t...updateWithoutCook,\n\t});\n}\nconst ParamsConfig = new PathTracingRendererRopParamsConfig();\n\nexport class PathTracingRendererRopNode extends TypedRopNode<PathTracingRendererRopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<RopType.PATH_TRACING> {\n\t\treturn RopType.PATH_TRACING;\n\t}\n\toverride requiredModules() {\n\t\treturn [ModuleName.PBR];\n\t}\n\n\tprivate _pathTracingRenderer: PathTracingRendererContainer | undefined;\n\tprivate _webGLRenderer: WebGLRenderer | undefined;\n\n\tprotected override initializeNode(): void {\n\t\tsuper.initializeNode();\n\n\t\tPoly.onSceneUpdatedHooks.registerHook(this, this._paramCallbackGenerate.bind(this));\n\t}\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tPoly.onSceneUpdatedHooks.unregisterHook(this);\n\t}\n\tprivate _createWebGLRenderer(canvas: HTMLCanvasElement, gl: WebGLRenderingContext) {\n\t\t// const params: WebGLRendererParameters = {};\n\t\t// const keys: Array<keyof WebGLRendererParameters> = Object.keys(WEBGL_RENDERER_DEFAULT_PARAMS) as Array<\n\t\t// \tkeyof WebGLRendererParameters\n\t\t// >;\n\t\t// let k: keyof WebGLRendererParameters;\n\t\t// for (k of keys) {\n\t\t// \t(params[k] as any) = WEBGL_RENDERER_DEFAULT_PARAMS[k];\n\t\t// }\n\n\t\t// params.antialias = isBooleanTrue(this.pv.antialias);\n\t\t// params.alpha = isBooleanTrue(this.pv.alpha);\n\t\t// params.canvas = canvas;\n\t\t// params.context = gl;\n\t\t// params.preserveDrawingBuffer = true;\n\t\tconst webGLRenderer = Poly.renderersController.defaultWebGLRendererForCanvas(canvas);\n\n\t\tif (Poly.renderersController.printDebug()) {\n\t\t\tPoly.renderersController.printDebugMessage(`create renderer from node '${this.path()}'`);\n\t\t\t// Poly.renderersController.printDebugMessage({\n\t\t\t// \tparams: params,\n\t\t\t// });\n\t\t}\n\t\treturn webGLRenderer;\n\t}\n\tprivate _createPathTracingRenderer(canvas: HTMLCanvasElement, gl: WebGLRenderingContext) {\n\t\tthis._webGLRenderer = this._webGLRenderer || this._createWebGLRenderer(canvas, gl);\n\t\tconst pathTracingRenderer = new PathTracingRenderer(this._webGLRenderer);\n\t\tpathTracingRenderer.material = new PhysicalPathTracingMaterial();\n\n\t\tconst fsQuadMat = new MeshBasicMaterial({\n\t\t\tmap: pathTracingRenderer.target.texture,\n\t\t\tblending: CustomBlending,\n\t\t});\n\t\tconst denoiseMat = new DenoiseMaterial({\n\t\t\tmap: pathTracingRenderer.target.texture,\n\t\t\tblending: CustomBlending,\n\t\t\tpremultipliedAlpha: this._webGLRenderer.getContextAttributes().premultipliedAlpha,\n\t\t});\n\t\tconst denoiseQuad = new FullScreenQuad(denoiseMat);\n\n\t\tconst fsQuad = new FullScreenQuad(fsQuadMat);\n\t\tconst pathTracingRendererContainer = new PathTracingRendererContainer({\n\t\t\tnode: this,\n\t\t\twebGLRenderer: this._webGLRenderer,\n\t\t\tpathTracingRenderer,\n\t\t\tfsQuad,\n\t\t\tfsQuadMat,\n\t\t\tdenoiseQuad,\n\t\t\tdenoiseMat,\n\t\t});\n\n\t\tthis._updateRenderer(pathTracingRendererContainer);\n\n\t\tthis._pathTracingRenderer = pathTracingRendererContainer;\n\t\treturn pathTracingRendererContainer;\n\t}\n\n\trenderer(canvas: HTMLCanvasElement, gl: WebGLRenderingContext): PathTracingRendererContainer {\n\t\treturn (this._pathTracingRenderer = this._pathTracingRenderer || this._createPathTracingRenderer(canvas, gl));\n\t}\n\n\toverride cook() {\n\t\tthis._paramCallbackUpdate();\n\t\tthis.cookController.endCook();\n\t}\n\n\tprivate _updateRenderer(rendererContainer: PathTracingRendererContainer) {\n\t\trendererContainer.update({\n\t\t\tresolutionScale: this.pv.resolutionScale,\n\t\t\tdisplayDebug: this.pv.displayDebug,\n\t\t\tbounces: this.pv.bounces,\n\t\t\ttransmissiveBounces: this.pv.transmissiveBounces,\n\t\t\tstableNoise: this.pv.stableNoise,\n\t\t\tfilterGlossyFactor: this.pv.filterGlossyFactor,\n\t\t\tbackgroundBlur: this.pv.backgroundBlur,\n\t\t\tenvironmentIntensity: this.pv.environmentIntensity,\n\t\t\ttiles: this.pv.tiles,\n\t\t\tmultipleImportanceSampling: this.pv.multipleImportanceSampling,\n\t\t\t//\n\t\t\tdenoise: this.pv.denoise,\n\t\t\tdenoiseSigma: this.pv.denoiseSigma,\n\t\t\tdenoiseThreshold: this.pv.denoiseThreshold,\n\t\t\tdenoiseKSigma: this.pv.denoiseKSigma,\n\t\t\t//\n\t\t\tmaxSamplesCount: this.pv.maxSamplesCount,\n\t\t\tsamplesPerAnimationFrame: this.pv.samplesPerAnimationFrame,\n\t\t\tf: this.pv.f,\n\t\t\tuseWorker: this.pv.useWorker,\n\t\t});\n\t}\n\tstatic PARAM_CALLBACK_generate(node: PathTracingRendererRopNode) {\n\t\tnode._paramCallbackGenerate();\n\t}\n\tprivate _paramCallbackGenerate() {\n\t\tconst scene = this.scene().threejsScene();\n\t\tthis._pathTracingRenderer?.generate(scene);\n\t}\n\tstatic PARAM_CALLBACK_update(node: PathTracingRendererRopNode) {\n\t\tnode._paramCallbackUpdate();\n\t}\n\tprivate _paramCallbackUpdate() {\n\t\tif (this._pathTracingRenderer) {\n\t\t\tthis._updateRenderer(this._pathTracingRenderer);\n\t\t}\n\t}\n}\n","/**\n * Creates a WebGLRenderer\n *\n * @param\n * By default, a camera will create its own renderer, with sensible defaults. But there may be cases where you want to override those defaults. In those situation, simply create this node, and set the camera renderer param to it.\n *\n */\nimport {TypedRopNode} from './_Base';\nimport {RopType} from '../../poly/registers/nodes/types/Rop';\nimport {\n\tWebGLRenderer,\n\tWebGLRendererParameters,\n\tMesh,\n\t// color space\n\tColorSpace,\n\t// NoColorSpace,\n\tSRGBColorSpace,\n\tLinearSRGBColorSpace,\n\tDisplayP3ColorSpace,\n\tLinearDisplayP3ColorSpace,\n\t// tone mapping\n\tToneMapping,\n\tNoToneMapping,\n\tLinearToneMapping,\n\tReinhardToneMapping,\n\tCineonToneMapping,\n\tACESFilmicToneMapping,\n\t// shadow map\n\tShadowMapType,\n\tBasicShadowMap,\n\tPCFShadowMap,\n\tPCFSoftShadowMap,\n\tVSMShadowMap,\n} from 'three';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isArray} from '../../../core/Type';\nimport {Poly} from '../../Poly';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {defaultPixelRatio} from '../../../core/render/defaultPixelRatio';\nimport {\n\tPowerPreference,\n\tPOWER_PREFERENCES,\n\tRENDERER_PRECISIONS,\n\tRendererPrecision,\n\tWEBGL_RENDERER_DEFAULT_PARAMS,\n} from '../../../core/render/Common';\nimport {BaseNodeType} from '../_Base';\nimport {COLOR_SPACE_NAME_BY_COLOR_SPACE} from '../../../core/cop/ColorSpace';\n// enum EncodingName {\n// \tLinear = 'Linear',\n// \tsRGB = 'sRGB',\n// \tRGBM7 = 'RGBM7',\n// \t// BasicDepth = 'BasicDepth',\n// \t// RGBADepth = 'RGBADepth',\n// }\n// enum ColorSpaceValue {\n// \tLinear = NoColorSpace as string,\n// \tsRGB = SRGBColorSpace as string,\n// \tBasicDepth = LinearSRGBColorSpace as string,\n// \tRGBADepth = DisplayP3ColorSpace as string,\n// }\nconst COLOR_SPACES: ColorSpace[] = [\n\t// NoColorSpace, // crashes the renderer\n\tSRGBColorSpace,\n\tLinearSRGBColorSpace,\n\tDisplayP3ColorSpace,\n\tLinearDisplayP3ColorSpace,\n];\n// const ENCODING_VALUES: EncodingValue[] = [\n// \tEncodingValue.Linear,\n// \tEncodingValue.sRGB,\n// \t// EncodingValue.BasicDepth,\n// \t// EncodingValue.RGBADepth,\n// ];\nexport const DEFAULT_OUTPUT_COLOR_SPACE = SRGBColorSpace;\n\nenum ToneMappingName {\n\tNo = 'No',\n\tLinear = 'Linear',\n\tReinhard = 'Reinhard',\n\tCineon = 'Cineon',\n\tACESFilmic = 'ACESFilmic',\n}\nenum ToneMappingValue {\n\tNo = NoToneMapping as number,\n\tLinear = LinearToneMapping as number,\n\tReinhard = ReinhardToneMapping as number,\n\tCineon = CineonToneMapping as number,\n\tACESFilmic = ACESFilmicToneMapping as number,\n}\nconst TONE_MAPPING_NAMES: ToneMappingName[] = [\n\tToneMappingName.No,\n\tToneMappingName.Linear,\n\tToneMappingName.Reinhard,\n\tToneMappingName.Cineon,\n\tToneMappingName.ACESFilmic,\n];\nconst TONE_MAPPING_VALUES: ToneMappingValue[] = [\n\tToneMappingValue.No,\n\tToneMappingValue.Linear,\n\tToneMappingValue.Reinhard,\n\tToneMappingValue.Cineon,\n\tToneMappingValue.ACESFilmic,\n];\nexport const DEFAULT_TONE_MAPPING = ToneMappingValue.ACESFilmic as ToneMapping;\nconst TONE_MAPPING_MENU_ENTRIES = TONE_MAPPING_NAMES.map((name, i) => {\n\treturn {\n\t\tname: name,\n\t\tvalue: TONE_MAPPING_VALUES[i],\n\t};\n});\nconst TONE_MAPPING_EXPOSURE_VISIBLE_OPTIONS: ToneMappingValue[] = [];\nfor (const value of TONE_MAPPING_VALUES) {\n\tif (value != ToneMappingValue.No) {\n\t\tTONE_MAPPING_EXPOSURE_VISIBLE_OPTIONS.push(value);\n\t}\n}\n\nenum ShadowMapTypeName {\n\tBasic = 'Basic',\n\tPCF = 'PCF',\n\tPCFSoft = 'PCFSoft',\n\tVSM = 'VSM',\n}\nenum ShadowMapTypeValue {\n\tBasic = BasicShadowMap as number,\n\tPCF = PCFShadowMap as number,\n\tPCFSoft = PCFSoftShadowMap as number,\n\tVSM = VSMShadowMap as number,\n}\nconst SHADOW_MAP_TYPE_NAMES: ShadowMapTypeName[] = [\n\tShadowMapTypeName.Basic,\n\tShadowMapTypeName.PCF,\n\tShadowMapTypeName.PCFSoft,\n\tShadowMapTypeName.VSM,\n];\nconst SHADOW_MAP_TYPE_VALUES: ShadowMapTypeValue[] = [\n\tShadowMapTypeValue.Basic,\n\tShadowMapTypeValue.PCF,\n\tShadowMapTypeValue.PCFSoft,\n\tShadowMapTypeValue.VSM,\n];\nexport const SHADOW_MAP_TYPES = [BasicShadowMap, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap];\nexport const DEFAULT_SHADOW_MAP_TYPE = ShadowMapTypeValue.PCFSoft as ShadowMapType;\n\n// TODO: set debug.checkShaderErrors to false in prod\n\nclass WebGLRendererRopParamsConfig extends NodeParamsConfig {\n\t//\n\t//\n\t//\n\t//\n\t//\n\tcommon = ParamConfig.FOLDER();\n\t/** @param tone mapping */\n\ttoneMapping = ParamConfig.INTEGER(DEFAULT_TONE_MAPPING, {\n\t\tmenu: {\n\t\t\tentries: TONE_MAPPING_MENU_ENTRIES,\n\t\t},\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateToneMapping(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param tone mapping exposure */\n\ttoneMappingExposure = ParamConfig.FLOAT(1, {\n\t\trange: [0, 2],\n\t\tcook: false,\n\t\tvisibleIf: TONE_MAPPING_EXPOSURE_VISIBLE_OPTIONS.map((value) => ({toneMapping: value})),\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateToneMappingExposure(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param output color space */\n\toutputColorSpace = ParamConfig.STRING(DEFAULT_OUTPUT_COLOR_SPACE, {\n\t\tmenuString: {\n\t\t\tentries: COLOR_SPACES.map((colorSpace) => ({\n\t\t\t\tname: COLOR_SPACE_NAME_BY_COLOR_SPACE[colorSpace],\n\t\t\t\tvalue: colorSpace,\n\t\t\t})),\n\t\t},\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateOutputColorSpace(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\n\t/** @param sort objects, which can be necessary when rendering transparent objects */\n\tsortObjects = ParamConfig.BOOLEAN(1, {\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateSortObjects(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param toggle to override the default pixel ratio, which is 1 for mobile devices, and Math.max(2, globalThis.devicePixelRatio) for other devices */\n\ttpixelRatio = ParamConfig.BOOLEAN(0, {\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updatePixelRatio(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param higher pixelRatio improves render sharpness but reduces performance */\n\tpixelRatio = ParamConfig.FLOAT(2, {\n\t\tvisibleIf: {tpixelRatio: true},\n\t\trange: [0.1, 4],\n\t\trangeLocked: [true, false],\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updatePixelRatio(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\tshadow = ParamConfig.FOLDER();\n\t/** @param toggle on to have shadow maps */\n\ttshadowMap = ParamConfig.BOOLEAN(1, {\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateShadow(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param toggle on to recompute the shadow maps on every frame. If all objects are static, you may want to turn this off */\n\tshadowMapAutoUpdate = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {tshadowMap: 1},\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateShadow(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param toggle on to trigger shadows update */\n\tshadowMapNeedsUpdate = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {tshadowMap: 1},\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateShadow(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\t/** @param shadows type */\n\tshadowMapType = ParamConfig.INTEGER(DEFAULT_SHADOW_MAP_TYPE, {\n\t\tvisibleIf: {tshadowMap: 1},\n\t\tmenu: {\n\t\t\tentries: SHADOW_MAP_TYPE_NAMES.map((name, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: name,\n\t\t\t\t\tvalue: SHADOW_MAP_TYPE_VALUES[i],\n\t\t\t\t};\n\t\t\t}),\n\t\t},\n\t\tcook: false,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tWebGLRendererRopNode.PARAM_CALLBACK_updateShadow(node as WebGLRendererRopNode);\n\t\t},\n\t});\n\n\t//\n\t//\n\t//\n\t//\n\t//\n\tadvanced = ParamConfig.FOLDER();\n\t/** @param toggle on to have alpha on (change requires page reload) */\n\talpha = ParamConfig.BOOLEAN(1);\n\t/** @param toggle on to have antialias on (change requires page reload) */\n\tantialias = ParamConfig.BOOLEAN(1);\n\t/** @param premultipliedAlpha */\n\tpremultipliedAlpha = ParamConfig.BOOLEAN(1);\n\t/** @param stencil */\n\tstencil = ParamConfig.BOOLEAN(1);\n\t/** @param depth */\n\tdepth = ParamConfig.BOOLEAN(1);\n\t/** @param localClippingEnabled */\n\tlocalClippingEnabled = ParamConfig.BOOLEAN(0);\n\t/** @param logarithmicDepthBuffer */\n\tlogarithmicDepthBuffer = ParamConfig.BOOLEAN(0);\n\t/** @param preserveDrawingBuffer */\n\tpreserveDrawingBuffer = ParamConfig.BOOLEAN(0);\n\t/** @param toggle on to set the precision */\n\ttprecision = ParamConfig.BOOLEAN(0);\n\t/** @param set the precision */\n\tprecision = ParamConfig.INTEGER(RENDERER_PRECISIONS.indexOf(RendererPrecision.HIGH), {\n\t\tvisibleIf: {tprecision: 1},\n\t\tmenu: {\n\t\t\tentries: RENDERER_PRECISIONS.map((name, value) => {\n\t\t\t\treturn {value, name};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param toggle on to set the power preferenc */\n\ttpowerPreference = ParamConfig.BOOLEAN(0);\n\t/** @param set the precision */\n\tpowerPreference = ParamConfig.INTEGER(POWER_PREFERENCES.indexOf(PowerPreference.HIGH), {\n\t\tvisibleIf: {tpowerPreference: 1},\n\t\tmenu: {\n\t\t\tentries: POWER_PREFERENCES.map((name, value) => {\n\t\t\t\treturn {value, name};\n\t\t\t}),\n\t\t},\n\t});\n\n\t// preserve_drawing_buffer = ParamConfig.BOOLEAN(0);\n}\nconst ParamsConfig = new WebGLRendererRopParamsConfig();\n\nexport class WebGLRendererRopNode extends TypedRopNode<WebGLRendererRopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<RopType.WEBGL> {\n\t\treturn RopType.WEBGL;\n\t}\n\n\tprivate _rendererByCanvas: Map<HTMLCanvasElement, WebGLRenderer> = new Map();\n\n\t// private _renderersbyCamera: Map<Camera, WebGLRenderer> = new Map();\n\tcreateRenderer(canvas: HTMLCanvasElement, gl: WebGLRenderingContext): WebGLRenderer {\n\t\tconst params: WebGLRendererParameters = {};\n\t\tconst keys: Array<keyof WebGLRendererParameters> = Object.keys(WEBGL_RENDERER_DEFAULT_PARAMS) as Array<\n\t\t\tkeyof WebGLRendererParameters\n\t\t>;\n\t\tlet k: keyof WebGLRendererParameters;\n\t\tfor (k of keys) {\n\t\t\t(params[k] as any) = WEBGL_RENDERER_DEFAULT_PARAMS[k];\n\t\t}\n\t\tif (isBooleanTrue(this.pv.tprecision)) {\n\t\t\tconst precision = RENDERER_PRECISIONS[this.pv.precision];\n\t\t\tparams.precision = precision;\n\t\t}\n\t\tif (isBooleanTrue(this.pv.tpowerPreference)) {\n\t\t\tconst powerPreference = POWER_PREFERENCES[this.pv.powerPreference];\n\t\t\tparams.powerPreference = powerPreference;\n\t\t}\n\t\tparams.antialias = isBooleanTrue(this.pv.antialias);\n\t\tparams.alpha = isBooleanTrue(this.pv.alpha);\n\t\tparams.premultipliedAlpha = isBooleanTrue(this.pv.premultipliedAlpha);\n\t\tparams.depth = isBooleanTrue(this.pv.depth);\n\t\tparams.stencil = isBooleanTrue(this.pv.stencil);\n\t\tparams.logarithmicDepthBuffer = isBooleanTrue(this.pv.logarithmicDepthBuffer);\n\t\tparams.canvas = canvas;\n\t\tparams.context = gl;\n\t\tparams.preserveDrawingBuffer = this.pv.preserveDrawingBuffer;\n\t\tconst renderer = Poly.renderersController.createWebGLRenderer(params);\n\t\trenderer.localClippingEnabled = isBooleanTrue(this.pv.localClippingEnabled);\n\t\tthis._rendererByCanvas.set(canvas, renderer);\n\n\t\tif (Poly.renderersController.printDebug()) {\n\t\t\tPoly.renderersController.printDebugMessage(`create renderer from node '${this.path()}'`);\n\t\t\tPoly.renderersController.printDebugMessage({\n\t\t\t\tparams: params,\n\t\t\t});\n\t\t}\n\n\t\tthis._updateRenderer(renderer);\n\n\t\treturn renderer;\n\t}\n\n\toverride cook() {\n\t\tthis._traverseSceneAndUpdateMaterials();\n\n\t\tthis.cookController.endCook();\n\t}\n\tprivate _updateRenderer(renderer: WebGLRenderer) {\n\t\t// this._renderer.setClearAlpha(this.pv.alpha);\n\t\tthis._updateRendererOutputColorSpace(renderer);\n\t\tthis._updateRendererToneMapping(renderer);\n\t\tthis._updateRendererToneMappingExposure(renderer);\n\t\tthis._updateRendererShadow(renderer);\n\t\tthis._updateRendererSortObjects(renderer);\n\t\tthis._updateRendererPixelRatio(renderer);\n\t}\n\n\tprivate _traverseSceneAndUpdateMaterials() {\n\t\tthis.scene()\n\t\t\t.threejsScene()\n\t\t\t.traverse((object) => {\n\t\t\t\tconst material = (object as Mesh).material;\n\t\t\t\tif (material) {\n\t\t\t\t\tif (isArray(material)) {\n\t\t\t\t\t\tfor (const mat of material) {\n\t\t\t\t\t\t\tmat.needsUpdate = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t//\n\t//\n\n\tstatic PARAM_CALLBACK_updateToneMapping(node: WebGLRendererRopNode) {\n\t\tnode._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tnode._updateRendererToneMapping(renderer);\n\t\t});\n\t}\n\tstatic PARAM_CALLBACK_updateToneMappingExposure(node: WebGLRendererRopNode) {\n\t\tnode._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tnode._updateRendererToneMappingExposure(renderer);\n\t\t});\n\t}\n\tstatic PARAM_CALLBACK_updateOutputColorSpace(node: WebGLRendererRopNode) {\n\t\tnode._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tnode._updateRendererOutputColorSpace(renderer);\n\t\t});\n\t}\n\tstatic PARAM_CALLBACK_updateShadow(node: WebGLRendererRopNode) {\n\t\tnode._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tnode._updateRendererShadow(renderer);\n\t\t});\n\t}\n\tstatic PARAM_CALLBACK_updateSortObjects(node: WebGLRendererRopNode) {\n\t\tnode._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tnode._updateRendererSortObjects(renderer);\n\t\t});\n\t}\n\n\tstatic PARAM_CALLBACK_updatePixelRatio(node: WebGLRendererRopNode) {\n\t\tnode._rendererByCanvas.forEach((renderer, canvas) => {\n\t\t\tnode._updateRendererPixelRatio(renderer);\n\t\t});\n\t\tglobalThis.dispatchEvent(new Event('resize'));\n\t}\n\t//\n\t//\n\tprivate _updateRendererToneMapping(renderer: WebGLRenderer) {\n\t\trenderer.toneMapping = this.pv.toneMapping as ToneMapping;\n\t}\n\tprivate _updateRendererToneMappingExposure(renderer: WebGLRenderer) {\n\t\trenderer.toneMappingExposure = this.pv.toneMappingExposure;\n\t}\n\tprivate _updateRendererOutputColorSpace(renderer: WebGLRenderer) {\n\t\tconst newOutputColorSpace = this.pv.outputColorSpace as ColorSpace;\n\t\tif (newOutputColorSpace != renderer.outputColorSpace) {\n\t\t\trenderer.outputColorSpace = newOutputColorSpace;\n\t\t}\n\t}\n\tprivate _updateRendererShadow(renderer: WebGLRenderer) {\n\t\trenderer.shadowMap.enabled = this.pv.tshadowMap;\n\t\trenderer.shadowMap.autoUpdate = this.pv.shadowMapAutoUpdate;\n\t\trenderer.shadowMap.needsUpdate = this.pv.shadowMapNeedsUpdate;\n\t\trenderer.shadowMap.type = this.pv.shadowMapType as ShadowMapType;\n\t}\n\tprivate _updateRendererSortObjects(renderer: WebGLRenderer): void {\n\t\trenderer.sortObjects = this.pv.sortObjects;\n\t}\n\n\tprivate _updateRendererPixelRatio(renderer: WebGLRenderer) {\n\t\tconst pixelRatio = this.pv.tpixelRatio ? this.pv.pixelRatio : defaultPixelRatio();\n\t\tif (Poly.renderersController.printDebug()) {\n\t\t\tPoly.renderersController.printDebugMessage(`set renderer pixelRatio from '${this.path()}'`);\n\t\t\tPoly.renderersController.printDebugMessage({\n\t\t\t\tpixelRatio: pixelRatio,\n\t\t\t});\n\t\t}\n\t\trenderer.setPixelRatio(pixelRatio);\n\t}\n\tsetToneMapping(toneMapping: ToneMapping) {\n\t\tthis.p.toneMapping.set(toneMapping);\n\t}\n}\n","import {TypedNode} from '../_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {FlagsController} from '../utils/FlagsController';\n\n/**\n *\n *\n * TypedRopNode is the base class for all nodes that process outputs. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\n\nexport class TypedRopNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.ROP, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.ROP;\n\t}\n\n\tpublic override readonly flags: FlagsController = new FlagsController(this);\n\n\toverride initializeBaseNode() {\n\t\tthis.dirtyController.addPostDirtyHook('cook_immediately', () => {\n\t\t\tthis.cookController.cookMainWithoutInputs();\n\t\t});\n\t}\n\n\toverride cook() {\n\t\tthis.cookController.endCook();\n\t}\n}\n\nexport type BaseRopNodeType = TypedRopNode<NodeParamsConfig>;\nexport class BaseRopNodeClass extends TypedRopNode<NodeParamsConfig> {}\n","import { BufferAttribute } from 'three';\nimport { mergeGeometries, mergeVertices } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nexport function getGroupMaterialIndicesAttribute( geometry, materials, allMaterials ) {\n\n\tconst indexAttr = geometry.index;\n\tconst posAttr = geometry.attributes.position;\n\tconst vertCount = posAttr.count;\n\tconst totalCount = indexAttr ? indexAttr.count : vertCount;\n\tlet groups = geometry.groups;\n\tif ( groups.length === 0 ) {\n\n\t\tgroups = [ { count: totalCount, start: 0, materialIndex: 0 } ];\n\n\t}\n\n\t// use an array with the minimum precision required to store all material id references.\n\tlet materialArray;\n\tif ( allMaterials.length <= 255 ) {\n\n\t\tmaterialArray = new Uint8Array( vertCount );\n\n\t} else {\n\n\t\tmaterialArray = new Uint16Array( vertCount );\n\n\t}\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\t\tconst start = group.start;\n\t\tconst count = group.count;\n\t\tconst endCount = Math.min( count, totalCount - start );\n\n\t\tconst mat = Array.isArray( materials ) ? materials[ group.materialIndex ] : materials;\n\t\tconst materialIndex = allMaterials.indexOf( mat );\n\n\t\tfor ( let j = 0; j < endCount; j ++ ) {\n\n\t\t\tlet index = start + j;\n\t\t\tif ( indexAttr ) {\n\n\t\t\t\tindex = indexAttr.getX( index );\n\n\t\t\t}\n\n\t\t\tmaterialArray[ index ] = materialIndex;\n\n\t\t}\n\n\t}\n\n\treturn new BufferAttribute( materialArray, 1, false );\n\n}\n\nexport function trimToAttributes( geometry, attributes ) {\n\n\t// trim any unneeded attributes\n\tif ( attributes ) {\n\n\t\tfor ( const key in geometry.attributes ) {\n\n\t\t\tif ( ! attributes.includes( key ) ) {\n\n\t\t\t\tgeometry.deleteAttribute( key );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport function setCommonAttributes( geometry, options ) {\n\n\tconst { attributes = [], normalMapRequired = false } = options;\n\n\tif ( ! geometry.attributes.normal && ( attributes && attributes.includes( 'normal' ) ) ) {\n\n\t\tgeometry.computeVertexNormals();\n\n\t}\n\n\tif ( ! geometry.attributes.uv && ( attributes && attributes.includes( 'uv' ) ) ) {\n\n\t\tconst vertCount = geometry.attributes.position.count;\n\t\tgeometry.setAttribute( 'uv', new BufferAttribute( new Float32Array( vertCount * 2 ), 2, false ) );\n\n\t}\n\n\tif ( ! geometry.attributes.tangent && ( attributes && attributes.includes( 'tangent' ) ) ) {\n\n\t\tif ( normalMapRequired ) {\n\n\t\t\t// computeTangents requires an index buffer\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tgeometry = mergeVertices( geometry );\n\n\t\t\t}\n\n\t\t\tgeometry.computeTangents();\n\n\t\t} else {\n\n\t\t\tconst vertCount = geometry.attributes.position.count;\n\t\t\tgeometry.setAttribute( 'tangent', new BufferAttribute( new Float32Array( vertCount * 4 ), 4, false ) );\n\n\t\t}\n\n\t}\n\n\tif ( ! geometry.attributes.color && ( attributes && attributes.includes( 'color' ) ) ) {\n\n\t\tconst vertCount = geometry.attributes.position.count;\n\t\tconst array = new Float32Array( vertCount * 4 );\n\t\tarray.fill( 1.0 );\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( array, 4 ) );\n\n\t}\n\n\tif ( ! geometry.index ) {\n\n\t\t// TODO: compute a typed array\n\t\tconst indexCount = geometry.attributes.position.count;\n\t\tconst array = new Array( indexCount );\n\t\tfor ( let i = 0; i < indexCount; i ++ ) {\n\n\t\t\tarray[ i ] = i;\n\n\t\t}\n\n\t\tgeometry.setIndex( array );\n\n\t}\n\n}\n\nexport function mergeMeshes( meshes, options = {} ) {\n\n\toptions = { attributes: null, cloneGeometry: true, ...options };\n\n\tconst transformedGeometry = [];\n\tconst materialSet = new Set();\n\tfor ( let i = 0, l = meshes.length; i < l; i ++ ) {\n\n\t\t// save any materials\n\t\tconst mesh = meshes[ i ];\n\t\tif ( mesh.visible === false ) continue;\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tmesh.material.forEach( m => materialSet.add( m ) );\n\n\t\t} else {\n\n\t\t\tmaterialSet.add( mesh.material );\n\n\t\t}\n\n\t}\n\n\tconst materials = Array.from( materialSet );\n\tfor ( let i = 0, l = meshes.length; i < l; i ++ ) {\n\n\t\t// ensure the matrix world is up to date\n\t\tconst mesh = meshes[ i ];\n\t\tif ( mesh.visible === false ) continue;\n\n\t\tmesh.updateMatrixWorld();\n\n\t\t// apply the matrix world to the geometry\n\t\tconst originalGeometry = meshes[ i ].geometry;\n\t\tconst geometry = options.cloneGeometry ? originalGeometry.clone() : originalGeometry;\n\t\tgeometry.applyMatrix4( mesh.matrixWorld );\n\n\t\tif ( mesh.matrixWorld.determinant() < 0 ) {\n\n\t\t\tgeometry.index.array.reverse();\n\n\t\t}\n\n\t\t// ensure our geometry has common attributes\n\t\tsetCommonAttributes( geometry, {\n\t\t\tattributes: options.attributes,\n\t\t\tnormalMapRequired: ! ! mesh.material.normalMap,\n\t\t} );\n\t\ttrimToAttributes( geometry, options.attributes );\n\n\t\t// create the material index attribute\n\t\tconst materialIndexAttribute = getGroupMaterialIndicesAttribute( geometry, mesh.material, materials );\n\t\tgeometry.setAttribute( 'materialIndex', materialIndexAttribute );\n\n\t\ttransformedGeometry.push( geometry );\n\n\t}\n\n\tconst textureSet = new Set();\n\tmaterials.forEach( material => {\n\n\t\tfor ( const key in material ) {\n\n\t\t\tconst value = material[ key ];\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\ttextureSet.add( value );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tconst geometry = mergeGeometries( transformedGeometry, false );\n\tconst textures = Array.from( textureSet );\n\treturn { geometry, materials, textures };\n\n}\n","import { Mesh } from 'three';\nimport { SAH, MeshBVH, StaticGeometryGenerator } from 'three-mesh-bvh';\nimport { mergeMeshes } from '../utils/GeometryPreparationUtils.js';\n\nexport class PathTracingSceneGenerator {\n\n\tprepScene( scene ) {\n\n\t\tscene = Array.isArray( scene ) ? scene : [ scene ];\n\n\t\tconst meshes = [];\n\t\tconst lights = [];\n\n\t\tfor ( let i = 0, l = scene.length; i < l; i ++ ) {\n\n\t\t\tscene[ i ].traverseVisible( c => {\n\n\t\t\t\tif ( c.isSkinnedMesh || c.isMesh && c.morphTargetInfluences ) {\n\n\t\t\t\t\tconst generator = new StaticGeometryGenerator( c );\n\t\t\t\t\tgenerator.attributes = [ 'position', 'color', 'normal', 'tangent', 'uv', 'uv2' ];\n\t\t\t\t\tgenerator.applyWorldTransforms = false;\n\t\t\t\t\tconst mesh = new Mesh(\n\t\t\t\t\t\tgenerator.generate(),\n\t\t\t\t\t\tc.material,\n\t\t\t\t\t);\n\t\t\t\t\tmesh.matrixWorld.copy( c.matrixWorld );\n\t\t\t\t\tmesh.matrix.copy( c.matrixWorld );\n\t\t\t\t\tmesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );\n\t\t\t\t\tmeshes.push( mesh );\n\n\t\t\t\t} else if ( c.isMesh ) {\n\n\t\t\t\t\tmeshes.push( c );\n\n\t\t\t\t} else if (\n\t\t\t\t\tc.isRectAreaLight ||\n\t\t\t\t\tc.isSpotLight ||\n\t\t\t\t\tc.isPointLight ||\n\t\t\t\t\tc.isDirectionalLight\n\t\t\t\t) {\n\n\t\t\t\t\tlights.push( c );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn {\n\t\t\t...mergeMeshes( meshes, {\n\t\t\t\tattributes: [ 'position', 'normal', 'tangent', 'uv', 'color' ],\n\t\t\t} ),\n\t\t\tlights,\n\t\t};\n\n\t}\n\n\tgenerate( scene, options = {} ) {\n\n\t\tconst { materials, textures, geometry, lights } = this.prepScene( scene );\n\t\tconst bvhOptions = { strategy: SAH, ...options, maxLeafTris: 1 };\n\t\treturn {\n\t\t\tscene,\n\t\t\tmaterials,\n\t\t\ttextures,\n\t\t\tlights,\n\t\t\tbvh: new MeshBVH( geometry, bvhOptions ),\n\t\t};\n\n\t}\n\n}\n","import { WebGLRenderTarget, RGBAFormat, HalfFloatType, PMREMGenerator, DataTexture, EquirectangularReflectionMapping } from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { MaterialBase } from '../materials/MaterialBase.js';\nimport { utilsGLSL } from '../shader/common/utils.glsl.js';\n\nclass PMREMCopyMaterial extends MaterialBase {\n\n\tconstructor() {\n\n\t\tsuper( {\n\n\t\t\tuniforms: {\n\n\t\t\t\tenvMap: { value: null },\n\t\t\t\tblur: { value: 0 },\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}\n\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\t\t${ utilsGLSL }\n\n\t\t\t\tuniform sampler2D envMap;\n\t\t\t\tuniform float blur;\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 rayDirection = equirectUvToDirection( vUv );\n\t\t\t\t\tgl_FragColor = textureCubeUV( envMap, rayDirection, blur );\n\n\t\t\t\t}\n\n\t\t\t`,\n\n\t\t} );\n\n\t}\n\n}\n\nexport class BlurredEnvMapGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis.renderer = renderer;\n\t\tthis.pmremGenerator = new PMREMGenerator( renderer );\n\t\tthis.copyQuad = new FullScreenQuad( new PMREMCopyMaterial() );\n\t\tthis.renderTarget = new WebGLRenderTarget( 1, 1, { type: HalfFloatType, format: RGBAFormat } );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.pmremGenerator.dispose();\n\t\tthis.copyQuad.dispose();\n\t\tthis.renderTarget.dispose();\n\n\t}\n\n\tgenerate( texture, blur ) {\n\n\t\tconst { pmremGenerator, renderTarget, copyQuad, renderer } = this;\n\n\t\t// get the pmrem target\n\t\tconst pmremTarget = pmremGenerator.fromEquirectangular( texture );\n\n\t\t// set up the material\n\t\tconst { width, height } = texture.image;\n\t\trenderTarget.setSize( width, height );\n\t\tcopyQuad.material.envMap = pmremTarget.texture;\n\t\tcopyQuad.material.blur = blur;\n\n\t\t// render\n\t\tconst prevRenderTarget = renderer.getRenderTarget();\n\t\tconst prevClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = true;\n\t\tcopyQuad.render( renderer );\n\n\t\trenderer.setRenderTarget( prevRenderTarget );\n\t\trenderer.autoClear = prevClear;\n\n\t\t// read the data back\n\t\tconst buffer = new Uint16Array( width * height * 4 );\n\t\trenderer.readRenderTargetPixels( renderTarget, 0, 0, width, height, buffer );\n\n\t\tconst result = new DataTexture( buffer, width, height, RGBAFormat, HalfFloatType );\n\t\tresult.minFilter = texture.minFilter;\n\t\tresult.magFilter = texture.magFilter;\n\t\tresult.wrapS = texture.wrapS;\n\t\tresult.wrapT = texture.wrapT;\n\t\tresult.mapping = EquirectangularReflectionMapping;\n\t\tresult.needsUpdate = true;\n\n\t\t// dispose of the now unneeded target\n\t\tpmremTarget.dispose();\n\n\t\treturn result;\n\n\t}\n\n}\n","export class WorkerBase {\n\n\tconstructor( worker ) {\n\n\t\tthis.name = 'WorkerBase';\n\t\tthis.running = false;\n\t\tthis.worker = worker;\n\t\tthis.worker.onerror = e => {\n\n\t\t\tif ( e.message ) {\n\n\t\t\t\tthrow new Error( `${ this.name }: Could not create Web Worker with error \"${ e.message }\"` );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( `${ this.name }: Could not create Web Worker.` );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\trunTask() {}\n\n\tgenerate( ...args ) {\n\n\t\tif ( this.running ) {\n\n\t\t\tthrow new Error( 'GenerateMeshBVHWorker: Already running job.' );\n\n\t\t}\n\n\t\tif ( this.worker === null ) {\n\n\t\t\tthrow new Error( 'GenerateMeshBVHWorker: Worker has been disposed.' );\n\n\t\t}\n\n\t\tthis.running = true;\n\n\t\tconst promise = this.runTask( this.worker, ...args );\n\t\tpromise.finally( () => {\n\n\t\t\tthis.running = false;\n\n\t\t} );\n\n\t\treturn promise;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.worker.terminate();\n\t\tthis.worker = null;\n\n\t}\n\n}\n","import { Box3, BufferAttribute } from 'three';\nimport { MeshBVH } from '../core/MeshBVH.js';\nimport { WorkerBase } from './utils/WorkerBase.js';\n\nexport class GenerateMeshBVHWorker extends WorkerBase {\n\n\tconstructor() {\n\n\t\tconst worker = new Worker( new URL( './generateMeshBVH.worker.js', import.meta.url ), { type: 'module' } );\n\t\tsuper( worker );\n\t\tthis.name = 'GenerateMeshBVHWorker';\n\n\t}\n\n\trunTask( worker, geometry, options = {} ) {\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tif (\n\t\t\t\tgeometry.getAttribute( 'position' ).isInterleavedBufferAttribute ||\n\t\t\t\tgeometry.index && geometry.index.isInterleavedBufferAttribute\n\t\t\t) {\n\n\t\t\t\tthrow new Error( 'GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.' );\n\n\t\t\t}\n\n\t\t\tworker.onerror = e => {\n\n\t\t\t\treject( new Error( `GenerateMeshBVHWorker: ${ e.message }` ) );\n\n\t\t\t};\n\n\t\t\tworker.onmessage = e => {\n\n\t\t\t\tconst { data } = e;\n\n\t\t\t\tif ( data.error ) {\n\n\t\t\t\t\treject( new Error( data.error ) );\n\t\t\t\t\tworker.onmessage = null;\n\n\t\t\t\t} else if ( data.serialized ) {\n\n\t\t\t\t\tconst { serialized, position } = data;\n\t\t\t\t\tconst bvh = MeshBVH.deserialize( serialized, geometry, { setIndex: false } );\n\t\t\t\t\tconst boundsOptions = Object.assign( {\n\n\t\t\t\t\t\tsetBoundingBox: true,\n\n\t\t\t\t\t}, options );\n\n\t\t\t\t\t// we need to replace the arrays because they're neutered entirely by the\n\t\t\t\t\t// webworker transfer.\n\t\t\t\t\tgeometry.attributes.position.array = position;\n\t\t\t\t\tif ( serialized.index ) {\n\n\t\t\t\t\t\tif ( geometry.index ) {\n\n\t\t\t\t\t\t\tgeometry.index.array = serialized.index;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconst newIndex = new BufferAttribute( serialized.index, 1, false );\n\t\t\t\t\t\t\tgeometry.setIndex( newIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( boundsOptions.setBoundingBox ) {\n\n\t\t\t\t\t\tgeometry.boundingBox = bvh.getBoundingBox( new Box3() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( options.onProgress ) {\n\n\t\t\t\t\t\toptions.onProgress( data.progress );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( bvh );\n\t\t\t\t\tworker.onmessage = null;\n\n\t\t\t\t} else if ( options.onProgress ) {\n\n\t\t\t\t\toptions.onProgress( data.progress );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tconst index = geometry.index ? geometry.index.array : null;\n\t\t\tconst position = geometry.attributes.position.array;\n\t\t\tconst transferable = [ position ];\n\t\t\tif ( index ) {\n\n\t\t\t\ttransferable.push( index );\n\n\t\t\t}\n\n\t\t\tworker.postMessage( {\n\n\t\t\t\tindex,\n\t\t\t\tposition,\n\t\t\t\toptions: {\n\t\t\t\t\t...options,\n\t\t\t\t\tonProgress: null,\n\t\t\t\t\tincludedProgressCallback: Boolean( options.onProgress ),\n\t\t\t\t\tgroups: [ ... geometry.groups ],\n\t\t\t\t},\n\n\t\t\t}, transferable.map( arr => arr.buffer ).filter( v => ( typeof SharedArrayBuffer === 'undefined' ) || ! ( v instanceof SharedArrayBuffer ) ) );\n\n\t\t} );\n\n\t}\n\n}\n","import { PathTracingSceneGenerator } from '../core/PathTracingSceneGenerator.js';\nimport { SAH } from 'three-mesh-bvh';\nimport { GenerateMeshBVHWorker } from 'three-mesh-bvh/src/workers/GenerateMeshBVHWorker.js';\n\nexport class PathTracingSceneWorker extends PathTracingSceneGenerator {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis.bvhGenerator = new GenerateMeshBVHWorker();\n\n\t}\n\n\tgenerate( scene, options = {} ) {\n\n\t\tconst { bvhGenerator } = this;\n\t\tconst { geometry, materials, textures, lights, spotLights } = this.prepScene( scene );\n\n\t\tconst bvhOptions = { strategy: SAH, ...options, maxLeafTris: 1 };\n\t\tconst bvhPromise = bvhGenerator.generate( geometry, bvhOptions );\n\t\treturn bvhPromise.then( bvh => {\n\n\t\t\treturn {\n\t\t\t\tscene,\n\t\t\t\tmaterials,\n\t\t\t\ttextures,\n\t\t\t\tlights,\n\t\t\t\tspotLights,\n\t\t\t\tbvh,\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.bvhGenerator.dispose();\n\n\t}\n\n}\n","import {\n\tLine,\n\tLineBasicMaterial,\n\tMaterial,\n\tMatrix4,\n\tMesh,\n\tObject3D,\n\tVector2,\n\tWebGLRenderer,\n\tWebGLRenderTarget,\n\tObject3DEventMap,\n} from 'three';\nimport {WebGLCapabilities} from 'three/src/renderers/webgl/WebGLCapabilities';\nimport {Scene, Camera, MeshBasicMaterial} from 'three';\nimport {FullScreenQuad} from 'three/examples/jsm/postprocessing/Pass';\nimport {AbstractRenderer} from '../../../../viewers/Common';\nimport {isArray} from '../../../../../core/Type';\nimport {CoreSleep} from '../../../../../core/Sleep';\nimport {\n\tPathTracingRenderer,\n\tPathTracingSceneWorker,\n\tPathTracingSceneGenerator,\n\tBlurredEnvMapGenerator,\n\tPhysicalCamera,\n\tDenoiseMaterial,\n\tGeneratorResult,\n} from '../../../../../core/render/PBR/three-gpu-pathtracer';\nimport type {PathTracingRendererRopNode} from '../../PathTracingRenderer';\n\ninterface UpdateOptions {\n\t//\n\tresolutionScale: number;\n\tdisplayDebug: boolean;\n\tbounces: number;\n\ttransmissiveBounces: number;\n\tstableNoise: boolean;\n\tfilterGlossyFactor: number;\n\tbackgroundBlur: number;\n\tenvironmentIntensity: number;\n\ttiles: Vector2;\n\tmultipleImportanceSampling: boolean;\n\t//\n\tdenoise: boolean;\n\tdenoiseSigma: number;\n\tdenoiseThreshold: number;\n\tdenoiseKSigma: number;\n\t//\n\tmaxSamplesCount: number;\n\tsamplesPerAnimationFrame: number;\n\tf: Vector2;\n\t//\n\tuseWorker: boolean;\n}\n\ninterface PathtracingRendererContainerOptions {\n\tnode: PathTracingRendererRopNode;\n\twebGLRenderer: WebGLRenderer;\n\tpathTracingRenderer: PathTracingRenderer;\n\tfsQuad: FullScreenQuad;\n\tfsQuadMat: MeshBasicMaterial;\n\tdenoiseQuad: FullScreenQuad;\n\tdenoiseMat: DenoiseMaterial;\n}\nexport class PathTracingRendererContainer implements AbstractRenderer {\n\tpublic displayDebug = true;\n\tpublic backgroundBlur = 0.1;\n\tpublic maxSamplesCount = 1;\n\tpublic samplesPerAnimationFrame = 1;\n\tpublic frameRange = new Vector2();\n\tpublic resolutionScale = 0.5;\n\tprivate _useWorker: boolean = false;\n\tpublic domElement: HTMLCanvasElement;\n\tprivate _generated = false;\n\tprivate _generating = false;\n\tpublic readonly isPathTracingRendererContainer = true;\n\tprivate _denoiseActive: boolean = false;\n\n\tpublic readonly node: PathTracingRendererRopNode;\n\tpublic readonly webGLRenderer: WebGLRenderer;\n\tpublic readonly pathTracingRenderer: PathTracingRenderer;\n\tpublic readonly fsQuad: FullScreenQuad;\n\tpublic readonly fsQuadMat: MeshBasicMaterial;\n\tpublic readonly denoiseQuad: FullScreenQuad;\n\tpublic readonly denoiseMat: DenoiseMaterial;\n\tconstructor(options: PathtracingRendererContainerOptions) {\n\t\tthis.node = options.node;\n\t\tthis.webGLRenderer = options.webGLRenderer;\n\t\tthis.pathTracingRenderer = options.pathTracingRenderer;\n\t\tthis.fsQuad = options.fsQuad;\n\t\tthis.fsQuadMat = options.fsQuadMat;\n\t\tthis.denoiseQuad = options.denoiseQuad;\n\t\tthis.denoiseMat = options.denoiseMat;\n\t\tthis.domElement = this.webGLRenderer.domElement;\n\t}\n\tprivate _multipleImportanceSampling: boolean = true;\n\tupdate(options: UpdateOptions) {\n\t\tconst {pathTracingRenderer} = this;\n\n\t\tlet resetRequired = false;\n\t\tlet generateRequired = false;\n\n\t\tif (this.resolutionScale != options.resolutionScale) {\n\t\t\tthis.resolutionScale = options.resolutionScale;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (this.displayDebug != options.displayDebug) {\n\t\t\tthis.displayDebug = options.displayDebug;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (pathTracingRenderer.material.bounces != options.bounces) {\n\t\t\tpathTracingRenderer.material.bounces = options.bounces;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (pathTracingRenderer.material.transmissiveBounces != options.transmissiveBounces) {\n\t\t\tpathTracingRenderer.material.transmissiveBounces = options.transmissiveBounces;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (pathTracingRenderer.stableNoise != options.stableNoise) {\n\t\t\tpathTracingRenderer.stableNoise = options.stableNoise;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (pathTracingRenderer.material.filterGlossyFactor != options.filterGlossyFactor) {\n\t\t\tpathTracingRenderer.material.filterGlossyFactor = options.filterGlossyFactor;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (this.backgroundBlur != options.backgroundBlur) {\n\t\t\tthis.backgroundBlur = options.backgroundBlur;\n\t\t\tgenerateRequired = true;\n\t\t}\n\t\tif (pathTracingRenderer.material.environmentIntensity != options.environmentIntensity) {\n\t\t\tpathTracingRenderer.material.environmentIntensity = options.environmentIntensity;\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (!pathTracingRenderer.tiles.equals(options.tiles)) {\n\t\t\tpathTracingRenderer.tiles.set(options.tiles.x, options.tiles.y);\n\t\t\tresetRequired = true;\n\t\t}\n\t\tif (this._multipleImportanceSampling != options.multipleImportanceSampling) {\n\t\t\tthis._multipleImportanceSampling = options.multipleImportanceSampling;\n\t\t\tpathTracingRenderer.material.setDefine('FEATURE_MIS', Number(options.multipleImportanceSampling));\n\t\t\tresetRequired = true;\n\t\t}\n\t\t//\n\t\tthis._denoiseActive = options.denoise;\n\t\tthis.denoiseMat.sigma = options.denoiseSigma;\n\t\tthis.denoiseMat.threshold = options.denoiseThreshold;\n\t\tthis.denoiseMat.kSigma = options.denoiseKSigma;\n\t\t//\n\t\tthis._useWorker = options.useWorker;\n\n\t\t// for progressive render only, no reset/generate required\n\t\tif (this.maxSamplesCount > options.maxSamplesCount) {\n\t\t\t// do a reset if the new max samples count is lower than the current one\n\t\t\tresetRequired = true;\n\t\t}\n\t\tthis.maxSamplesCount = options.maxSamplesCount;\n\n\t\t// for sequence render only, no reset/generate required\n\t\tthis.samplesPerAnimationFrame = options.samplesPerAnimationFrame;\n\t\tthis.frameRange.copy(options.f);\n\n\t\t// reset/generate if required\n\t\tif (generateRequired) {\n\t\t\tthis.markAsNotGenerated();\n\t\t} else if (resetRequired) {\n\t\t\tthis.reset();\n\t\t}\n\t}\n\n\trender(scene: Scene, camera: PhysicalCamera) {\n\t\tthis.renderRealtime(scene, camera);\n\t}\n\n\tpbrRenderAllowed() {\n\t\treturn this._generating == false && this._generated == true;\n\t}\n\tmarkAsNotGenerated() {\n\t\tthis._generated = false;\n\t}\n\trenderRealtime(scene: Scene, camera: PhysicalCamera) {\n\t\tif (!this.pbrRenderAllowed()) {\n\t\t\tthis.webGLRenderer.render(scene, camera);\n\n\t\t\treturn;\n\t\t}\n\t\tconst maxSamplesCount = this.maxSamplesCount;\n\t\tif (this.pathTracingRenderer.samples >= maxSamplesCount) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pathTracingRenderer.material.physicalCamera.updateFrom(camera);\n\t\tthis._preRender(camera);\n\n\t\tthis.pathTracingRenderer.update();\n\n\t\tif (this.pathTracingRenderer.samples < 1) {\n\t\t\tthis.webGLRenderer.render(scene, camera);\n\t\t}\n\n\t\tthis._postRender();\n\t}\n\tprivate _preRender(camera: Camera) {\n\t\tthis.pathTracingRenderer.camera = camera;\n\t\tcamera.updateMatrixWorld();\n\t\tthis._resetIfCameraUpdated(camera);\n\t}\n\tprivate _postRender() {\n\t\tthis.webGLRenderer.autoClear = false;\n\t\tconst quad = this._denoiseActive ? this.denoiseQuad : this.fsQuad;\n\t\tconst mat = this._denoiseActive ? this.denoiseMat : this.fsQuadMat;\n\t\tmat.map = this.pathTracingRenderer.target.texture;\n\t\tquad.render(this.webGLRenderer);\n\t\tthis.webGLRenderer.autoClear = true;\n\t}\n\tsamplesCount() {\n\t\treturn Math.floor(this.pathTracingRenderer.samples);\n\t}\n\tgetPixelRatio() {\n\t\treturn this.webGLRenderer.getPixelRatio();\n\t}\n\tcompile(scene: Object3D<Object3DEventMap>, camera: Camera, targetScene: Scene | null | undefined) {\n\t\treturn this.webGLRenderer.compile(scene, camera, targetScene);\n\t}\n\tdispose(): void {\n\t\t// Note:\n\t\t// it's best NOT to dispose the renderers here,\n\t\t// so that we can switch from one camera to the other in the editor.\n\t\t// If we were to dispose, re-using the renderers would fail.\n\t\t// this.webGLRenderer.dispose();\n\t\t// this.pathTracingRenderer.dispose();\n\t\t// this.fsQuadMat.dispose();\n\t}\n\tsetSize(w: number, h: number, setStyle: boolean) {\n\t\tthis.webGLRenderer.setSize(w, h, setStyle);\n\n\t\tthis.pathTracingRenderer.setSize(\n\t\t\tw * this.resolutionScale * globalThis.devicePixelRatio,\n\t\t\th * this.resolutionScale * globalThis.devicePixelRatio\n\t\t);\n\t\tthis.pathTracingRenderer.reset();\n\t}\n\tsetRenderTarget(\n\t\trenderTarget: WebGLRenderTarget | null,\n\t\tactiveCubeFace?: number | undefined,\n\t\tactiveMipmapLevel?: number | undefined\n\t) {\n\t\tthis.webGLRenderer.setRenderTarget(renderTarget, activeCubeFace, activeMipmapLevel);\n\t}\n\treadRenderTargetPixels(\n\t\trenderTarget: WebGLRenderTarget,\n\t\tx: number,\n\t\ty: number,\n\t\twidth: number,\n\t\theight: number,\n\t\tbuffer: Float32Array,\n\t\tactiveCubeFaceIndex?: number | undefined\n\t) {\n\t\treturn this.webGLRenderer.readRenderTargetPixels(\n\t\t\trenderTarget,\n\t\t\tx,\n\t\t\ty,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tbuffer,\n\t\t\tactiveCubeFaceIndex\n\t\t);\n\t}\n\tget capabilities(): WebGLCapabilities {\n\t\treturn this.webGLRenderer.capabilities;\n\t}\n\n\tprivate _generator = new PathTracingSceneGenerator();\n\tprivate _workerGenerator: PathTracingSceneWorker | undefined;\n\tprivate _generateRequired = false;\n\tasync generate(scene: Scene) {\n\t\tif (this._generating) {\n\t\t\tthis._generateRequired = true;\n\t\t\treturn;\n\t\t}\n\t\tconsole.warn('GENERATOR START');\n\t\tthis._generated = false;\n\t\tthis._generating = true;\n\t\tconst timeStart = performance.now();\n\n\t\tconst _restartIfRequired = () => {\n\t\t\tif (this._generateRequired) {\n\t\t\t\tthis._generateRequired = false;\n\t\t\t\tthis._generating = false;\n\t\t\t\tconsole.log('GENERATOR RESTART...');\n\t\t\t\tconst _this = this;\n\t\t\t\tfunction generate() {\n\t\t\t\t\t_this.generate(scene);\n\t\t\t\t}\n\t\t\t\tsetTimeout(generate, 20);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\n\t\tconst bgTexture = scene.environment;\n\t\tif (bgTexture) {\n\t\t\tconst generator = new BlurredEnvMapGenerator(this.webGLRenderer);\n\t\t\tconst blurredTex = generator.generate(bgTexture, this.backgroundBlur);\n\t\t\tthis.pathTracingRenderer.material.envMapInfo.updateFrom(blurredTex);\n\t\t\tawait CoreSleep.sleep(20);\n\t\t}\n\n\t\tif (_restartIfRequired()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// update matrices\n\t\tscene.updateMatrixWorld(true);\n\n\t\tprepareScene(scene);\n\n\t\tconst generateInThread = () => {\n\t\t\tthis._generator = this._generator || new PathTracingSceneGenerator();\n\t\t\treturn this._generator.generate(scene);\n\t\t};\n\t\tconst generateInWorker = async () => {\n\t\t\tthis._workerGenerator = this._workerGenerator || new PathTracingSceneWorker();\n\t\t\tconst result = await this._workerGenerator.generate(scene, {\n\t\t\t\tonProgress: (progress: number) => {},\n\t\t\t});\n\t\t\treturn result;\n\t\t};\n\t\tlet result: GeneratorResult | undefined;\n\t\ttry {\n\t\t\tresult = this._useWorker ? await generateInWorker() : generateInThread();\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\tthis._generating = false;\n\t\t\treturn;\n\t\t}\n\n\t\trestoreScene(scene);\n\t\tawait CoreSleep.sleep(20);\n\t\tif (_restartIfRequired()) {\n\t\t\treturn;\n\t\t}\n\t\tconst {bvh, textures, materials, lights} = result;\n\t\tconst geometry = bvh.geometry;\n\t\tconst material = this.pathTracingRenderer.material;\n\n\t\tmaterial.bvh.updateFrom(bvh);\n\t\tmaterial.attributesArray.updateFrom(\n\t\t\tgeometry.attributes.normal,\n\t\t\tgeometry.attributes.tangent,\n\t\t\tgeometry.attributes.uv,\n\t\t\tgeometry.attributes.color\n\t\t);\n\t\tmaterial.materialIndexAttribute.updateFrom(geometry.attributes.materialIndex);\n\t\tmaterial.textures.setTextures(this.webGLRenderer, 1024, 1024, textures);\n\t\tmaterial.materials.updateFrom(materials, textures);\n\t\t// lights\n\t\tconst iesTextures = lights.map((light) => light.iesTexture);\n\t\tmaterial.iesProfiles.updateFrom(this.webGLRenderer, iesTextures);\n\t\tmaterial.lights.updateFrom(lights, iesTextures);\n\t\tawait CoreSleep.sleep(20);\n\n\t\tif (_restartIfRequired()) {\n\t\t\treturn;\n\t\t}\n\t\tthis._generating = false;\n\t\tthis._generated = true;\n\t\tthis.reset();\n\t\tconsole.log('GENERATOR DONE', performance.now() - timeStart);\n\t}\n\treset() {\n\t\tif (!this._generated) {\n\t\t\treturn;\n\t\t}\n\n\t\t//\n\t\t// in order to avoid too frequent .reset() calls,\n\t\t// make sure to toggle damping off on the camera orbit controls\n\t\t//\n\t\tthis.pathTracingRenderer.reset();\n\t}\n\n\tprivate _previousCameraProjectionMatrix: Matrix4 = new Matrix4();\n\tprivate _previousCameraWorldMatrix: Matrix4 = new Matrix4();\n\tprivate _resetIfCameraUpdated(camera: Camera) {\n\t\tif (\n\t\t\tthis._previousCameraProjectionMatrix.equals(camera.projectionMatrix) &&\n\t\t\tthis._previousCameraWorldMatrix.equals(camera.matrixWorld)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis._previousCameraProjectionMatrix.copy(camera.projectionMatrix);\n\t\tthis._previousCameraWorldMatrix.copy(camera.matrixWorld);\n\t\tthis.reset();\n\t}\n}\n\nconst previousParent: Map<Object3D, Object3D> = new Map();\nfunction prepareScene(scene: Scene) {\n\tfunction _saveAndSetObjectState(object: Object3D) {\n\t\tif (!object.parent) {\n\t\t\treturn;\n\t\t}\n\n\t\tpreviousParent.set(object, object.parent);\n\t\tobject.parent.remove(object);\n\t}\n\tfunction _isValidMaterial(material: Material) {\n\t\tif (material instanceof LineBasicMaterial) {\n\t\t\treturn false;\n\t\t}\n\t\tif (material instanceof MeshBasicMaterial) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tfunction _isValidObject(object: Object3D) {\n\t\tif (object instanceof Line) {\n\t\t\treturn false;\n\t\t}\n\t\tconst material = (object as Mesh).material;\n\t\tif (isArray(material)) {\n\t\t\tfor (const mat of material) {\n\t\t\t\tif (!_isValidMaterial(mat)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (!_isValidMaterial(material)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tconst objectsToRemoveFromHierarchy: Object3D[] = [];\n\tscene.traverse((object) => {\n\t\tif (!_isValidObject(object)) {\n\t\t\tobjectsToRemoveFromHierarchy.push(object);\n\t\t}\n\t});\n\tfor (const object of objectsToRemoveFromHierarchy) {\n\t\t_saveAndSetObjectState(object);\n\t}\n}\n\nfunction restoreScene(scene: Scene) {\n\tpreviousParent.forEach((parent, object) => {\n\t\tparent.add(object);\n\t});\n\n\tpreviousParent.clear();\n}\n","import {Vector2, Vector3, Vector4} from 'three';\nimport type {CoreObjectType, ObjectContent} from '../../../../../core/geometry/ObjectContent';\n\nexport type ValueArrayByObject = WeakMap<ObjectContent<CoreObjectType>, number[]>;\n\nexport type VectorComponent = 'x' | 'y' | 'z' | 'w';\nexport const COMPONENT_NAMES: Array<VectorComponent> = ['x', 'y', 'z', 'w'];\n\nexport function initArrayIfRequired<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tarraysByGeometryUuid: ValueArrayByObject,\n\tarrayLength: number\n) {\n\tconst currentArray = arraysByGeometryUuid.get(object);\n\tif (currentArray) {\n\t\t// only create new array if we need more point, or as soon as the length is different?\n\t\tif (currentArray.length < arrayLength) {\n\t\t\tarraysByGeometryUuid.set(object, new Array(arrayLength));\n\t\t}\n\t} else {\n\t\tarraysByGeometryUuid.set(object, new Array(arrayLength));\n\t}\n\treturn arraysByGeometryUuid.get(object);\n}\n\nexport function vectorByAttribSize(size: number) {\n\tswitch (size) {\n\t\tcase 2:\n\t\t\treturn new Vector2(0, 0);\n\t\tcase 3:\n\t\t\treturn new Vector3(0, 0, 0);\n\t\tcase 4:\n\t\t\treturn new Vector4(0, 0, 0, 0);\n\t}\n}\n","import {BufferAttribute} from 'three';\nimport {CoreGroup} from '../../../../../core/geometry/Group';\nimport {CoreAttribute} from '../../../../../core/geometry/Attribute';\nimport {ValueArrayByObject, initArrayIfRequired} from './Common';\nimport {hasGroupFromParams, AttribCreateSopNodeParams} from '../../../../operations/sop/utils/attribCreate/Common';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {pointsFromObject, pointsFromObjectFromGroup} from '../../../../../core/geometry/entities/point/CorePointUtils';\nimport {corePointClassFactory} from '../../../../../core/geometry/CoreObjectFactory';\nimport {ObjectContent, CoreObjectType} from '../../../../../core/geometry/ObjectContent';\nimport {CorePoint} from '../../../../../core/geometry/entities/point/CorePoint';\n// import {filterObjectsFromCoreGroup} from '../../../../../core/geometry/Mask';\n\ninterface ArraysByObject {\n\tX: ValueArrayByObject;\n\tY: ValueArrayByObject;\n\tZ: ValueArrayByObject;\n\tW: ValueArrayByObject;\n}\nconst _arraysByObject: ArraysByObject = {\n\tX: new WeakMap(),\n\tY: new WeakMap(),\n\tZ: new WeakMap(),\n\tW: new WeakMap(),\n};\nconst arraysByGeometryUuid = [_arraysByObject.X, _arraysByObject.Y, _arraysByObject.Z, _arraysByObject.W];\nexport async function addPointAttribute(\n\tattribType: AttribType,\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst objects = coreGroup.allObjects(); // filterObjectsFromCoreGroup(coreGroup, {group: params.group.value}); //coreGroup.allObjects();\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\tfor (const object of objects) {\n\t\t\t\tawait _addNumericAttributeToPoints(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\tfor (const object of objects) {\n\t\t\t\tawait _addStringAttributeToPoints(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nasync function _addNumericAttributeToPoints<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst corePointClass = corePointClassFactory(object);\n\n\tconst points: CorePoint<CoreObjectType>[] = [];\n\tpointsFromObjectFromGroup(object, params.group.value, points);\n\tconst attribName = CoreAttribute.remapName(params.name.value);\n\tconst size = params.size.value;\n\n\tconst param = [params.value1, params.value2, params.value3, params.value4][size - 1];\n\n\tif (param.hasExpression()) {\n\t\tif (!corePointClass.hasAttribute(object, attribName)) {\n\t\t\tcorePointClass.addNumericAttribute(object, attribName, size, param.value);\n\t\t}\n\n\t\tconst attrib = corePointClass.attribute(object, attribName) as BufferAttribute;\n\t\tif (!attrib) {\n\t\t\treturn;\n\t\t}\n\t\tattrib.needsUpdate = true;\n\t\tconst array = attrib.array;\n\t\tif (size == 1) {\n\t\t\tconst paramN = params.value1;\n\t\t\tif (paramN.expressionController) {\n\t\t\t\tif (paramN.expressionController.entitiesDependent()) {\n\t\t\t\t\tawait paramN.expressionController.computeExpressionForPoints(points, (point, value: number) => {\n\t\t\t\t\t\tarray[point.index() * size + 0] = value;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfor (const point of points) {\n\t\t\t\t\t\tarray[point.index() * size + 0] = paramN.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst vparam = [params.value2, params.value3, params.value4][size - 2];\n\t\t\tconst components = vparam.components;\n\t\t\tconst tmpArrays = new Array(components.length);\n\n\t\t\tfor (let i = 0; i < components.length; i++) {\n\t\t\t\tconst componentParam = components[i];\n\t\t\t\tif (componentParam.hasExpression() && componentParam.expressionController) {\n\t\t\t\t\ttmpArrays[i] = initArrayIfRequired(object, arraysByGeometryUuid[i], points.length);\n\t\t\t\t\tif (componentParam.expressionController.entitiesDependent()) {\n\t\t\t\t\t\tawait componentParam.expressionController.computeExpressionForPoints(\n\t\t\t\t\t\t\tpoints,\n\t\t\t\t\t\t\t(point, value: number) => {\n\t\t\t\t\t\t\t\t// array[point.index()*this.pv.size+i] = value\n\t\t\t\t\t\t\t\ttmpArrays[i][point.index()] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const point of points) {\n\t\t\t\t\t\t\ttmpArrays[i][point.index()] = componentParam.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst value = componentParam.value;\n\t\t\t\t\tfor (const point of points) {\n\t\t\t\t\t\tarray[point.index() * size + i] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// commit the tmp values\n\t\t\tfor (let j = 0; j < tmpArrays.length; j++) {\n\t\t\t\tconst tmpArray = tmpArrays[j];\n\t\t\t\tif (tmpArray != null) {\n\t\t\t\t\tfor (let i = 0; i < tmpArray.length; i++) {\n\t\t\t\t\t\tconst newVal = tmpArray[i];\n\t\t\t\t\t\tif (newVal != null) {\n\t\t\t\t\t\t\tarray[i * size + j] = newVal;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n\nasync function _addStringAttributeToPoints<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst corePointClass = corePointClassFactory(object);\n\n\tconst points: CorePoint<CoreObjectType>[] = [];\n\tpointsFromObjectFromGroup(object, params.group.value, points);\n\tconst param = params.string;\n\tconst attribName = params.name.value;\n\n\tlet stringValues: string[] = new Array(points.length);\n\tif (param.hasExpression() && param.expressionController) {\n\t\t// if a group is given, we prefill the existing stringValues\n\t\tif (hasGroupFromParams(params)) {\n\t\t\t// create attrib if non existent\n\n\t\t\tif (!corePointClass.hasAttribute(object, attribName)) {\n\t\t\t\tconst tmpIndexData = CoreAttribute.arrayToIndexedArrays(['']);\n\t\t\t\tcorePointClass.setIndexedAttribute(object, attribName, tmpIndexData['values'], tmpIndexData['indices']);\n\t\t\t}\n\t\t\tconst allPoints: CorePoint<CoreObjectType>[] = [];\n\t\t\tpointsFromObject(object, allPoints);\n\t\t\tstringValues = stringValues.length != allPoints.length ? new Array(allPoints.length) : stringValues;\n\t\t\tfor (const point of allPoints) {\n\t\t\t\tlet currentValue = point.stringAttribValue(attribName);\n\t\t\t\tif (currentValue == null) {\n\t\t\t\t\tcurrentValue = '';\n\t\t\t\t}\n\t\t\t\tstringValues[point.index()] = currentValue;\n\t\t\t}\n\t\t}\n\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForPoints(points, (point, value) => {\n\t\t\t\tstringValues[point.index()] = value;\n\t\t\t});\n\t\t} else {\n\t\t\tfor (const point of points) {\n\t\t\t\tstringValues[point.index()] = param.value;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n\n\tconst indexData = CoreAttribute.arrayToIndexedArrays(stringValues);\n\t// const geometry = coreObject.coreGeometry();\n\t// if (geometry) {\n\tcorePointClass.setIndexedAttribute(object, attribName, indexData['values'], indexData['indices']);\n\t// }\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {CoreAttribute} from '../../../../../core/geometry/Attribute';\nimport {ValueArrayByObject, initArrayIfRequired} from './Common';\nimport {AttribCreateSopNodeParams} from '../../../../operations/sop/utils/attribCreate/Common';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {verticesFromObjectFromGroup} from '../../../../../core/geometry/entities/vertex/CoreVertexUtils';\nimport {coreVertexClassFactory} from '../../../../../core/geometry/CoreObjectFactory';\nimport {CoreObjectType, ObjectContent} from '../../../../../core/geometry/ObjectContent';\nimport {CoreVertex} from '../../../../../core/geometry/entities/vertex/CoreVertex';\n// import {filterObjectsFromCoreGroup} from '../../../../../core/geometry/Mask';\n\ninterface ArraysByObject {\n\tX: ValueArrayByObject;\n\tY: ValueArrayByObject;\n\tZ: ValueArrayByObject;\n\tW: ValueArrayByObject;\n}\nconst _arraysByObject: ArraysByObject = {\n\tX: new WeakMap(),\n\tY: new WeakMap(),\n\tZ: new WeakMap(),\n\tW: new WeakMap(),\n};\nconst arraysByGeometryUuid = [_arraysByObject.X, _arraysByObject.Y, _arraysByObject.Z, _arraysByObject.W];\n\nexport async function addVertexAttribute(\n\tattribType: AttribType,\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst objects = coreGroup.allObjects(); //filterObjectsFromCoreGroup(coreGroup, {group: params.group.value});\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\tfor (const object of objects) {\n\t\t\t\tawait _addNumericAttributeToVertices(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\tfor (const object of objects) {\n\t\t\t\tawait _addStringAttributeToVertices(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nasync function _addNumericAttributeToVertices<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst vertices: CoreVertex<T>[] = [];\n\tverticesFromObjectFromGroup(object, params.group.value, vertices);\n\tconst attribName = CoreAttribute.remapName(params.name.value);\n\tconst size = params.size.value;\n\n\tconst param = [params.value1, params.value2, params.value3, params.value4][size - 1];\n\n\tif (param.hasExpression()) {\n\t\tconst vertexClass = coreVertexClassFactory(object);\n\t\tlet attribute = vertexClass.attribute(object, attribName);\n\t\tif (!attribute) {\n\t\t\tconst verticesCount = vertexClass.entitiesCount(object);\n\t\t\tconst values = new Array(verticesCount * size).fill(0);\n\t\t\tattribute = {array: values, itemSize: size, isString: false};\n\t\t\tvertexClass.addAttribute(object, attribName, attribute);\n\t\t}\n\n\t\t// attribute.needsUpdate = true;\n\t\tconst array = attribute.array as number[];\n\t\tif (size == 1) {\n\t\t\tconst paramN = params.value1;\n\t\t\tif (paramN.expressionController) {\n\t\t\t\tif (paramN.expressionController.entitiesDependent()) {\n\t\t\t\t\tawait paramN.expressionController.computeExpressionForVertices(\n\t\t\t\t\t\tvertices,\n\t\t\t\t\t\t(primitive, value: number) => {\n\t\t\t\t\t\t\tarray[primitive.index() * size + 0] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tfor (const vertex of vertices) {\n\t\t\t\t\t\tarray[vertex.index() * size + 0] = paramN.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst vparam = [params.value2, params.value3, params.value4][size - 2];\n\t\t\tconst components = vparam.components;\n\t\t\tconst tmpArrays = new Array(components.length);\n\n\t\t\tfor (let i = 0; i < components.length; i++) {\n\t\t\t\tconst componentParam = components[i];\n\t\t\t\tif (componentParam.hasExpression() && componentParam.expressionController) {\n\t\t\t\t\ttmpArrays[i] = initArrayIfRequired(object, arraysByGeometryUuid[i], vertices.length);\n\t\t\t\t\tif (componentParam.expressionController.entitiesDependent()) {\n\t\t\t\t\t\tawait componentParam.expressionController.computeExpressionForVertices(\n\t\t\t\t\t\t\tvertices,\n\t\t\t\t\t\t\t(point, value: number) => {\n\t\t\t\t\t\t\t\t// array[point.index()*this.pv.size+i] = value\n\t\t\t\t\t\t\t\ttmpArrays[i][point.index()] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const vertex of vertices) {\n\t\t\t\t\t\t\ttmpArrays[i][vertex.index()] = componentParam.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst value = componentParam.value;\n\t\t\t\t\tfor (const vertex of vertices) {\n\t\t\t\t\t\tarray[vertex.index() * size + i] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// commit the tmp values\n\t\t\tfor (let j = 0; j < tmpArrays.length; j++) {\n\t\t\t\tconst tmpArray = tmpArrays[j];\n\t\t\t\tif (tmpArray != null) {\n\t\t\t\t\tfor (let i = 0; i < tmpArray.length; i++) {\n\t\t\t\t\t\tconst newVal = tmpArray[i];\n\t\t\t\t\t\tif (newVal != null) {\n\t\t\t\t\t\t\tarray[i * size + j] = newVal;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n\nasync function _addStringAttributeToVertices<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst vertices: CoreVertex<T>[] = [];\n\tverticesFromObjectFromGroup(object, params.group.value, vertices);\n\tconst param = params.string;\n\tconst attribName = params.name.value;\n\n\tif (param.hasExpression() && param.expressionController) {\n\t\t// if a group is given, we prefill the existing stringValues\n\t\t// create attrib if non existent\n\t\tconst vertexClass = coreVertexClassFactory(object);\n\t\tconst verticesCount = vertexClass.entitiesCount(object);\n\t\tconst values = new Array(verticesCount).fill('');\n\t\tlet attribute = vertexClass.attribute(object, attribName);\n\t\tif (!attribute) {\n\t\t\tattribute = {array: values, itemSize: 1, isString: true};\n\t\t\tvertexClass.addAttribute(object, attribName, attribute);\n\t\t}\n\n\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForVertices(vertices, (vertex, value) => {\n\t\t\t\tvalues[vertex.index()] = value;\n\t\t\t});\n\t\t} else {\n\t\t\tfor (const vertex of vertices) {\n\t\t\t\tvalues[vertex.index()] = param.value;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {CoreAttribute} from '../../../../../core/geometry/Attribute';\nimport {ValueArrayByObject, initArrayIfRequired} from './Common';\nimport {AttribCreateSopNodeParams} from '../../../../operations/sop/utils/attribCreate/Common';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {primitivesFromObjectFromGroup} from '../../../../../core/geometry/entities/primitive/CorePrimitiveUtils';\nimport {corePrimitiveClassFactory} from '../../../../../core/geometry/CoreObjectFactory';\nimport {CoreObjectType, ObjectContent} from '../../../../../core/geometry/ObjectContent';\nimport {CorePrimitive} from '../../../../../core/geometry/entities/primitive/CorePrimitive';\n// import {filterObjectsFromCoreGroup} from '../../../../../core/geometry/Mask';\n\ninterface ArraysByObject {\n\tX: ValueArrayByObject;\n\tY: ValueArrayByObject;\n\tZ: ValueArrayByObject;\n\tW: ValueArrayByObject;\n}\nconst _arraysByObject: ArraysByObject = {\n\tX: new WeakMap(),\n\tY: new WeakMap(),\n\tZ: new WeakMap(),\n\tW: new WeakMap(),\n};\nconst arraysByGeometryUuid = [_arraysByObject.X, _arraysByObject.Y, _arraysByObject.Z, _arraysByObject.W];\n\nexport async function addPrimitiveAttribute(\n\tattribType: AttribType,\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst objects = coreGroup.allObjects(); //filterObjectsFromCoreGroup(coreGroup, {group: params.group.value});\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\tfor (const object of objects) {\n\t\t\t\tawait _addNumericAttributeToPrimitives(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\tfor (const object of objects) {\n\t\t\t\tawait _addStringAttributeToPrimitives(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nasync function _addNumericAttributeToPrimitives<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst primitives: CorePrimitive<CoreObjectType>[] = [];\n\tprimitivesFromObjectFromGroup(object, params.group.value, primitives);\n\tconst attribName = CoreAttribute.remapName(params.name.value);\n\tconst size = params.size.value;\n\n\tconst param = [params.value1, params.value2, params.value3, params.value4][size - 1];\n\n\tif (param.hasExpression()) {\n\t\tconst primitiveClass = corePrimitiveClassFactory(object);\n\t\tlet attribute = primitiveClass.attribute(object, attribName);\n\t\tif (!attribute) {\n\t\t\tconst primitivesCount = primitiveClass.entitiesCount(object);\n\t\t\tconst values = new Array(primitivesCount * size).fill(0);\n\t\t\tattribute = {\n\t\t\t\tarray: values,\n\t\t\t\titemSize: size,\n\t\t\t\tisString: false,\n\t\t\t};\n\t\t\tprimitiveClass.addAttribute(object, attribName, attribute);\n\t\t}\n\n\t\t// attribute.needsUpdate = true;\n\t\tconst array = attribute.array as number[];\n\t\tif (size == 1) {\n\t\t\tconst paramN = params.value1;\n\t\t\tif (paramN.expressionController) {\n\t\t\t\tif (paramN.expressionController.entitiesDependent()) {\n\t\t\t\t\tawait paramN.expressionController.computeExpressionForPrimitives(\n\t\t\t\t\t\tprimitives,\n\t\t\t\t\t\t(primitive, value: number) => {\n\t\t\t\t\t\t\tarray[primitive.index() * size + 0] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tfor (const primitive of primitives) {\n\t\t\t\t\t\tarray[primitive.index() * size + 0] = paramN.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst vparam = [params.value2, params.value3, params.value4][size - 2];\n\t\t\tconst components = vparam.components;\n\t\t\tconst tmpArrays = new Array(components.length);\n\n\t\t\tfor (let i = 0; i < components.length; i++) {\n\t\t\t\tconst componentParam = components[i];\n\t\t\t\tif (componentParam.hasExpression() && componentParam.expressionController) {\n\t\t\t\t\ttmpArrays[i] = initArrayIfRequired(object, arraysByGeometryUuid[i], primitives.length);\n\t\t\t\t\tif (componentParam.expressionController.entitiesDependent()) {\n\t\t\t\t\t\tawait componentParam.expressionController.computeExpressionForPrimitives(\n\t\t\t\t\t\t\tprimitives,\n\t\t\t\t\t\t\t(point, value: number) => {\n\t\t\t\t\t\t\t\t// array[point.index()*this.pv.size+i] = value\n\t\t\t\t\t\t\t\ttmpArrays[i][point.index()] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const primitive of primitives) {\n\t\t\t\t\t\t\ttmpArrays[i][primitive.index()] = componentParam.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst value = componentParam.value;\n\t\t\t\t\tfor (const primitive of primitives) {\n\t\t\t\t\t\tarray[primitive.index() * size + i] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// commit the tmp values\n\t\t\tfor (let j = 0; j < tmpArrays.length; j++) {\n\t\t\t\tconst tmpArray = tmpArrays[j];\n\t\t\t\tif (tmpArray != null) {\n\t\t\t\t\tfor (let i = 0; i < tmpArray.length; i++) {\n\t\t\t\t\t\tconst newVal = tmpArray[i];\n\t\t\t\t\t\tif (newVal != null) {\n\t\t\t\t\t\t\tarray[i * size + j] = newVal;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n\nasync function _addStringAttributeToPrimitives<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopNodeParams\n) {\n\tconst primitives: CorePrimitive<T>[] = [];\n\tprimitivesFromObjectFromGroup(object, params.group.value, primitives);\n\tconst param = params.string;\n\tconst attribName = params.name.value;\n\n\tif (param.hasExpression() && param.expressionController) {\n\t\t// if a group is given, we prefill the existing stringValues\n\t\t// create attrib if non existent\n\t\tconst primitiveClass = corePrimitiveClassFactory(object);\n\t\tconst primitivesCount = primitiveClass.entitiesCount(object);\n\t\tconst values = new Array(primitivesCount).fill('');\n\t\tlet attribute = primitiveClass.attribute(object, attribName);\n\t\tif (!attribute) {\n\t\t\tattribute = {array: values, itemSize: 1, isString: true};\n\t\t\tprimitiveClass.addAttribute(object, attribName, attribute);\n\t\t}\n\n\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForPrimitives(primitives, (primitive, value) => {\n\t\t\t\tvalues[primitive.index()] = value;\n\t\t\t});\n\t\t} else {\n\t\t\tfor (const primitive of primitives) {\n\t\t\t\tvalues[primitive.index()] = param.value;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n","import {Vector2, Vector3, Vector4} from 'three';\nimport {CoreGroup} from '../../../../../core/geometry/Group';\nimport {COMPONENT_NAMES, vectorByAttribSize} from './Common';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {CoreMask} from '../../../../../core/geometry/Mask';\nimport {AttribCreateSopParams} from '../../../../operations/sop/AttribCreate';\nimport {CoreObjectType} from '../../../../../core/geometry/ObjectContent';\nimport {BaseCoreObject} from '../../../../../core/geometry/entities/object/BaseCoreObject';\nimport {AttribCreateSopNodeParams, defaultAttribValue} from '../../../../operations/sop/utils/attribCreate/Common';\n\nexport async function addObjectAttributeWithExpression(\n\tattribType: AttribType,\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams,\n\tpv: AttribCreateSopParams\n) {\n\tconst coreObjects = CoreMask.filterCoreObjects(coreGroup, pv, coreGroup.allCoreObjects());\n\n\t// add attrib if non existent\n\tconst attribName = pv.name;\n\tconst allCoreObjects = coreGroup.allCoreObjects();\n\tconst defaultValue = defaultAttribValue(pv);\n\tif (defaultValue != null) {\n\t\tfor (const coreObject of allCoreObjects) {\n\t\t\tif (!coreObject.hasAttribute(attribName)) {\n\t\t\t\tcoreObject.setAttribValue(attribName, defaultValue);\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC:\n\t\t\tawait _addNumericAttributeToObject(coreObjects, params, pv);\n\t\t\treturn;\n\t\tcase AttribType.STRING:\n\t\t\tawait _addStringAttributeToObject(coreObjects, params, pv);\n\t\t\treturn;\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nasync function _addNumericAttributeToObject<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<T>[],\n\tparams: AttribCreateSopNodeParams,\n\tpv: AttribCreateSopParams\n) {\n\tconst param = [params.value1, params.value2, params.value3, params.value4][pv.size - 1];\n\tconst attribName = pv.name;\n\tif (param.hasExpression()) {\n\t\tif (pv.size == 1) {\n\t\t\tif (param.expressionController) {\n\t\t\t\tif (param.expressionController?.entitiesDependent()) {\n\t\t\t\t\tawait param.expressionController.computeExpressionForObjects(coreObjects, (coreObject, value) => {\n\t\t\t\t\t\tcoreObject.setAttribValue(attribName, value);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfor (const coreObject of coreObjects) {\n\t\t\t\t\t\tcoreObject.setAttribValue(attribName, param.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst vparam = [params.value2, params.value3, params.value4][pv.size - 2];\n\t\t\tconst components = vparam.components;\n\t\t\tconst valuesByCoreObjectIndex: Map<number, Vector2 | Vector3 | Vector4> = new Map();\n\t\t\t// for (let component_param of params) {\n\t\t\t// \tvalues.push(component_param.value);\n\t\t\t// }\n\t\t\tconst initVector = vectorByAttribSize(pv.size);\n\t\t\tif (initVector) {\n\t\t\t\tfor (const coreObject of coreObjects) {\n\t\t\t\t\tvaluesByCoreObjectIndex.set(coreObject.index(), initVector.clone());\n\t\t\t\t}\n\t\t\t\tfor (let componentIndex = 0; componentIndex < components.length; componentIndex++) {\n\t\t\t\t\tconst component_param = components[componentIndex];\n\t\t\t\t\tconst component_name = COMPONENT_NAMES[componentIndex];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcomponent_param.hasExpression() &&\n\t\t\t\t\t\tcomponent_param.expressionController &&\n\t\t\t\t\t\tcomponent_param.expressionController.entitiesDependent()\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait component_param.expressionController.computeExpressionForObjects(\n\t\t\t\t\t\t\tcoreObjects,\n\t\t\t\t\t\t\t(coreObject, value) => {\n\t\t\t\t\t\t\t\tconst vector = valuesByCoreObjectIndex.get(coreObject.index()) as Vector4;\n\t\t\t\t\t\t\t\tvector[component_name] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const coreObject of coreObjects) {\n\t\t\t\t\t\t\tconst vector = valuesByCoreObjectIndex.get(coreObject.index()) as Vector4;\n\t\t\t\t\t\t\tvector[component_name] = component_param.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < coreObjects.length; i++) {\n\t\t\t\t\tconst coreObject = coreObjects[i];\n\t\t\t\t\tconst value = valuesByCoreObjectIndex.get(coreObject.index());\n\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\tcoreObject.setAttribValue(attribName, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n\nasync function _addStringAttributeToObject<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<T>[],\n\tparams: AttribCreateSopNodeParams,\n\tpv: AttribCreateSopParams\n) {\n\tconst param = params.string;\n\tconst attribName = pv.name;\n\tif (param.hasExpression() && param.expressionController) {\n\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForObjects(coreObjects, (coreObject, value) => {\n\t\t\t\tcoreObject.setAttribValue(attribName, value);\n\t\t\t});\n\t\t} else {\n\t\t\tfor (const coreObject of coreObjects) {\n\t\t\t\tcoreObject.setAttribValue(attribName, param.value);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n","import {Vector2, Vector3, Vector4} from 'three';\nimport {CoreGroup} from '../../../../../core/geometry/Group';\nimport {COMPONENT_NAMES, vectorByAttribSize} from './Common';\nimport {AttribCreateSopParams} from '../../../../operations/sop/AttribCreate';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {AttribCreateSopNodeParams} from '../../../../operations/sop/utils/attribCreate/Common';\n\nexport async function addCoreGroupAttribute(\n\tattribType: AttribType,\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams,\n\tpv: AttribCreateSopParams\n) {\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC:\n\t\t\tawait _addNumericAttributeToCoreGroup(coreGroup, params, pv);\n\t\t\treturn;\n\t\tcase AttribType.STRING:\n\t\t\tawait _addStringAttributeToCoreGroup(coreGroup, params, pv);\n\t\t\treturn;\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nasync function _addNumericAttributeToCoreGroup(\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams,\n\tpv: AttribCreateSopParams\n) {\n\tconst param = [params.value1, params.value2, params.value3, params.value4][pv.size - 1];\n\tconst attribName = pv.name;\n\tif (param.hasExpression()) {\n\t\tif (pv.size == 1) {\n\t\t\tif (param.expressionController) {\n\t\t\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\t\t\tawait param.expressionController.computeExpressionForCoreGroup(coreGroup, (coreGroup, value) => {\n\t\t\t\t\t\tcoreGroup.setAttribValue(attribName, value);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tcoreGroup.setAttribValue(attribName, param.value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst vparam = [params.value2, params.value3, params.value4][pv.size - 2];\n\t\t\tlet components = vparam.components;\n\t\t\tlet valuesByCoreObjectIndex: Map<number, Vector2 | Vector3 | Vector4> = new Map();\n\t\t\t// for (let component_param of params) {\n\t\t\t// \tvalues.push(component_param.value);\n\t\t\t// }\n\t\t\tconst initVector = vectorByAttribSize(pv.size);\n\t\t\tif (initVector) {\n\t\t\t\t// for (let coreObject of coreObjects) {\n\t\t\t\tvaluesByCoreObjectIndex.set(coreGroup.index(), initVector.clone());\n\t\t\t\t// }\n\t\t\t\tfor (let componentIndex = 0; componentIndex < components.length; componentIndex++) {\n\t\t\t\t\tconst component_param = components[componentIndex];\n\t\t\t\t\tconst component_name = COMPONENT_NAMES[componentIndex];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcomponent_param.hasExpression() &&\n\t\t\t\t\t\tcomponent_param.expressionController &&\n\t\t\t\t\t\tcomponent_param.expressionController.entitiesDependent()\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait component_param.expressionController.computeExpressionForCoreGroup(\n\t\t\t\t\t\t\tcoreGroup,\n\t\t\t\t\t\t\t(coreGroup, value) => {\n\t\t\t\t\t\t\t\tconst vector = valuesByCoreObjectIndex.get(coreGroup.index()) as Vector4;\n\t\t\t\t\t\t\t\tvector[component_name] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// for (let coreObject of coreObjects) {\n\t\t\t\t\t\tconst vector = valuesByCoreObjectIndex.get(coreGroup.index()) as Vector4;\n\t\t\t\t\t\tvector[component_name] = component_param.value;\n\t\t\t\t\t\t// }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// for (let i = 0; i < coreObjects.length; i++) {\n\t\t\t\t// const coreObject = coreObjects[i];\n\t\t\t\tconst value = valuesByCoreObjectIndex.get(coreGroup.index());\n\t\t\t\tif (value != null) {\n\t\t\t\t\tcoreGroup.setAttribValue(attribName, value);\n\t\t\t\t}\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n\nasync function _addStringAttributeToCoreGroup(\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopNodeParams,\n\tpv: AttribCreateSopParams\n) {\n\tconst param = params.string;\n\tconst attribName = pv.name;\n\tif (param.hasExpression() && param.expressionController) {\n\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForCoreGroup(coreGroup, (coreGroup, value) => {\n\t\t\t\tcoreGroup.setAttribValue(attribName, value);\n\t\t\t});\n\t\t} else {\n\t\t\tcoreGroup.setAttribValue(attribName, param.value);\n\t\t}\n\t} else {\n\t\t// no need to do work here, as this will be done in the operation\n\t}\n}\n","/**\n * Creates an attribute on the geometry or object.\n *\n * @remarks\n * This allows you to create an attribute and define the following:\n * - the group this applies to\n * - the name\n * - the type (numeric or string)\n * - the size (float, vector2, vector3 or vector4)\n * - the class (geometry or object attribute)\n * - the value\n *\n * Note that you can also given an expression to set the value of the attribute, such as `sin(2*@P.z)`\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {\n\tAttribClassMenuEntries,\n\tAttribTypeMenuEntries,\n\tAttribClass,\n\tAttribType,\n\tATTRIBUTE_CLASSES,\n\tATTRIBUTE_TYPES,\n} from '../../../core/geometry/Constant';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {TypeAssert} from '../../poly/Assert';\nimport {AttribCreateSopOperation} from '../../operations/sop/AttribCreate';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {addPointAttribute} from './utils/attribCreate/AttribCreatePoint';\nimport {addVertexAttribute} from './utils/attribCreate/AttribCreateVertex';\nimport {addPrimitiveAttribute} from './utils/attribCreate/AttribCreatePrimitive';\nimport {addObjectAttributeWithExpression} from './utils/attribCreate/AttribCreateObject';\nimport {addCoreGroupAttribute} from './utils/attribCreate/AttribCreateCoreGroup';\n\nconst DEFAULT = AttribCreateSopOperation.DEFAULT_PARAMS;\nclass AttribCreateSopParamsConfig extends NodeParamsConfig {\n\t/** @param the group this applies to */\n\tgroup = ParamConfig.STRING(DEFAULT.group);\n\t/** @param the attribute class (geometry or object) */\n\tclass = ParamConfig.INTEGER(DEFAULT.class, {\n\t\tmenu: {\n\t\t\tentries: AttribClassMenuEntries,\n\t\t},\n\t});\n\t/** @param the attribute type (numeric or string) */\n\ttype = ParamConfig.INTEGER(DEFAULT.type, {\n\t\tmenu: {\n\t\t\tentries: AttribTypeMenuEntries,\n\t\t},\n\t});\n\t/** @param the attribute name */\n\tname = ParamConfig.STRING(DEFAULT.name);\n\t/** @param the attribute size (1 for float, 2 for vector2, 3 for vector3, 4 for vector4) */\n\tsize = ParamConfig.INTEGER(DEFAULT.size, {\n\t\trange: [1, 4],\n\t\trangeLocked: [true, true],\n\t\tvisibleIf: {type: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC)},\n\t});\n\t/** @param the value for a float attribute */\n\tvalue1 = ParamConfig.FLOAT(DEFAULT.value1, {\n\t\tvisibleIf: {type: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), size: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param the value for a vector2 */\n\tvalue2 = ParamConfig.VECTOR2(DEFAULT.value2, {\n\t\tvisibleIf: {type: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), size: 2},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param the value for a vector3 */\n\tvalue3 = ParamConfig.VECTOR3(DEFAULT.value3, {\n\t\tvisibleIf: {type: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), size: 3},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param the value for a vector4 */\n\tvalue4 = ParamConfig.VECTOR4(DEFAULT.value4, {\n\t\tvisibleIf: {type: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), size: 4},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param the value for a string attribute */\n\tstring = ParamConfig.STRING(DEFAULT.string, {\n\t\tvisibleIf: {type: ATTRIBUTE_TYPES.indexOf(AttribType.STRING)},\n\t\texpression: {forEntities: true},\n\t});\n}\nconst ParamsConfig = new AttribCreateSopParamsConfig();\nexport class AttribCreateSopNode extends TypedSopNode<AttribCreateSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.ATTRIB_CREATE;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(AttribCreateSopOperation.INPUT_CLONED_STATE);\n\t}\n\n\tprivate _operation: AttribCreateSopOperation | undefined;\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\t// cannot yet convert to an operation, as expressions may be used in this node\n\t\t// but we can still use one when no expression is required\n\t\tconst attribName = this.pv.name;\n\n\t\tif (this._isUsingExpression()) {\n\t\t\tif (attribName && attribName.trim() != '') {\n\t\t\t\tawait this._addAttribute(ATTRIBUTE_CLASSES[this.pv.class], inputCoreGroups[0]);\n\t\t\t} else {\n\t\t\t\tthis.states.error.set('attribute name is not valid');\n\t\t\t}\n\t\t} else {\n\t\t\tthis._operation = this._operation || new AttribCreateSopOperation(this.scene(), this.states, this);\n\t\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\t\tthis.setCoreGroup(coreGroup);\n\t\t}\n\t}\n\tprivate async _addAttribute(attribClass: AttribClass, coreGroup: CoreGroup) {\n\t\tconst attribType = ATTRIBUTE_TYPES[this.pv.type];\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT:\n\t\t\t\tawait addPointAttribute(attribType, coreGroup, this.p);\n\t\t\t\treturn this.setCoreGroup(coreGroup);\n\t\t\tcase AttribClass.VERTEX:\n\t\t\t\tawait addVertexAttribute(attribType, coreGroup, this.p);\n\t\t\t\treturn this.setCoreGroup(coreGroup);\n\t\t\tcase AttribClass.PRIMITIVE:\n\t\t\t\tawait addPrimitiveAttribute(attribType, coreGroup, this.p);\n\t\t\t\treturn this.setCoreGroup(coreGroup);\n\t\t\tcase AttribClass.OBJECT:\n\t\t\t\tawait addObjectAttributeWithExpression(attribType, coreGroup, this.p, this.pv);\n\t\t\t\treturn this.setCoreGroup(coreGroup);\n\t\t\tcase AttribClass.CORE_GROUP:\n\t\t\t\tawait addCoreGroupAttribute(attribType, coreGroup, this.p, this.pv);\n\t\t\t\treturn this.setCoreGroup(coreGroup);\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n\n\t//\n\t//\n\t// CHECK IF EXPRESSION IS BEING USED, TO ALLOW EASY SWITCH TO OPERATION\n\t//\n\t//\n\tprivate _isUsingExpression(): boolean {\n\t\tconst attribType = ATTRIBUTE_TYPES[this.pv.type];\n\t\tswitch (attribType) {\n\t\t\tcase AttribType.NUMERIC:\n\t\t\t\tconst param = [this.p.value1, this.p.value2, this.p.value3, this.p.value4][this.pv.size - 1];\n\t\t\t\treturn param.hasExpression();\n\t\t\tcase AttribType.STRING:\n\t\t\t\treturn this.p.string.hasExpression();\n\t\t}\n\t}\n\n\t//\n\t//\n\t// API UTILS\n\t//\n\t//\n\tsetAttribClass(attribClass: AttribClass) {\n\t\tthis.p.class.set(ATTRIBUTE_CLASSES.indexOf(attribClass));\n\t}\n\tattribClass() {\n\t\treturn ATTRIBUTE_CLASSES[this.pv.class];\n\t}\n\tsetAttribType(type: AttribType) {\n\t\tthis.p.type.set(ATTRIBUTE_TYPES.indexOf(type));\n\t}\n\tattribType() {\n\t\treturn ATTRIBUTE_TYPES[this.pv.type];\n\t}\n}\n","/**\n * Promotes an attribute from object to geometry or vice-versa.\n *\n * @remarks\n * The attribute can also be promoted with different modes, such as only the min, max or first found.\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {AttribClass, AttribClassMenuEntries, ATTRIBUTE_CLASSES} from '../../../core/geometry/Constant';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {AttribPromoteSopOperation, AttribPromoteMode, ATTRIB_PROMOTE_MODES} from '../../operations/sop/AttribPromote';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nconst DEFAULT = AttribPromoteSopOperation.DEFAULT_PARAMS;\nclass AttribPromoteSopParamsConfig extends NodeParamsConfig {\n\t/** @param the group this applies to */\n\tgroup = ParamConfig.STRING(DEFAULT.group);\n\t/** @param class the attribute is from (object or geometry) */\n\tclassFrom = ParamConfig.INTEGER(DEFAULT.classFrom, {\n\t\tmenu: {\n\t\t\tentries: AttribClassMenuEntries,\n\t\t},\n\t});\n\t/** @param class the attribute should be promoted to (object or geometry) */\n\tclassTo = ParamConfig.INTEGER(DEFAULT.classTo, {\n\t\tmenu: {\n\t\t\tentries: AttribClassMenuEntries,\n\t\t},\n\t});\n\t/** @param mode used to promote the attribute (min, max or first_found) */\n\tmode = ParamConfig.INTEGER(DEFAULT.mode, {\n\t\tmenu: {\n\t\t\tentries: ATTRIB_PROMOTE_MODES.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t/** @param name of the attribute to promote */\n\tname = ParamConfig.STRING(DEFAULT.name);\n}\nconst ParamsConfig = new AttribPromoteSopParamsConfig();\n\nexport class AttribPromoteSopNode extends TypedSopNode<AttribPromoteSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.ATTRIB_PROMOTE;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(AttribPromoteSopOperation.INPUT_CLONED_STATE);\n\t}\n\n\tprivate _operation: AttribPromoteSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new AttribPromoteSopOperation(this.scene(), this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\tsetAttribClassFrom(attribClass: AttribClass) {\n\t\tthis.p.classFrom.set(ATTRIBUTE_CLASSES.indexOf(attribClass));\n\t}\n\tattribClassFrom() {\n\t\treturn ATTRIBUTE_CLASSES[this.pv.classFrom];\n\t}\n\tsetAttribClassTo(attribClass: AttribClass) {\n\t\tthis.p.classTo.set(ATTRIBUTE_CLASSES.indexOf(attribClass));\n\t}\n\tattribClassTo() {\n\t\treturn ATTRIBUTE_CLASSES[this.pv.classTo];\n\t}\n\tsetPromoteMode(mode: AttribPromoteMode) {\n\t\tthis.p.mode.set(ATTRIB_PROMOTE_MODES.indexOf(mode));\n\t}\n}\n","/**\n * Base class of Exporter nodes\n *\n * @remarks\n */\n\nimport {CADSopNode} from './_BaseCAD';\nimport {BaseExporterSopParamsConfig, exporterSopFileName} from './_BaseExporter';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {CoreGroup} from '../../../core/geometry/Group';\n// import {Object3D} from 'three';\nimport {downloadBlob} from '../../../core/BlobUtils';\n\nexport abstract class CADExporterSopNode<K extends BaseExporterSopParamsConfig> extends CADSopNode<K> {\n\tabstract fileExtension(): string;\n\tabstract createBlob(): Promise<Blob>;\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis.setCoreGroup(inputCoreGroups[0]);\n\t}\n\n\tstatic PARAM_CALLBACK_download(node: CADExporterSopNode<BaseExporterSopParamsConfig>) {\n\t\tnode._paramCallbackDownload();\n\t}\n\tasync fileName() {\n\t\treturn await exporterSopFileName(this.p.fileName, this.fileExtension());\n\t}\n\tasync _paramCallbackDownload() {\n\t\tconst blob = await this.createBlob();\n\t\tconst fileName = await this.fileName();\n\t\tdownloadBlob(blob, fileName);\n\t}\n\tprotected async _prepareScene() {\n\t\tconst container = await this.compute();\n\t\tconst coreGroup = container.coreContent();\n\t\tif (!coreGroup) {\n\t\t\tconsole.error('input invalid');\n\t\t\treturn;\n\t\t}\n\n\t\t// save current parents\n\t\tconst cadObjects = coreGroup.cadObjects();\n\t\tif (!cadObjects) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn {cadObjects};\n\t\t// return await exporterSopPrepareScene(this);\n\t}\n\t// protected async _handleResult(result: any, objects: Object3D[], resolve: (blob: Blob) => void) {\n\t// \treturn await exporterSopHandleResult(result, objects, resolve);\n\t// }\n}\n","/**\n * Exports the input as STEP\n *\n * @remarks\n */\nimport {BaseExporterSopParamsConfig} from './_BaseExporter';\nimport {CADExporterSopNode} from './_BaseExporterCAD';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {CadLoader} from '../../../core/geometry/modules/cad/CadLoader';\nimport {CadGC} from '../../../core/geometry/modules/cad/CadCommon';\nimport {CoreCadType} from '../../../core/geometry/modules/cad/CadCoreType';\nimport {CadLoaderSync} from '../../../core/geometry/modules/cad/CadLoaderSync';\nimport {MathUtils} from 'three';\n\nclass ExporterSTEPSopParamsConfig extends BaseExporterSopParamsConfig {}\nconst ParamsConfig = new ExporterSTEPSopParamsConfig();\n\nexport class CADExporterSTEPSopNode extends CADExporterSopNode<ExporterSTEPSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.CAD_EXPORTER_STEP;\n\t}\n\n\tfileExtension() {\n\t\treturn 'step';\n\t}\n\tcreateBlob(): Promise<Blob> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst sceneData = await this._prepareScene();\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst oc = await CadLoader.core();\n\n\t\t\tCadGC.withGC((r) => {\n\t\t\t\tconst writer = r(new oc.STEPControl_Writer_1());\n\t\t\t\tconst {cadObjects} = sceneData;\n\t\t\t\tconst mode = oc.STEPControl_StepModelType.STEPControl_AsIs;\n\t\t\t\tconst compgraph = true;\n\t\t\t\tfor (const object of cadObjects) {\n\t\t\t\t\tif (CoreCadType.isShape(object)) {\n\t\t\t\t\t\tconst shape = object.cadGeometry();\n\t\t\t\t\t\twriter.Transfer(shape, mode as any, compgraph, CadLoaderSync.Message_ProgressRange);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fileNameShort = MathUtils.generateUUID();\n\t\t\t\tconst FSfileName: string = `file.${fileNameShort}`;\n\t\t\t\twriter.Write(FSfileName);\n\n\t\t\t\tconst result = oc.FS.readFile(FSfileName);\n\t\t\t\tconst blob = new Blob([result], {type: 'application/octet-stream'});\n\t\t\t\tresolve(blob);\n\t\t\t});\n\t\t});\n\t}\n}\n","import {Loader, LoadingManager, MathUtils} from 'three';\nimport {BaseLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\nimport type {OnSuccess, OnProgress, OnError} from './Common';\nimport {CadLoader} from '../../geometry/modules/cad/CadLoader';\nimport {CadGeometryType, cadGeometryTypeFromShape} from '../../geometry/modules/cad/CadCommon';\nimport {CadLoaderSync} from '../../geometry/modules/cad/CadLoaderSync';\nimport {CadObject} from '../../geometry/modules/cad/CadObject';\nimport {BaseLoaderLoadOptions} from '../_Base';\n\ntype TypedCadObject = CadObject<CadGeometryType>;\ntype CadObjectArray = Array<TypedCadObject>;\nexport class STEPLoaderHandler extends BaseLoaderHandler<CadObjectArray, TypedCadObject> {\n\tprotected async _getLoader(options: BaseLoaderLoadOptions): Promise<BaseGeoLoader<CadObjectArray>> {\n\t\treturn (this._loader = this._loader || (await new STEPLoader(this.loadingManager)));\n\t}\n\tprotected _onLoadSuccess(o: CadObjectArray): CadObjectArray {\n\t\treturn o;\n\t}\n}\n\nclass STEPLoader extends Loader<CadObjectArray> {\n\tconstructor(manager: LoadingManager) {\n\t\tsuper(manager);\n\t}\n\n\toverride load(url: string, onLoad: OnSuccess<CadObjectArray>, onProgress?: OnProgress, onError?: OnError) {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst oc = await CadLoader.core();\n\t\t\tconst newObjects: CadObject<CadGeometryType>[] = [];\n\n\t\t\tconst reader = new oc.STEPControl_Reader_1();\n\n\t\t\tconst response = await fetch(url);\n\t\t\tconst text = await response.text();\n\t\t\tconst fileNameShort = MathUtils.generateUUID();\n\t\t\tconst FSfileName: string = `file.${fileNameShort}`;\n\t\t\tconst canRead = true;\n\t\t\tconst canWrite = true;\n\t\t\tconst canOwn = true;\n\t\t\toc.FS.createDataFile('/', FSfileName, text, canRead, canWrite, canOwn);\n\t\t\tconst result = reader.ReadFile(FSfileName);\n\t\t\tconst isDone = result == oc.IFSelect_ReturnStatus.IFSelect_RetDone;\n\t\t\tif (isDone) {\n\t\t\t\treader.TransferRoots(CadLoaderSync.Message_ProgressRange);\n\t\t\t\tconst shapesCount = reader.NbShapes();\n\t\t\t\tfor (let i = 0; i < shapesCount; i++) {\n\t\t\t\t\tconst shape = reader.Shape(i + 1);\n\t\t\t\t\tconst type = cadGeometryTypeFromShape(oc, shape);\n\t\t\t\t\tif (type) {\n\t\t\t\t\t\tconst newObject = new CadObject(shape, type);\n\n\t\t\t\t\t\tnewObjects.push(newObject);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treader.delete();\n\t\t\tonLoad(newObjects);\n\t\t});\n\t}\n}\n","/**\n * Loads a .STEP file\n *\n *\n */\n\nimport {CADSopNode} from './_BaseCAD';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {BaseNodeType} from '../_Base';\nimport {ParamEvent} from '../../poly/ParamEvent';\nimport {Poly} from '../../Poly';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {STEPLoaderHandler} from '../../../core/loader/geometry/STEP';\n\nclass CADFileSTEPSopParamsConfig extends NodeParamsConfig {\n\t/** @param url to load the geometry from */\n\turl = ParamConfig.STRING('', {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopType.CAD_FILE_STEP]},\n\t});\n\t/** @param sets the matrixAutoUpdate attribute for the objects loaded */\n\tmatrixAutoUpdate = ParamConfig.BOOLEAN(0);\n\t/** @param reload the geometry */\n\treload = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tCADFileSTEPSopNode.PARAM_CALLBACK_reload(node as CADFileSTEPSopNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new CADFileSTEPSopParamsConfig();\n\nexport class CADFileSTEPSopNode extends CADSopNode<CADFileSTEPSopParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.CAD_FILE_STEP;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t\tconst loader = this._createGeoLoaderHandler(this.pv.url);\n\t\tconst result = await loader.load({node: this});\n\t\tif (result) {\n\t\t\tconst matrixAutoUpdate: boolean = this.pv.matrixAutoUpdate;\n\t\t\tfor (const object of result) {\n\t\t\t\tobject.traverse((child) => {\n\t\t\t\t\tchild.matrixAutoUpdate = matrixAutoUpdate;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this.setCADObjects(result);\n\t\t}\n\t\treturn this.setCADObjects([]);\n\t}\n\tprotected _createGeoLoaderHandler(url: string) {\n\t\treturn new STEPLoaderHandler(url, this);\n\t}\n\n\tstatic PARAM_CALLBACK_reload(node: CADFileSTEPSopNode) {\n\t\tnode._paramCallbackReload();\n\t}\n\tprivate _paramCallbackReload() {\n\t\tthis.p.url.setDirty();\n\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t}\n}\n","/**\n * Creates CSS2DObjects.\n *\n * @remarks\n * This is very useful to create 2D html labels that would be positioned at specific points in the 3D world.\n * Note that the camera must be configured to use a CSS2DRenderer to display them\n *\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {StringParamLanguage} from '../../params/utils/OptionsController';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {Poly} from '../../Poly';\nimport {CoreCSSObjectAttribute, DEFAULT_CSS2DOBJECT} from '../../../core/render/CSSRenderers/CSSObjectAttribute';\nimport {createCSS2DObject} from '../../../core/render/CSSRenderers/CSS2DObject';\nimport {stringToAttribNames} from '../../../core/String';\nimport {Object3D} from 'three';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {replaceChild} from '../../poly/PolyOnObjectsAddRemoveHooksController';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nclass CSS2DObjectSopParamsConfig extends NodeParamsConfig {\n\t/** @param toggles on if attributes are copied from the geometry to the html element */\n\tcopyAttributes = ParamConfig.BOOLEAN(true);\n\t/** @param names of the attributes that are copied from the geometry to the html element */\n\tattributesToCopy = ParamConfig.STRING('', {\n\t\tvisibleIf: {copyAttributes: true},\n\t});\n\t/** @param defines if the htmlId attribute is used to create the html id attribute */\n\toverrideId = ParamConfig.BOOLEAN(true);\n\t/** @param value of the html element id attribute */\n\tid = ParamConfig.STRING(DEFAULT_CSS2DOBJECT.id, {\n\t\tvisibleIf: {overrideId: 1},\n\t});\n\t/** @param defines if the htmlClass attribute is used to create the html class */\n\toverrideClassName = ParamConfig.BOOLEAN(true);\n\t/** @param value of the html class */\n\tclassName = ParamConfig.STRING(DEFAULT_CSS2DOBJECT.className, {\n\t\tvisibleIf: {overrideClassName: 1},\n\t});\n\t/** @param defines if the html attribute is used to create the html content */\n\toverrideHTML = ParamConfig.BOOLEAN(true);\n\t/** @param value of the html content */\n\thtml = ParamConfig.STRING(DEFAULT_CSS2DOBJECT.html, {\n\t\tvisibleIf: {overrideHTML: 1},\n\t\tlanguage: StringParamLanguage.HTML,\n\t});\n}\nconst ParamsConfig = new CSS2DObjectSopParamsConfig();\n\nexport class CSS2DObjectSopNode extends TypedSopNode<CSS2DObjectSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.CSS2D_OBJECT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tif (coreGroup) {\n\t\t\t// if there are input threejs objects,\n\t\t\t// add attributes to them\n\t\t\tconst objects = coreGroup.allObjects();\n\t\t\tfor (const object of objects) {\n\t\t\t\tthis._addAttributes(object);\n\t\t\t}\n\t\t\tthis.setCoreGroup(coreGroup);\n\t\t} else {\n\t\t\t// if no input, create CSS object\n\t\t\t// and also add attributes.\n\t\t\t// Even if the attributes can be redundant,\n\t\t\t// they give clues that they can be changed\n\t\t\t// to update the output\n\t\t\tconst attribNames: string[] = [];\n\t\t\tconst group = createCSS2DObject({\n\t\t\t\tid: this.pv.id,\n\t\t\t\tclassName: this.pv.className,\n\t\t\t\thtml: this.pv.html,\n\t\t\t\tcopyAttributes: this.pv.copyAttributes,\n\t\t\t\tattributesToCopy: stringToAttribNames(this.pv.attributesToCopy, attribNames),\n\t\t\t});\n\t\t\tgroup.name = this.name();\n\t\t\tthis._addAttributes(group);\n\t\t\tthis.setObjects([group]);\n\t\t}\n\t}\n\tprivate _addAttributes(object: ObjectContent<CoreObjectType>) {\n\t\tPoly.onObjectsAddRemoveHooks.assignOnAddHookHandler(object, this);\n\t\tif (this.pv.overrideId) {\n\t\t\tCoreCSSObjectAttribute.setElementId(object, this.pv.id);\n\t\t}\n\t\tif (this.pv.overrideClassName) {\n\t\t\tCoreCSSObjectAttribute.setElementClass(object, this.pv.className);\n\t\t}\n\t\tif (this.pv.overrideHTML) {\n\t\t\tCoreCSSObjectAttribute.setElementHTML(object, this.pv.html);\n\t\t}\n\t\tCoreCSSObjectAttribute.setCopyAttributes(object, this.pv.copyAttributes);\n\t\tCoreCSSObjectAttribute.setAttributesToCopy(object, this.pv.attributesToCopy);\n\t}\n\n\tpublic override updateObjectOnAdd(object: Object3D, parent: Object3D) {\n\t\tconst id = CoreCSSObjectAttribute.getElementId(object);\n\t\tconst className = CoreCSSObjectAttribute.getElementClass(object);\n\t\tconst html = CoreCSSObjectAttribute.getElementHTML(object);\n\t\tconst copyAttributes = CoreCSSObjectAttribute.getCopyAttributes(object);\n\t\tconst attributesToCopy = CoreCSSObjectAttribute.getAttributesToCopy(object);\n\t\tconst attribNames: string[] = [];\n\t\tconst CSSObject = createCSS2DObject({\n\t\t\tobject,\n\t\t\tid,\n\t\t\tclassName,\n\t\t\thtml,\n\t\t\tcopyAttributes,\n\t\t\tattributesToCopy: stringToAttribNames(attributesToCopy, attribNames),\n\t\t});\n\t\treplaceChild(parent, object, CSSObject);\n\t}\n}\n","/**\n * Caches the input geometry.\n *\n * @remarks\n * The cache node can be very handy when the input geometry takes a long time to compute and does not need to be updated frequently.\n *\n */\n\nimport {Object3D, ObjectLoader} from 'three';\nimport {TypedSopNode} from './_Base';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../_Base';\nimport {BaseParamType} from '../../params/_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nclass CacheSopParamsConfig extends NodeParamsConfig {\n\t/** @param content of the cache (hidden) */\n\tcache = ParamConfig.STRING('', {hidden: true});\n\t/** @param clears the cache */\n\treset = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\tCacheSopNode.PARAM_CALLBACK_reset(node as CacheSopNode, param);\n\t\t},\n\t});\n}\nconst ParamsConfig = new CacheSopParamsConfig();\n\nexport class CacheSopNode extends TypedSopNode<CacheSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.CACHE;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst isCacheEmpty = this.pv.cache == '' || this.pv.cache == null;\n\t\tconst coreGroup = inputCoreGroups[0];\n\n\t\tfunction toJSON() {\n\t\t\tconst json = [];\n\t\t\tfor (const object of coreGroup.threejsObjects()) {\n\t\t\t\tjson.push(object.toJSON());\n\t\t\t}\n\t\t\treturn JSON.stringify(json);\n\t\t}\n\t\tfunction fromJSON(json: string) {\n\t\t\tconst objLoader = new ObjectLoader();\n\t\t\tconst jsons = JSON.parse(json);\n\t\t\tconst allObjects: Object3D[] = [];\n\t\t\tfor (const json of jsons) {\n\t\t\t\tconst parent = objLoader.parse(json);\n\t\t\t\tallObjects.push(parent);\n\t\t\t}\n\t\t\treturn allObjects;\n\t\t}\n\n\t\tif (isCacheEmpty && coreGroup) {\n\t\t\tconst str = toJSON();\n\t\t\tconst objects = fromJSON(str);\n\t\t\tthis.setObjects(objects);\n\t\t\tthis.p.cache.set(str);\n\t\t} else {\n\t\t\tif (this.pv.cache) {\n\t\t\t\tconst objects = fromJSON(this.pv.cache);\n\t\t\t\tthis.setObjects(objects);\n\t\t\t} else {\n\t\t\t\tthis.setObjects([]);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic PARAM_CALLBACK_reset(node: CacheSopNode, param: BaseParamType) {\n\t\tnode.param_callback_PARAM_CALLBACK_reset();\n\t}\n\tasync param_callback_PARAM_CALLBACK_reset() {\n\t\tthis.p.cache.set('');\n\t\tthis.compute();\n\t}\n}\n","/**\n * extends the HTML of the viewer created by the input camera\n *\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {CameraViewerCodeSopOperation} from '../../operations/sop/CameraViewerCode';\nimport {HierarchyParamConfigAll} from '../utils/params/ParamsConfig';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {CoreCameraViewerCodeParamConfig} from '../../../core/camera/CoreCameraViewerCodeController';\nclass CameraViewerCodeSopParamsConfig extends CoreCameraViewerCodeParamConfig(HierarchyParamConfigAll) {}\nconst ParamsConfig = new CameraViewerCodeSopParamsConfig();\n\nexport class CameraViewerCodeSopNode extends TypedSopNode<CameraViewerCodeSopParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CameraSopNodeType.VIEWER_CODE;\n\t}\n\n\tprotected override initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(CameraViewerCodeSopOperation.INPUT_CLONED_STATE);\n\t}\n\n\tprivate _operation: CameraViewerCodeSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new CameraViewerCodeSopOperation(this._scene, this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n}\n","/**\n * allows the viewer created by this camera to track markers\n *\n *\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {CameraWebXRARMarkerTrackingSopOperation} from '../../operations/sop/CameraWebXRARMarkerTracking';\nimport {HierarchyParamConfigAll} from '../utils/params/ParamsConfig';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {CoreCameraMarkerTrackingParamConfig} from '../../../core/camera/webXR/CoreCameraMarkerTracking';\nimport {\n\tMarkerTrackingSourceMode,\n\tMARKER_TRACKING_SOURCE_MODES,\n\tMARKER_TRACKING_TRANSFORM_MODES,\n\tMarkerTrackingTransformMode,\n} from '../../../core/webXR/markerTracking/Common';\n\nclass CameraWebXRARMarkerTrackingSopParamsConfig extends CoreCameraMarkerTrackingParamConfig(HierarchyParamConfigAll) {}\nconst ParamsConfig = new CameraWebXRARMarkerTrackingSopParamsConfig();\n\nexport class CameraWebXRARMarkerTrackingSopNode extends TypedSopNode<CameraWebXRARMarkerTrackingSopParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CameraSopNodeType.WEBXR_AR_MARKER_TRACKING;\n\t}\n\n\tprotected override initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(CameraWebXRARMarkerTrackingSopOperation.INPUT_CLONED_STATE);\n\t}\n\n\tprivate _operation: CameraWebXRARMarkerTrackingSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation =\n\t\t\tthis._operation || new CameraWebXRARMarkerTrackingSopOperation(this._scene, this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tsetSourceMode(sourceMode: MarkerTrackingSourceMode) {\n\t\tthis.p.sourceMode.set(MARKER_TRACKING_SOURCE_MODES.indexOf(sourceMode));\n\t}\n\tsourceMode(): MarkerTrackingSourceMode {\n\t\treturn MARKER_TRACKING_SOURCE_MODES[this.pv.sourceMode];\n\t}\n\tsetTransformMode(sourceMode: MarkerTrackingTransformMode) {\n\t\tthis.p.transformMode.set(MARKER_TRACKING_TRANSFORM_MODES.indexOf(sourceMode));\n\t}\n\ttransformMode(): MarkerTrackingTransformMode {\n\t\treturn MARKER_TRACKING_TRANSFORM_MODES[this.pv.transformMode];\n\t}\n}\n","/**\n * Just like the Box, with rounded bevels.\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {CapsuleSopOperation} from '../../operations/sop/Capsule';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\n// import {PolyNodeController} from './../utils/poly/PolyNodeController';\n// import {NodeContext} from './../../poly/NodeContext';\n// import {PolyNodeDataRegister} from '../utils/poly/PolyNodeDataRegister';\n// import {PolyNodeDefinition} from '../utils/poly/PolyNodeDefinition';\n// import {ParamType} from '../../poly/ParamType';\nconst DEFAULT = CapsuleSopOperation.DEFAULT_PARAMS;\nclass CapsuleSopParamsConfig extends NodeParamsConfig {\n\t/** @param radius */\n\tradius = ParamConfig.FLOAT(DEFAULT.radius, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param height */\n\theight = ParamConfig.FLOAT(DEFAULT.height, {\n\t\trange: [0, 2],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param divisions */\n\tdivisions = ParamConfig.INTEGER(DEFAULT.divisions, {\n\t\trange: [1, 10],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param center */\n\tcenter = ParamConfig.VECTOR3(DEFAULT.center);\n}\nconst ParamsConfig = new CapsuleSopParamsConfig();\n\nexport class CapsuleSopNode extends TypedSopNode<CapsuleSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.CAPSULE;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0);\n\t}\n\n\tprivate _operation: CapsuleSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new CapsuleSopOperation(this._scene, this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n}\n","// This function is of course very very basic and probably will never remove ts types from here\n// So this is just a tiny helper\nexport function removeTypes(code: string) {\n\treturn code.replace(/:\\sCoreGroup\\[\\]/g, '').replace(/override\\s/g, '');\n}\n","/**\n * processes input geometry with user-defined typescript.\n *\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {StringParamLanguage} from '../../params/utils/OptionsController';\nimport {TranspiledFilter} from '../utils/code/controllers/TranspiledFilter';\nimport {Object3D} from 'three';\nimport {Poly} from '../../Poly';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\n\nimport {removeTypes} from '../../../core/code/tsUtils';\nimport {BaseCodeProcessor, buildCodeNodeFunction} from '../../../core/code/FunctionBuilderUtils';\n\nconst DEFAULT_TS = `\nexport class CodeSopProcessor extends BaseCodeSopProcessor {\n\toverride initializeProcessor(){\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[]){\n\t\tconst inputCoreGroup = inputCoreGroups[0];\n\t\tconst object = inputCoreGroup.threejsObjects()[0];\n\t\tobject.position.y = 1;\n\t\tthis.setCoreGroup(inputCoreGroup);\n\t}\n}\n`;\nconst DEFAULT_JS = removeTypes(DEFAULT_TS);\n\nexport class BaseCodeSopProcessor extends BaseCodeProcessor {\n\tconstructor(protected override node: CodeSopNode) {\n\t\tsuper(node);\n\t\tthis.initializeProcessor();\n\t}\n\tget pv() {\n\t\treturn this.node.pv;\n\t}\n\tget p() {\n\t\treturn this.node.p;\n\t}\n\tinitializeProcessor() {}\n\tcook(inputCoreGroups: CoreGroup[]) {}\n\tprotected setCoreGroup(coreGroup: CoreGroup) {\n\t\tthis.node.setCoreGroup(coreGroup);\n\t}\n\tprotected setObjects(objects: Object3D[]) {\n\t\tthis.node.setObjects(objects);\n\t}\n}\n\nclass CodeSopParamsConfig extends NodeParamsConfig {\n\tcodeTypescript = ParamConfig.STRING(DEFAULT_TS, {\n\t\thideLabel: true,\n\t\tlanguage: StringParamLanguage.TYPESCRIPT,\n\t});\n\tcodeJavascript = ParamConfig.STRING(DEFAULT_JS, {hidden: true});\n}\nconst ParamsConfig = new CodeSopParamsConfig();\nexport class CodeSopNode extends TypedSopNode<CodeSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\t// adding BaseCodeSopProcessor seems necessary to have the bundled types include it\n\tstatic BaseCodeSopProcessor = BaseCodeSopProcessor;\n\tstatic override type() {\n\t\treturn 'code';\n\t}\n\n\tprivate _lastCompiledCode: string | undefined;\n\tprivate _processor: BaseCodeSopProcessor | undefined;\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 4);\n\t\tthis.io.inputs.initInputsClonedState([\n\t\t\tInputCloneMode.FROM_NODE,\n\t\t\tInputCloneMode.NEVER,\n\t\t\tInputCloneMode.NEVER,\n\t\t\tInputCloneMode.NEVER,\n\t\t]);\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._compileIfRequired();\n\n\t\tif (this._processor) {\n\t\t\tthis._processor.cook(inputCoreGroups);\n\t\t} else {\n\t\t\tthis.setCoreGroup(inputCoreGroups[0]);\n\t\t}\n\t}\n\n\tprivate _compileIfRequired() {\n\t\tif (!this._processor || this._lastCompiledCode != this.pv.codeJavascript) {\n\t\t\tthis._compile();\n\t\t}\n\t}\n\n\tprivate _compile() {\n\t\tthis._processor = undefined;\n\t\ttry {\n\t\t\tconst functionBody = `try {\n\t\t\t\t${TranspiledFilter.filter(this.pv.codeJavascript)}\n\t\t\t} catch(e) {\n\t\t\t\tstates.error.set(e);\n\t\t\t}`;\n\n\t\t\tconst ProcessorClass = buildCodeNodeFunction<BaseCodeSopProcessor>({\n\t\t\t\tBaseCodeProcessor: BaseCodeSopProcessor,\n\t\t\t\tBaseCodeProcessorName: 'BaseCodeSopProcessor',\n\t\t\t\tnode: this,\n\t\t\t\tfunctionBody,\n\t\t\t});\n\t\t\tif (ProcessorClass) {\n\t\t\t\tthis._processor = new ProcessorClass(this);\n\t\t\t\tthis._lastCompiledCode = this.pv.codeJavascript;\n\t\t\t} else {\n\t\t\t\tthis.states.error.set(`cannot generate function`);\n\t\t\t\tPoly.warn(functionBody);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tPoly.warn(e);\n\t\t\tthis.states.error.set(`cannot generate function (${e})`);\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Color} from 'three';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\n\ninterface ColorSopParams extends DefaultOperationParams {\n\tfromAttribute: boolean;\n\tattribName: string;\n\tcolor: Color;\n\tasHsv: boolean;\n}\n\nexport class ColorSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: ColorSopParams = {\n\t\tfromAttribute: false,\n\t\tattribName: '',\n\t\tcolor: new Color(1, 1, 1),\n\t\tasHsv: false,\n\t};\n\tstatic override type(): Readonly<'color'> {\n\t\treturn 'color';\n\t}\n\n\toverride cook(input_contents: CoreGroup[], params: ColorSopParams) {\n\t\t// currently cannot be implemented,\n\t\t// since some params may use an expression\n\t\t// and expressions cannot yet be used by operations\n\t}\n}\n","/**\n * Set a vertex color attribute\n *\n * @remarks\n * Note that just like the attrib_create, it is possible to use an expression to set the attribute value\n *\n */\nimport {BufferAttribute, Mesh, BufferGeometry, Color, TypedArray} from 'three';\nimport {CoreColor} from '../../../core/Color';\nimport {TypedSopNode} from './_Base';\nimport {BaseCorePoint, CorePoint} from '../../../core/geometry/entities/point/CorePoint';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\n\nconst DEFAULT_COLOR = new Color(1, 1, 1);\nconst COLOR_ATTRIB_NAME = 'color';\nconst _points: CorePoint<CoreObjectType>[] = [];\n\ntype ValueArrayByName = PolyDictionary<number[]>;\ninterface ArrayByGeometryUUID {\n\tR: ValueArrayByName;\n\tG: ValueArrayByName;\n\tB: ValueArrayByName;\n}\n\nimport {ColorSopOperation} from '../../operations/sop/Color';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {pointsFromObject} from '../../../core/geometry/entities/point/CorePointUtils';\nimport {CoreObjectType, ObjectContent, isObject3D} from '../../../core/geometry/ObjectContent';\nimport {corePointClassFactory} from '../../../core/geometry/CoreObjectFactory';\nconst DEFAULT = ColorSopOperation.DEFAULT_PARAMS;\nclass ColorSopParamsConfig extends NodeParamsConfig {\n\t/** @param toggle on if the color should be copied from another attribute */\n\tfromAttribute = ParamConfig.BOOLEAN(DEFAULT.fromAttribute);\n\t/** @param attribute name to copy value from */\n\tattribName = ParamConfig.STRING(DEFAULT.attribName, {\n\t\tvisibleIf: {fromAttribute: 1},\n\t});\n\t/** @param color valu */\n\tcolor = ParamConfig.COLOR(DEFAULT.color, {\n\t\tvisibleIf: {fromAttribute: 0},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param toggle on if the value should be set with hsv values rather than rgb */\n\tasHsv = ParamConfig.BOOLEAN(DEFAULT.asHsv, {\n\t\tvisibleIf: {fromAttribute: 0},\n\t});\n}\nconst ParamsConfig = new ColorSopParamsConfig();\n\nexport class ColorSopNode extends TypedSopNode<ColorSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.COLOR;\n\t}\n\n\tprivate _arrayByGeometryUUID: ArrayByGeometryUUID = {\n\t\tR: {},\n\t\tG: {},\n\t\tB: {},\n\t};\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = coreGroup.allObjects();\n\n\t\tfor (const object of objects) {\n\t\t\tif (isBooleanTrue(this.pv.fromAttribute)) {\n\t\t\t\tthis._setFromAttribute(object);\n\t\t\t} else {\n\t\t\t\tconst hasExpression = this.p.color.hasExpression();\n\t\t\t\tif (hasExpression) {\n\t\t\t\t\tawait this._evalExpressions(object);\n\t\t\t\t} else {\n\t\t\t\t\tthis._evalSimpleValues(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// needs update required for when no cloning\n\t\tif (!this.io.inputs.cloneRequired(0)) {\n\t\t\tconst geometries = coreGroup.geometries();\n\t\t\tfor (const geometry of geometries) {\n\t\t\t\t(geometry.getAttribute(COLOR_ATTRIB_NAME) as BufferAttribute).needsUpdate = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tprivate _setFromAttribute<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst corePointClass = corePointClassFactory(object);\n\n\t\tconst attribName = this.pv.attribName;\n\t\tif (attribName.trim().length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst srcAttrib = corePointClass.attribute(object, attribName) as BufferAttribute | undefined;\n\t\tif (!srcAttrib) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._createInitColor(object);\n\t\tpointsFromObject(object, _points);\n\t\tconst pointsCount = _points.length;\n\n\t\tconst srcAttribSize = corePointClass.attribSize(object, attribName);\n\t\tconst srcArray = srcAttrib.array;\n\t\tconst destArray = (corePointClass.attribute(object, COLOR_ATTRIB_NAME) as BufferAttribute).array;\n\n\t\tswitch (srcAttribSize) {\n\t\t\tcase 1: {\n\t\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\t\tconst dest_i = i * 3;\n\t\t\t\t\tdestArray[dest_i + 0] = srcArray[i];\n\t\t\t\t\tdestArray[dest_i + 1] = 1 - srcArray[i];\n\t\t\t\t\tdestArray[dest_i + 2] = 0;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2: {\n\t\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\t\tconst dest_i = i * 3;\n\t\t\t\t\tconst src_i = i * 2;\n\t\t\t\t\tdestArray[dest_i + 0] = srcArray[src_i + 0];\n\t\t\t\t\tdestArray[dest_i + 1] = srcArray[src_i + 1];\n\t\t\t\t\tdestArray[dest_i + 2] = 0;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 3: {\n\t\t\t\tfor (let i = 0; i < srcArray.length; i++) {\n\t\t\t\t\tdestArray[i] = srcArray[i];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 4: {\n\t\t\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\t\t\tconst dest_i = i * 3;\n\t\t\t\t\tconst src_i = i * 4;\n\t\t\t\t\tdestArray[dest_i + 0] = srcArray[src_i + 0];\n\t\t\t\t\tdestArray[dest_i + 1] = srcArray[src_i + 1];\n\t\t\t\t\tdestArray[dest_i + 2] = srcArray[src_i + 2];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _createInitColor<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst corePointClass = corePointClassFactory(object);\n\n\t\tif (!corePointClass.hasAttribute(object, COLOR_ATTRIB_NAME)) {\n\t\t\tcorePointClass.addNumericAttribute(object, COLOR_ATTRIB_NAME, 3, DEFAULT_COLOR);\n\t\t}\n\t}\n\n\t_evalSimpleValues<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst corePointClass = corePointClassFactory(object);\n\n\t\tthis._createInitColor(object);\n\n\t\tlet newColor: Color;\n\t\tif (isBooleanTrue(this.pv.asHsv)) {\n\t\t\tnewColor = new Color();\n\t\t\tCoreColor.setHSV(this.pv.color.r, this.pv.color.g, this.pv.color.b, newColor);\n\t\t} else {\n\t\t\tnewColor = this.pv.color; //.clone();\n\t\t}\n\t\tcorePointClass.addNumericAttribute(object, COLOR_ATTRIB_NAME, 3, newColor);\n\t}\n\n\tasync _evalExpressions<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tconst points: CorePoint<CoreObjectType>[] = [];\n\t\tpointsFromObject(object, points);\n\n\t\tif (!isObject3D(object)) {\n\t\t\treturn;\n\t\t}\n\t\t// const coreGeometry = core_object.coreGeometry();\n\t\t// if (coreGeometry) {\n\t\tthis._createInitColor(object);\n\t\t// }\n\t\tconst geometry = (object as Mesh).geometry as BufferGeometry;\n\t\tif (geometry) {\n\t\t\tconst array = (geometry.getAttribute(COLOR_ATTRIB_NAME) as BufferAttribute).array;\n\n\t\t\tconst tmpArrayR = await this._updateFromParam(geometry, array, points, 0);\n\t\t\tconst tmpArrayG = await this._updateFromParam(geometry, array, points, 1);\n\t\t\tconst tmpArrayB = await this._updateFromParam(geometry, array, points, 2);\n\n\t\t\tif (tmpArrayR) {\n\t\t\t\tthis._commitTmpValues(tmpArrayR, array, 0);\n\t\t\t}\n\t\t\tif (tmpArrayG) {\n\t\t\t\tthis._commitTmpValues(tmpArrayG, array, 1);\n\t\t\t}\n\t\t\tif (tmpArrayB) {\n\t\t\t\tthis._commitTmpValues(tmpArrayB, array, 2);\n\t\t\t}\n\n\t\t\t// to hsv\n\t\t\tif (isBooleanTrue(this.pv.asHsv)) {\n\t\t\t\tlet current = new Color();\n\t\t\t\tlet target = new Color();\n\t\t\t\tlet index;\n\t\t\t\tfor (const point of points) {\n\t\t\t\t\tindex = point.index() * 3;\n\t\t\t\t\tcurrent.fromArray(array, index);\n\t\t\t\t\tCoreColor.setHSV(current.r, current.g, current.b, target);\n\t\t\t\t\ttarget.toArray(array, index);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// const colorr_param = this.param('colorr');\n\t\t// const colorg_param = this.param('colorg');\n\t\t// const colorb_param = this.param('colorb');\n\n\t\t// r\n\t\t// if(colorr_param.has_expression()){\n\t\t// \tawait colorr_param.eval_expression_for_entities(points, (point, value)=>{\n\t\t// \t\tarray[point.index()*3+0] = value\n\t\t// \t})\n\t\t// } else {\n\t\t// \tfor(let point of points){\n\t\t// \t\tarray[point.index()*3+0] = this.pv.color.r\n\t\t// \t}\n\t\t// }\n\t\t// g\n\t\t// if(colorg_param.has_expression()){\n\t\t// \tawait colorg_param.eval_expression_for_entities(points, (point, value)=>{\n\t\t// \t\tarray[point.index()*3+1] = value\n\t\t// \t})\n\t\t// } else {\n\t\t// \tfor(let point of points){\n\t\t// \t\tarray[point.index()*3+1] = this.pv.color.g\n\t\t// \t}\n\t\t// }\n\t\t// b\n\t\t// if(colorb_param.has_expression()){\n\t\t// \tawait colorb_param.eval_expression_for_entities(points, (point, value)=>{\n\t\t// \t\tarray[point.index()*3+2] = value\n\t\t// \t})\n\t\t// } else {\n\t\t// \tfor(let point of points){\n\t\t// \t\tarray[point.index()*3+2] = this.pv.color.b\n\t\t// \t}\n\t\t// }\n\t}\n\n\tprivate async _updateFromParam(\n\t\tgeometry: BufferGeometry,\n\t\tarray: TypedArray,\n\t\tpoints: BaseCorePoint[],\n\t\toffset: number\n\t): Promise<number[] | undefined> {\n\t\t// const component_name = ['r', 'g', 'b'][offset];\n\t\tconst param = this.p.color.components[offset];\n\t\tconst paramValue = [this.pv.color.r, this.pv.color.g, this.pv.color.b][offset];\n\t\tconst arraysByGeometryUUID = [\n\t\t\tthis._arrayByGeometryUUID.R,\n\t\t\tthis._arrayByGeometryUUID.B,\n\t\t\tthis._arrayByGeometryUUID.G,\n\t\t][offset];\n\n\t\tlet tmpArray: number[] | undefined;\n\t\tif (param.hasExpression() && param.expressionController) {\n\t\t\ttmpArray = this._initArrayIfRequired(geometry, arraysByGeometryUUID, points.length);\n\t\t\tif (param.expressionController.entitiesDependent()) {\n\t\t\t\tawait param.expressionController.computeExpressionForPoints(points, (point, value) => {\n\t\t\t\t\t// array[point.index()*3+2] = value\n\t\t\t\t\t(tmpArray as number[])[point.index()] = value;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (const point of points) {\n\t\t\t\t\t(tmpArray as number[])[point.index()] = param.value;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const point of points) {\n\t\t\t\tarray[point.index() * 3 + offset] = paramValue;\n\t\t\t}\n\t\t}\n\t\treturn tmpArray;\n\t}\n\n\tprivate _initArrayIfRequired(\n\t\tgeometry: BufferGeometry,\n\t\tarraysByGeometryUUID: ValueArrayByName,\n\t\tpointsCount: number\n\t) {\n\t\tconst uuid = geometry.uuid;\n\t\tconst currentArray = arraysByGeometryUUID[uuid];\n\t\tif (currentArray) {\n\t\t\t// only create new array if we need more point, or as soon as the length is different?\n\t\t\tif (currentArray.length < pointsCount) {\n\t\t\t\tarraysByGeometryUUID[uuid] = new Array(pointsCount);\n\t\t\t}\n\t\t} else {\n\t\t\tarraysByGeometryUUID[uuid] = new Array(pointsCount);\n\t\t}\n\t\treturn arraysByGeometryUUID[uuid];\n\t}\n\n\tprivate _commitTmpValues(tmpArray: number[], targetArray: TypedArray, offset: number) {\n\t\tfor (let i = 0; i < tmpArray.length; i++) {\n\t\t\ttargetArray[i * 3 + offset] = tmpArray[i];\n\t\t}\n\t}\n}\n","/**\n * Create points from a an array of json dictionaries\n *\n * @remarks\n * The number of points created will be equal to the number of elements in the array.\n * Each element of the array must be a dictionary. It can look like:\n * `[{position: [1,2,3]}]`\n * which will create a single point at the position x=1,y=2,z=3.\n *\n * In order to create 2 points with attributes `position` and `amp`, you would have:\n * `[{position: [1,2,3], amp: 1},{position: [7,2,1], amp: 3}]`\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {JSONDataParser} from '../../../core/loader/geometry/JSONDataParser';\n\nconst DEFAULT_DATA = [\n\t{value: -40},\n\t{value: -30},\n\t{value: -20},\n\t{value: -10},\n\t{value: 0},\n\t{value: 10},\n\t{value: 20},\n\t{value: 30},\n\t{value: 40},\n\t{value: 50},\n\t{value: 60},\n\t{value: 70},\n\t{value: 80},\n];\nconst DEFAULT_DATA_STR = JSON.stringify(DEFAULT_DATA);\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {ObjectType} from '../../../core/geometry/Constant';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nclass DataSopParamsConfig extends NodeParamsConfig {\n\t/** @param json object used to create the geometry */\n\tdata = ParamConfig.STRING(DEFAULT_DATA_STR);\n}\nconst ParamsConfig = new DataSopParamsConfig();\n\nexport class DataSopNode extends TypedSopNode<DataSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.DATA;\n\t}\n\n\toverride cook() {\n\t\tlet json = null;\n\t\ttry {\n\t\t\tjson = JSON.parse(this.pv.data);\n\t\t} catch (e) {\n\t\t\tthis.states.error.set('could not parse json');\n\t\t}\n\n\t\tif (json) {\n\t\t\ttry {\n\t\t\t\tconst loader = new JSONDataParser();\n\t\t\t\tloader.setJSON(json);\n\t\t\t\tconst geometry = loader.createObject();\n\t\t\t\tthis.setGeometry(geometry, ObjectType.POINTS);\n\t\t\t} catch (e) {\n\t\t\t\tthis.states.error.set('could not build geometry from json');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.cookController.endCook();\n\t\t}\n\t}\n}\n","import {BufferGeometry} from 'three';\nimport {Poly} from '../../../engine/Poly';\nimport {CoreBaseLoader} from '../_Base';\nimport {JSONDataParser} from './JSONDataParser';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\n\nexport interface JsonDataLoaderOptions {\n\tdataKeysPrefix?: string;\n\tskipEntries?: string;\n\tdoConvert?: boolean;\n\tconvertToNumeric?: string;\n}\n\nexport class JsonDataLoader extends CoreBaseLoader<string> {\n\tprivate _parser: JSONDataParser;\n\n\tconstructor(url: string, options: JsonDataLoaderOptions = {}, protected override _node?: BaseNodeType) {\n\t\tsuper(url, _node);\n\t\tthis._parser = new JSONDataParser(options);\n\t}\n\n\tasync load(\n\t\tsuccess_callback: (geometry: BufferGeometry) => void,\n\t\tprogress_callback: (() => void) | undefined,\n\t\terror_callback: (error: ErrorEvent) => void | undefined\n\t) {\n\t\tconst url = this._urlToLoad();\n\n\t\tfetch(url)\n\t\t\t.then(async (response) => {\n\t\t\t\tlet json = await response.json();\n\t\t\t\tconst dataKeysPrefix = this._parser.dataKeysPrefix();\n\t\t\t\tif (dataKeysPrefix != null && dataKeysPrefix != '') {\n\t\t\t\t\tjson = this._parser.get_prefixed_json(json, dataKeysPrefix.split('.'));\n\t\t\t\t}\n\t\t\t\tthis._parser.setJSON(json);\n\t\t\t\tconst object = this._parser.createObject();\n\t\t\t\tsuccess_callback(object);\n\t\t\t})\n\t\t\t.catch((error: ErrorEvent) => {\n\t\t\t\tPoly.error('error', error);\n\t\t\t\terror_callback(error);\n\t\t\t});\n\t}\n}\n","import {Float32BufferAttribute, Mesh} from 'three';\nimport {BufferGeometry} from 'three';\nimport {CoreAttributeData} from '../../geometry/AttributeData';\nimport {Attribute, CoreAttribute} from '../../geometry/Attribute';\nimport {AttribType} from '../../geometry/Constant';\nimport {isString} from '../../Type';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {BaseNodeType} from '../../../engine/nodes/_Base';\nimport {CoreBaseLoader} from '../_Base';\nimport {ThreejsPoint} from '../../geometry/modules/three/ThreejsPoint';\n\ntype CsvValue = string | number | number[];\n// const POSITION = 'position';\nconst dummyMesh = new Mesh();\n\nexport class CsvLoader extends CoreBaseLoader<string> {\n\tstatic SEPARATOR = ',';\n\tstatic VECTOR_SEPARATOR = ',';\n\n\tprivate attribute_names_from_first_line: boolean = false;\n\tprivate lines: string[] = [];\n\tprivate points_count: number = 0;\n\tprivate attribute_values_by_name: PolyDictionary<CsvValue[]> = {};\n\t// const attribute_types_by_name: PolyDictionary<AttribType> = {};\n\t// const attribute_sizes_by_name: PolyDictionary<1|2|3|4> = {};\n\tprivate attribute_data_by_name: PolyDictionary<CoreAttributeData> = {};\n\tprivate _loading = false;\n\n\tconstructor(url: string, private attribute_names?: string[], protected override _node?: BaseNodeType) {\n\t\tsuper(url, _node);\n\t\tif (!this.attribute_names) {\n\t\t\tthis.attribute_names_from_first_line = true;\n\t\t}\n\t}\n\tasync load() {\n\t\t// we need to check if it is currently loading, as we accumulate the points_count durig read.\n\t\t// If another load was to start before the first load is completed, the points_count would be messed up.\n\t\tif (this._loading) {\n\t\t\tconsole.warn('is already loading');\n\t\t\treturn;\n\t\t}\n\t\tthis._loading = true;\n\t\tthis.points_count = 0;\n\t\tawait this.loadData();\n\t\tthis.infer_types();\n\t\tthis.read_values();\n\t\tconst geometry = this.create_points();\n\t\treturn geometry;\n\t}\n\n\tprivate async loadData() {\n\t\tconst url =  this._urlToLoad();\n\t\tconst response = await fetch(url);\n\t\tconst text = await response.text();\n\t\tthis.lines = text.split('\\n');\n\n\t\tif (!this.attribute_names) {\n\t\t\tthis.attribute_names = this.lines[0].split(CsvLoader.SEPARATOR);\n\t\t}\n\t\tthis.attribute_names = this.attribute_names.map((name) => CoreAttribute.remapName(name));\n\t\tfor (const attribute_name of this.attribute_names) {\n\t\t\tthis.attribute_values_by_name[attribute_name] = [];\n\t\t}\n\t}\n\n\tprivate infer_types() {\n\t\tconst first_values_index = this.attribute_names_from_first_line ? 1 : 0;\n\t\tconst first_line = this.lines[first_values_index];\n\t\tlet line_attribute_values = first_line.split(CsvLoader.SEPARATOR);\n\t\tfor (let i = 0; i < line_attribute_values.length; i++) {\n\t\t\tconst attribute_name = this.attribute_names![i];\n\t\t\tconst attribute_value = line_attribute_values[i];\n\t\t\tconst value = this._value_from_line_element(attribute_value);\n\t\t\tthis.attribute_data_by_name[attribute_name] = CoreAttributeData.from_value(value);\n\t\t}\n\t}\n\tprivate _value_from_line_element(attribute_value: number | string) {\n\t\tif (isString(attribute_value)) {\n\t\t\tif (`${parseFloat(attribute_value)}` === attribute_value) {\n\t\t\t\treturn parseFloat(attribute_value);\n\t\t\t} else if (attribute_value[0] === '[' && attribute_value[attribute_value.length - 1] === ']') {\n\t\t\t\tconst attribute_value_within_brackets = attribute_value.substring(1, attribute_value.length - 1);\n\t\t\t\tconst elements_s = attribute_value_within_brackets.split(CsvLoader.VECTOR_SEPARATOR);\n\t\t\t\treturn elements_s.map((element_s) => parseFloat(element_s));\n\t\t\t} else {\n\t\t\t\treturn attribute_value;\n\t\t\t}\n\t\t} else {\n\t\t\treturn attribute_value;\n\t\t}\n\t}\n\tread_values() {\n\t\tif (!this.attribute_names) {\n\t\t\treturn;\n\t\t}\n\t\tconst first_values_index = this.attribute_names_from_first_line ? 1 : 0;\n\t\tlet line: string;\n\t\tfor (let line_index = first_values_index; line_index < this.lines.length; line_index++) {\n\t\t\tline = this.lines[line_index];\n\t\t\tconst line_attribute_values = line.split(CsvLoader.SEPARATOR);\n\n\t\t\tif (line_attribute_values.length >= this.attribute_names.length) {\n\t\t\t\t// ensure we are not on an empty line\n\t\t\t\tfor (let i = 0; i < line_attribute_values.length; i++) {\n\t\t\t\t\tconst attribute_name = this.attribute_names[i];\n\t\t\t\t\tif (attribute_name) {\n\t\t\t\t\t\tconst attribute_value = line_attribute_values[i];\n\t\t\t\t\t\tconst value = this._value_from_line_element(attribute_value);\n\t\t\t\t\t\tthis.attribute_values_by_name[attribute_name].push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.points_count += 1;\n\t\t\t}\n\t\t}\n\n\t\t// create position if not present in data\n\t\tif (!this.attribute_values_by_name[Attribute.POSITION]) {\n\t\t\tconst positions: number[] = new Array(this.points_count * 3);\n\t\t\tpositions.fill(0);\n\t\t\tthis.attribute_values_by_name[Attribute.POSITION] = positions;\n\t\t\tthis.attribute_data_by_name[Attribute.POSITION] = new CoreAttributeData(3, AttribType.NUMERIC);\n\t\t\tthis.attribute_names.push(Attribute.POSITION);\n\t\t}\n\t}\n\tcreate_points() {\n\t\tif (!this.attribute_names) {\n\t\t\treturn;\n\t\t}\n\t\t// create geometry\n\t\tconst geometry = new BufferGeometry();\n\t\tdummyMesh.geometry = geometry;\n\t\t// const core_geometry = new CoreGeometry(geometry);\n\t\tconst corePointClass = ThreejsPoint;\n\t\tfor (const attribute_name of this.attribute_names) {\n\t\t\tconst attribute_values = this.attribute_values_by_name[attribute_name].flat();\n\t\t\tconst size = this.attribute_data_by_name[attribute_name].size();\n\t\t\tconst type = this.attribute_data_by_name[attribute_name].type();\n\t\t\tif (type == AttribType.STRING) {\n\t\t\t\tconst index_data = CoreAttribute.arrayToIndexedArrays(attribute_values as string[]);\n\t\t\t\tcorePointClass.setIndexedAttribute(\n\t\t\t\t\tdummyMesh,\n\t\t\t\t\tattribute_name,\n\t\t\t\t\tindex_data['values'],\n\t\t\t\t\tindex_data['indices']\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgeometry.setAttribute(attribute_name, new Float32BufferAttribute(attribute_values as number[], size));\n\t\t\t}\n\t\t}\n\n\t\t// add index\n\t\tconst indices: number[] = new Array(this.points_count);\n\t\tfor (let i = 0; i < this.points_count; i++) {\n\t\t\tindices.push(i);\n\t\t}\n\t\tgeometry.setIndex(indices);\n\n\t\treturn geometry;\n\t}\n}\n","/**\n * Create points from a an array of json dictionaries\n *\n * @remarks\n * This node is similar to the [Data SOP], but will fetch the data from a url.\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {JsonDataLoader} from '../../../core/loader/geometry/JSONDataLoader';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseParamType} from '../../params/_Base';\nimport {BaseNodeType} from '../_Base';\nimport {CsvLoader} from '../../../core/loader/geometry/Csv';\nimport {BufferGeometry} from 'three';\nimport {ObjectType} from '../../../core/geometry/Constant';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {Poly} from '../../Poly';\nimport {ParamEvent} from '../../poly/ParamEvent';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport enum DataType {\n\tJSON = 'json',\n\tCSV = 'csv',\n}\nexport const DATA_TYPES: DataType[] = [DataType.JSON, DataType.CSV];\n\nconst DEFAULT_URL = `${ASSETS_ROOT}/nodes/sop/DataUrl/basic.json`;\nclass DataUrlSopParamsConfig extends NodeParamsConfig {\n\t/** @param sets if the data is interpreted as json or csv */\n\tdataType = ParamConfig.INTEGER(DATA_TYPES.indexOf(DataType.JSON), {\n\t\tmenu: {\n\t\t\tentries: DATA_TYPES.map((t, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: t,\n\t\t\t\t\tvalue: i,\n\t\t\t\t};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param the url to fetch the data from */\n\turl = ParamConfig.STRING(DEFAULT_URL, {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopType.DATA_URL]},\n\t});\n\n\t//\n\t// JSON params\n\t//\n\t/** @param if the data is inside the payload, defines the prefix to read it from here */\n\tjsonDataKeysPrefix = ParamConfig.STRING('', {\n\t\tvisibleIf: {dataType: DATA_TYPES.indexOf(DataType.JSON)},\n\t});\n\t/** @param which entries are skipped */\n\tskipEntries = ParamConfig.STRING('', {\n\t\tvisibleIf: {dataType: DATA_TYPES.indexOf(DataType.JSON)},\n\t});\n\t/** @param sets if some attributes should be converted */\n\tconvert = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {dataType: DATA_TYPES.indexOf(DataType.JSON)},\n\t});\n\t/** @param sets which attributes should be converted from string to numeric */\n\tconvertToNumeric = ParamConfig.STRING('', {\n\t\tvisibleIf: {\n\t\t\tdataType: DATA_TYPES.indexOf(DataType.JSON),\n\t\t\tconvert: 1,\n\t\t},\n\t});\n\n\t//\n\t// CSV params\n\t//\n\t/** @param when fetching from a csv, the attribute names will not be present. Those can then be mentioned here */\n\treadAttribNamesFromFile = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {dataType: DATA_TYPES.indexOf(DataType.CSV)},\n\t});\n\t/** @param list of attributes names when fetching from a csv */\n\tattribNames = ParamConfig.STRING('height scale', {\n\t\tvisibleIf: {\n\t\t\tdataType: DATA_TYPES.indexOf(DataType.CSV),\n\t\t\treadAttribNamesFromFile: 0,\n\t\t},\n\t});\n\n\t//\n\t// reload\n\t//\n\t/** @param reload the url */\n\treload = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\tDataUrlSopNode.PARAM_CALLBACK_reload(node as DataUrlSopNode, param);\n\t\t},\n\t});\n}\nconst ParamsConfig = new DataUrlSopParamsConfig();\n\nexport class DataUrlSopNode extends TypedSopNode<DataUrlSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.DATA_URL;\n\t}\n\n\toverride async cook() {\n\t\tthis._load();\n\t}\n\tprivate _load() {\n\t\tswitch (DATA_TYPES[this.pv.dataType]) {\n\t\t\tcase DataType.JSON:\n\t\t\t\treturn this._loadJSON();\n\t\t\tcase DataType.CSV:\n\t\t\t\treturn this._loadCSV();\n\t\t}\n\t}\n\t// private _clearLoadedBlob() {\n\t// \tswitch (DATA_TYPES[this.pv.dataType]) {\n\t// \t\tcase DataType.JSON:\n\t// \t\t\treturn this._resetJSON();\n\t// \t\tcase DataType.CSV:\n\t// \t\t\treturn this._resetCSV();\n\t// \t}\n\t// }\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\tprivate _url() {\n\t\t// do not use assetsRoot here, as it would use it twice\n\t\t// as it is already used in the loader.\n\t\t// const assets_root = this.scene().assets.root();\n\t\t// if (assets_root) {\n\t\t// \treturn `${assets_root}${this.pv.url}`;\n\t\t// } else {\n\t\treturn this.pv.url;\n\t\t// }\n\t}\n\t//\n\t//\n\t// JSON\n\t//\n\t//\n\tprivate _loadJSON() {\n\t\tconst loader = new JsonDataLoader(\n\t\t\tthis._url(),\n\t\t\t{\n\t\t\t\tdataKeysPrefix: this.pv.jsonDataKeysPrefix,\n\t\t\t\tskipEntries: this.pv.skipEntries,\n\t\t\t\tdoConvert: isBooleanTrue(this.pv.convert),\n\t\t\t\tconvertToNumeric: this.pv.convertToNumeric,\n\t\t\t},\n\t\t\tthis\n\t\t);\n\n\t\tloader.load(this._onLoad.bind(this), undefined, this._onError.bind(this));\n\t}\n\t// private _resetJSON() {\n\t// \tconst loader = new JsonDataLoader(this._url(), this.scene());\n\t// \tloader.deregisterUrl();\n\t// }\n\n\tprivate _onLoad(geometry: BufferGeometry) {\n\t\tthis.setGeometry(geometry, ObjectType.POINTS);\n\t}\n\tprivate _onError(error: ErrorEvent) {\n\t\tthis.states.error.set(`could not load geometry from ${this._url()} (${error})`);\n\t\tthis.cookController.endCook();\n\t}\n\n\t//\n\t//\n\t// CSV\n\t//\n\t//\n\tprivate async _loadCSV() {\n\t\tconst attribNames = isBooleanTrue(this.pv.readAttribNamesFromFile) ? undefined : this.pv.attribNames.split(' ');\n\t\tconst loader = new CsvLoader(this._url(), attribNames, this);\n\t\tconst geometry = await loader.load();\n\t\tif (geometry) {\n\t\t\tthis.setGeometry(geometry, ObjectType.POINTS);\n\t\t} else {\n\t\t\tthis.states.error.set('could not generate points');\n\t\t}\n\t}\n\t// private _resetCSV() {\n\t// \tconst attribNames: string[] = [];\n\t// \tconst loader = new CsvLoader(this._url(), this.scene(), attribNames, this);\n\t// \tloader.deregisterUrl();\n\t// }\n\n\t// async _on_open_url(){\n\t// \tconst url = await this.param('url').eval_p()\n\t// \tconst a = document.createElement('a')\n\t// \ta.href = url\n\t// \ta.setAttribute('target', '_blank')\n\t// \ta.click()\n\t// }\n\n\tstatic PARAM_CALLBACK_reload(node: DataUrlSopNode, param: BaseParamType) {\n\t\tnode.param_callback_reload();\n\t}\n\tparam_callback_reload() {\n\t\t// this._clearLoadedBlob();\n\t\t// this._previous_param_url = null\n\n\t\t// set the param dirty is preferable, in case this is used to refresh a local asset\n\t\tthis.p.url.setDirty();\n\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t\t// this.setDirty()\n\t}\n}\n","/**\n * Decomposes the input objects into multiple geometry, material and texture nodes to allow granular updates\n *\n */\nimport {SubnetSopNodeLike} from './utils/subnet/SopSubnetChildrenDisplayController';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {NetworkNodeType} from '../../poly/NodeContext';\nimport {BaseNodeType} from '../_Base';\n\nexport const DECOMPOSE_EVENT_TYPE: 'decompose' = 'decompose';\nconst DECOMPOSE_EVENT = {type: DECOMPOSE_EVENT_TYPE};\n\nclass DecomposeSopParamsConfig extends NodeParamsConfig {\n\t/** @param decompose the input object */\n\tdecompose = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tDecomposeSopNode.PARAM_CALLBACK_decompose(node as DecomposeSopNode);\n\t\t},\n\t});\n\t// /** @param toggle if you want to use an environment map */\n\t// useEnvMap = ParamConfig.BOOLEAN(0, {\n\t// \tseparatorBefore: true,\n\t// });\n\t// /** @param specify the environment map COP node */\n\t// envMap = ParamConfig.NODE_PATH('', {\n\t// \tvisibleIf: {useEnvMap: 1},\n\t// \tnodeSelection: {context: NodeContext.COP},\n\t// \tcook: false,\n\t// });\n\t// /** @param environment intensity */\n\t// envMapIntensity = ParamConfig.FLOAT(1, {\n\t// \tvisibleIf: {useEnvMap: 1},\n\t// });\n}\nconst ParamsConfig = new DecomposeSopParamsConfig();\n\nexport class DecomposeSopNode extends SubnetSopNodeLike<DecomposeSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn NetworkNodeType.DECOMPOSE;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.ALWAYS);\n\t}\n\tstatic PARAM_CALLBACK_decompose(node: DecomposeSopNode) {\n\t\tnode._paramCallbackDecompose();\n\t}\n\tprivate _paramCallbackDecompose() {\n\t\tthis.dispatchEvent(DECOMPOSE_EVENT);\n\t}\n}\n","import {DeleteSopNode} from '../../Delete';\nimport {CoreEntity} from '../../../../../core/geometry/CoreEntity';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\n\nexport class EntitySelectionHelper {\n\tpublic readonly selectedState: Map<CoreEntity, boolean> = new Map();\n\tprivate _entitiesCount: number = 0;\n\tprivate _selectedEntitiesCount: number = 0;\n\tconstructor(protected node: DeleteSopNode) {}\n\n\tinit(entities: CoreEntity[]) {\n\t\tthis.selectedState.clear();\n\t\tfor (const entity of entities) {\n\t\t\tthis.selectedState.set(entity, false);\n\t\t}\n\t\tthis._entitiesCount = entities.length;\n\t\tthis._selectedEntitiesCount = 0;\n\t}\n\tselect(entity: CoreEntity) {\n\t\tconst state = this.selectedState.get(entity);\n\t\tif (state != null) {\n\t\t\tif (state == false) {\n\t\t\t\tthis.selectedState.set(entity, true);\n\t\t\t\tthis._selectedEntitiesCount++;\n\t\t\t}\n\t\t}\n\t}\n\tentitiesToKeep(): CoreEntity[] {\n\t\treturn this._entitiesForState(isBooleanTrue(this.node.pv.invert));\n\t}\n\tentitiesToDelete(): CoreEntity[] {\n\t\treturn this._entitiesForState(!isBooleanTrue(this.node.pv.invert));\n\t}\n\tprivate _entitiesForState(state: boolean): CoreEntity[] {\n\t\tconst requiredState = state ? true : false;\n\t\tconst arraySize = state ? this._selectedEntitiesCount : this._entitiesCount - this._selectedEntitiesCount;\n\n\t\tif (arraySize == 0) {\n\t\t\treturn [];\n\t\t} else {\n\t\t\tconst array: CoreEntity[] = new Array(arraySize);\n\t\t\tlet i = 0;\n\t\t\tthis.selectedState.forEach((state, entity) => {\n\t\t\t\tif (state == requiredState) {\n\t\t\t\t\tarray[i] = entity;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn array;\n\t\t}\n\t}\n}\n","import {DeleteSopNode} from '../../Delete';\nimport {ATTRIBUTE_TYPES, AttribType, AttribSize, ATTRIBUTE_SIZES} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {Vector2, Vector3, Vector4} from 'three';\nimport {CoreEntity} from '../../../../../core/geometry/CoreEntity';\nimport {ensureString} from '../../../../../core/Type';\n\nexport enum ComparisonOperator {\n\tEQUAL = '==',\n\tLESS_THAN = '<',\n\tEQUAL_OR_LESS_THAN = '<=',\n\tEQUAL_OR_GREATER_THAN = '>=',\n\tGREATER_THAN = '>',\n\tDIFFERENT = '!=',\n}\nexport const COMPARISON_OPERATORS: Array<ComparisonOperator> = [\n\tComparisonOperator.EQUAL,\n\tComparisonOperator.LESS_THAN,\n\tComparisonOperator.EQUAL_OR_LESS_THAN,\n\tComparisonOperator.EQUAL_OR_GREATER_THAN,\n\tComparisonOperator.GREATER_THAN,\n\tComparisonOperator.DIFFERENT,\n];\n\ntype CompareMethodFloat = {[key in ComparisonOperator]: (n1: number, n2: number) => boolean};\nconst COMPARE_METHOD_FLOAT: CompareMethodFloat = {\n\t[ComparisonOperator.EQUAL]: (n1: number, n2: number) => {\n\t\treturn n1 == n2;\n\t},\n\t[ComparisonOperator.LESS_THAN]: (n1: number, n2: number) => {\n\t\treturn n1 < n2;\n\t},\n\t[ComparisonOperator.EQUAL_OR_LESS_THAN]: (n1: number, n2: number) => {\n\t\treturn n1 <= n2;\n\t},\n\t[ComparisonOperator.EQUAL_OR_GREATER_THAN]: (n1: number, n2: number) => {\n\t\treturn n1 >= n2;\n\t},\n\t[ComparisonOperator.GREATER_THAN]: (n1: number, n2: number) => {\n\t\treturn n1 > n2;\n\t},\n\t[ComparisonOperator.DIFFERENT]: (n1: number, n2: number) => {\n\t\treturn n1 != n2;\n\t},\n};\n\nexport const ComparisonOperatorMenuEntries = COMPARISON_OPERATORS.map((name, value) => {\n\treturn {name, value};\n});\n\nexport class ByAttributeHelper {\n\tconstructor(private node: DeleteSopNode) {}\n\n\tevalForEntities(entities: CoreEntity[]) {\n\t\tconst attribType = ATTRIBUTE_TYPES[this.node.pv.attribType];\n\t\tswitch (attribType) {\n\t\t\tcase AttribType.NUMERIC: {\n\t\t\t\tthis._evalForNumeric(entities);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase AttribType.STRING: {\n\t\t\t\tthis._evalForString(entities);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribType);\n\t}\n\tprivate _evalForString(entities: CoreEntity[]) {\n\t\tlet value: string | null;\n\t\tfor (const entity of entities) {\n\t\t\tvalue = entity.stringAttribValue(this.node.pv.attribName);\n\t\t\tif (value == ensureString(this.node.pv.attribString)) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _evalForNumeric(entities: CoreEntity[]) {\n\t\tconst attribSize: AttribSize = ATTRIBUTE_SIZES[this.node.pv.attribSize - 1];\n\t\tswitch (attribSize) {\n\t\t\tcase AttribSize.FLOAT: {\n\t\t\t\treturn this._evalForPointsNumericFloat(entities);\n\t\t\t}\n\t\t\tcase AttribSize.VECTOR2: {\n\t\t\t\treturn this._evalForPointsNumericVector2(entities);\n\t\t\t}\n\t\t\tcase AttribSize.VECTOR3: {\n\t\t\t\treturn this._evalForPointsNumericVector3(entities);\n\t\t\t}\n\t\t\tcase AttribSize.VECTOR4: {\n\t\t\t\treturn this._evalForPointsNumericVector4(entities);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(attribSize);\n\t}\n\n\tprivate _evalForPointsNumericFloat(entities: CoreEntity[]) {\n\t\tlet attribName: string = this.node.pv.attribName;\n\t\tconst compared_value = this.node.pv.attribValue1;\n\t\tlet value: number;\n\t\tconst comparison_operator: ComparisonOperator = COMPARISON_OPERATORS[this.node.pv.attribComparisonOperator];\n\t\tconst compare_method = COMPARE_METHOD_FLOAT[comparison_operator];\n\t\tfor (const entity of entities) {\n\t\t\tvalue = entity.attribValue(attribName) as number;\n\t\t\tif (compare_method(value, compared_value)) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _evalForPointsNumericVector2(entities: CoreEntity[]) {\n\t\tlet attribName = this.node.pv.attribName;\n\t\tconst compared_value = this.node.pv.attribValue2;\n\t\tlet target = new Vector2();\n\t\tfor (const entity of entities) {\n\t\t\tconst value = entity.attribValue(attribName, target) as Vector2;\n\t\t\tif (compared_value.equals(value)) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _evalForPointsNumericVector3(entities: CoreEntity[]) {\n\t\tlet attribName = this.node.pv.attribName;\n\t\tconst compared_value = this.node.pv.attribValue3;\n\t\tlet target = new Vector3();\n\t\tfor (const entity of entities) {\n\t\t\tconst value = entity.attribValue(attribName, target) as Vector3;\n\t\t\tif (compared_value.equals(value)) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _evalForPointsNumericVector4(entities: CoreEntity[]) {\n\t\tlet attribName = this.node.pv.attribName;\n\t\tconst compared_value = this.node.pv.attribValue4;\n\t\tlet target = new Vector4();\n\t\tfor (const entity of entities) {\n\t\t\tconst value = entity.attribValue(attribName, target) as Vector4;\n\t\t\tif (compared_value.equals(value)) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {DeleteSopNode} from '../../Delete';\nimport {CoreEntity} from '../../../../../core/geometry/CoreEntity';\nimport {isBooleanTrue} from '../../../../../core/BooleanValue';\nimport {ExpressionController} from '../../../../params/utils/ExpressionController';\nimport {ParamType} from '../../../../poly/ParamType';\n\nexport class ByExpressionHelper {\n\tconstructor(private node: DeleteSopNode) {}\n\tasync evalForEntities(entities: CoreEntity[]) {\n\t\tconst param = this.node.p.expression;\n\t\tif (\n\t\t\tthis.node.p.expression.hasExpression() &&\n\t\t\tparam.expressionController &&\n\t\t\tparam.expressionController.entitiesDependent()\n\t\t) {\n\t\t\tawait this._evalEntityDependentExpression(entities, param.expressionController);\n\t\t} else {\n\t\t\tthis._evalExpressionsWithoutEntityDependentExpression(entities);\n\t\t}\n\t}\n\n\tprivate async _evalEntityDependentExpression(\n\t\tentities: CoreEntity[],\n\t\texpressionController: ExpressionController<ParamType.BOOLEAN>\n\t) {\n\t\tawait expressionController.computeExpressionForEntities(entities, (entity, value: boolean) => {\n\t\t\tif (value) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t});\n\t}\n\tprivate _evalExpressionsWithoutEntityDependentExpression(entities: CoreEntity[]) {\n\t\tconst value = isBooleanTrue(this.node.pv.expression);\n\t\tif (value) {\n\t\t\tfor (const entity of entities) {\n\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {DeleteSopNode} from '../../Delete';\nimport {CoreEntity} from '../../../../../core/geometry/CoreEntity';\nimport {Box3, Vector3} from 'three';\n\nconst _position = new Vector3();\nconst _bbox = new Box3();\n\nexport class ByBboxHelper {\n\tconstructor(private node: DeleteSopNode) {}\n\tevalForEntities(points: CoreEntity[]) {\n\t\tthis._setBbox(_bbox);\n\n\t\tfor (const point of points) {\n\t\t\tpoint.position(_position);\n\t\t\tconst inBbox = _bbox.containsPoint(_position);\n\n\t\t\tif (inBbox) {\n\t\t\t\tthis.node.entitySelectionHelper.select(point);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _setBbox(target: Box3) {\n\t\ttarget.min.copy(this.node.pv.bboxSize).multiplyScalar(-0.5).add(this.node.pv.bboxCenter);\n\t\ttarget.max.copy(this.node.pv.bboxSize).multiplyScalar(0.5).add(this.node.pv.bboxCenter);\n\t}\n}\n","import {DeleteSopNode} from '../../Delete';\nimport {BaseCoreObject} from '../../../../../core/geometry/entities/object/BaseCoreObject';\nimport {ObjectType, objectTypeFromObject} from '../../../../../core/geometry/Constant';\nimport {CoreObjectType} from '../../../../../core/geometry/ObjectContent';\n\nexport const OBJECT_TYPES: ObjectType[] = [\n\tObjectType.MESH,\n\tObjectType.POINTS,\n\tObjectType.LINE_SEGMENTS,\n\tObjectType.GROUP,\n];\n\nexport const OBJECT_TYPE_MENU_ENTRIES = OBJECT_TYPES.map((name, value) => ({name, value}));\n\nexport class ByObjectTypeHelper {\n\tconstructor(private node: DeleteSopNode) {}\n\n\tevalForObjects(coreObjects: BaseCoreObject<CoreObjectType>[]) {\n\t\tconst objectType = OBJECT_TYPES[this.node.pv.objectType];\n\n\t\tfor (const coreObject of coreObjects) {\n\t\t\tconst object = coreObject.object();\n\t\t\tif (object) {\n\t\t\t\tif (objectTypeFromObject(object) == objectType) {\n\t\t\t\t\tthis.node.entitySelectionHelper.select(coreObject);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {DeleteSopNode} from '../../Delete';\nimport {CoreEntity} from '../../../../../core/geometry/CoreEntity';\nimport {Mesh, Vector3, Raycaster, Intersection, Box3} from 'three';\nimport {CoreGroup, Object3DWithGeometry} from '../../../../../core/geometry/Group';\nimport {MatDoubleSideTmpSetter} from '../../../../../core/render/MatDoubleSideTmpSetter';\n\nconst UP = new Vector3(0, 1, 0);\nconst DOWN = new Vector3(0, -1, 0);\nconst _pointPosition = new Vector3();\nconst _bbox = new Box3();\nconst _raycaster = new Raycaster();\nconst _intersections: Intersection[] = [];\n\nexport class ByBoundingObjectHelper {\n\tprivate _matDoubleSideTmpSetter = new MatDoubleSideTmpSetter();\n\n\tconstructor(private node: DeleteSopNode) {}\n\tevalForEntities(entities: CoreEntity[], coreGroup2?: CoreGroup) {\n\t\tif (!coreGroup2) {\n\t\t\treturn;\n\t\t}\n\t\tconst boundingObjects = coreGroup2.threejsObjectsWithGeo();\n\t\tfor (const boundingObject of boundingObjects) {\n\t\t\tthis._evalForBoundingObject(entities, coreGroup2, boundingObject);\n\t\t}\n\t}\n\tprivate _evalForBoundingObject(\n\t\tentities: CoreEntity[],\n\t\tcoreGroup2: CoreGroup,\n\t\tboundingObject: Object3DWithGeometry\n\t) {\n\t\tconst mesh = boundingObject as Mesh;\n\t\tif (!mesh.isMesh) {\n\t\t\treturn;\n\t\t}\n\t\tthis._matDoubleSideTmpSetter.setCoreGroupMaterialDoubleSided(coreGroup2);\n\n\t\t// const geo = boundingObject.geometry;\n\t\t// geo.computeBoundingBox();\n\t\t// _bbox.copy(geo.boundingBox!).applyMatrix4(boundingObject.matrixWorld);\n\t\t_bbox.setFromObject(boundingObject);\n\n\t\tfor (let i = 0; i < entities.length; i++) {\n\t\t\tconst entity = entities[i];\n\t\t\tentity.position(_pointPosition);\n\n\t\t\tif (_bbox.containsPoint(_pointPosition)) {\n\t\t\t\tif (\n\t\t\t\t\tthis._isPositionInObject(_pointPosition, mesh, UP) &&\n\t\t\t\t\tthis._isPositionInObject(_pointPosition, mesh, DOWN)\n\t\t\t\t) {\n\t\t\t\t\tthis.node.entitySelectionHelper.select(entity);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._matDoubleSideTmpSetter.restoreMaterialSideProperty(coreGroup2);\n\t}\n\tprivate _isPositionInObject(point: Vector3, object: Mesh, raydir: Vector3): boolean {\n\t\t_raycaster.ray.direction.copy(raydir);\n\t\t_raycaster.ray.origin.copy(point);\n\t\t_intersections.length = 0;\n\t\tconst intersections = _raycaster.intersectObject(object, false, _intersections);\n\t\tif (!intersections) {\n\t\t\treturn false;\n\t\t}\n\t\tif (intersections.length == 0) {\n\t\t\treturn false;\n\t\t}\n\t\tconst intersection = intersections[0];\n\t\tconst normal = intersection.face?.normal;\n\t\tif (!normal) {\n\t\t\treturn false;\n\t\t}\n\t\tconst dot = _raycaster.ray.direction.dot(normal);\n\t\treturn dot >= 0;\n\t}\n}\n","/**\n * Delete parts of the input geometry\n *\n * @remarks\n * This can be used in many ways to delete points or objects from the input.\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {\n\tAttribClass,\n\tObjectType,\n\tobjectTypeFromObject,\n\tAttribType,\n\tAttribTypeMenuEntries,\n\tATTRIBUTE_TYPES,\n\tAttribSize,\n\tATTRIBUTE_CLASSES,\n\tATTRIBUTE_SIZE_RANGE,\n\tATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP,\n\tAttribClassMenuEntriesWithoutCoreGroup,\n} from '../../../core/geometry/Constant';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {BaseCorePoint, CorePoint} from '../../../core/geometry/entities/point/CorePoint';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {EntitySelectionHelper} from './utils/delete/EntitySelectionHelper';\nimport {\n\tByAttributeHelper,\n\tComparisonOperatorMenuEntries,\n\tComparisonOperator,\n\tCOMPARISON_OPERATORS,\n} from './utils/delete/ByAttributeHelper';\nimport {ByExpressionHelper} from './utils/delete/ByExpressionHelper';\nimport {ByBboxHelper} from './utils/delete/ByBboxHelper';\nimport {ByObjectTypeHelper, OBJECT_TYPE_MENU_ENTRIES, OBJECT_TYPES} from './utils/delete/ByObjectTypeHelper';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {ByBoundingObjectHelper} from './utils/delete/ByBoundingObjectHelper';\nimport {geometryBuilder} from '../../../core/geometry/modules/three/builders/geometryBuilder';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {TypeAssert} from '../../poly/Assert';\nimport {primitivesFromObject} from '../../../core/geometry/entities/primitive/CorePrimitiveUtils';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CorePrimitive} from '../../../core/geometry/entities/primitive/CorePrimitive';\nimport {pointsFromObject} from '../../../core/geometry/entities/point/CorePointUtils';\n\nconst _points: CorePoint<CoreObjectType>[] = [];\n\nclass DeleteSopParamsConfig extends NodeParamsConfig {\n\t/** @param defines the class that should be deleted (objects or vertices) */\n\tclass = ParamConfig.INTEGER(ATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP.indexOf(AttribClass.POINT), {\n\t\tmenu: {\n\t\t\tentries: AttribClassMenuEntriesWithoutCoreGroup,\n\t\t},\n\t});\n\t/** @param invert the selection created in the parameters below */\n\tinvert = ParamConfig.BOOLEAN(0);\n\t// hide_objects = ParamConfig.BOOLEAN(0, {\n\t// \tvisibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)},\n\t// });\n\n\t// byObjectType\n\t/** @param deletes objects by object type */\n\tbyObjectType = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)},\n\t});\n\t/** @param sets which object types should be deleted */\n\tobjectType = ParamConfig.INTEGER(OBJECT_TYPES.indexOf(ObjectType.MESH), {\n\t\tmenu: {\n\t\t\tentries: OBJECT_TYPE_MENU_ENTRIES,\n\t\t},\n\t\tvisibleIf: {\n\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT),\n\t\t\tbyObjectType: true,\n\t\t},\n\t\tseparatorAfter: true,\n\t});\n\n\t// byExpression\n\t/** @param deletes objects by an expression */\n\tbyExpression = ParamConfig.BOOLEAN(0);\n\t/** @param sets the expression to select what should be deleted */\n\texpression = ParamConfig.BOOLEAN('@ptnum==0', {\n\t\tvisibleIf: {byExpression: true},\n\t\texpression: {forEntities: true},\n\t\tseparatorAfter: true,\n\t});\n\n\t// byAttrib\n\t/** @param deletes objects by an attribute */\n\tbyAttrib = ParamConfig.BOOLEAN(0);\n\t/** @param sets the type of the attribute for which items should be deleted */\n\tattribType = ParamConfig.INTEGER(ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), {\n\t\tmenu: {\n\t\t\tentries: AttribTypeMenuEntries,\n\t\t},\n\t\tvisibleIf: {byAttrib: 1},\n\t});\n\t/** @param name of the attribute used */\n\tattribName = ParamConfig.STRING('', {\n\t\tvisibleIf: {byAttrib: 1},\n\t});\n\t/** @param size of the attribute used */\n\tattribSize = ParamConfig.INTEGER(1, {\n\t\trange: ATTRIBUTE_SIZE_RANGE,\n\t\trangeLocked: [true, true],\n\t\tvisibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC)},\n\t});\n\t/** @param comparison operator */\n\tattribComparisonOperator = ParamConfig.INTEGER(COMPARISON_OPERATORS.indexOf(ComparisonOperator.EQUAL), {\n\t\tmenu: {\n\t\t\tentries: ComparisonOperatorMenuEntries,\n\t\t},\n\t\tvisibleIf: {\n\t\t\tbyAttrib: true,\n\t\t\tattribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC),\n\t\t\tattribSize: AttribSize.FLOAT,\n\t\t},\n\t});\n\t/** @param value of the attribute to compare with (when using float attribute) */\n\tattribValue1 = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 1},\n\t});\n\t/** @param value of the attribute to compare with (when using vector2 attribute) */\n\tattribValue2 = ParamConfig.VECTOR2([0, 0], {\n\t\tvisibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 2},\n\t});\n\t/** @param value of the attribute to compare with (when using vector3 attribute) */\n\tattribValue3 = ParamConfig.VECTOR3([0, 0, 0], {\n\t\tvisibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 3},\n\t});\n\t/** @param value of the attribute to compare with (when using vector4 attribute) */\n\tattribValue4 = ParamConfig.VECTOR4([0, 0, 0, 0], {\n\t\tvisibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 4},\n\t});\n\t/** @param value of the attribute to compare with (when using string attribute) */\n\tattribString = ParamConfig.STRING('', {\n\t\tvisibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.STRING)},\n\t\tseparatorAfter: true,\n\t});\n\n\t// byBbox\n\t/** @param deletes objects that are inside a bounding box */\n\tbyBbox = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: [\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),\n\t\t\t},\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.PRIMITIVE),\n\t\t\t},\n\t\t],\n\t});\n\t/** @param the bounding box size */\n\tbboxSize = ParamConfig.VECTOR3([1, 1, 1], {\n\t\tvisibleIf: [\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),\n\t\t\t\tbyBbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.PRIMITIVE),\n\t\t\t\tbyBbox: true,\n\t\t\t},\n\t\t],\n\t});\n\t/** @param the bounding box center */\n\tbboxCenter = ParamConfig.VECTOR3([0, 0, 0], {\n\t\tvisibleIf: [\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),\n\t\t\t\tbyBbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.PRIMITIVE),\n\t\t\t\tbyBbox: true,\n\t\t\t},\n\t\t],\n\t\tseparatorAfter: true,\n\t});\n\n\t// byBoundingObject\n\t/** @param deletes objects that are inside an object. This uses the object from the 2nd input */\n\tbyBoundingObject = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: [\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),\n\t\t\t},\n\t\t\t{\n\t\t\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.PRIMITIVE),\n\t\t\t},\n\t\t],\n\t});\n\n\t// by_visible\n\t// by_visible = ParamConfig.BOOLEAN(0, {\n\t// \tvisibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)},\n\t// });\n\t/** @param keeps points */\n\tkeepPoints = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)},\n\t});\n}\nconst ParamsConfig = new DeleteSopParamsConfig();\n\nexport class DeleteSopNode extends TypedSopNode<DeleteSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.DELETE;\n\t}\n\n\tprivate _markedForDeletionPerObjectIndex: Map<number, boolean> = new Map();\n\tpublic readonly entitySelectionHelper = new EntitySelectionHelper(this);\n\tpublic readonly byExpressionHelper = new ByExpressionHelper(this);\n\tpublic readonly byAttributeHelper = new ByAttributeHelper(this);\n\tpublic readonly byObjectTypeHelper = new ByObjectTypeHelper(this);\n\tpublic readonly byBboxHelper = new ByBboxHelper(this);\n\tpublic readonly byBoundingObjectHelper = new ByBoundingObjectHelper(this);\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1, 2);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup0 = inputCoreGroups[0];\n\t\tconst coreGroup1 = inputCoreGroups[1];\n\n\t\tif (!coreGroup0) {\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tconst attribClass = ATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP[this.pv.class];\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT:\n\t\t\t\treturn await this._evalForPoints(coreGroup0, coreGroup1);\n\t\t\tcase AttribClass.VERTEX:\n\t\t\t\tthis.states.error.set(`vertex not supported yet`);\n\t\t\tcase AttribClass.PRIMITIVE:\n\t\t\t\treturn await this._evalForPrimitives(coreGroup0, coreGroup1);\n\t\t\tcase AttribClass.OBJECT:\n\t\t\t\treturn await this._evalForObjects(coreGroup0);\n\t\t\tcase AttribClass.CORE_GROUP:\n\t\t\t\tthis.states.error.set(`core group not supported yet`);\n\t\t\t\treturn;\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n\n\tsetAttribClass(attribClass: AttribClass) {\n\t\tthis.p.class.set(ATTRIBUTE_CLASSES.indexOf(attribClass));\n\t}\n\tattribClass() {\n\t\treturn ATTRIBUTE_CLASSES[this.pv.class];\n\t}\n\tsetAttribType(attribType: AttribType) {\n\t\tthis.p.attribType.set(ATTRIBUTE_TYPES.indexOf(attribType));\n\t}\n\tattribType() {\n\t\treturn ATTRIBUTE_TYPES[this.pv.attribType];\n\t}\n\n\tprivate async _evalForPoints(coreGroup: CoreGroup, coreGroup2?: CoreGroup) {\n\t\tconst objects = coreGroup.allObjects();\n\t\tconst newObjects: ObjectContent<CoreObjectType>[] = [];\n\t\tfor (const object of objects) {\n\t\t\tconst entities: CorePoint<CoreObjectType>[] = [];\n\t\t\tpointsFromObject(object, entities);\n\t\t\tthis.entitySelectionHelper.init(entities);\n\n\t\t\tconst initEntitiesCount = entities.length;\n\t\t\tif (isBooleanTrue(this.pv.byExpression)) {\n\t\t\t\tawait this.byExpressionHelper.evalForEntities(entities);\n\t\t\t}\n\t\t\t// TODO: the helpers do not yet take into account if an entity has been selected or not.\n\t\t\t// This could really speed up iterating through them, as I could skip the ones that have already been\n\t\t\tif (isBooleanTrue(this.pv.byAttrib) && this.pv.attribName != '') {\n\t\t\t\tthis.byAttributeHelper.evalForEntities(entities);\n\t\t\t}\n\t\t\tif (isBooleanTrue(this.pv.byBbox)) {\n\t\t\t\tthis.byBboxHelper.evalForEntities(entities);\n\t\t\t}\n\t\t\tif (isBooleanTrue(this.pv.byBoundingObject)) {\n\t\t\t\tthis.byBoundingObjectHelper.evalForEntities(entities, coreGroup2);\n\t\t\t}\n\t\t\tconst keptEntities = this.entitySelectionHelper.entitiesToKeep() as BaseCorePoint[];\n\n\t\t\tif (keptEntities.length == initEntitiesCount) {\n\t\t\t\tnewObjects.push(object);\n\t\t\t} else {\n\t\t\t\tif (keptEntities.length > 0) {\n\t\t\t\t\tconst objectType = objectTypeFromObject(object);\n\t\t\t\t\tif (objectType) {\n\t\t\t\t\t\tconst builder = geometryBuilder(objectType);\n\t\t\t\t\t\tif (builder) {\n\t\t\t\t\t\t\tconst newGeo = builder.fromPoints(object, keptEntities);\n\t\t\t\t\t\t\tif (newGeo) {\n\t\t\t\t\t\t\t\tobject.geometry = newGeo;\n\t\t\t\t\t\t\t\tnewObjects.push(object);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('no builder found for', objectType);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('no object type found for', object);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.setObjects(newObjects);\n\t}\n\n\tprivate async _evalForPrimitives(coreGroup: CoreGroup, coreGroup2?: CoreGroup) {\n\t\tconst objects = coreGroup.allObjects();\n\t\tconst newObjects: ObjectContent<CoreObjectType>[] = [];\n\t\tfor (const object of objects) {\n\t\t\tconst entities: CorePrimitive<CoreObjectType>[] = [];\n\t\t\tprimitivesFromObject(object, entities);\n\t\t\tthis.entitySelectionHelper.init(entities);\n\n\t\t\tconst initEntitiesCount = entities.length;\n\t\t\tif (isBooleanTrue(this.pv.byExpression)) {\n\t\t\t\tawait this.byExpressionHelper.evalForEntities(entities);\n\t\t\t}\n\t\t\t// TODO: the helpers do not yet take into account if an entity has been selected or not.\n\t\t\t// This could really speed up iterating through them, as I could skip the ones that have already been\n\t\t\tif (isBooleanTrue(this.pv.byAttrib) && this.pv.attribName != '') {\n\t\t\t\tthis.byAttributeHelper.evalForEntities(entities);\n\t\t\t}\n\t\t\tif (isBooleanTrue(this.pv.byBbox)) {\n\t\t\t\tthis.byBboxHelper.evalForEntities(entities);\n\t\t\t}\n\t\t\tif (isBooleanTrue(this.pv.byBoundingObject)) {\n\t\t\t\tthis.byBoundingObjectHelper.evalForEntities(entities, coreGroup2);\n\t\t\t}\n\t\t\tconst keptEntities = this.entitySelectionHelper.entitiesToKeep() as CorePrimitive<CoreObjectType>[];\n\n\t\t\tif (keptEntities.length == initEntitiesCount) {\n\t\t\t\tnewObjects.push(object);\n\t\t\t} else {\n\t\t\t\tif (keptEntities.length > 0) {\n\t\t\t\t\tconst builder = keptEntities[0].builder();\n\t\t\t\t\tif (builder) {\n\t\t\t\t\t\tconst newObject = builder(object, keptEntities);\n\t\t\t\t\t\tif (newObject) {\n\t\t\t\t\t\t\tnewObjects.push(newObject);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst attribClass = ATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP[this.pv.class];\n\t\t\t\t\t\tconsole.warn(`no ${attribClass} builder for object`, object);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.setObjects(newObjects);\n\t}\n\n\tprivate async _evalForObjects(coreGroup: CoreGroup) {\n\t\tconst coreObjects = coreGroup.allCoreObjects();\n\t\tthis.entitySelectionHelper.init(coreObjects);\n\n\t\tthis._markedForDeletionPerObjectIndex = new Map();\n\t\tfor (let coreObject of coreObjects) {\n\t\t\tthis._markedForDeletionPerObjectIndex.set(coreObject.index(), false);\n\t\t}\n\n\t\tif (isBooleanTrue(this.pv.byExpression)) {\n\t\t\tawait this.byExpressionHelper.evalForEntities(coreObjects);\n\t\t}\n\n\t\tif (isBooleanTrue(this.pv.byObjectType)) {\n\t\t\tthis.byObjectTypeHelper.evalForObjects(coreObjects);\n\t\t}\n\n\t\tif (isBooleanTrue(this.pv.byAttrib) && this.pv.attribName != '') {\n\t\t\tthis.byAttributeHelper.evalForEntities(coreObjects);\n\t\t}\n\n\t\tconst coreObjectsToKeep = this.entitySelectionHelper.entitiesToKeep() as ThreejsCoreObject[];\n\t\tconst objectsToKeep = coreObjectsToKeep.map((co) => co.object());\n\n\t\tif (isBooleanTrue(this.pv.keepPoints)) {\n\t\t\tconst coreObjectsToDelete = this.entitySelectionHelper.entitiesToDelete() as ThreejsCoreObject[];\n\t\t\tfor (let coreObjectToDelete of coreObjectsToDelete) {\n\t\t\t\tconst pointObject = this._pointObject(coreObjectToDelete.object());\n\t\t\t\tif (pointObject) {\n\t\t\t\t\tobjectsToKeep.push(pointObject);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setObjects(objectsToKeep);\n\t}\n\n\tprivate _pointObject<T extends CoreObjectType>(object: ObjectContent<T>) {\n\t\tpointsFromObject(object, _points);\n\t\tconst builder = geometryBuilder(ObjectType.POINTS);\n\t\tif (builder) {\n\t\t\tconst geometry = builder.fromPoints(object, _points);\n\t\t\tif (geometry) return this.createObject(geometry, ObjectType.POINTS);\n\t\t}\n\t}\n}\n","/**\n * Creates a directional light.\n *\n * @remarks\n * This is very similar to the [object level DirectionalLight](https://polygonjs.com/docs/nodes/obj/DirectionalLight), but can be more useful if you want to instanciate it or process it using other SOP nodes.\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\n\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {DirectionalLightParamConfig} from '../../../core/lights/DirectionalLight';\nimport {DirectionalLightSopOperation} from '../../operations/sop/DirectionalLight';\nimport {LightType} from '../../poly/registers/nodes/types/Light';\nclass DirectionalLightSopParamsConfig extends DirectionalLightParamConfig(NodeParamsConfig) {}\nconst ParamsConfig = new DirectionalLightSopParamsConfig();\n\nexport class DirectionalLightSopNode extends TypedSopNode<DirectionalLightSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn LightType.DIRECTIONAL;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0);\n\t}\n\n\tprivate _operation: DirectionalLightSopOperation | undefined;\n\toverride cook(input_contents: CoreGroup[]) {\n\t\tthis._operation = this._operation || new DirectionalLightSopOperation(this._scene, this.states, this);\n\t\tconst core_group = this._operation.cook(input_contents, this.pv);\n\t\tthis.setCoreGroup(core_group);\n\t}\n}\n","import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tColor,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRepeatWrapping,\n\tScene,\n\tSource,\n\tSRGBColorSpace,\n\tCompressedTexture,\n\tVector3,\n\tQuaternion,\n\tREVISION\n} from 'three';\nimport { decompress } from './../utils/TextureUtils.js';\n\n\n/**\n * The KHR_mesh_quantization extension allows these extra attribute component types\n *\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes\n */\nconst KHR_mesh_quantization_ExtraAttrTypes = {\n\tPOSITION: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'unsigned byte normalized',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t\t'unsigned short normalized',\n\t],\n\tNORMAL: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTANGENT: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTEXCOORD: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t],\n};\n\n\nclass GLTFExporter {\n\n\tconstructor() {\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( writer );\n\n\t\t} );\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param  {Scene or [THREE.Scenes]} input   Scene or Array of THREE.Scenes\n\t * @param  {Function} onDone  Callback on completed\n\t * @param  {Function} onError  Callback on errors\n\t * @param  {Object} options options\n\t */\n\tparse( input, onDone, onError, options ) {\n\n\t\tconst writer = new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.write( input, onDone, options ).catch( onError );\n\n\t}\n\n\tparseAsync( input, options ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( input, resolve, reject, options );\n\n\t\t} );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tBYTE: 0x1400,\n\tUNSIGNED_BYTE: 0x1401,\n\tSHORT: 0x1402,\n\tUNSIGNED_SHORT: 0x1403,\n\tINT: 0x1404,\n\tUNSIGNED_INT: 0x1405,\n\tFLOAT: 0x1406,\n\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\nconst DEFAULT_SPECULAR_COLOR = new Color();\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n * @param  {Array} array1 Array 1 to compare\n * @param  {Array} array2 Array 2 to compare\n * @return {Boolean}        Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param  {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\treturn new TextEncoder().encode( text ).buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @param {Matrix4} matrix\n * @returns {Boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n * @param  {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param  {Integer} start\n * @param  {Integer} count\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param {Integer} bufferSize The size the original buffer.\n * @returns {Integer} new buffer size with required padding.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {Integer} paddingByte (Optional)\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nfunction getCanvas() {\n\n\tif ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) {\n\n\t\treturn new OffscreenCanvas( 1, 1 );\n\n\t}\n\n\treturn document.createElement( 'canvas' );\n\n}\n\nfunction getToBlobPromise( canvas, mimeType ) {\n\n\tif ( canvas.toBlob !== undefined ) {\n\n\t\treturn new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );\n\n\t}\n\n\tlet quality;\n\n\t// Blink's implementation of convertToBlob seems to default to a quality level of 100%\n\t// Use the Blink default quality levels of toBlob instead so that file sizes are comparable.\n\tif ( mimeType === 'image/jpeg' ) {\n\n\t\tquality = 0.92;\n\n\t} else if ( mimeType === 'image/webp' ) {\n\n\t\tquality = 0.8;\n\n\t}\n\n\treturn canvas.convertToBlob( {\n\n\t\ttype: mimeType,\n\t\tquality: quality\n\n\t} );\n\n}\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\n\t\tthis.extensionsUsed = {};\n\t\tthis.extensionsRequired = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter r' + REVISION\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param  {Scene or [THREE.Scenes]} input   Scene or Array of THREE.Scenes\n\t * @param  {Function} onDone  Callback on completed\n\t * @param  {Object} options options\n\t */\n\tasync write( input, onDone, options = {} ) {\n\n\t\tthis.options = Object.assign( {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tthis.processInput( input );\n\n\t\tawait Promise.all( this.pending );\n\n\t\tconst writer = this;\n\t\tconst buffers = writer.buffers;\n\t\tconst json = writer.json;\n\t\toptions = writer.options;\n\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\t\tconst extensionsRequired = writer.extensionsRequired;\n\n\t\t// Merge buffers.\n\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t// Declare extensions.\n\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\t\tconst extensionsRequiredList = Object.keys( extensionsRequired );\n\n\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\t\tif ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList;\n\n\t\t// Update bytelength of the single buffer.\n\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\t// Binary chunk.\n\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t// JSON chunk.\n\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t// GLB header.\n\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\theader,\n\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\tjsonChunk,\n\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\tbinaryChunk\n\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\tconst glbReader = new FileReader();\n\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\tonDone( glbReader.result );\n\n\t\t\t\t};\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tonDone( json );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns ids for buffer attributes.\n\t * @param  {Object} object\n\t * @return {Integer}\n\t */\n\tgetUID( attribute, isRelativeCopy = false ) {\n\n\t\tif ( this.uids.has( attribute ) === false ) {\n\n\t\t\tconst uids = new Map();\n\n\t\t\tuids.set( true, this.uid ++ );\n\t\t\tuids.set( false, this.uid ++ );\n\n\t\t\tthis.uids.set( attribute, uids );\n\n\t\t}\n\n\t\tconst uids = this.uids.get( attribute );\n\n\t\treturn uids.get( isRelativeCopy );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {Boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\tbuildMetalRoughTexture( metalnessMap, roughnessMap ) {\n\n\t\tif ( metalnessMap === roughnessMap ) return metalnessMap;\n\n\t\tfunction getEncodingConversion( map ) {\n\n\t\t\tif ( map.colorSpace === SRGBColorSpace ) {\n\n\t\t\t\treturn function SRGBToLinear( c ) {\n\n\t\t\t\t\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn function LinearToLinear( c ) {\n\n\t\t\t\treturn c;\n\n\t\t\t};\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );\n\n\t\tif ( metalnessMap instanceof CompressedTexture ) {\n\n\t\t\tmetalnessMap = decompress( metalnessMap );\n\n\t\t}\n\n\t\tif ( roughnessMap instanceof CompressedTexture ) {\n\n\t\t\troughnessMap = decompress( roughnessMap );\n\n\t\t}\n\n\t\tconst metalness = metalnessMap ? metalnessMap.image : null;\n\t\tconst roughness = roughnessMap ? roughnessMap.image : null;\n\n\t\tconst width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 );\n\t\tconst height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 );\n\n\t\tconst canvas = getCanvas();\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d', {\n\t\t\twillReadFrequently: true,\n\t\t} );\n\t\tcontext.fillStyle = '#00ffff';\n\t\tcontext.fillRect( 0, 0, width, height );\n\n\t\tconst composite = context.getImageData( 0, 0, width, height );\n\n\t\tif ( metalness ) {\n\n\t\t\tcontext.drawImage( metalness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( metalnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 2; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( roughness ) {\n\n\t\t\tcontext.drawImage( roughness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( roughnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 1; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcontext.putImageData( composite, 0, 0 );\n\n\t\t//\n\n\t\tconst reference = metalnessMap || roughnessMap;\n\n\t\tconst texture = reference.clone();\n\n\t\ttexture.source = new Source( canvas );\n\t\ttexture.colorSpace = NoColorSpace;\n\t\ttexture.channel = ( metalnessMap || roughnessMap ).channel;\n\n\t\tif ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param  {ArrayBuffer} buffer\n\t * @return {Integer}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param  {BufferAttribute} attribute\n\t * @param  {number} componentType\n\t * @param  {number} start\n\t * @param  {number} count\n\t * @param  {number} target (Optional) Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tswitch ( componentType ) {\n\n\t\t\tcase WEBGL_CONSTANTS.BYTE:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_BYTE:\n\n\t\t\t\tcomponentSize = 1;\n\n\t\t\t\tbreak;\n\n\t\t\tcase WEBGL_CONSTANTS.SHORT:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_SHORT:\n\n\t\t\t\tcomponentSize = 2;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tlet byteStride = attribute.itemSize * componentSize;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Each element of a vertex attribute MUST be aligned to 4-byte boundaries\n\t\t\t// inside a bufferView\n\t\t\tbyteStride = Math.ceil( byteStride / 4 ) * 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * byteStride );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.INT ) {\n\n\t\t\t\t\tdataView.setInt32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.SHORT ) {\n\n\t\t\t\t\tdataView.setInt16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.BYTE ) {\n\n\t\t\t\t\tdataView.setInt8( offset, value );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t\tif ( ( offset % byteStride ) !== 0 ) {\n\n\t\t\t\toffset += byteStride - ( offset % byteStride );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = byteStride;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise<Integer>}\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param  {BufferAttribute} attribute Attribute to process\n\t * @param  {THREE.BufferGeometry} geometry (Optional) Geometry used for truncated draw range\n\t * @param  {Integer} start (Optional)\n\t * @param  {Integer} count (Optional)\n\t * @return {Integer|null} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t9: 'MAT3',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Int32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.INT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Int16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Int8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.BYTE;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined || count === Infinity ) count = attribute.count;\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param  {Image} image to process\n\t * @param  {Integer} format of the image (RGBAFormat)\n\t * @param  {Boolean} flipY before writing out the image\n\t * @param  {String} mimeType export format\n\t * @return {Integer}     Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY, mimeType = 'image/png' ) {\n\n\t\tif ( image !== null ) {\n\n\t\t\tconst writer = this;\n\t\t\tconst cache = writer.cache;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst pending = writer.pending;\n\n\t\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\t\tconst cachedImages = cache.images.get( image );\n\n\t\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\t\tif ( ! json.images ) json.images = [];\n\n\t\t\tconst imageDef = { mimeType: mimeType };\n\n\t\t\tconst canvas = getCanvas();\n\n\t\t\tcanvas.width = Math.min( image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d', {\n\t\t\t\twillReadFrequently: true,\n\t\t\t} );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\n\n\t\t\tif ( image.data !== undefined ) { // THREE.DataTexture\n\n\t\t\t\tif ( format !== RGBAFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGBAFormat is supported.', format );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) {\n\n\t\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push(\n\n\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t.then( blob => writer.processBufferViewImage( blob ) )\n\t\t\t\t\t\t.then( bufferViewIndex => {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\n\t\t\t\t\t\t} )\n\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tif ( canvas.toDataURL !== undefined ) {\n\n\t\t\t\t\timageDef.uri = canvas.toDataURL( mimeType );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpending.push(\n\n\t\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t\t.then( blob => new FileReader().readAsDataURL( blob ) )\n\t\t\t\t\t\t\t.then( dataURL => {\n\n\t\t\t\t\t\t\t\timageDef.uri = dataURL;\n\n\t\t\t\t\t\t\t} )\n\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst index = json.images.push( imageDef ) - 1;\n\t\t\tcachedImages[ key ] = index;\n\t\t\treturn index;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param  {Texture} map Texture to process\n\t * @return {Integer}     Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param  {Texture} map Map to process\n\t * @return {Integer} Index of the processed texture in the \"textures\" array\n\t */\n\tprocessTexture( map ) {\n\n\t\tconst writer = this;\n\t\tconst options = writer.options;\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\t// make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture\n\t\tif ( map instanceof CompressedTexture ) {\n\n\t\t\tmap = decompress( map, options.maxTextureSize );\n\n\t\t}\n\n\t\tlet mimeType = map.userData.mimeType;\n\n\t\tif ( mimeType === 'image/webp' ) mimeType = 'image/png';\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: this.processImage( map.image, map.format, map.flipY, mimeType )\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeTexture && ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param  {THREE.Material} material Material to process\n\t * @return {Integer|null} Index of the processed material in the \"materials\" array\n\t */\n\tprocessMaterial( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.5;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.5;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( material.metalnessMap || material.roughnessMap ) {\n\n\t\t\tconst metalRoughTexture = this.buildMetalRoughTexture( material.metalnessMap, material.roughnessMap );\n\n\t\t\tconst metalRoughMapDef = {\n\t\t\t\tindex: this.processTexture( metalRoughTexture ),\n\t\t\t\tchannel: metalRoughTexture.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( metalRoughMapDef, metalRoughTexture );\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture\n\t\tif ( material.map ) {\n\n\t\t\tconst baseColorMapDef = {\n\t\t\t\tindex: this.processTexture( material.map ),\n\t\t\t\ttexCoord: material.map.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tconst emissive = material.emissive;\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = material.emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tconst emissiveMapDef = {\n\t\t\t\t\tindex: this.processTexture( material.emissiveMap ),\n\t\t\t\t\ttexCoord: material.emissiveMap.channel\n\t\t\t\t};\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( material.normalMap ) {\n\n\t\t\tconst normalMapDef = {\n\t\t\t\tindex: this.processTexture( material.normalMap ),\n\t\t\t\ttexCoord: material.normalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== 1 ) {\n\n\t\t\t\t// glTF normal scale is univariate. Ignore `y`, which may be flipped.\n\t\t\t\t// Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( material.aoMap ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: this.processTexture( material.aoMap ),\n\t\t\t\ttexCoord: material.aoMap.channel\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMaterial && ext.writeMaterial( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param  {THREE.Mesh} mesh Mesh to process\n\t * @return {Integer|null} Index of the processed mesh in the \"meshes\" array\n\t */\n\tprocessMesh( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv1: 'TEXCOORD_1',\n\t\t\tuv2: 'TEXCOORD_2',\n\t\t\tuv3: 'TEXCOORD_3',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.slice( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT.\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tif ( ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\t\tthis.detectMeshQuantization( attributeName, attribute );\n\n\t\t\t\t}\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tconst gltfAttributeName = attributeName.toUpperCase();\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute, true ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = attribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n\t\t\t\t\t\tfor ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\t\t\t\t\tif ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) );\n\t\t\t\t\t\t\t\tif ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) );\n\t\t\t\t\t\t\t\tif ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) );\n\t\t\t\t\t\t\t\tif ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tlet didForceIndices = false;\n\n\t\tif ( isMultiMaterial && geometry.index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) {\n\n\t\t\t\tindices[ i ] = i;\n\n\t\t\t}\n\n\t\t\tgeometry.setIndex( indices );\n\n\t\t\tdidForceIndices = true;\n\n\t\t}\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = this.processMaterial( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tif ( didForceIndices === true ) {\n\n\t\t\tgeometry.setIndex( null );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * If a vertex attribute with a\n\t * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)\n\t * is used, it is checked whether it is a valid data type according to the\n\t * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\n\t * extension.\n\t * In this case the extension is automatically added to the list of used extensions.\n\t *\n\t * @param {string} attributeName\n\t * @param {THREE.BufferAttribute} attribute\n\t */\n\tdetectMeshQuantization( attributeName, attribute ) {\n\n\t\tif ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return;\n\n\t\tlet attrType = undefined;\n\n\t\tswitch ( attribute.array.constructor ) {\n\n\t\t\tcase Int8Array:\n\n\t\t\t\tattrType = 'byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint8Array:\n\n\t\t\t\tattrType = 'unsigned byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Int16Array:\n\n\t\t\t\tattrType = 'short';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint16Array:\n\n\t\t\t\tattrType = 'unsigned short';\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.normalized ) attrType += ' normalized';\n\n\t\tconst attrNamePrefix = attributeName.split( '_', 1 )[ 0 ];\n\n\t\tif ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) {\n\n\t\t\tthis.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true;\n\t\t\tthis.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param  {THREE.Camera} camera Camera to process\n\t * @return {Integer}      Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {number|null}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tjson.animations.push( {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t} );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {number|null}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param  {THREE.Object3D} node Object3D to processNode\n\t * @return {Integer} Index of the node in the nodes list\n\t */\n\tprocessNode( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = this.processMesh( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\t\tif ( nodeIndex !== null ) children.push( nodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param  {Scene} node Scene to process\n\t */\n\tprocessScene( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param  {Array} objects List of objects to process\n\t */\n\tprocessObjects( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tthis.processScene( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array<THREE.Object3D>} input\n\t */\n\tprocessInput( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tthis.processScene( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) this.processObjects( objectsWithoutScene );\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ], input[ 0 ] );\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tfunc( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_clearcoat';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.clearcoatFactor = material.clearcoat;\n\n\t\tif ( material.clearcoatMap ) {\n\n\t\t\tconst clearcoatMapDef = {\n\t\t\t\tindex: writer.processTexture( material.clearcoatMap ),\n\t\t\t\ttexCoord: material.clearcoatMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );\n\t\t\textensionDef.clearcoatTexture = clearcoatMapDef;\n\n\t\t}\n\n\t\textensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;\n\n\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\tconst clearcoatRoughnessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.clearcoatRoughnessMap ),\n\t\t\t\ttexCoord: material.clearcoatRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );\n\t\t\textensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\tconst clearcoatNormalMapDef = {\n\t\t\t\tindex: writer.processTexture( material.clearcoatNormalMap ),\n\t\t\t\ttexCoord: material.clearcoatNormalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.clearcoatNormalScale.x !== 1 ) clearcoatNormalMapDef.scale = material.clearcoatNormalScale.x;\n\n\t\t\twriter.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );\n\t\t\textensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_dispersion';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.dispersion === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.dispersion = material.dispersion;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_iridescence';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.iridescenceFactor = material.iridescence;\n\n\t\tif ( material.iridescenceMap ) {\n\n\t\t\tconst iridescenceMapDef = {\n\t\t\t\tindex: writer.processTexture( material.iridescenceMap ),\n\t\t\t\ttexCoord: material.iridescenceMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceMapDef, material.iridescenceMap );\n\t\t\textensionDef.iridescenceTexture = iridescenceMapDef;\n\n\t\t}\n\n\t\textensionDef.iridescenceIor = material.iridescenceIOR;\n\t\textensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];\n\t\textensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];\n\n\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\tconst iridescenceThicknessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.iridescenceThicknessMap ),\n\t\t\t\ttexCoord: material.iridescenceThicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap );\n\t\t\textensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_transmission';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.transmissionFactor = material.transmission;\n\n\t\tif ( material.transmissionMap ) {\n\n\t\t\tconst transmissionMapDef = {\n\t\t\t\tindex: writer.processTexture( material.transmissionMap ),\n\t\t\t\ttexCoord: material.transmissionMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( transmissionMapDef, material.transmissionMap );\n\t\t\textensionDef.transmissionTexture = transmissionMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_volume';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.thicknessFactor = material.thickness;\n\n\t\tif ( material.thicknessMap ) {\n\n\t\t\tconst thicknessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.thicknessMap ),\n\t\t\t\ttexCoord: material.thicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( thicknessMapDef, material.thicknessMap );\n\t\t\textensionDef.thicknessTexture = thicknessMapDef;\n\n\t\t}\n\n\t\textensionDef.attenuationDistance = material.attenuationDistance;\n\t\textensionDef.attenuationColor = material.attenuationColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_ior';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.ior = material.ior;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_specular';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&\n\t\t       material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&\n\t\t     ! material.specularIntensityMap && ! material.specularColorMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tconst specularIntensityMapDef = {\n\t\t\t\tindex: writer.processTexture( material.specularIntensityMap ),\n\t\t\t\ttexCoord: material.specularIntensityMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap );\n\t\t\textensionDef.specularTexture = specularIntensityMapDef;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tconst specularColorMapDef = {\n\t\t\t\tindex: writer.processTexture( material.specularColorMap ),\n\t\t\t\ttexCoord: material.specularColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularColorMapDef, material.specularColorMap );\n\t\t\textensionDef.specularColorTexture = specularColorMapDef;\n\n\t\t}\n\n\t\textensionDef.specularFactor = material.specularIntensity;\n\t\textensionDef.specularColorFactor = material.specularColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_sheen';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\tconst sheenRoughnessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.sheenRoughnessMap ),\n\t\t\t\ttexCoord: material.sheenRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap );\n\t\t\textensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.sheenColorMap ) {\n\n\t\t\tconst sheenColorMapDef = {\n\t\t\t\tindex: writer.processTexture( material.sheenColorMap ),\n\t\t\t\ttexCoord: material.sheenColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenColorMapDef, material.sheenColorMap );\n\t\t\textensionDef.sheenColorTexture = sheenColorMapDef;\n\n\t\t}\n\n\t\textensionDef.sheenRoughnessFactor = material.sheenRoughness;\n\t\textensionDef.sheenColorFactor = material.sheenColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Anisotropy Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_anisotropy';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.anisotropyMap ) {\n\n\t\t\tconst anisotropyMapDef = { index: writer.processTexture( material.anisotropyMap ) };\n\t\t\twriter.applyTextureTransform( anisotropyMapDef, material.anisotropyMap );\n\t\t\textensionDef.anisotropyTexture = anisotropyMapDef;\n\n\t\t}\n\n\t\textensionDef.anisotropyStrength = material.anisotropy;\n\t\textensionDef.anisotropyRotation = material.anisotropyRotation;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_emissive_strength';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.emissiveStrength = material.emissiveIntensity;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_materials_bump';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || (\n\t\t       material.bumpScale === 1 &&\n\t\t     ! material.bumpMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tconst bumpMapDef = {\n\t\t\t\tindex: writer.processTexture( material.bumpMap ),\n\t\t\t\ttexCoord: material.bumpMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( bumpMapDef, material.bumpMap );\n\t\t\textensionDef.bumpTexture = bumpMapDef;\n\n\t\t}\n\n\t\textensionDef.bumpFactor = material.bumpScale;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_mesh_gpu_instancing';\n\n\t}\n\n\twriteNode( object, nodeDef ) {\n\n\t\tif ( ! object.isInstancedMesh ) return;\n\n\t\tconst writer = this.writer;\n\n\t\tconst mesh = object;\n\n\t\tconst translationAttr = new Float32Array( mesh.count * 3 );\n\t\tconst rotationAttr = new Float32Array( mesh.count * 4 );\n\t\tconst scaleAttr = new Float32Array( mesh.count * 3 );\n\n\t\tconst matrix = new Matrix4();\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3();\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tmesh.getMatrixAt( i, matrix );\n\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\tposition.toArray( translationAttr, i * 3 );\n\t\t\tquaternion.toArray( rotationAttr, i * 4 );\n\t\t\tscale.toArray( scaleAttr, i * 3 );\n\n\t\t}\n\n\t\tconst attributes = {\n\t\t\tTRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ),\n\t\t\tROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ),\n\t\t\tSCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ),\n\t\t};\n\n\t\tif ( mesh.instanceColor )\n\t\t\tattributes._COLOR_0 = writer.processAccessor( mesh.instanceColor );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { attributes };\n\n\t\twriter.extensionsUsed[ this.name ] = true;\n\t\twriter.extensionsRequired[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n */\nGLTFExporter.Utils = {\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t}\n\n};\n\nexport { GLTFExporter };\n","/**\n * Exports the input as GLTF\n *\n * @remarks\n */\nimport {ExporterSopNode, BaseExporterSopParamsConfig} from './_BaseExporter';\nimport {GLTFExporter, GLTFExporterOptions} from 'three/examples/jsm/exporters/GLTFExporter';\nimport {SopExporter} from '../../poly/registers/nodes/types/Sop';\n\nclass ExporterGLTFSopParamsConfig extends BaseExporterSopParamsConfig {}\nconst ParamsConfig = new ExporterGLTFSopParamsConfig();\n\nexport class ExporterGLTFSopNode extends ExporterSopNode<ExporterGLTFSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopExporter.EXPORTER_GLTF;\n\t}\n\n\tfileExtension() {\n\t\treturn 'glb';\n\t}\n\tcreateBlob(): Promise<Blob> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst sceneData = await this._prepareScene();\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst {scene, objects} = sceneData;\n\n\t\t\tconst options: GLTFExporterOptions = {\n\t\t\t\tembedImages: true,\n\t\t\t\t// trs: true,\n\t\t\t\t// onlyVisible: true,\n\t\t\t\t// truncateDrawRange: false,\n\t\t\t\tbinary: true,\n\t\t\t\t// maxTextureSize: Infinity\n\t\t\t};\n\t\t\tconst exporter = new GLTFExporter();\n\t\t\texporter.parse(\n\t\t\t\tscene,\n\t\t\t\tasync (result) => {\n\t\t\t\t\tthis._handleResult(result, objects, resolve);\n\t\t\t\t},\n\t\t\t\t(err) => {},\n\t\t\t\toptions\n\t\t\t);\n\t\t});\n\t}\n}\n","import {\n\tColor,\n\tMatrix3,\n\tVector2,\n\tVector3\n} from 'three';\n\nclass OBJExporter {\n\n\tparse( object ) {\n\n\t\tlet output = '';\n\n\t\tlet indexVertex = 0;\n\t\tlet indexVertexUvs = 0;\n\t\tlet indexNormals = 0;\n\n\t\tconst vertex = new Vector3();\n\t\tconst color = new Color();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\tconst face = [];\n\n\t\tfunction parseMesh( mesh ) {\n\n\t\t\tlet nbVertex = 0;\n\t\t\tlet nbNormals = 0;\n\t\t\tlet nbVertexUvs = 0;\n\n\t\t\tconst geometry = mesh.geometry;\n\n\t\t\tconst normalMatrixWorld = new Matrix3();\n\n\t\t\t// shortcuts\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t// name of the mesh object\n\t\t\toutput += 'o ' + mesh.name + '\\n';\n\n\t\t\t// name of the mesh material\n\t\t\tif ( mesh.material && mesh.material.name ) {\n\n\t\t\t\toutput += 'usemtl ' + mesh.material.name + '\\n';\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tif ( vertices !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\t// transform the vertex to world space\n\t\t\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\n\t\t\t\t\t// transform the vertex to export format\n\t\t\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = uvs.count; i < l; i ++, nbVertexUvs ++ ) {\n\n\t\t\t\t\tuv.fromBufferAttribute( uvs, i );\n\n\t\t\t\t\t// transform the uv to export format\n\t\t\t\t\toutput += 'vt ' + uv.x + ' ' + uv.y + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( mesh.matrixWorld );\n\n\t\t\t\tfor ( let i = 0, l = normals.count; i < l; i ++, nbNormals ++ ) {\n\n\t\t\t\t\tnormal.fromBufferAttribute( normals, i );\n\n\t\t\t\t\t// transform the normal to world space\n\t\t\t\t\tnormal.applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t// transform the normal to export format\n\t\t\t\t\toutput += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tif ( indices !== null ) {\n\n\t\t\t\tfor ( let i = 0, l = indices.count; i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( let m = 0; m < 3; m ++ ) {\n\n\t\t\t\t\t\tconst j = indices.getX( i + m ) + 1;\n\n\t\t\t\t\t\tface[ m ] = ( indexVertex + j ) + ( normals || uvs ? '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + ( normals ? '/' + ( indexNormals + j ) : '' ) : '' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// transform the face to export format\n\t\t\t\t\toutput += 'f ' + face.join( ' ' ) + '\\n';\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( let m = 0; m < 3; m ++ ) {\n\n\t\t\t\t\t\tconst j = i + m + 1;\n\n\t\t\t\t\t\tface[ m ] = ( indexVertex + j ) + ( normals || uvs ? '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + ( normals ? '/' + ( indexNormals + j ) : '' ) : '' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// transform the face to export format\n\t\t\t\t\toutput += 'f ' + face.join( ' ' ) + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update index\n\t\t\tindexVertex += nbVertex;\n\t\t\tindexVertexUvs += nbVertexUvs;\n\t\t\tindexNormals += nbNormals;\n\n\t\t}\n\n\t\tfunction parseLine( line ) {\n\n\t\t\tlet nbVertex = 0;\n\n\t\t\tconst geometry = line.geometry;\n\t\t\tconst type = line.type;\n\n\t\t\t// shortcuts\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\n\t\t\t// name of the line object\n\t\t\toutput += 'o ' + line.name + '\\n';\n\n\t\t\tif ( vertices !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\t// transform the vertex to world space\n\t\t\t\t\tvertex.applyMatrix4( line.matrixWorld );\n\n\t\t\t\t\t// transform the vertex to export format\n\t\t\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( type === 'Line' ) {\n\n\t\t\t\toutput += 'l ';\n\n\t\t\t\tfor ( let j = 1, l = vertices.count; j <= l; j ++ ) {\n\n\t\t\t\t\toutput += ( indexVertex + j ) + ' ';\n\n\t\t\t\t}\n\n\t\t\t\toutput += '\\n';\n\n\t\t\t}\n\n\t\t\tif ( type === 'LineSegments' ) {\n\n\t\t\t\tfor ( let j = 1, k = j + 1, l = vertices.count; j < l; j += 2, k = j + 1 ) {\n\n\t\t\t\t\toutput += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update index\n\t\t\tindexVertex += nbVertex;\n\n\t\t}\n\n\t\tfunction parsePoints( points ) {\n\n\t\t\tlet nbVertex = 0;\n\n\t\t\tconst geometry = points.geometry;\n\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\tconst colors = geometry.getAttribute( 'color' );\n\n\t\t\toutput += 'o ' + points.name + '\\n';\n\n\t\t\tif ( vertices !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\t\t\t\t\tvertex.applyMatrix4( points.matrixWorld );\n\n\t\t\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z;\n\n\t\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\t\tcolor.fromBufferAttribute( colors, i ).convertLinearToSRGB();\n\n\t\t\t\t\t\toutput += ' ' + color.r + ' ' + color.g + ' ' + color.b;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutput += '\\n';\n\n\t\t\t\t}\n\n\t\t\t\toutput += 'p ';\n\n\t\t\t\tfor ( let j = 1, l = vertices.count; j <= l; j ++ ) {\n\n\t\t\t\t\toutput += ( indexVertex + j ) + ' ';\n\n\t\t\t\t}\n\n\t\t\t\toutput += '\\n';\n\n\t\t\t}\n\n\t\t\t// update index\n\t\t\tindexVertex += nbVertex;\n\n\t\t}\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isMesh === true ) {\n\n\t\t\t\tparseMesh( child );\n\n\t\t\t}\n\n\t\t\tif ( child.isLine === true ) {\n\n\t\t\t\tparseLine( child );\n\n\t\t\t}\n\n\t\t\tif ( child.isPoints === true ) {\n\n\t\t\t\tparsePoints( child );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn output;\n\n\t}\n\n}\n\nexport { OBJExporter };\n","/**\n * Exports the input as OBJ\n *\n * @remarks\n */\nimport {ExporterSopNode, BaseExporterSopParamsConfig} from './_BaseExporter';\nimport {OBJExporter} from 'three/examples/jsm/exporters/OBJExporter';\nimport {SopExporter} from '../../poly/registers/nodes/types/Sop';\n\nclass ExporterOBJSopParamsConfig extends BaseExporterSopParamsConfig {}\nconst ParamsConfig = new ExporterOBJSopParamsConfig();\n\nexport class ExporterOBJSopNode extends ExporterSopNode<ExporterOBJSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopExporter.EXPORTER_OBJ;\n\t}\n\n\tfileExtension() {\n\t\treturn 'obj';\n\t}\n\tcreateBlob(): Promise<Blob> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst sceneData = await this._prepareScene();\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst {scene, objects} = sceneData;\n\n\t\t\tconst exporter = new OBJExporter();\n\t\t\tconst result = exporter.parse(scene);\n\t\t\tthis._handleResult(result, objects, resolve);\n\t\t});\n\t}\n}\n","import {\n\tMatrix3,\n\tVector3,\n\tColor\n} from 'three';\n\n/**\n * https://github.com/gkjohnson/ply-exporter-js\n *\n * Usage:\n *  const exporter = new PLYExporter();\n *\n *  // second argument is a list of options\n *  exporter.parse(mesh, data => console.log(data), { binary: true, excludeAttributes: [ 'color' ], littleEndian: true });\n *\n * Format Definition:\n * http://paulbourke.net/dataformats/ply/\n */\n\nclass PLYExporter {\n\n\tparse( object, onDone, options = {} ) {\n\n\t\t// Iterate over the valid meshes in the object\n\t\tfunction traverseMeshes( cb ) {\n\n\t\t\tobject.traverse( function ( child ) {\n\n\t\t\t\tif ( child.isMesh === true || child.isPoints ) {\n\n\t\t\t\t\tconst mesh = child;\n\t\t\t\t\tconst geometry = mesh.geometry;\n\n\t\t\t\t\tif ( geometry.hasAttribute( 'position' ) === true ) {\n\n\t\t\t\t\t\tcb( mesh, geometry );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Default options\n\t\tconst defaultOptions = {\n\t\t\tbinary: false,\n\t\t\texcludeAttributes: [], // normal, uv, color, index\n\t\t\tlittleEndian: false\n\t\t};\n\n\t\toptions = Object.assign( defaultOptions, options );\n\n\t\tconst excludeAttributes = options.excludeAttributes;\n\t\tlet includeIndices = true;\n\t\tlet includeNormals = false;\n\t\tlet includeColors = false;\n\t\tlet includeUVs = false;\n\n\t\t// count the vertices, check which properties are used,\n\t\t// and cache the BufferGeometry\n\t\tlet vertexCount = 0;\n\t\tlet faceCount = 0;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isMesh === true ) {\n\n\t\t\t\tconst mesh = child;\n\t\t\t\tconst geometry = mesh.geometry;\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\t\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t\tif ( vertices === undefined ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvertexCount += vertices.count;\n\t\t\t\tfaceCount += indices ? indices.count / 3 : vertices.count / 3;\n\n\t\t\t\tif ( normals !== undefined ) includeNormals = true;\n\n\t\t\t\tif ( uvs !== undefined ) includeUVs = true;\n\n\t\t\t\tif ( colors !== undefined ) includeColors = true;\n\n\t\t\t} else if ( child.isPoints ) {\n\n\t\t\t\tconst mesh = child;\n\t\t\t\tconst geometry = mesh.geometry;\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\n\t\t\t\tvertexCount += vertices.count;\n\n\t\t\t\tif ( normals !== undefined ) includeNormals = true;\n\n\t\t\t\tif ( colors !== undefined ) includeColors = true;\n\n\t\t\t\tincludeIndices = false;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst tempColor = new Color();\n\t\tincludeIndices = includeIndices && excludeAttributes.indexOf( 'index' ) === - 1;\n\t\tincludeNormals = includeNormals && excludeAttributes.indexOf( 'normal' ) === - 1;\n\t\tincludeColors = includeColors && excludeAttributes.indexOf( 'color' ) === - 1;\n\t\tincludeUVs = includeUVs && excludeAttributes.indexOf( 'uv' ) === - 1;\n\n\n\t\tif ( includeIndices && faceCount !== Math.floor( faceCount ) ) {\n\n\t\t\t// point cloud meshes will not have an index array and may not have a\n\t\t\t// number of vertices that is divisble by 3 (and therefore representable\n\t\t\t// as triangles)\n\t\t\tconsole.error(\n\n\t\t\t\t'PLYExporter: Failed to generate a valid PLY file with triangle indices because the ' +\n\t\t\t\t'number of indices is not divisible by 3.'\n\n\t\t\t);\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst indexByteCount = 4;\n\n\t\tlet header =\n\t\t\t'ply\\n' +\n\t\t\t`format ${ options.binary ? ( options.littleEndian ? 'binary_little_endian' : 'binary_big_endian' ) : 'ascii' } 1.0\\n` +\n\t\t\t`element vertex ${vertexCount}\\n` +\n\n\t\t\t// position\n\t\t\t'property float x\\n' +\n\t\t\t'property float y\\n' +\n\t\t\t'property float z\\n';\n\n\t\tif ( includeNormals === true ) {\n\n\t\t\t// normal\n\t\t\theader +=\n\t\t\t\t'property float nx\\n' +\n\t\t\t\t'property float ny\\n' +\n\t\t\t\t'property float nz\\n';\n\n\t\t}\n\n\t\tif ( includeUVs === true ) {\n\n\t\t\t// uvs\n\t\t\theader +=\n\t\t\t\t'property float s\\n' +\n\t\t\t\t'property float t\\n';\n\n\t\t}\n\n\t\tif ( includeColors === true ) {\n\n\t\t\t// colors\n\t\t\theader +=\n\t\t\t\t'property uchar red\\n' +\n\t\t\t\t'property uchar green\\n' +\n\t\t\t\t'property uchar blue\\n';\n\n\t\t}\n\n\t\tif ( includeIndices === true ) {\n\n\t\t\t// faces\n\t\t\theader +=\n\t\t\t\t`element face ${faceCount}\\n` +\n\t\t\t\t'property list uchar int vertex_index\\n';\n\n\t\t}\n\n\t\theader += 'end_header\\n';\n\n\n\t\t// Generate attribute data\n\t\tconst vertex = new Vector3();\n\t\tconst normalMatrixWorld = new Matrix3();\n\t\tlet result = null;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// Binary File Generation\n\t\t\tconst headerBin = new TextEncoder().encode( header );\n\n\t\t\t// 3 position values at 4 bytes\n\t\t\t// 3 normal values at 4 bytes\n\t\t\t// 3 color channels with 1 byte\n\t\t\t// 2 uv values at 4 bytes\n\t\t\tconst vertexListLength = vertexCount * ( 4 * 3 + ( includeNormals ? 4 * 3 : 0 ) + ( includeColors ? 3 : 0 ) + ( includeUVs ? 4 * 2 : 0 ) );\n\n\t\t\t// 1 byte shape desciptor\n\t\t\t// 3 vertex indices at ${indexByteCount} bytes\n\t\t\tconst faceListLength = includeIndices ? faceCount * ( indexByteCount * 3 + 1 ) : 0;\n\t\t\tconst output = new DataView( new ArrayBuffer( headerBin.length + vertexListLength + faceListLength ) );\n\t\t\tnew Uint8Array( output.buffer ).set( headerBin, 0 );\n\n\n\t\t\tlet vOffset = headerBin.length;\n\t\t\tlet fOffset = headerBin.length + vertexListLength;\n\t\t\tlet writtenVertices = 0;\n\t\t\ttraverseMeshes( function ( mesh, geometry ) {\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\t\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( mesh.matrixWorld );\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\n\n\t\t\t\t\t// Position information\n\t\t\t\t\toutput.setFloat32( vOffset, vertex.x, options.littleEndian );\n\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\toutput.setFloat32( vOffset, vertex.y, options.littleEndian );\n\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\toutput.setFloat32( vOffset, vertex.z, options.littleEndian );\n\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t// Normal information\n\t\t\t\t\tif ( includeNormals === true ) {\n\n\t\t\t\t\t\tif ( normals != null ) {\n\n\t\t\t\t\t\t\tvertex.fromBufferAttribute( normals, i );\n\n\t\t\t\t\t\t\tvertex.applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, vertex.x, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, vertex.y, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, vertex.z, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// UV information\n\t\t\t\t\tif ( includeUVs === true ) {\n\n\t\t\t\t\t\tif ( uvs != null ) {\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, uvs.getX( i ), options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, uvs.getY( i ), options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color information\n\t\t\t\t\tif ( includeColors === true ) {\n\n\t\t\t\t\t\tif ( colors != null ) {\n\n\t\t\t\t\t\t\ttempColor\n\t\t\t\t\t\t\t\t.fromBufferAttribute( colors, i )\n\t\t\t\t\t\t\t\t.convertLinearToSRGB();\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, Math.floor( tempColor.r * 255 ) );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, Math.floor( tempColor.g * 255 ) );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, Math.floor( tempColor.b * 255 ) );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, 255 );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, 255 );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, 255 );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( includeIndices === true ) {\n\n\t\t\t\t\t// Create the face list\n\n\t\t\t\t\tif ( indices !== null ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = indices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\toutput.setUint8( fOffset, 3 );\n\t\t\t\t\t\t\tfOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, indices.getX( i + 0 ) + writtenVertices, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, indices.getX( i + 1 ) + writtenVertices, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, indices.getX( i + 2 ) + writtenVertices, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\toutput.setUint8( fOffset, 3 );\n\t\t\t\t\t\t\tfOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, writtenVertices + i, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, writtenVertices + i + 1, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, writtenVertices + i + 2, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// Save the amount of verts we've already written so we can offset\n\t\t\t\t// the face index on the next mesh\n\t\t\t\twrittenVertices += vertices.count;\n\n\t\t\t} );\n\n\t\t\tresult = output.buffer;\n\n\t\t} else {\n\n\t\t\t// Ascii File Generation\n\t\t\t// count the number of vertices\n\t\t\tlet writtenVertices = 0;\n\t\t\tlet vertexList = '';\n\t\t\tlet faceList = '';\n\n\t\t\ttraverseMeshes( function ( mesh, geometry ) {\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\t\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( mesh.matrixWorld );\n\n\t\t\t\t// form each line\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\n\n\t\t\t\t\t// Position information\n\t\t\t\t\tlet line =\n\t\t\t\t\t\tvertex.x + ' ' +\n\t\t\t\t\t\tvertex.y + ' ' +\n\t\t\t\t\t\tvertex.z;\n\n\t\t\t\t\t// Normal information\n\t\t\t\t\tif ( includeNormals === true ) {\n\n\t\t\t\t\t\tif ( normals != null ) {\n\n\t\t\t\t\t\t\tvertex.fromBufferAttribute( normals, i );\n\n\t\t\t\t\t\t\tvertex.applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t\t\tline += ' ' +\n\t\t\t\t\t\t\t\tvertex.x + ' ' +\n\t\t\t\t\t\t\t\tvertex.y + ' ' +\n\t\t\t\t\t\t\t\tvertex.z;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tline += ' 0 0 0';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// UV information\n\t\t\t\t\tif ( includeUVs === true ) {\n\n\t\t\t\t\t\tif ( uvs != null ) {\n\n\t\t\t\t\t\t\tline += ' ' +\n\t\t\t\t\t\t\t\tuvs.getX( i ) + ' ' +\n\t\t\t\t\t\t\t\tuvs.getY( i );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tline += ' 0 0';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color information\n\t\t\t\t\tif ( includeColors === true ) {\n\n\t\t\t\t\t\tif ( colors != null ) {\n\n\t\t\t\t\t\t\ttempColor\n\t\t\t\t\t\t\t\t.fromBufferAttribute( colors, i )\n\t\t\t\t\t\t\t\t.convertLinearToSRGB();\n\n\t\t\t\t\t\t\tline += ' ' +\n\t\t\t\t\t\t\t\tMath.floor( tempColor.r * 255 ) + ' ' +\n\t\t\t\t\t\t\t\tMath.floor( tempColor.g * 255 ) + ' ' +\n\t\t\t\t\t\t\t\tMath.floor( tempColor.b * 255 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tline += ' 255 255 255';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvertexList += line + '\\n';\n\n\t\t\t\t}\n\n\t\t\t\t// Create the face list\n\t\t\t\tif ( includeIndices === true ) {\n\n\t\t\t\t\tif ( indices !== null ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = indices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\tfaceList += `3 ${ indices.getX( i + 0 ) + writtenVertices }`;\n\t\t\t\t\t\t\tfaceList += ` ${ indices.getX( i + 1 ) + writtenVertices }`;\n\t\t\t\t\t\t\tfaceList += ` ${ indices.getX( i + 2 ) + writtenVertices }\\n`;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\tfaceList += `3 ${ writtenVertices + i } ${ writtenVertices + i + 1 } ${ writtenVertices + i + 2 }\\n`;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCount += indices ? indices.count / 3 : vertices.count / 3;\n\n\t\t\t\t}\n\n\t\t\t\twrittenVertices += vertices.count;\n\n\t\t\t} );\n\n\t\t\tresult = `${ header }${vertexList}${ includeIndices ? `${faceList}\\n` : '\\n' }`;\n\n\t\t}\n\n\t\tif ( typeof onDone === 'function' ) requestAnimationFrame( () => onDone( result ) );\n\n\t\treturn result;\n\n\t}\n\n}\n\nexport { PLYExporter };\n","/**\n * Exports the input as PLY\n *\n * @remarks\n */\nimport {ExporterSopNode, BaseExporterSopParamsConfig} from './_BaseExporter';\nimport {PLYExporter, PLYExporterOptions} from 'three/examples/jsm/exporters/PLYExporter';\nimport {SopExporter} from '../../poly/registers/nodes/types/Sop';\n\nclass ExporterPLYSopParamsConfig extends BaseExporterSopParamsConfig {}\nconst ParamsConfig = new ExporterPLYSopParamsConfig();\n\nexport class ExporterPLYSopNode extends ExporterSopNode<ExporterPLYSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopExporter.EXPORTER_PLY;\n\t}\n\n\tfileExtension() {\n\t\treturn 'ply';\n\t}\n\tcreateBlob(): Promise<Blob> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst sceneData = await this._prepareScene();\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst {scene, objects} = sceneData;\n\t\t\tconst options: PLYExporterOptions = {\n\t\t\t\tbinary: true,\n\t\t\t\t// excludeAttributes?: string[];\n\t\t\t\t// littleEndian: boolean;\n\t\t\t};\n\t\t\tconst exporter = new PLYExporter();\n\t\t\texporter.parse(\n\t\t\t\tscene,\n\t\t\t\t(result) => {\n\t\t\t\t\tthis._handleResult(result, objects, resolve);\n\t\t\t\t},\n\t\t\t\toptions\n\t\t\t);\n\t\t});\n\t}\n}\n","import { Vector3 } from 'three';\n\n/**\n * Usage:\n *  const exporter = new STLExporter();\n *\n *  // second argument is a list of options\n *  const data = exporter.parse( mesh, { binary: true } );\n *\n */\n\nclass STLExporter {\n\n\tparse( scene, options = {} ) {\n\n\t\toptions = Object.assign( {\n\t\t\tbinary: false\n\t\t}, options );\n\n\t\tconst binary = options.binary;\n\n\t\t//\n\n\t\tconst objects = [];\n\t\tlet triangles = 0;\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tconst geometry = object.geometry;\n\n\t\t\t\tconst index = geometry.index;\n\t\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t\ttriangles += ( index !== null ) ? ( index.count / 3 ) : ( positionAttribute.count / 3 );\n\n\t\t\t\tobjects.push( {\n\t\t\t\t\tobject3d: object,\n\t\t\t\t\tgeometry: geometry\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tlet output;\n\t\tlet offset = 80; // skip header\n\n\t\tif ( binary === true ) {\n\n\t\t\tconst bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;\n\t\t\tconst arrayBuffer = new ArrayBuffer( bufferLength );\n\t\t\toutput = new DataView( arrayBuffer );\n\t\t\toutput.setUint32( offset, triangles, true ); offset += 4;\n\n\t\t} else {\n\n\t\t\toutput = '';\n\t\t\toutput += 'solid exported\\n';\n\n\t\t}\n\n\t\tconst vA = new Vector3();\n\t\tconst vB = new Vector3();\n\t\tconst vC = new Vector3();\n\t\tconst cb = new Vector3();\n\t\tconst ab = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\tconst object = objects[ i ].object3d;\n\t\t\tconst geometry = objects[ i ].geometry;\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed geometry\n\n\t\t\t\tfor ( let j = 0; j < index.count; j += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( j + 0 );\n\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\twriteFace( a, b, c, positionAttribute, object );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed geometry\n\n\t\t\t\tfor ( let j = 0; j < positionAttribute.count; j += 3 ) {\n\n\t\t\t\t\tconst a = j + 0;\n\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\twriteFace( a, b, c, positionAttribute, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( binary === false ) {\n\n\t\t\toutput += 'endsolid exported\\n';\n\n\t\t}\n\n\t\treturn output;\n\n\t\tfunction writeFace( a, b, c, positionAttribute, object ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tif ( object.isSkinnedMesh === true ) {\n\n\t\t\t\tobject.applyBoneTransform( a, vA );\n\t\t\t\tobject.applyBoneTransform( b, vB );\n\t\t\t\tobject.applyBoneTransform( c, vC );\n\n\t\t\t}\n\n\t\t\tvA.applyMatrix4( object.matrixWorld );\n\t\t\tvB.applyMatrix4( object.matrixWorld );\n\t\t\tvC.applyMatrix4( object.matrixWorld );\n\n\t\t\twriteNormal( vA, vB, vC );\n\n\t\t\twriteVertex( vA );\n\t\t\twriteVertex( vB );\n\t\t\twriteVertex( vC );\n\n\t\t\tif ( binary === true ) {\n\n\t\t\t\toutput.setUint16( offset, 0, true ); offset += 2;\n\n\t\t\t} else {\n\n\t\t\t\toutput += '\\t\\tendloop\\n';\n\t\t\t\toutput += '\\tendfacet\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction writeNormal( vA, vB, vC ) {\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab ).normalize();\n\n\t\t\tnormal.copy( cb ).normalize();\n\n\t\t\tif ( binary === true ) {\n\n\t\t\t\toutput.setFloat32( offset, normal.x, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, normal.y, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, normal.z, true ); offset += 4;\n\n\t\t\t} else {\n\n\t\t\t\toutput += '\\tfacet normal ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\\n';\n\t\t\t\toutput += '\\t\\touter loop\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction writeVertex( vertex ) {\n\n\t\t\tif ( binary === true ) {\n\n\t\t\t\toutput.setFloat32( offset, vertex.x, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, vertex.y, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, vertex.z, true ); offset += 4;\n\n\t\t\t} else {\n\n\t\t\t\toutput += '\\t\\t\\tvertex ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { STLExporter };\n","/**\n * Exports the input as STL\n *\n * @remarks\n */\n\nimport {ExporterSopNode, BaseExporterSopParamsConfig} from './_BaseExporter';\nimport {STLExporter, STLExporterOptions} from 'three/examples/jsm/exporters/STLExporter';\nimport {SopExporter} from '../../poly/registers/nodes/types/Sop';\n\nclass ExporterSTLSopParamsConfig extends BaseExporterSopParamsConfig {}\nconst ParamsConfig = new ExporterSTLSopParamsConfig();\n\nexport class ExporterSTLSopNode extends ExporterSopNode<ExporterSTLSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopExporter.EXPORTER_STL;\n\t}\n\n\tfileExtension() {\n\t\treturn 'stl';\n\t}\n\tcreateBlob(): Promise<Blob> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst sceneData = await this._prepareScene();\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst {scene, objects} = sceneData;\n\t\t\tconst options: STLExporterOptions = {\n\t\t\t\tbinary: true,\n\t\t\t};\n\t\t\tconst exporter = new STLExporter();\n\t\t\tconst result = exporter.parse(scene, options) as any as DataView;\n\t\t\tthis._handleResult(result.buffer, objects, resolve);\n\t\t});\n\t}\n}\n","/**\n * Loads a DRC file from a url.\n *\n *\n */\nimport {FileDRCSopOperation} from '../../operations/sop/FileDRC';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FileDRCSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_DRC,\n\toperation: FileDRCSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_DRC],\n}) {}\n","/**\n * Loads a FBX from a url.\n *\n *\n */\nimport {FileFBXSopOperation} from '../../operations/sop/FileFBX';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport class FileFBXSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_FBX,\n\toperation: FileFBXSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_FBX],\n}) {}\n","/**\n * Loads a Geojson file from a url.\n *\n *\n */\nimport {FileGEOJSONSopOperation} from '../../operations/sop/FileGEOJSON';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FileGEOJSONSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_GEOJSON,\n\toperation: FileGEOJSONSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_GEOJSON],\n}) {}\n","/**\n * Loads a GLTF from a url.\n *\n *\n */\nimport {ParamEvent} from './../../poly/ParamEvent';\nimport {TypedSopNode} from './_Base';\nimport {BaseNodeType} from '../_Base';\nimport {FileGLTFSopOperation} from '../../operations/sop/FileGLTF';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Poly} from '../../Poly';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nconst DEFAULT = FileGLTFSopOperation.DEFAULT_PARAMS;\nclass FileGLTFParamsConfig extends NodeParamsConfig {\n\t/** @param url to load the geometry from */\n\turl = ParamConfig.STRING(DEFAULT.url, {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_GLTF]},\n\t});\n\t/** @param uses draco compression */\n\tdraco = ParamConfig.BOOLEAN(DEFAULT.draco);\n\t/** @param uses ktx2 compression */\n\tktx2 = ParamConfig.BOOLEAN(DEFAULT.ktx2);\n\t/** @param sets the matrixAutoUpdate attribute for the objects loaded */\n\tmatrixAutoUpdate = ParamConfig.BOOLEAN(0);\n\t/** @param reload the geometry */\n\treload = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tFileGLTFSopNode.PARAM_CALLBACK_reload(node as FileGLTFSopNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new FileGLTFParamsConfig();\n\nexport class FileGLTFSopNode extends TypedSopNode<FileGLTFParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopTypeFile.FILE_GLTF;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\n\tprivate _operation: FileGLTFSopOperation | undefined;\n\tprivate operation() {\n\t\treturn (this._operation = this._operation || new FileGLTFSopOperation(this.scene(), this.states, this));\n\t}\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = await this.operation().cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tstatic PARAM_CALLBACK_reload(node: FileGLTFSopNode) {\n\t\tnode._paramCallbackReload();\n\t}\n\tprivate _paramCallbackReload() {\n\t\t// this.operation().clearLoadedBlob(this.pv);\n\t\t// set the param dirty is preferable to just the successors, in case the expression result needs to be updated\n\t\tthis.p.url.setDirty();\n\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t\t// this.setDirty()\n\t}\n}\n","/**\n * Loads a JSON file from a url.\n *\n *\n */\nimport {FileJSONSopOperation} from '../../operations/sop/FileJSON';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FileJSONSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_JSON,\n\toperation: FileJSONSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_JSON],\n}) {}\n","/**\n * Loads a MPD from a url.\n *\n *\n */\nimport {FileMPDSopOperation} from '../../operations/sop/FileMPD';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FileMPDSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_MPD,\n\toperation: FileMPDSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_MPD],\n}) {}\n","/**\n * Loads an OBJ file from a url.\n *\n *\n */\nimport {FileOBJSopOperation} from '../../operations/sop/FileOBJ';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FileOBJSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_OBJ,\n\toperation: FileOBJSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_OBJ],\n}) {}\n","/**\n * Loads a PDB from a url.\n *\n *\n */\nimport {FilePDBSopOperation} from '../../operations/sop/FilePDB';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport class FilePDBSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_PDB,\n\toperation: FilePDBSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_PDB],\n}) {}\n","/**\n * Loads a PLY file from a url.\n *\n *\n */\nimport {FilePLYSopOperation} from '../../operations/sop/FilePLY';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FilePLYSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_PLY,\n\toperation: FilePLYSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_PLY],\n}) {}\n","/**\n * Loads a STL file from a url.\n *\n *\n */\nimport {FileSTLSopOperation} from '../../operations/sop/FileSTL';\nimport {fileSopNodeFactory} from './utils/file/_BaseSopFile';\nimport {BaseFileSopOperation} from '../../operations/sop/utils/File/_BaseFileOperation';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nexport class FileSTLSopNode extends fileSopNodeFactory({\n\ttype: SopTypeFile.FILE_STL,\n\toperation: FileSTLSopOperation as typeof BaseFileSopOperation,\n\textensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_STL],\n}) {}\n","/**\n * Loads an svg file from a url.\n *\n *\n */\nimport {ParamEvent} from './../../poly/ParamEvent';\nimport {TypedSopNode} from './_Base';\nimport {BaseParamType} from '../../params/_Base';\nimport {BaseNodeType} from '../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {FileSVGSopOperation} from '../../operations/sop/FileSVG';\nimport {Poly} from '../../Poly';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\nconst DEFAULT = FileSVGSopOperation.DEFAULT_PARAMS;\n\nclass FileSVGSopParamsConfig extends NodeParamsConfig {\n\t/** @param url to load the geometry from */\n\turl = ParamConfig.STRING(DEFAULT.url, {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopTypeFile.FILE_SVG]},\n\t});\n\t/** @param reload the geometry */\n\treload = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t\t\tFileSVGSopNode.PARAM_CALLBACK_reload(node as FileSVGSopNode);\n\t\t},\n\t});\n\t/** @param toggle on to draw the fillShapes */\n\tdrawFillShapes = ParamConfig.BOOLEAN(DEFAULT.drawFillShapes);\n\t/** @param toggle on to draw the fillShapes as wireframe */\n\tfillShapesWireframe = ParamConfig.BOOLEAN(DEFAULT.fillShapesWireframe);\n\t/** @param toggle on to draw the strokes */\n\tdrawStrokes = ParamConfig.BOOLEAN(DEFAULT.drawStrokes);\n\t/** @param toggle on to draw the strokes as wireframe */\n\tstrokesWireframe = ParamConfig.BOOLEAN(DEFAULT.strokesWireframe);\n\t/** @param style override */\n\ttStyleOverride = ParamConfig.BOOLEAN(DEFAULT.tStyleOverride, {\n\t\tseparatorBefore: true,\n\t});\n\t/** @param stroke width */\n\tstrokeWidth = ParamConfig.FLOAT(DEFAULT.strokeWidth, {\n\t\tvisibleIf: {\n\t\t\ttStyleOverride: true,\n\t\t},\n\t});\n\t/** @param advanced */\n\ttadvanced = ParamConfig.BOOLEAN(DEFAULT.tadvanced, {\n\t\tseparatorBefore: true,\n\t});\n\t/** @param is counter clock wise: defines the vertex order when parsing the font */\n\tisCCW = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {tadvanced: true},\n\t});\n\t/** @param defines if holes should be found when parsing the font */\n\t// noHoles = ParamConfig.BOOLEAN(0, {\n\t// \tvisibleIf: {tadvanced: true},\n\t// });\n}\nconst ParamsConfig = new FileSVGSopParamsConfig();\n\nexport class FileSVGSopNode extends TypedSopNode<FileSVGSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopTypeFile.FILE_SVG;\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\t// TODO: no error when trying to load a non existing zip file??\n\tprivate _operation: FileSVGSopOperation | undefined;\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new FileSVGSopOperation(this.scene(), this.states, this);\n\t\tconst coreGroup = await this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tstatic PARAM_CALLBACK_reload(node: FileSVGSopNode) {\n\t\tnode.param_callback_reload();\n\t}\n\tprivate param_callback_reload() {\n\t\t// set the param dirty is preferable to just the successors, in case the expression result needs to be updated\n\t\tthis.p.url.setDirty();\n\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t}\n}\n","/**\n * Creates a mapbox camera.\n *\n * @remarks\n *\n * In order to use Mapbox inside Polygons, you need to add your Mapbox token.\n *\n * This is done by adding the following line inside your `PolyConfig.ts` file:\n *\n * ``` ts\n * Poly.thirdParty.mapbox().setToken('<your token>');\n * ```\n *\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {MapboxCameraSopOperation} from '../../operations/sop/MapboxCamera';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CameraNodeType} from '../../poly/NodeContext';\nimport {registerMapboxCamera} from '../../../core/thirdParty/Mapbox/registerMapboxCamera';\nimport {MapboxMapsController} from '../../../core/thirdParty/Mapbox/MapboxMapsController';\nimport {BaseNodeType} from '../_Base';\nimport {OnNodeRegisterCallback} from '../../poly/registers/nodes/NodesRegister';\nconst DEFAULT = MapboxCameraSopOperation.DEFAULT_PARAMS;\nclass MapboxCameraSopParamsConfig extends NodeParamsConfig {\n\tstyle = ParamConfig.STRING(DEFAULT.style);\n\t/** @param longitude */\n\tlongitude = ParamConfig.FLOAT(-0.07956, {\n\t\trange: [-360, 360],\n\t});\n\t/** @param latitude */\n\tlatitude = ParamConfig.FLOAT(51.5146, {\n\t\trange: [-90, 90],\n\t});\n\n\tpitch = ParamConfig.FLOAT(DEFAULT.pitch, {\n\t\trange: [0, 85],\n\t\trangeLocked: [true, true],\n\t});\n\tbearing = ParamConfig.FLOAT(DEFAULT.bearing, {\n\t\trange: [0, 360],\n\t});\n\tzoom = ParamConfig.FLOAT(DEFAULT.zoom, {\n\t\trange: [0, 24],\n\t\trangeLocked: [true, true],\n\t});\n\tminZoom = ParamConfig.FLOAT(DEFAULT.minZoom, {\n\t\trange: [0, 24],\n\t\trangeLocked: [true, true],\n\t});\n\tmaxZoom = ParamConfig.FLOAT(DEFAULT.maxZoom, {\n\t\trange: [0, 24],\n\t\trangeLocked: [true, true],\n\t});\n\t// updateParamsFromMap = ParamConfig.BUTTON(null, {\n\t// \tlabel: 'Set Navigation Params as Default',\n\t// \tcallback: (node: BaseNodeType, param: BaseParamType) => {\n\t// \t\tMapboxCameraSopNode.PARAM_CALLBACK_update_params_from_map(node as MapboxCameraObjNode);\n\t// \t},\n\t// });\n\tallowDragRotate = ParamConfig.BOOLEAN(DEFAULT.allowDragRotate);\n\taddZoomControl = ParamConfig.BOOLEAN(DEFAULT.addZoomControl);\n\ttlayerBuildings = ParamConfig.BOOLEAN(DEFAULT.tlayerBuildings);\n\ttlayer3D = ParamConfig.BOOLEAN(DEFAULT.tlayer3D);\n\ttlayerSky = ParamConfig.BOOLEAN(DEFAULT.tlayerSky);\n\t/** @param camera name */\n\tname = ParamConfig.STRING('`$OS`');\n\tupdateFromMap = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tMapboxCameraSopNode.PARAM_CALLBACK_updateFromMap(node as MapboxCameraSopNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new MapboxCameraSopParamsConfig();\n\nexport class MapboxCameraSopNode extends TypedSopNode<MapboxCameraSopParamsConfig> {\n\toverride readonly paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn CameraNodeType.MAPBOX;\n\t}\n\tstatic override onRegister: OnNodeRegisterCallback = registerMapboxCamera;\n\n\tprotected override initializeNode() {\n\t\tthis.io.inputs.setCount(0);\n\t}\n\n\tprivate _operation: MapboxCameraSopOperation | undefined;\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new MapboxCameraSopOperation(this._scene, this.states, this);\n\t\tconst coreGroup = await this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tstatic PARAM_CALLBACK_updateFromMap(node: MapboxCameraSopNode) {\n\t\tnode._paramCallbackUpdateFromMap();\n\t}\n\tprivate async _paramCallbackUpdateFromMap() {\n\t\tconst map = await MapboxMapsController.waitForMap();\n\t\tconst lngLat = map.getCenter();\n\t\tconst pitch = map.getPitch();\n\t\tconst bearing = map.getBearing();\n\t\tconst zoom = map.getZoom();\n\t\tthis.scene().batchUpdates(() => {\n\t\t\tthis.p.longitude.set(lngLat.lng);\n\t\t\tthis.p.latitude.set(lngLat.lat);\n\t\t\tthis.p.pitch.set(pitch);\n\t\t\tthis.p.bearing.set(bearing);\n\t\t\tthis.p.zoom.set(zoom);\n\t\t});\n\t}\n}\n","import type {Vector2} from 'three';\nimport {arrayMin} from '../../ArrayUtils';\n\nexport class CoordinatesCollection {\n\tconstructor(public coordinates: Vector2[]) {}\n\tfirst() {\n\t\treturn this.coordinates[0];\n\t}\n\tlast() {\n\t\treturn this.coordinates[this.coordinates.length - 1];\n\t}\n\tprivate distanceTo(features_coordinates: CoordinatesCollection): number {\n\t\tconst d00 = this.first().distanceTo(features_coordinates.first());\n\t\tconst d01 = this.first().distanceTo(features_coordinates.last());\n\t\tconst d10 = this.last().distanceTo(features_coordinates.first());\n\t\tconst d11 = this.last().distanceTo(features_coordinates.last());\n\t\treturn arrayMin([d00, d01, d10, d11]) as number;\n\t}\n\t// previous_id(features_coordinates_array: CoordinatesCollection[]): number{\n\t// }\n\tnext_id(features_coordinates_array: CoordinatesCollection[]): number {\n\t\tlet nearest_id = -1;\n\t\tlet dist = -1;\n\t\tlet i = 0;\n\t\tfor (const features_coordinates of features_coordinates_array) {\n\t\t\tconst current_dist = this.distanceTo(features_coordinates);\n\t\t\tif (dist == -1 || current_dist < dist) {\n\t\t\t\tdist = current_dist;\n\t\t\t\tnearest_id = i;\n\t\t\t}\n\t\t\ti += 1;\n\t\t}\n\t\treturn nearest_id;\n\t}\n\tperimeter(): number {\n\t\tlet perimeter = 0;\n\t\tlet prev_coordinate = this.coordinates[0];\n\t\tfor (const coordinate of this.coordinates) {\n\t\t\tperimeter += coordinate.distanceTo(prev_coordinate);\n\t\t\tprev_coordinate = coordinate;\n\t\t}\n\n\t\treturn perimeter;\n\t}\n\n\tstatic sort(features_coordinates_array: CoordinatesCollection[]): CoordinatesCollection[] {\n\t\tlet current_feature = features_coordinates_array.shift() as CoordinatesCollection;\n\t\tconst remaining_features = features_coordinates_array;\n\t\tconst sorted_features = [current_feature];\n\n\t\twhile (remaining_features.length > 0) {\n\t\t\tconst next_id = current_feature.next_id(remaining_features);\n\t\t\tcurrent_feature = remaining_features.splice(next_id, 1)[0];\n\t\t\tsorted_features.push(current_feature);\n\t\t}\n\t\treturn sorted_features;\n\t}\n}\n","export class CoreMapboxString {\n\tstatic toId(val: string): number {\n\t\tif (val == null) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst elements = val.split('').reverse();\n\t\tlet id = 0;\n\t\tlet exp = 0;\n\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\tlet index = elements[i].charCodeAt(0);\n\n\t\t\tif (index >= 0) {\n\t\t\t\texp = i % 10;\n\t\t\t\tid += index * 10 ** exp;\n\t\t\t\tid = id % Number.MAX_SAFE_INTEGER;\n\t\t\t}\n\t\t}\n\t\treturn id;\n\t}\n}\n","import {BufferGeometry, Float32BufferAttribute, LineSegments, Mesh, Object3D, Vector2} from 'three';\nimport {ObjectType} from '../../geometry/Constant';\nimport {BaseSopNodeType} from '../../../engine/nodes/sop/_Base';\nimport {CoordinatesCollection} from './CoordinatesCollection';\nimport {arraySum} from '../../ArrayUtils';\nimport {CoreGeometryBuilderMerge} from '../../geometry/modules/three/builders/Merge';\nimport {CoreMapboxString} from './String';\nimport {corePointClassFactory} from '../../geometry/CoreObjectFactory';\nimport {ThreejsPoint} from '../../geometry/modules/three/ThreejsPoint';\nimport {pointsFromObject} from '../../geometry/entities/point/CorePointUtils';\nimport {CorePoint} from '../../geometry/entities/point/CorePoint';\nimport {CoreObjectType} from '../../geometry/ObjectContent';\n\nconst MULTILINESTRING = 'MultiLineString';\nconst LINESTRING = 'LineString';\nconst dummyMesh = new Mesh();\nconst _points: CorePoint<CoreObjectType>[] = [];\nexport class FeatureConverter {\n\tid: number | undefined;\n\tconstructor(private node: BaseSopNodeType, private name: string, private features: any[]) {}\n\n\tcreateObject(): Object3D | undefined {\n\t\tconst coordinatesCollections = this._createAllCoordinatesCollections();\n\t\tconst perimeter: number = arraySum(coordinatesCollections.map((f) => f.perimeter()));\n\t\tconst sortedFeatures = CoordinatesCollection.sort(coordinatesCollections);\n\n\t\tconst lines = sortedFeatures.map((feature) => {\n\t\t\treturn this._createLine(feature);\n\t\t});\n\t\tlines.forEach((line) => {\n\t\t\tconst corePointClass = corePointClassFactory(line);\n\t\t\tcorePointClass.addNumericAttribute(line, 'perimeter', 1, perimeter);\n\t\t});\n\n\t\tconst geometries = lines.map((l) => l.geometry) as BufferGeometry[];\n\t\tconst mergedGeometry = CoreGeometryBuilderMerge.merge(geometries);\n\t\tif (!mergedGeometry) {\n\t\t\treturn;\n\t\t}\n\n\t\t// pti\n\t\tdummyMesh.geometry = mergedGeometry;\n\t\tpointsFromObject(dummyMesh, _points);\n\t\tconst pointsCount = _points.length;\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\tconst point = _points[i];\n\t\t\tconst pti = i / (pointsCount - 1);\n\t\t\tpoint.setAttribValue('pti', pti);\n\t\t}\n\n\t\tconst mergedObject = this.node.createObject(mergedGeometry, ObjectType.LINE_SEGMENTS);\n\t\treturn mergedObject;\n\t}\n\n\t_createLine(coordinatesCollection: CoordinatesCollection): LineSegments {\n\t\tconst pointsCount = coordinatesCollection.coordinates.length;\n\n\t\tconst positions: number[] = [];\n\t\tconst indices: number[] = [];\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\tconst coordinates = coordinatesCollection.coordinates[i];\n\n\t\t\tpositions.push(coordinates.x);\n\t\t\tpositions.push(0);\n\t\t\tpositions.push(coordinates.y);\n\n\t\t\tif (i > 0) {\n\t\t\t\tindices.push(i - 1);\n\t\t\t\tindices.push(i);\n\t\t\t}\n\t\t}\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\t\tgeometry.setIndex(indices);\n\t\tconst object = this.node.createObject(geometry, ObjectType.LINE_SEGMENTS);\n\n\t\tdummyMesh.geometry = geometry;\n\t\tconst id_from_name = CoreMapboxString.toId(this.name) % 10000000;\n\t\t// console.log(this.name, id_from_name)\n\t\tThreejsPoint.addNumericAttribute(dummyMesh, 'id', 1, this.id);\n\t\tThreejsPoint.addNumericAttribute(dummyMesh, 'name_id', 1, id_from_name);\n\n\t\treturn object;\n\t}\n\n\tprivate _createAllCoordinatesCollections(): CoordinatesCollection[] {\n\t\tconst coordinates_collections: CoordinatesCollection[] = [];\n\t\tthis.features.forEach((feature) => {\n\t\t\tthis.id = this.id || feature['id'];\n\n\t\t\tconst feature_geometry = feature.geometry;\n\t\t\tif (feature_geometry) {\n\t\t\t\tconst type = feature_geometry['type'];\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase MULTILINESTRING:\n\t\t\t\t\t\tconst multi_coordinates = feature_geometry['coordinates'];\n\t\t\t\t\t\tif (multi_coordinates) {\n\t\t\t\t\t\t\tfor (let i = 0; i < multi_coordinates.length; i++) {\n\t\t\t\t\t\t\t\tconst coordinates = multi_coordinates[i];\n\t\t\t\t\t\t\t\tcoordinates_collections.push(this._create_coordinates(coordinates));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase LINESTRING:\n\t\t\t\t\t\tcoordinates_collections.push(this._create_coordinates(feature_geometry['coordinates']));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn(`type ${type} not taken into account`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn coordinates_collections;\n\t}\n\tprivate _create_coordinates(raw_coordinates: [number, number][]): CoordinatesCollection {\n\t\tconst vectors = raw_coordinates.map((raw_coordinate) => {\n\t\t\treturn new Vector2(raw_coordinate[0], raw_coordinate[1]);\n\t\t});\n\t\treturn new CoordinatesCollection(vectors);\n\t}\n}\n","/**\n * Creates Mapbox layers.\n *\n * @remarks\n *\n * This is best used with the Mapbox camera.\n *\n * See [sop/mapboxCamera](/docs/nodes/sop/mapboxCamera) for info on how to setup mapbox to use with Polygonjs\n *\n */\nimport {Object3D} from 'three';\nimport {isBoolean} from '../../../core/Type';\nimport {FeatureConverter} from '../../../core/thirdParty/Mapbox/FeatureConverter';\nimport {NodeParamsConfig, ParamConfig} from '../../nodes/utils/params/ParamsConfig';\n// import {MapboxListenerParamConfig, MapboxListenerSopNode} from './utils/MapboxListener';\nimport {pushOnArrayAtEntry} from '../../../core/MapUtils';\nimport {arrayChunk} from '../../../core/ArrayUtils';\nimport {TypedSopNode} from './_Base';\nimport {BaseNodeType} from '../_Base';\nimport {MapboxMapsController} from '../../../core/thirdParty/Mapbox/MapboxMapsController';\nimport {ParamType} from '../../poly/ParamType';\n// const MULTILINESTRING = 'MultiLineString'\n// const LINESTRING = 'LineString'\n\n// const DEFAULT_LIST: Readonly<string> = [\n// \t// 'road-motorway-trunk', // not found in prod, need to investigate\n// \t'road-primary',\n// \t'road-secondary-tertiary',\n// \t'road-street',\n// ].join(' ');\n\n// use_bounds: false,\n// update_always_allowed: false\nclass MapboxLayerSopParamsConfig extends NodeParamsConfig {\n\t/** @param names of layers to create */\n\t// layers = ParamConfig.STRING(DEFAULT_LIST);\n\tupdateLayers = ParamConfig.BUTTON(null, {\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tMapboxLayerSopNode.PARAM_CALLBACK_reload(node as MapboxLayerSopNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new MapboxLayerSopParamsConfig();\n\nexport class MapboxLayerSopNode extends TypedSopNode<MapboxLayerSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'mapboxLayer';\n\t}\n\n\toverride async cook() {\n\t\tconst map = await MapboxMapsController.waitForMap();\n\t\tif (!map) {\n\t\t\tthis.states.error.set('map not initialized yet');\n\t\t\treturn;\n\t\t}\n\t\tconst layerNames = this.params.spare.filter((param) => param.value == true).map((param) => param.name());\n\t\t// const layerNames = CoreString.attribNames(this.pv.layers);\n\t\tconst existingLayerNames: string[] = [];\n\n\t\tfor (const layerName of layerNames) {\n\t\t\tif (map.getLayer(layerName)) {\n\t\t\t\texistingLayerNames.push(layerName);\n\t\t\t} else {\n\t\t\t\t// const layers = first_map.getStyle().layers;\n\t\t\t\tthis.states.error.set(`layer ${layerName} does not exist`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst features = map.queryRenderedFeatures(undefined, {\n\t\t\tlayers: existingLayerNames,\n\t\t});\n\n\t\tconst objects: Object3D[] = [];\n\t\tif (features) {\n\t\t\tconst featuresByName = this._groupFeaturesByName(features);\n\n\t\t\tfeaturesByName.forEach((featuresForName, featureName) => {\n\t\t\t\tconst converter = new FeatureConverter(this, featureName, featuresForName);\n\t\t\t\tconst new_object = converter.createObject();\n\t\t\t\tif (new_object) {\n\t\t\t\t\tobjects.push(new_object);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tthis.setObjects(objects);\n\t}\n\n\tprivate _featuresByName: Map<string, mapboxgl.MapboxGeoJSONFeature[]> = new Map();\n\tprivate _groupFeaturesByName(\n\t\tfeatures: mapboxgl.MapboxGeoJSONFeature[]\n\t): Map<string, mapboxgl.MapboxGeoJSONFeature[]> {\n\t\tthis._featuresByName.clear();\n\t\tfor (const feature of features) {\n\t\t\tconst name = this._feature_name(feature);\n\t\t\tif (name) {\n\t\t\tpushOnArrayAtEntry(this._featuresByName, name, feature);\n\t\t\t}\n\t\t}\n\t\treturn this._featuresByName;\n\t}\n\n\tprivate _feature_name(feature: mapboxgl.MapboxGeoJSONFeature): string | undefined {\n\t\tconst properties = feature['properties'];\n\t\tlet name: string | undefined;\n\t\tif (properties) {\n\t\t\tname = properties['name'] || properties['name_en']; //|| Math.floor(Math.random()*100000000)\n\t\t\tif (name == null) {\n\t\t\t\tname = this._id_from_feature(feature);\n\t\t\t}\n\t\t}\n\t\treturn name;\n\t}\n\tprivate _id_from_feature(feature: mapboxgl.MapboxGeoJSONFeature): string {\n\t\tconst json_str = JSON.stringify(feature.geometry).replace(/{|}|\"|:|\\[|\\]|,|\\./g, '');\n\t\tconst json_str_elements = json_str.split('');\n\t\tconst letters_count = 30;\n\t\tconst chunks = arrayChunk(json_str_elements, json_str_elements.length / letters_count);\n\t\tconst first_elements = chunks.map((c) => c[0]);\n\n\t\treturn first_elements.join('');\n\t}\n\n\tstatic PARAM_CALLBACK_reload(node: MapboxLayerSopNode) {\n\t\tnode._paramCallbackReload();\n\t}\n\tprivate async _paramCallbackReload() {\n\t\tconst map = await MapboxMapsController.waitForMap();\n\t\tconst layers = map.getStyle().layers;\n\t\tconst layerNames = layers.map((layer) => layer.id).sort();\n\t\tconst currentSpareParams = this.params.spare;\n\t\tconst currentValuesByName: Map<string, boolean> = new Map();\n\t\tfor (const spareParam of currentSpareParams) {\n\t\t\tconst value = spareParam.value;\n\t\t\tif (isBoolean(value)) {\n\t\t\t\tcurrentValuesByName.set(spareParam.name(), value);\n\t\t\t}\n\t\t}\n\t\tthis.params.updateParams({\n\t\t\tnamesToDelete: currentSpareParams.map((p) => p.name()),\n\t\t\ttoAdd: layerNames.map((layerName) => ({\n\t\t\t\tname: layerName,\n\t\t\t\ttype: ParamType.BOOLEAN,\n\t\t\t\tinitValue: currentValuesByName.get(layerName) || false,\n\t\t\t\trawInput: currentValuesByName.get(layerName) || false,\n\t\t\t\toptions: {spare: true},\n\t\t\t})),\n\t\t});\n\t}\n}\n","import {Vector2} from 'three';\nimport {Vector3} from 'three';\nimport {BufferGeometry} from 'three';\nimport {CoreGeometryOperationHexagon} from '../../../geometry/operation/Hexagon';\nimport {rotateGeometry} from '../../../Transform';\nimport {Vector2Like} from '../../../../types/GlobalTypes';\n\nconst DIR_ORIGIN = new Vector3(0, 1, 0);\nconst DIR_DEST = new Vector3(0, 0, 1);\nexport class MapboxPlaneHexagonsController {\n\tconstructor() {}\n\n\tgeometry(plane_dimensions: Vector2, segments_counts: Vector2Like, mapboxTransform: boolean): BufferGeometry {\n\t\t// for the hexagons, we have a constraint which is that\n\t\t// we cannot have different segment_counts for x and y,\n\t\t// we can only give a hexagon radius\n\t\t// therefore we need to compensate the scale.\n\t\t// not doing so, in the case of creating the plane in world pos\n\t\t// and after pluging it in a mapbox_transform\n\t\t// would result in uneven hexagons.\n\t\tconst hexagons_radius = Math.max(\n\t\t\tplane_dimensions.x / segments_counts.x,\n\t\t\tplane_dimensions.y / segments_counts.y\n\t\t);\n\t\tlet hexagons_scale_compensate: Vector3 | undefined;\n\t\tif (!mapboxTransform) {\n\t\t\tconst new_plane_dimensions = {\n\t\t\t\tx: segments_counts.x * hexagons_radius,\n\t\t\t\ty: segments_counts.y * hexagons_radius,\n\t\t\t};\n\t\t\thexagons_scale_compensate = new Vector3(1, plane_dimensions.y / new_plane_dimensions.y, 1);\n\t\t\tplane_dimensions.x = new_plane_dimensions.x;\n\t\t\tplane_dimensions.y = new_plane_dimensions.y;\n\t\t}\n\t\tconst operation = new CoreGeometryOperationHexagon(\n\t\t\tplane_dimensions,\n\t\t\thexagons_radius,\n\t\t\ttrue // always as points in the case of hexagons. too complicated otherwise\n\t\t);\n\t\tconst geometry = operation.process();\n\t\trotateGeometry(geometry, DIR_ORIGIN, DIR_DEST);\n\t\tif (!mapboxTransform && hexagons_scale_compensate) {\n\t\t\tgeometry.scale(hexagons_scale_compensate.x, hexagons_scale_compensate.y, hexagons_scale_compensate.z);\n\t\t}\n\t\treturn geometry;\n\t}\n}\n","/**\n * Creates a plane visible by a mapbox camera.\n *\n * @remarks\n *\n * See [sop/mapboxCamera](/docs/nodes/sop/mapboxCamera) for info on how to setup mapbox to use with Polygonjs\n *\n */\nimport {BufferGeometry, Box2, Mesh, Matrix4, Vector2, Vector3, PlaneGeometry} from 'three';\nimport mapboxgl from 'mapbox-gl';\nimport {ObjectType} from '../../../core/geometry/Constant';\nimport {CoreMath} from '../../../core/math/_Module';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {MapboxPlaneHexagonsController} from '../../../core/thirdParty/Mapbox/plane/HexagonsController';\nimport {Number3} from '../../../types/GlobalTypes';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {MapboxMapsController} from '../../../core/thirdParty/Mapbox/MapboxMapsController';\nimport {CoreMapboxTransform} from '../../../core/thirdParty/Mapbox/Transform';\nimport {TypedSopNode} from './_Base';\nimport {CoreMapboxUtils} from '../../../core/thirdParty/Mapbox/Utils';\nimport {ThreejsPoint} from '../../../core/geometry/modules/three/ThreejsPoint';\n\nconst dummyMesh = new Mesh();\n// const PSCALE_ATTRIB_NAME = 'pscale'\nconst SCALE_ATTRIB_NAME = 'scale';\nconst NORMAL_ATTRIB_NAME = 'normal';\n// const R_MAT_MAPBOX = new Matrix4().makeRotationAxis(new Vector3(1, 0, 0), -Math.PI * 0.5);\nconst R_MAT_WORLD = new Matrix4().makeRotationAxis(new Vector3(1, 0, 0), Math.PI * 0.5);\n\nenum MapboxPlaneType {\n\tPLANE = 'plane',\n\tHEXAGONS = 'hexagon',\n}\nconst MAPBOX_PLANE_TYPES: Array<MapboxPlaneType> = [MapboxPlaneType.PLANE, MapboxPlaneType.HEXAGONS];\n\nconst _mapCenter3D = new Vector3();\nconst _mapCenter2D = new Vector2();\n// import { MapboxPlaneFrustumController } from \"./utils/mapbox_plane/OutofViewController\";\n// update_always_allowed: true,\n// use_zoom: true\nclass MapboxPlaneSopParamsConfig extends NodeParamsConfig {\n\t/** @param camera lng lat */\n\t// lngLat = ParamConfig.VECTOR2([0, 0]);\n\t/** @param type of plane (grid or hexagons) */\n\ttype = ParamConfig.INTEGER(0, {\n\t\tmenu: {\n\t\t\tentries: MAPBOX_PLANE_TYPES.map((name, i) => {\n\t\t\t\treturn {name: name, value: i};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param plane resolution */\n\tresolution = ParamConfig.INTEGER(10, {\n\t\trange: [1, 20],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param multiplies the size of the plane. This can be useful to scale down the plane. While it would cover a smaller part of the view, it would be faster to create  */\n\tsizeMult = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param toggle on to make sure the plane will cover the full view */\n\tfullView = ParamConfig.BOOLEAN(1);\n\t// delete_out_of_view = ParamConfig.BOOLEAN(1);\n\t/** @param do not create polygons, only points */\n\tasPoints = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {\n\t\t\ttype: MAPBOX_PLANE_TYPES.indexOf(MapboxPlaneType.PLANE),\n\t\t},\n\t});\n\t/** @param creates within mapbox camera space */\n\t// mapboxTransform = ParamConfig.BOOLEAN(1);\n}\nconst ParamsConfig = new MapboxPlaneSopParamsConfig();\n\nexport class MapboxPlaneSopNode extends TypedSopNode<MapboxPlaneSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn 'mapboxPlane';\n\t}\n\tprivate _hexagonsController = new MapboxPlaneHexagonsController();\n\tprivate transformer = new CoreMapboxTransform();\n\n\toverride async cook() {\n\t\tconst map = await MapboxMapsController.waitForMap();\n\t\tif (!map) {\n\t\t\tthis.states.error.set('map not initialized yet');\n\t\t\treturn;\n\t\t}\n\t\t// const bounds = map.getBounds()\n\t\t// const southWest=bounds.getSouthWest()\n\t\t// const northEast=bounds.getNorthEast()\n\n\t\tconst geometry = this._buildPlane(map);\n\t\tif (geometry) {\n\t\t\tlet type: ObjectType = ObjectType.MESH;\n\t\t\tif (isBooleanTrue(this.pv.asPoints) || this._asHexagons()) {\n\t\t\t\ttype = ObjectType.POINTS;\n\t\t\t}\n\t\t\tconst object = this.createObject(geometry, type);\n\n\t\t\t// const coreObject = new CoreObject(object, 0);\n\t\t\t// coreObject.addAttribute('mapbox_sw', southWest);\n\t\t\t// coreObject.addAttribute('mapbox_ne', northEast);\n\n\t\t\tthis.setObject(object);\n\t\t}\n\t}\n\n\t_buildPlane(map: mapboxgl.Map) {\n\t\t// if (!this._cameraNode) {\n\t\t// \treturn;\n\t\t// }\n\t\t// const map_center = this._cameraNode.center();\n\t\t// if (!map_center) {\n\t\t// \tthis.states.error.set('map is not yet loaded');\n\t\t// \treturn;\n\t\t// }\n\t\tconst center = map.getCenter();\n\t\tthis.transformer.setLngLat(center);\n\n\t\t_mapCenter3D.set(center.lng, 0, center.lat);\n\t\t_mapCenter2D.set(center.lng, center.lat);\n\t\tthis.transformer.transform_position_FINAL(_mapCenter3D);\n\n\t\tconst vertical_far_lng_lat_points = CoreMapboxUtils.verticalFarLngLatPoints(map);\n\t\tconst vertical_near_lng_lat_points = CoreMapboxUtils.verticalNearLngLatPoints(map);\n\t\tconst lng_lat_points = this.pv.fullView ? vertical_far_lng_lat_points : vertical_near_lng_lat_points;\n\n\t\tif (!lng_lat_points) {\n\t\t\treturn;\n\t\t}\n\t\t//\n\t\t//\n\t\t// we mirror the requested points from the map center, to know how much of the map we cover\n\t\t//\n\t\t//\n\t\tconst mirrored_near_lng_lat_points = lng_lat_points.map((p) => this._mirrorLngLat(p, center));\n\t\tlng_lat_points.push(center);\n\t\tfor (const p of mirrored_near_lng_lat_points) {\n\t\t\tlng_lat_points.push(p);\n\t\t}\n\t\tconst box = new Box2();\n\t\tfor (const p of lng_lat_points) {\n\t\t\tbox.expandByPoint(new Vector2(p.lng, p.lat));\n\t\t}\n\n\t\t//\n\t\t//\n\t\t// get mapbox box\n\t\t//\n\t\t//\n\t\tconst mapbox_box = new Box2();\n\t\tfor (const p of lng_lat_points) {\n\t\t\tconst pt3d = new Vector3(p.lng, 0, p.lat);\n\t\t\tthis.transformer.transform_position_FINAL(pt3d);\n\t\t\tmapbox_box.expandByPoint(new Vector2(pt3d.x, pt3d.z));\n\t\t}\n\t\tconst mapbox_dimensions = new Vector2();\n\t\tmapbox_box.getSize(mapbox_dimensions);\n\n\t\t//\n\t\t//\n\t\t// get visible distance\n\t\t//\n\t\t//\n\t\tconst horizontal_lng_lat_points = CoreMapboxUtils.horizontalLngLatPoints(map);\n\t\tif (!horizontal_lng_lat_points) {\n\t\t\treturn;\n\t\t}\n\t\tconst mapbox_horizontal_lng_lat_points = horizontal_lng_lat_points.map((p: mapboxgl.LngLat) => {\n\t\t\tconst pt3d = new Vector3(p.lng, 0, p.lat);\n\t\t\tthis.transformer.transform_position_FINAL(pt3d);\n\t\t\treturn {lng: pt3d.x, lat: pt3d.z};\n\t\t});\n\t\tconst mapbox_horizontal_distances = {\n\t\t\tlng: Math.abs(mapbox_horizontal_lng_lat_points[0].lng - mapbox_horizontal_lng_lat_points[1].lng),\n\t\t\tlat: Math.abs(mapbox_horizontal_lng_lat_points[0].lat - mapbox_horizontal_lng_lat_points[1].lat),\n\t\t};\n\t\tconst mapbox_horizontal_distance = Math.sqrt(\n\t\t\tmapbox_horizontal_distances.lng * mapbox_horizontal_distances.lng +\n\t\t\t\tmapbox_horizontal_distances.lat * mapbox_horizontal_distances.lat\n\t\t);\n\t\tconst mapbox_segment_size = mapbox_horizontal_distance / this.pv.resolution;\n\n\t\t//\n\t\t//\n\t\t//\n\t\t//\n\t\t// Segments count should always be a multiple of 2\n\t\t// to ensure that we always have a point in the center.\n\t\t// Otherwise, we would just from having a point in the center to not having one on every move,\n\t\t// which is jarring\n\t\tconst segments_counts = {\n\t\t\tx: CoreMath.highestEven(this.pv.sizeMult * Math.ceil(mapbox_dimensions.x / mapbox_segment_size)),\n\t\t\ty: CoreMath.highestEven(this.pv.sizeMult * Math.ceil(mapbox_dimensions.y / mapbox_segment_size)),\n\t\t};\n\t\tmapbox_dimensions.x = segments_counts.x * mapbox_segment_size;\n\t\tmapbox_dimensions.y = segments_counts.y * mapbox_segment_size;\n\n\t\t//\n\t\t//\n\t\t// untransform mapbox\n\t\t//\n\t\t//\n\t\t// untransforming is a way to find the world pos\n\t\t// as we've done every operation before in mapbox space\n\t\tconst mapbox_box_untransformed = new Box2();\n\t\tconst mapbox_corners = [\n\t\t\t_mapCenter2D.clone().sub(mapbox_dimensions.clone().multiplyScalar(0.5)),\n\t\t\t_mapCenter2D.clone().sub(mapbox_dimensions.clone().multiplyScalar(-0.5)),\n\t\t\t_mapCenter2D.clone().add(mapbox_dimensions.clone().multiplyScalar(0.5)),\n\t\t\t_mapCenter2D.clone().add(mapbox_dimensions.clone().multiplyScalar(-0.5)),\n\t\t];\n\t\tfor (const p of mapbox_corners) {\n\t\t\tconst untransformed_3d = this.transformer.untransform_position_FINAL(new Vector3(p.x, 0, p.y));\n\t\t\tconst untransformed = new Vector2(untransformed_3d.x, untransformed_3d.z);\n\t\t\t// const retransformed = transformer.transform_position_FINAL(new Vector3(untransformed.x, 0, untransformed.y))\n\t\t\tmapbox_box_untransformed.expandByPoint(untransformed);\n\t\t}\n\t\tconst world_dimensions = new Vector2();\n\t\tmapbox_box_untransformed.getSize(world_dimensions);\n\n\t\t//\n\t\t//\n\t\t// round mapbox center to sense the grid is not moving, but we display a section of the world\n\t\t// NOTE: this may not be possible, due to having to the projections/transformations required\n\t\t//\n\t\t//\n\t\t// const world_segment_sizes = {\n\t\t// \tx: (world_dimensions.x / segments_counts.x),\n\t\t// \ty: (world_dimensions.y / segments_counts.y)\n\t\t// }\n\t\tconst world_plane_center = new Vector2(center.lng, center.lat);\n\t\t// const map_center_transformed = transformer.transform_position_FINAL(new Vector3(world_plane_center.x, 0, world_plane_center.y))\n\t\t// world_plane_center.x = CoreMath.round(world_plane_center.x, world_segment_sizes.x)\n\t\t// world_plane_center.y = CoreMath.round(world_plane_center.y, world_segment_sizes.y) //world_segment_sizes.y * Math.floor(world_plane_center.y / world_segment_sizes.y)\n\t\t// const segments_count = Math.max(segments_counts.x, segments_counts.y)\n\t\t// const mapbox_segments_count = Math.max(mapbox_segments_counts.x, mapbox_segments_counts.y)\n\n\t\t//\n\t\t//\n\t\t// create geometries\n\t\t//\n\t\t//\n\t\tconst horizontal_scale = mapbox_dimensions.x / segments_counts.x;\n\t\t// const plane_dimensions = this.pv.mapboxTransform ? mapbox_dimensions : world_dimensions;\n\t\t// const rotation_matrix = this.pv.mapboxTransform ? R_MAT_MAPBOX : R_MAT_WORLD;\n\t\t// const geometry_center = this.pv.mapboxTransform ? _mapCenter2D : world_plane_center;\n\t\tconst plane_dimensions = world_dimensions;\n\t\tconst rotation_matrix = R_MAT_WORLD;\n\t\tconst geometry_center = world_plane_center;\n\n\t\tlet geometry: BufferGeometry;\n\t\tif (this._asHexagons()) {\n\t\t\tgeometry = this._hexagonsController.geometry(plane_dimensions, segments_counts, false);\n\t\t} else {\n\t\t\tgeometry = new PlaneGeometry(plane_dimensions.x, plane_dimensions.y, segments_counts.x, segments_counts.y);\n\t\t\tgeometry.applyMatrix4(rotation_matrix);\n\t\t}\n\n\t\t// rotate and translate to expected center\n\n\t\tgeometry.translate(geometry_center.x, 0, geometry_center.y);\n\n\t\t// add attributes scale and normal\n\t\tconst z_scale = [horizontal_scale, 1][0];\n\t\tconst scale: Number3 = [horizontal_scale, horizontal_scale, z_scale];\n\t\tdummyMesh.geometry = geometry;\n\t\tconst corePointClass = ThreejsPoint;\n\t\tcorePointClass.addNumericAttribute(dummyMesh, SCALE_ATTRIB_NAME, 3, scale);\n\t\tcorePointClass.addNumericAttribute(dummyMesh, NORMAL_ATTRIB_NAME, 3, [0, 1, 0]); // mostly important for hexagons points\n\n\t\t//\n\t\t//\n\t\t// if delete out of view\n\t\t//\n\t\t//\n\t\t// not yet working. I suspect that the margin is too high, and is in the wrong coordinate\n\t\t// (in mapbox or world, but should be in the other)\n\t\t// if (this.pv.delete_out_of_view) {\n\t\t// \tconst reconstructed_geo = this._frustum_controller.delete_out_of_view(\n\t\t// \t\tgeometry,\n\t\t// \t\tcore_geo,\n\t\t// \t\tthis._camera_node,\n\t\t// \t\ttransformer,\n\t\t// \t\tplane_dimensions,\n\t\t// \t\tsegments_counts\n\t\t// \t);\n\t\t// \tif (reconstructed_geo) {\n\t\t// \t\tgeometry = reconstructed_geo;\n\t\t// \t}\n\t\t// }\n\n\t\treturn geometry;\n\t}\n\n\tprivate _mirrorLngLat(p: mapboxgl.LngLat, map_center: mapboxgl.LngLat) {\n\t\tconst delta = {\n\t\t\tlng: map_center.lng - p.lng,\n\t\t\tlat: map_center.lat - p.lat,\n\t\t};\n\t\treturn new mapboxgl.LngLat(map_center.lng + delta.lng, map_center.lat + delta.lat);\n\t}\n\tprivate _asHexagons(): boolean {\n\t\treturn this.pv.type == MAPBOX_PLANE_TYPES.indexOf(MapboxPlaneType.HEXAGONS);\n\t}\n}\n","/**\n * Transforms a geometry from the world space to the mapbox space\n *\n * @remarks\n *\n * The mapbox space is very specific to mapbox, as it is very small (several orders of magnitude) compared to the threejs space.\n * See [sop/mapboxCamera](/docs/nodes/sop/mapboxCamera) for info on how to setup mapbox to use with Polygonjs\n *\n *\n */\nimport {CoreMapboxTransform} from '../../../core/thirdParty/Mapbox/Transform';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {CoreGroup} from '../../../core/geometry/Group';\n// import {MapboxListenerParamConfig, MapboxListenerSopNode} from './utils/MapboxListener';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {TypedSopNode} from './_Base';\nimport {TransformTargetType, TRANSFORM_TARGET_TYPES} from '../../../core/Transform';\nimport {Object3D} from 'three';\nimport {TypeAssert} from '../../poly/Assert';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\n\nclass MapboxTransformSopParamsConfig extends NodeParamsConfig {\n\t/** @param sets if this node should transform objects or geometries */\n\tapplyOn = ParamConfig.INTEGER(TRANSFORM_TARGET_TYPES.indexOf(TransformTargetType.GEOMETRY), {\n\t\tmenu: {\n\t\t\tentries: TRANSFORM_TARGET_TYPES.map((name, value) => {\n\t\t\t\treturn {name, value};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param camera longitude */\n\tlongitude = ParamConfig.FLOAT(0, {\n\t\trange: [-360, 360],\n\t});\n\t/** @param camera latitude */\n\tlatitude = ParamConfig.FLOAT(0, {\n\t\trange: [-90, 90],\n\t});\n}\nconst ParamsConfig = new MapboxTransformSopParamsConfig();\n\nexport class MapboxTransformSopNode extends TypedSopNode<MapboxTransformSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\n\tstatic override type() {\n\t\treturn SopType.MAPBOX_TRANSFORM;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\n\t\t// this.uiData.set_icon(\"map-marker-alt\");\n\t\t// this._init_mapbox_listener();\n\t}\n\tprivate _transformer = new CoreMapboxTransform();\n\toverride cook(inputContents: CoreGroup[]) {\n\t\tconst coreGroup = inputContents[0];\n\n\t\tthis._transformer.setLngLat({\n\t\t\tlng: this.pv.longitude,\n\t\t\tlat: this.pv.latitude,\n\t\t});\n\t\tconst objects = coreGroup.threejsObjects();\n\t\tthis._applyTransform(objects);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\tprivate _applyTransform(objects: Object3D[]) {\n\t\tconst mode = TRANSFORM_TARGET_TYPES[this.pv.applyOn];\n\t\tswitch (mode) {\n\t\t\tcase TransformTargetType.GEOMETRY: {\n\t\t\t\treturn this._updateGeometries(objects);\n\t\t\t}\n\t\t\tcase TransformTargetType.OBJECT: {\n\t\t\t\treturn this._updateObjects(objects);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(mode);\n\t}\n\tprivate _updateGeometries(objects: Object3D[]) {\n\t\tfor (const object of objects) {\n\t\t\tthis._transformer.transform_groupGeometry_FINAL(object);\n\t\t}\n\t}\n\tprivate _updateObjects(objects: Object3D[]) {\n\t\tfor (const object of objects) {\n\t\t\tthis._transformer.transform_groupObject_FINAL(object);\n\t\t}\n\t}\n\n\t// private _transformInput(core_group: CoreGroup) {\n\n\t// }\n\n\t// _postInitController() {}\n}\n","/**\n * Merge input geometries\n *\n * @remarks\n * This node can take up to 4 inputs. It can operate within 1 of 2 modes:\n *\n * - compact ON: all objects will be merged in as few objects as possible. So all meshes will be merged into one, all point objects into one, and all line objects into one. This requires the objects to have the same attributes.\n * - compact OFF: all objects are simply put under a common parent, but remain distinct objects.\n\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {MergeSopOperation} from '../../operations/sop/Merge';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../_Base';\nimport {NodeEvent} from '../../poly/NodeEvent';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nconst DEFAULT = MergeSopOperation.DEFAULT_PARAMS;\nconst DEFAULT_INPUTS_COUNT = 4;\nclass MergeSopParamsConfig extends NodeParamsConfig {\n\t/** @param When off, input objects remain separate. When on, they are merged together by type (mesh, points and lines). In order to merge them correctly, you'll have to make sure they have the same attributes */\n\tcompact = ParamConfig.BOOLEAN(DEFAULT.compact);\n\t/** @param When off, objects with same type (mesh, points, lines) will be merged together, regardless of their material. When on, only objects with same type and same material will be merged */\n\tpreserveMaterials = ParamConfig.BOOLEAN(DEFAULT.preserveMaterials, {\n\t\tvisibleIf: {\n\t\t\tcompact: true,\n\t\t},\n\t});\n\t/** @param number of inputs that this node can merge geometries from */\n\tinputsCount = ParamConfig.INTEGER(DEFAULT_INPUTS_COUNT, {\n\t\trange: [1, 32],\n\t\trangeLocked: [true, false],\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tMergeSopNode.PARAM_CALLBACK_setInputsCount(node as MergeSopNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new MergeSopParamsConfig();\n\nexport class MergeSopNode extends TypedSopNode<MergeSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.MERGE;\n\t}\n\n\tsetCompactMode(compact: boolean) {\n\t\tthis.p.compact.set(compact);\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1, DEFAULT_INPUTS_COUNT);\n\t\tthis.io.inputs.initInputsClonedState(MergeSopOperation.INPUT_CLONED_STATE);\n\n\t\tthis.params.onParamsCreated('update inputs', () => {\n\t\t\tthis._callbackUpdateInputsCount();\n\t\t});\n\t}\n\n\tprivate _operation: MergeSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new MergeSopOperation(this.scene(), this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tprivate _callbackUpdateInputsCount() {\n\t\tthis.io.inputs.setCount(1, this.pv.inputsCount);\n\t\tthis.emit(NodeEvent.INPUTS_UPDATED);\n\t}\n\tstatic PARAM_CALLBACK_setInputsCount(node: MergeSopNode) {\n\t\tnode._callbackUpdateInputsCount();\n\t}\n}\n","/**\n * Updates the normals of the geometry\n *\n * @remarks\n * Just like the Point and Color SOPs, this can take expressions\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {Attribute} from '../../../core/geometry/Attribute';\nimport {BufferGeometry, BufferAttribute, Mesh} from 'three';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport type {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {pointsFromObject} from '../../../core/geometry/entities/point/CorePointUtils';\nimport {corePointClassFactory} from '../../../core/geometry/CoreObjectFactory';\nimport {CoreObjectType} from '../../../core/geometry/ObjectContent';\nimport {CorePoint} from '../../../core/geometry/entities/point/CorePoint';\nclass NormalsSopParamsConfig extends NodeParamsConfig {\n\t/** @param toggle on if normals can be updated via expressions */\n\tedit = ParamConfig.BOOLEAN(0);\n\t/** @param toggle on to update the x component */\n\tupdateX = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {edit: 1},\n\t});\n\t/** @param expression or value for the x component */\n\tx = ParamConfig.FLOAT('@N.x', {\n\t\tvisibleIf: {updateX: 1, edit: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param toggle on to update the y component */\n\tupdateY = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {edit: 1},\n\t});\n\t/** @param expression or value for the y component */\n\ty = ParamConfig.FLOAT('@N.y', {\n\t\tvisibleIf: {updateY: 1, edit: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param toggle on to update the z component */\n\tupdateZ = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {edit: 1},\n\t});\n\t/** @param expression or value for the z component */\n\tz = ParamConfig.FLOAT('@N.z', {\n\t\tvisibleIf: {updateZ: 1, edit: 1},\n\t\texpression: {forEntities: true},\n\t});\n\n\t/** @param recompute the normals based on the position */\n\trecompute = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {edit: 0},\n\t});\n\t/** @param invert normals */\n\tinvert = ParamConfig.BOOLEAN(0);\n}\nconst ParamsConfig = new NormalsSopParamsConfig();\n\nexport class NormalsSopNode extends TypedSopNode<NormalsSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.NORMALS;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\n\t\tif (isBooleanTrue(this.pv.edit)) {\n\t\t\tawait this._evalExpressionsForCoreGroup(coreGroup);\n\t\t} else {\n\t\t\tif (this.pv.recompute) {\n\t\t\t\tconst objects = coreGroup.threejsObjectsWithGeo();\n\t\t\t\tfor (const object of objects) {\n\t\t\t\t\tobject.geometry.computeVertexNormals();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isBooleanTrue(this.pv.invert)) {\n\t\t\tthis._invertNormals(coreGroup);\n\t\t}\n\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tprivate async _evalExpressionsForCoreGroup(coreGroup: CoreGroup) {\n\t\tconst coreObjects = coreGroup.threejsCoreObjects();\n\t\tfor (const coreObject of coreObjects) {\n\t\t\tawait this._evalExpressionsForCoreObject(coreObject);\n\t\t}\n\t}\n\tprivate async _evalExpressionsForCoreObject(coreObject: ThreejsCoreObject) {\n\t\tconst object = coreObject.object();\n\t\tconst geometry = (object as Mesh).geometry as BufferGeometry;\n\t\tconst points: CorePoint<CoreObjectType>[] = [];\n\t\tpointsFromObject(object, points);\n\t\tconst corePointClass = corePointClassFactory(object);\n\n\t\tlet attrib = geometry.getAttribute(Attribute.NORMAL) as BufferAttribute;\n\t\tif (!attrib) {\n\t\t\tcorePointClass.addNumericAttribute(object, Attribute.NORMAL, 3, 0);\n\t\t\tattrib = geometry.getAttribute(Attribute.NORMAL) as BufferAttribute;\n\t\t}\n\t\tconst array = attrib.array;\n\n\t\t// x\n\t\tif (isBooleanTrue(this.pv.updateX)) {\n\t\t\tconst param = this.p.x;\n\t\t\tif (param.hasExpression() && param.expressionController && param.expressionController.entitiesDependent()) {\n\t\t\t\tawait param.expressionController.computeExpressionForPoints(points, (point, value) => {\n\t\t\t\t\tarray[point.index() * 3 + 0] = value;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlet point;\n\t\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tarray[point.index() * 3 + 0] = param.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// y\n\t\tif (isBooleanTrue(this.pv.updateY)) {\n\t\t\tconst param = this.p.y;\n\t\t\tif (param.hasExpression() && param.expressionController && param.expressionController.entitiesDependent()) {\n\t\t\t\tawait param.expressionController.computeExpressionForPoints(points, (point, value) => {\n\t\t\t\t\tarray[point.index() * 3 + 1] = value;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlet point;\n\t\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tarray[point.index() * 3 + 1] = param.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// z\n\t\tif (isBooleanTrue(this.pv.updateZ)) {\n\t\t\tconst param = this.p.z;\n\t\t\tif (param.hasExpression() && param.expressionController && param.expressionController.entitiesDependent()) {\n\t\t\t\tawait param.expressionController.computeExpressionForPoints(points, (point, value) => {\n\t\t\t\t\tarray[point.index() * 3 + 2] = value;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlet point;\n\t\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tarray[point.index() * 3 + 2] = param.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _invertNormals(coreGroup: CoreGroup) {\n\t\tconst objects = coreGroup.allObjects();\n\t\tfor (const object of objects) {\n\t\t\tconst corePointClass = corePointClassFactory(object);\n\t\t\tconst normalAttrib = corePointClass.attribute(object, Attribute.NORMAL) as BufferAttribute | undefined;\n\t\t\tif (normalAttrib) {\n\t\t\t\tconst array = normalAttrib.array;\n\t\t\t\tfor (let i = 0; i < array.length; i++) {\n\t\t\t\t\tarray[i] *= -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BasePersistedConfig, PersistedConfigWithShaders} from '../../../../utils/BasePersistedConfig';\nimport {ParticlesSystemGpuSopNode} from '../../../../sop/ParticlesSystemGpu';\nimport {TextureAllocationsController, TextureAllocationsControllerData} from '../../utils/TextureAllocationsController';\nimport {ShaderName} from '../../../../utils/shaders/ShaderName';\nimport {ShaderMaterial} from 'three';\nimport {PolyDictionary} from '../../../../../../types/GlobalTypes';\n\nexport interface PersistedConfigBaseParticlesData extends PersistedConfigWithShaders {\n\ttexture_allocations: TextureAllocationsControllerData;\n\tparam_uniform_pairs: [string, string][];\n\tuniforms_owner: object;\n}\n\nexport class ParticlesPersistedConfig extends BasePersistedConfig {\n\tprivate _loaded_data: PersistedConfigBaseParticlesData | undefined;\n\n\tconstructor(protected override node: ParticlesSystemGpuSopNode) {\n\t\tsuper(node);\n\t}\n\toverride async toData(): Promise<PersistedConfigBaseParticlesData | undefined> {\n\t\tconst assemblerController = this.node.assemblerController();\n\t\tif (!assemblerController) {\n\t\t\treturn;\n\t\t}\n\t\tconst shaders_by_name: PolyDictionary<string> = {};\n\t\tconst node_shaders_by_name = this.node.shadersByName();\n\t\tnode_shaders_by_name.forEach((shader, shader_name) => {\n\t\t\tshaders_by_name[shader_name] = shader;\n\t\t});\n\n\t\tconst texture_allocations_data = assemblerController.assembler\n\t\t\t.textureAllocationsController()\n\t\t\t.toJSON(this.node.scene());\n\n\t\t// params updating uniforms\n\t\tconst param_uniform_pairs: [string, string][] = [];\n\t\tconst uniforms_owner = new ShaderMaterial();\n\t\tconst param_configs = assemblerController.assembler.param_configs();\n\t\tfor (const param_config of param_configs) {\n\t\t\tparam_uniform_pairs.push([param_config.name(), param_config.uniformName()]);\n\t\t\tuniforms_owner.uniforms[param_config.uniformName()] = param_config.uniform();\n\t\t}\n\n\t\tconst material_data = this._materialToJson(uniforms_owner, {\n\t\t\tnode: this.node,\n\t\t\tsuffix: 'main',\n\t\t});\n\t\tconst data: PersistedConfigBaseParticlesData = {\n\t\t\ttexture_allocations: texture_allocations_data,\n\t\t\tparam_uniform_pairs: param_uniform_pairs,\n\t\t\tuniforms_owner: material_data || {},\n\t\t\tshaders: shaders_by_name,\n\t\t};\n\t\treturn data;\n\t}\n\toverride load(data: PersistedConfigBaseParticlesData) {\n\t\tconst assemblerController = this.node.assemblerController();\n\t\tif (assemblerController) {\n\t\t\treturn;\n\t\t}\n\t\tthis._loaded_data = data;\n\t\t//\n\t\t// for now, unlike the texture and material persistedconfigs,\n\t\t// the callbacks are created in the GPUController\n\t\t//\n\t\tthis.node.init_with_persisted_config();\n\t}\n\tloaded_data() {\n\t\treturn this._loaded_data;\n\t}\n\tshaders_by_name() {\n\t\tif (this._loaded_data) {\n\t\t\tconst shaders_by_name: Map<ShaderName, string> = new Map();\n\t\t\tconst shaders = this._loaded_data.shaders;\n\t\t\tif (shaders) {\n\t\t\t\tconst shader_names: ShaderName[] = Object.keys(shaders) as ShaderName[];\n\t\t\t\tfor (const shader_name of shader_names) {\n\t\t\t\t\tshaders_by_name.set(shader_name, shaders[shader_name]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn shaders_by_name;\n\t\t}\n\t}\n\ttexture_allocations_controller() {\n\t\tif (this._loaded_data) {\n\t\t\treturn TextureAllocationsController.fromJSON(this._loaded_data.texture_allocations);\n\t\t}\n\t}\n\tuniforms() {\n\t\tif (this._loaded_data) {\n\t\t\tconst uniforms_owner = this._loadMaterial(this._loaded_data.uniforms_owner);\n\t\t\tconst uniforms = uniforms_owner?.uniforms || {};\n\t\t\treturn uniforms;\n\t\t}\n\t}\n}\n","/**\n * Allows to create particle systems that will run on the GPU using gl nodes.\n *\n * @remarks\n * TBD\n *\n *\n */\n\n// SPECS:\n// - simulation shaders should update the particles at any frame, and resimulate accordingly when at later frames\n// - render material should update at any frame, without having to resimulate\n// - changing the input will recompute, when on first frame only (otherwise an animated geo could make it recompute all the time)\nimport {Object3D} from 'three';\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {TypedSopNode} from './_Base';\nimport {GlobalsTextureHandler, GlobalsTextureHandlerPurpose} from '../gl/code/globals/Texture';\n\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {CoreParticlesAttribute} from '../../../core/particles/CoreParticlesAttribute';\nimport {\n\tcreateOrFindParticlesController,\n\tdisposeParticlesFromNode,\n\tsetParticleRenderer,\n} from '../../../core/particles/CoreParticles';\nimport {CoreParticlesController} from '../../../core/particles/CoreParticlesController';\nimport {PARTICLE_DATA_TYPES} from '../../../core/particles/CoreParticlesGpuComputeController';\nimport {GlNodeChildrenMap} from '../../poly/registers/nodes/Gl';\nimport {BaseGlNodeType} from '../gl/_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {ShaderName} from '../utils/shaders/ShaderName';\nimport {GlNodeFinder} from '../gl/code/utils/NodeFinder';\nimport {AssemblerName} from '../../poly/registers/assemblers/_BaseRegister';\nimport {Poly} from '../../Poly';\nimport {ParticlesPersistedConfig} from '../gl/code/assemblers/particles/ParticlesPersistedConfig';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {GlAssemblerController} from '../gl/code/Controller';\nimport {ShaderAssemblerParticles} from '../gl/code/assemblers/particles/Particles';\nimport {ParticlesSystemGpuAttributesSopOperation} from '../../operations/sop/ParticlesSystemGpuAttributes';\nimport {ParticlesSystemGpuMaterialSopOperation} from '../../operations/sop/ParticlesSystemGpuMaterial';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface OperationContainer {\n\tattributes: ParticlesSystemGpuAttributesSopOperation;\n\tmaterial: ParticlesSystemGpuMaterialSopOperation;\n}\nconst DEFAULT = ParticlesSystemGpuAttributesSopOperation.DEFAULT_PARAMS;\n\nclass ParticlesSystemGpuSopParamsConfig extends NodeParamsConfig {\n\t/** @param group to assign the material to */\n\tgroup = ParamConfig.STRING(DEFAULT.group, {\n\t\tobjectMask: true,\n\t});\n\n\t/** @param data type used by the solver */\n\tdataType = ParamConfig.INTEGER(0, {\n\t\tmenu: {\n\t\t\tentries: PARTICLE_DATA_TYPES.map((value, index) => {\n\t\t\t\treturn {value: index, name: value};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param number of frames to run before scene plays */\n\tpreRollFramesCount = ParamConfig.INTEGER(0, {\n\t\trange: [0, 100],\n\t\trangeLocked: [true, false],\n\t});\n\n\t/** @param material used to render the particles */\n\tmaterial = ParamConfig.NODE_PATH('', {\n\t\t// separatorBefore: true,\n\t\tnodeSelection: {\n\t\t\tcontext: NodeContext.MAT,\n\t\t},\n\t\tdependentOnFoundNode: false,\n\t\tseparatorAfter: true,\n\t});\n}\nconst ParamsConfig = new ParticlesSystemGpuSopParamsConfig();\nexport class ParticlesSystemGpuSopNode extends TypedSopNode<ParticlesSystemGpuSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.PARTICLES_SYSTEM_GPU;\n\t}\n\n\toverride dispose() {\n\t\tdisposeParticlesFromNode(this);\n\t\tsuper.dispose();\n\t}\n\n\tassemblerController() {\n\t\treturn this._assemblerController;\n\t}\n\tpublic override usedAssembler(): Readonly<AssemblerName.GL_PARTICLES> {\n\t\treturn AssemblerName.GL_PARTICLES;\n\t}\n\tprotected _assemblerController = this._createAssemblerController();\n\tprivate _createAssemblerController(): GlAssemblerController<ShaderAssemblerParticles> | undefined {\n\t\treturn Poly.assemblersRegister.assembler(this, this.usedAssembler());\n\t}\n\tpublic override readonly persisted_config: ParticlesPersistedConfig = new ParticlesPersistedConfig(this);\n\tprivate _particlesGlobalsHandler = new GlobalsTextureHandler(\n\t\tGlobalsTextureHandler.PARTICLE_SIM_UV,\n\t\tGlobalsTextureHandlerPurpose.PARTICLES_SHADER\n\t);\n\tprivate _shadersByName: Map<ShaderName, string> = new Map();\n\tshadersByName() {\n\t\treturn this._shadersByName;\n\t}\n\n\tstatic override requireWebGL2() {\n\t\treturn true;\n\t}\n\n\tprotected override _childrenControllerContext = NodeContext.GL;\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\t// set to never at the moment\n\t\t// otherwise the input is cloned on every frame inside cook_main()\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.ALWAYS);\n\t}\n\n\toverride createNode<S extends keyof GlNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): GlNodeChildrenMap[S];\n\toverride createNode<K extends valueof<GlNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<GlNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseGlNodeType[];\n\t}\n\toverride nodesByType<K extends keyof GlNodeChildrenMap>(type: K): GlNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as GlNodeChildrenMap[K][];\n\t}\n\toverride childrenAllowed() {\n\t\tif (this.assemblerController()) {\n\t\t\treturn super.childrenAllowed();\n\t\t}\n\t\treturn false;\n\t}\n\toverride sceneReadonly() {\n\t\treturn this.assemblerController() == null;\n\t}\n\n\tprivate _operation: OperationContainer | undefined;\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || {\n\t\t\tattributes: new ParticlesSystemGpuAttributesSopOperation(this._scene, this.states, this),\n\t\t\tmaterial: new ParticlesSystemGpuMaterialSopOperation(this._scene, this.states, this),\n\t\t};\n\n\t\tthis.compileIfRequired();\n\n\t\tconst coreGroup = inputCoreGroups[0];\n\n\t\tconst selectedObjects = CoreMask.filterThreejsObjects(coreGroup, this.pv);\n\t\tfor (const object of selectedObjects) {\n\t\t\tconst existingActorIds = this.scene().actorsManager.objectActorNodeIds(object);\n\t\t\tif (existingActorIds == null || existingActorIds.length == 0) {\n\t\t\t\tthis.states.error.set(`the input objects requires an actor node assigned to it`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst renderer = await this.scene().renderersRegister.waitForRenderer();\n\t\tif (!renderer) {\n\t\t\tthis.states.error.set(`no renderer found`);\n\t\t\treturn;\n\t\t}\n\t\tfor (const object of selectedObjects) {\n\t\t\tPoly.onObjectsAddRemoveHooks.assignOnAddHookHandler(object, this);\n\t\t\tsetParticleRenderer(this.graphNodeId(), renderer);\n\t\t\tCoreParticlesAttribute.setParticlesNodeId(object, this.graphNodeId());\n\t\t\tCoreParticlesAttribute.setDataType(object, this.pv.dataType);\n\t\t\tCoreParticlesAttribute.setPreRollFramesCount(object, this.pv.preRollFramesCount);\n\t\t}\n\n\t\tthis._operation.attributes.cook(inputCoreGroups, this.pv);\n\t\tawait this._operation.material.cook(inputCoreGroups, this.pv);\n\t\tthis.setObjects(selectedObjects);\n\t}\n\tpublic override updateObjectOnAdd(object: Object3D) {\n\t\tconst particlesNodeId = CoreParticlesAttribute.getParticlesNodeId(object);\n\t\tif (particlesNodeId == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (particlesNodeId != this.graphNodeId()) {\n\t\t\treturn;\n\t\t}\n\t\tcreateOrFindParticlesController(object, this.scene());\n\t}\n\n\tcompileIfRequired() {\n\t\tif (this.assemblerController()?.compileRequired()) {\n\t\t\t// this.debugMessage('particles:this.run_assembler() START');\n\t\t\ttry {\n\t\t\t\tthis.run_assembler();\n\t\t\t} catch (err) {\n\t\t\t\tconst message = (err as any).message || 'failed to compile';\n\t\t\t\tthis.states.error.set(message);\n\t\t\t}\n\t\t\t// this.debugMessage('particles:this.run_assembler() END');\n\t\t}\n\t}\n\trun_assembler() {\n\t\tconst assemblerController = this.assemblerController();\n\t\tif (!assemblerController) {\n\t\t\treturn;\n\t\t}\n\t\tconst exportNodes = this._findExportNodes();\n\t\tif (exportNodes.length > 0) {\n\t\t\tconst rootNodes = exportNodes.concat(GlNodeFinder.findAjacencyNodes(this));\n\t\t\tassemblerController.setAssemblerGlobalsHandler(this._particlesGlobalsHandler);\n\t\t\tassemblerController.assembler.set_root_nodes(rootNodes);\n\n\t\t\tassemblerController.assembler.compile();\n\t\t\tassemblerController.post_compile();\n\t\t}\n\n\t\tconst shadersByName = assemblerController.assembler.shaders_by_name();\n\t\tthis._setShaderNames(shadersByName);\n\t}\n\n\tprivate _setShaderNames(shadersByName: Map<ShaderName, string>) {\n\t\tthis._shadersByName = shadersByName;\n\t}\n\n\tinit_with_persisted_config() {\n\t\tconst shaders_by_name = this.persisted_config.shaders_by_name();\n\t\tconst texture_allocations_controller = this.persisted_config.texture_allocations_controller();\n\t\tif (shaders_by_name && texture_allocations_controller) {\n\t\t\tthis._setShaderNames(shaders_by_name);\n\t\t\t// this.gpuController.setPersistedTextureAllocationController(texture_allocations_controller);\n\t\t}\n\t}\n\tinitCoreParticlesControllerFromPersistedConfig(coreParticlesController: CoreParticlesController) {\n\t\tconst shaders_by_name = this.persisted_config.shaders_by_name();\n\t\tconst texture_allocations_controller = this.persisted_config.texture_allocations_controller();\n\t\tif (shaders_by_name && texture_allocations_controller) {\n\t\t\t// this._setShaderNames(shaders_by_name);\n\t\t\tcoreParticlesController.setPersistedTextureAllocationController(texture_allocations_controller);\n\t\t}\n\t}\n\n\tprivate _findExportNodes() {\n\t\tconst nodes: BaseGlNodeType[] = GlNodeFinder.findAttributeExportNodes(this);\n\t\tconst outputNodes = GlNodeFinder.findOutputNodes(this);\n\t\tif (outputNodes.length == 0) {\n\t\t\tthis.states.error.set('one output node is required');\n\t\t}\n\t\tif (outputNodes.length > 1) {\n\t\t\tthis.states.error.set('only one output node is allowed');\n\t\t\treturn [];\n\t\t}\n\t\tconst outputNode = outputNodes[0];\n\t\tif (outputNode) {\n\t\t\tnodes.push(outputNode);\n\t\t}\n\t\treturn nodes;\n\t}\n}\n","/**\n * Creates a plane.\n *\n * @remarks\n * This node is similar to the Color and Normal SOPs, and can update the vertex positions with expressions\n *\n */\nimport {BufferGeometry, TypedArray, BufferAttribute, Mesh} from 'three';\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport type {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {BaseCorePoint, CorePoint} from '../../../core/geometry/entities/point/CorePoint';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {BooleanParam} from '../../params/Boolean';\nimport {FloatParam} from '../../params/Float';\n\nconst POSITION_ATTRIB_NAME = 'position';\n\ntype ValueArrayByName = Map<string, number[]>;\ntype ComponentOffset = 0 | 1 | 2;\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {pointsFromObject} from '../../../core/geometry/entities/point/CorePointUtils';\nimport {CoreObjectType} from '../../../core/geometry/ObjectContent';\nclass PointSopParamsConfig extends NodeParamsConfig {\n\t/** @param toggle on to update the x component */\n\tupdateX = ParamConfig.BOOLEAN(0);\n\t/** @param expression the x component */\n\tx = ParamConfig.FLOAT('@P.x', {\n\t\tvisibleIf: {updateX: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param toggle on to update the y component */\n\tupdateY = ParamConfig.BOOLEAN(0);\n\t/** @param expression the y component */\n\ty = ParamConfig.FLOAT('@P.y', {\n\t\tvisibleIf: {updateY: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param toggle on to update the z component */\n\tupdateZ = ParamConfig.BOOLEAN(0);\n\t/** @param expression the z component */\n\tz = ParamConfig.FLOAT('@P.z', {\n\t\tvisibleIf: {updateZ: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param toggle on to update the normals */\n\tupdateNormals = ParamConfig.BOOLEAN(1);\n}\nconst ParamsConfig = new PointSopParamsConfig();\n\nexport class PointSopNode extends TypedSopNode<PointSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.POINT;\n\t}\n\n\tprivate _x_arrays_by_geometry_uuid: ValueArrayByName = new Map();\n\tprivate _y_arrays_by_geometry_uuid: ValueArrayByName = new Map();\n\tprivate _z_arrays_by_geometry_uuid: ValueArrayByName = new Map();\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tawait this._evalExpressionsForCoreGroup(coreGroup);\n\t}\n\n\tasync _evalExpressionsForCoreGroup(coreGroup: CoreGroup) {\n\t\tconst coreObjects = coreGroup.threejsCoreObjects();\n\n\t\tfor (let i = 0; i < coreObjects.length; i++) {\n\t\t\tawait this._evalExpressionsForCoreObject(coreObjects[i]);\n\t\t}\n\n\t\tif (isBooleanTrue(this.pv.updateNormals)) {\n\t\t\tconst objects = coreGroup.threejsObjectsWithGeo();\n\t\t\tfor (const object of objects) {\n\t\t\t\tif ((object as Mesh).isMesh) {\n\t\t\t\t\tobject.geometry.computeVertexNormals();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometries = coreGroup.geometries();\n\t\tfor (const geometry of geometries) {\n\t\t\tgeometry.computeBoundingBox();\n\t\t}\n\n\t\t// needs update required for when no cloning\n\t\tif (!this.io.inputs.cloneRequired(0)) {\n\t\t\tconst geometries = coreGroup.geometries();\n\t\t\tfor (const geometry of geometries) {\n\t\t\t\tconst attrib = geometry.getAttribute(POSITION_ATTRIB_NAME) as BufferAttribute;\n\t\t\t\tattrib.needsUpdate = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\tasync _evalExpressionsForCoreObject(coreObject: ThreejsCoreObject) {\n\t\tconst object = coreObject.object();\n\t\tconst geometry = (object as Mesh).geometry as BufferGeometry;\n\t\tconst points: CorePoint<CoreObjectType>[] = [];\n\t\tpointsFromObject(object, points);\n\n\t\tconst array = (geometry.getAttribute(POSITION_ATTRIB_NAME) as BufferAttribute).array;\n\n\t\tconst tmp_array_x = await this._updateFromParam(\n\t\t\tgeometry,\n\t\t\tpoints,\n\t\t\tthis.p.updateX,\n\t\t\tthis.p.x,\n\t\t\tthis.pv.x,\n\t\t\tthis._x_arrays_by_geometry_uuid,\n\t\t\t0\n\t\t);\n\t\tconst tmp_array_y = await this._updateFromParam(\n\t\t\tgeometry,\n\t\t\tpoints,\n\t\t\tthis.p.updateY,\n\t\t\tthis.p.y,\n\t\t\tthis.pv.y,\n\t\t\tthis._y_arrays_by_geometry_uuid,\n\t\t\t1\n\t\t);\n\t\tconst tmp_array_z = await this._updateFromParam(\n\t\t\tgeometry,\n\t\t\tpoints,\n\t\t\tthis.p.updateZ,\n\t\t\tthis.p.z,\n\t\t\tthis.pv.z,\n\t\t\tthis._z_arrays_by_geometry_uuid,\n\t\t\t2\n\t\t);\n\n\t\tif (tmp_array_x) {\n\t\t\tthis._commitTmpValues(tmp_array_x, array, 0);\n\t\t}\n\t\tif (tmp_array_y) {\n\t\t\tthis._commitTmpValues(tmp_array_y, array, 1);\n\t\t}\n\t\tif (tmp_array_z) {\n\t\t\tthis._commitTmpValues(tmp_array_z, array, 2);\n\t\t}\n\t}\n\n\tprivate async _updateFromParam(\n\t\tgeometry: BufferGeometry,\n\t\tpoints: BaseCorePoint[],\n\t\tdo_update_param: BooleanParam,\n\t\tvalue_param: FloatParam,\n\t\tparam_value: number,\n\t\tarrays_by_geometry_uuid: ValueArrayByName,\n\t\toffset: ComponentOffset\n\t) {\n\t\tconst do_update = do_update_param;\n\t\tconst param = value_param;\n\n\t\tlet tmpArray = this._initArrayIfRequired(geometry, arrays_by_geometry_uuid, points.length, offset);\n\t\tif (do_update.value) {\n\t\t\tif (param.hasExpression() && param.expressionController && param.expressionController.entitiesDependent()) {\n\t\t\t\tawait param.expressionController.computeExpressionForPoints(points, (point, value) => {\n\t\t\t\t\ttmpArray[point.index()] = value;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlet point;\n\t\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\ttmpArray[point.index()] = param_value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn tmpArray;\n\t}\n\n\tprivate _initArrayIfRequired(\n\t\tgeometry: BufferGeometry,\n\t\tarrays_by_geometry_uuid: ValueArrayByName,\n\t\tpoints_count: number,\n\t\toffset: ComponentOffset\n\t) {\n\t\tconst uuid = geometry.uuid;\n\t\tconst current_array = arrays_by_geometry_uuid.get(uuid);\n\t\tif (current_array) {\n\t\t\t// only create new array if we need more point, or as soon as the length is different?\n\t\t\tif (current_array.length < points_count) {\n\t\t\t\tconst new_array = this._array_for_component(geometry, points_count, offset);\n\t\t\t\tarrays_by_geometry_uuid.set(uuid, new_array);\n\t\t\t\treturn new_array;\n\t\t\t} else {\n\t\t\t\treturn current_array;\n\t\t\t}\n\t\t} else {\n\t\t\tconst new_array = this._array_for_component(geometry, points_count, offset);\n\t\t\tarrays_by_geometry_uuid.set(uuid, new_array);\n\t\t\treturn new_array;\n\t\t}\n\t}\n\n\tprivate _array_for_component(geometry: BufferGeometry, pointsCount: number, offset: ComponentOffset) {\n\t\tconst new_array = new Array<number>(pointsCount);\n\t\tconst src_array = (geometry.getAttribute(POSITION_ATTRIB_NAME) as BufferAttribute).array;\n\t\tfor (let i = 0; i < new_array.length; i++) {\n\t\t\tnew_array[i] = src_array[i * 3 + offset];\n\t\t}\n\t\treturn new_array;\n\t}\n\n\tprivate _commitTmpValues(tmp_array: number[], targetArray: TypedArray, offset: number) {\n\t\tfor (let i = 0; i < tmp_array.length; i++) {\n\t\t\ttargetArray[i * 3 + offset] = tmp_array[i];\n\t\t}\n\t}\n}\n","/**\n * A subnet to create POST PROCESS nodes\n *\n */\nimport {Constructor, valueof} from '../../../types/GlobalTypes';\nimport {BaseNetworkSopNode} from './_BaseManager';\nimport {NetworkNodeType, NodeContext} from '../../poly/NodeContext';\nimport {PostNodeChildrenMap} from '../../poly/registers/nodes/Post';\nimport {BasePostProcessNodeType} from '../post/_Base';\nimport {DisplayNodeController} from '../utils/DisplayNodeController';\nimport {EffectComposerController, PostProcessNetworkParamsConfig} from '../post/utils/EffectComposerController';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\n\nexport class PostProcessNetworkSopNode extends BaseNetworkSopNode<PostProcessNetworkParamsConfig> {\n\toverride paramsConfig = new PostProcessNetworkParamsConfig();\n\tstatic override type() {\n\t\treturn NetworkNodeType.POST;\n\t}\n\n\treadonly effectsComposerController: EffectComposerController = new EffectComposerController(this);\n\tpublic override readonly displayNodeController: DisplayNodeController = new DisplayNodeController(\n\t\tthis,\n\t\tthis.effectsComposerController.displayNodeControllerCallbacks()\n\t);\n\n\tprotected override _childrenControllerContext = NodeContext.POST;\n\n\toverride createNode<S extends keyof PostNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): PostNodeChildrenMap[S];\n\toverride createNode<K extends valueof<PostNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<PostNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BasePostProcessNodeType[];\n\t}\n\toverride nodesByType<K extends keyof PostNodeChildrenMap>(type: K): PostNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as PostNodeChildrenMap[K][];\n\t}\n}\n","/**\n * Just like the Box, with rounded bevels.\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {RoundedBoxSopOperation} from '../../operations/sop/RoundedBox';\n\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nconst DEFAULT = RoundedBoxSopOperation.DEFAULT_PARAMS;\nclass RoundedBoxSopParamsConfig extends NodeParamsConfig {\n\t/** @param size of the box */\n\tsize = ParamConfig.FLOAT(DEFAULT.size);\n\t/** @param size of the box */\n\tsizes = ParamConfig.VECTOR3(DEFAULT.sizes);\n\t/** @param divisions count */\n\tdivisions = ParamConfig.INTEGER(DEFAULT.divisions, {\n\t\trange: [0, 10],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param bevel size */\n\tbevel = ParamConfig.FLOAT(DEFAULT.bevel, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param center of the box */\n\tcenter = ParamConfig.VECTOR3(DEFAULT.center);\n}\nconst ParamsConfig = new RoundedBoxSopParamsConfig();\n\nexport class RoundedBoxSopNode extends TypedSopNode<RoundedBoxSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.ROUNDED_BOX;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t\tthis.io.inputs.initInputsClonedState(RoundedBoxSopOperation.INPUT_CLONED_STATE);\n\t}\n\n\tprivate _operation: RoundedBoxSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new RoundedBoxSopOperation(this._scene, this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n}\n","import {SDFLoaderSync} from './SDFLoaderSync';\nimport {Poly} from '../../../../engine/Poly';\nimport {sanitizeUrl} from '../../../UrlHelper';\nimport {LIBRARY_INSTALL_HINT} from './../../../loader/common';\nimport type {ManifoldToplevel} from './SDFCommon';\nimport {Module} from './SDFCommon';\n\nlet _resolves: Resolve[] = [];\nlet _importStarted = false;\ntype Resolve = (value: ManifoldToplevel | PromiseLike<ManifoldToplevel>) => void;\nlet _manifold: ManifoldToplevel | undefined;\nexport class SDFLoader {\n\tstatic async core(): Promise<ManifoldToplevel> {\n\t\tif (_manifold) {\n\t\t\treturn _manifold;\n\t\t}\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (_importStarted) {\n\t\t\t\t_resolves.push(resolve);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_importStarted = true;\n\n\t\t\tconst onError = () => {\n\t\t\t\tconst message = `failed to load Manifold library. Make sure to install it to use the SDFBuilder node (${LIBRARY_INSTALL_HINT})`;\n\n\t\t\t\treject(new Error(message));\n\t\t\t};\n\n\t\t\tconst root = Poly.libs.root();\n\t\t\tconst ManifoldPath = Poly.libs.ManifoldPath();\n\t\t\tif (root || ManifoldPath) {\n\t\t\t\tconst version = Poly.version().replace(/\\./g, '-');\n\t\t\t\tconst wasmUrl = sanitizeUrl(`${root || ''}${ManifoldPath || ''}/manifold.wasm?v=${version}`);\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await fetch(wasmUrl, {method: 'HEAD'});\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tonError();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst manifold: ManifoldToplevel = await (Module as any)({\n\t\t\t\t\t\tlocateFile: () => wasmUrl,\n\t\t\t\t\t});\n\t\t\t\t\tmanifold.setup();\n\t\t\t\t\t_manifold = manifold;\n\n\t\t\t\t\tSDFLoaderSync.__setManifold(manifold);\n\n\t\t\t\t\tresolve(manifold);\n\t\t\t\t\tif (_resolves.length > 0) {\n\t\t\t\t\t\tfor (const _resolve of _resolves) {\n\t\t\t\t\t\t\t_resolve(manifold);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_resolves.length = 0;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\tonError();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BasePersistedConfig} from '../../../../utils/BasePersistedConfig';\nimport {SingleBodyFunctionData} from '../_Base';\nimport {SerializedVariable, SerializedVariableType} from '../_BaseJsPersistedConfigUtils';\nimport {SDFBuilderSopNode} from '../../../../sop/SDFBuilder';\nimport {NamedFunctionMap} from '../../../../../poly/registers/functions/All';\nimport {JsParamConfig, JsParamConfigJSON} from '../../utils/JsParamConfig';\nimport {ParamType} from '../../../../../poly/ParamType';\nimport {\n\tPersistedConfigBaseJsData,\n\tserializedVariablesFromFunctionData,\n\tvariablesByNameFromPersistedConfigData,\n\tfunctionsByNameFromPersistedConfigData,\n} from '../_BaseJsPersistedConfig';\n\nexport interface SDFPersistedConfigBaseJsData extends PersistedConfigBaseJsData {\n\tfunctionBody: string;\n\tvariableNames: string[];\n\tvariables: SerializedVariable<SerializedVariableType>[];\n\tfunctionNames: Array<keyof NamedFunctionMap>;\n\tserializedParamConfigs: JsParamConfigJSON<ParamType>[];\n}\n\nexport class SDFPersistedConfig extends BasePersistedConfig {\n\tconstructor(protected override node: SDFBuilderSopNode) {\n\t\tsuper(node);\n\t}\n\toverride async toData(): Promise<SDFPersistedConfigBaseJsData | undefined> {\n\t\t// we need to compute the node here it case it hasn't yet,\n\t\t// otherwise the .functionData() will be empty\n\t\tawait this.node.compile();\n\t\t//\n\t\tconst assemblerController = this.node.assemblerController();\n\t\tif (!assemblerController) {\n\t\t\treturn;\n\t\t}\n\t\tconst functionData = this.node.functionData();\n\t\tif (!functionData) {\n\t\t\treturn;\n\t\t}\n\t\tconst {functionBody, variableNames, functionNames, paramConfigs} = functionData;\n\n\t\tconst data: SDFPersistedConfigBaseJsData = {\n\t\t\tfunctionBody,\n\t\t\tvariableNames,\n\t\t\tvariables: serializedVariablesFromFunctionData(functionData),\n\t\t\tfunctionNames,\n\t\t\tserializedParamConfigs: paramConfigs.map((p) => p.toJSON()),\n\t\t};\n\t\treturn data;\n\t}\n\toverride load(data: SDFPersistedConfigBaseJsData) {\n\t\tconst assemblerController = this.node.assemblerController();\n\t\tif (assemblerController) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst {functionBody, variableNames, functionNames, serializedParamConfigs} = data;\n\n\t\tconst functionData: SingleBodyFunctionData = {\n\t\t\tfunctionBody: functionBody,\n\t\t\tvariableNames,\n\t\t\tvariablesByName: variablesByNameFromPersistedConfigData(data),\n\t\t\tfunctionNames,\n\t\t\tfunctionsByName: functionsByNameFromPersistedConfigData(data, this.node),\n\t\t\tparamConfigs: serializedParamConfigs.map((json) => JsParamConfig.fromJSON(json)),\n\t\t};\n\t\tthis.node.updateFromFunctionData(functionData);\n\t}\n}\n","/**\n * Creates a mesh from an SDF function.\n *\n *\n */\nimport {Constructor, Number3, valueof} from '../../../types/GlobalTypes';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {JsNodeChildrenMap} from '../../poly/registers/nodes/Js';\nimport {BaseJsNodeType} from '../js/_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {NodeCreateOptions} from '../utils/hierarchy/ChildrenController';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {AssemblerName} from '../../poly/registers/assemblers/_BaseRegister';\nimport {Poly} from '../../Poly';\nimport {JsAssemblerController} from '../js/code/Controller';\nimport {JsAssemblerSDF} from '../js/code/assemblers/sdf/SDF';\nimport {JsNodeFinder} from '../js/code/utils/NodeFinder';\nimport {Box3, Vector3} from 'three';\nimport {SingleBodyFunctionData} from '../js/code/assemblers/_Base';\nimport {RegisterableVariable} from '../js/code/assemblers/_BaseJsPersistedConfigUtils';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {SDFLoader} from '../../../core/geometry/modules/sdf/SDFLoader';\nimport {Box} from '../../../core/geometry/modules/sdf/SDFCommon';\nimport {TypedSopNode} from './_Base';\nimport {ModuleName} from '../../poly/registers/modules/Common';\nimport {SDFObject} from '../../../core/geometry/modules/sdf/SDFObject';\nimport {isArray, isBoolean, isNumberValid, isColor, isVector} from '../../../core/Type';\nimport {SDFPersistedConfig} from '../js/code/assemblers/sdf/SDFPersistedConfig';\nimport {ParamType} from '../../poly/ParamType';\nimport {JsParamConfig} from '../js/code/utils/JsParamConfig';\nconst _box3 = new Box3();\nconst box: Box = {min: [-1, -1, -1], max: [1, 1, 1]};\ntype SDFFunction = Function; //(p: any) => number;\n\nclass SDFBuilderSopParamsConfig extends NodeParamsConfig {\n\t/** @param stepSize */\n\tstepSize = ParamConfig.FLOAT(0.1, {\n\t\trange: [0.01, 1],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param level */\n\tlevel = ParamConfig.FLOAT(0, {\n\t\trange: [-1, 1],\n\t\trangeLocked: [false, false],\n\t});\n\t/** @param min bound */\n\tmin = ParamConfig.VECTOR3([-1, -1, -1]);\n\t/** @param max bound */\n\tmax = ParamConfig.VECTOR3([1, 1, 1]);\n\t/** @param linear Tolerance */\n\tfacetAngle = ParamConfig.FLOAT(45, {\n\t\trange: [0.01, 180],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param meshes color */\n\tmeshesColor = ParamConfig.COLOR([1, 1, 1]);\n\t/** @param wireframe */\n\twireframe = ParamConfig.BOOLEAN(false, {\n\t\t// we need the separator for spare params\n\t\tseparatorAfter: true,\n\t});\n}\nconst ParamsConfig = new SDFBuilderSopParamsConfig();\nexport class SDFBuilderSopNode extends TypedSopNode<SDFBuilderSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.SDF_BUILDER;\n\t}\n\toverride requiredModules() {\n\t\treturn [ModuleName.SDF];\n\t}\n\toverride readonly persisted_config: SDFPersistedConfig = new SDFPersistedConfig(this);\n\tassemblerController() {\n\t\treturn this._assemblerController;\n\t}\n\tpublic override usedAssembler(): Readonly<AssemblerName.JS_SDF> {\n\t\treturn AssemblerName.JS_SDF;\n\t}\n\tprotected _assemblerController = this._createAssemblerController();\n\tprivate _createAssemblerController(): JsAssemblerController<JsAssemblerSDF> | undefined {\n\t\treturn Poly.assemblersRegister.assembler(this, this.usedAssembler());\n\t}\n\n\t// static PARAM_CALLBACK_reset(node: ParticlesSystemGpuSopNode) {\n\t// \tnode.PARAM_CALLBACK_reset();\n\t// }\n\t// PARAM_CALLBACK_reset() {\n\t// \t// this.gpu_controller.reset_gpu_compute_and_set_dirty();\n\t// }\n\n\t// private _reset_material_if_dirty_bound = this._reset_material_if_dirty.bind(this);\n\tprotected override _childrenControllerContext = NodeContext.JS;\n\t// private _on_create_prepare_material_bound = this._on_create_prepare_material.bind(this);\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 1);\n\t\t// set to never at the moment\n\t\t// otherwise the input is cloned on every frame inside cook_main()\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\n\t\t// this.addPostDirtyHook('_reset_material_if_dirty', this._reset_material_if_dirty_bound);\n\n\t\t// this.lifecycle.onCreated(this.assembler_controller.on_create.bind(this.assembler_controller));\n\t\t// this.lifecycle.onCreated(this._on_create_prepare_material_bound);\n\t\t// this.children_controller?.init({dependent: false});\n\t}\n\n\toverride createNode<S extends keyof JsNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): JsNodeChildrenMap[S];\n\toverride createNode<K extends valueof<JsNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<JsNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseJsNodeType[];\n\t}\n\toverride nodesByType<K extends keyof JsNodeChildrenMap>(type: K): JsNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as JsNodeChildrenMap[K][];\n\t}\n\toverride childrenAllowed() {\n\t\tif (this.assemblerController()) {\n\t\t\treturn super.childrenAllowed();\n\t\t}\n\t\treturn false;\n\t}\n\toverride sceneReadonly() {\n\t\treturn this.assemblerController() == null;\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst manifold = await SDFLoader.core();\n\n\t\t// bbox\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tif (coreGroup) {\n\t\t\tcoreGroup.boundingBox(_box3);\n\t\t\t_box3.min.toArray(box.min);\n\t\t\t_box3.max.toArray(box.max);\n\t\t} else {\n\t\t\tthis.pv.min.toArray(box.min);\n\t\t\tthis.pv.max.toArray(box.max);\n\t\t}\n\n\t\t// compile\n\t\tthis.compileIfRequired();\n\n\t\t// eval\n\t\tconst _func = this._function;\n\t\tif (_func) {\n\t\t\tconst args = this.functionEvalArgsWithParamConfigs();\n\t\t\tconst convertedFunction = (p: Number3) => {\n\t\t\t\tthis._position.fromArray(p);\n\t\t\t\treturn -1 * _func(...args);\n\t\t\t};\n\t\t\tconst geometry = manifold.Manifold.levelSet(convertedFunction, box, this.pv.stepSize, this.pv.level);\n\t\t\tconst sdfObject = new SDFObject(geometry);\n\t\t\tconst results = sdfObject.toObject3D(this.pv);\n\t\t\tif (results) {\n\t\t\t\tif (isArray(results)) {\n\t\t\t\t\tthis.setObjects(results);\n\t\t\t\t} else {\n\t\t\t\t\tthis.setObjects([results]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.setObjects([]);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.setObjects([]);\n\t\t}\n\t}\n\tcompileIfRequired() {\n\t\tif (this.assemblerController()?.compileRequired()) {\n\t\t\tthis.compile();\n\t\t}\n\t}\n\tprivate _position = new Vector3();\n\tprivate _paramConfigs: JsParamConfig<ParamType>[] = [];\n\t// private _paramConfigNames: string[] = [];\n\tprivate _functionData: SingleBodyFunctionData | undefined;\n\tprivate _functionCreationArgs: string[] = [];\n\tprivate _functionEvalArgs: (Function | RegisterableVariable)[] = [];\n\tprivate _function: SDFFunction | undefined;\n\tfunctionData() {\n\t\treturn this._functionData;\n\t}\n\tcompile() {\n\t\tconst assemblerController = this.assemblerController();\n\t\tif (!assemblerController) {\n\t\t\treturn;\n\t\t}\n\t\tconst outputNodes: BaseJsNodeType[] = JsNodeFinder.findOutputNodes(this);\n\t\tif (outputNodes.length == 0) {\n\t\t\tthis.states.error.set('one output node is required');\n\t\t\treturn;\n\t\t}\n\t\tif (outputNodes.length > 1) {\n\t\t\tthis.states.error.set('only one output node allowed');\n\t\t\treturn;\n\t\t}\n\t\tconst outputNode = outputNodes[0];\n\t\tif (outputNode) {\n\t\t\tconst paramNodes = JsNodeFinder.findParamGeneratingNodes(this);\n\t\t\tconst rootNodes = outputNodes.concat(paramNodes);\n\t\t\tassemblerController.assembler.set_root_nodes(rootNodes);\n\n\t\t\t// main compilation\n\t\t\tassemblerController.assembler.updateFunction();\n\n\t\t\t// get functionData\n\t\t\tconst functionData = assemblerController.assembler.functionData();\n\t\t\tif (!functionData) {\n\t\t\t\tthis.states.error.set('failed to compile ');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.updateFromFunctionData(functionData);\n\t\t}\n\n\t\tassemblerController.post_compile();\n\t}\n\tupdateFromFunctionData(functionData: SingleBodyFunctionData) {\n\t\tthis._functionData = functionData;\n\n\t\tconst {functionBody, variableNames, variablesByName, functionNames, functionsByName, paramConfigs} =\n\t\t\tthis._functionData;\n\n\t\tconst wrappedBody = `\n\t\ttry {\n\t\t\t${functionBody}\n\t\t} catch(e) {\n\t\t\t_setErrorFromError(e)\n\t\t\treturn 0;\n\t\t}`;\n\t\tconst _setErrorFromError = (e: Error) => {\n\t\t\tthis.states.error.set(e.message);\n\t\t};\n\t\tconst variables: RegisterableVariable[] = [];\n\t\tconst functions: Function[] = [];\n\t\tfor (const variableName of variableNames) {\n\t\t\tconst variable = variablesByName[variableName];\n\t\t\tvariables.push(variable);\n\t\t}\n\t\tfor (const functionName of functionNames) {\n\t\t\tconst _func = functionsByName[functionName];\n\t\t\tfunctions.push(_func);\n\t\t}\n\t\tthis._paramConfigs = [...paramConfigs]; //[...paramConfigs];\n\t\tconst paramConfigNames: string[] = paramConfigs.map((pc) => pc.uniformName());\n\n\t\tparamConfigs.forEach((p) => p.applyToNode(this));\n\n\t\tthis._functionCreationArgs = [\n\t\t\t'position',\n\t\t\t'_setErrorFromError',\n\t\t\t...variableNames,\n\t\t\t...functionNames,\n\t\t\t...paramConfigNames,\n\t\t\twrappedBody,\n\t\t];\n\t\tthis._functionEvalArgs = [\n\t\t\tthis._position,\n\t\t\t_setErrorFromError,\n\t\t\t...variables,\n\t\t\t...functions,\n\t\t\t// paramConfigs are added dynamically during cook\n\t\t];\n\t\ttry {\n\t\t\tthis._function = new Function(...this._functionCreationArgs) as SDFFunction;\n\t\t} catch (e) {\n\t\t\tconsole.warn(e);\n\t\t\tthis.states.error.set('failed to compile');\n\t\t}\n\t}\n\n\tfunctionEvalArgsWithParamConfigs() {\n\t\tconst list: Array<Function | RegisterableVariable | number | boolean> = [...this._functionEvalArgs];\n\t\tfor (const paramConfig of this._paramConfigs) {\n\t\t\tconst paramName = paramConfig.name();\n\t\t\tconst spareParam = this.params.get(paramName);\n\t\t\tif (spareParam && spareParam.value != null) {\n\t\t\t\tif (\n\t\t\t\t\tisBoolean(spareParam.value) ||\n\t\t\t\t\tisNumberValid(spareParam.value) ||\n\t\t\t\t\tisColor(spareParam.value) ||\n\t\t\t\t\tisVector(spareParam.value)\n\t\t\t\t) {\n\t\t\t\t\tlist.push(spareParam.value);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`spareParam not found but type not yet copied to function args:'${paramName}'`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.warn(`spareParam not found:'${paramName}'`);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}\n}\n","/**\n * Scatter points onto a geometry\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\n\nimport {ScatterSopOperation} from '../../operations/sop/Scatter';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nconst DEFAULT = ScatterSopOperation.DEFAULT_PARAMS;\nclass ScatterSopParamsConfig extends NodeParamsConfig {\n\t/** @param number of points to create */\n\tpointsCount = ParamConfig.INTEGER(DEFAULT.pointsCount, {\n\t\trange: [0, 1000],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param seed */\n\tseed = ParamConfig.INTEGER(DEFAULT.seed, {\n\t\trange: [0, 100],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param attribute which will influence the distribution of points */\n\tuseWeightAttribute = ParamConfig.BOOLEAN(DEFAULT.useWeightAttribute);\n\t/** @param attribute which will influence the distribution of points */\n\tweightAttribute = ParamConfig.STRING(DEFAULT.weightAttribute, {\n\t\tvisibleIf: {useWeightAttribute: 1},\n\t});\n\t/** @param toggle on to transfer attribute from the input geometry to the created points */\n\ttransferAttributes = ParamConfig.BOOLEAN(DEFAULT.transferAttributes);\n\t/** @param names of the attributes to transfer */\n\tattributesToTransfer = ParamConfig.STRING(DEFAULT.attributesToTransfer, {\n\t\tvisibleIf: {transferAttributes: 1},\n\t});\n\t/** @param add an id attribute, starting at 0, incrementing by 1 for each point (0,1,2,3...) */\n\taddIdAttribute = ParamConfig.BOOLEAN(DEFAULT.addIdAttribute);\n\t/** @param add an idn attribute, which is the id normalized between 0 and 1 */\n\taddIdnAttribute = ParamConfig.BOOLEAN(DEFAULT.addIdnAttribute);\n}\nconst ParamsConfig = new ScatterSopParamsConfig();\n\nexport class ScatterSopNode extends TypedSopNode<ScatterSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.SCATTER;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\tprivate _operation: ScatterSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new ScatterSopOperation(this.scene(), this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n}\n","/**\n * Creates a spot light.\n *\n * @remarks\n * This is very similar to the [object level SpotLight](https://polygonjs.com/docs/nodes/obj/SpotLight), but can be more useful if you want to instanciate it or process it using other SOP nodes.\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\n\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {SpotLightParamConfig} from '../../../core/lights/SpotLight';\nimport {SpotLightSopOperation} from '../../operations/sop/SpotLight';\nimport {LightType} from '../../poly/registers/nodes/types/Light';\nclass SpotLightSopParamsConfig extends SpotLightParamConfig(NodeParamsConfig) {}\nconst ParamsConfig = new SpotLightSopParamsConfig();\n\nexport class SpotLightSopNode extends TypedSopNode<SpotLightSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn LightType.SPOT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0);\n\t}\n\n\tprivate _operation: SpotLightSopOperation | undefined;\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new SpotLightSopOperation(this._scene, this.states, this);\n\t\tconst coreGroup = await this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n}\n","/**\n * A subnet to create SOP nodes\n *\n */\nimport {SubnetSopNodeLike} from './utils/subnet/SopSubnetChildrenDisplayController';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {NetworkNodeType} from '../../poly/NodeContext';\nclass SubnetSopParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new SubnetSopParamsConfig();\n\nexport class SubnetSopNode extends SubnetSopNodeLike<SubnetSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn NetworkNodeType.SUBNET;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 4);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n}\n","/**\n * Sets which node is used as the output of a parent subnet node.\n *\n * @remarks\n * Can only be created inside a subnet SOP.\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {NetworkChildNodeType} from '../../poly/NodeContext';\nclass SopSubnetOutputSopParamsConfig extends NodeParamsConfig {}\nconst ParamsConfig = new SopSubnetOutputSopParamsConfig();\n\nexport class SubnetOutputSopNode extends TypedSopNode<SopSubnetOutputSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type(): Readonly<NetworkChildNodeType.OUTPUT> {\n\t\treturn NetworkChildNodeType.OUTPUT;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.outputs.setHasNoOutput();\n\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis.setCoreGroup(inputCoreGroups[0]);\n\t}\n}\n","/**\n * Allows to switch between different inputs.\n *\n *\n *\n */\n\nimport {TypedSopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {BaseNodeType} from '../_Base';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {NodeEvent} from '../../poly/NodeEvent';\n\nconst DEFAULT_INPUTS_COUNT = 4;\nclass SwitchSopParamsConfig extends NodeParamsConfig {\n\t/** @param sets which input is used */\n\tinput = ParamConfig.INTEGER(0, {\n\t\trange: [0, 3],\n\t\trangeLocked: [true, false],\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tSwitchSopNode.PARAM_CALLBACK_setInputsEvaluation(node as SwitchSopNode);\n\t\t},\n\t});\n\t/** @param number of inputs that this node can merge geometries from */\n\tinputsCount = ParamConfig.INTEGER(DEFAULT_INPUTS_COUNT, {\n\t\trange: [1, 32],\n\t\trangeLocked: [true, false],\n\t\tseparatorBefore: true,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tSwitchSopNode.PARAM_CALLBACK_setInputsCount(node as SwitchSopNode);\n\t\t},\n\t});\n}\nconst ParamsConfig = new SwitchSopParamsConfig();\n\nexport class SwitchSopNode extends TypedSopNode<SwitchSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.SWITCH;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(0, 4);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t\t// this.uiData.set_icon('code-branch');\n\n\t\tthis.io.inputs.onEnsureListenToSingleInputIndexUpdated(async () => {\n\t\t\tawait this._callbackUpdateInputsEvaluation();\n\t\t});\n\t\tthis.params.onParamsCreated('update inputs', () => {\n\t\t\tthis._callbackUpdateInputsCount();\n\t\t});\n\t}\n\n\toverride async cook() {\n\t\tconst inputIndex = this.pv.input;\n\t\tif (!this.io.inputs.hasInput(inputIndex)) {\n\t\t\tthis.states.error.set(`no input ${inputIndex}`);\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tconst container = await this.containerController.requestInputContainer(inputIndex);\n\t\tif (!container) {\n\t\t\tthis.states.error.set(`invalid input ${inputIndex}`);\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tconst coreGroup = container.coreContent();\n\t\tif (!coreGroup) {\n\t\t\tthis.states.error.set(`invalid input ${inputIndex}`);\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setObjects(coreGroup.allObjects());\n\t}\n\n\tprivate async _callbackUpdateInputsEvaluation() {\n\t\tif (this.p.input.isDirty()) {\n\t\t\tawait this.p.input.compute();\n\t\t}\n\n\t\tthis.io.inputs.listenToSingleInputIndex(this.pv.input);\n\t}\n\tstatic PARAM_CALLBACK_setInputsEvaluation(node: SwitchSopNode) {\n\t\tnode._callbackUpdateInputsEvaluation();\n\t}\n\tprivate _callbackUpdateInputsCount() {\n\t\tthis.io.inputs.setCount(1, this.pv.inputsCount);\n\t\tthis.emit(NodeEvent.INPUTS_UPDATED);\n\t}\n\tstatic PARAM_CALLBACK_setInputsCount(node: SwitchSopNode) {\n\t\tnode._callbackUpdateInputsCount();\n\t}\n}\n","import {Box3, BufferGeometry} from 'three';\nimport {TypeAssert} from '../../../engine/poly/Assert';\n\nexport enum TextSopJustifiyMode {\n\tLEFT = 'left',\n\tRIGHT = 'right',\n\tCENTER = 'center',\n}\nexport const TEXT_SOP_JUSTIFY_MODES: Array<TextSopJustifiyMode> = [\n\tTextSopJustifiyMode.LEFT,\n\tTextSopJustifiyMode.RIGHT,\n\tTextSopJustifiyMode.CENTER,\n];\n\nexport interface TextJustifiyParams {\n\tjustifyMode: TextSopJustifiyMode;\n}\n\nexport function applyJustifyModeToGeometries(\n\tgeometries: Array<BufferGeometry | undefined>,\n\tparams: TextJustifiyParams\n) {\n\tif (geometries.length == 0) {\n\t\treturn;\n\t}\n\t// let minX = 1;\n\t// let maxX = -1;\n\t// for (let geometry of geometries) {\n\t// \tgeometry.computeBoundingBox();\n\t// \tconst bbox = geometry.boundingBox;\n\t// \tif (bbox) {\n\t// \t\tminX = Math.min(minX, bbox.min.x);\n\t// \t\tmaxX = Math.max(maxX, bbox.max.x);\n\t// \t}\n\t// }\n\tlet totalBoundingBox: Box3 | null = null;\n\tfor (const geometry of geometries) {\n\t\tif (!geometry) continue;\n\t\tgeometry.computeBoundingBox();\n\t\tif (geometry.boundingBox) {\n\t\t\tif (totalBoundingBox == null) {\n\t\t\t\ttotalBoundingBox = geometry.boundingBox;\n\t\t\t} else {\n\t\t\t\ttotalBoundingBox.union(geometry.boundingBox);\n\t\t\t}\n\t\t}\n\t}\n\tif (!totalBoundingBox) {\n\t\treturn;\n\t}\n\n\tconst justifyMode = params.justifyMode;\n\t// for (let geometry of geometries) {\n\tapplyJustifyModeToGeometry(geometries, justifyMode, totalBoundingBox);\n\t// }\n}\n\nfunction applyJustifyModeToGeometry(\n\tgeometries: Array<BufferGeometry | undefined>,\n\tjustifyMode: TextSopJustifiyMode,\n\ttotalBoundingBox: Box3\n) {\n\tswitch (justifyMode) {\n\t\tcase TextSopJustifiyMode.LEFT: {\n\t\t\t// do nothing\n\t\t\treturn;\n\t\t}\n\t\tcase TextSopJustifiyMode.CENTER: {\n\t\t\tconst currentCenter = 0.5 * (totalBoundingBox.min.x + totalBoundingBox.max.x);\n\t\t\tfor (const geometry of geometries) {\n\t\t\t\tgeometry?.translate(-currentCenter, 0, 0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase TextSopJustifiyMode.RIGHT: {\n\t\t\tconst currentRight = totalBoundingBox.max.x;\n\t\t\tfor (const geometry of geometries) {\n\t\t\t\tgeometry?.translate(-currentRight, 0, 0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(justifyMode);\n}\n","import {ExtrudeGeometry, ExtrudeGeometryOptions, Shape} from 'three';\nimport {mergeGeometries} from 'three/examples/jsm/utils/BufferGeometryUtils';\n\nexport interface BevelParams {\n\tbevelEnabled: boolean;\n\tbevelThickness: number;\n\tbevelSize: number;\n\tbevelOffset: number;\n\tbevelSegments: number;\n}\n\ninterface CommonParams extends BevelParams {\n\textrude: number;\n\tcurveSegments: number;\n}\n\ninterface TextMeshesParams extends CommonParams {\n\tshapes: Array<Array<Shape>>;\n}\ninterface TextMeshParams extends CommonParams {\n\tshapes: Shape[];\n}\n\nexport function createGeometriesFromTypeMesh(params: TextMeshesParams) {\n\treturn params.shapes?.map((shapes) => createGeometryFromTypeMesh({...params, shapes}));\n}\nfunction createGeometryFromTypeMesh(params: TextMeshParams) {\n\tconst extrudeParams: ExtrudeGeometryOptions = {\n\t\tcurveSegments: params.curveSegments,\n\t\tdepth: params.extrude,\n\t\tbevelEnabled: params.bevelEnabled,\n\t\tbevelThickness: params.bevelThickness,\n\t\tbevelSize: params.bevelSize,\n\t\tbevelOffset: params.bevelOffset,\n\t\tbevelSegments: params.bevelSegments,\n\t};\n\tconst geometries = params.shapes.map((s) => new ExtrudeGeometry(s, extrudeParams));\n\tif (geometries == null || geometries.length == 0) {\n\t\treturn;\n\t}\n\treturn mergeGeometries(geometries);\n}\n","import {Font, FontGenerateShapesOptions} from '../../loader/font/Font';\n\nexport interface TextShapesParams extends FontGenerateShapesOptions {\n\ttext: string;\n\tfont: Font;\n}\n\nexport function getShapes(params: TextShapesParams) {\n\treturn params.font.generateShapes(params.text, params);\n}\n","import {Shape, Path, BufferGeometry} from 'three';\nimport {CoreLoaderFont} from '../../loader/font/CoreFontLoader';\nimport {SVGLoader} from 'three/examples/jsm/loaders/SVGLoader';\nimport {mergeGeometries} from 'three/examples/jsm/utils/BufferGeometryUtils';\n\ninterface TextStrokesParams {\n\tshapes?: Array<Array<Shape | Path>>;\n\tstrokeWidth: number;\n}\ninterface TextStrokeParams {\n\tshapes?: Array<Shape | Path>;\n\tstrokeWidth: number;\n\tloader: typeof SVGLoader;\n}\nexport async function createGeometriesFromTypeStroke(params: TextStrokesParams) {\n\tconst loader = await CoreLoaderFont.loadSVGLoader();\n\tif (!loader) {\n\t\treturn;\n\t}\n\treturn params.shapes?.map((shape) =>\n\t\tcreateGeometryFromTypeStroke({\n\t\t\tloader,\n\t\t\tshapes: shape,\n\t\t\tstrokeWidth: params.strokeWidth,\n\t\t})\n\t);\n}\nfunction createGeometryFromTypeStroke(params: TextStrokeParams) {\n\tif (!params.shapes) {\n\t\treturn;\n\t}\n\t// TODO: typescript: correct definition for last 3 optional args\n\tvar style = params.loader.getStrokeStyle(params.strokeWidth, 'white', 'miter', 'butt', 4);\n\tconst geometries: BufferGeometry[] = [];\n\n\tfor (let i = 0; i < params.shapes.length; i++) {\n\t\tconst shape = params.shapes[i];\n\t\tconst points = shape.getPoints(); //.map((point) => new Vector3(point.x, point.y, 0));\n\t\tconst arcDivisions = 12;\n\t\tconst minDistance = 0.001;\n\t\tconst geometry = params.loader.pointsToStroke(points, style, arcDivisions, minDistance);\n\t\tgeometries.push(geometry);\n\t}\n\tif (geometries.length > 0) {\n\t\tconst mergedGeometry = mergeGeometries(geometries);\n\t\treturn mergedGeometry;\n\t}\n}\n","import {Shape, Path} from 'three';\n\nexport function shapesFromFont(shapes?: Array<Array<Shape>>) {\n\t// const shapesPerLetter: Array<Array<Shape | Path>> = [];\n\t// if (shapes) {\n\t// \tfor (let i = 0; i < shapes.length; i++) {\n\t// \t\tconst shape = shapes[i];\n\t// \t\tconst shapesForLetter: Array<Shape | Path> = [shape];\n\t// \t\tconst holeShapes: Path[] = [];\n\t// \t\tif (shape.holes && shape.holes.length > 0) {\n\t// \t\t\tfor (let j = 0; j < shape.holes.length; j++) {\n\t// \t\t\t\tconst hole = shape.holes[j];\n\t// \t\t\t\tholeShapes.push(hole);\n\t// \t\t\t}\n\t// \t\t}\n\t// \t\tshapesForLetter.push(...holeShapes);\n\t// \t\tshapesPerLetter.push(shapesForLetter);\n\t// \t}\n\t// \t// shapes.push.apply(shapes, holeShapes as Shape[]);\n\t// }\n\t// return shapesPerLetter;\n\treturn shapes?.map((shapes) => _shapesForLetter(shapes));\n}\nfunction _shapesForLetter(shapes: Array<Shape>) {\n\tconst newShapes: Array<Shape | Path> = [...shapes];\n\tif (shapes) {\n\t\tfor (let i = 0; i < shapes.length; i++) {\n\t\t\tconst shape = shapes[i];\n\t\t\tconst holeShapes: Path[] = [];\n\t\t\tif (shape.holes && shape.holes.length > 0) {\n\t\t\t\tfor (let j = 0; j < shape.holes.length; j++) {\n\t\t\t\t\tconst hole = shape.holes[j];\n\t\t\t\t\tholeShapes.push(hole);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnewShapes.push(...holeShapes);\n\t\t\t// shapesPerLetter.push(shapesForLetter);\n\t\t}\n\t\t// shapes.push.apply(shapes, holeShapes as Shape[]);\n\t}\n\treturn newShapes;\n}\n","import {Shape, Path, BufferGeometry, Float32BufferAttribute} from 'three';\n\ninterface TextLinesParams {\n\tcurveSegments: number;\n\tshapes?: Array<Array<Shape | Path>>;\n}\n\nexport function createGeometriesFromTypeLine(params: TextLinesParams) {\n\treturn params.shapes?.map((shapes) => createGeometryFromTypeLine(params.curveSegments, shapes));\n}\nfunction createGeometryFromTypeLine(curveSegments: number, shapes?: Array<Shape | Path>) {\n\tif (!shapes) {\n\t\treturn;\n\t}\n\tconst positions = [];\n\tconst indices = [];\n\tlet currentIndex = 0;\n\n\tfor (let i = 0; i < shapes.length; i++) {\n\t\tconst shape = shapes[i];\n\t\tconst points = shape.getPoints(curveSegments);\n\t\tfor (let j = 0; j < points.length; j++) {\n\t\t\tconst point = points[j];\n\t\t\tpositions.push(point.x);\n\t\t\tpositions.push(point.y);\n\t\t\tpositions.push(0);\n\t\t\tindices.push(currentIndex);\n\t\t\tif (j > 0 && j < points.length - 1) {\n\t\t\t\tindices.push(currentIndex);\n\t\t\t}\n\t\t\tcurrentIndex += 1;\n\t\t}\n\t}\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\tgeometry.setIndex(indices);\n\treturn geometry;\n}\n","export enum TextType {\n\tMESH = 'mesh',\n\tFLAT = 'flat',\n\tLINE = 'line',\n\tSTROKE = 'stroke',\n}\nexport const TEXT_TYPES: Array<TextType> = [TextType.MESH, TextType.FLAT, TextType.LINE, TextType.STROKE];\n","import {BevelParams, createGeometriesFromTypeMesh} from './TextMesh';\nimport {getShapes, TextShapesParams} from './TextShapes';\nimport {createGeometriesFromTypeFlat} from './TextFlat';\nimport {createGeometriesFromTypeStroke} from './TextStroke';\nimport {shapesFromFont} from './TextShapesFromFont';\nimport {TypeAssert} from '../../../engine/poly/Assert';\nimport {createGeometriesFromTypeLine} from './TextLine';\nimport {TextType} from './TextType';\nimport {BufferGeometry} from 'three';\nimport {Font} from '../../loader/font/Font';\n\ninterface TextBuildGeometriesParams extends BevelParams, TextShapesParams {\n\ttextType: TextType;\n\tfont: Font;\n\textrude: number;\n\tcurveSegments: number;\n\tstrokeWidth: number;\n}\n\nexport async function textBuildGeometries(\n\tparams: TextBuildGeometriesParams\n): Promise<Array<BufferGeometry | undefined> | undefined> {\n\tconst {textType} = params;\n\t// if (line.trim().length == 0) {\n\t// \t// currently not creating a geometry if the line is empty\n\t// \t// but we should create something that tells us to offset the next geometry\n\t// \treturn;\n\t// }\n\tconst shapes = getShapes(params);\n\n\tswitch (textType) {\n\t\tcase TextType.MESH:\n\t\t\treturn createGeometriesFromTypeMesh({...params, shapes});\n\t\tcase TextType.FLAT:\n\t\t\treturn createGeometriesFromTypeFlat({shapes});\n\t\tcase TextType.LINE:\n\t\t\treturn createGeometriesFromTypeLine({...params, shapes: shapesFromFont(shapes)});\n\t\tcase TextType.STROKE:\n\t\t\treturn await createGeometriesFromTypeStroke({\n\t\t\t\tshapes: shapesFromFont(shapes),\n\t\t\t\tstrokeWidth: params.strokeWidth,\n\t\t\t});\n\t}\n\tTypeAssert.unreachable(textType);\n}\n","import {Box3, BufferGeometry} from 'three';\n\nexport interface TextLineHeightParams {\n\tlineHeight: number;\n}\n\nexport function applyTextLineHeight(geometries: Array<BufferGeometry | undefined>, params: TextLineHeightParams) {\n\tif (geometries.length == 0) {\n\t\treturn;\n\t}\n\tif (params.lineHeight == 1) {\n\t\treturn;\n\t}\n\n\tlet totalBoundingBox: Box3 | null = null;\n\tfor (const geometry of geometries) {\n\t\tif (!geometry) continue;\n\t\tgeometry.computeBoundingBox();\n\t\tif (geometry.boundingBox) {\n\t\t\tif (totalBoundingBox == null) {\n\t\t\t\ttotalBoundingBox = geometry.boundingBox;\n\t\t\t} else {\n\t\t\t\ttotalBoundingBox.union(geometry.boundingBox);\n\t\t\t}\n\t\t}\n\t}\n\tif (!totalBoundingBox) {\n\t\treturn;\n\t}\n\tconst expectedMin = totalBoundingBox.min.y * params.lineHeight;\n\tconst delta = expectedMin - totalBoundingBox.min.y;\n\tfor (const geometry of geometries) {\n\t\tgeometry?.translate(0, delta, 0);\n\t}\n}\n","import {BufferGeometry, Object3D} from 'three';\nimport {arrayCompact} from '../../ArrayUtils';\nimport {ObjectType} from '../Constant';\nimport {ThreejsCoreObject} from '../modules/three/ThreejsCoreObject';\nimport {isBooleanTrue} from '../../Type';\nimport {mergeGeometries} from 'three/examples/jsm/utils/BufferGeometryUtils';\nimport {TransformResetSopOperation} from '../../../engine/operations/sop/TransformReset';\nimport {TypedSopNode} from '../../../engine/nodes/sop/_Base';\nimport {applyJustifyModeToGeometries, TextJustifiyParams} from './TextJustify';\nimport {applyTextLineHeight, TextLineHeightParams} from './TextLineHeight';\nimport {TextType} from './TextType';\n\ninterface TextMergeAllLettersOptions extends TextJustifiyParams, TextLineHeightParams {\n\tgeometries: Array<BufferGeometry | undefined>;\n\ttextType: TextType;\n\tsplitPerLetter: boolean;\n\tkeepEmptyGeometries: boolean;\n\ttext: string;\n}\n\nexport function textMergeLetters(params: TextMergeAllLettersOptions) {\n\tconst geometriesByLine = _geometriesByLine(params);\n\n\tfor (const geometriesForLine of geometriesByLine) {\n\t\tapplyJustifyModeToGeometries(geometriesForLine, params);\n\t\tapplyTextLineHeight(geometriesForLine, params);\n\t}\n\tconst allGeometries = geometriesByLine.flat();\n\tconst objects = _mergeOrSplit({...params, geometries: allGeometries});\n\tif (objects) {\n\t\tconst compactObjects: Object3D[] = [];\n\t\treturn arrayCompact(objects, compactObjects);\n\t}\n}\n\nfunction _mergeOrSplit(params: TextMergeAllLettersOptions) {\n\tconst objectType = params.textType == TextType.LINE ? ObjectType.LINE_SEGMENTS : ObjectType.MESH;\n\tif (isBooleanTrue(params.splitPerLetter)) {\n\t\tconst chars = Array.from(params.text);\n\t\tlet characterIndex = 0;\n\t\tlet lineIndex = 0;\n\t\tfunction _createObject(geo?: BufferGeometry) {\n\t\t\tlet character = chars[characterIndex];\n\t\t\tif (character === '\\n') {\n\t\t\t\tlineIndex++;\n\t\t\t\tcharacterIndex++;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (character == ' ' && params.keepEmptyGeometries == false) {\n\t\t\t\tcharacterIndex++;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// if (geo == null) {\n\t\t\t// \tcharacterIndex++;\n\t\t\t// \treturn;\n\t\t\t// }\n\n\t\t\tconst object = TypedSopNode.createObject(geo || new BufferGeometry(), objectType); //this.createObject(geo, objectType);\n\t\t\tTransformResetSopOperation.centerObject(object, {applyMatrixToObject: true});\n\t\t\tconst coreObject = new ThreejsCoreObject(object, characterIndex);\n\t\t\tcoreObject.addAttribute('character', character);\n\t\t\tobject.name = character;\n\t\t\tcoreObject.addAttribute('characterId', characterIndex);\n\t\t\tcoreObject.addAttribute('lineId', lineIndex);\n\t\t\tcharacterIndex++;\n\t\t\treturn object;\n\t\t}\n\t\tconst objects: Object3D[] = [];\n\t\tfor (let i = 0; i < params.geometries.length; i++) {\n\t\t\tconst object = _createObject(params.geometries[i]);\n\t\t\tif (object) {\n\t\t\t\tobjects.push(object);\n\t\t\t}\n\t\t}\n\t\treturn objects;\n\t} else {\n\t\ttry {\n\t\t\tconst compactGeometries: BufferGeometry[] = [];\n\t\t\tarrayCompact(params.geometries, compactGeometries);\n\t\t\tif (compactGeometries.length > 0) {\n\t\t\t\tconst mergedGeometry = mergeGeometries(compactGeometries);\n\t\t\t\treturn [TypedSopNode.createObject(mergedGeometry, objectType)];\n\t\t\t}\n\t\t} catch (err) {\n\t\t\treturn;\n\t\t}\n\t}\n}\n\ninterface GeometriesByLineParams {\n\tgeometries: Array<BufferGeometry | undefined>;\n\ttext: string;\n}\nfunction _geometriesByLine(params: GeometriesByLineParams): Array<Array<BufferGeometry | undefined>> {\n\tconst list: Array<Array<BufferGeometry | undefined>> = [];\n\tconst chars = Array.from(params.text);\n\tlet characterIndex = 0;\n\tlet lineIndex = 0;\n\tfor (const geometry of params.geometries) {\n\t\tlet character = chars[characterIndex];\n\t\tif (character === '\\n') {\n\t\t\tlineIndex++;\n\t\t}\n\t\tlist[lineIndex] = list[lineIndex] || [];\n\t\tlist[lineIndex].push(geometry);\n\t\tcharacterIndex++;\n\t}\n\treturn list;\n}\n","/**\n * Creates text\n *\n *\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CoreLoaderFont} from '../../../core/loader/font/CoreFontLoader';\nimport {Font} from '../../../core/loader/font/Font';\nimport {Poly} from '../../Poly';\nimport {DEFAULT_FONT_URL_JSON} from '../../../core/Assets';\nimport {TextSopJustifiyMode, TEXT_SOP_JUSTIFY_MODES} from '../../../core/geometry/text/TextJustify';\nimport {textBuildGeometries} from '../../../core/geometry/text/TextGeometries';\nimport {TextType, TEXT_TYPES} from '../../../core/geometry/text/TextType';\nimport {textMergeLetters} from '../../../core/geometry/text/TextMergeLetters';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT} from '../../../core/loader/FileExtensionRegister';\nimport {NodeContext} from '../../poly/NodeContext';\n\n// function isGeometryValid(geometry: BufferGeometry) {\n// \treturn geometry.getAttribute(Attribute.POSITION).count != 0;\n// }\n\nconst GENERATION_ERROR_MESSAGE = `failed to generate geometry. Try to remove some characters`;\nclass TextSopParamsConfig extends NodeParamsConfig {\n\t/** @param font used */\n\tfont = ParamConfig.STRING(DEFAULT_FONT_URL_JSON, {\n\t\tfileBrowse: {extensions: EXTENSIONS_BY_NODE_TYPE_BY_CONTEXT[NodeContext.SOP][SopType.TEXT]},\n\t});\n\t/** @param text created */\n\ttext = ParamConfig.STRING('polygonjs', {\n\t\tmultiline: true,\n\t});\n\t/** @param type of geometry created */\n\ttype = ParamConfig.INTEGER(0, {\n\t\tmenu: {\n\t\t\tentries: TEXT_TYPES.map((type, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: type,\n\t\t\t\t\tvalue: i,\n\t\t\t\t};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param font size */\n\tsize = ParamConfig.FLOAT(1, {\n\t\trange: [0, 1],\n\t\trangeLocked: [true, false],\n\t});\n\t/** @param extrude depth */\n\textrude = ParamConfig.FLOAT(0.1, {\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t},\n\t});\n\t/** @param segments count */\n\tsegments = ParamConfig.INTEGER(1, {\n\t\trange: [1, 20],\n\t\trangeLocked: [true, false],\n\t\t// visibleIf: {\n\t\t// \ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t// \ttype: TEXT_TYPES.indexOf(TextType.LINE),\n\t\t// },\n\t});\n\t/** @param bevelEnabled */\n\tbevelEnabled = ParamConfig.BOOLEAN(false, {\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t},\n\t});\n\t/** @param bevelThickness */\n\tbevelThickness = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t\tbevelEnabled: true,\n\t\t},\n\t});\n\t/** @param bevelSize */\n\tbevelSize = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t\tbevelEnabled: true,\n\t\t},\n\t});\n\t/** @param bevelOffset */\n\tbevelOffset = ParamConfig.FLOAT(0, {\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t\tbevelEnabled: true,\n\t\t},\n\t});\n\t/** @param bevelSegments */\n\tbevelSegments = ParamConfig.INTEGER(2, {\n\t\trange: [1, 6],\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.MESH),\n\t\t\tbevelEnabled: true,\n\t\t},\n\t});\n\t/** @param stroke width */\n\tstrokeWidth = ParamConfig.FLOAT(0.02, {\n\t\tvisibleIf: {\n\t\t\ttype: TEXT_TYPES.indexOf(TextType.STROKE),\n\t\t},\n\t});\n\t/** @param line height */\n\tlineHeight = ParamConfig.FLOAT(1, {\n\t\trange: [0, 2],\n\t\trangeLocked: [false, false],\n\t});\n\t/** @param create one object per letter */\n\tsplitPerLetter = ParamConfig.BOOLEAN(0);\n\t/** @param when creating one object per letter, define if the characters like space create an object */\n\tkeepEmptyGeometries = ParamConfig.BOOLEAN(0, {visibleIf: {splitPerLetter: 1}});\n\t/** @param justify mode */\n\tjustifyMode = ParamConfig.INTEGER(TEXT_SOP_JUSTIFY_MODES.indexOf(TextSopJustifiyMode.LEFT), {\n\t\tmenu: {\n\t\t\tentries: TEXT_SOP_JUSTIFY_MODES.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t/** @param open advanced options */\n\ttadvanced = ParamConfig.BOOLEAN(0);\n\t/** @param is counter clock wise: defines the vertex order when parsing the font */\n\tisCCW = ParamConfig.BOOLEAN(0, {\n\t\tvisibleIf: {tadvanced: true},\n\t});\n\t/** @param defines if holes should be found when parsing the font */\n\t// noHoles = ParamConfig.BOOLEAN(0, {\n\t// \tvisibleIf: {tadvanced: true},\n\t// });\n}\n\nconst ParamsConfig = new TextSopParamsConfig();\n\nexport class TextSopNode extends TypedSopNode<TextSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.TEXT;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tPoly.blobs.clearBlobsForNode(this);\n\t}\n\n\tsetTextType(type: TextType) {\n\t\tthis.p.type.set(TEXT_TYPES.indexOf(type));\n\t}\n\n\tprivate _loadedFonts: Map<string, Font> = new Map();\n\n\toverride async cook(): Promise<void> {\n\t\tconst fontUrl = this.pv.font;\n\t\tlet font: Font | null | undefined = this._loadedFonts.get(fontUrl);\n\t\ttry {\n\t\t\tif (!font) {\n\t\t\t\tconst loader = new CoreLoaderFont(this.pv.font, this);\n\t\t\t\tfont = await loader.load();\n\t\t\t\tif (font) {\n\t\t\t\t\tthis._loadedFonts.set(fontUrl, font);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.warn('error:', err);\n\t\t\tthis.states.error.set(`could not load font (${this.pv.font}, reason:${(err as Error).message})`);\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tif (!font) {\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\t\tconst textType = TEXT_TYPES[this.pv.type];\n\t\tif (!TEXT_TYPES.includes(textType)) {\n\t\t\tthis.cookController.endCook();\n\t\t\treturn;\n\t\t}\n\n\t\tconst textWithoutSpaces = this.pv.text.replace(/\\s/g, '');\n\t\tif (textWithoutSpaces.length == 0) {\n\t\t\treturn this.setObjects([]);\n\t\t}\n\t\tconst geometries = await await textBuildGeometries({\n\t\t\ttext: this.pv.text,\n\t\t\ttextType,\n\t\t\tfont,\n\t\t\tsize: this.pv.size,\n\t\t\textrude: this.pv.extrude,\n\t\t\tcurveSegments: this.pv.segments,\n\t\t\tstrokeWidth: this.pv.strokeWidth,\n\t\t\t// bevel\n\t\t\tbevelEnabled: this.pv.bevelEnabled,\n\t\t\tbevelThickness: this.pv.bevelThickness,\n\t\t\tbevelSize: this.pv.bevelSize,\n\t\t\tbevelOffset: this.pv.bevelOffset,\n\t\t\tbevelSegments: this.pv.bevelSegments,\n\t\t\t//\n\t\t\tisCCW: isBooleanTrue(this.pv.tadvanced) ? this.pv.isCCW : undefined,\n\t\t\t// noHoles: isBooleanTrue(this.pv.tadvanced) ? this.pv.noHoles : undefined,\n\t\t});\n\t\tif (geometries) {\n\t\t\tconst objects = textMergeLetters({\n\t\t\t\ttext: this.pv.text,\n\t\t\t\tgeometries: geometries,\n\t\t\t\ttextType,\n\t\t\t\tsplitPerLetter: this.pv.splitPerLetter,\n\t\t\t\tkeepEmptyGeometries: this.pv.keepEmptyGeometries,\n\t\t\t\tjustifyMode: TEXT_SOP_JUSTIFY_MODES[this.pv.justifyMode],\n\t\t\t\tlineHeight: this.pv.lineHeight,\n\t\t\t});\n\t\t\tif (objects) {\n\t\t\t\treturn this.setObjects(objects);\n\t\t\t}\n\t\t}\n\t\tthis.states.error.set(GENERATION_ERROR_MESSAGE);\n\t\tthis.cookController.endCook();\n\t}\n}\n","/**\n * Transform input geometries or objects.\n *\n *\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {ROTATION_ORDERS, TransformTargetType, TRANSFORM_TARGET_TYPES} from '../../../core/Transform';\nimport {TransformSopOperation} from '../../operations/sop/Transform';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {\n\tOBJECT_TRANSFORM_MODES,\n\tOBJECT_TRANSFORM_SPACE_MENU_ENTRIES,\n\tObjectTransformMode,\n} from '../../../core/TransformSpace';\nconst DEFAULT = TransformSopOperation.DEFAULT_PARAMS;\nclass TransformSopParamConfig extends NodeParamsConfig {\n\t/** @param sets if this node should transform objects or geometries */\n\tapplyOn = ParamConfig.INTEGER(DEFAULT.applyOn, {\n\t\tmenu: {\n\t\t\tentries: TRANSFORM_TARGET_TYPES.map((name, value) => ({name, value})),\n\t\t},\n\t});\n\t/** @param group to assign the material to */\n\tgroup = ParamConfig.STRING(DEFAULT.group, {\n\t\tobjectMask: true,\n\t});\n\t/** @param if applyOn is set to object, the transform can then be applied in 2 different ways on those objects. Either the .position, .rotation and .scale attributes are set, or the matrix is set directly. */\n\tobjectMode = ParamConfig.INTEGER(DEFAULT.objectMode, {\n\t\tvisibleIf: {applyOn: TRANSFORM_TARGET_TYPES.indexOf(TransformTargetType.OBJECT)},\n\t\tmenu: {\n\t\t\tentries: OBJECT_TRANSFORM_MODES.map((name, value) => {\n\t\t\t\treturn {name, value};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param defines how the objects are transformed */\n\tobjectTransformSpace = ParamConfig.INTEGER(0, {\n\t\tvisibleIf: {\n\t\t\tapplyOn: TRANSFORM_TARGET_TYPES.indexOf(TransformTargetType.OBJECT),\n\t\t\tobjectMode: OBJECT_TRANSFORM_MODES.indexOf(ObjectTransformMode.MULT),\n\t\t},\n\t\tmenu: {\n\t\t\tentries: OBJECT_TRANSFORM_SPACE_MENU_ENTRIES,\n\t\t},\n\t});\n\t/** @param group to assign the material to */\n\tpointGroup = ParamConfig.STRING(DEFAULT.pointGroup, {\n\t\tvisibleIf: {applyOn: TRANSFORM_TARGET_TYPES.indexOf(TransformTargetType.GEOMETRY)},\n\t});\n\t// transform\n\t/** @param rotation order */\n\trotationOrder = ParamConfig.INTEGER(DEFAULT.rotationOrder, {\n\t\tseparatorBefore: true,\n\t\tmenu: {\n\t\t\tentries: ROTATION_ORDERS.map((order, v) => {\n\t\t\t\treturn {name: order, value: v};\n\t\t\t}),\n\t\t},\n\t});\n\t/** @param translate */\n\tt = ParamConfig.VECTOR3(DEFAULT.t);\n\t/** @param rotation */\n\tr = ParamConfig.VECTOR3(DEFAULT.r);\n\t/** @param scale */\n\ts = ParamConfig.VECTOR3(DEFAULT.s);\n\t/** @param scale (as a float) */\n\tscale = ParamConfig.FLOAT(DEFAULT.scale, {\n\t\trange: [0, 2],\n\t\tstep: 0.01,\n\t});\n\t// look_at = ParamConfig.OPERATOR_PATH('');\n\t// up = ParamConfig.VECTOR3([0, 1, 0]);\n\t/** @param pivot */\n\tpivot = ParamConfig.VECTOR3(DEFAULT.pivot, {\n\t\tvisibleIf: {applyOn: TRANSFORM_TARGET_TYPES.indexOf(TransformTargetType.GEOMETRY)},\n\t});\n}\nconst ParamsConfig = new TransformSopParamConfig();\n\nexport class TransformSopNode extends TypedSopNode<TransformSopParamConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.TRANSFORM;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(TransformSopOperation.INPUT_CLONED_STATE);\n\t}\n\n\tsetApplyOn(type: TransformTargetType) {\n\t\tthis.p.applyOn.set(TRANSFORM_TARGET_TYPES.indexOf(type));\n\t}\n\tapplyOn() {\n\t\treturn TRANSFORM_TARGET_TYPES[this.pv.applyOn];\n\t}\n\tsetObjectMode(mode: ObjectTransformMode) {\n\t\tthis.p.objectMode.set(OBJECT_TRANSFORM_MODES.indexOf(mode));\n\t}\n\n\tprivate _operation: TransformSopOperation | undefined;\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis._operation = this._operation || new TransformSopOperation(this.scene(), this.states, this);\n\t\tconst coreGroup = this._operation.cook(inputCoreGroups, this.pv);\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n}\n","/**\n * debugs the WFC tiles connections\n *\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {WFCTilesCollection} from '../../../core/wfc/WFCTilesCollection';\nimport {stringMatchMask} from '../../../core/String';\nimport {CoreWFCTileAttribute} from '../../../core/wfc/WFCAttributes';\nimport {Object3D, Group} from 'three';\nimport {ALL_HORIZONTAL_SIDES, CLOCK_WISE_TILE_SIDES} from '../../../core/wfc/WFCCommon';\nimport {EMPTY_TILE_ID} from '../../../core/wfc/WFCConstant';\n\nclass WFCDebugSopParamsConfig extends NodeParamsConfig {\n\t/** @param src tile id */\n\tsrcTileId = ParamConfig.STRING('*');\n\t/** @param dest tile id */\n\tdestTileId = ParamConfig.STRING('*');\n\t/** @param side name */\n\tsideName = ParamConfig.STRING('*');\n}\nconst ParamsConfig = new WFCDebugSopParamsConfig();\n\nexport class WFCDebugSopNode extends TypedSopNode<WFCDebugSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.WFC_DEBUG;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst tileAndRuleObjects = coreGroup.threejsObjects();\n\t\tconst collection = new WFCTilesCollection({tileAndRuleObjects});\n\n\t\tconst {srcTileId, destTileId, sideName} = this.pv;\n\t\tconst srcTiles = collection\n\t\t\t.tiles()\n\t\t\t.filter((tileObject) => stringMatchMask(CoreWFCTileAttribute.getTileId(tileObject), srcTileId));\n\t\tconst destTiles = collection\n\t\t\t.tiles()\n\t\t\t.filter((tileObject) => stringMatchMask(CoreWFCTileAttribute.getTileId(tileObject), destTileId));\n\n\t\tconst newObjects: Object3D[] = [];\n\t\tconst visited: Set<string> = new Set();\n\t\tlet i = 0;\n\t\tfor (const srcTile of srcTiles) {\n\t\t\tconst srcTileId = CoreWFCTileAttribute.getTileId(srcTile);\n\t\t\tlet j = 0;\n\t\t\tfor (const destTile of destTiles) {\n\t\t\t\tconst destTileId = CoreWFCTileAttribute.getTileId(destTile);\n\t\t\t\t// let k=0;\n\t\t\t\tcollection.traverseRules(srcTileId, destTileId, (id0, id1, side0, side1) => {\n\t\t\t\t\tconst srcSideName = CoreWFCTileAttribute.getSideName(srcTile, side0);\n\t\t\t\t\tconst destSideName = CoreWFCTileAttribute.getSideName(destTile, side1);\n\t\t\t\t\tif (srcSideName && destSideName) {\n\t\t\t\t\t\tif (!(stringMatchMask(srcSideName, sideName) && stringMatchMask(destSideName, sideName))) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tside0 = id0 == EMPTY_TILE_ID && ALL_HORIZONTAL_SIDES.includes(side0) ? ALL_HORIZONTAL_SIDES : side0;\n\t\t\t\t\tside1 = id1 == EMPTY_TILE_ID && ALL_HORIZONTAL_SIDES.includes(side1) ? ALL_HORIZONTAL_SIDES : side1;\n\t\t\t\t\tconst id = `${id0}:${side0}-${id1}:${side1}`;\n\t\t\t\t\tif (visited.has(id)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet inverted = id0 != srcTileId;\n\t\t\t\t\tvisited.add(id);\n\n\t\t\t\t\tconst group = new Group();\n\t\t\t\t\tnewObjects.push(group);\n\t\t\t\t\tgroup.matrixAutoUpdate = false;\n\t\t\t\t\t// _p.z = 2 * i;\n\t\t\t\t\tgroup.position.x = 3 * i;\n\t\t\t\t\tgroup.position.z = 2 * j;\n\t\t\t\t\tgroup.updateMatrix();\n\t\t\t\t\tgroup.name = `src:${srcTileId} dest:${destTileId} side0:${side0} side1:${side1}`;\n\t\t\t\t\tconst srcTileClone = inverted ? destTile.clone() : srcTile.clone();\n\t\t\t\t\tconst destTileClone = inverted ? srcTile.clone() : destTile.clone();\n\t\t\t\t\tgroup.add(srcTileClone);\n\t\t\t\t\tgroup.add(destTileClone);\n\n\t\t\t\t\tconst srcTileRotation = CLOCK_WISE_TILE_SIDES.indexOf(side0);\n\t\t\t\t\tconst destTileRotation = CLOCK_WISE_TILE_SIDES.indexOf(side1);\n\t\t\t\t\t// srcTileClone.position.x = -0.5;\n\t\t\t\t\tif (srcTileRotation >= 0) {\n\t\t\t\t\t\tsrcTileClone.rotation.y = (srcTileRotation * Math.PI) / 2;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (side1) {\n\t\t\t\t\t\tcase 'b': {\n\t\t\t\t\t\t\tdestTileClone.position.y = -1;\n\t\t\t\t\t\t\t// destTileClone.rotation.y = ((destTileRotation + 2) * Math.PI) / 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 't': {\n\t\t\t\t\t\t\tdestTileClone.position.y = +1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tdestTileClone.position.x = +1;\n\t\t\t\t\t\t\tdestTileClone.rotation.y = ((destTileRotation + 2) * Math.PI) / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsrcTileClone.updateMatrix();\n\t\t\t\t\tdestTileClone.updateMatrix();\n\t\t\t\t\tj++;\n\t\t\t\t});\n\t\t\t\t// j++\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tthis.setObjects(newObjects);\n\t}\n}\n","/**\n * creates rules used by the WFCSolver\n *\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {Object3D} from 'three';\nimport {ALL_SIDES} from '../../../core/wfc/WFCCommon';\nimport {CoreWFCTileAttribute} from '../../../core/wfc/WFCAttributes';\nimport {createRuleObject} from '../../../core/wfc/WFCRule';\nimport {stringMatchMask} from '../../../core/String';\n\nclass WFCRuleConnectionFromSideNameSopParamsConfig extends NodeParamsConfig {\n\t/** @param src tile id */\n\tsrcTileId = ParamConfig.STRING('*');\n\t/** @param dest tile id */\n\tdestTileId = ParamConfig.STRING('*');\n\t/** @param side name */\n\tsideName = ParamConfig.STRING('*');\n}\nconst ParamsConfig = new WFCRuleConnectionFromSideNameSopParamsConfig();\n\nexport class WFCRuleConnectionFromSideNameSopNode extends TypedSopNode<WFCRuleConnectionFromSideNameSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.WFC_RULE_CONNECTION_FROM_SIDE_NAME;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup0 = inputCoreGroups[0];\n\t\tconst tileObjects = coreGroup0.threejsObjects();\n\t\tconst outputObjects: Object3D[] = [...tileObjects];\n\n\t\tconst {srcTileId, destTileId, sideName} = this.pv;\n\t\tconst srcTileObjects = tileObjects.filter((tileObject) =>\n\t\t\tstringMatchMask(CoreWFCTileAttribute.getTileId(tileObject), srcTileId)\n\t\t);\n\t\tconst destTileObjects = tileObjects.filter((tileObject) =>\n\t\t\tstringMatchMask(CoreWFCTileAttribute.getTileId(tileObject), destTileId)\n\t\t);\n\t\t// create connections from tile side attributes\n\t\tfor (const tile0 of srcTileObjects) {\n\t\t\tconst tileId0 = CoreWFCTileAttribute.getTileId(tile0);\n\t\t\tfor (const side0 of ALL_SIDES) {\n\t\t\t\tconst sideName0 = CoreWFCTileAttribute.getSideName(tile0, side0);\n\n\t\t\t\tif (sideName0 && stringMatchMask(sideName0, sideName)) {\n\t\t\t\t\tfor (const tile1 of destTileObjects) {\n\t\t\t\t\t\tconst tileId1 = CoreWFCTileAttribute.getTileId(tile1);\n\t\t\t\t\t\tfor (const side1 of ALL_SIDES) {\n\t\t\t\t\t\t\tconst sideName1 = CoreWFCTileAttribute.getSideName(tile1, side1);\n\t\t\t\t\t\t\tif (sideName0 == sideName1) {\n\t\t\t\t\t\t\t\tconst ruleObject = createRuleObject({\n\t\t\t\t\t\t\t\t\tid0: tileId0,\n\t\t\t\t\t\t\t\t\tid1: tileId1,\n\t\t\t\t\t\t\t\t\tside0,\n\t\t\t\t\t\t\t\t\tside1,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\toutputObjects.push(ruleObject);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setObjects(outputObjects);\n\t}\n}\n","/**\n * Adds properties for WFC tiles\n *\n *\n */\nimport {TypedSopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {BooleanParam} from '../../params/Boolean';\nimport {StringParam} from '../../params/String';\nimport {BaseCoreObject} from '../../../core/geometry/entities/object/BaseCoreObject';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreWFCTileAttribute} from '../../../core/wfc/WFCAttributes';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {filterCoreObjectsFromCoreGroup} from '../../../core/geometry/Mask';\n\nclass WFCTilePropertiesSopParamsConfig extends NodeParamsConfig {\n\t/** @param group to assign the material to */\n\tgroup = ParamConfig.STRING('', {\n\t\tobjectMask: true,\n\t});\n\t/** @param addId */\n\taddId = ParamConfig.BOOLEAN(1);\n\t/** @param addId */\n\tid = ParamConfig.STRING('`$OS`-`@objnum`', {\n\t\tvisibleIf: {addId: 1},\n\t\texpression: {forEntities: true},\n\t});\n\t/** @param addName */\n\taddName = ParamConfig.BOOLEAN(1, {\n\t\tvisibleIf: {addId: 1},\n\t});\n\t/** @param allowedRotationY */\n\tallowedRotationY = ParamConfig.BOOLEAN(1, {\n\t\texpression: {forEntities: true},\n\t});\n}\nconst ParamsConfig = new WFCTilePropertiesSopParamsConfig();\n\nexport class WFCTilePropertiesSopNode extends TypedSopNode<WFCTilePropertiesSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopType.WFC_TILE_PROPERTIES;\n\t}\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst coreObjects = filterCoreObjectsFromCoreGroup(coreGroup, this.pv);\n\n\t\tconst promises: Array<Promise<void>> = [];\n\t\tconst {addName, addId} = this.pv;\n\n\t\t// for (const coreObject of coreObjects) {\n\t\t// \tCoreWFCTileAttribute.setIsTile(coreObject.object(), true);\n\t\t// }\n\n\t\tif (isBooleanTrue(addId)) {\n\t\t\tpromises.push(\n\t\t\t\tthis._computeStringParam(this.p.id, coreObjects, (object, value: string) => {\n\t\t\t\t\tif (addName) {\n\t\t\t\t\t\t// we also add the name to be easier to handle with a sop/deleteByName\n\t\t\t\t\t\tobject.name = value;\n\t\t\t\t\t}\n\t\t\t\t\tCoreWFCTileAttribute.setTileId(object, value);\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t\tpromises.push(\n\t\t\tthis._computeBooleanParam(\n\t\t\t\tthis.p.allowedRotationY,\n\t\t\t\tcoreObjects,\n\t\t\t\tCoreWFCTileAttribute.setRotationYAllowed.bind(CoreWFCTileAttribute)\n\t\t\t)\n\t\t);\n\t\tawait Promise.all(promises);\n\n\t\tthis.setCoreGroup(coreGroup);\n\t}\n\n\tprotected async _computeStringParam(\n\t\tparam: StringParam,\n\t\tcoreObjects: BaseCoreObject<CoreObjectType>[],\n\t\tapplyMethod: (object: ObjectContent<CoreObjectType>, value: string) => void\n\t) {\n\t\tif (param.expressionController && param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForObjects(coreObjects, (coreObject, value: string) => {\n\t\t\t\tapplyMethod(coreObject.object(), value);\n\t\t\t});\n\t\t} else {\n\t\t\tfor (const coreObject of coreObjects) {\n\t\t\t\tapplyMethod(coreObject.object(), param.value);\n\t\t\t}\n\t\t}\n\t}\n\tprotected async _computeBooleanParam(\n\t\tparam: BooleanParam,\n\t\tcoreObjects: BaseCoreObject<CoreObjectType>[],\n\t\tapplyMethod: (object: ObjectContent<CoreObjectType>, value: boolean) => void\n\t) {\n\t\tif (param.expressionController && param.expressionController.entitiesDependent()) {\n\t\t\tawait param.expressionController.computeExpressionForObjects(coreObjects, (coreObject, value) => {\n\t\t\t\tapplyMethod(coreObject.object(), value);\n\t\t\t});\n\t\t} else {\n\t\t\tfor (const coreObject of coreObjects) {\n\t\t\t\tapplyMethod(coreObject.object(), param.value);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {Material} from 'three';\nimport {BufferGeometry} from 'three';\nimport {TypedNode} from '../_Base';\nimport {ObjectByObjectType} from '../../../core/geometry/Constant';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {ObjectType} from '../../../core/geometry/Constant';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {FlagsControllerDBO} from '../utils/FlagsController';\nimport {BaseSopOperation} from '../../operations/sop/_Base';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\n\n// class ParamLessNetworkSopParamsConfig extends NodeParamsConfig {}\n// export class BaseNetworkSopNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.SOP, K> {\n// \tstatic node_context(): NodeContext {\n// \t\treturn NodeContext.SOP;\n// \t}\n// \t// initializeBaseNode() {\n// \t// \tthis.children_controller?.init({dependent: false});\n// \t// }\n// \tcook() {\n// \t\tthis.cookController.end_cook();\n// \t}\n// }\n// export class ParamLessBaseNetworkSopNode extends BaseNetworkSopNode<ParamLessNetworkSopParamsConfig> {}\n\n/**\n *\n *\n * BaseSopNode is the base class for all nodes that process geometries. This inherits from [TypedNode](/docs/api/TypedNode).\n *\n */\nexport class TypedSopNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.SOP, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.SOP;\n\t}\n\tpublic override readonly flags: FlagsControllerDBO = new FlagsControllerDBO(this);\n\toverride dataType(): string {\n\t\treturn CoreObjectType.THREEJS;\n\t}\n\n\toverride initializeBaseNode() {\n\t\tthis.flags.display.set(false);\n\t\tthis.flags.display.onUpdate(() => {\n\t\t\tif (!this.flags.display.active()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst parent = this.parent();\n\t\t\tif (!(parent && parent.displayNodeController)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tparent.displayNodeController.setDisplayNode(this);\n\t\t});\n\t\tthis.io.outputs.setHasOneOutput();\n\t}\n\t//\n\t// ALL OBJECTS\n\t//\n\n\t//\n\t// THREEJS OBJECTS\n\t//\n\tsetCoreGroup(coreGroup: CoreGroup) {\n\t\tthis._setContainer(coreGroup /*, MESSAGE.FROM_SET_CORE_GROUP*/);\n\t}\n\n\tsetObject(object: ObjectContent<CoreObjectType>) {\n\t\tthis._setContainerObjects([object] /*, MESSAGE.FROM_SET_OBJECT*/);\n\t}\n\tsetObjects(objects: ObjectContent<CoreObjectType>[]) {\n\t\tthis._setContainerObjects(objects /*, MESSAGE.FROM_SET_OBJECTS*/);\n\t}\n\n\tsetGeometry(geometry: BufferGeometry, type: ObjectType = ObjectType.MESH) {\n\t\tconst object = this.createObject(geometry, type);\n\t\tthis._setContainerObjects(object ? [object] : [] /*, MESSAGE.FROM_SET_GEOMETRY*/);\n\t}\n\n\tsetGeometries(geometries: BufferGeometry[], type: ObjectType = ObjectType.MESH) {\n\t\tconst objects: Object3D[] = [];\n\t\tfor (const geometry of geometries) {\n\t\t\tconst object = this.createObject(geometry, type);\n\t\t\tif (object) {\n\t\t\t\tobjects.push(object);\n\t\t\t}\n\t\t}\n\t\tthis._setContainerObjects(objects /*, MESSAGE.FROM_SET_GEOMETRIES*/);\n\t}\n\t// protected _setContainerAllObjects(objects: Object3D[] /*, message: MESSAGE*/) {\n\t// \tconst coreGroup = this.containerController.container().coreContent() || new CoreGroup();\n\t// \tcoreGroup.setAllObjects(objects);\n\t// \tthis._setContainer(coreGroup);\n\t// }\n\tprotected _setContainerObjects(objects: ObjectContent<CoreObjectType>[] /*, message: MESSAGE*/) {\n\t\tconst coreGroup = this.containerController.container().coreContent() || new CoreGroup();\n\t\tcoreGroup.setAllObjects(objects);\n\t\tthis._setContainer(coreGroup);\n\t}\n\n\tstatic createObject<OT extends ObjectType>(\n\t\tgeometry: BufferGeometry,\n\t\ttype: OT,\n\t\tmaterial?: Material\n\t): ObjectByObjectType[OT] {\n\t\treturn BaseSopOperation.createObject(geometry, type, material);\n\t}\n\n\tcreateObject<OT extends ObjectType>(\n\t\tgeometry: BufferGeometry,\n\t\ttype: OT,\n\t\tmaterial?: Material\n\t): ObjectByObjectType[OT] {\n\t\treturn TypedSopNode.createObject(geometry, type, material);\n\t}\n\n\tstatic createIndexIfNone(geometry: BufferGeometry) {\n\t\tBaseSopOperation.createIndexIfNone(geometry);\n\t}\n\tprotected _createIndexIfNone(geometry: BufferGeometry) {\n\t\tTypedSopNode.createIndexIfNone(geometry);\n\t}\n}\n\nexport type BaseSopNodeType = TypedSopNode<NodeParamsConfig>;\nexport class BaseSopNodeClass extends TypedSopNode<NodeParamsConfig> {}\n","import {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {TypedSopNode} from './_Base';\nimport {\n\tCadGeometryType,\n\tcadGeometryTypeFromShape,\n\tTopoDS_Shape,\n\tGeom2d_Curve,\n} from '../../../core/geometry/modules/cad/CadCommon';\nimport {CadObject} from '../../../core/geometry/modules/cad/CadObject';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {CoreObjectType} from '../../../core/geometry/ObjectContent';\nimport {CadLoaderSync} from '../../../core/geometry/modules/cad/CadLoaderSync';\nimport {cadProcessError} from '../../../core/geometry/modules/cad/CadExceptionHandler';\nimport {ModuleName} from '../../poly/registers/modules/Common';\n\nexport class CADSopNode<K extends NodeParamsConfig> extends TypedSopNode<K> {\n\toverride dataType(): string {\n\t\treturn CoreObjectType.CAD;\n\t}\n\toverride requiredModules() {\n\t\treturn [ModuleName.CAD];\n\t}\n\tsetCADGeom2dCurve(curve: Geom2d_Curve) {\n\t\tconst objects = [new CadObject(curve, CadGeometryType.CURVE_2D)];\n\t\tthis._setContainerCadObjects(objects);\n\t}\n\tsetCADShape(shape: TopoDS_Shape) {\n\t\tconst oc = CadLoaderSync.oc();\n\t\tconst type = cadGeometryTypeFromShape(oc, shape) || CadGeometryType.VERTEX;\n\t\tconst objects = [new CadObject(shape, type)];\n\t\tthis._setContainerCadObjects(objects);\n\t}\n\tsetCADShapes(shapes: TopoDS_Shape[]) {\n\t\tconst oc = CadLoaderSync.oc();\n\t\tconst objects = shapes.map(\n\t\t\t(shape, i) => new CadObject(shape, cadGeometryTypeFromShape(oc, shape) || CadGeometryType.VERTEX)\n\t\t);\n\t\tthis._setContainerCadObjects(objects);\n\t}\n\tsetCADObjects(cadObjects: CadObject<CadGeometryType>[]) {\n\t\tthis._setContainerCadObjects(cadObjects);\n\t}\n\tsetCADObject(cadObject: CadObject<CadGeometryType>) {\n\t\tthis._setContainerCadObjects([cadObject]);\n\t}\n\n\tprotected _setContainerCadObjects(objects: CadObject<CadGeometryType>[] /*, message: MESSAGE*/) {\n\t\tconst coreGroup = this.containerController.container().coreContent() || new CoreGroup();\n\t\tcoreGroup.setAllObjects(objects);\n\t\tthis._setContainer(coreGroup);\n\t}\n\n\t// error processing\n\toverride processError(e: unknown) {\n\t\treturn cadProcessError(e);\n\t}\n}\n\nexport type BaseCADSopNodeType = CADSopNode<NodeParamsConfig>;\nexport class BaseCADSopNodeClass extends CADSopNode<NodeParamsConfig> {}\n","/**\n * Base class of Exporter nodes\n *\n * @remarks\n */\n\nimport {BaseSopNodeType, TypedSopNode} from './_Base';\nimport {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';\nimport {BaseNodeType} from '../_Base';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Scene} from 'three';\nimport {Object3D} from 'three';\nimport {downloadBlob} from '../../../core/BlobUtils';\nimport {StringParam} from '../../params/String';\nimport {isString} from '../../../core/Type';\n\ntype Result = ArrayBuffer | string | object;\nconst previousParentByObject: WeakMap<Object3D, Object3D | null> = new WeakMap();\n\nexport class BaseExporterSopParamsConfig extends NodeParamsConfig {\n\t/** @param fileName */\n\tfileName = ParamConfig.STRING('`$OS`');\n\t/** @param export */\n\tdownload = ParamConfig.BUTTON(null, {\n\t\thidden: true,\n\t\tcallback: (node: BaseNodeType) => {\n\t\t\tExporterSopNode.PARAM_CALLBACK_download(node as ExporterSopNode<BaseExporterSopParamsConfig>);\n\t\t},\n\t});\n}\n\nexport abstract class ExporterSopNode<K extends BaseExporterSopParamsConfig> extends TypedSopNode<K> {\n\tabstract fileExtension(): string;\n\tabstract createBlob(): Promise<Blob>;\n\n\toverride initializeNode() {\n\t\tthis.io.inputs.setCount(1);\n\t\tthis.io.inputs.initInputsClonedState(InputCloneMode.NEVER);\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tthis.setCoreGroup(inputCoreGroups[0]);\n\t}\n\n\tstatic PARAM_CALLBACK_download(node: ExporterSopNode<BaseExporterSopParamsConfig>) {\n\t\tnode._paramCallbackDownload();\n\t}\n\tasync fileName() {\n\t\treturn await exporterSopFileName(this.p.fileName, this.fileExtension());\n\t}\n\tasync _paramCallbackDownload() {\n\t\tconst blob = await this.createBlob();\n\t\tconst fileName = await this.fileName();\n\t\tdownloadBlob(blob, fileName);\n\t}\n\tprotected async _prepareScene() {\n\t\treturn await exporterSopPrepareScene(this);\n\t}\n\tprotected _handleResult(result: Result, objects: Object3D[], resolve: (blob: Blob) => void) {\n\t\texporterSopHandleResult(result, objects, resolve);\n\t}\n}\n\nexport async function exporterSopFileName(fileNameParam: StringParam, fileExtension: string) {\n\tif (fileNameParam.isDirty()) {\n\t\tawait fileNameParam.compute();\n\t}\n\tconst fileNameShort = fileNameParam.value;\n\tconst fileName = `${fileNameShort}.${fileExtension}`;\n\treturn fileName;\n}\n\nexport async function exporterSopPrepareScene(node: BaseSopNodeType) {\n\tconst container = await node.compute();\n\tconst coreGroup = container.coreContent();\n\tif (!coreGroup) {\n\t\tconsole.error('input invalid');\n\t\treturn;\n\t}\n\n\t// save current parents\n\tconst objects = coreGroup.threejsObjects();\n\tfor (const object of objects) {\n\t\tpreviousParentByObject.set(object, object.parent);\n\t}\n\n\t// add to exported scene\n\tconst scene = new Scene();\n\tfor (const object of objects) {\n\t\tscene.add(object);\n\t}\n\treturn {scene, objects};\n}\nfunction _createBlob(result: Result) {\n\tif (result instanceof Uint8Array || result instanceof ArrayBuffer) {\n\t\treturn new Blob([result], {type: 'application/octet-stream'});\n\t}\n\n\tif (isString(result)) {\n\t\treturn new Blob([result], {type: 'text/plain'});\n\t}\n\n\tconst output = JSON.stringify(result, null, 2);\n\treturn new Blob([output], {type: 'text/plain'});\n}\nexport function exporterSopHandleResult(result: Result, objects: Object3D[], resolve: (blob: Blob) => void) {\n\tconst blob = _createBlob(result);\n\n\t// restore parents\n\tfor (const object of objects) {\n\t\tconst previousParent = previousParentByObject.get(object);\n\t\tif (previousParent) {\n\t\t\tpreviousParent.add(object);\n\t\t}\n\t}\n\n\tresolve(blob);\n}\n","import {NodeContext} from '../../poly/NodeContext';\nimport {NodeParamsConfig} from '../utils/params/ParamsConfig';\nimport {TypedNode} from '../_Base';\n\nclass ParamLessNetworkSopParamsConfig extends NodeParamsConfig {}\nexport class BaseNetworkSopNode<K extends NodeParamsConfig> extends TypedNode<NodeContext.SOP, K> {\n\tstatic override context(): NodeContext {\n\t\treturn NodeContext.SOP;\n\t}\n\t// initializeBaseNode() {\n\t// \tthis.children_controller?.init({dependent: false});\n\t// }\n\toverride cook() {\n\t\tthis.cookController.endCook();\n\t}\n}\nexport class ParamLessBaseNetworkSopNode extends BaseNetworkSopNode<ParamLessNetworkSopParamsConfig> {}\n","import {ParamEvent} from './../../../../poly/ParamEvent';\nimport {TypedSopNode} from './../../_Base';\nimport {BaseNodeType} from '../../../_Base';\nimport {NodeParamsConfig, ParamConfig} from '../../../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../../../core/geometry/Group';\nimport {Poly} from '../../../../Poly';\nimport {BaseFileSopOperation} from '../../../../operations/sop/utils/File/_BaseFileOperation';\nimport {Group} from 'three';\n\ninterface FileSopNodeOptions {\n\ttype: string;\n\toperation: typeof BaseFileSopOperation;\n\textensions: string[];\n}\n\nclass BaseFileParamsConfigResult extends NodeParamsConfig {\n\turl = ParamConfig.STRING('');\n\tmatrixAutoUpdate = ParamConfig.BOOLEAN(0);\n\treload = ParamConfig.BUTTON(null);\n}\n\nexport class FileDummySopOperation extends BaseFileSopOperation<Group> {\n\tstatic override type(): Readonly<'fileDummy'> {\n\t\treturn 'fileDummy';\n\t}\n\n\tprotected _createGeoLoaderHandler(params: any) {\n\t\treturn 0 as any;\n\t}\n}\n\nexport class BaseFileSopNodeFactoryResult extends TypedSopNode<BaseFileParamsConfigResult> {}\n\nexport function fileSopNodeFactory(options: FileSopNodeOptions): typeof BaseFileSopNodeFactoryResult {\n\tconst DEFAULT = options.operation.DEFAULT_PARAMS;\n\tclass BaseFileParamsConfig extends NodeParamsConfig {\n\t\t/** @param url to load the geometry from */\n\t\turl = ParamConfig.STRING(DEFAULT.url, {\n\t\t\tfileBrowse: {extensions: options.extensions},\n\t\t});\n\t\t/** @param sets the matrixAutoUpdate attribute for the objects loaded */\n\t\tmatrixAutoUpdate = ParamConfig.BOOLEAN(DEFAULT.matrixAutoUpdate);\n\t\t/** @param reload the geometry */\n\t\treload = ParamConfig.BUTTON(null, {\n\t\t\tcallback: (node: BaseNodeType) => {\n\t\t\t\tBaseFileSopNode.PARAM_CALLBACK_reload(node as BaseFileSopNode);\n\t\t\t},\n\t\t});\n\t}\n\tconst ParamsConfig = new BaseFileParamsConfig();\n\n\tclass BaseFileSopNode extends TypedSopNode<BaseFileParamsConfig> {\n\t\toverride paramsConfig = ParamsConfig;\n\t\tstatic override type() {\n\t\t\treturn options.type;\n\t\t}\n\t\toverride dispose(): void {\n\t\t\tsuper.dispose();\n\t\t\tPoly.blobs.clearBlobsForNode(this);\n\t\t}\n\n\t\tprivate _operation: FileDummySopOperation | undefined;\n\t\tprivate operation() {\n\t\t\tconst operation = options.operation as typeof FileDummySopOperation;\n\t\t\treturn (this._operation = this._operation || new operation(this.scene(), this.states, this));\n\t\t}\n\t\toverride async cook(inputContents: CoreGroup[]) {\n\t\t\tconst coreGroup = await this.operation().cook(inputContents, this.pv);\n\t\t\tthis.setCoreGroup(coreGroup);\n\t\t}\n\n\t\tstatic PARAM_CALLBACK_reload(node: BaseFileSopNode) {\n\t\t\tnode._paramCallbackReload();\n\t\t}\n\t\tprivate _paramCallbackReload() {\n\t\t\t// this.operation().clearLoadedBlob(this.pv);\n\t\t\t// set the param dirty is preferable to just the successors, in case the expression result needs to be updated\n\t\t\tthis.p.url.setDirty();\n\t\t\tthis.p.url.emit(ParamEvent.ASSET_RELOAD_REQUEST);\n\t\t\t// this.setDirty()\n\t\t}\n\t}\n\treturn BaseFileSopNode;\n}\n","import {CoreEntity} from '../../../../../core/geometry/CoreEntity';\n\nexport type CoreEntitySelectionState = Map<CoreEntity, boolean>;\n\nexport function updateSelectionState(selectionStates: CoreEntitySelectionState, entity: CoreEntity, state: boolean) {\n\tconst currentState = selectionStates.get(entity);\n\tif (!currentState) {\n\t\tselectionStates.set(entity, state);\n\t}\n}\n\nexport function selectedIndicesFromSelectionStates(\n\tselectionStates: CoreEntitySelectionState,\n\tselectedIndices: Set<number>,\n\tinvert: boolean\n): void {\n\tselectionStates.forEach((state, entity) => {\n\t\tconst selected = (!invert && state) || (invert && !state);\n\t\tif (selected) {\n\t\t\tselectedIndices.add(entity.index());\n\t\t}\n\t});\n}\n","import {DisplayNodeControllerCallbacks, DisplayNodeController} from '../../../utils/DisplayNodeController';\nimport {SubnetOutputSopNode} from '../../SubnetOutput';\nimport {CoreGraphNode} from '../../../../../core/graph/CoreGraphNode';\nimport {TypedSopNode, BaseSopNodeType} from '../../_Base';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {GeoNodeChildrenMap} from '../../../../poly/registers/nodes/Sop';\nimport {GeoObjNode} from '../../../../nodes/obj/Geo';\nimport {NodeParamsConfig} from '../../../utils/params/ParamsConfig';\nimport {CoreGroup} from '../../../../../core/geometry/Group';\nimport {Constructor, valueof} from '../../../../../types/GlobalTypes';\nimport {NodeCreateOptions} from '../../../utils/hierarchy/ChildrenController';\nimport {BaseNodeClassWithDisplayFlag} from '../../../_Base';\n\nexport class SubnetSopNodeLike<T extends NodeParamsConfig> extends TypedSopNode<T> {\n\tprivate _overrideOutputNode: boolean = false;\n\toverride initializeBaseNode() {\n\t\tsuper.initializeBaseNode();\n\t\tthis.childrenDisplayController.initializeNode();\n\t\t// the inputs will be evaluated by the child input nodes\n\t\tthis.cookController.disallowInputsEvaluation();\n\t}\n\n\t// display_node and children_display controllers\n\tpublic readonly childrenDisplayController: SopSubnetChildrenDisplayController =\n\t\tnew SopSubnetChildrenDisplayController(this);\n\tpublic override readonly displayNodeController: DisplayNodeController = new DisplayNodeController(\n\t\tthis,\n\t\tthis.childrenDisplayController.displayNodeControllerCallbacks()\n\t);\n\t//\n\n\tprotected override _childrenControllerContext = NodeContext.SOP;\n\toverride createNode<S extends keyof GeoNodeChildrenMap>(\n\t\tnode_class: S,\n\t\toptions?: NodeCreateOptions\n\t): GeoNodeChildrenMap[S];\n\toverride createNode<K extends valueof<GeoNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K;\n\toverride createNode<K extends valueof<GeoNodeChildrenMap>>(\n\t\tnode_class: Constructor<K>,\n\t\toptions?: NodeCreateOptions\n\t): K {\n\t\treturn super.createNode(node_class, options) as K;\n\t}\n\toverride children() {\n\t\treturn super.children() as BaseSopNodeType[];\n\t}\n\toverride nodesByType<K extends keyof GeoNodeChildrenMap>(type: K): GeoNodeChildrenMap[K][] {\n\t\treturn super.nodesByType(type) as GeoNodeChildrenMap[K][];\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst childOutputNode = this.outputNode();\n\t\tif (childOutputNode) {\n\t\t\tawait this._cookFromChildOutputNode(childOutputNode);\n\t\t} else {\n\t\t\tif (!this._overrideOutputNode) {\n\t\t\t\tthis.states.error.set('no output node found inside subnet');\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _cookFromChildOutputNode(childOutputNode: SubnetOutputSopNode | BaseNodeClassWithDisplayFlag) {\n\t\tconst container = await childOutputNode.compute();\n\t\tconst coreContent = container.coreContent();\n\t\tif (coreContent) {\n\t\t\tthis.setCoreGroup(coreContent);\n\t\t} else {\n\t\t\tif (childOutputNode.states.error.active()) {\n\t\t\t\tthis.states.error.set(childOutputNode.states.error.message());\n\t\t\t} else {\n\t\t\t\tthis.setObjects([]);\n\t\t\t}\n\t\t}\n\t}\n\toutputNode(): SubnetOutputSopNode | BaseNodeClassWithDisplayFlag | undefined {\n\t\treturn this._overrideOutputNode\n\t\t\t? this.displayNodeController.displayNode()\n\t\t\t: this.childrenDisplayController.outputNode();\n\t}\n\tsetOverrideOutputNode(overrideOutputNode: boolean) {\n\t\tif (this._overrideOutputNode == overrideOutputNode) {\n\t\t\treturn;\n\t\t}\n\t\tthis._overrideOutputNode = overrideOutputNode;\n\t\tconst parent = this.parent();\n\t\tif (parent) {\n\t\t\tif (parent instanceof SubnetSopNodeLike) {\n\t\t\t\tconst parentSubnet = parent as SubnetSopNodeLike<any>;\n\t\t\t\tparentSubnet.setOverrideOutputNode(overrideOutputNode);\n\t\t\t}\n\t\t\tif (parent instanceof GeoObjNode || parent instanceof SubnetSopNodeLike) {\n\t\t\t\tconst parentGeoObjNode = parent as SubnetSopNodeLike<any> | GeoObjNode;\n\t\t\t\tif (overrideOutputNode) {\n\t\t\t\t\tparentGeoObjNode.displayNodeController.setDisplayNodeOverride(this);\n\t\t\t\t} else {\n\t\t\t\t\tparentGeoObjNode.displayNodeController.setDisplayNodeOverride(undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setDirty();\n\t\t// this.outputNode()?.setDirty();\n\t}\n}\n\ninterface SopSubnetChildrenDisplayControllerOptions {\n\tdependsOnDisplayNode: boolean;\n}\nconst DEFAULT_OPTIONS: SopSubnetChildrenDisplayControllerOptions = {\n\tdependsOnDisplayNode: true,\n};\nexport class SopSubnetChildrenDisplayController {\n\tprivate _outputNodeNeedsUpdate: boolean = true;\n\tprivate _outputNode: SubnetOutputSopNode | undefined;\n\tprivate _graphNode: CoreGraphNode | undefined;\n\tconstructor(\n\t\tprivate node: SubnetSopNodeLike<any>,\n\t\tprivate options: SopSubnetChildrenDisplayControllerOptions = DEFAULT_OPTIONS\n\t) {}\n\n\tdispose() {\n\t\tthis._graphNode?.dispose();\n\t}\n\n\tdisplayNodeControllerCallbacks(): DisplayNodeControllerCallbacks {\n\t\treturn {\n\t\t\tonDisplayNodeRemove: () => {\n\t\t\t\tthis.node.setDirty();\n\t\t\t},\n\t\t\tonDisplayNodeSet: () => {\n\t\t\t\tthis.node.setDirty();\n\t\t\t},\n\t\t\tonDisplayNodeUpdate: () => {\n\t\t\t\tif (this.node.isDirty()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.node.setDirty();\n\t\t\t},\n\t\t};\n\t}\n\n\toutputNode() {\n\t\tif (this._outputNodeNeedsUpdate) {\n\t\t\tthis._updateOutputNode();\n\t\t}\n\t\treturn this._outputNode;\n\t}\n\n\tinitializeNode() {\n\t\tconst displayFlag = this.node.flags?.display;\n\t\tif (displayFlag) {\n\t\t\tdisplayFlag.onUpdate(() => {\n\t\t\t\tif (displayFlag.active()) {\n\t\t\t\t\tthis.node.setDirty();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.node.lifecycle.onChildAdd(() => {\n\t\t\tthis._outputNodeNeedsUpdate = true;\n\t\t\tthis.node.setDirty();\n\t\t});\n\t\tthis.node.lifecycle.onChildRemove(() => {\n\t\t\tthis._outputNodeNeedsUpdate = true;\n\t\t\tthis.node.setDirty();\n\t\t});\n\t}\n\n\tprivate _updateOutputNode() {\n\t\tconst foundNode = this.node.nodesByType(SubnetOutputSopNode.type())[0];\n\t\tif (\n\t\t\tthis._outputNode == null ||\n\t\t\tfoundNode == null ||\n\t\t\tthis._outputNode.graphNodeId() != foundNode.graphNodeId()\n\t\t) {\n\t\t\tif (this._graphNode && this._outputNode) {\n\t\t\t\tthis._graphNode.removeGraphInput(this._outputNode);\n\t\t\t}\n\n\t\t\tthis._outputNode = foundNode;\n\n\t\t\tif (this._outputNode && this.options.dependsOnDisplayNode) {\n\t\t\t\tthis._graphNode = this._graphNode || this._createGraphNode();\n\n\t\t\t\tthis._graphNode.addGraphInput(this._outputNode);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _createGraphNode() {\n\t\tconst graphNode = new CoreGraphNode(this.node.scene(), `subnetChildrenDisplayController-${this.node.name()}`);\n\t\tgraphNode.addPostDirtyHook('subnetChildrenDisplayController', () => {\n\t\t\tthis.node.setDirty();\n\t\t});\n\t\treturn graphNode;\n\t}\n}\n","import {PolyDictionary} from '../../../types/GlobalTypes';\nimport {BaseNodeType} from '../_Base';\nimport {Texture} from 'three';\nimport {Matrix3} from 'three';\nimport {IUniform} from 'three';\nimport {ShaderMaterialWithCustomMaterials} from '../../../core/geometry/Material';\nimport {MaterialLoader} from 'three';\nimport {Material} from 'three';\nimport {ShaderMaterial} from 'three';\nimport {MaterialUserDataUniforms, OnBeforeCompileDataHandler} from '../gl/code/assemblers/materials/OnBeforeCompile';\nimport {MeshDepthMaterial} from 'three';\nimport {\n\tShadowMaterial,\n\tSpriteMaterial,\n\tRawShaderMaterial,\n\tPointsMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMeshPhongMaterial,\n\tMeshToonMaterial,\n\tMeshNormalMaterial,\n\tMeshLambertMaterial,\n\tMeshDistanceMaterial,\n\tMeshBasicMaterial,\n\tMeshMatcapMaterial,\n\tLineDashedMaterial,\n\tLineBasicMaterial,\n} from 'three';\nimport {VelocityColliderFunctionBody} from '../js/code/assemblers/_Base';\n\nfunction MonkeyPatchMaterial() {\n\tconst materialLib = {\n\t\tShadowMaterial,\n\t\tSpriteMaterial,\n\t\tRawShaderMaterial,\n\t\tShaderMaterial,\n\t\tPointsMaterial,\n\t\tMeshPhysicalMaterial,\n\t\tMeshStandardMaterial,\n\t\tMeshPhongMaterial,\n\t\tMeshToonMaterial,\n\t\tMeshNormalMaterial,\n\t\tMeshLambertMaterial,\n\t\tMeshDepthMaterial,\n\t\tMeshDistanceMaterial,\n\t\tMeshBasicMaterial,\n\t\tMeshMatcapMaterial,\n\t\tLineDashedMaterial,\n\t\tLineBasicMaterial,\n\t\tMaterial,\n\t};\n\n\t(Material as any).fromType = function (type: string) {\n\t\treturn new (materialLib as any)[type]();\n\t};\n}\n\ninterface MaterialData {\n\tcolor?: boolean;\n\tlights?: boolean;\n}\n\ninterface ToJsonOptions {\n\tnode: BaseNodeType;\n\tsuffix: string;\n}\ninterface DataObjectWithoutShaders {}\nexport interface PersistedConfigWithShaders extends DataObjectWithoutShaders {\n\t// when a particle system is saved without having been computed\n\t// it will not have shaders, and this can therefore be undefined\n\tshaders?: PolyDictionary<string>;\n\tfunctionBody?: string | VelocityColliderFunctionBody;\n}\nconst ENTRY_NAMES_TO_REMOVE: Set<string> = new Set(['shaders', 'functionBody']);\nexport abstract class BasePersistedConfig {\n\tconstructor(protected node: BaseNodeType) {}\n\tabstract toData(): Promise<PersistedConfigWithShaders | void>;\n\tload(data: object) {}\n\n\tasync toDataWithoutShaders(): Promise<DataObjectWithoutShaders | void> {\n\t\tconst data = await this.toData();\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tconst dataWithoutShaders: DataObjectWithoutShaders = {};\n\t\tconst entryNames = Object.keys(data);\n\t\tfor (const entryName of entryNames) {\n\t\t\tif (!ENTRY_NAMES_TO_REMOVE.has(entryName)) {\n\t\t\t\t(dataWithoutShaders as any)[entryName] = (data as any)[entryName];\n\t\t\t}\n\t\t}\n\t\treturn dataWithoutShaders;\n\t}\n\n\t//\n\t//\n\t// SAVE MAT\n\t//\n\t//\n\tprotected _materialToJson(material: Material, options: ToJsonOptions): object | undefined {\n\t\tlet material_data: object | undefined = undefined;\n\t\tthis._withPreparedMaterial(material, () => {\n\t\t\ttry {\n\t\t\t\tmaterial_data = material.toJSON();\n\t\t\t\tif (material_data) {\n\t\t\t\t\t// those properties are currently not handled in three.js\n\t\t\t\t\t// TODO: wait for https://github.com/mrdoob/three.js/pull/21428\n\t\t\t\t\t// to be merged\n\t\t\t\t\t// (material_data as any).shadowSide = material.shadowSide;\n\t\t\t\t\t// (material_data as any).colorWrite = material.colorWrite;\n\t\t\t\t\tconst depthPacking = (material as MeshDepthMaterial).depthPacking;\n\t\t\t\t\t(material_data as any).depthPacking = depthPacking;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('failed to save material data');\n\t\t\t\tconsole.log(material);\n\t\t\t\tconsole.log(err);\n\t\t\t}\n\t\t\tif (material_data && (material as ShaderMaterial).lights != null) {\n\t\t\t\t(material_data as any).lights = (material as ShaderMaterial).lights;\n\t\t\t}\n\t\t\tif (material_data) {\n\t\t\t\t// here we force the uuid to an expected value,\n\t\t\t\t// so that it does not get overriden at each load/save\n\t\t\t\t(material_data as any).uuid = `${options.node.path()}-${options.suffix}`;\n\t\t\t}\n\t\t});\n\n\t\treturn material_data;\n\t}\n\n\tprivate _withPreparedMaterial(material: Material, callback: () => void) {\n\t\tthis._withUnassignedUniformTextures(material as ShaderMaterial, () => {\n\t\t\tthis._withUnassignedBasePropertyTextures(material, () => {\n\t\t\t\tthis._withUnassignedOnBeforeCompileData(material, () => {\n\t\t\t\t\tcallback();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _withUnassignedOnBeforeCompileData(material: Material, callback: () => void) {\n\t\tconst uniforms = MaterialUserDataUniforms.removeUniforms(material);\n\t\tconst onBeforeCompileData = OnBeforeCompileDataHandler.removeData(material);\n\n\t\tcallback();\n\n\t\tif (uniforms) {\n\t\t\tMaterialUserDataUniforms.setUniforms(material, uniforms);\n\t\t}\n\t\tif (onBeforeCompileData) {\n\t\t\tOnBeforeCompileDataHandler.setData(material, onBeforeCompileData);\n\t\t}\n\t}\n\tprivate _withUnassignedUniformTextures(material: ShaderMaterial, callback: () => void) {\n\t\tconst textureByUniformName: Map<string, Texture> = new Map();\n\t\t// we use material.uniforms and not material.userData.uniforms\n\t\t// since userData.uniforms are removed in ._unassignOnBeforeCompileUniforms\n\t\tconst uniforms = (material as ShaderMaterial).uniforms;\n\t\tif (uniforms) {\n\t\t\tconst uniformNames = Object.keys(uniforms);\n\t\t\tfor (const uniformName of uniformNames) {\n\t\t\t\tconst value = uniforms[uniformName].value;\n\t\t\t\tif (value && value.uuid) {\n\t\t\t\t\tconst texture = value as Texture;\n\t\t\t\t\ttextureByUniformName.set(uniformName, texture);\n\t\t\t\t\tuniforms[uniformName].value = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcallback();\n\n\t\tif (uniforms) {\n\t\t\ttextureByUniformName.forEach((texture, uniformName) => {\n\t\t\t\tuniforms[uniformName].value = texture;\n\t\t\t});\n\t\t}\n\t}\n\tprivate _withUnassignedBasePropertyTextures(material: Material, callback: () => void) {\n\t\tconst textureByPropertyName: Map<string, Texture> = new Map();\n\t\t// we use material.uniforms and not material.userData.uniforms\n\t\t// since userData.uniforms are removed in ._unassignOnBeforeCompileUniforms\n\t\tconst propertyNames = Object.keys(material);\n\t\tfor (const propertyName of propertyNames) {\n\t\t\tconst value = (material as any)[propertyName] as Texture | undefined;\n\t\t\tif (value && value.uuid && value instanceof Texture) {\n\t\t\t\ttextureByPropertyName.set(propertyName, value);\n\t\t\t\t(material as any)[propertyName] = null;\n\t\t\t}\n\t\t}\n\n\t\tcallback();\n\n\t\ttextureByPropertyName.forEach((texture, uniformName) => {\n\t\t\t(material as any)[uniformName] = texture;\n\t\t});\n\t}\n\n\t//\n\t//\n\t// LOAD MAT\n\t//\n\t//\n\tprotected _loadMaterial(data: MaterialData): ShaderMaterialWithCustomMaterials | undefined {\n\t\t// hack fix for properties that are assumed to be on normal materials\n\t\t// but are not on ShaderMaterial\n\t\tdata.color = undefined;\n\n\t\tconst loader = new MaterialLoader();\n\t\tMonkeyPatchMaterial();\n\t\tconst material = loader.parse(data) as ShaderMaterialWithCustomMaterials;\n\t\t// TODO: wait for https://github.com/mrdoob/three.js/pull/21428\n\t\t// to be merged\n\t\t// if ((data as any).shadowSide) {\n\t\t// \tmaterial.shadowSide = (data as any).shadowSide;\n\t\t// }\n\n\t\tif ((data as any).depthPacking) {\n\t\t\t((<unknown>material) as MeshDepthMaterial).depthPacking = (data as any).depthPacking;\n\t\t}\n\n\t\t// TODO: compensates for lights not being saved (and therefore cannot be loaded correctly)\n\t\tif (data.lights != null) {\n\t\t\tmaterial.lights = data.lights;\n\t\t}\n\n\t\tconst uniforms = material.uniforms;\n\t\tif (uniforms) {\n\t\t\t// fix matrix that may be loaded as a mat4 instead of a mat3\n\t\t\tconst uv2Transform = uniforms.uv2Transform;\n\t\t\tif (uv2Transform) {\n\t\t\t\tthis.mat4ToMat3(uv2Transform);\n\t\t\t}\n\t\t\tconst uvTransform = uniforms.uvTransform;\n\t\t\tif (uvTransform) {\n\t\t\t\tthis.mat4ToMat3(uvTransform);\n\t\t\t}\n\t\t}\n\t\treturn material as ShaderMaterialWithCustomMaterials;\n\t}\n\tprivate mat4ToMat3(uniform: IUniform) {\n\t\tconst mat4 = uniform.value;\n\t\tconst last_element = mat4.elements[mat4.elements.length - 1];\n\t\tif (last_element == null) {\n\t\t\tconst mat3 = new Matrix3();\n\t\t\tfor (let i = 0; i < mat3.elements.length; i++) {\n\t\t\t\tmat3.elements[i] = mat4.elements[i];\n\t\t\t}\n\t\t\tuniform.value = mat3;\n\t\t}\n\t}\n}\n","import {BaseNodeClassWithDisplayFlag, BaseNodeType} from '../_Base';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\n\ntype DisplayControllerCallback = () => void;\nexport interface DisplayNodeControllerCallbacks {\n\tonDisplayNodeRemove: DisplayControllerCallback;\n\tonDisplayNodeSet: DisplayControllerCallback;\n\tonDisplayNodeUpdate: DisplayControllerCallback;\n}\n\n/*\nhandles callbacks when the children's display flag is updated\n*/\ninterface DisplayNodeControllerOptions {\n\tdependsOnDisplayNode: boolean;\n}\nconst DEFAULT_DISPLAY_NODE_CONTROLLER_OPTIONS: DisplayNodeControllerOptions = {\n\tdependsOnDisplayNode: true,\n};\nfunction _warnNotInitialized(node: BaseNodeType) {\n\tconsole.error('displayNodeController not initialized', node);\n}\nfunction _warnAlreadyInitialized(node: BaseNodeType) {\n\tconsole.error('displayNodeController already initialed', node);\n}\nexport class DisplayNodeController {\n\tprivate _initialized: boolean = false;\n\tprivate _graphNode: CoreGraphNode;\n\tprivate _displayNode: BaseNodeClassWithDisplayFlag | undefined = undefined;\n\tprivate _displayNodeOverride: BaseNodeClassWithDisplayFlag | undefined = undefined;\n\tprivate _onDisplayNodeRemoveCallback: DisplayControllerCallback | undefined;\n\tprivate _onDisplayNodeSetCallback: DisplayControllerCallback | undefined;\n\tprivate _onDisplayNodeUpdateCallback: DisplayControllerCallback | undefined;\n\n\t// TODO: the node could be a different than BaseNodeType\n\t// at least there should be a way to infer that it is a node\n\t// with children that have a display flag. This would avoid all the flags?.display?... below\n\tconstructor(\n\t\tprotected node: BaseNodeType,\n\t\tcallbacks: DisplayNodeControllerCallbacks,\n\t\tprivate options: DisplayNodeControllerOptions = DEFAULT_DISPLAY_NODE_CONTROLLER_OPTIONS\n\t) {\n\t\tthis._graphNode = new CoreGraphNode(node.scene(), `DisplayNodeController-${node.name()}`);\n\n\t\tthis._onDisplayNodeRemoveCallback = callbacks.onDisplayNodeRemove;\n\t\tthis._onDisplayNodeSetCallback = callbacks.onDisplayNodeSet;\n\t\tthis._onDisplayNodeUpdateCallback = callbacks.onDisplayNodeUpdate;\n\t}\n\n\tdispose() {\n\t\tthis._graphNode.dispose();\n\t}\n\n\tdisplayNode() {\n\t\treturn this._displayNodeOverride || this._displayNode;\n\t}\n\tfirstNonBypassedDisplayNode() {\n\t\treturn this.displayNode()?.containerController.firstNonBypassedNode();\n\t}\n\n\tinitializeNode() {\n\t\tif (this._initialized) {\n\t\t\t_warnAlreadyInitialized(this.node);\n\t\t\treturn;\n\t\t}\n\t\tthis._initialized = true;\n\n\t\tthis.node.lifecycle.onChildAdd((childNode) => {\n\t\t\tif (!this._displayNode) {\n\t\t\t\tchildNode.flags?.display?.set(true);\n\t\t\t}\n\t\t});\n\t\tthis.node.lifecycle.onChildRemove((childNode) => {\n\t\t\tif (childNode.graphNodeId() == this._displayNode?.graphNodeId()) {\n\t\t\t\tconst children = this.node.children();\n\t\t\t\t// Go through each child in reverse until one has a display flag.\n\t\t\t\t// we should not simoly check the last child, as it may not have a display flag\n\t\t\t\t// (like a network node).\n\t\t\t\tfor (let i = children.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst child = children[i];\n\t\t\t\t\tconst displayFlag = child.flags?.display;\n\t\t\t\t\tif (displayFlag) {\n\t\t\t\t\t\tdisplayFlag.set(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.setDisplayNode(undefined);\n\t\t\t}\n\t\t});\n\t\tthis._graphNode.dirtyController.addPostDirtyHook('_requestDisplayNodeContainer', () => {\n\t\t\tif (this._onDisplayNodeUpdateCallback) {\n\t\t\t\tthis._onDisplayNodeUpdateCallback();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetDisplayNodeOverride(newDisplayNodeOverride: BaseNodeClassWithDisplayFlag | undefined) {\n\t\tif (!this._initialized) {\n\t\t\t_warnNotInitialized(this.node);\n\t\t}\n\n\t\tconst currentDisplayNode = this._displayNodeOverride;\n\t\tif (currentDisplayNode != newDisplayNodeOverride) {\n\t\t\tconst oldDisplayNode = currentDisplayNode;\n\t\t\tif (oldDisplayNode) {\n\t\t\t\t// oldDisplayNode.flags.display.set(false);\n\t\t\t\tif (this.options.dependsOnDisplayNode) {\n\t\t\t\t\tthis._graphNode.removeGraphInput(oldDisplayNode);\n\t\t\t\t}\n\t\t\t\tif (this._onDisplayNodeRemoveCallback) {\n\t\t\t\t\tthis._onDisplayNodeRemoveCallback();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._displayNodeOverride = newDisplayNodeOverride;\n\t\t\tif (newDisplayNodeOverride) {\n\t\t\t\tif (this.options.dependsOnDisplayNode) {\n\t\t\t\t\tthis._graphNode.addGraphInput(newDisplayNodeOverride);\n\t\t\t\t}\n\t\t\t\tif (this._onDisplayNodeSetCallback) {\n\t\t\t\t\tthis._onDisplayNodeSetCallback();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this._displayNode) {\n\t\t\t\t\tthis._commitDisplayNode(this._displayNode);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetDisplayNode(newDisplayNode: BaseNodeClassWithDisplayFlag | undefined) {\n\t\tif (!this._initialized) {\n\t\t\t_warnNotInitialized(this.node);\n\t\t}\n\n\t\tconst currentDisplayNode = this._displayNode;\n\t\tif (currentDisplayNode != newDisplayNode) {\n\t\t\tconst oldDisplayNode = currentDisplayNode;\n\t\t\tif (oldDisplayNode) {\n\t\t\t\toldDisplayNode.flags.display.set(false);\n\t\t\t\tif (this.options.dependsOnDisplayNode) {\n\t\t\t\t\tthis._graphNode.removeGraphInput(oldDisplayNode);\n\t\t\t\t}\n\t\t\t\tif (this._onDisplayNodeRemoveCallback) {\n\t\t\t\t\tthis._onDisplayNodeRemoveCallback();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._displayNode = newDisplayNode;\n\t\t\tif (newDisplayNode) {\n\t\t\t\tthis._commitDisplayNode(newDisplayNode);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _commitDisplayNode(newDisplayNode: BaseNodeClassWithDisplayFlag) {\n\t\tif (this.options.dependsOnDisplayNode) {\n\t\t\tthis._graphNode.addGraphInput(newDisplayNode);\n\t\t}\n\t\tif (this._onDisplayNodeSetCallback) {\n\t\t\tthis._onDisplayNodeSetCallback();\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../../_Base';\n\ntype FlagHookCallback = () => void;\n\nexport class BaseFlag {\n\tprotected _state: boolean = true;\n\tprotected _hooks: FlagHookCallback[] | null = null;\n\tconstructor(protected node: BaseNodeType) {}\n\n\tonUpdate(hook: FlagHookCallback) {\n\t\tthis._hooks = this._hooks || [];\n\t\tthis._hooks.push(hook);\n\t}\n\tprotected _onUpdate() {}\n\tset(newState: boolean) {\n\t\tif (this._state != newState) {\n\t\t\tif (this.node.insideALockedParent()) {\n\t\t\t\tconst lockedParent = this.node.lockedParent();\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`node '${this.node.path()}' cannot have its flag changed, since it is inside '${\n\t\t\t\t\t\tlockedParent ? lockedParent.path() : ''\n\t\t\t\t\t}', which is locked`\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._state = newState;\n\t\t\tthis._onUpdate();\n\t\t\tthis.runHooks();\n\t\t}\n\t}\n\tactive() {\n\t\treturn this._state;\n\t}\n\ttoggle() {\n\t\tthis.set(!this._state);\n\t}\n\tprivate runHooks() {\n\t\tif (this._hooks) {\n\t\t\tfor (const hook of this._hooks) {\n\t\t\t\thook();\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseFlag} from './Base';\nimport {NodeEvent} from '../../../poly/NodeEvent';\n\nexport class BypassFlag extends BaseFlag {\n\tprotected override _state: boolean = false;\n\tprotected override _onUpdate() {\n\t\tthis.node.emit(NodeEvent.FLAG_BYPASS_UPDATED);\n\t\tthis.node.setDirty();\n\t}\n}\n","import {BaseFlag} from './Base';\nimport {NodeEvent} from '../../../poly/NodeEvent';\n\nexport class DisplayFlag extends BaseFlag {\n\tprotected override _onUpdate() {\n\t\tthis.node.emit(NodeEvent.FLAG_DISPLAY_UPDATED);\n\t\t// this.node.setDirty();\n\t}\n}\n","import {BaseFlag} from './Base';\nimport {NodeEvent} from '../../../poly/NodeEvent';\n\nexport class OptimizeFlag extends BaseFlag {\n\tprotected override _state: boolean = false;\n\tprotected override _onUpdate() {\n\t\tthis.node.emit(NodeEvent.FLAG_OPTIMIZE_UPDATED);\n\t}\n}\n","import {Constructor} from '../../../types/GlobalTypes';\nimport {BaseNodeType} from '../_Base';\nimport {BypassFlag} from './flags/Bypass';\nimport {DisplayFlag} from './flags/Display';\nimport {OptimizeFlag} from './flags/Optimize';\n\nexport class FlagsController {\n\tpublic readonly bypass: DisplayFlag | undefined;\n\tpublic readonly display: BypassFlag | undefined;\n\tpublic readonly optimize: OptimizeFlag | undefined;\n\tconstructor(public readonly node: BaseNodeType) {}\n\thasDisplay(): boolean {\n\t\treturn false;\n\t}\n\thasBypass(): boolean {\n\t\treturn false;\n\t}\n\thasOptimize(): boolean {\n\t\treturn false;\n\t}\n}\n\nfunction Display<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tpublic readonly node!: BaseNodeType;\n\t\tpublic display: DisplayFlag = new DisplayFlag(this.node);\n\t\thasDisplay(): boolean {\n\t\t\treturn true;\n\t\t}\n\t};\n}\nfunction Bypass<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tpublic readonly node!: BaseNodeType;\n\t\tpublic readonly bypass: BypassFlag = new BypassFlag(this.node);\n\t\thasBypass(): boolean {\n\t\t\treturn true;\n\t\t}\n\t};\n}\nfunction Optimize<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\tpublic readonly node!: BaseNodeType;\n\t\tpublic readonly optimize: OptimizeFlag = new OptimizeFlag(this.node);\n\t\thasOptimize(): boolean {\n\t\t\treturn true;\n\t\t}\n\t};\n}\n\nexport class FlagsControllerD extends Display(FlagsController) {}\nexport class FlagsControllerB extends Bypass(FlagsController) {}\nexport class FlagsControllerDB extends Bypass(Display(FlagsController)) {}\nexport class FlagsControllerBO extends Optimize(Bypass(FlagsController)) {}\nexport class FlagsControllerDBO extends Optimize(Bypass(Display(FlagsController))) {}\n","import {ParamType} from '../../../../poly/ParamType';\nimport {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';\n\nimport {TypedParam, BaseParamType} from '../../../../params/_Base';\nimport {NodeContext} from '../../../../poly/NodeContext';\nimport {BaseNodeType} from '../../../_Base';\nimport {ParamOptions} from '../../../../params/utils/OptionsController';\n\n// import {ParamValueComparer} from '../../params/ParamValueComparer';\n// import {ParamValueCloner} from '../../params/ParamValueCloner';\n// import {CoreTextureLoader} from '../../../../../Core/Loader/Texture'\n\nexport class BaseParamConfig<T extends ParamType> {\n\t// private _texture_loader: CoreTextureLoader\n\n\tconstructor(protected _type: T, protected _name: string, protected _defaultValue: ParamInitValuesTypeMap[T]) {\n\t\tif (_name == '' || _name == null) {\n\t\t\tthrow new Error(`name must not be an empty string`);\n\t\t}\n\t}\n\n\tstatic fromParam<K extends ParamType>(param: TypedParam<K>): BaseParamConfig<K> {\n\t\treturn new BaseParamConfig<K>(param.type(), param.name(), param.defaultValue());\n\t}\n\n\ttype() {\n\t\treturn this._type;\n\t}\n\tname() {\n\t\treturn this._name;\n\t}\n\tdefaultValue() {\n\t\treturn this._defaultValue;\n\t}\n\n\tparamOptions(): ParamOptions {\n\t\tconst callbackBound = this._callback.bind(this);\n\t\tswitch (this._type) {\n\t\t\tcase ParamType.NODE_PATH:\n\t\t\t\treturn {callback: callbackBound, nodeSelection: {context: NodeContext.COP}};\n\t\t\tdefault:\n\t\t\t\treturn {callback: callbackBound};\n\t\t}\n\t}\n\tapplyToNode(node: BaseNodeType) {\n\t\tif (!node.params.has(this._name)) {\n\t\t\treturn;\n\t\t}\n\t\tconst param = node.params.get(this._name);\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tconst additionalOptions = this.paramOptions();\n\t\tconst additionalOptionNames = Object.keys(additionalOptions) as Array<keyof ParamOptions>;\n\t\tfor (const optionName of additionalOptionNames) {\n\t\t\tparam.options.setOption(optionName, additionalOptions[optionName]);\n\t\t}\n\n\t\t// We force the param configs to run their callbacks to ensure that the uniforms are up to date.\n\t\t// This seems better than running the parameter options callback, since it would check\n\t\t// if the scene is loading or the node cooking, which is unnecessary for uniforms\n\t\tthis.executeCallback(node, param);\n\n\t\t// we also have a special case for operator path,\n\t\t// since they would not have found their node at load time\n\t\tif (param.type() == ParamType.NODE_PATH) {\n\t\t\tsetTimeout(async () => {\n\t\t\t\tif (param.isDirty()) {\n\t\t\t\t\tawait param.compute();\n\t\t\t\t}\n\t\t\t\tparam.options.executeCallback();\n\t\t\t}, 200);\n\t\t}\n\t}\n\texecuteCallback(node: BaseNodeType, param: BaseParamType) {\n\t\tthis._callback(node, param);\n\t}\n\n\tprotected _callback(node: BaseNodeType, param: BaseParamType) {}\n}\n","// import {ParamType} from '../../../../poly/ParamType';\n// import {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';\n// import {GlParamConfig} from '../../../gl/code/utils/ParamConfig';\nimport {ParamConfig} from '../../params/ParamsConfig';\n\nexport class ParamConfigsController<PC extends ParamConfig> {\n\tprivate _param_configs: PC[] = [];\n\n\treset() {\n\t\tthis._param_configs = [];\n\t}\n\n\tpush(param_config: PC) {\n\t\tthis._param_configs.push(param_config);\n\t}\n\t// create_and_push<T extends ParamType>(\n\t// \ttype: T,\n\t// \tname: string,\n\t// \tdefault_value: ParamInitValuesTypeMap[T],\n\t// \tuniform_name: string\n\t// ) {\n\t// \tconst param_config = new GlParamConfig(type, name, default_value, uniform_name);\n\t// \tconsole.log('new param_config', param_config);\n\t// \tthis._param_configs.push(param_config);\n\t// }\n\n\tlist(): Readonly<PC[]> {\n\t\treturn this._param_configs;\n\t}\n}\n","const _filteredLines: string[] = [];\nexport class TranspiledFilter {\n\tstatic filter(transpiled_javascript: string) {\n\t\tconst lines = transpiled_javascript.split('\\n');\n\t\t_filteredLines.length = 0;\n\t\tfor (let line of lines) {\n\t\t\tif (!line.match(/import {.*} from '.*'/)) {\n\t\t\t\tline = line.replace('export ', 'return ');\n\t\t\t\t_filteredLines.push(line);\n\t\t\t}\n\t\t}\n\t\treturn _filteredLines.join('\\n');\n\t}\n}\n","import {EventDispatcher,BaseEvent} from 'three';\nimport {BaseNodeByContextMap, NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\n// import {NodeTypeMap} from '../../../containers/utils/ContainerMap';\nimport {ConnectionPointTypeMap} from './connections/ConnectionMap';\ninterface DisconnectionOptions {\n\tsetInput?: boolean;\n\tignoreLockedState?: boolean;\n}\nexport const NODE_CONNECTION_TRIGGERED_EVENT_NAME:'triggered' = 'triggered';\nexport const NODE_CONNECTION_TRIGGERED_EVENT:BaseEvent<'triggered'> = {type: NODE_CONNECTION_TRIGGERED_EVENT_NAME};\n\nexport class TypedNodeConnection<NC extends NodeContext> {\n\tprivate static _nextId: number = 0;\n\tprivate _id: number;\n\n\tconstructor(\n\t\tprivate _nodeSrc: TypedNode<NC, any>,\n\t\tprivate _nodeDest: TypedNode<NC, any>,\n\t\tprivate _outputIndex: number = 0,\n\t\tprivate _inputIndex: number = 0\n\t) {\n\t\tif (this._outputIndex == null) {\n\t\t\tthrow 'bad output index';\n\t\t}\n\t\tif (this._inputIndex == null) {\n\t\t\tthrow 'bad input index';\n\t\t}\n\n\t\tthis._id = TypedNodeConnection._nextId++;\n\n\t\tif (this._nodeSrc.io.connections && this._nodeDest.io.connections) {\n\t\t\tthis._nodeSrc.io.connections.addOutputConnection(this);\n\t\t\tthis._nodeDest.io.connections.addInputConnection(this);\n\t\t}\n\t}\n\tid() {\n\t\treturn this._id;\n\t}\n\n\tnodeSrc(): BaseNodeByContextMap[NC] {\n\t\treturn (<unknown>this._nodeSrc) as BaseNodeByContextMap[NC];\n\t}\n\tnodeDest(): BaseNodeByContextMap[NC] {\n\t\treturn (<unknown>this._nodeDest) as BaseNodeByContextMap[NC];\n\t}\n\toutputIndex() {\n\t\treturn this._outputIndex;\n\t}\n\tinputIndex() {\n\t\treturn this._inputIndex;\n\t}\n\tsrcConnectionPoint(): ConnectionPointTypeMap[NC] | undefined {\n\t\tconst connectionPoints = this._nodeSrc.io.outputs.namedOutputConnectionPoints();\n\t\tif (!connectionPoints) {\n\t\t\treturn;\n\t\t}\n\t\treturn connectionPoints[this._outputIndex];\n\t}\n\tdestConnectionPoint(): ConnectionPointTypeMap[NC] | undefined {\n\t\tconst connectionPoints = this._nodeDest.io.inputs.namedInputConnectionPoints();\n\t\tif (!connectionPoints) {\n\t\t\treturn;\n\t\t}\n\t\treturn connectionPoints[this._inputIndex];\n\t}\n\n\tdisconnect(options: DisconnectionOptions = {}) {\n\t\tif (this._nodeSrc.io.connections && this._nodeDest.io.connections) {\n\t\t\tthis._nodeSrc.io.connections.removeOutputConnection(this);\n\t\t\tthis._nodeDest.io.connections.removeInputConnection(this);\n\t\t}\n\n\t\tif (options.setInput === true) {\n\t\t\tthis._nodeDest.io.inputs.setInput(this._inputIndex, null, undefined, {\n\t\t\t\tignoreLockedState: options.ignoreLockedState,\n\t\t\t});\n\t\t}\n\t}\n\n\t// observer\n\tprivate __eventDispatcher: EventDispatcher<{triggered:any}> | undefined;\n\t_eventDispatcher() {\n\t\treturn this.__eventDispatcher;\n\t}\n\teventDispatcher() {\n\t\treturn (this.__eventDispatcher = this.__eventDispatcher || new EventDispatcher());\n\t}\n}\n","import {NodeContext} from '../../../poly/NodeContext';\nimport {TypedNode} from '../../_Base';\n\nexport class ParamsEditableStateController<NC extends NodeContext> {\n\tconstructor(private node: TypedNode<NC, any>) {}\n\n\tprivate _initialized = false;\n\tinitializeNode() {\n\t\tif (this._initialized) {\n\t\t\tconsole.warn('already initialized', this.node);\n\t\t\treturn;\n\t\t}\n\t\tthis._initialized = true;\n\t\tthis.node.io.inputs.add_on_set_input_hook(\n\t\t\t'_checkParamsEditableStateBound',\n\t\t\tthis._checkParamsEditableStateBound\n\t\t);\n\t}\n\tinitialized() {\n\t\treturn this._initialized;\n\t}\n\n\tprivate _checkParamsEditableStateBound = this._checkParamsEditableState.bind(this);\n\tprivate _checkParamsEditableState() {\n\t\tif (!this._paramsMatchEditableState()) {\n\t\t\tthis.updateParamsEditableStateIfNeeded();\n\t\t}\n\t}\n\n\tprivate _paramsMatchEditableState(): boolean {\n\t\tlet i = 0;\n\t\tconst params = this.node.params;\n\t\tconst connectionPoints = this.node.io.inputs.namedInputConnectionPoints();\n\t\tif (!connectionPoints) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (const connectionPoint of connectionPoints) {\n\t\t\tif (connectionPoint) {\n\t\t\t\tconst isConnected = this.node.io.inputs.input(i) != null;\n\t\t\t\tconst paramName = connectionPoint?.name();\n\t\t\t\tconst hasParam = params.has(paramName);\n\t\t\t\tif (hasParam) {\n\t\t\t\t\tconst param = params.get(paramName);\n\t\t\t\t\tif (param) {\n\t\t\t\t\t\tconst expectedEditableState = !isConnected;\n\t\t\t\t\t\tconst currentEditableState = param.options.editable();\n\t\t\t\t\t\tif (expectedEditableState != currentEditableState) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t\treturn true;\n\t}\n\n\tupdateParamsEditableStateIfNeeded() {\n\t\tlet i = 0;\n\t\tconst params = this.node.params;\n\t\tconst connectionPoints = this.node.io.inputs.namedInputConnectionPoints();\n\t\tif (!connectionPoints) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const connectionPoint of connectionPoints) {\n\t\t\tif (connectionPoint) {\n\t\t\t\tconst isConnected = this.node.io.inputs.input(i) != null;\n\t\t\t\tconst paramName = connectionPoint?.name();\n\t\t\t\tif (params.has(paramName)) {\n\t\t\t\t\tconst param = params.get(paramName);\n\t\t\t\t\tif (param) {\n\t\t\t\t\t\tconst requiredState = !isConnected;\n\t\t\t\t\t\tparam.options.setEditableState(requiredState);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n}\n","import  {BaseConnectionPoint} from './_Base';\nimport  {ParamType} from '../../../../poly/ParamType';\nimport type{ EventContext } from '../../../../../core/event/EventContextType';\n//\n//\n// Event Data types\n//\n//\n\nexport enum EventConnectionPointType {\n\tBASE = 'base',\n\tDRAG = 'drag',\n\tKEYBOARD = 'keyboard',\n\tMOUSE = 'mouse',\n\tPOINTER = 'pointer',\n}\n// interface IEventConnectionPointType {\n// \t[EventConnectionPointType.BASE]: Readonly<'base'>;\n// \t[EventConnectionPointType.KEYBOARD]: Readonly<'keyboard'>;\n// \t[EventConnectionPointType.MOUSE]: Readonly<'mouse'>;\n// }\n\n// export const ConnectionPointTypeGL: IEventConnectionPointType = {\n// \t[EventConnectionPointType.BASE]: 'base',\n// \t[EventConnectionPointType.KEYBOARD]: 'keyboard',\n// \t[EventConnectionPointType.MOUSE]: 'mouse',\n// };\n\n//\n//\n// ALL Event Data types in an array\n//\n//\nexport const EVENT_CONNECTION_POINT_TYPES: Array<EventConnectionPointType> = [\n\tEventConnectionPointType.BASE,\n\tEventConnectionPointType.DRAG,\n\tEventConnectionPointType.KEYBOARD,\n\tEventConnectionPointType.MOUSE,\n\tEventConnectionPointType.POINTER,\n];\n\nexport interface EventConnectionPointData<T extends EventConnectionPointType> {\n\tname: string;\n\ttype: T;\n\tisArray?: boolean;\n}\n\n\nexport class EventConnectionPoint<T extends EventConnectionPointType> extends BaseConnectionPoint {\n\tprotected override _json: EventConnectionPointData<T> | undefined;\n\n\tconstructor(\n\t\tprotected override _name: string,\n\t\tprotected override _type: T, // protected _init_value?: ConnectionPointInitValueMapGeneric[T]\n\t\tprotected _event_listener?: (event_context: EventContext<any>) => void\n\t) {\n\t\tsuper(_name, _type);\n\t\t// if (this._init_value === undefined) {\n\t\t// this._init_value = null\n\t\t// }\n\t}\n\toverride type() {\n\t\treturn this._type;\n\t}\n\tget param_type() {\n\t\treturn ParamType.FLOAT; // should never be used anyway\n\t}\n\toverride are_types_matched(src_type: string, dest_type: string): boolean {\n\t\tif (dest_type == EventConnectionPointType.BASE) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn src_type == dest_type;\n\t\t}\n\t}\n\tget event_listener() {\n\t\treturn this._event_listener;\n\t}\n\t// get param_type(): IConnectionPointTypeToParamTypeMap[T] {\n\t// \treturn ConnectionPointTypeToParamTypeMap[this._type];\n\t// }\n\t// get init_value() {\n\t// \treturn this._init_value;\n\t// }\n\n\toverride toJSON(): EventConnectionPointData<T> {\n\t\treturn (this._json = this._json || this._createJSON());\n\t}\n\tprotected override _createJSON(): EventConnectionPointData<T> {\n\t\treturn {\n\t\t\tname: this._name,\n\t\t\ttype: this._type,\n\t\t\tisArray: false,\n\t\t};\n\t}\n}\n\nexport type BaseEventConnectionPoint = EventConnectionPoint<EventConnectionPointType>;\n","import {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';\n\nimport {ParamType} from '../../../../poly/ParamType';\nimport {RampParam} from '../../../../params/Ramp';\n// import {BaseTypedConnection} from './_Base';\n\n// TODO: simplify GLDataType into one enum\n// http://learnwebgl.brown37.net/12_shader_language/glsl_data_types.html\n\n//\n//\n// GL Data types\n//\n//\n\nexport enum GlConnectionPointType {\n\tBOOL = 'bool',\n\t// BVEC2 = 'bvec2',\n\t// BVEC3 = 'bvec3',\n\t// BVEC4 = 'bvec4',\n\tINT = 'int',\n\t// IVEC2 = 'ivec2',\n\t// IVEC3 = 'ivec3',\n\t// IVEC4 = 'ivec4',\n\tFLOAT = 'float',\n\tMAT3 = 'mat3',\n\tMAT4 = 'mat4',\n\tVEC2 = 'vec2',\n\tVEC3 = 'vec3',\n\tVEC4 = 'vec4',\n\t// matrices to be used later\n\t// MAT2 = 'mat2',\n\t// MAT3 = 'mat3',\n\t// MAT4 = 'mat4',\n\tSAMPLER_2D = 'sampler2D',\n\tSAMPLER_2D_ARRAY = 'sampler2DArray',\n\tSAMPLER_3D = 'sampler3D',\n\tSAMPLER_CUBE = 'samplerCube',\n\tSSS_MODEL = 'SSSModel',\n\tSDF_CONTEXT = 'SDFContext',\n\tSDF_MATERIAL = 'SDFMaterial',\n}\n// interface IGlConnectionPointType {\n// \t[EnumGlConnectionPointType.BOOL]: Readonly<'bool'>;\n// \t// BVEC2 = 'bvec2',\n// \t// BVEC3 = 'bvec3',\n// \t// BVEC4 = 'bvec4',\n// \t[EnumGlConnectionPointType.INT]: Readonly<'int'>;\n// \t// IVEC2 = 'ivec2',\n// \t// IVEC3 = 'ivec3',\n// \t// IVEC4 = 'ivec4',\n// \t[EnumGlConnectionPointType.FLOAT]: Readonly<'float'>;\n// \t[EnumGlConnectionPointType.VEC2]: Readonly<'vec2'>;\n// \t[EnumGlConnectionPointType.VEC3]: Readonly<'vec3'>;\n// \t[EnumGlConnectionPointType.VEC4]: Readonly<'vec4'>;\n// \t// matrices to be used later\n// \t// MAT2 = 'mat2',\n// \t// MAT3 = 'mat3',\n// \t// MAT4 = 'mat4',\n// \t[EnumGlConnectionPointType.SAMPLER_2D]: Readonly<'sampler2D'>;\n// }\n\n// export const GlConnectionPointType: IGlConnectionPointType = {\n// \t[EnumGlConnectionPointType.BOOL]: 'bool',\n// \t// BVEC2 = 'bvec2',\n// \t// BVEC3 = 'bvec3',\n// \t// BVEC4 = 'bvec4',\n// \t[EnumGlConnectionPointType.INT]: 'int',\n// \t// IVEC2 = 'ivec2',\n// \t// IVEC3 = 'ivec3',\n// \t// IVEC4 = 'ivec4',\n// \t[EnumGlConnectionPointType.FLOAT]: 'float',\n// \t[EnumGlConnectionPointType.VEC2]: 'vec2',\n// \t[EnumGlConnectionPointType.VEC3]: 'vec3',\n// \t[EnumGlConnectionPointType.VEC4]: 'vec4',\n// \t// matrices to be used later\n// \t// MAT2 = 'mat2',\n// \t// MAT3 = 'mat3',\n// \t// MAT4 = 'mat4',\n// \t[EnumGlConnectionPointType.SAMPLER_2D]: 'sampler2D',\n// };\n\n//\n//\n// ALL GL Data types in an array\n//\n//\nexport const GL_CONNECTION_POINT_TYPES: Array<GlConnectionPointType> = [\n\tGlConnectionPointType.BOOL,\n\t// ConnectionPointType.BVEC2,\n\t// ConnectionPointType.BVEC3,\n\t// ConnectionPointType.BVEC4,\n\tGlConnectionPointType.INT,\n\t// ConnectionPointType.IVEC2,\n\t// ConnectionPointType.IVEC3,\n\t// ConnectionPointType.IVEC4,\n\tGlConnectionPointType.FLOAT,\n\tGlConnectionPointType.VEC2,\n\tGlConnectionPointType.VEC3,\n\tGlConnectionPointType.VEC4,\n\tGlConnectionPointType.MAT3,\n\tGlConnectionPointType.MAT4,\n\tGlConnectionPointType.SAMPLER_2D,\n\tGlConnectionPointType.SSS_MODEL,\n\tGlConnectionPointType.SDF_CONTEXT,\n\tGlConnectionPointType.SDF_MATERIAL,\n];\nexport const GL_CONNECTION_POINT_TYPES_FOR_CONSTANT: Array<GlConnectionPointType> = [\n\tGlConnectionPointType.BOOL,\n\tGlConnectionPointType.INT,\n\tGlConnectionPointType.FLOAT,\n\tGlConnectionPointType.VEC2,\n\tGlConnectionPointType.VEC3,\n\tGlConnectionPointType.VEC4,\n];\n\n//\n//\n// Map to convert from a GL Data type to a ParamType\n//\n//\ntype GlConnectionPointTypeToParamTypeMapGeneric = {[key in GlConnectionPointType]: ParamType};\nexport interface GlIConnectionPointTypeToParamTypeMap extends GlConnectionPointTypeToParamTypeMapGeneric {\n\t[GlConnectionPointType.BOOL]: ParamType.BOOLEAN;\n\t// [ConnectionPointType.BVEC2]: [ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC3]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC4]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t[GlConnectionPointType.INT]: ParamType.INTEGER;\n\t// [ConnectionPointType.IVEC2]: [ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC3]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC4]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t[GlConnectionPointType.FLOAT]: ParamType.FLOAT;\n\t[GlConnectionPointType.VEC2]: ParamType.VECTOR2;\n\t[GlConnectionPointType.VEC3]: ParamType.VECTOR3;\n\t[GlConnectionPointType.VEC4]: ParamType.VECTOR4;\n\t[GlConnectionPointType.MAT3]: ParamType.BUTTON;\n\t[GlConnectionPointType.MAT4]: ParamType.BUTTON;\n}\nexport const GlConnectionPointTypeToParamTypeMap: GlIConnectionPointTypeToParamTypeMap = {\n\t[GlConnectionPointType.BOOL]: ParamType.BOOLEAN,\n\t// [ConnectionPointType.BVEC2]: [ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC3]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC4]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t[GlConnectionPointType.INT]: ParamType.INTEGER,\n\t// [ConnectionPointType.IVEC2]: [ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC3]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC4]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t[GlConnectionPointType.FLOAT]: ParamType.FLOAT,\n\t[GlConnectionPointType.VEC2]: ParamType.VECTOR2,\n\t[GlConnectionPointType.VEC3]: ParamType.VECTOR3,\n\t[GlConnectionPointType.VEC4]: ParamType.VECTOR4,\n\t[GlConnectionPointType.MAT3]: ParamType.BUTTON,\n\t[GlConnectionPointType.MAT4]: ParamType.BUTTON,\n\n\t[GlConnectionPointType.SAMPLER_2D]: ParamType.RAMP,\n\t[GlConnectionPointType.SAMPLER_2D_ARRAY]: ParamType.RAMP,\n\t[GlConnectionPointType.SAMPLER_3D]: ParamType.RAMP,\n\t[GlConnectionPointType.SAMPLER_CUBE]: ParamType.RAMP,\n\t[GlConnectionPointType.SSS_MODEL]: ParamType.STRING,\n\t[GlConnectionPointType.SDF_CONTEXT]: ParamType.STRING,\n\t[GlConnectionPointType.SDF_MATERIAL]: ParamType.STRING,\n};\n\n//\n//\n// Map to convert from a ParamType to GL Data type\n//\n//\ntype GLParamTypeToConnectionPointTypeMapGeneric = {[key in ParamType]: GlConnectionPointType | undefined};\nexport interface IGLParamTypeToConnectionPointTypeMap extends GLParamTypeToConnectionPointTypeMapGeneric {\n\t[ParamType.BOOLEAN]: GlConnectionPointType.BOOL;\n\t[ParamType.COLOR]: GlConnectionPointType.VEC3;\n\t// [ConnectionPointType.BVEC2]: [ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC3]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC4]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t[ParamType.INTEGER]: GlConnectionPointType.INT;\n\t// [ConnectionPointType.IVEC2]: [ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC3]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC4]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t[ParamType.FLOAT]: GlConnectionPointType.FLOAT;\n\t[ParamType.FOLDER]: undefined;\n\t[ParamType.VECTOR2]: GlConnectionPointType.VEC2;\n\t[ParamType.VECTOR3]: GlConnectionPointType.VEC3;\n\t[ParamType.VECTOR4]: GlConnectionPointType.VEC4;\n\t[ParamType.BUTTON]: undefined;\n\t// [ParamType.OPERATOR_PATH]: undefined;\n\t[ParamType.NODE_PATH]: undefined;\n\t[ParamType.PARAM_PATH]: undefined;\n\t[ParamType.RAMP]: undefined;\n\t[ParamType.STRING]: undefined;\n}\nexport const GLParamTypeToConnectionPointTypeMap: IGLParamTypeToConnectionPointTypeMap = {\n\t[ParamType.BOOLEAN]: GlConnectionPointType.BOOL,\n\t[ParamType.COLOR]: GlConnectionPointType.VEC3,\n\t// [ConnectionPointType.BVEC2]: [ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC3]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC4]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t[ParamType.INTEGER]: GlConnectionPointType.INT,\n\t// [ConnectionPointType.IVEC2]: [ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC3]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC4]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t[ParamType.FLOAT]: GlConnectionPointType.FLOAT,\n\t[ParamType.FOLDER]: undefined,\n\t[ParamType.VECTOR2]: GlConnectionPointType.VEC2,\n\t[ParamType.VECTOR3]: GlConnectionPointType.VEC3,\n\t[ParamType.VECTOR4]: GlConnectionPointType.VEC4,\n\t[ParamType.BUTTON]: undefined,\n\t// [ParamType.OPERATOR_PATH]: undefined,\n\t[ParamType.PARAM_PATH]: undefined,\n\t[ParamType.NODE_PATH]: undefined,\n\t[ParamType.RAMP]: undefined,\n\t[ParamType.STRING]: undefined,\n};\n\n//\n//\n// Map of GL Data type default values\n//\n//\nexport type GlConnectionPointInitValueMapGeneric = {\n\t[key in GlConnectionPointType]: ParamInitValuesTypeMap[GlIConnectionPointTypeToParamTypeMap[key]];\n};\nexport const GlConnectionPointInitValueMap: GlConnectionPointInitValueMapGeneric = {\n\t[GlConnectionPointType.BOOL]: false,\n\t// [ConnectionPointType.BVEC2]: [ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC3]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC4]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t[GlConnectionPointType.INT]: 0,\n\t// [ConnectionPointType.IVEC2]: [ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC3]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC4]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t[GlConnectionPointType.FLOAT]: 0,\n\t[GlConnectionPointType.VEC2]: [0, 0],\n\t[GlConnectionPointType.VEC3]: [0, 0, 0],\n\t[GlConnectionPointType.VEC4]: [0, 0, 0, 0],\n\t[GlConnectionPointType.MAT3]: null,\n\t[GlConnectionPointType.MAT4]: null,\n\n\t[GlConnectionPointType.SAMPLER_2D]: RampParam.DEFAULT_VALUE_JSON,\n\t[GlConnectionPointType.SAMPLER_2D_ARRAY]: RampParam.DEFAULT_VALUE_JSON,\n\t[GlConnectionPointType.SAMPLER_3D]: RampParam.DEFAULT_VALUE_JSON,\n\t[GlConnectionPointType.SAMPLER_CUBE]: RampParam.DEFAULT_VALUE_JSON,\n\t[GlConnectionPointType.SSS_MODEL]: 'SSSModel()',\n\t[GlConnectionPointType.SDF_CONTEXT]: 'DefaultSDFContext()',\n\t[GlConnectionPointType.SDF_MATERIAL]: 'DefaultSDFMaterial()',\n};\n\n//\n//\n// Map of GL Data type component counts\n//\n//\nexport type ConnectionPointComponentsCountMapGeneric = {\n\t[key in GlConnectionPointType]: number;\n};\nexport const GlConnectionPointComponentsCountMap: ConnectionPointComponentsCountMapGeneric = {\n\t[GlConnectionPointType.BOOL]: 1,\n\t// [ConnectionPointType.BVEC2]: [ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC3]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t// [ConnectionPointType.BVEC4]: [ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN, ParamType.BOOLEAN]\n\t[GlConnectionPointType.INT]: 1,\n\t// [ConnectionPointType.IVEC2]: [ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC3]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t// [ConnectionPointType.IVEC4]: [ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER, ParamType.INTEGER];\n\t[GlConnectionPointType.FLOAT]: 1,\n\t[GlConnectionPointType.VEC2]: 2,\n\t[GlConnectionPointType.VEC3]: 3,\n\t[GlConnectionPointType.VEC4]: 4,\n\t[GlConnectionPointType.MAT3]: 9,\n\t[GlConnectionPointType.MAT4]: 16,\n\t[GlConnectionPointType.SAMPLER_2D]: 1,\n\t[GlConnectionPointType.SAMPLER_2D_ARRAY]: 1,\n\t[GlConnectionPointType.SAMPLER_3D]: 1,\n\t[GlConnectionPointType.SAMPLER_CUBE]: 1,\n\t[GlConnectionPointType.SSS_MODEL]: 1,\n\t[GlConnectionPointType.SDF_CONTEXT]: 1,\n\t[GlConnectionPointType.SDF_MATERIAL]: 1,\n};\n\n// import {\n// ConnectionPointType,\n// ConnectionPointInitValueMapGeneric,\n// ConnectionPointInitValueMap,\n// ConnectionPointTypeToParamTypeMap,\n// IConnectionPointTypeToParamTypeMap,\n// } from '../ConnectionPointType';\n// import {ParamInitValuesTypeMap} from '../params/ParamsController';\n\nexport interface GlConnectionPointData<T extends GlConnectionPointType> {\n\tname: string;\n\ttype: T;\n\tisArray?: boolean;\n}\n\nimport {BaseConnectionPoint} from './_Base';\nexport class GlConnectionPoint<T extends GlConnectionPointType> extends BaseConnectionPoint {\n\tprotected override _json: GlConnectionPointData<T> | undefined;\n\t// protected _init_value: any;\n\n\tconstructor(\n\t\tprotected override _name: string,\n\t\tprotected override _type: T,\n\t\tprotected override _init_value?: GlConnectionPointInitValueMapGeneric[T]\n\t) {\n\t\tsuper(_name, _type);\n\t\t// if (this._init_value === undefined) {\n\t\tthis._init_value = this._init_value || GlConnectionPointInitValueMap[this._type];\n\t\t// }\n\t}\n\toverride type() {\n\t\treturn this._type;\n\t}\n\toverride are_types_matched(src_type: string, dest_type: string): boolean {\n\t\treturn src_type == dest_type;\n\t}\n\tget param_type(): GlIConnectionPointTypeToParamTypeMap[T] {\n\t\treturn GlConnectionPointTypeToParamTypeMap[this._type];\n\t}\n\toverride get init_value() {\n\t\treturn this._init_value;\n\t}\n\n\toverride toJSON(): GlConnectionPointData<T> {\n\t\treturn (this._json = this._json || this._createJSON());\n\t}\n\tprotected override _createJSON(): GlConnectionPointData<T> {\n\t\treturn {\n\t\t\tname: this._name,\n\t\t\ttype: this._type,\n\t\t\t// isArray: false,\n\t\t};\n\t}\n}\n\nexport type BaseGlConnectionPoint = GlConnectionPoint<GlConnectionPointType>;\n","import {Plane} from '@jscad/modeling/src/maths/plane';\nimport {\n\tAnimationAction,\n\tAnimationMixer,\n\tBox3,\n\tCamera,\n\tCatmullRomCurve3,\n\tColor,\n\tMatrix4,\n\tQuaternion,\n\tVector2,\n\tVector3,\n\tVector4,\n\tIntersection,\n\tMaterial,\n\tObject3D,\n\tRay,\n\tSphere,\n\tTexture,\n\tEuler,\n} from 'three';\nimport {ParamInitValuesTypeMap} from '../../../../params/types/ParamInitValuesTypeMap';\nimport {ParamType} from '../../../../poly/ParamType';\nimport {BaseConnectionPoint} from './_Base';\nimport {BaseParamType} from '../../../../params/_Base';\nimport {BaseNodeType} from '../../../_Base';\n\nexport enum JsConnectionPointType {\n\tANIMATION_MIXER = 'AnimationMixer',\n\tANIMATION_ACTION = 'AnimationAction',\n\tBOOLEAN = 'boolean',\n\tBOOLEAN_ARRAY = 'boolean[]',\n\tBOX3 = 'Box3',\n\tCAMERA = 'Camera',\n\tCATMULL_ROM_CURVE3 = 'CatmullRomCurve3',\n\tCOLOR = 'Color',\n\tCOLOR_ARRAY = 'Color[]',\n\tEULER = 'Euler',\n\tEULER_ARRAY = 'Euler[]',\n\tFLOAT = 'float',\n\tFLOAT_ARRAY = 'float[]',\n\tINT = 'int',\n\tINT_ARRAY = 'int[]',\n\tINTERSECTION = 'Intersection',\n\tINTERSECTION_ARRAY = 'Intersection[]',\n\tMATERIAL = 'Material',\n\tMATRIX4 = 'Matrix4',\n\tMATRIX4_ARRAY = 'Matrix4[]',\n\tNODE = 'Node',\n\tOBJECT_3D = 'Object3D',\n\tOBJECT_3D_ARRAY = 'Object3D[]',\n\tPARAM = 'Param',\n\tPLANE = 'Plane',\n\tQUATERNION = 'Quaternion',\n\tQUATERNION_ARRAY = 'Quaternion[]',\n\tRAY = 'Ray',\n\tSPHERE = 'Sphere',\n\tSTRING = 'string',\n\tSTRING_ARRAY = 'string[]',\n\tTEXTURE = 'Texture',\n\tTEXTURE_ARRAY = 'Texture[]',\n\tTRIGGER = 'trigger',\n\tVECTOR2 = 'Vector2',\n\tVECTOR2_ARRAY = 'Vector2[]',\n\tVECTOR3 = 'Vector3',\n\tVECTOR3_ARRAY = 'Vector3[]',\n\tVECTOR4 = 'Vector4',\n\tVECTOR4_ARRAY = 'Vector4[]',\n\t// MAT3 = 'mat3',\n\t// MAT4 = 'mat4',\n}\nexport type PrimitiveArrayElement = boolean | number | string;\nexport type VectorArrayElement = Color | Euler | Matrix4 | Quaternion | Vector2 | Vector3 | Vector4;\nconst NUMBER_JS_CONNECTION_TYPES = new Set([JsConnectionPointType.FLOAT, JsConnectionPointType.INT]);\nconst PRIMITIVE_JS_CONNECTION_TYPES = new Set([\n\tJsConnectionPointType.BOOLEAN,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.STRING,\n]);\nconst VECTOR_JS_CONNECTION_TYPES = new Set([\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n]);\nexport const JS_CONNECTION_TYPES_FOR_CONSTANT = [\n\tJsConnectionPointType.BOOLEAN,\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.STRING,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n];\nexport function isJsConnectionPointNumber(type: JsConnectionPointType) {\n\treturn NUMBER_JS_CONNECTION_TYPES.has(type);\n}\nexport function isJsConnectionPointPrimitive(type: JsConnectionPointType) {\n\treturn PRIMITIVE_JS_CONNECTION_TYPES.has(type);\n}\nexport function isJsConnectionPointVector(type: JsConnectionPointType) {\n\treturn VECTOR_JS_CONNECTION_TYPES.has(type);\n}\nexport function isJsConnectionPointArray(type: JsConnectionPointType) {\n\treturn ARRAY_JS_CONNECTION_TYPES_SET.has(type as JsConnectionPointTypeArray);\n}\n\n//\n//\n// ALL Js Data types in an array\n//\n//\nexport const JS_CONNECTION_POINT_TYPES: Array<JsConnectionPointType> = [\n\tJsConnectionPointType.ANIMATION_MIXER,\n\tJsConnectionPointType.ANIMATION_ACTION,\n\tJsConnectionPointType.BOX3,\n\tJsConnectionPointType.BOOLEAN,\n\tJsConnectionPointType.BOOLEAN_ARRAY,\n\tJsConnectionPointType.CAMERA,\n\tJsConnectionPointType.CATMULL_ROM_CURVE3,\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.COLOR_ARRAY,\n\tJsConnectionPointType.EULER,\n\tJsConnectionPointType.EULER_ARRAY,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.FLOAT_ARRAY,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.INT_ARRAY,\n\tJsConnectionPointType.INTERSECTION,\n\tJsConnectionPointType.INTERSECTION_ARRAY,\n\tJsConnectionPointType.MATERIAL,\n\tJsConnectionPointType.MATRIX4,\n\tJsConnectionPointType.MATRIX4_ARRAY,\n\tJsConnectionPointType.NODE,\n\tJsConnectionPointType.OBJECT_3D,\n\tJsConnectionPointType.OBJECT_3D_ARRAY,\n\tJsConnectionPointType.PARAM,\n\tJsConnectionPointType.PLANE,\n\tJsConnectionPointType.QUATERNION,\n\tJsConnectionPointType.QUATERNION_ARRAY,\n\tJsConnectionPointType.RAY,\n\tJsConnectionPointType.SPHERE,\n\tJsConnectionPointType.STRING,\n\tJsConnectionPointType.STRING_ARRAY,\n\tJsConnectionPointType.TEXTURE,\n\tJsConnectionPointType.TEXTURE_ARRAY,\n\tJsConnectionPointType.TRIGGER,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR2_ARRAY,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR3_ARRAY,\n\tJsConnectionPointType.VECTOR4,\n\tJsConnectionPointType.VECTOR4_ARRAY,\n\t// JsConnectionPointType.MAT3,\n\t// JsConnectionPointType.MAT4,\n];\n\ntype JsConnectionPointTypeToArrayTypeMapGeneric = {[key in JsConnectionPointType]: JsConnectionPointType};\nexport interface JsIConnectionPointTypeToArrayTypeMap extends JsConnectionPointTypeToArrayTypeMapGeneric {\n\t[JsConnectionPointType.ANIMATION_MIXER]: JsConnectionPointType.ANIMATION_MIXER;\n\t[JsConnectionPointType.ANIMATION_ACTION]: JsConnectionPointType.ANIMATION_ACTION;\n\t[JsConnectionPointType.BOOLEAN]: JsConnectionPointType.BOOLEAN_ARRAY;\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: JsConnectionPointType.BOOLEAN_ARRAY;\n\t[JsConnectionPointType.BOX3]: JsConnectionPointType.BOX3;\n\t[JsConnectionPointType.CAMERA]: JsConnectionPointType.CAMERA;\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: JsConnectionPointType.CATMULL_ROM_CURVE3;\n\t[JsConnectionPointType.COLOR]: JsConnectionPointType.COLOR_ARRAY;\n\t[JsConnectionPointType.COLOR_ARRAY]: JsConnectionPointType.COLOR_ARRAY;\n\t[JsConnectionPointType.EULER]: JsConnectionPointType.EULER_ARRAY;\n\t[JsConnectionPointType.EULER_ARRAY]: JsConnectionPointType.EULER_ARRAY;\n\t[JsConnectionPointType.FLOAT]: JsConnectionPointType.FLOAT_ARRAY;\n\t[JsConnectionPointType.FLOAT_ARRAY]: JsConnectionPointType.FLOAT_ARRAY;\n\t[JsConnectionPointType.INT]: JsConnectionPointType.INT_ARRAY;\n\t[JsConnectionPointType.INT_ARRAY]: JsConnectionPointType.INT_ARRAY;\n\t[JsConnectionPointType.INTERSECTION]: JsConnectionPointType.INTERSECTION_ARRAY;\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: JsConnectionPointType.INTERSECTION_ARRAY;\n\t[JsConnectionPointType.MATERIAL]: JsConnectionPointType.MATERIAL; //\n\t[JsConnectionPointType.MATRIX4]: JsConnectionPointType.MATRIX4_ARRAY; //\n\t[JsConnectionPointType.MATRIX4_ARRAY]: JsConnectionPointType.MATRIX4_ARRAY; //\n\t[JsConnectionPointType.NODE]: JsConnectionPointType.NODE; //\n\t[JsConnectionPointType.OBJECT_3D]: JsConnectionPointType.OBJECT_3D_ARRAY; //\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: JsConnectionPointType.OBJECT_3D_ARRAY; //\n\t[JsConnectionPointType.PARAM]: JsConnectionPointType.PARAM; //\n\t[JsConnectionPointType.PLANE]: JsConnectionPointType.PLANE; //\n\t[JsConnectionPointType.QUATERNION]: JsConnectionPointType.QUATERNION_ARRAY; //\n\t[JsConnectionPointType.QUATERNION_ARRAY]: JsConnectionPointType.QUATERNION_ARRAY; //\n\t[JsConnectionPointType.RAY]: JsConnectionPointType.RAY; //\n\t[JsConnectionPointType.SPHERE]: JsConnectionPointType.SPHERE; //\n\t[JsConnectionPointType.STRING]: JsConnectionPointType.STRING_ARRAY;\n\t[JsConnectionPointType.STRING_ARRAY]: JsConnectionPointType.STRING_ARRAY;\n\t[JsConnectionPointType.TEXTURE]: JsConnectionPointType.TEXTURE_ARRAY;\n\t[JsConnectionPointType.TEXTURE_ARRAY]: JsConnectionPointType.TEXTURE_ARRAY;\n\t[JsConnectionPointType.TRIGGER]: JsConnectionPointType.TRIGGER;\n\t[JsConnectionPointType.VECTOR2]: JsConnectionPointType.VECTOR2_ARRAY;\n\t[JsConnectionPointType.VECTOR2_ARRAY]: JsConnectionPointType.VECTOR2_ARRAY;\n\t[JsConnectionPointType.VECTOR3]: JsConnectionPointType.VECTOR3_ARRAY;\n\t[JsConnectionPointType.VECTOR3_ARRAY]: JsConnectionPointType.VECTOR3_ARRAY;\n\t[JsConnectionPointType.VECTOR4]: JsConnectionPointType.VECTOR4_ARRAY;\n\t[JsConnectionPointType.VECTOR4_ARRAY]: JsConnectionPointType.VECTOR4_ARRAY;\n}\nexport const JsConnectionPointTypeToArrayTypeMap: JsIConnectionPointTypeToArrayTypeMap = {\n\t[JsConnectionPointType.ANIMATION_MIXER]: JsConnectionPointType.ANIMATION_MIXER,\n\t[JsConnectionPointType.ANIMATION_ACTION]: JsConnectionPointType.ANIMATION_ACTION,\n\t[JsConnectionPointType.BOOLEAN]: JsConnectionPointType.BOOLEAN_ARRAY,\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: JsConnectionPointType.BOOLEAN_ARRAY,\n\t[JsConnectionPointType.BOX3]: JsConnectionPointType.BOX3,\n\t[JsConnectionPointType.CAMERA]: JsConnectionPointType.CAMERA,\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: JsConnectionPointType.CATMULL_ROM_CURVE3,\n\t[JsConnectionPointType.COLOR]: JsConnectionPointType.COLOR_ARRAY,\n\t[JsConnectionPointType.COLOR_ARRAY]: JsConnectionPointType.COLOR_ARRAY,\n\t[JsConnectionPointType.EULER]: JsConnectionPointType.EULER_ARRAY,\n\t[JsConnectionPointType.EULER_ARRAY]: JsConnectionPointType.EULER_ARRAY,\n\t[JsConnectionPointType.FLOAT]: JsConnectionPointType.FLOAT_ARRAY,\n\t[JsConnectionPointType.FLOAT_ARRAY]: JsConnectionPointType.FLOAT_ARRAY,\n\t[JsConnectionPointType.INT]: JsConnectionPointType.INT_ARRAY,\n\t[JsConnectionPointType.INT_ARRAY]: JsConnectionPointType.INT_ARRAY,\n\t[JsConnectionPointType.INTERSECTION]: JsConnectionPointType.INTERSECTION_ARRAY,\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: JsConnectionPointType.INTERSECTION_ARRAY,\n\t[JsConnectionPointType.MATERIAL]: JsConnectionPointType.MATERIAL,\n\t[JsConnectionPointType.MATRIX4]: JsConnectionPointType.MATRIX4_ARRAY,\n\t[JsConnectionPointType.MATRIX4_ARRAY]: JsConnectionPointType.MATRIX4_ARRAY,\n\t[JsConnectionPointType.NODE]: JsConnectionPointType.NODE,\n\t[JsConnectionPointType.OBJECT_3D]: JsConnectionPointType.OBJECT_3D_ARRAY,\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: JsConnectionPointType.OBJECT_3D_ARRAY,\n\t[JsConnectionPointType.PARAM]: JsConnectionPointType.PARAM,\n\t[JsConnectionPointType.PLANE]: JsConnectionPointType.PLANE,\n\t[JsConnectionPointType.QUATERNION]: JsConnectionPointType.QUATERNION_ARRAY,\n\t[JsConnectionPointType.QUATERNION_ARRAY]: JsConnectionPointType.QUATERNION_ARRAY,\n\t[JsConnectionPointType.RAY]: JsConnectionPointType.RAY,\n\t[JsConnectionPointType.SPHERE]: JsConnectionPointType.SPHERE, //\n\t[JsConnectionPointType.STRING]: JsConnectionPointType.STRING_ARRAY,\n\t[JsConnectionPointType.STRING_ARRAY]: JsConnectionPointType.STRING_ARRAY,\n\t[JsConnectionPointType.TEXTURE]: JsConnectionPointType.TEXTURE_ARRAY,\n\t[JsConnectionPointType.TEXTURE_ARRAY]: JsConnectionPointType.TEXTURE_ARRAY,\n\t// [ActorConnectionPointType.TRACKING_RESULT_HAND]: ActorConnectionPointType.TRACKING_RESULT_HAND,\n\t[JsConnectionPointType.TRIGGER]: JsConnectionPointType.TRIGGER,\n\t[JsConnectionPointType.VECTOR2]: JsConnectionPointType.VECTOR2_ARRAY,\n\t[JsConnectionPointType.VECTOR2_ARRAY]: JsConnectionPointType.VECTOR2_ARRAY,\n\t[JsConnectionPointType.VECTOR3]: JsConnectionPointType.VECTOR3_ARRAY,\n\t[JsConnectionPointType.VECTOR3_ARRAY]: JsConnectionPointType.VECTOR3_ARRAY,\n\t[JsConnectionPointType.VECTOR4]: JsConnectionPointType.VECTOR4_ARRAY,\n\t[JsConnectionPointType.VECTOR4_ARRAY]: JsConnectionPointType.VECTOR4_ARRAY,\n};\n\ntype JsConnectionPointTypeFromArrayTypeMapGeneric = {[key in JsConnectionPointType]: JsConnectionPointType};\nexport interface JsIConnectionPointTypeFromArrayTypeMap extends JsConnectionPointTypeFromArrayTypeMapGeneric {\n\t[JsConnectionPointType.ANIMATION_MIXER]: JsConnectionPointType.ANIMATION_MIXER;\n\t[JsConnectionPointType.ANIMATION_ACTION]: JsConnectionPointType.ANIMATION_ACTION;\n\t[JsConnectionPointType.BOOLEAN]: JsConnectionPointType.BOOLEAN;\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: JsConnectionPointType.BOOLEAN;\n\t[JsConnectionPointType.BOX3]: JsConnectionPointType.BOX3;\n\t[JsConnectionPointType.CAMERA]: JsConnectionPointType.CAMERA;\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: JsConnectionPointType.CATMULL_ROM_CURVE3;\n\t[JsConnectionPointType.COLOR]: JsConnectionPointType.COLOR;\n\t[JsConnectionPointType.COLOR_ARRAY]: JsConnectionPointType.COLOR;\n\t[JsConnectionPointType.EULER]: JsConnectionPointType.EULER;\n\t[JsConnectionPointType.EULER_ARRAY]: JsConnectionPointType.EULER;\n\t[JsConnectionPointType.FLOAT]: JsConnectionPointType.FLOAT;\n\t[JsConnectionPointType.FLOAT_ARRAY]: JsConnectionPointType.FLOAT;\n\t[JsConnectionPointType.INT]: JsConnectionPointType.INT;\n\t[JsConnectionPointType.INT_ARRAY]: JsConnectionPointType.INT;\n\t[JsConnectionPointType.INTERSECTION]: JsConnectionPointType.INTERSECTION;\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: JsConnectionPointType.INTERSECTION;\n\t[JsConnectionPointType.MATERIAL]: JsConnectionPointType.MATERIAL; //\n\t[JsConnectionPointType.MATRIX4]: JsConnectionPointType.MATRIX4; //\n\t[JsConnectionPointType.MATRIX4_ARRAY]: JsConnectionPointType.MATRIX4; //\n\t[JsConnectionPointType.NODE]: JsConnectionPointType.NODE; //\n\t[JsConnectionPointType.OBJECT_3D]: JsConnectionPointType.OBJECT_3D; //\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: JsConnectionPointType.OBJECT_3D; //\n\t[JsConnectionPointType.PARAM]: JsConnectionPointType.PARAM; //\n\t[JsConnectionPointType.PLANE]: JsConnectionPointType.PLANE; //\n\t[JsConnectionPointType.QUATERNION]: JsConnectionPointType.QUATERNION; //\n\t[JsConnectionPointType.QUATERNION_ARRAY]: JsConnectionPointType.QUATERNION; //\n\t[JsConnectionPointType.RAY]: JsConnectionPointType.RAY; //\n\t[JsConnectionPointType.SPHERE]: JsConnectionPointType.SPHERE; //\n\t[JsConnectionPointType.STRING]: JsConnectionPointType.STRING;\n\t[JsConnectionPointType.STRING_ARRAY]: JsConnectionPointType.STRING;\n\t[JsConnectionPointType.TEXTURE]: JsConnectionPointType.TEXTURE;\n\t[JsConnectionPointType.TEXTURE_ARRAY]: JsConnectionPointType.TEXTURE;\n\t[JsConnectionPointType.TRIGGER]: JsConnectionPointType.TRIGGER;\n\t[JsConnectionPointType.VECTOR2]: JsConnectionPointType.VECTOR2;\n\t[JsConnectionPointType.VECTOR2_ARRAY]: JsConnectionPointType.VECTOR2;\n\t[JsConnectionPointType.VECTOR3]: JsConnectionPointType.VECTOR3;\n\t[JsConnectionPointType.VECTOR3_ARRAY]: JsConnectionPointType.VECTOR3;\n\t[JsConnectionPointType.VECTOR4]: JsConnectionPointType.VECTOR4;\n\t[JsConnectionPointType.VECTOR4_ARRAY]: JsConnectionPointType.VECTOR4;\n}\nexport const JsConnectionPointTypeFromArrayTypeMap: JsIConnectionPointTypeFromArrayTypeMap = {\n\t[JsConnectionPointType.ANIMATION_MIXER]: JsConnectionPointType.ANIMATION_MIXER,\n\t[JsConnectionPointType.ANIMATION_ACTION]: JsConnectionPointType.ANIMATION_ACTION,\n\t[JsConnectionPointType.BOOLEAN]: JsConnectionPointType.BOOLEAN,\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: JsConnectionPointType.BOOLEAN,\n\t[JsConnectionPointType.BOX3]: JsConnectionPointType.BOX3,\n\t[JsConnectionPointType.CAMERA]: JsConnectionPointType.CAMERA,\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: JsConnectionPointType.CATMULL_ROM_CURVE3,\n\t[JsConnectionPointType.COLOR]: JsConnectionPointType.COLOR,\n\t[JsConnectionPointType.COLOR_ARRAY]: JsConnectionPointType.COLOR,\n\t[JsConnectionPointType.EULER]: JsConnectionPointType.EULER,\n\t[JsConnectionPointType.EULER_ARRAY]: JsConnectionPointType.EULER,\n\t[JsConnectionPointType.FLOAT]: JsConnectionPointType.FLOAT,\n\t[JsConnectionPointType.FLOAT_ARRAY]: JsConnectionPointType.FLOAT,\n\t[JsConnectionPointType.INT]: JsConnectionPointType.INT,\n\t[JsConnectionPointType.INT_ARRAY]: JsConnectionPointType.INT,\n\t[JsConnectionPointType.INTERSECTION]: JsConnectionPointType.INTERSECTION,\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: JsConnectionPointType.INTERSECTION,\n\t[JsConnectionPointType.MATERIAL]: JsConnectionPointType.MATERIAL,\n\t[JsConnectionPointType.MATRIX4]: JsConnectionPointType.MATRIX4,\n\t[JsConnectionPointType.MATRIX4_ARRAY]: JsConnectionPointType.MATRIX4,\n\t[JsConnectionPointType.NODE]: JsConnectionPointType.NODE,\n\t[JsConnectionPointType.OBJECT_3D]: JsConnectionPointType.OBJECT_3D,\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: JsConnectionPointType.OBJECT_3D,\n\t[JsConnectionPointType.PARAM]: JsConnectionPointType.PARAM,\n\t[JsConnectionPointType.PLANE]: JsConnectionPointType.PLANE,\n\t[JsConnectionPointType.QUATERNION]: JsConnectionPointType.QUATERNION,\n\t[JsConnectionPointType.QUATERNION_ARRAY]: JsConnectionPointType.QUATERNION,\n\t[JsConnectionPointType.RAY]: JsConnectionPointType.RAY,\n\t[JsConnectionPointType.SPHERE]: JsConnectionPointType.SPHERE, //\n\t[JsConnectionPointType.STRING]: JsConnectionPointType.STRING,\n\t[JsConnectionPointType.STRING_ARRAY]: JsConnectionPointType.STRING,\n\t[JsConnectionPointType.TEXTURE]: JsConnectionPointType.TEXTURE,\n\t[JsConnectionPointType.TEXTURE_ARRAY]: JsConnectionPointType.TEXTURE,\n\t// [ActorConnectionPointType.TRACKING_RESULT_HAND]: ActorConnectionPointType.TRACKING_RESULT_HAND,\n\t[JsConnectionPointType.TRIGGER]: JsConnectionPointType.TRIGGER,\n\t[JsConnectionPointType.VECTOR2]: JsConnectionPointType.VECTOR2,\n\t[JsConnectionPointType.VECTOR2_ARRAY]: JsConnectionPointType.VECTOR2,\n\t[JsConnectionPointType.VECTOR3]: JsConnectionPointType.VECTOR3,\n\t[JsConnectionPointType.VECTOR3_ARRAY]: JsConnectionPointType.VECTOR3,\n\t[JsConnectionPointType.VECTOR4]: JsConnectionPointType.VECTOR4,\n\t[JsConnectionPointType.VECTOR4_ARRAY]: JsConnectionPointType.VECTOR4,\n};\n\nexport type ArrayableConnectionPointType =\n\t| JsConnectionPointType.BOOLEAN\n\t| JsConnectionPointType.COLOR\n\t| JsConnectionPointType.FLOAT\n\t| JsConnectionPointType.INT\n\t| JsConnectionPointType.INTERSECTION\n\t| JsConnectionPointType.MATRIX4\n\t| JsConnectionPointType.QUATERNION\n\t| JsConnectionPointType.STRING\n\t| JsConnectionPointType.TEXTURE\n\t| JsConnectionPointType.VECTOR2\n\t| JsConnectionPointType.VECTOR3\n\t| JsConnectionPointType.VECTOR4;\nexport const ARRAYABLE_CONNECTION_TYPES: Set<ArrayableConnectionPointType> = new Set([\n\tJsConnectionPointType.BOOLEAN,\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.INTERSECTION,\n\tJsConnectionPointType.MATRIX4,\n\tJsConnectionPointType.QUATERNION,\n\tJsConnectionPointType.STRING,\n\tJsConnectionPointType.TEXTURE,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n]);\nexport type JsConnectionPointTypeArray =\n\t| JsConnectionPointType.BOOLEAN_ARRAY\n\t| JsConnectionPointType.COLOR_ARRAY\n\t| JsConnectionPointType.FLOAT_ARRAY\n\t| JsConnectionPointType.INT_ARRAY\n\t| JsConnectionPointType.INTERSECTION_ARRAY\n\t| JsConnectionPointType.MATRIX4_ARRAY\n\t| JsConnectionPointType.OBJECT_3D_ARRAY\n\t| JsConnectionPointType.QUATERNION_ARRAY\n\t| JsConnectionPointType.STRING_ARRAY\n\t| JsConnectionPointType.TEXTURE_ARRAY\n\t| JsConnectionPointType.VECTOR2_ARRAY\n\t| JsConnectionPointType.VECTOR3_ARRAY\n\t| JsConnectionPointType.VECTOR4_ARRAY;\n\nexport const ARRAY_JS_CONNECTION_TYPES: Array<JsConnectionPointTypeArray> = [\n\tJsConnectionPointType.BOOLEAN_ARRAY,\n\tJsConnectionPointType.COLOR_ARRAY,\n\tJsConnectionPointType.FLOAT_ARRAY,\n\tJsConnectionPointType.INT_ARRAY,\n\tJsConnectionPointType.INTERSECTION_ARRAY,\n\tJsConnectionPointType.MATRIX4_ARRAY,\n\tJsConnectionPointType.OBJECT_3D_ARRAY,\n\tJsConnectionPointType.QUATERNION_ARRAY,\n\tJsConnectionPointType.STRING_ARRAY,\n\tJsConnectionPointType.TEXTURE_ARRAY,\n\tJsConnectionPointType.VECTOR2_ARRAY,\n\tJsConnectionPointType.VECTOR3_ARRAY,\n\tJsConnectionPointType.VECTOR4_ARRAY,\n];\n\nexport const ARRAY_JS_CONNECTION_TYPES_SET: Set<JsConnectionPointTypeArray> = new Set(ARRAY_JS_CONNECTION_TYPES);\n\nexport type ParamConvertibleJsType =\n\t| JsConnectionPointType.BOOLEAN\n\t| JsConnectionPointType.COLOR\n\t| JsConnectionPointType.FLOAT\n\t| JsConnectionPointType.INT\n\t| JsConnectionPointType.STRING\n\t| JsConnectionPointType.VECTOR2\n\t| JsConnectionPointType.VECTOR3\n\t| JsConnectionPointType.VECTOR4;\nexport const PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES: Array<ParamConvertibleJsType> = [\n\tJsConnectionPointType.BOOLEAN,\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.STRING,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n];\nexport type PointAttributeJsType =\n\t| JsConnectionPointType.COLOR\n\t| JsConnectionPointType.FLOAT\n\t| JsConnectionPointType.INT\n\t| JsConnectionPointType.VECTOR2\n\t| JsConnectionPointType.VECTOR3\n\t| JsConnectionPointType.VECTOR4;\nexport const POINT_ATTRIBUTE_JS_CONNECTION_POINT_TYPES: Array<PointAttributeJsType> = [\n\tJsConnectionPointType.COLOR,\n\tJsConnectionPointType.FLOAT,\n\tJsConnectionPointType.INT,\n\tJsConnectionPointType.VECTOR2,\n\tJsConnectionPointType.VECTOR3,\n\tJsConnectionPointType.VECTOR4,\n];\n\n//\n//\n// GET DATA TYPE\n//\n//\nexport type JsDataType =\n\t| PrimitiveArrayElement\n\t| Array<PrimitiveArrayElement>\n\t| VectorArrayElement\n\t| Array<VectorArrayElement>\n\t| AnimationMixer\n\t| AnimationAction\n\t| Box3\n\t| Camera\n\t| CatmullRomCurve3\n\t| Euler\n\t| Euler[]\n\t| Intersection\n\t| Array<Intersection>\n\t| Material\n\t| Object3D\n\t| Array<Object3D>\n\t| Ray\n\t| Sphere\n\t| Texture\n\t| Array<Texture>\n\t| BaseNodeType\n\t| BaseParamType\n\t| null;\ntype JSConnectionPointTypeToDataTypeMapGeneric = {[key in JsConnectionPointType]: JsDataType};\nexport interface JsIConnectionPointTypeToDataTypeMap extends JSConnectionPointTypeToDataTypeMapGeneric {\n\t[JsConnectionPointType.ANIMATION_MIXER]: AnimationMixer;\n\t[JsConnectionPointType.ANIMATION_ACTION]: AnimationAction;\n\t[JsConnectionPointType.BOOLEAN]: boolean;\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: boolean[];\n\t[JsConnectionPointType.BOX3]: Box3;\n\t[JsConnectionPointType.CAMERA]: Camera;\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: CatmullRomCurve3;\n\t[JsConnectionPointType.COLOR]: Color;\n\t[JsConnectionPointType.COLOR_ARRAY]: Color[];\n\t[JsConnectionPointType.EULER]: Euler;\n\t[JsConnectionPointType.EULER_ARRAY]: Euler[];\n\t[JsConnectionPointType.FLOAT]: number;\n\t[JsConnectionPointType.FLOAT_ARRAY]: number[];\n\t[JsConnectionPointType.INT]: number;\n\t[JsConnectionPointType.INT_ARRAY]: number[];\n\t[JsConnectionPointType.INTERSECTION]: Intersection;\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: Intersection[];\n\t[JsConnectionPointType.MATERIAL]: Material;\n\t[JsConnectionPointType.MATRIX4]: Matrix4;\n\t[JsConnectionPointType.MATRIX4_ARRAY]: Matrix4[];\n\t[JsConnectionPointType.NODE]: BaseNodeType;\n\t[JsConnectionPointType.OBJECT_3D]: Object3D;\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: Object3D[];\n\t[JsConnectionPointType.PARAM]: BaseParamType;\n\t[JsConnectionPointType.PLANE]: Plane;\n\t[JsConnectionPointType.QUATERNION]: Quaternion;\n\t[JsConnectionPointType.QUATERNION_ARRAY]: Quaternion[];\n\t[JsConnectionPointType.RAY]: Ray;\n\t[JsConnectionPointType.SPHERE]: Sphere;\n\t[JsConnectionPointType.STRING]: string;\n\t[JsConnectionPointType.STRING_ARRAY]: string[];\n\t[JsConnectionPointType.TEXTURE]: Texture;\n\t[JsConnectionPointType.TEXTURE_ARRAY]: Texture[];\n\t[JsConnectionPointType.TRIGGER]: null;\n\t[JsConnectionPointType.VECTOR2]: Vector2;\n\t[JsConnectionPointType.VECTOR2_ARRAY]: Vector2[];\n\t[JsConnectionPointType.VECTOR3]: Vector3;\n\t[JsConnectionPointType.VECTOR3_ARRAY]: Vector3[];\n\t[JsConnectionPointType.VECTOR4]: Vector4;\n\t[JsConnectionPointType.VECTOR4_ARRAY]: Vector4[];\n}\n// export const JsConnectionPointTypeToParamTypeMap: JsIConnectionPointTypeToDataTypeMap = {\n// \t[JsConnectionPointType.ANIMATION_MIXER]: AnimationMixer;\n// \t[JsConnectionPointType.ANIMATION_ACTION]: AnimationAction;\n// \t[JsConnectionPointType.BOOLEAN]: boolean,\n// \t[JsConnectionPointType.BOOLEAN_ARRAY]: boolean[],\n// \t[JsConnectionPointType.BOX3]: Box3,\n// \t[JsConnectionPointType.CAMERA]: Camera,\n// \t[JsConnectionPointType.CATMULL_ROM_CURVE3]: ParamType.BUTTON,\n// \t[JsConnectionPointType.COLOR]: ParamType.COLOR,\n// \t[JsConnectionPointType.COLOR_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.FLOAT]: ParamType.FLOAT,\n// \t[JsConnectionPointType.FLOAT_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.INT]: ParamType.INTEGER,\n// \t[JsConnectionPointType.INT_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.INTERSECTION]: ParamType.BUTTON,\n// \t[JsConnectionPointType.INTERSECTION_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.MATERIAL]: ParamType.BUTTON,\n// \t[JsConnectionPointType.MATRIX4]: ParamType.BUTTON,\n// \t[JsConnectionPointType.MATRIX4_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.OBJECT_3D]: ParamType.BUTTON,\n// \t[JsConnectionPointType.PLANE]: ParamType.BUTTON,\n// \t[JsConnectionPointType.QUATERNION]: ParamType.BUTTON,\n// \t[JsConnectionPointType.QUATERNION_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.RAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.SPHERE]: ParamType.BUTTON,\n// \t[JsConnectionPointType.STRING]: ParamType.STRING,\n// \t[JsConnectionPointType.STRING_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.TEXTURE]: ParamType.BUTTON,\n// \t[JsConnectionPointType.TEXTURE_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.TRIGGER]: ParamType.BUTTON,\n// \t[JsConnectionPointType.VECTOR2]: ParamType.VECTOR2,\n// \t[JsConnectionPointType.VECTOR2_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.VECTOR3]: ParamType.VECTOR3,\n// \t[JsConnectionPointType.VECTOR3_ARRAY]: ParamType.BUTTON,\n// \t[JsConnectionPointType.VECTOR4]: ParamType.VECTOR4,\n// \t[JsConnectionPointType.VECTOR4_ARRAY]: ParamType.BUTTON,\n// \t// [JsConnectionPointType.MAT3]: undefined,\n// \t// [JsConnectionPointType.MAT4]: undefined,\n// };\n\n//\n//\n// Map to convert from a Js Data type to a ParamType\n//\n//\ntype JSConnectionPointTypeToParamTypeMapGeneric = {[key in JsConnectionPointType]: ParamType | undefined};\nexport interface JsIConnectionPointTypeToParamTypeMap extends JSConnectionPointTypeToParamTypeMapGeneric {\n\t[JsConnectionPointType.ANIMATION_MIXER]: ParamType.BUTTON;\n\t[JsConnectionPointType.ANIMATION_ACTION]: ParamType.BUTTON;\n\t[JsConnectionPointType.BOOLEAN]: ParamType.BOOLEAN;\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.BOX3]: ParamType.BUTTON;\n\t[JsConnectionPointType.CAMERA]: ParamType.BUTTON;\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: ParamType.BUTTON;\n\t[JsConnectionPointType.COLOR]: ParamType.COLOR;\n\t[JsConnectionPointType.COLOR_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.EULER]: ParamType.BUTTON;\n\t[JsConnectionPointType.EULER_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.FLOAT]: ParamType.FLOAT;\n\t[JsConnectionPointType.FLOAT_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.INT]: ParamType.INTEGER;\n\t[JsConnectionPointType.INT_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.INTERSECTION]: ParamType.BUTTON;\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.MATERIAL]: ParamType.BUTTON;\n\t[JsConnectionPointType.MATRIX4]: ParamType.BUTTON;\n\t[JsConnectionPointType.MATRIX4_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.NODE]: ParamType.NODE_PATH;\n\t[JsConnectionPointType.OBJECT_3D]: ParamType.BUTTON;\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.PARAM]: ParamType.PARAM_PATH;\n\t[JsConnectionPointType.PLANE]: ParamType.BUTTON;\n\t[JsConnectionPointType.QUATERNION]: ParamType.BUTTON;\n\t[JsConnectionPointType.QUATERNION_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.RAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.SPHERE]: ParamType.BUTTON;\n\t[JsConnectionPointType.STRING]: ParamType.STRING;\n\t[JsConnectionPointType.STRING_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.TEXTURE]: ParamType.BUTTON;\n\t[JsConnectionPointType.TEXTURE_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.TRIGGER]: ParamType.BUTTON;\n\t[JsConnectionPointType.VECTOR2]: ParamType.VECTOR2;\n\t[JsConnectionPointType.VECTOR2_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.VECTOR3]: ParamType.VECTOR3;\n\t[JsConnectionPointType.VECTOR3_ARRAY]: ParamType.BUTTON;\n\t[JsConnectionPointType.VECTOR4]: ParamType.VECTOR4;\n\t[JsConnectionPointType.VECTOR4_ARRAY]: ParamType.BUTTON;\n\t// [JsConnectionPointType.MAT3]: undefined;\n\t// [JsConnectionPointType.MAT4]: undefined;\n}\nexport const JsConnectionPointTypeToParamTypeMap: JsIConnectionPointTypeToParamTypeMap = {\n\t[JsConnectionPointType.ANIMATION_MIXER]: ParamType.BUTTON,\n\t[JsConnectionPointType.ANIMATION_ACTION]: ParamType.BUTTON,\n\t[JsConnectionPointType.BOOLEAN]: ParamType.BOOLEAN,\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.BOX3]: ParamType.BUTTON,\n\t[JsConnectionPointType.CAMERA]: ParamType.BUTTON,\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: ParamType.BUTTON,\n\t[JsConnectionPointType.COLOR]: ParamType.COLOR,\n\t[JsConnectionPointType.COLOR_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.EULER]: ParamType.BUTTON,\n\t[JsConnectionPointType.EULER_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.FLOAT]: ParamType.FLOAT,\n\t[JsConnectionPointType.FLOAT_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.INT]: ParamType.INTEGER,\n\t[JsConnectionPointType.INT_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.INTERSECTION]: ParamType.BUTTON,\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.MATERIAL]: ParamType.BUTTON,\n\t[JsConnectionPointType.MATRIX4]: ParamType.BUTTON,\n\t[JsConnectionPointType.MATRIX4_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.NODE]: ParamType.NODE_PATH,\n\t[JsConnectionPointType.OBJECT_3D]: ParamType.BUTTON,\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.PARAM]: ParamType.PARAM_PATH,\n\t[JsConnectionPointType.PLANE]: ParamType.BUTTON,\n\t[JsConnectionPointType.QUATERNION]: ParamType.BUTTON,\n\t[JsConnectionPointType.QUATERNION_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.RAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.SPHERE]: ParamType.BUTTON,\n\t[JsConnectionPointType.STRING]: ParamType.STRING,\n\t[JsConnectionPointType.STRING_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.TEXTURE]: ParamType.BUTTON,\n\t[JsConnectionPointType.TEXTURE_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.TRIGGER]: ParamType.BUTTON,\n\t[JsConnectionPointType.VECTOR2]: ParamType.VECTOR2,\n\t[JsConnectionPointType.VECTOR2_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.VECTOR3]: ParamType.VECTOR3,\n\t[JsConnectionPointType.VECTOR3_ARRAY]: ParamType.BUTTON,\n\t[JsConnectionPointType.VECTOR4]: ParamType.VECTOR4,\n\t[JsConnectionPointType.VECTOR4_ARRAY]: ParamType.BUTTON,\n\t// [JsConnectionPointType.MAT3]: undefined,\n\t// [JsConnectionPointType.MAT4]: undefined,\n};\n\n//\n//\n// Map to convert from a ParamType to GL Data type\n//\n//\ntype JsParamTypeToConnectionPointTypeMapGeneric = {[key in ParamType]: JsConnectionPointType | undefined};\nexport interface IJsParamTypeToConnectionPointTypeMap extends JsParamTypeToConnectionPointTypeMapGeneric {\n\t[ParamType.BOOLEAN]: JsConnectionPointType.BOOLEAN;\n\t[ParamType.COLOR]: JsConnectionPointType.COLOR;\n\t[ParamType.FLOAT]: JsConnectionPointType.FLOAT;\n\t[ParamType.INTEGER]: JsConnectionPointType.INT;\n\t[ParamType.FOLDER]: undefined;\n\t[ParamType.VECTOR2]: JsConnectionPointType.VECTOR2;\n\t[ParamType.VECTOR3]: JsConnectionPointType.VECTOR3;\n\t[ParamType.VECTOR4]: JsConnectionPointType.VECTOR4;\n\t[ParamType.BUTTON]: undefined;\n\t[ParamType.NODE_PATH]: JsConnectionPointType.NODE;\n\t[ParamType.PARAM_PATH]: JsConnectionPointType.PARAM;\n\t[ParamType.RAMP]: undefined;\n\t[ParamType.STRING]: JsConnectionPointType.STRING;\n}\nexport const JsParamTypeToConnectionPointTypeMap: IJsParamTypeToConnectionPointTypeMap = {\n\t[ParamType.BOOLEAN]: JsConnectionPointType.BOOLEAN,\n\t[ParamType.COLOR]: JsConnectionPointType.COLOR,\n\t[ParamType.FLOAT]: JsConnectionPointType.FLOAT,\n\t[ParamType.INTEGER]: JsConnectionPointType.INT,\n\t[ParamType.FOLDER]: undefined,\n\t[ParamType.VECTOR2]: JsConnectionPointType.VECTOR2,\n\t[ParamType.VECTOR3]: JsConnectionPointType.VECTOR3,\n\t[ParamType.VECTOR4]: JsConnectionPointType.VECTOR4,\n\t[ParamType.BUTTON]: undefined,\n\t[ParamType.NODE_PATH]: JsConnectionPointType.NODE,\n\t[ParamType.PARAM_PATH]: JsConnectionPointType.PARAM,\n\t[ParamType.RAMP]: undefined,\n\t[ParamType.STRING]: JsConnectionPointType.STRING,\n};\n\n//\n//\n// Map of Js Data type default values\n//\n//\nexport type ConnectionPointInitValueMapGeneric = {\n\t[key in JsConnectionPointType]: ParamInitValuesTypeMap[JsIConnectionPointTypeToParamTypeMap[key]];\n};\nexport const JsConnectionPointInitValueMap: ConnectionPointInitValueMapGeneric = {\n\t[JsConnectionPointType.ANIMATION_ACTION]: null,\n\t[JsConnectionPointType.ANIMATION_MIXER]: null,\n\t[JsConnectionPointType.BOOLEAN]: false,\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: null,\n\t[JsConnectionPointType.BOX3]: null,\n\t[JsConnectionPointType.CAMERA]: null,\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: null,\n\t[JsConnectionPointType.COLOR]: [1, 1, 1],\n\t[JsConnectionPointType.COLOR_ARRAY]: null,\n\t[JsConnectionPointType.EULER]: null,\n\t[JsConnectionPointType.EULER_ARRAY]: null,\n\t[JsConnectionPointType.FLOAT]: 0,\n\t[JsConnectionPointType.FLOAT_ARRAY]: null,\n\t[JsConnectionPointType.INT]: 0,\n\t[JsConnectionPointType.INT_ARRAY]: null,\n\t[JsConnectionPointType.INTERSECTION]: null,\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: null,\n\t[JsConnectionPointType.MATERIAL]: null,\n\t[JsConnectionPointType.MATRIX4]: null,\n\t[JsConnectionPointType.MATRIX4_ARRAY]: null,\n\t[JsConnectionPointType.NODE]: '',\n\t[JsConnectionPointType.OBJECT_3D]: null,\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: null,\n\t[JsConnectionPointType.PARAM]: '',\n\t[JsConnectionPointType.PLANE]: null,\n\t[JsConnectionPointType.QUATERNION]: null,\n\t[JsConnectionPointType.QUATERNION_ARRAY]: null,\n\t[JsConnectionPointType.RAY]: null,\n\t[JsConnectionPointType.SPHERE]: null,\n\t[JsConnectionPointType.STRING]: '',\n\t[JsConnectionPointType.STRING_ARRAY]: null,\n\t[JsConnectionPointType.TEXTURE]: null,\n\t[JsConnectionPointType.TEXTURE_ARRAY]: null,\n\t[JsConnectionPointType.TRIGGER]: null,\n\t[JsConnectionPointType.VECTOR2]: [0, 0],\n\t[JsConnectionPointType.VECTOR2_ARRAY]: null,\n\t[JsConnectionPointType.VECTOR3]: [0, 0, 0],\n\t[JsConnectionPointType.VECTOR3_ARRAY]: null,\n\t[JsConnectionPointType.VECTOR4]: [0, 0, 0, 0],\n\t[JsConnectionPointType.VECTOR4_ARRAY]: null,\n\t// [JsConnectionPointType.MAT3]: [0],\n\t// [JsConnectionPointType.MAT4]: [0],\n};\n\n//\n//\n// Map of Js Data type component counts\n//\n//\nexport type ConnectionPointComponentsCountMapGeneric = {\n\t[key in JsConnectionPointType]: number;\n};\nexport const JsConnectionPointComponentsCountMap: ConnectionPointComponentsCountMapGeneric = {\n\t[JsConnectionPointType.ANIMATION_ACTION]: 1,\n\t[JsConnectionPointType.ANIMATION_MIXER]: 1,\n\t[JsConnectionPointType.BOOLEAN]: 1,\n\t[JsConnectionPointType.BOOLEAN_ARRAY]: 1,\n\t[JsConnectionPointType.BOX3]: 1,\n\t[JsConnectionPointType.CAMERA]: 1,\n\t[JsConnectionPointType.CATMULL_ROM_CURVE3]: 1,\n\t[JsConnectionPointType.COLOR]: 3,\n\t[JsConnectionPointType.COLOR_ARRAY]: 1,\n\t[JsConnectionPointType.EULER]: 3,\n\t[JsConnectionPointType.EULER_ARRAY]: 1,\n\t[JsConnectionPointType.FLOAT]: 1,\n\t[JsConnectionPointType.FLOAT_ARRAY]: 1,\n\t[JsConnectionPointType.INT]: 1,\n\t[JsConnectionPointType.INT_ARRAY]: 1,\n\t[JsConnectionPointType.INTERSECTION]: 1,\n\t[JsConnectionPointType.INTERSECTION_ARRAY]: 1,\n\t[JsConnectionPointType.MATERIAL]: 1,\n\t[JsConnectionPointType.MATRIX4]: 1,\n\t[JsConnectionPointType.MATRIX4_ARRAY]: 1,\n\t[JsConnectionPointType.NODE]: 1,\n\t[JsConnectionPointType.OBJECT_3D]: 1,\n\t[JsConnectionPointType.OBJECT_3D_ARRAY]: 1,\n\t[JsConnectionPointType.PARAM]: 1,\n\t[JsConnectionPointType.PLANE]: 1,\n\t[JsConnectionPointType.QUATERNION]: 1,\n\t[JsConnectionPointType.QUATERNION_ARRAY]: 1,\n\t[JsConnectionPointType.RAY]: 1,\n\t[JsConnectionPointType.SPHERE]: 1,\n\t[JsConnectionPointType.STRING]: 1,\n\t[JsConnectionPointType.STRING_ARRAY]: 1,\n\t[JsConnectionPointType.TEXTURE]: 1,\n\t[JsConnectionPointType.TEXTURE_ARRAY]: 1,\n\t[JsConnectionPointType.TRIGGER]: 1,\n\t[JsConnectionPointType.VECTOR2]: 2,\n\t[JsConnectionPointType.VECTOR2_ARRAY]: 1,\n\t[JsConnectionPointType.VECTOR3]: 3,\n\t[JsConnectionPointType.VECTOR3_ARRAY]: 1,\n\t[JsConnectionPointType.VECTOR4]: 4,\n\t[JsConnectionPointType.VECTOR4_ARRAY]: 1,\n};\n\nexport interface JsConnectionPointData<T extends JsConnectionPointType> {\n\tname: string;\n\ttype: T;\n\tisArray?: boolean;\n}\n\ninterface JsConnectionPointOptions<T extends JsConnectionPointType> {\n\tinNodeDefinition?: boolean;\n\tinit_value?: ConnectionPointInitValueMapGeneric[T];\n}\nexport const JS_CONNECTION_POINT_IN_NODE_DEF: JsConnectionPointOptions<JsConnectionPointType> = {\n\tinNodeDefinition: true,\n};\n\nexport class JsConnectionPoint<T extends JsConnectionPointType> extends BaseConnectionPoint {\n\tprotected override _json: JsConnectionPointData<T> | undefined;\n\tprotected override _init_value?: ConnectionPointInitValueMapGeneric[T];\n\tprotected _isArray: boolean;\n\n\tconstructor(_name: string, protected override _type: T, protected _options?: JsConnectionPointOptions<T>) {\n\t\tsuper(_name, _type);\n\t\t// if (this._init_value === undefined) {\n\t\tthis._isArray = ARRAY_JS_CONNECTION_TYPES_SET.has(_type as JsConnectionPointTypeArray);\n\t\tthis._init_value = JsConnectionPointInitValueMap[this._type];\n\t\t// }\n\n\t\tif (_options) {\n\t\t\tthis._inNodeDefinition = _options.inNodeDefinition == true;\n\t\t\tif (_options.init_value != null) {\n\t\t\t\tthis._init_value = _options.init_value;\n\t\t\t}\n\t\t}\n\t}\n\toverride type() {\n\t\treturn this._type;\n\t}\n\toverride are_types_matched(src_type: string, dest_type: string): boolean {\n\t\treturn src_type == dest_type;\n\t}\n\tget param_type(): JsIConnectionPointTypeToParamTypeMap[T] {\n\t\treturn JsConnectionPointTypeToParamTypeMap[this._type];\n\t}\n\toverride get init_value() {\n\t\treturn this._init_value;\n\t}\n\n\toverride toJSON(): JsConnectionPointData<T> {\n\t\treturn (this._json = this._json || this._createJSON());\n\t}\n\tprotected override _createJSON(): JsConnectionPointData<T> {\n\t\treturn {\n\t\t\tname: this._name,\n\t\t\ttype: this._type,\n\t\t\tisArray: this._isArray,\n\t\t};\n\t}\n}\n\nexport type BaseJsConnectionPoint = JsConnectionPoint<JsConnectionPointType>;\n","// import {\n// \tConnectionPointType,\n// \tConnectionPointInitValueMapGeneric,\n// \tConnectionPointInitValueMap,\n// \tConnectionPointTypeToParamTypeMap,\n// \tIConnectionPointTypeToParamTypeMap,\n// } from '../ConnectionPointType';\n// import {ParamInitValuesTypeMap} from '../params/ParamsController';\n\nimport {ParamType} from '../../../../poly/ParamType';\n\nexport interface BaseConnectionPointData {\n\tname: string;\n\ttype: string;\n\tisArray?: boolean;\n}\n\nexport abstract class BaseConnectionPoint {\n\tprotected _json: BaseConnectionPointData | undefined;\n\t// protected _init_value: any;\n\n\tprotected _inNodeDefinition: boolean = false;\n\n\tconstructor(protected _name: string, protected _type: string, protected _init_value?: any) {\n\t\t// if (this._init_value === undefined) {\n\t\t// this._init_value = ConnectionPointInitValueMap[this._type];\n\t\t// }\n\t}\n\tget init_value() {\n\t\treturn this._init_value;\n\t}\n\tname() {\n\t\treturn this._name;\n\t}\n\ttype() {\n\t\treturn this._type;\n\t}\n\n\tare_types_matched(src_type: string, dest_type: string): boolean {\n\t\treturn true;\n\t}\n\tinNodeDefinition() {\n\t\treturn this._inNodeDefinition;\n\t}\n\tabstract get param_type(): ParamType | null;\n\t// get param_type(): IConnectionPointTypeToParamTypeMap[T] {\n\t// \treturn ConnectionPointTypeToParamTypeMap[this._type];\n\t// }\n\t// get init_value() {\n\t// \treturn this._init_value;\n\t// }\n\n\ttoJSON(): BaseConnectionPointData {\n\t\treturn (this._json = this._json || this._createJSON());\n\t}\n\tprotected _createJSON(): BaseConnectionPointData {\n\t\treturn {\n\t\t\tname: this._name,\n\t\t\ttype: this._type,\n\t\t\t// isArray: false,\n\t\t};\n\t}\n}\n\n// export type BaseNamedConnectionPointType = TypedNamedConnectionPoint<ConnectionPointType>;\n","import {Number2, Number3, Number4} from '../../../../types/GlobalTypes';\nimport {ParamType} from '../../../poly/ParamType';\nimport {ParamOptions} from '../../../params/utils/OptionsController';\nimport {RampParam} from '../../../params/Ramp';\nimport {ParamValuesTypeMap} from '../../../params/types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from '../../../params/types/ParamInitValuesTypeMap';\nimport {ParamConstructorMap} from '../../../params/types/ParamConstructorMap';\nimport {ParamOptionsByTypeMap} from '../../../params/types/ParamOptionsByTypeMap';\nimport {Color} from 'three';\nimport {Vector2} from 'three';\nimport {Vector3} from 'three';\nimport {Vector4} from 'three';\n\nexport class ParamTemplate<T extends ParamType> {\n\treadonly value_type!: ParamValuesTypeMap[T];\n\treadonly param_class!: ParamConstructorMap[T];\n\n\tconstructor(public type: T, public init_value: ParamInitValuesTypeMap[T], public options?: ParamOptions) {}\n}\n\nexport class ParamConfig {\n\tstatic BUTTON(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.BUTTON],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.BUTTON]\n\t) {\n\t\treturn new ParamTemplate<ParamType.BUTTON>(ParamType.BUTTON, init_value, options);\n\t}\n\tstatic BOOLEAN(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.BOOLEAN],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.BOOLEAN]\n\t) {\n\t\treturn new ParamTemplate<ParamType.BOOLEAN>(ParamType.BOOLEAN, init_value, options);\n\t}\n\tstatic COLOR(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.COLOR],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.COLOR]\n\t) {\n\t\tif (init_value instanceof Color) {\n\t\t\tinit_value = init_value.toArray() as Number3;\n\t\t}\n\t\treturn new ParamTemplate<ParamType.COLOR>(ParamType.COLOR, init_value, options);\n\t}\n\tstatic FLOAT(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.FLOAT],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.FLOAT]\n\t) {\n\t\treturn new ParamTemplate<ParamType.FLOAT>(ParamType.FLOAT, init_value, options);\n\t}\n\tstatic FOLDER(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.FOLDER] = null,\n\t\toptions?: ParamOptionsByTypeMap[ParamType.FOLDER]\n\t) {\n\t\treturn new ParamTemplate<ParamType.FOLDER>(ParamType.FOLDER, init_value, options);\n\t}\n\tstatic INTEGER(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.INTEGER],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.INTEGER]\n\t) {\n\t\treturn new ParamTemplate<ParamType.INTEGER>(ParamType.INTEGER, init_value, options);\n\t}\n\tstatic RAMP(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.RAMP] = RampParam.DEFAULT_VALUE,\n\t\toptions?: ParamOptionsByTypeMap[ParamType.RAMP]\n\t) {\n\t\treturn new ParamTemplate<ParamType.RAMP>(ParamType.RAMP, init_value, options);\n\t}\n\n\tstatic STRING(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.STRING] = '',\n\t\toptions?: ParamOptionsByTypeMap[ParamType.STRING]\n\t) {\n\t\treturn new ParamTemplate<ParamType.STRING>(ParamType.STRING, init_value, options);\n\t}\n\tstatic VECTOR2(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.VECTOR2],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.VECTOR2]\n\t) {\n\t\tif (init_value instanceof Vector2) {\n\t\t\tinit_value = init_value.toArray() as Number2;\n\t\t}\n\t\treturn new ParamTemplate<ParamType.VECTOR2>(ParamType.VECTOR2, init_value, options);\n\t}\n\tstatic VECTOR3(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.VECTOR3],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.VECTOR3]\n\t) {\n\t\tif (init_value instanceof Vector3) {\n\t\t\tinit_value = init_value.toArray() as Number3;\n\t\t}\n\t\treturn new ParamTemplate<ParamType.VECTOR3>(ParamType.VECTOR3, init_value, options);\n\t}\n\tstatic VECTOR4(\n\t\tinit_value: ParamInitValuesTypeMap[ParamType.VECTOR4],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.VECTOR4]\n\t) {\n\t\tif (init_value instanceof Vector4) {\n\t\t\tinit_value = init_value.toArray() as Number4;\n\t\t}\n\t\treturn new ParamTemplate<ParamType.VECTOR4>(ParamType.VECTOR4, init_value, options);\n\t}\n\n\t//\n\t//\n\t// PATH PARAMS\n\t//\n\t//\n\t// static OPERATOR_PATH(\n\t// \tinit_value: ParamInitValuesTypeMap[ParamType.OPERATOR_PATH],\n\t// \toptions?: ParamOptionsByTypeMap[ParamType.OPERATOR_PATH]\n\t// ) {\n\t// \treturn new ParamTemplate<ParamType.OPERATOR_PATH>(ParamType.OPERATOR_PATH, init_value, options);\n\t// }\n\tstatic NODE_PATH(\n\t\tinit_value: '', // forces at empty value at init, instead of ParamInitValuesTypeMap[ParamType.NODE_PATH],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.NODE_PATH]\n\t) {\n\t\treturn new ParamTemplate<ParamType.NODE_PATH>(ParamType.NODE_PATH, init_value, options);\n\t}\n\tstatic PARAM_PATH(\n\t\tinit_value: '', // forces at empty value at init, instead of ParamInitValuesTypeMap[ParamType.PARAM_PATH],\n\t\toptions?: ParamOptionsByTypeMap[ParamType.PARAM_PATH]\n\t) {\n\t\treturn new ParamTemplate<ParamType.PARAM_PATH>(ParamType.PARAM_PATH, init_value, options);\n\t}\n}\n\n//\n// NodeParamsConfig:\n//\n// export class NodeParamsConfig implements PolyDictionary<ParamTemplate<ParamType>> {\n// \t[name: string]: ParamTemplate<ParamType>;\n// }\n// in order to have all param names validated by typescript, this definition of NodeParamsConfig could be used:\nexport class NodeParamsConfig {}\n\n// but it will lead to some type error in ParamsValueAccessorType and ParamsAccessorType, preventing compilation with it.\n// TODO: try and find a way that prevents node.p.nonExistingAttribute to be accessible, and that has not other compilation error\n\nexport class HierarchyParamConfig extends NodeParamsConfig {\n\t/** @param group to apply this node to */\n\tgroup = ParamConfig.STRING('', {\n\t\tobjectMask: true,\n\t});\n}\nexport class HierarchyParamConfigAll extends NodeParamsConfig {\n\t/** @param group to apply this node to */\n\tgroup = ParamConfig.STRING('*', {\n\t\tobjectMask: true,\n\t});\n}\n","import {BaseNodeType} from './../../_Base';\nimport {NodeJsonExporterData} from './../../../io/json/export/Node';\nimport {NodeEvent} from './../../../poly/NodeEvent';\nimport {NodeContext} from '../../../poly/NodeContext';\nimport {SceneJsonImporter} from '../../../io/json/import/Scene';\nimport {JsonExportDispatcher} from '../../../io/json/export/Dispatcher';\nimport {NodeParamsConfig, ParamTemplate} from '../params/ParamsConfig';\nimport {PolyNodeDefinition, PolyNodesInputsData} from './PolyNodeDefinition';\nimport {PolyNodeClassByContext} from './PolyNodeClassByContext';\nimport {Poly} from '../../../Poly';\nimport {ParamOptionToAdd} from '../params/ParamsController';\nimport {ParamType} from '../../../poly/ParamType';\nimport {PolyNodeDataRegister} from './PolyNodeDataRegister';\nimport {arrayCompact} from '../../../../core/ArrayUtils';\nimport {NodeInputsController} from '../io/InputsController';\nimport {JsonImportDispatcher} from '../../../io/json/import/Dispatcher';\n// import {createPolyAnimNode} from '../../anim/utils/poly/createPolyAnimNode';\n// import {createPolyGlNode} from '../../gl/utils/poly/createPolyGlNode';\n// import {createPolyObjNode} from '../../obj/utils/poly/createPolyObjNode';\n// import {createPolySopNode} from '../../sop/utils/poly/createPolySopNode';\nimport {BaseGlConnectionPoint} from '../io/connections/Gl';\n\n// export const IS_POLY_NODE_BOOLEAN = 'isPolyNode';\n\ntype CreatePolyNodeFunction = (\n\tnodeType: string,\n\tdefinition: PolyNodeDefinition,\n\tpolyNodeControllerClass: typeof PolyNodeController\n) => any;\n\nexport class PolyNodeController {\n\tprivate static _createPolyNodeFunctionByContext: Map<NodeContext, CreatePolyNodeFunction> = new Map();\n\tstatic registerCreatePolyNodeFunctionForContext(\n\t\tcontext: NodeContext,\n\t\tcreatePolyNodeFunction: CreatePolyNodeFunction\n\t) {\n\t\tthis._createPolyNodeFunctionByContext.set(context, createPolyNodeFunction);\n\t}\n\n\tprivate static _definitionRegister: Map<NodeContext, Map<string, PolyNodeDefinition>> = new Map();\n\tprivate _locked = true;\n\tconstructor(private node: BaseNodeType, private _definition: PolyNodeDefinition) {}\n\n\tinitializeNode() {\n\t\tthis._initInputs();\n\n\t\t// add hooks\n\t\t// this.node.params.onParamsCreated('PolyNodeInit', () => {\n\t\t// \tthis._createParamsFromDefinition();\n\t\t// });\n\n\t\tthis.node.lifecycle.onAfterCreated(() => {\n\t\t\t// this._createParamsFromDefinition();\n\t\t\tthis.createChildNodesFromDefinition();\n\t\t});\n\t}\n\tlocked() {\n\t\treturn this._locked;\n\t}\n\tsetLockedState(state: boolean) {\n\t\tif (state == this._locked) {\n\t\t\treturn;\n\t\t}\n\t\tthis._locked = state;\n\t\tthis.node.emit(NodeEvent.POLY_NODE_LOCK_STATE_UPDATED);\n\t}\n\n\tprivate _initInputs() {\n\t\tconst inputsData = this._definition.inputs;\n\t\tif (!inputsData) {\n\t\t\treturn;\n\t\t}\n\t\tconst simpleData = inputsData.simple;\n\t\tif (simpleData) {\n\t\t\tthis.node.io.inputs.setCount(simpleData.min, simpleData.max);\n\t\t}\n\t}\n\n\t// private _createParamsFromDefinition() {\n\t// \tconst paramsData = this._definition.params;\n\t// \tif (!paramsData) {\n\t// \t\treturn;\n\t// \t}\n\t// \tfor (let paramData of paramsData) {\n\t// \t\tparamData.options = paramData.options || {};\n\t// \t\tparamData.options.spare = true;\n\t// \t}\n\t// \tthis.node.params.updateParams({toAdd: paramsData});\n\t// }\n\tstatic setupParamsConfig(paramsConfig: NodeParamsConfig, data: PolyNodeDefinition) {\n\t\tif (!data.params) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const paramData of data.params) {\n\t\t\tconst paramName = paramData.name;\n\t\t\tconst paramType = paramData.type;\n\t\t\tconst initValue = paramData.initValue;\n\t\t\tconst options = paramData.options;\n\t\t\t(paramsConfig as any)[paramName] = new ParamTemplate(paramType, initValue, options); //ParamConfig.STRING('aa');\n\t\t}\n\t}\n\n\tcreateChildNodesFromDefinition() {\n\t\tconst childrenData = this._definition.nodes;\n\t\tif (!childrenData) {\n\t\t\treturn;\n\t\t}\n\t\t// TODO: this is to avoid creating gl globals and output nodes\n\t\t// but there should be a better way, on a per-node basis.\n\t\t// Especially since it can create problem when loading a scene with gl builders\n\t\t// as those may trigger the creation of globals and output nodes too early, resulting in a broken load\n\t\tconst currentSceneLoadedState: boolean = this.node.scene().loadingController.loaded();\n\t\tif (currentSceneLoadedState) {\n\t\t\tthis.node.scene().loadingController.markAsLoading();\n\t\t}\n\t\tconst oldLockedState = this.locked();\n\t\tthis.setLockedState(false);\n\n\t\tconst sceneImporter = new SceneJsonImporter({});\n\t\tconst dispatcher = new JsonImportDispatcher();\n\t\tconst nodeImporter = dispatcher.dispatchNonPolyNode(this.node);\n\t\tconst exporterData: NodeJsonExporterData = {\n\t\t\t// ...this._definition,\n\t\t\ttype: this.node.type(),\n\t\t\tpolyNode: {\n\t\t\t\tlocked: true,\n\t\t\t},\n\t\t};\n\t\tnodeImporter.create_nodes(sceneImporter, childrenData, exporterData);\n\n\t\tconst uiData = this._definition.ui;\n\t\tif (uiData) {\n\t\t\tnodeImporter.processNodesUiData(sceneImporter, uiData);\n\t\t}\n\n\t\tif (currentSceneLoadedState) {\n\t\t\tthis.node.scene().loadingController.markAsLoaded();\n\t\t}\n\n\t\tthis.setLockedState(oldLockedState);\n\t}\n\n\tstatic inputsData(node: BaseNodeType): PolyNodesInputsData {\n\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\tconst inputs = node.io.inputs as NodeInputsController<NodeContext.GL>;\n\t\t\tconst connectionPoints: BaseGlConnectionPoint[] = [];\n\t\t\tconst namedInputConnectionPoints = inputs.namedInputConnectionPoints();\n\t\t\tif (namedInputConnectionPoints) {\n\t\t\t\tarrayCompact(namedInputConnectionPoints, connectionPoints);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttyped: {\n\t\t\t\t\ttypes: connectionPoints.map((cp) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tname: cp.name(),\n\t\t\t\t\t\t\ttype: cp.type(),\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tsimple: {\n\t\t\t\t\tmin: node.io.inputs.minCount(),\n\t\t\t\t\tmax: node.io.inputs.maxInputsCount(),\n\t\t\t\t\tnames: node.displayedInputNames(),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tstatic async polyNodeData(node: BaseNodeType, inputsData?: PolyNodesInputsData): Promise<PolyNodeDefinition> {\n\t\tconst dispatcher = new JsonExportDispatcher();\n\t\tconst rootExporter = dispatcher.dispatchNode(node);\n\t\tconst nodesData = await rootExporter.data({showPolyNodesData: true});\n\t\tconst uiData = rootExporter.uiData({showPolyNodesData: true});\n\n\t\tconst nodeInputsData = inputsData || this.inputsData(node);\n\n\t\tconst data: PolyNodeDefinition = {\n\t\t\tmetadata: {\n\t\t\t\tversion: {\n\t\t\t\t\tpolygonjs: '1',\n\t\t\t\t},\n\t\t\t\tcreatedAt: 1,\n\t\t\t},\n\t\t\tnodeContext: node.context(),\n\t\t\tinputs: nodeInputsData,\n\t\t\tparams: node.params.non_spare\n\t\t\t\t.filter((p) => p.parentParam() == null)\n\t\t\t\t.map((param) => {\n\t\t\t\t\tconst paramData: ParamOptionToAdd<ParamType> = {\n\t\t\t\t\t\tname: param.name(),\n\t\t\t\t\t\ttype: param.type(),\n\t\t\t\t\t\tinitValue: param.defaultValueSerialized(),\n\t\t\t\t\t\trawInput: param.rawInputSerialized(),\n\t\t\t\t\t\toptions: param.options.current(),\n\t\t\t\t\t};\n\t\t\t\t\treturn paramData;\n\t\t\t\t}),\n\t\t\tnodes: nodesData.nodes,\n\t\t\tui: uiData.nodes,\n\t\t};\n\t\treturn data;\n\t}\n\n\tstatic _createNodeClass<NC extends NodeContext>(\n\t\tnodeContext: NC,\n\t\tnodeType: string,\n\t\tdata: PolyNodeDefinition\n\t): PolyNodeClassByContext[NC] | undefined {\n\t\tconst createFunction = this._createPolyNodeFunctionByContext.get(nodeContext);\n\t\tif (!createFunction) {\n\t\t\treturn;\n\t\t}\n\t\treturn createFunction(nodeType, data, PolyNodeController) as any;\n\t}\n\tstatic createNodeClassAndRegister<NC extends NodeContext>(dataRegister: PolyNodeDataRegister<NC>) {\n\t\tconst {node_context, node_type, data} = dataRegister;\n\t\tconst nodeClass = this._createNodeClass(node_context, node_type, data);\n\t\tif (nodeClass) {\n\t\t\tlet registerMapForContext = this._definitionRegister.get(node_context);\n\t\t\tif (!registerMapForContext) {\n\t\t\t\tregisterMapForContext = new Map();\n\t\t\t\tthis._definitionRegister.set(node_context, registerMapForContext);\n\t\t\t}\n\t\t\tregisterMapForContext.set(node_type, data);\n\t\t\tPoly.registerNode(nodeClass, 'polyNodes', {polyNode: true});\n\t\t} else {\n\t\t\tconsole.warn('failed to create node from definition', node_context, node_type, data);\n\t\t}\n\t}\n\tstatic definition<NC extends NodeContext>(context: NC, type: string) {\n\t\treturn this._definitionRegister.get(context)?.get(type);\n\t}\n\tstatic register() {\n\t\treturn this._definitionRegister;\n\t}\n}\n","import {BaseGlConnectionPoint} from './../io/connections/Gl';\nimport {CoreGraph} from '../../../../core/graph/CoreGraph';\nimport {pushOnArrayAtEntry} from '../../../../core/MapUtils';\nimport {ShaderNameByContextMap} from './ShaderName';\nimport {TypedNode} from '../../_Base';\nimport {NodeContext, BaseNodeByContextMap, NetworkChildNodeType} from '../../../poly/NodeContext';\n// import {NodeTypeMap} from '../../../containers/utils/ContainerMap';\nimport {CoreGraphNodeId} from '../../../../core/graph/CoreGraph';\nimport {arrayUniq, arrayDifference, arrayCompact} from '../../../../core/ArrayUtils';\n\n// type NumberByString = Map<string, number>;\ntype NumberByCoreGraphNodeId = Map<CoreGraphNodeId, number>;\n// type BaseNodeTypeByString = Map<string, BaseNodeType>;\n// type BooleanByString = Map<string, boolean>;\ntype BooleanByCoreGraphNodeId = Map<CoreGraphNodeId, boolean>;\ntype BooleanByStringByShaderName<NC extends NodeContext> = Map<ShaderNameByContextMap[NC], BooleanByCoreGraphNodeId>;\ntype StringArrayByString = Map<CoreGraphNodeId, CoreGraphNodeId[]>;\ntype InputNamesByShaderNameMethod<NC extends NodeContext> = (\n\troot_node: BaseNodeByContextMap[NC],\n\tshader_name: ShaderNameByContextMap[NC]\n) => string[];\n\ninterface NodeTraverserOptions {\n\ttraverseChildren?: boolean;\n}\nexport class TypedNodeTraverser<NC extends NodeContext> {\n\tprotected _leaves_graph_id: BooleanByStringByShaderName<NC> = new Map();\n\tprotected _graph_ids_by_shader_name: BooleanByStringByShaderName<NC> = new Map();\n\tprivate _outputs_by_graph_id: StringArrayByString = new Map();\n\tprivate _depth_by_graph_id: NumberByCoreGraphNodeId = new Map();\n\tprivate _graph_id_by_depth: Map<number, CoreGraphNodeId[]> = new Map();\n\tprotected _graph: CoreGraph;\n\tprotected _shaderName!: ShaderNameByContextMap[NC];\n\t// private _subnets_by_id: BaseNodeTypeByString = new Map();\n\n\tconstructor(\n\t\tprivate _parent_node: TypedNode<NC, any>,\n\t\tprivate _shader_names: ShaderNameByContextMap[NC][],\n\t\tprivate _inputNamesForShaderNameMethod: InputNamesByShaderNameMethod<NC>,\n\t\tprivate _options?: NodeTraverserOptions\n\t) {\n\t\tthis._graph = this._parent_node.scene().graph;\n\t}\n\tprivate _traverseChildren() {\n\t\treturn this._options?.traverseChildren || false;\n\t}\n\n\tprivate reset() {\n\t\tthis._leaves_graph_id.clear();\n\t\tthis._graph_ids_by_shader_name.clear();\n\t\tthis._outputs_by_graph_id.clear();\n\t\tthis._depth_by_graph_id.clear();\n\t\tthis._graph_id_by_depth.clear();\n\t\t// this._subnets_by_id.clear();\n\n\t\tthis._shader_names.forEach((shader_name) => {\n\t\t\tthis._graph_ids_by_shader_name.set(shader_name, new Map());\n\t\t});\n\t}\n\n\tshaderNames() {\n\t\treturn this._shader_names;\n\t}\n\tinputNamesForShaderName(root_node: BaseNodeByContextMap[NC], shader_name: ShaderNameByContextMap[NC]) {\n\t\treturn this._inputNamesForShaderNameMethod(root_node, shader_name);\n\t}\n\n\ttraverse(rootNodes: BaseNodeByContextMap[NC][]) {\n\t\tthis.reset();\n\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tthis._leaves_graph_id.set(shaderName, new Map());\n\t\t}\n\n\t\tfor (const shaderName of this.shaderNames()) {\n\t\t\tthis._shaderName = shaderName;\n\t\t\tfor (const rootNode of rootNodes) {\n\t\t\t\tthis._findLeavesFromRootNode(rootNode);\n\t\t\t\tthis._setNodesDepth();\n\t\t\t}\n\t\t}\n\n\t\t// graph_ids.forEach((graph_id) => {\n\t\tthis._depth_by_graph_id.forEach((depth: number, graph_id: CoreGraphNodeId) => {\n\t\t\tif (depth != null) {\n\t\t\t\t// this._graph_id_by_depth.set(depth, this._graph_id_by_depth.get(depth) || []);\n\t\t\t\t// this._graph_id_by_depth.get(depth)?.push(graph_id);\n\t\t\t\tpushOnArrayAtEntry(this._graph_id_by_depth, depth, graph_id);\n\t\t\t}\n\t\t});\n\t}\n\n\tnodesForShaderName(shaderName: ShaderNameByContextMap[NC]) {\n\t\tconst depths: number[] = [];\n\t\tthis._graph_id_by_depth.forEach((value: CoreGraphNodeId[], key: number) => {\n\t\t\tdepths.push(key);\n\t\t});\n\t\tdepths.sort((a, b) => a - b);\n\t\tconst nodes: BaseNodeByContextMap[NC][] = [];\n\t\tconst node_id_used_state: Map<CoreGraphNodeId, boolean> = new Map();\n\t\tdepths.forEach((depth) => {\n\t\t\tconst graph_ids_for_depth = this._graph_id_by_depth.get(depth);\n\t\t\tif (graph_ids_for_depth) {\n\t\t\t\tgraph_ids_for_depth.forEach((graph_id: CoreGraphNodeId) => {\n\t\t\t\t\tconst is_present = this._graph_ids_by_shader_name.get(shaderName)?.get(graph_id);\n\t\t\t\t\tif (is_present) {\n\t\t\t\t\t\tconst node = this._graph.nodeFromId(graph_id) as BaseNodeByContextMap[NC];\n\n\t\t\t\t\t\tthis._addNodesWithChildren(node, node_id_used_state, nodes);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn nodes;\n\t}\n\tsortedNodes() {\n\t\tconst depths: number[] = [];\n\t\tthis._graph_id_by_depth.forEach((ids: CoreGraphNodeId[], depth: number) => {\n\t\t\tdepths.push(depth);\n\t\t});\n\t\tdepths.sort((a, b) => a - b);\n\t\tconst nodes: BaseNodeByContextMap[NC][] = [];\n\t\tconst node_id_used_state: Map<CoreGraphNodeId, boolean> = new Map();\n\t\tdepths.forEach((depth) => {\n\t\t\tconst graph_ids_for_depth = this._graph_id_by_depth.get(depth);\n\t\t\tif (graph_ids_for_depth) {\n\t\t\t\tfor (const graph_id of graph_ids_for_depth) {\n\t\t\t\t\tconst node = this._graph.nodeFromId(graph_id) as BaseNodeByContextMap[NC];\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tthis._addNodesWithChildren(node, node_id_used_state, nodes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn nodes;\n\t}\n\tprivate _addNodesWithChildren(\n\t\tnode: BaseNodeByContextMap[NC],\n\t\tnode_id_used_state: Map<CoreGraphNodeId, boolean>,\n\t\taccumulated_nodes: BaseNodeByContextMap[NC][]\n\t\t// shader_name?: ShaderName\n\t) {\n\t\tif (!node_id_used_state.get(node.graphNodeId())) {\n\t\t\taccumulated_nodes.push(node);\n\t\t\tnode_id_used_state.set(node.graphNodeId(), true);\n\t\t}\n\t\t// if (node.type() == NetworkChildNodeType.INPUT) {\n\t\t// \tconsole.log('_addNodesWithChildren', node);\n\t\t// \tconst parent = node.parent();\n\t\t// \tif (parent) {\n\t\t// \t\tconst nodes_with_same_parent_as_subnet_input = this._sortedNodesForShaderNameForParent(\n\t\t// \t\t\tparent,\n\t\t// \t\t\tshader_name\n\t\t// \t\t);\n\t\t// \t\tfor (let child_node of nodes_with_same_parent_as_subnet_input) {\n\t\t// \t\t\tif (child_node.graphNodeId() != node.graphNodeId()) {\n\t\t// \t\t\t\tthis._addNodesWithChildren(child_node, node_id_used_state, accumulated_nodes, shader_name);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\t}\n\n\t// private _sortedNodesForShaderNameForParent(parent: BaseNodeType, shader_name?: ShaderName) {\n\t// \tconst depths: number[] = [];\n\t// \tthis._graph_id_by_depth.forEach((value: CoreGraphNodeId[], key: number) => {\n\t// \t\tdepths.push(key);\n\t// \t});\n\t// \tdepths.sort((a, b) => a - b);\n\t// \tconst nodes: BaseNodeByContextMap[NC][] = [];\n\t// \tdepths.forEach((depth) => {\n\t// \t\tconst graph_ids_for_depth = this._graph_id_by_depth.get(depth);\n\t// \t\tif (graph_ids_for_depth) {\n\t// \t\t\tgraph_ids_for_depth.forEach((graph_id: CoreGraphNodeId) => {\n\t// \t\t\t\tconst is_present = shader_name\n\t// \t\t\t\t\t? this._graph_ids_by_shader_name.get(shader_name)?.get(graph_id)\n\t// \t\t\t\t\t: true;\n\t// \t\t\t\tif (is_present) {\n\t// \t\t\t\t\tconst node = this._graph.nodeFromId(graph_id) as BaseNodeByContextMap[NC];\n\t// \t\t\t\t\tif (node.parent() == parent) {\n\t// \t\t\t\t\t\tnodes.push(node);\n\t// \t\t\t\t\t}\n\t// \t\t\t\t}\n\t// \t\t\t});\n\t// \t\t}\n\t// \t});\n\t// \tconst first_node = nodes[0];\n\t// \tif (parent.context() == first_node.context()) {\n\t// \t\tnodes.push(parent as BaseNodeByContextMap[NC]);\n\t// \t}\n\n\t// \treturn nodes;\n\t// }\n\n\tprivate _findLeavesFromRootNode(rootNode: BaseNodeByContextMap[NC]) {\n\t\tthis._graph_ids_by_shader_name.get(this._shaderName)?.set(rootNode.graphNodeId(), true);\n\n\t\t// if rootNode is a subnet, traverse its children output nodes instead\n\t\tif (rootNode.childrenAllowed() && this._traverseChildren()) {\n\t\t\tconst outputNode = rootNode.childrenController?.outputNode() as BaseNodeByContextMap[NC] | undefined;\n\t\t\tif (outputNode) {\n\t\t\t\tthis._findLeavesFromRootNode(outputNode);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\tconst inputNames = this.inputNamesForShaderName(rootNode, this._shaderName);\n\t\tif (inputNames) {\n\t\t\tfor (const inputName of inputNames) {\n\t\t\t\tconst input = rootNode.io.inputs.named_input(inputName) as BaseNodeByContextMap[NC];\n\t\t\t\tif (input) {\n\t\t\t\t\tpushOnArrayAtEntry(this._outputs_by_graph_id, input.graphNodeId(), rootNode.graphNodeId());\n\t\t\t\t\tthis._findLeaves(input);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._outputs_by_graph_id.forEach((outputs: CoreGraphNodeId[], graph_id: CoreGraphNodeId) => {\n\t\t\tconst uniqIds: number[] = [];\n\t\t\tarrayUniq(outputs, uniqIds);\n\t\t\tthis._outputs_by_graph_id.set(graph_id, uniqIds);\n\t\t});\n\t}\n\tprivate _blockedInputNames: Map<string, string[]> | undefined;\n\tsetBlockedInputNames(nodeType: string, inputNames: string[]) {\n\t\tthis._blockedInputNames = this._blockedInputNames || new Map();\n\t\tthis._blockedInputNames.set(nodeType, inputNames);\n\t}\n\n\tprotected _findLeaves(node: BaseNodeByContextMap[NC]) {\n\t\tthis._graph_ids_by_shader_name.get(this._shaderName)?.set(node.graphNodeId(), true);\n\n\t\tconst inputs = this._findInputs(node) as BaseNodeByContextMap[NC][];\n\t\tconst compactInputs: BaseNodeByContextMap[NC][] = [];\n\t\tarrayCompact(inputs, compactInputs);\n\t\tconst inputGraphIds: number[] = [];\n\t\tarrayUniq(\n\t\t\tcompactInputs.map((n) => n.graphNodeId()),\n\t\t\tinputGraphIds\n\t\t);\n\t\tconst uniqueInputs = inputGraphIds.map((graph_id) =>\n\t\t\tthis._graph.nodeFromId(graph_id)\n\t\t) as BaseNodeByContextMap[NC][];\n\n\t\tif (uniqueInputs.length > 0) {\n\t\t\tfor (const input of uniqueInputs) {\n\t\t\t\tpushOnArrayAtEntry(this._outputs_by_graph_id, input.graphNodeId(), node.graphNodeId());\n\n\t\t\t\tthis._findLeaves(input);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._leaves_graph_id.get(this._shaderName)!.set(node.graphNodeId(), true);\n\t\t}\n\t}\n\tgetNodeInputs(node: BaseNodeByContextMap[NC]) {\n\t\tif (this._blockedInputNames == null || !this._blockedInputNames.has(node.type())) {\n\t\t\treturn node.io.inputs.inputs();\n\t\t} else {\n\t\t\tconst blockedInputNames = this._blockedInputNames.get(node.type()) as string[];\n\t\t\tconst inputConnectionPoints = node.io.inputs.namedInputConnectionPoints() as BaseGlConnectionPoint[];\n\t\t\tconst inputConnectionPointNames = inputConnectionPoints.map((c) => c.name());\n\t\t\tconst allowedInputNames: string[] = [];\n\t\t\tarrayDifference(inputConnectionPointNames, blockedInputNames, allowedInputNames);\n\t\t\tconst inputs = allowedInputNames.map((inputName) => {\n\t\t\t\tconst inputIndex = node.io.inputs.getNamedInputIndex(inputName);\n\t\t\t\treturn node.io.inputs.input(inputIndex);\n\t\t\t});\n\t\t\treturn inputs;\n\t\t}\n\t}\n\n\tprivate _findInputs(node: BaseNodeByContextMap[NC]) {\n\t\tif (this._traverseChildren()) {\n\t\t\tif (node.type() == NetworkChildNodeType.INPUT) {\n\t\t\t\tconst parent = node.parent() as BaseNodeByContextMap[NC];\n\t\t\t\treturn parent ? this.getNodeInputs(parent) : [];\n\t\t\t\t// return node.parent()?.io.inputs.inputs() || [];\n\t\t\t} else {\n\t\t\t\tif (node.childrenAllowed()) {\n\t\t\t\t\t// this._subnets_by_id.set(node.graphNodeId(), node);\n\t\t\t\t\tconst outputNode = node.childrenController?.outputNode();\n\t\t\t\t\treturn [outputNode];\n\t\t\t\t} else {\n\t\t\t\t\treturn this.getNodeInputs(node); //node.io.inputs.inputs();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this.getNodeInputs(node); //node.io.inputs.inputs();\n\t\t}\n\t}\n\n\tprivate _setNodesDepth() {\n\t\tthis._leaves_graph_id.forEach((booleans_by_graph_id, shader_name) => {\n\t\t\tbooleans_by_graph_id.forEach((boolean, graph_id) => {\n\t\t\t\tthis._setNodeDepth(graph_id);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _setNodeDepth(graph_id: CoreGraphNodeId, depth: number = 0) {\n\t\t/*\n\t\tadjust graph depth by hierarchical depth\n\t\tmeaning that nodes inside a subnet should add their depth to the parent (and a multiplier)\n\t\tso that nodes outside of a subnet do not have a depth that ends up between the depths of 2 subnet children.\n\t\t*/\n\t\t// let depth_offset = 0;\n\t\t// const node = this._graph.node_from_id(graph_id) as BaseNodeType;\n\t\t// if (node.type == NetworkChildNodeType.INPUT) {\n\t\t// \tconst parent = node.parent;\n\t\t// \tif (parent) {\n\t\t// \t\tdepth_offset = parent.children().length * 10;\n\t\t// \t}\n\t\t// }\n\t\t// depth += depth_offset;\n\t\t/*\n\t\tend hierarchical depth adjustment\n\t\t*/\n\n\t\tconst current_depth = this._depth_by_graph_id.get(graph_id);\n\t\tif (current_depth != null) {\n\t\t\tthis._depth_by_graph_id.set(graph_id, Math.max(current_depth, depth));\n\t\t} else {\n\t\t\tthis._depth_by_graph_id.set(graph_id, depth);\n\t\t}\n\n\t\tconst output_ids = this._outputs_by_graph_id.get(graph_id);\n\t\tif (output_ids) {\n\t\t\toutput_ids.forEach((output_id) => {\n\t\t\t\tthis._setNodeDepth(output_id, depth + 1);\n\t\t\t});\n\t\t}\n\t}\n}\n","import {NodeContext} from '../../../poly/NodeContext';\n\nexport enum ShaderName {\n\tVERTEX = 'vertex',\n\tFRAGMENT = 'fragment',\n\tLEAVES_FROM_NODES_SHADER = 'leaves_from_nodes_shader',\n\t//\n\t// VELOCITY = 'velocity',\n\t// COLLIDER = 'collider',\n}\n\nexport enum JsFunctionName {\n\tMAIN = 'main',\n\tVELOCITY = 'velocity',\n\tCOLLIDER = 'collider',\n}\n\nexport interface ShaderNameByContextMap {\n\t[NodeContext.GL]: ShaderName;\n\t[NodeContext.JS]: JsFunctionName;\n\t//\n\t[NodeContext.ANIM]: ShaderName;\n\t[NodeContext.AUDIO]: ShaderName;\n\t[NodeContext.COP]: ShaderName;\n\t[NodeContext.EVENT]: ShaderName;\n\t[NodeContext.MANAGER]: ShaderName;\n\t[NodeContext.MAT]: ShaderName;\n\t[NodeContext.OBJ]: ShaderName;\n\t[NodeContext.POST]: ShaderName;\n\t[NodeContext.SOP]: ShaderName;\n\t[NodeContext.ROP]: ShaderName;\n}\n","import {NodeContext} from '../../engine/poly/NodeContext';\nimport {ParamType} from '../../engine/poly/ParamType';\nimport {NodeStatesController} from '../../engine/nodes/utils/StatesController';\nimport {PolyScene} from '../../engine/scene/PolyScene';\nimport {InputCloneMode} from '../../engine/poly/InputCloneMode';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {isBoolean, isNumber, isString, isArray} from '../../core/Type';\nimport {TypedNodePathParamValue, TypedParamPathParamValue} from '../../core/Walker';\nimport {Vector3} from 'three';\nimport {SimpleParamJsonExporterData} from '../nodes/utils/io/IOController';\nimport {DefaultOperationParams} from '../../core/operations/_Base';\nimport {OnOperationRegisterCallback} from '../poly/registers/nodes/NodesRegister';\n\nexport interface ConvertExportParamDataParams {\n\tparamName: string;\n\tparamData: SimpleParamJsonExporterData<ParamType>;\n\tparams: DefaultOperationParams;\n}\n\nexport const OPERATIONS_COMPOSER_NODE_TYPE: Readonly<string> = 'operationsComposer';\n\nexport class BaseOperation<NC extends NodeContext> {\n\tstatic type(): string {\n\t\tthrow 'type to be overriden';\n\t}\n\ttype() {\n\t\tconst c = this.constructor as typeof BaseOperation;\n\t\treturn c.type();\n\t}\n\tstatic onRegister: OnOperationRegisterCallback | undefined;\n\tstatic context(): NodeContext {\n\t\tconsole.error('operation has no node_context', this);\n\t\tthrow 'context requires override';\n\t}\n\tcontext(): NodeContext {\n\t\tconst c = this.constructor as typeof BaseOperation;\n\t\treturn c.context();\n\t}\n\n\tstatic readonly DEFAULT_PARAMS: DefaultOperationParams = {};\n\tstatic readonly INPUT_CLONED_STATE: InputCloneMode | InputCloneMode[] = [];\n\n\tconstructor(\n\t\tprotected _scene: PolyScene,\n\t\tprotected states?: NodeStatesController<NC>,\n\t\tprotected _node?: BaseNodeType\n\t) {}\n\tscene() {\n\t\treturn this._scene;\n\t}\n\tcook(input_contents: any[], params: object): any {}\n\n\tconvertExportParamData(options: ConvertExportParamDataParams) {\n\t\tconst {params, paramName, paramData} = options;\n\t\tconst default_param = params[paramName];\n\t\tif (isBoolean(paramData)) {\n\t\t\treturn paramData;\n\t\t}\n\t\tif (isNumber(paramData)) {\n\t\t\tif (isBoolean(default_param)) {\n\t\t\t\t// if we receive 0, it may be for a boolean param,\n\t\t\t\t// so if the default is a boolean, we convert\n\t\t\t\treturn paramData >= 1 ? true : false;\n\t\t\t} else {\n\t\t\t\treturn paramData;\n\t\t\t}\n\t\t}\n\t\tif (isString(paramData)) {\n\t\t\tif (default_param) {\n\t\t\t\tif (default_param instanceof TypedNodePathParamValue) {\n\t\t\t\t\treturn default_param.setPath(paramData);\n\t\t\t\t}\n\t\t\t\tif (default_param instanceof TypedParamPathParamValue) {\n\t\t\t\t\treturn default_param.setPath(paramData);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn paramData;\n\t\t}\n\t\tif (isArray(paramData)) {\n\t\t\t(params[paramName] as Vector3).fromArray(paramData as number[]);\n\t\t}\n\t}\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {CoreAttribute} from '../../../../../core/geometry/Attribute';\nimport {AttribCreateSopParams} from '../../AttribCreate';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {hasGroupFromParamValues} from './Common';\nimport {corePointClassFactory} from '../../../../../core/geometry/CoreObjectFactory';\nimport {CoreObjectType, ObjectContent} from '../../../../../core/geometry/ObjectContent';\nimport {pointsFromObject, pointsFromObjectFromGroup} from '../../../../../core/geometry/entities/point/CorePointUtils';\nimport {CorePoint} from '../../../../../core/geometry/entities/point/CorePoint';\n\nexport function addPointAttribute(attribType: AttribType, coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\tconst objects = coreGroup.allObjects();\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\tfor (let object of objects) {\n\t\t\t\t_addNumericAttributeToPoints(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\tfor (let object of objects) {\n\t\t\t\t_addStringAttributeToPoints(object, params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nconst _points: CorePoint<CoreObjectType>[] = [];\nconst _allPoints: CorePoint<CoreObjectType>[] = [];\nfunction _addNumericAttributeToPoints<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopParams\n) {\n\tconst corePointClass = corePointClassFactory(object);\n\n\t// const coreGeometry = coreObject.coreGeometry();\n\t// if (!coreGeometry) {\n\t// \treturn;\n\t// }\n\tconst value = [params.value1, params.value2, params.value3, params.value4][params.size - 1];\n\n\tconst attribName = CoreAttribute.remapName(params.name);\n\tif (!corePointClass.hasAttribute(object, attribName)) {\n\t\tcorePointClass.addNumericAttribute(object, attribName, params.size, 0);\n\t} else {\n\t\tcorePointClass.markAttribAsNeedsUpdate(object, attribName);\n\t}\n\n\tif (params.group) {\n\t\tpointsFromObjectFromGroup(object, params.group, _points);\n\t\tfor (let point of _points) {\n\t\t\tpoint.setAttribValue(attribName, value);\n\t\t}\n\t} else {\n\t\tcorePointClass.addNumericAttribute(object, attribName, params.size, value);\n\t}\n}\n\nfunction _addStringAttributeToPoints<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopParams\n) {\n\tconst corePointClass = corePointClassFactory(object);\n\t// const coreGeometry = coreObject.coreGeometry();\n\t// if (!coreGeometry) {\n\t// \treturn;\n\t// }\n\tpointsFromObjectFromGroup(object, params.group, _points);\n\tconst attribName = params.name;\n\tconst value = params.string;\n\n\tlet stringValues: string[] = new Array(_points.length);\n\n\t// if a group is given, we prefill the existing stringValues\n\tif (hasGroupFromParamValues(params)) {\n\t\tpointsFromObject(object, _allPoints);\n\t\tstringValues = stringValues.length != _allPoints.length ? new Array(_allPoints.length) : stringValues;\n\t\t// create attrib if non existent\n\t\tif (!corePointClass.hasAttribute(object, attribName)) {\n\t\t\tconst tmpIndexData = CoreAttribute.arrayToIndexedArrays(['']);\n\t\t\tcorePointClass.setIndexedAttribute(object, attribName, tmpIndexData['values'], tmpIndexData['indices']);\n\t\t}\n\n\t\tfor (const point of _allPoints) {\n\t\t\tlet currentValue = point.stringAttribValue(attribName);\n\t\t\tif (currentValue == null) {\n\t\t\t\tcurrentValue = '';\n\t\t\t}\n\t\t\tstringValues[point.index()] = currentValue;\n\t\t}\n\t}\n\n\tfor (const point of _points) {\n\t\tstringValues[point.index()] = value;\n\t}\n\n\tconst indexData = CoreAttribute.arrayToIndexedArrays(stringValues);\n\n\tcorePointClass.setIndexedAttribute(object, attribName, indexData['values'], indexData['indices']);\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {CoreAttribute} from '../../../../../core/geometry/Attribute';\nimport {AttribCreateSopParams} from '../../AttribCreate';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {\n\tverticesFromObject,\n\tverticesFromObjectFromGroup,\n} from '../../../../../core/geometry/entities/vertex/CoreVertexUtils';\nimport {coreVertexClassFactory} from '../../../../../core/geometry/CoreObjectFactory';\nimport {CoreObjectType, ObjectContent} from '../../../../../core/geometry/ObjectContent';\nimport {CoreVertex} from '../../../../../core/geometry/entities/vertex/CoreVertex';\n\nexport function addVertexAttribute(attribType: AttribType, coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\tconst objects = coreGroup.allObjects();\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\tfor (let object of objects) {\n\t\t\t\t_addAttributeToVertices(object, params, false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\tfor (let object of objects) {\n\t\t\t\t_addAttributeToVertices(object, params, true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nconst _vertices: CoreVertex<CoreObjectType>[] = [];\nfunction _addAttributeToVertices<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopParams,\n\tisString: boolean\n) {\n\tconst value = isString\n\t\t? params.string\n\t\t: [params.value1, params.value2, params.value3, params.value4][params.size - 1];\n\tconst attribName = CoreAttribute.remapName(params.name);\n\n\t// add default if not found\n\tconst vertexClass = coreVertexClassFactory(object);\n\tlet attribute = vertexClass.attribute(object, attribName);\n\tif (!attribute) {\n\t\tconst verticesCount = vertexClass.entitiesCount(object);\n\t\tconst values = new Array(verticesCount * params.size).fill(value);\n\t\tattribute = {array: values, itemSize: params.size, isString: isString};\n\t\tvertexClass.addAttribute(object, attribName, attribute);\n\t}\n\n\t// set values\n\tif (params.group) {\n\t\tverticesFromObjectFromGroup(object, params.group, _vertices);\n\t\tfor (let vertex of _vertices) {\n\t\t\tvertex.setAttribValue(attribName, value);\n\t\t}\n\t} else {\n\t\tverticesFromObject(object, _vertices);\n\t\tfor (let vertex of _vertices) {\n\t\t\tvertex.setAttribValue(attribName, value);\n\t\t}\n\t}\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {CoreAttribute} from '../../../../../core/geometry/Attribute';\nimport {AttribCreateSopParams} from '../../AttribCreate';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {\n\tprimitivesFromObject,\n\tprimitivesFromObjectFromGroup,\n} from '../../../../../core/geometry/entities/primitive/CorePrimitiveUtils';\nimport {corePrimitiveClassFactory} from '../../../../../core/geometry/CoreObjectFactory';\nimport {CoreObjectType, ObjectContent} from '../../../../../core/geometry/ObjectContent';\nimport {CorePrimitive} from '../../../../../core/geometry/entities/primitive/CorePrimitive';\n\nexport function addPrimitiveAttribute(attribType: AttribType, coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\tconst objects = coreGroup.allObjects();\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\tfor (let object of objects) {\n\t\t\t\t_addAttributeToPrimitives(object, params, false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\tfor (let object of objects) {\n\t\t\t\t_addAttributeToPrimitives(object, params, true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nconst _primitives: CorePrimitive<CoreObjectType>[] = [];\nfunction _addAttributeToPrimitives<T extends CoreObjectType>(\n\tobject: ObjectContent<T>,\n\tparams: AttribCreateSopParams,\n\tisString: boolean\n) {\n\tconst value = isString\n\t\t? params.string\n\t\t: [params.value1, params.value2, params.value3, params.value4][params.size - 1];\n\tconst attribName = CoreAttribute.remapName(params.name);\n\n\t// add default if not found\n\tconst primitiveClass = corePrimitiveClassFactory(object);\n\tlet attribute = primitiveClass.attribute(object, attribName);\n\tif (!attribute) {\n\t\tconst primitivesCount = primitiveClass.entitiesCount(object);\n\t\tconst values = new Array(primitivesCount * params.size).fill(value);\n\t\tattribute = isString\n\t\t\t? {array: values, itemSize: 1, isString}\n\t\t\t: {array: values, itemSize: params.size, isString};\n\t\tprimitiveClass.addAttribute(object, attribName, attribute);\n\t}\n\n\t// set values\n\tif (params.group) {\n\t\tprimitivesFromObjectFromGroup(object, params.group, _primitives);\n\t\tfor (const primitive of _primitives) {\n\t\t\tprimitive.setAttribValue(attribName, value);\n\t\t}\n\t} else {\n\t\tprimitivesFromObject(object, _primitives);\n\t\tfor (const primitive of _primitives) {\n\t\t\tprimitive.setAttribValue(attribName, value);\n\t\t}\n\t}\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {AttribCreateSopParams} from '../../AttribCreate';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {CoreMask} from '../../../../../core/geometry/Mask';\nimport {BaseCoreObject} from '../../../../../core/geometry/entities/object/BaseCoreObject';\nimport {CoreObjectType} from '../../../../../core/geometry/ObjectContent';\nimport {defaultAttribValue} from './Common';\n\nexport function addObjectAttributeWithoutExpression(\n\tattribType: AttribType,\n\tcoreGroup: CoreGroup,\n\tparams: AttribCreateSopParams\n) {\n\tconst coreObjects = CoreMask.filterCoreObjects(coreGroup, params, coreGroup.allCoreObjects());\n\n\t// add attrib if non existent\n\tconst attribName = params.name;\n\tconst allCoreObjects = coreGroup.allCoreObjects();\n\tconst defaultValue = defaultAttribValue(params);\n\tif (defaultValue != null) {\n\t\tfor (let coreObject of allCoreObjects) {\n\t\t\tif (!coreObject.hasAttribute(attribName)) {\n\t\t\t\tcoreObject.setAttribValue(attribName, defaultValue);\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC:\n\t\t\t_addNumericAttributeToObjects(coreObjects, params);\n\t\t\treturn;\n\t\tcase AttribType.STRING:\n\t\t\t_addStringAttributeToObjects(coreObjects, params);\n\t\t\treturn;\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nfunction _addNumericAttributeToObjects<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<T>[],\n\tparams: AttribCreateSopParams\n) {\n\tconst value = [params.value1, params.value2, params.value3, params.value4][params.size - 1];\n\tconst attribName = params.name;\n\tfor (let coreObject of coreObjects) {\n\t\tcoreObject.setAttribValue(attribName, value);\n\t}\n}\n\nfunction _addStringAttributeToObjects<T extends CoreObjectType>(\n\tcoreObjects: BaseCoreObject<T>[],\n\tparams: AttribCreateSopParams\n) {\n\tconst value = params.string;\n\tfor (let coreObject of coreObjects) {\n\t\tcoreObject.setAttribValue(params.name, value);\n\t}\n}\n","import {CoreGroup} from '../../../../../core/geometry/Group';\nimport {AttribCreateSopParams} from '../../AttribCreate';\nimport {AttribType} from '../../../../../core/geometry/Constant';\nimport {TypeAssert} from '../../../../poly/Assert';\n\nexport function addCoreGroupAttribute(attribType: AttribType, coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC:\n\t\t\t_addNumericAttributeToCoreGroup(coreGroup, params);\n\t\t\treturn;\n\t\tcase AttribType.STRING:\n\t\t\t_addStringAttributeToCoreGroup(coreGroup, params);\n\t\t\treturn;\n\t}\n\tTypeAssert.unreachable(attribType);\n}\n\nfunction _addNumericAttributeToCoreGroup(coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\tconst value = [params.value1, params.value2, params.value3, params.value4][params.size - 1];\n\tconst attribName = params.name;\n\tcoreGroup.setAttribValue(attribName, value);\n}\n\nfunction _addStringAttributeToCoreGroup(coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\tconst value = params.string;\n\tcoreGroup.setAttribValue(params.name, value);\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Vector2} from 'three';\nimport {Vector3} from 'three';\nimport {Vector4} from 'three';\nimport {ATTRIBUTE_CLASSES, AttribClass, AttribType, ATTRIBUTE_TYPES} from '../../../core/geometry/Constant';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {TypeAssert} from '../../../engine/poly/Assert';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {addPointAttribute} from './utils/attribCreate/AttribCreatePoint';\nimport {addVertexAttribute} from './utils/attribCreate/AttribCreateVertex';\nimport {addPrimitiveAttribute} from './utils/attribCreate/AttribCreatePrimitive';\nimport {addObjectAttributeWithoutExpression} from './utils/attribCreate/AttribCreateObject';\nimport {addCoreGroupAttribute} from './utils/attribCreate/AttribCreateCoreGroup';\n\nexport interface AttribCreateSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tclass: number;\n\ttype: number;\n\tname: string;\n\tsize: number;\n\tvalue1: number;\n\tvalue2: Vector2;\n\tvalue3: Vector3;\n\tvalue4: Vector4;\n\tstring: string;\n}\n\nexport class AttribCreateSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: AttribCreateSopParams = {\n\t\tgroup: '',\n\t\tclass: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),\n\t\ttype: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC),\n\t\tname: 'newAttrib',\n\t\tsize: 1,\n\t\tvalue1: 0,\n\t\tvalue2: new Vector2(0, 0),\n\t\tvalue3: new Vector3(0, 0, 0),\n\t\tvalue4: new Vector4(0, 0, 0, 0),\n\t\tstring: '',\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<'attribCreate'> {\n\t\treturn 'attribCreate';\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[], params: AttribCreateSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst attribName = params.name;\n\t\tif (attribName && attribName.trim() != '') {\n\t\t\tthis._addAttribute(ATTRIBUTE_CLASSES[params.class], coreGroup, params);\n\t\t} else {\n\t\t\tthis.states?.error.set('attribute name is not valid');\n\t\t}\n\t\treturn coreGroup;\n\t}\n\tprivate _addAttribute(attribClass: AttribClass, coreGroup: CoreGroup, params: AttribCreateSopParams) {\n\t\tconst attribType = ATTRIBUTE_TYPES[params.type];\n\t\tswitch (attribClass) {\n\t\t\tcase AttribClass.POINT:\n\t\t\t\treturn addPointAttribute(attribType, coreGroup, params);\n\t\t\tcase AttribClass.VERTEX:\n\t\t\t\treturn addVertexAttribute(attribType, coreGroup, params);\n\t\t\tcase AttribClass.PRIMITIVE:\n\t\t\t\treturn addPrimitiveAttribute(attribType, coreGroup, params);\n\t\t\tcase AttribClass.OBJECT:\n\t\t\t\treturn addObjectAttributeWithoutExpression(attribType, coreGroup, params);\n\t\t\tcase AttribClass.CORE_GROUP:\n\t\t\t\treturn addCoreGroupAttribute(attribType, coreGroup, params);\n\t\t}\n\t\tTypeAssert.unreachable(attribClass);\n\t}\n}\n","import {TypeAssert} from './../../poly/Assert';\nimport {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {AttribClass, ATTRIBUTE_CLASSES} from '../../../core/geometry/Constant';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {coreObjectClassFactory, coreObjectInstanceFactory} from '../../../core/geometry/CoreObjectFactory';\nimport {filterObjectsFromCoreGroup} from '../../../core/geometry/Mask';\nimport {CoreEntity} from '../../../core/geometry/CoreEntity';\nimport {ENTITY_CLASS_FACTORY} from '../../../core/geometry/CoreObjectFactory';\nimport {arrayMin, arrayMax, ArrayToItemFunction} from '../../../core/ArrayUtils';\nimport {AttribValue, Constructor} from '../../../types/GlobalTypes';\nimport {isNumber, isString, isBoolean} from '../../../core/Type';\nimport {Vector2, Vector3, Vector4, Color} from 'three';\nimport {TraversedRelatedEntityData} from '../../../core/geometry/entities/utils/TraversedRelatedEntities';\nimport {pushOnArrayAtEntry} from '../../../core/MapUtils';\nimport {CorePoint} from '../../../core/geometry/entities/point/CorePoint';\nimport {CoreObjectType} from '../../../core/geometry/ObjectContent';\nconst _v2 = new Vector2();\nconst _v3 = new Vector3();\nconst _v4 = new Vector4();\nconst _c = new Color();\n\ninterface AttribPromoteSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tclassFrom: number;\n\tclassTo: number;\n\tmode: number;\n\tname: string;\n}\n\nexport enum AttribPromoteMode {\n\tMIN = 'min',\n\tMAX = 'max',\n\tFIRST_FOUND = 'first found',\n}\nexport const ATTRIB_PROMOTE_MODES: AttribPromoteMode[] = [\n\tAttribPromoteMode.MIN,\n\tAttribPromoteMode.MAX,\n\tAttribPromoteMode.FIRST_FOUND,\n];\n\nexport class AttribPromoteSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: AttribPromoteSopParams = {\n\t\tgroup: '',\n\t\tclassFrom: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),\n\t\tclassTo: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT),\n\t\tmode: ATTRIB_PROMOTE_MODES.indexOf(AttribPromoteMode.FIRST_FOUND),\n\t\tname: '',\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<'attribPromote'> {\n\t\treturn 'attribPromote';\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[], params: AttribPromoteSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\n\t\tconst classFrom = ATTRIBUTE_CLASSES[params.classFrom];\n\t\tconst classTo = ATTRIBUTE_CLASSES[params.classTo];\n\t\tconst mode = ATTRIB_PROMOTE_MODES[params.mode];\n\n\t\tconst objects = filterObjectsFromCoreGroup(coreGroup, params);\n\t\tfor (const object of objects) {\n\t\t\tconst factoryFrom = ENTITY_CLASS_FACTORY[classFrom];\n\t\t\tconst factoryTo = ENTITY_CLASS_FACTORY[classTo];\n\t\t\tconst attribNames = factoryFrom\n\t\t\t\t? factoryFrom(object).attributeNamesMatchingMask(object, params.name)\n\t\t\t\t: coreGroup.attributeNamesMatchingMask(params.name);\n\n\t\t\t// add attribute if it does not exist on the dest entities\n\t\t\tfor (const attribName of attribNames) {\n\t\t\t\tconst hasAttribute = factoryTo\n\t\t\t\t\t? factoryTo(object).hasAttribute(object, attribName)\n\t\t\t\t\t: coreGroup.hasAttribute(attribName);\n\t\t\t\tif (!hasAttribute) {\n\t\t\t\t\tconst srcAttribSize: number | null = factoryFrom\n\t\t\t\t\t\t? factoryFrom(object).attribSize(object, attribName)\n\t\t\t\t\t\t: coreGroup.attribSize(attribName);\n\t\t\t\t\tif (srcAttribSize != null) {\n\t\t\t\t\t\tif (factoryTo) {\n\t\t\t\t\t\t\tfactoryTo(object).addNumericAttribute(object, attribName, srcAttribSize);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcoreGroup.addNumericAttribute(attribName, srcAttribSize);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// promote attribute\n\t\t\tconst destEntities: CoreEntity[] = [];\n\t\t\tconst srcEntities: CoreEntity[] = [];\n\t\t\tconst traversedRelatedEntityData: TraversedRelatedEntityData = {\n\t\t\t\t[AttribClass.CORE_GROUP]: {ids: []},\n\t\t\t\t[AttribClass.OBJECT]: {ids: []},\n\t\t\t\t[AttribClass.POINT]: {ids: []},\n\t\t\t\t[AttribClass.PRIMITIVE]: {ids: []},\n\t\t\t\t[AttribClass.VERTEX]: {ids: []},\n\t\t\t};\n\t\t\tconst coreObjectClass = coreObjectClassFactory(object);\n\t\t\tcoreObjectInstanceFactory(object).relatedEntities(\n\t\t\t\tclassTo,\n\t\t\t\tcoreGroup,\n\t\t\t\tdestEntities,\n\t\t\t\ttraversedRelatedEntityData\n\t\t\t);\n\t\t\tconst traversedClassFromEntityIds = traversedRelatedEntityData[classFrom].ids;\n\t\t\tconst classFromEntitiesByClassToEntitytIndex: Map<number, CoreEntity[]> = new Map();\n\t\t\tif (traversedClassFromEntityIds.length > 0 && classFrom != AttribClass.CORE_GROUP) {\n\t\t\t\tconst entityClassFrom = coreObjectClass.relatedEntityClass(object, classFrom) as any as Constructor<\n\t\t\t\t\tCorePoint<CoreObjectType>\n\t\t\t\t>;\n\t\t\t\tfor (const classFromEntityId of traversedClassFromEntityIds) {\n\t\t\t\t\tconst classToEntities: CoreEntity[] = [];\n\t\t\t\t\tconst classFromEntity = new entityClassFrom(object, classFromEntityId);\n\t\t\t\t\tclassFromEntity.relatedEntities(classTo, coreGroup, classToEntities);\n\t\t\t\t\tfor (const classToEntity of classToEntities) {\n\t\t\t\t\t\tconst index = classToEntity.index();\n\t\t\t\t\t\tpushOnArrayAtEntry(classFromEntitiesByClassToEntitytIndex, index, classFromEntity);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const destEntity of destEntities) {\n\t\t\t\tconst cachedEntities = classFromEntitiesByClassToEntitytIndex.get(destEntity.index());\n\t\t\t\tif (cachedEntities) {\n\t\t\t\t\tfor (const attribName of attribNames) {\n\t\t\t\t\t\tthis._promoteAttribute(attribName, cachedEntities, destEntity, mode);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdestEntity.relatedEntities(classFrom, coreGroup, srcEntities);\n\t\t\t\t\tfor (const attribName of attribNames) {\n\t\t\t\t\t\tthis._promoteAttribute(attribName, srcEntities, destEntity, mode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\n\tprivate _promoteAttribute(\n\t\tattribName: string,\n\t\tsrcEntities: CoreEntity[],\n\t\tdestEntity: CoreEntity,\n\t\tmode: AttribPromoteMode\n\t) {\n\t\tconst srcValues = srcEntities.map((entity) => entity.attribValue(attribName)!);\n\t\tconst destValue = this._convertSrcValues(srcValues, mode);\n\t\tdestEntity.setAttribValue(attribName, destValue as any);\n\t}\n\tprivate _convertSrcValues(srcValues: AttribValue[], mode: AttribPromoteMode): AttribValue {\n\t\tswitch (mode) {\n\t\t\tcase AttribPromoteMode.MIN: {\n\t\t\t\treturn this._convertValuesMin(srcValues);\n\t\t\t}\n\t\t\tcase AttribPromoteMode.MAX: {\n\t\t\t\treturn this._convertValuesMax(srcValues);\n\t\t\t}\n\t\t\tcase AttribPromoteMode.FIRST_FOUND: {\n\t\t\t\treturn this._convertValuesFirstFound(srcValues);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(mode);\n\t}\n\tprivate _convertValuesMin(srcValues: AttribValue[]): AttribValue {\n\t\treturn this._convertValuesMinMax(srcValues, arrayMin);\n\t}\n\tprivate _convertValuesMax(srcValues: AttribValue[]): AttribValue {\n\t\treturn this._convertValuesMinMax(srcValues, arrayMax);\n\t}\n\tprivate _convertValuesMinMax(srcValues: AttribValue[], arrayFunc: ArrayToItemFunction<number>): AttribValue {\n\t\tconst firstValue = srcValues[0];\n\t\tif (isNumber(firstValue) || isString(firstValue) || isBoolean(firstValue)) {\n\t\t\treturn arrayFunc(srcValues as number[]);\n\t\t}\n\n\t\tif (firstValue instanceof Vector2) {\n\t\t\t_v2.x = arrayFunc((srcValues as Vector2[]).map((v) => v.x));\n\t\t\t_v2.y = arrayFunc((srcValues as Vector2[]).map((v) => v.y));\n\t\t\treturn _v2;\n\t\t}\n\t\tif (firstValue instanceof Vector3) {\n\t\t\t_v3.x = arrayFunc((srcValues as Vector3[]).map((v) => v.x));\n\t\t\t_v3.y = arrayFunc((srcValues as Vector3[]).map((v) => v.y));\n\t\t\t_v3.z = arrayFunc((srcValues as Vector3[]).map((v) => v.z));\n\t\t\treturn _v3;\n\t\t}\n\t\tif (firstValue instanceof Color) {\n\t\t\t_c.r = arrayFunc((srcValues as Color[]).map((c) => c.r));\n\t\t\t_c.g = arrayFunc((srcValues as Color[]).map((c) => c.g));\n\t\t\t_c.b = arrayFunc((srcValues as Color[]).map((c) => c.b));\n\t\t\treturn _c;\n\t\t}\n\t\tif (firstValue instanceof Vector4) {\n\t\t\t_v4.x = arrayFunc((srcValues as Vector4[]).map((v) => v.x));\n\t\t\t_v4.y = arrayFunc((srcValues as Vector4[]).map((v) => v.y));\n\t\t\t_v4.z = arrayFunc((srcValues as Vector4[]).map((v) => v.z));\n\t\t\t_v4.w = arrayFunc((srcValues as Vector4[]).map((v) => v.w));\n\t\t\treturn _v4;\n\t\t}\n\t\treturn 0;\n\t}\n\tprivate _convertValuesFirstFound(srcValues: AttribValue[]): AttribValue {\n\t\treturn srcValues[0];\n\t}\n}\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute\n} from 'three';\n\nclass BoxLineGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\tconst widthHalf = width / 2;\n\t\tconst heightHalf = height / 2;\n\t\tconst depthHalf = depth / 2;\n\n\t\tconst segmentWidth = width / widthSegments;\n\t\tconst segmentHeight = height / heightSegments;\n\t\tconst segmentDepth = depth / depthSegments;\n\n\t\tconst vertices = [];\n\n\t\tlet x = - widthHalf;\n\t\tlet y = - heightHalf;\n\t\tlet z = - depthHalf;\n\n\t\tfor ( let i = 0; i <= widthSegments; i ++ ) {\n\n\t\t\tvertices.push( x, - heightHalf, - depthHalf, x, heightHalf, - depthHalf );\n\t\t\tvertices.push( x, heightHalf, - depthHalf, x, heightHalf, depthHalf );\n\t\t\tvertices.push( x, heightHalf, depthHalf, x, - heightHalf, depthHalf );\n\t\t\tvertices.push( x, - heightHalf, depthHalf, x, - heightHalf, - depthHalf );\n\n\t\t\tx += segmentWidth;\n\n\t\t}\n\n\t\tfor ( let i = 0; i <= heightSegments; i ++ ) {\n\n\t\t\tvertices.push( - widthHalf, y, - depthHalf, widthHalf, y, - depthHalf );\n\t\t\tvertices.push( widthHalf, y, - depthHalf, widthHalf, y, depthHalf );\n\t\t\tvertices.push( widthHalf, y, depthHalf, - widthHalf, y, depthHalf );\n\t\t\tvertices.push( - widthHalf, y, depthHalf, - widthHalf, y, - depthHalf );\n\n\t\t\ty += segmentHeight;\n\n\t\t}\n\n\t\tfor ( let i = 0; i <= depthSegments; i ++ ) {\n\n\t\t\tvertices.push( - widthHalf, - heightHalf, z, - widthHalf, heightHalf, z );\n\t\t\tvertices.push( - widthHalf, heightHalf, z, widthHalf, heightHalf, z );\n\t\t\tvertices.push( widthHalf, heightHalf, z, widthHalf, - heightHalf, z );\n\t\t\tvertices.push( widthHalf, - heightHalf, z, - widthHalf, - heightHalf, z );\n\n\t\t\tz += segmentDepth;\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n}\n\nexport { BoxLineGeometry };\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Vector3, Box3} from 'three';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {BoxLineGeometry} from 'three/examples/jsm/geometries/BoxLineGeometry';\nimport {ObjectType} from '../../../core/geometry/Constant';\nconst tmpBox = new Box3();\nconst tmpSize = new Vector3();\nconst tmpCenter = new Vector3();\ninterface BoxLinesSopParams extends DefaultOperationParams {\n\tsize: number;\n\tsizes: Vector3;\n\tdivisions: Vector3;\n\tcenter: Vector3;\n}\n\n// const _sizes = new Vector3();\n// const _center = new Vector3();\nexport class BoxLinesSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: BoxLinesSopParams = {\n\t\tsize: 1,\n\t\tsizes: new Vector3(1, 1, 1),\n\t\tdivisions: new Vector3(1, 1, 1),\n\t\tcenter: new Vector3(0, 0, 0),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<'boxLines'> {\n\t\treturn 'boxLines';\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: BoxLinesSopParams) {\n\t\tconst inputCoreGroup = inputCoreGroups[0];\n\t\tconst object = inputCoreGroup ? this._cookWithInput(inputCoreGroup, params) : this._cookWithoutInput(params);\n\n\t\tif (this._node) {\n\t\t\tobject.name = this._node.name();\n\t\t}\n\n\t\treturn this.createCoreGroupFromObjects([object]);\n\t}\n\tprivate _cookWithoutInput(params: BoxLinesSopParams) {\n\t\treturn BoxLinesSopOperation.createLines(params);\n\t}\n\n\tprivate _cookWithInput(coreGroup: CoreGroup, params: BoxLinesSopParams) {\n\t\tcoreGroup.boundingBox(tmpBox);\n\t\ttmpBox.getSize(tmpSize);\n\t\ttmpBox.getCenter(tmpCenter);\n\n\t\treturn BoxLinesSopOperation.createLines({\n\t\t\tsize: 1,\n\t\t\tsizes: tmpSize,\n\t\t\tdivisions: params.divisions,\n\t\t\tcenter: tmpCenter,\n\t\t});\n\t}\n\n\tstatic createLines(params: BoxLinesSopParams) {\n\t\tconst geometry = new BoxLineGeometry(\n\t\t\tparams.sizes.x * params.size,\n\t\t\tparams.sizes.y * params.size,\n\t\t\tparams.sizes.z * params.size,\n\t\t\tMath.max(1, Math.floor(params.divisions.x)),\n\t\t\tMath.max(1, Math.floor(params.divisions.y)),\n\t\t\tMath.max(1, Math.floor(params.divisions.z))\n\t\t);\n\t\tgeometry.translate(params.center.x, params.center.y, params.center.z);\n\t\treturn this.createObject(geometry, ObjectType.LINE_SEGMENTS);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraCSSRendererSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tnode: TypedNodePathParamValue;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraCSSRendererSopParams;\n\tnode: BaseNodeType;\n\tactive: boolean;\n}\n\nexport class CameraCSSRendererSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraCSSRendererSopParams = {\n\t\tgroup: '',\n\t\tnode: new TypedNodePathParamValue(''),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.CSS_RENDERER> {\n\t\treturn CameraSopNodeType.CSS_RENDERER;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraCSSRendererSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraCSSRendererSopOperation.updateObject({objects, params, node: this._node, active: true});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params, node, active} = options;\n\t\tconst relativeOrAbsolutePath = params.node.path();\n\t\tconst foundNode = node.node(relativeOrAbsolutePath);\n\t\tif (foundNode && active) {\n\t\t\t// see CameraControls for why this method of storing the node is preferable\n\t\t\tconst nodeId = foundNode.graphNodeId();\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.CSS_RENDERER_NODE_ID, nodeId);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.deleteAttribute(object, CameraAttribute.CSS_RENDERER_NODE_ID);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraControlsSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tnode: TypedNodePathParamValue;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraControlsSopParams;\n\tnode: BaseNodeType;\n\tactive: boolean;\n\terrorIfNodeNotFound: boolean;\n}\n\nexport class CameraControlsSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraControlsSopParams = {\n\t\tgroup: '',\n\t\tnode: new TypedNodePathParamValue(''),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.CONTROLS> {\n\t\treturn CameraSopNodeType.CONTROLS;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraControlsSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraControlsSopOperation.updateObject({\n\t\t\t\tobjects,\n\t\t\t\tparams,\n\t\t\t\tnode: this._node,\n\t\t\t\tactive: true,\n\t\t\t\terrorIfNodeNotFound: true,\n\t\t\t});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params, node, active, errorIfNodeNotFound} = options;\n\n\t\tconst relativeOrAbsolutePath = params.node.path();\n\t\tconst foundNode = node.node(relativeOrAbsolutePath);\n\t\tif (foundNode && active) {\n\t\t\t// we need to give the absolute path, so that the creation of the viewer can find the node\n\t\t\t// without having to know which node set the path\n\t\t\t// Update: the absolute path on its own fails if some node in that path gets renamed.\n\t\t\t// Using the node id: this would fail if the target node was to be deleted and replaced.\n\t\t\t// Although that should really recook the camera\n\t\t\tconst nodeId = foundNode.graphNodeId();\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.CONTROLS_NODE_ID, nodeId);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.deleteAttribute(object, CameraAttribute.CONTROLS_NODE_ID);\n\t\t\t}\n\t\t\tif (errorIfNodeNotFound) {\n\t\t\t\tnode.states.error.set('controls node not found');\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraFPSSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tmaxFPS: number;\n\tallowDynamicChange: boolean;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraFPSSopParams;\n}\n\nexport class CameraFPSSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraFPSSopParams = {\n\t\tgroup: '',\n\t\tmaxFPS: 60,\n\t\tallowDynamicChange: false,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.FPS> {\n\t\treturn CameraSopNodeType.FPS;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraFPSSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraFPSSopOperation.updateObject({objects, params});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params} = options;\n\n\t\tfor (let object of objects) {\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.MAX_FPS, params.maxFPS);\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.MAX_FPS_DYNAMIC_CHANGE, params.allowDynamicChange);\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {CameraFrameMode, CAMERA_FRAME_MODES} from '../../../core/camera/CoreCameraFrameMode';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraFrameModeSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tframeMode: number;\n\texpectedAspectRatio: number;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraFrameModeSopParams;\n}\n\nexport class CameraFrameModeSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraFrameModeSopParams = {\n\t\tgroup: '',\n\t\tframeMode: CAMERA_FRAME_MODES.indexOf(CameraFrameMode.DEFAULT),\n\t\texpectedAspectRatio: 16 / 9,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.FRAME_MODE> {\n\t\treturn CameraSopNodeType.FRAME_MODE;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraFrameModeSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraFrameModeSopOperation.updateObject({objects, params});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params} = options;\n\n\t\tfor (let object of objects) {\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.FRAME_MODE, params.frameMode);\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.FRAME_MODE_EXPECTED_ASPECT_RATIO,\n\t\t\t\tparams.expectedAspectRatio\n\t\t\t);\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraPostProcessSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tuseOtherNode: boolean;\n\tnode: TypedNodePathParamValue;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraPostProcessSopParams;\n\tnode: BaseNodeType;\n\tactive: boolean;\n}\n\nexport class CameraPostProcessSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraPostProcessSopParams = {\n\t\tgroup: '',\n\t\tuseOtherNode: false,\n\t\tnode: new TypedNodePathParamValue(''),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.POST_PROCESS> {\n\t\treturn CameraSopNodeType.POST_PROCESS;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraPostProcessSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tconst relativeOrAbsolutePath = params.node.path();\n\t\tconst node = isBooleanTrue(params.useOtherNode) ? this._node?.node(relativeOrAbsolutePath) : this._node;\n\t\tif (node) {\n\t\t\tconst nodeId = node.graphNodeId();\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.POST_PROCESS_NODE_ID, nodeId);\n\t\t\t}\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params, node, active} = options;\n\t\tconst relativeOrAbsolutePath = params.node.path();\n\t\tconst foundNode = node.node(relativeOrAbsolutePath);\n\t\tif (foundNode && active) {\n\t\t\t// see CameraControls for why this method of storing the node is preferable\n\t\t\tconst nodeId = foundNode.graphNodeId();\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.POST_PROCESS_NODE_ID, nodeId);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.deleteAttribute(object, CameraAttribute.POST_PROCESS_NODE_ID);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraRenderSceneSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tnode: TypedNodePathParamValue;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraRenderSceneSopParams;\n\tnode: BaseNodeType;\n\tactive: boolean;\n}\n\nexport class CameraRenderSceneSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraRenderSceneSopParams = {\n\t\tgroup: '',\n\t\tnode: new TypedNodePathParamValue(''),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.RENDER_SCENE> {\n\t\treturn CameraSopNodeType.RENDER_SCENE;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraRenderSceneSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraRenderSceneSopOperation.updateObject({objects, params, node: this._node, active: true});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params, node, active} = options;\n\n\t\tconst relativeOrAbsolutePath = params.node.path();\n\t\tconst foundNode = node.node(relativeOrAbsolutePath);\n\t\tif (foundNode && active) {\n\t\t\t// see CameraControls for why this method of storing the node is preferable\n\t\t\tconst nodeId = foundNode.graphNodeId();\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.RENDER_SCENE_NODE_ID, nodeId);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.deleteAttribute(object, CameraAttribute.RENDER_SCENE_NODE_ID);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {CoreMask} from '../../../core/geometry/Mask';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\n\ninterface CameraRendererSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tnode: TypedNodePathParamValue;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraRendererSopParams;\n\tnode: BaseNodeType;\n\tactive: boolean;\n}\n\nexport class CameraRendererSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraRendererSopParams = {\n\t\tgroup: '',\n\t\tnode: new TypedNodePathParamValue(''),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.RENDERER> {\n\t\treturn CameraSopNodeType.RENDERER;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraRendererSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraRendererSopOperation.updateObject({objects, params, node: this._node, active: true});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params, node, active} = options;\n\t\tconst relativeOrAbsolutePath = params.node.path();\n\t\tconst foundNode = node.node(relativeOrAbsolutePath);\n\t\tif (foundNode && active) {\n\t\t\t// see CameraControls for why this method of storing the node is preferable\n\t\t\tconst nodeId = foundNode.graphNodeId();\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.RENDERER_NODE_ID, nodeId);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let object of objects) {\n\t\t\t\tThreejsCoreObject.deleteAttribute(object, CameraAttribute.RENDERER_NODE_ID);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraViewerCodeSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tviewerId: string;\n\t// shadowRoot: boolean;\n\thtml: string;\n}\ninterface UpdateObjectOptions {\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraViewerCodeSopParams;\n}\nexport class CameraViewerCodeSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraViewerCodeSopParams = {\n\t\tgroup: '',\n\t\tviewerId: 'my-viewer',\n\t\t// shadowRoot: true,\n\t\thtml: '',\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.VIEWER_CODE> {\n\t\treturn CameraSopNodeType.VIEWER_CODE;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraViewerCodeSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraViewerCodeSopOperation.updateObject({objects, params});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params} = options;\n\n\t\tfor (let object of objects) {\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.VIEWER_ID, params.viewerId);\n\t\t\t// CoreObject.addAttribute(object, CameraAttribute.VIEWER_SHADOW_ROOT, params.shadowRoot);\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.VIEWER_HTML, params.html);\n\t\t}\n\t}\n}\n","import {WebGLRenderer} from 'three';\nimport {CoreWebXRARController} from '../webXRAR/CoreWebXRARController';\nimport {applyDefaultStyle, createInfoLink, disableButtonElement, setErrorStyle} from './Common';\n\ninterface SessionInitOptions extends XRSessionInit {\n\tdomOverlay?: {root: HTMLElement};\n\t// draft spec: https://github.com/immersive-web/marker-tracking/blob/main/explainer.md\n\t// trackedImages: [\n\t// \t{\n\t// \t\timage: ImageBitmap;\n\t// \t\twidthInMeters: number;\n\t// \t}\n\t// ];\n}\n\ninterface CoreARButtonOptions {\n\trenderer: WebGLRenderer;\n\tcontroller: CoreWebXRARController;\n}\n\n// adapted from threejs ARButton\n//\n// modifications:\n// - add types\n// - update element.style.background, element.style.opacity\n// - remove element.style.position and element.style.bottom\n// - add element.style.margin\n// - controller requests the session to have more controls over what should be initialized just before\n//\n\nexport class CoreARButton {\n\tstatic createButton(options: CoreARButtonOptions, sessionInit: SessionInitOptions) {\n\t\tconst {renderer, controller} = options;\n\t\tconst button = document.createElement('button');\n\n\t\tfunction showStartAR(/*device*/) {\n\t\t\tif (sessionInit.domOverlay === undefined) {\n\t\t\t\tconst overlay = document.createElement('div');\n\t\t\t\toverlay.style.display = 'none';\n\t\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\t\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\t\t\t\tsvg.setAttribute('width', '38');\n\t\t\t\tsvg.setAttribute('height', '38');\n\t\t\t\tsvg.style.position = 'absolute';\n\t\t\t\tsvg.style.right = '20px';\n\t\t\t\tsvg.style.top = '20px';\n\t\t\t\tsvg.addEventListener('click', function () {\n\t\t\t\t\tcurrentSession?.end();\n\t\t\t\t});\n\t\t\t\toverlay.appendChild(svg);\n\n\t\t\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\t\t\tpath.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28');\n\t\t\t\tpath.setAttribute('stroke', '#fff');\n\t\t\t\tpath.setAttribute('stroke-width', '2');\n\t\t\t\tsvg.appendChild(path);\n\n\t\t\t\tif (sessionInit.optionalFeatures === undefined) {\n\t\t\t\t\tsessionInit.optionalFeatures = [];\n\t\t\t\t}\n\n\t\t\t\tsessionInit.optionalFeatures.push('dom-overlay');\n\t\t\t\tsessionInit.domOverlay = {root: overlay};\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet currentSession: XRSession | null = null;\n\n\t\t\tasync function onSessionStarted(session: XRSession) {\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\trenderer.xr.setReferenceSpaceType('local');\n\n\t\t\t\tawait renderer.xr.setSession(session);\n\n\t\t\t\tbutton.textContent = 'STOP AR';\n\t\t\t\tif (sessionInit.domOverlay) {\n\t\t\t\t\tsessionInit.domOverlay.root.style.display = '';\n\t\t\t\t}\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded(/*event*/) {\n\t\t\t\tif (!currentSession) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcurrentSession.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'START AR';\n\t\t\t\tif (sessionInit.domOverlay) {\n\t\t\t\t\tsessionInit.domOverlay.root.style.display = 'none';\n\t\t\t\t}\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\t\t\tbutton.style.backgroundColor = '#222';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\t\t\t\tif (currentSession === null) {\n\t\t\t\t\tcontroller.requestSession(sessionInit, onSessionStarted);\n\t\t\t\t} else {\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\t\t\tdisableButtonElement(button);\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\t\t\tsetErrorStyle(button);\n\t\t}\n\n\t\tfunction showARNotAllowed(exception: any) {\n\t\t\tdisableButton();\n\n\t\t\tconsole.warn('Exception when trying to call xr.isSessionSupported', exception);\n\n\t\t\tbutton.textContent = 'AR NOT ALLOWED';\n\t\t\tsetErrorStyle(button);\n\t\t}\n\n\t\tfunction stylizeElement(element: HTMLElement) {\n\t\t\tapplyDefaultStyle(element);\n\t\t\telement.style.background = 'rgb(20 61 24 / 95%)';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\t\t\tbutton.id = 'ARButton';\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr\n\t\t\t\t?.isSessionSupported('immersive-ar')\n\t\t\t\t.then(function (supported) {\n\t\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\t\t\t\t})\n\t\t\t\t.catch(showARNotAllowed);\n\n\t\t\treturn button;\n\t\t} else {\n\t\t\tconst message = createInfoLink();\n\t\t\tstylizeElement(message);\n\t\t\tsetErrorStyle(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n}\n","import {Vector3, Matrix4, Quaternion, WebGLRenderer, Camera, Color, Texture} from 'three';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {CoreARButton} from '../buttons/CoreARButton';\nimport {CoreWebXRARControllerOptions} from './CommonAR';\nimport {CoreWebXRAREstimatedLightController} from './CoreWebXRAREstimatedLightController';\nimport {BaseCoreWebXRController, OnWebXRSessionStartedCallback} from '../_BaseCoreWebXRController';\n// import {CoreWebXRARCaptureController} from './CoreWebXRARCapture';\n\nconst s = new Vector3();\n\nexport class CoreWebXRARController extends BaseCoreWebXRController {\n\tprivate hitTestSource: XRHitTestSource | null = null;\n\tprivate hitTestSourceRequested = false;\n\tprivate _hitDetected = false;\n\tprivate _hitMatrix = new Matrix4();\n\tprivate _hitPosition = new Vector3();\n\tprivate _hitQuaternion = new Quaternion();\n\t// public readonly capture: CoreWebXRARCaptureController;\n\tconstructor(\n\t\tscene: PolyScene,\n\t\trenderer: WebGLRenderer,\n\t\tcamera: Camera,\n\t\tcanvas: HTMLCanvasElement,\n\t\tprotected override options: CoreWebXRARControllerOptions\n\t) {\n\t\tsuper(scene, renderer, camera, canvas, options);\n\t\t// this.capture = new CoreWebXRARCaptureController(renderer);\n\t}\n\n\tcreateButton(): HTMLElement {\n\t\treturn CoreARButton.createButton(\n\t\t\t{\n\t\t\t\trenderer: this.renderer,\n\t\t\t\tcontroller: this,\n\t\t\t},\n\t\t\t{\n\t\t\t\toptionalFeatures: this.options.optionalFeatures,\n\t\t\t\trequiredFeatures: this.options.requiredFeatures,\n\t\t\t\t// trackedImages: [\n\t\t\t\t// \t{\n\t\t\t\t// \t\timage: ,\n\t\t\t\t// \t\twidthInMeters: 0.2,\n\t\t\t\t// \t},\n\t\t\t\t// ],\n\t\t\t}\n\t\t);\n\t}\n\tattachButton(parentElement: HTMLElement, buttonElement: HTMLElement) {\n\t\tparentElement.prepend(buttonElement);\n\t}\n\n\toverride async requestSession(sessionInit: XRSessionInit, onSessionStarted: OnWebXRSessionStartedCallback) {\n\t\tsuper.requestSession(sessionInit, onSessionStarted);\n\t\tthis._estimatedLightController = new CoreWebXRAREstimatedLightController();\n\t\tthis._estimatedLightController.initialize(this.scene, this.renderer);\n\n\t\treturn navigator.xr?.requestSession('immersive-ar', sessionInit).then(async (session) => {\n\t\t\t// await this.capture.init(session);\n\n\t\t\tonSessionStarted(session);\n\t\t});\n\t}\n\tprivate _estimatedLightController: CoreWebXRAREstimatedLightController | undefined;\n\tprivate _previousSceneBackground: Color | Texture | null = null;\n\tprotected override _onSessionStart() {\n\t\t// set active before super._onSessionStart\n\t\t// so that actor nodes can listen to the active xr manager\n\t\tthis.scene.webXR.setActiveARController(this);\n\t\tthis._previousSceneBackground = this.scene.threejsScene().background;\n\t\tthis.scene.threejsScene().background = null;\n\n\t\tsuper._onSessionStart();\n\t}\n\tprotected override _onSessionEnd() {\n\t\tthis.scene.webXR.setActiveARController(null);\n\t\tthis._estimatedLightController?.dispose();\n\t\tthis.scene.threejsScene().background = this._previousSceneBackground;\n\t\tsuper._onSessionEnd();\n\t}\n\n\thitMatrix(target: Matrix4) {\n\t\ttarget.copy(this._hitMatrix);\n\t}\n\thitPosition(target: Vector3) {\n\t\ttarget.copy(this._hitPosition);\n\t}\n\thitQuaternion(target: Quaternion) {\n\t\ttarget.copy(this._hitQuaternion);\n\t}\n\thitDetected() {\n\t\treturn this._hitDetected;\n\t}\n\n\toverride process(frame?: XRFrame) {\n\t\tsuper.process(frame);\n\t\tif (!frame) {\n\t\t\treturn;\n\t\t}\n\t\tconst referenceSpace = this.renderer.xr.getReferenceSpace();\n\t\tconst session = this.renderer.xr.getSession();\n\t\tif (!(session && referenceSpace)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._resolveHit(frame, session, referenceSpace);\n\t\t// this.capture.process(frame, referenceSpace);\n\t}\n\n\tprivate _resolveHit(frame: XRFrame, session: XRSession, referenceSpace: XRReferenceSpace) {\n\t\tif (!frame) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hitTestSourceRequested === false) {\n\t\t\tsession.requestReferenceSpace('viewer').then((referenceSpace) => {\n\t\t\t\tif (!session.requestHitTestSource) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsession.requestHitTestSource({space: referenceSpace})?.then((source) => {\n\t\t\t\t\tthis.hitTestSource = source;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tsession.addEventListener('end', () => {\n\t\t\t\tthis.hitTestSourceRequested = false;\n\t\t\t\tthis.hitTestSource = null;\n\t\t\t});\n\n\t\t\tthis.hitTestSourceRequested = true;\n\t\t}\n\n\t\tif (!this.hitTestSource) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst hitTestResults = frame.getHitTestResults(this.hitTestSource);\n\t\tif (hitTestResults.length) {\n\t\t\tconst hit = hitTestResults[0];\n\t\t\tconst pose = hit.getPose(referenceSpace);\n\t\t\tif (pose) {\n\t\t\t\tthis._hitDetected = true;\n\t\t\t\tthis._hitMatrix.fromArray(pose.transform.matrix);\n\t\t\t\tthis._hitMatrix.decompose(this._hitPosition, this._hitQuaternion, s);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis._hitDetected = false;\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {Camera, WebGLRenderer} from 'three';\nimport {PolyScene} from '../../scene/PolyScene';\nimport {CoreWebXRARController} from '../../../core/webXR/webXRAR/CoreWebXRARController';\nimport {CoreWebXRARControllerOptions, WebXRARFeature} from '../../../core/webXR/webXRAR/CommonAR';\nimport {\n\tWebXRFeatureStatus,\n\tWEBXR_FEATURE_STATUSES,\n\tWEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\tDEFAULT_WEBXR_REFERENCE_SPACE_TYPE,\n\tWEBXR_REFERENCE_SPACE_TYPES,\n} from '../../../core/webXR/Common';\nimport {TypeAssert} from '../../poly/Assert';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraWebXRARSopParams extends DefaultOperationParams {\n\tgroup: string;\n\thitTest: number;\n\tlightEstimation: number;\n\tcameraAccess: number;\n\toverrideReferenceSpaceType: boolean;\n\treferenceSpaceType: number;\n}\n\ninterface UpdateObjectOptions {\n\tscene: PolyScene;\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraWebXRARSopParams;\n\tactive: boolean;\n}\n\nexport class CameraWebXRARSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraWebXRARSopParams = {\n\t\tgroup: '*',\n\t\thitTest: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\tlightEstimation: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\tcameraAccess: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\toverrideReferenceSpaceType: false,\n\t\treferenceSpaceType: WEBXR_REFERENCE_SPACE_TYPES.indexOf(DEFAULT_WEBXR_REFERENCE_SPACE_TYPE),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.WEBXR_AR> {\n\t\treturn CameraSopNodeType.WEBXR_AR;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraWebXRARSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraWebXRARSopOperation.updateObject({scene: this._node.scene(), objects, params, active: true});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {scene, objects, params, active} = options;\n\t\tscene.webXR.setARControllerCreationFunction(function (\n\t\t\trenderer: WebGLRenderer,\n\t\t\tcamera: Camera,\n\t\t\tcanvas: HTMLCanvasElement,\n\t\t\toptions: CoreWebXRARControllerOptions\n\t\t) {\n\t\t\treturn new CoreWebXRARController(scene, renderer, camera, canvas, options);\n\t\t});\n\n\t\tconst optionalFeatures: WebXRARFeature[] = [];\n\t\tconst requiredFeatures: WebXRARFeature[] = [];\n\t\tfunction assignFeatureByStatus(feature: WebXRARFeature, featureStatusIndex: number) {\n\t\t\tconst featureStatus = WEBXR_FEATURE_STATUSES[featureStatusIndex] || WebXRFeatureStatus.NOT_USED;\n\t\t\tswitch (featureStatus) {\n\t\t\t\tcase WebXRFeatureStatus.NOT_USED: {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase WebXRFeatureStatus.OPTIONAL: {\n\t\t\t\t\toptionalFeatures.push(feature);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase WebXRFeatureStatus.REQUIRED: {\n\t\t\t\t\trequiredFeatures.push(feature);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tTypeAssert.unreachable(featureStatus);\n\t\t}\n\t\tassignFeatureByStatus(WebXRARFeature.HIT_TEST, params.hitTest);\n\t\tassignFeatureByStatus(WebXRARFeature.LIGHT_ESTIMATION, params.lightEstimation);\n\t\t// assignFeatureByStatus(WebXRARFeature.CAMERA_ACCESS, params.cameraAccess);\n\n\t\tconst optionalFeaturesStr = optionalFeatures.join(' ');\n\t\tconst requiredFeaturesStr = requiredFeatures.join(' ');\n\t\tfor (let object of objects) {\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR, active);\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_FEATURES_OPTIONAL, optionalFeaturesStr);\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_FEATURES_REQUIRED, requiredFeaturesStr);\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_AR_OVERRIDE_REFERENCE_SPACE_TYPE,\n\t\t\t\tisBooleanTrue(params.overrideReferenceSpaceType)\n\t\t\t);\n\t\t\tif (isBooleanTrue(params.overrideReferenceSpaceType)) {\n\t\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\t\tobject,\n\t\t\t\t\tCameraAttribute.WEBXR_AR_REFERENCE_SPACE_TYPE,\n\t\t\t\t\tWEBXR_REFERENCE_SPACE_TYPES[params.referenceSpaceType]\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {PolyScene} from '../../scene/PolyScene';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {\n\tMarkerTrackingTransformMode,\n\tMARKER_TRACKING_TRANSFORM_MODES,\n\tMarkerTrackingSourceMode,\n\tMARKER_TRACKING_SOURCE_MODES,\n} from '../../../core/webXR/markerTracking/Common';\nimport {Poly} from '../../Poly';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraWebXRARMarkerTrackingSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tsourceMode: number;\n\tsourceUrl: string;\n\ttransformMode: number;\n\tsmooth: boolean;\n\tsmoothCount: number;\n\tbarCodeType: string;\n\tbarCodeValue: number;\n}\n\ninterface UpdateObjectOptions {\n\tscene: PolyScene;\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraWebXRARMarkerTrackingSopParams;\n\tactive: boolean;\n}\n\nexport class CameraWebXRARMarkerTrackingSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraWebXRARMarkerTrackingSopParams = {\n\t\tgroup: '',\n\t\tsourceMode: MARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.WEBCAM),\n\t\tsourceUrl: '',\n\t\ttransformMode: MARKER_TRACKING_TRANSFORM_MODES.indexOf(MarkerTrackingTransformMode.CAMERA),\n\t\tsmooth: true,\n\t\tsmoothCount: 5,\n\t\tbarCodeType: Poly.thirdParty.markerTracking().barCodeTypes()[0] || '',\n\t\tbarCodeValue: 0,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.WEBXR_AR_MARKER_TRACKING> {\n\t\treturn CameraSopNodeType.WEBXR_AR_MARKER_TRACKING;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraWebXRARMarkerTrackingSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (Poly.thirdParty.markerTracking().hasController()) {\n\t\t\tif (this._node) {\n\t\t\t\tCameraWebXRARMarkerTrackingSopOperation.updateObject({\n\t\t\t\t\tscene: this._node.scene(),\n\t\t\t\t\tobjects,\n\t\t\t\t\tparams,\n\t\t\t\t\tactive: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis._node?.states.error.set(\n\t\t\t\t'This node requires the plugin-marker-tracking. See [https://github.com/polygonjs/plugin-marker-tracking](https://github.com/polygonjs/plugin-marker-tracking)'\n\t\t\t);\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {objects, params, active} = options;\n\n\t\tfor (let object of objects) {\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_MARKER_TRACKING, active);\n\n\t\t\t// source\n\t\t\tconst sourceMode = MARKER_TRACKING_SOURCE_MODES[params.sourceMode];\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SOURCE_MODE, sourceMode);\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_SOURCE_URL,\n\t\t\t\tparams.sourceUrl\n\t\t\t);\n\n\t\t\t// transform\n\t\t\tconst transformMode = MARKER_TRACKING_TRANSFORM_MODES[params.transformMode];\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_TRANSFORM_MODE,\n\t\t\t\ttransformMode\n\t\t\t);\n\n\t\t\t// smooth\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SMOOTH, params.smooth);\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_SMOOTH_COUNT,\n\t\t\t\tparams.smoothCount\n\t\t\t);\n\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_BAR_CODE_TYPE,\n\t\t\t\tparams.barCodeType\n\t\t\t);\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_AR_MARKER_TRACKING_BAR_CODE_VALUE,\n\t\t\t\tparams.barCodeValue\n\t\t\t);\n\t\t}\n\t}\n}\n","import {WebGLRenderer} from 'three';\nimport {CoreWebXRVRController} from '../webXRVR/CoreWebXRVRController';\nimport {applyDefaultStyle, createInfoLink, disableButtonElement, setErrorStyle} from './Common';\n\ninterface SessionInitOptions extends XRSessionInit {}\n\ninterface CoreVRButtonOptions {\n\trenderer: WebGLRenderer;\n\tcontroller: CoreWebXRVRController;\n}\n\n// adapted from threejs ARButton\n//\n// modifications:\n// - add types\n// - move registerSessionGrantedListener to inside .createButton\n// - on session start: scene.webXR.setActiveController(scene.webXR.VRController())\n// - update element.style.background, element.style.opacity\n// - remove element.style.position and element.style.bottom\n// - add element.style.margin\n// - allow sessionInit override\n//\n\nexport class CoreVRButton {\n\tstatic createButton(options: CoreVRButtonOptions, sessionInit: SessionInitOptions = {}) {\n\t\tconst {renderer, controller} = options;\n\n\t\tthis.registerSessionGrantedListener();\n\n\t\tconst button = document.createElement('button');\n\n\t\tfunction showEnterVR(/*device*/) {\n\t\t\tlet currentSession: XRSession | null = null;\n\n\t\t\tasync function onSessionStarted(session: XRSession) {\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\tawait renderer.xr.setSession(session);\n\t\t\t\tbutton.textContent = 'EXIT VR';\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded(/*event*/) {\n\t\t\t\tcurrentSession?.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'ENTER VR';\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'ENTER VR';\n\n\t\t\tbutton.onmouseenter = function () {\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\t\t\t\tif (currentSession === null) {\n\t\t\t\t\t// WebXR's requestReferenceSpace only works if the corresponding feature\n\t\t\t\t\t// was requested at session creation time. For simplicity, just ask for\n\t\t\t\t\t// the interesting ones as optional features, but be aware that the\n\t\t\t\t\t// requestReferenceSpace call will fail if it turns out to be unavailable.\n\t\t\t\t\t// ('local' is always available for immersive sessions and doesn't need to\n\t\t\t\t\t// be requested separately.)\n\n\t\t\t\t\t// const sessionInit = {optionalFeatures: ['local-floor', 'bounded-floor', 'hand-tracking', 'layers']};\n\t\t\t\t\t// navigator.xr?.requestSession('immersive-vr', sessionInit).then(onSessionStarted);\n\t\t\t\t\tcontroller.requestSession(sessionInit, onSessionStarted);\n\t\t\t\t} else {\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\t\t\tdisableButtonElement(button);\n\t\t}\n\n\t\tfunction showWebXRNotFound() {\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'VR NOT SUPPORTED';\n\t\t\tsetErrorStyle(button);\n\t\t}\n\n\t\tfunction showVRNotAllowed(exception: any) {\n\t\t\tdisableButton();\n\n\t\t\tconsole.warn('Exception when trying to call xr.isSessionSupported', exception);\n\n\t\t\tbutton.textContent = 'VR NOT ALLOWED';\n\t\t\tsetErrorStyle(button);\n\t\t}\n\n\t\tfunction stylizeElement(element: HTMLElement) {\n\t\t\tapplyDefaultStyle(element);\n\t\t\telement.style.background = 'rgb(16 27 44 / 95%)';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\t\t\tbutton.id = 'VRButton';\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr\n\t\t\t\t?.isSessionSupported('immersive-vr')\n\t\t\t\t.then(function (supported) {\n\t\t\t\t\tsupported ? showEnterVR() : showWebXRNotFound();\n\n\t\t\t\t\tif (supported && CoreVRButton.xrSessionIsGranted) {\n\t\t\t\t\t\tbutton.click();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(showVRNotAllowed);\n\n\t\t\treturn button;\n\t\t} else {\n\t\t\tconst message = createInfoLink();\n\n\t\t\tstylizeElement(message);\n\t\t\tsetErrorStyle(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n\n\tstatic xrSessionIsGranted = false;\n\n\tstatic registerSessionGrantedListener() {\n\t\tif ('xr' in navigator) {\n\t\t\t// WebXRViewer (based on Firefox) has a bug where addEventListener\n\t\t\t// throws a silent exception and aborts execution entirely.\n\t\t\tif (/WebXRViewer\\//i.test(navigator.userAgent)) return;\n\n\t\t\tnavigator.xr?.addEventListener('sessiongranted', () => {\n\t\t\t\tCoreVRButton.xrSessionIsGranted = true;\n\t\t\t});\n\t\t}\n\t}\n}\n","import {\n\tWebGLRenderer,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tAdditiveBlending,\n\tLineBasicMaterial,\n\tLine,\n\tRingGeometry,\n\tMeshBasicMaterial,\n\tMesh,\n\tObject3D,\n\tCamera,\n} from 'three';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {CoreVRButton} from '../buttons/CoreVRButton';\nimport {CoreWebXRVRControllerOptions} from './CommonVR';\nimport {CoreWebXRControllerContainer} from '../CoreWebXRControllerContainer';\nimport {BaseCoreWebXRController, OnWebXRSessionStartedCallback} from '../_BaseCoreWebXRController';\nimport {BaseXRSessionEventName} from '../Common';\n\n// from three\n// examples/webxr_vr_ballshooter.html\n\nfunction buildController(data: XRInputSource) {\n\tlet geometry, material;\n\n\tswitch (data.targetRayMode) {\n\t\tcase 'tracked-pointer':\n\t\t\tgeometry = new BufferGeometry();\n\t\t\tgeometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 0, -1], 3));\n\t\t\tgeometry.setAttribute('color', new Float32BufferAttribute([0.5, 0.5, 0.5, 0, 0, 0], 3));\n\n\t\t\tmaterial = new LineBasicMaterial({vertexColors: true, blending: AdditiveBlending});\n\n\t\t\treturn new Line(geometry, material);\n\n\t\tcase 'gaze':\n\t\t\tgeometry = new RingGeometry(0.02, 0.04, 32).translate(0, 0, -1);\n\t\t\tmaterial = new MeshBasicMaterial({opacity: 0.5, transparent: true});\n\t\t\treturn new Mesh(geometry, material);\n\t}\n}\n\nexport class CoreWebXRVRController extends BaseCoreWebXRController {\n\tprivate _baseReferenceSpace: XRReferenceSpace | null = null;\n\tconstructor(\n\t\tscene: PolyScene,\n\t\trenderer: WebGLRenderer,\n\t\tcamera: Camera,\n\t\tcanvas: HTMLCanvasElement,\n\t\tprotected override options: CoreWebXRVRControllerOptions\n\t) {\n\t\tsuper(scene, renderer, camera, canvas, options);\n\t}\n\toverride mount() {\n\t\tsuper.mount();\n\t\t// this.scene.webXR.setVRController(this);\n\n\t\tconst xr = this.renderer.xr;\n\t\txr.addEventListener('sessionstart', () => (this._baseReferenceSpace = xr.getReferenceSpace()));\n\t}\n\toverride async requestSession(sessionInit: XRSessionInit, onSessionStarted: OnWebXRSessionStartedCallback) {\n\t\tsuper.requestSession(sessionInit, onSessionStarted);\n\t\treturn navigator.xr?.requestSession('immersive-vr', sessionInit).then(onSessionStarted);\n\t}\n\tprotected override _onSessionStart() {\n\t\t// set active before super._onSessionStart\n\t\t// so that actor nodes can listen to the active xr manager\n\t\tthis.scene.webXR.setActiveVRController(this);\n\t\tsuper._onSessionStart();\n\t}\n\tprotected override _onSessionEnd() {\n\t\tthis.scene.webXR.setActiveVRController(null);\n\t\tsuper._onSessionEnd();\n\t}\n\tbaseReferenceSpace() {\n\t\treturn this._baseReferenceSpace;\n\t}\n\tsetReferenceSpace(referenceSpace: XRReferenceSpace) {\n\t\tthis.renderer.xr.setReferenceSpace(referenceSpace);\n\t}\n\n\tprotected override _addControllerEvents(\n\t\tcontrollerContainer: CoreWebXRControllerContainer,\n\t\tcontrollerIndex: number\n\t): void {\n\t\tlet controllerChild: Object3D | undefined;\n\t\t// add/remove crosshair to controller\n\t\tcontrollerContainer.controller.addEventListener(BaseXRSessionEventName.CONNECTED, function (event) {\n\t\t\tconst data: XRInputSource = event.data;\n\t\t\tconst _controllerChild = buildController(data);\n\t\t\tif (_controllerChild) {\n\t\t\t\tcontrollerChild = _controllerChild;\n\t\t\t\tcontrollerChild.name = `VR-eye-target-${controllerIndex}`;\n\t\t\t\tcontrollerContainer.controller.add(controllerChild);\n\t\t\t}\n\t\t});\n\t\tcontrollerContainer.controller.addEventListener(BaseXRSessionEventName.DISCONNECTED, function () {\n\t\t\tif (controllerChild) {\n\t\t\t\tcontrollerContainer.controller.remove(controllerChild);\n\t\t\t}\n\t\t});\n\t}\n\n\tcreateButton() {\n\t\treturn CoreVRButton.createButton(\n\t\t\t{\n\t\t\t\trenderer: this.renderer,\n\t\t\t\tcontroller: this,\n\t\t\t},\n\t\t\t{\n\t\t\t\toptionalFeatures: this.options.optionalFeatures,\n\t\t\t\trequiredFeatures: this.options.requiredFeatures,\n\t\t\t}\n\t\t);\n\t}\n\tattachButton(parentElement: HTMLElement, buttonElement: HTMLElement) {\n\t\tparentElement.append(buttonElement);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {CameraSopNodeType} from '../../poly/NodeContext';\nimport {Camera, WebGLRenderer} from 'three';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {CoreWebXRVRControllerOptions, WebXRVRFeature} from '../../../core/webXR/webXRVR/CommonVR';\nimport type {PolyScene} from '../../scene/PolyScene';\nimport {CoreWebXRVRController} from '../../../core/webXR/webXRVR/CoreWebXRVRController';\nimport {\n\tWebXRFeatureStatus,\n\tWEBXR_FEATURE_STATUSES,\n\tWEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\tDEFAULT_WEBXR_REFERENCE_SPACE_TYPE,\n\tWEBXR_REFERENCE_SPACE_TYPES,\n} from '../../../core/webXR/Common';\nimport {TypeAssert} from '../../poly/Assert';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\n\ninterface CameraWebXRVRSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tlocalFloor: number;\n\tboundedFloor: number;\n\thandTracking: number;\n\tlayers: number;\n\toverrideReferenceSpaceType: boolean;\n\treferenceSpaceType: number;\n}\n\ninterface UpdateObjectOptions {\n\tscene: PolyScene;\n\tobjects: ObjectContent<CoreObjectType>[];\n\tparams: CameraWebXRVRSopParams;\n\tactive: boolean;\n}\n\nexport class CameraWebXRVRSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CameraWebXRVRSopParams = {\n\t\tgroup: '',\n\t\tlocalFloor: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\tboundedFloor: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\thandTracking: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\tlayers: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX,\n\t\toverrideReferenceSpaceType: false,\n\t\treferenceSpaceType: WEBXR_REFERENCE_SPACE_TYPES.indexOf(DEFAULT_WEBXR_REFERENCE_SPACE_TYPE),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<CameraSopNodeType.WEBXR_VR> {\n\t\treturn CameraSopNodeType.WEBXR_VR;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: CameraWebXRVRSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst objects = CoreMask.filterObjects(coreGroup, {\n\t\t\tgroup: params.group,\n\t\t});\n\n\t\tif (this._node) {\n\t\t\tCameraWebXRVRSopOperation.updateObject({scene: this._node.scene(), objects, params, active: true});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic updateObject(options: UpdateObjectOptions) {\n\t\tconst {scene, objects, params, active} = options;\n\t\tscene.webXR.setVRControllerCreationFunction(function (\n\t\t\trenderer: WebGLRenderer,\n\t\t\tcamera: Camera,\n\t\t\tcanvas: HTMLCanvasElement,\n\t\t\toptions: CoreWebXRVRControllerOptions\n\t\t) {\n\t\t\treturn new CoreWebXRVRController(scene, renderer, camera, canvas, options);\n\t\t});\n\n\t\tconst optionalFeatures: WebXRVRFeature[] = [];\n\t\tconst requiredFeatures: WebXRVRFeature[] = [];\n\t\tfunction assignFeatureByStatus(feature: WebXRVRFeature, featureStatusIndex: number) {\n\t\t\tconst featureStatus = WEBXR_FEATURE_STATUSES[featureStatusIndex] || WebXRFeatureStatus.NOT_USED;\n\t\t\tswitch (featureStatus) {\n\t\t\t\tcase WebXRFeatureStatus.NOT_USED: {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase WebXRFeatureStatus.OPTIONAL: {\n\t\t\t\t\toptionalFeatures.push(feature);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase WebXRFeatureStatus.REQUIRED: {\n\t\t\t\t\trequiredFeatures.push(feature);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tTypeAssert.unreachable(featureStatus);\n\t\t}\n\t\tassignFeatureByStatus(WebXRVRFeature.LOCAL_FLOOR, params.localFloor);\n\t\tassignFeatureByStatus(WebXRVRFeature.BOUNDED_FLOOR, params.boundedFloor);\n\t\tassignFeatureByStatus(WebXRVRFeature.HAND_TRACKING, params.handTracking);\n\t\tassignFeatureByStatus(WebXRVRFeature.LAYERS, params.layers);\n\n\t\tconst optionalFeaturesStr = optionalFeatures.join(' ');\n\t\tconst requiredFeaturesStr = requiredFeatures.join(' ');\n\n\t\tfor (let object of objects) {\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_VR, active);\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_VR_FEATURES_OPTIONAL, optionalFeaturesStr);\n\t\t\tThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_VR_FEATURES_REQUIRED, requiredFeaturesStr);\n\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\tobject,\n\t\t\t\tCameraAttribute.WEBXR_VR_OVERRIDE_REFERENCE_SPACE_TYPE,\n\t\t\t\tisBooleanTrue(params.overrideReferenceSpaceType)\n\t\t\t);\n\t\t\tif (isBooleanTrue(params.overrideReferenceSpaceType)) {\n\t\t\t\tThreejsCoreObject.addAttribute(\n\t\t\t\t\tobject,\n\t\t\t\t\tCameraAttribute.WEBXR_VR_REFERENCE_SPACE_TYPE,\n\t\t\t\t\tWEBXR_REFERENCE_SPACE_TYPES[params.referenceSpaceType]\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Vector3} from 'three';\nimport {RoundedBoxGeometry} from 'three/examples/jsm/geometries/RoundedBoxGeometry';\n\nexport interface CapsuleOptions {\n\tradius: number;\n\theight: number;\n\tdivisions: number;\n\tcenter: Vector3;\n}\nexport function createCapsuleGeometry(capsuleOptions: CapsuleOptions) {\n\tconst {radius, height, divisions, center} = capsuleOptions;\n\tconst diameter = 2 * radius;\n\tconst bevel = radius;\n\tconst width = diameter;\n\tconst boxHeight = height;\n\tconst geometry = new RoundedBoxGeometry(width, boxHeight + diameter, width, divisions, bevel);\n\tgeometry.translate(center.x, center.y, center.z);\n\treturn geometry;\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {createCapsuleGeometry} from '../../../core/player/CapsuleGeometry';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {Vector3} from 'three';\n\ninterface CapsuleSopParams extends DefaultOperationParams {\n\tradius: number;\n\theight: number;\n\tdivisions: number;\n\tcenter: Vector3;\n}\n\nexport class CapsuleSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: CapsuleSopParams = {\n\t\tradius: 0.2,\n\t\theight: 0.6,\n\t\tdivisions: 2,\n\t\tcenter: new Vector3(0, 0, 0),\n\t};\n\tstatic override type(): Readonly<'capsule'> {\n\t\treturn 'capsule';\n\t}\n\toverride cook(input_contents: CoreGroup[], params: CapsuleSopParams) {\n\t\treturn this.createCoreGroupFromGeometry(createCapsuleGeometry(params));\n\t}\n}\n","import {LightUserDataRaymarching} from './../../../core/lights/Common';\nimport {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {\n\tDirectionalLightParams,\n\tDEFAULT_DIRECTIONAL_LIGHT_PARAMS,\n\tDirectionalLightContainer,\n\tDirectionalLightContainerParams,\n} from '../../../core/lights/DirectionalLight';\nimport {NodeContext} from '../../poly/NodeContext';\n// import {Mesh, PlaneGeometry, MeshBasicMaterial, Color, DoubleSide, DirectionalLight} from 'three';\nexport class DirectionalLightSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: DirectionalLightParams = DEFAULT_DIRECTIONAL_LIGHT_PARAMS;\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<'directionalLight'> {\n\t\treturn 'directionalLight';\n\t}\n\toverride cook(_: CoreGroup[], params: DirectionalLightParams) {\n\t\tconst container = this.createLight(params);\n\t\tif (!container) {\n\t\t\treturn this.createCoreGroupFromObjects([]);\n\t\t}\n\t\tcontainer.light().name = params.name;\n\t\tthis.updateLightParams(container, params);\n\t\tthis.updateShadowParams(container, params);\n\n\t\treturn this.createCoreGroupFromObjects([container]);\n\t}\n\n\tcreateLight(params: DirectionalLightContainerParams) {\n\t\tconst nodeName = this._node?.name();\n\t\tconst container = new DirectionalLightContainer({showHelper: params.showHelper}, nodeName || '');\n\t\tconst light = container.light();\n\n\t\tlight.matrixAutoUpdate = false;\n\n\t\tlight.castShadow = true;\n\t\tlight.shadow.bias = -0.001;\n\t\tlight.shadow.mapSize.x = 1024;\n\t\tlight.shadow.mapSize.y = 1024;\n\t\tlight.shadow.camera.near = 0.1;\n\n\t\treturn container;\n\t}\n\tupdateLightParams(container: DirectionalLightContainer, params: DirectionalLightParams) {\n\t\tconst light = container.light();\n\t\tlight.color = params.color;\n\t\tlight.intensity = params.intensity;\n\t\tlight.shadow.camera.far = params.distance;\n\n\t\tlight.userData[LightUserDataRaymarching.PENUMBRA] = params.raymarchingPenumbra;\n\t\tlight.userData[LightUserDataRaymarching.SHADOW_BIAS_ANGLE] = params.raymarchingShadowBiasAngle;\n\t\tlight.userData[LightUserDataRaymarching.SHADOW_BIAS_DISTANCE] = params.raymarchingShadowBiasDistance;\n\t}\n\tupdateShadowParams<NC extends NodeContext>(container: DirectionalLightContainer, params: DirectionalLightParams) {\n\t\tconst light = container.light();\n\t\tlight.shadow.autoUpdate = isBooleanTrue(params.shadowAutoUpdate);\n\t\tlight.shadow.needsUpdate = isBooleanTrue(params.shadowUpdateOnNextRender);\n\n\t\tlight.castShadow = isBooleanTrue(params.castShadow);\n\t\tlight.shadow.mapSize.copy(params.shadowRes);\n\t\t// const map = light.shadow.map;\n\t\t// if (map) {\n\t\t// \tmap.setSize(params.shadowRes.x, params.shadowRes.y);\n\t\t// \tif (isBooleanTrue(params.debugShadow)) {\n\t\t// \t\tlight.add(this._debugShadowMesh(light));\n\t\t// \t} else {\n\t\t// \t\tif (this.__debugShadowMesh) {\n\t\t// \t\t\tlight.remove(this.__debugShadowMesh);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tlight.shadow.bias = params.shadowBias;\n\t\tlight.shadow.radius = params.shadowRadius;\n\n\t\tconst shadowCamera = light.shadow.camera;\n\t\tconst shadowSize = params.shadowSize;\n\t\tshadowCamera.left = -shadowSize.x * 0.5;\n\t\tshadowCamera.right = shadowSize.x * 0.5;\n\t\tshadowCamera.top = shadowSize.y * 0.5;\n\t\tshadowCamera.bottom = -shadowSize.y * 0.5;\n\t\tshadowCamera.updateProjectionMatrix();\n\n\t\tcontainer.updateHelper();\n\t}\n\t// private __debugShadowMesh: Mesh<PlaneGeometry, MeshBasicMaterial> | undefined;\n\t// private _debugShadowMesh(light: DirectionalLight) {\n\t// \treturn (this.__debugShadowMesh = this.__debugShadowMesh || this._createDebugShadowMesh(light));\n\t// }\n\t// private _createDebugShadowMesh(light: DirectionalLight) {\n\t// \tconst material = new MeshBasicMaterial({\n\t// \t\tcolor: new Color(1, 1, 1),\n\t// \t\tmap: light.shadow.map.texture,\n\t// \t\tside: DoubleSide,\n\t// \t});\n\t// \tconst mesh = new Mesh(new PlaneGeometry(5, 5, 2, 2), material);\n\t// \tmesh.position.z = 1;\n\t// \tmesh.castShadow = false;\n\t// \tmesh.receiveShadow = false;\n\t// \treturn mesh;\n\t// }\n}\n","import {BufferGeometry, Mesh, MeshLambertMaterial, Object3D} from 'three';\nimport {Poly} from '../../../engine/Poly';\nimport {DRACOLoader} from 'three/examples/jsm/loaders/DRACOLoader';\nimport {LIBRARY_INSTALL_HINT} from '../common';\nimport {BaseLoaderLoadOptions, CoreBaseLoader} from '../_Base';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nconst _defaultMatMesh = new MeshLambertMaterial();\n\nexport class DRCLoaderHandler extends BaseObject3DLoaderHandler<BufferGeometry> {\n\tprotected async _getLoader(options: BaseLoaderLoadOptions): Promise<BaseGeoLoader<BufferGeometry>> {\n\t\treturn (this._loader = this._loader || (await this._createDRACOLoader(options)));\n\t}\n\tprivate async _createDRACOLoader(options: BaseLoaderLoadOptions) {\n\t\tconst useJS = false;\n\t\tconst node = options.node;\n\t\tconst dracoLoader = new DRACOLoader(this.loadingManager);\n\t\tconst root = Poly.libs.root();\n\t\tconst DRACOPath = Poly.libs.DRACOPath();\n\t\tif (root || DRACOPath) {\n\t\t\tconst decoderPath = `${root || ''}${DRACOPath || ''}/`;\n\n\t\t\tconst files = useJS ? ['draco_decoder.js'] : ['draco_decoder.wasm', 'draco_wasm_wrapper.js'];\n\t\t\tawait CoreBaseLoader._loadMultipleUrlsGlobal({\n\t\t\t\tfiles: files.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstoredUrl: `${decoderPath}${file}`,\n\t\t\t\t\t\tfullUrl: `${decoderPath}${file}`,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t\tnode,\n\t\t\t\terror: `failed to load draco libraries. Make sure to install them to load .glb files (${LIBRARY_INSTALL_HINT})`,\n\t\t\t});\n\n\t\t\tdracoLoader.setDecoderPath(decoderPath);\n\t\t} else {\n\t\t\t(dracoLoader as any).setDecoderPath(undefined);\n\t\t}\n\n\t\tdracoLoader.setDecoderConfig({type: useJS ? 'js' : 'wasm'});\n\t\treturn dracoLoader;\n\t}\n\tprotected override _onLoadSuccess(geometry: BufferGeometry): Object3D[] {\n\t\treturn [new Mesh(geometry, _defaultMatMesh)];\n\t}\n}\n","import {BufferGeometry} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {DRCLoaderHandler} from '../../../core/loader/geometry/DRC';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileDRCSopOperation extends BaseFileSopOperation<BufferGeometry> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/bunny.drc`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_DRC> {\n\t\treturn SopTypeFile.FILE_DRC;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new DRCLoaderHandler(params.url, this._node);\n\t}\n}\n","import {\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * NURBS utils\n *\n * See NURBSCurve and NURBSSurface.\n **/\n\n\n/**************************************************************\n *\tNURBS Utils\n **************************************************************/\n\n/*\nFinds knot vector span.\n\np : degree\nu : parametric value\nU : knot vector\n\nreturns the span\n*/\nfunction findSpan( p, u, U ) {\n\n\tconst n = U.length - p - 1;\n\n\tif ( u >= U[ n ] ) {\n\n\t\treturn n - 1;\n\n\t}\n\n\tif ( u <= U[ p ] ) {\n\n\t\treturn p;\n\n\t}\n\n\tlet low = p;\n\tlet high = n;\n\tlet mid = Math.floor( ( low + high ) / 2 );\n\n\twhile ( u < U[ mid ] || u >= U[ mid + 1 ] ) {\n\n\t\tif ( u < U[ mid ] ) {\n\n\t\t\thigh = mid;\n\n\t\t} else {\n\n\t\t\tlow = mid;\n\n\t\t}\n\n\t\tmid = Math.floor( ( low + high ) / 2 );\n\n\t}\n\n\treturn mid;\n\n}\n\n\n/*\nCalculate basis functions. See The NURBS Book, page 70, algorithm A2.2\n\nspan : span in which u lies\nu    : parametric point\np    : degree\nU    : knot vector\n\nreturns array[p+1] with basis functions values.\n*/\nfunction calcBasisFunctions( span, u, p, U ) {\n\n\tconst N = [];\n\tconst left = [];\n\tconst right = [];\n\tN[ 0 ] = 1.0;\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tconst temp = N[ r ] / ( rv + lv );\n\t\t\tN[ r ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tN[ j ] = saved;\n\n\t}\n\n\treturn N;\n\n}\n\n\n/*\nCalculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n\np : degree of B-Spline\nU : knot vector\nP : control points (x, y, z, w)\nu : parametric point\n\nreturns point for given u\n*/\nfunction calcBSplinePoint( p, U, P, u ) {\n\n\tconst span = findSpan( p, u, U );\n\tconst N = calcBasisFunctions( span, u, p, U );\n\tconst C = new Vector4( 0, 0, 0, 0 );\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tconst point = P[ span - p + j ];\n\t\tconst Nj = N[ j ];\n\t\tconst wNj = point.w * Nj;\n\t\tC.x += point.x * wNj;\n\t\tC.y += point.y * wNj;\n\t\tC.z += point.z * wNj;\n\t\tC.w += point.w * Nj;\n\n\t}\n\n\treturn C;\n\n}\n\n\n/*\nCalculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n\nspan : span in which u lies\nu    : parametric point\np    : degree\nn    : number of derivatives to calculate\nU    : knot vector\n\nreturns array[n+1][p+1] with basis functions derivatives\n*/\nfunction calcBasisFunctionDerivatives( span, u, p, n, U ) {\n\n\tconst zeroArr = [];\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tzeroArr[ i ] = 0.0;\n\n\tconst ders = [];\n\n\tfor ( let i = 0; i <= n; ++ i )\n\t\tders[ i ] = zeroArr.slice( 0 );\n\n\tconst ndu = [];\n\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tndu[ i ] = zeroArr.slice( 0 );\n\n\tndu[ 0 ][ 0 ] = 1.0;\n\n\tconst left = zeroArr.slice( 0 );\n\tconst right = zeroArr.slice( 0 );\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tndu[ j ][ r ] = rv + lv;\n\n\t\t\tconst temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];\n\t\t\tndu[ r ][ j ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tndu[ j ][ j ] = saved;\n\n\t}\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tders[ 0 ][ j ] = ndu[ j ][ p ];\n\n\t}\n\n\tfor ( let r = 0; r <= p; ++ r ) {\n\n\t\tlet s1 = 0;\n\t\tlet s2 = 1;\n\n\t\tconst a = [];\n\t\tfor ( let i = 0; i <= p; ++ i ) {\n\n\t\t\ta[ i ] = zeroArr.slice( 0 );\n\n\t\t}\n\n\t\ta[ 0 ][ 0 ] = 1.0;\n\n\t\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\t\tlet d = 0.0;\n\t\t\tconst rk = r - k;\n\t\t\tconst pk = p - k;\n\n\t\t\tif ( r >= k ) {\n\n\t\t\t\ta[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];\n\t\t\t\td = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];\n\n\t\t\t}\n\n\t\t\tconst j1 = ( rk >= - 1 ) ? 1 : - rk;\n\t\t\tconst j2 = ( r - 1 <= pk ) ? k - 1 : p - r;\n\n\t\t\tfor ( let j = j1; j <= j2; ++ j ) {\n\n\t\t\t\ta[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];\n\t\t\t\td += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];\n\n\t\t\t}\n\n\t\t\tif ( r <= pk ) {\n\n\t\t\t\ta[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];\n\t\t\t\td += a[ s2 ][ k ] * ndu[ r ][ pk ];\n\n\t\t\t}\n\n\t\t\tders[ k ][ r ] = d;\n\n\t\t\tconst j = s1;\n\t\t\ts1 = s2;\n\t\t\ts2 = j;\n\n\t\t}\n\n\t}\n\n\tlet r = p;\n\n\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\t\tders[ k ][ j ] *= r;\n\n\t\t}\n\n\t\tr *= p - k;\n\n\t}\n\n\treturn ders;\n\n}\n\n\n/*\n\tCalculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n\n\tp  : degree\n\tU  : knot vector\n\tP  : control points\n\tu  : Parametric points\n\tnd : number of derivatives\n\n\treturns array[d+1] with derivatives\n\t*/\nfunction calcBSplineDerivatives( p, U, P, u, nd ) {\n\n\tconst du = nd < p ? nd : p;\n\tconst CK = [];\n\tconst span = findSpan( p, u, U );\n\tconst nders = calcBasisFunctionDerivatives( span, u, p, du, U );\n\tconst Pw = [];\n\n\tfor ( let i = 0; i < P.length; ++ i ) {\n\n\t\tconst point = P[ i ].clone();\n\t\tconst w = point.w;\n\n\t\tpoint.x *= w;\n\t\tpoint.y *= w;\n\t\tpoint.z *= w;\n\n\t\tPw[ i ] = point;\n\n\t}\n\n\tfor ( let k = 0; k <= du; ++ k ) {\n\n\t\tconst point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );\n\n\t\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\t\tpoint.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = point;\n\n\t}\n\n\tfor ( let k = du + 1; k <= nd + 1; ++ k ) {\n\n\t\tCK[ k ] = new Vector4( 0, 0, 0 );\n\n\t}\n\n\treturn CK;\n\n}\n\n\n/*\nCalculate \"K over I\"\n\nreturns k!/(i!(k-i)!)\n*/\nfunction calcKoverI( k, i ) {\n\n\tlet nom = 1;\n\n\tfor ( let j = 2; j <= k; ++ j ) {\n\n\t\tnom *= j;\n\n\t}\n\n\tlet denom = 1;\n\n\tfor ( let j = 2; j <= i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\tfor ( let j = 2; j <= k - i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\treturn nom / denom;\n\n}\n\n\n/*\nCalculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n\nPders : result of function calcBSplineDerivatives\n\nreturns array with derivatives for rational curve.\n*/\nfunction calcRationalCurveDerivatives( Pders ) {\n\n\tconst nd = Pders.length;\n\tconst Aders = [];\n\tconst wders = [];\n\n\tfor ( let i = 0; i < nd; ++ i ) {\n\n\t\tconst point = Pders[ i ];\n\t\tAders[ i ] = new Vector3( point.x, point.y, point.z );\n\t\twders[ i ] = point.w;\n\n\t}\n\n\tconst CK = [];\n\n\tfor ( let k = 0; k < nd; ++ k ) {\n\n\t\tconst v = Aders[ k ].clone();\n\n\t\tfor ( let i = 1; i <= k; ++ i ) {\n\n\t\t\tv.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = v.divideScalar( wders[ 0 ] );\n\n\t}\n\n\treturn CK;\n\n}\n\n\n/*\nCalculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n\np  : degree\nU  : knot vector\nP  : control points in homogeneous space\nu  : parametric points\nnd : number of derivatives\n\nreturns array with derivatives.\n*/\nfunction calcNURBSDerivatives( p, U, P, u, nd ) {\n\n\tconst Pders = calcBSplineDerivatives( p, U, P, u, nd );\n\treturn calcRationalCurveDerivatives( Pders );\n\n}\n\n\n/*\nCalculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n\np, q : degrees of B-Spline surface\nU, V : knot vectors\nP    : control points (x, y, z, w)\nu, v : parametric values\n\nreturns point for given (u, v)\n*/\nfunction calcSurfacePoint( p, q, U, V, P, u, v, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst temp = [];\n\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\ttemp[ l ] = new Vector4( 0, 0, 0, 0 );\n\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ].clone();\n\t\t\tconst w = point.w;\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\t\t\ttemp[ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\tSw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n/*\nCalculate rational B-Spline volume point. See The NURBS Book, page 134, algorithm A4.3.\n\np, q, r   : degrees of B-Splinevolume\nU, V, W   : knot vectors\nP         : control points (x, y, z, w)\nu, v, w   : parametric values\n\nreturns point for given (u, v, w)\n*/\nfunction calcVolumePoint( p, q, r, U, V, W, P, u, v, w, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst wspan = findSpan( r, w, W );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst Nw = calcBasisFunctions( wspan, w, r, W );\n\tconst temp = [];\n\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\ttemp[ m ] = [];\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\ttemp[ m ][ l ] = new Vector4( 0, 0, 0, 0 );\n\t\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ][ wspan - r + m ].clone();\n\t\t\t\tconst w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[ m ][ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let m = 0; m <= r; ++ m ) {\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\tSw.add( temp[ m ][ l ].multiplyScalar( Nw[ m ] ).multiplyScalar( Nv[ l ] ) );\n\n\t\t}\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n\nexport {\n\tfindSpan,\n\tcalcBasisFunctions,\n\tcalcBSplinePoint,\n\tcalcBasisFunctionDerivatives,\n\tcalcBSplineDerivatives,\n\tcalcKoverI,\n\tcalcRationalCurveDerivatives,\n\tcalcNURBSDerivatives,\n\tcalcSurfacePoint,\n\tcalcVolumePoint,\n};\n","import {\n\tCurve,\n\tVector3,\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * NURBS curve object\n *\n * Derives from Curve, overriding getPoint and getTangent.\n *\n * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.\n *\n **/\n\nclass NURBSCurve extends Curve {\n\n\tconstructor(\n\t\tdegree,\n\t\tknots /* array of reals */,\n\t\tcontrolPoints /* array of Vector(2|3|4) */,\n\t\tstartKnot /* index in knots */,\n\t\tendKnot /* index in knots */\n\t) {\n\n\t\tsuper();\n\n\t\tthis.degree = degree;\n\t\tthis.knots = knots;\n\t\tthis.controlPoints = [];\n\t\t// Used by periodic NURBS to remove hidden spans\n\t\tthis.startKnot = startKnot || 0;\n\t\tthis.endKnot = endKnot || ( this.knots.length - 1 );\n\n\t\tfor ( let i = 0; i < controlPoints.length; ++ i ) {\n\n\t\t\t// ensure Vector4 for control points\n\t\t\tconst point = controlPoints[ i ];\n\t\t\tthis.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t}\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u\n\n\t\t// following results in (wx, wy, wz, w) homogeneous point\n\t\tconst hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );\n\n\t\tif ( hpoint.w !== 1.0 ) {\n\n\t\t\t// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\t\thpoint.divideScalar( hpoint.w );\n\n\t\t}\n\n\t\treturn point.set( hpoint.x, hpoint.y, hpoint.z );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\tconst tangent = optionalTarget;\n\n\t\tconst u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );\n\t\tconst ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );\n\t\ttangent.copy( ders[ 1 ] ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n}\n\nexport { NURBSCurve };\n","import {\n\tAmbientLight,\n\tAnimationClip,\n\tBone,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tEquirectangularReflectionMapping,\n\tEuler,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLoader,\n\tLoaderUtils,\n\tMathUtils,\n\tMatrix3,\n\tMatrix4,\n\tMesh,\n\tMeshLambertMaterial,\n\tMeshPhongMaterial,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tUint16BufferAttribute,\n\tVector2,\n\tVector3,\n\tVector4,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tShapeUtils\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\nimport { NURBSCurve } from '../curves/NURBSCurve.js';\n\n/**\n * Loader loads FBX file and generates Group representing FBX scene.\n * Requires FBX file to be >= 7.0 and in ASCII or >= 6400 in Binary format\n * Versions lower than this may load but will probably have errors\n *\n * Needs Support:\n *  Morph normals / blend shape normals\n *\n * FBX format references:\n * \thttps://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html (C++ SDK reference)\n *\n * Binary format specification:\n *\thttps://code.blender.org/2013/08/fbx-binary-file-format-specification/\n */\n\n\nlet fbxTree;\nlet connections;\nlet sceneGraph;\n\nclass FBXLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( FBXBuffer, path ) {\n\n\t\tif ( isFbxFormatBinary( FBXBuffer ) ) {\n\n\t\t\tfbxTree = new BinaryParser().parse( FBXBuffer );\n\n\t\t} else {\n\n\t\t\tconst FBXText = convertArrayBufferToString( FBXBuffer );\n\n\t\t\tif ( ! isFbxFormatASCII( FBXText ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown format.' );\n\n\t\t\t}\n\n\t\t\tif ( getFbxVersion( FBXText ) < 7000 ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion( FBXText ) );\n\n\t\t\t}\n\n\t\t\tfbxTree = new TextParser().parse( FBXText );\n\n\t\t}\n\n\t\t// console.log( fbxTree );\n\n\t\tconst textureLoader = new TextureLoader( this.manager ).setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\treturn new FBXTreeParser( textureLoader, this.manager ).parse( fbxTree );\n\n\t}\n\n}\n\n// Parse the FBXTree object returned by the BinaryParser or TextParser and return a Group\nclass FBXTreeParser {\n\n\tconstructor( textureLoader, manager ) {\n\n\t\tthis.textureLoader = textureLoader;\n\t\tthis.manager = manager;\n\n\t}\n\n\tparse() {\n\n\t\tconnections = this.parseConnections();\n\n\t\tconst images = this.parseImages();\n\t\tconst textures = this.parseTextures( images );\n\t\tconst materials = this.parseMaterials( textures );\n\t\tconst deformers = this.parseDeformers();\n\t\tconst geometryMap = new GeometryParser().parse( deformers );\n\n\t\tthis.parseScene( deformers, geometryMap, materials );\n\n\t\treturn sceneGraph;\n\n\t}\n\n\t// Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry )\n\t// and details the connection type\n\tparseConnections() {\n\n\t\tconst connectionMap = new Map();\n\n\t\tif ( 'Connections' in fbxTree ) {\n\n\t\t\tconst rawConnections = fbxTree.Connections.connections;\n\n\t\t\trawConnections.forEach( function ( rawConnection ) {\n\n\t\t\t\tconst fromID = rawConnection[ 0 ];\n\t\t\t\tconst toID = rawConnection[ 1 ];\n\t\t\t\tconst relationship = rawConnection[ 2 ];\n\n\t\t\t\tif ( ! connectionMap.has( fromID ) ) {\n\n\t\t\t\t\tconnectionMap.set( fromID, {\n\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tconst parentRelationship = { ID: toID, relationship: relationship };\n\t\t\t\tconnectionMap.get( fromID ).parents.push( parentRelationship );\n\n\t\t\t\tif ( ! connectionMap.has( toID ) ) {\n\n\t\t\t\t\tconnectionMap.set( toID, {\n\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tconst childRelationship = { ID: fromID, relationship: relationship };\n\t\t\t\tconnectionMap.get( toID ).children.push( childRelationship );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn connectionMap;\n\n\t}\n\n\t// Parse FBXTree.Objects.Video for embedded image data\n\t// These images are connected to textures in FBXTree.Objects.Textures\n\t// via FBXTree.Connections.\n\tparseImages() {\n\n\t\tconst images = {};\n\t\tconst blobs = {};\n\n\t\tif ( 'Video' in fbxTree.Objects ) {\n\n\t\t\tconst videoNodes = fbxTree.Objects.Video;\n\n\t\t\tfor ( const nodeID in videoNodes ) {\n\n\t\t\t\tconst videoNode = videoNodes[ nodeID ];\n\n\t\t\t\tconst id = parseInt( nodeID );\n\n\t\t\t\timages[ id ] = videoNode.RelativeFilename || videoNode.Filename;\n\n\t\t\t\t// raw image data is in videoNode.Content\n\t\t\t\tif ( 'Content' in videoNode ) {\n\n\t\t\t\t\tconst arrayBufferContent = ( videoNode.Content instanceof ArrayBuffer ) && ( videoNode.Content.byteLength > 0 );\n\t\t\t\t\tconst base64Content = ( typeof videoNode.Content === 'string' ) && ( videoNode.Content !== '' );\n\n\t\t\t\t\tif ( arrayBufferContent || base64Content ) {\n\n\t\t\t\t\t\tconst image = this.parseImage( videoNodes[ nodeID ] );\n\n\t\t\t\t\t\tblobs[ videoNode.RelativeFilename || videoNode.Filename ] = image;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const id in images ) {\n\n\t\t\tconst filename = images[ id ];\n\n\t\t\tif ( blobs[ filename ] !== undefined ) images[ id ] = blobs[ filename ];\n\t\t\telse images[ id ] = images[ id ].split( '\\\\' ).pop();\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\t// Parse embedded image data in FBXTree.Video.Content\n\tparseImage( videoNode ) {\n\n\t\tconst content = videoNode.Content;\n\t\tconst fileName = videoNode.RelativeFilename || videoNode.Filename;\n\t\tconst extension = fileName.slice( fileName.lastIndexOf( '.' ) + 1 ).toLowerCase();\n\n\t\tlet type;\n\n\t\tswitch ( extension ) {\n\n\t\t\tcase 'bmp':\n\n\t\t\t\ttype = 'image/bmp';\n\t\t\t\tbreak;\n\n\t\t\tcase 'jpg':\n\t\t\tcase 'jpeg':\n\n\t\t\t\ttype = 'image/jpeg';\n\t\t\t\tbreak;\n\n\t\t\tcase 'png':\n\n\t\t\t\ttype = 'image/png';\n\t\t\t\tbreak;\n\n\t\t\tcase 'tif':\n\n\t\t\t\ttype = 'image/tiff';\n\t\t\t\tbreak;\n\n\t\t\tcase 'tga':\n\n\t\t\t\tif ( this.manager.getHandler( '.tga' ) === null ) {\n\n\t\t\t\t\tconsole.warn( 'FBXLoader: TGA loader not found, skipping ', fileName );\n\n\t\t\t\t}\n\n\t\t\t\ttype = 'image/tga';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'FBXLoader: Image type \"' + extension + '\" is not supported.' );\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( typeof content === 'string' ) { // ASCII format\n\n\t\t\treturn 'data:' + type + ';base64,' + content;\n\n\t\t} else { // Binary Format\n\n\t\t\tconst array = new Uint8Array( content );\n\t\t\treturn window.URL.createObjectURL( new Blob( [ array ], { type: type } ) );\n\n\t\t}\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Texture\n\t// These contain details such as UV scaling, cropping, rotation etc and are connected\n\t// to images in FBXTree.Objects.Video\n\tparseTextures( images ) {\n\n\t\tconst textureMap = new Map();\n\n\t\tif ( 'Texture' in fbxTree.Objects ) {\n\n\t\t\tconst textureNodes = fbxTree.Objects.Texture;\n\t\t\tfor ( const nodeID in textureNodes ) {\n\n\t\t\t\tconst texture = this.parseTexture( textureNodes[ nodeID ], images );\n\t\t\t\ttextureMap.set( parseInt( nodeID ), texture );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textureMap;\n\n\t}\n\n\t// Parse individual node in FBXTree.Objects.Texture\n\tparseTexture( textureNode, images ) {\n\n\t\tconst texture = this.loadTexture( textureNode, images );\n\n\t\ttexture.ID = textureNode.id;\n\n\t\ttexture.name = textureNode.attrName;\n\n\t\tconst wrapModeU = textureNode.WrapModeU;\n\t\tconst wrapModeV = textureNode.WrapModeV;\n\n\t\tconst valueU = wrapModeU !== undefined ? wrapModeU.value : 0;\n\t\tconst valueV = wrapModeV !== undefined ? wrapModeV.value : 0;\n\n\t\t// http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a\n\t\t// 0: repeat(default), 1: clamp\n\n\t\ttexture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\t\ttexture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\tif ( 'Scaling' in textureNode ) {\n\n\t\t\tconst values = textureNode.Scaling.value;\n\n\t\t\ttexture.repeat.x = values[ 0 ];\n\t\t\ttexture.repeat.y = values[ 1 ];\n\n\t\t}\n\n\t\tif ( 'Translation' in textureNode ) {\n\n\t\t\tconst values = textureNode.Translation.value;\n\n\t\t\ttexture.offset.x = values[ 0 ];\n\t\t\ttexture.offset.y = values[ 1 ];\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t// load a texture specified as a blob or data URI, or via an external URL using TextureLoader\n\tloadTexture( textureNode, images ) {\n\n\t\tconst nonNativeExtensions = new Set( [ 'tga', 'tif', 'tiff', 'exr', 'dds', 'hdr', 'ktx2' ] );\n\n\t\tconst extension = textureNode.FileName.split( '.' ).pop().toLowerCase();\n\n\t\tconst loader = nonNativeExtensions.has( extension ) ? this.manager.getHandler( `.${extension}` ) : this.textureLoader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tconsole.warn(\n\t\t\t\t`FBXLoader: ${extension.toUpperCase()} loader not found, creating placeholder texture for`,\n\t\t\t\ttextureNode.RelativeFilename\n\t\t\t);\n\t\t\treturn new Texture();\n\n\t\t}\n\n\t\tconst loaderPath = loader.path;\n\n\t\tif ( ! loaderPath ) {\n\n\t\t\tloader.setPath( this.textureLoader.path );\n\n\t\t}\n\n\t\tconst children = connections.get( textureNode.id ).children;\n\n\t\tlet fileName;\n\n\t\tif ( children !== undefined && children.length > 0 && images[ children[ 0 ].ID ] !== undefined ) {\n\n\t\t\tfileName = images[ children[ 0 ].ID ];\n\n\t\t\tif ( fileName.indexOf( 'blob:' ) === 0 || fileName.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\tloader.setPath( undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst texture = loader.load( fileName );\n\n\t\t// revert to initial path\n\t\tloader.setPath( loaderPath );\n\n\t\treturn texture;\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Material\n\tparseMaterials( textureMap ) {\n\n\t\tconst materialMap = new Map();\n\n\t\tif ( 'Material' in fbxTree.Objects ) {\n\n\t\t\tconst materialNodes = fbxTree.Objects.Material;\n\n\t\t\tfor ( const nodeID in materialNodes ) {\n\n\t\t\t\tconst material = this.parseMaterial( materialNodes[ nodeID ], textureMap );\n\n\t\t\t\tif ( material !== null ) materialMap.set( parseInt( nodeID ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materialMap;\n\n\t}\n\n\t// Parse single node in FBXTree.Objects.Material\n\t// Materials are connected to texture maps in FBXTree.Objects.Textures\n\t// FBX format currently only supports Lambert and Phong shading models\n\tparseMaterial( materialNode, textureMap ) {\n\n\t\tconst ID = materialNode.id;\n\t\tconst name = materialNode.attrName;\n\t\tlet type = materialNode.ShadingModel;\n\n\t\t// Case where FBX wraps shading model in property object.\n\t\tif ( typeof type === 'object' ) {\n\n\t\t\ttype = type.value;\n\n\t\t}\n\n\t\t// Ignore unused materials which don't have any connections.\n\t\tif ( ! connections.has( ID ) ) return null;\n\n\t\tconst parameters = this.parseParameters( materialNode, textureMap, ID );\n\n\t\tlet material;\n\n\t\tswitch ( type.toLowerCase() ) {\n\n\t\t\tcase 'phong':\n\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\tbreak;\n\t\t\tcase 'lambert':\n\t\t\t\tmaterial = new MeshLambertMaterial();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: unknown material type \"%s\". Defaulting to MeshPhongMaterial.', type );\n\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tmaterial.setValues( parameters );\n\t\tmaterial.name = name;\n\n\t\treturn material;\n\n\t}\n\n\t// Parse FBX material and return parameters suitable for a three.js material\n\t// Also parse the texture map and return any textures associated with the material\n\tparseParameters( materialNode, textureMap, ID ) {\n\n\t\tconst parameters = {};\n\n\t\tif ( materialNode.BumpFactor ) {\n\n\t\t\tparameters.bumpScale = materialNode.BumpFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Diffuse ) {\n\n\t\t\tparameters.color = new Color().fromArray( materialNode.Diffuse.value ).convertSRGBToLinear();\n\n\t\t} else if ( materialNode.DiffuseColor && ( materialNode.DiffuseColor.type === 'Color' || materialNode.DiffuseColor.type === 'ColorRGB' ) ) {\n\n\t\t\t// The blender exporter exports diffuse here instead of in materialNode.Diffuse\n\t\t\tparameters.color = new Color().fromArray( materialNode.DiffuseColor.value ).convertSRGBToLinear();\n\n\t\t}\n\n\t\tif ( materialNode.DisplacementFactor ) {\n\n\t\t\tparameters.displacementScale = materialNode.DisplacementFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Emissive ) {\n\n\t\t\tparameters.emissive = new Color().fromArray( materialNode.Emissive.value ).convertSRGBToLinear();\n\n\t\t} else if ( materialNode.EmissiveColor && ( materialNode.EmissiveColor.type === 'Color' || materialNode.EmissiveColor.type === 'ColorRGB' ) ) {\n\n\t\t\t// The blender exporter exports emissive color here instead of in materialNode.Emissive\n\t\t\tparameters.emissive = new Color().fromArray( materialNode.EmissiveColor.value ).convertSRGBToLinear();\n\n\t\t}\n\n\t\tif ( materialNode.EmissiveFactor ) {\n\n\t\t\tparameters.emissiveIntensity = parseFloat( materialNode.EmissiveFactor.value );\n\n\t\t}\n\n\t\tif ( materialNode.Opacity ) {\n\n\t\t\tparameters.opacity = parseFloat( materialNode.Opacity.value );\n\n\t\t}\n\n\t\tif ( parameters.opacity < 1.0 ) {\n\n\t\t\tparameters.transparent = true;\n\n\t\t}\n\n\t\tif ( materialNode.ReflectionFactor ) {\n\n\t\t\tparameters.reflectivity = materialNode.ReflectionFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Shininess ) {\n\n\t\t\tparameters.shininess = materialNode.Shininess.value;\n\n\t\t}\n\n\t\tif ( materialNode.Specular ) {\n\n\t\t\tparameters.specular = new Color().fromArray( materialNode.Specular.value ).convertSRGBToLinear();\n\n\t\t} else if ( materialNode.SpecularColor && materialNode.SpecularColor.type === 'Color' ) {\n\n\t\t\t// The blender exporter exports specular color here instead of in materialNode.Specular\n\t\t\tparameters.specular = new Color().fromArray( materialNode.SpecularColor.value ).convertSRGBToLinear();\n\n\t\t}\n\n\t\tconst scope = this;\n\t\tconnections.get( ID ).children.forEach( function ( child ) {\n\n\t\t\tconst type = child.relationship;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'Bump':\n\t\t\t\t\tparameters.bumpMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Maya|TEX_ao_map':\n\t\t\t\t\tparameters.aoMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DiffuseColor':\n\t\t\t\tcase 'Maya|TEX_color_map':\n\t\t\t\t\tparameters.map = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.map !== undefined ) {\n\n\t\t\t\t\t\tparameters.map.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DisplacementColor':\n\t\t\t\t\tparameters.displacementMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EmissiveColor':\n\t\t\t\t\tparameters.emissiveMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.emissiveMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.emissiveMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'NormalMap':\n\t\t\t\tcase 'Maya|TEX_normal_map':\n\t\t\t\t\tparameters.normalMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ReflectionColor':\n\t\t\t\t\tparameters.envMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.envMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.envMap.mapping = EquirectangularReflectionMapping;\n\t\t\t\t\t\tparameters.envMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpecularColor':\n\t\t\t\t\tparameters.specularMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.specularMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.specularMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'TransparentColor':\n\t\t\t\tcase 'TransparencyFactor':\n\t\t\t\t\tparameters.alphaMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tparameters.transparent = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'AmbientColor':\n\t\t\t\tcase 'ShininessExponent': // AKA glossiness map\n\t\t\t\tcase 'SpecularFactor': // AKA specularLevel\n\t\t\t\tcase 'VectorDisplacementColor': // NOTE: Seems to be a copy of DisplacementColor\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: %s map is not supported in three.js, skipping texture.', type );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn parameters;\n\n\t}\n\n\t// get a texture from the textureMap for use by a material.\n\tgetTexture( textureMap, id ) {\n\n\t\t// if the texture is a layered texture, just use the first layer and issue a warning\n\t\tif ( 'LayeredTexture' in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.' );\n\t\t\tid = connections.get( id ).children[ 0 ].ID;\n\n\t\t}\n\n\t\treturn textureMap.get( id );\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Deformer\n\t// Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here\n\t// Generates map of Skeleton-like objects for use later when generating and binding skeletons.\n\tparseDeformers() {\n\n\t\tconst skeletons = {};\n\t\tconst morphTargets = {};\n\n\t\tif ( 'Deformer' in fbxTree.Objects ) {\n\n\t\t\tconst DeformerNodes = fbxTree.Objects.Deformer;\n\n\t\t\tfor ( const nodeID in DeformerNodes ) {\n\n\t\t\t\tconst deformerNode = DeformerNodes[ nodeID ];\n\n\t\t\t\tconst relationships = connections.get( parseInt( nodeID ) );\n\n\t\t\t\tif ( deformerNode.attrType === 'Skin' ) {\n\n\t\t\t\t\tconst skeleton = this.parseSkeleton( relationships, DeformerNodes );\n\t\t\t\t\tskeleton.ID = nodeID;\n\n\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: skeleton attached to more than one geometry is not supported.' );\n\t\t\t\t\tskeleton.geometryID = relationships.parents[ 0 ].ID;\n\n\t\t\t\t\tskeletons[ nodeID ] = skeleton;\n\n\t\t\t\t} else if ( deformerNode.attrType === 'BlendShape' ) {\n\n\t\t\t\t\tconst morphTarget = {\n\t\t\t\t\t\tid: nodeID,\n\t\t\t\t\t};\n\n\t\t\t\t\tmorphTarget.rawTargets = this.parseMorphTargets( relationships, DeformerNodes );\n\t\t\t\t\tmorphTarget.id = nodeID;\n\n\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: morph target attached to more than one geometry is not supported.' );\n\n\t\t\t\t\tmorphTargets[ nodeID ] = morphTarget;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tskeletons: skeletons,\n\t\t\tmorphTargets: morphTargets,\n\n\t\t};\n\n\t}\n\n\t// Parse single nodes in FBXTree.Objects.Deformer\n\t// The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster'\n\t// Each skin node represents a skeleton and each cluster node represents a bone\n\tparseSkeleton( relationships, deformerNodes ) {\n\n\t\tconst rawBones = [];\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst boneNode = deformerNodes[ child.ID ];\n\n\t\t\tif ( boneNode.attrType !== 'Cluster' ) return;\n\n\t\t\tconst rawBone = {\n\n\t\t\t\tID: child.ID,\n\t\t\t\tindices: [],\n\t\t\t\tweights: [],\n\t\t\t\ttransformLink: new Matrix4().fromArray( boneNode.TransformLink.a ),\n\t\t\t\t// transform: new Matrix4().fromArray( boneNode.Transform.a ),\n\t\t\t\t// linkMode: boneNode.Mode,\n\n\t\t\t};\n\n\t\t\tif ( 'Indexes' in boneNode ) {\n\n\t\t\t\trawBone.indices = boneNode.Indexes.a;\n\t\t\t\trawBone.weights = boneNode.Weights.a;\n\n\t\t\t}\n\n\t\t\trawBones.push( rawBone );\n\n\t\t} );\n\n\t\treturn {\n\n\t\t\trawBones: rawBones,\n\t\t\tbones: []\n\n\t\t};\n\n\t}\n\n\t// The top level morph deformer node has type \"BlendShape\" and sub nodes have type \"BlendShapeChannel\"\n\tparseMorphTargets( relationships, deformerNodes ) {\n\n\t\tconst rawMorphTargets = [];\n\n\t\tfor ( let i = 0; i < relationships.children.length; i ++ ) {\n\n\t\t\tconst child = relationships.children[ i ];\n\n\t\t\tconst morphTargetNode = deformerNodes[ child.ID ];\n\n\t\t\tconst rawMorphTarget = {\n\n\t\t\t\tname: morphTargetNode.attrName,\n\t\t\t\tinitialWeight: morphTargetNode.DeformPercent,\n\t\t\t\tid: morphTargetNode.id,\n\t\t\t\tfullWeights: morphTargetNode.FullWeights.a\n\n\t\t\t};\n\n\t\t\tif ( morphTargetNode.attrType !== 'BlendShapeChannel' ) return;\n\n\t\t\trawMorphTarget.geoID = connections.get( parseInt( child.ID ) ).children.filter( function ( child ) {\n\n\t\t\t\treturn child.relationship === undefined;\n\n\t\t\t} )[ 0 ].ID;\n\n\t\t\trawMorphTargets.push( rawMorphTarget );\n\n\t\t}\n\n\t\treturn rawMorphTargets;\n\n\t}\n\n\t// create the main Group() to be returned by the loader\n\tparseScene( deformers, geometryMap, materialMap ) {\n\n\t\tsceneGraph = new Group();\n\n\t\tconst modelMap = this.parseModels( deformers.skeletons, geometryMap, materialMap );\n\n\t\tconst modelNodes = fbxTree.Objects.Model;\n\n\t\tconst scope = this;\n\t\tmodelMap.forEach( function ( model ) {\n\n\t\t\tconst modelNode = modelNodes[ model.ID ];\n\t\t\tscope.setLookAtProperties( model, modelNode );\n\n\t\t\tconst parentConnections = connections.get( model.ID ).parents;\n\n\t\t\tparentConnections.forEach( function ( connection ) {\n\n\t\t\t\tconst parent = modelMap.get( connection.ID );\n\t\t\t\tif ( parent !== undefined ) parent.add( model );\n\n\t\t\t} );\n\n\t\t\tif ( model.parent === null ) {\n\n\t\t\t\tsceneGraph.add( model );\n\n\t\t\t}\n\n\n\t\t} );\n\n\t\tthis.bindSkeleton( deformers.skeletons, geometryMap, modelMap );\n\n\t\tthis.addGlobalSceneSettings();\n\n\t\tsceneGraph.traverse( function ( node ) {\n\n\t\t\tif ( node.userData.transformData ) {\n\n\t\t\t\tif ( node.parent ) {\n\n\t\t\t\t\tnode.userData.transformData.parentMatrix = node.parent.matrix;\n\t\t\t\t\tnode.userData.transformData.parentMatrixWorld = node.parent.matrixWorld;\n\n\t\t\t\t}\n\n\t\t\t\tconst transform = generateTransform( node.userData.transformData );\n\n\t\t\t\tnode.applyMatrix4( transform );\n\t\t\t\tnode.updateWorldMatrix();\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst animations = new AnimationParser().parse();\n\n\t\t// if all the models where already combined in a single group, just return that\n\t\tif ( sceneGraph.children.length === 1 && sceneGraph.children[ 0 ].isGroup ) {\n\n\t\t\tsceneGraph.children[ 0 ].animations = animations;\n\t\t\tsceneGraph = sceneGraph.children[ 0 ];\n\n\t\t}\n\n\t\tsceneGraph.animations = animations;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.Model\n\tparseModels( skeletons, geometryMap, materialMap ) {\n\n\t\tconst modelMap = new Map();\n\t\tconst modelNodes = fbxTree.Objects.Model;\n\n\t\tfor ( const nodeID in modelNodes ) {\n\n\t\t\tconst id = parseInt( nodeID );\n\t\t\tconst node = modelNodes[ nodeID ];\n\t\t\tconst relationships = connections.get( id );\n\n\t\t\tlet model = this.buildSkeleton( relationships, skeletons, id, node.attrName );\n\n\t\t\tif ( ! model ) {\n\n\t\t\t\tswitch ( node.attrType ) {\n\n\t\t\t\t\tcase 'Camera':\n\t\t\t\t\t\tmodel = this.createCamera( relationships );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Light':\n\t\t\t\t\t\tmodel = this.createLight( relationships );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Mesh':\n\t\t\t\t\t\tmodel = this.createMesh( relationships, geometryMap, materialMap );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'NurbsCurve':\n\t\t\t\t\t\tmodel = this.createCurve( relationships, geometryMap );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'LimbNode':\n\t\t\t\t\tcase 'Root':\n\t\t\t\t\t\tmodel = new Bone();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Null':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmodel = new Group();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tmodel.name = node.attrName ? PropertyBinding.sanitizeNodeName( node.attrName ) : '';\n\t\t\t\tmodel.userData.originalName = node.attrName;\n\n\t\t\t\tmodel.ID = id;\n\n\t\t\t}\n\n\t\t\tthis.getTransformData( model, node );\n\t\t\tmodelMap.set( id, model );\n\n\t\t}\n\n\t\treturn modelMap;\n\n\t}\n\n\tbuildSkeleton( relationships, skeletons, id, name ) {\n\n\t\tlet bone = null;\n\n\t\trelationships.parents.forEach( function ( parent ) {\n\n\t\t\tfor ( const ID in skeletons ) {\n\n\t\t\t\tconst skeleton = skeletons[ ID ];\n\n\t\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t\tif ( rawBone.ID === parent.ID ) {\n\n\t\t\t\t\t\tconst subBone = bone;\n\t\t\t\t\t\tbone = new Bone();\n\n\t\t\t\t\t\tbone.matrixWorld.copy( rawBone.transformLink );\n\n\t\t\t\t\t\t// set name and id here - otherwise in cases where \"subBone\" is created it will not have a name / id\n\n\t\t\t\t\t\tbone.name = name ? PropertyBinding.sanitizeNodeName( name ) : '';\n\t\t\t\t\t\tbone.userData.originalName = name;\n\t\t\t\t\t\tbone.ID = id;\n\n\t\t\t\t\t\tskeleton.bones[ i ] = bone;\n\n\t\t\t\t\t\t// In cases where a bone is shared between multiple meshes\n\t\t\t\t\t\t// duplicate the bone here and and it as a child of the first bone\n\t\t\t\t\t\tif ( subBone !== null ) {\n\n\t\t\t\t\t\t\tbone.add( subBone );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn bone;\n\n\t}\n\n\t// create a PerspectiveCamera or OrthographicCamera\n\tcreateCamera( relationships ) {\n\n\t\tlet model;\n\t\tlet cameraAttribute;\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\tcameraAttribute = attr;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( cameraAttribute === undefined ) {\n\n\t\t\tmodel = new Object3D();\n\n\t\t} else {\n\n\t\t\tlet type = 0;\n\t\t\tif ( cameraAttribute.CameraProjectionType !== undefined && cameraAttribute.CameraProjectionType.value === 1 ) {\n\n\t\t\t\ttype = 1;\n\n\t\t\t}\n\n\t\t\tlet nearClippingPlane = 1;\n\t\t\tif ( cameraAttribute.NearPlane !== undefined ) {\n\n\t\t\t\tnearClippingPlane = cameraAttribute.NearPlane.value / 1000;\n\n\t\t\t}\n\n\t\t\tlet farClippingPlane = 1000;\n\t\t\tif ( cameraAttribute.FarPlane !== undefined ) {\n\n\t\t\t\tfarClippingPlane = cameraAttribute.FarPlane.value / 1000;\n\n\t\t\t}\n\n\n\t\t\tlet width = window.innerWidth;\n\t\t\tlet height = window.innerHeight;\n\n\t\t\tif ( cameraAttribute.AspectWidth !== undefined && cameraAttribute.AspectHeight !== undefined ) {\n\n\t\t\t\twidth = cameraAttribute.AspectWidth.value;\n\t\t\t\theight = cameraAttribute.AspectHeight.value;\n\n\t\t\t}\n\n\t\t\tconst aspect = width / height;\n\n\t\t\tlet fov = 45;\n\t\t\tif ( cameraAttribute.FieldOfView !== undefined ) {\n\n\t\t\t\tfov = cameraAttribute.FieldOfView.value;\n\n\t\t\t}\n\n\t\t\tconst focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 0: // Perspective\n\t\t\t\t\tmodel = new PerspectiveCamera( fov, aspect, nearClippingPlane, farClippingPlane );\n\t\t\t\t\tif ( focalLength !== null ) model.setFocalLength( focalLength );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // Orthographic\n\t\t\t\t\tmodel = new OrthographicCamera( - width / 2, width / 2, height / 2, - height / 2, nearClippingPlane, farClippingPlane );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown camera type ' + type + '.' );\n\t\t\t\t\tmodel = new Object3D();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\t// Create a DirectionalLight, PointLight or SpotLight\n\tcreateLight( relationships ) {\n\n\t\tlet model;\n\t\tlet lightAttribute;\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\tlightAttribute = attr;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( lightAttribute === undefined ) {\n\n\t\t\tmodel = new Object3D();\n\n\t\t} else {\n\n\t\t\tlet type;\n\n\t\t\t// LightType can be undefined for Point lights\n\t\t\tif ( lightAttribute.LightType === undefined ) {\n\n\t\t\t\ttype = 0;\n\n\t\t\t} else {\n\n\t\t\t\ttype = lightAttribute.LightType.value;\n\n\t\t\t}\n\n\t\t\tlet color = 0xffffff;\n\n\t\t\tif ( lightAttribute.Color !== undefined ) {\n\n\t\t\t\tcolor = new Color().fromArray( lightAttribute.Color.value ).convertSRGBToLinear();\n\n\t\t\t}\n\n\t\t\tlet intensity = ( lightAttribute.Intensity === undefined ) ? 1 : lightAttribute.Intensity.value / 100;\n\n\t\t\t// light disabled\n\t\t\tif ( lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === 0 ) {\n\n\t\t\t\tintensity = 0;\n\n\t\t\t}\n\n\t\t\tlet distance = 0;\n\t\t\tif ( lightAttribute.FarAttenuationEnd !== undefined ) {\n\n\t\t\t\tif ( lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === 0 ) {\n\n\t\t\t\t\tdistance = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdistance = lightAttribute.FarAttenuationEnd.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd?\n\t\t\tconst decay = 1;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 0: // Point\n\t\t\t\t\tmodel = new PointLight( color, intensity, distance, decay );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // Directional\n\t\t\t\t\tmodel = new DirectionalLight( color, intensity );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // Spot\n\t\t\t\t\tlet angle = Math.PI / 3;\n\n\t\t\t\t\tif ( lightAttribute.InnerAngle !== undefined ) {\n\n\t\t\t\t\t\tangle = MathUtils.degToRad( lightAttribute.InnerAngle.value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet penumbra = 0;\n\t\t\t\t\tif ( lightAttribute.OuterAngle !== undefined ) {\n\n\t\t\t\t\t\t// TODO: this is not correct - FBX calculates outer and inner angle in degrees\n\t\t\t\t\t\t// with OuterAngle > InnerAngle && OuterAngle <= Math.PI\n\t\t\t\t\t\t// while three.js uses a penumbra between (0, 1) to attenuate the inner angle\n\t\t\t\t\t\tpenumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );\n\t\t\t\t\t\tpenumbra = Math.max( penumbra, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmodel = new SpotLight( color, intensity, distance, angle, penumbra, decay );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType.value + ', defaulting to a PointLight.' );\n\t\t\t\t\tmodel = new PointLight( color, intensity );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === 1 ) {\n\n\t\t\t\tmodel.castShadow = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\tcreateMesh( relationships, geometryMap, materialMap ) {\n\n\t\tlet model;\n\t\tlet geometry = null;\n\t\tlet material = null;\n\t\tconst materials = [];\n\n\t\t// get geometry and materials(s) from connections\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tif ( geometryMap.has( child.ID ) ) {\n\n\t\t\t\tgeometry = geometryMap.get( child.ID );\n\n\t\t\t}\n\n\t\t\tif ( materialMap.has( child.ID ) ) {\n\n\t\t\t\tmaterials.push( materialMap.get( child.ID ) );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( materials.length > 1 ) {\n\n\t\t\tmaterial = materials;\n\n\t\t} else if ( materials.length > 0 ) {\n\n\t\t\tmaterial = materials[ 0 ];\n\n\t\t} else {\n\n\t\t\tmaterial = new MeshPhongMaterial( {\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tcolor: 0xcccccc\n\t\t\t} );\n\t\t\tmaterials.push( material );\n\n\t\t}\n\n\t\tif ( 'color' in geometry.attributes ) {\n\n\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( geometry.FBX_Deformer ) {\n\n\t\t\tmodel = new SkinnedMesh( geometry, material );\n\t\t\tmodel.normalizeSkinWeights();\n\n\t\t} else {\n\n\t\t\tmodel = new Mesh( geometry, material );\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\tcreateCurve( relationships, geometryMap ) {\n\n\t\tconst geometry = relationships.children.reduce( function ( geo, child ) {\n\n\t\t\tif ( geometryMap.has( child.ID ) ) geo = geometryMap.get( child.ID );\n\n\t\t\treturn geo;\n\n\t\t}, null );\n\n\t\t// FBX does not list materials for Nurbs lines, so we'll just put our own in here.\n\t\tconst material = new LineBasicMaterial( {\n\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\tcolor: 0x3300ff,\n\t\t\tlinewidth: 1\n\t\t} );\n\t\treturn new Line( geometry, material );\n\n\t}\n\n\t// parse the model node for transform data\n\tgetTransformData( model, modelNode ) {\n\n\t\tconst transformData = {};\n\n\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\telse transformData.eulerOrder = 'ZYX';\n\n\t\tif ( 'Lcl_Translation' in modelNode ) transformData.translation = modelNode.Lcl_Translation.value;\n\n\t\tif ( 'PreRotation' in modelNode ) transformData.preRotation = modelNode.PreRotation.value;\n\t\tif ( 'Lcl_Rotation' in modelNode ) transformData.rotation = modelNode.Lcl_Rotation.value;\n\t\tif ( 'PostRotation' in modelNode ) transformData.postRotation = modelNode.PostRotation.value;\n\n\t\tif ( 'Lcl_Scaling' in modelNode ) transformData.scale = modelNode.Lcl_Scaling.value;\n\n\t\tif ( 'ScalingOffset' in modelNode ) transformData.scalingOffset = modelNode.ScalingOffset.value;\n\t\tif ( 'ScalingPivot' in modelNode ) transformData.scalingPivot = modelNode.ScalingPivot.value;\n\n\t\tif ( 'RotationOffset' in modelNode ) transformData.rotationOffset = modelNode.RotationOffset.value;\n\t\tif ( 'RotationPivot' in modelNode ) transformData.rotationPivot = modelNode.RotationPivot.value;\n\n\t\tmodel.userData.transformData = transformData;\n\n\t}\n\n\tsetLookAtProperties( model, modelNode ) {\n\n\t\tif ( 'LookAtProperty' in modelNode ) {\n\n\t\t\tconst children = connections.get( model.ID ).children;\n\n\t\t\tchildren.forEach( function ( child ) {\n\n\t\t\t\tif ( child.relationship === 'LookAtProperty' ) {\n\n\t\t\t\t\tconst lookAtTarget = fbxTree.Objects.Model[ child.ID ];\n\n\t\t\t\t\tif ( 'Lcl_Translation' in lookAtTarget ) {\n\n\t\t\t\t\t\tconst pos = lookAtTarget.Lcl_Translation.value;\n\n\t\t\t\t\t\t// DirectionalLight, SpotLight\n\t\t\t\t\t\tif ( model.target !== undefined ) {\n\n\t\t\t\t\t\t\tmodel.target.position.fromArray( pos );\n\t\t\t\t\t\t\tsceneGraph.add( model.target );\n\n\t\t\t\t\t\t} else { // Cameras and other Object3Ds\n\n\t\t\t\t\t\t\tmodel.lookAt( new Vector3().fromArray( pos ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tbindSkeleton( skeletons, geometryMap, modelMap ) {\n\n\t\tconst bindMatrices = this.parsePoseNodes();\n\n\t\tfor ( const ID in skeletons ) {\n\n\t\t\tconst skeleton = skeletons[ ID ];\n\n\t\t\tconst parents = connections.get( parseInt( skeleton.ID ) ).parents;\n\n\t\t\tparents.forEach( function ( parent ) {\n\n\t\t\t\tif ( geometryMap.has( parent.ID ) ) {\n\n\t\t\t\t\tconst geoID = parent.ID;\n\t\t\t\t\tconst geoRelationships = connections.get( geoID );\n\n\t\t\t\t\tgeoRelationships.parents.forEach( function ( geoConnParent ) {\n\n\t\t\t\t\t\tif ( modelMap.has( geoConnParent.ID ) ) {\n\n\t\t\t\t\t\t\tconst model = modelMap.get( geoConnParent.ID );\n\n\t\t\t\t\t\t\tmodel.bind( new Skeleton( skeleton.bones ), bindMatrices[ geoConnParent.ID ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tparsePoseNodes() {\n\n\t\tconst bindMatrices = {};\n\n\t\tif ( 'Pose' in fbxTree.Objects ) {\n\n\t\t\tconst BindPoseNode = fbxTree.Objects.Pose;\n\n\t\t\tfor ( const nodeID in BindPoseNode ) {\n\n\t\t\t\tif ( BindPoseNode[ nodeID ].attrType === 'BindPose' && BindPoseNode[ nodeID ].NbPoseNodes > 0 ) {\n\n\t\t\t\t\tconst poseNodes = BindPoseNode[ nodeID ].PoseNode;\n\n\t\t\t\t\tif ( Array.isArray( poseNodes ) ) {\n\n\t\t\t\t\t\tposeNodes.forEach( function ( poseNode ) {\n\n\t\t\t\t\t\t\tbindMatrices[ poseNode.Node ] = new Matrix4().fromArray( poseNode.Matrix.a );\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbindMatrices[ poseNodes.Node ] = new Matrix4().fromArray( poseNodes.Matrix.a );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bindMatrices;\n\n\t}\n\n\taddGlobalSceneSettings() {\n\n\t\tif ( 'GlobalSettings' in fbxTree ) {\n\n\t\t\tif ( 'AmbientColor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\t// Parse ambient color - if it's not set to black (default), create an ambient light\n\n\t\t\t\tconst ambientColor = fbxTree.GlobalSettings.AmbientColor.value;\n\t\t\t\tconst r = ambientColor[ 0 ];\n\t\t\t\tconst g = ambientColor[ 1 ];\n\t\t\t\tconst b = ambientColor[ 2 ];\n\n\t\t\t\tif ( r !== 0 || g !== 0 || b !== 0 ) {\n\n\t\t\t\t\tconst color = new Color( r, g, b ).convertSRGBToLinear();\n\t\t\t\t\tsceneGraph.add( new AmbientLight( color, 1 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( 'UnitScaleFactor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\tsceneGraph.userData.unitScaleFactor = fbxTree.GlobalSettings.UnitScaleFactor.value;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n// parse Geometry data from FBXTree and return map of BufferGeometries\nclass GeometryParser {\n\n\tconstructor() {\n\n\t\tthis.negativeMaterialIndices = false;\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Geometry\n\tparse( deformers ) {\n\n\t\tconst geometryMap = new Map();\n\n\t\tif ( 'Geometry' in fbxTree.Objects ) {\n\n\t\t\tconst geoNodes = fbxTree.Objects.Geometry;\n\n\t\t\tfor ( const nodeID in geoNodes ) {\n\n\t\t\t\tconst relationships = connections.get( parseInt( nodeID ) );\n\t\t\t\tconst geo = this.parseGeometry( relationships, geoNodes[ nodeID ], deformers );\n\n\t\t\t\tgeometryMap.set( parseInt( nodeID ), geo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// report warnings\n\n\t\tif ( this.negativeMaterialIndices === true ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: The FBX file contains invalid (negative) material indices. The asset might not render as expected.' );\n\n\t\t}\n\n\t\treturn geometryMap;\n\n\t}\n\n\t// Parse single node in FBXTree.Objects.Geometry\n\tparseGeometry( relationships, geoNode, deformers ) {\n\n\t\tswitch ( geoNode.attrType ) {\n\n\t\t\tcase 'Mesh':\n\t\t\t\treturn this.parseMeshGeometry( relationships, geoNode, deformers );\n\t\t\t\tbreak;\n\n\t\t\tcase 'NurbsCurve':\n\t\t\t\treturn this.parseNurbsGeometry( geoNode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t// Parse single node mesh geometry in FBXTree.Objects.Geometry\n\tparseMeshGeometry( relationships, geoNode, deformers ) {\n\n\t\tconst skeletons = deformers.skeletons;\n\t\tconst morphTargets = [];\n\n\t\tconst modelNodes = relationships.parents.map( function ( parent ) {\n\n\t\t\treturn fbxTree.Objects.Model[ parent.ID ];\n\n\t\t} );\n\n\t\t// don't create geometry if it is not associated with any models\n\t\tif ( modelNodes.length === 0 ) return;\n\n\t\tconst skeleton = relationships.children.reduce( function ( skeleton, child ) {\n\n\t\t\tif ( skeletons[ child.ID ] !== undefined ) skeleton = skeletons[ child.ID ];\n\n\t\t\treturn skeleton;\n\n\t\t}, null );\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tif ( deformers.morphTargets[ child.ID ] !== undefined ) {\n\n\t\t\t\tmorphTargets.push( deformers.morphTargets[ child.ID ] );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Assume one model and get the preRotation from that\n\t\t// if there is more than one model associated with the geometry this may cause problems\n\t\tconst modelNode = modelNodes[ 0 ];\n\n\t\tconst transformData = {};\n\n\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\tif ( 'GeometricTranslation' in modelNode ) transformData.translation = modelNode.GeometricTranslation.value;\n\t\tif ( 'GeometricRotation' in modelNode ) transformData.rotation = modelNode.GeometricRotation.value;\n\t\tif ( 'GeometricScaling' in modelNode ) transformData.scale = modelNode.GeometricScaling.value;\n\n\t\tconst transform = generateTransform( transformData );\n\n\t\treturn this.genGeometry( geoNode, skeleton, morphTargets, transform );\n\n\t}\n\n\t// Generate a BufferGeometry from a node in FBXTree.Objects.Geometry\n\tgenGeometry( geoNode, skeleton, morphTargets, preTransform ) {\n\n\t\tconst geo = new BufferGeometry();\n\t\tif ( geoNode.attrName ) geo.name = geoNode.attrName;\n\n\t\tconst geoInfo = this.parseGeoNode( geoNode, skeleton );\n\t\tconst buffers = this.genBuffers( geoInfo );\n\n\t\tconst positionAttribute = new Float32BufferAttribute( buffers.vertex, 3 );\n\n\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\tgeo.setAttribute( 'position', positionAttribute );\n\n\t\tif ( buffers.colors.length > 0 ) {\n\n\t\t\tgeo.setAttribute( 'color', new Float32BufferAttribute( buffers.colors, 3 ) );\n\n\t\t}\n\n\t\tif ( skeleton ) {\n\n\t\t\tgeo.setAttribute( 'skinIndex', new Uint16BufferAttribute( buffers.weightsIndices, 4 ) );\n\n\t\t\tgeo.setAttribute( 'skinWeight', new Float32BufferAttribute( buffers.vertexWeights, 4 ) );\n\n\t\t\t// used later to bind the skeleton to the model\n\t\t\tgeo.FBX_Deformer = skeleton;\n\n\t\t}\n\n\t\tif ( buffers.normal.length > 0 ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( preTransform );\n\n\t\t\tconst normalAttribute = new Float32BufferAttribute( buffers.normal, 3 );\n\t\t\tnormalAttribute.applyNormalMatrix( normalMatrix );\n\n\t\t\tgeo.setAttribute( 'normal', normalAttribute );\n\n\t\t}\n\n\t\tbuffers.uvs.forEach( function ( uvBuffer, i ) {\n\n\t\t\tconst name = i === 0 ? 'uv' : `uv${ i }`;\n\n\t\t\tgeo.setAttribute( name, new Float32BufferAttribute( buffers.uvs[ i ], 2 ) );\n\n\t\t} );\n\n\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t// Convert the material indices of each vertex into rendering groups on the geometry.\n\t\t\tlet prevMaterialIndex = buffers.materialIndex[ 0 ];\n\t\t\tlet startIndex = 0;\n\n\t\t\tbuffers.materialIndex.forEach( function ( currentIndex, i ) {\n\n\t\t\t\tif ( currentIndex !== prevMaterialIndex ) {\n\n\t\t\t\t\tgeo.addGroup( startIndex, i - startIndex, prevMaterialIndex );\n\n\t\t\t\t\tprevMaterialIndex = currentIndex;\n\t\t\t\t\tstartIndex = i;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// the loop above doesn't add the last group, do that here.\n\t\t\tif ( geo.groups.length > 0 ) {\n\n\t\t\t\tconst lastGroup = geo.groups[ geo.groups.length - 1 ];\n\t\t\t\tconst lastIndex = lastGroup.start + lastGroup.count;\n\n\t\t\t\tif ( lastIndex !== buffers.materialIndex.length ) {\n\n\t\t\t\t\tgeo.addGroup( lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// case where there are multiple materials but the whole geometry is only\n\t\t\t// using one of them\n\t\t\tif ( geo.groups.length === 0 ) {\n\n\t\t\t\tgeo.addGroup( 0, buffers.materialIndex.length, buffers.materialIndex[ 0 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addMorphTargets( geo, geoNode, morphTargets, preTransform );\n\n\t\treturn geo;\n\n\t}\n\n\tparseGeoNode( geoNode, skeleton ) {\n\n\t\tconst geoInfo = {};\n\n\t\tgeoInfo.vertexPositions = ( geoNode.Vertices !== undefined ) ? geoNode.Vertices.a : [];\n\t\tgeoInfo.vertexIndices = ( geoNode.PolygonVertexIndex !== undefined ) ? geoNode.PolygonVertexIndex.a : [];\n\n\t\tif ( geoNode.LayerElementColor ) {\n\n\t\t\tgeoInfo.color = this.parseVertexColors( geoNode.LayerElementColor[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementMaterial ) {\n\n\t\t\tgeoInfo.material = this.parseMaterialIndices( geoNode.LayerElementMaterial[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementNormal ) {\n\n\t\t\tgeoInfo.normal = this.parseNormals( geoNode.LayerElementNormal[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementUV ) {\n\n\t\t\tgeoInfo.uv = [];\n\n\t\t\tlet i = 0;\n\t\t\twhile ( geoNode.LayerElementUV[ i ] ) {\n\n\t\t\t\tif ( geoNode.LayerElementUV[ i ].UV ) {\n\n\t\t\t\t\tgeoInfo.uv.push( this.parseUVs( geoNode.LayerElementUV[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeoInfo.weightTable = {};\n\n\t\tif ( skeleton !== null ) {\n\n\t\t\tgeoInfo.skeleton = skeleton;\n\n\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t// loop over the bone's vertex indices and weights\n\t\t\t\trawBone.indices.forEach( function ( index, j ) {\n\n\t\t\t\t\tif ( geoInfo.weightTable[ index ] === undefined ) geoInfo.weightTable[ index ] = [];\n\n\t\t\t\t\tgeoInfo.weightTable[ index ].push( {\n\n\t\t\t\t\t\tid: i,\n\t\t\t\t\t\tweight: rawBone.weights[ j ],\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn geoInfo;\n\n\t}\n\n\tgenBuffers( geoInfo ) {\n\n\t\tconst buffers = {\n\t\t\tvertex: [],\n\t\t\tnormal: [],\n\t\t\tcolors: [],\n\t\t\tuvs: [],\n\t\t\tmaterialIndex: [],\n\t\t\tvertexWeights: [],\n\t\t\tweightsIndices: [],\n\t\t};\n\n\t\tlet polygonIndex = 0;\n\t\tlet faceLength = 0;\n\t\tlet displayedWeightsWarning = false;\n\n\t\t// these will hold data for a single face\n\t\tlet facePositionIndexes = [];\n\t\tlet faceNormals = [];\n\t\tlet faceColors = [];\n\t\tlet faceUVs = [];\n\t\tlet faceWeights = [];\n\t\tlet faceWeightIndices = [];\n\n\t\tconst scope = this;\n\t\tgeoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {\n\n\t\t\tlet materialIndex;\n\t\t\tlet endOfFace = false;\n\n\t\t\t// Face index and vertex index arrays are combined in a single array\n\t\t\t// A cube with quad faces looks like this:\n\t\t\t// PolygonVertexIndex: *24 {\n\t\t\t//  a: 0, 1, 3, -3, 2, 3, 5, -5, 4, 5, 7, -7, 6, 7, 1, -1, 1, 7, 5, -4, 6, 0, 2, -5\n\t\t\t//  }\n\t\t\t// Negative numbers mark the end of a face - first face here is 0, 1, 3, -3\n\t\t\t// to find index of last vertex bit shift the index: ^ - 1\n\t\t\tif ( vertexIndex < 0 ) {\n\n\t\t\t\tvertexIndex = vertexIndex ^ - 1; // equivalent to ( x * -1 ) - 1\n\t\t\t\tendOfFace = true;\n\n\t\t\t}\n\n\t\t\tlet weightIndices = [];\n\t\t\tlet weights = [];\n\n\t\t\tfacePositionIndexes.push( vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2 );\n\n\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color );\n\n\t\t\t\tfaceColors.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\tif ( geoInfo.weightTable[ vertexIndex ] !== undefined ) {\n\n\t\t\t\t\tgeoInfo.weightTable[ vertexIndex ].forEach( function ( wt ) {\n\n\t\t\t\t\t\tweights.push( wt.weight );\n\t\t\t\t\t\tweightIndices.push( wt.id );\n\n\t\t\t\t\t} );\n\n\n\t\t\t\t}\n\n\t\t\t\tif ( weights.length > 4 ) {\n\n\t\t\t\t\tif ( ! displayedWeightsWarning ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.' );\n\t\t\t\t\t\tdisplayedWeightsWarning = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst wIndex = [ 0, 0, 0, 0 ];\n\t\t\t\t\tconst Weight = [ 0, 0, 0, 0 ];\n\n\t\t\t\t\tweights.forEach( function ( weight, weightIndex ) {\n\n\t\t\t\t\t\tlet currentWeight = weight;\n\t\t\t\t\t\tlet currentIndex = weightIndices[ weightIndex ];\n\n\t\t\t\t\t\tWeight.forEach( function ( comparedWeight, comparedWeightIndex, comparedWeightArray ) {\n\n\t\t\t\t\t\t\tif ( currentWeight > comparedWeight ) {\n\n\t\t\t\t\t\t\t\tcomparedWeightArray[ comparedWeightIndex ] = currentWeight;\n\t\t\t\t\t\t\t\tcurrentWeight = comparedWeight;\n\n\t\t\t\t\t\t\t\tconst tmp = wIndex[ comparedWeightIndex ];\n\t\t\t\t\t\t\t\twIndex[ comparedWeightIndex ] = currentIndex;\n\t\t\t\t\t\t\t\tcurrentIndex = tmp;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tweightIndices = wIndex;\n\t\t\t\t\tweights = Weight;\n\n\t\t\t\t}\n\n\t\t\t\t// if the weight array is shorter than 4 pad with 0s\n\t\t\t\twhile ( weights.length < 4 ) {\n\n\t\t\t\t\tweights.push( 0 );\n\t\t\t\t\tweightIndices.push( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 4; ++ i ) {\n\n\t\t\t\t\tfaceWeights.push( weights[ i ] );\n\t\t\t\t\tfaceWeightIndices.push( weightIndices[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal );\n\n\t\t\t\tfaceNormals.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\tmaterialIndex = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material )[ 0 ];\n\n\t\t\t\tif ( materialIndex < 0 ) {\n\n\t\t\t\t\tscope.negativeMaterialIndices = true;\n\t\t\t\t\tmaterialIndex = 0; // fallback\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\tgeoInfo.uv.forEach( function ( uv, i ) {\n\n\t\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, uv );\n\n\t\t\t\t\tif ( faceUVs[ i ] === undefined ) {\n\n\t\t\t\t\t\tfaceUVs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceUVs[ i ].push( data[ 0 ] );\n\t\t\t\t\tfaceUVs[ i ].push( data[ 1 ] );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfaceLength ++;\n\n\t\t\tif ( endOfFace ) {\n\n\t\t\t\tscope.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );\n\n\t\t\t\tpolygonIndex ++;\n\t\t\t\tfaceLength = 0;\n\n\t\t\t\t// reset arrays for the next face\n\t\t\t\tfacePositionIndexes = [];\n\t\t\t\tfaceNormals = [];\n\t\t\t\tfaceColors = [];\n\t\t\t\tfaceUVs = [];\n\t\t\t\tfaceWeights = [];\n\t\t\t\tfaceWeightIndices = [];\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn buffers;\n\n\t}\n\n\t// See https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal\n\tgetNormalNewell( vertices ) {\n\n\t\tconst normal = new Vector3( 0.0, 0.0, 0.0 );\n\n\t\tfor ( let i = 0; i < vertices.length; i ++ ) {\n\n\t\t\tconst current = vertices[ i ];\n\t\t\tconst next = vertices[ ( i + 1 ) % vertices.length ];\n\n\t\t\tnormal.x += ( current.y - next.y ) * ( current.z + next.z );\n\t\t\tnormal.y += ( current.z - next.z ) * ( current.x + next.x );\n\t\t\tnormal.z += ( current.x - next.x ) * ( current.y + next.y );\n\n\t\t}\n\n\t\tnormal.normalize();\n\n\t\treturn normal;\n\n\t}\n\n\tgetNormalTangentAndBitangent( vertices ) {\n\n\t\tconst normalVector = this.getNormalNewell( vertices );\n\t\t// Avoid up being equal or almost equal to normalVector\n\t\tconst up = Math.abs( normalVector.z ) > 0.5 ? new Vector3( 0.0, 1.0, 0.0 ) : new Vector3( 0.0, 0.0, 1.0 );\n\t\tconst tangent = up.cross( normalVector ).normalize();\n\t\tconst bitangent = normalVector.clone().cross( tangent ).normalize();\n\n\t\treturn {\n\t\t\tnormal: normalVector,\n\t\t\ttangent: tangent,\n\t\t\tbitangent: bitangent\n\t\t};\n\n\t}\n\n\tflattenVertex( vertex, normalTangent, normalBitangent ) {\n\n\t\treturn new Vector2(\n\t\t\tvertex.dot( normalTangent ),\n\t\t\tvertex.dot( normalBitangent )\n\t\t);\n\n\t}\n\n\t// Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris\n\tgenFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength ) {\n\n\t\tlet triangles;\n\n\t\tif ( faceLength > 3 ) {\n\n\t\t\t// Triangulate n-gon using earcut\n\n\t\t\tconst vertices = [];\n\t\t\t// in morphing scenario vertexPositions represent morphPositions\n\t\t\t// while baseVertexPositions represent the original geometry's positions\n\t\t\tconst positions = geoInfo.baseVertexPositions || geoInfo.vertexPositions;\n\t\t\tfor ( let i = 0; i < facePositionIndexes.length; i += 3 ) {\n\n\t\t\t\tvertices.push(\n\t\t\t\t\tnew Vector3(\n\t\t\t\t\t\tpositions[ facePositionIndexes[ i ] ],\n\t\t\t\t\t\tpositions[ facePositionIndexes[ i + 1 ] ],\n\t\t\t\t\t\tpositions[ facePositionIndexes[ i + 2 ] ]\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tconst { tangent, bitangent } = this.getNormalTangentAndBitangent( vertices );\n\t\t\tconst triangulationInput = [];\n\n\t\t\tfor ( const vertex of vertices ) {\n\n\t\t\t\ttriangulationInput.push( this.flattenVertex( vertex, tangent, bitangent ) );\n\n\t\t\t}\n\n\t\t\t// When vertices is an array of [0,0,0] elements (which is the case for vertices not participating in morph)\n\t\t\t// the triangulationInput will be an array of [0,0] elements\n\t\t\t// resulting in an array of 0 triangles being returned from ShapeUtils.triangulateShape\n\t\t\t// leading to not pushing into buffers.vertex the redundant vertices (the vertices that are not morphed).\n\t\t\t// That's why, in order to support morphing scenario, \"positions\" is looking first for baseVertexPositions,\n\t\t\t// so that we don't end up with an array of 0 triangles for the faces not participating in morph.\n\t\t\ttriangles = ShapeUtils.triangulateShape( triangulationInput, [] );\n\n\t\t} else {\n\n\t\t\t// Regular triangle, skip earcut triangulation step\n\t\t\ttriangles = [[ 0, 1, 2 ]];\n\n\t\t}\n\n\t\tfor ( const [ i0, i1, i2 ] of triangles ) {\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 + 2 ] ] );\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 + 2 ] ] );\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 + 2 ] ] );\n\n\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 3 ] );\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 3 ] );\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 3 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 + 2 ] );\n\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 + 2 ] );\n\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 + 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 + 2 ] );\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 + 2 ] );\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 + 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\tgeoInfo.uv.forEach( function ( uv, j ) {\n\n\t\t\t\t\tif ( buffers.uvs[ j ] === undefined ) buffers.uvs[ j ] = [];\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i0 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i0 * 2 + 1 ] );\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i1 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i1 * 2 + 1 ] );\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i2 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i2 * 2 + 1 ] );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\taddMorphTargets( parentGeo, parentGeoNode, morphTargets, preTransform ) {\n\n\t\tif ( morphTargets.length === 0 ) return;\n\n\t\tparentGeo.morphTargetsRelative = true;\n\n\t\tparentGeo.morphAttributes.position = [];\n\t\t// parentGeo.morphAttributes.normal = []; // not implemented\n\n\t\tconst scope = this;\n\t\tmorphTargets.forEach( function ( morphTarget ) {\n\n\t\t\tmorphTarget.rawTargets.forEach( function ( rawTarget ) {\n\n\t\t\t\tconst morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];\n\n\t\t\t\tif ( morphGeoNode !== undefined ) {\n\n\t\t\t\t\tscope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t// a morph geometry node is similar to a standard  node, and the node is also contained\n\t// in FBXTree.Objects.Geometry, however it can only have attributes for position, normal\n\t// and a special attribute Index defining which vertices of the original geometry are affected\n\t// Normal and position attributes only have data for the vertices that are affected by the morph\n\tgenMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, name ) {\n\n\t\tconst basePositions = parentGeoNode.Vertices !== undefined ? parentGeoNode.Vertices.a : [];\n\t\tconst baseIndices = parentGeoNode.PolygonVertexIndex !== undefined ? parentGeoNode.PolygonVertexIndex.a : [];\n\n\t\tconst morphPositionsSparse = morphGeoNode.Vertices !== undefined ? morphGeoNode.Vertices.a : [];\n\t\tconst morphIndices = morphGeoNode.Indexes !== undefined ? morphGeoNode.Indexes.a : [];\n\n\t\tconst length = parentGeo.attributes.position.count * 3;\n\t\tconst morphPositions = new Float32Array( length );\n\n\t\tfor ( let i = 0; i < morphIndices.length; i ++ ) {\n\n\t\t\tconst morphIndex = morphIndices[ i ] * 3;\n\n\t\t\tmorphPositions[ morphIndex ] = morphPositionsSparse[ i * 3 ];\n\t\t\tmorphPositions[ morphIndex + 1 ] = morphPositionsSparse[ i * 3 + 1 ];\n\t\t\tmorphPositions[ morphIndex + 2 ] = morphPositionsSparse[ i * 3 + 2 ];\n\n\t\t}\n\n\t\t// TODO: add morph normal support\n\t\tconst morphGeoInfo = {\n\t\t\tvertexIndices: baseIndices,\n\t\t\tvertexPositions: morphPositions,\n\t\t\tbaseVertexPositions: basePositions\n\t\t};\n\n\t\tconst morphBuffers = this.genBuffers( morphGeoInfo );\n\n\t\tconst positionAttribute = new Float32BufferAttribute( morphBuffers.vertex, 3 );\n\t\tpositionAttribute.name = name || morphGeoNode.attrName;\n\n\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\tparentGeo.morphAttributes.position.push( positionAttribute );\n\n\t}\n\n\t// Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists\n\tparseNormals( NormalNode ) {\n\n\t\tconst mappingType = NormalNode.MappingInformationType;\n\t\tconst referenceType = NormalNode.ReferenceInformationType;\n\t\tconst buffer = NormalNode.Normals.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tif ( 'NormalIndex' in NormalNode ) {\n\n\t\t\t\tindexBuffer = NormalNode.NormalIndex.a;\n\n\t\t\t} else if ( 'NormalsIndex' in NormalNode ) {\n\n\t\t\t\tindexBuffer = NormalNode.NormalsIndex.a;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 3,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists\n\tparseUVs( UVNode ) {\n\n\t\tconst mappingType = UVNode.MappingInformationType;\n\t\tconst referenceType = UVNode.ReferenceInformationType;\n\t\tconst buffer = UVNode.UV.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tindexBuffer = UVNode.UVIndex.a;\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 2,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists\n\tparseVertexColors( ColorNode ) {\n\n\t\tconst mappingType = ColorNode.MappingInformationType;\n\t\tconst referenceType = ColorNode.ReferenceInformationType;\n\t\tconst buffer = ColorNode.Colors.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tindexBuffer = ColorNode.ColorIndex.a;\n\n\t\t}\n\n\t\tfor ( let i = 0, c = new Color(); i < buffer.length; i += 4 ) {\n\n\t\t\tc.fromArray( buffer, i ).convertSRGBToLinear().toArray( buffer, i );\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 4,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists\n\tparseMaterialIndices( MaterialNode ) {\n\n\t\tconst mappingType = MaterialNode.MappingInformationType;\n\t\tconst referenceType = MaterialNode.ReferenceInformationType;\n\n\t\tif ( mappingType === 'NoMappingInformation' ) {\n\n\t\t\treturn {\n\t\t\t\tdataSize: 1,\n\t\t\t\tbuffer: [ 0 ],\n\t\t\t\tindices: [ 0 ],\n\t\t\t\tmappingType: 'AllSame',\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t}\n\n\t\tconst materialIndexBuffer = MaterialNode.Materials.a;\n\n\t\t// Since materials are stored as indices, there's a bit of a mismatch between FBX and what\n\t\t// we expect.So we create an intermediate buffer that points to the index in the buffer,\n\t\t// for conforming with the other functions we've written for other data.\n\t\tconst materialIndices = [];\n\n\t\tfor ( let i = 0; i < materialIndexBuffer.length; ++ i ) {\n\n\t\t\tmaterialIndices.push( i );\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 1,\n\t\t\tbuffer: materialIndexBuffer,\n\t\t\tindices: materialIndices,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Generate a NurbGeometry from a node in FBXTree.Objects.Geometry\n\tparseNurbsGeometry( geoNode ) {\n\n\t\tconst order = parseInt( geoNode.Order );\n\n\t\tif ( isNaN( order ) ) {\n\n\t\t\tconsole.error( 'THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geoNode.Order, geoNode.id );\n\t\t\treturn new BufferGeometry();\n\n\t\t}\n\n\t\tconst degree = order - 1;\n\n\t\tconst knots = geoNode.KnotVector.a;\n\t\tconst controlPoints = [];\n\t\tconst pointsValues = geoNode.Points.a;\n\n\t\tfor ( let i = 0, l = pointsValues.length; i < l; i += 4 ) {\n\n\t\t\tcontrolPoints.push( new Vector4().fromArray( pointsValues, i ) );\n\n\t\t}\n\n\t\tlet startKnot, endKnot;\n\n\t\tif ( geoNode.Form === 'Closed' ) {\n\n\t\t\tcontrolPoints.push( controlPoints[ 0 ] );\n\n\t\t} else if ( geoNode.Form === 'Periodic' ) {\n\n\t\t\tstartKnot = degree;\n\t\t\tendKnot = knots.length - 1 - startKnot;\n\n\t\t\tfor ( let i = 0; i < degree; ++ i ) {\n\n\t\t\t\tcontrolPoints.push( controlPoints[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst curve = new NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );\n\t\tconst points = curve.getPoints( controlPoints.length * 12 );\n\n\t\treturn new BufferGeometry().setFromPoints( points );\n\n\t}\n\n}\n\n// parse animation data from FBXTree\nclass AnimationParser {\n\n\t// take raw animation clips and turn them into three.js animation clips\n\tparse() {\n\n\t\tconst animationClips = [];\n\n\t\tconst rawClips = this.parseClips();\n\n\t\tif ( rawClips !== undefined ) {\n\n\t\t\tfor ( const key in rawClips ) {\n\n\t\t\t\tconst rawClip = rawClips[ key ];\n\n\t\t\t\tconst clip = this.addClip( rawClip );\n\n\t\t\t\tanimationClips.push( clip );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animationClips;\n\n\t}\n\n\tparseClips() {\n\n\t\t// since the actual transformation data is stored in FBXTree.Objects.AnimationCurve,\n\t\t// if this is undefined we can safely assume there are no animations\n\t\tif ( fbxTree.Objects.AnimationCurve === undefined ) return undefined;\n\n\t\tconst curveNodesMap = this.parseAnimationCurveNodes();\n\n\t\tthis.parseAnimationCurves( curveNodesMap );\n\n\t\tconst layersMap = this.parseAnimationLayers( curveNodesMap );\n\t\tconst rawClips = this.parseAnimStacks( layersMap );\n\n\t\treturn rawClips;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationCurveNode\n\t// each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation )\n\t// and is referenced by an AnimationLayer\n\tparseAnimationCurveNodes() {\n\n\t\tconst rawCurveNodes = fbxTree.Objects.AnimationCurveNode;\n\n\t\tconst curveNodesMap = new Map();\n\n\t\tfor ( const nodeID in rawCurveNodes ) {\n\n\t\t\tconst rawCurveNode = rawCurveNodes[ nodeID ];\n\n\t\t\tif ( rawCurveNode.attrName.match( /S|R|T|DeformPercent/ ) !== null ) {\n\n\t\t\t\tconst curveNode = {\n\n\t\t\t\t\tid: rawCurveNode.id,\n\t\t\t\t\tattr: rawCurveNode.attrName,\n\t\t\t\t\tcurves: {},\n\n\t\t\t\t};\n\n\t\t\t\tcurveNodesMap.set( curveNode.id, curveNode );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn curveNodesMap;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationCurve and connect them up to\n\t// previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated\n\t// axis ( e.g. times and values of x rotation)\n\tparseAnimationCurves( curveNodesMap ) {\n\n\t\tconst rawCurves = fbxTree.Objects.AnimationCurve;\n\n\t\t// TODO: Many values are identical up to roundoff error, but won't be optimised\n\t\t// e.g. position times: [0, 0.4, 0. 8]\n\t\t// position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809]\n\t\t// clearly, this should be optimised to\n\t\t// times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809]\n\t\t// this shows up in nearly every FBX file, and generally time array is length > 100\n\n\t\tfor ( const nodeID in rawCurves ) {\n\n\t\t\tconst animationCurve = {\n\n\t\t\t\tid: rawCurves[ nodeID ].id,\n\t\t\t\ttimes: rawCurves[ nodeID ].KeyTime.a.map( convertFBXTimeToSeconds ),\n\t\t\t\tvalues: rawCurves[ nodeID ].KeyValueFloat.a,\n\n\t\t\t};\n\n\t\t\tconst relationships = connections.get( animationCurve.id );\n\n\t\t\tif ( relationships !== undefined ) {\n\n\t\t\t\tconst animationCurveID = relationships.parents[ 0 ].ID;\n\t\t\t\tconst animationCurveRelationship = relationships.parents[ 0 ].relationship;\n\n\t\t\t\tif ( animationCurveRelationship.match( /X/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'x' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /Y/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'y' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /Z/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'z' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /DeformPercent/ ) && curveNodesMap.has( animationCurveID ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'morph' ] = animationCurve;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references\n\t// to various AnimationCurveNodes and is referenced by an AnimationStack node\n\t// note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack\n\tparseAnimationLayers( curveNodesMap ) {\n\n\t\tconst rawLayers = fbxTree.Objects.AnimationLayer;\n\n\t\tconst layersMap = new Map();\n\n\t\tfor ( const nodeID in rawLayers ) {\n\n\t\t\tconst layerCurveNodes = [];\n\n\t\t\tconst connection = connections.get( parseInt( nodeID ) );\n\n\t\t\tif ( connection !== undefined ) {\n\n\t\t\t\t// all the animationCurveNodes used in the layer\n\t\t\t\tconst children = connection.children;\n\n\t\t\t\tchildren.forEach( function ( child, i ) {\n\n\t\t\t\t\tif ( curveNodesMap.has( child.ID ) ) {\n\n\t\t\t\t\t\tconst curveNode = curveNodesMap.get( child.ID );\n\n\t\t\t\t\t\t// check that the curves are defined for at least one axis, otherwise ignore the curveNode\n\t\t\t\t\t\tif ( curveNode.curves.x !== undefined || curveNode.curves.y !== undefined || curveNode.curves.z !== undefined ) {\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconst modelID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tif ( modelID !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tconst rawModel = fbxTree.Objects.Model[ modelID.toString() ];\n\n\t\t\t\t\t\t\t\t\tif ( rawModel === undefined ) {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered a unused curve.', child );\n\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst node = {\n\n\t\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\t\tID: rawModel.id,\n\t\t\t\t\t\t\t\t\t\tinitialPosition: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\tinitialRotation: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\tinitialScale: [ 1, 1, 1 ],\n\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\tsceneGraph.traverse( function ( child ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( child.ID === rawModel.id ) {\n\n\t\t\t\t\t\t\t\t\t\t\tnode.transform = child.matrix;\n\n\t\t\t\t\t\t\t\t\t\t\tif ( child.userData.transformData ) node.eulerOrder = child.userData.transformData.eulerOrder;\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t\tif ( ! node.transform ) node.transform = new Matrix4();\n\n\t\t\t\t\t\t\t\t\t// if the animated model is pre rotated, we'll have to apply the pre rotations to every\n\t\t\t\t\t\t\t\t\t// animation value as well\n\t\t\t\t\t\t\t\t\tif ( 'PreRotation' in rawModel ) node.preRotation = rawModel.PreRotation.value;\n\t\t\t\t\t\t\t\t\tif ( 'PostRotation' in rawModel ) node.postRotation = rawModel.PostRotation.value;\n\n\t\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] ) layerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t} else if ( curveNode.curves.morph !== undefined ) {\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconst deformerID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tconst morpherID = connections.get( deformerID ).parents[ 0 ].ID;\n\t\t\t\t\t\t\t\tconst geoID = connections.get( morpherID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t// assuming geometry is not used in more than one model\n\t\t\t\t\t\t\t\tconst modelID = connections.get( geoID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tconst rawModel = fbxTree.Objects.Model[ modelID ];\n\n\t\t\t\t\t\t\t\tconst node = {\n\n\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\tmorphName: fbxTree.Objects.Deformer[ deformerID ].attrName,\n\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlayerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tlayersMap.set( parseInt( nodeID ), layerCurveNodes );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn layersMap;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation\n\t// hierarchy. Each Stack node will be used to create a AnimationClip\n\tparseAnimStacks( layersMap ) {\n\n\t\tconst rawStacks = fbxTree.Objects.AnimationStack;\n\n\t\t// connect the stacks (clips) up to the layers\n\t\tconst rawClips = {};\n\n\t\tfor ( const nodeID in rawStacks ) {\n\n\t\t\tconst children = connections.get( parseInt( nodeID ) ).children;\n\n\t\t\tif ( children.length > 1 ) {\n\n\t\t\t\t// it seems like stacks will always be associated with a single layer. But just in case there are files\n\t\t\t\t// where there are multiple layers per stack, we'll display a warning\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.' );\n\n\t\t\t}\n\n\t\t\tconst layer = layersMap.get( children[ 0 ].ID );\n\n\t\t\trawClips[ nodeID ] = {\n\n\t\t\t\tname: rawStacks[ nodeID ].attrName,\n\t\t\t\tlayer: layer,\n\n\t\t\t};\n\n\t\t}\n\n\t\treturn rawClips;\n\n\t}\n\n\taddClip( rawClip ) {\n\n\t\tlet tracks = [];\n\n\t\tconst scope = this;\n\t\trawClip.layer.forEach( function ( rawTracks ) {\n\n\t\t\ttracks = tracks.concat( scope.generateTracks( rawTracks ) );\n\n\t\t} );\n\n\t\treturn new AnimationClip( rawClip.name, - 1, tracks );\n\n\t}\n\n\tgenerateTracks( rawTracks ) {\n\n\t\tconst tracks = [];\n\n\t\tlet initialPosition = new Vector3();\n\t\tlet initialScale = new Vector3();\n\n\t\tif ( rawTracks.transform ) rawTracks.transform.decompose( initialPosition, new Quaternion(), initialScale );\n\n\t\tinitialPosition = initialPosition.toArray();\n\t\tinitialScale = initialScale.toArray();\n\n\t\tif ( rawTracks.T !== undefined && Object.keys( rawTracks.T.curves ).length > 0 ) {\n\n\t\t\tconst positionTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.T.curves, initialPosition, 'position' );\n\t\t\tif ( positionTrack !== undefined ) tracks.push( positionTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.R !== undefined && Object.keys( rawTracks.R.curves ).length > 0 ) {\n\n\t\t\tconst rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder );\n\t\t\tif ( rotationTrack !== undefined ) tracks.push( rotationTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.S !== undefined && Object.keys( rawTracks.S.curves ).length > 0 ) {\n\n\t\t\tconst scaleTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.S.curves, initialScale, 'scale' );\n\t\t\tif ( scaleTrack !== undefined ) tracks.push( scaleTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.DeformPercent !== undefined ) {\n\n\t\t\tconst morphTrack = this.generateMorphTrack( rawTracks );\n\t\t\tif ( morphTrack !== undefined ) tracks.push( morphTrack );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\tgenerateVectorTrack( modelName, curves, initialValue, type ) {\n\n\t\tconst times = this.getTimesForAllAxes( curves );\n\t\tconst values = this.getKeyframeTrackValues( times, curves, initialValue );\n\n\t\treturn new VectorKeyframeTrack( modelName + '.' + type, times, values );\n\n\t}\n\n\tgenerateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder ) {\n\n\t\tlet times;\n\t\tlet values;\n\n\t\tif ( curves.x !== undefined && curves.y !== undefined && curves.z !== undefined ) {\n\n\t\t\tconst result = this.interpolateRotations( curves.x, curves.y, curves.z, eulerOrder );\n\n\t\t\ttimes = result[ 0 ];\n\t\t\tvalues = result[ 1 ];\n\n\t\t}\n\n\t\tif ( preRotation !== undefined ) {\n\n\t\t\tpreRotation = preRotation.map( MathUtils.degToRad );\n\t\t\tpreRotation.push( eulerOrder );\n\n\t\t\tpreRotation = new Euler().fromArray( preRotation );\n\t\t\tpreRotation = new Quaternion().setFromEuler( preRotation );\n\n\t\t}\n\n\t\tif ( postRotation !== undefined ) {\n\n\t\t\tpostRotation = postRotation.map( MathUtils.degToRad );\n\t\t\tpostRotation.push( eulerOrder );\n\n\t\t\tpostRotation = new Euler().fromArray( postRotation );\n\t\t\tpostRotation = new Quaternion().setFromEuler( postRotation ).invert();\n\n\t\t}\n\n\t\tconst quaternion = new Quaternion();\n\t\tconst euler = new Euler();\n\n\t\tconst quaternionValues = [];\n\n\t\tif ( ! values || ! times ) return new QuaternionKeyframeTrack( modelName + '.quaternion', [ 0 ], [ 0 ] );\n\n\t\tfor ( let i = 0; i < values.length; i += 3 ) {\n\n\t\t\teuler.set( values[ i ], values[ i + 1 ], values[ i + 2 ], eulerOrder );\n\t\t\tquaternion.setFromEuler( euler );\n\n\t\t\tif ( preRotation !== undefined ) quaternion.premultiply( preRotation );\n\t\t\tif ( postRotation !== undefined ) quaternion.multiply( postRotation );\n\n\t\t\t// Check unroll\n\t\t\tif ( i > 2 ) {\n\n\t\t\t\tconst prevQuat = new Quaternion().fromArray(\n\t\t\t\t\tquaternionValues,\n\t\t\t\t\t( ( i - 3 ) / 3 ) * 4\n\t\t\t\t);\n\n\t\t\t\tif ( prevQuat.dot( quaternion ) < 0 ) {\n\n\t\t\t\t\tquaternion.set( - quaternion.x, - quaternion.y, - quaternion.z, - quaternion.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tquaternion.toArray( quaternionValues, ( i / 3 ) * 4 );\n\n\t\t}\n\n\t\treturn new QuaternionKeyframeTrack( modelName + '.quaternion', times, quaternionValues );\n\n\t}\n\n\tgenerateMorphTrack( rawTracks ) {\n\n\t\tconst curves = rawTracks.DeformPercent.curves.morph;\n\t\tconst values = curves.values.map( function ( val ) {\n\n\t\t\treturn val / 100;\n\n\t\t} );\n\n\t\tconst morphNum = sceneGraph.getObjectByName( rawTracks.modelName ).morphTargetDictionary[ rawTracks.morphName ];\n\n\t\treturn new NumberKeyframeTrack( rawTracks.modelName + '.morphTargetInfluences[' + morphNum + ']', curves.times, values );\n\n\t}\n\n\t// For all animated objects, times are defined separately for each axis\n\t// Here we'll combine the times into one sorted array without duplicates\n\tgetTimesForAllAxes( curves ) {\n\n\t\tlet times = [];\n\n\t\t// first join together the times for each axis, if defined\n\t\tif ( curves.x !== undefined ) times = times.concat( curves.x.times );\n\t\tif ( curves.y !== undefined ) times = times.concat( curves.y.times );\n\t\tif ( curves.z !== undefined ) times = times.concat( curves.z.times );\n\n\t\t// then sort them\n\t\ttimes = times.sort( function ( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t} );\n\n\t\t// and remove duplicates\n\t\tif ( times.length > 1 ) {\n\n\t\t\tlet targetIndex = 1;\n\t\t\tlet lastValue = times[ 0 ];\n\t\t\tfor ( let i = 1; i < times.length; i ++ ) {\n\n\t\t\t\tconst currentValue = times[ i ];\n\t\t\t\tif ( currentValue !== lastValue ) {\n\n\t\t\t\t\ttimes[ targetIndex ] = currentValue;\n\t\t\t\t\tlastValue = currentValue;\n\t\t\t\t\ttargetIndex ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttimes = times.slice( 0, targetIndex );\n\n\t\t}\n\n\t\treturn times;\n\n\t}\n\n\tgetKeyframeTrackValues( times, curves, initialValue ) {\n\n\t\tconst prevValue = initialValue;\n\n\t\tconst values = [];\n\n\t\tlet xIndex = - 1;\n\t\tlet yIndex = - 1;\n\t\tlet zIndex = - 1;\n\n\t\ttimes.forEach( function ( time ) {\n\n\t\t\tif ( curves.x ) xIndex = curves.x.times.indexOf( time );\n\t\t\tif ( curves.y ) yIndex = curves.y.times.indexOf( time );\n\t\t\tif ( curves.z ) zIndex = curves.z.times.indexOf( time );\n\n\t\t\t// if there is an x value defined for this frame, use that\n\t\t\tif ( xIndex !== - 1 ) {\n\n\t\t\t\tconst xValue = curves.x.values[ xIndex ];\n\t\t\t\tvalues.push( xValue );\n\t\t\t\tprevValue[ 0 ] = xValue;\n\n\t\t\t} else {\n\n\t\t\t\t// otherwise use the x value from the previous frame\n\t\t\t\tvalues.push( prevValue[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( yIndex !== - 1 ) {\n\n\t\t\t\tconst yValue = curves.y.values[ yIndex ];\n\t\t\t\tvalues.push( yValue );\n\t\t\t\tprevValue[ 1 ] = yValue;\n\n\t\t\t} else {\n\n\t\t\t\tvalues.push( prevValue[ 1 ] );\n\n\t\t\t}\n\n\t\t\tif ( zIndex !== - 1 ) {\n\n\t\t\t\tconst zValue = curves.z.values[ zIndex ];\n\t\t\t\tvalues.push( zValue );\n\t\t\t\tprevValue[ 2 ] = zValue;\n\n\t\t\t} else {\n\n\t\t\t\tvalues.push( prevValue[ 2 ] );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn values;\n\n\t}\n\n\t// Rotations are defined as Euler angles which can have values  of any size\n\t// These will be converted to quaternions which don't support values greater than\n\t// PI, so we'll interpolate large rotations\n\tinterpolateRotations( curvex, curvey, curvez, eulerOrder ) {\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\t// Add first frame\n\t\ttimes.push( curvex.times[ 0 ] );\n\t\tvalues.push( MathUtils.degToRad( curvex.values[ 0 ] ) );\n\t\tvalues.push( MathUtils.degToRad( curvey.values[ 0 ] ) );\n\t\tvalues.push( MathUtils.degToRad( curvez.values[ 0 ] ) );\n\n\t\tfor ( let i = 1; i < curvex.values.length; i ++ ) {\n\n\t\t\tconst initialValue = [\n\t\t\t\tcurvex.values[ i - 1 ],\n\t\t\t\tcurvey.values[ i - 1 ],\n\t\t\t\tcurvez.values[ i - 1 ],\n\t\t\t];\n\n\t\t\tif ( isNaN( initialValue[ 0 ] ) || isNaN( initialValue[ 1 ] ) || isNaN( initialValue[ 2 ] ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst initialValueRad = initialValue.map( MathUtils.degToRad );\n\n\t\t\tconst currentValue = [\n\t\t\t\tcurvex.values[ i ],\n\t\t\t\tcurvey.values[ i ],\n\t\t\t\tcurvez.values[ i ],\n\t\t\t];\n\n\t\t\tif ( isNaN( currentValue[ 0 ] ) || isNaN( currentValue[ 1 ] ) || isNaN( currentValue[ 2 ] ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValueRad = currentValue.map( MathUtils.degToRad );\n\n\t\t\tconst valuesSpan = [\n\t\t\t\tcurrentValue[ 0 ] - initialValue[ 0 ],\n\t\t\t\tcurrentValue[ 1 ] - initialValue[ 1 ],\n\t\t\t\tcurrentValue[ 2 ] - initialValue[ 2 ],\n\t\t\t];\n\n\t\t\tconst absoluteSpan = [\n\t\t\t\tMath.abs( valuesSpan[ 0 ] ),\n\t\t\t\tMath.abs( valuesSpan[ 1 ] ),\n\t\t\t\tMath.abs( valuesSpan[ 2 ] ),\n\t\t\t];\n\n\t\t\tif ( absoluteSpan[ 0 ] >= 180 || absoluteSpan[ 1 ] >= 180 || absoluteSpan[ 2 ] >= 180 ) {\n\n\t\t\t\tconst maxAbsSpan = Math.max( ...absoluteSpan );\n\n\t\t\t\tconst numSubIntervals = maxAbsSpan / 180;\n\n\t\t\t\tconst E1 = new Euler( ...initialValueRad, eulerOrder );\n\t\t\t\tconst E2 = new Euler( ...currentValueRad, eulerOrder );\n\n\t\t\t\tconst Q1 = new Quaternion().setFromEuler( E1 );\n\t\t\t\tconst Q2 = new Quaternion().setFromEuler( E2 );\n\n\t\t\t\t// Check unroll\n\t\t\t\tif ( Q1.dot( Q2 ) ) {\n\n\t\t\t\t\tQ2.set( - Q2.x, - Q2.y, - Q2.z, - Q2.w );\n\n\t\t\t\t}\n\n\t\t\t\t// Interpolate\n\t\t\t\tconst initialTime = curvex.times[ i - 1 ];\n\t\t\t\tconst timeSpan = curvex.times[ i ] - initialTime;\n\n\t\t\t\tconst Q = new Quaternion();\n\t\t\t\tconst E = new Euler();\n\t\t\t\tfor ( let t = 0; t < 1; t += 1 / numSubIntervals ) {\n\n\t\t\t\t\tQ.copy( Q1.clone().slerp( Q2.clone(), t ) );\n\n\t\t\t\t\ttimes.push( initialTime + t * timeSpan );\n\t\t\t\t\tE.setFromQuaternion( Q, eulerOrder );\n\n\t\t\t\t\tvalues.push( E.x );\n\t\t\t\t\tvalues.push( E.y );\n\t\t\t\t\tvalues.push( E.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttimes.push( curvex.times[ i ] );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvex.values[ i ] ) );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvey.values[ i ] ) );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvez.values[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn [ times, values ];\n\n\t}\n\n}\n\n// parse an FBX file in ASCII format\nclass TextParser {\n\n\tgetPrevNode() {\n\n\t\treturn this.nodeStack[ this.currentIndent - 2 ];\n\n\t}\n\n\tgetCurrentNode() {\n\n\t\treturn this.nodeStack[ this.currentIndent - 1 ];\n\n\t}\n\n\tgetCurrentProp() {\n\n\t\treturn this.currentProp;\n\n\t}\n\n\tpushStack( node ) {\n\n\t\tthis.nodeStack.push( node );\n\t\tthis.currentIndent += 1;\n\n\t}\n\n\tpopStack() {\n\n\t\tthis.nodeStack.pop();\n\t\tthis.currentIndent -= 1;\n\n\t}\n\n\tsetCurrentProp( val, name ) {\n\n\t\tthis.currentProp = val;\n\t\tthis.currentPropName = name;\n\n\t}\n\n\tparse( text ) {\n\n\t\tthis.currentIndent = 0;\n\n\t\tthis.allNodes = new FBXTree();\n\t\tthis.nodeStack = [];\n\t\tthis.currentProp = [];\n\t\tthis.currentPropName = '';\n\n\t\tconst scope = this;\n\n\t\tconst split = text.split( /[\\r\\n]+/ );\n\n\t\tsplit.forEach( function ( line, i ) {\n\n\t\t\tconst matchComment = line.match( /^[\\s\\t]*;/ );\n\t\t\tconst matchEmpty = line.match( /^[\\s\\t]*$/ );\n\n\t\t\tif ( matchComment || matchEmpty ) return;\n\n\t\t\tconst matchBeginning = line.match( '^\\\\t{' + scope.currentIndent + '}(\\\\w+):(.*){', '' );\n\t\t\tconst matchProperty = line.match( '^\\\\t{' + ( scope.currentIndent ) + '}(\\\\w+):[\\\\s\\\\t\\\\r\\\\n](.*)' );\n\t\t\tconst matchEnd = line.match( '^\\\\t{' + ( scope.currentIndent - 1 ) + '}}' );\n\n\t\t\tif ( matchBeginning ) {\n\n\t\t\t\tscope.parseNodeBegin( line, matchBeginning );\n\n\t\t\t} else if ( matchProperty ) {\n\n\t\t\t\tscope.parseNodeProperty( line, matchProperty, split[ ++ i ] );\n\n\t\t\t} else if ( matchEnd ) {\n\n\t\t\t\tscope.popStack();\n\n\t\t\t} else if ( line.match( /^[^\\s\\t}]/ ) ) {\n\n\t\t\t\t// large arrays are split over multiple lines terminated with a ',' character\n\t\t\t\t// if this is encountered the line needs to be joined to the previous line\n\t\t\t\tscope.parseNodePropertyContinued( line );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this.allNodes;\n\n\t}\n\n\tparseNodeBegin( line, property ) {\n\n\t\tconst nodeName = property[ 1 ].trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\tconst nodeAttrs = property[ 2 ].split( ',' ).map( function ( attr ) {\n\n\t\t\treturn attr.trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\t} );\n\n\t\tconst node = { name: nodeName };\n\t\tconst attrs = this.parseNodeAttr( nodeAttrs );\n\n\t\tconst currentNode = this.getCurrentNode();\n\n\t\t// a top node\n\t\tif ( this.currentIndent === 0 ) {\n\n\t\t\tthis.allNodes.add( nodeName, node );\n\n\t\t} else { // a subnode\n\n\t\t\t// if the subnode already exists, append it\n\t\t\tif ( nodeName in currentNode ) {\n\n\t\t\t\t// special case Pose needs PoseNodes as an array\n\t\t\t\tif ( nodeName === 'PoseNode' ) {\n\n\t\t\t\t\tcurrentNode.PoseNode.push( node );\n\n\t\t\t\t} else if ( currentNode[ nodeName ].id !== undefined ) {\n\n\t\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\t\tcurrentNode[ nodeName ][ currentNode[ nodeName ].id ] = currentNode[ nodeName ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( attrs.id !== '' ) currentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t} else if ( typeof attrs.id === 'number' ) {\n\n\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\tcurrentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t} else if ( nodeName !== 'Properties70' ) {\n\n\t\t\t\tif ( nodeName === 'PoseNode' )\tcurrentNode[ nodeName ] = [ node ];\n\t\t\t\telse currentNode[ nodeName ] = node;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( typeof attrs.id === 'number' ) node.id = attrs.id;\n\t\tif ( attrs.name !== '' ) node.attrName = attrs.name;\n\t\tif ( attrs.type !== '' ) node.attrType = attrs.type;\n\n\t\tthis.pushStack( node );\n\n\t}\n\n\tparseNodeAttr( attrs ) {\n\n\t\tlet id = attrs[ 0 ];\n\n\t\tif ( attrs[ 0 ] !== '' ) {\n\n\t\t\tid = parseInt( attrs[ 0 ] );\n\n\t\t\tif ( isNaN( id ) ) {\n\n\t\t\t\tid = attrs[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet name = '', type = '';\n\n\t\tif ( attrs.length > 1 ) {\n\n\t\t\tname = attrs[ 1 ].replace( /^(\\w+)::/, '' );\n\t\t\ttype = attrs[ 2 ];\n\n\t\t}\n\n\t\treturn { id: id, name: name, type: type };\n\n\t}\n\n\tparseNodeProperty( line, property, contentLine ) {\n\n\t\tlet propName = property[ 1 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\t\tlet propValue = property[ 2 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\n\t\t// for special case: base64 image data follows \"Content: ,\" line\n\t\t//\tContent: ,\n\t\t//\t \"/9j/4RDaRXhpZgAATU0A...\"\n\t\tif ( propName === 'Content' && propValue === ',' ) {\n\n\t\t\tpropValue = contentLine.replace( /\"/g, '' ).replace( /,$/, '' ).trim();\n\n\t\t}\n\n\t\tconst currentNode = this.getCurrentNode();\n\t\tconst parentName = currentNode.name;\n\n\t\tif ( parentName === 'Properties70' ) {\n\n\t\t\tthis.parseNodeSpecialProperty( line, propName, propValue );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Connections\n\t\tif ( propName === 'C' ) {\n\n\t\t\tconst connProps = propValue.split( ',' ).slice( 1 );\n\t\t\tconst from = parseInt( connProps[ 0 ] );\n\t\t\tconst to = parseInt( connProps[ 1 ] );\n\n\t\t\tlet rest = propValue.split( ',' ).slice( 3 );\n\n\t\t\trest = rest.map( function ( elem ) {\n\n\t\t\t\treturn elem.trim().replace( /^\"/, '' );\n\n\t\t\t} );\n\n\t\t\tpropName = 'connections';\n\t\t\tpropValue = [ from, to ];\n\t\t\tappend( propValue, rest );\n\n\t\t\tif ( currentNode[ propName ] === undefined ) {\n\n\t\t\t\tcurrentNode[ propName ] = [];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Node\n\t\tif ( propName === 'Node' ) currentNode.id = propValue;\n\n\t\t// connections\n\t\tif ( propName in currentNode && Array.isArray( currentNode[ propName ] ) ) {\n\n\t\t\tcurrentNode[ propName ].push( propValue );\n\n\t\t} else {\n\n\t\t\tif ( propName !== 'a' ) currentNode[ propName ] = propValue;\n\t\t\telse currentNode.a = propValue;\n\n\t\t}\n\n\t\tthis.setCurrentProp( currentNode, propName );\n\n\t\t// convert string to array, unless it ends in ',' in which case more will be added to it\n\t\tif ( propName === 'a' && propValue.slice( - 1 ) !== ',' ) {\n\n\t\t\tcurrentNode.a = parseNumberArray( propValue );\n\n\t\t}\n\n\t}\n\n\tparseNodePropertyContinued( line ) {\n\n\t\tconst currentNode = this.getCurrentNode();\n\n\t\tcurrentNode.a += line;\n\n\t\t// if the line doesn't end in ',' we have reached the end of the property value\n\t\t// so convert the string to an array\n\t\tif ( line.slice( - 1 ) !== ',' ) {\n\n\t\t\tcurrentNode.a = parseNumberArray( currentNode.a );\n\n\t\t}\n\n\t}\n\n\t// parse \"Property70\"\n\tparseNodeSpecialProperty( line, propName, propValue ) {\n\n\t\t// split this\n\t\t// P: \"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\",1,1,1\n\t\t// into array like below\n\t\t// [\"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\", \"1,1,1\" ]\n\t\tconst props = propValue.split( '\",' ).map( function ( prop ) {\n\n\t\t\treturn prop.trim().replace( /^\\\"/, '' ).replace( /\\s/, '_' );\n\n\t\t} );\n\n\t\tconst innerPropName = props[ 0 ];\n\t\tconst innerPropType1 = props[ 1 ];\n\t\tconst innerPropType2 = props[ 2 ];\n\t\tconst innerPropFlag = props[ 3 ];\n\t\tlet innerPropValue = props[ 4 ];\n\n\t\t// cast values where needed, otherwise leave as strings\n\t\tswitch ( innerPropType1 ) {\n\n\t\t\tcase 'int':\n\t\t\tcase 'enum':\n\t\t\tcase 'bool':\n\t\t\tcase 'ULongLong':\n\t\t\tcase 'double':\n\t\t\tcase 'Number':\n\t\t\tcase 'FieldOfView':\n\t\t\t\tinnerPropValue = parseFloat( innerPropValue );\n\t\t\t\tbreak;\n\n\t\t\tcase 'Color':\n\t\t\tcase 'ColorRGB':\n\t\t\tcase 'Vector3D':\n\t\t\tcase 'Lcl_Translation':\n\t\t\tcase 'Lcl_Rotation':\n\t\t\tcase 'Lcl_Scaling':\n\t\t\t\tinnerPropValue = parseNumberArray( innerPropValue );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// CAUTION: these props must append to parent's parent\n\t\tthis.getPrevNode()[ innerPropName ] = {\n\n\t\t\t'type': innerPropType1,\n\t\t\t'type2': innerPropType2,\n\t\t\t'flag': innerPropFlag,\n\t\t\t'value': innerPropValue\n\n\t\t};\n\n\t\tthis.setCurrentProp( this.getPrevNode(), innerPropName );\n\n\t}\n\n}\n\n// Parse an FBX file in Binary format\nclass BinaryParser {\n\n\tparse( buffer ) {\n\n\t\tconst reader = new BinaryReader( buffer );\n\t\treader.skip( 23 ); // skip magic 23 bytes\n\n\t\tconst version = reader.getUint32();\n\n\t\tif ( version < 6400 ) {\n\n\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + version );\n\n\t\t}\n\n\t\tconst allNodes = new FBXTree();\n\n\t\twhile ( ! this.endOfContent( reader ) ) {\n\n\t\t\tconst node = this.parseNode( reader, version );\n\t\t\tif ( node !== null ) allNodes.add( node.name, node );\n\n\t\t}\n\n\t\treturn allNodes;\n\n\t}\n\n\t// Check if reader has reached the end of content.\n\tendOfContent( reader ) {\n\n\t\t// footer size: 160bytes + 16-byte alignment padding\n\t\t// - 16bytes: magic\n\t\t// - padding til 16-byte alignment (at least 1byte?)\n\t\t//\t(seems like some exporters embed fixed 15 or 16bytes?)\n\t\t// - 4bytes: magic\n\t\t// - 4bytes: version\n\t\t// - 120bytes: zero\n\t\t// - 16bytes: magic\n\t\tif ( reader.size() % 16 === 0 ) {\n\n\t\t\treturn ( ( reader.getOffset() + 160 + 16 ) & ~ 0xf ) >= reader.size();\n\n\t\t} else {\n\n\t\t\treturn reader.getOffset() + 160 + 16 >= reader.size();\n\n\t\t}\n\n\t}\n\n\t// recursively parse nodes until the end of the file is reached\n\tparseNode( reader, version ) {\n\n\t\tconst node = {};\n\n\t\t// The first three data sizes depends on version.\n\t\tconst endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\t\tconst numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\n\t\t( version >= 7500 ) ? reader.getUint64() : reader.getUint32(); // the returned propertyListLen is not used\n\n\t\tconst nameLen = reader.getUint8();\n\t\tconst name = reader.getString( nameLen );\n\n\t\t// Regards this node as NULL-record if endOffset is zero\n\t\tif ( endOffset === 0 ) return null;\n\n\t\tconst propertyList = [];\n\n\t\tfor ( let i = 0; i < numProperties; i ++ ) {\n\n\t\t\tpropertyList.push( this.parseProperty( reader ) );\n\n\t\t}\n\n\t\t// Regards the first three elements in propertyList as id, attrName, and attrType\n\t\tconst id = propertyList.length > 0 ? propertyList[ 0 ] : '';\n\t\tconst attrName = propertyList.length > 1 ? propertyList[ 1 ] : '';\n\t\tconst attrType = propertyList.length > 2 ? propertyList[ 2 ] : '';\n\n\t\t// check if this node represents just a single property\n\t\t// like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}\n\t\tnode.singleProperty = ( numProperties === 1 && reader.getOffset() === endOffset ) ? true : false;\n\n\t\twhile ( endOffset > reader.getOffset() ) {\n\n\t\t\tconst subNode = this.parseNode( reader, version );\n\n\t\t\tif ( subNode !== null ) this.parseSubNode( name, node, subNode );\n\n\t\t}\n\n\t\tnode.propertyList = propertyList; // raw property list used by parent\n\n\t\tif ( typeof id === 'number' ) node.id = id;\n\t\tif ( attrName !== '' ) node.attrName = attrName;\n\t\tif ( attrType !== '' ) node.attrType = attrType;\n\t\tif ( name !== '' ) node.name = name;\n\n\t\treturn node;\n\n\t}\n\n\tparseSubNode( name, node, subNode ) {\n\n\t\t// special case: child node is single property\n\t\tif ( subNode.singleProperty === true ) {\n\n\t\t\tconst value = subNode.propertyList[ 0 ];\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t\tsubNode.a = value;\n\n\t\t\t} else {\n\n\t\t\t\tnode[ subNode.name ] = value;\n\n\t\t\t}\n\n\t\t} else if ( name === 'Connections' && subNode.name === 'C' ) {\n\n\t\t\tconst array = [];\n\n\t\t\tsubNode.propertyList.forEach( function ( property, i ) {\n\n\t\t\t\t// first Connection is FBX type (OO, OP, etc.). We'll discard these\n\t\t\t\tif ( i !== 0 ) array.push( property );\n\n\t\t\t} );\n\n\t\t\tif ( node.connections === undefined ) {\n\n\t\t\t\tnode.connections = [];\n\n\t\t\t}\n\n\t\t\tnode.connections.push( array );\n\n\t\t} else if ( subNode.name === 'Properties70' ) {\n\n\t\t\tconst keys = Object.keys( subNode );\n\n\t\t\tkeys.forEach( function ( key ) {\n\n\t\t\t\tnode[ key ] = subNode[ key ];\n\n\t\t\t} );\n\n\t\t} else if ( name === 'Properties70' && subNode.name === 'P' ) {\n\n\t\t\tlet innerPropName = subNode.propertyList[ 0 ];\n\t\t\tlet innerPropType1 = subNode.propertyList[ 1 ];\n\t\t\tconst innerPropType2 = subNode.propertyList[ 2 ];\n\t\t\tconst innerPropFlag = subNode.propertyList[ 3 ];\n\t\t\tlet innerPropValue;\n\n\t\t\tif ( innerPropName.indexOf( 'Lcl ' ) === 0 ) innerPropName = innerPropName.replace( 'Lcl ', 'Lcl_' );\n\t\t\tif ( innerPropType1.indexOf( 'Lcl ' ) === 0 ) innerPropType1 = innerPropType1.replace( 'Lcl ', 'Lcl_' );\n\n\t\t\tif ( innerPropType1 === 'Color' || innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' || innerPropType1 === 'Vector3D' || innerPropType1.indexOf( 'Lcl_' ) === 0 ) {\n\n\t\t\t\tinnerPropValue = [\n\t\t\t\t\tsubNode.propertyList[ 4 ],\n\t\t\t\t\tsubNode.propertyList[ 5 ],\n\t\t\t\t\tsubNode.propertyList[ 6 ]\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tinnerPropValue = subNode.propertyList[ 4 ];\n\n\t\t\t}\n\n\t\t\t// this will be copied to parent, see above\n\t\t\tnode[ innerPropName ] = {\n\n\t\t\t\t'type': innerPropType1,\n\t\t\t\t'type2': innerPropType2,\n\t\t\t\t'flag': innerPropFlag,\n\t\t\t\t'value': innerPropValue\n\n\t\t\t};\n\n\t\t} else if ( node[ subNode.name ] === undefined ) {\n\n\t\t\tif ( typeof subNode.id === 'number' ) {\n\n\t\t\t\tnode[ subNode.name ] = {};\n\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t} else {\n\n\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( subNode.name === 'PoseNode' ) {\n\n\t\t\t\tif ( ! Array.isArray( node[ subNode.name ] ) ) {\n\n\t\t\t\t\tnode[ subNode.name ] = [ node[ subNode.name ] ];\n\n\t\t\t\t}\n\n\t\t\t\tnode[ subNode.name ].push( subNode );\n\n\t\t\t} else if ( node[ subNode.name ][ subNode.id ] === undefined ) {\n\n\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tparseProperty( reader ) {\n\n\t\tconst type = reader.getString( 1 );\n\t\tlet length;\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 'C':\n\t\t\t\treturn reader.getBoolean();\n\n\t\t\tcase 'D':\n\t\t\t\treturn reader.getFloat64();\n\n\t\t\tcase 'F':\n\t\t\t\treturn reader.getFloat32();\n\n\t\t\tcase 'I':\n\t\t\t\treturn reader.getInt32();\n\n\t\t\tcase 'L':\n\t\t\t\treturn reader.getInt64();\n\n\t\t\tcase 'R':\n\t\t\t\tlength = reader.getUint32();\n\t\t\t\treturn reader.getArrayBuffer( length );\n\n\t\t\tcase 'S':\n\t\t\t\tlength = reader.getUint32();\n\t\t\t\treturn reader.getString( length );\n\n\t\t\tcase 'Y':\n\t\t\t\treturn reader.getInt16();\n\n\t\t\tcase 'b':\n\t\t\tcase 'c':\n\t\t\tcase 'd':\n\t\t\tcase 'f':\n\t\t\tcase 'i':\n\t\t\tcase 'l':\n\n\t\t\t\tconst arrayLength = reader.getUint32();\n\t\t\t\tconst encoding = reader.getUint32(); // 0: non-compressed, 1: compressed\n\t\t\t\tconst compressedLength = reader.getUint32();\n\n\t\t\t\tif ( encoding === 0 ) {\n\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'c':\n\t\t\t\t\t\t\treturn reader.getBooleanArray( arrayLength );\n\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\treturn reader.getFloat64Array( arrayLength );\n\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\t\treturn reader.getFloat32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'i':\n\t\t\t\t\t\t\treturn reader.getInt32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'l':\n\t\t\t\t\t\t\treturn reader.getInt64Array( arrayLength );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst data = fflate.unzlibSync( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );\n\t\t\t\tconst reader2 = new BinaryReader( data.buffer );\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'b':\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\treturn reader2.getBooleanArray( arrayLength );\n\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\treturn reader2.getFloat64Array( arrayLength );\n\n\t\t\t\t\tcase 'f':\n\t\t\t\t\t\treturn reader2.getFloat32Array( arrayLength );\n\n\t\t\t\t\tcase 'i':\n\t\t\t\t\t\treturn reader2.getInt32Array( arrayLength );\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\treturn reader2.getInt64Array( arrayLength );\n\n\t\t\t\t}\n\n\t\t\t\tbreak; // cannot happen but is required by the DeepScan\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown property type ' + type );\n\n\t\t}\n\n\t}\n\n}\n\nclass BinaryReader {\n\n\tconstructor( buffer, littleEndian ) {\n\n\t\tthis.dv = new DataView( buffer );\n\t\tthis.offset = 0;\n\t\tthis.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;\n\t\tthis._textDecoder = new TextDecoder();\n\n\t}\n\n\tgetOffset() {\n\n\t\treturn this.offset;\n\n\t}\n\n\tsize() {\n\n\t\treturn this.dv.buffer.byteLength;\n\n\t}\n\n\tskip( length ) {\n\n\t\tthis.offset += length;\n\n\t}\n\n\t// seems like true/false representation depends on exporter.\n\t// true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54)\n\t// then sees LSB.\n\tgetBoolean() {\n\n\t\treturn ( this.getUint8() & 1 ) === 1;\n\n\t}\n\n\tgetBooleanArray( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getBoolean() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetUint8() {\n\n\t\tconst value = this.dv.getUint8( this.offset );\n\t\tthis.offset += 1;\n\t\treturn value;\n\n\t}\n\n\tgetInt16() {\n\n\t\tconst value = this.dv.getInt16( this.offset, this.littleEndian );\n\t\tthis.offset += 2;\n\t\treturn value;\n\n\t}\n\n\tgetInt32() {\n\n\t\tconst value = this.dv.getInt32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\tgetInt32Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetUint32() {\n\n\t\tconst value = this.dv.getUint32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\t// JavaScript doesn't support 64-bit integer so calculate this here\n\t// 1 << 32 will return 1 so using multiply operation instead here.\n\t// There's a possibility that this method returns wrong value if the value\n\t// is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.\n\t// TODO: safely handle 64-bit integer\n\tgetInt64() {\n\n\t\tlet low, high;\n\n\t\tif ( this.littleEndian ) {\n\n\t\t\tlow = this.getUint32();\n\t\t\thigh = this.getUint32();\n\n\t\t} else {\n\n\t\t\thigh = this.getUint32();\n\t\t\tlow = this.getUint32();\n\n\t\t}\n\n\t\t// calculate negative value\n\t\tif ( high & 0x80000000 ) {\n\n\t\t\thigh = ~ high & 0xFFFFFFFF;\n\t\t\tlow = ~ low & 0xFFFFFFFF;\n\n\t\t\tif ( low === 0xFFFFFFFF ) high = ( high + 1 ) & 0xFFFFFFFF;\n\n\t\t\tlow = ( low + 1 ) & 0xFFFFFFFF;\n\n\t\t\treturn - ( high * 0x100000000 + low );\n\n\t\t}\n\n\t\treturn high * 0x100000000 + low;\n\n\t}\n\n\tgetInt64Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\t// Note: see getInt64() comment\n\tgetUint64() {\n\n\t\tlet low, high;\n\n\t\tif ( this.littleEndian ) {\n\n\t\t\tlow = this.getUint32();\n\t\t\thigh = this.getUint32();\n\n\t\t} else {\n\n\t\t\thigh = this.getUint32();\n\t\t\tlow = this.getUint32();\n\n\t\t}\n\n\t\treturn high * 0x100000000 + low;\n\n\t}\n\n\tgetFloat32() {\n\n\t\tconst value = this.dv.getFloat32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\tgetFloat32Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetFloat64() {\n\n\t\tconst value = this.dv.getFloat64( this.offset, this.littleEndian );\n\t\tthis.offset += 8;\n\t\treturn value;\n\n\t}\n\n\tgetFloat64Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetArrayBuffer( size ) {\n\n\t\tconst value = this.dv.buffer.slice( this.offset, this.offset + size );\n\t\tthis.offset += size;\n\t\treturn value;\n\n\t}\n\n\tgetString( size ) {\n\n\t\tconst start = this.offset;\n\t\tlet a = new Uint8Array( this.dv.buffer, start, size );\n\n\t\tthis.skip( size );\n\n\t\tconst nullByte = a.indexOf( 0 );\n\t\tif ( nullByte >= 0 ) a = new Uint8Array( this.dv.buffer, start, nullByte );\n\n\t\treturn this._textDecoder.decode( a );\n\n\t}\n\n}\n\n// FBXTree holds a representation of the FBX data, returned by the TextParser ( FBX ASCII format)\n// and BinaryParser( FBX Binary format)\nclass FBXTree {\n\n\tadd( key, val ) {\n\n\t\tthis[ key ] = val;\n\n\t}\n\n}\n\n// ************** UTILITY FUNCTIONS **************\n\nfunction isFbxFormatBinary( buffer ) {\n\n\tconst CORRECT = 'Kaydara\\u0020FBX\\u0020Binary\\u0020\\u0020\\0';\n\n\treturn buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString( buffer, 0, CORRECT.length );\n\n}\n\nfunction isFbxFormatASCII( text ) {\n\n\tconst CORRECT = [ 'K', 'a', 'y', 'd', 'a', 'r', 'a', '\\\\', 'F', 'B', 'X', '\\\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\\\', '\\\\' ];\n\n\tlet cursor = 0;\n\n\tfunction read( offset ) {\n\n\t\tconst result = text[ offset - 1 ];\n\t\ttext = text.slice( cursor + offset );\n\t\tcursor ++;\n\t\treturn result;\n\n\t}\n\n\tfor ( let i = 0; i < CORRECT.length; ++ i ) {\n\n\t\tconst num = read( 1 );\n\t\tif ( num === CORRECT[ i ] ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nfunction getFbxVersion( text ) {\n\n\tconst versionRegExp = /FBXVersion: (\\d+)/;\n\tconst match = text.match( versionRegExp );\n\n\tif ( match ) {\n\n\t\tconst version = parseInt( match[ 1 ] );\n\t\treturn version;\n\n\t}\n\n\tthrow new Error( 'THREE.FBXLoader: Cannot find the version number for the file given.' );\n\n}\n\n// Converts FBX ticks into real time seconds.\nfunction convertFBXTimeToSeconds( time ) {\n\n\treturn time / 46186158000;\n\n}\n\nconst dataArray = [];\n\n// extracts the data from the correct position in the FBX array based on indexing type\nfunction getData( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {\n\n\tlet index;\n\n\tswitch ( infoObject.mappingType ) {\n\n\t\tcase 'ByPolygonVertex' :\n\t\t\tindex = polygonVertexIndex;\n\t\t\tbreak;\n\t\tcase 'ByPolygon' :\n\t\t\tindex = polygonIndex;\n\t\t\tbreak;\n\t\tcase 'ByVertice' :\n\t\t\tindex = vertexIndex;\n\t\t\tbreak;\n\t\tcase 'AllSame' :\n\t\t\tindex = infoObject.indices[ 0 ];\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tconsole.warn( 'THREE.FBXLoader: unknown attribute mapping type ' + infoObject.mappingType );\n\n\t}\n\n\tif ( infoObject.referenceType === 'IndexToDirect' ) index = infoObject.indices[ index ];\n\n\tconst from = index * infoObject.dataSize;\n\tconst to = from + infoObject.dataSize;\n\n\treturn slice( dataArray, infoObject.buffer, from, to );\n\n}\n\nconst tempEuler = new Euler();\nconst tempVec = new Vector3();\n\n// generate transformation from FBX transform data\n// ref: https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_10CDD63C_79C1_4F2D_BB28_AD2BE65A02ED_htm\n// ref: http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=cpp_ref/_transformations_2main_8cxx-example.html,topicNumber=cpp_ref__transformations_2main_8cxx_example_htmlfc10a1e1-b18d-4e72-9dc0-70d0f1959f5e\nfunction generateTransform( transformData ) {\n\n\tconst lTranslationM = new Matrix4();\n\tconst lPreRotationM = new Matrix4();\n\tconst lRotationM = new Matrix4();\n\tconst lPostRotationM = new Matrix4();\n\n\tconst lScalingM = new Matrix4();\n\tconst lScalingPivotM = new Matrix4();\n\tconst lScalingOffsetM = new Matrix4();\n\tconst lRotationOffsetM = new Matrix4();\n\tconst lRotationPivotM = new Matrix4();\n\n\tconst lParentGX = new Matrix4();\n\tconst lParentLX = new Matrix4();\n\tconst lGlobalT = new Matrix4();\n\n\tconst inheritType = ( transformData.inheritType ) ? transformData.inheritType : 0;\n\n\tif ( transformData.translation ) lTranslationM.setPosition( tempVec.fromArray( transformData.translation ) );\n\n\tif ( transformData.preRotation ) {\n\n\t\tconst array = transformData.preRotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || Euler.DEFAULT_ORDER );\n\t\tlPreRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t}\n\n\tif ( transformData.rotation ) {\n\n\t\tconst array = transformData.rotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || Euler.DEFAULT_ORDER );\n\t\tlRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t}\n\n\tif ( transformData.postRotation ) {\n\n\t\tconst array = transformData.postRotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || Euler.DEFAULT_ORDER );\n\t\tlPostRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\t\tlPostRotationM.invert();\n\n\t}\n\n\tif ( transformData.scale ) lScalingM.scale( tempVec.fromArray( transformData.scale ) );\n\n\t// Pivots and offsets\n\tif ( transformData.scalingOffset ) lScalingOffsetM.setPosition( tempVec.fromArray( transformData.scalingOffset ) );\n\tif ( transformData.scalingPivot ) lScalingPivotM.setPosition( tempVec.fromArray( transformData.scalingPivot ) );\n\tif ( transformData.rotationOffset ) lRotationOffsetM.setPosition( tempVec.fromArray( transformData.rotationOffset ) );\n\tif ( transformData.rotationPivot ) lRotationPivotM.setPosition( tempVec.fromArray( transformData.rotationPivot ) );\n\n\t// parent transform\n\tif ( transformData.parentMatrixWorld ) {\n\n\t\tlParentLX.copy( transformData.parentMatrix );\n\t\tlParentGX.copy( transformData.parentMatrixWorld );\n\n\t}\n\n\tconst lLRM = lPreRotationM.clone().multiply( lRotationM ).multiply( lPostRotationM );\n\t// Global Rotation\n\tconst lParentGRM = new Matrix4();\n\tlParentGRM.extractRotation( lParentGX );\n\n\t// Global Shear*Scaling\n\tconst lParentTM = new Matrix4();\n\tlParentTM.copyPosition( lParentGX );\n\n\tconst lParentGRSM = lParentTM.clone().invert().multiply( lParentGX );\n\tconst lParentGSM = lParentGRM.clone().invert().multiply( lParentGRSM );\n\tconst lLSM = lScalingM;\n\n\tconst lGlobalRS = new Matrix4();\n\n\tif ( inheritType === 0 ) {\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM ).multiply( lLSM );\n\n\t} else if ( inheritType === 1 ) {\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lParentGSM ).multiply( lLRM ).multiply( lLSM );\n\n\t} else {\n\n\t\tconst lParentLSM = new Matrix4().scale( new Vector3().setFromMatrixScale( lParentLX ) );\n\t\tconst lParentLSM_inv = lParentLSM.clone().invert();\n\t\tconst lParentGSM_noLocal = lParentGSM.clone().multiply( lParentLSM_inv );\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM_noLocal ).multiply( lLSM );\n\n\t}\n\n\tconst lRotationPivotM_inv = lRotationPivotM.clone().invert();\n\tconst lScalingPivotM_inv = lScalingPivotM.clone().invert();\n\t// Calculate the local transform matrix\n\tlet lTransform = lTranslationM.clone().multiply( lRotationOffsetM ).multiply( lRotationPivotM ).multiply( lPreRotationM ).multiply( lRotationM ).multiply( lPostRotationM ).multiply( lRotationPivotM_inv ).multiply( lScalingOffsetM ).multiply( lScalingPivotM ).multiply( lScalingM ).multiply( lScalingPivotM_inv );\n\n\tconst lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition( lTransform );\n\n\tconst lGlobalTranslation = lParentGX.clone().multiply( lLocalTWithAllPivotAndOffsetInfo );\n\tlGlobalT.copyPosition( lGlobalTranslation );\n\n\tlTransform = lGlobalT.clone().multiply( lGlobalRS );\n\n\t// from global to local\n\tlTransform.premultiply( lParentGX.invert() );\n\n\treturn lTransform;\n\n}\n\n// Returns the three.js intrinsic Euler order corresponding to FBX extrinsic Euler order\n// ref: http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_euler_html\nfunction getEulerOrder( order ) {\n\n\torder = order || 0;\n\n\tconst enums = [\n\t\t'ZYX', // -> XYZ extrinsic\n\t\t'YZX', // -> XZY extrinsic\n\t\t'XZY', // -> YZX extrinsic\n\t\t'ZXY', // -> YXZ extrinsic\n\t\t'YXZ', // -> ZXY extrinsic\n\t\t'XYZ', // -> ZYX extrinsic\n\t\t//'SphericXYZ', // not possible to support\n\t];\n\n\tif ( order === 6 ) {\n\n\t\tconsole.warn( 'THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.' );\n\t\treturn enums[ 0 ];\n\n\t}\n\n\treturn enums[ order ];\n\n}\n\n// Parses comma separated list of numbers and returns them an array.\n// Used internally by the TextParser\nfunction parseNumberArray( value ) {\n\n\tconst array = value.split( ',' ).map( function ( val ) {\n\n\t\treturn parseFloat( val );\n\n\t} );\n\n\treturn array;\n\n}\n\nfunction convertArrayBufferToString( buffer, from, to ) {\n\n\tif ( from === undefined ) from = 0;\n\tif ( to === undefined ) to = buffer.byteLength;\n\n\treturn new TextDecoder().decode( new Uint8Array( buffer, from, to ) );\n\n}\n\nfunction append( a, b ) {\n\n\tfor ( let i = 0, j = a.length, l = b.length; i < l; i ++, j ++ ) {\n\n\t\ta[ j ] = b[ i ];\n\n\t}\n\n}\n\nfunction slice( a, b, from, to ) {\n\n\tfor ( let i = from, j = 0; i < to; i ++, j ++ ) {\n\n\t\ta[ j ] = b[ i ];\n\n\t}\n\n\treturn a;\n\n}\n\n\nexport { FBXLoader };\n","import {Group} from 'three';\nimport {FBXLoader} from 'three/examples/jsm/loaders/FBXLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nexport class FBXLoaderHandler extends BaseObject3DLoaderHandler<Group> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<Group>> {\n\t\treturn (this._loader = this._loader || (await new FBXLoader(this.loadingManager)));\n\t}\n}\n","import {Group} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {FBXLoaderHandler} from '../../../core/loader/geometry/FBX';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileFBXSopOperation extends BaseFileSopOperation<Group> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/stanford-bunny.fbx`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_FBX> {\n\t\treturn SopTypeFile.FILE_FBX;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new FBXLoaderHandler(params.url, this._node);\n\t}\n}\n","import {\n\tLoadingManager,\n\tFileLoader,\n\tLoader,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tGroup,\n\tShape,\n\tVector2,\n\tObject3D,\n} from 'three';\nimport type {OnSuccess, OnProgress, OnError} from '../Common';\nimport {\n\t// GeoJsonGeometryTypes,\n\t// GeoJsonTypes,\n\t// BBox,\n\t// Position,\n\t// GeoJsonObject,\n\tGeoJSON,\n\tGeometry,\n\tPoint,\n\t// MultiPoint,\n\tLineString,\n\t// MultiLineString,\n\tPolygon,\n\tMultiPolygon,\n\t// GeometryCollection,\n\tGeoJsonProperties,\n\tFeature,\n\t// FeatureCollection,\n} from 'geojson';\nimport {BaseSopOperation} from '../../../../engine/operations/sop/_Base';\nimport {ObjectType} from '../../../geometry/Constant';\nimport {createGeometriesFromTypeFlat} from '../../../geometry/text/TextFlat';\nimport {arrayCompact} from '../../../ArrayUtils';\nimport {isArray} from '../../../Type';\nimport {ThreejsCoreObject} from '../../../geometry/modules/three/ThreejsCoreObject';\n\nexport class GEOJSONLoader extends Loader<Group> {\n\tconstructor(manager: LoadingManager) {\n\t\tsuper(manager);\n\t}\n\n\toverride load(url: string, onLoad: OnSuccess<Group>, onProgress?: OnProgress, onError?: OnError) {\n\t\tconst scope = this;\n\n\t\t// const path = scope.path === '' ? LoaderUtils.extractUrlBase(url) : scope.path;\n\n\t\tconst loader = new FileLoader(this.manager);\n\t\tloader.setPath(scope.path);\n\t\tloader.setResponseType('json');\n\t\tloader.setRequestHeader(scope.requestHeader);\n\t\tloader.setWithCredentials(scope.withCredentials);\n\n\t\tloader.load(\n\t\t\turl,\n\t\t\t(buffer) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst json = buffer as any as GeoJSON;\n\t\t\t\t\tonLoad(this.parse(json));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (onError) {\n\t\t\t\t\t\tonError(e);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemError(url);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonProgress,\n\t\t\tonError\n\t\t);\n\t}\n\n\tprivate parse(data: GeoJSON): Group {\n\t\tconst group = new Group();\n\t\tthis._parseGeojson(group, data);\n\t\treturn group;\n\t}\n\tprivate _parseGeojson(group: Group, data: GeoJSON) {\n\t\tconst type = data.type;\n\t\tswitch (type) {\n\t\t\t// case 'Point': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'MultiPoint': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'LineString': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'MultiLineString': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'Polygon': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'MultiPolygon': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'GeometryCollection': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\t// case 'Feature': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\tcase 'FeatureCollection': {\n\t\t\t\treturn this._parseFeatureCollection(group, data.features);\n\t\t\t}\n\t\t}\n\t\tconsole.warn(`_parseGeojson:${type} not implemented`);\n\t}\n\n\tprivate _parseFeatureCollection(group: Group, features: Array<Feature<Geometry, GeoJsonProperties>>) {\n\t\tfor (const feature of features) {\n\t\t\tconst objects = this._parseFeature(feature);\n\t\t\tif (objects) {\n\t\t\t\tif (isArray(objects)) {\n\t\t\t\t\tfor (const object of objects) {\n\t\t\t\t\t\tthis._addAttributes(object, feature);\n\t\t\t\t\t\tgroup.add(object);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._addAttributes(objects, feature);\n\t\t\t\t\tgroup.add(objects);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _addAttributes(object: Object3D, feature: Feature<Geometry, GeoJsonProperties>) {\n\t\tif (!feature.properties) {\n\t\t\treturn;\n\t\t}\n\t\tconst propertyNames = Object.keys(feature.properties);\n\t\tfor (let propertyName of propertyNames) {\n\t\t\tconst value = feature.properties[propertyName];\n\t\t\tThreejsCoreObject.addAttribute(object, propertyName, value);\n\t\t}\n\t}\n\n\tprivate _parseFeature(feature: Feature<Geometry, GeoJsonProperties>) {\n\t\tconst geometry = feature.geometry;\n\t\tconst type = geometry.type;\n\t\tswitch (type) {\n\t\t\tcase 'Point': {\n\t\t\t\treturn this._parseFeaturePoint(feature as Feature<Point, GeoJsonProperties>);\n\t\t\t}\n\t\t\t// case 'MultiPoint': {\n\t\t\t// \tconsole.warn('MultiPoint not implemented')\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\tcase 'LineString': {\n\t\t\t\treturn this._parseFeatureLineString(feature as Feature<LineString, GeoJsonProperties>);\n\t\t\t}\n\t\t\t// case 'MultiLineString': {\n\t\t\t// \tconsole.warn('MultiPoint not implemented')\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\tcase 'Polygon': {\n\t\t\t\treturn this._parseFeaturePolygon(feature as Feature<Polygon, GeoJsonProperties>);\n\t\t\t}\n\t\t\tcase 'MultiPolygon': {\n\t\t\t\treturn this._parseFeatureMultiPolygon(feature as Feature<MultiPolygon, GeoJsonProperties>);\n\t\t\t}\n\t\t\t// case 'GeometryCollection': {\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t}\n\t\tconsole.warn(`_parseFeature:${type} not implemented`);\n\t}\n\tprivate _parseFeaturePoint(feature: Feature<Point, GeoJsonProperties>) {\n\t\tconst coordinates = feature.geometry.coordinates;\n\t\tconst pointsCount = 1;\n\n\t\tconst positions: number[] = new Array(pointsCount * 3);\n\t\tconst indices: number[] = new Array(pointsCount);\n\t\t// for (let i = 0; i < pointsCount; i++) {\n\t\tconst i = 0;\n\t\tpositions[i * 3] = coordinates[0];\n\t\tpositions[i * 3 + 1] = 0;\n\t\tpositions[i * 3 + 2] = coordinates[1];\n\n\t\tindices[0] = 0;\n\n\t\t// if (i > 0) {\n\t\t// \tindices[(i - 1) * 2] = i - 1;\n\t\t// \tindices[(i - 1) * 2 + 1] = i;\n\t\t// }\n\t\t// }\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\t\tgeometry.setIndex(indices);\n\t\treturn BaseSopOperation.createObject(geometry, ObjectType.POINTS);\n\t}\n\tprivate _parseFeatureLineString(feature: Feature<LineString, GeoJsonProperties>) {\n\t\tconst coordinates = feature.geometry.coordinates;\n\t\tconst pointsCount = coordinates.length;\n\n\t\tconst positions: number[] = new Array(pointsCount * 3);\n\t\tconst indices: number[] = new Array(pointsCount);\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\tpositions[i * 3] = coordinates[i][0];\n\t\t\tpositions[i * 3 + 1] = 0;\n\t\t\tpositions[i * 3 + 2] = coordinates[i][1];\n\n\t\t\tif (i > 0) {\n\t\t\t\tindices[(i - 1) * 2] = i - 1;\n\t\t\t\tindices[(i - 1) * 2 + 1] = i;\n\t\t\t}\n\t\t}\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\n\t\tgeometry.setIndex(indices);\n\t\treturn BaseSopOperation.createObject(geometry, ObjectType.LINE_SEGMENTS);\n\t}\n\tprivate _parseFeaturePolygon(feature: Feature<Polygon, GeoJsonProperties>) {\n\t\tconst coordinates = feature.geometry.coordinates;\n\t\t// const pointsCount = coordinates.length;\n\t\tconst shapes = coordinates.map((coordinate) => new Shape(coordinate.map((c) => new Vector2(c[0], c[1]))));\n\n\t\tconst geometries = createGeometriesFromTypeFlat({shapes: [shapes]});\n\t\tif (!geometries) {\n\t\t\treturn;\n\t\t}\n\t\tconst compactGeometries: BufferGeometry[] = [];\n\t\tarrayCompact(geometries, compactGeometries);\n\t\treturn compactGeometries.map((geometry) =>\n\t\t\tBaseSopOperation.createObject(geometry.rotateX(-0.5 * Math.PI), ObjectType.MESH)\n\t\t);\n\t}\n\tprivate _parseFeatureMultiPolygon(feature: Feature<MultiPolygon, GeoJsonProperties>) {\n\t\tconst coordinates = feature.geometry.coordinates;\n\t\t// const pointsCount = coordinates.length;\n\t\tconst shapes = coordinates.map((coordinate) =>\n\t\t\tcoordinate.map((c) => new Shape(c.map((c2) => new Vector2(c2[0], c2[1]))))\n\t\t);\n\n\t\tconst geometries = createGeometriesFromTypeFlat({shapes});\n\t\tif (!geometries) {\n\t\t\treturn;\n\t\t}\n\t\tconst compactGeometries: BufferGeometry[] = [];\n\t\tarrayCompact(geometries, compactGeometries);\n\t\treturn compactGeometries.map((geometry) =>\n\t\t\tBaseSopOperation.createObject(geometry.rotateX(-0.5 * Math.PI), ObjectType.MESH)\n\t\t);\n\t}\n}\n","import {Group} from 'three';\nimport {GEOJSONLoader} from './loaders/GEOJSONLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nexport class GEOJSONLoaderHandler extends BaseObject3DLoaderHandler<Group> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<Group>> {\n\t\treturn (this._loader = this._loader || (await new GEOJSONLoader(this.loadingManager)));\n\t}\n}\n","import {Group} from 'three';\nimport {GEOJSONLoaderHandler} from '../../../core/loader/geometry/GEOJSON';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileGEOJSONSopOperation extends BaseFileSopOperation<Group> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: ``,\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_GEOJSON> {\n\t\treturn SopTypeFile.FILE_GEOJSON;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new GEOJSONLoaderHandler(params.url, this._node);\n\t}\n}\n","import {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {GLTFLoaderHandler} from '../../../core/loader/geometry/GLTF';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\nimport {GLTF} from 'three/examples/jsm/loaders/GLTFLoader';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\ninterface FileGLTFSopParams extends DefaultOperationParams {\n\turl: string;\n\tdraco: boolean;\n\tktx2: boolean;\n\tmatrixAutoUpdate: boolean;\n}\n\nexport class FileGLTFSopOperation extends BaseFileSopOperation<GLTF> {\n\tstatic override readonly DEFAULT_PARAMS: FileGLTFSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/resources/threedscans.com/eagle.glb`),\n\t\tdraco: true,\n\t\tktx2: false,\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_GLTF> {\n\t\treturn SopTypeFile.FILE_GLTF;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new GLTFLoaderHandler(params.url, this._node);\n\t}\n\tprotected override async _load(loader: GLTFLoaderHandler, params: FileGLTFSopParams) {\n\t\tif (this._node) {\n\t\t\treturn await loader.load({\n\t\t\t\tdraco: params.draco,\n\t\t\t\tktx2: params.ktx2,\n\t\t\t\tnode: this._node,\n\t\t\t});\n\t\t}\n\t}\n}\n","import * as MathUtils from './MathUtils.js';\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// sets this quaternion to a uniform random unit quaternnion\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nexport { Quaternion };\n","import * as MathUtils from './MathUtils.js';\nimport { Quaternion } from './Quaternion.js';\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nexport { Vector3 };\n","import * as MathUtils from './MathUtils.js';\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tVector2.prototype.isVector2 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nexport { Vector2 };\n","import { Vector3 } from './Vector3.js';\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox3 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors( triangle.a, _center );\n\t\t_v1.subVectors( triangle.b, _center );\n\t\t_v2.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1, _v0 );\n\t\t_f1.subVectors( _v2, _v1 );\n\t\t_f2.subVectors( _v0, _v2 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0, _v1, _v2, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector ).distanceTo( point );\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector = /*@__PURE__*/ new Vector3();\n\nconst _box = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nexport { Box3 };\n","/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { EventDispatcher };\n","export const REVISION = '167';\n\nexport const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nexport const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nexport const CullFaceNone = 0;\nexport const CullFaceBack = 1;\nexport const CullFaceFront = 2;\nexport const CullFaceFrontBack = 3;\nexport const BasicShadowMap = 0;\nexport const PCFShadowMap = 1;\nexport const PCFSoftShadowMap = 2;\nexport const VSMShadowMap = 3;\nexport const FrontSide = 0;\nexport const BackSide = 1;\nexport const DoubleSide = 2;\nexport const NoBlending = 0;\nexport const NormalBlending = 1;\nexport const AdditiveBlending = 2;\nexport const SubtractiveBlending = 3;\nexport const MultiplyBlending = 4;\nexport const CustomBlending = 5;\nexport const AddEquation = 100;\nexport const SubtractEquation = 101;\nexport const ReverseSubtractEquation = 102;\nexport const MinEquation = 103;\nexport const MaxEquation = 104;\nexport const ZeroFactor = 200;\nexport const OneFactor = 201;\nexport const SrcColorFactor = 202;\nexport const OneMinusSrcColorFactor = 203;\nexport const SrcAlphaFactor = 204;\nexport const OneMinusSrcAlphaFactor = 205;\nexport const DstAlphaFactor = 206;\nexport const OneMinusDstAlphaFactor = 207;\nexport const DstColorFactor = 208;\nexport const OneMinusDstColorFactor = 209;\nexport const SrcAlphaSaturateFactor = 210;\nexport const ConstantColorFactor = 211;\nexport const OneMinusConstantColorFactor = 212;\nexport const ConstantAlphaFactor = 213;\nexport const OneMinusConstantAlphaFactor = 214;\nexport const NeverDepth = 0;\nexport const AlwaysDepth = 1;\nexport const LessDepth = 2;\nexport const LessEqualDepth = 3;\nexport const EqualDepth = 4;\nexport const GreaterEqualDepth = 5;\nexport const GreaterDepth = 6;\nexport const NotEqualDepth = 7;\nexport const MultiplyOperation = 0;\nexport const MixOperation = 1;\nexport const AddOperation = 2;\nexport const NoToneMapping = 0;\nexport const LinearToneMapping = 1;\nexport const ReinhardToneMapping = 2;\nexport const CineonToneMapping = 3;\nexport const ACESFilmicToneMapping = 4;\nexport const CustomToneMapping = 5;\nexport const AgXToneMapping = 6;\nexport const NeutralToneMapping = 7;\nexport const AttachedBindMode = 'attached';\nexport const DetachedBindMode = 'detached';\n\nexport const UVMapping = 300;\nexport const CubeReflectionMapping = 301;\nexport const CubeRefractionMapping = 302;\nexport const EquirectangularReflectionMapping = 303;\nexport const EquirectangularRefractionMapping = 304;\nexport const CubeUVReflectionMapping = 306;\nexport const RepeatWrapping = 1000;\nexport const ClampToEdgeWrapping = 1001;\nexport const MirroredRepeatWrapping = 1002;\nexport const NearestFilter = 1003;\nexport const NearestMipmapNearestFilter = 1004;\nexport const NearestMipMapNearestFilter = 1004;\nexport const NearestMipmapLinearFilter = 1005;\nexport const NearestMipMapLinearFilter = 1005;\nexport const LinearFilter = 1006;\nexport const LinearMipmapNearestFilter = 1007;\nexport const LinearMipMapNearestFilter = 1007;\nexport const LinearMipmapLinearFilter = 1008;\nexport const LinearMipMapLinearFilter = 1008;\nexport const UnsignedByteType = 1009;\nexport const ByteType = 1010;\nexport const ShortType = 1011;\nexport const UnsignedShortType = 1012;\nexport const IntType = 1013;\nexport const UnsignedIntType = 1014;\nexport const FloatType = 1015;\nexport const HalfFloatType = 1016;\nexport const UnsignedShort4444Type = 1017;\nexport const UnsignedShort5551Type = 1018;\nexport const UnsignedInt248Type = 1020;\nexport const UnsignedInt5999Type = 35902;\nexport const AlphaFormat = 1021;\nexport const RGBFormat = 1022;\nexport const RGBAFormat = 1023;\nexport const LuminanceFormat = 1024;\nexport const LuminanceAlphaFormat = 1025;\nexport const DepthFormat = 1026;\nexport const DepthStencilFormat = 1027;\nexport const RedFormat = 1028;\nexport const RedIntegerFormat = 1029;\nexport const RGFormat = 1030;\nexport const RGIntegerFormat = 1031;\nexport const RGBIntegerFormat = 1032;\nexport const RGBAIntegerFormat = 1033;\n\nexport const RGB_S3TC_DXT1_Format = 33776;\nexport const RGBA_S3TC_DXT1_Format = 33777;\nexport const RGBA_S3TC_DXT3_Format = 33778;\nexport const RGBA_S3TC_DXT5_Format = 33779;\nexport const RGB_PVRTC_4BPPV1_Format = 35840;\nexport const RGB_PVRTC_2BPPV1_Format = 35841;\nexport const RGBA_PVRTC_4BPPV1_Format = 35842;\nexport const RGBA_PVRTC_2BPPV1_Format = 35843;\nexport const RGB_ETC1_Format = 36196;\nexport const RGB_ETC2_Format = 37492;\nexport const RGBA_ETC2_EAC_Format = 37496;\nexport const RGBA_ASTC_4x4_Format = 37808;\nexport const RGBA_ASTC_5x4_Format = 37809;\nexport const RGBA_ASTC_5x5_Format = 37810;\nexport const RGBA_ASTC_6x5_Format = 37811;\nexport const RGBA_ASTC_6x6_Format = 37812;\nexport const RGBA_ASTC_8x5_Format = 37813;\nexport const RGBA_ASTC_8x6_Format = 37814;\nexport const RGBA_ASTC_8x8_Format = 37815;\nexport const RGBA_ASTC_10x5_Format = 37816;\nexport const RGBA_ASTC_10x6_Format = 37817;\nexport const RGBA_ASTC_10x8_Format = 37818;\nexport const RGBA_ASTC_10x10_Format = 37819;\nexport const RGBA_ASTC_12x10_Format = 37820;\nexport const RGBA_ASTC_12x12_Format = 37821;\nexport const RGBA_BPTC_Format = 36492;\nexport const RGB_BPTC_SIGNED_Format = 36494;\nexport const RGB_BPTC_UNSIGNED_Format = 36495;\nexport const RED_RGTC1_Format = 36283;\nexport const SIGNED_RED_RGTC1_Format = 36284;\nexport const RED_GREEN_RGTC2_Format = 36285;\nexport const SIGNED_RED_GREEN_RGTC2_Format = 36286;\nexport const LoopOnce = 2200;\nexport const LoopRepeat = 2201;\nexport const LoopPingPong = 2202;\nexport const InterpolateDiscrete = 2300;\nexport const InterpolateLinear = 2301;\nexport const InterpolateSmooth = 2302;\nexport const ZeroCurvatureEnding = 2400;\nexport const ZeroSlopeEnding = 2401;\nexport const WrapAroundEnding = 2402;\nexport const NormalAnimationBlendMode = 2500;\nexport const AdditiveAnimationBlendMode = 2501;\nexport const TrianglesDrawMode = 0;\nexport const TriangleStripDrawMode = 1;\nexport const TriangleFanDrawMode = 2;\nexport const BasicDepthPacking = 3200;\nexport const RGBADepthPacking = 3201;\nexport const RGBDepthPacking = 3202;\nexport const RGDepthPacking = 3203;\nexport const TangentSpaceNormalMap = 0;\nexport const ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nexport const NoColorSpace = '';\nexport const SRGBColorSpace = 'srgb';\nexport const LinearSRGBColorSpace = 'srgb-linear';\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nexport const LinearTransfer = 'linear';\nexport const SRGBTransfer = 'srgb';\n\nexport const Rec709Primaries = 'rec709';\nexport const P3Primaries = 'p3';\n\nexport const ZeroStencilOp = 0;\nexport const KeepStencilOp = 7680;\nexport const ReplaceStencilOp = 7681;\nexport const IncrementStencilOp = 7682;\nexport const DecrementStencilOp = 7683;\nexport const IncrementWrapStencilOp = 34055;\nexport const DecrementWrapStencilOp = 34056;\nexport const InvertStencilOp = 5386;\n\nexport const NeverStencilFunc = 512;\nexport const LessStencilFunc = 513;\nexport const EqualStencilFunc = 514;\nexport const LessEqualStencilFunc = 515;\nexport const GreaterStencilFunc = 516;\nexport const NotEqualStencilFunc = 517;\nexport const GreaterEqualStencilFunc = 518;\nexport const AlwaysStencilFunc = 519;\n\nexport const NeverCompare = 512;\nexport const LessCompare = 513;\nexport const EqualCompare = 514;\nexport const LessEqualCompare = 515;\nexport const GreaterCompare = 516;\nexport const NotEqualCompare = 517;\nexport const GreaterEqualCompare = 518;\nexport const AlwaysCompare = 519;\n\nexport const StaticDrawUsage = 35044;\nexport const DynamicDrawUsage = 35048;\nexport const StreamDrawUsage = 35040;\nexport const StaticReadUsage = 35045;\nexport const DynamicReadUsage = 35049;\nexport const StreamReadUsage = 35041;\nexport const StaticCopyUsage = 35046;\nexport const DynamicCopyUsage = 35050;\nexport const StreamCopyUsage = 35042;\n\nexport const GLSL1 = '100';\nexport const GLSL3 = '300 es';\n\nexport const WebGLCoordinateSystem = 2000;\nexport const WebGPUCoordinateSystem = 2001;\n","function arrayMin( array ) {\n\n\tif ( array.length === 0 ) return Infinity;\n\n\tlet min = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] < min ) min = array[ i ];\n\n\t}\n\n\treturn min;\n\n}\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tlet max = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nfunction warnOnce( message ) {\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\tconsole.warn( message );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\nexport { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS, createCanvasElement, warnOnce, probeAsync };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { denormalize, normalize } from '../math/MathUtils.js';\nimport { StaticDrawUsage, FloatType } from '../constants.js';\nimport { fromHalfFloat, toHalfFloat } from '../extras/DataUtils.js';\nimport { warnOnce } from '../utils.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.isBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis._updateRange = { offset: 0, count: - 1 };\n\t\tthis.updateRanges = [];\n\t\tthis.gpuType = FloatType;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tget updateRange() {\n\n\t\twarnOnce( 'THREE.BufferAttribute: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159\n\t\treturn this._updateRange;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2.fromBufferAttribute( this, i );\n\t\t\t\t_vector2.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2.x, _vector2.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( this, i );\n\t\t\t\t_vector.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( this, i );\n\n\t\t\t_vector.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( this, i );\n\n\t\t\t_vector.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( this, i );\n\n\t\t\t_vector.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n//\n\nexport {\n\tFloat32BufferAttribute,\n\tFloat16BufferAttribute,\n\tUint32BufferAttribute,\n\tInt32BufferAttribute,\n\tUint16BufferAttribute,\n\tInt16BufferAttribute,\n\tUint8ClampedBufferAttribute,\n\tUint8BufferAttribute,\n\tInt8BufferAttribute,\n\tBufferAttribute\n};\n","import { Box3 } from './Box3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _box = /*@__PURE__*/ new Box3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.isSphere = true;\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1.copy( sphere.center ).add( _v2 ) );\n\n\t\t\tthis.expandByPoint( _v1.copy( sphere.center ).sub( _v2 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Sphere };\n","import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../constants.js';\nimport { Vector3 } from './Vector3.js';\n\nclass Matrix4 {\n\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\td = ( - 2 * far * near ) / ( far - near );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tc = - far / ( far - near );\n\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\n\t\tlet z, zInv;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tz = ( far + near ) * p;\n\t\t\tzInv = - 2 * p;\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tz = near * p;\n\t\t\tzInv = - 1 * p;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0; \t\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = zInv;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nexport { Matrix4 };\n","import { Quaternion } from './Quaternion.js';\nimport { Matrix4 } from './Matrix4.js';\nimport { clamp } from './MathUtils.js';\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.DEFAULT_ORDER = 'XYZ';\n\nexport { Euler };\n","class Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\n\nexport { Layers };\n","class Matrix3 {\n\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nexport { Matrix3 };\n","import { Quaternion } from '../math/Quaternion.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { Euler } from '../math/Euler.js';\nimport { Layers } from './Layers.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet _object3DId = 0;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nconst _childaddedEvent = { type: 'childadded', child: null };\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isObject3D = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1.lookAt( _position, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1.lookAt( _target, _position, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, target, _scale );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.visibility = this._visibility;\n\t\t\tobject.active = this._active;\n\t\t\tobject.bounds = this._bounds.map( bound => ( {\n\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\tboxMin: bound.box.min.toArray(),\n\t\t\t\tboxMax: bound.box.max.toArray(),\n\n\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\tsphereRadius: bound.sphere.radius,\n\t\t\t\tsphereCenter: bound.sphere.center.toArray()\n\t\t\t} ) );\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) object.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = {\n\t\t\t\t\tcenter: object.boundingSphere.center.toArray(),\n\t\t\t\t\tradius: object.boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = {\n\t\t\t\t\tmin: object.boundingBox.min.toArray(),\n\t\t\t\t\tmax: object.boundingBox.max.toArray()\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nexport { Object3D };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Box3 } from '../math/Box3.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { BufferAttribute, Float32BufferAttribute, Uint16BufferAttribute, Uint32BufferAttribute } from './BufferAttribute.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Object3D } from './Object3D.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { arrayNeedsUint32 } from '../utils.js';\n\nlet _id = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.min, _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.max, _box.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( _box.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( _box.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( normals, i );\n\n\t\t\t_vector.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nexport { BufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\nexport { BoxGeometry };\n","import * as MathUtils from '../../math/MathUtils.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Matrix4 } from '../../math/Matrix4.js';\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( MathUtils.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( MathUtils.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { Curve };\n","import { Curve } from '../core/Curve.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { EllipseCurve };\n","import { EllipseCurve } from './EllipseCurve.js';\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nexport { ArcCurve };\n","import { Vector3 } from '../../math/Vector3.js';\nimport { Curve } from '../core/Curve.js';\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t *   p(0) = x0, p(1) = x1\n\t *  and\n\t *   p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { CatmullRomCurve3 };\n","/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nexport { CatmullRom, QuadraticBezier, CubicBezier };\n","import { Curve } from '../core/Curve.js';\nimport { CubicBezier } from '../core/Interpolations.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { CubicBezierCurve };\n","import { Curve } from '../core/Curve.js';\nimport { CubicBezier } from '../core/Interpolations.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { CubicBezierCurve3 };\n","import { Vector2 } from '../../math/Vector2.js';\nimport { Curve } from '../core/Curve.js';\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { LineCurve };\n","import { Vector3 } from '../../math/Vector3.js';\nimport { Curve } from '../core/Curve.js';\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { LineCurve3 };\n","import { Curve } from '../core/Curve.js';\nimport { QuadraticBezier } from '../core/Interpolations.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { QuadraticBezierCurve };\n","import { Curve } from '../core/Curve.js';\nimport { QuadraticBezier } from '../core/Interpolations.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { QuadraticBezierCurve3 };\n","import { Curve } from '../core/Curve.js';\nimport { CatmullRom } from '../core/Interpolations.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { SplineCurve };\n","export { ArcCurve } from './ArcCurve.js';\nexport { CatmullRomCurve3 } from './CatmullRomCurve3.js';\nexport { CubicBezierCurve } from './CubicBezierCurve.js';\nexport { CubicBezierCurve3 } from './CubicBezierCurve3.js';\nexport { EllipseCurve } from './EllipseCurve.js';\nexport { LineCurve } from './LineCurve.js';\nexport { LineCurve3 } from './LineCurve3.js';\nexport { QuadraticBezierCurve } from './QuadraticBezierCurve.js';\nexport { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js';\nexport { SplineCurve } from './SplineCurve.js';\n","import { Curve } from './Curve.js';\nimport * as Curves from '../curves/Curves.js';\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n *  curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t// getPoint() depends on getLength\n\n\tgetLength() {\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\t// cacheLengths must be recalculated.\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t// Compute lengths and cache them\n\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\tgetCurveLengths() {\n\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { CurvePath };\n","import { Vector2 } from '../../math/Vector2.js';\nimport { CurvePath } from './CurvePath.js';\nimport { EllipseCurve } from '../curves/EllipseCurve.js';\nimport { SplineCurve } from '../curves/SplineCurve.js';\nimport { CubicBezierCurve } from '../curves/CubicBezierCurve.js';\nimport { QuadraticBezierCurve } from '../curves/QuadraticBezierCurve.js';\nimport { LineCurve } from '../curves/LineCurve.js';\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { Path };\n","import { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = MathUtils.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n\nexport { LatheGeometry };\n","import { Path } from '../extras/core/Path.js';\nimport { LatheGeometry } from './LatheGeometry.js';\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tlength: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nexport { CapsuleGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n\nexport { CircleGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n\nexport { CylinderGeometry };\n","import { CylinderGeometry } from './CylinderGeometry.js';\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nexport { ConeGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nexport { PolyhedronGeometry };\n","import { PolyhedronGeometry } from './PolyhedronGeometry.js';\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n\nexport { DodecahedronGeometry };\n","import { Vector3 } from './Vector3.js';\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0.subVectors( a, b );\n\t\ttarget.cross( _v0 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0.subVectors( c, a );\n\t\t_v1.subVectors( b, a );\n\t\t_v2.subVectors( point, a );\n\n\t\tconst dot00 = _v0.dot( _v0 );\n\t\tconst dot01 = _v0.dot( _v1 );\n\t\tconst dot02 = _v0.dot( _v2 );\n\t\tconst dot11 = _v1.dot( _v1 );\n\t\tconst dot12 = _v1.dot( _v2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );\n\n\t}\n\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3.x );\n\t\ttarget.addScaledVector( v2, _v3.y );\n\t\ttarget.addScaledVector( v3, _v3.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0.subVectors( c, b );\n\t\t_v1.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0.cross( _v1 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0.subVectors( this.c, this.b );\n\t\t_v1.subVectors( this.a, this.b );\n\n\t\treturn _v0.cross( _v1 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nexport { Triangle };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { Triangle } from '../math/Triangle.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( MathUtils.DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1.x, _v1.y, _v1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { EdgesGeometry };\n","import { Path } from './Path.js';\nimport * as MathUtils from '../../math/MathUtils.js';\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { Shape };\n","/**\n * Port from https://github.com/mapbox/earcut (v2.2.4)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n           ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n           ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n           ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n            ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n            equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nexport { Earcut };\n","import { Earcut } from './Earcut.js';\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\nexport { ShapeUtils };\n","/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n *  curveSegments: <int>, // number of points on the curves\n *  steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n *  depth: <float>, // Depth to extrude the shape\n *\n *  bevelEnabled: <bool>, // turn on bevel\n *  bevelThickness: <float>, // how deep into the original shape bevel goes\n *  bevelSize: <float>, // how far from shape outline (including bevelOffset) is bevel\n *  bevelOffset: <float>, // how far from shape outline does bevel start\n *  bevelSegments: <int>, // number of bevel layers\n *\n *  extrudePath: <THREE.Curve> // curve to extrude shape along\n *\n *  UVGenerator: <Object> // object that provides UV generator functions\n *\n * }\n */\n\nimport { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport * as Curves from '../extras/curves/Curves.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Shape } from '../extras/core/Shape.js';\nimport { ShapeUtils } from '../extras/ShapeUtils.js';\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t//  but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t/////  Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n\nexport { ExtrudeGeometry };\n","import { PolyhedronGeometry } from './PolyhedronGeometry.js';\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n\nexport { IcosahedronGeometry };\n","import { PolyhedronGeometry } from './PolyhedronGeometry.js';\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nexport { OctahedronGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nexport { PlaneGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n\nexport { RingGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Shape } from '../extras/core/Shape.js';\nimport { ShapeUtils } from '../extras/ShapeUtils.js';\nimport { Vector2 } from '../math/Vector2.js';\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nexport { ShapeGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nexport { SphereGeometry };\n","import { PolyhedronGeometry } from './PolyhedronGeometry.js';\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nexport { TetrahedronGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nexport { TorusGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nexport { TorusKnotGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport * as Curves from '../extras/curves/Curves.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new Curves[ 'QuadraticBezierCurve3' ]( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n\nexport { TubeGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\n\nexport { WireframeGeometry };\n","export * from './BoxGeometry.js';\nexport * from './CapsuleGeometry.js';\nexport * from './CircleGeometry.js';\nexport * from './ConeGeometry.js';\nexport * from './CylinderGeometry.js';\nexport * from './DodecahedronGeometry.js';\nexport * from './EdgesGeometry.js';\nexport * from './ExtrudeGeometry.js';\nexport * from './IcosahedronGeometry.js';\nexport * from './LatheGeometry.js';\nexport * from './OctahedronGeometry.js';\nexport * from './PlaneGeometry.js';\nexport * from './PolyhedronGeometry.js';\nexport * from './RingGeometry.js';\nexport * from './ShapeGeometry.js';\nexport * from './SphereGeometry.js';\nexport * from './TetrahedronGeometry.js';\nexport * from './TorusGeometry.js';\nexport * from './TorusKnotGeometry.js';\nexport * from './TubeGeometry.js';\nexport * from './WireframeGeometry.js';\n","import {\n\tUVMapping,\n\tCubeReflectionMapping,\n\tCubeRefractionMapping,\n\tEquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping,\n\tCubeUVReflectionMapping,\n\tRepeatWrapping,\n\tClampToEdgeWrapping,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter,\n\tLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter,\n\tInstancedBufferAttribute,\n\tObject3D,\n\tGroup,\n\tColor,\n\tInstancedMesh,\n\tSprite,\n\tPoints,\n\tLine,\n\tLineLoop,\n\tLineSegments,\n\tLOD,\n\tMesh,\n\tSkinnedMesh,\n\tBone,\n\tSkeleton,\n\tShape,\n\tFog,\n\tFogExp2,\n\tHemisphereLight,\n\tSpotLight,\n\tPointLight,\n\tDirectionalLight,\n\tAmbientLight,\n\tRectAreaLight,\n\tLightProbe,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tScene,\n\tCubeTexture,\n\tTexture,\n\tSource,\n\tDataTexture,\n\tImageLoader,\n\tLoadingManager,\n\tAnimationClip,\n\tMaterialLoader,\n\tLoaderUtils,\n\tBufferGeometryLoader,\n\tLoader,\n\tFileLoader,\n} from 'three';\n\nimport * as Geometries from 'three/src/geometries/Geometries.js';\nimport {getTypedArray} from 'three/src/utils.js';\n\nclass ObjectLoader extends Loader {\n\tconstructor(manager) {\n\t\tsuper(manager);\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst scope = this;\n\n\t\tconst path = this.path === '' ? LoaderUtils.extractUrlBase(url) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader(this.manager);\n\t\tloader.setPath(this.path);\n\t\tloader.setRequestHeader(this.requestHeader);\n\t\tloader.setWithCredentials(this.withCredentials);\n\t\tloader.load(\n\t\t\turl,\n\t\t\tfunction (text) {\n\t\t\t\tlet json = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse(text);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (onError !== undefined) onError(error);\n\n\t\t\t\t\tconsole.error(\"THREE:ObjectLoader: Can't parse \" + url + '.', error.message);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst metadata = json.metadata;\n\n\t\t\t\tif (\n\t\t\t\t\tmetadata === undefined ||\n\t\t\t\t\tmetadata.type === undefined ||\n\t\t\t\t\tmetadata.type.toLowerCase() === 'geometry'\n\t\t\t\t) {\n\t\t\t\t\tif (onError !== undefined) onError(new Error(\"THREE.ObjectLoader: Can't load \" + url));\n\n\t\t\t\t\tconsole.error(\"THREE.ObjectLoader: Can't load \" + url);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tscope.parse(json, onLoad);\n\t\t\t},\n\t\t\tonProgress,\n\t\t\tonError\n\t\t);\n\t}\n\n\tasync loadAsync(url, onProgress) {\n\t\tconst scope = this;\n\n\t\tconst path = this.path === '' ? LoaderUtils.extractUrlBase(url) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader(this.manager);\n\t\tloader.setPath(this.path);\n\t\tloader.setRequestHeader(this.requestHeader);\n\t\tloader.setWithCredentials(this.withCredentials);\n\n\t\tconst text = await loader.loadAsync(url, onProgress);\n\n\t\tconst json = JSON.parse(text);\n\n\t\tconst metadata = json.metadata;\n\n\t\tif (metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry') {\n\t\t\tthrow new Error(\"THREE.ObjectLoader: Can't load \" + url);\n\t\t}\n\n\t\treturn await scope.parseAsync(json);\n\t}\n\n\tparse(json, onLoad) {\n\t\tconst animations = this.parseAnimations(json.animations);\n\t\tconst shapes = this.parseShapes(json.shapes);\n\t\tconst geometries = this.parseGeometries(json.geometries, shapes);\n\n\t\tconst images = this.parseImages(json.images, function () {\n\t\t\tif (onLoad !== undefined) onLoad(object);\n\t\t});\n\n\t\tconst textures = this.parseTextures(json.textures, images);\n\t\tconst materials = this.parseMaterials(json.materials, textures);\n\n\t\tconst object = this.parseObject(json.object, geometries, materials, textures, animations);\n\t\tconst skeletons = this.parseSkeletons(json.skeletons, object);\n\n\t\tthis.bindSkeletons(object, skeletons);\n\n\t\t//\n\n\t\tif (onLoad !== undefined) {\n\t\t\tlet hasImages = false;\n\n\t\t\tfor (const uuid in images) {\n\t\t\t\tif (images[uuid].data instanceof HTMLImageElement) {\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasImages === false) onLoad(object);\n\t\t}\n\n\t\treturn object;\n\t}\n\n\tasync parseAsync(json) {\n\t\tconst animations = this.parseAnimations(json.animations);\n\t\tconst shapes = this.parseShapes(json.shapes);\n\t\tconst geometries = this.parseGeometries(json.geometries, shapes);\n\n\t\tconst images = await this.parseImagesAsync(json.images);\n\n\t\tconst textures = this.parseTextures(json.textures, images);\n\t\tconst materials = this.parseMaterials(json.materials, textures);\n\n\t\tconst object = this.parseObject(json.object, geometries, materials, textures, animations);\n\t\tconst skeletons = this.parseSkeletons(json.skeletons, object);\n\n\t\tthis.bindSkeletons(object, skeletons);\n\n\t\treturn object;\n\t}\n\n\tparseShapes(json) {\n\t\tconst shapes = {};\n\n\t\tif (json !== undefined) {\n\t\t\tfor (let i = 0, l = json.length; i < l; i++) {\n\t\t\t\tconst shape = new Shape().fromJSON(json[i]);\n\n\t\t\t\tshapes[shape.uuid] = shape;\n\t\t\t}\n\t\t}\n\n\t\treturn shapes;\n\t}\n\n\tparseSkeletons(json, object) {\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse(function (child) {\n\t\t\tif (child.isBone) bones[child.uuid] = child;\n\t\t});\n\n\t\t// create skeletons\n\n\t\tif (json !== undefined) {\n\t\t\tfor (let i = 0, l = json.length; i < l; i++) {\n\t\t\t\tconst skeleton = new Skeleton().fromJSON(json[i], bones);\n\n\t\t\t\tskeletons[skeleton.uuid] = skeleton;\n\t\t\t}\n\t\t}\n\n\t\treturn skeletons;\n\t}\n\n\tparseGeometries(json, shapes) {\n\t\tconst geometries = {};\n\n\t\tif (json !== undefined) {\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor (let i = 0, l = json.length; i < l; i++) {\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[i];\n\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse(data);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (data.type in Geometries) {\n\t\t\t\t\t\t\tgeometry = Geometries[data.type].fromJSON(data, shapes);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn(`THREE.ObjectLoader: Unsupported geometry type \"${data.type}\"`);\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif (data.name !== undefined) geometry.name = data.name;\n\t\t\t\tif (geometry.isBufferGeometry === true && data.userData !== undefined)\n\t\t\t\t\tgeometry.userData = data.userData;\n\n\t\t\t\tgeometries[data.uuid] = geometry;\n\t\t\t}\n\t\t}\n\n\t\treturn geometries;\n\t}\n\n\tparseMaterials(json, textures) {\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif (json !== undefined) {\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures(textures);\n\n\t\t\tfor (let i = 0, l = json.length; i < l; i++) {\n\t\t\t\tconst data = json[i];\n\n\t\t\t\tif (cache[data.uuid] === undefined) {\n\t\t\t\t\tcache[data.uuid] = loader.parse(data);\n\t\t\t\t}\n\n\t\t\t\tmaterials[data.uuid] = cache[data.uuid];\n\t\t\t}\n\t\t}\n\n\t\treturn materials;\n\t}\n\n\tparseAnimations(json) {\n\t\tconst animations = {};\n\n\t\tif (json !== undefined) {\n\t\t\tfor (let i = 0; i < json.length; i++) {\n\t\t\t\tconst data = json[i];\n\n\t\t\t\tconst clip = AnimationClip.parse(data);\n\n\t\t\t\tanimations[clip.uuid] = clip;\n\t\t\t}\n\t\t}\n\n\t\treturn animations;\n\t}\n\n\tparseImages(json, onLoad) {\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage(url) {\n\t\t\tscope.manager.itemStart(url);\n\n\t\t\treturn loader.load(\n\t\t\t\turl,\n\t\t\t\tfunction () {\n\t\t\t\t\tscope.manager.itemEnd(url);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\tfunction () {\n\t\t\t\t\tscope.manager.itemError(url);\n\t\t\t\t\tscope.manager.itemEnd(url);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tfunction deserializeImage(image) {\n\t\t\tif (typeof image === 'string') {\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test(url) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage(path);\n\t\t\t} else {\n\t\t\t\tif (image.data) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray(image.type, image.data),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (json !== undefined && json.length > 0) {\n\t\t\tconst manager = new LoadingManager(onLoad);\n\n\t\t\tloader = new ImageLoader(manager);\n\t\t\tloader.setCrossOrigin(this.crossOrigin);\n\n\t\t\tfor (let i = 0, il = json.length; i < il; i++) {\n\t\t\t\tconst image = json[i];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif (Array.isArray(url)) {\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor (let j = 0, jl = url.length; j < jl; j++) {\n\t\t\t\t\t\tconst currentUrl = url[j];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage(currentUrl);\n\n\t\t\t\t\t\tif (deserializedImage !== null) {\n\t\t\t\t\t\t\tif (deserializedImage instanceof HTMLImageElement) {\n\t\t\t\t\t\t\t\timageArray.push(deserializedImage);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push(\n\t\t\t\t\t\t\t\t\tnew DataTexture(\n\t\t\t\t\t\t\t\t\t\tdeserializedImage.data,\n\t\t\t\t\t\t\t\t\t\tdeserializedImage.width,\n\t\t\t\t\t\t\t\t\t\tdeserializedImage.height\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\timages[image.uuid] = new Source(imageArray);\n\t\t\t\t} else {\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage(image.url);\n\t\t\t\t\timages[image.uuid] = new Source(deserializedImage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn images;\n\t}\n\n\tasync parseImagesAsync(json) {\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage(image) {\n\t\t\tif (typeof image === 'string') {\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test(url) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync(path);\n\t\t\t} else {\n\t\t\t\tif (image.data) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray(image.type, image.data),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (json !== undefined && json.length > 0) {\n\t\t\tloader = new ImageLoader(this.manager);\n\t\t\tloader.setCrossOrigin(this.crossOrigin);\n\n\t\t\tfor (let i = 0, il = json.length; i < il; i++) {\n\t\t\t\tconst image = json[i];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif (Array.isArray(url)) {\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor (let j = 0, jl = url.length; j < jl; j++) {\n\t\t\t\t\t\tconst currentUrl = url[j];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage(currentUrl);\n\n\t\t\t\t\t\tif (deserializedImage !== null) {\n\t\t\t\t\t\t\tif (deserializedImage instanceof HTMLImageElement) {\n\t\t\t\t\t\t\t\timageArray.push(deserializedImage);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push(\n\t\t\t\t\t\t\t\t\tnew DataTexture(\n\t\t\t\t\t\t\t\t\t\tdeserializedImage.data,\n\t\t\t\t\t\t\t\t\t\tdeserializedImage.width,\n\t\t\t\t\t\t\t\t\t\tdeserializedImage.height\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\timages[image.uuid] = new Source(imageArray);\n\t\t\t\t} else {\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage(image.url);\n\t\t\t\t\timages[image.uuid] = new Source(deserializedImage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn images;\n\t}\n\n\tparseTextures(json, images) {\n\t\tfunction parseConstant(value, type) {\n\t\t\tif (typeof value === 'number') return value;\n\n\t\t\tconsole.warn('THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value);\n\n\t\t\treturn type[value];\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif (json !== undefined) {\n\t\t\tfor (let i = 0, l = json.length; i < l; i++) {\n\t\t\t\tconst data = json[i];\n\n\t\t\t\tif (data.image === undefined) {\n\t\t\t\t\tconsole.warn('THREE.ObjectLoader: No \"image\" specified for', data.uuid);\n\t\t\t\t}\n\n\t\t\t\tif (images[data.image] === undefined) {\n\t\t\t\t\tconsole.warn('THREE.ObjectLoader: Undefined image', data.image);\n\t\t\t\t}\n\n\t\t\t\tconst source = images[data.image];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif (Array.isArray(image)) {\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif (image.length === 6) texture.needsUpdate = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (image && image.data) {\n\t\t\t\t\t\ttexture = new DataTexture();\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttexture = new Texture();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (image) texture.needsUpdate = true; // textures can have undefined image data\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif (data.name !== undefined) texture.name = data.name;\n\n\t\t\t\tif (data.mapping !== undefined) texture.mapping = parseConstant(data.mapping, TEXTURE_MAPPING);\n\n\t\t\t\tif (data.offset !== undefined) texture.offset.fromArray(data.offset);\n\t\t\t\tif (data.repeat !== undefined) texture.repeat.fromArray(data.repeat);\n\t\t\t\tif (data.center !== undefined) texture.center.fromArray(data.center);\n\t\t\t\tif (data.rotation !== undefined) texture.rotation = data.rotation;\n\n\t\t\t\tif (data.wrap !== undefined) {\n\t\t\t\t\ttexture.wrapS = parseConstant(data.wrap[0], TEXTURE_WRAPPING);\n\t\t\t\t\ttexture.wrapT = parseConstant(data.wrap[1], TEXTURE_WRAPPING);\n\t\t\t\t}\n\n\t\t\t\tif (data.format !== undefined) texture.format = data.format;\n\t\t\t\tif (data.type !== undefined) texture.type = data.type;\n\t\t\t\tif (data.encoding !== undefined) texture.encoding = data.encoding;\n\n\t\t\t\tif (data.minFilter !== undefined) texture.minFilter = parseConstant(data.minFilter, TEXTURE_FILTER);\n\t\t\t\tif (data.magFilter !== undefined) texture.magFilter = parseConstant(data.magFilter, TEXTURE_FILTER);\n\t\t\t\tif (data.anisotropy !== undefined) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif (data.flipY !== undefined) texture.flipY = data.flipY;\n\n\t\t\t\tif (data.premultiplyAlpha !== undefined) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif (data.unpackAlignment !== undefined) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\tif (data.userData !== undefined) texture.userData = data.userData;\n\n\t\t\t\ttextures[data.uuid] = texture;\n\t\t\t}\n\t\t}\n\n\t\treturn textures;\n\t}\n\n\tparseObject(data, geometries, materials, textures, animations) {\n\t\tlet object;\n\n\t\tfunction getGeometry(name) {\n\t\t\tif (geometries[name] === undefined) {\n\t\t\t\tconsole.warn('THREE.ObjectLoader: Undefined geometry', name);\n\t\t\t}\n\n\t\t\treturn geometries[name];\n\t\t}\n\n\t\tfunction getMaterial(name) {\n\t\t\tif (name === undefined) return undefined;\n\n\t\t\tif (Array.isArray(name)) {\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor (let i = 0, l = name.length; i < l; i++) {\n\t\t\t\t\tconst uuid = name[i];\n\n\t\t\t\t\tif (materials[uuid] === undefined) {\n\t\t\t\t\t\tconsole.warn('THREE.ObjectLoader: Undefined material', uuid);\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push(materials[uuid]);\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\t\t\t}\n\n\t\t\tif (materials[name] === undefined) {\n\t\t\t\tconsole.warn('THREE.ObjectLoader: Undefined material', name);\n\t\t\t}\n\n\t\t\treturn materials[name];\n\t\t}\n\n\t\tfunction getTexture(uuid) {\n\t\t\tif (textures[uuid] === undefined) {\n\t\t\t\tconsole.warn('THREE.ObjectLoader: Undefined texture', uuid);\n\t\t\t}\n\n\t\t\treturn textures[uuid];\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch (data.type) {\n\t\t\tcase 'Scene':\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif (data.background !== undefined) {\n\t\t\t\t\tif (Number.isInteger(data.background)) {\n\t\t\t\t\t\tobject.background = new Color(data.background);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobject.background = getTexture(data.background);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (data.environment !== undefined) {\n\t\t\t\t\tobject.environment = getTexture(data.environment);\n\t\t\t\t}\n\n\t\t\t\tif (data.fog !== undefined) {\n\t\t\t\t\tif (data.fog.type === 'Fog') {\n\t\t\t\t\t\tobject.fog = new Fog(data.fog.color, data.fog.near, data.fog.far);\n\t\t\t\t\t} else if (data.fog.type === 'FogExp2') {\n\t\t\t\t\t\tobject.fog = new FogExp2(data.fog.color, data.fog.density);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (data.backgroundBlurriness !== undefined) object.backgroundBlurriness = data.backgroundBlurriness;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\t\t\t\tobject = new PerspectiveCamera(data.fov, data.aspect, data.near, data.far);\n\n\t\t\t\tif (data.focus !== undefined) object.focus = data.focus;\n\t\t\t\tif (data.zoom !== undefined) object.zoom = data.zoom;\n\t\t\t\tif (data.filmGauge !== undefined) object.filmGauge = data.filmGauge;\n\t\t\t\tif (data.filmOffset !== undefined) object.filmOffset = data.filmOffset;\n\t\t\t\tif (data.view !== undefined) object.view = Object.assign({}, data.view);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\t\t\t\tobject = new OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far);\n\n\t\t\t\tif (data.zoom !== undefined) object.zoom = data.zoom;\n\t\t\t\tif (data.view !== undefined) object.view = Object.assign({}, data.view);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\t\t\t\tobject = new AmbientLight(data.color, data.intensity);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\t\t\t\tobject = new DirectionalLight(data.color, data.intensity);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\t\t\t\tobject = new PointLight(data.color, data.intensity, data.distance, data.decay);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\t\t\t\tobject = new RectAreaLight(data.color, data.intensity, data.width, data.height);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\t\t\t\tobject = new SpotLight(\n\t\t\t\t\tdata.color,\n\t\t\t\t\tdata.intensity,\n\t\t\t\t\tdata.distance,\n\t\t\t\t\tdata.angle,\n\t\t\t\t\tdata.penumbra,\n\t\t\t\t\tdata.decay\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\t\t\t\tobject = new HemisphereLight(data.color, data.groundColor, data.intensity);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\t\t\t\tobject = new LightProbe().fromJSON(data);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\t\t\t\tgeometry = getGeometry(data.geometry);\n\t\t\t\tmaterial = getMaterial(data.material);\n\n\t\t\t\tobject = new SkinnedMesh(geometry, material);\n\n\t\t\t\tif (data.bindMode !== undefined) object.bindMode = data.bindMode;\n\t\t\t\tif (data.bindMatrix !== undefined) object.bindMatrix.fromArray(data.bindMatrix);\n\t\t\t\tif (data.skeleton !== undefined) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\t\t\t\tgeometry = getGeometry(data.geometry);\n\t\t\t\tmaterial = getMaterial(data.material);\n\n\t\t\t\tobject = new Mesh(geometry, material);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\t\t\t\tgeometry = getGeometry(data.geometry);\n\t\t\t\tmaterial = getMaterial(data.material);\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh(geometry, material, count);\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute(new Float32Array(instanceMatrix.array), 16);\n\t\t\t\tif (instanceColor !== undefined)\n\t\t\t\t\tobject.instanceColor = new InstancedBufferAttribute(\n\t\t\t\t\t\tnew Float32Array(instanceColor.array),\n\t\t\t\t\t\tinstanceColor.itemSize\n\t\t\t\t\t);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\t\t\t\tobject = new Line(getGeometry(data.geometry), getMaterial(data.material));\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\t\t\t\tobject = new LineLoop(getGeometry(data.geometry), getMaterial(data.material));\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\t\t\t\tobject = new LineSegments(getGeometry(data.geometry), getMaterial(data.material));\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\t\t\t\tobject = new Points(getGeometry(data.geometry), getMaterial(data.material));\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\t\t\t\tobject = new Sprite(getMaterial(data.material));\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tobject = new Object3D();\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif (data.name !== undefined) object.name = data.name;\n\n\t\tif (data.matrix !== undefined) {\n\t\t\tobject.matrix.fromArray(data.matrix);\n\n\t\t\tif (data.matrixAutoUpdate !== undefined) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif (object.matrixAutoUpdate) object.matrix.decompose(object.position, object.quaternion, object.scale);\n\t\t} else {\n\t\t\tif (data.position !== undefined) object.position.fromArray(data.position);\n\t\t\tif (data.rotation !== undefined) object.rotation.fromArray(data.rotation);\n\t\t\tif (data.quaternion !== undefined) object.quaternion.fromArray(data.quaternion);\n\t\t\tif (data.scale !== undefined) object.scale.fromArray(data.scale);\n\t\t}\n\n\t\tif (data.castShadow !== undefined) object.castShadow = data.castShadow;\n\t\tif (data.receiveShadow !== undefined) object.receiveShadow = data.receiveShadow;\n\n\t\tif (data.shadow) {\n\t\t\tif (data.shadow.bias !== undefined) object.shadow.bias = data.shadow.bias;\n\t\t\tif (data.shadow.normalBias !== undefined) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif (data.shadow.radius !== undefined) object.shadow.radius = data.shadow.radius;\n\t\t\tif (data.shadow.mapSize !== undefined) object.shadow.mapSize.fromArray(data.shadow.mapSize);\n\t\t\tif (data.shadow.camera !== undefined) object.shadow.camera = this.parseObject(data.shadow.camera);\n\t\t}\n\n\t\tif (data.visible !== undefined) object.visible = data.visible;\n\t\tif (data.frustumCulled !== undefined) object.frustumCulled = data.frustumCulled;\n\t\tif (data.renderOrder !== undefined) object.renderOrder = data.renderOrder;\n\t\tif (data.userData !== undefined) object.userData = data.userData;\n\t\tif (data.layers !== undefined) object.layers.mask = data.layers;\n\n\t\tif (data.children !== undefined) {\n\t\t\tconst children = data.children;\n\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tobject.add(this.parseObject(children[i], geometries, materials, textures, animations));\n\t\t\t}\n\t\t}\n\n\t\tif (data.animations !== undefined) {\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor (let i = 0; i < objectAnimations.length; i++) {\n\t\t\t\tconst uuid = objectAnimations[i];\n\n\t\t\t\tobject.animations.push(animations[uuid]);\n\t\t\t}\n\t\t}\n\n\t\tif (data.type === 'LOD') {\n\t\t\tif (data.autoUpdate !== undefined) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor (let l = 0; l < levels.length; l++) {\n\t\t\t\tconst level = levels[l];\n\t\t\t\tconst child = object.getObjectByProperty('uuid', level.object);\n\n\t\t\t\tif (child !== undefined) {\n\t\t\t\t\tobject.addLevel(child, level.distance);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t}\n\n\tbindSkeletons(object, skeletons) {\n\t\tif (Object.keys(skeletons).length === 0) return;\n\n\t\tobject.traverse(function (child) {\n\t\t\tif (child.isSkinnedMesh === true && child.skeleton !== undefined) {\n\t\t\t\tconst skeleton = skeletons[child.skeleton];\n\n\t\t\t\tif (skeleton === undefined) {\n\t\t\t\t\tconsole.warn('THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton);\n\t\t\t\t} else {\n\t\t\t\t\tchild.bind(skeleton, child.bindMatrix);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping,\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter,\n};\n\nexport {ObjectLoader};\n","import {ObjectLoader} from './tmp/ObjectLoader';\nimport {Object3D} from 'three';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nexport class JSONLoaderHandler extends BaseObject3DLoaderHandler<Object3D> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<Object3D>> {\n\t\treturn (this._loader = this._loader || new ObjectLoader(this.loadingManager));\n\t}\n\tprotected override _errorMessage(url: string, event: ErrorEvent) {\n\t\treturn `could not loadfrom ${url} (Error: ${event.message}) - Are you sure you did not mean to use the sop/dataUrl node instead?`;\n\t}\n}\n","import {Object3D} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {JSONLoaderHandler} from '../../../core/loader/geometry/JSON';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileJSONSopOperation extends BaseFileSopOperation<Object3D> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/wolf.json`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_JSON> {\n\t\treturn SopTypeFile.FILE_JSON;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new JSONLoaderHandler(params.url, this._node);\n\t}\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMatrix4,\n\tMesh,\n\tMeshStandardMaterial,\n\tShaderMaterial,\n\tSRGBColorSpace,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector3,\n\tRay\n} from 'three';\n\n// Special surface finish tag types.\n// Note: \"MATERIAL\" tag (e.g. GLITTER, SPECKLE) is not implemented\nconst FINISH_TYPE_DEFAULT = 0;\nconst FINISH_TYPE_CHROME = 1;\nconst FINISH_TYPE_PEARLESCENT = 2;\nconst FINISH_TYPE_RUBBER = 3;\nconst FINISH_TYPE_MATTE_METALLIC = 4;\nconst FINISH_TYPE_METAL = 5;\n\n// State machine to search a subobject path.\n// The LDraw standard establishes these various possible subfolders.\nconst FILE_LOCATION_TRY_PARTS = 0;\nconst FILE_LOCATION_TRY_P = 1;\nconst FILE_LOCATION_TRY_MODELS = 2;\nconst FILE_LOCATION_AS_IS = 3;\nconst FILE_LOCATION_TRY_RELATIVE = 4;\nconst FILE_LOCATION_TRY_ABSOLUTE = 5;\nconst FILE_LOCATION_NOT_FOUND = 6;\n\nconst MAIN_COLOUR_CODE = '16';\nconst MAIN_EDGE_COLOUR_CODE = '24';\n\nconst COLOR_SPACE_LDRAW = SRGBColorSpace;\n\nconst _tempVec0 = new Vector3();\nconst _tempVec1 = new Vector3();\n\nclass LDrawConditionalLineMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tdiffuse: {\n\t\t\t\t\t\tvalue: new Color()\n\t\t\t\t\t},\n\t\t\t\t\topacity: {\n\t\t\t\t\t\tvalue: 1.0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\tattribute vec3 control0;\n\t\t\t\tattribute vec3 control1;\n\t\t\t\tattribute vec3 direction;\n\t\t\t\tvarying float discardFlag;\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <color_pars_vertex>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\t\t\t\t#include <clipping_planes_pars_vertex>\n\t\t\t\tvoid main() {\n\t\t\t\t\t#include <color_vertex>\n\n\t\t\t\t\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\tgl_Position = projectionMatrix * mvPosition;\n\n\t\t\t\t\t// Transform the line segment ends and control points into camera clip space\n\t\t\t\t\tvec4 c0 = projectionMatrix * modelViewMatrix * vec4( control0, 1.0 );\n\t\t\t\t\tvec4 c1 = projectionMatrix * modelViewMatrix * vec4( control1, 1.0 );\n\t\t\t\t\tvec4 p0 = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\tvec4 p1 = projectionMatrix * modelViewMatrix * vec4( position + direction, 1.0 );\n\n\t\t\t\t\tc0.xy /= c0.w;\n\t\t\t\t\tc1.xy /= c1.w;\n\t\t\t\t\tp0.xy /= p0.w;\n\t\t\t\t\tp1.xy /= p1.w;\n\n\t\t\t\t\t// Get the direction of the segment and an orthogonal vector\n\t\t\t\t\tvec2 dir = p1.xy - p0.xy;\n\t\t\t\t\tvec2 norm = vec2( -dir.y, dir.x );\n\n\t\t\t\t\t// Get control point directions from the line\n\t\t\t\t\tvec2 c0dir = c0.xy - p1.xy;\n\t\t\t\t\tvec2 c1dir = c1.xy - p1.xy;\n\n\t\t\t\t\t// If the vectors to the controls points are pointed in different directions away\n\t\t\t\t\t// from the line segment then the line should not be drawn.\n\t\t\t\t\tfloat d0 = dot( normalize( norm ), normalize( c0dir ) );\n\t\t\t\t\tfloat d1 = dot( normalize( norm ), normalize( c1dir ) );\n\t\t\t\t\tdiscardFlag = float( sign( d0 ) != sign( d1 ) );\n\n\t\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t\t#include <clipping_planes_vertex>\n\t\t\t\t\t#include <fog_vertex>\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\t\t\tuniform vec3 diffuse;\n\t\t\tuniform float opacity;\n\t\t\tvarying float discardFlag;\n\n\t\t\t#include <common>\n\t\t\t#include <color_pars_fragment>\n\t\t\t#include <fog_pars_fragment>\n\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t#include <clipping_planes_pars_fragment>\n\t\t\tvoid main() {\n\n\t\t\t\tif ( discardFlag > 0.5 ) discard;\n\n\t\t\t\t#include <clipping_planes_fragment>\n\t\t\t\tvec3 outgoingLight = vec3( 0.0 );\n\t\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t\t\t\t#include <logdepthbuf_fragment>\n\t\t\t\t#include <color_fragment>\n\t\t\t\toutgoingLight = diffuseColor.rgb; // simple shader\n\t\t\t\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t#include <colorspace_fragment>\n\t\t\t\t#include <fog_fragment>\n\t\t\t\t#include <premultiplied_alpha_fragment>\n\t\t\t}\n\t\t\t`,\n\n\t\t} );\n\n\t\tObject.defineProperties( this, {\n\n\t\t\topacity: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tcolor: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\t\tthis.isLDrawConditionalLineMaterial = true;\n\n\t}\n\n}\n\nclass ConditionalLineSegments extends LineSegments {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\t\tthis.isConditionalLine = true;\n\n\t}\n\n}\n\nfunction generateFaceNormals( faces ) {\n\n\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tconst face = faces[ i ];\n\t\tconst vertices = face.vertices;\n\t\tconst v0 = vertices[ 0 ];\n\t\tconst v1 = vertices[ 1 ];\n\t\tconst v2 = vertices[ 2 ];\n\n\t\t_tempVec0.subVectors( v1, v0 );\n\t\t_tempVec1.subVectors( v2, v1 );\n\t\tface.faceNormal = new Vector3()\n\t\t\t.crossVectors( _tempVec0, _tempVec1 )\n\t\t\t.normalize();\n\n\t}\n\n}\n\nconst _ray = new Ray();\nfunction smoothNormals( faces, lineSegments, checkSubSegments = false ) {\n\n\t// NOTE: 1e2 is pretty coarse but was chosen to quantize the resulting value because\n\t// it allows edges to be smoothed as expected (see minifig arms).\n\t// --\n\t// And the vector values are initialize multiplied by 1 + 1e-10 to account for floating\n\t// point errors on vertices along quantization boundaries. Ie after matrix multiplication\n\t// vertices that should be merged might be set to \"1.7\" and \"1.6999...\" meaning they won't\n\t// get merged. This added epsilon attempts to push these error values to the same quantized\n\t// value for the sake of hashing. See \"AT-ST mini\" dishes. See mrdoob/three#23169.\n\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\n\t\treturn `${ x },${ y },${ z }`;\n\n\t}\n\n\tfunction hashEdge( v0, v1 ) {\n\n\t\treturn `${ hashVertex( v0 ) }_${ hashVertex( v1 ) }`;\n\n\t}\n\n\t// converts the two vertices to a ray with a normalized direction and origin of 0, 0, 0 projected\n\t// onto the original line.\n\tfunction toNormalizedRay( v0, v1, targetRay ) {\n\n\t\ttargetRay.direction.subVectors( v1, v0 ).normalize();\n\n\t\tconst scalar = v0.dot( targetRay.direction );\n\t\ttargetRay.origin.copy( v0 ).addScaledVector( targetRay.direction, - scalar );\n\n\t\treturn targetRay;\n\n\t}\n\n\tfunction hashRay( ray ) {\n\n\t\treturn hashEdge( ray.origin, ray.direction );\n\n\t}\n\n\tconst hardEdges = new Set();\n\tconst hardEdgeRays = new Map();\n\tconst halfEdgeList = {};\n\tconst normals = [];\n\n\t// Save the list of hard edges by hash\n\tfor ( let i = 0, l = lineSegments.length; i < l; i ++ ) {\n\n\t\tconst ls = lineSegments[ i ];\n\t\tconst vertices = ls.vertices;\n\t\tconst v0 = vertices[ 0 ];\n\t\tconst v1 = vertices[ 1 ];\n\t\thardEdges.add( hashEdge( v0, v1 ) );\n\t\thardEdges.add( hashEdge( v1, v0 ) );\n\n\t\t// only generate the hard edge ray map if we're checking subsegments because it's more expensive to check\n\t\t// and requires more memory.\n\t\tif ( checkSubSegments ) {\n\n\t\t\t// add both ray directions to the map\n\t\t\tconst ray = toNormalizedRay( v0, v1, new Ray() );\n\t\t\tconst rh1 = hashRay( ray );\n\t\t\tif ( ! hardEdgeRays.has( rh1 ) ) {\n\n\t\t\t\ttoNormalizedRay( v1, v0, ray );\n\t\t\t\tconst rh2 = hashRay( ray );\n\n\t\t\t\tconst info = {\n\t\t\t\t\tray,\n\t\t\t\t\tdistances: [],\n\t\t\t\t};\n\n\t\t\t\thardEdgeRays.set( rh1, info );\n\t\t\t\thardEdgeRays.set( rh2, info );\n\n\t\t\t}\n\n\t\t\t// store both segments ends in min, max order in the distances array to check if a face edge is a\n\t\t\t// subsegment later.\n\t\t\tconst info = hardEdgeRays.get( rh1 );\n\t\t\tlet d0 = info.ray.direction.dot( v0 );\n\t\t\tlet d1 = info.ray.direction.dot( v1 );\n\t\t\tif ( d0 > d1 ) {\n\n\t\t\t\t[ d0, d1 ] = [ d1, d0 ];\n\n\t\t\t}\n\n\t\t\tinfo.distances.push( d0, d1 );\n\n\t\t}\n\n\t}\n\n\t// track the half edges associated with each triangle\n\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tconst tri = faces[ i ];\n\t\tconst vertices = tri.vertices;\n\t\tconst vertCount = vertices.length;\n\t\tfor ( let i2 = 0; i2 < vertCount; i2 ++ ) {\n\n\t\t\tconst index = i2;\n\t\t\tconst next = ( i2 + 1 ) % vertCount;\n\t\t\tconst v0 = vertices[ index ];\n\t\t\tconst v1 = vertices[ next ];\n\t\t\tconst hash = hashEdge( v0, v1 );\n\n\t\t\t// don't add the triangle if the edge is supposed to be hard\n\t\t\tif ( hardEdges.has( hash ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if checking subsegments then check to see if this edge lies on a hard edge ray and whether its within any ray bounds\n\t\t\tif ( checkSubSegments ) {\n\n\t\t\t\ttoNormalizedRay( v0, v1, _ray );\n\n\t\t\t\tconst rayHash = hashRay( _ray );\n\t\t\t\tif ( hardEdgeRays.has( rayHash ) ) {\n\n\t\t\t\t\tconst info = hardEdgeRays.get( rayHash );\n\t\t\t\t\tconst { ray, distances } = info;\n\t\t\t\t\tlet d0 = ray.direction.dot( v0 );\n\t\t\t\t\tlet d1 = ray.direction.dot( v1 );\n\n\t\t\t\t\tif ( d0 > d1 ) {\n\n\t\t\t\t\t\t[ d0, d1 ] = [ d1, d0 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// return early if the face edge is found to be a subsegment of a line edge meaning the edge will have \"hard\" normals\n\t\t\t\t\tlet found = false;\n\t\t\t\t\tfor ( let i = 0, l = distances.length; i < l; i += 2 ) {\n\n\t\t\t\t\t\tif ( d0 >= distances[ i ] && d1 <= distances[ i + 1 ] ) {\n\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( found ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst info = {\n\t\t\t\tindex: index,\n\t\t\t\ttri: tri\n\t\t\t};\n\t\t\thalfEdgeList[ hash ] = info;\n\n\t\t}\n\n\t}\n\n\t// Iterate until we've tried to connect all faces to share normals\n\twhile ( true ) {\n\n\t\t// Stop if there are no more faces left\n\t\tlet halfEdge = null;\n\t\tfor ( const key in halfEdgeList ) {\n\n\t\t\thalfEdge = halfEdgeList[ key ];\n\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( halfEdge === null ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t\t// Exhaustively find all connected faces\n\t\tconst queue = [ halfEdge ];\n\t\twhile ( queue.length > 0 ) {\n\n\t\t\t// initialize all vertex normals in this triangle\n\t\t\tconst tri = queue.pop().tri;\n\t\t\tconst vertices = tri.vertices;\n\t\t\tconst vertNormals = tri.normals;\n\t\t\tconst faceNormal = tri.faceNormal;\n\n\t\t\t// Check if any edge is connected to another triangle edge\n\t\t\tconst vertCount = vertices.length;\n\t\t\tfor ( let i2 = 0; i2 < vertCount; i2 ++ ) {\n\n\t\t\t\tconst index = i2;\n\t\t\t\tconst next = ( i2 + 1 ) % vertCount;\n\t\t\t\tconst v0 = vertices[ index ];\n\t\t\t\tconst v1 = vertices[ next ];\n\n\t\t\t\t// delete this triangle from the list so it won't be found again\n\t\t\t\tconst hash = hashEdge( v0, v1 );\n\t\t\t\tdelete halfEdgeList[ hash ];\n\n\t\t\t\tconst reverseHash = hashEdge( v1, v0 );\n\t\t\t\tconst otherInfo = halfEdgeList[ reverseHash ];\n\t\t\t\tif ( otherInfo ) {\n\n\t\t\t\t\tconst otherTri = otherInfo.tri;\n\t\t\t\t\tconst otherIndex = otherInfo.index;\n\t\t\t\t\tconst otherNormals = otherTri.normals;\n\t\t\t\t\tconst otherVertCount = otherNormals.length;\n\t\t\t\t\tconst otherFaceNormal = otherTri.faceNormal;\n\n\t\t\t\t\t// NOTE: If the angle between faces is > 67.5 degrees then assume it's\n\t\t\t\t\t// hard edge. There are some cases where the line segments do not line up exactly\n\t\t\t\t\t// with or span multiple triangle edges (see Lunar Vehicle wheels).\n\t\t\t\t\tif ( Math.abs( otherTri.faceNormal.dot( tri.faceNormal ) ) < 0.25 ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if this triangle has already been traversed then it won't be in\n\t\t\t\t\t// the halfEdgeList. If it has not then add it to the queue and delete\n\t\t\t\t\t// it so it won't be found again.\n\t\t\t\t\tif ( reverseHash in halfEdgeList ) {\n\n\t\t\t\t\t\tqueue.push( otherInfo );\n\t\t\t\t\t\tdelete halfEdgeList[ reverseHash ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// share the first normal\n\t\t\t\t\tconst otherNext = ( otherIndex + 1 ) % otherVertCount;\n\t\t\t\t\tif (\n\t\t\t\t\t\tvertNormals[ index ] && otherNormals[ otherNext ] &&\n\t\t\t\t\t\tvertNormals[ index ] !== otherNormals[ otherNext ]\n\t\t\t\t\t) {\n\n\t\t\t\t\t\totherNormals[ otherNext ].norm.add( vertNormals[ index ].norm );\n\t\t\t\t\t\tvertNormals[ index ].norm = otherNormals[ otherNext ].norm;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet sharedNormal1 = vertNormals[ index ] || otherNormals[ otherNext ];\n\t\t\t\t\tif ( sharedNormal1 === null ) {\n\n\t\t\t\t\t\t// it's possible to encounter an edge of a triangle that has already been traversed meaning\n\t\t\t\t\t\t// both edges already have different normals defined and shared. To work around this we create\n\t\t\t\t\t\t// a wrapper object so when those edges are merged the normals can be updated everywhere.\n\t\t\t\t\t\tsharedNormal1 = { norm: new Vector3() };\n\t\t\t\t\t\tnormals.push( sharedNormal1.norm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( vertNormals[ index ] === null ) {\n\n\t\t\t\t\t\tvertNormals[ index ] = sharedNormal1;\n\t\t\t\t\t\tsharedNormal1.norm.add( faceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( otherNormals[ otherNext ] === null ) {\n\n\t\t\t\t\t\totherNormals[ otherNext ] = sharedNormal1;\n\t\t\t\t\t\tsharedNormal1.norm.add( otherFaceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// share the second normal\n\t\t\t\t\tif (\n\t\t\t\t\t\tvertNormals[ next ] && otherNormals[ otherIndex ] &&\n\t\t\t\t\t\tvertNormals[ next ] !== otherNormals[ otherIndex ]\n\t\t\t\t\t) {\n\n\t\t\t\t\t\totherNormals[ otherIndex ].norm.add( vertNormals[ next ].norm );\n\t\t\t\t\t\tvertNormals[ next ].norm = otherNormals[ otherIndex ].norm;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet sharedNormal2 = vertNormals[ next ] || otherNormals[ otherIndex ];\n\t\t\t\t\tif ( sharedNormal2 === null ) {\n\n\t\t\t\t\t\tsharedNormal2 = { norm: new Vector3() };\n\t\t\t\t\t\tnormals.push( sharedNormal2.norm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( vertNormals[ next ] === null ) {\n\n\t\t\t\t\t\tvertNormals[ next ] = sharedNormal2;\n\t\t\t\t\t\tsharedNormal2.norm.add( faceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( otherNormals[ otherIndex ] === null ) {\n\n\t\t\t\t\t\totherNormals[ otherIndex ] = sharedNormal2;\n\t\t\t\t\t\tsharedNormal2.norm.add( otherFaceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// The normals of each face have been added up so now we average them by normalizing the vector.\n\tfor ( let i = 0, l = normals.length; i < l; i ++ ) {\n\n\t\tnormals[ i ].normalize();\n\n\t}\n\n}\n\nfunction isPartType( type ) {\n\n\treturn type === 'Part' || type === 'Unofficial_Part';\n\n}\n\nfunction isPrimitiveType( type ) {\n\n\treturn /primitive/i.test( type ) || type === 'Subpart';\n\n}\n\nclass LineParser {\n\n\tconstructor( line, lineNumber ) {\n\n\t\tthis.line = line;\n\t\tthis.lineLength = line.length;\n\t\tthis.currentCharIndex = 0;\n\t\tthis.currentChar = ' ';\n\t\tthis.lineNumber = lineNumber;\n\n\t}\n\n\tseekNonSpace() {\n\n\t\twhile ( this.currentCharIndex < this.lineLength ) {\n\n\t\t\tthis.currentChar = this.line.charAt( this.currentCharIndex );\n\n\t\t\tif ( this.currentChar !== ' ' && this.currentChar !== '\\t' ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.currentCharIndex ++;\n\n\t\t}\n\n\t}\n\n\tgetToken() {\n\n\t\tconst pos0 = this.currentCharIndex ++;\n\n\t\t// Seek space\n\t\twhile ( this.currentCharIndex < this.lineLength ) {\n\n\t\t\tthis.currentChar = this.line.charAt( this.currentCharIndex );\n\n\t\t\tif ( this.currentChar === ' ' || this.currentChar === '\\t' ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.currentCharIndex ++;\n\n\t\t}\n\n\t\tconst pos1 = this.currentCharIndex;\n\n\t\tthis.seekNonSpace();\n\n\t\treturn this.line.substring( pos0, pos1 );\n\n\t}\n\n\tgetVector() {\n\n\t\treturn new Vector3( parseFloat( this.getToken() ), parseFloat( this.getToken() ), parseFloat( this.getToken() ) );\n\n\t}\n\n\tgetRemainingString() {\n\n\t\treturn this.line.substring( this.currentCharIndex, this.lineLength );\n\n\t}\n\n\tisAtTheEnd() {\n\n\t\treturn this.currentCharIndex >= this.lineLength;\n\n\t}\n\n\tsetToEnd() {\n\n\t\tthis.currentCharIndex = this.lineLength;\n\n\t}\n\n\tgetLineNumberString() {\n\n\t\treturn this.lineNumber >= 0 ? ' at line ' + this.lineNumber : '';\n\n\t}\n\n}\n\n// Fetches and parses an intermediate representation of LDraw parts files.\nclass LDrawParsedCache {\n\n\tconstructor( loader ) {\n\n\t\tthis.loader = loader;\n\t\tthis._cache = {};\n\n\t}\n\n\tcloneResult( original ) {\n\n\t\tconst result = {};\n\n\t\t// vertices are transformed and normals computed before being converted to geometry\n\t\t// so these pieces must be cloned.\n\t\tresult.faces = original.faces.map( face => {\n\n\t\t\treturn {\n\t\t\t\tcolorCode: face.colorCode,\n\t\t\t\tmaterial: face.material,\n\t\t\t\tvertices: face.vertices.map( v => v.clone() ),\n\t\t\t\tnormals: face.normals.map( () => null ),\n\t\t\t\tfaceNormal: null\n\t\t\t};\n\n\t\t} );\n\n\t\tresult.conditionalSegments = original.conditionalSegments.map( face => {\n\n\t\t\treturn {\n\t\t\t\tcolorCode: face.colorCode,\n\t\t\t\tmaterial: face.material,\n\t\t\t\tvertices: face.vertices.map( v => v.clone() ),\n\t\t\t\tcontrolPoints: face.controlPoints.map( v => v.clone() )\n\t\t\t};\n\n\t\t} );\n\n\t\tresult.lineSegments = original.lineSegments.map( face => {\n\n\t\t\treturn {\n\t\t\t\tcolorCode: face.colorCode,\n\t\t\t\tmaterial: face.material,\n\t\t\t\tvertices: face.vertices.map( v => v.clone() )\n\t\t\t};\n\n\t\t} );\n\n\t\t// none if this is subsequently modified\n\t\tresult.type = original.type;\n\t\tresult.category = original.category;\n\t\tresult.keywords = original.keywords;\n\t\tresult.author = original.author;\n\t\tresult.subobjects = original.subobjects;\n\t\tresult.fileName = original.fileName;\n\t\tresult.totalFaces = original.totalFaces;\n\t\tresult.startingBuildingStep = original.startingBuildingStep;\n\t\tresult.materials = original.materials;\n\t\tresult.group = null;\n\t\treturn result;\n\n\t}\n\n\tasync fetchData( fileName ) {\n\n\t\tlet triedLowerCase = false;\n\t\tlet locationState = FILE_LOCATION_TRY_PARTS;\n\t\twhile ( locationState !== FILE_LOCATION_NOT_FOUND ) {\n\n\t\t\tlet subobjectURL = fileName;\n\t\t\tswitch ( locationState ) {\n\n\t\t\t\tcase FILE_LOCATION_AS_IS:\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_PARTS:\n\t\t\t\t\tsubobjectURL = 'parts/' + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_P:\n\t\t\t\t\tsubobjectURL = 'p/' + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_MODELS:\n\t\t\t\t\tsubobjectURL = 'models/' + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_RELATIVE:\n\t\t\t\t\tsubobjectURL = fileName.substring( 0, fileName.lastIndexOf( '/' ) + 1 ) + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_ABSOLUTE:\n\n\t\t\t\t\tif ( triedLowerCase ) {\n\n\t\t\t\t\t\t// Try absolute path\n\t\t\t\t\t\tlocationState = FILE_LOCATION_NOT_FOUND;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Next attempt is lower case\n\t\t\t\t\t\tfileName = fileName.toLowerCase();\n\t\t\t\t\t\tsubobjectURL = fileName;\n\t\t\t\t\t\ttriedLowerCase = true;\n\t\t\t\t\t\tlocationState = FILE_LOCATION_TRY_PARTS;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tconst loader = this.loader;\n\t\t\tconst fileLoader = new FileLoader( loader.manager );\n\t\t\tfileLoader.setPath( loader.partsLibraryPath );\n\t\t\tfileLoader.setRequestHeader( loader.requestHeader );\n\t\t\tfileLoader.setWithCredentials( loader.withCredentials );\n\n\t\t\ttry {\n\n\t\t\t\tconst text = await fileLoader.loadAsync( subobjectURL );\n\t\t\t\treturn text;\n\n\t\t\t} catch ( _ ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthrow new Error( 'LDrawLoader: Subobject \"' + fileName + '\" could not be loaded.' );\n\n\t}\n\n\tparse( text, fileName = null ) {\n\n\t\tconst loader = this.loader;\n\n\t\t// final results\n\t\tconst faces = [];\n\t\tconst lineSegments = [];\n\t\tconst conditionalSegments = [];\n\t\tconst subobjects = [];\n\t\tconst materials = {};\n\n\t\tconst getLocalMaterial = colorCode => {\n\n\t\t\treturn materials[ colorCode ] || null;\n\n\t\t};\n\n\t\tlet type = 'Model';\n\t\tlet category = null;\n\t\tlet keywords = null;\n\t\tlet author = null;\n\t\tlet totalFaces = 0;\n\n\t\t// split into lines\n\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t}\n\n\t\tconst lines = text.split( '\\n' );\n\t\tconst numLines = lines.length;\n\n\t\tlet parsingEmbeddedFiles = false;\n\t\tlet currentEmbeddedFileName = null;\n\t\tlet currentEmbeddedText = null;\n\n\t\tlet bfcCertified = false;\n\t\tlet bfcCCW = true;\n\t\tlet bfcInverted = false;\n\t\tlet bfcCull = true;\n\n\t\tlet startingBuildingStep = false;\n\n\t\t// Parse all line commands\n\t\tfor ( let lineIndex = 0; lineIndex < numLines; lineIndex ++ ) {\n\n\t\t\tconst line = lines[ lineIndex ];\n\n\t\t\tif ( line.length === 0 ) continue;\n\n\t\t\tif ( parsingEmbeddedFiles ) {\n\n\t\t\t\tif ( line.startsWith( '0 FILE ' ) ) {\n\n\t\t\t\t\t// Save previous embedded file in the cache\n\t\t\t\t\tthis.setData( currentEmbeddedFileName, currentEmbeddedText );\n\n\t\t\t\t\t// New embedded text file\n\t\t\t\t\tcurrentEmbeddedFileName = line.substring( 7 );\n\t\t\t\t\tcurrentEmbeddedText = '';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentEmbeddedText += line + '\\n';\n\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst lp = new LineParser( line, lineIndex + 1 );\n\t\t\tlp.seekNonSpace();\n\n\t\t\tif ( lp.isAtTheEnd() ) {\n\n\t\t\t\t// Empty line\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Parse the line type\n\t\t\tconst lineType = lp.getToken();\n\n\t\t\tlet material;\n\t\t\tlet colorCode;\n\t\t\tlet segment;\n\t\t\tlet ccw;\n\t\t\tlet doubleSided;\n\t\t\tlet v0, v1, v2, v3, c0, c1;\n\n\t\t\tswitch ( lineType ) {\n\n\t\t\t\t// Line type 0: Comment or META\n\t\t\t\tcase '0':\n\n\t\t\t\t\t// Parse meta directive\n\t\t\t\t\tconst meta = lp.getToken();\n\n\t\t\t\t\tif ( meta ) {\n\n\t\t\t\t\t\tswitch ( meta ) {\n\n\t\t\t\t\t\t\tcase '!LDRAW_ORG':\n\n\t\t\t\t\t\t\t\ttype = lp.getToken();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '!COLOUR':\n\n\t\t\t\t\t\t\t\tmaterial = loader.parseColorMetaDirective( lp );\n\t\t\t\t\t\t\t\tif ( material ) {\n\n\t\t\t\t\t\t\t\t\tmaterials[ material.userData.code ] = material;\n\n\t\t\t\t\t\t\t\t}\telse {\n\n\t\t\t\t\t\t\t\t\tconsole.warn( 'LDrawLoader: Error parsing material' + lp.getLineNumberString() );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '!CATEGORY':\n\n\t\t\t\t\t\t\t\tcategory = lp.getToken();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '!KEYWORDS':\n\n\t\t\t\t\t\t\t\tconst newKeywords = lp.getRemainingString().split( ',' );\n\t\t\t\t\t\t\t\tif ( newKeywords.length > 0 ) {\n\n\t\t\t\t\t\t\t\t\tif ( ! keywords ) {\n\n\t\t\t\t\t\t\t\t\t\tkeywords = [];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tnewKeywords.forEach( function ( keyword ) {\n\n\t\t\t\t\t\t\t\t\t\tkeywords.push( keyword.trim() );\n\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'FILE':\n\n\t\t\t\t\t\t\t\tif ( lineIndex > 0 ) {\n\n\t\t\t\t\t\t\t\t\t// Start embedded text files parsing\n\t\t\t\t\t\t\t\t\tparsingEmbeddedFiles = true;\n\t\t\t\t\t\t\t\t\tcurrentEmbeddedFileName = lp.getRemainingString();\n\t\t\t\t\t\t\t\t\tcurrentEmbeddedText = '';\n\n\t\t\t\t\t\t\t\t\tbfcCertified = false;\n\t\t\t\t\t\t\t\t\tbfcCCW = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'BFC':\n\n\t\t\t\t\t\t\t\t// Changes to the backface culling state\n\t\t\t\t\t\t\t\twhile ( ! lp.isAtTheEnd() ) {\n\n\t\t\t\t\t\t\t\t\tconst token = lp.getToken();\n\n\t\t\t\t\t\t\t\t\tswitch ( token ) {\n\n\t\t\t\t\t\t\t\t\t\tcase 'CERTIFY':\n\t\t\t\t\t\t\t\t\t\tcase 'NOCERTIFY':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcCertified = token === 'CERTIFY';\n\t\t\t\t\t\t\t\t\t\t\tbfcCCW = true;\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'CW':\n\t\t\t\t\t\t\t\t\t\tcase 'CCW':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcCCW = token === 'CCW';\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'INVERTNEXT':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcInverted = true;\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'CLIP':\n\t\t\t\t\t\t\t\t\t\tcase 'NOCLIP':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcCull = token === 'CLIP';\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.LDrawLoader: BFC directive \"' + token + '\" is unknown.' );\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'STEP':\n\n\t\t\t\t\t\t\t\tstartingBuildingStep = true;\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'Author:':\n\n\t\t\t\t\t\t\t\tauthor = lp.getToken();\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t// Other meta directives are not implemented\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 1: Sub-object file\n\t\t\t\tcase '1':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\n\t\t\t\t\tconst posX = parseFloat( lp.getToken() );\n\t\t\t\t\tconst posY = parseFloat( lp.getToken() );\n\t\t\t\t\tconst posZ = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m0 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m1 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m2 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m3 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m4 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m5 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m6 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m7 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m8 = parseFloat( lp.getToken() );\n\n\t\t\t\t\tconst matrix = new Matrix4().set(\n\t\t\t\t\t\tm0, m1, m2, posX,\n\t\t\t\t\t\tm3, m4, m5, posY,\n\t\t\t\t\t\tm6, m7, m8, posZ,\n\t\t\t\t\t\t0, 0, 0, 1\n\t\t\t\t\t);\n\n\t\t\t\t\tlet fileName = lp.getRemainingString().trim().replace( /\\\\/g, '/' );\n\n\t\t\t\t\tif ( loader.fileMap[ fileName ] ) {\n\n\t\t\t\t\t\t// Found the subobject path in the preloaded file path map\n\t\t\t\t\t\tfileName = loader.fileMap[ fileName ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Standardized subfolders\n\t\t\t\t\t\tif ( fileName.startsWith( 's/' ) ) {\n\n\t\t\t\t\t\t\tfileName = 'parts/' + fileName;\n\n\t\t\t\t\t\t} else if ( fileName.startsWith( '48/' ) ) {\n\n\t\t\t\t\t\t\tfileName = 'p/' + fileName;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tsubobjects.push( {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tmatrix: matrix,\n\t\t\t\t\t\tfileName: fileName,\n\t\t\t\t\t\tinverted: bfcInverted,\n\t\t\t\t\t\tstartingBuildingStep: startingBuildingStep\n\t\t\t\t\t} );\n\n\t\t\t\t\tstartingBuildingStep = false;\n\t\t\t\t\tbfcInverted = false;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 2: Line segment\n\t\t\t\tcase '2':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\tv1 = lp.getVector();\n\n\t\t\t\t\tsegment = {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tvertices: [ v0, v1 ],\n\t\t\t\t\t};\n\n\t\t\t\t\tlineSegments.push( segment );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 5: Conditional Line segment\n\t\t\t\tcase '5':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\tc0 = lp.getVector();\n\t\t\t\t\tc1 = lp.getVector();\n\n\t\t\t\t\tsegment = {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tvertices: [ v0, v1 ],\n\t\t\t\t\t\tcontrolPoints: [ c0, c1 ],\n\t\t\t\t\t};\n\n\t\t\t\t\tconditionalSegments.push( segment );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 3: Triangle\n\t\t\t\tcase '3':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tccw = bfcCCW;\n\t\t\t\t\tdoubleSided = ! bfcCertified || ! bfcCull;\n\n\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv2 = lp.getVector();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv2 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv0 = lp.getVector();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\tvertices: [ v0, v1, v2 ],\n\t\t\t\t\t\tnormals: [ null, null, null ],\n\t\t\t\t\t} );\n\t\t\t\t\ttotalFaces ++;\n\n\t\t\t\t\tif ( doubleSided === true ) {\n\n\t\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\t\tvertices: [ v2, v1, v0 ],\n\t\t\t\t\t\t\tnormals: [ null, null, null ],\n\t\t\t\t\t\t} );\n\t\t\t\t\t\ttotalFaces ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 4: Quadrilateral\n\t\t\t\tcase '4':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tccw = bfcCCW;\n\t\t\t\t\tdoubleSided = ! bfcCertified || ! bfcCull;\n\n\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv2 = lp.getVector();\n\t\t\t\t\t\tv3 = lp.getVector();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv3 = lp.getVector();\n\t\t\t\t\t\tv2 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv0 = lp.getVector();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// specifically place the triangle diagonal in the v0 and v1 slots so we can\n\t\t\t\t\t// account for the doubling of vertices later when smoothing normals.\n\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\tvertices: [ v0, v1, v2, v3 ],\n\t\t\t\t\t\tnormals: [ null, null, null, null ],\n\t\t\t\t\t} );\n\t\t\t\t\ttotalFaces += 2;\n\n\t\t\t\t\tif ( doubleSided === true ) {\n\n\t\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\t\tvertices: [ v3, v2, v1, v0 ],\n\t\t\t\t\t\t\tnormals: [ null, null, null, null ],\n\t\t\t\t\t\t} );\n\t\t\t\t\t\ttotalFaces += 2;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'LDrawLoader: Unknown line type \"' + lineType + '\"' + lp.getLineNumberString() + '.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parsingEmbeddedFiles ) {\n\n\t\t\tthis.setData( currentEmbeddedFileName, currentEmbeddedText );\n\n\t\t}\n\n\t\treturn {\n\t\t\tfaces,\n\t\t\tconditionalSegments,\n\t\t\tlineSegments,\n\t\t\ttype,\n\t\t\tcategory,\n\t\t\tkeywords,\n\t\t\tauthor,\n\t\t\tsubobjects,\n\t\t\ttotalFaces,\n\t\t\tstartingBuildingStep,\n\t\t\tmaterials,\n\t\t\tfileName,\n\t\t\tgroup: null\n\t\t};\n\n\t}\n\n\t// returns an (optionally cloned) instance of the data\n\tgetData( fileName, clone = true ) {\n\n\t\tconst key = fileName.toLowerCase();\n\t\tconst result = this._cache[ key ];\n\t\tif ( result === null || result instanceof Promise ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( clone ) {\n\n\t\t\treturn this.cloneResult( result );\n\n\t\t} else {\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\t// kicks off a fetch and parse of the requested data if it hasn't already been loaded. Returns when\n\t// the data is ready to use and can be retrieved synchronously with \"getData\".\n\tasync ensureDataLoaded( fileName ) {\n\n\t\tconst key = fileName.toLowerCase();\n\t\tif ( ! ( key in this._cache ) ) {\n\n\t\t\t// replace the promise with a copy of the parsed data for immediate processing\n\t\t\tthis._cache[ key ] = this.fetchData( fileName ).then( text => {\n\n\t\t\t\tconst info = this.parse( text, fileName );\n\t\t\t\tthis._cache[ key ] = info;\n\t\t\t\treturn info;\n\n\t\t\t} );\n\n\t\t}\n\n\t\tawait this._cache[ key ];\n\n\t}\n\n\t// sets the data in the cache from parsed data\n\tsetData( fileName, text ) {\n\n\t\tconst key = fileName.toLowerCase();\n\t\tthis._cache[ key ] = this.parse( text, fileName );\n\n\t}\n\n}\n\n// returns the material for an associated color code. If the color code is 16 for a face or 24 for\n// an edge then the passthroughColorCode is used.\nfunction getMaterialFromCode( colorCode, parentColorCode, materialHierarchy, forEdge ) {\n\n\tconst isPassthrough = ! forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;\n\tif ( isPassthrough ) {\n\n\t\tcolorCode = parentColorCode;\n\n\t}\n\n\treturn materialHierarchy[ colorCode ] || null;\n\n}\n\n// Class used to parse and build LDraw parts as three.js objects and cache them if they're a \"Part\" type.\nclass LDrawPartsGeometryCache {\n\n\tconstructor( loader ) {\n\n\t\tthis.loader = loader;\n\t\tthis.parseCache = new LDrawParsedCache( loader );\n\t\tthis._cache = {};\n\n\t}\n\n\t// Convert the given file information into a mesh by processing subobjects.\n\tasync processIntoMesh( info ) {\n\n\t\tconst loader = this.loader;\n\t\tconst parseCache = this.parseCache;\n\t\tconst faceMaterials = new Set();\n\n\t\t// Processes the part subobject information to load child parts and merge geometry onto part\n\t\t// piece object.\n\t\tconst processInfoSubobjects = async ( info, subobject = null ) => {\n\n\t\t\tconst subobjects = info.subobjects;\n\t\t\tconst promises = [];\n\n\t\t\t// Trigger load of all subobjects. If a subobject isn't a primitive then load it as a separate\n\t\t\t// group which lets instruction steps apply correctly.\n\t\t\tfor ( let i = 0, l = subobjects.length; i < l; i ++ ) {\n\n\t\t\t\tconst subobject = subobjects[ i ];\n\t\t\t\tconst promise = parseCache.ensureDataLoaded( subobject.fileName ).then( () => {\n\n\t\t\t\t\tconst subobjectInfo = parseCache.getData( subobject.fileName, false );\n\t\t\t\t\tif ( ! isPrimitiveType( subobjectInfo.type ) ) {\n\n\t\t\t\t\t\treturn this.loadModel( subobject.fileName ).catch( error => {\n\n\t\t\t\t\t\t\tconsole.warn( error );\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn processInfoSubobjects( parseCache.getData( subobject.fileName ), subobject );\n\n\t\t\t\t} );\n\n\t\t\t\tpromises.push( promise );\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\t\t\tgroup.userData.category = info.category;\n\t\t\tgroup.userData.keywords = info.keywords;\n\t\t\tgroup.userData.author = info.author;\n\t\t\tgroup.userData.type = info.type;\n\t\t\tgroup.userData.fileName = info.fileName;\n\t\t\tinfo.group = group;\n\n\t\t\tconst subobjectInfos = await Promise.all( promises );\n\t\t\tfor ( let i = 0, l = subobjectInfos.length; i < l; i ++ ) {\n\n\t\t\t\tconst subobject = info.subobjects[ i ];\n\t\t\t\tconst subobjectInfo = subobjectInfos[ i ];\n\n\t\t\t\tif ( subobjectInfo === null ) {\n\n\t\t\t\t\t// the subobject failed to load\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// if the subobject was loaded as a separate group then apply the parent scopes materials\n\t\t\t\tif ( subobjectInfo.isGroup ) {\n\n\t\t\t\t\tconst subobjectGroup = subobjectInfo;\n\t\t\t\t\tsubobject.matrix.decompose( subobjectGroup.position, subobjectGroup.quaternion, subobjectGroup.scale );\n\t\t\t\t\tsubobjectGroup.userData.startingBuildingStep = subobject.startingBuildingStep;\n\t\t\t\t\tsubobjectGroup.name = subobject.fileName;\n\n\t\t\t\t\tloader.applyMaterialsToMesh( subobjectGroup, subobject.colorCode, info.materials );\n\t\t\t\t\tsubobjectGroup.userData.colorCode = subobject.colorCode;\n\n\t\t\t\t\tgroup.add( subobjectGroup );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// add the subobject group if it has children in case it has both children and primitives\n\t\t\t\tif ( subobjectInfo.group.children.length ) {\n\n\t\t\t\t\tgroup.add( subobjectInfo.group );\n\n\t\t\t\t}\n\n\t\t\t\t// transform the primitives into the local space of the parent piece and append them to\n\t\t\t\t// to the parent primitives list.\n\t\t\t\tconst parentLineSegments = info.lineSegments;\n\t\t\t\tconst parentConditionalSegments = info.conditionalSegments;\n\t\t\t\tconst parentFaces = info.faces;\n\n\t\t\t\tconst lineSegments = subobjectInfo.lineSegments;\n\t\t\t\tconst conditionalSegments = subobjectInfo.conditionalSegments;\n\n\t\t\t\tconst faces = subobjectInfo.faces;\n\t\t\t\tconst matrix = subobject.matrix;\n\t\t\t\tconst inverted = subobject.inverted;\n\t\t\t\tconst matrixScaleInverted = matrix.determinant() < 0;\n\t\t\t\tconst colorCode = subobject.colorCode;\n\n\t\t\t\tconst lineColorCode = colorCode === MAIN_COLOUR_CODE ? MAIN_EDGE_COLOUR_CODE : colorCode;\n\t\t\t\tfor ( let i = 0, l = lineSegments.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst ls = lineSegments[ i ];\n\t\t\t\t\tconst vertices = ls.vertices;\n\t\t\t\t\tvertices[ 0 ].applyMatrix4( matrix );\n\t\t\t\t\tvertices[ 1 ].applyMatrix4( matrix );\n\t\t\t\t\tls.colorCode = ls.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : ls.colorCode;\n\t\t\t\t\tls.material = ls.material || getMaterialFromCode( ls.colorCode, ls.colorCode, info.materials, true );\n\n\t\t\t\t\tparentLineSegments.push( ls );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, l = conditionalSegments.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst os = conditionalSegments[ i ];\n\t\t\t\t\tconst vertices = os.vertices;\n\t\t\t\t\tconst controlPoints = os.controlPoints;\n\t\t\t\t\tvertices[ 0 ].applyMatrix4( matrix );\n\t\t\t\t\tvertices[ 1 ].applyMatrix4( matrix );\n\t\t\t\t\tcontrolPoints[ 0 ].applyMatrix4( matrix );\n\t\t\t\t\tcontrolPoints[ 1 ].applyMatrix4( matrix );\n\t\t\t\t\tos.colorCode = os.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : os.colorCode;\n\t\t\t\t\tos.material = os.material || getMaterialFromCode( os.colorCode, os.colorCode, info.materials, true );\n\n\t\t\t\t\tparentConditionalSegments.push( os );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst tri = faces[ i ];\n\t\t\t\t\tconst vertices = tri.vertices;\n\t\t\t\t\tfor ( let i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tvertices[ i ].applyMatrix4( matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttri.colorCode = tri.colorCode === MAIN_COLOUR_CODE ? colorCode : tri.colorCode;\n\t\t\t\t\ttri.material = tri.material || getMaterialFromCode( tri.colorCode, colorCode, info.materials, false );\n\t\t\t\t\tfaceMaterials.add( tri.colorCode );\n\n\t\t\t\t\t// If the scale of the object is negated then the triangle winding order\n\t\t\t\t\t// needs to be flipped.\n\t\t\t\t\tif ( matrixScaleInverted !== inverted ) {\n\n\t\t\t\t\t\tvertices.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tparentFaces.push( tri );\n\n\t\t\t\t}\n\n\t\t\t\tinfo.totalFaces += subobjectInfo.totalFaces;\n\n\t\t\t}\n\n\t\t\t// Apply the parent subobjects pass through material code to this object. This is done several times due\n\t\t\t// to material scoping.\n\t\t\tif ( subobject ) {\n\n\t\t\t\tloader.applyMaterialsToMesh( group, subobject.colorCode, info.materials );\n\t\t\t\tgroup.userData.colorCode = subobject.colorCode;\n\n\t\t\t}\n\n\t\t\treturn info;\n\n\t\t};\n\n\t\t// Track material use to see if we need to use the normal smooth slow path for hard edges.\n\t\tfor ( let i = 0, l = info.faces; i < l; i ++ ) {\n\n\t\t\tfaceMaterials.add( info.faces[ i ].colorCode );\n\n\t\t}\n\n\t\tawait processInfoSubobjects( info );\n\n\t\tif ( loader.smoothNormals ) {\n\n\t\t\tconst checkSubSegments = faceMaterials.size > 1;\n\t\t\tgenerateFaceNormals( info.faces );\n\t\t\tsmoothNormals( info.faces, info.lineSegments, checkSubSegments );\n\n\t\t}\n\n\t\t// Add the primitive objects and metadata.\n\t\tconst group = info.group;\n\t\tif ( info.faces.length > 0 ) {\n\n\t\t\tgroup.add( createObject( this.loader, info.faces, 3, false, info.totalFaces ) );\n\n\t\t}\n\n\t\tif ( info.lineSegments.length > 0 ) {\n\n\t\t\tgroup.add( createObject( this.loader, info.lineSegments, 2 ) );\n\n\t\t}\n\n\t\tif ( info.conditionalSegments.length > 0 ) {\n\n\t\t\tgroup.add( createObject( this.loader, info.conditionalSegments, 2, true ) );\n\n\t\t}\n\n\t\treturn group;\n\n\t}\n\n\thasCachedModel( fileName ) {\n\n\t\treturn fileName !== null && fileName.toLowerCase() in this._cache;\n\n\t}\n\n\tasync getCachedModel( fileName ) {\n\n\t\tif ( fileName !== null && this.hasCachedModel( fileName ) ) {\n\n\t\t\tconst key = fileName.toLowerCase();\n\t\t\tconst group = await this._cache[ key ];\n\t\t\treturn group.clone();\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t// Loads and parses the model with the given file name. Returns a cached copy if available.\n\tasync loadModel( fileName ) {\n\n\t\tconst parseCache = this.parseCache;\n\t\tconst key = fileName.toLowerCase();\n\t\tif ( this.hasCachedModel( fileName ) ) {\n\n\t\t\t// Return cached model if available.\n\t\t\treturn this.getCachedModel( fileName );\n\n\t\t} else {\n\n\t\t\t// Otherwise parse a new model.\n\t\t\t// Ensure the file data is loaded and pre parsed.\n\t\t\tawait parseCache.ensureDataLoaded( fileName );\n\n\t\t\tconst info = parseCache.getData( fileName );\n\t\t\tconst promise = this.processIntoMesh( info );\n\n\t\t\t// Now that the file has loaded it's possible that another part parse has been waiting in parallel\n\t\t\t// so check the cache again to see if it's been added since the last async operation so we don't\n\t\t\t// do unnecessary work.\n\t\t\tif ( this.hasCachedModel( fileName ) ) {\n\n\t\t\t\treturn this.getCachedModel( fileName );\n\n\t\t\t}\n\n\t\t\t// Cache object if it's a part so it can be reused later.\n\t\t\tif ( isPartType( info.type ) ) {\n\n\t\t\t\tthis._cache[ key ] = promise;\n\n\t\t\t}\n\n\t\t\t// return a copy\n\t\t\tconst group = await promise;\n\t\t\treturn group.clone();\n\n\t\t}\n\n\t}\n\n\t// parses the given model text into a renderable object. Returns cached copy if available.\n\tasync parseModel( text ) {\n\n\t\tconst parseCache = this.parseCache;\n\t\tconst info = parseCache.parse( text );\n\t\tif ( isPartType( info.type ) && this.hasCachedModel( info.fileName ) ) {\n\n\t\t\treturn this.getCachedModel( info.fileName );\n\n\t\t}\n\n\t\treturn this.processIntoMesh( info );\n\n\t}\n\n}\n\nfunction sortByMaterial( a, b ) {\n\n\tif ( a.colorCode === b.colorCode ) {\n\n\t\treturn 0;\n\n\t}\n\n\tif ( a.colorCode < b.colorCode ) {\n\n\t\treturn - 1;\n\n\t}\n\n\treturn 1;\n\n}\n\nfunction createObject( loader, elements, elementSize, isConditionalSegments = false, totalElements = null ) {\n\n\t// Creates a LineSegments (elementSize = 2) or a Mesh (elementSize = 3 )\n\t// With per face / segment material, implemented with mesh groups and materials array\n\n\t// Sort the faces or line segments by color code to make later the mesh groups\n\telements.sort( sortByMaterial );\n\n\tif ( totalElements === null ) {\n\n\t\ttotalElements = elements.length;\n\n\t}\n\n\tconst positions = new Float32Array( elementSize * totalElements * 3 );\n\tconst normals = elementSize === 3 ? new Float32Array( elementSize * totalElements * 3 ) : null;\n\tconst materials = [];\n\n\tconst quadArray = new Array( 6 );\n\tconst bufferGeometry = new BufferGeometry();\n\tlet prevMaterial = null;\n\tlet index0 = 0;\n\tlet numGroupVerts = 0;\n\tlet offset = 0;\n\n\tfor ( let iElem = 0, nElem = elements.length; iElem < nElem; iElem ++ ) {\n\n\t\tconst elem = elements[ iElem ];\n\t\tlet vertices = elem.vertices;\n\t\tif ( vertices.length === 4 ) {\n\n\t\t\tquadArray[ 0 ] = vertices[ 0 ];\n\t\t\tquadArray[ 1 ] = vertices[ 1 ];\n\t\t\tquadArray[ 2 ] = vertices[ 2 ];\n\t\t\tquadArray[ 3 ] = vertices[ 0 ];\n\t\t\tquadArray[ 4 ] = vertices[ 2 ];\n\t\t\tquadArray[ 5 ] = vertices[ 3 ];\n\t\t\tvertices = quadArray;\n\n\t\t}\n\n\t\tfor ( let j = 0, l = vertices.length; j < l; j ++ ) {\n\n\t\t\tconst v = vertices[ j ];\n\t\t\tconst index = offset + j * 3;\n\t\t\tpositions[ index + 0 ] = v.x;\n\t\t\tpositions[ index + 1 ] = v.y;\n\t\t\tpositions[ index + 2 ] = v.z;\n\n\t\t}\n\n\t\t// create the normals array if this is a set of faces\n\t\tif ( elementSize === 3 ) {\n\n\t\t\tif ( ! elem.faceNormal ) {\n\n\t\t\t\tconst v0 = vertices[ 0 ];\n\t\t\t\tconst v1 = vertices[ 1 ];\n\t\t\t\tconst v2 = vertices[ 2 ];\n\t\t\t\t_tempVec0.subVectors( v1, v0 );\n\t\t\t\t_tempVec1.subVectors( v2, v1 );\n\t\t\t\telem.faceNormal = new Vector3()\n\t\t\t\t\t.crossVectors( _tempVec0, _tempVec1 )\n\t\t\t\t\t.normalize();\n\n\t\t\t}\n\n\t\t\tlet elemNormals = elem.normals;\n\t\t\tif ( elemNormals.length === 4 ) {\n\n\t\t\t\tquadArray[ 0 ] = elemNormals[ 0 ];\n\t\t\t\tquadArray[ 1 ] = elemNormals[ 1 ];\n\t\t\t\tquadArray[ 2 ] = elemNormals[ 2 ];\n\t\t\t\tquadArray[ 3 ] = elemNormals[ 0 ];\n\t\t\t\tquadArray[ 4 ] = elemNormals[ 2 ];\n\t\t\t\tquadArray[ 5 ] = elemNormals[ 3 ];\n\t\t\t\telemNormals = quadArray;\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0, l = elemNormals.length; j < l; j ++ ) {\n\n\t\t\t\t// use face normal if a vertex normal is not provided\n\t\t\t\tlet n = elem.faceNormal;\n\t\t\t\tif ( elemNormals[ j ] ) {\n\n\t\t\t\t\tn = elemNormals[ j ].norm;\n\n\t\t\t\t}\n\n\t\t\t\tconst index = offset + j * 3;\n\t\t\t\tnormals[ index + 0 ] = n.x;\n\t\t\t\tnormals[ index + 1 ] = n.y;\n\t\t\t\tnormals[ index + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( prevMaterial !== elem.colorCode ) {\n\n\t\t\tif ( prevMaterial !== null ) {\n\n\t\t\t\tbufferGeometry.addGroup( index0, numGroupVerts, materials.length - 1 );\n\n\t\t\t}\n\n\t\t\tconst material = elem.material;\n\n\t\t\tif ( material !== null ) {\n\n\t\t\t\tif ( elementSize === 3 ) {\n\n\t\t\t\t\tmaterials.push( material );\n\n\t\t\t\t} else if ( elementSize === 2 ) {\n\n\t\t\t\t\tif ( isConditionalSegments ) {\n\n\t\t\t\t\t\tconst edgeMaterial = loader.edgeMaterialCache.get( material );\n\n\t\t\t\t\t\tmaterials.push( loader.conditionalEdgeMaterialCache.get( edgeMaterial ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaterials.push( loader.edgeMaterialCache.get( material ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// If a material has not been made available yet then keep the color code string in the material array\n\t\t\t\t// to save the spot for the material once a parent scopes materials are being applied to the object.\n\t\t\t\tmaterials.push( elem.colorCode );\n\n\t\t\t}\n\n\t\t\tprevMaterial = elem.colorCode;\n\t\t\tindex0 = offset / 3;\n\t\t\tnumGroupVerts = vertices.length;\n\n\t\t} else {\n\n\t\t\tnumGroupVerts += vertices.length;\n\n\t\t}\n\n\t\toffset += 3 * vertices.length;\n\n\t}\n\n\tif ( numGroupVerts > 0 ) {\n\n\t\tbufferGeometry.addGroup( index0, Infinity, materials.length - 1 );\n\n\t}\n\n\tbufferGeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tif ( normals !== null ) {\n\n\t\tbufferGeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tlet object3d = null;\n\n\tif ( elementSize === 2 ) {\n\n\t\tif ( isConditionalSegments ) {\n\n\t\t\tobject3d = new ConditionalLineSegments( bufferGeometry, materials.length === 1 ? materials[ 0 ] : materials );\n\n\t\t} else {\n\n\t\t\tobject3d = new LineSegments( bufferGeometry, materials.length === 1 ? materials[ 0 ] : materials );\n\n\t\t}\n\n\t} else if ( elementSize === 3 ) {\n\n\t\tobject3d = new Mesh( bufferGeometry, materials.length === 1 ? materials[ 0 ] : materials );\n\n\t}\n\n\tif ( isConditionalSegments ) {\n\n\t\tobject3d.isConditionalLine = true;\n\n\t\tconst controlArray0 = new Float32Array( elements.length * 3 * 2 );\n\t\tconst controlArray1 = new Float32Array( elements.length * 3 * 2 );\n\t\tconst directionArray = new Float32Array( elements.length * 3 * 2 );\n\t\tfor ( let i = 0, l = elements.length; i < l; i ++ ) {\n\n\t\t\tconst os = elements[ i ];\n\t\t\tconst vertices = os.vertices;\n\t\t\tconst controlPoints = os.controlPoints;\n\t\t\tconst c0 = controlPoints[ 0 ];\n\t\t\tconst c1 = controlPoints[ 1 ];\n\t\t\tconst v0 = vertices[ 0 ];\n\t\t\tconst v1 = vertices[ 1 ];\n\t\t\tconst index = i * 3 * 2;\n\t\t\tcontrolArray0[ index + 0 ] = c0.x;\n\t\t\tcontrolArray0[ index + 1 ] = c0.y;\n\t\t\tcontrolArray0[ index + 2 ] = c0.z;\n\t\t\tcontrolArray0[ index + 3 ] = c0.x;\n\t\t\tcontrolArray0[ index + 4 ] = c0.y;\n\t\t\tcontrolArray0[ index + 5 ] = c0.z;\n\n\t\t\tcontrolArray1[ index + 0 ] = c1.x;\n\t\t\tcontrolArray1[ index + 1 ] = c1.y;\n\t\t\tcontrolArray1[ index + 2 ] = c1.z;\n\t\t\tcontrolArray1[ index + 3 ] = c1.x;\n\t\t\tcontrolArray1[ index + 4 ] = c1.y;\n\t\t\tcontrolArray1[ index + 5 ] = c1.z;\n\n\t\t\tdirectionArray[ index + 0 ] = v1.x - v0.x;\n\t\t\tdirectionArray[ index + 1 ] = v1.y - v0.y;\n\t\t\tdirectionArray[ index + 2 ] = v1.z - v0.z;\n\t\t\tdirectionArray[ index + 3 ] = v1.x - v0.x;\n\t\t\tdirectionArray[ index + 4 ] = v1.y - v0.y;\n\t\t\tdirectionArray[ index + 5 ] = v1.z - v0.z;\n\n\t\t}\n\n\t\tbufferGeometry.setAttribute( 'control0', new BufferAttribute( controlArray0, 3, false ) );\n\t\tbufferGeometry.setAttribute( 'control1', new BufferAttribute( controlArray1, 3, false ) );\n\t\tbufferGeometry.setAttribute( 'direction', new BufferAttribute( directionArray, 3, false ) );\n\n\t}\n\n\treturn object3d;\n\n}\n\n//\n\nclass LDrawLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t// Array of THREE.Material\n\t\tthis.materials = [];\n\t\tthis.materialLibrary = {};\n\t\tthis.edgeMaterialCache = new WeakMap();\n\t\tthis.conditionalEdgeMaterialCache = new WeakMap();\n\n\t\t// This also allows to handle the embedded text files (\"0 FILE\" lines)\n\t\tthis.partsCache = new LDrawPartsGeometryCache( this );\n\n\t\t// This object is a map from file names to paths. It agilizes the paths search. If it is not set then files will be searched by trial and error.\n\t\tthis.fileMap = {};\n\n\t\t// Initializes the materials library with default materials\n\t\tthis.setMaterials( [] );\n\n\t\t// If this flag is set to true the vertex normals will be smoothed.\n\t\tthis.smoothNormals = true;\n\n\t\t// The path to load parts from the LDraw parts library from.\n\t\tthis.partsLibraryPath = '';\n\n\t\t// Material assigned to not available colors for meshes and edges\n\t\tthis.missingColorMaterial = new MeshStandardMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF, roughness: 0.3, metalness: 0 } );\n\t\tthis.missingEdgeColorMaterial = new LineBasicMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF } );\n\t\tthis.missingConditionalEdgeColorMaterial = new LDrawConditionalLineMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, fog: true, color: 0xFF00FF } );\n\t\tthis.edgeMaterialCache.set( this.missingColorMaterial, this.missingEdgeColorMaterial );\n\t\tthis.conditionalEdgeMaterialCache.set( this.missingEdgeColorMaterial, this.missingConditionalEdgeColorMaterial );\n\n\t}\n\n\tsetPartsLibraryPath( path ) {\n\n\t\tthis.partsLibraryPath = path;\n\t\treturn this;\n\n\t}\n\n\tasync preloadMaterials( url ) {\n\n\t\tconst fileLoader = new FileLoader( this.manager );\n\t\tfileLoader.setPath( this.path );\n\t\tfileLoader.setRequestHeader( this.requestHeader );\n\t\tfileLoader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await fileLoader.loadAsync( url );\n\t\tconst colorLineRegex = /^0 !COLOUR/;\n\t\tconst lines = text.split( /[\\n\\r]/g );\n\t\tconst materials = [];\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tconst line = lines[ i ];\n\t\t\tif ( colorLineRegex.test( line ) ) {\n\n\t\t\t\tconst directive = line.replace( colorLineRegex, '' );\n\t\t\t\tconst material = this.parseColorMetaDirective( new LineParser( directive ) );\n\t\t\t\tmaterials.push( material );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setMaterials( materials );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst fileLoader = new FileLoader( this.manager );\n\t\tfileLoader.setPath( this.path );\n\t\tfileLoader.setRequestHeader( this.requestHeader );\n\t\tfileLoader.setWithCredentials( this.withCredentials );\n\t\tfileLoader.load( url, text => {\n\n\t\t\tthis.partsCache\n\t\t\t\t.parseModel( text, this.materialLibrary )\n\t\t\t\t.then( group => {\n\n\t\t\t\t\tthis.applyMaterialsToMesh( group, MAIN_COLOUR_CODE, this.materialLibrary, true );\n\t\t\t\t\tthis.computeBuildingSteps( group );\n\t\t\t\t\tgroup.userData.fileName = url;\n\t\t\t\t\tonLoad( group );\n\n\t\t\t\t} )\n\t\t\t\t.catch( onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( text, onLoad, onError ) {\n\n\t\tthis.partsCache\n\t\t\t.parseModel( text, this.materialLibrary )\n\t\t\t.then( group => {\n\n\t\t\t\tthis.applyMaterialsToMesh( group, MAIN_COLOUR_CODE, this.materialLibrary, true );\n\t\t\t\tthis.computeBuildingSteps( group );\n\t\t\t\tgroup.userData.fileName = '';\n\t\t\t\tonLoad( group );\n\n\t\t\t} )\n\t\t\t.catch( onError );\n\n\t}\n\n\tsetMaterials( materials ) {\n\n\t\tthis.materialLibrary = {};\n\t\tthis.materials = [];\n\t\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\tthis.addMaterial( materials[ i ] );\n\n\t\t}\n\n\t\t// Add default main triangle and line edge materials (used in pieces that can be colored with a main color)\n\t\tthis.addMaterial( this.parseColorMetaDirective( new LineParser( 'Main_Colour CODE 16 VALUE #FF8080 EDGE #333333' ) ) );\n\t\tthis.addMaterial( this.parseColorMetaDirective( new LineParser( 'Edge_Colour CODE 24 VALUE #A0A0A0 EDGE #333333' ) ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFileMap( fileMap ) {\n\n\t\tthis.fileMap = fileMap;\n\n\t\treturn this;\n\n\t}\n\n\taddMaterial( material ) {\n\n\t\t// Adds a material to the material library which is on top of the parse scopes stack. And also to the materials array\n\n\t\tconst matLib = this.materialLibrary;\n\t\tif ( ! matLib[ material.userData.code ] ) {\n\n\t\t\tthis.materials.push( material );\n\t\t\tmatLib[ material.userData.code ] = material;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetMaterial( colorCode ) {\n\n\t\tif ( colorCode.startsWith( '0x2' ) ) {\n\n\t\t\t// Special 'direct' material value (RGB color)\n\t\t\tconst color = colorCode.substring( 3 );\n\n\t\t\treturn this.parseColorMetaDirective( new LineParser( 'Direct_Color_' + color + ' CODE -1 VALUE #' + color + ' EDGE #' + color + '' ) );\n\n\t\t}\n\n\t\treturn this.materialLibrary[ colorCode ] || null;\n\n\t}\n\n\t// Applies the appropriate materials to a prebuilt hierarchy of geometry. Assumes that color codes are present\n\t// in the material array if they need to be filled in.\n\tapplyMaterialsToMesh( group, parentColorCode, materialHierarchy, finalMaterialPass = false ) {\n\n\t\t// find any missing materials as indicated by a color code string and replace it with a material from the current material lib\n\t\tconst loader = this;\n\t\tconst parentIsPassthrough = parentColorCode === MAIN_COLOUR_CODE;\n\t\tgroup.traverse( c => {\n\n\t\t\tif ( c.isMesh || c.isLineSegments ) {\n\n\t\t\t\tif ( Array.isArray( c.material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = c.material.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( ! c.material[ i ].isMaterial ) {\n\n\t\t\t\t\t\t\tc.material[ i ] = getMaterial( c, c.material[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( ! c.material.isMaterial ) {\n\n\t\t\t\t\tc.material = getMaterial( c, c.material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\n\t\t// Returns the appropriate material for the object (line or face) given color code. If the code is \"pass through\"\n\t\t// (24 for lines, 16 for edges) then the pass through color code is used. If that is also pass through then it's\n\t\t// simply returned for the subsequent material application.\n\t\tfunction getMaterial( c, colorCode ) {\n\n\t\t\t// if our parent is a passthrough color code and we don't have the current material color available then\n\t\t\t// return early.\n\t\t\tif ( parentIsPassthrough && ! ( colorCode in materialHierarchy ) && ! finalMaterialPass ) {\n\n\t\t\t\treturn colorCode;\n\n\t\t\t}\n\n\t\t\tconst forEdge = c.isLineSegments || c.isConditionalLine;\n\t\t\tconst isPassthrough = ! forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;\n\t\t\tif ( isPassthrough ) {\n\n\t\t\t\tcolorCode = parentColorCode;\n\n\t\t\t}\n\n\t\t\tlet material = null;\n\t\t\tif ( colorCode in materialHierarchy ) {\n\n\t\t\t\tmaterial = materialHierarchy[ colorCode ];\n\n\t\t\t} else if ( finalMaterialPass ) {\n\n\t\t\t\t// see if we can get the final material from from the \"getMaterial\" function which will attempt to\n\t\t\t\t// parse the \"direct\" colors\n\t\t\t\tmaterial = loader.getMaterial( colorCode );\n\t\t\t\tif ( material === null ) {\n\n\t\t\t\t\t// otherwise throw a warning if this is final opportunity to set the material\n\t\t\t\t\tconsole.warn( `LDrawLoader: Material properties for code ${ colorCode } not available.` );\n\n\t\t\t\t\t// And return the 'missing color' material\n\t\t\t\t\tmaterial = loader.missingColorMaterial;\n\n\t\t\t\t}\n\n\n\t\t\t} else {\n\n\t\t\t\treturn colorCode;\n\n\t\t\t}\n\n\t\t\tif ( c.isLineSegments ) {\n\n\t\t\t\tmaterial = loader.edgeMaterialCache.get( material );\n\n\t\t\t\tif ( c.isConditionalLine ) {\n\n\t\t\t\t\tmaterial = loader.conditionalEdgeMaterialCache.get( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t}\n\n\tgetMainMaterial() {\n\n\t\treturn this.getMaterial( MAIN_COLOUR_CODE );\n\n\t}\n\n\tgetMainEdgeMaterial() {\n\n\t\tconst mat = this.getMaterial( MAIN_EDGE_COLOUR_CODE );\n\t\treturn mat ? this.edgeMaterialCache.get( mat ) : null;\n\n\t}\n\n\tparseColorMetaDirective( lineParser ) {\n\n\t\t// Parses a color definition and returns a THREE.Material\n\n\t\tlet code = null;\n\n\t\t// Triangle and line colors\n\t\tlet fillColor = '#FF00FF';\n\t\tlet edgeColor = '#FF00FF';\n\n\t\t// Transparency\n\t\tlet alpha = 1;\n\t\tlet isTransparent = false;\n\t\t// Self-illumination:\n\t\tlet luminance = 0;\n\n\t\tlet finishType = FINISH_TYPE_DEFAULT;\n\n\t\tlet edgeMaterial = null;\n\n\t\tconst name = lineParser.getToken();\n\t\tif ( ! name ) {\n\n\t\t\tthrow new Error( 'LDrawLoader: Material name was expected after \"!COLOUR tag' + lineParser.getLineNumberString() + '.' );\n\n\t\t}\n\n\t\t// Parse tag tokens and their parameters\n\t\tlet token = null;\n\t\twhile ( true ) {\n\n\t\t\ttoken = lineParser.getToken();\n\n\t\t\tif ( ! token ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( ! parseLuminance( token ) ) {\n\n\t\t\t\tswitch ( token.toUpperCase() ) {\n\n\t\t\t\t\tcase 'CODE':\n\n\t\t\t\t\t\tcode = lineParser.getToken();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'VALUE':\n\n\t\t\t\t\t\tfillColor = lineParser.getToken();\n\t\t\t\t\t\tif ( fillColor.startsWith( '0x' ) ) {\n\n\t\t\t\t\t\t\tfillColor = '#' + fillColor.substring( 2 );\n\n\t\t\t\t\t\t} else if ( ! fillColor.startsWith( '#' ) ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid color while parsing material' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EDGE':\n\n\t\t\t\t\t\tedgeColor = lineParser.getToken();\n\t\t\t\t\t\tif ( edgeColor.startsWith( '0x' ) ) {\n\n\t\t\t\t\t\t\tedgeColor = '#' + edgeColor.substring( 2 );\n\n\t\t\t\t\t\t} else if ( ! edgeColor.startsWith( '#' ) ) {\n\n\t\t\t\t\t\t\t// Try to see if edge color is a color code\n\t\t\t\t\t\t\tedgeMaterial = this.getMaterial( edgeColor );\n\t\t\t\t\t\t\tif ( ! edgeMaterial ) {\n\n\t\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid edge color while parsing material' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Get the edge material for this triangle material\n\t\t\t\t\t\t\tedgeMaterial = this.edgeMaterialCache.get( edgeMaterial );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ALPHA':\n\n\t\t\t\t\t\talpha = parseInt( lineParser.getToken() );\n\n\t\t\t\t\t\tif ( isNaN( alpha ) ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid alpha value in material definition' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\talpha = Math.max( 0, Math.min( 1, alpha / 255 ) );\n\n\t\t\t\t\t\tif ( alpha < 1 ) {\n\n\t\t\t\t\t\t\tisTransparent = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LUMINANCE':\n\n\t\t\t\t\t\tif ( ! parseLuminance( lineParser.getToken() ) ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid luminance value in material definition' + LineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CHROME':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_CHROME;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PEARLESCENT':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_PEARLESCENT;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RUBBER':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_RUBBER;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'MATTE_METALLIC':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_MATTE_METALLIC;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'METAL':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_METAL;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'MATERIAL':\n\t\t\t\t\t\t// Not implemented\n\t\t\t\t\t\tlineParser.setToEnd();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Unknown token \"' + token + '\" while parsing material' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet material = null;\n\n\t\tswitch ( finishType ) {\n\n\t\t\tcase FINISH_TYPE_DEFAULT:\n\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.3, metalness: 0 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_PEARLESCENT:\n\n\t\t\t\t// Try to imitate pearlescency by making the surface glossy\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.3, metalness: 0.25 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_CHROME:\n\n\t\t\t\t// Mirror finish surface\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0, metalness: 1 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_RUBBER:\n\n\t\t\t\t// Rubber finish\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.9, metalness: 0 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_MATTE_METALLIC:\n\n\t\t\t\t// Brushed metal finish\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.8, metalness: 0.4 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_METAL:\n\n\t\t\t\t// Average metal finish\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.2, metalness: 0.85 } );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Should not happen\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tmaterial.color.setStyle( fillColor, COLOR_SPACE_LDRAW );\n\t\tmaterial.transparent = isTransparent;\n\t\tmaterial.premultipliedAlpha = true;\n\t\tmaterial.opacity = alpha;\n\t\tmaterial.depthWrite = ! isTransparent;\n\n\t\tmaterial.polygonOffset = true;\n\t\tmaterial.polygonOffsetFactor = 1;\n\n\t\tif ( luminance !== 0 ) {\n\n\t\t\tmaterial.emissive.setStyle( fillColor, COLOR_SPACE_LDRAW ).multiplyScalar( luminance );\n\n\t\t}\n\n\t\tif ( ! edgeMaterial ) {\n\n\t\t\t// This is the material used for edges\n\t\t\tedgeMaterial = new LineBasicMaterial( {\n\t\t\t\tcolor: new Color().setStyle( edgeColor, COLOR_SPACE_LDRAW ),\n\t\t\t\ttransparent: isTransparent,\n\t\t\t\topacity: alpha,\n\t\t\t\tdepthWrite: ! isTransparent\n\t\t\t} );\n\t\t\tedgeMaterial.color;\n\t\t\tedgeMaterial.userData.code = code;\n\t\t\tedgeMaterial.name = name + ' - Edge';\n\n\t\t\t// This is the material used for conditional edges\n\t\t\tconst conditionalEdgeMaterial = new LDrawConditionalLineMaterial( {\n\n\t\t\t\tfog: true,\n\t\t\t\ttransparent: isTransparent,\n\t\t\t\tdepthWrite: ! isTransparent,\n\t\t\t\tcolor: new Color().setStyle( edgeColor, COLOR_SPACE_LDRAW ),\n\t\t\t\topacity: alpha,\n\n\t\t\t} );\n\t\t\tconditionalEdgeMaterial.userData.code = code;\n\t\t\tconditionalEdgeMaterial.name = name + ' - Conditional Edge';\n\n\t\t\tthis.conditionalEdgeMaterialCache.set( edgeMaterial, conditionalEdgeMaterial );\n\n\t\t}\n\n\t\tmaterial.userData.code = code;\n\t\tmaterial.name = name;\n\n\t\tthis.edgeMaterialCache.set( material, edgeMaterial );\n\n\t\tthis.addMaterial( material );\n\n\t\treturn material;\n\n\t\tfunction parseLuminance( token ) {\n\n\t\t\t// Returns success\n\n\t\t\tlet lum;\n\n\t\t\tif ( token.startsWith( 'LUMINANCE' ) ) {\n\n\t\t\t\tlum = parseInt( token.substring( 9 ) );\n\n\t\t\t} else {\n\n\t\t\t\tlum = parseInt( token );\n\n\t\t\t}\n\n\t\t\tif ( isNaN( lum ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tluminance = Math.max( 0, Math.min( 1, lum / 255 ) );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\tcomputeBuildingSteps( model ) {\n\n\t\t// Sets userdata.buildingStep number in Group objects and userData.numBuildingSteps number in the root Group object.\n\n\t\tlet stepNumber = 0;\n\n\t\tmodel.traverse( c => {\n\n\t\t\tif ( c.isGroup ) {\n\n\t\t\t\tif ( c.userData.startingBuildingStep ) {\n\n\t\t\t\t\tstepNumber ++;\n\n\t\t\t\t}\n\n\t\t\t\tc.userData.buildingStep = stepNumber;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tmodel.userData.numBuildingSteps = stepNumber + 1;\n\n\t}\n\n}\n\nexport { LDrawLoader };\n","import {Group} from 'three';\nimport {LDrawLoader} from 'three/examples/jsm/loaders/LDrawLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\nimport {ThreejsCoreObject} from '../../geometry/modules/three/ThreejsCoreObject';\nimport {isString,isNumber,isArray} from '../../Type';\n\n// export enum MPDAttribute {\n// \tAUTHOR = 'author',\n// \tBUILDING_STEP = 'buildingStep',\n// \tCATEGORY = 'category',\n// \tCOLOR_CODE='colorCode',\n// \tKEYWORDS = 'keywords',\n// \tNUM_BUILDING_STEPS = 'numBuildingSteps',\n// \tTYPE = 'type',\n// }\n// export const MPD_ATTRIBUTES: MPDAttribute[] = [\n// \tMPDAttribute.AUTHOR,\n// \tMPDAttribute.BUILDING_STEP,\n// \tMPDAttribute.CATEGORY,\n// \tMPDAttribute.KEYWORDS,\n// \tMPDAttribute.NUM_BUILDING_STEPS,\n// \tMPDAttribute.TYPE,\n// ];\n// const attributesSet: Set<string> = new Set(MPD_ATTRIBUTES);\n\nexport class MPDLoaderHandler extends BaseObject3DLoaderHandler<Group> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<Group>> {\n\t\treturn (this._loader = this._loader || (await new LDrawLoader(this.loadingManager)));\n\t}\n\tprotected override _onLoadSuccess(o: Group): Group[] {\n\t\to.rotation.x = Math.PI;\n\t\to.updateMatrix();\n\n\t\to.traverse((child) => {\n\t\t\tconst attribNames = Object.keys(child.userData);\n\t\t\tfor (const attribName of attribNames) {\n\t\t\t\tconst value = child.userData[attribName];\n\t\t\t\tif (value != null) {\n\t\t\t\t\t// attribute is currently not added if its value is null,\n\t\t\t\t\t// as it would be useless to have all objects with an attribute set to null.\n\t\t\t\t\t// Maybe consider checking all objects before adding an attribute?\n\n\t\t\t\t\tif (isString(value) || isNumber(value)) {\n\t\t\t\t\t\tThreejsCoreObject.setAttribute(child, attribName, value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (isArray(value)) {\n\t\t\t\t\t\t\tconst stringElements = value.filter((item) => isString(item));\n\t\t\t\t\t\t\tconst jointedStrings = stringElements.join(' ');\n\t\t\t\t\t\t\tThreejsCoreObject.setAttribute(child, attribName, jointedStrings);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn [o];\n\t}\n}\n","import {Group} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {MPDLoaderHandler} from '../../../core/loader/geometry/MPD';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileMPDSopOperation extends BaseFileSopOperation<Group> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/ldraw/officialLibrary/models/car.ldr_Packed.mpd`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_MPD> {\n\t\treturn SopTypeFile.FILE_MPD;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new MPDLoaderHandler(params.url, this._node);\n\t}\n}\n","import {Object3D} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {OBJLoaderHandler} from '../../../core/loader/geometry/OBJ';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileOBJSopOperation extends BaseFileSopOperation<Object3D> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/dolphin.obj`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_OBJ> {\n\t\treturn SopTypeFile.FILE_OBJ;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new OBJLoaderHandler(params.url, this._node);\n\t}\n}\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tColor\n} from 'three';\n\nclass PDBLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t// Based on CanvasMol PDB parser\n\n\tparse( text ) {\n\n\t\tfunction trim( text ) {\n\n\t\t\treturn text.replace( /^\\s\\s*/, '' ).replace( /\\s\\s*$/, '' );\n\n\t\t}\n\n\t\tfunction capitalize( text ) {\n\n\t\t\treturn text.charAt( 0 ).toUpperCase() + text.slice( 1 ).toLowerCase();\n\n\t\t}\n\n\t\tfunction hash( s, e ) {\n\n\t\t\treturn 's' + Math.min( s, e ) + 'e' + Math.max( s, e );\n\n\t\t}\n\n\t\tfunction parseBond( start, length, satom, i ) {\n\n\t\t\tconst eatom = parseInt( lines[ i ].slice( start, start + length ) );\n\n\t\t\tif ( eatom ) {\n\n\t\t\t\tconst h = hash( satom, eatom );\n\n\t\t\t\tif ( _bhash[ h ] === undefined ) {\n\n\t\t\t\t\t_bonds.push( [ satom - 1, eatom - 1, 1 ] );\n\t\t\t\t\t_bhash[ h ] = _bonds.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// doesn't really work as almost all PDBs\n\t\t\t\t\t// have just normal bonds appearing multiple\n\t\t\t\t\t// times instead of being double/triple bonds\n\t\t\t\t\t// bonds[bhash[h]][2] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildGeometry() {\n\n\t\t\tconst build = {\n\t\t\t\tgeometryAtoms: new BufferGeometry(),\n\t\t\t\tgeometryBonds: new BufferGeometry(),\n\t\t\t\tjson: {\n\t\t\t\t\tatoms: atoms\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst geometryAtoms = build.geometryAtoms;\n\t\t\tconst geometryBonds = build.geometryBonds;\n\n\t\t\tconst verticesAtoms = [];\n\t\t\tconst colorsAtoms = [];\n\t\t\tconst verticesBonds = [];\n\n\t\t\t// atoms\n\n\t\t\tconst c = new Color();\n\n\t\t\tfor ( let i = 0, l = atoms.length; i < l; i ++ ) {\n\n\t\t\t\tconst atom = atoms[ i ];\n\n\t\t\t\tconst x = atom[ 0 ];\n\t\t\t\tconst y = atom[ 1 ];\n\t\t\t\tconst z = atom[ 2 ];\n\n\t\t\t\tverticesAtoms.push( x, y, z );\n\n\t\t\t\tconst r = atom[ 3 ][ 0 ] / 255;\n\t\t\t\tconst g = atom[ 3 ][ 1 ] / 255;\n\t\t\t\tconst b = atom[ 3 ][ 2 ] / 255;\n\n\t\t\t\tc.set( r, g, b ).convertSRGBToLinear();\n\n\t\t\t\tcolorsAtoms.push( c.r, c.g, c.b );\n\n\t\t\t}\n\n\t\t\t// bonds\n\n\t\t\tfor ( let i = 0, l = _bonds.length; i < l; i ++ ) {\n\n\t\t\t\tconst bond = _bonds[ i ];\n\n\t\t\t\tconst start = bond[ 0 ];\n\t\t\t\tconst end = bond[ 1 ];\n\n\t\t\t\tconst startAtom = _atomMap[ start ];\n\t\t\t\tconst endAtom = _atomMap[ end ];\n\n\t\t\t\tlet x = startAtom[ 0 ];\n\t\t\t\tlet y = startAtom[ 1 ];\n\t\t\t\tlet z = startAtom[ 2 ];\n\n\t\t\t\tverticesBonds.push( x, y, z );\n\n\t\t\t\tx = endAtom[ 0 ];\n\t\t\t\ty = endAtom[ 1 ];\n\t\t\t\tz = endAtom[ 2 ];\n\n\t\t\t\tverticesBonds.push( x, y, z );\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tgeometryAtoms.setAttribute( 'position', new Float32BufferAttribute( verticesAtoms, 3 ) );\n\t\t\tgeometryAtoms.setAttribute( 'color', new Float32BufferAttribute( colorsAtoms, 3 ) );\n\n\t\t\tgeometryBonds.setAttribute( 'position', new Float32BufferAttribute( verticesBonds, 3 ) );\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tconst CPK = { h: [ 255, 255, 255 ], he: [ 217, 255, 255 ], li: [ 204, 128, 255 ], be: [ 194, 255, 0 ], b: [ 255, 181, 181 ], c: [ 144, 144, 144 ], n: [ 48, 80, 248 ], o: [ 255, 13, 13 ], f: [ 144, 224, 80 ], ne: [ 179, 227, 245 ], na: [ 171, 92, 242 ], mg: [ 138, 255, 0 ], al: [ 191, 166, 166 ], si: [ 240, 200, 160 ], p: [ 255, 128, 0 ], s: [ 255, 255, 48 ], cl: [ 31, 240, 31 ], ar: [ 128, 209, 227 ], k: [ 143, 64, 212 ], ca: [ 61, 255, 0 ], sc: [ 230, 230, 230 ], ti: [ 191, 194, 199 ], v: [ 166, 166, 171 ], cr: [ 138, 153, 199 ], mn: [ 156, 122, 199 ], fe: [ 224, 102, 51 ], co: [ 240, 144, 160 ], ni: [ 80, 208, 80 ], cu: [ 200, 128, 51 ], zn: [ 125, 128, 176 ], ga: [ 194, 143, 143 ], ge: [ 102, 143, 143 ], as: [ 189, 128, 227 ], se: [ 255, 161, 0 ], br: [ 166, 41, 41 ], kr: [ 92, 184, 209 ], rb: [ 112, 46, 176 ], sr: [ 0, 255, 0 ], y: [ 148, 255, 255 ], zr: [ 148, 224, 224 ], nb: [ 115, 194, 201 ], mo: [ 84, 181, 181 ], tc: [ 59, 158, 158 ], ru: [ 36, 143, 143 ], rh: [ 10, 125, 140 ], pd: [ 0, 105, 133 ], ag: [ 192, 192, 192 ], cd: [ 255, 217, 143 ], in: [ 166, 117, 115 ], sn: [ 102, 128, 128 ], sb: [ 158, 99, 181 ], te: [ 212, 122, 0 ], i: [ 148, 0, 148 ], xe: [ 66, 158, 176 ], cs: [ 87, 23, 143 ], ba: [ 0, 201, 0 ], la: [ 112, 212, 255 ], ce: [ 255, 255, 199 ], pr: [ 217, 255, 199 ], nd: [ 199, 255, 199 ], pm: [ 163, 255, 199 ], sm: [ 143, 255, 199 ], eu: [ 97, 255, 199 ], gd: [ 69, 255, 199 ], tb: [ 48, 255, 199 ], dy: [ 31, 255, 199 ], ho: [ 0, 255, 156 ], er: [ 0, 230, 117 ], tm: [ 0, 212, 82 ], yb: [ 0, 191, 56 ], lu: [ 0, 171, 36 ], hf: [ 77, 194, 255 ], ta: [ 77, 166, 255 ], w: [ 33, 148, 214 ], re: [ 38, 125, 171 ], os: [ 38, 102, 150 ], ir: [ 23, 84, 135 ], pt: [ 208, 208, 224 ], au: [ 255, 209, 35 ], hg: [ 184, 184, 208 ], tl: [ 166, 84, 77 ], pb: [ 87, 89, 97 ], bi: [ 158, 79, 181 ], po: [ 171, 92, 0 ], at: [ 117, 79, 69 ], rn: [ 66, 130, 150 ], fr: [ 66, 0, 102 ], ra: [ 0, 125, 0 ], ac: [ 112, 171, 250 ], th: [ 0, 186, 255 ], pa: [ 0, 161, 255 ], u: [ 0, 143, 255 ], np: [ 0, 128, 255 ], pu: [ 0, 107, 255 ], am: [ 84, 92, 242 ], cm: [ 120, 92, 227 ], bk: [ 138, 79, 227 ], cf: [ 161, 54, 212 ], es: [ 179, 31, 212 ], fm: [ 179, 31, 186 ], md: [ 179, 13, 166 ], no: [ 189, 13, 135 ], lr: [ 199, 0, 102 ], rf: [ 204, 0, 89 ], db: [ 209, 0, 79 ], sg: [ 217, 0, 69 ], bh: [ 224, 0, 56 ], hs: [ 230, 0, 46 ], mt: [ 235, 0, 38 ], ds: [ 235, 0, 38 ], rg: [ 235, 0, 38 ], cn: [ 235, 0, 38 ], uut: [ 235, 0, 38 ], uuq: [ 235, 0, 38 ], uup: [ 235, 0, 38 ], uuh: [ 235, 0, 38 ], uus: [ 235, 0, 38 ], uuo: [ 235, 0, 38 ] };\n\n\t\tconst atoms = [];\n\n\t\tconst _bonds = [];\n\t\tconst _bhash = {};\n\t\tconst _atomMap = {};\n\n\t\t// parse\n\n\t\tconst lines = text.split( '\\n' );\n\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tif ( lines[ i ].slice( 0, 4 ) === 'ATOM' || lines[ i ].slice( 0, 6 ) === 'HETATM' ) {\n\n\t\t\t\tconst x = parseFloat( lines[ i ].slice( 30, 37 ) );\n\t\t\t\tconst y = parseFloat( lines[ i ].slice( 38, 45 ) );\n\t\t\t\tconst z = parseFloat( lines[ i ].slice( 46, 53 ) );\n\t\t\t\tconst index = parseInt( lines[ i ].slice( 6, 11 ) ) - 1;\n\n\t\t\t\tlet e = trim( lines[ i ].slice( 76, 78 ) ).toLowerCase();\n\n\t\t\t\tif ( e === '' ) {\n\n\t\t\t\t\te = trim( lines[ i ].slice( 12, 14 ) ).toLowerCase();\n\n\t\t\t\t}\n\n\t\t\t\tconst atomData = [ x, y, z, CPK[ e ], capitalize( e ) ];\n\n\t\t\t\tatoms.push( atomData );\n\t\t\t\t_atomMap[ index ] = atomData;\n\n\t\t\t} else if ( lines[ i ].slice( 0, 6 ) === 'CONECT' ) {\n\n\t\t\t\tconst satom = parseInt( lines[ i ].slice( 6, 11 ) );\n\n\t\t\t\tparseBond( 11, 5, satom, i );\n\t\t\t\tparseBond( 16, 5, satom, i );\n\t\t\t\tparseBond( 21, 5, satom, i );\n\t\t\t\tparseBond( 26, 5, satom, i );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build and return geometry\n\n\t\treturn buildGeometry();\n\n\t}\n\n}\n\nexport { PDBLoader };\n","import {LineBasicMaterial, LineSegments, Object3D, Points, PointsMaterial} from 'three';\nimport {PDBLoader} from 'three/examples/jsm/loaders/PDBLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\nimport type {PDB} from 'three/examples/jsm/loaders/PDBLoader';\n\nconst matPoints = new PointsMaterial();\nconst matLines = new LineBasicMaterial();\n\nexport class PDBLoaderHandler extends BaseObject3DLoaderHandler<PDB> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<PDB>> {\n\t\treturn (this._loader = this._loader || (await new PDBLoader(this.loadingManager)));\n\t}\n\tprotected override _onLoadSuccess(o: PDB): Object3D[] {\n\t\tconst atoms = new Points(o.geometryAtoms, matPoints);\n\t\tconst bonds = new LineSegments(o.geometryBonds, matLines);\n\n\t\treturn [atoms, bonds];\n\t}\n}\n","import {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {PDBLoaderHandler} from '../../../core/loader/geometry/PDB';\nimport {PDB} from 'three/examples/jsm/loaders/PDBLoader';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\n\nexport class FilePDBSopOperation extends BaseFileSopOperation<PDB> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/ethanol.pdb`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_PDB> {\n\t\treturn SopTypeFile.FILE_PDB;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new PDBLoaderHandler(params.url, this._node);\n\t}\n}\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tColor\n} from 'three';\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n * Custom properties outside of the defaults for position, uv, normal\n * and color attributes can be added using the setCustomPropertyNameMapping method.\n * For example, the following maps the element properties “custom_property_a”\n * and “custom_property_b” to an attribute “customAttribute” with an item size of 2.\n * Attribute item sizes are set from the number of element properties in the property array.\n *\n * loader.setCustomPropertyNameMapping( {\n *\tcustomAttribute: ['custom_property_a', 'custom_property_b'],\n * } );\n *\n */\n\nconst _color = new Color();\n\nclass PLYLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.propertyNameMapping = {};\n\t\tthis.customPropertyMapping = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tsetPropertyNameMapping( mapping ) {\n\n\t\tthis.propertyNameMapping = mapping;\n\n\t}\n\n\tsetCustomPropertyNameMapping( mapping ) {\n\n\t\tthis.customPropertyMapping = mapping;\n\n\t}\n\n\tparse( data ) {\n\n\t\tfunction parseHeader( data, headerLength = 0 ) {\n\n\t\t\tconst patternHeader = /^ply([\\s\\S]*)end_header(\\r\\n|\\r|\\n)/;\n\t\t\tlet headerText = '';\n\t\t\tconst result = patternHeader.exec( data );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\theaderText = result[ 1 ];\n\n\t\t\t}\n\n\t\t\tconst header = {\n\t\t\t\tcomments: [],\n\t\t\t\telements: [],\n\t\t\t\theaderLength: headerLength,\n\t\t\t\tobjInfo: ''\n\t\t\t};\n\n\t\t\tconst lines = headerText.split( /\\r\\n|\\r|\\n/ );\n\t\t\tlet currentElement;\n\n\t\t\tfunction make_ply_element_property( propertValues, propertyNameMapping ) {\n\n\t\t\t\tconst property = { type: propertValues[ 0 ] };\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.name = propertValues[ 3 ];\n\t\t\t\t\tproperty.countType = propertValues[ 1 ];\n\t\t\t\t\tproperty.itemType = propertValues[ 2 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.name = propertValues[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( property.name in propertyNameMapping ) {\n\n\t\t\t\t\tproperty.name = propertyNameMapping[ property.name ];\n\n\t\t\t\t}\n\n\t\t\t\treturn property;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\tlet line = lines[ i ];\n\t\t\t\tline = line.trim();\n\n\t\t\t\tif ( line === '' ) continue;\n\n\t\t\t\tconst lineValues = line.split( /\\s+/ );\n\t\t\t\tconst lineType = lineValues.shift();\n\t\t\t\tline = lineValues.join( ' ' );\n\n\t\t\t\tswitch ( lineType ) {\n\n\t\t\t\t\tcase 'format':\n\n\t\t\t\t\t\theader.format = lineValues[ 0 ];\n\t\t\t\t\t\theader.version = lineValues[ 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'comment':\n\n\t\t\t\t\t\theader.comments.push( line );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'element':\n\n\t\t\t\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentElement = {};\n\t\t\t\t\t\tcurrentElement.name = lineValues[ 0 ];\n\t\t\t\t\t\tcurrentElement.count = parseInt( lineValues[ 1 ] );\n\t\t\t\t\t\tcurrentElement.properties = [];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'property':\n\n\t\t\t\t\t\tcurrentElement.properties.push( make_ply_element_property( lineValues, scope.propertyNameMapping ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'obj_info':\n\n\t\t\t\t\t\theader.objInfo = line;\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.log( 'unhandled', lineType, lineValues );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t}\n\n\t\t\treturn header;\n\n\t\t}\n\n\t\tfunction parseASCIINumber( n, type ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':\n\t\t\t\tcase 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':\n\n\t\t\t\t\treturn parseInt( n );\n\n\t\t\t\tcase 'float': case 'double': case 'float32': case 'float64':\n\n\t\t\t\t\treturn parseFloat( n );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseASCIIElement( properties, tokens ) {\n\n\t\t\tconst element = {};\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\tif ( properties[ i ].type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\t\t\t\t\tconst n = parseASCIINumber( tokens.next(), properties[ i ].countType );\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\t\t\tlist.push( parseASCIINumber( tokens.next(), properties[ i ].itemType ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ properties[ i ].name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ properties[ i ].name ] = parseASCIINumber( tokens.next(), properties[ i ].type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn element;\n\n\t\t}\n\n\t\tfunction createBuffer() {\n\n\t\t\tconst buffer = {\n\t\t\t  indices: [],\n\t\t\t  vertices: [],\n\t\t\t  normals: [],\n\t\t\t  uvs: [],\n\t\t\t  faceVertexUvs: [],\n\t\t\t  colors: [],\n\t\t\t  faceVertexColors: []\n\t\t\t};\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t  buffer[ customProperty ] = [];\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction mapElementAttributes( properties ) {\n\n\t\t\tconst elementNames = properties.map( property => {\n\n\t\t\t\treturn property.name;\n\n\t\t\t} );\n\n\t\t\tfunction findAttrName( names ) {\n\n\t\t\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst name = names[ i ];\n\n\t\t\t\t\tif ( elementNames.includes( name ) ) return name;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tattrX: findAttrName( [ 'x', 'px', 'posx' ] ) || 'x',\n\t\t\t\tattrY: findAttrName( [ 'y', 'py', 'posy' ] ) || 'y',\n\t\t\t\tattrZ: findAttrName( [ 'z', 'pz', 'posz' ] ) || 'z',\n\t\t\t\tattrNX: findAttrName( [ 'nx', 'normalx' ] ),\n\t\t\t\tattrNY: findAttrName( [ 'ny', 'normaly' ] ),\n\t\t\t\tattrNZ: findAttrName( [ 'nz', 'normalz' ] ),\n\t\t\t\tattrS: findAttrName( [ 's', 'u', 'texture_u', 'tx' ] ),\n\t\t\t\tattrT: findAttrName( [ 't', 'v', 'texture_v', 'ty' ] ),\n\t\t\t\tattrR: findAttrName( [ 'red', 'diffuse_red', 'r', 'diffuse_r' ] ),\n\t\t\t\tattrG: findAttrName( [ 'green', 'diffuse_green', 'g', 'diffuse_g' ] ),\n\t\t\t\tattrB: findAttrName( [ 'blue', 'diffuse_blue', 'b', 'diffuse_b' ] ),\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseASCII( data, header ) {\n\n\t\t\t// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst patternBody = /end_header\\s+(\\S[\\s\\S]*\\S|\\S)\\s*$/;\n\t\t\tlet body, matches;\n\n\t\t\tif ( ( matches = patternBody.exec( data ) ) !== null ) {\n\n\t\t\t\tbody = matches[ 1 ].split( /\\s+/ );\n\n\t\t\t} else {\n\n\t\t\t\tbody = [ ];\n\n\t\t\t}\n\n\t\t\tconst tokens = new ArrayStream( body );\n\n\t\t\tloop: for ( let i = 0; i < header.elements.length; i ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ i ];\n\t\t\t\tconst attributeMap = mapElementAttributes( elementDesc.properties );\n\n\t\t\t\tfor ( let j = 0; j < elementDesc.count; j ++ ) {\n\n\t\t\t\t\tconst element = parseASCIIElement( elementDesc.properties, tokens );\n\n\t\t\t\t\tif ( ! element ) break loop;\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction postProcess( buffer ) {\n\n\t\t\tlet geometry = new BufferGeometry();\n\n\t\t\t// mandatory buffer data\n\n\t\t\tif ( buffer.indices.length > 0 ) {\n\n\t\t\t\tgeometry.setIndex( buffer.indices );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( buffer.vertices, 3 ) );\n\n\t\t\t// optional buffer data\n\n\t\t\tif ( buffer.normals.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( buffer.normals, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.uvs.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.uvs, 2 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.colors.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( buffer.colors, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.faceVertexUvs.length > 0 || buffer.faceVertexColors.length > 0 ) {\n\n\t\t\t\tgeometry = geometry.toNonIndexed();\n\n\t\t\t\tif ( buffer.faceVertexUvs.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.faceVertexUvs, 2 ) );\n\t\t\t\tif ( buffer.faceVertexColors.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( buffer.faceVertexColors, 3 ) );\n\n\t\t\t}\n\n\t\t\t// custom buffer data\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\tif ( buffer[ customProperty ].length > 0 ) {\n\n\t\t\t\t  \tgeometry.setAttribute(\n\t\t\t\t\t\tcustomProperty,\n\t\t\t\t\t\tnew Float32BufferAttribute(\n\t\t\t\t\t  \t\tbuffer[ customProperty ],\n\t\t\t\t\t  \t\tscope.customPropertyMapping[ customProperty ].length\n\t\t\t\t\t\t)\n\t\t\t\t  \t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction handleElement( buffer, elementName, element, cacheEntry ) {\n\n\t\t\tif ( elementName === 'vertex' ) {\n\n\t\t\t\tbuffer.vertices.push( element[ cacheEntry.attrX ], element[ cacheEntry.attrY ], element[ cacheEntry.attrZ ] );\n\n\t\t\t\tif ( cacheEntry.attrNX !== null && cacheEntry.attrNY !== null && cacheEntry.attrNZ !== null ) {\n\n\t\t\t\t\tbuffer.normals.push( element[ cacheEntry.attrNX ], element[ cacheEntry.attrNY ], element[ cacheEntry.attrNZ ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrS !== null && cacheEntry.attrT !== null ) {\n\n\t\t\t\t\tbuffer.uvs.push( element[ cacheEntry.attrS ], element[ cacheEntry.attrT ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0\n\t\t\t\t\t).convertSRGBToLinear();\n\n\t\t\t\t\tbuffer.colors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\t\tfor ( const elementProperty of scope.customPropertyMapping[ customProperty ] ) {\n\n\t\t\t\t\t  buffer[ customProperty ].push( element[ elementProperty ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( elementName === 'face' ) {\n\n\t\t\t\tconst vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338\n\t\t\t\tconst texcoord = element.texcoord;\n\n\t\t\t\tif ( vertex_indices.length === 3 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 2 ] );\n\n\t\t\t\t\tif ( texcoord && texcoord.length === 6 ) {\n\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 0 ], texcoord[ 1 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 2 ], texcoord[ 3 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 4 ], texcoord[ 5 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( vertex_indices.length === 4 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 3 ] );\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 1 ], vertex_indices[ 2 ], vertex_indices[ 3 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// face colors\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0\n\t\t\t\t\t).convertSRGBToLinear();\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction binaryReadElement( at, properties ) {\n\n\t\t\tconst element = {};\n\t\t\tlet read = 0;\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\t\t\t\tconst valueReader = property.valueReader;\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\n\t\t\t\t\tconst n = property.countReader.read( at + read );\n\t\t\t\t\tread += property.countReader.size;\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tlist.push( valueReader.read( at + read ) );\n\t\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ property.name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ property.name ] = valueReader.read( at + read );\n\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn [ element, read ];\n\n\t\t}\n\n\t\tfunction setPropertyBinaryReaders( properties, body, little_endian ) {\n\n\t\t\tfunction getBinaryReader( dataview, type, little_endian ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t// corespondences for non-specific length types here match rply:\n\t\t\t\t\tcase 'int8':\tcase 'char':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'uint8':\tcase 'uchar':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'int16':\tcase 'short':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'uint16':\tcase 'ushort':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'int32':\tcase 'int':\t\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'uint32':\tcase 'uint':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float32': case 'float':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float64': case 'double':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat64( at, little_endian );\n\n\t\t\t\t\t}, size: 8 };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = properties.length; i < l; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.countReader = getBinaryReader( body, property.countType, little_endian );\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.itemType, little_endian );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.type, little_endian );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseBinary( data, header ) {\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst little_endian = ( header.format === 'binary_little_endian' );\n\t\t\tconst body = new DataView( data, header.headerLength );\n\t\t\tlet result, loc = 0;\n\n\t\t\tfor ( let currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ currentElement ];\n\t\t\t\tconst properties = elementDesc.properties;\n\t\t\t\tconst attributeMap = mapElementAttributes( properties );\n\n\t\t\t\tsetPropertyBinaryReaders( properties, body, little_endian );\n\n\t\t\t\tfor ( let currentElementCount = 0; currentElementCount < elementDesc.count; currentElementCount ++ ) {\n\n\t\t\t\t\tresult = binaryReadElement( loc, properties );\n\t\t\t\t\tloc += result[ 1 ];\n\t\t\t\t\tconst element = result[ 0 ];\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction extractHeaderText( bytes ) {\n\n\t\t\tlet i = 0;\n\t\t\tlet cont = true;\n\n\t\t\tlet line = '';\n\t\t\tconst lines = [];\n\n\t\t\tconst startLine = new TextDecoder().decode( bytes.subarray( 0, 5 ) );\n\t\t\tconst hasCRNL = /^ply\\r\\n/.test( startLine );\n\n\t\t\tdo {\n\n\t\t\t\tconst c = String.fromCharCode( bytes[ i ++ ] );\n\n\t\t\t\tif ( c !== '\\n' && c !== '\\r' ) {\n\n\t\t\t\t\tline += c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( line === 'end_header' ) cont = false;\n\t\t\t\t\tif ( line !== '' ) {\n\n\t\t\t\t\t\tlines.push( line );\n\t\t\t\t\t\tline = '';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} while ( cont && i < bytes.length );\n\n\t\t\t// ascii section using \\r\\n as line endings\n\t\t\tif ( hasCRNL === true ) i ++;\n\n\t\t\treturn { headerText: lines.join( '\\r' ) + '\\r', headerLength: i };\n\n\t\t}\n\n\t\t//\n\n\t\tlet geometry;\n\t\tconst scope = this;\n\n\t\tif ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst bytes = new Uint8Array( data );\n\t\t\tconst { headerText, headerLength } = extractHeaderText( bytes );\n\t\t\tconst header = parseHeader( headerText, headerLength );\n\n\t\t\tif ( header.format === 'ascii' ) {\n\n\t\t\t\tconst text = new TextDecoder().decode( bytes );\n\n\t\t\t\tgeometry = parseASCII( text, header );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry = parseBinary( data, header );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tgeometry = parseASCII( data, parseHeader( data ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ArrayStream {\n\n\tconstructor( arr ) {\n\n\t\tthis.arr = arr;\n\t\tthis.i = 0;\n\n\t}\n\n\tempty() {\n\n\t\treturn this.i >= this.arr.length;\n\n\t}\n\n\tnext() {\n\n\t\treturn this.arr[ this.i ++ ];\n\n\t}\n\n}\n\nexport { PLYLoader };\n","import {BufferGeometry, Mesh, MeshLambertMaterial, Object3D} from 'three';\nimport {PLYLoader} from 'three/examples/jsm/loaders/PLYLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nconst matMesh = new MeshLambertMaterial();\n\nexport class PLYLoaderHandler extends BaseObject3DLoaderHandler<BufferGeometry> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<BufferGeometry>> {\n\t\treturn (this._loader = this._loader || (await new PLYLoader(this.loadingManager)));\n\t}\n\tprotected override _onLoadSuccess(o: BufferGeometry): Object3D[] {\n\t\treturn [new Mesh(o, matMesh)];\n\t}\n}\n","import {BufferGeometry} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {PLYLoaderHandler} from '../../../core/loader/geometry/PLY';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FilePLYSopOperation extends BaseFileSopOperation<BufferGeometry> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/dolphins_be.ply`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_PLY> {\n\t\treturn SopTypeFile.FILE_PLY;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new PLYLoaderHandler(params.url, this._node);\n\t}\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tVector3\n} from 'three';\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n *  Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n *  There is perhaps some question as to how valid it is to always assume little-endian-ness.\n *  ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *  const loader = new STLLoader();\n *  loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n *    scene.add( new THREE.Mesh( geometry ) );\n *  });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n *  // use the same code to load STL as above\n *  if (geometry.hasColors) {\n *    material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n *  } else { .... }\n *  const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n *  const materials = [];\n *  const nGeometryGroups = geometry.groups.length;\n *\n *  const colorMap = ...; // Some logic to index colors.\n *\n *  for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n *  }\n *\n *  materials.push(material);\n *  const mesh = new THREE.Mesh(geometry, materials);\n */\n\n\nclass STLLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( data ) {\n\n\t\tfunction isBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );\n\t\t\tconst n_faces = reader.getUint32( 80, true );\n\t\t\tconst expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );\n\n\t\t\tif ( expect === reader.byteLength ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// An ASCII STL data must begin with 'solid ' as the first six bytes.\n\t\t\t// However, ASCII STLs lacking the SPACE after the 'd' are known to be\n\t\t\t// plentiful.  So, check the first 5 bytes for 'solid'.\n\n\t\t\t// Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n\t\t\t// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n\t\t\t// Search for \"solid\" to start anywhere after those prefixes.\n\n\t\t\t// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n\t\t\tconst solid = [ 115, 111, 108, 105, 100 ];\n\n\t\t\tfor ( let off = 0; off < 5; off ++ ) {\n\n\t\t\t\t// If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n\t\t\t\tif ( matchDataViewAt( solid, reader, off ) ) return false;\n\n\t\t\t}\n\n\t\t\t// Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction matchDataViewAt( query, reader, offset ) {\n\n\t\t\t// Check if each byte in query matches the corresponding byte from the current offset\n\n\t\t\tfor ( let i = 0, il = query.length; i < il; i ++ ) {\n\n\t\t\t\tif ( query[ i ] !== reader.getUint8( offset + i ) ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst faces = reader.getUint32( 80, true );\n\n\t\t\tlet r, g, b, hasColors = false, colors;\n\t\t\tlet defaultR, defaultG, defaultB, alpha;\n\n\t\t\t// process STL header\n\t\t\t// check for default color in header (\"COLOR=rgba\" sequence).\n\n\t\t\tfor ( let index = 0; index < 80 - 10; index ++ ) {\n\n\t\t\t\tif ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {\n\n\t\t\t\t\thasColors = true;\n\t\t\t\t\tcolors = new Float32Array( faces * 3 * 3 );\n\n\t\t\t\t\tdefaultR = reader.getUint8( index + 6 ) / 255;\n\t\t\t\t\tdefaultG = reader.getUint8( index + 7 ) / 255;\n\t\t\t\t\tdefaultB = reader.getUint8( index + 8 ) / 255;\n\t\t\t\t\talpha = reader.getUint8( index + 9 ) / 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst dataOffset = 84;\n\t\t\tconst faceLength = 12 * 4 + 2;\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst vertices = new Float32Array( faces * 3 * 3 );\n\t\t\tconst normals = new Float32Array( faces * 3 * 3 );\n\n\t\t\tconst color = new Color();\n\n\t\t\tfor ( let face = 0; face < faces; face ++ ) {\n\n\t\t\t\tconst start = dataOffset + face * faceLength;\n\t\t\t\tconst normalX = reader.getFloat32( start, true );\n\t\t\t\tconst normalY = reader.getFloat32( start + 4, true );\n\t\t\t\tconst normalZ = reader.getFloat32( start + 8, true );\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tconst packedColor = reader.getUint16( start + 48, true );\n\n\t\t\t\t\tif ( ( packedColor & 0x8000 ) === 0 ) {\n\n\t\t\t\t\t\t// facet has its own unique color\n\n\t\t\t\t\t\tr = ( packedColor & 0x1F ) / 31;\n\t\t\t\t\t\tg = ( ( packedColor >> 5 ) & 0x1F ) / 31;\n\t\t\t\t\t\tb = ( ( packedColor >> 10 ) & 0x1F ) / 31;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tr = defaultR;\n\t\t\t\t\t\tg = defaultG;\n\t\t\t\t\t\tb = defaultB;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 1; i <= 3; i ++ ) {\n\n\t\t\t\t\tconst vertexstart = start + i * 12;\n\t\t\t\t\tconst componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );\n\n\t\t\t\t\tvertices[ componentIdx ] = reader.getFloat32( vertexstart, true );\n\t\t\t\t\tvertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\t\t\tvertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\t\t\tnormals[ componentIdx ] = normalX;\n\t\t\t\t\tnormals[ componentIdx + 1 ] = normalY;\n\t\t\t\t\tnormals[ componentIdx + 2 ] = normalZ;\n\n\t\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\t\tcolor.set( r, g, b ).convertSRGBToLinear();\n\n\t\t\t\t\t\tcolors[ componentIdx ] = color.r;\n\t\t\t\t\t\tcolors[ componentIdx + 1 ] = color.g;\n\t\t\t\t\t\tcolors[ componentIdx + 2 ] = color.b;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\t\t\t\tgeometry.hasColors = true;\n\t\t\t\tgeometry.alpha = alpha;\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst patternSolid = /solid([\\s\\S]*?)endsolid/g;\n\t\t\tconst patternFace = /facet([\\s\\S]*?)endfacet/g;\n\t\t\tconst patternName = /solid\\s(.+)/;\n\t\t\tlet faceCounter = 0;\n\n\t\t\tconst patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source;\n\t\t\tconst patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );\n\t\t\tconst patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst groupNames = [];\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tlet result;\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet startVertex = 0;\n\t\t\tlet endVertex = 0;\n\n\t\t\twhile ( ( result = patternSolid.exec( data ) ) !== null ) {\n\n\t\t\t\tstartVertex = endVertex;\n\n\t\t\t\tconst solid = result[ 0 ];\n\n\t\t\t\tconst name = ( result = patternName.exec( solid ) ) !== null ? result[ 1 ] : '';\n\t\t\t\tgroupNames.push( name );\n\n\t\t\t\twhile ( ( result = patternFace.exec( solid ) ) !== null ) {\n\n\t\t\t\t\tlet vertexCountPerFace = 0;\n\t\t\t\t\tlet normalCountPerFace = 0;\n\n\t\t\t\t\tconst text = result[ 0 ];\n\n\t\t\t\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tnormal.x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tnormal.y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tnormal.z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tnormalCountPerFace ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tvertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\t\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\t\t\tvertexCountPerFace ++;\n\t\t\t\t\t\tendVertex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// every face have to own ONE valid normal\n\n\t\t\t\t\tif ( normalCountPerFace !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the normal of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// each face have to own THREE valid vertices\n\n\t\t\t\t\tif ( vertexCountPerFace !== 3 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the vertices of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCounter ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst start = startVertex;\n\t\t\t\tconst count = endVertex - startVertex;\n\n\t\t\t\tgeometry.userData.groupNames = groupNames;\n\n\t\t\t\tgeometry.addGroup( start, count, groupCount );\n\t\t\t\tgroupCount ++;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction ensureString( buffer ) {\n\n\t\t\tif ( typeof buffer !== 'string' ) {\n\n\t\t\t\treturn new TextDecoder().decode( buffer );\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction ensureBinary( buffer ) {\n\n\t\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\t\tconst array_buffer = new Uint8Array( buffer.length );\n\t\t\t\tfor ( let i = 0; i < buffer.length; i ++ ) {\n\n\t\t\t\t\tarray_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn array_buffer.buffer || array_buffer;\n\n\t\t\t} else {\n\n\t\t\t\treturn buffer;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// start\n\n\t\tconst binData = ensureBinary( data );\n\n\t\treturn isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );\n\n\t}\n\n}\n\nexport { STLLoader };\n","import {BufferGeometry, Mesh, MeshLambertMaterial, Object3D} from 'three';\nimport {STLLoader} from 'three/examples/jsm/loaders/STLLoader';\nimport {BaseObject3DLoaderHandler, BaseGeoLoader} from './_BaseLoaderHandler';\n\nconst matMesh = new MeshLambertMaterial();\n\nexport class STLLoaderHandler extends BaseObject3DLoaderHandler<BufferGeometry> {\n\tprotected async _getLoader(): Promise<BaseGeoLoader<BufferGeometry>> {\n\t\treturn (this._loader = this._loader || (await new STLLoader(this.loadingManager)));\n\t}\n\tprotected override _onLoadSuccess(o: BufferGeometry): Object3D[] {\n\t\treturn [new Mesh(o, matMesh)];\n\t}\n}\n","import {BufferGeometry} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {STLLoaderHandler} from '../../../core/loader/geometry/STL';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {BaseFileSopOperation, BaseFileSopParams} from './utils/File/_BaseFileOperation';\n\nexport class FileSTLSopOperation extends BaseFileSopOperation<BufferGeometry> {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: sanitizeUrl(`${ASSETS_ROOT}/models/warrior.stl`),\n\t\tmatrixAutoUpdate: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_STL> {\n\t\treturn SopTypeFile.FILE_STL;\n\t}\n\n\tprotected _createGeoLoaderHandler(params: BaseFileSopParams) {\n\t\treturn new STLLoaderHandler(params.url, this._node);\n\t}\n}\n","import {SVGLoader, SVGResult, StrokeStyle} from 'three/examples/jsm/loaders/SVGLoader';\nimport {\n\tShapeGeometry,\n\tLineSegments,\n\tShapePath,\n\tMesh,\n\tDoubleSide,\n\tLineBasicMaterial,\n\tMeshBasicMaterial,\n\tGroup,\n\tColor,\n} from 'three';\nimport {isBooleanTrue} from '../BooleanValue';\nimport {CoreBaseLoader} from './_Base';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport {Poly} from '../../engine/Poly';\n\ninterface CoreSVGLoaderOptions {\n\t// fill\n\tdrawFillShapes: boolean;\n\tfillShapesWireframe: boolean;\n\t// strokes\n\tdrawStrokes: boolean;\n\tstrokesWireframe: boolean;\n\t// style override\n\ttStyleOverride: boolean;\n\tstrokeWidth: number;\n\t// advanced\n\ttadvanced: boolean;\n\tisCCW: boolean;\n\t// noHoles: boolean;\n}\n\ninterface StrokeStyleExtended extends StrokeStyle {\n\tfill: string;\n\tfillOpacity: number;\n\tstroke: string;\n\tstrokeOpacity: number;\n}\ninterface SVGPathUserData {\n\tstyle: StrokeStyleExtended;\n}\n\nexport class CoreSVGLoader extends CoreBaseLoader<string> {\n\tconstructor(url: string, _node?: BaseNodeType) {\n\t\tsuper(url, _node);\n\t}\n\n\tload(options: CoreSVGLoaderOptions): Promise<Group> {\n\t\tif (this._node) {\n\t\t\tPoly.blobs.clearBlobsForNode(this._node);\n\t\t}\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst loader = new SVGLoader(this.loadingManager);\n\n\t\t\t// let resolvedUrl = this.url; //.includes('?') ? this.url : `${this.url}?${Date.now()}`;\n\t\t\t// const paramUrl = this.url;\n\t\t\t// const blobUrl = Poly.blobs.blobUrl(resolvedUrl);\n\t\t\t// if (blobUrl) {\n\t\t\t// \tresolvedUrl = blobUrl;\n\t\t\t// } else {\n\t\t\t// \tif (resolvedUrl[0] != 'h') {\n\t\t\t// \t\tconst assets_root = this.scene.assets.root();\n\t\t\t// \t\tif (assets_root) {\n\t\t\t// \t\t\tresolvedUrl = `${assets_root}${resolvedUrl}`;\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tconst url = this._urlToLoad();\n\n\t\t\tloader.load(\n\t\t\t\turl,\n\t\t\t\t(data) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst group = this._onLoaded(data, options);\n\t\t\t\t\t\tresolve(group);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t(err) => {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\tparse(text: string, options: CoreSVGLoaderOptions) {\n\t\tconst loader = new SVGLoader(this.loadingManager);\n\t\tconst data = loader.parse(text);\n\t\tconst group = this._onLoaded(data, options);\n\t\treturn group;\n\t}\n\n\tprivate _onLoaded(data: SVGResult, options: CoreSVGLoaderOptions) {\n\t\tconst paths = data.paths;\n\n\t\tconst group = new Group();\n\n\t\tfor (let i = 0; i < paths.length; i++) {\n\t\t\tconst path = paths[i];\n\n\t\t\tconst userData: SVGPathUserData = (path as any).userData;\n\t\t\tconst fillColor = userData.style.fill;\n\t\t\tif (isBooleanTrue(options.drawFillShapes) && fillColor !== undefined && fillColor !== 'none') {\n\t\t\t\tthis._drawShapes(group, path, options);\n\t\t\t}\n\n\t\t\t// const strokeColor = userData.style.stroke;\n\n\t\t\tif (isBooleanTrue(options.drawStrokes)) {\n\t\t\t\tthis._drawStrokes(group, path, options);\n\t\t\t}\n\t\t}\n\n\t\treturn group;\n\t}\n\n\tprivate _drawShapes(group: Group, path: ShapePath, options: CoreSVGLoaderOptions) {\n\t\tconst userData: SVGPathUserData = (path as any).userData;\n\t\tconst material = new MeshBasicMaterial({\n\t\t\tcolor: new Color().setStyle(userData.style.fill),\n\t\t\topacity: userData.style.fillOpacity,\n\t\t\ttransparent: userData.style.fillOpacity < 1,\n\t\t\tside: DoubleSide,\n\t\t\tdepthWrite: false,\n\t\t\twireframe: options.fillShapesWireframe,\n\t\t});\n\n\t\tconst isCCW = options.tadvanced && options.isCCW;\n\t\t// const noHoles = options.tadvanced && options.noHoles;\n\n\t\tconst shapes = path.toShapes(isCCW);\n\n\t\tfor (let j = 0; j < shapes.length; j++) {\n\t\t\tconst shape = shapes[j];\n\n\t\t\tconst geometry = new ShapeGeometry(shape);\n\t\t\tconst mesh = new Mesh(geometry, material);\n\n\t\t\tgroup.add(mesh);\n\t\t}\n\t}\n\n\tprivate _drawStrokes(group: Group, path: ShapePath, options: CoreSVGLoaderOptions) {\n\t\tconst userData: SVGPathUserData = (path as any).userData;\n\t\tif (options.tStyleOverride) {\n\t\t\tuserData.style.strokeWidth = options.strokeWidth;\n\t\t}\n\n\t\tif (options.strokesWireframe) {\n\t\t\tconst material = new LineBasicMaterial({\n\t\t\t\tcolor: new Color().setStyle(userData.style.stroke),\n\t\t\t\topacity: userData.style.strokeOpacity,\n\t\t\t\ttransparent: userData.style.strokeOpacity < 1,\n\t\t\t\tside: DoubleSide,\n\t\t\t\tdepthWrite: false,\n\t\t\t});\n\n\t\t\tfor (let j = 0, jl = path.subPaths.length; j < jl; j++) {\n\t\t\t\tconst subPath = path.subPaths[j];\n\n\t\t\t\tconst geometry = SVGLoader.pointsToStroke(subPath.getPoints(), userData.style);\n\n\t\t\t\tif (geometry) {\n\t\t\t\t\tconst mesh = new LineSegments(geometry, material);\n\n\t\t\t\t\tgroup.add(mesh);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst material = new MeshBasicMaterial({\n\t\t\t\tcolor: new Color().setStyle(userData.style.stroke),\n\t\t\t\topacity: userData.style.strokeOpacity,\n\t\t\t\ttransparent: userData.style.strokeOpacity < 1,\n\t\t\t\tside: DoubleSide,\n\t\t\t\tdepthWrite: false,\n\t\t\t\t// wireframe: options.strokesWireframe,\n\t\t\t});\n\t\t\tfor (let j = 0, jl = path.subPaths.length; j < jl; j++) {\n\t\t\t\tconst subPath = path.subPaths[j];\n\n\t\t\t\tconst geometry = SVGLoader.pointsToStroke(subPath.getPoints(), userData.style);\n\n\t\t\t\tif (geometry) {\n\t\t\t\t\tconst mesh = new Mesh(geometry, material);\n\n\t\t\t\t\tgroup.add(mesh);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Mesh, BufferGeometry, Object3D} from 'three';\nimport {ASSETS_ROOT} from '../../../core/loader/AssetsUtils';\nimport {CoreSVGLoader} from '../../../core/loader/SVG';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {SopTypeFile} from '../../poly/registers/nodes/types/Sop';\nimport {sanitizeUrl} from '../../../core/UrlHelper';\n\ninterface SvgSopParams extends DefaultOperationParams {\n\turl: string;\n\t// fill\n\tdrawFillShapes: boolean;\n\tfillShapesWireframe: boolean;\n\t// strokes\n\tdrawStrokes: boolean;\n\tstrokesWireframe: boolean;\n\t// style override\n\ttStyleOverride: boolean;\n\tstrokeWidth: number;\n\t// advanced\n\ttadvanced: boolean;\n\tisCCW: boolean;\n\t// noHoles: boolean;\n}\n\nconst DEFAULT_URL = sanitizeUrl(`${ASSETS_ROOT}/models/svg/tiger.svg`);\nexport class FileSVGSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: SvgSopParams = {\n\t\turl: DEFAULT_URL,\n\t\tdrawFillShapes: true,\n\t\tfillShapesWireframe: false,\n\t\tdrawStrokes: true,\n\t\tstrokesWireframe: false,\n\t\ttStyleOverride: false,\n\t\tstrokeWidth: 1,\n\t\ttadvanced: false,\n\t\tisCCW: false,\n\t\t// noHoles: false,\n\t};\n\tstatic override type(): Readonly<SopTypeFile.FILE_SVG> {\n\t\treturn SopTypeFile.FILE_SVG;\n\t}\n\n\toverride async cook(input_contents: CoreGroup[], params: SvgSopParams): Promise<CoreGroup> {\n\t\tconst loader = new CoreSVGLoader(params.url, this._node);\n\n\t\ttry {\n\t\t\tconst group = await loader.load(params);\n\n\t\t\tfor (let child of group.children) {\n\t\t\t\tthis._ensureGeometryHasIndex(child);\n\t\t\t}\n\n\t\t\treturn this.createCoreGroupFromObjects([...group.children]);\n\t\t} catch (err) {\n\t\t\tthis.states?.error.set(`fail to load SVG (${(err as Error).message})`);\n\t\t\treturn this.createCoreGroupFromObjects([]);\n\t\t}\n\t}\n\n\tprivate _ensureGeometryHasIndex(object: Object3D) {\n\t\tconst mesh = object as Mesh;\n\t\tconst geometry = mesh.geometry;\n\t\tif (geometry) {\n\t\t\tthis.createIndexIfNone(geometry as BufferGeometry);\n\t\t}\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Object3D, PerspectiveCamera} from 'three';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CameraNodeType} from '../../poly/NodeContext';\nimport {registerMapboxCamera} from '../../../core/thirdParty/Mapbox/registerMapboxCamera';\nimport {MapboxPerspectiveCamera} from '../../../core/thirdParty/Mapbox/MapboxPerspectiveCamera';\nimport {CameraAttribute} from '../../../core/camera/CoreCamera';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport type {BaseNodeType} from '../../nodes/_Base';\nimport {MapboxCameraAttribute} from '../../../core/thirdParty/Mapbox/MapboxCameraAttribute';\nimport mapboxgl from 'mapbox-gl';\nimport {Poly} from '../../Poly';\nimport {MAPBOX_TOKEN_MISSING_ERROR_MESSAGE} from '../../poly/thirdParty/Mapbox';\n\ninterface MapboxCameraSopParams extends DefaultOperationParams {\n\tstyle: string;\n\tlongitude: number;\n\tlatitude: number;\n\tzoom: number;\n\tminZoom: number;\n\tmaxZoom: number;\n\tpitch: number;\n\tbearing: number;\n\tallowDragRotate: boolean;\n\taddZoomControl: boolean;\n\ttlayerBuildings: boolean;\n\ttlayer3D: boolean;\n\ttlayerSky: boolean;\n\tname: string;\n}\n\nexport class MapboxCameraSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: MapboxCameraSopParams = {\n\t\tstyle: 'mapbox://styles/mapbox/dark-v10',\n\t\tlongitude: -0.07956,\n\t\tlatitude: 51.5146,\n\t\tzoom: 15.55,\n\t\tminZoom: 0,\n\t\tmaxZoom: 24,\n\t\tpitch: 60,\n\t\tbearing: 60.373613,\n\t\tallowDragRotate: true,\n\t\taddZoomControl: true,\n\t\ttlayerBuildings: false,\n\t\ttlayer3D: false,\n\t\ttlayerSky: false,\n\t\tname: CameraNodeType.MAPBOX,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<CameraNodeType.MAPBOX> {\n\t\treturn CameraNodeType.MAPBOX;\n\t}\n\tstatic override onRegister = registerMapboxCamera;\n\toverride async cook(inputCoreGroups: CoreGroup[], params: MapboxCameraSopParams) {\n\t\tconst camera = MapboxCameraSopOperation.createCamera(this._node);\n\t\tcamera.name = params.name || CameraNodeType.MAPBOX;\n\n\t\tconst token = await Poly.thirdParty.mapbox().token();\n\t\tif (token) {\n\t\t\tmapboxgl.accessToken = token;\n\t\t} else {\n\t\t\tthis._node?.states.error.set(MAPBOX_TOKEN_MISSING_ERROR_MESSAGE);\n\t\t}\n\n\t\t// camera.position.copy(params.position);\n\t\t// camera.rotation.set(\n\t\t// \tMathUtils.degToRad(params.rotation.x),\n\t\t// \tMathUtils.degToRad(params.rotation.y),\n\t\t// \tMathUtils.degToRad(params.rotation.z)\n\t\t// );\n\n\t\t// this needs to be .updateWorldMatrix and not .updateMatrix\n\t\t// as otherwise the camera appears to behave find in most cases,\n\t\t// except when using the sop/cameraRenderScene\n\t\t// camera.updateWorldMatrix(false, false);\n\t\t// camera.updateProjectionMatrix();\n\t\t// camera.matrixAutoUpdate = params.matrixAutoUpdate;\n\n\t\tMapboxCameraSopOperation.setCameraAttributes(camera, params);\n\n\t\tconst objects: Object3D[] = [camera];\n\t\treturn this.createCoreGroupFromObjects(objects);\n\t}\n\tstatic createCamera(nodeGenerator?: BaseNodeType) {\n\t\tconst camera = new MapboxPerspectiveCamera();\n\t\tif (nodeGenerator) {\n\t\t\tThreejsCoreObject.addAttribute(camera, CameraAttribute.NODE_ID, nodeGenerator.graphNodeId());\n\t\t}\n\t\treturn camera;\n\t}\n\tstatic setCameraAttributes(camera: PerspectiveCamera, params: MapboxCameraSopParams) {\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.STYLE, params.style);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.LONGITUDE, params.longitude);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.LATITUDE, params.latitude);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.ZOOM, params.zoom);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.MIN_ZOOM, params.minZoom);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.MAX_ZOOM, params.maxZoom);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.PITCH, params.pitch);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.BEARING, params.bearing);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.ALLOW_DRAG_ROTATE, params.allowDragRotate);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.ADD_ZOOM_CONTROL, params.addZoomControl);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.LAYER_BUILDINGS, params.tlayerBuildings);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.LAYER_3D, params.tlayer3D);\n\t\tThreejsCoreObject.addAttribute(camera, MapboxCameraAttribute.LAYER_SKY, params.tlayerSky);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {Group, Material, Mesh} from 'three';\nimport {CoreGroup, Object3DWithGeometry} from '../../../core/geometry/Group';\nimport {pushOnArrayAtEntry,addToSetAtEntry} from '../../../core/MapUtils';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CoreObjectType, MergeCompactOptions, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {coreObjectClassFactory} from '../../../core/geometry/CoreObjectFactory';\nimport {setToArray} from '../../../core/SetUtils';\nimport {NodeErrorState} from '../../nodes/utils/states/Error';\nimport {NodeContext} from '../../poly/NodeContext';\n\ninterface PreserveMaterialOptions {\n\tpreserveMaterials: boolean;\n}\ninterface MergeSopParams extends PreserveMaterialOptions, DefaultOperationParams {\n\tcompact: boolean;\n}\n\nexport class MergeSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: MergeSopParams = {\n\t\tcompact: false,\n\t\tpreserveMaterials: true,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<'merge'> {\n\t\treturn 'merge';\n\t}\n\n\t// TODO: improvement:\n\t// for compact, I should really keep track of geometry ids,\n\t// to make sure I am not including a geometry twice, if there is a hierarchy\n\toverride cook(inputCoreGroups: CoreGroup[], params: MergeSopParams) {\n\t\tlet allObjects: ObjectContent<CoreObjectType>[] = [];\n\t\tfor (const inputCoreGroup of inputCoreGroups) {\n\t\t\tif (inputCoreGroup) {\n\t\t\t\tconst objects = inputCoreGroup.allObjects();\n\t\t\t\tif (isBooleanTrue(params.compact)) {\n\t\t\t\t\tfor (const object of objects) {\n\t\t\t\t\t\tobject.traverse((child) => {\n\t\t\t\t\t\t\tallObjects.push(child as Object3DWithGeometry);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// if we are not compact,\n\t\t\t\t\t// we only use the current level, not children\n\t\t\t\t\tfor (const object of objects) {\n\t\t\t\t\t\tallObjects.push(object);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isBooleanTrue(params.compact)) {\n\t\t\tallObjects = MergeSopOperation.makeCompact(allObjects, params, this.states?.error);\n\t\t}\n\n\t\treturn this.createCoreGroupFromObjects(allObjects);\n\t}\n\tstatic makeCompact(\n\t\tallObjects: ObjectContent<CoreObjectType>[],\n\t\toptions: PreserveMaterialOptions,\n\t\terrorState?: NodeErrorState<NodeContext>\n\t): ObjectContent<CoreObjectType>[] {\n\t\tconst {preserveMaterials} = options;\n\t\tconst materialsByObjectType: Map<string, Material> = new Map();\n\t\tconst objectsByType: Map<string, ObjectContent<CoreObjectType>[]> = new Map();\n\t\tconst orderedObjectTypes: string[] = [];\n\t\tfor (let object of allObjects) {\n\t\t\tobject.traverse((object3d) => {\n\t\t\t\tif (object3d instanceof Group) {\n\t\t\t\t\t// we do not want groups,\n\t\t\t\t\t// as their children will end up being duplicated\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst objectType: string | undefined = object.type; //objectTypeFromConstructor(object.constructor);\n\t\t\t\tif (objectType) {\n\t\t\t\t\tif (!orderedObjectTypes.includes(objectType)) {\n\t\t\t\t\t\torderedObjectTypes.push(objectType);\n\t\t\t\t\t}\n\t\t\t\t\tif (objectType) {\n\t\t\t\t\t\tconst foundMat = materialsByObjectType.get(objectType);\n\t\t\t\t\t\tif (!foundMat) {\n\t\t\t\t\t\t\tmaterialsByObjectType.set(objectType, (object as Mesh).material as Material);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpushOnArrayAtEntry(objectsByType, objectType, object);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tconst mergedObjects: ObjectContent<CoreObjectType>[] = [];\n\t\torderedObjectTypes.forEach((objectType) => {\n\t\t\tconst material = materialsByObjectType.get(objectType);\n\n\t\t\tconst objects = objectsByType.get(objectType);\n\t\t\tif (objects && objects.length != 0) {\n\t\t\t\t// even with just 1 geometry,\n\t\t\t\t// we should still perform the merge,\n\t\t\t\t// to make sure the output is consistent.\n\t\t\t\t// The main discrepency notices is that if not merged,\n\t\t\t\t// any non-identity matrix will be preserved, when it should not\n\t\t\t\t// if (objects.length == 1) {\n\t\t\t\t// \tmergedObjects.push(objects[0]);\n\t\t\t\t// } else {\n\n\t\t\t\tif (isBooleanTrue(preserveMaterials)) {\n\t\t\t\t\t_makeCompactWithPreservedMaterials({\n\t\t\t\t\t\tobjects,\n\t\t\t\t\t\tmaterial,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\tmergedObjects,\n\t\t\t\t\t\tonError: (message) => {\n\t\t\t\t\t\t\terrorState?.set(message);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst coreObjectClass = coreObjectClassFactory(objects[0]);\n\t\t\t\t\tcoreObjectClass.mergeCompact({\n\t\t\t\t\t\tobjects,\n\t\t\t\t\t\tmaterial,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\tmergedObjects,\n\t\t\t\t\t\tonError: (message) => {\n\t\t\t\t\t\t\terrorState?.set(message);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn mergedObjects;\n\t}\n}\n\nconst objectsByMaterial: Map<Material, Set<ObjectContent<CoreObjectType>>> = new Map();\nfunction _makeCompactWithPreservedMaterials(options: MergeCompactOptions) {\n\tconst {objects, objectType, mergedObjects, onError} = options;\n\tconst coreObjectClass = coreObjectClassFactory(objects[0]);\n\tobjectsByMaterial.clear();\n\tfor (let object of objects) {\n\t\taddToSetAtEntry(objectsByMaterial, object.material, object);\n\t}\n\tobjectsByMaterial.forEach((objectSet, material) => {\n\t\tcoreObjectClass.mergeCompact({\n\t\t\tobjects: setToArray(objectSet, []),\n\t\t\tmaterial,\n\t\t\tobjectType,\n\t\t\tmergedObjects,\n\t\t\tonError,\n\t\t});\n\t});\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {MathUtils, Object3D, OrthographicCamera, Vector3} from 'three';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CameraNodeType} from '../../poly/NodeContext';\nimport {CameraAttribute, CORE_CAMERA_DEFAULT, OrthographicCameraAttribute} from '../../../core/camera/CoreCamera';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {CameraHelper} from '../../../core/helpers/CameraHelper';\nimport {ORTHOGRAPHIC_CAMERA_DEFAULT, registerOrthographicCamera} from '../../../core/camera/CoreOrthographicCamera';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport type {BaseNodeType} from '../../nodes/_Base';\nimport {ObjectType, registerObjectType} from '../../../core/geometry/Constant';\ninterface CreateOrthographicCameraParams {\n\tsize: number;\n\tnear: number;\n\tfar: number;\n}\ninterface OrthographicCameraSopParams extends CreateOrthographicCameraParams, DefaultOperationParams {\n\tsize: number;\n\tposition: Vector3;\n\trotation: Vector3;\n\tshowHelper: boolean;\n\tmatrixAutoUpdate: boolean;\n\tname: string;\n}\ninterface AttributeOptions {\n\tsize: number;\n}\n\nexport class OrthographicCameraSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: OrthographicCameraSopParams = {\n\t\tsize: 1,\n\t\tnear: CORE_CAMERA_DEFAULT.near,\n\t\tfar: CORE_CAMERA_DEFAULT.far,\n\t\tposition: new Vector3(0, 0, 0),\n\t\trotation: new Vector3(0, 0, 0),\n\t\tshowHelper: false,\n\t\tmatrixAutoUpdate: true,\n\t\tname: CameraNodeType.ORTHOGRAPHIC,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<CameraNodeType.ORTHOGRAPHIC> {\n\t\treturn CameraNodeType.ORTHOGRAPHIC;\n\t}\n\tstatic override onRegister = registerOrthographicCamera;\n\toverride cook(inputCoreGroups: CoreGroup[], params: OrthographicCameraSopParams) {\n\t\tconst camera = OrthographicCameraSopOperation.createCamera(params, this._node);\n\t\tcamera.left = ORTHOGRAPHIC_CAMERA_DEFAULT.left * params.size;\n\t\tcamera.right = ORTHOGRAPHIC_CAMERA_DEFAULT.right * params.size;\n\t\tcamera.top = ORTHOGRAPHIC_CAMERA_DEFAULT.top * params.size;\n\t\tcamera.bottom = ORTHOGRAPHIC_CAMERA_DEFAULT.bottom * params.size;\n\t\tcamera.name = params.name || CameraNodeType.ORTHOGRAPHIC;\n\n\t\tcamera.position.copy(params.position);\n\t\tcamera.rotation.set(\n\t\t\tMathUtils.degToRad(params.rotation.x),\n\t\t\tMathUtils.degToRad(params.rotation.y),\n\t\t\tMathUtils.degToRad(params.rotation.z)\n\t\t);\n\n\t\tOrthographicCameraSopOperation.setCameraAttributes(camera, params);\n\n\t\tcamera.updateWorldMatrix(false, false);\n\t\tcamera.updateProjectionMatrix();\n\t\tcamera.matrixAutoUpdate = params.matrixAutoUpdate;\n\n\t\tconst objects: Object3D[] = [camera];\n\t\tif (isBooleanTrue(params.showHelper)) {\n\t\t\tconst helper = new CameraHelper(camera);\n\t\t\thelper.update();\n\t\t\tcamera.add(helper);\n\t\t}\n\n\t\treturn this.createCoreGroupFromObjects(objects);\n\t}\n\tstatic createCamera(params: CreateOrthographicCameraParams, nodeGenerator?: BaseNodeType) {\n\t\tregisterObjectType({\n\t\t\ttype: ObjectType.ORTHOGRAPHIC_CAMERA,\n\t\t\tcheckFunc: (o) => {\n\t\t\t\tif ((o as OrthographicCamera).isOrthographicCamera) {\n\t\t\t\t\treturn ObjectType.ORTHOGRAPHIC_CAMERA;\n\t\t\t\t}\n\t\t\t},\n\t\t\tctor: OrthographicCamera,\n\t\t\thumanName: 'OrthographicCamera',\n\t\t});\n\t\tconst camera = new OrthographicCamera(\n\t\t\tparams.size * 2,\n\t\t\tparams.size * 2,\n\t\t\tparams.size * 2,\n\t\t\tparams.size * 2,\n\t\t\tparams.near,\n\t\t\tparams.far\n\t\t);\n\t\tif (nodeGenerator) {\n\t\t\tThreejsCoreObject.addAttribute(camera, CameraAttribute.NODE_ID, nodeGenerator.graphNodeId());\n\t\t}\n\t\treturn camera;\n\t}\n\tstatic setCameraAttributes(camera: OrthographicCamera, options: AttributeOptions) {\n\t\tThreejsCoreObject.addAttribute(camera, OrthographicCameraAttribute.SIZE, options.size);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Group, Vector2, Object3D, Mesh} from 'three';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CoreMask} from '../../../core/geometry/Mask';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {textureSizeFromPointsCount} from '../../../core/geometry/operation/TextureFromAttribute';\nimport {coreParticlesInitParticlesUVs} from '../../../core/particles/CoreParticlesInit';\n\nconst _textureSize = new Vector2();\n\ninterface ParticlesSystemGpuAttributesSopParams extends DefaultOperationParams {\n\tgroup: string;\n}\n// type TraverseCallback = (coreObject: CoreObject) => void;\nexport class ParticlesSystemGpuAttributesSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: ParticlesSystemGpuAttributesSopParams = {\n\t\tgroup: '',\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<SopType.PARTICLES_SYSTEM_GPU_ATTRIBUTES> {\n\t\treturn SopType.PARTICLES_SYSTEM_GPU_ATTRIBUTES;\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[], params: ParticlesSystemGpuAttributesSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\n\t\tconst selectedObjects = CoreMask.filterThreejsObjects(coreGroup, params);\n\t\tfor (let selectedObject of selectedObjects) {\n\t\t\tthis._applyAttributes(selectedObject, params);\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\n\tprivate _applyAttributes(object: Object3D, params: ParticlesSystemGpuAttributesSopParams) {\n\t\tif ((object as Group).isGroup) {\n\t\t\t// do not assign material to a group, as this could cause render errors\n\t\t\treturn;\n\t\t}\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tif (!geometry) {\n\t\t\treturn;\n\t\t}\n\n\t\ttextureSizeFromPointsCount(geometry, _textureSize);\n\t\tcoreParticlesInitParticlesUVs(object, _textureSize);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {TypedNodePathParamValue} from '../../../core/Walker';\nimport {NodeContext} from '../../../engine/poly/NodeContext';\nimport {applyRenderHook, applyCustomMaterials} from '../../../core/geometry/Material';\nimport {Group, Material, Object3D, Mesh} from 'three';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CoreMask} from '../../../core/geometry/Mask';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {CoreParticlesAttribute} from '../../../core/particles/CoreParticlesAttribute';\nimport {BaseMatNodeType} from '../../nodes/mat/_Base';\n\ninterface MaterialAndNode {\n\tmaterial: Material;\n\tmaterialNode: BaseMatNodeType;\n}\n\ninterface ParticlesSystemGpuMaterialSopParams extends DefaultOperationParams {\n\tgroup: string;\n\tmaterial: TypedNodePathParamValue;\n}\n// type TraverseCallback = (coreObject: CoreObject) => void;\nexport class ParticlesSystemGpuMaterialSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: ParticlesSystemGpuMaterialSopParams = {\n\t\tgroup: '',\n\t\tmaterial: new TypedNodePathParamValue(''),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<SopType.PARTICLES_SYSTEM_GPU_MATERIAL> {\n\t\treturn SopType.PARTICLES_SYSTEM_GPU_MATERIAL;\n\t}\n\n\toverride async cook(inputCoreGroups: CoreGroup[], params: ParticlesSystemGpuMaterialSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tawait this._applyMaterials(coreGroup, params);\n\t\treturn coreGroup;\n\t}\n\n\tprivate async _getMaterial(params: ParticlesSystemGpuMaterialSopParams): Promise<MaterialAndNode | undefined> {\n\t\tconst materialNode = params.material.nodeWithContext(NodeContext.MAT, this.states?.error);\n\t\tif (materialNode) {\n\t\t\tconst material = await materialNode.material();\n\n\t\t\tif (!material) {\n\t\t\t\tthis.states?.error.set(`material invalid. (error: '${materialNode.states.error.message()}')`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {material, materialNode};\n\t\t} else {\n\t\t\tthis.states?.error.set(`no material node found`);\n\t\t}\n\t}\n\n\tprivate async _applyMaterials(coreGroup: CoreGroup, params: ParticlesSystemGpuMaterialSopParams) {\n\t\tconst materialData = await this._getMaterial(params);\n\t\tif (!materialData) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst selectedObjects = CoreMask.filterThreejsObjects(coreGroup, params);\n\n\t\tfor (let selectedObject of selectedObjects) {\n\t\t\tthis._applyMaterial(selectedObject, materialData, params);\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\n\tprivate _applyMaterial(\n\t\tobject: Object3D,\n\t\tmaterialData: MaterialAndNode,\n\t\tparams: ParticlesSystemGpuMaterialSopParams\n\t) {\n\t\tif ((object as Group).isGroup) {\n\t\t\t// do not assign material to a group, as this could cause render errors\n\t\t\treturn;\n\t\t}\n\n\t\tconst objectWithmaterial = object as Mesh;\n\t\t// const current_mat = object_with_material.material as Material | undefined;\n\t\t// if (current_mat && params.swapCurrentTex) {\n\t\t// \tthis._swap_texture(used_material, current_mat, params);\n\t\t// }\n\t\tobjectWithmaterial.material = materialData.material;\n\t\tCoreParticlesAttribute.setMaterialNodeId(object, materialData.materialNode.graphNodeId());\n\n\t\tapplyRenderHook(object, materialData.material);\n\t\tapplyCustomMaterials(object, materialData.material);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {MathUtils, Object3D, PerspectiveCamera, Vector3} from 'three';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {CameraNodeType} from '../../poly/NodeContext';\nimport {PERSPECTIVE_CAMERA_DEFAULT, registerPerspectiveCamera} from '../../../core/camera/CorePerspectiveCamera';\nimport {CameraAttribute, CORE_CAMERA_DEFAULT, PerspectiveCameraAttribute} from '../../../core/camera/CoreCamera';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {CameraHelper} from '../../../core/helpers/CameraHelper';\nimport {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject';\nimport type {BaseNodeType} from '../../nodes/_Base';\nimport {CoreSceneObjectsFactory, GeneratorName} from '../../../core/CoreSceneObjectsFactory';\ninterface CreatePerspectiveCameraParams {\n\tfov: number;\n\tnear: number;\n\tfar: number;\n}\ninterface PerspectiveCameraSopParams extends CreatePerspectiveCameraParams, DefaultOperationParams {\n\tposition: Vector3;\n\trotation: Vector3;\n\tshowHelper: boolean;\n\tmatrixAutoUpdate: boolean;\n\tname: string;\n\t// PBR\n\tapertureBlades: number;\n\tfStop: number;\n\tfocusDistance: number;\n\tapertureRotation: number;\n\tanamorphicRatio: number;\n}\ninterface AttributeOptions {\n\tfov: number;\n}\n\nexport class PerspectiveCameraSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: PerspectiveCameraSopParams = {\n\t\tfov: PERSPECTIVE_CAMERA_DEFAULT.fov,\n\t\tnear: CORE_CAMERA_DEFAULT.near,\n\t\tfar: CORE_CAMERA_DEFAULT.far,\n\t\tposition: new Vector3(0, 0, 0),\n\t\trotation: new Vector3(0, 0, 0),\n\t\tshowHelper: false,\n\t\tmatrixAutoUpdate: true,\n\t\tname: CameraNodeType.PERSPECTIVE,\n\t\t// PBR\n\t\tapertureBlades: 6,\n\t\tfStop: 0.6,\n\t\tfocusDistance: 10,\n\t\tapertureRotation: 0,\n\t\tanamorphicRatio: 1,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<CameraNodeType.PERSPECTIVE> {\n\t\treturn CameraNodeType.PERSPECTIVE;\n\t}\n\tstatic override onRegister = registerPerspectiveCamera;\n\toverride cook(inputCoreGroups: CoreGroup[], params: PerspectiveCameraSopParams) {\n\t\tconst camera = PerspectiveCameraSopOperation.createCamera(params, this._node);\n\t\tcamera.name = params.name || CameraNodeType.PERSPECTIVE;\n\n\t\tcamera.position.copy(params.position);\n\t\tcamera.rotation.set(\n\t\t\tMathUtils.degToRad(params.rotation.x),\n\t\t\tMathUtils.degToRad(params.rotation.y),\n\t\t\tMathUtils.degToRad(params.rotation.z)\n\t\t);\n\n\t\t// this needs to be .updateWorldMatrix and not .updateMatrix\n\t\t// as otherwise the camera appears to behave find in most cases,\n\t\t// except when using the sop/cameraRenderScene\n\t\tcamera.updateWorldMatrix(false, false);\n\t\tcamera.updateProjectionMatrix();\n\t\tcamera.matrixAutoUpdate = params.matrixAutoUpdate;\n\n\t\tPerspectiveCameraSopOperation.setCameraAttributes(camera, params);\n\n\t\tconst pbrUpdateFunc = CoreSceneObjectsFactory.generator(GeneratorName.PERSPECTIVE_CAMERA_UPDATE);\n\n\t\tpbrUpdateFunc({\n\t\t\tcamera,\n\t\t\tparams: {\n\t\t\t\tapertureBlades: params.apertureBlades,\n\t\t\t\tfStop: params.fStop,\n\t\t\t\tfocusDistance: params.focusDistance,\n\t\t\t\tapertureRotation: params.apertureRotation,\n\t\t\t\tanamorphicRatio: params.anamorphicRatio,\n\t\t\t},\n\t\t});\n\n\t\tconst objects: Object3D[] = [camera];\n\t\tif (isBooleanTrue(params.showHelper)) {\n\t\t\tconst helper = new CameraHelper(camera);\n\t\t\thelper.update();\n\t\t\tcamera.add(helper);\n\t\t}\n\n\t\treturn this.createCoreGroupFromObjects(objects);\n\t}\n\tstatic createCamera(params: CreatePerspectiveCameraParams, nodeGenerator?: BaseNodeType) {\n\t\tconst camera = CoreSceneObjectsFactory.generator(GeneratorName.PERSPECTIVE_CAMERA)({\n\t\t\tfov: params.fov,\n\t\t\taspect: 1,\n\t\t\tnear: params.near,\n\t\t\tfar: params.far,\n\t\t});\n\t\tif (nodeGenerator) {\n\t\t\tThreejsCoreObject.addAttribute(camera, CameraAttribute.NODE_ID, nodeGenerator.graphNodeId());\n\t\t}\n\t\treturn camera;\n\t}\n\tstatic setCameraAttributes(camera: PerspectiveCamera, options: AttributeOptions) {\n\t\tThreejsCoreObject.addAttribute(camera, PerspectiveCameraAttribute.FOV, options.fov);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Vector3, Box3} from 'three';\nimport {CoreTransform} from '../../../core/Transform';\nimport {RoundedBoxGeometry} from 'three/examples/jsm/geometries/RoundedBoxGeometry';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nconst tmpBox = new Box3();\nconst tmpSize = new Vector3();\nconst tmpCenter = new Vector3();\ninterface RoundedBoxSopParams extends DefaultOperationParams {\n\tsize: number;\n\tsizes: Vector3;\n\tdivisions: number;\n\tbevel: number;\n\tcenter: Vector3;\n}\n\nexport class RoundedBoxSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: RoundedBoxSopParams = {\n\t\tsize: 1,\n\t\tsizes: new Vector3(1, 1, 1),\n\t\tdivisions: 2,\n\t\tbevel: 0.1,\n\t\tcenter: new Vector3(0, 0, 0),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<'roundedBox'> {\n\t\treturn 'roundedBox';\n\t}\n\tprivate _coreTransform = new CoreTransform();\n\toverride cook(inputCoreGroups: CoreGroup[], params: RoundedBoxSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\t\tconst geometry = coreGroup ? this._cookWithInput(coreGroup, params) : this._cookWithoutInput(params);\n\n\t\treturn this.createCoreGroupFromGeometry(geometry);\n\t}\n\tprivate _cookWithoutInput(params: RoundedBoxSopParams) {\n\t\tconst {sizes, size} = params;\n\t\tconst geometry = new RoundedBoxGeometry(\n\t\t\tsizes.x * size,\n\t\t\tsizes.y * size,\n\t\t\tsizes.z * size,\n\t\t\tparams.divisions,\n\t\t\tparams.bevel\n\t\t);\n\t\tgeometry.translate(params.center.x, params.center.y, params.center.z);\n\t\tgeometry.computeVertexNormals();\n\t\treturn geometry;\n\t}\n\n\tprivate _cookWithInput(coreGroup: CoreGroup, params: RoundedBoxSopParams) {\n\t\tcoreGroup.boundingBox(tmpBox);\n\t\ttmpBox.getSize(tmpSize);\n\t\ttmpBox.getCenter(tmpCenter);\n\n\t\tconst geometry = new RoundedBoxGeometry(tmpSize.x, tmpSize.y, tmpSize.z, params.divisions, params.bevel);\n\t\tconst matrix = this._coreTransform.translationMatrix(tmpCenter);\n\t\tgeometry.applyMatrix4(matrix);\n\t\treturn geometry;\n\t}\n}\n","import {BufferGeometry} from 'three';\nimport {BufferAttribute} from 'three';\nimport {InterleavedBufferAttribute} from 'three';\nimport {Triangle} from 'three';\nimport {Vector3} from 'three';\nimport {Mesh} from 'three';\n\n/**\n * typescript port of https://github.com/mrdoob/three.js/blob/dev/examples/jsm/math/MeshSurfaceSampler.js\n */\n\nconst _face = new Triangle();\n// const _color = new Vector3();\n\ntype RandomFuncWithoutSeed = () => number;\ntype RandomFuncWithSeed = (index: number) => number;\ntype RandomFunc = RandomFuncWithoutSeed | RandomFuncWithSeed;\n\nexport class MeshSurfaceSampler {\n\tprivate geometry: BufferGeometry;\n\tprivate randomFunction: RandomFunc = Math.random;\n\tprivate positionAttribute: BufferAttribute | InterleavedBufferAttribute;\n\tprivate additionalAttributes: Map<string, BufferAttribute | InterleavedBufferAttribute> = new Map();\n\tprivate weightAttribute: BufferAttribute | InterleavedBufferAttribute | null = null;\n\tprivate distribution: Float32Array | null = null;\n\tconstructor(mesh: Mesh, private additionalAttributeNames: string[]) {\n\t\tlet geometry = mesh.geometry;\n\n\t\tif (!geometry.isBufferGeometry || geometry.attributes.position.itemSize !== 3) {\n\t\t\tthrow new Error('THREE.MeshSurfaceSampler: Requires BufferGeometry triangle mesh.');\n\t\t}\n\n\t\tif (geometry.index) {\n\t\t\tconsole.warn('THREE.MeshSurfaceSampler: Converting geometry to non-indexed BufferGeometry.');\n\n\t\t\tgeometry = geometry.toNonIndexed();\n\t\t}\n\n\t\tthis.geometry = geometry;\n\n\t\tthis.positionAttribute = this.geometry.getAttribute('position') as BufferAttribute;\n\t\tfor (let attribName of additionalAttributeNames) {\n\t\t\tconst attribute = this.geometry.getAttribute(attribName) as BufferAttribute;\n\t\t\tif (attribute) {\n\t\t\t\tthis.additionalAttributes.set(attribName, attribute);\n\t\t\t}\n\t\t}\n\t}\n\n\tsetWeightAttribute(name: string) {\n\t\tthis.weightAttribute = name ? (this.geometry.getAttribute(name) as BufferAttribute) : null;\n\n\t\treturn this;\n\t}\n\n\tbuild() {\n\t\tconst positionAttribute = this.positionAttribute;\n\t\tconst weightAttribute = this.weightAttribute;\n\n\t\tconst faceWeights = new Float32Array(positionAttribute.count / 3);\n\n\t\t// Accumulate weights for each mesh face.\n\n\t\tfor (let i = 0; i < positionAttribute.count; i += 3) {\n\t\t\tlet faceWeight = 1;\n\n\t\t\tif (weightAttribute) {\n\t\t\t\tfaceWeight = weightAttribute.getX(i) + weightAttribute.getX(i + 1) + weightAttribute.getX(i + 2);\n\t\t\t}\n\n\t\t\t_face.a.fromBufferAttribute(positionAttribute, i);\n\t\t\t_face.b.fromBufferAttribute(positionAttribute, i + 1);\n\t\t\t_face.c.fromBufferAttribute(positionAttribute, i + 2);\n\t\t\tfaceWeight *= _face.getArea();\n\n\t\t\tfaceWeights[i / 3] = faceWeight;\n\t\t}\n\n\t\t// Store cumulative total face weights in an array, where weight index\n\t\t// corresponds to face index.\n\n\t\tthis.distribution = new Float32Array(positionAttribute.count / 3);\n\n\t\tlet cumulativeTotal = 0;\n\n\t\tfor (let i = 0; i < faceWeights.length; i++) {\n\t\t\tcumulativeTotal += faceWeights[i];\n\n\t\t\tthis.distribution[i] = cumulativeTotal;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tsetRandomGenerator(randomFunction: RandomFunc) {\n\t\tthis.randomFunction = randomFunction;\n\t\treturn this;\n\t}\n\n\tsample(index: number, targetPosition: Vector3, targetNormal: Vector3, targetAdditionalVectors?: Vector3[]) {\n\t\tconst cumulativeTotal = this.distribution![this.distribution!.length - 1];\n\t\tconst faceIndex = this.binarySearch(this.randomFunction(index) * cumulativeTotal);\n\n\t\treturn this.sampleFace(index, faceIndex, targetPosition, targetNormal, targetAdditionalVectors);\n\t}\n\n\tbinarySearch(x: number) {\n\t\tconst dist = this.distribution!;\n\t\tlet start = 0;\n\t\tlet end = dist.length - 1;\n\n\t\tlet index = -1;\n\n\t\twhile (start <= end) {\n\t\t\tconst mid = Math.ceil((start + end) / 2);\n\n\t\t\tif (mid === 0 || (dist[mid - 1] <= x && dist[mid] > x)) {\n\t\t\t\tindex = mid;\n\n\t\t\t\tbreak;\n\t\t\t} else if (x < dist[mid]) {\n\t\t\t\tend = mid - 1;\n\t\t\t} else {\n\t\t\t\tstart = mid + 1;\n\t\t\t}\n\t\t}\n\n\t\treturn index;\n\t}\n\n\tsampleFace(\n\t\ti: number,\n\t\tfaceIndex: number,\n\t\ttargetPosition: Vector3,\n\t\ttargetNormal: Vector3,\n\t\ttargetAdditionalVectors?: Vector3[]\n\t) {\n\t\tlet u = this.randomFunction(i * (faceIndex + 1456));\n\t\tlet v = this.randomFunction((i + 9851) * (faceIndex + 7646));\n\n\t\tif (u + v > 1) {\n\t\t\tu = 1 - u;\n\t\t\tv = 1 - v;\n\t\t}\n\n\t\t_face.a.fromBufferAttribute(this.positionAttribute, faceIndex * 3);\n\t\t_face.b.fromBufferAttribute(this.positionAttribute, faceIndex * 3 + 1);\n\t\t_face.c.fromBufferAttribute(this.positionAttribute, faceIndex * 3 + 2);\n\n\t\ttargetPosition\n\t\t\t.set(0, 0, 0)\n\t\t\t.addScaledVector(_face.a, u)\n\t\t\t.addScaledVector(_face.b, v)\n\t\t\t.addScaledVector(_face.c, 1 - (u + v));\n\n\t\tif (targetNormal !== undefined) {\n\t\t\t_face.getNormal(targetNormal);\n\t\t}\n\n\t\tif (targetAdditionalVectors) {\n\t\t\tlet i = 0;\n\t\t\tfor (let attribName of this.additionalAttributeNames) {\n\t\t\t\tconst attrib = this.additionalAttributes.get(attribName);\n\t\t\t\tif (attrib) {\n\t\t\t\t\t_face.a.fromBufferAttribute(attrib, faceIndex * 3);\n\t\t\t\t\t_face.b.fromBufferAttribute(attrib, faceIndex * 3 + 1);\n\t\t\t\t\t_face.c.fromBufferAttribute(attrib, faceIndex * 3 + 2);\n\t\t\t\t\tconst targetVector = targetAdditionalVectors[i];\n\t\t\t\t\ttargetVector\n\t\t\t\t\t\t.set(0, 0, 0)\n\t\t\t\t\t\t.addScaledVector(_face.a, u)\n\t\t\t\t\t\t.addScaledVector(_face.b, v)\n\t\t\t\t\t\t.addScaledVector(_face.c, 1 - (u + v));\n\t\t\t\t}\n\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {Mesh, BufferGeometry, BufferAttribute, Vector2, Vector3, Vector4} from 'three';\nimport {ObjectType} from '../../../core/geometry/Constant';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {rangeWithEnd} from '../../../core/ArrayUtils';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {Attribute} from '../../../core/geometry/Attribute';\nimport {MeshSurfaceSampler} from '../../../modules/core/math/MeshSurfaceSampler';\nimport {CoreMath} from '../../../core/math/_Module';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\n\ninterface ScatterSopParams extends DefaultOperationParams {\n\tpointsCount: number;\n\tseed: number;\n\tuseWeightAttribute: boolean;\n\tweightAttribute: string;\n\ttransferAttributes: boolean;\n\tattributesToTransfer: string;\n\taddIdAttribute: boolean;\n\taddIdnAttribute: boolean;\n}\nconst tmpV2 = new Vector2();\nconst tmpV4 = new Vector4();\n\nexport class ScatterSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: ScatterSopParams = {\n\t\tpointsCount: 100,\n\t\tseed: 0,\n\t\tuseWeightAttribute: false,\n\t\tweightAttribute: '',\n\t\ttransferAttributes: false,\n\t\tattributesToTransfer: '',\n\t\taddIdAttribute: true,\n\t\taddIdnAttribute: true,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<'scatter'> {\n\t\treturn 'scatter';\n\t}\n\n\tprivate _position = new Vector3();\n\tprivate _normal = new Vector3();\n\toverride cook(inputContents: CoreGroup[], params: ScatterSopParams) {\n\t\tconst coreGroup = inputContents[0];\n\t\tlet inputMesh = coreGroup.threejsObjectsWithGeo()[0] as Mesh;\n\t\tif (inputMesh) {\n\t\t\treturn this._createPoints(inputMesh, coreGroup, params);\n\t\t} else {\n\t\t\treturn this.createCoreGroupFromObjects([]);\n\t\t}\n\t}\n\tprivate _createPoints(inputMesh: Mesh, coreGroup: CoreGroup, params: ScatterSopParams) {\n\t\tconst originalMesh = inputMesh;\n\n\t\tlet inputGeometry = inputMesh.geometry;\n\t\tif (inputGeometry.index) {\n\t\t\tinputGeometry = inputGeometry.toNonIndexed();\n\t\t\tconst newMesh = new Mesh(inputGeometry);\n\t\t\tinputMesh = newMesh;\n\t\t}\n\n\t\tconst transferAttributes = params.transferAttributes;\n\t\tlet attribNames: string[] = [];\n\t\tif (isBooleanTrue(transferAttributes)) {\n\t\t\tattribNames = coreGroup.pointAttribNamesMatchingMask(params.attributesToTransfer);\n\t\t}\n\n\t\tconst sampler = new MeshSurfaceSampler(inputMesh, attribNames);\n\t\tif (isBooleanTrue(params.useWeightAttribute)) {\n\t\t\tconst weightAttributeName = params.weightAttribute.trim();\n\t\t\tif (weightAttributeName != '') {\n\t\t\t\tsampler.setWeightAttribute(weightAttributeName);\n\t\t\t}\n\t\t}\n\t\tconst baseSeed = (2454 * params.seed) % Number.MAX_SAFE_INTEGER;\n\t\tsampler.setRandomGenerator((index: number) => {\n\t\t\treturn CoreMath.randFloat(baseSeed, index);\n\t\t});\n\t\tsampler.build();\n\n\t\tconst pointsCount = params.pointsCount;\n\t\tconst positions: number[] = new Array(pointsCount * 3);\n\t\tconst normals: number[] = new Array(pointsCount * 3);\n\n\t\t// additional attributes\n\t\tconst additionalVectors: Vector3[] = new Array(attribNames.length);\n\t\tconst additionalAttribSizes: number[] = new Array(attribNames.length);\n\t\tconst additionalAttribSizeByName: Map<string, number> = new Map();\n\t\tconst additionalAttribBuffers: number[][] = new Array(attribNames.length);\n\t\tconst additionalAttribBuffersByName: Map<string, number[]> = new Map();\n\t\tfor (let i = 0; i < attribNames.length; i++) {\n\t\t\tconst attribName = attribNames[i];\n\t\t\tadditionalVectors[i] = new Vector3();\n\t\t\tconst attribSize = inputMesh.geometry.getAttribute(attribNames[i]).itemSize;\n\t\t\tadditionalAttribSizeByName.set(attribName, attribSize);\n\t\t\tadditionalAttribSizes[i] = attribSize;\n\t\t\tadditionalAttribBuffers[i] = new Array(pointsCount * attribSize);\n\t\t\tadditionalAttribBuffersByName.set(attribName, additionalAttribBuffers[i]);\n\t\t}\n\t\tconst processAdditionalAttributes = attribNames.length > 0;\n\n\t\tconst _position = this._position;\n\t\tconst _normal = this._normal;\n\t\tlet i3 = 0;\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\tsampler.sample(i, _position, _normal, additionalVectors);\n\t\t\ti3 = i * 3;\n\t\t\t_position.toArray(positions, i3);\n\t\t\t_normal.toArray(normals, i3);\n\n\t\t\t// additional attributes\n\t\t\tif (processAdditionalAttributes) {\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let additionalVector of additionalVectors) {\n\t\t\t\t\tconst array = additionalAttribBuffers[j];\n\t\t\t\t\tconst attribSize = additionalAttribSizes[j];\n\t\t\t\t\tconst arrayIndex = i * attribSize;\n\t\t\t\t\tif (i < pointsCount - 1) {\n\t\t\t\t\t\tadditionalVector.toArray(array, arrayIndex);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// when copying to the last point, we need to make sure not to use the vector3\n\t\t\t\t\t\t// if the attribsize is not 3, otherwise we end up increasing the size of the buffer\n\t\t\t\t\t\tif (attribSize == 3) {\n\t\t\t\t\t\t\tadditionalVector.toArray(array, arrayIndex);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tswitch (attribSize) {\n\t\t\t\t\t\t\t\tcase 1: {\n\t\t\t\t\t\t\t\t\tarray[arrayIndex] = additionalVector.x;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase 2: {\n\t\t\t\t\t\t\t\t\ttmpV2.set(additionalVector.x, additionalVector.y);\n\t\t\t\t\t\t\t\t\ttmpV2.toArray(array, arrayIndex);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase 4: {\n\t\t\t\t\t\t\t\t\ttmpV4.set(additionalVector.x, additionalVector.y, additionalVector.z, 0);\n\t\t\t\t\t\t\t\t\ttmpV4.toArray(array, arrayIndex);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute(Attribute.POSITION, new BufferAttribute(new Float32Array(positions), 3));\n\t\tgeometry.setAttribute(Attribute.NORMAL, new BufferAttribute(new Float32Array(normals), 3));\n\t\tfor (let attribName of attribNames) {\n\t\t\tconst attribSize = additionalAttribSizeByName.get(attribName);\n\t\t\tconst buffer = additionalAttribBuffersByName.get(attribName);\n\t\t\tif (attribSize != null && buffer != null) {\n\t\t\t\tgeometry.setAttribute(attribName, new BufferAttribute(new Float32Array(buffer), attribSize));\n\t\t\t}\n\t\t}\n\n\t\t// add id\n\t\tif (isBooleanTrue(params.addIdAttribute) || isBooleanTrue(params.addIdnAttribute)) {\n\t\t\tconst pointsCount = params.pointsCount;\n\t\t\tconst ids: number[] = rangeWithEnd(pointsCount);\n\t\t\tif (isBooleanTrue(params.addIdAttribute)) {\n\t\t\t\tgeometry.setAttribute('id', new BufferAttribute(new Float32Array(ids), 1));\n\t\t\t}\n\t\t\tconst idns = ids.map((id) => id / (pointsCount - 1));\n\t\t\tif (isBooleanTrue(params.addIdnAttribute)) {\n\t\t\t\tgeometry.setAttribute('idn', new BufferAttribute(new Float32Array(idns), 1));\n\t\t\t}\n\t\t}\n\n\t\tconst object = this.createObject(geometry, ObjectType.POINTS);\n\t\tobject.position.copy(originalMesh.position);\n\t\tobject.rotation.copy(originalMesh.rotation);\n\t\tobject.scale.copy(originalMesh.scale);\n\t\tobject.matrix.copy(originalMesh.matrix);\n\t\treturn this.createCoreGroupFromObjects([object]);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {isBooleanTrue} from '../../../core/BooleanValue';\nimport {\n\tSpotLightParams,\n\tDEFAULT_SPOT_LIGHT_PARAMS,\n\tSpotLightContainer,\n\tSpotLightContainerParams,\n} from '../../../core/lights/SpotLight';\nimport {LightUserDataRaymarching} from '../../../core/lights/Common';\nimport {SpotLight} from 'three';\nimport {NodeContext} from '../../poly/NodeContext';\n\nexport class SpotLightSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: SpotLightParams = DEFAULT_SPOT_LIGHT_PARAMS;\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER;\n\tstatic override type(): Readonly<'spotLight'> {\n\t\treturn 'spotLight';\n\t}\n\toverride async cook(inputCoreGroups: CoreGroup[], params: SpotLightParams) {\n\t\tconst container = this.createLight(params);\n\t\tcontainer.light().name = params.name;\n\n\t\tawait this.updateLightParams(container, params);\n\t\tthis.updateShadowParams(container, params);\n\t\tcontainer.updateParams(params);\n\t\tcontainer.updateHelper();\n\t\tcontainer.updateVolumetric();\n\n\t\treturn this.createCoreGroupFromObjects([container]);\n\t}\n\n\tcreateLight(params: SpotLightContainerParams) {\n\t\tconst container = new SpotLightContainer(params, this._node?.name() || '_');\n\t\tconst light = container.light();\n\t\tlight.matrixAutoUpdate = false;\n\n\t\tlight.castShadow = true;\n\t\tlight.shadow.bias = -0.001;\n\t\tlight.shadow.mapSize.x = 1024;\n\t\tlight.shadow.mapSize.y = 1024;\n\t\tlight.shadow.camera.near = 0.1;\n\n\t\treturn container;\n\t}\n\tasync updateLightParams(container: SpotLightContainer, params: SpotLightParams): Promise<void> {\n\t\tconst light = container.light();\n\n\t\tlight.color = params.color;\n\t\tlight.intensity = params.intensity;\n\t\tlight.angle = params.angle * (Math.PI / 180);\n\t\tlight.penumbra = params.penumbra;\n\t\tlight.decay = params.decay;\n\t\tlight.distance = params.distance;\n\t\t// TODO: consider allow power to be edited\n\t\t// (maybe it will need a setting to toggle physicallyCorrect, which would then show the power param)\n\t\t// this.light.power = 1;\n\n\t\t// this._helperController.update();\n\t\t// this._volumetricController.update();\n\t\tlight.userData[LightUserDataRaymarching.PENUMBRA] = params.raymarchingPenumbra;\n\t\tlight.userData[LightUserDataRaymarching.SHADOW_BIAS_ANGLE] = params.raymarchingShadowBiasAngle;\n\t\tlight.userData[LightUserDataRaymarching.SHADOW_BIAS_DISTANCE] = params.raymarchingShadowBiasDistance;\n\t\tawait this._updateLightMap(light, params);\n\t}\n\tprivate async _updateLightMap(light: SpotLight, params: SpotLightParams) {\n\t\tif (!params.tmap) {\n\t\t\tlight.map = null;\n\t\t\treturn;\n\t\t}\n\t\tconst textureNode = params.map.nodeWithContext(NodeContext.COP, this.states?.error);\n\t\tif (textureNode) {\n\t\t\tconst container = await textureNode.compute();\n\t\t\tconst texture = container.coreContent();\n\n\t\t\tif (!texture) {\n\t\t\t\tthis.states?.error.set(`texture invalid. (error: '${textureNode.states.error.message()}')`);\n\t\t\t}\n\n\t\t\tlight.map = texture || null;\n\t\t} else {\n\t\t\tthis.states?.error.set(`no texture node found`);\n\t\t}\n\t}\n\n\tupdateShadowParams(container: SpotLightContainer, params: SpotLightParams) {\n\t\tconst light = container.light();\n\n\t\tlight.castShadow = isBooleanTrue(params.castShadow);\n\t\tlight.shadow.autoUpdate = isBooleanTrue(params.shadowAutoUpdate);\n\t\tlight.shadow.needsUpdate = isBooleanTrue(params.shadowUpdateOnNextRender);\n\n\t\tlight.shadow.mapSize.copy(params.shadowRes);\n\t\tconst map = light.shadow.map;\n\t\tif (map) {\n\t\t\tmap.setSize(params.shadowRes.x, params.shadowRes.y);\n\t\t}\n\t\t// if (light.castShadow && isBooleanTrue(params.debugShadow)) {\n\t\t// \tlight.add(this._debugShadowMesh(light));\n\t\t// } else {\n\t\t// \tif (this.__debugShadowMesh) {\n\t\t// \t\tlight.remove(this.__debugShadowMesh);\n\t\t// \t}\n\t\t// }\n\n\t\tlight.shadow.bias = params.shadowBias;\n\t\tlight.shadow.radius = params.shadowRadius;\n\t\tlight.shadow.camera.near = params.shadowNear;\n\t\tlight.shadow.camera.far = params.shadowFar;\n\n\t\tlight.shadow.camera.updateProjectionMatrix();\n\n\t\tcontainer.updateHelper();\n\t}\n\t// private __debugShadowMesh: Mesh<PlaneGeometry, MeshBasicMaterial> | undefined;\n\t// private _debugShadowMesh(light: SpotLight) {\n\t// \treturn (this.__debugShadowMesh = this.__debugShadowMesh || this._createDebugShadowMesh(light));\n\t// }\n\t// private _createDebugShadowMesh(light: SpotLight) {\n\t// \tconst material = new MeshBasicMaterial({\n\t// \t\tcolor: new Color(1, 1, 1),\n\t// \t\tmap: light.shadow.map.texture,\n\t// \t\tside: DoubleSide,\n\t// \t});\n\t// \tconst mesh = new Mesh(new PlaneGeometry(5, 5, 2, 2), material);\n\t// \tmesh.position.z = 1;\n\t// \tmesh.castShadow = false;\n\t// \tmesh.receiveShadow = false;\n\t// \treturn mesh;\n\t// }\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup, Object3DWithGeometry} from '../../../core/geometry/Group';\nimport {TypeAssert} from '../../../engine/poly/Assert';\n\nimport {\n\tCoreTransform,\n\tROTATION_ORDERS,\n\tRotationOrder,\n\tTransformTargetType,\n\tTRANSFORM_TARGET_TYPES,\n} from '../../../core/Transform';\n\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {coreObjectClassFactory} from '../../../core/geometry/CoreObjectFactory';\nimport {MathUtils, Vector3, Object3D, Matrix4, Euler, Quaternion} from 'three';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\nimport {\n\tOBJECT_TRANSFORM_SPACES,\n\tOBJECT_TRANSFORM_MODES,\n\tObjectTransformMode,\n\tObjectTransformSpace,\n\tapplyTransformWithSpaceToObject,\n} from '../../../core/TransformSpace';\nimport {CoreObjectType, isObject3D, ObjectContent} from '../../../core/geometry/ObjectContent';\nimport {CoreMask} from '../../../core/geometry/Mask';\nimport {SopType} from '../../poly/registers/nodes/types/Sop';\nimport {pointsFromObjectFromGroup} from '../../../core/geometry/entities/point/CorePointUtils';\nimport {CorePoint} from '../../../core/geometry/entities/point/CorePoint';\n\n// const _t = new Vector3();\nconst _r = new Vector3();\nconst _euler = new Euler();\nconst _q = new Quaternion();\nconst _s = new Vector3();\nconst _mat4 = new Matrix4();\nconst _pointPos = new Vector3();\n\ninterface TransformSopParams extends DefaultOperationParams {\n\tapplyOn: number;\n\tgroup: string;\n\t//\n\tobjectMode: number;\n\tobjectTransformSpace: number;\n\tpointGroup: string;\n\trotationOrder: number;\n\tt: Vector3;\n\tr: Vector3;\n\ts: Vector3;\n\tscale: number;\n\tpivot: Vector3;\n}\nconst _points: CorePoint<CoreObjectType>[] = [];\nexport class TransformSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: TransformSopParams = {\n\t\tapplyOn: TRANSFORM_TARGET_TYPES.indexOf(TransformTargetType.GEOMETRY),\n\t\tgroup: '',\n\t\tobjectMode: OBJECT_TRANSFORM_MODES.indexOf(ObjectTransformMode.SET),\n\t\tobjectTransformSpace: OBJECT_TRANSFORM_SPACES.indexOf(ObjectTransformSpace.PARENT),\n\t\tpointGroup: '',\n\t\trotationOrder: ROTATION_ORDERS.indexOf(RotationOrder.XYZ),\n\t\tt: new Vector3(0, 0, 0),\n\t\tr: new Vector3(0, 0, 0),\n\t\ts: new Vector3(1, 1, 1),\n\t\tscale: 1,\n\t\tpivot: new Vector3(0, 0, 0),\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<SopType.TRANSFORM> {\n\t\treturn SopType.TRANSFORM;\n\t}\n\n\tprivate _coreTransform = new CoreTransform();\n\toverride cook(inputCoreGroups: CoreGroup[], params: TransformSopParams) {\n\t\tconst coreGroup = inputCoreGroups[0];\n\n\t\tconst selectedObjects = CoreMask.filterObjects(coreGroup, params);\n\t\tfor (const inputObject of selectedObjects) {\n\t\t\tthis._applyTransform(inputObject, coreGroup, params);\n\t\t}\n\t\tcoreGroup.resetBoundingBox();\n\t\treturn coreGroup;\n\t}\n\n\tprivate _applyTransform(object: ObjectContent<CoreObjectType>, coreGroup: CoreGroup, params: TransformSopParams) {\n\t\tif (isObject3D(object)) {\n\t\t\tthis._applyTransformWithTransformTargetType(object, coreGroup, params);\n\t\t} else {\n\t\t\tthis._applyTransformWithoutTransformTargetType(object, params);\n\t\t}\n\t}\n\tprivate _applyTransformWithoutTransformTargetType(\n\t\tobject: ObjectContent<CoreObjectType>,\n\t\tparams: TransformSopParams\n\t) {\n\t\tthis._updateObject(object, params);\n\t}\n\tprivate _applyTransformWithTransformTargetType(object: Object3D, coreGroup: CoreGroup, params: TransformSopParams) {\n\t\tconst mode = TRANSFORM_TARGET_TYPES[params.applyOn];\n\t\tswitch (mode) {\n\t\t\tcase TransformTargetType.GEOMETRY: {\n\t\t\t\treturn this._updateGeometry(object, params);\n\t\t\t}\n\t\t\tcase TransformTargetType.OBJECT: {\n\t\t\t\treturn this._updateObject(object, params);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(mode);\n\t}\n\n\tprivate _updateGeometry(object: Object3D, params: TransformSopParams) {\n\t\tconst matrix = this._matrix(params);\n\n\t\tconst pointGroup = params.pointGroup;\n\t\tif (pointGroup.trim() === '') {\n\t\t\tconst geometry = (object as Object3DWithGeometry).geometry;\n\t\t\tif (geometry) {\n\t\t\t\tgeometry.translate(-params.pivot.x, -params.pivot.y, -params.pivot.z);\n\t\t\t\tgeometry.applyMatrix4(matrix);\n\t\t\t\tgeometry.translate(params.pivot.x, params.pivot.y, params.pivot.z);\n\t\t\t}\n\t\t} else {\n\t\t\tpointsFromObjectFromGroup(object, pointGroup, _points);\n\t\t\tfor (const point of _points) {\n\t\t\t\tconst position = point.position(_pointPos).sub(params.pivot);\n\t\t\t\tposition.applyMatrix4(matrix);\n\t\t\t\tpoint.setPosition(position.add(params.pivot));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _updateObject(object: ObjectContent<CoreObjectType>, params: TransformSopParams) {\n\t\tconst objectMode = OBJECT_TRANSFORM_MODES[params.objectMode];\n\t\tswitch (objectMode) {\n\t\t\tcase ObjectTransformMode.SET: {\n\t\t\t\treturn this._setMatrix(object, params);\n\t\t\t}\n\t\t\tcase ObjectTransformMode.MULT: {\n\t\t\t\treturn this._multMatrix(object, params);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(objectMode);\n\t}\n\n\tprivate _setMatrix(object: ObjectContent<CoreObjectType>, params: TransformSopParams) {\n\t\tconst order = ROTATION_ORDERS[params.rotationOrder];\n\t\t_r.copy(params.r).multiplyScalar(MathUtils.DEG2RAD);\n\t\t_euler.set(_r.x, _r.y, _r.z, order);\n\t\t_q.setFromEuler(_euler);\n\t\t_s.copy(params.s).multiplyScalar(params.scale);\n\t\t_mat4.compose(params.t, _q, _s);\n\t\tcoreObjectClassFactory(object).applyMatrix(\n\t\t\tobject,\n\t\t\t_mat4,\n\t\t\tTRANSFORM_TARGET_TYPES[params.applyOn],\n\t\t\tObjectTransformSpace.LOCAL,\n\t\t\tObjectTransformMode.SET\n\t\t);\n\t}\n\n\t// private _objectPosition = new Vector3();\n\tprivate _multMatrix(object: ObjectContent<CoreObjectType>, params: TransformSopParams) {\n\t\tconst matrix = this._matrix(params);\n\t\tconst transformSpace = OBJECT_TRANSFORM_SPACES[params.objectTransformSpace];\n\t\t// for (let object of objects) {\n\t\tapplyTransformWithSpaceToObject(object, matrix, transformSpace, ObjectTransformMode.MULT);\n\t\t// // center to origin\n\t\t// // this._objectPosition.copy(object.position);\n\t\t// // object.position.set(0, 0, 0);\n\t\t// object.updateMatrix();\n\t\t// // apply matrix\n\t\t// // object.applyMatrix4(matrix);\n\t\t// object.matrix.multiply(matrix);\n\t\t// // revert to position\n\t\t// // object.position.add(this._objectPosition);\n\t\t// // object.updateMatrix();\n\t\t// object.matrix.decompose(object.position, object.quaternion, object.scale);\n\t\t// }\n\t}\n\n\tprivate _matrix(params: TransformSopParams) {\n\t\treturn this._coreTransform.matrix(\n\t\t\tparams.t,\n\t\t\tparams.r,\n\t\t\tparams.s,\n\t\t\tparams.scale,\n\t\t\tROTATION_ORDERS[params.rotationOrder]\n\t\t);\n\t}\n}\n","import {BaseSopOperation} from './_Base';\nimport {CoreGroup} from '../../../core/geometry/Group';\nimport {TypeAssert} from '../../poly/Assert';\nimport {Mesh, Object3D, Vector3} from 'three';\nimport {Matrix4} from 'three';\nimport {CoreTransform} from '../../../core/Transform';\nimport {InputCloneMode} from '../../../engine/poly/InputCloneMode';\nimport {DefaultOperationParams} from '../../../core/operations/_Base';\n\nexport enum TransformResetMode {\n\tRESET_OBJECT = 'reset objects transform',\n\tCENTER_GEO = 'center geometries',\n\tCENTER_GEO_RESET_OBJECT = 'center geometry and reset object',\n}\nexport const TRANSFORM_RESET_MODES: TransformResetMode[] = [\n\tTransformResetMode.RESET_OBJECT,\n\tTransformResetMode.CENTER_GEO,\n\tTransformResetMode.CENTER_GEO_RESET_OBJECT,\n];\n\ninterface TransformResetSopParams extends DefaultOperationParams {\n\tmode: number;\n}\n\nexport interface CenterCoreGroupOptions {\n\tapplyMatrixToObject: boolean;\n\trefCoreGroup?: CoreGroup;\n}\nexport interface CenterObjectOptions {\n\tapplyMatrixToObject: boolean;\n\trefObject?: Object3D;\n}\n\nconst bboxCenter = new Vector3();\nconst translateMatrix = new Matrix4();\n\nexport class TransformResetSopOperation extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: TransformResetSopParams = {\n\t\tmode: 0,\n\t};\n\tstatic override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;\n\tstatic override type(): Readonly<'transformReset'> {\n\t\treturn 'transformReset';\n\t}\n\n\toverride cook(inputCoreGroups: CoreGroup[], params: TransformResetSopParams) {\n\t\tconst mode = TRANSFORM_RESET_MODES[params.mode];\n\t\treturn this._selectMode(mode, inputCoreGroups);\n\t}\n\tprivate _selectMode(mode: TransformResetMode, coreGroups: CoreGroup[]) {\n\t\tswitch (mode) {\n\t\t\tcase TransformResetMode.RESET_OBJECT: {\n\t\t\t\treturn this._resetObjects(coreGroups[0]);\n\t\t\t}\n\t\t\tcase TransformResetMode.CENTER_GEO: {\n\t\t\t\treturn TransformResetSopOperation.centerCoreGroup(coreGroups[0], {\n\t\t\t\t\tapplyMatrixToObject: false,\n\t\t\t\t\trefCoreGroup: coreGroups[1],\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase TransformResetMode.CENTER_GEO_RESET_OBJECT: {\n\t\t\t\treturn TransformResetSopOperation.centerCoreGroup(coreGroups[0], {\n\t\t\t\t\tapplyMatrixToObject: true,\n\t\t\t\t\trefCoreGroup: coreGroups[1],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(mode);\n\t}\n\n\tprivate _resetObjects(coreGroup: CoreGroup) {\n\t\tconst objects = coreGroup.threejsObjects();\n\t\tfor (let object of objects) {\n\t\t\tobject.matrix.identity();\n\t\t\tCoreTransform.decomposeMatrix(object);\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic centerCoreGroup(coreGroup: CoreGroup, options: CenterCoreGroupOptions) {\n\t\tconst objects = coreGroup.threejsObjects();\n\t\tlet refObjects = objects;\n\t\tif (options.refCoreGroup) {\n\t\t\trefObjects = options.refCoreGroup.threejsObjectsWithGeo();\n\t\t}\n\t\tfor (let i = 0; i < objects.length; i++) {\n\t\t\tconst object = objects[i];\n\t\t\tconst refObject = refObjects[i] || refObjects[refObjects.length - 1];\n\t\t\tTransformResetSopOperation.centerObject(object, {\n\t\t\t\tapplyMatrixToObject: options.applyMatrixToObject,\n\t\t\t\trefObject,\n\t\t\t});\n\t\t}\n\n\t\treturn coreGroup;\n\t}\n\tstatic centerObject(object: Object3D, options: CenterObjectOptions) {\n\t\tconst refObject = options.refObject || object;\n\t\tconst geometry = (object as Mesh).geometry;\n\t\tconst refGeometry = (refObject as Mesh).geometry;\n\t\tif (geometry && refGeometry) {\n\t\t\t// TODO: this current does not take into account the object transform,\n\t\t\t// and it's possible that it has been, especially if we used another transform_reset\n\t\t\t// just before\n\t\t\trefGeometry.computeBoundingBox();\n\t\t\tconst bbox = refGeometry.boundingBox;\n\t\t\tif (bbox) {\n\t\t\t\tbbox.getCenter(bboxCenter);\n\t\t\t\trefObject.updateMatrixWorld();\n\t\t\t\tbboxCenter.applyMatrix4(refObject.matrixWorld);\n\n\t\t\t\tif (options.applyMatrixToObject) {\n\t\t\t\t\ttranslateMatrix.identity();\n\t\t\t\t\ttranslateMatrix.makeTranslation(bboxCenter.x, bboxCenter.y, bboxCenter.z);\n\t\t\t\t\tobject.matrix.multiply(translateMatrix);\n\t\t\t\t\tCoreTransform.decomposeMatrix(object);\n\t\t\t\t\tobject.updateWorldMatrix(false, false);\n\t\t\t\t\t// object.updateMatrixWorld();\n\t\t\t\t}\n\t\t\t\ttranslateMatrix.identity();\n\t\t\t\ttranslateMatrix.makeTranslation(-bboxCenter.x, -bboxCenter.y, -bboxCenter.z);\n\t\t\t\tgeometry.applyMatrix4(translateMatrix);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {CoreGroup} from '../../../core/geometry/Group';\nimport {BaseOperation} from '../_Base';\nimport {NodeContext} from '../../../engine/poly/NodeContext';\nimport {\n\tObjectType,\n\tObjectByObjectType,\n\tobjectConstructorByObjectType,\n\tDEFAULT_MATERIALS,\n} from '../../../core/geometry/Constant';\nimport {CoreGeometryIndexBuilder} from '../../../core/geometry/util/IndexBuilder';\nimport {BufferGeometry, Material, Object3D} from 'three';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\n\nexport class BaseSopOperation extends BaseOperation<NodeContext.SOP> {\n\tstatic override context() {\n\t\treturn NodeContext.SOP;\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[], params: any): CoreGroup | Promise<CoreGroup> | void {}\n\n\t//\n\t//\n\t// UTILS\n\t//\n\t//\n\tprotected createCoreGroupFromObjects(objects: ObjectContent<CoreObjectType>[]) {\n\t\tconst coreGroup = new CoreGroup();\n\t\tcoreGroup.setAllObjects(objects);\n\t\treturn coreGroup;\n\t}\n\tprotected createCoreGroupFromGeometry(geometry: BufferGeometry, type: ObjectType = ObjectType.MESH) {\n\t\tconst object = BaseSopOperation.createObject(geometry, type);\n\t\treturn this.createCoreGroupFromObjects(object ? [object] : []);\n\t}\n\tprotected createObject<OT extends ObjectType>(\n\t\tgeometry: BufferGeometry,\n\t\ttype: OT,\n\t\tmaterial?: Material\n\t): ObjectByObjectType[OT] {\n\t\treturn BaseSopOperation.createObject(geometry, type, material);\n\t}\n\tstatic createObject<OT extends ObjectType>(\n\t\tgeometry: BufferGeometry,\n\t\ttype: OT,\n\t\tmaterial?: Material\n\t): ObjectByObjectType[OT] {\n\t\t// ensure it has an index\n\t\tthis.createIndexIfNone(geometry);\n\n\t\tconst objectConstructor = objectConstructorByObjectType(type) || objectConstructorByObjectType(ObjectType.MESH);\n\t\tmaterial = material || DEFAULT_MATERIALS[type];\n\t\tconst object = new (objectConstructor as any)(geometry, material);\n\t\tthis.applyObjectDefault(object);\n\n\t\treturn object as ObjectByObjectType[OT];\n\t}\n\tstatic applyObjectDefault(object: Object3D) {\n\t\tobject.castShadow = true;\n\t\tobject.receiveShadow = true;\n\t\tobject.frustumCulled = false;\n\t\tobject.matrixAutoUpdate = false;\n\t}\n\tprotected createIndexIfNone(geometry: BufferGeometry) {\n\t\tBaseSopOperation.createIndexIfNone(geometry);\n\t}\n\tstatic createIndexIfNone(geometry: BufferGeometry) {\n\t\tCoreGeometryIndexBuilder.createIndexIfNone(geometry);\n\t}\n}\n","import {BaseSopOperation} from '../../_Base';\nimport {CoreGroup} from '../../../../../core/geometry/Group';\nimport {Mesh, BufferGeometry, Object3D} from 'three';\nimport {DefaultOperationParams} from '../../../../../core/operations/_Base';\nimport {Poly} from '../../../../Poly';\nimport type {BaseGeoLoaderOutput} from '../../../../../core/loader/geometry/Common';\nimport {BaseObject3DLoaderHandler} from '../../../../../core/loader/geometry/_BaseLoaderHandler';\n\nexport interface BaseFileSopParams extends DefaultOperationParams {\n\turl: string;\n\tmatrixAutoUpdate: boolean;\n}\n\nexport abstract class BaseFileSopOperation<O extends BaseGeoLoaderOutput> extends BaseSopOperation {\n\tstatic override readonly DEFAULT_PARAMS: BaseFileSopParams = {\n\t\turl: ``,\n\t\tmatrixAutoUpdate: false,\n\t};\n\n\tprotected abstract _createGeoLoaderHandler(params: BaseFileSopParams): BaseObject3DLoaderHandler<O>;\n\n\toverride async cook(inputCoreGroups: CoreGroup[], params: BaseFileSopParams): Promise<CoreGroup> {\n\t\tif (this._node) {\n\t\t\tPoly.blobs.clearBlobsForNode(this._node);\n\t\t\tconst loader = this._createGeoLoaderHandler(params); //new FBXLoaderHandler(params.url, this.scene(), this._node);\n\t\t\tconst result = await this._load(loader, params);\n\t\t\tif (result) {\n\t\t\t\tconst processedObjects = this._onLoad(result, params);\n\t\t\t\treturn this.createCoreGroupFromObjects(processedObjects);\n\t\t\t}\n\t\t}\n\t\treturn this.createCoreGroupFromObjects([]);\n\t}\n\tprotected async _load(loader: BaseObject3DLoaderHandler<O>, params: BaseFileSopParams) {\n\t\tif (this._node) {\n\t\t\treturn await loader.load({\n\t\t\t\tnode: this._node,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _onLoad(objects: Object3D[], params: BaseFileSopParams) {\n\t\tfor (let object of objects) {\n\t\t\tobject.traverse((child) => {\n\t\t\t\tthis._ensureGeometryHasIndex(child);\n\t\t\t\tif (!params.matrixAutoUpdate) {\n\t\t\t\t\tchild.updateMatrix();\n\t\t\t\t}\n\t\t\t\tchild.matrixAutoUpdate = params.matrixAutoUpdate;\n\t\t\t});\n\t\t}\n\t\treturn objects;\n\t}\n\n\tprivate _ensureGeometryHasIndex(object: Object3D) {\n\t\tconst mesh = object as Mesh;\n\t\tconst geometry = mesh.geometry;\n\t\tif (geometry) {\n\t\t\tthis.createIndexIfNone(geometry as BufferGeometry);\n\t\t}\n\t}\n}\n","import {Vector2, Vector3, Vector4} from 'three';\nimport type {IntegerParam} from '../../../../params/Integer';\nimport type {FloatParam} from '../../../../params/Float';\nimport type {StringParam} from '../../../../params/String';\nimport type {Vector2Param} from '../../../../params/Vector2';\nimport type {Vector3Param} from '../../../../params/Vector3';\nimport type {Vector4Param} from '../../../../params/Vector4';\nimport type {AttribCreateSopParams} from '../../AttribCreate';\nimport {TypeAssert} from '../../../../poly/Assert';\nimport {ATTRIBUTE_TYPES, AttribType} from '../../../../../core/geometry/Constant';\n\nexport interface AttribCreateSopNodeParams {\n\tgroup: StringParam;\n\tname: StringParam;\n\tsize: IntegerParam;\n\tvalue1: FloatParam;\n\tvalue2: Vector2Param;\n\tvalue3: Vector3Param;\n\tvalue4: Vector4Param;\n\tstring: StringParam;\n}\n\nexport function hasGroupFromParams(params: AttribCreateSopNodeParams) {\n\treturn params.group.value.trim() != '';\n}\nexport function hasGroupFromParamValues(params: AttribCreateSopParams) {\n\treturn params.group.trim() != '';\n}\n\nexport function _attribType(params: AttribCreateSopParams) {\n\treturn ATTRIBUTE_TYPES[params.type];\n}\n\nexport function defaultAttribValue(params: AttribCreateSopParams) {\n\tconst attribType = _attribType(params);\n\tswitch (attribType) {\n\t\tcase AttribType.NUMERIC: {\n\t\t\treturn _defaultNumericValue(params);\n\t\t}\n\t\tcase AttribType.STRING: {\n\t\t\treturn _defaultStringValue();\n\t\t}\n\t}\n\tTypeAssert.unreachable(attribType);\n}\nexport function _defaultStringValue() {\n\treturn '';\n}\nexport function _defaultNumericValue(params: AttribCreateSopParams) {\n\tconst size = params.size;\n\tswitch (size) {\n\t\tcase 1:\n\t\t\treturn 0;\n\t\tcase 2:\n\t\t\treturn new Vector2(0, 0);\n\t\tcase 3:\n\t\t\treturn new Vector3(0, 0, 0);\n\t\tcase 4:\n\t\t\treturn new Vector4(0, 0, 0, 0);\n\t}\n}\n","import {TypedNumericParam} from './_Numeric';\nimport {ParamType} from '../poly/ParamType';\nimport {CoreString} from '../../core/String';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {isString,isBoolean,isNumber} from '../../core/Type';\n\nexport class BooleanParam extends TypedNumericParam<ParamType.BOOLEAN> {\n\tstatic override type() {\n\t\treturn ParamType.BOOLEAN;\n\t}\n\t// TODO: be careful as this does not allow serialization of expressions as default value\n\toverride defaultValueSerialized() {\n\t\tif (isString(this._default_value)) {\n\t\t\treturn this._default_value;\n\t\t} else {\n\t\t\treturn this.convert(this._default_value) || false;\n\t\t}\n\t}\n\toverride rawInputSerialized() {\n\t\treturn this._raw_input;\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value;\n\t}\n\tprotected override _copyValue(param: BooleanParam) {\n\t\tthis.set(param.value);\n\t}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.BOOLEAN],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.BOOLEAN]\n\t) {\n\t\treturn raw_input1 == raw_input2;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.BOOLEAN],\n\t\tval2: ParamValuesTypeMap[ParamType.BOOLEAN]\n\t) {\n\t\treturn val1 == val2;\n\t}\n\toverride convert(raw_val: ParamInitValuesTypeMap[ParamType.BOOLEAN]): boolean | null {\n\t\tif (isBoolean(raw_val)) {\n\t\t\treturn raw_val;\n\t\t} else {\n\t\t\tif (isNumber(raw_val)) {\n\t\t\t\treturn raw_val >= 1;\n\t\t\t} else {\n\t\t\t\tif (isString(raw_val)) {\n\t\t\t\t\tif (CoreString.isBoolean(raw_val)) {\n\t\t\t\t\t\treturn CoreString.toBoolean(raw_val);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (CoreString.isNumber(raw_val)) {\n\t\t\t\t\t\t\tconst parsed = parseFloat(raw_val);\n\t\t\t\t\t\t\treturn parsed >= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n","import {Number3, StringOrNumber3} from '../../types/GlobalTypes';\nimport {TypedMultipleParam} from './_Multiple';\nimport {Color} from 'three';\nimport {ParamType} from '../poly/ParamType';\nimport {FloatParam} from './Float';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {ColorConversion} from '../../core/Color';\nimport {TypeAssert} from '../poly/Assert';\nimport {isArray} from '../../core/Type';\n\nconst COMPONENT_NAMES_COLOR: Readonly<string[]> = ['r', 'g', 'b'];\nconst tmp: Number3 = [0, 0, 0];\n\nfunction colorEqualsStringNumber3(c: Color, array: StringOrNumber3): boolean {\n\treturn c.r == array[0] && c.g == array[1] && c.b == array[2];\n}\nfunction stringNumber3Equals(array1: StringOrNumber3, array2: StringOrNumber3): boolean {\n\treturn array1[0] == array2[0] && array1[1] == array2[1] && array1[2] == array2[2];\n}\n\nexport class ColorParam extends TypedMultipleParam<ParamType.COLOR> {\n\tprotected override _value = new Color();\n\tprivate _valuePreConversion = new Color();\n\tprivate _valueSerializedDirty: boolean = false;\n\tprivate _valueSerialized: Number3 = [0, 0, 0];\n\tprivate _valuePreConversionSerialized: Number3 = [0, 0, 0];\n\tr!: FloatParam;\n\tg!: FloatParam;\n\tb!: FloatParam;\n\tstatic override type() {\n\t\treturn ParamType.COLOR;\n\t}\n\toverride componentNames(): Readonly<string[]> {\n\t\treturn COMPONENT_NAMES_COLOR;\n\t}\n\toverride defaultValueSerialized() {\n\t\tif (isArray(this._default_value)) {\n\t\t\treturn this._default_value;\n\t\t} else {\n\t\t\treturn this._default_value.toArray() as Number3;\n\t\t}\n\t}\n\toverride _prefilterInvalidRawInput(rawInput: any) {\n\t\tif (rawInput instanceof Color) {\n\t\t\trawInput.toArray(tmp);\n\t\t\treturn tmp;\n\t\t}\n\t\treturn super._prefilterInvalidRawInput(rawInput);\n\t}\n\t// rawInputSerialized() {\n\t// \tif (this._raw_input instanceof Color) {\n\t// \t\treturn this._raw_input.toArray() as Number3;\n\t// \t} else {\n\t// \t\tconst new_array: StringOrNumber3 = [this._raw_input[0], this._raw_input[1], this._raw_input[2]];\n\t// \t\treturn new_array;\n\t// \t}\n\t// }\n\toverride valueSerialized() {\n\t\tthis._updateValueSerializedIfRequired();\n\t\treturn this._valueSerialized;\n\t}\n\toverride valuePreConversionSerialized() {\n\t\tthis._updateValueSerializedIfRequired();\n\t\treturn this._valuePreConversionSerialized;\n\t}\n\tprivate _copiedValue: Number3 = [0, 0, 0];\n\tprotected override _copyValue(param: ColorParam) {\n\t\tparam.value.toArray(this._copiedValue);\n\t\tthis.set(this._copiedValue);\n\t}\n\t// protected _prefilterInvalidRawInput(\n\t// \traw_input: ParamInitValuesTypeMap[ParamType.COLOR]\n\t// ): ParamInitValuesTypeMap[ParamType.COLOR] {\n\t// \treturn raw_input;\n\t// }\n\tprotected override _cloneRawInput(raw_input: ParamInitValuesTypeMap[ParamType.COLOR]) {\n\t\tif (raw_input instanceof Color) {\n\t\t\treturn raw_input.clone();\n\t\t} else {\n\t\t\tconst new_array: StringOrNumber3 = [raw_input[0], raw_input[1], raw_input[2]];\n\t\t\t// in case array elements are undefined\n\t\t\tif (new_array[0] == null) {\n\t\t\t\tnew_array[0] = new_array[0] || 0;\n\t\t\t}\n\t\t\tif (new_array[1] == null) {\n\t\t\t\tnew_array[1] = new_array[1] || new_array[0];\n\t\t\t}\n\t\t\tif (new_array[2] == null) {\n\t\t\t\tnew_array[2] = new_array[2] || new_array[1];\n\t\t\t}\n\t\t\treturn new_array;\n\t\t}\n\t}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.COLOR],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.COLOR]\n\t) {\n\t\tif (raw_input1 instanceof Color) {\n\t\t\tif (raw_input2 instanceof Color) {\n\t\t\t\treturn raw_input1.equals(raw_input2);\n\t\t\t} else {\n\t\t\t\treturn colorEqualsStringNumber3(raw_input1, raw_input2);\n\t\t\t}\n\t\t} else {\n\t\t\tif (raw_input2 instanceof Color) {\n\t\t\t\treturn colorEqualsStringNumber3(raw_input2, raw_input1);\n\t\t\t} else {\n\t\t\t\treturn stringNumber3Equals(raw_input1, raw_input2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.COLOR],\n\t\tval2: ParamValuesTypeMap[ParamType.COLOR]\n\t) {\n\t\treturn val1.equals(val2);\n\t}\n\toverride initComponents() {\n\t\tsuper.initComponents();\n\t\tthis.r = this.components[0];\n\t\tthis.g = this.components[1];\n\t\tthis.b = this.components[2];\n\t\tthis._valueSerializedDirty = true;\n\t\t// this.options.onOptionChange('conversion', () => {\n\t\t// \tthis.setValueFromComponents();\n\t\t// });\n\t}\n\toverride postOptionsInitialize() {\n\t\tthis.setValueFromComponents();\n\t}\n\n\tprivate _updateValueSerializedIfRequired() {\n\t\tif (!this._valueSerializedDirty) {\n\t\t\treturn;\n\t\t}\n\t\tthis._valueSerialized[0] = this._value.r;\n\t\tthis._valueSerialized[1] = this._value.g;\n\t\tthis._valueSerialized[2] = this._value.b;\n\t\tthis._valuePreConversionSerialized[0] = this._valuePreConversion.r;\n\t\tthis._valuePreConversionSerialized[1] = this._valuePreConversion.g;\n\t\tthis._valuePreConversionSerialized[2] = this._valuePreConversion.b;\n\t}\n\n\tvaluePreConversion() {\n\t\treturn this._valuePreConversion;\n\t}\n\tasync setConversion(conversion: ColorConversion) {\n\t\tthis.options.setOption('conversion', conversion);\n\t\tthis.setDirty(); // to ensure value is recomputed\n\t\tawait this.options.executeCallback();\n\t}\n\n\toverride setValueFromComponents() {\n\t\tthis._valuePreConversion.r = this.r.value;\n\t\tthis._valuePreConversion.g = this.g.value;\n\t\tthis._valuePreConversion.b = this.b.value;\n\t\tthis._value.copy(this._valuePreConversion);\n\n\t\tthis._applyColorConversion();\n\n\t\tthis._valueSerializedDirty = true;\n\t}\n\tprivate _applyColorConversion() {\n\t\tconst conversion = this.options.colorConversion();\n\n\t\tswitch (conversion) {\n\t\t\tcase ColorConversion.NONE: {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ColorConversion.SRGB_TO_LINEAR: {\n\t\t\t\tthis._value.convertSRGBToLinear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ColorConversion.LINEAR_TO_SRGB: {\n\t\t\t\tthis._value.convertLinearToSRGB();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(conversion);\n\t}\n}\n","import {TypedNumericParam} from './_Numeric';\nimport {ParamType} from '../poly/ParamType';\nimport {CoreString} from '../../core/String';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {isArray, isString, isNumber, isBoolean} from '../../core/Type';\nexport class FloatParam extends TypedNumericParam<ParamType.FLOAT> {\n\tstatic override type() {\n\t\treturn ParamType.FLOAT;\n\t}\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn this._raw_input;\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value;\n\t}\n\tprotected override _copyValue(param: FloatParam) {\n\t\tthis.set(param.valueSerialized());\n\t}\n\tprotected override _prefilterInvalidRawInput(raw_input: any): ParamInitValuesTypeMap[ParamType.INTEGER] {\n\t\tif (isArray(raw_input)) {\n\t\t\treturn raw_input[0] as ParamInitValuesTypeMap[ParamType.INTEGER];\n\t\t}\n\t\tif (isString(raw_input) && CoreString.isNumber(raw_input)) {\n\t\t\t// we check here that we have a string AND that the string can be converted to a valid number\n\t\t\tconst num = parseFloat(raw_input);\n\t\t\tif (num != null) {\n\t\t\t\tconst converted = this.convert(num);\n\t\t\t\tif (converted != null) {\n\t\t\t\t\treturn converted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isNumber(raw_input)) {\n\t\t\tconst converted = this.convert(raw_input);\n\t\t\tif (converted != null) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t}\n\t\treturn raw_input;\n\t}\n\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.FLOAT],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.FLOAT]\n\t) {\n\t\treturn raw_input1 == raw_input2;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.FLOAT],\n\t\tval2: ParamValuesTypeMap[ParamType.FLOAT]\n\t) {\n\t\treturn val1 == val2;\n\t}\n\tstatic convert(raw_val: ParamInitValuesTypeMap[ParamType.FLOAT]): number | null {\n\t\tif (isNumber(raw_val)) {\n\t\t\treturn raw_val;\n\t\t} else {\n\t\t\tif (isBoolean(raw_val)) {\n\t\t\t\treturn raw_val ? 1 : 0;\n\t\t\t} else {\n\t\t\t\tif (CoreString.isNumber(raw_val)) {\n\t\t\t\t\tconst parsed = parseFloat(raw_val);\n\t\t\t\t\tif (isNumber(parsed)) {\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\toverride convert(raw_val: ParamInitValuesTypeMap[ParamType.FLOAT]): number | null {\n\t\tconst result = FloatParam.convert(raw_val);\n\t\tif (result != null) {\n\t\t\treturn this.options.ensureInRange(result);\n\t\t} else {\n\t\t\treturn result;\n\t\t}\n\t}\n}\n","import {TypedNumericParam} from './_Numeric';\nimport {ParamType} from '../poly/ParamType';\nimport {CoreString} from '../../core/String';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {isArray, isString, isNumber, isBoolean} from '../../core/Type';\n\nexport class IntegerParam extends TypedNumericParam<ParamType.INTEGER> {\n\tstatic override type() {\n\t\treturn ParamType.INTEGER;\n\t}\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn this._raw_input;\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value;\n\t}\n\tprotected override _copyValue(param: IntegerParam) {\n\t\tthis.set(param.valueSerialized());\n\t}\n\tprotected override _prefilterInvalidRawInput(raw_input: any): ParamInitValuesTypeMap[ParamType.INTEGER] {\n\t\tif (isArray(raw_input)) {\n\t\t\treturn raw_input[0] as ParamInitValuesTypeMap[ParamType.INTEGER];\n\t\t}\n\t\tif (isString(raw_input) && CoreString.isNumber(raw_input)) {\n\t\t\t// we check here that we have a string AND that the string can be converted to a valid number\n\t\t\tconst num = parseInt(raw_input);\n\t\t\tif (num != null) {\n\t\t\t\tconst converted = this.convert(num);\n\t\t\t\tif (converted != null) {\n\t\t\t\t\treturn converted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isNumber(raw_input)) {\n\t\t\tconst converted = this.convert(raw_input);\n\t\t\tif (converted != null) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t}\n\t\treturn raw_input;\n\t}\n\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.INTEGER],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.INTEGER]\n\t) {\n\t\treturn raw_input1 == raw_input2;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.INTEGER],\n\t\tval2: ParamValuesTypeMap[ParamType.INTEGER]\n\t) {\n\t\treturn val1 == val2;\n\t}\n\tstatic convert(raw_val: ParamInitValuesTypeMap[ParamType.INTEGER]): number | null {\n\t\tif (isNumber(raw_val)) {\n\t\t\treturn Math.round(raw_val);\n\t\t} else {\n\t\t\tif (isBoolean(raw_val)) {\n\t\t\t\treturn raw_val ? 1 : 0;\n\t\t\t} else {\n\t\t\t\tif (CoreString.isNumber(raw_val)) {\n\t\t\t\t\tconst parsed = parseInt(raw_val);\n\t\t\t\t\tif (isNumber(parsed)) {\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\toverride convert(raw_val: ParamInitValuesTypeMap[ParamType.INTEGER]): number | null {\n\t\tconst result = IntegerParam.convert(raw_val);\n\t\tif (result != null) {\n\t\t\tlet validVal = this.options.ensureInRange(result);\n\t\t\tvalidVal = this.options.ensureValueInMenuEntries(validVal);\n\t\t\treturn validVal;\n\t\t} else {\n\t\t\treturn result;\n\t\t}\n\t}\n}\n","import {isString} from './../../core/Type';\nimport {TypedPathParam} from './_BasePath';\nimport {CoreWalker} from '../../core/Walker';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {TypedNodePathParamValue} from '../../core/Walker';\n\ninterface SetNodeOptions {\n\trelative: boolean;\n}\n\nconst tmpConvertedValue = new TypedNodePathParamValue();\nexport class NodePathParam extends TypedPathParam<ParamType.NODE_PATH> {\n\tstatic override type() {\n\t\treturn ParamType.NODE_PATH;\n\t}\n\tprotected override _initializeParam() {\n\t\tthis._value = new TypedNodePathParamValue();\n\t}\n\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn `${this._raw_input}`;\n\t}\n\toverride valueSerialized() {\n\t\treturn `${this.value}`;\n\t}\n\tprotected override _copyValue(param: NodePathParam) {\n\t\tthis.set(param.valueSerialized());\n\t}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.NODE_PATH],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.NODE_PATH]\n\t) {\n\t\treturn raw_input1 == raw_input2;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.NODE_PATH],\n\t\tval2: ParamValuesTypeMap[ParamType.NODE_PATH]\n\t) {\n\t\treturn val1 == val2;\n\t}\n\toverride isDefault(): boolean {\n\t\treturn this._raw_input == this._default_value;\n\t}\n\tsetNode(node: BaseNodeType, options?: SetNodeOptions) {\n\t\tif (options?.relative == true) {\n\t\t\tconst path = CoreWalker.relativePath(this.node, node);\n\t\t\tthis.set(path);\n\t\t} else {\n\t\t\tthis.set(node.path());\n\t\t}\n\t}\n\n\tprotected _assignValue(value: ParamValuesTypeMap[ParamType.NODE_PATH] | string): void {\n\t\tconst path = isString(value) ? value : value.path();\n\t\tif (this._value.path() != path) {\n\t\t\tthis._setValuePathAndFindTarget(path, false);\n\t\t}\n\t}\n\toverride convert(rawVal: any): ParamValuesTypeMap[ParamType.NODE_PATH] | null {\n\t\tif (isString(rawVal)) {\n\t\t\ttmpConvertedValue.setPath(rawVal);\n\t\t\treturn tmpConvertedValue;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// protected override async processComputation() {\n\t// \tthis._findTarget();\n\t// }\n\tprotected _findTarget() {\n\t\tif (!this.node) {\n\t\t\treturn;\n\t\t}\n\t\tconst path = this._value.path();\n\t\tlet node: BaseNodeType | null = null;\n\t\tconst pathNonEmpty = path != null && path !== '';\n\n\t\tthis.scene().referencesController.resetReferenceFromParam(this); // must be before decomposed path is changed\n\t\tthis.decomposedPath.reset();\n\t\tif (pathNonEmpty) {\n\t\t\tnode = CoreWalker.findNode(this.node, path, this.decomposedPath);\n\t\t}\n\n\t\tconst currentFoundEntity = this._value.node();\n\t\tconst newlyFoundEntity = node;\n\n\t\t// if the param refers to its own node, we set an error\n\t\tif (newlyFoundEntity) {\n\t\t\tif (newlyFoundEntity.graphNodeId() == this.node.graphNodeId()) {\n\t\t\t\tthis.states.error.set(`param cannot refer to its own node`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis._handleReferences(node, path);\n\n\t\tif (currentFoundEntity?.graphNodeId() !== newlyFoundEntity?.graphNodeId()) {\n\t\t\tconst dependentOnFoundNode = this.options.dependentOnFoundNode();\n\n\t\t\tconst previouslyFoundNode = this._value.node();\n\t\t\tif (previouslyFoundNode) {\n\t\t\t\tif (dependentOnFoundNode) {\n\t\t\t\t\tthis.removeGraphInput(previouslyFoundNode);\n\t\t\t\t} else {\n\t\t\t\t\t// this._found_node.remove_param_referree(this) // TODO: typescript\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (node) {\n\t\t\t\tthis._assignFoundNode(node);\n\t\t\t} else {\n\t\t\t\tthis._value.setNode(null);\n\t\t\t}\n\n\t\t\tthis.options.executeCallback();\n\t\t}\n\t\tif (pathNonEmpty && !node && this.scene().loadingController.loaded()) {\n\t\t\tif (pathNonEmpty) {\n\t\t\t\tthis.states.error.set(`no node found at path '${path}'`);\n\t\t\t}\n\t\t}\n\n\t\tthis.removeDirtyState();\n\t}\n\n\tprivate _assignFoundNode(node: BaseNodeType) {\n\t\tconst dependentOnFoundNode = this.options.dependentOnFoundNode();\n\t\tif (this._isNodeExpectedContext(node)) {\n\t\t\tif (this._isNodeExpectedType(node)) {\n\t\t\t\tthis.states.error.clear();\n\t\t\t\tthis._value.setNode(node);\n\t\t\t\tif (dependentOnFoundNode) {\n\t\t\t\t\tthis.addGraphInput(node);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.states.error.set(\n\t\t\t\t\t`node type is ${node.type()} but the params expects one of ${(this._expectedNodeTypes() || []).join(\n\t\t\t\t\t\t', '\n\t\t\t\t\t)}`\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.states.error.set(\n\t\t\t\t`node context is ${node.context()} but the params expects a ${this._expectedContext()}`\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate _expectedContext() {\n\t\treturn this.options.nodeSelectionContext();\n\t}\n\tprivate _isNodeExpectedContext(node: BaseNodeType) {\n\t\tconst expectedContext = this._expectedContext();\n\t\tif (expectedContext == null) {\n\t\t\treturn true;\n\t\t}\n\t\treturn expectedContext == node.context();\n\t}\n\tprivate _expectedNodeTypes() {\n\t\treturn this.options.nodeSelectionTypes();\n\t}\n\n\tprivate _isNodeExpectedType(node: BaseNodeType) {\n\t\tconst expected_types = this._expectedNodeTypes();\n\t\tif (expected_types == null) {\n\t\t\treturn true;\n\t\t}\n\t\treturn expected_types?.includes(node.type());\n\t}\n\n\tnotifyPathRebuildRequired(node: BaseNodeType) {\n\t\tthis.decomposedPath.updateFromNameChange(node);\n\t\tconst newPath = this.decomposedPath.toPath();\n\t\tthis.set(newPath);\n\t}\n\tnotifyTargetParamOwnerParamsUpdated(node: BaseNodeType) {\n\t\tthis.setDirty();\n\t}\n}\n","import {isString} from './../../core/Type';\nimport {BaseParamType} from './_Base';\nimport {TypedPathParam} from './_BasePath';\nimport {CoreWalker, TypedParamPathParamValue} from '../../core/Walker';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\n\nconst tmpConvertedValue = new TypedParamPathParamValue();\nexport class ParamPathParam extends TypedPathParam<ParamType.PARAM_PATH> {\n\tstatic override type() {\n\t\treturn ParamType.PARAM_PATH;\n\t}\n\tprotected override _initializeParam() {\n\t\tthis._value = new TypedParamPathParamValue();\n\t}\n\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn `${this._raw_input}`;\n\t}\n\toverride valueSerialized() {\n\t\treturn `${this.value}`;\n\t}\n\tprotected override _copyValue(param: ParamPathParam) {\n\t\tthis.set(param.valueSerialized());\n\t}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.PARAM_PATH],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.PARAM_PATH]\n\t) {\n\t\treturn raw_input1 == raw_input2;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.PARAM_PATH],\n\t\tval2: ParamValuesTypeMap[ParamType.PARAM_PATH]\n\t) {\n\t\treturn val1 == val2;\n\t}\n\toverride isDefault(): boolean {\n\t\treturn this._raw_input == this._default_value;\n\t}\n\tsetParam(param: BaseParamType) {\n\t\tthis.set(param.path());\n\t}\n\n\tprotected _assignValue(value: ParamValuesTypeMap[ParamType.PARAM_PATH] | string): void {\n\t\tconst path = isString(value) ? value : value.path();\n\t\tif (this._value.path() != path) {\n\t\t\tthis._setValuePathAndFindTarget(path, false);\n\t\t}\n\t}\n\toverride convert(rawVal: any): ParamValuesTypeMap[ParamType.PARAM_PATH] | null {\n\t\tif (isString(rawVal)) {\n\t\t\ttmpConvertedValue.setPath(rawVal);\n\t\t\treturn tmpConvertedValue;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// protected override async processComputation() {\n\t// \tthis.findTarget();\n\t// }\n\tprotected _findTarget() {\n\t\tif (!this.node) {\n\t\t\treturn;\n\t\t}\n\t\tconst path = this._value.path();\n\t\tlet param: BaseParamType | null = null;\n\t\tconst pathNonEmpty = path != null && path !== '';\n\n\t\tthis.scene().referencesController.resetReferenceFromParam(this); // must be before decomposed path is changed\n\t\tthis.decomposedPath.reset();\n\t\tif (pathNonEmpty) {\n\t\t\tparam = CoreWalker.findParam(this.node, path, this.decomposedPath);\n\t\t}\n\n\t\tconst currentFoundEntity = this._value.param();\n\t\tconst newlyFoundEntity = param;\n\n\t\t// if the param refers to itself, we set an error\n\t\tif (newlyFoundEntity) {\n\t\t\tif (newlyFoundEntity.graphNodeId() == this.graphNodeId()) {\n\t\t\t\tthis.states.error.set(`param cannot refer to itself`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis._handleReferences(param, path);\n\n\t\tif (currentFoundEntity?.graphNodeId() !== newlyFoundEntity?.graphNodeId()) {\n\t\t\tconst dependentOnFoundParam = this.options.dependentOnFoundParam();\n\n\t\t\tconst previouslyFoundParam = this._value.param();\n\t\t\tif (previouslyFoundParam) {\n\t\t\t\tif (dependentOnFoundParam) {\n\t\t\t\t\tthis.removeGraphInput(previouslyFoundParam);\n\t\t\t\t} else {\n\t\t\t\t\t// this._found_node.remove_param_referree(this) // TODO: typescript\n\t\t\t\t}\n\t\t\t\tpreviouslyFoundParam.deregisterOnDispose(this._onResolvedParamDisposeBound);\n\t\t\t}\n\n\t\t\tif (param) {\n\t\t\t\tthis._assignFoundParam(param);\n\t\t\t} else {\n\t\t\t\tthis._value.setParam(null);\n\t\t\t}\n\n\t\t\tthis.options.executeCallback();\n\t\t}\n\t\tthis.removeDirtyState();\n\t}\n\n\tprivate _assignFoundParam(param: BaseParamType) {\n\t\tconst dependentOnFoundParam = this.options.dependentOnFoundParam();\n\t\t// if (this._is_node_expected_context(node)) {\n\t\t// \tif (this._is_node_expected_type(node)) {\n\t\tthis._value.setParam(param);\n\t\tif (dependentOnFoundParam) {\n\t\t\tthis.addGraphInput(param);\n\t\t}\n\t\tparam.onDispose(this._onResolvedParamDisposeBound);\n\t\t// \t} else {\n\t\t// \t\tthis.states.error.set(\n\t\t// \t\t\t`node type is ${node.type} but the params expects one of ${(this._expected_node_types() || []).join(\n\t\t// \t\t\t\t', '\n\t\t// \t\t\t)}`\n\t\t// \t\t);\n\t\t// \t}\n\t\t// } else {\n\t\t// \tthis.states.error.set(\n\t\t// \t\t`node context is ${node.node_context()} but the params expects a ${this._expected_context()}`\n\t\t// \t);\n\t\t// }\n\t}\n\n\t// private _expected_context() {\n\t// \treturn this.options.node_selection_context;\n\t// }\n\t// private _is_node_expected_context(node: BaseNodeType) {\n\t// \tconst expected_context = this._expected_context();\n\t// \tif (expected_context == null) {\n\t// \t\treturn true;\n\t// \t}\n\t// \tconst node_context = node.parent?.childrenController?.context;\n\t// \treturn expected_context == node_context;\n\t// }\n\t// private _expected_node_types() {\n\t// \treturn this.options.node_selection_types;\n\t// }\n\n\t// private _is_node_expected_type(node: BaseNodeType) {\n\t// \tconst expected_types = this._expected_node_types();\n\t// \tif (expected_types == null) {\n\t// \t\treturn true;\n\t// \t}\n\t// \treturn expected_types?.includes(node.type);\n\t// }\n\n\tnotifyPathRebuildRequired(param: BaseParamType) {\n\t\tthis.decomposedPath.updateFromNameChange(param);\n\t\tconst new_path = this.decomposedPath.toPath();\n\t\tthis.set(new_path);\n\t}\n\tnotifyTargetParamOwnerParamsUpdated(node: BaseNodeType) {\n\t\tthis.setDirty();\n\t}\n\tprivate _onResolvedParamDisposeBound = this._onResolvedParamDispose.bind(this);\n\tprivate async _onResolvedParamDispose() {\n\t\tthis.setDirty();\n\t\tawait this.compute();\n\t}\n}\n","import {RGBAFormat, FloatType} from 'three';\nimport {DataTexture} from 'three';\nimport {CubicInterpolant} from 'three';\nimport {TypedParam} from './_Base';\nimport {RampValue, RampPoint, RampValueJson, RampInterpolation} from './ramp/RampValue';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamEvent} from '../poly/ParamEvent';\n\nconst STRIDE = 4;\nconst TEXTURE_WIDTH = 1024;\nconst TEXTURE_HEIGHT = 1;\nconst TEXTURE_SIZE = TEXTURE_WIDTH * TEXTURE_HEIGHT;\nconst TEXTURE_BYTES_MULT = 1;\n\nexport class RampParam extends TypedParam<ParamType.RAMP> {\n\tstatic override type() {\n\t\treturn ParamType.RAMP;\n\t}\n\n\tprivate _rampInterpolant: CubicInterpolant | undefined;\n\tprivate _textureData = new Float32Array(STRIDE * TEXTURE_SIZE);\n\tprivate _rampTexture = new DataTexture(this._textureData, TEXTURE_WIDTH, TEXTURE_HEIGHT, RGBAFormat, FloatType);\n\n\tstatic DEFAULT_VALUE = new RampValue(RampInterpolation.CUBIC, [new RampPoint(0, 0), new RampPoint(1, 1)]);\n\tstatic DEFAULT_VALUE_JSON: RampValueJson = RampParam.DEFAULT_VALUE.toJSON();\n\n\toverride defaultValueSerialized() {\n\t\tif (this._default_value instanceof RampValue) {\n\t\t\treturn this._default_value.toJSON();\n\t\t} else {\n\t\t\treturn this._default_value;\n\t\t}\n\t}\n\tprotected override _cloneRawInput(raw_input: ParamInitValuesTypeMap[ParamType.RAMP]) {\n\t\tif (raw_input instanceof RampValue) {\n\t\t\treturn raw_input.clone();\n\t\t} else {\n\t\t\treturn RampValue.fromJSON(raw_input).toJSON();\n\t\t}\n\t}\n\toverride rawInputSerialized() {\n\t\tif (this._raw_input instanceof RampValue) {\n\t\t\treturn this._raw_input.toJSON();\n\t\t} else {\n\t\t\treturn RampValue.fromJSON(this._raw_input).toJSON();\n\t\t}\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value.toJSON();\n\t}\n\tprotected override _copyValue(param: RampParam) {\n\t\tthis.set(param.valueSerialized());\n\t}\n\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.RAMP],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.RAMP]\n\t) {\n\t\tif (raw_input1 instanceof RampValue) {\n\t\t\tif (raw_input2 instanceof RampValue) {\n\t\t\t\treturn raw_input1.isEqual(raw_input2);\n\t\t\t} else {\n\t\t\t\treturn raw_input1.isEqualJSON(raw_input2);\n\t\t\t}\n\t\t} else {\n\t\t\tif (raw_input2 instanceof RampValue) {\n\t\t\t\treturn raw_input2.isEqualJSON(raw_input1);\n\t\t\t} else {\n\t\t\t\treturn RampValue.are_json_equal(raw_input1, raw_input2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic override areValuesEqual(val1: ParamValuesTypeMap[ParamType.RAMP], val2: ParamValuesTypeMap[ParamType.RAMP]) {\n\t\treturn val1.isEqual(val2);\n\t}\n\t// initialize_param() {\n\t// \tthis.addPostDirtyHook(\n\t// \t\t'_reset_ramp_interpolant_and_texture',\n\t// \t\tthis.reset_ramp_interpolant.bind(this)\n\t// \t);\n\t// }\n\t// accepts_visitor(visitor: RampParamVisitor) {\n\t// \treturn visitor.visit_ramp_param(this);\n\t// }\n\toverride isDefault(): boolean {\n\t\tif (this._default_value instanceof RampValue) {\n\t\t\treturn this.value.isEqual(this._default_value);\n\t\t} else {\n\t\t\treturn this.value.isEqualJSON(this._default_value);\n\t\t}\n\t}\n\tprotected override processRawInput() {\n\t\tif (this._raw_input instanceof RampValue) {\n\t\t\tif (!this._value) {\n\t\t\t\tthis._value = this._raw_input;\n\t\t\t} else {\n\t\t\t\tthis._value.copy(this._raw_input);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this._value) {\n\t\t\t\tthis._value = RampValue.fromJSON(this._raw_input);\n\t\t\t} else {\n\t\t\t\tthis._value.fromJSON(this._raw_input);\n\t\t\t}\n\t\t}\n\n\t\tthis._resetRampInterpolant();\n\t\tthis._updateRampTexture();\n\t\tthis.options.executeCallback();\n\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t\tthis.setSuccessorsDirty(this);\n\t}\n\n\t// convert_value(v) {\n\t// \tlet is_json = false\n\n\t// \tif (isString(v)) {\n\t// \t\tv = JSON.parse(v)\n\t// \t\tis_json = true\n\t// \t}\n\n\t// \tif (!is_json) {\n\t// \t\tif (v.interpolation && v.points) {\n\t// \t\t\tif (isArray(v.points)) {\n\t// \t\t\t\tis_json = true\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \tif (is_json) {\n\t// \t\tv = RampValue.from_json(v)\n\t// \t}\n\n\t// \treturn v\n\t// }\n\t// convert_default_value(v) {\n\t// \treturn this.convert_value(v)\n\t// }\n\n\toverride hasExpression() {\n\t\treturn false;\n\t}\n\n\tprivate _resetRampInterpolant() {\n\t\tthis._rampInterpolant = undefined;\n\t\t// this._ramp_texture = undefined;\n\t}\n\trampTexture() {\n\t\treturn this._rampTexture;\n\t}\n\tprivate _updateRampTexture() {\n\t\tthis._updateRampTextureData();\n\t\tthis.rampTexture().needsUpdate = true;\n\t}\n\tprivate _updateRampTextureData() {\n\t\tlet stride = 0;\n\t\tlet position = 0;\n\t\tlet value = 0;\n\t\t// we set the bounds at [-1:2]\n\t\t// so that we can have the ramp go 1 unit below and above the range [0:1]\n\t\t// so -1 becomes R=0, G=0, B=0\n\t\t// so -0.5 becomes R=0.5, G=0, B=0\n\t\t// so 0 becomes R=1, G=0, B=0\n\t\t// so 0.5 becomes R=1, G=0.5, B=0\n\t\t// so 1 becomes R=1, G=1, B=0\n\t\t// so 1.5 becomes R=1, G=1, B=0.5\n\t\t// so 2 becomes R=1, G=1, B=1\n\t\tfor (var i = 0; i < TEXTURE_SIZE; i++) {\n\t\t\tstride = i * STRIDE;\n\t\t\tposition = i / TEXTURE_WIDTH;\n\t\t\tvalue = this.valueAtPosition(position);\n\t\t\tthis._textureData[stride + 0] = value * TEXTURE_BYTES_MULT;\n\t\t\tthis._textureData[stride + 1] = 0;\n\t\t\tthis._textureData[stride + 2] = 0;\n\t\t\t// if (value <= 0) {\n\t\t\t// \t// if I set 256, a value of 1 will become 0\n\t\t\t// \tthis._textureData[stride + 0] = (clamp(value, -1, 0) + 1) * TEXTURE_BYTES_MULT;\n\t\t\t// \tthis._textureData[stride + 1] = 0;\n\t\t\t// \tthis._textureData[stride + 2] = 0;\n\t\t\t// } else {\n\t\t\t// \tif (value <= 1) {\n\t\t\t// \t\tthis._textureData[stride + 0] = TEXTURE_BYTES_MULT;\n\t\t\t// \t\tthis._textureData[stride + 1] = clamp(value, 0, 1) * TEXTURE_BYTES_MULT;\n\t\t\t// \t\tthis._textureData[stride + 2] = 0;\n\t\t\t// \t} else {\n\t\t\t// \t\tthis._textureData[stride + 0] = TEXTURE_BYTES_MULT;\n\t\t\t// \t\tthis._textureData[stride + 1] = TEXTURE_BYTES_MULT;\n\t\t\t// \t\tthis._textureData[stride + 2] = (clamp(value, 1, 2) - 1) * TEXTURE_BYTES_MULT;\n\t\t\t// \t}\n\t\t\t// }\n\t\t}\n\t}\n\n\tinterpolant() {\n\t\treturn (this._rampInterpolant = this._rampInterpolant || this._createInterpolant());\n\t}\n\tprivate _createInterpolant() {\n\t\treturn this.value.createInterpolant();\n\t}\n\n\tvalueAtPosition(position: number): number {\n\t\treturn (<unknown>this.interpolant().evaluate(position)[0]) as number;\n\t}\n}\n","import {ParamEvent} from './../poly/ParamEvent';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {isString} from '../../core/Type';\nimport {TypedStringParam} from './_BaseString';\n\nexport class StringParam extends TypedStringParam<ParamType.STRING> {\n\tstatic override type() {\n\t\treturn ParamType.STRING;\n\t}\n\toverride defaultValueSerialized() {\n\t\treturn this._default_value;\n\t}\n\tprotected override _cloneRawInput(raw_input: ParamInitValuesTypeMap[ParamType.STRING]) {\n\t\treturn `${raw_input}`;\n\t}\n\toverride rawInputSerialized() {\n\t\treturn `${this._raw_input}`;\n\t}\n\toverride valueSerialized() {\n\t\treturn `${this.value}`;\n\t}\n\tprotected override _copyValue(param: StringParam) {\n\t\tthis.set(param.value);\n\t}\n\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.STRING],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.STRING]\n\t) {\n\t\treturn raw_input1 == raw_input2;\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.STRING],\n\t\tval2: ParamValuesTypeMap[ParamType.STRING]\n\t) {\n\t\treturn val1 == val2;\n\t}\n\toverride isDefault(): boolean {\n\t\treturn this._raw_input == this._default_value;\n\t}\n\n\toverride convert(rawVal: any): string {\n\t\tif (isString(rawVal)) {\n\t\t\treturn rawVal;\n\t\t}\n\t\treturn `${rawVal}`;\n\t}\n\n\toverride rawInput() {\n\t\treturn this._raw_input;\n\t}\n\tprotected _assignValue(value: string): void {\n\t\tthis._value = value;\n\t}\n\tprotected async processRawInputWithoutExpression() {\n\t\tconst wasErrored = this.states.error.active();\n\t\tif (this._raw_input != this._value || this._expression_controller || wasErrored) {\n\t\t\tthis._assignValue(this._raw_input);\n\t\t\tthis.states.error.clear();\n\t\t\tthis.removeDirtyState();\n\t\t\tthis.setSuccessorsDirty(this);\n\t\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t\t\tthis.options.executeCallback();\n\t\t\tif (this._expression_controller) {\n\t\t\t\tthis._expression_controller.setExpression(undefined, false);\n\t\t\t\tthis._expression_controller = undefined;\n\t\t\t\tthis.emitController.emit(ParamEvent.EXPRESSION_UPDATED); // ensure expression is considered removed\n\t\t\t}\n\t\t}\n\t}\n}\n","import {TypedMultipleParam} from './_Multiple';\nimport {Number2, StringOrNumber2} from '../../types/GlobalTypes';\nimport {Vector2} from 'three';\nimport {ParamType} from '../poly/ParamType';\nimport {FloatParam} from './Float';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {isArray} from '../../core/Type';\n\nconst COMPONENT_NAMES_VECTOR2: Readonly<string[]> = ['x', 'y'];\nconst tmp: Number2 = [0, 0];\n\nfunction vector2EqualsStringNumber2(v: Vector2, array: StringOrNumber2): boolean {\n\treturn v.x == array[0] && v.y == array[1];\n}\nfunction stringNumber2Equals(array1: StringOrNumber2, array2: StringOrNumber2): boolean {\n\treturn array1[0] == array2[0] && array1[1] == array2[1];\n}\n\nexport class Vector2Param extends TypedMultipleParam<ParamType.VECTOR2> {\n\tprotected override _value = new Vector2();\n\tx!: FloatParam;\n\ty!: FloatParam;\n\tstatic override type() {\n\t\treturn ParamType.VECTOR2;\n\t}\n\n\toverride componentNames(): Readonly<string[]> {\n\t\treturn COMPONENT_NAMES_VECTOR2;\n\t}\n\toverride defaultValueSerialized() {\n\t\tif (isArray(this._default_value)) {\n\t\t\treturn this._default_value;\n\t\t} else {\n\t\t\treturn this._default_value.toArray() as Number2;\n\t\t}\n\t}\n\toverride _prefilterInvalidRawInput(rawInput: any) {\n\t\tif (rawInput instanceof Vector2) {\n\t\t\trawInput.toArray(tmp);\n\t\t\treturn tmp;\n\t\t}\n\t\treturn super._prefilterInvalidRawInput(rawInput);\n\t}\n\t// get raw_input_serialized() {\n\t// \tif (this._raw_input instanceof Vector2) {\n\t// \t\treturn this._raw_input.toArray() as Number2;\n\t// \t} else {\n\t// \t\tconst new_array: StringOrNumber2 = [this._raw_input[0], this._raw_input[1]];\n\t// \t\treturn new_array;\n\t// \t}\n\t// }\n\toverride valueSerialized() {\n\t\treturn this.value.toArray() as Number2;\n\t}\n\tprivate _copied_value: Number2 = [0, 0];\n\tprotected override _copyValue(param: Vector2Param) {\n\t\tparam.value.toArray(this._copied_value);\n\t\tthis.set(this._copied_value);\n\t}\n\n\tprotected override _cloneRawInput(raw_input: ParamInitValuesTypeMap[ParamType.VECTOR2]) {\n\t\tif (raw_input instanceof Vector2) {\n\t\t\treturn raw_input.clone();\n\t\t} else {\n\t\t\tconst new_array: StringOrNumber2 = [raw_input[0], raw_input[1]];\n\t\t\t// in case array elements are undefined\n\t\t\tif (new_array[0] == null) {\n\t\t\t\tnew_array[0] = new_array[0] || 0;\n\t\t\t}\n\t\t\tif (new_array[1] == null) {\n\t\t\t\tnew_array[1] = new_array[1] || new_array[0];\n\t\t\t}\n\t\t\treturn new_array;\n\t\t}\n\t}\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.VECTOR2],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.VECTOR2]\n\t) {\n\t\tif (raw_input1 instanceof Vector2) {\n\t\t\tif (raw_input2 instanceof Vector2) {\n\t\t\t\treturn raw_input1.equals(raw_input2);\n\t\t\t} else {\n\t\t\t\treturn vector2EqualsStringNumber2(raw_input1, raw_input2);\n\t\t\t}\n\t\t} else {\n\t\t\tif (raw_input2 instanceof Vector2) {\n\t\t\t\treturn vector2EqualsStringNumber2(raw_input2, raw_input1);\n\t\t\t} else {\n\t\t\t\treturn stringNumber2Equals(raw_input1, raw_input2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.VECTOR2],\n\t\tval2: ParamValuesTypeMap[ParamType.VECTOR2]\n\t) {\n\t\treturn val1.equals(val2);\n\t}\n\toverride initComponents() {\n\t\tsuper.initComponents();\n\t\tthis.x = this.components[0];\n\t\tthis.y = this.components[1];\n\t}\n\n\toverride setValueFromComponents() {\n\t\tthis._value.x = this.x.value;\n\t\tthis._value.y = this.y.value;\n\t}\n\t// convert(input: any) {\n\t// \tif (isArray(input)) {\n\t// \t\treturn new Vector2().fromArray(input);\n\t// \t}\n\t// \treturn new Vector2();\n\t// }\n}\n","import {Number3, StringOrNumber3} from '../../types/GlobalTypes';\nimport {TypedMultipleParam} from './_Multiple';\nimport {FloatParam} from './Float';\nimport {Vector3} from 'three';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {isArray} from '../../core/Type';\n\nconst COMPONENT_NAMES_VECTOR3: Readonly<string[]> = ['x', 'y', 'z'];\nconst tmp: Number3 = [0, 0, 0];\n\nfunction vector3EqualsStringNumber3(v: Vector3, array: StringOrNumber3): boolean {\n\treturn v.x == array[0] && v.y == array[1] && v.z == array[2];\n}\nfunction stringNumber3Equals(array1: StringOrNumber3, array2: StringOrNumber3): boolean {\n\treturn array1[0] == array2[0] && array1[1] == array2[1] && array1[2] == array2[2];\n}\n\nexport class Vector3Param extends TypedMultipleParam<ParamType.VECTOR3> {\n\tprotected override _value = new Vector3();\n\tx!: FloatParam;\n\ty!: FloatParam;\n\tz!: FloatParam;\n\tstatic override type() {\n\t\treturn ParamType.VECTOR3;\n\t}\n\toverride componentNames(): Readonly<string[]> {\n\t\treturn COMPONENT_NAMES_VECTOR3;\n\t}\n\toverride defaultValueSerialized() {\n\t\tif (isArray(this._default_value)) {\n\t\t\treturn this._default_value;\n\t\t} else {\n\t\t\treturn this._default_value.toArray() as Number3;\n\t\t}\n\t}\n\toverride _prefilterInvalidRawInput(rawInput: any) {\n\t\tif (rawInput instanceof Vector3) {\n\t\t\trawInput.toArray(tmp);\n\t\t\treturn tmp;\n\t\t}\n\t\treturn super._prefilterInvalidRawInput(rawInput);\n\t}\n\t// get raw_input_serialized() {\n\t// \tif (this._raw_input instanceof Vector3) {\n\t// \t\treturn this._raw_input.toArray() as Number3;\n\t// \t} else {\n\t// \t\tconst new_array: StringOrNumber3 = [this._raw_input[0], this._raw_input[1], this._raw_input[2]];\n\t// \t\treturn new_array;\n\t// \t}\n\t// }\n\toverride valueSerialized() {\n\t\treturn this.value.toArray() as Number3;\n\t}\n\tprivate _copied_value: Number3 = [0, 0, 0];\n\tprotected override _copyValue(param: Vector3Param) {\n\t\tparam.value.toArray(this._copied_value);\n\t\tthis.set(this._copied_value);\n\t}\n\n\tprotected override _cloneRawInput(raw_input: ParamInitValuesTypeMap[ParamType.VECTOR3]) {\n\t\tif (raw_input instanceof Vector3) {\n\t\t\treturn raw_input.clone();\n\t\t} else {\n\t\t\tconst new_array: StringOrNumber3 = [raw_input[0], raw_input[1], raw_input[2]];\n\t\t\t// in case array elements are undefined\n\t\t\tif (new_array[0] == null) {\n\t\t\t\tnew_array[0] = new_array[0] || 0;\n\t\t\t}\n\t\t\tif (new_array[1] == null) {\n\t\t\t\tnew_array[1] = new_array[1] || new_array[0];\n\t\t\t}\n\t\t\tif (new_array[2] == null) {\n\t\t\t\tnew_array[2] = new_array[2] || new_array[1];\n\t\t\t}\n\t\t\treturn new_array;\n\t\t}\n\t}\n\n\tstatic override areRawInputEqual(\n\t\traw_input1: ParamInitValuesTypeMap[ParamType.VECTOR3],\n\t\traw_input2: ParamInitValuesTypeMap[ParamType.VECTOR3]\n\t) {\n\t\tif (raw_input1 instanceof Vector3) {\n\t\t\tif (raw_input2 instanceof Vector3) {\n\t\t\t\treturn raw_input1.equals(raw_input2);\n\t\t\t} else {\n\t\t\t\treturn vector3EqualsStringNumber3(raw_input1, raw_input2);\n\t\t\t}\n\t\t} else {\n\t\t\tif (raw_input2 instanceof Vector3) {\n\t\t\t\treturn vector3EqualsStringNumber3(raw_input2, raw_input1);\n\t\t\t} else {\n\t\t\t\treturn stringNumber3Equals(raw_input1, raw_input2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.VECTOR3],\n\t\tval2: ParamValuesTypeMap[ParamType.VECTOR3]\n\t) {\n\t\treturn val1.equals(val2);\n\t}\n\toverride initComponents() {\n\t\tsuper.initComponents();\n\t\tthis.x = this.components[0];\n\t\tthis.y = this.components[1];\n\t\tthis.z = this.components[2];\n\t}\n\n\t// set_raw_input_from_components() {\n\t// \tif (this._raw_input instanceof Vector3) {\n\t// \t\tif (\n\t// \t\t\tisNumber(this.x.raw_input) &&\n\t// \t\t\tisNumber(this.y.raw_input) &&\n\t// \t\t\tisNumber(this.z.raw_input)\n\t// \t\t) {\n\t// \t\t\tthis._raw_input.x = this.x.raw_input;\n\t// \t\t\tthis._raw_input.y = this.y.raw_input;\n\t// \t\t\tthis._raw_input.z = this.z.raw_input;\n\t// \t\t} else {\n\t// \t\t\tthis._raw_input = [this.x.raw_input, this.y.raw_input, this.z.raw_input];\n\t// \t\t}\n\t// \t} else {\n\t// \t\tthis._raw_input[0] = this.x.raw_input;\n\t// \t\tthis._raw_input[1] = this.y.raw_input;\n\t// \t\tthis._raw_input[2] = this.z.raw_input;\n\t// \t}\n\t// }\n\toverride setValueFromComponents() {\n\t\tthis._value.x = this.x.value;\n\t\tthis._value.y = this.y.value;\n\t\tthis._value.z = this.z.value;\n\t}\n\t// convert(input: ParamInitValuesTypeMap[ParamType.VECTOR3]) {\n\t// \tif (isArray(input)) {\n\t// \t\treturn new Vector3().fromArray(input);\n\t// \t}\n\t// \treturn new Vector3();\n\t// }\n}\n","import {Number4, StringOrNumber4} from '../../types/GlobalTypes';\nimport {TypedMultipleParam} from './_Multiple';\nimport {Vector4} from 'three';\nimport {ParamType} from '../poly/ParamType';\nimport {FloatParam} from './Float';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {isArray} from '../../core/Type';\n\nconst COMPONENT_NAMES_VECTOR4: Readonly<string[]> = ['x', 'y', 'z', 'w'];\nconst tmp: Number4 = [0, 0, 0, 0];\n\nfunction vector2EqualsStringNumber4(v: Vector4, array: StringOrNumber4): boolean {\n\treturn v.x == array[0] && v.y == array[1] && v.z == array[2] && v.w == array[3];\n}\nfunction stringNumber4Equals(array1: StringOrNumber4, array2: StringOrNumber4): boolean {\n\treturn array1[0] == array2[0] && array1[1] == array2[1] && array1[2] == array2[2] && array1[3] == array2[3];\n}\n\nexport class Vector4Param extends TypedMultipleParam<ParamType.VECTOR4> {\n\tprotected override _value = new Vector4();\n\tx!: FloatParam;\n\ty!: FloatParam;\n\tz!: FloatParam;\n\tw!: FloatParam;\n\tstatic override type() {\n\t\treturn ParamType.VECTOR4;\n\t}\n\toverride componentNames(): Readonly<string[]> {\n\t\treturn COMPONENT_NAMES_VECTOR4;\n\t}\n\toverride defaultValueSerialized() {\n\t\tif (isArray(this._default_value)) {\n\t\t\treturn this._default_value;\n\t\t} else {\n\t\t\treturn this._default_value.toArray() as Number4;\n\t\t}\n\t}\n\toverride _prefilterInvalidRawInput(rawInput: any) {\n\t\tif (rawInput instanceof Vector4) {\n\t\t\trawInput.toArray(tmp);\n\t\t\treturn tmp;\n\t\t}\n\t\treturn super._prefilterInvalidRawInput(rawInput);\n\t}\n\toverride valueSerialized() {\n\t\treturn this.value.toArray() as Number4;\n\t}\n\tprivate _copied_value: Number4 = [0, 0, 0, 0];\n\tprotected override _copyValue(param: Vector4Param) {\n\t\tparam.value.toArray(this._copied_value);\n\t\tthis.set(this._copied_value);\n\t}\n\tprotected override _cloneRawInput(rawInput: ParamInitValuesTypeMap[ParamType.VECTOR4]) {\n\t\tif (rawInput instanceof Vector4) {\n\t\t\treturn rawInput.clone();\n\t\t} else {\n\t\t\tconst newArray: StringOrNumber4 = [rawInput[0], rawInput[1], rawInput[2], rawInput[3]];\n\t\t\t// in case array elements are undefined\n\t\t\tif (newArray[0] == null) {\n\t\t\t\tnewArray[0] = newArray[0] || 0;\n\t\t\t}\n\t\t\tif (newArray[1] == null) {\n\t\t\t\tnewArray[1] = newArray[1] || newArray[0];\n\t\t\t}\n\t\t\tif (newArray[2] == null) {\n\t\t\t\tnewArray[2] = newArray[2] || newArray[1];\n\t\t\t}\n\t\t\tif (newArray[3] == null) {\n\t\t\t\tnewArray[3] = newArray[3] || newArray[2];\n\t\t\t}\n\t\t\treturn newArray;\n\t\t}\n\t}\n\tstatic override areRawInputEqual(\n\t\trawInput1: ParamInitValuesTypeMap[ParamType.VECTOR4],\n\t\trawInput2: ParamInitValuesTypeMap[ParamType.VECTOR4]\n\t) {\n\t\tif (rawInput1 instanceof Vector4) {\n\t\t\tif (rawInput2 instanceof Vector4) {\n\t\t\t\treturn rawInput1.equals(rawInput2);\n\t\t\t} else {\n\t\t\t\treturn vector2EqualsStringNumber4(rawInput1, rawInput2);\n\t\t\t}\n\t\t} else {\n\t\t\tif (rawInput2 instanceof Vector4) {\n\t\t\t\treturn vector2EqualsStringNumber4(rawInput2, rawInput1);\n\t\t\t} else {\n\t\t\t\treturn stringNumber4Equals(rawInput1, rawInput2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic override areValuesEqual(\n\t\tval1: ParamValuesTypeMap[ParamType.VECTOR4],\n\t\tval2: ParamValuesTypeMap[ParamType.VECTOR4]\n\t) {\n\t\treturn val1.equals(val2);\n\t}\n\toverride initComponents() {\n\t\tsuper.initComponents();\n\t\tthis.x = this.components[0];\n\t\tthis.y = this.components[1];\n\t\tthis.z = this.components[2];\n\t\tthis.w = this.components[3];\n\t}\n\n\toverride setValueFromComponents() {\n\t\tthis._value.x = this.x.value;\n\t\tthis._value.y = this.y.value;\n\t\tthis._value.z = this.z.value;\n\t\tthis._value.w = this.w.value;\n\t}\n}\n","import {BaseParamType} from '../_Base';\nimport {ParamEvent} from '../../poly/ParamEvent';\n\nexport class EmitController {\n\t_blockedEmit: boolean = false;\n\t_blockedParentEmit: boolean = false;\n\t_countByEventName: Map<string, number> = new Map();\n\tconstructor(protected param: BaseParamType) {}\n\n\temitAllowed(): boolean {\n\t\tif (this._blockedEmit === true) {\n\t\t\treturn false;\n\t\t}\n\t\t// be careful as this seems to prevent camera from panning as expected\n\t\t// if (this.param.scene().timeController.playing()) {\n\t\t// \treturn false;\n\t\t// }\n\n\t\tif (this.param.scene().loadingController.isLoading()) {\n\t\t\treturn false;\n\t\t}\n\t\t// TODO: should I also prevent nodes from updating\n\t\t// when they are being called in a loop such as from the Copy SOP?\n\t\t//node = this.node()\n\t\t//node? && !node.is_cooking() && this.scene().emit_allowed() # this prevents a camera from updating its param for instance\n\t\t// although maybe I should send a dirty to the store, and then that store queries the param?\n\t\treturn this.param.scene().dispatchController.emitAllowed();\n\t}\n\n\tblockEmit() {\n\t\tthis._blockedEmit = true;\n\t\tif (this.param.isMultiple() && this.param.components) {\n\t\t\tfor (const component of this.param.components) {\n\t\t\t\tcomponent.emitController.blockEmit();\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\tunblockEmit() {\n\t\tthis._blockedEmit = false;\n\t\tif (this.param.isMultiple() && this.param.components) {\n\t\t\tfor (const component of this.param.components) {\n\t\t\t\tcomponent.emitController.unblockEmit();\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\tblockParentEmit() {\n\t\tthis._blockedParentEmit = true;\n\t\treturn true;\n\t}\n\tunblockParentEmit() {\n\t\tthis._blockedParentEmit = false;\n\t\treturn true;\n\t}\n\n\tincrementCount(eventName: ParamEvent) {\n\t\tconst count = (this._countByEventName.get(eventName) || 0) + 1;\n\t\tthis._countByEventName.set(eventName, count);\n\t}\n\teventsCount(eventName: ParamEvent): number {\n\t\treturn this._countByEventName.get(eventName) || 0;\n\t}\n\n\temit(event: ParamEvent) {\n\t\tif (this.emitAllowed()) {\n\t\t\tthis.param.emit(event);\n\n\t\t\tconst parentParam = this.param.parentParam();\n\t\t\tif (parentParam != null && this._blockedParentEmit !== true) {\n\t\t\t\tparentParam.emit(event);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseParamType} from '../../_Base';\n\nexport class ParamTimeDependentState {\n\tconstructor(protected param: BaseParamType) {}\n\n\tactive(): boolean {\n\t\tconst frameGraphNodeId = this.param.scene().timeController.graphNode.graphNodeId();\n\n\t\treturn this.param.graphPredecessorIds()?.includes(frameGraphNodeId) || false;\n\t}\n}\n","import {BaseParamType} from '../../_Base';\nimport {ParamEvent} from '../../../poly/ParamEvent';\nimport {Poly} from '../../../Poly';\n\nexport class ParamErrorState {\n\tprivate _message: string | undefined;\n\tconstructor(private param: BaseParamType) {}\n\n\tset(message: string | undefined) {\n\t\tif (this._message != message) {\n\t\t\tif (message) {\n\t\t\t\tPoly.error(`[${this.param.path()}] error: '${message}'`);\n\t\t\t} else {\n\t\t\t\tPoly.warn(`[${this.param.path()}] clear error`);\n\t\t\t}\n\t\t\tthis._message = message;\n\t\t\tthis.param.emitController.emit(ParamEvent.ERROR_UPDATED);\n\t\t}\n\t}\n\tmessage() {\n\t\treturn this._message;\n\t}\n\tclear() {\n\t\tthis.set(undefined);\n\t}\n\tactive(): boolean {\n\t\treturn this._message != null;\n\t}\n}\n","import {BaseParamType} from '../_Base';\n\nimport {ParamTimeDependentState} from './states/TimeDependent';\nimport {ParamErrorState} from './states/Error';\n\nexport class ParamStatesController {\n\ttimeDependent = new ParamTimeDependentState(this.param);\n\terror = new ParamErrorState(this.param);\n\tconstructor(protected param: BaseParamType) {}\n}\n","import {CoreWalker} from '../../core/Walker';\nimport {CoreGraphNode} from '../../core/graph/CoreGraphNode';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {OptionsController} from './utils/OptionsController';\nimport {ExpressionController} from './utils/ExpressionController';\nimport {EmitController} from './utils/EmitController';\nimport {CoreParamSerializer} from './utils/CoreParamSerializer';\nimport {ParamStatesController} from './utils/StatesController';\nimport {TypedMultipleParam} from './_Multiple';\nimport {FloatParam} from './Float';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamEvent} from '../poly/ParamEvent';\nimport {PolyScene} from '../scene/PolyScene';\nimport {ParamInitValuesTypeMap} from '../params/types/ParamInitValuesTypeMap';\nimport {ParamValuesTypeMap} from '../params/types/ParamValuesTypeMap';\nimport {\n\tParamValueSerializedTypeMap,\n\tParamValuePreConversionSerializedTypeMap,\n} from '../params/types/ParamValueSerializedTypeMap';\nimport {ParamInitValueSerializedTypeMap} from './types/ParamInitValueSerializedTypeMap';\nimport {MethodDependency} from '../expressions/MethodDependency';\nimport {Poly} from '../Poly';\nimport {arrayCopy} from '../../core/ArrayUtils';\n\ntype ComputeCallback = (value: void) => void;\nconst TYPED_PARAM_DEFAULT_COMPONENT_NAMES: Readonly<string[]> = [];\n\ntype OnDisposeCallback = () => void;\nexport interface ParamOptions<T extends ParamType> {\n\tserializerClass?: typeof CoreParamSerializer<T>;\n}\n\nexport abstract class TypedParam<T extends ParamType> extends CoreGraphNode {\n\tprotected _default_value!: ParamInitValuesTypeMap[T];\n\tprotected _raw_input!: ParamInitValuesTypeMap[T];\n\tprotected _value!: ParamValuesTypeMap[T];\n\tprotected _node: BaseNodeType | undefined;\n\tprotected _parent_param: TypedMultipleParam<any> | undefined;\n\tprotected _components: FloatParam[] | undefined;\n\tprotected _computeResolves: ComputeCallback[] | undefined;\n\n\tprivate _options: OptionsController = new OptionsController(this);\n\tget options(): OptionsController {\n\t\treturn (this._options = this._options || new OptionsController(this));\n\t}\n\tprivate _emitController: EmitController = new EmitController(this);\n\tget emitController(): EmitController {\n\t\treturn (this._emitController = this._emitController || new EmitController(this));\n\t}\n\tprotected _expression_controller: ExpressionController<T> | undefined;\n\tget expressionController(): ExpressionController<T> | undefined {\n\t\treturn this._expression_controller;\n\t}\n\texpressionParsedAsString() {\n\t\treturn false;\n\t}\n\tprotected _serializer: CoreParamSerializer<T> | undefined;\n\tget serializer(): CoreParamSerializer<T> | undefined {\n\t\treturn this._serializer;\n\t}\n\tprivate _states: ParamStatesController | undefined;\n\tget states(): ParamStatesController {\n\t\treturn (this._states = this._states || new ParamStatesController(this));\n\t}\n\t// private _ui_data: UIData | undefined;\n\t// get ui_data(): UIData {\n\t// \treturn (this._ui_data = this._ui_data || new UIData(this.scene, this));\n\t// }\n\n\tconstructor(scene: PolyScene, node: BaseNodeType, options: ParamOptions<T>) {\n\t\tsuper(scene, 'BaseParam');\n\t\tif (options.serializerClass) {\n\t\t\tthis._serializer = new options.serializerClass(this);\n\t\t}\n\t\tthis._node = node;\n\t\tthis._initializeParam();\n\t}\n\toverride dispose() {\n\t\tif (this.expressionController && this.hasExpression()) {\n\t\t\tthis.set(this.rawInputSerialized());\n\t\t}\n\t\tconst _tmpCoreGraphNodes: CoreGraphNode[] = [];\n\n\t\t// if any direct predecessor is a MethodDependency,\n\t\t// it must be disposed here\n\t\tconst predecessors = this.graphPredecessors();\n\t\tif (predecessors) {\n\t\t\tarrayCopy(predecessors, _tmpCoreGraphNodes);\n\t\t\tfor (const predecessor of _tmpCoreGraphNodes) {\n\t\t\t\tif (predecessor instanceof MethodDependency) {\n\t\t\t\t\tpredecessor.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst successors = this.graphSuccessors();\n\t\tif (successors) {\n\t\t\tarrayCopy(successors, _tmpCoreGraphNodes);\n\t\t\tfor (const successor of _tmpCoreGraphNodes) {\n\t\t\t\tif (successor instanceof TypedParam) {\n\t\t\t\t\tconst input = successor.rawInputSerialized();\n\t\t\t\t\tsuccessor.set(successor.defaultValue());\n\t\t\t\t\tsuccessor.set(input);\n\t\t\t\t} else {\n\t\t\t\t\tsuccessor.setDirty();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.scene().missingExpressionReferencesController.deregisterParam(this);\n\t\tthis._expression_controller?.dispose();\n\t\tsuper.dispose();\n\t\tthis._options?.dispose();\n\t\tthis._node = undefined;\n\t\tthis._parent_param = undefined;\n\t\tthis._runOnDisposeCallbacks();\n\t}\n\tprotected _initializeParam() {}\n\tpostOptionsInitialize() {}\n\t// \t// this.addPostDirtyHook(this._remove_node_param_cache.bind(this))\n\t// }\n\t// initialize() {\n\t// \tthis.initComponents();\n\t// \t// this.init_expression()\n\t// \t// this._init_ui_data()\n\t// }\n\t// accepts_visitor<T extends ParamVisitor>(visitor: T): ReturnType<T['visit_param']> {\n\t// \treturn visitor.visit_param(this);\n\t// }\n\n\t//\n\t// init_expression() {}\n\n\t// type\n\tstatic type(): ParamType {\n\t\treturn ParamType.FLOAT; // adding a type here, but just to not have a compile error\n\t}\n\ttype(): T {\n\t\treturn (this.constructor as typeof BaseParamClass).type() as T;\n\t}\n\tisNumeric(): boolean {\n\t\treturn false;\n\t}\n\n\t// name\n\toverride setName(name: string) {\n\t\tsuper.setName(name);\n\t}\n\n\tget value(): ParamValuesTypeMap[T] {\n\t\treturn this._value;\n\t}\n\tabstract defaultValueSerialized(): ParamInitValueSerializedTypeMap[T];\n\tabstract rawInputSerialized(): ParamInitValueSerializedTypeMap[T];\n\tabstract valueSerialized(): ParamValueSerializedTypeMap[T];\n\tcopyValue(param: BaseParamType) {\n\t\tif (param.type() == this.type()) {\n\t\t\tthis._copyValue(param as TypedParam<T>);\n\t\t} else {\n\t\t\tconsole.warn(`cannot copy value from ${param.type()} to ${this.type()}`);\n\t\t}\n\t}\n\tprotected _copyValue(param: TypedParam<T>) {\n\t\tthrow 'abstract method param._copy_value';\n\t}\n\tvaluePreConversionSerialized(): ParamValuePreConversionSerializedTypeMap[T] {\n\t\treturn undefined as never;\n\t}\n\tconvert(rawVal: any): ParamValuesTypeMap[T] | null {\n\t\treturn null;\n\t}\n\tstatic areRawInputEqual(val1: any, val2: any) {\n\t\treturn false;\n\t}\n\tisRawInputEqual(other_raw_input: ParamInitValuesTypeMap[T]) {\n\t\treturn (this.constructor as any).areRawInputEqual(this._raw_input, other_raw_input);\n\t}\n\tisDefaultValueEqual(other_default_value: ParamInitValuesTypeMap[T]) {\n\t\treturn (this.constructor as any).areRawInputEqual(this._default_value, other_default_value);\n\t}\n\tstatic areValuesEqual(val1: any, val2: any) {\n\t\treturn false;\n\t}\n\tisValueEqual(other_val: ParamValuesTypeMap[T]) {\n\t\treturn (this.constructor as any).areValuesEqual(this.value, other_val);\n\t}\n\tprotected _cloneRawInput(raw_input: ParamInitValuesTypeMap[T]): ParamInitValuesTypeMap[T] {\n\t\treturn raw_input;\n\t}\n\tset(raw_input: ParamInitValuesTypeMap[T]): void {\n\t\tthis._raw_input = this._cloneRawInput(this._prefilterInvalidRawInput(raw_input));\n\t\tthis.emitController.emit(ParamEvent.RAW_INPUT_UPDATED);\n\t\tthis.processRawInput();\n\t}\n\tprotected _prefilterInvalidRawInput(raw_input: any): ParamInitValuesTypeMap[T] {\n\t\treturn raw_input as ParamInitValuesTypeMap[T];\n\t}\n\tdefaultValue() {\n\t\treturn this._default_value;\n\t}\n\tisDefault(): boolean {\n\t\treturn this._raw_input == this._default_value;\n\t}\n\trawInput() {\n\t\treturn this._raw_input;\n\t}\n\n\tprotected processRawInput() {}\n\tprivate _isComputing: boolean = false;\n\tisComputing() {\n\t\treturn this._isComputing;\n\t}\n\tasync compute(): Promise<void> {\n\t\tif (this.scene().loadingController.isLoading()) {\n\t\t\t// TODO:\n\t\t\t// test that node path created in material builders\n\t\t\t// do not compute on load,\n\t\t\t// But they should still be able to compute an expression\n\t\t\t// and therefore .compute() is still necessary\n\t\t\tPoly.warn(`param attempt to compute ${this.path()} while scene is loading`);\n\t\t}\n\n\t\tif (this.isDirty()) {\n\t\t\tif (!this._isComputing) {\n\t\t\t\tthis._isComputing = true;\n\t\t\t\tawait this.processComputation();\n\t\t\t\tthis._isComputing = false;\n\n\t\t\t\tif (this._computeResolves) {\n\t\t\t\t\tconst resolves = [...this._computeResolves];\n\t\t\t\t\tthis._computeResolves = undefined;\n\t\t\t\t\tfor (const resolve of resolves) {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tthis._computeResolves = this._computeResolves || [];\n\t\t\t\t\tthis._computeResolves.push(resolve);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tprotected async processComputation(): Promise<void> {}\n\t// set_default_value(default_value: ParamValuesTypeMap[T]) {\n\t// \tthis._default_value = default_value;\n\t// }\n\tsetInitValue(init_value: ParamInitValuesTypeMap[T]) {\n\t\tthis._default_value = this._cloneRawInput(this._prefilterInvalidRawInput(init_value));\n\t\t// this._raw_input = this._cloneRawInput(init_value);\n\n\t\t// if (this.isMultiple()) {\n\t\t// \tthis.initComponents();\n\t\t// }\n\n\t\t// this.set(init_value);\n\t}\n\t// eval_p(): Promise<ParamValuesTypeMap[T]> {\n\t// \treturn new Promise((resolve, reject) => {\n\t// \t\tresolve();\n\t// \t});\n\t// }\n\n\t// node\n\t_setupNodeDependencies(node: BaseNodeType | null) {\n\t\tif (!node) {\n\t\t\tif (this._node) {\n\t\t\t\tthis._node.params.params_node?.removeGraphInput(this);\n\t\t\t}\n\t\t} else {\n\t\t\t// allow callbacks after the value is set,\n\t\t\t// so that the param does not trigger the node to recompute\n\t\t\t// before all params are added\n\t\t\tthis.options.allowCallback();\n\n\t\t\tif (!this.parentParam()) {\n\t\t\t\tif (this.options.makesNodeDirtyWhenDirty()) {\n\t\t\t\t\tnode.params.params_node?.addGraphInput(this, false);\n\t\t\t\t} else {\n\t\t\t\t\t// if the param does not make the node cook when dirty,\n\t\t\t\t\t// we still want it to run its attached callback when dirty\n\t\t\t\t\tthis.dirtyController.addPostDirtyHook('run callback', async () => {\n\t\t\t\t\t\tawait this.compute();\n\t\t\t\t\t\tawait this.options.executeCallback();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.components) {\n\t\t\tfor (const c of this.components) {\n\t\t\t\tc._setupNodeDependencies(node);\n\t\t\t}\n\t\t}\n\t}\n\tget node() {\n\t\treturn this._node!;\n\t}\n\tparent() {\n\t\treturn this.node;\n\t}\n\n\t// hierarchy\n\tset_parent_param(param: TypedMultipleParam<any>) {\n\t\tparam.addGraphInput(this, false);\n\t\tthis._parent_param = param;\n\t}\n\tparentParam(): TypedMultipleParam<any> | undefined {\n\t\treturn this._parent_param;\n\t}\n\thas_parent_param(): boolean {\n\t\treturn this._parent_param != null;\n\t}\n\tpath(): string {\n\t\treturn this.node?.path() + '/' + this.name();\n\t}\n\tpathRelativeTo(node: BaseNodeType): string {\n\t\tif (!this._node) {\n\t\t\treturn this.name();\n\t\t}\n\t\tconst nodeRelativePath = CoreWalker.relativePath(node, this._node);\n\n\t\tif (nodeRelativePath.length > 0) {\n\t\t\treturn CoreWalker.sanitizePath(`${nodeRelativePath}${CoreWalker.SEPARATOR}${this.name()}`);\n\t\t} else {\n\t\t\treturn this.name();\n\t\t}\n\t}\n\n\t// emit\n\temit(eventName: ParamEvent): void {\n\t\tif (this.emitController.emitAllowed()) {\n\t\t\tthis.emitController.incrementCount(eventName);\n\t\t\tthis.scene().dispatchController.dispatch(this, eventName);\n\t\t}\n\t}\n\n\t// multiple\n\tget components() {\n\t\treturn this._components;\n\t}\n\tcomponentNames(): Readonly<string[]> {\n\t\treturn TYPED_PARAM_DEFAULT_COMPONENT_NAMES;\n\t}\n\tisMultiple(): boolean {\n\t\treturn this.componentNames().length > 0;\n\t}\n\tinitComponents() {}\n\n\thasExpression(): boolean {\n\t\treturn this.expressionController != null && this.expressionController.active(); // use this._expression_controller to avoid creating it\n\t}\n\n\t// serialize\n\ttoJSON() {\n\t\tif (!this._serializer) {\n\t\t\treturn;\n\t\t}\n\t\treturn this._serializer.toJSON();\n\t}\n\n\t// dispose callbacks\n\tprivate _onDisposeCallbacks: Set<OnDisposeCallback> | undefined;\n\tonDispose(callback: OnDisposeCallback) {\n\t\tthis._onDisposeCallbacks = this._onDisposeCallbacks || new Set();\n\t\tthis._onDisposeCallbacks.add(callback);\n\t}\n\tderegisterOnDispose(callback: OnDisposeCallback) {\n\t\tif (this._onDisposeCallbacks) {\n\t\t\tthis._onDisposeCallbacks.delete(callback);\n\t\t}\n\t}\n\tprivate _runOnDisposeCallbacks() {\n\t\tif (this._onDisposeCallbacks) {\n\t\t\tthis._onDisposeCallbacks.forEach((callback) => {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t\tthis._onDisposeCallbacks.clear();\n\t\t\tthis._onDisposeCallbacks = undefined;\n\t\t}\n\t}\n}\nexport type BaseParamType = TypedParam<ParamType>;\nexport class BaseParamClass extends TypedParam<ParamType> {\n\tdefaultValueSerialized() {\n\t\treturn 'BaseParamClass.defaultValueSerialized overriden';\n\t}\n\trawInputSerialized() {\n\t\treturn 'BaseParamClass.rawInputSerialized overriden';\n\t}\n\tvalueSerialized() {\n\t\treturn 'BaseParamClass.valueSerialized overriden';\n\t}\n}\n","import {ParamEvent} from './../poly/ParamEvent';\nimport {BaseParamType} from './_Base';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {DecomposedPath} from '../../core/DecomposedPath';\nimport {TypedStringParam} from './_BaseString';\n\nexport abstract class TypedPathParam<T extends ParamType.NODE_PATH | ParamType.PARAM_PATH> extends TypedStringParam<T> {\n\tpublic readonly decomposedPath = new DecomposedPath();\n\n\toverride dispose(): void {\n\t\tthis.scene().referencesController.resetReferenceFromParam(this);\n\t\tsuper.dispose();\n\t}\n\n\tabstract notifyPathRebuildRequired(node: BaseNodeType | BaseParamType): void;\n\tabstract notifyTargetParamOwnerParamsUpdated(node: BaseNodeType | BaseParamType): void;\n\tprotected abstract _findTarget(): void;\n\n\tprotected _handleReferences(node: BaseNodeType | BaseParamType | null, path: string) {\n\t\tif (path == '') {\n\t\t\t// no need to handle references if param value is empty\n\t\t\t// as no node could match this path\n\t\t\treturn;\n\t\t}\n\n\t\tthis.scene().referencesController.setNamedNodesFromParam(this);\n\t\tif (node) {\n\t\t\tthis.scene().referencesController.setReferenceFromParam(this, node);\n\t\t\tthis.scene().missingExpressionReferencesController.deregisterParam(this);\n\t\t} else {\n\t\t\tthis.scene().missingExpressionReferencesController.register(this, path);\n\t\t}\n\t}\n\tprotected override async processComputation(): Promise<void> {\n\t\tif (this.expressionController?.active() && !this.expressionController.entitiesDependent()) {\n\t\t\tawait super.processComputation();\n\t\t} else {\n\t\t\tthis._findTarget();\n\t\t}\n\t}\n\tprotected override processRawInputWithoutExpression() {\n\t\tconst wasErrored = this.states.error.active();\n\t\tif (this._value.path() != this._raw_input || this._expression_controller || wasErrored) {\n\t\t\tthis._setValuePathAndFindTarget(this._raw_input, true);\n\t\t\tthis.states.error.clear();\n\t\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t\t\tthis.options.executeCallback();\n\t\t\tif (this._expression_controller) {\n\t\t\t\tthis._expression_controller.setExpression(undefined, false);\n\t\t\t\tthis._expression_controller = undefined;\n\t\t\t\tthis.emitController.emit(ParamEvent.EXPRESSION_UPDATED); // ensure expression is considered removed\n\t\t\t}\n\t\t}\n\t}\n\tprotected _setValuePathAndFindTarget(path: string, setDirty: boolean) {\n\t\tthis._value.setPath(path);\n\t\tthis._findTarget();\n\t\tif (setDirty) {\n\t\t\tthis.setDirty(); // setDirty here creates an infinite loop when using with a copy sop\n\t\t}\n\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t}\n}\n","import {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {stringValueElements} from './../expressions/traversers/ParsedTree';\nimport {ParamEvent} from './../poly/ParamEvent';\nimport {TypedParam} from './_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {ExpressionController} from './utils/ExpressionController';\n\nexport abstract class TypedStringParam<\n\tT extends ParamType.STRING | ParamType.NODE_PATH | ParamType.PARAM_PATH\n> extends TypedParam<T> {\n\tprotected abstract _assignValue(value: ParamValuesTypeMap[T] | string): void;\n\n\toverride expressionParsedAsString() {\n\t\treturn true;\n\t}\n\n\tprotected override processRawInput() {\n\t\tif (stringValueElements(this._raw_input).length >= 3) {\n\t\t\tthis._expression_controller = this._expression_controller || new ExpressionController(this);\n\t\t\tif (this._raw_input != this._expression_controller.expression()) {\n\t\t\t\tthis.states.error.clear();\n\t\t\t\tthis._expression_controller.setExpression(this._raw_input, false);\n\t\t\t\tthis.setDirty();\n\t\t\t\tthis.emitController.emit(ParamEvent.EXPRESSION_UPDATED);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.processRawInputWithoutExpression();\n\t\t}\n\t}\n\tprotected abstract processRawInputWithoutExpression(): void;\n\n\tprotected override async processComputation(): Promise<void> {\n\t\tif (this.expressionController?.active() && !this.expressionController.entitiesDependent()) {\n\t\t\tconst expressionResult = await this.expressionController.computeExpression();\n\t\t\tif (this.expressionController.isErrored()) {\n\t\t\t\tthis.states.error.set(\n\t\t\t\t\t`expression error: \"${this.expressionController.expression()}\" (${this.expressionController.errorMessage()})`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst converted = this.convert(expressionResult);\n\t\t\t\t// we need to check if equal nulls explicitely\n\t\t\t\t// as the empty string '' evals to false...\n\t\t\t\tif (converted != null) {\n\t\t\t\t\tthis.states.error.clear();\n\t\t\t\t\tthis._assignValue(converted);\n\t\t\t\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t\t\t\t\tthis.options.executeCallback();\n\t\t\t\t} else {\n\t\t\t\t\tthis.states.error.set(`expression returns an invalid type (${expressionResult})`);\n\t\t\t\t}\n\t\t\t\tthis.removeDirtyState();\n\t\t\t}\n\t\t}\n\t}\n}\n","import {StringOrNumber} from '../../types/GlobalTypes';\nimport {TypedParam} from './_Base';\nimport {FloatParam} from './Float';\nimport {ParamType} from '../poly/ParamType';\nimport {ParamEvent} from '../poly/ParamEvent';\nimport {ParamInitValueSerializedTypeMap} from './types/ParamInitValueSerializedTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {isArray} from '../../core/Type';\nimport {CoreParamSerializer} from './utils/CoreParamSerializer';\n\nexport abstract class TypedMultipleParam<T extends ParamType> extends TypedParam<T> {\n\tprivate _components_contructor = FloatParam;\n\tprotected override _components!: FloatParam[];\n\tprivate _componentsCount = 0;\n\toverride get components() {\n\t\treturn this._components;\n\t}\n\toverride isNumeric() {\n\t\treturn true;\n\t}\n\toverride isDefault() {\n\t\tfor (const c of this.components) {\n\t\t\tif (!c.isDefault()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\toverride rawInput() {\n\t\treturn this._components.map((c) => c.rawInput()) as ParamInitValueSerializedTypeMap[T];\n\t}\n\trawInputSerialized() {\n\t\treturn this._components.map((c) => c.rawInputSerialized()) as ParamInitValueSerializedTypeMap[T];\n\t}\n\tprotected override _copyValue(param: TypedMultipleParam<T>) {\n\t\tfor (let i = 0; i < this.components.length; i++) {\n\t\t\tconst component = this.components[i];\n\t\t\tconst src_component = param.components[i];\n\t\t\tcomponent.copyValue(src_component);\n\t\t}\n\t}\n\n\toverride initComponents() {\n\t\tif (this._components != null) {\n\t\t\treturn;\n\t\t}\n\t\tlet index = 0;\n\t\tthis._components = new Array(this.componentNames().length);\n\t\tfor (const componentName of this.componentNames()) {\n\t\t\tconst component = new this._components_contructor(this.scene(), this.node, {\n\t\t\t\tserializerClass: this._serializer?.constructor as typeof CoreParamSerializer<any> | undefined,\n\t\t\t}); //, `${this.name}${name}`);\n\t\t\tlet default_val;\n\t\t\tif (isArray(this._default_value)) {\n\t\t\t\tdefault_val = this._default_value[index];\n\t\t\t} else {\n\t\t\t\tdefault_val = (this._default_value as any)[componentName];\n\t\t\t}\n\t\t\tcomponent.options.copy(this.options);\n\t\t\tcomponent.setInitValue(default_val);\n\n\t\t\t// component.setScene(this.scene);\n\t\t\tcomponent.setName(`${this.name()}${componentName}`);\n\t\t\tcomponent.set_parent_param(this);\n\n\t\t\t// this.addGraphInput(component, false); // already called in set_parent_param\n\t\t\t// component.initialize();\n\t\t\tthis._components[index] = component;\n\t\t\tindex++;\n\t\t}\n\t\tthis._componentsCount = this._components.length;\n\t\t// this.compute();\n\t}\n\n\tprotected override async processComputation(): Promise<void> {\n\t\tawait this.computeComponents();\n\t\tthis.setValueFromComponents();\n\t}\n\n\tabstract setValueFromComponents(): void;\n\t// set_raw_input_from_components() {}\n\n\toverride hasExpression() {\n\t\tfor (const c of this.components) {\n\t\t\tif (c.expressionController?.active()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// private _promises:Promise<void>[] = [];\n\tprivate async computeComponents() {\n\t\tconst components = this.components;\n\t\t// _promises.length = 0;\n\t\t// in order to avoid having to allocate an array\n\t\t// which could allow us to use Promise.all()\n\t\t// we use a for loop instead,\n\t\t// even if it means that the rare case where more than 1 component has an expression\n\t\t// this would be slower\n\t\tfor (const c of components) {\n\t\t\tif (c.isDirty()) {\n\t\t\t\tawait c.compute();\n\t\t\t\t// _promises.push(c.compute());\n\t\t\t}\n\t\t}\n\t\t// await Promise.all(_promises);\n\t\tthis.removeDirtyState();\n\t}\n\tprotected override _prefilterInvalidRawInput(raw_input: any): ParamInitValuesTypeMap[T] {\n\t\tif (!isArray(raw_input)) {\n\t\t\tconst numberOrString = raw_input as number | string;\n\t\t\tconst raw_input_wrapped_in_array: StringOrNumber[] = this.componentNames().map(() => numberOrString);\n\t\t\treturn raw_input_wrapped_in_array as ParamInitValuesTypeMap[T];\n\t\t} else {\n\t\t\treturn raw_input as ParamInitValuesTypeMap[T];\n\t\t}\n\t}\n\n\tprotected override processRawInput() {\n\t\tconst cooker = this.scene().cooker;\n\t\tcooker.block();\n\t\tconst components = this.components;\n\t\tfor (const c of components) {\n\t\t\tc.emitController.blockParentEmit();\n\t\t}\n\n\t\t// if (isArray(values)) {\n\t\tconst value = this._raw_input;\n\t\tlet prevValue: number = 0;\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < this._componentsCount; i++) {\n\t\t\t\tlet componentValue = (value as any)[i];\n\t\t\t\t// use the prev value, in case we give an array that is too short\n\t\t\t\tif (componentValue == null) {\n\t\t\t\t\tcomponentValue = prevValue;\n\t\t\t\t}\n\t\t\t\tcomponents[i].set(componentValue);\n\t\t\t\tprevValue = componentValue;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0; i < this._componentsCount; i++) {\n\t\t\t\tconst componentName = this.componentNames()[i];\n\t\t\t\tlet componentValue = (value as any)[componentName];\n\t\t\t\t// use the prev value, in case we give a vec2 instead of vec3\n\t\t\t\tif (componentValue == null) {\n\t\t\t\t\tcomponentValue = prevValue;\n\t\t\t\t}\n\t\t\t\tcomponents[i].set(componentValue);\n\t\t\t\tprevValue = componentValue;\n\t\t\t}\n\t\t}\n\t\t// } else {\n\t\t// \tconst component_names = this.componentNames()()\n\t\t// \tfor (let i = 0; i < components.length; i++) {\n\t\t// \t\tcomponents[i].set(values[component_names[i]])\n\t\t// \t}\n\t\t// }\n\n\t\tcooker.unblock();\n\n\t\tfor (const component of this.components) {\n\t\t\tcomponent.emitController.unblockParentEmit();\n\t\t}\n\t\t// this.emit(ParamEvent.UPDATED);\n\n\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t}\n}\n\n// class BaseMultipleParam extends TypedMultipleParam<Vector> {}\n","import {TypedParam} from './_Base';\nimport {ParamType} from '../poly/ParamType';\nimport {ExpressionController} from './utils/ExpressionController';\nimport {ParamEvent} from '../poly/ParamEvent';\nimport {ParamValuesTypeMap} from './types/ParamValuesTypeMap';\nimport {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';\nimport {isArray,isString} from '../../core/Type';\n\nexport abstract class TypedNumericParam<T extends ParamType> extends TypedParam<T> {\n\toverride isNumeric() {\n\t\treturn true;\n\t}\n\toverride isDefault(): boolean {\n\t\treturn this._raw_input == this._default_value;\n\t}\n\n\tprotected override _prefilterInvalidRawInput(raw_input: any): ParamInitValuesTypeMap[T] {\n\t\tif (isArray(raw_input)) {\n\t\t\treturn raw_input[0] as ParamInitValuesTypeMap[T];\n\t\t} else {\n\t\t\treturn raw_input;\n\t\t}\n\t}\n\n\tprotected override processRawInput() {\n\t\tconst converted = this.convert(this._raw_input);\n\t\tif (converted != null) {\n\t\t\tif (this._expression_controller) {\n\t\t\t\tthis._expression_controller.setExpression(undefined, false);\n\t\t\t\tthis.emitController.emit(ParamEvent.EXPRESSION_UPDATED); // ensure expression is considered removed\n\t\t\t}\n\t\t\tconst wasErrored = this.states.error.active();\n\t\t\tthis.states.error.clear();\n\t\t\tif (converted != this._value || wasErrored) {\n\t\t\t\tthis._updateValue(converted);\n\t\t\t\tthis.setSuccessorsDirty(this);\n\t\t\t}\n\t\t} else {\n\t\t\tif (isString(this._raw_input)) {\n\t\t\t\tthis.states.error.clear();\n\t\t\t\tthis._expression_controller = this._expression_controller || new ExpressionController(this);\n\t\t\t\tif (this._raw_input != this._expression_controller.expression()) {\n\t\t\t\t\tthis._expression_controller.setExpression(this._raw_input);\n\t\t\t\t\tthis.emitController.emit(ParamEvent.EXPRESSION_UPDATED);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.states.error.set(`param input is invalid (${this.path()})`);\n\t\t\t}\n\t\t}\n\t}\n\tprotected override async processComputation(): Promise<void> {\n\t\tif (this.expressionController?.active() && !this.expressionController.entitiesDependent()) {\n\t\t\tconst expression_result = await this.expressionController.computeExpression();\n\t\t\tif (this.expressionController.isErrored()) {\n\t\t\t\tthis.states.error.set(\n\t\t\t\t\t`expression error: \"${this.expressionController.expression()}\" (${this.expressionController.errorMessage()})`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst converted = this.convert(expression_result);\n\t\t\t\tif (converted != null) {\n\t\t\t\t\tif (this.states.error.active()) {\n\t\t\t\t\t\tthis.states.error.clear();\n\t\t\t\t\t}\n\t\t\t\t\tthis._updateValue(converted);\n\t\t\t\t} else {\n\t\t\t\t\tthis.states.error.set(\n\t\t\t\t\t\t`expression returns an invalid type (${expression_result}) (${this.expressionController.expression()})`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _updateValue(new_value: ParamValuesTypeMap[T]) {\n\t\tthis._value = new_value;\n\t\tconst parentParam = this.parentParam();\n\t\tif (parentParam) {\n\t\t\tparentParam.setValueFromComponents();\n\t\t}\n\t\tthis.options.executeCallback();\n\t\tthis.emitController.emit(ParamEvent.VALUE_UPDATED);\n\t\tthis.removeDirtyState();\n\t}\n}\n","import {CubicInterpolant} from 'three';\nimport {MathUtils} from 'three';\nimport {arraySortBy} from '../../../core/ArrayUtils';\n\nexport interface RampPointJson {\n\tposition: number;\n\tvalue: number;\n}\nexport interface RampValueJson {\n\tpoints: RampPointJson[];\n\tinterpolation: RampInterpolation;\n}\n\nexport class RampPoint {\n\tconstructor(private _position: number = 0, private _value: number = 0) {}\n\n\ttoJSON(): RampPointJson {\n\t\treturn {\n\t\t\tposition: this._position,\n\t\t\tvalue: this._value,\n\t\t};\n\t}\n\tposition() {\n\t\treturn this._position;\n\t}\n\tvalue() {\n\t\treturn this._value;\n\t}\n\tcopy(point: RampPoint) {\n\t\tthis._position = point.position();\n\t\tthis._value = point.value();\n\t}\n\tclone() {\n\t\tconst point = new RampPoint();\n\t\tpoint.copy(this);\n\t\treturn point;\n\t}\n\tisEqual(other_point: RampPoint) {\n\t\treturn this._position == other_point.position() && this._value == other_point.value();\n\t}\n\tisEqualJSON(json: RampPointJson) {\n\t\treturn this._position == json.position && this._value == json.value;\n\t}\n\tfromJSON(json: RampPointJson) {\n\t\tthis._position = json.position;\n\t\tthis._value = json.value;\n\t}\n\tstatic areEqualJSON(json1: RampPointJson, json2: RampPointJson) {\n\t\treturn json1.position == json2.position && json1.value == json2.value;\n\t}\n\tstatic fromJSON(json: RampPointJson) {\n\t\treturn new RampPoint(json.position, json.value);\n\t}\n}\n\nexport enum RampInterpolation {\n\tCUBIC = 'cubic',\n}\nexport const RAMP_INTERPOLATIONS: RampInterpolation[] = [RampInterpolation.CUBIC];\nexport class RampValue {\n\tprivate _uuid: string;\n\n\tconstructor(\n\t\tprivate _interpolation: RampInterpolation = RampInterpolation.CUBIC,\n\t\tprivate _points: RampPoint[] = []\n\t) {\n\t\tthis._uuid = MathUtils.generateUUID();\n\t}\n\n\tuuid() {\n\t\treturn this._uuid;\n\t}\n\tinterpolation() {\n\t\treturn this._interpolation;\n\t}\n\tpoints() {\n\t\treturn this._points;\n\t}\n\tstatic createInterpolantFromValues(positions: Float32Array, values: Float32Array) {\n\t\tconst valuesCount = 1;\n\t\tconst interpolatedValues = new Float32Array(valuesCount);\n\t\treturn new CubicInterpolant(positions, values, valuesCount, interpolatedValues);\n\t}\n\tcreateInterpolant() {\n\t\treturn RampValue.createInterpolant(this);\n\t}\n\tstatic createInterpolant(rampValue: RampValue) {\n\t\tconst points = rampValue.points();\n\t\tconst sortedPoints = arraySortBy(points, (point) => point.position());\n\t\tconst positions = new Float32Array(sortedPoints.length);\n\t\tconst values = new Float32Array(sortedPoints.length);\n\n\t\tlet i = 0;\n\t\tfor (const sortedPoint of sortedPoints) {\n\t\t\tpositions[i] = sortedPoint.position();\n\t\t\tvalues[i] = sortedPoint.value();\n\t\t\ti++;\n\t\t}\n\n\t\treturn this.createInterpolantFromValues(positions, values);\n\t}\n\n\tstatic fromJSON(json: RampValueJson): RampValue {\n\t\tconst points = [];\n\t\tfor (const jsonPoint of json.points) {\n\t\t\tpoints.push(RampPoint.fromJSON(jsonPoint));\n\t\t}\n\t\tlet interpolation = json.interpolation;\n\t\tif (interpolation == null || (interpolation as string) == '') {\n\t\t\tinterpolation = RampInterpolation.CUBIC;\n\t\t}\n\t\treturn new RampValue(interpolation, points);\n\t}\n\ttoJSON(): RampValueJson {\n\t\treturn {\n\t\t\tinterpolation: this._interpolation,\n\t\t\tpoints: this._points.map((p) => p.toJSON()),\n\t\t};\n\t}\n\tclone(): RampValue {\n\t\tconst ramp = new RampValue();\n\t\tramp.copy(this);\n\t\treturn ramp;\n\t}\n\tcopy(ramp: RampValue) {\n\t\tthis._interpolation = ramp.interpolation();\n\t\tconst newPointsCount = ramp.points().length;\n\t\tconst currentPointsCount = this._points.length;\n\t\tif (currentPointsCount > newPointsCount) {\n\t\t\tconst pointsCountToRemove = currentPointsCount - newPointsCount;\n\t\t\tconst spliceStart = currentPointsCount - pointsCountToRemove;\n\t\t\tthis._points.splice(spliceStart, pointsCountToRemove);\n\t\t}\n\n\t\tlet index = 0;\n\t\tfor (const point of ramp.points()) {\n\t\t\tconst currentPoint = this._points[index];\n\t\t\tif (currentPoint) {\n\t\t\t\tcurrentPoint.copy(point);\n\t\t\t} else {\n\t\t\t\tthis._points.push(point.clone());\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\t}\n\n\tisEqual(other_ramp_value: RampValue): boolean {\n\t\tif (this._interpolation != other_ramp_value.interpolation()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst other_points = other_ramp_value.points();\n\t\tif (this._points.length != other_points.length) {\n\t\t\treturn false;\n\t\t}\n\t\tlet index = 0;\n\t\tfor (const point of this._points) {\n\t\t\tconst other_point = other_points[index];\n\t\t\tif (!point.isEqual(other_point)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\n\t\treturn true;\n\t}\n\tisEqualJSON(json: RampValueJson) {\n\t\tif (this._interpolation != json.interpolation) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this._points.length != json.points.length) {\n\t\t\treturn false;\n\t\t}\n\t\tlet index = 0;\n\t\tfor (const point of this._points) {\n\t\t\tconst other_point = json.points[index];\n\t\t\tif (!point.isEqualJSON(other_point)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\t\treturn true;\n\t}\n\tstatic are_json_equal(json1: RampValueJson, json2: RampValueJson) {\n\t\tif (json1.interpolation != json2.interpolation) {\n\t\t\treturn false;\n\t\t}\n\t\tif (json1.points.length != json2.points.length) {\n\t\t\treturn false;\n\t\t}\n\t\tlet index = 0;\n\t\tfor (const point1 of json1.points) {\n\t\t\tconst point2 = json2.points[index];\n\t\t\tif (!RampPoint.areEqualJSON(point1, point2)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\t\treturn true;\n\t}\n\tfromJSON(json: RampValueJson) {\n\t\tthis._interpolation = json.interpolation;\n\n\t\tconst newPointsCount = json.points.length;\n\t\tconst currentPointsCount = this._points.length;\n\t\tif (currentPointsCount > newPointsCount) {\n\t\t\tconst pointsCountToRemove = currentPointsCount - newPointsCount;\n\t\t\tconst spliceStart = currentPointsCount - pointsCountToRemove;\n\t\t\tthis._points.splice(spliceStart, pointsCountToRemove);\n\t\t}\n\n\t\tlet index = 0;\n\t\tfor (const json_point of json.points) {\n\t\t\tconst currentPoint = this._points[index];\n\t\t\tif (currentPoint) {\n\t\t\t\tcurrentPoint.fromJSON(json_point);\n\t\t\t} else {\n\t\t\t\tthis._points.push(RampPoint.fromJSON(json_point));\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\t}\n}\n","export type LiteralConstructMethod = (args: any[]) => string;\n\nexport class LiteralConstructsController {\n\tstatic if(args: any[]): string {\n\t\tconst condition = args[0];\n\t\tconst valTrue = args[1];\n\t\tconst valFalse = args[2];\n\t\t// return `(await (async function (condition){ console.log('condition:',condition);if( condition ){ return (${valTrue}) } else { return (${valFalse}) } })((${condition})))`;\n\n\t\t// return `(await (async function(){\n\t\t// \tconst condition = (${condition});\n\t\t// \tconsole.log('condition:',condition)\n\t\t// \tif(condition){\n\t\t// \t\treturn (${valTrue});\n\t\t// \t} else {\n\t\t// \t\treturn (${valFalse});\n\t\t// \t}\n\t\t// })())`;\n\n\t\treturn `((${condition}) ? (${valTrue}) : (${valFalse}))`;\n\t}\n}\n","import {BaseParamType} from '../../params/_Base';\nimport jsep from 'jsep';\nimport {isString} from '../../../core/Type';\nexport const VARIABLE_PREFIX = '$';\n\nexport abstract class BaseTraverser {\n\tprivate _errorMessage: string | undefined;\n\n\tconstructor(public param: BaseParamType) {}\n\n\tprotected clearError() {\n\t\tthis._errorMessage = undefined;\n\t}\n\tprotected setError(message: string) {\n\t\tthis._errorMessage = this._errorMessage || message;\n\t}\n\tprotected _set_error_from_error_bound = this._set_error_from_error.bind(this);\n\tprivate _set_error_from_error(error: Error | string) {\n\t\tif (isString(error)) {\n\t\t\tthis._errorMessage = error;\n\t\t} else {\n\t\t\tthis._errorMessage = error.message;\n\t\t}\n\t}\n\tisErrored(): boolean {\n\t\treturn this._errorMessage != null;\n\t}\n\terrorMessage() {\n\t\treturn this._errorMessage;\n\t}\n\treset() {\n\t\tthis._errorMessage = undefined;\n\t}\n\n\ttraverse_node(node: jsep.Expression): string | undefined {\n\t\tconst method_name = `traverse_${node.type}`;\n\t\tconst method = (this as any)[method_name];\n\t\tif (method) {\n\t\t\treturn (this as any)[method_name](node);\n\t\t} else {\n\t\t\tthis.setError(`expression unknown node type: ${node.type}`);\n\t\t}\n\t}\n\n\tprotected traverse_BinaryExpression(node: jsep.BinaryExpression): string {\n\t\treturn `${this.traverse_node(node.left)} ${node.operator} ${this.traverse_node(node.right)}`;\n\t}\n\t// protected traverse_LogicalExpression(node: jsep.LogicalExpression): string {\n\t// \t// || or &&\n\t// \treturn `${this.traverse_node(node.left)} ${node.operator} ${this.traverse_node(node.right)}`;\n\t// }\n\tprotected traverse_MemberExpression(node: jsep.MemberExpression): string {\n\t\treturn `${this.traverse_node(node.object)}.${this.traverse_node(node.property)}`;\n\t}\n\tprotected traverse_ConditionalExpression(node: jsep.ConditionalExpression): string {\n\t\treturn `(${this.traverse_node(node.test)}) ? (${this.traverse_node(node.consequent)}) : (${this.traverse_node(\n\t\t\tnode.alternate\n\t\t)})`;\n\t}\n\n\t// currently only used for string expressions such as\n\t// pt_`@ptnum+1`\n\tprotected traverse_Compound(node: jsep.Compound): string {\n\t\tconst args = node.body;\n\t\tlet traversed_args = [];\n\t\tfor (let i = 0; i < args.length; i++) {\n\t\t\tconst arg_node = args[i];\n\t\t\tif (arg_node.type == 'Identifier') {\n\t\t\t\tif ((arg_node as jsep.Identifier).name[0] == VARIABLE_PREFIX) {\n\t\t\t\t\ttraversed_args.push('`${' + this.traverse_node(arg_node) + '}`');\n\t\t\t\t} else {\n\t\t\t\t\ttraversed_args.push(`'${(arg_node as jsep.Identifier).name}'`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttraversed_args.push('`${' + this.traverse_node(arg_node) + '}`');\n\t\t\t}\n\t\t}\n\t\treturn traversed_args.join(' + ');\n\t}\n\n\tprotected traverse_Literal(node: jsep.Literal): string {\n\t\treturn `${node.raw}`; // 5 or 'string' (raw will include quotes)\n\t}\n\n\tprotected abstract traverse_Identifier(node: jsep.Identifier): string | undefined;\n\tprotected abstract traverse_CallExpression(node: jsep.CallExpression): string | undefined;\n\tprotected abstract traverse_UnaryExpression(node: jsep.UnaryExpression): string;\n}\n","// export const VAR_ARE_ENTITY_CORE_POINT = `areEntitiesCorePoint`;\nexport const VAR_OBJECT = `geometry`;\nexport const VAR_ENTITY = `entity`;\nexport const VAR_ENTITIES = `entities`;\nexport const CLASS_CORE_POINT = `corePointClassFactory(${VAR_OBJECT})`;\nexport const CLASS_THREEJS_POINT = 'ThreejsPoint';\nexport const FUNC_GET_ENTITIES_ATTRIBUTE = 'getEntitiesAttribute';\nexport const FUNC_GET_ENTITY_ATTRIBUTE_VALUE = 'getEntityAttributeValue';\nexport const FUNC_GET_ENTITY_ATTRIBUTE_VALUE_FUNC = 'getEntityAttributeValueFunc';\n","import {VAR_OBJECT, VAR_ENTITIES, CLASS_CORE_POINT, CLASS_THREEJS_POINT, FUNC_GET_ENTITIES_ATTRIBUTE} from './Common';\n\nexport class AttributeRequirementsController {\n\tprivate _attributeNames: Set<string> | undefined;\n\tconstructor() {}\n\n\treset() {\n\t\tif (this._attributeNames) {\n\t\t\tthis._attributeNames.clear();\n\t\t}\n\t}\n\tassignAttributesLines(): string {\n\t\tif (this._attributeNames) {\n\t\t\tconst lines: string[] = [];\n\t\t\tfor (const attribName of this._attributeNames) {\n\t\t\t\tlines.push(AttributeRequirementsController.assignAttributeLine(attribName));\n\t\t\t}\n\t\t\treturn lines.join(';\\n');\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\t}\n\tassignArraysLines(): string {\n\t\tif (this._attributeNames) {\n\t\t\tconst lines: string[] = [];\n\t\t\tif (this._attributeNames.size > 0) {\n\t\t\t\tconst objectLine = `const ${VAR_OBJECT} = entities[0].object()`;\n\t\t\t\tlines.push(objectLine);\n\t\t\t}\n\t\t\tfor (const attribName of this._attributeNames) {\n\t\t\t\tlines.push(AttributeRequirementsController.assignItemSizeLine(attribName));\n\t\t\t\tlines.push(AttributeRequirementsController.assignArrayLine(attribName));\n\t\t\t}\n\t\t\treturn lines.join(';\\n');\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\t}\n\tattributePresenceCheckLine(): string {\n\t\tif (this._attributeNames) {\n\t\t\tconst varNames: string[] = [];\n\t\t\tfor (const attribName of this._attributeNames) {\n\t\t\t\tconst varName = AttributeRequirementsController._varAttribute(attribName);\n\t\t\t\tvarNames.push(varName);\n\t\t\t}\n\t\t\tif (varNames.length > 0) {\n\t\t\t\treturn varNames.join(' && ');\n\t\t\t}\n\t\t}\n\t\t// TODO: add test that a Point Sop can take an expression that does not require attributes\n\t\treturn 'true';\n\t}\n\tmissingAttributesLine(): string {\n\t\tif (this._attributeNames) {\n\t\t\tlet lineElements: string[] = ['(()=>{', 'const missingAttributes = [];'];\n\t\t\tfor (const attribName of this._attributeNames) {\n\t\t\t\tconst varName = AttributeRequirementsController._varAttribute(attribName);\n\t\t\t\tlineElements.push(`if( !${varName} ) {\tmissingAttributes.push('${attribName}'); }`);\n\t\t\t}\n\n\t\t\tlineElements.push('return missingAttributes;', '})');\n\t\t\treturn lineElements.join('');\n\t\t}\n\t\treturn '[]';\n\t}\n\n\tadd(attribName: string) {\n\t\tthis._attributeNames = this._attributeNames || new Set<string>();\n\t\tthis._attributeNames.add(attribName);\n\t}\n\n\tstatic assignAttributeLine(attribName: string) {\n\t\tconst varAttribute = this._varAttribute(attribName);\n\t\treturn `const ${varAttribute} = ${FUNC_GET_ENTITIES_ATTRIBUTE}(${VAR_ENTITIES},'${attribName}')`;\n\t}\n\tprivate static assignItemSizeLine(attribName: string) {\n\t\tconst varAttribute = this._varAttribute(attribName);\n\t\tconst varAttributeSize = this._varAttribSize(attribName);\n\t\treturn `const ${varAttributeSize} = ${varAttribute}.itemSize`;\n\t}\n\tprivate static assignArrayLine(attribName: string) {\n\t\tconst varAttribute = this._varAttribute(attribName);\n\t\tconst varArray = this._varArray(attribName);\n\t\tconst isIndexedCondition = `(${VAR_ENTITIES}[0] && ${VAR_ENTITIES}[0] instanceof ${CLASS_THREEJS_POINT} && ${CLASS_CORE_POINT}.isAttribIndexed(${VAR_OBJECT}, '${attribName}'))`;\n\t\tconst indexedArray = `${VAR_ENTITIES}.map(e=>e.indexedAttribValue('${attribName}'))`;\n\t\tconst nonIndexedArray = `${varAttribute}.array`;\n\t\treturn `const ${varArray} = ${isIndexedCondition} ? ${indexedArray} : ${nonIndexedArray};`;\n\t}\n\n\tprivate static _varAttribute(attribName: string) {\n\t\treturn `attrib_${attribName}`;\n\t}\n\tprivate static _varAttribSize(attribName: string) {\n\t\treturn `attribSize_${attribName}`;\n\t}\n\tprivate static _varArray(attribName: string) {\n\t\treturn `array_${attribName}`;\n\t}\n\tvarAttributeSize(attribName: string) {\n\t\treturn AttributeRequirementsController._varAttribSize(attribName);\n\t}\n\tvarArray(attribName: string) {\n\t\treturn AttributeRequirementsController._varArray(attribName);\n\t}\n}\n","/**\n * The following expressions are available to use in most parameters:\n *\n * ## Variables\n *\n * - `$F`: current frame\n * - `$T`: current time\n * - `$OS`: current node name\n * - `$CH`: current param name\n * - `$CEX`: input centroid x component\n * - `$CEY`: input centroid y component\n * - `$CEZ`: input centroid z component\n *\n * Those variables are aliases to the javascript math module:\n *\n * - `$E`\n * - `$LN2`\n * - `$LN10`\n * - `$LOG10E`\n * - `$LOG2E`\n * - `$PI`\n * - `$SQRT1_2`\n * - `$SQRT2`\n *\n * In some parameters which can evaluate per entity (which means per point or per object),\n * it is also possible to use variables to access attributes:\n *\n * - `@ptnum` will evaluate to the current point index\n * - `@vtxnum` will evaluate to the current vertex index\n * - `@primnum` will evaluate to the current primitive index\n * - `@objnum` will evaluate to the current object index\n * - And you can also refer to any existing attribute, **using @ following by the attribute name**.\n *\n * For instance:\n *\n * - `@P.x` evaluates to the **x** component of the position.\n * - `@P.y` evaluates to the **y** component of the position.\n * - `@P.z` evaluates to the **z** component of the position.\n * - `@N.x` evaluates to the **x** component of the normal.\n * - `@N.y` evaluates to the **y** component of the normal.\n * - `@N.z` evaluates to the **z** component of the normal.\n * - `@Cd.x` evaluates to the **x** component of the color.\n * - `@Cd.y` evaluates to the **y** component of the color.\n * - `@Cd.z` evaluates to the **z** component of the color.\n * - `@uv.x` evaluates to the **x** component of the uv.\n * - `@uv.y` evaluates to the **y** component of the uv.\n *\n * Using the attribCreate, point or normal SOPs, you can mix and match them.\n * For instance, if in the point SOP, you set to the x component `@uv.x` and y component `@uv.y`\n * then the points will be transformed to look like in UV space.\n *\n * Another common setup is to use an attribute create to add an attribute `id`, with `@ptnum`.\n * This way, every point will have a unique id.\n * You can then use this id in the following nodes, or even in a material.\n *\n * Instead of having an attribute id that goes from 0 to the number of points in your geometry,\n * you can also create one that goes from 0 to 1, using `@ptnum / (pointsCount(0)-1)`\n *\n *\n * ## Math expressions\n *\n * The following are native javascript functions:\n *\n * - abs\n * - acos\n * - acosh\n * - asin\n * - asinh\n * - atan\n * - atan2\n * - atanh\n * - ceil\n * - cos\n * - cosh\n * - exp\n * - expm1\n * - floor\n * - log\n * - log1p\n * - log2\n * - log10\n * - max\n * - min\n * - pow\n * - random (which aliases to Math.rand())\n * - round\n * - sign\n * - sin\n * - sinh\n * - sqrt\n * - tan\n * - tanh\n *\n * If you are targetting ES6 (available in modern browsers), you can also have:\n *\n * - cbrt\n * - hypot\n * - log10\n * - trunc\n *\n * The following are aliases from the [Polygonjs CoreMath](https://github.com/polygonjs/polygonjs-engine/blob/master/src/core/math/_Module.ts) module:\n *\n * - clamp\n * - degToRad\n * - fit\n * - fit01\n * - fitClamp\n * - fract\n * - mix\n * - radToDeg\n * - rand\n *\n * And the following are alias to the [Polygonjs Easing](https://github.com/polygonjs/polygonjs-engine/blob/master/src/core/math/Easing.ts) module:\n *\n * - `easeI2( number )`, is a shortcut for `ease_i( number, 2 )`\n * - `easeO2( number )`, is a shortcut for `ease_o( number, 2 )`\n * - `easeIO2( number )`, is a shortcut for `ease_io( number, 2 )`\n * - `easeI3( number )`, is a shortcut for `ease_i( number, 3 )`\n * - `easeO3( number )`, is a shortcut for `ease_o( number, 3 )`\n * - `easeIO3( number )`, is a shortcut for `ease_io( number, 3 )`\n * - `easeI4( number )`, is a shortcut for `ease_i( number, 4 )`\n * - `easeO4( number )`, is a shortcut for `ease_o( number, 4 )`\n * - `easeIO4( number )`, is a shortcut for `ease_io( number, 4 )`\n * - `easeSinI( number )`\n * - `easeSinO( number )`\n * - `easeSinIO( number )`\n * - `easeElasticI( number )`\n * - `easeElasticO( number )`\n * - `easeElasticIO( number )`\n *\n *\n * ## String expressions:\n *\n * - precision (alias to the [CoreString](https://github.com/polygonjs/polygonjs-engine/blob/master/src/core/String.ts) module precision method)\n * - [strCharsCount](/docs/expressions/strCharsCount)\n * - [strConcat](/docs/expressions/strConcat)\n * - [strIndex](/docs/expressions/strIndex)\n * - [strSub](/docs/expressions/strSub)\n *\n *  */\n\nimport {Vector4} from 'three';\nimport {BaseParamType} from '../../params/_Base';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {ParsedTree} from './ParsedTree';\nimport {LiteralConstructsController, LiteralConstructMethod} from '../LiteralConstructsController';\nimport {BaseMethod} from '../methods/_Base';\nimport {Attribute, CoreAttribute} from '../../../core/geometry/Attribute';\nimport {BaseTraverser} from './_Base';\nimport {MethodDependency} from '../MethodDependency';\nimport {\n\tVAR_ENTITY,\n\tVAR_ENTITIES,\n\tFUNC_GET_ENTITIES_ATTRIBUTE,\n\tFUNC_GET_ENTITY_ATTRIBUTE_VALUE,\n\tFUNC_GET_ENTITY_ATTRIBUTE_VALUE_FUNC,\n} from '../Common';\nimport {AttributeRequirementsController} from '../AttributeRequirementsController';\nimport {CoreMath} from '../../../core/math/_Module';\nimport {CoreString} from '../../../core/String';\nimport {Poly} from '../../Poly';\nimport {CoreType, isString, isArray, isVector, isColor} from '../../../core/Type';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {ThreejsPoint} from '../../../core/geometry/modules/three/ThreejsPoint';\nimport {corePointClassFactory} from '../../../core/geometry/CoreObjectFactory';\nimport {CoreEntity} from '../../../core/geometry/CoreEntity';\nimport jsep from 'jsep';\nimport {VARIABLE_PREFIX} from './_Base';\nconst QUOTE = \"'\";\nconst ARGUMENTS_SEPARATOR = ', ';\nconst ATTRIBUTE_PREFIX = '@';\n\n// import {Vector3} from 'three'\ntype LiteralConstructDictionary = PolyDictionary<LiteralConstructMethod>;\ntype AnyDictionary = PolyDictionary<any>;\n\nconst NATIVE_MATH_METHODS = [\n\t'abs',\n\t'acos',\n\t'acosh',\n\t'asin',\n\t'asinh',\n\t'atan',\n\t'atan2',\n\t'atanh',\n\t'ceil',\n\t'cos',\n\t'cosh',\n\t'exp',\n\t'expm1',\n\t'floor',\n\t'log',\n\t'log1p',\n\t'log2',\n\t'log10',\n\t'max',\n\t'min',\n\t'pow',\n\t'round',\n\t'sign',\n\t'sin',\n\t'sinh',\n\t'sqrt',\n\t'tan',\n\t'tanh',\n];\nconst NATIVE_ES6_MATH_METHODS = ['cbrt', 'hypot', 'log10', 'trunc'];\nconst NATIVE_MATH_METHODS_RENAMED: AnyDictionary = {\n\tmath_random: 'random',\n};\nconst CORE_MATH_METHODS = ['fit', 'fit01', 'fract', 'deg2rad', 'rad2deg', 'rand', 'clamp'];\nimport {Easing} from '../../../core/math/Easing';\nconst EASING_METHODS = Object.keys(Easing);\n\nconst CORE_STRING_METHODS = ['precision'];\nconst NATIVE_MATH_CONSTANTS = ['E', 'LN2', 'LN10', 'LOG10E', 'LOG2E', 'PI', 'SQRT1_2', 'SQRT2'];\n\nconst DIRECT_EXPRESSION_FUNCTIONS: AnyDictionary = {};\nNATIVE_MATH_METHODS.forEach((name) => {\n\tDIRECT_EXPRESSION_FUNCTIONS[name] = `Math.${name}`;\n});\nNATIVE_ES6_MATH_METHODS.forEach((name) => {\n\tDIRECT_EXPRESSION_FUNCTIONS[name] = `Math.${name}`;\n});\nObject.keys(NATIVE_MATH_METHODS_RENAMED).forEach((name) => {\n\tconst remaped = NATIVE_MATH_METHODS_RENAMED[name];\n\tDIRECT_EXPRESSION_FUNCTIONS[name] = `Math.${remaped}`;\n});\nCORE_MATH_METHODS.forEach((name) => {\n\tDIRECT_EXPRESSION_FUNCTIONS[name] = `Core.Math.${name}`;\n});\nEASING_METHODS.forEach((name) => {\n\tDIRECT_EXPRESSION_FUNCTIONS[name] = `Core.Math.Easing.${name}`;\n});\nCORE_STRING_METHODS.forEach((name) => {\n\tDIRECT_EXPRESSION_FUNCTIONS[name] = `Core.String.${name}`;\n});\n\nconst LITERAL_CONSTRUCT: LiteralConstructDictionary = {\n\tif: LiteralConstructsController.if,\n};\n\nconst GLOBAL_CONSTANTS: PolyDictionary<string> = {};\nNATIVE_MATH_CONSTANTS.forEach((name) => {\n\tGLOBAL_CONSTANTS[name] = `Math.${name}`;\n});\n\nconst PROPERTY_OFFSETS: AnyDictionary = {\n\tx: 0,\n\ty: 1,\n\tz: 2,\n\tw: 3,\n\tr: 0,\n\tg: 1,\n\tb: 2,\n};\n\ntype MethodArgumentFunction = () => string | number;\nconst Core = {\n\tMath: CoreMath,\n\tString: CoreString,\n};\n\nfunction getEntitiesAttributes(entities: CoreEntity[], attribName: string) {\n\tconst firstEntity = entities[0];\n\tif (firstEntity && firstEntity instanceof ThreejsPoint) {\n\t\treturn firstEntity.attribute(attribName);\n\t} else {\n\t\treturn entities.map((e) => e.attribValue(attribName, new Vector4()));\n\t}\n}\ntype PropertyOffset = 0 | 1 | 2 | 3;\ntype VectorProperty = 'x' | 'y' | 'z' | 'w';\ntype ColorProperty = 'r' | 'g' | 'b';\nfunction getCorePointAttribValue(\n\tentity: ThreejsPoint,\n\tattribName: string,\n\tarray: number[],\n\tattributeSize: number,\n\tpropertyOffset: PropertyOffset\n) {\n\treturn array[entity.index() * attributeSize + propertyOffset];\n}\nconst VECTOR_PROPERTY_NAME_BY_OFFSET: Record<PropertyOffset, VectorProperty> = {\n\t0: 'x',\n\t1: 'y',\n\t2: 'z',\n\t3: 'w',\n};\nconst COLOR_PROPERTY_NAME_BY_OFFSET: Record<PropertyOffset, ColorProperty> = {\n\t0: 'r',\n\t1: 'g',\n\t2: 'b',\n\t3: 'r',\n};\nconst _target = new Vector4();\nfunction getCoreEntityAttribValue(\n\tentity: CoreEntity,\n\tattribName: string,\n\tarray: number[],\n\tattributeSize: number,\n\tpropertyOffset: PropertyOffset\n) {\n\tconst value = entity.attribValue(attribName, _target);\n\tif (isArray(value)) {\n\t\treturn value[propertyOffset];\n\t}\n\tif (isVector(value)) {\n\t\treturn (value as Vector4)[VECTOR_PROPERTY_NAME_BY_OFFSET[propertyOffset]];\n\t}\n\tif (isColor(value)) {\n\t\treturn value[COLOR_PROPERTY_NAME_BY_OFFSET[propertyOffset]];\n\t}\n\treturn value;\n}\nfunction getCoreEntityAttribValueFunc(entity: CoreEntity) {\n\tif (entity instanceof ThreejsPoint) {\n\t\treturn getCorePointAttribValue;\n\t}\n\treturn getCoreEntityAttribValue;\n}\n\nconst FUNCTION_ARGS_DICT = {\n\tcorePointClassFactory,\n\tThreejsPoint,\n\tCore,\n\tCoreType,\n\t[FUNC_GET_ENTITIES_ATTRIBUTE]: getEntitiesAttributes,\n\t[FUNC_GET_ENTITY_ATTRIBUTE_VALUE_FUNC]: getCoreEntityAttribValueFunc,\n};\nconst FUNCTION_ARG_NAMES = Object.keys(FUNCTION_ARGS_DICT);\nconst FUNCTION_ARGS = FUNCTION_ARG_NAMES.map((argName) => (FUNCTION_ARGS_DICT as any)[argName]);\n\nexport class FunctionGenerator extends BaseTraverser {\n\tprivate _entitiesDependent: boolean = false;\n\tprivate function: Function | undefined;\n\tprivate _attribute_requirements_controller = new AttributeRequirementsController();\n\tprivate function_main_string: string | undefined;\n\tprivate methods: BaseMethod[] = [];\n\tprivate method_index: number = -1;\n\n\tpublic methodDependencies: MethodDependency[] = [];\n\tpublic immutableDependencies: CoreGraphNode[] = [];\n\t// public jsep_dependencies: JsepDependency[] = []\n\t// public jsep_nodes_by_missing_paths: JsepsByString = {}\n\n\t// private string_generator: ExpressionStringGenerator = new ExpressionStringGenerator()\n\n\tconstructor(public override param: BaseParamType) {\n\t\tsuper(param);\n\t}\n\n\tentitiesDependent() {\n\t\treturn this._entitiesDependent;\n\t}\n\n\tpublic parseTree(parsedTree: ParsedTree) {\n\t\tthis.reset();\n\n\t\tif (!parsedTree.errorMessage()) {\n\t\t\ttry {\n\t\t\t\t// this.function_pre_entities_loop_lines = [];\n\t\t\t\tthis._attribute_requirements_controller = new AttributeRequirementsController();\n\t\t\t\t// this.function_pre_body = ''\n\t\t\t\tconst node = parsedTree.node();\n\t\t\t\tif (node) {\n\t\t\t\t\tconst function_main_string = this.traverse_node(node);\n\t\t\t\t\tif (function_main_string && !this.isErrored()) {\n\t\t\t\t\t\tthis.function_main_string = function_main_string;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('no parsedTree.node');\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.warn(`error in expression for param ${this.param.path()}`);\n\t\t\t\tconsole.warn(e);\n\t\t\t}\n\n\t\t\tif (this.function_main_string) {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = this._functionBody();\n\t\t\t\t\tthis.function = new Function(\n\t\t\t\t\t\t...FUNCTION_ARG_NAMES,\n\t\t\t\t\t\t'param',\n\t\t\t\t\t\t'methods',\n\t\t\t\t\t\t'_set_error_from_error',\n\t\t\t\t\t\t`\n\t\t\t\t\ttry {\n\t\t\t\t\t\t${body}\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t_set_error_from_error(e)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}`\n\t\t\t\t\t);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn(e);\n\t\t\t\t\tthis.setError('cannot generate function');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.setError('cannot generate function body');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.setError('cannot parse expression');\n\t\t}\n\t}\n\n\toverride reset() {\n\t\tsuper.reset();\n\t\tthis.function_main_string = undefined;\n\t\tthis.methods = [];\n\t\tthis.method_index = -1;\n\t\tthis.function = undefined;\n\t\tthis._entitiesDependent = false;\n\t\tthis.methodDependencies = [];\n\t\tthis.immutableDependencies = [];\n\t}\n\n\tprivate _functionBody() {\n\t\t// const entitiesDependent = this.param.options.isExpressionForEntities()\n\t\tconst entitiesDependent = this._entitiesDependent;\n\t\tif (entitiesDependent) {\n\t\t\treturn `\n\t\t\tconst ${VAR_ENTITIES} = param.expressionController.entities();\n\t\t\t\n\t\t\tif(${VAR_ENTITIES} && ${VAR_ENTITIES}.length > 0){\n\t\t\t\treturn new Promise( async (resolve, reject)=>{\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst entityCallback = param.expressionController.entityCallback();\n\t\t\t\t\t\t// assign_attributes_lines\n\t\t\t\t\t\t${this._attribute_requirements_controller.assignAttributesLines()}\n\t\t\t\t\t\t// check if attributes are present\n\t\t\t\t\t\tif( ${this._attribute_requirements_controller.attributePresenceCheckLine()} ){\n\t\t\t\t\t\t\t// assign function\n\t\t\t\t\t\t\tconst ${FUNC_GET_ENTITY_ATTRIBUTE_VALUE} = ${FUNC_GET_ENTITY_ATTRIBUTE_VALUE_FUNC}(entities[0]);\n\t\t\t\t\t\t\t// assign_arrays_lines\n\t\t\t\t\t\t\t${this._attribute_requirements_controller.assignArraysLines()}\n\t\t\t\t\t\t\tfor(const ${VAR_ENTITY} of ${VAR_ENTITIES}){\n\t\t\t\t\t\t\t\tresult = ${this.function_main_string};\n\t\t\t\t\t\t\t\tentityCallback(${VAR_ENTITY}, result);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst missingAttributes = ${this._attribute_requirements_controller.missingAttributesLine()}().join(', ');\n\t\t\t\t\t\t\tconst error = new Error('attribute ' + missingAttributes + ' not found')\n\t\t\t\t\t\t\t_set_error_from_error(error)\n\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t}\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t_set_error_from_error(e)\n\t\t\t\t\t\treject(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn []`;\n\t\t} else {\n\t\t\treturn `\n\t\t\treturn new Promise( async (resolve, reject)=>{\n\t\t\t\ttry {\n\t\t\t\t\tconst value = ${this.function_main_string}\n\t\t\t\t\tresolve(value)\n\t\t\t\t} catch(e) {\n\t\t\t\t\t_set_error_from_error(e)\n\t\t\t\t\treject()\n\t\t\t\t}\n\t\t\t})\n\t\t\t`;\n\t\t}\n\t}\n\n\tevalAllowed(): boolean {\n\t\treturn this.function != null;\n\t}\n\tevalFunction() {\n\t\tif (this.function) {\n\t\t\tthis.clearError();\n\n\t\t\tconst result = this.function(...FUNCTION_ARGS, this.param, this.methods, this._set_error_from_error_bound);\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t//\n\t//\n\t// TRAVERSE METHODS\n\t//\n\t//\n\tprotected traverse_CallExpression(node: jsep.CallExpression): string | undefined {\n\t\tconst methodArguments = node.arguments.map((arg) => {\n\t\t\treturn this.traverse_node(arg);\n\t\t});\n\t\tconst callee = node.callee as jsep.Identifier;\n\t\tconst method_name = callee.name;\n\t\tif (method_name) {\n\t\t\t// literal construct (if...)\n\t\t\tconst literal_contruct = LITERAL_CONSTRUCT[method_name];\n\t\t\tif (literal_contruct) {\n\t\t\t\treturn literal_contruct(methodArguments);\n\t\t\t}\n\n\t\t\t// direct expressions (Math.floor, Math.sin...)\n\t\t\tconst arguments_joined = `${methodArguments.join(ARGUMENTS_SEPARATOR)}`;\n\t\t\tconst direct_function_name = DIRECT_EXPRESSION_FUNCTIONS[method_name];\n\t\t\tif (direct_function_name) {\n\t\t\t\treturn `${direct_function_name}(${arguments_joined})`;\n\t\t\t}\n\n\t\t\t// indirect methods (pointsCount, asset...)\n\t\t\tconst expressionRegister = Poly.expressionsRegister;\n\t\t\tconst indirect_method = expressionRegister.getMethod(method_name);\n\t\t\tif (indirect_method) {\n\t\t\t\tconst pathNode = node.arguments[0];\n\t\t\t\t// const path_argument = this.string_generator.traverse_node(path_node)\n\t\t\t\tconst functionString = `return ${methodArguments[0]}`;\n\t\t\t\tlet pathArgumentFunction: MethodArgumentFunction | undefined;\n\t\t\t\tlet pathArgument: string | number | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tpathArgumentFunction = new Function(functionString) as MethodArgumentFunction;\n\t\t\t\t\tpathArgument = pathArgumentFunction();\n\t\t\t\t} catch {\n\t\t\t\t\t// path_argument_function = new AsyncFunction(function_string)\n\t\t\t\t\t// it looks like if the input contains an await,\n\t\t\t\t\t// it is because it has been generated by another indirect function.\n\t\t\t\t\t// This means that the dependencies have been generated already\n\t\t\t\t\t// so we may not need to do it now\n\t\t\t\t}\n\t\t\t\tthis._createMethodAndDependencies(method_name, pathArgument, pathNode);\n\n\t\t\t\treturn `(await methods[${this.method_index}].processArguments([${arguments_joined}]))`;\n\t\t\t} else {\n\t\t\t\tconst available_methods = expressionRegister.availableMethods().join(', ');\n\t\t\t\tconst message = `method not found (${method_name}), available methods are: ${available_methods}`;\n\t\t\t\tPoly.warn(message);\n\t\t\t}\n\t\t}\n\n\t\tthis.setError(`unknown method: ${method_name}`);\n\t}\n\tprotected override traverse_BinaryExpression(node: jsep.BinaryExpression): string {\n\t\t// if(node.right.type == 'Identifier'){\n\t\t// \tthis.set_error(`cannot have identifier after ${node.operator}`)\n\t\t// \treturn \"\"\n\t\t// }\n\t\treturn `(${this.traverse_node(node.left)} ${node.operator} ${this.traverse_node(node.right)})`;\n\t}\n\t// protected override traverse_LogicalExpression(node: jsep.LogicalExpression): string {\n\t// \t// || or &&\n\t// \t// if(node.right.type == 'Identifier'){\n\t// \t// \tthis.set_error(`cannot have identifier after ${node.operator}`)\n\t// \t// \treturn \"\"\n\t// \t// }\n\t// \treturn `(${this.traverse_node(node.left)} ${node.operator} ${this.traverse_node(node.right)})`;\n\t// }\n\t// protected override traverse_MemberExpression(node: jsep.MemberExpression): string {\n\t// \treturn `${this.traverse_node(node.object)}.${this.traverse_node(node.property)}`;\n\t// }\n\tprotected traverse_UnaryExpression(node: jsep.UnaryExpression): string {\n\t\tif (node.operator === ATTRIBUTE_PREFIX) {\n\t\t\tthis._entitiesDependent = true;\n\t\t\tlet argument = node.argument;\n\t\t\tlet attributeName: string | undefined;\n\t\t\tlet property;\n\t\t\tswitch (argument.type) {\n\t\t\t\tcase 'Identifier': {\n\t\t\t\t\tconst argument_identifier = (<unknown>argument) as jsep.Identifier;\n\t\t\t\t\tattributeName = argument_identifier.name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'MemberExpression': {\n\t\t\t\t\tconst argument_member_expression = (<unknown>argument) as jsep.MemberExpression;\n\t\t\t\t\tconst attrib_node = argument_member_expression.object as jsep.Identifier;\n\t\t\t\t\tconst property_node = argument_member_expression.property as jsep.Identifier;\n\t\t\t\t\tattributeName = attrib_node.name;\n\t\t\t\t\tproperty = property_node.name;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// this.function_pre_body += `\n\t\t\t// param.entity_attrib_value(${QUOTE}${attrib_node.name}${QUOTE}, param.entity_attrib_values.position);\n\t\t\t// `\n\t\t\tif (attributeName) {\n\t\t\t\tattributeName = CoreAttribute.remapName(attributeName);\n\t\t\t\tif (attributeName == Attribute.POINT_INDEX || attributeName == Attribute.OBJECT_INDEX) {\n\t\t\t\t\treturn `((${VAR_ENTITY} != null) ? ${VAR_ENTITY}.index() : 0)`;\n\t\t\t\t} else {\n\t\t\t\t\tconst var_attribute_size = this._attribute_requirements_controller.varAttributeSize(attributeName);\n\t\t\t\t\tconst var_array = this._attribute_requirements_controller.varArray(attributeName);\n\t\t\t\t\tthis._attribute_requirements_controller.add(attributeName);\n\t\t\t\t\tlet propertyOffset = property ? PROPERTY_OFFSETS[property] : 0;\n\t\t\t\t\tif (propertyOffset == null) {\n\t\t\t\t\t\tpropertyOffset = 0;\n\t\t\t\t\t}\n\t\t\t\t\t// if (property) {\n\t\t\t\t\t// \tconst property_offset = PROPERTY_OFFSETS[property];\n\t\t\t\t\t// \treturn `${var_array}[entity.index()*${var_attribute_size}+${property_offset}]`;\n\t\t\t\t\t// } else {\n\t\t\t\t\t// \treturn `${var_array}[entity.index()*${var_attribute_size}]`;\n\t\t\t\t\t// }\n\t\t\t\t\treturn `${FUNC_GET_ENTITY_ATTRIBUTE_VALUE}(${VAR_ENTITY}, '${attributeName}', ${var_array}, ${var_attribute_size}, ${propertyOffset})`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.warn('attribute not found');\n\t\t\t\treturn '';\n\t\t\t}\n\t\t} else {\n\t\t\treturn `${node.operator}${this.traverse_node(node.argument)}`; // -5\n\t\t}\n\t}\n\n\t// protected override traverse_Literal(node: jsep.Literal): string {\n\t// \treturn `${node.raw}`; // 5 or 'string' (raw will include quotes)\n\t// }\n\n\tprotected traverse_Identifier(node: jsep.Identifier): string | undefined {\n\t\tconst identifier_first_char = node.name[0];\n\t\tif (identifier_first_char == VARIABLE_PREFIX) {\n\t\t\tconst identifier_name_without_dollar_sign = node.name.substring(1);\n\n\t\t\t// globals constants: Math.PI or Math.E\n\t\t\tconst direct_constant_name = GLOBAL_CONSTANTS[identifier_name_without_dollar_sign];\n\t\t\tif (direct_constant_name) {\n\t\t\t\treturn direct_constant_name;\n\t\t\t}\n\n\t\t\t// scene or node globals: $F, $T, $OS, $CH, $OS\n\t\t\tconst method_name = `traverse_Identifier_${identifier_name_without_dollar_sign}`;\n\t\t\tconst method = (this as any)[method_name];\n\t\t\tif (method) {\n\t\t\t\treturn (this as any)[method_name]();\n\t\t\t} else {\n\t\t\t\tthis.setError(`identifier unknown: ${node.name}`);\n\t\t\t}\n\t\t} else {\n\t\t\treturn node.name; // @ptnum will call this method and return \"ptnum\"\n\t\t}\n\t}\n\n\t//\n\t//\n\t// Identifier methods (called from Identifier_body)\n\t//\n\t//\n\tprotected traverse_Identifier_F(): string {\n\t\tthis.immutableDependencies.push(this.param.scene().timeController.graphNode);\n\t\treturn `param.scene().timeController.frame()`;\n\t}\n\t// protected traverse_Identifier_FPS(): string {\n\t// \tthis.immutable_dependencies.push(this.param.scene().timeController.graphNode);\n\t// \treturn `param.scene().timeController.fps`;\n\t// }\n\tprotected traverse_Identifier_T(): string {\n\t\tthis.immutableDependencies.push(this.param.scene().timeController.graphNode);\n\t\treturn `param.scene().timeController.time()`;\n\t}\n\tprotected traverse_Identifier_OS(): string {\n\t\tconst nameNode = this.param.node.nameController.graphNode();\n\t\tthis.param.addGraphInput(nameNode);\n\n\t\treturn `param.node.name()`;\n\n\t\t// return `${QUOTE}${this.param.node.name()}${QUOTE}`;\n\t}\n\tprotected traverse_Identifier_CH(): string {\n\t\treturn `${QUOTE}${this.param.name()}${QUOTE}`;\n\t}\n\tprotected traverse_Identifier_CEX(): string {\n\t\treturn this._method_centroid('x');\n\t}\n\tprotected traverse_Identifier_CEY(): string {\n\t\treturn this._method_centroid('y');\n\t}\n\tprotected traverse_Identifier_CEZ(): string {\n\t\treturn this._method_centroid('z');\n\t}\n\t// TODO:\n\t// '$OS': '_eval_identifier_as_node_name',\n\t// '$BBX': '_eval_identifier_as_bounding_box_relative',\n\n\tprivate _method_centroid(component: string): string {\n\t\tconst method_arguments = [0, `${QUOTE}${component}${QUOTE}`];\n\t\tconst arguments_joined = method_arguments.join(ARGUMENTS_SEPARATOR);\n\t\tthis._createMethodAndDependencies('centroid', 0);\n\t\treturn `(await methods[${this.method_index}].processArguments([${arguments_joined}]))`;\n\t}\n\n\t//\n\t//\n\t// Methods dependencies\n\t//\n\t//\n\tprivate _createMethodAndDependencies(\n\t\tmethodName: string,\n\t\tpathArgument: number | string | undefined,\n\t\tpathNode?: jsep.Expression\n\t) {\n\t\tconst expressionRegister = Poly.expressionsRegister;\n\t\tconst methodConstructor = expressionRegister.getMethod(methodName);\n\t\tif (!methodConstructor) {\n\t\t\tconst availableMethods = expressionRegister.availableMethods();\n\t\t\tconst message = `method not found (${methodName}), available methods are: ${availableMethods.join(', ')}`;\n\t\t\tthis.setError(message);\n\t\t\tPoly.warn(message);\n\t\t\treturn;\n\t\t}\n\t\tconst method = new methodConstructor(this.param) as BaseMethod;\n\t\tthis.method_index += 1;\n\t\tthis.methods[this.method_index] = method;\n\n\t\tconst methodDependency = method.findDependency({indexOrPath: pathArgument});\n\t\tif (methodDependency) {\n\t\t\tif (pathNode) {\n\t\t\t\tmethodDependency.set_jsep_node(pathNode);\n\t\t\t}\n\t\t\tthis.methodDependencies.push(methodDependency);\n\t\t} else {\n\t\t\tif (pathNode && isString(pathArgument)) {\n\t\t\t\tthis.param.scene().missingExpressionReferencesController.register(this.param, pathArgument, pathNode);\n\t\t\t}\n\t\t}\n\t\t// method_dependencies.resolved_graph_nodes.forEach((graph_node)=>{\n\t\t// \tif(path_node){\n\t\t// \t\tconst jsep_dependency = new JsepDependency(graph_node, path_node)\n\t\t// \t\tthis.jsep_dependencies.push(jsep_dependency)\n\t\t// \t} else {\n\t\t// \t\tthis.immutable_dependencies.push(graph_node)\n\t\t// \t}\n\n\t\t// })\n\n\t\t// if(path_node){\n\t\t// \treference_search_result.missing_paths.forEach((path)=>{\n\t\t// \t\tthis.jsep_nodes_by_missing_paths[path] = this.jsep_nodes_by_missing_paths[path] || []\n\t\t// \t\tthis.jsep_nodes_by_missing_paths[path].push(path_node)\n\t\t// \t})\n\t\t// }\n\t}\n}\n","import {BaseParamType} from '../../params/_Base';\nimport {ParsedTree} from './ParsedTree';\nimport jsep from 'jsep';\n\nconst ARGUMENTS_SEPARATOR = ', ';\n\nimport {BaseTraverser} from './_Base';\n\nexport class ExpressionStringGenerator extends BaseTraverser {\n\tconstructor(public override param: BaseParamType) {\n\t\tsuper(param);\n\t}\n\n\tparseTree(parsedTree: ParsedTree) {\n\t\tconst node = parsedTree.node();\n\t\tif (parsedTree.errorMessage() == null && node) {\n\t\t\ttry {\n\t\t\t\treturn this.traverse_node(node);\n\t\t\t} catch (e) {\n\t\t\t\tthis.setError('could not traverse tree');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.setError('cannot parse tree');\n\t\t}\n\t}\n\n\tprotected traverse_CallExpression(node: jsep.CallExpression): string {\n\t\tconst methodArguments = node.arguments.map((arg) => {\n\t\t\treturn this.traverse_node(arg);\n\t\t});\n\t\tconst argumentsJoined = `${methodArguments.join(ARGUMENTS_SEPARATOR)}`;\n\n\t\tconst methodName = (node.callee as jsep.Identifier).name;\n\t\treturn `${methodName}(${argumentsJoined})`;\n\t}\n\tprotected traverse_UnaryExpression(node: jsep.UnaryExpression): string {\n\t\treturn `${node.operator}${this.traverse_node(node.argument)}`; // -5\n\t}\n\n\tprotected traverse_Identifier(node: jsep.Identifier): string {\n\t\treturn `${node.name}`;\n\t}\n}\n","import {BaseParamType} from '../params/_Base';\nimport {FunctionGenerator} from './traversers/FunctionGenerator';\nimport {MethodDependency} from './MethodDependency';\nimport jsep from 'jsep';\n\nexport interface JsepsByString {\n\t[propName: string]: jsep.Expression[];\n}\n\nexport class DependenciesController {\n\tprivate _errorMessage: string | undefined;\n\tprivate _cyclicGraphDetected: boolean = false;\n\tprivate methodDependencies: MethodDependency[] = [];\n\n\tconstructor(public param: BaseParamType) {}\n\n\tprotected setError(message: string) {\n\t\tthis._errorMessage = this._errorMessage || message;\n\t}\n\n\terrorMessage() {\n\t\treturn this._errorMessage;\n\t}\n\n\treset() {\n\t\tthis.param.graphDisconnectPredecessors();\n\n\t\tthis.methodDependencies.forEach((methodDependency) => {\n\t\t\tmethodDependency.reset();\n\t\t});\n\t\tthis.methodDependencies = [];\n\n\t\t// this.jsep_nodes_by_missing_paths = {}\n\t\t// const ref_ids = Object.keys(this.missing_expression_references_by_id)\n\t\t// ref_ids.forEach(ref_id=>{\n\t\t// \tconst ref = this.missing_expression_references_by_id[ref_id]\n\t\t// \tthis.references_controller.unregister(ref)\n\t\t// })\n\t\t// this.missing_expression_references_by_id = {}\n\n\t\t// this.names_listeners.forEach(names_listener=>{names_listener.reset()})\n\t}\n\n\tupdate(functionGenerator: FunctionGenerator) {\n\t\t// const immutable_dependencies = function_generator.immutable_dependencies\n\t\t// const jsep_dependencies = function_generator.jsep_dependencies\n\t\t// const jsep_nodes_by_missing_paths = function_generator.jsep_nodes_by_missing_paths\n\n\t\t// if(jsep_dependencies.length > 0){\n\t\t// \tconsole.log(\"connect_param_to_dependencies\", this.param.path())\n\t\t// }\n\n\t\tthis._cyclicGraphDetected = false;\n\n\t\tthis._connectImmutableDependencies(functionGenerator);\n\t\tthis.methodDependencies = functionGenerator.methodDependencies;\n\t\tthis._handleMethodDependencies();\n\t\t// this.connect_missing_paths(function_generator)\n\n\t\tthis._listenForNameChanges();\n\t}\n\n\tprivate _connectImmutableDependencies(functionGenerator: FunctionGenerator) {\n\t\tconst dependendies = functionGenerator.immutableDependencies;\n\t\tfor (const dependency of dependendies) {\n\t\t\tif (this._cyclicGraphDetected == false) {\n\t\t\t\tif (this.param.addGraphInput(dependency) == false) {\n\t\t\t\t\tthis._cyclicGraphDetected = true;\n\t\t\t\t\tthis.setError('cannot create expression, infinite graph detected');\n\t\t\t\t\tthis.reset();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _handleMethodDependencies() {\n\t\tthis.methodDependencies.forEach((methodDependency) => {\n\t\t\tif (this._cyclicGraphDetected == false) {\n\t\t\t\tthis._handleMethodDependency(methodDependency);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _handleMethodDependency(method_dependency: MethodDependency) {\n\t\tconst node_simple = method_dependency.resolved_graph_node;\n\n\t\tif (node_simple) {\n\t\t\t// this should update the jsep_node, and run the expression to string parser\n\t\t\t// when a name in the referenced nodes is updated\n\t\t\t// const names_listener = new NamesListener(this.param, node_simple, jsep_node)\n\t\t\t// TODO: test that it is no longer active if expression is updated\n\n\t\t\tif (!this.param.addGraphInput(node_simple)) {\n\t\t\t\tthis._cyclicGraphDetected = true;\n\t\t\t\tthis.setError('cannot create expression, infinite graph detected');\n\t\t\t\tthis.reset();\n\t\t\t\treturn;\n\t\t\t}\n\t\t} // else {\n\t\t// const jsep_node = method_dependency.jsep_node\n\t\t//}\n\t}\n\n\tprivate _listenForNameChanges() {\n\t\tthis.methodDependencies.forEach((methodDependency) => {\n\t\t\tmethodDependency.listen_for_name_changes();\n\t\t});\n\t}\n\n\t// private connect_missing_paths(function_generator: FunctionGenerator){\n\n\t// \tconst jsep_nodes_by_missing_paths = function_generator.jsep_nodes_by_missing_paths\n\t// \tconst missing_paths = Object.keys(jsep_nodes_by_missing_paths)\n\n\t// \tmissing_paths.forEach((missing_path)=>{\n\t// \t\tconst fullPath = CoreWalker.make_absolute(this.param.node(), missing_path)\n\t// \t\tconst jsep_nodes = jsep_nodes_by_missing_paths[missing_path]\n\t// \t\tjsep_nodes.forEach(jsep_node=>{\n\t// \t\t\tconst missing_expression_reference = this.references_controller.register(this.param, jsep_node, fullPath)\n\n\t// \t\t\tthis.missing_expression_references_by_id[missing_expression_reference.id] = missing_expression_reference\n\t// \t\t})\n\t// \t})\n\n\t// }\n}\n","import {BaseParamType} from '../params/_Base';\nimport {ParsedTree} from './traversers/ParsedTree';\nimport {FunctionGenerator} from './traversers/FunctionGenerator';\nimport {ExpressionStringGenerator} from './traversers/ExpressionStringGenerator';\nimport {DependenciesController} from './DependenciesController';\nimport {Poly} from '../Poly';\n\nexport class ExpressionManager {\n\tprivate _parseStarted: boolean = false;\n\tprivate _functionGenerator: FunctionGenerator;\n\tprivate _expressionStringGenerator: ExpressionStringGenerator | undefined;\n\tpublic dependenciesController: DependenciesController;\n\tprivate parsedTree: ParsedTree = new ParsedTree(this.param);\n\n\tconstructor(\n\t\tpublic param: BaseParamType // public element_index: number=0\n\t) {\n\t\tthis._functionGenerator = new FunctionGenerator(this.param);\n\t\tthis.dependenciesController = new DependenciesController(this.param);\n\t}\n\tgeneratedFunctionEntitiesDependent() {\n\t\treturn this._functionGenerator.entitiesDependent();\n\t}\n\n\tparseExpression(expression: string) {\n\t\tif (this._parseStarted) {\n\t\t\tthrow new Error(`parse in progress for param ${this.param.path()}`);\n\t\t}\n\t\tthis._parseStarted = true;\n\t\tthis.parsedTree = this.parsedTree || new ParsedTree(this.param);\n\n\t\tthis.reset();\n\t\tif (this.param.expressionParsedAsString()) {\n\t\t\tthis.parsedTree.parseExpressionForStringParam(expression);\n\t\t} else {\n\t\t\tthis.parsedTree.parseExpression(expression);\n\t\t}\n\t\tthis._functionGenerator.parseTree(this.parsedTree);\n\n\t\tif (this._functionGenerator.errorMessage() == null) {\n\t\t\tthis.dependenciesController.update(this._functionGenerator);\n\t\t\tconst errorMessage = this.dependenciesController.errorMessage();\n\t\t\tif (errorMessage) {\n\t\t\t\tthis.param.states.error.set(errorMessage);\n\t\t\t} else {\n\t\t\t\tthis._parseStarted = false;\n\t\t\t}\n\t\t} //else {\n\t\t//this.set_error(this.function_generator.error_message);\n\t\t//}\n\t}\n\tasync computeFunction(): Promise<any> {\n\t\tif (this._computeAllowed()) {\n\t\t\ttry {\n\t\t\t\tconst newValue = await this._functionGenerator.evalFunction();\n\t\t\t\treturn newValue;\n\t\t\t} catch (e) {\n\t\t\t\tPoly.error('error while evaluating expression', e);\n\t\t\t}\n\t\t} else {\n\t\t\tPoly.error('compute not allowed');\n\t\t}\n\t}\n\n\treset() {\n\t\tthis._parseStarted = false;\n\t\tthis.dependenciesController.reset();\n\t\tthis._functionGenerator.reset();\n\t}\n\n\tisErrored(): boolean {\n\t\treturn this._functionGenerator.isErrored();\n\t}\n\terrorMessage() {\n\t\treturn this._functionGenerator.errorMessage();\n\t}\n\n\tprivate _computeAllowed(): boolean {\n\t\treturn this._functionGenerator.evalAllowed();\n\t}\n\n\tupdateFromMethodDependencyNameChange() {\n\t\tthis._expressionStringGenerator = this._expressionStringGenerator || new ExpressionStringGenerator(this.param);\n\n\t\tconst newExpressionString = this._expressionStringGenerator.parseTree(this.parsedTree);\n\n\t\tif (newExpressionString) {\n\t\t\tthis.param.set(newExpressionString);\n\t\t} else {\n\t\t\tconsole.warn('failed to regenerate expression');\n\t\t}\n\t}\n}\n","import {CoreGroup} from './../../../core/geometry/Group';\nimport {BaseParamType} from '../_Base';\nimport {ExpressionManager} from '../../expressions/ExpressionManager';\nimport type {CorePoint} from '../../../core/geometry/entities/point/CorePoint';\nimport type {CoreVertex} from '../../../core/geometry/entities/vertex/CoreVertex';\nimport type {CorePrimitive} from '../../../core/geometry/entities/primitive/CorePrimitive';\nimport {CoreEntity} from '../../../core/geometry/CoreEntity';\nimport {ParamType} from '../../poly/ParamType';\nimport {ParamValuesTypeMap} from '../types/ParamValuesTypeMap';\nimport {BaseCoreObject} from '../../../core/geometry/entities/object/BaseCoreObject';\nimport {MethodDependency} from '../../expressions/MethodDependency';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\nimport {CoreObjectType} from '../../../core/geometry/ObjectContent';\n\n// type ParamTypeElem = ParamType;\ntype EntityCallback<T extends ParamType> = (\n\tentity: CoreEntity,\n\tvalue: ParamValuesTypeMap[T] | any /*TODO: typescript: any is used here mostly to compile*/\n) => void;\ntype PointEntityCallback<T extends ParamType> = (\n\tentity: CorePoint<CoreObjectType>,\n\tvalue: ParamValuesTypeMap[T] | any /*TODO: typescript: any is used here mostly to compile*/\n) => void;\ntype ObjectEntityCallback<T extends ParamType> = (\n\tentity: BaseCoreObject<CoreObjectType>,\n\tvalue: ParamValuesTypeMap[T] | any /*TODO: typescript: any is used here mostly to compile*/\n) => void;\ntype CoreGroupEntityCallback<T extends ParamType> = (\n\tentity: CoreGroup,\n\tvalue: ParamValuesTypeMap[T] | any /*TODO: typescript: any is used here mostly to compile*/\n) => void;\n\nexport class ExpressionController<T extends ParamType> {\n\tprotected _expression: string | undefined;\n\tprotected _entities: CoreEntity[] | undefined;\n\tprotected _entityCallback: EntityCallback<T> | undefined;\n\tprotected _manager: ExpressionManager | undefined;\n\tprotected _methodDependenciesByGraphNodeId: Map<CoreGraphNodeId, MethodDependency> | undefined;\n\t// private _reset_bound = this.reset.bind(this);\n\tconstructor(protected param: BaseParamType) {\n\t\t// this.param.dirtyController.addPostDirtyHook('expression_controller_reset', this._reset_bound);\n\t}\n\t// remove_dirty_hook() {\n\t// \t// this.param.dirtyController.removePostDirtyHook('expression_controller_reset');\n\t// }\n\tdispose() {\n\t\tthis.param.scene().expressionsController.deregisterParam(this.param);\n\t\tthis._resetMethodDependencies();\n\t\tthis._manager = undefined;\n\t}\n\tprivate _resetMethodDependencies() {\n\t\tthis._methodDependenciesByGraphNodeId?.forEach((methodDependency) => {\n\t\t\tmethodDependency.dispose();\n\t\t});\n\t\tthis._methodDependenciesByGraphNodeId?.clear();\n\t}\n\tregisterMethodDependency(methodDependency: MethodDependency) {\n\t\tthis._methodDependenciesByGraphNodeId = this._methodDependenciesByGraphNodeId || new Map();\n\t\tthis._methodDependenciesByGraphNodeId.set(methodDependency.graphNodeId(), methodDependency);\n\t}\n\n\tactive() {\n\t\treturn this._expression != null;\n\t}\n\texpression() {\n\t\treturn this._expression;\n\t}\n\tisErrored() {\n\t\tif (this._manager) {\n\t\t\treturn this._manager.isErrored();\n\t\t}\n\t\treturn false;\n\t}\n\terrorMessage() {\n\t\tif (this._manager) {\n\t\t\treturn this._manager.errorMessage();\n\t\t}\n\t\treturn null;\n\t}\n\tentitiesDependent(): boolean {\n\t\tconst managerEntitiesDependent: boolean = this._manager?.generatedFunctionEntitiesDependent() || false;\n\t\treturn this.param.options.isExpressionForEntities() && managerEntitiesDependent;\n\t}\n\t// private reset() {\n\t// \tthis._manager?.clear_error();\n\t// }\n\n\tsetExpression(expression: string | undefined, setDirty: boolean = true) {\n\t\tif (this.param.disposed()) {\n\t\t\tthis._resetMethodDependencies();\n\t\t\tthis._expression = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.param.scene().missingExpressionReferencesController.deregisterParam(this.param);\n\t\tthis.param.scene().expressionsController.deregisterParam(this.param);\n\n\t\tif (this._expression != expression) {\n\t\t\tthis._resetMethodDependencies();\n\t\t\tthis._expression = expression;\n\n\t\t\tif (this._expression) {\n\t\t\t\tthis._manager = this._manager || new ExpressionManager(this.param);\n\t\t\t\tthis._manager.parseExpression(this._expression);\n\t\t\t} else {\n\t\t\t\tthis._manager?.reset();\n\t\t\t}\n\n\t\t\tif (setDirty) {\n\t\t\t\tthis.param.setDirty();\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateFromMethodDependencyNameChange() {\n\t\tif (this._manager && this.active()) {\n\t\t\tthis._manager.updateFromMethodDependencyNameChange();\n\t\t}\n\t}\n\n\tcomputeExpression() {\n\t\tif (this._manager && this.active()) {\n\t\t\treturn this._manager.computeFunction();\n\t\t}\n\t}\n\tasync computeExpressionForEntities(entities: CoreEntity[], callback: EntityCallback<T>) {\n\t\tthis._setEntities(entities, callback);\n\t\tawait this.computeExpression();\n\t\tconst errorMessage = this._manager?.errorMessage();\n\t\tif (errorMessage) {\n\t\t\tthis.param.node.states.error.set(`expression evaluation error: ${errorMessage}`);\n\t\t}\n\n\t\tthis._resetEntities();\n\t}\n\tcomputeExpressionForPoints(entities: CorePoint<CoreObjectType>[], callback: PointEntityCallback<T>) {\n\t\treturn this.computeExpressionForEntities(entities, callback as EntityCallback<T>);\n\t}\n\tcomputeExpressionForVertices(entities: CoreVertex<CoreObjectType>[], callback: PointEntityCallback<T>) {\n\t\treturn this.computeExpressionForEntities(entities, callback as EntityCallback<T>);\n\t}\n\tcomputeExpressionForPrimitives(entities: CorePrimitive<CoreObjectType>[], callback: PointEntityCallback<T>) {\n\t\treturn this.computeExpressionForEntities(entities, callback as EntityCallback<T>);\n\t}\n\tcomputeExpressionForObjects<OT extends CoreObjectType>(\n\t\tentities: BaseCoreObject<OT>[],\n\t\tcallback: ObjectEntityCallback<T>\n\t) {\n\t\treturn this.computeExpressionForEntities(entities, callback as EntityCallback<T>);\n\t}\n\tcomputeExpressionForCoreGroup(entity: CoreGroup, callback: CoreGroupEntityCallback<T>) {\n\t\treturn this.computeExpressionForEntities([entity], callback as EntityCallback<T>);\n\t}\n\tentities() {\n\t\treturn this._entities;\n\t}\n\tentityCallback() {\n\t\treturn this._entityCallback;\n\t}\n\tprivate _setEntities(entities: CoreEntity[], callback: EntityCallback<T>) {\n\t\tthis._entities = entities;\n\t\tthis._entityCallback = callback;\n\t}\n\tprivate _resetEntities() {\n\t\tthis._entities = undefined;\n\t\tthis._entityCallback = undefined;\n\t}\n}\n","import {BaseParamType} from '../_Base';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {ParamType} from '../../poly/ParamType';\nimport {ParamEvent} from '../../poly/ParamEvent';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {ColorConversion} from '../../../core/Color';\nimport {isString, isArray, isFunction} from '../../../core/Type';\nimport {arrayDifference, arrayCompact, arrayUniq} from '../../../core/ArrayUtils';\nimport {objectCloneDeep, objectIsEqual} from '../../../core/ObjectUtils';\nimport {PolyScene} from '../../scene/PolyScene';\nimport {Boolean2, Number2, PolyDictionary} from '../../../types/GlobalTypes';\n\nconst CALLBACK_OPTION = 'callback';\nconst CALLBACK_STRING_OPTION = 'callbackString';\n// const COLOR_OPTION = 'color';\nconst COMPUTE_ON_DIRTY = 'computeOnDirty';\nconst COOK_OPTION = 'cook';\nconst FILE_BROWSE_OPTION = 'fileBrowse';\nconst FILE_BROWSE_EXTENSIONS = 'extensions';\n// const EXPRESSION_ONLY_OPTION = 'expression_only';\nconst EXPRESSION = 'expression';\nconst FOR_ENTITIES = 'forEntities';\nconst LABEL = 'label';\nconst HIDE_LABEL = 'hideLabel';\nconst LEVEL = 'level';\nconst MENU = 'menu';\nconst MENU_STRING = 'menuString';\nconst ENTRIES = 'entries';\n// const TYPE = 'type';\n// const RADIO = 'radio';\nconst MULTILINE_OPTION = 'multiline';\nconst LANGUAGE_OPTION = 'language';\nconst NODE_SELECTION = 'nodeSelection';\nconst NODE_SELECTION_CONTEXT = 'context';\nconst NODE_SELECTION_TYPES = 'types';\nconst OBJECT_MASK = 'objectMask';\nconst OBJECT_MASK_INPUT_INDEX = 'inputIndex';\n// const PARAM_SELECTION = 'paramSelection';\nconst DEPENDENT_ON_FOUND_NODE = 'dependentOnFoundNode';\nconst DEPENDENT_ON_FOUND_PARAM = 'dependentOnFoundParam';\nconst RANGE_OPTION = 'range';\nconst RANGE_LOCKED_OPTION = 'rangeLocked';\nconst STEP_OPTION = 'step';\nconst SPARE_OPTION = 'spare';\nconst TEXTURE_OPTION = 'texture';\nconst ENV_OPTION = 'env';\nconst HIDDEN_OPTION = 'hidden';\n// const SHOW_LABEL_OPTION = 'show_label';\nconst FIELD_OPTION = 'field';\nconst VISIBLE_IF_OPTION = 'visibleIf';\nconst COLOR_CONVERSION = 'conversion';\n\nconst SEPARATOR_BEFORE_OPTION = 'separatorBefore';\nconst SEPARATOR_AFTER_OPTION = 'separatorAfter';\nconst JOIN_TO_PREVIOUS_PARAM = 'joinToPreviousParam';\nconst AS_QUATERNION = 'asQuaternion';\n\nexport const PARAM_OPTION_NAMES = {\n\tCALLBACK_OPTION,\n};\n\nconst EDITABLE = 'editable';\n\nexport interface GenericParamOptionsMenuEntry<T> {\n\tname: string;\n\tvalue: T;\n}\nexport type StringParamOptionsMenuEntry = GenericParamOptionsMenuEntry<string>;\nexport type NumericParamOptionsMenuEntry = GenericParamOptionsMenuEntry<number>;\n\nexport interface MenuNumericParamOptions {\n\tmenu?: {\n\t\tentries: NumericParamOptionsMenuEntry[];\n\t};\n}\nexport interface MenuStringParamOptions {\n\tmenuString?: {\n\t\tentries: StringParamOptionsMenuEntry[];\n\t};\n}\nexport enum StringParamLanguage {\n\t// JAVASCRIPT = 'javascript',\n\tCSS = 'css',\n\tGLSL = 'glsl',\n\tHTML = 'html',\n\tTYPESCRIPT = 'typescript',\n\tJSON = 'json',\n\t// GLSL = 'glsl',\n}\n\nexport enum FileType {\n\tAUDIO = 'audio',\n\tTEXTURE_IMAGE = 'texture_image',\n\tTEXTURE_VIDEO = 'texture_video',\n\tGEOMETRY = 'geometry',\n\tFONT = 'font',\n\tSVG = 'svg',\n\tJSON = 'json',\n}\n\nexport type VisibleIfParamOptions = PolyDictionary<number | boolean | string>;\nexport interface BaseParamOptions {\n\t// cook\n\tcook?: boolean;\n\t// spare\n\tspare?: boolean;\n\t// visible\n\thidden?: boolean;\n\t// show_label?: boolean;\n\tfield?: boolean;\n\tvisibleIf?: VisibleIfParamOptions | VisibleIfParamOptions[];\n\t// separator\n\tseparatorBefore?: boolean;\n\tseparatorAfter?: boolean;\n\tjoinToPreviousParam?: boolean;\n\t// editable\n\teditable?: boolean;\n}\n\ninterface ExpressionParamOptions {\n\texpression?: {\n\t\tforEntities?: boolean;\n\t};\n}\n\ninterface NumberParamOptions extends BaseParamOptions {\n\trange?: Number2;\n\trangeLocked?: Boolean2;\n\tstep?: number;\n}\n\ninterface FileParamOptions {\n\tfileBrowse?: {\n\t\textensions: string[];\n\t};\n}\ninterface ComputeOnDirtyParamOptions {\n\tcomputeOnDirty?: boolean;\n}\ninterface CallbackParamOptions {\n\tcallback?: (node: BaseNodeType, param: BaseParamType) => any;\n\tcallbackString?: string;\n}\ninterface LabelParamOptions {\n\tlabel?: string;\n}\ninterface LabelVisibilityParamOptions {\n\thideLabel?: boolean;\n}\ninterface ColorConversionOptions {\n\tconversion?: ColorConversion;\n}\n\n// actual param options\nexport interface BooleanParamOptions\n\textends BaseParamOptions,\n\t\tComputeOnDirtyParamOptions,\n\t\tMenuNumericParamOptions,\n\t\tExpressionParamOptions,\n\t\tCallbackParamOptions,\n\t\tLabelParamOptions {}\nexport interface ButtonParamOptions extends BaseParamOptions, CallbackParamOptions, LabelParamOptions {}\nexport interface ColorParamOptions\n\textends BaseParamOptions,\n\t\tLabelParamOptions,\n\t\tColorConversionOptions,\n\t\tExpressionParamOptions,\n\t\tCallbackParamOptions,\n\t\tComputeOnDirtyParamOptions {}\nexport interface FloatParamOptions\n\textends NumberParamOptions,\n\t\tMenuNumericParamOptions,\n\t\tComputeOnDirtyParamOptions,\n\t\tExpressionParamOptions,\n\t\tCallbackParamOptions {}\nexport interface FolderParamOptions extends BaseParamOptions {\n\tlevel?: number;\n}\ninterface ObjectMask {\n\tinputIndex?: number;\n\tfromInputOnly?: boolean;\n}\ntype ObjectMaskOptions = ObjectMask | boolean;\nexport interface IntegerParamOptions\n\textends NumberParamOptions,\n\t\tMenuNumericParamOptions,\n\t\tComputeOnDirtyParamOptions,\n\t\tExpressionParamOptions,\n\t\tCallbackParamOptions {}\nexport interface NodePathParamOptions\n\textends BaseParamOptions,\n\t\tFileParamOptions,\n\t\tComputeOnDirtyParamOptions,\n\t\tCallbackParamOptions {\n\tnodeSelection?: {\n\t\tcontext?: NodeContext;\n\t\ttypes?: Readonly<string[]>;\n\t};\n\tdependentOnFoundNode?: boolean;\n}\nexport interface ParamPathParamOptions\n\textends BaseParamOptions,\n\t\tFileParamOptions,\n\t\tComputeOnDirtyParamOptions,\n\t\tCallbackParamOptions {\n\tdependentOnFoundParam?: boolean;\n\tparamSelection?: ParamType | boolean;\n}\nexport interface RampParamOptions extends BaseParamOptions, LabelVisibilityParamOptions {}\nexport interface SeparatorParamOptions extends BaseParamOptions {}\nexport interface StringParamOptions\n\textends BaseParamOptions,\n\t\tMenuStringParamOptions,\n\t\tFileParamOptions,\n\t\tCallbackParamOptions,\n\t\tExpressionParamOptions,\n\t\tLabelVisibilityParamOptions {\n\tmultiline?: boolean;\n\tlanguage?: StringParamLanguage;\n\tobjectMask?: ObjectMaskOptions;\n}\ninterface VectorParamOptions\n\textends BaseParamOptions,\n\t\tLabelParamOptions,\n\t\tExpressionParamOptions,\n\t\tCallbackParamOptions,\n\t\tComputeOnDirtyParamOptions {}\nexport interface Vector2ParamOptions extends VectorParamOptions {}\nexport interface Vector3ParamOptions extends VectorParamOptions {}\n\ninterface QuaternionOptions {\n\tasQuaternion?: boolean;\n}\nexport interface Vector4ParamOptions extends VectorParamOptions, QuaternionOptions {}\n\nexport interface ParamOptions\n\textends NumberParamOptions,\n\t\tColorConversionOptions,\n\t\tComputeOnDirtyParamOptions,\n\t\tFolderParamOptions,\n\t\tExpressionParamOptions,\n\t\tButtonParamOptions,\n\t\tFileParamOptions,\n\t\tMenuNumericParamOptions,\n\t\tStringParamOptions,\n\t\tNodePathParamOptions,\n\t\tParamPathParamOptions,\n\t\tLabelVisibilityParamOptions,\n\t\tQuaternionOptions {\n\ttexture?: {\n\t\tenv?: boolean;\n\t};\n}\n\n// type OptionChangeCallback = () => void;\n\n// we don't want to check if EDITABLE has been overriden,\n// as it is overriden dynamically for the gl nodes\n// and that override should therefore not be saved with the scene\nconst NON_OVERRIDABLE_OPTIONS: Array<keyof ParamOptions> = [EDITABLE];\n\nexport class OptionsController {\n\tprivate _programaticVisibleState: boolean = true;\n\tprivate _options!: ParamOptions;\n\tprivate _default_options!: ParamOptions;\n\tconstructor(private _param: BaseParamType) {}\n\tdispose() {\n\t\ttry {\n\t\t\t// there is a bug where the _options is just a string\n\t\t\t// for builder params. And accessing generates an error\n\t\t\tthis._options[CALLBACK_OPTION] = undefined;\n\t\t\tthis._options[CALLBACK_STRING_OPTION] = undefined;\n\t\t} catch (err) {}\n\t\tthis._visibility_graph_node?.dispose();\n\t}\n\n\tset(options: ParamOptions) {\n\t\tif (isString(options)) {\n\t\t\tconsole.warn('options input invalid', options, typeof options);\n\t\t}\n\t\tthis._default_options = options;\n\t\tthis._options = objectCloneDeep(this._default_options);\n\t\tthis.postSetOptions();\n\t}\n\tcopy(options_controller: OptionsController) {\n\t\tthis._default_options = objectCloneDeep(options_controller.default());\n\t\tthis._options = objectCloneDeep(options_controller.current());\n\t\tthis.postSetOptions();\n\t}\n\tsetOption<K extends keyof ParamOptions>(optionName: K, value: ParamOptions[K]) {\n\t\tif (!this._validateOption(optionName, value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._options[optionName] = value;\n\t\tif (this._param.components) {\n\t\t\tfor (const component of this._param.components) {\n\t\t\t\tcomponent.options.setOption(optionName, value);\n\t\t\t}\n\t\t}\n\t\t// this._runOptionCallback(optionName);\n\t}\n\n\tprivate _validateOption<K extends keyof ParamOptions>(optionName: K, value: ParamOptions[K]) {\n\t\tif (optionName == CALLBACK_OPTION) {\n\t\t\treturn isFunction(value);\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate postSetOptions() {\n\t\tthis._handleComputeOnDirty();\n\t}\n\tparam() {\n\t\treturn this._param;\n\t}\n\tnode(): BaseNodeType {\n\t\treturn this._param.node;\n\t}\n\tdefault() {\n\t\treturn this._default_options;\n\t}\n\tcurrent() {\n\t\treturn this._options;\n\t}\n\n\t// utils\n\thasOptionsOverridden(): boolean {\n\t\treturn !objectIsEqual(this._options, this._default_options);\n\t}\n\toverriddenOptions(): ParamOptions {\n\t\tconst overriden: ParamOptions = {};\n\t\tconst optionNames = Object.keys(this._options) as Array<keyof ParamOptions>;\n\t\tconst optionNamesToCheck: Array<keyof ParamOptions> = [];\n\t\tarrayDifference(optionNames, NON_OVERRIDABLE_OPTIONS, optionNamesToCheck);\n\t\tfor (const optionName of optionNamesToCheck) {\n\t\t\tif (!objectIsEqual(this._options[optionName], this._default_options[optionName])) {\n\t\t\t\tconst cloned_option = objectCloneDeep(this._options[optionName]);\n\t\t\t\tObject.assign(overriden, {[optionName]: cloned_option});\n\t\t\t}\n\t\t}\n\t\treturn overriden;\n\t}\n\toverriddenOptionNames(): Array<keyof ParamOptions> {\n\t\treturn Object.keys(this.overriddenOptions()) as Array<keyof ParamOptions>;\n\t}\n\n\t// compute on dirty\n\tcomputeOnDirty(): boolean {\n\t\treturn this._options[COMPUTE_ON_DIRTY] || false;\n\t}\n\tprivate _computeOnDirtyCallbackAdded: boolean | undefined;\n\tprivate _handleComputeOnDirty() {\n\t\tif (this.computeOnDirty()) {\n\t\t\tif (!this._computeOnDirtyCallbackAdded) {\n\t\t\t\tthis.param().addPostDirtyHook('computeOnDirty', this._computeParam.bind(this));\n\t\t\t\tthis._computeOnDirtyCallbackAdded = true;\n\t\t\t}\n\t\t}\n\t}\n\tprivate async _computeParam() {\n\t\tawait this.param().compute();\n\t}\n\n\t// callback\n\thasCallback() {\n\t\treturn this._options[CALLBACK_OPTION] != null || this._options[CALLBACK_STRING_OPTION] != null;\n\t}\n\n\tprivate _callbackAllowed = false;\n\tallowCallback() {\n\t\tthis._callbackAllowed = true;\n\t}\n\n\tasync executeCallback() {\n\t\tif (!this._callbackAllowed) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = this.node();\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst scene = node.scene();\n\t\tif (!scene) {\n\t\t\treturn;\n\t\t}\n\t\tconst callback = this.getCallback(node, scene);\n\t\tif (!callback) {\n\t\t\treturn;\n\t\t}\n\t\t// we only allow execution when scene is loaded\n\t\t// to avoid errors such as an operator_path param\n\t\t// executing its callback before the node it points to is created\n\t\tif (!scene.loadingController.loaded()) {\n\t\t\treturn;\n\t\t}\n\t\t// not running the callback when a node is cooking prevents some event nodes from behaving as expected.\n\t\t// It may also prevent files such as the sop/file to reload correctly if its reload callback was called while it loads a file\n\t\t// if (!this.node.cookController.is_cooking) {\n\t\tconst parentParam = this.param().parentParam();\n\t\tif (parentParam) {\n\t\t\t// if the param is a component of a MultipleParam,\n\t\t\t// we let the parent handle the callback.\n\t\t\t// The main reason is for material builder uniforms.\n\t\t\t// If the component executes the callback, the uniform that is expecting a vector\n\t\t\t// will be receiving a float. The reason is that the callback is created by the ParamConfig, and it is then passed down to the component unchanged.\n\t\t\t// I could maybe find a way so that the param config creates callback for the multiple param\n\t\t\t// and also for the components. But they would have to be assigned correctly by the multiple param\n\t\t\tparentParam.options.executeCallback();\n\t\t} else {\n\t\t\tawait callback(node, this.param());\n\t\t}\n\t}\n\tprivate getCallback(node: BaseNodeType, scene: PolyScene) {\n\t\tif (this.hasCallback()) {\n\t\t\treturn (this._options[CALLBACK_OPTION] =\n\t\t\t\tthis._options[CALLBACK_OPTION] || this.createCallbackFromString(node, scene));\n\t\t}\n\t}\n\tprivate createCallbackFromString(node: BaseNodeType, scene: PolyScene) {\n\t\tconst callbackString = this._options[CALLBACK_STRING_OPTION];\n\t\tif (callbackString) {\n\t\t\tconst callbackFunction = new Function('node', 'scene', 'window', 'location', callbackString);\n\t\t\treturn () => {\n\t\t\t\tcallbackFunction(node, scene, null, null);\n\t\t\t};\n\t\t}\n\t}\n\n\t// color\n\tcolorConversion() {\n\t\treturn this._options[COLOR_CONVERSION] || ColorConversion.NONE;\n\t}\n\n\t// cook\n\tmakesNodeDirtyWhenDirty() {\n\t\t// false as the dirty state will go through the parent param\n\t\tif (this.param().parentParam() != null) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst cookOptions = this._options[COOK_OPTION];\n\t\tif (cookOptions != null) {\n\t\t\treturn cookOptions;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// desktop\n\tfileBrowseOption() {\n\t\treturn this._options[FILE_BROWSE_OPTION];\n\t}\n\tfileBrowseAllowed(): boolean {\n\t\treturn this.fileBrowseOption() != null;\n\t}\n\tfileBrowseExtensions(): string[] | null {\n\t\tconst option = this.fileBrowseOption();\n\t\tif (option) {\n\t\t\treturn option[FILE_BROWSE_EXTENSIONS];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// separator\n\tseparatorBefore() {\n\t\treturn this._options[SEPARATOR_BEFORE_OPTION];\n\t}\n\tseparatorAfter() {\n\t\treturn this._options[SEPARATOR_AFTER_OPTION];\n\t}\n\tjoinToPreviousParam() {\n\t\treturn this._options[JOIN_TO_PREVIOUS_PARAM];\n\t}\n\t// editable\n\tsetEditableState(state: boolean) {\n\t\tconst currentState = this._options[EDITABLE];\n\t\tconst param = this.param();\n\t\tif (currentState != state) {\n\t\t\tthis._options[EDITABLE] = state;\n\t\t\tparam.emit(ParamEvent.EDITABLE_UPDATED);\n\t\t}\n\t\tif (param.components) {\n\t\t\tfor (const component of param.components) {\n\t\t\t\tcomponent.options.setEditableState(state);\n\t\t\t}\n\t\t}\n\t}\n\teditable(): boolean {\n\t\tconst state = this._options[EDITABLE];\n\t\tif (state != null) {\n\t\t\treturn state;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// expression\n\t// get displays_expression_only() {\n\t// \treturn this._options[EXPRESSION_ONLY_OPTION] === true;\n\t// }\n\tisExpressionForEntities(): boolean {\n\t\tconst expr_option = this._options[EXPRESSION];\n\t\tif (expr_option) {\n\t\t\treturn expr_option[FOR_ENTITIES] || false;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// folder\n\tlevel() {\n\t\treturn this._options[LEVEL] || 0;\n\t}\n\n\t// menu\n\thasMenu() {\n\t\treturn this.menuOptions() != null || this.menuStringOptions() != null;\n\t}\n\n\tprivate menuOptions() {\n\t\treturn this._options[MENU];\n\t}\n\tprivate menuStringOptions() {\n\t\treturn this._options[MENU_STRING];\n\t}\n\tmenuEntries(): Array<NumericParamOptionsMenuEntry | StringParamOptionsMenuEntry> {\n\t\tconst options = this.menuOptions() || this.menuStringOptions();\n\t\tif (options) {\n\t\t\treturn options[ENTRIES];\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\tensureValueInMenuEntries(value: number): number {\n\t\tconst options = this.menuOptions();\n\t\tif (!options) {\n\t\t\treturn value;\n\t\t}\n\t\tconst entries = options[ENTRIES];\n\t\tif (entries.length == 0) {\n\t\t\treturn value;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (value == entry.value) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\treturn entries[0].value;\n\t}\n\n\t// multiline\n\tisMultiline(): boolean {\n\t\treturn this._options[MULTILINE_OPTION] === true;\n\t}\n\tlanguage(): StringParamLanguage | undefined {\n\t\treturn this._options[LANGUAGE_OPTION];\n\t}\n\tisCode(): boolean {\n\t\treturn this.language() != null;\n\t}\n\n\t// node selection\n\tnodeSelectionOptions() {\n\t\treturn this._options[NODE_SELECTION];\n\t}\n\tnodeSelectionContext() {\n\t\tconst options = this.nodeSelectionOptions();\n\t\tif (options) {\n\t\t\treturn options[NODE_SELECTION_CONTEXT];\n\t\t}\n\t}\n\tnodeSelectionTypes() {\n\t\tconst options = this.nodeSelectionOptions();\n\t\tif (options) {\n\t\t\treturn options[NODE_SELECTION_TYPES];\n\t\t}\n\t}\n\tdisplayObjectMaskSelection() {\n\t\tconst value = this._options[OBJECT_MASK];\n\t\treturn value != null && value != false;\n\t}\n\tobjectMaskInputIndex(): number {\n\t\tconst value = this._options[OBJECT_MASK];\n\t\tconst input = value != null ? (value as ObjectMask)[OBJECT_MASK_INPUT_INDEX] : 0;\n\t\treturn input || 0;\n\t}\n\tobjectMaskFromInputOnly() {\n\t\tconst value = this._options[OBJECT_MASK];\n\t\tconst fromInputOnly = (value as ObjectMask).fromInputOnly;\n\t\treturn fromInputOnly != false;\n\t}\n\n\tdependentOnFoundNode() {\n\t\tif (DEPENDENT_ON_FOUND_NODE in this._options) {\n\t\t\treturn this._options[DEPENDENT_ON_FOUND_NODE];\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\tdependentOnFoundParam() {\n\t\tif (DEPENDENT_ON_FOUND_PARAM in this._options) {\n\t\t\treturn this._options[DEPENDENT_ON_FOUND_PARAM];\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// param selection\n\tisSelectingParam() {\n\t\treturn this.param().type() == ParamType.PARAM_PATH;\n\t\t// return this.paramSelectionOptions() != null;\n\t}\n\t// paramSelectionOptions() {\n\t// \treturn this._options[PARAM_SELECTION];\n\t// }\n\t// paramSelectionType() {\n\t// \tconst options = this.paramSelectionOptions();\n\t// \tif (options) {\n\t// \t\tconst type_or_boolean = options;\n\t// \t\tif (!isBoolean(type_or_boolean)) {\n\t// \t\t\treturn type_or_boolean;\n\t// \t\t}\n\t// \t}\n\t// }\n\n\t// range\n\trange(): Number2 {\n\t\t// cannot force range easily, as values are not necessarily from 0 to N\n\t\t// if(this.self.has_menu() && this.self.menu_entries()){\n\t\t// \treturn [0, this.self.menu_entries().length-1 ]\n\t\t// } else {\n\t\treturn this._options[RANGE_OPTION] || [0, 1];\n\t\t// }\n\t}\n\tstep(): number | undefined {\n\t\treturn this._options[STEP_OPTION];\n\t}\n\tasQuaternion() {\n\t\treturn this._options[AS_QUATERNION] == true;\n\t}\n\n\trangeLocked(): Boolean2 {\n\t\t// if(this.self.has_menu() && this.self.menu_entries()){\n\t\t// \treturn [true, true]\n\t\t// } else {\n\t\treturn this._options[RANGE_LOCKED_OPTION] || [false, false];\n\t\t// }\n\t}\n\n\tensureInRange(value: number): number {\n\t\tconst range = this.range();\n\n\t\tif (value >= range[0] && value <= range[1]) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\tif (value < range[0]) {\n\t\t\t\treturn this.rangeLocked()[0] === true ? range[0] : value;\n\t\t\t} else {\n\t\t\t\treturn this.rangeLocked()[1] === true ? range[1] : value;\n\t\t\t}\n\t\t}\n\t}\n\n\t// spare\n\tisSpare(): boolean {\n\t\treturn this._options[SPARE_OPTION] || false;\n\t}\n\n\t// texture\n\ttextureOptions() {\n\t\treturn this._options[TEXTURE_OPTION];\n\t}\n\ttextureAsEnv(): boolean {\n\t\tconst texture_options = this.textureOptions();\n\t\tif (texture_options != null) {\n\t\t\treturn texture_options[ENV_OPTION] === true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// visible\n\tisHidden(): boolean {\n\t\treturn this._options[HIDDEN_OPTION] === true || this._programaticVisibleState === false;\n\t}\n\tisVisible(): boolean {\n\t\treturn !this.isHidden();\n\t}\n\tsetVisibleState(state: boolean) {\n\t\tthis._options[HIDDEN_OPTION] = !state;\n\t\tthis.param().emit(ParamEvent.VISIBLE_UPDATED);\n\t}\n\t// label\n\tlabel() {\n\t\treturn this._options[LABEL];\n\t}\n\tisLabelHidden(): boolean {\n\t\tconst type = this.param().type();\n\t\tswitch (type) {\n\t\t\tcase ParamType.BUTTON: {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcase ParamType.BOOLEAN: {\n\t\t\t\treturn this.isFieldHidden();\n\t\t\t}\n\t\t\tcase ParamType.RAMP: {\n\t\t\t\treturn this._options[HIDE_LABEL] || false;\n\t\t\t}\n\t\t\tcase ParamType.STRING: {\n\t\t\t\treturn (this.isCode() && this._options[HIDE_LABEL]) || false;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tisFieldHidden(): boolean {\n\t\treturn this._options[FIELD_OPTION] === false;\n\t}\n\n\t// programatic visibility\n\tuiDataDependsOnOtherParams(): boolean {\n\t\treturn VISIBLE_IF_OPTION in this._options;\n\t}\n\tvisibilityPredecessors() {\n\t\tconst visibilityOptions = this._options[VISIBLE_IF_OPTION];\n\t\tif (!visibilityOptions) {\n\t\t\treturn [];\n\t\t}\n\t\tlet predecessorNames: string[] = [];\n\t\tif (isArray(visibilityOptions)) {\n\t\t\tarrayUniq(visibilityOptions.map((options) => Object.keys(options)).flat(), predecessorNames);\n\t\t} else {\n\t\t\tpredecessorNames = Object.keys(visibilityOptions);\n\t\t}\n\t\tconst node = this.param().node;\n\t\tconst params: BaseParamType[] = [];\n\t\tarrayCompact(\n\t\t\tpredecessorNames.map((name) => {\n\t\t\t\tconst param = node.params.get(name);\n\t\t\t\tif (param) {\n\t\t\t\t\treturn param;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`param ${name} not found as visibility condition for ${this.param().name()} in node ${this.param().node.type()}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\t\t\tparams\n\t\t);\n\n\t\treturn params;\n\t}\n\n\tprivate _updateVisibilityAndRemoveDirtyBound = this.updateVisibilityAndRemoveDirty.bind(this);\n\tprivate _visibility_graph_node: CoreGraphNode | undefined;\n\tprivate _ui_data_dependency_set: boolean = false;\n\tsetUiDataDependency() {\n\t\t// currently this is only called on request on a per-param and therefore per-node basis, not on scene load for the whole scene\n\t\tif (this._ui_data_dependency_set) {\n\t\t\treturn;\n\t\t}\n\t\tthis._ui_data_dependency_set = true;\n\t\tconst predecessors = this.visibilityPredecessors();\n\t\tif (predecessors.length > 0) {\n\t\t\tthis._visibility_graph_node = new CoreGraphNode(this.param().scene(), 'param_visibility');\n\t\t\tfor (const predecessor of predecessors) {\n\t\t\t\tthis._visibility_graph_node.addGraphInput(predecessor);\n\t\t\t}\n\t\t\tthis._visibility_graph_node.addPostDirtyHook(\n\t\t\t\t'_update_visibility_and_remove_dirty',\n\t\t\t\tthis._updateVisibilityAndRemoveDirtyBound\n\t\t\t);\n\t\t}\n\t}\n\tprivate updateVisibilityAndRemoveDirty() {\n\t\tthis.updateVisibility();\n\t\tthis.param().removeDirtyState();\n\t}\n\n\tasync updateVisibility() {\n\t\tconst options = this._options[VISIBLE_IF_OPTION];\n\t\tif (options) {\n\t\t\tconst node = this.param().node;\n\t\t\tconst params = this.visibilityPredecessors();\n\t\t\tconst promises = params.map((p) => {\n\t\t\t\tif (p.isDirty()) {\n\t\t\t\t\treturn p.compute();\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis._programaticVisibleState = false;\n\t\t\tawait Promise.all(promises);\n\t\t\tif (isArray(options)) {\n\t\t\t\tfor (const optionsSet of options) {\n\t\t\t\t\tconst optionSetParamNames = Object.keys(optionsSet);\n\t\t\t\t\tconst optionSetParams: BaseParamType[] = [];\n\t\t\t\t\tarrayCompact(\n\t\t\t\t\t\toptionSetParamNames.map((paramName) => node.params.get(paramName)),\n\t\t\t\t\t\toptionSetParams\n\t\t\t\t\t);\n\t\t\t\t\tconst satisfiedValues = optionSetParams.filter((param) => param.value == optionsSet[param.name()]);\n\n\t\t\t\t\tif (satisfiedValues.length == optionSetParams.length) {\n\t\t\t\t\t\tthis._programaticVisibleState = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst satisfiedValues = params.filter((param) => param.value == options[param.name()]);\n\t\t\t\tthis._programaticVisibleState = satisfiedValues.length == params.length;\n\t\t\t}\n\t\t\tthis.param().emit(ParamEvent.VISIBLE_UPDATED);\n\t\t}\n\t}\n\n\t/*\n\t *\n\t *\n\t *\n\t */\n\t// private _callbacksByOptionName: Map<keyof ParamOptions, OptionChangeCallback> | undefined;\n\t// onOptionChange<K extends keyof ParamOptions>(optionName: K, callback: OptionChangeCallback) {\n\t// \tthis._callbacksByOptionName = this._callbacksByOptionName || new Map();\n\t// \tthis._callbacksByOptionName.set(optionName, callback);\n\t// }\n\t// private _runOptionCallback(optionName: keyof ParamOptions) {\n\t// \tif (!this._callbacksByOptionName) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst callback = this._callbacksByOptionName.get(optionName);\n\t// \tif (!callback) {\n\t// \t\treturn;\n\t// \t}\n\t// \tcallback();\n\t// }\n}\n","export class TypeAssert {\n\tstatic unreachable(_: never): never {\n\t\tthrow new Error(\"Didn't expect to get here\");\n\t}\n}\n","export enum InputCloneMode {\n\tALWAYS = 'always',\n\tNEVER = 'never',\n\tFROM_NODE = 'from_node',\n}\n","// nodes\nimport {BaseAnimNodeType} from '../nodes/anim/_Base';\nimport {BaseAudioNodeType} from '../nodes/audio/_Base';\nimport {BaseCopNodeType} from '../nodes/cop/_Base';\nimport {BaseEventNodeType} from '../nodes/event/_Base';\nimport {BaseGlNodeType} from '../nodes/gl/_Base';\nimport {BaseJsNodeType} from '../nodes/js/_Base';\nimport {BaseManagerNodeType} from '../nodes/manager/_Base';\nimport {BaseMatNodeType} from '../nodes/mat/_Base';\nimport {BaseObjNodeType} from '../nodes/obj/_Base';\nimport {BasePostProcessNodeType} from '../nodes/post/_Base';\nimport {BaseRopNodeType} from '../nodes/rop/_Base';\nimport {BaseSopNodeType} from '../nodes/sop/_Base';\n// registers\n// import {GeoNodeChildrenMap} from './registers/nodes/Sop';\n// import {GlNodeChildrenMap} from './registers/nodes/Gl';\n// import {EventNodeChildrenMap} from './registers/nodes/Event';\n// import {CopNodeChildrenMap} from './registers/nodes/Cop';\n// import {AnimNodeChildrenMap} from './registers/nodes/Anim';\n// import {MatNodeChildrenMap} from './registers/nodes/Mat';\n// import {ObjNodeChildrenMap} from './registers/nodes/Obj';\n// import {PostNodeChildrenMap} from './registers/nodes/Post';\n// import {RopNodeChildrenMap} from './registers/nodes/Rop';\n// import {AudioNodeChildrenMap} from './registers/nodes/Audio';\nimport {TypedNode} from '../nodes/_Base';\n// import { JsNodeChildrenMap } from './registers/nodes/Js';\n\nexport enum NodeContext {\n\tANIM = 'anim',\n\tAUDIO = 'audio',\n\t// CAD = 'cad',\n\tCOP = 'cop',\n\t// CSG = 'csg',\n\tEVENT = 'event',\n\tGL = 'gl',\n\tJS = 'js',\n\tMANAGER = 'manager',\n\tMAT = 'mat',\n\tOBJ = 'obj',\n\tPOST = 'post',\n\tROP = 'rop',\n\tSOP = 'sop',\n}\n\nexport type NodeContextUnion =\n\t| NodeContext.ANIM\n\t| NodeContext.AUDIO\n\t// | NodeContext.CAD\n\t| NodeContext.COP\n\t// | NodeContext.CSG\n\t| NodeContext.EVENT\n\t| NodeContext.GL\n\t| NodeContext.JS\n\t| NodeContext.MANAGER\n\t| NodeContext.MAT\n\t| NodeContext.OBJ\n\t| NodeContext.POST\n\t| NodeContext.ROP\n\t| NodeContext.SOP;\n\nexport enum NetworkNodeType {\n\tACTOR = 'actorsNetwork',\n\tANIM = 'animationsNetwork',\n\tAUDIO = 'audioNetwork',\n\t// CAD = 'cadNetwork',\n\tCOP = 'copNetwork',\n\tCSG = 'csgNetwork',\n\tEVENT = 'eventsNetwork',\n\tMAT = 'materialsNetwork',\n\tPOST = 'postProcessNetwork',\n\tROP = 'renderersNetwork',\n\tSOLVER = 'solver',\n\tSUBNET = 'subnet',\n\tDECOMPOSE = 'decompose',\n}\nexport enum NetworkChildNodeType {\n\tINPUT = 'subnetInput',\n\tOUTPUT = 'subnetOutput',\n}\nexport enum CameraNodeType {\n\tCUBE = 'cubeCamera',\n\tMAPBOX = 'mapboxCamera',\n\tORTHOGRAPHIC = 'orthographicCamera',\n\tPERSPECTIVE = 'perspectiveCamera',\n}\nexport enum CameraSopNodeType {\n\tCONTROLS = 'cameraControls',\n\tCSS_RENDERER = 'cameraCSSRenderer',\n\tFPS = 'cameraFPS',\n\tFRAME_MODE = 'cameraFrameMode',\n\tPOST_PROCESS = 'cameraPostProcess',\n\tRENDER_SCENE = 'cameraRenderScene',\n\tRENDERER = 'cameraRenderer',\n\tVIEWER_CODE = 'cameraViewerCode',\n\tVIEW_OFFSET = 'cameraViewOffset',\n\tWEBXR_AR = 'cameraWebXRAR',\n\tWEBXR_VR = 'cameraWebXRVR',\n\tWEBXR_AR_MARKER_TRACKING = 'cameraWebXRARMarkerTracking',\n}\nexport const CAMERA_TYPES = [CameraNodeType.MAPBOX, CameraNodeType.ORTHOGRAPHIC, CameraNodeType.PERSPECTIVE];\n\nexport enum CameraControlsNodeType {\n\t// DEVICE_ORIENTATION = 'cameraDeviceOrientationControls',\n\tMAP = 'cameraMapControls',\n\tORBIT = 'cameraOrbitControls',\n\tPAN_ZOOM = 'cameraPanZoomControls',\n\tFIRST_PERSON = 'firstPersonControls',\n\tPLAYER = 'playerControls',\n\tMOBILE_JOYSTICK = 'mobileJoystickControls',\n}\n// export const CAMERA_CONTROLS_NODE_TYPES: Readonly<string[]> = [\n// \t// CameraControlsNodeType.DEVICE_ORIENTATION,\n// \tCameraControlsNodeType.MAP,\n// \tCameraControlsNodeType.ORBIT,\n// \tCameraControlsNodeType.FIRST_PERSON,\n// \tCameraControlsNodeType.MOBILE_JOYSTICK,\n// ];\nexport enum AudioNodeAnalyserType {\n\tFFT = 'FFT',\n\tMETER = 'meter',\n\tWAVEFORM = 'waveform',\n}\nexport const AUDIO_ANALYSER_NODES: Readonly<string[]> = [\n\tAudioNodeAnalyserType.FFT,\n\tAudioNodeAnalyserType.METER,\n\tAudioNodeAnalyserType.WAVEFORM,\n];\n\nexport type NodeTypeMapGeneric = {[key in NodeContext]: TypedNode<key, any>};\nexport interface BaseNodeByContextMap extends NodeTypeMapGeneric {\n\t[NodeContext.ANIM]: BaseAnimNodeType;\n\t[NodeContext.AUDIO]: BaseAudioNodeType;\n\t[NodeContext.COP]: BaseCopNodeType;\n\t[NodeContext.EVENT]: BaseEventNodeType;\n\t[NodeContext.GL]: BaseGlNodeType;\n\t[NodeContext.JS]: BaseJsNodeType;\n\t[NodeContext.MANAGER]: BaseManagerNodeType;\n\t[NodeContext.MAT]: BaseMatNodeType;\n\t[NodeContext.OBJ]: BaseObjNodeType;\n\t[NodeContext.POST]: BasePostProcessNodeType;\n\t[NodeContext.SOP]: BaseSopNodeType;\n\t[NodeContext.ROP]: BaseRopNodeType;\n}\n\n// export interface ChildrenNodeMapByContextMap {\n// \t[NodeContext.ANIM]: AnimNodeChildrenMap;\n// \t[NodeContext.AUDIO]: AudioNodeChildrenMap;\n// \t[NodeContext.COP]: CopNodeChildrenMap;\n// \t[NodeContext.EVENT]: EventNodeChildrenMap;\n// \t[NodeContext.GL]: GlNodeChildrenMap;\n// \t[NodeContext.JS]: JsNodeChildrenMap;\n// \t[NodeContext.MANAGER]: {};\n// \t[NodeContext.MAT]: MatNodeChildrenMap;\n// \t[NodeContext.OBJ]: ObjNodeChildrenMap;\n// \t[NodeContext.POST]: PostNodeChildrenMap;\n// \t[NodeContext.SOP]: GeoNodeChildrenMap;\n// \t[NodeContext.ROP]: RopNodeChildrenMap;\n// }\n\nexport interface NodeContextAndType {\n\tcontext: NodeContext;\n\ttype: string;\n}\n","// events\nexport enum NodeEvent {\n\tCREATED = 'node_created',\n\tDELETED = 'node_deleted',\n\tNAME_UPDATED = 'node_name_update',\n\tOVERRIDE_CLONABLE_STATE_UPDATE = 'node_override_clonable_state_update',\n\tNAMED_OUTPUTS_UPDATED = 'node_named_outputs_updated',\n\tNAMED_INPUTS_UPDATED = 'node_named_inputs_updated',\n\tINPUTS_UPDATED = 'node_inputs_updated',\n\tPARAMS_UPDATED = 'node_params_updated',\n\tUI_DATA_POSITION_UPDATED = 'node_ui_data_position_updated',\n\tUI_DATA_COMMENT_UPDATED = 'node_ui_data_comment_updated',\n\tERROR_UPDATED = 'node_error_updated',\n\tFLAG_BYPASS_UPDATED = 'bypass_flag_updated',\n\tFLAG_DISPLAY_UPDATED = 'display_flag_updated',\n\tFLAG_OPTIMIZE_UPDATED = 'optimize_flag_updated',\n\tSELECTION_UPDATED = 'selection_updated',\n\tPOLY_NODE_LOCK_STATE_UPDATED = 'lock_state_updated',\n}\n","export enum ParamEvent {\n\tVISIBLE_UPDATED = 'param_visible_updated',\n\tEDITABLE_UPDATED = 'param_editable_updated',\n\t// UPDATED = 'param_updated',\n\tRAW_INPUT_UPDATED = 'raw_input_updated',\n\tVALUE_UPDATED = 'param_value_updated',\n\tEXPRESSION_UPDATED = 'param_expression_update',\n\tERROR_UPDATED = 'param_error_updated',\n\tDELETED = 'param_deleted',\n\tASSET_RELOAD_REQUEST = 'param_asset_reload_request',\n}\n","export enum ParamType {\n\tBOOLEAN = 'boolean',\n\tBUTTON = 'button',\n\tCOLOR = 'color',\n\tFLOAT = 'float',\n\tFOLDER = 'folder',\n\tINTEGER = 'integer',\n\tPARAM_PATH = 'param_path',\n\tNODE_PATH = 'node_path',\n\tRAMP = 'ramp',\n\tSTRING = 'string',\n\tVECTOR2 = 'vector2',\n\tVECTOR3 = 'vector3',\n\tVECTOR4 = 'vector4',\n}\n// export type ParamTypeKey = ParamType\n// export type ParamTypeKeysArray = Array<ParamTypeKey>\n// const ParamTypeKeysArray: ParamTypeKeysArray = [ParamType.BOOLEAN]\n","import {BaseSopNodeType} from '../nodes/sop/_Base';\nimport {PolyScene} from '../scene/PolyScene';\nimport {CoreObjectType, ObjectContent} from '../../core/geometry/ObjectContent';\nimport {Object3D} from 'three';\nimport {Poly} from '../Poly';\nimport {updateObjectChildrenCountRef} from '../../core/reactivity/ObjectHierarchyReactivity';\nimport {ON_OBJECT_BEFORE_DELETE} from '../../core/geometry/Event';\nimport {deregisterGeneratorsForObject} from '../nodes/js/code/assemblers/actor/ActorEvaluatorGenerator';\n\nenum HandlerName {\n\tADD = 'onObjectAddHookHandlerNodeIds',\n\tREMOVE = 'onObjectRemoveHookHandlerNodeIds',\n}\n// enum CompletedHandlerName {\n// \tADD = 'onObjectAddHookHandlerNodeIds_Completed',\n// \tREMOVE = 'onObjectRemoveHookHandlerNodeIds_Completed',\n// }\n// function _completedHandlerName(handlerName: HandlerName) {\n// \tswitch (handlerName) {\n// \t\tcase HandlerName.ADD:\n// \t\t\treturn CompletedHandlerName.ADD;\n// \t\tcase HandlerName.REMOVE:\n// \t\t\treturn CompletedHandlerName.REMOVE;\n// \t}\n// }\ninterface HookHandler {\n\tgraphNodeId(): number;\n\tupdateObjectOnAdd(object: ObjectContent<CoreObjectType>, parent: ObjectContent<CoreObjectType>): void;\n\tupdateObjectOnRemove(object: ObjectContent<CoreObjectType>, parent: ObjectContent<CoreObjectType>): void;\n}\nfunction assignHookHandler(object: ObjectContent<CoreObjectType>, node: HookHandler, handlerName: HandlerName) {\n\tlet ids = hookHandlers(object, handlerName);\n\tif (!ids) {\n\t\tids = [];\n\t\tobject.userData[handlerName] = ids;\n\t}\n\tconst id = node.graphNodeId();\n\tif (!ids.includes(id)) {\n\t\tids.push(id);\n\t}\n}\ntype ObjectOnAddRemoveCallback = (object: ObjectContent<CoreObjectType>) => void;\nconst onAddRemoveCallbackByObject = new WeakMap<\n\tObjectContent<CoreObjectType>,\n\tMap<HandlerName, Set<ObjectOnAddRemoveCallback>>\n>();\nfunction assignOnAddRemoveHook(\n\tobject: ObjectContent<CoreObjectType>,\n\thandlerName: HandlerName,\n\thook: ObjectOnAddRemoveCallback\n) {\n\tlet mapForObject = onAddRemoveCallbackByObject.get(object);\n\tif (!mapForObject) {\n\t\tmapForObject = new Map();\n\t\tonAddRemoveCallbackByObject.set(object, mapForObject);\n\t}\n\tlet callbacksForHandlerName = mapForObject.get(handlerName);\n\tif (!callbacksForHandlerName) {\n\t\tcallbacksForHandlerName = new Set();\n\t\tmapForObject.set(handlerName, callbacksForHandlerName);\n\t}\n\tcallbacksForHandlerName.add(hook);\n}\nfunction runOnAddRemoveHooks(object: ObjectContent<CoreObjectType>, handlerName: HandlerName) {\n\tconst mapForObject = onAddRemoveCallbackByObject.get(object);\n\tif (!mapForObject) {\n\t\treturn;\n\t}\n\tconst callbacksForHandlerName = mapForObject.get(handlerName);\n\tif (!callbacksForHandlerName) {\n\t\treturn;\n\t}\n\tfor (const callback of callbacksForHandlerName) {\n\t\tcallback(object);\n\t}\n}\n// function removeHookHandler(object: ObjectContent<CoreObjectType>, node: HookHandler, handlerName: HandlerName) {\n// \tlet ids = hookHandlers(object, handlerName);\n// \tif (ids) {\n// \t\tconst index = ids.indexOf(node.graphNodeId());\n// \t\tids.splice(index, 1);\n// \t}\n// }\n// function assignCompletedHookHandler(\n// \tobject: ObjectContent<CoreObjectType>,\n// \tnode: HookHandler,\n// \thandlerName: HandlerName\n// ) {\n// \tconst completedHandlerName = _completedHandlerName(handlerName);\n// \tlet ids = completedHookHandlers(object, completedHandlerName);\n// \tif (!ids) {\n// \t\tids = [];\n// \t\tobject.userData[completedHandlerName] = ids;\n// \t}\n// \tconst id = node.graphNodeId();\n// \tif (!ids.includes(id)) {\n// \t\tids.push(id);\n// \t}\n// }\n\nfunction hookHandlers(object: ObjectContent<CoreObjectType>, handlerName: HandlerName) {\n\treturn object.userData[handlerName] as number[] | undefined;\n}\n// function completedHookHandlers(object: ObjectContent<CoreObjectType>, handlerName: CompletedHandlerName) {\n// \treturn object.userData[handlerName] as number[] | undefined;\n// }\nfunction runHooks(scene: PolyScene, parent: ObjectContent<CoreObjectType>, handlerName: HandlerName) {\n\tconst children = parent.children;\n\tfor (const child of children) {\n\t\tchild.traverse((grandChild) => {\n\t\t\trunHookOnObject(grandChild, scene, handlerName);\n\t\t});\n\t}\n}\nfunction runHookOnObject(object: ObjectContent<CoreObjectType>, scene: PolyScene, handlerName: HandlerName) {\n\trunOnAddRemoveHooks(object, handlerName);\n\n\tif (object.parent) {\n\t\tconst ids = hookHandlers(object, handlerName);\n\t\tif (!ids) {\n\t\t\treturn;\n\t\t}\n\t\t// const completedHandlersIds = completedHookHandlers(object, _completedHandlerName(handlerName));\n\t\t// if (completedHandlersIds) {\n\t\t// \tfor (const id of completedHandlersIds) {\n\t\t// \t\tconst index = ids.indexOf(id);\n\t\t// \t\tif (index >= 0) {\n\t\t// \t\t\tids.splice(index, 1);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\t\tfor (const id of ids) {\n\t\t\tconst node = scene.graph.nodeFromId(id) as BaseSopNodeType | undefined;\n\t\t\tif (node && !node.disposed()) {\n\t\t\t\t// when traversing the scene to run the hooks\n\t\t\t\t// we must be very careful to note update the hierarchy\n\t\t\t\t// with .add and .remove, as this will make .traverse unpredictable.\n\t\t\t\t// Instead, children must be replaced directly with:\n\t\t\t\t//\n\t\t\t\t// const index = parent.children.indexOf(oldObject);\n\t\t\t\t// parent.children[index] = newObject;\n\t\t\t\t// newObject.parent = parent;\n\n\t\t\t\t// we need to remove the handler before processing the object,\n\t\t\t\t// to avoid cases where it might be processed multiple times.\n\t\t\t\t// This can happen on scene load, and also when multiple objects are added via the same node,\n\t\t\t\t// and only one is new. This will still trigger the hook on the already-added objects\n\t\t\t\t// UPDATE: this impacts the particles, which are not generated correctly\n\t\t\t\t// removeHookHandler(object, node, handlerName);\n\t\t\t\tswitch (handlerName) {\n\t\t\t\t\tcase HandlerName.ADD: {\n\t\t\t\t\t\tnode.updateObjectOnAdd(object, object.parent);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase HandlerName.REMOVE: {\n\t\t\t\t\t\tnode.updateObjectOnRemove(object, object.parent);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// assignCompletedHookHandler(object, node, handlerName);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function replaceChild(parent: Object3D, oldObject: Object3D, newObject: Object3D) {\n\t// new object replaces old Object directly,\n\t// and not using .remove and .add,\n\t// as this would make traversing the scenes from the hooks handler\n\t// unpredictable.\n\tconst index = parent.children.indexOf(oldObject);\n\tif (index < 0) {\n\t\tconsole.warn('could not find object to replace');\n\t\treturn;\n\t}\n\tparent.children[index] = newObject;\n\tnewObject.parent = parent;\n\t// parent.remove(object);\n\t// parent.add(CSSObject);\n}\nexport function removeFromParent(scene: PolyScene, object: ObjectContent<CoreObjectType>) {\n\tconst parent = object.parent;\n\tif (!parent) {\n\t\treturn;\n\t}\n\tobject.dispatchEvent(ON_OBJECT_BEFORE_DELETE);\n\tderegisterGeneratorsForObject(object);\n\tPoly.onObjectsAddRemoveHooks.runOnRemoveHookOnObject(scene, object);\n\tparent.remove(object);\n\tupdateObjectChildrenCountRef(parent);\n}\nexport function addToParent(\n\tscene: PolyScene,\n\tparent: ObjectContent<CoreObjectType>,\n\tchild: ObjectContent<CoreObjectType>\n) {\n\tparent.add(child);\n\tupdateObjectChildrenCountRef(parent);\n\tPoly.onObjectsAddRemoveHooks.runOnAddHookOnObject(scene, child);\n}\n// export function replaceChildWithCallbackObject(\n// \tparent: Object3D,\n// \toldObject: Object3D,\n// \tnewObjectCallback: () => Object3D\n// ) {\n// \tconst index = parent.children.indexOf(oldObject);\n// \tconst newObject = newObjectCallback();\n// \tparent.children[index] = newObject;\n// \tnewObject.parent = parent;\n// }\nexport function copyBasicObjectProperties(srcObject: Object3D, destObject: Object3D) {\n\tdestObject.name = srcObject.name;\n\tdestObject.matrixAutoUpdate = srcObject.matrixAutoUpdate;\n\tdestObject.frustumCulled = srcObject.frustumCulled;\n\tdestObject.layers = srcObject.layers;\n\tdestObject.position.copy(srcObject.position);\n\tdestObject.quaternion.copy(srcObject.quaternion);\n\tdestObject.scale.copy(srcObject.scale);\n\tdestObject.matrix.copy(srcObject.matrix);\n}\n\nexport class PolyOnObjectsAddRemoveHooksController {\n\tassignOnAddHookHandler(object: ObjectContent<CoreObjectType>, node: HookHandler) {\n\t\tassignHookHandler(object, node, HandlerName.ADD);\n\t}\n\tassignOnRemoveHookHandler(object: ObjectContent<CoreObjectType>, node: HookHandler) {\n\t\tassignHookHandler(object, node, HandlerName.REMOVE);\n\t}\n\tassignOnAddHookCallback(object: ObjectContent<CoreObjectType>,callback: ObjectOnAddRemoveCallback) {\n\t\tassignOnAddRemoveHook(object, HandlerName.ADD, callback);\n\t}\n\tassignOnRemoveHookCallback(object: ObjectContent<CoreObjectType>,callback: ObjectOnAddRemoveCallback) {\n\t\tassignOnAddRemoveHook(object, HandlerName.REMOVE, callback);\n\t}\n\n\trunOnAddHooks(scene: PolyScene, parent: ObjectContent<CoreObjectType>) {\n\t\trunHooks(scene, parent, HandlerName.ADD);\n\t}\n\trunOnRemoveHooks(scene: PolyScene, parent: ObjectContent<CoreObjectType>) {\n\t\trunHooks(scene, parent, HandlerName.REMOVE);\n\t}\n\trunOnAddHookOnObject(scene: PolyScene, object: ObjectContent<CoreObjectType>) {\n\t\trunHookOnObject(object, scene, HandlerName.ADD);\n\t}\n\trunOnRemoveHookOnObject(scene: PolyScene, object: ObjectContent<CoreObjectType>) {\n\t\trunHookOnObject(object, scene, HandlerName.REMOVE);\n\t}\n}\n","export enum SceneEvent {\n\tMAX_FRAME_UPDATED = 'scene_maxFrameUpdated',\n\tREALTIME_STATUS_UPDATED = 'scene_realtime_status_updated',\n\tFRAME_UPDATED = 'scene_frame_updated',\n\tPLAY_STATE_UPDATED = 'scene_play_state_updated',\n}\n","// import {BaseNodeType} from '../../../nodes/_Base';\n\nexport enum AssemblerName {\n\tGL_CLOTH = 'GL_CLOTH',\n\tGL_LINE = 'GL_LINE',\n\tGL_MESH_BASIC = 'GL_MESH_BASIC',\n\tGL_MESH_DEPTH = 'GL_MESH_DEPTH',\n\tGL_MESH_DISTANCE = 'GL_MESH_DISTANCE',\n\tGL_MESH_LAMBERT = 'GL_MESH_LAMBERT',\n\tGL_MESH_PHONG = 'GL_MESH_PHONG',\n\tGL_MESH_PHYSICAL = 'GL_MESH_PHYSICAL',\n\tGL_MESH_STANDARD = 'GL_MESH_STANDARD',\n\tGL_MESH_TOON = 'GL_MESH_TOON',\n\tGL_PARTICLES = 'GL_PARTICLES',\n\tGL_POINTS = 'GL_POINTS',\n\tGL_POST = 'GL_POST',\n\tGL_RAYMARCHING = 'GL_RAYMARCHING',\n\tGL_TEXTURE = 'GL_TEXTURE',\n\tGL_TEXTURE_2D_ARRAY = 'GL_TEXTURE_2D_ARRAY',\n\tGL_VOLUME = 'GL_VOLUME',\n\t//\n\tJS_ACTOR = 'JS_ACTOR',\n\tJS_ENTITY_BUILDER = 'JS_ENTITY_BUILDER',\n\tJS_INSTANCE_BUILDER = 'JS_INSTANCE_BUILDER',\n\tJS_OBJECT_BUILDER = 'JS_OBJECT_BUILDER',\n\tJS_POINT_BUILDER = 'JS_POINT_BUILDER',\n\tJS_SDF = 'JS_SDF',\n\tJS_SOFT_BODY = 'JS_SOFT_BODY',\n}\n\nexport interface ControllerAssemblerPair {\n\tcontroller: any;\n\tassembler: any;\n}\ntype TraverseCallback = (pair: ControllerAssemblerPair, name: AssemblerName) => void;\nexport class BaseAssemblersRegister {\n\tprotected _controllerAssemblerByName: Map<AssemblerName, ControllerAssemblerPair> = new Map();\n\n\tregister(name: AssemblerName, controller: any, assembler: any) {\n\t\tthis._controllerAssemblerByName.set(name, {\n\t\t\tcontroller: controller,\n\t\t\tassembler: assembler,\n\t\t});\n\t}\n\n\tunregister(name: AssemblerName) {\n\t\tthis._controllerAssemblerByName.delete(name);\n\t}\n\n\ttraverse(callback: TraverseCallback) {\n\t\tthis._controllerAssemblerByName.forEach(callback);\n\t}\n}\n","export enum ModuleName {\n\tCAD = 'CAD',\n\tCSG = 'CSG',\n\tGSAP = 'GSAP',\n\tPBR = 'PBR',\n\tPOLY_ANIM = 'POLY_ANIM',\n\tPOLY_GL = 'POLY_GL',\n\tPOLY_JS = 'POLY_JS',\n\tPOLY_OBJ = 'POLY_OBJ',\n\tPOLY_SOP = 'POLY_SOP',\n\tQUAD = 'QUAD',\n\tSDF = 'SDF',\n\tTET = 'TET',\n}\n","export enum AnimType {\n\tCOPY = 'copy',\n\tEASING = 'easing',\n\tPLAY = 'play',\n\tTARGET = 'target',\n}\n","export enum AudioType {\n\tAM_SYNTH = 'AMSynth',\n\tFM_SYNTH = 'FMSynth',\n\tFILE = 'file',\n\tMONO_SYNTH = 'monoSynth',\n\tPOLY_SYNTH = 'polySynth',\n\tSAMPLER = 'sampler',\n\tSWITCH = 'switch',\n\tSYNTH = 'synth',\n}\n","export enum CopType {\n\tBUILDER = 'builder',\n\tBUILDER_2D_ARRAY = 'builder2DArray',\n\tCUBE_MAP = 'cubeMap',\n\tCUBE_CAMERA = 'cubeCamera',\n\tCUBE_MAP_FROM_SCENE = 'cubeMapFromScene',\n\tENV_MAP = 'envMap',\n\tGIF = 'gif',\n\tLIGHT_MAP = 'lightMap',\n\tLUT = 'lut',\n\tRENDER = 'render',\n\tSDF_BLUR = 'SDFBlur',\n\tSDF_FROM_OBJECT = 'SDFFromObject',\n\tSDF_FROM_URL = 'SDFFromUrl',\n\tSNAPSHOT = 'snapshot',\n\tTEXT = 'text',\n\tVIDEO = 'video',\n\tWEB_CAM = 'webCam',\n}\n\nexport enum CopTypeImage {\n\tIMAGE = 'image',\n\tIMAGE_EXR = 'imageEXR',\n\tIMAGE_HDR = 'imageHDR',\n\tIMAGE_KTX2 = 'imageKTX2',\n}\n","export enum EventInputType {\n\tDRAG = 'drag',\n\tKEYBOARD = 'keyboard',\n\tMOUSE = 'mouse',\n\tPOINTER = 'pointer',\n\tTOUCH = 'touch',\n\tWINDOW = 'window',\n}\n","export enum GlType {\n\tADJACENT_POINTS_ATTRIB_SMOOTH = 'adjacentPointsAttribSmooth',\n\tADJACENT_UV_ATTRIB_SMOOTH = 'adjacentUvAttribSmooth',\n\tATTRIBUTE = 'attribute',\n\tCOMPUTE_NORMALS = 'computeNormals',\n\tCONSTANT = 'constant',\n\tFOR_LOOP = 'forLoop',\n\tIF_THEN = 'ifThen',\n\tGLOBALS = 'globals',\n\tNOISE = 'noise',\n\tOUTPUT = 'output',\n\tPARAM = 'param',\n\tRAMP = 'ramp',\n\t// SDF\n\tSDF_2D_BOX = 'SDF2DBox',\n\tSDF_2D_CIRCLE = 'SDF2DCircle',\n\tSDF_2D_CROSS = 'SDF2DCross',\n\tSDF_2D_HEART = 'SDF2DHeart',\n\tSDF_2D_ROUNDED_X = 'SDF2DRoundedX',\n\tSDF_2D_STAIRS = 'SDF2DStairs',\n\tSDF_BOX = 'SDFBox',\n\tSDF_BOX_FRAME = 'SDFBoxFrame',\n\tSDF_BOX_ROUND = 'SDFBoxRound',\n\tSDF_CAPSULE = 'SDFCapsule',\n\tSDF_CAPSULE_VERTICAL = 'SDFCapsuleVertical',\n\tSDF_CONE = 'SDFCone',\n\tSDF_CONE_ROUND = 'SDFConeRound',\n\tSDF_ELONGATE = 'SDFElongate',\n\tSDF_FRACTAL_MANDELBROT = 'SDFFractalMandelbrot',\n\tSDF_GRADIENT = 'SDFGradient',\n\tSDF_HEXAGONAL_PRISM = 'SDFHexagonalPrism',\n\tSDF_HORSE_SHOE = 'SDFHorseShoe',\n\tSDF_LINK = 'SDFLink',\n\tSDF_OCTAHEDRON = 'SDFOctahedron',\n\tSDF_OCTOGONAL_PRISM = 'SDFOctogonalPrism',\n\tSDF_ONION = 'SDFOnion',\n\tSDF_PLANE = 'SDFPlane',\n\tSDF_PYRAMID = 'SDFPyramid',\n\tSDF_QUAD = 'SDFQuad',\n\tSDF_REPEAT_POLAR = 'SDFRepeatPolar',\n\tSDF_REVOLUTION = 'SDFRevolution',\n\tSDF_RHOMBUS = 'SDFRhombus',\n\tSDF_RHOMBUS_TRIACONTAHEDRON = 'SDFRhombusTriacontahedron',\n\tSDF_SOLID_ANGLE = 'SDFSolidAngle',\n\tSDF_SPHERE = 'SDFSphere',\n\tSDF_SPHERE_CUT = 'SDFSphereCut',\n\tSDF_SPHERE_HOLLOW = 'SDFSphereHollow',\n\tSDF_TORUS = 'SDFTorus',\n\tSDF_TRANSFORM = 'SDFTransform',\n\tSDF_TRIANGULAR_PRISM = 'SDFTriangularPrism',\n\tSDF_TRIANGLE = 'SDFTriangle',\n\tSDF_TUBE = 'SDFTube',\n\tSDF_TWIST = 'SDFTwist',\n\tSDF_CONTEXT = 'SDFContext',\n\tSDF_MATERIAL = 'SDFMaterial',\n\t//\n\tTEXTURE = 'texture',\n\tTEXTURE_DISPLACEMENT = 'textureDisplacement',\n\tTEXTURE_SDF = 'textureSDF',\n\tVARYING_READ = 'varyingRead',\n\tVARYING_WRITE = 'varyingWrite',\n\tVERTEX_ANIMATION_TEXTURE = 'vertexAnimationTexture',\n\tVERTEX_ANIMATION_TEXTURE_INTERPOLATED = 'vertexAnimationTextureInterpolated',\n}\n","export enum JsType {\n\tANIMATION_MIXER = 'animationMixer',\n\tANIMATION_MIXER_UPDATE = 'animationMixerUpdate',\n\tATTRIBUTE = 'attribute',\n\tCODE = 'code',\n\tCURSOR = 'cursor',\n\tFOR_LOOP = 'forLoop',\n\tGEOLOCATION_CURRENT_POSITION = 'geolocationCurrentPosition',\n\tGET_INSTANCE_ATTRIBUTE = 'getInstanceAttribute',\n\tGET_INSTANCE_PROPERTY = 'getInstanceProperty',\n\tGET_OBJECT_ATTRIBUTE = 'getObjectAttribute',\n\tGET_OBJECT_PROPERTY = 'getObjectProperty',\n\tGET_OBJECT_USER_DATA = 'getObjectUserData',\n\tGET_NODE = 'getNode',\n\tGET_PARAM = 'getParam',\n\tGET_POINT_ATTRIBUTE = 'getPointAttribute',\n\tGET_POINT_PROPERTY = 'getPointProperty',\n\tGET_PRIMITIVE_ATTRIBUTE = 'getPrimitiveAttribute',\n\tGLOBALS = 'globals',\n\tGLOBALS_AMBIENT_LIGHT = 'globalsAmbientLight',\n\tGLOBALS_AREA_LIGHT = 'globalsAreaLight',\n\tGLOBALS_DIRECTIONAL_LIGHT = 'globalsDirectionalLight',\n\tGLOBALS_HEMISPHERE_LIGHT = 'globalsHemisphereLight',\n\tGLOBALS_POINT_LIGHT = 'globalsPointLight',\n\tGLOBALS_SPOT_LIGHT = 'globalsSpotLight',\n\tIMPORT_ATTRIBUTE = 'importAttribute',\n\tKEYFRAMES = 'keyframes',\n\tON_CHILD_ATTRIBUTE_UPDATE = 'onChildAttributeUpdate',\n\tON_KEY = 'onKey',\n\tON_KEYDOWN = 'onKeydown',\n\tON_KEYPRESS = 'onKeypress',\n\tON_KEYUP = 'onKeyup',\n\tON_MAPBOX_CAMERA_MOVE = 'onMapboxCameraMove',\n\tON_MAPBOX_CAMERA_MOVE_START = 'onMapboxCameraMoveStart',\n\tON_MAPBOX_CAMERA_MOVE_END = 'onMapboxCameraMoveEnd',\n\tON_OBJECT_ATTRIBUTE_UPDATE = 'onObjectAttributeUpdate',\n\tON_OBJECT_BEFORE_DELETE = 'onObjectBeforeDelete',\n\tON_OBJECT_CLICK = 'onObjectClick',\n\tON_OBJECT_CLICK_GPU = 'onObjectClickGPU',\n\tON_OBJECT_CONTEXT_MENU = 'onObjectContextMenu',\n\tON_OBJECT_CONTEXT_MENU_GPU = 'onObjectContextMenuGPU',\n\tON_OBJECT_DOUBLE_CLICK = 'onObjectDoubleClick',\n\tON_OBJECT_DISPATCH_EVENT = 'onObjectDispatchEvent',\n\tON_OBJECT_HOVER = 'onObjectHover',\n\tON_OBJECT_HOVER_GPU = 'onObjectHoverGPU',\n\tON_OBJECT_LONG_PRESS = 'onObjectLongPress',\n\tON_OBJECT_LONG_PRESS_GPU = 'onObjectLongPressGPU',\n\tON_OBJECT_MOUSE_CLICK = 'onObjectMouseClick',\n\tON_OBJECT_POINTERDOWN = 'onObjectPointerdown',\n\tON_OBJECT_POINTERDOWN_GPU = 'onObjectPointerdownGPU',\n\tON_OBJECT_POINTERUP = 'onObjectPointerup',\n\tON_OBJECT_POINTERUP_GPU = 'onObjectPointerupGPU',\n\tON_OBJECT_SWIPE = 'onObjectSwipe',\n\tON_OBJECT_SWIPE_GPU = 'onObjectSwipeGPU',\n\tON_OBJECT_SWIPEDOWN = 'onObjectSwipedown',\n\tON_OBJECT_SWIPELEFT = 'onObjectSwipeleft',\n\tON_OBJECT_SWIPERIGHT = 'onObjectSwiperight',\n\tON_OBJECT_SWIPEUP = 'onObjectSwipeup',\n\tON_POINTERDOWN = 'onPointerdown',\n\tON_POINTERUP = 'onPointerup',\n\tON_SCENE_PAUSE = 'onScenePause',\n\tON_SCENE_PLAY = 'onScenePlay',\n\tON_SCENE_RESET = 'onSceneReset',\n\tON_SCROLL = 'onScroll',\n\tON_MANUAL_TRIGGER = 'onManualTrigger',\n\tON_TICK = 'onTick',\n\tON_PERFORMANCE_CHANGE = 'onPerformanceChange',\n\tON_VIDEO_EVENT = 'onVideoEvent',\n\tON_VIEWER_CONTROLS_EVENT = 'onViewerControlsEvent',\n\tON_WEBXR_CONTROLLER_EVENT = 'onWebXRControllerEvent',\n\tOUTPUT = 'output',\n\tOUTPUT_AMBIENT_LIGHT = 'outputAmbientLight',\n\tOUTPUT_AREA_LIGHT = 'outputAreaLight',\n\tOUTPUT_DIRECTIONAL_LIGHT = 'outputDirectionalLight',\n\tOUTPUT_HEMISPHERE_LIGHT = 'outputHemisphereLight',\n\tOUTPUT_POINT_LIGHT = 'outputPointLight',\n\tOUTPUT_SPOT_LIGHT = 'outputSpotLight',\n\tPARAM = 'param',\n\tRAY_FROM_CURSOR = 'rayFromCursor',\n\tRAY_FROM_CAMERA = 'rayFromCamera',\n\t// SDF\n\tSDF_2D_BOX = 'SDF2DBox',\n\tSDF_2D_CIRCLE = 'SDF2DCircle',\n\tSDF_2D_CROSS = 'SDF2DCross',\n\tSDF_2D_HEART = 'SDF2DHeart',\n\tSDF_2D_ROUNDED_X = 'SDF2DRoundedX',\n\tSDF_BOX = 'SDFBox',\n\tSDF_ELONGATE = 'SDFElongate',\n\tSDF_ONION = 'SDFOnion',\n\tSDF_PLANE = 'SDFPlane',\n\tSDF_REVOLUTION = 'SDFRevolution',\n\tSDF_SPHERE = 'SDFSphere',\n\tSDF_TORUS = 'SDFTorus',\n\tSDF_TRANSFORM = 'SDFTransform',\n\tSDF_TUBE = 'SDFTube',\n\t// set\n\tSET_INSTANCE_ATTRIBUTE = 'setInstanceAttribute',\n\tSET_INSTANCE_LOOK_AT = 'setInstanceLookAt',\n\tSET_INSTANCE_POSITION = 'setInstancePosition',\n\tSET_INSTANCE_QUATERNION = 'setInstanceQuaternion',\n\tSET_INSTANCE_SCALE = 'setInstanceScale',\n\tSET_OBJECT_ATTRIBUTE = 'setObjectAttribute',\n\tSET_OBJECT_LOOK_AT = 'setObjectLookAt',\n\tSET_OBJECT_POSITION = 'setObjectPosition',\n\tSET_OBJECT_QUATERNION = 'setObjectQuaternion',\n\tSET_OBJECT_ROTATION = 'setObjectRotation',\n\tSET_OBJECT_SCALE = 'setObjectScale',\n\tSET_PARAM = 'setParam',\n\tSET_PHYSICS_RBD_POSITION = 'setPhysicsRBDPosition',\n\tSET_PLAYER_INPUT = 'setPlayerInput',\n\tSET_POINT_ATTRIBUTE = 'setPointAttribute',\n\tSET_POINT_POSITION = 'setPointPosition',\n\tSET_SOFT_BODY_CONSTRAINT_POSITION = 'setSoftBodyConstraintPosition',\n\tSET_SOFT_BODY_POSITION = 'setSoftBodyPosition',\n\tSET_SOFT_BODY_VELOCITY = 'setSoftBodyVelocity',\n\tSET_WFC_SOFT_CONSTRAINT = 'setWFCSoftConstraint',\n\t// TEXTURE_SDF = 'textureSDF',\n\tWFC_BUILD = 'WFCBuild',\n}\n","export enum LightType {\n\tAREA = 'areaLight',\n\tDIRECTIONAL = 'directionalLight',\n\tHEMISPHERE = 'hemisphereLight',\n\tPOINT = 'pointLight',\n\tPROBE = 'lightProbe',\n\tSPOT = 'spotLight',\n}\nexport enum THREELightType {\n\tAREA = 'AreaLight',\n\tDIRECTIONAL = 'DirectionalLight',\n\tHEMISPHERE = 'HemisphereLight',\n\tPOINT = 'PointLight',\n\tSPOT = 'SpotLight',\n}\n","export enum ObjType {\n\tGEO = 'geo',\n\tCUBE_CAMERA = 'cubeCamera',\n\tAUDIO_LISTENER = 'audioListener',\n\tPOSITIONAL_AUDIO = 'positionalAudio',\n\tSCENE = 'scene',\n}\n","export enum PostType {\n\tBUILDER = 'builder',\n\tEFFECT_PASS = 'effectPass',\n\tTEXTURE = 'texture',\n\tUPDATE_SCENE = 'updateScene',\n}\n","export enum RopType {\n\tCSS2D = 'CSS2DRenderer',\n\tCSS3D = 'CSS3DRenderer',\n\tWEBGL = 'WebGLRenderer',\n\tWEBGPU = 'WebGPURenderer',\n\tPATH_TRACING = 'pathTracingRenderer',\n}\n","export enum SopType {\n\tACTOR = 'actor',\n\tACTOR_INSTANCE = 'actorInstance',\n\tACTOR_POINT = 'actorPoint',\n\tADD = 'add',\n\tADJACENCY = 'adjacency',\n\tANIMATION_COPY = 'animationCopy',\n\tATTRIB_ADD_MULT = 'attribAddMult',\n\tATTRIB_COPY = 'attribCopy',\n\tATTRIB_CREATE = 'attribCreate',\n\tATTRIB_DELETE = 'attribDelete',\n\tATTRIB_ID = 'attribId',\n\tATTRIB_PROMOTE = 'attribPromote',\n\tATTRIB_RENAME = 'attribRename',\n\tATTRIB_SET_AT_INDEX = 'attribSetAtIndex',\n\tATTRIB_TRANSFER = 'attribTransfer',\n\tAUDIO_NOTES = 'audioNotes',\n\tAXES_HELPER = 'axesHelper',\n\tBBOX_SCATTER = 'bboxScatter',\n\tBLEND = 'blend',\n\tBOX = 'box',\n\tBOX_LINES = 'boxLines',\n\tBVH = 'BVH',\n\tBVH_VISUALIZER = 'BVHVisualizer',\n\tCACHE = 'cache',\n\t//\n\tCAD_BOOLEAN = 'CADBoolean',\n\tCAD_BOX = 'CADBox',\n\tCAD_CIRCLE = 'CADCircle',\n\tCAD_CIRCLE_2D = 'CADCircle2D',\n\tCAD_CIRCLE_3_POINTS = 'CADCircle3Points',\n\tCAD_CONE = 'CADCone',\n\tCAD_CONVERT_DIMENSION = 'CADConvertDimension',\n\tCAD_CURVE_2D_TO_SURFACE = 'CADCurve2DToSurface',\n\tCAD_CURVE_FROM_POINTS = 'CADCurveFromPoints',\n\tCAD_CURVE_FROM_POINTS_2D = 'CADCurveFromPoints2D',\n\tCAD_CURVE_TRIM = 'CADCurveTrim',\n\tCAD_ELLIPSE = 'CADEllipse',\n\tCAD_ELLIPSE_2D = 'CADEllipse2D',\n\tCAD_EXPORTER_STEP = 'CADExporterSTEP',\n\tCAD_EXTRUDE = 'CADExtrude',\n\tCAD_FILE_STEP = 'CADFileSTEP',\n\tCAD_FILLET = 'CADFillet',\n\tCAD_GROUP = 'CADGroup',\n\tCAD_LOFT = 'CADLoft',\n\tCAD_MIRROR = 'CADMirror',\n\tCAD_PIPE = 'CADPipe',\n\tCAD_POINT = 'CADPoint',\n\tCAD_POINT_2D = 'CADPoint2D',\n\tCAD_POINTS_FROM_CURVE = 'CADPointsFromCurve',\n\tCAD_RECTANGLE = 'CADRectangle',\n\tCAD_REVOLUTION = 'CADRevolution',\n\tCAD_SEGMENT = 'CADSegment',\n\tCAD_SPHERE = 'CADSphere',\n\tCAD_THICKNESS = 'CADThickness',\n\tCAD_TORUS = 'CADTorus',\n\tCAD_TRANSFORM = 'CADTransform',\n\tCAD_TRANSFORM_2D = 'CADTransform2D',\n\tCAD_TRIANGULATE = 'CADTriangulate',\n\tCAD_TUBE = 'CADTube',\n\tCAD_UNPACK = 'CADUnpack',\n\tCAD_WEDGE = 'CADWedge',\n\t//\n\tCAMERA_PROJECT = 'cameraProject',\n\tCAPSULE = 'capsule',\n\tCIRCLE = 'circle',\n\tCIRCLE_3_POINTS = 'circle3Points',\n\tCLOTH_PREPARE = 'clothPrepare',\n\tCLOTH_SOLVER = 'clothSolver',\n\tCOLOR = 'color',\n\tCONE = 'cone',\n\tCONTACT_SHADOWS = 'contactShadows',\n\tCOPY = 'copy',\n\tCURVE_FROM_POINTS = 'curveFromPoints',\n\t//\n\tCSG_ARC = 'CSGArc',\n\tCSG_BOOLEAN = 'CSGBoolean',\n\tCSG_CENTER = 'CSGCenter',\n\tCSG_CIRCLE = 'CSGCircle',\n\tCSG_BOX = 'CSGBox',\n\tCSG_DODECAHEDRON = 'CSGDodecahedron',\n\tCSG_ELLIPSE = 'CSGEllipse',\n\tCSG_ELLIPSOID = 'CSGEllipsoid',\n\tCSG_EXPAND = 'CSGExpand',\n\tCSG_EXTRUDE_LINEAR = 'CSGExtrudeLinear',\n\tCSG_EXTRUDE_RECTANGULAR = 'CSGExtrudeRectangular',\n\tCSG_EXTRUDE_ROTATE = 'CSGExtrudeRotate',\n\tCSG_HULL = 'CSGHull',\n\tCSG_LINE = 'CSGLine',\n\tCSG_MIRROR = 'CSGMirror',\n\tCSG_OFFSET = 'CSGOffset',\n\tCSG_POLYGON = 'CSGPolygon',\n\tCSG_POLYHEDRON = 'CSGPolyhedron',\n\tCSG_PROJECT = 'CSGProject',\n\tCSG_RECTANGLE = 'CSGRectangle',\n\tCSG_SPHERE = 'CSGSphere',\n\tCSG_STAR = 'CSGStar',\n\tCSG_TORUS = 'CSGTorus',\n\tCSG_TRANSFORM_2D = 'CSGTransform2D',\n\tCSG_TRANSFORM_RESET = 'CSGTransformReset',\n\tCSG_TRIANGLE = 'CSGTriangle',\n\tCSG_TRIANGULATE = 'CSGTriangulate',\n\tCSG_TUBE = 'CSGTube',\n\tCSG_TUBE_ELLIPTIC = 'CSGTubeElliptic',\n\t//\n\tCSS2D_OBJECT = 'CSS2DObject',\n\tCSS3D_OBJECT = 'CSS3DObject',\n\tDATA = 'data',\n\tDATA_URL = 'dataUrl',\n\tDECAL = 'decal',\n\tDELETE = 'delete',\n\tDELETE_BY_NAME = 'deleteByName',\n\tDELETE_NON_MANIFOLD = 'deleteNonManifold',\n\tENTITY_BUILDER = 'entityBuilder',\n\tEXTRUDE_OPEN_EDGES = 'extrudeOpenEdges',\n\tFACET = 'facet',\n\tFUSE = 'fuse',\n\tGROUND_PROJECTED_SKYBOX = 'groundProjectedSkybox',\n\tHIERARCHY = 'hierarchy',\n\tICOSAHEDRON = 'icosahedron',\n\t//\n\tIFC_FILTER_CATEGORIES = 'IFCFilterCategories',\n\t//\n\tINSTANCE = 'instance',\n\tINSTANCE_BUILDER = 'instanceBuilder',\n\tINSTANCED_MESH_TO_MESH = 'instancedMeshToMesh',\n\tINSTANCE_UPDATE = 'instanceUpdate',\n\tJITTER = 'jitter',\n\tLATTICE = 'lattice',\n\tLAYER = 'layer',\n\tLOD = 'lod',\n\tLOOK_AT = 'lookAt',\n\tMAPBOX_TRANSFORM = 'mapboxTransform',\n\tMATERIAL = 'material',\n\tMATERIAL_PROPERTIES = 'materialProperties',\n\tMEASURE = 'measure',\n\tMERGE = 'merge',\n\tMETABALL = 'metaball',\n\tMIRROR = 'mirror',\n\tNOISE = 'noise',\n\tNORMALS = 'normals',\n\tNORMALS_HELPER = 'normalsHelper',\n\tOBJECT_BUILDER = 'objectBuilder',\n\tOBJECT_PROPERTIES = 'objectProperties',\n\tOBJECTS_LAYOUT = 'objectsLayout',\n\tPALETTE = 'palette',\n\tPARTICLES_SYSTEM_GPU = 'particlesSystemGpu',\n\tPARTICLES_SYSTEM_GPU_ATTRIBUTES = 'particlesSystemGpuAttributes',\n\tPARTICLES_SYSTEM_GPU_MATERIAL = 'particlesSystemGpuMaterial',\n\tPHYSICS_DEBUG = 'physicsDebug',\n\tPHYSICS_GROUND = 'physicsGround',\n\tPHYSICS_RBD_ATTRIBUTES = 'physicsRBDAttributes',\n\tPHYSICS_RBD_JOINTS = 'physicsRBDJoints',\n\tPHYSICS_WORLD = 'physicsWorld',\n\tPHYSICS_PLAYER = 'physicsPlayer',\n\tPLANE = 'plane',\n\tPOINT = 'point',\n\tPOINT_BUILDER = 'pointBuilder',\n\tPOLAR_TRANSFORM = 'polarTransform',\n\tPOLYWIRE = 'polywire',\n\t//\n\tQUAD_CONNECTION = 'quadConnection',\n\tQUAD_CORNERS = 'quadCorners',\n\tQUAD_EXTRUDE = 'quadExtrude',\n\tQUAD_FUSE = 'quadFuse',\n\tQUAD_MIRROR = 'quadMirror',\n\tQUAD_PLANE = 'quadPlane',\n\tQUAD_SMOOTH = 'quadSmooth',\n\tQUAD_TRIANGULATE = 'quadTriangulate',\n\tQUAD_UNIQUE_NEIGHBOUR_ID = 'quadUniqueNeighbourId',\n\tQUADRANGULATE = 'quadrangulate',\n\t//\n\tRAY = 'ray',\n\tREFLECTOR = 'reflector',\n\tRING = 'ring',\n\tROUNDED_BOX = 'roundedBox',\n\tSCATTER = 'scatter',\n\t// SDF\n\t// SDF_BOOLEAN = 'SDFBoolean',\n\t// SDF_BOX = 'SDFBox',\n\tSDF_BUILDER = 'SDFBuilder',\n\t// SDF_EXTRUDE = 'SDFExtrude',\n\t// SDF_REFINE = 'SDFRefine',\n\t// SDF_LEVEL_SET = 'SDFLevelSet',\n\t// SDF_SMOOTH = 'SDFSmooth',\n\t// SDF_SPHERE = 'SDFSphere',\n\t// SDF_TRIANGULATE = 'SDFTriangulate',\n\t// SDF_TUBE = 'SDFTube',\n\t//\n\tSET_CHILDREN = 'setChildren',\n\tSET_GEOMETRY = 'setGeometry',\n\tSHEAR = 'shear',\n\tSHORTEST_PATH = 'shortestPath',\n\tSKELETON_HELPER = 'skeletonHelper',\n\tSKIN = 'skin',\n\tSORT = 'sort',\n\tSPHERE = 'sphere',\n\tSPLIT = 'split',\n\tSUBDIVIDE = 'subdivide',\n\tSWITCH = 'switch',\n\tTANGENT = 'tangent',\n\tTANGENTS_HELPER = 'tangentsHelper',\n\t//\n\t// TET = 'tet',\n\t// TET_BOX = 'tetBox',\n\tTET_DELETE = 'tetDelete',\n\tTET_EMBED = 'tetEmbed',\n\t// TET_GROW = 'tetGrow',\n\t// TET_MIRROR = 'tetMirror',\n\tTET_SOFT_BODY_SOLVER = 'tetSoftBodySolver',\n\t// TET_SPLIT = 'tetSplit',\n\tTET_TRIANGULATE = 'tetTriangulate',\n\t// TET_QUALITY = 'tetQuality',\n\tTETRAHEDRALIZE = 'tetrahedralize',\n\tTETRAHEDRON = 'tetrahedron',\n\t//\n\tTEXT = 'text',\n\tTEXTURE_COPY = 'textureCopy',\n\tTEXTURE_PROPERTIES = 'textureProperties',\n\tTORUS = 'torus',\n\tTORUS_KNOT = 'torusKnot',\n\tTRANSFORM = 'transform',\n\tTRANSFORM_COPY = 'transformCopy',\n\tTRANSFORM_MULTI = 'transformMulti',\n\tTRANSFORM_RESET = 'transformReset',\n\tTUBE = 'tube',\n\tUV_LAYOUT = 'uvLayout',\n\tUV_TRANSFORM = 'uvTransform',\n\tUV_UNWRAP = 'uvUnwrap',\n\tWEB_XR_AR_ESTIMATED_LIGHT = 'webXRAREstimatedLight',\n\tWFC_BUILDER = 'WFCBuilder',\n\tWFC_DEBUG = 'WFCDebug',\n\tWFC_SOLVER = 'WFCSolver',\n\tWFC_RULE_FROM_PROXIMITY = 'WFCRuleFromProximity',\n\tWFC_RULE_CONNECTION_FROM_SIDE_NAME = 'WFCRuleConnectionFromSideName',\n\t// WFC_RULE_CONNECTION_TO_EMPTY_TILE = 'WFCRuleConnectionToEmptyTile',\n\tWFC_RULE_CONNECTION_TO_GRID_BORDER = 'WFCRuleConnectionToGridBorder',\n\tWFC_RULE_TILE_WEIGHT = 'WFCRuleTileWeight',\n\tWFC_TILE_EMPTY_OBJECT = 'WFCTileEmptyObject',\n\tWFC_TILE_ERROR_OBJECT = 'WFCTileErrorObject',\n\tWFC_TILE_UNRESOLVED_OBJECT = 'WFCTileUnresolvedObject',\n\tWFC_TILE_PROPERTIES = 'WFCTileProperties',\n\tWFC_TILE_SIDE_NAME = 'WFCTileSideName',\n\tWFC_TILE_TRANSFORM = 'WFCTileTransform',\n}\n\nexport enum SopTypeFile {\n\tFILE_3DS = 'file3DS',\n\tFILE_DRC = 'fileDRC',\n\tFILE_FBX = 'fileFBX',\n\tFILE_GEOJSON = 'fileGEOJSON',\n\tFILE_GLTF = 'fileGLTF',\n\tFILE_JSON = 'fileJSON',\n\tFILE_MPD = 'fileMPD',\n\tFILE_OBJ = 'fileOBJ',\n\tFILE_PDB = 'filePDB',\n\tFILE_PLY = 'filePLY',\n\tFILE_STL = 'fileSTL',\n\tFILE_SVG = 'fileSVG',\n\tFILE_USDZ = 'fileUSDZ',\n\tFILE_VOX = 'fileVOX',\n}\n\nexport enum SopTypeFileMulti {\n\tFILE_DRC = 'fileMultiDRC',\n\tFILE_FBX = 'fileMultiFBX',\n\tFILE_GLTF = 'fileMultiGLTF',\n\tFILE_JSON = 'fileMultiJSON',\n\tFILE_MPD = 'fileMultiMPD',\n\tFILE_OBJ = 'fileMultiOBJ',\n\tFILE_PDB = 'fileMultiPDB',\n\tFILE_PLY = 'fileMultiPLY',\n\tFILE_STL = 'fileMultiSTL',\n\tFILE_SVG = 'fileMultiSVG',\n}\n\nexport enum SopExporter {\n\tEXPORTER_GLTF = 'exporterGLTF',\n\tEXPORTER_OBJ = 'exporterOBJ',\n\tEXPORTER_PLY = 'exporterPLY',\n\tEXPORTER_STL = 'exporterSTL',\n\tEXPORTER_USDZ = 'exporterUSDZ',\n}\n","export const MAPBOX_TOKEN_MISSING_ERROR_MESSAGE = `Set your mapbox token with \"poly.thirdParty.mapbox().setToken('<YOUR TOKEN>')\" in the PolyConfig.ts file, then reload the page`;\n\ntype GetTokenFunc = () => Promise<string | undefined>;\n\nexport class PolyThirdPartyMapboxController {\n\tprivate _token: string | undefined;\n\tprivate _getTokenFunc: GetTokenFunc | undefined;\n\tsetToken(token: string) {\n\t\tthis._token = token;\n\t}\n\tsetGetTokenFunction(tokenFunc: GetTokenFunc) {\n\t\tthis._getTokenFunc = tokenFunc;\n\t}\n\tasync token() {\n\t\tif (this._token) {\n\t\t\treturn this._token;\n\t\t}\n\t\tif (this._getTokenFunc) {\n\t\t\treturn await this._getTokenFunc();\n\t\t}\n\t}\n}\n","export enum PolyEventName {\n\tPOLY_PROGRESS = 'POLYProgress',\n\t// scene\n\tSCENE_CREATED = 'POLYSceneCreated',\n\tSCENE_READY = 'POLYSceneReady',\n\tSCENE_PLAY = 'POLYScenePlay',\n\tSCENE_PAUSE = 'POLYScenePause',\n\t// viewer\n\tVIEWER_MOUNTED = 'POLYViewerMounted',\n\tVIEWER_READY = 'POLYViewerReady',\n}\n","import {EvaluatorMethodName} from '../../../nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {PolyScene} from '../../PolyScene';\nimport {ActorsManager, ActorBuilderNode} from '../ActorsManager';\n\nexport class ActorManualTriggersController {\n\tprivate _scene: PolyScene;\n\tconstructor(protected actorsManager: ActorsManager) {\n\t\tthis._scene = actorsManager.scene;\n\t}\n\n\trunTriggerFromFunctionNode(node: ActorBuilderNode, methodName: string) {\n\t\tthis._scene.threejsScene().traverse((object) => {\n\t\t\tconst nodeIds = this.actorsManager.objectActorNodeIds(object);\n\t\t\tif (nodeIds && nodeIds.includes(node.graphNodeId())) {\n\t\t\t\tthis.actorsManager.triggerEventNode(node, object, methodName as EvaluatorMethodName);\n\t\t\t}\n\t\t});\n\t}\n}\n","import {PolyScene} from '../../PolyScene';\nimport {ActorsManager} from '../ActorsManager';\nimport {ActorEvaluatorGenerator} from '../../../nodes/js/code/assemblers/actor/ActorEvaluatorGenerator';\nimport {EvaluatorKeyboardMethod} from '../../../nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {addToSetAtEntry} from '../../../../core/MapUtils';\n\nexport class ActorKeyboardEventsController {\n\tprotected _scene: PolyScene;\n\tprivate _triggeredEvaluatorGeneratorsByMethodName: Map<EvaluatorKeyboardMethod, Set<ActorEvaluatorGenerator>> =\n\t\tnew Map();\n\tconstructor(protected actorsManager: ActorsManager) {\n\t\tthis._scene = actorsManager.scene;\n\t}\n\n\taddTriggeredEvaluators(evaluatorGenerators: Set<ActorEvaluatorGenerator>, methodName: EvaluatorKeyboardMethod) {\n\t\tevaluatorGenerators.forEach((evaluatorGenerator) => {\n\t\t\taddToSetAtEntry(this._triggeredEvaluatorGeneratorsByMethodName, methodName, evaluatorGenerator);\n\t\t});\n\t}\n\trunTriggers() {\n\t\tthis._triggeredEvaluatorGeneratorsByMethodName.forEach((evaluatorGenerators, methodName) => {\n\t\t\tevaluatorGenerators.forEach((evaluatorGenerator) => {\n\t\t\t\tevaluatorGenerator.traverseEvaluator((evaluator) => {\n\t\t\t\t\tif (evaluator[methodName]) {\n\t\t\t\t\t\tevaluator[methodName]!();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tthis._triggeredEvaluatorGeneratorsByMethodName.clear();\n\t}\n}\n","import {Object3D} from 'three';\n\ntype Callback = (object: Object3D) => void;\n// this is a safer traversal, which does not break when children are removed within the callback\nexport function hierarchyTraverse(object: Object3D, callback: Callback) {\n\tcallback(object);\n\tconst childrenCount = object.children.length;\n\tfor (let i = 0; i < childrenCount; i++) {\n\t\tconst child = object.children[i];\n\t\tif (child) {\n\t\t\thierarchyTraverse(child, callback);\n\t\t}\n\t}\n}\n","import type {Ref} from '@vue/reactivity';\nimport {Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {ObjectOptions, GPUOptions, CPUOptions, PriorityOptions} from './Common';\n\ninterface HoveredOptions {\n\thoveredStateRef: Ref<boolean>;\n\tonHoveredStateChange: () => void;\n}\nexport interface ObjectToHoverOptions extends ObjectOptions {\n\thover: HoveredOptions;\n}\nexport interface ObjectToHoverOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\thover: ConvertToStrings<HoveredOptions>;\n}\n\nexport class RayObjectIntersectionsHoverController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToHoverOptions[]> = new Map();\n\tprotected _intersectedStateByObject: Map<Object3D, boolean> = new Map();\n\n\tprocess() {\n\t\tthis._setIntersectedState(this._objects, this._intersectedStateByObject);\n\n\t\tconst objects = this._objects;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\tconst currentHoveredState = properties.hover.hoveredStateRef.value;\n\t\t\t\t\tconst newHoveredState = this._intersectedStateByObject.get(object) || false;\n\t\t\t\t\tif (newHoveredState != currentHoveredState) {\n\t\t\t\t\t\tproperties.hover.hoveredStateRef.value = newHoveredState;\n\t\t\t\t\t\tproperties.hover.onHoveredStateChange();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tButtonAndModifierOptions,\n\tButtonAndModifierOptionsAsString,\n\tfilterObjectsWithMatchButtonConfig,\n\tButtonConfig,\n\tbuttonConfigFromEvent,\n\tpropertyMatchesButtonConfig,\n} from './Common';\nimport {MouseButton} from '../../../../../core/MouseButton';\n\ninterface PointerdownOptions {\n\tcallback: () => void;\n}\nexport interface ObjectToObjectPointerdownOptions extends ObjectOptions {\n\tpointerdown: PointerdownOptions;\n\tconfig: ButtonAndModifierOptions;\n}\nexport interface ObjectToObjectPointerdownOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tpointerdown: ConvertToStrings<PointerdownOptions>;\n\tconfig: ButtonAndModifierOptionsAsString;\n}\n\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\n\nexport class RayObjectIntersectionsPointerdownController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToObjectPointerdownOptions[]> = new Map();\n\tprotected _intersectedStateByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\n\tonPointerdown(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tfilterObjectsWithMatchButtonConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateByObject);\n\t\tbuttonConfigFromEvent(event, _buttonConfig);\n\n\t\tconst objects = this._objects;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersecting = this._intersectedStateByObject.get(object);\n\t\t\t\tif (isIntersecting == true) {\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (propertyMatchesButtonConfig(properties.config, _buttonConfig)) {\n\t\t\t\t\t\t\tproperties.pointerdown.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// protected override _setEvent() {\n\t// \tconsole.log('_setEvent', this._objects.length);\n\t// \tif (this._objects.length > 0) {\n\t// \t\tdocument.addEventListener('pointerdown', this._processBound);\n\t// \t} else {\n\t// \t\tdocument.removeEventListener('pointerdown', this._processBound);\n\t// \t}\n\t// }\n}\n","import {Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tButtonAndModifierOptions,\n\tButtonAndModifierOptionsAsString,\n\tfilterObjectsWithMatchButtonConfig,\n\tButtonConfig,\n\tbuttonConfigFromEvent,\n\tpropertyMatchesButtonConfig,\n} from './Common';\nimport {MouseButton} from '../../../../../core/MouseButton';\n\ninterface PointerupOptions {\n\tcallback: () => void;\n}\nexport interface ObjectToObjectPointerupOptions extends ObjectOptions {\n\tpointerup: PointerupOptions;\n\tconfig: ButtonAndModifierOptions;\n}\nexport interface ObjectToObjectPointerupOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tpointerup: ConvertToStrings<PointerupOptions>;\n\tconfig: ButtonAndModifierOptionsAsString;\n}\n\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\n\nexport class RayObjectIntersectionsPointerupController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToObjectPointerupOptions[]> = new Map();\n\tprotected _intersectedStateByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\n\t// private _processBound = this._process.bind(this);\n\tonPointerup(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tfilterObjectsWithMatchButtonConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateByObject);\n\t\tbuttonConfigFromEvent(event, _buttonConfig);\n\n\t\tconst objects = this._objects;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersecting = this._intersectedStateByObject.get(object);\n\t\t\t\tif (isIntersecting == true) {\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (propertyMatchesButtonConfig(properties.config, _buttonConfig)) {\n\t\t\t\t\t\t\tproperties.pointerup.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {Constructor, ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tButtonsAndModifierOptions,\n\t// ButtonAndModifierIndexOptions,\n\tButtonsAndModifierOptionsAsString,\n\tfilterObjectsWithMatchButtonsConfig,\n\tpropertyMatchesButtonsConfig,\n\tButtonsConfig,\n\tbuttonsConfigFromEvent,\n\t// modifierIndexToModifierOptions,\n} from './Common';\nimport {ParamConfig} from '../../../../nodes/utils/params/ParamsConfig';\nimport {MouseButtons} from '../../../../../core/MouseButton';\nimport {CursorMoveMonitor} from '../../../../../core/CursorMoveMonitor';\n\ninterface ClickOptions {\n\tmaxCursorMoveDistance: number;\n\tmaxDuration: number;\n\tcallback: () => void;\n}\n\nexport interface ObjectToMouseClickOptions extends ObjectOptions {\n\tclick: ClickOptions;\n\tconfig: ButtonsAndModifierOptions;\n}\n// export interface ObjectToClickIndexOptions extends ObjectOptions {\n// \tclick: ClickOptions;\n// \tconfig: ButtonAndModifierIndexOptions;\n// }\nexport interface ObjectToClickOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tclick: ConvertToStrings<ClickOptions>;\n\tconfig: ButtonsAndModifierOptionsAsString;\n}\nconst _buttonsConfig: ButtonsConfig = {buttons: MouseButtons.LEFT, ctrl: false, shift: false, alt: false};\n\nfunction hasPropertiesWithCursorMoveLessThan(options: ObjectToMouseClickOptions[], distance: number) {\n\tfor (const option of options) {\n\t\tif (distance < option.click.maxCursorMoveDistance) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function ClickParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param max cursor move distance */\n\t\tmaxCursorMoveDistance = ParamConfig.FLOAT(0.05, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param max duration */\n\t\tmaxDuration = ParamConfig.INTEGER(200, {\n\t\t\trange: [0, 1000],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\n\nexport class RayObjectIntersectionsMouseClickController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToMouseClickOptions[]> = new Map();\n\tprotected _intersectedStateOnMousedownByObject: Map<Object3D, boolean> = new Map();\n\tprotected _intersectedStateOnMouseupByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\tprivate _objectsIntersectedOnMousedown: Object3D[] = [];\n\tprivate _cursorMoveMonitor = new CursorMoveMonitor();\n\tprivate _mousedownEvent: Readonly<PointerEvent | MouseEvent | TouchEvent> | undefined;\n\tprivate _mousedownReceivedAt: number = 0;\n\n\tprivate _bound = {\n\t\tmouseup: this._onMouseup.bind(this),\n\t};\n\tonMousedown(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tthis._mousedownEvent = event;\n\t\tthis._mousedownReceivedAt = performance.now();\n\t\tif (this._objects.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tfilterObjectsWithMatchButtonsConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tdocument.addEventListener('mouseup', this._bound.mouseup);\n\t\t// we also need touchend, as pointerup appears to not be triggered if the cursor has moved a little bit\n\t\tdocument.addEventListener('touchend', this._bound.mouseup);\n\t\tthis._cursorMoveMonitor.addPointermoveEventListener(\n\t\t\tthis._scene.eventsDispatcher.pointerEventsController.cursor()\n\t\t);\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateOnMousedownByObject);\n\t}\n\n\tprivate _onMouseup() {\n\t\tdocument.removeEventListener('mouseup', this._bound.mouseup);\n\t\tdocument.removeEventListener('touchend', this._bound.mouseup);\n\t\tthis._cursorMoveMonitor.removeEventListener();\n\t\tconst event = this._mousedownEvent;\n\t\tif (!event) {\n\t\t\treturn;\n\t\t}\n\t\tthis._mousedownEvent = undefined;\n\t\tconst duration = performance.now() - this._mousedownReceivedAt;\n\n\t\tconst movedCursorDistance = this._cursorMoveMonitor.movedCursorDistance();\n\n\t\tconst objects = this._objectsMatchingEventConfig;\n\t\tthis._objectsIntersectedOnMousedown.length = 0;\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList && hasPropertiesWithCursorMoveLessThan(propertiesList, movedCursorDistance)) {\n\t\t\t\tconst isIntersectingOnMousedown = this._intersectedStateOnMousedownByObject.get(object);\n\t\t\t\tif (isIntersectingOnMousedown) {\n\t\t\t\t\tthis._objectsIntersectedOnMousedown.push(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// I've considered using only the objects intersected in pointerdown for the pointerup detection,\n\t\t// but that prevents missed objects from occluding others if they are in front.\n\t\t// We therefore need to run the detection on all objects\n\t\t// instead, we can still optimise by not detecting anything if that list is empty\n\t\tif (this._objectsIntersectedOnMousedown.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis._setIntersectedState(objects, this._intersectedStateOnMouseupByObject);\n\t\tbuttonsConfigFromEvent(event, _buttonsConfig);\n\n\t\tconst objectsIntersectedOnMousedown = this._objectsIntersectedOnMousedown;\n\t\tfor (const object of objectsIntersectedOnMousedown) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersectingOnMouseup = this._intersectedStateOnMouseupByObject.get(object);\n\t\t\t\tif (isIntersectingOnMouseup == true) {\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmovedCursorDistance < properties.click.maxCursorMoveDistance &&\n\t\t\t\t\t\t\tduration < properties.click.maxDuration &&\n\t\t\t\t\t\t\tpropertyMatchesButtonsConfig(properties.config, _buttonsConfig)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tproperties.click.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {\n\tBaseRayObjectIntersectionsController,\n} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n} from './Common';\n\ninterface ContextmenuOptions {\n\tcallback: () => void;\n}\nexport interface ObjectToContextmenuOptions extends ObjectOptions {\n\tcontextmenu: ContextmenuOptions;\n}\nexport interface ObjectToContextmenuOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tcontextmenu: ConvertToStrings<ContextmenuOptions>;\n}\n\nexport class RayObjectIntersectionsContextmenuController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToContextmenuOptions[]> = new Map();\n\tprotected _intersectedStateByObject: Map<Object3D, boolean> = new Map();\n\n\tonContextmenu(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tthis._setIntersectedState(this._objects, this._intersectedStateByObject);\n\n\t\tconst objects = this._objects;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersecting = this._intersectedStateByObject.get(object);\n\t\t\t\tif (isIntersecting == true) {\n\t\t\t\t\tfor(const properties of propertiesList){\n\t\t\t\t\t\tproperties.contextmenu.callback();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {PolyScene} from '../../../PolyScene';\nimport {ActorsManager} from '../../ActorsManager';\nimport {Object3D} from 'three';\nimport {ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT} from '../../../../../core/actor/ActorCompilationController';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {EmptyOptions} from './Common';\n\nexport class BaseUserInputController {\n\tprotected _scene: PolyScene;\n\tprotected _objects: Object3D[] = [];\n\tprotected _propertiesListByObject: Map<Object3D, EmptyOptions[]> = new Map();\n\tconstructor(protected actorsManager: ActorsManager) {\n\t\tthis._scene = actorsManager.scene;\n\t}\n\n\taddPropertiesForObject(object: Object3D, properties: EmptyOptions) {\n\t\tif (object == ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT) {\n\t\t\treturn;\n\t\t}\n\n\t\tpushOnArrayAtEntry(this._propertiesListByObject, object, properties);\n\n\t\tconst index = this._objects.indexOf(object);\n\t\tif (index < 0) {\n\t\t\tthis._objects.push(object);\n\t\t}\n\t}\n\tremovePropertiesForObject(object: Object3D, properties: EmptyOptions) {\n\t\tif (object == ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst propertiesForObject = this._propertiesListByObject.get(object);\n\t\tif (!propertiesForObject) {\n\t\t\treturn;\n\t\t}\n\t\tconst propertyIndex = propertiesForObject.indexOf(properties);\n\t\tpropertiesForObject.splice(propertyIndex, 1);\n\n\t\tif (propertiesForObject.length == 0) {\n\t\t\tconst objectIndex = this._objects.indexOf(object);\n\t\t\tif (objectIndex >= 0) {\n\t\t\t\tthis._objects.splice(objectIndex, 1);\n\t\t\t\tthis._propertiesListByObject.delete(object);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseUserInputController} from './_BaseUserInputController';\n\ninterface PointerdownOptions {\n\tcallback: () => void;\n}\nexport interface ObjectToPointerdownOptions {\n\tpointerdown: PointerdownOptions;\n}\nexport interface ObjectToPointerdownOptionsAsString {\n\tpointerdown: ConvertToStrings<PointerdownOptions>;\n}\n\nexport class PointerdownController extends BaseUserInputController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToPointerdownOptions[]> = new Map();\n\tprotected _intersectedStateByObject: Map<Object3D, boolean> = new Map();\n\n\tonPointerdown(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tconst objects = this._objects;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\tproperties.pointerdown.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseUserInputController} from './_BaseUserInputController';\n\ninterface PointerupOptions {\n\tcallback: () => void;\n}\nexport interface ObjectToPointerupOptions {\n\tpointerup: PointerupOptions;\n}\nexport interface ObjectToPointerupOptionsAsString {\n\tpointerup: ConvertToStrings<PointerupOptions>;\n}\n\nexport class PointerupController extends BaseUserInputController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToPointerupOptions[]> = new Map();\n\tprotected _intersectedStateByObject: Map<Object3D, boolean> = new Map();\n\n\tonPointerup(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tconst objects = this._objects;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\tproperties.pointerup.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {PolyScene} from '../PolyScene';\nimport {ActorManualTriggersController} from './actors/ManualTriggersController';\nimport {ActorKeyboardEventsController} from './actors/ActorsKeyboardEventsController';\nimport {JsType} from '../../poly/registers/nodes/types/Js';\nimport {EvaluatorMethodName, EVALUATOR_METHOD_NAMES} from '../../nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {ActorEvaluatorGenerator} from '../../nodes/js/code/assemblers/actor/ActorEvaluatorGenerator';\n// import {ActorPointerEventsController} from './actors/ActorsPointerEventsController';\nimport {AssemblerControllerNode} from '../../nodes/js/code/Controller';\nimport {JsAssemblerActor} from '../../nodes/js/code/assemblers/actor/ActorAssembler';\nimport {ActorCompilationController} from '../../../core/actor/ActorCompilationController';\nimport {ObjectContent, CoreObjectType} from '../../../core/geometry/ObjectContent';\nimport {hierarchyTraverse} from '../../../core/geometry/util/HierarchyTraverse';\nimport {Poly} from '../../Poly';\nimport {RayObjectIntersectionsHoverController} from './actors/rayObjectIntersection/RayObjectIntersectionsHoverController';\nimport {RayObjectIntersectionsPointerdownController} from './actors/rayObjectIntersection/RayObjectIntersectionsPointerdownController';\nimport {RayObjectIntersectionsPointerupController} from './actors/rayObjectIntersection/RayObjectIntersectionsPointerupController';\nimport {RayObjectIntersectionsClickController} from './actors/rayObjectIntersection/RayObjectIntersectionsClickController';\nimport {RayObjectIntersectionsMouseClickController} from './actors/rayObjectIntersection/RayObjectIntersectionsMouseClickController';\nimport {RayObjectIntersectionsContextmenuController} from './actors/rayObjectIntersection/RayObjectIntersectionsContextmenuController';\nimport {RayObjectIntersectionsLongPressController} from './actors/rayObjectIntersection/RayObjectIntersectionsLongPressController';\nimport {RayObjectIntersectionsSwipeController} from './actors/rayObjectIntersection/RayObjectIntersectionsSwipeController';\nimport {PointerdownController} from './actors/rayObjectIntersection/PointerdownController';\nimport {PointerupController} from './actors/rayObjectIntersection/PointerupController';\nimport {RayObjectIntersectionsDoubleClickController} from './actors/rayObjectIntersection/RayObjectIntersectionsDoubleClickController';\n\nconst ACTOR_BUILDER_NODE_IDS_KEY = 'actorBuilderNodeIds';\n\nenum EventHandlerType {\n\tinstant = 'instant',\n\tonTick = 'onTick',\n}\nconst EVENT_MAP_LOGIC: Record<EvaluatorMethodName, EventHandlerType> = {\n\t[JsType.ON_KEY]: EventHandlerType.onTick,\n\t[JsType.ON_KEYDOWN]: EventHandlerType.onTick,\n\t[JsType.ON_KEYPRESS]: EventHandlerType.onTick,\n\t[JsType.ON_KEYUP]: EventHandlerType.onTick,\n\t// [JsType.ON_MANUAL_TRIGGER]: EventHandlerType.instant,\n\t[JsType.ON_MAPBOX_CAMERA_MOVE]: EventHandlerType.onTick,\n\t[JsType.ON_MAPBOX_CAMERA_MOVE_START]: EventHandlerType.onTick,\n\t[JsType.ON_MAPBOX_CAMERA_MOVE_END]: EventHandlerType.onTick,\n\t[JsType.ON_OBJECT_ATTRIBUTE_UPDATE]: EventHandlerType.onTick,\n\t// ['onClick']: EventHandlerType.onTick,\n\t['onContextMenu']: EventHandlerType.onTick,\n\t[JsType.ON_OBJECT_DISPATCH_EVENT]: EventHandlerType.instant, // TODO\n\t['onPointermove']: EventHandlerType.onTick,\n\t// [JsType.ON_OBJECT_POINTERDOWN]: EventHandlerType.onTick,\n\t// [JsType.ON_OBJECT_POINTERUP]: EventHandlerType.onTick,\n\t[JsType.ON_PERFORMANCE_CHANGE]: EventHandlerType.instant,\n\t[JsType.ON_POINTERDOWN]: EventHandlerType.onTick,\n\t[JsType.ON_POINTERUP]: EventHandlerType.onTick,\n\t[JsType.ON_SCENE_PAUSE]: EventHandlerType.instant,\n\t[JsType.ON_SCENE_PLAY]: EventHandlerType.instant,\n\t[JsType.ON_SCENE_RESET]: EventHandlerType.instant,\n\t[JsType.ON_TICK]: EventHandlerType.onTick,\n\t[JsType.ON_VIDEO_EVENT]: EventHandlerType.onTick,\n\t[JsType.ON_WEBXR_CONTROLLER_EVENT]: EventHandlerType.onTick, // TODO\n};\nconst ON_TICK_METHOD_NAMES: Set<EvaluatorMethodName> = new Set(\n\tEVALUATOR_METHOD_NAMES.filter((methodName) => EVENT_MAP_LOGIC[methodName] == EventHandlerType.onTick)\n);\nconst INSTANT_METHOD_NAMES: Set<EvaluatorMethodName> = new Set(\n\tEVALUATOR_METHOD_NAMES.filter((methodName) => EVENT_MAP_LOGIC[methodName] == EventHandlerType.instant)\n);\nif (0 + 0) {\n\tconsole.log({ON_TICK_METHOD_NAMES, INSTANT_METHOD_NAMES});\n}\n\nexport abstract class ActorBuilderNode extends AssemblerControllerNode<JsAssemblerActor> {\n\tpublic abstract readonly compilationController: ActorCompilationController;\n}\n\nexport class ActorsManager {\n\tprivate _keyboardEventsController: ActorKeyboardEventsController | undefined;\n\tprivate _manualTriggerController: ActorManualTriggersController | undefined;\n\tconstructor(public readonly scene: PolyScene) {}\n\n\tregisterEvaluatorGenerator(evaluatorGenerator: ActorEvaluatorGenerator) {\n\t\tthis.scene.eventsDispatcher.registerEvaluatorGenerator(evaluatorGenerator);\n\t}\n\tunregisterEvaluatorGenerator(evaluatorGenerator: ActorEvaluatorGenerator) {\n\t\tthis.scene.eventsDispatcher.unregisterEvaluatorGenerator(evaluatorGenerator);\n\t}\n\n\tassignActorBuilder(object: ObjectContent<CoreObjectType>, node: ActorBuilderNode) {\n\t\tlet ids = this.objectActorNodeIds(object);\n\t\tif (!ids) {\n\t\t\tids = [];\n\t\t\tobject.userData[ACTOR_BUILDER_NODE_IDS_KEY] = ids;\n\t\t}\n\t\tconst id = node.graphNodeId();\n\t\tif (!ids.includes(id)) {\n\t\t\tids.push(id);\n\t\t}\n\t\tPoly.onObjectsAddRemoveHooks.assignOnRemoveHookHandler(object, node);\n\t}\n\tobjectActorNodeIds(object: ObjectContent<CoreObjectType>) {\n\t\treturn object.userData[ACTOR_BUILDER_NODE_IDS_KEY] as number[] | undefined;\n\t}\n\t/*\n\t *\n\t * EVENTS\n\t *\n\t */\n\tget keyboardEventsController() {\n\t\treturn (this._keyboardEventsController =\n\t\t\tthis._keyboardEventsController || new ActorKeyboardEventsController(this));\n\t}\n\tget manualTriggerController() {\n\t\treturn (this._manualTriggerController =\n\t\t\tthis._manualTriggerController || new ActorManualTriggersController(this));\n\t}\n\tpublic readonly rayObjectIntersectionClick = new RayObjectIntersectionsClickController(this);\n\tpublic readonly rayObjectIntersectionDoubleClick = new RayObjectIntersectionsDoubleClickController(this);\n\tpublic readonly rayObjectIntersectionMouseClick = new RayObjectIntersectionsMouseClickController(this);\n\tpublic readonly rayObjectIntersectionContextmenu = new RayObjectIntersectionsContextmenuController(this);\n\tpublic readonly rayObjectIntersectionHover = new RayObjectIntersectionsHoverController(this);\n\tpublic readonly rayObjectIntersectionLongPress = new RayObjectIntersectionsLongPressController(this);\n\tpublic readonly rayObjectIntersectionPointerdown = new RayObjectIntersectionsPointerdownController(this);\n\tpublic readonly rayObjectIntersectionPointerup = new RayObjectIntersectionsPointerupController(this);\n\tpublic readonly rayObjectIntersectionSwipe = new RayObjectIntersectionsSwipeController(this);\n\tpublic readonly pointerdown = new PointerdownController(this);\n\tpublic readonly pointerup = new PointerupController(this);\n\n\t/*\n\t *\n\t * PUBLIC METHODS\n\t *\n\t */\n\ttick() {\n\t\tthis.rayObjectIntersectionHover.process();\n\t\tthis._keyboardEventsController?.runTriggers();\n\t\thierarchyTraverse(this.scene.threejsScene(), (object) => {\n\t\t\tthis.triggerEventNodes(object, 'onPointermove');\n\t\t\tthis._onEventTickBound(object);\n\t\t});\n\t}\n\trunOnEventSceneReset() {\n\t\tthis._onEventSceneResetTraverse();\n\t}\n\trunOnEventScenePlay() {\n\t\tthis._onEventScenePlayTraverse();\n\t}\n\trunOnEventScenePause() {\n\t\tthis._onEventScenePauseTraverse();\n\t}\n\trunOnEventPerformanceChange() {\n\t\tthis._onEventPerformanceChangeTraverse();\n\t}\n\n\t/*\n\t *\n\t * PRIVATE METHODS\n\t *\n\t */\n\n\t// tick\n\tprivate _onEventTickBound = this._onEventTick.bind(this);\n\tprivate _onEventTick(object: Object3D) {\n\t\tthis.triggerEventNodes(object, JsType.ON_TICK);\n\t}\n\n\t// reset\n\tprivate _onEventSceneResetBound = this._onEventSceneReset.bind(this);\n\tprivate _onEventSceneReset(object: Object3D) {\n\t\tthis.triggerEventNodes(object, JsType.ON_SCENE_RESET);\n\t}\n\tprivate _onEventSceneResetTraverse() {\n\t\thierarchyTraverse(this.scene.threejsScene(), this._onEventSceneResetBound);\n\t}\n\t// play\n\tprivate _onEventScenePlayBound = this._onEventScenePlay.bind(this);\n\tprivate _onEventScenePlay(object: Object3D) {\n\t\tthis.triggerEventNodes(object, JsType.ON_SCENE_PLAY);\n\t}\n\tprivate _onEventScenePlayTraverse() {\n\t\thierarchyTraverse(this.scene.threejsScene(), this._onEventScenePlayBound);\n\t}\n\t// pause\n\tprivate _onEventScenePauseBound = this._onEventScenePause.bind(this);\n\tprivate _onEventScenePause(object: Object3D) {\n\t\tthis.triggerEventNodes(object, JsType.ON_SCENE_PAUSE);\n\t}\n\tprivate _onEventScenePauseTraverse() {\n\t\thierarchyTraverse(this.scene.threejsScene(), this._onEventScenePauseBound);\n\t}\n\t// performanceChange\n\tprivate _onEventPerformanceChangeBound = this._onEventPerformanceChange.bind(this);\n\tprivate _onEventPerformanceChange(object: Object3D) {\n\t\tthis.triggerEventNodes(object, JsType.ON_PERFORMANCE_CHANGE);\n\t}\n\tprivate _onEventPerformanceChangeTraverse() {\n\t\thierarchyTraverse(this.scene.threejsScene(), this._onEventPerformanceChangeBound);\n\t}\n\t//\n\ttriggerEventNodes(object: Object3D, methodName: EvaluatorMethodName) {\n\t\tconst nodeIds = this.objectActorNodeIds(object);\n\t\tif (!nodeIds) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const nodeId of nodeIds) {\n\t\t\t// we need to test that the object has a parent,\n\t\t\t// as it could have multiple actor attached,\n\t\t\t// and if the first one from nodeIds triggers the object removal\n\t\t\t// from the hierarchy, going through the following actor nodes\n\t\t\t// will regenerate an evaluator for an object that is not in the hierarchy anymore\n\t\t\tif (object.parent == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst node = this.scene.graph.nodeFromId(nodeId) as ActorBuilderNode | undefined;\n\n\t\t\tif (node) {\n\t\t\t\tthis.triggerEventNode(node, object, methodName);\n\t\t\t}\n\t\t}\n\t}\n\ttriggerEventNode(node: ActorBuilderNode, object: Object3D, methodName: EvaluatorMethodName) {\n\t\tconst evaluatorGenerator = node.compilationController.evaluatorGenerator();\n\t\tthis._triggerEvaluatorGenerator(evaluatorGenerator, object, methodName);\n\t}\n\tprivate _triggerEvaluatorGenerator(\n\t\tevaluatorGenerator: ActorEvaluatorGenerator,\n\t\tobject: Object3D,\n\t\tmethodName: EvaluatorMethodName\n\t) {\n\t\t// we can't yet create evaluators only when the method requested here exists,\n\t\t// as this fails for onObjectClick methods, which are called from the relevant event controller\n\t\t// if (onlyIfMethodExists == true && !evaluatorGenerator.hasExpectedEvaluatorMethodName(methodName)) {\n\t\t// \treturn;\n\t\t// }\n\t\tconst evaluator = evaluatorGenerator.findOrCreateEvaluator(object);\n\n\t\tif ((evaluator as any)[methodName]) {\n\t\t\t(evaluator as any)[methodName]!();\n\t\t}\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {Camera, Object3D} from 'three';\nimport {Poly} from '../../Poly';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {CreateViewerOptions} from '../../viewers/_Base';\n\ntype OnCameraObjectsUpdated = () => void;\ninterface MainCameraOptions {\n\tcameraMaskOverride?: string;\n\tfindAnyCamera?: boolean;\n\tprintCameraNotFoundError?: boolean;\n}\nconst _cameras: Array<Camera> = [];\n\nexport class SceneCamerasController {\n\tprivate _coreGraphNode: CoreGraphNode;\n\tconstructor(private scene: PolyScene) {\n\t\tthis._coreGraphNode = new CoreGraphNode(this.scene, 'SceneCamerasController');\n\t}\n\tcoreGraphNode() {\n\t\treturn this._coreGraphNode;\n\t}\n\tdispose() {\n\t\tthis._coreGraphNode.dispose();\n\t}\n\tprivate _cameraObjectsRecentlyUpdated: Array<Camera> = [];\n\tupdateFromChangeInObject(object: Object3D) {\n\t\tthis._cameraObjects(object, this._cameraObjectsRecentlyUpdated);\n\t\tif (this._cameraObjectsRecentlyUpdated.length > 0) {\n\t\t\tthis._coreGraphNode.setDirty();\n\t\t}\n\t\tfor (const callback of this._onCameraObjectsUpdatedCallbacks) {\n\t\t\tcallback();\n\t\t}\n\t}\n\tcameraObjects(target: Array<Camera>) {\n\t\tthis._cameraObjects(this.scene.threejsScene(), target);\n\t\treturn target;\n\t}\n\n\tprivate _cameraObjects(parent: Object3D, cameraObjects: Array<Camera>) {\n\t\tcameraObjects.splice(0, cameraObjects.length);\n\t\tparent.traverse((object) => {\n\t\t\tif (Poly.camerasRegister.objectRegistered(object)) {\n\t\t\t\tcameraObjects.push(object as Camera);\n\t\t\t}\n\t\t});\n\t}\n\tcameraObjectsRecentlyUpdated() {\n\t\treturn this._cameraObjectsRecentlyUpdated;\n\t}\n\n\t// _mainCameraObjectPath: string | null = null;\n\n\tsetMainCamera(camera: Camera) {\n\t\t// this._mainCameraObjectPath = camera_node_path;\n\t\tthis.scene.root().mainCameraController.setCamera(camera);\n\t}\n\tsetMainCameraPath(path: string) {\n\t\tthis.scene.root().mainCameraController.setCameraPath(path);\n\t}\n\tmainCameraPath() {\n\t\treturn this.scene.root().mainCameraController.rawCameraPath();\n\t}\n\t// async mainCameraObjectPath() {\n\t// \treturn this._mainCameraObjectPath;\n\t// }\n\tprivate _errorMessageDisplayed: boolean = false;\n\tasync mainCamera(options?: MainCameraOptions): Promise<Camera | null> {\n\t\tif (this.scene.disposed()) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet printCameraNotFoundError = true;\n\t\tif (options?.printCameraNotFoundError != null) {\n\t\t\tprintCameraNotFoundError = options.printCameraNotFoundError;\n\t\t}\n\t\tconst cameraMaskOverride = options?.cameraMaskOverride;\n\t\tif (cameraMaskOverride != null) {\n\t\t\tthis.scene.root().mainCameraController.setCameraPath(cameraMaskOverride);\n\t\t}\n\n\t\tconst _printWarningMessage = (warningMessage: string) => {\n\t\t\tif (this._errorMessageDisplayed == true) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (printCameraNotFoundError) {\n\t\t\t\tconsole.error(warningMessage);\n\t\t\t\tthis._errorMessageDisplayed = true;\n\t\t\t}\n\t\t};\n\n\t\tconst camera = await this.scene.root().mainCameraController.camera();\n\t\tif (camera) {\n\t\t\treturn camera;\n\t\t}\n\t\tlet findAnyCamera = true;\n\t\tif (options?.findAnyCamera != null) {\n\t\t\tfindAnyCamera = options.findAnyCamera;\n\t\t}\n\t\tconst cameraPath = await this.scene.root().mainCameraController.cameraPath();\n\t\tconst warningMessage = `No camera found at path '${cameraPath}'. Make sure to set the root parameter 'mainCameraPath' to match a camera (from the top menu Windows->Root Node Params)`;\n\t\tif (findAnyCamera) {\n\t\t\tconst firstAnyCamera = this._findAnyCameraObject();\n\t\t\tif (firstAnyCamera) {\n\t\t\t\t_printWarningMessage(warningMessage);\n\n\t\t\t\treturn firstAnyCamera;\n\t\t\t}\n\t\t}\n\n\t\t_printWarningMessage(warningMessage);\n\n\t\treturn null;\n\t}\n\n\tprivate _findAnyCameraObject(): Camera | null {\n\t\tthis.cameraObjects(_cameras);\n\t\treturn _cameras[0];\n\t}\n\n\tasync createMainViewer(options?: CreateViewerOptions) {\n\t\tconst camera = await this.mainCamera({\n\t\t\tcameraMaskOverride: options?.cameraMaskOverride,\n\t\t});\n\t\tif (!camera) {\n\t\t\treturn;\n\t\t}\n\t\treturn Poly.camerasRegister.createViewer({\n\t\t\t...options,\n\t\t\tcamera,\n\t\t\tscene: this.scene,\n\t\t});\n\t}\n\n\tprivate _onCameraObjectsUpdatedCallbacks: OnCameraObjectsUpdated[] = [];\n\tonCameraObjectsUpdated(callback: OnCameraObjectsUpdated) {\n\t\tconst index = this._onCameraObjectsUpdatedCallbacks.indexOf(callback);\n\t\tif (index >= 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis._onCameraObjectsUpdatedCallbacks.push(callback);\n\t}\n\tremoveOnCameraObjectsUpdated(callback: OnCameraObjectsUpdated) {\n\t\tconst index = this._onCameraObjectsUpdatedCallbacks.indexOf(callback);\n\t\tif (index >= 0) {\n\t\t\tthis._onCameraObjectsUpdatedCallbacks.splice(index, 1);\n\t\t}\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\n\nexport class Cooker {\n\tconstructor(private _scene: PolyScene) {}\n\n\tprivate _queue: Map<CoreGraphNodeId, CoreGraphNode | undefined> = new Map();\n\tprivate _nodeIdsInFlushingQueue: Set<CoreGraphNodeId> = new Set();\n\tprivate _blockLevel: number = 0;\n\t// private _processesCount: number = 0;\n\n\tblock() {\n\t\tthis._blockLevel += 1;\n\t}\n\tunblock() {\n\t\tthis._blockLevel -= 1;\n\t\tif (this._blockLevel > 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._blockLevel < 0) {\n\t\t\tthis._blockLevel = 0;\n\t\t}\n\n\t\tthis._processQueue();\n\t}\n\n\tblocked() {\n\t\treturn this._blockLevel > 0 || this._scene.loadingController.isLoading();\n\t}\n\n\tenqueue(node: CoreGraphNode, originalTriggerGraphNode?: CoreGraphNode) {\n\t\tif (!node.dirtyController.hasPostDirtyHooks()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._queue.has(node.graphNodeId()) || this._nodeIdsInFlushingQueue.has(node.graphNodeId())) {\n\t\t\treturn;\n\t\t}\n\t\tthis._queue.set(node.graphNodeId(), originalTriggerGraphNode);\n\t}\n\n\tprivate _processQueue() {\n\t\tif (this.blocked()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._queue.size == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// this.block();\n\n\t\tconst originalTriggerGraphNodes: Array<CoreGraphNode | undefined> = [];\n\t\tconst nodeIds: CoreGraphNodeId[] = [];\n\t\tthis._queue.forEach((originalTriggerGraphNode, nodeId) => {\n\t\t\toriginalTriggerGraphNodes.push(originalTriggerGraphNode);\n\t\t\tnodeIds.push(nodeId);\n\t\t\tthis._nodeIdsInFlushingQueue.add(nodeId);\n\t\t});\n\n\t\tthis._queue.clear();\n\t\tlet i = 0;\n\t\tfor (const originalTriggerGraphNode of originalTriggerGraphNodes) {\n\t\t\tconst nodeId = nodeIds[i];\n\t\t\tthis._processItem(originalTriggerGraphNode, nodeId);\n\t\t\tthis._nodeIdsInFlushingQueue.delete(nodeId);\n\t\t\ti++;\n\t\t}\n\n\t\t// this.unblock();\n\t}\n\tprivate _processItem(originalTriggerGraphNode: CoreGraphNode | undefined, nodeId: CoreGraphNodeId) {\n\t\tconst node = this._scene.graph.nodeFromId(nodeId);\n\t\tif (node) {\n\t\t\tnode.dirtyController.runPostDirtyHooks(originalTriggerGraphNode);\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../../nodes/_Base';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\n\ntype SceneCookControllerCallback = (value: void) => void;\n\nexport class SceneCookController {\n\tprivate _cookingNodesById: Map<CoreGraphNodeId, BaseNodeType> = new Map();\n\tprivate _nodeIdsHavingCookedAtLeastOnce: Set<number> = new Set();\n\tprivate _nodeIdsCookingMoreThanOnce: Set<number> = new Set();\n\tprivate _resolves: SceneCookControllerCallback[] = [];\n\tconstructor() {}\n\n\taddNode(node: BaseNodeType) {\n\t\tconst id = node.graphNodeId();\n\t\tthis._cookingNodesById.set(id, node);\n\n\t\tif (!this._nodeIdsHavingCookedAtLeastOnce.has(id)) {\n\t\t\tthis._nodeIdsCookingMoreThanOnce.add(id);\n\t\t}\n\t\tthis._nodeIdsHavingCookedAtLeastOnce.add(id);\n\t}\n\tremoveNode(node: BaseNodeType) {\n\t\tconst id = node.graphNodeId();\n\t\tthis._cookingNodesById.delete(id);\n\t\tthis._nodeIdsCookingMoreThanOnce.delete(id);\n\n\t\tif (this._cookingNodesById.size == 0) {\n\t\t\tthis.flush();\n\t\t}\n\t}\n\tcookingNodes(target: BaseNodeType[] = []) {\n\t\ttarget.length = 0;\n\t\tthis._cookingNodesById.forEach((node, id) => {\n\t\t\ttarget.push(node);\n\t\t});\n\t\treturn target;\n\t}\n\n\tallNodesHaveCookedAtLeastOnce() {\n\t\treturn this._nodeIdsCookingMoreThanOnce.size == 0;\n\t}\n\n\tprivate flush() {\n\t\tlet callback: SceneCookControllerCallback | undefined;\n\t\twhile ((callback = this._resolves.pop())) {\n\t\t\tcallback();\n\t\t}\n\t}\n\n\tasync waitForCooksCompleted(): Promise<void> {\n\t\tif (this._cookingNodesById.size == 0) {\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis._resolves.push(resolve);\n\t\t\t});\n\t\t}\n\t}\n}\n","import {PolyScene} from '../../engine/scene/PolyScene';\nimport {CoreGraphNode} from './CoreGraphNode';\nimport {isArray} from '../Type';\nimport {addToSetAtEntry} from '../MapUtils';\n\nexport type CoreGraphNodeId = number;\ninterface NodesData {\n\tidsSet: Set<number>;\n\tidsArray: number[];\n\tnodes: CoreGraphNode[];\n}\n\ntype TraverseCallback = (id: CoreGraphNodeId) => CoreGraphNodeId[] | undefined;\n// const _graphNodes: CoreGraphNode[] = [];\nconst _idStack: number[] = [];\nconst _idsSet: Set<number> = new Set();\nexport class CoreGraph {\n\tprivate _nextId: CoreGraphNodeId = 0;\n\tprivate _scene: PolyScene | undefined;\n\tprivate _successors: Map<CoreGraphNodeId, NodesData> = new Map();\n\tprivate _predecessors: Map<CoreGraphNodeId, NodesData> = new Map();\n\tprivate _nodesById: Map<number, CoreGraphNode> = new Map();\n\tprivate _forbiddenTriggerNodeIds: Map<CoreGraphNodeId, Set<CoreGraphNodeId>> = new Map();\n\tprivate _selfDirtyForbidden: Set<CoreGraphNodeId> = new Set();\n\tprivate _nodesCount = 0;\n\n\tprivate _debugging = false;\n\tprivate _addedNodesDuringDebugging: Map<CoreGraphNodeId, CoreGraphNode> = new Map();\n\tstartDebugging() {\n\t\tthis._debugging = true;\n\t}\n\tstopDebugging() {\n\t\tthis._debugging = false;\n\t}\n\tprintDebug() {\n\t\tthis._addedNodesDuringDebugging.forEach((node, nodeId) => {\n\t\t\tconsole.log(nodeId, node, node.graphPredecessors(), node.graphSuccessors());\n\t\t});\n\t}\n\t// print() {\n\t// \tthis._nodesById.forEach((node, nodeId) => {\n\t// \t\tconsole.log(nodeId, node, node.graphPredecessors(), node.graphSuccessors());\n\t// \t});\n\t// }\n\n\tsetScene(scene: PolyScene) {\n\t\tthis._scene = scene;\n\t}\n\tscene() {\n\t\treturn this._scene;\n\t}\n\n\tnextId(): CoreGraphNodeId {\n\t\tthis._nextId += 1;\n\t\treturn this._nextId;\n\t}\n\n\tnodesFromIds(ids: number[], target: CoreGraphNode[]): void {\n\t\ttarget.length = 0;\n\t\tfor (const id of ids) {\n\t\t\tconst node = this.nodeFromId(id);\n\t\t\tif (node) {\n\t\t\t\ttarget.push(node);\n\t\t\t}\n\t\t}\n\t}\n\tnodeFromId(id: number): CoreGraphNode | undefined {\n\t\treturn this._nodesById.get(id);\n\t}\n\thasNode(node: CoreGraphNode): boolean {\n\t\treturn this._nodesById.get(node.graphNodeId()) != null;\n\t}\n\taddNode(node: CoreGraphNode) {\n\t\tthis._nodesById.set(node.graphNodeId(), node);\n\t\tthis._nodesCount += 1;\n\t\tif (this._debugging) {\n\t\t\tthis._addedNodesDuringDebugging.set(node.graphNodeId(), node);\n\t\t}\n\t}\n\tremoveNode(node: CoreGraphNode) {\n\t\tthis.disconnectPredecessors(node);\n\t\tthis.disconnectSuccessors(node);\n\t\tconst nodeId = node.graphNodeId();\n\t\tthis._nodesById.delete(nodeId);\n\t\tthis._successors.delete(nodeId);\n\t\tthis._predecessors.delete(nodeId);\n\t\tthis._nodesCount -= 1;\n\n\t\tthis._forbiddenTriggerNodeIds.delete(nodeId);\n\t\tthis._forbiddenTriggerNodeIds.forEach((set, nodeId) => {\n\t\t\tif (set.has(nodeId)) {\n\t\t\t\tset.delete(nodeId);\n\t\t\t}\n\t\t});\n\t\tthis._selfDirtyForbidden.delete(nodeId);\n\n\t\tif (this._debugging) {\n\t\t\tthis._addedNodesDuringDebugging.delete(nodeId);\n\t\t}\n\t}\n\tnodesCount() {\n\t\treturn this._nodesCount;\n\t}\n\tconnect(src: CoreGraphNode, dest: CoreGraphNode, checkCycle = true): boolean {\n\t\tconst srcId = src.graphNodeId();\n\t\tconst destId = dest.graphNodeId();\n\n\t\tif (!(this.hasNode(src) && this.hasNode(dest))) {\n\t\t\tconsole.warn(`attempt to connect non existing node ${srcId} or ${destId}`);\n\t\t\treturn false;\n\t\t}\n\n\t\t// if checkCycle is passed as false, that means we never check.\n\t\t// this can be useful when we know that the connection will not create a cycle,\n\t\t// such as when connecting params or inputs to a node\n\t\tif (checkCycle) {\n\t\t\tconst sceneLoading = this._scene ? this._scene.loadingController.isLoading() : true;\n\t\t\tcheckCycle = !sceneLoading;\n\t\t}\n\t\tconst graphWouldHaveCycle = checkCycle ? src.hasPredecessor(dest) : false;\n\t\t// if (checkCycle) {\n\t\t// \tgraphWouldHaveCycle = this._hasPredecessor(srcId, destId);\n\t\t// }\n\n\t\tif (graphWouldHaveCycle) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\tthis._createConnection(srcId, destId);\n\t\t\tsrc.clearCachesWithPredecessorsAndSuccessors();\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tdisconnect(src: CoreGraphNode, dest: CoreGraphNode) {\n\t\tthis._removeConnection(src.graphNodeId(), dest.graphNodeId());\n\n\t\tsrc.clearCachesWithPredecessorsAndSuccessors();\n\t\tdest.clearCachesWithPredecessorsAndSuccessors();\n\t}\n\tdisconnectPredecessors(node: CoreGraphNode) {\n\t\tconst predecessors = this.predecessors(node);\n\t\tif (!predecessors) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const predecessor of predecessors) {\n\t\t\tthis.disconnect(predecessor, node);\n\t\t}\n\t}\n\tdisconnectSuccessors(node: CoreGraphNode) {\n\t\tconst successors = this.successors(node);\n\t\tif (!successors) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const successor of successors) {\n\t\t\tthis.disconnect(node, successor);\n\t\t}\n\t}\n\n\tpredecessorIds(id: CoreGraphNodeId): CoreGraphNodeId[] | undefined {\n\t\treturn this._predecessors.get(id)?.idsArray;\n\t}\n\tpredecessors(node: CoreGraphNode): CoreGraphNode[] | undefined {\n\t\treturn this._predecessors.get(node.graphNodeId())?.nodes;\n\t}\n\tsuccessorIds(id: CoreGraphNodeId): CoreGraphNodeId[] | undefined {\n\t\treturn this._successors.get(id)?.idsArray;\n\t}\n\tsuccessors(node: CoreGraphNode): CoreGraphNode[] | undefined {\n\t\treturn this._successors.get(node.graphNodeId())?.nodes;\n\t}\n\tprivate _boundPredecessorIds: TraverseCallback = this.predecessorIds.bind(this);\n\tprivate _boundSuccessorIds: TraverseCallback = this.successorIds.bind(this);\n\t// private _allNodeIds(node: CoreGraphNode, method: TraverseCallback, target: CoreGraphNodeId[]): void {\n\t// \ttarget.length = 0;\n\t// \t_idsSet.clear();\n\t// \t_idStack.length = 1;\n\t// \t_idStack[0] = node.graphNodeId();\n\t// \tconst forbiddenIds = this._forbiddenTriggerNodeIds.get(node.graphNodeId())\n\n\t// \twhile (_idStack.length > 0) {\n\t// \t\tconst currentId = _idStack.pop()!;\n\t// \t\tconst ids = method(currentId);\n\t// \t\tif (ids) {\n\t// \t\t\tfor (const id of ids) {\n\t// \t\t\t\tif (!_idsSet.has(id)) {\n\t// \t\t\t\t\t_idsSet.add(id);\n\t// \t\t\t\t\ttarget.push(id);\n\t// \t\t\t\t\t_idStack.push(id);\n\t// \t\t\t\t}\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// }\n\tallPredecessorIds(node: CoreGraphNode, target: CoreGraphNodeId[]): void {\n\t\t// this._allNodeIds(node, this._boundPredecessorIds, target);\n\t\ttarget.length = 0;\n\t\t_idsSet.clear();\n\t\t_idStack.length = 1;\n\t\t_idStack[0] = node.graphNodeId();\n\n\t\twhile (_idStack.length > 0) {\n\t\t\tconst currentId = _idStack.pop()!;\n\t\t\tconst ids = this._boundPredecessorIds(currentId);\n\t\t\tif (ids) {\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (!_idsSet.has(id)) {\n\t\t\t\t\t\t_idsSet.add(id);\n\t\t\t\t\t\ttarget.push(id);\n\t\t\t\t\t\t_idStack.push(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tallSuccessorIds(node: CoreGraphNode, target: CoreGraphNodeId[]): void {\n\t\t// this._allNodeIds(node, this._boundSuccessorIds, target);\n\t\ttarget.length = 0;\n\t\t_idsSet.clear();\n\t\t_idStack.length = 1;\n\t\t_idStack[0] = node.graphNodeId();\n\t\tconst forbiddenIds = this._forbiddenTriggerNodeIds.get(node.graphNodeId());\n\n\t\twhile (_idStack.length > 0) {\n\t\t\tconst currentId = _idStack.pop()!;\n\t\t\tconst ids = this._boundSuccessorIds(currentId);\n\t\t\tif (ids) {\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (!_idsSet.has(id)) {\n\t\t\t\t\t\t_idsSet.add(id);\n\t\t\t\t\t\tif (forbiddenIds == null || !forbiddenIds.has(id)) {\n\t\t\t\t\t\t\ttarget.push(id);\n\t\t\t\t\t\t\t_idStack.push(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// private _allNodes(node: CoreGraphNode, method: TraverseCallback, target: CoreGraphNode[]): void {\n\t// \ttarget.length = 0;\n\t// \t_idsSet.clear();\n\t// \t_idStack.length = 1;\n\t// \t_idStack[0] = node.graphNodeId();\n\n\t// \twhile (_idStack.length > 0) {\n\t// \t\tconst currentId = _idStack.pop()!;\n\t// \t\tconst ids = method(currentId);\n\t// \t\tif (ids) {\n\t// \t\t\tfor (const id of ids) {\n\t// \t\t\t\tif (!_idsSet.has(id)) {\n\t// \t\t\t\t\t_idsSet.add(id);\n\t// \t\t\t\t\tconst otherNode = this._nodesById.get(id);\n\t// \t\t\t\t\tif (otherNode) {\n\t// \t\t\t\t\t\ttarget.push(otherNode);\n\t// \t\t\t\t\t}\n\t// \t\t\t\t\t_idStack.push(id);\n\t// \t\t\t\t}\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// }\n\tallPredecessors(node: CoreGraphNode, target: CoreGraphNode[]): void {\n\t\t// this._allNodes(node, this._boundPredecessorIds, target);\n\t\ttarget.length = 0;\n\t\t_idsSet.clear();\n\t\t_idStack.length = 1;\n\t\t_idStack[0] = node.graphNodeId();\n\n\t\twhile (_idStack.length > 0) {\n\t\t\tconst currentId = _idStack.pop()!;\n\t\t\tconst ids = this._boundPredecessorIds(currentId);\n\t\t\tif (ids) {\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (!_idsSet.has(id)) {\n\t\t\t\t\t\t_idsSet.add(id);\n\t\t\t\t\t\tconst otherNode = this._nodesById.get(id);\n\t\t\t\t\t\tif (otherNode) {\n\t\t\t\t\t\t\ttarget.push(otherNode);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_idStack.push(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tallSuccessors(node: CoreGraphNode, target: CoreGraphNode[]): void {\n\t\t// this._allNodes(node, this._boundSuccessorIds, target);\n\t\ttarget.length = 0;\n\t\t_idsSet.clear();\n\t\t_idStack.length = 1;\n\t\t_idStack[0] = node.graphNodeId();\n\t\tconst forbiddenIds = this._forbiddenTriggerNodeIds.get(node.graphNodeId());\n\n\t\twhile (_idStack.length > 0) {\n\t\t\tconst currentId = _idStack.pop()!;\n\t\t\tconst ids = this._boundSuccessorIds(currentId);\n\t\t\tif (ids) {\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (!_idsSet.has(id)) {\n\t\t\t\t\t\t_idsSet.add(id);\n\t\t\t\t\t\tif (forbiddenIds == null || !forbiddenIds.has(id)) {\n\t\t\t\t\t\t\tconst otherNode = this._nodesById.get(id);\n\t\t\t\t\t\t\tif (otherNode) {\n\t\t\t\t\t\t\t\ttarget.push(otherNode);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t_idStack.push(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _createConnection(srcId: CoreGraphNodeId, destId: CoreGraphNodeId) {\n\t\tlet successorsData = this._successors.get(srcId);\n\t\tlet predecessorsData = this._predecessors.get(destId);\n\n\t\t// add data if not present\n\t\tif (!successorsData) {\n\t\t\tsuccessorsData = {idsSet: new Set(), idsArray: [], nodes: []};\n\t\t\tthis._successors.set(srcId, successorsData);\n\t\t}\n\t\tif (!predecessorsData) {\n\t\t\tpredecessorsData = {idsSet: new Set(), idsArray: [], nodes: []};\n\t\t\tthis._predecessors.set(destId, predecessorsData);\n\t\t}\n\n\t\t// successor\n\t\tif (!successorsData.idsSet.has(destId)) {\n\t\t\tsuccessorsData.idsSet.add(destId);\n\t\t\tsuccessorsData.idsArray.push(destId);\n\t\t\tconst destNode = this._nodesById.get(destId);\n\t\t\tif (destNode) {\n\t\t\t\tsuccessorsData.nodes.push(destNode);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`creating connection with node not in graph ${destId}`);\n\t\t\t}\n\t\t}\n\n\t\t// predecessor\n\t\tif (!predecessorsData.idsSet.has(srcId)) {\n\t\t\tpredecessorsData.idsSet.add(srcId);\n\t\t\tpredecessorsData.idsArray.push(srcId);\n\t\t\tconst srcNode = this._nodesById.get(srcId);\n\t\t\tif (srcNode) {\n\t\t\t\tpredecessorsData.nodes.push(srcNode);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`creating connection with node not in graph ${srcId}`);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _removeConnection(srcId: CoreGraphNodeId, destId: CoreGraphNodeId) {\n\t\t// remove successors\n\t\tconst successorsData = this._successors.get(srcId);\n\t\tif (successorsData && successorsData.idsSet.has(destId)) {\n\t\t\tsuccessorsData.idsSet.delete(destId);\n\t\t\tconst idIndex = successorsData.idsArray.indexOf(destId);\n\t\t\tif (idIndex >= 0) {\n\t\t\t\tsuccessorsData.idsArray.splice(idIndex, 1);\n\t\t\t\tsuccessorsData.nodes.splice(idIndex, 1);\n\t\t\t} else {\n\t\t\t\tconsole.warn(`could not find id ${destId} in successorsData.idsArray`, successorsData.idsArray);\n\t\t\t}\n\t\t}\n\t\t// remove predecessors\n\t\tconst predecessorsData = this._predecessors.get(destId);\n\t\tif (predecessorsData && predecessorsData.idsSet.has(srcId)) {\n\t\t\tpredecessorsData.idsSet.delete(srcId);\n\t\t\tconst idIndex = predecessorsData.idsArray.indexOf(srcId);\n\t\t\tif (idIndex >= 0) {\n\t\t\t\tpredecessorsData.idsArray.splice(idIndex, 1);\n\t\t\t\tpredecessorsData.nodes.splice(idIndex, 1);\n\t\t\t} else {\n\t\t\t\tconsole.warn(`could not find id ${srcId} in predecessorsData.idsArray`, predecessorsData.idsArray);\n\t\t\t}\n\t\t}\n\t}\n\tsetForbiddenTriggerNodes(src: CoreGraphNode, dest: CoreGraphNode | CoreGraphNode[]) {\n\t\t// if (this._forbiddenTriggerNodeIds) {\n\t\tthis._forbiddenTriggerNodeIds.get(src.graphNodeId())?.clear();\n\t\t// } else {\n\t\t// this._forbiddenTriggerNodeIds = new Set();\n\t\t// }\n\t\tif (isArray(dest)) {\n\t\t\tfor (const destNode of dest) {\n\t\t\t\taddToSetAtEntry(this._forbiddenTriggerNodeIds, src.graphNodeId(), destNode.graphNodeId());\n\t\t\t\t// this._forbiddenTriggerNodeIds.add(node.graphNodeId());\n\t\t\t\t// node.clearCachesWithPredecessorsAndSuccessors();\n\t\t\t}\n\t\t} else {\n\t\t\taddToSetAtEntry(this._forbiddenTriggerNodeIds, src.graphNodeId(), dest.graphNodeId());\n\t\t\t// this._forbiddenTriggerNodeIds.add(nodes.graphNodeId());\n\t\t}\n\t}\n\tclearForbiddenTriggerNodes(src: CoreGraphNode) {\n\t\tthis._forbiddenTriggerNodeIds.delete(src.graphNodeId());\n\t}\n\tsetSelfDirtyForbidden(node: CoreGraphNode, state: boolean) {\n\t\tif (state) {\n\t\t\tthis._selfDirtyForbidden.add(node.graphNodeId());\n\t\t} else {\n\t\t\tthis._selfDirtyForbidden.delete(node.graphNodeId());\n\t\t}\n\t}\n\tselfDirtyForbidden(node: CoreGraphNode): boolean {\n\t\treturn this._selfDirtyForbidden.has(node.graphNodeId());\n\t}\n}\n","import {BaseNodeType} from '../../engine/nodes/_Base';\n\nexport interface PerformancePrintObject {\n\tfullPath: string;\n\tcooks_count: number;\n\ttotal_time: number;\n\ttotal_cook_time: number;\n\tcook_time_per_iteration: number;\n\t// cook_time_total_with_inputs: number;\n\t// cook_time_total_with_inputs_per_iteration: number;\n\tinputs_time_per_iteration: number;\n\tparams_time_per_iteration: number;\n}\n\nimport {NodePerformanceData} from '../../engine/nodes/utils/cook/PerformanceController';\nexport class PerformanceNode {\n\t_cooks_count: number = 0;\n\t_total_cook_time: number = 0;\n\t_total_inputs_time: number = 0;\n\t_total_params_time: number = 0;\n\tconstructor(private _node: BaseNodeType) {}\n\n\tupdate_cook_data(performance_data: NodePerformanceData): void {\n\t\tthis._cooks_count += 1;\n\t\tthis._total_cook_time += performance_data.cookTime;\n\t\tthis._total_inputs_time += performance_data.inputsTime;\n\t\tthis._total_params_time += performance_data.paramsTime;\n\t}\n\ttotal_time(): number {\n\t\treturn this._total_cook_time + this._total_inputs_time + this._total_params_time;\n\t}\n\ttotal_cook_time(): number {\n\t\treturn this._total_cook_time;\n\t}\n\tcook_time_per_iteration(): number {\n\t\tif (this._cooks_count > 0) {\n\t\t\treturn this._total_cook_time / this._cooks_count;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\ttotal_inputs_time(): number {\n\t\treturn this._total_inputs_time;\n\t}\n\tinputs_time_per_iteration(): number {\n\t\tif (this._cooks_count > 0) {\n\t\t\treturn this._total_inputs_time / this._cooks_count;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\ttotal_params_time2(): number {\n\t\treturn this._total_params_time;\n\t}\n\tparams_time_per_iteration2(): number {\n\t\tif (this._cooks_count > 0) {\n\t\t\treturn this._total_params_time / this._cooks_count;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tcooks_count(): number {\n\t\treturn this._cooks_count;\n\t}\n\n\tprint_object(): PerformancePrintObject {\n\t\treturn {\n\t\t\tfullPath: this._node.path(),\n\t\t\tcooks_count: this.cooks_count(),\n\t\t\ttotal_time: this.total_time(),\n\t\t\ttotal_cook_time: this.total_cook_time(),\n\t\t\tcook_time_per_iteration: this.cook_time_per_iteration(),\n\t\t\t// cook_time_total_with_inputs: this.cook_time_total_with_inputs,\n\t\t\t// cook_time_total_with_inputs_per_iteration: this.cook_time_total_with_inputs_per_iteration,\n\t\t\tinputs_time_per_iteration: this.inputs_time_per_iteration(),\n\t\t\tparams_time_per_iteration: this.params_time_per_iteration2(),\n\t\t};\n\t}\n}\n","import {PerformanceNode} from './PerformanceNode';\nimport {NodePerformanceData} from '../../engine/nodes/utils/cook/PerformanceController';\nimport {BaseNodeType} from '../../engine/nodes/_Base';\nimport {arraySortBy, arrayUniq} from '../ArrayUtils';\nimport {objectClone} from '../ObjectUtils';\nimport {PolyDictionary} from '../../types/GlobalTypes';\nimport {Poly} from '../../engine/Poly';\n\nexport class CorePerformance {\n\tprivate _started: boolean = false;\n\t_start_time: number | null = 0;\n\t_previous_timestamp: number = 0;\n\t_nodes_cook_data: PolyDictionary<PerformanceNode> = {};\n\t_durations_by_name: PolyDictionary<number> = {};\n\t_durations_count_by_name: PolyDictionary<number> = {};\n\n\tprofile(name: string, method: (args?: any) => any) {\n\t\tconst performance = Poly.performance.performanceManager();\n\t\tconst start_time = performance.now();\n\t\tmethod();\n\t\tconst total_time = performance.now() - start_time;\n\t\tconsole.log(`${name}: ${total_time}`);\n\t}\n\n\tstart() {\n\t\tif (!this._started) {\n\t\t\tthis.reset();\n\t\t\tthis._started = true;\n\t\t\tconst performance = Poly.performance.performanceManager();\n\t\t\tthis._start_time = performance.now();\n\t\t\tthis._nodes_cook_data = {};\n\t\t\tthis._previous_timestamp = this._start_time;\n\t\t}\n\t}\n\tstop() {\n\t\tthis.reset();\n\t}\n\treset() {\n\t\tthis._started = false;\n\t\tthis._start_time = null;\n\t\tthis._durations_by_name = {};\n\t\tthis._durations_count_by_name = {};\n\t\tthis._nodes_cook_data = {};\n\t}\n\n\tstarted(): boolean {\n\t\treturn this._started;\n\t}\n\n\trecordNodeCookData(node: BaseNodeType, performance_data: NodePerformanceData) {\n\t\tconst id = node.graphNodeId();\n\t\tif (this._nodes_cook_data[id] == null) {\n\t\t\tthis._nodes_cook_data[id] = new PerformanceNode(node);\n\t\t}\n\t\tthis._nodes_cook_data[id].update_cook_data(performance_data);\n\t}\n\n\trecord(name: string) {\n\t\tif (!this.started()) {\n\t\t\tthis.start();\n\t\t}\n\n\t\tconst current_timestamp = performance.now();\n\n\t\tif (this._durations_by_name[name] == null) {\n\t\t\tthis._durations_by_name[name] = 0;\n\t\t}\n\t\tthis._durations_by_name[name] += current_timestamp - this._previous_timestamp;\n\t\tif (this._durations_count_by_name[name] == null) {\n\t\t\tthis._durations_count_by_name[name] = 0;\n\t\t}\n\t\tthis._durations_count_by_name[name] += 1;\n\n\t\treturn (this._previous_timestamp = current_timestamp);\n\t}\n\n\tprint() {\n\t\tthis.print_node_cook_data();\n\t\tthis.print_recordings();\n\t}\n\n\tprint_node_cook_data() {\n\t\tlet performance_nodes = Object.values(this._nodes_cook_data);\n\t\tperformance_nodes = arraySortBy(performance_nodes, (performance_node) => performance_node.total_cook_time());\n\n\t\tconst print_objects = performance_nodes.map((performance_node) => performance_node.print_object());\n\n\t\tconsole.log('--------------- NODES COOK TIME -----------');\n\n\t\tconst table_entries = [];\n\t\tconst sorted_print_objects = arraySortBy(print_objects, (print_object) => -print_object.total_cook_time);\n\t\tfor (const print_object of sorted_print_objects) {\n\t\t\ttable_entries.push(print_object);\n\t\t}\n\n\t\tconsole.table(table_entries);\n\n\t\treturn print_objects;\n\t}\n\n\tprint_recordings() {\n\t\tconst durations_by_name = objectClone(this._durations_by_name);\n\t\tconst durations_count_by_name = objectClone(this._durations_count_by_name);\n\n\t\tconst durations = [];\n\t\tconst names_by_duration: PolyDictionary<string[]> = {};\n\n\t\tfor (const name of Object.keys(durations_by_name)) {\n\t\t\tconst duration = durations_by_name[name];\n\n\t\t\tdurations.push(duration);\n\t\t\tif (names_by_duration[duration] == null) {\n\t\t\t\tnames_by_duration[duration] = [];\n\t\t\t}\n\t\t\tnames_by_duration[duration].push(name);\n\t\t}\n\n\t\tdurations.sort((a, b) => a - b);\n\t\tconst sortedDurations: number[] = [];\n\t\tarrayUniq(durations, sortedDurations);\n\n\t\tconsole.log('--------------- PERF RECORDINGS -----------');\n\t\tconst table_entries = [];\n\t\tfor (const duration of sortedDurations) {\n\t\t\tconst names = names_by_duration[duration];\n\t\t\tfor (const name of names) {\n\t\t\t\tconst count = durations_count_by_name[name];\n\t\t\t\tconst duration_per_iteration = duration / count;\n\n\t\t\t\tconst entry = {duration, name, count, duration_per_iteration};\n\t\t\t\ttable_entries.push(entry);\n\t\t\t}\n\t\t}\n\n\t\tconsole.table(table_entries);\n\t\treturn table_entries;\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {SceneEvent} from '../../poly/SceneEvent';\nimport {NodeEvent} from '../../poly/NodeEvent';\nimport {ParamEvent} from '../../poly/ParamEvent';\nimport {ActorEvaluator} from '../../nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {DebugLine} from '../../functions/_Debug';\n\nexport interface DebugLinesContainer {\n\tnodePath: string;\n\tdebugLines: DebugLine[];\n}\nexport interface EventsListener {\n\tprocessEvents: (emitter: CoreGraphNode, event: SceneEvent | NodeEvent | ParamEvent, data?: any) => void;\n\tprocessActorEvaluator(evaluator: ActorEvaluator): ActorEvaluator;\n\tactorEvaluatorDebug(options: DebugLinesContainer): void;\n}\ntype OnAddListenerCallback = () => void;\n\nexport class DispatchController {\n\tprivate _onAddListenerCallbacks: OnAddListenerCallback[] | undefined;\n\tconstructor(private scene: PolyScene) {}\n\n\tprivate _eventsListener: EventsListener | undefined;\n\n\tsetListener(eventsListener: EventsListener) {\n\t\t// let's have a single listener for now\n\t\t// which is a constraint I've added when adding on_add_listener\n\t\tif (!this._eventsListener) {\n\t\t\tthis._eventsListener = eventsListener;\n\t\t\tthis._runOnAddListenerCallbacks();\n\t\t} else {\n\t\t\tconsole.warn('scene already has a listener');\n\t\t}\n\t}\n\tonAddListener(callback: OnAddListenerCallback) {\n\t\tif (this._eventsListener) {\n\t\t\tcallback();\n\t\t} else {\n\t\t\tthis._onAddListenerCallbacks = this._onAddListenerCallbacks || [];\n\t\t\tthis._onAddListenerCallbacks.push(callback);\n\t\t}\n\t}\n\tprivate _runOnAddListenerCallbacks() {\n\t\tif (this._onAddListenerCallbacks) {\n\t\t\tlet callback: OnAddListenerCallback | undefined;\n\t\t\twhile ((callback = this._onAddListenerCallbacks.pop())) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t\tthis._onAddListenerCallbacks = undefined;\n\t\t}\n\t}\n\n\tdispatch(emitter: CoreGraphNode, event: SceneEvent | NodeEvent | ParamEvent, data?: any) {\n\t\tthis._eventsListener?.processEvents(emitter, event, data);\n\t}\n\temitAllowed(): boolean {\n\t\treturn (\n\t\t\tthis._eventsListener != null &&\n\t\t\tthis.scene.loadingController.loaded() &&\n\t\t\tthis.scene.loadingController.autoUpdating()\n\t\t);\n\t}\n\tprocessActorEvaluator(evaluator: ActorEvaluator) {\n\t\treturn this._eventsListener?.processActorEvaluator(evaluator);\n\t}\n\tactorEvaluatorDebug(options: DebugLinesContainer) {\n\t\treturn this._eventsListener?.actorEvaluatorDebug(options);\n\t}\n}\n","import {BaseParamType} from '../../params/_Base';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\n\nexport class SceneExpressionsController {\n\tprivate _paramsById: Map<CoreGraphNodeId, BaseParamType> = new Map();\n\tconstructor() {}\n\n\tregisterParam(param: BaseParamType) {\n\t\tthis._paramsById.set(param.graphNodeId(), param);\n\t}\n\tderegisterParam(param: BaseParamType) {\n\t\tthis._paramsById.delete(param.graphNodeId());\n\t}\n\n\t//\n\t//\n\t//\n\t//\n\tregenerateReferringExpressions(node: BaseNodeType) {\n\t\tnode.nameController.graphNode().setSuccessorsDirty(node);\n\t}\n}\n","import {PolyScene} from '../PolyScene';\n\n// TODO: considerer removing this module\n// since now the on create hooks should all be in the editor\nexport class SceneLifeCycleController {\n\tconstructor(private scene: PolyScene) {}\n\n\tprivate _lifecycleOnAfterCreatedAllowed: boolean = true;\n\n\tonAfterCreatedCallbackAllowed(): boolean {\n\t\treturn this.scene.loadingController.loaded() && this._lifecycleOnAfterCreatedAllowed;\n\t}\n\n\tonAfterCreatedPrevent(callback: () => void) {\n\t\tthis._lifecycleOnAfterCreatedAllowed = false;\n\t\tcallback();\n\t\tthis._lifecycleOnAfterCreatedAllowed = true;\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {SCENE_EVENT_CREATED_EVENT_CONTEXT, SCENE_EVENT_READY_EVENT_CONTEXT} from './events/SceneEventsController';\n\nexport class LoadingController {\n\tconstructor(private scene: PolyScene) {}\n\n\tprivate _loadingState: boolean = true;\n\tprivate _autoUpdating: boolean = false;\n\n\tmarkAsLoading() {\n\t\tthis._setLoadingState(true);\n\t}\n\tmarkAsLoaded() {\n\t\tthis.scene.missingExpressionReferencesController.resolveMissingReferences();\n\t\tthis._setLoadingState(false);\n\t\tthis._triggerLoadedEvent();\n\t}\n\tdispatchReadyEvent() {\n\t\tif (globalThis.Event) {\n\t\t\tthis.scene.eventsDispatcher.sceneEventsController.dispatch(SCENE_EVENT_READY_EVENT_CONTEXT);\n\t\t}\n\t}\n\tprivate _triggerLoadedEvent() {\n\t\t// we only dispatch events in the browser. If this is run from nodejs, we do not.\n\t\tif (globalThis.Event) {\n\t\t\tthis.scene.eventsDispatcher.sceneEventsController.dispatch(SCENE_EVENT_CREATED_EVENT_CONTEXT);\n\t\t}\n\t}\n\n\tprivate _setLoadingState(state: boolean) {\n\t\tthis._loadingState = state;\n\t\tthis.setAutoUpdate(!this._loadingState);\n\t\tthis.scene.cooker.unblock();\n\t}\n\tisLoading() {\n\t\treturn this._loadingState;\n\t}\n\tloaded() {\n\t\treturn !this._loadingState;\n\t}\n\tautoUpdating() {\n\t\treturn this._autoUpdating;\n\t}\n\tsetAutoUpdate(newState: boolean) {\n\t\tif (this._autoUpdating !== newState) {\n\t\t\tthis._autoUpdating = newState;\n\t\t\tif (this._autoUpdating) {\n\t\t\t\t// if this.env_is_development()\n\t\t\t\t// \tthis.performance().start()\n\n\t\t\t\tconst root = this.scene.root();\n\t\t\t\tif (root) {\n\t\t\t\t\troot.processQueue();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseParamType} from '../../../params/_Base';\nimport {CoreWalker} from '../../../../core/Walker';\n\nexport class MissingReference {\n\tconstructor(private param: BaseParamType, public readonly path: string) {}\n\n\tabsolutePath() {\n\t\tif (!this.param.node) {\n\t\t\treturn;\n\t\t}\n\t\treturn CoreWalker.makeAbsolutePath(this.param.node, this.path);\n\t}\n\tmatchesPath(path: string): boolean {\n\t\treturn this.absolutePath() == path;\n\t}\n\n\tresolveMissingDependencies() {\n\t\tconst input = this.param.rawInputSerialized();\n\t\tthis.param.set(this.param.defaultValue());\n\t\tthis.param.set(input);\n\t}\n}\n","import {BaseNodeType} from '../../../nodes/_Base';\nimport {BaseParamType} from '../../../params/_Base';\nimport {MissingReference} from './MissingReference';\nimport {addToSetAtEntry, mapValuesToArray} from '../../../../core/MapUtils';\nimport {PolyScene} from '../../PolyScene';\nimport {CoreWalker} from '../../../../core/Walker';\nimport {CoreGraphNodeId} from '../../../../core/graph/CoreGraph';\nimport {setToArray} from '../../../../core/SetUtils';\nimport jsep from 'jsep';\n\nconst _resolvedReferences: MissingReference[] = [];\nconst _missingReferences: MissingReference[] = [];\nconst _missingReferencesSet: Set<MissingReference>[] = [];\nexport class MissingReferencesController {\n\tprivate references: Map<CoreGraphNodeId, Set<MissingReference>> = new Map();\n\tprivate _toIgnore: WeakMap<jsep.Expression, boolean> = new WeakMap();\n\n\tconstructor(private scene: PolyScene) {}\n\n\tregister(param: BaseParamType, path: string, jsepNode?: jsep.Expression): MissingReference | undefined {\n\t\tif (jsepNode && this._toIgnore.get(jsepNode) == true) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst missingReference = new MissingReference(param, path);\n\t\taddToSetAtEntry(this.references, param.graphNodeId(), missingReference);\n\n\t\treturn missingReference;\n\t}\n\tderegisterParam(param: BaseParamType) {\n\t\tthis.references.delete(param.graphNodeId());\n\t}\n\n\tregisterToIgnore(jsepNode: jsep.Expression) {\n\t\tthis._toIgnore.set(jsepNode, true);\n\t}\n\n\t//\n\t//\n\t// MISSING REFERENCES\n\t//\n\t//\n\tresolveMissingReferences() {\n\t\t_resolvedReferences.length = 0;\n\t\tthis.references.forEach((references) => {\n\t\t\treferences.forEach((reference) => {\n\t\t\t\tif (this._isReferenceResolvable(reference)) {\n\t\t\t\t\t_resolvedReferences.push(reference);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tfor (const reference of _resolvedReferences) {\n\t\t\treference.resolveMissingDependencies();\n\t\t}\n\t}\n\tprivate _isReferenceResolvable(reference: MissingReference) {\n\t\tconst absolutePath = reference.absolutePath();\n\t\tif (absolutePath) {\n\t\t\tconst node = this.scene.node(absolutePath);\n\t\t\t// try and find a node first\n\t\t\tif (node) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\t// if no node, try and find a param, via a parent first\n\t\t\t\tconst paths = CoreWalker.splitParentChild(absolutePath);\n\t\t\t\tif (paths.child) {\n\t\t\t\t\tconst parentNode = this.scene.node(paths.parent);\n\t\t\t\t\tif (parentNode) {\n\t\t\t\t\t\tconst param = parentNode.params.get(paths.child);\n\t\t\t\t\t\tif (param) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// call this from node.create and node.rename\n\tcheckForMissingNodeReferences(node: BaseNodeType) {\n\t\tif (!node.scene().loadingController.loaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._checkForMissingReferencesForNode(node);\n\t\tfor (const param of node.params.all) {\n\t\t\tthis._checkForMissingReferencesForParam(param);\n\t\t}\n\t}\n\t// call this from spare params update\n\tcheckForMissingParamReferences(param: BaseParamType) {\n\t\tif (!param.scene().loadingController.loaded()) {\n\t\t\treturn;\n\t\t}\n\t\tthis._checkForMissingReferencesForParam(param);\n\t}\n\tprivate _checkForMissingReferencesForNode(node: BaseNodeType) {\n\t\tconst id = node.graphNodeId();\n\n\t\tmapValuesToArray(this.references, _missingReferencesSet);\n\t\tfor (const missingReferenceSet of _missingReferencesSet) {\n\t\t\tlet matchFound = false;\n\t\t\tsetToArray(missingReferenceSet, _missingReferences);\n\t\t\tfor (const ref of _missingReferences) {\n\t\t\t\tif (ref.matchesPath(node.path())) {\n\t\t\t\t\tmatchFound = true;\n\t\t\t\t\tref.resolveMissingDependencies();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matchFound) {\n\t\t\t\tthis.references.delete(id);\n\t\t\t}\n\t\t}\n\t}\n\tprivate _checkForMissingReferencesForParam(param: BaseParamType) {\n\t\tconst id = param.graphNodeId();\n\n\t\tmapValuesToArray(this.references, _missingReferencesSet);\n\t\tfor (const missingReferenceSet of _missingReferencesSet) {\n\t\t\tlet matchFound = false;\n\t\t\tsetToArray(missingReferenceSet, _missingReferences);\n\t\t\tfor (const ref of _missingReferences) {\n\t\t\t\tif (ref.matchesPath(param.path())) {\n\t\t\t\t\tmatchFound = true;\n\t\t\t\t\tref.resolveMissingDependencies();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matchFound) {\n\t\t\t\tthis.references.delete(id);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {BaseParamType} from '../../params/_Base';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\nimport {Ref, ref} from '@vue/reactivity';\n\ntype GraphNode = BaseNodeType | BaseParamType;\nexport class GraphNodesController {\n\tprivate _graphNodeIdByPath: Map<string, Ref<CoreGraphNodeId | null>> = new Map();\n\tprivate _pathByGraphNodeId: Map<CoreGraphNodeId, string> = new Map();\n\tconstructor(protected scene: PolyScene) {}\n\n\tnotifyNodePathChanged(node: BaseNodeType) {\n\t\tthis._notifyGraphNodePathChanged(node);\n\t\tconst params = node.params.all;\n\t\tfor (const param of params) {\n\t\t\tthis.notifyParamPathChanged(param);\n\t\t}\n\n\t\tnode.childrenController?.traverseChildren((child) => {\n\t\t\tthis._notifyGraphNodePathChanged(child);\n\t\t});\n\t}\n\tnotifyParamPathChanged(param: BaseParamType) {\n\t\tthis._notifyGraphNodePathChanged(param);\n\t}\n\tprivate _notifyGraphNodePathChanged(node: GraphNode) {\n\t\tconst id = node.graphNodeId();\n\t\tconst newPath = node.path();\n\t\t// set id of previous path to null\n\t\tconst previousPath = this._pathByGraphNodeId.get(id);\n\t\tif (previousPath != null) {\n\t\t\tconst _ref = this._graphNodeIdByPath.get(previousPath);\n\t\t\tif (_ref) {\n\t\t\t\t_ref.value = null;\n\t\t\t}\n\t\t}\n\t\tif (node.disposed()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// set new path\n\t\tconst _ref = this._findOrCreateRef(newPath);\n\t\t_ref.value = id;\n\t\tthis._pathByGraphNodeId.set(id, newPath);\n\t}\n\tpathRef(path: string) {\n\t\treturn this._findOrCreateRef(path);\n\t}\n\tprivate _findOrCreateRef(path: string) {\n\t\tlet _ref = this._graphNodeIdByPath.get(path);\n\t\tif (!_ref) {\n\t\t\t_ref = ref(null);\n\t\t\tthis._graphNodeIdByPath.set(path, _ref);\n\t\t}\n\t\treturn _ref;\n\t}\n}\n","import {PolyDictionary} from '../../../types/GlobalTypes';\nimport {PolyScene} from '../PolyScene';\nimport {RootManagerNode, ROOT_NODE_NAME} from '../../nodes/manager/Root';\nimport {stringMatchMask} from '../../../core/String';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {NodeContext} from '../../poly/NodeContext';\nimport {NodeChildrenMapByContext} from '../../poly/registers/nodes/All';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\nimport {NodeCreateOptions} from '../../nodes/utils/hierarchy/ChildrenController';\n\ntype NodeByNodeId = Map<CoreGraphNodeId, BaseNodeType>;\ntype NodeMapByType<NC extends NodeContext> = Map<keyof NodeChildrenMapByContext[NC], NodeByNodeId>;\nexport class NodesController {\n\tconstructor(private scene: PolyScene) {}\n\n\t_root!: RootManagerNode;\n\t_nodeContextSignatures: PolyDictionary<boolean> = {};\n\t_instanciatedNodesByContextAndType: Map<NodeContext, NodeMapByType<NodeContext>> = new Map();\n\n\tcreateRoot(options?: NodeCreateOptions) {\n\t\tthis._root = new RootManagerNode(this.scene, ROOT_NODE_NAME, options);\n\t\tthis._root.initializeBaseAndNode();\n\t\tthis._root.params.init();\n\t}\n\n\troot() {\n\t\treturn this._root;\n\t}\n\tprivate _traverseNode(parent: BaseNodeType, callback: (node: BaseNodeType) => void) {\n\t\tconst nodes = parent.children();\n\t\tif (!nodes || nodes.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const node of nodes) {\n\t\t\tif (node.childrenController) {\n\t\t\t\tthis._traverseNode(node, callback);\n\t\t\t}\n\n\t\t\tcallback(node);\n\t\t}\n\t}\n\ttraverseNodes(callback: (node: BaseNodeType) => void) {\n\t\tthis._traverseNode(this._root, callback);\n\t}\n\n\t// objectsFromMask(mask: string): Object3D[] {\n\t// \tconst masks = mask.split(' ');\n\t// \tconst child_nodes = this.root.children() as BaseObjNodeType[];\n\t// \tconst objects: Object3D[] = [];\n\t// \tfor (let child_node of child_nodes) {\n\t// \t\tif (CoreString.matchesOneMask(child_node.name, masks)) {\n\t// \t\t\tif (child_node.object) {\n\t// \t\t\t\tobjects.push(child_node.object);\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \treturn objects;\n\t// }\n\tclear() {\n\t\tconst children = this.root().children();\n\t\tfor (const child of children) {\n\t\t\tthis.root().childrenController?.removeNode(child);\n\t\t}\n\t\t// return children.forEach(child=> {\n\t\t// \treturn this.root().removeNode(child);\n\t\t// });\n\t}\n\n\tnode(path: string) {\n\t\tif (path === '/') {\n\t\t\treturn this.root();\n\t\t} else {\n\t\t\treturn this.root().node(path);\n\t\t}\n\t}\n\tallNodes() {\n\t\tlet nodes: BaseNodeType[] = [this.root()];\n\t\tlet current_parents: BaseNodeType[] = [this.root()];\n\t\tlet cmptr = 0;\n\t\twhile (current_parents.length > 0 && cmptr < 10) {\n\t\t\tconst children = current_parents\n\t\t\t\t.map((current_parent) => {\n\t\t\t\t\tif (current_parent.childrenAllowed()) {\n\t\t\t\t\t\treturn current_parent.children();\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.flat();\n\t\t\tnodes = nodes.concat(children);\n\t\t\tcurrent_parents = children;\n\t\t\tcmptr += 1;\n\t\t}\n\t\treturn nodes.flat();\n\t}\n\tnodesFromMask(mask: string) {\n\t\tconst nodes = this.allNodes();\n\t\tconst matching_nodes: BaseNodeType[] = [];\n\t\tfor (const node of nodes) {\n\t\t\tconst path = node.path();\n\t\t\tif (stringMatchMask(path, mask)) {\n\t\t\t\tmatching_nodes.push(node);\n\t\t\t}\n\t\t}\n\t\treturn matching_nodes;\n\t}\n\n\tresetNodeContextSignatures() {\n\t\tthis._nodeContextSignatures = {};\n\t}\n\tregisterNodeContextSignature(node: BaseNodeType) {\n\t\tif (node.childrenAllowed() && node.childrenController) {\n\t\t\tthis._nodeContextSignatures[node.childrenController.nodeContextSignature()] = true;\n\t\t}\n\t}\n\tnodeContextSignatures() {\n\t\treturn Object.keys(this._nodeContextSignatures)\n\t\t\t.sort()\n\t\t\t.map((s) => s.toLowerCase());\n\t}\n\n\taddToInstanciatedNode<NC extends NodeContext>(node: BaseNodeType) {\n\t\tconst context = node.context() as NC;\n\t\tconst nodeType = node.type() as keyof NodeChildrenMapByContext[NC];\n\n\t\tlet mapForContext: NodeMapByType<NC> | undefined = this._instanciatedNodesByContextAndType.get(context);\n\t\tif (!mapForContext) {\n\t\t\tmapForContext = new Map() as NodeMapByType<NC>;\n\t\t\tthis._instanciatedNodesByContextAndType.set(context, mapForContext as any);\n\t\t}\n\t\tlet mapForType = mapForContext.get(nodeType);\n\t\tif (!mapForType) {\n\t\t\tmapForType = new Map() as NodeByNodeId;\n\t\t\tmapForContext.set(nodeType, mapForType);\n\t\t}\n\t\tmapForType.set(node.graphNodeId(), node);\n\n\t\t// this._instanciated_nodes_by_context_and_type[context] =\n\t\t// \tthis._instanciated_nodes_by_context_and_type[context] || {};\n\t\t// this._instanciated_nodes_by_context_and_type[context][node_type] =\n\t\t// \tthis._instanciated_nodes_by_context_and_type[context][node_type] || {};\n\t\t// this._instanciated_nodes_by_context_and_type[context][node_type][node.graphNodeId()] = node;\n\t}\n\n\tremoveFromInstanciatedNode<NC extends NodeContext>(node: BaseNodeType) {\n\t\tconst context = node.context() as NC;\n\t\tconst nodeType = node.type() as keyof NodeChildrenMapByContext[NC];\n\t\tconst mapForContext: NodeMapByType<NC> | undefined = this._instanciatedNodesByContextAndType.get(context);\n\t\tif (!mapForContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst mapForType = mapForContext.get(nodeType);\n\t\tif (!mapForType) {\n\t\t\treturn;\n\t\t}\n\t\tmapForType.delete(node.graphNodeId());\n\t\t// delete this._instanciated_nodes_by_context_and_type[context][node_type][node.graphNodeId()];\n\t}\n\tnodesByType(type: string): BaseNodeType[] {\n\t\tconst list: BaseNodeType[] = [];\n\n\t\tthis._traverseNode(this.scene.root(), (node) => {\n\t\t\tif (node.type() == type) {\n\t\t\t\tlist.push(node);\n\t\t\t}\n\t\t});\n\n\t\treturn list;\n\t}\n\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.ANIM]>(\n\t\tcontext: NodeContext.ANIM,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.ANIM][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.AUDIO]>(\n\t\tcontext: NodeContext.AUDIO,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.AUDIO][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.COP]>(\n\t\tcontext: NodeContext.COP,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.COP][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.EVENT]>(\n\t\tcontext: NodeContext.EVENT,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.EVENT][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.GL]>(\n\t\tcontext: NodeContext.GL,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.GL][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.JS]>(\n\t\tcontext: NodeContext.JS,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.JS][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.MAT]>(\n\t\tcontext: NodeContext.MAT,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.MAT][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.OBJ]>(\n\t\tcontext: NodeContext.OBJ,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.OBJ][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.POST]>(\n\t\tcontext: NodeContext.POST,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.POST][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.ROP]>(\n\t\tcontext: NodeContext.ROP,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.ROP][T][];\n\tnodesByContextAndType<T extends keyof NodeChildrenMapByContext[NodeContext.SOP]>(\n\t\tcontext: NodeContext.SOP,\n\t\tnode_type: T\n\t): NodeChildrenMapByContext[NodeContext.SOP][T][];\n\tnodesByContextAndType<NC extends NodeContext>(context: NC, nodeType: string) {\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tconst mapForContext: NodeMapByType<NC> | undefined = this._instanciatedNodesByContextAndType.get(context);\n\t\tif (mapForContext) {\n\t\t\tconst mapForType = mapForContext.get(nodeType as any);\n\t\t\tif (mapForType) {\n\t\t\t\tmapForType.forEach((node) => {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn nodes;\n\t}\n\n\thasNodesByContextAndType<NC extends NodeContext>(context: NC, nodeType: string) {\n\t\tconst mapForContext: NodeMapByType<NC> | undefined = this._instanciatedNodesByContextAndType.get(context);\n\t\tif (!mapForContext) {\n\t\t\treturn false;\n\t\t}\n\t\tconst mapForType = mapForContext.get(nodeType as any);\n\t\tif (!mapForType) {\n\t\t\treturn false;\n\t\t}\n\t\treturn mapForType.size != 0;\n\t}\n}\n","import {BaseInputEventNodeType} from '../../../nodes/event/_BaseInput';\nimport {SceneEventsDispatcher} from './EventsDispatcher';\nimport {EventData, EventType} from '../../../../core/event/EventData';\nimport {PointerEventType} from '../../../../core/event/PointerEventType';\nimport {CoreEventEmitter} from '../../../../core/event/CoreEventEmitter';\nimport {addToSetAtEntry} from '../../../../core/MapUtils';\nimport {ActorEvaluatorGenerator} from '../../../nodes/js/code/assemblers/actor/ActorEvaluatorGenerator';\nimport type {EventContext} from '../../../../core/event/EventContextType';\n\nexport abstract class BaseSceneEventsController<\n\tE extends Event,\n\tT extends BaseInputEventNodeType\n\t// JsNodeType extends BaseUserInputJsNodeType\n> {\n\tprivate _activeEventDatas: EventData[] = [];\n\tprivate _activeEventDataTypes: Set<string> = new Set();\n\tprotected _eventNodes: Set<T> = new Set();\n\tprotected _requireCanvasEventListeners: boolean = false;\n\tprotected _actorEvaluators: Set<ActorEvaluatorGenerator> = new Set();\n\t// protected _actorEventNames: Set<string> = new Set();\n\tprotected _actorEvaluatorsByEventNames: Map<string, Map<CoreEventEmitter, Set<ActorEvaluatorGenerator>>> =\n\t\tnew Map();\n\tconstructor(protected dispatcher: SceneEventsDispatcher) {}\n\n\tregisterEventNode(node: T) {\n\t\tthis._eventNodes.add(node);\n\t\tthis.updateViewerEventListeners();\n\t}\n\tunregisterEventNode(node: T) {\n\t\tthis._eventNodes.delete(node);\n\t\tthis.updateViewerEventListeners();\n\t}\n\tregisterEvaluatorGenerator(evaluator: ActorEvaluatorGenerator) {\n\t\tthis._actorEvaluators.add(evaluator);\n\t\tthis._updateActorEvaluatorCache();\n\t\tthis.updateViewerEventListeners();\n\t}\n\tunregisterEvaluatorGenerator(evaluator: ActorEvaluatorGenerator) {\n\t\tthis._actorEvaluators.delete(evaluator);\n\t\tthis._updateActorEvaluatorCache();\n\t\tthis.updateViewerEventListeners();\n\t}\n\n\tprivate _updateActorEvaluatorCache() {\n\t\t// this._actorEventNames.clear();\n\t\tthis._actorEvaluatorsByEventNames.clear();\n\t\tthis._actorEvaluators.forEach((evaluator) => {\n\t\t\tconst eventDatas = evaluator.eventDatas;\n\t\t\tif (eventDatas) {\n\t\t\t\teventDatas.forEach((eventData) => {\n\t\t\t\t\tconst eventName = eventData.type;\n\t\t\t\t\tconst emitter = eventData.emitter;\n\t\t\t\t\tlet mapForEventName = this._actorEvaluatorsByEventNames.get(eventName);\n\t\t\t\t\tif (!mapForEventName) {\n\t\t\t\t\t\tmapForEventName = new Map();\n\t\t\t\t\t\tthis._actorEvaluatorsByEventNames.set(eventName, mapForEventName);\n\t\t\t\t\t}\n\t\t\t\t\taddToSetAtEntry(mapForEventName, emitter, evaluator);\n\t\t\t\t});\n\t\t\t}\n\t\t\t// const nodeEventNames = node.userInputEventNames();\n\t\t\t// const emitter = node.eventEmitter();\n\t\t\t// for (let eventName of nodeEventNames) {\n\t\t\t// \t// this._actorEventNames.add(eventName);\n\n\t\t\t// \tlet mapForEventName = this._actorNodesByEventNames.get(eventName);\n\t\t\t// \tif (!mapForEventName) {\n\t\t\t// \t\tmapForEventName = new Map();\n\t\t\t// \t\tthis._actorNodesByEventNames.set(eventName, mapForEventName);\n\t\t\t// \t}\n\t\t\t// \tMapUtils.addToSetAtEntry(mapForEventName, emitter, node);\n\t\t\t// }\n\t\t});\n\t}\n\n\tabstract type(): string;\n\tabstract acceptedEventTypes(): Set<string>;\n\t// abstract accepts_event(event: Event): boolean;\n\n\tprocessEvent(eventContext: EventContext<E>) {\n\t\tif (this._activeEventDatas.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst eventType = eventContext.event?.type;\n\t\tif (eventType) {\n\t\t\t// The check here if the eventType is active\n\t\t\t// is not necessary for canvas events (pointer, mouse, keyboard)\n\t\t\t// but currently necessary for scene events (such as tick)\n\t\t\tif (!this._activeEventDataTypes.has(eventType)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis._eventNodes.forEach((node) => {\n\t\t\tnode.processEvent(eventContext);\n\t\t});\n\t}\n\n\tupdateViewerEventListeners() {\n\t\tthis._updateActiveEventTypes();\n\n\t\tif (this._requireCanvasEventListeners) {\n\t\t\tthis.dispatcher.scene.viewersRegister.traverseViewers((viewer) => {\n\t\t\t\tviewer.eventsController().updateEvents(this);\n\t\t\t});\n\t\t}\n\t}\n\n\tactiveEventDatas() {\n\t\treturn this._activeEventDatas;\n\t}\n\n\tprivate _updateActiveEventTypes() {\n\t\tconst _storeEventData = (eventData: EventData) => {\n\t\t\tthis._activeEventDatas.push(eventData);\n\t\t\tthis._activeEventDataTypes.add(eventData.type);\n\t\t};\n\n\t\tconst _reset = () => {\n\t\t\tthis._activeEventDatas.splice(0, this._activeEventDatas.length);\n\t\t\tthis._activeEventDataTypes.clear();\n\t\t};\n\n\t\tconst _actorEventDatas = () => {\n\t\t\tlet eventTypeByEmitter: Map<CoreEventEmitter, Set<EventType>> = new Map();\n\n\t\t\tthis._actorEvaluatorsByEventNames.forEach((mapForEventName, eventName) => {\n\t\t\t\tmapForEventName.forEach((nodes, emitter) => {\n\t\t\t\t\tnodes.forEach((node) => {\n\t\t\t\t\t\taddToSetAtEntry(eventTypeByEmitter, emitter, eventName);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t\tconst eventDatas: EventData[] = [];\n\t\t\teventTypeByEmitter.forEach((eventNames, emitter) => {\n\t\t\t\tfor (const eventName of eventNames) {\n\t\t\t\t\tconst eventData: EventData = {\n\t\t\t\t\t\ttype: eventName,\n\t\t\t\t\t\temitter,\n\t\t\t\t\t};\n\t\t\t\t\teventDatas.push(eventData);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn eventDatas;\n\t\t};\n\n\t\tconst _updateActorNodesEventData = () => {\n\t\t\tconst actorEventDatas = _actorEventDatas();\n\t\t\tif (actorEventDatas) {\n\t\t\t\tfor (const data of actorEventDatas) {\n\t\t\t\t\t_storeEventData(data);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst _updateEventNodesEventData = () => {\n\t\t\tconst activeNodeEventTypesState: Set<EventData> = new Set();\n\t\t\tthis._eventNodes.forEach((node) => {\n\t\t\t\tif (node.parent()) {\n\t\t\t\t\tconst nodeActiveEventDatas = node.activeEventDatas();\n\t\t\t\t\tfor (const data of nodeActiveEventDatas) {\n\t\t\t\t\t\tactiveNodeEventTypesState.add(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tactiveNodeEventTypesState.forEach((state, data) => {\n\t\t\t\t_storeEventData(data);\n\t\t\t});\n\t\t};\n\n\t\t_reset();\n\n\t\t// we always need the pointermove and touchmove\n\t\t// in order to always update the cursor\n\t\t_storeEventData({\n\t\t\ttype: PointerEventType.pointermove,\n\t\t\temitter: CoreEventEmitter.DOCUMENT,\n\t\t});\n\t\t_storeEventData({\n\t\t\ttype: PointerEventType.touchmove,\n\t\t\temitter: CoreEventEmitter.DOCUMENT,\n\t\t});\n\n\t\t_updateActorNodesEventData();\n\t\t_updateEventNodesEventData();\n\t}\n}\n\nexport type BaseSceneEventsControllerType = BaseSceneEventsController<\n\tEvent,\n\tBaseInputEventNodeType\n\t// BaseUserInputJsNodeType\n>;\nexport class BaseSceneEventsControllerClass extends BaseSceneEventsController<\n\tEvent,\n\tBaseInputEventNodeType\n\t// BaseUserInputJsNodeType\n> {\n\ttype() {\n\t\treturn '';\n\t}\n\tacceptedEventTypes(): Set<string> {\n\t\treturn new Set<string>();\n\t}\n}\n","import {BaseSceneEventsController} from './_BaseEventsController';\nimport {PointerEventNode} from '../../../nodes/event/Pointer';\nimport {ACCEPTED_DRAG_EVENT_TYPES} from '../../../../core/event/DragEventType';\n// import {BaseUserInputActorNodeType} from '../../../nodes/actor/_BaseUserInput';\n\nexport class DragEventsController extends BaseSceneEventsController<MouseEvent, PointerEventNode> {\n\tprotected override _requireCanvasEventListeners: boolean = true;\n\ttype() {\n\t\treturn 'drag';\n\t}\n\tacceptedEventTypes() {\n\t\treturn new Set([...ACCEPTED_DRAG_EVENT_TYPES]);\n\t}\n}\n","import {BaseSceneEventsController} from './_BaseEventsController';\nimport {KeyboardEventNode} from '../../../nodes/event/Keyboard';\nimport {ACCEPTED_KEYBOARD_EVENT_TYPES, KeyboardEventType} from '../../../../core/event/KeyboardEventType';\nimport {SceneEventsDispatcher} from './EventsDispatcher';\nimport {TimeController} from '../TimeController';\nimport {ActorKeyboardEventsController} from '../actors/ActorsKeyboardEventsController';\nimport {EvaluatorKeyboardMethod} from '../../../nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {JsType} from '../../../poly/registers/nodes/types/Js';\nimport type {EventContext} from '../../../../core/event/EventContextType';\n\nconst methodNameByEventType: Record<KeyboardEventType, EvaluatorKeyboardMethod[]> = {\n\t[KeyboardEventType.keydown]: [JsType.ON_KEY, JsType.ON_KEYDOWN],\n\t[KeyboardEventType.keypress]: [JsType.ON_KEYPRESS],\n\t[KeyboardEventType.keyup]: [JsType.ON_KEY, JsType.ON_KEYUP],\n};\n\nexport class KeyboardEventsController extends BaseSceneEventsController<\n\tKeyboardEvent,\n\tKeyboardEventNode\n\t// KeyboardEventActorNode\n> {\n\tprivate timeController: TimeController;\n\tprivate keyboardEventsController: ActorKeyboardEventsController;\n\tconstructor(dispatcher: SceneEventsDispatcher) {\n\t\tsuper(dispatcher);\n\t\tthis.timeController = this.dispatcher.scene.timeController;\n\t\tthis.keyboardEventsController = this.dispatcher.scene.actorsManager.keyboardEventsController;\n\t}\n\n\tprotected override _requireCanvasEventListeners: boolean = true;\n\ttype() {\n\t\treturn 'keyboard';\n\t}\n\tacceptedEventTypes() {\n\t\treturn new Set(ACCEPTED_KEYBOARD_EVENT_TYPES.map((n) => `${n}`));\n\t}\n\n\tprivate _currentEvents: KeyboardEvent[] = [];\n\tprivate _lastProcessedFrame = -1;\n\tcurrentEvents() {\n\t\treturn this._currentEvents;\n\t}\n\toverride processEvent(eventContext: EventContext<KeyboardEvent>) {\n\t\tsuper.processEvent(eventContext);\n\n\t\t// const eventEmitter = eventContext.emitter;\n\t\t// if (!eventEmitter) {\n\t\t// \treturn;\n\t\t// }\n\n\t\tconst {event} = eventContext;\n\t\tif (!event) {\n\t\t\treturn;\n\t\t}\n\t\tconst eventType = event.type as KeyboardEventType;\n\n\t\tconst mapForEvent = this._actorEvaluatorsByEventNames.get(eventType);\n\t\tif (!mapForEvent) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.timeController.playing()) {\n\t\t\tconst frame = this.timeController.frame();\n\t\t\tif (frame != this._lastProcessedFrame) {\n\t\t\t\tthis._lastProcessedFrame = frame;\n\t\t\t\tthis._currentEvents.length = 0;\n\t\t\t}\n\t\t\tthis._currentEvents.push(event);\n\t\t\t// this.keyboardEventsController.setTriggeredNodes(nodesToTrigger);\n\t\t} else {\n\t\t\tthis._currentEvents[0] = event;\n\t\t}\n\n\t\tconst eventEmitter = eventContext.emitter;\n\t\tif (!eventEmitter) {\n\t\t\treturn;\n\t\t}\n\t\tconst evaluatorGenerators = mapForEvent.get(eventEmitter);\n\t\tif (!evaluatorGenerators) {\n\t\t\treturn;\n\t\t}\n\t\tconst methodNames = methodNameByEventType[eventType];\n\t\tif (!methodNames) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const methodName of methodNames) {\n\t\t\tthis.keyboardEventsController.addTriggeredEvaluators(evaluatorGenerators, methodName);\n\t\t}\n\t\t// evaluatorGenerators.forEach((evaluatorGenerator) => {\n\t\t// \tthis.keyboardEventsController.setTriggeredNodes(nodesToTrigger);\n\t\t// \t// evaluatorGenerator.traverseEvaluator((evaluator) => {\n\t\t// \t// \tif (evaluator[methodName]) {\n\t\t// \t// \t\tevaluator[methodName]!();\n\t\t// \t// \t}\n\t\t// \t// });\n\t\t// });\n\n\t\t// const eventType = event.type;\n\t\t// // const mapForEvent = this._actorNodesByEventNames.get(eventType);\n\t\t// // if (!mapForEvent) {\n\t\t// // \treturn;\n\t\t// // }\n\t\t// // const nodesToTrigger = mapForEvent.get(eventEmitter);\n\t\t// // if (!nodesToTrigger) {\n\t\t// // \treturn;\n\t\t// // }\n\t}\n}\n","import {BaseSceneEventsController} from './_BaseEventsController';\nimport {MouseEventNode} from '../../../nodes/event/Mouse';\nimport {ACCEPTED_MOUSE_EVENT_TYPES} from '../../../../core/event/MouseEventType';\n// import {BaseUserInputActorNodeType} from '../../../nodes/actor/_BaseUserInput';\n\nexport class MouseEventsController extends BaseSceneEventsController<\n\tMouseEvent,\n\tMouseEventNode\n\t// BaseUserInputActorNodeType\n> {\n\tprotected override _requireCanvasEventListeners: boolean = true;\n\ttype() {\n\t\treturn 'mouse';\n\t}\n\tacceptedEventTypes() {\n\t\treturn new Set([...ACCEPTED_MOUSE_EVENT_TYPES]);\n\t}\n\t// accepts_event(event: MouseEvent) {\n\t// \treturn ACCEPTED_MOUSE_EVENT_TYPES.includes(event.type as MouseEventType);\n\t// }\n}\n","import {BaseSceneEventsController} from './_BaseEventsController';\nimport {PointerEventNode} from '../../../nodes/event/Pointer';\nimport {Raycaster, Vector2} from 'three';\nimport {MouseEventType} from '../../../../core/event/MouseEventType';\nimport {ACCEPTED_POINTER_EVENT_TYPES, PointerEventType} from '../../../../core/event/PointerEventType';\nimport {TouchEventType} from '../../../../core/event/TouchEventType';\nimport {ref} from '../../../../core/reactivity/CoreReactivity';\nimport {createRaycaster} from '../../../../core/RaycastHelper';\nimport {SceneEventsDispatcher} from './EventsDispatcher';\nimport {CursorHelper} from '../../../../core/event/CursorHelper';\nimport type {EventContext} from '../../../../core/event/EventContextType';\nexport interface RaycasterUpdateOptions {\n\tpointsThreshold: number;\n\tlineThreshold: number;\n}\n\n// const methodNameByEventType: Record<PointerEventType, EvaluatorPointerMethod> = {\n// \t// [PointerEventType.click]: 'onClick',\n// \t[PointerEventType.contextmenu]: 'onContextMenu',\n// \t[PointerEventType.pointerdown]: JsType.ON_POINTERDOWN,\n// \t[PointerEventType.pointermove]: 'onPointermove',\n// \t[PointerEventType.pointerup]: JsType.ON_POINTERUP,\n// \t[PointerEventType.touchstart]: JsType.ON_POINTERDOWN,\n// \t[PointerEventType.touchmove]: 'onPointermove',\n// \t[PointerEventType.touchend]: JsType.ON_POINTERUP,\n// };\n\nexport class PointerEventsController extends BaseSceneEventsController<MouseEvent | TouchEvent, PointerEventNode> {\n\tconstructor(dispatcher: SceneEventsDispatcher) {\n\t\tsuper(dispatcher);\n\t}\n\tprotected override _requireCanvasEventListeners: boolean = true;\n\tprivate _cursorHelper: CursorHelper = new CursorHelper();\n\t// init to a large value so we don't get a fake intersect\n\t// if there was no interaction\n\tprotected _cursor0 = ref<Vector2>(new Vector2(-1000, -1000));\n\t// protected _camera: Camera | undefined;\n\tprivate _raycaster0 = ref<Raycaster>(createRaycaster());\n\ttype() {\n\t\treturn 'pointer';\n\t}\n\tacceptedEventTypes() {\n\t\treturn new Set([...ACCEPTED_POINTER_EVENT_TYPES]);\n\t}\n\n\tsetRaycaster(raycaster: Raycaster) {\n\t\t// giving a raycaster here is useful to still benefit from mouse events, even if no viewer has been created\n\t\tthis._raycaster0.value = raycaster;\n\t}\n\n\toverride processEvent(eventContext: EventContext<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tthis._cursorHelper.setCursorForCPU(eventContext, this._cursor0.value);\n\t\tsuper.processEvent(eventContext);\n\n\t\tconst {viewer, event} = eventContext;\n\t\tif (!(event && viewer)) {\n\t\t\tconsole.log('either event or viewer missing');\n\t\t\treturn;\n\t\t}\n\n\t\t// const camera = viewer.camera();\n\t\t// this._cursorHelper.setCursorForCPU(eventContext, this._cursor);\n\t\t// if (camera) {\n\t\tviewer.raycastersController.setCursor0(this._cursor0.value);\n\t\t// even though the update is in the render loop\n\t\t// it may be more up to date to do it here as well\n\t\tviewer.raycastersController.updateRaycasters();\n\t\t// this._raycaster = viewer.raycastersController.raycaster0();\n\t\t// }\n\n\t\tconst eventType = event.type as PointerEventType | TouchEventType | MouseEventType;\n\t\tif (eventType == PointerEventType.pointermove || eventType == TouchEventType.touchmove) {\n\t\t\t// pointermove is not processed here,\n\t\t\t// since callbacks such as onObjectHover\n\t\t\t// should be triggered even if the pointer is not moving\n\t\t\t// (for instance if instead  the object is moving).\n\t\t\t// It is therefore triggered via the ActorsManager\n\t\t\treturn;\n\t\t}\n\n\t\tconst mapForEvent = this._actorEvaluatorsByEventNames.get(eventType);\n\t\tif (!mapForEvent) {\n\t\t\t// console.log('no map for eventType', eventType);\n\t\t\treturn;\n\t\t}\n\t\tconst eventEmitter = eventContext.emitter;\n\t\tif (!eventEmitter) {\n\t\t\t// console.log('no emitter for context', eventContext);\n\t\t\treturn;\n\t\t}\n\t\tconst evaluatorGenerators = mapForEvent.get(eventEmitter);\n\t\tif (!evaluatorGenerators) {\n\t\t\t// console.log('no generators for emitter', eventEmitter);\n\t\t\treturn;\n\t\t}\n\t\t// const methodName = methodNameByEventType[eventType];\n\n\t\tif (eventContext.event) {\n\t\t\tconst actorsManager = this.dispatcher.scene.actorsManager;\n\t\t\tswitch (eventType) {\n\t\t\t\tcase MouseEventType.mousedown: {\n\t\t\t\t\tactorsManager.rayObjectIntersectionMouseClick.onMousedown(eventContext.event);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase MouseEventType.dblclick: {\n\t\t\t\t\tactorsManager.rayObjectIntersectionDoubleClick.onDoubleClick(eventContext.event);\n\t\t\t\t}\n\t\t\t\tcase PointerEventType.pointerdown: {\n\t\t\t\t\tactorsManager.rayObjectIntersectionClick.onPointerdown(eventContext.event);\n\t\t\t\t\tactorsManager.rayObjectIntersectionLongPress.onPointerdown(eventContext.event);\n\t\t\t\t\tactorsManager.rayObjectIntersectionPointerdown.onPointerdown(eventContext.event);\n\t\t\t\t\tactorsManager.pointerdown.onPointerdown(eventContext.event);\n\t\t\t\t\tactorsManager.rayObjectIntersectionSwipe.onPointerdown(eventContext.event);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase PointerEventType.pointerup: {\n\t\t\t\t\t// We must not test for isTouchDevice() here\n\t\t\t\t\t// as we may receive pointerup from a mobile,\n\t\t\t\t\t// without touchend\n\t\t\t\t\t// if (!isTouchDevice()) {\n\t\t\t\t\tactorsManager.rayObjectIntersectionPointerup.onPointerup(eventContext.event);\n\t\t\t\t\tactorsManager.pointerup.onPointerup(eventContext.event);\n\t\t\t\t\treturn;\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t\tcase PointerEventType.contextmenu: {\n\t\t\t\t\tactorsManager.rayObjectIntersectionContextmenu.onContextmenu(eventContext.event);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase TouchEventType.touchend: {\n\t\t\t\t\t// we also need to trigger onPointerup after touchend,\n\t\t\t\t\t// as pointerup appears to not be triggered once the cursor has moved\n\t\t\t\t\t// We must not test for isTouchDevice() here (see pointerup above)\n\t\t\t\t\t// if (isTouchDevice()) {\n\t\t\t\t\tactorsManager.rayObjectIntersectionPointerup.onPointerup(eventContext.event);\n\t\t\t\t\tactorsManager.pointerup.onPointerup(eventContext.event);\n\t\t\t\t\treturn;\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// for (let methodName of methodNames) {\n\t\t// this.pointerEventsController.addTriggeredEvaluators(evaluatorGenerators, methodName);\n\t\t// }\n\t\t// console.log('evaluatorGenerators', evaluatorGenerators);\n\t\t//\n\t\t// evaluatorGenerators.forEach((evaluatorGenerator) => {\n\t\t// \tevaluatorGenerator.traverseEvaluator((evaluator) => {\n\t\t// \t\tconsole.log({evaluator}, evaluator.onObjectClick);\n\t\t// \t\tif (evaluator[methodName]) {\n\t\t// \t\t\tevaluator[methodName]!();\n\t\t// \t\t} else {\n\t\t// \t\t\tconsole.log('method not found on object for event type', eventType);\n\t\t// \t\t}\n\t\t// \t});\n\t\t// });\n\t\t// this.dispatcher.scene.actorsManager.pointerEventsController.setTriggeredNodes(nodesToTrigger);\n\t}\n\n\traycaster() {\n\t\treturn this._raycaster0;\n\t}\n\tcursor() {\n\t\treturn this._cursor0;\n\t}\n\t// camera() {\n\t// \treturn this._camera;\n\t// }\n\n\tupdateRaycast(options: RaycasterUpdateOptions) {\n\t\t// if (!this._raycaster0) {\n\t\t// \treturn;\n\t\t// }\n\t\tconst pointsParam = this._raycaster0.value.params.Points;\n\t\tif (pointsParam) {\n\t\t\tpointsParam.threshold = options.pointsThreshold;\n\t\t}\n\t\tconst lineParam = this._raycaster0.value.params.Line;\n\t\tif (lineParam) {\n\t\t\tlineParam.threshold = options.lineThreshold;\n\t\t}\n\t}\n}\n","import {BaseSceneEventsController} from './_BaseEventsController';\nimport {PointerEventNode} from '../../../nodes/event/Pointer';\n// import {BaseUserInputActorNodeType} from '../../../nodes/actor/_BaseUserInput';\n\n// https://developer.mozilla.org/en-US/docs/Web/Events\nenum WindowEventType {\n\tresize = 'resize',\n}\nexport const ACCEPTED_WINDOW_EVENT_TYPES: WindowEventType[] = [WindowEventType.resize];\n\nexport class WindowEventsController extends BaseSceneEventsController<\n\tEvent,\n\tPointerEventNode\n\t// BaseUserInputActorNodeType\n> {\n\tprotected override _requireCanvasEventListeners: boolean = true;\n\ttype() {\n\t\treturn 'window';\n\t}\n\tacceptedEventTypes() {\n\t\treturn new Set(ACCEPTED_WINDOW_EVENT_TYPES.map((n) => `${n}`));\n\t}\n}\n","import {BaseSceneEventsController} from './_BaseEventsController';\nimport {PointerEventNode} from '../../../nodes/event/Pointer';\nimport {ACCEPTED_TOUCH_EVENT_TYPES} from '../../../../core/event/TouchEventType';\n// import {BaseUserInputActorNodeType} from '../../../nodes/actor/_BaseUserInput';\n\nexport class TouchEventsController extends BaseSceneEventsController<\n\tMouseEvent,\n\tPointerEventNode\n\t// BaseUserInputActorNodeType\n> {\n\tprotected override _requireCanvasEventListeners: boolean = true;\n\ttype() {\n\t\treturn 'touch';\n\t}\n\tacceptedEventTypes() {\n\t\treturn new Set([...ACCEPTED_TOUCH_EVENT_TYPES]);\n\t}\n}\n","import {NODE_CONNECTION_TRIGGERED_EVENT, TypedNodeConnection} from '../../../nodes/utils/io/NodeConnection';\nimport {NodeContext} from '../../../poly/NodeContext';\n\nexport class SceneConnectionTriggerDispatcher {\n\t// private _dispatchedConnections: Set<TypedNodeConnection<any>> = new Set();\n\tconstructor() {}\n\n\tdispatchTrigger<NC extends NodeContext>(connection: TypedNodeConnection<NC>) {\n\t\tconnection._eventDispatcher()?.dispatchEvent(NODE_CONNECTION_TRIGGERED_EVENT);\n\t\t// this._dispatchedConnections.add(connection);\n\t}\n}\n","import {Constructor} from '../../../../types/GlobalTypes';\nimport {PolyScene} from '../../PolyScene';\nimport {BaseEventNodeType} from '../../../nodes/event/_Base';\nimport {BaseInputEventNodeType} from '../../../nodes/event/_BaseInput';\nimport {BaseSceneEventsController, BaseSceneEventsControllerClass} from './_BaseEventsController';\nimport {SceneEventsController} from './SceneEventsController';\nimport {DragEventsController} from './DragEventsController';\nimport {KeyboardEventsController} from './KeyboardEventsController';\nimport {MouseEventsController} from './MouseEventsController';\nimport {PointerEventsController} from './PointerEventsController';\nimport {WindowEventsController} from './WindowEventsController';\nimport {TouchEventsController} from './TouchEventsController';\n\nimport {SceneConnectionTriggerDispatcher} from './ConnectionTriggerDispatcher';\nimport {EventInputType} from '../../../poly/registers/nodes/types/Event';\n// import {BaseUserInputJsNodeType} from '../../../nodes/js/_BaseUserInput';\n// import {JsType} from '../../../poly/registers/nodes/types/Js';\nimport {Raycaster} from 'three';\nimport {ActorEvaluatorGenerator} from '../../../nodes/js/code/assemblers/actor/ActorEvaluatorGenerator';\nimport {JsType} from '../../../poly/registers/nodes/types/Js';\n\nexport class SceneEventsDispatcher {\n\tprivate _controllers: BaseSceneEventsController<Event, BaseInputEventNodeType>[] = [];\n\tpublic readonly sceneEventsController = new SceneEventsController();\n\tprivate _keyboardEventsController?: KeyboardEventsController;\n\tprivate _mouseEventsController?: MouseEventsController;\n\tprivate _dragEventsController?: DragEventsController;\n\tprivate _windowEventsController?: WindowEventsController;\n\tprivate _touchEventsController?: TouchEventsController;\n\tpublic readonly pointerEventsController: PointerEventsController = this._createController(PointerEventsController);\n\tconstructor(public scene: PolyScene) {}\n\n\tregisterEvaluatorGenerator(evaluatorGenerator: ActorEvaluatorGenerator) {\n\t\tconst controllers = this._findOrCreateControllerForEvaluator(evaluatorGenerator);\n\t\tif (controllers) {\n\t\t\tcontrollers.forEach((c) => c.registerEvaluatorGenerator(evaluatorGenerator));\n\t\t}\n\t}\n\tunregisterEvaluatorGenerator(evaluatorGenerator: ActorEvaluatorGenerator) {\n\t\tconst controllers = this._findOrCreateControllerForEvaluator(evaluatorGenerator);\n\t\tif (controllers) {\n\t\t\tcontrollers.forEach((c) => c.unregisterEvaluatorGenerator(evaluatorGenerator));\n\t\t}\n\t}\n\t// updateControllersFromJsNodes() {\n\t// \tconst eventDatas = this.scene.actorsManager.eventDatas();\n\t// \teventDatas.forEach((type) => {\n\t// \t\tthis._findOrCreateControllerForEventInputType(type);\n\t// \t});\n\t// }\n\n\tregisterEventNode(node: BaseInputEventNodeType) {\n\t\tconst controller = this._findOrCreateControllerForEventNode(node);\n\t\tif (controller) {\n\t\t\tcontroller.registerEventNode(node);\n\t\t}\n\t}\n\tunregisterEventNode(node: BaseInputEventNodeType) {\n\t\tconst controller = this._findOrCreateControllerForEventNode(node);\n\t\tif (controller) {\n\t\t\tcontroller.unregisterEventNode(node);\n\t\t}\n\t}\n\tupdateViewerEventListeners(node: BaseInputEventNodeType) {\n\t\tconst controller = this._findOrCreateControllerForEventNode(node);\n\t\tif (controller) {\n\t\t\tcontroller.updateViewerEventListeners();\n\t\t}\n\t}\n\ttraverseControllers(callback: (controller: BaseSceneEventsController<Event, BaseInputEventNodeType>) => void) {\n\t\tfor (const controller of this._controllers) {\n\t\t\tcallback(controller);\n\t\t}\n\t}\n\n\tsetRaycaster(raycaster: Raycaster) {\n\t\t// giving a raycaster here is useful to still benefit from mouse events, even if not viewer has been created\n\t\tthis.pointerEventsController.setRaycaster(raycaster);\n\t}\n\n\t// processEvent(event_content: EventContext<Event>) {\n\t// \tif (!event_content.event) {\n\t// \t\treturn;\n\t// \t}\n\t// \tfor (let controller of this._controllers) {\n\t// \t\tif (controller.accepts_event(event_content.event)) {\n\t// \t\t\tcontroller.processEvent(event_content);\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t}\n\t// }\n\n\tprivate _findOrCreateControllerForEventNode<T extends BaseEventNodeType>(\n\t\tnode: T\n\t): BaseSceneEventsController<Event, BaseInputEventNodeType> | undefined {\n\t\treturn this._findOrCreateControllerForEventInputType(node.type() as EventInputType);\n\t}\n\n\tprivate _findOrCreateControllerForEvaluator(\n\t\tevaluator: ActorEvaluatorGenerator\n\t): Set<BaseSceneEventsController<Event, BaseInputEventNodeType>> | undefined {\n\t\tconst eventDatas = evaluator.eventDatas;\n\t\tif (!eventDatas) {\n\t\t\treturn;\n\t\t}\n\t\tconst controllers: Set<BaseSceneEventsController<Event, BaseInputEventNodeType>> = new Set();\n\t\teventDatas.forEach((eventData) => {\n\t\t\tconst controller = this._findOrCreateControllerForJsType(eventData.jsType);\n\t\t\tif (controller) {\n\t\t\t\tcontrollers.add(controller);\n\t\t\t}\n\t\t});\n\n\t\treturn controllers;\n\t}\n\tprivate _findOrCreateControllerForEventInputType(\n\t\ttype: EventInputType\n\t): BaseSceneEventsController<Event, BaseInputEventNodeType> | undefined {\n\t\tswitch (type) {\n\t\t\tcase EventInputType.KEYBOARD:\n\t\t\t\treturn this.keyboardEventsController;\n\t\t\tcase EventInputType.MOUSE:\n\t\t\t\treturn this.mouseEventsController;\n\t\t\tcase EventInputType.DRAG:\n\t\t\t\treturn this.dragEventsController;\n\t\t\tcase EventInputType.POINTER:\n\t\t\t\treturn this.pointerEventsController;\n\t\t\tcase EventInputType.TOUCH:\n\t\t\t\treturn this.touchEventsController;\n\t\t\tcase EventInputType.WINDOW:\n\t\t\t\treturn this.windowEventsController;\n\t\t}\n\t}\n\tprivate _findOrCreateControllerForJsType(\n\t\tjsType: JsType\n\t): BaseSceneEventsController<Event, BaseInputEventNodeType> | undefined {\n\t\tswitch (jsType) {\n\t\t\tcase JsType.CURSOR:\n\t\t\tcase JsType.ON_OBJECT_CLICK:\n\t\t\tcase JsType.ON_OBJECT_CONTEXT_MENU:\n\t\t\tcase JsType.ON_OBJECT_HOVER:\n\t\t\tcase JsType.ON_OBJECT_LONG_PRESS:\n\t\t\tcase JsType.ON_OBJECT_MOUSE_CLICK:\n\t\t\tcase JsType.ON_OBJECT_POINTERDOWN:\n\t\t\tcase JsType.ON_OBJECT_POINTERUP:\n\t\t\tcase JsType.ON_POINTERDOWN:\n\t\t\tcase JsType.ON_POINTERUP:\n\t\t\tcase JsType.RAY_FROM_CURSOR:\n\t\t\t\treturn this.pointerEventsController;\n\t\t\tcase JsType.ON_KEY:\n\t\t\tcase JsType.ON_KEYDOWN:\n\t\t\tcase JsType.ON_KEYPRESS:\n\t\t\tcase JsType.ON_KEYUP:\n\t\t\t\treturn this.keyboardEventsController;\n\t\t}\n\t\tconsole.warn(`no event controller defined for jsType`, jsType);\n\t}\n\n\tget keyboardEventsController() {\n\t\treturn (this._keyboardEventsController =\n\t\t\tthis._keyboardEventsController || this._createController(KeyboardEventsController));\n\t}\n\tget mouseEventsController() {\n\t\treturn (this._mouseEventsController =\n\t\t\tthis._mouseEventsController || this._createController(MouseEventsController));\n\t}\n\tget dragEventsController() {\n\t\treturn (this._dragEventsController =\n\t\t\tthis._dragEventsController || this._createController(DragEventsController));\n\t}\n\t// get pointerEventsController(): PointerEventsController {\n\t// \treturn (this._pointerEventsController =\n\t// \t\tthis._pointerEventsController || this._createController(PointerEventsController));\n\t// }\n\tget windowEventsController() {\n\t\treturn (this._windowEventsController =\n\t\t\tthis._windowEventsController || this._createController(WindowEventsController));\n\t}\n\tget touchEventsController() {\n\t\treturn (this._touchEventsController =\n\t\t\tthis._touchEventsController || this._createController(TouchEventsController));\n\t}\n\tprivate _createController<T extends BaseSceneEventsControllerClass>(eventConstructor: Constructor<T>): T {\n\t\tconst controller = new eventConstructor(this);\n\t\tif (!this._controllers.includes(controller)) {\n\t\t\tthis._controllers.push(controller);\n\t\t}\n\t\treturn controller;\n\t}\n\n\tprivate _connectionTriggerDispatcher: SceneConnectionTriggerDispatcher | undefined;\n\tget connectionTriggerDispatcher() {\n\t\treturn (this._connectionTriggerDispatcher =\n\t\t\tthis._connectionTriggerDispatcher || new SceneConnectionTriggerDispatcher());\n\t}\n}\n","import {ref} from '../../../core/reactivity/CoreReactivity';\nimport {PolyScene} from '../PolyScene';\n\n// enum ThresholdState {\n// \tABOVE = 1,\n// \tUNDER = -1,\n// }\n// interface ThresholdContainer {\n// \tthreshold: number;\n// \tstate: ThresholdState;\n// }\n\nexport class ScenePerformanceMonitor {\n\tprivate _performanceRef = ref(1);\n\t// private _thresholdContainers: ThresholdContainer[] = [];\n\tconstructor(protected scene: PolyScene) {}\n\t// reset() {\n\t// \tthis._thresholdContainers.length = 0;\n\t// }\n\t// addThreshold(threshold: number) {\n\t// \t// check first that a similar threshold exists\n\t// \tfor (let container of this._thresholdContainers) {\n\t// \t\tif (container.threshold == threshold) {\n\t// \t\t\t// no need to add it\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t}\n\n\t// \t// add if none similar found\n\t// \tthis._thresholdContainers.push({\n\t// \t\tthreshold,\n\t// \t\tstate: ThresholdState.ABOVE,\n\t// \t});\n\t// }\n\tref() {\n\t\treturn this._performanceRef;\n\t}\n\tonPerformanceChange(perf: number) {\n\t\tthis._performanceRef.value = perf;\n\n\t\t// let updateRequired = false;\n\t\t// for (let container of this._thresholdContainers) {\n\t\t// \tif (perf < container.threshold && container.state == ThresholdState.ABOVE) {\n\t\t// \t\tcontainer.state = ThresholdState.UNDER;\n\t\t// \t\tupdateRequired = true;\n\t\t// \t\tbreak;\n\t\t// \t}\n\t\t// \tif (perf > container.threshold && container.state == ThresholdState.UNDER) {\n\t\t// \t\tcontainer.state = ThresholdState.ABOVE;\n\t\t// \t\tupdateRequired = true;\n\t\t// \t\tbreak;\n\t\t// \t}\n\t\t// }\n\n\t\t// if (!updateRequired) {\n\t\t// \treturn;\n\t\t// }\n\t\t// this.scene.actorsManager.runOnEventPerformanceChange();\n\t}\n\t// performance() {\n\t// \treturn this._performance;\n\t// }\n}\n","import {PolyScene} from '../PolyScene';\nimport {BaseNodeType} from '../../nodes/_Base';\nimport {TypedPathParam} from '../../params/_BasePath';\nimport {pushOnArrayAtEntry, popFromArrayAtEntry} from '../../../core/MapUtils';\nimport {ParamType} from '../../poly/ParamType';\nimport {BaseParamType} from '../../params/_Base';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\nimport {arrayShallowClone} from '../../../core/ArrayUtils';\nimport {NodePathParam} from '../../params/NodePath';\n\ntype BasePathParam = TypedPathParam<any>;\nconst _pathParams: BasePathParam[] = [];\n// class BasePathParam extends Typ\nconst _nodes: BaseNodeType[] = [];\n\nexport class ReferencesController {\n\tprivate _referenced_nodes_by_src_param_id: Map<CoreGraphNodeId, BaseNodeType | BaseParamType> = new Map();\n\tprivate _referencing_params_by_referenced_node_id: Map<CoreGraphNodeId, BasePathParam[]> = new Map();\n\tprivate _referencing_params_by_all_named_node_ids: Map<CoreGraphNodeId, BasePathParam[]> = new Map();\n\tconstructor(protected scene: PolyScene) {}\n\n\tsetReferenceFromParam(src_param: BasePathParam, referencedGraphNode: BaseNodeType | BaseParamType) {\n\t\tthis._referenced_nodes_by_src_param_id.set(src_param.graphNodeId(), referencedGraphNode);\n\t\tpushOnArrayAtEntry(\n\t\t\tthis._referencing_params_by_referenced_node_id,\n\t\t\treferencedGraphNode.graphNodeId(),\n\t\t\tsrc_param\n\t\t);\n\t}\n\tsetNamedNodesFromParam(src_param: BasePathParam) {\n\t\tsrc_param.decomposedPath.namedNodes(_nodes);\n\n\t\tfor (const namedNode of _nodes) {\n\t\t\tpushOnArrayAtEntry(this._referencing_params_by_all_named_node_ids, namedNode.graphNodeId(), src_param);\n\t\t}\n\t}\n\tresetReferenceFromParam(src_param: BasePathParam) {\n\t\tconst referenced_node = this._referenced_nodes_by_src_param_id.get(src_param.graphNodeId());\n\t\tif (referenced_node) {\n\t\t\tpopFromArrayAtEntry(\n\t\t\t\tthis._referencing_params_by_referenced_node_id,\n\t\t\t\treferenced_node.graphNodeId(),\n\t\t\t\tsrc_param\n\t\t\t);\n\t\t\tsrc_param.decomposedPath.namedNodes(_nodes);\n\t\t\tfor (const namedNode of _nodes) {\n\t\t\t\tpopFromArrayAtEntry(this._referencing_params_by_all_named_node_ids, namedNode.graphNodeId(), src_param);\n\t\t\t}\n\n\t\t\tthis._referenced_nodes_by_src_param_id.delete(src_param.graphNodeId());\n\t\t}\n\t}\n\n\treferencing_params(node: BaseNodeType) {\n\t\treturn this._referencing_params_by_referenced_node_id.get(node.graphNodeId());\n\t}\n\treferencingNodes(node: BaseNodeType, target: BaseNodeType[]) {\n\t\tconst params = this._referencing_params_by_referenced_node_id.get(node.graphNodeId());\n\t\ttarget.length = 0;\n\t\tif (params) {\n\t\t\tconst node_by_node_id: Map<CoreGraphNodeId, BaseNodeType> = new Map();\n\t\t\tfor (const param of params) {\n\t\t\t\tconst node = param.node;\n\t\t\t\tnode_by_node_id.set(node.graphNodeId(), node);\n\t\t\t}\n\t\t\tnode_by_node_id.forEach((node) => {\n\t\t\t\ttarget.push(node);\n\t\t\t});\n\t\t}\n\t\treturn target;\n\t}\n\tnodesReferencedBy(node: BaseNodeType, target: BaseNodeType[]) {\n\t\tconst path_param_types: Readonly<Set<ParamType>> = new Set([ParamType.NODE_PATH]);\n\t\t_pathParams.length = 0;\n\t\tfor (const param of node.params.all) {\n\t\t\tif (path_param_types.has(param.type())) {\n\t\t\t\t_pathParams.push(param as BasePathParam);\n\t\t\t}\n\t\t}\n\t\tconst nodes_by_id: Map<CoreGraphNodeId, BaseNodeType> = new Map();\n\t\tconst params: BaseParamType[] = [];\n\t\tfor (const pathParam of _pathParams) {\n\t\t\tthis._check_param(pathParam, nodes_by_id, params);\n\t\t}\n\t\tfor (const param of params) {\n\t\t\tnodes_by_id.set(param.node.graphNodeId(), param.node);\n\t\t}\n\t\ttarget.length = 0;\n\t\tnodes_by_id.forEach((node) => {\n\t\t\ttarget.push(node);\n\t\t});\n\t\treturn target;\n\t}\n\tprivate _check_param(\n\t\tparam: BasePathParam,\n\t\tnodes_by_id: Map<CoreGraphNodeId, BaseNodeType>,\n\t\tparams: BaseParamType[]\n\t) {\n\t\tif (param instanceof NodePathParam) {\n\t\t\tconst found_node = param.value.node();\n\t\t\t// const found_param = param.found_param();\n\t\t\tif (found_node) {\n\t\t\t\tnodes_by_id.set(found_node.graphNodeId(), found_node);\n\t\t\t}\n\t\t\t// if (found_param) {\n\t\t\t// \tparams.push(found_param);\n\t\t\t// }\n\t\t\treturn;\n\t\t}\n\t}\n\n\t//\n\t//\n\t// TRACK NAME CHANGES\n\t//\n\t//\n\tnotifyNameUpdated(node: BaseNodeType) {\n\t\tconst referencingParams = this._referencing_params_by_all_named_node_ids.get(node.graphNodeId());\n\t\tif (referencingParams) {\n\t\t\t// make sure to do a cloned copy, since the list will change as the params are notified to rebuild\n\t\t\tconst referencingParamsCloned = arrayShallowClone(referencingParams);\n\t\t\tfor (const referencingParam of referencingParamsCloned) {\n\t\t\t\treferencingParam.notifyPathRebuildRequired(node);\n\t\t\t}\n\t\t}\n\t}\n\n\t//\n\t//\n\t// TRACK NODE DELETIONS/ADDITIONS\n\t//\n\t//\n\n\t//\n\t//\n\t// TRACK PARAM DELETIONS/ADDITIONS\n\t//\n\t//\n\tnotifyParamsUpdated(node: BaseNodeType) {\n\t\tconst referencingParams = this._referencing_params_by_all_named_node_ids.get(node.graphNodeId());\n\n\t\tif (referencingParams) {\n\t\t\t// make sure to do a cloned copy, since the list will change as the params are notified to rebuild\n\t\t\tconst referencingParamsCloned = arrayShallowClone(referencingParams);\n\t\t\tfor (const referencingParam of referencingParamsCloned) {\n\t\t\t\tif (referencingParam.options.isSelectingParam()) {\n\t\t\t\t\treferencingParam.notifyTargetParamOwnerParamsUpdated(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {Vector2} from 'three';\nimport {IUniformN, IUniformTexture, IUniformV2} from '../../nodes/utils/code/gl/Uniforms';\nimport {GlParamConfig} from '../../nodes/gl/code/utils/GLParamConfig';\nimport {ParamType} from '../../poly/ParamType';\nimport {PolyDictionary} from '../../../types/GlobalTypes';\nimport {IUniforms} from '../../../core/geometry/Material';\n\nexport enum UniformName {\n\tTIME = 'time',\n\tRESOLUTION = 'resolution',\n\tSPOTLIGHTS_RAYMARCHING = 'spotLightsRayMarching',\n\tDIRECTIONALLIGHTS_RAYMARCHING = 'directionalLightsRayMarching',\n\t// HEMISPHERELIGHTS_RAYMARCHING = 'hemisphereLightsRayMarching',\n\tPOINTLIGHTS_RAYMARCHING = 'pointLightsRayMarching',\n\t// AREALIGHTS_RAYMARCHING = 'areaLightsRayMarching',\n}\n\nexport interface IUniformsWithTime extends IUniforms {\n\ttime: IUniformN;\n}\nexport interface IUniformsWithResolution extends IUniforms {\n\tresolution: IUniformV2;\n}\n// interface IUniformsWithResolutionOnly {\n// \tresolution: IUniformV2;\n// }\ninterface AddUniformOptions {\n\tparamConfigs: readonly GlParamConfig<ParamType>[];\n\tadditionalTextureUniforms: PolyDictionary<IUniformTexture>;\n\ttimeDependent: boolean;\n\tresolutionDependent: boolean;\n\traymarchingLightsWorldCoordsDependent: boolean;\n}\ninterface GlobalUniforms {\n\t// time: IUniformN;\n\tresolution: IUniformV2;\n}\n\nconst GLOBAL_UNIFORMS: GlobalUniforms = {\n\t// [UniformName.TIME]: {value: 0},\n\t[UniformName.RESOLUTION]: {value: new Vector2(1000, 1000)},\n};\nexport class UniformsController {\n\tconstructor(private scene: PolyScene) {}\n\n\t// private _resolution: Vector2 = new Vector2(1, 1);\n\t// private _resolutionDependentUniformsMap: Map<string, IUniformsWithResolutionOnly> = new Map();\n\t// private _resolutionDependentUniforms: IUniformsWithResolutionOnly[] = [];\n\n\t// add uniforms from assemblers\n\taddUniforms(uniforms: IUniforms, options: AddUniformOptions) {\n\t\tconst {\n\t\t\tparamConfigs,\n\t\t\tadditionalTextureUniforms,\n\t\t\ttimeDependent,\n\t\t\tresolutionDependent,\n\t\t\traymarchingLightsWorldCoordsDependent,\n\t\t} = options;\n\t\tfor (const paramConfig of paramConfigs) {\n\t\t\tuniforms[paramConfig.uniformName()] = paramConfig.uniform();\n\t\t}\n\t\tconst additionalUniformNames = Object.keys(additionalTextureUniforms);\n\t\tfor (const uniformName of additionalUniformNames) {\n\t\t\tconst uniformValue = additionalTextureUniforms[uniformName];\n\t\t\tuniforms[uniformName] = uniformValue;\n\t\t}\n\t\tif (timeDependent) {\n\t\t\tthis.addTimeUniform(uniforms);\n\t\t} else {\n\t\t\tthis.removeTimeUniform(uniforms);\n\t\t}\n\t\tif (resolutionDependent) {\n\t\t\tthis.addResolutionUniforms(uniforms);\n\t\t} else {\n\t\t\tthis.removeResolutionUniform(uniforms);\n\t\t}\n\t\tif (raymarchingLightsWorldCoordsDependent) {\n\t\t\tthis.addRaymarchingUniforms(uniforms);\n\t\t} else {\n\t\t\tthis.removeRaymarchingUniform(uniforms);\n\t\t}\n\t}\n\taddTimeUniform(uniforms: IUniforms) {\n\t\tuniforms[UniformName.TIME] = this.scene.timeController.timeUniform();\n\t}\n\tremoveTimeUniform(uniforms: IUniforms) {\n\t\tdelete uniforms[UniformName.TIME];\n\t}\n\ttimeUniformValue() {\n\t\treturn this.scene.timeController.timeUniform().value;\n\t}\n\n\t// public updateTime() {\n\t// \tGLOBAL_UNIFORMS[UniformName.TIME].value = this.scene.time();\n\t// }\n\n\t// resolution\n\taddResolutionUniforms(uniforms: IUniforms) {\n\t\tuniforms[UniformName.RESOLUTION] = GLOBAL_UNIFORMS[UniformName.RESOLUTION];\n\t}\n\tremoveResolutionUniform(uniforms: IUniforms) {\n\t\tdelete uniforms[UniformName.RESOLUTION];\n\t}\n\tupdateResolution(resolution: Vector2, pixelRatio: number) {\n\t\tGLOBAL_UNIFORMS[UniformName.RESOLUTION].value.copy(resolution).multiplyScalar(pixelRatio);\n\t\t// for (let uniforms of this._resolutionDependentUniforms) {\n\t\t// \tthis.updateResolutionDependentUniforms(uniforms);\n\t\t// }\n\t}\n\n\t// raymarching\n\taddRaymarchingUniforms(uniforms: IUniforms) {\n\t\tthis.scene.sceneTraverser.addLightsRayMarchingUniform(uniforms);\n\t}\n\tremoveRaymarchingUniform(uniforms: IUniforms) {\n\t\tthis.scene.sceneTraverser.removeLightsRayMarchingUniform(uniforms);\n\t}\n\n\t// updateResolutionDependentUniforms(uniforms: IUniformsWithResolutionOnly) {\n\t// \tconst resolutionUniform = uniforms[UniformName.RESOLUTION];\n\t// \tresolutionUniform.value.x = this._resolution.x; // * window.devicePixelRatio;\n\t// \tresolutionUniform.value.y = this._resolution.y; // * window.devicePixelRatio;\n\t// }\n}\n","import {BaseViewerType} from '../../viewers/_Base';\nimport {PolyScene} from '../../scene/PolyScene';\nimport {Camera} from 'three';\nimport {Poly} from '../../Poly';\nimport {ViewerCallbackOptions} from '../../poly/registers/cameras/PolyCamerasRegister';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\n\ninterface GetViewerOptions {\n\tcamera: Camera;\n\tcanvas?: HTMLCanvasElement;\n}\nexport class ViewersRegister {\n\tprivate _viewersById: Map<string, BaseViewerType> = new Map();\n\tprivate _firstViewer: BaseViewerType | undefined;\n\tprivate _lastRenderedViewer: BaseViewerType | undefined;\n\tconstructor(protected _scene: PolyScene) {}\n\n\tregisterViewer(viewer: BaseViewerType) {\n\t\tthis._viewersById.set(viewer.id(), viewer);\n\t\tthis._updateCache();\n\t}\n\tunregisterViewer(viewer: BaseViewerType) {\n\t\tthis._viewersById.delete(viewer.id());\n\t\tthis._updateCache();\n\t}\n\n\ttraverseViewers(callback: (viewer: BaseViewerType) => void) {\n\t\tthis._viewersById.forEach(callback);\n\t}\n\n\tviewer(options: GetViewerOptions) {\n\t\tconst createViewerOptions: ViewerCallbackOptions<Camera> = {\n\t\t\tcamera: options.camera,\n\t\t\tcanvas: options.canvas,\n\t\t\tscene: this._scene,\n\t\t};\n\t\treturn Poly.camerasRegister.createViewer(createViewerOptions);\n\t}\n\n\tfirstViewer() {\n\t\treturn this._firstViewer;\n\t}\n\tmarkViewerAsRendered(viewer: BaseViewerType) {\n\t\tthis._lastRenderedViewer = viewer;\n\t}\n\tlastRenderedViewer() {\n\t\treturn this._lastRenderedViewer;\n\t}\n\tprivate _updateCache() {\n\t\tthis._firstViewer = undefined;\n\t\tthis._viewersById.forEach((viewer) => {\n\t\t\tthis._firstViewer = this._firstViewer || viewer;\n\t\t});\n\t}\n\t/**\n\t * resize graphNode\n\t */\n\tprivate _graphNode: CoreGraphNode | undefined;\n\tgraphNode() {\n\t\treturn (this._graphNode = this._graphNode || this._createGraphNode());\n\t}\n\tprivate _createGraphNode() {\n\t\tconst coreGraphNode = new CoreGraphNode(this._scene, 'SceneViewersRegister');\n\t\treturn coreGraphNode;\n\t}\n\t// private _viewerWithResizeRequired: Set<string> = new Set();\n\tmarkViewerAsSizeUpdated(viewer: BaseViewerType) {\n\t\tif (!this._viewersById.has(viewer.id())) {\n\t\t\treturn;\n\t\t}\n\t\t// if (this._viewerWithResizeRequired.has(viewer.id())) {\n\t\t// \treturn;\n\t\t// }\n\t\t// this._viewerWithResizeRequired.add(viewer.id());\n\t\tthis._graphNode?.setDirty();\n\t}\n\t// markViewerAsResizeCompleted(viewer: BaseViewerType) {\n\t// \tif (!this._viewersById.has(viewer.id())) {\n\t// \t\treturn;\n\t// \t}\n\t// \tthis._viewerWithResizeRequired.delete(viewer.id());\n\t// }\n\t// isViewerResizeRequired(viewer: BaseViewerType) {\n\t// \treturn this._viewerWithResizeRequired.has(viewer.id());\n\t// }\n\t// updateViewersSize() {\n\t// \tthis._viewerWithResizeRequired.forEach((viewerId) => {\n\t// \t\tconst viewer = this._viewersById.get(viewerId);\n\t// \t\tif (viewer) {\n\t// \t\t\tviewer.updateSize();\n\t// \t\t}\n\t// \t});\n\t// }\n}\n","import {Poly} from '../../Poly';\n\n// import {PolyScene} from '../PolyScene';\n\nexport class SceneWebGLController {\n\tconstructor() {}\n\n\t_requireWebGL2: boolean = false;\n\n\trequireWebGL2() {\n\t\treturn this._requireWebGL2;\n\t}\n\tsetRequireWebGL2() {\n\t\tif (!this._requireWebGL2) {\n\t\t\tthis._requireWebGL2 = true;\n\t\t\tPoly.renderersController.setRequireWebGL2();\n\t\t}\n\t}\n}\n","import {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {PolyScene} from '../PolyScene';\n\nexport class WindowController {\n\tprivate _graphNode: CoreGraphNode | undefined;\n\tconstructor(private _scene: PolyScene) {}\n\tgraphNode() {\n\t\treturn (this._graphNode = this._graphNode || this._createGraphNode());\n\t}\n\tprivate _createGraphNode() {\n\t\tconst coreGraphNode = new CoreGraphNode(this._scene, 'SceneWindowController');\n\n\t\tglobalThis.addEventListener('resize', this._onWindowResizeBound);\n\n\t\treturn coreGraphNode;\n\t}\n\tprivate _onWindowResizeBound = this._onWindowResize.bind(this);\n\tprivate _onWindowResize() {\n\t\t// TODO: consider throttle\n\t\tthis.graphNode().setSuccessorsDirty();\n\t}\n\n\tdispose() {\n\t\tglobalThis.removeEventListener('resize', this._onWindowResizeBound);\n\t}\n}\n","import {StringParam} from '../../params/String';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\n\nexport class SceneAssetsController {\n\t//\n\t//\n\t// REGISTER PARAMS\n\t//\n\t//\n\tprivate _params_by_id: Map<CoreGraphNodeId, StringParam> = new Map();\n\tregister_param(param: StringParam) {\n\t\tthis._params_by_id.set(param.graphNodeId(), param);\n\t}\n\n\tderegister_param(param: StringParam) {\n\t\tthis._params_by_id.delete(param.graphNodeId());\n\t}\n\n\ttraverse_params(callback: (param: StringParam) => void) {\n\t\tthis._params_by_id.forEach((param, id) => {\n\t\t\tcallback(param);\n\t\t});\n\t}\n\n\t//\n\t//\n\t// ASSETS ROOT\n\t//\n\t//\n\tprivate _assetsRoot: string | null = null;\n\troot() {\n\t\treturn this._assetsRoot;\n\t}\n\tsetRoot(url: string | null) {\n\t\tif (url == '') {\n\t\t\turl = null;\n\t\t}\n\t\tthis._assetsRoot = url;\n\t}\n}\n","import {Vector3, IUniform, Light, SpotLight, DirectionalLight, HemisphereLight, PointLight} from 'three';\nimport {LightUserDataRaymarching} from './../../../../core/lights/Common';\nexport interface WorldPosUniformElement {\n\tworldPos: Vector3;\n}\nexport interface DirectionUniformElement {\n\tdirection: Vector3;\n}\nexport interface PenumbraUniformElement {\n\tpenumbra: number;\n}\nexport interface ShadowUniformElement {\n\tshadowBiasAngle: number;\n\tshadowBiasDistance: number;\n}\n\ninterface UniformWithWorldPosArray extends Array<WorldPosUniformElement> {\n\tneedsUpdate?: boolean;\n}\nexport interface UniformsWithWorldPos extends IUniform {\n\tvalue: UniformWithWorldPosArray;\n}\n\ninterface UniformWithDirectionArray extends Array<DirectionUniformElement> {\n\tneedsUpdate?: boolean;\n}\nexport interface UniformsWithDirection extends IUniform {\n\tvalue: UniformWithDirectionArray;\n}\ninterface UniformWithPenumbraArray extends Array<PenumbraUniformElement> {\n\tneedsUpdate?: boolean;\n}\ninterface UniformWithShadowBiasArray extends Array<ShadowUniformElement> {\n\tneedsUpdate?: boolean;\n}\nexport interface UniformsWithPenumbra extends IUniform {\n\tvalue: UniformWithPenumbraArray;\n}\nexport interface UniformsWithShadowBias extends IUniform {\n\tvalue: UniformWithShadowBiasArray;\n}\n\nexport enum LightType {\n\tSPOT = 0,\n\tDIRECTIONAL = 1,\n\tHEMISPHERE = 2,\n\tPOINT = 3,\n}\nexport function getLightType(object: Light): LightType | undefined {\n\tif ((object as SpotLight).isSpotLight) {\n\t\treturn LightType.SPOT;\n\t}\n\tif ((object as DirectionalLight).isDirectionalLight) {\n\t\treturn LightType.DIRECTIONAL;\n\t}\n\tif ((object as HemisphereLight).isHemisphereLight) {\n\t\treturn LightType.HEMISPHERE;\n\t}\n\tif ((object as PointLight as any).isPointLight) {\n\t\treturn LightType.POINT;\n\t}\n}\n// update functions\n// const worldPos = new Vector3();\n// const direction = new Vector3();\n// const tmpV = new Vector3();\n// export function updateWorldPos(\n// \tobject: Object3D,\n// \tuniforms: UniformsWithWorldPos,\n// \tindex: number,\n// \tdefaultUniformCreate: () => WorldPosUniformElement\n// ) {\n// \tobject.updateMatrixWorld(true);\n// \tobject.updateMatrix();\n// \tobject.getWorldPosition(worldPos);\n// \tuniforms.value[index] = uniforms.value[index] || defaultUniformCreate();\n// \tif(!uniforms.value[index].worldPos.equals(direction)){\n// \t\tuniforms.value[index].worldPos.copy(worldPos);\n// \t\tuniforms.value.needsUpdate = true;\n// \t}\n// }\n// export function updateDirectionFromTarget(\n// \tobject: Object3D,\n// \tuniforms: UniformsWithDirection,\n// \tindex: number,\n// \tdefaultUniformCreate: () => DirectionUniformElement\n// ) {\n// \t(object as DirectionalLight).target.updateMatrixWorld(true);\n// \t(object as DirectionalLight).target.updateMatrix();\n// \tdirection.setFromMatrixPosition(object.matrixWorld);\n// \ttmpV.setFromMatrixPosition((object as DirectionalLight).target.matrixWorld);\n// \tdirection.sub(tmpV);\n\n// \tuniforms.value[index] = uniforms.value[index] || defaultUniformCreate();\n// \tif(!uniforms.value[index].direction.equals(direction)){\n// \t\tuniforms.value[index].direction.copy(direction);\n// \t\tuniforms.value.needsUpdate = true;\n// \t}\n// }\n// export function updateDirectionFromMatrix(\n// \tobject: Object3D,\n// \tuniforms: UniformsWithDirection,\n// \tindex: number,\n// \tdefaultUniformCreate: () => DirectionUniformElement\n// ) {\n// \tdirection.setFromMatrixPosition(object.matrixWorld);\n\n// \tuniforms.value[index] = uniforms.value[index] || defaultUniformCreate();\n// \tif(!uniforms.value[index].direction.equals(direction)){\n// \t\tuniforms.value[index].direction.copy(direction);\n// \t\tuniforms.value.needsUpdate = true;\n// \t}\n// }\n\nexport function updateUserDataPenumbra(\n\tobject: SpotLight | PointLight | DirectionalLight,\n\tuniforms: UniformsWithPenumbra,\n\tindex: number,\n\tdefaultUniformCreate: () => PenumbraUniformElement\n) {\n\tuniforms.value[index] = uniforms.value[index] || defaultUniformCreate();\n\tconst uniformName = LightUserDataRaymarching.PENUMBRA;\n\tif (uniforms.value[index].penumbra != object.userData[uniformName]) {\n\t\tuniforms.value[index].penumbra = object.userData[uniformName];\n\t\tuniforms.value.needsUpdate = true;\n\t}\n}\nexport function updateUserDataShadowBias(\n\tobject: SpotLight | PointLight | DirectionalLight,\n\tuniforms: UniformsWithShadowBias,\n\tindex: number,\n\tdefaultUniformCreate: () => ShadowUniformElement\n) {\n\tuniforms.value[index] = uniforms.value[index] || defaultUniformCreate();\n\tif (uniforms.value[index].shadowBiasAngle != object.userData[LightUserDataRaymarching.SHADOW_BIAS_ANGLE]) {\n\t\tuniforms.value[index].shadowBiasAngle = object.userData[LightUserDataRaymarching.SHADOW_BIAS_ANGLE];\n\t\tuniforms.value.needsUpdate = true;\n\t}\n\tif (uniforms.value[index].shadowBiasDistance != object.userData[LightUserDataRaymarching.SHADOW_BIAS_DISTANCE]) {\n\t\tuniforms.value[index].shadowBiasDistance = object.userData[LightUserDataRaymarching.SHADOW_BIAS_DISTANCE];\n\t\tuniforms.value.needsUpdate = true;\n\t}\n}\n\nexport type AvailableLight = SpotLight | DirectionalLight | HemisphereLight | PointLight;\nexport type UniformsUpdateFunction<L extends AvailableLight> = (object: L, uniforms: IUniform) => void;\n","import {IUniform, SpotLight} from 'three';\nimport {\n\tPenumbraUniformElement,\n\tShadowUniformElement,\n\tUniformsUpdateFunction,\n\tupdateUserDataPenumbra,\n\tupdateUserDataShadowBias,\n} from './_Base';\n\nexport interface SpotLightRayMarchingUniformElement extends PenumbraUniformElement, ShadowUniformElement {}\ninterface SpotLightRayMarchingUniforms extends Array<SpotLightRayMarchingUniformElement> {\n\tneedsUpdate?: boolean;\n}\nexport interface SpotLightRayMarchingUniform extends IUniform {\n\tvalue: SpotLightRayMarchingUniforms;\n}\nexport function _createSpotLightUniform(): SpotLightRayMarchingUniformElement {\n\treturn {\n\t\tpenumbra: 0,\n\t\tshadowBiasAngle: 0,\n\t\tshadowBiasDistance: 0,\n\t};\n}\n\n// export function updateSpotLightPenumbra(\n// \tobject: SpotLight,\n// \tuniforms: UniformsWithPenumbra,\n// \tindex: number,\n// \tdefaultUniformCreate: () => PenumbraUniformElement\n// ) {\n// \tupdateUserDataPenumbra(object as SpotLight, uniforms, pointLightIndex, _createPointLightUniform);\n// \t// uniforms.value[index] = uniforms.value[index] || defaultUniformCreate();\n// \t// if(uniforms.value[index].penumbra != object.penumbra){\n// \t// \tuniforms.value[index].penumbra = object.penumbra;\n// \t// \tuniforms.value.needsUpdate = true;\n// \t// \tconsole.log(uniforms.value);\n// \t// }\n// }\n\nlet spotLightIndex = 0;\nexport const _updateUniformsWithSpotLight: UniformsUpdateFunction<SpotLight> = (\n\tobject: SpotLight,\n\tspotLightsRayMarching: SpotLightRayMarchingUniform\n) => {\n\t// updateSpotLightPenumbra(object, spotLightsRayMarching, spotLightIndex, _createSpotLightUniform);\n\tupdateUserDataPenumbra(object as SpotLight, spotLightsRayMarching, spotLightIndex, _createSpotLightUniform);\n\tupdateUserDataShadowBias(object as SpotLight, spotLightsRayMarching, spotLightIndex, _createSpotLightUniform);\n\tspotLightIndex++;\n};\nexport function _resetSpotLightIndex() {\n\tspotLightIndex = 0;\n}\n","import {IUniform, DirectionalLight} from 'three';\nimport {\n\tPenumbraUniformElement,\n\tupdateUserDataPenumbra,\n\tUniformsUpdateFunction,\n\tShadowUniformElement,\n\tupdateUserDataShadowBias,\n} from './_Base';\n\nexport interface DirectionalLightRayMarchingUniformElement extends PenumbraUniformElement, ShadowUniformElement {}\ninterface DirectionalLightRayMarchingUniforms extends Array<DirectionalLightRayMarchingUniformElement> {\n\tneedsUpdate?: boolean;\n}\nexport interface DirectionalLightRayMarchingUniform extends IUniform {\n\tvalue: DirectionalLightRayMarchingUniforms;\n}\nexport function _createDirectionalLightUniform(): DirectionalLightRayMarchingUniformElement {\n\treturn {\n\t\tpenumbra: 0,\n\t\tshadowBiasAngle: 0,\n\t\tshadowBiasDistance: 0,\n\t};\n}\n\nlet directionalLightIndex = 0;\nexport const _updateUniformsWithDirectionalLight: UniformsUpdateFunction<DirectionalLight> = (\n\tobject: DirectionalLight,\n\tdirectionalLightsRayMarching: DirectionalLightRayMarchingUniform\n) => {\n\tupdateUserDataPenumbra(\n\t\tobject as DirectionalLight,\n\t\tdirectionalLightsRayMarching,\n\t\tdirectionalLightIndex,\n\t\t_createDirectionalLightUniform\n\t);\n\tupdateUserDataShadowBias(\n\t\tobject as DirectionalLight,\n\t\tdirectionalLightsRayMarching,\n\t\tdirectionalLightIndex,\n\t\t_createDirectionalLightUniform\n\t);\n\tdirectionalLightIndex++;\n};\nexport function _resetDirectionalLightIndex() {\n\tdirectionalLightIndex = 0;\n}\n","import {IUniform, PointLight} from 'three';\nimport {\n\tPenumbraUniformElement,\n\tupdateUserDataPenumbra,\n\tUniformsUpdateFunction,\n\tShadowUniformElement,\n\tupdateUserDataShadowBias,\n} from './_Base';\n\nexport interface PointLightRayMarchingUniformElement extends PenumbraUniformElement, ShadowUniformElement {}\ninterface PointLightRayMarchingUniforms extends Array<PointLightRayMarchingUniformElement> {\n\tneedsUpdate?: boolean;\n}\nexport interface PointLightRayMarchingUniform extends IUniform {\n\tvalue: PointLightRayMarchingUniforms;\n}\nexport function _createPointLightUniform(): PointLightRayMarchingUniformElement {\n\treturn {\n\t\tpenumbra: 0,\n\t\tshadowBiasAngle: 0,\n\t\tshadowBiasDistance: 0,\n\t};\n}\n\nlet pointLightIndex = 0;\n\nexport const _updateUniformsWithPointLight: UniformsUpdateFunction<PointLight> = (\n\tobject: PointLight,\n\tpointLightsRayMarching: PointLightRayMarchingUniform\n) => {\n\tupdateUserDataPenumbra(object as PointLight, pointLightsRayMarching, pointLightIndex, _createPointLightUniform);\n\tupdateUserDataShadowBias(object as PointLight, pointLightsRayMarching, pointLightIndex, _createPointLightUniform);\n\tpointLightIndex++;\n};\nexport function _resetPointLightIndex() {\n\tpointLightIndex = 0;\n}\n","import {UniformName} from './UniformsController';\nimport {PolyScene} from '../PolyScene';\nimport {IUniforms} from '../../../core/geometry/Material';\nimport {\n\tScene,\n\tObject3D,\n\tLight,\n\tIUniform,\n\t// RectAreaLight,\n} from 'three';\nimport {LightType, getLightType, AvailableLight, UniformsUpdateFunction} from './raymarching/_Base';\nimport {\n\t_resetSpotLightIndex,\n\t_updateUniformsWithSpotLight,\n\tSpotLightRayMarchingUniform,\n\t_createSpotLightUniform,\n} from './raymarching/SpotLight';\nimport {\n\t_resetDirectionalLightIndex,\n\t_updateUniformsWithDirectionalLight,\n\tDirectionalLightRayMarchingUniform,\n\t_createDirectionalLightUniform,\n} from './raymarching/DirectionalLight';\n// import {\n// \t_resetHemisphereLightIndex,\n// \t_updateUniformsWithHemisphereLight,\n// \tHemisphereLightRayMarchingUniform,\n// \t_createHemisphereLightUniform,\n// } from './raymarching/HemisphereLight';\nimport {\n\t_resetPointLightIndex,\n\t_updateUniformsWithPointLight,\n\tPointLightRayMarchingUniform,\n\t_createPointLightUniform,\n} from './raymarching/PointLight';\n\nfunction _updateUniformsFunctionForLight<L extends AvailableLight>(\n\tobject: L\n): UniformsUpdateFunction<AvailableLight> | undefined {\n\tconst lightType = getLightType(object as Light);\n\tswitch (lightType) {\n\t\tcase LightType.SPOT: {\n\t\t\treturn _updateUniformsWithSpotLight as UniformsUpdateFunction<AvailableLight>;\n\t\t}\n\t\tcase LightType.DIRECTIONAL: {\n\t\t\treturn _updateUniformsWithDirectionalLight as UniformsUpdateFunction<AvailableLight>;\n\t\t}\n\t\t// case LightType.HEMISPHERE: {\n\t\t// \treturn _updateUniformsWithHemisphereLight as UniformsUpdateFunction<AvailableLight>;\n\t\t// }\n\t\tcase LightType.POINT: {\n\t\t\treturn _updateUniformsWithPointLight as UniformsUpdateFunction<AvailableLight>;\n\t\t}\n\t}\n}\nexport class SceneTraverserController {\n\tprivate _spotLightsRayMarching: SpotLightRayMarchingUniform = {\n\t\tvalue: [],\n\t};\n\tprivate _directionalLightsRayMarching: DirectionalLightRayMarchingUniform = {\n\t\tvalue: [],\n\t};\n\t// private _hemisphereLightsRayMarching: HemisphereLightRayMarchingUniform = {\n\t// \tvalue: [],\n\t// };\n\tprivate _pointLightsRayMarching: PointLightRayMarchingUniform = {\n\t\tvalue: [],\n\t};\n\t// private _areaLightsRayMarching: AreaLightRayMarchingUniform = {\n\t// \tvalue: [],\n\t// \t// properties: {\n\t// \t// \tworldPos: {},\n\t// \t// },\n\t// };\n\tprivate _updateUniformsFunctionByLight: WeakMap<AvailableLight, UniformsUpdateFunction<AvailableLight>> =\n\t\tnew WeakMap();\n\tprivate _uniformsByLight: WeakMap<Light, IUniform> = new WeakMap();\n\tconstructor(protected scene: PolyScene) {}\n\n\ttraverseScene(scene?: Scene) {\n\t\t_resetSpotLightIndex();\n\t\t_resetDirectionalLightIndex();\n\t\t// _resetHemisphereLightIndex();\n\t\t_resetPointLightIndex();\n\t\tscene = scene || this.scene.threejsScene();\n\t\tscene.traverse(this._onObjectTraverseBound);\n\t}\n\tprivate _onObjectTraverseBound = this._onObjectTraverse.bind(this);\n\tprivate _onObjectTraverse(object: Object3D) {\n\t\tlet updateFunction = this._updateUniformsFunctionByLight.get(object as AvailableLight);\n\n\t\tif (!updateFunction) {\n\t\t\tif ((object as Light).isLight) {\n\t\t\t\tupdateFunction = _updateUniformsFunctionForLight(object as AvailableLight);\n\t\t\t\tif (updateFunction) {\n\t\t\t\t\tthis._updateUniformsFunctionByLight.set(object as AvailableLight, updateFunction);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!updateFunction) {\n\t\t\treturn updateFunction;\n\t\t}\n\t\tlet uniforms = this._uniformsByLight.get(object as Light);\n\t\tif (!uniforms) {\n\t\t\tuniforms = this._updateUniformsForLight(object as Light);\n\t\t\tif (uniforms) {\n\t\t\t\tthis._uniformsByLight.set(object as Light, uniforms);\n\t\t\t}\n\t\t}\n\t\tif (!uniforms) {\n\t\t\treturn;\n\t\t}\n\t\tupdateFunction(object as AvailableLight, uniforms);\n\t}\n\tprivate _updateUniformsForLight<L extends Light>(object: L) {\n\t\tconst lightType = getLightType(object as Light);\n\t\tswitch (lightType) {\n\t\t\tcase LightType.SPOT: {\n\t\t\t\treturn this._spotLightsRayMarching;\n\t\t\t}\n\t\t\tcase LightType.DIRECTIONAL: {\n\t\t\t\treturn this._directionalLightsRayMarching;\n\t\t\t}\n\t\t\t// case LightType.HEMISPHERE: {\n\t\t\t// \treturn this._hemisphereLightsRayMarching;\n\t\t\t// }\n\t\t\tcase LightType.POINT: {\n\t\t\t\treturn this._pointLightsRayMarching;\n\t\t\t}\n\t\t}\n\t}\n\n\taddLightsRayMarchingUniform(uniforms: IUniforms) {\n\t\tuniforms[UniformName.SPOTLIGHTS_RAYMARCHING] = this._spotLightsRayMarching;\n\t\tuniforms[UniformName.DIRECTIONALLIGHTS_RAYMARCHING] = this._directionalLightsRayMarching;\n\t\t// uniforms[UniformName.HEMISPHERELIGHTS_RAYMARCHING] = this._hemisphereLightsRayMarching;\n\t\tuniforms[UniformName.POINTLIGHTS_RAYMARCHING] = this._pointLightsRayMarching;\n\t\t// uniforms[UniformName.AREALIGHTS_RAYMARCHING] = this._areaLightsRayMarching;\n\t}\n\tremoveLightsRayMarchingUniform(uniforms: IUniforms) {\n\t\tdelete uniforms[UniformName.SPOTLIGHTS_RAYMARCHING];\n\t\tdelete uniforms[UniformName.DIRECTIONALLIGHTS_RAYMARCHING];\n\t\t// delete uniforms[UniformName.HEMISPHERELIGHTS_RAYMARCHING];\n\t\tdelete uniforms[UniformName.POINTLIGHTS_RAYMARCHING];\n\t\t// uniforms[UniformName.AREALIGHTS_RAYMARCHING] = this._areaLightsRayMarching;\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {Poly} from '../../Poly';\nimport {AbstractRenderer} from '../../viewers/Common';\nimport {WebGLRenderer} from 'three';\nimport type {PathTracingRendererContainer} from '../../nodes/rop/utils/pathTracing/PathTracingRendererContainer';\nimport {arrayCopy} from '../../../core/ArrayUtils';\n\ntype SceneRenderersRegisterCallback = (value: AbstractRenderer) => void;\n\nexport interface RegisterRendererOptions {\n\tassignId: boolean;\n}\nconst _renderers: AbstractRenderer[] = [];\nexport class SceneRenderersRegister {\n\tprivate _renderersById: Map<number, AbstractRenderer> = new Map();\n\tprivate _registerTimeByRenderer: Map<AbstractRenderer, number> = new Map();\n\tprivate _lastRegisteredRenderer: AbstractRenderer | undefined;\n\tprivate _resolves: SceneRenderersRegisterCallback[] = [];\n\n\tconstructor(protected scene: PolyScene) {}\n\n\tregisterRenderer(renderer: AbstractRenderer, options?: RegisterRendererOptions) {\n\t\tlet assignId = true;\n\t\tif (options?.assignId == false) {\n\t\t\tassignId = false;\n\t\t}\n\t\tif (assignId) {\n\t\t\tPoly.renderersController.assignIdToRenderer(renderer);\n\t\t}\n\n\t\tconst id = Poly.renderersController.rendererId(renderer);\n\t\tif (id == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._renderersById.set(id, renderer);\n\t\tthis._registerTimeByRenderer.set(renderer, performance.now());\n\t\t// Poly.renderersController._registerRenderer(renderer, this.scene);\n\t\tthis._updateCache();\n\n\t\tif (this._renderersById.size == 1) {\n\t\t\tthis._flushCallbacksWithRenderer(renderer);\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.renderers(_renderers);\n\t\tfor (const renderer of _renderers) {\n\t\t\tthis.deregisterRenderer(renderer);\n\t\t}\n\t}\n\tderegisterRenderer(renderer: AbstractRenderer) {\n\t\tconst id = Poly.renderersController.rendererId(renderer);\n\t\tif (id == null) {\n\t\t\treturn;\n\t\t}\n\t\tthis._renderersById.delete(id);\n\n\t\trenderer.dispose();\n\t\tthis._updateCache();\n\t\t// Poly.renderersController._deregisterRenderer(renderer);\n\t}\n\tlastRegisteredRenderer() {\n\t\treturn this._lastRegisteredRenderer;\n\t}\n\n\trenderers(target: AbstractRenderer[]) {\n\t\t// const renderers: AbstractRenderer[] = [];\n\t\tthis._renderersById.forEach((renderer) => {\n\t\t\ttarget.push(renderer);\n\t\t});\n\t\treturn target;\n\t}\n\n\tprivate _updateCache() {\n\t\tthis._lastRegisteredRenderer = undefined;\n\t\tthis._registerTimeByRenderer.forEach((registerTime, renderer) => {\n\t\t\tif (this._lastRegisteredRenderer == undefined) {\n\t\t\t\tthis._lastRegisteredRenderer = renderer;\n\t\t\t} else {\n\t\t\t\tconst lastRegisterTime = this._registerTimeByRenderer.get(this._lastRegisteredRenderer);\n\t\t\t\tif (lastRegisterTime != null) {\n\t\t\t\t\tif (registerTime > lastRegisterTime) {\n\t\t\t\t\t\tthis._lastRegisteredRenderer = renderer;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _flushCallbacksWithRenderer(renderer: AbstractRenderer) {\n\t\tconst callbacks: SceneRenderersRegisterCallback[] = [];\n\t\tarrayCopy(this._resolves, callbacks);\n\t\tthis._resolves.length = 0;\n\t\tfor (const c of callbacks) {\n\t\t\tc(renderer);\n\t\t}\n\t}\n\n\tasync waitForAbstractRenderer(): Promise<AbstractRenderer> {\n\t\tif (this._lastRegisteredRenderer) {\n\t\t\treturn this._lastRegisteredRenderer;\n\t\t} else {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis._resolves.push(resolve);\n\t\t\t});\n\t\t}\n\t}\n\tasync waitForRenderer(): Promise<WebGLRenderer | undefined> {\n\t\tlet renderer = await this.waitForAbstractRenderer();\n\t\tif (renderer instanceof WebGLRenderer) {\n\t\t\treturn renderer;\n\t\t}\n\t\trenderer = (renderer as PathTracingRendererContainer).webGLRenderer;\n\t\tif (renderer && renderer instanceof WebGLRenderer) {\n\t\t\treturn renderer;\n\t\t}\n\t\tif (renderer) {\n\t\t\tif (!(renderer instanceof WebGLRenderer)) {\n\t\t\t\tconsole.log('unexpected renderer:', {renderer});\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Camera, WebGLRenderer} from 'three';\nimport {CoreWebXRARControllerOptions} from '../../../core/webXR/webXRAR/CommonAR';\nimport {CoreWebXRVRControllerOptions} from '../../../core/webXR/webXRVR/CommonVR';\nimport type {CoreWebXRARController} from '../../../core/webXR/webXRAR/CoreWebXRARController';\nimport type {CoreWebXRVRController} from '../../../core/webXR/webXRVR/CoreWebXRVRController';\nimport type {BaseCoreWebXRController} from '../../../core/webXR/_BaseCoreWebXRController';\nimport type {PolyScene} from '../PolyScene';\n\ntype ARControllerCreateFunction = (\n\trenderer: WebGLRenderer,\n\tcamera: Camera,\n\tcanvas: HTMLCanvasElement,\n\toptions: CoreWebXRARControllerOptions\n) => CoreWebXRARController;\ntype VRControllerCreateFunction = (\n\trenderer: WebGLRenderer,\n\tcamera: Camera,\n\tcanvas: HTMLCanvasElement,\n\toptions: CoreWebXRVRControllerOptions\n) => CoreWebXRVRController;\nexport class SceneWebXRController {\n\tconstructor(protected scene: PolyScene) {}\n\n\t/**\n\t *\n\t * WebXR\n\t *\n\t */\n\tprivate _activeXRController: BaseCoreWebXRController | null = null;\n\tprivate _setActiveXRController(controller: BaseCoreWebXRController | null): void {\n\t\tthis._activeXRController = controller;\n\t}\n\tactiveXRController(): BaseCoreWebXRController | null {\n\t\treturn this._activeXRController;\n\t}\n\n\t/**\n\t *\n\t * WebXR AR\n\t *\n\t */\n\tprivate _ARControllerCreateFunction: ARControllerCreateFunction | undefined;\n\tprivate _activeARController: CoreWebXRARController | null = null;\n\tsetARControllerCreationFunction(func: ARControllerCreateFunction) {\n\t\tthis._ARControllerCreateFunction = func;\n\t}\n\tARControllerCreateFunction() {\n\t\treturn this._ARControllerCreateFunction;\n\t}\n\tsetActiveARController(ARController: CoreWebXRARController | null) {\n\t\tthis._activeARController = ARController;\n\t\tthis._setActiveXRController(ARController);\n\t}\n\tactiveARController() {\n\t\treturn this._activeARController;\n\t}\n\n\t/**\n\t *\n\t * WebXR VR\n\t *\n\t */\n\tprivate _VRControllerCreateFunction: VRControllerCreateFunction | undefined;\n\tprivate _activeVRController: CoreWebXRVRController | null = null;\n\tsetVRControllerCreationFunction(func: VRControllerCreateFunction) {\n\t\tthis._VRControllerCreateFunction = func;\n\t}\n\tVRControllerCreateFunction() {\n\t\treturn this._VRControllerCreateFunction;\n\t}\n\tsetActiveVRController(VRController: CoreWebXRVRController | null) {\n\t\tthis._activeVRController = VRController;\n\t\tthis._setActiveXRController(VRController);\n\t}\n\tactiveVRController() {\n\t\treturn this._activeVRController;\n\t}\n}\n","import {ActorsManager} from './utils/ActorsManager';\nimport {SceneCamerasController} from './utils/SceneCamerasController';\nimport {Cooker} from './utils/Cooker';\nimport {SceneCookController} from './utils/CookController';\nimport {CoreGraph} from '../../core/graph/CoreGraph';\nimport {CorePerformance} from '../../core/performance/CorePerformance';\nimport {DispatchController} from './utils/DispatchController';\nimport {SceneExpressionsController} from './utils/SceneExpressionsController';\nimport {SceneLifeCycleController} from './utils/LifeCycleController';\nimport {LoadingController} from './utils/LoadingController';\nimport {MissingReferencesController} from './utils/missingReferences/MissingReferencesController';\nimport {GraphNodesController} from './utils/GraphNodesController';\nimport {NodesController} from './utils/NodesController';\n// import {PolySceneSerializer} from './utils/Serializer';\nimport {SceneEventsDispatcher} from './utils/events/EventsDispatcher';\nimport {ObjectsController} from './utils/ObjectsController';\nimport {ScenePerformanceMonitor} from './utils/ScenePerformanceMonitor';\nimport {ReferencesController} from './utils/ReferencesController';\nimport {\n\tonTimeTickHook,\n\tTimeController,\n\tTimeControllerUpdateTimeOptions,\n\tTIME_CONTROLLER_UPDATE_TIME_OPTIONS_DEFAULT,\n} from './utils/TimeController';\nimport {UniformsController} from './utils/UniformsController';\nimport {ViewersRegister} from './utils/ViewersRegister';\nimport {SceneWebGLController} from './utils/WebGLController';\nimport {WindowController} from './utils/WindowController';\nimport {SceneAssetsController} from './utils/AssetsController';\nimport {SceneTraverserController} from './utils/SceneTraverser';\nimport {BaseNodeType} from '../nodes/_Base';\nimport {ObjNodeChildrenMap} from '../poly/registers/nodes/Obj';\nimport {Constructor, valueof} from '../../types/GlobalTypes';\nimport {Raycaster, Scene, WebGLRenderer} from 'three';\nimport {CoreString} from '../../core/String';\nimport {SceneRenderersRegister, RegisterRendererOptions} from './utils/SceneRenderersRegister';\nimport {Poly} from '../Poly';\nimport {NodeCreateOptions} from '../nodes/utils/hierarchy/ChildrenController';\nimport {SceneWebXRController} from './utils/WebXREventsController';\nimport {CoreObjectType, ObjectContent} from '../../core/geometry/ObjectContent';\nimport {CoreParamSerializer, BaseParamSerializer} from '../params/utils/CoreParamSerializer';\nimport type {ParamType} from '../poly/ParamType';\n\ninterface PolySceneCreateOptions {\n\troot: NodeCreateOptions;\n\tparamsSerializerClass?: typeof CoreParamSerializer<ParamType>;\n}\n\ntype SceneBatchUpdateCallback = () => void | Promise<void>;\ninterface UpdateState {\n\tscene: Scene;\n}\n\n/**\n *\n *\n * PolyScene contains all nodes within a scene.\n *\n */\nexport class PolyScene {\n\t/**\n\t * Returns the THREE.Scene.\n\t *\n\t * @remarks\n\t *\n\t * Read more about how to use a THREE.Scene on [THREE's documentation](https://threejs.org/docs/?q=scene#api/en/scenes/Scene)\n\t *\n\t */\n\tthreejsScene(): Scene {\n\t\treturn this.root().object;\n\t}\n\tprivate _uuid!: string;\n\tsetUuid(uuid: string) {\n\t\treturn (this._uuid = uuid);\n\t}\n\tget uuid() {\n\t\treturn this._uuid;\n\t}\n\tprivate _name: string | undefined;\n\tsetName(newName: string) {\n\t\treturn (this._name = PolyScene.sanitizeName(newName));\n\t}\n\tstatic sanitizeName(newName: string) {\n\t\tnewName = CoreString.sanitizeName(newName);\n\t\t// force lower case for now, as the editor export uses this\n\t\t// and it may be safer to use lowercase to make it work across OSes\n\t\tnewName = newName.toLowerCase();\n\t\treturn newName;\n\t}\n\tname() {\n\t\treturn this._name;\n\t}\n\n\tprotected _camerasController: SceneCamerasController | undefined;\n\tget camerasController() {\n\t\treturn (this._camerasController = this._camerasController || new SceneCamerasController(this));\n\t}\n\t/**\n\t * Returns the camera object that has been set as main\n\t *\n\t */\n\tmainCamera() {\n\t\treturn this.camerasController.mainCamera();\n\t}\n\n\tprivate _cooker = new Cooker(this);\n\tget cooker() {\n\t\treturn this._cooker;\n\t}\n\n\t// private _cube_cameras_controller: CubeCamerasController;\n\t// get cube_cameras_controller() {\n\t// \treturn (this._cube_cameras_controller = this._cube_cameras_controller || new CubeCamerasController(this));\n\t// }\n\tprivate _actorsManager: ActorsManager | undefined;\n\tget actorsManager() {\n\t\treturn (this._actorsManager = this._actorsManager || new ActorsManager(this));\n\t}\n\n\tprivate _assetsController: SceneAssetsController | undefined;\n\tget assets() {\n\t\treturn (this._assetsController = this._assetsController || new SceneAssetsController());\n\t}\n\n\tpublic readonly cookController = new SceneCookController();\n\t/**\n\t * Returns a promise to wait for all nodes to have cooked when loading a scene.\n\t *\n\t */\n\tasync waitForCooksCompleted(): Promise<void> {\n\t\treturn await this.cookController.waitForCooksCompleted();\n\t}\n\n\tprivate _dispatchController: DispatchController | undefined;\n\tget dispatchController() {\n\t\treturn (this._dispatchController = this._dispatchController || new DispatchController(this));\n\t}\n\tprivate _eventsDispatcher: SceneEventsDispatcher | undefined;\n\tget eventsDispatcher() {\n\t\treturn (this._eventsDispatcher = this._eventsDispatcher || new SceneEventsDispatcher(this));\n\t}\n\tprivate _webXRController: SceneWebXRController | undefined;\n\tget webXR() {\n\t\treturn (this._webXRController = this._webXRController || new SceneWebXRController(this));\n\t}\n\t/**\n\t * When using Polygonjs viewers, a raycaster is created to use mouse events and detect if there are any object under the cursor.\n\t * But if no viewer is created, such as when [importing a scene in react three fiber](/docs/integrations/react_three_fiber),\n\t * It is then useful to give a raycaster.\n\t *\n\t */\n\tsetRaycaster(raycaster: Raycaster) {\n\t\tthis.eventsDispatcher.setRaycaster(raycaster);\n\t}\n\n\tprivate _graph = new CoreGraph();\n\tget graph() {\n\t\treturn this._graph;\n\t}\n\n\tpublic readonly lifecycleController: SceneLifeCycleController = new SceneLifeCycleController(this);\n\tpublic readonly loadingController: LoadingController = new LoadingController(this);\n\tpublic readonly missingExpressionReferencesController: MissingReferencesController =\n\t\tnew MissingReferencesController(this);\n\tpublic readonly expressionsController: SceneExpressionsController = new SceneExpressionsController();\n\tpublic readonly nodesController = new NodesController(this);\n\tpublic readonly graphNodesController = new GraphNodesController(this);\n\tpublic readonly renderersRegister = new SceneRenderersRegister(this);\n\t/**\n\t * Creates a new node.\n\t *\n\t * nodeClass can be either a string or a node class. Both examples below work:\n\t *\n\t * - polyScene.createNode('box'): returns a BoxSopNode\n\t * - polyScene.createNode(boxSopNode): returns a BoxSopNode\n\t *\n\t */\n\tcreateNode<S extends keyof ObjNodeChildrenMap>(nodeClass: S, options?: NodeCreateOptions): ObjNodeChildrenMap[S];\n\tcreateNode<K extends valueof<ObjNodeChildrenMap>>(nodeClass: Constructor<K>, options?: NodeCreateOptions): K;\n\tcreateNode<K extends valueof<ObjNodeChildrenMap>>(nodeClass: Constructor<K>, options?: NodeCreateOptions): K {\n\t\treturn this.root().createNode(nodeClass, options) as K;\n\t}\n\t/**\n\t * returns all nodes with a given type\n\t *\n\t * - polyScene.nodesByType('box'): returns all BoxSopNodes\n\t */\n\tnodesByType(type: string): BaseNodeType[] {\n\t\treturn this.nodesController.nodesByType(type);\n\t}\n\tprotected _objectsController = new ObjectsController(this);\n\tget objectsController() {\n\t\treturn this._objectsController;\n\t}\n\t/**\n\t * returns a THREE.Object3D whose name matches the mask\n\t *\n\t */\n\tfindObjectByMask<T extends CoreObjectType>(mask: string): ObjectContent<T> | undefined {\n\t\treturn this._objectsController.findObjectByMask(mask);\n\t}\n\t/**\n\t * returns a list THREE.Object3Ds whose names matche the mask\n\t *\n\t */\n\tobjectsByMask<T extends CoreObjectType>(mask: string, parent?: ObjectContent<T>): ObjectContent<T>[] {\n\t\treturn this._objectsController.objectsByMask(mask, parent);\n\t}\n\n\tprotected _referencesController = new ReferencesController(this);\n\tget referencesController() {\n\t\treturn this._referencesController;\n\t}\n\n\tprotected _performance: CorePerformance | undefined;\n\tget performance() {\n\t\treturn (this._performance = this._performance || new CorePerformance());\n\t}\n\tpublic readonly perfMonitor = new ScenePerformanceMonitor(this);\n\n\tprotected _viewersRegister: ViewersRegister | undefined;\n\tget viewersRegister() {\n\t\treturn (this._viewersRegister = this._viewersRegister || new ViewersRegister(this));\n\t}\n\tpublic readonly sceneTraverser = new SceneTraverserController(this);\n\t/**\n\t * updates Polygonjs scene internals. This is called automatically when using Polygonjs viewers,\n\t * but you would need to call it yourself in the render loop when adding your scene to threejs or react-three-fiber.\n\t * See [https://polygonjs.com/docs/integrations](https://polygonjs.com/docs/integrations)\n\t *\n\t */\n\tupdate(delta: number, state?: UpdateState) {\n\t\t// setDelta is necessary here, as this function is most likely called from an integration with threejs, using a custom render loop\n\t\tthis.timeController.setDelta(delta);\n\t\tthis.timeController.incrementTimeIfPlaying(TIME_CONTROLLER_UPDATE_TIME_OPTIONS_DEFAULT);\n\t\tthis.sceneTraverser.traverseScene(state?.scene);\n\t}\n\n\t//\n\t//\n\t// time\n\t//\n\t//\n\treadonly timeController = new TimeController(this);\n\t/**\n\t * sets the current frame\n\t *\n\t */\n\tsetFrame(frame: number) {\n\t\tthis.timeController.setFrame(frame);\n\t}\n\tsetFrameToStart() {\n\t\tthis.timeController.setFrameToStart();\n\t}\n\n\t/**\n\t * returns the current frame\n\t *\n\t */\n\tframe(): number {\n\t\treturn this.timeController.frame();\n\t}\n\t/**\n\t * returns the current time\n\t *\n\t */\n\ttime(): number {\n\t\treturn this.timeController.time();\n\t}\n\tmaxFrame() {\n\t\treturn this.timeController.maxFrame();\n\t}\n\t/**\n\t * starts playing the scene\n\t *\n\t */\n\tplay() {\n\t\tthis.timeController.play();\n\t}\n\t/**\n\t * pauses the scene\n\t *\n\t */\n\tpause() {\n\t\tthis.timeController.pause();\n\t}\n\t/**\n\t * increments the time\n\t *\n\t */\n\tincrementTime(options?: TimeControllerUpdateTimeOptions) {\n\t\tthis.timeController.incrementTime(options);\n\t}\n\t/**\n\t * increments the time if the scene is playing()\n\t *\n\t */\n\tincrementTimeIfPlaying(options?: TimeControllerUpdateTimeOptions) {\n\t\tthis.timeController.incrementTimeIfPlaying(options);\n\t}\n\t/**\n\t * registers a renderer\n\t *\n\t */\n\tregisterRenderer(renderer: WebGLRenderer, options?: RegisterRendererOptions) {\n\t\treturn this.renderersRegister.registerRenderer(renderer, options);\n\t}\n\n\t//\n\t//\n\t// uniforms\n\t//\n\t//\n\tprivate _uniformsController: UniformsController | undefined;\n\tget uniformsController() {\n\t\treturn (this._uniformsController = this._uniformsController || new UniformsController(this));\n\t}\n\n\t//\n\t//\n\t// webgl\n\t//\n\t//\n\tprivate _webglController: SceneWebGLController | undefined;\n\tget webglController() {\n\t\treturn (this._webglController = this._webglController || new SceneWebGLController());\n\t}\n\n\t//\n\t//\n\t// window\n\t//\n\t//\n\tprivate _windowController: WindowController | undefined;\n\tget windowController() {\n\t\treturn (this._windowController = this._windowController || new WindowController(this));\n\t}\n\n\t//\n\t//\n\t// constructor\n\t//\n\t//\n\tconstructor(options?: PolySceneCreateOptions) {\n\t\tthis._graph.setScene(this);\n\t\tthis._paramSerializerClass = options?.paramsSerializerClass;\n\t\tthis.nodesController.createRoot(options?.root);\n\t\tPoly.scenesRegister.registerScene(this);\n\t}\n\n\tprivate _disposed = false;\n\tdispose() {\n\t\tif (this._disposed == true) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposed = true;\n\t\tthis.batchUpdates(() => {\n\t\t\tthis.nodesController.traverseNodes((node) => {\n\t\t\t\tnode.parent()?.removeNode(node);\n\t\t\t});\n\t\t});\n\t\tif (this._windowController) {\n\t\t\tthis._windowController.dispose();\n\t\t\tthis._windowController = undefined;\n\t\t}\n\t\tthis.timeController.dispose();\n\t\tthis.renderersRegister.dispose();\n\t\tthis.camerasController.dispose();\n\t\tthis.root().dispose();\n\t\tPoly.scenesRegister.deregisterScene(this);\n\t}\n\tdisposed() {\n\t\treturn this._disposed;\n\t}\n\n\tprivate _paramSerializerClass?: BaseParamSerializer;\n\tparamSerializerClass() {\n\t\treturn this._paramSerializerClass;\n\t}\n\n\t//\n\t//\n\t// cooker\n\t//\n\t//\n\t/**\n\t * batchUpdates can be useful to set multiple parameter values without triggering a recook for each update.\n\t *\n\t */\n\tasync batchUpdates(callback: SceneBatchUpdateCallback) {\n\t\tthis._cooker.block();\n\n\t\tawait callback();\n\n\t\tthis._cooker.unblock();\n\t}\n\n\t//\n\t//\n\t// nodes\n\t//\n\t//\n\t/**\n\t * returns a node based on its path\n\t *\n\t * - polyScene.node('/geo1')\n\t *\n\t */\n\tnode(path: string) {\n\t\treturn this.nodesController.node(path);\n\t}\n\t/**\n\t * returns the root node\n\t *\n\t */\n\troot() {\n\t\treturn this.nodesController.root();\n\t}\n\t/**\n\t * traverse all nodes and runs a callback for each\n\t *\n\t */\n\ttraverseNodes(callback: (node: BaseNodeType) => void) {\n\t\tthis.nodesController.traverseNodes(callback);\n\t}\n\n\t//\n\t//\n\t// CALLBACKS\n\t//\n\t//\n\t/**\n\t * registers a BeforeTick callback. BeforeTick callbacks are run before updating the frame (and therefore before any time dependent node has changed)\n\t *\n\t */\n\tregisterOnBeforeTick(callbackName: string, callback: onTimeTickHook): void {\n\t\tthis.timeController.registerOnBeforeTick(callbackName, callback);\n\t}\n\t/**\n\t * unregisters BeforeTick callback\n\t *\n\t */\n\tunRegisterOnBeforeTick(callbackName: string): void {\n\t\tthis.timeController.unRegisterOnBeforeTick(callbackName);\n\t}\n\t/**\n\t * Returns the list registered BeforeTick callback names\n\t *\n\t */\n\tregisteredBeforeTickCallbacks(): Map<string, onTimeTickHook> {\n\t\treturn this.timeController.registeredBeforeTickCallbacks();\n\t}\n\t/**\n\t * return true if a callback is registered with that name\n\t *\n\t */\n\thasBeforeTickCallback(callbackName: string): boolean {\n\t\treturn this.timeController.hasBeforeTickCallback(callbackName);\n\t}\n\t/**\n\t * registers AfterTick callback. AfterTick callbacks are run after updating the frame (and therefore after any time dependent node has changed)\n\t *\n\t */\n\tregisterOnAfterTick(callbackName: string, callback: onTimeTickHook): void {\n\t\tthis.timeController.registerOnAfterTick(callbackName, callback);\n\t}\n\t/**\n\t * unregisters AfterTick callback\n\t *\n\t */\n\tunRegisterOnAfterTick(callbackName: string): void {\n\t\tthis.timeController.unRegisterOnAfterTick(callbackName);\n\t}\n\t/**\n\t * Returns the list registered AfterTick callback names\n\t *\n\t */\n\tregisteredAfterTickCallbacks(): Map<string, onTimeTickHook> {\n\t\treturn this.timeController.registeredAfterTickCallbacks();\n\t}\n\t/**\n\t * return true if a callback is registered with that name\n\t *\n\t */\n\thasAfterTickCallback(callbackName: string): boolean {\n\t\treturn this.timeController.hasAfterTickCallback(callbackName);\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {Object3D} from 'three';\nimport {CorePath, objectsByMask, CorePathObjCallback} from '../../../core/geometry/CorePath';\nimport {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent';\n\nexport const ROOT_NAME = '/';\n\nexport class ObjectsController {\n\tconstructor(private scene: PolyScene) {}\n\n\tfindObjectByMask<T extends CoreObjectType>(mask: string): ObjectContent<T> | undefined {\n\t\treturn CorePath.findObjectByMask(mask, this.scene.threejsScene());\n\t}\n\n\tobjectsByMask<T extends CoreObjectType>(mask: string, parent?: ObjectContent<T>): ObjectContent<T>[] {\n\t\treturn objectsByMask(mask, parent || this.scene.threejsScene(), false);\n\t}\n\n\ttraverseObjectsWithMask<T extends CoreObjectType>(\n\t\tmask: string,\n\t\tcallback: CorePathObjCallback<T>,\n\t\tobject: Object3D | undefined,\n\t\tinvertMask: boolean = false\n\t) {\n\t\tCorePath.traverseObjectsWithMaskInObject(mask, object || this.scene.threejsScene(), callback, invertMask);\n\t}\n}\n","import {PolyScene} from '../PolyScene';\nimport {CoreGraphNode} from '../../../core/graph/CoreGraphNode';\nimport {SceneEvent} from '../../poly/SceneEvent';\nimport {Clock} from 'three';\nimport {SCENE_EVENT_PLAY_EVENT_CONTEXT, SCENE_EVENT_PAUSE_EVENT_CONTEXT} from './events/SceneEventsController';\nimport {ref} from '../../../core/reactivity/CoreReactivity';\nimport {Poly} from '../../Poly';\n\n// ensure that FPS remains a float\n// to have divisions and multiplications also give a float\nconst FPS = 60.0;\nexport const DESIRED_FPS = 60.0;\nconst MAX_DELTA = 0.1;\nexport type onTimeTickHook = (delta: number) => void;\nexport type onPlayingStateChangeCallback = () => void;\n// const performance = Poly.performance.performanceManager();\n\nexport interface TimeControllerUpdateTimeOptions {\n\tupdateClockDelta?: boolean;\n}\nexport const TIME_CONTROLLER_UPDATE_TIME_OPTIONS_DEFAULT: TimeControllerUpdateTimeOptions = {\n\tupdateClockDelta: false,\n};\n\ntype onTimeTickCallbacksMap = Map<string, onTimeTickHook>;\nexport class TimeController {\n\tstatic START_FRAME: Readonly<number> = 0;\n\tprivate _frame: number = 0;\n\tprivate _timeUniform = ref<number>(0);\n\tprivate _timeDeltaUniform = ref<number>(0);\n\tprivate _graphNode: CoreGraphNode;\n\tprivate _realtimeState = true;\n\tprivate _maxFrame = 600;\n\tprivate _maxFrameLocked = false;\n\tprivate _playing: boolean = false;\n\tprivate _clock = new Clock();\n\t// private _delta: number = 0;\n\n\t// private _PLAY_EVENT_CONTEXT: EventContext<SceneEvent> | undefined;\n\t// private _PAUSE_EVENT_CONTEXT: EventContext<SceneEvent> | undefined;\n\t// private _TICK_EVENT_CONTEXT: EventContext<SceneEvent> | undefined;\n\t// get PLAY_EVENT_CONTEXT() {\n\t// \treturn (this._PLAY_EVENT_CONTEXT = this._PLAY_EVENT_CONTEXT || {event: new SceneEvent(SceneEventType.PLAY)});\n\t// }\n\t// get PAUSE_EVENT_CONTEXT() {\n\t// \treturn (this._PAUSE_EVENT_CONTEXT = this._PAUSE_EVENT_CONTEXT || {event: new SceneEvent(SceneEventType.PAUSE)});\n\t// }\n\t// get TICK_EVENT_CONTEXT() {\n\t// \treturn (this._TICK_EVENT_CONTEXT = this._TICK_EVENT_CONTEXT || {event: new SceneEvent(SceneEventType.TICK)});\n\t// }\n\n\tconstructor(private scene: PolyScene) {\n\t\tthis._graphNode = new CoreGraphNode(scene, 'timeController');\n\t}\n\tget graphNode() {\n\t\treturn this._graphNode;\n\t}\n\n\tdispose() {\n\t\tthis._graphNode.dispose();\n\t}\n\n\tupdateClockDelta() {\n\t\tconst delta = this._clock.getDelta();\n\t\tconst clampedDelta = delta > MAX_DELTA ? MAX_DELTA : delta;\n\t\treturn this.setDelta(clampedDelta);\n\t}\n\tdelta() {\n\t\treturn this._timeDeltaUniform.value;\n\t}\n\tsetDelta(delta: number) {\n\t\treturn (this._timeDeltaUniform.value = delta);\n\t}\n\n\tframe(): number {\n\t\treturn this._frame;\n\t}\n\ttimeUniform() {\n\t\treturn this._timeUniform;\n\t}\n\ttimeDeltaUniform() {\n\t\treturn this._timeDeltaUniform;\n\t}\n\ttime(): number {\n\t\treturn this._timeUniform.value;\n\t}\n\t// timeDelta() {\n\t// \treturn this._timeDeltaUniform.value;\n\t// }\n\tmaxFrame() {\n\t\treturn this._maxFrame;\n\t}\n\tmaxFrameLocked() {\n\t\treturn this._maxFrameLocked;\n\t}\n\trealtimeState() {\n\t\treturn this._realtimeState;\n\t}\n\tsetMaxFrame(maxFrame: number) {\n\t\tthis._maxFrame = Math.floor(maxFrame);\n\t\tthis.scene.dispatchController.dispatch(this._graphNode, SceneEvent.MAX_FRAME_UPDATED);\n\t}\n\tsetMaxFrameLocked(state: boolean) {\n\t\tthis._maxFrameLocked = state;\n\t\tthis.scene.dispatchController.dispatch(this._graphNode, SceneEvent.MAX_FRAME_UPDATED);\n\t}\n\tsetRealtimeState(state: boolean) {\n\t\tthis._realtimeState = state;\n\t\tthis.scene.dispatchController.dispatch(this._graphNode, SceneEvent.REALTIME_STATUS_UPDATED);\n\t}\n\n\tsetTime(time: number, updateFrame = true) {\n\t\tif (time == this._timeUniform.value) {\n\t\t\treturn;\n\t\t}\n\t\tthis._timeUniform.value = time;\n\n\t\t// we block updates here, so that dependent nodes only cook once\n\t\tthis.scene.cooker.block();\n\t\tconst delta = this.delta();\n\t\tfor (const callback of this._onBeforeTickCallbacks) {\n\t\t\tcallback(delta);\n\t\t}\n\t\tif (this._playing == true && time > 0) {\n\t\t\tthis.scene.actorsManager.tick();\n\t\t}\n\n\t\tif (updateFrame) {\n\t\t\tconst newFrame = Math.floor(this._timeUniform.value * FPS);\n\t\t\tconst boundedFrame = this._ensureFrameWithinBounds(newFrame);\n\t\t\tif (newFrame != boundedFrame) {\n\t\t\t\tthis.setFrame(boundedFrame, true);\n\t\t\t} else {\n\t\t\t\tthis._frame = newFrame;\n\t\t\t}\n\t\t}\n\n\t\t// update time dependents\n\t\tthis.scene.dispatchController.dispatch(this._graphNode, SceneEvent.FRAME_UPDATED);\n\t\t// this.scene.uniformsController.updateTime();\n\n\t\tthis.graphNode.setSuccessorsDirty();\n\t\tthis.scene.cooker.unblock();\n\n\t\t// dispatch events after nodes have cooked\n\t\t// this.scene.eventsDispatcher.sceneEventsController.dispatch(SCENE_EVENT_TICK_EVENT_CONTEXT);\n\n\t\tfor (const callback of this._onAfterTickCallbacks) {\n\t\t\tcallback(delta);\n\t\t}\n\t}\n\n\tsetFrame(frame: number, updateTime = true) {\n\t\tif (frame == this._frame) {\n\t\t\treturn;\n\t\t}\n\t\tframe = this._ensureFrameWithinBounds(frame);\n\t\tif (frame == this._frame) {\n\t\t\treturn;\n\t\t}\n\t\tthis._frame = frame;\n\t\tif (this._frame == TimeController.START_FRAME) {\n\t\t\tthis.scene.actorsManager.runOnEventSceneReset();\n\t\t}\n\n\t\tif (updateTime) {\n\t\t\tthis.setTime(this._frame / FPS, false);\n\t\t}\n\t}\n\tsetFrameToStart() {\n\t\tthis.setFrame(TimeController.START_FRAME, true);\n\t}\n\tincrementTimeIfPlaying(options?: TimeControllerUpdateTimeOptions) {\n\t\tif (this._playing) {\n\t\t\tif (!this.scene.root().areChildrenCooking()) {\n\t\t\t\tthis.incrementTime(options);\n\t\t\t}\n\t\t}\n\t}\n\tincrementTime(options?: TimeControllerUpdateTimeOptions) {\n\t\tif (!(options?.updateClockDelta == false)) {\n\t\t\tthis.updateClockDelta();\n\t\t}\n\n\t\tif (this._realtimeState) {\n\t\t\t// const performance_now = performance.now();\n\t\t\tconst newTime = this._timeUniform.value + this.delta();\n\t\t\t// this._prev_performance_now = performance_now;\n\t\t\tthis.setTime(newTime, false);\n\t\t\tthis.setFrame(this._frame + 1, false);\n\t\t} else {\n\t\t\tthis.setFrame(this.frame() + 1);\n\t\t}\n\t}\n\n\tprivate _ensureFrameWithinBounds(frame: number): number {\n\t\tif (this._playing) {\n\t\t\tif (this._maxFrameLocked && frame > this._maxFrame) {\n\t\t\t\treturn TimeController.START_FRAME;\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._maxFrameLocked && frame > this._maxFrame) {\n\t\t\t\treturn this._maxFrame;\n\t\t\t}\n\t\t\tif (frame < TimeController.START_FRAME) {\n\t\t\t\treturn TimeController.START_FRAME;\n\t\t\t}\n\t\t}\n\t\treturn frame;\n\t}\n\tplaying() {\n\t\treturn this._playing === true;\n\t}\n\tpause() {\n\t\tif (this._playing == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis._playing = false;\n\t\t// TODO: try and unify the dispatch controller and events dispatcher\n\t\tthis.scene.dispatchController.dispatch(this._graphNode, SceneEvent.PLAY_STATE_UPDATED);\n\t\tthis.scene.actorsManager.runOnEventScenePause();\n\t\tthis.scene.eventsDispatcher.sceneEventsController.dispatch(SCENE_EVENT_PAUSE_EVENT_CONTEXT);\n\t\tfor (const callback of this._onPlayingStateChangeCallbacks) {\n\t\t\tcallback();\n\t\t}\n\t}\n\tplay() {\n\t\tif (!this._playAllowedWithoutAllNodesCooked) {\n\t\t\tif (!this.scene.cookController.allNodesHaveCookedAtLeastOnce()) {\n\t\t\t\tPoly.warn('play not allowed, some nodes have not completed cooking');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (this._playing == true) {\n\t\t\treturn;\n\t\t}\n\t\tthis._playing = true;\n\t\tthis.scene.actorsManager.runOnEventScenePlay();\n\t\tthis.scene.dispatchController.dispatch(this._graphNode, SceneEvent.PLAY_STATE_UPDATED);\n\t\tthis.scene.eventsDispatcher.sceneEventsController.dispatch(SCENE_EVENT_PLAY_EVENT_CONTEXT);\n\t\tfor (const callback of this._onPlayingStateChangeCallbacks) {\n\t\t\tcallback();\n\t\t}\n\t}\n\ttogglePlayPause() {\n\t\tif (this.playing()) {\n\t\t\tthis.pause();\n\t\t} else {\n\t\t\tthis.play();\n\t\t}\n\t}\n\tprivate _playAllowedWithoutAllNodesCooked = true;\n\tforbidPlayUntilAllNodesCooked() {\n\t\tthis._playAllowedWithoutAllNodesCooked = false;\n\t}\n\n\t//\n\t//\n\t// CALLBACKS\n\t//\n\t//\n\tprivate _onBeforeTickCallbacksMap: onTimeTickCallbacksMap | undefined;\n\tprivate _onAfterTickCallbacksMap: onTimeTickCallbacksMap | undefined;\n\tprivate _onPlayingStateChangeCallbacksMap: Set<onPlayingStateChangeCallback> | undefined;\n\tprivate _onBeforeTickCallbacks: Array<onTimeTickHook> = [];\n\tprivate _onAfterTickCallbacks: Array<onTimeTickHook> = [];\n\tprivate _onPlayingStateChangeCallbacks: Array<onPlayingStateChangeCallback> = [];\n\n\tregisterOnBeforeTick(callbackName: string, callback: onTimeTickHook) {\n\t\tthis._registerCallback(callbackName, callback, this.registeredBeforeTickCallbacks());\n\t}\n\tunRegisterOnBeforeTick(callbackName: string) {\n\t\tthis._unregisterCallback(callbackName, this._onBeforeTickCallbacksMap);\n\t}\n\tregisteredBeforeTickCallbacks() {\n\t\treturn (this._onBeforeTickCallbacksMap = this._onBeforeTickCallbacksMap || new Map());\n\t}\n\thasBeforeTickCallback(callbackName: string): boolean {\n\t\treturn this._onBeforeTickCallbacksMap?.has(callbackName) || false;\n\t}\n\tregisterOnAfterTick(callbackName: string, callback: onTimeTickHook) {\n\t\tthis._registerCallback(callbackName, callback, this.registeredAfterTickCallbacks());\n\t}\n\tunRegisterOnAfterTick(callbackName: string) {\n\t\tthis._unregisterCallback(callbackName, this._onAfterTickCallbacksMap);\n\t}\n\tregisteredAfterTickCallbacks() {\n\t\treturn (this._onAfterTickCallbacksMap = this._onAfterTickCallbacksMap || (new Map() as onTimeTickCallbacksMap));\n\t}\n\thasAfterTickCallback(callbackName: string): boolean {\n\t\treturn this._onAfterTickCallbacksMap?.has(callbackName) || false;\n\t}\n\tonPlayingStateChange(callback: onPlayingStateChangeCallback) {\n\t\tthis._onPlayingStateChangeCallbacksMap = this._onPlayingStateChangeCallbacksMap || new Set();\n\t\tthis._onPlayingStateChangeCallbacksMap.add(callback);\n\t\tthis._updateOnPlayingStateChangeCallbacks();\n\t}\n\tremoveOnPlayingStateChange(callback: onPlayingStateChangeCallback) {\n\t\tif (this._onPlayingStateChangeCallbacksMap) {\n\t\t\tthis._onPlayingStateChangeCallbacksMap.delete(callback);\n\t\t\tthis._updateOnPlayingStateChangeCallbacks();\n\t\t}\n\t}\n\tprivate _updateOnPlayingStateChangeCallbacks() {\n\t\tthis._onPlayingStateChangeCallbacks = [];\n\t\tif (this._onPlayingStateChangeCallbacksMap) {\n\t\t\tthis._onPlayingStateChangeCallbacksMap.forEach((callback) => {\n\t\t\t\tthis._onPlayingStateChangeCallbacks.push(callback);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _registerCallback<C extends onTimeTickHook>(\n\t\tcallbackName: string,\n\t\tcallback: C,\n\t\tmap: onTimeTickCallbacksMap\n\t) {\n\t\tif (map.has(callbackName)) {\n\t\t\tconsole.warn(`callback ${callbackName} already registered`);\n\t\t\treturn;\n\t\t}\n\t\tmap.set(callbackName, callback);\n\t\tthis._updateCallbacks();\n\t}\n\tprivate _unregisterCallback(callbackName: string, map?: onTimeTickCallbacksMap) {\n\t\tif (!map) {\n\t\t\treturn;\n\t\t}\n\t\tmap.delete(callbackName);\n\t\tthis._updateCallbacks();\n\t}\n\tprivate _updateCallbacks() {\n\t\tthis._onBeforeTickCallbacks.length = 0;\n\t\tthis._onBeforeTickCallbacksMap?.forEach((callback) => {\n\t\t\tthis._onBeforeTickCallbacks.push(callback);\n\t\t});\n\t\tthis._onAfterTickCallbacks.length = 0;\n\t\tthis._onAfterTickCallbacksMap?.forEach((callback) => {\n\t\t\tthis._onAfterTickCallbacks.push(callback);\n\t\t});\n\t}\n}\n","import type {Ref} from '@vue/reactivity';\nimport {Intersection, Material, Object3D} from 'three';\nimport {ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {MouseButton, MouseButtons} from '../../../../../core/MouseButton';\nimport {TypeAssert} from '../../../../poly/Assert';\n\nexport interface PriorityOptions {\n\tblockObjectsBehind: boolean;\n\tskipIfObjectsInFront: boolean;\n}\nexport interface CPUOptions {\n\ttraverseChildren: boolean;\n\tpointsThreshold: number;\n\tlineThreshold: number;\n\tintersectionRef: Ref<Intersection | null>;\n}\nexport interface GPUOptions {\n\t// if a worldPosMaterial is given, we use it and only need a single render call.\n\t// if not, we render need 2 renders, 1 to write to the depth buffer and another to read it (in addition to readRenderTargetPixels)\n\tworldPosMaterial: Material | null;\n\tdistanceRef: Ref<number>;\n}\nexport interface ObjectOptions {\n\tpriority: PriorityOptions;\n\tcpu?: CPUOptions;\n\tgpu?: GPUOptions;\n}\nexport interface EmptyOptions {}\n\nexport function hasCPUOptions(optionsList: ObjectOptions[]): boolean {\n\tfor (const options of optionsList) {\n\t\tif (options.cpu != null) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nexport function hasGPUOptions(optionsList: ObjectOptions[]): boolean {\n\tfor (const options of optionsList) {\n\t\tif (options.gpu != null) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nexport function GPUOptionsDepthBufferRequired(optionsList: ObjectOptions[]): boolean {\n\tfor (const options of optionsList) {\n\t\tif (options.gpu != null && options.gpu.worldPosMaterial == null) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nfunction _cpuOptionsEqual(options1: CPUOptions, options2: CPUOptions): boolean {\n\treturn (\n\t\toptions1.traverseChildren == options2.traverseChildren &&\n\t\toptions1.pointsThreshold == options2.pointsThreshold &&\n\t\toptions1.lineThreshold == options2.lineThreshold\n\t);\n}\n\nexport function CPUOptionsEqual(optionsList: ObjectOptions[]): boolean {\n\tlet firstCPUOptions: CPUOptions | undefined;\n\tfor (const options of optionsList) {\n\t\tif (options.cpu != null) {\n\t\t\tif (firstCPUOptions == null) {\n\t\t\t\tfirstCPUOptions = options.cpu;\n\t\t\t} else {\n\t\t\t\tif (!_cpuOptionsEqual(firstCPUOptions, options.cpu)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nexport function CPUOptionsMax(optionsList: ObjectOptions[], target: CPUOptions): CPUOptions {\n\ttarget.traverseChildren = false;\n\ttarget.pointsThreshold = -1;\n\ttarget.lineThreshold = -1;\n\tfor (const options of optionsList) {\n\t\tif (options.cpu != null) {\n\t\t\tif (target.traverseChildren == false && options.cpu.traverseChildren == true) {\n\t\t\t\ttarget.traverseChildren = options.cpu.traverseChildren;\n\t\t\t}\n\t\t\tif (target.pointsThreshold < options.cpu.pointsThreshold) {\n\t\t\t\ttarget.pointsThreshold = options.cpu.pointsThreshold;\n\t\t\t}\n\t\t\tif (target.lineThreshold < options.cpu.lineThreshold) {\n\t\t\t\ttarget.lineThreshold = options.cpu.lineThreshold;\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n}\n\nexport enum Status {\n\tREQUIRED = 0, //'required',\n\tOPTIONAL = 1, //'optional',\n\tFORBIDDEN = 2, //'forbidden',\n}\nexport const STATUS_OPTIONS: Status[] = [Status.REQUIRED, Status.OPTIONAL, Status.FORBIDDEN];\nexport const STATUS_OPTION_LABEL: string[] = ['required', 'optional', 'forbidden'];\nexport const DEFAULT_STATUS_OPTION = STATUS_OPTIONS.indexOf(Status.OPTIONAL);\nexport const STATUS_MENU_OPTIONS = {\n\tmenu: {\n\t\tentries: STATUS_OPTIONS.map((value) => ({\n\t\t\tvalue,\n\t\t\tname: STATUS_OPTION_LABEL[value],\n\t\t})),\n\t},\n};\nexport interface ButtonOptions {\n\tleft: boolean;\n\tmiddle: boolean;\n\tright: boolean;\n}\nexport interface ButtonsOptions {\n\tleft: Status;\n\tmiddle: Status;\n\tright: Status;\n}\nexport interface ModifierOptions {\n\tctrl: Status;\n\tshift: Status;\n\talt: Status;\n}\n// export interface ModifierIndexOptions {\n// \tctrl: number;\n// \tshift: number;\n// \talt: number;\n// }\n// export function modifierIndexToModifierOptions(options: ModifierIndexOptions): ModifierOptions {\n// \treturn {\n// \t\tctrl: POINTER_EVENT_MODIFIER_OPTIONS[options.ctrl],\n// \t\tshift: POINTER_EVENT_MODIFIER_OPTIONS[options.shift],\n// \t\talt: POINTER_EVENT_MODIFIER_OPTIONS[options.alt],\n// \t};\n// }\nexport interface ButtonAndModifierOptions {\n\tbutton: ButtonOptions;\n\tmodifier: ModifierOptions;\n}\nexport interface ButtonsAndModifierOptions {\n\tbutton: ButtonsOptions;\n\tmodifier: ModifierOptions;\n}\nexport interface OnlyModifierOptions {\n\tmodifier: ModifierOptions;\n}\n// export interface ButtonAndModifierIndexOptions {\n// \tbutton: ButtonOptions;\n// \tmodifier: ModifierIndexOptions;\n// }\nexport interface ButtonAndModifierOptionsAsString {\n\tbutton: ConvertToStrings<ButtonOptions>;\n\tmodifier: ConvertToStrings<ModifierOptions>;\n}\nexport interface ButtonsAndModifierOptionsAsString {\n\tbutton: ConvertToStrings<ButtonsOptions>;\n\tmodifier: ConvertToStrings<ModifierOptions>;\n}\nexport interface ModifierOptionsAsString {\n\tmodifier: ConvertToStrings<ModifierOptions>;\n}\n\ninterface PropertyWithButtonConfig {\n\tconfig: ButtonAndModifierOptions;\n}\ninterface PropertyWithButtonsConfig {\n\tconfig: ButtonsAndModifierOptions;\n}\ninterface PropertyWithModifierConfig {\n\tconfig: OnlyModifierOptions;\n}\nexport interface ButtonConfig {\n\tbutton: MouseButton;\n\tctrl: boolean;\n\tshift: boolean;\n\talt: boolean;\n}\nexport interface ButtonsConfig {\n\tbuttons: MouseButtons;\n\tctrl: boolean;\n\tshift: boolean;\n\talt: boolean;\n}\nfunction statusMatch(modifierProperty: Status, value: boolean): boolean {\n\tswitch (modifierProperty) {\n\t\tcase Status.REQUIRED: {\n\t\t\treturn value == true;\n\t\t}\n\t\tcase Status.OPTIONAL: {\n\t\t\treturn true;\n\t\t}\n\t\tcase Status.FORBIDDEN: {\n\t\t\treturn value == false;\n\t\t}\n\t}\n\tTypeAssert.unreachable(modifierProperty);\n}\nexport function propertyMatchesModifiersConfig(\n\tpropertyConfig: OnlyModifierOptions,\n\tbuttonsConfig: ButtonsConfig | ButtonConfig\n) {\n\treturn (\n\t\tstatusMatch(propertyConfig.modifier.ctrl, buttonsConfig.ctrl) &&\n\t\tstatusMatch(propertyConfig.modifier.shift, buttonsConfig.shift) &&\n\t\tstatusMatch(propertyConfig.modifier.alt, buttonsConfig.alt)\n\t);\n}\nexport function propertyMatchesButtonConfig(propertyConfig: ButtonAndModifierOptions, buttonConfig: ButtonConfig) {\n\tswitch (buttonConfig.button) {\n\t\tcase MouseButton.LEFT: {\n\t\t\tif (propertyConfig.button.left == false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButton.MIDDLE: {\n\t\t\tif (propertyConfig.button.middle == false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButton.RIGHT: {\n\t\t\tif (propertyConfig.button.right == false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn propertyMatchesModifiersConfig(propertyConfig, buttonConfig);\n}\n\nexport function propertyMatchesButtonsConfig(propertyConfig: ButtonsAndModifierOptions, buttonsConfig: ButtonsConfig) {\n\tswitch (buttonsConfig.buttons) {\n\t\tcase MouseButtons.LEFT: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.middle == Status.REQUIRED ||\n\t\t\t\tpropertyConfig.button.right == Status.REQUIRED\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButtons.MIDDLE: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.REQUIRED ||\n\t\t\t\tpropertyConfig.button.middle == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.right == Status.REQUIRED\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButtons.RIGHT: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.REQUIRED ||\n\t\t\t\tpropertyConfig.button.middle == Status.REQUIRED ||\n\t\t\t\tpropertyConfig.button.right == Status.FORBIDDEN\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButtons.LEFT_RIGHT: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.middle == Status.REQUIRED ||\n\t\t\t\tpropertyConfig.button.right == Status.FORBIDDEN\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButtons.LEFT_MIDDLE: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.middle == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.right == Status.REQUIRED\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButtons.MIDDLE_RIGHT: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.REQUIRED ||\n\t\t\t\tpropertyConfig.button.middle == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.right == Status.FORBIDDEN\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase MouseButtons.LEFT_MIDDLE_RIGHT: {\n\t\t\tif (\n\t\t\t\tpropertyConfig.button.left == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.middle == Status.FORBIDDEN ||\n\t\t\t\tpropertyConfig.button.right == Status.FORBIDDEN\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn propertyMatchesModifiersConfig(propertyConfig, buttonsConfig);\n}\nfunction propertiesMatchesButtonConfig(\n\tpropertiesList: PropertyWithButtonConfig[],\n\tbuttonConfig: ButtonConfig\n): boolean {\n\tfor (const properties of propertiesList) {\n\t\tif (propertyMatchesButtonConfig(properties.config, buttonConfig)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nfunction propertiesMatchesButtonsConfig(\n\tpropertiesList: PropertyWithButtonsConfig[],\n\tbuttonConfig: ButtonsConfig\n): boolean {\n\tfor (const properties of propertiesList) {\n\t\tif (propertyMatchesButtonsConfig(properties.config, buttonConfig)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nfunction propertiesMatchesModifiersConfig(\n\tpropertiesList: PropertyWithModifierConfig[],\n\tbuttonConfig: ButtonsConfig\n): boolean {\n\tfor (const properties of propertiesList) {\n\t\tif (propertyMatchesModifiersConfig(properties.config, buttonConfig)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function buttonConfigFromEvent(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, target: ButtonConfig) {\n\ttarget.button = (event as PointerEvent).button || MouseButton.LEFT;\n\ttarget.ctrl = event.ctrlKey;\n\ttarget.shift = event.shiftKey;\n\ttarget.alt = event.altKey;\n}\nexport function buttonsConfigFromEvent(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, target: ButtonsConfig) {\n\ttarget.buttons = (event as MouseEvent).buttons || MouseButtons.LEFT;\n\ttarget.ctrl = event.ctrlKey;\n\ttarget.shift = event.shiftKey;\n\ttarget.alt = event.altKey;\n}\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\nconst _buttonsConfig: ButtonsConfig = {buttons: MouseButtons.LEFT, ctrl: false, shift: false, alt: false};\nexport function filterObjectsWithMatchButtonConfig(\n\tevent: Readonly<PointerEvent | MouseEvent | TouchEvent>,\n\tobjects: Object3D[],\n\tpropertiesListByObject: Map<Object3D, PropertyWithButtonConfig[]>,\n\ttarget: Object3D[]\n) {\n\ttarget.length = 0;\n\tbuttonConfigFromEvent(event, _buttonConfig);\n\tfor (const object of objects) {\n\t\tconst propertiesList = propertiesListByObject.get(object);\n\t\tif (propertiesList) {\n\t\t\tif (propertiesMatchesButtonConfig(propertiesList, _buttonConfig)) {\n\t\t\t\ttarget.push(object);\n\t\t\t}\n\t\t}\n\t}\n}\nexport function filterObjectsWithMatchButtonsConfig(\n\tevent: Readonly<PointerEvent | MouseEvent | TouchEvent>,\n\tobjects: Object3D[],\n\tpropertiesListByObject: Map<Object3D, PropertyWithButtonsConfig[]>,\n\ttarget: Object3D[]\n) {\n\ttarget.length = 0;\n\tbuttonsConfigFromEvent(event, _buttonsConfig);\n\tfor (const object of objects) {\n\t\tconst propertiesList = propertiesListByObject.get(object);\n\t\tif (propertiesList) {\n\t\t\tif (propertiesMatchesButtonsConfig(propertiesList, _buttonsConfig)) {\n\t\t\t\ttarget.push(object);\n\t\t\t}\n\t\t}\n\t}\n}\nexport function filterObjectsWithMatchModifiersConfig(\n\tevent: Readonly<PointerEvent | MouseEvent | TouchEvent>,\n\tobjects: Object3D[],\n\tpropertiesListByObject: Map<Object3D, PropertyWithModifierConfig[]>,\n\ttarget: Object3D[]\n) {\n\ttarget.length = 0;\n\tbuttonsConfigFromEvent(event, _buttonsConfig);\n\tfor (const object of objects) {\n\t\tconst propertiesList = propertiesListByObject.get(object);\n\t\tif (propertiesList) {\n\t\t\tif (propertiesMatchesModifiersConfig(propertiesList, _buttonsConfig)) {\n\t\t\t\ttarget.push(object);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {Constructor, ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tButtonAndModifierOptions,\n\t// ButtonAndModifierIndexOptions,\n\tButtonAndModifierOptionsAsString,\n\tfilterObjectsWithMatchButtonConfig,\n\tpropertyMatchesButtonConfig,\n\tButtonConfig,\n\tbuttonConfigFromEvent,\n\t// modifierIndexToModifierOptions,\n} from './Common';\nimport {ParamConfig} from '../../../../nodes/utils/params/ParamsConfig';\nimport {MouseButton} from '../../../../../core/MouseButton';\nimport {CursorMoveMonitor} from '../../../../../core/CursorMoveMonitor';\n\ninterface ClickOptions {\n\tmaxCursorMoveDistance: number;\n\tmaxDuration: number;\n\tcallback: () => void;\n}\n\nexport interface ObjectToClickOptions extends ObjectOptions {\n\tclick: ClickOptions;\n\tconfig: ButtonAndModifierOptions;\n}\n// export interface ObjectToClickIndexOptions extends ObjectOptions {\n// \tclick: ClickOptions;\n// \tconfig: ButtonAndModifierIndexOptions;\n// }\nexport interface ObjectToClickOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tclick: ConvertToStrings<ClickOptions>;\n\tconfig: ButtonAndModifierOptionsAsString;\n}\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\n\nfunction hasPropertiesWithCursorMoveLessThan(options: ObjectToClickOptions[], distance: number) {\n\tfor (const option of options) {\n\t\tif (distance < option.click.maxCursorMoveDistance) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function ClickParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param max cursor move distance */\n\t\tmaxCursorMoveDistance = ParamConfig.FLOAT(0.05, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param max duration */\n\t\tmaxDuration = ParamConfig.INTEGER(200, {\n\t\t\trange: [0, 1000],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\n\nexport class RayObjectIntersectionsClickController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToClickOptions[]> = new Map();\n\tprotected _intersectedStateOnPointerdownByObject: Map<Object3D, boolean> = new Map();\n\tprotected _intersectedStateOnPointerupByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\tprivate _objectsIntersectedOnPointerdown: Object3D[] = [];\n\tprivate _cursorMoveMonitor = new CursorMoveMonitor();\n\tprivate _pointerdownEvent: Readonly<PointerEvent | MouseEvent | TouchEvent> | undefined;\n\tprivate _pointerdownReceivedAt: number = 0;\n\n\tprivate _bound = {\n\t\tpointerup: this._onPointerup.bind(this),\n\t};\n\tonPointerdown(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tthis._pointerdownEvent = event;\n\t\tthis._pointerdownReceivedAt = performance.now();\n\t\tif (this._objects.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tfilterObjectsWithMatchButtonConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tdocument.addEventListener('pointerup', this._bound.pointerup);\n\t\t// we also need touchend, as pointerup appears to not be triggered if the cursor has moved a little bit\n\t\tdocument.addEventListener('touchend', this._bound.pointerup);\n\t\tthis._cursorMoveMonitor.addPointermoveEventListener(\n\t\t\tthis._scene.eventsDispatcher.pointerEventsController.cursor()\n\t\t);\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateOnPointerdownByObject);\n\t}\n\n\tprivate _onPointerup() {\n\t\tdocument.removeEventListener('pointerup', this._bound.pointerup);\n\t\tdocument.removeEventListener('touchend', this._bound.pointerup);\n\t\tthis._cursorMoveMonitor.removeEventListener();\n\t\tconst event = this._pointerdownEvent;\n\t\tif (!event) {\n\t\t\treturn;\n\t\t}\n\t\tthis._pointerdownEvent = undefined;\n\t\tconst duration = performance.now() - this._pointerdownReceivedAt;\n\n\t\tconst movedCursorDistance = this._cursorMoveMonitor.movedCursorDistance();\n\n\t\tconst objects = this._objectsMatchingEventConfig;\n\t\tthis._objectsIntersectedOnPointerdown.length = 0;\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList && hasPropertiesWithCursorMoveLessThan(propertiesList, movedCursorDistance)) {\n\t\t\t\tconst isIntersectingOnPointerdown = this._intersectedStateOnPointerdownByObject.get(object);\n\t\t\t\tif (isIntersectingOnPointerdown) {\n\t\t\t\t\tthis._objectsIntersectedOnPointerdown.push(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// I've considered using only the objects intersected in pointerdown for the pointerup detection,\n\t\t// but that prevents missed objects from occluding others if they are in front.\n\t\t// We therefore need to run the detection on all objects\n\t\t// instead, we can still optimise by not detecting anything if that list is empty\n\t\tif (this._objectsIntersectedOnPointerdown.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis._setIntersectedState(objects, this._intersectedStateOnPointerupByObject);\n\t\tbuttonConfigFromEvent(event, _buttonConfig);\n\n\t\tconst objectsIntersectedOnPointerdown = this._objectsIntersectedOnPointerdown;\n\t\tfor (const object of objectsIntersectedOnPointerdown) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersectingOnPointerup = this._intersectedStateOnPointerupByObject.get(object);\n\t\t\t\tif (isIntersectingOnPointerup == true) {\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmovedCursorDistance < properties.click.maxCursorMoveDistance &&\n\t\t\t\t\t\t\tduration < properties.click.maxDuration &&\n\t\t\t\t\t\t\tpropertyMatchesButtonConfig(properties.config, _buttonConfig)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tproperties.click.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {Constructor, ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tButtonConfig,\n\tbuttonConfigFromEvent,\n\tModifierOptionsAsString,\n\tfilterObjectsWithMatchModifiersConfig,\n\tOnlyModifierOptions,\n\tpropertyMatchesModifiersConfig,\n} from './Common';\nimport {MouseButton} from '../../../../../core/MouseButton';\n\ninterface DoubleClickOptions {\n\tcallback: () => void;\n}\n\nexport interface ObjectToClickOptions extends ObjectOptions {\n\tdoubleClick: DoubleClickOptions;\n\tconfig: OnlyModifierOptions;\n}\n\nexport interface ObjectToDoubleClickOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tdoubleClick: ConvertToStrings<DoubleClickOptions>;\n\tconfig: ModifierOptionsAsString;\n}\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\n\nexport function DoubleClickParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {};\n}\n\nexport class RayObjectIntersectionsDoubleClickController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToClickOptions[]> = new Map();\n\tprotected _intersectedStateOnDoubleClickByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\n\tonDoubleClick(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tif (this._objects.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tfilterObjectsWithMatchModifiersConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateOnDoubleClickByObject);\n\n\t\tbuttonConfigFromEvent(event, _buttonConfig);\n\n\t\tfor (const object of this._objectsMatchingEventConfig) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersectingOnDoubleClick = this._intersectedStateOnDoubleClickByObject.get(object);\n\t\t\t\tif (isIntersectingOnDoubleClick == true) {\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (propertyMatchesModifiersConfig(properties.config, _buttonConfig)) {\n\t\t\t\t\t\t\tproperties.doubleClick.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Object3D} from 'three';\nimport {Constructor, ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tButtonAndModifierOptions,\n\tButtonAndModifierOptionsAsString,\n\tfilterObjectsWithMatchButtonConfig,\n\tButtonConfig,\n\tbuttonConfigFromEvent,\n\tpropertyMatchesButtonConfig,\n} from './Common';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {ParamConfig} from '../../../../nodes/utils/params/ParamsConfig';\nimport {MouseButton} from '../../../../../core/MouseButton';\nimport {CursorMoveMonitor} from '../../../../../core/CursorMoveMonitor';\n\ninterface LongPressOptions {\n\tduration: number;\n\tmaxCursorMoveDistance: number;\n\tcallback: () => void;\n}\nexport interface ObjectToLongPressOptions extends ObjectOptions {\n\tlongPress: LongPressOptions;\n\tconfig: ButtonAndModifierOptions;\n}\nexport interface ObjectToLongPressOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tlongPress: ConvertToStrings<LongPressOptions>;\n\tconfig: ButtonAndModifierOptionsAsString;\n}\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\nexport const DEFAULT_LONG_PRESS_DURATION = 500;\n\nfunction hasPropertiesWithCursorMoveLessThan(options: ObjectToLongPressOptions[], distance: number) {\n\tfor (const option of options) {\n\t\tif (distance < option.longPress.maxCursorMoveDistance) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nexport const DEFAULT_MAX_CURSOR_MOVE_DISTANCE = 0.05;\n\nexport function LongPressParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param press duration (in milliseconds) */\n\t\tduration = ParamConfig.INTEGER(DEFAULT_LONG_PRESS_DURATION, {\n\t\t\trange: [0, 1000],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param max cursor move distance */\n\t\tmaxCursorMoveDistance = ParamConfig.FLOAT(DEFAULT_MAX_CURSOR_MOVE_DISTANCE, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\n\nexport class RayObjectIntersectionsLongPressController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToLongPressOptions[]> = new Map();\n\tprotected _intersectedStateOnPointerdownByObject: Map<Object3D, boolean> = new Map();\n\tprotected _intersectedStateOnTimeoutByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\tprotected _objectsByLongPressDuration: Map<number, Object3D[]> = new Map();\n\tprivate _timerByDuration: Map<number, number> = new Map();\n\tprivate _cursorMoveMonitor = new CursorMoveMonitor();\n\n\tprivate _bound = {\n\t\tpointerup: this._onPointerup.bind(this),\n\t\t// pointermove: this._onPointermove.bind(this),\n\t};\n\tonPointerdown(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tif (this._objects.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tfilterObjectsWithMatchButtonConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocument.addEventListener('pointerup', this._bound.pointerup);\n\t\t// we also need touchend, as pointerup appears to not be triggered if the cursor has moved a little bit\n\t\tdocument.addEventListener('touchend', this._bound.pointerup);\n\t\tthis._cursorMoveMonitor.addPointermoveEventListener(\n\t\t\tthis._scene.eventsDispatcher.pointerEventsController.cursor()\n\t\t);\n\n\t\tthis._objectsByLongPressDuration.clear();\n\t\tthis._timerByDuration.clear();\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateOnPointerdownByObject);\n\n\t\tconst _groupIntersectedObjectsByDuration = () => {\n\t\t\tconst objects = this._objects;\n\n\t\t\tfor (const object of objects) {\n\t\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\t\tif (propertiesList) {\n\t\t\t\t\tconst isIntersecting = this._intersectedStateOnPointerdownByObject.get(object);\n\t\t\t\t\tif (isIntersecting == true) {\n\t\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\t\tpushOnArrayAtEntry(this._objectsByLongPressDuration, properties.longPress.duration, object);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t_groupIntersectedObjectsByDuration();\n\t\tbuttonConfigFromEvent(event, _buttonConfig);\n\n\t\tthis._objectsByLongPressDuration.forEach((objects, duration) => {\n\t\t\tconst wrappedTriggeredMethod = () => {\n\t\t\t\tconst movedCursorDistance = this._cursorMoveMonitor.movedCursorDistance();\n\t\t\t\tthis._timerByDuration.delete(duration);\n\t\t\t\tthis._setIntersectedState(this._objects, this._intersectedStateOnTimeoutByObject);\n\n\t\t\t\tfor (const object of objects) {\n\t\t\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\t\t\tif (propertiesList && hasPropertiesWithCursorMoveLessThan(propertiesList, movedCursorDistance)) {\n\t\t\t\t\t\tconst isIntersecting = this._intersectedStateOnTimeoutByObject.get(object);\n\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tmovedCursorDistance < properties.longPress.maxCursorMoveDistance &&\n\t\t\t\t\t\t\t\t\tpropertyMatchesButtonConfig(properties.config, _buttonConfig)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tproperties.longPress.callback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst timer = setTimeout(wrappedTriggeredMethod, duration) as any as number;\n\n\t\t\tthis._timerByDuration.set(duration, timer);\n\t\t});\n\t}\n\n\tprivate _onPointerup() {\n\t\tdocument.removeEventListener('pointerup', this._bound.pointerup);\n\t\tdocument.removeEventListener('touchend', this._bound.pointerup);\n\t\tthis._cursorMoveMonitor.removeEventListener();\n\t\tthis._timerByDuration.forEach((timer, duration) => {\n\t\t\tclearTimeout(timer);\n\t\t});\n\t\tthis._timerByDuration.clear();\n\t}\n}\n","import {Object3D, Vector2} from 'three';\nimport {Constructor, ConvertToStrings} from '../../../../../types/GlobalTypes';\nimport {radToDeg} from '../../../../../core/math/_Module';\nimport {BaseRayObjectIntersectionsController} from './_BaseRayObjectIntersectionsController';\nimport {\n\tObjectOptions,\n\tGPUOptions,\n\tCPUOptions,\n\tPriorityOptions,\n\tfilterObjectsWithMatchButtonConfig,\n\tButtonAndModifierOptions,\n\tButtonAndModifierOptionsAsString,\n\tButtonConfig,\n\tbuttonConfigFromEvent,\n\tpropertyMatchesButtonConfig,\n} from './Common';\nimport {ParamConfig} from '../../../../nodes/utils/params/ParamsConfig';\nimport {MouseButton} from '../../../../../core/MouseButton';\n\ninterface SwipeOptions {\n\tangle: number;\n\tangleMargin: number;\n\tminDistance: number;\n\tcallback: () => void;\n}\nexport interface ObjectToSwipeOptions extends ObjectOptions {\n\tswipe: SwipeOptions;\n\tconfig: ButtonAndModifierOptions;\n}\nexport interface ObjectToSwipeOptionsAsString {\n\tpriority: ConvertToStrings<PriorityOptions>;\n\tcpu?: ConvertToStrings<CPUOptions>;\n\tgpu?: ConvertToStrings<GPUOptions>;\n\tswipe: ConvertToStrings<SwipeOptions>;\n\tconfig: ButtonAndModifierOptionsAsString;\n}\n\nconst _tmp = new Vector2();\nconst _buttonConfig: ButtonConfig = {button: MouseButton.LEFT, ctrl: false, shift: false, alt: false};\nfunction degAngle(radians: number) {\n\tif (radians > Math.PI) {\n\t\tradians -= Math.PI * 2;\n\t}\n\treturn radToDeg(radians);\n}\nexport const ANGLE_DEGREES = {\n\tLEFT: degAngle(_tmp.set(-1, 0).angle()),\n\tRIGHT: degAngle(_tmp.set(1, 0).angle()),\n\tUP: degAngle(_tmp.set(0, 1).angle()),\n\tDOWN: degAngle(_tmp.set(0, -1).angle()),\n};\nconst DEFAULT_MIN_CURSOR_MOVE_DISTANCE = 0.05;\n\nexport function SwipeParamConfig<TBase extends Constructor>(Base: TBase) {\n\treturn class Mixin extends Base {\n\t\t/** @param angle */\n\t\tangle = ParamConfig.FLOAT(0, {\n\t\t\trange: [-180, 180],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param angle margin */\n\t\tangleMargin = ParamConfig.FLOAT(45, {\n\t\t\trange: [0, 180],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t\t/** @param min distance */\n\t\tminDistance = ParamConfig.FLOAT(DEFAULT_MIN_CURSOR_MOVE_DISTANCE, {\n\t\t\trange: [0, 1],\n\t\t\trangeLocked: [true, false],\n\t\t});\n\t};\n}\n\nfunction optionsContainsAngle(options: SwipeOptions, angle: number) {\n\treturn angle >= options.angle - options.angleMargin && angle <= options.angle + options.angleMargin;\n}\nconst _cursorDelta = new Vector2();\nexport class RayObjectIntersectionsSwipeController extends BaseRayObjectIntersectionsController {\n\tprotected override _propertiesListByObject: Map<Object3D, ObjectToSwipeOptions[]> = new Map();\n\tprotected _intersectedStateOnPointerdownByObject: Map<Object3D, boolean> = new Map();\n\tprotected _intersectedStateOnPointerupByObject: Map<Object3D, boolean> = new Map();\n\tprivate _objectsMatchingEventConfig: Object3D[] = [];\n\tprivate _objectsIntersectedOnPointerdown: Object3D[] = [];\n\tprivate _cursorOnPointerdown = new Vector2();\n\tprivate _cursorOnPointerup = new Vector2();\n\tprivate _pointerdownEvent: Readonly<PointerEvent | MouseEvent | TouchEvent> | undefined;\n\n\tprivate _bound = {\n\t\tpointerup: this._onPointerup.bind(this),\n\t};\n\tonPointerdown(event: Readonly<PointerEvent | MouseEvent | TouchEvent>) {\n\t\tthis._pointerdownEvent = event;\n\t\tif (this._objects.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tfilterObjectsWithMatchButtonConfig(\n\t\t\tevent,\n\t\t\tthis._objects,\n\t\t\tthis._propertiesListByObject,\n\t\t\tthis._objectsMatchingEventConfig\n\t\t);\n\t\tif (this._objectsMatchingEventConfig.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocument.addEventListener('pointerup', this._bound.pointerup);\n\t\t// we also need touchend, as pointerup appears to not be triggered once the cursor has moved\n\t\tdocument.addEventListener('touchend', this._bound.pointerup);\n\t\tthis._setIntersectedState(this._objectsMatchingEventConfig, this._intersectedStateOnPointerdownByObject);\n\t\tthis._getCursor(this._cursorOnPointerdown);\n\t}\n\tprivate _onPointerup(_event: Event) {\n\t\tdocument.removeEventListener('pointerup', this._bound.pointerup);\n\t\tdocument.removeEventListener('touchend', this._bound.pointerup);\n\t\tconst event = this._pointerdownEvent;\n\t\tif (!event) {\n\t\t\treturn;\n\t\t}\n\t\tthis._pointerdownEvent = undefined;\n\n\t\tconst objects = this._objects;\n\t\tthis._objectsIntersectedOnPointerdown.length = 0;\n\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersectingOnPointerdown = this._intersectedStateOnPointerdownByObject.get(object);\n\t\t\t\tif (isIntersectingOnPointerdown) {\n\t\t\t\t\tthis._objectsIntersectedOnPointerdown.push(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// I've considered using only the objects intersected in pointerdown for the pointerup detection,\n\t\t// but that prevents missed objects from occluding others if they are in front.\n\t\t// We therefore need to run the detection on all objects\n\t\t// instead, we can still optimise by not detecting anything if that list is empty\n\t\tif (this._objectsIntersectedOnPointerdown.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// check swipe angle\n\t\tthis._getCursor(this._cursorOnPointerup);\n\t\t_cursorDelta.copy(this._cursorOnPointerup).sub(this._cursorOnPointerdown);\n\t\tlet radians = _cursorDelta.angle();\n\t\tconst degrees = degAngle(radians);\n\t\tconst distance = _cursorDelta.manhattanLength();\n\n\t\t//\n\t\tthis._setIntersectedState(objects, this._intersectedStateOnPointerupByObject);\n\t\tbuttonConfigFromEvent(event, _buttonConfig);\n\t\tconst objectsIntersectedOnPointerdown = this._objectsIntersectedOnPointerdown;\n\t\tfor (const object of objectsIntersectedOnPointerdown) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tconst isIntersectingOnPointerup = this._intersectedStateOnPointerupByObject.get(object);\n\t\t\t\tif (isIntersectingOnPointerup == true) {\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdistance > properties.swipe.minDistance &&\n\t\t\t\t\t\t\toptionsContainsAngle(properties.swipe, degrees) &&\n\t\t\t\t\t\t\tpropertyMatchesButtonConfig(properties.config, _buttonConfig)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tproperties.swipe.callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _getCursor(target: Vector2) {\n\t\tconst pointerEventsController = this._scene.eventsDispatcher.pointerEventsController;\n\t\tconst cursor = pointerEventsController.cursor().value;\n\t\ttarget.copy(cursor);\n\t}\n}\n","import {ref} from '@vue/reactivity';\nimport {PolyScene} from '../../../PolyScene';\nimport {ActorsManager} from '../../ActorsManager';\nimport {Object3D, Intersection, Vector2, Vector3, Vector4, PerspectiveCamera, OrthographicCamera} from 'three';\nimport type {RaycasterUpdateOptions} from '../../events/PointerEventsController';\nimport {ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT} from '../../../../../core/actor/ActorCompilationController';\nimport {RenderPixelController, coreCursorToUv} from '../../../../../core/render/renderPixel/RenderPixelController';\nimport {coreGetDefaultCamera} from '../../../../../core/render/renderPixel/CoreGetDefautCamera';\nimport {pushOnArrayAtEntry} from '../../../../../core/MapUtils';\nimport {\n\tCPUOptions,\n\tObjectOptions,\n\thasCPUOptions,\n\thasGPUOptions,\n\tCPUOptionsEqual,\n\tCPUOptionsMax,\n\tGPUOptionsDepthBufferRequired,\n} from './Common';\nimport {arrayCopy} from '../../../../../core/ArrayUtils';\n\nconst RAYCAST_UPDATE_OPTIONS: RaycasterUpdateOptions = {\n\tpointsThreshold: 0.1,\n\tlineThreshold: 0.1,\n};\nconst TMP_CPU_OPTIONS: CPUOptions = {\n\ttraverseChildren: false,\n\tpointsThreshold: 0.1,\n\tlineThreshold: 0.1,\n\tintersectionRef: ref(null),\n};\n\nfunction intersectsSort(a: CPUOrGPUIntersection, b: CPUOrGPUIntersection) {\n\treturn a.distance - b.distance;\n}\nconst pixelRenderUv = new Vector2();\nconst pixelRenderTarget = new Vector4();\nconst raycasterDirNormalised = new Vector3();\nconst gpuCameraRayAtNearPlane = new Vector3();\nconst gpuCameraRayAtFarPlane = new Vector3();\nconst gpuHitPos = new Vector3();\n\ninterface GPUIntersection {\n\tdistance: number;\n}\ntype CPUOrGPUIntersection = Intersection | GPUIntersection;\n\nexport class BaseRayObjectIntersectionsController {\n\tprotected _scene: PolyScene;\n\tprotected _objects: Object3D[] = [];\n\tprotected _propertiesListByObject: Map<Object3D, ObjectOptions[]> = new Map();\n\tprivate _intersectsByObject: WeakMap<Object3D, Intersection[]> = new WeakMap();\n\tprivate _closestIntersects: Map<Object3D, CPUOrGPUIntersection | undefined> = new Map();\n\tprivate _objectByClosestIntersect: Map<CPUOrGPUIntersection, Object3D> = new Map();\n\tprivate _closestIntersectsSorted: CPUOrGPUIntersection[] = [];\n\tprivate _renderPixelController: RenderPixelController = new RenderPixelController();\n\tconstructor(protected actorsManager: ActorsManager) {\n\t\tthis._scene = actorsManager.scene;\n\t}\n\tobjects(target: Object3D[]) {\n\t\tarrayCopy(this._objects, target);\n\t}\n\tprotected _setIntersectedState(objects: Object3D[], intersectedStateByObject: WeakMap<Object3D, boolean>) {\n\t\t// prepare\n\t\tif (objects.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis._closestIntersects.clear();\n\t\tthis._objectByClosestIntersect.clear();\n\n\t\t//\n\t\tconst pointerEventsController = this._scene.eventsDispatcher.pointerEventsController;\n\t\tconst raycaster = pointerEventsController.raycaster().value;\n\n\t\tpointerEventsController.updateRaycast(RAYCAST_UPDATE_OPTIONS);\n\n\t\t// prepare gpu options\n\t\tconst gpuObjectsPresent = this._gpuObjectsPresent();\n\t\tconst camera =\n\t\t\tgpuObjectsPresent == true\n\t\t\t\t? (coreGetDefaultCamera(this._scene) as PerspectiveCamera | OrthographicCamera)\n\t\t\t\t: null;\n\t\tif (gpuObjectsPresent == true && camera) {\n\t\t\tconst cursor = pointerEventsController.cursor().value;\n\t\t\tcoreCursorToUv(cursor, pixelRenderUv);\n\n\t\t\tif (this._gpuDepthBufferReadRequired()) {\n\t\t\t\traycasterDirNormalised.copy(raycaster.ray.direction).normalize();\n\t\t\t\tgpuCameraRayAtNearPlane.set(cursor.x, cursor.y, -1).unproject(camera);\n\t\t\t\tgpuCameraRayAtFarPlane.set(cursor.x, cursor.y, 1).unproject(camera);\n\t\t\t}\n\t\t}\n\n\t\t// get intersects\n\t\tfor (const object of objects) {\n\t\t\tintersectedStateByObject.set(object, false /*we reset to false here*/);\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tconst intersects = this._intersectsByObject.get(object);\n\t\t\tif (propertiesList && intersects) {\n\t\t\t\tintersects.length = 0;\n\t\t\t\tif (hasCPUOptions(propertiesList)) {\n\t\t\t\t\tconst cpuOptions = CPUOptionsEqual(propertiesList)\n\t\t\t\t\t\t? propertiesList[0].cpu!\n\t\t\t\t\t\t: CPUOptionsMax(propertiesList, TMP_CPU_OPTIONS);\n\t\t\t\t\tRAYCAST_UPDATE_OPTIONS.pointsThreshold = cpuOptions.pointsThreshold;\n\t\t\t\t\tRAYCAST_UPDATE_OPTIONS.lineThreshold = cpuOptions.lineThreshold;\n\t\t\t\t\traycaster.intersectObject(object, cpuOptions.traverseChildren, intersects);\n\t\t\t\t\tconst closestIntersect = intersects[0];\n\t\t\t\t\tthis._closestIntersects.set(object, closestIntersect);\n\t\t\t\t\tif (closestIntersect) {\n\t\t\t\t\t\tthis._objectByClosestIntersect.set(closestIntersect, object);\n\t\t\t\t\t\t// console.log({object: object.name, distance: closestIntersect.distance});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (hasGPUOptions(propertiesList)) {\n\t\t\t\t\tconst gpuOptions = propertiesList[0].gpu;\n\t\t\t\t\tif (gpuOptions && camera) {\n\t\t\t\t\t\tconst worldPosMaterial = gpuOptions.worldPosMaterial;\n\t\t\t\t\t\tif (worldPosMaterial != null) {\n\t\t\t\t\t\t\tthis._renderPixelController.renderColor(\n\t\t\t\t\t\t\t\tthis._scene,\n\t\t\t\t\t\t\t\tobject,\n\t\t\t\t\t\t\t\tgpuOptions.worldPosMaterial,\n\t\t\t\t\t\t\t\tcamera,\n\t\t\t\t\t\t\t\tnull, //necessary to have alpha=0 when no object is hit\n\t\t\t\t\t\t\t\tpixelRenderUv,\n\t\t\t\t\t\t\t\tpixelRenderTarget\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._renderPixelController.renderDepth(\n\t\t\t\t\t\t\t\tthis._scene,\n\t\t\t\t\t\t\t\tobject,\n\t\t\t\t\t\t\t\t// gpuOptions.worldPosMaterial,\n\t\t\t\t\t\t\t\tcamera,\n\t\t\t\t\t\t\t\tnull, //necessary to have alpha=0 when no object is hit\n\t\t\t\t\t\t\t\tpixelRenderUv,\n\t\t\t\t\t\t\t\tpixelRenderTarget\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pixelRenderTarget.w > 0 /* pixelRenderTarget.w >= gpuOptions.alphaTest*/) {\n\t\t\t\t\t\t\tif (worldPosMaterial) {\n\t\t\t\t\t\t\t\tgpuHitPos.set(pixelRenderTarget.x, pixelRenderTarget.y, pixelRenderTarget.z);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tgpuHitPos\n\t\t\t\t\t\t\t\t\t.copy(gpuCameraRayAtNearPlane)\n\t\t\t\t\t\t\t\t\t.lerp(gpuCameraRayAtFarPlane, pixelRenderTarget.x);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst distance = gpuHitPos.distanceTo(raycaster.ray.origin);\n\t\t\t\t\t\t\tconst gpuIntersect: GPUIntersection = {distance};\n\n\t\t\t\t\t\t\tthis._closestIntersects.set(object, gpuIntersect);\n\t\t\t\t\t\t\tif (gpuIntersect) {\n\t\t\t\t\t\t\t\tthis._objectByClosestIntersect.set(gpuIntersect, object);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._closestIntersects.set(object, undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// sort closest intersects\n\t\tthis._closestIntersectsSorted.length = 0;\n\t\tfor (const object of objects) {\n\t\t\tconst closestIntersect = this._closestIntersects.get(object);\n\t\t\tif (closestIntersect) {\n\t\t\t\tthis._closestIntersectsSorted.push(closestIntersect);\n\t\t\t}\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList) {\n\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\tconst cpuOptions = properties.cpu;\n\t\t\t\t\tif (cpuOptions) {\n\t\t\t\t\t\tcpuOptions.intersectionRef.value = (closestIntersect as Intersection) || null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst gpuOptions = properties.gpu;\n\t\t\t\t\t\tif (gpuOptions) {\n\t\t\t\t\t\t\tgpuOptions.distanceRef.value = closestIntersect ? closestIntersect.distance : -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._closestIntersectsSorted.sort(intersectsSort);\n\n\t\t// process objects in order\n\t\tlet blockingObjectProcessed = false;\n\t\tfor (const intersect of this._closestIntersectsSorted) {\n\t\t\tconst object = this._objectByClosestIntersect.get(intersect);\n\t\t\tif (object) {\n\t\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\t\tif (propertiesList) {\n\t\t\t\t\tlet blockObjectsBehind = false;\n\t\t\t\t\tfor (const properties of propertiesList) {\n\t\t\t\t\t\tif (blockingObjectProcessed == false || properties.priority.skipIfObjectsInFront == true) {\n\t\t\t\t\t\t\tintersectedStateByObject.set(object, true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (properties.priority.blockObjectsBehind == true) {\n\t\t\t\t\t\t\tblockObjectsBehind = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tblockingObjectProcessed = blockObjectsBehind;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// reset\n\t\tthis._objectByClosestIntersect.clear();\n\t}\n\t// protected _postProcess() {\n\t// \tthis._objectByClosestIntersect.clear();\n\t// }\n\tprivate _gpuObjectsPresent(): boolean {\n\t\tconst objects = this._objects;\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList && hasGPUOptions(propertiesList)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tprivate _gpuDepthBufferReadRequired(): boolean {\n\t\tconst objects = this._objects;\n\t\tfor (const object of objects) {\n\t\t\tconst propertiesList = this._propertiesListByObject.get(object);\n\t\t\tif (propertiesList && GPUOptionsDepthBufferRequired(propertiesList)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\taddPropertiesForObject(object: Object3D, properties: ObjectOptions) {\n\t\tif (object == ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT) {\n\t\t\treturn;\n\t\t}\n\t\tpushOnArrayAtEntry(this._propertiesListByObject, object, properties);\n\n\t\tconst index = this._objects.indexOf(object);\n\t\tif (index < 0) {\n\t\t\tthis._objects.push(object);\n\t\t\tthis._intersectsByObject.set(object, []);\n\t\t}\n\t}\n\tremovePropertiesForObject(object: Object3D, properties: ObjectOptions) {\n\t\tif (object == ACTOR_COMPILATION_CONTROLLER_DUMMY_OBJECT) {\n\t\t\treturn;\n\t\t}\n\t\tconst propertiesForObject = this._propertiesListByObject.get(object);\n\t\tif (propertiesForObject) {\n\t\t\tconst propertyIndex = propertiesForObject.indexOf(properties);\n\t\t\tpropertiesForObject.splice(propertyIndex, 1);\n\n\t\t\tif (propertiesForObject.length == 0) {\n\t\t\t\tconst objectIndex = this._objects.indexOf(object);\n\t\t\t\tif (objectIndex >= 0) {\n\t\t\t\t\tthis._objects.splice(objectIndex, 1);\n\t\t\t\t\tthis._intersectsByObject.delete(object);\n\t\t\t\t\tthis._propertiesListByObject.delete(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {addToSetAtEntry} from '../../../../core/MapUtils';\nimport {EventContext} from '../../../../core/event/EventContextType';\nimport {BaseEventNodeType} from '../../../nodes/event/_Base';\nimport {PolyEventName} from '../../../poly/utils/PolyEventName';\n\nexport class PolySceneEvent extends Event {\n\tconstructor(type: PolyEventName) {\n\t\tsuper(type);\n\t}\n\toverride get type(): PolyEventName {\n\t\treturn super.type as PolyEventName;\n\t}\n}\nexport const SCENE_EVENT_CREATED_EVENT_CONTEXT: EventContext<PolySceneEvent> = {\n\tevent: new PolySceneEvent(PolyEventName.SCENE_CREATED),\n};\nexport const SCENE_EVENT_READY_EVENT_CONTEXT: EventContext<PolySceneEvent> = {\n\tevent: new PolySceneEvent(PolyEventName.SCENE_READY),\n};\nexport const SCENE_EVENT_PLAY_EVENT_CONTEXT: EventContext<PolySceneEvent> = {\n\tevent: new PolySceneEvent(PolyEventName.SCENE_PLAY),\n};\nexport const SCENE_EVENT_PAUSE_EVENT_CONTEXT: EventContext<PolySceneEvent> = {\n\tevent: new PolySceneEvent(PolyEventName.SCENE_PAUSE),\n};\n// export const SCENE_EVENT_TICK_EVENT_CONTEXT: EventContext<SceneEvent> = {event: new SceneEvent(SceneEventType.TICK)};\n\nexport class SceneEventsController {\n\tdispatch<T extends PolyEventName>(eventContext: EventContext<PolySceneEvent>) {\n\t\tconst event = eventContext.event;\n\t\tif (!event) {\n\t\t\treturn;\n\t\t}\n\t\tconst set = this._observersByEventType.get(event.type);\n\t\tif (!set) {\n\t\t\treturn;\n\t\t}\n\t\tset.forEach((node) => {\n\t\t\tnode.processEvent(eventContext);\n\t\t});\n\t}\n\n\tprivate _observersByEventType: Map<PolyEventName, Set<BaseEventNodeType>> = new Map();\n\tremoveObserverFromAllEventTypes(eventNode: BaseEventNodeType) {\n\t\tthis._observersByEventType.forEach((nodes, eventType) => {\n\t\t\tnodes.delete(eventNode);\n\t\t});\n\t}\n\taddObserver(eventNode: BaseEventNodeType, eventType: PolyEventName) {\n\t\taddToSetAtEntry(this._observersByEventType, eventType, eventNode);\n\t}\n}\n","import {Raycaster, Vector2, Vector3, Matrix4} from 'three';\nimport {MapboxPerspectiveCamera} from './MapboxPerspectiveCamera';\n\nexport class MapboxRaycaster extends Raycaster {\n\tprivate _inverseProjMat = new Matrix4();\n\tprivate _camPos = new Vector3();\n\tprivate _mousePos = new Vector3();\n\tprivate _viewDir = new Vector3();\n\n\toverride setFromCamera(mouse: Vector2, camera: MapboxPerspectiveCamera) {\n\t\tthis._inverseProjMat.copy(camera.projectionMatrix);\n\t\tthis._inverseProjMat.invert();\n\t\tthis._camPos.set(0, 0, 0);\n\t\tthis._camPos.applyMatrix4(this._inverseProjMat);\n\t\tthis._mousePos.set(mouse.x, mouse.y, 1);\n\t\tthis._mousePos.applyMatrix4(this._inverseProjMat);\n\t\tthis._viewDir.copy(this._mousePos).sub(this._camPos).normalize();\n\t\tthis.set(this._camPos, this._viewDir);\n\t}\n}\n","import mapboxgl from 'mapbox-gl';\nimport {TypedViewer, TypedViewerOptions} from './_Base';\n// import {Poly} from '../Poly';\n// import {ViewerLogoController} from './utils/logo/ViewerLogoController';\n// import {\n// \t// AvailableRenderConfig,\n// \tCoreCameraRendererController,\n// } from '../../core/camera/CoreCameraRendererController';\nimport {CoreCameraPostProcessController} from '../../core/camera/CoreCameraPostProcessController';\nimport {CoreCameraCSSRendererController, CSSRendererConfig} from '../../core/camera/CoreCameraCSSRendererController';\n// import {CoreCameraControlsController} from '../../core/camera/CoreCameraControlsController';\nimport {CoreCameraRenderSceneController} from '../../core/camera/CoreCameraRenderSceneController';\nimport type {EffectComposer} from 'postprocessing';\n// import {AbstractRenderer} from './Common';\nimport {MapboxPerspectiveCamera} from '../../core/thirdParty/Mapbox/MapboxPerspectiveCamera';\nimport {CoreStylesheetLoader} from '../../core/loader/Stylesheet';\nimport {MapboxMapsController} from '../../core/thirdParty/Mapbox/MapboxMapsController';\nimport {MapboxRaycaster} from '../../core/thirdParty/Mapbox/MapboxRaycaster';\n// import {MapboxLayersController} from '../../core/thirdParty/Mapbox/LayersController';\nimport {WebGLRenderer} from 'three';\nimport {ThreeMeshBVHHelper} from '../../core/geometry/bvh/ThreeMeshBVHHelper';\nconst CSS_CLASS = 'CoreMapboxViewer';\n\n// export interface ThreejsViewerProperties {\n// \tautoRender?: boolean;\n// }\n\nexport interface MapboxViewerOptions extends TypedViewerOptions<MapboxPerspectiveCamera> {\n\t// properties?: ThreejsViewerProperties;\n\t// renderer?: AbstractRenderer;\n}\n\nconst CSS_URL = 'https://api.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.css';\nexport class MapboxViewer extends TypedViewer<MapboxPerspectiveCamera> {\n\tprivate _map: mapboxgl.Map;\n\tprivate _canvasContainer: HTMLElement;\n\t// private _requestAnimationFrameId: number | undefined;\n\tprotected override _renderer: WebGLRenderer | undefined;\n\t// private _rendererConfig: AvailableRenderConfig | undefined;\n\t// private _renderFunc: RenderFuncWithDelta | undefined;\n\t// private _renderCSSFunc: RenderFunc | undefined;\n\tprivate _cssRendererConfig: CSSRendererConfig | undefined;\n\tprivate _effectComposer: EffectComposer | undefined;\n\t// private _layersController: MapboxLayersController;\n\n\tstatic override _canvasIdPrefix() {\n\t\treturn 'MapboxViewer';\n\t}\n\tconstructor(private options: MapboxViewerOptions) {\n\t\tsuper(options);\n\n\t\tthis._canvasContainer = document.createElement('div');\n\t\tthis._canvasContainer.id = `mapbox_container_id_${Math.random()}`.replace('.', '_');\n\t\tthis._canvasContainer.style.height = '100%';\n\t\tCoreStylesheetLoader.loadUrl(CSS_URL);\n\t\tconst data = MapboxMapsController.createMap({\n\t\t\tcamera: options.camera,\n\t\t\tcontainer: this._canvasContainer,\n\t\t\tscene: options.scene,\n\t\t\trenderFunc: this._animateCommonBound,\n\t\t\tviewer: this,\n\t\t});\n\t\tthis._map = data.map;\n\t\t// this._layersController = data.layersController;\n\t\tthis._map.on('resize', this._onResizeBound);\n\t\t// const canvas = this._map.getCanvas();\n\t\t// const context = Poly.renderersController.getRenderingContext(canvas)!;\n\t\t// this._renderer = new WebGLRenderer({\n\t\t// \t// alpha: true\n\t\t// \t// antialias: true,\n\t\t// \tcanvas,\n\t\t// \tcontext,\n\t\t// });\n\t\t// this._renderer.autoClear = false;\n\t\t// this._renderer.shadowMap.enabled = true;\n\n\t\t// this._container.style.height = '100%'; // this should be app specific\n\t}\n\trendererConfig() {\n\t\treturn undefined;\n\t}\n\toverride createRaycaster() {\n\t\tconst raycaster = new MapboxRaycaster();\n\t\tThreeMeshBVHHelper.updateRaycaster(raycaster);\n\t\treturn raycaster;\n\t}\n\tsetRenderer(renderer: WebGLRenderer) {\n\t\tthis._renderer = renderer;\n\t\tthis._setupFunctions(renderer, this.options);\n\t}\n\trenderer() {\n\t\treturn this._renderer;\n\t}\n\toverride canvas() {\n\t\treturn this._map.getCanvas();\n\t}\n\n\tprivate _setupFunctions(renderer: WebGLRenderer, options: MapboxViewerOptions) {\n\t\tconst camera = this.camera();\n\t\tconst scene = this.scene();\n\t\tconst canvas = this.canvas();\n\t\tconst threejsScene = scene.threejsScene();\n\n\t\t// WebGLRenderer\n\t\t// this._renderer = options.renderer;\n\t\t// if (!this._renderer) {\n\t\t// \tthis._rendererConfig = CoreCameraRendererController.rendererConfig({\n\t\t// \t\tcamera,\n\t\t// \t\tscene,\n\t\t// \t\tcanvas,\n\t\t// \t});\n\t\t// \tif (this._rendererConfig) {\n\t\t// \t\tthis._renderer = this._rendererConfig.renderer;\n\t\t// \t}\n\t\t// }\n\n\t\t// const renderer = this._renderer;\n\t\t// if (!renderer) {\n\t\t// \tconsole.error('no renderer');\n\t\t// }\n\t\t// if (renderer) {\n\t\t// scene\n\t\tconst rendererScene = CoreCameraRenderSceneController.renderScene({camera, scene});\n\t\tconst renderScene = rendererScene || threejsScene;\n\t\t// post\n\t\tthis._effectComposer = CoreCameraPostProcessController.createComposer({\n\t\t\tcamera,\n\t\t\tscene,\n\t\t\trenderScene,\n\t\t\trenderer,\n\t\t\tviewer: this,\n\t\t});\n\t\tconst effectComposer = this._effectComposer;\n\t\t// webXR\n\t\t// if (renderer instanceof WebGLRenderer) {\n\t\t// \tthis._webXRConfig = CoreCameraWebXRController.process({\n\t\t// \t\tcamera,\n\t\t// \t\tscene,\n\t\t// \t\trenderer,\n\t\t// \t\tcanvas: this.canvas(),\n\t\t// \t});\n\t\t// \tthis._markerTrackingConfig = CoreCameraMarkerTrackingController.process({\n\t\t// \t\tcanvas,\n\t\t// \t\tcamera,\n\t\t// \t\tscene,\n\t\t// \t});\n\t\t// }\n\t\t// CSSRender\n\t\tthis._cssRendererConfig = CoreCameraCSSRendererController.cssRendererConfig({scene, camera, canvas});\n\t\tconst cssRenderer = this._cssRendererConfig?.cssRenderer;\n\t\tthis._renderCSSFunc = cssRenderer ? () => cssRenderer.render(renderScene, camera) : undefined;\n\t\t// controls\n\t\t// this._controlsNode = CoreCameraControlsController.controlsNode({camera, scene});\n\t\t// renderFunc\n\t\tif (effectComposer) {\n\t\t\tthis._renderFunc = (delta) => effectComposer.render(delta);\n\t\t} else {\n\t\t\tthis._renderFunc = () => renderer.render(renderScene, camera);\n\t\t}\n\t\t// }\n\t\tthis._mountCSSRenderer();\n\t}\n\n\t/**\n\t * mounts the viewer onto an element\n\t *\n\t *\n\t */\n\toverride mount(element: HTMLElement) {\n\t\tsuper.mount(element);\n\n\t\tthis._domElement?.appendChild(this._canvasContainer);\n\t\tthis._domElement?.classList.add(CSS_CLASS);\n\n\t\t// // this.mapboxEventController.init_events();\n\t\t// this._map.on('load', () => {\n\t\t// \tif (this._map) {\n\t\t// \t\t// this._mapLoaded = true;\n\n\t\t// \t\t// this._canvas = this._findCanvas();\n\t\t// \t\t// this.eventsController().init();\n\t\t// \t\t// MapsRegister.instance().registerMap(this._canvasContainer.id, this._map);\n\t\t// \t\t// this.layersController.addLayers();\n\t\t// \t\t// this.mapboxEventController.camera_node_move_end(); // to update mapbox planes\n\t\t// \t\t// window.dispatchEvent(new Event('resize')); // helps making sure it is resized correctly\n\t\t// \t}\n\t\t// });\n\n\t\t// this._map.on('resize', this._onResizeBound);\n\n\t\t// this._domElement?.appendChild(canvas);\n\t\t// this._domElement?.classList.add(CSS_CLASS);\n\n\t\t// mount CSSRenderer\n\n\t\t// // mount webXR\n\t\t// this._webXRConfig?.mountFunction();\n\t\t// this._markerTrackingConfig?.mountFunction();\n\n\t\t// this._build();\n\t\tthis._setEvents();\n\t\t// this.onResize();\n\n\t\t// if (Poly.logo.displayed()) {\n\t\t// \tnew ViewerLogoController(this);\n\t\t// }\n\t}\n\tprivate _mountCSSRenderer() {\n\t\tconst canvas = this._map.getCanvas();\n\t\tconst cssRendererNode = this._cssRendererConfig?.cssRendererNode;\n\t\tif (cssRendererNode) {\n\t\t\tcssRendererNode.mountRenderer(canvas);\n\t\t}\n\t}\n\n\tpublic _build() {\n\t\t// this._initDisplay();\n\t\tthis.activate();\n\t}\n\n\t/**\n\t * disposes the viewer\n\t *\n\t *\n\t */\n\t// override dispose() {\n\t// \tconst canvas = this.canvas();\n\t// \t// dispose cssRenderer\n\t// \tconst cssRendererNode = this._cssRendererConfig?.cssRendererNode;\n\t// \tif (cssRendererNode) {\n\t// \t\tcssRendererNode.unmountRenderer(canvas);\n\t// \t}\n\t// \tthis._cssRendererConfig = undefined;\n\t// \t// dispose webXR\n\t// \tthis._webXRConfig?.unmountFunction();\n\t// \tthis._markerTrackingConfig?.unmountFunction();\n\n\t// \t// dispose effectComposer\n\t// \tthis._effectComposer = undefined;\n\n\t// \tthis.setAutoRender(false);\n\n\t// \tthis._cancelAnimate();\n\t// \t// this.controlsController().dispose();\n\t// \tthis._disposeEvents();\n\t// \t// if I dispose the renderer here,\n\t// \t// this prevents env maps from displaying\n\t// \t// when the viewer is switched\n\t// \t// TODO: consider disposing the renderer only if it is not a default one,\n\t// \t// as this may satisfy most cases\n\t// \t//this._renderer?.dispose();\n\t// \tsuper.dispose();\n\t// }\n\n\tprivate _setEvents() {\n\t\tthis.eventsController().init();\n\t\tthis.webglController().init();\n\n\t\t// this._disposeEvents();\n\t\t// window.addEventListener('resize', this._onResizeBound, false);\n\t}\n\t// private _disposeEvents() {\n\t// \twindow.removeEventListener('resize', this._onResizeBound, false);\n\t// }\n\tprivate _onResizeBound = this.onResize.bind(this);\n\tonResize() {\n\t\tconst canvas = this._map.getCanvas();\n\t\tconst rect = canvas.getBoundingClientRect();\n\t\tthis._size.set(rect.width, rect.height);\n\t\t// this._layersController.resize(this._size);\n\t\t// this.mapboxEventController.camera_node_move_end();\n\t\t// const canvas = this._canvas;\n\t\t// if (!canvas) {\n\t\t// \treturn;\n\t\t// }\n\t\tif (!this._renderer) {\n\t\t\t// console.error('resize: no renderer');\n\t\t\treturn;\n\t\t}\n\n\t\tconst devicePixelRatio = globalThis.devicePixelRatio;\n\t\tthis._renderer.setSize(this._size.x * devicePixelRatio, this._size.y * devicePixelRatio, false);\n\n\t\t// const pixelRatio = this._renderer.getPixelRatio();\n\t\tthis.camerasController().computeSizeAndAspect(globalThis.devicePixelRatio);\n\t\t// const size = this.camerasController().size;\n\t\t// CoreCameraRendererController.setRendererSize(canvas, size);\n\t\tthis._cssRendererConfig?.cssRenderer.setSize(this._size.x, this._size.y);\n\t\tthis._effectComposer?.setSize(this._size.x, this._size.y);\n\t\tthis.camerasController().updateCameraAspect();\n\t\tthis._runOnResizeCallbacks();\n\t}\n\n\t// private _initDisplay() {\n\t// \tif (!this._canvas) {\n\t// \t\tconsole.warn('no canvas found for viewer');\n\t// \t\treturn;\n\t// \t}\n\t// \tif (!this._renderer) {\n\t// \t\treturn;\n\t// \t}\n\n\t// \tconst pixelRatio = this._renderer.getPixelRatio();\n\t// \tthis.camerasController().computeSizeAndAspect(pixelRatio);\n\t// \tthis.audioController().update();\n\t// \tthis._startAnimate();\n\t// }\n\n\t/**\n\t * setAutoRender to false will stop the rendering. This can be useful if you know that nothing has changed in the scene, or if the renderer is currently not visible.\n\t *\n\t *\n\t */\n\t// override setAutoRender(state = true) {\n\t// \tsuper.setAutoRender(state);\n\t// \t// if this._requestAnimationFrameId is already defined,\n\t// \t// calling this a second time would start another requestAnimationFrame\n\t// \t// and we would therefore render at twice the rate\n\t// \tif (this._doRender && this._requestAnimationFrameId == null) {\n\t// \t\tthis._startAnimate();\n\t// \t}\n\t// \tif (!this._doRender) {\n\t// \t\tthis._cancelAnimate();\n\t// \t}\n\t// }\n\n\tisXR(): boolean {\n\t\treturn false;\n\t}\n\t// private _startAnimate() {\n\t// \t// if (this.isXR()) {\n\t// \t// \tconst renderer = this._renderer as WebGLRenderer;\n\t// \t// \tif (!renderer) {\n\t// \t// \t\treturn;\n\t// \t// \t}\n\n\t// \t// \tconst webXRController = this.scene().webXR;\n\t// \t// \tconst xrCallback: XRFrameRequestCallback = (timestamp, frame) => {\n\t// \t// \t\twebXRController.activeXRController()?.process(frame);\n\n\t// \t// \t\tthis._animateWebXR();\n\t// \t// \t};\n\t// \t// \trenderer.setAnimationLoop(xrCallback);\n\t// \t// } else {\n\t// \tthis._animateWeb();\n\t// \t// }\n\t// }\n\t// private _cancelAnimate() {\n\t// \t// if (this.isXR()) {\n\t// \t// \t(this._renderer as WebGLRenderer)?.setAnimationLoop(null);\n\t// \t// } else {\n\t// \tthis._cancelAnimateCommon();\n\t// \t// }\n\t// }\n\n\t// private _animateWebBound: () => void = this._animateWeb.bind(this);\n\t// private _animateWeb() {\n\t// \tif (!this._doRender) {\n\t// \t\treturn;\n\t// \t}\n\t// \tthis._requestAnimationFrameId = requestAnimationFrame(this._animateWebBound);\n\t// \tthis.__animateCommon__();\n\t// }\n\t// private _animateWebXR() {\n\t// \tthis.__animateCommon__();\n\t// }\n\tprivate _animateCommonBound = this.__animateCommon__.bind(this);\n\tprivate __animateCommon__() {\n\t\tconst delta = this._scene.timeController.updateClockDelta();\n\t\tthis._tickAndRender(delta);\n\t}\n\n\t// private _cancelAnimateCommon() {\n\t// \tthis._doRender = false;\n\t// \tif (this._requestAnimationFrameId != null) {\n\t// \t\tcancelAnimationFrame(this._requestAnimationFrameId);\n\t// \t\tthis._requestAnimationFrameId = undefined;\n\t// \t}\n\t// \tif (this._canvas) {\n\t// \t\t// this._cameraNode.renderController().deleteRenderer(this._canvas);\n\t// \t}\n\t// }\n\n\t/**\n\t * returns the current renderer\n\t *\n\t *\n\t */\n\t// renderer() {\n\t// \treturn this._renderer;\n\t// \t// if (this._canvas) {\n\t// \t// \t// return this._cameraNode.renderController().renderer(this._canvas);\n\t// \t// }\n\t// }\n\t// effectComposer() {\n\t// \treturn this._effectComposer;\n\t// }\n\tpreCompile() {\n\t\tif (!this._renderer) {\n\t\t\treturn;\n\t\t}\n\t\t// if (this._canvas) {\n\t\tthis._renderer.compile(this._scene.threejsScene(), this._camera);\n\t\t// }\n\t}\n\toverride markAsReady() {\n\t\tthis.preCompile();\n\t\tthis.setAutoRender(true);\n\t}\n}\n","import {ThreejsViewer, ThreejsViewerOptions, ThreejsViewerSetupData} from './Threejs';\nimport {\n\tPhysicalCamera,\n\t// @ts-ignore\n} from 'three-gpu-pathtracer';\nimport {PathTracingRendererContainer} from '../nodes/rop/utils/pathTracing/PathTracingRendererContainer';\n\n// type RenderFuncWithDeltaAsync = (delta: number) => Promise<void>;\ntype OnFrameCompleted = () => Promise<void>;\ninterface RecordingStateOptions {\n\tisRecording: boolean;\n\t// onSampleCompleted?: OnSampleCompleted;\n\tonFrameCompleted?: OnFrameCompleted;\n\trecordingSamplesPerFrame?: number;\n\t// sleepCallback?: SleepCallback;\n\t// setTimeout?: SetTimeoutCallback;\n\t// requestAnimationFrame?: RequestAnimationFrame;\n}\n\n/**\n *\n *\n * pathtracing viewers are created by adding the [PathTracingRenderer](/docs/nodes/rop/PathTracingRenderer) to a camera. They inherit from [ThreejsViewer](/docs/api/ThreejsViewer).\n *\n */\n\nexport class PathTracingViewer<C extends PhysicalCamera> extends ThreejsViewer<PhysicalCamera> {\n\tprotected override _renderer: PathTracingRendererContainer | undefined;\n\tprivate _debugElement: HTMLElement | undefined;\n\t// private _rendering: boolean = false;\n\t// protected override _renderFunc: RenderFuncWithDeltaAsync | undefined;\n\tprotected override _setupFunctions(options: ThreejsViewerOptions<C>): ThreejsViewerSetupData<C> | void {\n\t\tconst data = super._setupFunctions(options);\n\t\tif (data) {\n\t\t\tconst {renderer, renderScene, camera} = data;\n\t\t\tif (renderer instanceof PathTracingRendererContainer) {\n\t\t\t\tthis._renderFunc = () => {\n\t\t\t\t\tif (this._isRecording) {\n\t\t\t\t\t\tif (renderer.pbrRenderAllowed()) {\n\t\t\t\t\t\t\trenderer.render(renderScene, camera);\n\t\t\t\t\t\t\tthis.updateDebugDisplay();\n\n\t\t\t\t\t\t\tif (renderer.samplesCount() >= this._recordingSamplesPerFrame && this._onFrameCompleted) {\n\t\t\t\t\t\t\t\trenderer.markAsNotGenerated();\n\t\t\t\t\t\t\t\tthis._onFrameCompleted();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trenderer.render(renderScene, camera);\n\t\t\t\t\t\tthis.updateDebugDisplay();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trenderer.generate(renderScene);\n\t\t\t}\n\t\t}\n\t}\n\n\toverride mount(element: HTMLElement) {\n\t\tsuper.mount(element);\n\n\t\tif (this._errorMessage) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._renderer) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._renderer.displayDebug) {\n\t\t\tthis._debugElement = document.createElement('div');\n\t\t\tthis._debugElement.style.position = 'absolute';\n\t\t\tthis._debugElement.style.top = '5px';\n\t\t\tthis._debugElement.style.right = '5px';\n\t\t\tthis._debugElement.style.padding = '2px 5px';\n\t\t\tthis._debugElement.style.color = 'black';\n\t\t\tthis._debugElement.style.backgroundColor = 'white';\n\t\t\tthis._debugElement.style.opacity = '60%';\n\t\t\tthis._debugElement.style.fontSize = '0.6rem';\n\t\t\tthis._debugElement.style.textAlign = 'right';\n\t\t\tthis._debugElement.style.fontFamily = 'monospace';\n\t\t\tthis._domElement?.append(this._debugElement);\n\t\t\tthis.updateDebugDisplay();\n\t\t}\n\t}\n\tprivate _isRecording: boolean = false;\n\tprivate _onFrameCompleted: OnFrameCompleted | undefined;\n\tprivate _recordingSamplesPerFrame: number = 500;\n\tsetRecordingState(options: RecordingStateOptions) {\n\t\tthis._isRecording = options.isRecording;\n\t\tthis._onFrameCompleted = options.onFrameCompleted;\n\t\tthis._recordingSamplesPerFrame =\n\t\t\toptions.recordingSamplesPerFrame != null\n\t\t\t\t? options.recordingSamplesPerFrame\n\t\t\t\t: this._recordingSamplesPerFrame;\n\t\tthis._renderer?.reset();\n\t}\n\tupdateDebugDisplay() {\n\t\tif (!this._debugElement) {\n\t\t\treturn;\n\t\t}\n\t\tconst samples = this._renderer?.samplesCount() || 0;\n\t\tthis._debugElement.innerText = `${samples}`.padStart(3, '0');\n\t}\n\toverride dispose() {\n\t\tthis._renderer?.dispose();\n\t\tsuper.dispose();\n\t\tthis._debugElement?.remove();\n\t}\n\n\tprotected override _animateWebBound: () => void = this._animateWeb.bind(this);\n\tprotected override _animateWeb() {\n\t\tif (!this._doRender) {\n\t\t\treturn;\n\t\t}\n\t\t// this._requestAnimationFrameId = requestAnimationFrame(this._animateWebBound);\n\t\tthis.__animateCommon__();\n\t}\n\tprotected override _postRender(delta: number) {\n\t\tconst renderer = this._renderer;\n\t\tif (!renderer) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._runOnBeforeRenderCallbacks(delta, renderer);\n\t\tif (this._renderFunc) {\n\t\t\tthis._renderFunc(delta);\n\t\t}\n\t\tif (this._renderCSSFunc) {\n\t\t\tthis._renderCSSFunc();\n\t\t}\n\t\tthis.controlsController().update(delta);\n\t\tthis._runOnAfterRenderCallbacks(delta, renderer);\n\t\tthis._requestAnimationFrameId = requestAnimationFrame(this._animateWebBound);\n\t}\n}\n","import {Camera, WebGLRenderer} from 'three';\nimport {PolyScene} from '../../../engine/scene/PolyScene';\nimport {CameraAttribute} from '../CoreCamera';\nimport {\n\tWebXRControllerMountFunction,\n\tWebXRControllerUnmountFunction,\n\tWEBXR_REFERENCE_SPACE_TYPES,\n} from '../../webXR/Common';\nimport {WebXRVRFeature, WEBXR_VR_FEATURES} from '../../webXR/webXRVR/CommonVR';\nimport {BaseCoreWebXRController} from '../../webXR/_BaseCoreWebXRController';\nimport {WebXRARFeature, WEBXR_AR_FEATURES} from '../../webXR/webXRAR/CommonAR';\nimport {coreObjectClassFactory} from '../../geometry/CoreObjectFactory';\n\ninterface WebXRControllerOptions {\n\tcamera: Camera;\n\tscene: PolyScene;\n\trenderer: WebGLRenderer;\n\tcanvas: HTMLCanvasElement;\n}\n\nexport interface CoreCameraWebXRControllerConfig {\n\tmountFunction: WebXRControllerMountFunction;\n\tunmountFunction: WebXRControllerUnmountFunction;\n}\n\nfunction getFeatures<F extends WebXRARFeature | WebXRVRFeature>(\n\tcamera: Camera,\n\tattribName: string,\n\texistingFeatures: F[]\n): F[] {\n\tconst features: F[] = [];\n\tconst featuresStr = coreObjectClassFactory(camera).attribValue(camera, attribName) as string | null;\n\tconst featuresStrings = featuresStr?.split(' ');\n\tif (featuresStrings) {\n\t\tfor (const featuresString of featuresStrings) {\n\t\t\tif (existingFeatures.includes(featuresString as F)) {\n\t\t\t\tfeatures.push(featuresString as F);\n\t\t\t}\n\t\t}\n\t}\n\treturn features;\n}\ninterface FeatureAttribNames {\n\toptional: CameraAttribute;\n\trequired: CameraAttribute;\n}\nfunction _getRequiredAndOptionalFeatures<E extends WebXRARFeature | WebXRVRFeature>(\n\tcamera: Camera,\n\texistingFeatures: E[],\n\tattribNames: FeatureAttribNames\n) {\n\t// features\n\tconst optionalFeatures = getFeatures<E>(camera, attribNames.optional, existingFeatures);\n\tconst requiredFeatures = getFeatures<E>(camera, attribNames.required, existingFeatures);\n\n\treturn {requiredFeatures, optionalFeatures};\n}\n\ninterface SpaceTypeAttribNames {\n\ttype: CameraAttribute;\n\toverride: CameraAttribute;\n}\nfunction _getReferenceSpaceType(camera: Camera, options: SpaceTypeAttribNames) {\n\t// referenceSpaceType\n\tconst coreObjectClass = coreObjectClassFactory(camera);\n\n\tlet overrideReferenceSpaceType = coreObjectClass.attribValue(camera, options.override) as boolean | null;\n\tlet referenceSpaceType: string | null | undefined = coreObjectClass.attribValue(camera, options.type) as\n\t\t| string\n\t\t| null;\n\n\tif (!(referenceSpaceType && WEBXR_REFERENCE_SPACE_TYPES.includes(referenceSpaceType as XRReferenceSpaceType))) {\n\t\toverrideReferenceSpaceType = false;\n\t\treferenceSpaceType = undefined;\n\t}\n\n\treturn {overrideReferenceSpaceType, referenceSpaceType};\n}\n\nexport class CoreCameraWebXRController {\n\tstatic process(options: WebXRControllerOptions): CoreCameraWebXRControllerConfig {\n\t\tconst {camera, scene, renderer, canvas} = options;\n\n\t\tconst controllers: BaseCoreWebXRController[] = [];\n\t\tconst subMountFunctions: WebXRControllerMountFunction[] = [];\n\t\tconst subUnmountFunctions: WebXRControllerUnmountFunction[] = [];\n\t\tconst mountFunction: WebXRControllerMountFunction = () => {\n\t\t\tfor (const subFunc of subMountFunctions) {\n\t\t\t\tsubFunc();\n\t\t\t}\n\t\t};\n\t\tconst unmountFunction: WebXRControllerUnmountFunction = () => {\n\t\t\tfor (const subFunc of subUnmountFunctions) {\n\t\t\t\tsubFunc();\n\t\t\t}\n\t\t};\n\t\tconst coreObjectClass = coreObjectClassFactory(camera);\n\t\t//\n\t\t// AR\n\t\t//\n\t\tconst isWebAR = coreObjectClass.attribValue(camera, CameraAttribute.WEBXR_AR) as boolean | null;\n\t\tif (isWebAR == true) {\n\t\t\tconst createFunction = scene.webXR.ARControllerCreateFunction();\n\t\t\tif (createFunction) {\n\t\t\t\tconst {overrideReferenceSpaceType, referenceSpaceType} = _getReferenceSpaceType(camera, {\n\t\t\t\t\ttype: CameraAttribute.WEBXR_AR_OVERRIDE_REFERENCE_SPACE_TYPE,\n\t\t\t\t\toverride: CameraAttribute.WEBXR_AR_REFERENCE_SPACE_TYPE,\n\t\t\t\t});\n\n\t\t\t\tconst {requiredFeatures, optionalFeatures} = _getRequiredAndOptionalFeatures<WebXRARFeature>(\n\t\t\t\t\tcamera,\n\t\t\t\t\tWEBXR_AR_FEATURES,\n\t\t\t\t\t{\n\t\t\t\t\t\toptional: CameraAttribute.WEBXR_AR_FEATURES_OPTIONAL,\n\t\t\t\t\t\trequired: CameraAttribute.WEBXR_AR_FEATURES_REQUIRED,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// createFunction\n\t\t\t\tconst controller = createFunction(renderer, camera, canvas, {\n\t\t\t\t\toverrideReferenceSpaceType: overrideReferenceSpaceType || false,\n\t\t\t\t\treferenceSpaceType: referenceSpaceType as XRReferenceSpaceType | undefined,\n\t\t\t\t\trequiredFeatures,\n\t\t\t\t\toptionalFeatures,\n\t\t\t\t});\n\t\t\t\tcontrollers.push(controller);\n\t\t\t}\n\t\t}\n\t\t//\n\t\t// VR\n\t\t//\n\t\tconst isWebVR = coreObjectClass.attribValue(camera, CameraAttribute.WEBXR_VR) as boolean | null;\n\t\tif (isWebVR == true) {\n\t\t\tconst createFunction = scene.webXR.VRControllerCreateFunction();\n\t\t\tif (createFunction) {\n\t\t\t\tconst {overrideReferenceSpaceType, referenceSpaceType} = _getReferenceSpaceType(camera, {\n\t\t\t\t\ttype: CameraAttribute.WEBXR_VR_OVERRIDE_REFERENCE_SPACE_TYPE,\n\t\t\t\t\toverride: CameraAttribute.WEBXR_VR_REFERENCE_SPACE_TYPE,\n\t\t\t\t});\n\n\t\t\t\tconst {requiredFeatures, optionalFeatures} = _getRequiredAndOptionalFeatures<WebXRVRFeature>(\n\t\t\t\t\tcamera,\n\t\t\t\t\tWEBXR_VR_FEATURES,\n\t\t\t\t\t{\n\t\t\t\t\t\toptional: CameraAttribute.WEBXR_VR_FEATURES_OPTIONAL,\n\t\t\t\t\t\trequired: CameraAttribute.WEBXR_VR_FEATURES_REQUIRED,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// createFunction\n\t\t\t\tconst controller = createFunction(renderer, camera, canvas, {\n\t\t\t\t\toverrideReferenceSpaceType: overrideReferenceSpaceType || false,\n\t\t\t\t\treferenceSpaceType: referenceSpaceType as XRReferenceSpaceType | undefined,\n\t\t\t\t\trequiredFeatures,\n\t\t\t\t\toptionalFeatures,\n\t\t\t\t});\n\t\t\t\tcontrollers.push(controller);\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\t//\n\t\t//\n\t\tfor (const controller of controllers) {\n\t\t\tsubMountFunctions.push(() => controller.mount());\n\t\t\tsubUnmountFunctions.push(() => controller.unmount());\n\t\t}\n\n\t\treturn {mountFunction, unmountFunction};\n\t}\n}\n","import {Camera, WebGLRenderer, Scene} from 'three';\nimport {TypedViewer, TypedViewerOptions, BaseViewerMountOptions} from './_Base';\nimport {AvailableRenderConfig, CoreCameraRendererController} from '../../core/camera/CoreCameraRendererController';\nimport {CoreCameraPostProcessController} from '../../core/camera/CoreCameraPostProcessController';\nimport {CoreCameraCSSRendererController, CSSRendererConfig} from '../../core/camera/CoreCameraCSSRendererController';\nimport {CoreCameraViewerCodeController, ViewerCodeConfig} from '../../core/camera/CoreCameraViewerCodeController';\nimport {CoreCameraControlsController} from '../../core/camera/CoreCameraControlsController';\nimport {CoreCameraRenderSceneController} from '../../core/camera/CoreCameraRenderSceneController';\nimport type {EffectComposer} from 'postprocessing';\nimport {AbstractRenderer} from './Common';\nimport {CoreCameraWebXRController, CoreCameraWebXRControllerConfig} from '../../core/camera/webXR/CoreCameraWebXR';\nimport {MarkerTrackingControllerConfig} from '../../core/webXR/markerTracking/Common';\nimport {CoreCameraMarkerTrackingController} from '../../core/camera/webXR/CoreCameraMarkerTracking';\nimport {CoreCameraViewerFPSController, ViewerFPSConfig, isDeltaValid} from '../../core/camera/CoreCameraFPS';\n\nconst CSS_CLASS = 'CoreThreejsViewer';\n\ndeclare global {\n\tinterface HTMLCanvasElement {\n\t\tonwebglcontextlost: () => void;\n\t\tonwebglcontextrestored: () => void;\n\t}\n}\n\n// export interface ThreejsViewerProperties {\n// \tautoRender?: boolean;\n// }\n\nexport interface ThreejsViewerOptions<C extends Camera> extends TypedViewerOptions<C> {\n\t// properties?: ThreejsViewerProperties;\n\t// renderer?: AbstractRenderer;\n}\n\n// type RenderFuncWithDelta = (delta: number) => void;\n// type RenderFunc = () => void;\nexport interface ThreejsViewerSetupData<C extends Camera> {\n\trenderer: AbstractRenderer;\n\trenderScene: Scene;\n\tcamera: C;\n}\ninterface SetAutoRenderOptions {\n\tcancelAnimate?: boolean;\n}\n\n/**\n *\n *\n * threejs viewers are created by the [PerspectiveCamera](/docs/nodes/obj/perspectivecamera) and [OrthographicCamera](/docs/nodes/obj/orthographiccamera) object nodes. They inherit from [TypedViewer](/docs/api/TypedViewer).\n *\n */\n\nexport class ThreejsViewer<C extends Camera> extends TypedViewer<C> {\n\tprotected _requestAnimationFrameId: number | undefined;\n\n\tprivate _webXRConfig: CoreCameraWebXRControllerConfig | undefined;\n\tprivate _markerTrackingConfig: MarkerTrackingControllerConfig | undefined;\n\t// protected  _renderer: AbstractRenderer | undefined;\n\tprivate _rendererConfig: AvailableRenderConfig | undefined;\n\t// protected _renderFunc: RenderFuncWithDelta | undefined;\n\t// protected _renderCSSFunc: RenderFunc | undefined;\n\tprivate _cssRendererConfig: CSSRendererConfig | undefined;\n\tprivate _codeConfig: ViewerCodeConfig | undefined;\n\tprivate _FPSConfig: ViewerFPSConfig | undefined;\n\n\tprivate _effectComposer: EffectComposer | undefined;\n\tprotected _errorMessage: string | undefined;\n\tprivate _resizeObserver: ResizeObserver | undefined;\n\n\tstatic override _canvasIdPrefix() {\n\t\treturn 'ThreejsViewer';\n\t}\n\tconstructor(options: ThreejsViewerOptions<C>) {\n\t\tsuper(options);\n\t\tthis._setupFunctions(options);\n\t\t// coreMountDebugElement();\n\t\t// this._container.style.height = '100%'; // this should be app specific\n\t}\n\trendererConfig() {\n\t\treturn this._rendererConfig;\n\t}\n\tprotected _setupFunctions(options: ThreejsViewerOptions<C>): ThreejsViewerSetupData<C> | void {\n\t\tconst camera = this.camera();\n\t\tconst scene = this.scene();\n\t\tconst canvas = this.canvas();\n\t\tconst threejsScene = scene.threejsScene();\n\t\tthis._errorMessage = undefined;\n\n\t\t// WebGLRenderer\n\t\tthis._renderer = options.renderer;\n\t\tif (!this._renderer) {\n\t\t\tthis._rendererConfig = CoreCameraRendererController.rendererConfig({\n\t\t\t\tcamera,\n\t\t\t\tscene,\n\t\t\t\tcanvas,\n\t\t\t});\n\t\t\tif (this._rendererConfig) {\n\t\t\t\tthis._renderer = this._rendererConfig.renderer;\n\t\t\t}\n\t\t}\n\n\t\tconst renderer = this._renderer;\n\t\tif (!renderer) {\n\t\t\tconsole.error('no renderer');\n\t\t}\n\t\tif (renderer) {\n\t\t\t// scene\n\t\t\tconst rendererScene = CoreCameraRenderSceneController.renderScene({camera, scene});\n\t\t\tconst renderScene = rendererScene || threejsScene;\n\t\t\t// post\n\t\t\tthis._effectComposer = CoreCameraPostProcessController.createComposer({\n\t\t\t\tcamera,\n\t\t\t\tscene,\n\t\t\t\trenderScene,\n\t\t\t\trenderer,\n\t\t\t\tviewer: this,\n\t\t\t});\n\t\t\tconst effectComposer = this._effectComposer;\n\t\t\t// webXR\n\t\t\tif (renderer instanceof WebGLRenderer) {\n\t\t\t\tthis._webXRConfig = CoreCameraWebXRController.process({\n\t\t\t\t\tcamera,\n\t\t\t\t\tscene,\n\t\t\t\t\trenderer,\n\t\t\t\t\tcanvas: this.canvas(),\n\t\t\t\t});\n\t\t\t\tthis._markerTrackingConfig = CoreCameraMarkerTrackingController.process({\n\t\t\t\t\tcanvas,\n\t\t\t\t\tcamera,\n\t\t\t\t\tscene,\n\t\t\t\t\tonError: (errorMessage) => {\n\t\t\t\t\t\tthis._errorMessage = errorMessage;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\t// ViewerCode\n\t\t\tthis._codeConfig = CoreCameraViewerCodeController.viewerCodeConfig({camera});\n\t\t\t// CSSRender\n\t\t\tthis._cssRendererConfig = CoreCameraCSSRendererController.cssRendererConfig({scene, camera, canvas});\n\t\t\tconst cssRenderer = this._cssRendererConfig?.cssRenderer;\n\t\t\tthis._renderCSSFunc = cssRenderer ? () => cssRenderer.render(renderScene, camera) : undefined;\n\t\t\t// controls\n\t\t\tthis._controlsNode = CoreCameraControlsController.controlsNode({camera, scene});\n\t\t\t// FPS\n\t\t\tthis._FPSConfig = CoreCameraViewerFPSController.viewerFPSConfig({camera});\n\t\t\t// renderFunc\n\t\t\tif (effectComposer) {\n\t\t\t\tthis._renderFunc = (delta) => effectComposer.render(delta);\n\t\t\t} else {\n\t\t\t\tthis._renderFunc = () => renderer.render(renderScene, camera);\n\t\t\t}\n\t\t\treturn {renderer, renderScene, camera};\n\t\t}\n\t}\n\n\t/**\n\t * mounts the viewer onto an element\n\t *\n\t *\n\t */\n\toverride mount(element: HTMLElement, options?: BaseViewerMountOptions) {\n\t\tsuper.mount(element, options);\n\t\tconst canvas = this.canvas();\n\t\tconst _appendCanvasWithViewerCodeConfig = (config: ViewerCodeConfig) => {\n\t\t\tif (!this._domElement) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn config.createViewerElement({domElement: this._domElement, canvas, CSSClass: CSS_CLASS});\n\t\t};\n\t\tconst _appendCanvasWithoutViewerCodeConfig = () => {\n\t\t\tthis._domElement?.appendChild(canvas);\n\t\t\tthis._domElement?.classList.add(CSS_CLASS);\n\t\t\treturn this._domElement;\n\t\t};\n\t\tconst viewerContainerElement = this._codeConfig\n\t\t\t? _appendCanvasWithViewerCodeConfig(this._codeConfig)\n\t\t\t: _appendCanvasWithoutViewerCodeConfig();\n\n\t\t// mount CSSRenderer\n\t\tconst cssRendererNode = this._cssRendererConfig?.cssRendererNode;\n\t\tif (cssRendererNode) {\n\t\t\tcssRendererNode.mountRenderer(canvas);\n\t\t}\n\t\t// mount webXR\n\t\tthis._webXRConfig?.mountFunction();\n\t\tthis._markerTrackingConfig?.mountFunction();\n\n\t\tthis._build();\n\t\tthis._setEvents();\n\t\tconst canvasParent = canvas.parentElement;\n\t\tif (canvasParent) {\n\t\t\tthis._createResizeObserver(canvasParent);\n\t\t}\n\t\tthis.onResize();\n\n\t\t// display error if any\n\t\tif (this._errorMessage) {\n\t\t\tconst errorElement = document.createElement('div');\n\t\t\terrorElement.style.position = 'absolute';\n\t\t\terrorElement.style.top = '0px';\n\t\t\terrorElement.style.width = '100%';\n\t\t\terrorElement.style.color = 'red';\n\t\t\terrorElement.style.backgroundColor = 'white';\n\t\t\terrorElement.style.padding = '20px';\n\t\t\t// errorElement.style.margin = '20px';\n\t\t\terrorElement.style.textAlign = 'center';\n\t\t\terrorElement.style.opacity = '90%';\n\t\t\terrorElement.innerText = this._errorMessage;\n\t\t\tviewerContainerElement?.append(errorElement);\n\t\t}\n\n\t\t// if (Poly.logo.displayed()) {\n\t\t// \tnew ViewerLogoController(this);\n\t\t// }\n\t}\n\n\tpublic _build() {\n\t\tthis._initDisplay();\n\t\tthis.activate();\n\t}\n\n\t/**\n\t * disposes the viewer\n\t *\n\t *\n\t */\n\toverride dispose() {\n\t\tconst canvas = this.canvas();\n\t\t// dispose cssRenderer\n\t\tconst cssRendererNode = this._cssRendererConfig?.cssRendererNode;\n\t\tif (cssRendererNode) {\n\t\t\tcssRendererNode.unmountRenderer(canvas);\n\t\t}\n\t\tthis._cssRendererConfig = undefined;\n\t\t// dispose webXR\n\t\tthis._webXRConfig?.unmountFunction();\n\t\tthis._markerTrackingConfig?.unmountFunction();\n\n\t\t// dispose effectComposer\n\t\tthis._effectComposer = undefined;\n\n\t\tthis.setAutoRender(false);\n\n\t\tthis._cancelAnimate();\n\t\t// this.controlsController().dispose();\n\t\tthis._unlistenToWindowResize();\n\t\tthis._disposeResizeObserver();\n\t\t// if I dispose the renderer here,\n\t\t// this prevents env maps from displaying\n\t\t// when the viewer is switched\n\t\t// TODO: consider disposing the renderer only if it is not a default one,\n\t\t// as this may satisfy most cases\n\t\t//this._renderer?.dispose();\n\t\tsuper.dispose();\n\t}\n\n\tprivate _setEvents() {\n\t\tthis.eventsController().init();\n\t\tthis.webglController().init();\n\n\t\tthis._unlistenToWindowResize();\n\t\tthis._listenToWindowResize();\n\t}\n\n\tprivate _initDisplay() {\n\t\tif (!this._canvas) {\n\t\t\tconsole.warn('no canvas found for viewer');\n\t\t\treturn;\n\t\t}\n\t\tif (!this._renderer) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst pixelRatio = this._renderer.getPixelRatio();\n\t\tthis.camerasController().computeSizeAndAspect(pixelRatio);\n\t\tthis.audioController().update();\n\t\tthis._startAnimate();\n\t}\n\n\t/**\n\t * setAutoRender to false will stop the rendering. This can be useful if you know that nothing has changed in the scene, or if the renderer is currently not visible.\n\t *\n\t *\n\t */\n\toverride setAutoRender(state = true, options?: SetAutoRenderOptions) {\n\t\tsuper.setAutoRender(state);\n\t\t// if this._requestAnimationFrameId is already defined,\n\t\t// calling this a second time would start another requestAnimationFrame\n\t\t// and we would therefore render at twice the rate\n\t\tif (this._doRender && this._requestAnimationFrameId == null) {\n\t\t\tthis._startAnimate();\n\t\t}\n\t\tif (!this._doRender) {\n\t\t\tif (options && options.cancelAnimate == true) {\n\t\t\t\tthis._cancelAnimate();\n\t\t\t}\n\t\t}\n\t}\n\n\tisXR(): boolean {\n\t\tif (!this._renderer) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this._renderer instanceof WebGLRenderer && this._renderer.xr.enabled;\n\t}\n\tprivate _startAnimate() {\n\t\tif (this.isXR()) {\n\t\t\tconst renderer = this._renderer as WebGLRenderer;\n\t\t\tif (!renderer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst webXRController = this.scene().webXR;\n\t\t\tconst xrCallback: XRFrameRequestCallback = (timestamp, frame) => {\n\t\t\t\twebXRController.activeXRController()?.process(frame);\n\n\t\t\t\tthis._animateWebXR();\n\t\t\t};\n\t\t\trenderer.setAnimationLoop(xrCallback);\n\t\t} else {\n\t\t\tthis._animateWeb();\n\t\t}\n\t}\n\tprivate _cancelAnimate() {\n\t\tif (this.isXR()) {\n\t\t\t(this._renderer as WebGLRenderer)?.setAnimationLoop(null);\n\t\t} else {\n\t\t\tthis._cancelAnimateCommon();\n\t\t}\n\t}\n\n\tprotected _animateWebBound: () => void = this._animateWeb.bind(this);\n\tprotected _animateWeb() {\n\t\tthis._requestAnimationFrameId = requestAnimationFrame(this._animateWebBound);\n\t\tthis.__animateCommon__();\n\t}\n\tprivate _animateWebXR() {\n\t\tthis.__animateCommon__();\n\t}\n\tprivate _accumulatedDelta = 0;\n\tprotected __animateCommon__() {\n\t\tconst delta = this._scene.timeController.updateClockDelta();\n\t\tif (this._FPSConfig) {\n\t\t\tthis._accumulatedDelta += delta;\n\t\t\tif (!isDeltaValid(this._accumulatedDelta, this._FPSConfig)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._accumulatedDelta = 0;\n\t\t}\n\n\t\tthis._tickAndRender(delta);\n\t}\n\n\tprivate _cancelAnimateCommon() {\n\t\tthis._doRender = false;\n\t\tif (this._requestAnimationFrameId != null) {\n\t\t\tcancelAnimationFrame(this._requestAnimationFrameId);\n\t\t\tthis._requestAnimationFrameId = undefined;\n\t\t}\n\t\tif (this._canvas) {\n\t\t\t// this._cameraNode.renderController().deleteRenderer(this._canvas);\n\t\t}\n\t}\n\n\tprotected override _tick(delta: number) {\n\t\tsuper._tick(delta);\n\t\tthis._markerTrackingConfig?.renderFunction();\n\t}\n\n\t/**\n\t * returns the current renderer\n\t *\n\t *\n\t */\n\trenderer() {\n\t\treturn this._renderer;\n\t\t// if (this._canvas) {\n\t\t// \t// return this._cameraNode.renderController().renderer(this._canvas);\n\t\t// }\n\t}\n\teffectComposer() {\n\t\treturn this._effectComposer;\n\t}\n\tpreCompile() {\n\t\tif (!this._renderer) {\n\t\t\treturn;\n\t\t}\n\t\t// if (this._canvas) {\n\t\tthis._renderer.compile(this._scene.threejsScene(), this._camera);\n\t\t// }\n\t}\n\toverride markAsReady() {\n\t\tthis.preCompile();\n\t\tthis.setAutoRender(true);\n\t}\n\n\t//\n\t//\n\t// resize\n\t//\n\t//\n\tprivate _onResizeBound = this.onResize.bind(this);\n\tonResize() {\n\t\tconst renderUpdateRequired = this.updateSize();\n\t\tif (!renderUpdateRequired) {\n\t\t\treturn;\n\t\t}\n\t\tthis._updateRendererSize();\n\t\tif (this._renderFunc) {\n\t\t\tthis._renderFunc(this.scene().timeController.delta());\n\t\t}\n\t\tthis._runOnResizeCallbacks();\n\t}\n\n\toverride updateSize(): boolean {\n\t\tconst renderer = this._renderer;\n\n\t\tif (!renderer) {\n\t\t\treturn false;\n\t\t}\n\t\tconst pixelRatio = renderer.getPixelRatio();\n\t\tthis.camerasController().computeSizeAndAspect(pixelRatio);\n\t\tconst size = this.camerasController().size;\n\t\tif (this._size.equals(size)) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._size.copy(size);\n\t\tthis._scene.viewersRegister.markViewerAsSizeUpdated(this);\n\t\treturn true;\n\t}\n\tprivate _updateRendererSize() {\n\t\tconst canvas = this._canvas;\n\t\tif (!canvas) {\n\t\t\treturn;\n\t\t}\n\t\tCoreCameraRendererController.setRendererSize(canvas, this._size);\n\t\tthis._cssRendererConfig?.cssRenderer.setSize(this._size.x, this._size.y);\n\t\tthis._effectComposer?.setSize(this._size.x, this._size.y);\n\t\tthis.camerasController().updateCameraAspect();\n\t}\n\tprivate _listenToWindowResize() {\n\t\t// window.addEventListener('resize', this._onResizeBound, false);\n\t}\n\tprivate _unlistenToWindowResize() {\n\t\t// window.removeEventListener('resize', this._onResizeBound, false);\n\t}\n\tprivate _createResizeObserver(canvasElementParent: HTMLElement) {\n\t\tthis._disposeResizeObserver();\n\t\tthis._resizeObserver = new ResizeObserver(this._onResizeBound);\n\t\tthis._resizeObserver.observe(canvasElementParent, {box: 'border-box'});\n\t\t// this.onResize();\n\t}\n\tprivate _disposeResizeObserver() {\n\t\tif (this._resizeObserver) {\n\t\t\tthis._resizeObserver.disconnect();\n\t\t\tthis._resizeObserver = undefined;\n\t\t}\n\t}\n}\n","import {Vector2} from 'three';\nimport {BaseViewerType} from '../_Base';\n\nexport class ViewerCamerasController {\n\tprivate _size: Vector2 = new Vector2(100, 100);\n\tprivate _aspect: number = 1;\n\n\tconstructor(private _viewer: BaseViewerType) {}\n\n\tcamera() {\n\t\treturn this._viewer.camera();\n\t}\n\tget size() {\n\t\treturn this._size;\n\t}\n\tget aspect() {\n\t\treturn this._aspect;\n\t}\n\n\tcomputeSizeAndAspect(pixelRatio: number) {\n\t\tthis._updateSize();\n\t\tthis._viewer.scene().uniformsController.updateResolution(this._size, pixelRatio);\n\t\tthis._aspect = this._getAspect();\n\t}\n\n\tprivate _updateSize() {\n\t\tthis._size.x = this._viewer.domElement()?.offsetWidth || 0;\n\t\tthis._size.y = this._viewer.domElement()?.offsetHeight || 0;\n\t}\n\tprivate _getAspect(): number {\n\t\treturn this._size.x / this._size.y;\n\t}\n\n\tupdateCameraAspect() {\n\t\tthis._viewer.updateCameraAspect(this._aspect, this._size);\n\t}\n\n\tasync prepareCurrentCamera() {\n\t\tawait this._updateFromCameraContainer();\n\t}\n\n\tasync _updateFromCameraContainer() {\n\t\tthis.updateCameraAspect();\n\t}\n}\n","export function allowCanvasKeyEventsListener(canvas: HTMLCanvasElement) {\n\tcanvas.setAttribute('tabindex', '0');\n}\n","import {CoreEventEmitter, EmitterElementOrWindow} from './CoreEventEmitter';\nimport {EventData} from './EventData';\nimport {WindowEventType} from './WindowEventType';\n\nfunction elementFromEmitterType(emitter: CoreEventEmitter, canvas: HTMLCanvasElement) {\n\treturn emitter == CoreEventEmitter.CANVAS ? canvas : document;\n}\n\nexport function getEventEmitter(eventData: EventData, canvas: HTMLCanvasElement): EmitterElementOrWindow {\n\tif (eventData.type == WindowEventType.resize) {\n\t\treturn window;\n\t} else {\n\t\treturn elementFromEmitterType(eventData.emitter, canvas);\n\t}\n}\n","import {BaseViewerType} from '../_Base';\nimport {BaseSceneEventsControllerType} from '../../scene/utils/events/_BaseEventsController';\nimport {EventContext} from '../../../../src/core/event/EventContextType';\nimport {EmitterElementOrWindow} from '../../../core/event/CoreEventEmitter';\nimport {ACCEPTED_KEYBOARD_EVENT_TYPES, KeyboardEventType} from '../../../core/event/KeyboardEventType';\nimport {allowCanvasKeyEventsListener} from '../../../core/event/CanvasKeyFocus';\nimport {getEventEmitter} from '../../../core/event/EventEmitter';\nimport {EventData, EventType} from '../../../core/event/EventData';\nimport {setToArray} from '../../../core/SetUtils';\ntype ViewerEventListener = (e: Event) => void;\ninterface EventListenerWithData {\n\tlistener: ViewerEventListener;\n\tdata: EventData;\n}\ntype ListenerByEventType = Map<EventType, EventListenerWithData>;\nconst DEBUG = false;\nconst _eventTypesSet: Set<string> = new Set();\n// let listenerId: number = 0;\n\nexport class ViewerEventsController {\n\tprotected _eventTypes: Map<string, Map<EmitterElementOrWindow, ListenerByEventType>> = new Map();\n\n\tconstructor(protected viewer: BaseViewerType) {}\n\n\tremoveEvents(eventsController: BaseSceneEventsControllerType, _canvas?: HTMLCanvasElement) {\n\t\tconst canvas = _canvas || this.canvas();\n\t\tif (!canvas) {\n\t\t\tconsole.warn('no canvas found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst mapForController = this._eventTypes.get(eventsController.type());\n\t\tif (!mapForController) {\n\t\t\treturn;\n\t\t}\n\t\tmapForController.forEach((listenerByEventType, emitter) => {\n\t\t\tlistenerByEventType.forEach((listenerWithData, eventType: EventType) => {\n\t\t\t\tconst eventEmitter = getEventEmitter({emitter: listenerWithData.data.emitter, type: eventType}, canvas);\n\t\t\t\teventEmitter.removeEventListener(eventType, listenerWithData.listener);\n\t\t\t});\n\t\t\tlistenerByEventType.clear();\n\t\t});\n\t}\n\n\tupdateEvents(eventsController: BaseSceneEventsControllerType) {\n\t\tif (DEBUG) {\n\t\t\tconsole.warn('------------ updateEvents START:', eventsController);\n\t\t}\n\t\tconst canvas = this.canvas();\n\t\tif (!canvas) {\n\t\t\tconsole.warn('no canvas found');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.removeEvents(eventsController, canvas);\n\n\t\t// const listener = (event: Event) => {\n\t\t// \tthis.processEvent(event, eventsController, canvas);\n\t\t// };\n\t\tconst activeEventDatas = eventsController.activeEventDatas();\n\t\tfor (const eventData of activeEventDatas) {\n\t\t\tconst eventEmitter = getEventEmitter(eventData, canvas);\n\t\t\tconst map = this._mapForEmitter(eventsController, eventEmitter);\n\t\t\tconst eventType = eventData.type;\n\n\t\t\tconst _processEvent = (\n\t\t\t\tevent: Event,\n\t\t\t\tcontroller: BaseSceneEventsControllerType\n\t\t\t\t// canvas: HTMLCanvasElement\n\t\t\t) => {\n\t\t\t\tconst eventContext: EventContext<Event> = {\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tevent: event,\n\t\t\t\t\temitter: eventData.emitter,\n\t\t\t\t\t// camera: this.camera(),\n\t\t\t\t};\n\t\t\t\tcontroller.processEvent(eventContext);\n\t\t\t};\n\t\t\t// listenerId++;\n\t\t\t// const _id = listenerId;\n\t\t\tconst listener = (event: Event) => {\n\t\t\t\t// console.log('run listener:', _id, eventType);\n\t\t\t\t_processEvent(event, eventsController /*, canvas*/);\n\t\t\t};\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log('+ add event:', eventType, eventEmitter);\n\t\t\t}\n\t\t\teventEmitter.addEventListener(eventType, listener, {passive: true});\n\n\t\t\t// if the event being added is a keyboard type,\n\t\t\t// we need to add tabindex to the canvas to allow it to have focus\n\t\t\tif (eventEmitter != document) {\n\t\t\t\tif (ACCEPTED_KEYBOARD_EVENT_TYPES.includes(eventData.type as KeyboardEventType)) {\n\t\t\t\t\tallowCanvasKeyEventsListener(eventEmitter as HTMLCanvasElement);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmap.set(eventData.type, {listener, data: eventData});\n\t\t}\n\t\tif (DEBUG) {\n\t\t\tconsole.log('------------ updateEvents DONE:');\n\t\t}\n\t}\n\tprivate _mapForEmitter(eventsController: BaseSceneEventsControllerType, emitter: EmitterElementOrWindow) {\n\t\tconst controllerType = eventsController.type();\n\t\tlet mapForController = this._eventTypes.get(controllerType);\n\t\tif (!mapForController) {\n\t\t\tmapForController = new Map();\n\t\t\tthis._eventTypes.set(controllerType, mapForController);\n\t\t}\n\t\tlet mapForEmitter = mapForController.get(emitter);\n\t\tif (!mapForEmitter) {\n\t\t\tmapForEmitter = new Map();\n\t\t\tmapForController.set(emitter, mapForEmitter);\n\t\t}\n\t\treturn mapForEmitter;\n\t}\n\n\tcamera() {\n\t\treturn this.viewer.camera();\n\t}\n\tcanvas() {\n\t\treturn this.viewer.canvas();\n\t}\n\n\tinit() {\n\t\tif (!this.canvas()) {\n\t\t\tconsole.warn('no canvas found for eventsController');\n\t\t\treturn;\n\t\t}\n\t\tthis.viewer.scene().eventsDispatcher.traverseControllers((controller) => {\n\t\t\tthis.updateEvents(controller);\n\t\t});\n\t}\n\n\tunmount() {\n\t\tthis.viewer.scene().eventsDispatcher.traverseControllers((controller) => {\n\t\t\tthis.removeEvents(controller);\n\t\t});\n\t}\n\n\tregisteredEventTypes(): string[] {\n\t\t_eventTypesSet.clear();\n\t\tthis._eventTypes.forEach((mapForEmitter) => {\n\t\t\tmapForEmitter.forEach((listenerByEventType, emitter) => {\n\t\t\t\tlistenerByEventType.forEach((listener, eventType: string) => {\n\t\t\t\t\t_eventTypesSet.add(eventType);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\tconst target: string[] = [];\n\t\tsetToArray(_eventTypesSet, target);\n\t\treturn target;\n\t}\n}\n","import {BaseViewerType} from '../_Base';\n\nexport class ViewerWebGLController {\n\tpublic request_animation_frame_id: number | undefined;\n\n\tconstructor(protected viewer: BaseViewerType) {}\n\n\tinit() {\n\t\tconst canvas = this.viewer.canvas();\n\t\tif (canvas) {\n\t\t\tcanvas.onwebglcontextlost = this._on_webglcontextlost.bind(this);\n\t\t\tcanvas.onwebglcontextrestored = this._on_webglcontextrestored.bind(this);\n\t\t}\n\t}\n\n\tprotected _on_webglcontextlost() {\n\t\tconsole.warn('context lost at frame', this.viewer.scene().frame());\n\t\t// event.preventDefault();\n\t\tif (this.request_animation_frame_id) {\n\t\t\tcancelAnimationFrame(this.request_animation_frame_id);\n\t\t} else {\n\t\t\tconsole.warn('request_animation_frame_id not initialized');\n\t\t}\n\t\tconsole.warn('not canceled', this.request_animation_frame_id);\n\t}\n\tprotected _on_webglcontextrestored() {\n\t\tconsole.log('context restored');\n\t}\n}\n","// import {Camera} from 'three';\nimport {isBooleanTrue} from '../../../core/Type';\nimport {RootManagerNode} from '../../nodes/manager/Root';\nimport {BaseViewerType} from '../_Base';\n\nconst ICON = {\n\tON: `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"soundOn h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" />\n  </svg>`,\n\tOFF: `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"soundOff h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" clip-rule=\"evenodd\" />\n\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\" />\n  </svg>`,\n};\n\nexport class ViewerAudioController {\n\tprivate __iconContainer: HTMLElement | undefined;\n\tprivate _onIcon: HTMLElement | undefined;\n\tprivate _offIcon: HTMLElement | undefined;\n\tconstructor(private _viewer: BaseViewerType) {}\n\n\tupdate() {\n\t\tconst root = this._viewer.scene().root();\n\n\t\tif (isBooleanTrue(root.pv.displayAudioIcon)) {\n\t\t\tthis._showIcon();\n\t\t\tthis._updateIcon(root);\n\t\t} else {\n\t\t\tthis._hideIcon();\n\t\t}\n\t}\n\tunmount() {\n\t\tif (this.__iconContainer) {\n\t\t\tthis.__iconContainer.parentElement?.removeChild(this.__iconContainer);\n\t\t\tthis.__iconContainer = undefined;\n\t\t}\n\t\tthis._onIcon = undefined;\n\t\tthis._offIcon = undefined;\n\t}\n\n\tprivate _showIcon() {\n\t\tconst element = this._iconContainer();\n\t\tif (element) {\n\t\t\telement.style.display = 'block';\n\t\t}\n\t}\n\tprivate _hideIcon() {\n\t\tif (this.__iconContainer) {\n\t\t\tthis.__iconContainer.style.display = 'none';\n\t\t}\n\t}\n\n\tprivate _iconContainer() {\n\t\tconst createIconContainer = () => {\n\t\t\tconst element = this._createIconContainer();\n\t\t\tconst domElement = this._viewer.domElement();\n\t\t\tif (!domElement) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdomElement.append(element);\n\t\t\treturn element;\n\t\t};\n\t\treturn (this.__iconContainer = this.__iconContainer || createIconContainer());\n\t}\n\tprivate _createIconContainer() {\n\t\tconst element = document.createElement('div');\n\n\t\telement.addEventListener('pointerdown', (event) => {\n\t\t\tthis._toggleSound();\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn false;\n\t\t});\n\n\t\treturn element;\n\t}\n\tprivate _setIconContainerStyle(element: HTMLElement, root: RootManagerNode) {\n\t\t// const style = 'position: absolute; top: 10px; right: 10px; width: 24px; height: 24px; cursor: pointer'\n\t\tconst style = root.pv.audioIconStyle;\n\t\telement.setAttribute('style', style);\n\t\telement.style.color = root.pv.audioIconColor.getStyle();\n\t\t// element.style.position = 'absolute';\n\t\t// element.style.top = '10px';\n\t\t// element.style.right = '10px';\n\t\t// element.style.width = '24px';\n\t\t// element.style.height = '24px';\n\t\t// element.style.cursor = 'pointer';\n\t}\n\n\tprivate offIcon() {\n\t\tfunction createIcon() {\n\t\t\tconst icon = document.createElement('div');\n\t\t\ticon.innerHTML = ICON.OFF;\n\t\t\treturn icon.children[0] as HTMLElement;\n\t\t}\n\t\treturn (this._offIcon = this._offIcon || createIcon());\n\t}\n\tprivate onIcon() {\n\t\tfunction createIcon() {\n\t\t\tconst icon = document.createElement('div');\n\t\t\ticon.innerHTML = ICON.ON;\n\t\t\treturn icon.children[0] as HTMLElement;\n\t\t}\n\t\treturn (this._onIcon = this._onIcon || createIcon());\n\t}\n\tprivate _toggleSound() {\n\t\tconst root = this._viewer.scene().root();\n\t\troot.audioController.toggleSound();\n\t\tthis._updateIcon(root);\n\t}\n\tprivate _updateIcon(root: RootManagerNode) {\n\t\tconst container = this._iconContainer();\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\t\tthis._setIconContainerStyle(container, root);\n\t\tconst onIcon = this.onIcon();\n\t\tconst offIcon = this.offIcon();\n\t\tif (this._viewer.scene().root().audioController.soundOn()) {\n\t\t\tcontainer.appendChild(onIcon);\n\t\t\toffIcon.parentElement?.removeChild(offIcon);\n\t\t} else {\n\t\t\tcontainer.appendChild(offIcon);\n\t\t\tonIcon.parentElement?.removeChild(onIcon);\n\t\t}\n\t}\n}\n","import type {BaseViewerType} from '../_Base';\nimport type {Vector2Like} from '../../../types/GlobalTypes';\nimport type {PointerEventsController} from '../../scene/utils/events/PointerEventsController';\n\nexport class ViewerRaycastersController {\n\tpointerEventsController: PointerEventsController;\n\tconstructor(protected viewer: BaseViewerType) {\n\t\tconst scene = this.viewer.scene();\n\t\tthis.pointerEventsController = scene.eventsDispatcher.pointerEventsController;\n\n\t\tthis.pointerEventsController.setRaycaster(viewer.createRaycaster());\n\t}\n\n\tsetCursor0(cursor: Vector2Like) {\n\t\tthis.pointerEventsController.cursor().value.set(cursor.x, cursor.y);\n\t}\n\traycaster0() {\n\t\treturn this.pointerEventsController.raycaster().value;\n\t}\n\n\tupdateRaycasters() {\n\t\tthis.pointerEventsController\n\t\t\t.raycaster()\n\t\t\t.value.setFromCamera(this.pointerEventsController.cursor().value, this.viewer.camera());\n\t}\n}\n","import {DESIRED_FPS} from '../../scene/utils/TimeController';\nimport {BaseViewerType} from '../_Base';\n\nfunction _round(perf: number) {\n\treturn Math.round(perf * 10);\n}\n\nexport class ViewerPerformanceMonitor {\n\tconstructor(protected viewer: BaseViewerType) {}\n\n\tprotected _accumulatedDelta = 0;\n\tprotected _framesCount = 0;\n\tprotected _lastRoundedPerf = _round(1);\n\tmeasurePerformance(delta: number) {\n\t\tthis._accumulatedDelta += delta;\n\t\tif (this._accumulatedDelta >= 1) {\n\t\t\tconst perf = this._framesCount / DESIRED_FPS;\n\t\t\tconst roundedPerf = _round(perf);\n\t\t\tif (roundedPerf != this._lastRoundedPerf) {\n\t\t\t\tthis._lastRoundedPerf = roundedPerf;\n\t\t\t\tthis.viewer.scene().perfMonitor.onPerformanceChange(perf);\n\t\t\t}\n\t\t\tthis._framesCount = 0;\n\t\t\tthis._accumulatedDelta = 0;\n\t\t}\n\t\tthis._framesCount++;\n\t}\n}\n","import {ApplicableControlsNode} from './../../core/camera/CoreCameraControlsController';\nimport {createRaycaster} from './../../core/RaycastHelper';\nimport {ViewerCamerasController} from './utils/ViewerCamerasController';\nimport {ViewerControlsController} from './utils/ViewerControlsController';\nimport {ViewerEventsController} from './utils/ViewerEventsController';\nimport {ViewerWebGLController} from './utils/ViewerWebglController';\nimport {ViewerAudioController} from './utils/ViewerAudioController';\nimport {Camera, Object3D, Vector2} from 'three';\nimport {PolyScene} from '../scene/PolyScene';\nimport {Poly, PolyEngine} from '../Poly';\nimport {AbstractRenderer} from './Common';\nimport {ViewerRaycastersController} from './utils/ViewerRaycastersController';\nimport {ViewerPerformanceMonitor} from './utils/ViewerPerformanceMonitor';\nimport {AvailableRenderConfig} from '../../core/camera/CoreCameraRendererController';\nimport {MouseHelper} from '../../core/event/MouseHelper';\n\nconst HOVERED_CLASS_NAME = 'hovered';\n\ntype ViewerTickCallback = (delta: number) => void;\ntype ViewerRenderCallback = (delta: number, renderer: AbstractRenderer) => void;\ntype ViewerBaseCallback = ViewerTickCallback | ViewerRenderCallback;\ntype OnResizeCallback = (width: number, height: number) => void;\ninterface BaseViewerCallbackOptions {\n\tpersistent?: boolean;\n}\ninterface ViewerCallbackContainer<T extends ViewerBaseCallback> {\n\tcallback: T;\n\toptions: BaseViewerCallbackOptions;\n}\ntype ViewerCallbacksMap<T extends ViewerBaseCallback> = Map<string, ViewerCallbackContainer<T>>;\nexport interface HTMLElementWithViewer<C extends Camera> extends HTMLElement {\n\tscene: PolyScene;\n\tviewer: TypedViewer<C>;\n\tPoly: PolyEngine;\n}\ntype UpdateCameraAspectCallback = (aspect: number, resolution: Vector2) => void;\n\nexport interface CreateViewerOptions {\n\tcanvas?: HTMLCanvasElement;\n\tautoRender?: boolean;\n\trenderer?: AbstractRenderer;\n\tcameraMaskOverride?: string;\n}\nexport interface TypedViewerOptions<C extends Camera> extends CreateViewerOptions {\n\tcamera: C;\n\tscene: PolyScene;\n\tupdateCameraAspect: UpdateCameraAspectCallback;\n}\nexport interface TypedViewerInterectionObserverChangeOptions {\n\troot?: HTMLElement;\n\trootMargin?: string;\n\tthreshold?: number;\n\tplayPauseScene?: boolean;\n\tonChange?: (isIntersecting: boolean) => void;\n}\nexport interface BaseViewerMountOptions {\n\tupdateAutoRenderOnIntersectionChange?: boolean;\n}\ntype RenderFuncWithDelta = (delta: number) => void;\ntype RenderFunc = () => void;\n\n/**\n *\n *\n * Base class to create a viewer. It is used for the [Threejs viewer](/docs/api/ThreejsViewer) as well as the [Mapbox Viewer](https://github.com/polygonjs/plugin-mapbox)\n *\n */\nexport abstract class TypedViewer<C extends Camera> {\n\t// protected _display_scene: Scene;\n\t// protected _canvas: HTMLCanvasElement | undefined;\n\tprotected _domElement: HTMLElementWithViewer<C> | undefined;\n\tprotected _active: boolean = false;\n\tprivate static _nextViewerId = 0;\n\tprivate _id: Readonly<string>;\n\tprotected _renderObjectOverride: Object3D | undefined;\n\tprotected _canvas: HTMLCanvasElement | undefined;\n\tprotected _camera: C;\n\tprotected _scene: PolyScene;\n\tpublic readonly updateCameraAspect: UpdateCameraAspectCallback;\n\tprotected _doRender: boolean = true;\n\tprotected _controlsNode: ApplicableControlsNode | undefined;\n\tprotected _renderFunc: RenderFuncWithDelta | undefined;\n\tprotected _renderCSSFunc: RenderFunc | undefined;\n\tprotected _renderer: AbstractRenderer | undefined;\n\n\tconstructor(options: TypedViewerOptions<C>) {\n\t\tthis._id = TypedViewer._nextId();\n\t\tthis._camera = options.camera;\n\t\tthis._scene = options.scene;\n\t\tthis._canvas = options.canvas;\n\t\tif (options.autoRender != null) {\n\t\t\tthis._doRender = options.autoRender;\n\t\t}\n\t\tthis.updateCameraAspect = options.updateCameraAspect;\n\t\tthis.scene().viewersRegister.registerViewer(this);\n\n\t\t// init in constructor to ensure scene is present in viewer\n\t\tthis.raycastersController = new ViewerRaycastersController(this);\n\t}\n\tprivate static _nextId() {\n\t\treturn `${TypedViewer._nextViewerId++}`;\n\t}\n\tcreateRaycaster() {\n\t\treturn createRaycaster();\n\t}\n\tabstract renderer(): AbstractRenderer | undefined;\n\tabstract rendererConfig(): AvailableRenderConfig | undefined;\n\n\tprotected _mounted = false;\n\t/**\n\t * mounts the viewer onto an element\n\t *\n\t *\n\t */\n\tmount(element: HTMLElement, options?: BaseViewerMountOptions) {\n\t\tlet updateAutoRenderOnIntersectionChange = true;\n\t\tif (options && options.updateAutoRenderOnIntersectionChange != null) {\n\t\t\tupdateAutoRenderOnIntersectionChange = options.updateAutoRenderOnIntersectionChange;\n\t\t}\n\n\t\tthis._domElement = element as HTMLElementWithViewer<C>;\n\t\tthis._domElement.viewer = this;\n\t\tthis._domElement.scene = this._scene;\n\t\tthis._domElement.Poly = Poly;\n\t\tif (updateAutoRenderOnIntersectionChange) {\n\t\t\tthis.updateAutoRenderOnIntersectionChange({playPauseScene: true});\n\t\t}\n\t\tthis.controlsController().mount();\n\t\tthis._mounted = true;\n\t}\n\t/**\n\t * unmounts the viewer\n\t *\n\t *\n\t */\n\tunmount() {\n\t\tif (!this._domElement) {\n\t\t\treturn;\n\t\t}\n\t\t// let childElement: Element | undefined;\n\t\t// while ((childElement = this._domElement.children[0])) {\n\t\t// \tthis._domElement.removeChild(childElement);\n\t\t// }\n\t\t// when unmounting, it is very unsafe to remove all HTMLElements\n\t\t// that have been created inside _domElement\n\t\t// as those could have been created by an app specific code\n\t\t// OR... those could have been created when an element is shared by multiple scenes\n\t\t// at different times\n\t\tthis._audioController?.unmount();\n\t\tconst canvas = this.canvas();\n\t\tcanvas.parentElement?.removeChild(canvas);\n\t\tthis.eventsController().unmount();\n\t\tthis.controlsController().unmount();\n\n\t\tthis._mounted = false;\n\t}\n\tstatic _canvasIdPrefix() {\n\t\treturn 'TypedViewer';\n\t}\n\tstatic createCanvas(id?: string) {\n\t\tid = id || TypedViewer._nextId();\n\t\tconst canvas = Poly.canvasRegister.findOrCreateCanvas();\n\t\tcanvas.id = `${this._canvasIdPrefix()}_${id}`;\n\t\tcanvas.style.display = 'block';\n\t\tcanvas.style.outline = 'none';\n\t\t// we add 100% to the width and height\n\t\t// to make it easy for the canvas to not grow larger\n\t\t// than its container, without requiring css to enforce this\n\t\tcanvas.style.width = '100%';\n\t\tcanvas.style.height = '100%';\n\n\t\t// This gets rid of an annoying popup showing an option to copy the image.\n\t\t// when doing a long press on touch device\n\t\tcanvas.addEventListener('contextmenu', (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\treturn canvas;\n\t}\n\n\tcontrolsNode() {\n\t\treturn this._controlsNode;\n\t}\n\t/**\n\t * return the canvas and create one if none yet\n\t *\n\t *\n\t */\n\tcanvas() {\n\t\treturn (this._canvas = this._canvas || TypedViewer.createCanvas(this._id));\n\t}\n\n\tprotected _tickAndRender(delta: number) {\n\t\tthis._tick(delta);\n\t\tthis.render(delta);\n\t\tthis._postRender(delta);\n\t}\n\tprotected _tick(delta: number) {\n\t\t// updating the camera controls\n\t\t// must be done before the actor nodes are run.\n\t\t// otherwise, we are bound to fetch an out of date camera matrix.\n\t\tthis.controlsController().update(delta);\n\t\t//\n\t\tthis.raycastersController.updateRaycasters();\n\t\t//\n\t\tthis._runOnBeforeTickCallbacks(delta);\n\t\tthis.scene().update(delta);\n\t\tthis._runOnAfterTickCallbacks(delta);\n\t}\n\trender(delta: number) {\n\t\tif (!this._doRender) {\n\t\t\treturn;\n\t\t}\n\t\t// if (this._canvas) {\n\t\t// super.render(delta);\n\t\tconst renderer = this._renderer;\n\t\tif (!renderer) {\n\t\t\tconsole.error('render: no renderer');\n\t\t\treturn;\n\t\t}\n\n\t\tthis._runOnBeforeRenderCallbacks(delta, renderer);\n\t\tif (this._renderFunc) {\n\t\t\tthis._renderFunc(delta);\n\t\t}\n\t\tif (this._renderCSSFunc) {\n\t\t\tthis._renderCSSFunc();\n\t\t}\n\t\t// this.controlsController().update(delta);\n\t\tthis._runOnAfterRenderCallbacks(delta, renderer);\n\t\t// } else {\n\t\t// \tconsole.warn('no canvas to render onto');\n\t\t// }\n\t}\n\tprotected _postRender(delta: number) {\n\t\tthis._scene.viewersRegister.markViewerAsRendered(this);\n\t\tif (this.scene().timeController.playing()) {\n\t\t\tthis.performanceMonitor.measurePerformance(delta);\n\t\t}\n\t}\n\n\tsetRenderObjectOverride(object?: Object3D | null) {\n\t\tif (object) {\n\t\t\tthis._renderObjectOverride = object;\n\t\t} else {\n\t\t\tthis._renderObjectOverride = undefined;\n\t\t}\n\t}\n\n\tactive() {\n\t\treturn this._active;\n\t}\n\tactivate() {\n\t\tthis._active = true;\n\t}\n\tdeactivate() {\n\t\tthis._active = false;\n\t}\n\n\tprotected _camerasController: ViewerCamerasController | undefined;\n\tcamerasController(): ViewerCamerasController {\n\t\treturn (this._camerasController = this._camerasController || new ViewerCamerasController(this));\n\t}\n\tprotected _controlsController: ViewerControlsController<C> = new ViewerControlsController(this);\n\tcontrolsController() {\n\t\treturn this._controlsController;\n\t}\n\tprotected _eventsController: ViewerEventsController | undefined;\n\teventsController(): ViewerEventsController {\n\t\treturn (this._eventsController = this._eventsController || new ViewerEventsController(this));\n\t}\n\tprotected _webGLController: ViewerWebGLController | undefined;\n\twebglController(): ViewerWebGLController {\n\t\treturn (this._webGLController = this._webGLController || new ViewerWebGLController(this));\n\t}\n\tprivate _audioController: ViewerAudioController | undefined;\n\taudioController(): ViewerAudioController {\n\t\treturn (this._audioController = this._audioController || new ViewerAudioController(this));\n\t}\n\tpublic readonly raycastersController: ViewerRaycastersController;\n\tpublic readonly performanceMonitor: ViewerPerformanceMonitor = new ViewerPerformanceMonitor(this);\n\n\tdomElement() {\n\t\treturn this._domElement;\n\t}\n\tscene() {\n\t\treturn this._scene;\n\t}\n\n\t/**\n\t * return the camera the viewer was created with\n\t *\n\t *\n\t */\n\tcamera() {\n\t\treturn this._camera;\n\t}\n\t// cameraControlsController(): ThreejsCameraControlsController | undefined {\n\t// \treturn undefined;\n\t// }\n\tid() {\n\t\treturn this._id;\n\t}\n\tprotected _size = new Vector2();\n\tsize(target: Vector2) {\n\t\ttarget.copy(this._size);\n\t}\n\tupdateSize() {}\n\n\t/**\n\t * disposes the viewer\n\t *\n\t *\n\t */\n\tdispose() {\n\t\tthis._scene.viewersRegister.unregisterViewer(this);\n\t\tthis.controlsController().unmount();\n\t\tif (!this._domElement) {\n\t\t\treturn;\n\t\t}\n\t\tlet child: Element;\n\t\twhile ((child = this._domElement.children[0])) {\n\t\t\tthis._domElement.removeChild(child);\n\t\t}\n\t}\n\n\t// html container class\n\tresetContainerClass() {\n\t\tthis.domElement()?.classList.remove(HOVERED_CLASS_NAME);\n\t}\n\tsetContainerClassHovered() {\n\t\tthis.domElement()?.classList.add(HOVERED_CLASS_NAME);\n\t}\n\tmarkAsReady() {}\n\n\t/**\n\t * sets auto render state. If falls, the viewer will not render.\n\t *\n\t *\n\t */\n\tsetAutoRender(state = true) {\n\t\tthis._doRender = state;\n\t}\n\tautoRenderState(): boolean {\n\t\treturn this._doRender;\n\t}\n\n\t//\n\t//\n\t// Visibility detection\n\t//\n\t//\n\tprivate _observer: IntersectionObserver | undefined;\n\t/**\n\t * This sets the viewer to detect if it is visible, and to pause/unpause itself when its visibility changes.\n\t * This can be very useful to improve performance.\n\t *\n\t */\n\tupdateAutoRenderOnIntersectionChange(_options: TypedViewerInterectionObserverChangeOptions) {\n\t\tif (!this._domElement) {\n\t\t\tconsole.warn('cannot apply');\n\t\t\treturn;\n\t\t}\n\t\tlet {threshold, root, rootMargin, playPauseScene, onChange} = _options;\n\t\tif (threshold == null) {\n\t\t\tthreshold = 0.01;\n\t\t}\n\t\tconst observerOptions: IntersectionObserverInit = {\n\t\t\troot,\n\t\t\trootMargin,\n\t\t\tthreshold,\n\t\t};\n\t\tconst onObserverChange: IntersectionObserverCallback = (entries, observer) => {\n\t\t\tif (!this._scene.loadingController.loaded()) {\n\t\t\t\t// we must check that the scene is loaded before\n\t\t\t\t// calling .play(),\n\t\t\t\t// otherwise, the scene will start playing as soon\n\t\t\t\t// as the viewer is created,\n\t\t\t\t// even if we have the option .autoPlay=false in the loading options\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tconst isVisible: boolean = entry.isIntersecting;\n\t\t\t\tthis.setAutoRender(isVisible);\n\t\t\t\tif (playPauseScene) {\n\t\t\t\t\tif (isVisible) {\n\t\t\t\t\t\tthis._scene.play();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._scene.pause();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (onChange) {\n\t\t\t\t\tonChange(isVisible);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tthis.disableUpdateAutoRenderOnIntersectionChange();\n\t\tthis._observer = new IntersectionObserver(onObserverChange, observerOptions);\n\t\tthis._observer.observe(this._domElement);\n\t}\n\t/**\n\t * Cancels the listening of the viewer's visibility.\n\t *\n\t */\n\tdisableUpdateAutoRenderOnIntersectionChange() {\n\t\tif (!this._domElement) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._observer) {\n\t\t\treturn;\n\t\t}\n\t\tthis._observer.unobserve(this._domElement);\n\t}\n\n\t//\n\t//\n\t// RESIZE CALLBACKS\n\t//\n\t//\n\tprotected _onResizeCallbacks: OnResizeCallback[] | undefined;\n\tregisterOnResizeCallback(callback: OnResizeCallback) {\n\t\tthis._onResizeCallbacks = this._onResizeCallbacks || [];\n\t\tthis._onResizeCallbacks.push(callback);\n\t}\n\tunregisterOnResizeCallback(callback: OnResizeCallback) {\n\t\tif (!this._onResizeCallbacks) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = this._onResizeCallbacks.indexOf(callback);\n\t\tif (index >= 0) {\n\t\t\tthis._onResizeCallbacks.splice(index, 1);\n\t\t}\n\t\tif (this._onResizeCallbacks.length == 0) {\n\t\t\tthis._onResizeCallbacks = undefined;\n\t\t}\n\t}\n\tprotected _runOnResizeCallbacks() {\n\t\tconst canvas = this.canvas();\n\t\tif (canvas) {\n\t\t\tMouseHelper.resetCacheForCanvas(canvas);\n\t\t}\n\t\tif (!this._onResizeCallbacks) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const callback of this._onResizeCallbacks) {\n\t\t\tcallback(this._size.x, this._size.y);\n\t\t}\n\t}\n\n\t//\n\t//\n\t// CALLBACKS\n\t//\n\t//\n\t// tick callbacks\n\tprivate _onBeforeTickCallbacksMap: ViewerCallbacksMap<ViewerTickCallback> | undefined;\n\tprivate _onAfterTickCallbacksMap: ViewerCallbacksMap<ViewerTickCallback> | undefined;\n\tprotected _onBeforeTickCallbacks: Array<ViewerTickCallback> = [];\n\tprotected _onAfterTickCallbacks: Array<ViewerTickCallback> = [];\n\t// render callbacks\n\tprivate _onBeforeRenderCallbacksMap: ViewerCallbacksMap<ViewerRenderCallback> | undefined;\n\tprivate _onAfterRenderCallbacksMap: ViewerCallbacksMap<ViewerRenderCallback> | undefined;\n\tprotected _onBeforeRenderCallbacks: Array<ViewerRenderCallback> = [];\n\tprotected _onAfterRenderCallbacks: Array<ViewerRenderCallback> = [];\n\n\t// onBeforeTick\n\t/**\n\t * registers a BeforeTick callback. BeforeTick callbacks are run before updating the frame (and therefore before any time dependent node has changed)\n\t *\n\t */\n\tregisterOnBeforeTick(callbackName: string, callback: ViewerTickCallback, options: BaseViewerCallbackOptions = {}) {\n\t\tthis._registerCallback(callbackName, callback, this.registeredBeforeTickCallbacks(), options);\n\t}\n\t/**\n\t * unregisters BeforeTick callback\n\t *\n\t */\n\tunRegisterOnBeforeTick(callbackName: string) {\n\t\tthis._unregisterCallback(callbackName, this._onBeforeTickCallbacksMap);\n\t}\n\t/**\n\t * Returns the list registered BeforeTick callback names\n\t *\n\t */\n\tregisteredBeforeTickCallbacks() {\n\t\treturn (this._onBeforeTickCallbacksMap = this._onBeforeTickCallbacksMap || new Map());\n\t}\n\t// onAfterTick\n\t/**\n\t * registers AfterTick callback. AfterTick callbacks are run after updating the frame (and therefore after any time dependent node has changed)\n\t *\n\t */\n\tregisterOnAfterTick(callbackName: string, callback: ViewerTickCallback, options: BaseViewerCallbackOptions = {}) {\n\t\tthis._registerCallback(callbackName, callback, this.registeredAfterTickCallbacks(), options);\n\t}\n\t/**\n\t * unregisters AfterTick callback\n\t *\n\t */\n\tunRegisterOnAfterTick(callbackName: string) {\n\t\tthis._unregisterCallback(callbackName, this._onAfterTickCallbacksMap);\n\t}\n\t/**\n\t * Returns the list registered AfterTick callback names\n\t *\n\t */\n\tregisteredAfterTickCallbacks() {\n\t\treturn (this._onAfterTickCallbacksMap = this._onAfterTickCallbacksMap || new Map());\n\t}\n\t// onBeforeRender\n\t/**\n\t * registers a BeforeRender callback. BeforeRender callbacks are run before the frame is rendered\n\t *\n\t */\n\tregisterOnBeforeRender(\n\t\tcallbackName: string,\n\t\tcallback: ViewerRenderCallback,\n\t\toptions: BaseViewerCallbackOptions = {}\n\t) {\n\t\tthis._registerCallback(callbackName, callback, this.registeredBeforeRenderCallbacks(), options);\n\t}\n\t/**\n\t * unregisters BeforeRender callback\n\t *\n\t */\n\tunRegisterOnBeforeRender(callbackName: string) {\n\t\tthis._unregisterCallback(callbackName, this._onBeforeRenderCallbacksMap);\n\t}\n\t/**\n\t * Returns the list registered BeforeRender callback names\n\t *\n\t */\n\tregisteredBeforeRenderCallbacks() {\n\t\treturn (this._onBeforeRenderCallbacksMap = this._onBeforeRenderCallbacksMap || new Map());\n\t}\n\t// onAfterRender\n\t/**\n\t * registers a AfterRender callback. AfterRender callbacks are run after the frame is rendered\n\t *\n\t */ registerOnAfterRender(\n\t\tcallbackName: string,\n\t\tcallback: ViewerRenderCallback,\n\t\toptions: BaseViewerCallbackOptions = {}\n\t) {\n\t\tthis._registerCallback(callbackName, callback, this.registeredAfterRenderCallbacks(), options);\n\t}\n\t/**\n\t * unregisters AfterRender callback\n\t *\n\t */\n\tunRegisterOnAfterRender(callbackName: string) {\n\t\tthis._unregisterCallback(callbackName, this._onAfterRenderCallbacksMap);\n\t}\n\t/**\n\t * Returns the list AfterRender BeforeRender callback names\n\t *\n\t */\n\tregisteredAfterRenderCallbacks() {\n\t\treturn (this._onAfterRenderCallbacksMap = this._onAfterRenderCallbacksMap || new Map());\n\t}\n\tprivate _registerCallback<C extends ViewerBaseCallback>(\n\t\tcallbackName: string,\n\t\tcallback: C,\n\t\tmap: ViewerCallbacksMap<C>,\n\t\toptions: BaseViewerCallbackOptions = {}\n\t) {\n\t\tif (map.has(callbackName)) {\n\t\t\tconsole.warn(`callback ${callbackName} already registered`);\n\t\t\treturn;\n\t\t}\n\t\tmap.set(callbackName, {callback, options});\n\t\tthis._updateCallbacks();\n\t}\n\tprivate _unregisterCallback<C extends ViewerBaseCallback>(callbackName: string, map?: ViewerCallbacksMap<C>) {\n\t\tif (!map) {\n\t\t\treturn;\n\t\t}\n\t\tconst callbackContainer = map.get(callbackName);\n\t\tif (!callbackContainer) {\n\t\t\treturn;\n\t\t}\n\t\tconst options = callbackContainer.options;\n\t\tif (options.persistent == true) {\n\t\t\treturn;\n\t\t}\n\t\tmap.delete(callbackName);\n\t\tthis._updateCallbacks();\n\t}\n\tprivate _updateCallbacks() {\n\t\tthis._onBeforeTickCallbacks = [];\n\t\tthis._onBeforeTickCallbacksMap?.forEach((callbackContainer) => {\n\t\t\tthis._onBeforeTickCallbacks.push(callbackContainer.callback);\n\t\t});\n\t\tthis._onAfterTickCallbacks = [];\n\t\tthis._onAfterTickCallbacksMap?.forEach((callbackContainer) => {\n\t\t\tthis._onAfterTickCallbacks.push(callbackContainer.callback);\n\t\t});\n\t\tthis._onBeforeRenderCallbacks = [];\n\t\tthis._onBeforeRenderCallbacksMap?.forEach((callbackContainer) => {\n\t\t\tthis._onBeforeRenderCallbacks.push(callbackContainer.callback);\n\t\t});\n\t\tthis._onAfterRenderCallbacks = [];\n\t\tthis._onAfterRenderCallbacksMap?.forEach((callbackContainer) => {\n\t\t\tthis._onAfterRenderCallbacks.push(callbackContainer.callback);\n\t\t});\n\t}\n\tprivate _runTickCallbacks(callbacks: ViewerTickCallback[], delta: number) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(delta);\n\t\t}\n\t}\n\tprivate _runRenderCallbacks(callbacks: ViewerRenderCallback[], delta: number, renderer: AbstractRenderer) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(delta, renderer);\n\t\t}\n\t}\n\tprotected _runOnBeforeTickCallbacks(delta: number) {\n\t\tthis._runTickCallbacks(this._onBeforeTickCallbacks, delta);\n\t}\n\tprotected _runOnAfterTickCallbacks(delta: number) {\n\t\tthis._runTickCallbacks(this._onAfterTickCallbacks, delta);\n\t}\n\tprotected _runOnBeforeRenderCallbacks(delta: number, renderer: AbstractRenderer) {\n\t\tthis._runRenderCallbacks(this._onBeforeRenderCallbacks, delta, renderer);\n\t}\n\tprotected _runOnAfterRenderCallbacks(delta: number, renderer: AbstractRenderer) {\n\t\tthis._runRenderCallbacks(this._onAfterRenderCallbacks, delta, renderer);\n\t}\n}\n\nexport type BaseViewerType = TypedViewer<Camera>;\n","import {BaseEvent, Camera, Vector3, EventDispatcher} from 'three';\nimport {CameraControls} from '../../nodes/event/_BaseCameraControls';\nimport type {OrbitControls} from '../../nodes/event/CameraOrbitControls';\nimport {TypedViewer} from '../_Base';\n\ntype UpdateControlsFunc = (delta: number) => void;\n\nexport enum CameraControlsEvent {\n\tstart = 'start',\n\tend = 'end',\n}\nexport const CAMERA_CONTROLS_EVENTS: CameraControlsEvent[] = [CameraControlsEvent.start, CameraControlsEvent.end];\nconst START_EVENT: BaseEvent<'start'> = {type: CameraControlsEvent.start};\nconst END_EVENT: BaseEvent<'end'> = {type: CameraControlsEvent.end};\n\nexport class ViewerControlsController<C extends Camera> extends EventDispatcher<{change: any}> {\n\tprotected _active: boolean = false;\n\tprivate _updateControlsFunc: UpdateControlsFunc | undefined;\n\tprotected _controls: CameraControls | undefined;\n\tprivate _mounted = false;\n\tconstructor(private viewer: TypedViewer<C>) {\n\t\tsuper();\n\t}\n\n\tcontrols() {\n\t\treturn this._controls;\n\t}\n\n\tmount() {\n\t\tif (this._mounted) {\n\t\t\treturn;\n\t\t}\n\t\tthis._mounted = true;\n\t\tconst controlsNode = this.viewer.controlsNode();\n\t\tconst camera = this.viewer.camera();\n\t\tif (!(controlsNode && camera)) {\n\t\t\treturn;\n\t\t}\n\t\tcontrolsNode.applyControls(camera, this.viewer).then((controls) => {\n\t\t\tthis._controls = controls;\n\t\t\t// make sure that the function is (delta) => controls.update(delta)\n\t\t\t// and not just \"controls.update\", as this would prevent the controls from binding \"this\" properly.\n\t\t\t// This messes up with the FirstPersoControls for instance.\n\t\t\tthis._updateControlsFunc = controls ? (delta) => controls.update(delta) : undefined;\n\n\t\t\tfor (const eventName of CAMERA_CONTROLS_EVENTS) {\n\t\t\t\tcontrols.addEventListener(eventName, this._boundEventHandler[eventName]);\n\t\t\t}\n\n\t\t\tif (!this._mounted) {\n\t\t\t\tthis._disposeControls();\n\t\t\t}\n\t\t});\n\t}\n\tunmount() {\n\t\tif (!this._mounted) {\n\t\t\treturn;\n\t\t}\n\t\tthis._mounted = false;\n\t\tthis._disposeControls();\n\t\t// dispose controls\n\t\t// this._controlsNode = undefined;\n\t}\n\tprivate _disposeControls() {\n\t\tif (this._controls) {\n\t\t\tfor (const eventName of CAMERA_CONTROLS_EVENTS) {\n\t\t\t\tthis._controls.removeEventListener(eventName, this._boundEventHandler[eventName]);\n\t\t\t}\n\t\t\tthis._controls.dispose();\n\t\t\t// this._controls = undefined;\n\t\t\t// this._updateControlsFunc = undefined;\n\t\t}\n\t\tthis._updateControlsFunc = undefined;\n\t}\n\tupdate(delta: number) {\n\t\tif (this._updateControlsFunc) {\n\t\t\tthis._updateControlsFunc(delta);\n\t\t}\n\t}\n\tsetActive(active: boolean) {\n\t\tif (active) {\n\t\t\tthis.mount();\n\t\t} else {\n\t\t\tthis.unmount();\n\t\t}\n\t}\n\tsetTarget(target: Vector3) {\n\t\tif (!this._controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst orbitControls = this._controls as OrbitControls;\n\t\tif (!orbitControls.target) {\n\t\t\treturn;\n\t\t}\n\t\torbitControls.target.copy(target);\n\t}\n\tprivate _boundEventHandler: Record<CameraControlsEvent, () => void> = {\n\t\t[CameraControlsEvent.start]: () => this.dispatchEvent(START_EVENT),\n\t\t[CameraControlsEvent.end]: () => this.dispatchEvent(END_EVENT),\n\t};\n}\n","import {Capture} from '../npm_module/NpmModuleTypes';\nimport {EditorLayoutData, EditorProps, TopMenuFileEntry} from '../editor/types';\n\n// import {AppLoader} from './AppLoader';\n\ntype RegisterCallback = (sceneName: string | null) => Promise<void>;\ntype RequestCaptureStatusCallback = (sceneName: string) => Promise<Capture.RequestStatusResponse | undefined>;\n// type LoadSceneData = () => Promise<void>;\n\n// interface AppConfigOptions {\n// \teditorProps: EditorProps;\n// }\ntype RegisterResolve = () => void;\ntype OnEditorRoutesCreated = () => Promise<void>;\n\n// interface AppConfigOptions {\n// \trouteBase: string;\n// \tdocsOnly: boolean;\n// \teditorOnly: boolean;\n// }\ninterface AppConfigRegisterOptions {\n\tsceneName: string | null;\n}\n\nexport class AppConfigClass {\n\tprivate static _instance: AppConfigClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new AppConfigClass());\n\t}\n\tprivate constructor() {}\n\tprivate _element: HTMLElement | null = null;\n\tprivate _registerCallback: RegisterCallback | undefined;\n\tprivate _requestCaptureStatusCallback: RequestCaptureStatusCallback | undefined;\n\tprivate _registerInProgress: boolean = false;\n\tprivate _registerCompleted: boolean = false;\n\tprivate _onEditorRoutesCreatedCallback: OnEditorRoutesCreated | undefined;\n\t// private _options: AppConfigOptions | undefined;\n\tprivate _editorProps: EditorProps = {\n\t\tcurrent_node: undefined,\n\t\tcurrentNodes: [],\n\t\tnavigationHistory: undefined,\n\t\t// selected: url_params.get('selected') || undefined,\n\t\t// perf: url_params.has('perf') ? CoreString.toBoolean(url_params.get('perf') || '') : undefined,\n\t\t// scene_update_allowed: false,\n\t\t// no idea why I have to add \"multiple_panel\"\n\t\t// init_layout_data: editor_data.multiple_panel, // not working for now...?\n\t\t// fullscreenPanelId: editor_data.fullscreenPanelId,\n\t\t// saveOptions: editor_data.saveOptions,\n\t\t// paramsModal: editor_data.paramsModal,\n\t\ttop_menu_entries: [\n\t\t\tTopMenuFileEntry.DASHBOARD,\n\t\t\tTopMenuFileEntry.NEW_SCENE,\n\t\t\t// TopMenuFileEntry.LOAD_SCENE,\n\t\t\tTopMenuFileEntry.SAVE_SCENE,\n\t\t\tTopMenuFileEntry.SAVE_SCENE_AS,\n\t\t\tTopMenuFileEntry.SCENE_SETTINGS,\n\t\t\tTopMenuFileEntry.PREFERENCES,\n\t\t\tTopMenuFileEntry.LIBRARIES_MANAGER,\n\t\t],\n\t};\n\n\telement() {\n\t\tif (!this._element) {\n\t\t\tthis._element = document.getElementById('app-config');\n\t\t\tif (!this._element) {\n\t\t\t\talert('no config element found');\n\t\t\t}\n\t\t}\n\t\treturn this._element;\n\t}\n\n\trouteBase() {\n\t\treturn this.element()?.dataset['routebase'];\n\t}\n\tremote(): boolean {\n\t\treturn this.element()?.dataset['remote'] != null;\n\t\t// return this._options?.docsOnly || false;\n\t\t// this.routeBase()?.startsWith('/docs') || false;\n\t}\n\t// editorAtRoot(): boolean {\n\t// \tif (this.docsAtRoot()) {\n\t// \t\treturn false;\n\t// \t}\n\t// \treturn this.element()?.dataset['editoratroot'] != null;\n\t// \t// return this._options?.editorOnly || false;\n\t// }\n\tsetEditorProps(props: EditorProps) {\n\t\t// this._editorProps.scene_update_allowed = props.scene_update_allowed;\n\t\t// this._editorProps.current_node = props.current_node;\n\t\t// this._editorProps.currentNodes = props.currentNodes ? [...props.currentNodes] : [];\n\t\t// this._editorProps.scene_load_warnings = props.scene_load_warnings;\n\t\tthis._editorProps.perf = props.perf;\n\t\t// this._editorProps.fullscreenPanelId = props.fullscreenPanelId;\n\t\t// this._editorProps.saveOptions = props.saveOptions;\n\t\t// this._editorProps.paramsModal = props.paramsModal;\n\t\t// this._editorProps.init_layout_data = props.init_layout_data;\n\t\tthis._editorProps.top_menu_entries = props.top_menu_entries;\n\t\tthis._editorProps.show_local_install_notice = props.show_local_install_notice;\n\t}\n\tsetEditorPropsWarnings(warnings: string[]) {\n\t\tthis._editorProps.scene_load_warnings = warnings;\n\t}\n\tsetEditorLayoutData(data: EditorLayoutData) {\n\t\tthis._editorProps.current_node = data.current_node;\n\t\tthis._editorProps.currentNodes = data.currentNodes ? [...data.currentNodes] : [];\n\t\tthis._editorProps.paramsModal = data.paramsModal;\n\t\tthis._editorProps.init_layout_data = data.multiple_panel;\n\t\tthis._editorProps.fullscreenPanelId = data.fullscreenPanelId;\n\t\tthis._editorProps.navigationHistory = data.navigationHistory;\n\t\tthis._editorProps.saveOptions = data.saveOptions;\n\t}\n\n\tsetRegisterCallback(callback: RegisterCallback) {\n\t\tthis._registerCallback = callback;\n\t}\n\tprivate _resolves: RegisterResolve[] = [];\n\tregister(options: AppConfigRegisterOptions): Promise<void> | void {\n\t\tif (this._registerCompleted) {\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn new Promise(async (resolve) => {\n\t\t\t\tthis._resolves.push(resolve);\n\t\t\t\tif (this._registerInProgress) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this._registerCallback) {\n\t\t\t\t\tthis._registerInProgress = true;\n\t\t\t\t\tawait this._registerCallback(options.sceneName);\n\t\t\t\t\tthis._registerInProgress = false;\n\t\t\t\t}\n\t\t\t\tthis._registerCompleted = true;\n\n\t\t\t\t// we register hooks after plugins and nodes are imported,\n\t\t\t\t// in case those hook would load mixins before plugins.\n\t\t\t\t// this is mostly important for the sop/cameraWebXRARMarkerTracking\n\t\t\t\tconst {EditorCoreHooksController} = await import('../editor/core/hooks/HooksController');\n\t\t\t\tEditorCoreHooksController.registerAll();\n\n\t\t\t\tfor (let resolve of this._resolves) {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tsetRequestCaptureStatusCallback(callback: RequestCaptureStatusCallback) {\n\t\tthis._requestCaptureStatusCallback = callback;\n\t}\n\tasync requestCaptureStatus(sceneName: string): Promise<Capture.RequestStatusResponse | void> {\n\t\tif (this._requestCaptureStatusCallback) {\n\t\t\treturn await this._requestCaptureStatusCallback(sceneName);\n\t\t}\n\t}\n\t// setOptions(elementOrId: string | HTMLElement, options: AppConfigOptions) {\n\t// \tthis._options = options;\n\t// \tAppLoader.__mount(elementOrId);\n\t// }\n\t// async loadSceneData() {\n\t// \tif (this._options) {\n\t// \t\tawait this._options.loadSceneCallback();\n\t// \t}\n\t// }\n\t// setEditorProps(props: EditorProps) {\n\t// \tthis._editorProps = props;\n\t// }\n\teditorProps() {\n\t\treturn this._editorProps;\n\t}\n\n\tsetOnEditorRoutesCreated(callback: OnEditorRoutesCreated) {\n\t\tthis._onEditorRoutesCreatedCallback = callback;\n\t}\n\tasync onEditorRoutesCreated() {\n\t\tif (this._onEditorRoutesCreatedCallback) {\n\t\t\tawait this._onEditorRoutesCreatedCallback();\n\t\t}\n\t}\n}\n\nexport const AppConfig = AppConfigClass.instance();\n","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_router_view = _resolveComponent(\"router-view\")!\n\n  return (_openBlock(), _createBlock(_component_router_view))\n}","export { default } from \"-!../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./App.vue?vue&type=script&lang=ts\"; export * from \"-!../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./App.vue?vue&type=script&lang=ts\"","import { render } from \"./App.vue?vue&type=template&id=69792822&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","/*!\n * Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2022 Fonticons, Inc.\n */\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\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 = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n\n  return target;\n}\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}\n\nfunction _wrapRegExp() {\n  _wrapRegExp = function (re, groups) {\n    return new BabelRegExp(re, void 0, groups);\n  };\n\n  var _super = RegExp.prototype,\n      _groups = new WeakMap();\n\n  function BabelRegExp(re, flags, groups) {\n    var _this = new RegExp(re, flags);\n\n    return _groups.set(_this, groups || _groups.get(re)), _setPrototypeOf(_this, BabelRegExp.prototype);\n  }\n\n  function buildGroups(result, re) {\n    var g = _groups.get(re);\n\n    return Object.keys(g).reduce(function (groups, name) {\n      return groups[name] = result[g[name]], groups;\n    }, Object.create(null));\n  }\n\n  return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {\n    var result = _super.exec.call(this, str);\n\n    return result && (result.groups = buildGroups(result, this)), result;\n  }, BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {\n    if (\"string\" == typeof substitution) {\n      var groups = _groups.get(this);\n\n      return _super[Symbol.replace].call(this, str, substitution.replace(/\\$<([^>]+)>/g, function (_, name) {\n        return \"$\" + groups[name];\n      }));\n    }\n\n    if (\"function\" == typeof substitution) {\n      var _this = this;\n\n      return _super[Symbol.replace].call(this, str, function () {\n        var args = arguments;\n        return \"object\" != typeof args[args.length - 1] && (args = [].slice.call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);\n      });\n    }\n\n    return _super[Symbol.replace].call(this, str, substitution);\n  }, _wrapRegExp.apply(this, arguments);\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  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\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 _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  Object.defineProperty(subClass, \"prototype\", {\n    writable: false\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\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 _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\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 _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}\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 noop = function noop() {};\n\nvar _WINDOW = {};\nvar _DOCUMENT = {};\nvar _MUTATION_OBSERVER = null;\nvar _PERFORMANCE = {\n  mark: noop,\n  measure: noop\n};\n\ntry {\n  if (typeof window !== 'undefined') _WINDOW = window;\n  if (typeof document !== 'undefined') _DOCUMENT = document;\n  if (typeof MutationObserver !== 'undefined') _MUTATION_OBSERVER = MutationObserver;\n  if (typeof performance !== 'undefined') _PERFORMANCE = performance;\n} catch (e) {}\n\nvar _ref = _WINDOW.navigator || {},\n    _ref$userAgent = _ref.userAgent,\n    userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent;\nvar WINDOW = _WINDOW;\nvar DOCUMENT = _DOCUMENT;\nvar MUTATION_OBSERVER = _MUTATION_OBSERVER;\nvar PERFORMANCE = _PERFORMANCE;\nvar IS_BROWSER = !!WINDOW.document;\nvar IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';\nvar IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');\n\nvar NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';\nvar UNITS_IN_GRID = 16;\nvar DEFAULT_FAMILY_PREFIX = 'fa';\nvar DEFAULT_REPLACEMENT_CLASS = 'svg-inline--fa';\nvar DATA_FA_I2SVG = 'data-fa-i2svg';\nvar DATA_FA_PSEUDO_ELEMENT = 'data-fa-pseudo-element';\nvar DATA_FA_PSEUDO_ELEMENT_PENDING = 'data-fa-pseudo-element-pending';\nvar DATA_PREFIX = 'data-prefix';\nvar DATA_ICON = 'data-icon';\nvar HTML_CLASS_I2SVG_BASE_CLASS = 'fontawesome-i2svg';\nvar MUTATION_APPROACH_ASYNC = 'async';\nvar TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ['HTML', 'HEAD', 'STYLE', 'SCRIPT'];\nvar PRODUCTION = function () {\n  try {\n    return process.env.NODE_ENV === 'production';\n  } catch (e) {\n    return false;\n  }\n}();\nvar PREFIX_TO_STYLE = {\n  'fas': 'solid',\n  'fa-solid': 'solid',\n  'far': 'regular',\n  'fa-regular': 'regular',\n  'fal': 'light',\n  'fa-light': 'light',\n  'fat': 'thin',\n  'fa-thin': 'thin',\n  'fad': 'duotone',\n  'fa-duotone': 'duotone',\n  'fab': 'brands',\n  'fa-brands': 'brands',\n  'fak': 'kit',\n  'fa-kit': 'kit',\n  'fa': 'solid'\n};\nvar STYLE_TO_PREFIX = {\n  'solid': 'fas',\n  'regular': 'far',\n  'light': 'fal',\n  'thin': 'fat',\n  'duotone': 'fad',\n  'brands': 'fab',\n  'kit': 'fak'\n};\nvar PREFIX_TO_LONG_STYLE = {\n  'fab': 'fa-brands',\n  'fad': 'fa-duotone',\n  'fak': 'fa-kit',\n  'fal': 'fa-light',\n  'far': 'fa-regular',\n  'fas': 'fa-solid',\n  'fat': 'fa-thin'\n};\nvar LONG_STYLE_TO_PREFIX = {\n  'fa-brands': 'fab',\n  'fa-duotone': 'fad',\n  'fa-kit': 'fak',\n  'fa-light': 'fal',\n  'fa-regular': 'far',\n  'fa-solid': 'fas',\n  'fa-thin': 'fat'\n};\nvar ICON_SELECTION_SYNTAX_PATTERN = /fa[srltdbk\\-\\ ]/; // eslint-disable-line no-useless-escape\n\nvar LAYERS_TEXT_CLASSNAME = 'fa-layers-text';\nvar FONT_FAMILY_PATTERN = /Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Kit)?.*/i; // TODO: do we need to handle font-weight for kit SVG pseudo-elements?\n\nvar FONT_WEIGHT_TO_PREFIX = {\n  '900': 'fas',\n  '400': 'far',\n  'normal': 'far',\n  '300': 'fal',\n  '100': 'fat'\n};\nvar oneToTen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar oneToTwenty = oneToTen.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);\nvar ATTRIBUTES_WATCHED_FOR_MUTATION = ['class', 'data-prefix', 'data-icon', 'data-fa-transform', 'data-fa-mask'];\nvar DUOTONE_CLASSES = {\n  GROUP: 'duotone-group',\n  SWAP_OPACITY: 'swap-opacity',\n  PRIMARY: 'primary',\n  SECONDARY: 'secondary'\n};\nvar RESERVED_CLASSES = [].concat(_toConsumableArray(Object.keys(STYLE_TO_PREFIX)), ['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', 'beat', 'border', 'fade', 'beat-fade', 'bounce', 'flip-both', 'flip-horizontal', 'flip-vertical', 'flip', 'fw', 'inverse', 'layers-counter', 'layers-text', 'layers', 'li', 'pull-left', 'pull-right', 'pulse', 'rotate-180', 'rotate-270', 'rotate-90', 'rotate-by', 'shake', 'spin-pulse', 'spin-reverse', 'spin', 'stack-1x', 'stack-2x', 'stack', 'ul', DUOTONE_CLASSES.GROUP, DUOTONE_CLASSES.SWAP_OPACITY, DUOTONE_CLASSES.PRIMARY, DUOTONE_CLASSES.SECONDARY]).concat(oneToTen.map(function (n) {\n  return \"\".concat(n, \"x\");\n})).concat(oneToTwenty.map(function (n) {\n  return \"w-\".concat(n);\n}));\n\nvar initial = WINDOW.FontAwesomeConfig || {};\n\nfunction getAttrConfig(attr) {\n  var element = DOCUMENT.querySelector('script[' + attr + ']');\n\n  if (element) {\n    return element.getAttribute(attr);\n  }\n}\n\nfunction coerce(val) {\n  // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n  // We'll assume that this is an indication that it should be toggled to true\n  if (val === '') return true;\n  if (val === 'false') return false;\n  if (val === 'true') return true;\n  return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n  var attrs = [['data-family-prefix', 'familyPrefix'], ['data-style-default', 'styleDefault'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n  attrs.forEach(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 2),\n        attr = _ref2[0],\n        key = _ref2[1];\n\n    var val = coerce(getAttrConfig(attr));\n\n    if (val !== undefined && val !== null) {\n      initial[key] = val;\n    }\n  });\n}\n\nvar _default = {\n  familyPrefix: DEFAULT_FAMILY_PREFIX,\n  styleDefault: 'solid',\n  replacementClass: DEFAULT_REPLACEMENT_CLASS,\n  autoReplaceSvg: true,\n  autoAddCss: true,\n  autoA11y: true,\n  searchPseudoElements: false,\n  observeMutations: true,\n  mutateApproach: 'async',\n  keepOriginalSource: true,\n  measurePerformance: false,\n  showMissingIcons: true\n};\n\nvar _config = _objectSpread2(_objectSpread2({}, _default), initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\nvar config = {};\nObject.keys(_config).forEach(function (key) {\n  Object.defineProperty(config, key, {\n    enumerable: true,\n    set: function set(val) {\n      _config[key] = val;\n\n      _onChangeCb.forEach(function (cb) {\n        return cb(config);\n      });\n    },\n    get: function get() {\n      return _config[key];\n    }\n  });\n});\nWINDOW.FontAwesomeConfig = config;\nvar _onChangeCb = [];\nfunction onChange(cb) {\n  _onChangeCb.push(cb);\n\n  return function () {\n    _onChangeCb.splice(_onChangeCb.indexOf(cb), 1);\n  };\n}\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n  size: 16,\n  x: 0,\n  y: 0,\n  rotate: 0,\n  flipX: false,\n  flipY: false\n};\nfunction insertCss(css) {\n  if (!css || !IS_DOM) {\n    return;\n  }\n\n  var style = DOCUMENT.createElement('style');\n  style.setAttribute('type', 'text/css');\n  style.innerHTML = css;\n  var headChildren = DOCUMENT.head.childNodes;\n  var beforeChild = null;\n\n  for (var i = headChildren.length - 1; i > -1; i--) {\n    var child = headChildren[i];\n    var tagName = (child.tagName || '').toUpperCase();\n\n    if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n      beforeChild = child;\n    }\n  }\n\n  DOCUMENT.head.insertBefore(style, beforeChild);\n  return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n  var size = 12;\n  var id = '';\n\n  while (size-- > 0) {\n    id += idPool[Math.random() * 62 | 0];\n  }\n\n  return id;\n}\nfunction toArray(obj) {\n  var array = [];\n\n  for (var i = (obj || []).length >>> 0; i--;) {\n    array[i] = obj[i];\n  }\n\n  return array;\n}\nfunction classArray(node) {\n  if (node.classList) {\n    return toArray(node.classList);\n  } else {\n    return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n      return i;\n    });\n  }\n}\nfunction htmlEscape(str) {\n  return \"\".concat(str).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\nfunction joinAttributes(attributes) {\n  return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n    return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n  }, '').trim();\n}\nfunction joinStyles(styles) {\n  return Object.keys(styles || {}).reduce(function (acc, styleName) {\n    return acc + \"\".concat(styleName, \": \").concat(styles[styleName].trim(), \";\");\n  }, '');\n}\nfunction transformIsMeaningful(transform) {\n  return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n  var transform = _ref.transform,\n      containerWidth = _ref.containerWidth,\n      iconWidth = _ref.iconWidth;\n  var outer = {\n    transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n  };\n  var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n  var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n  var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n  var inner = {\n    transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n  };\n  var path = {\n    transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n  };\n  return {\n    outer: outer,\n    inner: inner,\n    path: path\n  };\n}\nfunction transformForCss(_ref2) {\n  var transform = _ref2.transform,\n      _ref2$width = _ref2.width,\n      width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n      _ref2$height = _ref2.height,\n      height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n      _ref2$startCentered = _ref2.startCentered,\n      startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n  var val = '';\n\n  if (startCentered && IS_IE) {\n    val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n  } else if (startCentered) {\n    val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n  } else {\n    val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n  }\n\n  val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n  val += \"rotate(\".concat(transform.rotate, \"deg) \");\n  return val;\n}\n\nvar baseStyles = \":root, :host {\\n  --fa-font-solid: normal 900 1em/1 \\\"Font Awesome 6 Solid\\\";\\n  --fa-font-regular: normal 400 1em/1 \\\"Font Awesome 6 Regular\\\";\\n  --fa-font-light: normal 300 1em/1 \\\"Font Awesome 6 Light\\\";\\n  --fa-font-thin: normal 100 1em/1 \\\"Font Awesome 6 Thin\\\";\\n  --fa-font-duotone: normal 900 1em/1 \\\"Font Awesome 6 Duotone\\\";\\n  --fa-font-brands: normal 400 1em/1 \\\"Font Awesome 6 Brands\\\";\\n}\\n\\nsvg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {\\n  overflow: visible;\\n  box-sizing: content-box;\\n}\\n\\n.svg-inline--fa {\\n  display: var(--fa-display, inline-block);\\n  height: 1em;\\n  overflow: visible;\\n  vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-2xs {\\n  vertical-align: 0.1em;\\n}\\n.svg-inline--fa.fa-xs {\\n  vertical-align: 0em;\\n}\\n.svg-inline--fa.fa-sm {\\n  vertical-align: -0.0714285705em;\\n}\\n.svg-inline--fa.fa-lg {\\n  vertical-align: -0.2em;\\n}\\n.svg-inline--fa.fa-xl {\\n  vertical-align: -0.25em;\\n}\\n.svg-inline--fa.fa-2xl {\\n  vertical-align: -0.3125em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n  margin-right: var(--fa-pull-margin, 0.3em);\\n  width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n  margin-left: var(--fa-pull-margin, 0.3em);\\n  width: auto;\\n}\\n.svg-inline--fa.fa-li {\\n  width: var(--fa-li-width, 2em);\\n  top: 0.25em;\\n}\\n.svg-inline--fa.fa-fw {\\n  width: var(--fa-fw-width, 1.25em);\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n  bottom: 0;\\n  left: 0;\\n  margin: auto;\\n  position: absolute;\\n  right: 0;\\n  top: 0;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n  display: inline-block;\\n  position: absolute;\\n  text-align: center;\\n}\\n\\n.fa-layers {\\n  display: inline-block;\\n  height: 1em;\\n  position: relative;\\n  text-align: center;\\n  vertical-align: -0.125em;\\n  width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n  -webkit-transform-origin: center center;\\n          transform-origin: center center;\\n}\\n\\n.fa-layers-text {\\n  left: 50%;\\n  top: 50%;\\n  -webkit-transform: translate(-50%, -50%);\\n          transform: translate(-50%, -50%);\\n  -webkit-transform-origin: center center;\\n          transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n  background-color: var(--fa-counter-background-color, #ff253a);\\n  border-radius: var(--fa-counter-border-radius, 1em);\\n  box-sizing: border-box;\\n  color: var(--fa-inverse, #fff);\\n  line-height: var(--fa-counter-line-height, 1);\\n  max-width: var(--fa-counter-max-width, 5em);\\n  min-width: var(--fa-counter-min-width, 1.5em);\\n  overflow: hidden;\\n  padding: var(--fa-counter-padding, 0.25em 0.5em);\\n  right: var(--fa-right, 0);\\n  text-overflow: ellipsis;\\n  top: var(--fa-top, 0);\\n  -webkit-transform: scale(var(--fa-counter-scale, 0.25));\\n          transform: scale(var(--fa-counter-scale, 0.25));\\n  -webkit-transform-origin: top right;\\n          transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n  bottom: var(--fa-bottom, 0);\\n  right: var(--fa-right, 0);\\n  top: auto;\\n  -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n          transform: scale(var(--fa-layers-scale, 0.25));\\n  -webkit-transform-origin: bottom right;\\n          transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n  bottom: var(--fa-bottom, 0);\\n  left: var(--fa-left, 0);\\n  right: auto;\\n  top: auto;\\n  -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n          transform: scale(var(--fa-layers-scale, 0.25));\\n  -webkit-transform-origin: bottom left;\\n          transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n  top: var(--fa-top, 0);\\n  right: var(--fa-right, 0);\\n  -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n          transform: scale(var(--fa-layers-scale, 0.25));\\n  -webkit-transform-origin: top right;\\n          transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n  left: var(--fa-left, 0);\\n  right: auto;\\n  top: var(--fa-top, 0);\\n  -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n          transform: scale(var(--fa-layers-scale, 0.25));\\n  -webkit-transform-origin: top left;\\n          transform-origin: top left;\\n}\\n\\n.fa-1x {\\n  font-size: 1em;\\n}\\n\\n.fa-2x {\\n  font-size: 2em;\\n}\\n\\n.fa-3x {\\n  font-size: 3em;\\n}\\n\\n.fa-4x {\\n  font-size: 4em;\\n}\\n\\n.fa-5x {\\n  font-size: 5em;\\n}\\n\\n.fa-6x {\\n  font-size: 6em;\\n}\\n\\n.fa-7x {\\n  font-size: 7em;\\n}\\n\\n.fa-8x {\\n  font-size: 8em;\\n}\\n\\n.fa-9x {\\n  font-size: 9em;\\n}\\n\\n.fa-10x {\\n  font-size: 10em;\\n}\\n\\n.fa-2xs {\\n  font-size: 0.625em;\\n  line-height: 0.1em;\\n  vertical-align: 0.225em;\\n}\\n\\n.fa-xs {\\n  font-size: 0.75em;\\n  line-height: 0.0833333337em;\\n  vertical-align: 0.125em;\\n}\\n\\n.fa-sm {\\n  font-size: 0.875em;\\n  line-height: 0.0714285718em;\\n  vertical-align: 0.0535714295em;\\n}\\n\\n.fa-lg {\\n  font-size: 1.25em;\\n  line-height: 0.05em;\\n  vertical-align: -0.075em;\\n}\\n\\n.fa-xl {\\n  font-size: 1.5em;\\n  line-height: 0.0416666682em;\\n  vertical-align: -0.125em;\\n}\\n\\n.fa-2xl {\\n  font-size: 2em;\\n  line-height: 0.03125em;\\n  vertical-align: -0.1875em;\\n}\\n\\n.fa-fw {\\n  text-align: center;\\n  width: 1.25em;\\n}\\n\\n.fa-ul {\\n  list-style-type: none;\\n  margin-left: var(--fa-li-margin, 2.5em);\\n  padding-left: 0;\\n}\\n.fa-ul > li {\\n  position: relative;\\n}\\n\\n.fa-li {\\n  left: calc(var(--fa-li-width, 2em) * -1);\\n  position: absolute;\\n  text-align: center;\\n  width: var(--fa-li-width, 2em);\\n  line-height: inherit;\\n}\\n\\n.fa-border {\\n  border-color: var(--fa-border-color, #eee);\\n  border-radius: var(--fa-border-radius, 0.1em);\\n  border-style: var(--fa-border-style, solid);\\n  border-width: var(--fa-border-width, 0.08em);\\n  padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);\\n}\\n\\n.fa-pull-left {\\n  float: left;\\n  margin-right: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-pull-right {\\n  float: right;\\n  margin-left: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-beat {\\n  -webkit-animation-name: fa-beat;\\n          animation-name: fa-beat;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n          animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-bounce {\\n  -webkit-animation-name: fa-bounce;\\n          animation-name: fa-bounce;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n}\\n\\n.fa-fade {\\n  -webkit-animation-name: fa-fade;\\n          animation-name: fa-fade;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-beat-fade {\\n  -webkit-animation-name: fa-beat-fade;\\n          animation-name: fa-beat-fade;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-flip {\\n  -webkit-animation-name: fa-flip;\\n          animation-name: fa-flip;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n          animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-shake {\\n  -webkit-animation-name: fa-shake;\\n          animation-name: fa-shake;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n          animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin {\\n  -webkit-animation-name: fa-spin;\\n          animation-name: fa-spin;\\n  -webkit-animation-delay: var(--fa-animation-delay, 0);\\n          animation-delay: var(--fa-animation-delay, 0);\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 2s);\\n          animation-duration: var(--fa-animation-duration, 2s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n          animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin-reverse {\\n  --fa-animation-direction: reverse;\\n}\\n\\n.fa-pulse,\\n.fa-spin-pulse {\\n  -webkit-animation-name: fa-spin;\\n          animation-name: fa-spin;\\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\\n          animation-direction: var(--fa-animation-direction, normal);\\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n          animation-duration: var(--fa-animation-duration, 1s);\\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));\\n          animation-timing-function: var(--fa-animation-timing, steps(8));\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .fa-beat,\\n.fa-bounce,\\n.fa-fade,\\n.fa-beat-fade,\\n.fa-flip,\\n.fa-pulse,\\n.fa-shake,\\n.fa-spin,\\n.fa-spin-pulse {\\n    -webkit-animation-delay: -1ms;\\n            animation-delay: -1ms;\\n    -webkit-animation-duration: 1ms;\\n            animation-duration: 1ms;\\n    -webkit-animation-iteration-count: 1;\\n            animation-iteration-count: 1;\\n    transition-delay: 0s;\\n    transition-duration: 0s;\\n  }\\n}\\n@-webkit-keyframes fa-beat {\\n  0%, 90% {\\n    -webkit-transform: scale(1);\\n            transform: scale(1);\\n  }\\n  45% {\\n    -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n            transform: scale(var(--fa-beat-scale, 1.25));\\n  }\\n}\\n@keyframes fa-beat {\\n  0%, 90% {\\n    -webkit-transform: scale(1);\\n            transform: scale(1);\\n  }\\n  45% {\\n    -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n            transform: scale(var(--fa-beat-scale, 1.25));\\n  }\\n}\\n@-webkit-keyframes fa-bounce {\\n  0% {\\n    -webkit-transform: scale(1, 1) translateY(0);\\n            transform: scale(1, 1) translateY(0);\\n  }\\n  10% {\\n    -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n            transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n  }\\n  30% {\\n    -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n            transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n  }\\n  50% {\\n    -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n            transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n  }\\n  57% {\\n    -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n            transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n  }\\n  64% {\\n    -webkit-transform: scale(1, 1) translateY(0);\\n            transform: scale(1, 1) translateY(0);\\n  }\\n  100% {\\n    -webkit-transform: scale(1, 1) translateY(0);\\n            transform: scale(1, 1) translateY(0);\\n  }\\n}\\n@keyframes fa-bounce {\\n  0% {\\n    -webkit-transform: scale(1, 1) translateY(0);\\n            transform: scale(1, 1) translateY(0);\\n  }\\n  10% {\\n    -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n            transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n  }\\n  30% {\\n    -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n            transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n  }\\n  50% {\\n    -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n            transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n  }\\n  57% {\\n    -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n            transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n  }\\n  64% {\\n    -webkit-transform: scale(1, 1) translateY(0);\\n            transform: scale(1, 1) translateY(0);\\n  }\\n  100% {\\n    -webkit-transform: scale(1, 1) translateY(0);\\n            transform: scale(1, 1) translateY(0);\\n  }\\n}\\n@-webkit-keyframes fa-fade {\\n  50% {\\n    opacity: var(--fa-fade-opacity, 0.4);\\n  }\\n}\\n@keyframes fa-fade {\\n  50% {\\n    opacity: var(--fa-fade-opacity, 0.4);\\n  }\\n}\\n@-webkit-keyframes fa-beat-fade {\\n  0%, 100% {\\n    opacity: var(--fa-beat-fade-opacity, 0.4);\\n    -webkit-transform: scale(1);\\n            transform: scale(1);\\n  }\\n  50% {\\n    opacity: 1;\\n    -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n            transform: scale(var(--fa-beat-fade-scale, 1.125));\\n  }\\n}\\n@keyframes fa-beat-fade {\\n  0%, 100% {\\n    opacity: var(--fa-beat-fade-opacity, 0.4);\\n    -webkit-transform: scale(1);\\n            transform: scale(1);\\n  }\\n  50% {\\n    opacity: 1;\\n    -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n            transform: scale(var(--fa-beat-fade-scale, 1.125));\\n  }\\n}\\n@-webkit-keyframes fa-flip {\\n  50% {\\n    -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n            transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n  }\\n}\\n@keyframes fa-flip {\\n  50% {\\n    -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n            transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n  }\\n}\\n@-webkit-keyframes fa-shake {\\n  0% {\\n    -webkit-transform: rotate(-15deg);\\n            transform: rotate(-15deg);\\n  }\\n  4% {\\n    -webkit-transform: rotate(15deg);\\n            transform: rotate(15deg);\\n  }\\n  8%, 24% {\\n    -webkit-transform: rotate(-18deg);\\n            transform: rotate(-18deg);\\n  }\\n  12%, 28% {\\n    -webkit-transform: rotate(18deg);\\n            transform: rotate(18deg);\\n  }\\n  16% {\\n    -webkit-transform: rotate(-22deg);\\n            transform: rotate(-22deg);\\n  }\\n  20% {\\n    -webkit-transform: rotate(22deg);\\n            transform: rotate(22deg);\\n  }\\n  32% {\\n    -webkit-transform: rotate(-12deg);\\n            transform: rotate(-12deg);\\n  }\\n  36% {\\n    -webkit-transform: rotate(12deg);\\n            transform: rotate(12deg);\\n  }\\n  40%, 100% {\\n    -webkit-transform: rotate(0deg);\\n            transform: rotate(0deg);\\n  }\\n}\\n@keyframes fa-shake {\\n  0% {\\n    -webkit-transform: rotate(-15deg);\\n            transform: rotate(-15deg);\\n  }\\n  4% {\\n    -webkit-transform: rotate(15deg);\\n            transform: rotate(15deg);\\n  }\\n  8%, 24% {\\n    -webkit-transform: rotate(-18deg);\\n            transform: rotate(-18deg);\\n  }\\n  12%, 28% {\\n    -webkit-transform: rotate(18deg);\\n            transform: rotate(18deg);\\n  }\\n  16% {\\n    -webkit-transform: rotate(-22deg);\\n            transform: rotate(-22deg);\\n  }\\n  20% {\\n    -webkit-transform: rotate(22deg);\\n            transform: rotate(22deg);\\n  }\\n  32% {\\n    -webkit-transform: rotate(-12deg);\\n            transform: rotate(-12deg);\\n  }\\n  36% {\\n    -webkit-transform: rotate(12deg);\\n            transform: rotate(12deg);\\n  }\\n  40%, 100% {\\n    -webkit-transform: rotate(0deg);\\n            transform: rotate(0deg);\\n  }\\n}\\n@-webkit-keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n            transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n            transform: rotate(360deg);\\n  }\\n}\\n@keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n            transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n            transform: rotate(360deg);\\n  }\\n}\\n.fa-rotate-90 {\\n  -webkit-transform: rotate(90deg);\\n          transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n  -webkit-transform: rotate(180deg);\\n          transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n  -webkit-transform: rotate(270deg);\\n          transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n  -webkit-transform: scale(-1, 1);\\n          transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n  -webkit-transform: scale(1, -1);\\n          transform: scale(1, -1);\\n}\\n\\n.fa-flip-both,\\n.fa-flip-horizontal.fa-flip-vertical {\\n  -webkit-transform: scale(-1, -1);\\n          transform: scale(-1, -1);\\n}\\n\\n.fa-rotate-by {\\n  -webkit-transform: rotate(var(--fa-rotate-angle, none));\\n          transform: rotate(var(--fa-rotate-angle, none));\\n}\\n\\n.fa-stack {\\n  display: inline-block;\\n  vertical-align: middle;\\n  height: 2em;\\n  position: relative;\\n  width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n  bottom: 0;\\n  left: 0;\\n  margin: auto;\\n  position: absolute;\\n  right: 0;\\n  top: 0;\\n  z-index: var(--fa-stack-z-index, auto);\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n  height: 1em;\\n  width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n  height: 2em;\\n  width: 2.5em;\\n}\\n\\n.fa-inverse {\\n  color: var(--fa-inverse, #fff);\\n}\\n\\n.sr-only,\\n.fa-sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border-width: 0;\\n}\\n\\n.sr-only-focusable:not(:focus),\\n.fa-sr-only-focusable:not(:focus) {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border-width: 0;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n  fill: var(--fa-primary-color, currentColor);\\n  opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n  fill: var(--fa-secondary-color, currentColor);\\n  opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n  opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n  opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n  fill: black;\\n}\\n\\n.fad.fa-inverse,\\n.fa-duotone.fa-inverse {\\n  color: var(--fa-inverse, #fff);\\n}\";\n\nfunction css() {\n  var dfp = DEFAULT_FAMILY_PREFIX;\n  var drc = DEFAULT_REPLACEMENT_CLASS;\n  var fp = config.familyPrefix;\n  var rc = config.replacementClass;\n  var s = baseStyles;\n\n  if (fp !== dfp || rc !== drc) {\n    var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n    var customPropPatt = new RegExp(\"\\\\--\".concat(dfp, \"\\\\-\"), 'g');\n    var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n    s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n  }\n\n  return s;\n}\n\nvar _cssInserted = false;\n\nfunction ensureCss() {\n  if (config.autoAddCss && !_cssInserted) {\n    insertCss(css());\n    _cssInserted = true;\n  }\n}\n\nvar InjectCSS = {\n  mixout: function mixout() {\n    return {\n      dom: {\n        css: css,\n        insertCss: ensureCss\n      }\n    };\n  },\n  hooks: function hooks() {\n    return {\n      beforeDOMElementCreation: function beforeDOMElementCreation() {\n        ensureCss();\n      },\n      beforeI2svg: function beforeI2svg() {\n        ensureCss();\n      }\n    };\n  }\n};\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n  DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n  loaded = 1;\n  functions.map(function (fn) {\n    return fn();\n  });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n  loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n  if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n  if (!IS_DOM) return;\n  loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nfunction toHtml(abstractNodes) {\n  var tag = abstractNodes.tag,\n      _abstractNodes$attrib = abstractNodes.attributes,\n      attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n      _abstractNodes$childr = abstractNodes.children,\n      children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n  if (typeof abstractNodes === 'string') {\n    return htmlEscape(abstractNodes);\n  } else {\n    return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"</\").concat(tag, \">\");\n  }\n}\n\nfunction iconFromMapping(mapping, prefix, iconName) {\n  if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n    return {\n      prefix: prefix,\n      iconName: iconName,\n      icon: mapping[prefix][iconName]\n    };\n  }\n}\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n  return function (a, b, c, d) {\n    return func.call(thisContext, a, b, c, d);\n  };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param  {Object}   subject      The object to reduce over.\n * @param  {Function} fn           The reducer function.\n * @param  {mixed}    initialValue The initial value for the reducer, defaults to subject[0].\n * @param  {Object}   thisContext  The context for the reducer.\n * @return {mixed}                 The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n  var keys = Object.keys(subject),\n      length = keys.length,\n      iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n      i,\n      key,\n      result;\n\n  if (initialValue === undefined) {\n    i = 1;\n    result = subject[keys[0]];\n  } else {\n    i = 0;\n    result = initialValue;\n  }\n\n  for (; i < length; i++) {\n    key = keys[i];\n    result = iterator(result, subject[key], key, subject);\n  }\n\n  return result;\n};\n\n/**\n * ucs2decode() and codePointAt() are both works of Mathias Bynens and licensed under MIT\n *\n * Copyright Mathias Bynens <https://mathiasbynens.be/>\n\n * Permission is hereby granted, free of charge, to any person obtaining\n * a 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\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nfunction ucs2decode(string) {\n  var output = [];\n  var counter = 0;\n  var length = string.length;\n\n  while (counter < length) {\n    var value = string.charCodeAt(counter++);\n\n    if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n      var extra = string.charCodeAt(counter++);\n\n      if ((extra & 0xFC00) == 0xDC00) {\n        // eslint-disable-line eqeqeq\n        output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n      } else {\n        output.push(value);\n        counter--;\n      }\n    } else {\n      output.push(value);\n    }\n  }\n\n  return output;\n}\n\nfunction toHex(unicode) {\n  var decoded = ucs2decode(unicode);\n  return decoded.length === 1 ? decoded[0].toString(16) : null;\n}\nfunction codePointAt(string, index) {\n  var size = string.length;\n  var first = string.charCodeAt(index);\n  var second;\n\n  if (first >= 0xD800 && first <= 0xDBFF && size > index + 1) {\n    second = string.charCodeAt(index + 1);\n\n    if (second >= 0xDC00 && second <= 0xDFFF) {\n      return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n    }\n  }\n\n  return first;\n}\n\nfunction normalizeIcons(icons) {\n  return Object.keys(icons).reduce(function (acc, iconName) {\n    var icon = icons[iconName];\n    var expanded = !!icon.icon;\n\n    if (expanded) {\n      acc[icon.iconName] = icon.icon;\n    } else {\n      acc[iconName] = icon;\n    }\n\n    return acc;\n  }, {});\n}\n\nfunction defineIcons(prefix, icons) {\n  var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var _params$skipHooks = params.skipHooks,\n      skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n  var normalized = normalizeIcons(icons);\n\n  if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n    namespace.hooks.addPack(prefix, normalizeIcons(icons));\n  } else {\n    namespace.styles[prefix] = _objectSpread2(_objectSpread2({}, namespace.styles[prefix] || {}), normalized);\n  }\n  /**\n   * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n   * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n   * for `fas` so we'll ease the upgrade process for our users by automatically defining\n   * this as well.\n   */\n\n\n  if (prefix === 'fas') {\n    defineIcons('fa', icons);\n  }\n}\n\nvar duotonePathRe = [/*#__PURE__*/_wrapRegExp(/path d=\"((?:(?!\")[\\s\\S])+)\".*path d=\"((?:(?!\")[\\s\\S])+)\"/, {\n  d1: 1,\n  d2: 2\n}), /*#__PURE__*/_wrapRegExp(/path class=\"((?:(?!\")[\\s\\S])+)\".*d=\"((?:(?!\")[\\s\\S])+)\".*path class=\"((?:(?!\")[\\s\\S])+)\".*d=\"((?:(?!\")[\\s\\S])+)\"/, {\n  cls1: 1,\n  d1: 2,\n  cls2: 3,\n  d2: 4\n}), /*#__PURE__*/_wrapRegExp(/path class=\"((?:(?!\")[\\s\\S])+)\".*d=\"((?:(?!\")[\\s\\S])+)\"/, {\n  cls1: 1,\n  d1: 2\n})];\n\nvar styles = namespace.styles,\n    shims = namespace.shims;\nvar LONG_STYLE = Object.values(PREFIX_TO_LONG_STYLE);\nvar _defaultUsablePrefix = null;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar _byOldUnicode = {};\nvar _byAlias = {};\nvar PREFIXES = Object.keys(PREFIX_TO_STYLE);\n\nfunction isReserved(name) {\n  return ~RESERVED_CLASSES.indexOf(name);\n}\n\nfunction getIconName(familyPrefix, cls) {\n  var parts = cls.split('-');\n  var prefix = parts[0];\n  var iconName = parts.slice(1).join('-');\n\n  if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n    return iconName;\n  } else {\n    return null;\n  }\n}\nvar build = function build() {\n  var lookup = function lookup(reducer) {\n    return reduce(styles, function (o, style, prefix) {\n      o[prefix] = reduce(style, reducer, {});\n      return o;\n    }, {});\n  };\n\n  _byUnicode = lookup(function (acc, icon, iconName) {\n    if (icon[3]) {\n      acc[icon[3]] = iconName;\n    }\n\n    if (icon[2]) {\n      var aliases = icon[2].filter(function (a) {\n        return typeof a === 'number';\n      });\n      aliases.forEach(function (alias) {\n        acc[alias.toString(16)] = iconName;\n      });\n    }\n\n    return acc;\n  });\n  _byLigature = lookup(function (acc, icon, iconName) {\n    acc[iconName] = iconName;\n\n    if (icon[2]) {\n      var aliases = icon[2].filter(function (a) {\n        return typeof a === 'string';\n      });\n      aliases.forEach(function (alias) {\n        acc[alias] = iconName;\n      });\n    }\n\n    return acc;\n  });\n  _byAlias = lookup(function (acc, icon, iconName) {\n    var aliases = icon[2];\n    acc[iconName] = iconName;\n    aliases.forEach(function (alias) {\n      acc[alias] = iconName;\n    });\n    return acc;\n  }); // If we have a Kit, we can't determine if regular is available since we\n  // could be auto-fetching it. We'll have to assume that it is available.\n\n  var hasRegular = 'far' in styles || config.autoFetchSvg;\n  var shimLookups = reduce(shims, function (acc, shim) {\n    var maybeNameMaybeUnicode = shim[0];\n    var prefix = shim[1];\n    var iconName = shim[2];\n\n    if (prefix === 'far' && !hasRegular) {\n      prefix = 'fas';\n    }\n\n    if (typeof maybeNameMaybeUnicode === 'string') {\n      acc.names[maybeNameMaybeUnicode] = {\n        prefix: prefix,\n        iconName: iconName\n      };\n    }\n\n    if (typeof maybeNameMaybeUnicode === 'number') {\n      acc.unicodes[maybeNameMaybeUnicode.toString(16)] = {\n        prefix: prefix,\n        iconName: iconName\n      };\n    }\n\n    return acc;\n  }, {\n    names: {},\n    unicodes: {}\n  });\n  _byOldName = shimLookups.names;\n  _byOldUnicode = shimLookups.unicodes;\n  _defaultUsablePrefix = getCanonicalPrefix(config.styleDefault);\n};\nonChange(function (c) {\n  _defaultUsablePrefix = getCanonicalPrefix(c.styleDefault);\n});\nbuild();\nfunction byUnicode(prefix, unicode) {\n  return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n  return (_byLigature[prefix] || {})[ligature];\n}\nfunction byAlias(prefix, alias) {\n  return (_byAlias[prefix] || {})[alias];\n}\nfunction byOldName(name) {\n  return _byOldName[name] || {\n    prefix: null,\n    iconName: null\n  };\n}\nfunction byOldUnicode(unicode) {\n  var oldUnicode = _byOldUnicode[unicode];\n  var newUnicode = byUnicode('fas', unicode);\n  return oldUnicode || (newUnicode ? {\n    prefix: 'fas',\n    iconName: newUnicode\n  } : null) || {\n    prefix: null,\n    iconName: null\n  };\n}\nfunction getDefaultUsablePrefix() {\n  return _defaultUsablePrefix;\n}\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n  return {\n    prefix: null,\n    iconName: null,\n    rest: []\n  };\n};\nfunction getCanonicalPrefix(styleOrPrefix) {\n  var style = PREFIX_TO_STYLE[styleOrPrefix];\n  var prefix = STYLE_TO_PREFIX[styleOrPrefix] || STYLE_TO_PREFIX[style];\n  var defined = styleOrPrefix in namespace.styles ? styleOrPrefix : null;\n  return prefix || defined || null;\n}\nfunction getCanonicalIcon(values) {\n  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _params$skipLookups = params.skipLookups,\n      skipLookups = _params$skipLookups === void 0 ? false : _params$skipLookups;\n  var givenPrefix = null;\n  var canonical = values.reduce(function (acc, cls) {\n    var iconName = getIconName(config.familyPrefix, cls);\n\n    if (styles[cls]) {\n      cls = LONG_STYLE.includes(cls) ? LONG_STYLE_TO_PREFIX[cls] : cls;\n      givenPrefix = cls;\n      acc.prefix = cls;\n    } else if (PREFIXES.indexOf(cls) > -1) {\n      givenPrefix = cls;\n      acc.prefix = getCanonicalPrefix(cls);\n    } else if (iconName) {\n      acc.iconName = iconName;\n    } else if (cls !== config.replacementClass) {\n      acc.rest.push(cls);\n    }\n\n    if (!skipLookups && acc.prefix && acc.iconName) {\n      var shim = givenPrefix === 'fa' ? byOldName(acc.iconName) : {};\n      var aliasIconName = byAlias(acc.prefix, acc.iconName);\n\n      if (shim.prefix) {\n        givenPrefix = null;\n      }\n\n      acc.iconName = shim.iconName || aliasIconName || acc.iconName;\n      acc.prefix = shim.prefix || acc.prefix;\n\n      if (acc.prefix === 'far' && !styles['far'] && styles['fas'] && !config.autoFetchSvg) {\n        // Allow a fallback from the regular style to solid if regular is not available\n        // but only if we aren't auto-fetching SVGs\n        acc.prefix = 'fas';\n      }\n    }\n\n    return acc;\n  }, emptyCanonicalIcon());\n\n  if (canonical.prefix === 'fa' || givenPrefix === 'fa') {\n    // The fa prefix is not canonical. So if it has made it through until this point\n    // we will shift it to the correct prefix.\n    canonical.prefix = getDefaultUsablePrefix() || 'fas';\n  }\n\n  return canonical;\n}\n\nvar Library = /*#__PURE__*/function () {\n  function Library() {\n    _classCallCheck(this, Library);\n\n    this.definitions = {};\n  }\n\n  _createClass(Library, [{\n    key: \"add\",\n    value: function add() {\n      var _this = this;\n\n      for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n        definitions[_key] = arguments[_key];\n      }\n\n      var additions = definitions.reduce(this._pullDefinitions, {});\n      Object.keys(additions).forEach(function (key) {\n        _this.definitions[key] = _objectSpread2(_objectSpread2({}, _this.definitions[key] || {}), additions[key]);\n        defineIcons(key, additions[key]);\n        var longPrefix = PREFIX_TO_LONG_STYLE[key];\n        if (longPrefix) defineIcons(longPrefix, additions[key]);\n        build();\n      });\n    }\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      this.definitions = {};\n    }\n  }, {\n    key: \"_pullDefinitions\",\n    value: function _pullDefinitions(additions, definition) {\n      var normalized = definition.prefix && definition.iconName && definition.icon ? {\n        0: definition\n      } : definition;\n      Object.keys(normalized).map(function (key) {\n        var _normalized$key = normalized[key],\n            prefix = _normalized$key.prefix,\n            iconName = _normalized$key.iconName,\n            icon = _normalized$key.icon;\n        var aliases = icon[2];\n        if (!additions[prefix]) additions[prefix] = {};\n\n        if (aliases.length > 0) {\n          aliases.forEach(function (alias) {\n            if (typeof alias === 'string') {\n              additions[prefix][alias] = icon;\n            }\n          });\n        }\n\n        additions[prefix][iconName] = icon;\n      });\n      return additions;\n    }\n  }]);\n\n  return Library;\n}();\n\nvar _plugins = [];\nvar _hooks = {};\nvar providers = {};\nvar defaultProviderKeys = Object.keys(providers);\nfunction registerPlugins(nextPlugins, _ref) {\n  var obj = _ref.mixoutsTo;\n  _plugins = nextPlugins;\n  _hooks = {};\n  Object.keys(providers).forEach(function (k) {\n    if (defaultProviderKeys.indexOf(k) === -1) {\n      delete providers[k];\n    }\n  });\n\n  _plugins.forEach(function (plugin) {\n    var mixout = plugin.mixout ? plugin.mixout() : {};\n    Object.keys(mixout).forEach(function (tk) {\n      if (typeof mixout[tk] === 'function') {\n        obj[tk] = mixout[tk];\n      }\n\n      if (_typeof(mixout[tk]) === 'object') {\n        Object.keys(mixout[tk]).forEach(function (sk) {\n          if (!obj[tk]) {\n            obj[tk] = {};\n          }\n\n          obj[tk][sk] = mixout[tk][sk];\n        });\n      }\n    });\n\n    if (plugin.hooks) {\n      var hooks = plugin.hooks();\n      Object.keys(hooks).forEach(function (hook) {\n        if (!_hooks[hook]) {\n          _hooks[hook] = [];\n        }\n\n        _hooks[hook].push(hooks[hook]);\n      });\n    }\n\n    if (plugin.provides) {\n      plugin.provides(providers);\n    }\n  });\n\n  return obj;\n}\nfunction chainHooks(hook, accumulator) {\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 hookFns = _hooks[hook] || [];\n  hookFns.forEach(function (hookFn) {\n    accumulator = hookFn.apply(null, [accumulator].concat(args)); // eslint-disable-line no-useless-call\n  });\n  return accumulator;\n}\nfunction callHooks(hook) {\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  var hookFns = _hooks[hook] || [];\n  hookFns.forEach(function (hookFn) {\n    hookFn.apply(null, args);\n  });\n  return undefined;\n}\nfunction callProvided() {\n  var hook = arguments[0];\n  var args = Array.prototype.slice.call(arguments, 1);\n  return providers[hook] ? providers[hook].apply(null, args) : undefined;\n}\n\nfunction findIconDefinition(iconLookup) {\n  if (iconLookup.prefix === 'fa') {\n    iconLookup.prefix = 'fas';\n  }\n\n  var iconName = iconLookup.iconName;\n  var prefix = iconLookup.prefix || getDefaultUsablePrefix();\n  if (!iconName) return;\n  iconName = byAlias(prefix, iconName) || iconName;\n  return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\nvar library = new Library();\nvar noAuto = function noAuto() {\n  config.autoReplaceSvg = false;\n  config.observeMutations = false;\n  callHooks('noAuto');\n};\nvar dom = {\n  i2svg: function i2svg() {\n    var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    if (IS_DOM) {\n      callHooks('beforeI2svg', params);\n      callProvided('pseudoElements2svg', params);\n      return callProvided('i2svg', params);\n    } else {\n      return Promise.reject('Operation requires a DOM of some kind.');\n    }\n  },\n  watch: function watch() {\n    var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var autoReplaceSvgRoot = params.autoReplaceSvgRoot;\n\n    if (config.autoReplaceSvg === false) {\n      config.autoReplaceSvg = true;\n    }\n\n    config.observeMutations = true;\n    domready(function () {\n      autoReplace({\n        autoReplaceSvgRoot: autoReplaceSvgRoot\n      });\n      callHooks('watch', params);\n    });\n  }\n};\nvar parse = {\n  icon: function icon(_icon) {\n    if (_icon === null) {\n      return null;\n    }\n\n    if (_typeof(_icon) === 'object' && _icon.prefix && _icon.iconName) {\n      return {\n        prefix: _icon.prefix,\n        iconName: byAlias(_icon.prefix, _icon.iconName) || _icon.iconName\n      };\n    }\n\n    if (Array.isArray(_icon) && _icon.length === 2) {\n      var iconName = _icon[1].indexOf('fa-') === 0 ? _icon[1].slice(3) : _icon[1];\n      var prefix = getCanonicalPrefix(_icon[0]);\n      return {\n        prefix: prefix,\n        iconName: byAlias(prefix, iconName) || iconName\n      };\n    }\n\n    if (typeof _icon === 'string' && (_icon.indexOf(\"\".concat(config.familyPrefix, \"-\")) > -1 || _icon.match(ICON_SELECTION_SYNTAX_PATTERN))) {\n      var canonicalIcon = getCanonicalIcon(_icon.split(' '), {\n        skipLookups: true\n      });\n      return {\n        prefix: canonicalIcon.prefix || getDefaultUsablePrefix(),\n        iconName: byAlias(canonicalIcon.prefix, canonicalIcon.iconName) || canonicalIcon.iconName\n      };\n    }\n\n    if (typeof _icon === 'string') {\n      var _prefix = getDefaultUsablePrefix();\n\n      return {\n        prefix: _prefix,\n        iconName: byAlias(_prefix, _icon) || _icon\n      };\n    }\n  }\n};\nvar api = {\n  noAuto: noAuto,\n  config: config,\n  dom: dom,\n  parse: parse,\n  library: library,\n  findIconDefinition: findIconDefinition,\n  toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n  var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n      autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n  if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n    node: autoReplaceSvgRoot\n  });\n};\n\nfunction domVariants(val, abstractCreator) {\n  Object.defineProperty(val, 'abstract', {\n    get: abstractCreator\n  });\n  Object.defineProperty(val, 'html', {\n    get: function get() {\n      return val.abstract.map(function (a) {\n        return toHtml(a);\n      });\n    }\n  });\n  Object.defineProperty(val, 'node', {\n    get: function get() {\n      if (!IS_DOM) return;\n      var container = DOCUMENT.createElement('div');\n      container.innerHTML = val.html;\n      return container.children;\n    }\n  });\n  return val;\n}\n\nfunction asIcon (_ref) {\n  var children = _ref.children,\n      main = _ref.main,\n      mask = _ref.mask,\n      attributes = _ref.attributes,\n      styles = _ref.styles,\n      transform = _ref.transform;\n\n  if (transformIsMeaningful(transform) && main.found && !mask.found) {\n    var width = main.width,\n        height = main.height;\n    var offset = {\n      x: width / height / 2,\n      y: 0.5\n    };\n    attributes['style'] = joinStyles(_objectSpread2(_objectSpread2({}, styles), {}, {\n      'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n    }));\n  }\n\n  return [{\n    tag: 'svg',\n    attributes: attributes,\n    children: children\n  }];\n}\n\nfunction asSymbol (_ref) {\n  var prefix = _ref.prefix,\n      iconName = _ref.iconName,\n      children = _ref.children,\n      attributes = _ref.attributes,\n      symbol = _ref.symbol;\n  var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n  return [{\n    tag: 'svg',\n    attributes: {\n      style: 'display: none;'\n    },\n    children: [{\n      tag: 'symbol',\n      attributes: _objectSpread2(_objectSpread2({}, attributes), {}, {\n        id: id\n      }),\n      children: children\n    }]\n  }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n  var _params$icons = params.icons,\n      main = _params$icons.main,\n      mask = _params$icons.mask,\n      prefix = params.prefix,\n      iconName = params.iconName,\n      transform = params.transform,\n      symbol = params.symbol,\n      title = params.title,\n      maskId = params.maskId,\n      titleId = params.titleId,\n      extra = params.extra,\n      _params$watchable = params.watchable,\n      watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n  var _ref = mask.found ? mask : main,\n      width = _ref.width,\n      height = _ref.height;\n\n  var isUploadedIcon = prefix === 'fak';\n  var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : ''].filter(function (c) {\n    return extra.classes.indexOf(c) === -1;\n  }).filter(function (c) {\n    return c !== '' || !!c;\n  }).concat(extra.classes).join(' ');\n  var content = {\n    children: [],\n    attributes: _objectSpread2(_objectSpread2({}, extra.attributes), {}, {\n      'data-prefix': prefix,\n      'data-icon': iconName,\n      'class': attrClass,\n      'role': extra.attributes.role || 'img',\n      'xmlns': 'http://www.w3.org/2000/svg',\n      'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n    })\n  };\n  var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n    width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n  } : {};\n\n  if (watchable) {\n    content.attributes[DATA_FA_I2SVG] = '';\n  }\n\n  if (title) {\n    content.children.push({\n      tag: 'title',\n      attributes: {\n        id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n      },\n      children: [title]\n    });\n    delete content.attributes.title;\n  }\n\n  var args = _objectSpread2(_objectSpread2({}, content), {}, {\n    prefix: prefix,\n    iconName: iconName,\n    main: main,\n    mask: mask,\n    maskId: maskId,\n    transform: transform,\n    symbol: symbol,\n    styles: _objectSpread2(_objectSpread2({}, uploadedIconWidthStyle), extra.styles)\n  });\n\n  var _ref2 = mask.found && main.found ? callProvided('generateAbstractMask', args) || {\n    children: [],\n    attributes: {}\n  } : callProvided('generateAbstractIcon', args) || {\n    children: [],\n    attributes: {}\n  },\n      children = _ref2.children,\n      attributes = _ref2.attributes;\n\n  args.children = children;\n  args.attributes = attributes;\n\n  if (symbol) {\n    return asSymbol(args);\n  } else {\n    return asIcon(args);\n  }\n}\nfunction makeLayersTextAbstract(params) {\n  var content = params.content,\n      width = params.width,\n      height = params.height,\n      transform = params.transform,\n      title = params.title,\n      extra = params.extra,\n      _params$watchable2 = params.watchable,\n      watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n  var attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n    'title': title\n  } : {}), {}, {\n    'class': extra.classes.join(' ')\n  });\n\n  if (watchable) {\n    attributes[DATA_FA_I2SVG] = '';\n  }\n\n  var styles = _objectSpread2({}, extra.styles);\n\n  if (transformIsMeaningful(transform)) {\n    styles['transform'] = transformForCss({\n      transform: transform,\n      startCentered: true,\n      width: width,\n      height: height\n    });\n    styles['-webkit-transform'] = styles['transform'];\n  }\n\n  var styleString = joinStyles(styles);\n\n  if (styleString.length > 0) {\n    attributes['style'] = styleString;\n  }\n\n  var val = [];\n  val.push({\n    tag: 'span',\n    attributes: attributes,\n    children: [content]\n  });\n\n  if (title) {\n    val.push({\n      tag: 'span',\n      attributes: {\n        class: 'sr-only'\n      },\n      children: [title]\n    });\n  }\n\n  return val;\n}\nfunction makeLayersCounterAbstract(params) {\n  var content = params.content,\n      title = params.title,\n      extra = params.extra;\n\n  var attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n    'title': title\n  } : {}), {}, {\n    'class': extra.classes.join(' ')\n  });\n\n  var styleString = joinStyles(extra.styles);\n\n  if (styleString.length > 0) {\n    attributes['style'] = styleString;\n  }\n\n  var val = [];\n  val.push({\n    tag: 'span',\n    attributes: attributes,\n    children: [content]\n  });\n\n  if (title) {\n    val.push({\n      tag: 'span',\n      attributes: {\n        class: 'sr-only'\n      },\n      children: [title]\n    });\n  }\n\n  return val;\n}\n\nvar styles$1 = namespace.styles;\nfunction asFoundIcon(icon) {\n  var width = icon[0];\n  var height = icon[1];\n\n  var _icon$slice = icon.slice(4),\n      _icon$slice2 = _slicedToArray(_icon$slice, 1),\n      vectorData = _icon$slice2[0];\n\n  var element = null;\n\n  if (Array.isArray(vectorData)) {\n    element = {\n      tag: 'g',\n      attributes: {\n        class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n      },\n      children: [{\n        tag: 'path',\n        attributes: {\n          class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n          fill: 'currentColor',\n          d: vectorData[0]\n        }\n      }, {\n        tag: 'path',\n        attributes: {\n          class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n          fill: 'currentColor',\n          d: vectorData[1]\n        }\n      }]\n    };\n  } else {\n    element = {\n      tag: 'path',\n      attributes: {\n        fill: 'currentColor',\n        d: vectorData\n      }\n    };\n  }\n\n  return {\n    found: true,\n    width: width,\n    height: height,\n    icon: element\n  };\n}\nvar missingIconResolutionMixin = {\n  found: false,\n  width: 512,\n  height: 512\n};\n\nfunction maybeNotifyMissing(iconName, prefix) {\n  if (!PRODUCTION && !config.showMissingIcons && iconName) {\n    console.error(\"Icon with name \\\"\".concat(iconName, \"\\\" and prefix \\\"\").concat(prefix, \"\\\" is missing.\"));\n  }\n}\n\nfunction findIcon(iconName, prefix) {\n  var givenPrefix = prefix;\n\n  if (prefix === 'fa' && config.styleDefault !== null) {\n    prefix = getDefaultUsablePrefix();\n  }\n\n  return new Promise(function (resolve, reject) {\n    var val = {\n      found: false,\n      width: 512,\n      height: 512,\n      icon: callProvided('missingIconAbstract') || {}\n    };\n\n    if (givenPrefix === 'fa') {\n      var shim = byOldName(iconName) || {};\n      iconName = shim.iconName || iconName;\n      prefix = shim.prefix || prefix;\n    }\n\n    if (iconName && prefix && styles$1[prefix] && styles$1[prefix][iconName]) {\n      var icon = styles$1[prefix][iconName];\n      return resolve(asFoundIcon(icon));\n    }\n\n    maybeNotifyMissing(iconName, prefix);\n    resolve(_objectSpread2(_objectSpread2({}, missingIconResolutionMixin), {}, {\n      icon: config.showMissingIcons && iconName ? callProvided('missingIconAbstract') || {} : {}\n    }));\n  });\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n  mark: noop$1,\n  measure: noop$1\n};\nvar preamble = \"FA \\\"6.1.1\\\"\";\n\nvar begin = function begin(name) {\n  p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n  return function () {\n    return end(name);\n  };\n};\n\nvar end = function end(name) {\n  p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n  p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n  begin: begin,\n  end: end\n};\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n  var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n  return typeof i2svg === 'string';\n}\n\nfunction hasPrefixAndIcon(node) {\n  var prefix = node.getAttribute ? node.getAttribute(DATA_PREFIX) : null;\n  var icon = node.getAttribute ? node.getAttribute(DATA_ICON) : null;\n  return prefix && icon;\n}\n\nfunction hasBeenReplaced(node) {\n  return node && node.classList && node.classList.contains && node.classList.contains(config.replacementClass);\n}\n\nfunction getMutator() {\n  if (config.autoReplaceSvg === true) {\n    return mutators.replace;\n  }\n\n  var mutator = mutators[config.autoReplaceSvg];\n  return mutator || mutators.replace;\n}\n\nfunction createElementNS(tag) {\n  return DOCUMENT.createElementNS('http://www.w3.org/2000/svg', tag);\n}\n\nfunction createElement(tag) {\n  return DOCUMENT.createElement(tag);\n}\n\nfunction convertSVG(abstractObj) {\n  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _params$ceFn = params.ceFn,\n      ceFn = _params$ceFn === void 0 ? abstractObj.tag === 'svg' ? createElementNS : createElement : _params$ceFn;\n\n  if (typeof abstractObj === 'string') {\n    return DOCUMENT.createTextNode(abstractObj);\n  }\n\n  var tag = ceFn(abstractObj.tag);\n  Object.keys(abstractObj.attributes || []).forEach(function (key) {\n    tag.setAttribute(key, abstractObj.attributes[key]);\n  });\n  var children = abstractObj.children || [];\n  children.forEach(function (child) {\n    tag.appendChild(convertSVG(child, {\n      ceFn: ceFn\n    }));\n  });\n  return tag;\n}\n\nfunction nodeAsComment(node) {\n  var comment = \" \".concat(node.outerHTML, \" \");\n  /* BEGIN.ATTRIBUTION */\n\n  comment = \"\".concat(comment, \"Font Awesome fontawesome.com \");\n  /* END.ATTRIBUTION */\n\n  return comment;\n}\n\nvar mutators = {\n  replace: function replace(mutation) {\n    var node = mutation[0];\n\n    if (node.parentNode) {\n      mutation[1].forEach(function (abstract) {\n        node.parentNode.insertBefore(convertSVG(abstract), node);\n      });\n\n      if (node.getAttribute(DATA_FA_I2SVG) === null && config.keepOriginalSource) {\n        var comment = DOCUMENT.createComment(nodeAsComment(node));\n        node.parentNode.replaceChild(comment, node);\n      } else {\n        node.remove();\n      }\n    }\n  },\n  nest: function nest(mutation) {\n    var node = mutation[0];\n    var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n    // Short-circuit to the standard replacement\n\n    if (~classArray(node).indexOf(config.replacementClass)) {\n      return mutators.replace(mutation);\n    }\n\n    var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n    delete abstract[0].attributes.id;\n\n    if (abstract[0].attributes.class) {\n      var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n        if (cls === config.replacementClass || cls.match(forSvg)) {\n          acc.toSvg.push(cls);\n        } else {\n          acc.toNode.push(cls);\n        }\n\n        return acc;\n      }, {\n        toNode: [],\n        toSvg: []\n      });\n      abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n\n      if (splitClasses.toNode.length === 0) {\n        node.removeAttribute('class');\n      } else {\n        node.setAttribute('class', splitClasses.toNode.join(' '));\n      }\n    }\n\n    var newInnerHTML = abstract.map(function (a) {\n      return toHtml(a);\n    }).join('\\n');\n    node.setAttribute(DATA_FA_I2SVG, '');\n    node.innerHTML = newInnerHTML;\n  }\n};\n\nfunction performOperationSync(op) {\n  op();\n}\n\nfunction perform(mutations, callback) {\n  var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n  if (mutations.length === 0) {\n    callbackFunction();\n  } else {\n    var frame = performOperationSync;\n\n    if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n      frame = WINDOW.requestAnimationFrame || performOperationSync;\n    }\n\n    frame(function () {\n      var mutator = getMutator();\n      var mark = perf.begin('mutate');\n      mutations.map(mutator);\n      mark();\n      callbackFunction();\n    });\n  }\n}\nvar disabled = false;\nfunction disableObservation() {\n  disabled = true;\n}\nfunction enableObservation() {\n  disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n  if (!MUTATION_OBSERVER) {\n    return;\n  }\n\n  if (!config.observeMutations) {\n    return;\n  }\n\n  var _options$treeCallback = options.treeCallback,\n      treeCallback = _options$treeCallback === void 0 ? noop$2 : _options$treeCallback,\n      _options$nodeCallback = options.nodeCallback,\n      nodeCallback = _options$nodeCallback === void 0 ? noop$2 : _options$nodeCallback,\n      _options$pseudoElemen = options.pseudoElementsCallback,\n      pseudoElementsCallback = _options$pseudoElemen === void 0 ? noop$2 : _options$pseudoElemen,\n      _options$observeMutat = options.observeMutationsRoot,\n      observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n  mo = new MUTATION_OBSERVER(function (objects) {\n    if (disabled) return;\n    var defaultPrefix = getDefaultUsablePrefix();\n    toArray(objects).forEach(function (mutationRecord) {\n      if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n        if (config.searchPseudoElements) {\n          pseudoElementsCallback(mutationRecord.target);\n        }\n\n        treeCallback(mutationRecord.target);\n      }\n\n      if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n        pseudoElementsCallback(mutationRecord.target.parentNode);\n      }\n\n      if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n        if (mutationRecord.attributeName === 'class' && hasPrefixAndIcon(mutationRecord.target)) {\n          var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n              prefix = _getCanonicalIcon.prefix,\n              iconName = _getCanonicalIcon.iconName;\n\n          mutationRecord.target.setAttribute(DATA_PREFIX, prefix || defaultPrefix);\n          if (iconName) mutationRecord.target.setAttribute(DATA_ICON, iconName);\n        } else if (hasBeenReplaced(mutationRecord.target)) {\n          nodeCallback(mutationRecord.target);\n        }\n      }\n    });\n  });\n  if (!IS_DOM) return;\n  mo.observe(observeMutationsRoot, {\n    childList: true,\n    attributes: true,\n    characterData: true,\n    subtree: true\n  });\n}\nfunction disconnect() {\n  if (!mo) return;\n  mo.disconnect();\n}\n\nfunction styleParser (node) {\n  var style = node.getAttribute('style');\n  var val = [];\n\n  if (style) {\n    val = style.split(';').reduce(function (acc, style) {\n      var styles = style.split(':');\n      var prop = styles[0];\n      var value = styles.slice(1);\n\n      if (prop && value.length > 0) {\n        acc[prop] = value.join(':').trim();\n      }\n\n      return acc;\n    }, {});\n  }\n\n  return val;\n}\n\nfunction classParser (node) {\n  var existingPrefix = node.getAttribute('data-prefix');\n  var existingIconName = node.getAttribute('data-icon');\n  var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n  var val = getCanonicalIcon(classArray(node));\n\n  if (!val.prefix) {\n    val.prefix = getDefaultUsablePrefix();\n  }\n\n  if (existingPrefix && existingIconName) {\n    val.prefix = existingPrefix;\n    val.iconName = existingIconName;\n  }\n\n  if (val.iconName && val.prefix) {\n    return val;\n  }\n\n  if (val.prefix && innerText.length > 0) {\n    val.iconName = byLigature(val.prefix, node.innerText) || byUnicode(val.prefix, toHex(node.innerText));\n  }\n\n  return val;\n}\n\nfunction attributesParser (node) {\n  var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n    if (acc.name !== 'class' && acc.name !== 'style') {\n      acc[attr.name] = attr.value;\n    }\n\n    return acc;\n  }, {});\n  var title = node.getAttribute('title');\n  var titleId = node.getAttribute('data-fa-title-id');\n\n  if (config.autoA11y) {\n    if (title) {\n      extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n    } else {\n      extraAttributes['aria-hidden'] = 'true';\n      extraAttributes['focusable'] = 'false';\n    }\n  }\n\n  return extraAttributes;\n}\n\nfunction blankMeta() {\n  return {\n    iconName: null,\n    title: null,\n    titleId: null,\n    prefix: null,\n    transform: meaninglessTransform,\n    symbol: false,\n    mask: {\n      iconName: null,\n      prefix: null,\n      rest: []\n    },\n    maskId: null,\n    extra: {\n      classes: [],\n      styles: {},\n      attributes: {}\n    }\n  };\n}\nfunction parseMeta(node) {\n  var parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n    styleParser: true\n  };\n\n  var _classParser = classParser(node),\n      iconName = _classParser.iconName,\n      prefix = _classParser.prefix,\n      extraClasses = _classParser.rest;\n\n  var extraAttributes = attributesParser(node);\n  var pluginMeta = chainHooks('parseNodeAttributes', {}, node);\n  var extraStyles = parser.styleParser ? styleParser(node) : [];\n  return _objectSpread2({\n    iconName: iconName,\n    title: node.getAttribute('title'),\n    titleId: node.getAttribute('data-fa-title-id'),\n    prefix: prefix,\n    transform: meaninglessTransform,\n    mask: {\n      iconName: null,\n      prefix: null,\n      rest: []\n    },\n    maskId: null,\n    symbol: false,\n    extra: {\n      classes: extraClasses,\n      styles: extraStyles,\n      attributes: extraAttributes\n    }\n  }, pluginMeta);\n}\n\nvar styles$2 = namespace.styles;\n\nfunction generateMutation(node) {\n  var nodeMeta = config.autoReplaceSvg === 'nest' ? parseMeta(node, {\n    styleParser: false\n  }) : parseMeta(node);\n\n  if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n    return callProvided('generateLayersText', node, nodeMeta);\n  } else {\n    return callProvided('generateSvgReplacementMutation', node, nodeMeta);\n  }\n}\n\nfunction onTree(root) {\n  var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  if (!IS_DOM) return Promise.resolve();\n  var htmlClassList = DOCUMENT.documentElement.classList;\n\n  var hclAdd = function hclAdd(suffix) {\n    return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n  };\n\n  var hclRemove = function hclRemove(suffix) {\n    return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n  };\n\n  var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$2);\n  var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n    return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n  })).join(', ');\n\n  if (prefixesDomQuery.length === 0) {\n    return Promise.resolve();\n  }\n\n  var candidates = [];\n\n  try {\n    candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n  } catch (e) {// noop\n  }\n\n  if (candidates.length > 0) {\n    hclAdd('pending');\n    hclRemove('complete');\n  } else {\n    return Promise.resolve();\n  }\n\n  var mark = perf.begin('onTree');\n  var mutations = candidates.reduce(function (acc, node) {\n    try {\n      var mutation = generateMutation(node);\n\n      if (mutation) {\n        acc.push(mutation);\n      }\n    } catch (e) {\n      if (!PRODUCTION) {\n        if (e.name === 'MissingIcon') {\n          console.error(e);\n        }\n      }\n    }\n\n    return acc;\n  }, []);\n  return new Promise(function (resolve, reject) {\n    Promise.all(mutations).then(function (resolvedMutations) {\n      perform(resolvedMutations, function () {\n        hclAdd('active');\n        hclAdd('complete');\n        hclRemove('pending');\n        if (typeof callback === 'function') callback();\n        mark();\n        resolve();\n      });\n    }).catch(function (e) {\n      mark();\n      reject(e);\n    });\n  });\n}\n\nfunction onNode(node) {\n  var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  generateMutation(node).then(function (mutation) {\n    if (mutation) {\n      perform([mutation], callback);\n    }\n  });\n}\n\nfunction resolveIcons(next) {\n  return function (maybeIconDefinition) {\n    var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n    var mask = params.mask;\n\n    if (mask) {\n      mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n    }\n\n    return next(iconDefinition, _objectSpread2(_objectSpread2({}, params), {}, {\n      mask: mask\n    }));\n  };\n}\n\nvar render = function render(iconDefinition) {\n  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _params$transform = params.transform,\n      transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n      _params$symbol = params.symbol,\n      symbol = _params$symbol === void 0 ? false : _params$symbol,\n      _params$mask = params.mask,\n      mask = _params$mask === void 0 ? null : _params$mask,\n      _params$maskId = params.maskId,\n      maskId = _params$maskId === void 0 ? null : _params$maskId,\n      _params$title = params.title,\n      title = _params$title === void 0 ? null : _params$title,\n      _params$titleId = params.titleId,\n      titleId = _params$titleId === void 0 ? null : _params$titleId,\n      _params$classes = params.classes,\n      classes = _params$classes === void 0 ? [] : _params$classes,\n      _params$attributes = params.attributes,\n      attributes = _params$attributes === void 0 ? {} : _params$attributes,\n      _params$styles = params.styles,\n      styles = _params$styles === void 0 ? {} : _params$styles;\n  if (!iconDefinition) return;\n  var prefix = iconDefinition.prefix,\n      iconName = iconDefinition.iconName,\n      icon = iconDefinition.icon;\n  return domVariants(_objectSpread2({\n    type: 'icon'\n  }, iconDefinition), function () {\n    callHooks('beforeDOMElementCreation', {\n      iconDefinition: iconDefinition,\n      params: params\n    });\n\n    if (config.autoA11y) {\n      if (title) {\n        attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n      } else {\n        attributes['aria-hidden'] = 'true';\n        attributes['focusable'] = 'false';\n      }\n    }\n\n    return makeInlineSvgAbstract({\n      icons: {\n        main: asFoundIcon(icon),\n        mask: mask ? asFoundIcon(mask.icon) : {\n          found: false,\n          width: null,\n          height: null,\n          icon: {}\n        }\n      },\n      prefix: prefix,\n      iconName: iconName,\n      transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n      symbol: symbol,\n      title: title,\n      maskId: maskId,\n      titleId: titleId,\n      extra: {\n        attributes: attributes,\n        styles: styles,\n        classes: classes\n      }\n    });\n  });\n};\nvar ReplaceElements = {\n  mixout: function mixout() {\n    return {\n      icon: resolveIcons(render)\n    };\n  },\n  hooks: function hooks() {\n    return {\n      mutationObserverCallbacks: function mutationObserverCallbacks(accumulator) {\n        accumulator.treeCallback = onTree;\n        accumulator.nodeCallback = onNode;\n        return accumulator;\n      }\n    };\n  },\n  provides: function provides(providers$$1) {\n    providers$$1.i2svg = function (params) {\n      var _params$node = params.node,\n          node = _params$node === void 0 ? DOCUMENT : _params$node,\n          _params$callback = params.callback,\n          callback = _params$callback === void 0 ? function () {} : _params$callback;\n      return onTree(node, callback);\n    };\n\n    providers$$1.generateSvgReplacementMutation = function (node, nodeMeta) {\n      var iconName = nodeMeta.iconName,\n          title = nodeMeta.title,\n          titleId = nodeMeta.titleId,\n          prefix = nodeMeta.prefix,\n          transform = nodeMeta.transform,\n          symbol = nodeMeta.symbol,\n          mask = nodeMeta.mask,\n          maskId = nodeMeta.maskId,\n          extra = nodeMeta.extra;\n      return new Promise(function (resolve, reject) {\n        Promise.all([findIcon(iconName, prefix), mask.iconName ? findIcon(mask.iconName, mask.prefix) : Promise.resolve({\n          found: false,\n          width: 512,\n          height: 512,\n          icon: {}\n        })]).then(function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              main = _ref2[0],\n              mask = _ref2[1];\n\n          resolve([node, makeInlineSvgAbstract({\n            icons: {\n              main: main,\n              mask: mask\n            },\n            prefix: prefix,\n            iconName: iconName,\n            transform: transform,\n            symbol: symbol,\n            maskId: maskId,\n            title: title,\n            titleId: titleId,\n            extra: extra,\n            watchable: true\n          })]);\n        }).catch(reject);\n      });\n    };\n\n    providers$$1.generateAbstractIcon = function (_ref3) {\n      var children = _ref3.children,\n          attributes = _ref3.attributes,\n          main = _ref3.main,\n          transform = _ref3.transform,\n          styles = _ref3.styles;\n      var styleString = joinStyles(styles);\n\n      if (styleString.length > 0) {\n        attributes['style'] = styleString;\n      }\n\n      var nextChild;\n\n      if (transformIsMeaningful(transform)) {\n        nextChild = callProvided('generateAbstractTransformGrouping', {\n          main: main,\n          transform: transform,\n          containerWidth: main.width,\n          iconWidth: main.width\n        });\n      }\n\n      children.push(nextChild || main.icon);\n      return {\n        children: children,\n        attributes: attributes\n      };\n    };\n  }\n};\n\nvar Layers = {\n  mixout: function mixout() {\n    return {\n      layer: function layer(assembler) {\n        var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        var _params$classes = params.classes,\n            classes = _params$classes === void 0 ? [] : _params$classes;\n        return domVariants({\n          type: 'layer'\n        }, function () {\n          callHooks('beforeDOMElementCreation', {\n            assembler: assembler,\n            params: params\n          });\n          var children = [];\n          assembler(function (args) {\n            Array.isArray(args) ? args.map(function (a) {\n              children = children.concat(a.abstract);\n            }) : children = children.concat(args.abstract);\n          });\n          return [{\n            tag: 'span',\n            attributes: {\n              class: [\"\".concat(config.familyPrefix, \"-layers\")].concat(_toConsumableArray(classes)).join(' ')\n            },\n            children: children\n          }];\n        });\n      }\n    };\n  }\n};\n\nvar LayersCounter = {\n  mixout: function mixout() {\n    return {\n      counter: function counter(content) {\n        var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        var _params$title = params.title,\n            title = _params$title === void 0 ? null : _params$title,\n            _params$classes = params.classes,\n            classes = _params$classes === void 0 ? [] : _params$classes,\n            _params$attributes = params.attributes,\n            attributes = _params$attributes === void 0 ? {} : _params$attributes,\n            _params$styles = params.styles,\n            styles = _params$styles === void 0 ? {} : _params$styles;\n        return domVariants({\n          type: 'counter',\n          content: content\n        }, function () {\n          callHooks('beforeDOMElementCreation', {\n            content: content,\n            params: params\n          });\n          return makeLayersCounterAbstract({\n            content: content.toString(),\n            title: title,\n            extra: {\n              attributes: attributes,\n              styles: styles,\n              classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n            }\n          });\n        });\n      }\n    };\n  }\n};\n\nvar LayersText = {\n  mixout: function mixout() {\n    return {\n      text: function text(content) {\n        var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        var _params$transform = params.transform,\n            transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n            _params$title = params.title,\n            title = _params$title === void 0 ? null : _params$title,\n            _params$classes = params.classes,\n            classes = _params$classes === void 0 ? [] : _params$classes,\n            _params$attributes = params.attributes,\n            attributes = _params$attributes === void 0 ? {} : _params$attributes,\n            _params$styles = params.styles,\n            styles = _params$styles === void 0 ? {} : _params$styles;\n        return domVariants({\n          type: 'text',\n          content: content\n        }, function () {\n          callHooks('beforeDOMElementCreation', {\n            content: content,\n            params: params\n          });\n          return makeLayersTextAbstract({\n            content: content,\n            transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n            title: title,\n            extra: {\n              attributes: attributes,\n              styles: styles,\n              classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n            }\n          });\n        });\n      }\n    };\n  },\n  provides: function provides(providers$$1) {\n    providers$$1.generateLayersText = function (node, nodeMeta) {\n      var title = nodeMeta.title,\n          transform = nodeMeta.transform,\n          extra = nodeMeta.extra;\n      var width = null;\n      var height = null;\n\n      if (IS_IE) {\n        var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n        var boundingClientRect = node.getBoundingClientRect();\n        width = boundingClientRect.width / computedFontSize;\n        height = boundingClientRect.height / computedFontSize;\n      }\n\n      if (config.autoA11y && !title) {\n        extra.attributes['aria-hidden'] = 'true';\n      }\n\n      return Promise.resolve([node, makeLayersTextAbstract({\n        content: node.innerHTML,\n        width: width,\n        height: height,\n        transform: transform,\n        title: title,\n        extra: extra,\n        watchable: true\n      })]);\n    };\n  }\n};\n\nvar CLEAN_CONTENT_PATTERN = new RegExp(\"\\\"\", 'ug');\nvar SECONDARY_UNICODE_RANGE = [1105920, 1112319];\nfunction hexValueFromContent(content) {\n  var cleaned = content.replace(CLEAN_CONTENT_PATTERN, '');\n  var codePoint = codePointAt(cleaned, 0);\n  var isPrependTen = codePoint >= SECONDARY_UNICODE_RANGE[0] && codePoint <= SECONDARY_UNICODE_RANGE[1];\n  var isDoubled = cleaned.length === 2 ? cleaned[0] === cleaned[1] : false;\n  return {\n    value: isDoubled ? toHex(cleaned[0]) : toHex(cleaned),\n    isSecondary: isPrependTen || isDoubled\n  };\n}\n\nfunction replaceForPosition(node, position) {\n  var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n  return new Promise(function (resolve, reject) {\n    if (node.getAttribute(pendingAttribute) !== null) {\n      // This node is already being processed\n      return resolve();\n    }\n\n    var children = toArray(node.children);\n    var alreadyProcessedPseudoElement = children.filter(function (c) {\n      return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n    })[0];\n    var styles = WINDOW.getComputedStyle(node, position);\n    var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n    var fontWeight = styles.getPropertyValue('font-weight');\n    var content = styles.getPropertyValue('content');\n\n    if (alreadyProcessedPseudoElement && !fontFamily) {\n      // If we've already processed it but the current computed style does not result in a font-family,\n      // that probably means that a class name that was previously present to make the icon has been\n      // removed. So we now should delete the icon.\n      node.removeChild(alreadyProcessedPseudoElement);\n      return resolve();\n    } else if (fontFamily && content !== 'none' && content !== '') {\n      var _content = styles.getPropertyValue('content');\n\n      var prefix = ~['Solid', 'Regular', 'Light', 'Thin', 'Duotone', 'Brands', 'Kit'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n\n      var _hexValueFromContent = hexValueFromContent(_content),\n          hexValue = _hexValueFromContent.value,\n          isSecondary = _hexValueFromContent.isSecondary;\n\n      var isV4 = fontFamily[0].startsWith('FontAwesome');\n      var iconName = byUnicode(prefix, hexValue);\n      var iconIdentifier = iconName;\n\n      if (isV4) {\n        var iconName4 = byOldUnicode(hexValue);\n\n        if (iconName4.iconName && iconName4.prefix) {\n          iconName = iconName4.iconName;\n          prefix = iconName4.prefix;\n        }\n      } // Only convert the pseudo element in this ::before/::after position into an icon if we haven't\n      // already done so with the same prefix and iconName\n\n\n      if (iconName && !isSecondary && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n        node.setAttribute(pendingAttribute, iconIdentifier);\n\n        if (alreadyProcessedPseudoElement) {\n          // Delete the old one, since we're replacing it with a new one\n          node.removeChild(alreadyProcessedPseudoElement);\n        }\n\n        var meta = blankMeta();\n        var extra = meta.extra;\n        extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n        findIcon(iconName, prefix).then(function (main) {\n          var abstract = makeInlineSvgAbstract(_objectSpread2(_objectSpread2({}, meta), {}, {\n            icons: {\n              main: main,\n              mask: emptyCanonicalIcon()\n            },\n            prefix: prefix,\n            iconName: iconIdentifier,\n            extra: extra,\n            watchable: true\n          }));\n          var element = DOCUMENT.createElement('svg');\n\n          if (position === '::before') {\n            node.insertBefore(element, node.firstChild);\n          } else {\n            node.appendChild(element);\n          }\n\n          element.outerHTML = abstract.map(function (a) {\n            return toHtml(a);\n          }).join('\\n');\n          node.removeAttribute(pendingAttribute);\n          resolve();\n        }).catch(reject);\n      } else {\n        resolve();\n      }\n    } else {\n      resolve();\n    }\n  });\n}\n\nfunction replace(node) {\n  return Promise.all([replaceForPosition(node, '::before'), replaceForPosition(node, '::after')]);\n}\n\nfunction processable(node) {\n  return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements(root) {\n  if (!IS_DOM) return;\n  return new Promise(function (resolve, reject) {\n    var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n    var end = perf.begin('searchPseudoElements');\n    disableObservation();\n    Promise.all(operations).then(function () {\n      end();\n      enableObservation();\n      resolve();\n    }).catch(function () {\n      end();\n      enableObservation();\n      reject();\n    });\n  });\n}\n\nvar PseudoElements = {\n  hooks: function hooks() {\n    return {\n      mutationObserverCallbacks: function mutationObserverCallbacks(accumulator) {\n        accumulator.pseudoElementsCallback = searchPseudoElements;\n        return accumulator;\n      }\n    };\n  },\n  provides: function provides(providers$$1) {\n    providers$$1.pseudoElements2svg = function (params) {\n      var _params$node = params.node,\n          node = _params$node === void 0 ? DOCUMENT : _params$node;\n\n      if (config.searchPseudoElements) {\n        searchPseudoElements(node);\n      }\n    };\n  }\n};\n\nvar _unwatched = false;\nvar MutationObserver$1 = {\n  mixout: function mixout() {\n    return {\n      dom: {\n        unwatch: function unwatch() {\n          disableObservation();\n          _unwatched = true;\n        }\n      }\n    };\n  },\n  hooks: function hooks() {\n    return {\n      bootstrap: function bootstrap() {\n        observe(chainHooks('mutationObserverCallbacks', {}));\n      },\n      noAuto: function noAuto() {\n        disconnect();\n      },\n      watch: function watch(params) {\n        var observeMutationsRoot = params.observeMutationsRoot;\n\n        if (_unwatched) {\n          enableObservation();\n        } else {\n          observe(chainHooks('mutationObserverCallbacks', {\n            observeMutationsRoot: observeMutationsRoot\n          }));\n        }\n      }\n    };\n  }\n};\n\nvar parseTransformString = function parseTransformString(transformString) {\n  var transform = {\n    size: 16,\n    x: 0,\n    y: 0,\n    flipX: false,\n    flipY: false,\n    rotate: 0\n  };\n  return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n    var parts = n.toLowerCase().split('-');\n    var first = parts[0];\n    var rest = parts.slice(1).join('-');\n\n    if (first && rest === 'h') {\n      acc.flipX = true;\n      return acc;\n    }\n\n    if (first && rest === 'v') {\n      acc.flipY = true;\n      return acc;\n    }\n\n    rest = parseFloat(rest);\n\n    if (isNaN(rest)) {\n      return acc;\n    }\n\n    switch (first) {\n      case 'grow':\n        acc.size = acc.size + rest;\n        break;\n\n      case 'shrink':\n        acc.size = acc.size - rest;\n        break;\n\n      case 'left':\n        acc.x = acc.x - rest;\n        break;\n\n      case 'right':\n        acc.x = acc.x + rest;\n        break;\n\n      case 'up':\n        acc.y = acc.y - rest;\n        break;\n\n      case 'down':\n        acc.y = acc.y + rest;\n        break;\n\n      case 'rotate':\n        acc.rotate = acc.rotate + rest;\n        break;\n    }\n\n    return acc;\n  }, transform);\n};\nvar PowerTransforms = {\n  mixout: function mixout() {\n    return {\n      parse: {\n        transform: function transform(transformString) {\n          return parseTransformString(transformString);\n        }\n      }\n    };\n  },\n  hooks: function hooks() {\n    return {\n      parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n        var transformString = node.getAttribute('data-fa-transform');\n\n        if (transformString) {\n          accumulator.transform = parseTransformString(transformString);\n        }\n\n        return accumulator;\n      }\n    };\n  },\n  provides: function provides(providers) {\n    providers.generateAbstractTransformGrouping = function (_ref) {\n      var main = _ref.main,\n          transform = _ref.transform,\n          containerWidth = _ref.containerWidth,\n          iconWidth = _ref.iconWidth;\n      var outer = {\n        transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n      };\n      var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n      var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n      var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n      var inner = {\n        transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n      };\n      var path = {\n        transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n      };\n      var operations = {\n        outer: outer,\n        inner: inner,\n        path: path\n      };\n      return {\n        tag: 'g',\n        attributes: _objectSpread2({}, operations.outer),\n        children: [{\n          tag: 'g',\n          attributes: _objectSpread2({}, operations.inner),\n          children: [{\n            tag: main.icon.tag,\n            children: main.icon.children,\n            attributes: _objectSpread2(_objectSpread2({}, main.icon.attributes), operations.path)\n          }]\n        }]\n      };\n    };\n  }\n};\n\nvar ALL_SPACE = {\n  x: 0,\n  y: 0,\n  width: '100%',\n  height: '100%'\n};\n\nfunction fillBlack(abstract) {\n  var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n  if (abstract.attributes && (abstract.attributes.fill || force)) {\n    abstract.attributes.fill = 'black';\n  }\n\n  return abstract;\n}\n\nfunction deGroup(abstract) {\n  if (abstract.tag === 'g') {\n    return abstract.children;\n  } else {\n    return [abstract];\n  }\n}\n\nvar Masks = {\n  hooks: function hooks() {\n    return {\n      parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n        var maskData = node.getAttribute('data-fa-mask');\n        var mask = !maskData ? emptyCanonicalIcon() : getCanonicalIcon(maskData.split(' ').map(function (i) {\n          return i.trim();\n        }));\n\n        if (!mask.prefix) {\n          mask.prefix = getDefaultUsablePrefix();\n        }\n\n        accumulator.mask = mask;\n        accumulator.maskId = node.getAttribute('data-fa-mask-id');\n        return accumulator;\n      }\n    };\n  },\n  provides: function provides(providers) {\n    providers.generateAbstractMask = function (_ref) {\n      var children = _ref.children,\n          attributes = _ref.attributes,\n          main = _ref.main,\n          mask = _ref.mask,\n          explicitMaskId = _ref.maskId,\n          transform = _ref.transform;\n      var mainWidth = main.width,\n          mainPath = main.icon;\n      var maskWidth = mask.width,\n          maskPath = mask.icon;\n      var trans = transformForSvg({\n        transform: transform,\n        containerWidth: maskWidth,\n        iconWidth: mainWidth\n      });\n      var maskRect = {\n        tag: 'rect',\n        attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n          fill: 'white'\n        })\n      };\n      var maskInnerGroupChildrenMixin = mainPath.children ? {\n        children: mainPath.children.map(fillBlack)\n      } : {};\n      var maskInnerGroup = {\n        tag: 'g',\n        attributes: _objectSpread2({}, trans.inner),\n        children: [fillBlack(_objectSpread2({\n          tag: mainPath.tag,\n          attributes: _objectSpread2(_objectSpread2({}, mainPath.attributes), trans.path)\n        }, maskInnerGroupChildrenMixin))]\n      };\n      var maskOuterGroup = {\n        tag: 'g',\n        attributes: _objectSpread2({}, trans.outer),\n        children: [maskInnerGroup]\n      };\n      var maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n      var clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n      var maskTag = {\n        tag: 'mask',\n        attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n          id: maskId,\n          maskUnits: 'userSpaceOnUse',\n          maskContentUnits: 'userSpaceOnUse'\n        }),\n        children: [maskRect, maskOuterGroup]\n      };\n      var defs = {\n        tag: 'defs',\n        children: [{\n          tag: 'clipPath',\n          attributes: {\n            id: clipId\n          },\n          children: deGroup(maskPath)\n        }, maskTag]\n      };\n      children.push(defs, {\n        tag: 'rect',\n        attributes: _objectSpread2({\n          fill: 'currentColor',\n          'clip-path': \"url(#\".concat(clipId, \")\"),\n          mask: \"url(#\".concat(maskId, \")\")\n        }, ALL_SPACE)\n      });\n      return {\n        children: children,\n        attributes: attributes\n      };\n    };\n  }\n};\n\nvar MissingIconIndicator = {\n  provides: function provides(providers) {\n    var reduceMotion = false;\n\n    if (WINDOW.matchMedia) {\n      reduceMotion = WINDOW.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    }\n\n    providers.missingIconAbstract = function () {\n      var gChildren = [];\n      var FILL = {\n        fill: 'currentColor'\n      };\n      var ANIMATION_BASE = {\n        attributeType: 'XML',\n        repeatCount: 'indefinite',\n        dur: '2s'\n      }; // Ring\n\n      gChildren.push({\n        tag: 'path',\n        attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n          d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n        })\n      });\n\n      var OPACITY_ANIMATE = _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n        attributeName: 'opacity'\n      });\n\n      var dot = {\n        tag: 'circle',\n        attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n          cx: '256',\n          cy: '364',\n          r: '28'\n        }),\n        children: []\n      };\n\n      if (!reduceMotion) {\n        dot.children.push({\n          tag: 'animate',\n          attributes: _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n            attributeName: 'r',\n            values: '28;14;28;28;14;28;'\n          })\n        }, {\n          tag: 'animate',\n          attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n            values: '1;0;1;1;0;1;'\n          })\n        });\n      }\n\n      gChildren.push(dot);\n      gChildren.push({\n        tag: 'path',\n        attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n          opacity: '1',\n          d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n        }),\n        children: reduceMotion ? [] : [{\n          tag: 'animate',\n          attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n            values: '1;0;0;0;0;1;'\n          })\n        }]\n      });\n\n      if (!reduceMotion) {\n        // Exclamation\n        gChildren.push({\n          tag: 'path',\n          attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n            opacity: '0',\n            d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n          }),\n          children: [{\n            tag: 'animate',\n            attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n              values: '0;0;1;1;0;0;'\n            })\n          }]\n        });\n      }\n\n      return {\n        tag: 'g',\n        attributes: {\n          'class': 'missing'\n        },\n        children: gChildren\n      };\n    };\n  }\n};\n\nvar SvgSymbols = {\n  hooks: function hooks() {\n    return {\n      parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n        var symbolData = node.getAttribute('data-fa-symbol');\n        var symbol = symbolData === null ? false : symbolData === '' ? true : symbolData;\n        accumulator['symbol'] = symbol;\n        return accumulator;\n      }\n    };\n  }\n};\n\nvar plugins = [InjectCSS, ReplaceElements, Layers, LayersCounter, LayersText, PseudoElements, MutationObserver$1, PowerTransforms, Masks, MissingIconIndicator, SvgSymbols];\n\nregisterPlugins(plugins, {\n  mixoutsTo: api\n});\nvar noAuto$1 = api.noAuto;\nvar config$1 = api.config;\nvar library$1 = api.library;\nvar dom$1 = api.dom;\nvar parse$1 = api.parse;\nvar findIconDefinition$1 = api.findIconDefinition;\nvar toHtml$1 = api.toHtml;\nvar icon = api.icon;\nvar layer = api.layer;\nvar text = api.text;\nvar counter = api.counter;\n\nexport { noAuto$1 as noAuto, config$1 as config, library$1 as library, dom$1 as dom, parse$1 as parse, findIconDefinition$1 as findIconDefinition, toHtml$1 as toHtml, icon, layer, text, counter, api };\n","import { parse, icon, config, text } from '@fortawesome/fontawesome-svg-core';\nimport { h, defineComponent, computed, watch } from 'vue';\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\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 = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n\n  return target;\n}\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\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 _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 _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\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 _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}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar humps$1 = {exports: {}};\n\n(function (module) {\n(function(global) {\n\n\t  var _processKeys = function(convert, obj, options) {\n\t    if(!_isObject(obj) || _isDate(obj) || _isRegExp(obj) || _isBoolean(obj) || _isFunction(obj)) {\n\t      return obj;\n\t    }\n\n\t    var output,\n\t        i = 0,\n\t        l = 0;\n\n\t    if(_isArray(obj)) {\n\t      output = [];\n\t      for(l=obj.length; i<l; i++) {\n\t        output.push(_processKeys(convert, obj[i], options));\n\t      }\n\t    }\n\t    else {\n\t      output = {};\n\t      for(var key in obj) {\n\t        if(Object.prototype.hasOwnProperty.call(obj, key)) {\n\t          output[convert(key, options)] = _processKeys(convert, obj[key], options);\n\t        }\n\t      }\n\t    }\n\t    return output;\n\t  };\n\n\t  // String conversion methods\n\n\t  var separateWords = function(string, options) {\n\t    options = options || {};\n\t    var separator = options.separator || '_';\n\t    var split = options.split || /(?=[A-Z])/;\n\n\t    return string.split(split).join(separator);\n\t  };\n\n\t  var camelize = function(string) {\n\t    if (_isNumerical(string)) {\n\t      return string;\n\t    }\n\t    string = string.replace(/[\\-_\\s]+(.)?/g, function(match, chr) {\n\t      return chr ? chr.toUpperCase() : '';\n\t    });\n\t    // Ensure 1st char is always lowercase\n\t    return string.substr(0, 1).toLowerCase() + string.substr(1);\n\t  };\n\n\t  var pascalize = function(string) {\n\t    var camelized = camelize(string);\n\t    // Ensure 1st char is always uppercase\n\t    return camelized.substr(0, 1).toUpperCase() + camelized.substr(1);\n\t  };\n\n\t  var decamelize = function(string, options) {\n\t    return separateWords(string, options).toLowerCase();\n\t  };\n\n\t  // Utilities\n\t  // Taken from Underscore.js\n\n\t  var toString = Object.prototype.toString;\n\n\t  var _isFunction = function(obj) {\n\t    return typeof(obj) === 'function';\n\t  };\n\t  var _isObject = function(obj) {\n\t    return obj === Object(obj);\n\t  };\n\t  var _isArray = function(obj) {\n\t    return toString.call(obj) == '[object Array]';\n\t  };\n\t  var _isDate = function(obj) {\n\t    return toString.call(obj) == '[object Date]';\n\t  };\n\t  var _isRegExp = function(obj) {\n\t    return toString.call(obj) == '[object RegExp]';\n\t  };\n\t  var _isBoolean = function(obj) {\n\t    return toString.call(obj) == '[object Boolean]';\n\t  };\n\n\t  // Performant way to determine if obj coerces to a number\n\t  var _isNumerical = function(obj) {\n\t    obj = obj - 0;\n\t    return obj === obj;\n\t  };\n\n\t  // Sets up function which handles processing keys\n\t  // allowing the convert function to be modified by a callback\n\t  var _processor = function(convert, options) {\n\t    var callback = options && 'process' in options ? options.process : options;\n\n\t    if(typeof(callback) !== 'function') {\n\t      return convert;\n\t    }\n\n\t    return function(string, options) {\n\t      return callback(string, convert, options);\n\t    }\n\t  };\n\n\t  var humps = {\n\t    camelize: camelize,\n\t    decamelize: decamelize,\n\t    pascalize: pascalize,\n\t    depascalize: decamelize,\n\t    camelizeKeys: function(object, options) {\n\t      return _processKeys(_processor(camelize, options), object);\n\t    },\n\t    decamelizeKeys: function(object, options) {\n\t      return _processKeys(_processor(decamelize, options), object, options);\n\t    },\n\t    pascalizeKeys: function(object, options) {\n\t      return _processKeys(_processor(pascalize, options), object);\n\t    },\n\t    depascalizeKeys: function () {\n\t      return this.decamelizeKeys.apply(this, arguments);\n\t    }\n\t  };\n\n\t  if (module.exports) {\n\t    module.exports = humps;\n\t  } else {\n\t    global.humps = humps;\n\t  }\n\n\t})(commonjsGlobal);\n} (humps$1));\n\nvar humps = humps$1.exports;\n\nvar _excluded = [\"class\", \"style\"];\n/**\n * Converts a CSS style into a plain Javascript object.\n * @param {String} style The style to converts into a plain Javascript object.\n * @returns {Object}\n */\n\nfunction styleToObject(style) {\n  return style.split(';').map(function (s) {\n    return s.trim();\n  }).filter(function (s) {\n    return s;\n  }).reduce(function (output, pair) {\n    var idx = pair.indexOf(':');\n    var prop = humps.camelize(pair.slice(0, idx));\n    var value = pair.slice(idx + 1).trim();\n    output[prop] = value;\n    return output;\n  }, {});\n}\n/**\n * Converts a CSS class list into a plain Javascript object.\n * @param {Array<String>} classes The class list to convert.\n * @returns {Object}\n */\n\n\nfunction classToObject(classes) {\n  return classes.split(/\\s+/).reduce(function (output, className) {\n    output[className] = true;\n    return output;\n  }, {});\n}\n/**\n * Converts a FontAwesome abstract element of an icon into a Vue VNode.\n * @param {AbstractElement | String} abstractElement The element to convert.\n * @param {Object} props The user-defined props.\n * @param {Object} attrs The user-defined native HTML attributes.\n * @returns {VNode}\n */\n\n\nfunction convert(abstractElement) {\n  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  // If the abstract element is a string, we'll just return a string render function\n  if (typeof abstractElement === 'string') {\n    return abstractElement;\n  } // Converting abstract element children into Vue VNodes\n\n\n  var children = (abstractElement.children || []).map(function (child) {\n    return convert(child);\n  }); // Converting abstract element attributes into valid Vue format\n\n  var mixins = Object.keys(abstractElement.attributes || {}).reduce(function (mixins, key) {\n    var value = abstractElement.attributes[key];\n\n    switch (key) {\n      case 'class':\n        mixins.class = classToObject(value);\n        break;\n\n      case 'style':\n        mixins.style = styleToObject(value);\n        break;\n\n      default:\n        mixins.attrs[key] = value;\n    }\n\n    return mixins;\n  }, {\n    attrs: {},\n    class: {},\n    style: {}\n  }); // Now, we'll return the VNode\n\n  attrs.class;\n      var _attrs$style = attrs.style,\n      aStyle = _attrs$style === void 0 ? {} : _attrs$style,\n      otherAttrs = _objectWithoutProperties(attrs, _excluded);\n\n  return h(abstractElement.tag, _objectSpread2(_objectSpread2(_objectSpread2({}, props), {}, {\n    class: mixins.class,\n    style: _objectSpread2(_objectSpread2({}, mixins.style), aStyle)\n  }, mixins.attrs), otherAttrs), children);\n}\n\nvar PRODUCTION = false;\n\ntry {\n  PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\n\nfunction log () {\n  if (!PRODUCTION && console && typeof console.error === 'function') {\n    var _console;\n\n    (_console = console).error.apply(_console, arguments);\n  }\n}\n\nfunction objectWithKey(key, value) {\n  return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\nfunction classList(props) {\n  var _classes;\n\n  var classes = (_classes = {\n    'fa-spin': props.spin,\n    'fa-pulse': props.pulse,\n    'fa-fw': props.fixedWidth,\n    'fa-border': props.border,\n    'fa-li': props.listItem,\n    'fa-inverse': props.inverse,\n    'fa-flip': props.flip === true,\n    'fa-flip-horizontal': props.flip === 'horizontal' || props.flip === 'both',\n    'fa-flip-vertical': props.flip === 'vertical' || props.flip === 'both'\n  }, _defineProperty(_classes, \"fa-\".concat(props.size), props.size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(props.rotation), props.rotation !== null), _defineProperty(_classes, \"fa-pull-\".concat(props.pull), props.pull !== null), _defineProperty(_classes, 'fa-swap-opacity', props.swapOpacity), _defineProperty(_classes, 'fa-bounce', props.bounce), _defineProperty(_classes, 'fa-shake', props.shake), _defineProperty(_classes, 'fa-beat', props.beat), _defineProperty(_classes, 'fa-fade', props.fade), _defineProperty(_classes, 'fa-beat-fade', props.beatFade), _defineProperty(_classes, 'fa-flash', props.flash), _defineProperty(_classes, 'fa-spin-pulse', props.spinPulse), _defineProperty(_classes, 'fa-spin-reverse', props.spinReverse), _classes);\n  return Object.keys(classes).map(function (key) {\n    return classes[key] ? key : null;\n  }).filter(function (key) {\n    return key;\n  });\n}\n\nfunction normalizeIconArgs(icon) {\n  if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName && icon.icon) {\n    return icon;\n  }\n\n  if (parse.icon) {\n    return parse.icon(icon);\n  }\n\n  if (icon === null) {\n    return null;\n  }\n\n  if (_typeof(icon) === 'object' && icon.prefix && icon.iconName) {\n    return icon;\n  }\n\n  if (Array.isArray(icon) && icon.length === 2) {\n    return {\n      prefix: icon[0],\n      iconName: icon[1]\n    };\n  }\n\n  if (typeof icon === 'string') {\n    return {\n      prefix: 'fas',\n      iconName: icon\n    };\n  }\n}\n\nvar FontAwesomeIcon = defineComponent({\n  name: 'FontAwesomeIcon',\n  props: {\n    border: {\n      type: Boolean,\n      default: false\n    },\n    fixedWidth: {\n      type: Boolean,\n      default: false\n    },\n    flip: {\n      type: [Boolean, String],\n      default: false,\n      validator: function validator(value) {\n        return [true, false, 'horizontal', 'vertical', 'both'].indexOf(value) > -1;\n      }\n    },\n    icon: {\n      type: [Object, Array, String],\n      required: true\n    },\n    mask: {\n      type: [Object, Array, String],\n      default: null\n    },\n    listItem: {\n      type: Boolean,\n      default: false\n    },\n    pull: {\n      type: String,\n      default: null,\n      validator: function validator(value) {\n        return ['right', 'left'].indexOf(value) > -1;\n      }\n    },\n    pulse: {\n      type: Boolean,\n      default: false\n    },\n    rotation: {\n      type: [String, Number],\n      default: null,\n      validator: function validator(value) {\n        return [90, 180, 270].indexOf(Number.parseInt(value, 10)) > -1;\n      }\n    },\n    swapOpacity: {\n      type: Boolean,\n      default: false\n    },\n    size: {\n      type: String,\n      default: null,\n      validator: function validator(value) {\n        return ['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x'].indexOf(value) > -1;\n      }\n    },\n    spin: {\n      type: Boolean,\n      default: false\n    },\n    transform: {\n      type: [String, Object],\n      default: null\n    },\n    symbol: {\n      type: [Boolean, String],\n      default: false\n    },\n    title: {\n      type: String,\n      default: null\n    },\n    inverse: {\n      type: Boolean,\n      default: false\n    },\n    bounce: {\n      type: Boolean,\n      default: false\n    },\n    shake: {\n      type: Boolean,\n      default: false\n    },\n    beat: {\n      type: Boolean,\n      default: false\n    },\n    fade: {\n      type: Boolean,\n      default: false\n    },\n    beatFade: {\n      type: Boolean,\n      default: false\n    },\n    flash: {\n      type: Boolean,\n      default: false\n    },\n    spinPulse: {\n      type: Boolean,\n      default: false\n    },\n    spinReverse: {\n      type: Boolean,\n      default: false\n    }\n  },\n  setup: function setup(props, _ref) {\n    var attrs = _ref.attrs;\n    var icon$1 = computed(function () {\n      return normalizeIconArgs(props.icon);\n    });\n    var classes = computed(function () {\n      return objectWithKey('classes', classList(props));\n    });\n    var transform = computed(function () {\n      return objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n    });\n    var mask = computed(function () {\n      return objectWithKey('mask', normalizeIconArgs(props.mask));\n    });\n    var renderedIcon = computed(function () {\n      return icon(icon$1.value, _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, classes.value), transform.value), mask.value), {}, {\n        symbol: props.symbol,\n        title: props.title\n      }));\n    });\n    watch(renderedIcon, function (value) {\n      if (!value) {\n        return log('Could not find one or more icon(s)', icon$1.value, mask.value);\n      }\n    }, {\n      immediate: true\n    });\n    var vnode = computed(function () {\n      return renderedIcon.value ? convert(renderedIcon.value.abstract[0], {}, attrs) : null;\n    });\n    return function () {\n      return vnode.value;\n    };\n  }\n});\n\nvar FontAwesomeLayers = defineComponent({\n  name: 'FontAwesomeLayers',\n  props: {\n    fixedWidth: {\n      type: Boolean,\n      default: false\n    }\n  },\n  setup: function setup(props, _ref) {\n    var slots = _ref.slots;\n    var familyPrefix = config.familyPrefix;\n    var className = computed(function () {\n      return [\"\".concat(familyPrefix, \"-layers\")].concat(_toConsumableArray(props.fixedWidth ? [\"\".concat(familyPrefix, \"-fw\")] : []));\n    });\n    return function () {\n      return h('div', {\n        class: className.value\n      }, slots.default ? slots.default() : []);\n    };\n  }\n});\n\nvar FontAwesomeLayersText = defineComponent({\n  name: 'FontAwesomeLayersText',\n  props: {\n    value: {\n      type: [String, Number],\n      default: ''\n    },\n    transform: {\n      type: [String, Object],\n      default: null\n    },\n    counter: {\n      type: Boolean,\n      default: false\n    },\n    position: {\n      type: String,\n      default: null,\n      validator: function validator(value) {\n        return ['bottom-left', 'bottom-right', 'top-left', 'top-right'].indexOf(value) > -1;\n      }\n    }\n  },\n  setup: function setup(props, _ref) {\n    var attrs = _ref.attrs;\n    var familyPrefix = config.familyPrefix;\n    var classes = computed(function () {\n      return objectWithKey('classes', [].concat(_toConsumableArray(props.counter ? [\"\".concat(familyPrefix, \"-layers-counter\")] : []), _toConsumableArray(props.position ? [\"\".concat(familyPrefix, \"-layers-\").concat(props.position)] : [])));\n    });\n    var transform = computed(function () {\n      return objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n    });\n    var abstractElement = computed(function () {\n      var _text = text(props.value.toString(), _objectSpread2(_objectSpread2({}, transform.value), classes.value)),\n          abstract = _text.abstract;\n\n      if (props.counter) {\n        abstract[0].attributes.class = abstract[0].attributes.class.replace('fa-layers-text', '');\n      }\n\n      return abstract[0];\n    });\n    var vnode = computed(function () {\n      return convert(abstractElement.value, {}, attrs);\n    });\n    return function () {\n      return vnode.value;\n    };\n  }\n});\n\nexport { FontAwesomeIcon, FontAwesomeLayers, FontAwesomeLayersText };\n","/*!\n * Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2022 Fonticons, Inc.\n */\nvar prefix = \"fas\";\nvar fa0 = {\n  prefix: 'fas',\n  iconName: '0',\n  icon: [320, 512, [], \"30\", \"M160 32.01c-88.37 0-160 71.63-160 160v127.1c0 88.37 71.63 160 160 160s160-71.63 160-160V192C320 103.6 248.4 32.01 160 32.01zM256 320c0 52.93-43.06 96-96 96c-52.93 0-96-43.07-96-96V192c0-52.94 43.07-96 96-96c52.94 0 96 43.06 96 96V320z\"]\n};\nvar fa1 = {\n  prefix: 'fas',\n  iconName: '1',\n  icon: [256, 512, [], \"31\", \"M256 448c0 17.67-14.33 32-32 32H32c-17.67 0-32-14.33-32-32s14.33-32 32-32h64V123.8L49.75 154.6C35.02 164.5 15.19 160.4 5.375 145.8C-4.422 131.1-.4531 111.2 14.25 101.4l96-64c9.828-6.547 22.45-7.187 32.84-1.594C153.5 41.37 160 52.22 160 64.01v352h64C241.7 416 256 430.3 256 448z\"]\n};\nvar fa2 = {\n  prefix: 'fas',\n  iconName: '2',\n  icon: [320, 512, [], \"32\", \"M320 448c0 17.67-14.33 32-32 32H32c-13.08 0-24.83-7.953-29.7-20.09c-4.859-12.12-1.859-26 7.594-35.03l193.6-185.1c31.36-30.17 33.95-80 5.812-113.4c-14.91-17.69-35.86-28.12-58.97-29.38C127.4 95.83 105.3 103.9 88.53 119.9L53.52 151.7c-13.08 11.91-33.33 10.89-45.2-2.172C-3.563 136.5-2.594 116.2 10.48 104.3l34.45-31.3c28.67-27.34 68.39-42.11 108.9-39.88c40.33 2.188 78.39 21.16 104.4 52.03c49.8 59.05 45.2 147.3-10.45 200.8l-136 130H288C305.7 416 320 430.3 320 448z\"]\n};\nvar fa3 = {\n  prefix: 'fas',\n  iconName: '3',\n  icon: [320, 512, [], \"33\", \"M320 344c0 74.98-61.02 136-136 136H103.6c-46.34 0-87.31-29.53-101.1-73.48c-5.594-16.77 3.484-34.88 20.25-40.47c16.75-5.609 34.89 3.484 40.47 20.25c5.922 17.77 22.48 29.7 41.23 29.7H184c39.7 0 72-32.3 72-72s-32.3-72-72-72H80c-13.2 0-25.05-8.094-29.83-20.41C45.39 239.3 48.66 225.3 58.38 216.4l131.4-120.4H32c-17.67 0-32-14.33-32-32s14.33-32 32-32h240c13.2 0 25.05 8.094 29.83 20.41c4.781 12.3 1.516 26.27-8.203 35.19l-131.4 120.4H184C258.1 208 320 269 320 344z\"]\n};\nvar fa4 = {\n  prefix: 'fas',\n  iconName: '4',\n  icon: [384, 512, [], \"34\", \"M384 334.2c0 17.67-14.33 32-32 32h-32v81.78c0 17.67-14.33 32-32 32s-32-14.33-32-32v-81.78H32c-10.97 0-21.17-5.625-27.05-14.89c-5.859-9.266-6.562-20.89-1.875-30.81l128-270.2C138.6 34.33 157.8 27.56 173.7 35.09c15.97 7.562 22.78 26.66 15.22 42.63L82.56 302.2H256V160c0-17.67 14.33-32 32-32s32 14.33 32 32v142.2h32C369.7 302.2 384 316.6 384 334.2z\"]\n};\nvar fa5 = {\n  prefix: 'fas',\n  iconName: '5',\n  icon: [320, 512, [], \"35\", \"M320 344.6c0 74.66-60.73 135.4-135.4 135.4H104.7c-46.81 0-88.22-29.83-103-74.23c-5.594-16.77 3.469-34.89 20.23-40.48c16.83-5.625 34.91 3.469 40.48 20.23c6.078 18.23 23.08 30.48 42.3 30.48h79.95c39.36 0 71.39-32.03 71.39-71.39s-32.03-71.38-71.39-71.38H32c-9.484 0-18.47-4.203-24.56-11.48C1.359 254.5-1.172 244.9 .5156 235.6l32-177.2C35.27 43.09 48.52 32.01 64 32.01l192 .0049c17.67 0 32 14.33 32 32s-14.33 32-32 32H90.73L70.3 209.2h114.3C259.3 209.2 320 269.1 320 344.6z\"]\n};\nvar fa6 = {\n  prefix: 'fas',\n  iconName: '6',\n  icon: [320, 512, [], \"36\", \"M167.7 160.8l64.65-76.06c11.47-13.45 9.812-33.66-3.656-45.09C222.7 34.51 215.3 32.01 208 32.01c-9.062 0-18.06 3.833-24.38 11.29C38.07 214.5 0 245.5 0 320c0 88.22 71.78 160 160 160s160-71.78 160-160C320 234.4 252.3 164.9 167.7 160.8zM160 416c-52.94 0-96-43.06-96-96s43.06-95.1 96-95.1s96 43.06 96 95.1S212.9 416 160 416z\"]\n};\nvar fa7 = {\n  prefix: 'fas',\n  iconName: '7',\n  icon: [320, 512, [], \"37\", \"M315.6 80.14l-224 384c-5.953 10.19-16.66 15.88-27.67 15.88c-5.469 0-11.02-1.406-16.09-4.359c-15.27-8.906-20.42-28.5-11.52-43.77l195.9-335.9H32c-17.67 0-32-14.33-32-32s14.33-32 32-32h256c11.45 0 22.05 6.125 27.75 16.06S321.4 70.23 315.6 80.14z\"]\n};\nvar fa8 = {\n  prefix: 'fas',\n  iconName: '8',\n  icon: [320, 512, [], \"38\", \"M267.5 249.2C290 226.1 304 194.7 304 160c0-70.58-57.42-128-128-128h-32c-70.58 0-128 57.42-128 128c0 34.7 13.99 66.12 36.48 89.19C20.83 272.5 0 309.8 0 352c0 70.58 57.42 128 128 128h64c70.58 0 128-57.42 128-128C320 309.8 299.2 272.5 267.5 249.2zM144 96.01h32c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32c-35.3 0-64-28.7-64-64S108.7 96.01 144 96.01zM192 416H128c-35.3 0-64-28.7-64-64s28.7-64 64-64h64c35.3 0 64 28.7 64 64S227.3 416 192 416z\"]\n};\nvar fa9 = {\n  prefix: 'fas',\n  iconName: '9',\n  icon: [320, 512, [], \"39\", \"M160 32.01c-88.22 0-160 71.78-160 160c0 85.57 67.71 155.1 152.3 159.2l-64.65 76.06c-11.47 13.45-9.812 33.66 3.656 45.09c6 5.125 13.38 7.62 20.72 7.62c9.062 0 18.06-3.823 24.38-11.28C281.9 297.5 320 266.6 320 192C320 103.8 248.2 32.01 160 32.01zM160 288c-52.94 0-96-43.06-96-95.1s43.06-96 96-96s96 43.06 96 96S212.9 288 160 288z\"]\n};\nvar faA = {\n  prefix: 'fas',\n  iconName: 'a',\n  icon: [384, 512, [97], \"41\", \"M381.5 435.7l-160-384C216.6 39.78 204.9 32.01 192 32.01S167.4 39.78 162.5 51.7l-160 384c-6.797 16.31 .9062 35.05 17.22 41.84c16.38 6.828 35.08-.9219 41.84-17.22l31.8-76.31h197.3l31.8 76.31c5.109 12.28 17.02 19.7 29.55 19.7c4.094 0 8.266-.7969 12.3-2.484C380.6 470.7 388.3 452 381.5 435.7zM119.1 320L192 147.2l72 172.8H119.1z\"]\n};\nvar faAddressBook = {\n  prefix: 'fas',\n  iconName: 'address-book',\n  icon: [512, 512, [62138, \"contact-book\"], \"f2b9\", \"M384 0H96C60.65 0 32 28.65 32 64v384c0 35.35 28.65 64 64 64h288c35.35 0 64-28.65 64-64V64C448 28.65 419.3 0 384 0zM240 128c35.35 0 64 28.65 64 64s-28.65 64-64 64c-35.34 0-64-28.65-64-64S204.7 128 240 128zM336 384h-192C135.2 384 128 376.8 128 368C128 323.8 163.8 288 208 288h64c44.18 0 80 35.82 80 80C352 376.8 344.8 384 336 384zM496 64H480v96h16C504.8 160 512 152.8 512 144v-64C512 71.16 504.8 64 496 64zM496 192H480v96h16C504.8 288 512 280.8 512 272v-64C512 199.2 504.8 192 496 192zM496 320H480v96h16c8.836 0 16-7.164 16-16v-64C512 327.2 504.8 320 496 320z\"]\n};\nvar faContactBook = faAddressBook;\nvar faAddressCard = {\n  prefix: 'fas',\n  iconName: 'address-card',\n  icon: [576, 512, [62140, \"contact-card\", \"vcard\"], \"f2bb\", \"M512 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h448c35.35 0 64-28.65 64-64V96C576 60.65 547.3 32 512 32zM176 128c35.35 0 64 28.65 64 64s-28.65 64-64 64s-64-28.65-64-64S140.7 128 176 128zM272 384h-192C71.16 384 64 376.8 64 368C64 323.8 99.82 288 144 288h64c44.18 0 80 35.82 80 80C288 376.8 280.8 384 272 384zM496 320h-128C359.2 320 352 312.8 352 304S359.2 288 368 288h128C504.8 288 512 295.2 512 304S504.8 320 496 320zM496 256h-128C359.2 256 352 248.8 352 240S359.2 224 368 224h128C504.8 224 512 231.2 512 240S504.8 256 496 256zM496 192h-128C359.2 192 352 184.8 352 176S359.2 160 368 160h128C504.8 160 512 167.2 512 176S504.8 192 496 192z\"]\n};\nvar faContactCard = faAddressCard;\nvar faVcard = faAddressCard;\nvar faAlignCenter = {\n  prefix: 'fas',\n  iconName: 'align-center',\n  icon: [448, 512, [], \"f037\", \"M320 96H128C110.3 96 96 81.67 96 64C96 46.33 110.3 32 128 32H320C337.7 32 352 46.33 352 64C352 81.67 337.7 96 320 96zM416 224H32C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H416C433.7 160 448 174.3 448 192C448 209.7 433.7 224 416 224zM0 448C0 430.3 14.33 416 32 416H416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480H32C14.33 480 0 465.7 0 448zM320 352H128C110.3 352 96 337.7 96 320C96 302.3 110.3 288 128 288H320C337.7 288 352 302.3 352 320C352 337.7 337.7 352 320 352z\"]\n};\nvar faAlignJustify = {\n  prefix: 'fas',\n  iconName: 'align-justify',\n  icon: [448, 512, [], \"f039\", \"M416 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96zM416 352H32C14.33 352 0 337.7 0 320C0 302.3 14.33 288 32 288H416C433.7 288 448 302.3 448 320C448 337.7 433.7 352 416 352zM0 192C0 174.3 14.33 160 32 160H416C433.7 160 448 174.3 448 192C448 209.7 433.7 224 416 224H32C14.33 224 0 209.7 0 192zM416 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480z\"]\n};\nvar faAlignLeft = {\n  prefix: 'fas',\n  iconName: 'align-left',\n  icon: [448, 512, [], \"f036\", \"M256 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H256C273.7 32 288 46.33 288 64C288 81.67 273.7 96 256 96zM256 352H32C14.33 352 0 337.7 0 320C0 302.3 14.33 288 32 288H256C273.7 288 288 302.3 288 320C288 337.7 273.7 352 256 352zM0 192C0 174.3 14.33 160 32 160H416C433.7 160 448 174.3 448 192C448 209.7 433.7 224 416 224H32C14.33 224 0 209.7 0 192zM416 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480z\"]\n};\nvar faAlignRight = {\n  prefix: 'fas',\n  iconName: 'align-right',\n  icon: [448, 512, [], \"f038\", \"M416 96H192C174.3 96 160 81.67 160 64C160 46.33 174.3 32 192 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96zM416 352H192C174.3 352 160 337.7 160 320C160 302.3 174.3 288 192 288H416C433.7 288 448 302.3 448 320C448 337.7 433.7 352 416 352zM0 192C0 174.3 14.33 160 32 160H416C433.7 160 448 174.3 448 192C448 209.7 433.7 224 416 224H32C14.33 224 0 209.7 0 192zM416 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480z\"]\n};\nvar faAnchor = {\n  prefix: 'fas',\n  iconName: 'anchor',\n  icon: [576, 512, [9875], \"f13d\", \"M352 176C369.7 176 384 190.3 384 208C384 225.7 369.7 240 352 240H320V448H368C421 448 464 405 464 352V345.9L456.1 352.1C447.6 362.3 432.4 362.3 423 352.1C413.7 343.6 413.7 328.4 423 319L479 263C488.4 253.7 503.6 253.7 512.1 263L568.1 319C578.3 328.4 578.3 343.6 568.1 352.1C559.6 362.3 544.4 362.3 535 352.1L528 345.9V352C528 440.4 456.4 512 368 512H208C119.6 512 48 440.4 48 352V345.9L40.97 352.1C31.6 362.3 16.4 362.3 7.029 352.1C-2.343 343.6-2.343 328.4 7.029 319L63.03 263C72.4 253.7 87.6 253.7 96.97 263L152.1 319C162.3 328.4 162.3 343.6 152.1 352.1C143.6 362.3 128.4 362.3 119 352.1L112 345.9V352C112 405 154.1 448 208 448H256V240H224C206.3 240 192 225.7 192 208C192 190.3 206.3 176 224 176H234.9C209 158.8 192 129.4 192 96C192 42.98 234.1 0 288 0C341 0 384 42.98 384 96C384 129.4 366.1 158.8 341.1 176H352zM288 128C305.7 128 320 113.7 320 96C320 78.33 305.7 64 288 64C270.3 64 256 78.33 256 96C256 113.7 270.3 128 288 128z\"]\n};\nvar faAnchorCircleCheck = {\n  prefix: 'fas',\n  iconName: 'anchor-circle-check',\n  icon: [640, 512, [], \"e4aa\", \"M352 176C369.7 176 384 190.3 384 208C384 225.7 369.7 240 352 240H319.1V448H339.2C351.8 472.7 370 493.1 392.2 510.2C384.3 511.4 376.2 512 368 512H208C119.6 512 48 440.4 48 352V345.9L40.97 352.1C31.6 362.3 16.4 362.3 7.029 352.1C-2.343 343.6-2.343 328.4 7.029 319L63.03 263C72.4 253.7 87.6 253.7 96.97 263L152.1 319C162.3 328.4 162.3 343.6 152.1 352.1C143.6 362.3 128.4 362.3 119 352.1L112 345.9V352C112 405 154.1 448 208 448H256V240H224C206.3 240 192 225.7 192 208C192 190.3 206.3 176 224 176H234.9C209 158.8 192 129.4 192 96C192 42.98 234.1 0 288 0C341 0 384 42.98 384 96C384 129.4 366.1 158.8 341.1 176H352zM287.1 128C305.7 128 319.1 113.7 319.1 96C319.1 78.33 305.7 64 287.1 64C270.3 64 255.1 78.33 255.1 96C255.1 113.7 270.3 128 287.1 128zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faAnchorCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'anchor-circle-exclamation',\n  icon: [640, 512, [], \"e4ab\", \"M352 176C369.7 176 384 190.3 384 208C384 225.7 369.7 240 352 240H319.1V448H339.2C351.8 472.7 370 493.1 392.2 510.2C384.3 511.4 376.2 512 368 512H208C119.6 512 48 440.4 48 352V345.9L40.97 352.1C31.6 362.3 16.4 362.3 7.029 352.1C-2.343 343.6-2.343 328.4 7.029 319L63.03 263C72.4 253.7 87.6 253.7 96.97 263L152.1 319C162.3 328.4 162.3 343.6 152.1 352.1C143.6 362.3 128.4 362.3 119 352.1L112 345.9V352C112 405 154.1 448 208 448H256V240H224C206.3 240 192 225.7 192 208C192 190.3 206.3 176 224 176H234.9C209 158.8 192 129.4 192 96C192 42.98 234.1 0 288 0C341 0 384 42.98 384 96C384 129.4 366.1 158.8 341.1 176H352zM287.1 128C305.7 128 319.1 113.7 319.1 96C319.1 78.33 305.7 64 287.1 64C270.3 64 255.1 78.33 255.1 96C255.1 113.7 270.3 128 287.1 128zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faAnchorCircleXmark = {\n  prefix: 'fas',\n  iconName: 'anchor-circle-xmark',\n  icon: [640, 512, [], \"e4ac\", \"M352 176C369.7 176 384 190.3 384 208C384 225.7 369.7 240 352 240H319.1V448H339.2C351.8 472.7 370 493.1 392.2 510.2C384.3 511.4 376.2 512 368 512H208C119.6 512 48 440.4 48 352V345.9L40.97 352.1C31.6 362.3 16.4 362.3 7.029 352.1C-2.343 343.6-2.343 328.4 7.029 319L63.03 263C72.4 253.7 87.6 253.7 96.97 263L152.1 319C162.3 328.4 162.3 343.6 152.1 352.1C143.6 362.3 128.4 362.3 119 352.1L112 345.9V352C112 405 154.1 448 208 448H256V240H224C206.3 240 192 225.7 192 208C192 190.3 206.3 176 224 176H234.9C209 158.8 192 129.4 192 96C192 42.98 234.1 0 288 0C341 0 384 42.98 384 96C384 129.4 366.1 158.8 341.1 176H352zM287.1 128C305.7 128 319.1 113.7 319.1 96C319.1 78.33 305.7 64 287.1 64C270.3 64 255.1 78.33 255.1 96C255.1 113.7 270.3 128 287.1 128zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368L555.3 331.3z\"]\n};\nvar faAnchorLock = {\n  prefix: 'fas',\n  iconName: 'anchor-lock',\n  icon: [640, 512, [], \"e4ad\", \"M352 176C369.7 176 384 190.3 384 208C384 225.7 369.7 240 352 240H319.1V448H368C373.4 448 378.8 447.5 384 446.7V480C384 490.1 386.7 501.3 391.6 510.3C383.9 511.4 376 512 368 512H208C119.6 512 48 440.4 48 352V345.9L40.97 352.1C31.6 362.3 16.4 362.3 7.029 352.1C-2.343 343.6-2.343 328.4 7.029 319L63.03 263C72.4 253.7 87.6 253.7 96.97 263L152.1 319C162.3 328.4 162.3 343.6 152.1 352.1C143.6 362.3 128.4 362.3 119 352.1L112 345.9V352C112 405 154.1 448 208 448H256V240H224C206.3 240 192 225.7 192 208C192 190.3 206.3 176 224 176H234.9C209 158.8 192 129.4 192 96C192 42.98 234.1 0 288 0C341 0 384 42.98 384 96C384 129.4 366.1 158.8 341.1 176H352zM287.1 128C305.7 128 319.1 113.7 319.1 96C319.1 78.33 305.7 64 287.1 64C270.3 64 255.1 78.33 255.1 96C255.1 113.7 270.3 128 287.1 128zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faAngleDown = {\n  prefix: 'fas',\n  iconName: 'angle-down',\n  icon: [384, 512, [8964], \"f107\", \"M192 384c-8.188 0-16.38-3.125-22.62-9.375l-160-160c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L192 306.8l137.4-137.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-160 160C208.4 380.9 200.2 384 192 384z\"]\n};\nvar faAngleLeft = {\n  prefix: 'fas',\n  iconName: 'angle-left',\n  icon: [256, 512, [8249], \"f104\", \"M192 448c-8.188 0-16.38-3.125-22.62-9.375l-160-160c-12.5-12.5-12.5-32.75 0-45.25l160-160c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l137.4 137.4c12.5 12.5 12.5 32.75 0 45.25C208.4 444.9 200.2 448 192 448z\"]\n};\nvar faAngleRight = {\n  prefix: 'fas',\n  iconName: 'angle-right',\n  icon: [256, 512, [8250], \"f105\", \"M64 448c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L178.8 256L41.38 118.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160c12.5 12.5 12.5 32.75 0 45.25l-160 160C80.38 444.9 72.19 448 64 448z\"]\n};\nvar faAngleUp = {\n  prefix: 'fas',\n  iconName: 'angle-up',\n  icon: [384, 512, [8963], \"f106\", \"M352 352c-8.188 0-16.38-3.125-22.62-9.375L192 205.3l-137.4 137.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l160-160c12.5-12.5 32.75-12.5 45.25 0l160 160c12.5 12.5 12.5 32.75 0 45.25C368.4 348.9 360.2 352 352 352z\"]\n};\nvar faAnglesDown = {\n  prefix: 'fas',\n  iconName: 'angles-down',\n  icon: [384, 512, [\"angle-double-down\"], \"f103\", \"M169.4 278.6C175.6 284.9 183.8 288 192 288s16.38-3.125 22.62-9.375l160-160c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0L192 210.8L54.63 73.38c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25L169.4 278.6zM329.4 265.4L192 402.8L54.63 265.4c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25l160 160C175.6 476.9 183.8 480 192 480s16.38-3.125 22.62-9.375l160-160c12.5-12.5 12.5-32.75 0-45.25S341.9 252.9 329.4 265.4z\"]\n};\nvar faAngleDoubleDown = faAnglesDown;\nvar faAnglesLeft = {\n  prefix: 'fas',\n  iconName: 'angles-left',\n  icon: [448, 512, [171, \"angle-double-left\"], \"f100\", \"M77.25 256l137.4-137.4c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-160 160c-12.5 12.5-12.5 32.75 0 45.25l160 160C175.6 444.9 183.8 448 192 448s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25L77.25 256zM269.3 256l137.4-137.4c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-160 160c-12.5 12.5-12.5 32.75 0 45.25l160 160C367.6 444.9 375.8 448 384 448s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25L269.3 256z\"]\n};\nvar faAngleDoubleLeft = faAnglesLeft;\nvar faAnglesRight = {\n  prefix: 'fas',\n  iconName: 'angles-right',\n  icon: [448, 512, [187, \"angle-double-right\"], \"f101\", \"M246.6 233.4l-160-160c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25L178.8 256l-137.4 137.4c-12.5 12.5-12.5 32.75 0 45.25C47.63 444.9 55.81 448 64 448s16.38-3.125 22.62-9.375l160-160C259.1 266.1 259.1 245.9 246.6 233.4zM438.6 233.4l-160-160c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25L370.8 256l-137.4 137.4c-12.5 12.5-12.5 32.75 0 45.25C239.6 444.9 247.8 448 256 448s16.38-3.125 22.62-9.375l160-160C451.1 266.1 451.1 245.9 438.6 233.4z\"]\n};\nvar faAngleDoubleRight = faAnglesRight;\nvar faAnglesUp = {\n  prefix: 'fas',\n  iconName: 'angles-up',\n  icon: [384, 512, [\"angle-double-up\"], \"f102\", \"M54.63 246.6L192 109.3l137.4 137.4C335.6 252.9 343.8 256 352 256s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25l-160-160c-12.5-12.5-32.75-12.5-45.25 0l-160 160c-12.5 12.5-12.5 32.75 0 45.25S42.13 259.1 54.63 246.6zM214.6 233.4c-12.5-12.5-32.75-12.5-45.25 0l-160 160c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0L192 301.3l137.4 137.4C335.6 444.9 343.8 448 352 448s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25L214.6 233.4z\"]\n};\nvar faAngleDoubleUp = faAnglesUp;\nvar faAnkh = {\n  prefix: 'fas',\n  iconName: 'ankh',\n  icon: [320, 512, [9765], \"f644\", \"M296 256h-44.63C272.5 222 288 181.6 288 144C288 55.62 230.8 0 160 0S32 55.62 32 144C32 181.6 47.5 222 68.63 256H24C10.75 256 0 266.8 0 280v32c0 13.25 10.75 24 24 24h96v152C120 501.2 130.8 512 144 512h32c13.25 0 24-10.75 24-24V336h96c13.25 0 24-10.75 24-24v-32C320 266.8 309.2 256 296 256zM160 80c29.62 0 48 24.5 48 64c0 34.62-27.12 78.12-48 100.9C139.1 222.1 112 178.6 112 144C112 104.5 130.4 80 160 80z\"]\n};\nvar faAppleWhole = {\n  prefix: 'fas',\n  iconName: 'apple-whole',\n  icon: [448, 512, [127823, 127822, \"apple-alt\"], \"f5d1\", \"M336 128c-32 0-80.02 16.03-112 32.03c-32.01-16-79.1-32.02-111.1-32.03C32 128 .4134 210.5 .0033 288c-.5313 99.97 63.99 224 159.1 224c32 0 48-16 64-16c16 0 32 16 64 16c96 0 160.4-122.8 159.1-224C447.7 211.6 416 128 336 128zM320 32V0h-32C243.8 0 208 35.82 208 80v32h32C284.2 112 320 76.18 320 32z\"]\n};\nvar faAppleAlt = faAppleWhole;\nvar faArchway = {\n  prefix: 'fas',\n  iconName: 'archway',\n  icon: [512, 512, [], \"f557\", \"M480 32C497.7 32 512 46.33 512 64C512 81.67 497.7 96 480 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H480zM32 128H480V416C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H352V352C352 298.1 309 256 256 256C202.1 256 160 298.1 160 352V480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416V128z\"]\n};\nvar faArrowDown = {\n  prefix: 'fas',\n  iconName: 'arrow-down',\n  icon: [384, 512, [8595], \"f063\", \"M374.6 310.6l-160 160C208.4 476.9 200.2 480 192 480s-16.38-3.125-22.62-9.375l-160-160c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 370.8V64c0-17.69 14.33-31.1 31.1-31.1S224 46.31 224 64v306.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0S387.1 298.1 374.6 310.6z\"]\n};\nvar faArrowDown19 = {\n  prefix: 'fas',\n  iconName: 'arrow-down-1-9',\n  icon: [512, 512, [\"sort-numeric-asc\", \"sort-numeric-down\"], \"f162\", \"M320 192c0 17.69 14.31 31.1 32 31.1L416 224c17.69 0 32-14.31 32-32s-14.31-32-32-32V63.98c0-11.19-5.844-21.53-15.38-27.34c-9.531-5.781-21.41-6.188-31.34-1.062l-32 16.59c-15.69 8.125-21.81 27.44-13.69 43.13C329.3 106.3 340.4 112.6 352 112.6V160C334.3 160 320 174.3 320 192zM392 255.6c-48.6 0-88 39.4-88 88c0 36.44 22.15 67.7 53.71 81.07l-7.682 8.004c-10.72 11.16-10.34 28.88 .8125 39.56C356.3 477.4 363.3 480 370.2 480c7.344 0 14.72-2.875 20.19-8.625c69.61-72.53 89.6-85.39 89.6-127.8C480 294.1 440.6 255.6 392 255.6zM392 367.6c-13.23 0-24-10.77-24-24s10.77-24 24-24s24 10.77 24 24S405.2 367.6 392 367.6zM216 320.3c-8.672 0-17.3 3.5-23.61 10.38L160 366.1V64.03C160 46.33 145.7 32 128 32S96 46.33 96 64.03v302L63.6 330.7c-11.95-13.01-32.2-13.91-45.22-1.969c-13.03 11.95-13.9 32.22-1.969 45.27l87.1 96.09c12.12 13.26 35.06 13.26 47.19 0l87.1-96.09c11.94-13.05 11.06-33.31-1.969-45.27C231.5 323.1 223.7 320.3 216 320.3z\"]\n};\nvar faSortNumericAsc = faArrowDown19;\nvar faSortNumericDown = faArrowDown19;\nvar faArrowDown91 = {\n  prefix: 'fas',\n  iconName: 'arrow-down-9-1',\n  icon: [512, 512, [\"sort-numeric-desc\", \"sort-numeric-down-alt\"], \"f886\", \"M216 320.3c-8.672 0-17.3 3.5-23.61 10.38L160 366.1V64.03C160 46.33 145.7 32 128 32S96 46.33 96 64.03v302L63.6 330.7c-11.95-13.01-32.2-13.91-45.22-1.969c-13.03 11.95-13.9 32.22-1.969 45.27l87.1 96.09c12.12 13.26 35.06 13.26 47.19 0l87.1-96.09c11.94-13.05 11.06-33.31-1.969-45.27C231.5 323.1 223.7 320.3 216 320.3zM357.7 201.1l-7.682 8.004c-10.72 11.16-10.34 28.88 .8125 39.56c5.406 5.219 12.41 7.812 19.38 7.812c7.344 0 14.72-2.875 20.19-8.625c69.61-72.53 89.6-85.39 89.6-127.8c0-48.6-39.4-88-88-88s-88 39.4-88 88C303.1 156.4 326.1 187.7 357.7 201.1zM392 96c13.23 0 24 10.77 24 24S405.2 144 392 144S368 133.2 368 120S378.8 96 392 96zM416 416.4v-96.02c0-11.19-5.844-21.53-15.38-27.34c-9.531-5.781-21.41-6.188-31.34-1.062l-32 16.59c-15.69 8.125-21.81 27.44-13.69 43.13C329.3 362.8 340.4 369 352 369v47.41c-17.69 0-32 14.31-32 32s14.31 32 32 32h64c17.69 0 32-14.31 32-32S433.7 416.4 416 416.4z\"]\n};\nvar faSortNumericDesc = faArrowDown91;\nvar faSortNumericDownAlt = faArrowDown91;\nvar faArrowDownAZ = {\n  prefix: 'fas',\n  iconName: 'arrow-down-a-z',\n  icon: [512, 512, [\"sort-alpha-asc\", \"sort-alpha-down\"], \"f15d\", \"M239.6 373.1c11.94-13.05 11.06-33.31-1.969-45.27c-13.55-12.42-33.76-10.52-45.22 1.973L160 366.1V64.03c0-17.7-14.33-32.03-32-32.03S96 46.33 96 64.03v302l-32.4-35.39C51.64 317.7 31.39 316.7 18.38 328.7c-13.03 11.95-13.9 32.22-1.969 45.27l87.1 96.09c12.12 13.26 35.06 13.26 47.19 0L239.6 373.1zM448 416h-50.75l73.38-73.38c9.156-9.156 11.89-22.91 6.938-34.88S460.9 288 447.1 288H319.1C302.3 288 288 302.3 288 320s14.33 32 32 32h50.75l-73.38 73.38c-9.156 9.156-11.89 22.91-6.938 34.88S307.1 480 319.1 480h127.1C465.7 480 480 465.7 480 448S465.7 416 448 416zM492.6 209.3l-79.99-160.1c-10.84-21.81-46.4-21.81-57.24 0L275.4 209.3c-7.906 15.91-1.5 35.24 14.31 43.19c15.87 7.922 35.04 1.477 42.93-14.4l7.154-14.39h88.43l7.154 14.39c6.174 12.43 23.97 23.87 42.93 14.4C494.1 244.6 500.5 225.2 492.6 209.3zM367.8 167.4L384 134.7l16.22 32.63H367.8z\"]\n};\nvar faSortAlphaAsc = faArrowDownAZ;\nvar faSortAlphaDown = faArrowDownAZ;\nvar faArrowDownLong = {\n  prefix: 'fas',\n  iconName: 'arrow-down-long',\n  icon: [320, 512, [\"long-arrow-down\"], \"f175\", \"M9.375 329.4c12.51-12.51 32.76-12.49 45.25 0L128 402.8V32c0-17.69 14.31-32 32-32s32 14.31 32 32v370.8l73.38-73.38c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-128 128c-12.5 12.5-32.75 12.5-45.25 0l-128-128C-3.125 362.1-3.125 341.9 9.375 329.4z\"]\n};\nvar faLongArrowDown = faArrowDownLong;\nvar faArrowDownShortWide = {\n  prefix: 'fas',\n  iconName: 'arrow-down-short-wide',\n  icon: [576, 512, [\"sort-amount-desc\", \"sort-amount-down-alt\"], \"f884\", \"M320 224H416c17.67 0 32-14.33 32-32s-14.33-32-32-32h-95.1c-17.67 0-32 14.33-32 32S302.3 224 320 224zM320 352H480c17.67 0 32-14.33 32-32s-14.33-32-32-32h-159.1c-17.67 0-32 14.33-32 32S302.3 352 320 352zM320 96h32c17.67 0 31.1-14.33 31.1-32s-14.33-32-31.1-32h-32c-17.67 0-32 14.33-32 32S302.3 96 320 96zM544 416h-223.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H544c17.67 0 32-14.33 32-32S561.7 416 544 416zM192.4 330.7L160 366.1V64.03C160 46.33 145.7 32 128 32S96 46.33 96 64.03v302L63.6 330.7c-6.312-6.883-14.94-10.38-23.61-10.38c-7.719 0-15.47 2.781-21.61 8.414c-13.03 11.95-13.9 32.22-1.969 45.27l87.1 96.09c12.12 13.26 35.06 13.26 47.19 0l87.1-96.09c11.94-13.05 11.06-33.31-1.969-45.27C224.6 316.8 204.4 317.7 192.4 330.7z\"]\n};\nvar faSortAmountDesc = faArrowDownShortWide;\nvar faSortAmountDownAlt = faArrowDownShortWide;\nvar faArrowDownUpAcrossLine = {\n  prefix: 'fas',\n  iconName: 'arrow-down-up-across-line',\n  icon: [576, 512, [], \"e4af\", \"M41.37 406.6C28.88 394.1 28.88 373.9 41.37 361.4C53.87 348.9 74.13 348.9 86.63 361.4L128 402.7V287.1H32C14.33 287.1 0 273.7 0 255.1C0 238.3 14.33 223.1 32 223.1H384V109.3L342.6 150.6C330.1 163.1 309.9 163.1 297.4 150.6C284.9 138.1 284.9 117.9 297.4 105.4L393.4 9.372C405.9-3.124 426.1-3.124 438.6 9.372L534.6 105.4C547.1 117.9 547.1 138.1 534.6 150.6C522.1 163.1 501.9 163.1 489.4 150.6L448 109.3V223.1H544C561.7 223.1 576 238.3 576 255.1C576 273.7 561.7 287.1 544 287.1H192V402.7L233.4 361.4C245.9 348.9 266.1 348.9 278.6 361.4C291.1 373.9 291.1 394.1 278.6 406.6L182.6 502.6C170.1 515.1 149.9 515.1 137.4 502.6L41.37 406.6zM128 63.1C128 46.33 142.3 31.1 160 31.1C177.7 31.1 192 46.33 192 63.1V191.1H128V63.1zM448 319.1V448C448 465.7 433.7 480 416 480C398.3 480 384 465.7 384 448V319.1H448z\"]\n};\nvar faArrowDownUpLock = {\n  prefix: 'fas',\n  iconName: 'arrow-down-up-lock',\n  icon: [640, 512, [], \"e4b0\", \"M105.4 502.6L9.373 406.6C-3.124 394.1-3.124 373.9 9.373 361.4C21.87 348.9 42.13 348.9 54.63 361.4L96 402.7V287.1H32C14.33 287.1 0 273.7 0 255.1C0 238.3 14.33 223.1 32 223.1H288V109.3L246.6 150.6C234.1 163.1 213.9 163.1 201.4 150.6C188.9 138.1 188.9 117.9 201.4 105.4L297.4 9.372C303.4 3.371 311.5 0 320 0C328.5 0 336.6 3.372 342.6 9.372L438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6C426.1 163.1 405.9 163.1 393.4 150.6L352 109.3V223.1H426.8C419.9 238.5 416 254.8 416 271.1V287.1H160V402.7L201.4 361.4C213.9 348.9 234.1 348.9 246.6 361.4C259.1 373.9 259.1 394.1 246.6 406.6L150.6 502.6C138.1 515.1 117.9 515.1 105.4 502.6H105.4zM96 191.1V63.1C96 46.33 110.3 31.1 128 31.1C145.7 31.1 160 46.33 160 63.1V191.1H96zM352 319.1V448C352 465.7 337.7 480 320 480C302.3 480 288 465.7 288 448V319.1H352zM528 191.1C572.2 191.1 608 227.8 608 271.1V319.1C625.7 319.1 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 319.1 448 319.1V271.1C448 227.8 483.8 191.1 528 191.1zM528 239.1C510.3 239.1 496 254.3 496 271.1V319.1H560V271.1C560 254.3 545.7 239.1 528 239.1z\"]\n};\nvar faArrowDownWideShort = {\n  prefix: 'fas',\n  iconName: 'arrow-down-wide-short',\n  icon: [576, 512, [\"sort-amount-asc\", \"sort-amount-down\"], \"f160\", \"M416 288h-95.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H416c17.67 0 32-14.33 32-32S433.7 288 416 288zM544 32h-223.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H544c17.67 0 32-14.33 32-32S561.7 32 544 32zM352 416h-32c-17.67 0-32 14.33-32 32s14.33 32 32 32h32c17.67 0 31.1-14.33 31.1-32S369.7 416 352 416zM480 160h-159.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H480c17.67 0 32-14.33 32-32S497.7 160 480 160zM192.4 330.7L160 366.1V64.03C160 46.33 145.7 32 128 32S96 46.33 96 64.03v302L63.6 330.7c-6.312-6.883-14.94-10.38-23.61-10.38c-7.719 0-15.47 2.781-21.61 8.414c-13.03 11.95-13.9 32.22-1.969 45.27l87.1 96.09c12.12 13.26 35.06 13.26 47.19 0l87.1-96.09c11.94-13.05 11.06-33.31-1.969-45.27C224.6 316.8 204.4 317.7 192.4 330.7z\"]\n};\nvar faSortAmountAsc = faArrowDownWideShort;\nvar faSortAmountDown = faArrowDownWideShort;\nvar faArrowDownZA = {\n  prefix: 'fas',\n  iconName: 'arrow-down-z-a',\n  icon: [512, 512, [\"sort-alpha-desc\", \"sort-alpha-down-alt\"], \"f881\", \"M104.4 470.1c12.12 13.26 35.06 13.26 47.19 0l87.1-96.09c11.94-13.05 11.06-33.31-1.969-45.27c-13.02-11.95-33.27-11.04-45.22 1.973L160 366.1V64.03c0-17.7-14.33-32.03-32-32.03S96 46.33 96 64.03v302l-32.4-35.39c-6.312-6.883-14.94-10.39-23.61-10.39c-7.719 0-15.47 2.785-21.61 8.414c-13.03 11.95-13.9 32.22-1.969 45.27L104.4 470.1zM320 96h50.75l-73.38 73.38c-9.156 9.156-11.89 22.91-6.938 34.88s16.63 19.74 29.56 19.74h127.1C465.7 223.1 480 209.7 480 192s-14.33-32-32-32h-50.75l73.38-73.38c9.156-9.156 11.89-22.91 6.938-34.88S460.9 32 447.1 32h-127.1C302.3 32 288 46.31 288 64S302.3 96 320 96zM492.6 433.3l-79.99-160.1c-10.84-21.81-46.4-21.81-57.24 0l-79.99 160.1c-7.906 15.91-1.5 35.24 14.31 43.19c15.87 7.922 35.04 1.477 42.93-14.4l7.154-14.39h88.43l7.154 14.39c6.174 12.43 23.97 23.87 42.93 14.4C494.1 468.6 500.5 449.2 492.6 433.3zM367.8 391.4L384 358.7l16.22 32.63H367.8z\"]\n};\nvar faSortAlphaDesc = faArrowDownZA;\nvar faSortAlphaDownAlt = faArrowDownZA;\nvar faArrowLeft = {\n  prefix: 'fas',\n  iconName: 'arrow-left',\n  icon: [448, 512, [8592], \"f060\", \"M447.1 256C447.1 273.7 433.7 288 416 288H109.3l105.4 105.4c12.5 12.5 12.5 32.75 0 45.25C208.4 444.9 200.2 448 192 448s-16.38-3.125-22.62-9.375l-160-160c-12.5-12.5-12.5-32.75 0-45.25l160-160c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L109.3 224H416C433.7 224 447.1 238.3 447.1 256z\"]\n};\nvar faArrowLeftLong = {\n  prefix: 'fas',\n  iconName: 'arrow-left-long',\n  icon: [512, 512, [\"long-arrow-left\"], \"f177\", \"M9.375 233.4l128-128c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L109.3 224H480c17.69 0 32 14.31 32 32s-14.31 32-32 32H109.3l73.38 73.38c12.5 12.5 12.5 32.75 0 45.25c-12.49 12.49-32.74 12.51-45.25 0l-128-128C-3.125 266.1-3.125 245.9 9.375 233.4z\"]\n};\nvar faLongArrowLeft = faArrowLeftLong;\nvar faArrowPointer = {\n  prefix: 'fas',\n  iconName: 'arrow-pointer',\n  icon: [320, 512, [\"mouse-pointer\"], \"f245\", \"M318.4 304.5c-3.531 9.344-12.47 15.52-22.45 15.52h-105l45.15 94.82c9.496 19.94 1.031 43.8-18.91 53.31c-19.95 9.504-43.82 1.035-53.32-18.91L117.3 351.3l-75 88.25c-4.641 5.469-11.37 8.453-18.28 8.453c-2.781 0-5.578-.4844-8.281-1.469C6.281 443.1 0 434.1 0 423.1V56.02c0-9.438 5.531-18.03 14.12-21.91C22.75 30.26 32.83 31.77 39.87 37.99l271.1 240C319.4 284.6 321.1 295.1 318.4 304.5z\"]\n};\nvar faMousePointer = faArrowPointer;\nvar faArrowRight = {\n  prefix: 'fas',\n  iconName: 'arrow-right',\n  icon: [448, 512, [8594], \"f061\", \"M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z\"]\n};\nvar faArrowRightArrowLeft = {\n  prefix: 'fas',\n  iconName: 'arrow-right-arrow-left',\n  icon: [512, 512, [8644, \"exchange\"], \"f0ec\", \"M32 176h370.8l-57.38 57.38c-12.5 12.5-12.5 32.75 0 45.25C351.6 284.9 359.8 288 368 288s16.38-3.125 22.62-9.375l112-112c12.5-12.5 12.5-32.75 0-45.25l-112-112c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25L402.8 112H32c-17.69 0-32 14.31-32 32S14.31 176 32 176zM480 336H109.3l57.38-57.38c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-112 112c-12.5 12.5-12.5 32.75 0 45.25l112 112C127.6 508.9 135.8 512 144 512s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25L109.3 400H480c17.69 0 32-14.31 32-32S497.7 336 480 336z\"]\n};\nvar faExchange = faArrowRightArrowLeft;\nvar faArrowRightFromBracket = {\n  prefix: 'fas',\n  iconName: 'arrow-right-from-bracket',\n  icon: [512, 512, [\"sign-out\"], \"f08b\", \"M160 416H96c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h64c17.67 0 32-14.33 32-32S177.7 32 160 32H96C42.98 32 0 74.98 0 128v256c0 53.02 42.98 96 96 96h64c17.67 0 32-14.33 32-32S177.7 416 160 416zM502.6 233.4l-128-128c-12.51-12.51-32.76-12.49-45.25 0c-12.5 12.5-12.5 32.75 0 45.25L402.8 224H192C174.3 224 160 238.3 160 256s14.31 32 32 32h210.8l-73.38 73.38c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0l128-128C515.1 266.1 515.1 245.9 502.6 233.4z\"]\n};\nvar faSignOut = faArrowRightFromBracket;\nvar faArrowRightLong = {\n  prefix: 'fas',\n  iconName: 'arrow-right-long',\n  icon: [512, 512, [\"long-arrow-right\"], \"f178\", \"M502.6 278.6l-128 128c-12.51 12.51-32.76 12.49-45.25 0c-12.5-12.5-12.5-32.75 0-45.25L402.8 288H32C14.31 288 0 273.7 0 255.1S14.31 224 32 224h370.8l-73.38-73.38c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l128 128C515.1 245.9 515.1 266.1 502.6 278.6z\"]\n};\nvar faLongArrowRight = faArrowRightLong;\nvar faArrowRightToBracket = {\n  prefix: 'fas',\n  iconName: 'arrow-right-to-bracket',\n  icon: [512, 512, [\"sign-in\"], \"f090\", \"M416 32h-64c-17.67 0-32 14.33-32 32s14.33 32 32 32h64c17.67 0 32 14.33 32 32v256c0 17.67-14.33 32-32 32h-64c-17.67 0-32 14.33-32 32s14.33 32 32 32h64c53.02 0 96-42.98 96-96V128C512 74.98 469 32 416 32zM342.6 233.4l-128-128c-12.51-12.51-32.76-12.49-45.25 0c-12.5 12.5-12.5 32.75 0 45.25L242.8 224H32C14.31 224 0 238.3 0 256s14.31 32 32 32h210.8l-73.38 73.38c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0l128-128C355.1 266.1 355.1 245.9 342.6 233.4z\"]\n};\nvar faSignIn = faArrowRightToBracket;\nvar faArrowRightToCity = {\n  prefix: 'fas',\n  iconName: 'arrow-right-to-city',\n  icon: [640, 512, [], \"e4b3\", \"M288 48C288 21.49 309.5 0 336 0H432C458.5 0 480 21.49 480 48V192H520V120C520 106.7 530.7 96 544 96C557.3 96 568 106.7 568 120V192H592C618.5 192 640 213.5 640 240V464C640 490.5 618.5 512 592 512H336C309.5 512 288 490.5 288 464V48zM352 112C352 120.8 359.2 128 368 128H400C408.8 128 416 120.8 416 112V80C416 71.16 408.8 64 400 64H368C359.2 64 352 71.16 352 80V112zM368 160C359.2 160 352 167.2 352 176V208C352 216.8 359.2 224 368 224H400C408.8 224 416 216.8 416 208V176C416 167.2 408.8 160 400 160H368zM352 304C352 312.8 359.2 320 368 320H400C408.8 320 416 312.8 416 304V272C416 263.2 408.8 256 400 256H368C359.2 256 352 263.2 352 272V304zM528 256C519.2 256 512 263.2 512 272V304C512 312.8 519.2 320 528 320H560C568.8 320 576 312.8 576 304V272C576 263.2 568.8 256 560 256H528zM512 400C512 408.8 519.2 416 528 416H560C568.8 416 576 408.8 576 400V368C576 359.2 568.8 352 560 352H528C519.2 352 512 359.2 512 368V400zM246.6 233.4C259.1 245.9 259.1 266.1 246.6 278.6L166.6 358.6C154.1 371.1 133.9 371.1 121.4 358.6C108.9 346.1 108.9 325.9 121.4 313.4L146.7 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H146.7L121.4 198.6C108.9 186.1 108.9 165.9 121.4 153.4C133.9 140.9 154.1 140.9 166.6 153.4L246.6 233.4z\"]\n};\nvar faArrowRotateLeft = {\n  prefix: 'fas',\n  iconName: 'arrow-rotate-left',\n  icon: [512, 512, [8634, \"arrow-left-rotate\", \"arrow-rotate-back\", \"arrow-rotate-backward\", \"undo\"], \"f0e2\", \"M480 256c0 123.4-100.5 223.9-223.9 223.9c-48.86 0-95.19-15.58-134.2-44.86c-14.14-10.59-17-30.66-6.391-44.81c10.61-14.09 30.69-16.97 44.8-6.375c27.84 20.91 61 31.94 95.89 31.94C344.3 415.8 416 344.1 416 256s-71.67-159.8-159.8-159.8C205.9 96.22 158.6 120.3 128.6 160H192c17.67 0 32 14.31 32 32S209.7 224 192 224H48c-17.67 0-32-14.31-32-32V48c0-17.69 14.33-32 32-32s32 14.31 32 32v70.23C122.1 64.58 186.1 32.11 256.1 32.11C379.5 32.11 480 132.6 480 256z\"]\n};\nvar faArrowLeftRotate = faArrowRotateLeft;\nvar faArrowRotateBack = faArrowRotateLeft;\nvar faArrowRotateBackward = faArrowRotateLeft;\nvar faUndo = faArrowRotateLeft;\nvar faArrowRotateRight = {\n  prefix: 'fas',\n  iconName: 'arrow-rotate-right',\n  icon: [512, 512, [8635, \"arrow-right-rotate\", \"arrow-rotate-forward\", \"redo\"], \"f01e\", \"M496 48V192c0 17.69-14.31 32-32 32H320c-17.69 0-32-14.31-32-32s14.31-32 32-32h63.39c-29.97-39.7-77.25-63.78-127.6-63.78C167.7 96.22 96 167.9 96 256s71.69 159.8 159.8 159.8c34.88 0 68.03-11.03 95.88-31.94c14.22-10.53 34.22-7.75 44.81 6.375c10.59 14.16 7.75 34.22-6.375 44.81c-39.03 29.28-85.36 44.86-134.2 44.86C132.5 479.9 32 379.4 32 256s100.5-223.9 223.9-223.9c69.15 0 134 32.47 176.1 86.12V48c0-17.69 14.31-32 32-32S496 30.31 496 48z\"]\n};\nvar faArrowRightRotate = faArrowRotateRight;\nvar faArrowRotateForward = faArrowRotateRight;\nvar faRedo = faArrowRotateRight;\nvar faArrowTrendDown = {\n  prefix: 'fas',\n  iconName: 'arrow-trend-down',\n  icon: [576, 512, [], \"e097\", \"M466.7 352L320 205.3L214.6 310.6C202.1 323.1 181.9 323.1 169.4 310.6L9.372 150.6C-3.124 138.1-3.124 117.9 9.372 105.4C21.87 92.88 42.13 92.88 54.63 105.4L191.1 242.7L297.4 137.4C309.9 124.9 330.1 124.9 342.6 137.4L512 306.7V223.1C512 206.3 526.3 191.1 544 191.1C561.7 191.1 576 206.3 576 223.1V384C576 401.7 561.7 416 544 416H384C366.3 416 352 401.7 352 384C352 366.3 366.3 352 384 352L466.7 352z\"]\n};\nvar faArrowTrendUp = {\n  prefix: 'fas',\n  iconName: 'arrow-trend-up',\n  icon: [576, 512, [], \"e098\", \"M384 160C366.3 160 352 145.7 352 128C352 110.3 366.3 96 384 96H544C561.7 96 576 110.3 576 128V288C576 305.7 561.7 320 544 320C526.3 320 512 305.7 512 288V205.3L342.6 374.6C330.1 387.1 309.9 387.1 297.4 374.6L191.1 269.3L54.63 406.6C42.13 419.1 21.87 419.1 9.372 406.6C-3.124 394.1-3.124 373.9 9.372 361.4L169.4 201.4C181.9 188.9 202.1 188.9 214.6 201.4L320 306.7L466.7 159.1L384 160z\"]\n};\nvar faArrowTurnDown = {\n  prefix: 'fas',\n  iconName: 'arrow-turn-down',\n  icon: [384, 512, [\"level-down\"], \"f149\", \"M342.6 374.6l-128 128C208.4 508.9 200.2 512 191.1 512s-16.38-3.125-22.63-9.375l-127.1-128c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 402.8V80C160 71.19 152.8 64 144 64H32C14.33 64 0 49.69 0 32s14.33-32 32-32h112C188.1 0 224 35.88 224 80v322.8l73.37-73.38c12.5-12.5 32.75-12.5 45.25 0S355.1 362.1 342.6 374.6z\"]\n};\nvar faLevelDown = faArrowTurnDown;\nvar faArrowTurnUp = {\n  prefix: 'fas',\n  iconName: 'arrow-turn-up',\n  icon: [384, 512, [\"level-up\"], \"f148\", \"M342.6 182.6C336.4 188.9 328.2 192 319.1 192s-16.38-3.125-22.62-9.375L224 109.3V432c0 44.13-35.89 80-80 80H32c-17.67 0-32-14.31-32-32s14.33-32 32-32h112C152.8 448 160 440.8 160 432V109.3L86.62 182.6c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l127.1-128c12.5-12.5 32.75-12.5 45.25 0l128 128C355.1 149.9 355.1 170.1 342.6 182.6z\"]\n};\nvar faLevelUp = faArrowTurnUp;\nvar faArrowUp = {\n  prefix: 'fas',\n  iconName: 'arrow-up',\n  icon: [384, 512, [8593], \"f062\", \"M374.6 246.6C368.4 252.9 360.2 256 352 256s-16.38-3.125-22.62-9.375L224 141.3V448c0 17.69-14.33 31.1-31.1 31.1S160 465.7 160 448V141.3L54.63 246.6c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l160-160c12.5-12.5 32.75-12.5 45.25 0l160 160C387.1 213.9 387.1 234.1 374.6 246.6z\"]\n};\nvar faArrowUp19 = {\n  prefix: 'fas',\n  iconName: 'arrow-up-1-9',\n  icon: [512, 512, [\"sort-numeric-up\"], \"f163\", \"M320 192c0 17.69 14.31 31.1 32 31.1L416 224c17.69 0 32-14.31 32-32s-14.31-32-32-32V63.98c0-11.19-5.844-21.53-15.38-27.34c-9.531-5.781-21.41-6.188-31.34-1.062l-32 16.59c-15.69 8.125-21.81 27.44-13.69 43.13C329.3 106.3 340.4 112.6 352 112.6V160C334.3 160 320 174.3 320 192zM392 255.6c-48.6 0-88 39.4-88 88c0 36.44 22.15 67.7 53.71 81.07l-7.682 8.004c-10.72 11.16-10.34 28.88 .8125 39.56C356.3 477.4 363.3 480 370.2 480c7.344 0 14.72-2.875 20.19-8.625c69.61-72.53 89.6-85.39 89.6-127.8C480 294.1 440.6 255.6 392 255.6zM392 367.6c-13.23 0-24-10.77-24-24s10.77-24 24-24s24 10.77 24 24S405.2 367.6 392 367.6zM39.99 191.7c8.672 0 17.3-3.5 23.61-10.38L96 145.9v302c0 17.7 14.33 32.03 31.1 32.03s32-14.33 32-32.03V145.9L192.4 181.3C204.4 194.3 224.6 195.2 237.6 183.3c13.03-11.95 13.9-32.22 1.969-45.27L151.6 41.94c-12.12-13.26-35.06-13.26-47.19 0l-87.1 96.09C4.475 151.1 5.35 171.3 18.38 183.3C24.52 188.9 32.27 191.7 39.99 191.7z\"]\n};\nvar faSortNumericUp = faArrowUp19;\nvar faArrowUp91 = {\n  prefix: 'fas',\n  iconName: 'arrow-up-9-1',\n  icon: [512, 512, [\"sort-numeric-up-alt\"], \"f887\", \"M237.6 183.3c13.03-11.95 13.9-32.22 1.969-45.27L151.6 41.94c-12.12-13.26-35.06-13.26-47.19 0l-87.1 96.09C4.475 151.1 5.35 171.3 18.38 183.3c13.02 11.95 33.27 11.04 45.22-1.969L96 145.9v302c0 17.7 14.33 32.03 31.1 32.03s32-14.33 32-32.03V145.9L192.4 181.3c6.312 6.883 14.94 10.38 23.61 10.38C223.7 191.7 231.5 188.9 237.6 183.3zM357.7 201.1l-7.682 8.004c-10.72 11.16-10.34 28.88 .8125 39.56c5.406 5.219 12.41 7.812 19.38 7.812c7.344 0 14.72-2.875 20.19-8.625c69.61-72.53 89.6-85.39 89.6-127.8c0-48.6-39.4-88-88-88s-88 39.4-88 88C303.1 156.4 326.1 187.7 357.7 201.1zM392 96c13.23 0 24 10.77 24 24S405.2 144 392 144S368 133.2 368 120S378.8 96 392 96zM416 416.4v-96.02c0-11.19-5.844-21.53-15.38-27.34c-9.531-5.781-21.41-6.188-31.34-1.062l-32 16.59c-15.69 8.125-21.81 27.44-13.69 43.13C329.3 362.8 340.4 369 352 369v47.41c-17.69 0-32 14.31-32 32s14.31 32 32 32h64c17.69 0 32-14.31 32-32S433.7 416.4 416 416.4z\"]\n};\nvar faSortNumericUpAlt = faArrowUp91;\nvar faArrowUpAZ = {\n  prefix: 'fas',\n  iconName: 'arrow-up-a-z',\n  icon: [512, 512, [\"sort-alpha-up\"], \"f15e\", \"M151.6 41.95c-12.12-13.26-35.06-13.26-47.19 0l-87.1 96.09C4.473 151.1 5.348 171.4 18.38 183.3c13.02 11.95 33.27 11.04 45.22-1.973L96 145.9v302C96 465.7 110.3 480 128 480S160 465.7 160 447.1V145.9L192.4 181.3c11.46 12.49 31.67 14.39 45.22 1.973c13.03-11.95 13.9-32.22 1.969-45.27L151.6 41.95zM448 416h-50.75l73.38-73.38c9.156-9.156 11.89-22.91 6.938-34.88s-16.63-19.86-29.56-19.86H319.1C302.3 287.9 288 302.3 288 320s14.33 32 32 32h50.75l-73.38 73.38c-9.156 9.156-11.89 22.91-6.938 34.88S307.1 480 319.1 480h127.1C465.7 480 480 465.7 480 448S465.7 416 448 416zM492.6 209.3l-79.99-160.1c-10.84-21.81-46.4-21.81-57.24 0L275.4 209.3c-7.906 15.91-1.5 35.24 14.31 43.19c15.87 7.922 35.04 1.477 42.93-14.4l7.154-14.39h88.43l7.154 14.39c6.174 12.43 23.97 23.87 42.93 14.4C494.1 244.6 500.5 225.2 492.6 209.3zM367.8 167.4L384 134.7l16.22 32.63H367.8z\"]\n};\nvar faSortAlphaUp = faArrowUpAZ;\nvar faArrowUpFromBracket = {\n  prefix: 'fas',\n  iconName: 'arrow-up-from-bracket',\n  icon: [448, 512, [], \"e09a\", \"M384 352v64c0 17.67-14.33 32-32 32H96c-17.67 0-32-14.33-32-32v-64c0-17.67-14.33-32-32-32s-32 14.33-32 32v64c0 53.02 42.98 96 96 96h256c53.02 0 96-42.98 96-96v-64c0-17.67-14.33-32-32-32S384 334.3 384 352zM201.4 9.375l-128 128c-12.51 12.51-12.49 32.76 0 45.25c12.5 12.5 32.75 12.5 45.25 0L192 109.3V320c0 17.69 14.31 32 32 32s32-14.31 32-32V109.3l73.38 73.38c12.5 12.5 32.75 12.5 45.25 0s12.5-32.75 0-45.25l-128-128C234.1-3.125 213.9-3.125 201.4 9.375z\"]\n};\nvar faArrowUpFromGroundWater = {\n  prefix: 'fas',\n  iconName: 'arrow-up-from-ground-water',\n  icon: [576, 512, [], \"e4b5\", \"M256 319.1V109.3L230.6 134.6C218.1 147.1 197.9 147.1 185.4 134.6C172.9 122.1 172.9 101.9 185.4 89.37L265.4 9.372C277.9-3.124 298.1-3.124 310.6 9.372L390.6 89.37C403.1 101.9 403.1 122.1 390.6 134.6C378.1 147.1 357.9 147.1 345.4 134.6L320 109.3V319.1C320 337.7 305.7 352 288 352C270.3 352 256 337.7 256 319.1zM269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448C410.9 448 439.4 437.2 461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515.1 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.13 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.854 504.5 .8429 487.3C-3.168 470.1 7.533 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9H269.5zM192 416.5C172.1 416.4 150.8 408.5 132.9 396.1C109.1 379.4 77.01 380.8 54.78 399.5C44.18 408.3 30.59 415.1 17.49 418.1C11.19 419.6 5.326 421.9 0 425V239.1C0 213.5 21.49 191.1 48 191.1H192V416.5zM576 239.1V424.1C570.7 421.9 564.8 419.6 558.5 418.1C545.4 415.1 531.8 408.3 521.2 399.5C499 380.8 466.9 379.4 443.2 396.1C425.2 408.5 403 416.5 384 416.5L384 191.1H528C554.5 191.1 576 213.5 576 239.1L576 239.1z\"]\n};\nvar faArrowUpFromWaterPump = {\n  prefix: 'fas',\n  iconName: 'arrow-up-from-water-pump',\n  icon: [576, 512, [], \"e4b6\", \"M239.1 0C266.5 0 287.1 21.49 287.1 48V256H416V109.3L390.6 134.6C378.1 147.1 357.9 147.1 345.4 134.6C332.9 122.1 332.9 101.9 345.4 89.37L425.4 9.373C437.9-3.124 458.1-3.124 470.6 9.373L550.6 89.37C563.1 101.9 563.1 122.1 550.6 134.6C538.1 147.1 517.9 147.1 505.4 134.6L480 109.3V256H528C554.5 256 576 277.5 576 304V400C576 408 574 415.6 570.6 422.2C566.8 420.5 562.8 419.1 558.5 418.1C545.4 415.1 531.8 408.3 521.2 399.5C499 380.8 466.9 379.4 443.2 396.1C425.2 408.5 403 416.5 384 416.5C364.4 416.5 343.2 408.8 324.8 396.1C302.8 380.6 273.3 380.6 251.2 396.1C234 407.9 213.2 416.5 192 416.5C172.1 416.5 150.8 408.5 132.9 396.1C109.1 379.4 77.01 380.8 54.78 399.5C44.18 408.3 30.59 415.1 17.49 418.1C13.27 419.1 9.239 420.5 5.439 422.2C1.965 415.6 0 408 0 400V304C0 277.5 21.49 256 48 256H64V48C64 21.49 85.49 0 112 0H239.1zM384 448C410.9 448 439.4 437.2 461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.12 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.853 504.5 .8422 487.3C-3.169 470.1 7.532 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448H384z\"]\n};\nvar faArrowUpLong = {\n  prefix: 'fas',\n  iconName: 'arrow-up-long',\n  icon: [320, 512, [\"long-arrow-up\"], \"f176\", \"M310.6 182.6c-12.51 12.51-32.76 12.49-45.25 0L192 109.3V480c0 17.69-14.31 32-32 32s-32-14.31-32-32V109.3L54.63 182.6c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l128-128c12.5-12.5 32.75-12.5 45.25 0l128 128C323.1 149.9 323.1 170.1 310.6 182.6z\"]\n};\nvar faLongArrowUp = faArrowUpLong;\nvar faArrowUpRightDots = {\n  prefix: 'fas',\n  iconName: 'arrow-up-right-dots',\n  icon: [576, 512, [], \"e4b7\", \"M287.1 0C305.7 0 320 14.33 320 32V160C320 177.7 305.7 192 287.1 192C270.3 192 255.1 177.7 255.1 160V109.3L54.63 310.6C42.13 323.1 21.87 323.1 9.372 310.6C-3.124 298.1-3.124 277.9 9.372 265.4L210.7 64H159.1C142.3 64 127.1 49.67 127.1 32C127.1 14.33 142.3 0 159.1 0H287.1zM576 80C576 106.5 554.5 128 528 128C501.5 128 480 106.5 480 80C480 53.49 501.5 32 528 32C554.5 32 576 53.49 576 80zM448 208C448 234.5 426.5 256 400 256C373.5 256 352 234.5 352 208C352 181.5 373.5 160 400 160C426.5 160 448 181.5 448 208zM352 336C352 309.5 373.5 288 400 288C426.5 288 448 309.5 448 336C448 362.5 426.5 384 400 384C373.5 384 352 362.5 352 336zM448 464C448 490.5 426.5 512 400 512C373.5 512 352 490.5 352 464C352 437.5 373.5 416 400 416C426.5 416 448 437.5 448 464zM576 464C576 490.5 554.5 512 528 512C501.5 512 480 490.5 480 464C480 437.5 501.5 416 528 416C554.5 416 576 437.5 576 464zM223.1 336C223.1 309.5 245.5 288 271.1 288C298.5 288 320 309.5 320 336C320 362.5 298.5 384 271.1 384C245.5 384 223.1 362.5 223.1 336zM320 464C320 490.5 298.5 512 271.1 512C245.5 512 223.1 490.5 223.1 464C223.1 437.5 245.5 416 271.1 416C298.5 416 320 437.5 320 464zM95.1 464C95.1 437.5 117.5 416 143.1 416C170.5 416 191.1 437.5 191.1 464C191.1 490.5 170.5 512 143.1 512C117.5 512 95.1 490.5 95.1 464zM576 336C576 362.5 554.5 384 528 384C501.5 384 480 362.5 480 336C480 309.5 501.5 288 528 288C554.5 288 576 309.5 576 336zM480 208C480 181.5 501.5 160 528 160C554.5 160 576 181.5 576 208C576 234.5 554.5 256 528 256C501.5 256 480 234.5 480 208z\"]\n};\nvar faArrowUpRightFromSquare = {\n  prefix: 'fas',\n  iconName: 'arrow-up-right-from-square',\n  icon: [448, 512, [\"external-link\"], \"f08e\", \"M256 64C256 46.33 270.3 32 288 32H415.1C415.1 32 415.1 32 415.1 32C420.3 32 424.5 32.86 428.2 34.43C431.1 35.98 435.5 38.27 438.6 41.3C438.6 41.35 438.6 41.4 438.7 41.44C444.9 47.66 447.1 55.78 448 63.9C448 63.94 448 63.97 448 64V192C448 209.7 433.7 224 416 224C398.3 224 384 209.7 384 192V141.3L214.6 310.6C202.1 323.1 181.9 323.1 169.4 310.6C156.9 298.1 156.9 277.9 169.4 265.4L338.7 96H288C270.3 96 256 81.67 256 64V64zM0 128C0 92.65 28.65 64 64 64H160C177.7 64 192 78.33 192 96C192 113.7 177.7 128 160 128H64V416H352V320C352 302.3 366.3 288 384 288C401.7 288 416 302.3 416 320V416C416 451.3 387.3 480 352 480H64C28.65 480 0 451.3 0 416V128z\"]\n};\nvar faExternalLink = faArrowUpRightFromSquare;\nvar faArrowUpShortWide = {\n  prefix: 'fas',\n  iconName: 'arrow-up-short-wide',\n  icon: [576, 512, [\"sort-amount-up-alt\"], \"f885\", \"M544 416h-223.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H544c17.67 0 32-14.33 32-32S561.7 416 544 416zM320 96h32c17.67 0 31.1-14.33 31.1-32s-14.33-32-31.1-32h-32c-17.67 0-32 14.33-32 32S302.3 96 320 96zM320 224H416c17.67 0 32-14.33 32-32s-14.33-32-32-32h-95.1c-17.67 0-32 14.33-32 32S302.3 224 320 224zM320 352H480c17.67 0 32-14.33 32-32s-14.33-32-32-32h-159.1c-17.67 0-32 14.33-32 32S302.3 352 320 352zM151.6 41.95c-12.12-13.26-35.06-13.26-47.19 0l-87.1 96.09C4.475 151.1 5.35 171.4 18.38 183.3c6.141 5.629 13.89 8.414 21.61 8.414c8.672 0 17.3-3.504 23.61-10.39L96 145.9v302C96 465.7 110.3 480 128 480s32-14.33 32-32.03V145.9L192.4 181.3C204.4 194.3 224.6 195.3 237.6 183.3c13.03-11.95 13.9-32.22 1.969-45.27L151.6 41.95z\"]\n};\nvar faSortAmountUpAlt = faArrowUpShortWide;\nvar faArrowUpWideShort = {\n  prefix: 'fas',\n  iconName: 'arrow-up-wide-short',\n  icon: [576, 512, [\"sort-amount-up\"], \"f161\", \"M416 288h-95.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H416c17.67 0 32-14.33 32-32S433.7 288 416 288zM352 416h-32c-17.67 0-32 14.33-32 32s14.33 32 32 32h32c17.67 0 31.1-14.33 31.1-32S369.7 416 352 416zM480 160h-159.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H480c17.67 0 32-14.33 32-32S497.7 160 480 160zM544 32h-223.1c-17.67 0-32 14.33-32 32s14.33 32 32 32H544c17.67 0 32-14.33 32-32S561.7 32 544 32zM151.6 41.95c-12.12-13.26-35.06-13.26-47.19 0l-87.1 96.09C4.475 151.1 5.35 171.4 18.38 183.3c6.141 5.629 13.89 8.414 21.61 8.414c8.672 0 17.3-3.504 23.61-10.39L96 145.9v302C96 465.7 110.3 480 128 480s32-14.33 32-32.03V145.9L192.4 181.3C204.4 194.3 224.6 195.3 237.6 183.3c13.03-11.95 13.9-32.22 1.969-45.27L151.6 41.95z\"]\n};\nvar faSortAmountUp = faArrowUpWideShort;\nvar faArrowUpZA = {\n  prefix: 'fas',\n  iconName: 'arrow-up-z-a',\n  icon: [512, 512, [\"sort-alpha-up-alt\"], \"f882\", \"M151.6 41.95c-12.12-13.26-35.06-13.26-47.19 0l-87.1 96.09C4.473 151.1 5.348 171.4 18.38 183.3c13.02 11.95 33.27 11.04 45.22-1.973L96 145.9v302C96 465.7 110.3 480 128 480S160 465.7 160 447.1V145.9L192.4 181.3c6.312 6.883 14.94 10.39 23.61 10.39c7.719 0 15.47-2.785 21.61-8.414c13.03-11.95 13.9-32.22 1.969-45.27L151.6 41.95zM320 96h50.75l-73.38 73.38c-9.156 9.156-11.89 22.91-6.938 34.88s16.63 19.74 29.56 19.74h127.1C465.7 223.1 480 209.7 480 192s-14.33-32-32-32h-50.75l73.38-73.38c9.156-9.156 11.89-22.91 6.938-34.88S460.9 32 447.1 32h-127.1C302.3 32 288 46.31 288 64S302.3 96 320 96zM492.6 433.3l-79.99-160.1c-10.84-21.81-46.4-21.81-57.24 0l-79.99 160.1c-7.906 15.91-1.5 35.24 14.31 43.19c15.87 7.922 35.04 1.477 42.93-14.4l7.154-14.39h88.43l7.154 14.39c6.174 12.43 23.97 23.87 42.93 14.4C494.1 468.6 500.5 449.2 492.6 433.3zM367.8 391.4L384 358.7l16.22 32.63H367.8z\"]\n};\nvar faSortAlphaUpAlt = faArrowUpZA;\nvar faArrowsDownToLine = {\n  prefix: 'fas',\n  iconName: 'arrows-down-to-line',\n  icon: [576, 512, [], \"e4b8\", \"M544 416C561.7 416 576 430.3 576 448C576 465.7 561.7 480 544 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H544zM470.6 374.6C458.1 387.1 437.9 387.1 425.4 374.6L329.4 278.6C316.9 266.1 316.9 245.9 329.4 233.4C341.9 220.9 362.1 220.9 374.6 233.4L416 274.7V64C416 46.33 430.3 32 448 32C465.7 32 480 46.33 480 64V274.7L521.4 233.4C533.9 220.9 554.1 220.9 566.6 233.4C579.1 245.9 579.1 266.1 566.6 278.6L470.6 374.6zM246.6 278.6L150.6 374.6C138.1 387.1 117.9 387.1 105.4 374.6L9.373 278.6C-3.124 266.1-3.124 245.9 9.373 233.4C21.87 220.9 42.13 220.9 54.63 233.4L96 274.7V64C96 46.33 110.3 32 128 32C145.7 32 160 46.33 160 64V274.7L201.4 233.4C213.9 220.9 234.1 220.9 246.6 233.4C259.1 245.9 259.1 266.1 246.6 278.6H246.6z\"]\n};\nvar faArrowsDownToPeople = {\n  prefix: 'fas',\n  iconName: 'arrows-down-to-people',\n  icon: [640, 512, [], \"e4b9\", \"M167.1 24V142.1L191 119C200.4 109.7 215.6 109.7 224.1 119C234.3 128.4 234.3 143.6 224.1 152.1L160.1 216.1C151.6 226.3 136.4 226.3 127 216.1L63.03 152.1C53.65 143.6 53.65 128.4 63.03 119C72.4 109.7 87.6 109.7 96.97 119L119.1 142.1V24C119.1 10.75 130.7 0 143.1 0C157.3 0 167.1 10.75 167.1 24V24zM359.1 200C359.1 222.1 342.1 240 319.1 240C297.9 240 279.1 222.1 279.1 200C279.1 177.9 297.9 160 319.1 160C342.1 160 359.1 177.9 359.1 200zM183.1 296C183.1 318.1 166.1 336 143.1 336C121.9 336 103.1 318.1 103.1 296C103.1 273.9 121.9 256 143.1 256C166.1 256 183.1 273.9 183.1 296zM455.1 296C455.1 273.9 473.9 256 495.1 256C518.1 256 535.1 273.9 535.1 296C535.1 318.1 518.1 336 495.1 336C473.9 336 455.1 318.1 455.1 296zM199.1 480C199.1 497.7 185.7 512 167.1 512H119.1C102.3 512 87.1 497.7 87.1 480V441.5L61.13 491.4C54.84 503 40.29 507.4 28.62 501.1C16.95 494.8 12.58 480.3 18.87 468.6L56.74 398.3C72.09 369.8 101.9 352 134.2 352H153.8C170.1 352 185.7 356.5 199.2 364.6L232.7 302.3C248.1 273.8 277.9 255.1 310.2 255.1H329.8C362.1 255.1 391.9 273.8 407.3 302.3L440.8 364.6C454.3 356.5 469.9 352 486.2 352H505.8C538.1 352 567.9 369.8 583.3 398.3L621.1 468.6C627.4 480.3 623 494.8 611.4 501.1C599.7 507.4 585.1 503 578.9 491.4L551.1 441.5V480C551.1 497.7 537.7 512 519.1 512H471.1C454.3 512 439.1 497.7 439.1 480V441.5L413.1 491.4C406.8 503 392.3 507.4 380.6 501.1C368.9 494.8 364.6 480.3 370.9 468.6L407.2 401.1C405.5 399.5 404 397.6 402.9 395.4L375.1 345.5V400C375.1 417.7 361.7 432 343.1 432H295.1C278.3 432 263.1 417.7 263.1 400V345.5L237.1 395.4C235.1 397.6 234.5 399.5 232.8 401.1L269.1 468.6C275.4 480.3 271 494.8 259.4 501.1C247.7 507.4 233.1 503 226.9 491.4L199.1 441.5L199.1 480zM415 152.1C405.7 143.6 405.7 128.4 415 119C424.4 109.7 439.6 109.7 448.1 119L471.1 142.1V24C471.1 10.75 482.7 0 495.1 0C509.3 0 519.1 10.75 519.1 24V142.1L543 119C552.4 109.7 567.6 109.7 576.1 119C586.3 128.4 586.3 143.6 576.1 152.1L512.1 216.1C503.6 226.3 488.4 226.3 479 216.1L415 152.1z\"]\n};\nvar faArrowsLeftRight = {\n  prefix: 'fas',\n  iconName: 'arrows-left-right',\n  icon: [512, 512, [\"arrows-h\"], \"f07e\", \"M502.6 278.6l-96 96C400.4 380.9 392.2 384 384 384s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L402.8 288h-293.5l41.38 41.38c12.5 12.5 12.5 32.75 0 45.25C144.4 380.9 136.2 384 128 384s-16.38-3.125-22.62-9.375l-96-96c-12.5-12.5-12.5-32.75 0-45.25l96-96c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L109.3 224h293.5l-41.38-41.38c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l96 96C515.1 245.9 515.1 266.1 502.6 278.6z\"]\n};\nvar faArrowsH = faArrowsLeftRight;\nvar faArrowsLeftRightToLine = {\n  prefix: 'fas',\n  iconName: 'arrows-left-right-to-line',\n  icon: [640, 512, [], \"e4ba\", \"M32 64C49.67 64 64 78.33 64 96V416C64 433.7 49.67 448 32 448C14.33 448 0 433.7 0 416V96C0 78.33 14.33 64 32 64zM246.6 137.4C259.1 149.9 259.1 170.1 246.6 182.6L205.3 224H434.7L393.4 182.6C380.9 170.1 380.9 149.9 393.4 137.4C405.9 124.9 426.1 124.9 438.6 137.4L534.6 233.4C547.1 245.9 547.1 266.1 534.6 278.6L438.6 374.6C426.1 387.1 405.9 387.1 393.4 374.6C380.9 362.1 380.9 341.9 393.4 329.4L434.7 288H205.3L246.6 329.4C259.1 341.9 259.1 362.1 246.6 374.6C234.1 387.1 213.9 387.1 201.4 374.6L105.4 278.6C92.88 266.1 92.88 245.9 105.4 233.4L201.4 137.4C213.9 124.9 234.1 124.9 246.6 137.4V137.4zM640 416C640 433.7 625.7 448 608 448C590.3 448 576 433.7 576 416V96C576 78.33 590.3 64 608 64C625.7 64 640 78.33 640 96V416z\"]\n};\nvar faArrowsRotate = {\n  prefix: 'fas',\n  iconName: 'arrows-rotate',\n  icon: [512, 512, [128472, \"refresh\", \"sync\"], \"f021\", \"M464 16c-17.67 0-32 14.31-32 32v74.09C392.1 66.52 327.4 32 256 32C161.5 32 78.59 92.34 49.58 182.2c-5.438 16.81 3.797 34.88 20.61 40.28c16.89 5.5 34.88-3.812 40.3-20.59C130.9 138.5 189.4 96 256 96c50.5 0 96.26 24.55 124.4 64H336c-17.67 0-32 14.31-32 32s14.33 32 32 32h128c17.67 0 32-14.31 32-32V48C496 30.31 481.7 16 464 16zM441.8 289.6c-16.92-5.438-34.88 3.812-40.3 20.59C381.1 373.5 322.6 416 256 416c-50.5 0-96.25-24.55-124.4-64H176c17.67 0 32-14.31 32-32s-14.33-32-32-32h-128c-17.67 0-32 14.31-32 32v144c0 17.69 14.33 32 32 32s32-14.31 32-32v-74.09C119.9 445.5 184.6 480 255.1 480c94.45 0 177.4-60.34 206.4-150.2C467.9 313 458.6 294.1 441.8 289.6z\"]\n};\nvar faRefresh = faArrowsRotate;\nvar faSync = faArrowsRotate;\nvar faArrowsSpin = {\n  prefix: 'fas',\n  iconName: 'arrows-spin',\n  icon: [512, 512, [], \"e4bb\", \"M257.1 95.53C245.8 95.53 234.7 96.72 223.1 98.97V33.97C234.8 32.36 245.9 31.53 257.1 31.53C315.3 31.53 368.3 53.72 408.2 90.11L437.6 60.69C447.7 50.61 464.9 57.75 464.9 72V177.4C464.9 186.2 457.7 193.4 448.9 193.4H343.5C329.3 193.4 322.1 176.1 332.2 166.1L362.9 135.4C334.7 110.6 297.7 95.53 257.1 95.53L257.1 95.53zM97.14 255.5C97.14 266.7 98.27 277.5 100.4 288H35.47C33.93 277.4 33.14 266.6 33.14 255.5C33.14 198.2 54.71 145.8 90.18 106.2L60.69 76.69C50.61 66.61 57.74 49.38 71.1 49.38H177.4C186.2 49.38 193.4 56.54 193.4 65.38V170.7C193.4 185 176.1 192.1 166.1 182.1L135.5 151.5C111.6 179.5 97.14 215.8 97.14 255.5V255.5zM182.1 348.2L153.1 377.1C181.1 401.1 217.4 415.5 257.1 415.5C267.7 415.5 278 414.5 288 412.6V477.4C277.9 478.8 267.6 479.5 257.1 479.5C199.8 479.5 147.4 457.1 107.8 422.5L76.69 453.6C66.61 463.7 49.37 456.5 49.37 442.3V336.9C49.37 328.1 56.54 320.9 65.37 320.9H170.7C184.1 320.9 192.1 338.1 182.1 348.2H182.1zM348.2 332.2L377.2 361.2C402.1 333.1 417.1 296.1 417.1 255.5C417.1 244.7 416.1 234.2 414 224H478.9C480.4 234.3 481.1 244.8 481.1 255.5C481.1 313.7 458.9 366.7 422.6 406.6L453.6 437.6C463.7 447.7 456.5 464.9 442.3 464.9H336.9C328.1 464.9 320.9 457.7 320.9 448.9V343.5C320.9 329.3 338.1 322.1 348.2 332.2L348.2 332.2z\"]\n};\nvar faArrowsSplitUpAndLeft = {\n  prefix: 'fas',\n  iconName: 'arrows-split-up-and-left',\n  icon: [512, 512, [], \"e4bc\", \"M246.6 150.6C234.1 163.1 213.9 163.1 201.4 150.6C188.9 138.1 188.9 117.9 201.4 105.4L297.4 9.372C309.9-3.124 330.1-3.124 342.6 9.372L438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6C426.1 163.1 405.9 163.1 393.4 150.6L352 109.3V384C352 419.3 380.7 448 416 448H480C497.7 448 512 462.3 512 480C512 497.7 497.7 512 480 512H416C345.3 512 288 454.7 288 384C288 348.7 259.3 320 224 320H109.3L150.6 361.4C163.1 373.9 163.1 394.1 150.6 406.6C138.1 419.1 117.9 419.1 105.4 406.6L9.38 310.6L9.305 310.6C3.575 304.8 .0259 296.9 .0003 288.1L2.428 275.8C3.99 271.1 6.305 268.4 9.372 265.4L105.4 169.4C117.9 156.9 138.1 156.9 150.6 169.4C163.1 181.9 163.1 202.1 150.6 214.6L109.3 255.1H224C247.3 255.1 269.2 262.2 288 273.1V109.3L246.6 150.6zM0 287.9C.0125 283.6 .8749 279.5 2.428 275.8C.8214 279.6 .0122 283.8 0 287.9zM0 288.1V287.1V287.9V288.1z\"]\n};\nvar faArrowsToCircle = {\n  prefix: 'fas',\n  iconName: 'arrows-to-circle',\n  icon: [640, 512, [], \"e4bd\", \"M9.372 9.372C21.87-3.124 42.13-3.124 54.63 9.372L159.1 114.7V95.1C159.1 78.33 174.3 63.1 191.1 63.1C209.7 63.1 223.1 78.33 223.1 95.1V191.1C223.1 196.3 223.1 200.5 221.6 204.2C220 207.1 217.7 211.5 214.7 214.6L214.6 214.7C211.5 217.7 207.1 220 204.2 221.6C200.5 223.1 196.3 223.1 191.1 223.1H95.1C78.33 223.1 63.1 209.7 63.1 191.1C63.1 174.3 78.33 159.1 95.1 159.1H114.7L9.372 54.63C-3.124 42.13-3.124 21.87 9.372 9.372V9.372zM384 256C384 291.3 355.3 320 320 320C284.7 320 256 291.3 256 256C256 220.7 284.7 192 320 192C355.3 192 384 220.7 384 256zM96 352C78.33 352 64 337.7 64 320C64 302.3 78.33 288 96 288H192H192.1C200.9 288 208.8 291.6 214.6 297.3L214.7 297.4C217.7 300.5 220 304 221.6 307.8C223.1 311.5 224 315.7 224 319.1V416C224 433.7 209.7 448 192 448C174.3 448 160 433.7 160 416V397.3L54.63 502.6C42.13 515.1 21.87 515.1 9.373 502.6C-3.124 490.1-3.124 469.9 9.373 457.4L114.7 352L96 352zM448 64C465.7 64 480 78.33 480 96V114.7L585.4 9.373C597.9-3.124 618.1-3.124 630.6 9.373C643.1 21.87 643.1 42.13 630.6 54.63L525.3 160H544C561.7 160 576 174.3 576 192C576 209.7 561.7 224 544 224H448C439.2 224 431.2 220.4 425.4 214.7L425.3 214.6C422.3 211.5 419.1 207.1 418.4 204.2C416.9 200.5 416 196.4 416 192.1V191.1V96C416 78.33 430.3 64 448 64H448zM525.3 352L630.6 457.4C643.1 469.9 643.1 490.1 630.6 502.6C618.1 515.1 597.9 515.1 585.4 502.6L480 397.3V416C480 433.7 465.7 448 448 448C430.3 448 416 433.7 416 416V320C416 319.1 416 319.9 416 319.9C416 315.6 416.9 311.5 418.4 307.8C419.1 303.1 422.3 300.4 425.4 297.4C431.1 291.6 439.1 288 447.9 288C447.9 288 447.1 288 448 288H544C561.7 288 576 302.3 576 320C576 337.7 561.7 352 544 352L525.3 352z\"]\n};\nvar faArrowsToDot = {\n  prefix: 'fas',\n  iconName: 'arrows-to-dot',\n  icon: [512, 512, [], \"e4be\", \"M288 82.74L297.4 73.37C309.9 60.88 330.1 60.88 342.6 73.37C355.1 85.87 355.1 106.1 342.6 118.6L278.6 182.6C266.1 195.1 245.9 195.1 233.4 182.6L169.4 118.6C156.9 106.1 156.9 85.87 169.4 73.37C181.9 60.88 202.1 60.88 214.6 73.37L223.1 82.75V32C223.1 14.33 238.3 0 255.1 0C273.7 0 288 14.33 288 32L288 82.74zM438.6 342.6C426.1 355.1 405.9 355.1 393.4 342.6L329.4 278.6C316.9 266.1 316.9 245.9 329.4 233.4L393.4 169.4C405.9 156.9 426.1 156.9 438.6 169.4C451.1 181.9 451.1 202.1 438.6 214.6L429.3 223.1H480C497.7 223.1 512 238.3 512 255.1C512 273.7 497.7 287.1 480 287.1H429.3L438.6 297.4C451.1 309.9 451.1 330.1 438.6 342.6V342.6zM288 256C288 273.7 273.7 288 256 288C238.3 288 224 273.7 224 256C224 238.3 238.3 224 256 224C273.7 224 288 238.3 288 256zM182.6 233.4C195.1 245.9 195.1 266.1 182.6 278.6L118.6 342.6C106.1 355.1 85.87 355.1 73.37 342.6C60.88 330.1 60.88 309.9 73.37 297.4L82.75 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H82.74L73.37 214.6C60.88 202.1 60.88 181.9 73.37 169.4C85.87 156.9 106.1 156.9 118.6 169.4L182.6 233.4zM169.4 438.6C156.9 426.1 156.9 405.9 169.4 393.4L233.4 329.4C245.9 316.9 266.1 316.9 278.6 329.4L342.6 393.4C355.1 405.9 355.1 426.1 342.6 438.6C330.1 451.1 309.9 451.1 297.4 438.6L288 429.3V480C288 497.7 273.7 512 256 512C238.3 512 224 497.7 224 480V429.3L214.6 438.6C202.1 451.1 181.9 451.1 169.4 438.6H169.4z\"]\n};\nvar faArrowsToEye = {\n  prefix: 'fas',\n  iconName: 'arrows-to-eye',\n  icon: [640, 512, [], \"e4bf\", \"M15.03 15.03C24.4 5.657 39.6 5.657 48.97 15.03L112 78.06V40C112 26.75 122.7 15.1 136 15.1C149.3 15.1 160 26.75 160 40V136C160 149.3 149.3 160 136 160H40C26.75 160 15.1 149.3 15.1 136C15.1 122.7 26.75 112 40 112H78.06L15.03 48.97C5.657 39.6 5.657 24.4 15.03 15.03V15.03zM133.5 243.9C158.6 193.6 222.7 112 320 112C417.3 112 481.4 193.6 506.5 243.9C510.3 251.6 510.3 260.4 506.5 268.1C481.4 318.4 417.3 400 320 400C222.7 400 158.6 318.4 133.5 268.1C129.7 260.4 129.7 251.6 133.5 243.9V243.9zM320 320C355.3 320 384 291.3 384 256C384 220.7 355.3 192 320 192C284.7 192 256 220.7 256 256C256 291.3 284.7 320 320 320zM591 15.03C600.4 5.657 615.6 5.657 624.1 15.03C634.3 24.4 634.3 39.6 624.1 48.97L561.9 112H600C613.3 112 624 122.7 624 136C624 149.3 613.3 160 600 160H504C490.7 160 480 149.3 480 136V40C480 26.75 490.7 15.1 504 15.1C517.3 15.1 528 26.75 528 40V78.06L591 15.03zM15.03 463L78.06 400H40C26.75 400 15.1 389.3 15.1 376C15.1 362.7 26.75 352 40 352H136C149.3 352 160 362.7 160 376V472C160 485.3 149.3 496 136 496C122.7 496 112 485.3 112 472V433.9L48.97 496.1C39.6 506.3 24.4 506.3 15.03 496.1C5.657 487.6 5.657 472.4 15.03 463V463zM528 433.9V472C528 485.3 517.3 496 504 496C490.7 496 480 485.3 480 472V376C480 362.7 490.7 352 504 352H600C613.3 352 624 362.7 624 376C624 389.3 613.3 400 600 400H561.9L624.1 463C634.3 472.4 634.3 487.6 624.1 496.1C615.6 506.3 600.4 506.3 591 496.1L528 433.9z\"]\n};\nvar faArrowsTurnRight = {\n  prefix: 'fas',\n  iconName: 'arrows-turn-right',\n  icon: [448, 512, [], \"e4c0\", \"M297.4 9.372C309.9-3.124 330.1-3.124 342.6 9.372L438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6L342.6 246.6C330.1 259.1 309.9 259.1 297.4 246.6C284.9 234.1 284.9 213.9 297.4 201.4L338.7 160H128C92.65 160 64 188.7 64 224V256C64 273.7 49.67 288 32 288C14.33 288 0 273.7 0 256V224C0 153.3 57.31 96 128 96H338.7L297.4 54.63C284.9 42.13 284.9 21.87 297.4 9.373V9.372zM201.4 265.4C213.9 252.9 234.1 252.9 246.6 265.4L342.6 361.4C355.1 373.9 355.1 394.1 342.6 406.6L246.6 502.6C234.1 515.1 213.9 515.1 201.4 502.6C188.9 490.1 188.9 469.9 201.4 457.4L242.7 416H96C78.33 416 64 430.3 64 448V480C64 497.7 49.67 512 32 512C14.33 512 0 497.7 0 480V448C0 394.1 42.98 352 96 352H242.7L201.4 310.6C188.9 298.1 188.9 277.9 201.4 265.4V265.4z\"]\n};\nvar faArrowsTurnToDots = {\n  prefix: 'fas',\n  iconName: 'arrows-turn-to-dots',\n  icon: [512, 512, [], \"e4c1\", \"M249.4 25.37C261.9 12.88 282.1 12.88 294.6 25.37C307.1 37.87 307.1 58.13 294.6 70.63L269.3 95.1H416C469 95.1 512 138.1 512 191.1V223.1C512 241.7 497.7 255.1 480 255.1C462.3 255.1 448 241.7 448 223.1V191.1C448 174.3 433.7 159.1 416 159.1H269.3L294.6 185.4C307.1 197.9 307.1 218.1 294.6 230.6C282.1 243.1 261.9 243.1 249.4 230.6L169.4 150.6C156.9 138.1 156.9 117.9 169.4 105.4L249.4 25.37zM342.6 361.4C355.1 373.9 355.1 394.1 342.6 406.6L262.6 486.6C250.1 499.1 229.9 499.1 217.4 486.6C204.9 474.1 204.9 453.9 217.4 441.4L242.7 416H96C78.33 416 64 430.3 64 448V480C64 497.7 49.67 512 32 512C14.33 512 0 497.7 0 480V448C0 394.1 42.98 352 96 352H242.7L217.4 326.6C204.9 314.1 204.9 293.9 217.4 281.4C229.9 268.9 250.1 268.9 262.6 281.4L342.6 361.4zM512 384C512 419.3 483.3 448 448 448C412.7 448 384 419.3 384 384C384 348.7 412.7 320 448 320C483.3 320 512 348.7 512 384zM128 128C128 163.3 99.35 192 64 192C28.65 192 0 163.3 0 128C0 92.65 28.65 64 64 64C99.35 64 128 92.65 128 128z\"]\n};\nvar faArrowsUpDown = {\n  prefix: 'fas',\n  iconName: 'arrows-up-down',\n  icon: [256, 512, [\"arrows-v\"], \"f07d\", \"M246.6 361.4C252.9 367.6 256 375.8 256 384s-3.125 16.38-9.375 22.62l-96 96c-12.5 12.5-32.75 12.5-45.25 0l-96-96c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L96 402.8v-293.5L54.63 150.6c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l96-96c12.5-12.5 32.75-12.5 45.25 0l96 96C252.9 111.6 256 119.8 256 128s-3.125 16.38-9.375 22.62c-12.5 12.5-32.75 12.5-45.25 0L160 109.3v293.5l41.38-41.38C213.9 348.9 234.1 348.9 246.6 361.4z\"]\n};\nvar faArrowsV = faArrowsUpDown;\nvar faArrowsUpDownLeftRight = {\n  prefix: 'fas',\n  iconName: 'arrows-up-down-left-right',\n  icon: [512, 512, [\"arrows\"], \"f047\", \"M512 255.1c0 8.188-3.125 16.41-9.375 22.66l-72 72C424.4 356.9 416.2 360 408 360c-18.28 0-32-14.95-32-32c0-8.188 3.125-16.38 9.375-22.62L402.8 288H288v114.8l17.38-17.38C311.6 379.1 319.8 376 328 376c18.28 0 32 14.95 32 32c0 8.188-3.125 16.38-9.375 22.62l-72 72C272.4 508.9 264.2 512 256 512s-16.38-3.125-22.62-9.375l-72-72C155.1 424.4 152 416.2 152 408c0-17.05 13.73-32 32-32c8.188 0 16.38 3.125 22.62 9.375L224 402.8V288H109.3l17.38 17.38C132.9 311.6 136 319.8 136 328c0 17.05-13.73 32-32 32c-8.188 0-16.38-3.125-22.62-9.375l-72-72C3.125 272.4 0 264.2 0 255.1s3.125-16.34 9.375-22.59l72-72C87.63 155.1 95.81 152 104 152c18.28 0 32 14.95 32 32c0 8.188-3.125 16.38-9.375 22.62L109.3 224H224V109.3L206.6 126.6C200.4 132.9 192.2 136 184 136c-18.28 0-32-14.95-32-32c0-8.188 3.125-16.38 9.375-22.62l72-72C239.6 3.125 247.8 0 256 0s16.38 3.125 22.62 9.375l72 72C356.9 87.63 360 95.81 360 104c0 17.05-13.73 32-32 32c-8.188 0-16.38-3.125-22.62-9.375L288 109.3V224h114.8l-17.38-17.38C379.1 200.4 376 192.2 376 184c0-17.05 13.73-32 32-32c8.188 0 16.38 3.125 22.62 9.375l72 72C508.9 239.6 512 247.8 512 255.1z\"]\n};\nvar faArrows = faArrowsUpDownLeftRight;\nvar faArrowsUpToLine = {\n  prefix: 'fas',\n  iconName: 'arrows-up-to-line',\n  icon: [576, 512, [], \"e4c2\", \"M32 96C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H544C561.7 32 576 46.33 576 64C576 81.67 561.7 96 544 96H32zM105.4 137.4C117.9 124.9 138.1 124.9 150.6 137.4L246.6 233.4C259.1 245.9 259.1 266.1 246.6 278.6C234.1 291.1 213.9 291.1 201.4 278.6L160 237.3V448C160 465.7 145.7 480 128 480C110.3 480 96 465.7 96 448V237.3L54.63 278.6C42.13 291.1 21.87 291.1 9.372 278.6C-3.124 266.1-3.124 245.9 9.372 233.4L105.4 137.4zM329.4 233.4L425.4 137.4C437.9 124.9 458.1 124.9 470.6 137.4L566.6 233.4C579.1 245.9 579.1 266.1 566.6 278.6C554.1 291.1 533.9 291.1 521.4 278.6L480 237.3L480 448C480 465.7 465.7 480 448 480C430.3 480 416 465.7 416 448V237.3L374.6 278.6C362.1 291.1 341.9 291.1 329.4 278.6C316.9 266.1 316.9 245.9 329.4 233.4H329.4z\"]\n};\nvar faAsterisk = {\n  prefix: 'fas',\n  iconName: 'asterisk',\n  icon: [448, 512, [10033, 61545], \"2a\", \"M417.1 368c-5.937 10.27-16.69 16-27.75 16c-5.422 0-10.92-1.375-15.97-4.281L256 311.4V448c0 17.67-14.33 32-31.1 32S192 465.7 192 448V311.4l-118.3 68.29C68.67 382.6 63.17 384 57.75 384c-11.06 0-21.81-5.734-27.75-16c-8.828-15.31-3.594-34.88 11.72-43.72L159.1 256L41.72 187.7C26.41 178.9 21.17 159.3 29.1 144C36.63 132.5 49.26 126.7 61.65 128.2C65.78 128.7 69.88 130.1 73.72 132.3L192 200.6V64c0-17.67 14.33-32 32-32S256 46.33 256 64v136.6l118.3-68.29c3.838-2.213 7.939-3.539 12.07-4.051C398.7 126.7 411.4 132.5 417.1 144c8.828 15.31 3.594 34.88-11.72 43.72L288 256l118.3 68.28C421.6 333.1 426.8 352.7 417.1 368z\"]\n};\nvar faAt = {\n  prefix: 'fas',\n  iconName: 'at',\n  icon: [512, 512, [61946], \"40\", \"M207.8 20.73c-93.45 18.32-168.7 93.66-187 187.1c-27.64 140.9 68.65 266.2 199.1 285.1c19.01 2.888 36.17-12.26 36.17-31.49l.0001-.6631c0-15.74-11.44-28.88-26.84-31.24c-84.35-12.98-149.2-86.13-149.2-174.2c0-102.9 88.61-185.5 193.4-175.4c91.54 8.869 158.6 91.25 158.6 183.2l0 16.16c0 22.09-17.94 40.05-40 40.05s-40.01-17.96-40.01-40.05v-120.1c0-8.847-7.161-16.02-16.01-16.02l-31.98 .0036c-7.299 0-13.2 4.992-15.12 11.68c-24.85-12.15-54.24-16.38-86.06-5.106c-38.75 13.73-68.12 48.91-73.72 89.64c-9.483 69.01 43.81 128 110.9 128c26.44 0 50.43-9.544 69.59-24.88c24 31.3 65.23 48.69 109.4 37.49C465.2 369.3 496 324.1 495.1 277.2V256.3C495.1 107.1 361.2-9.332 207.8 20.73zM239.1 304.3c-26.47 0-48-21.56-48-48.05s21.53-48.05 48-48.05s48 21.56 48 48.05S266.5 304.3 239.1 304.3z\"]\n};\nvar faAtom = {\n  prefix: 'fas',\n  iconName: 'atom',\n  icon: [512, 512, [9883], \"f5d2\", \"M256 224C238.4 224 223.1 238.4 223.1 256S238.4 288 256 288c17.63 0 32-14.38 32-32S273.6 224 256 224zM470.2 128c-10.88-19.5-40.51-50.75-116.3-41.88C332.4 34.88 299.6 0 256 0S179.6 34.88 158.1 86.12C82.34 77.38 52.71 108.5 41.83 128c-16.38 29.38-14.91 73.12 25.23 128c-40.13 54.88-41.61 98.63-25.23 128c29.13 52.38 101.6 43.63 116.3 41.88C179.6 477.1 212.4 512 256 512s76.39-34.88 97.9-86.13C368.5 427.6 441 436.4 470.2 384c16.38-29.38 14.91-73.13-25.23-128C485.1 201.1 486.5 157.4 470.2 128zM95.34 352c-4.001-7.25-.1251-24.75 15-48.25c6.876 6.5 14.13 12.87 21.88 19.12c1.625 13.75 4.001 27.13 6.751 40.13C114.3 363.9 99.09 358.6 95.34 352zM132.2 189.1C124.5 195.4 117.2 201.8 110.3 208.2C95.22 184.8 91.34 167.2 95.34 160c3.376-6.125 16.38-11.5 37.88-11.5c1.75 0 3.876 .375 5.751 .375C136.1 162.2 133.8 175.6 132.2 189.1zM256 64c9.502 0 22.25 13.5 33.88 37.25C278.6 105 267.4 109.3 256 114.1C244.6 109.3 233.4 105 222.1 101.2C233.7 77.5 246.5 64 256 64zM256 448c-9.502 0-22.25-13.5-33.88-37.25C233.4 407 244.6 402.7 256 397.9c11.38 4.875 22.63 9.135 33.88 12.89C278.3 434.5 265.5 448 256 448zM256 336c-44.13 0-80.02-35.88-80.02-80S211.9 176 256 176s80.02 35.88 80.02 80S300.1 336 256 336zM416.7 352c-3.626 6.625-19 11.88-43.63 11c2.751-12.1 5.126-26.38 6.751-40.13c7.752-6.25 15-12.63 21.88-19.12C416.8 327.2 420.7 344.8 416.7 352zM401.7 208.2c-6.876-6.5-14.13-12.87-21.88-19.12c-1.625-13.5-3.876-26.88-6.751-40.25c1.875 0 4.001-.375 5.751-.375c21.5 0 34.51 5.375 37.88 11.5C420.7 167.2 416.8 184.8 401.7 208.2z\"]\n};\nvar faAudioDescription = {\n  prefix: 'fas',\n  iconName: 'audio-description',\n  icon: [576, 512, [], \"f29e\", \"M170.8 280H213.2L192 237.7L170.8 280zM512 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h448c35.35 0 64-28.65 64-64V96C576 60.65 547.3 32 512 32zM274.7 349.5C271.3 351.2 267.6 352 264 352c-8.812 0-17.28-4.859-21.5-13.27L233.2 320H150.8l-9.367 18.73c-5.906 11.86-20.31 16.7-32.19 10.73c-11.88-5.938-16.69-20.34-10.75-32.2l72-144c8.125-16.25 34.81-16.25 42.94 0l72 144C291.4 329.1 286.6 343.5 274.7 349.5zM384 352h-56c-13.25 0-24-10.75-24-24v-144C304 170.8 314.8 160 328 160H384c52.94 0 96 43.06 96 96S436.9 352 384 352zM384 208h-32v96h32c26.47 0 48-21.53 48-48S410.5 208 384 208z\"]\n};\nvar faAustralSign = {\n  prefix: 'fas',\n  iconName: 'austral-sign',\n  icon: [448, 512, [], \"e0a9\", \"M325.3 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H352L365.3 320H416C433.7 320 448 334.3 448 352C448 369.7 433.7 384 416 384H392L413.5 435.7C420.3 452 412.6 470.7 396.3 477.5C379.1 484.3 361.3 476.6 354.5 460.3L322.7 384H125.3L93.54 460.3C86.74 476.6 68.01 484.3 51.69 477.5C35.38 470.7 27.66 452 34.46 435.7L56 384H32C14.33 384 0 369.7 0 352C0 334.3 14.33 320 32 320H82.67L96 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H122.7L194.5 51.69C199.4 39.77 211.1 32 224 32C236.9 32 248.6 39.77 253.5 51.69L325.3 224zM256 224L223.1 147.2L191.1 224H256zM165.3 288L151.1 320H296L282.7 288H165.3z\"]\n};\nvar faAward = {\n  prefix: 'fas',\n  iconName: 'award',\n  icon: [384, 512, [], \"f559\", \"M288 358.3c13.98-8.088 17.53-30.04 28.88-41.39c11.35-11.35 33.3-14.88 41.39-28.87c7.98-13.79 .1658-34.54 4.373-50.29C366.7 222.5 383.1 208.5 383.1 192c0-16.5-17.27-30.52-21.34-45.73c-4.207-15.75 3.612-36.5-4.365-50.29c-8.086-13.98-30.03-17.52-41.38-28.87c-11.35-11.35-14.89-33.3-28.87-41.39c-13.79-7.979-34.54-.1637-50.29-4.375C222.5 17.27 208.5 0 192 0C175.5 0 161.5 17.27 146.3 21.34C130.5 25.54 109.8 17.73 95.98 25.7C82 33.79 78.46 55.74 67.11 67.08C55.77 78.43 33.81 81.97 25.72 95.95C17.74 109.7 25.56 130.5 21.35 146.2C17.27 161.5 .0008 175.5 .0008 192c0 16.5 17.27 30.52 21.34 45.73c4.207 15.75-3.615 36.5 4.361 50.29C33.8 302 55.74 305.5 67.08 316.9c11.35 11.35 14.89 33.3 28.88 41.4c13.79 7.979 34.53 .1582 50.28 4.369C161.5 366.7 175.5 384 192 384c16.5 0 30.52-17.27 45.74-21.34C253.5 358.5 274.2 366.3 288 358.3zM112 192c0-44.27 35.81-80 80-80s80 35.73 80 80c0 44.17-35.81 80-80 80S112 236.2 112 192zM1.719 433.2c-3.25 8.188-1.781 17.48 3.875 24.25c5.656 6.75 14.53 9.898 23.12 8.148l45.19-9.035l21.43 42.27C99.46 507 107.6 512 116.7 512c.3438 0 .6641-.0117 1.008-.0273c9.5-.375 17.65-6.082 21.24-14.88l33.58-82.08c-53.71-4.639-102-28.12-138.2-63.95L1.719 433.2zM349.6 351.1c-36.15 35.83-84.45 59.31-138.2 63.95l33.58 82.08c3.594 8.797 11.74 14.5 21.24 14.88C266.6 511.1 266.1 512 267.3 512c9.094 0 17.23-4.973 21.35-13.14l21.43-42.28l45.19 9.035c8.594 1.75 17.47-1.398 23.12-8.148c5.656-6.766 7.125-16.06 3.875-24.25L349.6 351.1z\"]\n};\nvar faB = {\n  prefix: 'fas',\n  iconName: 'b',\n  icon: [320, 512, [98], \"42\", \"M257.1 242.4C276.1 220.1 288 191.6 288 160c0-70.58-57.42-128-128-128H32c-17.67 0-32 14.33-32 32v384c0 17.67 14.33 32 32 32l160-.0049c70.58 0 128-57.42 128-128C320 305.3 294.6 264.8 257.1 242.4zM64 96.01h96c35.3 0 64 28.7 64 64s-28.7 64-64 64H64V96.01zM192 416H64v-128h128c35.3 0 64 28.7 64 64S227.3 416 192 416z\"]\n};\nvar faBaby = {\n  prefix: 'fas',\n  iconName: 'baby',\n  icon: [448, 512, [], \"f77c\", \"M156.8 411.8l31.22-31.22l-60.04-53.09l-52.29 52.28C61.63 393.8 60.07 416.1 72 432l48 64C127.9 506.5 139.9 512 152 512c8.345 0 16.78-2.609 23.97-8c17.69-13.25 21.25-38.33 8-56L156.8 411.8zM224 159.1c44.25 0 79.99-35.75 79.99-79.1S268.3 0 224 0S144 35.75 144 79.1S179.8 159.1 224 159.1zM408.7 145c-12.75-18.12-37.63-22.38-55.76-9.75l-40.63 28.5c-52.63 37-124.1 37-176.8 0l-40.63-28.5C76.84 122.6 51.97 127 39.22 145C26.59 163.1 30.97 188 48.97 200.8l40.63 28.5C101.7 237.7 114.7 244.3 128 250.2L128 288h192l.0002-37.71c13.25-5.867 26.22-12.48 38.34-21.04l40.63-28.5C417.1 188 421.4 163.1 408.7 145zM320 327.4l-60.04 53.09l31.22 31.22L264 448c-13.25 17.67-9.689 42.75 8 56C279.2 509.4 287.6 512 295.1 512c12.16 0 24.19-5.516 32.03-16l48-64c11.94-15.92 10.38-38.2-3.719-52.28L320 327.4z\"]\n};\nvar faBabyCarriage = {\n  prefix: 'fas',\n  iconName: 'baby-carriage',\n  icon: [512, 512, [\"carriage-baby\"], \"f77d\", \"M255.1 192H.1398C2.741 117.9 41.34 52.95 98.98 14.1C112.2 5.175 129.8 9.784 138.9 22.92L255.1 192zM384 160C384 124.7 412.7 96 448 96H480C497.7 96 512 110.3 512 128C512 145.7 497.7 160 480 160H448V224C448 249.2 442.2 274.2 430.9 297.5C419.7 320.8 403.2 341.9 382.4 359.8C361.6 377.6 336.9 391.7 309.7 401.4C282.5 411 253.4 416 223.1 416C194.6 416 165.5 411 138.3 401.4C111.1 391.7 86.41 377.6 65.61 359.8C44.81 341.9 28.31 320.8 17.05 297.5C5.794 274.2 0 249.2 0 224H384L384 160zM31.1 464C31.1 437.5 53.49 416 79.1 416C106.5 416 127.1 437.5 127.1 464C127.1 490.5 106.5 512 79.1 512C53.49 512 31.1 490.5 31.1 464zM416 464C416 490.5 394.5 512 368 512C341.5 512 320 490.5 320 464C320 437.5 341.5 416 368 416C394.5 416 416 437.5 416 464z\"]\n};\nvar faCarriageBaby = faBabyCarriage;\nvar faBackward = {\n  prefix: 'fas',\n  iconName: 'backward',\n  icon: [512, 512, [9194], \"f04a\", \"M459.5 71.41l-171.5 142.9v83.45l171.5 142.9C480.1 457.7 512 443.3 512 415.1V96.03C512 68.66 480.1 54.28 459.5 71.41zM203.5 71.41L11.44 231.4c-15.25 12.87-15.25 36.37 0 49.24l192 159.1c20.63 17.12 52.51 2.749 52.51-24.62v-319.9C255.1 68.66 224.1 54.28 203.5 71.41z\"]\n};\nvar faBackwardFast = {\n  prefix: 'fas',\n  iconName: 'backward-fast',\n  icon: [512, 512, [9198, \"fast-backward\"], \"f049\", \"M0 415.1V96.03c0-17.67 14.33-31.1 31.1-31.1C49.67 64.03 64 78.36 64 96.03v131.8l171.5-156.5C256.1 54.28 288 68.66 288 96.03v131.9l171.5-156.5C480.1 54.28 512 68.66 512 96.03v319.9c0 27.37-31.88 41.74-52.5 24.62L288 285.2v130.7c0 27.37-31.88 41.74-52.5 24.62L64 285.2v130.7c0 17.67-14.33 31.1-31.1 31.1C14.33 447.1 0 433.6 0 415.1z\"]\n};\nvar faFastBackward = faBackwardFast;\nvar faBackwardStep = {\n  prefix: 'fas',\n  iconName: 'backward-step',\n  icon: [320, 512, [\"step-backward\"], \"f048\", \"M31.1 64.03c-17.67 0-31.1 14.33-31.1 32v319.9c0 17.67 14.33 32 32 32C49.67 447.1 64 433.6 64 415.1V96.03C64 78.36 49.67 64.03 31.1 64.03zM267.5 71.41l-192 159.1C67.82 237.8 64 246.9 64 256c0 9.094 3.82 18.18 11.44 24.62l192 159.1c20.63 17.12 52.51 2.75 52.51-24.62v-319.9C319.1 68.66 288.1 54.28 267.5 71.41z\"]\n};\nvar faStepBackward = faBackwardStep;\nvar faBacon = {\n  prefix: 'fas',\n  iconName: 'bacon',\n  icon: [576, 512, [129363], \"f7e5\", \"M29.34 432.5l-18.06-20.15c-9.406-10.47-13.25-25.3-10.31-39.65c2.813-13.71 11.23-24.74 23.09-30.23l68.88-31.94c47.95-22.25 87.64-60.2 114.8-109.8l20.66-37.76c28.77-52.59 70.98-92.93 122.1-116.6l92.75-42.99c14.84-6.812 32.41-3.078 43.69 9.518l34.08 38.01l-104.8 48.56c-55.72 25.83-101.7 69.73-133 127L261.3 266.5c-28.03 51.22-69 90.42-118.5 113.4L29.34 432.5zM564.7 99.68l-21.4-23.87l-113.6 52.68c-49.47 22.94-90.44 62.11-118.5 113.3L289.3 281.9c-31.33 57.27-77.34 101.2-133.1 127l-104.5 48.43l37.43 41.74C96.64 507.5 106.1 512 117.5 512c5.188 0 10.41-1.11 15.33-3.375l92.75-42.99c51.13-23.69 93.34-64.03 122.1-116.6l20.66-37.76c27.11-49.56 66.8-87.5 114.8-109.8l68.88-31.94c11.86-5.486 20.28-16.52 23.09-30.23C577.1 124.1 574.1 110.1 564.7 99.68z\"]\n};\nvar faBacteria = {\n  prefix: 'fas',\n  iconName: 'bacteria',\n  icon: [640, 512, [], \"e059\", \"M627.3 227.3c9.439-2.781 14.81-12.65 12-22.04c-3.039-10.21-13.57-14.52-22.14-11.95l-11.27 3.33c-8.086-15.15-20.68-27.55-36.4-35.43l2.888-11.06c1.867-7.158-1.9-22.19-17.26-22.19c-7.92 0-15.14 5.288-17.23 13.28l-2.865 10.97c-7.701-.2793-26.9-.6485-48.75 13.63L477.6 157.1c-3.777-3.873-15.44-9.779-25.19-.3691c-7.062 6.822-7.225 18.04-.3711 25.07l9.14 9.373c-11.96 18.85-10.27 28.38-15.88 46.61c-8.023-3.758-11.44-5.943-16.66-5.943c-6.689 0-13.09 3.763-16.13 10.19c-4.188 8.856-.3599 19.42 8.546 23.58l8.797 4.115c-14.91 22.05-34.42 33.57-34.83 33.83l-3.922-8.855C387.2 285.8 376.7 281.7 367.7 285.6c-9 3.959-13.08 14.42-9.115 23.39l4.041 9.127c-16.38 4.559-27.93 4.345-46.15 16.94l-9.996-9.012c-6.969-6.303-18.28-6.33-25.15 1.235c-6.609 7.26-6.053 18.47 1.24 25.04l9.713 8.756c-8.49 14.18-12.74 30.77-11.64 48.17l-11.86 3.512c-9.428 2.793-14.8 12.66-11.99 22.05c2.781 9.385 12.69 14.71 22.15 11.94l11.34-3.359c8.287 15.49 20.99 27.86 36.38 35.57l-2.839 10.85c-2.482 9.477 3.224 19.16 12.75 21.62c9.566 2.482 19.25-3.221 21.72-12.69l2.82-10.78c5.508 .1875 11.11-.1523 16.75-1.102c11.37-1.893 22.23-5.074 33.1-8.24l3.379 9.455c3.305 9.225 13.5 14.11 22.75 10.76c9.266-3.279 14.1-13.41 10.81-22.65l-3.498-9.792c15.41-6.654 30.08-14.46 43.95-23.57l6.321 8.429c5.891 7.84 17.05 9.443 24.93 3.602c7.885-5.863 9.498-16.97 3.617-24.82l-6.457-8.611c12.66-10.78 24.33-22.54 34.96-35.33l8.816 6.413c7.932 5.795 19.07 4.074 24.89-3.855c5.809-7.908 4.072-18.1-3.874-24.77l-8.885-6.465c8.893-13.88 16.54-28.52 22.99-43.91l10.47 3.59c9.334 3.186 19.43-1.719 22.64-10.99c3.211-9.258-1.739-19.35-11.04-22.53l-10.33-3.541c5.744-20.5 9.424-31.81 8.338-49.26L627.3 227.3zM416 416c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32c17.67 0 32 14.33 32 32C448 401.7 433.7 416 416 416zM272.3 226.4c9-3.959 13.08-14.42 9.115-23.39L277.4 193.9c16.38-4.561 27.93-4.345 46.15-16.94l9.996 9.012c6.969 6.301 18.28 6.326 25.15-1.236c6.609-7.26 6.053-18.47-1.24-25.04l-9.713-8.756c8.49-14.18 12.74-30.77 11.64-48.18l11.86-3.511c9.428-2.793 14.8-12.66 11.99-22.05c-2.781-9.385-12.69-14.71-22.15-11.94l-11.34 3.357C341.5 53.13 328.8 40.76 313.4 33.05l2.838-10.85C318.7 12.73 313 3.04 303.5 .5811c-9.566-2.482-19.25 3.222-21.72 12.69l-2.82 10.78C273.4 23.86 267.8 24.2 262.2 25.15C250.8 27.04 239.1 30.22 229.1 33.39L225.7 23.93C222.4 14.71 212.2 9.827 202.1 13.17C193.7 16.45 188.9 26.59 192.2 35.82l3.498 9.793C180.2 52.27 165.6 60.07 151.7 69.19L145.4 60.76C139.5 52.92 128.3 51.32 120.5 57.16C112.6 63.02 110.1 74.13 116.8 81.98l6.457 8.611C110.6 101.4 98.96 113.1 88.34 125.9L79.52 119.5c-7.932-5.795-19.08-4.074-24.89 3.855c-5.809 7.908-4.07 19 3.875 24.77l8.885 6.465C58.5 168.5 50.86 183.1 44.41 198.5L33.93 194.9c-9.334-3.186-19.44 1.721-22.64 10.99C8.086 215.2 13.04 225.3 22.34 228.4l10.33 3.541C26.93 252.5 23.25 263.8 24.33 281.2L12.75 284.7C3.309 287.4-2.061 297.3 .7441 306.7c3.041 10.21 13.57 14.52 22.14 11.95l11.27-3.33c8.086 15.15 20.68 27.55 36.39 35.43l-2.887 11.06c-1.865 7.156 1.902 22.19 17.26 22.19c7.92 0 15.14-5.287 17.23-13.28l2.863-10.97c7.701 .2773 26.9 .6465 48.76-13.63l8.59 8.809c3.777 3.873 15.44 9.779 25.19 .3691c7.062-6.822 7.225-18.04 .3711-25.07l-9.14-9.373c11.96-18.85 10.27-28.38 15.88-46.61c8.025 3.756 11.44 5.943 16.66 5.943c6.689 0 13.09-3.762 16.13-10.19C231.6 261.1 227.8 250.6 218.9 246.4L210.1 242.3C225 220.2 244.5 208.7 244.9 208.5l3.922 8.856C252.8 226.2 263.3 230.3 272.3 226.4zM128 256C110.3 256 96 241.7 96 223.1c0-17.67 14.33-32 32-32c17.67 0 32 14.33 32 32C160 241.7 145.7 256 128 256zM208 160c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16s16 7.162 16 16C224 152.8 216.8 160 208 160z\"]\n};\nvar faBacterium = {\n  prefix: 'fas',\n  iconName: 'bacterium',\n  icon: [576, 512, [], \"e05a\", \"M543 102.9c-3.711-12.51-16.92-19.61-29.53-15.92l-15.12 4.48c-11.05-20.65-27.98-37.14-48.5-47.43l3.783-14.46c3.309-12.64-4.299-25.55-16.99-28.83c-12.76-3.309-25.67 4.295-28.96 16.92l-3.76 14.37c-9.947-.3398-26.22 .1016-66.67 11.88l-4.301-12.03c-4.406-12.3-17.1-18.81-30.34-14.34c-12.35 4.371-18.8 17.88-14.41 30.2l4.303 12.04c-20.6 8.889-40.16 19.64-58.69 31.83L225.9 81.01C217.1 70.56 203.1 68.42 192.6 76.21C182.1 84.03 179.9 98.83 187.8 109.3l7.975 10.63C178.8 134.3 163.3 150.3 149.1 167.4L138 159.3C127.5 151.6 112.6 153.9 104.8 164.5c-7.748 10.54-5.428 25.33 5.164 33.03l11.09 8.066C109.2 224.1 98.79 243.7 90.18 264.3l-12.93-4.431c-12.45-4.248-25.92 2.293-30.18 14.65C42.78 286.9 49.38 300.3 61.78 304.6l13.05 4.474c-11.86 42.33-11.02 55.76-10.39 65.93l-15.45 4.566c-12.59 3.709-19.74 16.87-16 29.38c4.053 13.61 18.1 19.36 29.52 15.93l15.02-4.441c10.78 20.21 27.57 36.73 48.53 47.24l-3.852 14.75C119.7 491.1 124.8 512 145.2 512c10.56 0 20.19-7.049 22.98-17.7l3.816-14.63c10.2 .377 35.85 .873 65.01-18.17l11.45 11.74c5.037 5.164 20.59 13.04 33.58 .4922c9.416-9.096 9.633-24.06 .4941-33.43l-12.19-12.5c7.805-12.29 13.56-26.13 16.11-41.4c1.186-7.107 3.082-13.95 5.158-20.7c10.66 4.988 15.16 7.881 22.12 7.881c8.922 0 17.46-5.018 21.51-13.59c5.582-11.8 .4785-25.89-11.4-31.45l-11.73-5.486c20.09-29.62 45.89-44.76 46.44-45.11l5.23 11.81c5.273 11.86 19.19 17.36 31.33 12.1c11.1-5.279 17.44-19.22 12.15-31.18L401.9 258.5c5.438-1.512 10.86-3.078 16.52-4.021c16.8-2.797 31.88-9.459 45.02-18.54l13.33 12.02c9.289 8.395 24.37 8.439 33.54-1.648c8.814-9.68 8.072-24.62-1.654-33.38l-12.95-11.68c11.32-18.9 16.99-41.02 15.52-64.23l15.81-4.681C539.6 128.6 546.7 115.4 543 102.9zM192 368c-26.51 0-48.01-21.49-48.01-48s21.5-48 48.01-48S240.1 293.5 240.1 320S218.6 368 192 368zM272 232c-13.25 0-23.92-10.75-23.92-24c0-13.26 10.67-23.1 23.92-23.1c13.26 0 23.1 10.74 23.1 23.1C295.1 221.3 285.3 232 272 232z\"]\n};\nvar faBagShopping = {\n  prefix: 'fas',\n  iconName: 'bag-shopping',\n  icon: [448, 512, [\"shopping-bag\"], \"f290\", \"M112 112C112 50.14 162.1 0 224 0C285.9 0 336 50.14 336 112V160H400C426.5 160 448 181.5 448 208V416C448 469 405 512 352 512H96C42.98 512 0 469 0 416V208C0 181.5 21.49 160 48 160H112V112zM160 160H288V112C288 76.65 259.3 48 224 48C188.7 48 160 76.65 160 112V160zM136 256C149.3 256 160 245.3 160 232C160 218.7 149.3 208 136 208C122.7 208 112 218.7 112 232C112 245.3 122.7 256 136 256zM312 208C298.7 208 288 218.7 288 232C288 245.3 298.7 256 312 256C325.3 256 336 245.3 336 232C336 218.7 325.3 208 312 208z\"]\n};\nvar faShoppingBag = faBagShopping;\nvar faBahai = {\n  prefix: 'fas',\n  iconName: 'bahai',\n  icon: [512, 512, [], \"f666\", \"M496.3 202.5l-110-15.38l41.88-104.4c6.625-16.63-11.63-32.25-26.63-22.63L307.5 120l-34.13-107.1C270.6 4.25 263.4 0 255.1 0C248.6 0 241.4 4.25 238.6 12.88L204.5 120L110.5 60.12c-15-9.5-33.22 5.1-26.6 22.63l41.85 104.4L15.71 202.5C-1.789 205-5.915 228.8 9.71 237.2l98.14 52.63l-74.51 83.5c-10.88 12.25-1.78 31 13.35 31c1.25 0 2.657-.25 4.032-.5l108.6-23.63l-4.126 112.5C154.7 504.4 164.1 512 173.6 512c5.125 0 10.38-2.25 14.25-7.25l68.13-88.88l68.23 88.88C327.1 509.8 333.2 512 338.4 512c9.5 0 18.88-7.625 18.38-19.25l-4.032-112.5l108.5 23.63c17.38 3.75 29.25-17.25 17.38-30.5l-74.51-83.5l98.14-52.72C517.9 228.8 513.8 205 496.3 202.5zM338.5 311.6L286.6 300.4l2 53.75l-32.63-42.5l-32.63 42.5l2-53.75L173.5 311.6l35.63-39.87L162.1 246.6L214.7 239.2L194.7 189.4l45 28.63L255.1 166.8l16.25 51.25l45-28.63L297.2 239.2l52.63 7.375l-47 25.13L338.5 311.6z\"]\n};\nvar faBahtSign = {\n  prefix: 'fas',\n  iconName: 'baht-sign',\n  icon: [320, 512, [], \"e0ac\", \"M176 32V64C237.9 64 288 114.1 288 176C288 200.2 280.3 222.6 267.3 240.9C298.9 260.7 320 295.9 320 336C320 397.9 269.9 448 208 448H176V480C176 497.7 161.7 512 144 512C126.3 512 112 497.7 112 480V448H41.74C18.69 448 0 429.3 0 406.3V101.6C0 80.82 16.82 64 37.57 64H112V32C112 14.33 126.3 0 144 0C161.7 0 176 14.33 176 32V32zM112 128H64V224H112V128zM224 176C224 149.5 202.5 128 176 128V224C202.5 224 224 202.5 224 176zM112 288H64V384H112V288zM208 384C234.5 384 256 362.5 256 336C256 309.5 234.5 288 208 288H176V384H208z\"]\n};\nvar faBan = {\n  prefix: 'fas',\n  iconName: 'ban',\n  icon: [512, 512, [128683, \"cancel\"], \"f05e\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM99.5 144.8C77.15 176.1 64 214.5 64 256C64 362 149.1 448 256 448C297.5 448 335.9 434.9 367.2 412.5L99.5 144.8zM448 256C448 149.1 362 64 256 64C214.5 64 176.1 77.15 144.8 99.5L412.5 367.2C434.9 335.9 448 297.5 448 256V256z\"]\n};\nvar faCancel = faBan;\nvar faBanSmoking = {\n  prefix: 'fas',\n  iconName: 'ban-smoking',\n  icon: [512, 512, [128685, \"smoking-ban\"], \"f54d\", \"M96 304C96 312.8 103.3 320 112 320h117.5l-96-96H112C103.3 224 96 231.3 96 240V304zM256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 448c-105.9 0-192-86.13-192-192c0-41.38 13.25-79.75 35.75-111.1l267.4 267.4C335.8 434.8 297.4 448 256 448zM301.2 256H384v32h-50.81L301.2 256zM412.3 367.1L365.2 320H400c8.75 0 16-7.25 16-16v-64C416 231.3 408.8 224 400 224h-130.8L144.9 99.75C176.3 77.25 214.6 64 256 64C361.9 64 448 150.1 448 256C448 297.4 434.8 335.8 412.3 367.1zM320.6 128C305 128 292 116.8 289.3 102.1C288.5 98.5 285.3 96 281.5 96h-16.25c-5 0-8.625 4.5-8 9.375C261.9 136.3 288.5 160 320.6 160C336.3 160 349.3 171.3 352 185.9C352.8 189.5 356 192 359.8 192h16.17c5 0 8.708-4.5 7.958-9.375C379.3 151.7 352.8 128 320.6 128z\"]\n};\nvar faSmokingBan = faBanSmoking;\nvar faBandage = {\n  prefix: 'fas',\n  iconName: 'bandage',\n  icon: [640, 512, [129657, \"band-aid\"], \"f462\", \"M480 96H576C611.3 96 640 124.7 640 160V352C640 387.3 611.3 416 576 416H480V96zM448 416H192V96H448V416zM272 184C258.7 184 248 194.7 248 208C248 221.3 258.7 232 272 232C285.3 232 296 221.3 296 208C296 194.7 285.3 184 272 184zM368 232C381.3 232 392 221.3 392 208C392 194.7 381.3 184 368 184C354.7 184 344 194.7 344 208C344 221.3 354.7 232 368 232zM272 280C258.7 280 248 290.7 248 304C248 317.3 258.7 328 272 328C285.3 328 296 317.3 296 304C296 290.7 285.3 280 272 280zM368 328C381.3 328 392 317.3 392 304C392 290.7 381.3 280 368 280C354.7 280 344 290.7 344 304C344 317.3 354.7 328 368 328zM64 96H160V416H64C28.65 416 0 387.3 0 352V160C0 124.7 28.65 96 64 96z\"]\n};\nvar faBandAid = faBandage;\nvar faBarcode = {\n  prefix: 'fas',\n  iconName: 'barcode',\n  icon: [512, 512, [], \"f02a\", \"M40 32C53.25 32 64 42.75 64 56V456C64 469.3 53.25 480 40 480H24C10.75 480 0 469.3 0 456V56C0 42.75 10.75 32 24 32H40zM128 48V464C128 472.8 120.8 480 112 480C103.2 480 96 472.8 96 464V48C96 39.16 103.2 32 112 32C120.8 32 128 39.16 128 48zM200 32C213.3 32 224 42.75 224 56V456C224 469.3 213.3 480 200 480H184C170.7 480 160 469.3 160 456V56C160 42.75 170.7 32 184 32H200zM296 32C309.3 32 320 42.75 320 56V456C320 469.3 309.3 480 296 480H280C266.7 480 256 469.3 256 456V56C256 42.75 266.7 32 280 32H296zM448 56C448 42.75 458.7 32 472 32H488C501.3 32 512 42.75 512 56V456C512 469.3 501.3 480 488 480H472C458.7 480 448 469.3 448 456V56zM384 48C384 39.16 391.2 32 400 32C408.8 32 416 39.16 416 48V464C416 472.8 408.8 480 400 480C391.2 480 384 472.8 384 464V48z\"]\n};\nvar faBars = {\n  prefix: 'fas',\n  iconName: 'bars',\n  icon: [448, 512, [\"navicon\"], \"f0c9\", \"M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM0 256C0 238.3 14.33 224 32 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H32C14.33 288 0 273.7 0 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z\"]\n};\nvar faNavicon = faBars;\nvar faBarsProgress = {\n  prefix: 'fas',\n  iconName: 'bars-progress',\n  icon: [512, 512, [\"tasks-alt\"], \"f828\", \"M464 64C490.5 64 512 85.49 512 112V176C512 202.5 490.5 224 464 224H48C21.49 224 0 202.5 0 176V112C0 85.49 21.49 64 48 64H464zM448 128H320V160H448V128zM464 288C490.5 288 512 309.5 512 336V400C512 426.5 490.5 448 464 448H48C21.49 448 0 426.5 0 400V336C0 309.5 21.49 288 48 288H464zM192 352V384H448V352H192z\"]\n};\nvar faTasksAlt = faBarsProgress;\nvar faBarsStaggered = {\n  prefix: 'fas',\n  iconName: 'bars-staggered',\n  icon: [512, 512, [\"reorder\", \"stream\"], \"f550\", \"M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM64 256C64 238.3 78.33 224 96 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H96C78.33 288 64 273.7 64 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z\"]\n};\nvar faReorder = faBarsStaggered;\nvar faStream = faBarsStaggered;\nvar faBaseball = {\n  prefix: 'fas',\n  iconName: 'baseball',\n  icon: [512, 512, [129358, 9918, \"baseball-ball\"], \"f433\", \"M429.6 272.9c0-16.26 16.36-16.81 29.99-16.81l2.931 .0029c16.64 0 33.14 2.056 49.2 5.834C511.7 259.9 512 258 512 256c0-141.4-114.6-256-256-256C253.9 0 251.1 .2578 249.9 .3047c3.658 15.51 6.111 31.34 6.111 47.54c0 6-.2813 12.03-.7813 18C254.6 74.19 247.6 80.5 239.3 80.5c-6.091 0-16.03-4.68-16.03-15.97c0-1.733 .7149-7.153 .7149-16.69c0-15.26-2.389-30.18-6.225-44.69C106.9 19.79 19.5 107.3 3.08 218.3c14.44 3.819 29.38 5.79 44.45 5.79c10.07 0 15.59-.811 17.42-.811c6.229 0 16.49 4.657 16.49 15.99c0 16.11-16.13 16.77-29.73 16.77L48.16 256c-16.33 0-32.25-2.445-47.85-6.109C.2578 251.1 0 253.9 0 256c0 141.4 114.6 256 256 256c2.066 0 4.062-.2578 6.117-.3086C258.5 496.2 256 480.4 256 464.2c0-5.688 .25-11.38 .7187-17.03c.6964-8.538 8.287-14.61 16.49-14.61c7.1 0 15.44 6.938 15.44 15.92c0 2.358-.6524 5.88-.6524 15.72c0 15.25 2.383 30.16 6.209 44.66c110.8-16.63 198.2-104.1 214.7-215c-14.55-3.851-29.59-5.871-44.74-5.871c-10.47 0-16.24 .895-18.13 .895C443.3 288.9 429.6 286.5 429.6 272.9zM238.2 128.9c0 27.78-78.3 108.1-108.6 108.1c-8.612 0-16.01-6.963-16.01-15.98c0-6.002 3.394-11.75 9.163-14.49c80.3-38.08 76.21-94.5 99.39-94.5C234.7 112.8 238.2 124.2 238.2 128.9zM397.5 290.6c0 5.965-3.364 11.68-9.131 14.43c-78.82 37.57-75.92 95-98.94 95c-12.58 0-16.01-11.54-16.01-16.03c0-28 78.29-109.4 108.1-109.4C390.8 274.6 397.5 282.3 397.5 290.6z\"]\n};\nvar faBaseballBall = faBaseball;\nvar faBaseballBatBall = {\n  prefix: 'fas',\n  iconName: 'baseball-bat-ball',\n  icon: [640, 512, [], \"f432\", \"M57.89 397.2c-6.262-8.616-16.02-13.19-25.92-13.19c-23.33 0-31.98 20.68-31.98 32.03c0 6.522 1.987 13.1 6.115 18.78l46.52 64C58.89 507.4 68.64 512 78.55 512c23.29 0 31.97-20.66 31.97-32.03c0-6.522-1.988-13.1-6.115-18.78L57.89 397.2zM496.1 352c-44.13 0-79.72 35.75-79.72 80s35.59 80 79.72 80s79.91-35.75 79.91-80S540.2 352 496.1 352zM640 99.38c0-13.61-4.133-27.34-12.72-39.2l-23.63-32.5c-13.44-18.5-33.77-27.68-54.12-27.68c-13.89 0-27.79 4.281-39.51 12.8L307.8 159.7C262.2 192.8 220.4 230.9 183.4 273.4c-24.22 27.88-59.18 63.99-103.5 99.63l56.34 77.52c53.79-35.39 99.15-55.3 127.1-67.27c51.88-22 101.3-49.87 146.9-82.1l202.3-146.7C630.5 140.4 640 120 640 99.38z\"]\n};\nvar faBasketShopping = {\n  prefix: 'fas',\n  iconName: 'basket-shopping',\n  icon: [576, 512, [\"shopping-basket\"], \"f291\", \"M171.7 191.1H404.3L322.7 35.07C316.6 23.31 321.2 8.821 332.9 2.706C344.7-3.409 359.2 1.167 365.3 12.93L458.4 191.1H544C561.7 191.1 576 206.3 576 223.1C576 241.7 561.7 255.1 544 255.1L492.1 463.5C484.1 492 459.4 512 430 512H145.1C116.6 512 91 492 83.88 463.5L32 255.1C14.33 255.1 0 241.7 0 223.1C0 206.3 14.33 191.1 32 191.1H117.6L210.7 12.93C216.8 1.167 231.3-3.409 243.1 2.706C254.8 8.821 259.4 23.31 253.3 35.07L171.7 191.1zM191.1 303.1C191.1 295.1 184.8 287.1 175.1 287.1C167.2 287.1 159.1 295.1 159.1 303.1V399.1C159.1 408.8 167.2 415.1 175.1 415.1C184.8 415.1 191.1 408.8 191.1 399.1V303.1zM271.1 303.1V399.1C271.1 408.8 279.2 415.1 287.1 415.1C296.8 415.1 304 408.8 304 399.1V303.1C304 295.1 296.8 287.1 287.1 287.1C279.2 287.1 271.1 295.1 271.1 303.1zM416 303.1C416 295.1 408.8 287.1 400 287.1C391.2 287.1 384 295.1 384 303.1V399.1C384 408.8 391.2 415.1 400 415.1C408.8 415.1 416 408.8 416 399.1V303.1z\"]\n};\nvar faShoppingBasket = faBasketShopping;\nvar faBasketball = {\n  prefix: 'fas',\n  iconName: 'basketball',\n  icon: [512, 512, [127936, \"basketball-ball\"], \"f434\", \"M148.7 171.3L64.21 86.83c-28.39 32.16-48.9 71.38-58.3 114.8C19.41 205.4 33.34 208 48 208C86.34 208 121.1 193.9 148.7 171.3zM194.5 171.9L256 233.4l169.2-169.2C380 24.37 320.9 0 256 0C248.6 0 241.2 .4922 233.1 1.113C237.8 16.15 240 31.8 240 48C240 95.19 222.8 138.4 194.5 171.9zM208 48c0-14.66-2.623-28.59-6.334-42.09C158.2 15.31 118.1 35.82 86.83 64.21l84.48 84.48C193.9 121.1 208 86.34 208 48zM171.9 194.5C138.4 222.8 95.19 240 48 240c-16.2 0-31.85-2.236-46.89-6.031C.4922 241.2 0 248.6 0 256c0 64.93 24.37 124 64.21 169.2L233.4 256L171.9 194.5zM317.5 340.1L256 278.6l-169.2 169.2C131.1 487.6 191.1 512 256 512c7.438 0 14.75-.4922 22.03-1.113C274.2 495.8 272 480.2 272 464C272 416.8 289.2 373.6 317.5 340.1zM363.3 340.7l84.48 84.48c28.39-32.16 48.9-71.38 58.3-114.8C492.6 306.6 478.7 304 464 304C425.7 304 390.9 318.1 363.3 340.7zM447.8 86.83L278.6 256l61.52 61.52C373.6 289.2 416.8 272 464 272c16.2 0 31.85 2.236 46.89 6.031C511.5 270.8 512 263.4 512 256C512 191.1 487.6 131.1 447.8 86.83zM304 464c0 14.66 2.623 28.59 6.334 42.09c43.46-9.4 82.67-29.91 114.8-58.3l-84.48-84.48C318.1 390.9 304 425.7 304 464z\"]\n};\nvar faBasketballBall = faBasketball;\nvar faBath = {\n  prefix: 'fas',\n  iconName: 'bath',\n  icon: [512, 512, [128705, \"bathtub\"], \"f2cd\", \"M32 384c0 28.32 12.49 53.52 32 71.09V496C64 504.8 71.16 512 80 512h32C120.8 512 128 504.8 128 496v-15.1h256V496c0 8.836 7.164 16 16 16h32c8.836 0 16-7.164 16-16v-40.9c19.51-17.57 32-42.77 32-71.09V352H32V384zM496 256H96V77.25C95.97 66.45 111 60.23 118.6 67.88L132.4 81.66C123.6 108.6 129.4 134.5 144.2 153.2C137.9 159.5 137.8 169.8 144 176l11.31 11.31c6.248 6.248 16.38 6.248 22.63 0l105.4-105.4c6.248-6.248 6.248-16.38 0-22.63l-11.31-11.31c-6.248-6.248-16.38-6.248-22.63 0C230.7 33.26 204.7 27.55 177.7 36.41L163.9 22.64C149.5 8.25 129.6 0 109.3 0C66.66 0 32 34.66 32 77.25v178.8L16 256C7.164 256 0 263.2 0 272v32C0 312.8 7.164 320 16 320h480c8.836 0 16-7.164 16-16v-32C512 263.2 504.8 256 496 256z\"]\n};\nvar faBathtub = faBath;\nvar faBatteryEmpty = {\n  prefix: 'fas',\n  iconName: 'battery-empty',\n  icon: [576, 512, [\"battery-0\"], \"f244\", \"M464 96C508.2 96 544 131.8 544 176V192C561.7 192 576 206.3 576 224V288C576 305.7 561.7 320 544 320V336C544 380.2 508.2 416 464 416H80C35.82 416 0 380.2 0 336V176C0 131.8 35.82 96 80 96H464zM64 336C64 344.8 71.16 352 80 352H464C472.8 352 480 344.8 480 336V176C480 167.2 472.8 160 464 160H80C71.16 160 64 167.2 64 176V336z\"]\n};\nvar faBattery0 = faBatteryEmpty;\nvar faBatteryFull = {\n  prefix: 'fas',\n  iconName: 'battery-full',\n  icon: [576, 512, [128267, \"battery\", \"battery-5\"], \"f240\", \"M448 320H96V192H448V320zM0 176C0 131.8 35.82 96 80 96H464C508.2 96 544 131.8 544 176V192C561.7 192 576 206.3 576 224V288C576 305.7 561.7 320 544 320V336C544 380.2 508.2 416 464 416H80C35.82 416 0 380.2 0 336V176zM80 160C71.16 160 64 167.2 64 176V336C64 344.8 71.16 352 80 352H464C472.8 352 480 344.8 480 336V176C480 167.2 472.8 160 464 160H80z\"]\n};\nvar faBattery = faBatteryFull;\nvar faBattery5 = faBatteryFull;\nvar faBatteryHalf = {\n  prefix: 'fas',\n  iconName: 'battery-half',\n  icon: [576, 512, [\"battery-3\"], \"f242\", \"M288 320H96V192H288V320zM0 176C0 131.8 35.82 96 80 96H464C508.2 96 544 131.8 544 176V192C561.7 192 576 206.3 576 224V288C576 305.7 561.7 320 544 320V336C544 380.2 508.2 416 464 416H80C35.82 416 0 380.2 0 336V176zM80 160C71.16 160 64 167.2 64 176V336C64 344.8 71.16 352 80 352H464C472.8 352 480 344.8 480 336V176C480 167.2 472.8 160 464 160H80z\"]\n};\nvar faBattery3 = faBatteryHalf;\nvar faBatteryQuarter = {\n  prefix: 'fas',\n  iconName: 'battery-quarter',\n  icon: [576, 512, [\"battery-2\"], \"f243\", \"M192 320H96V192H192V320zM0 176C0 131.8 35.82 96 80 96H464C508.2 96 544 131.8 544 176V192C561.7 192 576 206.3 576 224V288C576 305.7 561.7 320 544 320V336C544 380.2 508.2 416 464 416H80C35.82 416 0 380.2 0 336V176zM80 160C71.16 160 64 167.2 64 176V336C64 344.8 71.16 352 80 352H464C472.8 352 480 344.8 480 336V176C480 167.2 472.8 160 464 160H80z\"]\n};\nvar faBattery2 = faBatteryQuarter;\nvar faBatteryThreeQuarters = {\n  prefix: 'fas',\n  iconName: 'battery-three-quarters',\n  icon: [576, 512, [\"battery-4\"], \"f241\", \"M352 320H96V192H352V320zM0 176C0 131.8 35.82 96 80 96H464C508.2 96 544 131.8 544 176V192C561.7 192 576 206.3 576 224V288C576 305.7 561.7 320 544 320V336C544 380.2 508.2 416 464 416H80C35.82 416 0 380.2 0 336V176zM80 160C71.16 160 64 167.2 64 176V336C64 344.8 71.16 352 80 352H464C472.8 352 480 344.8 480 336V176C480 167.2 472.8 160 464 160H80z\"]\n};\nvar faBattery4 = faBatteryThreeQuarters;\nvar faBed = {\n  prefix: 'fas',\n  iconName: 'bed',\n  icon: [640, 512, [128716], \"f236\", \"M176 288C220.1 288 256 252.1 256 208S220.1 128 176 128S96 163.9 96 208S131.9 288 176 288zM544 128H304C295.2 128 288 135.2 288 144V320H64V48C64 39.16 56.84 32 48 32h-32C7.163 32 0 39.16 0 48v416C0 472.8 7.163 480 16 480h32C56.84 480 64 472.8 64 464V416h512v48c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16V224C640 170.1 597 128 544 128z\"]\n};\nvar faBedPulse = {\n  prefix: 'fas',\n  iconName: 'bed-pulse',\n  icon: [640, 512, [\"procedures\"], \"f487\", \"M96 318.3v1.689h1.689C97.12 319.4 96.56 318.9 96 318.3zM176 320c44.13 0 80-35.88 80-79.1s-35.88-79.1-80-79.1S96 195.9 96 240S131.9 320 176 320zM256 318.3C255.4 318.9 254.9 319.4 254.3 320H256V318.3zM544 160h-82.1L450.7 183.9C441.5 203.2 421.8 215.8 400 216c-21.23 0-40.97-12.31-50.3-31.35l-12.08-24.64H304c-8.836 0-16 7.161-16 15.1v175.1L64 352V80.01c0-8.834-7.164-15.1-16-15.1h-32c-8.836 0-16 7.163-16 15.1V496C0 504.8 7.164 512 16 512h32C56.84 512 64 504.8 64 496v-47.1h512V496c0 8.836 7.164 16 16 16h32c8.836 0 16-7.164 16-16V256C640 202.1 597 160 544 160zM624 48.01h-115.2l-24.88-37.31c-2.324-3.48-5.539-6.131-9.158-7.977c-1.172-.6016-2.486-.5508-3.738-.9512C468.8 1.035 466.5 0 464.1 0c-.625 0-1.25 .0254-1.875 .0781c-8.625 .6406-16.25 5.876-19.94 13.7l-42.72 90.81l-21.12-43.12c-4.027-8.223-12.39-13.44-21.54-13.44L208 48.02C199.2 48.01 192 55.18 192 64.02v15.99c0 8.836 7.163 15.1 15.1 16l133.1 .0091l36.46 74.55C382.5 178.8 390.8 184 400 184c9.219-.0781 17.78-5.438 21.72-13.78l45.91-97.52l8.406 12.62C480.5 91.1 487.1 96.01 496 96.01h128c8.836 0 16-7.164 16-16V64.01C640 55.18 632.8 48.01 624 48.01z\"]\n};\nvar faProcedures = faBedPulse;\nvar faBeerMugEmpty = {\n  prefix: 'fas',\n  iconName: 'beer-mug-empty',\n  icon: [512, 512, [\"beer\"], \"f0fc\", \"M432 96H384V64c0-17.67-14.33-32-32-32H64C46.33 32 32 46.33 32 64v352c0 35.35 28.65 64 64 64h224c35.35 0 64-28.65 64-64v-32.08l80.66-35.94C493.5 335.1 512 306.5 512 275V176C512 131.8 476.2 96 432 96zM160 368C160 376.9 152.9 384 144 384S128 376.9 128 368v-224C128 135.1 135.1 128 144 128S160 135.1 160 144V368zM224 368C224 376.9 216.9 384 208 384S192 376.9 192 368v-224C192 135.1 199.1 128 208 128S224 135.1 224 144V368zM288 368c0 8.875-7.125 16-16 16S256 376.9 256 368v-224C256 135.1 263.1 128 272 128S288 135.1 288 144V368zM448 275c0 6.25-3.75 12-9.5 14.62L384 313.9V160h48C440.9 160 448 167.1 448 176V275z\"]\n};\nvar faBeer = faBeerMugEmpty;\nvar faBell = {\n  prefix: 'fas',\n  iconName: 'bell',\n  icon: [448, 512, [61602, 128276], \"f0f3\", \"M256 32V51.2C329 66.03 384 130.6 384 208V226.8C384 273.9 401.3 319.2 432.5 354.4L439.9 362.7C448.3 372.2 450.4 385.6 445.2 397.1C440 408.6 428.6 416 416 416H32C19.4 416 7.971 408.6 2.809 397.1C-2.353 385.6-.2883 372.2 8.084 362.7L15.5 354.4C46.74 319.2 64 273.9 64 226.8V208C64 130.6 118.1 66.03 192 51.2V32C192 14.33 206.3 0 224 0C241.7 0 256 14.33 256 32H256zM224 512C207 512 190.7 505.3 178.7 493.3C166.7 481.3 160 464.1 160 448H288C288 464.1 281.3 481.3 269.3 493.3C257.3 505.3 240.1 512 224 512z\"]\n};\nvar faBellConcierge = {\n  prefix: 'fas',\n  iconName: 'bell-concierge',\n  icon: [512, 512, [128718, \"concierge-bell\"], \"f562\", \"M280 145.3V112h16C309.3 112 320 101.3 320 88S309.3 64 296 64H215.1C202.7 64 192 74.75 192 87.1S202.7 112 215.1 112H232v33.32C119.6 157.3 32 252.4 32 368h448C480 252.4 392.4 157.3 280 145.3zM488 400h-464C10.75 400 0 410.7 0 423.1C0 437.3 10.75 448 23.1 448h464c13.25 0 24-10.75 24-23.1C512 410.7 501.3 400 488 400z\"]\n};\nvar faConciergeBell = faBellConcierge;\nvar faBellSlash = {\n  prefix: 'fas',\n  iconName: 'bell-slash',\n  icon: [640, 512, [61943, 128277], \"f1f6\", \"M186 120.5C209 85.38 245.4 59.84 288 51.2V32C288 14.33 302.3 .0003 320 .0003C337.7 .0003 352 14.33 352 32V51.2C425 66.03 480 130.6 480 208V226.8C480 273.9 497.3 319.2 528.5 354.4L535.9 362.7C544.3 372.2 546.4 385.6 541.2 397.1C540.1 397.5 540.8 397.1 540.6 398.4L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L186 120.5zM160 226.8V222.1L406.2 416H128C115.4 416 103.1 408.6 98.81 397.1C93.65 385.6 95.71 372.2 104.1 362.7L111.5 354.4C142.7 319.2 160 273.9 160 226.8V226.8zM320 512C303 512 286.7 505.3 274.7 493.3C262.7 481.3 256 464.1 256 448H384C384 464.1 377.3 481.3 365.3 493.3C353.3 505.3 336.1 512 320 512z\"]\n};\nvar faBezierCurve = {\n  prefix: 'fas',\n  iconName: 'bezier-curve',\n  icon: [640, 512, [], \"f55b\", \"M352 32C378.5 32 400 53.49 400 80V84H518.4C528.8 62.69 550.7 48 576 48C611.3 48 640 76.65 640 112C640 147.3 611.3 176 576 176C550.7 176 528.8 161.3 518.4 140H451.5C510.4 179.6 550.4 244.1 555.5 320H560C586.5 320 608 341.5 608 368V432C608 458.5 586.5 480 560 480H496C469.5 480 448 458.5 448 432V368C448 341.5 469.5 320 496 320H499.3C493.4 253 450.8 196.6 391.8 170.9C383.1 183.6 368.6 192 352 192H288C271.4 192 256.9 183.6 248.2 170.9C189.2 196.6 146.6 253 140.7 320H144C170.5 320 192 341.5 192 368V432C192 458.5 170.5 480 144 480H80C53.49 480 32 458.5 32 432V368C32 341.5 53.49 320 80 320H84.53C89.56 244.1 129.6 179.6 188.5 140H121.6C111.2 161.3 89.3 176 64 176C28.65 176 0 147.3 0 112C0 76.65 28.65 48 64 48C89.3 48 111.2 62.69 121.6 84H240V80C240 53.49 261.5 32 288 32H352zM296 136H344V88H296V136zM88 376V424H136V376H88zM552 424V376H504V424H552z\"]\n};\nvar faBicycle = {\n  prefix: 'fas',\n  iconName: 'bicycle',\n  icon: [640, 512, [128690], \"f206\", \"M347.2 32C358.1 32 369.8 38.44 375.4 48.78L473.3 229.1C485.5 226.1 498.5 224 512 224C582.7 224 640 281.3 640 352C640 422.7 582.7 480 512 480C441.3 480 384 422.7 384 352C384 311.1 402.4 276.3 431.1 252.8L409.4 212.7L324.7 356.2C320.3 363.5 312.5 368 304 368H255C247.1 431.1 193.3 480 128 480C57.31 480 0 422.7 0 352C0 281.3 57.31 224 128 224C138.7 224 149.2 225.3 159.2 227.8L185.8 174.7L163.7 144H120C106.7 144 96 133.3 96 120C96 106.7 106.7 96 120 96H176C183.7 96 190.1 99.71 195.5 105.1L222.9 144H372.3L337.7 80H311.1C298.7 80 287.1 69.25 287.1 56C287.1 42.75 298.7 32 311.1 32H347.2zM440 352C440 391.8 472.2 424 512 424C551.8 424 584 391.8 584 352C584 312.2 551.8 280 512 280C508.2 280 504.5 280.3 500.8 280.9L533.1 340.6C539.4 352.2 535.1 366.8 523.4 373.1C511.8 379.4 497.2 375.1 490.9 363.4L458.6 303.7C447 316.5 440 333.4 440 352V352zM108.8 328.6L133.1 280.2C131.4 280.1 129.7 280 127.1 280C88.24 280 55.1 312.2 55.1 352C55.1 391.8 88.24 424 127.1 424C162.3 424 190.9 400.1 198.2 368H133.2C112.1 368 99.81 346.7 108.8 328.6H108.8zM290.3 320L290.4 319.9L217.5 218.7L166.8 320H290.3zM257.4 192L317 274.8L365.9 192H257.4z\"]\n};\nvar faBinoculars = {\n  prefix: 'fas',\n  iconName: 'binoculars',\n  icon: [512, 512, [], \"f1e5\", \"M416 48C416 39.13 408.9 32 400 32h-64C327.1 32 320 39.13 320 48V96h96.04L416 48zM63.88 160.1C61.34 253.9 3.5 274.3 0 404V448c0 17.6 14.4 32 32 32h128c17.6 0 32-14.4 32-32V128H95.88C78.26 128 64.35 142.5 63.88 160.1zM448.1 160.1C447.6 142.5 433.7 128 416.1 128H320v320c0 17.6 14.4 32 32 32h128c17.6 0 32-14.4 32-32v-44C508.5 274.3 450.7 253.9 448.1 160.1zM224 288h64V128H224V288zM176 32h-64C103.1 32 96 39.13 96 48L95.96 96H192V48C192 39.13 184.9 32 176 32z\"]\n};\nvar faBiohazard = {\n  prefix: 'fas',\n  iconName: 'biohazard',\n  icon: [576, 512, [9763], \"f780\", \"M575.5 283.5c-13.13-39.11-39.5-71.98-74.13-92.35c-17.5-10.37-36.25-16.62-55.25-19.87c6-17.75 10-36.49 10-56.24c0-40.99-14.5-80.73-41-112.2c-2.5-3-6.625-3.623-10-1.75c-3.25 1.875-4.75 5.998-3.625 9.748c4.5 13.75 6.625 26.24 6.625 38.49c0 67.73-53.76 122.8-120 122.8s-120-55.11-120-122.8c0-12.12 2.25-24.74 6.625-38.49c1.125-3.75-.375-7.873-3.625-9.748c-3.375-1.873-7.502-1.25-10 1.75C134.7 34.3 120.1 74.04 120.1 115c0 19.75 3.875 38.49 10 56.24C111.2 174.5 92.32 180.8 74.82 191.1c-34.63 20.49-61.01 53.24-74.38 92.35c-1.25 3.75 .25 7.748 3.5 9.748c3.375 2 7.5 1.375 10-1.5c9.377-10.87 19-19.12 29.25-25.12c57.25-33.87 130.8-13.75 163.9 44.99c33.13 58.61 13.38 133.1-43.88 167.8c-10.25 6.123-22 10.37-35.88 13.37c-3.627 .875-6.377 4.25-6.377 8.123c.125 4 2.75 7.248 6.502 7.998c39.75 7.748 80.63 .7495 115.3-19.74c18-10.5 32.88-24.49 45.25-39.99c12.38 15.5 27.38 29.49 45.38 39.99c34.5 20.49 75.51 27.49 115.1 19.74c3.875-.75 6.375-3.998 6.5-7.998c0-3.873-2.625-7.248-6.375-8.123c-13.88-2.873-25.63-7.248-35.75-13.37c-57.38-33.87-77.01-109.2-44-167.8c33.13-58.73 106.6-78.85 164-44.99c10.12 6.123 19.75 14.25 29.13 25.12c2.5 2.875 6.752 3.5 10 1.5C575.4 291.2 576.9 287.2 575.5 283.5zM287.1 320.1c-26.5 0-48-21.49-48-47.99c0-26.49 21.5-47.99 48-47.99c26.5 0 48.01 21.49 48.01 47.99C335.1 298.6 314.5 320.1 287.1 320.1zM385 377.6c1.152 22.77 10.74 44.63 27.22 60.92c47.45-35.44 79.13-90.58 83.1-153.4c-22.58-6.173-45.69-2.743-65.57 8.76C424.7 326.9 408.5 355.1 385 377.6zM253.3 132.6c26.22-6.551 45.37-6.024 69.52 .0254c21.93-9.777 39.07-28.55 47.48-51.75C345 69.98 317.3 63.94 288.1 63.94c-29.18 0-56.96 5.986-82.16 16.84C214.3 103.1 231.4 122.8 253.3 132.6zM163.8 438.5c16.46-16.26 26.03-38.19 27.14-61.01c-23.49-21.59-39.59-50.67-44.71-83.6C126.9 282.7 103.8 278.8 80.67 285.1C84.64 347.9 116.3 403.1 163.8 438.5z\"]\n};\nvar faBitcoinSign = {\n  prefix: 'fas',\n  iconName: 'bitcoin-sign',\n  icon: [320, 512, [], \"e0b4\", \"M48 32C48 14.33 62.33 0 80 0C97.67 0 112 14.33 112 32V64H144V32C144 14.33 158.3 0 176 0C193.7 0 208 14.33 208 32V64C208 65.54 207.9 67.06 207.7 68.54C254.1 82.21 288 125.1 288 176C288 200.2 280.3 222.6 267.3 240.9C298.9 260.7 320 295.9 320 336C320 397.9 269.9 448 208 448V480C208 497.7 193.7 512 176 512C158.3 512 144 497.7 144 480V448H112V480C112 497.7 97.67 512 80 512C62.33 512 48 497.7 48 480V448H41.74C18.69 448 0 429.3 0 406.3V101.6C0 80.82 16.82 64 37.57 64H48V32zM176 224C202.5 224 224 202.5 224 176C224 149.5 202.5 128 176 128H64V224H176zM64 288V384H208C234.5 384 256 362.5 256 336C256 309.5 234.5 288 208 288H64z\"]\n};\nvar faBlender = {\n  prefix: 'fas',\n  iconName: 'blender',\n  icon: [512, 512, [], \"f517\", \"M336 64h158.5L512 0H48C21.49 0 0 21.49 0 48v160C0 234.5 21.49 256 48 256h103.3L160 352h256l17.49-64H336C327.2 288 320 280.8 320 272S327.2 256 336 256h106.1l17.49-64H336C327.2 192 320 184.8 320 176S327.2 160 336 160h132.4l17.49-64H336C327.2 96 320 88.8 320 80S327.2 64 336 64zM64 192V64h69.88L145.5 192H64zM416 384H160c-35.38 0-64 28.62-64 64l-.0001 32c0 17.62 14.38 32 32 32h320c17.62 0 32-14.38 32-32l.0003-32C480 412.6 451.4 384 416 384zM288 480c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S305.6 480 288 480z\"]\n};\nvar faBlenderPhone = {\n  prefix: 'fas',\n  iconName: 'blender-phone',\n  icon: [576, 512, [], \"f6b6\", \"M158.7 334.1L132.1 271.7C130.2 264.1 123.2 260.7 115.7 261.5l-45 4.374c-17.25-46.87-17.63-99.74 0-147.6l45 4.374C123.2 123.4 130.2 119.1 132.1 112.4l25.75-63.25C161.9 41.76 158.1 33.26 152.1 29.01L112.9 4.887C98.49-3.863 80.12-.4886 68.99 12.01C-23.64 115.6-23.01 271.5 70.99 374.5c9.875 10.75 29.13 12.5 41.75 4.75l39.38-24.12C158.1 350.9 161.7 342.4 158.7 334.1zM479.1 384H224c-35.38 0-63.1 28.62-63.1 63.1l-.0052 32c0 17.62 14.37 31.1 31.1 31.1L511.1 512c17.63 0 32-14.38 32-31.1l.0019-31.1C543.1 412.6 515.4 384 479.1 384zM352 480c-17.63 0-31.1-14.38-31.1-31.1c0-17.62 14.37-31.1 31.1-31.1s31.1 14.38 31.1 31.1C384 465.6 369.6 480 352 480zM399.1 64h158.5L576 .008L191.1 .006l-.0023 351.1h288l17.49-64h-97.49c-8.801 0-16-7.199-16-15.1c0-8.799 7.199-15.1 16-15.1h106.1l17.49-63.1h-123.6c-8.801 0-16-7.199-16-15.1c0-8.799 7.199-15.1 16-15.1h132.4l17.49-63.1h-149.9c-8.801 0-16-7.199-16-15.1C383.1 71.2 391.2 64 399.1 64z\"]\n};\nvar faBlog = {\n  prefix: 'fas',\n  iconName: 'blog',\n  icon: [512, 512, [], \"f781\", \"M217.6 96.1c-12.95-.625-24.66 9.156-25.52 22.37C191.2 131.7 201.2 143.1 214.4 143.1c79.53 5.188 148.4 74.09 153.6 153.6c.8281 12.69 11.39 22.43 23.94 22.43c.5156 0 1.047-.0313 1.578-.0625c13.22-.8438 23.25-12.28 22.39-25.5C409.3 191.8 320.3 102.8 217.6 96.1zM224 0C206.3 0 192 14.31 192 32s14.33 32 32 32c123.5 0 224 100.5 224 224c0 17.69 14.33 32 32 32s32-14.31 32-32C512 129.2 382.8 0 224 0zM172.3 226.8C157.7 223.9 144 235.8 144 250.6v50.37c0 10.25 7.127 18.37 16.75 21.1c18.13 6.75 31.26 24.38 31.26 44.1c0 26.5-21.5 47.1-48.01 47.1c-26.5 0-48.01-21.5-48.01-47.1V120c0-13.25-10.75-23.1-24.01-23.1l-48.01 .0076C10.75 96.02 0 106.8 0 120v247.1c0 89.5 82.14 160.2 175 140.7c54.38-11.5 98.27-55.5 109.8-109.7C302.2 316.1 247.8 241.8 172.3 226.8z\"]\n};\nvar faBold = {\n  prefix: 'fas',\n  iconName: 'bold',\n  icon: [384, 512, [], \"f032\", \"M321.1 242.4C340.1 220.1 352 191.6 352 160c0-70.59-57.42-128-128-128L32 32.01c-17.67 0-32 14.31-32 32s14.33 32 32 32h16v320H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h224c70.58 0 128-57.41 128-128C384 305.3 358.6 264.8 321.1 242.4zM112 96.01H224c35.3 0 64 28.72 64 64s-28.7 64-64 64H112V96.01zM256 416H112v-128H256c35.3 0 64 28.71 64 63.1S291.3 416 256 416z\"]\n};\nvar faBolt = {\n  prefix: 'fas',\n  iconName: 'bolt',\n  icon: [384, 512, [9889, \"zap\"], \"f0e7\", \"M240.5 224H352C365.3 224 377.3 232.3 381.1 244.7C386.6 257.2 383.1 271.3 373.1 280.1L117.1 504.1C105.8 513.9 89.27 514.7 77.19 505.9C65.1 497.1 60.7 481.1 66.59 467.4L143.5 288H31.1C18.67 288 6.733 279.7 2.044 267.3C-2.645 254.8 .8944 240.7 10.93 231.9L266.9 7.918C278.2-1.92 294.7-2.669 306.8 6.114C318.9 14.9 323.3 30.87 317.4 44.61L240.5 224z\"]\n};\nvar faZap = faBolt;\nvar faBoltLightning = {\n  prefix: 'fas',\n  iconName: 'bolt-lightning',\n  icon: [384, 512, [], \"e0b7\", \"M381.2 172.8C377.1 164.9 368.9 160 360 160h-156.6l50.84-127.1c2.969-7.375 2.062-15.78-2.406-22.38S239.1 0 232 0h-176C43.97 0 33.81 8.906 32.22 20.84l-32 240C-.7179 267.7 1.376 274.6 5.938 279.8C10.5 285 17.09 288 24 288h146.3l-41.78 194.1c-2.406 11.22 3.469 22.56 14 27.09C145.6 511.4 148.8 512 152 512c7.719 0 15.22-3.75 19.81-10.44l208-304C384.8 190.2 385.4 180.7 381.2 172.8z\"]\n};\nvar faBomb = {\n  prefix: 'fas',\n  iconName: 'bomb',\n  icon: [512, 512, [128163], \"f1e2\", \"M440.8 4.994C441.9 1.99 444.8 0 448 0C451.2 0 454.1 1.99 455.2 4.994L469.3 42.67L507 56.79C510 57.92 512 60.79 512 64C512 67.21 510 70.08 507 71.21L469.3 85.33L455.2 123C454.1 126 451.2 128 448 128C444.8 128 441.9 126 440.8 123L426.7 85.33L388.1 71.21C385.1 70.08 384 67.21 384 64C384 60.79 385.1 57.92 388.1 56.79L426.7 42.67L440.8 4.994zM289.4 97.37C301.9 84.88 322.1 84.88 334.6 97.37L363.3 126.1L380.7 108.7C386.9 102.4 397.1 102.4 403.3 108.7C409.6 114.9 409.6 125.1 403.3 131.3L385.9 148.7L414.6 177.4C427.1 189.9 427.1 210.1 414.6 222.6L403.8 233.5C411.7 255.5 416 279.3 416 304C416 418.9 322.9 512 208 512C93.12 512 0 418.9 0 304C0 189.1 93.12 96 208 96C232.7 96 256.5 100.3 278.5 108.3L289.4 97.37zM95.1 296C95.1 238.6 142.6 192 199.1 192H207.1C216.8 192 223.1 184.8 223.1 176C223.1 167.2 216.8 160 207.1 160H199.1C124.9 160 63.1 220.9 63.1 296V304C63.1 312.8 71.16 320 79.1 320C88.84 320 95.1 312.8 95.1 304V296z\"]\n};\nvar faBone = {\n  prefix: 'fas',\n  iconName: 'bone',\n  icon: [576, 512, [129460], \"f5d7\", \"M534.9 267.5C560.1 280 576 305.8 576 334v4.387c0 35.55-23.49 68.35-58.24 75.88c-38.18 8.264-74.96-13.73-86.76-49.14c-.0352-.1035-.0684-.207-.1035-.3125C425.3 347.7 409.6 336 391.6 336H184.4c-17.89 0-33.63 11.57-39.23 28.56L145 365.1c-11.8 35.41-48.58 57.4-86.76 49.14C23.49 406.7 0 373.9 0 338.4v-4.387C0 305.8 15.88 280 41.13 267.5c9.375-4.75 9.375-18.25 0-23C15.88 232 0 206.3 0 178V173.6c0-35.55 23.49-68.35 58.24-75.88c38.18-8.264 74.99 13.82 86.79 49.23C150.7 164.1 166.4 176 184.4 176h207.2c17.89 0 33.63-11.57 39.23-28.56L431 146.9c11.8-35.41 48.58-57.4 86.76-49.14C552.5 105.3 576 138.1 576 173.6v4.387C576 206.3 560.1 232 534.9 244.5C525.5 249.3 525.5 262.8 534.9 267.5z\"]\n};\nvar faBong = {\n  prefix: 'fas',\n  iconName: 'bong',\n  icon: [512, 512, [], \"f55c\", \"M334.5 512c23.12 0 44.38-12.62 56-32.63C406.8 451.2 416 418.8 416 384c0-36.13-10.11-69.75-27.49-98.63l43.5-43.37l9.376 9.375c6.25 6.25 16.38 6.25 22.63 0L475.3 240c6.25-6.25 6.25-16.38 0-22.62l-52.63-52.75c-6.25-6.25-16.38-6.25-22.63 0L388.6 176c-6.25 6.25-6.25 16.38 0 22.62L398 208l-39.38 39.38c-11.5-11.38-24.51-21.25-38.63-29.5l.0067-154.1h16c8.75 0 16-7.25 16-16L352 16.01C352 7.14 344.9 0 336 0L111.1 .1667c-8.75 0-15.99 7.11-15.99 15.99L96 48c0 8.875 7.126 16 16 16h16L128 217.9C70.63 251.1 32 313 32 384c0 34.75 9.252 67.25 25.5 95.38C69.13 499.4 90.38 512 113.5 512H334.5zM152 259.4l23.97-13.87V64.03L272 63.75l.0168 181.8l23.97 13.87C320.7 273.8 340 295.1 352.5 320H95.51C108 295.1 127.3 273.8 152 259.4z\"]\n};\nvar faBook = {\n  prefix: 'fas',\n  iconName: 'book',\n  icon: [448, 512, [128212], \"f02d\", \"M448 336v-288C448 21.49 426.5 0 400 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-31.1c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM143.1 128h192C344.8 128 352 135.2 352 144C352 152.8 344.8 160 336 160H143.1C135.2 160 128 152.8 128 144C128 135.2 135.2 128 143.1 128zM143.1 192h192C344.8 192 352 199.2 352 208C352 216.8 344.8 224 336 224H143.1C135.2 224 128 216.8 128 208C128 199.2 135.2 192 143.1 192zM384 448H96c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32h288V448z\"]\n};\nvar faBookAtlas = {\n  prefix: 'fas',\n  iconName: 'book-atlas',\n  icon: [448, 512, [\"atlas\"], \"f558\", \"M240 97.25C232.3 104.8 219.3 131.8 216.6 176h46.88C260.8 131.8 247.8 104.8 240 97.25zM334.4 176c-5.25-31.25-25.62-57.13-53.25-70.38C288.8 124.6 293.8 149 295.3 176H334.4zM334.4 208h-39.13c-1.5 27-6.5 51.38-14.12 70.38C308.8 265.1 329.1 239.3 334.4 208zM263.4 208H216.5C219.3 252.3 232.3 279.3 240 286.8C247.8 279.3 260.8 252.3 263.4 208zM198.9 105.6C171.3 118.9 150.9 144.8 145.6 176h39.13C186.3 149 191.3 124.6 198.9 105.6zM448 336v-288C448 21.49 426.5 0 400 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-32c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM240 64c70.75 0 128 57.25 128 128s-57.25 128-128 128s-128-57.25-128-128S169.3 64 240 64zM384 448H96c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32h288V448zM198.9 278.4C191.3 259.4 186.3 235 184.8 208H145.6C150.9 239.3 171.3 265.1 198.9 278.4z\"]\n};\nvar faAtlas = faBookAtlas;\nvar faBookBible = {\n  prefix: 'fas',\n  iconName: 'book-bible',\n  icon: [448, 512, [\"bible\"], \"f647\", \"M448 336v-288C448 21.49 426.5 0 400 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-31.1c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM144 144c0-8.875 7.125-15.1 16-15.1L208 128V80c0-8.875 7.125-15.1 16-15.1l32 .0009c8.875 0 16 7.12 16 15.1V128L320 128c8.875 0 16 7.121 16 15.1v32c0 8.875-7.125 16-16 16L272 192v112c0 8.875-7.125 16-16 16l-32-.0002c-8.875 0-16-7.127-16-16V192L160 192c-8.875 0-16-7.127-16-16V144zM384 448H96c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32h288V448z\"]\n};\nvar faBible = faBookBible;\nvar faBookBookmark = {\n  prefix: 'fas',\n  iconName: 'book-bookmark',\n  icon: [448, 512, [], \"e0bb\", \"M448 336v-288C448 21.49 426.5 0 400 0H352v191.1c0 13.41-15.52 20.88-25.1 12.49L272 160L217.1 204.5C207.5 212.8 192 205.4 192 191.1V0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-32c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM384 448H96c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32h288V448z\"]\n};\nvar faBookJournalWhills = {\n  prefix: 'fas',\n  iconName: 'book-journal-whills',\n  icon: [448, 512, [\"journal-whills\"], \"f66a\", \"M448 336v-288C448 21.49 426.5 0 400 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-31.1c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM133.1 160.4l21.25 21.25c3.125 3.125 8.125 3.125 11.25 0s3.125-8.125 0-11.25l-26.38-26.5c10-20.75 26.25-38 46.38-49.25c-17 27.12-11 62.75 14 82.63C185.5 192 180.5 213.1 186.5 232.5c5.875 19.38 22 34.13 41.88 38.25l1.375-32.75L219.4 245.1C218.8 245.5 217.9 245.8 217.1 245.8c-1 0-2-.375-2.75-1c-.75-.875-1.25-1.875-1.25-3c0-.625 .25-1.375 .5-2L222.3 225.5l-18-3.75c-1.75-.375-3.125-2.125-3.125-4s1.375-3.5 3.125-3.875l18-3.75L213.6 195.9C212.8 194.3 213 192.1 214.4 190.9s3.5-1.5 5-.375l12 8.125L236 87.88C236.1 85.63 237.9 84 240 84s3.875 1.625 4 3.875l4.75 112.3l14.12-9.625c.625-.5 1.5-.625 2.25-.75c1.5 0 2.75 .75 3.5 2s.625 2.875-.125 4.125L260 210.1l17.1 3.75c1.75 .375 3.125 2 3.125 3.875s-1.375 3.625-3.125 4L260 225.4l8.5 14.38c.75 1.25 .875 2.75 .125 4s-2 2-3.5 2c-.75 0-1.625-.25-2.25-.625L250.3 236.5l1.375 34.25c19.88-4.125 36-18.88 41.88-38.25c6-19.38 1-40.63-13.12-55.25c25-19.88 31-55.5 14-82.63c20.25 11.25 36.38 28.5 46.38 49.25l-26.38 26.5c-3.125 3.125-3.125 8.125 0 11.25s8.125 3.125 11.25 0l21.25-21.25C349.9 170.5 352 181 352 192c0 .5-.125 1-.125 1.5l-37.13 32.5C313.1 227.6 312.1 229.8 312 232c.125 1.875 .7496 3.75 1.1 5.25C315.6 238.9 317.8 239.9 320 240c1.1 0 3.875-.7499 5.25-1.1l23.62-20.63C337.3 267 293.1 304 240 304S142.8 267 131.1 217.4l23.62 20.63C156.3 239.3 158.1 239.9 160 240c3.375 0 6.25-2.125 7.5-5.125c1.125-3.125 .25-6.75-2.25-8.875L128.1 193.5C128.1 193 128 192.5 128 192C128 181 130.1 170.5 133.1 160.4zM384 448H96c-17.67 0-32-14.33-32-32s14.33-32 32-32h288V448z\"]\n};\nvar faJournalWhills = faBookJournalWhills;\nvar faBookMedical = {\n  prefix: 'fas',\n  iconName: 'book-medical',\n  icon: [448, 512, [], \"f7e6\", \"M448 336v-288C448 21.49 426.5 0 400 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-31.1c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM128 166c0-8.838 7.164-16 16-16h53.1V96c0-8.838 7.164-16 16-16h52c8.836 0 16 7.162 16 16v54H336c8.836 0 16 7.162 16 16v52c0 8.836-7.164 16-16 16h-54V288c0 8.836-7.164 16-16 16h-52c-8.836 0-16-7.164-16-16V234H144c-8.836 0-16-7.164-16-16V166zM384 448H96c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32h288V448z\"]\n};\nvar faBookOpen = {\n  prefix: 'fas',\n  iconName: 'book-open',\n  icon: [576, 512, [128366, 128214], \"f518\", \"M144.3 32.04C106.9 31.29 63.7 41.44 18.6 61.29c-11.42 5.026-18.6 16.67-18.6 29.15l0 357.6c0 11.55 11.99 19.55 22.45 14.65c126.3-59.14 219.8 11 223.8 14.01C249.1 478.9 252.5 480 256 480c12.4 0 16-11.38 16-15.98V80.04c0-5.203-2.531-10.08-6.781-13.08C263.3 65.58 216.7 33.35 144.3 32.04zM557.4 61.29c-45.11-19.79-88.48-29.61-125.7-29.26c-72.44 1.312-118.1 33.55-120.9 34.92C306.5 69.96 304 74.83 304 80.04v383.1C304 468.4 307.5 480 320 480c3.484 0 6.938-1.125 9.781-3.328c3.925-3.018 97.44-73.16 223.8-14c10.46 4.896 22.45-3.105 22.45-14.65l.0001-357.6C575.1 77.97 568.8 66.31 557.4 61.29z\"]\n};\nvar faBookOpenReader = {\n  prefix: 'fas',\n  iconName: 'book-open-reader',\n  icon: [512, 512, [\"book-reader\"], \"f5da\", \"M0 219.2v212.5c0 14.25 11.62 26.25 26.5 27C75.32 461.2 180.2 471.3 240 511.9V245.2C181.4 205.5 79.99 194.8 29.84 192C13.59 191.1 0 203.6 0 219.2zM482.2 192c-50.09 2.848-151.3 13.47-209.1 53.09C272.1 245.2 272 245.3 272 245.5v266.5c60.04-40.39 164.7-50.76 213.5-53.28C500.4 457.9 512 445.9 512 431.7V219.2C512 203.6 498.4 191.1 482.2 192zM352 96c0-53-43-96-96-96S160 43 160 96s43 96 96 96S352 149 352 96z\"]\n};\nvar faBookReader = faBookOpenReader;\nvar faBookQuran = {\n  prefix: 'fas',\n  iconName: 'book-quran',\n  icon: [448, 512, [\"quran\"], \"f687\", \"M352 0H48C21.49 0 0 21.49 0 48v288c0 14.16 6.246 26.76 16 35.54v81.36C6.607 458.5 0 468.3 0 479.1C0 497.7 14.33 512 31.1 512h320c53.02 0 96-42.98 96-96V96C448 42.98 405 0 352 0zM324.8 170.4c3.006 .4297 4.295 4.154 2.004 6.301L306.2 196.9l4.869 28.5c.4297 2.434-1.576 4.439-3.725 4.439c-.5723 0-1.145-.1445-1.719-.4297L280 215.9l-25.63 13.46c-.5723 .2852-1.145 .4297-1.719 .4297c-2.146 0-4.152-2.006-3.723-4.439l4.869-28.5l-20.62-20.19c-2.291-2.146-1.002-5.871 2.006-6.301l28.64-4.152l12.89-25.92C277.3 138.9 278.7 138.2 280 138.2s2.721 .7168 3.295 2.148l12.89 25.92L324.8 170.4zM216 72c23.66 0 46.61 6.953 66.36 20.09c3.219 2.141 4.438 6.281 2.906 9.844c-1.547 3.547-5.453 5.562-9.172 4.594C268.8 104.8 262.2 104 256 104C207.5 104 168 143.5 168 192S207.5 280 256 280c6.234 0 12.81-.8281 20.09-2.531c3.719-.9687 7.625 1.047 9.172 4.594c1.531 3.562 .3125 7.703-2.906 9.844C262.6 305 239.7 312 216 312C149.8 312 96 258.2 96 192S149.8 72 216 72zM352 448H64v-64h288c17.67 0 32 14.33 32 32C384 433.7 369.7 448 352 448z\"]\n};\nvar faQuran = faBookQuran;\nvar faBookSkull = {\n  prefix: 'fas',\n  iconName: 'book-skull',\n  icon: [448, 512, [\"book-dead\"], \"f6b7\", \"M272 144C280.8 144 288 136.8 288 128s-7.25-16-16-16S256 119.3 256 128S263.3 144 272 144zM448 336v-288C448 21.49 426.5 0 400 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h320c17.67 0 32-14.33 32-31.1c0-11.72-6.607-21.52-16-27.1v-81.36C441.8 362.8 448 350.2 448 336zM240 64C284.3 64 320 92.75 320 128c0 20.88-12.75 39.25-32 50.88V192c0 8.75-7.25 16-16 16h-64C199.3 208 192 200.8 192 192V178.9C172.8 167.3 160 148.9 160 128C160 92.75 195.8 64 240 64zM121.7 238.7c-8.125-3.484-11.91-12.89-8.438-21.02c3.469-8.094 12.94-11.86 21-8.422L240 254.5l105.7-45.21c8.031-3.438 17.53 .3281 21 8.422c3.469 8.125-.3125 17.53-8.438 21.02l-77.58 33.18l77.58 33.18c8.125 3.484 11.91 12.89 8.438 21.02C364.1 332.2 358.2 335.8 352 335.8c-2.094 0-4.25-.4062-6.281-1.281L240 289.3l-105.7 45.21C132.3 335.4 130.1 335.8 128 335.8c-6.219 0-12.12-3.641-14.72-9.703C109.8 317.1 113.6 308.6 121.7 305.1l77.58-33.18L121.7 238.7zM384 448H96c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32h288V448zM208 144C216.8 144 224 136.8 224 128S216.8 112 208 112S192 119.3 192 128S199.3 144 208 144z\"]\n};\nvar faBookDead = faBookSkull;\nvar faBookmark = {\n  prefix: 'fas',\n  iconName: 'bookmark',\n  icon: [384, 512, [61591, 128278], \"f02e\", \"M384 48V512l-192-112L0 512V48C0 21.5 21.5 0 48 0h288C362.5 0 384 21.5 384 48z\"]\n};\nvar faBorderAll = {\n  prefix: 'fas',\n  iconName: 'border-all',\n  icon: [448, 512, [], \"f84c\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM384 96H256V224H384V96zM384 288H256V416H384V288zM192 224V96H64V224H192zM64 416H192V288H64V416z\"]\n};\nvar faBorderNone = {\n  prefix: 'fas',\n  iconName: 'border-none',\n  icon: [448, 512, [], \"f850\", \"M64 448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416C49.67 416 64 430.3 64 448zM128 480C110.3 480 96 465.7 96 448C96 430.3 110.3 416 128 416C145.7 416 160 430.3 160 448C160 465.7 145.7 480 128 480zM128 96C110.3 96 96 81.67 96 64C96 46.33 110.3 32 128 32C145.7 32 160 46.33 160 64C160 81.67 145.7 96 128 96zM160 256C160 273.7 145.7 288 128 288C110.3 288 96 273.7 96 256C96 238.3 110.3 224 128 224C145.7 224 160 238.3 160 256zM320 480C302.3 480 288 465.7 288 448C288 430.3 302.3 416 320 416C337.7 416 352 430.3 352 448C352 465.7 337.7 480 320 480zM352 64C352 81.67 337.7 96 320 96C302.3 96 288 81.67 288 64C288 46.33 302.3 32 320 32C337.7 32 352 46.33 352 64zM320 288C302.3 288 288 273.7 288 256C288 238.3 302.3 224 320 224C337.7 224 352 238.3 352 256C352 273.7 337.7 288 320 288zM256 448C256 465.7 241.7 480 224 480C206.3 480 192 465.7 192 448C192 430.3 206.3 416 224 416C241.7 416 256 430.3 256 448zM224 96C206.3 96 192 81.67 192 64C192 46.33 206.3 32 224 32C241.7 32 256 46.33 256 64C256 81.67 241.7 96 224 96zM256 256C256 273.7 241.7 288 224 288C206.3 288 192 273.7 192 256C192 238.3 206.3 224 224 224C241.7 224 256 238.3 256 256zM416 480C398.3 480 384 465.7 384 448C384 430.3 398.3 416 416 416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480zM416 96C398.3 96 384 81.67 384 64C384 46.33 398.3 32 416 32C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96zM64 64C64 81.67 49.67 96 32 96C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32C49.67 32 64 46.33 64 64zM416 288C398.3 288 384 273.7 384 256C384 238.3 398.3 224 416 224C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288zM64 256C64 273.7 49.67 288 32 288C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224C49.67 224 64 238.3 64 256zM224 384C206.3 384 192 369.7 192 352C192 334.3 206.3 320 224 320C241.7 320 256 334.3 256 352C256 369.7 241.7 384 224 384zM448 352C448 369.7 433.7 384 416 384C398.3 384 384 369.7 384 352C384 334.3 398.3 320 416 320C433.7 320 448 334.3 448 352zM32 384C14.33 384 0 369.7 0 352C0 334.3 14.33 320 32 320C49.67 320 64 334.3 64 352C64 369.7 49.67 384 32 384zM448 160C448 177.7 433.7 192 416 192C398.3 192 384 177.7 384 160C384 142.3 398.3 128 416 128C433.7 128 448 142.3 448 160zM32 192C14.33 192 0 177.7 0 160C0 142.3 14.33 128 32 128C49.67 128 64 142.3 64 160C64 177.7 49.67 192 32 192zM256 160C256 177.7 241.7 192 224 192C206.3 192 192 177.7 192 160C192 142.3 206.3 128 224 128C241.7 128 256 142.3 256 160z\"]\n};\nvar faBorderTopLeft = {\n  prefix: 'fas',\n  iconName: 'border-top-left',\n  icon: [448, 512, [\"border-style\"], \"f853\", \"M0 112C0 67.82 35.82 32 80 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96H80C71.16 96 64 103.2 64 112V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448V112zM128 480C110.3 480 96 465.7 96 448C96 430.3 110.3 416 128 416C145.7 416 160 430.3 160 448C160 465.7 145.7 480 128 480zM320 480C302.3 480 288 465.7 288 448C288 430.3 302.3 416 320 416C337.7 416 352 430.3 352 448C352 465.7 337.7 480 320 480zM256 448C256 465.7 241.7 480 224 480C206.3 480 192 465.7 192 448C192 430.3 206.3 416 224 416C241.7 416 256 430.3 256 448zM416 480C398.3 480 384 465.7 384 448C384 430.3 398.3 416 416 416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480zM416 288C398.3 288 384 273.7 384 256C384 238.3 398.3 224 416 224C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288zM448 352C448 369.7 433.7 384 416 384C398.3 384 384 369.7 384 352C384 334.3 398.3 320 416 320C433.7 320 448 334.3 448 352zM416 192C398.3 192 384 177.7 384 160C384 142.3 398.3 128 416 128C433.7 128 448 142.3 448 160C448 177.7 433.7 192 416 192z\"]\n};\nvar faBorderStyle = faBorderTopLeft;\nvar faBoreHole = {\n  prefix: 'fas',\n  iconName: 'bore-hole',\n  icon: [512, 512, [], \"e4c3\", \"M256 0C273.7 0 288 14.33 288 32V296.6C307.1 307.6 320 328.3 320 352C320 387.3 291.3 416 256 416C220.7 416 192 387.3 192 352C192 328.3 204.9 307.6 224 296.6V32C224 14.33 238.3 0 256 0zM160 128V352C160 405 202.1 448 256 448C309 448 352 405 352 352V128H464C490.5 128 512 149.5 512 176V464C512 490.5 490.5 512 464 512H48C21.49 512 0 490.5 0 464V176C0 149.5 21.49 128 48 128H160z\"]\n};\nvar faBottleDroplet = {\n  prefix: 'fas',\n  iconName: 'bottle-droplet',\n  icon: [320, 512, [], \"e4c4\", \"M224 0C237.3-.0003 248 10.74 248 23.1C248 37.25 237.3 47.1 224 48L216 48V140.9C258.6 161.6 288 205.4 288 256V448C288 483.3 259.3 512 224 512H96C60.65 512 32 483.3 32 448V256C32 205.4 61.37 161.6 104 140.9V48L96 48C82.75 48 72 37.26 72 24C71.1 10.75 82.74 .0045 95.1 .0042L224 0zM160 384C186.5 384 208 368 208 336C208 304 160 256 160 256C160 256 112 304 112 336C112 362.5 133.5 384 160 384z\"]\n};\nvar faBottleWater = {\n  prefix: 'fas',\n  iconName: 'bottle-water',\n  icon: [320, 512, [], \"e4c5\", \"M200 0C213.3 0 224 10.75 224 24V64H96V24C96 10.75 106.7 0 120 0H200zM32 151.7C32 136.1 41.04 121.9 55.19 115.3L79.6 103.8C90.58 98.67 102.6 96 114.7 96H205.3C217.4 96 229.4 98.67 240.4 103.8L264.8 115.3C278.1 121.9 288 136.1 288 151.7C288 166.1 280.5 178.7 269.1 185.8C280.6 194.6 288 208.4 288 223.1C288 240.7 279.5 255.4 266.5 263.1C279.5 272.6 288 287.3 288 303.1C288 320.7 279.5 335.4 266.5 344C279.5 352.6 288 367.3 288 384C288 400.7 279.5 415.4 266.5 424C279.5 432.6 288 447.3 288 464C288 490.5 266.5 512 240 512H80C53.49 512 32 490.5 32 464C32 447.3 40.52 432.6 53.46 424C40.52 415.4 32 400.7 32 384C32 367.3 40.52 352.6 53.46 344C40.52 335.4 32 320.7 32 303.1C32 287.3 40.52 272.6 53.46 263.1C40.52 255.4 32 240.7 32 223.1C32 208.4 39.4 194.6 50.87 185.8C39.53 178.7 32 166.1 32 151.7L32 151.7zM112 256H208C216.8 256 224 248.8 224 240C224 231.2 216.8 224 208 224H112C103.2 224 96 231.2 96 240C96 248.8 103.2 256 112 256zM112 352C103.2 352 96 359.2 96 368C96 376.8 103.2 384 112 384H208C216.8 384 224 376.8 224 368C224 359.2 216.8 352 208 352H112z\"]\n};\nvar faBowlFood = {\n  prefix: 'fas',\n  iconName: 'bowl-food',\n  icon: [576, 512, [], \"e4c6\", \"M96 128C96.53 128 97.07 128 97.6 128C105 91.49 137.3 64 176 64C190.1 64 204.1 68.1 216.9 75.25C230.2 49.55 257.1 32 288 32C318.9 32 345.8 49.56 359.1 75.25C371 68.1 385 64 400 64C438.7 64 470.1 91.49 478.4 128C478.9 128 479.5 128 480 128C515.3 128 544 156.7 544 192C544 203.7 540.9 214.6 535.4 224H40.56C35.12 214.6 32 203.7 32 192C32 156.7 60.65 128 96 128H96zM16 283.4C16 268.3 28.28 256 43.43 256H532.6C547.7 256 560 268.3 560 283.4C560 356.3 512.6 418.2 446.9 439.8C447.6 442.4 448 445.2 448 448C448 465.7 433.7 480 416 480H160C142.3 480 128 465.7 128 448C128 445.2 128.4 442.4 129.1 439.8C63.4 418.2 16 356.3 16 283.4H16z\"]\n};\nvar faBowlRice = {\n  prefix: 'fas',\n  iconName: 'bowl-rice',\n  icon: [576, 512, [], \"e2eb\", \"M208 72C208 58.75 218.7 48 232 48H248C261.3 48 272 58.75 272 72C272 85.25 261.3 96 248 96H232C218.7 96 208 85.25 208 72zM208 152C208 138.7 218.7 128 232 128H248C261.3 128 272 138.7 272 152C272 165.3 261.3 176 248 176H232C218.7 176 208 165.3 208 152zM16 232C16 218.7 26.75 208 40 208H56C69.25 208 80 218.7 80 232C80 245.3 69.25 256 56 256H40C26.75 256 16 245.3 16 232zM532.6 288C547.7 288 560 300.3 560 315.4C560 388.3 512.6 450.2 446.9 471.8C447.6 474.4 448 477.2 448 480C448 497.7 433.7 512 416 512H160C142.3 512 128 497.7 128 480C128 477.2 128.4 474.4 129.1 471.8C63.4 450.2 16 388.3 16 315.4C16 300.3 28.28 288 43.43 288H532.6zM248 208C261.3 208 272 218.7 272 232C272 245.3 261.3 256 248 256H232C218.7 256 208 245.3 208 232C208 218.7 218.7 208 232 208H248zM152 208C165.3 208 176 218.7 176 232C176 245.3 165.3 256 152 256H136C122.7 256 112 245.3 112 232C112 218.7 122.7 208 136 208H152zM112 152C112 138.7 122.7 128 136 128H152C165.3 128 176 138.7 176 152C176 165.3 165.3 176 152 176H136C122.7 176 112 165.3 112 152zM344 208C357.3 208 368 218.7 368 232C368 245.3 357.3 256 344 256H328C314.7 256 304 245.3 304 232C304 218.7 314.7 208 328 208H344zM304 152C304 138.7 314.7 128 328 128H344C357.3 128 368 138.7 368 152C368 165.3 357.3 176 344 176H328C314.7 176 304 165.3 304 152zM440 208C453.3 208 464 218.7 464 232C464 245.3 453.3 256 440 256H424C410.7 256 400 245.3 400 232C400 218.7 410.7 208 424 208H440zM400 152C400 138.7 410.7 128 424 128H440C453.3 128 464 138.7 464 152C464 165.3 453.3 176 440 176H424C410.7 176 400 165.3 400 152zM536 208C549.3 208 560 218.7 560 232C560 245.3 549.3 256 536 256H520C506.7 256 496 245.3 496 232C496 218.7 506.7 208 520 208H536zM344 48C357.3 48 368 58.75 368 72C368 85.25 357.3 96 344 96H328C314.7 96 304 85.25 304 72C304 58.75 314.7 48 328 48H344z\"]\n};\nvar faBowlingBall = {\n  prefix: 'fas',\n  iconName: 'bowling-ball',\n  icon: [512, 512, [], \"f436\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM144 208c-17.7 0-32-14.25-32-32s14.3-32 32-32s32 14.25 32 32S161.7 208 144 208zM240 80c17.66 0 31.95 14.25 31.95 32s-14.29 32-31.95 32s-32.05-14.25-32.05-32S222.4 80 240 80zM240 240c-17.7 0-32-14.25-32-32s14.3-32 32-32s32 14.25 32 32S257.7 240 240 240z\"]\n};\nvar faBox = {\n  prefix: 'fas',\n  iconName: 'box',\n  icon: [448, 512, [128230], \"f466\", \"M50.73 58.53C58.86 42.27 75.48 32 93.67 32H208V160H0L50.73 58.53zM240 160V32H354.3C372.5 32 389.1 42.27 397.3 58.53L448 160H240zM448 416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V192H448V416z\"]\n};\nvar faBoxArchive = {\n  prefix: 'fas',\n  iconName: 'box-archive',\n  icon: [512, 512, [\"archive\"], \"f187\", \"M32 432C32 458.5 53.49 480 80 480h352c26.51 0 48-21.49 48-48V160H32V432zM160 236C160 229.4 165.4 224 172 224h168C346.6 224 352 229.4 352 236v8C352 250.6 346.6 256 340 256h-168C165.4 256 160 250.6 160 244V236zM480 32H32C14.31 32 0 46.31 0 64v48C0 120.8 7.188 128 16 128h480C504.8 128 512 120.8 512 112V64C512 46.31 497.7 32 480 32z\"]\n};\nvar faArchive = faBoxArchive;\nvar faBoxOpen = {\n  prefix: 'fas',\n  iconName: 'box-open',\n  icon: [640, 512, [], \"f49e\", \"M75.23 33.4L320 63.1L564.8 33.4C571.5 32.56 578 36.06 581.1 42.12L622.8 125.5C631.7 143.4 622.2 165.1 602.9 170.6L439.6 217.3C425.7 221.2 410.8 215.4 403.4 202.1L320 63.1L236.6 202.1C229.2 215.4 214.3 221.2 200.4 217.3L37.07 170.6C17.81 165.1 8.283 143.4 17.24 125.5L58.94 42.12C61.97 36.06 68.5 32.56 75.23 33.4H75.23zM321.1 128L375.9 219.4C390.8 244.2 420.5 255.1 448.4 248L576 211.6V378.5C576 400.5 561 419.7 539.6 425.1L335.5 476.1C325.3 478.7 314.7 478.7 304.5 476.1L100.4 425.1C78.99 419.7 64 400.5 64 378.5V211.6L191.6 248C219.5 255.1 249.2 244.2 264.1 219.4L318.9 128H321.1z\"]\n};\nvar faBoxTissue = {\n  prefix: 'fas',\n  iconName: 'box-tissue',\n  icon: [512, 512, [], \"e05b\", \"M384 288l64-192h-109.4C308.4 96 281.6 76.66 272 48C262.4 19.33 235.6 0 205.4 0H64l64 288H384zM0 480c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-64H0V480zM480 224h-40.94l-21.33 64H432C440.8 288 448 295.2 448 304S440.8 320 432 320h-352C71.16 320 64 312.8 64 304S71.16 288 80 288h15.22l-14.22-64H32C14.33 224 0 238.3 0 256v128h512V256C512 238.3 497.7 224 480 224z\"]\n};\nvar faBoxesPacking = {\n  prefix: 'fas',\n  iconName: 'boxes-packing',\n  icon: [640, 512, [], \"e4c7\", \"M256 48C256 21.49 277.5 0 304 0H592C618.5 0 640 21.49 640 48V464C640 490.5 618.5 512 592 512H381.3C383 506.1 384 501.6 384 496V253.3C402.6 246.7 416 228.9 416 208V176C416 149.5 394.5 128 368 128H256V48zM571.3 347.3C577.6 341.1 577.6 330.9 571.3 324.7L507.3 260.7C501.1 254.4 490.9 254.4 484.7 260.7L420.7 324.7C414.4 330.9 414.4 341.1 420.7 347.3C426.9 353.6 437.1 353.6 443.3 347.3L480 310.6V432C480 440.8 487.2 448 496 448C504.8 448 512 440.8 512 432V310.6L548.7 347.3C554.9 353.6 565.1 353.6 571.3 347.3H571.3zM0 176C0 167.2 7.164 160 16 160H368C376.8 160 384 167.2 384 176V208C384 216.8 376.8 224 368 224H16C7.164 224 0 216.8 0 208V176zM352 480C352 497.7 337.7 512 320 512H64C46.33 512 32 497.7 32 480V256H352V480zM144 320C135.2 320 128 327.2 128 336C128 344.8 135.2 352 144 352H240C248.8 352 256 344.8 256 336C256 327.2 248.8 320 240 320H144z\"]\n};\nvar faBoxesStacked = {\n  prefix: 'fas',\n  iconName: 'boxes-stacked',\n  icon: [576, 512, [62625, \"boxes\", \"boxes-alt\"], \"f468\", \"M160 48C160 21.49 181.5 0 208 0H256V80C256 88.84 263.2 96 272 96H304C312.8 96 320 88.84 320 80V0H368C394.5 0 416 21.49 416 48V176C416 202.5 394.5 224 368 224H208C181.5 224 160 202.5 160 176V48zM96 288V368C96 376.8 103.2 384 112 384H144C152.8 384 160 376.8 160 368V288H208C234.5 288 256 309.5 256 336V464C256 490.5 234.5 512 208 512H48C21.49 512 0 490.5 0 464V336C0 309.5 21.49 288 48 288H96zM416 288V368C416 376.8 423.2 384 432 384H464C472.8 384 480 376.8 480 368V288H528C554.5 288 576 309.5 576 336V464C576 490.5 554.5 512 528 512H368C341.5 512 320 490.5 320 464V336C320 309.5 341.5 288 368 288H416z\"]\n};\nvar faBoxes = faBoxesStacked;\nvar faBoxesAlt = faBoxesStacked;\nvar faBraille = {\n  prefix: 'fas',\n  iconName: 'braille',\n  icon: [640, 512, [], \"f2a1\", \"M128 96C128 131.3 99.35 160 64 160C28.65 160 0 131.3 0 96C0 60.65 28.65 32 64 32C99.35 32 128 60.65 128 96zM160 256C160 220.7 188.7 192 224 192C259.3 192 288 220.7 288 256C288 291.3 259.3 320 224 320C188.7 320 160 291.3 160 256zM224 272C232.8 272 240 264.8 240 256C240 247.2 232.8 240 224 240C215.2 240 208 247.2 208 256C208 264.8 215.2 272 224 272zM128 416C128 451.3 99.35 480 64 480C28.65 480 0 451.3 0 416C0 380.7 28.65 352 64 352C99.35 352 128 380.7 128 416zM64 400C55.16 400 48 407.2 48 416C48 424.8 55.16 432 64 432C72.84 432 80 424.8 80 416C80 407.2 72.84 400 64 400zM288 416C288 451.3 259.3 480 224 480C188.7 480 160 451.3 160 416C160 380.7 188.7 352 224 352C259.3 352 288 380.7 288 416zM224 400C215.2 400 208 407.2 208 416C208 424.8 215.2 432 224 432C232.8 432 240 424.8 240 416C240 407.2 232.8 400 224 400zM0 256C0 220.7 28.65 192 64 192C99.35 192 128 220.7 128 256C128 291.3 99.35 320 64 320C28.65 320 0 291.3 0 256zM160 96C160 60.65 188.7 32 224 32C259.3 32 288 60.65 288 96C288 131.3 259.3 160 224 160C188.7 160 160 131.3 160 96zM480 96C480 131.3 451.3 160 416 160C380.7 160 352 131.3 352 96C352 60.65 380.7 32 416 32C451.3 32 480 60.65 480 96zM640 96C640 131.3 611.3 160 576 160C540.7 160 512 131.3 512 96C512 60.65 540.7 32 576 32C611.3 32 640 60.65 640 96zM576 80C567.2 80 560 87.16 560 96C560 104.8 567.2 112 576 112C584.8 112 592 104.8 592 96C592 87.16 584.8 80 576 80zM512 256C512 220.7 540.7 192 576 192C611.3 192 640 220.7 640 256C640 291.3 611.3 320 576 320C540.7 320 512 291.3 512 256zM576 272C584.8 272 592 264.8 592 256C592 247.2 584.8 240 576 240C567.2 240 560 247.2 560 256C560 264.8 567.2 272 576 272zM640 416C640 451.3 611.3 480 576 480C540.7 480 512 451.3 512 416C512 380.7 540.7 352 576 352C611.3 352 640 380.7 640 416zM576 400C567.2 400 560 407.2 560 416C560 424.8 567.2 432 576 432C584.8 432 592 424.8 592 416C592 407.2 584.8 400 576 400zM352 256C352 220.7 380.7 192 416 192C451.3 192 480 220.7 480 256C480 291.3 451.3 320 416 320C380.7 320 352 291.3 352 256zM416 272C424.8 272 432 264.8 432 256C432 247.2 424.8 240 416 240C407.2 240 400 247.2 400 256C400 264.8 407.2 272 416 272zM480 416C480 451.3 451.3 480 416 480C380.7 480 352 451.3 352 416C352 380.7 380.7 352 416 352C451.3 352 480 380.7 480 416zM416 400C407.2 400 400 407.2 400 416C400 424.8 407.2 432 416 432C424.8 432 432 424.8 432 416C432 407.2 424.8 400 416 400z\"]\n};\nvar faBrain = {\n  prefix: 'fas',\n  iconName: 'brain',\n  icon: [512, 512, [129504], \"f5dc\", \"M184 0C214.9 0 240 25.07 240 56V456C240 486.9 214.9 512 184 512C155.1 512 131.3 490.1 128.3 461.9C123.1 463.3 117.6 464 112 464C76.65 464 48 435.3 48 400C48 392.6 49.27 385.4 51.59 378.8C21.43 367.4 0 338.2 0 304C0 272.1 18.71 244.5 45.77 231.7C37.15 220.8 32 206.1 32 192C32 161.3 53.59 135.7 82.41 129.4C80.84 123.9 80 118 80 112C80 82.06 100.6 56.92 128.3 49.93C131.3 21.86 155.1 0 184 0zM383.7 49.93C411.4 56.92 432 82.06 432 112C432 118 431.2 123.9 429.6 129.4C458.4 135.7 480 161.3 480 192C480 206.1 474.9 220.8 466.2 231.7C493.3 244.5 512 272.1 512 304C512 338.2 490.6 367.4 460.4 378.8C462.7 385.4 464 392.6 464 400C464 435.3 435.3 464 400 464C394.4 464 388.9 463.3 383.7 461.9C380.7 490.1 356.9 512 328 512C297.1 512 272 486.9 272 456V56C272 25.07 297.1 0 328 0C356.9 0 380.7 21.86 383.7 49.93z\"]\n};\nvar faBrazilianRealSign = {\n  prefix: 'fas',\n  iconName: 'brazilian-real-sign',\n  icon: [512, 512, [], \"e46c\", \"M400 .0003C417.7 .0003 432 14.33 432 32V50.22C444.5 52.52 456.7 56.57 468.2 62.3L478.3 67.38C494.1 75.28 500.5 94.5 492.6 110.3C484.7 126.1 465.5 132.5 449.7 124.6L439.5 119.5C429.6 114.6 418.7 112 407.6 112H405.9C376.1 112 352 136.1 352 165.9C352 187.9 365.4 207.7 385.9 215.9L437.9 236.7C482.7 254.6 512 297.9 512 346.1V349.5C512 400.7 478.4 444.1 432 458.7V480C432 497.7 417.7 512 400 512C382.3 512 368 497.7 368 480V460.6C352.1 457.1 338.6 450.9 325.7 442.3L302.2 426.6C287.5 416.8 283.6 396.1 293.4 382.2C303.2 367.5 323 363.6 337.8 373.4L361.2 389C371.9 396.2 384.6 400 397.5 400C425.4 400 448 377.4 448 349.5V346.1C448 324.1 434.6 304.3 414.1 296.1L362.1 275.3C317.3 257.4 288 214.1 288 165.9C288 114 321.5 69.99 368 54.21V32C368 14.33 382.3 0 400 0L400 .0003zM.0003 64C.0003 46.33 14.33 32 32 32H112C191.5 32 256 96.47 256 176C256 234.8 220.8 285.3 170.3 307.7L221.7 436.1C228.3 452.5 220.3 471.1 203.9 477.7C187.5 484.3 168.9 476.3 162.3 459.9L106.3 320H64V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448L.0003 64zM64 256H112C156.2 256 192 220.2 192 176C192 131.8 156.2 96 112 96H64V256z\"]\n};\nvar faBreadSlice = {\n  prefix: 'fas',\n  iconName: 'bread-slice',\n  icon: [512, 512, [], \"f7ec\", \"M512 176.1C512 203 490.4 224 455.1 224H448v224c0 17.67-14.33 32-32 32H96c-17.67 0-32-14.33-32-32V224H56.89C21.56 224 0 203 0 176.1C0 112 96 32 256 32S512 112 512 176.1z\"]\n};\nvar faBridge = {\n  prefix: 'fas',\n  iconName: 'bridge',\n  icon: [576, 512, [], \"e4c8\", \"M544 32C561.7 32 576 46.33 576 64C576 81.67 561.7 96 544 96H504V160H576V288C522.1 288 480 330.1 480 384V448C480 465.7 465.7 480 448 480H416C398.3 480 384 465.7 384 448V384C384 330.1 341 288 288 288C234.1 288 192 330.1 192 384V448C192 465.7 177.7 480 160 480H128C110.3 480 96 465.7 96 448V384C96 330.1 53.02 288 0 288V160H72V96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H544zM456 96H376V160H456V96zM248 96V160H328V96H248zM200 96H120V160H200V96z\"]\n};\nvar faBridgeCircleCheck = {\n  prefix: 'fas',\n  iconName: 'bridge-circle-check',\n  icon: [640, 512, [], \"e4c9\", \"M576 32C593.7 32 608 46.33 608 64C608 81.67 593.7 96 576 96H536V160H608V232.2C577.6 207.1 538.5 192 496 192C426.9 192 367.1 231.8 338.3 289.7C332.4 288.6 326.3 288 320 288C266.1 288 224 330.1 224 384V448C224 465.7 209.7 480 192 480H160C142.3 480 128 465.7 128 448V384C128 330.1 85.02 288 32 288V160H104V96H64C46.33 96 32 81.67 32 64C32 46.33 46.33 32 64 32H576zM488 96H408V160H488V96zM280 96V160H360V96H280zM232 96H152V160H232V96zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faBridgeCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'bridge-circle-exclamation',\n  icon: [640, 512, [], \"e4ca\", \"M576 32C593.7 32 608 46.33 608 64C608 81.67 593.7 96 576 96H536V160H608V232.2C577.6 207.1 538.5 192 496 192C426.9 192 367.1 231.8 338.3 289.7C332.4 288.6 326.3 288 320 288C266.1 288 224 330.1 224 384V448C224 465.7 209.7 480 192 480H160C142.3 480 128 465.7 128 448V384C128 330.1 85.02 288 32 288V160H104V96H64C46.33 96 32 81.67 32 64C32 46.33 46.33 32 64 32H576zM488 96H408V160H488V96zM280 96V160H360V96H280zM232 96H152V160H232V96zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faBridgeCircleXmark = {\n  prefix: 'fas',\n  iconName: 'bridge-circle-xmark',\n  icon: [640, 512, [], \"e4cb\", \"M576 32C593.7 32 608 46.33 608 64C608 81.67 593.7 96 576 96H536V160H608V232.2C577.6 207.1 538.5 192 496 192C426.9 192 367.1 231.8 338.3 289.7C332.4 288.6 326.3 288 320 288C266.1 288 224 330.1 224 384V448C224 465.7 209.7 480 192 480H160C142.3 480 128 465.7 128 448V384C128 330.1 85.02 288 32 288V160H104V96H64C46.33 96 32 81.67 32 64C32 46.33 46.33 32 64 32H576zM488 96H408V160H488V96zM280 96V160H360V96H280zM232 96H152V160H232V96zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368L555.3 331.3z\"]\n};\nvar faBridgeLock = {\n  prefix: 'fas',\n  iconName: 'bridge-lock',\n  icon: [640, 512, [], \"e4cc\", \"M32 64C32 46.33 46.33 32 64 32H576C593.7 32 608 46.33 608 64C608 81.67 593.7 96 576 96H536V160H528C466.1 160 416 210.1 416 272V296.6C406.1 302.3 397.8 310.7 392.2 320.7C374.6 300.7 348.8 287.1 320 287.1C266.1 287.1 224 330.1 224 384V448C224 465.7 209.7 480 192 480H160C142.3 480 128 465.7 128 448V384C128 330.1 85.02 287.1 32 287.1V159.1H104V95.1H64C46.33 95.1 32 81.67 32 63.1V64zM408 160H488V96H408V160zM360 160V96H280V160H360zM152 160H232V96H152V160zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faBridgeWater = {\n  prefix: 'fas',\n  iconName: 'bridge-water',\n  icon: [576, 512, [], \"e4ce\", \"M.0003 96C.0003 78.33 14.33 64 32 64H544C561.7 64 576 78.33 576 96V131.6C576 147.3 563.3 160 547.6 160C510.2 160 480 190.2 480 227.6V352.5C467.1 352.5 454.2 356.3 443.2 364.1C425.2 376.5 403 384.5 384 384.5L384 384V256C384 202.1 341 160 288 160C234.1 160 192 202.1 192 256V384L191.1 384.5C172.1 384.4 150.8 376.5 132.9 364.1C121.8 356.3 108.9 352.4 96 352.5V227.6C96 190.2 65.75 160 28.44 160C12.74 160 0 147.3 0 131.6L.0003 96zM384 416C410.9 416 439.4 405.2 461.4 389.9L461.5 389.9C473.4 381.4 489.5 382.1 500.7 391.6C515.1 403.5 533.2 412.6 551.3 416.8C568.5 420.8 579.2 438.1 575.2 455.3C571.2 472.5 553.1 483.2 536.7 479.2C512.2 473.4 491.9 462.6 478.5 454.2C449.5 469.7 417 480 384 480C352.1 480 323.4 470.1 303.6 461.1C297.7 458.5 292.5 455.8 288 453.4C283.5 455.8 278.3 458.5 272.4 461.1C252.6 470.1 223.9 480 192 480C158.1 480 126.5 469.7 97.5 454.2C84.13 462.6 63.79 473.4 39.27 479.2C22.06 483.2 4.854 472.5 .8429 455.3C-3.168 438.1 7.533 420.8 24.74 416.8C42.84 412.6 60.96 403.5 75.31 391.6C86.46 382.1 102.6 381.4 114.5 389.9L114.6 389.9C136.7 405.2 165.1 416 192 416C219.5 416 247 405.4 269.5 389.9C280.6 382 295.4 382 306.5 389.9C328.1 405.4 356.5 416 384 416H384z\"]\n};\nvar faBriefcase = {\n  prefix: 'fas',\n  iconName: 'briefcase',\n  icon: [512, 512, [128188], \"f0b1\", \"M320 336c0 8.844-7.156 16-16 16h-96C199.2 352 192 344.8 192 336V288H0v144C0 457.6 22.41 480 48 480h416c25.59 0 48-22.41 48-48V288h-192V336zM464 96H384V48C384 22.41 361.6 0 336 0h-160C150.4 0 128 22.41 128 48V96H48C22.41 96 0 118.4 0 144V256h512V144C512 118.4 489.6 96 464 96zM336 96h-160V48h160V96z\"]\n};\nvar faBriefcaseMedical = {\n  prefix: 'fas',\n  iconName: 'briefcase-medical',\n  icon: [512, 512, [], \"f469\", \"M464 96H384V48C384 21.5 362.5 0 336 0h-160C149.5 0 128 21.5 128 48V96H48C21.5 96 0 117.5 0 144v288C0 458.5 21.5 480 48 480h416c26.5 0 48-21.5 48-48v-288C512 117.5 490.5 96 464 96zM176 48h160V96h-160V48zM368 314c0 8.836-7.164 16-16 16h-54V384c0 8.836-7.164 16-15.1 16h-52c-8.835 0-16-7.164-16-16v-53.1H160c-8.836 0-16-7.164-16-16v-52c0-8.838 7.164-16 16-16h53.1V192c0-8.838 7.165-16 16-16h52c8.836 0 15.1 7.162 15.1 16v54H352c8.836 0 16 7.162 16 16V314z\"]\n};\nvar faBroom = {\n  prefix: 'fas',\n  iconName: 'broom',\n  icon: [640, 512, [129529], \"f51a\", \"M93.13 257.7C71.25 275.1 53 313.5 38.63 355.1L99 333.1c5.75-2.125 10.62 4.749 6.625 9.499L11 454.7C3.75 486.1 0 510.2 0 510.2s206.6 13.62 266.6-34.12c60-47.87 76.63-150.1 76.63-150.1L256.5 216.7C256.5 216.7 153.1 209.1 93.13 257.7zM633.2 12.34c-10.84-13.91-30.91-16.45-44.91-5.624l-225.7 175.6l-34.99-44.06C322.5 131.9 312.5 133.1 309 140.5L283.8 194.1l86.75 109.2l58.75-12.5c8-1.625 11.38-11.12 6.375-17.5l-33.19-41.79l225.2-175.2C641.6 46.38 644.1 26.27 633.2 12.34z\"]\n};\nvar faBroomBall = {\n  prefix: 'fas',\n  iconName: 'broom-ball',\n  icon: [640, 512, [\"quidditch\", \"quidditch-broom-ball\"], \"f458\", \"M495.1 351.1c-44.18 0-79.1 35.72-79.1 79.91c0 44.18 35.82 80.09 79.1 80.09s79.1-35.91 79.1-80.09C575.1 387.7 540.2 351.1 495.1 351.1zM242.7 216.4c-30.16 0-102.9 4.15-149.4 41.34c-22 17.5-40.25 55.75-54.63 97.5l60.38-22.12c.7363-.2715 1.46-.3967 2.151-.3967c3.33 0 5.935 2.885 5.935 6.039c0 1.301-.4426 2.647-1.462 3.856L11 454.7C3.75 487.1 0 510.2 0 510.2S27.07 512 64.45 512c65.94 0 163.1-5.499 202.2-35.89c60-47.75 76.63-150.1 76.63-150.1l-86.75-109.2C256.5 216.7 251.4 216.4 242.7 216.4zM607.1 .0074c-6.863 0-13.78 2.192-19.62 6.719L362.7 182.3l-29.88-37.67c-3.248-4.094-7.892-6.058-12.5-6.058c-5.891 0-11.73 3.204-14.54 9.26L283.8 195.1l86.75 109.1l50.88-10.72c7.883-1.66 12.72-8.546 12.72-15.71c0-3.412-1.096-6.886-3.478-9.89l-28.16-35.5l225.2-175.2c8.102-6.312 12.35-15.75 12.35-25.29C640 14.94 626.3 .0074 607.1 .0074z\"]\n};\nvar faQuidditch = faBroomBall;\nvar faQuidditchBroomBall = faBroomBall;\nvar faBrush = {\n  prefix: 'fas',\n  iconName: 'brush',\n  icon: [384, 512, [], \"f55d\", \"M224 0H336C362.5 0 384 21.49 384 48V256H0V48C0 21.49 21.49 0 48 0H64L96 64L128 0H160L192 64L224 0zM384 288V320C384 355.3 355.3 384 320 384H256V448C256 483.3 227.3 512 192 512C156.7 512 128 483.3 128 448V384H64C28.65 384 0 355.3 0 320V288H384zM192 464C200.8 464 208 456.8 208 448C208 439.2 200.8 432 192 432C183.2 432 176 439.2 176 448C176 456.8 183.2 464 192 464z\"]\n};\nvar faBucket = {\n  prefix: 'fas',\n  iconName: 'bucket',\n  icon: [448, 512, [], \"e4cf\", \"M96 160H48V152C48 68.05 116.1 0 200 0H248C331.9 0 400 68.05 400 152V160H352V152C352 94.56 305.4 48 248 48H200C142.6 48 96 94.56 96 152V160zM.0003 224C.0003 206.3 14.33 192 32 192H416C433.7 192 448 206.3 448 224C448 241.7 433.7 256 416 256H410.9L388.5 469C385.1 493.5 365.4 512 340.8 512H107.2C82.65 512 62.05 493.5 59.48 469L37.05 256H32C14.33 256 0 241.7 0 224H.0003z\"]\n};\nvar faBug = {\n  prefix: 'fas',\n  iconName: 'bug',\n  icon: [512, 512, [], \"f188\", \"M352 96V99.56C352 115.3 339.3 128 323.6 128H188.4C172.7 128 159.1 115.3 159.1 99.56V96C159.1 42.98 202.1 0 255.1 0C309 0 352 42.98 352 96zM41.37 105.4C53.87 92.88 74.13 92.88 86.63 105.4L150.6 169.4C151.3 170 151.9 170.7 152.5 171.4C166.8 164.1 182.9 160 199.1 160H312C329.1 160 345.2 164.1 359.5 171.4C360.1 170.7 360.7 170 361.4 169.4L425.4 105.4C437.9 92.88 458.1 92.88 470.6 105.4C483.1 117.9 483.1 138.1 470.6 150.6L406.6 214.6C405.1 215.3 405.3 215.9 404.6 216.5C410.7 228.5 414.6 241.9 415.7 256H480C497.7 256 512 270.3 512 288C512 305.7 497.7 320 480 320H416C416 344.6 410.5 367.8 400.6 388.6C402.7 389.9 404.8 391.5 406.6 393.4L470.6 457.4C483.1 469.9 483.1 490.1 470.6 502.6C458.1 515.1 437.9 515.1 425.4 502.6L362.3 439.6C337.8 461.4 306.5 475.8 272 479.2V240C272 231.2 264.8 224 255.1 224C247.2 224 239.1 231.2 239.1 240V479.2C205.5 475.8 174.2 461.4 149.7 439.6L86.63 502.6C74.13 515.1 53.87 515.1 41.37 502.6C28.88 490.1 28.88 469.9 41.37 457.4L105.4 393.4C107.2 391.5 109.3 389.9 111.4 388.6C101.5 367.8 96 344.6 96 320H32C14.33 320 0 305.7 0 288C0 270.3 14.33 256 32 256H96.3C97.38 241.9 101.3 228.5 107.4 216.5C106.7 215.9 106 215.3 105.4 214.6L41.37 150.6C28.88 138.1 28.88 117.9 41.37 105.4H41.37z\"]\n};\nvar faBugSlash = {\n  prefix: 'fas',\n  iconName: 'bug-slash',\n  icon: [640, 512, [], \"e490\", \"M239.1 162.8C247.7 160.1 255.7 160 264 160H376C393.1 160 409.2 164.1 423.5 171.4C424.1 170.7 424.7 170 425.4 169.4L489.4 105.4C501.9 92.88 522.1 92.88 534.6 105.4C547.1 117.9 547.1 138.1 534.6 150.6L470.6 214.6C469.1 215.3 469.3 215.9 468.6 216.5C474.7 228.5 478.6 241.9 479.7 256H544C561.7 256 576 270.3 576 288C576 305.7 561.7 320 544 320H480C480 329.9 479.1 339.5 477.4 348.9L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L239.1 162.8zM416 96V99.56C416 115.3 403.3 128 387.6 128H252.4C236.7 128 224 115.3 224 99.56V96C224 42.98 266.1 .001 320 .001C373 .001 416 42.98 416 96V96zM160.3 256C161.1 245.1 163.3 236.3 166.7 227.3L304 335.5V479.2C269.5 475.8 238.2 461.4 213.7 439.6L150.6 502.6C138.1 515.1 117.9 515.1 105.4 502.6C92.88 490.1 92.88 469.9 105.4 457.4L169.4 393.4C171.2 391.5 173.3 389.9 175.4 388.6C165.5 367.8 160 344.6 160 320H96C78.33 320 64 305.7 64 288C64 270.3 78.33 256 96 256H160.3zM336 479.2V360.7L430.8 435.4C405.7 459.6 372.7 475.6 336 479.2V479.2z\"]\n};\nvar faBugs = {\n  prefix: 'fas',\n  iconName: 'bugs',\n  icon: [576, 512, [], \"e4d0\", \"M187.3 135.1H204.3L208.5 115.3C211.1 102.3 223.7 93.86 236.7 96.46C249.7 99.06 258.1 111.7 255.5 124.7L247.5 164.7C245.3 175.9 235.4 183.1 223.1 183.1H191.1V207.3L229.8 216.7C239.3 219.1 246.4 226.9 247.8 236.6L255.8 292.6C257.6 305.7 248.5 317.9 235.4 319.8C222.3 321.6 210.1 312.5 208.2 299.4L202.5 259.4L184.1 254.8C173.2 274.6 152.2 287.1 127.1 287.1C103.8 287.1 82.75 274.6 71.87 254.8L53.48 259.4L47.76 299.4C45.88 312.5 33.73 321.6 20.61 319.8C7.484 317.9-1.633 305.7 .2413 292.6L8.241 236.6C9.621 226.9 16.71 219.1 26.18 216.7L63.1 207.3V183.1H31.1C20.56 183.1 10.71 175.9 8.463 164.7L.4627 124.7C-2.137 111.7 6.292 99.06 19.29 96.46C32.29 93.86 44.93 102.3 47.53 115.3L51.67 135.1H68.65C73.35 124.4 81.36 114.5 91.51 107.4L58.15 33.92C52.67 21.85 58.01 7.625 70.08 2.145C82.15-3.335 96.37 2.007 101.9 14.08L128 71.66L154.1 14.08C159.6 2.007 173.9-3.335 185.9 2.145C197.1 7.625 203.3 21.85 197.9 33.92L164.5 107.4C174.6 114.5 182.6 124.4 187.3 135.1L187.3 135.1zM501.5 322.7L516.2 331.2L530.1 315.3C538.9 305.3 554 304.4 563.1 313.1C573.9 321.9 574.9 337 566.2 346.1L539.2 377.6C531.7 386.2 519.1 388.3 509.2 382.6L481.5 366.6L469.9 386.7L497.9 413.8C504.9 420.6 507.1 430.9 503.5 440L482.4 492.5C477.5 504.8 463.5 510.8 451.2 505.8C438.9 500.9 432.9 486.9 437.9 474.6L452.9 437.1L439.3 423.9C419.1 435.6 395 436.7 374.1 424.6C353.1 412.5 341.6 390.4 342.1 367.8L323.8 362.6L298.9 394.4C290.7 404.8 275.6 406.6 265.2 398.4C254.8 390.3 252.9 375.2 261.1 364.7L296 320.2C302.1 312.6 312.1 309.3 321.5 311.1L359 322.7L370.6 302.6L342.9 286.6C333 280.8 328.5 268.9 332.2 258.1L345.3 219.4C349.5 206.9 363.1 200.2 375.7 204.4C388.2 208.7 394.1 222.3 390.7 234.8L383.1 254.8L398.7 263.3C408.5 255.6 420.4 251 432.8 249.1L440.6 169.7C441.9 156.5 453.6 146.8 466.8 148.1C480 149.4 489.7 161.1 488.4 174.3L482.2 237.3L533.7 200.5C544.5 192.8 559.4 195.3 567.2 206C574.9 216.8 572.4 231.8 561.6 239.5L495.1 286.5C501.2 297.7 503.2 310.3 501.5 322.7V322.7z\"]\n};\nvar faBuilding = {\n  prefix: 'fas',\n  iconName: 'building',\n  icon: [384, 512, [61687, 127970], \"f1ad\", \"M336 0C362.5 0 384 21.49 384 48V464C384 490.5 362.5 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272z\"]\n};\nvar faBuildingCircleArrowRight = {\n  prefix: 'fas',\n  iconName: 'building-circle-arrow-right',\n  icon: [640, 512, [], \"e4d1\", \"M0 48C0 21.49 21.49 0 48 0H336C362.5 0 384 21.49 384 48V232.2C344.9 264.5 320 313.3 320 368C320 417.5 340.4 462.2 373.3 494.2C364.5 505.1 351.1 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48zM80 224C71.16 224 64 231.2 64 240V272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80zM160 272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176C167.2 224 160 231.2 160 240V272zM272 224C263.2 224 256 231.2 256 240V272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272zM64 144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80C71.16 96 64 103.2 64 112V144zM176 96C167.2 96 160 103.2 160 112V144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176zM256 144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272C263.2 96 256 103.2 256 112V144zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM492.7 323.3L521.4 352H432C423.2 352 416 359.2 416 368C416 376.8 423.2 384 432 384H521.4L492.7 412.7C486.4 418.9 486.4 429.1 492.7 435.3C498.9 441.6 509.1 441.6 515.3 435.3L571.3 379.3C577.6 373.1 577.6 362.9 571.3 356.7L515.3 300.7C509.1 294.4 498.9 294.4 492.7 300.7C486.4 306.9 486.4 317.1 492.7 323.3V323.3z\"]\n};\nvar faBuildingCircleCheck = {\n  prefix: 'fas',\n  iconName: 'building-circle-check',\n  icon: [640, 512, [], \"e4d2\", \"M336 0C362.5 0 384 21.49 384 48V232.2C344.9 264.5 320 313.3 320 368C320 417.5 340.4 462.2 373.3 494.2C364.5 505.1 351.1 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faBuildingCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'building-circle-exclamation',\n  icon: [640, 512, [], \"e4d3\", \"M336 0C362.5 0 384 21.49 384 48V232.2C344.9 264.5 320 313.3 320 368C320 417.5 340.4 462.2 373.3 494.2C364.5 505.1 351.1 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faBuildingCircleXmark = {\n  prefix: 'fas',\n  iconName: 'building-circle-xmark',\n  icon: [640, 512, [], \"e4d4\", \"M336 0C362.5 0 384 21.49 384 48V232.2C344.9 264.5 320 313.3 320 368C320 417.5 340.4 462.2 373.3 494.2C364.5 505.1 351.1 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368L555.3 331.3z\"]\n};\nvar faBuildingColumns = {\n  prefix: 'fas',\n  iconName: 'building-columns',\n  icon: [512, 512, [\"bank\", \"institution\", \"museum\", \"university\"], \"f19c\", \"M243.4 2.587C251.4-.8625 260.6-.8625 268.6 2.587L492.6 98.59C506.6 104.6 514.4 119.6 511.3 134.4C508.3 149.3 495.2 159.1 479.1 160V168C479.1 181.3 469.3 192 455.1 192H55.1C42.74 192 31.1 181.3 31.1 168V160C16.81 159.1 3.708 149.3 .6528 134.4C-2.402 119.6 5.429 104.6 19.39 98.59L243.4 2.587zM256 128C273.7 128 288 113.7 288 96C288 78.33 273.7 64 256 64C238.3 64 224 78.33 224 96C224 113.7 238.3 128 256 128zM127.1 416H167.1V224H231.1V416H280V224H344V416H384V224H448V420.3C448.6 420.6 449.2 420.1 449.8 421.4L497.8 453.4C509.5 461.2 514.7 475.8 510.6 489.3C506.5 502.8 494.1 512 480 512H31.1C17.9 512 5.458 502.8 1.372 489.3C-2.715 475.8 2.515 461.2 14.25 453.4L62.25 421.4C62.82 420.1 63.41 420.6 63.1 420.3V224H127.1V416z\"]\n};\nvar faBank = faBuildingColumns;\nvar faInstitution = faBuildingColumns;\nvar faMuseum = faBuildingColumns;\nvar faUniversity = faBuildingColumns;\nvar faBuildingFlag = {\n  prefix: 'fas',\n  iconName: 'building-flag',\n  icon: [640, 512, [], \"e4d5\", \"M336 0C362.5 0 384 21.49 384 48V464C384 490.5 362.5 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272zM448 0C465.7 0 480 14.33 480 32H624C632.8 32 640 39.16 640 48V176C640 184.8 632.8 192 624 192H480V512H416V32C416 14.33 430.3 0 448 0z\"]\n};\nvar faBuildingLock = {\n  prefix: 'fas',\n  iconName: 'building-lock',\n  icon: [576, 512, [], \"e4d6\", \"M336 0C362.5 0 384 21.49 384 48V193.6C364.2 213.8 352 241.5 352 272V296.6C332.9 307.6 320 328.3 320 352V480C320 491.7 323.1 502.6 328.6 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272zM464 192C508.2 192 544 227.8 544 272V320C561.7 320 576 334.3 576 352V480C576 497.7 561.7 512 544 512H384C366.3 512 352 497.7 352 480V352C352 334.3 366.3 320 384 320V272C384 227.8 419.8 192 464 192zM464 240C446.3 240 432 254.3 432 272V320H496V272C496 254.3 481.7 240 464 240z\"]\n};\nvar faBuildingNgo = {\n  prefix: 'fas',\n  iconName: 'building-ngo',\n  icon: [384, 512, [], \"e4d7\", \"M320 112V144C320 152.8 312.8 160 304 160C295.2 160 288 152.8 288 144V112C288 103.2 295.2 96 304 96C312.8 96 320 103.2 320 112zM336 0C362.5 0 384 21.49 384 48V464C384 490.5 362.5 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM168 64C159.2 64 152 71.16 152 80V168C152 181.3 162.7 192 176 192H208C221.3 192 232 181.3 232 168V144C232 135.2 224.8 128 216 128C207.2 128 200 135.2 200 144V160H184V96H216C224.8 96 232 88.84 232 80C232 71.16 224.8 64 216 64H168zM256 144C256 170.5 277.5 192 304 192C330.5 192 352 170.5 352 144V112C352 85.49 330.5 64 304 64C277.5 64 256 85.49 256 112V144zM61.31 71.12C57.4 65.26 50.11 62.64 43.36 64.69C36.62 66.73 32 72.95 32 80V176C32 184.8 39.16 192 48 192C56.84 192 64 184.8 64 176V132.8L98.69 184.9C102.6 190.7 109.9 193.4 116.6 191.3C123.4 189.3 128 183.1 128 176V80C128 71.16 120.8 64 112 64C103.2 64 96 71.16 96 80V123.2L61.31 71.12z\"]\n};\nvar faBuildingShield = {\n  prefix: 'fas',\n  iconName: 'building-shield',\n  icon: [576, 512, [], \"e4d8\", \"M0 48C0 21.49 21.49 0 48 0H336C362.5 0 384 21.49 384 48V207L341.6 224H272C263.2 224 256 231.2 256 240V304C256 304.9 256.1 305.7 256.2 306.6C258.5 364.7 280.3 451.4 354.9 508.1C349.1 510.6 342.7 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48zM80 224C71.16 224 64 231.2 64 240V272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80zM160 272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176C167.2 224 160 231.2 160 240V272zM64 144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80C71.16 96 64 103.2 64 112V144zM176 96C167.2 96 160 103.2 160 112V144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176zM256 144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272C263.2 96 256 103.2 256 112V144zM423.1 225.7C428.8 223.4 435.2 223.4 440.9 225.7L560.9 273.7C570 277.4 576 286.2 576 296C576 359.3 550.1 464.8 441.2 510.2C435.3 512.6 428.7 512.6 422.8 510.2C313.9 464.8 288 359.3 288 296C288 286.2 293.1 277.4 303.1 273.7L423.1 225.7zM432 273.8V461.7C500.2 428.7 523.5 362.7 527.4 311.1L432 273.8z\"]\n};\nvar faBuildingUn = {\n  prefix: 'fas',\n  iconName: 'building-un',\n  icon: [384, 512, [], \"e4d9\", \"M336 0C362.5 0 384 21.49 384 48V464C384 490.5 362.5 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM237.3 71.12C233.4 65.26 226.1 62.64 219.4 64.69C212.6 66.73 208 72.95 208 80V176C208 184.8 215.2 192 224 192C232.8 192 240 184.8 240 176V132.8L274.7 184.9C278.6 190.7 285.9 193.4 292.6 191.3C299.4 189.3 304 183.1 304 176V80C304 71.16 296.8 64 288 64C279.2 64 272 71.16 272 80V123.2L237.3 71.12zM112 80C112 71.16 104.8 64 96 64C87.16 64 80 71.16 80 80V144C80 170.5 101.5 192 128 192C154.5 192 176 170.5 176 144V80C176 71.16 168.8 64 160 64C151.2 64 144 71.16 144 80V144C144 152.8 136.8 160 128 160C119.2 160 112 152.8 112 144V80z\"]\n};\nvar faBuildingUser = {\n  prefix: 'fas',\n  iconName: 'building-user',\n  icon: [640, 512, [], \"e4da\", \"M336 0C362.5 0 384 21.49 384 48V367.8C345.8 389.2 320 430 320 476.9C320 489.8 323.6 501.8 329.9 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48C0 21.49 21.49 0 48 0H336zM64 272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80C71.16 224 64 231.2 64 240V272zM176 224C167.2 224 160 231.2 160 240V272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176zM256 272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272C263.2 224 256 231.2 256 240V272zM80 96C71.16 96 64 103.2 64 112V144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80zM160 144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176C167.2 96 160 103.2 160 112V144zM272 96C263.2 96 256 103.2 256 112V144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272zM576 272C576 316.2 540.2 352 496 352C451.8 352 416 316.2 416 272C416 227.8 451.8 192 496 192C540.2 192 576 227.8 576 272zM352 477.1C352 425.7 393.7 384 445.1 384H546.9C598.3 384 640 425.7 640 477.1C640 496.4 624.4 512 605.1 512H386.9C367.6 512 352 496.4 352 477.1V477.1z\"]\n};\nvar faBuildingWheat = {\n  prefix: 'fas',\n  iconName: 'building-wheat',\n  icon: [640, 512, [], \"e4db\", \"M0 48C0 21.49 21.49 0 48 0H336C362.5 0 384 21.49 384 48V464C384 490.5 362.5 512 336 512H240V432C240 405.5 218.5 384 192 384C165.5 384 144 405.5 144 432V512H48C21.49 512 0 490.5 0 464V48zM80 224C71.16 224 64 231.2 64 240V272C64 280.8 71.16 288 80 288H112C120.8 288 128 280.8 128 272V240C128 231.2 120.8 224 112 224H80zM160 272C160 280.8 167.2 288 176 288H208C216.8 288 224 280.8 224 272V240C224 231.2 216.8 224 208 224H176C167.2 224 160 231.2 160 240V272zM272 224C263.2 224 256 231.2 256 240V272C256 280.8 263.2 288 272 288H304C312.8 288 320 280.8 320 272V240C320 231.2 312.8 224 304 224H272zM64 144C64 152.8 71.16 160 80 160H112C120.8 160 128 152.8 128 144V112C128 103.2 120.8 96 112 96H80C71.16 96 64 103.2 64 112V144zM176 96C167.2 96 160 103.2 160 112V144C160 152.8 167.2 160 176 160H208C216.8 160 224 152.8 224 144V112C224 103.2 216.8 96 208 96H176zM256 144C256 152.8 263.2 160 272 160H304C312.8 160 320 152.8 320 144V112C320 103.2 312.8 96 304 96H272C263.2 96 256 103.2 256 112V144zM640 192V208C640 252.2 604.2 288 560 288H544V272C544 227.8 579.8 192 624 192H640zM560 400H544V384C544 339.8 579.8 304 624 304H640V320C640 364.2 604.2 400 560 400zM560 512H544V496C544 451.8 579.8 416 624 416H640V432C640 476.2 604.2 512 560 512zM512 496V512H496C451.8 512 416 476.2 416 432V416H432C476.2 416 512 451.8 512 496zM496 400C451.8 400 416 364.2 416 320V304H432C476.2 304 512 339.8 512 384V400H496zM512 272V288H496C451.8 288 416 252.2 416 208V192H432C476.2 192 512 227.8 512 272zM528 32C541.3 32 552 42.75 552 56V160C552 173.3 541.3 184 528 184C514.7 184 504 173.3 504 160V56C504 42.75 514.7 32 528 32zM624 128C624 141.3 613.3 152 600 152C586.7 152 576 141.3 576 128V96C576 82.75 586.7 72 600 72C613.3 72 624 82.75 624 96V128zM456 72C469.3 72 480 82.75 480 96V128C480 141.3 469.3 152 456 152C442.7 152 432 141.3 432 128V96C432 82.75 442.7 72 456 72z\"]\n};\nvar faBullhorn = {\n  prefix: 'fas',\n  iconName: 'bullhorn',\n  icon: [512, 512, [128363, 128226], \"f0a1\", \"M480 179.6C498.6 188.4 512 212.1 512 240C512 267.9 498.6 291.6 480 300.4V448C480 460.9 472.2 472.6 460.2 477.6C448.3 482.5 434.5 479.8 425.4 470.6L381.7 426.1C333.7 378.1 268.6 352 200.7 352H192V480C192 497.7 177.7 512 160 512H96C78.33 512 64 497.7 64 480V352C28.65 352 0 323.3 0 288V192C0 156.7 28.65 128 64 128H200.7C268.6 128 333.7 101 381.7 53.02L425.4 9.373C434.5 .2215 448.3-2.516 460.2 2.437C472.2 7.39 480 19.06 480 32V179.6zM200.7 192H192V288H200.7C280.5 288 357.2 317.8 416 371.3V108.7C357.2 162.2 280.5 192 200.7 192V192z\"]\n};\nvar faBullseye = {\n  prefix: 'fas',\n  iconName: 'bullseye',\n  icon: [512, 512, [], \"f140\", \"M288 256C288 273.7 273.7 288 256 288C238.3 288 224 273.7 224 256C224 238.3 238.3 224 256 224C273.7 224 288 238.3 288 256zM112 256C112 176.5 176.5 112 256 112C335.5 112 400 176.5 400 256C400 335.5 335.5 400 256 400C176.5 400 112 335.5 112 256zM256 336C300.2 336 336 300.2 336 256C336 211.8 300.2 176 256 176C211.8 176 176 211.8 176 256C176 300.2 211.8 336 256 336zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 64C149.1 64 64 149.1 64 256C64 362 149.1 448 256 448C362 448 448 362 448 256C448 149.1 362 64 256 64z\"]\n};\nvar faBurger = {\n  prefix: 'fas',\n  iconName: 'burger',\n  icon: [512, 512, [\"hamburger\"], \"f805\", \"M481.9 270.1C490.9 279.1 496 291.3 496 304C496 316.7 490.9 328.9 481.9 337.9C472.9 346.9 460.7 352 448 352H64C51.27 352 39.06 346.9 30.06 337.9C21.06 328.9 16 316.7 16 304C16 291.3 21.06 279.1 30.06 270.1C39.06 261.1 51.27 256 64 256H448C460.7 256 472.9 261.1 481.9 270.1zM475.3 388.7C478.3 391.7 480 395.8 480 400V416C480 432.1 473.3 449.3 461.3 461.3C449.3 473.3 432.1 480 416 480H96C79.03 480 62.75 473.3 50.75 461.3C38.74 449.3 32 432.1 32 416V400C32 395.8 33.69 391.7 36.69 388.7C39.69 385.7 43.76 384 48 384H464C468.2 384 472.3 385.7 475.3 388.7zM50.39 220.8C45.93 218.6 42.03 215.5 38.97 211.6C35.91 207.7 33.79 203.2 32.75 198.4C31.71 193.5 31.8 188.5 32.99 183.7C54.98 97.02 146.5 32 256 32C365.5 32 457 97.02 479 183.7C480.2 188.5 480.3 193.5 479.2 198.4C478.2 203.2 476.1 207.7 473 211.6C469.1 215.5 466.1 218.6 461.6 220.8C457.2 222.9 452.3 224 447.3 224H64.67C59.73 224 54.84 222.9 50.39 220.8zM372.7 116.7C369.7 119.7 368 123.8 368 128C368 131.2 368.9 134.3 370.7 136.9C372.5 139.5 374.1 141.6 377.9 142.8C380.8 143.1 384 144.3 387.1 143.7C390.2 143.1 393.1 141.6 395.3 139.3C397.6 137.1 399.1 134.2 399.7 131.1C400.3 128 399.1 124.8 398.8 121.9C397.6 118.1 395.5 116.5 392.9 114.7C390.3 112.9 387.2 111.1 384 111.1C379.8 111.1 375.7 113.7 372.7 116.7V116.7zM244.7 84.69C241.7 87.69 240 91.76 240 96C240 99.16 240.9 102.3 242.7 104.9C244.5 107.5 246.1 109.6 249.9 110.8C252.8 111.1 256 112.3 259.1 111.7C262.2 111.1 265.1 109.6 267.3 107.3C269.6 105.1 271.1 102.2 271.7 99.12C272.3 96.02 271.1 92.8 270.8 89.88C269.6 86.95 267.5 84.45 264.9 82.7C262.3 80.94 259.2 79.1 256 79.1C251.8 79.1 247.7 81.69 244.7 84.69V84.69zM116.7 116.7C113.7 119.7 112 123.8 112 128C112 131.2 112.9 134.3 114.7 136.9C116.5 139.5 118.1 141.6 121.9 142.8C124.8 143.1 128 144.3 131.1 143.7C134.2 143.1 137.1 141.6 139.3 139.3C141.6 137.1 143.1 134.2 143.7 131.1C144.3 128 143.1 124.8 142.8 121.9C141.6 118.1 139.5 116.5 136.9 114.7C134.3 112.9 131.2 111.1 128 111.1C123.8 111.1 119.7 113.7 116.7 116.7L116.7 116.7z\"]\n};\nvar faHamburger = faBurger;\nvar faBurst = {\n  prefix: 'fas',\n  iconName: 'burst',\n  icon: [512, 512, [], \"e4dc\", \"M200.9 116.2L233.2 16.6C236.4 6.706 245.6 .001 256 .001C266.4 .001 275.6 6.706 278.8 16.6L313.3 123.1L383.8 97.45C392.6 94.26 402.4 96.43 408.1 103C415.6 109.6 417.7 119.4 414.6 128.2L388.9 198.7L495.4 233.2C505.3 236.4 512 245.6 512 256C512 266.4 505.3 275.6 495.4 278.8L392.3 312.2L445.2 412.8C450.1 422.1 448.4 433.5 440.1 440.1C433.5 448.4 422.1 450.1 412.8 445.2L312.2 392.3L278.8 495.4C275.6 505.3 266.4 512 256 512C245.6 512 236.4 505.3 233.2 495.4L199.8 392.3L99.17 445.2C89.87 450.1 78.46 448.4 71.03 440.1C63.6 433.5 61.87 422.1 66.76 412.8L119.7 312.2L16.6 278.8C6.705 275.6 .0003 266.4 .0003 256C.0003 245.6 6.705 236.4 16.6 233.2L116.2 200.9L4.208 37.57C-2.33 28.04-1.143 15.2 7.03 7.03C15.2-1.144 28.04-2.33 37.57 4.208L200.9 116.2z\"]\n};\nvar faBus = {\n  prefix: 'fas',\n  iconName: 'bus',\n  icon: [576, 512, [128653], \"f207\", \"M288 0C422.4 0 512 35.2 512 80V128C529.7 128 544 142.3 544 160V224C544 241.7 529.7 256 512 256L512 416C512 433.7 497.7 448 480 448V480C480 497.7 465.7 512 448 512H416C398.3 512 384 497.7 384 480V448H192V480C192 497.7 177.7 512 160 512H128C110.3 512 96 497.7 96 480V448C78.33 448 64 433.7 64 416L64 256C46.33 256 32 241.7 32 224V160C32 142.3 46.33 128 64 128V80C64 35.2 153.6 0 288 0zM128 256C128 273.7 142.3 288 160 288H272V128H160C142.3 128 128 142.3 128 160V256zM304 288H416C433.7 288 448 273.7 448 256V160C448 142.3 433.7 128 416 128H304V288zM144 400C161.7 400 176 385.7 176 368C176 350.3 161.7 336 144 336C126.3 336 112 350.3 112 368C112 385.7 126.3 400 144 400zM432 400C449.7 400 464 385.7 464 368C464 350.3 449.7 336 432 336C414.3 336 400 350.3 400 368C400 385.7 414.3 400 432 400zM368 64H208C199.2 64 192 71.16 192 80C192 88.84 199.2 96 208 96H368C376.8 96 384 88.84 384 80C384 71.16 376.8 64 368 64z\"]\n};\nvar faBusSimple = {\n  prefix: 'fas',\n  iconName: 'bus-simple',\n  icon: [448, 512, [\"bus-alt\"], \"f55e\", \"M224 0C348.8 0 448 35.2 448 80V416C448 433.7 433.7 448 416 448V480C416 497.7 401.7 512 384 512H352C334.3 512 320 497.7 320 480V448H128V480C128 497.7 113.7 512 96 512H64C46.33 512 32 497.7 32 480V448C14.33 448 0 433.7 0 416V80C0 35.2 99.19 0 224 0zM64 256C64 273.7 78.33 288 96 288H352C369.7 288 384 273.7 384 256V128C384 110.3 369.7 96 352 96H96C78.33 96 64 110.3 64 128V256zM80 400C97.67 400 112 385.7 112 368C112 350.3 97.67 336 80 336C62.33 336 48 350.3 48 368C48 385.7 62.33 400 80 400zM368 400C385.7 400 400 385.7 400 368C400 350.3 385.7 336 368 336C350.3 336 336 350.3 336 368C336 385.7 350.3 400 368 400z\"]\n};\nvar faBusAlt = faBusSimple;\nvar faBusinessTime = {\n  prefix: 'fas',\n  iconName: 'business-time',\n  icon: [640, 512, [\"briefcase-clock\"], \"f64a\", \"M496 224C416.4 224 352 288.4 352 368s64.38 144 144 144s144-64.38 144-144S575.6 224 496 224zM544 384h-54.25C484.4 384 480 379.6 480 374.3V304C480 295.2 487.2 288 496 288C504.8 288 512 295.2 512 304V352h32c8.838 0 16 7.162 16 16C560 376.8 552.8 384 544 384zM320.1 352H208C199.2 352 192 344.8 192 336V288H0v144C0 457.6 22.41 480 48 480h312.2C335.1 449.6 320 410.5 320 368C320 362.6 320.5 357.3 320.1 352zM496 192c5.402 0 10.72 .3301 16 .8066V144C512 118.4 489.6 96 464 96H384V48C384 22.41 361.6 0 336 0h-160C150.4 0 128 22.41 128 48V96H48C22.41 96 0 118.4 0 144V256h360.2C392.5 216.9 441.3 192 496 192zM336 96h-160V48h160V96z\"]\n};\nvar faBriefcaseClock = faBusinessTime;\nvar faC = {\n  prefix: 'fas',\n  iconName: 'c',\n  icon: [384, 512, [99], \"43\", \"M352 359.8c22.46 0 31.1 19.53 31.1 31.99c0 23.14-66.96 88.23-164.5 88.23c-137.1 0-219.4-117.8-219.4-224c0-103.8 79.87-223.1 219.4-223.1c99.47 0 164.5 66.12 164.5 88.23c0 12.27-9.527 32.01-32.01 32.01c-31.32 0-45.8-56.25-132.5-56.25c-97.99 0-155.4 84.59-155.4 159.1c0 74.03 56.42 160 155.4 160C306.5 416 320.5 359.8 352 359.8z\"]\n};\nvar faCakeCandles = {\n  prefix: 'fas',\n  iconName: 'cake-candles',\n  icon: [448, 512, [127874, \"birthday-cake\", \"cake\"], \"f1fd\", \"M352 111.1c22.09 0 40-17.88 40-39.97S352 0 352 0s-40 49.91-40 72S329.9 111.1 352 111.1zM224 111.1c22.09 0 40-17.88 40-39.97S224 0 224 0S184 49.91 184 72S201.9 111.1 224 111.1zM383.1 223.1L384 160c0-8.836-7.164-16-16-16h-32C327.2 144 320 151.2 320 160v64h-64V160c0-8.836-7.164-16-16-16h-32C199.2 144 192 151.2 192 160v64H128V160c0-8.836-7.164-16-16-16h-32C71.16 144 64 151.2 64 160v63.97c-35.35 0-64 28.65-64 63.1v68.7c9.814 6.102 21.39 11.33 32 11.33c20.64 0 45.05-19.73 52.7-27.33c6.25-6.219 16.34-6.219 22.59 0C114.1 348.3 139.4 367.1 160 367.1s45.05-19.73 52.7-27.33c6.25-6.219 16.34-6.219 22.59 0C242.1 348.3 267.4 367.1 288 367.1s45.05-19.73 52.7-27.33c6.25-6.219 16.34-6.219 22.59 0C370.1 348.3 395.4 367.1 416 367.1c10.61 0 22.19-5.227 32-11.33V287.1C448 252.6 419.3 223.1 383.1 223.1zM352 373.3c-13.75 10.95-38.03 26.66-64 26.66s-50.25-15.7-64-26.66c-13.75 10.95-38.03 26.66-64 26.66s-50.25-15.7-64-26.66c-13.75 10.95-38.03 26.66-64 26.66c-11.27 0-22.09-3.121-32-7.377v87.38C0 497.7 14.33 512 32 512h384c17.67 0 32-14.33 32-32v-87.38c-9.91 4.256-20.73 7.377-32 7.377C390 399.1 365.8 384.3 352 373.3zM96 111.1c22.09 0 40-17.88 40-39.97S96 0 96 0S56 49.91 56 72S73.91 111.1 96 111.1z\"]\n};\nvar faBirthdayCake = faCakeCandles;\nvar faCake = faCakeCandles;\nvar faCalculator = {\n  prefix: 'fas',\n  iconName: 'calculator',\n  icon: [384, 512, [128425], \"f1ec\", \"M336 0h-288C22.38 0 0 22.38 0 48v416C0 489.6 22.38 512 48 512h288c25.62 0 48-22.38 48-48v-416C384 22.38 361.6 0 336 0zM64 208C64 199.2 71.2 192 80 192h32C120.8 192 128 199.2 128 208v32C128 248.8 120.8 256 112 256h-32C71.2 256 64 248.8 64 240V208zM64 304C64 295.2 71.2 288 80 288h32C120.8 288 128 295.2 128 304v32C128 344.8 120.8 352 112 352h-32C71.2 352 64 344.8 64 336V304zM224 432c0 8.801-7.199 16-16 16h-128C71.2 448 64 440.8 64 432v-32C64 391.2 71.2 384 80 384h128c8.801 0 16 7.199 16 16V432zM224 336c0 8.801-7.199 16-16 16h-32C167.2 352 160 344.8 160 336v-32C160 295.2 167.2 288 176 288h32C216.8 288 224 295.2 224 304V336zM224 240C224 248.8 216.8 256 208 256h-32C167.2 256 160 248.8 160 240v-32C160 199.2 167.2 192 176 192h32C216.8 192 224 199.2 224 208V240zM320 432c0 8.801-7.199 16-16 16h-32c-8.799 0-16-7.199-16-16v-32c0-8.801 7.201-16 16-16h32c8.801 0 16 7.199 16 16V432zM320 336c0 8.801-7.199 16-16 16h-32c-8.799 0-16-7.199-16-16v-32C256 295.2 263.2 288 272 288h32C312.8 288 320 295.2 320 304V336zM320 240C320 248.8 312.8 256 304 256h-32C263.2 256 256 248.8 256 240v-32C256 199.2 263.2 192 272 192h32C312.8 192 320 199.2 320 208V240zM320 144C320 152.8 312.8 160 304 160h-224C71.2 160 64 152.8 64 144v-64C64 71.2 71.2 64 80 64h224C312.8 64 320 71.2 320 80V144z\"]\n};\nvar faCalendar = {\n  prefix: 'fas',\n  iconName: 'calendar',\n  icon: [448, 512, [128198, 128197], \"f133\", \"M96 32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32zM448 464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192H448V464z\"]\n};\nvar faCalendarCheck = {\n  prefix: 'fas',\n  iconName: 'calendar-check',\n  icon: [448, 512, [], \"f274\", \"M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM328.1 304.1C338.3 295.6 338.3 280.4 328.1 271C319.6 261.7 304.4 261.7 295 271L200 366.1L152.1 319C143.6 309.7 128.4 309.7 119 319C109.7 328.4 109.7 343.6 119 352.1L183 416.1C192.4 426.3 207.6 426.3 216.1 416.1L328.1 304.1z\"]\n};\nvar faCalendarDay = {\n  prefix: 'fas',\n  iconName: 'calendar-day',\n  icon: [448, 512, [], \"f783\", \"M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM80 256C71.16 256 64 263.2 64 272V368C64 376.8 71.16 384 80 384H176C184.8 384 192 376.8 192 368V272C192 263.2 184.8 256 176 256H80z\"]\n};\nvar faCalendarDays = {\n  prefix: 'fas',\n  iconName: 'calendar-days',\n  icon: [448, 512, [\"calendar-alt\"], \"f073\", \"M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM64 304C64 312.8 71.16 320 80 320H112C120.8 320 128 312.8 128 304V272C128 263.2 120.8 256 112 256H80C71.16 256 64 263.2 64 272V304zM192 304C192 312.8 199.2 320 208 320H240C248.8 320 256 312.8 256 304V272C256 263.2 248.8 256 240 256H208C199.2 256 192 263.2 192 272V304zM336 256C327.2 256 320 263.2 320 272V304C320 312.8 327.2 320 336 320H368C376.8 320 384 312.8 384 304V272C384 263.2 376.8 256 368 256H336zM64 432C64 440.8 71.16 448 80 448H112C120.8 448 128 440.8 128 432V400C128 391.2 120.8 384 112 384H80C71.16 384 64 391.2 64 400V432zM208 384C199.2 384 192 391.2 192 400V432C192 440.8 199.2 448 208 448H240C248.8 448 256 440.8 256 432V400C256 391.2 248.8 384 240 384H208zM320 432C320 440.8 327.2 448 336 448H368C376.8 448 384 440.8 384 432V400C384 391.2 376.8 384 368 384H336C327.2 384 320 391.2 320 400V432z\"]\n};\nvar faCalendarAlt = faCalendarDays;\nvar faCalendarMinus = {\n  prefix: 'fas',\n  iconName: 'calendar-minus',\n  icon: [448, 512, [], \"f272\", \"M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM312 376C325.3 376 336 365.3 336 352C336 338.7 325.3 328 312 328H136C122.7 328 112 338.7 112 352C112 365.3 122.7 376 136 376H312z\"]\n};\nvar faCalendarPlus = {\n  prefix: 'fas',\n  iconName: 'calendar-plus',\n  icon: [448, 512, [], \"f271\", \"M96 32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32zM448 464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192H448V464zM200 272V328H144C130.7 328 120 338.7 120 352C120 365.3 130.7 376 144 376H200V432C200 445.3 210.7 456 224 456C237.3 456 248 445.3 248 432V376H304C317.3 376 328 365.3 328 352C328 338.7 317.3 328 304 328H248V272C248 258.7 237.3 248 224 248C210.7 248 200 258.7 200 272z\"]\n};\nvar faCalendarWeek = {\n  prefix: 'fas',\n  iconName: 'calendar-week',\n  icon: [448, 512, [], \"f784\", \"M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM80 256C71.16 256 64 263.2 64 272V336C64 344.8 71.16 352 80 352H368C376.8 352 384 344.8 384 336V272C384 263.2 376.8 256 368 256H80z\"]\n};\nvar faCalendarXmark = {\n  prefix: 'fas',\n  iconName: 'calendar-xmark',\n  icon: [448, 512, [\"calendar-times\"], \"f273\", \"M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM304.1 304.1C314.3 295.6 314.3 280.4 304.1 271C295.6 261.7 280.4 261.7 271 271L224 318.1L176.1 271C167.6 261.7 152.4 261.7 143 271C133.7 280.4 133.7 295.6 143 304.1L190.1 352L143 399C133.7 408.4 133.7 423.6 143 432.1C152.4 442.3 167.6 442.3 176.1 432.1L224 385.9L271 432.1C280.4 442.3 295.6 442.3 304.1 432.1C314.3 423.6 314.3 408.4 304.1 399L257.9 352L304.1 304.1z\"]\n};\nvar faCalendarTimes = faCalendarXmark;\nvar faCamera = {\n  prefix: 'fas',\n  iconName: 'camera',\n  icon: [512, 512, [62258, \"camera-alt\"], \"f030\", \"M194.6 32H317.4C338.1 32 356.4 45.22 362.9 64.82L373.3 96H448C483.3 96 512 124.7 512 160V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V160C0 124.7 28.65 96 64 96H138.7L149.1 64.82C155.6 45.22 173.9 32 194.6 32H194.6zM256 384C309 384 352 341 352 288C352 234.1 309 192 256 192C202.1 192 160 234.1 160 288C160 341 202.1 384 256 384z\"]\n};\nvar faCameraAlt = faCamera;\nvar faCameraRetro = {\n  prefix: 'fas',\n  iconName: 'camera-retro',\n  icon: [512, 512, [128247], \"f083\", \"M64 64V48C64 39.16 71.16 32 80 32H144C152.8 32 160 39.16 160 48V64H192L242.5 38.76C251.4 34.31 261.2 32 271.1 32H448C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V128C0 92.65 28.65 64 64 64zM220.6 121.2C211.7 125.7 201.9 128 192 128H64V192H178.8C200.8 176.9 227.3 168 256 168C284.7 168 311.2 176.9 333.2 192H448V96H271.1L220.6 121.2zM256 216C207.4 216 168 255.4 168 304C168 352.6 207.4 392 256 392C304.6 392 344 352.6 344 304C344 255.4 304.6 216 256 216z\"]\n};\nvar faCameraRotate = {\n  prefix: 'fas',\n  iconName: 'camera-rotate',\n  icon: [512, 512, [], \"e0d8\", \"M464 96h-88l-12.38-32.88C356.6 44.38 338.8 32 318.8 32h-125.5c-20 0-38 12.38-45 31.12L136 96H48C21.5 96 0 117.5 0 144v288C0 458.5 21.5 480 48 480h416c26.5 0 48-21.5 48-48v-288C512 117.5 490.5 96 464 96zM356.9 366.8C332.4 398.1 295.7 416 256 416c-31.78 0-61.37-11.94-84.58-32.61l-19.28 19.29C143.2 411.6 128 405.3 128 392.7V316.3c0-5.453 4.359-9.838 9.775-9.99h76.98c12.35 .3027 18.47 15.27 9.654 24.09l-19.27 19.28C219.3 361.4 237.1 368 256 368c24.8 0 47.78-11.22 63.08-30.78c8.172-10.44 23.25-12.28 33.69-4.125S365.1 356.3 356.9 366.8zM384 259.7c0 5.453-4.359 9.838-9.775 9.99h-76.98c-12.35-.3027-18.47-15.27-9.654-24.09l19.27-19.28C292.7 214.6 274.9 208 256 208c-24.8 0-47.78 11.22-63.08 30.78C184.8 249.2 169.7 251.1 159.2 242.9C148.8 234.8 146.9 219.7 155.1 209.2C179.6 177.9 216.3 160 256 160c31.78 0 61.37 11.94 84.58 32.61l19.28-19.29C368.8 164.4 384 170.7 384 183.3V259.7z\"]\n};\nvar faCampground = {\n  prefix: 'fas',\n  iconName: 'campground',\n  icon: [576, 512, [9978], \"f6bb\", \"M328.1 112L563.7 405.4C571.7 415.4 576 427.7 576 440.4V464C576 490.5 554.5 512 528 512H48C21.49 512 0 490.5 0 464V440.4C0 427.7 4.328 415.4 12.27 405.4L247 112L199 51.99C187.1 38.19 190.2 18.05 204 7.013C217.8-4.027 237.9-1.789 248.1 12.01L288 60.78L327 12.01C338.1-1.789 358.2-4.027 371.1 7.013C385.8 18.05 388 38.19 376.1 51.99L328.1 112zM407.5 448L288 291.7L168.5 448H407.5z\"]\n};\nvar faCandyCane = {\n  prefix: 'fas',\n  iconName: 'candy-cane',\n  icon: [512, 512, [], \"f786\", \"M497.5 91.1C469.6 33.13 411.8 0 352.4 0c-27.88 0-56.14 7.25-81.77 22.62L243.1 38.1C227.9 48.12 223 67.75 232.1 82.87l32.76 54.87c8.522 14.2 27.59 20.6 43.88 11.06l27.51-16.37c5.125-3.125 10.95-4.439 16.58-4.439c10.88 0 21.35 5.625 27.35 15.62c9 15.12 3.917 34.59-11.08 43.71L15.6 397.6c-15.25 9.125-20.13 28.62-11 43.87l32.76 54.87c8.522 14.2 27.59 20.66 43.88 11.12l347.4-206.5C500.2 258.1 533.2 167.5 497.5 91.1zM319.7 104.1L317.2 106.5l-20.5-61.5c9.75-4.75 19.88-8.125 30.38-10.25l20.63 61.87C337.8 97.37 328.2 99.87 319.7 104.1zM145.8 431.7l-60.5-38.5l30.88-18.25l60.5 38.5L145.8 431.7zM253.3 367.9l-60.5-38.5l30.88-18.25l60.5 38.5L253.3 367.9zM364.2 301.1L303.7 263.5l30.88-18.25l60.5 38.5L364.2 301.1zM384.7 104.7l46-45.1c8.375 6.5 16 13.1 22.5 22.5l-45.63 45.81C401.9 117.8 393.9 110.1 384.7 104.7zM466.7 212.5l-59.5-19.75c3.25-5.375 5.875-10.1 7.5-17.12c1-4.5 1.625-9.125 1.75-13.62l60.38 20.12C474.7 192.5 471.4 202.7 466.7 212.5z\"]\n};\nvar faCannabis = {\n  prefix: 'fas',\n  iconName: 'cannabis',\n  icon: [576, 512, [], \"f55f\", \"M544 374.4c0 6-3.25 11.38-8.5 14.12c-2.5 1.375-60.75 31.75-133.5 31.75c-6.124 0-12-.125-17.5-.25c11.38 22.25 16.5 38.25 16.75 39.13c1.875 5.75 .375 12-3.875 16.12c-4.125 4.25-10.38 5.75-16.12 4c-1.631-.4648-32.94-10.66-69.25-34.06v42.81C312 501.3 301.3 512 288 512s-24-10.75-24-23.1v-42.81c-36.31 23.4-67.62 33.59-69.25 34.06c-5.75 1.75-12 .25-16.12-4c-4.25-4.25-5.75-10.38-3.875-16.12C175 458.3 180.1 442.1 191.5 420c-5.501 .125-11.37 .25-17.5 .25c-72.75 0-130.1-30.38-133.5-31.75C35.25 385.8 32 380.4 32 374.4c0-5.875 3.25-11.38 8.5-14.12c1.625-.875 32.38-16.88 76.75-25.75c-64.25-75.13-84-161.8-84.88-165.8C31.25 163.5 32.75 157.9 36.63 154C39.75 151 43.75 149.4 48 149.4c1.125 0 2.25 .125 3.375 .375C55.38 150.6 137.1 169.3 212 229.5V225.1c0-118.9 60-213.8 62.5-217.8C277.5 2.75 282.5 0 288 0s10.5 2.75 13.5 7.375C304 11.38 364 106.3 364 225.1V229.5c73.1-60.25 156.6-79 160.5-79.75C525.8 149.5 526.9 149.4 528 149.4c4.25 0 8.25 1.625 11.38 4.625c3.75 3.875 5.375 9.5 4.25 14.75c-.875 4-20.62 90.63-84.88 165.8c44.38 8.875 75.13 24.88 76.75 25.75C540.8 363 544 368.5 544 374.4z\"]\n};\nvar faCapsules = {\n  prefix: 'fas',\n  iconName: 'capsules',\n  icon: [576, 512, [], \"f46b\", \"M555.3 300.1L424.3 112.8C401.9 81 366.4 64 330.4 64c-22.63 0-45.5 6.75-65.5 20.75C245.2 98.5 231.2 117.5 223.4 138.5C220.5 79.25 171.1 32 111.1 32c-61.88 0-111.1 50.08-111.1 111.1L-.0028 368c0 61.88 50.12 112 112 112s112-50.13 112-112L223.1 218.9C227.2 227.5 231.2 236 236.7 243.9l131.3 187.4C390.3 463 425.8 480 461.8 480c22.75 0 45.5-6.75 65.5-20.75C579 423.1 591.5 351.8 555.3 300.1zM159.1 256H63.99V144c0-26.5 21.5-48 48-48s48 21.5 48 48V256zM354.8 300.9l-65.5-93.63c-7.75-11-10.75-24.5-8.375-37.63c2.375-13.25 9.75-24.87 20.75-32.5C310.1 131.1 320.1 128 330.4 128c16.5 0 31.88 8 41.38 21.5l65.5 93.75L354.8 300.9z\"]\n};\nvar faCar = {\n  prefix: 'fas',\n  iconName: 'car',\n  icon: [512, 512, [128664, \"automobile\"], \"f1b9\", \"M39.61 196.8L74.8 96.29C88.27 57.78 124.6 32 165.4 32H346.6C387.4 32 423.7 57.78 437.2 96.29L472.4 196.8C495.6 206.4 512 229.3 512 256V448C512 465.7 497.7 480 480 480H448C430.3 480 416 465.7 416 448V400H96V448C96 465.7 81.67 480 64 480H32C14.33 480 0 465.7 0 448V256C0 229.3 16.36 206.4 39.61 196.8V196.8zM109.1 192H402.9L376.8 117.4C372.3 104.6 360.2 96 346.6 96H165.4C151.8 96 139.7 104.6 135.2 117.4L109.1 192zM96 256C78.33 256 64 270.3 64 288C64 305.7 78.33 320 96 320C113.7 320 128 305.7 128 288C128 270.3 113.7 256 96 256zM416 320C433.7 320 448 305.7 448 288C448 270.3 433.7 256 416 256C398.3 256 384 270.3 384 288C384 305.7 398.3 320 416 320z\"]\n};\nvar faAutomobile = faCar;\nvar faCarBattery = {\n  prefix: 'fas',\n  iconName: 'car-battery',\n  icon: [512, 512, [\"battery-car\"], \"f5df\", \"M80 96C80 78.33 94.33 64 112 64H176C193.7 64 208 78.33 208 96H304C304 78.33 318.3 64 336 64H400C417.7 64 432 78.33 432 96H448C483.3 96 512 124.7 512 160V384C512 419.3 483.3 448 448 448H64C28.65 448 0 419.3 0 384V160C0 124.7 28.65 96 64 96H80zM384 192C384 183.2 376.8 176 368 176C359.2 176 352 183.2 352 192V224H320C311.2 224 304 231.2 304 240C304 248.8 311.2 256 320 256H352V288C352 296.8 359.2 304 368 304C376.8 304 384 296.8 384 288V256H416C424.8 256 432 248.8 432 240C432 231.2 424.8 224 416 224H384V192zM96 256H192C200.8 256 208 248.8 208 240C208 231.2 200.8 224 192 224H96C87.16 224 80 231.2 80 240C80 248.8 87.16 256 96 256z\"]\n};\nvar faBatteryCar = faCarBattery;\nvar faCarBurst = {\n  prefix: 'fas',\n  iconName: 'car-burst',\n  icon: [640, 512, [\"car-crash\"], \"f5e1\", \"M176 8C182.6 8 188.4 11.1 190.9 18.09L220.3 92.05L296.4 68.93C302.7 67.03 309.5 69.14 313.6 74.27C314.1 74.85 314.5 75.45 314.9 76.08C297.8 84.32 282.7 96.93 271.4 113.3L230.4 172.5C203.1 181.4 180.6 203.5 172.6 233.4L152.7 307.4L117.4 339.9C112.6 344.4 105.5 345.4 99.64 342.6C93.73 339.7 90.16 333.6 90.62 327L96.21 247.6L17.56 235.4C11.08 234.4 5.871 229.6 4.413 223.2C2.954 216.8 5.54 210.1 10.94 206.4L76.5 161.3L37.01 92.18C33.76 86.49 34.31 79.39 38.4 74.27C42.48 69.14 49.28 67.03 55.55 68.93L131.7 92.05L161.1 18.09C163.6 11.1 169.4 8 176 8L176 8zM384.2 99.67L519.8 135.1C552.5 144.7 576.1 173.1 578.8 206.8L585.7 290.7C602.9 304.2 611.3 327 605.3 349.4L570.1 480.8C565.5 497.8 547.1 507.1 530.9 503.4L515.5 499.3C498.4 494.7 488.3 477.1 492.8 460.1L501.1 429.1L253.8 362.9L245.6 393.8C240.1 410.9 223.4 421 206.4 416.4L190.9 412.3C173.8 407.7 163.7 390.2 168.3 373.1L203.5 241.7C209.5 219.3 228.2 203.8 249.8 200.7L297.7 131.5C316.9 103.6 351.6 90.92 384.2 99.67L384.2 99.67zM367.7 161.5C361.1 159.7 354.2 162.3 350.4 167.8L318.1 214.5L519.6 268.5L515 211.1C514.5 205.2 509.8 199.6 503.2 197.8L367.7 161.5zM268.3 308.8C281.1 312.2 294.3 304.6 297.7 291.8C301.2 279 293.6 265.9 280.8 262.4C267.1 259 254.8 266.6 251.4 279.4C247.9 292.2 255.5 305.4 268.3 308.8zM528 328.7C515.2 325.3 502.1 332.9 498.6 345.7C495.2 358.5 502.8 371.6 515.6 375.1C528.4 378.5 541.6 370.9 545 358.1C548.4 345.3 540.8 332.1 528 328.7z\"]\n};\nvar faCarCrash = faCarBurst;\nvar faCarOn = {\n  prefix: 'fas',\n  iconName: 'car-on',\n  icon: [448, 512, [], \"e4dd\", \"M248 104C248 117.3 237.3 128 224 128C210.7 128 200 117.3 200 104V24C200 10.75 210.7 0 224 0C237.3 0 248 10.75 248 24V104zM153.8 160H294.2C327.1 160 358.1 181.3 369.5 213.1L397.8 292.4C417.9 300.9 432 320.8 432 344V480C432 497.7 417.7 512 400 512H384C366.3 512 352 497.7 352 480V448H96V480C96 497.7 81.67 512 64 512H48C30.33 512 16 497.7 16 480V344C16 320.8 30.08 300.9 50.16 292.4L78.49 213.1C89.86 181.3 120 160 153.8 160H153.8zM153.8 224C147.1 224 141 228.3 138.8 234.6L119.7 288H328.3L309.2 234.6C306.1 228.3 300.9 224 294.2 224H153.8zM96 392C109.3 392 120 381.3 120 368C120 354.7 109.3 344 96 344C82.75 344 72 354.7 72 368C72 381.3 82.75 392 96 392zM352 344C338.7 344 328 354.7 328 368C328 381.3 338.7 392 352 392C365.3 392 376 381.3 376 368C376 354.7 365.3 344 352 344zM7.029 39.03C16.4 29.66 31.6 29.66 40.97 39.03L88.97 87.03C98.34 96.4 98.34 111.6 88.97 120.1C79.6 130.3 64.4 130.3 55.03 120.1L7.029 72.97C-2.343 63.6-2.343 48.4 7.029 39.03V39.03zM407 39.03C416.4 29.66 431.6 29.66 440.1 39.03C450.3 48.4 450.3 63.6 440.1 72.97L392.1 120.1C383.6 130.3 368.4 130.3 359 120.1C349.7 111.6 349.7 96.4 359 87.03L407 39.03z\"]\n};\nvar faCarRear = {\n  prefix: 'fas',\n  iconName: 'car-rear',\n  icon: [512, 512, [\"car-alt\"], \"f5de\", \"M165.4 32H346.6C387.4 32 423.7 57.78 437.2 96.29L472.4 196.8C495.6 206.4 512 229.3 512 256V336C512 359.7 499.1 380.4 480 391.4V448C480 465.7 465.7 480 448 480H416C398.3 480 384 465.7 384 448V400H128V448C128 465.7 113.7 480 96 480H64C46.33 480 32 465.7 32 448V391.4C12.87 380.4 0 359.7 0 336V256C0 229.3 16.36 206.4 39.61 196.8L74.8 96.29C88.27 57.78 124.6 32 165.4 32V32zM165.4 96C151.8 96 139.7 104.6 135.2 117.4L109.1 192H402.9L376.8 117.4C372.3 104.6 360.2 96 346.6 96H165.4zM208 272C199.2 272 192 279.2 192 288V320C192 328.8 199.2 336 208 336H304C312.8 336 320 328.8 320 320V288C320 279.2 312.8 272 304 272H208zM72 304H104C117.3 304 128 293.3 128 280C128 266.7 117.3 256 104 256H72C58.75 256 48 266.7 48 280C48 293.3 58.75 304 72 304zM408 256C394.7 256 384 266.7 384 280C384 293.3 394.7 304 408 304H440C453.3 304 464 293.3 464 280C464 266.7 453.3 256 440 256H408z\"]\n};\nvar faCarAlt = faCarRear;\nvar faCarSide = {\n  prefix: 'fas',\n  iconName: 'car-side',\n  icon: [640, 512, [128663], \"f5e4\", \"M640 320V368C640 385.7 625.7 400 608 400H574.7C567.1 445.4 527.6 480 480 480C432.4 480 392.9 445.4 385.3 400H254.7C247.1 445.4 207.6 480 160 480C112.4 480 72.94 445.4 65.33 400H32C14.33 400 0 385.7 0 368V256C0 228.9 16.81 205.8 40.56 196.4L82.2 92.35C96.78 55.9 132.1 32 171.3 32H353.2C382.4 32 409.1 45.26 428.2 68.03L528.2 193C591.2 200.1 640 254.8 640 319.1V320zM171.3 96C158.2 96 146.5 103.1 141.6 116.1L111.3 192H224V96H171.3zM272 192H445.4L378.2 108C372.2 100.4 362.1 96 353.2 96H272V192zM525.3 400C527 394.1 528 389.6 528 384C528 357.5 506.5 336 480 336C453.5 336 432 357.5 432 384C432 389.6 432.1 394.1 434.7 400C441.3 418.6 459.1 432 480 432C500.9 432 518.7 418.6 525.3 400zM205.3 400C207 394.1 208 389.6 208 384C208 357.5 186.5 336 160 336C133.5 336 112 357.5 112 384C112 389.6 112.1 394.1 114.7 400C121.3 418.6 139.1 432 160 432C180.9 432 198.7 418.6 205.3 400z\"]\n};\nvar faCarTunnel = {\n  prefix: 'fas',\n  iconName: 'car-tunnel',\n  icon: [512, 512, [], \"e4de\", \"M190.8 277.5C191.8 274.2 194.9 272 198.4 272H313.6C317.1 272 320.2 274.2 321.2 277.5L334.1 320H177L190.8 277.5zM144 384C144 370.7 154.7 360 168 360C181.3 360 192 370.7 192 384C192 397.3 181.3 408 168 408C154.7 408 144 397.3 144 384zM368 384C368 397.3 357.3 408 344 408C330.7 408 320 397.3 320 384C320 370.7 330.7 360 344 360C357.3 360 368 370.7 368 384zM512 256V448C512 483.3 483.3 512 448 512H384H128H64C28.65 512 0 483.3 0 448V256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM384 512C401.7 512 416 497.7 416 480V376C416 355.2 404.7 337.1 387.8 327.4L366.9 262.7C359.4 239.6 337.9 224 313.6 224H198.4C174.1 224 152.6 239.6 145.1 262.7L124.1 327.4C107.3 337.1 96 355.2 96 376V480C96 497.7 110.3 512 128 512C145.7 512 160 497.7 160 480V448H352V480C352 497.7 366.3 512 384 512H384z\"]\n};\nvar faCaravan = {\n  prefix: 'fas',\n  iconName: 'caravan',\n  icon: [640, 512, [], \"f8ff\", \"M0 112C0 67.82 35.82 32 80 32H416C504.4 32 576 103.6 576 192V352H608C625.7 352 640 366.3 640 384C640 401.7 625.7 416 608 416H288C288 469 245 512 192 512C138.1 512 96 469 96 416H80C35.82 416 0 380.2 0 336V112zM320 352H448V256H416C407.2 256 400 248.8 400 240C400 231.2 407.2 224 416 224H448V160C448 142.3 433.7 128 416 128H352C334.3 128 320 142.3 320 160V352zM96 128C78.33 128 64 142.3 64 160V224C64 241.7 78.33 256 96 256H224C241.7 256 256 241.7 256 224V160C256 142.3 241.7 128 224 128H96zM192 464C218.5 464 240 442.5 240 416C240 389.5 218.5 368 192 368C165.5 368 144 389.5 144 416C144 442.5 165.5 464 192 464z\"]\n};\nvar faCaretDown = {\n  prefix: 'fas',\n  iconName: 'caret-down',\n  icon: [320, 512, [], \"f0d7\", \"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\"]\n};\nvar faCaretLeft = {\n  prefix: 'fas',\n  iconName: 'caret-left',\n  icon: [256, 512, [], \"f0d9\", \"M137.4 406.6l-128-127.1C3.125 272.4 0 264.2 0 255.1s3.125-16.38 9.375-22.63l128-127.1c9.156-9.156 22.91-11.9 34.88-6.943S192 115.1 192 128v255.1c0 12.94-7.781 24.62-19.75 29.58S146.5 415.8 137.4 406.6z\"]\n};\nvar faCaretRight = {\n  prefix: 'fas',\n  iconName: 'caret-right',\n  icon: [256, 512, [], \"f0da\", \"M118.6 105.4l128 127.1C252.9 239.6 256 247.8 256 255.1s-3.125 16.38-9.375 22.63l-128 127.1c-9.156 9.156-22.91 11.9-34.88 6.943S64 396.9 64 383.1V128c0-12.94 7.781-24.62 19.75-29.58S109.5 96.23 118.6 105.4z\"]\n};\nvar faCaretUp = {\n  prefix: 'fas',\n  iconName: 'caret-up',\n  icon: [320, 512, [], \"f0d8\", \"M9.39 265.4l127.1-128C143.6 131.1 151.8 128 160 128s16.38 3.125 22.63 9.375l127.1 128c9.156 9.156 11.9 22.91 6.943 34.88S300.9 320 287.1 320H32.01c-12.94 0-24.62-7.781-29.58-19.75S.2333 274.5 9.39 265.4z\"]\n};\nvar faCarrot = {\n  prefix: 'fas',\n  iconName: 'carrot',\n  icon: [512, 512, [129365], \"f787\", \"M298.2 156.6C245.5 130.9 183.7 146.1 147.1 189.4l55.27 55.31c6.25 6.25 6.25 16.33 0 22.58c-3.127 3-7.266 4.605-11.39 4.605s-8.068-1.605-11.19-4.605L130.3 217l-128.1 262.8c-2.875 6-3 13.25 0 19.63c5.5 11.12 19 15.75 30 10.38l133.6-65.25L116.7 395.3c-6.377-6.125-6.377-16.38 0-22.5c6.25-6.25 16.37-6.25 22.5 0l56.98 56.98l102-49.89c24-11.63 44.5-31.26 57.13-57.13C385.5 261.1 359.9 186.8 298.2 156.6zM390.2 121.8C409.7 81 399.7 32.88 359.1 0c-50.25 41.75-52.51 107.5-7.875 151.9l8 8C404.5 204.5 470.4 202.3 512 152C479.1 112.3 430.1 102.3 390.2 121.8z\"]\n};\nvar faCartArrowDown = {\n  prefix: 'fas',\n  iconName: 'cart-arrow-down',\n  icon: [576, 512, [], \"f218\", \"M0 24C0 10.75 10.75 0 24 0H96C107.5 0 117.4 8.19 119.6 19.51L121.1 32H312V134.1L288.1 111C279.6 101.7 264.4 101.7 255 111C245.7 120.4 245.7 135.6 255 144.1L319 208.1C328.4 218.3 343.6 218.3 352.1 208.1L416.1 144.1C426.3 135.6 426.3 120.4 416.1 111C407.6 101.7 392.4 101.7 383 111L360 134.1V32H541.8C562.1 32 578.3 52.25 572.6 72.66L518.6 264.7C514.7 278.5 502.1 288 487.8 288H170.7L179.9 336H488C501.3 336 512 346.7 512 360C512 373.3 501.3 384 488 384H159.1C148.5 384 138.6 375.8 136.4 364.5L76.14 48H24C10.75 48 0 37.25 0 24V24zM224 464C224 490.5 202.5 512 176 512C149.5 512 128 490.5 128 464C128 437.5 149.5 416 176 416C202.5 416 224 437.5 224 464zM416 464C416 437.5 437.5 416 464 416C490.5 416 512 437.5 512 464C512 490.5 490.5 512 464 512C437.5 512 416 490.5 416 464z\"]\n};\nvar faCartFlatbed = {\n  prefix: 'fas',\n  iconName: 'cart-flatbed',\n  icon: [640, 512, [\"dolly-flatbed\"], \"f474\", \"M240 320h320c26.4 0 48-21.6 48-48v-192C608 53.6 586.4 32 560 32H448v128l-48-32L352 160V32H240C213.6 32 192 53.6 192 80v192C192 298.4 213.6 320 240 320zM608 384H128V64c0-35.2-28.8-64-64-64H31.1C14.4 0 0 14.4 0 32S14.4 64 31.1 64H48C56.84 64 64 71.16 64 80v335.1c0 17.6 14.4 32 32 32l66.92-.0009C161.1 453 160 458.4 160 464C160 490.5 181.5 512 208 512S256 490.5 256 464c0-5.641-1.13-10.97-2.917-16h197.9c-1.787 5.027-2.928 10.36-2.928 16C448 490.5 469.5 512 496 512c26.51 0 48.01-21.49 48.01-47.1c0-5.641-1.12-10.97-2.907-16l66.88 .0009C625.6 448 640 433.6 640 415.1C640 398.4 625.6 384 608 384z\"]\n};\nvar faDollyFlatbed = faCartFlatbed;\nvar faCartFlatbedSuitcase = {\n  prefix: 'fas',\n  iconName: 'cart-flatbed-suitcase',\n  icon: [640, 512, [\"luggage-cart\"], \"f59d\", \"M541.2 448C542.1 453 544.1 458.4 544.1 464C544.1 490.5 522.6 512 496 512C469.5 512 448.1 490.5 448.1 464C448.1 458.4 449.2 453 450.1 448H253.1C254.9 453 256 458.4 256 464C256 490.5 234.5 512 208 512C181.5 512 160 490.5 160 464C160 458.4 161.1 453 162.9 448L96 448C78.4 448 64 433.6 64 416V80C64 71.16 56.84 64 48 64H32C14.4 64 0 49.6 0 32C0 14.4 14.4 0 32 0H64C99.2 0 128 28.8 128 64V384H608C625.6 384 640 398.4 640 416C640 433.6 625.6 448 608 448L541.2 448zM432 0C458.5 0 480 21.5 480 48V320H288V48C288 21.5 309.5 0 336 0H432zM336 96H432V48H336V96zM256 320H224C206.4 320 192 305.6 192 288V128C192 110.4 206.4 96 224 96H256V320zM576 128V288C576 305.6 561.6 320 544 320H512V96H544C561.6 96 576 110.4 576 128z\"]\n};\nvar faLuggageCart = faCartFlatbedSuitcase;\nvar faCartPlus = {\n  prefix: 'fas',\n  iconName: 'cart-plus',\n  icon: [576, 512, [], \"f217\", \"M96 0C107.5 0 117.4 8.19 119.6 19.51L121.1 32H541.8C562.1 32 578.3 52.25 572.6 72.66L518.6 264.7C514.7 278.5 502.1 288 487.8 288H170.7L179.9 336H488C501.3 336 512 346.7 512 360C512 373.3 501.3 384 488 384H159.1C148.5 384 138.6 375.8 136.4 364.5L76.14 48H24C10.75 48 0 37.25 0 24C0 10.75 10.75 0 24 0H96zM272 180H316V224C316 235 324.1 244 336 244C347 244 356 235 356 224V180H400C411 180 420 171 420 160C420 148.1 411 140 400 140H356V96C356 84.95 347 76 336 76C324.1 76 316 84.95 316 96V140H272C260.1 140 252 148.1 252 160C252 171 260.1 180 272 180zM128 464C128 437.5 149.5 416 176 416C202.5 416 224 437.5 224 464C224 490.5 202.5 512 176 512C149.5 512 128 490.5 128 464zM512 464C512 490.5 490.5 512 464 512C437.5 512 416 490.5 416 464C416 437.5 437.5 416 464 416C490.5 416 512 437.5 512 464z\"]\n};\nvar faCartShopping = {\n  prefix: 'fas',\n  iconName: 'cart-shopping',\n  icon: [576, 512, [128722, \"shopping-cart\"], \"f07a\", \"M96 0C107.5 0 117.4 8.19 119.6 19.51L121.1 32H541.8C562.1 32 578.3 52.25 572.6 72.66L518.6 264.7C514.7 278.5 502.1 288 487.8 288H170.7L179.9 336H488C501.3 336 512 346.7 512 360C512 373.3 501.3 384 488 384H159.1C148.5 384 138.6 375.8 136.4 364.5L76.14 48H24C10.75 48 0 37.25 0 24C0 10.75 10.75 0 24 0H96zM128 464C128 437.5 149.5 416 176 416C202.5 416 224 437.5 224 464C224 490.5 202.5 512 176 512C149.5 512 128 490.5 128 464zM512 464C512 490.5 490.5 512 464 512C437.5 512 416 490.5 416 464C416 437.5 437.5 416 464 416C490.5 416 512 437.5 512 464z\"]\n};\nvar faShoppingCart = faCartShopping;\nvar faCashRegister = {\n  prefix: 'fas',\n  iconName: 'cash-register',\n  icon: [512, 512, [], \"f788\", \"M288 0C305.7 0 320 14.33 320 32V96C320 113.7 305.7 128 288 128H208V160H424.1C456.6 160 483.5 183.1 488.2 214.4L510.9 364.1C511.6 368.8 512 373.6 512 378.4V448C512 483.3 483.3 512 448 512H64C28.65 512 0 483.3 0 448V378.4C0 373.6 .3622 368.8 1.083 364.1L23.76 214.4C28.5 183.1 55.39 160 87.03 160H143.1V128H63.1C46.33 128 31.1 113.7 31.1 96V32C31.1 14.33 46.33 0 63.1 0L288 0zM96 48C87.16 48 80 55.16 80 64C80 72.84 87.16 80 96 80H256C264.8 80 272 72.84 272 64C272 55.16 264.8 48 256 48H96zM80 448H432C440.8 448 448 440.8 448 432C448 423.2 440.8 416 432 416H80C71.16 416 64 423.2 64 432C64 440.8 71.16 448 80 448zM112 216C98.75 216 88 226.7 88 240C88 253.3 98.75 264 112 264C125.3 264 136 253.3 136 240C136 226.7 125.3 216 112 216zM208 264C221.3 264 232 253.3 232 240C232 226.7 221.3 216 208 216C194.7 216 184 226.7 184 240C184 253.3 194.7 264 208 264zM160 296C146.7 296 136 306.7 136 320C136 333.3 146.7 344 160 344C173.3 344 184 333.3 184 320C184 306.7 173.3 296 160 296zM304 264C317.3 264 328 253.3 328 240C328 226.7 317.3 216 304 216C290.7 216 280 226.7 280 240C280 253.3 290.7 264 304 264zM256 296C242.7 296 232 306.7 232 320C232 333.3 242.7 344 256 344C269.3 344 280 333.3 280 320C280 306.7 269.3 296 256 296zM400 264C413.3 264 424 253.3 424 240C424 226.7 413.3 216 400 216C386.7 216 376 226.7 376 240C376 253.3 386.7 264 400 264zM352 296C338.7 296 328 306.7 328 320C328 333.3 338.7 344 352 344C365.3 344 376 333.3 376 320C376 306.7 365.3 296 352 296z\"]\n};\nvar faCat = {\n  prefix: 'fas',\n  iconName: 'cat',\n  icon: [576, 512, [128008], \"f6be\", \"M322.6 192C302.4 192 215.8 194 160 278V192c0-53-43-96-96-96C46.38 96 32 110.4 32 128s14.38 32 32 32s32 14.38 32 32v256c0 35.25 28.75 64 64 64h176c8.875 0 16-7.125 16-15.1V480c0-17.62-14.38-32-32-32h-32l128-96v144c0 8.875 7.125 16 16 16h32c8.875 0 16-7.125 16-16V289.9c-10.25 2.625-20.88 4.5-32 4.5C386.2 294.4 334.5 250.4 322.6 192zM480 96h-64l-64-64v134.4c0 53 43 95.1 96 95.1s96-42.1 96-95.1V32L480 96zM408 176c-8.875 0-16-7.125-16-16s7.125-16 16-16s16 7.125 16 16S416.9 176 408 176zM488 176c-8.875 0-16-7.125-16-16s7.125-16 16-16s16 7.125 16 16S496.9 176 488 176z\"]\n};\nvar faCediSign = {\n  prefix: 'fas',\n  iconName: 'cedi-sign',\n  icon: [320, 512, [], \"e0df\", \"M224 66.66C254.9 71.84 283.2 84.39 307.2 102.4C321.4 113 324.2 133.1 313.6 147.2C302.1 161.4 282.9 164.2 268.8 153.6C255.6 143.7 240.4 136.3 224 132V379.1C240.4 375.7 255.6 368.3 268.8 358.4C282.9 347.8 302.1 350.6 313.6 364.8C324.2 378.9 321.4 398.1 307.2 409.6C283.2 427.6 254.9 440.2 224 445.3V480C224 497.7 209.7 512 192 512C174.3 512 160 497.7 160 480V445.3C69.19 430.1 0 351.1 0 256C0 160.9 69.19 81.89 160 66.65V32C160 14.33 174.3 0 192 0C209.7 0 224 14.33 224 32V66.66zM160 132C104.8 146.2 64 196.4 64 255.1C64 315.6 104.8 365.8 160 379.1V132z\"]\n};\nvar faCentSign = {\n  prefix: 'fas',\n  iconName: 'cent-sign',\n  icon: [320, 512, [], \"e3f5\", \"M192 0C209.7 0 224 14.33 224 32V66.66C254.9 71.84 283.2 84.39 307.2 102.4C321.4 113 324.2 133.1 313.6 147.2C302.1 161.4 282.9 164.2 268.8 153.6C247.4 137.5 220.9 128 192 128C121.3 128 64 185.3 64 256C64 326.7 121.3 384 192 384C220.9 384 247.4 374.5 268.8 358.4C282.9 347.8 302.1 350.6 313.6 364.8C324.2 378.9 321.4 398.1 307.2 409.6C283.2 427.6 254.9 440.2 224 445.3V480C224 497.7 209.7 512 192 512C174.3 512 160 497.7 160 480V445.3C69.19 430.1 0 351.1 0 256C0 160.9 69.19 81.89 160 66.66V32C160 14.33 174.3 .0006 192 .0006V0z\"]\n};\nvar faCertificate = {\n  prefix: 'fas',\n  iconName: 'certificate',\n  icon: [512, 512, [], \"f0a3\", \"M256 53.46L300.1 7.261C307 1.034 315.1-1.431 324.4 .8185C332.8 3.068 339.3 9.679 341.4 18.1L357.3 80.6L419.3 63.07C427.7 60.71 436.7 63.05 442.8 69.19C448.1 75.34 451.3 84.33 448.9 92.69L431.4 154.7L493.9 170.6C502.3 172.7 508.9 179.2 511.2 187.6C513.4 196 510.1 204.1 504.7 211L458.5 256L504.7 300.1C510.1 307 513.4 315.1 511.2 324.4C508.9 332.8 502.3 339.3 493.9 341.4L431.4 357.3L448.9 419.3C451.3 427.7 448.1 436.7 442.8 442.8C436.7 448.1 427.7 451.3 419.3 448.9L357.3 431.4L341.4 493.9C339.3 502.3 332.8 508.9 324.4 511.2C315.1 513.4 307 510.1 300.1 504.7L256 458.5L211 504.7C204.1 510.1 196 513.4 187.6 511.2C179.2 508.9 172.7 502.3 170.6 493.9L154.7 431.4L92.69 448.9C84.33 451.3 75.34 448.1 69.19 442.8C63.05 436.7 60.71 427.7 63.07 419.3L80.6 357.3L18.1 341.4C9.679 339.3 3.068 332.8 .8186 324.4C-1.431 315.1 1.034 307 7.261 300.1L53.46 256L7.261 211C1.034 204.1-1.431 196 .8186 187.6C3.068 179.2 9.679 172.7 18.1 170.6L80.6 154.7L63.07 92.69C60.71 84.33 63.05 75.34 69.19 69.19C75.34 63.05 84.33 60.71 92.69 63.07L154.7 80.6L170.6 18.1C172.7 9.679 179.2 3.068 187.6 .8185C196-1.431 204.1 1.034 211 7.261L256 53.46z\"]\n};\nvar faChair = {\n  prefix: 'fas',\n  iconName: 'chair',\n  icon: [448, 512, [129681], \"f6c0\", \"M445.1 338.6l-14.77-32C425.1 295.3 413.7 288 401.2 288H46.76C34.28 288 22.94 295.3 17.7 306.6l-14.77 32c-4.563 9.906-3.766 21.47 2.109 30.66S21.09 384 31.1 384l.001 112c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16V384h256v112c0 8.836 7.164 16 16 16h31.1c8.838 0 16-7.164 16-16L416 384c10.91 0 21.08-5.562 26.95-14.75S449.6 348.5 445.1 338.6zM111.1 128c0-29.48 16.2-54.1 40-68.87L151.1 256h48l.0092-208h48L247.1 256h48l.0093-196.9C319.8 73 335.1 98.52 335.1 128l-.0094 128h48.03l-.0123-128c0-70.69-57.31-128-128-128H191.1C121.3 0 63.98 57.31 63.98 128l.0158 128h47.97L111.1 128z\"]\n};\nvar faChalkboard = {\n  prefix: 'fas',\n  iconName: 'chalkboard',\n  icon: [576, 512, [\"blackboard\"], \"f51b\", \"M96 96h384v288h64V72C544 50 525.1 32 504 32H72C49.1 32 32 50 32 72V384h64V96zM560 416H416v-48c0-8.838-7.164-16-16-16h-160C231.2 352 224 359.2 224 368V416H16C7.164 416 0 423.2 0 432v32C0 472.8 7.164 480 16 480h544c8.836 0 16-7.164 16-16v-32C576 423.2 568.8 416 560 416z\"]\n};\nvar faBlackboard = faChalkboard;\nvar faChalkboardUser = {\n  prefix: 'fas',\n  iconName: 'chalkboard-user',\n  icon: [640, 512, [\"chalkboard-teacher\"], \"f51c\", \"M592 0h-384C181.5 0 160 22.25 160 49.63V96c23.42 0 45.1 6.781 63.1 17.81V64h352v288h-64V304c0-8.838-7.164-16-16-16h-96c-8.836 0-16 7.162-16 16V352H287.3c22.07 16.48 39.54 38.5 50.76 64h253.9C618.5 416 640 393.8 640 366.4V49.63C640 22.25 618.5 0 592 0zM160 320c53.02 0 96-42.98 96-96c0-53.02-42.98-96-96-96C106.1 128 64 170.1 64 224C64 277 106.1 320 160 320zM192 352H128c-70.69 0-128 57.31-128 128c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32C320 409.3 262.7 352 192 352z\"]\n};\nvar faChalkboardTeacher = faChalkboardUser;\nvar faChampagneGlasses = {\n  prefix: 'fas',\n  iconName: 'champagne-glasses',\n  icon: [640, 512, [129346, \"glass-cheers\"], \"f79f\", \"M639.4 433.6c-8.374-20.37-31.75-30.12-52.12-21.62l-22.12 9.249l-38.75-101.1c47.87-34.1 64.87-100.2 34.5-152.7l-86.62-150.5c-7.999-13.87-24.1-19.75-39.1-13.62l-114.2 47.37L205.8 2.415C190.8-3.71 173.8 2.165 165.8 16.04L79.15 166.5C48.9 219 65.78 284.3 113.6 319.2l-38.75 101.9L52.78 411.9c-20.37-8.499-43.62 1.25-52.12 21.62c-1.75 4.124 .125 8.749 4.25 10.5l162.4 67.37c3.1 1.75 8.624-.125 10.37-4.249c8.374-20.37-1.25-43.87-21.62-52.37l-22.12-9.124l39.37-103.6c4.5 .4999 8.874 1.25 13.12 1.25c51.75 0 99.37-32.1 113.4-85.24l20.25-75.36l20.25 75.36c13.1 52.24 61.62 85.24 113.4 85.24c4.25 0 8.624-.7499 13.12-1.25l39.25 103.6l-22.12 9.124c-20.37 8.499-30.12 31.1-21.62 52.37c1.75 4.124 6.5 5.999 10.5 4.249l162.4-67.37C639.1 442.2 641.1 437.7 639.4 433.6zM275.9 162.1L163.8 115.6l36.5-63.37L294.8 91.4L275.9 162.1zM364.1 162.1l-18.87-70.74l94.49-39.12l36.5 63.37L364.1 162.1z\"]\n};\nvar faGlassCheers = faChampagneGlasses;\nvar faChargingStation = {\n  prefix: 'fas',\n  iconName: 'charging-station',\n  icon: [576, 512, [], \"f5e7\", \"M256 0C291.3 0 320 28.65 320 64V256H336C384.6 256 424 295.4 424 344V376C424 389.3 434.7 400 448 400C461.3 400 472 389.3 472 376V252.3C439.5 242.1 416 211.8 416 176V144C416 135.2 423.2 128 432 128H448V80C448 71.16 455.2 64 464 64C472.8 64 480 71.16 480 80V128H512V80C512 71.16 519.2 64 528 64C536.8 64 544 71.16 544 80V128H560C568.8 128 576 135.2 576 144V176C576 211.8 552.5 242.1 520 252.3V376C520 415.8 487.8 448 448 448C408.2 448 376 415.8 376 376V344C376 321.9 358.1 304 336 304H320V448C337.7 448 352 462.3 352 480C352 497.7 337.7 512 320 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V64C32 28.65 60.65 0 96 0H256zM197.6 83.85L85.59 179.9C80.5 184.2 78.67 191.3 80.99 197.6C83.32 203.8 89.3 208 95.1 208H153.8L128.8 282.9C126.5 289.8 129.1 297.3 135.1 301.3C141 305.3 148.1 304.8 154.4 300.1L266.4 204.1C271.5 199.8 273.3 192.7 271 186.4C268.7 180.2 262.7 176 256 176H198.2L223.2 101.1C225.5 94.24 222.9 86.74 216.9 82.72C210.1 78.71 203 79.17 197.6 83.85V83.85z\"]\n};\nvar faChartArea = {\n  prefix: 'fas',\n  iconName: 'chart-area',\n  icon: [512, 512, [\"area-chart\"], \"f1fe\", \"M64 400C64 408.8 71.16 416 80 416H480C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H80C35.82 480 0 444.2 0 400V64C0 46.33 14.33 32 32 32C49.67 32 64 46.33 64 64V400zM128 320V236C128 228.3 130.8 220.8 135.9 214.1L215.3 124.2C228.3 109.4 251.4 109.7 263.1 124.8L303.2 171.8C312.2 182.7 328.6 183.4 338.6 173.4L359.6 152.4C372.7 139.3 394.4 140.1 406.5 154.2L472.3 231C477.3 236.8 480 244.2 480 251.8V320C480 337.7 465.7 352 448 352H159.1C142.3 352 127.1 337.7 127.1 320L128 320z\"]\n};\nvar faAreaChart = faChartArea;\nvar faChartBar = {\n  prefix: 'fas',\n  iconName: 'chart-bar',\n  icon: [512, 512, [\"bar-chart\"], \"f080\", \"M32 32C49.67 32 64 46.33 64 64V400C64 408.8 71.16 416 80 416H480C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H80C35.82 480 0 444.2 0 400V64C0 46.33 14.33 32 32 32zM128 128C128 110.3 142.3 96 160 96H352C369.7 96 384 110.3 384 128C384 145.7 369.7 160 352 160H160C142.3 160 128 145.7 128 128zM288 192C305.7 192 320 206.3 320 224C320 241.7 305.7 256 288 256H160C142.3 256 128 241.7 128 224C128 206.3 142.3 192 160 192H288zM416 288C433.7 288 448 302.3 448 320C448 337.7 433.7 352 416 352H160C142.3 352 128 337.7 128 320C128 302.3 142.3 288 160 288H416z\"]\n};\nvar faBarChart = faChartBar;\nvar faChartColumn = {\n  prefix: 'fas',\n  iconName: 'chart-column',\n  icon: [512, 512, [], \"e0e3\", \"M32 32C49.67 32 64 46.33 64 64V400C64 408.8 71.16 416 80 416H480C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H80C35.82 480 0 444.2 0 400V64C0 46.33 14.33 32 32 32zM160 224C177.7 224 192 238.3 192 256V320C192 337.7 177.7 352 160 352C142.3 352 128 337.7 128 320V256C128 238.3 142.3 224 160 224zM288 320C288 337.7 273.7 352 256 352C238.3 352 224 337.7 224 320V160C224 142.3 238.3 128 256 128C273.7 128 288 142.3 288 160V320zM352 192C369.7 192 384 206.3 384 224V320C384 337.7 369.7 352 352 352C334.3 352 320 337.7 320 320V224C320 206.3 334.3 192 352 192zM480 320C480 337.7 465.7 352 448 352C430.3 352 416 337.7 416 320V96C416 78.33 430.3 64 448 64C465.7 64 480 78.33 480 96V320z\"]\n};\nvar faChartGantt = {\n  prefix: 'fas',\n  iconName: 'chart-gantt',\n  icon: [512, 512, [], \"e0e4\", \"M32 32C49.67 32 64 46.33 64 64V400C64 408.8 71.16 416 80 416H480C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H80C35.82 480 0 444.2 0 400V64C0 46.33 14.33 32 32 32zM128 128C128 110.3 142.3 96 160 96H256C273.7 96 288 110.3 288 128C288 145.7 273.7 160 256 160H160C142.3 160 128 145.7 128 128zM352 192C369.7 192 384 206.3 384 224C384 241.7 369.7 256 352 256H224C206.3 256 192 241.7 192 224C192 206.3 206.3 192 224 192H352zM448 288C465.7 288 480 302.3 480 320C480 337.7 465.7 352 448 352H384C366.3 352 352 337.7 352 320C352 302.3 366.3 288 384 288H448z\"]\n};\nvar faChartLine = {\n  prefix: 'fas',\n  iconName: 'chart-line',\n  icon: [512, 512, [\"line-chart\"], \"f201\", \"M64 400C64 408.8 71.16 416 80 416H480C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H80C35.82 480 0 444.2 0 400V64C0 46.33 14.33 32 32 32C49.67 32 64 46.33 64 64V400zM342.6 278.6C330.1 291.1 309.9 291.1 297.4 278.6L240 221.3L150.6 310.6C138.1 323.1 117.9 323.1 105.4 310.6C92.88 298.1 92.88 277.9 105.4 265.4L217.4 153.4C229.9 140.9 250.1 140.9 262.6 153.4L320 210.7L425.4 105.4C437.9 92.88 458.1 92.88 470.6 105.4C483.1 117.9 483.1 138.1 470.6 150.6L342.6 278.6z\"]\n};\nvar faLineChart = faChartLine;\nvar faChartPie = {\n  prefix: 'fas',\n  iconName: 'chart-pie',\n  icon: [576, 512, [\"pie-chart\"], \"f200\", \"M304 16.58C304 7.555 310.1 0 320 0C443.7 0 544 100.3 544 224C544 233 536.4 240 527.4 240H304V16.58zM32 272C32 150.7 122.1 50.34 238.1 34.25C248.2 32.99 256 40.36 256 49.61V288L412.5 444.5C419.2 451.2 418.7 462.2 411 467.7C371.8 495.6 323.8 512 272 512C139.5 512 32 404.6 32 272zM558.4 288C567.6 288 575 295.8 573.8 305C566.1 360.9 539.1 410.6 499.9 447.3C493.9 452.1 484.5 452.5 478.7 446.7L320 288H558.4z\"]\n};\nvar faPieChart = faChartPie;\nvar faChartSimple = {\n  prefix: 'fas',\n  iconName: 'chart-simple',\n  icon: [448, 512, [], \"e473\", \"M160 80C160 53.49 181.5 32 208 32H240C266.5 32 288 53.49 288 80V432C288 458.5 266.5 480 240 480H208C181.5 480 160 458.5 160 432V80zM0 272C0 245.5 21.49 224 48 224H80C106.5 224 128 245.5 128 272V432C128 458.5 106.5 480 80 480H48C21.49 480 0 458.5 0 432V272zM400 96C426.5 96 448 117.5 448 144V432C448 458.5 426.5 480 400 480H368C341.5 480 320 458.5 320 432V144C320 117.5 341.5 96 368 96H400z\"]\n};\nvar faCheck = {\n  prefix: 'fas',\n  iconName: 'check',\n  icon: [448, 512, [10004, 10003], \"f00c\", \"M438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6L182.6 406.6C170.1 419.1 149.9 419.1 137.4 406.6L9.372 278.6C-3.124 266.1-3.124 245.9 9.372 233.4C21.87 220.9 42.13 220.9 54.63 233.4L159.1 338.7L393.4 105.4C405.9 92.88 426.1 92.88 438.6 105.4H438.6z\"]\n};\nvar faCheckDouble = {\n  prefix: 'fas',\n  iconName: 'check-double',\n  icon: [448, 512, [], \"f560\", \"M182.6 246.6C170.1 259.1 149.9 259.1 137.4 246.6L57.37 166.6C44.88 154.1 44.88 133.9 57.37 121.4C69.87 108.9 90.13 108.9 102.6 121.4L159.1 178.7L297.4 41.37C309.9 28.88 330.1 28.88 342.6 41.37C355.1 53.87 355.1 74.13 342.6 86.63L182.6 246.6zM182.6 470.6C170.1 483.1 149.9 483.1 137.4 470.6L9.372 342.6C-3.124 330.1-3.124 309.9 9.372 297.4C21.87 284.9 42.13 284.9 54.63 297.4L159.1 402.7L393.4 169.4C405.9 156.9 426.1 156.9 438.6 169.4C451.1 181.9 451.1 202.1 438.6 214.6L182.6 470.6z\"]\n};\nvar faCheckToSlot = {\n  prefix: 'fas',\n  iconName: 'check-to-slot',\n  icon: [576, 512, [\"vote-yea\"], \"f772\", \"M480 80C480 53.49 458.5 32 432 32h-288C117.5 32 96 53.49 96 80V384h384V80zM378.9 166.8l-88 112c-4.031 5.156-10 8.438-16.53 9.062C273.6 287.1 272.7 287.1 271.1 287.1c-5.719 0-11.21-2.019-15.58-5.769l-56-48C190.3 225.6 189.2 210.4 197.8 200.4c8.656-10.06 23.81-11.19 33.84-2.594l36.97 31.69l72.53-92.28c8.188-10.41 23.31-12.22 33.69-4.062C385.3 141.3 387.1 156.4 378.9 166.8zM528 288H512v112c0 8.836-7.164 16-16 16h-416C71.16 416 64 408.8 64 400V288H48C21.49 288 0 309.5 0 336v96C0 458.5 21.49 480 48 480h480c26.51 0 48-21.49 48-48v-96C576 309.5 554.5 288 528 288z\"]\n};\nvar faVoteYea = faCheckToSlot;\nvar faCheese = {\n  prefix: 'fas',\n  iconName: 'cheese',\n  icon: [512, 512, [], \"f7ef\", \"M0 288v159.1C0 465.6 14.38 480 32 480h448c17.62 0 32-14.38 32-31.1V288H0zM299.9 32.01c-7.75-.25-15.25 2.25-21.12 6.1L0 255.1l512-.0118C512 136.1 417.1 38.26 299.9 32.01z\"]\n};\nvar faChess = {\n  prefix: 'fas',\n  iconName: 'chess',\n  icon: [512, 512, [], \"f439\", \"M74.01 208h-10c-8.875 0-16 7.125-16 16v16c0 8.875 7.122 16 15.1 16h16c-.25 43.13-5.5 86.13-16 128h128c-10.5-41.88-15.75-84.88-16-128h15.1c8.875 0 16-7.125 16-16L208 224c0-8.875-7.122-16-15.1-16h-10l33.88-90.38C216.6 115.8 216.9 113.1 216.9 112.1C216.9 103.1 209.5 96 200.9 96H144V64h16c8.844 0 16-7.156 16-16S168.9 32 160 32h-16l.0033-16c0-8.844-7.16-16-16-16s-16 7.156-16 16V32H96.01c-8.844 0-16 7.156-16 16S87.16 64 96.01 64h16v32H55.13C46.63 96 39.07 102.8 39.07 111.9c0 1.93 .3516 3.865 1.061 5.711L74.01 208zM339.9 301.8L336.6 384h126.8l-3.25-82.25l24.5-20.75C491.9 274.9 496 266 496 256.5V198C496 194.6 493.4 192 489.1 192h-26.37c-3.375 0-6 2.625-6 6V224h-24.75V198C432.9 194.6 430.3 192 426.9 192h-53.75c-3.375 0-6 2.625-6 6V224h-24.75V198C342.4 194.6 339.8 192 336.4 192h-26.38C306.6 192 304 194.6 304 198v58.62c0 9.375 4.125 18.25 11.38 24.38L339.9 301.8zM384 304C384 295.1 391.1 288 400 288S416 295.1 416 304v32h-32V304zM247.1 459.6L224 448v-16C224 423.1 216.9 416 208 416h-160C39.13 416 32 423.1 32 432V448l-23.12 11.62C3.375 462.3 0 467.9 0 473.9V496C0 504.9 7.125 512 16 512h224c8.875 0 16-7.125 16-16v-22.12C256 467.9 252.6 462.3 247.1 459.6zM503.1 459.6L480 448v-16c0-8.875-7.125-16-16-16h-128c-8.875 0-16 7.125-16 16V448l-23.12 11.62C291.4 462.3 288 467.9 288 473.9V496c0 8.875 7.125 16 16 16h192c8.875 0 16-7.125 16-16v-22.12C512 467.9 508.6 462.3 503.1 459.6z\"]\n};\nvar faChessBishop = {\n  prefix: 'fas',\n  iconName: 'chess-bishop',\n  icon: [320, 512, [9821], \"f43a\", \"M272 448h-224C21.49 448 0 469.5 0 496C0 504.8 7.164 512 16 512h288c8.836 0 16-7.164 16-16C320 469.5 298.5 448 272 448zM8 287.9c0 51.63 22.12 73.88 56 84.63V416h192v-43.5c33.88-10.75 56-33 56-84.63c0-30.62-10.75-67.13-26.75-102.5L185 285.6c-1.565 1.565-3.608 2.349-5.651 2.349c-2.036 0-4.071-.7787-5.63-2.339l-11.35-11.27c-1.56-1.56-2.339-3.616-2.339-5.672c0-2.063 .7839-4.128 2.349-5.693l107.9-107.9C249.5 117.3 223.8 83 199.4 62.5C213.4 59.13 224 47 224 32c0-17.62-14.38-32-32-32H128C110.4 0 96 14.38 96 32c0 15 10.62 27.12 24.62 30.5C67.75 106.8 8 214.5 8 287.9z\"]\n};\nvar faChessBoard = {\n  prefix: 'fas',\n  iconName: 'chess-board',\n  icon: [448, 512, [], \"f43c\", \"M192 224H128v64h64V224zM384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96C448 60.65 419.3 32 384 32zM384 160h-64v64h64v64h-64v64h64v64h-64v-64h-64v64H192v-64H128v64H64v-64h64V288H64V224h64V160H64V96h64v64h64V96h64v64h64V96h64V160zM192 288v64h64V288H192zM256 224V160H192v64H256zM256 288h64V224h-64V288z\"]\n};\nvar faChessKing = {\n  prefix: 'fas',\n  iconName: 'chess-king',\n  icon: [448, 512, [9818], \"f43f\", \"M367.1 448H79.97c-26.51 0-48.01 21.49-48.01 47.1C31.96 504.8 39.13 512 47.96 512h352c8.838 0 16-7.163 16-16C416 469.5 394.5 448 367.1 448zM416.1 160h-160V112h16.01c17.6 0 31.98-14.4 31.98-32C303.1 62.4 289.6 48 272 48h-16.01V32C256 14.4 241.6 0 223.1 0C206.4 0 191.1 14.4 191.1 32.01V48H175.1c-17.6 0-32.01 14.4-32.01 32C143.1 97.6 158.4 112 175.1 112h16.01V160h-160C17.34 160 0 171.5 0 192C0 195.2 .4735 198.4 1.437 201.5L74.46 416h299.1l73.02-214.5C447.5 198.4 448 195.2 448 192C448 171.6 430.1 160 416.1 160z\"]\n};\nvar faChessKnight = {\n  prefix: 'fas',\n  iconName: 'chess-knight',\n  icon: [384, 512, [9822], \"f441\", \"M19 272.5l40.62 18C63.78 292.3 68.25 293.3 72.72 293.3c4 0 8.001-.7543 11.78-2.289l12.75-5.125c9.125-3.625 16-11.12 18.75-20.5L125.2 234.8C127 227.9 131.5 222.2 137.9 219.1L160 208v50.38C160 276.5 149.6 293.1 133.4 301.2L76.25 329.9C49.12 343.5 32 371.1 32 401.5V416h319.9l-.0417-192c0-105.1-85.83-192-191.8-192H12C5.375 32 0 37.38 0 44c0 2.625 .625 5.25 1.75 7.625L16 80L7 89C2.5 93.5 0 99.62 0 106V243.2C0 255.9 7.5 267.4 19 272.5zM52 128C63 128 72 137 72 148S63 168 52 168S32 159 32 148S41 128 52 128zM336 448H47.1C21.49 448 0 469.5 0 495.1C0 504.8 7.163 512 16 512h352c8.837 0 16-7.163 16-16C384 469.5 362.5 448 336 448z\"]\n};\nvar faChessPawn = {\n  prefix: 'fas',\n  iconName: 'chess-pawn',\n  icon: [320, 512, [9823], \"f443\", \"M105.1 224H80C71.12 224 64 231.1 64 240v32c0 8.875 7.125 15.1 16 15.1L96 288v5.5C96 337.5 91.88 380.1 72 416h176C228.1 380.1 224 337.5 224 293.5V288l16-.0001c8.875 0 16-7.125 16-15.1v-32C256 231.1 248.9 224 240 224h-25.12C244.3 205.6 264 173.2 264 136C264 78.5 217.5 32 159.1 32S56 78.5 56 136C56 173.2 75.74 205.6 105.1 224zM272 448H47.1C21.49 448 0 469.5 0 495.1C0 504.8 7.163 512 16 512h288c8.837 0 16-7.163 16-16C320 469.5 298.5 448 272 448z\"]\n};\nvar faChessQueen = {\n  prefix: 'fas',\n  iconName: 'chess-queen',\n  icon: [512, 512, [9819], \"f445\", \"M256 112c30.88 0 56-25.12 56-56S286.9 0 256 0S199.1 25.12 199.1 56S225.1 112 256 112zM399.1 448H111.1c-26.51 0-48 21.49-48 47.1C63.98 504.8 71.15 512 79.98 512h352c8.837 0 16-7.163 16-16C447.1 469.5 426.5 448 399.1 448zM511.1 197.4c0-5.178-2.509-10.2-7.096-13.26L476.4 168.2c-2.684-1.789-5.602-2.62-8.497-2.62c-17.22 0-17.39 26.37-51.92 26.37c-29.35 0-47.97-25.38-47.97-50.63C367.1 134 361.1 128 354.6 128h-38.75c-6 0-11.63 4-12.88 9.875C298.2 160.1 278.7 176 255.1 176c-22.75 0-42.25-15.88-47-38.12C207.7 132 202.2 128 196.1 128h-38.75C149.1 128 143.1 134 143.1 141.4c0 18.45-13.73 50.62-47.95 50.62c-34.58 0-34.87-26.39-51.87-26.39c-2.909 0-5.805 .8334-8.432 2.645l-28.63 16C2.509 187.2 0 192.3 0 197.4C0 199.9 .5585 202.3 1.72 204.6L104.2 416h303.5l102.5-211.4C511.4 202.3 511.1 199.8 511.1 197.4z\"]\n};\nvar faChessRook = {\n  prefix: 'fas',\n  iconName: 'chess-rook',\n  icon: [384, 512, [9820], \"f447\", \"M368 32h-56c-8.875 0-16 7.125-16 16V96h-48V48c0-8.875-7.125-16-16-16h-80c-8.875 0-16 7.125-16 16V96H88.12V48c0-8.875-7.25-16-16-16H16C7.125 32 0 39.12 0 48V224l64 32c0 48.38-1.5 95-13.25 160h282.5C321.5 351 320 303.8 320 256l64-32V48C384 39.12 376.9 32 368 32zM224 320H160V256c0-17.62 14.38-32 32-32s32 14.38 32 32V320zM336 448H47.1C21.49 448 0 469.5 0 495.1C0 504.8 7.163 512 16 512h352c8.837 0 16-7.163 16-16C384 469.5 362.5 448 336 448z\"]\n};\nvar faChevronDown = {\n  prefix: 'fas',\n  iconName: 'chevron-down',\n  icon: [448, 512, [], \"f078\", \"M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z\"]\n};\nvar faChevronLeft = {\n  prefix: 'fas',\n  iconName: 'chevron-left',\n  icon: [320, 512, [9001], \"f053\", \"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\"]\n};\nvar faChevronRight = {\n  prefix: 'fas',\n  iconName: 'chevron-right',\n  icon: [320, 512, [9002], \"f054\", \"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\"]\n};\nvar faChevronUp = {\n  prefix: 'fas',\n  iconName: 'chevron-up',\n  icon: [448, 512, [], \"f077\", \"M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z\"]\n};\nvar faChild = {\n  prefix: 'fas',\n  iconName: 'child',\n  icon: [320, 512, [], \"f1ae\", \"M224 64C224 99.35 195.3 128 160 128C124.7 128 96 99.35 96 64C96 28.65 124.7 0 160 0C195.3 0 224 28.65 224 64zM144 384V480C144 497.7 129.7 512 112 512C94.33 512 80.01 497.7 80.01 480V287.8L59.09 321C49.67 336 29.92 340.5 14.96 331.1C.0016 321.7-4.491 301.9 4.924 286.1L44.79 223.6C69.72 184 113.2 160 160 160C206.8 160 250.3 184 275.2 223.6L315.1 286.1C324.5 301.9 320 321.7 305.1 331.1C290.1 340.5 270.3 336 260.9 321L240 287.8V480C240 497.7 225.7 512 208 512C190.3 512 176 497.7 176 480V384L144 384z\"]\n};\nvar faChildDress = {\n  prefix: 'fas',\n  iconName: 'child-dress',\n  icon: [320, 512, [], \"e59c\", \"M223.1 64C223.1 99.35 195.3 128 159.1 128C124.7 128 95.1 99.35 95.1 64C95.1 28.65 124.7 0 159.1 0C195.3 0 223.1 28.65 223.1 64zM70.2 400C59.28 400 51.57 389.3 55.02 378.9L86.16 285.5L57.5 323.3C46.82 337.4 26.75 340.2 12.67 329.5C-1.415 318.8-4.175 298.7 6.503 284.7L65.4 206.1C87.84 177.4 122.9 160 160 160C197.2 160 232.2 177.4 254.6 206.1L313.5 284.7C324.2 298.7 321.4 318.8 307.3 329.5C293.3 340.2 273.2 337.4 262.5 323.3L233.9 285.6L264.1 378.9C268.4 389.3 260.7 400 249.8 400H232V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V400H152V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V400H70.2z\"]\n};\nvar faChildReaching = {\n  prefix: 'fas',\n  iconName: 'child-reaching',\n  icon: [384, 512, [], \"e59d\", \"M256 64C256 99.35 227.3 128 192 128C156.7 128 128 99.35 128 64C128 28.65 156.7 0 192 0C227.3 0 256 28.65 256 64zM155.7 170.2C167.3 173.1 179.6 176 192.2 176C232.1 176 269.3 155.8 291 122.4L309.2 94.54C318.8 79.73 338.6 75.54 353.5 85.18C368.3 94.82 372.5 114.6 362.8 129.5L344.7 157.3C326.4 185.4 301.2 207.3 272 221.6V480C272 497.7 257.7 512 240 512C222.3 512 208 497.7 208 480V384H176V480C176 497.7 161.7 512 144 512C126.3 512 112 497.7 112 480V221.4C83.63 207.4 58.94 186.1 40.87 158.1L21.37 129.8C11.57 115 15.54 95.18 30.25 85.37C44.95 75.57 64.82 79.54 74.62 94.25L94.12 123.5C108.5 145 129.2 160.9 152.9 169.3C153.9 169.5 154.8 169.8 155.7 170.2V170.2z\"]\n};\nvar faChildRifle = {\n  prefix: 'fas',\n  iconName: 'child-rifle',\n  icon: [512, 512, [], \"e4e0\", \"M79.1 64C79.1 28.65 108.7 .0003 143.1 .0003C179.3 .0003 207.1 28.65 207.1 64C207.1 99.35 179.3 128 143.1 128C108.7 128 79.1 99.35 79.1 64V64zM104 512C86.33 512 72 497.7 72 480V300.5L59.09 321C49.67 336 29.91 340.5 14.96 331.1C.0006 321.7-4.492 301.9 4.923 286.1L56.6 204.9C74.17 176.9 104.9 160 137.8 160H150.2C183.2 160 213.8 176.9 231.4 204.9L283.1 286.1C292.5 301.9 288 321.7 273 331.1C258.1 340.5 238.3 336 228.9 321L216 300.5V480C216 497.7 201.7 512 184 512C166.3 512 152 497.7 152 480V352H136V480C136 497.7 121.7 512 104 512V512zM432 16V132.3C441.6 137.8 448 148.2 448 160V269.3L464 264V208C464 199.2 471.2 192 480 192H496C504.8 192 512 199.2 512 208V292.5C512 299.4 507.6 305.5 501.1 307.6L448 325.3V352H496C504.8 352 512 359.2 512 368V384C512 392.8 504.8 400 496 400H452L475 492.1C477.6 502.2 469.9 512 459.5 512H400C391.2 512 384 504.8 384 496V400H368C350.3 400 336 385.7 336 368V224C336 206.3 350.3 192 368 192V160C368 148.2 374.4 137.8 384 132.3V32C375.2 32 368 24.84 368 16C368 7.164 375.2 0 384 0H416C424.8 0 432 7.164 432 16V16z\"]\n};\nvar faChildren = {\n  prefix: 'fas',\n  iconName: 'children',\n  icon: [640, 512, [], \"e4e1\", \"M95.1 64C95.1 28.65 124.7 0 159.1 0C195.3 0 223.1 28.65 223.1 64C223.1 99.35 195.3 128 159.1 128C124.7 128 95.1 99.35 95.1 64zM88 480V400H70.2C59.28 400 51.57 389.3 55.02 378.9L86.16 285.5L57.5 323.3C46.82 337.4 26.75 340.2 12.67 329.5C-1.415 318.8-4.175 298.7 6.503 284.7L65.4 206.1C87.84 177.4 122.9 160 160 160C197.2 160 232.2 177.4 254.6 206.1L313.5 284.7C324.2 298.7 321.4 318.8 307.3 329.5C293.3 340.2 273.2 337.4 262.5 323.3L233.9 285.6L264.1 378.9C268.4 389.3 260.7 400 249.8 400H232V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V400H152V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480H88zM416 64C416 28.65 444.7 0 480 0C515.3 0 544 28.65 544 64C544 99.35 515.3 128 480 128C444.7 128 416 99.35 416 64V64zM472 384V480C472 497.7 457.7 512 440 512C422.3 512 408 497.7 408 480V300.5L395.1 321C385.7 336 365.9 340.5 350.1 331.1C336 321.7 331.5 301.9 340.9 286.1L392.6 204.9C410.2 176.9 440.9 159.1 473.8 159.1H486.2C519.2 159.1 549.8 176.9 567.4 204.9L619.1 286.1C628.5 301.9 624 321.7 609 331.1C594.1 340.5 574.3 336 564.9 321L552 300.5V480C552 497.7 537.7 512 520 512C502.3 512 488 497.7 488 480V384L472 384z\"]\n};\nvar faChurch = {\n  prefix: 'fas',\n  iconName: 'church',\n  icon: [640, 512, [9962], \"f51d\", \"M344 48H376C389.3 48 400 58.75 400 72C400 85.25 389.3 96 376 96H344V142.4L456.7 210C471.2 218.7 480 234.3 480 251.2V512H384V416C384 380.7 355.3 352 320 352C284.7 352 256 380.7 256 416V512H160V251.2C160 234.3 168.8 218.7 183.3 210L296 142.4V96H264C250.7 96 240 85.25 240 72C240 58.75 250.7 48 264 48H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V48zM24.87 330.3L128 273.6V512H48C21.49 512 0 490.5 0 464V372.4C0 354.9 9.53 338.8 24.87 330.3V330.3zM592 512H512V273.6L615.1 330.3C630.5 338.8 640 354.9 640 372.4V464C640 490.5 618.5 512 592 512V512z\"]\n};\nvar faCircle = {\n  prefix: 'fas',\n  iconName: 'circle',\n  icon: [512, 512, [128308, 128309, 128992, 128993, 128994, 128995, 128996, 9898, 9899, 11044, 61708, 61915, 9679], \"f111\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z\"]\n};\nvar faCircleArrowDown = {\n  prefix: 'fas',\n  iconName: 'circle-arrow-down',\n  icon: [512, 512, [\"arrow-circle-down\"], \"f0ab\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM382.6 302.6l-103.1 103.1C270.7 414.6 260.9 416 256 416c-4.881 0-14.65-1.391-22.65-9.398L129.4 302.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 306.8V128c0-17.69 14.33-32 32-32s32 14.31 32 32v178.8l49.38-49.38c12.5-12.5 32.75-12.5 45.25 0S395.1 290.1 382.6 302.6z\"]\n};\nvar faArrowCircleDown = faCircleArrowDown;\nvar faCircleArrowLeft = {\n  prefix: 'fas',\n  iconName: 'circle-arrow-left',\n  icon: [512, 512, [\"arrow-circle-left\"], \"f0a8\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM384 288H205.3l49.38 49.38c12.5 12.5 12.5 32.75 0 45.25s-32.75 12.5-45.25 0L105.4 278.6C97.4 270.7 96 260.9 96 256c0-4.883 1.391-14.66 9.398-22.65l103.1-103.1c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L205.3 224H384c17.69 0 32 14.33 32 32S401.7 288 384 288z\"]\n};\nvar faArrowCircleLeft = faCircleArrowLeft;\nvar faCircleArrowRight = {\n  prefix: 'fas',\n  iconName: 'circle-arrow-right',\n  icon: [512, 512, [\"arrow-circle-right\"], \"f0a9\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM406.6 278.6l-103.1 103.1c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25L306.8 288H128C110.3 288 96 273.7 96 256s14.31-32 32-32h178.8l-49.38-49.38c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l103.1 103.1C414.6 241.3 416 251.1 416 256C416 260.9 414.6 270.7 406.6 278.6z\"]\n};\nvar faArrowCircleRight = faCircleArrowRight;\nvar faCircleArrowUp = {\n  prefix: 'fas',\n  iconName: 'circle-arrow-up',\n  icon: [512, 512, [\"arrow-circle-up\"], \"f0aa\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM382.6 254.6c-12.5 12.5-32.75 12.5-45.25 0L288 205.3V384c0 17.69-14.33 32-32 32s-32-14.31-32-32V205.3L174.6 254.6c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l103.1-103.1C241.3 97.4 251.1 96 256 96c4.881 0 14.65 1.391 22.65 9.398l103.1 103.1C395.1 221.9 395.1 242.1 382.6 254.6z\"]\n};\nvar faArrowCircleUp = faCircleArrowUp;\nvar faCircleCheck = {\n  prefix: 'fas',\n  iconName: 'circle-check',\n  icon: [512, 512, [61533, \"check-circle\"], \"f058\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z\"]\n};\nvar faCheckCircle = faCircleCheck;\nvar faCircleChevronDown = {\n  prefix: 'fas',\n  iconName: 'circle-chevron-down',\n  icon: [512, 512, [\"chevron-circle-down\"], \"f13a\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM390.6 246.6l-112 112C272.4 364.9 264.2 368 256 368s-16.38-3.125-22.62-9.375l-112-112c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L256 290.8l89.38-89.38c12.5-12.5 32.75-12.5 45.25 0S403.1 234.1 390.6 246.6z\"]\n};\nvar faChevronCircleDown = faCircleChevronDown;\nvar faCircleChevronLeft = {\n  prefix: 'fas',\n  iconName: 'circle-chevron-left',\n  icon: [512, 512, [\"chevron-circle-left\"], \"f137\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM310.6 345.4c12.5 12.5 12.5 32.75 0 45.25s-32.75 12.5-45.25 0l-112-112C147.1 272.4 144 264.2 144 256s3.125-16.38 9.375-22.62l112-112c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L221.3 256L310.6 345.4z\"]\n};\nvar faChevronCircleLeft = faCircleChevronLeft;\nvar faCircleChevronRight = {\n  prefix: 'fas',\n  iconName: 'circle-chevron-right',\n  icon: [512, 512, [\"chevron-circle-right\"], \"f138\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM358.6 278.6l-112 112c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25L290.8 256L201.4 166.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l112 112C364.9 239.6 368 247.8 368 256S364.9 272.4 358.6 278.6z\"]\n};\nvar faChevronCircleRight = faCircleChevronRight;\nvar faCircleChevronUp = {\n  prefix: 'fas',\n  iconName: 'circle-chevron-up',\n  icon: [512, 512, [\"chevron-circle-up\"], \"f139\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM390.6 310.6c-12.5 12.5-32.75 12.5-45.25 0L256 221.3L166.6 310.6c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l112-112C239.6 147.1 247.8 144 256 144s16.38 3.125 22.62 9.375l112 112C403.1 277.9 403.1 298.1 390.6 310.6z\"]\n};\nvar faChevronCircleUp = faCircleChevronUp;\nvar faCircleDollarToSlot = {\n  prefix: 'fas',\n  iconName: 'circle-dollar-to-slot',\n  icon: [512, 512, [\"donate\"], \"f4b9\", \"M326.7 403.7C304.7 411.6 280.8 416 256 416C231.2 416 207.3 411.6 185.3 403.7C184.1 403.6 184.7 403.5 184.5 403.4C154.4 392.4 127.6 374.6 105.9 352C70.04 314.6 48 263.9 48 208C48 93.12 141.1 0 256 0C370.9 0 464 93.12 464 208C464 263.9 441.1 314.6 406.1 352C405.1 353 404.1 354.1 403.1 355.1C381.7 376.4 355.7 393.2 326.7 403.7L326.7 403.7zM235.9 111.1V118C230.3 119.2 224.1 120.9 220 123.1C205.1 129.9 192.1 142.5 188.9 160.8C187.1 171 188.1 180.9 192.3 189.8C196.5 198.6 203 204.8 209.6 209.3C221.2 217.2 236.5 221.8 248.2 225.3L250.4 225.9C264.4 230.2 273.8 233.3 279.7 237.6C282.2 239.4 283.1 240.8 283.4 241.7C283.8 242.5 284.4 244.3 283.7 248.3C283.1 251.8 281.2 254.8 275.7 257.1C269.6 259.7 259.7 261 246.9 259C240.9 258 230.2 254.4 220.7 251.2C218.5 250.4 216.3 249.7 214.3 249C203.8 245.5 192.5 251.2 189 261.7C185.5 272.2 191.2 283.5 201.7 286.1C202.9 287.4 204.4 287.9 206.1 288.5C213.1 291.2 226.4 295.4 235.9 297.6V304C235.9 315.1 244.9 324.1 255.1 324.1C267.1 324.1 276.1 315.1 276.1 304V298.5C281.4 297.5 286.6 295.1 291.4 293.9C307.2 287.2 319.8 274.2 323.1 255.2C324.9 244.8 324.1 234.8 320.1 225.7C316.2 216.7 309.9 210.1 303.2 205.3C291.1 196.4 274.9 191.6 262.8 187.9L261.1 187.7C247.8 183.4 238.2 180.4 232.1 176.2C229.5 174.4 228.7 173.2 228.5 172.7C228.3 172.3 227.7 171.1 228.3 167.7C228.7 165.7 230.2 162.4 236.5 159.6C242.1 156.7 252.9 155.1 265.1 156.1C269.5 157.7 283 160.3 286.9 161.3C297.5 164.2 308.5 157.8 311.3 147.1C314.2 136.5 307.8 125.5 297.1 122.7C292.7 121.5 282.7 119.5 276.1 118.3V112C276.1 100.9 267.1 91.9 256 91.9C244.9 91.9 235.9 100.9 235.9 112V111.1zM48 352H63.98C83.43 377.9 108 399.7 136.2 416H64V448H448V416H375.8C403.1 399.7 428.6 377.9 448 352H464C490.5 352 512 373.5 512 400V464C512 490.5 490.5 512 464 512H48C21.49 512 0 490.5 0 464V400C0 373.5 21.49 352 48 352H48z\"]\n};\nvar faDonate = faCircleDollarToSlot;\nvar faCircleDot = {\n  prefix: 'fas',\n  iconName: 'circle-dot',\n  icon: [512, 512, [128280, \"dot-circle\"], \"f192\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 352C309 352 352 309 352 256C352 202.1 309 160 256 160C202.1 160 160 202.1 160 256C160 309 202.1 352 256 352z\"]\n};\nvar faDotCircle = faCircleDot;\nvar faCircleDown = {\n  prefix: 'fas',\n  iconName: 'circle-down',\n  icon: [512, 512, [61466, \"arrow-alt-circle-down\"], \"f358\", \"M256 512c141.4 0 256-114.6 256-256s-114.6-256-256-256C114.6 0 0 114.6 0 256S114.6 512 256 512zM129.2 265.9C131.7 259.9 137.5 256 144 256h64V160c0-17.67 14.33-32 32-32h32c17.67 0 32 14.33 32 32v96h64c6.469 0 12.31 3.891 14.78 9.875c2.484 5.984 1.109 12.86-3.469 17.44l-112 112c-6.248 6.248-16.38 6.248-22.62 0l-112-112C128.1 278.7 126.7 271.9 129.2 265.9z\"]\n};\nvar faArrowAltCircleDown = faCircleDown;\nvar faCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'circle-exclamation',\n  icon: [512, 512, [\"exclamation-circle\"], \"f06a\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z\"]\n};\nvar faExclamationCircle = faCircleExclamation;\nvar faCircleH = {\n  prefix: 'fas',\n  iconName: 'circle-h',\n  icon: [512, 512, [9405, \"hospital-symbol\"], \"f47e\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM368 360c0 13.25-10.75 24-24 24S320 373.3 320 360v-80H192v80C192 373.3 181.3 384 168 384S144 373.3 144 360v-208C144 138.8 154.8 128 168 128S192 138.8 192 152v80h128v-80C320 138.8 330.8 128 344 128s24 10.75 24 24V360z\"]\n};\nvar faHospitalSymbol = faCircleH;\nvar faCircleHalfStroke = {\n  prefix: 'fas',\n  iconName: 'circle-half-stroke',\n  icon: [512, 512, [9680, \"adjust\"], \"f042\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 64V448C362 448 448 362 448 256C448 149.1 362 64 256 64z\"]\n};\nvar faAdjust = faCircleHalfStroke;\nvar faCircleInfo = {\n  prefix: 'fas',\n  iconName: 'circle-info',\n  icon: [512, 512, [\"info-circle\"], \"f05a\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z\"]\n};\nvar faInfoCircle = faCircleInfo;\nvar faCircleLeft = {\n  prefix: 'fas',\n  iconName: 'circle-left',\n  icon: [512, 512, [61840, \"arrow-alt-circle-left\"], \"f359\", \"M0 256c0 141.4 114.6 256 256 256s256-114.6 256-256c0-141.4-114.6-256-256-256S0 114.6 0 256zM246.1 129.2C252.1 131.7 256 137.5 256 144v64h96c17.67 0 32 14.33 32 32v32c0 17.67-14.33 32-32 32h-96v64c0 6.469-3.891 12.31-9.875 14.78c-5.984 2.484-12.86 1.109-17.44-3.469l-112-112c-6.248-6.248-6.248-16.38 0-22.62l112-112C233.3 128.1 240.1 126.7 246.1 129.2z\"]\n};\nvar faArrowAltCircleLeft = faCircleLeft;\nvar faCircleMinus = {\n  prefix: 'fas',\n  iconName: 'circle-minus',\n  icon: [512, 512, [\"minus-circle\"], \"f056\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM168 232C154.7 232 144 242.7 144 256C144 269.3 154.7 280 168 280H344C357.3 280 368 269.3 368 256C368 242.7 357.3 232 344 232H168z\"]\n};\nvar faMinusCircle = faCircleMinus;\nvar faCircleNodes = {\n  prefix: 'fas',\n  iconName: 'circle-nodes',\n  icon: [512, 512, [], \"e4e2\", \"M380.6 365.6C401.1 379.9 416 404.3 416 432C416 476.2 380.2 512 336 512C291.8 512 256 476.2 256 432C256 423.6 257.3 415.4 259.7 407.8L114.1 280.4C103.8 285.3 92.21 288 80 288C35.82 288 0 252.2 0 208C0 163.8 35.82 128 80 128C101.9 128 121.7 136.8 136.2 151.1L320 77.52C321.3 34.48 356.6 0 400 0C444.2 0 480 35.82 480 80C480 117.9 453.7 149.6 418.4 157.9L380.6 365.6zM156.3 232.2L301.9 359.6C306.9 357.3 312.1 355.4 317.6 354.1L355.4 146.4C351.2 143.6 347.4 140.4 343.8 136.9L159.1 210.5C159.7 218 158.5 225.3 156.3 232.2V232.2z\"]\n};\nvar faCircleNotch = {\n  prefix: 'fas',\n  iconName: 'circle-notch',\n  icon: [512, 512, [], \"f1ce\", \"M222.7 32.15C227.7 49.08 218.1 66.9 201.1 71.94C121.8 95.55 64 169.1 64 255.1C64 362 149.1 447.1 256 447.1C362 447.1 448 362 448 255.1C448 169.1 390.2 95.55 310.9 71.94C293.9 66.9 284.3 49.08 289.3 32.15C294.4 15.21 312.2 5.562 329.1 10.6C434.9 42.07 512 139.1 512 255.1C512 397.4 397.4 511.1 256 511.1C114.6 511.1 0 397.4 0 255.1C0 139.1 77.15 42.07 182.9 10.6C199.8 5.562 217.6 15.21 222.7 32.15V32.15z\"]\n};\nvar faCirclePause = {\n  prefix: 'fas',\n  iconName: 'circle-pause',\n  icon: [512, 512, [62092, \"pause-circle\"], \"f28b\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM224 191.1v128C224 337.7 209.7 352 192 352S160 337.7 160 320V191.1C160 174.3 174.3 160 191.1 160S224 174.3 224 191.1zM352 191.1v128C352 337.7 337.7 352 320 352S288 337.7 288 320V191.1C288 174.3 302.3 160 319.1 160S352 174.3 352 191.1z\"]\n};\nvar faPauseCircle = faCirclePause;\nvar faCirclePlay = {\n  prefix: 'fas',\n  iconName: 'circle-play',\n  icon: [512, 512, [61469, \"play-circle\"], \"f144\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM176 168V344C176 352.7 180.7 360.7 188.3 364.9C195.8 369.2 205.1 369 212.5 364.5L356.5 276.5C363.6 272.1 368 264.4 368 256C368 247.6 363.6 239.9 356.5 235.5L212.5 147.5C205.1 142.1 195.8 142.8 188.3 147.1C180.7 151.3 176 159.3 176 168V168z\"]\n};\nvar faPlayCircle = faCirclePlay;\nvar faCirclePlus = {\n  prefix: 'fas',\n  iconName: 'circle-plus',\n  icon: [512, 512, [\"plus-circle\"], \"f055\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 368C269.3 368 280 357.3 280 344V280H344C357.3 280 368 269.3 368 256C368 242.7 357.3 232 344 232H280V168C280 154.7 269.3 144 256 144C242.7 144 232 154.7 232 168V232H168C154.7 232 144 242.7 144 256C144 269.3 154.7 280 168 280H232V344C232 357.3 242.7 368 256 368z\"]\n};\nvar faPlusCircle = faCirclePlus;\nvar faCircleQuestion = {\n  prefix: 'fas',\n  iconName: 'circle-question',\n  icon: [512, 512, [62108, \"question-circle\"], \"f059\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z\"]\n};\nvar faQuestionCircle = faCircleQuestion;\nvar faCircleRadiation = {\n  prefix: 'fas',\n  iconName: 'circle-radiation',\n  icon: [512, 512, [9762, \"radiation-alt\"], \"f7ba\", \"M226.4 208.6L184.8 141.9C179.6 133.7 168.3 132 160.7 138.2C130.8 162.3 110.1 197.4 105.1 237.4C103.9 247.2 111.2 256 121 256H200C200 236 210.6 218.6 226.4 208.6zM256 288c17.67 0 32-14.33 32-32s-14.33-32-32-32C238.3 224 224 238.3 224 256S238.3 288 256 288zM285.6 303.3C276.1 308.7 266.9 312 256 312c-10.89 0-20.98-3.252-29.58-8.65l-41.74 66.8c-5.211 8.338-1.613 19.07 7.27 23.29C211.4 402.7 233.1 408 256 408c22.97 0 44.64-5.334 64.12-14.59c8.883-4.219 12.48-14.95 7.262-23.29L285.6 303.3zM351.4 138.2c-7.604-6.145-18.86-4.518-24.04 3.77l-41.71 66.67C301.4 218.6 312 236 312 256h78.96c9.844 0 17.11-8.791 15.91-18.56C401.9 197.5 381.3 162.4 351.4 138.2zM256 16C123.4 16 16 123.4 16 256s107.4 240 240 240c132.6 0 240-107.4 240-240S388.6 16 256 16zM256 432c-97.05 0-176-78.99-176-176S158.1 80 256 80s176 78.95 176 176S353 432 256 432z\"]\n};\nvar faRadiationAlt = faCircleRadiation;\nvar faCircleRight = {\n  prefix: 'fas',\n  iconName: 'circle-right',\n  icon: [512, 512, [61838, \"arrow-alt-circle-right\"], \"f35a\", \"M512 256c0-141.4-114.6-256-256-256S0 114.6 0 256c0 141.4 114.6 256 256 256S512 397.4 512 256zM265.9 382.8C259.9 380.3 256 374.5 256 368v-64H160c-17.67 0-32-14.33-32-32v-32c0-17.67 14.33-32 32-32h96v-64c0-6.469 3.891-12.31 9.875-14.78c5.984-2.484 12.86-1.109 17.44 3.469l112 112c6.248 6.248 6.248 16.38 0 22.62l-112 112C278.7 383.9 271.9 385.3 265.9 382.8z\"]\n};\nvar faArrowAltCircleRight = faCircleRight;\nvar faCircleStop = {\n  prefix: 'fas',\n  iconName: 'circle-stop',\n  icon: [512, 512, [62094, \"stop-circle\"], \"f28d\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM352 328c0 13.2-10.8 24-24 24h-144C170.8 352 160 341.2 160 328v-144C160 170.8 170.8 160 184 160h144C341.2 160 352 170.8 352 184V328z\"]\n};\nvar faStopCircle = faCircleStop;\nvar faCircleUp = {\n  prefix: 'fas',\n  iconName: 'circle-up',\n  icon: [512, 512, [61467, \"arrow-alt-circle-up\"], \"f35b\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256c141.4 0 256-114.6 256-256S397.4 0 256 0zM382.8 246.1C380.3 252.1 374.5 256 368 256h-64v96c0 17.67-14.33 32-32 32h-32c-17.67 0-32-14.33-32-32V256h-64C137.5 256 131.7 252.1 129.2 246.1C126.7 240.1 128.1 233.3 132.7 228.7l112-112c6.248-6.248 16.38-6.248 22.62 0l112 112C383.9 233.3 385.3 240.1 382.8 246.1z\"]\n};\nvar faArrowAltCircleUp = faCircleUp;\nvar faCircleUser = {\n  prefix: 'fas',\n  iconName: 'circle-user',\n  icon: [512, 512, [62142, \"user-circle\"], \"f2bd\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c39.77 0 72 32.24 72 72S295.8 272 256 272c-39.76 0-72-32.24-72-72S216.2 128 256 128zM256 448c-52.93 0-100.9-21.53-135.7-56.29C136.5 349.9 176.5 320 224 320h64c47.54 0 87.54 29.88 103.7 71.71C356.9 426.5 308.9 448 256 448z\"]\n};\nvar faUserCircle = faCircleUser;\nvar faCircleXmark = {\n  prefix: 'fas',\n  iconName: 'circle-xmark',\n  icon: [512, 512, [61532, \"times-circle\", \"xmark-circle\"], \"f057\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z\"]\n};\nvar faTimesCircle = faCircleXmark;\nvar faXmarkCircle = faCircleXmark;\nvar faCity = {\n  prefix: 'fas',\n  iconName: 'city',\n  icon: [640, 512, [127961], \"f64f\", \"M480 192H592C618.5 192 640 213.5 640 240V464C640 490.5 618.5 512 592 512H48C21.49 512 0 490.5 0 464V144C0 117.5 21.49 96 48 96H64V24C64 10.75 74.75 0 88 0C101.3 0 112 10.75 112 24V96H176V24C176 10.75 186.7 0 200 0C213.3 0 224 10.75 224 24V96H288V48C288 21.49 309.5 0 336 0H432C458.5 0 480 21.49 480 48V192zM576 368C576 359.2 568.8 352 560 352H528C519.2 352 512 359.2 512 368V400C512 408.8 519.2 416 528 416H560C568.8 416 576 408.8 576 400V368zM240 416C248.8 416 256 408.8 256 400V368C256 359.2 248.8 352 240 352H208C199.2 352 192 359.2 192 368V400C192 408.8 199.2 416 208 416H240zM128 368C128 359.2 120.8 352 112 352H80C71.16 352 64 359.2 64 368V400C64 408.8 71.16 416 80 416H112C120.8 416 128 408.8 128 400V368zM528 256C519.2 256 512 263.2 512 272V304C512 312.8 519.2 320 528 320H560C568.8 320 576 312.8 576 304V272C576 263.2 568.8 256 560 256H528zM256 176C256 167.2 248.8 160 240 160H208C199.2 160 192 167.2 192 176V208C192 216.8 199.2 224 208 224H240C248.8 224 256 216.8 256 208V176zM80 160C71.16 160 64 167.2 64 176V208C64 216.8 71.16 224 80 224H112C120.8 224 128 216.8 128 208V176C128 167.2 120.8 160 112 160H80zM256 272C256 263.2 248.8 256 240 256H208C199.2 256 192 263.2 192 272V304C192 312.8 199.2 320 208 320H240C248.8 320 256 312.8 256 304V272zM112 320C120.8 320 128 312.8 128 304V272C128 263.2 120.8 256 112 256H80C71.16 256 64 263.2 64 272V304C64 312.8 71.16 320 80 320H112zM416 272C416 263.2 408.8 256 400 256H368C359.2 256 352 263.2 352 272V304C352 312.8 359.2 320 368 320H400C408.8 320 416 312.8 416 304V272zM368 64C359.2 64 352 71.16 352 80V112C352 120.8 359.2 128 368 128H400C408.8 128 416 120.8 416 112V80C416 71.16 408.8 64 400 64H368zM416 176C416 167.2 408.8 160 400 160H368C359.2 160 352 167.2 352 176V208C352 216.8 359.2 224 368 224H400C408.8 224 416 216.8 416 208V176z\"]\n};\nvar faClapperboard = {\n  prefix: 'fas',\n  iconName: 'clapperboard',\n  icon: [512, 512, [], \"e131\", \"M326.1 160l127.4-127.4C451.7 32.39 449.9 32 448 32h-86.06l-128 128H326.1zM166.1 160l128-128H201.9l-128 128H166.1zM497.7 56.19L393.9 160H512V96C512 80.87 506.5 67.15 497.7 56.19zM134.1 32H64C28.65 32 0 60.65 0 96v64h6.062L134.1 32zM0 416c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V192H0V416z\"]\n};\nvar faClipboard = {\n  prefix: 'fas',\n  iconName: 'clipboard',\n  icon: [384, 512, [128203], \"f328\", \"M336 64h-53.88C268.9 26.8 233.7 0 192 0S115.1 26.8 101.9 64H48C21.5 64 0 85.48 0 112v352C0 490.5 21.5 512 48 512h288c26.5 0 48-21.48 48-48v-352C384 85.48 362.5 64 336 64zM192 64c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S160 113.7 160 96C160 78.33 174.3 64 192 64zM272 224h-160C103.2 224 96 216.8 96 208C96 199.2 103.2 192 112 192h160C280.8 192 288 199.2 288 208S280.8 224 272 224z\"]\n};\nvar faClipboardCheck = {\n  prefix: 'fas',\n  iconName: 'clipboard-check',\n  icon: [384, 512, [], \"f46c\", \"M336 64h-53.88C268.9 26.8 233.7 0 192 0S115.1 26.8 101.9 64H48C21.5 64 0 85.48 0 112v352C0 490.5 21.5 512 48 512h288c26.5 0 48-21.48 48-48v-352C384 85.48 362.5 64 336 64zM192 64c17.67 0 32 14.33 32 32s-14.33 32-32 32S160 113.7 160 96S174.3 64 192 64zM282.9 262.8l-88 112c-4.047 5.156-10.02 8.438-16.53 9.062C177.6 383.1 176.8 384 176 384c-5.703 0-11.25-2.031-15.62-5.781l-56-48c-10.06-8.625-11.22-23.78-2.594-33.84c8.609-10.06 23.77-11.22 33.84-2.594l36.98 31.69l72.52-92.28c8.188-10.44 23.3-12.22 33.7-4.062C289.3 237.3 291.1 252.4 282.9 262.8z\"]\n};\nvar faClipboardList = {\n  prefix: 'fas',\n  iconName: 'clipboard-list',\n  icon: [384, 512, [], \"f46d\", \"M336 64h-53.88C268.9 26.8 233.7 0 192 0S115.1 26.8 101.9 64H48C21.5 64 0 85.48 0 112v352C0 490.5 21.5 512 48 512h288c26.5 0 48-21.48 48-48v-352C384 85.48 362.5 64 336 64zM96 392c-13.25 0-24-10.75-24-24S82.75 344 96 344s24 10.75 24 24S109.3 392 96 392zM96 296c-13.25 0-24-10.75-24-24S82.75 248 96 248S120 258.8 120 272S109.3 296 96 296zM192 64c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S160 113.7 160 96C160 78.33 174.3 64 192 64zM304 384h-128C167.2 384 160 376.8 160 368C160 359.2 167.2 352 176 352h128c8.801 0 16 7.199 16 16C320 376.8 312.8 384 304 384zM304 288h-128C167.2 288 160 280.8 160 272C160 263.2 167.2 256 176 256h128C312.8 256 320 263.2 320 272C320 280.8 312.8 288 304 288z\"]\n};\nvar faClipboardQuestion = {\n  prefix: 'fas',\n  iconName: 'clipboard-question',\n  icon: [384, 512, [], \"e4e3\", \"M282.5 64H320C355.3 64 384 92.65 384 128V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H101.5C114.6 26.71 150.2 0 192 0C233.8 0 269.4 26.71 282.5 64zM192 128C209.7 128 224 113.7 224 96C224 78.33 209.7 64 192 64C174.3 64 160 78.33 160 96C160 113.7 174.3 128 192 128zM105.4 230.5C100.9 243 107.5 256.7 119.1 261.2C132.5 265.6 146.2 259.1 150.6 246.6L151.1 245.3C152.2 242.1 155.2 240 158.6 240H216.9C225.2 240 232 246.8 232 255.1C232 260.6 229.1 265.6 224.4 268.3L180.1 293.7C172.6 298 168 305.9 168 314.5V328C168 341.3 178.7 352 192 352C205.1 352 215.8 341.5 215.1 328.4L248.3 309.9C267.9 298.7 280 277.8 280 255.1C280 220.3 251.7 192 216.9 192H158.6C134.9 192 113.8 206.9 105.8 229.3L105.4 230.5zM192 384C174.3 384 160 398.3 160 416C160 433.7 174.3 448 192 448C209.7 448 224 433.7 224 416C224 398.3 209.7 384 192 384z\"]\n};\nvar faClipboardUser = {\n  prefix: 'fas',\n  iconName: 'clipboard-user',\n  icon: [384, 512, [], \"f7f3\", \"M336 64h-53.88C268.9 26.8 233.7 0 192 0S115.1 26.8 101.9 64H48C21.5 64 0 85.48 0 112v352C0 490.5 21.5 512 48 512h288c26.5 0 48-21.48 48-48v-352C384 85.48 362.5 64 336 64zM192 64c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S160 113.7 160 96C160 78.33 174.3 64 192 64zM192 192c35.35 0 64 28.65 64 64s-28.65 64-64 64S128 291.3 128 256S156.7 192 192 192zM288 448H96c-8.836 0-16-7.164-16-16C80 387.8 115.8 352 160 352h64c44.18 0 80 35.82 80 80C304 440.8 296.8 448 288 448z\"]\n};\nvar faClock = {\n  prefix: 'fas',\n  iconName: 'clock',\n  icon: [512, 512, [128339, \"clock-four\"], \"f017\", \"M256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512zM232 256C232 264 236 271.5 242.7 275.1L338.7 339.1C349.7 347.3 364.6 344.3 371.1 333.3C379.3 322.3 376.3 307.4 365.3 300L280 243.2V120C280 106.7 269.3 96 255.1 96C242.7 96 231.1 106.7 231.1 120L232 256z\"]\n};\nvar faClockFour = faClock;\nvar faClockRotateLeft = {\n  prefix: 'fas',\n  iconName: 'clock-rotate-left',\n  icon: [512, 512, [\"history\"], \"f1da\", \"M256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C201.7 512 151.2 495 109.7 466.1C95.2 455.1 91.64 436 101.8 421.5C111.9 407 131.8 403.5 146.3 413.6C177.4 435.3 215.2 448 256 448C362 448 448 362 448 256C448 149.1 362 64 256 64C202.1 64 155 85.46 120.2 120.2L151 151C166.1 166.1 155.4 192 134.1 192H24C10.75 192 0 181.3 0 168V57.94C0 36.56 25.85 25.85 40.97 40.97L74.98 74.98C121.3 28.69 185.3 0 255.1 0L256 0zM256 128C269.3 128 280 138.7 280 152V246.1L344.1 311C354.3 320.4 354.3 335.6 344.1 344.1C335.6 354.3 320.4 354.3 311 344.1L239 272.1C234.5 268.5 232 262.4 232 256V152C232 138.7 242.7 128 256 128V128z\"]\n};\nvar faHistory = faClockRotateLeft;\nvar faClone = {\n  prefix: 'fas',\n  iconName: 'clone',\n  icon: [512, 512, [], \"f24d\", \"M0 224C0 188.7 28.65 160 64 160H128V288C128 341 170.1 384 224 384H352V448C352 483.3 323.3 512 288 512H64C28.65 512 0 483.3 0 448V224zM224 352C188.7 352 160 323.3 160 288V64C160 28.65 188.7 0 224 0H448C483.3 0 512 28.65 512 64V288C512 323.3 483.3 352 448 352H224z\"]\n};\nvar faClosedCaptioning = {\n  prefix: 'fas',\n  iconName: 'closed-captioning',\n  icon: [576, 512, [], \"f20a\", \"M512 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h448c35.35 0 64-28.65 64-64V96C576 60.65 547.3 32 512 32zM168.6 289.9c18.69 18.72 49.19 18.72 67.87 0c9.375-9.375 24.56-9.375 33.94 0s9.375 24.56 0 33.94c-18.72 18.72-43.28 28.08-67.87 28.08s-49.16-9.359-67.87-28.08C116.5 305.8 106.5 281.6 106.5 256s9.1-49.75 28.12-67.88c37.44-37.44 98.31-37.44 135.7 0c9.375 9.375 9.375 24.56 0 33.94s-24.56 9.375-33.94 0c-18.69-18.72-49.19-18.72-67.87 0C159.5 231.1 154.5 243.2 154.5 256S159.5 280.9 168.6 289.9zM360.6 289.9c18.69 18.72 49.19 18.72 67.87 0c9.375-9.375 24.56-9.375 33.94 0s9.375 24.56 0 33.94c-18.72 18.72-43.28 28.08-67.87 28.08s-49.16-9.359-67.87-28.08C308.5 305.8 298.5 281.6 298.5 256s9.1-49.75 28.12-67.88c37.44-37.44 98.31-37.44 135.7 0c9.375 9.375 9.375 24.56 0 33.94s-24.56 9.375-33.94 0c-18.69-18.72-49.19-18.72-67.87 0C351.5 231.1 346.5 243.2 346.5 256S351.5 280.9 360.6 289.9z\"]\n};\nvar faCloud = {\n  prefix: 'fas',\n  iconName: 'cloud',\n  icon: [640, 512, [9729], \"f0c2\", \"M96.2 200.1C96.07 197.4 96 194.7 96 192C96 103.6 167.6 32 256 32C315.3 32 367 64.25 394.7 112.2C409.9 101.1 428.3 96 448 96C501 96 544 138.1 544 192C544 204.2 541.7 215.8 537.6 226.6C596 238.4 640 290.1 640 352C640 422.7 582.7 480 512 480H144C64.47 480 0 415.5 0 336C0 273.2 40.17 219.8 96.2 200.1z\"]\n};\nvar faCloudArrowDown = {\n  prefix: 'fas',\n  iconName: 'cloud-arrow-down',\n  icon: [640, 512, [62337, \"cloud-download\", \"cloud-download-alt\"], \"f0ed\", \"M144 480C64.47 480 0 415.5 0 336C0 273.2 40.17 219.8 96.2 200.1C96.07 197.4 96 194.7 96 192C96 103.6 167.6 32 256 32C315.3 32 367 64.25 394.7 112.2C409.9 101.1 428.3 96 448 96C501 96 544 138.1 544 192C544 204.2 541.7 215.8 537.6 226.6C596 238.4 640 290.1 640 352C640 422.7 582.7 480 512 480H144zM303 392.1C312.4 402.3 327.6 402.3 336.1 392.1L416.1 312.1C426.3 303.6 426.3 288.4 416.1 279C407.6 269.7 392.4 269.7 383 279L344 318.1V184C344 170.7 333.3 160 320 160C306.7 160 296 170.7 296 184V318.1L256.1 279C247.6 269.7 232.4 269.7 223 279C213.7 288.4 213.7 303.6 223 312.1L303 392.1z\"]\n};\nvar faCloudDownload = faCloudArrowDown;\nvar faCloudDownloadAlt = faCloudArrowDown;\nvar faCloudArrowUp = {\n  prefix: 'fas',\n  iconName: 'cloud-arrow-up',\n  icon: [640, 512, [62338, \"cloud-upload\", \"cloud-upload-alt\"], \"f0ee\", \"M144 480C64.47 480 0 415.5 0 336C0 273.2 40.17 219.8 96.2 200.1C96.07 197.4 96 194.7 96 192C96 103.6 167.6 32 256 32C315.3 32 367 64.25 394.7 112.2C409.9 101.1 428.3 96 448 96C501 96 544 138.1 544 192C544 204.2 541.7 215.8 537.6 226.6C596 238.4 640 290.1 640 352C640 422.7 582.7 480 512 480H144zM223 263C213.7 272.4 213.7 287.6 223 296.1C232.4 306.3 247.6 306.3 256.1 296.1L296 257.9V392C296 405.3 306.7 416 320 416C333.3 416 344 405.3 344 392V257.9L383 296.1C392.4 306.3 407.6 306.3 416.1 296.1C426.3 287.6 426.3 272.4 416.1 263L336.1 183C327.6 173.7 312.4 173.7 303 183L223 263z\"]\n};\nvar faCloudUpload = faCloudArrowUp;\nvar faCloudUploadAlt = faCloudArrowUp;\nvar faCloudBolt = {\n  prefix: 'fas',\n  iconName: 'cloud-bolt',\n  icon: [512, 512, [127785, \"thunderstorm\"], \"f76c\", \"M352 351.1h-71.25l47.44-105.4c3.062-6.781 1.031-14.81-4.906-19.31c-5.969-4.469-14.22-4.312-19.94 .4687l-153.6 128c-5.156 4.312-7.094 11.41-4.781 17.72c2.281 6.344 8.281 10.56 15.03 10.56h71.25l-47.44 105.4c-3.062 6.781-1.031 14.81 4.906 19.31C191.6 510.9 194.1 512 198.4 512c3.656 0 7.281-1.25 10.25-3.719l153.6-128c5.156-4.312 7.094-11.41 4.781-17.72C364.8 356.2 358.8 351.1 352 351.1zM416 128c-.625 0-1.125 .25-1.625 .25C415.5 123 416 117.6 416 112C416 67.75 380.3 32 336 32c-24.62 0-46.25 11.25-61 28.75C256.4 24.75 219.3 0 176 0C114.1 0 64 50.13 64 112c0 7.25 .75 14.25 2.125 21.25C27.75 145.8 0 181.5 0 224c0 53 43 96 96 96h46.63l140.2-116.8c8.605-7.195 19.53-11.16 30.76-11.16c10.34 0 20.6 3.416 29.03 9.734c17.96 13.61 24.02 37.45 14.76 57.95L330.2 320H416c53 0 96-43 96-96S469 128 416 128z\"]\n};\nvar faThunderstorm = faCloudBolt;\nvar faCloudMeatball = {\n  prefix: 'fas',\n  iconName: 'cloud-meatball',\n  icon: [576, 512, [], \"f73b\", \"M80 352C53.5 352 32 373.5 32 400S53.5 448 80 448S128 426.5 128 400S106.5 352 80 352zM496 352c-26.5 0-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48S522.5 352 496 352zM377 363.1c4.625-14.5 1.625-30.88-9.75-42.37c-11.5-11.5-27.87-14.38-42.37-9.875c-7-13.5-20.63-23-36.88-23s-29.88 9.5-36.88 23C236.6 306.2 220.2 309.2 208.8 320.8c-11.5 11.5-14.38 27.87-9.875 42.37c-13.5 7-23 20.63-23 36.88s9.5 29.88 23 36.88c-4.625 14.5-1.625 30.88 9.875 42.37c8.25 8.125 19 12.25 29.75 12.25c4.25 0 8.5-1.125 12.62-2.5C258.1 502.5 271.8 512 288 512s29.88-9.5 36.88-23c4.125 1.25 8.375 2.5 12.62 2.5c10.75 0 21.5-4.125 29.75-12.25c11.5-11.5 14.38-27.87 9.75-42.37C390.5 429.9 400 416.2 400 400S390.5 370.1 377 363.1zM544 224c0-53-43-96-96-96c-.625 0-1.125 .25-1.625 .25C447.5 123 448 117.6 448 112C448 67.75 412.2 32 368 32c-24.62 0-46.25 11.25-61 28.75C288.4 24.75 251.2 0 208 0C146.1 0 96 50.12 96 112c0 7.25 .75 14.25 2.125 21.25C59.75 145.8 32 181.5 32 224c0 53 43 96 96 96h43.38C175 312 179.8 304.6 186.2 298.2C199.8 284.8 217.8 277.1 237 276.9C250.5 263.8 268.8 256 288 256s37.5 7.75 51 20.88c19.25 .25 37.25 7.875 50.75 21.37C396.2 304.6 401.1 312 404.6 320H448C501 320 544 277 544 224z\"]\n};\nvar faCloudMoon = {\n  prefix: 'fas',\n  iconName: 'cloud-moon',\n  icon: [576, 512, [], \"f6c3\", \"M342.7 352.7c5.75-9.625 9.25-20.75 9.25-32.75c0-35.25-28.75-64-63.1-64c-17.25 0-32.75 6.875-44.25 17.87C227.4 244.2 196.2 223.1 159.1 223.1c-53 0-96 43.06-96 96.06c0 2 .5029 3.687 .6279 5.687c-37.5 13-64.62 48.38-64.62 90.25C-.0048 468.1 42.99 512 95.99 512h239.1c44.25 0 79.1-35.75 79.1-80C415.1 390.1 383.7 356.2 342.7 352.7zM565.2 298.4c-93 17.75-178.5-53.62-178.5-147.6c0-54.25 28.1-104 76.12-130.9c7.375-4.125 5.375-15.12-2.75-16.63C448.4 1.125 436.7 0 424.1 0c-105.9 0-191.9 85.88-191.9 192c0 8.5 .625 16.75 1.75 25c5.875 4.25 11.62 8.875 16.75 14.25C262.1 226.5 275.2 224 287.1 224c52.88 0 95.1 43.13 95.1 96c0 3.625-.25 7.25-.625 10.75c23.62 10.75 42.37 29.5 53.5 52.5c54.38-3.375 103.7-29.25 137.1-70.37C579.2 306.4 573.5 296.8 565.2 298.4z\"]\n};\nvar faCloudMoonRain = {\n  prefix: 'fas',\n  iconName: 'cloud-moon-rain',\n  icon: [576, 512, [], \"f73c\", \"M350.5 225.5c-6.876-37.25-39.25-65.5-78.51-65.5c-12.25 0-23.88 2.1-34.25 7.1C220.3 143.9 192.1 128 160 128c-53.01 0-96.01 42.1-96.01 95.1c0 .5 .25 1.125 .25 1.625C27.63 232.9 0 265.3 0 304c0 44.25 35.75 79.1 80.01 79.1h256c44.25 0 80.01-35.75 80.01-79.1C416 264.8 387.8 232.3 350.5 225.5zM567.9 223.8C497.6 237.1 432.9 183.5 432.9 113c0-40.63 21.88-78 57.5-98.13c5.501-3.125 4.077-11.37-2.173-12.5C479.6 .7538 470.8 0 461.8 0c-77.88 0-141.1 61.25-144.4 137.9c26.75 11.88 48.26 33.88 58.88 61.75c37.13 14.25 64.01 47.38 70.26 86.75c5.126 .5 10.05 1.522 15.3 1.522c44.63 0 85.46-20.15 112.5-53.27C578.6 229.8 574.2 222.6 567.9 223.8zM340.1 426.7l-32 48c-7.345 11.03-4.376 25.94 6.657 33.28C318.8 510.7 323.4 512 327.1 512c7.751 0 15.38-3.75 20-10.69l32-48c7.345-11.03 4.376-25.94-6.657-33.28C362.3 412.7 347.4 415.7 340.1 426.7zM244 426.7l-32 48c-7.345 11.03-4.376 25.94 6.657 33.28C222.8 510.7 227.4 512 231.1 512c7.751 0 15.38-3.75 20-10.69l32-48c7.345-11.03 4.376-25.94-6.657-33.28C266.3 412.7 251.4 415.7 244 426.7zM148 426.7l-32 48c-7.345 11.03-4.376 25.94 6.657 33.28C126.8 510.7 131.4 512 135.1 512c7.751 0 15.38-3.75 20-10.69l32-48c7.345-11.03 4.376-25.94-6.657-33.28C170.3 412.7 155.4 415.7 148 426.7zM52.03 426.7l-32 48c-7.345 11.03-4.376 25.94 6.657 33.28C30.78 510.7 35.41 512 39.97 512c7.751 0 15.38-3.75 20-10.69l32-48c7.345-11.03 4.376-25.94-6.657-33.28C74.25 412.7 59.41 415.7 52.03 426.7z\"]\n};\nvar faCloudRain = {\n  prefix: 'fas',\n  iconName: 'cloud-rain',\n  icon: [512, 512, [127783, 9926], \"f73d\", \"M416 128c-.625 0-1.125 .25-1.625 .25C415.5 123 416 117.6 416 112C416 67.75 380.3 32 336 32c-24.62 0-46.25 11.25-61 28.75C256.4 24.75 219.3 0 176 0C114.1 0 64 50.13 64 112c0 7.25 .75 14.25 2.125 21.25C27.75 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96S469 128 416 128zM368 464c0 26.51 21.49 48 48 48s48-21.49 48-48s-48.01-95.1-48.01-95.1S368 437.5 368 464zM48 464C48 490.5 69.49 512 96 512s48-21.49 48-48s-48.01-95.1-48.01-95.1S48 437.5 48 464zM208 464c0 26.51 21.49 48 48 48s48-21.49 48-48s-48.01-95.1-48.01-95.1S208 437.5 208 464z\"]\n};\nvar faCloudShowersHeavy = {\n  prefix: 'fas',\n  iconName: 'cloud-showers-heavy',\n  icon: [512, 512, [], \"f740\", \"M416 128c-.625 0-1.125 .25-1.625 .25C415.5 123 416 117.6 416 112c0-44.25-35.75-80-79.1-80c-24.62 0-46.25 11.25-60.1 28.75C256.4 24.75 219.3 0 176 0C114.3 0 64 50.13 64 112c0 7.25 .7512 14.25 2.126 21.25C27.76 145.8 .0054 181.5 .0054 224c0 53 42.1 96 95.1 96h319.1C469 320 512 277 512 224S469 128 416 128zM198.8 353.9c-12.17-5.219-26.3 .4062-31.52 12.59l-47.1 112c-5.219 12.19 .4219 26.31 12.61 31.53C134.1 511.4 138.2 512 141.3 512c9.312 0 18.17-5.438 22.08-14.53l47.1-112C216.6 373.3 210.1 359.2 198.8 353.9zM81.46 353.9c-12.19-5.219-26.3 .4062-31.52 12.59l-47.1 112C-3.276 490.7 2.365 504.8 14.55 510.1C17.63 511.4 20.83 512 23.99 512c9.312 0 18.17-5.438 22.08-14.53l47.1-112C99.29 373.3 93.64 359.2 81.46 353.9zM316.1 353.9c-12.19-5.219-26.3 .4062-31.52 12.59l-47.1 112c-5.219 12.19 .4219 26.31 12.61 31.53C252.3 511.4 255.5 512 258.7 512c9.312 0 18.17-5.438 22.08-14.53l47.1-112C333.1 373.3 328.3 359.2 316.1 353.9zM433.5 353.9c-12.17-5.219-26.28 .4062-31.52 12.59l-47.1 112c-5.219 12.19 .4219 26.31 12.61 31.53C369.6 511.4 372.8 512 375.1 512c9.312 0 18.17-5.438 22.08-14.53l47.1-112C451.3 373.3 445.6 359.2 433.5 353.9z\"]\n};\nvar faCloudShowersWater = {\n  prefix: 'fas',\n  iconName: 'cloud-showers-water',\n  icon: [576, 512, [], \"e4e4\", \"M223.1 0C262.6 0 295.9 22.82 311.2 55.7C325.7 41.07 345.8 32 368 32C406.7 32 438.1 59.48 446.4 96H448C483.3 96 512 124.7 512 160C512 195.3 483.3 224 448 224H127.1C92.65 224 63.1 195.3 63.1 160C63.1 124.7 92.65 96 127.1 96C127.1 42.98 170.1 0 223.1 0zM92.58 372.3C85.76 383.7 71.02 387.4 59.65 380.6C48.29 373.8 44.6 359 51.42 347.7L99.42 267.7C106.2 256.3 120.1 252.6 132.3 259.4C143.7 266.2 147.4 280.1 140.6 292.3L92.58 372.3zM468.3 259.4C479.7 266.2 483.4 280.1 476.6 292.3L428.6 372.3C421.8 383.7 407 387.4 395.7 380.6C384.3 373.8 380.6 359 387.4 347.7L435.4 267.7C442.2 256.3 456.1 252.6 468.3 259.4V259.4zM204.6 372.3C197.8 383.7 183 387.4 171.7 380.6C160.3 373.8 156.6 359 163.4 347.7L211.4 267.7C218.2 256.3 232.1 252.6 244.3 259.4C255.7 266.2 259.4 280.1 252.6 292.3L204.6 372.3zM356.3 259.4C367.7 266.2 371.4 280.1 364.6 292.3L316.6 372.3C309.8 383.7 295 387.4 283.7 380.6C272.3 373.8 268.6 359 275.4 347.7L323.4 267.7C330.2 256.3 344.1 252.6 356.3 259.4V259.4zM384 448C410.9 448 439.4 437.2 461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.12 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.853 504.5 .8422 487.3C-3.169 470.1 7.532 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448H384z\"]\n};\nvar faCloudSun = {\n  prefix: 'fas',\n  iconName: 'cloud-sun',\n  icon: [640, 512, [9925], \"f6c4\", \"M96 208c0-61.86 50.14-111.1 111.1-111.1c52.65 0 96.5 36.45 108.5 85.42C334.7 173.1 354.7 168 375.1 168c4.607 0 9.152 .3809 13.68 .8203l24.13-34.76c5.145-7.414 .8965-17.67-7.984-19.27L317.2 98.78L301.2 10.21C299.6 1.325 289.4-2.919 281.9 2.226L208 53.54L134.1 2.225C126.6-2.92 116.4 1.326 114.8 10.21L98.78 98.78L10.21 114.8C1.326 116.4-2.922 126.7 2.223 134.1l51.3 73.94L2.224 281.9c-5.145 7.414-.8975 17.67 7.983 19.27L98.78 317.2l16.01 88.58c1.604 8.881 11.86 13.13 19.27 7.982l10.71-7.432c2.725-35.15 19.85-66.51 45.83-88.1C137.1 309.8 96 263.9 96 208zM128 208c0 44.18 35.82 80 80 80c9.729 0 18.93-1.996 27.56-5.176c7.002-33.65 25.53-62.85 51.57-83.44C282.8 159.3 249.2 128 208 128C163.8 128 128 163.8 128 208zM575.2 325.6c.125-2 .7453-3.744 .7453-5.619c0-35.38-28.75-64-63.1-64c-12.62 0-24.25 3.749-34.13 9.999c-17.62-38.88-56.5-65.1-101.9-65.1c-61.75 0-112 50.12-112 111.1c0 3 .7522 5.743 .8772 8.618c-49.63 3.75-88.88 44.74-88.88 95.37C175.1 469 218.1 512 271.1 512h272c53 0 96-42.99 96-95.99C639.1 373.9 612.7 338.6 575.2 325.6z\"]\n};\nvar faCloudSunRain = {\n  prefix: 'fas',\n  iconName: 'cloud-sun-rain',\n  icon: [640, 512, [127782], \"f743\", \"M255.7 139.1C244.8 125.5 227.6 116 208 116c-33.14 0-60 26.86-60 59.1c0 25.56 16.06 47.24 38.58 55.88C197.2 219.3 210.5 208.9 225.9 201.1C229.1 178.5 240.6 157.3 255.7 139.1zM120 175.1c0-48.6 39.4-87.1 88-87.1c27.8 0 52.29 13.14 68.42 33.27c21.24-15.67 47.22-25.3 75.58-25.3c.0098 0-.0098 0 0 0L300.4 83.58L286.9 8.637C285.9 3.346 281.3 .0003 276.5 .0003c-2.027 0-4.096 .5928-5.955 1.881l-62.57 43.42L145.4 1.882C143.6 .5925 141.5-.0003 139.5-.0003c-4.818 0-9.399 3.346-10.35 8.636l-13.54 74.95L40.64 97.13c-5.289 .9556-8.637 5.538-8.637 10.36c0 2.026 .5921 4.094 1.881 5.951l43.41 62.57L33.88 238.6C32.59 240.4 32 242.5 32 244.5c0 4.817 3.347 9.398 8.636 10.35l74.95 13.54l13.54 74.95c.9555 5.289 5.537 8.636 10.35 8.636c2.027 0 4.096-.5927 5.954-1.882l19.47-13.51c-3.16-10.34-4.934-21.28-4.934-32.64c0-17.17 4.031-33.57 11.14-48.32C141 241.7 120 211.4 120 175.1zM542.5 225.5c-6.875-37.25-39.25-65.5-78.51-65.5c-12.25 0-23.88 3-34.25 8c-17.5-24.13-45.63-40-77.76-40c-53 0-96.01 43-96.01 96c0 .5 .25 1.125 .25 1.625C219.6 232.1 191.1 265.2 191.1 303.1c0 44.25 35.75 80 80.01 80h256C572.2 383.1 608 348.2 608 303.1C608 264.7 579.7 232.2 542.5 225.5zM552 415.1c-7.753 0-15.35 3.752-19.97 10.69l-32 48c-2.731 4.093-4.037 8.719-4.037 13.29C496 501.4 506.9 512 520 512c7.75 0 15.36-3.75 19.98-10.69l32-48c2.731-4.093 4.037-8.719 4.037-13.29C576 426.6 565.1 415.1 552 415.1zM456 415.1c-7.751 0-15.34 3.752-19.98 10.69l-32 48c-2.731 4.093-4.037 8.719-4.037 13.29C400 501.4 410.9 512 423.1 512c7.75 0 15.36-3.75 19.98-10.69l32-48c2.731-4.093 4.037-8.719 4.037-13.29C480 426.6 469.1 415.1 456 415.1zM360 415.1c-7.753 0-15.34 3.752-19.97 10.69l-32 48c-2.731 4.093-4.037 8.719-4.037 13.29C304 501.4 314.9 512 327.1 512c7.75 0 15.36-3.75 19.99-10.69l32-48c2.731-4.093 4.037-8.719 4.037-13.29C384 426.6 373.1 415.1 360 415.1zM264 415.1c-7.756 0-15.35 3.752-19.97 10.69l-32 48c-2.731 4.093-4.037 8.719-4.037 13.29C208 501.4 218.9 512 231.1 512c7.75 0 15.36-3.75 19.98-10.69l32-48c2.731-4.093 4.037-8.719 4.037-13.29C288 426.6 277.1 415.1 264 415.1z\"]\n};\nvar faClover = {\n  prefix: 'fas',\n  iconName: 'clover',\n  icon: [512, 512, [], \"e139\", \"M512 302.3c0 35.29-28.99 63.91-64.28 63.91c-38.82 0-88.7-22.75-122.4-40.92c18.17 33.7 40.92 83.57 40.92 122.4c0 35.29-28.61 63.91-63.91 63.91c-18.1 0-34.45-7.52-46.09-19.63C244.6 504.3 228 512 209.7 512c-35.29 0-63.91-28.99-63.91-64.28c0-38.82 22.75-88.7 40.92-122.4c-33.7 18.17-83.57 40.92-122.4 40.92c-35.29 0-63.91-28.61-63.91-63.91c0-18.1 7.52-34.45 19.63-46.09C7.676 244.6 0 228 0 209.7c0-35.29 28.99-63.91 64.28-63.91c38.82 0 88.7 22.75 122.4 40.92C168.5 152.1 145.8 103.1 145.8 64.28c0-35.29 28.61-63.91 63.91-63.91c18.1 0 34.45 7.52 46.09 19.63C267.4 7.676 283.1 0 302.3 0c35.29 0 63.91 28.99 63.91 64.28c0 38.82-22.75 88.7-40.92 122.4c33.7-18.17 83.57-40.92 122.4-40.92c35.29 0 63.91 28.61 63.91 63.91c0 18.1-7.52 34.45-19.63 46.09C504.3 267.4 512 283.1 512 302.3z\"]\n};\nvar faCode = {\n  prefix: 'fas',\n  iconName: 'code',\n  icon: [640, 512, [], \"f121\", \"M414.8 40.79L286.8 488.8C281.9 505.8 264.2 515.6 247.2 510.8C230.2 505.9 220.4 488.2 225.2 471.2L353.2 23.21C358.1 6.216 375.8-3.624 392.8 1.232C409.8 6.087 419.6 23.8 414.8 40.79H414.8zM518.6 121.4L630.6 233.4C643.1 245.9 643.1 266.1 630.6 278.6L518.6 390.6C506.1 403.1 485.9 403.1 473.4 390.6C460.9 378.1 460.9 357.9 473.4 345.4L562.7 256L473.4 166.6C460.9 154.1 460.9 133.9 473.4 121.4C485.9 108.9 506.1 108.9 518.6 121.4V121.4zM166.6 166.6L77.25 256L166.6 345.4C179.1 357.9 179.1 378.1 166.6 390.6C154.1 403.1 133.9 403.1 121.4 390.6L9.372 278.6C-3.124 266.1-3.124 245.9 9.372 233.4L121.4 121.4C133.9 108.9 154.1 108.9 166.6 121.4C179.1 133.9 179.1 154.1 166.6 166.6V166.6z\"]\n};\nvar faCodeBranch = {\n  prefix: 'fas',\n  iconName: 'code-branch',\n  icon: [448, 512, [], \"f126\", \"M160 80C160 112.8 140.3 140.1 112 153.3V241.1C130.8 230.2 152.7 224 176 224H272C307.3 224 336 195.3 336 160V153.3C307.7 140.1 288 112.8 288 80C288 35.82 323.8 0 368 0C412.2 0 448 35.82 448 80C448 112.8 428.3 140.1 400 153.3V160C400 230.7 342.7 288 272 288H176C140.7 288 112 316.7 112 352V358.7C140.3 371 160 399.2 160 432C160 476.2 124.2 512 80 512C35.82 512 0 476.2 0 432C0 399.2 19.75 371 48 358.7V153.3C19.75 140.1 0 112.8 0 80C0 35.82 35.82 0 80 0C124.2 0 160 35.82 160 80V80zM80 104C93.25 104 104 93.25 104 80C104 66.75 93.25 56 80 56C66.75 56 56 66.75 56 80C56 93.25 66.75 104 80 104zM368 56C354.7 56 344 66.75 344 80C344 93.25 354.7 104 368 104C381.3 104 392 93.25 392 80C392 66.75 381.3 56 368 56zM80 456C93.25 456 104 445.3 104 432C104 418.7 93.25 408 80 408C66.75 408 56 418.7 56 432C56 445.3 66.75 456 80 456z\"]\n};\nvar faCodeCommit = {\n  prefix: 'fas',\n  iconName: 'code-commit',\n  icon: [640, 512, [], \"f386\", \"M476.8 288C461.1 361 397.4 416 320 416C242.6 416 178 361 163.2 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H163.2C178 150.1 242.6 96 320 96C397.4 96 461.1 150.1 476.8 224H608C625.7 224 640 238.3 640 256C640 273.7 625.7 288 608 288H476.8zM320 336C364.2 336 400 300.2 400 256C400 211.8 364.2 176 320 176C275.8 176 240 211.8 240 256C240 300.2 275.8 336 320 336z\"]\n};\nvar faCodeCompare = {\n  prefix: 'fas',\n  iconName: 'code-compare',\n  icon: [512, 512, [], \"e13a\", \"M320 488C320 497.5 314.4 506.1 305.8 509.9C297.1 513.8 286.1 512.2 279.9 505.8L199.9 433.8C194.9 429.3 192 422.8 192 416C192 409.2 194.9 402.7 199.9 398.2L279.9 326.2C286.1 319.8 297.1 318.2 305.8 322.1C314.4 325.9 320 334.5 320 344V384H336C371.3 384 400 355.3 400 320V153.3C371.7 140.1 352 112.8 352 80C352 35.82 387.8 0 432 0C476.2 0 512 35.82 512 80C512 112.8 492.3 140.1 464 153.3V320C464 390.7 406.7 448 336 448H320V488zM456 79.1C456 66.74 445.3 55.1 432 55.1C418.7 55.1 408 66.74 408 79.1C408 93.25 418.7 103.1 432 103.1C445.3 103.1 456 93.25 456 79.1zM192 24C192 14.52 197.6 5.932 206.2 2.076C214.9-1.78 225-.1789 232.1 6.161L312.1 78.16C317.1 82.71 320 89.2 320 96C320 102.8 317.1 109.3 312.1 113.8L232.1 185.8C225 192.2 214.9 193.8 206.2 189.9C197.6 186.1 192 177.5 192 168V128H176C140.7 128 112 156.7 112 192V358.7C140.3 371 160 399.2 160 432C160 476.2 124.2 512 80 512C35.82 512 0 476.2 0 432C0 399.2 19.75 371 48 358.7V192C48 121.3 105.3 64 176 64H192V24zM56 432C56 445.3 66.75 456 80 456C93.25 456 104 445.3 104 432C104 418.7 93.25 408 80 408C66.75 408 56 418.7 56 432z\"]\n};\nvar faCodeFork = {\n  prefix: 'fas',\n  iconName: 'code-fork',\n  icon: [448, 512, [], \"e13b\", \"M160 80C160 112.8 140.3 140.1 112 153.3V192C112 209.7 126.3 224 144 224H304C321.7 224 336 209.7 336 192V153.3C307.7 140.1 288 112.8 288 80C288 35.82 323.8 0 368 0C412.2 0 448 35.82 448 80C448 112.8 428.3 140.1 400 153.3V192C400 245 357 288 304 288H256V358.7C284.3 371 304 399.2 304 432C304 476.2 268.2 512 224 512C179.8 512 144 476.2 144 432C144 399.2 163.7 371 192 358.7V288H144C90.98 288 48 245 48 192V153.3C19.75 140.1 0 112.8 0 80C0 35.82 35.82 0 80 0C124.2 0 160 35.82 160 80V80zM80 104C93.25 104 104 93.25 104 80C104 66.75 93.25 56 80 56C66.75 56 56 66.75 56 80C56 93.25 66.75 104 80 104zM368 104C381.3 104 392 93.25 392 80C392 66.75 381.3 56 368 56C354.7 56 344 66.75 344 80C344 93.25 354.7 104 368 104zM224 408C210.7 408 200 418.7 200 432C200 445.3 210.7 456 224 456C237.3 456 248 445.3 248 432C248 418.7 237.3 408 224 408z\"]\n};\nvar faCodeMerge = {\n  prefix: 'fas',\n  iconName: 'code-merge',\n  icon: [448, 512, [], \"f387\", \"M208 239.1H294.7C307 211.7 335.2 191.1 368 191.1C412.2 191.1 448 227.8 448 271.1C448 316.2 412.2 352 368 352C335.2 352 307 332.3 294.7 303.1H208C171.1 303.1 138.7 292.1 112 272V358.7C140.3 371 160 399.2 160 432C160 476.2 124.2 512 80 512C35.82 512 0 476.2 0 432C0 399.2 19.75 371 48 358.7V153.3C19.75 140.1 0 112.8 0 80C0 35.82 35.82 0 80 0C124.2 0 160 35.82 160 80C160 112.6 140.5 140.7 112.4 153.2C117 201.9 158.1 240 208 240V239.1zM80 103.1C93.25 103.1 104 93.25 104 79.1C104 66.74 93.25 55.1 80 55.1C66.75 55.1 56 66.74 56 79.1C56 93.25 66.75 103.1 80 103.1zM80 456C93.25 456 104 445.3 104 432C104 418.7 93.25 408 80 408C66.75 408 56 418.7 56 432C56 445.3 66.75 456 80 456zM368 247.1C354.7 247.1 344 258.7 344 271.1C344 285.3 354.7 295.1 368 295.1C381.3 295.1 392 285.3 392 271.1C392 258.7 381.3 247.1 368 247.1z\"]\n};\nvar faCodePullRequest = {\n  prefix: 'fas',\n  iconName: 'code-pull-request',\n  icon: [512, 512, [], \"e13c\", \"M305.8 2.076C314.4 5.932 320 14.52 320 24V64H336C406.7 64 464 121.3 464 192V358.7C492.3 371 512 399.2 512 432C512 476.2 476.2 512 432 512C387.8 512 352 476.2 352 432C352 399.2 371.7 371 400 358.7V192C400 156.7 371.3 128 336 128H320V168C320 177.5 314.4 186.1 305.8 189.9C297.1 193.8 286.1 192.2 279.9 185.8L199.9 113.8C194.9 109.3 192 102.8 192 96C192 89.2 194.9 82.71 199.9 78.16L279.9 6.161C286.1-.1791 297.1-1.779 305.8 2.077V2.076zM432 456C445.3 456 456 445.3 456 432C456 418.7 445.3 408 432 408C418.7 408 408 418.7 408 432C408 445.3 418.7 456 432 456zM112 358.7C140.3 371 160 399.2 160 432C160 476.2 124.2 512 80 512C35.82 512 0 476.2 0 432C0 399.2 19.75 371 48 358.7V153.3C19.75 140.1 0 112.8 0 80C0 35.82 35.82 .0004 80 .0004C124.2 .0004 160 35.82 160 80C160 112.8 140.3 140.1 112 153.3V358.7zM80 56C66.75 56 56 66.75 56 80C56 93.25 66.75 104 80 104C93.25 104 104 93.25 104 80C104 66.75 93.25 56 80 56zM80 408C66.75 408 56 418.7 56 432C56 445.3 66.75 456 80 456C93.25 456 104 445.3 104 432C104 418.7 93.25 408 80 408z\"]\n};\nvar faCoins = {\n  prefix: 'fas',\n  iconName: 'coins',\n  icon: [512, 512, [], \"f51e\", \"M512 80C512 98.01 497.7 114.6 473.6 128C444.5 144.1 401.2 155.5 351.3 158.9C347.7 157.2 343.9 155.5 340.1 153.9C300.6 137.4 248.2 128 192 128C183.7 128 175.6 128.2 167.5 128.6L166.4 128C142.3 114.6 128 98.01 128 80C128 35.82 213.1 0 320 0C426 0 512 35.82 512 80V80zM160.7 161.1C170.9 160.4 181.3 160 192 160C254.2 160 309.4 172.3 344.5 191.4C369.3 204.9 384 221.7 384 240C384 243.1 383.3 247.9 381.9 251.7C377.3 264.9 364.1 277 346.9 287.3C346.9 287.3 346.9 287.3 346.9 287.3C346.8 287.3 346.6 287.4 346.5 287.5L346.5 287.5C346.2 287.7 345.9 287.8 345.6 288C310.6 307.4 254.8 320 192 320C132.4 320 79.06 308.7 43.84 290.9C41.97 289.9 40.15 288.1 38.39 288C14.28 274.6 0 258 0 240C0 205.2 53.43 175.5 128 164.6C138.5 163 149.4 161.8 160.7 161.1L160.7 161.1zM391.9 186.6C420.2 182.2 446.1 175.2 468.1 166.1C484.4 159.3 499.5 150.9 512 140.6V176C512 195.3 495.5 213.1 468.2 226.9C453.5 234.3 435.8 240.5 415.8 245.3C415.9 243.6 416 241.8 416 240C416 218.1 405.4 200.1 391.9 186.6V186.6zM384 336C384 354 369.7 370.6 345.6 384C343.8 384.1 342 385.9 340.2 386.9C304.9 404.7 251.6 416 192 416C129.2 416 73.42 403.4 38.39 384C14.28 370.6 .0003 354 .0003 336V300.6C12.45 310.9 27.62 319.3 43.93 326.1C83.44 342.6 135.8 352 192 352C248.2 352 300.6 342.6 340.1 326.1C347.9 322.9 355.4 319.2 362.5 315.2C368.6 311.8 374.3 308 379.7 304C381.2 302.9 382.6 301.7 384 300.6L384 336zM416 278.1C434.1 273.1 452.5 268.6 468.1 262.1C484.4 255.3 499.5 246.9 512 236.6V272C512 282.5 507 293 497.1 302.9C480.8 319.2 452.1 332.6 415.8 341.3C415.9 339.6 416 337.8 416 336V278.1zM192 448C248.2 448 300.6 438.6 340.1 422.1C356.4 415.3 371.5 406.9 384 396.6V432C384 476.2 298 512 192 512C85.96 512 .0003 476.2 .0003 432V396.6C12.45 406.9 27.62 415.3 43.93 422.1C83.44 438.6 135.8 448 192 448z\"]\n};\nvar faColonSign = {\n  prefix: 'fas',\n  iconName: 'colon-sign',\n  icon: [320, 512, [], \"e140\", \"M216.6 65.56C226.4 66.81 235.9 68.8 245.2 71.46L256.1 24.24C261.2 7.093 278.6-3.331 295.8 .9552C312.9 5.242 323.3 22.62 319 39.76L303.1 100C305.1 100.8 306.2 101.6 307.2 102.4C321.4 113 324.2 133.1 313.6 147.2C307.5 155.3 298.4 159.7 288.1 159.1L234.8 376.7C247.1 372.3 258.5 366.1 268.8 358.4C282.9 347.8 302.1 350.6 313.6 364.8C324.2 378.9 321.4 398.1 307.2 409.6C281.5 428.9 250.8 441.9 217.4 446.3L207 487.8C202.8 504.9 185.4 515.3 168.2 511C151.1 506.8 140.7 489.4 144.1 472.2L152.1 443.8C142.4 441.8 133.1 439.1 124.1 435.6L111 487.8C106.8 504.9 89.38 515.3 72.24 511C55.09 506.8 44.67 489.4 48.96 472.2L66.65 401.4C25.84 366.2 0 314.1 0 256C0 164.4 64.09 87.85 149.9 68.64L160.1 24.24C165.2 7.093 182.6-3.331 199.8 .9552C216.9 5.242 227.3 22.62 223 39.76L216.6 65.56zM131.2 143.3C91.17 164.1 64 207.3 64 256C64 282.2 71.85 306.5 85.32 326.8L131.2 143.3zM167.6 381.7L229.6 133.6C220.4 130.8 210.8 128.1 200.9 128.3L139.8 372.9C148.6 376.8 157.9 379.8 167.6 381.7V381.7z\"]\n};\nvar faComment = {\n  prefix: 'fas',\n  iconName: 'comment',\n  icon: [512, 512, [61669, 128489], \"f075\", \"M256 32C114.6 32 .0272 125.1 .0272 240c0 49.63 21.35 94.98 56.97 130.7c-12.5 50.37-54.27 95.27-54.77 95.77c-2.25 2.25-2.875 5.734-1.5 8.734C1.979 478.2 4.75 480 8 480c66.25 0 115.1-31.76 140.6-51.39C181.2 440.9 217.6 448 256 448c141.4 0 255.1-93.13 255.1-208S397.4 32 256 32z\"]\n};\nvar faCommentDollar = {\n  prefix: 'fas',\n  iconName: 'comment-dollar',\n  icon: [512, 512, [], \"f651\", \"M256 31.1c-141.4 0-255.1 93.09-255.1 208c0 49.59 21.37 94.1 56.97 130.7c-12.5 50.39-54.31 95.3-54.81 95.8C0 468.8-.5938 472.2 .6875 475.2C1.1 478.2 4.813 479.1 8 479.1c66.31 0 116-31.8 140.6-51.41c32.72 12.31 69.02 19.41 107.4 19.41c141.4 0 255.1-93.09 255.1-207.1S397.4 31.1 256 31.1zM317.8 282.3c-3.623 20.91-19.47 34.64-41.83 39.43V332c0 11.03-8.946 20-19.99 20S236 343 236 332v-10.77c-8.682-1.922-17.3-4.723-25.06-7.512l-4.266-1.5C196.3 308.5 190.8 297.1 194.5 286.7c3.688-10.41 15.11-15.81 25.52-12.22l4.469 1.625c7.844 2.812 16.72 6 23.66 7.031c13.72 2.125 28.94 .1875 30.31-7.625c.875-5.094 1.359-7.906-27.92-16.28L244.7 257.5c-17.33-5.094-57.92-17-50.52-59.84C197.8 176.8 213.6 162.8 236 157.1V148c0-11.03 8.961-20 20.01-20s19.99 8.969 19.99 20v10.63c5.453 1.195 11.34 2.789 18.56 5.273c10.44 3.625 15.95 15.03 12.33 25.47c-3.625 10.41-15.06 15.94-25.45 12.34c-5.859-2.031-12-4-17.59-4.844C250.2 194.8 234.1 196.7 233.6 204.5C232.8 208.1 232.3 212.2 255.1 219.2l5.547 1.594C283.8 227.1 325.3 239 317.8 282.3z\"]\n};\nvar faCommentDots = {\n  prefix: 'fas',\n  iconName: 'comment-dots',\n  icon: [512, 512, [62075, 128172, \"commenting\"], \"f4ad\", \"M256 31.1c-141.4 0-255.1 93.12-255.1 208c0 49.62 21.35 94.98 56.97 130.7c-12.5 50.37-54.27 95.27-54.77 95.77c-2.25 2.25-2.875 5.734-1.5 8.734c1.249 3 4.021 4.766 7.271 4.766c66.25 0 115.1-31.76 140.6-51.39c32.63 12.25 69.02 19.39 107.4 19.39c141.4 0 255.1-93.13 255.1-207.1S397.4 31.1 256 31.1zM127.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S145.7 271.1 127.1 271.1zM256 271.1c-17.75 0-31.1-14.25-31.1-31.1s14.25-32 31.1-32s31.1 14.25 31.1 32S273.8 271.1 256 271.1zM383.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S401.7 271.1 383.1 271.1z\"]\n};\nvar faCommenting = faCommentDots;\nvar faCommentMedical = {\n  prefix: 'fas',\n  iconName: 'comment-medical',\n  icon: [512, 512, [], \"f7f5\", \"M256 31.1c-141.4 0-255.1 93.09-255.1 208c0 49.59 21.38 94.1 56.97 130.7c-12.5 50.39-54.31 95.3-54.81 95.8C0 468.8-.5938 472.2 .6875 475.2c1.312 3 4.125 4.797 7.312 4.797c66.31 0 116-31.8 140.6-51.41c32.72 12.31 69.01 19.41 107.4 19.41C397.4 447.1 512 354.9 512 239.1S397.4 31.1 256 31.1zM368 266c0 8.836-7.164 16-16 16h-54V336c0 8.836-7.164 16-16 16h-52c-8.836 0-16-7.164-16-16V282H160c-8.836 0-16-7.164-16-16V214c0-8.838 7.164-16 16-16h53.1V144c0-8.838 7.164-16 16-16h52c8.836 0 16 7.162 16 16v54H352c8.836 0 16 7.162 16 16V266z\"]\n};\nvar faCommentSlash = {\n  prefix: 'fas',\n  iconName: 'comment-slash',\n  icon: [640, 512, [], \"f4b3\", \"M64.03 239.1c0 49.59 21.38 94.1 56.97 130.7c-12.5 50.39-54.31 95.3-54.81 95.8c-2.187 2.297-2.781 5.703-1.5 8.703c1.312 3 4.125 4.797 7.312 4.797c66.31 0 116-31.8 140.6-51.41c32.72 12.31 69.02 19.41 107.4 19.41c37.39 0 72.78-6.663 104.8-18.36L82.93 161.7C70.81 185.9 64.03 212.3 64.03 239.1zM630.8 469.1l-118.1-92.59C551.1 340 576 292.4 576 240c0-114.9-114.6-207.1-255.1-207.1c-67.74 0-129.1 21.55-174.9 56.47L38.81 5.117C28.21-3.154 13.16-1.096 5.115 9.19C-3.072 19.63-1.249 34.72 9.188 42.89l591.1 463.1c10.5 8.203 25.57 6.333 33.7-4.073C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faCommentSms = {\n  prefix: 'fas',\n  iconName: 'comment-sms',\n  icon: [512, 512, [\"sms\"], \"f7cd\", \"M256 32C114.6 32 .0137 125.1 .0137 240c0 49.59 21.39 95 56.99 130.7c-12.5 50.39-54.31 95.3-54.81 95.8C0 468.8-.5938 472.2 .6875 475.2C1.1 478.2 4.813 480 8 480c66.31 0 116-31.8 140.6-51.41C181.3 440.9 217.6 448 256 448C397.4 448 512 354.9 512 240S397.4 32 256 32zM167.3 271.9C163.9 291.1 146.3 304 121.1 304c-4.031 0-8.25-.3125-12.59-1C101.1 301.8 92.81 298.8 85.5 296.1c-8.312-3-14.06-12.66-11.09-20.97S85 261.1 93.38 264.9c6.979 2.498 14.53 5.449 20.88 6.438C125.7 273.1 135 271 135.8 266.4c1.053-5.912-10.84-8.396-24.56-12.34c-12.12-3.531-44.28-12.97-38.63-46c4.062-23.38 27.31-35.91 58-31.09c5.906 .9062 12.44 2.844 18.59 4.969c8.344 2.875 12.78 12 9.906 20.34C156.3 210.7 147.2 215.1 138.8 212.2c-4.344-1.5-8.938-2.938-13.09-3.594c-11.22-1.656-20.72 .4062-21.5 4.906C103.2 219.2 113.6 221.5 124.4 224.6C141.4 229.5 173.1 238.5 167.3 271.9zM320 288c0 8.844-7.156 16-16 16S288 296.8 288 288V240l-19.19 25.59c-6.062 8.062-19.55 8.062-25.62 0L224 240V288c0 8.844-7.156 16-16 16S192 296.8 192 288V192c0-6.875 4.406-12.1 10.94-15.18c6.5-2.094 13.71 .0586 17.87 5.59L256 229.3l35.19-46.93c4.156-5.531 11.4-7.652 17.87-5.59C315.6 179 320 185.1 320 192V288zM439.3 271.9C435.9 291.1 418.3 304 393.1 304c-4.031 0-8.25-.3125-12.59-1c-8.25-1.25-16.56-4.25-23.88-6.906c-8.312-3-14.06-12.66-11.09-20.97s10.59-13.16 18.97-10.19c6.979 2.498 14.53 5.449 20.88 6.438c11.44 1.719 20.78-.375 21.56-4.938c1.053-5.912-10.84-8.396-24.56-12.34c-12.12-3.531-44.28-12.97-38.63-46c4.031-23.38 27.25-35.91 58-31.09c5.906 .9062 12.44 2.844 18.59 4.969c8.344 2.875 12.78 12 9.906 20.34c-2.875 8.344-11.94 12.81-20.34 9.906c-4.344-1.5-8.938-2.938-13.09-3.594c-11.19-1.656-20.72 .4062-21.5 4.906C375.2 219.2 385.6 221.5 396.4 224.6C413.4 229.5 445.1 238.5 439.3 271.9z\"]\n};\nvar faSms = faCommentSms;\nvar faComments = {\n  prefix: 'fas',\n  iconName: 'comments',\n  icon: [640, 512, [61670, 128490], \"f086\", \"M416 176C416 78.8 322.9 0 208 0S0 78.8 0 176c0 39.57 15.62 75.96 41.67 105.4c-16.39 32.76-39.23 57.32-39.59 57.68c-2.1 2.205-2.67 5.475-1.441 8.354C1.9 350.3 4.602 352 7.66 352c38.35 0 70.76-11.12 95.74-24.04C134.2 343.1 169.8 352 208 352C322.9 352 416 273.2 416 176zM599.6 443.7C624.8 413.9 640 376.6 640 336C640 238.8 554 160 448 160c-.3145 0-.6191 .041-.9336 .043C447.5 165.3 448 170.6 448 176c0 98.62-79.68 181.2-186.1 202.5C282.7 455.1 357.1 512 448 512c33.69 0 65.32-8.008 92.85-21.98C565.2 502 596.1 512 632.3 512c3.059 0 5.76-1.725 7.02-4.605c1.229-2.879 .6582-6.148-1.441-8.354C637.6 498.7 615.9 475.3 599.6 443.7z\"]\n};\nvar faCommentsDollar = {\n  prefix: 'fas',\n  iconName: 'comments-dollar',\n  icon: [640, 512, [], \"f653\", \"M416 176C416 78.8 322.9 0 208 0S0 78.8 0 176c0 39.57 15.62 75.96 41.67 105.4c-16.39 32.76-39.23 57.32-39.59 57.68c-2.1 2.205-2.67 5.475-1.441 8.354C1.9 350.3 4.602 352 7.66 352c38.35 0 70.76-11.12 95.74-24.04C134.2 343.1 169.8 352 208 352C322.9 352 416 273.2 416 176zM269.8 218.3C266.2 239.2 250.4 252.1 228 257.7V268c0 11.03-8.953 20-20 20s-20-8.969-20-20V257.2c-8.682-1.922-17.3-4.723-25.06-7.512l-4.266-1.5C148.3 244.5 142.8 233.1 146.5 222.7c3.688-10.41 15.11-15.81 25.52-12.22l4.469 1.625c7.844 2.812 16.72 6 23.66 7.031C213.8 221.3 229 219.3 230.4 211.5C231.3 206.4 231.8 203.6 202.5 195.2L196.7 193.5c-17.33-5.094-57.92-17-50.52-59.84C149.8 112.8 165.6 98.76 188 93.99V84c0-11.03 8.953-20 20-20s20 8.969 20 20v10.63c5.453 1.195 11.34 2.789 18.56 5.273C257 103.5 262.5 114.9 258.9 125.4C255.3 135.8 243.8 141.3 233.4 137.7c-5.859-2.031-12-4-17.59-4.844C202.2 130.8 186.1 132.7 185.6 140.5C184.8 144.1 184.3 148.2 207.1 155.2L213.5 156.8C235.8 163.1 277.3 175 269.8 218.3zM599.6 443.7C624.8 413.9 640 376.6 640 336C640 238.8 554 160 448 160c-.3145 0-.6191 .041-.9336 .043C447.5 165.3 448 170.6 448 176c0 98.62-79.68 181.2-186.1 202.5C282.7 455.1 357.1 512 448 512c33.69 0 65.32-8.008 92.85-21.98C565.2 502 596.1 512 632.3 512c3.059 0 5.76-1.725 7.02-4.605c1.229-2.879 .6582-6.148-1.441-8.354C637.6 498.7 615.9 475.3 599.6 443.7z\"]\n};\nvar faCompactDisc = {\n  prefix: 'fas',\n  iconName: 'compact-disc',\n  icon: [512, 512, [128192, 128440, 128191], \"f51f\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM80.72 256H79.63c-9.078 0-16.4-8.011-15.56-17.34C72.36 146 146.5 72.06 239.3 64.06C248.3 63.28 256 70.75 256 80.09c0 8.35-6.215 15.28-14.27 15.99C164.7 102.9 103.1 164.3 96.15 241.4C95.4 249.6 88.77 256 80.72 256zM256 351.1c-53.02 0-96-43-96-95.1s42.98-96 96-96s96 43 96 96S309 351.1 256 351.1zM256 224C238.3 224 224 238.2 224 256s14.3 32 32 32c17.7 0 32-14.25 32-32S273.7 224 256 224z\"]\n};\nvar faCompass = {\n  prefix: 'fas',\n  iconName: 'compass',\n  icon: [512, 512, [129517], \"f14e\", \"M288 256C288 273.7 273.7 288 256 288C238.3 288 224 273.7 224 256C224 238.3 238.3 224 256 224C273.7 224 288 238.3 288 256zM0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM325.1 306.7L380.6 162.4C388.1 142.1 369 123.9 349.6 131.4L205.3 186.9C196.8 190.1 190.1 196.8 186.9 205.3L131.4 349.6C123.9 369 142.1 388.1 162.4 380.6L306.7 325.1C315.2 321.9 321.9 315.2 325.1 306.7V306.7z\"]\n};\nvar faCompassDrafting = {\n  prefix: 'fas',\n  iconName: 'compass-drafting',\n  icon: [512, 512, [\"drafting-compass\"], \"f568\", \"M352 96C352 110.3 348.9 123.9 343.2 136.2L396 227.4C372.3 252.7 341.9 271.5 307.6 281L256 192H255.1L187.9 309.5C209.4 316.3 232.3 320 256 320C326.7 320 389.8 287.3 430.9 235.1C441.9 222.2 462.1 219.1 475.9 231C489.7 242.1 491.9 262.2 480.8 276C428.1 341.8 346.1 384 256 384C220.6 384 186.6 377.6 155.3 365.9L98.65 463.7C93.95 471.8 86.97 478.4 78.58 482.6L23.16 510.3C18.2 512.8 12.31 512.5 7.588 509.6C2.871 506.7 0 501.5 0 496V440.6C0 432.2 2.228 423.9 6.46 416.5L66.49 312.9C53.66 301.6 41.84 289.3 31.18 276C20.13 262.2 22.34 242.1 36.13 231C49.92 219.1 70.06 222.2 81.12 235.1C86.79 243.1 92.87 249.8 99.34 256.1L168.8 136.2C163.1 123.9 160 110.3 160 96C160 42.98 202.1 0 256 0C309 0 352 42.98 352 96L352 96zM256 128C273.7 128 288 113.7 288 96C288 78.33 273.7 64 256 64C238.3 64 224 78.33 224 96C224 113.7 238.3 128 256 128zM372.1 393.9C405.5 381.1 435.5 363.2 461.8 341L505.5 416.5C509.8 423.9 512 432.2 512 440.6V496C512 501.5 509.1 506.7 504.4 509.6C499.7 512.5 493.8 512.8 488.8 510.3L433.4 482.6C425 478.4 418.1 471.8 413.3 463.7L372.1 393.9z\"]\n};\nvar faDraftingCompass = faCompassDrafting;\nvar faCompress = {\n  prefix: 'fas',\n  iconName: 'compress',\n  icon: [448, 512, [], \"f066\", \"M128 320H32c-17.69 0-32 14.31-32 32s14.31 32 32 32h64v64c0 17.69 14.31 32 32 32s32-14.31 32-32v-96C160 334.3 145.7 320 128 320zM416 320h-96c-17.69 0-32 14.31-32 32v96c0 17.69 14.31 32 32 32s32-14.31 32-32v-64h64c17.69 0 32-14.31 32-32S433.7 320 416 320zM320 192h96c17.69 0 32-14.31 32-32s-14.31-32-32-32h-64V64c0-17.69-14.31-32-32-32s-32 14.31-32 32v96C288 177.7 302.3 192 320 192zM128 32C110.3 32 96 46.31 96 64v64H32C14.31 128 0 142.3 0 160s14.31 32 32 32h96c17.69 0 32-14.31 32-32V64C160 46.31 145.7 32 128 32z\"]\n};\nvar faComputer = {\n  prefix: 'fas',\n  iconName: 'computer',\n  icon: [640, 512, [], \"e4e5\", \"M400 32C426.5 32 448 53.49 448 80V336C448 362.5 426.5 384 400 384H266.7L277.3 416H352C369.7 416 384 430.3 384 448C384 465.7 369.7 480 352 480H96C78.33 480 64 465.7 64 448C64 430.3 78.33 416 96 416H170.7L181.3 384H48C21.49 384 0 362.5 0 336V80C0 53.49 21.49 32 48 32H400zM64 96V320H384V96H64zM592 32C618.5 32 640 53.49 640 80V432C640 458.5 618.5 480 592 480H528C501.5 480 480 458.5 480 432V80C480 53.49 501.5 32 528 32H592zM544 96C535.2 96 528 103.2 528 112C528 120.8 535.2 128 544 128H576C584.8 128 592 120.8 592 112C592 103.2 584.8 96 576 96H544zM544 192H576C584.8 192 592 184.8 592 176C592 167.2 584.8 160 576 160H544C535.2 160 528 167.2 528 176C528 184.8 535.2 192 544 192zM560 400C577.7 400 592 385.7 592 368C592 350.3 577.7 336 560 336C542.3 336 528 350.3 528 368C528 385.7 542.3 400 560 400z\"]\n};\nvar faComputerMouse = {\n  prefix: 'fas',\n  iconName: 'computer-mouse',\n  icon: [384, 512, [128433, \"mouse\"], \"f8cc\", \"M0 352c0 88.38 71.63 160 160 160h64c88.38 0 160-71.63 160-160V224H0V352zM176 0H160C71.63 0 0 71.62 0 160v32h176V0zM224 0h-16v192H384V160C384 71.62 312.4 0 224 0z\"]\n};\nvar faMouse = faComputerMouse;\nvar faCookie = {\n  prefix: 'fas',\n  iconName: 'cookie',\n  icon: [512, 512, [127850], \"f563\", \"M494.5 254.8l-11.37-71.48c-4.102-25.9-16.29-49.8-34.8-68.32l-51.33-51.33c-18.52-18.52-42.3-30.7-68.2-34.8L256.9 17.53C231.2 13.42 204.7 17.64 181.5 29.48L116.7 62.53C93.23 74.36 74.36 93.35 62.41 116.7L29.51 181.2c-11.84 23.44-16.08 50.04-11.98 75.94l11.37 71.48c4.101 25.9 16.29 49.77 34.8 68.41l51.33 51.33c18.52 18.4 42.3 30.61 68.2 34.72l71.84 11.37c25.78 4.102 52.27-.1173 75.47-11.95l64.8-33.05c23.32-11.84 42.3-30.82 54.26-54.14l32.81-64.57C494.4 307.3 498.6 280.8 494.5 254.8zM176 367.1c-17.62 0-31.1-14.37-31.1-31.1c0-17.62 14.37-31.1 31.1-31.1s31.1 14.37 31.1 31.1C208 353.6 193.6 367.1 176 367.1zM208 208c-17.62 0-31.1-14.37-31.1-31.1s14.38-31.1 31.1-31.1c17.62 0 31.1 14.37 31.1 31.1S225.6 208 208 208zM368 335.1c-17.62 0-31.1-14.37-31.1-31.1c0-17.62 14.37-31.1 31.1-31.1s31.1 14.37 31.1 31.1C400 321.6 385.6 335.1 368 335.1z\"]\n};\nvar faCookieBite = {\n  prefix: 'fas',\n  iconName: 'cookie-bite',\n  icon: [512, 512, [], \"f564\", \"M494.6 255.9c-65.63-.8203-118.6-54.14-118.6-119.9c-65.74 0-119.1-52.97-119.8-118.6c-25.66-3.867-51.8 .2346-74.77 12.07L116.7 62.41C93.35 74.36 74.36 93.35 62.41 116.7L29.6 181.2c-11.95 23.44-16.17 49.92-12.07 75.94l11.37 71.48c4.102 25.9 16.29 49.8 34.81 68.32l51.36 51.39C133.6 466.9 157.3 479 183.2 483.1l71.84 11.37c25.9 4.101 52.27-.1172 75.59-11.95l64.81-33.05c23.32-11.84 42.31-30.82 54.14-54.14l32.93-64.57C494.3 307.7 498.5 281.4 494.6 255.9zM176 367.1c-17.62 0-32-14.37-32-31.1s14.38-31.1 32-31.1s32 14.37 32 31.1S193.6 367.1 176 367.1zM208 208c-17.62 0-32-14.37-32-31.1s14.38-31.1 32-31.1s32 14.37 32 31.1S225.6 208 208 208zM368 335.1c-17.62 0-32-14.37-32-31.1s14.38-31.1 32-31.1s32 14.37 32 31.1S385.6 335.1 368 335.1z\"]\n};\nvar faCopy = {\n  prefix: 'fas',\n  iconName: 'copy',\n  icon: [512, 512, [], \"f0c5\", \"M384 96L384 0h-112c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48H464c26.51 0 48-21.49 48-48V128h-95.1C398.4 128 384 113.6 384 96zM416 0v96h96L416 0zM192 352V128h-144c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h192c26.51 0 48-21.49 48-48L288 416h-32C220.7 416 192 387.3 192 352z\"]\n};\nvar faCopyright = {\n  prefix: 'fas',\n  iconName: 'copyright',\n  icon: [512, 512, [169], \"f1f9\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM199.2 312.6c14.94 15.06 34.8 23.38 55.89 23.38c.0313 0 0 0 0 0c21.06 0 40.92-8.312 55.83-23.38c9.375-9.375 24.53-9.469 33.97-.1562c9.406 9.344 9.469 24.53 .1562 33.97c-24 24.22-55.95 37.56-89.95 37.56c0 0 .0313 0 0 0c-33.97 0-65.95-13.34-89.95-37.56c-49.44-49.88-49.44-131 0-180.9c24-24.22 55.98-37.56 89.95-37.56c.0313 0 0 0 0 0c34 0 65.95 13.34 89.95 37.56c9.312 9.438 9.25 24.62-.1562 33.97c-9.438 9.344-24.59 9.188-33.97-.1562c-14.91-15.06-34.77-23.38-55.83-23.38c0 0 .0313 0 0 0c-21.09 0-40.95 8.312-55.89 23.38C168.3 230.6 168.3 281.4 199.2 312.6z\"]\n};\nvar faCouch = {\n  prefix: 'fas',\n  iconName: 'couch',\n  icon: [640, 512, [], \"f4b8\", \"M592 224C565.5 224 544 245.5 544 272V352H96V272C96 245.5 74.51 224 48 224S0 245.5 0 272v192C0 472.8 7.164 480 16 480h64c8.836 0 15.1-7.164 15.1-16L96 448h448v16c0 8.836 7.164 16 16 16h64c8.836 0 16-7.164 16-16v-192C640 245.5 618.5 224 592 224zM128 272V320h384V272c0-38.63 27.53-70.95 64-78.38V160c0-70.69-57.31-128-128-128H191.1c-70.69 0-128 57.31-128 128L64 193.6C100.5 201.1 128 233.4 128 272z\"]\n};\nvar faCow = {\n  prefix: 'fas',\n  iconName: 'cow',\n  icon: [640, 512, [128004], \"f6c8\", \"M634 276.8l-9.999-13.88L624 185.7c0-11.88-12.5-19.49-23.12-14.11c-10.88 5.375-19.5 13.5-26.38 23l-65.75-90.92C490.6 78.71 461.8 64 431 64H112C63.37 64 24 103.4 24 152v86.38C9.5 250.1 0 267.9 0 288v32h8c35.38 0 64-28.62 64-64L72 152c0-16.88 10.5-31.12 25.38-37C96.5 119.1 96 123.5 96 128l.0002 304c0 8.875 7.126 16 16 16h63.1c8.875 0 16-7.125 16-16l.0006-112c9.375 9.375 20.25 16.5 32 21.88V368c0 8.875 7.252 16 16 16c8.875 0 15.1-7.125 15.1-16v-17.25c9.125 1 12.88 2.25 32-.125V368c0 8.875 7.25 16 16 16c8.875 0 16-7.125 16-16v-26.12C331.8 336.5 342.6 329.2 352 320l-.0012 112c0 8.875 7.125 16 15.1 16h64c8.75 0 16-7.125 16-16V256l31.1 32l.0006 41.55c0 12.62 3.752 24.95 10.75 35.45l41.25 62C540.8 440.1 555.5 448 571.4 448c22.5 0 41.88-15.88 46.25-38l21.75-108.6C641.1 292.8 639.1 283.9 634 276.8zM377.3 167.4l-22.88 22.75C332.5 211.8 302.9 224 272.1 224S211.5 211.8 189.6 190.1L166.8 167.4C151 151.8 164.4 128 188.9 128h166.2C379.6 128 393 151.8 377.3 167.4zM576 352c-8.875 0-16-7.125-16-16s7.125-16 16-16s16 7.125 16 16S584.9 352 576 352z\"]\n};\nvar faCreditCard = {\n  prefix: 'fas',\n  iconName: 'credit-card',\n  icon: [576, 512, [62083, 128179, \"credit-card-alt\"], \"f09d\", \"M512 32C547.3 32 576 60.65 576 96V128H0V96C0 60.65 28.65 32 64 32H512zM576 416C576 451.3 547.3 480 512 480H64C28.65 480 0 451.3 0 416V224H576V416zM112 352C103.2 352 96 359.2 96 368C96 376.8 103.2 384 112 384H176C184.8 384 192 376.8 192 368C192 359.2 184.8 352 176 352H112zM240 384H368C376.8 384 384 376.8 384 368C384 359.2 376.8 352 368 352H240C231.2 352 224 359.2 224 368C224 376.8 231.2 384 240 384z\"]\n};\nvar faCreditCardAlt = faCreditCard;\nvar faCrop = {\n  prefix: 'fas',\n  iconName: 'crop',\n  icon: [512, 512, [], \"f125\", \"M448 384H480C497.7 384 512 398.3 512 416C512 433.7 497.7 448 480 448H448V480C448 497.7 433.7 512 416 512C398.3 512 384 497.7 384 480V173.3L173.3 384H352V448H128C92.65 448 64 419.3 64 384V128H32C14.33 128 0 113.7 0 96C0 78.33 14.33 64 32 64H64V32C64 14.33 78.33 0 96 0C113.7 0 128 14.33 128 32V338.7L338.7 128H160V64H402.7L457.4 9.372C469.9-3.124 490.1-3.124 502.6 9.372C515.1 21.87 515.1 42.13 502.6 54.63L448 109.3V384z\"]\n};\nvar faCropSimple = {\n  prefix: 'fas',\n  iconName: 'crop-simple',\n  icon: [512, 512, [\"crop-alt\"], \"f565\", \"M128 384H352V448H128C92.65 448 64 419.3 64 384V128H32C14.33 128 0 113.7 0 96C0 78.33 14.33 64 32 64H64V32C64 14.33 78.33 0 96 0C113.7 0 128 14.33 128 32V384zM384 128H160V64H384C419.3 64 448 92.65 448 128V384H480C497.7 384 512 398.3 512 416C512 433.7 497.7 448 480 448H448V480C448 497.7 433.7 512 416 512C398.3 512 384 497.7 384 480V128z\"]\n};\nvar faCropAlt = faCropSimple;\nvar faCross = {\n  prefix: 'fas',\n  iconName: 'cross',\n  icon: [384, 512, [128327, 10013], \"f654\", \"M383.1 160v64c0 17.62-14.37 32-31.1 32h-96v224c0 17.62-14.38 32-31.1 32H160c-17.62 0-32-14.38-32-32V256h-96C14.37 256-.0008 241.6-.0008 224V160c0-17.62 14.38-32 32-32h96V32c0-17.62 14.38-32 32-32h64c17.62 0 31.1 14.38 31.1 32v96h96C369.6 128 383.1 142.4 383.1 160z\"]\n};\nvar faCrosshairs = {\n  prefix: 'fas',\n  iconName: 'crosshairs',\n  icon: [512, 512, [], \"f05b\", \"M224 256C224 238.3 238.3 224 256 224C273.7 224 288 238.3 288 256C288 273.7 273.7 288 256 288C238.3 288 224 273.7 224 256zM256 0C273.7 0 288 14.33 288 32V42.35C381.7 56.27 455.7 130.3 469.6 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H469.6C455.7 381.7 381.7 455.7 288 469.6V480C288 497.7 273.7 512 256 512C238.3 512 224 497.7 224 480V469.6C130.3 455.7 56.27 381.7 42.35 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H42.35C56.27 130.3 130.3 56.27 224 42.35V32C224 14.33 238.3 0 256 0V0zM224 404.6V384C224 366.3 238.3 352 256 352C273.7 352 288 366.3 288 384V404.6C346.3 392.1 392.1 346.3 404.6 288H384C366.3 288 352 273.7 352 256C352 238.3 366.3 224 384 224H404.6C392.1 165.7 346.3 119.9 288 107.4V128C288 145.7 273.7 160 256 160C238.3 160 224 145.7 224 128V107.4C165.7 119.9 119.9 165.7 107.4 224H128C145.7 224 160 238.3 160 256C160 273.7 145.7 288 128 288H107.4C119.9 346.3 165.7 392.1 224 404.6z\"]\n};\nvar faCrow = {\n  prefix: 'fas',\n  iconName: 'crow',\n  icon: [640, 512, [], \"f520\", \"M523.9 31.1H574C603.4 31.1 628.1 51.99 636.1 80.48L640 95.1L544 119.1V191.1C544 279.1 484.9 354.1 404.2 376.8L446.2 478.9C451.2 491.1 445.4 505.1 433.1 510.2C420.9 515.2 406.9 509.4 401.8 497.1L355.2 383.1C354.1 383.1 353.1 384 352 384H311.1L350.2 478.9C355.2 491.1 349.4 505.1 337.1 510.2C324.9 515.2 310.9 509.4 305.8 497.1L259.2 384H126.1L51.51 441.4C37.5 452.1 17.41 449.5 6.638 435.5C-4.138 421.5-1.517 401.4 12.49 390.6L368 117.2V88C368 39.4 407.4 0 456 0C483.3 0 507.7 12.46 523.9 32V31.1zM456 111.1C469.3 111.1 480 101.3 480 87.1C480 74.74 469.3 63.1 456 63.1C442.7 63.1 432 74.74 432 87.1C432 101.3 442.7 111.1 456 111.1z\"]\n};\nvar faCrown = {\n  prefix: 'fas',\n  iconName: 'crown',\n  icon: [576, 512, [128081], \"f521\", \"M576 136c0 22.09-17.91 40-40 40c-.248 0-.4551-.1266-.7031-.1305l-50.52 277.9C482 468.9 468.8 480 453.3 480H122.7c-15.46 0-28.72-11.06-31.48-26.27L40.71 175.9C40.46 175.9 40.25 176 39.1 176c-22.09 0-40-17.91-40-40S17.91 96 39.1 96s40 17.91 40 40c0 8.998-3.521 16.89-8.537 23.57l89.63 71.7c15.91 12.73 39.5 7.544 48.61-10.68l57.6-115.2C255.1 98.34 247.1 86.34 247.1 72C247.1 49.91 265.9 32 288 32s39.1 17.91 39.1 40c0 14.34-7.963 26.34-19.3 33.4l57.6 115.2c9.111 18.22 32.71 23.4 48.61 10.68l89.63-71.7C499.5 152.9 496 144.1 496 136C496 113.9 513.9 96 536 96S576 113.9 576 136z\"]\n};\nvar faCrutch = {\n  prefix: 'fas',\n  iconName: 'crutch',\n  icon: [512, 512, [], \"f7f7\", \"M502.6 168.1l-159.6-159.5c-12.54-12.54-32.85-12.6-45.46-.1256c-12.68 12.54-12.73 33.1-.1256 45.71l159.6 159.5c12.6 12.59 33.03 12.57 45.59-.0628C515.1 201.9 515.1 181.5 502.6 168.1zM334.4 245.4l-67.88-67.87l55.13-55.12l-45.25-45.25L166.7 186.8C154.1 199.6 145.2 215.6 141.1 233.2L113.3 353.4l-108.6 108.6c-6.25 6.25-6.25 16.37 0 22.62l22.63 22.62c6.25 6.25 16.38 6.25 22.63 0l108.6-108.6l120.3-27.75c17.5-4.125 33.63-13 46.38-25.62l109.6-109.7l-45.25-45.25L334.4 245.4zM279.9 300.1C275.7 304.2 270.3 307.2 264.4 308.6l-79.25 18.25l18.25-79.25c1.375-5.875 4.375-11.25 8.5-15.5l9.375-9.25l67.88 67.87L279.9 300.1z\"]\n};\nvar faCruzeiroSign = {\n  prefix: 'fas',\n  iconName: 'cruzeiro-sign',\n  icon: [384, 512, [], \"e152\", \"M159.1 402.7V256C159.1 238.3 174.3 224 191.1 224C199.7 224 206.8 226.7 212.3 231.3C223 226.6 234.8 224 247.3 224C264.5 224 281.3 229.1 295.7 238.7L305.8 245.4C320.5 255.2 324.4 275 314.6 289.8C304.8 304.5 284.1 308.4 270.2 298.6L260.2 291.9C256.3 289.4 251.9 288 247.3 288C234.4 288 224 298.4 224 311.3V416C264.1 416 302.3 400.6 330.7 375.3C343.8 363.5 364.1 364.6 375.8 377.8C387.6 390.9 386.5 411.2 373.3 422.1C333.7 458.4 281.4 480 224 480C100.3 480 0 379.7 0 256C0 132.3 100.3 32 224 32C281.4 32 333.7 53.59 373.3 89.04C386.5 100.8 387.6 121.1 375.8 134.2C364.1 147.4 343.8 148.5 330.7 136.7C302.3 111.4 264.1 96 224 96C135.6 96 63.1 167.6 63.1 256C63.1 321.6 103.5 377.1 159.1 402.7V402.7z\"]\n};\nvar faCube = {\n  prefix: 'fas',\n  iconName: 'cube',\n  icon: [512, 512, [], \"f1b2\", \"M234.5 5.709C248.4 .7377 263.6 .7377 277.5 5.709L469.5 74.28C494.1 83.38 512 107.5 512 134.6V377.4C512 404.5 494.1 428.6 469.5 437.7L277.5 506.3C263.6 511.3 248.4 511.3 234.5 506.3L42.47 437.7C17 428.6 0 404.5 0 377.4V134.6C0 107.5 17 83.38 42.47 74.28L234.5 5.709zM256 65.98L82.34 128L256 190L429.7 128L256 65.98zM288 434.6L448 377.4V189.4L288 246.6V434.6z\"]\n};\nvar faCubes = {\n  prefix: 'fas',\n  iconName: 'cubes',\n  icon: [576, 512, [], \"f1b3\", \"M172.1 40.16L268.1 3.76C280.9-1.089 295.1-1.089 307.9 3.76L403.9 40.16C425.6 48.41 440 69.25 440 92.52V204.7C441.3 205.1 442.6 205.5 443.9 205.1L539.9 242.4C561.6 250.6 576 271.5 576 294.7V413.9C576 436.1 562.9 456.2 542.5 465.1L446.5 507.3C432.2 513.7 415.8 513.7 401.5 507.3L288 457.5L174.5 507.3C160.2 513.7 143.8 513.7 129.5 507.3L33.46 465.1C13.13 456.2 0 436.1 0 413.9V294.7C0 271.5 14.39 250.6 36.15 242.4L132.1 205.1C133.4 205.5 134.7 205.1 136 204.7V92.52C136 69.25 150.4 48.41 172.1 40.16V40.16zM290.8 48.64C289 47.95 286.1 47.95 285.2 48.64L206.8 78.35L287.1 109.5L369.2 78.35L290.8 48.64zM392 210.6V121L309.6 152.6V241.8L392 210.6zM154.8 250.9C153 250.2 150.1 250.2 149.2 250.9L70.81 280.6L152 311.7L233.2 280.6L154.8 250.9zM173.6 455.3L256 419.1V323.2L173.6 354.8V455.3zM342.8 280.6L424 311.7L505.2 280.6L426.8 250.9C425 250.2 422.1 250.2 421.2 250.9L342.8 280.6zM528 413.9V323.2L445.6 354.8V455.3L523.2 421.2C526.1 419.9 528 417.1 528 413.9V413.9z\"]\n};\nvar faCubesStacked = {\n  prefix: 'fas',\n  iconName: 'cubes-stacked',\n  icon: [448, 512, [], \"e4e6\", \"M192 64C192 46.33 206.3 32 224 32H288C305.7 32 320 46.33 320 64V128C320 145.7 305.7 160 288 160H224C206.3 160 192 145.7 192 128V64zM138.1 174.1C153.4 166.1 172.1 171.4 181.8 186.7L213.8 242.1C222.6 257.4 217.4 276.1 202.1 285.8L146.7 317.8C131.4 326.6 111.8 321.4 102.1 306.1L70.96 250.7C62.12 235.4 67.37 215.8 82.67 206.1L138.1 174.1zM352 192C369.7 192 384 206.3 384 224V288C384 305.7 369.7 320 352 320H288C270.3 320 256 305.7 256 288V224C256 206.3 270.3 192 288 192H352zM416 352C433.7 352 448 366.3 448 384V448C448 465.7 433.7 480 416 480H352C334.3 480 320 465.7 320 448V384C320 366.3 334.3 352 352 352H416zM160 384C160 366.3 174.3 352 192 352H256C273.7 352 288 366.3 288 384V448C288 465.7 273.7 480 256 480H192C174.3 480 160 465.7 160 448V384zM96 352C113.7 352 128 366.3 128 384V448C128 465.7 113.7 480 96 480H32C14.33 480 0 465.7 0 448V384C0 366.3 14.33 352 32 352H96z\"]\n};\nvar faD = {\n  prefix: 'fas',\n  iconName: 'd',\n  icon: [384, 512, [100], \"44\", \"M160 32.01L32 32.01c-17.67 0-32 14.33-32 32v384c0 17.67 14.33 32 32 32l128-.0073c123.5 0 224-100.5 224-224S283.5 32.01 160 32.01zM160 416H64v-320h96c88.22 0 160 71.78 160 159.1S248.2 416 160 416z\"]\n};\nvar faDatabase = {\n  prefix: 'fas',\n  iconName: 'database',\n  icon: [448, 512, [], \"f1c0\", \"M448 80V128C448 172.2 347.7 208 224 208C100.3 208 0 172.2 0 128V80C0 35.82 100.3 0 224 0C347.7 0 448 35.82 448 80zM393.2 214.7C413.1 207.3 433.1 197.8 448 186.1V288C448 332.2 347.7 368 224 368C100.3 368 0 332.2 0 288V186.1C14.93 197.8 34.02 207.3 54.85 214.7C99.66 230.7 159.5 240 224 240C288.5 240 348.3 230.7 393.2 214.7V214.7zM54.85 374.7C99.66 390.7 159.5 400 224 400C288.5 400 348.3 390.7 393.2 374.7C413.1 367.3 433.1 357.8 448 346.1V432C448 476.2 347.7 512 224 512C100.3 512 0 476.2 0 432V346.1C14.93 357.8 34.02 367.3 54.85 374.7z\"]\n};\nvar faDeleteLeft = {\n  prefix: 'fas',\n  iconName: 'delete-left',\n  icon: [576, 512, [9003, \"backspace\"], \"f55a\", \"M576 384C576 419.3 547.3 448 512 448H205.3C188.3 448 172 441.3 160 429.3L9.372 278.6C3.371 272.6 0 264.5 0 256C0 247.5 3.372 239.4 9.372 233.4L160 82.75C172 70.74 188.3 64 205.3 64H512C547.3 64 576 92.65 576 128V384zM271 208.1L318.1 256L271 303C261.7 312.4 261.7 327.6 271 336.1C280.4 346.3 295.6 346.3 304.1 336.1L352 289.9L399 336.1C408.4 346.3 423.6 346.3 432.1 336.1C442.3 327.6 442.3 312.4 432.1 303L385.9 256L432.1 208.1C442.3 199.6 442.3 184.4 432.1 175C423.6 165.7 408.4 165.7 399 175L352 222.1L304.1 175C295.6 165.7 280.4 165.7 271 175C261.7 184.4 261.7 199.6 271 208.1V208.1z\"]\n};\nvar faBackspace = faDeleteLeft;\nvar faDemocrat = {\n  prefix: 'fas',\n  iconName: 'democrat',\n  icon: [640, 512, [], \"f747\", \"M191.1 479.1C191.1 497.6 206.4 512 223.1 512h32c17.6 0 32-14.4 32-32v-64h160v64c0 17.6 14.41 32 32.01 32L511.1 512c17.6 0 32-14.4 32-32l.0102-128H192L191.1 479.1zM637.2 256.9l-19.5-29.38c-28.25-42.25-75.38-67.5-126.1-67.5H255.1L174.7 78.75c20.13-20 22.63-51 7.5-73.88C178.9-.2552 171.5-1.005 167.1 3.37L125.2 45.25L82.36 2.37C78.74-1.255 72.74-.6302 69.99 3.62c-12.25 18.63-10.25 44 6.125 60.38c3.25 3.25 7.25 5.25 11.25 7.5c-2.125 1.75-4.625 3.125-6.375 5.375l-74.63 99.38C-.8895 185.9-2.014 198.9 3.361 209.7l14.38 28.5c5.375 10.88 16.5 17.75 28.5 17.75H77.24c8.5 0 16.63-3.375 22.63-9.375l38.13-34.63l54.04 108h351.1l-.0102-77.75c16.25 12.13 18.25 17.5 40.13 50.25c4.875 7.375 14.75 9.25 22.13 4.375l26.63-17.63C640.2 274.2 642.2 264.2 637.2 256.9zM296.2 243.2L279.7 259.4l3.875 22.75c.625 4.125-3.625 7.125-7.25 5.25L255.1 276.7L235.6 287.4C231.1 289.2 227.7 286.2 228.4 282.1l3.875-22.75L215.7 243.2c-3-2.875-1.25-7.875 2.875-8.5l22.75-3.25l10.25-20.75c1.75-3.625 7.125-3.625 9 0l10.13 20.75l22.88 3.25C297.6 235.4 299.2 240.4 296.2 243.2zM408.2 243.2l-16.5 16.13l3.875 22.75c.625 4.125-3.625 7.125-7.25 5.25L367.1 276.7l-20.38 10.63c-3.625 1.875-7.875-1.125-7.25-5.25l3.875-22.75l-16.5-16.13c-3-2.875-1.25-7.875 2.875-8.5l22.75-3.25l10.25-20.75c1.75-3.625 7.125-3.625 9 0l10.13 20.75l22.88 3.25C409.6 235.4 411.2 240.4 408.2 243.2zM520.2 243.2l-16.5 16.13l3.875 22.75c.625 4.125-3.625 7.125-7.25 5.25l-20.38-10.63l-20.38 10.63c-3.625 1.875-7.875-1.125-7.25-5.25l3.875-22.75l-16.5-16.13c-3-2.875-1.25-7.875 2.875-8.5l22.75-3.25l10.25-20.75c1.75-3.625 7.125-3.625 9 0l10.13 20.75l22.88 3.25C521.6 235.4 523.2 240.4 520.2 243.2z\"]\n};\nvar faDesktop = {\n  prefix: 'fas',\n  iconName: 'desktop',\n  icon: [576, 512, [61704, 128421, \"desktop-alt\"], \"f390\", \"M528 0h-480C21.5 0 0 21.5 0 48v320C0 394.5 21.5 416 48 416h192L224 464H152C138.8 464 128 474.8 128 488S138.8 512 152 512h272c13.25 0 24-10.75 24-24s-10.75-24-24-24H352L336 416h192c26.5 0 48-21.5 48-48v-320C576 21.5 554.5 0 528 0zM512 288H64V64h448V288z\"]\n};\nvar faDesktopAlt = faDesktop;\nvar faDharmachakra = {\n  prefix: 'fas',\n  iconName: 'dharmachakra',\n  icon: [512, 512, [9784], \"f655\", \"M495 225l-17.24 1.124c-5.25-39.5-20.76-75.63-43.89-105.9l12.1-11.37c6.875-6.125 7.25-16.75 .75-23.38L426.5 64.38c-6.625-6.5-17.25-6.125-23.38 .75l-11.37 12.1c-30.25-23.12-66.38-38.64-105.9-43.89L287 17C287.5 7.75 280.2 0 271 0h-30c-9.25 0-16.5 7.75-16 17l1.124 17.24c-39.5 5.25-75.63 20.76-105.9 43.89L108.9 65.13C102.8 58.25 92.13 57.88 85.63 64.38L64.38 85.5C57.88 92.12 58.25 102.8 65.13 108.9l12.1 11.37C54.1 150.5 39.49 186.6 34.24 226.1L17 225C7.75 224.5 0 231.8 0 241v30c0 9.25 7.75 16.5 17 16l17.24-1.124c5.25 39.5 20.76 75.63 43.89 105.9l-12.1 11.37c-6.875 6.125-7.25 16.75-.75 23.25l21.25 21.25c6.5 6.5 17.13 6.125 23.25-.75l11.37-12.1c30.25 23.12 66.38 38.64 105.9 43.89L225 495C224.5 504.2 231.8 512 241 512h30c9.25 0 16.5-7.75 16-17l-1.124-17.24c39.5-5.25 75.63-20.76 105.9-43.89l11.37 12.1c6.125 6.875 16.75 7.25 23.38 .75l21.12-21.25c6.5-6.5 6.125-17.13-.75-23.25l-12.1-11.37c23.12-30.25 38.64-66.38 43.89-105.9L495 287C504.3 287.5 512 280.2 512 271v-30C512 231.8 504.3 224.5 495 225zM281.9 98.68c24.75 4 47.61 13.59 67.24 27.71L306.5 174.6c-8.75-5.375-18.38-9.507-28.62-11.88L281.9 98.68zM230.1 98.68l3.996 64.06C223.9 165.1 214.3 169.2 205.5 174.6L162.9 126.4C182.5 112.3 205.4 102.7 230.1 98.68zM126.4 163l48.35 42.48c-5.5 8.75-9.606 18.4-11.98 28.65L98.68 230.1C102.7 205.4 112.2 182.5 126.4 163zM98.68 281.9l64.06-3.996C165.1 288.1 169.3 297.8 174.6 306.5l-48.23 42.61C112.3 329.5 102.7 306.6 98.68 281.9zM230.1 413.3c-24.75-4-47.61-13.59-67.24-27.71l42.58-48.33c8.75 5.5 18.4 9.606 28.65 11.98L230.1 413.3zM256 288C238.4 288 224 273.6 224 256s14.38-32 32-32s32 14.38 32 32S273.6 288 256 288zM281.9 413.3l-3.996-64.06c10.25-2.375 19.9-6.48 28.65-11.98l42.48 48.35C329.5 399.8 306.6 409.3 281.9 413.3zM385.6 349l-48.25-42.5c5.375-8.75 9.507-18.38 11.88-28.62l64.06 3.996C409.3 306.6 399.8 329.5 385.6 349zM349.3 234.1c-2.375-10.25-6.48-19.9-11.98-28.65L385.6 163c14.13 19.5 23.69 42.38 27.69 67.13L349.3 234.1z\"]\n};\nvar faDiagramNext = {\n  prefix: 'fas',\n  iconName: 'diagram-next',\n  icon: [512, 512, [], \"e476\", \"M512 160C512 195.3 483.3 224 448 224H280V288H326.1C347.4 288 358.1 313.9 343 328.1L272.1 399C263.6 408.4 248.4 408.4 239 399L168.1 328.1C153.9 313.9 164.6 288 185.9 288H232V224H64C28.65 224 0 195.3 0 160V96C0 60.65 28.65 32 64 32H448C483.3 32 512 60.65 512 96V160zM312.6 416H448V352H376.6L384.1 343.6C401 327.6 404.6 306.4 399 288H448C483.3 288 512 316.7 512 352V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V352C0 316.7 28.65 288 64 288H112.1C107.4 306.4 110.1 327.6 127 343.6L135.4 352H64V416H199.4L216.4 432.1C238.3 454.8 273.7 454.8 295.6 432.1L312.6 416z\"]\n};\nvar faDiagramPredecessor = {\n  prefix: 'fas',\n  iconName: 'diagram-predecessor',\n  icon: [512, 512, [], \"e477\", \"M64 480C28.65 480 0 451.3 0 416V352C0 316.7 28.65 288 64 288H448C483.3 288 512 316.7 512 352V416C512 451.3 483.3 480 448 480H64zM448 416V352H64V416H448zM288 160C288 195.3 259.3 224 224 224H64C28.65 224 0 195.3 0 160V96C0 60.65 28.65 32 64 32H368C412.2 32 448 67.82 448 112V128H486.1C507.4 128 518.1 153.9 503 168.1L432.1 239C423.6 248.4 408.4 248.4 399 239L328.1 168.1C313.9 153.9 324.6 128 345.9 128H384V112C384 103.2 376.8 96 368 96H288V160z\"]\n};\nvar faDiagramProject = {\n  prefix: 'fas',\n  iconName: 'diagram-project',\n  icon: [576, 512, [\"project-diagram\"], \"f542\", \"M0 80C0 53.49 21.49 32 48 32H144C170.5 32 192 53.49 192 80V96H384V80C384 53.49 405.5 32 432 32H528C554.5 32 576 53.49 576 80V176C576 202.5 554.5 224 528 224H432C405.5 224 384 202.5 384 176V160H192V176C192 177.7 191.9 179.4 191.7 180.1L272 288H368C394.5 288 416 309.5 416 336V432C416 458.5 394.5 480 368 480H272C245.5 480 224 458.5 224 432V336C224 334.3 224.1 332.6 224.3 331L144 224H48C21.49 224 0 202.5 0 176V80z\"]\n};\nvar faProjectDiagram = faDiagramProject;\nvar faDiagramSuccessor = {\n  prefix: 'fas',\n  iconName: 'diagram-successor',\n  icon: [512, 512, [], \"e47a\", \"M512 416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V352C0 316.7 28.65 288 64 288H448C483.3 288 512 316.7 512 352V416zM224 224H64C28.65 224 0 195.3 0 160V96C0 60.65 28.65 32 64 32H368C412.2 32 448 67.82 448 112V128H486.1C507.4 128 518.1 153.9 503 168.1L432.1 239C423.6 248.4 408.4 248.4 399 239L328.1 168.1C313.9 153.9 324.6 128 345.9 128H384V112C384 103.2 376.8 96 368 96H288V160C288 195.3 259.3 224 224 224V224zM64 160H224V96H64V160z\"]\n};\nvar faDiamond = {\n  prefix: 'fas',\n  iconName: 'diamond',\n  icon: [512, 512, [9830], \"f219\", \"M500.3 227.7C515.9 243.3 515.9 268.7 500.3 284.3L284.3 500.3C268.7 515.9 243.3 515.9 227.7 500.3L11.72 284.3C-3.905 268.7-3.905 243.3 11.72 227.7L227.7 11.72C243.3-3.905 268.7-3.905 284.3 11.72L500.3 227.7z\"]\n};\nvar faDiamondTurnRight = {\n  prefix: 'fas',\n  iconName: 'diamond-turn-right',\n  icon: [512, 512, [\"directions\"], \"f5eb\", \"M497.1 222.1l-208.1-208.1c-9.364-9.364-21.62-14.04-33.89-14.03C243.7 .0092 231.5 4.686 222.1 14.03L14.03 222.1C4.676 231.5 .0002 243.7 .0004 255.1c.0002 12.26 4.676 24.52 14.03 33.87l208.1 208.1C231.5 507.3 243.7 511.1 256 511.1c12.26 0 24.52-4.677 33.87-14.03l208.1-208.1c9.352-9.353 14.03-21.61 14.03-33.87C511.1 243.7 507.3 231.5 497.1 222.1zM410.5 252l-96 84c-10.79 9.545-26.53 .9824-26.53-12.03V272H223.1l-.0001 48C223.1 337.6 209.6 352 191.1 352S159.1 337.6 159.1 320V240c0-17.6 14.4-32 32-32h95.1V156c0-13.85 16.39-20.99 26.53-12.03l96 84C414 231 415.1 235.4 415.1 240S414 249 410.5 252z\"]\n};\nvar faDirections = faDiamondTurnRight;\nvar faDice = {\n  prefix: 'fas',\n  iconName: 'dice',\n  icon: [640, 512, [127922], \"f522\", \"M447.1 224c0-12.56-4.781-25.13-14.35-34.76l-174.9-174.9C249.1 4.786 236.5 0 223.1 0C211.4 0 198.9 4.786 189.2 14.35L14.35 189.2C4.783 198.9-.0011 211.4-.0011 223.1c0 12.56 4.785 25.17 14.35 34.8l174.9 174.9c9.625 9.562 22.19 14.35 34.75 14.35s25.13-4.783 34.75-14.35l174.9-174.9C443.2 249.1 447.1 236.6 447.1 224zM96 248c-13.25 0-23.1-10.75-23.1-23.1s10.75-23.1 23.1-23.1S120 210.8 120 224S109.3 248 96 248zM224 376c-13.25 0-23.1-10.75-23.1-23.1s10.75-23.1 23.1-23.1s23.1 10.75 23.1 23.1S237.3 376 224 376zM224 248c-13.25 0-23.1-10.75-23.1-23.1s10.75-23.1 23.1-23.1S248 210.8 248 224S237.3 248 224 248zM224 120c-13.25 0-23.1-10.75-23.1-23.1s10.75-23.1 23.1-23.1s23.1 10.75 23.1 23.1S237.3 120 224 120zM352 248c-13.25 0-23.1-10.75-23.1-23.1s10.75-23.1 23.1-23.1s23.1 10.75 23.1 23.1S365.3 248 352 248zM591.1 192l-118.7 0c4.418 10.27 6.604 21.25 6.604 32.23c0 20.7-7.865 41.38-23.63 57.14l-136.2 136.2v46.37C320 490.5 341.5 512 368 512h223.1c26.5 0 47.1-21.5 47.1-47.1V240C639.1 213.5 618.5 192 591.1 192zM479.1 376c-13.25 0-23.1-10.75-23.1-23.1s10.75-23.1 23.1-23.1s23.1 10.75 23.1 23.1S493.2 376 479.1 376z\"]\n};\nvar faDiceD20 = {\n  prefix: 'fas',\n  iconName: 'dice-d20',\n  icon: [512, 512, [], \"f6cf\", \"M20.04 317.3C18 317.3 16 315.8 16 313.3V150.5c0-2.351 1.91-4.012 4.001-4.012c.6882 0 1.396 .18 2.062 .5748l76.62 45.1l-75.28 122.3C22.59 316.8 21.31 317.3 20.04 317.3zM231.4 405.2l-208.2-22.06c-4.27-.4821-7.123-4.117-7.123-7.995c0-1.401 .3725-2.834 1.185-4.161L122.7 215.1L231.4 405.2zM31.1 420.1c0-2.039 1.508-4.068 3.93-4.068c.1654 0 .3351 .0095 .5089 .0291l203.6 22.31v65.66C239.1 508.6 236.2 512 232 512c-1.113 0-2.255-.2387-3.363-.7565L34.25 423.6C32.69 422.8 31.1 421.4 31.1 420.1zM33.94 117.1c-1.289-.7641-1.938-2.088-1.938-3.417c0-1.281 .6019-2.567 1.813-3.364l150.8-98.59C185.1 10.98 187.3 10.64 188.6 10.64c4.32 0 8.003 3.721 8.003 8.022c0 1.379-.3788 2.818-1.237 4.214L115.5 165.8L33.94 117.1zM146.8 175.1l95.59-168.4C245.5 2.53 250.7 0 255.1 0s10.5 2.53 13.62 7.624l95.59 168.4H146.8zM356.4 207.1l-100.4 175.7L155.6 207.1H356.4zM476.1 415.1c2.422 0 3.93 2.029 3.93 4.068c0 1.378-.6893 2.761-2.252 3.524l-194.4 87.66c-1.103 .5092-2.241 .7443-3.35 .7443c-4.2 0-7.994-3.371-7.994-7.994v-65.69l203.6-22.28C475.7 416 475.9 415.1 476.1 415.1zM494.8 370.9C495.6 372.3 496 373.7 496 375.1c0 3.872-2.841 7.499-7.128 7.98l-208.2 22.06l108.6-190.1L494.8 370.9zM316.6 22.87c-.8581-1.395-1.237-2.834-1.237-4.214c0-4.301 3.683-8.022 8.003-8.022c1.308 0 2.675 .3411 4.015 1.11l150.8 98.59c1.211 .7973 1.813 2.076 1.813 3.353c0 1.325-.6488 2.649-1.938 3.429L396.5 165.8L316.6 22.87zM491.1 146.5c2.091 0 4.001 1.661 4.001 4.012v162.8c0 2.483-2.016 4.006-4.053 4.006c-1.27 0-2.549-.5919-3.353-1.912l-75.28-122.3l76.62-45.1C490.6 146.7 491.3 146.5 491.1 146.5z\"]\n};\nvar faDiceD6 = {\n  prefix: 'fas',\n  iconName: 'dice-d6',\n  icon: [448, 512, [], \"f6d1\", \"M7.994 153.5c1.326 0 2.687 .3508 3.975 1.119L208 271.5v223.8c0 9.741-7.656 16.71-16.01 16.71c-2.688 0-5.449-.7212-8.05-2.303l-152.2-92.47C12.13 405.3 0 383.3 0 359.5v-197.7C0 156.1 3.817 153.5 7.994 153.5zM426.2 117.2c0 2.825-1.352 5.647-4.051 7.248L224 242.6L25.88 124.4C23.19 122.8 21.85 119.1 21.85 117.2c0-2.8 1.32-5.603 3.965-7.221l165.1-100.9C201.7 3.023 212.9 0 224 0s22.27 3.023 32.22 9.07l165.1 100.9C424.8 111.6 426.2 114.4 426.2 117.2zM440 153.5C444.2 153.5 448 156.1 448 161.8v197.7c0 23.75-12.12 45.75-31.78 57.69l-152.2 92.5C261.5 511.3 258.7 512 256 512C247.7 512 240 505 240 495.3V271.5l196-116.9C437.3 153.8 438.7 153.5 440 153.5z\"]\n};\nvar faDiceFive = {\n  prefix: 'fas',\n  iconName: 'dice-five',\n  icon: [448, 512, [9860], \"f523\", \"M384 32H64C28.62 32 0 60.62 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.62 419.4 32 384 32zM128 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S145.6 384 128 384zM128 192C110.4 192 96 177.6 96 160s14.38-32 32-32s32 14.38 32 32S145.6 192 128 192zM224 288C206.4 288 192 273.6 192 256s14.38-32 32-32s32 14.38 32 32S241.6 288 224 288zM320 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 384 320 384zM320 192c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 192 320 192z\"]\n};\nvar faDiceFour = {\n  prefix: 'fas',\n  iconName: 'dice-four',\n  icon: [448, 512, [9859], \"f524\", \"M384 32H64C28.62 32 0 60.62 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.62 419.4 32 384 32zM128 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S145.6 384 128 384zM128 192C110.4 192 96 177.6 96 160s14.38-32 32-32s32 14.38 32 32S145.6 192 128 192zM320 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 384 320 384zM320 192c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 192 320 192z\"]\n};\nvar faDiceOne = {\n  prefix: 'fas',\n  iconName: 'dice-one',\n  icon: [448, 512, [9856], \"f525\", \"M384 32H64C28.62 32 0 60.62 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.62 419.4 32 384 32zM224 288C206.4 288 192 273.6 192 256s14.38-32 32-32s32 14.38 32 32S241.6 288 224 288z\"]\n};\nvar faDiceSix = {\n  prefix: 'fas',\n  iconName: 'dice-six',\n  icon: [448, 512, [9861], \"f526\", \"M384 32H64C28.62 32 0 60.62 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.62 419.4 32 384 32zM128 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S145.6 384 128 384zM128 288C110.4 288 96 273.6 96 256s14.38-32 32-32s32 14.38 32 32S145.6 288 128 288zM128 192C110.4 192 96 177.6 96 160s14.38-32 32-32s32 14.38 32 32S145.6 192 128 192zM320 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 384 320 384zM320 288c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 288 320 288zM320 192c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 192 320 192z\"]\n};\nvar faDiceThree = {\n  prefix: 'fas',\n  iconName: 'dice-three',\n  icon: [448, 512, [9858], \"f527\", \"M384 32H64C28.62 32 0 60.62 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.62 419.4 32 384 32zM128 192C110.4 192 96 177.6 96 160s14.38-32 32-32s32 14.38 32 32S145.6 192 128 192zM224 288C206.4 288 192 273.6 192 256s14.38-32 32-32s32 14.38 32 32S241.6 288 224 288zM320 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 384 320 384z\"]\n};\nvar faDiceTwo = {\n  prefix: 'fas',\n  iconName: 'dice-two',\n  icon: [448, 512, [9857], \"f528\", \"M384 32H64C28.62 32 0 60.62 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.62 419.4 32 384 32zM128 192C110.4 192 96 177.6 96 160s14.38-32 32-32s32 14.38 32 32S145.6 192 128 192zM320 384c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 384 320 384z\"]\n};\nvar faDisease = {\n  prefix: 'fas',\n  iconName: 'disease',\n  icon: [512, 512, [], \"f7fa\", \"M472.2 195.9l-66.1-22.1c-19.25-6.624-33.5-20.87-38.13-38.24l-16-60.49c-11.62-43.74-76.63-57.11-110-22.62L194.1 99.3c-13.25 13.75-33.5 20.87-54.25 19.25L68.86 112.9c-52-3.999-86.88 44.99-59 82.86l38.63 52.49c11 14.1 12.75 33.74 4.625 50.12l-28.5 56.99c-20.62 41.24 22.88 84.86 73.5 73.86l69.1-15.25c20.12-4.499 41.38 .0001 57 11.62l54.38 40.87c39.38 29.62 101 7.623 104.5-37.24l4.625-61.86c1.375-17.75 12.88-33.87 30.62-42.99l61.1-31.62C526.1 269.8 520.9 212.5 472.2 195.9zM159.1 256c-17.62 0-31.1-14.37-31.1-31.1s14.37-31.1 31.1-31.1s31.1 14.37 31.1 31.1S177.6 256 159.1 256zM287.1 351.1c-17.62 0-31.1-14.37-31.1-31.1c0-17.62 14.37-31.1 31.1-31.1s31.1 14.37 31.1 31.1C319.1 337.6 305.6 351.1 287.1 351.1zM303.1 224c-8.875 0-15.1-7.125-15.1-15.1c0-8.873 7.125-15.1 15.1-15.1s15.1 7.125 15.1 15.1C319.1 216.9 312.9 224 303.1 224z\"]\n};\nvar faDisplay = {\n  prefix: 'fas',\n  iconName: 'display',\n  icon: [576, 512, [], \"e163\", \"M528 0h-480C21.5 0 0 21.5 0 48v320C0 394.5 21.5 416 48 416h192L224 464H152C138.8 464 128 474.8 128 488S138.8 512 152 512h272c13.25 0 24-10.75 24-24s-10.75-24-24-24H352L336 416h192c26.5 0 48-21.5 48-48v-320C576 21.5 554.5 0 528 0zM512 352H64V64h448V352z\"]\n};\nvar faDivide = {\n  prefix: 'fas',\n  iconName: 'divide',\n  icon: [448, 512, [10135, 247], \"f529\", \"M400 224h-352c-17.69 0-32 14.31-32 31.1s14.31 32 32 32h352c17.69 0 32-14.31 32-32S417.7 224 400 224zM224 144c26.47 0 48-21.53 48-48s-21.53-48-48-48s-48 21.53-48 48S197.5 144 224 144zM224 368c-26.47 0-48 21.53-48 48s21.53 48 48 48s48-21.53 48-48S250.5 368 224 368z\"]\n};\nvar faDna = {\n  prefix: 'fas',\n  iconName: 'dna',\n  icon: [448, 512, [129516], \"f471\", \"M.1193 494.1c-1.125 9.5 6.312 17.87 15.94 17.87l32.06 .0635c8.125 0 15.21-5.833 16.21-13.83c.7501-4.875 1.869-11.17 3.494-18.17h312c1.625 6.875 2.904 13.31 3.529 18.18c1.125 7.1 7.84 13.94 15.97 13.82l32.46-.0625c9.625 0 17.12-8.374 15.99-17.87c-4.625-37.87-25.75-128.1-119.1-207.7c-17.5 12.37-36.98 24.37-58.48 35.49c6.25 4.625 11.56 9.405 17.06 14.15H159.7c21.25-18.12 47.03-35.63 78.65-51.38c172.1-85.5 203.7-218.8 209.5-266.7c1.125-9.5-6.297-17.88-15.92-17.88L399.6 .001c-8.125 0-14.84 5.832-15.96 13.83c-.7501 4.875-1.869 11.17-3.369 18.17H67.74C66.24 25 65.08 18.81 64.33 13.81C63.21 5.813 56.48-.124 48.36 .001L16.1 .1338c-9.625 0-17.09 8.354-15.96 17.85c5.125 42.87 31.29 153.8 159.9 238.1C31.55 340.3 5.245 451.2 .1193 494.1zM223.9 219.7C198.8 205.9 177.6 191.3 159.7 176h128.5C270.4 191.3 249 206.1 223.9 219.7zM355.1 96c-5.875 10.37-12.88 21.12-21 31.1H113.1c-8.25-10.87-15.3-21.63-21.05-32L355.1 96zM93 415.1c5.875-10.37 12.74-21.13 20.87-32h219.4c8.375 10.87 15.48 21.63 21.23 32H93z\"]\n};\nvar faDog = {\n  prefix: 'fas',\n  iconName: 'dog',\n  icon: [576, 512, [128021], \"f6d3\", \"M332.7 19.85C334.6 8.395 344.5 0 356.1 0C363.6 0 370.6 3.52 375.1 9.502L392 32H444.1C456.8 32 469.1 37.06 478.1 46.06L496 64H552C565.3 64 576 74.75 576 88V112C576 156.2 540.2 192 496 192H426.7L421.6 222.5L309.6 158.5L332.7 19.85zM448 64C439.2 64 432 71.16 432 80C432 88.84 439.2 96 448 96C456.8 96 464 88.84 464 80C464 71.16 456.8 64 448 64zM416 256.1V480C416 497.7 401.7 512 384 512H352C334.3 512 320 497.7 320 480V364.8C295.1 377.1 268.8 384 240 384C211.2 384 184 377.1 160 364.8V480C160 497.7 145.7 512 128 512H96C78.33 512 64 497.7 64 480V249.8C35.23 238.9 12.64 214.5 4.836 183.3L.9558 167.8C-3.331 150.6 7.094 133.2 24.24 128.1C41.38 124.7 58.76 135.1 63.05 152.2L66.93 167.8C70.49 182 83.29 191.1 97.97 191.1H303.8L416 256.1z\"]\n};\nvar faDollarSign = {\n  prefix: 'fas',\n  iconName: 'dollar-sign',\n  icon: [320, 512, [128178, 61781, \"dollar\", \"usd\"], \"24\", \"M160 0C177.7 0 192 14.33 192 32V67.68C193.6 67.89 195.1 68.12 196.7 68.35C207.3 69.93 238.9 75.02 251.9 78.31C268.1 82.65 279.4 100.1 275 117.2C270.7 134.3 253.3 144.7 236.1 140.4C226.8 137.1 198.5 133.3 187.3 131.7C155.2 126.9 127.7 129.3 108.8 136.5C90.52 143.5 82.93 153.4 80.92 164.5C78.98 175.2 80.45 181.3 82.21 185.1C84.1 189.1 87.79 193.6 95.14 198.5C111.4 209.2 136.2 216.4 168.4 225.1L171.2 225.9C199.6 233.6 234.4 243.1 260.2 260.2C274.3 269.6 287.6 282.3 295.8 299.9C304.1 317.7 305.9 337.7 302.1 358.1C295.1 397 268.1 422.4 236.4 435.6C222.8 441.2 207.8 444.8 192 446.6V480C192 497.7 177.7 512 160 512C142.3 512 128 497.7 128 480V445.1C127.6 445.1 127.1 444.1 126.7 444.9L126.5 444.9C102.2 441.1 62.07 430.6 35 418.6C18.85 411.4 11.58 392.5 18.76 376.3C25.94 360.2 44.85 352.9 60.1 360.1C81.9 369.4 116.3 378.5 136.2 381.6C168.2 386.4 194.5 383.6 212.3 376.4C229.2 369.5 236.9 359.5 239.1 347.5C241 336.8 239.6 330.7 237.8 326.9C235.9 322.9 232.2 318.4 224.9 313.5C208.6 302.8 183.8 295.6 151.6 286.9L148.8 286.1C120.4 278.4 85.58 268.9 59.76 251.8C45.65 242.4 32.43 229.7 24.22 212.1C15.89 194.3 14.08 174.3 17.95 153C25.03 114.1 53.05 89.29 85.96 76.73C98.98 71.76 113.1 68.49 128 66.73V32C128 14.33 142.3 0 160 0V0z\"]\n};\nvar faDollar = faDollarSign;\nvar faUsd = faDollarSign;\nvar faDolly = {\n  prefix: 'fas',\n  iconName: 'dolly',\n  icon: [576, 512, [\"dolly-box\"], \"f472\", \"M294.2 277.8c17.1 5 34.62 13.38 49.5 24.62l161.5-53.75c8.375-2.875 12.88-11.88 10-20.25L454.8 47.25c-2.748-8.502-11.88-13-20.12-10.12l-61.13 20.37l33.12 99.38l-60.75 20.13l-33.12-99.38L251.2 98.13c-8.373 2.75-12.87 11.88-9.998 20.12L294.2 277.8zM574.4 309.9c-5.594-16.75-23.67-25.91-40.48-20.23l-202.5 67.51c-17.22-22.01-43.57-36.41-73.54-36.97L165.7 43.75C156.9 17.58 132.5 0 104.9 0H32C14.33 0 0 14.33 0 32s14.33 32 32 32h72.94l92.22 276.7C174.7 358.2 160 385.3 160 416c0 53.02 42.98 96 96 96c52.4 0 94.84-42.03 95.82-94.2l202.3-67.44C570.9 344.8 579.1 326.6 574.4 309.9zM256 448c-17.67 0-32-14.33-32-32c0-17.67 14.33-31.1 32-31.1S288 398.3 288 416C288 433.7 273.7 448 256 448z\"]\n};\nvar faDollyBox = faDolly;\nvar faDongSign = {\n  prefix: 'fas',\n  iconName: 'dong-sign',\n  icon: [384, 512, [], \"e169\", \"M320 64C337.7 64 352 78.33 352 96C352 113.7 337.7 128 320 128V384C320 401.7 305.7 416 288 416C275 416 263.9 408.3 258.8 397.2C239.4 409.1 216.5 416 192 416C121.3 416 64 358.7 64 288C64 217.3 121.3 160 192 160C215.3 160 237.2 166.2 256 177.1V128H224C206.3 128 192 113.7 192 96C192 78.33 206.3 64 224 64H256C256 46.33 270.3 32 288 32C305.7 32 320 46.33 320 64V64zM256 288C256 252.7 227.3 224 192 224C156.7 224 128 252.7 128 288C128 323.3 156.7 352 192 352C227.3 352 256 323.3 256 288zM352 448C369.7 448 384 462.3 384 480C384 497.7 369.7 512 352 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H352z\"]\n};\nvar faDoorClosed = {\n  prefix: 'fas',\n  iconName: 'door-closed',\n  icon: [576, 512, [128682], \"f52a\", \"M560 448H480V50.75C480 22.75 458.5 0 432 0h-288C117.5 0 96 22.75 96 50.75V448H16C7.125 448 0 455.1 0 464v32C0 504.9 7.125 512 16 512h544c8.875 0 16-7.125 16-16v-32C576 455.1 568.9 448 560 448zM384 288c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S401.6 288 384 288z\"]\n};\nvar faDoorOpen = {\n  prefix: 'fas',\n  iconName: 'door-open',\n  icon: [576, 512, [], \"f52b\", \"M560 448H512V113.5c0-27.25-21.5-49.5-48-49.5L352 64.01V128h96V512h112c8.875 0 16-7.125 16-15.1v-31.1C576 455.1 568.9 448 560 448zM280.3 1.007l-192 49.75C73.1 54.51 64 67.76 64 82.88V448H16c-8.875 0-16 7.125-16 15.1v31.1C0 504.9 7.125 512 16 512H320V33.13C320 11.63 300.5-4.243 280.3 1.007zM232 288c-13.25 0-24-14.37-24-31.1c0-17.62 10.75-31.1 24-31.1S256 238.4 256 256C256 273.6 245.3 288 232 288z\"]\n};\nvar faDove = {\n  prefix: 'fas',\n  iconName: 'dove',\n  icon: [512, 512, [128330], \"f4ba\", \"M288 167.2V139.1c-28.25-36.38-47.13-79.29-54.13-125.2C231.7 .4054 214.8-5.02 206.1 5.481C184.1 30.36 168.4 59.7 157.2 92.07C191.4 130.3 237.2 156.7 288 167.2zM400 63.97c-44.25 0-79.1 35.82-79.1 80.08l.0014 59.44c-104.4-6.251-193-70.46-233-161.7C81.48 29.25 63.76 28.58 58.01 40.83C41.38 75.96 32.01 115.2 32.01 156.6c0 70.76 34.11 136.9 85.11 185.9c13.12 12.75 26.13 23.27 38.88 32.77L12.12 411.2c-10.75 2.75-15.5 15.09-9.5 24.47c17.38 26.88 60.42 72.54 153.2 76.29c8 .25 15.99-2.633 22.12-7.883l65.23-56.12l76.84 .0561c88.38 0 160-71.49 160-159.9l.0013-160.2l31.1-63.99L400 63.97zM400 160.1c-8.75 0-16.01-7.259-16.01-16.01c0-8.876 7.261-16.05 16.01-16.05s15.99 7.136 15.99 16.01C416 152.8 408.8 160.1 400 160.1z\"]\n};\nvar faDownLeftAndUpRightToCenter = {\n  prefix: 'fas',\n  iconName: 'down-left-and-up-right-to-center',\n  icon: [512, 512, [\"compress-alt\"], \"f422\", \"M215.1 272h-136c-12.94 0-24.63 7.797-29.56 19.75C45.47 303.7 48.22 317.5 57.37 326.6l30.06 30.06l-78.06 78.07c-12.5 12.5-12.5 32.75-.0012 45.25l22.62 22.62c12.5 12.5 32.76 12.5 45.26 .0013l78.06-78.07l30.06 30.06c6.125 6.125 14.31 9.367 22.63 9.367c4.125 0 8.279-.7891 12.25-2.43c11.97-4.953 19.75-16.62 19.75-29.56V296C239.1 282.7 229.3 272 215.1 272zM296 240h136c12.94 0 24.63-7.797 29.56-19.75c4.969-11.97 2.219-25.72-6.938-34.87l-30.06-30.06l78.06-78.07c12.5-12.5 12.5-32.76 .0002-45.26l-22.62-22.62c-12.5-12.5-32.76-12.5-45.26-.0003l-78.06 78.07l-30.06-30.06c-9.156-9.141-22.87-11.84-34.87-6.937c-11.97 4.953-19.75 16.62-19.75 29.56v135.1C272 229.3 282.7 240 296 240z\"]\n};\nvar faCompressAlt = faDownLeftAndUpRightToCenter;\nvar faDownLong = {\n  prefix: 'fas',\n  iconName: 'down-long',\n  icon: [320, 512, [\"long-arrow-alt-down\"], \"f309\", \"M281.6 392.3l-104 112.1c-9.498 10.24-25.69 10.24-35.19 0l-104-112.1c-6.484-6.992-8.219-17.18-4.404-25.94c3.811-8.758 12.45-14.42 21.1-14.42H128V32c0-17.69 14.33-32 32-32S192 14.31 192 32v319.9h72c9.547 0 18.19 5.66 22 14.42C289.8 375.1 288.1 385.3 281.6 392.3z\"]\n};\nvar faLongArrowAltDown = faDownLong;\nvar faDownload = {\n  prefix: 'fas',\n  iconName: 'download',\n  icon: [512, 512, [], \"f019\", \"M480 352h-133.5l-45.25 45.25C289.2 409.3 273.1 416 256 416s-33.16-6.656-45.25-18.75L165.5 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM432 456c-13.2 0-24-10.8-24-24c0-13.2 10.8-24 24-24s24 10.8 24 24C456 445.2 445.2 456 432 456zM233.4 374.6C239.6 380.9 247.8 384 256 384s16.38-3.125 22.62-9.375l128-128c12.49-12.5 12.49-32.75 0-45.25c-12.5-12.5-32.76-12.5-45.25 0L288 274.8V32c0-17.67-14.33-32-32-32C238.3 0 224 14.33 224 32v242.8L150.6 201.4c-12.49-12.5-32.75-12.5-45.25 0c-12.49 12.5-12.49 32.75 0 45.25L233.4 374.6z\"]\n};\nvar faDragon = {\n  prefix: 'fas',\n  iconName: 'dragon',\n  icon: [640, 512, [128009], \"f6d5\", \"M18.43 255.8L192 224L100.8 292.6C90.67 302.8 97.8 320 112 320h222.7c-9.499-26.5-14.75-54.5-14.75-83.38V194.2L200.3 106.8C176.5 90.88 145 92.75 123.3 111.2l-117.5 116.4C-6.562 238 2.436 258 18.43 255.8zM575.2 289.9l-100.7-50.25c-16.25-8.125-26.5-24.75-26.5-43V160h63.99l28.12 22.62C546.1 188.6 554.2 192 562.7 192h30.1c11.1 0 23.12-6.875 28.5-17.75l14.37-28.62c5.374-10.87 4.25-23.75-2.999-33.5l-74.49-99.37C552.1 4.75 543.5 0 533.5 0H296C288.9 0 285.4 8.625 290.4 13.62L351.1 64L292.4 88.75c-5.874 3-5.874 11.37 0 14.37L351.1 128l-.0011 108.6c0 72 35.99 139.4 95.99 179.4c-195.6 6.75-344.4 41-434.1 60.88c-8.124 1.75-13.87 9-13.87 17.38C.0463 504 8.045 512 17.79 512h499.1c63.24 0 119.6-47.5 122.1-110.8C642.3 354 617.1 310.9 575.2 289.9zM489.1 66.25l45.74 11.38c-2.75 11-12.5 18.88-24.12 18.25C497.7 95.25 484.8 83.38 489.1 66.25z\"]\n};\nvar faDrawPolygon = {\n  prefix: 'fas',\n  iconName: 'draw-polygon',\n  icon: [448, 512, [], \"f5ee\", \"M384.3 352C419.5 352.2 448 380.7 448 416C448 451.3 419.3 480 384 480C360.3 480 339.6 467.1 328.6 448H119.4C108.4 467.1 87.69 480 64 480C28.65 480 0 451.3 0 416C0 392.3 12.87 371.6 32 360.6V151.4C12.87 140.4 0 119.7 0 96C0 60.65 28.65 32 64 32C87.69 32 108.4 44.87 119.4 64H328.6C339.6 44.87 360.3 32 384 32C419.3 32 448 60.65 448 96C448 131.3 419.5 159.8 384.3 159.1L345.5 227.9C349.7 236.4 352 245.9 352 256C352 266.1 349.7 275.6 345.5 284.1L384.3 352zM96 360.6C105.7 366.2 113.8 374.3 119.4 384H328.6C328.6 383.9 328.7 383.8 328.7 383.7L292.2 319.9C290.8 319.1 289.4 320 288 320C252.7 320 224 291.3 224 256C224 220.7 252.7 192 288 192C289.4 192 290.8 192 292.2 192.1L328.7 128.3L328.6 128H119.4C113.8 137.7 105.7 145.8 96 151.4L96 360.6z\"]\n};\nvar faDroplet = {\n  prefix: 'fas',\n  iconName: 'droplet',\n  icon: [384, 512, [128167, \"tint\"], \"f043\", \"M16 319.1C16 245.9 118.3 89.43 166.9 19.3C179.2 1.585 204.8 1.585 217.1 19.3C265.7 89.43 368 245.9 368 319.1C368 417.2 289.2 496 192 496C94.8 496 16 417.2 16 319.1zM112 319.1C112 311.2 104.8 303.1 96 303.1C87.16 303.1 80 311.2 80 319.1C80 381.9 130.1 432 192 432C200.8 432 208 424.8 208 416C208 407.2 200.8 400 192 400C147.8 400 112 364.2 112 319.1z\"]\n};\nvar faTint = faDroplet;\nvar faDropletSlash = {\n  prefix: 'fas',\n  iconName: 'droplet-slash',\n  icon: [640, 512, [\"tint-slash\"], \"f5c7\", \"M215.3 143.4C243.5 95.07 274.2 49.29 294.9 19.3C307.2 1.585 332.8 1.585 345.1 19.3C393.7 89.43 496 245.9 496 319.1C496 333.7 494.4 347.1 491.5 359.9L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L215.3 143.4zM143.1 319.1C143.1 296.5 154.3 264.6 169.1 229.9L443.5 445.4C411.7 476.7 368.1 496 319.1 496C222.8 496 143.1 417.2 143.1 319.1V319.1zM239.1 319.1C239.1 311.2 232.8 303.1 223.1 303.1C215.2 303.1 207.1 311.2 207.1 319.1C207.1 381.9 258.1 432 319.1 432C328.8 432 336 424.8 336 416C336 407.2 328.8 400 319.1 400C275.8 400 239.1 364.2 239.1 319.1V319.1z\"]\n};\nvar faTintSlash = faDropletSlash;\nvar faDrum = {\n  prefix: 'fas',\n  iconName: 'drum',\n  icon: [512, 512, [129345], \"f569\", \"M431.1 122l70.02-45.91c11.09-7.273 14.19-22.14 6.906-33.25c-7.219-11.07-22.09-14.23-33.22-6.924l-106.4 69.73c-49.81-8.787-97.18-9.669-112.4-9.669c-.002 0 .002 0 0 0C219.5 96 0 100.6 0 208.3v160.1c0 30.27 27.5 57.68 71.1 77.85v-101.9c0-13.27 10.75-24.03 24-24.03s23.1 10.76 23.1 24.03v118.9C153 472.4 191.1 478.3 231.1 480v-103.6c0-13.27 10.75-24.03 24-24.03c.002 0-.002 0 0 0c13.25 0 24 10.76 24 24.03V480c40.93-1.668 78.95-7.615 111.1-16.72v-118.9c0-13.27 10.75-24.03 24-24.03s24 10.76 24 24.03v101.9c44.49-20.17 71.1-47.58 71.1-77.85V208.3C511.1 164.9 476.1 138.4 431.1 122zM255.1 272.5C255.1 272.5 255.1 272.5 255.1 272.5c-114.9 0-207.1-28.97-207.1-64.39s93.12-63.1 207.1-63.1c.002 0-.002 0 0 0c17.5 0 34.47 .7139 50.71 1.966L242.8 187.1c-11.09 7.273-14.19 22.14-6.906 33.25C240.5 228.3 248.2 232.1 256 232.1c4.5 0 9.062-1.265 13.12-3.923l109.3-71.67c51.77 11.65 85.5 30.38 85.5 51.67C463.1 243.6 370.9 272.5 255.1 272.5z\"]\n};\nvar faDrumSteelpan = {\n  prefix: 'fas',\n  iconName: 'drum-steelpan',\n  icon: [576, 512, [], \"f56a\", \"M288 32C129 32 0 89.25 0 160v192c0 70.75 129 128 288 128s288-57.25 288-128V160C576 89.25 447 32 288 32zM205 190.4c-4.5 16.62-14.5 30.5-28.25 40.5C100.2 217.5 48 190.8 48 160c0-30.12 50.12-56.38 124-69.1l25.62 44.25C207.5 151.4 210.1 171.2 205 190.4zM288 240c-21.12 0-41.38-.1-60.88-2.75C235.1 211.1 259.2 192 288 192s52.88 19.12 60.88 45.25C329.4 239 309.1 240 288 240zM352 96c0 35.25-28.75 64-64 64S224 131.2 224 96V83C244.4 81.12 265.8 80 288 80s43.63 1.125 64 3V96zM398.9 230.9c-13.75-9.875-23.88-23.88-28.38-40.5c-5.125-19.13-2.5-39 7.375-56l25.62-44.5C477.8 103.5 528 129.8 528 160C528 190.9 475.6 217.5 398.9 230.9z\"]\n};\nvar faDrumstickBite = {\n  prefix: 'fas',\n  iconName: 'drumstick-bite',\n  icon: [512, 512, [], \"f6d7\", \"M512 168.9c0 1.766-.0229 3.398-.0768 5.164c-16.91-9.132-35.51-13.76-53.96-13.76c-82.65 0-105.5 74.17-105.5 105.4c0 27.04 9.923 54.43 29.63 76.25c-19.52 6.629-39.99 9.997-60.62 9.997l-87.18 .0038l-40.59 40.49c-6.104 6.103-8.921 14.01-8.921 22.17c0 13.98 7.244 17.1 7.244 37.03C192.1 485.4 164.6 512 131.7 512c-15.63 0-31.11-6.055-42.72-17.8c-11.55-11.46-16.82-26.31-16.82-41.26c0-4.948 .575-9.903 1.695-14.75c-4.842 1.11-9.793 1.681-14.72 1.681c-42.15 0-59.13-36.64-59.13-59.5c0-33.43 27.15-60.34 60.39-60.34c18.97 0 22.97 7.219 36.96 7.219c8.159 0 16.04-2.811 22.14-8.914l40.57-40.47L160.1 191.1c0-63.1 27.79-107 63.17-142.4c33.13-33.06 76.39-49.59 119.7-49.59s86.79 16.53 119.9 49.59C495.9 82.5 512 125.7 512 168.9z\"]\n};\nvar faDumbbell = {\n  prefix: 'fas',\n  iconName: 'dumbbell',\n  icon: [640, 512, [], \"f44b\", \"M104 96h-48C42.75 96 32 106.8 32 120V224C14.33 224 0 238.3 0 256c0 17.67 14.33 32 31.1 32L32 392C32 405.3 42.75 416 56 416h48C117.3 416 128 405.3 128 392v-272C128 106.8 117.3 96 104 96zM456 32h-48C394.8 32 384 42.75 384 56V224H256V56C256 42.75 245.3 32 232 32h-48C170.8 32 160 42.75 160 56v400C160 469.3 170.8 480 184 480h48C245.3 480 256 469.3 256 456V288h128v168c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24V56C480 42.75 469.3 32 456 32zM608 224V120C608 106.8 597.3 96 584 96h-48C522.8 96 512 106.8 512 120v272c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24V288c17.67 0 32-14.33 32-32C640 238.3 625.7 224 608 224z\"]\n};\nvar faDumpster = {\n  prefix: 'fas',\n  iconName: 'dumpster',\n  icon: [576, 512, [], \"f793\", \"M560 160c10.38 0 17.1-9.75 15.5-19.88l-24-95.1C549.8 37 543.3 32 536 32h-98.88l25.62 128H560zM272 32H171.5L145.9 160H272V32zM404.5 32H304v128h126.1L404.5 32zM16 160h97.25l25.63-128H40C32.75 32 26.25 37 24.5 44.12l-24 95.1C-2.001 150.2 5.625 160 16 160zM560 224h-20L544 192H32l4 32H16C7.25 224 0 231.2 0 240v32C0 280.8 7.25 288 16 288h28L64 448v16C64 472.8 71.25 480 80 480h32C120.8 480 128 472.8 128 464V448h320v16c0 8.75 7.25 16 16 16h32c8.75 0 16-7.25 16-16V448l20-160H560C568.8 288 576 280.8 576 272v-32C576 231.2 568.8 224 560 224z\"]\n};\nvar faDumpsterFire = {\n  prefix: 'fas',\n  iconName: 'dumpster-fire',\n  icon: [640, 512, [], \"f794\", \"M418.8 104.2L404.6 32H304.1L304 159.1h60.77C381.1 140.7 399.1 121.8 418.8 104.2zM272.1 32.12H171.5L145.9 160.1h126.1L272.1 32.12zM461.3 104.2c18.25 16.25 35.51 33.62 51.14 51.49c5.751-5.623 11.38-11.12 17.38-16.37l21.26-18.98l21.25 18.98c1.125 .9997 2.125 2.124 3.126 3.124c-.125-.7498 .2501-1.5 0-2.249l-24-95.97c-1.625-7.123-8.127-12.12-15.38-12.12H437.2l12.25 61.5L461.3 104.2zM16 160.1l97.26-.0223l25.64-127.9h-98.89c-7.251 0-13.75 4.999-15.5 12.12L.5001 140.2C-2.001 150.3 5.626 160.1 16 160.1zM340.6 192.1L32.01 192.1l4.001 31.99L16 224.1C7.252 224.1 0 231.3 0 240.1V272c0 8.748 7.251 15.1 16 15.1l28.01 .0177l20 159.1L64.01 464C64.01 472.8 71.26 480 80.01 480h32.01c8.752 0 16-7.248 16-15.1v-15.1l208.8-.002c-30.13-33.74-48.73-77.85-48.73-126.3C288.1 285.8 307.9 238.8 340.6 192.1zM551.2 163.3c-14.88 13.25-28.38 27.12-40.26 41.12c-19.5-25.74-43.63-51.99-71.01-76.36c-70.14 62.73-120 144.2-120 193.6C319.1 409.1 391.6 480 479.1 480s160-70.87 160-158.3C640.1 285 602.1 209.4 551.2 163.3zM532.6 392.6c-14.75 10.62-32.88 16.1-52.51 16.1c-49.01 0-88.89-33.49-88.89-87.98c0-27.12 16.5-50.99 49.38-91.85c4.751 5.498 67.14 87.98 67.14 87.98l39.76-46.99c2.876 4.874 5.375 9.497 7.75 13.1C573.9 321.5 565.1 368.4 532.6 392.6z\"]\n};\nvar faDungeon = {\n  prefix: 'fas',\n  iconName: 'dungeon',\n  icon: [512, 512, [], \"f6d9\", \"M336.6 156.5C327.3 148.1 322.6 136.5 327.1 125.3L357.6 49.18C362.7 36.27 377.8 30.36 389.7 37.63C410.9 50.63 430 66.62 446.5 85.02C455.7 95.21 452.9 110.9 441.5 118.5L373.9 163.5C363.6 170.4 349.8 168.1 340.5 159.9C339.2 158.7 337.9 157.6 336.6 156.5H336.6zM297.7 112.6C293.2 123.1 280.9 129.8 268.7 128.6C264.6 128.2 260.3 128 256 128C251.7 128 247.4 128.2 243.3 128.6C231.1 129.8 218.8 123.1 214.3 112.6L183.1 36.82C178.8 24.02 185.5 9.433 198.1 6.374C217.3 2.203 236.4 0 256 0C275.6 0 294.7 2.203 313 6.374C326.5 9.433 333.2 24.02 328 36.82L297.7 112.6zM122.3 37.63C134.2 30.36 149.3 36.27 154.4 49.18L184.9 125.3C189.4 136.5 184.7 148.1 175.4 156.5C174.1 157.6 172.8 158.7 171.5 159.9C162.2 168.1 148.4 170.4 138.1 163.5L70.52 118.5C59.13 110.9 56.32 95.21 65.46 85.02C81.99 66.62 101.1 50.63 122.3 37.63H122.3zM379.5 222.1C376.3 210.7 379.7 198.1 389.5 191.6L458.1 145.8C469.7 138.1 485.6 141.9 491.2 154.7C501.6 178.8 508.4 204.8 510.9 232C512.1 245.2 501.3 255.1 488 255.1H408C394.7 255.1 384.2 245.2 381.8 232.1C381.1 228.7 380.4 225.4 379.5 222.1V222.1zM122.5 191.6C132.3 198.1 135.7 210.7 132.5 222.1C131.6 225.4 130.9 228.7 130.2 232.1C127.8 245.2 117.3 256 104 256H24C10.75 256-.1184 245.2 1.107 232C3.636 204.8 10.43 178.8 20.82 154.7C26.36 141.9 42.26 138.1 53.91 145.8L122.5 191.6zM104 288C117.3 288 128 298.7 128 312V360C128 373.3 117.3 384 104 384H24C10.75 384 0 373.3 0 360V312C0 298.7 10.75 288 24 288H104zM488 288C501.3 288 512 298.7 512 312V360C512 373.3 501.3 384 488 384H408C394.7 384 384 373.3 384 360V312C384 298.7 394.7 288 408 288H488zM104 416C117.3 416 128 426.7 128 440V488C128 501.3 117.3 512 104 512H24C10.75 512 0 501.3 0 488V440C0 426.7 10.75 416 24 416H104zM488 416C501.3 416 512 426.7 512 440V488C512 501.3 501.3 512 488 512H408C394.7 512 384 501.3 384 488V440C384 426.7 394.7 416 408 416H488zM272 464C272 472.8 264.8 480 256 480C247.2 480 240 472.8 240 464V192C240 183.2 247.2 176 256 176C264.8 176 272 183.2 272 192V464zM208 464C208 472.8 200.8 480 192 480C183.2 480 176 472.8 176 464V224C176 215.2 183.2 208 192 208C200.8 208 208 215.2 208 224V464zM336 464C336 472.8 328.8 480 320 480C311.2 480 304 472.8 304 464V224C304 215.2 311.2 208 320 208C328.8 208 336 215.2 336 224V464z\"]\n};\nvar faE = {\n  prefix: 'fas',\n  iconName: 'e',\n  icon: [320, 512, [101], \"45\", \"M320 448c0 17.67-14.33 32-32 32H32c-17.67 0-32-14.33-32-32v-384C0 46.34 14.33 32.01 32 32.01h256c17.67 0 32 14.33 32 32s-14.33 32-32 32H64v128h160c17.67 0 32 14.32 32 31.99s-14.33 32.01-32 32.01H64v128h224C305.7 416 320 430.3 320 448z\"]\n};\nvar faEarDeaf = {\n  prefix: 'fas',\n  iconName: 'ear-deaf',\n  icon: [512, 512, [\"deaf\", \"deafness\", \"hard-of-hearing\"], \"f2a4\", \"M192 319.1C185.8 313.7 177.6 310.6 169.4 310.6S153 313.7 146.8 319.1l-137.4 137.4C3.124 463.6 0 471.8 0 480c0 18.3 14.96 31.1 31.1 31.1c8.188 0 16.38-3.124 22.62-9.371l137.4-137.4c6.247-6.247 9.371-14.44 9.371-22.62S198.3 326.2 192 319.1zM200 240c0-22.06 17.94-40 40-40s40 17.94 40 40c0 13.25 10.75 24 24 24s24-10.75 24-24c0-48.53-39.47-88-88-88S152 191.5 152 240c0 13.25 10.75 24 24 24S200 253.3 200 240zM511.1 31.1c0-8.188-3.124-16.38-9.371-22.62s-14.44-9.372-22.63-9.372s-16.38 3.124-22.62 9.372L416 50.75c-6.248 6.248-9.372 14.44-9.372 22.63c0 8.188 3.123 16.38 9.37 22.62c6.247 6.248 14.44 9.372 22.63 9.372s16.38-3.124 22.63-9.372l41.38-41.38C508.9 48.37 511.1 40.18 511.1 31.1zM415.1 241.6c0-57.78-42.91-177.6-175.1-177.6c-153.6 0-175.2 150.8-175.2 160.4c0 17.32 14.99 31.58 32.75 31.58c16.61 0 29.25-13.07 31.24-29.55c6.711-55.39 54.02-98.45 111.2-98.45c80.45 0 111.2 75.56 111.2 119.6c0 57.94-38.22 98.14-46.37 106.3L288 370.7v13.25c0 31.4-22.71 57.58-52.58 62.98C220.4 449.7 208 463.3 208 478.6c0 17.95 14.72 32.09 32.03 32.09c4.805 0 100.5-14.34 111.2-112.7C412.6 335.8 415.1 263.4 415.1 241.6z\"]\n};\nvar faDeaf = faEarDeaf;\nvar faDeafness = faEarDeaf;\nvar faHardOfHearing = faEarDeaf;\nvar faEarListen = {\n  prefix: 'fas',\n  iconName: 'ear-listen',\n  icon: [512, 512, [\"assistive-listening-systems\"], \"f2a2\", \"M160.1 320c-17.64 0-32.02 14.37-32.02 31.1s14.38 31.1 32.02 31.1s32.02-14.37 32.02-31.1S177.8 320 160.1 320zM86.66 361.4c-12.51-12.49-32.77-12.49-45.27 0c-12.51 12.5-12.51 32.78 0 45.27l63.96 63.99c12.51 12.49 32.77 12.49 45.27 .002c12.51-12.5 12.51-32.78 0-45.27L86.66 361.4zM32.02 448C14.38 448 0 462.4 0 480S14.38 512 32.02 512c17.64 0 32.02-14.37 32.02-31.1S49.66 448 32.02 448zM287.7 70.31c-110.9-29.38-211.7 47.53-222.8 150.9C62.1 239.9 78.73 255.1 97.57 255.1c16.61 0 29.25-13.07 31.24-29.55c6.934-57.22 57.21-101.3 116.9-98.3c71.71 3.594 117.1 76.82 102.5 146.9c-6.551 29.65-21.4 56.87-43.38 78.87L288 370.7v13.25c0 31.4-22.71 57.58-52.58 62.98C220.4 449.7 208 463.3 208 478.6c0 19.78 17.88 34.94 37.38 31.64c55.92-9.443 99.63-55.28 105.9-112.2c40.11-40.68 62.89-93.95 64.65-150.9C418.4 166.4 365.8 91 287.7 70.31zM240 200c22.06 0 40 17.94 40 40c0 13.25 10.75 24 24 24s24-10.75 24-24c0-48.53-39.47-88-88-88S152 191.5 152 240c0 13.25 10.75 24 24 24S200 253.3 200 240C200 217.9 217.9 200 240 200zM397.8 3.125c-15.91-7.594-35.05-.8438-42.66 15.09c-7.594 15.97-.8281 35.06 15.12 42.66C417.5 83.41 448 134.9 448 192c0 17.69 14.33 32 32 32S512 209.7 512 192C512 110.3 467.2 36.19 397.8 3.125z\"]\n};\nvar faAssistiveListeningSystems = faEarListen;\nvar faEarthAfrica = {\n  prefix: 'fas',\n  iconName: 'earth-africa',\n  icon: [512, 512, [127757, \"globe-africa\"], \"f57c\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM177.8 63.19L187.8 80.62C190.5 85.46 192 90.93 192 96.5V137.9C192 141.8 193.6 145.6 196.3 148.3C202.6 154.6 212.8 153.1 218.3 147.1L231.9 130.1C236.6 124.2 244.8 122.4 251.6 125.8L266.8 133.4C270.2 135.1 273.1 136 277.8 136C284.3 136 290.6 133.4 295.2 128.8L299.1 124.9C302 121.1 306.5 121.2 310.1 123.1L339.4 137.7C347.1 141.6 352 149.5 352 158.1C352 168.6 344.9 177.8 334.7 180.3L299.3 189.2C291.9 191 284.2 190.7 276.1 188.3L244.1 177.7C241.7 176.6 238.2 176 234.8 176C227.8 176 220.1 178.3 215.4 182.5L176 212C165.9 219.6 160 231.4 160 244V272C160 298.5 181.5 320 208 320H240C248.8 320 256 327.2 256 336V384C256 401.7 270.3 416 288 416C298.1 416 307.6 411.3 313.6 403.2L339.2 369.1C347.5 357.1 352 344.5 352 330.7V318.6C352 314.7 354.6 311.3 358.4 310.4L363.7 309.1C375.6 306.1 384 295.4 384 283.1C384 275.1 381.2 269.2 376.2 264.2L342.7 230.7C338.1 226.1 338.1 221 342.7 217.3C348.4 211.6 356.8 209.6 364.5 212.2L378.6 216.9C390.9 220.1 404.3 215.4 410.1 203.8C413.6 196.8 421.3 193.1 428.1 194.6L456.4 200.1C431.1 112.4 351.5 48 256 48C228.3 48 201.1 53.4 177.8 63.19L177.8 63.19z\"]\n};\nvar faGlobeAfrica = faEarthAfrica;\nvar faEarthAmericas = {\n  prefix: 'fas',\n  iconName: 'earth-americas',\n  icon: [512, 512, [127758, \"earth\", \"earth-america\", \"globe-americas\"], \"f57d\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM57.71 192.1L67.07 209.4C75.36 223.9 88.99 234.6 105.1 239.2L162.1 255.7C180.2 260.6 192 276.3 192 294.2V334.1C192 345.1 198.2 355.1 208 359.1C217.8 364.9 224 374.9 224 385.9V424.9C224 440.5 238.9 451.7 253.9 447.4C270.1 442.8 282.5 429.1 286.6 413.7L289.4 402.5C293.6 385.6 304.6 371.1 319.7 362.4L327.8 357.8C342.8 349.3 352 333.4 352 316.1V307.9C352 295.1 346.9 282.9 337.9 273.9L334.1 270.1C325.1 261.1 312.8 255.1 300.1 255.1H256.1C245.9 255.1 234.9 253.1 225.2 247.6L190.7 227.8C186.4 225.4 183.1 221.4 181.6 216.7C178.4 207.1 182.7 196.7 191.7 192.1L197.7 189.2C204.3 185.9 211.9 185.3 218.1 187.7L242.2 195.4C250.3 198.1 259.3 195 264.1 187.9C268.8 180.8 268.3 171.5 262.9 165L249.3 148.8C239.3 136.8 239.4 119.3 249.6 107.5L265.3 89.12C274.1 78.85 275.5 64.16 268.8 52.42L266.4 48.26C262.1 48.09 259.5 48 256 48C163.1 48 84.4 108.9 57.71 192.1L57.71 192.1zM437.6 154.5L412 164.8C396.3 171.1 388.2 188.5 393.5 204.6L410.4 255.3C413.9 265.7 422.4 273.6 433 276.3L462.2 283.5C463.4 274.5 464 265.3 464 256C464 219.2 454.4 184.6 437.6 154.5H437.6z\"]\n};\nvar faEarth = faEarthAmericas;\nvar faEarthAmerica = faEarthAmericas;\nvar faGlobeAmericas = faEarthAmericas;\nvar faEarthAsia = {\n  prefix: 'fas',\n  iconName: 'earth-asia',\n  icon: [512, 512, [127759, \"globe-asia\"], \"f57e\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM51.68 295.1L83.41 301.5C91.27 303.1 99.41 300.6 105.1 294.9L120.5 279.5C132 267.1 151.6 271.1 158.9 285.8L168.2 304.3C172.1 313.9 182.8 319.1 193.5 319.1C208.7 319.1 219.6 305.4 215.2 290.8L209.3 270.9C204.6 255.5 216.2 240 232.3 240H234.6C247.1 240 260.5 233.3 267.9 222.2L278.6 206.1C284.2 197.7 283.9 186.6 277.8 178.4L261.7 156.9C251.4 143.2 258.4 123.4 275.1 119.2L292.1 114.1C299.6 113.1 305.7 107.8 308.6 100.6L324.9 59.69C303.4 52.12 280.2 48 255.1 48C141.1 48 47.1 141.1 47.1 256C47.1 269.4 49.26 282.5 51.68 295.1L51.68 295.1zM450.4 300.4L434.6 304.9C427.9 306.7 420.8 304 417.1 298.2L415.1 295.1C409.1 285.7 398.7 279.1 387.5 279.1C376.4 279.1 365.1 285.7 359.9 295.1L353.8 304.6C352.4 306.8 350.5 308.7 348.2 309.1L311.1 330.1C293.9 340.2 286.5 362.5 294.1 381.4L300.5 393.8C309.1 413 331.2 422.3 350.1 414.9L353.5 413.1C363.6 410.2 374.8 411.8 383.5 418.1L385 419.2C422.2 389.7 449.1 347.8 459.4 299.7C456.4 299.4 453.4 299.6 450.4 300.4H450.4zM156.1 367.5L188.1 375.5C196.7 377.7 205.4 372.5 207.5 363.9C209.7 355.3 204.5 346.6 195.9 344.5L163.9 336.5C155.3 334.3 146.6 339.5 144.5 348.1C142.3 356.7 147.5 365.4 156.1 367.5V367.5zM236.5 328.1C234.3 336.7 239.5 345.4 248.1 347.5C256.7 349.7 265.4 344.5 267.5 335.9L275.5 303.9C277.7 295.3 272.5 286.6 263.9 284.5C255.3 282.3 246.6 287.5 244.5 296.1L236.5 328.1zM321.7 120.8L305.7 152.8C301.7 160.7 304.9 170.4 312.8 174.3C320.7 178.3 330.4 175.1 334.3 167.2L350.3 135.2C354.3 127.3 351.1 117.6 343.2 113.7C335.3 109.7 325.6 112.9 321.7 120.8V120.8z\"]\n};\nvar faGlobeAsia = faEarthAsia;\nvar faEarthEurope = {\n  prefix: 'fas',\n  iconName: 'earth-europe',\n  icon: [512, 512, [\"globe-europe\"], \"f7a2\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM266.3 48.25L232.5 73.6C227.2 77.63 224 83.95 224 90.67V99.72C224 106.5 229.5 112 236.3 112C238.7 112 241.1 111.3 243.1 109.9L284.9 82.06C286.9 80.72 289.3 80 291.7 80H292.7C298.9 80 304 85.07 304 91.31C304 94.31 302.8 97.19 300.7 99.31L280.8 119.2C275 124.1 267.9 129.4 260.2 131.9L233.6 140.8C227.9 142.7 224 148.1 224 154.2C224 157.9 222.5 161.5 219.9 164.1L201.9 182.1C195.6 188.4 192 197.1 192 206.1V210.3C192 226.7 205.6 240 221.9 240C232.9 240 243.1 233.8 248 224L252 215.9C254.5 211.1 259.4 208 264.8 208C269.4 208 273.6 210.1 276.3 213.7L292.6 235.5C294.7 238.3 298.1 240 301.7 240C310.1 240 315.6 231.1 311.8 223.6L310.7 221.3C307.1 214.3 310.7 205.8 318.1 203.3L339.3 196.2C346.9 193.7 352 186.6 352 178.6C352 168.3 360.3 160 370.6 160H400C408.8 160 416 167.2 416 176C416 184.8 408.8 192 400 192H379.3C372.1 192 365.1 194.9 360 200L355.3 204.7C353.2 206.8 352 209.7 352 212.7C352 218.9 357.1 224 363.3 224H374.6C380.6 224 386.4 226.4 390.6 230.6L397.2 237.2C398.1 238.1 400 241.4 400 244C400 246.6 398.1 249 397.2 250.8L389.7 258.3C386 261.1 384 266.9 384 272C384 277.1 386 282 389.7 285.7L408 304C418.2 314.2 432.1 320 446.6 320H453.1C460.5 299.8 464 278.3 464 256C464 144.6 376.4 53.64 266.3 48.25V48.25zM438.4 356.1C434.7 353.5 430.2 352 425.4 352C419.4 352 413.6 349.6 409.4 345.4L395.1 331.1C388.3 324.3 377.9 320 367.1 320C357.4 320 347.9 316.5 340.5 310.2L313.1 287.4C302.4 277.5 287.6 271.1 272.3 271.1H251.4C238.7 271.1 226.4 275.7 215.9 282.7L188.5 301C170.7 312.9 160 332.9 160 354.3V357.5C160 374.5 166.7 390.7 178.7 402.7L194.7 418.7C203.2 427.2 214.7 432 226.7 432H248C261.3 432 272 442.7 272 456C272 458.5 272.4 461 273.1 463.3C344.5 457.5 405.6 415.7 438.4 356.1L438.4 356.1zM164.7 100.7L132.7 132.7C126.4 138.9 126.4 149.1 132.7 155.3C138.9 161.6 149.1 161.6 155.3 155.3L187.3 123.3C193.6 117.1 193.6 106.9 187.3 100.7C181.1 94.44 170.9 94.44 164.7 100.7V100.7z\"]\n};\nvar faGlobeEurope = faEarthEurope;\nvar faEarthOceania = {\n  prefix: 'fas',\n  iconName: 'earth-oceania',\n  icon: [512, 512, [\"globe-oceania\"], \"e47b\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM215.5 360.6L240.9 377C247.1 381.6 256.2 384 264.6 384C278 384 290.7 377.8 298.1 367.2L311 351.8C316.8 344.4 320 335.2 320 325.8C320 316.4 316.8 307.2 311 299.8L293.1 276.9C288.3 270.7 284.4 263.1 281.6 256.7L271.5 230.8C269.9 226.7 265.9 224 261.5 224C258 224 254.8 225.6 252.8 228.4L242.4 242.6C237.7 248.1 229.7 252.1 221.9 250.5C218.7 249.8 215.8 247.1 213.8 245.4L209.3 239.3C202.1 229.7 190.7 224 178.7 224C166.7 224 155.3 229.7 148.1 239.3L142.8 246.3C141.3 248.4 139.2 250 136.9 251.1L101.6 267.9C81.08 277.7 72.8 302.6 83.37 322.7L86.65 328.9C95.67 346.1 115.7 354.3 134.1 348.4L149.5 343.6C156 341.5 163.1 341.6 169.6 343.8L208.6 357.3C211 358.1 213.4 359.2 215.5 360.6H215.5zM273.8 142.5C264.3 132.1 250.8 128.9 237.6 131.5L199.1 139.2C183.8 142.3 181.5 163.2 195.7 169.5L238.5 188.6C243.7 190.8 249.2 192 254.8 192H284.7C298.9 192 306.1 174.8 296 164.7L273.8 142.5zM264 448H280C288.8 448 296 440.8 296 432C296 423.2 288.8 416 280 416H264C255.2 416 248 423.2 248 432C248 440.8 255.2 448 264 448zM431.2 298.9C428.4 290.6 419.3 286 410.9 288.8C402.6 291.6 398 300.7 400.8 309.1L408.8 333.1C411.6 341.4 420.7 345.1 429.1 343.2C437.4 340.4 441.1 331.3 439.2 322.9L431.2 298.9zM411.3 379.3C417.6 373.1 417.6 362.9 411.3 356.7C405.1 350.4 394.9 350.4 388.7 356.7L356.7 388.7C350.4 394.9 350.4 405.1 356.7 411.3C362.9 417.6 373.1 417.6 379.3 411.3L411.3 379.3z\"]\n};\nvar faGlobeOceania = faEarthOceania;\nvar faEgg = {\n  prefix: 'fas',\n  iconName: 'egg',\n  icon: [384, 512, [129370], \"f7fb\", \"M192 16c-106 0-192 182-192 288c0 106 85.1 192 192 192c105.1 0 192-85.1 192-192C384 198 297.1 16 192 16zM160.1 138C128.6 177.1 96 249.8 96 304C96 312.8 88.84 320 80 320S64 312.8 64 304c0-63.56 36.7-143.3 71.22-186c5.562-6.906 15.64-7.969 22.5-2.406C164.6 121.1 165.7 131.2 160.1 138z\"]\n};\nvar faEject = {\n  prefix: 'fas',\n  iconName: 'eject',\n  icon: [448, 512, [9167], \"f052\", \"M48.01 319.1h351.1c41.62 0 63.49-49.63 35.37-80.38l-175.1-192.1c-19-20.62-51.75-20.62-70.75 0L12.64 239.6C-15.48 270.2 6.393 319.1 48.01 319.1zM399.1 384H48.01c-26.39 0-47.99 21.59-47.99 47.98C.0117 458.4 21.61 480 48.01 480h351.1c26.39 0 47.99-21.6 47.99-47.99C447.1 405.6 426.4 384 399.1 384z\"]\n};\nvar faElevator = {\n  prefix: 'fas',\n  iconName: 'elevator',\n  icon: [512, 512, [], \"e16d\", \"M79 96h130c5.967 0 11.37-3.402 13.75-8.662c2.385-5.262 1.299-11.39-2.754-15.59l-65-67.34c-5.684-5.881-16.31-5.881-21.99 0l-65 67.34C63.95 75.95 62.87 82.08 65.25 87.34C67.63 92.6 73.03 96 79 96zM357 91.59c5.686 5.881 16.31 5.881 21.99 0l65-67.34c4.053-4.199 5.137-10.32 2.754-15.59C444.4 3.402 438.1 0 433 0h-130c-5.967 0-11.37 3.402-13.75 8.662c-2.385 5.262-1.301 11.39 2.752 15.59L357 91.59zM448 128H64c-35.35 0-64 28.65-64 63.1v255.1C0 483.3 28.65 512 64 512h384c35.35 0 64-28.65 64-63.1V192C512 156.7 483.3 128 448 128zM352 224C378.5 224.1 400 245.5 400 272c0 26.46-21.47 47.9-48 48C325.5 319.9 304 298.5 304 272C304 245.5 325.5 224.1 352 224zM160 224C186.5 224.1 208 245.5 208 272c0 26.46-21.47 47.9-48 48C133.5 319.9 112 298.5 112 272C112 245.5 133.5 224.1 160 224zM240 448h-160v-48C80 373.5 101.5 352 128 352h64c26.51 0 48 21.49 48 48V448zM432 448h-160v-48c0-26.51 21.49-48 48-48h64c26.51 0 48 21.49 48 48V448z\"]\n};\nvar faEllipsis = {\n  prefix: 'fas',\n  iconName: 'ellipsis',\n  icon: [448, 512, [\"ellipsis-h\"], \"f141\", \"M120 256C120 286.9 94.93 312 64 312C33.07 312 8 286.9 8 256C8 225.1 33.07 200 64 200C94.93 200 120 225.1 120 256zM280 256C280 286.9 254.9 312 224 312C193.1 312 168 286.9 168 256C168 225.1 193.1 200 224 200C254.9 200 280 225.1 280 256zM328 256C328 225.1 353.1 200 384 200C414.9 200 440 225.1 440 256C440 286.9 414.9 312 384 312C353.1 312 328 286.9 328 256z\"]\n};\nvar faEllipsisH = faEllipsis;\nvar faEllipsisVertical = {\n  prefix: 'fas',\n  iconName: 'ellipsis-vertical',\n  icon: [128, 512, [\"ellipsis-v\"], \"f142\", \"M64 360C94.93 360 120 385.1 120 416C120 446.9 94.93 472 64 472C33.07 472 8 446.9 8 416C8 385.1 33.07 360 64 360zM64 200C94.93 200 120 225.1 120 256C120 286.9 94.93 312 64 312C33.07 312 8 286.9 8 256C8 225.1 33.07 200 64 200zM64 152C33.07 152 8 126.9 8 96C8 65.07 33.07 40 64 40C94.93 40 120 65.07 120 96C120 126.9 94.93 152 64 152z\"]\n};\nvar faEllipsisV = faEllipsisVertical;\nvar faEnvelope = {\n  prefix: 'fas',\n  iconName: 'envelope',\n  icon: [512, 512, [128386, 61443, 9993], \"f0e0\", \"M464 64C490.5 64 512 85.49 512 112C512 127.1 504.9 141.3 492.8 150.4L275.2 313.6C263.8 322.1 248.2 322.1 236.8 313.6L19.2 150.4C7.113 141.3 0 127.1 0 112C0 85.49 21.49 64 48 64H464zM217.6 339.2C240.4 356.3 271.6 356.3 294.4 339.2L512 176V384C512 419.3 483.3 448 448 448H64C28.65 448 0 419.3 0 384V176L217.6 339.2z\"]\n};\nvar faEnvelopeCircleCheck = {\n  prefix: 'fas',\n  iconName: 'envelope-circle-check',\n  icon: [640, 512, [], \"e4e8\", \"M464 64C490.5 64 512 85.49 512 112C512 127.1 504.9 141.3 492.8 150.4L478.9 160.8C412.3 167.2 356.5 210.8 332.6 270.6L275.2 313.6C263.8 322.1 248.2 322.1 236.8 313.6L19.2 150.4C7.113 141.3 0 127.1 0 112C0 85.49 21.49 64 48 64H464zM294.4 339.2L320.8 319.4C320.3 324.9 320 330.4 320 336C320 378.5 335.1 417.6 360.2 448H64C28.65 448 0 419.3 0 384V176L217.6 339.2C240.4 356.3 271.6 356.3 294.4 339.2zM640 336C640 415.5 575.5 480 496 480C416.5 480 352 415.5 352 336C352 256.5 416.5 192 496 192C575.5 192 640 256.5 640 336zM540.7 292.7L480 353.4L451.3 324.7C445.1 318.4 434.9 318.4 428.7 324.7C422.4 330.9 422.4 341.1 428.7 347.3L468.7 387.3C474.9 393.6 485.1 393.6 491.3 387.3L563.3 315.3C569.6 309.1 569.6 298.9 563.3 292.7C557.1 286.4 546.9 286.4 540.7 292.7H540.7z\"]\n};\nvar faEnvelopeOpen = {\n  prefix: 'fas',\n  iconName: 'envelope-open',\n  icon: [512, 512, [62135], \"f2b6\", \"M493.6 163c-24.88-19.62-45.5-35.37-164.3-121.6C312.7 29.21 279.7 0 256.4 0H255.6C232.3 0 199.3 29.21 182.6 41.38c-118.8 86.25-139.4 101.1-164.3 121.6C6.75 172 0 186 0 200.8v263.2C0 490.5 21.49 512 48 512h416c26.51 0 48-21.49 48-47.1V200.8C512 186 505.3 172 493.6 163zM303.2 367.5C289.1 378.5 272.5 384 256 384s-33.06-5.484-47.16-16.47L64 254.9V208.5c21.16-16.59 46.48-35.66 156.4-115.5c3.18-2.328 6.891-5.187 10.98-8.353C236.9 80.44 247.8 71.97 256 66.84c8.207 5.131 19.14 13.6 24.61 17.84c4.09 3.166 7.801 6.027 11.15 8.478C400.9 172.5 426.6 191.7 448 208.5v46.32L303.2 367.5z\"]\n};\nvar faEnvelopeOpenText = {\n  prefix: 'fas',\n  iconName: 'envelope-open-text',\n  icon: [512, 512, [], \"f658\", \"M256 417.1c-16.38 0-32.88-4.1-46.88-15.12L0 250.9v213.1C0 490.5 21.5 512 48 512h416c26.5 0 48-21.5 48-47.1V250.9l-209.1 151.1C288.9 412 272.4 417.1 256 417.1zM493.6 163C484.8 156 476.4 149.5 464 140.1v-44.12c0-26.5-21.5-48-48-48l-77.5 .0016c-3.125-2.25-5.875-4.25-9.125-6.5C312.6 29.13 279.3-.3732 256 .0018C232.8-.3732 199.4 29.13 182.6 41.5c-3.25 2.25-6 4.25-9.125 6.5L96 48c-26.5 0-48 21.5-48 48v44.12C35.63 149.5 27.25 156 18.38 163C6.75 172 0 186 0 200.8v10.62l96 69.37V96h320v184.7l96-69.37V200.8C512 186 505.3 172 493.6 163zM176 255.1h160c8.836 0 16-7.164 16-15.1c0-8.838-7.164-16-16-16h-160c-8.836 0-16 7.162-16 16C160 248.8 167.2 255.1 176 255.1zM176 191.1h160c8.836 0 16-7.164 16-16c0-8.838-7.164-15.1-16-15.1h-160c-8.836 0-16 7.162-16 15.1C160 184.8 167.2 191.1 176 191.1z\"]\n};\nvar faEnvelopesBulk = {\n  prefix: 'fas',\n  iconName: 'envelopes-bulk',\n  icon: [640, 512, [\"mail-bulk\"], \"f674\", \"M191.9 448.6c-9.766 0-19.48-2.969-27.78-8.891L32 340.2V480c0 17.62 14.38 32 32 32h256c17.62 0 32-14.38 32-32v-139.8L220.2 439.5C211.7 445.6 201.8 448.6 191.9 448.6zM192 192c0-35.25 28.75-64 64-64h224V32c0-17.62-14.38-32-32-32H128C110.4 0 96 14.38 96 32v192h96V192zM320 256H64C46.38 256 32 270.4 32 288v12.18l151 113.8c5.25 3.719 12.7 3.734 18.27-.25L352 300.2V288C352 270.4 337.6 256 320 256zM576 160H256C238.4 160 224 174.4 224 192v32h96c33.25 0 60.63 25.38 63.75 57.88L384 416h192c17.62 0 32-14.38 32-32V192C608 174.4 593.6 160 576 160zM544 288h-64V224h64V288z\"]\n};\nvar faMailBulk = faEnvelopesBulk;\nvar faEquals = {\n  prefix: 'fas',\n  iconName: 'equals',\n  icon: [448, 512, [62764], \"3d\", \"M48 192h352c17.69 0 32-14.32 32-32s-14.31-31.1-32-31.1h-352c-17.69 0-32 14.31-32 31.1S30.31 192 48 192zM400 320h-352c-17.69 0-32 14.31-32 31.1s14.31 32 32 32h352c17.69 0 32-14.32 32-32S417.7 320 400 320z\"]\n};\nvar faEraser = {\n  prefix: 'fas',\n  iconName: 'eraser',\n  icon: [512, 512, [], \"f12d\", \"M480 416C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H150.6C133.7 480 117.4 473.3 105.4 461.3L25.37 381.3C.3786 356.3 .3786 315.7 25.37 290.7L258.7 57.37C283.7 32.38 324.3 32.38 349.3 57.37L486.6 194.7C511.6 219.7 511.6 260.3 486.6 285.3L355.9 416H480zM265.4 416L332.7 348.7L195.3 211.3L70.63 336L150.6 416L265.4 416z\"]\n};\nvar faEthernet = {\n  prefix: 'fas',\n  iconName: 'ethernet',\n  icon: [512, 512, [], \"f796\", \"M512 208v224c0 8.75-7.25 16-16 16H416v-128h-32v128h-64v-128h-32v128H224v-128H192v128H128v-128H96v128H16C7.25 448 0 440.8 0 432v-224C0 199.2 7.25 192 16 192H64V144C64 135.2 71.25 128 80 128H128V80C128 71.25 135.2 64 144 64h224C376.8 64 384 71.25 384 80V128h48C440.8 128 448 135.2 448 144V192h48C504.8 192 512 199.2 512 208z\"]\n};\nvar faEuroSign = {\n  prefix: 'fas',\n  iconName: 'euro-sign',\n  icon: [384, 512, [8364, \"eur\", \"euro\"], \"f153\", \"M64 240C46.33 240 32 225.7 32 208C32 190.3 46.33 176 64 176H92.29C121.9 92.11 201.1 32 296 32H320C337.7 32 352 46.33 352 64C352 81.67 337.7 96 320 96H296C238.1 96 187.8 128.4 162.1 176H288C305.7 176 320 190.3 320 208C320 225.7 305.7 240 288 240H144.2C144.1 242.6 144 245.3 144 248V264C144 266.7 144.1 269.4 144.2 272H288C305.7 272 320 286.3 320 304C320 321.7 305.7 336 288 336H162.1C187.8 383.6 238.1 416 296 416H320C337.7 416 352 430.3 352 448C352 465.7 337.7 480 320 480H296C201.1 480 121.9 419.9 92.29 336H64C46.33 336 32 321.7 32 304C32 286.3 46.33 272 64 272H80.15C80.05 269.3 80 266.7 80 264V248C80 245.3 80.05 242.7 80.15 240H64z\"]\n};\nvar faEur = faEuroSign;\nvar faEuro = faEuroSign;\nvar faExclamation = {\n  prefix: 'fas',\n  iconName: 'exclamation',\n  icon: [128, 512, [10069, 10071, 61738], \"21\", \"M64 352c17.69 0 32-14.32 32-31.1V64.01c0-17.67-14.31-32.01-32-32.01S32 46.34 32 64.01v255.1C32 337.7 46.31 352 64 352zM64 400c-22.09 0-40 17.91-40 40s17.91 39.1 40 39.1s40-17.9 40-39.1S86.09 400 64 400z\"]\n};\nvar faExpand = {\n  prefix: 'fas',\n  iconName: 'expand',\n  icon: [448, 512, [], \"f065\", \"M128 32H32C14.31 32 0 46.31 0 64v96c0 17.69 14.31 32 32 32s32-14.31 32-32V96h64c17.69 0 32-14.31 32-32S145.7 32 128 32zM416 32h-96c-17.69 0-32 14.31-32 32s14.31 32 32 32h64v64c0 17.69 14.31 32 32 32s32-14.31 32-32V64C448 46.31 433.7 32 416 32zM128 416H64v-64c0-17.69-14.31-32-32-32s-32 14.31-32 32v96c0 17.69 14.31 32 32 32h96c17.69 0 32-14.31 32-32S145.7 416 128 416zM416 320c-17.69 0-32 14.31-32 32v64h-64c-17.69 0-32 14.31-32 32s14.31 32 32 32h96c17.69 0 32-14.31 32-32v-96C448 334.3 433.7 320 416 320z\"]\n};\nvar faExplosion = {\n  prefix: 'fas',\n  iconName: 'explosion',\n  icon: [576, 512, [], \"e4e9\", \"M499.6 11.32C506.3 .5948 520.1-3.127 531.3 2.814C542.4 8.754 547.1 22.32 541.9 33.84L404.8 338.6C406.9 340.9 409 343.3 411.1 345.7L508.2 291.1C518.7 285.2 531.9 287.9 539.1 297.5C546.4 307 545.4 320.5 536.1 328.1L449.9 415.1H378.5C365.4 378.7 329.8 351.1 288 351.1C246.2 351.1 210.6 378.7 197.5 415.1H117.8L42.34 363.7C32.59 356.1 29.23 344.1 34.43 333.5C39.64 322.8 51.84 317.6 63.16 321.1L160.4 351.5C163.3 347.6 166.5 343.8 169.7 340.2L107.4 236.3C101.4 226.3 103.5 213.3 112.5 205.7C121.5 198.1 134.7 198.1 143.6 205.8L246 293.6C247.5 293.2 249 292.8 250.5 292.4L264.1 149.7C265.3 137.4 275.6 127.1 288 127.1C300.4 127.1 310.7 137.4 311.9 149.7L325.4 291.6L499.6 11.32zM544 447.1C561.7 447.1 576 462.3 576 479.1C576 497.7 561.7 511.1 544 511.1H32C14.33 511.1 0 497.7 0 479.1C0 462.3 14.33 447.1 32 447.1H544zM288-.0046C301.3-.0046 312 10.74 312 23.1V71.1C312 85.25 301.3 95.1 288 95.1C274.7 95.1 264 85.25 264 71.1V23.1C264 10.74 274.7-.0046 288-.0046V-.0046z\"]\n};\nvar faEye = {\n  prefix: 'fas',\n  iconName: 'eye',\n  icon: [576, 512, [128065], \"f06e\", \"M279.6 160.4C282.4 160.1 285.2 160 288 160C341 160 384 202.1 384 256C384 309 341 352 288 352C234.1 352 192 309 192 256C192 253.2 192.1 250.4 192.4 247.6C201.7 252.1 212.5 256 224 256C259.3 256 288 227.3 288 192C288 180.5 284.1 169.7 279.6 160.4zM480.6 112.6C527.4 156 558.7 207.1 573.5 243.7C576.8 251.6 576.8 260.4 573.5 268.3C558.7 304 527.4 355.1 480.6 399.4C433.5 443.2 368.8 480 288 480C207.2 480 142.5 443.2 95.42 399.4C48.62 355.1 17.34 304 2.461 268.3C-.8205 260.4-.8205 251.6 2.461 243.7C17.34 207.1 48.62 156 95.42 112.6C142.5 68.84 207.2 32 288 32C368.8 32 433.5 68.84 480.6 112.6V112.6zM288 112C208.5 112 144 176.5 144 256C144 335.5 208.5 400 288 400C367.5 400 432 335.5 432 256C432 176.5 367.5 112 288 112z\"]\n};\nvar faEyeDropper = {\n  prefix: 'fas',\n  iconName: 'eye-dropper',\n  icon: [512, 512, [\"eye-dropper-empty\", \"eyedropper\"], \"f1fb\", \"M482.8 29.23C521.7 68.21 521.7 131.4 482.8 170.4L381.2 271.9L390.6 281.4C403.1 293.9 403.1 314.1 390.6 326.6C378.1 339.1 357.9 339.1 345.4 326.6L185.4 166.6C172.9 154.1 172.9 133.9 185.4 121.4C197.9 108.9 218.1 108.9 230.6 121.4L240.1 130.8L341.6 29.23C380.6-9.744 443.8-9.744 482.8 29.23L482.8 29.23zM55.43 323.3L176.1 202.6L221.4 247.9L100.7 368.6C97.69 371.6 96 375.6 96 379.9V416H132.1C136.4 416 140.4 414.3 143.4 411.3L264.1 290.6L309.4 335.9L188.7 456.6C173.7 471.6 153.3 480 132.1 480H89.69L49.75 506.6C37.06 515.1 20.16 513.4 9.373 502.6C-1.413 491.8-3.086 474.9 5.375 462.2L32 422.3V379.9C32 358.7 40.43 338.3 55.43 323.3L55.43 323.3z\"]\n};\nvar faEyeDropperEmpty = faEyeDropper;\nvar faEyedropper = faEyeDropper;\nvar faEyeLowVision = {\n  prefix: 'fas',\n  iconName: 'eye-low-vision',\n  icon: [640, 512, [\"low-vision\"], \"f2a8\", \"M150.7 92.77C195 58.27 251.8 32 320 32C400.8 32 465.5 68.84 512.6 112.6C559.4 156 590.7 207.1 605.5 243.7C608.8 251.6 608.8 260.4 605.5 268.3C592.1 300.6 565.2 346.1 525.6 386.7L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L150.7 92.77zM223.1 149.5L313.4 220.3C317.6 211.8 320 202.2 320 191.1C320 180.5 316.1 169.7 311.6 160.4C314.4 160.1 317.2 159.1 320 159.1C373 159.1 416 202.1 416 255.1C416 269.7 413.1 282.7 407.1 294.5L446.6 324.7C457.7 304.3 464 280.9 464 255.1C464 176.5 399.5 111.1 320 111.1C282.7 111.1 248.6 126.2 223.1 149.5zM393.6 469.4L54.65 203.7C62.6 190.1 72.08 175.8 83.09 161.5L446.2 447.5C429.8 456.4 412.3 463.8 393.6 469.4V469.4zM34.46 268.3C31.74 261.8 31.27 254.5 33.08 247.8L329.2 479.8C326.1 479.9 323.1 480 320 480C239.2 480 174.5 443.2 127.4 399.4C80.62 355.1 49.34 304 34.46 268.3H34.46z\"]\n};\nvar faLowVision = faEyeLowVision;\nvar faEyeSlash = {\n  prefix: 'fas',\n  iconName: 'eye-slash',\n  icon: [640, 512, [], \"f070\", \"M150.7 92.77C195 58.27 251.8 32 320 32C400.8 32 465.5 68.84 512.6 112.6C559.4 156 590.7 207.1 605.5 243.7C608.8 251.6 608.8 260.4 605.5 268.3C592.1 300.6 565.2 346.1 525.6 386.7L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L150.7 92.77zM223.1 149.5L313.4 220.3C317.6 211.8 320 202.2 320 191.1C320 180.5 316.1 169.7 311.6 160.4C314.4 160.1 317.2 159.1 320 159.1C373 159.1 416 202.1 416 255.1C416 269.7 413.1 282.7 407.1 294.5L446.6 324.7C457.7 304.3 464 280.9 464 255.1C464 176.5 399.5 111.1 320 111.1C282.7 111.1 248.6 126.2 223.1 149.5zM320 480C239.2 480 174.5 443.2 127.4 399.4C80.62 355.1 49.34 304 34.46 268.3C31.18 260.4 31.18 251.6 34.46 243.7C44 220.8 60.29 191.2 83.09 161.5L177.4 235.8C176.5 242.4 176 249.1 176 255.1C176 335.5 240.5 400 320 400C338.7 400 356.6 396.4 373 389.9L446.2 447.5C409.9 467.1 367.8 480 320 480H320z\"]\n};\nvar faF = {\n  prefix: 'fas',\n  iconName: 'f',\n  icon: [320, 512, [102], \"46\", \"M320 64.01c0 17.67-14.33 32-32 32H64v128h160c17.67 0 32 14.32 32 31.1s-14.33 32-32 32H64v160c0 17.67-14.33 32-32 32s-32-14.33-32-32v-384C0 46.34 14.33 32.01 32 32.01h256C305.7 32.01 320 46.34 320 64.01z\"]\n};\nvar faFaceAngry = {\n  prefix: 'fas',\n  iconName: 'face-angry',\n  icon: [512, 512, [128544, \"angry\"], \"f556\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM339.9 373.3C323.8 355.4 295.7 336 256 336C216.3 336 188.2 355.4 172.1 373.3C166.2 379.9 166.7 389.1 173.3 395.9C179.9 401.8 189.1 401.3 195.9 394.7C207.6 381.7 227.5 368 255.1 368C284.5 368 304.4 381.7 316.1 394.7C322 401.3 332.1 401.8 338.7 395.9C345.3 389.1 345.8 379.9 339.9 373.3H339.9zM176.4 272C194 272 208.4 257.7 208.4 240C208.4 238.5 208.3 237 208.1 235.6L218.9 239.2C227.3 241.1 236.4 237.4 239.2 229.1C241.1 220.7 237.4 211.6 229.1 208.8L133.1 176.8C124.7 174 115.6 178.6 112.8 186.9C110 195.3 114.6 204.4 122.9 207.2L153.7 217.4C147.9 223.2 144.4 231.2 144.4 240C144.4 257.7 158.7 272 176.4 272zM358.9 217.2L389.1 207.2C397.4 204.4 401.1 195.3 399.2 186.9C396.4 178.6 387.3 174 378.9 176.8L282.9 208.8C274.6 211.6 270 220.7 272.8 229.1C275.6 237.4 284.7 241.1 293.1 239.2L304.7 235.3C304.5 236.8 304.4 238.4 304.4 240C304.4 257.7 318.7 272 336.4 272C354 272 368.4 257.7 368.4 240C368.4 231.1 364.7 223 358.9 217.2H358.9z\"]\n};\nvar faAngry = faFaceAngry;\nvar faFaceDizzy = {\n  prefix: 'fas',\n  iconName: 'face-dizzy',\n  icon: [512, 512, [\"dizzy\"], \"f567\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 416C291.3 416 320 387.3 320 352C320 316.7 291.3 288 256 288C220.7 288 192 316.7 192 352C192 387.3 220.7 416 256 416zM100.7 155.3L137.4 192L100.7 228.7C94.44 234.9 94.44 245.1 100.7 251.3C106.9 257.6 117.1 257.6 123.3 251.3L160 214.6L196.7 251.3C202.9 257.6 213.1 257.6 219.3 251.3C225.6 245.1 225.6 234.9 219.3 228.7L182.6 192L219.3 155.3C225.6 149.1 225.6 138.9 219.3 132.7C213.1 126.4 202.9 126.4 196.7 132.7L160 169.4L123.3 132.7C117.1 126.4 106.9 126.4 100.7 132.7C94.44 138.9 94.44 149.1 100.7 155.3zM292.7 155.3L329.4 192L292.7 228.7C286.4 234.9 286.4 245.1 292.7 251.3C298.9 257.6 309.1 257.6 315.3 251.3L352 214.6L388.7 251.3C394.9 257.6 405.1 257.6 411.3 251.3C417.6 245.1 417.6 234.9 411.3 228.7L374.6 192L411.3 155.3C417.6 149.1 417.6 138.9 411.3 132.7C405.1 126.4 394.9 126.4 388.7 132.7L352 169.4L315.3 132.7C309.1 126.4 298.9 126.4 292.7 132.7C286.4 138.9 286.4 149.1 292.7 155.3z\"]\n};\nvar faDizzy = faFaceDizzy;\nvar faFaceFlushed = {\n  prefix: 'fas',\n  iconName: 'face-flushed',\n  icon: [512, 512, [128563, \"flushed\"], \"f579\", \"M184 224C184 237.3 173.3 248 160 248C146.7 248 136 237.3 136 224C136 210.7 146.7 200 160 200C173.3 200 184 210.7 184 224zM376 224C376 237.3 365.3 248 352 248C338.7 248 328 237.3 328 224C328 210.7 338.7 200 352 200C365.3 200 376 210.7 376 224zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM192 400H320C328.8 400 336 392.8 336 384C336 375.2 328.8 368 320 368H192C183.2 368 176 375.2 176 384C176 392.8 183.2 400 192 400zM160 296C199.8 296 232 263.8 232 224C232 184.2 199.8 152 160 152C120.2 152 88 184.2 88 224C88 263.8 120.2 296 160 296zM352 152C312.2 152 280 184.2 280 224C280 263.8 312.2 296 352 296C391.8 296 424 263.8 424 224C424 184.2 391.8 152 352 152z\"]\n};\nvar faFlushed = faFaceFlushed;\nvar faFaceFrown = {\n  prefix: 'fas',\n  iconName: 'face-frown',\n  icon: [512, 512, [9785, \"frown\"], \"f119\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM159.3 388.7C171.5 349.4 209.9 320 256 320C302.1 320 340.5 349.4 352.7 388.7C355.3 397.2 364.3 401.9 372.7 399.3C381.2 396.7 385.9 387.7 383.3 379.3C366.8 326.1 315.8 287.1 256 287.1C196.3 287.1 145.2 326.1 128.7 379.3C126.1 387.7 130.8 396.7 139.3 399.3C147.7 401.9 156.7 397.2 159.3 388.7H159.3zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240z\"]\n};\nvar faFrown = faFaceFrown;\nvar faFaceFrownOpen = {\n  prefix: 'fas',\n  iconName: 'face-frown-open',\n  icon: [512, 512, [128550, \"frown-open\"], \"f57a\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240zM336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176zM259.9 369.4C288.8 369.4 316.2 375.2 340.6 385.5C352.9 390.7 366.7 381.3 361.4 369.1C344.8 330.9 305.6 303.1 259.9 303.1C214.3 303.1 175.1 330.8 158.4 369.1C153.1 381.3 166.1 390.6 179.3 385.4C203.7 375.1 231 369.4 259.9 369.4L259.9 369.4z\"]\n};\nvar faFrownOpen = faFaceFrownOpen;\nvar faFaceGrimace = {\n  prefix: 'fas',\n  iconName: 'face-grimace',\n  icon: [512, 512, [128556, \"grimace\"], \"f57f\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM399.3 360H344V400H352C375.8 400 395.5 382.7 399.3 360zM352 304H344V344H399.3C395.5 321.3 375.8 304 352 304zM328 344V304H264V344H328zM328 400V360H264V400H328zM184 304V344H248V304H184zM184 360V400H248V360H184zM168 344V304H160C136.2 304 116.5 321.3 112.7 344H168zM168 400V360H112.7C116.5 382.7 136.2 400 160 400H168zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240z\"]\n};\nvar faGrimace = faFaceGrimace;\nvar faFaceGrin = {\n  prefix: 'fas',\n  iconName: 'face-grin',\n  icon: [512, 512, [128512, \"grin\"], \"f580\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240z\"]\n};\nvar faGrin = faFaceGrin;\nvar faFaceGrinBeam = {\n  prefix: 'fas',\n  iconName: 'face-grin-beam',\n  icon: [512, 512, [128516, \"grin-beam\"], \"f582\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM226.5 231.6C229.8 230.5 232 227.4 232 224C232 206.1 225.3 188.4 215.4 175.2C205.6 162.2 191.5 152 176 152C160.5 152 146.4 162.2 136.6 175.2C126.7 188.4 120 206.1 120 224C120 227.4 122.2 230.5 125.5 231.6C128.7 232.7 132.3 231.6 134.4 228.8L134.4 228.8L134.6 228.5C134.8 228.3 134.1 228 135.3 227.6C135.1 226.8 136.9 225.7 138.1 224.3C140.6 221.4 144.1 217.7 148.3 213.1C157.1 206.2 167.2 200 176 200C184.8 200 194.9 206.2 203.7 213.1C207.9 217.7 211.4 221.4 213.9 224.3C215.1 225.7 216 226.8 216.7 227.6C217 228 217.2 228.3 217.4 228.5L217.6 228.8L217.6 228.8C219.7 231.6 223.3 232.7 226.5 231.6V231.6zM377.6 228.8C379.7 231.6 383.3 232.7 386.5 231.6C389.8 230.5 392 227.4 392 224C392 206.1 385.3 188.4 375.4 175.2C365.6 162.2 351.5 152 336 152C320.5 152 306.4 162.2 296.6 175.2C286.7 188.4 280 206.1 280 224C280 227.4 282.2 230.5 285.5 231.6C288.7 232.7 292.3 231.6 294.4 228.8L294.4 228.8L294.6 228.5C294.8 228.3 294.1 228 295.3 227.6C295.1 226.8 296.9 225.7 298.1 224.3C300.6 221.4 304.1 217.7 308.3 213.1C317.1 206.2 327.2 200 336 200C344.8 200 354.9 206.2 363.7 213.1C367.9 217.7 371.4 221.4 373.9 224.3C375.1 225.7 376 226.8 376.7 227.6C377 228 377.2 228.3 377.4 228.5L377.6 228.8L377.6 228.8z\"]\n};\nvar faGrinBeam = faFaceGrinBeam;\nvar faFaceGrinBeamSweat = {\n  prefix: 'fas',\n  iconName: 'face-grin-beam-sweat',\n  icon: [512, 512, [128517, \"grin-beam-sweat\"], \"f583\", \"M464 128C437.5 128 416 107 416 81.01C416 76.01 417.8 69.74 420.6 62.87C420.9 62.17 421.2 61.46 421.6 60.74C430.5 40.51 448.1 15.86 457.6 3.282C460.8-1.093 467.2-1.094 470.4 3.281C483.4 20.65 512 61.02 512 81.01C512 102.7 497.1 120.8 476.8 126.3C472.7 127.4 468.4 128 464 128L464 128zM256 .0003C307.4 .0003 355.3 15.15 395.4 41.23C393.9 44.32 392.4 47.43 391.1 50.53C387.8 58.57 384 69.57 384 81.01C384 125.4 420.6 160 464 160C473.6 160 482.8 158.3 491.4 155.2C504.7 186.1 512 220.2 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0V.0003zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM226.5 231.6C229.8 230.5 232 227.4 232 224C232 206.1 225.3 188.4 215.4 175.2C205.6 162.2 191.5 152 176 152C160.5 152 146.4 162.2 136.6 175.2C126.7 188.4 120 206.1 120 224C120 227.4 122.2 230.5 125.5 231.6C128.7 232.7 132.3 231.6 134.4 228.8L134.4 228.8L134.6 228.5C134.8 228.3 134.1 228 135.3 227.6C135.1 226.8 136.9 225.7 138.1 224.3C140.6 221.4 144.1 217.7 148.3 213.1C157.1 206.2 167.2 200 176 200C184.8 200 194.9 206.2 203.7 213.1C207.9 217.7 211.4 221.4 213.9 224.3C215.1 225.7 216 226.8 216.7 227.6C217 228 217.2 228.3 217.4 228.5L217.6 228.8L217.6 228.8C219.7 231.6 223.3 232.7 226.5 231.6V231.6zM377.6 228.8C379.7 231.6 383.3 232.7 386.5 231.6C389.8 230.5 392 227.4 392 224C392 206.1 385.3 188.4 375.4 175.2C365.6 162.2 351.5 152 336 152C320.5 152 306.4 162.2 296.6 175.2C286.7 188.4 280 206.1 280 224C280 227.4 282.2 230.5 285.5 231.6C288.7 232.7 292.3 231.6 294.4 228.8L294.4 228.8L294.6 228.5C294.8 228.3 294.1 228 295.3 227.6C295.1 226.8 296.9 225.7 298.1 224.3C300.6 221.4 304.1 217.7 308.3 213.1C317.1 206.2 327.2 200 336 200C344.8 200 354.9 206.2 363.7 213.1C367.9 217.7 371.4 221.4 373.9 224.3C375.1 225.7 376 226.8 376.7 227.6C377 228 377.2 228.3 377.4 228.5L377.6 228.8L377.6 228.8z\"]\n};\nvar faGrinBeamSweat = faFaceGrinBeamSweat;\nvar faFaceGrinHearts = {\n  prefix: 'fas',\n  iconName: 'face-grin-hearts',\n  icon: [512, 512, [128525, \"grin-hearts\"], \"f584\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM199.3 129.1C181.5 124.4 163.2 134.9 158.4 152.7L154.1 168.8L137.1 164.5C120.2 159.7 101.9 170.3 97.14 188.1C92.38 205.8 102.9 224.1 120.7 228.9L185.8 246.3C194.4 248.6 203.1 243.6 205.4 235L222.9 169.1C227.6 152.2 217.1 133.9 199.3 129.1H199.3zM353.6 152.7C348.8 134.9 330.5 124.4 312.7 129.1C294.9 133.9 284.4 152.2 289.1 169.1L306.6 235C308.9 243.6 317.6 248.6 326.2 246.3L391.3 228.9C409.1 224.1 419.6 205.8 414.9 188.1C410.1 170.3 391.8 159.7 374 164.5L357.9 168.8L353.6 152.7z\"]\n};\nvar faGrinHearts = faFaceGrinHearts;\nvar faFaceGrinSquint = {\n  prefix: 'fas',\n  iconName: 'face-grin-squint',\n  icon: [512, 512, [128518, \"grin-squint\"], \"f585\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM133.5 146.7C125.6 142.4 116 148.2 116 157.1C116 159.9 116.1 162.6 118.8 164.8L154.8 208L118.8 251.2C116.1 253.4 116 256.1 116 258.9C116 267.8 125.6 273.6 133.5 269.3L223.4 221.4C234.1 215.7 234.1 200.3 223.4 194.6L133.5 146.7zM396 157.1C396 148.2 386.4 142.4 378.5 146.7L288.6 194.6C277.9 200.3 277.9 215.7 288.6 221.4L378.5 269.3C386.4 273.6 396 267.8 396 258.9C396 256.1 395 253.4 393.2 251.2L357.2 208L393.2 164.8C395 162.6 396 159.9 396 157.1V157.1z\"]\n};\nvar faGrinSquint = faFaceGrinSquint;\nvar faFaceGrinSquintTears = {\n  prefix: 'fas',\n  iconName: 'face-grin-squint-tears',\n  icon: [512, 512, [129315, \"grin-squint-tears\"], \"f586\", \"M426.8 14.18C446-5.046 477.5-4.645 497.1 14.92C516.6 34.49 517 65.95 497.8 85.18C490.1 92.02 476.4 97.59 460.5 101.9C444.1 106.3 426.4 109.4 414.1 111.2C412.5 111.5 410.1 111.7 409.6 111.9C403.1 112.8 399.2 108 400.1 102.4C401.7 91.19 404.7 72.82 409.1 55.42C409.4 54.12 409.8 52.84 410.1 51.56C414.4 35.62 419.1 21.02 426.8 14.18L426.8 14.18zM382.2 33.17C380.6 37.96 379.3 42.81 378.1 47.52C373.3 66.46 370.1 86.05 368.4 97.79C364.5 124.6 387.4 147.5 414.1 143.6C426 141.9 445.6 138.8 464.5 133.9C469.2 132.7 474.1 131.4 478.8 129.9C534.2 227.5 520.2 353.8 437 437C353.8 520.3 227.5 534.2 129.8 478.8C131.3 474 132.7 469.2 133.9 464.5C138.7 445.5 141.9 425.1 143.6 414.2C147.5 387.4 124.6 364.5 97.89 368.4C85.97 370.1 66.39 373.2 47.46 378.1C42.76 379.3 37.93 380.6 33.15 382.1C-22.19 284.5-8.245 158.2 74.98 74.98C158.2-8.253 284.5-22.19 382.2 33.17V33.17zM416.4 202.3C411.6 190.4 395.6 191.4 389.6 202.7C370.1 239.4 343.3 275.9 309.8 309.4C276.3 342.9 239.8 369.7 203.1 389.2C191.8 395.2 190.8 411.2 202.7 416C262.1 440.2 332.6 428.3 380.7 380.3C428.7 332.2 440.6 261.7 416.4 202.3H416.4zM94.43 288.5L150.5 293.6L155.6 349.7C155.8 352.5 157.1 355 159 357C165.4 363.4 176.2 360.7 178.8 352.1L208.5 254.6C211.1 242.1 201.1 232.1 189.5 235.7L92.05 265.3C83.46 267.9 80.76 278.7 87.1 285.1C89.07 287.1 91.66 288.3 94.43 288.5V288.5zM235.7 189.5C232.1 201.1 242.1 211.1 254.6 208.5L352.1 178.8C360.7 176.2 363.4 165.4 357 159C355 157.1 352.5 155.8 349.7 155.6L293.6 150.5L288.5 94.43C288.3 91.66 287.1 89.07 285.1 87.1C278.7 80.76 267.9 83.46 265.3 92.05L235.7 189.5zM51.53 410.1C70.01 405.1 90.3 401.8 102.4 400.1C108 399.2 112.8 403.1 111.9 409.6C110.2 421.7 106.9 441.9 101.9 460.4C97.57 476.4 92.02 490.1 85.18 497.8C65.95 517 34.49 516.6 14.92 497.1C-4.645 477.5-5.046 446 14.18 426.8C21.02 419.1 35.6 414.4 51.53 410.1V410.1z\"]\n};\nvar faGrinSquintTears = faFaceGrinSquintTears;\nvar faFaceGrinStars = {\n  prefix: 'fas',\n  iconName: 'face-grin-stars',\n  icon: [512, 512, [129321, \"grin-stars\"], \"f587\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5H407.4zM152.8 124.6L136.2 159.3L98.09 164.3C95.03 164.7 92.48 166.8 91.52 169.8C90.57 172.7 91.39 175.9 93.62 178L121.5 204.5L114.5 242.3C113.1 245.4 115.2 248.4 117.7 250.2C120.2 252.1 123.5 252.3 126.2 250.8L159.1 232.5L193.8 250.8C196.5 252.3 199.8 252.1 202.3 250.2C204.8 248.4 206 245.4 205.5 242.3L198.5 204.5L226.4 178C228.6 175.9 229.4 172.7 228.5 169.8C227.5 166.8 224.1 164.7 221.9 164.3L183.8 159.3L167.2 124.6C165.9 121.8 163.1 120 159.1 120C156.9 120 154.1 121.8 152.8 124.6V124.6zM344.8 124.6L328.2 159.3L290.1 164.3C287 164.7 284.5 166.8 283.5 169.8C282.6 172.7 283.4 175.9 285.6 178L313.5 204.5L306.5 242.3C305.1 245.4 307.2 248.4 309.7 250.2C312.2 252.1 315.5 252.3 318.2 250.8L352 232.5L385.8 250.8C388.5 252.3 391.8 252.1 394.3 250.2C396.8 248.4 398 245.4 397.5 242.3L390.5 204.5L418.4 178C420.6 175.9 421.4 172.7 420.5 169.8C419.5 166.8 416.1 164.7 413.9 164.3L375.8 159.3L359.2 124.6C357.9 121.8 355.1 120 352 120C348.9 120 346.1 121.8 344.8 124.6H344.8z\"]\n};\nvar faGrinStars = faFaceGrinStars;\nvar faFaceGrinTears = {\n  prefix: 'fas',\n  iconName: 'face-grin-tears',\n  icon: [640, 512, [128514, \"grin-tears\"], \"f588\", \"M548.6 371.4C506.4 454.8 419.9 512 319.1 512C220.1 512 133.6 454.8 91.4 371.4C95.87 368.4 100.1 365 104.1 361.1C112.2 352.1 117.3 342.5 120.6 334.4C124.2 325.7 127.1 316 129.4 306.9C134 288.7 137 269.1 138.6 258.7C142.6 232.2 119.9 209.5 93.4 213.3C86.59 214.3 77.18 215.7 66.84 217.7C85.31 94.5 191.6 0 319.1 0C448.4 0 554.7 94.5 573.2 217.7C562.8 215.7 553.4 214.3 546.6 213.3C520.1 209.5 497.4 232.2 501.4 258.7C502.1 269.1 505.1 288.7 510.6 306.9C512.9 316 515.8 325.7 519.4 334.4C522.7 342.5 527.8 352.1 535.9 361.1C539.9 365 544.1 368.4 548.6 371.4V371.4zM471.4 331.5C476.4 319.7 464.4 309 452.1 312.8C412.4 324.9 367.7 331.8 320.3 331.8C272.9 331.8 228.1 324.9 188.5 312.8C176.2 309 164.2 319.7 169.2 331.5C194.1 390.6 252.4 432 320.3 432C388.2 432 446.4 390.6 471.4 331.5H471.4zM281.6 228.8C283.7 231.6 287.3 232.7 290.5 231.6C293.8 230.5 295.1 227.4 295.1 224C295.1 206.1 289.3 188.4 279.4 175.2C269.6 162.2 255.5 152 239.1 152C224.5 152 210.4 162.2 200.6 175.2C190.7 188.4 183.1 206.1 183.1 224C183.1 227.4 186.2 230.5 189.5 231.6C192.7 232.7 196.3 231.6 198.4 228.8L198.4 228.8L198.6 228.5C198.8 228.3 198.1 228 199.3 227.6C199.1 226.8 200.9 225.7 202.1 224.3C204.6 221.4 208.1 217.7 212.3 213.1C221.1 206.2 231.2 200 239.1 200C248.8 200 258.9 206.2 267.7 213.1C271.9 217.7 275.4 221.4 277.9 224.3C279.1 225.7 280 226.8 280.7 227.6C281 228 281.2 228.3 281.4 228.5L281.6 228.8L281.6 228.8zM450.5 231.6C453.8 230.5 456 227.4 456 224C456 206.1 449.3 188.4 439.4 175.2C429.6 162.2 415.5 152 400 152C384.5 152 370.4 162.2 360.6 175.2C350.7 188.4 344 206.1 344 224C344 227.4 346.2 230.5 349.5 231.6C352.7 232.7 356.3 231.6 358.4 228.8L358.4 228.8L358.6 228.5C358.8 228.3 358.1 228 359.3 227.6C359.1 226.8 360.9 225.7 362.1 224.3C364.6 221.4 368.1 217.7 372.3 213.1C381.1 206.2 391.2 200 400 200C408.8 200 418.9 206.2 427.7 213.1C431.9 217.7 435.4 221.4 437.9 224.3C439.1 225.7 440 226.8 440.7 227.6C441 228 441.2 228.3 441.4 228.5L441.6 228.8L441.6 228.8C443.7 231.6 447.3 232.7 450.5 231.6V231.6zM106.1 254.1C103.9 275.6 95.58 324.3 81.43 338.4C80.49 339.4 79.51 340.3 78.5 341.1C59.98 356.7 32.01 355.5 14.27 337.7C-4.442 319-4.825 288.9 13.55 270.6C22.19 261.9 43.69 255.4 64.05 250.1C77.02 248.2 89.53 246.2 97.94 245C103.3 244.2 107.8 248.7 106.1 254.1V254.1zM561.5 341.1C560.7 340.5 559.1 339.8 559.2 339.1C559 338.9 558.8 338.7 558.6 338.4C544.4 324.3 536.1 275.6 533 254.1C532.2 248.7 536.7 244.2 542.1 245C543.1 245.2 544.2 245.3 545.4 245.5C553.6 246.7 564.6 248.5 575.1 250.1C596.3 255.4 617.8 261.9 626.4 270.6C644.8 288.9 644.4 319 625.7 337.7C607.1 355.5 580 356.7 561.5 341.1L561.5 341.1z\"]\n};\nvar faGrinTears = faFaceGrinTears;\nvar faFaceGrinTongue = {\n  prefix: 'fas',\n  iconName: 'face-grin-tongue',\n  icon: [512, 512, [128539, \"grin-tongue\"], \"f589\", \"M256 0C397.4 0 512 114.6 512 256C512 368.9 438.9 464.7 337.5 498.8C346.7 484 352 466.6 352 448V401.1C376.3 383.5 395.6 359.5 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C116.9 359.3 135.1 383.1 160 400.7V448C160 466.6 165.3 484 174.5 498.8C73.07 464.7 0 368.9 0 256C0 114.6 114.6 .0003 256 .0003L256 0zM176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240zM336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176zM256 512C220.7 512 192 483.3 192 448V402.6C192 387.9 203.9 376 218.6 376H220.6C231.9 376 241.7 383.9 244.2 394.9C247 407.5 264.1 407.5 267.8 394.9C270.3 383.9 280.1 376 291.4 376H293.4C308.1 376 320 387.9 320 402.6V448C320 483.3 291.3 512 256 512V512z\"]\n};\nvar faGrinTongue = faFaceGrinTongue;\nvar faFaceGrinTongueSquint = {\n  prefix: 'fas',\n  iconName: 'face-grin-tongue-squint',\n  icon: [512, 512, [128541, \"grin-tongue-squint\"], \"f58a\", \"M256 0C397.4 0 512 114.6 512 256C512 368.9 438.9 464.7 337.5 498.8C346.7 484 352 466.6 352 448V401.1C376.3 383.5 395.6 359.5 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C116.9 359.3 135.1 383.1 160 400.7V448C160 466.6 165.3 484 174.5 498.8C73.07 464.7 0 368.9 0 256C0 114.6 114.6 .0003 256 .0003L256 0zM118.8 148.8L154.8 192L118.8 235.2C116.1 237.4 116 240.1 116 242.9C116 251.8 125.6 257.6 133.5 253.3L223.4 205.4C234.1 199.7 234.1 184.3 223.4 178.6L133.5 130.7C125.6 126.4 116 132.2 116 141.1C116 143.9 116.1 146.6 118.8 148.8V148.8zM288.6 178.6C277.9 184.3 277.9 199.7 288.6 205.4L378.5 253.3C386.4 257.6 396 251.8 396 242.9C396 240.1 395 237.4 393.2 235.2L357.2 192L393.2 148.8C395 146.6 396 143.9 396 141.1C396 132.2 386.4 126.4 378.5 130.7L288.6 178.6zM256 512C220.7 512 192 483.3 192 448V402.6C192 387.9 203.9 376 218.6 376H220.6C231.9 376 241.7 383.9 244.2 394.9C247 407.5 264.1 407.5 267.8 394.9C270.3 383.9 280.1 376 291.4 376H293.4C308.1 376 320 387.9 320 402.6V448C320 483.3 291.3 512 256 512V512z\"]\n};\nvar faGrinTongueSquint = faFaceGrinTongueSquint;\nvar faFaceGrinTongueWink = {\n  prefix: 'fas',\n  iconName: 'face-grin-tongue-wink',\n  icon: [512, 512, [128540, \"grin-tongue-wink\"], \"f58b\", \"M312 208C312 194.7 322.7 184 336 184C349.3 184 360 194.7 360 208C360 221.3 349.3 232 336 232C322.7 232 312 221.3 312 208zM174.5 498.8C73.07 464.7 0 368.9 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 368.9 438.9 464.7 337.5 498.8C346.7 484 352 466.6 352 448V401.1C376.3 383.5 395.6 359.5 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C116.9 359.3 135.1 383.1 159.1 400.7V448C159.1 466.6 165.3 484 174.5 498.8L174.5 498.8zM217.6 236.8C224.7 231.5 226.1 221.5 220.8 214.4C190.4 173.9 129.6 173.9 99.2 214.4C93.9 221.5 95.33 231.5 102.4 236.8C109.5 242.1 119.5 240.7 124.8 233.6C142.4 210.1 177.6 210.1 195.2 233.6C200.5 240.7 210.5 242.1 217.6 236.8zM336 272C371.3 272 400 243.3 400 208C400 172.7 371.3 144 336 144C300.7 144 272 172.7 272 208C272 243.3 300.7 272 336 272zM320 402.6V448C320 483.3 291.3 512 256 512C220.7 512 192 483.3 192 448V402.6C192 387.9 203.9 376 218.6 376H220.6C231.9 376 241.7 383.9 244.2 394.9C247 407.5 264.1 407.5 267.8 394.9C270.3 383.9 280.1 376 291.4 376H293.4C308.1 376 320 387.9 320 402.6V402.6z\"]\n};\nvar faGrinTongueWink = faFaceGrinTongueWink;\nvar faFaceGrinWide = {\n  prefix: 'fas',\n  iconName: 'face-grin-wide',\n  icon: [512, 512, [128515, \"grin-alt\"], \"f581\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM176 128C158.3 128 144 156.7 144 192C144 227.3 158.3 256 176 256C193.7 256 208 227.3 208 192C208 156.7 193.7 128 176 128zM336 256C353.7 256 368 227.3 368 192C368 156.7 353.7 128 336 128C318.3 128 304 156.7 304 192C304 227.3 318.3 256 336 256z\"]\n};\nvar faGrinAlt = faFaceGrinWide;\nvar faFaceGrinWink = {\n  prefix: 'fas',\n  iconName: 'face-grin-wink',\n  icon: [512, 512, [\"grin-wink\"], \"f58c\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256.3 331.8C208.9 331.8 164.1 324.9 124.5 312.8C112.2 309 100.2 319.7 105.2 331.5C130.1 390.6 188.4 432 256.3 432C324.2 432 382.4 390.6 407.4 331.5C412.4 319.7 400.4 309 388.1 312.8C348.4 324.9 303.7 331.8 256.3 331.8H256.3zM393.6 236.8C400.7 231.5 402.1 221.5 396.8 214.4C366.4 173.9 305.6 173.9 275.2 214.4C269.9 221.5 271.3 231.5 278.4 236.8C285.5 242.1 295.5 240.7 300.8 233.6C318.4 210.1 353.6 210.1 371.2 233.6C376.5 240.7 386.5 242.1 393.6 236.8zM176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240z\"]\n};\nvar faGrinWink = faFaceGrinWink;\nvar faFaceKiss = {\n  prefix: 'fas',\n  iconName: 'face-kiss',\n  icon: [512, 512, [128535, \"kiss\"], \"f596\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM287.9 300.3C274.7 292.9 257.4 288 240 288C236.4 288 233.2 290.5 232.3 293.1C231.3 297.5 232.9 301.2 236.1 302.1L236.1 302.1L236.3 303.1L236.8 303.4L237.2 303.7C238 304.1 239.2 304.9 240.6 305.8C243.4 307.6 247.2 310.3 250.8 313.4C254.6 316.5 258 319.1 260.5 323.4C262.1 326.1 264 329.8 264 332C264 334.2 262.1 337 260.5 340.6C258 344 254.6 347.5 250.8 350.6C247.2 353.7 243.4 356.4 240.6 358.2C239.2 359.1 238 359.9 237.2 360.3L236.6 360.7L236.3 360.9L236.1 361L236.1 361C233.6 362.4 232 365.1 232 368C232 370.9 233.6 373.6 236.1 374.1L236.1 374.1L236.3 375.1C236.5 375.2 236.8 375.4 237.2 375.7C238 376.1 239.2 376.9 240.6 377.8C243.4 379.6 247.2 382.3 250.8 385.4C254.6 388.5 258 391.9 260.5 395.4C262.1 398.1 264 401.8 264 403.1C264 406.2 262.1 409 260.5 412.6C258 416 254.6 419.5 250.8 422.6C247.2 425.7 243.4 428.4 240.6 430.2C239.2 431.1 238 431.9 237.2 432.3C236.8 432.6 236.5 432.8 236.3 432.9L236.1 432.1L236.1 433C232.9 434.8 231.3 438.5 232.3 442C233.2 445.5 236.4 447.1 240 447.1C257.4 447.1 274.7 443.1 287.9 435.7C294.5 432 300.4 427.5 304.7 422.3C308.9 417.2 312 410.9 312 403.1C312 397.1 308.9 390.8 304.7 385.7C300.4 380.5 294.5 375.1 287.9 372.3C285.2 370.7 282.3 369.3 279.2 367.1C282.3 366.7 285.2 365.3 287.9 363.7C294.5 360 300.4 355.5 304.7 350.3C308.9 345.2 312 338.9 312 331.1C312 325.1 308.9 318.8 304.7 313.7C300.4 308.5 294.5 303.1 287.9 300.3L287.9 300.3zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240z\"]\n};\nvar faKiss = faFaceKiss;\nvar faFaceKissBeam = {\n  prefix: 'fas',\n  iconName: 'face-kiss-beam',\n  icon: [512, 512, [128537, \"kiss-beam\"], \"f597\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM287.9 300.3C274.7 292.9 257.4 288 240 288C236.4 288 233.2 290.5 232.3 293.1C231.3 297.5 232.9 301.2 236.1 302.1L236.1 302.1L236.3 303.1L236.8 303.4L237.2 303.7C238 304.1 239.2 304.9 240.6 305.8C243.4 307.6 247.2 310.3 250.8 313.4C254.6 316.5 258 319.1 260.5 323.4C262.1 326.1 264 329.8 264 332C264 334.2 262.1 337 260.5 340.6C258 344 254.6 347.5 250.8 350.6C247.2 353.7 243.4 356.4 240.6 358.2C239.2 359.1 238 359.9 237.2 360.3L236.6 360.7L236.3 360.9L236.1 361L236.1 361C233.6 362.4 232 365.1 232 368C232 370.9 233.6 373.6 236.1 374.1L236.1 374.1L236.3 375.1C236.5 375.2 236.8 375.4 237.2 375.7C238 376.1 239.2 376.9 240.6 377.8C243.4 379.6 247.2 382.3 250.8 385.4C254.6 388.5 258 391.9 260.5 395.4C262.1 398.1 264 401.8 264 403.1C264 406.2 262.1 409 260.5 412.6C258 416 254.6 419.5 250.8 422.6C247.2 425.7 243.4 428.4 240.6 430.2C239.2 431.1 238 431.9 237.2 432.3C236.8 432.6 236.5 432.8 236.3 432.9L236.1 432.1L236.1 433C232.9 434.8 231.3 438.5 232.3 442C233.2 445.5 236.4 447.1 240 447.1C257.4 447.1 274.7 443.1 287.9 435.7C294.5 432 300.4 427.5 304.7 422.3C308.9 417.2 312 410.9 312 403.1C312 397.1 308.9 390.8 304.7 385.7C300.4 380.5 294.5 375.1 287.9 372.3C285.2 370.7 282.3 369.3 279.2 367.1C282.3 366.7 285.2 365.3 287.9 363.7C294.5 360 300.4 355.5 304.7 350.3C308.9 345.2 312 338.9 312 331.1C312 325.1 308.9 318.8 304.7 313.7C300.4 308.5 294.5 303.1 287.9 300.3L287.9 300.3zM226.5 231.6C229.8 230.5 232 227.4 232 224C232 206.1 225.3 188.4 215.4 175.2C205.6 162.2 191.5 152 176 152C160.5 152 146.4 162.2 136.6 175.2C126.7 188.4 120 206.1 120 224C120 227.4 122.2 230.5 125.5 231.6C128.7 232.7 132.3 231.6 134.4 228.8L134.4 228.8L134.6 228.5C134.8 228.3 134.1 228 135.3 227.6C135.1 226.8 136.9 225.7 138.1 224.3C140.6 221.4 144.1 217.7 148.3 213.1C157.1 206.2 167.2 200 176 200C184.8 200 194.9 206.2 203.7 213.1C207.9 217.7 211.4 221.4 213.9 224.3C215.1 225.7 216 226.8 216.7 227.6C217 228 217.2 228.3 217.4 228.5L217.6 228.8L217.6 228.8C219.7 231.6 223.3 232.7 226.5 231.6V231.6zM377.6 228.8C379.7 231.6 383.3 232.7 386.5 231.6C389.8 230.5 392 227.4 392 224C392 206.1 385.3 188.4 375.4 175.2C365.6 162.2 351.5 152 336 152C320.5 152 306.4 162.2 296.6 175.2C286.7 188.4 280 206.1 280 224C280 227.4 282.2 230.5 285.5 231.6C288.7 232.7 292.3 231.6 294.4 228.8L294.4 228.8L294.6 228.5C294.8 228.3 294.1 228 295.3 227.6C295.1 226.8 296.9 225.7 298.1 224.3C300.6 221.4 304.1 217.7 308.3 213.1C317.1 206.2 327.2 200 336 200C344.8 200 354.9 206.2 363.7 213.1C367.9 217.7 371.4 221.4 373.9 224.3C375.1 225.7 376 226.8 376.7 227.6C377 228 377.2 228.3 377.4 228.5L377.6 228.8L377.6 228.8z\"]\n};\nvar faKissBeam = faFaceKissBeam;\nvar faFaceKissWinkHeart = {\n  prefix: 'fas',\n  iconName: 'face-kiss-wink-heart',\n  icon: [512, 512, [128536, \"kiss-wink-heart\"], \"f598\", \"M461.8 334.6C448.1 300.8 411.5 280.3 374.3 290.7C334.2 301.9 312.4 343.8 322.4 382.8L345.3 472.1C347.3 479.7 350.9 486.4 355.7 491.8C325.1 504.8 291.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 285.3 507.1 313.4 498 339.7C486.9 334.1 474.5 333.1 461.8 334.6L461.8 334.6zM296 332C296 325.1 292.9 318.8 288.7 313.7C284.4 308.5 278.5 303.1 271.9 300.3C258.7 292.9 241.4 288 224 288C220.4 288 217.2 290.5 216.3 293.1C215.3 297.5 216.9 301.2 220.1 302.1L220.1 302.1L220.3 303.1C220.5 303.2 220.8 303.4 221.2 303.7C222 304.1 223.2 304.9 224.6 305.8C227.4 307.6 231.2 310.3 234.8 313.4C238.6 316.5 242 319.1 244.5 323.4C246.1 326.1 248 329.8 248 332C248 334.2 246.1 337 244.5 340.6C242 344 238.6 347.5 234.8 350.6C231.2 353.7 227.4 356.4 224.6 358.2C223.2 359.1 222 359.9 221.2 360.3C220.8 360.6 220.5 360.8 220.3 360.9L220.1 361L220.1 361C217.6 362.4 216 365.1 216 368C216 370.9 217.6 373.6 220.1 374.1L220.1 374.1L220.3 375.1L220.6 375.3L221.2 375.7C222 376.1 223.2 376.9 224.6 377.8C227.4 379.6 231.2 382.3 234.8 385.4C238.6 388.5 242 391.9 244.5 395.4C246.1 398.1 248 401.8 248 404C248 406.2 246.1 409 244.5 412.6C242 416 238.6 419.5 234.8 422.6C231.2 425.7 227.4 428.4 224.6 430.2C223.2 431.1 222 431.9 221.2 432.3C220.8 432.6 220.5 432.8 220.3 432.9L220.1 433L220.1 433C216.9 434.8 215.3 438.5 216.3 442C217.2 445.5 220.4 447.1 224 447.1C241.4 447.1 258.7 443.1 271.9 435.7C278.5 432 284.4 427.5 288.7 422.3C292.9 417.2 296 410.9 296 403.1C296 397.1 292.9 390.8 288.7 385.7C284.4 380.5 278.5 375.1 271.9 372.3C269.2 370.7 266.3 369.3 263.2 367.1C266.3 366.7 269.2 365.3 271.9 363.7C278.5 360 284.4 355.5 288.7 350.3C292.9 345.2 296 338.9 296 331.1V332zM176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240zM393.6 236.8C400.7 231.5 402.1 221.5 396.8 214.4C366.4 173.9 305.6 173.9 275.2 214.4C269.9 221.5 271.3 231.5 278.4 236.8C285.5 242.1 295.5 240.7 300.8 233.6C318.4 210.1 353.6 210.1 371.2 233.6C376.5 240.7 386.5 242.1 393.6 236.8zM439.4 373.3L459.5 367.6C481.7 361.4 504.6 375.2 510.6 398.4C516.5 421.7 503.3 445.6 481.1 451.8L396.1 475.6C387.5 478 378.6 472.9 376.3 464.2L353.4 374.9C347.5 351.6 360.7 327.7 382.9 321.5C405.2 315.3 428 329.1 433.1 352.3L439.4 373.3z\"]\n};\nvar faKissWinkHeart = faFaceKissWinkHeart;\nvar faFaceLaugh = {\n  prefix: 'fas',\n  iconName: 'face-laugh',\n  icon: [512, 512, [\"laugh\"], \"f599\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 432C332.1 432 396.2 382 415.2 314.1C419.1 300.4 407.8 288 393.6 288H118.4C104.2 288 92.92 300.4 96.76 314.1C115.8 382 179.9 432 256 432V432zM176.4 160C158.7 160 144.4 174.3 144.4 192C144.4 209.7 158.7 224 176.4 224C194 224 208.4 209.7 208.4 192C208.4 174.3 194 160 176.4 160zM336.4 224C354 224 368.4 209.7 368.4 192C368.4 174.3 354 160 336.4 160C318.7 160 304.4 174.3 304.4 192C304.4 209.7 318.7 224 336.4 224z\"]\n};\nvar faLaugh = faFaceLaugh;\nvar faFaceLaughBeam = {\n  prefix: 'fas',\n  iconName: 'face-laugh-beam',\n  icon: [512, 512, [128513, \"laugh-beam\"], \"f59a\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 432C332.1 432 396.2 382 415.2 314.1C419.1 300.4 407.8 288 393.6 288H118.4C104.2 288 92.92 300.4 96.76 314.1C115.8 382 179.9 432 256 432V432zM226.5 215.6C229.8 214.5 232 211.4 232 208C232 190.1 225.3 172.4 215.4 159.2C205.6 146.2 191.5 136 176 136C160.5 136 146.4 146.2 136.6 159.2C126.7 172.4 120 190.1 120 208C120 211.4 122.2 214.5 125.5 215.6C128.7 216.7 132.3 215.6 134.4 212.8L134.4 212.8L134.6 212.5C134.8 212.3 134.1 212 135.3 211.6C135.1 210.8 136.9 209.7 138.1 208.3C140.6 205.4 144.1 201.7 148.3 197.1C157.1 190.2 167.2 184 176 184C184.8 184 194.9 190.2 203.7 197.1C207.9 201.7 211.4 205.4 213.9 208.3C215.1 209.7 216 210.8 216.7 211.6C217 212 217.2 212.3 217.4 212.5L217.6 212.8L217.6 212.8C219.7 215.6 223.3 216.7 226.5 215.6V215.6zM377.6 212.8C379.7 215.6 383.3 216.7 386.5 215.6C389.8 214.5 392 211.4 392 208C392 190.1 385.3 172.4 375.4 159.2C365.6 146.2 351.5 136 336 136C320.5 136 306.4 146.2 296.6 159.2C286.7 172.4 280 190.1 280 208C280 211.4 282.2 214.5 285.5 215.6C288.7 216.7 292.3 215.6 294.4 212.8L294.4 212.8L294.6 212.5C294.8 212.3 294.1 212 295.3 211.6C295.1 210.8 296.9 209.7 298.1 208.3C300.6 205.4 304.1 201.7 308.3 197.1C317.1 190.2 327.2 184 336 184C344.8 184 354.9 190.2 363.7 197.1C367.9 201.7 371.4 205.4 373.9 208.3C375.1 209.7 376 210.8 376.7 211.6C377 212 377.2 212.3 377.4 212.5L377.6 212.8L377.6 212.8z\"]\n};\nvar faLaughBeam = faFaceLaughBeam;\nvar faFaceLaughSquint = {\n  prefix: 'fas',\n  iconName: 'face-laugh-squint',\n  icon: [512, 512, [\"laugh-squint\"], \"f59b\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 432C332.1 432 396.2 382 415.2 314.1C419.1 300.4 407.8 288 393.6 288H118.4C104.2 288 92.92 300.4 96.76 314.1C115.8 382 179.9 432 256 432V432zM133.5 114.7C125.6 110.4 116 116.2 116 125.1C116 127.9 116.1 130.6 118.8 132.8L154.8 176L118.8 219.2C116.1 221.4 116 224.1 116 226.9C116 235.8 125.6 241.6 133.5 237.3L223.4 189.4C234.1 183.7 234.1 168.3 223.4 162.6L133.5 114.7zM396 125.1C396 116.2 386.4 110.4 378.5 114.7L288.6 162.6C277.9 168.3 277.9 183.7 288.6 189.4L378.5 237.3C386.4 241.6 396 235.8 396 226.9C396 224.1 395 221.4 393.2 219.2L357.2 176L393.2 132.8C395 130.6 396 127.9 396 125.1V125.1z\"]\n};\nvar faLaughSquint = faFaceLaughSquint;\nvar faFaceLaughWink = {\n  prefix: 'fas',\n  iconName: 'face-laugh-wink',\n  icon: [512, 512, [\"laugh-wink\"], \"f59c\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 432C332.1 432 396.2 382 415.2 314.1C419.1 300.4 407.8 288 393.6 288H118.4C104.2 288 92.92 300.4 96.76 314.1C115.8 382 179.9 432 256 432V432zM176.4 160C158.7 160 144.4 174.3 144.4 192C144.4 209.7 158.7 224 176.4 224C194 224 208.4 209.7 208.4 192C208.4 174.3 194 160 176.4 160zM300.8 217.6C318.4 194.1 353.6 194.1 371.2 217.6C376.5 224.7 386.5 226.1 393.6 220.8C400.7 215.5 402.1 205.5 396.8 198.4C366.4 157.9 305.6 157.9 275.2 198.4C269.9 205.5 271.3 215.5 278.4 220.8C285.5 226.1 295.5 224.7 300.8 217.6z\"]\n};\nvar faLaughWink = faFaceLaughWink;\nvar faFaceMeh = {\n  prefix: 'fas',\n  iconName: 'face-meh',\n  icon: [512, 512, [128528, \"meh\"], \"f11a\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240zM336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176zM160 336C151.2 336 144 343.2 144 352C144 360.8 151.2 368 160 368H352C360.8 368 368 360.8 368 352C368 343.2 360.8 336 352 336H160z\"]\n};\nvar faMeh = faFaceMeh;\nvar faFaceMehBlank = {\n  prefix: 'fas',\n  iconName: 'face-meh-blank',\n  icon: [512, 512, [128566, \"meh-blank\"], \"f5a4\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240z\"]\n};\nvar faMehBlank = faFaceMehBlank;\nvar faFaceRollingEyes = {\n  prefix: 'fas',\n  iconName: 'face-rolling-eyes',\n  icon: [512, 512, [128580, \"meh-rolling-eyes\"], \"f5a5\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM192 368C183.2 368 176 375.2 176 384C176 392.8 183.2 400 192 400H320C328.8 400 336 392.8 336 384C336 375.2 328.8 368 320 368H192zM186.2 165.6C189.8 170.8 192 177.1 192 184C192 201.7 177.7 216 160 216C142.3 216 128 201.7 128 184C128 177.1 130.2 170.8 133.8 165.6C111.5 175.6 96 197.1 96 224C96 259.3 124.7 288 160 288C195.3 288 224 259.3 224 224C224 197.1 208.5 175.6 186.2 165.6zM352 288C387.3 288 416 259.3 416 224C416 197.1 400.5 175.6 378.2 165.6C381.8 170.8 384 177.1 384 184C384 201.7 369.7 216 352 216C334.3 216 320 201.7 320 184C320 177.1 322.2 170.8 325.8 165.6C303.5 175.6 288 197.1 288 224C288 259.3 316.7 288 352 288z\"]\n};\nvar faMehRollingEyes = faFaceRollingEyes;\nvar faFaceSadCry = {\n  prefix: 'fas',\n  iconName: 'face-sad-cry',\n  icon: [512, 512, [128557, \"sad-cry\"], \"f5b3\", \"M352 493.4C322.4 505.4 289.9 512 256 512C222.1 512 189.6 505.4 160 493.4V288C160 279.2 152.8 272 144 272C135.2 272 128 279.2 128 288V477.8C51.48 433.5 0 350.8 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 350.8 460.5 433.5 384 477.8V288C384 279.2 376.8 272 368 272C359.2 272 352 279.2 352 288V493.4zM217.6 236.8C224.7 231.5 226.1 221.5 220.8 214.4C190.4 173.9 129.6 173.9 99.2 214.4C93.9 221.5 95.33 231.5 102.4 236.8C109.5 242.1 119.5 240.7 124.8 233.6C142.4 210.1 177.6 210.1 195.2 233.6C200.5 240.7 210.5 242.1 217.6 236.8zM316.8 233.6C334.4 210.1 369.6 210.1 387.2 233.6C392.5 240.7 402.5 242.1 409.6 236.8C416.7 231.5 418.1 221.5 412.8 214.4C382.4 173.9 321.6 173.9 291.2 214.4C285.9 221.5 287.3 231.5 294.4 236.8C301.5 242.1 311.5 240.7 316.8 233.6zM208 368C208 394.5 229.5 416 256 416C282.5 416 304 394.5 304 368V336C304 309.5 282.5 288 256 288C229.5 288 208 309.5 208 336V368z\"]\n};\nvar faSadCry = faFaceSadCry;\nvar faFaceSadTear = {\n  prefix: 'fas',\n  iconName: 'face-sad-tear',\n  icon: [512, 512, [128546, \"sad-tear\"], \"f5b4\", \"M256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0zM256 352C290.9 352 323.2 367.8 348.3 394.9C354.3 401.4 364.4 401.7 370.9 395.7C377.4 389.7 377.7 379.6 371.7 373.1C341.6 340.5 301 320 256 320C247.2 320 240 327.2 240 336C240 344.8 247.2 352 256 352H256zM208 369C208 349 179.6 308.6 166.4 291.3C163.2 286.9 156.8 286.9 153.6 291.3C140.6 308.6 112 349 112 369C112 395 133.5 416 160 416C186.5 416 208 395 208 369H208zM303.6 208C303.6 225.7 317.1 240 335.6 240C353.3 240 367.6 225.7 367.6 208C367.6 190.3 353.3 176 335.6 176C317.1 176 303.6 190.3 303.6 208zM207.6 208C207.6 190.3 193.3 176 175.6 176C157.1 176 143.6 190.3 143.6 208C143.6 225.7 157.1 240 175.6 240C193.3 240 207.6 225.7 207.6 208z\"]\n};\nvar faSadTear = faFaceSadTear;\nvar faFaceSmile = {\n  prefix: 'fas',\n  iconName: 'face-smile',\n  icon: [512, 512, [128578, \"smile\"], \"f118\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM164.1 325.5C158.3 318.8 148.2 318.1 141.5 323.9C134.8 329.7 134.1 339.8 139.9 346.5C162.1 372.1 200.9 400 255.1 400C311.1 400 349.8 372.1 372.1 346.5C377.9 339.8 377.2 329.7 370.5 323.9C363.8 318.1 353.7 318.8 347.9 325.5C329.9 346.2 299.4 368 255.1 368C212.6 368 182 346.2 164.1 325.5H164.1zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240z\"]\n};\nvar faSmile = faFaceSmile;\nvar faFaceSmileBeam = {\n  prefix: 'fas',\n  iconName: 'face-smile-beam',\n  icon: [512, 512, [128522, \"smile-beam\"], \"f5b8\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM164.1 325.5C158.3 318.8 148.2 318.1 141.5 323.9C134.8 329.7 134.1 339.8 139.9 346.5C162.1 372.1 200.9 400 255.1 400C311.1 400 349.8 372.1 372.1 346.5C377.9 339.8 377.2 329.7 370.5 323.9C363.8 318.1 353.7 318.8 347.9 325.5C329.9 346.2 299.4 368 255.1 368C212.6 368 182 346.2 164.1 325.5H164.1zM226.5 231.6C229.8 230.5 232 227.4 232 224C232 206.1 225.3 188.4 215.4 175.2C205.6 162.2 191.5 152 176 152C160.5 152 146.4 162.2 136.6 175.2C126.7 188.4 120 206.1 120 224C120 227.4 122.2 230.5 125.5 231.6C128.7 232.7 132.3 231.6 134.4 228.8L134.4 228.8L134.6 228.5C134.8 228.3 134.1 228 135.3 227.6C135.1 226.8 136.9 225.7 138.1 224.3C140.6 221.4 144.1 217.7 148.3 213.1C157.1 206.2 167.2 200 176 200C184.8 200 194.9 206.2 203.7 213.1C207.9 217.7 211.4 221.4 213.9 224.3C215.1 225.7 216 226.8 216.7 227.6C217 228 217.2 228.3 217.4 228.5L217.6 228.8L217.6 228.8C219.7 231.6 223.3 232.7 226.5 231.6V231.6zM377.6 228.8C379.7 231.6 383.3 232.7 386.5 231.6C389.8 230.5 392 227.4 392 224C392 206.1 385.3 188.4 375.4 175.2C365.6 162.2 351.5 152 336 152C320.5 152 306.4 162.2 296.6 175.2C286.7 188.4 280 206.1 280 224C280 227.4 282.2 230.5 285.5 231.6C288.7 232.7 292.3 231.6 294.4 228.8L294.4 228.8L294.6 228.5C294.8 228.3 294.1 228 295.3 227.6C295.1 226.8 296.9 225.7 298.1 224.3C300.6 221.4 304.1 217.7 308.3 213.1C317.1 206.2 327.2 200 336 200C344.8 200 354.9 206.2 363.7 213.1C367.9 217.7 371.4 221.4 373.9 224.3C375.1 225.7 376 226.8 376.7 227.6C377 228 377.2 228.3 377.4 228.5L377.6 228.8L377.6 228.8z\"]\n};\nvar faSmileBeam = faFaceSmileBeam;\nvar faFaceSmileWink = {\n  prefix: 'fas',\n  iconName: 'face-smile-wink',\n  icon: [512, 512, [128521, \"smile-wink\"], \"f4da\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM164.1 325.5C158.3 318.8 148.2 318.1 141.5 323.9C134.8 329.7 134.1 339.8 139.9 346.5C162.1 372.1 200.9 400 255.1 400C311.1 400 349.8 372.1 372.1 346.5C377.9 339.8 377.2 329.7 370.5 323.9C363.8 318.1 353.7 318.8 347.9 325.5C329.9 346.2 299.4 368 255.1 368C212.6 368 182 346.2 164.1 325.5H164.1zM176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176zM300.8 233.6C318.4 210.1 353.6 210.1 371.2 233.6C376.5 240.7 386.5 242.1 393.6 236.8C400.7 231.5 402.1 221.5 396.8 214.4C366.4 173.9 305.6 173.9 275.2 214.4C269.9 221.5 271.3 231.5 278.4 236.8C285.5 242.1 295.5 240.7 300.8 233.6z\"]\n};\nvar faSmileWink = faFaceSmileWink;\nvar faFaceSurprise = {\n  prefix: 'fas',\n  iconName: 'face-surprise',\n  icon: [512, 512, [128558, \"surprise\"], \"f5c2\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM176.4 240C194 240 208.4 225.7 208.4 208C208.4 190.3 194 176 176.4 176C158.7 176 144.4 190.3 144.4 208C144.4 225.7 158.7 240 176.4 240zM336.4 176C318.7 176 304.4 190.3 304.4 208C304.4 225.7 318.7 240 336.4 240C354 240 368.4 225.7 368.4 208C368.4 190.3 354 176 336.4 176zM256 416C291.3 416 320 387.3 320 352C320 316.7 291.3 288 256 288C220.7 288 192 316.7 192 352C192 387.3 220.7 416 256 416z\"]\n};\nvar faSurprise = faFaceSurprise;\nvar faFaceTired = {\n  prefix: 'fas',\n  iconName: 'face-tired',\n  icon: [512, 512, [128555, \"tired\"], \"f5c8\", \"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM138.3 364.1C132.2 375.8 128 388.4 128 400C128 405.2 130.6 410.2 134.9 413.2C139.2 416.1 144.7 416.8 149.6 414.1L170.2 407.3C197.1 397.2 225.6 392 254.4 392H257.6C286.4 392 314.9 397.2 341.8 407.3L362.4 414.1C367.3 416.8 372.8 416.1 377.1 413.2C381.4 410.2 384 405.2 384 400C384 388.4 379.8 375.8 373.7 364.1C367.4 352.1 358.4 339.8 347.3 328.7C325.3 306.7 293.4 287.1 256 287.1C218.6 287.1 186.7 306.7 164.7 328.7C153.6 339.8 144.6 352.1 138.3 364.1H138.3zM133.5 146.7C125.6 142.4 116 148.2 116 157.1C116 159.9 116.1 162.6 118.8 164.8L154.8 208L118.8 251.2C116.1 253.4 116 256.1 116 258.9C116 267.8 125.6 273.6 133.5 269.3L223.4 221.4C234.1 215.7 234.1 200.3 223.4 194.6L133.5 146.7zM396 157.1C396 148.2 386.4 142.4 378.5 146.7L288.6 194.6C277.9 200.3 277.9 215.7 288.6 221.4L378.5 269.3C386.4 273.6 396 267.8 396 258.9C396 256.1 395 253.4 393.2 251.2L357.2 208L393.2 164.8C395 162.6 396 159.9 396 157.1V157.1z\"]\n};\nvar faTired = faFaceTired;\nvar faFan = {\n  prefix: 'fas',\n  iconName: 'fan',\n  icon: [512, 512, [], \"f863\", \"M352.6 127.1c-28.12 0-54.13 4.5-77.13 12.88l12.38-123.1c1.125-10.5-8.125-18.88-18.5-17.63C189.6 10.12 127.1 77.62 127.1 159.4c0 28.12 4.5 54.13 12.88 77.13L17.75 224.1c-10.5-1.125-18.88 8.125-17.63 18.5c9.1 79.75 77.5 141.4 159.3 141.4c28.12 0 54.13-4.5 77.13-12.88l-12.38 123.1c-1.125 10.38 8.125 18.88 18.5 17.63c79.75-10 141.4-77.5 141.4-159.3c0-28.12-4.5-54.13-12.88-77.13l123.1 12.38c10.5 1.125 18.88-8.125 17.63-18.5C501.9 189.6 434.4 127.1 352.6 127.1zM255.1 287.1c-17.62 0-31.1-14.38-31.1-32s14.37-32 31.1-32s31.1 14.38 31.1 32S273.6 287.1 255.1 287.1z\"]\n};\nvar faFaucet = {\n  prefix: 'fas',\n  iconName: 'faucet',\n  icon: [512, 512, [], \"e005\", \"M352 256h-38.54C297.7 242.5 277.9 232.9 256 228V180.5L224 177L192 180.5V228C170.1 233 150.3 242.6 134.5 256H16C7.125 256 0 263.1 0 272v96C0 376.9 7.125 384 16 384h92.78C129.4 421.8 173 448 224 448s94.59-26.25 115.2-64H352c17.62 0 32 14.29 32 31.91S398.4 448 416 448h64c17.62 0 32-14.31 32-31.94C512 327.7 440.4 256 352 256zM81.63 159.9L224 144.9l142.4 15C375.9 160.9 384 153.1 384 143.1V112.9c0-10-8.125-17.74-17.62-16.74L256 107.8V80C256 71.12 248.9 64 240 64h-32C199.1 64 192 71.12 192 80v27.75L81.63 96.14C72.13 95.14 64 102.9 64 112.9v30.24C64 153.1 72.13 160.9 81.63 159.9z\"]\n};\nvar faFaucetDrip = {\n  prefix: 'fas',\n  iconName: 'faucet-drip',\n  icon: [512, 512, [128688], \"e006\", \"M416 480c0 17.62 14.38 32 32 32s32-14.38 32-32s-32-64-32-64S416 462.4 416 480zM352 192h-38.54C297.7 178.5 277.9 168.9 256 164V116.5L224 113L192 116.5V164C170.1 169 150.3 178.6 134.5 192H16C7.125 192 0 199.1 0 208v96C0 312.9 7.125 320 16 320h92.78C129.4 357.8 173 384 224 384s94.59-26.25 115.2-64H352c17.62 0 32 14.29 32 31.91S398.4 384 416 384h64c17.62 0 32-14.38 32-32C512 263.6 440.4 192 352 192zM81.63 95.88L224 80.88l142.4 15C375.9 96.88 384 89.12 384 79.12V48.89c0-10-8.125-17.74-17.62-16.74L256 43.75V16C256 7.125 248.9 0 240 0h-32C199.1 0 192 7.125 192 16v27.75L81.63 32.14C72.13 31.14 64 38.89 64 48.89V79.12C64 89.12 72.13 96.88 81.63 95.88z\"]\n};\nvar faFax = {\n  prefix: 'fas',\n  iconName: 'fax',\n  icon: [512, 512, [128439, 128224], \"f1ac\", \"M192 64h197.5L416 90.51V160h64V77.25c0-8.484-3.375-16.62-9.375-22.62l-45.25-45.25C419.4 3.375 411.2 0 402.8 0H160C142.3 0 128 14.33 128 32v128h64V64zM64 128H32C14.38 128 0 142.4 0 160v320c0 17.62 14.38 32 32 32h32c17.62 0 32-14.38 32-32V160C96 142.4 81.63 128 64 128zM480 192H128v288c0 17.6 14.4 32 32 32h320c17.6 0 32-14.4 32-32V224C512 206.4 497.6 192 480 192zM288 432c0 8.875-7.125 16-16 16h-32C231.1 448 224 440.9 224 432v-32C224 391.1 231.1 384 240 384h32c8.875 0 16 7.125 16 16V432zM288 304c0 8.875-7.125 16-16 16h-32C231.1 320 224 312.9 224 304v-32C224 263.1 231.1 256 240 256h32C280.9 256 288 263.1 288 272V304zM416 432c0 8.875-7.125 16-16 16h-32c-8.875 0-16-7.125-16-16v-32c0-8.875 7.125-16 16-16h32c8.875 0 16 7.125 16 16V432zM416 304c0 8.875-7.125 16-16 16h-32C359.1 320 352 312.9 352 304v-32C352 263.1 359.1 256 368 256h32C408.9 256 416 263.1 416 272V304z\"]\n};\nvar faFeather = {\n  prefix: 'fas',\n  iconName: 'feather',\n  icon: [512, 512, [129718], \"f52d\", \"M483.4 244.2L351.9 287.1h97.74c-9.874 10.62 3.75-3.125-46.24 46.87l-147.6 49.12h98.24c-74.99 73.12-194.6 70.62-246.8 54.1l-66.14 65.99c-9.374 9.374-24.6 9.374-33.98 0s-9.374-24.6 0-33.98l259.5-259.2c6.249-6.25 6.249-16.37 0-22.62c-6.249-6.249-16.37-6.249-22.62 0l-178.4 178.2C58.78 306.1 68.61 216.7 129.1 156.3l85.74-85.68c90.62-90.62 189.8-88.27 252.3-25.78C517.8 95.34 528.9 169.7 483.4 244.2z\"]\n};\nvar faFeatherPointed = {\n  prefix: 'fas',\n  iconName: 'feather-pointed',\n  icon: [512, 512, [\"feather-alt\"], \"f56b\", \"M467.1 241.1L351.1 288h94.34c-7.711 14.85-16.29 29.28-25.87 43.01l-132.5 52.99h85.65c-59.34 52.71-144.1 80.34-264.5 52.82l-68.13 68.13c-9.38 9.38-24.56 9.374-33.94 0c-9.375-9.375-9.375-24.56 0-33.94l253.4-253.4c4.846-6.275 4.643-15.19-1.113-20.95c-6.25-6.25-16.38-6.25-22.62 0l-168.6 168.6C24.56 58 366.9 8.118 478.9 .0846c18.87-1.354 34.41 14.19 33.05 33.05C508.7 78.53 498.5 161.8 467.1 241.1z\"]\n};\nvar faFeatherAlt = faFeatherPointed;\nvar faFerry = {\n  prefix: 'fas',\n  iconName: 'ferry',\n  icon: [576, 512, [], \"e4ea\", \"M352 0C369.7 0 384 14.33 384 32H459.1C479.7 32 490.7 56.29 477.2 71.8L456 96H119.1L98.83 71.8C85.25 56.29 96.27 32 116.9 32H191.1C191.1 14.33 206.3 0 223.1 0L352 0zM95.1 128H480C497.7 128 512 142.3 512 160V283.5C512 296.8 507.8 309.8 500.1 320.7L448.7 392.6C446.8 393.7 444.1 394.9 443.2 396.1C427.7 406.8 409.1 414.2 392.1 416H375.6C358.5 414.2 340.6 406.1 324.8 396.1C302.8 380.6 273.3 380.6 251.2 396.1C236.3 406.3 218.7 414.1 200.5 416H183.9C166.9 414.2 148.3 406.8 132.9 396.1C131.1 394.8 129.2 393.7 127.3 392.6L75.92 320.7C68.17 309.8 64 296.8 64 283.5V160C64 142.3 78.33 128 96 128H95.1zM127.1 288H448V192H127.1V288zM384 448C410.9 448 439.4 437.2 461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.12 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.853 504.5 .8422 487.3C-3.169 470.1 7.532 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448H384z\"]\n};\nvar faFile = {\n  prefix: 'fas',\n  iconName: 'file',\n  icon: [384, 512, [128459, 61462, 128196], \"f15b\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256z\"]\n};\nvar faFileArrowDown = {\n  prefix: 'fas',\n  iconName: 'file-arrow-down',\n  icon: [384, 512, [\"file-download\"], \"f56d\", \"M384 128h-128V0L384 128zM256 160H384v304c0 26.51-21.49 48-48 48h-288C21.49 512 0 490.5 0 464v-416C0 21.49 21.49 0 48 0H224l.0039 128C224 145.7 238.3 160 256 160zM255 295L216 334.1V232c0-13.25-10.75-24-24-24S168 218.8 168 232v102.1L128.1 295C124.3 290.3 118.2 288 112 288S99.72 290.3 95.03 295c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94S264.4 285.7 255 295z\"]\n};\nvar faFileDownload = faFileArrowDown;\nvar faFileArrowUp = {\n  prefix: 'fas',\n  iconName: 'file-arrow-up',\n  icon: [384, 512, [\"file-upload\"], \"f574\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM288.1 344.1C284.3 349.7 278.2 352 272 352s-12.28-2.344-16.97-7.031L216 305.9V408c0 13.25-10.75 24-24 24s-24-10.75-24-24V305.9l-39.03 39.03c-9.375 9.375-24.56 9.375-33.94 0s-9.375-24.56 0-33.94l80-80c9.375-9.375 24.56-9.375 33.94 0l80 80C298.3 320.4 298.3 335.6 288.1 344.1z\"]\n};\nvar faFileUpload = faFileArrowUp;\nvar faFileAudio = {\n  prefix: 'fas',\n  iconName: 'file-audio',\n  icon: [384, 512, [], \"f1c7\", \"M224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM176 404c0 10.75-12.88 15.98-20.5 8.484L120 376H76C69.38 376 64 370.6 64 364v-56C64 301.4 69.38 296 76 296H120l35.5-36.5C163.1 251.9 176 257.3 176 268V404zM224 387.8c-4.391 0-8.75-1.835-11.91-5.367c-5.906-6.594-5.359-16.69 1.219-22.59C220.2 353.7 224 345.2 224 336s-3.797-17.69-10.69-23.88c-6.578-5.906-7.125-16-1.219-22.59c5.922-6.594 16.05-7.094 22.59-1.219C248.2 300.5 256 317.8 256 336s-7.766 35.53-21.31 47.69C231.6 386.4 227.8 387.8 224 387.8zM320 336c0 41.81-20.5 81.11-54.84 105.1c-2.781 1.938-5.988 2.875-9.145 2.875c-5.047 0-10.03-2.375-13.14-6.844c-5.047-7.25-3.281-17.22 3.969-22.28C272.6 396.9 288 367.4 288 336s-15.38-60.84-41.14-78.8c-7.25-5.062-9.027-15.03-3.98-22.28c5.047-7.281 14.99-9.062 22.27-3.969C299.5 254.9 320 294.2 320 336zM256 0v128h128L256 0z\"]\n};\nvar faFileCircleCheck = {\n  prefix: 'fas',\n  iconName: 'file-circle-check',\n  icon: [576, 512, [], \"e493\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V198.6C310.1 219.5 256 287.4 256 368C256 427.1 285.1 479.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM476.7 324.7L416 385.4L387.3 356.7C381.1 350.4 370.9 350.4 364.7 356.7C358.4 362.9 358.4 373.1 364.7 379.3L404.7 419.3C410.9 425.6 421.1 425.6 427.3 419.3L499.3 347.3C505.6 341.1 505.6 330.9 499.3 324.7C493.1 318.4 482.9 318.4 476.7 324.7H476.7z\"]\n};\nvar faFileCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'file-circle-exclamation',\n  icon: [576, 512, [], \"e4eb\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V198.6C310.1 219.5 256 287.4 256 368C256 427.1 285.1 479.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464zM415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288z\"]\n};\nvar faFileCircleMinus = {\n  prefix: 'fas',\n  iconName: 'file-circle-minus',\n  icon: [576, 512, [], \"e4ed\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V198.6C310.1 219.5 256 287.4 256 368C256 427.1 285.1 479.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM496 351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1z\"]\n};\nvar faFileCirclePlus = {\n  prefix: 'fas',\n  iconName: 'file-circle-plus',\n  icon: [576, 512, [], \"e4ee\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V198.6C310.1 219.5 256 287.4 256 368C256 427.1 285.1 479.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM448 303.1C448 295.2 440.8 287.1 432 287.1C423.2 287.1 416 295.2 416 303.1V351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H416V431.1C416 440.8 423.2 447.1 432 447.1C440.8 447.1 448 440.8 448 431.1V383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1H448V303.1z\"]\n};\nvar faFileCircleQuestion = {\n  prefix: 'fas',\n  iconName: 'file-circle-question',\n  icon: [576, 512, [], \"e4ef\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V198.6C310.1 219.5 256 287.4 256 368C256 427.1 285.1 479.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464zM368 328C368 336.8 375.2 344 384 344C392.8 344 400 336.8 400 328V321.6C400 316.3 404.3 312 409.6 312H450.1C457.8 312 464 318.2 464 325.9C464 331.1 461.1 335.8 456.6 338.3L424.6 355.1C419.3 357.9 416 363.3 416 369.2V384C416 392.8 423.2 400 432 400C440.8 400 448 392.8 448 384V378.9L471.5 366.6C486.6 358.6 496 342.1 496 325.9C496 300.6 475.4 280 450.1 280H409.6C386.6 280 368 298.6 368 321.6V328z\"]\n};\nvar faFileCircleXmark = {\n  prefix: 'fas',\n  iconName: 'file-circle-xmark',\n  icon: [576, 512, [], \"e494\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V198.6C310.1 219.5 256 287.4 256 368C256 427.1 285.1 479.3 329.7 511.3C326.6 511.7 323.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM491.3 331.3C497.6 325.1 497.6 314.9 491.3 308.7C485.1 302.4 474.9 302.4 468.7 308.7L432 345.4L395.3 308.7C389.1 302.4 378.9 302.4 372.7 308.7C366.4 314.9 366.4 325.1 372.7 331.3L409.4 368L372.7 404.7C366.4 410.9 366.4 421.1 372.7 427.3C378.9 433.6 389.1 433.6 395.3 427.3L432 390.6L468.7 427.3C474.9 433.6 485.1 433.6 491.3 427.3C497.6 421.1 497.6 410.9 491.3 404.7L454.6 368L491.3 331.3z\"]\n};\nvar faFileCode = {\n  prefix: 'fas',\n  iconName: 'file-code',\n  icon: [384, 512, [], \"f1c9\", \"M224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM154.1 353.8c7.812 7.812 7.812 20.5 0 28.31C150.2 386.1 145.1 388 140 388s-10.23-1.938-14.14-5.844l-48-48c-7.812-7.812-7.812-20.5 0-28.31l48-48c7.812-7.812 20.47-7.812 28.28 0s7.812 20.5 0 28.31L120.3 320L154.1 353.8zM306.1 305.8c7.812 7.812 7.812 20.5 0 28.31l-48 48C254.2 386.1 249.1 388 244 388s-10.23-1.938-14.14-5.844c-7.812-7.812-7.812-20.5 0-28.31L263.7 320l-33.86-33.84c-7.812-7.812-7.812-20.5 0-28.31s20.47-7.812 28.28 0L306.1 305.8zM256 0v128h128L256 0z\"]\n};\nvar faFileContract = {\n  prefix: 'fas',\n  iconName: 'file-contract',\n  icon: [384, 512, [], \"f56c\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM64 72C64 67.63 67.63 64 72 64h80C156.4 64 160 67.63 160 72v16C160 92.38 156.4 96 152 96h-80C67.63 96 64 92.38 64 88V72zM64 136C64 131.6 67.63 128 72 128h80C156.4 128 160 131.6 160 136v16C160 156.4 156.4 160 152 160h-80C67.63 160 64 156.4 64 152V136zM304 384c8.875 0 16 7.125 16 16S312.9 416 304 416h-47.25c-16.38 0-31.25-9.125-38.63-23.88c-2.875-5.875-8-6.5-10.12-6.5s-7.25 .625-10 6.125l-7.75 15.38C187.6 412.6 181.1 416 176 416H174.9c-6.5-.5-12-4.75-14-11L144 354.6L133.4 386.5C127.5 404.1 111 416 92.38 416H80C71.13 416 64 408.9 64 400S71.13 384 80 384h12.38c4.875 0 9.125-3.125 10.62-7.625l18.25-54.63C124.5 311.9 133.6 305.3 144 305.3s19.5 6.625 22.75 16.5l13.88 41.63c19.75-16.25 54.13-9.75 66 14.12c2 4 6 6.5 10.12 6.5H304z\"]\n};\nvar faFileCsv = {\n  prefix: 'fas',\n  iconName: 'file-csv',\n  icon: [384, 512, [], \"f6dd\", \"M224 0V128C224 145.7 238.3 160 256 160H384V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64C0 28.65 28.65 0 64 0H224zM80 224C57.91 224 40 241.9 40 264V344C40 366.1 57.91 384 80 384H96C118.1 384 136 366.1 136 344V336C136 327.2 128.8 320 120 320C111.2 320 104 327.2 104 336V344C104 348.4 100.4 352 96 352H80C75.58 352 72 348.4 72 344V264C72 259.6 75.58 256 80 256H96C100.4 256 104 259.6 104 264V272C104 280.8 111.2 288 120 288C128.8 288 136 280.8 136 272V264C136 241.9 118.1 224 96 224H80zM175.4 310.6L200.8 325.1C205.2 327.7 208 332.5 208 337.6C208 345.6 201.6 352 193.6 352H168C159.2 352 152 359.2 152 368C152 376.8 159.2 384 168 384H193.6C219.2 384 240 363.2 240 337.6C240 320.1 231.1 305.6 216.6 297.4L191.2 282.9C186.8 280.3 184 275.5 184 270.4C184 262.4 190.4 256 198.4 256H216C224.8 256 232 248.8 232 240C232 231.2 224.8 224 216 224H198.4C172.8 224 152 244.8 152 270.4C152 287 160.9 302.4 175.4 310.6zM280 240C280 231.2 272.8 224 264 224C255.2 224 248 231.2 248 240V271.6C248 306.3 258.3 340.3 277.6 369.2L282.7 376.9C285.7 381.3 290.6 384 296 384C301.4 384 306.3 381.3 309.3 376.9L314.4 369.2C333.7 340.3 344 306.3 344 271.6V240C344 231.2 336.8 224 328 224C319.2 224 312 231.2 312 240V271.6C312 294.6 306.5 317.2 296 337.5C285.5 317.2 280 294.6 280 271.6V240zM256 0L384 128H256V0z\"]\n};\nvar faFileExcel = {\n  prefix: 'fas',\n  iconName: 'file-excel',\n  icon: [384, 512, [], \"f1c3\", \"M224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM272.1 264.4L224 344l48.99 79.61C279.6 434.3 271.9 448 259.4 448h-26.43c-5.557 0-10.71-2.883-13.63-7.617L192 396l-27.31 44.38C161.8 445.1 156.6 448 151.1 448H124.6c-12.52 0-20.19-13.73-13.63-24.39L160 344L111 264.4C104.4 253.7 112.1 240 124.6 240h26.43c5.557 0 10.71 2.883 13.63 7.613L192 292l27.31-44.39C222.2 242.9 227.4 240 232.9 240h26.43C271.9 240 279.6 253.7 272.1 264.4zM256 0v128h128L256 0z\"]\n};\nvar faFileExport = {\n  prefix: 'fas',\n  iconName: 'file-export',\n  icon: [576, 512, [\"arrow-right-from-file\"], \"f56e\", \"M192 312C192 298.8 202.8 288 216 288H384V160H256c-17.67 0-32-14.33-32-32L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48v-128H216C202.8 336 192 325.3 192 312zM256 0v128h128L256 0zM568.1 295l-80-80c-9.375-9.375-24.56-9.375-33.94 0s-9.375 24.56 0 33.94L494.1 288H384v48h110.1l-39.03 39.03C450.3 379.7 448 385.8 448 392s2.344 12.28 7.031 16.97c9.375 9.375 24.56 9.375 33.94 0l80-80C578.3 319.6 578.3 304.4 568.1 295z\"]\n};\nvar faArrowRightFromFile = faFileExport;\nvar faFileImage = {\n  prefix: 'fas',\n  iconName: 'file-image',\n  icon: [384, 512, [128443], \"f1c5\", \"M224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM96 224c17.67 0 32 14.33 32 32S113.7 288 96 288S64 273.7 64 256S78.33 224 96 224zM318.1 439.5C315.3 444.8 309.9 448 304 448h-224c-5.9 0-11.32-3.248-14.11-8.451c-2.783-5.201-2.479-11.52 .7949-16.42l53.33-80C122.1 338.7 127.1 336 133.3 336s10.35 2.674 13.31 7.125L160 363.2l45.35-68.03C208.3 290.7 213.3 288 218.7 288s10.35 2.674 13.31 7.125l85.33 128C320.6 428 320.9 434.3 318.1 439.5zM256 0v128h128L256 0z\"]\n};\nvar faFileImport = {\n  prefix: 'fas',\n  iconName: 'file-import',\n  icon: [512, 512, [\"arrow-right-to-file\"], \"f56f\", \"M384 0v128h128L384 0zM352 128L352 0H176C149.5 0 128 21.49 128 48V288h174.1l-39.03-39.03c-9.375-9.375-9.375-24.56 0-33.94s24.56-9.375 33.94 0l80 80c9.375 9.375 9.375 24.56 0 33.94l-80 80c-9.375 9.375-24.56 9.375-33.94 0C258.3 404.3 256 398.2 256 392s2.344-12.28 7.031-16.97L302.1 336H128v128C128 490.5 149.5 512 176 512h288c26.51 0 48-21.49 48-48V160h-127.1C366.3 160 352 145.7 352 128zM24 288C10.75 288 0 298.7 0 312c0 13.25 10.75 24 24 24H128V288H24z\"]\n};\nvar faArrowRightToFile = faFileImport;\nvar faFileInvoice = {\n  prefix: 'fas',\n  iconName: 'file-invoice',\n  icon: [384, 512, [], \"f570\", \"M256 0v128h128L256 0zM288 256H96v64h192V256zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM64 72C64 67.63 67.63 64 72 64h80C156.4 64 160 67.63 160 72v16C160 92.38 156.4 96 152 96h-80C67.63 96 64 92.38 64 88V72zM64 136C64 131.6 67.63 128 72 128h80C156.4 128 160 131.6 160 136v16C160 156.4 156.4 160 152 160h-80C67.63 160 64 156.4 64 152V136zM320 440c0 4.375-3.625 8-8 8h-80C227.6 448 224 444.4 224 440v-16c0-4.375 3.625-8 8-8h80c4.375 0 8 3.625 8 8V440zM320 240v96c0 8.875-7.125 16-16 16h-224C71.13 352 64 344.9 64 336v-96C64 231.1 71.13 224 80 224h224C312.9 224 320 231.1 320 240z\"]\n};\nvar faFileInvoiceDollar = {\n  prefix: 'fas',\n  iconName: 'file-invoice-dollar',\n  icon: [384, 512, [], \"f571\", \"M384 128h-128V0L384 128zM256 160H384v304c0 26.51-21.49 48-48 48h-288C21.49 512 0 490.5 0 464v-416C0 21.49 21.49 0 48 0H224l.0039 128C224 145.7 238.3 160 256 160zM64 88C64 92.38 67.63 96 72 96h80C156.4 96 160 92.38 160 88v-16C160 67.63 156.4 64 152 64h-80C67.63 64 64 67.63 64 72V88zM72 160h80C156.4 160 160 156.4 160 152v-16C160 131.6 156.4 128 152 128h-80C67.63 128 64 131.6 64 136v16C64 156.4 67.63 160 72 160zM197.5 316.8L191.1 315.2C168.3 308.2 168.8 304.1 169.6 300.5c1.375-7.812 16.59-9.719 30.27-7.625c5.594 .8438 11.73 2.812 17.59 4.844c10.39 3.594 21.83-1.938 25.45-12.34c3.625-10.44-1.891-21.84-12.33-25.47c-7.219-2.484-13.11-4.078-18.56-5.273V248c0-11.03-8.953-20-20-20s-20 8.969-20 20v5.992C149.6 258.8 133.8 272.8 130.2 293.7c-7.406 42.84 33.19 54.75 50.52 59.84l5.812 1.688c29.28 8.375 28.8 11.19 27.92 16.28c-1.375 7.812-16.59 9.75-30.31 7.625c-6.938-1.031-15.81-4.219-23.66-7.031l-4.469-1.625c-10.41-3.594-21.83 1.812-25.52 12.22c-3.672 10.41 1.781 21.84 12.2 25.53l4.266 1.5c7.758 2.789 16.38 5.59 25.06 7.512V424c0 11.03 8.953 20 20 20s20-8.969 20-20v-6.254c22.36-4.793 38.21-18.53 41.83-39.43C261.3 335 219.8 323.1 197.5 316.8z\"]\n};\nvar faFileLines = {\n  prefix: 'fas',\n  iconName: 'file-lines',\n  icon: [384, 512, [128462, 61686, 128441, \"file-alt\", \"file-text\"], \"f15c\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM272 416h-160C103.2 416 96 408.8 96 400C96 391.2 103.2 384 112 384h160c8.836 0 16 7.162 16 16C288 408.8 280.8 416 272 416zM272 352h-160C103.2 352 96 344.8 96 336C96 327.2 103.2 320 112 320h160c8.836 0 16 7.162 16 16C288 344.8 280.8 352 272 352zM288 272C288 280.8 280.8 288 272 288h-160C103.2 288 96 280.8 96 272C96 263.2 103.2 256 112 256h160C280.8 256 288 263.2 288 272z\"]\n};\nvar faFileAlt = faFileLines;\nvar faFileText = faFileLines;\nvar faFileMedical = {\n  prefix: 'fas',\n  iconName: 'file-medical',\n  icon: [384, 512, [], \"f477\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM288 301.7v36.57C288 345.9 281.9 352 274.3 352L224 351.1v50.29C224 409.9 217.9 416 210.3 416H173.7C166.1 416 160 409.9 160 402.3V351.1L109.7 352C102.1 352 96 345.9 96 338.3V301.7C96 294.1 102.1 288 109.7 288H160V237.7C160 230.1 166.1 224 173.7 224h36.57C217.9 224 224 230.1 224 237.7V288h50.29C281.9 288 288 294.1 288 301.7z\"]\n};\nvar faFilePdf = {\n  prefix: 'fas',\n  iconName: 'file-pdf',\n  icon: [384, 512, [], \"f1c1\", \"M88 304H80V256H88C101.3 256 112 266.7 112 280C112 293.3 101.3 304 88 304zM192 256H200C208.8 256 216 263.2 216 272V336C216 344.8 208.8 352 200 352H192V256zM224 0V128C224 145.7 238.3 160 256 160H384V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64C0 28.65 28.65 0 64 0H224zM64 224C55.16 224 48 231.2 48 240V368C48 376.8 55.16 384 64 384C72.84 384 80 376.8 80 368V336H88C118.9 336 144 310.9 144 280C144 249.1 118.9 224 88 224H64zM160 368C160 376.8 167.2 384 176 384H200C226.5 384 248 362.5 248 336V272C248 245.5 226.5 224 200 224H176C167.2 224 160 231.2 160 240V368zM288 224C279.2 224 272 231.2 272 240V368C272 376.8 279.2 384 288 384C296.8 384 304 376.8 304 368V320H336C344.8 320 352 312.8 352 304C352 295.2 344.8 288 336 288H304V256H336C344.8 256 352 248.8 352 240C352 231.2 344.8 224 336 224H288zM256 0L384 128H256V0z\"]\n};\nvar faFilePen = {\n  prefix: 'fas',\n  iconName: 'file-pen',\n  icon: [576, 512, [128221, \"file-edit\"], \"f31c\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V299.6L289.3 394.3C281.1 402.5 275.3 412.8 272.5 424.1L257.4 484.2C255.1 493.6 255.7 503.2 258.8 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM564.1 250.1C579.8 265.7 579.8 291 564.1 306.7L534.7 336.1L463.8 265.1L493.2 235.7C508.8 220.1 534.1 220.1 549.8 235.7L564.1 250.1zM311.9 416.1L441.1 287.8L512.1 358.7L382.9 487.9C378.8 492 373.6 494.9 368 496.3L307.9 511.4C302.4 512.7 296.7 511.1 292.7 507.2C288.7 503.2 287.1 497.4 288.5 491.1L303.5 431.8C304.9 426.2 307.8 421.1 311.9 416.1V416.1z\"]\n};\nvar faFileEdit = faFilePen;\nvar faFilePowerpoint = {\n  prefix: 'fas',\n  iconName: 'file-powerpoint',\n  icon: [384, 512, [], \"f1c4\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM279.6 308.1C284.2 353.5 248.5 392 204 392H160v40C160 440.8 152.8 448 144 448H128c-8.836 0-16-7.164-16-16V256c0-8.836 7.164-16 16-16h71.51C239.3 240 275.6 268.5 279.6 308.1zM160 344h44c15.44 0 28-12.56 28-28S219.4 288 204 288H160V344z\"]\n};\nvar faFilePrescription = {\n  prefix: 'fas',\n  iconName: 'file-prescription',\n  icon: [384, 512, [], \"f572\", \"M176 240H128v32h48C184.9 272 192 264.9 192 256S184.9 240 176 240zM256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM292.5 315.5l11.38 11.25c6.25 6.25 6.25 16.38 0 22.62l-29.88 30L304 409.4c6.25 6.25 6.25 16.38 0 22.62l-11.25 11.38c-6.25 6.25-16.5 6.25-22.75 0L240 413.3l-30 30c-6.249 6.25-16.48 6.266-22.73 .0156L176 432c-6.25-6.25-6.25-16.38 0-22.62l29.1-30.12L146.8 320H128l.0078 48.01c0 8.875-7.125 16-16 16L96 384c-8.875 0-16-7.125-16-16v-160C80 199.1 87.13 192 96 192h80c35.38 0 64 28.62 64 64c0 24.25-13.62 45-33.5 55.88L240 345.4l29.88-29.88C276.1 309.3 286.3 309.3 292.5 315.5z\"]\n};\nvar faFileShield = {\n  prefix: 'fas',\n  iconName: 'file-shield',\n  icon: [576, 512, [], \"e4f0\", \"M0 64C0 28.65 28.65 0 64 0H224V128C224 145.7 238.3 160 256 160H384V207L291.2 244.2C269.9 252.7 256 273.3 256 296.2C256 352.7 274.9 444.2 350.2 504.4C341.2 509.3 330.9 512 320 512H64C28.65 512 0 483.3 0 448V64zM256 128V0L384 128H256zM423.1 225.7C428.8 223.4 435.2 223.4 440.9 225.7L560.9 273.7C570 277.4 576 286.2 576 296C576 359.3 550.1 464.8 441.2 510.2C435.3 512.6 428.7 512.6 422.8 510.2C313.9 464.8 288 359.3 288 296C288 286.2 293.1 277.4 303.1 273.7L423.1 225.7zM432 273.8V461.7C500.2 428.7 523.5 362.7 527.4 311.1L432 273.8z\"]\n};\nvar faFileSignature = {\n  prefix: 'fas',\n  iconName: 'file-signature',\n  icon: [576, 512, [], \"f573\", \"M292.7 342.3C289.7 345.3 288 349.4 288 353.7V416h62.34c4.264 0 8.35-1.703 11.35-4.727l156.9-158l-67.88-67.88L292.7 342.3zM568.5 167.4L536.6 135.5c-9.875-10-26-10-36 0l-27.25 27.25l67.88 67.88l27.25-27.25C578.5 193.4 578.5 177.3 568.5 167.4zM256 0v128h128L256 0zM256 448c-16.07-.2852-30.62-9.359-37.88-23.88c-2.875-5.875-8-6.5-10.12-6.5s-7.25 .625-10 6.125l-7.749 15.38C187.6 444.6 181.1 448 176 448H174.9c-6.5-.5-12-4.75-14-11L144 386.6L133.4 418.5C127.5 436.1 111 448 92.45 448H80C71.13 448 64 440.9 64 432S71.13 416 80 416h12.4c4.875 0 9.102-3.125 10.6-7.625l18.25-54.63C124.5 343.9 133.6 337.3 144 337.3s19.5 6.625 22.75 16.5l13.88 41.63c19.75-16.25 54.13-9.75 66 14.12C248.5 413.2 252.2 415.6 256 415.9V347c0-8.523 3.402-16.7 9.451-22.71L384 206.5V160H256c-17.67 0-32-14.33-32-32L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V448H256z\"]\n};\nvar faFileVideo = {\n  prefix: 'fas',\n  iconName: 'file-video',\n  icon: [384, 512, [], \"f1c8\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM224 384c0 17.67-14.33 32-32 32H96c-17.67 0-32-14.33-32-32V288c0-17.67 14.33-32 32-32h96c17.67 0 32 14.33 32 32V384zM320 284.9v102.3c0 12.57-13.82 20.23-24.48 13.57L256 376v-80l39.52-24.7C306.2 264.6 320 272.3 320 284.9z\"]\n};\nvar faFileWaveform = {\n  prefix: 'fas',\n  iconName: 'file-waveform',\n  icon: [448, 512, [\"file-medical-alt\"], \"f478\", \"M320 0v128h128L320 0zM288 128L288 0H112C85.49 0 64 21.49 64 48V224H16C7.164 224 0 231.2 0 240v32C0 280.8 7.164 288 16 288h128c6.062 0 11.59 3.438 14.31 8.844L176 332.2l49.69-99.38c5.438-10.81 23.19-10.81 28.62 0L281.9 288H352c8.844 0 16 7.156 16 16S360.8 320 352 320h-80c-6.062 0-11.59-3.438-14.31-8.844L240 275.8l-49.69 99.38C187.6 380.6 182.1 384 176 384s-11.59-3.438-14.31-8.844L134.1 320H64v144C64 490.5 85.49 512 112 512h288c26.51 0 48-21.49 48-48V160h-127.1C302.3 160 288 145.7 288 128z\"]\n};\nvar faFileMedicalAlt = faFileWaveform;\nvar faFileWord = {\n  prefix: 'fas',\n  iconName: 'file-word',\n  icon: [384, 512, [], \"f1c2\", \"M224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM281.5 240h23.37c7.717 0 13.43 7.18 11.69 14.7l-42.46 184C272.9 444.1 268 448 262.5 448h-29.26c-5.426 0-10.18-3.641-11.59-8.883L192 329.1l-29.61 109.1C160.1 444.4 156.2 448 150.8 448H121.5c-5.588 0-10.44-3.859-11.69-9.305l-42.46-184C65.66 247.2 71.37 240 79.08 240h23.37c5.588 0 10.44 3.859 11.69 9.301L137.8 352L165.6 248.9C167 243.6 171.8 240 177.2 240h29.61c5.426 0 10.18 3.641 11.59 8.883L246.2 352l23.7-102.7C271.1 243.9 275.1 240 281.5 240zM256 0v128h128L256 0z\"]\n};\nvar faFileZipper = {\n  prefix: 'fas',\n  iconName: 'file-zipper',\n  icon: [384, 512, [\"file-archive\"], \"f1c6\", \"M256 0v128h128L256 0zM224 128L224 0H48C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48V160h-127.1C238.3 160 224 145.7 224 128zM96 32h64v32H96V32zM96 96h64v32H96V96zM96 160h64v32H96V160zM128.3 415.1c-40.56 0-70.76-36.45-62.83-75.45L96 224h64l30.94 116.9C198.7 379.7 168.5 415.1 128.3 415.1zM144 336h-32C103.2 336 96 343.2 96 352s7.164 16 16 16h32C152.8 368 160 360.8 160 352S152.8 336 144 336z\"]\n};\nvar faFileArchive = faFileZipper;\nvar faFill = {\n  prefix: 'fas',\n  iconName: 'fill',\n  icon: [512, 512, [], \"f575\", \"M168 90.74L221.1 37.66C249.2 9.539 294.8 9.539 322.9 37.66L474.3 189.1C502.5 217.2 502.5 262.8 474.3 290.9L283.9 481.4C246.4 518.9 185.6 518.9 148.1 481.4L30.63 363.9C-6.863 326.4-6.863 265.6 30.63 228.1L122.7 135.1L41.37 54.63C28.88 42.13 28.88 21.87 41.37 9.372C53.87-3.124 74.13-3.124 86.63 9.372L168 90.74zM75.88 273.4C71.69 277.6 68.9 282.6 67.52 287.1H386.7L429.1 245.7C432.2 242.5 432.2 237.5 429.1 234.3L277.7 82.91C274.5 79.79 269.5 79.79 266.3 82.91L213.3 136L262.6 185.4C275.1 197.9 275.1 218.1 262.6 230.6C250.1 243.1 229.9 243.1 217.4 230.6L168 181.3L75.88 273.4z\"]\n};\nvar faFillDrip = {\n  prefix: 'fas',\n  iconName: 'fill-drip',\n  icon: [576, 512, [], \"f576\", \"M41.37 9.372C53.87-3.124 74.13-3.124 86.63 9.372L168 90.74L221.1 37.66C249.2 9.539 294.8 9.539 322.9 37.66L474.3 189.1C502.5 217.2 502.5 262.8 474.3 290.9L283.9 481.4C246.4 518.9 185.6 518.9 148.1 481.4L30.63 363.9C-6.863 326.4-6.863 265.6 30.63 228.1L122.7 135.1L41.37 54.63C28.88 42.13 28.88 21.87 41.37 9.372V9.372zM217.4 230.6L168 181.3L75.88 273.4C71.69 277.6 68.9 282.6 67.52 288H386.7L429.1 245.7C432.2 242.5 432.2 237.5 429.1 234.3L277.7 82.91C274.5 79.79 269.5 79.79 266.3 82.91L213.3 136L262.6 185.4C275.1 197.9 275.1 218.1 262.6 230.6C250.1 243.1 229.9 243.1 217.4 230.6L217.4 230.6zM448 448C448 422.8 480.6 368.4 499.2 339.3C505.3 329.9 518.7 329.9 524.8 339.3C543.4 368.4 576 422.8 576 448C576 483.3 547.3 512 512 512C476.7 512 448 483.3 448 448H448z\"]\n};\nvar faFilm = {\n  prefix: 'fas',\n  iconName: 'film',\n  icon: [512, 512, [127902], \"f008\", \"M463.1 32h-416C21.49 32-.0001 53.49-.0001 80v352c0 26.51 21.49 48 47.1 48h416c26.51 0 48-21.49 48-48v-352C511.1 53.49 490.5 32 463.1 32zM111.1 408c0 4.418-3.582 8-8 8H55.1c-4.418 0-8-3.582-8-8v-48c0-4.418 3.582-8 8-8h47.1c4.418 0 8 3.582 8 8L111.1 408zM111.1 280c0 4.418-3.582 8-8 8H55.1c-4.418 0-8-3.582-8-8v-48c0-4.418 3.582-8 8-8h47.1c4.418 0 8 3.582 8 8V280zM111.1 152c0 4.418-3.582 8-8 8H55.1c-4.418 0-8-3.582-8-8v-48c0-4.418 3.582-8 8-8h47.1c4.418 0 8 3.582 8 8L111.1 152zM351.1 400c0 8.836-7.164 16-16 16H175.1c-8.836 0-16-7.164-16-16v-96c0-8.838 7.164-16 16-16h160c8.836 0 16 7.162 16 16V400zM351.1 208c0 8.836-7.164 16-16 16H175.1c-8.836 0-16-7.164-16-16v-96c0-8.838 7.164-16 16-16h160c8.836 0 16 7.162 16 16V208zM463.1 408c0 4.418-3.582 8-8 8h-47.1c-4.418 0-7.1-3.582-7.1-8l0-48c0-4.418 3.582-8 8-8h47.1c4.418 0 8 3.582 8 8V408zM463.1 280c0 4.418-3.582 8-8 8h-47.1c-4.418 0-8-3.582-8-8v-48c0-4.418 3.582-8 8-8h47.1c4.418 0 8 3.582 8 8V280zM463.1 152c0 4.418-3.582 8-8 8h-47.1c-4.418 0-8-3.582-8-8l0-48c0-4.418 3.582-8 7.1-8h47.1c4.418 0 8 3.582 8 8V152z\"]\n};\nvar faFilter = {\n  prefix: 'fas',\n  iconName: 'filter',\n  icon: [512, 512, [], \"f0b0\", \"M3.853 54.87C10.47 40.9 24.54 32 40 32H472C487.5 32 501.5 40.9 508.1 54.87C514.8 68.84 512.7 85.37 502.1 97.33L320 320.9V448C320 460.1 313.2 471.2 302.3 476.6C291.5 482 278.5 480.9 268.8 473.6L204.8 425.6C196.7 419.6 192 410.1 192 400V320.9L9.042 97.33C-.745 85.37-2.765 68.84 3.854 54.87L3.853 54.87z\"]\n};\nvar faFilterCircleDollar = {\n  prefix: 'fas',\n  iconName: 'filter-circle-dollar',\n  icon: [576, 512, [\"funnel-dollar\"], \"f662\", \"M3.853 22.87C10.47 8.904 24.54 0 40 0H472C487.5 0 501.5 8.904 508.1 22.87C514.8 36.84 512.7 53.37 502.1 65.33L396.4 195.6C316.2 212.1 255.1 283 255.1 368C255.1 395.4 262.3 421.4 273.5 444.5C271.8 443.7 270.3 442.7 268.8 441.6L204.8 393.6C196.7 387.6 192 378.1 192 368V288.9L9.042 65.33C-.745 53.37-2.765 36.84 3.854 22.87H3.853zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM413 331.1C418.1 329.3 425.6 327.9 431.8 328C439.1 328.1 448.9 329.8 458.1 332.1C466.7 334.2 475.4 328.1 477.5 320.4C479.7 311.8 474.4 303.2 465.9 301C460.3 299.6 454.3 298.3 448 297.4V288C448 279.2 440.8 272 432 272C423.2 272 416 279.2 416 288V297.5C409.9 298.7 403.7 300.7 397.1 303.8C386.1 310.1 374.9 322.2 376.1 341C377.1 357 387.8 366.4 397.7 371.7C406.6 376.4 417.5 379.5 426.3 381.1L428.1 382.5C438.3 385.4 445.1 387.7 451.2 390.8C455.8 393.5 455.1 395.1 455.1 396.5C456.1 398.9 455.5 400.2 454.1 401C454.3 401.1 453.2 403.2 450.1 404.4C446.3 406.9 439.2 408.2 432.5 407.1C422.1 407.7 414 404.8 402.6 401.2C400.7 400.6 398.8 400 396.8 399.4C388.3 396.8 379.3 401.5 376.7 409.9C374.1 418.3 378.8 427.3 387.2 429.9C388.9 430.4 390.5 430.1 392.3 431.5C399.3 433.8 407.4 436.4 416 438.1V449.5C416 458.4 423.2 465.5 432 465.5C440.8 465.5 448 458.4 448 449.5V438.7C454.2 437.6 460.5 435.6 466.3 432.5C478.3 425.9 488.5 413.8 487.1 395.5C487.5 379.4 477.7 369.3 467.5 363.3C458.1 357.7 446.2 354.4 436.9 351.7L436.8 351.7C426.3 348.7 418.5 346.5 412.9 343.5C408.1 340.9 408.1 339.5 408.1 339.1L408.1 338.1C407.9 337 408.4 336.1 408.8 335.4C409.4 334.5 410.6 333.3 413 331.1L413 331.1z\"]\n};\nvar faFunnelDollar = faFilterCircleDollar;\nvar faFilterCircleXmark = {\n  prefix: 'fas',\n  iconName: 'filter-circle-xmark',\n  icon: [576, 512, [], \"e17b\", \"M3.853 22.87C10.47 8.904 24.54 0 40 0H472C487.5 0 501.5 8.904 508.1 22.87C514.8 36.84 512.7 53.37 502.1 65.33L396.4 195.6C316.2 212.1 255.1 283 255.1 368C255.1 395.4 262.3 421.4 273.5 444.5C271.8 443.7 270.3 442.7 268.8 441.6L204.8 393.6C196.7 387.6 192 378.1 192 368V288.9L9.042 65.33C-.745 53.37-2.765 36.84 3.854 22.87H3.853zM287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368zM491.3 331.3C497.6 325.1 497.6 314.9 491.3 308.7C485.1 302.4 474.9 302.4 468.7 308.7L432 345.4L395.3 308.7C389.1 302.4 378.9 302.4 372.7 308.7C366.4 314.9 366.4 325.1 372.7 331.3L409.4 368L372.7 404.7C366.4 410.9 366.4 421.1 372.7 427.3C378.9 433.6 389.1 433.6 395.3 427.3L432 390.6L468.7 427.3C474.9 433.6 485.1 433.6 491.3 427.3C497.6 421.1 497.6 410.9 491.3 404.7L454.6 368L491.3 331.3z\"]\n};\nvar faFingerprint = {\n  prefix: 'fas',\n  iconName: 'fingerprint',\n  icon: [512, 512, [], \"f577\", \"M256.1 246c-13.25 0-23.1 10.75-23.1 23.1c1.125 72.25-8.124 141.9-27.75 211.5C201.7 491.3 206.6 512 227.5 512c10.5 0 20.12-6.875 23.12-17.5c13.5-47.87 30.1-125.4 29.5-224.5C280.1 256.8 269.4 246 256.1 246zM255.2 164.3C193.1 164.1 151.2 211.3 152.1 265.4c.75 47.87-3.75 95.87-13.37 142.5c-2.75 12.1 5.624 25.62 18.62 28.37c12.1 2.625 25.62-5.625 28.37-18.62c10.37-50.12 15.12-101.6 14.37-152.1C199.7 238.6 219.1 212.1 254.5 212.3c31.37 .5 57.24 25.37 57.62 55.5c.8749 47.1-2.75 96.25-10.62 143.5c-2.125 12.1 6.749 25.37 19.87 27.62c19.87 3.25 26.75-15.12 27.5-19.87c8.249-49.1 12.12-101.1 11.25-151.1C359.2 211.1 312.2 165.1 255.2 164.3zM144.6 144.5C134.2 136.1 119.2 137.6 110.7 147.9C85.25 179.4 71.38 219.3 72 259.9c.6249 37.62-2.375 75.37-8.999 112.1c-2.375 12.1 6.249 25.5 19.25 27.87c20.12 3.5 27.12-14.87 27.1-19.37c7.124-39.87 10.5-80.62 9.749-121.4C119.6 229.3 129.2 201.3 147.1 178.3C156.4 167.9 154.9 152.9 144.6 144.5zM253.1 82.14C238.6 81.77 223.1 83.52 208.2 87.14c-12.87 2.1-20.87 15.1-17.87 28.87c3.125 12.87 15.1 20.75 28.1 17.75C230.4 131.3 241.7 130 253.4 130.1c75.37 1.125 137.6 61.5 138.9 134.6c.5 37.87-1.375 75.1-5.624 113.6c-1.5 13.12 7.999 24.1 21.12 26.5c16.75 1.1 25.5-11.87 26.5-21.12c4.625-39.75 6.624-79.75 5.999-119.7C438.6 165.3 355.1 83.64 253.1 82.14zM506.1 203.6c-2.875-12.1-15.51-21.25-28.63-18.38c-12.1 2.875-21.12 15.75-18.25 28.62c4.75 21.5 4.875 37.5 4.75 61.62c-.1249 13.25 10.5 24.12 23.75 24.25c13.12 0 24.12-10.62 24.25-23.87C512.1 253.8 512.3 231.8 506.1 203.6zM465.1 112.9c-48.75-69.37-128.4-111.7-213.3-112.9c-69.74-.875-134.2 24.84-182.2 72.96c-46.37 46.37-71.34 108-70.34 173.6l-.125 21.5C-.3651 281.4 10.01 292.4 23.26 292.8C23.51 292.9 23.76 292.9 24.01 292.9c12.1 0 23.62-10.37 23.1-23.37l.125-23.62C47.38 193.4 67.25 144 104.4 106.9c38.87-38.75 91.37-59.62 147.7-58.87c69.37 .1 134.7 35.62 174.6 92.37c7.624 10.87 22.5 13.5 33.37 5.875C470.1 138.6 473.6 123.8 465.1 112.9z\"]\n};\nvar faFire = {\n  prefix: 'fas',\n  iconName: 'fire',\n  icon: [448, 512, [128293], \"f06d\", \"M323.5 51.25C302.8 70.5 284 90.75 267.4 111.1C240.1 73.62 206.2 35.5 168 0C69.75 91.12 0 210 0 281.6C0 408.9 100.2 512 224 512s224-103.1 224-230.4C448 228.4 396 118.5 323.5 51.25zM304.1 391.9C282.4 407 255.8 416 226.9 416c-72.13 0-130.9-47.73-130.9-125.2c0-38.63 24.24-72.64 72.74-130.8c7 8 98.88 125.4 98.88 125.4l58.63-66.88c4.125 6.75 7.867 13.52 11.24 19.9C364.9 290.6 353.4 357.4 304.1 391.9z\"]\n};\nvar faFireBurner = {\n  prefix: 'fas',\n  iconName: 'fire-burner',\n  icon: [640, 512, [], \"e4f1\", \"M349 61.49C356.9 51.61 365.8 40.76 375.5 31.99C381.1 26.87 389.9 26.89 395.5 32.03C420.2 54.71 441.1 84.69 455.8 113.2C470.4 141.2 480 169.9 480 190.1C480 277.9 408.7 352 320 352C230.3 352 160 277.8 160 190.1C160 163.7 172.7 131.5 192.4 99.52C212.4 67.16 240.5 33.43 273.8 3.734C279.4-1.26 287.1-1.242 293.5 3.773C313.3 21.55 331.8 40.74 349 61.49V61.49zM390 176.1C388 172.1 386 168.1 383 164.1L347 206.1C347 206.1 289 132.1 285 127.1C255 164.1 240 185.1 240 209.1C240 258.1 276 287.1 320.1 287.1C339 287.1 355 282.1 370 272.1C400 251.1 408 209.1 390 176.1zM32 287.1C32 270.3 46.33 255.1 64 255.1H96C113.7 255.1 128 270.3 128 287.1C128 305.7 113.7 319.1 96 319.1V384H544V319.1C526.3 319.1 512 305.7 512 287.1C512 270.3 526.3 255.1 544 255.1H576C593.7 255.1 608 270.3 608 287.1V384C625.7 384 640 398.3 640 416V480C640 497.7 625.7 512 608 512H32C14.33 512 0 497.7 0 480V416C0 398.3 14.33 384 32 384V287.1zM320 480C337.7 480 352 465.7 352 448C352 430.3 337.7 416 320 416C302.3 416 288 430.3 288 448C288 465.7 302.3 480 320 480zM448 416C430.3 416 416 430.3 416 448C416 465.7 430.3 480 448 480C465.7 480 480 465.7 480 448C480 430.3 465.7 416 448 416zM192 480C209.7 480 224 465.7 224 448C224 430.3 209.7 416 192 416C174.3 416 160 430.3 160 448C160 465.7 174.3 480 192 480z\"]\n};\nvar faFireExtinguisher = {\n  prefix: 'fas',\n  iconName: 'fire-extinguisher',\n  icon: [512, 512, [129519], \"f134\", \"M64 480c0 17.67 14.33 32 31.1 32H256c17.67 0 31.1-14.33 31.1-32l-.0001-32H64L64 480zM503.4 5.56c-5.453-4.531-12.61-6.406-19.67-5.188l-175.1 32c-11.41 2.094-19.7 12.03-19.7 23.63L224 56L224 32c0-17.67-14.33-32-31.1-32H160C142.3 0 128 14.33 128 32l.0002 26.81C69.59 69.32 20.5 110.6 1.235 168.4C-2.952 181 3.845 194.6 16.41 198.8C18.94 199.6 21.48 200 24 200c10.05 0 19.42-6.344 22.77-16.41C59.45 145.5 90.47 117.8 128 108L128 139.2C90.27 157.2 64 195.4 64 240L64 416h223.1l.0001-176c0-44.6-26.27-82.79-63.1-100.8L224 104l63.1-.002c0 11.59 8.297 21.53 19.7 23.62l175.1 31.1c1.438 .25 2.875 .375 4.297 .375c5.578 0 11.03-1.938 15.37-5.562c5.469-4.562 8.625-11.31 8.625-18.44V23.1C511.1 16.87 508.8 10.12 503.4 5.56zM176 96C167.2 96 160 88.84 160 80S167.2 64 176 64s15.1 7.164 15.1 16S184.8 96 176 96z\"]\n};\nvar faFireFlameCurved = {\n  prefix: 'fas',\n  iconName: 'fire-flame-curved',\n  icon: [384, 512, [\"fire-alt\"], \"f7e4\", \"M384 319.1C384 425.9 297.9 512 192 512s-192-86.13-192-192c0-58.67 27.82-106.8 54.57-134.1C69.54 169.3 96 179.8 96 201.5v85.5c0 35.17 27.97 64.5 63.16 64.94C194.9 352.5 224 323.6 224 288c0-88-175.1-96.12-52.15-277.2c13.5-19.72 44.15-10.77 44.15 13.03C215.1 127 384 149.7 384 319.1z\"]\n};\nvar faFireAlt = faFireFlameCurved;\nvar faFireFlameSimple = {\n  prefix: 'fas',\n  iconName: 'fire-flame-simple',\n  icon: [384, 512, [\"burn\"], \"f46a\", \"M203.1 4.365c-6.177-5.82-16.06-5.819-22.23-.0007C74.52 104.5 0 234.1 0 312C0 437.9 79 512 192 512s192-74.05 192-200C384 233.9 309 104.2 203.1 4.365zM192 432c-56.5 0-96-37.76-96-91.74c0-12.47 4.207-55.32 83.87-143c6.314-6.953 17.95-6.953 24.26 0C283.8 284.9 288 327.8 288 340.3C288 394.2 248.5 432 192 432z\"]\n};\nvar faBurn = faFireFlameSimple;\nvar faFish = {\n  prefix: 'fas',\n  iconName: 'fish',\n  icon: [576, 512, [128031], \"f578\", \"M180.5 141.5C219.7 108.5 272.6 80 336 80C399.4 80 452.3 108.5 491.5 141.5C530.5 174.5 558.3 213.1 572.4 241.3C577.2 250.5 577.2 261.5 572.4 270.7C558.3 298 530.5 337.5 491.5 370.5C452.3 403.5 399.4 432 336 432C272.6 432 219.7 403.5 180.5 370.5C164.3 356.7 150 341.9 137.8 327.3L48.12 379.6C35.61 386.9 19.76 384.9 9.474 374.7C-.8133 364.5-2.97 348.7 4.216 336.1L50 256L4.216 175.9C-2.97 163.3-.8133 147.5 9.474 137.3C19.76 127.1 35.61 125.1 48.12 132.4L137.8 184.7C150 170.1 164.3 155.3 180.5 141.5L180.5 141.5zM416 224C398.3 224 384 238.3 384 256C384 273.7 398.3 288 416 288C433.7 288 448 273.7 448 256C448 238.3 433.7 224 416 224z\"]\n};\nvar faFishFins = {\n  prefix: 'fas',\n  iconName: 'fish-fins',\n  icon: [576, 512, [], \"e4f2\", \"M352.8 96.61C407.7 100.6 454.3 123.6 490 150.4C529.2 179.8 557.3 215.1 571.7 239.9C577.4 249.9 577.4 262.1 571.7 272.1C557.3 296.9 529.2 332.2 490 361.6C454.3 388.4 407.7 411.4 352.8 415.4L275.2 473.6C264.6 481.6 250.2 482.1 238.9 475.1C227.7 468 222 454.7 224.6 441.7L234.3 393.1C214.1 384.1 197.5 373.2 181.1 361.6C166.6 350.1 152.1 337.7 141.2 325.3L48.12 379.6C35.61 386.9 19.76 384.9 9.475 374.7C-.8124 364.5-2.969 348.7 4.217 336.1L50 256L4.217 175.9C-2.969 163.3-.8124 147.5 9.475 137.3C19.76 127.1 35.61 125.1 48.12 132.4L141.2 186.7C152.1 174.3 166.6 161.9 181.1 150.4C197.5 138.8 214.1 127.9 234.3 118.9L224.6 70.28C222 57.27 227.7 44 238.9 36.93C250.2 29.85 264.6 30.44 275.2 38.4L352.8 96.61zM416 224C398.3 224 384 238.3 384 256C384 273.7 398.3 288 416 288C433.7 288 448 273.7 448 256C448 238.3 433.7 224 416 224z\"]\n};\nvar faFlag = {\n  prefix: 'fas',\n  iconName: 'flag',\n  icon: [512, 512, [61725, 127988], \"f024\", \"M64 496C64 504.8 56.75 512 48 512h-32C7.25 512 0 504.8 0 496V32c0-17.75 14.25-32 32-32s32 14.25 32 32V496zM476.3 0c-6.365 0-13.01 1.35-19.34 4.233c-45.69 20.86-79.56 27.94-107.8 27.94c-59.96 0-94.81-31.86-163.9-31.87C160.9 .3055 131.6 4.867 96 15.75v350.5c32-9.984 59.87-14.1 84.85-14.1c73.63 0 124.9 31.78 198.6 31.78c31.91 0 68.02-5.971 111.1-23.09C504.1 355.9 512 344.4 512 332.1V30.73C512 11.1 495.3 0 476.3 0z\"]\n};\nvar faFlagCheckered = {\n  prefix: 'fas',\n  iconName: 'flag-checkered',\n  icon: [576, 512, [127937], \"f11e\", \"M509.5 .0234c-6.145 0-12.53 1.344-18.64 4.227c-44.11 20.86-76.81 27.94-104.1 27.94c-57.89 0-91.53-31.86-158.2-31.87C195 .3203 153.3 8.324 96 32.38V32c0-17.75-14.25-32-32-32S32 14.25 32 32L31.96 496c0 8.75 7.25 16 16 16H80C88.75 512 96 504.8 96 496V384c51.74-23.86 92.71-31.82 128.3-31.82c71.09 0 120.6 31.78 191.7 31.78c30.81 0 65.67-5.969 108.1-23.09C536.3 355.9 544 344.4 544 332.1V30.74C544 12.01 527.8 .0234 509.5 .0234zM480 141.8c-31.99 14.04-57.81 20.59-80 22.49v80.21c25.44-1.477 51.59-6.953 80-17.34V308.9c-22.83 7.441-43.93 11.08-64.03 11.08c-5.447 0-10.71-.4258-15.97-.8906V244.5c-4.436 .2578-8.893 .6523-13.29 .6523c-25.82 0-47.35-4.547-66.71-10.08v66.91c-23.81-6.055-50.17-11.41-80-12.98V213.1C236.2 213.7 232.5 213.3 228.5 213.3C208.8 213.3 185.1 217.7 160 225.1v69.1C139.2 299.4 117.9 305.8 96 314.4V250.7l24.77-10.39C134.8 234.5 147.6 229.9 160 225.1V143.4C140.9 148.5 120.1 155.2 96 165.3V101.8l24.77-10.39C134.8 85.52 147.6 80.97 160 77.02v66.41c26.39-6.953 49.09-10.17 68.48-10.16c4.072 0 7.676 .4453 11.52 .668V65.03C258.6 66.6 274.4 71.55 293.2 77.83C301.7 80.63 310.7 83.45 320 86.12v66.07c20.79 6.84 41.45 12.96 66.71 12.96c4.207 0 8.781-.4766 13.29-.8594V95.54c25.44-1.477 51.59-6.953 80-17.34V141.8zM240 133.9v80.04c18.61 1.57 34.37 6.523 53.23 12.8C301.7 229.6 310.7 232.4 320 235.1V152.2C296.1 144.3 271.6 135.8 240 133.9z\"]\n};\nvar faFlagUsa = {\n  prefix: 'fas',\n  iconName: 'flag-usa',\n  icon: [576, 512, [], \"f74d\", \"M544 61.63V30.74c0-25-28.81-37.99-53.17-26.49C306.3 91.5 321.5-62.25 96 32.38V32c0-17.75-14.25-32-32-32S32 14.25 32 32L31.96 496c0 8.75 7.25 16 15.1 16H80C88.75 512 96 504.8 96 496V384c200-92.25 238.8 53.25 428.1-23.12C536.3 355.9 544 344.4 544 332.1V296.1c-46.98 17.25-86.42 24.12-120.8 24.12c-40.25-.125-74.17-8.5-107.7-16.62C254 288.5 195.3 274.8 96 314.8v-34.5c102-37.63 166.5-22.75 228.4-7.625C385.1 287.8 444.7 301.4 544 261.5V200c-46.98 17.25-86.42 24.12-120.8 24.12c-40.25 0-74.17-8.375-107.7-16.5C254 192.5 195.3 178.8 96 218.8v-34.5c102-37.5 166.5-22.62 228.4-7.5C385.1 191.8 444.7 205.4 544 165.6V96.75c-57.75 23.5-100.4 31.38-135.8 31.38c-62.96 0-118.9-27.09-120.2-27.38V67.5C331.9 78.94 390.1 128.3 544 61.63zM160 136c-8.75 0-16-7.125-16-16s7.25-16 16-16s16 7.125 16 16S168.8 136 160 136zM160 72c-8.75 0-16-7-16-16c0-8.75 7.25-16 16-16s16 7.125 16 16S168.8 72 160 72zM224 128C215.3 128 208 120.9 208 112S215.3 96 224 96s16 7 16 16C240 120.8 232.8 128 224 128zM224 64.25c-8.75 0-16-7-16-16c0-8.75 7.25-16 16-16s16 7.125 16 16S232.8 64.25 224 64.25z\"]\n};\nvar faFlask = {\n  prefix: 'fas',\n  iconName: 'flask',\n  icon: [448, 512, [], \"f0c3\", \"M437.2 403.5L319.1 215L319.1 64h7.1c13.25 0 23.1-10.75 23.1-24l-.0002-16c0-13.25-10.75-24-23.1-24H120C106.8 0 96.01 10.75 96.01 24l-.0002 16c0 13.25 10.75 24 23.1 24h7.1L128 215l-117.2 188.5C-18.48 450.6 15.27 512 70.89 512h306.2C432.7 512 466.5 450.5 437.2 403.5zM137.1 320l48.15-77.63C189.8 237.3 191.9 230.8 191.9 224l.0651-160h63.99l-.06 160c0 6.875 2.25 13.25 5.875 18.38L309.9 320H137.1z\"]\n};\nvar faFlaskVial = {\n  prefix: 'fas',\n  iconName: 'flask-vial',\n  icon: [640, 512, [], \"e4f3\", \"M160 442.5C149.1 446.1 139.2 448 128 448C74.98 448 32 405 32 352V64C14.33 64 0 49.67 0 32C0 14.33 14.33 0 32 0H224C241.7 0 256 14.33 256 32C256 49.67 241.7 64 224 64V309.9L175 389.4C165.2 405.4 160 423.8 160 442.5zM96 160H160V64H96V160zM512 0C529.7 0 544 14.33 544 32C544 49.67 529.7 64 512 64V214.9L629.7 406.2C636.4 417.2 640 429.7 640 442.6C640 480.9 608.9 512 570.6 512H261.4C223.1 512 191.1 480.9 191.1 442.6C191.1 429.7 195.6 417.2 202.3 406.2L319.1 214.9V64C302.3 64 287.1 49.67 287.1 32C287.1 14.33 302.3 0 319.1 0L512 0zM384 64V224C384 229.9 382.4 235.7 379.3 240.8L330.5 320H501.5L452.7 240.8C449.6 235.7 448 229.9 448 224V64H384z\"]\n};\nvar faFloppyDisk = {\n  prefix: 'fas',\n  iconName: 'floppy-disk',\n  icon: [448, 512, [128426, 128190, \"save\"], \"f0c7\", \"M433.1 129.1l-83.9-83.9C342.3 38.32 327.1 32 316.1 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V163.9C448 152.9 441.7 137.7 433.1 129.1zM224 416c-35.34 0-64-28.66-64-64s28.66-64 64-64s64 28.66 64 64S259.3 416 224 416zM320 208C320 216.8 312.8 224 304 224h-224C71.16 224 64 216.8 64 208v-96C64 103.2 71.16 96 80 96h224C312.8 96 320 103.2 320 112V208z\"]\n};\nvar faSave = faFloppyDisk;\nvar faFlorinSign = {\n  prefix: 'fas',\n  iconName: 'florin-sign',\n  icon: [384, 512, [], \"e184\", \"M352 32C369.7 32 384 46.33 384 64C384 81.67 369.7 96 352 96H314.7C301.7 96 290.1 103.8 285.1 115.7L240 224H320C337.7 224 352 238.3 352 256C352 273.7 337.7 288 320 288H213.3L157.9 420.9C143 456.7 108.1 480 69.33 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H69.33C82.25 416 93.9 408.2 98.87 396.3L144 288H64C46.33 288 32 273.7 32 256C32 238.3 46.33 224 64 224H170.7L226.1 91.08C240.1 55.3 275.9 32 314.7 32H352z\"]\n};\nvar faFolder = {\n  prefix: 'fas',\n  iconName: 'folder',\n  icon: [512, 512, [128447, 61716, 128193, \"folder-blank\"], \"f07b\", \"M512 144v288c0 26.5-21.5 48-48 48h-416C21.5 480 0 458.5 0 432v-352C0 53.5 21.5 32 48 32h160l64 64h192C490.5 96 512 117.5 512 144z\"]\n};\nvar faFolderBlank = faFolder;\nvar faFolderClosed = {\n  prefix: 'fas',\n  iconName: 'folder-closed',\n  icon: [512, 512, [], \"e185\", \"M464 96h-192l-64-64h-160C21.5 32 0 53.5 0 80V160h512V144C512 117.5 490.5 96 464 96zM0 432C0 458.5 21.5 480 48 480h416c26.5 0 48-21.5 48-48V192H0V432z\"]\n};\nvar faFolderMinus = {\n  prefix: 'fas',\n  iconName: 'folder-minus',\n  icon: [512, 512, [], \"f65d\", \"M464 96h-192l-64-64h-160C21.5 32 0 53.5 0 80v352C0 458.5 21.5 480 48 480h416c26.5 0 48-21.5 48-48v-288C512 117.5 490.5 96 464 96zM336 311.1H175.1C162.7 311.1 152 301.3 152 288c0-13.26 10.74-23.1 23.1-23.1h160C349.3 264 360 274.7 360 288S349.3 311.1 336 311.1z\"]\n};\nvar faFolderOpen = {\n  prefix: 'fas',\n  iconName: 'folder-open',\n  icon: [576, 512, [128449, 61717, 128194], \"f07c\", \"M147.8 192H480V144C480 117.5 458.5 96 432 96h-160l-64-64h-160C21.49 32 0 53.49 0 80v328.4l90.54-181.1C101.4 205.6 123.4 192 147.8 192zM543.1 224H147.8C135.7 224 124.6 230.8 119.2 241.7L0 480h447.1c12.12 0 23.2-6.852 28.62-17.69l96-192C583.2 249 567.7 224 543.1 224z\"]\n};\nvar faFolderPlus = {\n  prefix: 'fas',\n  iconName: 'folder-plus',\n  icon: [512, 512, [], \"f65e\", \"M464 96h-192l-64-64h-160C21.5 32 0 53.5 0 80v352C0 458.5 21.5 480 48 480h416c26.5 0 48-21.5 48-48v-288C512 117.5 490.5 96 464 96zM336 311.1h-56v56C279.1 381.3 269.3 392 256 392c-13.27 0-23.1-10.74-23.1-23.1V311.1H175.1C162.7 311.1 152 301.3 152 288c0-13.26 10.74-23.1 23.1-23.1h56V207.1C232 194.7 242.7 184 256 184s23.1 10.74 23.1 23.1V264h56C349.3 264 360 274.7 360 288S349.3 311.1 336 311.1z\"]\n};\nvar faFolderTree = {\n  prefix: 'fas',\n  iconName: 'folder-tree',\n  icon: [576, 512, [], \"f802\", \"M544 32h-112l-32-32H320c-17.62 0-32 14.38-32 32v160c0 17.62 14.38 32 32 32h224c17.62 0 32-14.38 32-32V64C576 46.38 561.6 32 544 32zM544 320h-112l-32-32H320c-17.62 0-32 14.38-32 32v160c0 17.62 14.38 32 32 32h224c17.62 0 32-14.38 32-32v-128C576 334.4 561.6 320 544 320zM64 16C64 7.125 56.88 0 48 0h-32C7.125 0 0 7.125 0 16V416c0 17.62 14.38 32 32 32h224v-64H64V160h192V96H64V16z\"]\n};\nvar faFont = {\n  prefix: 'fas',\n  iconName: 'font',\n  icon: [448, 512, [], \"f031\", \"M416 416h-25.81L253.1 52.76c-4.688-12.47-16.57-20.76-29.91-20.76s-25.34 8.289-30.02 20.76L57.81 416H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h96c17.67 0 32-14.31 32-32s-14.33-32-32-32H126.2l17.1-48h159.6l17.1 48H320c-17.67 0-32 14.31-32 32s14.33 32 32 32h96c17.67 0 32-14.31 32-32S433.7 416 416 416zM168.2 304L224 155.1l55.82 148.9H168.2z\"]\n};\nvar faFontAwesome = {\n  prefix: 'fas',\n  iconName: 'font-awesome',\n  icon: [448, 512, [62694, \"font-awesome-flag\", \"font-awesome-logo-full\"], \"f2b4\", \"M448 48V384c-63.09 22.54-82.34 32-119.5 32c-62.82 0-86.6-32-149.3-32C158.6 384 142.6 387.6 128 392.2v-64C142.6 323.6 158.6 320 179.2 320c62.73 0 86.51 32 149.3 32C348.9 352 364.1 349 384 342.7v-208C364.1 141 348.9 144 328.5 144c-62.82 0-86.6-32-149.3-32C128.4 112 104.3 132.6 64 140.7v307.3C64 465.7 49.67 480 32 480S0 465.7 0 448V63.1C0 46.33 14.33 32 31.1 32S64 46.33 64 63.1V76.66C104.3 68.63 128.4 48 179.2 48c62.73 0 86.51 32 149.3 32C365.7 80 384.9 70.54 448 48z\"]\n};\nvar faFontAwesomeFlag = faFontAwesome;\nvar faFontAwesomeLogoFull = faFontAwesome;\nvar faFootball = {\n  prefix: 'fas',\n  iconName: 'football',\n  icon: [512, 512, [127944, \"football-ball\"], \"f44e\", \"M16.17 337.5c0 44.98 7.565 83.54 13.98 107.9C35.22 464.3 50.46 496 174.9 496c9.566 0 19.59-.4707 29.84-1.271L17.33 307.3C16.53 317.6 16.17 327.7 16.17 337.5zM495.8 174.5c0-44.98-7.565-83.53-13.98-107.9c-4.688-17.54-18.34-31.23-36.04-35.95C435.5 27.91 392.9 16 337 16c-9.564 0-19.59 .4707-29.84 1.271l187.5 187.5C495.5 194.4 495.8 184.3 495.8 174.5zM26.77 248.8l236.3 236.3c142-36.1 203.9-150.4 222.2-221.1L248.9 26.87C106.9 62.96 45.07 177.2 26.77 248.8zM256 335.1c0 9.141-7.474 16-16 16c-4.094 0-8.188-1.564-11.31-4.689L164.7 283.3C161.6 280.2 160 276.1 160 271.1c0-8.529 6.865-16 16-16c4.095 0 8.189 1.562 11.31 4.688l64.01 64C254.4 327.8 256 331.9 256 335.1zM304 287.1c0 9.141-7.474 16-16 16c-4.094 0-8.188-1.564-11.31-4.689L212.7 235.3C209.6 232.2 208 228.1 208 223.1c0-9.141 7.473-16 16-16c4.094 0 8.188 1.562 11.31 4.688l64.01 64.01C302.5 279.8 304 283.9 304 287.1zM256 175.1c0-9.141 7.473-16 16-16c4.094 0 8.188 1.562 11.31 4.688l64.01 64.01c3.125 3.125 4.688 7.219 4.688 11.31c0 9.133-7.468 16-16 16c-4.094 0-8.189-1.562-11.31-4.688l-64.01-64.01C257.6 184.2 256 180.1 256 175.1z\"]\n};\nvar faFootballBall = faFootball;\nvar faForward = {\n  prefix: 'fas',\n  iconName: 'forward',\n  icon: [512, 512, [9193], \"f04e\", \"M52.51 440.6l171.5-142.9V214.3L52.51 71.41C31.88 54.28 0 68.66 0 96.03v319.9C0 443.3 31.88 457.7 52.51 440.6zM308.5 440.6l192-159.1c15.25-12.87 15.25-36.37 0-49.24l-192-159.1c-20.63-17.12-52.51-2.749-52.51 24.62v319.9C256 443.3 287.9 457.7 308.5 440.6z\"]\n};\nvar faForwardFast = {\n  prefix: 'fas',\n  iconName: 'forward-fast',\n  icon: [512, 512, [9197, \"fast-forward\"], \"f050\", \"M512 96.03v319.9c0 17.67-14.33 31.1-31.1 31.1C462.3 447.1 448 433.6 448 415.1V284.1l-171.5 156.5C255.9 457.7 224 443.3 224 415.1V284.1l-171.5 156.5C31.88 457.7 0 443.3 0 415.1V96.03c0-27.37 31.88-41.74 52.5-24.62L224 226.8V96.03c0-27.37 31.88-41.74 52.5-24.62L448 226.8V96.03c0-17.67 14.33-31.1 31.1-31.1C497.7 64.03 512 78.36 512 96.03z\"]\n};\nvar faFastForward = faForwardFast;\nvar faForwardStep = {\n  prefix: 'fas',\n  iconName: 'forward-step',\n  icon: [320, 512, [\"step-forward\"], \"f051\", \"M287.1 447.1c17.67 0 31.1-14.33 31.1-32V96.03c0-17.67-14.33-32-32-32c-17.67 0-31.1 14.33-31.1 31.1v319.9C255.1 433.6 270.3 447.1 287.1 447.1zM52.51 440.6l192-159.1c7.625-6.436 11.43-15.53 11.43-24.62c0-9.094-3.809-18.18-11.43-24.62l-192-159.1C31.88 54.28 0 68.66 0 96.03v319.9C0 443.3 31.88 457.7 52.51 440.6z\"]\n};\nvar faStepForward = faForwardStep;\nvar faFrancSign = {\n  prefix: 'fas',\n  iconName: 'franc-sign',\n  icon: [320, 512, [], \"e18f\", \"M288 32C305.7 32 320 46.33 320 64C320 81.67 305.7 96 288 96H112V192H256C273.7 192 288 206.3 288 224C288 241.7 273.7 256 256 256H112V320H192C209.7 320 224 334.3 224 352C224 369.7 209.7 384 192 384H112V448C112 465.7 97.67 480 80 480C62.33 480 48 465.7 48 448V384H32C14.33 384 0 369.7 0 352C0 334.3 14.33 320 32 320H48V64C48 46.33 62.33 32 80 32H288z\"]\n};\nvar faFrog = {\n  prefix: 'fas',\n  iconName: 'frog',\n  icon: [576, 512, [], \"f52e\", \"M528 416h-32.07l-90.32-96.34l140.6-79.03c18.38-10.25 29.75-29.62 29.75-50.62c0-21.5-11.75-41-30.5-51.25c-40.5-22.25-99.07-41.43-99.07-41.43C439.6 60.19 407.3 32 368 32s-71.77 28.25-78.52 65.5C126.7 113-.4999 250.1 .0001 417C.1251 451.9 29.13 480 64 480h304c8.875 0 16-7.125 16-16c0-26.51-21.49-48-47.1-48H284.3l23.93-32.38c24.25-36.13 10.38-88.25-33.63-106.5C250.8 267.1 223 272.4 202.4 288L169.6 312.5c-7.125 5.375-17.12 4-22.38-3.125c-5.375-7.125-4-17.12 3.125-22.38l34.75-26.12c36.87-27.62 88.37-27.62 125.1 0c10.88 8.125 45.88 39 40.88 93.13L469.6 480h90.38c8.875 0 16-7.125 16-16C576 437.5 554.5 416 528 416zM344 112c0-13.25 10.75-24 24-24s24 10.75 24 24s-10.75 24-24 24S344 125.3 344 112z\"]\n};\nvar faFutbol = {\n  prefix: 'fas',\n  iconName: 'futbol',\n  icon: [512, 512, [9917, \"futbol-ball\", \"soccer-ball\"], \"f1e3\", \"M177.1 228.6L207.9 320h96.5l29.62-91.38L256 172.1L177.1 228.6zM255.1 0C114.6 0 .0001 114.6 .0001 256S114.6 512 256 512s255.1-114.6 255.1-255.1S397.4 0 255.1 0zM416.6 360.9l-85.4-1.297l-25.15 81.59C290.1 445.5 273.4 448 256 448s-34.09-2.523-50.09-6.859L180.8 359.6l-85.4 1.297c-18.12-27.66-29.15-60.27-30.88-95.31L134.3 216.4L106.6 135.6c21.16-26.21 49.09-46.61 81.06-58.84L256 128l68.29-51.22c31.98 12.23 59.9 32.64 81.06 58.84L377.7 216.4l69.78 49.1C445.8 300.6 434.8 333.2 416.6 360.9z\"]\n};\nvar faFutbolBall = faFutbol;\nvar faSoccerBall = faFutbol;\nvar faG = {\n  prefix: 'fas',\n  iconName: 'g',\n  icon: [448, 512, [103], \"47\", \"M448 256c0 143.4-118.6 222.3-225 222.3c-132.3 0-222.1-106.2-222.1-222.4c0-124.4 100.9-223.9 223.1-223.9c84.84 0 167.8 55.28 167.8 88.2c0 18.28-14.95 32-32 32c-31.04 0-46.79-56.16-135.8-56.16c-87.66 0-159.1 70.66-159.1 159.8c0 34.81 27.19 158.8 159.1 158.8c79.45 0 144.6-55.1 158.1-126.7h-134.1c-17.67 0-32-14.33-32-32s14.33-31.1 32-31.1H416C433.7 224 448 238.3 448 256z\"]\n};\nvar faGamepad = {\n  prefix: 'fas',\n  iconName: 'gamepad',\n  icon: [640, 512, [], \"f11b\", \"M448 64H192C85.96 64 0 149.1 0 256s85.96 192 192 192h256c106 0 192-85.96 192-192S554 64 448 64zM247.1 280h-32v32c0 13.2-10.78 24-23.98 24c-13.2 0-24.02-10.8-24.02-24v-32L136 279.1C122.8 279.1 111.1 269.2 111.1 256c0-13.2 10.85-24.01 24.05-24.01L167.1 232v-32c0-13.2 10.82-24 24.02-24c13.2 0 23.98 10.8 23.98 24v32h32c13.2 0 24.02 10.8 24.02 24C271.1 269.2 261.2 280 247.1 280zM431.1 344c-22.12 0-39.1-17.87-39.1-39.1s17.87-40 39.1-40s39.1 17.88 39.1 40S454.1 344 431.1 344zM495.1 248c-22.12 0-39.1-17.87-39.1-39.1s17.87-40 39.1-40c22.12 0 39.1 17.88 39.1 40S518.1 248 495.1 248z\"]\n};\nvar faGasPump = {\n  prefix: 'fas',\n  iconName: 'gas-pump',\n  icon: [512, 512, [9981], \"f52f\", \"M32 64C32 28.65 60.65 0 96 0H256C291.3 0 320 28.65 320 64V256H328C376.6 256 416 295.4 416 344V376C416 389.3 426.7 400 440 400C453.3 400 464 389.3 464 376V221.1C436.4 214.9 416 189.8 416 160V96L384 64C375.2 55.16 375.2 40.84 384 32C392.8 23.16 407.2 23.16 416 32L493.3 109.3C505.3 121.3 512 137.5 512 154.5V376C512 415.8 479.8 448 440 448C400.2 448 368 415.8 368 376V344C368 321.9 350.1 303.1 328 303.1H320V448C337.7 448 352 462.3 352 480C352 497.7 337.7 512 320 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V64zM96 176C96 184.8 103.2 192 112 192H240C248.8 192 256 184.8 256 176V80C256 71.16 248.8 64 240 64H112C103.2 64 96 71.16 96 80V176z\"]\n};\nvar faGauge = {\n  prefix: 'fas',\n  iconName: 'gauge',\n  icon: [512, 512, [\"dashboard\", \"gauge-med\", \"tachometer-alt-average\"], \"f624\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM280 292.7V88C280 74.75 269.3 64 256 64C242.7 64 232 74.75 232 88V292.7C208.5 302.1 192 325.1 192 352C192 387.3 220.7 416 256 416C291.3 416 320 387.3 320 352C320 325.1 303.5 302.1 280 292.7zM144 176C161.7 176 176 161.7 176 144C176 126.3 161.7 112 144 112C126.3 112 112 126.3 112 144C112 161.7 126.3 176 144 176zM96 224C78.33 224 64 238.3 64 256C64 273.7 78.33 288 96 288C113.7 288 128 273.7 128 256C128 238.3 113.7 224 96 224zM416 288C433.7 288 448 273.7 448 256C448 238.3 433.7 224 416 224C398.3 224 384 238.3 384 256C384 273.7 398.3 288 416 288zM368 112C350.3 112 336 126.3 336 144C336 161.7 350.3 176 368 176C385.7 176 400 161.7 400 144C400 126.3 385.7 112 368 112z\"]\n};\nvar faDashboard = faGauge;\nvar faGaugeMed = faGauge;\nvar faTachometerAltAverage = faGauge;\nvar faGaugeHigh = {\n  prefix: 'fas',\n  iconName: 'gauge-high',\n  icon: [512, 512, [62461, \"tachometer-alt\", \"tachometer-alt-fast\"], \"f625\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 64C238.3 64 224 78.33 224 96C224 113.7 238.3 128 256 128C273.7 128 288 113.7 288 96C288 78.33 273.7 64 256 64zM256 416C291.3 416 320 387.3 320 352C320 334.6 313.1 318.9 301.9 307.4L365.1 161.7C371.3 149.5 365.8 135.4 353.7 130C341.5 124.7 327.4 130.2 322 142.3L257.9 288C257.3 288 256.6 287.1 256 287.1C220.7 287.1 192 316.7 192 352C192 387.3 220.7 416 256 416V416zM144 112C126.3 112 112 126.3 112 144C112 161.7 126.3 176 144 176C161.7 176 176 161.7 176 144C176 126.3 161.7 112 144 112zM96 288C113.7 288 128 273.7 128 256C128 238.3 113.7 224 96 224C78.33 224 64 238.3 64 256C64 273.7 78.33 288 96 288zM416 224C398.3 224 384 238.3 384 256C384 273.7 398.3 288 416 288C433.7 288 448 273.7 448 256C448 238.3 433.7 224 416 224z\"]\n};\nvar faTachometerAlt = faGaugeHigh;\nvar faTachometerAltFast = faGaugeHigh;\nvar faGaugeSimple = {\n  prefix: 'fas',\n  iconName: 'gauge-simple',\n  icon: [512, 512, [\"gauge-simple-med\", \"tachometer-average\"], \"f629\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM280 292.7V88C280 74.75 269.3 64 256 64C242.7 64 232 74.75 232 88V292.7C208.5 302.1 192 325.1 192 352C192 387.3 220.7 416 256 416C291.3 416 320 387.3 320 352C320 325.1 303.5 302.1 280 292.7z\"]\n};\nvar faGaugeSimpleMed = faGaugeSimple;\nvar faTachometerAverage = faGaugeSimple;\nvar faGaugeSimpleHigh = {\n  prefix: 'fas',\n  iconName: 'gauge-simple-high',\n  icon: [512, 512, [61668, \"tachometer\", \"tachometer-fast\"], \"f62a\", \"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM304.7 310.4L381.3 163.1C387.4 151.3 382.8 136.8 371.1 130.7C359.3 124.6 344.8 129.2 338.7 140.9L262.1 288.3C260.1 288.1 258.1 287.1 255.1 287.1C220.7 287.1 191.1 316.7 191.1 352C191.1 387.3 220.7 416 255.1 416C291.3 416 320 387.3 320 352C320 336.1 314.2 321.6 304.7 310.4L304.7 310.4z\"]\n};\nvar faTachometer = faGaugeSimpleHigh;\nvar faTachometerFast = faGaugeSimpleHigh;\nvar faGavel = {\n  prefix: 'fas',\n  iconName: 'gavel',\n  icon: [512, 512, [\"legal\"], \"f0e3\", \"M512 216.3c0-6.125-2.344-12.25-7.031-16.93L482.3 176.8c-4.688-4.686-10.84-7.028-16.1-7.028s-12.31 2.343-16.1 7.028l-5.625 5.625L329.6 69.28l5.625-5.625c4.687-4.688 7.03-10.84 7.03-16.1s-2.343-12.31-7.03-16.1l-22.62-22.62C307.9 2.344 301.8 0 295.7 0s-12.15 2.344-16.84 7.031L154.2 131.5C149.6 136.2 147.2 142.3 147.2 148.5s2.344 12.25 7.031 16.94l22.62 22.62c4.688 4.688 10.84 7.031 16.1 7.031c6.156 0 12.31-2.344 16.1-7.031l5.625-5.625l113.1 113.1l-5.625 5.621c-4.688 4.688-7.031 10.84-7.031 16.1s2.344 12.31 7.031 16.1l22.62 22.62c4.688 4.688 10.81 7.031 16.94 7.031s12.25-2.344 16.94-7.031l124.5-124.6C509.7 228.5 512 222.5 512 216.3zM227.8 238.1L169.4 297.4C163.1 291.1 154.9 288 146.7 288S130.4 291.1 124.1 297.4l-114.7 114.7c-6.25 6.248-9.375 14.43-9.375 22.62s3.125 16.37 9.375 22.62l45.25 45.25C60.87 508.9 69.06 512 77.25 512s16.37-3.125 22.62-9.375l114.7-114.7c6.25-6.25 9.376-14.44 9.376-22.62c0-8.185-3.125-16.37-9.374-22.62l58.43-58.43L227.8 238.1z\"]\n};\nvar faLegal = faGavel;\nvar faGear = {\n  prefix: 'fas',\n  iconName: 'gear',\n  icon: [512, 512, [9881, \"cog\"], \"f013\", \"M495.9 166.6C499.2 175.2 496.4 184.9 489.6 191.2L446.3 230.6C447.4 238.9 448 247.4 448 256C448 264.6 447.4 273.1 446.3 281.4L489.6 320.8C496.4 327.1 499.2 336.8 495.9 345.4C491.5 357.3 486.2 368.8 480.2 379.7L475.5 387.8C468.9 398.8 461.5 409.2 453.4 419.1C447.4 426.2 437.7 428.7 428.9 425.9L373.2 408.1C359.8 418.4 344.1 427 329.2 433.6L316.7 490.7C314.7 499.7 307.7 506.1 298.5 508.5C284.7 510.8 270.5 512 255.1 512C241.5 512 227.3 510.8 213.5 508.5C204.3 506.1 197.3 499.7 195.3 490.7L182.8 433.6C167 427 152.2 418.4 138.8 408.1L83.14 425.9C74.3 428.7 64.55 426.2 58.63 419.1C50.52 409.2 43.12 398.8 36.52 387.8L31.84 379.7C25.77 368.8 20.49 357.3 16.06 345.4C12.82 336.8 15.55 327.1 22.41 320.8L65.67 281.4C64.57 273.1 64 264.6 64 256C64 247.4 64.57 238.9 65.67 230.6L22.41 191.2C15.55 184.9 12.82 175.3 16.06 166.6C20.49 154.7 25.78 143.2 31.84 132.3L36.51 124.2C43.12 113.2 50.52 102.8 58.63 92.95C64.55 85.8 74.3 83.32 83.14 86.14L138.8 103.9C152.2 93.56 167 84.96 182.8 78.43L195.3 21.33C197.3 12.25 204.3 5.04 213.5 3.51C227.3 1.201 241.5 0 256 0C270.5 0 284.7 1.201 298.5 3.51C307.7 5.04 314.7 12.25 316.7 21.33L329.2 78.43C344.1 84.96 359.8 93.56 373.2 103.9L428.9 86.14C437.7 83.32 447.4 85.8 453.4 92.95C461.5 102.8 468.9 113.2 475.5 124.2L480.2 132.3C486.2 143.2 491.5 154.7 495.9 166.6V166.6zM256 336C300.2 336 336 300.2 336 255.1C336 211.8 300.2 175.1 256 175.1C211.8 175.1 176 211.8 176 255.1C176 300.2 211.8 336 256 336z\"]\n};\nvar faCog = faGear;\nvar faGears = {\n  prefix: 'fas',\n  iconName: 'gears',\n  icon: [640, 512, [\"cogs\"], \"f085\", \"M286.3 155.1C287.4 161.9 288 168.9 288 175.1C288 183.1 287.4 190.1 286.3 196.9L308.5 216.7C315.5 223 318.4 232.1 314.7 241.7C312.4 246.1 309.9 252.2 307.1 257.2L304 262.6C300.1 267.6 297.7 272.4 294.2 277.1C288.5 284.7 278.5 287.2 269.5 284.2L241.2 274.9C230.5 283.8 218.3 290.9 205 295.9L198.1 324.9C197 334.2 189.8 341.6 180.4 342.8C173.7 343.6 166.9 344 160 344C153.1 344 146.3 343.6 139.6 342.8C130.2 341.6 122.1 334.2 121 324.9L114.1 295.9C101.7 290.9 89.5 283.8 78.75 274.9L50.53 284.2C41.54 287.2 31.52 284.7 25.82 277.1C22.28 272.4 18.98 267.5 15.94 262.5L12.92 257.2C10.13 252.2 7.592 247 5.324 241.7C1.62 232.1 4.458 223 11.52 216.7L33.7 196.9C32.58 190.1 31.1 183.1 31.1 175.1C31.1 168.9 32.58 161.9 33.7 155.1L11.52 135.3C4.458 128.1 1.62 119 5.324 110.3C7.592 104.1 10.13 99.79 12.91 94.76L15.95 89.51C18.98 84.46 22.28 79.58 25.82 74.89C31.52 67.34 41.54 64.83 50.53 67.79L78.75 77.09C89.5 68.25 101.7 61.13 114.1 56.15L121 27.08C122.1 17.8 130.2 10.37 139.6 9.231C146.3 8.418 153.1 8 160 8C166.9 8 173.7 8.418 180.4 9.23C189.8 10.37 197 17.8 198.1 27.08L205 56.15C218.3 61.13 230.5 68.25 241.2 77.09L269.5 67.79C278.5 64.83 288.5 67.34 294.2 74.89C297.7 79.56 300.1 84.42 304 89.44L307.1 94.83C309.9 99.84 312.4 105 314.7 110.3C318.4 119 315.5 128.1 308.5 135.3L286.3 155.1zM160 127.1C133.5 127.1 112 149.5 112 175.1C112 202.5 133.5 223.1 160 223.1C186.5 223.1 208 202.5 208 175.1C208 149.5 186.5 127.1 160 127.1zM484.9 478.3C478.1 479.4 471.1 480 464 480C456.9 480 449.9 479.4 443.1 478.3L423.3 500.5C416.1 507.5 407 510.4 398.3 506.7C393 504.4 387.8 501.9 382.8 499.1L377.4 496C372.4 492.1 367.6 489.7 362.9 486.2C355.3 480.5 352.8 470.5 355.8 461.5L365.1 433.2C356.2 422.5 349.1 410.3 344.1 397L315.1 390.1C305.8 389 298.4 381.8 297.2 372.4C296.4 365.7 296 358.9 296 352C296 345.1 296.4 338.3 297.2 331.6C298.4 322.2 305.8 314.1 315.1 313L344.1 306.1C349.1 293.7 356.2 281.5 365.1 270.8L355.8 242.5C352.8 233.5 355.3 223.5 362.9 217.8C367.6 214.3 372.5 210.1 377.5 207.9L382.8 204.9C387.8 202.1 392.1 199.6 398.3 197.3C407 193.6 416.1 196.5 423.3 203.5L443.1 225.7C449.9 224.6 456.9 224 464 224C471.1 224 478.1 224.6 484.9 225.7L504.7 203.5C511 196.5 520.1 193.6 529.7 197.3C535 199.6 540.2 202.1 545.2 204.9L550.5 207.9C555.5 210.1 560.4 214.3 565.1 217.8C572.7 223.5 575.2 233.5 572.2 242.5L562.9 270.8C571.8 281.5 578.9 293.7 583.9 306.1L612.9 313C622.2 314.1 629.6 322.2 630.8 331.6C631.6 338.3 632 345.1 632 352C632 358.9 631.6 365.7 630.8 372.4C629.6 381.8 622.2 389 612.9 390.1L583.9 397C578.9 410.3 571.8 422.5 562.9 433.2L572.2 461.5C575.2 470.5 572.7 480.5 565.1 486.2C560.4 489.7 555.6 492.1 550.6 496L545.2 499.1C540.2 501.9 534.1 504.4 529.7 506.7C520.1 510.4 511 507.5 504.7 500.5L484.9 478.3zM512 352C512 325.5 490.5 304 464 304C437.5 304 416 325.5 416 352C416 378.5 437.5 400 464 400C490.5 400 512 378.5 512 352z\"]\n};\nvar faCogs = faGears;\nvar faGem = {\n  prefix: 'fas',\n  iconName: 'gem',\n  icon: [512, 512, [128142], \"f3a5\", \"M378.7 32H133.3L256 182.7L378.7 32zM512 192l-107.4-141.3L289.6 192H512zM107.4 50.67L0 192h222.4L107.4 50.67zM244.3 474.9C247.3 478.2 251.6 480 256 480s8.653-1.828 11.67-5.062L510.6 224H1.365L244.3 474.9z\"]\n};\nvar faGenderless = {\n  prefix: 'fas',\n  iconName: 'genderless',\n  icon: [384, 512, [], \"f22d\", \"M192 80C94.83 80 16 158.8 16 256c0 97.17 78.83 176 176 176s176-78.83 176-176C368 158.8 289.2 80 192 80zM192 352c-52.95 0-96-43.05-96-96c0-52.95 43.05-96 96-96s96 43.05 96 96C288 308.9 244.1 352 192 352z\"]\n};\nvar faGhost = {\n  prefix: 'fas',\n  iconName: 'ghost',\n  icon: [384, 512, [128123], \"f6e2\", \"M186.1 .1032c-105.1 3.126-186.1 94.75-186.1 199.9v264c0 14.25 17.3 21.38 27.3 11.25l24.95-18.5c6.625-5.001 16-4.001 21.5 2.25l43 48.31c6.25 6.251 16.37 6.251 22.62 0l40.62-45.81c6.375-7.251 17.62-7.251 24 0l40.63 45.81c6.25 6.251 16.38 6.251 22.62 0l43-48.31c5.5-6.251 14.88-7.251 21.5-2.25l24.95 18.5c10 10.13 27.3 3.002 27.3-11.25V192C384 83.98 294.9-3.147 186.1 .1032zM128 224c-17.62 0-31.1-14.38-31.1-32.01s14.38-32.01 31.1-32.01s32 14.38 32 32.01S145.6 224 128 224zM256 224c-17.62 0-32-14.38-32-32.01s14.38-32.01 32-32.01c17.62 0 32 14.38 32 32.01S273.6 224 256 224z\"]\n};\nvar faGift = {\n  prefix: 'fas',\n  iconName: 'gift',\n  icon: [512, 512, [127873], \"f06b\", \"M152 0H154.2C186.1 0 215.7 16.91 231.9 44.45L256 85.46L280.1 44.45C296.3 16.91 325.9 0 357.8 0H360C408.6 0 448 39.4 448 88C448 102.4 444.5 115.1 438.4 128H480C497.7 128 512 142.3 512 160V224C512 241.7 497.7 256 480 256H32C14.33 256 0 241.7 0 224V160C0 142.3 14.33 128 32 128H73.6C67.46 115.1 64 102.4 64 88C64 39.4 103.4 0 152 0zM190.5 68.78C182.9 55.91 169.1 48 154.2 48H152C129.9 48 112 65.91 112 88C112 110.1 129.9 128 152 128H225.3L190.5 68.78zM360 48H357.8C342.9 48 329.1 55.91 321.5 68.78L286.7 128H360C382.1 128 400 110.1 400 88C400 65.91 382.1 48 360 48V48zM32 288H224V512H80C53.49 512 32 490.5 32 464V288zM288 512V288H480V464C480 490.5 458.5 512 432 512H288z\"]\n};\nvar faGifts = {\n  prefix: 'fas',\n  iconName: 'gifts',\n  icon: [640, 512, [], \"f79c\", \"M192.5 55.09L217.9 36.59C228.6 28.79 243.6 31.16 251.4 41.88C259.2 52.6 256.8 67.61 246.1 75.41L217.8 95.1H240C256.9 95.1 271.7 104.7 280.3 117.9C257.3 135.7 241.9 162.1 240.2 193.1C212.5 201 192 226.1 192 256V480C192 491.7 195.1 502.6 200.6 512H48C21.49 512 0 490.5 0 464V144C0 117.5 21.49 96 48 96H70.2L41.88 75.41C31.16 67.61 28.79 52.6 36.59 41.88C44.39 31.16 59.4 28.79 70.12 36.59L97.55 56.54L89.23 31.59C85.04 19.01 91.84 5.423 104.4 1.232C116.1-2.96 130.6 3.836 134.8 16.41L144.7 46.17L155.4 15.99C159.8 3.493 173.5-3.048 186 1.377C198.5 5.802 205 19.52 200.6 32.01L192.5 55.09zM344.2 127.1C366.6 127.1 387.8 138.4 401.5 156.2L432 195.8L462.5 156.2C476.2 138.4 497.4 127.1 519.8 127.1C559.5 127.1 592 160.1 592 199.1C592 208.4 590.6 216.5 587.9 223.1H592C618.5 223.1 640 245.5 640 271.1V352H448V255.1H416V352H224V271.1C224 245.5 245.5 223.1 272 223.1H276.1C273.4 216.5 272 208.4 272 199.1C272 160.1 304.5 127.1 344.2 127.1H344.2zM363.5 185.5C358.9 179.5 351.7 175.1 344.2 175.1C330.8 175.1 320 186.9 320 199.1C320 213.3 330.7 223.1 344 223.1H393.1L363.5 185.5zM519.8 175.1C512.3 175.1 505.1 179.5 500.5 185.5L470.9 223.1H520C533.3 223.1 544 213.3 544 199.1C544 186.9 533.2 175.1 519.8 175.1H519.8zM224 464V384H416V512H272C245.5 512 224 490.5 224 464zM448 512V384H640V464C640 490.5 618.5 512 592 512H448z\"]\n};\nvar faGlassWater = {\n  prefix: 'fas',\n  iconName: 'glass-water',\n  icon: [384, 512, [], \"e4f4\", \"M352 0C360.9 0 369.4 3.692 375.4 10.19C381.5 16.69 384.6 25.42 383.9 34.28L355.1 437.7C352.1 479.6 317.3 512 275.3 512H108.7C66.72 512 31.89 479.6 28.9 437.7L.0813 34.28C-.5517 25.42 2.527 16.69 8.58 10.19C14.63 3.692 23.12 0 32 0L352 0zM97.19 168.6C116.6 178.3 139.4 178.3 158.8 168.6C179.7 158.1 204.3 158.1 225.2 168.6C244.6 178.3 267.4 178.3 286.8 168.6L311 156.5L317.6 64H66.37L72.97 156.5L97.19 168.6z\"]\n};\nvar faGlassWaterDroplet = {\n  prefix: 'fas',\n  iconName: 'glass-water-droplet',\n  icon: [384, 512, [], \"e4f5\", \"M256 196C256 229.1 227.3 256 192 256C156.7 256 128 229.1 128 196C128 171.1 161.7 125.9 180.2 102.5C186.3 94.77 197.7 94.77 203.8 102.5C222.3 125.9 256 171.1 256 196V196zM352 0C360.9 0 369.4 3.692 375.4 10.19C381.5 16.69 384.6 25.42 383.9 34.28L355.1 437.7C352.1 479.6 317.3 512 275.3 512H108.7C66.72 512 31.89 479.6 28.9 437.7L.0813 34.28C-.5517 25.42 2.527 16.69 8.58 10.19C14.63 3.692 23.12 0 32 0L352 0zM96 304C116.1 314.1 139.9 314.1 160 304C180.1 293.9 203.9 293.9 224 304C244.1 314.1 267.9 314.1 288 304L300.1 297.5L317.6 64H66.37L83.05 297.5L96 304z\"]\n};\nvar faGlasses = {\n  prefix: 'fas',\n  iconName: 'glasses',\n  icon: [576, 512, [], \"f530\", \"M574.1 280.4l-45.38-181.8c-5.875-23.63-21.62-44-43-55.75c-21.5-11.75-46.1-14.13-70.25-6.375l-15.25 5.125c-8.375 2.75-12.87 11.88-10 20.25l5 15.13c2.75 8.375 11.88 12.88 20.25 10.13l13.12-4.375c10.88-3.625 23-3.625 33.25 1.75c10.25 5.375 17.5 14.5 20.38 25.75l38.38 153.9c-22.12-6.875-49.75-12.5-81.13-12.5c-34.88 0-73.1 7-114.9 26.75H251.4C210.5 258.6 171.4 251.6 136.5 251.6c-31.38 0-59 5.625-81.12 12.5l38.38-153.9c2.875-11.25 10.12-20.38 20.5-25.75C124.4 79.12 136.5 79.12 147.4 82.74l13.12 4.375c8.375 2.75 17.5-1.75 20.25-10.13l5-15.13C188.6 53.49 184.1 44.37 175.6 41.62l-15.25-5.125c-23.13-7.75-48.75-5.375-70.13 6.375c-21.37 11.75-37.12 32.13-43 55.75L1.875 280.4C.6251 285.4 .0001 290.6 .0001 295.9v70.25C.0001 428.1 51.63 480 115.3 480h37.13c60.25 0 110.4-46 114.9-105.4l2.875-38.63h35.75l2.875 38.63C313.3 433.1 363.4 480 423.6 480h37.13c63.62 0 115.2-51 115.2-113.9V295.9C576 290.6 575.4 285.5 574.1 280.4zM203.4 369.7c-2 26-24.38 46.25-51 46.25H115.2C87 415.1 64 393.6 64 366.1v-37.5c18.12-6.5 43.38-13 72.62-13c23.88 0 47.25 4.375 69.88 13L203.4 369.7zM512 366.1c0 27.5-23 49.88-51.25 49.88h-37.13c-26.62 0-49-20.25-51-46.25l-3.125-41.13c22.62-8.625 46.13-13 70-13c29 0 54.38 6.5 72.5 13V366.1z\"]\n};\nvar faGlobe = {\n  prefix: 'fas',\n  iconName: 'globe',\n  icon: [512, 512, [127760], \"f0ac\", \"M352 256C352 278.2 350.8 299.6 348.7 320H163.3C161.2 299.6 159.1 278.2 159.1 256C159.1 233.8 161.2 212.4 163.3 192H348.7C350.8 212.4 352 233.8 352 256zM503.9 192C509.2 212.5 512 233.9 512 256C512 278.1 509.2 299.5 503.9 320H380.8C382.9 299.4 384 277.1 384 256C384 234 382.9 212.6 380.8 192H503.9zM493.4 160H376.7C366.7 96.14 346.9 42.62 321.4 8.442C399.8 29.09 463.4 85.94 493.4 160zM344.3 160H167.7C173.8 123.6 183.2 91.38 194.7 65.35C205.2 41.74 216.9 24.61 228.2 13.81C239.4 3.178 248.7 0 256 0C263.3 0 272.6 3.178 283.8 13.81C295.1 24.61 306.8 41.74 317.3 65.35C328.8 91.38 338.2 123.6 344.3 160H344.3zM18.61 160C48.59 85.94 112.2 29.09 190.6 8.442C165.1 42.62 145.3 96.14 135.3 160H18.61zM131.2 192C129.1 212.6 127.1 234 127.1 256C127.1 277.1 129.1 299.4 131.2 320H8.065C2.8 299.5 0 278.1 0 256C0 233.9 2.8 212.5 8.065 192H131.2zM194.7 446.6C183.2 420.6 173.8 388.4 167.7 352H344.3C338.2 388.4 328.8 420.6 317.3 446.6C306.8 470.3 295.1 487.4 283.8 498.2C272.6 508.8 263.3 512 255.1 512C248.7 512 239.4 508.8 228.2 498.2C216.9 487.4 205.2 470.3 194.7 446.6H194.7zM190.6 503.6C112.2 482.9 48.59 426.1 18.61 352H135.3C145.3 415.9 165.1 469.4 190.6 503.6V503.6zM321.4 503.6C346.9 469.4 366.7 415.9 376.7 352H493.4C463.4 426.1 399.8 482.9 321.4 503.6V503.6z\"]\n};\nvar faGolfBallTee = {\n  prefix: 'fas',\n  iconName: 'golf-ball-tee',\n  icon: [384, 512, [\"golf-ball\"], \"f450\", \"M96 399.1c0 17.67 14.33 31.1 32 31.1s32 14.33 32 31.1v48h64v-48c0-17.67 14.33-31.1 32-31.1s32-14.33 32-31.1v-16H96V399.1zM192 .0001c-106 0-192 86.68-192 193.6c0 65.78 32.82 123.5 82.52 158.4h218.1C351.2 317.1 384 259.4 384 193.6C384 86.68 298 .0001 192 .0001zM179 205.1C183 206.9 187.4 208 192 208c17.53 0 31.74-14.33 31.74-31.1c0-4.688-1.111-9.062-2.904-13.07c11.03 5.016 18.77 16.08 18.77 29.07c0 17.67-14.21 31.1-31.74 31.1C194.1 224 184 216.2 179 205.1zM223.7 303.1c-12.88 0-23.86-7.812-28.83-18.93c3.977 1.809 8.316 2.93 12.96 2.93c17.53 0 31.74-14.33 31.74-31.1c0-4.688-1.109-9.062-2.904-13.07c11.03 5.016 18.77 16.08 18.77 29.07C255.5 289.7 241.3 303.1 223.7 303.1zM287.2 240c-12.88 0-23.86-7.812-28.83-18.93c3.977 1.809 8.316 2.93 12.96 2.93c17.53 0 31.73-14.33 31.73-31.1c0-4.688-1.109-9.062-2.902-13.07C311.2 183.9 318.9 195 318.9 208C318.9 225.7 304.7 240 287.2 240z\"]\n};\nvar faGolfBall = faGolfBallTee;\nvar faGopuram = {\n  prefix: 'fas',\n  iconName: 'gopuram',\n  icon: [512, 512, [], \"f664\", \"M120 0C133.3 0 144 10.75 144 24V32H184V24C184 10.75 194.7 0 208 0C221.3 0 232 10.75 232 24V32H280V24C280 10.75 290.7 0 304 0C317.3 0 328 10.75 328 24V32H368V24C368 10.75 378.7 0 392 0C405.3 0 416 10.75 416 24V128C433.7 128 448 142.3 448 160V224C465.7 224 480 238.3 480 256V352C497.7 352 512 366.3 512 384V480C512 497.7 497.7 512 480 512H416V352H384V224H352V128H320V224H352V352H384V512H304V464C304 437.5 282.5 416 256 416C229.5 416 208 437.5 208 464V512H128V352H160V224H192V128H160V224H128V352H96V512H32C14.33 512 0 497.7 0 480V384C0 366.3 14.33 352 32 352V256C32 238.3 46.33 224 64 224V160C64 142.3 78.33 128 96 128V24C96 10.75 106.7 0 120 0zM256 272C238.3 272 224 286.3 224 304V352H288V304C288 286.3 273.7 272 256 272zM224 224H288V192C288 174.3 273.7 160 256 160C238.3 160 224 174.3 224 192V224z\"]\n};\nvar faGraduationCap = {\n  prefix: 'fas',\n  iconName: 'graduation-cap',\n  icon: [640, 512, [127891, \"mortar-board\"], \"f19d\", \"M623.1 136.9l-282.7-101.2c-13.73-4.91-28.7-4.91-42.43 0L16.05 136.9C6.438 140.4 0 149.6 0 160s6.438 19.65 16.05 23.09L76.07 204.6c-11.89 15.8-20.26 34.16-24.55 53.95C40.05 263.4 32 274.8 32 288c0 9.953 4.814 18.49 11.94 24.36l-24.83 149C17.48 471.1 25 480 34.89 480H93.11c9.887 0 17.41-8.879 15.78-18.63l-24.83-149C91.19 306.5 96 297.1 96 288c0-10.29-5.174-19.03-12.72-24.89c4.252-17.76 12.88-33.82 24.94-47.03l190.6 68.23c13.73 4.91 28.7 4.91 42.43 0l282.7-101.2C633.6 179.6 640 170.4 640 160S633.6 140.4 623.1 136.9zM351.1 314.4C341.7 318.1 330.9 320 320 320c-10.92 0-21.69-1.867-32-5.555L142.8 262.5L128 405.3C128 446.6 213.1 480 320 480c105.1 0 192-33.4 192-74.67l-14.78-142.9L351.1 314.4z\"]\n};\nvar faMortarBoard = faGraduationCap;\nvar faGreaterThan = {\n  prefix: 'fas',\n  iconName: 'greater-than',\n  icon: [384, 512, [62769], \"3e\", \"M32.03 448c-11.75 0-23.05-6.469-28.66-17.69c-7.906-15.81-1.5-35.03 14.31-42.94l262.8-131.4L17.69 124.6C1.875 116.7-4.531 97.51 3.375 81.7c7.891-15.81 27.06-22.19 42.94-14.31l320 160C377.2 232.8 384 243.9 384 256c0 12.12-6.844 23.19-17.69 28.63l-320 160C41.72 446.9 36.83 448 32.03 448z\"]\n};\nvar faGreaterThanEqual = {\n  prefix: 'fas',\n  iconName: 'greater-than-equal',\n  icon: [448, 512, [], \"f532\", \"M34.28 331.9c5.016 12.53 17.03 20.12 29.73 20.12c3.953 0 7.969-.7187 11.88-2.281l320-127.1C408 216.9 416 205.1 416 192s-7.969-24.85-20.11-29.72l-320-128c-16.47-6.594-35.05 1.406-41.61 17.84C27.72 68.55 35.7 87.17 52.11 93.73l245.7 98.28L52.11 290.3C35.7 296.9 27.72 315.5 34.28 331.9zM416 416H32c-17.67 0-32 14.31-32 31.99s14.33 32.01 32 32.01h384c17.67 0 32-14.32 32-32.01S433.7 416 416 416z\"]\n};\nvar faGrip = {\n  prefix: 'fas',\n  iconName: 'grip',\n  icon: [448, 512, [\"grip-horizontal\"], \"f58d\", \"M128 184C128 206.1 110.1 224 88 224H40C17.91 224 0 206.1 0 184V136C0 113.9 17.91 96 40 96H88C110.1 96 128 113.9 128 136V184zM128 376C128 398.1 110.1 416 88 416H40C17.91 416 0 398.1 0 376V328C0 305.9 17.91 288 40 288H88C110.1 288 128 305.9 128 328V376zM160 136C160 113.9 177.9 96 200 96H248C270.1 96 288 113.9 288 136V184C288 206.1 270.1 224 248 224H200C177.9 224 160 206.1 160 184V136zM288 376C288 398.1 270.1 416 248 416H200C177.9 416 160 398.1 160 376V328C160 305.9 177.9 288 200 288H248C270.1 288 288 305.9 288 328V376zM320 136C320 113.9 337.9 96 360 96H408C430.1 96 448 113.9 448 136V184C448 206.1 430.1 224 408 224H360C337.9 224 320 206.1 320 184V136zM448 376C448 398.1 430.1 416 408 416H360C337.9 416 320 398.1 320 376V328C320 305.9 337.9 288 360 288H408C430.1 288 448 305.9 448 328V376z\"]\n};\nvar faGripHorizontal = faGrip;\nvar faGripLines = {\n  prefix: 'fas',\n  iconName: 'grip-lines',\n  icon: [448, 512, [], \"f7a4\", \"M416 288C433.7 288 448 302.3 448 320C448 337.7 433.7 352 416 352H32C14.33 352 0 337.7 0 320C0 302.3 14.33 288 32 288H416zM416 160C433.7 160 448 174.3 448 192C448 209.7 433.7 224 416 224H32C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H416z\"]\n};\nvar faGripLinesVertical = {\n  prefix: 'fas',\n  iconName: 'grip-lines-vertical',\n  icon: [192, 512, [], \"f7a5\", \"M64 448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448V64C0 46.33 14.33 32 32 32C49.67 32 64 46.33 64 64V448zM192 448C192 465.7 177.7 480 160 480C142.3 480 128 465.7 128 448V64C128 46.33 142.3 32 160 32C177.7 32 192 46.33 192 64V448z\"]\n};\nvar faGripVertical = {\n  prefix: 'fas',\n  iconName: 'grip-vertical',\n  icon: [320, 512, [], \"f58e\", \"M88 352C110.1 352 128 369.9 128 392V440C128 462.1 110.1 480 88 480H40C17.91 480 0 462.1 0 440V392C0 369.9 17.91 352 40 352H88zM280 352C302.1 352 320 369.9 320 392V440C320 462.1 302.1 480 280 480H232C209.9 480 192 462.1 192 440V392C192 369.9 209.9 352 232 352H280zM40 320C17.91 320 0 302.1 0 280V232C0 209.9 17.91 192 40 192H88C110.1 192 128 209.9 128 232V280C128 302.1 110.1 320 88 320H40zM280 192C302.1 192 320 209.9 320 232V280C320 302.1 302.1 320 280 320H232C209.9 320 192 302.1 192 280V232C192 209.9 209.9 192 232 192H280zM40 160C17.91 160 0 142.1 0 120V72C0 49.91 17.91 32 40 32H88C110.1 32 128 49.91 128 72V120C128 142.1 110.1 160 88 160H40zM280 32C302.1 32 320 49.91 320 72V120C320 142.1 302.1 160 280 160H232C209.9 160 192 142.1 192 120V72C192 49.91 209.9 32 232 32H280z\"]\n};\nvar faGroupArrowsRotate = {\n  prefix: 'fas',\n  iconName: 'group-arrows-rotate',\n  icon: [512, 512, [], \"e4f6\", \"M159.7 89.85C159.9 91.87 159.1 93.93 159.1 96C159.1 131.3 131.3 160 95.1 160C93.92 160 91.87 159.9 89.85 159.7C82.34 172.6 76.29 186.5 71.94 201.1C66.9 218.1 49.08 227.7 32.15 222.7C15.21 217.6 5.562 199.8 10.6 182.9C17.01 161.4 26.15 141 37.64 122.3C34.02 114.3 31.1 105.4 31.1 96C31.1 60.65 60.65 32 95.1 32C105.4 32 114.3 34.02 122.3 37.64C141 26.16 161.4 17.01 182.9 10.61C199.8 5.566 217.6 15.21 222.7 32.15C227.7 49.09 218.1 66.91 201.1 71.95C186.5 76.3 172.6 82.34 159.7 89.85V89.85zM389.7 37.64C397.7 34.02 406.6 32 415.1 32C451.3 32 479.1 60.65 479.1 96C479.1 105.4 477.1 114.3 474.4 122.3C485.8 141 494.1 161.4 501.4 182.9C506.4 199.8 496.8 217.6 479.8 222.7C462.9 227.7 445.1 218.1 440.1 201.1C435.7 186.5 429.7 172.6 422.1 159.7C420.1 159.9 418.1 160 416 160C380.7 160 352 131.3 352 96C352 93.93 352.1 91.87 352.3 89.85C339.4 82.34 325.5 76.3 310.9 71.95C293.9 66.91 284.3 49.09 289.3 32.15C294.4 15.21 312.2 5.566 329.1 10.61C350.6 17.01 370.1 26.16 389.7 37.64L389.7 37.64zM89.85 352.3C91.87 352.1 93.92 352 95.1 352C131.3 352 159.1 380.7 159.1 416C159.1 418.1 159.9 420.1 159.7 422.2C172.6 429.7 186.5 435.7 201.1 440.1C218.1 445.1 227.7 462.9 222.7 479.9C217.6 496.8 199.8 506.4 182.9 501.4C161.4 494.1 141 485.8 122.3 474.4C114.3 477.1 105.4 480 95.1 480C60.65 480 31.1 451.3 31.1 416C31.1 406.6 34.02 397.7 37.64 389.7C26.15 370.1 17.01 350.6 10.6 329.1C5.562 312.2 15.21 294.4 32.15 289.3C49.08 284.3 66.9 293.9 71.94 310.9C76.29 325.5 82.34 339.4 89.85 352.3L89.85 352.3zM474.4 389.7C477.1 397.7 479.1 406.6 479.1 416C479.1 451.3 451.3 480 415.1 480C406.6 480 397.7 477.1 389.7 474.4C370.1 485.8 350.6 494.1 329.1 501.4C312.2 506.4 294.4 496.8 289.3 479.9C284.3 462.9 293.9 445.1 310.9 440.1C325.5 435.7 339.4 429.7 352.3 422.2C352.1 420.1 351.1 418.1 351.1 416C351.1 380.7 380.7 352 415.1 352C418.1 352 420.1 352.1 422.2 352.3C429.7 339.4 435.7 325.5 440.1 310.9C445.1 293.9 462.9 284.3 479.8 289.3C496.8 294.4 506.4 312.2 501.4 329.1C494.1 350.6 485.8 370.1 474.4 389.7H474.4zM192.8 256.8C192.8 281.6 206.9 303.2 227.7 313.8C239.5 319.9 244.2 334.3 238.2 346.1C232.1 357.9 217.7 362.6 205.9 356.6C169.7 338.1 144.8 300.4 144.8 256.8C144.8 227.9 155.7 201.6 173.7 181.7L162.5 170.6C155.1 163.1 160.6 152.8 169.9 152.8H230.4C236.1 152.8 240.8 157.5 240.8 163.2V223.7C240.8 232.1 229.6 237.6 223 231L207.7 215.7C198.4 226.8 192.8 241.1 192.8 256.8V256.8zM275.4 165.9C281.5 154.1 295.9 149.4 307.7 155.4C343.9 173.9 368.8 211.6 368.8 255.2C368.8 284.1 357.8 310.5 339.9 330.3L351 341.5C357.6 348 352.1 359.2 343.7 359.2H283.2C277.5 359.2 272.8 354.6 272.8 348.8V288.3C272.8 279 284 274.4 290.6 280.1L305.9 296.3C315.2 285.2 320.8 270.9 320.8 255.2C320.8 230.4 306.6 208.8 285.9 198.2C274.1 192.1 269.4 177.7 275.4 165.9V165.9z\"]\n};\nvar faGuaraniSign = {\n  prefix: 'fas',\n  iconName: 'guarani-sign',\n  icon: [384, 512, [], \"e19a\", \"M224 32V66.66C263.5 73.3 299 92.03 326.4 118.9C339 131.3 339.2 151.5 326.9 164.1C314.5 176.8 294.2 176.1 281.6 164.6C265.8 149.1 246.1 137.7 224 132V224H352C369.7 224 384 238.3 384 256C384 351.1 314.8 430.1 224 445.3V480C224 497.7 209.7 512 192 512C174.3 512 160 497.7 160 480V445.3C69.19 430.1 0 351.1 0 256C0 160.9 69.19 81.89 160 66.65V32C160 14.33 174.3 0 192 0C209.7 0 224 14.33 224 32H224zM160 132C104.8 146.2 64 196.4 64 256C64 315.6 104.8 365.8 160 379.1V132zM224 379.1C268.1 368.4 304.4 332.1 315.1 288H224V379.1z\"]\n};\nvar faGuitar = {\n  prefix: 'fas',\n  iconName: 'guitar',\n  icon: [512, 512, [], \"f7a6\", \"M502.7 39.02L473 9.37c-12.5-12.5-32.74-12.49-45.24 .0106l-46.24 46.37c-3.875 3.875-6.848 8.506-8.598 13.76l-12.19 36.51L284.5 182.3C272.4 173.5 259 166.5 244.4 163.1C211 155.4 177.4 162.3 154.5 185.1C145.3 194.5 138.3 206 134.3 218.6C128.3 237.1 111.1 251.3 92.14 253C68.52 255.4 46.39 264.5 29.52 281.5c-45.62 45.5-37.38 127.5 18.12 183c55.37 55.38 137.4 63.51 182.9 18c16.1-16.88 26.25-38.85 28.5-62.72c1.75-18.75 15.84-36.16 34.47-42.16c12.5-3.875 24.03-10.87 33.4-20.25c22.87-22.88 29.75-56.38 21.1-89.76c-3.375-14.63-10.39-27.99-19.14-40.11l76.25-76.26l36.53-12.17c5.125-1.75 9.894-4.715 13.77-8.59l46.36-46.29C515.2 71.72 515.2 51.52 502.7 39.02zM208 352c-26.5 0-48-21.5-48-48c0-26.5 21.5-48 48-48s47.1 21.5 47.1 48C256 330.5 234.5 352 208 352z\"]\n};\nvar faGun = {\n  prefix: 'fas',\n  iconName: 'gun',\n  icon: [576, 512, [], \"e19b\", \"M544 64h-16V56C528 42.74 517.3 32 504 32S480 42.74 480 56V64H43.17C19.33 64 0 83.33 0 107.2v89.66C0 220.7 19.33 240 43.17 240c21.26 0 36.61 20.35 30.77 40.79l-40.69 158.4C27.41 459.6 42.76 480 64.02 480h103.8c14.29 0 26.84-9.469 30.77-23.21L226.4 352h94.58c24.16 0 45.5-15.41 53.13-38.28L398.6 240h36.1c8.486 0 16.62-3.369 22.63-9.373L480 208h64c17.67 0 32-14.33 32-32V96C576 78.33 561.7 64 544 64zM328.5 298.6C327.4 301.8 324.4 304 320.9 304H239.1L256 240h92.02L328.5 298.6zM480 160H64V128h416V160z\"]\n};\nvar faH = {\n  prefix: 'fas',\n  iconName: 'h',\n  icon: [384, 512, [104], \"48\", \"M384 64.01v384c0 17.67-14.33 32-32 32s-32-14.33-32-32v-192H64v192c0 17.67-14.33 32-32 32s-32-14.33-32-32v-384C0 46.34 14.33 32.01 32 32.01S64 46.34 64 64.01v128h256v-128c0-17.67 14.33-32 32-32S384 46.34 384 64.01z\"]\n};\nvar faHammer = {\n  prefix: 'fas',\n  iconName: 'hammer',\n  icon: [576, 512, [128296], \"f6e3\", \"M568.1 196.3l-22.62-22.62c-4.533-4.533-10.56-7.029-16.97-7.029s-12.44 2.496-16.97 7.029l-5.654 5.656l-20.12-20.12c4.596-23.46-2.652-47.9-19.47-64.73l-45.25-45.25C390.2 17.47 347.1 0 303.1 0C258.2 0 216 17.47 184.3 49.21L176.5 57.05L272.5 105.1v13.81c0 18.95 7.688 37.5 21.09 50.91l49.16 49.14c13.44 13.45 31.39 20.86 50.54 20.86c4.758 0 9.512-.4648 14.18-1.387l20.12 20.12l-5.654 5.654c-9.357 9.357-9.357 24.58-.002 33.94l22.62 22.62c4.535 4.533 10.56 7.031 16.97 7.031s12.44-2.498 16.97-7.031l90.53-90.5C578.3 220.8 578.3 205.6 568.1 196.3zM270.9 192.4c-3.846-3.846-7.197-8.113-10.37-12.49l-239.5 209.2c-28.12 28.12-28.16 73.72-.0371 101.8C35.12 505 53.56 512 71.1 512s36.84-7.031 50.91-21.09l209.1-239.4c-4.141-3.061-8.184-6.289-11.89-9.996L270.9 192.4z\"]\n};\nvar faHamsa = {\n  prefix: 'fas',\n  iconName: 'hamsa',\n  icon: [512, 512, [], \"f665\", \"M509.4 307.2C504.3 295.5 492.8 288 480 288h-64l.0001-208c0-21.1-18-40-40-40c-22 0-40 18-40 40l-.0001 134C336 219.5 331.5 224 326 224h-20c-5.5 0-10-4.5-10-9.1V40c0-21.1-17.1-40-39.1-40S215.1 18 215.1 40v174C215.1 219.5 211.5 224 205.1 224H185.1C180.5 224 175.1 219.5 175.1 214L175.1 80c0-21.1-18-40-40-40S95.1 58 95.1 80L95.1 288H31.99C19.24 288 7.743 295.5 2.618 307.2C-2.382 318.9-.1322 332.5 8.618 341.9l102.6 110C146.1 490.1 199.8 512 256 512s108.1-21.88 144.8-60.13l102.6-110C512.1 332.5 514.4 318.9 509.4 307.2zM256 416c-53 0-96.01-64-96.01-64s43-64 96.01-64s96.01 64 96.01 64S309 416 256 416zM256 320c-17.63 0-32 14.38-32 32s14.38 32 32 32s32-14.38 32-32S273.6 320 256 320z\"]\n};\nvar faHand = {\n  prefix: 'fas',\n  iconName: 'hand',\n  icon: [512, 512, [129306, 9995, \"hand-paper\"], \"f256\", \"M480 128v208c0 97.05-78.95 176-176 176h-37.72c-53.42 0-103.7-20.8-141.4-58.58l-113.1-113.1C3.906 332.5 0 322.2 0 312C0 290.7 17.15 272 40 272c10.23 0 20.47 3.906 28.28 11.72L128 343.4V64c0-17.67 14.33-32 32-32s32 14.33 32 32l.0729 176C192.1 248.8 199.2 256 208 256s16.07-7.164 16.07-16L224 32c0-17.67 14.33-32 32-32s32 14.33 32 32l.0484 208c0 8.836 7.111 16 15.95 16S320 248.8 320 240L320 64c0-17.67 14.33-32 32-32s32 14.33 32 32l.0729 176c0 8.836 7.091 16 15.93 16S416 248.8 416 240V128c0-17.67 14.33-32 32-32S480 110.3 480 128z\"]\n};\nvar faHandPaper = faHand;\nvar faHandBackFist = {\n  prefix: 'fas',\n  iconName: 'hand-back-fist',\n  icon: [448, 512, [\"hand-rock\"], \"f255\", \"M448 144v120.4C448 314.2 422.6 358.1 384 384v128H128v-128l-53.19-38.67C48 325.8 32 294.3 32 261.2V192c0-14.58 6.625-28.38 17.1-37.48L80 130.5V176C80 184.8 87.16 192 96 192s16-7.164 16-16v-128C112 21.48 133.5 0 160 0c25.38 0 45.96 19.77 47.67 44.73C216.2 36.9 227.5 32 240 32C266.5 32 288 53.48 288 80v5.531C296.6 72.57 311.3 64 328 64c23.47 0 42.94 16.87 47.11 39.14C382.4 98.7 390.9 96 400 96C426.5 96 448 117.5 448 144z\"]\n};\nvar faHandRock = faHandBackFist;\nvar faHandDots = {\n  prefix: 'fas',\n  iconName: 'hand-dots',\n  icon: [512, 512, [\"allergies\"], \"f461\", \"M448 96c-17.67 0-32 14.33-32 32v112C416 248.8 408.8 256 400 256s-15.93-7.164-15.93-16L384 64c0-17.67-14.33-32-32-32s-32 14.33-32 32l.0498 176c0 8.836-7.219 16-16.06 16s-15.95-7.164-15.95-16L288 32c0-17.67-14.33-32-32-32S224 14.33 224 32l.0729 208C224.1 248.8 216.8 256 208 256S192.1 248.8 192.1 240L192 64c0-17.67-14.33-32-32-32S128 46.33 128 64v279.4L68.28 283.7C60.47 275.9 50.23 272 40 272C18.68 272 0 289.2 0 312c0 10.23 3.906 20.47 11.72 28.28l113.1 113.1C162.6 491.2 212.9 512 266.3 512H304c97.05 0 176-78.95 176-176V128C480 110.3 465.7 96 448 96zM192 416c-8.836 0-16-7.164-16-16C176 391.2 183.2 384 192 384s16 7.162 16 16C208 408.8 200.8 416 192 416zM256 448c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16s16 7.162 16 16C272 440.8 264.8 448 256 448zM256 352c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16s16 7.162 16 16C272 344.8 264.8 352 256 352zM320 384c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16s16 7.162 16 16C336 376.8 328.8 384 320 384zM352 448c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16s16 7.162 16 16C368 440.8 360.8 448 352 448zM384 352c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16s16 7.162 16 16C400 344.8 392.8 352 384 352z\"]\n};\nvar faAllergies = faHandDots;\nvar faHandFist = {\n  prefix: 'fas',\n  iconName: 'hand-fist',\n  icon: [448, 512, [9994, \"fist-raised\"], \"f6de\", \"M224 180.4V32c0-17.67-14.31-32-32-32S160 14.33 160 32v144h40C208.5 176 216.5 177.7 224 180.4zM128 176V64c0-17.67-14.31-32-32-32S64 46.33 64 64v112.8C66.66 176.5 69.26 176 72 176H128zM288 192c17.69 0 32-14.33 32-32V64c0-17.67-14.31-32-32-32s-32 14.33-32 32v96C256 177.7 270.3 192 288 192zM384 96c-17.69 0-32 14.33-32 32v64c0 17.67 14.31 32 32 32s32-14.34 32-32.02V128C416 110.3 401.7 96 384 96zM350.9 246.2c-12.43-7.648-21.94-19.31-26.88-33.25C313.7 219.9 301.3 223.9 288 223.9c-7.641 0-14.87-1.502-21.66-3.957C269.1 228.6 272 238.1 272 248c0 39.77-32.25 72-72 72H128c-8.836 0-16-7.164-16-16C112 295.2 119.2 288 128 288h72c22.09 0 40-17.91 40-40S222.1 208 200 208h-128C49.91 208 32 225.9 32 248v63.41c0 33.13 16 64.56 42.81 84.13L128 434.2V512h224v-85.09c38.3-24.09 64-66.42 64-114.9V247.1C406.6 252.6 395.7 256 384 256C371.7 256 360.5 252.2 350.9 246.2z\"]\n};\nvar faFistRaised = faHandFist;\nvar faHandHolding = {\n  prefix: 'fas',\n  iconName: 'hand-holding',\n  icon: [576, 512, [], \"f4bd\", \"M559.7 392.2l-135.1 99.51C406.9 504.8 385 512 362.1 512H15.1c-8.749 0-15.1-7.246-15.1-15.99l0-95.99c0-8.748 7.25-16.02 15.1-16.02l55.37 .0238l46.5-37.74c20.1-16.1 47.12-26.25 74.12-26.25h159.1c19.5 0 34.87 17.37 31.62 37.37c-2.625 15.75-17.37 26.62-33.37 26.62H271.1c-8.749 0-15.1 7.249-15.1 15.1s7.25 15.1 15.1 15.1h120.6l119.7-88.17c17.8-13.19 42.81-9.342 55.93 8.467C581.3 354.1 577.5 379.1 559.7 392.2z\"]\n};\nvar faHandHoldingDollar = {\n  prefix: 'fas',\n  iconName: 'hand-holding-dollar',\n  icon: [576, 512, [\"hand-holding-usd\"], \"f4c0\", \"M568.2 336.3c-13.12-17.81-38.14-21.66-55.93-8.469l-119.7 88.17h-120.6c-8.748 0-15.1-7.25-15.1-15.99c0-8.75 7.25-16 15.1-16h78.25c15.1 0 30.75-10.88 33.37-26.62c3.25-20-12.12-37.38-31.62-37.38H191.1c-26.1 0-53.12 9.25-74.12 26.25l-46.5 37.74L15.1 383.1C7.251 383.1 0 391.3 0 400v95.98C0 504.8 7.251 512 15.1 512h346.1c22.03 0 43.92-7.188 61.7-20.27l135.1-99.52C577.5 379.1 581.3 354.1 568.2 336.3zM279.3 175C271.7 173.9 261.7 170.3 252.9 167.1L248 165.4C235.5 160.1 221.8 167.5 217.4 179.1s2.121 26.2 14.59 30.64l4.655 1.656c8.486 3.061 17.88 6.095 27.39 8.312V232c0 13.25 10.73 24 23.98 24s24-10.75 24-24V221.6c25.27-5.723 42.88-21.85 46.1-45.72c8.688-50.05-38.89-63.66-64.42-70.95L288.4 103.1C262.1 95.64 263.6 92.42 264.3 88.31c1.156-6.766 15.3-10.06 32.21-7.391c4.938 .7813 11.37 2.547 19.65 5.422c12.53 4.281 26.21-2.312 30.52-14.84s-2.309-26.19-14.84-30.53c-7.602-2.627-13.92-4.358-19.82-5.721V24c0-13.25-10.75-24-24-24s-23.98 10.75-23.98 24v10.52C238.8 40.23 221.1 56.25 216.1 80.13C208.4 129.6 256.7 143.8 274.9 149.2l6.498 1.875c31.66 9.062 31.15 11.89 30.34 16.64C310.6 174.5 296.5 177.8 279.3 175z\"]\n};\nvar faHandHoldingUsd = faHandHoldingDollar;\nvar faHandHoldingDroplet = {\n  prefix: 'fas',\n  iconName: 'hand-holding-droplet',\n  icon: [576, 512, [\"hand-holding-water\"], \"f4c1\", \"M287.1 256c53 0 95.1-42.13 95.1-93.1c0-40-57.12-120.8-83.25-155.6c-6.375-8.5-19.12-8.5-25.5 0C249.1 41.25 191.1 122 191.1 162C191.1 213.9 234.1 256 287.1 256zM568.2 336.3c-13.12-17.81-38.14-21.66-55.93-8.469l-119.7 88.17h-120.6c-8.748 0-15.1-7.25-15.1-15.99c0-8.75 7.25-16 15.1-16h78.25c15.1 0 30.75-10.88 33.37-26.62c3.25-20-12.12-37.38-31.62-37.38H191.1c-26.1 0-53.12 9.25-74.12 26.25l-46.5 37.74L15.1 383.1c-8.748 0-15.1 7.274-15.1 16.02L.0001 496C.0001 504.8 7.251 512 15.1 512h346.1c22.03 0 43.92-7.188 61.7-20.27l135.1-99.52C577.5 379.1 581.3 354.1 568.2 336.3z\"]\n};\nvar faHandHoldingWater = faHandHoldingDroplet;\nvar faHandHoldingHand = {\n  prefix: 'fas',\n  iconName: 'hand-holding-hand',\n  icon: [512, 512, [], \"e4f7\", \"M328.7 52.28L431.7 119.8C449.5 132.9 453.3 157.9 440.2 175.7C427.1 193.5 402.1 197.3 384.3 184.2L296.6 127.1H191.1C183.2 127.1 175.1 135.2 175.1 143.1C175.1 152.7 183.2 159.1 191.1 159.1H254.2C270.2 159.1 284.1 170.9 287.6 186.6C290.8 206.6 275.5 223.1 255.1 223.1H143.1C116.1 223.1 90.87 214.7 69.87 197.7L23.37 159.1L15.1 160C7.25 160 0 152.7 0 143.1V47.99C0 39.25 7.25 32 15.1 32H266.1C289 32 310.9 39.19 328.7 52.28L328.7 52.28zM151.3 459.7L16.27 360.2C-1.509 347.1-5.305 322.1 7.803 304.3C20.93 286.5 45.94 282.7 63.74 295.8L183.4 384H304C312.8 384 320 376.8 320 368C320 359.3 312.8 352 304 352H225.8C209.8 352 195 341.1 192.4 325.4C189.2 305.4 204.5 288 224 288H352C379 288 405.1 297.3 426.1 314.3L472.6 352L496 352C504.7 352 512 359.3 512 368V464C512 472.8 504.7 480 496 480H213C190.1 480 169.1 472.8 151.3 459.7V459.7z\"]\n};\nvar faHandHoldingHeart = {\n  prefix: 'fas',\n  iconName: 'hand-holding-heart',\n  icon: [576, 512, [], \"f4be\", \"M275.2 250.5c7 7.375 18.5 7.375 25.5 0l108.1-114.2c31.5-33.12 29.72-88.1-5.65-118.7c-30.88-26.75-76.75-21.9-104.9 7.724L287.1 36.91L276.8 25.28C248.7-4.345 202.7-9.194 171.1 17.56C136.7 48.18 134.7 103.2 166.4 136.3L275.2 250.5zM568.2 336.3c-13.12-17.81-38.14-21.66-55.93-8.469l-119.7 88.17h-120.6c-8.748 0-15.1-7.25-15.1-15.1c0-8.746 7.25-15.1 15.1-15.1h78.25c15.1 0 30.75-10.87 33.37-26.62c3.25-19.1-12.12-37.37-31.62-37.37H191.1c-26.1 0-53.12 9.25-74.12 26.25l-46.5 37.74l-55.37-.0253c-8.748 0-15.1 7.275-15.1 16.02L.0001 496C.0001 504.8 7.251 512 15.1 512h346.1c22.03 0 43.92-7.187 61.7-20.28l135.1-99.51C577.5 379.1 581.3 354.1 568.2 336.3z\"]\n};\nvar faHandHoldingMedical = {\n  prefix: 'fas',\n  iconName: 'hand-holding-medical',\n  icon: [576, 512, [], \"e05c\", \"M568.2 336.3c-13.12-17.81-38.14-21.66-55.93-8.469l-119.7 88.17h-120.6c-8.748 0-15.1-7.25-15.1-15.99c0-8.75 7.25-16 15.1-16h78.25c15.1 0 30.75-10.88 33.37-26.62c3.25-20-12.12-37.38-31.62-37.38H191.1c-26.1 0-53.12 9.25-74.12 26.25l-46.5 37.74L15.1 383.1C7.251 383.1 0 391.3 0 400v95.98C0 504.8 7.251 512 15.1 512h346.1c22.03 0 43.92-7.188 61.7-20.27l135.1-99.52C577.5 379.1 581.3 354.1 568.2 336.3zM160 176h64v64C224 248.8 231.2 256 240 256h64C312.8 256 320 248.8 320 240v-64h64c8.836 0 16-7.164 16-16V96c0-8.838-7.164-16-16-16h-64v-64C320 7.162 312.8 0 304 0h-64C231.2 0 224 7.162 224 16v64H160C151.2 80 144 87.16 144 96v64C144 168.8 151.2 176 160 176z\"]\n};\nvar faHandLizard = {\n  prefix: 'fas',\n  iconName: 'hand-lizard',\n  icon: [512, 512, [], \"f258\", \"M512 329.1V432c0 8.836-7.164 16-16 16H368c-8.836 0-16-7.164-16-16V416l-85.33-64H95.1c-16.47 0-31.44-13.44-31.96-29.9C62.87 285.8 91.96 256 127.1 256h104.9c13.77 0 26-8.811 30.36-21.88l10.67-32C280.9 181.4 265.4 160 243.6 160H63.1C27.95 160-1.129 130.2 .0352 93.9C.5625 77.44 15.53 64 31.1 64h271.2c26.26 0 50.84 12.88 65.79 34.47l128.8 185.1C507 297.8 512 313.7 512 329.1z\"]\n};\nvar faHandMiddleFinger = {\n  prefix: 'fas',\n  iconName: 'hand-middle-finger',\n  icon: [448, 512, [128405], \"f806\", \"M448 288v96c0 70.69-57.31 128-128 128H184c-50.35 0-97.76-23.7-127.1-63.98l-14.43-19.23C35.37 420.5 32 410.4 32 400v-48.02c0-14.58 6.629-28.37 18.02-37.48L80 290.5V336C80 344.8 87.16 352 96 352s16-7.164 16-16v-96C112 213.5 133.5 192 160 192s48 21.48 48 48V40C208 17.91 225.9 0 248 0S288 17.91 288 40v189.5C296.6 216.6 311.3 208 328 208c23.48 0 42.94 16.87 47.11 39.14C382.4 242.7 390.8 240 400 240C426.5 240 448 261.5 448 288z\"]\n};\nvar faHandPeace = {\n  prefix: 'fas',\n  iconName: 'hand-peace',\n  icon: [512, 512, [9996], \"f25b\", \"M256 287.4V32c0-17.67-14.31-32-32-32S192 14.33 192 32v216.3C218.7 248.4 243.7 263.1 256 287.4zM170.8 251.2c2.514-.7734 5.043-1.027 7.57-1.516L93.41 51.39C88.21 39.25 76.34 31.97 63.97 31.97c-20.97 0-31.97 18.01-31.97 32.04c0 4.207 .8349 8.483 2.599 12.6l81.97 191.3L170.8 251.2zM416 224c-17.69 0-32 14.33-32 32v64c0 17.67 14.31 32 32 32s32-14.33 32-32V256C448 238.3 433.7 224 416 224zM320 352c17.69 0 32-14.33 32-32V224c0-17.67-14.31-32-32-32s-32 14.33-32 32v96C288 337.7 302.3 352 320 352zM368 361.9C356.3 375.3 339.2 384 320 384c-27.41 0-50.62-17.32-59.73-41.55c-7.059 21.41-23.9 39.23-47.08 46.36l-47.96 14.76c-1.562 .4807-3.147 .7105-4.707 .7105c-6.282 0-12.18-3.723-14.74-9.785c-.8595-2.038-1.264-4.145-1.264-6.213c0-6.79 4.361-13.16 11.3-15.3l46.45-14.29c17.2-5.293 29.76-20.98 29.76-38.63c0-34.19-32.54-40.07-40.02-40.07c-3.89 0-7.848 .5712-11.76 1.772l-104 32c-18.23 5.606-28.25 22.21-28.25 38.22c0 4.266 .6825 8.544 2.058 12.67L68.19 419C86.71 474.5 138.7 512 197.2 512H272c82.54 0 151.8-57.21 170.7-134C434.6 381.8 425.6 384 416 384C396.8 384 379.7 375.3 368 361.9z\"]\n};\nvar faHandPointDown = {\n  prefix: 'fas',\n  iconName: 'hand-point-down',\n  icon: [448, 512, [], \"f0a7\", \"M256 256v64c0 17.67 14.31 32 32 32s32-14.33 32-32V256c0-17.67-14.31-32-32-32S256 238.3 256 256zM200 272H160V352c0 17.67 14.31 32 32 32s32-14.33 32-32V267.6C216.5 270.3 208.5 272 200 272zM72 272C69.26 272 66.66 271.5 64 271.2V480c0 17.67 14.31 32 32 32s32-14.33 32-32V272H72zM416 288V224c0-17.67-14.31-32-32-32s-32 14.33-32 32v64c0 17.67 14.31 32 32 32S416 305.7 416 288zM384 160c11.72 0 22.55 3.381 32 8.879V136C416 60.89 355.1 0 280 0L191.3 0C162.5 0 134.5 9.107 111.2 26.02L74.81 52.47C48 72.03 32 103.5 32 136.6V200C32 222.1 49.91 240 72 240h128c22.09 0 39.1-17.91 39.1-39.1c0-28.73-26.72-40-42.28-40l-69.72 0C119.2 160 112 152.8 112 144S119.2 128 127.1 128H200c37.87 0 68.59 29.35 71.45 66.51C276.8 193.1 282.2 192 288 192c13.28 0 25.6 4.047 35.83 10.97C332.6 178 356.1 160 384 160z\"]\n};\nvar faHandPointLeft = {\n  prefix: 'fas',\n  iconName: 'hand-point-left',\n  icon: [512, 512, [], \"f0a5\", \"M256 288H192c-17.67 0-32 14.31-32 32s14.33 32 32 32h64c17.67 0 32-14.31 32-32S273.7 288 256 288zM240 232V192H160C142.3 192 128 206.3 128 224s14.33 32 32 32h84.41C241.7 248.5 240 240.5 240 232zM240 104C240 101.3 240.5 98.66 240.8 96H32C14.33 96 0 110.3 0 128s14.33 32 32 32h208V104zM224 448h64c17.67 0 32-14.31 32-32s-14.33-32-32-32H224c-17.67 0-32 14.31-32 32S206.3 448 224 448zM352 416c0 11.72-3.381 22.55-8.879 32H376C451.1 448 512 387.1 512 312V223.3c0-28.76-9.107-56.79-26.02-80.06l-26.45-36.41C439.1 80 408.5 64 375.4 64H312c-22.09 0-40 17.91-40 40v128c0 22.09 17.91 39.1 39.1 39.1c28.73 0 40-26.72 40-42.28L352 159.1C352 151.2 359.2 144 368 144S384 151.2 384 159.1V232c0 37.87-29.35 68.59-66.51 71.45C318.9 308.8 320 314.2 320 320c0 13.28-4.047 25.6-10.97 35.83C333.1 364.6 352 388.1 352 416z\"]\n};\nvar faHandPointRight = {\n  prefix: 'fas',\n  iconName: 'hand-point-right',\n  icon: [512, 512, [], \"f0a4\", \"M224 320c0 17.69 14.33 32 32 32h64c17.67 0 32-14.31 32-32s-14.33-32-32-32h-64C238.3 288 224 302.3 224 320zM267.6 256H352c17.67 0 32-14.31 32-32s-14.33-32-32-32h-80v40C272 240.5 270.3 248.5 267.6 256zM272 160H480c17.67 0 32-14.31 32-32s-14.33-32-32-32h-208.8C271.5 98.66 272 101.3 272 104V160zM320 416c0-17.69-14.33-32-32-32H224c-17.67 0-32 14.31-32 32s14.33 32 32 32h64C305.7 448 320 433.7 320 416zM202.1 355.8C196 345.6 192 333.3 192 320c0-5.766 1.08-11.24 2.51-16.55C157.4 300.6 128 269.9 128 232V159.1C128 151.2 135.2 144 143.1 144S160 151.2 159.1 159.1l0 69.72C159.1 245.2 171.3 271.1 200 271.1C222.1 271.1 240 254.1 240 232v-128C240 81.91 222.1 64 200 64H136.6C103.5 64 72.03 80 52.47 106.8L26.02 143.2C9.107 166.5 0 194.5 0 223.3V312C0 387.1 60.89 448 136 448h32.88C163.4 438.6 160 427.7 160 416C160 388.1 178 364.6 202.1 355.8z\"]\n};\nvar faHandPointUp = {\n  prefix: 'fas',\n  iconName: 'hand-point-up',\n  icon: [448, 512, [9757], \"f0a6\", \"M288 288c17.69 0 32-14.33 32-32V192c0-17.67-14.31-32-32-32s-32 14.33-32 32v64C256 273.7 270.3 288 288 288zM224 244.4V160c0-17.67-14.31-32-32-32S160 142.3 160 160v80h40C208.5 240 216.5 241.7 224 244.4zM128 240V32c0-17.67-14.31-32-32-32S64 14.33 64 32v208.8C66.66 240.5 69.26 240 72 240H128zM384 192c-17.69 0-32 14.33-32 32v64c0 17.67 14.31 32 32 32s32-14.33 32-32V224C416 206.3 401.7 192 384 192zM323.8 309C313.6 315.1 301.3 320 288 320c-5.766 0-11.24-1.08-16.55-2.51C268.6 354.6 237.9 384 200 384H127.1C119.2 384 112 376.8 112 368S119.2 352 127.1 352l69.72 .0001c15.52 0 42.28-11.29 42.28-40C239.1 289.9 222.1 272 200 272h-128C49.91 272 32 289.9 32 312v63.41c0 33.13 16 64.56 42.81 84.13l36.41 26.45C134.5 502.9 162.5 512 191.3 512H280c75.11 0 136-60.89 136-136v-32.88C406.6 348.6 395.7 352 384 352C356.1 352 332.6 333.1 323.8 309z\"]\n};\nvar faHandPointer = {\n  prefix: 'fas',\n  iconName: 'hand-pointer',\n  icon: [448, 512, [], \"f25a\", \"M400 224c-9.148 0-17.62 2.697-24.89 7.143C370.9 208.9 351.5 192 328 192c-17.38 0-32.46 9.33-40.89 23.17C282.1 192.9 263.5 176 240 176c-12.35 0-23.49 4.797-32 12.46V40c0-22.09-17.9-40-39.1-40C145.9 0 128 17.91 128 40v322.7L72 288C64.15 277.5 52.13 272 39.97 272c-21.22 0-39.97 17.06-39.97 40.02c0 8.356 2.608 16.78 8.005 23.98l91.22 121.6C124.8 491.7 165.5 512 208 512h96C383.4 512 448 447.4 448 368v-96C448 245.5 426.5 224 400 224zM240 400c0 8.844-7.156 16-16 16s-16-7.156-16-16v-96C208 295.2 215.2 288 224 288s16 7.156 16 16V400zM304 400c0 8.844-7.156 16-16 16s-16-7.156-16-16v-96C272 295.2 279.2 288 288 288s16 7.156 16 16V400zM368 400c0 8.844-7.156 16-16 16s-16-7.156-16-16v-96C336 295.2 343.2 288 352 288s16 7.156 16 16V400z\"]\n};\nvar faHandScissors = {\n  prefix: 'fas',\n  iconName: 'hand-scissors',\n  icon: [512, 512, [], \"f257\", \"M512 192v111.1C512 383.4 447.4 448 368 448H288c-26.52 0-48-21.48-48-47.99c0-9.152 2.697-17.61 7.139-24.89C224.9 370.1 208 351.5 208 328c0-16.72 8.561-31.4 21.52-39.1H40c-22.09 0-40-17.9-40-39.99s17.91-39.1 40-39.1h229.5L60 142.2C42.93 136.8 31.99 121.1 31.99 104c0-3.973 .5967-8.014 1.851-12.01c5.35-17.07 21.08-28.04 38.06-28.04c4 0 8.071 .6085 12.09 1.889l279.2 87.22C364.8 153.6 366.4 153.8 368 153.8c6.812 0 13.12-4.375 15.27-11.23c.4978-1.588 .7346-3.195 .7346-4.777c0-6.807-4.388-13.12-11.23-15.25l-72.54-22.67l14.29-17.85C323.6 70.67 337.4 64.04 352 64.04h48c10.39 0 20.48 3.359 28.8 9.592l38.41 28.79c25.2 18.91 40.53 47.97 43.55 79.04C511.5 184.9 512 188.4 512 192z\"]\n};\nvar faHandSparkles = {\n  prefix: 'fas',\n  iconName: 'hand-sparkles',\n  icon: [640, 512, [], \"e05d\", \"M448 432c0-14.25 8.547-28.14 21.28-34.55l39.56-16.56l15.64-37.52c4.461-9.037 11.45-15.37 19.43-19.23L544 128c0-17.67-14.33-32-32-32s-32 14.33-32 32l-.0156 112c0 8.836-7.148 16-15.98 16s-16.07-7.164-16.07-16L448 64c0-17.67-14.33-32-32-32s-32 14.33-32 32l-.0635 176c0 8.836-7.106 16-15.94 16S351.9 248.8 351.9 240L352 32c0-17.67-14.33-32-32-32S288 14.33 288 32L287.9 240C287.9 248.8 280.8 256 272 256S255.9 248.8 255.9 240L256 64c0-17.67-14.33-32-32-32S192 46.33 192 64v279.4L132.3 283.7C124.5 275.9 114.2 272 104 272C82.68 272 64 289.2 64 312c0 10.23 3.906 20.47 11.72 28.28l113.1 113.1C226.6 491.2 276.9 512 330.3 512H368c42.72 0 81.91-15.32 112.4-40.73l-9.049-3.773C456.6 460.1 448 446.3 448 432zM349.8 371.6L320 383.1l-12.42 29.78C306.1 415 305.4 416 304 416s-2.969-.9941-3.578-2.219L288 383.1l-29.79-12.42C256.1 370.1 256 369.4 256 367.1c0-1.365 .9922-2.967 2.209-3.577L288 352l12.42-29.79C301 320.1 302.6 320 304 320s2.967 .9902 3.578 2.217L320 352l29.79 12.42C351 365 352 366.6 352 367.1C352 369.4 351 370.1 349.8 371.6zM80 224c2.277 0 4.943-1.656 5.959-3.699l20.7-49.63l49.65-20.71c2.027-1.014 3.682-3.696 3.686-5.958C159.1 141.7 158.3 139.1 156.3 138L106.7 117.4L85.96 67.7C84.94 65.65 82.28 64 80 64C77.72 64 75.05 65.65 74.04 67.7L53.34 117.3L3.695 138C1.668 139.1 .0117 141.7 .0078 143.1c.0039 2.262 1.662 4.953 3.688 5.967l49.57 20.67l20.77 49.67C75.05 222.3 77.72 224 80 224zM639.1 432c-.0039-2.275-1.657-4.952-3.687-5.968l-49.57-20.67l-20.77-49.67C564.9 353.7 562.3 352 560 352c-2.281 0-4.959 1.652-5.975 3.695l-20.7 49.63l-49.64 20.71c-2.027 1.016-3.682 3.683-3.686 5.958c.0039 2.262 1.661 4.954 3.686 5.968l49.57 20.67l20.77 49.67C555.1 510.3 557.7 512 560 512c2.277 0 4.933-1.656 5.949-3.699l20.7-49.63l49.65-20.71C638.3 436.9 639.1 434.3 639.1 432z\"]\n};\nvar faHandSpock = {\n  prefix: 'fas',\n  iconName: 'hand-spock',\n  icon: [576, 512, [128406], \"f259\", \"M543.6 128.6c0-8.999-6.115-32.58-31.68-32.58c-14.1 0-27.02 9.324-30.92 23.56l-34.36 125.1c-1.682 6.16-7.275 10.43-13.66 10.43c-7.981 0-14.16-6.518-14.16-14.13c0-.9844 .1034-1.987 .3197-2.996l35.71-166.6c.5233-2.442 .7779-4.911 .7779-7.362c0-13.89-9.695-32.86-31.7-32.86c-14.79 0-28.12 10.26-31.34 25.29l-37.77 176.2c-2.807 13.1-14.38 22.46-27.77 22.46c-13.04 0-24.4-8.871-27.56-21.52l-52.11-208.5C243.6 11.2 230.5-.0013 215.6-.0013c-26.71 0-31.78 25.71-31.78 31.98c0 2.569 .3112 5.18 .9617 7.786l50.55 202.2c.2326 .9301 .3431 1.856 .3431 2.764c0 6.051-4.911 11.27-11.3 11.27c-4.896 0-9.234-3.154-10.74-7.812L166.9 103.9C162.4 89.1 149.5 80.02 135.5 80.02c-15.68 0-31.63 12.83-31.63 31.97c0 3.273 .5059 6.602 1.57 9.884l69.93 215.7c.2903 .8949 .4239 1.766 .4239 2.598c0 4.521-3.94 7.915-8.119 7.915c-1.928 0-3.906-.7219-5.573-2.388L101.7 285.3c-8.336-8.336-19.63-12.87-30.81-12.87c-23.56 0-39.07 19.69-39.07 39.55c0 10.23 3.906 20.47 11.72 28.28l122.5 122.5C197.6 494.3 240.3 512 284.9 512h50.98c23.5 0 108.4-14.57 132.5-103l73.96-271.2C543.2 134.8 543.6 131.7 543.6 128.6z\"]\n};\nvar faHandcuffs = {\n  prefix: 'fas',\n  iconName: 'handcuffs',\n  icon: [640, 512, [], \"e4f8\", \"M304 32C304 49.67 289.7 64 272 64C254.3 64 240 49.67 240 32C240 14.33 254.3 0 272 0C289.7 0 304 14.33 304 32zM160 80C160 62.33 174.3 48 192 48C209.7 48 224 62.33 224 80C224 97.67 209.7 112 192 112C174.3 112 160 97.67 160 80zM160 128C177.7 128 192 142.3 192 160H200C213.3 160 224 170.7 224 184V200C224 201.7 223.8 203.4 223.5 205.1C280.3 229.6 320 286.2 320 352C320 440.4 248.4 512 160 512C71.63 512 0 440.4 0 352C0 286.2 39.74 229.6 96.54 205.1C96.19 203.4 96 201.7 96 200V184C96 170.7 106.7 160 120 160H128C128 142.3 142.3 128 160 128zM160 448C213 448 256 405 256 352C256 298.1 213 256 160 256C106.1 256 64 298.1 64 352C64 405 106.1 448 160 448zM337.6 278.9C354.5 246.1 382.5 219.8 416.5 205.1C416.2 203.4 416 201.7 416 199.1V183.1C416 170.7 426.7 159.1 440 159.1H448C448 142.3 462.3 127.1 480 127.1C497.7 127.1 512 142.3 512 159.1H520C533.3 159.1 544 170.7 544 183.1V199.1C544 201.7 543.8 203.4 543.5 205.1C600.3 229.6 640 286.2 640 352C640 440.4 568.4 512 480 512C417.1 512 364.2 476.7 337.6 425.1C346.9 402.5 352 377.9 352 352C352 326.1 346.9 301.5 337.6 278.9V278.9zM480 256C426.1 256 384 298.1 384 352C384 405 426.1 448 480 448C533 448 576 405 576 352C576 298.1 533 256 480 256zM336 32C336 14.33 350.3 0 368 0C385.7 0 400 14.33 400 32C400 49.67 385.7 64 368 64C350.3 64 336 49.67 336 32zM416 80C416 62.33 430.3 48 448 48C465.7 48 480 62.33 480 80C480 97.67 465.7 112 448 112C430.3 112 416 97.67 416 80z\"]\n};\nvar faHands = {\n  prefix: 'fas',\n  iconName: 'hands',\n  icon: [512, 512, [\"sign-language\", \"signing\"], \"f2a7\", \"M330.8 242.3L223.1 209.1C210.3 205.2 197 212.3 193.1 224.9C189.2 237.6 196.3 251 208.9 254.9L256 272H56.9c-11.61 0-22.25 7.844-24.44 19.24C29.51 306.6 41.19 320 56 320h128C188.4 320 192 323.6 192 328S188.4 336 184 336H24.9c-11.61 0-22.25 7.844-24.44 19.24C-2.49 370.6 9.193 384 24 384h160C188.4 384 192 387.6 192 392S188.4 400 184 400H56.9c-11.61 0-22.25 7.844-24.44 19.24C29.51 434.6 41.19 448 56 448h128C188.4 448 192 451.6 192 456S188.4 464 184 464H88.9c-11.61 0-22.25 7.844-24.44 19.24C61.51 498.6 73.19 512 88 512h208c66.28 0 120-53.73 120-120v-32.03C416 306.6 381.1 259.4 330.8 242.3zM197.1 179.5c5.986-2.148 12.32-3.482 18.98-3.482c5.508 0 10.99 .8105 16.5 2.471l16.11 4.975L227.7 117.2C224.2 106.2 213.6 98.39 202 99.74c-15.51 1.807-24.79 16.99-20.33 31.11L197.1 179.5zM487.1 144.5c-13.27 .0977-23.95 10.91-23.86 24.16l-2.082 50.04l-59.98-189.8c-3.496-11.07-14.18-18.86-25.71-17.51c-15.51 1.807-24.79 16.99-20.33 31.11l38.56 122.1c1.332 4.213-1.004 8.707-5.219 10.04c-4.213 1.332-8.707-1.004-10.04-5.217l-47.93-151.7c-3.496-11.07-14.18-18.86-25.71-17.51c-15.51 1.807-24.79 16.99-20.33 31.11l43.37 137.8c1.33 4.213-1.006 8.707-5.219 10.04c-4.213 1.332-8.707-1.004-10.04-5.217l-33.46-106.4C275.6 56.39 264.9 48.6 253.4 49.94c-15.51 1.807-24.79 16.99-20.33 31.11l34.15 108.1l73.7 22.76C404.1 233.3 448 292.8 448 359.9v27.91c38.27-21.17 63.28-61.24 64-106.7V168.4C511.8 155.1 500.3 144.5 487.1 144.5z\"]\n};\nvar faSignLanguage = faHands;\nvar faSigning = faHands;\nvar faHandsAslInterpreting = {\n  prefix: 'fas',\n  iconName: 'hands-asl-interpreting',\n  icon: [640, 512, [\"american-sign-language-interpreting\", \"asl-interpreting\", \"hands-american-sign-language-interpreting\"], \"f2a3\", \"M200 240c16.94 0 32.09 10.72 37.73 26.67c5.891 16.66 24.17 25.39 40.84 19.5c16.66-5.891 25.39-24.17 19.5-40.84C287.2 214.7 262.8 191.6 233.1 181.5l79.68-22.76c16.98-4.859 26.83-22.56 21.97-39.56C329.9 102.2 312.2 92.35 295.2 97.24L196 125.6l80.82-69.28c13.42-11.5 14.97-31.7 3.469-45.12C268.8-2.24 248.6-3.803 235.2 7.713l-100.4 86.09l22.33-48.39c7.391-16.05 .3906-35.06-15.66-42.47C125.4-4.412 106.4 2.525 98.94 18.6L14.92 206.6C5.082 228.6 0 252.5 0 276.6C0 335.9 48.1 384 107.4 384l99.9-.0064c31.87-2.289 61.15-19.35 79.13-46.18c9.828-14.69 5.891-34.56-8.781-44.41C263 283.6 243.1 287.5 233.3 302.2C225.8 313.3 213.4 320 200 320c-22.06 0-40-17.94-40-40C160 257.9 177.9 240 200 240zM532.6 128l-99.9 .004c-31.87 2.289-61.15 19.35-79.13 46.18c-9.828 14.69-5.891 34.56 8.781 44.41c14.66 9.812 34.55 5.906 44.41-8.781C414.2 198.7 426.6 191.1 440 191.1c22.06 0 40 17.94 40 40c0 22.06-17.94 39.1-40 39.1c-16.94 0-32.09-10.72-37.73-26.67c-5.891-16.66-24.17-25.39-40.84-19.5c-16.66 5.891-25.39 24.17-19.5 40.84c10.84 30.64 35.23 53.77 64.96 63.8l-79.68 22.76c-16.98 4.859-26.83 22.56-21.97 39.56c4.844 16.98 22.56 26.86 39.56 21.97l99.2-28.34l-80.82 69.28c-13.42 11.5-14.97 31.7-3.469 45.12c11.52 13.42 31.73 14.98 45.13 3.469l100.4-86.09l-22.33 48.39c-7.391 16.05-.3906 35.06 15.66 42.47c16.02 7.359 35.05 .4219 42.47-15.65l84.02-188C634.9 283.4 640 259.5 640 235.4C640 176.1 591.9 128 532.6 128z\"]\n};\nvar faAmericanSignLanguageInterpreting = faHandsAslInterpreting;\nvar faAslInterpreting = faHandsAslInterpreting;\nvar faHandsAmericanSignLanguageInterpreting = faHandsAslInterpreting;\nvar faHandsBound = {\n  prefix: 'fas',\n  iconName: 'hands-bound',\n  icon: [640, 512, [], \"e4f9\", \"M95.1 144.8L165.3 237.2C170.1 244.7 181.4 246.8 189.6 242C199.3 236.3 201.7 223.3 194.6 214.5L167 179.1C156.2 166.4 158.1 146.7 171.4 135.5C184.6 124.4 204.4 125.8 215.9 138.7L262.6 191.3C278.1 209.7 287.1 233.4 287.1 258.1V352H352V258.1C352 233.4 361 209.7 377.4 191.3L424.1 138.7C435.6 125.8 455.4 124.4 468.6 135.5C481.9 146.7 483.8 166.4 472.1 179.1L445.4 214.5C438.3 223.3 440.7 236.3 450.4 242C458.6 246.8 469 244.7 474.7 237.2L544 144.8V32C544 14.33 558.3 0 576 0C593.7 0 608 14.33 608 32V213.9C608 228 602.9 241.8 593.7 252.5L508.4 352H512C525.3 352 536 362.7 536 376C536 389.3 525.3 400 512 400H128C114.7 400 104 389.3 104 376C104 362.7 114.7 352 128 352H131.6L46.31 252.5C37.07 241.8 32 228 32 213.9V32C32 14.33 46.33 0 64 0C81.67 0 96 14.33 96 32L95.1 144.8zM127.1 480C114.7 480 103.1 469.3 103.1 456C103.1 442.7 114.7 432 127.1 432H512C525.3 432 536 442.7 536 456C536 469.3 525.3 480 512 480H480V512H352V480H287.1V512H159.1V480H127.1z\"]\n};\nvar faHandsBubbles = {\n  prefix: 'fas',\n  iconName: 'hands-bubbles',\n  icon: [576, 512, [\"hands-wash\"], \"e05e\", \"M416 64c17.67 0 32-14.33 32-31.1c0-17.67-14.33-32-32-32c-17.67 0-32 14.33-32 32C384 49.67 398.3 64 416 64zM519.1 336H360c-4.418 0-8-3.582-8-8s3.582-8 8-8h128c14.81 0 26.49-13.42 23.54-28.76c-2.191-11.4-12.84-19.24-24.44-19.24H288l47.09-17.06c12.66-3.906 19.75-17.34 15.84-30.03c-3.938-12.62-17.28-19.69-30.03-15.84L213.2 242.3C162 259.4 128 306.6 128 359.1v25.65c36.47 7.434 64 39.75 64 78.38c0 10.71-2.193 20.91-6.031 30.25C204.1 505.3 225.2 512 248 512h208c14.81 0 26.49-13.42 23.54-28.76c-2.191-11.4-12.84-19.24-24.44-19.24H360c-4.418 0-8-3.582-8-8s3.582-8 8-8h128c14.81 0 26.49-13.42 23.54-28.76c-2.191-11.4-12.84-19.24-24.44-19.24H360c-4.418 0-8-3.582-8-8s3.582-8 8-8h160c14.81 0 26.49-13.42 23.54-28.76C541.3 343.8 530.7 336 519.1 336zM311.5 178.4c5.508-1.66 10.99-2.471 16.5-2.471c6.662 0 12.1 1.334 18.98 3.482l15.36-48.61c4.461-14.12-4.82-29.3-20.33-31.11c-11.53-1.344-22.21 6.443-25.71 17.51l-20.9 66.17L311.5 178.4zM496 224c26.51 0 48-21.49 48-47.1s-21.49-48-48-48S448 149.5 448 176S469.5 224 496 224zM93.65 386.3C94.45 386.1 95.19 385.8 96 385.6v-25.69c0-67.17 43.03-126.7 107.1-148l73.7-22.76l34.15-108.1c4.459-14.12-4.82-29.3-20.33-31.11C279.1 48.6 268.4 56.39 264.9 67.46L231.4 173.9c-1.332 4.213-5.826 6.549-10.04 5.217C217.2 177.8 214.8 173.3 216.2 169.1l43.37-137.8c4.461-14.12-4.82-29.3-20.33-31.11c-11.53-1.344-22.21 6.445-25.71 17.51L165.6 169.4C164.2 173.6 159.7 175.9 155.5 174.6C151.3 173.3 148.1 168.8 150.3 164.6l38.56-122.1c4.459-14.12-4.82-29.3-20.33-31.11C157 10.04 146.3 17.83 142.8 28.9L82.84 218.7L80.76 168.7C80.85 155.5 70.17 144.6 56.9 144.5C43.67 144.5 32.18 155.1 32 168.4v112.7C32.71 325.6 56.76 364.8 93.65 386.3zM112 416c-26.51 0-48 21.49-48 47.1s21.49 48 48 48S160 490.5 160 464S138.5 416 112 416z\"]\n};\nvar faHandsWash = faHandsBubbles;\nvar faHandsClapping = {\n  prefix: 'fas',\n  iconName: 'hands-clapping',\n  icon: [512, 512, [], \"e1a8\", \"M320 96c8.844 0 16-7.156 16-16v-64C336 7.156 328.8 0 320 0s-16 7.156-16 16v64C304 88.84 311.2 96 320 96zM383.4 96c5.125 0 10.16-2.453 13.25-7.016l32.56-48c1.854-2.746 2.744-5.865 2.744-8.951c0-8.947-7.273-16.04-15.97-16.04c-5.125 0-10.17 2.465-13.27 7.02l-32.56 48C368.3 73.76 367.4 76.88 367.4 79.97C367.4 88.88 374.7 96 383.4 96zM384 357.5l0-163.9c0-6.016-4.672-33.69-32-33.69c-17.69 0-32.07 14.33-32.07 31.1L320 268.1L169.2 117.3C164.5 112.6 158.3 110.3 152.2 110.3c-13.71 0-24 11.21-24 24c0 6.141 2.344 12.28 7.031 16.97l89.3 89.3C227.4 243.4 228.9 247.2 228.9 251c0 3.8-1.45 7.6-4.349 10.5c-2.899 2.899-6.7 4.349-10.5 4.349c-3.8 0-7.6-1.45-10.5-4.349l-107.6-107.6C91.22 149.2 85.08 146.9 78.94 146.9c-13.71 0-24 11.21-24 24c0 6.141 2.344 12.28 7.031 16.97l107.6 107.6C172.5 298.4 173.9 302.2 173.9 305.1c0 3.8-1.45 7.6-4.349 10.5c-2.899 2.9-6.7 4.349-10.5 4.349c-3.8 0-7.6-1.45-10.5-4.349L59.28 227.2C54.59 222.5 48.45 220.1 42.31 220.1c-13.71 0-24 11.21-24 24c0 6.141 2.344 12.28 7.031 16.97l89.3 89.3c2.9 2.899 4.349 6.7 4.349 10.5c0 3.8-1.45 7.6-4.349 10.5c-2.899 2.899-6.7 4.349-10.5 4.349c-3.8 0-7.6-1.45-10.5-4.349L40.97 318.7C36.28 314 30.14 311.7 24 311.7c-13.71 0-23.99 11.26-23.99 24.05c0 6.141 2.332 12.23 7.02 16.92C112.6 458.2 151.3 512 232.3 512C318.1 512 384 440.9 384 357.5zM243.3 88.98C246.4 93.55 251.4 96 256.6 96c8.762 0 15.99-7.117 15.99-16.03c0-3.088-.8906-6.205-2.744-8.951l-32.56-48C234.2 18.46 229.1 15.98 223.1 15.98c-8.664 0-15.98 7.074-15.98 16.05c0 3.086 .8906 6.205 2.744 8.951L243.3 88.98zM480 160c-17.69 0-32 14.33-32 32v76.14l-32-32v121.4c0 94.01-63.31 141.5-78.32 152.2C345.1 510.9 352.6 512 360.3 512C446.1 512 512 440.9 512 357.5l-.0625-165.6C511.9 174.3 497.7 160 480 160z\"]\n};\nvar faHandsHolding = {\n  prefix: 'fas',\n  iconName: 'hands-holding',\n  icon: [640, 512, [], \"f4c2\", \"M216.1 236C205.1 222.3 185.8 219.1 172 231c-13.81 11.06-16.05 31.19-5 45l18.86 30.56C194.8 317.7 193.9 333.7 183.8 343.8c-11.79 11.79-31.2 10.71-41.61-2.305L80 256.8V104C80 81.91 62.09 64 40 64S0 81.91 0 104v204.7c0 14.54 4.949 28.65 14.03 40l120.1 151.3C141.1 507.6 150.3 512 159.1 512H256c17.67 0 32.03-14.35 32.03-32.02L288 358.4c0-21.79-7.414-42.93-21.02-59.94L216.1 236zM600 64c-22.09 0-40 17.91-40 40v152.8l-62.2 84.73c-10.41 13.02-29.83 14.09-41.61 2.305c-10.08-10.07-10.97-26.11-2.068-37.24l18.86-30.56c11.05-13.81 8.812-33.94-5-45c-13.77-11.03-33.94-8.75-44.97 5l-49.99 62.5C359.4 315.5 352 336.6 352 358.4l-.0313 121.5C351.1 497.7 366.3 512 384 512h96.02c9.713 0 18.9-4.414 24.96-12l120.1-151.3C635.1 337.4 640 323.3 640 308.7V104C640 81.91 622.1 64 600 64z\"]\n};\nvar faHandsHoldingChild = {\n  prefix: 'fas',\n  iconName: 'hands-holding-child',\n  icon: [640, 512, [], \"e4fa\", \"M280 40C280 17.91 297.9 0 320 0C342.1 0 360 17.91 360 40C360 62.09 342.1 80 320 80C297.9 80 280 62.09 280 40zM375.8 253C377.5 266.2 368.1 278.2 354.1 279.8C341.8 281.5 329.8 272.1 328.2 258.1L323.8 223.1H316.2L311.8 258.1C310.2 272.1 298.2 281.5 285 279.8C271.9 278.2 262.5 266.2 264.2 253L275.3 164.3L255.5 180.1C245.4 189.6 230.2 188.3 221.7 178.2C213.1 168 214.4 152.9 224.5 144.3L266 109.2C276.1 100.7 288.9 96 302.2 96H337.8C351.1 96 363.9 100.7 373.1 109.2L415.5 144.3C425.6 152.9 426.9 168 418.3 178.2C409.8 188.3 394.6 189.6 384.5 180.1L364.7 164.3L375.8 253zM80 258.7L140.3 339C149.7 351.6 167.7 353.8 179.9 343.8C190.4 335.1 193.1 319.1 186 308.3L164.6 272.5C155.9 258 159.9 239.3 173.7 229.7C187.6 220.1 206.5 222.9 216.1 236L263.5 294.1C279.3 313.1 288 338.6 288 364.1V480C288 497.7 273.7 512 256 512H160C150.3 512 141.1 507.6 135 499.1L14.02 348.8C4.946 337.4 0 323.3 0 308.8V103.1C0 81.91 17.91 63.1 40 63.1C62.09 63.1 80 81.91 80 103.1V258.7zM640 104V308.8C640 323.3 635.1 337.4 625.1 348.8L504.1 499.1C498.9 507.6 489.7 512 480 512H384C366.3 512 352 497.7 352 480V364.1C352 338.6 360.7 313.1 376.5 294.1L423 236C433.5 222.9 452.4 220.1 466.3 229.7C480.1 239.3 484.1 258 475.4 272.5L453.1 308.3C446.9 319.1 449.6 335.1 460.2 343.8C472.3 353.8 490.3 351.6 499.7 339L560 258.7V104C560 81.91 577.9 64 600 64C622.1 64 640 81.91 640 104V104z\"]\n};\nvar faHandsHoldingCircle = {\n  prefix: 'fas',\n  iconName: 'hands-holding-circle',\n  icon: [640, 512, [], \"e4fb\", \"M208 112C208 50.14 258.1 0 320 0C381.9 0 432 50.14 432 112C432 173.9 381.9 224 320 224C258.1 224 208 173.9 208 112zM80 258.7L140.3 339C149.7 351.6 167.7 353.8 179.9 343.8C190.4 335.1 193.1 319.1 186 308.3L164.6 272.5C155.9 258 159.9 239.3 173.7 229.7C187.6 220.1 206.5 222.9 216.1 236L263.5 294.1C279.3 313.1 288 338.6 288 364.1V480C288 497.7 273.7 512 256 512H160C150.3 512 141.1 507.6 135 499.1L14.02 348.8C4.946 337.4 0 323.3 0 308.8V103.1C0 81.91 17.91 63.1 40 63.1C62.09 63.1 80 81.91 80 103.1V258.7zM640 104V308.8C640 323.3 635.1 337.4 625.1 348.8L504.1 499.1C498.9 507.6 489.7 512 480 512H384C366.3 512 352 497.7 352 480V364.1C352 338.6 360.7 313.1 376.5 294.1L423 236C433.5 222.9 452.4 220.1 466.3 229.7C480.1 239.3 484.1 258 475.4 272.5L453.1 308.3C446.9 319.1 449.6 335.1 460.2 343.8C472.3 353.8 490.3 351.6 499.7 339L560 258.7V104C560 81.91 577.9 64 600 64C622.1 64 640 81.91 640 104V104z\"]\n};\nvar faHandsPraying = {\n  prefix: 'fas',\n  iconName: 'hands-praying',\n  icon: [640, 512, [\"praying-hands\"], \"f684\", \"M272 191.9c-17.62 0-32 14.35-32 31.97V303.9c0 8.875-7.125 16-16 16s-16-7.125-16-16V227.4c0-17.37 4.75-34.5 13.75-49.37L299.5 48.41c9-15.12 4.125-34.76-11-43.88C273.1-4.225 255.8 .1289 246.1 13.63C245.1 13.88 245.5 13.88 245.4 14.13L128.1 190C117.5 205.9 112 224.3 112 243.3v80.24l-90.13 29.1C8.75 357.9 0 370.1 0 383.9v95.99c0 10.88 8.5 31.1 32 31.1c2.75 0 5.375-.25 8-1l179.3-46.62C269.1 450 304 403.8 304 351.9V223.9C304 206.3 289.6 191.9 272 191.9zM618.1 353.6L528 323.6V243.4c0-19-5.5-37.37-16.12-53.25l-117.3-175.9c-.125-.25-.6251-.2487-.75-.4987c-9.625-13.5-27.88-17.85-42.38-9.229c-15.12 9.125-20 28.76-11 44.01l77.75 129.5C427.3 193 432 210 432 227.5v76.49c0 8.875-7.125 16-16 16s-16-7.125-16-16V223.1c0-17.62-14.38-31.97-32-31.97s-32 14.38-32 31.1v127.1c0 51.87 34.88 98.12 84.75 112.4L600 511C602.6 511.6 605.4 512 608 512c23.5 0 32-21.25 32-31.1v-95.99C640 370.3 631.3 358 618.1 353.6z\"]\n};\nvar faPrayingHands = faHandsPraying;\nvar faHandshake = {\n  prefix: 'fas',\n  iconName: 'handshake',\n  icon: [640, 512, [], \"f2b5\", \"M0 383.9l64 .0404c17.75 0 32-14.29 32-32.03V128.3L0 128.3V383.9zM48 320.1c8.75 0 16 7.118 16 15.99c0 8.742-7.25 15.99-16 15.99S32 344.8 32 336.1C32 327.2 39.25 320.1 48 320.1zM348.8 64c-7.941 0-15.66 2.969-21.52 8.328L228.9 162.3C228.8 162.5 228.8 162.7 228.6 162.7C212 178.3 212.3 203.2 226.5 218.7c12.75 13.1 39.38 17.62 56.13 2.75C282.8 221.3 282.9 221.3 283 221.2l79.88-73.1c6.5-5.871 16.75-5.496 22.62 1c6 6.496 5.5 16.62-1 22.62l-26.12 23.87L504 313.7c2.875 2.496 5.5 4.996 7.875 7.742V127.1c-40.98-40.96-96.48-63.88-154.4-63.88L348.8 64zM334.6 217.4l-30 27.49c-29.75 27.11-75.25 24.49-101.8-4.371C176 211.2 178.1 165.7 207.3 138.9L289.1 64H282.5C224.7 64 169.1 87.08 128.2 127.9L128 351.8l18.25 .0369l90.5 81.82c27.5 22.37 67.75 18.12 90-9.246l18.12 15.24c15.88 12.1 39.38 10.5 52.38-5.371l31.38-38.6l5.374 4.498c13.75 11 33.88 9.002 45-4.748l9.538-11.78c11.12-13.75 9.036-33.78-4.694-44.93L334.6 217.4zM544 128.4v223.6c0 17.62 14.25 32.05 31.1 32.05L640 384V128.1L544 128.4zM592 352c-8.75 0-16-7.246-16-15.99c0-8.875 7.25-15.99 16-15.99S608 327.2 608 336.1C608 344.8 600.8 352 592 352z\"]\n};\nvar faHandshakeAngle = {\n  prefix: 'fas',\n  iconName: 'handshake-angle',\n  icon: [640, 512, [\"hands-helping\"], \"f4c4\", \"M488 191.1h-152l.0001 51.86c.0001 37.66-27.08 72-64.55 75.77c-43.09 4.333-79.45-29.42-79.45-71.63V126.4l-24.51 14.73C123.2 167.8 96.04 215.7 96.04 267.5L16.04 313.8c-15.25 8.751-20.63 28.38-11.75 43.63l80 138.6c8.875 15.25 28.5 20.5 43.75 11.75l103.4-59.75h136.6c35.25 0 64-28.75 64-64c26.51 0 48-21.49 48-48V288h8c13.25 0 24-10.75 24-24l.0001-48C512 202.7 501.3 191.1 488 191.1zM635.7 154.5l-79.95-138.6c-8.875-15.25-28.5-20.5-43.75-11.75l-103.4 59.75h-62.57c-37.85 0-74.93 10.61-107.1 30.63C229.7 100.4 224 110.6 224 121.6l-.0004 126.4c0 22.13 17.88 40 40 40c22.13 0 40-17.88 40-40V159.1h184c30.93 0 56 25.07 56 56v28.5l80-46.25C639.3 189.4 644.5 169.8 635.7 154.5z\"]\n};\nvar faHandsHelping = faHandshakeAngle;\nvar faHandshakeSimple = {\n  prefix: 'fas',\n  iconName: 'handshake-simple',\n  icon: [640, 512, [129309, \"handshake-alt\"], \"f4c6\", \"M334.6 217.4l-30 27.49C264 282.1 217.8 256.8 202.9 240.6C176 211.2 178.1 165.7 207.3 138.9L289.1 64H282.5C224.7 64 169.1 86.95 128.2 127.8L32 128.1c-17.6 0-32 14.39-32 31.98v159.8c0 17.59 14.4 32.04 31.1 32.04l114.3-.0604l90.5 81.82c27.5 22.37 67.75 18.11 90-9.255l18.12 15.25c15.88 12.1 39.38 10.5 52.38-5.369l31.38-38.6l5.374 4.498c13.75 11 33.88 9.002 45-4.748l9.576-11.83c11.08-13.7 8.979-33.75-4.701-44.86L334.6 217.4zM608 128.1l-96-.1257c-40.98-40.96-96.56-63.88-154.5-63.88L348.9 64c-8 0-15.62 3.197-21.62 8.568L229 162.3C228.9 162.5 228.8 162.7 228.8 162.7C212 178.5 212.4 203.3 226.6 218.7c9.625 10.5 35 21.62 56.13 2.75c0-.125 .25-.125 .375-.25l80-73.1c6.5-5.871 16.62-5.496 22.62 1s5.5 16.62-1 22.62l-26.12 23.87l145.6 118.1c12.12 9.992 19.5 23.49 22.12 37.98L608 351.7c17.6 0 32-14.38 32-31.98V160.1C640 142.4 625.7 128.1 608 128.1z\"]\n};\nvar faHandshakeAlt = faHandshakeSimple;\nvar faHandshakeSimpleSlash = {\n  prefix: 'fas',\n  iconName: 'handshake-simple-slash',\n  icon: [640, 512, [\"handshake-alt-slash\"], \"e05f\", \"M358.6 195.6l145.6 118.1c12.12 9.992 19.5 23.49 22.12 37.98h81.62c17.6 0 31.1-14.39 31.1-31.99V159.1c0-17.67-14.33-31.99-31.1-31.99h-95.1c-40.98-40.96-96.56-63.98-154.5-63.98h-8.613c-7.1 0-15.63 3.002-21.63 8.373l-93.44 85.57L208.3 137.9L289.1 64.01L282.5 64c-43.48 0-85.19 13.66-120.8 37.44l-122.9-96.33C34.41 1.672 29.19 0 24.03 0c-7.125 0-14.19 3.156-18.91 9.187c-8.187 10.44-6.375 25.53 4.062 33.7L601.2 506.9c10.5 8.203 25.56 6.328 33.69-4.078c8.187-10.44 6.375-25.53-4.062-33.7l-135.5-106.2c-.1719-9.086-3.789-18.03-11.39-24.2l-149.2-121.2l-11.47 10.51L297.6 207.1l65.51-59.85c6.5-5.871 16.62-5.496 22.62 .1c5.1 6.496 5.5 16.62-.1 22.62L358.6 195.6zM32 127.1c-17.6 0-31.1 14.4-31.1 31.99v159.8c0 17.59 14.4 32.06 31.1 32.06l114.2-.0712l90.5 81.85c27.5 22.37 67.75 18.12 89.1-9.25l18.12 15.25c15.87 12.1 39.37 10.5 52.37-5.371l13.02-16.03L39.93 127.1L32 127.1z\"]\n};\nvar faHandshakeAltSlash = faHandshakeSimpleSlash;\nvar faHandshakeSlash = {\n  prefix: 'fas',\n  iconName: 'handshake-slash',\n  icon: [640, 512, [], \"e060\", \"M543.1 128.2l.0002 223.8c0 17.62 14.25 31.99 31.1 31.99h64V128.1L543.1 128.2zM591.1 352c-8.75 0-16-7.251-16-15.99c0-8.875 7.25-15.1 16-15.1c8.75 0 15.1 7.122 15.1 15.1C607.1 344.8 600.7 352 591.1 352zM.0005 128.2v255.7l63.1 .0446c17.75 0 32-14.28 32-32.03L96 171.9l-55.77-43.71H.0005zM64 336c0 8.742-7.25 15.99-15.1 15.99s-15.1-7.251-15.1-15.99c0-8.875 7.25-15.1 15.1-15.1S64 327.2 64 336zM128 351.8h18.25l90.5 81.85c27.5 22.37 67.75 18.12 89.1-9.25l18.12 15.25c15.87 12.1 39.37 10.5 52.37-5.371l13.02-16.03L128 196.1V351.8zM495.2 362.8c-.1875-9.101-3.824-18.05-11.44-24.24l-149.2-121.1l-11.47 10.51L297.5 207.9l65.33-59.79c6.5-5.871 16.75-5.496 22.62 1c5.1 6.496 5.5 16.62-1 22.62l-26.12 23.87l145.6 118.1c2.875 2.496 5.5 4.996 7.875 7.742V127.1c-40.98-40.96-96.52-63.98-154.5-63.98h-8.613c-7.941 0-15.64 2.97-21.5 8.329L233.7 157.9L208.3 137.9l80.85-73.92L282.5 64c-43.47 0-85.16 13.68-120.8 37.45L38.81 5.109C34.41 1.672 29.19 0 24.03 0C16.91 0 9.846 3.156 5.127 9.187C-3.06 19.62-1.248 34.72 9.19 42.89l591.1 463.1c10.5 8.203 25.56 6.328 33.69-4.078c8.187-10.44 6.375-25.53-4.062-33.7L495.2 362.8z\"]\n};\nvar faHanukiah = {\n  prefix: 'fas',\n  iconName: 'hanukiah',\n  icon: [640, 512, [128334], \"f6e6\", \"M231.1 159.9C227.6 159.9 224 163.6 224 168V288h32V168C256 163.6 252.4 160 248 160L231.1 159.9zM167.1 159.9C163.6 159.9 160 163.6 160 168V288h32V168C192 163.6 188.4 160 184 160L167.1 159.9zM392 160C387.6 160 384 163.6 384 168V288h32V168c0-4.375-3.625-8.061-8-8.061L392 160zM456 160C451.6 160 448 163.6 448 168V288h32V168c0-4.375-3.625-8.061-8-8.061L456 160zM544 168c0-4.375-3.625-8.061-8-8.061L520 160C515.6 160 512 163.6 512 168V288h32V168zM103.1 159.9C99.62 159.9 96 163.6 96 168V288h32V168C128 163.6 124.4 160 120 160L103.1 159.9zM624 160h-31.98c-8.837 0-16.03 7.182-16.03 16.02L576 288c0 17.6-14.4 32-32 32h-192V128c0-8.837-7.151-16.01-15.99-16.01H303.1C295.2 111.1 288 119.2 288 128v192H96c-17.6 0-32-14.4-32-32l.0065-112C64.01 167.2 56.85 160 48.02 160H16C7.163 160 0 167.2 0 176V288c0 53.02 42.98 96 96 96h192v64H175.1C149.5 448 128 469.5 128 495.1C128 504.8 135.2 512 143.1 512h352C504.9 512 512 504.9 512 496C512 469.5 490.5 448 464 448H352v-64h192c53.02 0 96-42.98 96-96V176C640 167.2 632.8 160 624 160zM607.1 127.9C621.2 127.9 632 116 632 101.4C632 86.62 608 48 608 48s-24 38.62-24 53.38C584 116 594.7 127.9 607.1 127.9zM31.1 127.9C45.25 127.9 56 116 56 101.4C56 86.62 32 48 32 48S8 86.62 8 101.4C8 116 18.75 127.9 31.1 127.9zM319.1 79.94c13.25 0 24-11.94 24-26.57C344 38.62 320 0 320 0S296 38.62 296 53.38C296 67.1 306.7 79.94 319.1 79.94zM112 128c13.25 0 24-12 24-26.62C136 86.62 112 48 112 48S88 86.62 88 101.4C88 115.1 98.75 128 112 128zM176 128c13.25 0 24-12 24-26.62C200 86.62 176 48 176 48S152 86.62 152 101.4C152 115.1 162.8 128 176 128zM240 128c13.25 0 24-12 24-26.62C264 86.62 240 48 240 48S216 86.62 216 101.4C216 115.1 226.8 128 240 128zM400 128c13.25 0 24-12 24-26.62C424 86.62 400 48 400 48s-24 38.62-24 53.38C376 115.1 386.8 128 400 128zM464 128c13.25 0 24-12 24-26.62C488 86.62 464 48 464 48s-24 38.62-24 53.38C440 115.1 450.8 128 464 128zM528 128c13.25 0 24-12 24-26.62C552 86.62 528 48 528 48s-24 38.62-24 53.38C504 115.1 514.8 128 528 128z\"]\n};\nvar faHardDrive = {\n  prefix: 'fas',\n  iconName: 'hard-drive',\n  icon: [512, 512, [128436, \"hdd\"], \"f0a0\", \"M464 288h-416C21.5 288 0 309.5 0 336v96C0 458.5 21.5 480 48 480h416c26.5 0 48-21.5 48-48v-96C512 309.5 490.5 288 464 288zM320 416c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S337.6 416 320 416zM416 416c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S433.6 416 416 416zM464 32h-416C21.5 32 0 53.5 0 80v192.4C13.41 262.3 29.92 256 48 256h416c18.08 0 34.59 6.254 48 16.41V80C512 53.5 490.5 32 464 32z\"]\n};\nvar faHdd = faHardDrive;\nvar faHashtag = {\n  prefix: 'fas',\n  iconName: 'hashtag',\n  icon: [448, 512, [62098], \"23\", \"M416 127.1h-58.23l9.789-58.74c2.906-17.44-8.875-33.92-26.3-36.83c-17.53-2.875-33.92 8.891-36.83 26.3L292.9 127.1H197.8l9.789-58.74c2.906-17.44-8.875-33.92-26.3-36.83c-17.53-2.875-33.92 8.891-36.83 26.3L132.9 127.1H64c-17.67 0-32 14.33-32 32C32 177.7 46.33 191.1 64 191.1h58.23l-21.33 128H32c-17.67 0-32 14.33-32 32c0 17.67 14.33 31.1 32 31.1h58.23l-9.789 58.74c-2.906 17.44 8.875 33.92 26.3 36.83C108.5 479.9 110.3 480 112 480c15.36 0 28.92-11.09 31.53-26.73l11.54-69.27h95.12l-9.789 58.74c-2.906 17.44 8.875 33.92 26.3 36.83C268.5 479.9 270.3 480 272 480c15.36 0 28.92-11.09 31.53-26.73l11.54-69.27H384c17.67 0 32-14.33 32-31.1c0-17.67-14.33-32-32-32h-58.23l21.33-128H416c17.67 0 32-14.32 32-31.1C448 142.3 433.7 127.1 416 127.1zM260.9 319.1H165.8L187.1 191.1h95.12L260.9 319.1z\"]\n};\nvar faHatCowboy = {\n  prefix: 'fas',\n  iconName: 'hat-cowboy',\n  icon: [640, 512, [], \"f8c0\", \"M489.1 264.9C480.5 207.5 450.5 32 392.3 32c-14 0-26.58 5.875-37.08 14c-20.75 15.87-49.62 15.87-70.5 0C274.2 38 261.7 32 247.7 32c-58.25 0-88.27 175.5-97.77 232.9C188.7 277.5 243.7 288 319.1 288S451.2 277.5 489.1 264.9zM632.9 227.7c-6.125-4.125-14.2-3.51-19.7 1.49c-1 .875-101.3 90.77-293.1 90.77c-190.9 0-292.2-89.99-293.2-90.86c-5.5-4.875-13.71-5.508-19.71-1.383c-6.125 4.125-8.587 11.89-6.087 18.77C1.749 248.5 78.37 448 319.1 448s318.2-199.5 318.1-201.5C641.5 239.6 639 231.9 632.9 227.7z\"]\n};\nvar faHatCowboySide = {\n  prefix: 'fas',\n  iconName: 'hat-cowboy-side',\n  icon: [640, 512, [], \"f8c1\", \"M260.8 260C232.1 237.1 198.8 225 164.4 225c-77.38 0-142.9 62.75-163 156c-3.5 16.62-.375 33.88 8.625 47.38c8.75 13.12 21.88 20.62 35.88 20.62H592c-103.2 0-155-37.13-233.2-104.5L260.8 260zM495.5 241.8l-27.13-156.5c-2.875-17.25-12.75-32.5-27.12-42.25c-14.37-9.75-32.24-13.3-49.24-9.675L200.9 74.02C173.7 79.77 153.5 102.3 150.5 129.8L143.6 195c6.875-.875 13.62-2 20.75-2c41.87 0 82 14.5 117.4 42.88l98 84.37c71 61.25 115.1 96.75 212.2 96.75c26.5 0 48-21.5 48-48C640 343.6 610.4 249.6 495.5 241.8z\"]\n};\nvar faHatWizard = {\n  prefix: 'fas',\n  iconName: 'hat-wizard',\n  icon: [512, 512, [], \"f6e8\", \"M200 376l-49.23-16.41c-7.289-2.434-7.289-12.75 0-15.18L200 328l16.41-49.23c2.434-7.289 12.75-7.289 15.18 0L248 328l49.23 16.41c7.289 2.434 7.289 12.75 0 15.18L248 376L240 416H448l-86.38-201.6C355.4 200 354.8 183.8 359.8 168.9L416 0L228.4 107.3C204.8 120.8 185.1 141.4 175 166.4L64 416h144L200 376zM231.2 172.4L256 160l12.42-24.84c1.477-2.949 5.68-2.949 7.156 0L288 160l24.84 12.42c2.949 1.477 2.949 5.68 0 7.156L288 192l-12.42 24.84c-1.477 2.949-5.68 2.949-7.156 0L256 192L231.2 179.6C228.2 178.1 228.2 173.9 231.2 172.4zM496 448h-480C7.164 448 0 455.2 0 464C0 490.5 21.49 512 48 512h416c26.51 0 48-21.49 48-48C512 455.2 504.8 448 496 448z\"]\n};\nvar faHeadSideCough = {\n  prefix: 'fas',\n  iconName: 'head-side-cough',\n  icon: [640, 512, [], \"e061\", \"M608 359.1c-13.25 0-24 10.75-24 24s10.75 24 24 24s24-10.75 24-24S621.3 359.1 608 359.1zM477.2 275c-21-47.13-48.49-151.8-73.11-186.8C365.6 33.63 302.5 0 234.1 0L192 0C86 0 0 86 0 192c0 56.75 24.75 107.6 64 142.9L64 512h223.1v-32h64.01c35.38 0 64-28.62 64-63.1L320 416c-17.67 0-32-14.33-32-32s14.33-32 32-32h95.98l-.003-32h31.99C471.1 320 486.6 296.1 477.2 275zM336 224c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S353.6 224 336 224zM480 359.1c-13.25 0-23.1 10.75-23.1 24s10.75 24 23.1 24s24-10.75 24-24S493.3 359.1 480 359.1zM608 311.1c13.25 0 24-10.75 24-24s-10.75-24-24-24s-24 10.75-24 24S594.8 311.1 608 311.1zM544 311.1c-13.25 0-23.1 10.75-23.1 24s10.75 24 23.1 24s24-10.75 24-24S557.3 311.1 544 311.1zM544 407.1c-13.25 0-23.1 10.75-23.1 24s10.75 24 23.1 24s24-10.75 24-24S557.3 407.1 544 407.1zM608 455.1c-13.25 0-24 10.75-24 24s10.75 24 24 24s24-10.75 24-24S621.3 455.1 608 455.1z\"]\n};\nvar faHeadSideCoughSlash = {\n  prefix: 'fas',\n  iconName: 'head-side-cough-slash',\n  icon: [640, 512, [], \"e062\", \"M607.1 311.1c13.25 0 24-10.75 24-23.1s-10.75-23.1-24-23.1s-23.1 10.75-23.1 23.1S594.7 311.1 607.1 311.1zM607.1 407.1c13.25 0 24-10.78 24-24.03c0-13.25-10.75-23.1-24-23.1s-24 10.78-24 24.03C583.1 397.2 594.7 407.1 607.1 407.1zM630.8 469.1l-190.2-149.1h7.4c23.12 0 38.62-23.87 29.25-44.1c-20.1-47.12-48.49-151.7-73.11-186.7C365.6 33.63 302.5 0 234.1 0H192C149.9 0 111.5 14.26 79.88 37.29L38.81 5.109C34.41 1.672 29.19 0 24.03 0C16.91 0 9.845 3.156 5.126 9.187c-8.187 10.44-6.375 25.53 4.062 33.7l591.1 463.1c10.5 8.203 25.56 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1zM320 415.1c-17.67 0-31.1-14.33-31.1-31.1S302.3 351.1 320 351.1l5.758-.0009L18.16 110.9C6.631 135.6 .0006 162.1 .0006 191.1c0 56.75 24.75 107.6 64 142.9L64 511.1h223.1l0-31.1l64.01 .001c33.25 0 60.2-25.38 63.37-57.78l-7.932-6.217H320zM543.1 359.1c13.25 0 24-10.78 24-24.03s-10.75-23.1-24-23.1c-13.25 0-24 10.78-24 24.03C519.1 349.2 530.7 359.1 543.1 359.1z\"]\n};\nvar faHeadSideMask = {\n  prefix: 'fas',\n  iconName: 'head-side-mask',\n  icon: [512, 512, [], \"e063\", \"M.1465 184.4C-2.166 244.2 23.01 298 63.99 334.9L63.99 512h160L224 316.5L3.674 156.2C1.871 165.4 .5195 174.8 .1465 184.4zM336 368H496L512 320h-255.1l.0178 192h145.9c27.55 0 52-17.63 60.71-43.76L464 464h-127.1c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16h138.7l10.67-32h-149.3c-8.836 0-16-7.164-16-16C320 375.2 327.2 368 336 368zM509.2 275c-20.1-47.13-48.49-151.8-73.11-186.8C397.6 33.63 334.5 0 266.1 0H200C117.1 0 42.48 50.57 13.25 123.7L239.2 288h272.6C511.8 283.7 511.1 279.3 509.2 275zM352 224c-17.62 0-32-14.38-32-32s14.38-32 32-32c17.62 0 31.1 14.38 31.1 32S369.6 224 352 224z\"]\n};\nvar faHeadSideVirus = {\n  prefix: 'fas',\n  iconName: 'head-side-virus',\n  icon: [512, 512, [], \"e064\", \"M208 175.1c-8.836 0-16 7.162-16 16c0 8.836 7.163 15.1 15.1 15.1s16-7.164 16-16C224 183.2 216.8 175.1 208 175.1zM272 239.1c-8.836 0-15.1 7.163-15.1 16c0 8.836 7.165 16 16 16s16-7.164 16-16C288 247.2 280.8 239.1 272 239.1zM509.2 275c-20.94-47.13-48.46-151.7-73.1-186.8C397.7 33.59 334.6 0 266.1 0H192C85.95 0 0 85.95 0 192c0 56.8 24.8 107.7 64 142.8L64 512h256l-.0044-64h63.99c35.34 0 63.1-28.65 63.1-63.1V320h31.98C503.1 320 518.6 296.2 509.2 275zM368 240h-12.12c-28.51 0-42.79 34.47-22.63 54.63l8.576 8.576c6.25 6.25 6.25 16.38 0 22.62c-3.125 3.125-7.219 4.688-11.31 4.688s-8.188-1.562-11.31-4.688l-8.576-8.576c-20.16-20.16-54.63-5.881-54.63 22.63V352c0 8.844-7.156 16-16 16s-16-7.156-16-16v-12.12c0-28.51-34.47-42.79-54.63-22.63l-8.576 8.576c-3.125 3.125-7.219 4.688-11.31 4.688c-4.096 0-8.188-1.562-11.31-4.688c-6.25-6.25-6.25-16.38 0-22.62l8.577-8.576C166.9 274.5 152.6 240 124.1 240H112c-8.844 0-16-7.156-16-16s7.157-16 16-16L124.1 208c28.51 0 42.79-34.47 22.63-54.63L138.2 144.8c-6.25-6.25-6.25-16.38 0-22.62s16.38-6.25 22.63 0L169.4 130.7c20.16 20.16 54.63 5.881 54.63-22.63V96c0-8.844 7.156-16 16-16S256 87.16 256 96v12.12c0 28.51 34.47 42.79 54.63 22.63l8.576-8.576c6.25-6.25 16.38-6.25 22.63 0s6.25 16.38 0 22.62L333.3 153.4C313.1 173.5 327.4 208 355.9 208l12.12-.0004c8.844 0 15.1 7.157 15.1 16S376.8 240 368 240z\"]\n};\nvar faHeading = {\n  prefix: 'fas',\n  iconName: 'heading',\n  icon: [448, 512, [\"header\"], \"f1dc\", \"M448 448c0 17.69-14.33 32-32 32h-96c-17.67 0-32-14.31-32-32s14.33-32 32-32h16v-144h-224v144H128c17.67 0 32 14.31 32 32s-14.33 32-32 32H32c-17.67 0-32-14.31-32-32s14.33-32 32-32h16v-320H32c-17.67 0-32-14.31-32-32s14.33-32 32-32h96c17.67 0 32 14.31 32 32s-14.33 32-32 32H112v112h224v-112H320c-17.67 0-32-14.31-32-32s14.33-32 32-32h96c17.67 0 32 14.31 32 32s-14.33 32-32 32h-16v320H416C433.7 416 448 430.3 448 448z\"]\n};\nvar faHeader = faHeading;\nvar faHeadphones = {\n  prefix: 'fas',\n  iconName: 'headphones',\n  icon: [512, 512, [127911], \"f025\", \"M512 287.9l-.0042 112C511.1 444.1 476.1 480 432 480c-26.47 0-48-21.56-48-48.06V304.1C384 277.6 405.5 256 432 256c10.83 0 20.91 2.723 30.3 6.678C449.7 159.1 362.1 80.13 256 80.13S62.29 159.1 49.7 262.7C59.09 258.7 69.17 256 80 256C106.5 256 128 277.6 128 304.1v127.9C128 458.4 106.5 480 80 480c-44.11 0-79.1-35.88-79.1-80.06L0 288c0-141.2 114.8-256 256-256c140.9 0 255.6 114.5 255.1 255.3C511.1 287.5 511.1 287.7 512 287.9z\"]\n};\nvar faHeadphonesSimple = {\n  prefix: 'fas',\n  iconName: 'headphones-simple',\n  icon: [512, 512, [\"headphones-alt\"], \"f58f\", \"M256 32C112.9 32 4.563 151.1 0 288v104C0 405.3 10.75 416 23.1 416S48 405.3 48 392V288c0-114.7 93.34-207.8 208-207.8C370.7 80.2 464 173.3 464 288v104C464 405.3 474.7 416 488 416S512 405.3 512 392V287.1C507.4 151.1 399.1 32 256 32zM160 288L144 288c-35.34 0-64 28.7-64 64.13v63.75C80 451.3 108.7 480 144 480L160 480c17.66 0 32-14.34 32-32.05v-127.9C192 302.3 177.7 288 160 288zM368 288L352 288c-17.66 0-32 14.32-32 32.04v127.9c0 17.7 14.34 32.05 32 32.05L368 480c35.34 0 64-28.7 64-64.13v-63.75C432 316.7 403.3 288 368 288z\"]\n};\nvar faHeadphonesAlt = faHeadphonesSimple;\nvar faHeadset = {\n  prefix: 'fas',\n  iconName: 'headset',\n  icon: [512, 512, [], \"f590\", \"M191.1 224c0-17.72-14.34-32.04-32-32.04L144 192c-35.34 0-64 28.66-64 64.08v47.79C80 339.3 108.7 368 144 368H160c17.66 0 32-14.36 32-32.06L191.1 224zM256 0C112.9 0 4.583 119.1 .0208 256L0 296C0 309.3 10.75 320 23.1 320S48 309.3 48 296V256c0-114.7 93.34-207.8 208-207.8C370.7 48.2 464 141.3 464 256v144c0 22.09-17.91 40-40 40h-110.7C305 425.7 289.7 416 272 416H241.8c-23.21 0-44.5 15.69-48.87 38.49C187 485.2 210.4 512 239.1 512H272c17.72 0 33.03-9.711 41.34-24H424c48.6 0 88-39.4 88-88V256C507.4 119.1 399.1 0 256 0zM368 368c35.34 0 64-28.7 64-64.13V256.1C432 220.7 403.3 192 368 192l-16 0c-17.66 0-32 14.34-32 32.04L320 335.9C320 353.7 334.3 368 352 368H368z\"]\n};\nvar faHeart = {\n  prefix: 'fas',\n  iconName: 'heart',\n  icon: [512, 512, [128153, 128154, 128155, 128156, 128420, 129293, 129294, 129505, 10084, 61578, 9829], \"f004\", \"M0 190.9V185.1C0 115.2 50.52 55.58 119.4 44.1C164.1 36.51 211.4 51.37 244 84.02L256 96L267.1 84.02C300.6 51.37 347 36.51 392.6 44.1C461.5 55.58 512 115.2 512 185.1V190.9C512 232.4 494.8 272.1 464.4 300.4L283.7 469.1C276.2 476.1 266.3 480 256 480C245.7 480 235.8 476.1 228.3 469.1L47.59 300.4C17.23 272.1 .0003 232.4 .0003 190.9L0 190.9z\"]\n};\nvar faHeartCircleBolt = {\n  prefix: 'fas',\n  iconName: 'heart-circle-bolt',\n  icon: [576, 512, [], \"e4fc\", \"M256 368C256 403.7 266.6 436.9 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C103.6 15.73 186.5 24.72 236.5 75.67L256.4 96.64L275.4 75.67C325.4 24.72 407.3 15.73 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C484.3 198 458.8 192 432 192C334.8 192 256 270.8 256 368zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM464.8 286.4L368.8 358.4C364.7 361.5 362.1 366.9 364.6 371.8C366.2 376.7 370.8 380 376 380H411.6L381.5 434.2C378.8 439.1 379.8 445.3 384.1 449C388.4 452.8 394.7 452.1 399.2 449.6L495.2 377.6C499.3 374.5 501 369.1 499.4 364.2C497.8 359.3 493.2 356 488 356H452.4L482.5 301.8C485.2 296.9 484.2 290.7 479.9 286.1C475.6 283.2 469.3 283 464.8 286.4V286.4z\"]\n};\nvar faHeartCircleCheck = {\n  prefix: 'fas',\n  iconName: 'heart-circle-check',\n  icon: [576, 512, [], \"e4fd\", \"M256 368C256 403.7 266.6 436.9 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C103.6 15.73 186.5 24.72 236.5 75.67L256.4 96.64L275.4 75.67C325.4 24.72 407.3 15.73 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C484.3 198 458.8 192 432 192C334.8 192 256 270.8 256 368zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM476.7 324.7L416 385.4L387.3 356.7C381.1 350.4 370.9 350.4 364.7 356.7C358.4 362.9 358.4 373.1 364.7 379.3L404.7 419.3C410.9 425.6 421.1 425.6 427.3 419.3L499.3 347.3C505.6 341.1 505.6 330.9 499.3 324.7C493.1 318.4 482.9 318.4 476.7 324.7H476.7z\"]\n};\nvar faHeartCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'heart-circle-exclamation',\n  icon: [576, 512, [], \"e4fe\", \"M256 368C256 403.7 266.6 436.9 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C103.6 15.73 186.5 24.72 236.5 75.67L256.4 96.64L275.4 75.67C325.4 24.72 407.3 15.73 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C484.3 198 458.8 192 432 192C334.8 192 256 270.8 256 368zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464zM415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288z\"]\n};\nvar faHeartCircleMinus = {\n  prefix: 'fas',\n  iconName: 'heart-circle-minus',\n  icon: [576, 512, [], \"e4ff\", \"M256 368C256 403.7 266.6 436.9 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C103.6 15.73 186.5 24.72 236.5 75.67L256.4 96.64L275.4 75.67C325.4 24.72 407.3 15.73 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C484.3 198 458.8 192 432 192C334.8 192 256 270.8 256 368zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM496 351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1z\"]\n};\nvar faHeartCirclePlus = {\n  prefix: 'fas',\n  iconName: 'heart-circle-plus',\n  icon: [576, 512, [], \"e500\", \"M256 368C256 403.7 266.6 436.9 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C103.6 15.73 186.5 24.72 236.5 75.67L256.4 96.64L275.4 75.67C325.4 24.72 407.3 15.73 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C484.3 198 458.8 192 432 192C334.8 192 256 270.8 256 368zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM448 303.1C448 295.2 440.8 287.1 432 287.1C423.2 287.1 416 295.2 416 303.1V351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H416V431.1C416 440.8 423.2 447.1 432 447.1C440.8 447.1 448 440.8 448 431.1V383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1H448V303.1z\"]\n};\nvar faHeartCircleXmark = {\n  prefix: 'fas',\n  iconName: 'heart-circle-xmark',\n  icon: [576, 512, [], \"e501\", \"M256 368C256 403.7 266.6 436.9 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C103.6 15.73 186.5 24.72 236.5 75.67L256.4 96.64L275.4 75.67C325.4 24.72 407.3 15.73 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C484.3 198 458.8 192 432 192C334.8 192 256 270.8 256 368zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM491.3 331.3C497.6 325.1 497.6 314.9 491.3 308.7C485.1 302.4 474.9 302.4 468.7 308.7L432 345.4L395.3 308.7C389.1 302.4 378.9 302.4 372.7 308.7C366.4 314.9 366.4 325.1 372.7 331.3L409.4 368L372.7 404.7C366.4 410.9 366.4 421.1 372.7 427.3C378.9 433.6 389.1 433.6 395.3 427.3L432 390.6L468.7 427.3C474.9 433.6 485.1 433.6 491.3 427.3C497.6 421.1 497.6 410.9 491.3 404.7L454.6 368L491.3 331.3z\"]\n};\nvar faHeartCrack = {\n  prefix: 'fas',\n  iconName: 'heart-crack',\n  icon: [512, 512, [128148, \"heart-broken\"], \"f7a9\", \"M119.4 44.1C142.7 40.22 166.2 42.2 187.1 49.43L237.8 126.9L162.3 202.3C160.8 203.9 159.1 205.1 160 208.2C160 210.3 160.1 212.4 162.6 213.9L274.6 317.9C277.5 320.6 281.1 320.7 285.1 318.2C288.2 315.6 288.9 311.2 286.8 307.8L226.4 209.7L317.1 134.1C319.7 131.1 320.7 128.5 319.5 125.3L296.8 61.74C325.4 45.03 359.2 38.53 392.6 44.1C461.5 55.58 512 115.2 512 185.1V190.9C512 232.4 494.8 272.1 464.4 300.4L283.7 469.1C276.2 476.1 266.3 480 256 480C245.7 480 235.8 476.1 228.3 469.1L47.59 300.4C17.23 272.1 0 232.4 0 190.9V185.1C0 115.2 50.52 55.58 119.4 44.09V44.1z\"]\n};\nvar faHeartBroken = faHeartCrack;\nvar faHeartPulse = {\n  prefix: 'fas',\n  iconName: 'heart-pulse',\n  icon: [576, 512, [\"heartbeat\"], \"f21e\", \"M352.4 243.8l-49.83 99.5c-6.009 12-23.41 11.62-28.92-.625L216.7 216.3l-30.05 71.75L88.55 288l176.4 182.2c12.66 13.07 33.36 13.07 46.03 0l176.4-182.2l-112.1 .0052L352.4 243.8zM495.2 62.86c-54.36-46.98-137.5-38.5-187.5 13.06L288 96.25L268.3 75.92C218.3 24.36 135.2 15.88 80.81 62.86C23.37 112.5 16.84 197.6 60.18 256h105l35.93-86.25c5.508-12.88 23.66-13.12 29.54-.375l58.21 129.4l49.07-98c5.884-11.75 22.78-11.75 28.67 0l27.67 55.25h121.5C559.2 197.6 552.6 112.5 495.2 62.86z\"]\n};\nvar faHeartbeat = faHeartPulse;\nvar faHelicopter = {\n  prefix: 'fas',\n  iconName: 'helicopter',\n  icon: [640, 512, [128641], \"f533\", \"M127.1 32C127.1 14.33 142.3 0 159.1 0H544C561.7 0 576 14.33 576 32C576 49.67 561.7 64 544 64H384V128H416C504.4 128 576 199.6 576 288V352C576 369.7 561.7 384 544 384H303.1C293.9 384 284.4 379.3 278.4 371.2L191.1 256L47.19 198.1C37.65 194.3 30.52 186.1 28.03 176.1L4.97 83.88C2.445 73.78 10.08 64 20.49 64H47.1C58.07 64 67.56 68.74 73.6 76.8L111.1 128H319.1V64H159.1C142.3 64 127.1 49.67 127.1 32V32zM384 320H512V288C512 234.1 469 192 416 192H384V320zM630.6 470.6L626.7 474.5C602.7 498.5 570.2 512 536.2 512H255.1C238.3 512 223.1 497.7 223.1 480C223.1 462.3 238.3 448 255.1 448H536.2C553.2 448 569.5 441.3 581.5 429.3L585.4 425.4C597.9 412.9 618.1 412.9 630.6 425.4C643.1 437.9 643.1 458.1 630.6 470.6L630.6 470.6z\"]\n};\nvar faHelicopterSymbol = {\n  prefix: 'fas',\n  iconName: 'helicopter-symbol',\n  icon: [576, 512, [], \"e502\", \"M320 66.66V1.985C435.8 16.42 527.6 108.2 542 224H477.3C463.9 143.6 400.4 80.15 320 66.66V66.66zM320 510V445.4C400.4 431.9 463.9 368.4 477.3 288H542C527.6 403.8 435.8 495.6 320 510V510zM33.98 288H98.65C112.1 368.4 175.6 431.9 256 445.4V510C140.2 495.6 48.42 403.8 33.98 288zM256 1.984V66.66C175.6 80.15 112.1 143.6 98.66 224H33.98C48.42 108.2 140.2 16.42 256 1.985V1.984zM240 224H336V160C336 142.3 350.3 128 368 128C385.7 128 400 142.3 400 160V352C400 369.7 385.7 384 368 384C350.3 384 336 369.7 336 352V288H240V352C240 369.7 225.7 384 208 384C190.3 384 176 369.7 176 352V160C176 142.3 190.3 128 208 128C225.7 128 240 142.3 240 160V224z\"]\n};\nvar faHelmetSafety = {\n  prefix: 'fas',\n  iconName: 'helmet-safety',\n  icon: [576, 512, [\"hard-hat\", \"hat-hard\"], \"f807\", \"M544 280.9c0-89.17-61.83-165.4-139.6-197.4L352 174.2V49.78C352 39.91 344.1 32 334.2 32H241.8C231.9 32 224 39.91 224 49.78v124.4L171.6 83.53C93.83 115.5 32 191.7 32 280.9L31.99 352h512L544 280.9zM574.7 393.7C572.2 387.8 566.4 384 560 384h-544c-6.375 0-12.16 3.812-14.69 9.656c-2.531 5.875-1.344 12.69 3.062 17.34C7.031 413.8 72.02 480 287.1 480s280.1-66.19 283.6-69C576 406.3 577.2 399.5 574.7 393.7z\"]\n};\nvar faHardHat = faHelmetSafety;\nvar faHatHard = faHelmetSafety;\nvar faHelmetUn = {\n  prefix: 'fas',\n  iconName: 'helmet-un',\n  icon: [512, 512, [], \"e503\", \"M480 224C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H368V462.5L369.5 464H456C469.3 464 480 474.7 480 488C480 501.3 469.3 512 456 512H360C353.9 512 347.1 509.7 343.5 505.4L214.9 384H87.65C39.24 384 0 344.8 0 296.3V240C0 107.5 107.5 0 240 0C367.2 0 471.2 98.91 479.5 224H480zM320 288H274.4L241.1 343.5L320 417.2V288zM285.3 103.1C281.4 97.26 274.1 94.64 267.4 96.69C260.6 98.73 256 104.9 256 112V208C256 216.8 263.2 224 272 224C280.8 224 288 216.8 288 208V164.8L322.7 216.9C326.6 222.7 333.9 225.4 340.6 223.3C347.4 221.3 352 215.1 352 208V112C352 103.2 344.8 96 336 96C327.2 96 320 103.2 320 112V155.2L285.3 103.1zM160 112C160 103.2 152.8 96 144 96C135.2 96 128 103.2 128 112V176C128 202.5 149.5 224 176 224C202.5 224 224 202.5 224 176V112C224 103.2 216.8 96 208 96C199.2 96 192 103.2 192 112V176C192 184.8 184.8 192 176 192C167.2 192 160 184.8 160 176V112z\"]\n};\nvar faHighlighter = {\n  prefix: 'fas',\n  iconName: 'highlighter',\n  icon: [576, 512, [], \"f591\", \"M143.1 320V248.3C143.1 233 151.2 218.7 163.5 209.6L436.6 8.398C444 2.943 452.1 0 462.2 0C473.6 0 484.5 4.539 492.6 12.62L547.4 67.38C555.5 75.46 559.1 86.42 559.1 97.84C559.1 107 557.1 115.1 551.6 123.4L350.4 396.5C341.3 408.8 326.1 416 311.7 416H239.1L214.6 441.4C202.1 453.9 181.9 453.9 169.4 441.4L118.6 390.6C106.1 378.1 106.1 357.9 118.6 345.4L143.1 320zM489.4 99.92L460.1 70.59L245 229L330.1 314.1L489.4 99.92zM23.03 466.3L86.06 403.3L156.7 473.9L125.7 504.1C121.2 509.5 115.1 512 108.7 512H40C26.75 512 16 501.3 16 488V483.3C16 476.1 18.53 470.8 23.03 466.3V466.3z\"]\n};\nvar faHillAvalanche = {\n  prefix: 'fas',\n  iconName: 'hill-avalanche',\n  icon: [640, 512, [], \"e507\", \"M161.4 91.58C160.5 87.87 160 83.99 160 80C160 53.49 181.5 32 208 32C229.9 32 248.3 46.62 254.1 66.62C268.5 45.7 292.7 32 320 32C364.2 32 400 67.82 400 112C400 119.4 398.1 126.6 397.1 133.5C426.9 145.1 448 174.1 448 208C448 236.4 433.2 261.3 410.9 275.5L492.6 357.2C508.2 372.8 533.6 372.8 549.2 357.2C564.8 341.6 564.8 316.2 549.2 300.6C533.6 284.1 508.2 284.1 492.6 300.6L458.7 266.7C493 232.3 548.8 232.3 583.1 266.7C617.5 301 617.5 356.8 583.1 391.1C552.8 421.4 505.9 425 471.7 401.9L161.4 91.58zM512 64C512 81.67 497.7 96 480 96C462.3 96 448 81.67 448 64C448 46.33 462.3 32 480 32C497.7 32 512 46.33 512 64zM480 160C480 142.3 494.3 128 512 128C529.7 128 544 142.3 544 160C544 177.7 529.7 192 512 192C494.3 192 480 177.7 480 160zM456.1 443.7C482.2 468.9 464.3 512 428.7 512H112C67.82 512 32 476.2 32 432V115.3C32 79.68 75.09 61.83 100.3 87.03L456.1 443.7z\"]\n};\nvar faHillRockslide = {\n  prefix: 'fas',\n  iconName: 'hill-rockslide',\n  icon: [576, 512, [], \"e508\", \"M252.4 103.8C249.7 98.97 249.7 93.03 252.4 88.16L279.4 40.16C282.2 35.12 287.6 32 293.4 32H346.6C352.4 32 357.8 35.12 360.6 40.16L387.6 88.16C390.3 93.03 390.3 98.97 387.6 103.8L360.6 151.8C357.8 156.9 352.4 160 346.6 160H293.4C287.6 160 282.2 156.9 279.4 151.8L252.4 103.8zM424.1 443.7C450.2 468.9 432.3 512 396.7 512H80C35.82 512 0 476.2 0 432V115.3C0 79.68 43.09 61.83 68.28 87.03L424.1 443.7zM456.2 376.6C451.1 373.8 448 368.4 448 362.6V309.4C448 303.6 451.1 298.2 456.2 295.4L504.2 268.4C509 265.7 514.1 265.7 519.8 268.4L567.8 295.4C572.9 298.2 576 303.6 576 309.4V362.6C576 368.4 572.9 373.8 567.8 376.6L519.8 403.6C514.1 406.3 509 406.3 504.2 403.6L456.2 376.6zM192 64C192 81.67 177.7 96 160 96C142.3 96 128 81.67 128 64C128 46.33 142.3 32 160 32C177.7 32 192 46.33 192 64zM352 256C352 238.3 366.3 224 384 224C401.7 224 416 238.3 416 256C416 273.7 401.7 288 384 288C366.3 288 352 273.7 352 256z\"]\n};\nvar faHippo = {\n  prefix: 'fas',\n  iconName: 'hippo',\n  icon: [640, 512, [129435], \"f6ed\", \"M584.2 96.36c-28.88-1.701-54.71 17.02-79.74 26.49C490 88.22 455.9 64 416 64c-11.25 0-22 2.252-32 5.877V56C384 42.75 373.2 32 360 32h-16C330.8 32 320 42.75 320 56v49C285.1 79.62 241.2 64 192 64C85.1 64 0 135.6 0 224v232C0 469.3 10.75 480 24 480h48C85.25 480 96 469.3 96 456v-62.87C128.4 407.5 166.8 416 208 416s79.63-8.492 112-22.87V456c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24V288h128v32c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16V288c17.62 0 32-14.38 32-32l-.0001-96.07C639.1 127.8 616.4 98.25 584.2 96.36zM447.1 176c-8.875 0-16-7.125-16-16S439.1 144 448 144s16 7.125 16 16S456.9 176 447.1 176z\"]\n};\nvar faHockeyPuck = {\n  prefix: 'fas',\n  iconName: 'hockey-puck',\n  icon: [512, 512, [], \"f453\", \"M0 160c0-53 114.6-96 256-96s256 43 256 96s-114.6 96-256 96S0 213 0 160zM255.1 303.1C156.4 303.1 56.73 283.4 0 242.2V352c0 53 114.6 96 256 96s256-43 256-96V242.2C455.3 283.4 355.6 303.1 255.1 303.1z\"]\n};\nvar faHollyBerry = {\n  prefix: 'fas',\n  iconName: 'holly-berry',\n  icon: [512, 512, [], \"f7aa\", \"M287.1 143.1c0 26.5 21.5 47.1 47.1 47.1c26.5 0 48-21.5 48-47.1s-21.5-47.1-48-47.1C309.5 95.99 287.1 117.5 287.1 143.1zM176 191.1c26.5 0 47.1-21.5 47.1-47.1S202.5 95.96 176 95.96c-26.5 0-47.1 21.5-47.1 47.1S149.5 191.1 176 191.1zM303.1 47.1C303.1 21.5 282.5 0 255.1 0c-26.5 0-47.1 21.5-47.1 47.1S229.5 95.99 255.1 95.99C282.5 95.99 303.1 74.5 303.1 47.1zM243.7 242.6C245.3 229.7 231.9 220.1 219.5 225.5C179.7 242.8 137.8 251.4 96.72 250.8C86.13 250.6 78.49 260.7 81.78 270.4C86.77 285.7 90.33 301.4 92.44 317.7c2.133 16.15-9.387 31.26-26.12 34.23c-16.87 2.965-33.7 4.348-50.48 4.152c-10.6-.0586-18.37 10.05-15.08 19.74c12.4 35.79 16.57 74.93 12.12 114.7c-1.723 14.96 13.71 25.67 28.02 19.8c38.47-15.95 78.77-23.81 118.2-23.34c10.58 .1953 18.36-9.91 15.07-19.6c-5.141-15.15-8.68-31.06-10.79-47.34c-2.133-16.16 9.371-31.13 26.24-34.09c16.73-2.973 33.57-4.496 50.36-4.301c10.73 .0781 18.51-10.03 15.22-19.72C242.5 324.7 238.5 283.9 243.7 242.6zM496.2 356.1c-16.78 .1953-33.61-1.188-50.48-4.152c-16.73-2.973-28.25-18.08-26.12-34.23c2.115-16.28 5.67-32.05 10.66-47.32c3.289-9.691-4.35-19.81-14.93-19.62c-41.11 .6484-83.01-7.965-122.7-25.23c-6.85-2.969-13.71-1.18-18.47 2.953c1.508 5.836 2.102 11.93 1.332 18.05c-4.539 36.23-1.049 72.56 10.12 105.1c3.395 9.988 3.029 20.73-.4766 30.52c12.44 .5 24.89 1.602 37.28 3.801c16.87 2.957 28.37 17.93 26.24 34.09c-2.115 16.27-5.654 32.19-10.79 47.34c-3.289 9.691 4.486 19.8 15.07 19.6c39.47-.4766 79.77 7.383 118.2 23.34c14.31 5.867 29.74-4.844 28.02-19.8c-4.451-39.81-.2832-78.95 12.12-114.7C514.5 366.1 506.8 356 496.2 356.1z\"]\n};\nvar faHorse = {\n  prefix: 'fas',\n  iconName: 'horse',\n  icon: [576, 512, [128014], \"f6f0\", \"M575.9 76.61c0-8.125-3.05-15.84-8.55-21.84c-3.875-4-8.595-9.125-13.72-14.5c11.12-6.75 19.47-17.51 22.22-30.63c.9999-5-2.849-9.641-7.974-9.641L447.9 0c-70.62 0-127.9 57.25-127.9 128L159.1 128c-28.87 0-54.38 12.1-72 33.12L87.1 160C39.5 160 .0001 199.5 .0001 248L0 304c0 8.875 7.125 15.1 15.1 15.1L31.1 320c8.874 0 15.1-7.125 15.1-16l.0005-56c0-13.25 6.884-24.4 16.76-31.65c-.125 2.5-.758 5.024-.758 7.649c0 27.62 11.87 52.37 30.5 69.87l-25.65 68.61c-4.586 12.28-5.312 25.68-2.128 38.4l21.73 86.89C92.02 502 104.8 512 119.5 512h32.98c20.81 0 36.08-19.55 31.05-39.74L162.2 386.9l23.78-63.61l133.1 22.34L319.1 480c0 17.67 14.33 32 31.1 32h31.1c17.67 0 31.1-14.33 31.1-32l.0166-161.8C435.7 297.1 447.1 270.5 447.1 240c0-.25-.1025-.3828-.1025-.6328V136.9L463.9 144l18.95 37.72c7.481 14.86 25.08 21.55 40.52 15.34l32.54-13.05c12.13-4.878 20.11-16.67 20.09-29.74L575.9 76.61zM511.9 96c-8.75 0-15.1-7.125-15.1-16S503.1 64 511.9 64c8.874 0 15.1 7.125 15.1 16S520.8 96 511.9 96z\"]\n};\nvar faHorseHead = {\n  prefix: 'fas',\n  iconName: 'horse-head',\n  icon: [512, 512, [], \"f7ab\", \"M509.8 332.5l-69.89-164.3c-14.88-41.25-50.38-70.98-93.01-79.24c18-10.63 46.35-35.9 34.23-82.29c-1.375-5.001-7.112-7.972-11.99-6.097l-202.3 75.66C35.89 123.4 0 238.9 0 398.8v81.24C0 497.7 14.25 512 32 512h236.2c23.75 0 39.3-25.03 28.55-46.28l-40.78-81.71V383.3c-45.63-3.5-84.66-30.7-104.3-69.58c-1.625-3.125-.9342-6.951 1.566-9.327l12.11-12.11c3.875-3.875 10.64-2.692 12.89 2.434c14.88 33.63 48.17 57.38 87.42 57.38c17.13 0 33.05-5.091 46.8-13.22l46 63.9c6 8.501 15.75 13.34 26 13.34h50.28c8.501 0 16.61-3.388 22.61-9.389l45.34-39.84C511.6 357.7 514.4 344.2 509.8 332.5zM328.1 223.1c-13.25 0-23.96-10.75-23.96-24c0-13.25 10.75-23.92 24-23.92s23.94 10.73 23.94 23.98C352 213.3 341.3 223.1 328.1 223.1z\"]\n};\nvar faHospital = {\n  prefix: 'fas',\n  iconName: 'hospital',\n  icon: [640, 512, [127973, 62589, \"hospital-alt\", \"hospital-wide\"], \"f0f8\", \"M192 48C192 21.49 213.5 0 240 0H400C426.5 0 448 21.49 448 48V512H368V432C368 405.5 346.5 384 320 384C293.5 384 272 405.5 272 432V512H192V48zM312 64C303.2 64 296 71.16 296 80V104H272C263.2 104 256 111.2 256 120V136C256 144.8 263.2 152 272 152H296V176C296 184.8 303.2 192 312 192H328C336.8 192 344 184.8 344 176V152H368C376.8 152 384 144.8 384 136V120C384 111.2 376.8 104 368 104H344V80C344 71.16 336.8 64 328 64H312zM160 96V512H48C21.49 512 0 490.5 0 464V320H80C88.84 320 96 312.8 96 304C96 295.2 88.84 288 80 288H0V224H80C88.84 224 96 216.8 96 208C96 199.2 88.84 192 80 192H0V144C0 117.5 21.49 96 48 96H160zM592 96C618.5 96 640 117.5 640 144V192H560C551.2 192 544 199.2 544 208C544 216.8 551.2 224 560 224H640V288H560C551.2 288 544 295.2 544 304C544 312.8 551.2 320 560 320H640V464C640 490.5 618.5 512 592 512H480V96H592z\"]\n};\nvar faHospitalAlt = faHospital;\nvar faHospitalWide = faHospital;\nvar faHospitalUser = {\n  prefix: 'fas',\n  iconName: 'hospital-user',\n  icon: [576, 512, [], \"f80d\", \"M272 0C298.5 0 320 21.49 320 48V367.8C281.8 389.2 256 430 256 476.9C256 489.8 259.6 501.8 265.9 512H48C21.49 512 0 490.5 0 464V384H144C152.8 384 160 376.8 160 368C160 359.2 152.8 352 144 352H0V288H144C152.8 288 160 280.8 160 272C160 263.2 152.8 256 144 256H0V48C0 21.49 21.49 0 48 0H272zM152 64C143.2 64 136 71.16 136 80V104H112C103.2 104 96 111.2 96 120V136C96 144.8 103.2 152 112 152H136V176C136 184.8 143.2 192 152 192H168C176.8 192 184 184.8 184 176V152H208C216.8 152 224 144.8 224 136V120C224 111.2 216.8 104 208 104H184V80C184 71.16 176.8 64 168 64H152zM512 272C512 316.2 476.2 352 432 352C387.8 352 352 316.2 352 272C352 227.8 387.8 192 432 192C476.2 192 512 227.8 512 272zM288 477.1C288 425.7 329.7 384 381.1 384H482.9C534.3 384 576 425.7 576 477.1C576 496.4 560.4 512 541.1 512H322.9C303.6 512 288 496.4 288 477.1V477.1z\"]\n};\nvar faHotTubPerson = {\n  prefix: 'fas',\n  iconName: 'hot-tub-person',\n  icon: [512, 512, [\"hot-tub\"], \"f593\", \"M414.3 177.6C415.3 185.9 421.1 192 429.1 192h16.13c9.5 0 17-8.625 16-18.38C457.8 134.5 439.6 99.12 412 76.5c-17.38-14.12-28.88-36.75-32-62.12C379 6.125 372.3 0 364.3 0h-16.12c-9.5 0-17.12 8.625-16 18.38c4.375 39.12 22.38 74.5 50.13 97.13C399.6 129.6 411 152.2 414.3 177.6zM306.3 177.6C307.3 185.9 313.1 192 321.1 192h16.13c9.5 0 17-8.625 16-18.38C349.8 134.5 331.6 99.12 304 76.5c-17.38-14.12-28.88-36.75-32-62.12C271 6.125 264.3 0 256.3 0h-16.17C230.6 0 223 8.625 224.1 18.38C228.5 57.5 246.5 92.88 274.3 115.5C291.6 129.6 303 152.2 306.3 177.6zM480 256h-224L145.1 172.8C133.1 164.5 120.5 160 106.6 160H64C28.62 160 0 188.6 0 224v224c0 35.38 28.62 64 64 64h384c35.38 0 64-28.62 64-64V288C512 270.4 497.6 256 480 256zM128 440C128 444.4 124.4 448 120 448h-16C99.62 448 96 444.4 96 440v-112C96 323.6 99.62 320 104 320h16C124.4 320 128 323.6 128 328V440zM224 440C224 444.4 220.4 448 216 448h-16C195.6 448 192 444.4 192 440v-112C192 323.6 195.6 320 200 320h16C220.4 320 224 323.6 224 328V440zM320 440c0 4.375-3.625 8-8 8h-16C291.6 448 288 444.4 288 440v-112c0-4.375 3.625-8 8-8h16c4.375 0 8 3.625 8 8V440zM416 440c0 4.375-3.625 8-8 8h-16C387.6 448 384 444.4 384 440v-112c0-4.375 3.625-8 8-8h16c4.375 0 8 3.625 8 8V440zM64 128c35.38 0 64-28.62 64-64S99.38 0 64 0S0 28.62 0 64S28.62 128 64 128z\"]\n};\nvar faHotTub = faHotTubPerson;\nvar faHotdog = {\n  prefix: 'fas',\n  iconName: 'hotdog',\n  icon: [512, 512, [127789], \"f80f\", \"M488.6 23.44c-31.06-31.19-81.76-31.16-112.8 .0313L24.46 374.8c-20.83 19.96-29.19 49.66-21.83 77.6c7.36 27.94 29.07 49.65 57.02 57.01c27.94 7.36 57.64-1 77.6-21.83l351.3-351.3C519.7 105.2 519.8 54.5 488.6 23.44zM438.8 118.4c-19.59 19.59-37.39 22.52-51.74 25.01c-12.97 2.246-22.33 3.867-34.68 16.22c-12.35 12.35-13.97 21.71-16.22 34.69c-2.495 14.35-5.491 32.19-25.08 51.78c-19.59 19.59-37.43 22.58-51.78 25.08C246.3 273.4 236.9 275.1 224.6 287.4c-12.35 12.35-13.97 21.71-16.22 34.68C205.9 336.4 202.9 354.3 183.3 373.9c-19.59 19.59-37.43 22.58-51.78 25.08C118.5 401.2 109.2 402.8 96.83 415.2c-6.238 6.238-16.34 6.238-22.58 0c-6.238-6.238-6.238-16.35 0-22.58c19.59-19.59 37.43-22.58 51.78-25.07c12.97-2.245 22.33-3.869 34.68-16.22c12.35-12.35 13.97-21.71 16.22-34.69c2.495-14.35 5.492-32.19 25.08-51.78s37.43-22.58 51.78-25.08c12.97-2.246 22.33-3.869 34.68-16.22s13.97-21.71 16.22-34.68c2.495-14.35 5.492-32.19 25.08-51.78c19.59-19.59 37.43-22.58 51.78-25.07c12.97-2.246 22.28-3.815 34.63-16.17c6.238-6.238 16.36-6.238 22.59 0C444.1 102.1 444.1 112.2 438.8 118.4zM32.44 321.5l290-290l-11.48-11.6c-24.95-24.95-63.75-26.57-86.58-3.743L17.1 223.4C-5.73 246.3-4.108 285.1 20.84 310L32.44 321.5zM480.6 189.5l-290 290l11.48 11.6c24.95 24.95 63.75 26.57 86.58 3.743l207.3-207.3c22.83-22.83 21.21-61.63-3.743-86.58L480.6 189.5z\"]\n};\nvar faHotel = {\n  prefix: 'fas',\n  iconName: 'hotel',\n  icon: [512, 512, [127976], \"f594\", \"M480 0C497.7 0 512 14.33 512 32C512 49.67 497.7 64 480 64V448C497.7 448 512 462.3 512 480C512 497.7 497.7 512 480 512H304V448H208V512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V64C14.33 64 0 49.67 0 32C0 14.33 14.33 0 32 0H480zM112 96C103.2 96 96 103.2 96 112V144C96 152.8 103.2 160 112 160H144C152.8 160 160 152.8 160 144V112C160 103.2 152.8 96 144 96H112zM224 144C224 152.8 231.2 160 240 160H272C280.8 160 288 152.8 288 144V112C288 103.2 280.8 96 272 96H240C231.2 96 224 103.2 224 112V144zM368 96C359.2 96 352 103.2 352 112V144C352 152.8 359.2 160 368 160H400C408.8 160 416 152.8 416 144V112C416 103.2 408.8 96 400 96H368zM96 240C96 248.8 103.2 256 112 256H144C152.8 256 160 248.8 160 240V208C160 199.2 152.8 192 144 192H112C103.2 192 96 199.2 96 208V240zM240 192C231.2 192 224 199.2 224 208V240C224 248.8 231.2 256 240 256H272C280.8 256 288 248.8 288 240V208C288 199.2 280.8 192 272 192H240zM352 240C352 248.8 359.2 256 368 256H400C408.8 256 416 248.8 416 240V208C416 199.2 408.8 192 400 192H368C359.2 192 352 199.2 352 208V240zM256 288C211.2 288 173.5 318.7 162.1 360.2C159.7 373.1 170.7 384 184 384H328C341.3 384 352.3 373.1 349 360.2C338.5 318.7 300.8 288 256 288z\"]\n};\nvar faHourglass = {\n  prefix: 'fas',\n  iconName: 'hourglass',\n  icon: [384, 512, [62032, 9203, \"hourglass-2\", \"hourglass-half\"], \"f254\", \"M352 0C369.7 0 384 14.33 384 32C384 49.67 369.7 64 352 64V74.98C352 117.4 335.1 158.1 305.1 188.1L237.3 256L305.1 323.9C335.1 353.9 352 394.6 352 437V448C369.7 448 384 462.3 384 480C384 497.7 369.7 512 352 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V437C32 394.6 48.86 353.9 78.86 323.9L146.7 256L78.86 188.1C48.86 158.1 32 117.4 32 74.98V64C14.33 64 0 49.67 0 32C0 14.33 14.33 0 32 0H352zM111.1 128H272C282.4 112.4 288 93.98 288 74.98V64H96V74.98C96 93.98 101.6 112.4 111.1 128zM111.1 384H272C268.5 378.7 264.5 373.7 259.9 369.1L192 301.3L124.1 369.1C119.5 373.7 115.5 378.7 111.1 384V384z\"]\n};\nvar faHourglass2 = faHourglass;\nvar faHourglassHalf = faHourglass;\nvar faHourglassEmpty = {\n  prefix: 'fas',\n  iconName: 'hourglass-empty',\n  icon: [384, 512, [], \"f252\", \"M0 32C0 14.33 14.33 0 32 0H352C369.7 0 384 14.33 384 32C384 49.67 369.7 64 352 64V74.98C352 117.4 335.1 158.1 305.1 188.1L237.3 256L305.1 323.9C335.1 353.9 352 394.6 352 437V448C369.7 448 384 462.3 384 480C384 497.7 369.7 512 352 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V437C32 394.6 48.86 353.9 78.86 323.9L146.7 256L78.86 188.1C48.86 158.1 32 117.4 32 74.98V64C14.33 64 0 49.67 0 32zM96 64V74.98C96 100.4 106.1 124.9 124.1 142.9L192 210.7L259.9 142.9C277.9 124.9 288 100.4 288 74.98V64H96zM96 448H288V437C288 411.6 277.9 387.1 259.9 369.1L192 301.3L124.1 369.1C106.1 387.1 96 411.6 96 437V448z\"]\n};\nvar faHourglassEnd = {\n  prefix: 'fas',\n  iconName: 'hourglass-end',\n  icon: [384, 512, [8987, \"hourglass-3\"], \"f253\", \"M352 0C369.7 0 384 14.33 384 32C384 49.67 369.7 64 352 64V74.98C352 117.4 335.1 158.1 305.1 188.1L237.3 256L305.1 323.9C335.1 353.9 352 394.6 352 437V448C369.7 448 384 462.3 384 480C384 497.7 369.7 512 352 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V437C32 394.6 48.86 353.9 78.86 323.9L146.7 256L78.86 188.1C48.86 158.1 32 117.4 32 74.98V64C14.33 64 0 49.67 0 32C0 14.33 14.33 0 32 0H352zM124.1 142.9L192 210.7L259.9 142.9C277.9 124.9 288 100.4 288 74.98V64H96V74.98C96 100.4 106.1 124.9 124.1 142.9z\"]\n};\nvar faHourglass3 = faHourglassEnd;\nvar faHourglassStart = {\n  prefix: 'fas',\n  iconName: 'hourglass-start',\n  icon: [384, 512, [\"hourglass-1\"], \"f251\", \"M352 0C369.7 0 384 14.33 384 32C384 49.67 369.7 64 352 64V74.98C352 117.4 335.1 158.1 305.1 188.1L237.3 256L305.1 323.9C335.1 353.9 352 394.6 352 437V448C369.7 448 384 462.3 384 480C384 497.7 369.7 512 352 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448V437C32 394.6 48.86 353.9 78.86 323.9L146.7 256L78.86 188.1C48.86 158.1 32 117.4 32 74.98V64C14.33 64 0 49.67 0 32C0 14.33 14.33 0 32 0H352zM259.9 369.1L192 301.3L124.1 369.1C106.1 387.1 96 411.6 96 437V448H288V437C288 411.6 277.9 387.1 259.9 369.1V369.1z\"]\n};\nvar faHourglass1 = faHourglassStart;\nvar faHouse = {\n  prefix: 'fas',\n  iconName: 'house',\n  icon: [576, 512, [63498, 63500, 127968, \"home\", \"home-alt\", \"home-lg-alt\"], \"f015\", \"M575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8L512.5 447.7C512.5 450.5 512.3 453.1 512 455.8V472C512 494.1 494.1 512 472 512H456C454.9 512 453.8 511.1 452.7 511.9C451.3 511.1 449.9 512 448.5 512H392C369.9 512 352 494.1 352 472V384C352 366.3 337.7 352 320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5L575.8 255.5z\"]\n};\nvar faHome = faHouse;\nvar faHomeAlt = faHouse;\nvar faHomeLgAlt = faHouse;\nvar faHouseChimney = {\n  prefix: 'fas',\n  iconName: 'house-chimney',\n  icon: [576, 512, [63499, \"home-lg\"], \"e3af\", \"M511.8 287.6L512.5 447.7C512.5 450.5 512.3 453.1 512 455.8V472C512 494.1 494.1 512 472 512H456C454.9 512 453.8 511.1 452.7 511.9C451.3 511.1 449.9 512 448.5 512H392C369.9 512 352 494.1 352 472V384C352 366.3 337.7 352 320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L416 100.7V64C416 46.33 430.3 32 448 32H480C497.7 32 512 46.33 512 64V185L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6L511.8 287.6z\"]\n};\nvar faHomeLg = faHouseChimney;\nvar faHouseChimneyCrack = {\n  prefix: 'fas',\n  iconName: 'house-chimney-crack',\n  icon: [576, 512, [\"house-damage\"], \"f6f1\", \"M575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8L512.5 447.7C512.6 483.2 483.9 512 448.5 512H326.4L288 448L368.8 380.7C376.6 374.1 376.5 362.1 368.5 355.8L250.6 263.2C235.1 251.7 216.8 270.1 227.8 285.2L288 368L202.5 439.2C196.5 444.3 194.1 452.1 199.1 459.8L230.4 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L416 100.7V64C416 46.33 430.3 32 448 32H480C497.7 32 512 46.33 512 64V185L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5L575.8 255.5z\"]\n};\nvar faHouseDamage = faHouseChimneyCrack;\nvar faHouseChimneyMedical = {\n  prefix: 'fas',\n  iconName: 'house-chimney-medical',\n  icon: [576, 512, [\"clinic-medical\"], \"f7f2\", \"M511.8 287.6L512.5 447.7C512.6 483.2 483.9 512 448.5 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L416 100.7V64C416 46.33 430.3 32 448 32H480C497.7 32 512 46.33 512 64V185L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6L511.8 287.6zM400 248C400 239.2 392.8 232 384 232H328V176C328 167.2 320.8 160 312 160H264C255.2 160 248 167.2 248 176V232H192C183.2 232 176 239.2 176 248V296C176 304.8 183.2 312 192 312H248V368C248 376.8 255.2 384 264 384H312C320.8 384 328 376.8 328 368V312H384C392.8 312 400 304.8 400 296V248z\"]\n};\nvar faClinicMedical = faHouseChimneyMedical;\nvar faHouseChimneyUser = {\n  prefix: 'fas',\n  iconName: 'house-chimney-user',\n  icon: [576, 512, [], \"e065\", \"M511.8 287.6L512.5 447.7C512.6 483.2 483.9 512 448.5 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L416 100.7V64C416 46.33 430.3 32 448 32H480C497.7 32 512 46.33 512 64V185L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6L511.8 287.6zM288 288C323.3 288 352 259.3 352 224C352 188.7 323.3 160 288 160C252.7 160 224 188.7 224 224C224 259.3 252.7 288 288 288zM192 416H384C392.8 416 400 408.8 400 400C400 355.8 364.2 320 320 320H256C211.8 320 176 355.8 176 400C176 408.8 183.2 416 192 416z\"]\n};\nvar faHouseChimneyWindow = {\n  prefix: 'fas',\n  iconName: 'house-chimney-window',\n  icon: [576, 512, [], \"e00d\", \"M575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8L512.5 447.7C512.6 483.2 483.9 512 448.5 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L416 100.7V64C416 46.33 430.3 32 448 32H480C497.7 32 512 46.33 512 64V185L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5L575.8 255.5zM248 192C234.7 192 224 202.7 224 216V296C224 309.3 234.7 320 248 320H328C341.3 320 352 309.3 352 296V216C352 202.7 341.3 192 328 192H248z\"]\n};\nvar faHouseCircleCheck = {\n  prefix: 'fas',\n  iconName: 'house-circle-check',\n  icon: [640, 512, [], \"e509\", \"M320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L522.1 193.9C513.6 192.7 504.9 192 496 192C404.2 192 328.8 262.3 320.7 352L320 352zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faHouseCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'house-circle-exclamation',\n  icon: [640, 512, [], \"e50a\", \"M320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L522.1 193.9C513.6 192.7 504.9 192 496 192C404.2 192 328.8 262.3 320.7 352L320 352zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faHouseCircleXmark = {\n  prefix: 'fas',\n  iconName: 'house-circle-xmark',\n  icon: [640, 512, [], \"e50b\", \"M320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L522.1 193.9C513.6 192.7 504.9 192 496 192C404.2 192 328.8 262.3 320.7 352L320 352zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368L555.3 331.3z\"]\n};\nvar faHouseCrack = {\n  prefix: 'fas',\n  iconName: 'house-crack',\n  icon: [576, 512, [], \"e3b1\", \"M511.8 287.6L512.5 447.7C512.6 483.2 483.9 512 448.5 512H326.4L288 448L368.8 380.7C376.6 374.1 376.5 362.1 368.5 355.8L250.6 263.2C235.1 251.7 216.8 270.1 227.8 285.2L288 368L202.5 439.2C196.5 444.3 194.1 452.1 199.1 459.8L230.4 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8z\"]\n};\nvar faHouseFire = {\n  prefix: 'fas',\n  iconName: 'house-fire',\n  icon: [640, 512, [], \"e50c\", \"M288 350.1L288 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L447.3 128.1C434.9 127.2 422.3 131.1 412.5 139.9C377.1 171.5 346.9 207.6 325.2 242.7C304.3 276.5 288 314.9 288 350.1H288zM509 221.5C516.9 211.6 525.8 200.8 535.5 191.1C541.1 186.9 549.9 186.9 555.5 192C580.2 214.7 601.1 244.7 615.8 273.2C630.4 301.2 640 329.9 640 350.1C640 437.9 568.7 512 480 512C390.3 512 320 437.8 320 350.1C320 323.7 332.7 291.5 352.4 259.5C372.4 227.2 400.5 193.4 433.8 163.7C439.4 158.7 447.1 158.8 453.5 163.8C473.3 181.6 491.8 200.7 509 221.5V221.5zM550 336.1C548 332.1 546 328.1 543 324.1L507 367C507 367 449 293 445 288C415 324.1 400 346 400 370C400 419 436 448 481 448C499 448 515 443 530 432.1C560 412 568 370 550 336.1z\"]\n};\nvar faHouseFlag = {\n  prefix: 'fas',\n  iconName: 'house-flag',\n  icon: [640, 512, [], \"e50d\", \"M480 0C497.7 0 512 14.33 512 32H624C632.8 32 640 39.16 640 48V176C640 184.8 632.8 192 624 192H512V512H448V32C448 14.33 462.3 0 480 0V0zM416 512H416.1L416.8 512H352C334.3 512 320 497.7 320 480V384C320 366.3 305.7 352 288 352H224C206.3 352 192 366.3 192 384V480C192 497.7 177.7 512 160 512H96C78.33 512 64 497.7 64 480V288H31.1C18.61 288 6.631 279.7 1.985 267.1C-2.661 254.5 1.005 240.4 11.17 231.7L235.2 39.7C247.2 29.43 264.8 29.43 276.8 39.7L416 159V512z\"]\n};\nvar faHouseFloodWater = {\n  prefix: 'fas',\n  iconName: 'house-flood-water',\n  icon: [576, 512, [], \"e50e\", \"M482.8 134.1C494 142.3 498.7 156.7 494.4 169.9C490.1 183.1 477.9 192 464 192H447.4L447.7 265.2C446.1 266.1 444.6 267.1 443.2 268.1C425.2 280.5 403 288.5 384 288.5C364.4 288.5 343.2 280.8 324.8 268.1C302.8 252.6 273.3 252.6 251.2 268.1C234 279.9 213.2 288.5 192 288.5C172.1 288.5 150.8 280.5 132.9 268.1C131.3 267 129.7 265.1 128 265V192H112C98.14 192 85.86 183.1 81.57 169.9C77.28 156.7 81.97 142.3 93.18 134.1L269.2 6.12C280.4-2.04 295.6-2.04 306.8 6.12L482.8 134.1zM269.5 309.9C280.6 302 295.4 302 306.5 309.9C328.1 325.4 356.5 336 384 336C410.9 336 439.4 325.2 461.4 309.9L461.5 309.9C473.4 301.4 489.5 302.1 500.7 311.6C515 323.5 533.2 332.6 551.3 336.8C568.5 340.8 579.2 358.1 575.2 375.3C571.2 392.5 553.1 403.2 536.7 399.2C512.2 393.4 491.9 382.6 478.5 374.2C449.5 389.7 417 400 384 400C352.1 400 323.4 390.1 303.6 381.1C297.7 378.5 292.5 375.8 288 373.4C283.5 375.8 278.3 378.5 272.4 381.1C252.6 390.1 223.9 400 192 400C158.1 400 126.5 389.7 97.5 374.2C84.12 382.6 63.79 393.4 39.27 399.2C22.06 403.2 4.854 392.5 .8426 375.3C-3.169 358.1 7.532 340.8 24.74 336.8C42.84 332.6 60.96 323.5 75.31 311.6C86.46 302.1 102.6 301.4 114.5 309.9L114.6 309.9C136.7 325.2 165.1 336 192 336C219.5 336 247 325.4 269.5 309.9H269.5zM461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.12 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.853 504.5 .8422 487.3C-3.169 470.1 7.532 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448C410.9 448 439.4 437.2 461.4 421.9H461.4z\"]\n};\nvar faHouseFloodWaterCircleArrowRight = {\n  prefix: 'fas',\n  iconName: 'house-flood-water-circle-arrow-right',\n  icon: [640, 512, [], \"e50f\", \"M288 144C288 223.5 223.5 288 144 288C64.47 288 0 223.5 0 144C0 64.47 64.47 .0002 144 .0002C223.5 .0002 288 64.47 288 144zM140.7 99.31L169.4 128H80C71.16 128 64 135.2 64 144C64 152.8 71.16 160 80 160H169.4L140.7 188.7C134.4 194.9 134.4 205.1 140.7 211.3C146.9 217.6 157.1 217.6 163.3 211.3L219.3 155.3C225.6 149.1 225.6 138.9 219.3 132.7L163.3 76.69C157.1 70.44 146.9 70.44 140.7 76.69C134.4 82.94 134.4 93.07 140.7 99.31V99.31zM301 64.42L381.2 6.12C392.4-2.04 407.6-2.04 418.8 6.12L594.8 134.1C606 142.3 610.7 156.7 606.4 169.9C602.1 183.1 589.9 192 576 192H559.4L559.7 276.4C557.5 274.8 555.3 273.2 553.2 271.5C531 252.8 498.9 251.4 475.2 268.1C457.2 280.5 435 288.5 416 288.5C396.4 288.5 375.2 280.8 356.8 268.1C334.8 252.6 305.3 252.6 283.2 268.1C273.2 274.1 262 280.7 250.2 284.3C292.6 252.2 319.1 201.3 319.1 144C319.1 115.4 313.2 88.32 301 64.42V64.42zM416 336C442.9 336 471.4 325.2 493.4 309.9L493.5 309.9C505.4 301.4 521.5 302.1 532.7 311.6C547 323.5 565.2 332.6 583.3 336.8C600.5 340.8 611.2 358.1 607.2 375.3C603.2 392.5 585.1 403.2 568.7 399.2C544.2 393.4 523.9 382.6 510.5 374.2C481.5 389.7 449 400 416 400C384.1 400 355.4 390.1 335.6 381.1C329.7 378.5 324.5 375.8 320 373.4C315.5 375.8 310.3 378.5 304.4 381.1C284.6 390.1 255.9 400 224 400C190.1 400 158.5 389.7 129.5 374.2C116.1 382.6 95.79 393.4 71.27 399.2C54.06 403.2 36.85 392.5 32.84 375.3C28.83 358.1 39.53 340.8 56.74 336.8C74.84 332.6 92.96 323.5 107.3 311.6C118.5 302.1 134.6 301.4 146.5 309.9L146.6 309.9C168.7 325.2 197.1 336 224 336C251.5 336 279 325.4 301.5 309.9C312.6 302 327.4 302 338.5 309.9C360.1 325.4 388.5 336 416 336H416zM338.5 421.9C360.1 437.4 388.5 448 416 448C442.9 448 471.4 437.2 493.4 421.9L493.5 421.9C505.4 413.4 521.5 414.1 532.7 423.6C547 435.5 565.2 444.6 583.3 448.8C600.5 452.8 611.2 470.1 607.2 487.3C603.2 504.5 585.1 515.2 568.7 511.2C544.2 505.4 523.9 494.6 510.5 486.2C481.5 501.7 449 512 416 512C384.1 512 355.4 502.1 335.6 493.1C329.7 490.5 324.5 487.8 320 485.4C315.5 487.8 310.3 490.5 304.4 493.1C284.6 502.1 255.9 512 224 512C190.1 512 158.5 501.7 129.5 486.2C116.1 494.6 95.79 505.4 71.27 511.2C54.06 515.2 36.85 504.5 32.84 487.3C28.83 470.1 39.53 452.8 56.74 448.8C74.84 444.6 92.96 435.5 107.3 423.6C118.5 414.1 134.6 413.4 146.5 421.9L146.6 421.9C168.7 437.2 197.1 448 224 448C251.5 448 279 437.4 301.5 421.9C312.6 414 327.4 414 338.5 421.9H338.5z\"]\n};\nvar faHouseLaptop = {\n  prefix: 'fas',\n  iconName: 'house-laptop',\n  icon: [640, 512, [\"laptop-house\"], \"e066\", \"M218.3 8.486C230.6-2.829 249.4-2.829 261.7 8.486L469.7 200.5C476.4 206.7 480 215.2 480 224H336C316.9 224 299.7 232.4 288 245.7V208C288 199.2 280.8 192 272 192H208C199.2 192 192 199.2 192 208V272C192 280.8 199.2 288 208 288H271.1V416H112C85.49 416 64 394.5 64 368V256H32C18.83 256 6.996 247.9 2.198 235.7C-2.6 223.4 .6145 209.4 10.3 200.5L218.3 8.486zM336 256H560C577.7 256 592 270.3 592 288V448H624C632.8 448 640 455.2 640 464C640 490.5 618.5 512 592 512H303.1C277.5 512 255.1 490.5 255.1 464C255.1 455.2 263.2 448 271.1 448H303.1V288C303.1 270.3 318.3 256 336 256zM352 304V448H544V304H352z\"]\n};\nvar faLaptopHouse = faHouseLaptop;\nvar faHouseLock = {\n  prefix: 'fas',\n  iconName: 'house-lock',\n  icon: [640, 512, [], \"e510\", \"M384 480C384 491.7 387.1 502.6 392.6 512H392C369.9 512 352 494.1 352 472V384C352 366.3 337.7 352 320 352H256C238.3 352 224 366.3 224 384V472C224 494.1 206.1 512 184 512H128.1C126.6 512 125.1 511.9 123.6 511.8C122.4 511.9 121.2 512 120 512H104C81.91 512 64 494.1 64 472V360C64 359.1 64.03 358.1 64.09 357.2V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L490.7 166.3C447.2 181.7 416 223.2 416 272V296.6C396.9 307.6 384 328.3 384 352L384 480zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faHouseMedical = {\n  prefix: 'fas',\n  iconName: 'house-medical',\n  icon: [576, 512, [], \"e3b2\", \"M575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8L512.5 447.7C512.6 483.2 483.9 512 448.5 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5H575.8zM328 232V176C328 167.2 320.8 160 312 160H264C255.2 160 248 167.2 248 176V232H192C183.2 232 176 239.2 176 248V296C176 304.8 183.2 312 192 312H248V368C248 376.8 255.2 384 264 384H312C320.8 384 328 376.8 328 368V312H384C392.8 312 400 304.8 400 296V248C400 239.2 392.8 232 384 232H328z\"]\n};\nvar faHouseMedicalCircleCheck = {\n  prefix: 'fas',\n  iconName: 'house-medical-circle-check',\n  icon: [640, 512, [], \"e511\", \"M320.5 381.5C324.6 435.5 353 482.6 394.8 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L522.1 193.9C513.6 192.7 504.9 192 496 192C453.6 192 414.7 207 384.3 232L384 232H328V176C328 167.2 320.8 160 311.1 160H263.1C255.2 160 247.1 167.2 247.1 176V232H191.1C183.2 232 175.1 239.2 175.1 248V296C175.1 304.8 183.2 312 191.1 312H247.1V368C247.1 376.8 255.2 384 263.1 384H311.1C315.1 384 318 383.1 320.5 381.5H320.5zM328 312H329.1C328.7 313.1 328.4 314.3 328 315.4V312zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faHouseMedicalCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'house-medical-circle-exclamation',\n  icon: [640, 512, [], \"e512\", \"M320.5 381.5C324.6 435.5 353 482.6 394.8 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L522.1 193.9C513.6 192.7 504.9 192 496 192C453.6 192 414.7 207 384.3 232L384 232H328V176C328 167.2 320.8 160 311.1 160H263.1C255.2 160 247.1 167.2 247.1 176V232H191.1C183.2 232 175.1 239.2 175.1 248V296C175.1 304.8 183.2 312 191.1 312H247.1V368C247.1 376.8 255.2 384 263.1 384H311.1C315.1 384 318 383.1 320.5 381.5H320.5zM328 312H329.1C328.7 313.1 328.4 314.3 328 315.4V312zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faHouseMedicalCircleXmark = {\n  prefix: 'fas',\n  iconName: 'house-medical-circle-xmark',\n  icon: [640, 512, [], \"e513\", \"M320.5 381.5C324.6 435.5 353 482.6 394.8 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L522.1 193.9C513.6 192.7 504.9 192 496 192C453.6 192 414.7 207 384.3 232L384 232H328V176C328 167.2 320.8 160 311.1 160H263.1C255.2 160 247.1 167.2 247.1 176V232H191.1C183.2 232 175.1 239.2 175.1 248V296C175.1 304.8 183.2 312 191.1 312H247.1V368C247.1 376.8 255.2 384 263.1 384H311.1C315.1 384 318 383.1 320.5 381.5H320.5zM328 312H329.1C328.7 313.1 328.4 314.3 328 315.4V312zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368L555.3 331.3z\"]\n};\nvar faHouseMedicalFlag = {\n  prefix: 'fas',\n  iconName: 'house-medical-flag',\n  icon: [640, 512, [], \"e514\", \"M480 0C497.7 0 512 14.33 512 32H624C632.8 32 640 39.16 640 48V176C640 184.8 632.8 192 624 192H512V512H448V32C448 14.33 462.3 0 480 0V0zM416 512H416.1L416.8 512H96C78.33 512 64 497.7 64 480V288H31.1C18.61 288 6.631 279.7 1.985 267.1C-2.661 254.5 1.005 240.4 11.17 231.7L235.2 39.7C247.2 29.43 264.8 29.43 276.8 39.7L416 159V512zM223.1 256H175.1C167.2 256 159.1 263.2 159.1 272V304C159.1 312.8 167.2 320 175.1 320H223.1V368C223.1 376.8 231.2 384 239.1 384H271.1C280.8 384 287.1 376.8 287.1 368V320H336C344.8 320 352 312.8 352 304V272C352 263.2 344.8 256 336 256H287.1V208C287.1 199.2 280.8 192 271.1 192H239.1C231.2 192 223.1 199.2 223.1 208V256z\"]\n};\nvar faHouseSignal = {\n  prefix: 'fas',\n  iconName: 'house-signal',\n  icon: [576, 512, [], \"e012\", \"M314.3 8.486C326.6-2.829 345.4-2.829 357.7 8.486L565.7 200.5C575.4 209.4 578.6 223.4 573.8 235.7C569 247.9 557.2 256 544 256H512V368C512 394.5 490.5 416 464 416H296.4C272.7 317.5 195.4 239.1 97.06 215.8C98.58 210.1 101.7 204.7 106.3 200.5L314.3 8.486zM304 192C295.2 192 287.1 199.2 287.1 208V272C287.1 280.8 295.2 288 304 288H368C376.8 288 384 280.8 384 272V208C384 199.2 376.8 192 368 192H304zM256 488C256 501.3 245.3 512 232 512C218.7 512 208 501.3 208 488C208 386.4 125.6 304 24 304C10.75 304 0 293.3 0 280C0 266.7 10.75 256 24 256C152.1 256 256 359.9 256 488zM0 480C0 462.3 14.33 448 32 448C49.67 448 64 462.3 64 480C64 497.7 49.67 512 32 512C14.33 512 0 497.7 0 480zM0 376C0 362.7 10.75 352 24 352C99.11 352 160 412.9 160 488C160 501.3 149.3 512 136 512C122.7 512 112 501.3 112 488C112 439.4 72.6 400 24 400C10.75 400 0 389.3 0 376z\"]\n};\nvar faHouseTsunami = {\n  prefix: 'fas',\n  iconName: 'house-tsunami',\n  icon: [576, 512, [], \"e515\", \"M184.4 96C207.4 96 229.3 101.1 248.1 110.3C264.1 117.7 271.9 136.8 264.4 152.8C256.1 168.8 237.9 175.7 221.9 168.3C210.6 162.1 197.9 160 184.4 160C135.5 160 95.1 199.5 95.1 248C95.1 287 121.6 320.2 157.1 331.7C167.1 334.5 179.6 336 191.1 336C192 336 192.1 336 192.1 336C219.6 335.1 247.1 325.4 269.5 309.9C280.6 302 295.4 302 306.5 309.9C328.1 325.4 356.5 336 384 336C410.9 336 439.4 325.2 461.4 309.9L461.5 309.9C473.4 301.4 489.5 302.1 500.7 311.6C515 323.5 533.2 332.6 551.3 336.8C568.5 340.8 579.2 358.1 575.2 375.3C571.2 392.5 553.1 403.2 536.7 399.2C512.2 393.4 491.9 382.6 478.5 374.2C449.5 389.7 417 400 384 400C352.1 400 323.4 390.1 303.6 381.1C297.7 378.5 292.5 375.8 288 373.4C283.5 375.8 278.3 378.5 272.4 381.1C252.6 390.1 223.9 400 192 400C190.2 400 188.3 399.1 186.5 399.9C185.8 399.1 185.1 400 184.4 400C169.8 400 155.6 397.9 142.2 394.1C53.52 372.1 .0006 291.6 .0006 200C.0006 87.99 95.18 0 209 0C232.8 0 255.8 3.823 277.2 10.9C294 16.44 303.1 34.54 297.6 51.32C292 68.1 273.9 77.21 257.2 71.67C242.2 66.72 225.1 64 209 64C152.6 64 104.9 93.82 80.81 136.5C108 111.4 144.4 96 184.4 96H184.4zM428.8 46.43C440.2 37.88 455.8 37.9 467.2 46.47L562.7 118.4C570.7 124.5 575.4 133.9 575.5 143.9L575.8 287.9C575.8 290.8 575.4 293.6 574.7 296.3C569.8 293.6 564.3 291.5 558.5 290.1C545.4 287.1 531.8 280.3 521.2 271.5C499 252.8 466.9 251.4 443.2 268.1C425.2 280.5 403 288.5 384 288.5C364.4 288.5 343.2 280.8 324.8 268.1C323.3 267 321.6 265.1 320 265V143.1C320 133.9 324.7 124.4 332.8 118.4L428.8 46.43zM461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.12 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.853 504.5 .8422 487.3C-3.169 470.1 7.532 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448C410.9 448 439.4 437.2 461.4 421.9H461.4z\"]\n};\nvar faHouseUser = {\n  prefix: 'fas',\n  iconName: 'house-user',\n  icon: [576, 512, [\"home-user\"], \"e1b0\", \"M575.8 255.5C575.8 273.5 560.8 287.6 543.8 287.6H511.8L512.5 447.7C512.6 483.2 483.9 512 448.5 512H128.1C92.75 512 64.09 483.3 64.09 448V287.6H32.05C14.02 287.6 0 273.5 0 255.5C0 246.5 3.004 238.5 10.01 231.5L266.4 8.016C273.4 1.002 281.4 0 288.4 0C295.4 0 303.4 2.004 309.5 7.014L564.8 231.5C572.8 238.5 576.9 246.5 575.8 255.5H575.8zM288 160C252.7 160 224 188.7 224 224C224 259.3 252.7 288 288 288C323.3 288 352 259.3 352 224C352 188.7 323.3 160 288 160zM256 320C211.8 320 176 355.8 176 400C176 408.8 183.2 416 192 416H384C392.8 416 400 408.8 400 400C400 355.8 364.2 320 320 320H256z\"]\n};\nvar faHomeUser = faHouseUser;\nvar faHryvniaSign = {\n  prefix: 'fas',\n  iconName: 'hryvnia-sign',\n  icon: [384, 512, [8372, \"hryvnia\"], \"f6f2\", \"M115.1 120.1C102.2 132 82.05 129.8 71.01 115.1C59.97 102.2 62.21 82.05 76.01 71.01L81.94 66.27C109.7 44.08 144.1 32 179.6 32H223C285.4 32 336 82.59 336 144.1C336 155.6 334.5 166.1 331.7 176H352C369.7 176 384 190.3 384 208C384 225.7 369.7 240 352 240H284.2C282.5 241.1 280.8 242.1 279.1 243.1L228.5 272H352C369.7 272 384 286.3 384 304C384 321.7 369.7 336 352 336H123.1C116 344.6 112 355.5 112 367C112 394.1 133.9 416 160.1 416H204.4C225.3 416 245.7 408.9 262.1 395.8L268 391C281.8 379.1 301.9 382.2 312.1 396C324 409.8 321.8 429.9 307.1 440.1L302.1 445.7C274.3 467.9 239.9 480 204.4 480H160.1C98.59 480 48 429.4 48 367C48 356.4 49.49 345.9 52.33 336H32C14.33 336 0 321.7 0 304C0 286.3 14.33 272 32 272H99.82C101.5 270.9 103.2 269.9 104.9 268.9L155.5 240H32C14.33 240 0 225.7 0 208C0 190.3 14.33 176 32 176H260.9C267.1 167.4 272 156.5 272 144.1C272 117.9 250.1 96 223 96H179.6C158.7 96 138.3 103.1 121.9 116.2L115.1 120.1z\"]\n};\nvar faHryvnia = faHryvniaSign;\nvar faHurricane = {\n  prefix: 'fas',\n  iconName: 'hurricane',\n  icon: [448, 512, [], \"f751\", \"M224 223.1c-17.75 0-32 14.25-32 32c0 17.75 14.25 32 32 32s32-14.25 32-32C256 238.2 241.8 223.1 224 223.1zM208 95.98l24.5-74.74c3.75-11.25-5.615-22.49-17.36-21.11C112 12.38 32 101.6 32 208c0 114.9 93.13 208 208 208l-24.5 74.73c-3.75 11.25 5.615 22.5 17.36 21.12C335.1 499.6 416 410.4 416 304C416 189.1 322.9 95.98 208 95.98zM224 351.1c-53 0-96-43-96-96s43-96 96-96s96 43 96 96S277 351.1 224 351.1z\"]\n};\nvar faI = {\n  prefix: 'fas',\n  iconName: 'i',\n  icon: [320, 512, [105], \"49\", \"M320 448c0 17.67-14.31 32-32 32H32c-17.69 0-32-14.33-32-32s14.31-32 32-32h96v-320H32c-17.69 0-32-14.33-32-32s14.31-32 32-32h256c17.69 0 32 14.33 32 32s-14.31 32-32 32h-96v320h96C305.7 416 320 430.3 320 448z\"]\n};\nvar faICursor = {\n  prefix: 'fas',\n  iconName: 'i-cursor',\n  icon: [256, 512, [], \"f246\", \"M256 480c0 17.69-14.33 31.1-32 31.1c-38.41 0-72.52-17.35-96-44.23c-23.48 26.88-57.59 44.23-96 44.23c-17.67 0-32-14.31-32-31.1s14.33-32 32-32c35.3 0 64-28.72 64-64V288H64C46.33 288 32 273.7 32 256s14.33-32 32-32h32V128c0-35.28-28.7-64-64-64C14.33 64 0 49.69 0 32s14.33-32 32-32c38.41 0 72.52 17.35 96 44.23c23.48-26.88 57.59-44.23 96-44.23c17.67 0 32 14.31 32 32s-14.33 32-32 32c-35.3 0-64 28.72-64 64v96h32c17.67 0 32 14.31 32 32s-14.33 32-32 32h-32v96c0 35.28 28.7 64 64 64C241.7 448 256 462.3 256 480z\"]\n};\nvar faIceCream = {\n  prefix: 'fas',\n  iconName: 'ice-cream',\n  icon: [448, 512, [127848], \"f810\", \"M96.06 288.3H351.9L252.6 493.8C250.1 499.2 246 503.8 240.1 507.1C235.9 510.3 230 512 224 512C217.1 512 212.1 510.3 207 507.1C201.1 503.8 197.9 499.2 195.4 493.8L96.06 288.3zM386.3 164C392.1 166.4 397.4 169.9 401.9 174.4C406.3 178.8 409.9 184.1 412.3 189.9C414.7 195.7 415.1 201.1 416 208.3C416 214.5 414.8 220.8 412.4 226.6C409.1 232.4 406.5 237.7 402 242.2C397.6 246.6 392.3 250.2 386.5 252.6C380.7 255 374.4 256.3 368.1 256.3H79.88C67.16 256.3 54.96 251.2 45.98 242.2C37 233.2 31.97 220.1 32 208.3C32.03 195.5 37.1 183.4 46.12 174.4C55.14 165.4 67.35 160.4 80.07 160.4H81.06C80.4 154.9 80.06 149.4 80.04 143.8C80.04 105.7 95.2 69.11 122.2 42.13C149.2 15.15 185.8 0 223.1 0C262.1 0 298.7 15.15 325.7 42.13C352.7 69.11 367.9 105.7 367.9 143.8C367.9 149.4 367.6 154.9 366.9 160.4H367.9C374.2 160.4 380.5 161.6 386.3 164z\"]\n};\nvar faIcicles = {\n  prefix: 'fas',\n  iconName: 'icicles',\n  icon: [512, 512, [], \"f7ad\", \"M511.4 37.87l-87.54 467.6c-1.625 8.623-14.04 8.634-15.67 .0104L341.4 141.7L295.7 314.2c-2.375 7.624-12.98 7.624-15.36 0L246.3 180.9l-46.49 196.9c-1.875 8.373-13.64 8.373-15.51 0L139.1 190.5L103.6 314.5c-2.375 7.124-12.64 7.198-15.14 .0744L1.357 41.24C-4.768 20.75 10.61 0 31.98 0h448C500 0 515.2 18.25 511.4 37.87z\"]\n};\nvar faIcons = {\n  prefix: 'fas',\n  iconName: 'icons',\n  icon: [512, 512, [\"heart-music-camera-bolt\"], \"f86d\", \"M500.3 7.251C507.7 13.33 512 22.41 512 31.1V175.1C512 202.5 483.3 223.1 447.1 223.1C412.7 223.1 383.1 202.5 383.1 175.1C383.1 149.5 412.7 127.1 447.1 127.1V71.03L351.1 90.23V207.1C351.1 234.5 323.3 255.1 287.1 255.1C252.7 255.1 223.1 234.5 223.1 207.1C223.1 181.5 252.7 159.1 287.1 159.1V63.1C287.1 48.74 298.8 35.61 313.7 32.62L473.7 .6198C483.1-1.261 492.9 1.173 500.3 7.251H500.3zM74.66 303.1L86.5 286.2C92.43 277.3 102.4 271.1 113.1 271.1H174.9C185.6 271.1 195.6 277.3 201.5 286.2L213.3 303.1H239.1C266.5 303.1 287.1 325.5 287.1 351.1V463.1C287.1 490.5 266.5 511.1 239.1 511.1H47.1C21.49 511.1-.0019 490.5-.0019 463.1V351.1C-.0019 325.5 21.49 303.1 47.1 303.1H74.66zM143.1 359.1C117.5 359.1 95.1 381.5 95.1 407.1C95.1 434.5 117.5 455.1 143.1 455.1C170.5 455.1 191.1 434.5 191.1 407.1C191.1 381.5 170.5 359.1 143.1 359.1zM440.3 367.1H496C502.7 367.1 508.6 372.1 510.1 378.4C513.3 384.6 511.6 391.7 506.5 396L378.5 508C372.9 512.1 364.6 513.3 358.6 508.9C352.6 504.6 350.3 496.6 353.3 489.7L391.7 399.1H336C329.3 399.1 323.4 395.9 321 389.6C318.7 383.4 320.4 376.3 325.5 371.1L453.5 259.1C459.1 255 467.4 254.7 473.4 259.1C479.4 263.4 481.6 271.4 478.7 278.3L440.3 367.1zM116.7 219.1L19.85 119.2C-8.112 90.26-6.614 42.31 24.85 15.34C51.82-8.137 93.26-3.642 118.2 21.83L128.2 32.32L137.7 21.83C162.7-3.642 203.6-8.137 231.6 15.34C262.6 42.31 264.1 90.26 236.1 119.2L139.7 219.1C133.2 225.6 122.7 225.6 116.7 219.1H116.7z\"]\n};\nvar faHeartMusicCameraBolt = faIcons;\nvar faIdBadge = {\n  prefix: 'fas',\n  iconName: 'id-badge',\n  icon: [384, 512, [], \"f2c1\", \"M336 0h-288C21.49 0 0 21.49 0 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48v-416C384 21.49 362.5 0 336 0zM192 160c35.35 0 64 28.65 64 64s-28.65 64-64 64S128 259.3 128 224S156.7 160 192 160zM288 416H96c-8.836 0-16-7.164-16-16C80 355.8 115.8 320 160 320h64c44.18 0 80 35.82 80 80C304 408.8 296.8 416 288 416zM240 96h-96C135.2 96 128 88.84 128 80S135.2 64 144 64h96C248.8 64 256 71.16 256 80S248.8 96 240 96z\"]\n};\nvar faIdCard = {\n  prefix: 'fas',\n  iconName: 'id-card',\n  icon: [576, 512, [62147, \"drivers-license\"], \"f2c2\", \"M528 32h-480C21.49 32 0 53.49 0 80V96h576V80C576 53.49 554.5 32 528 32zM0 432C0 458.5 21.49 480 48 480h480c26.51 0 48-21.49 48-48V128H0V432zM368 192h128C504.8 192 512 199.2 512 208S504.8 224 496 224h-128C359.2 224 352 216.8 352 208S359.2 192 368 192zM368 256h128C504.8 256 512 263.2 512 272S504.8 288 496 288h-128C359.2 288 352 280.8 352 272S359.2 256 368 256zM368 320h128c8.836 0 16 7.164 16 16S504.8 352 496 352h-128c-8.836 0-16-7.164-16-16S359.2 320 368 320zM176 192c35.35 0 64 28.66 64 64s-28.65 64-64 64s-64-28.66-64-64S140.7 192 176 192zM112 352h128c26.51 0 48 21.49 48 48c0 8.836-7.164 16-16 16h-192C71.16 416 64 408.8 64 400C64 373.5 85.49 352 112 352z\"]\n};\nvar faDriversLicense = faIdCard;\nvar faIdCardClip = {\n  prefix: 'fas',\n  iconName: 'id-card-clip',\n  icon: [576, 512, [\"id-card-alt\"], \"f47f\", \"M256 128h64c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H256C238.3 0 224 14.33 224 32v64C224 113.7 238.3 128 256 128zM528 64H384v48C384 138.5 362.5 160 336 160h-96C213.5 160 192 138.5 192 112V64H48C21.49 64 0 85.49 0 112v352C0 490.5 21.49 512 48 512h480c26.51 0 48-21.49 48-48v-352C576 85.49 554.5 64 528 64zM288 224c35.35 0 64 28.66 64 64s-28.65 64-64 64s-64-28.66-64-64S252.7 224 288 224zM384 448H192c-8.836 0-16-7.164-16-16C176 405.5 197.5 384 224 384h128c26.51 0 48 21.49 48 48C400 440.8 392.8 448 384 448z\"]\n};\nvar faIdCardAlt = faIdCardClip;\nvar faIgloo = {\n  prefix: 'fas',\n  iconName: 'igloo',\n  icon: [576, 512, [], \"f7ae\", \"M320 160H48.5C100.2 82.82 188.1 32 288 32C298.8 32 309.5 32.6 320 33.76V160zM352 39.14C424.9 55.67 487.2 99.82 527.5 160H352V39.14zM96 192V320H0C0 274 10.77 230.6 29.94 192H96zM192 320H128V192H448V320H384V352H576V432C576 458.5 554.5 480 528 480H352V352C352 316.7 323.3 288 288 288C252.7 288 224 316.7 224 352V480H48C21.49 480 0 458.5 0 432V352H192V320zM480 192H546.1C565.2 230.6 576 274 576 320H480V192z\"]\n};\nvar faImage = {\n  prefix: 'fas',\n  iconName: 'image',\n  icon: [512, 512, [], \"f03e\", \"M447.1 32h-384C28.64 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM111.1 96c26.51 0 48 21.49 48 48S138.5 192 111.1 192s-48-21.49-48-48S85.48 96 111.1 96zM446.1 407.6C443.3 412.8 437.9 416 432 416H82.01c-6.021 0-11.53-3.379-14.26-8.75c-2.73-5.367-2.215-11.81 1.334-16.68l70-96C142.1 290.4 146.9 288 152 288s9.916 2.441 12.93 6.574l32.46 44.51l93.3-139.1C293.7 194.7 298.7 192 304 192s10.35 2.672 13.31 7.125l128 192C448.6 396 448.9 402.3 446.1 407.6z\"]\n};\nvar faImagePortrait = {\n  prefix: 'fas',\n  iconName: 'image-portrait',\n  icon: [384, 512, [\"portrait\"], \"f3e0\", \"M336 0h-288c-26.51 0-48 21.49-48 48v416C0 490.5 21.49 512 48 512h288c26.51 0 48-21.49 48-48v-416C384 21.49 362.5 0 336 0zM192 128c35.35 0 64 28.65 64 64s-28.65 64-64 64S128 227.3 128 192S156.7 128 192 128zM288 384H96c-8.836 0-16-7.164-16-16C80 323.8 115.8 288 160 288h64c44.18 0 80 35.82 80 80C304 376.8 296.8 384 288 384z\"]\n};\nvar faPortrait = faImagePortrait;\nvar faImages = {\n  prefix: 'fas',\n  iconName: 'images',\n  icon: [576, 512, [], \"f302\", \"M528 32H144c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48H528c26.51 0 48-21.49 48-48v-256C576 53.49 554.5 32 528 32zM223.1 96c17.68 0 32 14.33 32 32S241.7 160 223.1 160c-17.67 0-32-14.33-32-32S206.3 96 223.1 96zM494.1 311.6C491.3 316.8 485.9 320 480 320H192c-6.023 0-11.53-3.379-14.26-8.75c-2.73-5.367-2.215-11.81 1.332-16.68l70-96C252.1 194.4 256.9 192 262 192c5.111 0 9.916 2.441 12.93 6.574l22.35 30.66l62.74-94.11C362.1 130.7 367.1 128 373.3 128c5.348 0 10.34 2.672 13.31 7.125l106.7 160C496.6 300 496.9 306.3 494.1 311.6zM456 432H120c-39.7 0-72-32.3-72-72v-240C48 106.8 37.25 96 24 96S0 106.8 0 120v240C0 426.2 53.83 480 120 480h336c13.25 0 24-10.75 24-24S469.3 432 456 432z\"]\n};\nvar faInbox = {\n  prefix: 'fas',\n  iconName: 'inbox',\n  icon: [512, 512, [], \"f01c\", \"M447 56.25C443.5 42 430.7 31.1 416 31.1H96c-14.69 0-27.47 10-31.03 24.25L3.715 304.9C1.247 314.9 0 325.2 0 335.5v96.47c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48v-96.47c0-10.32-1.247-20.6-3.715-30.61L447 56.25zM352 352H160L128 288H72.97L121 96h270l48.03 192H384L352 352z\"]\n};\nvar faIndent = {\n  prefix: 'fas',\n  iconName: 'indent',\n  icon: [448, 512, [], \"f03c\", \"M0 64C0 46.33 14.33 32 32 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96H32C14.33 96 0 81.67 0 64zM192 192C192 174.3 206.3 160 224 160H416C433.7 160 448 174.3 448 192C448 209.7 433.7 224 416 224H224C206.3 224 192 209.7 192 192zM416 288C433.7 288 448 302.3 448 320C448 337.7 433.7 352 416 352H224C206.3 352 192 337.7 192 320C192 302.3 206.3 288 224 288H416zM0 448C0 430.3 14.33 416 32 416H416C433.7 416 448 430.3 448 448C448 465.7 433.7 480 416 480H32C14.33 480 0 465.7 0 448zM25.82 347.9C15.31 356.1 0 348.6 0 335.3V176.7C0 163.4 15.31 155.9 25.82 164.1L127.8 243.4C135.1 249.8 135.1 262.2 127.8 268.6L25.82 347.9z\"]\n};\nvar faIndianRupeeSign = {\n  prefix: 'fas',\n  iconName: 'indian-rupee-sign',\n  icon: [320, 512, [\"indian-rupee\", \"inr\"], \"e1bc\", \"M.0022 64C.0022 46.33 14.33 32 32 32H288C305.7 32 320 46.33 320 64C320 81.67 305.7 96 288 96H231.8C241.4 110.4 248.5 126.6 252.4 144H288C305.7 144 320 158.3 320 176C320 193.7 305.7 208 288 208H252.4C239.2 266.3 190.5 311.2 130.3 318.9L274.6 421.1C288.1 432.2 292.3 452.2 282 466.6C271.8 480.1 251.8 484.3 237.4 474L13.4 314C2.083 305.1-2.716 291.5 1.529 278.2C5.774 264.1 18.09 256 32 256H112C144.8 256 173 236.3 185.3 208H32C14.33 208 .0022 193.7 .0022 176C.0022 158.3 14.33 144 32 144H185.3C173 115.7 144.8 96 112 96H32C14.33 96 .0022 81.67 .0022 64V64z\"]\n};\nvar faIndianRupee = faIndianRupeeSign;\nvar faInr = faIndianRupeeSign;\nvar faIndustry = {\n  prefix: 'fas',\n  iconName: 'industry',\n  icon: [576, 512, [], \"f275\", \"M128 32C145.7 32 160 46.33 160 64V215.4L316.6 131C332.6 122.4 352 134 352 152.2V215.4L508.6 131C524.6 122.4 544 134 544 152.2V432C544 458.5 522.5 480 496 480H80C53.49 480 32 458.5 32 432V64C32 46.33 46.33 32 64 32H128z\"]\n};\nvar faInfinity = {\n  prefix: 'fas',\n  iconName: 'infinity',\n  icon: [640, 512, [9854, 8734], \"f534\", \"M494.9 96.01c-38.78 0-75.22 15.09-102.6 42.5L320 210.8L247.8 138.5c-27.41-27.41-63.84-42.5-102.6-42.5C65.11 96.01 0 161.1 0 241.1v29.75c0 80.03 65.11 145.1 145.1 145.1c38.78 0 75.22-15.09 102.6-42.5L320 301.3l72.23 72.25c27.41 27.41 63.84 42.5 102.6 42.5C574.9 416 640 350.9 640 270.9v-29.75C640 161.1 574.9 96.01 494.9 96.01zM202.5 328.3c-15.31 15.31-35.69 23.75-57.38 23.75C100.4 352 64 315.6 64 270.9v-29.75c0-44.72 36.41-81.13 81.14-81.13c21.69 0 42.06 8.438 57.38 23.75l72.23 72.25L202.5 328.3zM576 270.9c0 44.72-36.41 81.13-81.14 81.13c-21.69 0-42.06-8.438-57.38-23.75l-72.23-72.25l72.23-72.25c15.31-15.31 35.69-23.75 57.38-23.75C539.6 160 576 196.4 576 241.1V270.9z\"]\n};\nvar faInfo = {\n  prefix: 'fas',\n  iconName: 'info',\n  icon: [192, 512, [], \"f129\", \"M160 448h-32V224c0-17.69-14.33-32-32-32L32 192c-17.67 0-32 14.31-32 32s14.33 31.1 32 31.1h32v192H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h128c17.67 0 32-14.31 32-32S177.7 448 160 448zM96 128c26.51 0 48-21.49 48-48S122.5 32.01 96 32.01s-48 21.49-48 48S69.49 128 96 128z\"]\n};\nvar faItalic = {\n  prefix: 'fas',\n  iconName: 'italic',\n  icon: [384, 512, [], \"f033\", \"M384 64.01c0 17.69-14.31 32-32 32h-58.67l-133.3 320H224c17.69 0 32 14.31 32 32s-14.31 32-32 32H32c-17.69 0-32-14.31-32-32s14.31-32 32-32h58.67l133.3-320H160c-17.69 0-32-14.31-32-32s14.31-32 32-32h192C369.7 32.01 384 46.33 384 64.01z\"]\n};\nvar faJ = {\n  prefix: 'fas',\n  iconName: 'j',\n  icon: [320, 512, [106], \"4a\", \"M320 64.01v259.4c0 86.36-71.78 156.6-160 156.6s-160-70.26-160-156.6V288c0-17.67 14.31-32 32-32s32 14.33 32 32v35.38c0 51.08 43.06 92.63 96 92.63s96-41.55 96-92.63V64.01c0-17.67 14.31-32 32-32S320 46.34 320 64.01z\"]\n};\nvar faJar = {\n  prefix: 'fas',\n  iconName: 'jar',\n  icon: [320, 512, [], \"e516\", \"M32 32C32 14.33 46.33 0 64 0H256C273.7 0 288 14.33 288 32C288 49.67 273.7 64 256 64H64C46.33 64 32 49.67 32 32zM0 160C0 124.7 28.65 96 64 96H256C291.3 96 320 124.7 320 160V448C320 483.3 291.3 512 256 512H64C28.65 512 0 483.3 0 448V160zM256 224H64V384H256V224z\"]\n};\nvar faJarWheat = {\n  prefix: 'fas',\n  iconName: 'jar-wheat',\n  icon: [320, 512, [], \"e517\", \"M32 32C32 14.33 46.33 0 64 0H256C273.7 0 288 14.33 288 32C288 49.67 273.7 64 256 64H64C46.33 64 32 49.67 32 32zM0 160C0 124.7 28.65 96 64 96H256C291.3 96 320 124.7 320 160V448C320 483.3 291.3 512 256 512H64C28.65 512 0 483.3 0 448V160zM192 320C227.3 320 256 291.3 256 256H208C188.9 256 171.7 264.4 160 277.7C148.3 264.4 131.1 256 112 256H64C64 291.3 92.65 320 128 320H192zM192 224C227.3 224 256 195.3 256 160H208C188.9 160 171.7 168.4 160 181.7C148.3 168.4 131.1 160 112 160H64C64 195.3 92.65 224 128 224H192zM192 416C227.3 416 256 387.3 256 352H208C188.9 352 171.7 360.4 160 373.7C148.3 360.4 131.1 352 112 352H64C64 387.3 92.65 416 128 416H144V448C144 456.8 151.2 464 160 464C168.8 464 176 456.8 176 448V416H192z\"]\n};\nvar faJedi = {\n  prefix: 'fas',\n  iconName: 'jedi',\n  icon: [576, 512, [], \"f669\", \"M554.9 293.1l-58.88 58.88h40C493.2 446.1 398.2 511.1 287.1 512c-110.3-.0078-205.2-65.88-247.1-160h40L21.13 293.1C17.75 275.1 16 258.6 16 241.2c0-5.75 .75-11.5 1-17.25h47L22.75 182.7C37.38 117.1 75.86 59.37 130.6 20.5c2.75-2 6.021-3.005 9.272-3.005c5.5 0 10.5 2.75 13.5 7.25c3.125 4.375 3.625 10.13 1.625 15.13C148.5 56.12 145.1 73.62 145.1 91.12c0 45.13 21.13 86.63 57.75 113.8C206.9 207.7 209.4 212.4 209.5 217.2c.25 5-1.751 9.752-5.501 13c-32.75 29.38-47.5 74-38.5 117.1c9.751 48.38 48.88 87.13 97.26 96.5l2.5-65.37l-27.13 18.5c-3.125 2-7.251 1.75-10-.75c-2.75-2.625-3.25-6.75-1.375-10l20.13-33.75l-42.13-8.627c-3.625-.875-6.375-4.125-6.375-7.875s2.75-7 6.375-7.875l42.13-8.75L226.8 285.6C224.9 282.5 225.4 278.4 228.1 275.7c2.75-2.5 6.876-2.875 10-.75l30.38 20.63l11.49-287.8C280.3 3.461 283.7 .0156 287.1 0c4.237 .0156 7.759 3.461 8.009 7.828l11.49 287.8l30.38-20.63c3.125-2.125 7.251-1.75 10 .75c2.75 2.625 3.25 6.75 1.375 9.875l-20.13 33.75l42.13 8.75c3.625 .875 6.375 4.125 6.375 7.875s-2.75 7-6.375 7.875l-42.13 8.627l20.13 33.75c1.875 3.25 1.375 7.375-1.375 10c-2.75 2.5-6.876 2.75-10 .75l-27.13-18.5l2.5 65.37c48.38-9.375 87.51-48.13 97.26-96.5c9.001-43.13-5.75-87.75-38.5-117.1c-3.75-3.25-5.751-8.002-5.501-13c.125-4.875 2.626-9.5 6.626-12.38c36.63-27.13 57.75-68.63 57.75-113.8c0-17.5-3.375-35-9.875-51.25c-2-5-1.5-10.75 1.625-15.13c3-4.5 8.001-7.25 13.5-7.25c3.25 0 6.474 .9546 9.224 2.955c54.75 38.88 93.28 96.67 107.9 162.3l-41.25 41.25h47c.2501 5.75 .9965 11.5 .9965 17.25C559.1 258.6 558.3 275.1 554.9 293.1z\"]\n};\nvar faJetFighter = {\n  prefix: 'fas',\n  iconName: 'jet-fighter',\n  icon: [640, 512, [\"fighter-jet\"], \"f0fb\", \"M160 24C160 10.75 170.7 0 184 0H296C309.3 0 320 10.75 320 24C320 37.25 309.3 48 296 48H280L384 192H500.4C508.1 192 515.7 193.4 522.9 196.1L625 234.4C634 237.8 640 246.4 640 256C640 265.6 634 274.2 625 277.6L522.9 315.9C515.7 318.6 508.1 320 500.4 320H384L280 464H296C309.3 464 320 474.7 320 488C320 501.3 309.3 512 296 512H184C170.7 512 160 501.3 160 488C160 474.7 170.7 464 184 464H192V320H160L105.4 374.6C99.37 380.6 91.23 384 82.75 384H64C46.33 384 32 369.7 32 352V288C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224V160C32 142.3 46.33 128 64 128H82.75C91.23 128 99.37 131.4 105.4 137.4L160 192H192V48H184C170.7 48 160 37.25 160 24V24zM80 240C71.16 240 64 247.2 64 256C64 264.8 71.16 272 80 272H144C152.8 272 160 264.8 160 256C160 247.2 152.8 240 144 240H80z\"]\n};\nvar faFighterJet = faJetFighter;\nvar faJetFighterUp = {\n  prefix: 'fas',\n  iconName: 'jet-fighter-up',\n  icon: [576, 512, [], \"e518\", \"M346.8 112.6C350.2 120.6 352 129.2 352 137.9V214.8L496 298.8V280C496 266.7 506.7 256 520 256C533.3 256 544 266.7 544 280V392C544 405.3 533.3 416 520 416C506.7 416 496 405.3 496 392V384H352V416.7L410.5 467.1C414 470.1 416 475.4 416 480V496C416 504.8 408.8 512 400 512H304V448C304 439.2 296.8 432 288 432C279.2 432 272 439.2 272 448V512H176C167.2 512 160 504.8 160 496V480C160 475.4 161.1 470.1 165.5 467.1L224 416.7V384H80V392C80 405.3 69.25 416 56 416C42.75 416 32 405.3 32 392V280C32 266.7 42.75 256 56 256C69.25 256 80 266.7 80 280V298.8L224 214.8V137.9C224 129.2 225.8 120.6 229.2 112.6L273.3 9.697C275.8 3.814 281.6 0 288 0C294.4 0 300.2 3.814 302.7 9.697L346.8 112.6z\"]\n};\nvar faJoint = {\n  prefix: 'fas',\n  iconName: 'joint',\n  icon: [640, 512, [], \"f595\", \"M444.4 181.1C466.8 196.8 480 222.2 480 249.8V280C480 284.4 483.6 288 488 288h48C540.4 288 544 284.4 544 280V249.8c0-43.25-21-83.5-56.38-108.1C463.9 125 448 99.38 448 70.25V8C448 3.625 444.4 0 440 0h-48C387.6 0 384 3.625 384 8v66.38C384 118.1 408.5 156 444.4 181.1zM195 359C125.1 370.1 59.75 394.8 0 432C83.62 484.2 180.2 512 279 512h88.5l-112.7-131.5C240 363.2 217.4 355.4 195 359zM553.3 87.12C547.6 83.25 544 77.12 544 70.25V8C544 3.625 540.4 0 536 0h-48C483.6 0 480 3.625 480 8v62.25c0 22.13 10.12 43.5 28.62 55.5C550.8 153 576 199.5 576 249.8V280C576 284.4 579.6 288 584 288h48C636.4 288 640 284.4 640 280V249.8C640 184.2 607.6 123.5 553.3 87.12zM360.9 352c-34.38 .125-86.75 .25-88.25 .25l117.9 137.4C402.6 503.9 420.4 512 439.1 512h88.38l-117.9-137.6C397.4 360.1 379.6 352 360.9 352zM616 352H432l117.1 137.6C562.1 503.9 579.9 512 598.6 512H616c13.25 0 24-10.75 24-24v-112C640 362.8 629.3 352 616 352z\"]\n};\nvar faJugDetergent = {\n  prefix: 'fas',\n  iconName: 'jug-detergent',\n  icon: [384, 512, [], \"e519\", \"M96 24C96 10.75 106.7 0 120 0H200C213.3 0 224 10.75 224 24V48H232C245.3 48 256 58.75 256 72C256 85.25 245.3 96 232 96H88C74.75 96 64 85.25 64 72C64 58.75 74.75 48 88 48H96V24zM0 256C0 185.3 57.31 128 128 128H256C326.7 128 384 185.3 384 256V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V256zM256 352C256 369.7 270.3 384 288 384C305.7 384 320 369.7 320 352V256C320 238.3 305.7 224 288 224C270.3 224 256 238.3 256 256V352z\"]\n};\nvar faK = {\n  prefix: 'fas',\n  iconName: 'k',\n  icon: [320, 512, [107], \"4b\", \"M314.3 429.8c10.06 14.53 6.438 34.47-8.094 44.53c-5.562 3.844-11.91 5.688-18.19 5.688c-10.16 0-20.12-4.812-26.34-13.78L128.1 273.3L64 338.9v109.1c0 17.67-14.31 32-32 32s-32-14.33-32-32v-384C0 46.34 14.31 32.01 32 32.01S64 46.34 64 64.01v183.3l201.1-205.7c12.31-12.61 32.63-12.86 45.25-.5c12.62 12.34 12.88 32.61 .5 45.25l-137.2 140.3L314.3 429.8z\"]\n};\nvar faKaaba = {\n  prefix: 'fas',\n  iconName: 'kaaba',\n  icon: [576, 512, [128331], \"f66b\", \"M0 239.4V197.4L278.1 115.3C284.9 113.6 291.1 113.6 297 115.3L576 197.4V239.4L537.1 228.6C528.6 226.2 519.7 231.2 517.4 239.7C515 248.2 520 257.1 528.5 259.4L576 272.6V409.5C576 431.1 560.4 451.5 538.4 456.4L298.4 509.7C291.6 511.2 284.4 511.2 277.6 509.7L37.59 456.4C15.63 451.5 0 431.1 0 409.5V272.6L47.48 259.4C55.1 257.1 60.98 248.2 58.62 239.7C56.25 231.2 47.43 226.2 38.92 228.6L0 239.4zM292.3 160.6C289.5 159.8 286.5 159.8 283.7 160.6L240.5 172.6C232 174.9 227 183.8 229.4 192.3C231.7 200.8 240.6 205.8 249.1 203.4L288 192.6L326.9 203.4C335.4 205.8 344.3 200.8 346.6 192.3C348.1 183.8 343.1 174.9 335.5 172.6L292.3 160.6zM191.5 219.4C199.1 217.1 204.1 208.2 202.6 199.7C200.3 191.2 191.4 186.2 182.9 188.6L96.52 212.6C88 214.9 83.02 223.8 85.38 232.3C87.75 240.8 96.57 245.8 105.1 243.4L191.5 219.4zM393.1 188.6C384.6 186.2 375.7 191.2 373.4 199.7C371 208.2 376 217.1 384.5 219.4L470.9 243.4C479.4 245.8 488.3 240.8 490.6 232.3C492.1 223.8 487.1 214.9 479.5 212.6L393.1 188.6zM269.9 84.63L0 164V130.6C0 109.9 13.22 91.59 32.82 85.06L272.8 5.061C282.7 1.777 293.3 1.777 303.2 5.061L543.2 85.06C562.8 91.59 576 109.9 576 130.6V164L306.1 84.63C294.3 81.17 281.7 81.17 269.9 84.63V84.63z\"]\n};\nvar faKey = {\n  prefix: 'fas',\n  iconName: 'key',\n  icon: [512, 512, [128273], \"f084\", \"M282.3 343.7L248.1 376.1C244.5 381.5 238.4 384 232 384H192V424C192 437.3 181.3 448 168 448H128V488C128 501.3 117.3 512 104 512H24C10.75 512 0 501.3 0 488V408C0 401.6 2.529 395.5 7.029 391L168.3 229.7C162.9 212.8 160 194.7 160 176C160 78.8 238.8 0 336 0C433.2 0 512 78.8 512 176C512 273.2 433.2 352 336 352C317.3 352 299.2 349.1 282.3 343.7zM376 176C398.1 176 416 158.1 416 136C416 113.9 398.1 96 376 96C353.9 96 336 113.9 336 136C336 158.1 353.9 176 376 176z\"]\n};\nvar faKeyboard = {\n  prefix: 'fas',\n  iconName: 'keyboard',\n  icon: [576, 512, [9000], \"f11c\", \"M512 448H64c-35.35 0-64-28.65-64-64V128c0-35.35 28.65-64 64-64h448c35.35 0 64 28.65 64 64v256C576 419.3 547.3 448 512 448zM128 180v-40C128 133.4 122.6 128 116 128h-40C69.38 128 64 133.4 64 140v40C64 186.6 69.38 192 76 192h40C122.6 192 128 186.6 128 180zM224 180v-40C224 133.4 218.6 128 212 128h-40C165.4 128 160 133.4 160 140v40C160 186.6 165.4 192 172 192h40C218.6 192 224 186.6 224 180zM320 180v-40C320 133.4 314.6 128 308 128h-40C261.4 128 256 133.4 256 140v40C256 186.6 261.4 192 268 192h40C314.6 192 320 186.6 320 180zM416 180v-40C416 133.4 410.6 128 404 128h-40C357.4 128 352 133.4 352 140v40C352 186.6 357.4 192 364 192h40C410.6 192 416 186.6 416 180zM512 180v-40C512 133.4 506.6 128 500 128h-40C453.4 128 448 133.4 448 140v40C448 186.6 453.4 192 460 192h40C506.6 192 512 186.6 512 180zM128 276v-40C128 229.4 122.6 224 116 224h-40C69.38 224 64 229.4 64 236v40C64 282.6 69.38 288 76 288h40C122.6 288 128 282.6 128 276zM224 276v-40C224 229.4 218.6 224 212 224h-40C165.4 224 160 229.4 160 236v40C160 282.6 165.4 288 172 288h40C218.6 288 224 282.6 224 276zM320 276v-40C320 229.4 314.6 224 308 224h-40C261.4 224 256 229.4 256 236v40C256 282.6 261.4 288 268 288h40C314.6 288 320 282.6 320 276zM416 276v-40C416 229.4 410.6 224 404 224h-40C357.4 224 352 229.4 352 236v40C352 282.6 357.4 288 364 288h40C410.6 288 416 282.6 416 276zM512 276v-40C512 229.4 506.6 224 500 224h-40C453.4 224 448 229.4 448 236v40C448 282.6 453.4 288 460 288h40C506.6 288 512 282.6 512 276zM128 372v-40C128 325.4 122.6 320 116 320h-40C69.38 320 64 325.4 64 332v40C64 378.6 69.38 384 76 384h40C122.6 384 128 378.6 128 372zM416 372v-40C416 325.4 410.6 320 404 320h-232C165.4 320 160 325.4 160 332v40C160 378.6 165.4 384 172 384h232C410.6 384 416 378.6 416 372zM512 372v-40C512 325.4 506.6 320 500 320h-40C453.4 320 448 325.4 448 332v40C448 378.6 453.4 384 460 384h40C506.6 384 512 378.6 512 372z\"]\n};\nvar faKhanda = {\n  prefix: 'fas',\n  iconName: 'khanda',\n  icon: [576, 512, [9772], \"f66d\", \"M447.7 65.1c-6.25-3.5-14.29-2.351-19.29 3.024c-5.125 5.375-5.833 13.37-1.958 19.5c16.5 26.25 25.23 56.34 25.23 87.46c-.25 53.25-26.74 102.6-71.24 132.4l-76.62 53.35v-20.12l44.01-36.12c3.875-4.125 4.983-10.13 2.858-15.26L342.8 273c33.88-19.25 56.94-55.25 56.94-97c0-40.75-22.06-76.12-54.56-95.75l5.151-11.39c2.375-5.5 .9825-11.87-3.518-15.1L287.9 .0074l-59.05 52.77C224.4 57.02 222.1 63.37 225.2 68.87l5.203 11.32C197.1 99.81 175.9 135.2 175.9 175.1c0 41.75 23.08 77.75 56.95 97L224.1 290.2C222.9 295.4 223.9 301.2 227.9 305.5l43.1 36.11v19.91L195.2 308.1c-44.25-29.5-70.72-78.9-70.97-132.1c0-31.12 8.73-61.2 25.23-87.45C153.3 82.4 151.8 74.75 146.8 69.5C141.8 64.12 133.2 63.25 126.8 66.75C48.34 109.6 9.713 205.2 45.34 296c7 18 17.88 34.38 30.5 49l55.92 65.38c4.875 5.75 13.09 7.232 19.71 3.732l79.25-42.25l29.26 20.37l-47.09 32.75c-1.625-.375-3.125-1-4.1-1c-13.25 0-23.97 10.75-23.97 24s10.72 23.1 23.97 23.1c12.13 0 21.74-9.126 23.36-20.75l40.6-28.25v29.91c-9.375 5.625-15.97 15.37-15.97 27.12c0 17.62 14.37 31.1 31.1 31.1c17.63 0 31.1-14.37 31.1-31.1c0-11.75-6.656-21.52-16.03-27.14v-30.12l40.87 28.48c1.625 11.63 11.23 20.75 23.35 20.75c13.25 0 23.98-10.74 23.98-23.99s-10.73-24-23.98-24c-1.875 0-3.375 .625-5 1l-47.09-32.75l29.25-20.37l79.26 42.25c6.625 3.5 14.84 2.018 19.71-3.732l52.51-61.27c18.88-22 33.1-47.49 41.25-75.61C559.6 189.9 521.5 106.2 447.7 65.1zM351.8 176c0 22.25-11.45 41.91-28.82 53.41l-5.613-12.43c-8.75-24.5-8.811-51.11-.061-75.61l7.748-17.12C341.2 135.9 351.8 154.6 351.8 176zM223.8 176c0-21.38 10.67-40.16 26.67-51.79l7.848 17.17c8.75 24.63 8.747 51.11-.0032 75.61L252.7 229.4C235.4 217.9 223.8 198.2 223.8 176z\"]\n};\nvar faKipSign = {\n  prefix: 'fas',\n  iconName: 'kip-sign',\n  icon: [384, 512, [], \"e1c4\", \"M182.5 224H352C369.7 224 384 238.3 384 256C384 273.7 369.7 288 352 288H182.5L340.8 423.7C354.2 435.2 355.8 455.4 344.3 468.8C332.8 482.2 312.6 483.8 299.2 472.3L128 325.6V448C128 465.7 113.7 480 96 480C78.33 480 64 465.7 64 448V288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H64V64C64 46.33 78.33 32 96 32C113.7 32 128 46.33 128 64V186.4L299.2 39.7C312.6 28.2 332.8 29.76 344.3 43.18C355.8 56.59 354.2 76.8 340.8 88.3L182.5 224z\"]\n};\nvar faKitMedical = {\n  prefix: 'fas',\n  iconName: 'kit-medical',\n  icon: [576, 512, [\"first-aid\"], \"f479\", \"M64 32h32v448H64c-35.35 0-64-28.66-64-64V96C0 60.66 28.65 32 64 32zM128 32h320v448H128V32zM176 282c0 8.835 7.164 16 16 16h53.1V352c0 8.836 7.165 16 16 16h52c8.836 0 16-7.164 16-16V298H384c8.836 0 16-7.165 16-16v-52c0-8.837-7.164-16-16-16h-54V160c0-8.836-7.164-16-16-16h-52c-8.835 0-16 7.164-16 16v54H192c-8.836 0-16 7.163-16 16V282zM512 32h-32v448h32c35.35 0 64-28.66 64-64V96C576 60.66 547.3 32 512 32z\"]\n};\nvar faFirstAid = faKitMedical;\nvar faKitchenSet = {\n  prefix: 'fas',\n  iconName: 'kitchen-set',\n  icon: [576, 512, [], \"e51a\", \"M80 144C80 108.7 108.7 80 144 80C179.3 80 208 108.7 208 144C208 179.3 179.3 208 144 208C108.7 208 80 179.3 80 144zM284.4 176C269.9 240.1 212.5 288 144 288C64.47 288 0 223.5 0 144C0 64.47 64.47 0 144 0C212.5 0 269.9 47.87 284.4 112H356.2C365 102.2 377.8 96 392 96H496C522.5 96 544 117.5 544 144C544 170.5 522.5 192 496 192H392C377.8 192 365 185.8 356.2 176H284.4zM144 48C90.98 48 48 90.98 48 144C48 197 90.98 240 144 240C197 240 240 197 240 144C240 90.98 197 48 144 48zM424 264V272H520C533.3 272 544 282.7 544 296C544 309.3 533.3 320 520 320H280C266.7 320 256 309.3 256 296C256 282.7 266.7 272 280 272H376V264C376 250.7 386.7 240 400 240C413.3 240 424 250.7 424 264zM288 464V352H512V464C512 490.5 490.5 512 464 512H336C309.5 512 288 490.5 288 464zM176 320C202.5 320 224 341.5 224 368C224 394.5 202.5 416 176 416H160C160 433.7 145.7 448 128 448H64C46.33 448 32 433.7 32 416V336C32 327.2 39.16 320 48 320H176zM192 368C192 359.2 184.8 352 176 352H160V384H176C184.8 384 192 376.8 192 368zM200 464C213.3 464 224 474.7 224 488C224 501.3 213.3 512 200 512H24C10.75 512 0 501.3 0 488C0 474.7 10.75 464 24 464H200z\"]\n};\nvar faKiwiBird = {\n  prefix: 'fas',\n  iconName: 'kiwi-bird',\n  icon: [576, 512, [], \"f535\", \"M256 405.1V456C256 469.3 245.3 480 232 480C218.7 480 208 469.3 208 456V415.3C202.7 415.8 197.4 416 192 416C175.4 416 159.3 413.9 144 409.1V456C144 469.3 133.3 480 120 480C106.7 480 96 469.3 96 456V390.3C38.61 357.1 0 295.1 0 224C0 117.1 85.96 32 192 32C228.3 32 262.3 42.08 291.2 59.6C322.4 78.44 355.9 96 392.3 96H448C518.7 96 576 153.3 576 224V464C576 470.1 571.5 477.2 564.8 479.3C558.2 481.4 550.9 478.9 546.9 473.2L461.6 351.3C457.1 351.8 452.6 352 448 352H392.3C355.9 352 322.4 369.6 291.2 388.4C280.2 395.1 268.4 400.7 256 405.1zM448 248C461.3 248 472 237.3 472 224C472 210.7 461.3 200 448 200C434.7 200 424 210.7 424 224C424 237.3 434.7 248 448 248z\"]\n};\nvar faL = {\n  prefix: 'fas',\n  iconName: 'l',\n  icon: [320, 512, [108], \"4c\", \"M320 448c0 17.67-14.31 32-32 32H64c-17.69 0-32-14.33-32-32v-384C32 46.34 46.31 32.01 64 32.01S96 46.34 96 64.01v352h192C305.7 416 320 430.3 320 448z\"]\n};\nvar faLandMineOn = {\n  prefix: 'fas',\n  iconName: 'land-mine-on',\n  icon: [576, 512, [], \"e51b\", \"M312 168C312 181.3 301.3 192 288 192C274.7 192 264 181.3 264 168V24C264 10.75 274.7 0 288 0C301.3 0 312 10.75 312 24V168zM160 320C160 302.3 174.3 288 192 288H384C401.7 288 416 302.3 416 320V352H160V320zM82.74 410.5C90.87 394.3 107.5 384 125.7 384H450.3C468.5 384 485.1 394.3 493.3 410.5L520.8 465.7C531.5 486.1 516 512 492.2 512H83.78C59.99 512 44.52 486.1 55.16 465.7L82.74 410.5zM4.269 138.3C11.81 127.4 26.77 124.7 37.66 132.3L141.7 204.3C152.6 211.8 155.3 226.8 147.7 237.7C140.2 248.6 125.2 251.3 114.3 243.7L10.34 171.7C-.5568 164.2-3.275 149.2 4.269 138.3V138.3zM538.3 132.3C549.2 124.7 564.2 127.4 571.7 138.3C579.3 149.2 576.6 164.2 565.7 171.7L461.7 243.7C450.8 251.3 435.8 248.6 428.3 237.7C420.7 226.8 423.4 211.8 434.3 204.3L538.3 132.3z\"]\n};\nvar faLandmark = {\n  prefix: 'fas',\n  iconName: 'landmark',\n  icon: [512, 512, [127963], \"f66f\", \"M240.1 4.216C249.1-1.405 262-1.405 271.9 4.216L443.6 102.4L447.1 104V104.9L495.9 132.2C508.5 139.4 514.6 154.2 510.9 168.2C507.2 182.2 494.5 192 479.1 192H31.1C17.49 192 4.795 182.2 1.071 168.2C-2.653 154.2 3.524 139.4 16.12 132.2L63.1 104.9V104L68.37 102.4L240.1 4.216zM64 224H128V416H168V224H232V416H280V224H344V416H384V224H448V420.3C448.6 420.6 449.2 420.1 449.8 421.4L497.8 453.4C509.5 461.2 514.7 475.8 510.6 489.3C506.5 502.8 494.1 512 480 512H32C17.9 512 5.46 502.8 1.373 489.3C-2.713 475.8 2.517 461.2 14.25 453.4L62.25 421.4C62.82 420.1 63.41 420.6 64 420.3V224z\"]\n};\nvar faLandmarkDome = {\n  prefix: 'fas',\n  iconName: 'landmark-dome',\n  icon: [512, 512, [\"landmark-alt\"], \"f752\", \"M264 0C277.3 0 288 10.75 288 24V34.65C368.4 48.14 431.9 111.6 445.3 192H448C465.7 192 480 206.3 480 224C480 241.7 465.7 256 448 256H63.1C46.33 256 31.1 241.7 31.1 224C31.1 206.3 46.33 192 63.1 192H66.65C80.14 111.6 143.6 48.14 223.1 34.65V24C223.1 10.75 234.7 0 247.1 0L264 0zM63.1 288H127.1V416H167.1V288H231.1V416H280V288H344V416H384V288H448V420.3C448.6 420.6 449.2 420.1 449.8 421.4L497.8 453.4C509.5 461.2 514.7 475.8 510.6 489.3C506.5 502.8 494.1 512 480 512H31.1C17.9 512 5.458 502.8 1.372 489.3C-2.715 475.8 2.515 461.2 14.25 453.4L62.25 421.4C62.82 420.1 63.41 420.6 63.1 420.3V288z\"]\n};\nvar faLandmarkAlt = faLandmarkDome;\nvar faLandmarkFlag = {\n  prefix: 'fas',\n  iconName: 'landmark-flag',\n  icon: [512, 512, [], \"e51c\", \"M352 0C360.8 0 368 7.164 368 16V80C368 88.84 360.8 96 352 96H272V128H464C481.7 128 496 142.3 496 160C496 177.7 481.7 192 464 192H47.1C30.33 192 15.1 177.7 15.1 160C15.1 142.3 30.33 128 47.1 128H239.1V16C239.1 7.164 247.2 0 255.1 0H352zM63.1 224H127.1V416H167.1V224H231.1V416H280V224H344V416H384V224H448V420.3C448.6 420.6 449.2 420.1 449.8 421.4L497.8 453.4C509.5 461.2 514.7 475.8 510.6 489.3C506.5 502.8 494.1 512 480 512H31.1C17.9 512 5.458 502.8 1.372 489.3C-2.715 475.8 2.515 461.2 14.25 453.4L62.25 421.4C62.82 420.1 63.4 420.6 63.1 420.3V224z\"]\n};\nvar faLanguage = {\n  prefix: 'fas',\n  iconName: 'language',\n  icon: [640, 512, [], \"f1ab\", \"M448 164C459 164 468 172.1 468 184V188H528C539 188 548 196.1 548 208C548 219 539 228 528 228H526L524.4 232.5C515.5 256.1 501.9 279.1 484.7 297.9C485.6 298.4 486.5 298.1 487.4 299.5L506.3 310.8C515.8 316.5 518.8 328.8 513.1 338.3C507.5 347.8 495.2 350.8 485.7 345.1L466.8 333.8C462.4 331.1 457.1 328.3 453.7 325.3C443.2 332.8 431.8 339.3 419.8 344.7L416.1 346.3C406 350.8 394.2 346.2 389.7 336.1C385.2 326 389.8 314.2 399.9 309.7L403.5 308.1C409.9 305.2 416.1 301.1 422 298.3L409.9 286.1C402 278.3 402 265.7 409.9 257.9C417.7 250 430.3 250 438.1 257.9L452.7 272.4L453.3 272.1C465.7 259.9 475.8 244.7 483.1 227.1H376C364.1 227.1 356 219 356 207.1C356 196.1 364.1 187.1 376 187.1H428V183.1C428 172.1 436.1 163.1 448 163.1L448 164zM160 233.2L179 276H140.1L160 233.2zM0 128C0 92.65 28.65 64 64 64H576C611.3 64 640 92.65 640 128V384C640 419.3 611.3 448 576 448H64C28.65 448 0 419.3 0 384V128zM320 384H576V128H320V384zM178.3 175.9C175.1 168.7 167.9 164 160 164C152.1 164 144.9 168.7 141.7 175.9L77.72 319.9C73.24 329.1 77.78 341.8 87.88 346.3C97.97 350.8 109.8 346.2 114.3 336.1L123.2 315.1H196.8L205.7 336.1C210.2 346.2 222 350.8 232.1 346.3C242.2 341.8 246.8 329.1 242.3 319.9L178.3 175.9z\"]\n};\nvar faLaptop = {\n  prefix: 'fas',\n  iconName: 'laptop',\n  icon: [640, 512, [128187], \"f109\", \"M128 96h384v256h64v-272c0-26.38-21.62-48-48-48h-416c-26.38 0-48 21.62-48 48V352h64V96zM624 383.1h-608c-8.75 0-16 7.25-16 16v16c0 35.25 28.75 64 64 64h512c35.25 0 64-28.75 64-64v-16C640 391.2 632.8 383.1 624 383.1z\"]\n};\nvar faLaptopCode = {\n  prefix: 'fas',\n  iconName: 'laptop-code',\n  icon: [640, 512, [], \"f5fc\", \"M128 96h384v256h64V80C576 53.63 554.4 32 528 32h-416C85.63 32 64 53.63 64 80V352h64V96zM624 384h-608C7.25 384 0 391.3 0 400V416c0 35.25 28.75 64 64 64h512c35.25 0 64-28.75 64-64v-16C640 391.3 632.8 384 624 384zM365.9 286.2C369.8 290.1 374.9 292 380 292s10.23-1.938 14.14-5.844l48-48c7.812-7.813 7.812-20.5 0-28.31l-48-48c-7.812-7.813-20.47-7.813-28.28 0c-7.812 7.813-7.812 20.5 0 28.31l33.86 33.84l-33.86 33.84C358 265.7 358 278.4 365.9 286.2zM274.1 161.9c-7.812-7.813-20.47-7.813-28.28 0l-48 48c-7.812 7.813-7.812 20.5 0 28.31l48 48C249.8 290.1 254.9 292 260 292s10.23-1.938 14.14-5.844c7.812-7.813 7.812-20.5 0-28.31L240.3 224l33.86-33.84C281.1 182.4 281.1 169.7 274.1 161.9z\"]\n};\nvar faLaptopFile = {\n  prefix: 'fas',\n  iconName: 'laptop-file',\n  icon: [640, 512, [], \"e51d\", \"M192 96C192 113.7 206.3 128 224 128H320V192H288C243.8 192 208 227.8 208 272V384C187.1 384 169.3 397.4 162.7 416H48C21.49 416 0 394.5 0 368V48C0 21.49 21.49 0 48 0H192V96zM240 272C240 245.5 261.5 224 288 224H544C570.5 224 592 245.5 592 272V416H624C632.8 416 640 423.2 640 432V448C640 483.3 611.3 512 576 512H256C220.7 512 192 483.3 192 448V432C192 423.2 199.2 416 208 416H240V272zM304 288V416H528V288H304zM320 96H224V0L320 96z\"]\n};\nvar faLaptopMedical = {\n  prefix: 'fas',\n  iconName: 'laptop-medical',\n  icon: [640, 512, [], \"f812\", \"M624 384h-608C7.25 384 0 391.3 0 400V416c0 35.25 28.75 64 64 64h512c35.25 0 64-28.75 64-64v-16C640 391.3 632.8 384 624 384zM128 96h384v256h64V80C576 53.63 554.4 32 528 32h-416C85.63 32 64 53.63 64 80V352h64V96zM304 336h32c8.801 0 16-7.201 16-16V272h48C408.8 272 416 264.8 416 256V224c0-8.801-7.199-16-16-16H352V160c0-8.801-7.199-16-16-16h-32C295.2 144 288 151.2 288 160v48H240C231.2 208 224 215.2 224 224v32c0 8.799 7.199 16 16 16H288V320C288 328.8 295.2 336 304 336z\"]\n};\nvar faLariSign = {\n  prefix: 'fas',\n  iconName: 'lari-sign',\n  icon: [384, 512, [], \"e1c8\", \"M144 32C161.7 32 176 46.33 176 64V96.66C181.3 96.22 186.6 96 192 96C197.4 96 202.7 96.22 208 96.66V64C208 46.33 222.3 32 240 32C257.7 32 272 46.33 272 64V113.4C326.9 138.6 367.8 188.9 380.2 249.6C383.7 266.1 372.5 283.8 355.2 287.4C337.8 290.9 320.1 279.7 317.4 262.4C311.4 232.5 294.9 206.4 272 188.1V256C272 273.7 257.7 288 240 288C222.3 288 208 273.7 208 256V160.1C202.8 160.3 197.4 160 192 160C186.6 160 181.2 160.3 176 160.1V256C176 273.7 161.7 288 144 288C126.3 288 112 273.7 112 256V188.1C82.74 211.5 64 247.6 64 288C64 358.7 121.3 416 192 416H352C369.7 416 384 430.3 384 448C384 465.7 369.7 480 352 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H48.89C18.49 382 0 337.2 0 288C0 210.5 45.9 143.7 112 113.4V64C112 46.33 126.3 32 144 32V32z\"]\n};\nvar faLayerGroup = {\n  prefix: 'fas',\n  iconName: 'layer-group',\n  icon: [512, 512, [], \"f5fd\", \"M232.5 5.171C247.4-1.718 264.6-1.718 279.5 5.171L498.1 106.2C506.6 110.1 512 118.6 512 127.1C512 137.3 506.6 145.8 498.1 149.8L279.5 250.8C264.6 257.7 247.4 257.7 232.5 250.8L13.93 149.8C5.438 145.8 0 137.3 0 127.1C0 118.6 5.437 110.1 13.93 106.2L232.5 5.171zM498.1 234.2C506.6 238.1 512 246.6 512 255.1C512 265.3 506.6 273.8 498.1 277.8L279.5 378.8C264.6 385.7 247.4 385.7 232.5 378.8L13.93 277.8C5.438 273.8 0 265.3 0 255.1C0 246.6 5.437 238.1 13.93 234.2L67.13 209.6L219.1 279.8C242.5 290.7 269.5 290.7 292.9 279.8L444.9 209.6L498.1 234.2zM292.9 407.8L444.9 337.6L498.1 362.2C506.6 366.1 512 374.6 512 383.1C512 393.3 506.6 401.8 498.1 405.8L279.5 506.8C264.6 513.7 247.4 513.7 232.5 506.8L13.93 405.8C5.438 401.8 0 393.3 0 383.1C0 374.6 5.437 366.1 13.93 362.2L67.13 337.6L219.1 407.8C242.5 418.7 269.5 418.7 292.9 407.8V407.8z\"]\n};\nvar faLeaf = {\n  prefix: 'fas',\n  iconName: 'leaf',\n  icon: [512, 512, [], \"f06c\", \"M512 165.4c0 127.9-70.05 235.3-175.3 270.1c-20.04 7.938-41.83 12.46-64.69 12.46c-64.9 0-125.2-36.51-155.7-94.47c-54.13 49.93-68.71 107-68.96 108.1C44.72 472.6 34.87 480 24.02 480c-1.844 0-3.727-.2187-5.602-.6562c-12.89-3.098-20.84-16.08-17.75-28.96c9.598-39.5 90.47-226.4 335.3-226.4C344.8 224 352 216.8 352 208S344.8 192 336 192C228.6 192 151 226.6 96.29 267.6c.1934-10.82 1.242-21.84 3.535-33.05c13.47-65.81 66.04-119 131.4-134.2c28.33-6.562 55.68-6.013 80.93-.0054c56 13.32 118.2-7.412 149.3-61.24c5.664-9.828 20.02-9.516 24.66 .8282C502.7 76.76 512 121.9 512 165.4z\"]\n};\nvar faLeftLong = {\n  prefix: 'fas',\n  iconName: 'left-long',\n  icon: [512, 512, [\"long-arrow-alt-left\"], \"f30a\", \"M512 256C512 273.7 497.7 288 480 288H160.1l0 72c0 9.547-5.66 18.19-14.42 22c-8.754 3.812-18.95 2.077-25.94-4.407l-112.1-104c-10.24-9.5-10.24-25.69 0-35.19l112.1-104c6.992-6.484 17.18-8.218 25.94-4.406C154.4 133.8 160.1 142.5 160.1 151.1L160.1 224H480C497.7 224 512 238.3 512 256z\"]\n};\nvar faLongArrowAltLeft = faLeftLong;\nvar faLeftRight = {\n  prefix: 'fas',\n  iconName: 'left-right',\n  icon: [512, 512, [8596, \"arrows-alt-h\"], \"f337\", \"M503.1 273.6l-112 104c-6.984 6.484-17.17 8.219-25.92 4.406s-14.41-12.45-14.41-22v-56l-192 .001V360c0 9.547-5.656 18.19-14.41 22c-8.75 3.812-18.94 2.078-25.92-4.406l-112-104c-9.781-9.094-9.781-26.09 0-35.19l112-104c6.984-6.484 17.17-8.219 25.92-4.406C154 133.8 159.7 142.5 159.7 152v55.1l192-.001v-56c0-9.547 5.656-18.19 14.41-22s18.94-2.078 25.92 4.406l112 104C513.8 247.5 513.8 264.5 503.1 273.6z\"]\n};\nvar faArrowsAltH = faLeftRight;\nvar faLemon = {\n  prefix: 'fas',\n  iconName: 'lemon',\n  icon: [448, 512, [127819], \"f094\", \"M427.9 52.1c-20.13-20.23-47.58-25.27-65.63-14.77c-51.63 30.08-158.6-46.49-281 75.91c-122.4 122.4-45.83 229.4-75.91 281c-10.5 18.05-5.471 45.5 14.77 65.63c20.13 20.24 47.58 25.27 65.63 14.77c51.63-30.08 158.6 46.49 281-75.91c122.4-122.4 45.83-229.4 75.91-281C453.2 99.69 448.1 72.23 427.9 52.1zM211.9 127.5C167.6 138.7 106.7 199.6 95.53 243.9C93.69 251.2 87.19 255.1 79.1 255.1c-1.281 0-2.594-.1562-3.906-.4687C67.53 253.4 62.34 244.7 64.47 236.1c14.16-56.28 83.31-125.4 139.6-139.6c8.656-2.031 17.25 3.062 19.44 11.62C225.7 116.7 220.5 125.3 211.9 127.5z\"]\n};\nvar faLessThan = {\n  prefix: 'fas',\n  iconName: 'less-than',\n  icon: [384, 512, [62774], \"3c\", \"M351.1 448c-4.797 0-9.688-1.094-14.28-3.375l-320-160C6.844 279.2 0 268.1 0 256c0-12.13 6.844-23.18 17.69-28.62l320-160c15.88-7.875 35.05-1.5 42.94 14.31c7.906 15.81 1.5 35.03-14.31 42.94L103.5 256l262.8 131.4c15.81 7.906 22.22 27.12 14.31 42.94C375 441.5 363.7 448 351.1 448z\"]\n};\nvar faLessThanEqual = {\n  prefix: 'fas',\n  iconName: 'less-than-equal',\n  icon: [448, 512, [], \"f537\", \"M52.11 221.7l320 128C376 351.3 380 352 383.1 352c12.7 0 24.72-7.594 29.73-20.12c6.562-16.41-1.422-35.03-17.83-41.59L150.2 192l245.7-98.28c16.41-6.562 24.39-25.19 17.83-41.59S388.6 27.68 372.1 34.21l-320 128.1C39.97 167.2 32 178.9 32 192S39.97 216.8 52.11 221.7zM416 416H32c-17.67 0-32 14.31-32 31.1S14.33 480 32 480h384c17.67 0 32-14.31 32-32S433.7 416 416 416z\"]\n};\nvar faLifeRing = {\n  prefix: 'fas',\n  iconName: 'life-ring',\n  icon: [512, 512, [], \"f1cd\", \"M470.6 425.4C483.1 437.9 483.1 458.1 470.6 470.6C458.1 483.1 437.9 483.1 425.4 470.6L412.1 458.2C369.6 491.9 315.2 512 255.1 512C196.8 512 142.4 491.9 99.02 458.2L86.63 470.6C74.13 483.1 53.87 483.1 41.37 470.6C28.88 458.1 28.88 437.9 41.37 425.4L53.76 412.1C20.07 369.6 0 315.2 0 255.1C0 196.8 20.07 142.4 53.76 99.02L41.37 86.63C28.88 74.13 28.88 53.87 41.37 41.37C53.87 28.88 74.13 28.88 86.63 41.37L99.02 53.76C142.4 20.07 196.8 0 255.1 0C315.2 0 369.6 20.07 412.1 53.76L425.4 41.37C437.9 28.88 458.1 28.88 470.6 41.37C483.1 53.87 483.1 74.13 470.6 86.63L458.2 99.02C491.9 142.4 512 196.8 512 255.1C512 315.2 491.9 369.6 458.2 412.1L470.6 425.4zM309.3 354.5C293.4 363.1 275.3 368 255.1 368C236.7 368 218.6 363.1 202.7 354.5L144.8 412.5C176.1 434.9 214.5 448 255.1 448C297.5 448 335.9 434.9 367.2 412.5L309.3 354.5zM448 255.1C448 214.5 434.9 176.1 412.5 144.8L354.5 202.7C363.1 218.6 368 236.7 368 256C368 275.3 363.1 293.4 354.5 309.3L412.5 367.2C434.9 335.9 448 297.5 448 256V255.1zM255.1 63.1C214.5 63.1 176.1 77.14 144.8 99.5L202.7 157.5C218.6 148.9 236.7 143.1 255.1 143.1C275.3 143.1 293.4 148.9 309.3 157.5L367.2 99.5C335.9 77.14 297.5 63.1 256 63.1H255.1zM157.5 309.3C148.9 293.4 143.1 275.3 143.1 255.1C143.1 236.7 148.9 218.6 157.5 202.7L99.5 144.8C77.14 176.1 63.1 214.5 63.1 255.1C63.1 297.5 77.14 335.9 99.5 367.2L157.5 309.3zM255.1 207.1C229.5 207.1 207.1 229.5 207.1 255.1C207.1 282.5 229.5 303.1 255.1 303.1C282.5 303.1 304 282.5 304 255.1C304 229.5 282.5 207.1 255.1 207.1z\"]\n};\nvar faLightbulb = {\n  prefix: 'fas',\n  iconName: 'lightbulb',\n  icon: [384, 512, [128161], \"f0eb\", \"M112.1 454.3c0 6.297 1.816 12.44 5.284 17.69l17.14 25.69c5.25 7.875 17.17 14.28 26.64 14.28h61.67c9.438 0 21.36-6.401 26.61-14.28l17.08-25.68c2.938-4.438 5.348-12.37 5.348-17.7L272 415.1h-160L112.1 454.3zM191.4 .0132C89.44 .3257 16 82.97 16 175.1c0 44.38 16.44 84.84 43.56 115.8c16.53 18.84 42.34 58.23 52.22 91.45c.0313 .25 .0938 .5166 .125 .7823h160.2c.0313-.2656 .0938-.5166 .125-.7823c9.875-33.22 35.69-72.61 52.22-91.45C351.6 260.8 368 220.4 368 175.1C368 78.61 288.9-.2837 191.4 .0132zM192 96.01c-44.13 0-80 35.89-80 79.1C112 184.8 104.8 192 96 192S80 184.8 80 176c0-61.76 50.25-111.1 112-111.1c8.844 0 16 7.159 16 16S200.8 96.01 192 96.01z\"]\n};\nvar faLinesLeaning = {\n  prefix: 'fas',\n  iconName: 'lines-leaning',\n  icon: [384, 512, [], \"e51e\", \"M62.36 458.1C56.77 474.9 38.65 483.9 21.88 478.4C5.116 472.8-3.946 454.6 1.643 437.9L129.6 53.88C135.2 37.12 153.4 28.05 170.1 33.64C186.9 39.23 195.9 57.35 190.4 74.12L62.36 458.1zM261.3 32.44C278.7 35.34 290.5 51.83 287.6 69.26L223.6 453.3C220.7 470.7 204.2 482.5 186.7 479.6C169.3 476.7 157.5 460.2 160.4 442.7L224.4 58.74C227.3 41.31 243.8 29.53 261.3 32.44H261.3zM352 32C369.7 32 384 46.33 384 64V448C384 465.7 369.7 480 352 480C334.3 480 320 465.7 320 448V64C320 46.33 334.3 32 352 32V32z\"]\n};\nvar faLink = {\n  prefix: 'fas',\n  iconName: 'link',\n  icon: [640, 512, [128279, \"chain\"], \"f0c1\", \"M172.5 131.1C228.1 75.51 320.5 75.51 376.1 131.1C426.1 181.1 433.5 260.8 392.4 318.3L391.3 319.9C381 334.2 361 337.6 346.7 327.3C332.3 317 328.9 297 339.2 282.7L340.3 281.1C363.2 249 359.6 205.1 331.7 177.2C300.3 145.8 249.2 145.8 217.7 177.2L105.5 289.5C73.99 320.1 73.99 372 105.5 403.5C133.3 431.4 177.3 435 209.3 412.1L210.9 410.1C225.3 400.7 245.3 404 255.5 418.4C265.8 432.8 262.5 452.8 248.1 463.1L246.5 464.2C188.1 505.3 110.2 498.7 60.21 448.8C3.741 392.3 3.741 300.7 60.21 244.3L172.5 131.1zM467.5 380C411 436.5 319.5 436.5 263 380C213 330 206.5 251.2 247.6 193.7L248.7 192.1C258.1 177.8 278.1 174.4 293.3 184.7C307.7 194.1 311.1 214.1 300.8 229.3L299.7 230.9C276.8 262.1 280.4 306.9 308.3 334.8C339.7 366.2 390.8 366.2 422.3 334.8L534.5 222.5C566 191 566 139.1 534.5 108.5C506.7 80.63 462.7 76.99 430.7 99.9L429.1 101C414.7 111.3 394.7 107.1 384.5 93.58C374.2 79.2 377.5 59.21 391.9 48.94L393.5 47.82C451 6.731 529.8 13.25 579.8 63.24C636.3 119.7 636.3 211.3 579.8 267.7L467.5 380z\"]\n};\nvar faChain = faLink;\nvar faLinkSlash = {\n  prefix: 'fas',\n  iconName: 'link-slash',\n  icon: [640, 512, [\"chain-broken\", \"chain-slash\", \"unlink\"], \"f127\", \"M185.7 120.3C242.5 75.82 324.7 79.73 376.1 131.1C420.1 175.1 430.9 239.6 406.7 293.5L438.6 318.4L534.5 222.5C566 191 566 139.1 534.5 108.5C506.7 80.63 462.7 76.1 430.7 99.9L429.1 101C414.7 111.3 394.7 107.1 384.5 93.58C374.2 79.2 377.5 59.21 391.9 48.94L393.5 47.82C451 6.732 529.8 13.25 579.8 63.24C636.3 119.7 636.3 211.3 579.8 267.7L489.3 358.2L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L185.7 120.3zM238.1 161.1L353.4 251.7C359.3 225.5 351.7 197.2 331.7 177.2C306.6 152.1 269.1 147 238.1 161.1V161.1zM263 380C233.1 350.1 218.7 309.8 220.9 270L406.6 416.4C357.4 431 301.9 418.9 263 380V380zM116.6 187.9L167.2 227.8L105.5 289.5C73.99 320.1 73.99 372 105.5 403.5C133.3 431.4 177.3 435 209.3 412.1L210.9 410.1C225.3 400.7 245.3 404 255.5 418.4C265.8 432.8 262.5 452.8 248.1 463.1L246.5 464.2C188.1 505.3 110.2 498.7 60.21 448.8C3.741 392.3 3.741 300.7 60.21 244.3L116.6 187.9z\"]\n};\nvar faChainBroken = faLinkSlash;\nvar faChainSlash = faLinkSlash;\nvar faUnlink = faLinkSlash;\nvar faLiraSign = {\n  prefix: 'fas',\n  iconName: 'lira-sign',\n  icon: [320, 512, [8356], \"f195\", \"M111.1 191.1H224C241.7 191.1 256 206.3 256 223.1C256 241.7 241.7 255.1 224 255.1H111.1V287.1H224C241.7 287.1 256 302.3 256 319.1C256 337.7 241.7 352 224 352H110.8C108.1 374.2 100.8 395.6 89.2 414.9L88.52 416H288C305.7 416 320 430.3 320 448C320 465.7 305.7 480 288 480H32C20.47 480 9.834 473.8 4.154 463.8C-1.527 453.7-1.371 441.4 4.56 431.5L34.32 381.9C39.89 372.6 43.83 362.5 46.01 352H32C14.33 352 0 337.7 0 320C0 302.3 14.33 288 32 288H48V256H32C14.33 256 0 241.7 0 224C0 206.3 14.33 192 32 192H48V160.4C48 89.47 105.5 32 176.4 32C190.2 32 203.9 34.22 216.1 38.59L298.1 65.64C314.9 71.23 323.9 89.35 318.4 106.1C312.8 122.9 294.6 131.9 277.9 126.4L196.7 99.3C190.2 97.12 183.3 96 176.4 96C140.8 96 112 124.8 112 160.4L111.1 191.1z\"]\n};\nvar faList = {\n  prefix: 'fas',\n  iconName: 'list',\n  icon: [512, 512, [\"list-squares\"], \"f03a\", \"M88 48C101.3 48 112 58.75 112 72V120C112 133.3 101.3 144 88 144H40C26.75 144 16 133.3 16 120V72C16 58.75 26.75 48 40 48H88zM480 64C497.7 64 512 78.33 512 96C512 113.7 497.7 128 480 128H192C174.3 128 160 113.7 160 96C160 78.33 174.3 64 192 64H480zM480 224C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H192C174.3 288 160 273.7 160 256C160 238.3 174.3 224 192 224H480zM480 384C497.7 384 512 398.3 512 416C512 433.7 497.7 448 480 448H192C174.3 448 160 433.7 160 416C160 398.3 174.3 384 192 384H480zM16 232C16 218.7 26.75 208 40 208H88C101.3 208 112 218.7 112 232V280C112 293.3 101.3 304 88 304H40C26.75 304 16 293.3 16 280V232zM88 368C101.3 368 112 378.7 112 392V440C112 453.3 101.3 464 88 464H40C26.75 464 16 453.3 16 440V392C16 378.7 26.75 368 40 368H88z\"]\n};\nvar faListSquares = faList;\nvar faListCheck = {\n  prefix: 'fas',\n  iconName: 'list-check',\n  icon: [512, 512, [\"tasks\"], \"f0ae\", \"M152.1 38.16C161.9 47.03 162.7 62.2 153.8 72.06L81.84 152.1C77.43 156.9 71.21 159.8 64.63 159.1C58.05 160.2 51.69 157.6 47.03 152.1L7.029 112.1C-2.343 103.6-2.343 88.4 7.029 79.03C16.4 69.66 31.6 69.66 40.97 79.03L63.08 101.1L118.2 39.94C127 30.09 142.2 29.29 152.1 38.16V38.16zM152.1 198.2C161.9 207 162.7 222.2 153.8 232.1L81.84 312.1C77.43 316.9 71.21 319.8 64.63 319.1C58.05 320.2 51.69 317.6 47.03 312.1L7.029 272.1C-2.343 263.6-2.343 248.4 7.029 239C16.4 229.7 31.6 229.7 40.97 239L63.08 261.1L118.2 199.9C127 190.1 142.2 189.3 152.1 198.2V198.2zM224 96C224 78.33 238.3 64 256 64H480C497.7 64 512 78.33 512 96C512 113.7 497.7 128 480 128H256C238.3 128 224 113.7 224 96V96zM224 256C224 238.3 238.3 224 256 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H256C238.3 288 224 273.7 224 256zM160 416C160 398.3 174.3 384 192 384H480C497.7 384 512 398.3 512 416C512 433.7 497.7 448 480 448H192C174.3 448 160 433.7 160 416zM0 416C0 389.5 21.49 368 48 368C74.51 368 96 389.5 96 416C96 442.5 74.51 464 48 464C21.49 464 0 442.5 0 416z\"]\n};\nvar faTasks = faListCheck;\nvar faListOl = {\n  prefix: 'fas',\n  iconName: 'list-ol',\n  icon: [576, 512, [\"list-1-2\", \"list-numeric\"], \"f0cb\", \"M55.1 56.04C55.1 42.78 66.74 32.04 79.1 32.04H111.1C125.3 32.04 135.1 42.78 135.1 56.04V176H151.1C165.3 176 175.1 186.8 175.1 200C175.1 213.3 165.3 224 151.1 224H71.1C58.74 224 47.1 213.3 47.1 200C47.1 186.8 58.74 176 71.1 176H87.1V80.04H79.1C66.74 80.04 55.1 69.29 55.1 56.04V56.04zM118.7 341.2C112.1 333.8 100.4 334.3 94.65 342.4L83.53 357.9C75.83 368.7 60.84 371.2 50.05 363.5C39.26 355.8 36.77 340.8 44.47 330.1L55.59 314.5C79.33 281.2 127.9 278.8 154.8 309.6C176.1 333.1 175.6 370.5 153.7 394.3L118.8 432H152C165.3 432 176 442.7 176 456C176 469.3 165.3 480 152 480H64C54.47 480 45.84 474.4 42.02 465.6C38.19 456.9 39.9 446.7 46.36 439.7L118.4 361.7C123.7 355.9 123.8 347.1 118.7 341.2L118.7 341.2zM512 64C529.7 64 544 78.33 544 96C544 113.7 529.7 128 512 128H256C238.3 128 224 113.7 224 96C224 78.33 238.3 64 256 64H512zM512 224C529.7 224 544 238.3 544 256C544 273.7 529.7 288 512 288H256C238.3 288 224 273.7 224 256C224 238.3 238.3 224 256 224H512zM512 384C529.7 384 544 398.3 544 416C544 433.7 529.7 448 512 448H256C238.3 448 224 433.7 224 416C224 398.3 238.3 384 256 384H512z\"]\n};\nvar faList12 = faListOl;\nvar faListNumeric = faListOl;\nvar faListUl = {\n  prefix: 'fas',\n  iconName: 'list-ul',\n  icon: [512, 512, [\"list-dots\"], \"f0ca\", \"M16 96C16 69.49 37.49 48 64 48C90.51 48 112 69.49 112 96C112 122.5 90.51 144 64 144C37.49 144 16 122.5 16 96zM480 64C497.7 64 512 78.33 512 96C512 113.7 497.7 128 480 128H192C174.3 128 160 113.7 160 96C160 78.33 174.3 64 192 64H480zM480 224C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H192C174.3 288 160 273.7 160 256C160 238.3 174.3 224 192 224H480zM480 384C497.7 384 512 398.3 512 416C512 433.7 497.7 448 480 448H192C174.3 448 160 433.7 160 416C160 398.3 174.3 384 192 384H480zM16 416C16 389.5 37.49 368 64 368C90.51 368 112 389.5 112 416C112 442.5 90.51 464 64 464C37.49 464 16 442.5 16 416zM112 256C112 282.5 90.51 304 64 304C37.49 304 16 282.5 16 256C16 229.5 37.49 208 64 208C90.51 208 112 229.5 112 256z\"]\n};\nvar faListDots = faListUl;\nvar faLitecoinSign = {\n  prefix: 'fas',\n  iconName: 'litecoin-sign',\n  icon: [384, 512, [], \"e1d3\", \"M128 195.3L247.2 161.2C264.2 156.4 281.9 166.2 286.8 183.2C291.6 200.2 281.8 217.9 264.8 222.8L128 261.9V416H352C369.7 416 384 430.3 384 448C384 465.7 369.7 480 352 480H96C78.33 480 64 465.7 64 448V280.1L40.79 286.8C23.8 291.6 6.087 281.8 1.232 264.8C-3.623 247.8 6.216 230.1 23.21 225.2L64 213.6V64C64 46.33 78.33 32 96 32C113.7 32 128 46.33 128 64V195.3z\"]\n};\nvar faLocationArrow = {\n  prefix: 'fas',\n  iconName: 'location-arrow',\n  icon: [448, 512, [], \"f124\", \"M285.6 444.1C279.8 458.3 264.8 466.3 249.8 463.4C234.8 460.4 223.1 447.3 223.1 432V256H47.1C32.71 256 19.55 245.2 16.6 230.2C13.65 215.2 21.73 200.2 35.88 194.4L387.9 50.38C399.8 45.5 413.5 48.26 422.6 57.37C431.7 66.49 434.5 80.19 429.6 92.12L285.6 444.1z\"]\n};\nvar faLocationCrosshairs = {\n  prefix: 'fas',\n  iconName: 'location-crosshairs',\n  icon: [512, 512, [\"location\"], \"f601\", \"M176 256C176 211.8 211.8 176 256 176C300.2 176 336 211.8 336 256C336 300.2 300.2 336 256 336C211.8 336 176 300.2 176 256zM256 0C273.7 0 288 14.33 288 32V66.65C368.4 80.14 431.9 143.6 445.3 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H445.3C431.9 368.4 368.4 431.9 288 445.3V480C288 497.7 273.7 512 256 512C238.3 512 224 497.7 224 480V445.3C143.6 431.9 80.14 368.4 66.65 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H66.65C80.14 143.6 143.6 80.14 224 66.65V32C224 14.33 238.3 0 256 0zM128 256C128 326.7 185.3 384 256 384C326.7 384 384 326.7 384 256C384 185.3 326.7 128 256 128C185.3 128 128 185.3 128 256z\"]\n};\nvar faLocation = faLocationCrosshairs;\nvar faLocationDot = {\n  prefix: 'fas',\n  iconName: 'location-dot',\n  icon: [384, 512, [\"map-marker-alt\"], \"f3c5\", \"M168.3 499.2C116.1 435 0 279.4 0 192C0 85.96 85.96 0 192 0C298 0 384 85.96 384 192C384 279.4 267 435 215.7 499.2C203.4 514.5 180.6 514.5 168.3 499.2H168.3zM192 256C227.3 256 256 227.3 256 192C256 156.7 227.3 128 192 128C156.7 128 128 156.7 128 192C128 227.3 156.7 256 192 256z\"]\n};\nvar faMapMarkerAlt = faLocationDot;\nvar faLocationPin = {\n  prefix: 'fas',\n  iconName: 'location-pin',\n  icon: [384, 512, [\"map-marker\"], \"f041\", \"M384 192C384 279.4 267 435 215.7 499.2C203.4 514.5 180.6 514.5 168.3 499.2C116.1 435 0 279.4 0 192C0 85.96 85.96 0 192 0C298 0 384 85.96 384 192H384z\"]\n};\nvar faMapMarker = faLocationPin;\nvar faLocationPinLock = {\n  prefix: 'fas',\n  iconName: 'location-pin-lock',\n  icon: [512, 512, [], \"e51f\", \"M168.3 499.2C116.1 435 0 279.4 0 192C0 85.96 85.96 0 192 0C287.7 0 366.1 69.96 381.6 161.5C328.5 170.3 288 216.4 288 272V296.6C268.9 307.6 256 328.3 256 352V446.8C240.7 467.4 226.7 485.4 215.7 499.2C203.4 514.5 180.6 514.5 168.3 499.2H168.3zM192 256C227.3 256 256 227.3 256 192C256 156.7 227.3 128 192 128C156.7 128 128 156.7 128 192C128 227.3 156.7 256 192 256zM400 192C444.2 192 480 227.8 480 272V320C497.7 320 512 334.3 512 352V480C512 497.7 497.7 512 480 512H320C302.3 512 288 497.7 288 480V352C288 334.3 302.3 320 320 320V272C320 227.8 355.8 192 400 192zM400 240C382.3 240 368 254.3 368 272V320H432V272C432 254.3 417.7 240 400 240z\"]\n};\nvar faLock = {\n  prefix: 'fas',\n  iconName: 'lock',\n  icon: [448, 512, [128274], \"f023\", \"M80 192V144C80 64.47 144.5 0 224 0C303.5 0 368 64.47 368 144V192H384C419.3 192 448 220.7 448 256V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V256C0 220.7 28.65 192 64 192H80zM144 192H304V144C304 99.82 268.2 64 224 64C179.8 64 144 99.82 144 144V192z\"]\n};\nvar faLockOpen = {\n  prefix: 'fas',\n  iconName: 'lock-open',\n  icon: [576, 512, [], \"f3c1\", \"M352 192H384C419.3 192 448 220.7 448 256V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V256C0 220.7 28.65 192 64 192H288V144C288 64.47 352.5 0 432 0C511.5 0 576 64.47 576 144V192C576 209.7 561.7 224 544 224C526.3 224 512 209.7 512 192V144C512 99.82 476.2 64 432 64C387.8 64 352 99.82 352 144V192z\"]\n};\nvar faLocust = {\n  prefix: 'fas',\n  iconName: 'locust',\n  icon: [576, 512, [], \"e520\", \"M328 32C464.1 32 576 143 576 280V320C576 320.1 576 320.2 576 320.3C575.8 364.3 540.1 400 496 400H483.6L508.8 444.1C515.4 455.6 511.4 470.3 499.9 476.8C488.4 483.4 473.7 479.4 467.2 467.9L428.4 400H347.1L299.7 469.7C292.2 480.6 277.2 483.3 266.3 475.7C255.4 468.2 252.7 453.2 260.3 442.3L289.6 400H215.1L163.3 470.2C155.5 480.9 140.4 483.2 129.8 475.3C119.1 467.5 116.8 452.4 124.7 441.8L165.2 386.7L122.2 370.4L42.84 470.9C34.62 481.3 19.53 483 9.13 474.8C-1.274 466.6-3.049 451.5 5.164 441.1L245.2 137.1C250.4 130.5 258.8 127.1 267.2 128.2C275.5 129.3 282.7 134.8 286.1 142.5L307.8 193.3L348.7 137.8C353.8 130.8 362.2 127.2 370.8 128.2C379.3 129.1 386.7 134.6 390.1 142.5L431.8 240H496C506.2 240 516 241.9 525 245.4C508.6 151.4 426.7 80 328 80H312C298.7 80 288 69.26 288 56C288 42.75 298.7 32 312 32L328 32zM332.1 240H379.6L362.5 199.1L332.1 240zM257.8 198.5L225.1 240H273.3L274.8 238.1L257.8 198.5zM496 336C504.8 336 512 328.8 512 320C512 311.2 504.8 304 496 304C487.2 304 480 311.2 480 320C480 328.8 487.2 336 496 336zM88.83 240H126.7L48.9 337.3C38.31 326.8 32 312.3 32 296.8C32 265.4 57.45 240 88.83 240V240z\"]\n};\nvar faLungs = {\n  prefix: 'fas',\n  iconName: 'lungs',\n  icon: [640, 512, [129729], \"f604\", \"M640 419.8c0 61.25-62.5 105.5-125.3 88.63l-59.53-15.88c-42.12-11.38-71.25-47.5-71.25-88.63L384 316.4l85.88 57.25c3.625 2.375 8.625 1.375 11-2.25l8.875-13.37c2.5-3.625 1.5-8.625-2.125-11L320 235.3l-167.6 111.8c-1.75 1.125-3 3-3.375 5c-.375 2.125 0 4.25 1.25 6l8.875 13.37c1.125 1.75 3 3 5 3.375c2.125 .375 4.25 0 6-1.125L256 316.4l.0313 87.5c0 41.13-29.12 77.25-71.25 88.63l-59.53 15.88C62.5 525.3 0 481 0 419.8c0-10 1.25-19.88 3.875-29.63C25.5 308.9 59.91 231 105.9 159.1c22.12-34.63 36.12-63.13 80.12-63.13C224.7 96 256 125.4 256 161.8v60.1l32.88-21.97C293.4 196.9 296 192 296 186.6V16C296 7.125 303.1 0 312 0h16c8.875 0 16 7.125 16 16v170.6c0 5.375 2.625 10.25 7.125 13.25L384 221.8v-60.1c0-36.38 31.34-65.75 69.97-65.75c43.1 0 58 28.5 80.13 63.13c46 71.88 80.41 149.8 102 231C638.8 399.9 640 409.8 640 419.8z\"]\n};\nvar faLungsVirus = {\n  prefix: 'fas',\n  iconName: 'lungs-virus',\n  icon: [640, 512, [], \"e067\", \"M195.5 444.5c-18.71-18.72-18.71-49.16 .0033-67.87l8.576-8.576H192c-26.47 0-48-21.53-48-48c0-26.47 21.53-48 48-48l12.12-.0055L195.5 263.4c-18.71-18.72-18.71-49.16 0-67.88C204.6 186.5 216.7 181.5 229.5 181.5c9.576 0 18.72 2.799 26.52 7.986l.04-27.75c0-36.38-31.42-65.72-70.05-65.72c-44 0-57.97 28.5-80.09 63.13c-46 71.88-80.39 149.8-102 231C1.257 399.9 0 409.8 0 419.8c0 61.25 62.5 105.5 125.3 88.62l59.5-15.9c21.74-5.867 39.91-18.39 52.51-34.73c-2.553 .4141-5.137 .7591-7.774 .7591C216.7 458.5 204.6 453.5 195.5 444.5zM343.1 150.7L344 16C344 7.125 336.9 0 328 0h-16c-8.875 0-16 7.125-16 16L295.1 150.7c7.088-4.133 15.22-6.675 23.1-6.675S336.9 146.5 343.1 150.7zM421.8 421.8c6.25-6.25 6.25-16.37 0-22.62l-8.576-8.576c-20.16-20.16-5.881-54.63 22.63-54.63H448c8.844 0 16-7.156 16-16c0-8.844-7.156-16-16-16h-12.12c-28.51 0-42.79-34.47-22.63-54.63l8.576-8.577c6.25-6.25 6.25-16.37 0-22.62s-16.38-6.25-22.62 0l-8.576 8.577C370.5 246.9 336 232.6 336 204.1v-12.12c0-8.844-7.156-15.1-16-15.1s-16 7.156-16 15.1v12.12c0 28.51-34.47 42.79-54.63 22.63L240.8 218.2c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.37 0 22.62l8.576 8.577c20.16 20.16 5.881 54.63-22.63 54.63H192c-8.844 0-16 7.156-16 16c0 8.844 7.156 16 16 16h12.12c28.51 0 42.79 34.47 22.63 54.63l-8.576 8.576c-6.25 6.25-6.25 16.37 0 22.62c3.125 3.125 7.219 4.688 11.31 4.688s8.188-1.562 11.31-4.688l8.576-8.575C269.5 393.1 304 407.4 304 435.9v12.12c0 8.844 7.156 16 16 16s16-7.156 16-16v-12.12c0-28.51 34.47-42.79 54.63-22.63l8.576 8.575c3.125 3.125 7.219 4.688 11.31 4.688S418.7 424.9 421.8 421.8zM288 303.1c-8.836 0-16-7.162-16-15.1S279.2 271.1 288 271.1S304 279.2 304 287.1S296.8 303.1 288 303.1zM352 367.1c-8.836 0-16-7.166-16-16s7.164-15.1 16-15.1s16 7.166 16 16S360.8 367.1 352 367.1zM636.1 390.1c-21.62-81.25-56.02-159.1-102-231c-22.12-34.63-36.09-63.13-80.09-63.13c-38.62 0-70.01 29.35-70.01 65.73v27.74c7.795-5.188 16.94-7.986 26.52-7.986c12.82 0 24.88 4.999 33.95 14.07c18.71 18.72 18.71 49.16 0 67.88l-8.576 8.571L448 272c26.47 0 48 21.54 48 48c0 26.47-21.53 48-48 48h-12.12l8.576 8.576c18.71 18.72 18.71 49.16-.0072 67.87c-9.066 9.066-21.12 14.06-33.94 14.06c-2.637 0-5.211-.3438-7.764-.7578c12.6 16.34 30.77 28.86 52.51 34.73l59.5 15.9C577.5 525.3 640 481 640 419.8C640 409.8 638.7 399.9 636.1 390.1z\"]\n};\nvar faM = {\n  prefix: 'fas',\n  iconName: 'm',\n  icon: [448, 512, [109], \"4d\", \"M448 64.01v384c0 17.67-14.31 32-32 32s-32-14.33-32-32V169.7l-133.4 200.1c-11.88 17.81-41.38 17.81-53.25 0L64 169.7v278.3c0 17.67-14.31 32-32 32s-32-14.33-32-32v-384c0-14.09 9.219-26.55 22.72-30.63c13.47-4.156 28.09 1.141 35.91 12.88L224 294.3l165.4-248.1c7.812-11.73 22.47-17.03 35.91-12.88C438.8 37.47 448 49.92 448 64.01z\"]\n};\nvar faMagnet = {\n  prefix: 'fas',\n  iconName: 'magnet',\n  icon: [448, 512, [129522], \"f076\", \"M128 160V256C128 309 170.1 352 224 352C277 352 320 309 320 256V160H448V256C448 379.7 347.7 480 224 480C100.3 480 0 379.7 0 256V160H128zM0 64C0 46.33 14.33 32 32 32H96C113.7 32 128 46.33 128 64V128H0V64zM320 64C320 46.33 334.3 32 352 32H416C433.7 32 448 46.33 448 64V128H320V64z\"]\n};\nvar faMagnifyingGlass = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass',\n  icon: [512, 512, [128269, \"search\"], \"f002\", \"M500.3 443.7l-119.7-119.7c27.22-40.41 40.65-90.9 33.46-144.7C401.8 87.79 326.8 13.32 235.2 1.723C99.01-15.51-15.51 99.01 1.724 235.2c11.6 91.64 86.08 166.7 177.6 178.9c53.8 7.189 104.3-6.236 144.7-33.46l119.7 119.7c15.62 15.62 40.95 15.62 56.57 0C515.9 484.7 515.9 459.3 500.3 443.7zM79.1 208c0-70.58 57.42-128 128-128s128 57.42 128 128c0 70.58-57.42 128-128 128S79.1 278.6 79.1 208z\"]\n};\nvar faSearch = faMagnifyingGlass;\nvar faMagnifyingGlassArrowRight = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass-arrow-right',\n  icon: [512, 512, [], \"e521\", \"M416 208C416 253.9 401.1 296.3 375.1 330.7L502.6 457.4C515.1 469.9 515.1 490.1 502.6 502.6C490.1 515.1 469.9 515.1 457.4 502.6L330.7 375.1C296.3 401.1 253.9 416 208 416C93.12 416 0 322.9 0 208C0 93.12 93.12 0 208 0C322.9 0 416 93.12 416 208zM240.1 119C231.6 109.7 216.4 109.7 207 119C197.7 128.4 197.7 143.6 207 152.1L238.1 184H120C106.7 184 96 194.7 96 208C96 221.3 106.7 232 120 232H238.1L207 263C197.7 272.4 197.7 287.6 207 296.1C216.4 306.3 231.6 306.3 240.1 296.1L312.1 224.1C322.3 215.6 322.3 200.4 312.1 191L240.1 119z\"]\n};\nvar faMagnifyingGlassChart = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass-chart',\n  icon: [512, 512, [], \"e522\", \"M416 208C416 253.9 401.1 296.3 375.1 330.7L502.6 457.4C515.1 469.9 515.1 490.1 502.6 502.6C490.1 515.1 469.9 515.1 457.4 502.6L330.7 375.1C296.3 401.1 253.9 416 208 416C93.12 416 0 322.9 0 208C0 93.12 93.12 0 208 0C322.9 0 416 93.12 416 208zM104 280C104 293.3 114.7 304 128 304C141.3 304 152 293.3 152 280V216C152 202.7 141.3 192 128 192C114.7 192 104 202.7 104 216V280zM184 280C184 293.3 194.7 304 208 304C221.3 304 232 293.3 232 280V120C232 106.7 221.3 96 208 96C194.7 96 184 106.7 184 120V280zM264 280C264 293.3 274.7 304 288 304C301.3 304 312 293.3 312 280V184C312 170.7 301.3 160 288 160C274.7 160 264 170.7 264 184V280z\"]\n};\nvar faMagnifyingGlassDollar = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass-dollar',\n  icon: [512, 512, [\"search-dollar\"], \"f688\", \"M500.3 443.7l-119.7-119.7c27.22-40.41 40.65-90.9 33.46-144.7c-12.23-91.55-87.28-166-178.9-177.6c-136.2-17.24-250.7 97.28-233.4 233.4c11.6 91.64 86.07 166.7 177.6 178.9c53.81 7.191 104.3-6.235 144.7-33.46l119.7 119.7c15.62 15.62 40.95 15.62 56.57 .0004C515.9 484.7 515.9 459.3 500.3 443.7zM273.7 253.8C269.8 276.4 252.6 291.3 228 296.1V304c0 11.03-8.953 20-20 20S188 315 188 304V295.2C178.2 293.2 168.4 289.9 159.6 286.8L154.8 285.1C144.4 281.4 138.9 269.9 142.6 259.5C146.2 249.1 157.6 243.7 168.1 247.3l5.062 1.812c8.562 3.094 18.25 6.562 25.91 7.719c16.23 2.5 33.47-.0313 35.17-9.812c1.219-7.094 .4062-10.62-31.8-19.84L196.2 225.4C177.8 219.1 134.5 207.3 142.3 162.2C146.2 139.6 163.5 124.8 188 120V112c0-11.03 8.953-20 20-20S228 100.1 228 112v8.695c6.252 1.273 13.06 3.07 21.47 5.992c10.42 3.625 15.95 15.03 12.33 25.47C258.2 162.6 246.8 168.1 236.3 164.5C228.2 161.7 221.8 159.9 216.8 159.2c-16.11-2.594-33.38 .0313-35.08 9.812c-1 5.812-1.719 10 25.7 18.03l6 1.719C238.9 196 281.5 208.2 273.7 253.8z\"]\n};\nvar faSearchDollar = faMagnifyingGlassDollar;\nvar faMagnifyingGlassLocation = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass-location',\n  icon: [512, 512, [\"search-location\"], \"f689\", \"M236 176c0 15.46-12.54 28-28 28S180 191.5 180 176S192.5 148 208 148S236 160.5 236 176zM500.3 500.3c-15.62 15.62-40.95 15.62-56.57 0l-119.7-119.7c-40.41 27.22-90.9 40.65-144.7 33.46c-91.55-12.23-166-87.28-177.6-178.9c-17.24-136.2 97.29-250.7 233.4-233.4c91.64 11.6 166.7 86.07 178.9 177.6c7.19 53.8-6.236 104.3-33.46 144.7l119.7 119.7C515.9 459.3 515.9 484.7 500.3 500.3zM294.1 182.2C294.1 134.5 255.6 96 207.1 96C160.4 96 121.9 134.5 121.9 182.2c0 38.35 56.29 108.5 77.87 134C201.8 318.5 204.7 320 207.1 320c3.207 0 6.26-1.459 8.303-3.791C237.8 290.7 294.1 220.5 294.1 182.2z\"]\n};\nvar faSearchLocation = faMagnifyingGlassLocation;\nvar faMagnifyingGlassMinus = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass-minus',\n  icon: [512, 512, [\"search-minus\"], \"f010\", \"M500.3 443.7l-119.7-119.7c27.22-40.41 40.65-90.9 33.46-144.7c-12.23-91.55-87.28-166-178.9-177.6c-136.2-17.24-250.7 97.28-233.4 233.4c11.6 91.64 86.07 166.7 177.6 178.9c53.81 7.191 104.3-6.235 144.7-33.46l119.7 119.7c15.62 15.62 40.95 15.62 56.57 .0003C515.9 484.7 515.9 459.3 500.3 443.7zM288 232H127.1C114.7 232 104 221.3 104 208s10.74-24 23.1-24h160C301.3 184 312 194.7 312 208S301.3 232 288 232z\"]\n};\nvar faSearchMinus = faMagnifyingGlassMinus;\nvar faMagnifyingGlassPlus = {\n  prefix: 'fas',\n  iconName: 'magnifying-glass-plus',\n  icon: [512, 512, [\"search-plus\"], \"f00e\", \"M500.3 443.7l-119.7-119.7c27.22-40.41 40.65-90.9 33.46-144.7c-12.23-91.55-87.28-166-178.9-177.6c-136.2-17.24-250.7 97.28-233.4 233.4c11.6 91.64 86.07 166.7 177.6 178.9c53.81 7.191 104.3-6.235 144.7-33.46l119.7 119.7c15.62 15.62 40.95 15.62 56.57 .0003C515.9 484.7 515.9 459.3 500.3 443.7zM288 232H231.1V288c0 13.26-10.74 24-23.1 24C194.7 312 184 301.3 184 288V232H127.1C114.7 232 104 221.3 104 208s10.74-24 23.1-24H184V128c0-13.26 10.74-24 23.1-24S231.1 114.7 231.1 128v56h56C301.3 184 312 194.7 312 208S301.3 232 288 232z\"]\n};\nvar faSearchPlus = faMagnifyingGlassPlus;\nvar faManatSign = {\n  prefix: 'fas',\n  iconName: 'manat-sign',\n  icon: [384, 512, [], \"e1d5\", \"M224 64V98.65C314.8 113.9 384 192.9 384 288V448C384 465.7 369.7 480 352 480C334.3 480 320 465.7 320 448V288C320 228.4 279.2 178.2 224 164V448C224 465.7 209.7 480 192 480C174.3 480 160 465.7 160 448V164C104.8 178.2 64 228.4 64 288V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448V288C0 192.9 69.19 113.9 160 98.65V64C160 46.33 174.3 32 192 32C209.7 32 224 46.33 224 64z\"]\n};\nvar faMap = {\n  prefix: 'fas',\n  iconName: 'map',\n  icon: [576, 512, [62072, 128506], \"f279\", \"M384 476.1L192 421.2V35.93L384 90.79V476.1zM416 88.37L543.1 37.53C558.9 31.23 576 42.84 576 59.82V394.6C576 404.4 570 413.2 560.9 416.9L416 474.8V88.37zM15.09 95.13L160 37.17V423.6L32.91 474.5C17.15 480.8 0 469.2 0 452.2V117.4C0 107.6 5.975 98.78 15.09 95.13V95.13z\"]\n};\nvar faMapLocation = {\n  prefix: 'fas',\n  iconName: 'map-location',\n  icon: [576, 512, [\"map-marked\"], \"f59f\", \"M273.2 311.1C241.1 271.9 167.1 174.6 167.1 120C167.1 53.73 221.7 0 287.1 0C354.3 0 408 53.73 408 120C408 174.6 334.9 271.9 302.8 311.1C295.1 321.6 280.9 321.6 273.2 311.1V311.1zM416 503V200.4C419.5 193.5 422.7 186.7 425.6 179.8C426.1 178.6 426.6 177.4 427.1 176.1L543.1 129.7C558.9 123.4 576 135 576 152V422.8C576 432.6 570 441.4 560.9 445.1L416 503zM15.09 187.3L137.6 138.3C140 152.5 144.9 166.6 150.4 179.8C153.3 186.7 156.5 193.5 160 200.4V451.8L32.91 502.7C17.15 508.1 0 497.4 0 480.4V209.6C0 199.8 5.975 190.1 15.09 187.3H15.09zM384 504.3L191.1 449.4V255C212.5 286.3 234.3 314.6 248.2 331.1C268.7 357.6 307.3 357.6 327.8 331.1C341.7 314.6 363.5 286.3 384 255L384 504.3z\"]\n};\nvar faMapMarked = faMapLocation;\nvar faMapLocationDot = {\n  prefix: 'fas',\n  iconName: 'map-location-dot',\n  icon: [576, 512, [\"map-marked-alt\"], \"f5a0\", \"M408 120C408 174.6 334.9 271.9 302.8 311.1C295.1 321.6 280.9 321.6 273.2 311.1C241.1 271.9 168 174.6 168 120C168 53.73 221.7 0 288 0C354.3 0 408 53.73 408 120zM288 152C310.1 152 328 134.1 328 112C328 89.91 310.1 72 288 72C265.9 72 248 89.91 248 112C248 134.1 265.9 152 288 152zM425.6 179.8C426.1 178.6 426.6 177.4 427.1 176.1L543.1 129.7C558.9 123.4 576 135 576 152V422.8C576 432.6 570 441.4 560.9 445.1L416 503V200.4C419.5 193.5 422.7 186.7 425.6 179.8zM150.4 179.8C153.3 186.7 156.5 193.5 160 200.4V451.8L32.91 502.7C17.15 508.1 0 497.4 0 480.4V209.6C0 199.8 5.975 190.1 15.09 187.3L137.6 138.3C140 152.5 144.9 166.6 150.4 179.8H150.4zM327.8 331.1C341.7 314.6 363.5 286.3 384 255V504.3L192 449.4V255C212.5 286.3 234.3 314.6 248.2 331.1C268.7 357.6 307.3 357.6 327.8 331.1L327.8 331.1z\"]\n};\nvar faMapMarkedAlt = faMapLocationDot;\nvar faMapPin = {\n  prefix: 'fas',\n  iconName: 'map-pin',\n  icon: [320, 512, [128205], \"f276\", \"M320 144C320 223.5 255.5 288 176 288C96.47 288 32 223.5 32 144C32 64.47 96.47 0 176 0C255.5 0 320 64.47 320 144zM192 64C192 55.16 184.8 48 176 48C122.1 48 80 90.98 80 144C80 152.8 87.16 160 96 160C104.8 160 112 152.8 112 144C112 108.7 140.7 80 176 80C184.8 80 192 72.84 192 64zM144 480V317.1C154.4 319 165.1 319.1 176 319.1C186.9 319.1 197.6 319 208 317.1V480C208 497.7 193.7 512 176 512C158.3 512 144 497.7 144 480z\"]\n};\nvar faMarker = {\n  prefix: 'fas',\n  iconName: 'marker',\n  icon: [512, 512, [], \"f5a1\", \"M480.1 160.1L316.3 325.7L186.3 195.7L302.1 80L288.1 66.91C279.6 57.54 264.4 57.54 255 66.91L168.1 152.1C159.6 162.3 144.4 162.3 135 152.1C125.7 143.6 125.7 128.4 135 119L221.1 32.97C249.2 4.853 294.8 4.853 322.9 32.97L336 46.06L351 31.03C386.9-4.849 445.1-4.849 480.1 31.03C516.9 66.91 516.9 125.1 480.1 160.1V160.1zM229.5 412.5C181.5 460.5 120.3 493.2 53.7 506.5L28.71 511.5C20.84 513.1 12.7 510.6 7.03 504.1C1.356 499.3-1.107 491.2 .4662 483.3L5.465 458.3C18.78 391.7 51.52 330.5 99.54 282.5L163.7 218.3L293.7 348.3L229.5 412.5z\"]\n};\nvar faMars = {\n  prefix: 'fas',\n  iconName: 'mars',\n  icon: [448, 512, [9794], \"f222\", \"M431.1 31.1l-112.6 0c-21.42 0-32.15 25.85-17 40.97l29.61 29.56l-56.65 56.55c-30.03-20.66-65.04-31-100-31c-47.99-.002-95.96 19.44-131.1 58.39c-60.86 67.51-58.65 175 4.748 240.1C83.66 462.2 129.6 480 175.5 480c45.12 0 90.34-17.18 124.8-51.55c61.11-60.99 67.77-155.6 20.42-224.1l56.65-56.55l29.61 29.56C411.9 182.2 417.9 184.4 423.8 184.4C436.1 184.4 448 174.8 448 160.4V47.1C448 39.16 440.8 31.1 431.1 31.1zM243.5 371.9c-18.75 18.71-43.38 28.07-68 28.07c-24.63 0-49.25-9.355-68.01-28.07c-37.5-37.43-37.5-98.33 0-135.8c18.75-18.71 43.38-28.07 68.01-28.07c24.63 0 49.25 9.357 68 28.07C281 273.5 281 334.5 243.5 371.9z\"]\n};\nvar faMarsAndVenus = {\n  prefix: 'fas',\n  iconName: 'mars-and-venus',\n  icon: [512, 512, [9893], \"f224\", \"M480 .0002l-112.4 .0001c-21.38 0-32.09 25.85-16.97 40.97l29.56 29.56l-27.11 27.11C326.1 76.85 292.7 64 256 64c-88.37 0-160 71.63-160 160c0 77.4 54.97 141.9 128 156.8v19.22H192c-8.836 0-16 7.162-16 16v31.1c0 8.836 7.164 16 16 16l32 .0001v32c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16v-32l32-.0001c8.838 0 16-7.164 16-16v-31.1c0-8.838-7.162-16-16-16h-32v-19.22c73.03-14.83 128-79.37 128-156.8c0-28.38-8.018-54.65-20.98-77.77l30.45-30.45l29.56 29.56C470.1 160.5 496 149.8 496 128.4V16C496 7.164 488.8 .0002 480 .0002zM256 304c-44.11 0-80-35.89-80-80c0-44.11 35.89-80 80-80c44.11 0 80 35.89 80 80C336 268.1 300.1 304 256 304z\"]\n};\nvar faMarsAndVenusBurst = {\n  prefix: 'fas',\n  iconName: 'mars-and-venus-burst',\n  icon: [640, 512, [], \"e523\", \"M607.1 0C625.7 0 639.1 14.33 639.1 32V120C639.1 137.7 625.7 152 607.1 152C590.3 152 575.1 137.7 575.1 120V109.3L539.6 145.7C552.6 168.8 559.1 195.6 559.1 224C559.1 301.4 505 365.1 431.1 380.8V400H447.1C465.7 400 479.1 414.3 479.1 432C479.1 449.7 465.7 464 447.1 464H431.1V480C431.1 497.7 417.7 512 399.1 512C382.3 512 367.1 497.7 367.1 480V464H351.1C334.3 464 319.1 449.7 319.1 432C319.1 414.3 334.3 400 351.1 400H367.1V380.8C294.1 365.1 239.1 301.4 239.1 224C239.1 135.6 311.6 64 399.1 64C436.7 64 470.6 76.37 497.6 97.18L530.7 64H511.1C494.3 64 479.1 49.67 479.1 32C479.1 14.33 494.3 0 511.1 0L607.1 0zM399.1 128C346.1 128 303.1 170.1 303.1 224C303.1 277 346.1 320 399.1 320C453 320 495.1 277 495.1 224C495.1 170.1 453 128 399.1 128zM220.3 92.05L280.4 73.81C236.3 108.1 207.1 163.2 207.1 224C207.1 269.2 223.6 310.8 249.8 343.6C244.5 345 238.7 343.7 234.6 339.9L175.1 286.1L117.4 339.9C112.6 344.4 105.5 345.4 99.63 342.6C93.73 339.7 90.15 333.6 90.62 327L96.21 247.6L17.55 235.4C11.08 234.4 5.868 229.6 4.41 223.2C2.951 216.8 5.538 210.1 10.94 206.4L76.5 161.3L37.01 92.18C33.76 86.49 34.31 79.39 38.39 74.27C42.48 69.14 49.28 67.03 55.55 68.93L131.7 92.05L161.1 18.09C163.6 11.1 169.4 7.1 175.1 7.1C182.6 7.1 188.4 11.1 190.9 18.09L220.3 92.05z\"]\n};\nvar faMarsDouble = {\n  prefix: 'fas',\n  iconName: 'mars-double',\n  icon: [640, 512, [9891], \"f227\", \"M320.7 204.3l56.65-56.55l29.61 29.56C422.1 192.5 448 181.7 448 160.4V47.1c0-8.838-7.176-15.1-16.03-15.1H319.4c-21.42 0-32.15 25.85-17 40.97l29.61 29.56L275.4 159.1c-71.21-48.99-170.4-39.96-231.1 27.39c-60.86 67.51-58.65 175 4.748 240.1c68.7 70.57 181.8 71.19 251.3 1.847C361.4 367.5 368 272.9 320.7 204.3zM243.5 371.9c-37.5 37.43-98.51 37.43-136 0s-37.5-98.33 0-135.8c37.5-37.43 98.51-37.43 136 0C281 273.5 281 334.5 243.5 371.9zM623.1 32h-112.6c-21.42 0-32.15 25.85-17 40.97l29.61 29.56L480 146.5v13.91C480 191.3 454.8 216.4 423.8 216.4C421.2 216.4 418.6 216 416 215.6v5.862c6.922 4.049 13.58 8.691 19.51 14.61c37.5 37.43 37.5 98.33 0 135.8c-18.75 18.71-43.38 28.07-68 28.07c-2.277 0-4.523-.4883-6.795-.6484c-9.641 18.69-22.1 36.24-37.64 51.77c-6.059 6.059-12.49 11.53-19.13 16.73C324.4 475.7 345.9 480 367.5 480c45.12 0 90.34-17.18 124.8-51.55c61.11-60.99 67.77-155.6 20.42-224.1l56.65-56.55l29.61 29.56c4.898 4.889 10.92 7.075 16.83 7.075C628.1 184.4 640 174.8 640 160.4V48C640 39.16 632.8 32 623.1 32z\"]\n};\nvar faMarsStroke = {\n  prefix: 'fas',\n  iconName: 'mars-stroke',\n  icon: [512, 512, [9894], \"f229\", \"M496 .0002l-112.4 .0001c-21.38 0-32.09 25.85-16.97 40.97l29.56 29.56l-24.33 24.34l-33.94-33.94c-6.248-6.25-16.38-6.248-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l33.94 33.94l-18.96 18.96C239.1 111.8 144.5 118.6 83.55 179.5c-68.73 68.73-68.73 180.2 0 248.9c68.73 68.73 180.2 68.73 248.9 0c60.99-60.99 67.73-155.6 20.47-224.1l18.96-18.96l33.94 33.94c6.248 6.248 16.38 6.25 22.63 0l22.63-22.63c6.248-6.248 6.248-16.38 0-22.63l-33.94-33.94l24.34-24.33l29.56 29.56C486.1 160.5 512 149.8 512 128.4v-112.4C512 7.162 504.8 .0002 496 .0002zM275.9 371.9c-37.43 37.43-98.33 37.43-135.8 0c-37.43-37.43-37.43-98.33 0-135.8c37.43-37.43 98.33-37.43 135.8 0C313.3 273.5 313.3 334.5 275.9 371.9z\"]\n};\nvar faMarsStrokeRight = {\n  prefix: 'fas',\n  iconName: 'mars-stroke-right',\n  icon: [640, 512, [9897, \"mars-stroke-h\"], \"f22b\", \"M619.3 244.7l-82.34-77.61c-15.12-15.12-40.97-4.41-40.97 16.97V223.1L463.1 224V176c.002-8.838-7.162-16-15.1-16h-32c-8.84 0-16 7.16-16 16V224h-19.05c-15.07-81.9-86.7-144-172.1-144C110.8 80 32 158.8 32 256c0 97.2 78.8 176 176 176c86.26 0 157.9-62.1 172.1-144h19.05V336c0 8.836 7.162 16 16 16h32c8.836 0 15.1-7.164 15.1-16V287.1L496 288v39.95c0 21.38 25.85 32.09 40.97 16.97l82.34-77.61C625.6 261.1 625.6 250.9 619.3 244.7zM208 352c-52.94 0-96-43.07-96-96c-.002-52.94 43.06-96 96-96c52.93 0 95.1 43.06 95.1 96C304 308.9 260.9 352 208 352z\"]\n};\nvar faMarsStrokeH = faMarsStrokeRight;\nvar faMarsStrokeUp = {\n  prefix: 'fas',\n  iconName: 'mars-stroke-up',\n  icon: [384, 512, [9896, \"mars-stroke-v\"], \"f22a\", \"M224 163V144h24c4.418 0 8-3.578 8-7.1V120c0-4.418-3.582-7.1-8-7.1H224V96h24.63c16.41 0 24.62-19.84 13.02-31.44l-60.97-60.97c-4.795-4.793-12.57-4.793-17.36 0L122.3 64.56c-11.6 11.6-3.383 31.44 13.02 31.44H160v15.1H136c-4.418 0-8 3.582-8 7.1v15.1c0 4.422 3.582 7.1 8 7.1H160v19.05c-84.9 15.62-148.5 92.01-143.7 182.5c4.783 90.69 82.34 165.1 173.2 166.5C287.8 513.4 368 434.1 368 336C368 249.7 305.9 178.1 224 163zM192 431.1c-52.94 0-96-43.06-96-95.1s43.06-95.1 96-95.1c52.93 0 96 43.06 96 95.1S244.9 431.1 192 431.1z\"]\n};\nvar faMarsStrokeV = faMarsStrokeUp;\nvar faMartiniGlass = {\n  prefix: 'fas',\n  iconName: 'martini-glass',\n  icon: [512, 512, [127864, \"glass-martini-alt\"], \"f57b\", \"M502 57.63C523.3 36.38 508.3 0 478.3 0H33.72C3.711 0-11.29 36.38 9.962 57.63l214 214V448H175.1c-26.51 0-47.1 21.49-47.1 48c0 8.836 7.164 16 16 16h224c8.836 0 16-7.164 16-16c0-26.51-21.49-48-48-48h-47.1V271.6L502 57.63zM405.1 64l-64.01 64H170.9L106.9 64H405.1z\"]\n};\nvar faGlassMartiniAlt = faMartiniGlass;\nvar faMartiniGlassCitrus = {\n  prefix: 'fas',\n  iconName: 'martini-glass-citrus',\n  icon: [576, 512, [\"cocktail\"], \"f561\", \"M288 464H240v-125.3l168.8-168.7C424.3 154.5 413.3 128 391.4 128H24.63C2.751 128-8.249 154.5 7.251 170l168.7 168.7V464H128c-17.67 0-32 14.33-32 32c0 8.836 7.164 16 15.1 16h191.1c8.836 0 15.1-7.164 15.1-16C320 478.3 305.7 464 288 464zM432 0c-62.63 0-115.4 40.25-135.1 96h52.5c16.62-28.5 47.25-48 82.62-48c52.88 0 95.1 43 95.1 96s-43.12 96-95.1 96c-14 0-27.25-3.25-39.37-8.625l-35.25 35.25c21.88 13.25 47.25 21.38 74.62 21.38c79.5 0 143.1-64.5 143.1-144S511.5 0 432 0z\"]\n};\nvar faCocktail = faMartiniGlassCitrus;\nvar faMartiniGlassEmpty = {\n  prefix: 'fas',\n  iconName: 'martini-glass-empty',\n  icon: [512, 512, [\"glass-martini\"], \"f000\", \"M502 57.63C523.3 36.38 508.3 0 478.3 0H33.72C3.711 0-11.29 36.38 9.962 57.63l214 214V448H176c-26.51 0-48 21.49-48 48c0 8.836 7.164 16 16 16h224c8.836 0 16-7.164 16-16c0-26.51-21.49-48-47.1-48h-47.1V271.6L502 57.63zM256 213.1L106.9 64h298.3L256 213.1z\"]\n};\nvar faGlassMartini = faMartiniGlassEmpty;\nvar faMask = {\n  prefix: 'fas',\n  iconName: 'mask',\n  icon: [576, 512, [], \"f6fa\", \"M288 64C39.52 64 0 182.1 0 273.5C0 379.5 78.8 448 176 448c27.33 0 51.21-6.516 66.11-36.79l19.93-40.5C268.3 358.6 278.1 352.4 288 352.1c9.9 .3711 19.7 6.501 25.97 18.63l19.93 40.5C348.8 441.5 372.7 448 400 448c97.2 0 176-68.51 176-174.5C576 182.1 536.5 64 288 64zM160 320c-35.35 0-64-28.65-64-64s28.65-64 64-64c35.35 0 64 28.65 64 64S195.3 320 160 320zM416 320c-35.35 0-64-28.65-64-64s28.65-64 64-64c35.35 0 64 28.65 64 64S451.3 320 416 320z\"]\n};\nvar faMaskFace = {\n  prefix: 'fas',\n  iconName: 'mask-face',\n  icon: [640, 512, [], \"e1d7\", \"M396.4 87.12L433.5 111.9C449.3 122.4 467.8 128 486.8 128H584C614.9 128 640 153.1 640 184V269C640 324.1 602.5 372.1 549.1 385.5L441.1 412.5C406.2 434.1 364.6 448 320 448C275.4 448 233.8 434.1 198.9 412.5L90.9 385.5C37.48 372.1 0 324.1 0 269V184C0 153.1 25.07 128 56 128H153.2C172.2 128 190.7 122.4 206.5 111.9L243.6 87.12C266.2 72.05 292.8 64 320 64C347.2 64 373.8 72.05 396.4 87.12zM132.3 346.3C109.4 311.2 96 269.1 96 224V176H56C51.58 176 48 179.6 48 184V269C48 302.1 70.49 330.9 102.5 338.9L132.3 346.3zM592 269V184C592 179.6 588.4 176 584 176H544V224C544 269.1 530.6 311.2 507.7 346.3L537.5 338.9C569.5 330.9 592 302.1 592 269H592zM208 224H432C440.8 224 448 216.8 448 208C448 199.2 440.8 192 432 192H208C199.2 192 192 199.2 192 208C192 216.8 199.2 224 208 224zM208 256C199.2 256 192 263.2 192 272C192 280.8 199.2 288 208 288H432C440.8 288 448 280.8 448 272C448 263.2 440.8 256 432 256H208zM240 352H400C408.8 352 416 344.8 416 336C416 327.2 408.8 320 400 320H240C231.2 320 224 327.2 224 336C224 344.8 231.2 352 240 352z\"]\n};\nvar faMaskVentilator = {\n  prefix: 'fas',\n  iconName: 'mask-ventilator',\n  icon: [640, 512, [], \"e524\", \"M320 32C372.1 32 419.7 73.8 454.5 128H584C614.9 128 640 153.1 640 184V269C640 324.1 602.5 372.1 549.1 385.5L477.5 403.4C454.6 433.8 421.1 457.2 384 469.8V393.2C403.6 376.8 416 353.1 416 326.4C416 276.9 372.5 191.1 320 191.1C267 191.1 224 276.9 224 326.4C224 353 236.3 376.9 256 393.3V469.9C217.6 457.4 184.9 433.8 162.2 403.3L90.9 385.5C37.48 372.1 0 324.1 0 269V184C0 153.1 25.07 128 56 128H185.1C219.8 73.8 267.4 32 320 32V32zM56 176C51.58 176 48 179.6 48 184V269C48 302.1 70.49 330.9 102.5 338.9L134.3 346.8C130.2 332.2 127.1 316.7 127.1 300.8C127.1 264.7 139.4 219.2 159.1 176H56zM480.7 176C500.4 219.2 512 264.7 512 300.8C512 316.8 509.8 332.2 505.6 346.9L537.5 338.9C569.5 330.9 592 302.1 592 269V184C592 179.6 588.4 176 584 176H480.7zM288 320C288 302.3 302.3 288 320 288C337.7 288 352 302.3 352 320V512H288V320z\"]\n};\nvar faMasksTheater = {\n  prefix: 'fas',\n  iconName: 'masks-theater',\n  icon: [640, 512, [127917, \"theater-masks\"], \"f630\", \"M206.9 245.1C171 255.6 146.8 286.4 149.3 319.3C160.7 306.5 178.1 295.5 199.3 288.4L206.9 245.1zM95.78 294.9L64.11 115.5C63.74 113.9 64.37 112.9 64.37 112.9c57.75-32.13 123.1-48.99 189-48.99c1.625 0 3.113 .0745 4.738 .0745c13.1-13.5 31.75-22.75 51.62-26c18.87-3 38.12-4.5 57.25-5.25c-9.999-14-24.47-24.27-41.84-27.02c-23.87-3.875-47.9-5.732-71.77-5.732c-76.74 0-152.4 19.45-220.1 57.07C9.021 70.57-3.853 98.5 1.021 126.6L32.77 306c14.25 80.5 136.3 142 204.5 142c3.625 0 6.777-.2979 10.03-.6729c-13.5-17.13-28.1-40.5-39.5-67.63C160.1 366.8 101.7 328 95.78 294.9zM193.4 157.6C192.6 153.4 191.1 149.7 189.3 146.2c-8.249 8.875-20.62 15.75-35.25 18.37c-14.62 2.5-28.75 .376-39.5-5.249c-.5 4-.6249 7.998 .125 12.12c3.75 21.75 24.5 36.24 46.25 32.37C182.6 200.1 197.3 179.3 193.4 157.6zM606.8 121c-88.87-49.38-191.4-67.38-291.9-51.38C287.5 73.1 265.8 95.85 260.8 123.1L229 303.5c-15.37 87.13 95.33 196.3 158.3 207.3c62.1 11.13 204.5-53.68 219.9-140.8l31.75-179.5C643.9 162.3 631 134.4 606.8 121zM333.5 217.8c3.875-21.75 24.62-36.25 46.37-32.37c21.75 3.75 36.25 24.49 32.5 46.12c-.7499 4.125-2.25 7.873-4.125 11.5c-8.249-9-20.62-15.75-35.25-18.37c-14.75-2.625-28.75-.3759-39.5 5.124C332.1 225.9 332.9 221.9 333.5 217.8zM403.1 416.5c-55.62-9.875-93.49-59.23-88.99-112.1c20.62 25.63 56.25 46.24 99.49 53.87c43.25 7.625 83.74 .3781 111.9-16.62C512.2 392.7 459.7 426.3 403.1 416.5zM534.4 265.2c-8.249-8.875-20.75-15.75-35.37-18.37c-14.62-2.5-28.62-.3759-39.5 5.249c-.5-4-.625-7.998 .125-12.12c3.875-21.75 24.62-36.25 46.37-32.37c21.75 3.875 36.25 24.49 32.37 46.24C537.6 257.9 536.1 261.7 534.4 265.2z\"]\n};\nvar faTheaterMasks = faMasksTheater;\nvar faMattressPillow = {\n  prefix: 'fas',\n  iconName: 'mattress-pillow',\n  icon: [640, 512, [], \"e525\", \"M256 448H64C28.65 448 0 419.3 0 384V128C0 92.65 28.65 64 64 64H256V448zM64 352C64 369.7 78.33 384 96 384H160C177.7 384 192 369.7 192 352V160C192 142.3 177.7 128 160 128H96C78.33 128 64 142.3 64 160V352zM288 64H576C611.3 64 640 92.65 640 128V384C640 419.3 611.3 448 576 448H288V64z\"]\n};\nvar faMaximize = {\n  prefix: 'fas',\n  iconName: 'maximize',\n  icon: [448, 512, [\"expand-arrows-alt\"], \"f31e\", \"M447.1 319.1v135.1c0 13.26-10.75 23.1-23.1 23.1h-135.1c-12.94 0-24.61-7.781-29.56-19.75c-4.906-11.1-2.203-25.72 6.937-34.87l30.06-30.06L224 323.9l-71.43 71.44l30.06 30.06c9.156 9.156 11.91 22.91 6.937 34.87C184.6 472.2 172.9 479.1 160 479.1H24c-13.25 0-23.1-10.74-23.1-23.1v-135.1c0-12.94 7.781-24.61 19.75-29.56C23.72 288.8 27.88 288 32 288c8.312 0 16.5 3.242 22.63 9.367l30.06 30.06l71.44-71.44L84.69 184.6L54.63 214.6c-9.156 9.156-22.91 11.91-34.87 6.937C7.798 216.6 .0013 204.9 .0013 191.1v-135.1c0-13.26 10.75-23.1 23.1-23.1h135.1c12.94 0 24.61 7.781 29.56 19.75C191.2 55.72 191.1 59.87 191.1 63.1c0 8.312-3.237 16.5-9.362 22.63L152.6 116.7l71.44 71.44l71.43-71.44l-30.06-30.06c-9.156-9.156-11.91-22.91-6.937-34.87c4.937-11.95 16.62-19.75 29.56-19.75h135.1c13.26 0 23.1 10.75 23.1 23.1v135.1c0 12.94-7.781 24.61-19.75 29.56c-11.1 4.906-25.72 2.203-34.87-6.937l-30.06-30.06l-71.43 71.43l71.44 71.44l30.06-30.06c9.156-9.156 22.91-11.91 34.87-6.937C440.2 295.4 447.1 307.1 447.1 319.1z\"]\n};\nvar faExpandArrowsAlt = faMaximize;\nvar faMedal = {\n  prefix: 'fas',\n  iconName: 'medal',\n  icon: [512, 512, [127941], \"f5a2\", \"M223.7 130.8L149.1 7.77C147.1 2.949 141.9 0 136.3 0H16.03c-12.95 0-20.53 14.58-13.1 25.18l111.3 158.9C143.9 156.4 181.7 137.3 223.7 130.8zM256 160c-97.25 0-176 78.75-176 176S158.8 512 256 512s176-78.75 176-176S353.3 160 256 160zM348.5 317.3l-37.88 37l8.875 52.25c1.625 9.25-8.25 16.5-16.63 12l-46.88-24.62L209.1 418.5c-8.375 4.5-18.25-2.75-16.63-12l8.875-52.25l-37.88-37C156.6 310.6 160.5 299 169.9 297.6l52.38-7.625L245.7 242.5c2-4.25 6.125-6.375 10.25-6.375S264.2 238.3 266.2 242.5l23.5 47.5l52.38 7.625C351.6 299 355.4 310.6 348.5 317.3zM495.1 0H375.7c-5.621 0-10.83 2.949-13.72 7.77l-73.76 122.1c42 6.5 79.88 25.62 109.5 53.38l111.3-158.9C516.5 14.58 508.9 0 495.1 0z\"]\n};\nvar faMemory = {\n  prefix: 'fas',\n  iconName: 'memory',\n  icon: [576, 512, [], \"f538\", \"M0 448h80v-32c0-8.838 7.164-16 16-16c8.838 0 16 7.162 16 16v32h96v-32c0-8.838 7.164-16 16-16c8.838 0 16 7.162 16 16v32h96v-32c0-8.838 7.164-16 16-16c8.838 0 16 7.162 16 16v32h96v-32c0-8.838 7.164-16 16-16c8.838 0 16 7.162 16 16v32H576v-96H0V448zM576 146.9V112C576 85.49 554.5 64 528 64h-480C21.49 64 0 85.49 0 112v34.94C18.6 153.5 32 171.1 32 192S18.6 230.5 0 237.1V320h576V237.1C557.4 230.5 544 212.9 544 192S557.4 153.5 576 146.9zM192 240C192 248.8 184.8 256 176 256h-32C135.2 256 128 248.8 128 240v-96C128 135.2 135.2 128 144 128h32C184.8 128 192 135.2 192 144V240zM320 240C320 248.8 312.8 256 304 256h-32C263.2 256 256 248.8 256 240v-96C256 135.2 263.2 128 272 128h32C312.8 128 320 135.2 320 144V240zM448 240C448 248.8 440.8 256 432 256h-32C391.2 256 384 248.8 384 240v-96C384 135.2 391.2 128 400 128h32C440.8 128 448 135.2 448 144V240z\"]\n};\nvar faMenorah = {\n  prefix: 'fas',\n  iconName: 'menorah',\n  icon: [640, 512, [], \"f676\", \"M544 144C544 135.1 536.9 128 528 128h-32C487.1 128 480 135.1 480 144V288h64V144zM416 95.1c17.62 0 32-14.38 32-32s-32-63.1-32-63.1s-32 46.37-32 63.1S398.4 95.1 416 95.1zM448 144C448 135.1 440.9 128 432 128h-32C391.1 128 384 135.1 384 144V288h64V144zM608 95.1c17.62 0 32-14.38 32-32s-32-63.1-32-63.1s-32 46.37-32 63.1S590.4 95.1 608 95.1zM320 95.1c17.62 0 32-14.38 32-32s-32-63.1-32-63.1S288 46.37 288 63.1S302.4 95.1 320 95.1zM512 95.1c17.62 0 32-14.38 32-32s-32-63.1-32-63.1s-32 46.37-32 63.1S494.4 95.1 512 95.1zM624 128h-32C583.2 128 576 135.2 576 144V288c0 17.6-14.4 32-32 32h-192V144C352 135.2 344.8 128 336 128h-32C295.2 128 288 135.2 288 144V320H96c-17.6 0-32-14.4-32-32V144C64 135.2 56.84 128 48 128h-32C7.164 128 0 135.2 0 144V288c0 53.02 42.98 96 96 96h192v64H176C149.5 448 128 469.5 128 496C128 504.8 135.2 512 144 512h352c8.836 0 16-7.164 16-16c0-26.51-21.49-48-48-48H352v-64h192c53.02 0 96-42.98 96-96V144C640 135.2 632.8 128 624 128zM160 144C160 135.1 152.9 128 144 128h-32C103.1 128 96 135.1 96 144V288h64V144zM224 95.1c17.62 0 32-14.38 32-32S224 0 224 0S192 46.37 192 63.1S206.4 95.1 224 95.1zM32 95.1c17.62 0 32-14.38 32-32S32 0 32 0S0 46.37 0 63.1S14.38 95.1 32 95.1zM128 95.1c17.62 0 32-14.38 32-32S128 0 128 0S96 46.37 96 63.1S110.4 95.1 128 95.1zM256 144C256 135.1 248.9 128 240 128h-32C199.1 128 192 135.1 192 144V288h64V144z\"]\n};\nvar faMercury = {\n  prefix: 'fas',\n  iconName: 'mercury',\n  icon: [384, 512, [9791], \"f223\", \"M368 223.1c0-55.32-25.57-104.6-65.49-136.9c20.49-17.32 37.2-39.11 48.1-64.21c4.656-10.72-2.9-22.89-14.45-22.89h-54.31c-5.256 0-9.93 2.828-12.96 7.188C251.8 31.77 223.8 47.1 192 47.1c-31.85 0-59.78-16.23-76.88-40.81C112.1 2.828 107.4 0 102.2 0H47.84c-11.55 0-19.11 12.17-14.45 22.89C44.29 47.1 60.1 69.79 81.49 87.11C41.57 119.4 16 168.7 16 223.1c0 86.26 62.1 157.9 144 172.1V416H128c-8.836 0-16 7.164-16 16v32C112 472.8 119.2 480 128 480h32v16C160 504.8 167.2 512 176 512h32c8.838 0 16-7.164 16-16V480h32c8.838 0 16-7.164 16-16v-32c0-8.836-7.162-16-16-16h-32v-19.05C305.9 381.9 368 310.3 368 223.1zM192 320c-52.93 0-96-43.07-96-96c0-52.94 43.07-95.1 96-95.1c52.94 0 96 43.06 96 95.1C288 276.9 244.9 320 192 320z\"]\n};\nvar faMessage = {\n  prefix: 'fas',\n  iconName: 'message',\n  icon: [512, 512, [\"comment-alt\"], \"f27a\", \"M511.1 63.1v287.1c0 35.25-28.75 63.1-64 63.1h-144l-124.9 93.68c-7.875 5.75-19.12 .0497-19.12-9.7v-83.98h-96c-35.25 0-64-28.75-64-63.1V63.1c0-35.25 28.75-63.1 64-63.1h384C483.2 0 511.1 28.75 511.1 63.1z\"]\n};\nvar faCommentAlt = faMessage;\nvar faMeteor = {\n  prefix: 'fas',\n  iconName: 'meteor',\n  icon: [512, 512, [9732], \"f753\", \"M511.4 20.72c-11.63 38.75-34.38 111.8-61.38 187.8c7 2.125 13.38 4 18.63 5.625c4.625 1.375 8.375 4.751 10.13 9.127c1.875 4.5 1.625 9.501-.625 13.75c-22.13 42.25-82.63 152.8-142.5 214.4c-1 1.125-2.001 2.5-3.001 3.5c-76 76.13-199.4 76.13-275.5 .125c-76.13-76.13-76.13-199.5 0-275.7c1-1 2.375-2 3.5-3C122.1 116.5 232.5 55.97 274.1 33.84c4.25-2.25 9.25-2.5 13.63-.625c4.5 1.875 7.875 5.626 9.25 10.13c1.625 5.125 3.5 11.63 5.625 18.63c75.88-27 148.9-49.75 187.6-61.25c5.75-1.75 11.88-.2503 16.13 4C511.5 8.844 512.1 15.09 511.4 20.72zM319.1 319.1c0-70.63-57.38-128-128-128c-70.75 0-128 57.38-128 128c0 70.76 57.25 128 128 128C262.6 448 319.1 390.8 319.1 319.1zM191.1 287.1c0 17.63-14.37 32-32 32c-17.75 0-32-14.38-32-32s14.25-32 32-32c8.5 0 16.63 3.375 22.63 9.375S191.1 279.5 191.1 287.1zM223.9 367.1c0 8.876-7.224 16-15.97 16c-8.875 0-16-7.127-16-16c0-8.876 7.1-16 15.98-16C216.7 351.1 223.9 359.1 223.9 367.1z\"]\n};\nvar faMicrochip = {\n  prefix: 'fas',\n  iconName: 'microchip',\n  icon: [512, 512, [], \"f2db\", \"M160 352h192V160H160V352zM448 176h48C504.8 176 512 168.8 512 160s-7.162-16-16-16H448V128c0-35.35-28.65-64-64-64h-16V16C368 7.164 360.8 0 352 0c-8.836 0-16 7.164-16 16V64h-64V16C272 7.164 264.8 0 256 0C247.2 0 240 7.164 240 16V64h-64V16C176 7.164 168.8 0 160 0C151.2 0 144 7.164 144 16V64H128C92.65 64 64 92.65 64 128v16H16C7.164 144 0 151.2 0 160s7.164 16 16 16H64v64H16C7.164 240 0 247.2 0 256s7.164 16 16 16H64v64H16C7.164 336 0 343.2 0 352s7.164 16 16 16H64V384c0 35.35 28.65 64 64 64h16v48C144 504.8 151.2 512 160 512c8.838 0 16-7.164 16-16V448h64v48c0 8.836 7.164 16 16 16c8.838 0 16-7.164 16-16V448h64v48c0 8.836 7.164 16 16 16c8.838 0 16-7.164 16-16V448H384c35.35 0 64-28.65 64-64v-16h48c8.838 0 16-7.164 16-16s-7.162-16-16-16H448v-64h48C504.8 272 512 264.8 512 256s-7.162-16-16-16H448V176zM384 368c0 8.836-7.162 16-16 16h-224C135.2 384 128 376.8 128 368v-224C128 135.2 135.2 128 144 128h224C376.8 128 384 135.2 384 144V368z\"]\n};\nvar faMicrophone = {\n  prefix: 'fas',\n  iconName: 'microphone',\n  icon: [384, 512, [], \"f130\", \"M192 352c53.03 0 96-42.97 96-96v-160c0-53.03-42.97-96-96-96s-96 42.97-96 96v160C96 309 138.1 352 192 352zM344 192C330.7 192 320 202.7 320 215.1V256c0 73.33-61.97 132.4-136.3 127.7c-66.08-4.169-119.7-66.59-119.7-132.8L64 215.1C64 202.7 53.25 192 40 192S16 202.7 16 215.1v32.15c0 89.66 63.97 169.6 152 181.7V464H128c-18.19 0-32.84 15.18-31.96 33.57C96.43 505.8 103.8 512 112 512h160c8.222 0 15.57-6.216 15.96-14.43C288.8 479.2 274.2 464 256 464h-40v-33.77C301.7 418.5 368 344.9 368 256V215.1C368 202.7 357.3 192 344 192z\"]\n};\nvar faMicrophoneLines = {\n  prefix: 'fas',\n  iconName: 'microphone-lines',\n  icon: [384, 512, [127897, \"microphone-alt\"], \"f3c9\", \"M192 352c53.03 0 96-42.97 96-96h-80C199.2 256 192 248.8 192 240S199.2 224 208 224H288V192h-80C199.2 192 192 184.8 192 176S199.2 160 208 160H288V127.1h-80c-8.836 0-16-7.164-16-16s7.164-16 16-16L288 96c0-53.03-42.97-96-96-96s-96 42.97-96 96v160C96 309 138.1 352 192 352zM344 192C330.7 192 320 202.7 320 215.1V256c0 73.33-61.97 132.4-136.3 127.7c-66.08-4.169-119.7-66.59-119.7-132.8L64 215.1C64 202.7 53.25 192 40 192S16 202.7 16 215.1v32.15c0 89.66 63.97 169.6 152 181.7V464H128c-18.19 0-32.84 15.18-31.96 33.57C96.43 505.8 103.8 512 112 512h160c8.222 0 15.57-6.216 15.96-14.43C288.8 479.2 274.2 464 256 464h-40v-33.77C301.7 418.5 368 344.9 368 256V215.1C368 202.7 357.3 192 344 192z\"]\n};\nvar faMicrophoneAlt = faMicrophoneLines;\nvar faMicrophoneLinesSlash = {\n  prefix: 'fas',\n  iconName: 'microphone-lines-slash',\n  icon: [640, 512, [\"microphone-alt-slash\"], \"f539\", \"M383.1 464l-39.1-.0001v-33.77c20.6-2.824 39.99-9.402 57.69-18.72l-43.26-33.91c-14.66 4.65-30.28 7.179-46.68 6.144C245.7 379.6 191.1 317.1 191.1 250.9v-3.777L143.1 209.5l.0001 38.61c0 89.65 63.97 169.6 151.1 181.7v34.15l-40 .0001c-17.67 0-31.1 14.33-31.1 31.1C223.1 504.8 231.2 512 239.1 512h159.1c8.838 0 15.1-7.164 15.1-15.1C415.1 478.3 401.7 464 383.1 464zM630.8 469.1l-159.3-124.9c15.37-25.94 24.53-55.91 24.53-88.21V216c0-13.25-10.75-24-23.1-24c-13.25 0-24 10.75-24 24l-.0001 39.1c0 21.12-5.557 40.77-14.77 58.24l-25.73-20.16c5.234-11.68 8.493-24.42 8.493-38.08l-57.07 .0006l-34.45-27c2.914-3.055 6.969-4.999 11.52-4.999h79.1V192L335.1 192c-8.836 0-15.1-7.164-15.1-15.1s7.164-16 15.1-16l79.1 .0013V128l-79.1-.0015c-8.836 0-15.1-7.164-15.1-15.1s7.164-15.1 15.1-15.1l80-.0003c0-54-44.56-97.57-98.93-95.95C264.5 1.614 223.1 47.45 223.1 100l.0006 50.23L38.81 5.111C34.41 1.673 29.19 0 24.03 0C16.91 0 9.84 3.158 5.121 9.189C-3.067 19.63-1.249 34.72 9.189 42.89l591.1 463.1c10.5 8.203 25.57 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faMicrophoneAltSlash = faMicrophoneLinesSlash;\nvar faMicrophoneSlash = {\n  prefix: 'fas',\n  iconName: 'microphone-slash',\n  icon: [640, 512, [], \"f131\", \"M383.1 464l-39.1-.0001v-33.77c20.6-2.824 39.98-9.402 57.69-18.72l-43.26-33.91c-14.66 4.65-30.28 7.179-46.68 6.144C245.7 379.6 191.1 317.1 191.1 250.9V247.2L143.1 209.5l.0001 38.61c0 89.65 63.97 169.6 151.1 181.7v34.15l-40 .0001c-17.67 0-31.1 14.33-31.1 31.1C223.1 504.8 231.2 512 239.1 512h159.1c8.838 0 15.1-7.164 15.1-15.1C415.1 478.3 401.7 464 383.1 464zM630.8 469.1l-159.3-124.9c15.37-25.94 24.53-55.91 24.53-88.21V216c0-13.25-10.75-24-23.1-24c-13.25 0-24 10.75-24 24l-.0001 39.1c0 21.12-5.559 40.77-14.77 58.24l-25.72-20.16c5.234-11.68 8.493-24.42 8.493-38.08l-.001-155.1c0-52.57-40.52-98.41-93.07-99.97c-54.37-1.617-98.93 41.95-98.93 95.95l0 54.25L38.81 5.111C34.41 1.673 29.19 0 24.03 0C16.91 0 9.839 3.158 5.12 9.189c-8.187 10.44-6.37 25.53 4.068 33.7l591.1 463.1c10.5 8.203 25.57 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faMicroscope = {\n  prefix: 'fas',\n  iconName: 'microscope',\n  icon: [512, 512, [128300], \"f610\", \"M160 320h12v16c0 8.875 7.125 16 16 16h40c8.875 0 16-7.125 16-16V320H256c17.62 0 32-14.38 32-32V64c0-17.62-14.38-32-32-32V16C256 7.125 248.9 0 240 0h-64C167.1 0 160 7.125 160 16V32C142.4 32 128 46.38 128 64v224C128 305.6 142.4 320 160 320zM464 448h-1.25C493.2 414 512 369.2 512 320c0-105.9-86.13-192-192-192v64c70.63 0 128 57.38 128 128s-57.38 128-128 128H48C21.5 448 0 469.5 0 496C0 504.9 7.125 512 16 512h480c8.875 0 16-7.125 16-16C512 469.5 490.5 448 464 448zM104 416h208c4.375 0 8-3.625 8-8v-16c0-4.375-3.625-8-8-8h-208C99.63 384 96 387.6 96 392v16C96 412.4 99.63 416 104 416z\"]\n};\nvar faMillSign = {\n  prefix: 'fas',\n  iconName: 'mill-sign',\n  icon: [384, 512, [], \"e1ed\", \"M282.9 96.53C339.7 102 384 149.8 384 208V416C384 433.7 369.7 448 352 448C334.3 448 320 433.7 320 416V208C320 181.5 298.5 160 272 160C267.7 160 263.6 160.6 259.7 161.6L224 261.5V416C224 433.7 209.7 448 192 448C179.6 448 168.9 440.1 163.6 430.7L142.1 490.8C136.2 507.4 117.9 516.1 101.2 510.1C84.59 504.2 75.92 485.9 81.86 469.2L160 250.5V208C160 181.5 138.5 160 112 160C85.49 160 64 181.5 64 208V416C64 433.7 49.67 448 32 448C14.33 448 0 433.7 0 416V128C0 110.3 14.33 96 32 96C42.87 96 52.48 101.4 58.26 109.7C74.21 100.1 92.53 96 112 96C143.3 96 171.7 108.9 192 129.6C196.9 124.6 202.2 120.1 207.1 116.1L241.9 21.24C247.8 4.595 266.1-4.079 282.8 1.865C299.4 7.809 308.1 26.12 302.1 42.76L282.9 96.53z\"]\n};\nvar faMinimize = {\n  prefix: 'fas',\n  iconName: 'minimize',\n  icon: [512, 512, [\"compress-arrows-alt\"], \"f78c\", \"M200 287.1H64c-12.94 0-24.62 7.797-29.56 19.75c-4.969 11.97-2.219 25.72 6.937 34.87l30.06 30.06l-62.06 62.07c-12.49 12.5-12.5 32.75-.0012 45.25l22.62 22.62c12.5 12.5 32.76 12.5 45.26 .0012l62.06-62.07l30.06 30.06c6.125 6.125 14.31 9.375 22.62 9.375c4.125 0 8.281-.7969 12.25-2.437c11.97-4.953 19.75-16.62 19.75-29.56V311.1C224 298.7 213.3 287.1 200 287.1zM312 224h135.1c12.94 0 24.62-7.797 29.56-19.75c4.969-11.97 2.219-25.72-6.937-34.87l-30.06-30.06l62.06-62.07c12.5-12.5 12.5-32.76 .0003-45.26l-22.62-22.62c-12.5-12.5-32.76-12.5-45.26-.0003l-62.06 62.07l-30.06-30.06c-9.156-9.141-22.87-11.84-34.87-6.937C295.8 39.39 288 51.06 288 64v135.1C288 213.3 298.7 224 312 224zM204.3 34.44C192.3 29.47 178.5 32.22 169.4 41.38L139.3 71.44L77.25 9.374C64.75-3.123 44.49-3.123 31.1 9.374l-22.63 22.63c-12.49 12.49-12.49 32.75 .0018 45.25l62.07 62.06L41.38 169.4C35.25 175.5 32 183.7 32 192c0 4.125 .7969 8.281 2.438 12.25C39.39 216.2 51.07 224 64 224h135.1c13.25 0 23.1-10.75 23.1-23.1V64C224 51.06 216.2 39.38 204.3 34.44zM440.6 372.7l30.06-30.06c9.141-9.156 11.84-22.88 6.938-34.87C472.6 295.8 460.9 287.1 448 287.1h-135.1c-13.25 0-23.1 10.75-23.1 23.1v135.1c0 12.94 7.797 24.62 19.75 29.56c11.97 4.969 25.72 2.219 34.87-6.937l30.06-30.06l62.06 62.06c12.5 12.5 32.76 12.5 45.26 .0002l22.62-22.62c12.5-12.5 12.5-32.76 .0002-45.26L440.6 372.7z\"]\n};\nvar faCompressArrowsAlt = faMinimize;\nvar faMinus = {\n  prefix: 'fas',\n  iconName: 'minus',\n  icon: [448, 512, [8722, 10134, 8211, \"subtract\"], \"f068\", \"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"]\n};\nvar faSubtract = faMinus;\nvar faMitten = {\n  prefix: 'fas',\n  iconName: 'mitten',\n  icon: [448, 512, [], \"f7b5\", \"M351.1 416H63.99c-17.6 0-31.1 14.4-31.1 31.1l.0026 31.1C31.1 497.6 46.4 512 63.1 512h288c17.6 0 32-14.4 32-31.1l-.0049-31.1C383.1 430.4 369.6 416 351.1 416zM425 206.9c-27.25-22.62-67.5-19-90.13 8.25l-20.88 25L284.4 111.8c-18-77.5-95.38-125.1-172.8-108C34.26 21.63-14.25 98.88 3.754 176.4L64 384h288l81.14-86.1C455.8 269.8 452.1 229.5 425 206.9z\"]\n};\nvar faMobile = {\n  prefix: 'fas',\n  iconName: 'mobile',\n  icon: [384, 512, [128241, \"mobile-android\", \"mobile-phone\"], \"f3ce\", \"M320 0H64C37.5 0 16 21.5 16 48v416C16 490.5 37.5 512 64 512h256c26.5 0 48-21.5 48-48v-416C368 21.5 346.5 0 320 0zM240 447.1C240 456.8 232.8 464 224 464H159.1C151.2 464 144 456.8 144 448S151.2 432 160 432h64C232.8 432 240 439.2 240 447.1z\"]\n};\nvar faMobileAndroid = faMobile;\nvar faMobilePhone = faMobile;\nvar faMobileButton = {\n  prefix: 'fas',\n  iconName: 'mobile-button',\n  icon: [384, 512, [], \"f10b\", \"M320 0H64C37.49 0 16 21.49 16 48v416C16 490.5 37.49 512 64 512h256c26.51 0 48-21.49 48-48v-416C368 21.49 346.5 0 320 0zM192 464c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S209.8 464 192 464z\"]\n};\nvar faMobileRetro = {\n  prefix: 'fas',\n  iconName: 'mobile-retro',\n  icon: [320, 512, [], \"e527\", \"M0 64C0 28.65 28.65 0 64 0H256C291.3 0 320 28.65 320 64V448C320 483.3 291.3 512 256 512H64C28.65 512 0 483.3 0 448V64zM64 232C64 245.3 74.75 256 88 256H232C245.3 256 256 245.3 256 232V152C256 138.7 245.3 128 232 128H88C74.75 128 64 138.7 64 152V232zM80 352C93.25 352 104 341.3 104 328C104 314.7 93.25 304 80 304C66.75 304 56 314.7 56 328C56 341.3 66.75 352 80 352zM80 384C66.75 384 56 394.7 56 408C56 421.3 66.75 432 80 432C93.25 432 104 421.3 104 408C104 394.7 93.25 384 80 384zM160 352C173.3 352 184 341.3 184 328C184 314.7 173.3 304 160 304C146.7 304 136 314.7 136 328C136 341.3 146.7 352 160 352zM160 384C146.7 384 136 394.7 136 408C136 421.3 146.7 432 160 432C173.3 432 184 421.3 184 408C184 394.7 173.3 384 160 384zM240 352C253.3 352 264 341.3 264 328C264 314.7 253.3 304 240 304C226.7 304 216 314.7 216 328C216 341.3 226.7 352 240 352zM240 384C226.7 384 216 394.7 216 408C216 421.3 226.7 432 240 432C253.3 432 264 421.3 264 408C264 394.7 253.3 384 240 384zM128 48C119.2 48 112 55.16 112 64C112 72.84 119.2 80 128 80H192C200.8 80 208 72.84 208 64C208 55.16 200.8 48 192 48H128z\"]\n};\nvar faMobileScreen = {\n  prefix: 'fas',\n  iconName: 'mobile-screen',\n  icon: [384, 512, [\"mobile-android-alt\"], \"f3cf\", \"M320 0H64C37.5 0 16 21.5 16 48v416C16 490.5 37.5 512 64 512h256c26.5 0 48-21.5 48-48v-416C368 21.5 346.5 0 320 0zM240 447.1C240 456.8 232.8 464 224 464H159.1C151.2 464 144 456.8 144 448S151.2 432 160 432h64C232.8 432 240 439.2 240 447.1zM304 384h-224V64h224V384z\"]\n};\nvar faMobileAndroidAlt = faMobileScreen;\nvar faMobileScreenButton = {\n  prefix: 'fas',\n  iconName: 'mobile-screen-button',\n  icon: [384, 512, [\"mobile-alt\"], \"f3cd\", \"M304 0h-224c-35.35 0-64 28.65-64 64v384c0 35.35 28.65 64 64 64h224c35.35 0 64-28.65 64-64V64C368 28.65 339.3 0 304 0zM192 480c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S209.8 480 192 480zM304 64v320h-224V64H304z\"]\n};\nvar faMobileAlt = faMobileScreenButton;\nvar faMoneyBill = {\n  prefix: 'fas',\n  iconName: 'money-bill',\n  icon: [576, 512, [], \"f0d6\", \"M512 64C547.3 64 576 92.65 576 128V384C576 419.3 547.3 448 512 448H64C28.65 448 0 419.3 0 384V128C0 92.65 28.65 64 64 64H512zM128 384C128 348.7 99.35 320 64 320V384H128zM64 192C99.35 192 128 163.3 128 128H64V192zM512 384V320C476.7 320 448 348.7 448 384H512zM512 128H448C448 163.3 476.7 192 512 192V128zM288 352C341 352 384 309 384 256C384 202.1 341 160 288 160C234.1 160 192 202.1 192 256C192 309 234.1 352 288 352z\"]\n};\nvar faMoneyBill1 = {\n  prefix: 'fas',\n  iconName: 'money-bill-1',\n  icon: [576, 512, [\"money-bill-alt\"], \"f3d1\", \"M252 208C252 196.1 260.1 188 272 188H288C299 188 308 196.1 308 208V276H312C323 276 332 284.1 332 296C332 307 323 316 312 316H264C252.1 316 244 307 244 296C244 284.1 252.1 276 264 276H268V227.6C258.9 225.7 252 217.7 252 208zM512 64C547.3 64 576 92.65 576 128V384C576 419.3 547.3 448 512 448H64C28.65 448 0 419.3 0 384V128C0 92.65 28.65 64 64 64H512zM128 384C128 348.7 99.35 320 64 320V384H128zM64 192C99.35 192 128 163.3 128 128H64V192zM512 384V320C476.7 320 448 348.7 448 384H512zM512 128H448C448 163.3 476.7 192 512 192V128zM288 144C226.1 144 176 194.1 176 256C176 317.9 226.1 368 288 368C349.9 368 400 317.9 400 256C400 194.1 349.9 144 288 144z\"]\n};\nvar faMoneyBillAlt = faMoneyBill1;\nvar faMoneyBill1Wave = {\n  prefix: 'fas',\n  iconName: 'money-bill-1-wave',\n  icon: [576, 512, [\"money-bill-wave-alt\"], \"f53b\", \"M251.1 207.1C251.1 196.1 260.1 187.1 271.1 187.1H287.1C299 187.1 308 196.1 308 207.1V275.1H312C323 275.1 332 284.1 332 295.1C332 307 323 315.1 312 315.1H263.1C252.1 315.1 243.1 307 243.1 295.1C243.1 284.1 252.1 275.1 263.1 275.1H267.1V227.6C258.9 225.7 251.1 217.7 251.1 207.1zM48.66 79.13C128.4 100.9 208.2 80.59 288 60.25C375 38.08 462 15.9 549 48.38C565.9 54.69 576 71.62 576 89.66V399.5C576 423.4 550.4 439.2 527.3 432.9C447.6 411.1 367.8 431.4 288 451.7C200.1 473.9 113.1 496.1 26.97 463.6C10.06 457.3 0 440.4 0 422.3V112.5C0 88.59 25.61 72.83 48.66 79.13L48.66 79.13zM127.1 416C127.1 380.7 99.35 352 63.1 352V416H127.1zM63.1 223.1C99.35 223.1 127.1 195.3 127.1 159.1H63.1V223.1zM512 352V287.1C476.7 287.1 448 316.7 448 352H512zM512 95.1H448C448 131.3 476.7 159.1 512 159.1V95.1zM287.1 143.1C234.1 143.1 191.1 194.1 191.1 255.1C191.1 317.9 234.1 368 287.1 368C341 368 384 317.9 384 255.1C384 194.1 341 143.1 287.1 143.1z\"]\n};\nvar faMoneyBillWaveAlt = faMoneyBill1Wave;\nvar faMoneyBillTransfer = {\n  prefix: 'fas',\n  iconName: 'money-bill-transfer',\n  icon: [640, 512, [], \"e528\", \"M535 7.03C544.4-2.343 559.6-2.343 568.1 7.029L632.1 71.02C637.5 75.52 640 81.63 640 87.99C640 94.36 637.5 100.5 632.1 104.1L568.1 168.1C559.6 178.3 544.4 178.3 535 168.1C525.7 159.6 525.7 144.4 535 135L558.1 111.1L384 111.1C370.7 111.1 360 101.2 360 87.99C360 74.74 370.7 63.99 384 63.99L558.1 63.1L535 40.97C525.7 31.6 525.7 16.4 535 7.03V7.03zM104.1 376.1L81.94 400L255.1 399.1C269.3 399.1 279.1 410.7 279.1 423.1C279.1 437.2 269.3 447.1 255.1 447.1L81.95 448L104.1 471C114.3 480.4 114.3 495.6 104.1 504.1C95.6 514.3 80.4 514.3 71.03 504.1L7.029 440.1C2.528 436.5-.0003 430.4 0 423.1C0 417.6 2.529 411.5 7.03 407L71.03 343C80.4 333.7 95.6 333.7 104.1 343C114.3 352.4 114.3 367.6 104.1 376.1H104.1zM95.1 64H337.9C334.1 71.18 332 79.34 332 87.1C332 116.7 355.3 139.1 384 139.1L481.1 139.1C484.4 157.5 494.9 172.5 509.4 181.9C511.1 184.3 513.1 186.6 515.2 188.8C535.5 209.1 568.5 209.1 588.8 188.8L608 169.5V384C608 419.3 579.3 448 544 448H302.1C305.9 440.8 307.1 432.7 307.1 423.1C307.1 395.3 284.7 371.1 255.1 371.1L158.9 372C155.5 354.5 145.1 339.5 130.6 330.1C128.9 327.7 126.9 325.4 124.8 323.2C104.5 302.9 71.54 302.9 51.23 323.2L31.1 342.5V128C31.1 92.65 60.65 64 95.1 64V64zM95.1 192C131.3 192 159.1 163.3 159.1 128H95.1V192zM544 384V320C508.7 320 480 348.7 480 384H544zM319.1 352C373 352 416 309 416 256C416 202.1 373 160 319.1 160C266.1 160 223.1 202.1 223.1 256C223.1 309 266.1 352 319.1 352z\"]\n};\nvar faMoneyBillTrendUp = {\n  prefix: 'fas',\n  iconName: 'money-bill-trend-up',\n  icon: [512, 512, [], \"e529\", \"M470.7 9.441C473.7 12.49 476 16 477.6 19.75C479.1 23.5 479.1 27.6 480 31.9V32V128C480 145.7 465.7 160 448 160C430.3 160 416 145.7 416 128V109.3L310.6 214.6C298.8 226.5 279.9 227.2 267.2 216.3L175.1 138.1L84.82 216.3C71.41 227.8 51.2 226.2 39.7 212.8C28.2 199.4 29.76 179.2 43.17 167.7L155.2 71.7C167.2 61.43 184.8 61.43 196.8 71.7L286.3 148.4L370.7 64H352C334.3 64 320 49.67 320 32C320 14.33 334.3 0 352 0H447.1C456.8 0 464.8 3.554 470.6 9.305L470.7 9.441zM0 304C0 277.5 21.49 256 48 256H464C490.5 256 512 277.5 512 304V464C512 490.5 490.5 512 464 512H48C21.49 512 0 490.5 0 464V304zM48 464H96C96 437.5 74.51 416 48 416V464zM48 304V352C74.51 352 96 330.5 96 304H48zM464 416C437.5 416 416 437.5 416 464H464V416zM416 304C416 330.5 437.5 352 464 352V304H416zM256 320C220.7 320 192 348.7 192 384C192 419.3 220.7 448 256 448C291.3 448 320 419.3 320 384C320 348.7 291.3 320 256 320z\"]\n};\nvar faMoneyBillWave = {\n  prefix: 'fas',\n  iconName: 'money-bill-wave',\n  icon: [576, 512, [], \"f53a\", \"M48.66 79.13C128.4 100.9 208.2 80.59 288 60.25C375 38.08 462 15.9 549 48.38C565.9 54.69 576 71.62 576 89.66V399.5C576 423.4 550.4 439.2 527.3 432.9C447.6 411.1 367.8 431.4 288 451.7C200.1 473.9 113.1 496.1 26.97 463.6C10.06 457.3 0 440.4 0 422.3V112.5C0 88.59 25.61 72.83 48.66 79.13L48.66 79.13zM287.1 352C332.2 352 368 309 368 255.1C368 202.1 332.2 159.1 287.1 159.1C243.8 159.1 207.1 202.1 207.1 255.1C207.1 309 243.8 352 287.1 352zM63.1 416H127.1C127.1 380.7 99.35 352 63.1 352V416zM63.1 143.1V207.1C99.35 207.1 127.1 179.3 127.1 143.1H63.1zM512 303.1C476.7 303.1 448 332.7 448 368H512V303.1zM448 95.1C448 131.3 476.7 159.1 512 159.1V95.1H448z\"]\n};\nvar faMoneyBillWheat = {\n  prefix: 'fas',\n  iconName: 'money-bill-wheat',\n  icon: [512, 512, [], \"e52a\", \"M256 80C256 88.84 248.8 96 240 96C195.8 96 160 60.18 160 16C160 7.164 167.2 0 176 0C220.2 0 256 35.82 256 80zM104 16C117.3 16 128 26.75 128 40C128 53.25 117.3 64 104 64H56C42.75 64 32 53.25 32 40C32 26.75 42.75 16 56 16H104zM136 88C149.3 88 160 98.75 160 112C160 125.3 149.3 136 136 136H24C10.75 136 0 125.3 0 112C0 98.75 10.75 88 24 88H136zM32 184C32 170.7 42.75 160 56 160H104C117.3 160 128 170.7 128 184C128 197.3 117.3 208 104 208H56C42.75 208 32 197.3 32 184zM272 16C272 7.164 279.2 0 288 0C332.2 0 368 35.82 368 80C368 88.84 360.8 96 352 96C307.8 96 272 60.18 272 16zM480 80C480 88.84 472.8 96 464 96C419.8 96 384 60.18 384 16C384 7.164 391.2 0 400 0C444.2 0 480 35.82 480 80zM400 224C391.2 224 384 216.8 384 208C384 163.8 419.8 128 464 128C472.8 128 480 135.2 480 144C480 188.2 444.2 224 400 224zM352 128C360.8 128 368 135.2 368 144C368 188.2 332.2 224 288 224C279.2 224 272 216.8 272 208C272 163.8 307.8 128 352 128zM176 224C167.2 224 160 216.8 160 208C160 163.8 195.8 128 240 128C248.8 128 256 135.2 256 144C256 188.2 220.2 224 176 224zM0 304C0 277.5 21.49 256 48 256H464C490.5 256 512 277.5 512 304V464C512 490.5 490.5 512 464 512H48C21.49 512 0 490.5 0 464V304zM48 464H96C96 437.5 74.51 416 48 416V464zM48 304V352C74.51 352 96 330.5 96 304H48zM464 416C437.5 416 416 437.5 416 464H464V416zM416 304C416 330.5 437.5 352 464 352V304H416zM256 320C220.7 320 192 348.7 192 384C192 419.3 220.7 448 256 448C291.3 448 320 419.3 320 384C320 348.7 291.3 320 256 320z\"]\n};\nvar faMoneyBills = {\n  prefix: 'fas',\n  iconName: 'money-bills',\n  icon: [640, 512, [], \"e1f3\", \"M96 96C96 60.65 124.7 32 160 32H576C611.3 32 640 60.65 640 96V320C640 355.3 611.3 384 576 384H160C124.7 384 96 355.3 96 320V96zM160 320H224C224 284.7 195.3 256 160 256V320zM160 96V160C195.3 160 224 131.3 224 96H160zM576 256C540.7 256 512 284.7 512 320H576V256zM512 96C512 131.3 540.7 160 576 160V96H512zM368 128C323.8 128 288 163.8 288 208C288 252.2 323.8 288 368 288C412.2 288 448 252.2 448 208C448 163.8 412.2 128 368 128zM48 360C48 399.8 80.24 432 120 432H520C533.3 432 544 442.7 544 456C544 469.3 533.3 480 520 480H120C53.73 480 0 426.3 0 360V120C0 106.7 10.75 96 24 96C37.25 96 48 106.7 48 120V360z\"]\n};\nvar faMoneyCheck = {\n  prefix: 'fas',\n  iconName: 'money-check',\n  icon: [576, 512, [], \"f53c\", \"M512 64C547.3 64 576 92.65 576 128V384C576 419.3 547.3 448 512 448H64C28.65 448 0 419.3 0 384V128C0 92.65 28.65 64 64 64H512zM112 224C103.2 224 96 231.2 96 240C96 248.8 103.2 256 112 256H272C280.8 256 288 248.8 288 240C288 231.2 280.8 224 272 224H112zM112 352H464C472.8 352 480 344.8 480 336C480 327.2 472.8 320 464 320H112C103.2 320 96 327.2 96 336C96 344.8 103.2 352 112 352zM376 160C362.7 160 352 170.7 352 184V232C352 245.3 362.7 256 376 256H456C469.3 256 480 245.3 480 232V184C480 170.7 469.3 160 456 160H376z\"]\n};\nvar faMoneyCheckDollar = {\n  prefix: 'fas',\n  iconName: 'money-check-dollar',\n  icon: [576, 512, [\"money-check-alt\"], \"f53d\", \"M512 64C547.3 64 576 92.65 576 128V384C576 419.3 547.3 448 512 448H64C28.65 448 0 419.3 0 384V128C0 92.65 28.65 64 64 64H512zM272 192C263.2 192 256 199.2 256 208C256 216.8 263.2 224 272 224H496C504.8 224 512 216.8 512 208C512 199.2 504.8 192 496 192H272zM272 320H496C504.8 320 512 312.8 512 304C512 295.2 504.8 288 496 288H272C263.2 288 256 295.2 256 304C256 312.8 263.2 320 272 320zM164.1 160C164.1 148.9 155.1 139.9 143.1 139.9C132.9 139.9 123.9 148.9 123.9 160V166C118.3 167.2 112.1 168.9 108 171.1C93.06 177.9 80.07 190.5 76.91 208.8C75.14 219 76.08 228.9 80.32 237.8C84.47 246.6 91 252.8 97.63 257.3C109.2 265.2 124.5 269.8 136.2 273.3L138.4 273.9C152.4 278.2 161.8 281.3 167.7 285.6C170.2 287.4 171.1 288.8 171.4 289.7C171.8 290.5 172.4 292.3 171.7 296.3C171.1 299.8 169.2 302.8 163.7 305.1C157.6 307.7 147.7 309 134.9 307C128.9 306 118.2 302.4 108.7 299.2C106.5 298.4 104.3 297.7 102.3 297C91.84 293.5 80.51 299.2 77.02 309.7C73.53 320.2 79.2 331.5 89.68 334.1C90.89 335.4 92.39 335.9 94.11 336.5C101.1 339.2 114.4 343.4 123.9 345.6V352C123.9 363.1 132.9 372.1 143.1 372.1C155.1 372.1 164.1 363.1 164.1 352V346.5C169.4 345.5 174.6 343.1 179.4 341.9C195.2 335.2 207.8 322.2 211.1 303.2C212.9 292.8 212.1 282.8 208.1 273.7C204.2 264.7 197.9 258.1 191.2 253.3C179.1 244.4 162.9 239.6 150.8 235.9L149.1 235.7C135.8 231.4 126.2 228.4 120.1 224.2C117.5 222.4 116.7 221.2 116.5 220.7C116.3 220.3 115.7 219.1 116.3 215.7C116.7 213.7 118.2 210.4 124.5 207.6C130.1 204.7 140.9 203.1 153.1 204.1C157.5 205.7 171 208.3 174.9 209.3C185.5 212.2 196.5 205.8 199.3 195.1C202.2 184.5 195.8 173.5 185.1 170.7C180.7 169.5 170.7 167.5 164.1 166.3L164.1 160z\"]\n};\nvar faMoneyCheckAlt = faMoneyCheckDollar;\nvar faMonument = {\n  prefix: 'fas',\n  iconName: 'monument',\n  icon: [384, 512, [], \"f5a6\", \"M180.7 4.686C186.9-1.562 197.1-1.562 203.3 4.686L283.3 84.69C285.8 87.2 287.4 90.48 287.9 94.02L328.1 416H55.88L96.12 94.02C96.57 90.48 98.17 87.2 100.7 84.69L180.7 4.686zM152 272C138.7 272 128 282.7 128 296C128 309.3 138.7 320 152 320H232C245.3 320 256 309.3 256 296C256 282.7 245.3 272 232 272H152zM352 448C369.7 448 384 462.3 384 480C384 497.7 369.7 512 352 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H352z\"]\n};\nvar faMoon = {\n  prefix: 'fas',\n  iconName: 'moon',\n  icon: [512, 512, [127769, 9214], \"f186\", \"M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z\"]\n};\nvar faMortarPestle = {\n  prefix: 'fas',\n  iconName: 'mortar-pestle',\n  icon: [512, 512, [], \"f5a7\", \"M501.5 60.87c17.25-17.12 12.5-46.25-9.25-57.13c-12.12-6-26.5-4.75-37.38 3.375L251.1 159.1h151.4L501.5 60.87zM496 191.1h-480c-8.875 0-16 7.125-16 16v32c0 8.875 7.125 16 16 16L31.1 256c0 81 50.25 150.1 121.1 178.4c-12.75 16.88-21.75 36.75-25 58.63C126.8 502.9 134.2 512 144.2 512h223.5c10 0 17.51-9.125 16.13-19c-3.25-21.88-12.25-41.75-25-58.63C429.8 406.1 479.1 337 479.1 256L496 255.1c8.875 0 16-7.125 16-16v-32C512 199.1 504.9 191.1 496 191.1z\"]\n};\nvar faMosque = {\n  prefix: 'fas',\n  iconName: 'mosque',\n  icon: [640, 512, [128332], \"f678\", \"M400 0C405 0 409.8 2.371 412.8 6.4C447.5 52.7 490.9 81.34 546.3 117.9C551.5 121.4 556.9 124.9 562.3 128.5C591.3 147.7 608 180.2 608 214.6C608 243.1 596.7 269 578.2 288H221.8C203.3 269 192 243.1 192 214.6C192 180.2 208.7 147.7 237.7 128.5C243.1 124.9 248.5 121.4 253.7 117.9C309.1 81.34 352.5 52.7 387.2 6.4C390.2 2.371 394.1 0 400 0V0zM288 440C288 426.7 277.3 416 264 416C250.7 416 240 426.7 240 440V512H192C174.3 512 160 497.7 160 480V352C160 334.3 174.3 320 192 320H608C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H560V440C560 426.7 549.3 416 536 416C522.7 416 512 426.7 512 440V512H448V453.1C448 434.1 439.6 416.1 424.1 404.8L400 384L375 404.8C360.4 416.1 352 434.1 352 453.1V512H288V440zM70.4 5.2C76.09 .9334 83.91 .9334 89.6 5.2L105.6 17.2C139.8 42.88 160 83.19 160 126V128H0V126C0 83.19 20.15 42.88 54.4 17.2L70.4 5.2zM0 160H160V296.6C140.9 307.6 128 328.3 128 352V480C128 489.6 130.1 498.6 133.8 506.8C127.3 510.1 119.9 512 112 512H48C21.49 512 0 490.5 0 464V160z\"]\n};\nvar faMosquito = {\n  prefix: 'fas',\n  iconName: 'mosquito',\n  icon: [640, 512, [], \"e52b\", \"M430.3 503.8L382.3 447.8C378.4 443.4 376.3 437.7 376.3 431.7V376.3L351.1 344.7V407.8C351.1 425.4 337.7 439.8 319.1 439.8C302.3 439.8 287.1 425.4 287.1 407.8V344.7L263.7 376.3V431.7C263.7 437.7 261.6 443.4 257.7 447.8L209.7 503.8C201.1 513.8 186.1 514.8 176.3 505.9C166.5 497 165.6 481.6 174.3 471.6L216.3 422.5V367.8C216.3 362.3 218.1 357 221.5 352.7L287.1 266.3V266L154.6 387.8C97.58 447.6 .0003 405.2 0 320.6C0 272.7 34.02 232.3 79.35 226.4L232.3 202.5L191.5 161.6C183.7 153.8 182.1 141.5 187.6 131.8L211.5 90.06L173.3 39.18C165.3 28.54 167.2 13.26 177.5 5.046C187.9-3.17 202.7-1.207 210.7 9.429L258.7 73.34C264.6 81.21 265.3 91.99 260.4 100.6L237.8 140L287.1 190.3V152.1C287.1 137.2 298.2 124.7 311.1 121.1V63.93C311.1 59.51 315.6 55.93 319.1 55.93C324.4 55.93 327.1 59.51 327.1 63.93V121.1C341.8 124.7 351.1 137.2 351.1 152.1V190.3L402.2 140L379.6 100.6C374.7 91.99 375.4 81.21 381.3 73.34L429.3 9.429C437.3-1.207 452.1-3.169 462.5 5.047C472.8 13.26 474.7 28.55 466.7 39.18L428.5 90.06L452.4 131.8C457.9 141.5 456.3 153.8 448.5 161.6L407.7 202.5L560.6 226.4C605.1 232.3 640 272.7 640 320.6C640 405.2 542.4 447.6 485.4 387.8L351.1 266V266.3L418.5 352.7C421.9 357 423.7 362.3 423.7 367.8V422.5L465.7 471.6C474.4 481.6 473.5 497 463.7 505.9C453.9 514.8 438.9 513.8 430.3 503.8L430.3 503.8z\"]\n};\nvar faMosquitoNet = {\n  prefix: 'fas',\n  iconName: 'mosquito-net',\n  icon: [640, 512, [], \"e52c\", \"M168.8 462.3C160.9 458.4 157.7 448.7 161.7 440.8L191.1 380.2V335.1C191.1 331.8 193.7 327.7 196.7 324.7L255.1 265.4V242.2L139.2 343.1C87.82 395.3 0 358.9 0 286.3C0 245.2 30.62 210.6 71.41 205.5L231.3 181.6L181.8 140.3C176.7 136.1 174.7 129.2 176.8 122.9L190.7 81.22L161.7 23.15C157.7 15.25 160.9 5.637 168.8 1.685C176.7-2.267 186.4 .9369 190.3 8.841L222.3 72.84C224.2 76.64 224.5 81.03 223.2 85.06L210.6 122.7L255.1 160.5V137.9C255.1 123.1 266.1 110.6 279.8 106.1V63.67C279.8 59.17 283.5 55.51 287.1 55.51C292.5 55.51 296.2 59.17 296.2 63.67V106.1C309.9 110.6 319.1 123.1 319.1 137.9V160.5L365.4 122.7L352.8 85.06C351.5 81.03 351.8 76.64 353.7 72.84L385.7 8.84C389.6 .9366 399.3-2.267 407.2 1.685C415.1 5.636 418.3 15.25 414.3 23.15L385.3 81.22L399.2 122.9C401.3 129.2 399.3 136.1 394.2 140.3L344.7 181.6L504.6 205.5C527 208.3 546.4 220 559.3 236.9C556.5 239.4 554.1 242.3 552 245.5C543.4 232.5 528.7 223.1 512 223.1C495.3 223.1 480.6 232.5 472 245.5C463.4 232.5 448.7 223.1 432 223.1C410.3 223.1 392 238.3 386.1 258.1C375.4 261.3 366.3 268.2 360.2 277.2L319.1 242.2V265.4L352.4 297.8C352.1 299.8 352 301.9 352 303.1C352 320.7 360.5 335.4 373.5 343.1C369.5 346.6 365.9 349.9 362.9 353.5L319.1 310.6V360.6C319.1 378.3 305.7 392.6 287.1 392.6C270.3 392.6 255.1 378.3 255.1 360.6V310.6L224 342.6V383.1C224 386.5 223.4 388.9 222.3 391.2L190.3 455.2C186.4 463.1 176.7 466.3 168.8 462.3V462.3zM512 255.1C520.8 255.1 528 263.2 528 271.1V287.1H576V271.1C576 263.2 583.2 255.1 592 255.1C600.8 255.1 608 263.2 608 271.1V287.1H624C632.8 287.1 640 295.2 640 303.1C640 312.8 632.8 319.1 624 319.1H608V367.1H624C632.8 367.1 640 375.2 640 383.1C640 392.8 632.8 399.1 624 399.1H608V447.1H624C632.8 447.1 640 455.2 640 463.1C640 472.8 632.8 479.1 624 479.1H608V495.1C608 504.8 600.8 511.1 592 511.1C583.2 511.1 576 504.8 576 495.1V479.1H528V495.1C528 504.8 520.8 511.1 512 511.1C503.2 511.1 496 504.8 496 495.1V479.1H448V495.1C448 504.8 440.8 511.1 432 511.1C423.2 511.1 416 504.8 416 495.1V479.1H400C391.2 479.1 384 472.8 384 463.1C384 455.2 391.2 447.1 400 447.1H416V399.1H400C391.2 399.1 384 392.8 384 383.1C384 375.2 391.2 367.1 400 367.1H416V319.1H400C391.2 319.1 384 312.8 384 303.1C384 295.2 391.2 287.1 400 287.1H416V271.1C416 263.2 423.2 255.1 432 255.1C440.8 255.1 448 263.2 448 271.1V287.1H496V271.1C496 263.2 503.2 255.1 512 255.1V255.1zM576 367.1V319.1H528V367.1H576zM576 447.1V399.1H528V447.1H576zM448 319.1V367.1H496V319.1H448zM448 399.1V447.1H496V399.1H448z\"]\n};\nvar faMotorcycle = {\n  prefix: 'fas',\n  iconName: 'motorcycle',\n  icon: [640, 512, [127949], \"f21c\", \"M342.5 32C357.2 32 370.7 40.05 377.6 52.98L391.7 78.93L439.1 39.42C444.9 34.62 452.1 32 459.6 32H480C497.7 32 512 46.33 512 64V96C512 113.7 497.7 128 480 128H418.2L473.3 229.1C485.5 226.1 498.5 224 512 224C582.7 224 640 281.3 640 352C640 422.7 582.7 480 512 480C441.3 480 384 422.7 384 352C384 311.1 402.4 276.3 431.1 252.8L415.7 224.2C376.1 253.4 352 299.8 352 352C352 362.1 353.1 373.7 355.2 384H284.8C286.9 373.7 287.1 362.1 287.1 352C287.1 263.6 216.4 192 127.1 192H31.1V160C31.1 142.3 46.33 128 63.1 128H165.5C182.5 128 198.7 134.7 210.7 146.7L255.1 192L354.1 110.3L337.7 80H279.1C266.7 80 255.1 69.25 255.1 56C255.1 42.75 266.7 32 279.1 32L342.5 32zM448 352C448 387.3 476.7 416 512 416C547.3 416 576 387.3 576 352C576 316.7 547.3 288 512 288C509.6 288 507.2 288.1 504.9 288.4L533.1 340.6C539.4 352.2 535.1 366.8 523.4 373.1C511.8 379.4 497.2 375.1 490.9 363.4L462.7 311.2C453.5 322.3 448 336.5 448 352V352zM253.8 376C242.5 435.2 190.5 480 128 480C57.31 480 0 422.7 0 352C0 281.3 57.31 224 128 224C190.5 224 242.5 268.8 253.8 328H187.3C177.9 304.5 154.9 288 128 288C92.65 288 64 316.7 64 352C64 387.3 92.65 416 128 416C154.9 416 177.9 399.5 187.3 376H253.8zM96 352C96 334.3 110.3 320 128 320C145.7 320 160 334.3 160 352C160 369.7 145.7 384 128 384C110.3 384 96 369.7 96 352z\"]\n};\nvar faMound = {\n  prefix: 'fas',\n  iconName: 'mound',\n  icon: [576, 512, [], \"e52d\", \"M144.1 179.2C173.8 127.7 228.6 96 288 96C347.4 96 402.2 127.7 431.9 179.2L540.4 368C552.7 389.4 537.3 416 512.7 416H63.31C38.7 416 23.31 389.4 35.57 368L144.1 179.2z\"]\n};\nvar faMountain = {\n  prefix: 'fas',\n  iconName: 'mountain',\n  icon: [512, 512, [127956], \"f6fc\", \"M503.2 393.8L280.1 44.25c-10.42-16.33-37.73-16.33-48.15 0L8.807 393.8c-11.11 17.41-11.75 39.42-1.666 57.45C17.07 468.1 35.92 480 56.31 480h399.4c20.39 0 39.24-11.03 49.18-28.77C514.9 433.2 514.3 411.2 503.2 393.8zM256 111.8L327.8 224H256L208 288L177.2 235.3L256 111.8z\"]\n};\nvar faMountainCity = {\n  prefix: 'fas',\n  iconName: 'mountain-city',\n  icon: [640, 512, [], \"e52e\", \"M432 0C458.5 0 480 21.49 480 48V192H520V120C520 106.7 530.7 96 544 96C557.3 96 568 106.7 568 120V192H592C618.5 192 640 213.5 640 240V464C640 490.5 618.5 512 592 512H470.2C470.7 511.2 471.2 510.5 471.6 509.7C483.2 488.6 482.8 462.9 470.3 442.4L396.5 320H400C408.8 320 416 312.8 416 304V272C416 263.2 408.8 256 400 256H368C364.8 256 361.9 256.9 359.4 258.5L288 140.1V48C288 21.49 309.5 0 336 0L432 0zM368 64C359.2 64 352 71.16 352 80V112C352 120.8 359.2 128 368 128H400C408.8 128 416 120.8 416 112V80C416 71.16 408.8 64 400 64H368zM352 208C352 216.8 359.2 224 368 224H400C408.8 224 416 216.8 416 208V176C416 167.2 408.8 160 400 160H368C359.2 160 352 167.2 352 176V208zM512 304C512 312.8 519.2 320 528 320H560C568.8 320 576 312.8 576 304V272C576 263.2 568.8 256 560 256H528C519.2 256 512 263.2 512 272V304zM528 352C519.2 352 512 359.2 512 368V400C512 408.8 519.2 416 528 416H560C568.8 416 576 408.8 576 400V368C576 359.2 568.8 352 560 352H528zM442.9 458.9C449.4 469.7 449.7 483.2 443.6 494.2C437.5 505.2 426 512 413.5 512H34.46C21.1 512 10.5 505.2 4.404 494.2C-1.693 483.2-1.444 469.7 5.056 458.9L194.6 144.7C200.9 134.3 211.1 128 224 128C236 128 247.1 134.3 253.4 144.7L442.9 458.9zM223.1 188.9L150.4 310.8L174.1 352L222.1 288H283.8L223.1 188.9z\"]\n};\nvar faMountainSun = {\n  prefix: 'fas',\n  iconName: 'mountain-sun',\n  icon: [640, 512, [], \"e52f\", \"M480 80C480 35.82 515.8 0 560 0C604.2 0 640 35.82 640 80C640 124.2 604.2 160 560 160C515.8 160 480 124.2 480 80zM0 456.1C0 445.6 2.964 435.3 8.551 426.4L225.3 81.01C231.9 70.42 243.5 64 256 64C268.5 64 280.1 70.42 286.8 81.01L412.7 281.7L460.9 202.7C464.1 196.1 472.2 192 480 192C487.8 192 495 196.1 499.1 202.7L631.1 419.1C636.9 428.6 640 439.7 640 450.9C640 484.6 612.6 512 578.9 512H55.91C25.03 512 .0006 486.1 .0006 456.1L0 456.1z\"]\n};\nvar faMugHot = {\n  prefix: 'fas',\n  iconName: 'mug-hot',\n  icon: [512, 512, [9749], \"f7b6\", \"M400 192H32C14.25 192 0 206.3 0 224v192c0 53 43 96 96 96h192c53 0 96-43 96-96h16c61.75 0 112-50.25 112-112S461.8 192 400 192zM400 352H384V256h16C426.5 256 448 277.5 448 304S426.5 352 400 352zM107.9 100.7C120.3 107.1 128 121.4 128 136c0 13.25 10.75 23.89 24 23.89S176 148.1 176 135.7c0-31.34-16.83-60.64-43.91-76.45C119.7 52.03 112 38.63 112 24.28c0-13.25-10.75-24.14-24-24.14S64 11.03 64 24.28C64 55.63 80.83 84.92 107.9 100.7zM219.9 100.7C232.3 107.1 240 121.4 240 136c0 13.25 10.75 23.86 24 23.86S288 148.1 288 135.7c0-31.34-16.83-60.64-43.91-76.45C231.7 52.03 224 38.63 224 24.28c0-13.25-10.75-24.18-24-24.18S176 11.03 176 24.28C176 55.63 192.8 84.92 219.9 100.7z\"]\n};\nvar faMugSaucer = {\n  prefix: 'fas',\n  iconName: 'mug-saucer',\n  icon: [640, 512, [\"coffee\"], \"f0f4\", \"M512 32H120c-13.25 0-24 10.75-24 24L96.01 288c0 53 43 96 96 96h192C437 384 480 341 480 288h32c70.63 0 128-57.38 128-128S582.6 32 512 32zM512 224h-32V96h32c35.25 0 64 28.75 64 64S547.3 224 512 224zM560 416h-544C7.164 416 0 423.2 0 432C0 458.5 21.49 480 48 480h480c26.51 0 48-21.49 48-48C576 423.2 568.8 416 560 416z\"]\n};\nvar faCoffee = faMugSaucer;\nvar faMusic = {\n  prefix: 'fas',\n  iconName: 'music',\n  icon: [512, 512, [127925], \"f001\", \"M511.1 367.1c0 44.18-42.98 80-95.1 80s-95.1-35.82-95.1-79.1c0-44.18 42.98-79.1 95.1-79.1c11.28 0 21.95 1.92 32.01 4.898V148.1L192 224l-.0023 208.1C191.1 476.2 149 512 95.1 512S0 476.2 0 432c0-44.18 42.98-79.1 95.1-79.1c11.28 0 21.95 1.92 32 4.898V126.5c0-12.97 10.06-26.63 22.41-30.52l319.1-94.49C472.1 .6615 477.3 0 480 0c17.66 0 31.97 14.34 32 31.99L511.1 367.1z\"]\n};\nvar faN = {\n  prefix: 'fas',\n  iconName: 'n',\n  icon: [384, 512, [110], \"4e\", \"M384 64.01v384c0 13.47-8.438 25.5-21.09 30.09C359.3 479.4 355.7 480 352 480c-9.312 0-18.38-4.078-24.59-11.52L64 152.4v295.6c0 17.67-14.31 32-32 32s-32-14.33-32-32v-384c0-13.47 8.438-25.5 21.09-30.09c12.62-4.516 26.84-.75 35.5 9.609L320 359.6v-295.6c0-17.67 14.31-32 32-32S384 46.34 384 64.01z\"]\n};\nvar faNairaSign = {\n  prefix: 'fas',\n  iconName: 'naira-sign',\n  icon: [448, 512, [], \"e1f6\", \"M262.5 256H320V64C320 46.33 334.3 32 352 32C369.7 32 384 46.33 384 64V256H416C433.7 256 448 270.3 448 288C448 305.7 433.7 320 416 320H384V448C384 462.1 374.8 474.5 361.3 478.6C347.8 482.7 333.2 477.5 325.4 465.8L228.2 320H128V448C128 465.7 113.7 480 96 480C78.33 480 64 465.7 64 448V320H32C14.33 320 0 305.7 0 288C0 270.3 14.33 256 32 256H64V64C64 49.9 73.23 37.46 86.73 33.37C100.2 29.29 114.8 34.52 122.6 46.25L262.5 256zM305.1 320L320 342.3V320H305.1zM185.5 256L128 169.7V256H185.5z\"]\n};\nvar faNetworkWired = {\n  prefix: 'fas',\n  iconName: 'network-wired',\n  icon: [640, 512, [], \"f6ff\", \"M400 0C426.5 0 448 21.49 448 48V144C448 170.5 426.5 192 400 192H352V224H608C625.7 224 640 238.3 640 256C640 273.7 625.7 288 608 288H512V320H560C586.5 320 608 341.5 608 368V464C608 490.5 586.5 512 560 512H400C373.5 512 352 490.5 352 464V368C352 341.5 373.5 320 400 320H448V288H192V320H240C266.5 320 288 341.5 288 368V464C288 490.5 266.5 512 240 512H80C53.49 512 32 490.5 32 464V368C32 341.5 53.49 320 80 320H128V288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H288V192H240C213.5 192 192 170.5 192 144V48C192 21.49 213.5 0 240 0H400zM256 64V128H384V64H256zM224 448V384H96V448H224zM416 384V448H544V384H416z\"]\n};\nvar faNeuter = {\n  prefix: 'fas',\n  iconName: 'neuter',\n  icon: [384, 512, [9906], \"f22c\", \"M368 176c0-97.2-78.8-176-176-176c-97.2 0-176 78.8-176 176c0 86.26 62.1 157.9 144 172.1V496C160 504.8 167.2 512 176 512h32c8.838 0 16-7.164 16-16v-147C305.9 333.9 368 262.3 368 176zM192 272c-52.93 0-96-43.07-96-96c0-52.94 43.07-95.1 96-95.1c52.94 0 96 43.06 96 95.1C288 228.9 244.9 272 192 272z\"]\n};\nvar faNewspaper = {\n  prefix: 'fas',\n  iconName: 'newspaper',\n  icon: [512, 512, [128240], \"f1ea\", \"M480 32H128C110.3 32 96 46.33 96 64v336C96 408.8 88.84 416 80 416S64 408.8 64 400V96H32C14.33 96 0 110.3 0 128v288c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V64C512 46.33 497.7 32 480 32zM272 416h-96C167.2 416 160 408.8 160 400C160 391.2 167.2 384 176 384h96c8.836 0 16 7.162 16 16C288 408.8 280.8 416 272 416zM272 320h-96C167.2 320 160 312.8 160 304C160 295.2 167.2 288 176 288h96C280.8 288 288 295.2 288 304C288 312.8 280.8 320 272 320zM432 416h-96c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16h96c8.836 0 16 7.162 16 16C448 408.8 440.8 416 432 416zM432 320h-96C327.2 320 320 312.8 320 304C320 295.2 327.2 288 336 288h96C440.8 288 448 295.2 448 304C448 312.8 440.8 320 432 320zM448 208C448 216.8 440.8 224 432 224h-256C167.2 224 160 216.8 160 208v-96C160 103.2 167.2 96 176 96h256C440.8 96 448 103.2 448 112V208z\"]\n};\nvar faNotEqual = {\n  prefix: 'fas',\n  iconName: 'not-equal',\n  icon: [448, 512, [], \"f53e\", \"M432 336c0 17.69-14.31 32.01-32 32.01H187.8l-65.15 97.74C116.5 474.1 106.3 480 95.97 480c-6.094 0-12.25-1.75-17.72-5.375c-14.72-9.812-18.69-29.66-8.875-44.38l41.49-62.23H48c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h105.5l63.1-96H48c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h212.2l65.18-97.77c9.781-14.69 29.62-18.66 44.37-8.875c14.72 9.812 18.69 29.66 8.875 44.38l-41.51 62.27H400c17.69 0 32 14.31 32 31.99s-14.31 32.01-32 32.01h-105.6l-63.1 96H400C417.7 304 432 318.3 432 336z\"]\n};\nvar faNoteSticky = {\n  prefix: 'fas',\n  iconName: 'note-sticky',\n  icon: [448, 512, [62026, \"sticky-note\"], \"f249\", \"M400 32h-352C21.49 32 0 53.49 0 80v352C0 458.5 21.49 480 48 480h245.5c16.97 0 33.25-6.744 45.26-18.75l90.51-90.51C441.3 358.7 448 342.5 448 325.5V80C448 53.49 426.5 32 400 32zM64 96h320l-.001 224H320c-17.67 0-32 14.33-32 32v64H64V96z\"]\n};\nvar faStickyNote = faNoteSticky;\nvar faNotesMedical = {\n  prefix: 'fas',\n  iconName: 'notes-medical',\n  icon: [512, 512, [], \"f481\", \"M480 144V384l-96 96H144C117.5 480 96 458.5 96 432v-288C96 117.5 117.5 96 144 96h288C458.5 96 480 117.5 480 144zM384 264C384 259.6 380.4 256 376 256H320V200C320 195.6 316.4 192 312 192h-48C259.6 192 256 195.6 256 200V256H200C195.6 256 192 259.6 192 264v48C192 316.4 195.6 320 200 320H256v56c0 4.375 3.625 8 8 8h48c4.375 0 8-3.625 8-8V320h56C380.4 320 384 316.4 384 312V264zM0 360v-240C0 53.83 53.83 0 120 0h240C373.3 0 384 10.75 384 24S373.3 48 360 48h-240C80.3 48 48 80.3 48 120v240C48 373.3 37.25 384 24 384S0 373.3 0 360z\"]\n};\nvar faO = {\n  prefix: 'fas',\n  iconName: 'o',\n  icon: [448, 512, [111], \"4f\", \"M224 32.01c-123.5 0-224 100.5-224 224s100.5 224 224 224s224-100.5 224-224S347.5 32.01 224 32.01zM224 416c-88.22 0-160-71.78-160-160s71.78-159.1 160-159.1s160 71.78 160 159.1S312.2 416 224 416z\"]\n};\nvar faObjectGroup = {\n  prefix: 'fas',\n  iconName: 'object-group',\n  icon: [576, 512, [], \"f247\", \"M128 160C128 142.3 142.3 128 160 128H288C305.7 128 320 142.3 320 160V256C320 273.7 305.7 288 288 288H160C142.3 288 128 273.7 128 256V160zM288 320C323.3 320 352 291.3 352 256V224H416C433.7 224 448 238.3 448 256V352C448 369.7 433.7 384 416 384H288C270.3 384 256 369.7 256 352V320H288zM32 119.4C12.87 108.4 0 87.69 0 64C0 28.65 28.65 0 64 0C87.69 0 108.4 12.87 119.4 32H456.6C467.6 12.87 488.3 0 512 0C547.3 0 576 28.65 576 64C576 87.69 563.1 108.4 544 119.4V392.6C563.1 403.6 576 424.3 576 448C576 483.3 547.3 512 512 512C488.3 512 467.6 499.1 456.6 480H119.4C108.4 499.1 87.69 512 64 512C28.65 512 0 483.3 0 448C0 424.3 12.87 403.6 32 392.6V119.4zM119.4 96C113.8 105.7 105.7 113.8 96 119.4V392.6C105.7 398.2 113.8 406.3 119.4 416H456.6C462.2 406.3 470.3 398.2 480 392.6V119.4C470.3 113.8 462.2 105.7 456.6 96H119.4z\"]\n};\nvar faObjectUngroup = {\n  prefix: 'fas',\n  iconName: 'object-ungroup',\n  icon: [640, 512, [], \"f248\", \"M32 119.4C12.87 108.4 0 87.69 0 64C0 28.65 28.65 0 64 0C87.69 0 108.4 12.87 119.4 32H328.6C339.6 12.87 360.3 0 384 0C419.3 0 448 28.65 448 64C448 87.69 435.1 108.4 416 119.4V232.6C435.1 243.6 448 264.3 448 288C448 323.3 419.3 352 384 352C360.3 352 339.6 339.1 328.6 320H119.4C108.4 339.1 87.69 352 64 352C28.65 352 0 323.3 0 288C0 264.3 12.87 243.6 32 232.6V119.4zM96 119.4V232.6C105.7 238.2 113.8 246.3 119.4 256H328.6C334.2 246.3 342.3 238.2 352 232.6V119.4C342.3 113.8 334.2 105.7 328.6 96H119.4C113.8 105.7 105.7 113.8 96 119.4V119.4zM311.4 480C300.4 499.1 279.7 512 256 512C220.7 512 192 483.3 192 448C192 424.3 204.9 403.6 224 392.6V352H288V392.6C297.7 398.2 305.8 406.3 311.4 416H520.6C526.2 406.3 534.3 398.2 544 392.6V279.4C534.3 273.8 526.2 265.7 520.6 255.1H474.5C469.1 240.6 459.9 227.1 448 216.4V191.1H520.6C531.6 172.9 552.3 159.1 576 159.1C611.3 159.1 640 188.7 640 223.1C640 247.7 627.1 268.4 608 279.4V392.6C627.1 403.6 640 424.3 640 448C640 483.3 611.3 512 576 512C552.3 512 531.6 499.1 520.6 480H311.4z\"]\n};\nvar faOilCan = {\n  prefix: 'fas',\n  iconName: 'oil-can',\n  icon: [640, 512, [], \"f613\", \"M288 128V160H368.9C378.8 160 388.6 162.3 397.5 166.8L448 192L615 156.2C633.1 152.3 645.7 173.8 633.5 187.7L451.1 394.3C438.1 408.1 421.5 416 403.1 416H144C117.5 416 96 394.5 96 368V346.7L28.51 316.7C11.17 308.1 0 291.8 0 272.8V208C0 181.5 21.49 160 48 160H224V128H192C174.3 128 160 113.7 160 96C160 78.33 174.3 64 192 64H320C337.7 64 352 78.33 352 96C352 113.7 337.7 128 320 128L288 128zM96 208H48V272.8L96 294.1V208z\"]\n};\nvar faOilWell = {\n  prefix: 'fas',\n  iconName: 'oil-well',\n  icon: [576, 512, [], \"e532\", \"M569.8 215.8C581.2 258.5 555.9 302.4 513.2 313.8L497.7 317.9C480.7 322.5 463.1 312.4 458.5 295.3L433.3 201.3L95.1 288.8V448H137.3L190.4 296.3L264.1 276.1L238.7 352H305.3L277.9 273.6L340 257.5L406.7 448H544C561.7 448 576 462.3 576 480C576 497.7 561.7 512 544 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H48V184C48 170.7 58.75 160 72 160C85.25 160 96 170.7 96 184V222.6L228.2 188.4L241.8 149.4C246.3 136.6 258.4 128 272 128C285.6 128 297.7 136.6 302.2 149.4L308.5 167.5L416.8 139.5L392.3 48.04C387.7 30.97 397.8 13.42 414.9 8.848L430.4 4.707C473-6.729 516.9 18.6 528.3 61.28L569.8 215.8zM205.1 448H338.9L327.7 416H216.3L205.1 448z\"]\n};\nvar faOm = {\n  prefix: 'fas',\n  iconName: 'om',\n  icon: [512, 512, [128329], \"f679\", \"M360.6 61C362.5 62.88 365.2 64 368 64s5.375-1.125 7.375-3l21.5-21.62C398.9 37.38 400 34.75 400 32s-1.125-5.375-3.125-7.375L375.4 3c-4.125-4-10.75-4-14.75 0L339 24.62C337 26.62 336 29.25 336 32s1 5.375 3 7.375L360.6 61zM412.1 191.1c-26.75 0-51.75 10.38-70.63 29.25l-24.25 24.25c-6.75 6.75-15.75 10.5-25.37 10.5H245c10.5-22.12 14.12-48.12 7.75-75.25C242.6 138.2 206.4 104.6 163.2 97.62c-36.25-6-71 5-96 28.75c-7.375 7-7 18.87 1.125 24.87L94.5 170.9c5.75 4.375 13.62 4.375 19.12-.125C122.1 163.8 132.8 159.1 144 159.1c26.38 0 48 21.5 48 48S170.4 255.9 143.1 255.9L112 255.1c-11.88 0-19.75 12.63-14.38 23.25L113.8 311.5C116.2 316.5 121.4 319.5 126.9 320H160c35.25 0 64 28.75 64 64s-28.75 64-64 64c-96.12 0-122.4-53.1-145.2-92C10.25 348.4 0 352.4 0 361.2C-.125 416 41.12 512 160 512c70.5 0 127.1-57.44 127.1-128.1c0-23.38-6.874-45.06-17.87-63.94h21.75c26.62 0 51.75-10.38 70.63-29.25l24.25-24.25c6.75-6.75 15.75-10.5 25.37-10.5C431.9 255.1 448 272.1 448 291.9V392c0 13.25-18.75 24-32 24c-39.38 0-66.75-24.25-81.88-42.88C329.4 367.2 320 370.6 320 378.1V416c0 0 0 64 96 64c48.5 0 96-39.5 96-88V291.9C512 236.8 467.3 191.1 412.1 191.1zM454.3 67.25c-85.5 65.13-169 2.751-172.5 .125c-6-4.625-14.5-4.375-20.13 .5C255.9 72.75 254.3 81 257.9 87.63C259.5 90.63 298.2 160 376.8 160c79.88 0 98.75-31.38 101.8-37.63C479.5 120.2 480 117.9 480 115.5V80C480 66.75 464.9 59.25 454.3 67.25z\"]\n};\nvar faOtter = {\n  prefix: 'fas',\n  iconName: 'otter',\n  icon: [640, 512, [129446], \"f700\", \"M224 160c8.836 0 16-7.164 16-16C240 135.2 232.8 128 224 128S208 135.2 208 144C208 152.8 215.2 160 224 160zM96 128C87.16 128 80 135.2 80 144C80 152.8 87.16 160 96 160s16-7.164 16-16C112 135.2 104.8 128 96 128zM474.4 64.12C466.8 63.07 460 69.07 460 76.73c0 5.959 4.188 10.1 9.991 12.36C514.2 99.46 544 160 544 192v112c0 8.844-7.156 16-16 16S512 312.8 512 304V212c0-14.87-15.65-24.54-28.94-17.89c-28.96 14.48-47.83 42.99-50.51 74.88C403.7 285.6 384 316.3 384 352v32H224c17.67 0 32-14.33 32-32c0-17.67-14.33-32-32-32H132.4c-14.46 0-27.37-9.598-31.08-23.57C97.86 283.5 96 269.1 96 256V254.4C101.1 255.3 106.3 256 111.7 256c10.78 0 21.45-2.189 31.36-6.436L160 242.3l16.98 7.271C186.9 253.8 197.6 256 208.3 256c7.176 0 14.11-.9277 20.83-2.426C241.7 292 277.4 320 320 320l36.56-.0366C363.1 294.7 377.1 272.7 396.2 256H320c0-25.73 17.56-31.61 32.31-32C369.8 223.8 384 209.6 384 192c0-17.67-14.31-32-32-32c-15.09 0-32.99 4.086-49.28 13.06C303.3 168.9 304 164.7 304 160.3v-16c0-1.684-.4238-3.248-.4961-4.912C313.2 133.9 320 123.9 320 112C320 103.2 312.8 96 304 96H292.7C274.6 58.26 236.3 32 191.7 32H128.3C83.68 32 45.44 58.26 27.33 96H16C7.164 96 0 103.2 0 112c0 11.93 6.816 21.93 16.5 27.43C16.42 141.1 16 142.7 16 144.3v16c0 19.56 5.926 37.71 16 52.86V256c0 123.7 100.3 224 224 224h160c123.9-1.166 224-101.1 224-226.2C639.9 156.9 567.8 76.96 474.4 64.12zM64 160.3v-16C64 108.9 92.86 80 128.3 80h63.32C227.1 80 256 108.9 256 144.3v16C256 186.6 234.6 208 208.3 208c-4.309 0-8.502-.8608-12.46-2.558L162.1 191.4c2.586-.3066 5.207-.543 7.598-1.631l8.314-3.777C186.9 182.3 192 174.9 192 166.7V160c0-6.723-5.996-12.17-13.39-12.17H141.4C133.1 147.8 128 153.3 128 160v6.701c0 8.15 5.068 15.6 13.09 19.25l8.314 3.777c2.391 1.088 5.012 1.324 7.598 1.631l-32.88 14.08C120.2 207.1 115.1 208 111.7 208C85.38 208 64 186.6 64 160.3z\"]\n};\nvar faOutdent = {\n  prefix: 'fas',\n  iconName: 'outdent',\n  icon: [512, 512, [\"dedent\"], \"f03b\", \"M32 64C32 46.33 46.33 32 64 32H448C465.7 32 480 46.33 480 64C480 81.67 465.7 96 448 96H64C46.33 96 32 81.67 32 64V64zM224 192C224 174.3 238.3 160 256 160H448C465.7 160 480 174.3 480 192C480 209.7 465.7 224 448 224H256C238.3 224 224 209.7 224 192zM448 288C465.7 288 480 302.3 480 320C480 337.7 465.7 352 448 352H256C238.3 352 224 337.7 224 320C224 302.3 238.3 288 256 288H448zM32 448C32 430.3 46.33 416 64 416H448C465.7 416 480 430.3 480 448C480 465.7 465.7 480 448 480H64C46.33 480 32 465.7 32 448V448zM32.24 268.6C24 262.2 24 249.8 32.24 243.4L134.2 164.1C144.7 155.9 160 163.4 160 176.7V335.3C160 348.6 144.7 356.1 134.2 347.9L32.24 268.6z\"]\n};\nvar faDedent = faOutdent;\nvar faP = {\n  prefix: 'fas',\n  iconName: 'p',\n  icon: [320, 512, [112], \"50\", \"M160 32.01H32c-17.69 0-32 14.33-32 32v384c0 17.67 14.31 32 32 32s32-14.33 32-32v-96h96c88.22 0 160-71.78 160-159.1S248.2 32.01 160 32.01zM160 288H64V96.01h96c52.94 0 96 43.06 96 96S212.9 288 160 288z\"]\n};\nvar faPager = {\n  prefix: 'fas',\n  iconName: 'pager',\n  icon: [512, 512, [128223], \"f815\", \"M448 64H64C28.63 64 0 92.63 0 128v256c0 35.38 28.62 64 64 64h384c35.38 0 64-28.62 64-64V128C512 92.63 483.4 64 448 64zM160 368H80C71.13 368 64 360.9 64 352v-16C64 327.1 71.13 320 80 320H160V368zM288 352c0 8.875-7.125 16-16 16H192V320h80c8.875 0 16 7.125 16 16V352zM448 224c0 17.62-14.38 32-32 32H96C78.38 256 64 241.6 64 224V160c0-17.62 14.38-32 32-32h320c17.62 0 32 14.38 32 32V224z\"]\n};\nvar faPaintRoller = {\n  prefix: 'fas',\n  iconName: 'paint-roller',\n  icon: [512, 512, [], \"f5aa\", \"M0 64C0 28.65 28.65 0 64 0H352C387.3 0 416 28.65 416 64V128C416 163.3 387.3 192 352 192H64C28.65 192 0 163.3 0 128V64zM160 352C160 334.3 174.3 320 192 320V304C192 259.8 227.8 224 272 224H416C433.7 224 448 209.7 448 192V69.46C485.3 82.64 512 118.2 512 160V192C512 245 469 288 416 288H272C263.2 288 256 295.2 256 304V320C273.7 320 288 334.3 288 352V480C288 497.7 273.7 512 256 512H192C174.3 512 160 497.7 160 480V352z\"]\n};\nvar faPaintbrush = {\n  prefix: 'fas',\n  iconName: 'paintbrush',\n  icon: [576, 512, [128396, \"paint-brush\"], \"f1fc\", \"M224 263.3C224.2 233.3 238.4 205.2 262.4 187.2L499.1 9.605C517.7-4.353 543.6-2.965 560.7 12.9C577.7 28.76 580.8 54.54 568.2 74.07L406.5 324.1C391.3 347.7 366.6 363.2 339.3 367.1L224 263.3zM320 400C320 461.9 269.9 512 208 512H64C46.33 512 32 497.7 32 480C32 462.3 46.33 448 64 448H68.81C86.44 448 98.4 429.1 96.59 411.6C96.2 407.8 96 403.9 96 400C96 339.6 143.9 290.3 203.7 288.1L319.8 392.5C319.9 394.1 320 397.5 320 400V400z\"]\n};\nvar faPaintBrush = faPaintbrush;\nvar faPalette = {\n  prefix: 'fas',\n  iconName: 'palette',\n  icon: [512, 512, [127912], \"f53f\", \"M512 255.1C512 256.9 511.1 257.8 511.1 258.7C511.6 295.2 478.4 319.1 441.9 319.1H344C317.5 319.1 296 341.5 296 368C296 371.4 296.4 374.7 297 377.9C299.2 388.1 303.5 397.1 307.9 407.8C313.9 421.6 320 435.3 320 449.8C320 481.7 298.4 510.5 266.6 511.8C263.1 511.9 259.5 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256V255.1zM96 255.1C78.33 255.1 64 270.3 64 287.1C64 305.7 78.33 319.1 96 319.1C113.7 319.1 128 305.7 128 287.1C128 270.3 113.7 255.1 96 255.1zM128 191.1C145.7 191.1 160 177.7 160 159.1C160 142.3 145.7 127.1 128 127.1C110.3 127.1 96 142.3 96 159.1C96 177.7 110.3 191.1 128 191.1zM256 63.1C238.3 63.1 224 78.33 224 95.1C224 113.7 238.3 127.1 256 127.1C273.7 127.1 288 113.7 288 95.1C288 78.33 273.7 63.1 256 63.1zM384 191.1C401.7 191.1 416 177.7 416 159.1C416 142.3 401.7 127.1 384 127.1C366.3 127.1 352 142.3 352 159.1C352 177.7 366.3 191.1 384 191.1z\"]\n};\nvar faPallet = {\n  prefix: 'fas',\n  iconName: 'pallet',\n  icon: [640, 512, [], \"f482\", \"M624 384c8.75 0 16-7.25 16-16v-32c0-8.75-7.25-16-16-16h-608C7.25 320 0 327.3 0 336v32C0 376.8 7.25 384 16 384H64v64H16C7.25 448 0 455.3 0 464v32C0 504.8 7.25 512 16 512h608c8.75 0 16-7.25 16-16v-32c0-8.75-7.25-16-16-16H576v-64H624zM288 448H128v-64h160V448zM512 448h-160v-64h160V448z\"]\n};\nvar faPanorama = {\n  prefix: 'fas',\n  iconName: 'panorama',\n  icon: [640, 512, [], \"e209\", \"M578.2 66.06C409.8 116.6 230.2 116.6 61.8 66.06C31 56.82 0 79.88 0 112v319.9c0 32.15 30.1 55.21 61.79 45.97c168.4-50.53 347.1-50.53 516.4-.002C608.1 487.2 640 464.1 640 431.1V112C640 79.88 609 56.82 578.2 66.06zM128 224C110.3 224 96 209.7 96 192s14.33-32 32-32c17.68 0 32 14.33 32 32S145.7 224 128 224zM474.3 388.6C423.4 380.3 371.8 376 320 376c-50.45 0-100.7 4.043-150.3 11.93c-14.14 2.246-24.11-13.19-15.78-24.84l49.18-68.56C206.1 290.4 210.9 288 216 288s9.916 2.441 12.93 6.574l32.46 44.51l93.3-139.1C357.7 194.7 362.7 192 368 192s10.35 2.672 13.31 7.125l109.1 165.1C498.1 375.9 488.1 390.8 474.3 388.6z\"]\n};\nvar faPaperPlane = {\n  prefix: 'fas',\n  iconName: 'paper-plane',\n  icon: [512, 512, [61913], \"f1d8\", \"M511.6 36.86l-64 415.1c-1.5 9.734-7.375 18.22-15.97 23.05c-4.844 2.719-10.27 4.097-15.68 4.097c-4.188 0-8.319-.8154-12.29-2.472l-122.6-51.1l-50.86 76.29C226.3 508.5 219.8 512 212.8 512C201.3 512 192 502.7 192 491.2v-96.18c0-7.115 2.372-14.03 6.742-19.64L416 96l-293.7 264.3L19.69 317.5C8.438 312.8 .8125 302.2 .0625 289.1s5.469-23.72 16.06-29.77l448-255.1c10.69-6.109 23.88-5.547 34 1.406S513.5 24.72 511.6 36.86z\"]\n};\nvar faPaperclip = {\n  prefix: 'fas',\n  iconName: 'paperclip',\n  icon: [448, 512, [128206], \"f0c6\", \"M364.2 83.8C339.8 59.39 300.2 59.39 275.8 83.8L91.8 267.8C49.71 309.9 49.71 378.1 91.8 420.2C133.9 462.3 202.1 462.3 244.2 420.2L396.2 268.2C407.1 257.3 424.9 257.3 435.8 268.2C446.7 279.1 446.7 296.9 435.8 307.8L283.8 459.8C219.8 523.8 116.2 523.8 52.2 459.8C-11.75 395.8-11.75 292.2 52.2 228.2L236.2 44.2C282.5-2.08 357.5-2.08 403.8 44.2C450.1 90.48 450.1 165.5 403.8 211.8L227.8 387.8C199.2 416.4 152.8 416.4 124.2 387.8C95.59 359.2 95.59 312.8 124.2 284.2L268.2 140.2C279.1 129.3 296.9 129.3 307.8 140.2C318.7 151.1 318.7 168.9 307.8 179.8L163.8 323.8C157.1 330.5 157.1 341.5 163.8 348.2C170.5 354.9 181.5 354.9 188.2 348.2L364.2 172.2C388.6 147.8 388.6 108.2 364.2 83.8V83.8z\"]\n};\nvar faParachuteBox = {\n  prefix: 'fas',\n  iconName: 'parachute-box',\n  icon: [512, 512, [], \"f4cd\", \"M272 192V320H304C311 320 317.7 321.5 323.7 324.2L443.8 192H415.5C415.8 186.7 416 181.4 416 176C416 112.1 393.8 54.84 358.9 16.69C450 49.27 493.4 122.6 507.8 173.6C510.5 183.1 502.1 192 493.1 192H487.1L346.8 346.3C350.1 352.8 352 360.2 352 368V464C352 490.5 330.5 512 304 512H207.1C181.5 512 159.1 490.5 159.1 464V368C159.1 360.2 161.9 352.8 165.2 346.3L24.92 192H18.89C9 192 1.483 183.1 4.181 173.6C18.64 122.6 61.97 49.27 153.1 16.69C118.2 54.84 96 112.1 96 176C96 181.4 96.16 186.7 96.47 192H68.17L188.3 324.2C194.3 321.5 200.1 320 207.1 320H239.1V192H128.5C128.2 186.7 127.1 181.4 127.1 176C127.1 125 143.9 80.01 168.2 48.43C192.5 16.89 223.8 0 255.1 0C288.2 0 319.5 16.89 343.8 48.43C368.1 80.01 384 125 384 176C384 181.4 383.8 186.7 383.5 192H272z\"]\n};\nvar faParagraph = {\n  prefix: 'fas',\n  iconName: 'paragraph',\n  icon: [448, 512, [182], \"f1dd\", \"M448 63.1C448 81.67 433.7 96 416 96H384v352c0 17.67-14.33 32-31.1 32S320 465.7 320 448V96h-32v352c0 17.67-14.33 32-31.1 32S224 465.7 224 448v-96H198.9c-83.57 0-158.2-61.11-166.1-144.3C23.66 112.3 98.44 32 191.1 32h224C433.7 32 448 46.33 448 63.1z\"]\n};\nvar faPassport = {\n  prefix: 'fas',\n  iconName: 'passport',\n  icon: [448, 512, [], \"f5ab\", \"M129.6 208c5.25 31.25 25.62 57.13 53.25 70.38C175.3 259.4 170.3 235 168.8 208H129.6zM129.6 176h39.13c1.5-27 6.5-51.38 14.12-70.38C155.3 118.9 134.9 144.8 129.6 176zM224 286.8C231.8 279.3 244.8 252.3 247.4 208H200.5C203.3 252.3 216.3 279.3 224 286.8zM265.1 105.6C272.8 124.6 277.8 149 279.3 176h39.13C313.1 144.8 292.8 118.9 265.1 105.6zM384 0H64C28.65 0 0 28.65 0 64v384c0 35.35 28.65 64 64 64h320c35.2 0 64-28.8 64-64V64C448 28.8 419.2 0 384 0zM336 416h-224C103.3 416 96 408.8 96 400S103.3 384 112 384h224c8.75 0 16 7.25 16 16S344.8 416 336 416zM224 320c-70.75 0-128-57.25-128-128s57.25-128 128-128s128 57.25 128 128S294.8 320 224 320zM265.1 278.4c27.62-13.25 48-39.13 53.25-70.38h-39.13C277.8 235 272.8 259.4 265.1 278.4zM200.6 176h46.88C244.7 131.8 231.8 104.8 224 97.25C216.3 104.8 203.2 131.8 200.6 176z\"]\n};\nvar faPaste = {\n  prefix: 'fas',\n  iconName: 'paste',\n  icon: [512, 512, [\"file-clipboard\"], \"f0ea\", \"M320 96V80C320 53.49 298.5 32 272 32H215.4C204.3 12.89 183.6 0 160 0S115.7 12.89 104.6 32H48C21.49 32 0 53.49 0 80v320C0 426.5 21.49 448 48 448l144 .0013L192 176C192 131.8 227.8 96 272 96H320zM160 88C146.8 88 136 77.25 136 64S146.8 40 160 40S184 50.75 184 64S173.3 88 160 88zM416 128v96h96L416 128zM384 224L384 128h-112C245.5 128 224 149.5 224 176v288c0 26.51 21.49 48 48 48h192c26.51 0 48-21.49 48-48V256h-95.99C398.4 256 384 241.6 384 224z\"]\n};\nvar faFileClipboard = faPaste;\nvar faPause = {\n  prefix: 'fas',\n  iconName: 'pause',\n  icon: [320, 512, [9208], \"f04c\", \"M272 63.1l-32 0c-26.51 0-48 21.49-48 47.1v288c0 26.51 21.49 48 48 48L272 448c26.51 0 48-21.49 48-48v-288C320 85.49 298.5 63.1 272 63.1zM80 63.1l-32 0c-26.51 0-48 21.49-48 48v288C0 426.5 21.49 448 48 448l32 0c26.51 0 48-21.49 48-48v-288C128 85.49 106.5 63.1 80 63.1z\"]\n};\nvar faPaw = {\n  prefix: 'fas',\n  iconName: 'paw',\n  icon: [512, 512, [], \"f1b0\", \"M256 224c-79.37 0-191.1 122.7-191.1 200.2C64.02 459.1 90.76 480 135.8 480C184.6 480 216.9 454.9 256 454.9C295.5 454.9 327.9 480 376.2 480c44.1 0 71.74-20.88 71.74-55.75C447.1 346.8 335.4 224 256 224zM108.8 211.4c-10.37-34.62-42.5-57.12-71.62-50.12S-7.104 202 3.27 236.6C13.64 271.3 45.77 293.8 74.89 286.8S119.1 246 108.8 211.4zM193.5 190.6c30.87-8.125 46.37-49.1 34.5-93.37s-46.5-71.1-77.49-63.87c-30.87 8.125-46.37 49.1-34.5 93.37C127.9 170.1 162.5 198.8 193.5 190.6zM474.9 161.3c-29.12-6.1-61.25 15.5-71.62 50.12c-10.37 34.63 4.75 68.37 33.87 75.37c29.12 6.1 61.12-15.5 71.62-50.12C519.1 202 503.1 168.3 474.9 161.3zM318.5 190.6c30.1 8.125 65.62-20.5 77.49-63.87c11.87-43.37-3.625-85.25-34.5-93.37c-30.1-8.125-65.62 20.5-77.49 63.87C272.1 140.6 287.6 182.5 318.5 190.6z\"]\n};\nvar faPeace = {\n  prefix: 'fas',\n  iconName: 'peace',\n  icon: [512, 512, [9774], \"f67c\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM224 445.1c-36.36-6.141-69.2-22.48-95.59-46.04L224 322.6V445.1zM288 322.6l95.59 76.47C357.2 422.6 324.4 438.1 288 445.1V322.6zM64 256c0-94.95 69.34-173.8 160-189.1v173.7l-135.7 108.6C72.86 321.6 64 289.8 64 256zM423.7 349.2L288 240.6V66.89C378.7 82.2 448 161.1 448 256C448 289.8 439.1 321.6 423.7 349.2z\"]\n};\nvar faPen = {\n  prefix: 'fas',\n  iconName: 'pen',\n  icon: [512, 512, [128394], \"f304\", \"M362.7 19.32C387.7-5.678 428.3-5.678 453.3 19.32L492.7 58.75C517.7 83.74 517.7 124.3 492.7 149.3L444.3 197.7L314.3 67.72L362.7 19.32zM421.7 220.3L188.5 453.4C178.1 463.8 165.2 471.5 151.1 475.6L30.77 511C22.35 513.5 13.24 511.2 7.03 504.1C.8198 498.8-1.502 489.7 .976 481.2L36.37 360.9C40.53 346.8 48.16 333.9 58.57 323.5L291.7 90.34L421.7 220.3z\"]\n};\nvar faPenClip = {\n  prefix: 'fas',\n  iconName: 'pen-clip',\n  icon: [512, 512, [\"pen-alt\"], \"f305\", \"M492.7 58.75C517.7 83.74 517.7 124.3 492.7 149.3L440.6 201.4L310.6 71.43L362.7 19.32C387.7-5.678 428.3-5.678 453.3 19.32L492.7 58.75zM240.1 114.9C231.6 105.5 216.4 105.5 207 114.9L104.1 216.1C95.6 226.3 80.4 226.3 71.03 216.1C61.66 207.6 61.66 192.4 71.03 183L173.1 80.97C201.2 52.85 246.8 52.85 274.9 80.97L417.9 224L229.5 412.5C181.5 460.5 120.3 493.2 53.7 506.5L28.71 511.5C20.84 513.1 12.7 510.6 7.03 504.1C1.356 499.3-1.107 491.2 .4662 483.3L5.465 458.3C18.78 391.7 51.52 330.5 99.54 282.5L254.1 128L240.1 114.9z\"]\n};\nvar faPenAlt = faPenClip;\nvar faPenFancy = {\n  prefix: 'fas',\n  iconName: 'pen-fancy',\n  icon: [512, 512, [128395, 10002], \"f5ac\", \"M373.5 27.11C388.5 9.885 410.2 0 433 0C476.6 0 512 35.36 512 78.98C512 101.8 502.1 123.5 484.9 138.5L277.7 319L192.1 234.3L373.5 27.11zM255.1 341.7L235.9 425.1C231.9 442.2 218.9 455.8 202 460.5L24.35 510.3L119.7 414.9C122.4 415.6 125.1 416 128 416C145.7 416 160 401.7 160 384C160 366.3 145.7 352 128 352C110.3 352 96 366.3 96 384C96 386.9 96.38 389.6 97.08 392.3L1.724 487.6L51.47 309.1C56.21 293.1 69.8 280.1 86.9 276.1L170.3 256.9L255.1 341.7z\"]\n};\nvar faPenNib = {\n  prefix: 'fas',\n  iconName: 'pen-nib',\n  icon: [512, 512, [10001], \"f5ad\", \"M368.4 18.34C390.3-3.526 425.7-3.526 447.6 18.34L493.7 64.4C515.5 86.27 515.5 121.7 493.7 143.6L437.9 199.3L312.7 74.06L368.4 18.34zM417.4 224L371.4 377.3C365.4 397.2 350.2 413 330.5 419.6L66.17 508.2C54.83 512 42.32 509.2 33.74 500.9L187.3 347.3C193.6 350.3 200.6 352 207.1 352C234.5 352 255.1 330.5 255.1 304C255.1 277.5 234.5 256 207.1 256C181.5 256 159.1 277.5 159.1 304C159.1 311.4 161.7 318.4 164.7 324.7L11.11 478.3C2.809 469.7-.04 457.2 3.765 445.8L92.39 181.5C98.1 161.8 114.8 146.6 134.7 140.6L287.1 94.6L417.4 224z\"]\n};\nvar faPenRuler = {\n  prefix: 'fas',\n  iconName: 'pen-ruler',\n  icon: [512, 512, [\"pencil-ruler\"], \"f5ae\", \"M492.7 42.75C517.7 67.74 517.7 108.3 492.7 133.3L436.3 189.7L322.3 75.72L378.7 19.32C403.7-5.678 444.3-5.678 469.3 19.32L492.7 42.75zM44.89 353.2L299.7 98.34L413.7 212.3L158.8 467.1C152.1 473.8 143.8 478.7 134.6 481.4L30.59 511.1C22.21 513.5 13.19 511.1 7.03 504.1C.8669 498.8-1.47 489.8 .9242 481.4L30.65 377.4C33.26 368.2 38.16 359.9 44.89 353.2zM249.4 103.4L103.4 249.4L16 161.9C-2.745 143.2-2.745 112.8 16 94.06L94.06 16C112.8-2.745 143.2-2.745 161.9 16L181.7 35.76C181.4 36.05 181 36.36 180.7 36.69L116.7 100.7C110.4 106.9 110.4 117.1 116.7 123.3C122.9 129.6 133.1 129.6 139.3 123.3L203.3 59.31C203.6 58.99 203.1 58.65 204.2 58.3L249.4 103.4zM453.7 307.8C453.4 308 453 308.4 452.7 308.7L388.7 372.7C382.4 378.9 382.4 389.1 388.7 395.3C394.9 401.6 405.1 401.6 411.3 395.3L475.3 331.3C475.6 330.1 475.1 330.6 476.2 330.3L496 350.1C514.7 368.8 514.7 399.2 496 417.9L417.9 496C399.2 514.7 368.8 514.7 350.1 496L262.6 408.6L408.6 262.6L453.7 307.8z\"]\n};\nvar faPencilRuler = faPenRuler;\nvar faPenToSquare = {\n  prefix: 'fas',\n  iconName: 'pen-to-square',\n  icon: [512, 512, [\"edit\"], \"f044\", \"M490.3 40.4C512.2 62.27 512.2 97.73 490.3 119.6L460.3 149.7L362.3 51.72L392.4 21.66C414.3-.2135 449.7-.2135 471.6 21.66L490.3 40.4zM172.4 241.7L339.7 74.34L437.7 172.3L270.3 339.6C264.2 345.8 256.7 350.4 248.4 353.2L159.6 382.8C150.1 385.6 141.5 383.4 135 376.1C128.6 370.5 126.4 361 129.2 352.4L158.8 263.6C161.6 255.3 166.2 247.8 172.4 241.7V241.7zM192 63.1C209.7 63.1 224 78.33 224 95.1C224 113.7 209.7 127.1 192 127.1H96C78.33 127.1 64 142.3 64 159.1V416C64 433.7 78.33 448 96 448H352C369.7 448 384 433.7 384 416V319.1C384 302.3 398.3 287.1 416 287.1C433.7 287.1 448 302.3 448 319.1V416C448 469 405 512 352 512H96C42.98 512 0 469 0 416V159.1C0 106.1 42.98 63.1 96 63.1H192z\"]\n};\nvar faEdit = faPenToSquare;\nvar faPencil = {\n  prefix: 'fas',\n  iconName: 'pencil',\n  icon: [512, 512, [61504, 9999, \"pencil-alt\"], \"f303\", \"M421.7 220.3L188.5 453.4L154.6 419.5L158.1 416H112C103.2 416 96 408.8 96 400V353.9L92.51 357.4C87.78 362.2 84.31 368 82.42 374.4L59.44 452.6L137.6 429.6C143.1 427.7 149.8 424.2 154.6 419.5L188.5 453.4C178.1 463.8 165.2 471.5 151.1 475.6L30.77 511C22.35 513.5 13.24 511.2 7.03 504.1C.8198 498.8-1.502 489.7 .976 481.2L36.37 360.9C40.53 346.8 48.16 333.9 58.57 323.5L291.7 90.34L421.7 220.3zM492.7 58.75C517.7 83.74 517.7 124.3 492.7 149.3L444.3 197.7L314.3 67.72L362.7 19.32C387.7-5.678 428.3-5.678 453.3 19.32L492.7 58.75z\"]\n};\nvar faPencilAlt = faPencil;\nvar faPeopleArrowsLeftRight = {\n  prefix: 'fas',\n  iconName: 'people-arrows-left-right',\n  icon: [576, 512, [\"people-arrows\"], \"e068\", \"M96 304.1c0-12.16 4.971-23.83 13.64-32.01l72.13-68.08c1.65-1.555 3.773-2.311 5.611-3.578C177.1 176.8 155 160 128 160H64C28.65 160 0 188.7 0 224v96c0 17.67 14.33 32 31.1 32L32 480c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-96.39l-50.36-47.53C100.1 327.9 96 316.2 96 304.1zM480 128c35.38 0 64-28.62 64-64s-28.62-64-64-64s-64 28.62-64 64S444.6 128 480 128zM96 128c35.38 0 64-28.62 64-64S131.4 0 96 0S32 28.62 32 64S60.63 128 96 128zM444.4 295.3L372.3 227.3c-3.49-3.293-8.607-4.193-13.01-2.299C354.9 226.9 352 231.2 352 236V272H224V236c0-4.795-2.857-9.133-7.262-11.03C212.3 223.1 207.2 223.1 203.7 227.3L131.6 295.3c-4.805 4.535-4.805 12.94 0 17.47l72.12 68.07c3.49 3.291 8.607 4.191 13.01 2.297C221.1 381.3 224 376.9 224 372.1V336h128v36.14c0 4.795 2.857 9.135 7.262 11.04c4.406 1.893 9.523 .9922 13.01-2.299l72.12-68.07C449.2 308.3 449.2 299.9 444.4 295.3zM512 160h-64c-26.1 0-49.98 16.77-59.38 40.42c1.842 1.271 3.969 2.027 5.623 3.588l72.12 68.06C475 280.2 480 291.9 480 304.1c.002 12.16-4.969 23.83-13.64 32.01L416 383.6V480c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-128c17.67 0 32-14.33 32-32V224C576 188.7 547.3 160 512 160z\"]\n};\nvar faPeopleArrows = faPeopleArrowsLeftRight;\nvar faPeopleCarryBox = {\n  prefix: 'fas',\n  iconName: 'people-carry-box',\n  icon: [640, 512, [\"people-carry\"], \"f4ce\", \"M128 95.1c26.5 0 47.1-21.5 47.1-47.1S154.5 0 128 0S80.01 21.5 80.01 47.1S101.5 95.1 128 95.1zM511.1 95.1c26.5 0 47.1-21.5 47.1-47.1S538.5 0 511.1 0c-26.5 0-48 21.5-48 47.1S485.5 95.1 511.1 95.1zM603.5 258.3l-18.5-80.13c-4.625-20-18.62-36.88-37.5-44.88c-18.5-8-38.1-6.75-56.12 3.25c-22.62 13.38-39.62 34.5-48.12 59.38l-11.25 33.88l-15.1 10.25L415.1 144c0-8.75-7.25-16-16-16H240c-8.75 0-16 7.25-16 16L224 239.1l-16.12-10.25l-11.25-33.88c-8.375-25-25.38-46-48.12-59.38c-17.25-10-37.63-11.25-56.12-3.25c-18.88 8-32.88 24.88-37.5 44.88l-18.37 80.13c-4.625 20 .7506 41.25 14.37 56.75l67.25 75.88l10.12 92.63C130 499.8 143.8 512 160 512c1.25 0 2.25-.125 3.5-.25c17.62-1.875 30.25-17.62 28.25-35.25l-10-92.75c-1.5-13-7-25.12-15.62-35l-43.37-49l17.62-70.38l6.876 20.38c4 12.5 11.87 23.5 24.5 32.63l51 32.5c4.623 2.875 12.12 4.625 17.25 5h159.1c5.125-.375 12.62-2.125 17.25-5l51-32.5c12.62-9.125 20.5-20 24.5-32.63l6.875-20.38l17.63 70.38l-43.37 49c-8.625 9.875-14.12 22-15.62 35l-10 92.75c-2 17.62 10.75 33.38 28.25 35.25C477.7 511.9 478.7 512 479.1 512c16.12 0 29.1-12.12 31.75-28.5l10.12-92.63L589.1 315C602.7 299.5 608.1 278.3 603.5 258.3zM46.26 358.1l-44 110c-6.5 16.38 1.5 35 17.88 41.63c16.75 6.5 35.12-1.75 41.62-17.88l27.62-69.13l-2-18.25L46.26 358.1zM637.7 468.1l-43.1-110l-41.13 46.38l-2 18.25l27.62 69.13C583.2 504.4 595.2 512 607.1 512c3.998 0 7.998-.75 11.87-2.25C636.2 503.1 644.2 484.5 637.7 468.1z\"]\n};\nvar faPeopleCarry = faPeopleCarryBox;\nvar faPeopleGroup = {\n  prefix: 'fas',\n  iconName: 'people-group',\n  icon: [640, 512, [], \"e533\", \"M184 88C184 118.9 158.9 144 128 144C97.07 144 72 118.9 72 88C72 57.07 97.07 32 128 32C158.9 32 184 57.07 184 88zM208.4 196.3C178.7 222.7 160 261.2 160 304C160 338.3 171.1 369.8 192 394.5V416C192 433.7 177.7 448 160 448H96C78.33 448 64 433.7 64 416V389.2C26.16 371.2 0 332.7 0 288C0 226.1 50.14 176 112 176H144C167.1 176 190.2 183.5 208.4 196.3V196.3zM64 245.7C54.04 256.9 48 271.8 48 288C48 304.2 54.04 319.1 64 330.3V245.7zM448 416V394.5C468 369.8 480 338.3 480 304C480 261.2 461.3 222.7 431.6 196.3C449.8 183.5 472 176 496 176H528C589.9 176 640 226.1 640 288C640 332.7 613.8 371.2 576 389.2V416C576 433.7 561.7 448 544 448H480C462.3 448 448 433.7 448 416zM576 330.3C585.1 319.1 592 304.2 592 288C592 271.8 585.1 256.9 576 245.7V330.3zM568 88C568 118.9 542.9 144 512 144C481.1 144 456 118.9 456 88C456 57.07 481.1 32 512 32C542.9 32 568 57.07 568 88zM256 96C256 60.65 284.7 32 320 32C355.3 32 384 60.65 384 96C384 131.3 355.3 160 320 160C284.7 160 256 131.3 256 96zM448 304C448 348.7 421.8 387.2 384 405.2V448C384 465.7 369.7 480 352 480H288C270.3 480 256 465.7 256 448V405.2C218.2 387.2 192 348.7 192 304C192 242.1 242.1 192 304 192H336C397.9 192 448 242.1 448 304zM256 346.3V261.7C246 272.9 240 287.8 240 304C240 320.2 246 335.1 256 346.3zM384 261.7V346.3C393.1 335 400 320.2 400 304C400 287.8 393.1 272.9 384 261.7z\"]\n};\nvar faPeopleLine = {\n  prefix: 'fas',\n  iconName: 'people-line',\n  icon: [640, 512, [], \"e534\", \"M360 72C360 94.09 342.1 112 320 112C297.9 112 280 94.09 280 72C280 49.91 297.9 32 320 32C342.1 32 360 49.91 360 72zM104 168C104 145.9 121.9 128 144 128C166.1 128 184 145.9 184 168C184 190.1 166.1 208 144 208C121.9 208 104 190.1 104 168zM608 416C625.7 416 640 430.3 640 448C640 465.7 625.7 480 608 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H608zM456 168C456 145.9 473.9 128 496 128C518.1 128 536 145.9 536 168C536 190.1 518.1 208 496 208C473.9 208 456 190.1 456 168zM200 352C200 369.7 185.7 384 168 384H120C102.3 384 88 369.7 88 352V313.5L61.13 363.4C54.85 375 40.29 379.4 28.62 373.1C16.95 366.8 12.58 352.3 18.87 340.6L56.75 270.3C72.09 241.8 101.9 224 134.2 224H153.8C170.1 224 185.7 228.5 199.2 236.6L232.7 174.3C248.1 145.8 277.9 128 310.2 128H329.8C362.1 128 391.9 145.8 407.3 174.3L440.8 236.6C454.3 228.5 469.9 224 486.2 224H505.8C538.1 224 567.9 241.8 583.3 270.3L621.1 340.6C627.4 352.3 623 366.8 611.4 373.1C599.7 379.4 585.2 375 578.9 363.4L552 313.5V352C552 369.7 537.7 384 520 384H472C454.3 384 440 369.7 440 352V313.5L413.1 363.4C406.8 375 392.3 379.4 380.6 373.1C368.1 366.8 364.6 352.3 370.9 340.6L407.2 273.1C405.5 271.5 404 269.6 402.9 267.4L376 217.5V272C376 289.7 361.7 304 344 304H295.1C278.3 304 263.1 289.7 263.1 272V217.5L237.1 267.4C235.1 269.6 234.5 271.5 232.8 273.1L269.1 340.6C275.4 352.3 271 366.8 259.4 373.1C247.7 379.4 233.2 375 226.9 363.4L199.1 313.5L200 352z\"]\n};\nvar faPeoplePulling = {\n  prefix: 'fas',\n  iconName: 'people-pulling',\n  icon: [576, 512, [], \"e535\", \"M32 48C32 21.49 53.49 0 80 0C106.5 0 128 21.49 128 48C128 74.51 106.5 96 80 96C53.49 96 32 74.51 32 48V48zM118.3 128C130.1 128 143.5 130.5 155.2 135.4L289.3 191.2C302.6 171.1 320.1 156.6 342.7 146.9L353.7 142C374.5 132.8 396.1 128 419.7 128C464.3 128 504.5 154.8 521.6 195.9L536.1 232.7L558.3 243.4C574.1 251.3 580.5 270.5 572.6 286.3C564.7 302.1 545.5 308.5 529.7 300.6L503 287.3C492.7 282.1 484.6 273.4 480.2 262.8L470.6 239.8L451.3 305.3L500.8 359.4C506.2 365.3 510.1 372.4 512 380.2L535 472.2C539.3 489.4 528.9 506.8 511.8 511C494.6 515.3 477.2 504.9 472.1 487.8L450.9 399.6L380.3 322.5C365.5 306.4 359.1 283.9 365.6 262.8L382.5 199.3C381.6 199.7 380.6 200.1 379.7 200.5L368.7 205.4C353.4 212.2 341.4 224.6 335.2 240.1L333.7 243.9C328.6 256.7 316.1 264.4 303 263.1C299.2 263.9 295.4 263.1 291.7 261.5L173.3 212.2L231.2 473.1C235.1 490.3 224.2 507.4 206.9 511.2C189.7 515.1 172.6 504.2 168.8 486.9L138.8 352H123.1L143.6 474.7C146.5 492.2 134.7 508.7 117.3 511.6C99.83 514.5 83.34 502.7 80.44 485.3L56.35 340.8C50.48 347.6 41.75 352 32 352C14.33 352 0 337.7 0 319.1V191.1C0 156.7 28.65 127.1 64 127.1L118.3 128zM416 48C416 21.49 437.5 0 464 0C490.5 0 512 21.49 512 48C512 74.51 490.5 96 464 96C437.5 96 416 74.51 416 48V48zM356.7 344.2L397.4 388.6L382.9 424.8C380.5 430.9 376.9 436.4 372.3 440.9L310.6 502.6C298.1 515.1 277.9 515.1 265.4 502.6C252.9 490.1 252.9 469.9 265.4 457.4L324.7 398L349.7 335.6C351.8 338.6 354.2 341.4 356.7 344.2H356.7z\"]\n};\nvar faPeopleRobbery = {\n  prefix: 'fas',\n  iconName: 'people-robbery',\n  icon: [576, 512, [], \"e536\", \"M496.1 24.24C501.2 7.093 518.6-3.331 535.8 .9552C552.9 5.242 563.3 22.62 559 39.76L550.3 74.63C539.3 118.6 510.1 154.2 472 174.3V480C472 497.7 457.7 512 440 512C422.3 512 408 497.7 408 480V352H392V480C392 497.7 377.7 512 360 512C342.3 512 328 497.7 328 480V174.3C289.9 154.2 260.7 118.6 249.7 74.63L240.1 39.76C236.7 22.62 247.1 5.242 264.2 .9552C281.4-3.331 298.8 7.093 303 24.24L311.8 59.1C321.9 99.59 358.3 127.1 400 127.1C441.7 127.1 478.1 99.59 488.2 59.1L496.1 24.24zM352 47.1C352 21.49 373.5-.0006 400-.0006C426.5-.0006 448 21.49 448 47.1C448 74.51 426.5 95.1 400 95.1C373.5 95.1 352 74.51 352 47.1V47.1zM32.01 48C32.01 21.49 53.5 0 80.01 0C106.5 0 128 21.49 128 48C128 74.51 106.5 96 80.01 96C53.5 96 32.01 74.51 32.01 48V48zM104.7 128C132.1 128 157.6 142 172.2 165.1L209.6 224H240C257.7 224 272 238.3 272 256C272 273.7 257.7 288 240 288H192C181 288 170.9 282.4 164.1 273.1L152 252.7V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V352H72V480C72 497.7 57.68 512 40 512C22.33 512 8.005 497.7 8.005 480V288.6L8 287.1V191.1C8 156.7 36.65 127.1 72 127.1L104.7 128z\"]\n};\nvar faPeopleRoof = {\n  prefix: 'fas',\n  iconName: 'people-roof',\n  icon: [640, 512, [], \"e537\", \"M623.5 164C638.1 172.6 644.6 192.1 635.1 207.5C627.4 222.1 607.9 228.6 592.5 219.1L319.1 68.61L47.54 219.1C32.09 228.6 12.61 222.1 4.025 207.5C-4.558 192.1 1.008 172.6 16.46 164L304.5 4.027C314.1-1.342 325.9-1.342 335.5 4.027L623.5 164zM279.1 200C279.1 177.9 297.9 160 319.1 160C342.1 160 359.1 177.9 359.1 200C359.1 222.1 342.1 240 319.1 240C297.9 240 279.1 222.1 279.1 200zM103.1 296C103.1 273.9 121.9 256 143.1 256C166.1 256 183.1 273.9 183.1 296C183.1 318.1 166.1 336 143.1 336C121.9 336 103.1 318.1 103.1 296V296zM535.1 296C535.1 318.1 518.1 336 495.1 336C473.9 336 455.1 318.1 455.1 296C455.1 273.9 473.9 256 495.1 256C518.1 256 535.1 273.9 535.1 296zM226.9 491.4L199.1 441.5V480C199.1 497.7 185.7 512 167.1 512H119.1C102.3 512 87.1 497.7 87.1 480V441.5L61.13 491.4C54.84 503 40.29 507.4 28.62 501.1C16.95 494.8 12.58 480.3 18.87 468.6L56.74 398.3C72.09 369.8 101.9 352 134.2 352H153.8C170.1 352 185.7 356.5 199.2 364.6L232.7 302.3C248.1 273.8 277.9 255.1 310.2 255.1H329.8C362.1 255.1 391.9 273.8 407.3 302.3L440.8 364.6C454.3 356.5 469.9 352 486.2 352H505.8C538.1 352 567.9 369.8 583.3 398.3L621.1 468.6C627.4 480.3 623 494.8 611.4 501.1C599.7 507.4 585.2 503 578.9 491.4L551.1 441.5V480C551.1 497.7 537.7 512 519.1 512H471.1C454.3 512 439.1 497.7 439.1 480V441.5L413.1 491.4C406.8 503 392.3 507.4 380.6 501.1C368.1 494.8 364.6 480.3 370.9 468.6L407.2 401.1C405.5 399.5 404 397.6 402.9 395.4L375.1 345.5V400C375.1 417.7 361.7 432 343.1 432H295.1C278.3 432 263.1 417.7 263.1 400V345.5L237.1 395.4C235.1 397.6 234.5 399.5 232.8 401.1L269.1 468.6C275.4 480.3 271 494.8 259.4 501.1C247.7 507.4 233.2 503 226.9 491.4H226.9z\"]\n};\nvar faPepperHot = {\n  prefix: 'fas',\n  iconName: 'pepper-hot',\n  icon: [512, 512, [127798], \"f816\", \"M465 134.2c21.46-38.38 19.87-87.17-5.65-123.1c-7.541-10.83-22.31-13.53-33.2-5.938c-10.77 7.578-13.44 22.55-5.896 33.41c14.41 20.76 15.13 47.69 4.098 69.77C407.1 100.1 388 95.1 368 95.1c-36.23 0-68.93 13.83-94.24 35.92L352 165.5V256h90.56l33.53 78.23C498.2 308.9 512 276.2 512 239.1C512 198 493.7 160.6 465 134.2zM320 288V186.6l-52.95-22.69C216.2 241.3 188.5 400 56 400C25.13 400 0 425.1 0 456S25.13 512 56 512c180.3 0 320.1-88.27 389.3-168.5L421.5 288H320z\"]\n};\nvar faPercent = {\n  prefix: 'fas',\n  iconName: 'percent',\n  icon: [384, 512, [62101, 62785, \"percentage\"], \"25\", \"M374.6 73.39c-12.5-12.5-32.75-12.5-45.25 0l-320 320c-12.5 12.5-12.5 32.75 0 45.25C15.63 444.9 23.81 448 32 448s16.38-3.125 22.62-9.375l320-320C387.1 106.1 387.1 85.89 374.6 73.39zM64 192c35.3 0 64-28.72 64-64S99.3 64.01 64 64.01S0 92.73 0 128S28.7 192 64 192zM320 320c-35.3 0-64 28.72-64 64s28.7 64 64 64s64-28.72 64-64S355.3 320 320 320z\"]\n};\nvar faPercentage = faPercent;\nvar faPerson = {\n  prefix: 'fas',\n  iconName: 'person',\n  icon: [320, 512, [129485, \"male\"], \"f183\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L315.4 271.5C324.5 286.7 319.6 306.3 304.5 315.4C289.3 324.5 269.7 319.6 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352z\"]\n};\nvar faMale = faPerson;\nvar faPersonArrowDownToLine = {\n  prefix: 'fas',\n  iconName: 'person-arrow-down-to-line',\n  icon: [640, 512, [], \"e538\", \"M144 48C144 21.49 165.5 0 192 0C218.5 0 240 21.49 240 48C240 74.51 218.5 96 192 96C165.5 96 144 74.51 144 48zM120 256.9L91.43 304.5C82.33 319.6 62.67 324.5 47.52 315.4C32.37 306.3 27.47 286.7 36.57 271.5L94.85 174.6C112.2 145.7 143.4 128 177.1 128H206.9C240.6 128 271.8 145.7 289.2 174.6L347.4 271.5C356.5 286.7 351.6 306.3 336.5 315.4C321.3 324.5 301.7 319.6 292.6 304.5L264 256.9V448H608C625.7 448 640 462.3 640 480C640 497.7 625.7 512 608 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H120L120 256.9zM200 448V352H184V448H200zM393.4 326.6C380.9 314.1 380.9 293.9 393.4 281.4C405.9 268.9 426.1 268.9 438.6 281.4L464 306.7V64C464 46.33 478.3 32 496 32C513.7 32 528 46.33 528 64V306.7L553.4 281.4C565.9 268.9 586.1 268.9 598.6 281.4C611.1 293.9 611.1 314.1 598.6 326.6L518.6 406.6C506.1 419.1 485.9 419.1 473.4 406.6L393.4 326.6z\"]\n};\nvar faPersonArrowUpFromLine = {\n  prefix: 'fas',\n  iconName: 'person-arrow-up-from-line',\n  icon: [640, 512, [], \"e539\", \"M144 48C144 21.49 165.5 0 192 0C218.5 0 240 21.49 240 48C240 74.51 218.5 96 192 96C165.5 96 144 74.51 144 48zM120 256.9L91.43 304.5C82.33 319.6 62.67 324.5 47.52 315.4C32.37 306.3 27.47 286.7 36.57 271.5L94.85 174.6C112.2 145.7 143.4 128 177.1 128H206.9C240.6 128 271.8 145.7 289.2 174.6L347.4 271.5C356.5 286.7 351.6 306.3 336.5 315.4C321.3 324.5 301.7 319.6 292.6 304.5L264 256.9V448H608C625.7 448 640 462.3 640 480C640 497.7 625.7 512 608 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H120L120 256.9zM200 448V352H184V448H200zM598.6 121.4C611.1 133.9 611.1 154.1 598.6 166.6C586.1 179.1 565.9 179.1 553.4 166.6L528 141.3V384C528 401.7 513.7 416 496 416C478.3 416 464 401.7 464 384V141.3L438.6 166.6C426.1 179.1 405.9 179.1 393.4 166.6C380.9 154.1 380.9 133.9 393.4 121.4L473.4 41.37C485.9 28.88 506.1 28.88 518.6 41.37L598.6 121.4z\"]\n};\nvar faPersonBiking = {\n  prefix: 'fas',\n  iconName: 'person-biking',\n  icon: [640, 512, [128692, \"biking\"], \"f84a\", \"M352 48C352 21.49 373.5 0 400 0C426.5 0 448 21.49 448 48C448 74.51 426.5 96 400 96C373.5 96 352 74.51 352 48zM480 159.1C497.7 159.1 512 174.3 512 191.1C512 209.7 497.7 223.1 480 223.1H416C408.7 223.1 401.7 221.5 396 216.1L355.3 184.4L295 232.9L337.8 261.4C346.7 267.3 352 277.3 352 288V416C352 433.7 337.7 448 320 448C302.3 448 288 433.7 288 416V305.1L227.5 266.8C194.7 245.1 192.5 198.9 223.2 175.2L306.3 110.9C323.8 97.45 348.1 97.58 365.4 111.2L427.2 159.1H480zM256 384C256 454.7 198.7 512 128 512C57.31 512 0 454.7 0 384C0 313.3 57.31 256 128 256C198.7 256 256 313.3 256 384zM128 312C88.24 312 56 344.2 56 384C56 423.8 88.24 456 128 456C167.8 456 200 423.8 200 384C200 344.2 167.8 312 128 312zM640 384C640 454.7 582.7 512 512 512C441.3 512 384 454.7 384 384C384 313.3 441.3 256 512 256C582.7 256 640 313.3 640 384zM512 312C472.2 312 440 344.2 440 384C440 423.8 472.2 456 512 456C551.8 456 584 423.8 584 384C584 344.2 551.8 312 512 312z\"]\n};\nvar faBiking = faPersonBiking;\nvar faPersonBooth = {\n  prefix: 'fas',\n  iconName: 'person-booth',\n  icon: [576, 512, [], \"f756\", \"M192 496C192 504.8 199.3 512 208 512h32C248.8 512 256 504.8 256 496V320H192V496zM544 0h-32v496c0 8.75 7.25 16 16 16h32c8.75 0 16-7.25 16-16V32C576 14.25 561.8 0 544 0zM64 128c26.5 0 48-21.5 48-48S90.5 32 64 32S16 53.5 16 80S37.5 128 64 128zM224 224H173.1L127.9 178.8C115.8 166.6 99.75 160 82.75 160H64C46.88 160 30.75 166.8 18.75 178.8c-12 12.12-18.72 28.22-18.72 45.35L0 480c0 17.75 14.25 32 31.88 32s32-14.25 32-32L64 379.3c.875 .5 1.625 1.375 2.5 1.75L95.63 424V480c0 17.75 14.25 32 32 32c17.62 0 32-14.25 32-32v-56.5c0-9.875-2.375-19.75-6.75-28.62l-41.13-61.25V253l20.88 20.88C141.8 283 153.8 288 166.5 288H224c17.75 0 32-14.25 32-32S241.8 224 224 224zM192 32v160h64V0H224C206.3 0 192 14.25 192 32zM288 32l31.5 223.1l-30.88 154.6C284.3 431.3 301.6 448 320 448c15.25 0 27.99-9.125 32.24-30.38C353.3 434.5 366.9 448 384 448c17.75 0 32-14.25 32-32c0 17.75 14.25 32 32 32s32-14.25 32-32V0h-192V32z\"]\n};\nvar faPersonBreastfeeding = {\n  prefix: 'fas',\n  iconName: 'person-breastfeeding',\n  icon: [448, 512, [], \"e53a\", \"M144 80C144 35.82 179.8 0 224 0C268.2 0 304 35.82 304 80C304 124.2 268.2 160 224 160C179.8 160 144 124.2 144 80zM436.8 382.8L373.5 461.1C356.9 482.7 326.7 486 306 469.5C288.4 455.4 283.3 431.3 292.5 411.7L291.7 411.6C252.8 406.1 217.4 386.5 192 356.8V320C192 302.3 177.7 288 160 288C142.3 288 128 302.3 128 320V368C128 368.8 128 369.6 128.1 370.4L229.5 421.1C253.2 432.9 262.8 461.8 250.9 485.5C239.1 509.2 210.2 518.8 186.5 506.9L27.21 427.3C26.11 426.7 25.02 426.2 23.95 425.5C19.04 422.7 14.79 419.1 11.3 414.1C6.732 409.5 3.492 403.3 1.683 396.6C-1.576 384.6-.1811 371.4 6.459 359.9C7.098 358.8 7.776 357.8 8.489 356.7L75.56 256.1C102.3 216.1 147.2 192 195.4 192H270.6C317.1 192 360.7 214.5 387.8 252.3L438.5 323.2C440.7 326.2 442.5 329.4 443.9 332.7C446.9 339.3 448.2 346.4 447.1 353.5C447.7 364.1 443.8 374.5 436.8 382.8V382.8zM276 288C251.7 288 232 307.7 232 332C232 356.3 251.7 376 276 376C300.3 376 320 356.3 320 332C320 307.7 300.3 288 276 288z\"]\n};\nvar faPersonBurst = {\n  prefix: 'fas',\n  iconName: 'person-burst',\n  icon: [640, 512, [], \"e53b\", \"M431.1 48C431.1 21.49 453.5 0 479.1 0C506.5 0 527.1 21.49 527.1 48C527.1 74.51 506.5 96 479.1 96C453.5 96 431.1 74.51 431.1 48zM439.1 512C422.3 512 407.1 497.7 407.1 480V256.9L379.4 304.5C370.3 319.6 350.7 324.5 335.5 315.4C320.4 306.3 315.5 286.7 324.6 271.5L382.8 174.6C400.2 145.7 431.4 128 465.1 128H494.9C528.6 128 559.8 145.7 577.2 174.6L635.4 271.5C644.5 286.7 639.6 306.3 624.5 315.4C609.3 324.5 589.7 319.6 580.6 304.5L551.1 256.9V480C551.1 497.7 537.7 512 519.1 512C502.3 512 487.1 497.7 487.1 480V352H471.1V480C471.1 497.7 457.7 512 439.1 512L439.1 512zM220.3 92.05L296.4 68.93C302.7 67.03 309.5 69.14 313.6 74.27C317.7 79.39 318.2 86.49 314.1 92.18L275.5 161.3L330.7 199.3L306.3 239.8L255.8 247.6L261.4 327C261.8 333.6 258.3 339.7 252.4 342.6C246.5 345.4 239.4 344.4 234.6 339.9L175.1 286.1L117.4 339.9C112.6 344.4 105.5 345.4 99.63 342.6C93.73 339.7 90.15 333.6 90.62 327L96.21 247.6L17.55 235.4C11.08 234.4 5.868 229.6 4.41 223.2C2.951 216.8 5.538 210.1 10.94 206.4L76.5 161.3L37.01 92.18C33.76 86.49 34.31 79.39 38.39 74.27C42.48 69.14 49.28 67.03 55.55 68.93L131.7 92.05L161.1 18.09C163.6 11.1 169.4 7.1 175.1 7.1C182.6 7.1 188.4 11.1 190.9 18.09L220.3 92.05z\"]\n};\nvar faPersonCane = {\n  prefix: 'fas',\n  iconName: 'person-cane',\n  icon: [384, 512, [], \"e53c\", \"M240 48C240 74.51 218.5 96 192 96C165.5 96 144 74.51 144 48C144 21.49 165.5 0 192 0C218.5 0 240 21.49 240 48zM232 480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352H152V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H181C209.6 128 236.7 140.7 254.9 162.7L328.6 251.6C339.9 265.2 338 285.3 324.4 296.6C310.8 307.9 290.7 306 279.4 292.4L232 235.3L232 480zM320 384C320 397.3 309.3 408 296 408C282.7 408 272 397.3 272 384V376C272 345.1 297.1 320 328 320C358.9 320 384 345.1 384 376V488C384 501.3 373.3 512 360 512C346.7 512 336 501.3 336 488V376C336 371.6 332.4 368 328 368C323.6 368 320 371.6 320 376V384z\"]\n};\nvar faPersonChalkboard = {\n  prefix: 'fas',\n  iconName: 'person-chalkboard',\n  icon: [640, 512, [], \"e53d\", \"M144 48C144 21.49 165.5 0 192 0C218.5 0 240 21.49 240 48C240 74.51 218.5 96 192 96C165.5 96 144 74.51 144 48zM152 512C134.3 512 120 497.7 120 480V256.9L91.43 304.5C82.33 319.6 62.67 324.5 47.52 315.4C32.37 306.3 27.47 286.7 36.58 271.5L94.85 174.6C112.2 145.7 143.4 128 177.1 128H320V48C320 21.49 341.5 .0003 368 .0003H592C618.5 .0003 640 21.49 640 48V272C640 298.5 618.5 320 592 320H368C341.5 320 320 298.5 320 272V224H384V256H576V64H384V128H400C417.7 128 432 142.3 432 160C432 177.7 417.7 192 400 192H264V480C264 497.7 249.7 512 232 512C214.3 512 200 497.7 200 480V352H184V480C184 497.7 169.7 512 152 512L152 512z\"]\n};\nvar faPersonCircleCheck = {\n  prefix: 'fas',\n  iconName: 'person-circle-check',\n  icon: [576, 512, [], \"e53e\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L302.1 249.3C285.1 266.9 273.4 287.7 265.5 310.8C263.6 308.9 261.1 306.8 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM476.7 324.7L416 385.4L387.3 356.7C381.1 350.4 370.9 350.4 364.7 356.7C358.4 362.9 358.4 373.1 364.7 379.3L404.7 419.3C410.9 425.6 421.1 425.6 427.3 419.3L499.3 347.3C505.6 341.1 505.6 330.9 499.3 324.7C493.1 318.4 482.9 318.4 476.7 324.7H476.7z\"]\n};\nvar faPersonCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'person-circle-exclamation',\n  icon: [576, 512, [], \"e53f\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L302.1 249.3C285.1 266.9 273.4 287.7 265.5 310.8C263.6 308.9 261.1 306.8 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464zM415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288z\"]\n};\nvar faPersonCircleMinus = {\n  prefix: 'fas',\n  iconName: 'person-circle-minus',\n  icon: [576, 512, [], \"e540\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L302.1 249.3C285.1 266.9 273.4 287.7 265.5 310.8C263.6 308.9 261.1 306.8 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM496 351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1z\"]\n};\nvar faPersonCirclePlus = {\n  prefix: 'fas',\n  iconName: 'person-circle-plus',\n  icon: [576, 512, [], \"e541\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L302.1 249.3C285.1 266.9 273.4 287.7 265.5 310.8C263.6 308.9 261.1 306.8 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM448 303.1C448 295.2 440.8 287.1 432 287.1C423.2 287.1 416 295.2 416 303.1V351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H416V431.1C416 440.8 423.2 447.1 432 447.1C440.8 447.1 448 440.8 448 431.1V383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1H448V303.1z\"]\n};\nvar faPersonCircleQuestion = {\n  prefix: 'fas',\n  iconName: 'person-circle-question',\n  icon: [576, 512, [], \"e542\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L302.1 249.3C285.1 266.9 273.4 287.7 265.5 310.8C263.6 308.9 261.1 306.8 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464zM368 328C368 336.8 375.2 344 384 344C392.8 344 400 336.8 400 328V321.6C400 316.3 404.3 312 409.6 312H450.1C457.8 312 464 318.2 464 325.9C464 331.1 461.1 335.8 456.6 338.3L424.6 355.1C419.3 357.9 416 363.3 416 369.2V384C416 392.8 423.2 400 432 400C440.8 400 448 392.8 448 384V378.9L471.5 366.6C486.5 358.6 496 342.1 496 325.9C496 300.6 475.4 280 450.1 280H409.6C386.6 280 368 298.6 368 321.6V328z\"]\n};\nvar faPersonCircleXmark = {\n  prefix: 'fas',\n  iconName: 'person-circle-xmark',\n  icon: [576, 512, [], \"e543\", \"M208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48zM152 352V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H174.9C208.6 128 239.8 145.7 257.2 174.6L302.1 249.3C285.1 266.9 273.4 287.7 265.5 310.8C263.6 308.9 261.1 306.8 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352L152 352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM491.3 331.3C497.6 325.1 497.6 314.9 491.3 308.7C485.1 302.4 474.9 302.4 468.7 308.7L432 345.4L395.3 308.7C389.1 302.4 378.9 302.4 372.7 308.7C366.4 314.9 366.4 325.1 372.7 331.3L409.4 368L372.7 404.7C366.4 410.9 366.4 421.1 372.7 427.3C378.9 433.6 389.1 433.6 395.3 427.3L432 390.6L468.7 427.3C474.9 433.6 485.1 433.6 491.3 427.3C497.6 421.1 497.6 410.9 491.3 404.7L454.6 368L491.3 331.3z\"]\n};\nvar faPersonDigging = {\n  prefix: 'fas',\n  iconName: 'person-digging',\n  icon: [576, 512, [\"digging\"], \"f85e\", \"M272 95.93c26.5 0 47.99-21.47 47.99-47.97S298.5 0 272 0C245.5 0 224 21.47 224 47.97S245.5 95.93 272 95.93zM209.7 357.3c-25.75-17.25-52.25-33.24-79.5-48.11L58.62 270.2L1.246 471.1c-4.875 16.1 4.1 34.74 22 39.62s34.63-4.998 39.5-21.99l36.63-128.1l60.63 40.37v78.86c0 17.62 14.38 31.99 32 31.99s32-14.37 32-31.99l.0022-95.93C224 373.2 218.6 363.2 209.7 357.3zM311.1 416c-13.88 0-25.95 8.863-30.33 21.86l-24.75 74.07h319.9l-101.9-206.3c-11.38-22.49-43.1-23.63-56.1-2.01l-31.89 54.21l-65.26-35.64l-24-121.2C288.1 161.3 263.2 127.7 227.1 109.7c-1-.4999-2.125-.625-3.125-1.125c-2.25-1.125-4.752-1.1-7.252-2.625C201.5 99.85 185.2 95.98 168.7 95.98H95.1c-9.25 0-18.05 4.061-24.18 10.93l-55.95 63.92c-.75 .9998-1.5 2.124-2.25 3.249c-8.875 13.1-3 32.87 11.63 40.74l336.6 184.3l-9.837 16.87H311.1zM105.9 204.1l-23.5-12.87l28.13-32.12h34.38L105.9 204.1zM199.5 256.1l34.9-41.28l13.5 67.61L199.5 256.1z\"]\n};\nvar faDigging = faPersonDigging;\nvar faPersonDotsFromLine = {\n  prefix: 'fas',\n  iconName: 'person-dots-from-line',\n  icon: [576, 512, [\"diagnoses\"], \"f470\", \"M463.1 256c8.75 0 15.1-7.25 15.1-16S472.7 224 463.1 224c-8.75 0-15.1 7.25-15.1 16S455.2 256 463.1 256zM287.1 176c48.5 0 87.1-39.5 87.1-88S336.5 0 287.1 0S200 39.5 200 88S239.5 176 287.1 176zM80 256c8.75 0 15.1-7.25 15.1-16S88.75 224 80 224S64 231.3 64 240S71.25 256 80 256zM75.91 375.1c.6289-.459 41.62-29.26 100.1-50.05L176 432h223.1l-.0004-106.8c58.32 20.8 99.51 49.49 100.1 49.91C508.6 381.1 518.3 384 527.9 384c14.98 0 29.73-7 39.11-20.09c15.41-21.59 10.41-51.56-11.16-66.97c-1.955-1.391-21.1-14.83-51.83-30.85C495.5 279.2 480.7 288 463.1 288c-26.25 0-47.1-21.75-47.1-48c0-3.549 .4648-6.992 1.217-10.33C378.6 217.2 334.4 208 288 208c-59.37 0-114.1 15.01-160.1 32.67C127.6 266.6 106 288 80 288C69.02 288 58.94 284 50.8 277.7c-18.11 10.45-29.25 18.22-30.7 19.26c-21.56 15.41-26.56 45.38-11.16 66.97C24.33 385.5 54.3 390.4 75.91 375.1zM335.1 344c13.25 0 23.1 10.75 23.1 24s-10.75 24-23.1 24c-13.25 0-23.1-10.75-23.1-24S322.7 344 335.1 344zM240 248c13.25 0 23.1 10.75 23.1 24S253.3 296 240 296c-13.25 0-23.1-10.75-23.1-24S226.8 248 240 248zM559.1 464H16c-8.75 0-15.1 7.25-15.1 16l-.0016 16c0 8.75 7.25 16 15.1 16h543.1c8.75 0 15.1-7.25 15.1-16L575.1 480C575.1 471.3 568.7 464 559.1 464z\"]\n};\nvar faDiagnoses = faPersonDotsFromLine;\nvar faPersonDress = {\n  prefix: 'fas',\n  iconName: 'person-dress',\n  icon: [320, 512, [\"female\"], \"f182\", \"M112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48zM88 384H70.2C59.28 384 51.57 373.3 55.02 362.9L93.28 248.1L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L58.18 182.3C78.43 148.6 114.9 128 154.2 128H165.8C205.1 128 241.6 148.6 261.8 182.3L315.4 271.5C324.5 286.7 319.6 306.3 304.5 315.4C289.3 324.5 269.7 319.6 260.6 304.5L226.7 248.1L264.1 362.9C268.4 373.3 260.7 384 249.8 384H232V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V384H152V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480L88 384z\"]\n};\nvar faFemale = faPersonDress;\nvar faPersonDressBurst = {\n  prefix: 'fas',\n  iconName: 'person-dress-burst',\n  icon: [640, 512, [], \"e544\", \"M527.1 48C527.1 74.51 506.5 96 479.1 96C453.5 96 431.1 74.51 431.1 48C431.1 21.49 453.5 0 479.1 0C506.5 0 527.1 21.49 527.1 48zM375 362.9L413.3 248.1L379.4 304.5C370.3 319.6 350.7 324.5 335.5 315.4C320.4 306.3 315.5 286.7 324.6 271.5L378.2 182.3C398.4 148.6 434.9 128 474.2 128H485.8C525.1 128 561.6 148.6 581.8 182.3L635.4 271.5C644.5 286.7 639.6 306.3 624.5 315.4C609.3 324.5 589.7 319.6 580.6 304.5L546.7 248.1L584.1 362.9C588.4 373.3 580.7 384 569.8 384H551.1V480C551.1 497.7 537.7 512 519.1 512C502.3 512 487.1 497.7 487.1 480V384H471.1V480C471.1 497.7 457.7 512 439.1 512C422.3 512 407.1 497.7 407.1 480V384H390.2C379.3 384 371.6 373.3 375 362.9L375 362.9zM220.3 92.05L296.4 68.93C302.7 67.03 309.5 69.14 313.6 74.27C317.7 79.39 318.2 86.49 314.1 92.18L275.5 161.3L330.7 199.3L306.3 239.8L255.8 247.6L261.4 327C261.8 333.6 258.3 339.7 252.4 342.6C246.5 345.4 239.4 344.4 234.6 339.9L175.1 286.1L117.4 339.9C112.6 344.4 105.5 345.4 99.63 342.6C93.73 339.7 90.15 333.6 90.62 327L96.21 247.6L17.55 235.4C11.08 234.4 5.868 229.6 4.41 223.2C2.951 216.8 5.538 210.1 10.94 206.4L76.5 161.3L37.01 92.18C33.76 86.49 34.31 79.39 38.39 74.27C42.48 69.14 49.28 67.03 55.55 68.93L131.7 92.05L161.1 18.09C163.6 11.1 169.4 7.1 175.1 7.1C182.6 7.1 188.4 11.1 190.9 18.09L220.3 92.05z\"]\n};\nvar faPersonDrowning = {\n  prefix: 'fas',\n  iconName: 'person-drowning',\n  icon: [576, 512, [], \"e545\", \"M191.1 96.16C191.1 148.8 226.1 195.4 276.3 211.4C316.3 224.2 358.1 225.1 399.1 216.6L504.9 192.8C522.1 188.9 539.3 199.7 543.2 216.9C547.1 234.1 536.3 251.3 519.1 255.2L414.1 279.1C403.6 281.5 392.9 283.3 382.2 284.5L364.5 382.1C350.9 378.9 337.2 372.7 324.8 364.1C302.8 348.6 273.3 348.6 251.2 364.1C234 375.9 213.2 384.5 192 384.5C184.7 384.5 177 383.3 169.2 381.2L190.2 234.5C151.5 200.1 127.1 150.2 127.1 96.16V64C127.1 46.33 142.3 32 159.1 32C177.7 32 191.1 46.33 191.1 64V96.16zM255.1 127.1C255.1 92.65 284.7 63.1 320 63.1C355.3 63.1 384 92.65 384 127.1C384 163.3 355.3 191.1 320 191.1C284.7 191.1 255.1 163.3 255.1 127.1zM384 416C410.9 416 439.4 405.2 461.4 389.9L461.5 389.9C473.4 381.4 489.5 382.1 500.7 391.6C515 403.5 533.2 412.6 551.3 416.8C568.5 420.8 579.2 438.1 575.2 455.3C571.2 472.5 553.1 483.2 536.7 479.2C512.2 473.4 491.9 462.6 478.5 454.2C449.5 469.7 417 480 384 480C352.1 480 323.4 470.1 303.6 461.1C297.7 458.5 292.5 455.8 288 453.4C283.5 455.8 278.3 458.5 272.4 461.1C252.6 470.1 223.9 480 192 480C158.1 480 126.5 469.7 97.5 454.2C84.12 462.6 63.79 473.4 39.27 479.2C22.06 483.2 4.853 472.5 .8422 455.3C-3.169 438.1 7.532 420.8 24.74 416.8C42.84 412.6 60.96 403.5 75.31 391.6C86.46 382.1 102.6 381.4 114.5 389.9L114.6 389.9C136.7 405.2 165.1 416 192 416C219.5 416 247 405.4 269.5 389.9C280.6 382 295.4 382 306.5 389.9C328.1 405.4 356.5 416 384 416H384z\"]\n};\nvar faPersonFalling = {\n  prefix: 'fas',\n  iconName: 'person-falling',\n  icon: [448, 512, [], \"e546\", \"M256 0C273.7 0 288 14.33 288 32V41.84C288 96.45 260.1 146.5 215.5 175.4L215.7 175.8L272.5 255.1H360C375.1 255.1 389.3 263.1 398.4 275.2L441.6 332.8C452.2 346.9 449.3 366.1 435.2 377.6C421.1 388.2 401 385.3 390.4 371.2L352 319.1H254.6L346.9 462.6C356.5 477.5 352.2 497.3 337.4 506.9C322.5 516.5 302.7 512.2 293.1 497.4L132.5 249.2C129.6 258.4 127.1 268.1 127.1 278.2V351.1C127.1 369.7 113.7 383.1 95.1 383.1C78.33 383.1 63.1 369.7 63.1 351.1V278.2C63.1 213 103.6 154.5 164.1 130.3C200.3 115.8 223.1 80.79 223.1 41.84V32C223.1 14.33 238.3 .0003 256 .0003L256 0zM32 80C32 53.49 53.49 32 80 32C106.5 32 128 53.49 128 80C128 106.5 106.5 128 80 128C53.49 128 32 106.5 32 80z\"]\n};\nvar faPersonFallingBurst = {\n  prefix: 'fas',\n  iconName: 'person-falling-burst',\n  icon: [640, 512, [], \"e547\", \"M256 41.84C256 96.45 228.1 146.5 183.5 175.4L183.7 175.8L240.5 255.1H311.1C327.1 255.1 341.3 263.1 350.4 275.2L393.6 332.8C404.2 346.9 401.3 366.1 387.2 377.6C373.1 388.2 353 385.3 342.4 371.2L303.1 319.1H222.6L314.9 462.6C324.5 477.5 320.2 497.3 305.4 506.9C290.5 516.5 270.7 512.2 261.1 497.4L100.5 249.2C97.57 258.4 95.1 268.1 95.1 278.2V351.1C95.1 369.7 81.67 383.1 63.1 383.1C46.33 383.1 31.1 369.7 31.1 351.1V278.2C31.1 213 71.65 154.5 132.1 130.3C168.3 115.8 191.1 80.79 191.1 41.84V32C191.1 14.33 206.3 0 223.1 0C241.7 0 255.1 14.33 255.1 32L256 41.84zM96 79.1C96 106.5 74.51 127.1 48 127.1C21.49 127.1 0 106.5 0 79.1C0 53.49 21.49 31.1 48 31.1C74.51 31.1 96 53.49 96 79.1zM464 286.1L424.7 322.2C423.1 319.3 421.3 316.4 419.2 313.6L382.1 265.3L384.2 247.6L365.8 244.8C351.2 231.5 332.1 223.1 311.1 223.1H292.6C292.5 223.7 292.5 223.4 292.4 223.2C290.1 216.8 293.5 210.1 298.9 206.4L364.5 161.3L325 92.18C321.8 86.49 322.3 79.39 326.4 74.27C330.5 69.14 337.3 67.03 343.6 68.93L419.7 92.05L449.1 18.09C451.6 11.1 457.4 8 464 8C470.6 8 476.4 11.1 478.9 18.09L508.3 92.05L584.4 68.93C590.7 67.03 597.5 69.14 601.6 74.27C605.7 79.39 606.2 86.49 602.1 92.18L563.5 161.3L629.1 206.4C634.5 210.1 637 216.8 635.6 223.2C634.1 229.6 628.9 234.4 622.4 235.4L543.8 247.6L549.4 327C549.8 333.6 546.3 339.7 540.4 342.6C534.5 345.4 527.4 344.4 522.6 339.9L464 286.1z\"]\n};\nvar faPersonHalfDress = {\n  prefix: 'fas',\n  iconName: 'person-half-dress',\n  icon: [320, 512, [], \"e548\", \"M112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48zM168 128H174.9C208.6 128 239.8 145.7 257.2 174.6L315.4 271.5C324.5 286.7 319.6 306.3 304.5 315.4C289.3 324.5 269.7 319.6 260.6 304.5L232 256.9V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480L168 128zM58.18 182.3C78.06 149.2 113.5 128.8 152 128V480.2C151.9 497.8 137.6 512 120 512C102.3 512 88 497.7 88 480V384H70.2C59.28 384 51.57 373.3 55.02 362.9L93.28 248.1L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L58.18 182.3z\"]\n};\nvar faPersonHarassing = {\n  prefix: 'fas',\n  iconName: 'person-harassing',\n  icon: [576, 512, [], \"e549\", \"M144 48C144 21.49 165.5 0 192 0C218.5 0 240 21.49 240 48C240 74.51 218.5 96 192 96C165.5 96 144 74.51 144 48V48zM15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C80.2 145.7 111.4 128 145.1 128H181C209.6 128 236.7 140.7 254.9 162.7L328.6 251.6C339.9 265.2 338 285.3 324.4 296.6C310.8 307.9 290.7 306 279.4 292.4L232 235.3V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V352H152V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480V256.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4H15.52zM480 240C480 266.5 458.5 288 432 288C405.5 288 384 266.5 384 240C384 213.5 405.5 192 432 192C458.5 192 480 213.5 480 240zM464 344C464 313.1 489.1 288 520 288C550.9 288 576 313.1 576 344V446.1C576 482.5 546.5 512 510.1 512C492.6 512 475.8 505.1 463.4 492.7L408.8 438L380.6 494.3C372.7 510.1 353.5 516.5 337.7 508.6C321.9 500.7 315.5 481.5 323.4 465.7L371.4 369.7C375.1 360.5 384.7 354.1 394.9 352.4C405 350.8 415.4 354.1 422.6 361.4L464 402.7V344zM288 48C288 39.16 295.2 32 304 32H360C368.8 32 376 39.16 376 48C376 56.84 368.8 64 360 64H304C295.2 64 288 56.84 288 48zM335.2 121.7C343.1 125.6 346.3 135.3 342.3 143.2C338.4 151.1 328.7 154.3 320.8 150.3L272.8 126.3C264.9 122.4 261.7 112.7 265.7 104.8C269.6 96.94 279.3 93.74 287.2 97.69L335.2 121.7z\"]\n};\nvar faPersonHiking = {\n  prefix: 'fas',\n  iconName: 'person-hiking',\n  icon: [384, 512, [\"hiking\"], \"f6ec\", \"M240 96c26.5 0 48-21.5 48-48S266.5 0 240 0C213.5 0 192 21.5 192 48S213.5 96 240 96zM80.01 287.1c7.31 0 13.97-4.762 15.87-11.86L137 117c.3468-1.291 .5125-2.588 .5125-3.866c0-7.011-4.986-13.44-12.39-15.13C118.4 96.38 111.7 95.6 105.1 95.6c-36.65 0-70 23.84-79.32 59.53L.5119 253.3C.1636 254.6-.0025 255.9-.0025 257.2c0 7.003 4.961 13.42 12.36 15.11L76.01 287.5C77.35 287.8 78.69 287.1 80.01 287.1zM368 160h-15.1c-8.875 0-15.1 7.125-15.1 16V192h-34.75l-46.75-46.75C243.4 134.1 228.6 128 212.9 128C185.9 128 162.5 146.3 155.9 172.5L129 280.3C128.4 282.8 128 285.5 128 288.1c0 8.325 3.265 16.44 9.354 22.53l86.62 86.63V480c0 17.62 14.37 32 31.1 32s32-14.38 32-32v-82.75c0-17.12-6.625-33.13-18.75-45.25l-46.87-46.88c.25-.5 .5-.875 .625-1.375l19.1-79.5l22.37 22.38C271.4 252.6 279.5 256 288 256h47.1v240c0 8.875 7.125 16 15.1 16h15.1C376.9 512 384 504.9 384 496v-320C384 167.1 376.9 160 368 160zM81.01 472.3c-.672 2.63-.993 5.267-.993 7.86c0 14.29 9.749 27.29 24.24 30.89C106.9 511.8 109.5 512 112 512c14.37 0 27.37-9.75 30.1-24.25l25.25-101l-52.75-52.75L81.01 472.3z\"]\n};\nvar faHiking = faPersonHiking;\nvar faPersonMilitaryPointing = {\n  prefix: 'fas',\n  iconName: 'person-military-pointing',\n  icon: [512, 512, [], \"e54a\", \"M366.7 1.443C376 .6658 384 8.027 384 17.39V47.1C384 56.84 376.8 63.1 368 63.1H216.1C203.2 63.1 192 52.81 192 39C192 25.1 201.1 15.17 214.9 14.09L366.7 1.443zM208 111.1C208 106.5 208.6 101.2 209.6 95.1H366.4C367.5 101.2 368 106.5 368 111.1C368 156.2 332.2 191.1 288 191.1C243.8 191.1 208 156.2 208 111.1V111.1zM313.2 223.1C327.6 223.1 341.6 226.3 354.9 230.5L192 393.4V303.1H40.01C17.92 303.1 .0077 286.1 .0077 263.1C.0077 241.9 17.92 223.1 40.01 223.1H313.2zM430.3 290.8L506.4 419.7C517.7 438.7 511.4 463.2 492.4 474.4C473.3 485.7 448.8 479.4 437.6 460.3L384 369.7V416H214.6L385.7 244.9C403.7 256.3 419.1 271.9 430.3 290.8V290.8zM384 448V480C384 497.7 369.7 512 352 512H224C206.3 512 192 497.7 192 480V448H384z\"]\n};\nvar faPersonMilitaryRifle = {\n  prefix: 'fas',\n  iconName: 'person-military-rifle',\n  icon: [448, 512, [], \"e54b\", \"M128 39C128 25.1 137.1 15.17 150.9 14.09L302.7 1.443C312 .6658 320 8.027 320 17.39V47.1C320 56.84 312.8 63.1 304 63.1H152.1C139.2 63.1 128 52.81 128 39V39zM302.4 95.1C303.5 101.2 304 106.5 304 111.1C304 156.2 268.2 191.1 224 191.1C179.8 191.1 144 156.2 144 111.1C144 106.5 144.6 101.2 145.6 95.1H302.4zM373.6 460.3L320 369.7V480C320 481.3 319.9 482.5 319.8 483.8L145.5 234.9C162.1 227.8 180.2 223.1 198.8 223.1H249.2C265.1 223.1 280.6 226.8 295 231.9L389.9 67.71C382.2 63.3 379.6 53.51 384 45.86C388.4 38.21 398.2 35.58 405.9 40L433.6 56C441.2 60.42 443.8 70.21 439.4 77.86L383.1 173.9L385.6 174.9C400.9 183.7 406.1 203.3 397.3 218.6L360.6 282C362.6 284.9 364.5 287.8 366.3 290.8L442.4 419.7C453.7 438.7 447.4 463.2 428.4 474.4C409.3 485.7 384.8 479.4 373.6 460.3V460.3zM264 319.1C277.3 319.1 288 309.3 288 295.1C288 282.7 277.3 271.1 264 271.1C250.7 271.1 240 282.7 240 295.1C240 309.3 250.7 319.1 264 319.1zM160 512C142.3 512 128 497.7 128 480V369.7L74.44 460.3C63.21 479.4 38.68 485.7 19.66 474.4C.6381 463.2-5.669 438.7 5.569 419.7L81.7 290.8C91.06 274.1 103.4 261.5 117.7 250.8L299.1 510C295.6 511.3 291.9 512 288 512L160 512z\"]\n};\nvar faPersonMilitaryToPerson = {\n  prefix: 'fas',\n  iconName: 'person-military-to-person',\n  icon: [512, 512, [], \"e54c\", \"M182.2 .0998C191.7-.9534 200 6.466 200 16V30.13C200 38.91 192.9 46.05 184.1 46.13H72.74C63.48 46.04 56 38.52 56 29.24C56 20.64 62.47 13.41 71.02 12.46L182.2 .0998zM192 96C192 131.3 163.3 160 128 160C92.65 160 64 131.3 64 96C64 89.8 64.88 83.8 66.53 78.13H189.5C191.1 83.8 192 89.8 192 96V96zM32 256C32 237.2 40.09 220.3 52.97 208.6L197.2 319.6C195.5 319.9 193.8 320 192 320H64C46.33 320 32 305.7 32 288L32 256zM222.2 298.5L85.05 192.9C88.61 192.3 92.27 191.1 96 191.1H160C195.3 191.1 224 220.7 224 255.1V287.1C224 291.7 223.4 295.2 222.2 298.5V298.5zM320 96C320 60.65 348.7 31.1 384 31.1C419.3 31.1 448 60.65 448 96C448 131.3 419.3 160 384 160C348.7 160 320 131.3 320 96zM416 192C451.3 192 480 220.7 480 256V288C480 305.7 465.7 320 448 320H320C302.3 320 288 305.7 288 288V256C288 220.7 316.7 192 352 192H416zM151.8 506.1C141.8 514.8 126.7 513.8 117.9 503.8C109.2 493.8 110.2 478.7 120.2 469.9L136.1 456L23.1 455.1C10.74 455.1-.0003 445.2 0 431.1C.0003 418.7 10.75 407.1 24 407.1L136.1 408L120.2 394.1C110.2 385.3 109.2 370.2 117.9 360.2C126.7 350.2 141.8 349.2 151.8 357.9L215.8 413.9C221 418.5 224 425.1 224 431.1C224 438.9 221 445.5 215.8 450.1L151.8 506.1zM296.2 413.9L360.2 357.9C370.2 349.2 385.3 350.2 394.1 360.2C402.8 370.2 401.8 385.3 391.8 394.1L375.9 407.1L488 407.1C501.3 407.1 512 418.7 512 431.1C512 445.2 501.3 455.1 488 455.1L375.9 455.1L391.8 469.9C401.8 478.7 402.8 493.8 394.1 503.8C385.3 513.8 370.2 514.8 360.2 506.1L296.2 450.1C290.1 445.5 288 438.9 288 431.1C288 425.1 290.1 418.5 296.2 413.9H296.2z\"]\n};\nvar faPersonPraying = {\n  prefix: 'fas',\n  iconName: 'person-praying',\n  icon: [384, 512, [128720, \"pray\"], \"f683\", \"M255.1 128c35.38 0 63.1-28.62 63.1-64s-28.62-64-63.1-64S191.1 28.62 191.1 64S220.6 128 255.1 128zM225.4 297.8c14 16.75 39 19.12 56.01 5.25l88.01-72c17-14 19.5-39.25 5.625-56.38c-14-17.12-39.25-19.5-56.38-5.625L261.3 216l-39-46.25c-15.38-18.38-39.13-27.88-64.01-25.38c-24.13 2.5-45.25 16.25-56.38 37l-49.38 92C29.13 317 43.88 369.8 86.76 397.1L131.5 432H40C17.88 432 0 449.9 0 472S17.88 512 40 512h208c34.13 0 53.76-42.75 28.25-68.25L166.4 333.9L201.3 269L225.4 297.8z\"]\n};\nvar faPray = faPersonPraying;\nvar faPersonPregnant = {\n  prefix: 'fas',\n  iconName: 'person-pregnant',\n  icon: [320, 512, [], \"e31e\", \"M112 48C112 21.49 133.5 0 160 0C186.5 0 208 21.49 208 48C208 74.51 186.5 96 160 96C133.5 96 112 74.51 112 48zM88 382.1C74.2 379.4 64 366.9 64 352V296.9L59.43 304.5C50.33 319.6 30.67 324.5 15.52 315.4C.3696 306.3-4.531 286.7 4.573 271.5L62.85 174.6C77.84 149.6 103.2 133 131.5 128.1C135.6 128.3 139.8 128 144 128H160C161.4 128 162.8 128.1 164.1 128.3C199.8 131.2 229.5 157.6 236.2 193.3L242.3 225.7C286.6 234.3 320 273.2 320 320V352C320 369.7 305.7 384 288 384H232V480C232 497.7 217.7 512 200 512C182.3 512 168 497.7 168 480V384H152V480C152 497.7 137.7 512 120 512C102.3 512 88 497.7 88 480L88 382.1z\"]\n};\nvar faPersonRays = {\n  prefix: 'fas',\n  iconName: 'person-rays',\n  icon: [512, 512, [], \"e54d\", \"M304 48C304 74.51 282.5 96 256 96C229.5 96 208 74.51 208 48C208 21.49 229.5 0 256 0C282.5 0 304 21.49 304 48zM248 352V480C248 497.7 233.7 512 216 512C198.3 512 184 497.7 184 480V256.9L155.4 304.5C146.3 319.6 126.7 324.5 111.5 315.4C96.37 306.3 91.47 286.7 100.6 271.5L158.8 174.6C176.2 145.7 207.4 128 241.1 128H270.9C304.6 128 335.8 145.7 353.2 174.6L411.4 271.5C420.5 286.7 415.6 306.3 400.5 315.4C385.3 324.5 365.7 319.6 356.6 304.5L328 256.9V480C328 497.7 313.7 512 296 512C278.3 512 264 497.7 264 480V352L248 352zM7.029 7.029C16.4-2.343 31.6-2.343 40.97 7.029L120.1 87.03C130.3 96.4 130.3 111.6 120.1 120.1C111.6 130.3 96.4 130.3 87.03 120.1L7.029 40.97C-2.343 31.6-2.343 16.4 7.029 7.029V7.029zM471 7.029C480.4-2.343 495.6-2.343 504.1 7.029C514.3 16.4 514.3 31.6 504.1 40.97L424.1 120.1C415.6 130.3 400.4 130.3 391 120.1C381.7 111.6 381.7 96.4 391 87.03L471 7.029zM7.029 471L87.03 391C96.4 381.7 111.6 381.7 120.1 391C130.3 400.4 130.3 415.6 120.1 424.1L40.97 504.1C31.6 514.3 16.4 514.3 7.029 504.1C-2.343 495.6-2.343 480.4 7.029 471V471zM391 424.1C381.7 415.6 381.7 400.4 391 391C400.4 381.7 415.6 381.7 424.1 391L504.1 471C514.3 480.4 514.3 495.6 504.1 504.1C495.6 514.3 480.4 514.3 471 504.1L391 424.1z\"]\n};\nvar faPersonRifle = {\n  prefix: 'fas',\n  iconName: 'person-rifle',\n  icon: [576, 512, [], \"e54e\", \"M265.2 192C290.6 192 315 199.1 336 211.9V512H144V337.7L90.44 428.3C79.21 447.4 54.68 453.7 35.66 442.4C16.64 431.2 10.33 406.7 21.57 387.7L97.7 258.8C122.2 217.4 166.7 192 214.8 192L265.2 192zM320 80C320 124.2 284.2 160 240 160C195.8 160 160 124.2 160 80C160 35.82 195.8 .0003 240 .0003C284.2 .0003 320 35.82 320 80zM464 16V132.3C473.6 137.8 480 148.2 480 160V269.3L496 264V208C496 199.2 503.2 192 512 192H528C536.8 192 544 199.2 544 208V292.5C544 299.4 539.6 305.5 533.1 307.6L480 325.3V352H528C536.8 352 544 359.2 544 368V384C544 392.8 536.8 400 528 400H484L507 492.1C509.6 502.2 501.9 512 491.5 512H432C423.2 512 416 504.8 416 496V400H400C382.3 400 368 385.7 368 368V224C368 206.3 382.3 192 400 192V160C400 148.2 406.4 137.8 416 132.3V32C407.2 32 400 24.84 400 16C400 7.164 407.2 0 416 0H448C456.8 0 464 7.164 464 16V16z\"]\n};\nvar faPersonRunning = {\n  prefix: 'fas',\n  iconName: 'person-running',\n  icon: [448, 512, [127939, \"running\"], \"f70c\", \"M400 224h-44l-26.12-53.25c-12.5-25.5-35.38-44.25-61.75-51L197 98.63C189.5 96.84 181.1 95.97 174.5 95.97c-20.88 0-41.33 6.81-58.26 19.78L76.5 146.3C68.31 152.5 64.01 162 64.01 171.6c0 17.11 13.67 32.02 32.02 32.02c6.808 0 13.67-2.158 19.47-6.616l39.63-30.38c5.92-4.488 13.01-6.787 19.53-6.787c2.017 0 3.981 .2196 5.841 .6623l14.62 4.25l-37.5 87.5C154.1 260.3 152.5 268.8 152.5 277.2c0 22.09 11.49 43.52 31.51 55.29l85 50.13l-27.5 87.75c-.9875 3.174-1.458 6.388-1.458 9.55c0 13.65 8.757 26.31 22.46 30.58C265.6 511.5 268.9 512 272 512c13.62 0 26.25-8.75 30.5-22.5l31.75-101c1.211-4.278 1.796-8.625 1.796-12.93c0-16.57-8.661-32.51-23.55-41.44l-61.13-36.12l31.25-78.38l20.25 41.5C310.9 277.4 327.9 288 345.1 288H400c17.62 0 32-14.38 32-32C432 238.3 417.6 224 400 224zM288 96c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48S261.5 96 288 96zM129.8 317.5L114.9 352H48c-17.62 0-32 14.38-32 32s14.38 32 32 32h77.5c19.25 0 36.5-11.5 44-29.12l8.875-20.5l-10.75-6.25C150.4 349.9 137.6 334.8 129.8 317.5z\"]\n};\nvar faRunning = faPersonRunning;\nvar faPersonShelter = {\n  prefix: 'fas',\n  iconName: 'person-shelter',\n  icon: [512, 512, [], \"e54f\", \"M495.9 132.2C505.8 137.9 512 148.5 512 160V480C512 497.7 497.7 512 480 512C462.3 512 448 497.7 448 480V178.6L256 68.86L64 178.6V480C64 497.7 49.67 512 32 512C14.33 512 0 497.7 0 480V160C0 148.5 6.153 137.9 16.12 132.2L240.1 4.216C249.1-1.405 262-1.405 271.9 4.216L495.9 132.2zM216 168C216 145.9 233.9 128 256 128C278.1 128 296 145.9 296 168C296 190.1 278.1 208 256 208C233.9 208 216 190.1 216 168zM224 512C210.7 512 200 501.3 200 488V313.5L173.1 363.4C166.8 375 152.3 379.4 140.6 373.1C128.1 366.8 124.6 352.3 130.9 340.6L168.7 270.3C184.1 241.8 213.9 223.1 246.2 223.1H265.8C298.1 223.1 327.9 241.8 343.3 270.3L381.1 340.6C387.4 352.3 383 366.8 371.4 373.1C359.7 379.4 345.2 375 338.9 363.4L312 313.5V488C312 501.3 301.3 512 288 512C274.7 512 264 501.3 264 488V400H248V488C248 501.3 237.3 512 224 512V512z\"]\n};\nvar faPersonSkating = {\n  prefix: 'fas',\n  iconName: 'person-skating',\n  icon: [448, 512, [\"skating\"], \"f7c5\", \"M399.1 0c-26.5 0-48.01 21.5-48.01 48S373.5 96 399.1 96C426.5 96 448 74.5 448 48S426.5 0 399.1 0zM399.1 448c-8.751 0-16 7.25-16 16S376.7 480 367.1 480h-96.01c-8.751 0-16 7.25-16 16s7.251 16 16 16h96.01c26.5 0 48.01-21.5 48.01-48C415.1 455.2 408.7 448 399.1 448zM129.1 451.9c-11.34 0-11.19 9.36-22.65 9.36c-4.074 0-8.163-1.516-11.21-4.625l-67.98-67.89c-3.063-3.125-7.165-4.688-11.27-4.688c-4.102 0-8.204 1.562-11.27 4.688C1.562 391.8-.0001 395.9-.0001 400s1.562 8.203 4.688 11.27l67.88 67.98c9.376 9.375 21.59 14 33.96 14c13.23 0 38.57-8.992 38.57-25.36C145.1 456.7 135.2 451.9 129.1 451.9zM173.8 276.8L80.2 370.5c-6.251 6.25-9.376 14.44-9.376 22.62c0 24.75 22.57 32 31.88 32c8.251 0 16.5-3.125 22.63-9.375l91.89-92l-30.13-30.12C182.1 288.6 177.7 282.9 173.8 276.8zM127.1 160h105.5L213.3 177.3c-21.18 18.04-22.31 41.73-22.31 48.65c0 16.93 6.8 33.22 18.68 45.1l78.26 78.25V432c0 17.75 14.25 32 32 32s32-14.25 32-32v-89.38c0-12.62-5.126-25-14.13-33.88l-61.01-61c.5001-.5 1.25-.625 1.75-1.125l82.26-82.38c7.703-7.702 11.76-17.87 11.76-28.25c0-22.04-17.86-39.97-40.01-39.97L127.1 96C110.2 96 95.96 110.2 95.96 128S110.2 160 127.1 160z\"]\n};\nvar faSkating = faPersonSkating;\nvar faPersonSkiing = {\n  prefix: 'fas',\n  iconName: 'person-skiing',\n  icon: [512, 512, [9975, \"skiing\"], \"f7c9\", \"M432.1 96.02c26.51 0 47.99-21.5 47.99-48.01S458.6 0 432.1 0s-47.98 21.5-47.98 48.01S405.6 96.02 432.1 96.02zM511.1 469.1c0-13.98-11.33-23.95-23.89-23.95c-18.89 0-19.23 19.11-46.15 19.11c-5.476 0-10.87-1.081-15.87-3.389l-135.8-70.26l49.15-73.82c5.446-8.116 8.09-17.39 8.09-26.63c0-12.4-4.776-24.73-14.09-33.9l-40.38-40.49l-106.1-53.1C185.6 165.8 185.4 169 185.4 172.2c0 16.65 6.337 32.78 18.42 44.86l75.03 75.21l-45.88 68.76L34.97 258.8C31.44 257 27.64 256.1 23.93 256.1C9.675 256.1 0 267.8 0 280.1c0 8.673 4.735 17.04 12.96 21.24l392 202.6c11.88 5.501 24.45 8.119 37.08 8.119C480.1 512 511.1 486.7 511.1 469.1zM119.1 91.65L108.5 114.2C114.2 117 120.2 118.4 126.2 118.4c9.153 0 18.1-3.2 25.06-9.102l47.26 23.51c-.125 0-.125 .125-.2501 .25l114.5 56.76l32.51-13l6.376 19.13c4.001 12.13 12.63 22.01 24 27.76l58.14 28.1c4.609 2.287 9.455 3.355 14.26 3.355c18.8 0 31.98-15.43 31.98-31.93c0-11.74-6.461-23.1-17.74-28.7l-52.03-26.1l-17.12-51.15C386.6 98.69 364.2 73.99 333.1 73.99c-7.658 0-15.82 1.504-24.43 4.934L227.4 111.3L164.9 80.33c.009-.3461 .0134-.692 .0134-1.038c0-14.13-7.468-27.7-20.89-34.53L132.9 66.45L98.17 59.43C97.83 59.36 97.53 59.35 97.19 59.35c-2.666 0-5.276 2.177-5.276 5.273c0 1.473 .648 2.936 1.81 3.961L119.1 91.65z\"]\n};\nvar faSkiing = faPersonSkiing;\nvar faPersonSkiingNordic = {\n  prefix: 'fas',\n  iconName: 'person-skiing-nordic',\n  icon: [576, 512, [\"skiing-nordic\"], \"f7ca\", \"M336 96C362.5 96 384 74.5 384 48S362.5 0 336 0S288 21.5 288 48S309.5 96 336 96zM552 416c-13.25 0-24 10.75-24 24s-10.75 24-24 24h-69.5L460 285.6c11.75-4.75 20.04-16.31 20.04-29.69c0-17.75-14.38-31.95-32.01-31.95l-43.9-.0393l-26.11-53.22c-12.5-25.5-35.5-44.12-61.75-50.87l-71.22-21.15c-7.475-1.819-15.08-2.693-22.59-2.693c-20.86 0-41.25 6.854-58.16 19.72L124.6 146.2C116.3 152.5 111.1 161.1 111.1 171.6c0 14.71 8.712 21.23 9.031 21.6L66.88 464H24C10.75 464 0 474.8 0 488S10.75 512 24 512h480c39.75 0 72-32.25 72-72C576 426.8 565.3 416 552 416zM291.6 463.9H194.7l43.1-90.97l-21.99-12.1c-12.13-7.25-21.99-16.89-29.49-27.77l-62.48 131.7L99.5 464l52.25-261.4c4.125-1 8.112-2.846 11.74-5.596l39.81-30.45c5.821-4.485 12.86-6.771 19.38-6.771c2.021 0 4.015 .212 5.878 .6556l14.73 4.383L205.8 252.2C202.3 260.3 200.7 268.9 200.7 277.3c0 22.06 11.42 43.37 31.41 55.22l84.97 50.15L291.6 463.9zM402.1 464l-43.58-.125l23.6-75.48c1.221-4.314 1.805-8.69 1.805-13.03c0-16.53-8.558-32.43-23.41-41.34l-61.21-36.1l31.32-78.23l20.26 41.36c8 16.25 24.86 26.89 43.11 26.89L427.3 288L402.1 464z\"]\n};\nvar faSkiingNordic = faPersonSkiingNordic;\nvar faPersonSnowboarding = {\n  prefix: 'fas',\n  iconName: 'person-snowboarding',\n  icon: [512, 512, [127938, \"snowboarding\"], \"f7ce\", \"M460.7 249.6c5.877 4.25 12.47 6.393 19.22 6.393c10.76 0 32.05-8.404 32.05-31.97c0-9.74-4.422-19.36-12.8-25.65l-111.5-83.48c-13.75-10.25-29.04-18.42-45.42-23.79l-63.66-21.23l-26.12-52.12c-5.589-11.17-16.9-17.64-28.63-17.64c-17.8 0-31.99 14.47-31.99 32.01c0 4.803 1.086 9.674 3.374 14.25l29.12 58.12c5.75 11.38 15.55 19.85 27.67 23.98l16.45 5.522L227.3 154.6C205.5 165.5 191.9 187.4 191.9 211.8L191.9 264.9L117.8 289.6C104.4 294.1 95.95 306.5 95.95 319.9c0 12.05 6.004 19.05 10.33 23.09l-38.68-14.14C41.23 319.4 49.11 295 23.97 295c-18.67 0-23.97 17.16-23.97 24.09c0 8.553 13.68 41.32 51.13 54.88l364.1 132.8C425.7 510.2 435.7 512 445.7 512c12.5 0 24.97-2.732 36.47-8.232c8.723-3.997 13.85-12.71 13.85-21.77c0-18.67-17.15-23.96-24.06-23.96c-3.375 0-6.73 .7505-9.998 2.248c-5.111 2.486-10.64 3.702-16.21 3.702c-4.511 0-9.049-.7978-13.41-2.364l-90.68-33.12c8.625-4.125 15.53-11.76 17.78-21.89l21.88-101.1c.7086-3.335 1.05-6.668 1.05-10c0-14.91-6.906-29.31-19.17-38.4l-52.01-39l66.01-30.5L460.7 249.6zM316.3 301.3l-19.66 92c-.4205 1.997-.5923 3.976-.5923 5.911c0 4.968 1.264 9.691 3.333 14.01l-169.5-61.49c2.625-.25 5.492-.4448 8.117-1.32l85-28.38c19.63-6.5 32.77-24.73 32.77-45.48l0-20.53L316.3 301.3zM431.9 95.99c26.5 0 48-21.5 48-47.1S458.4 0 431.9 0s-48 21.5-48 47.1S405.4 95.99 431.9 95.99z\"]\n};\nvar faSnowboarding = faPersonSnowboarding;\nvar faPersonSwimming = {\n  prefix: 'fas',\n  iconName: 'person-swimming',\n  icon: [576, 512, [127946, \"swimmer\"], \"f5c4\", \"M192.4 320c63.38 0 54.09-39.67 95.33-40.02c42.54 .3672 31.81 40.02 95.91 40.02c39.27 0 55.72-18.41 62.21-24.83l-140.4-116.1c3.292-1.689 31.66-18.2 75.25-18.2c12.57 0 25.18 1.397 37.53 4.21l38.59 8.844c2.412 .5592 4.824 .8272 7.2 .8272c15.91 0 31.96-12.81 31.96-32.04c0-14.58-10.03-27.77-24.84-31.16l-38.59-8.844c-17.06-3.904-34.46-5.837-51.81-5.837c-120.1 0-177.4 85.87-178.1 88.02L179.1 213.3C158.1 241.3 147.4 273.8 145 307.7C157.5 315.4 174.3 320 192.4 320zM576 397c0-15.14-10.82-28.59-26.25-31.42c-48.52-8.888-45.5-29.48-69.6-29.48c-25.02 0-31.19 31.79-96.18 31.79c-48.59 0-72.72-22.06-73.38-22.62c-6.141-6.157-14.26-9.188-22.42-9.188c-24.75 0-31.59 31.81-96.2 31.81c-48.59 0-72.69-22.03-73.41-22.59c-6.125-6.157-14.3-9.245-22.46-9.245c-8.072 0-16.12 3.026-22.38 8.901c-29.01 26.25-73.75 12.54-73.75 52.08c0 16.08 12.77 32.07 31.71 32.07c9.77 0 39.65-7.34 64.26-21.84C115.5 418.8 147.4 431.1 192 431.1s76.5-13.12 96-24.66c19.53 11.53 51.47 24.59 96 24.59c44.59 0 76.56-13.09 96.06-24.62c24.71 14.57 54.74 21.83 64.24 21.83C563.2 429.1 576 413.3 576 397zM95.1 224c35.35 0 64-28.65 64-64c0-35.35-28.65-64-64-64s-64 28.65-64 64C31.1 195.3 60.65 224 95.1 224z\"]\n};\nvar faSwimmer = faPersonSwimming;\nvar faPersonThroughWindow = {\n  prefix: 'fas',\n  iconName: 'person-through-window',\n  icon: [640, 512, [], \"e433\", \"M191.1 128C191.1 154.5 170.5 176 143.1 176C117.5 176 95.1 154.5 95.1 128C95.1 101.5 117.5 80 143.1 80C170.5 80 191.1 101.5 191.1 128zM385 336H310.5L394.6 462.2C404.4 476.1 400.5 496.8 385.8 506.6C371 516.4 351.2 512.5 341.4 497.8L308.2 448H48C21.49 448 0 426.5 0 400V48C0 21.49 21.49 0 48 0H592C618.5 0 640 21.49 640 48V400C640 426.5 618.5 448 592 448H421.9L379.2 384H425L385 336zM63.1 64V384H127.1C127.1 384 127.1 384 127.1 384V310.2C127.1 245 167.6 186.5 228.1 162.3C264.3 147.8 287.1 112.8 287.1 73.84V64H63.1zM352 64V73.84C352 128.5 324.1 178.5 279.5 207.4C279.8 207.9 280.1 208.4 280.4 208.9L321.4 271.1H392.5C406.8 271.1 420.3 278.3 429.4 289.3L508.3 384H576V64H352zM265.5 384L196.7 280.7C193.6 290 191.1 299.1 191.1 310.2V383.1C191.1 383.1 191.1 384 191.1 383.1L265.5 384z\"]\n};\nvar faPersonWalking = {\n  prefix: 'fas',\n  iconName: 'person-walking',\n  icon: [320, 512, [128694, \"walking\"], \"f554\", \"M256 48C256 74.51 234.5 96 208 96C181.5 96 160 74.51 160 48C160 21.49 181.5 0 208 0C234.5 0 256 21.49 256 48zM126.5 199.3C125.6 199.7 124.6 200.1 123.7 200.5L112.7 205.4C97.41 212.2 85.42 224.6 79.22 240.1L77.71 243.9C71.15 260.3 52.53 268.3 36.12 261.7C19.71 255.1 11.73 236.5 18.29 220.1L19.8 216.3C32.19 185.4 56.18 160.5 86.66 146.9L97.66 142C118.5 132.8 140.1 128 163.7 128C208.3 128 248.5 154.8 265.6 195.9L280.1 232.7L302.3 243.4C318.1 251.3 324.5 270.5 316.6 286.3C308.7 302.1 289.5 308.5 273.7 300.6L247 287.3C236.7 282.1 228.6 273.4 224.2 262.8L214.6 239.8L195.3 305.3L244.8 359.4C250.2 365.3 254.1 372.4 256 380.2L279 472.2C283.3 489.4 272.9 506.8 255.8 511C238.6 515.3 221.2 504.9 216.1 487.8L194.9 399.6L124.3 322.5C109.5 306.4 103.1 283.9 109.6 262.8L126.5 199.3zM68.73 398L93.69 335.6C95.84 338.6 98.16 341.4 100.7 344.2L141.4 388.6L126.9 424.8C124.5 430.9 120.9 436.4 116.3 440.9L54.63 502.6C42.13 515.1 21.87 515.1 9.372 502.6C-3.124 490.1-3.124 469.9 9.372 457.4L68.73 398z\"]\n};\nvar faWalking = faPersonWalking;\nvar faPersonWalkingArrowLoopLeft = {\n  prefix: 'fas',\n  iconName: 'person-walking-arrow-loop-left',\n  icon: [640, 512, [], \"e551\", \"M160 48C160 21.49 181.5 0 208 0C234.5 0 256 21.49 256 48C256 74.51 234.5 96 208 96C181.5 96 160 74.51 160 48V48zM112.7 205.4C97.41 212.2 85.42 224.6 79.22 240.1L77.71 243.9C71.15 260.3 52.53 268.3 36.12 261.7C19.71 255.1 11.73 236.5 18.29 220.1L19.8 216.3C32.19 185.4 56.18 160.5 86.66 146.9L97.66 142C118.5 132.8 140.1 128 163.7 128C208.3 128 248.5 154.8 265.6 195.9L280.1 232.7L302.3 243.4C318.1 251.3 324.5 270.5 316.6 286.3C308.7 302.1 289.5 308.5 273.7 300.6L247 287.3C236.7 282.1 228.6 273.4 224.2 262.8L214.6 239.8L195.3 305.3L244.8 359.4C250.2 365.3 254.1 372.4 256 380.2L279 472.2C283.3 489.4 272.9 506.8 255.8 511C238.6 515.3 221.2 504.9 216.1 487.8L194.9 399.6L124.3 322.5C109.5 306.4 103.1 283.9 109.6 262.8L126.5 199.3C125.6 199.7 124.6 200.1 123.7 200.5L112.7 205.4zM100.7 344.2L141.4 388.6L126.9 424.8C124.5 430.9 120.9 436.4 116.3 440.9L54.63 502.6C42.13 515.1 21.87 515.1 9.372 502.6C-3.124 490.1-3.124 469.9 9.372 457.4L68.73 398L93.69 335.6C95.84 338.6 98.17 341.4 100.7 344.2H100.7zM361.4 374.6C348.9 362.1 348.9 341.9 361.4 329.4L441.4 249.4C453.9 236.9 474.1 236.9 486.6 249.4C499.1 261.9 499.1 282.1 486.6 294.6L461.3 320H480C533 320 576 277 576 224C576 170.1 533 128 480 128H352C334.3 128 319.1 113.7 319.1 96C319.1 78.33 334.3 64 352 64H480C568.4 64 640 135.6 640 224C640 312.4 568.4 384 480 384H461.3L486.6 409.4C499.1 421.9 499.1 442.1 486.6 454.6C474.1 467.1 453.9 467.1 441.4 454.6L361.4 374.6z\"]\n};\nvar faPersonWalkingArrowRight = {\n  prefix: 'fas',\n  iconName: 'person-walking-arrow-right',\n  icon: [640, 512, [], \"e552\", \"M160 48C160 21.49 181.5 0 208 0C234.5 0 256 21.49 256 48C256 74.51 234.5 96 208 96C181.5 96 160 74.51 160 48V48zM112.7 205.4C97.41 212.2 85.42 224.6 79.22 240.1L77.71 243.9C71.15 260.3 52.53 268.3 36.12 261.7C19.71 255.1 11.73 236.5 18.29 220.1L19.8 216.3C32.19 185.4 56.18 160.5 86.66 146.9L97.66 142C118.5 132.8 140.1 128 163.7 128C208.3 128 248.5 154.8 265.6 195.9L280.1 232.7L302.3 243.4C318.1 251.3 324.5 270.5 316.6 286.3C308.7 302.1 289.5 308.5 273.7 300.6L247 287.3C236.7 282.1 228.6 273.4 224.2 262.8L214.6 239.8L195.3 305.3L244.8 359.4C250.2 365.3 254.1 372.4 256 380.2L279 472.2C283.3 489.4 272.9 506.8 255.8 511C238.6 515.3 221.2 504.9 216.1 487.8L194.9 399.6L124.3 322.5C109.5 306.4 103.1 283.9 109.6 262.8L126.5 199.3C125.6 199.7 124.6 200.1 123.7 200.5L112.7 205.4zM100.7 344.2L141.4 388.6L126.9 424.8C124.5 430.9 120.9 436.4 116.3 440.9L54.63 502.6C42.13 515.1 21.87 515.1 9.372 502.6C-3.124 490.1-3.124 469.9 9.372 457.4L68.73 398L93.69 335.6C95.84 338.6 98.17 341.4 100.7 344.2H100.7zM630.6 233.4C643.1 245.9 643.1 266.1 630.6 278.6L550.6 358.6C538.1 371.1 517.9 371.1 505.4 358.6C492.9 346.1 492.9 325.9 505.4 313.4L530.7 288H384C366.3 288 352 273.7 352 256C352 238.3 366.3 224 384 224H530.7L505.4 198.6C492.9 186.1 492.9 165.9 505.4 153.4C517.9 140.9 538.1 140.9 550.6 153.4L630.6 233.4z\"]\n};\nvar faPersonWalkingDashedLineArrowRight = {\n  prefix: 'fas',\n  iconName: 'person-walking-dashed-line-arrow-right',\n  icon: [640, 512, [], \"e553\", \"M160 48C160 21.49 181.5 0 208 0C234.5 0 256 21.49 256 48C256 74.51 234.5 96 208 96C181.5 96 160 74.51 160 48V48zM112.7 205.4C97.41 212.2 85.42 224.6 79.22 240.1L77.71 243.9C71.15 260.3 52.53 268.3 36.12 261.7C19.71 255.1 11.73 236.5 18.29 220.1L19.8 216.3C32.19 185.4 56.18 160.5 86.66 146.9L97.66 142C118.5 132.8 140.1 128 163.7 128C208.3 128 248.5 154.8 265.6 195.9L280.1 232.7L302.3 243.4C318.1 251.3 324.5 270.5 316.6 286.3C308.7 302.1 289.5 308.5 273.7 300.6L247 287.3C236.7 282.1 228.6 273.4 224.2 262.8L214.6 239.8L195.3 305.3L244.8 359.4C250.2 365.3 254.1 372.4 256 380.2L279 472.2C283.3 489.4 272.9 506.8 255.8 511C238.6 515.3 221.2 504.9 216.1 487.8L194.9 399.6L124.3 322.5C109.5 306.4 103.1 283.9 109.6 262.8L126.5 199.3C125.6 199.7 124.6 200.1 123.7 200.5L112.7 205.4zM100.7 344.2L141.4 388.6L126.9 424.8C124.5 430.9 120.9 436.4 116.3 440.9L54.63 502.6C42.13 515.1 21.87 515.1 9.372 502.6C-3.124 490.1-3.124 469.9 9.372 457.4L68.73 398L93.69 335.6C95.84 338.6 98.17 341.4 100.7 344.2H100.7zM630.6 233.4C643.1 245.9 643.1 266.1 630.6 278.6L550.6 358.6C538.1 371.1 517.9 371.1 505.4 358.6C492.9 346.1 492.9 325.9 505.4 313.4L530.7 288H384C366.3 288 352 273.7 352 256C352 238.3 366.3 224 384 224H530.7L505.4 198.6C492.9 186.1 492.9 165.9 505.4 153.4C517.9 140.9 538.1 140.9 550.6 153.4L630.6 233.4zM392 0C405.3 0 416 10.75 416 24V72C416 85.25 405.3 96 392 96C378.7 96 368 85.25 368 72V24C368 10.75 378.7 0 392 0zM416 168C416 181.3 405.3 192 392 192C378.7 192 368 181.3 368 168V152C368 138.7 378.7 128 392 128C405.3 128 416 138.7 416 152V168zM392 320C405.3 320 416 330.7 416 344V360C416 373.3 405.3 384 392 384C378.7 384 368 373.3 368 360V344C368 330.7 378.7 320 392 320zM416 488C416 501.3 405.3 512 392 512C378.7 512 368 501.3 368 488V440C368 426.7 378.7 416 392 416C405.3 416 416 426.7 416 440V488z\"]\n};\nvar faPersonWalkingLuggage = {\n  prefix: 'fas',\n  iconName: 'person-walking-luggage',\n  icon: [512, 512, [], \"e554\", \"M352 48C352 21.49 373.5 0 400 0C426.5 0 448 21.49 448 48C448 74.51 426.5 96 400 96C373.5 96 352 74.51 352 48zM304.6 205.4C289.4 212.2 277.4 224.6 271.2 240.1L269.7 243.9C263.1 260.3 244.5 268.3 228.1 261.7C211.7 255.1 203.7 236.5 210.3 220.1L211.8 216.3C224.2 185.4 248.2 160.5 278.7 146.9L289.7 142C310.5 132.8 332.1 128 355.7 128C400.3 128 440.5 154.8 457.6 195.9L472.1 232.7L494.3 243.4C510.1 251.3 516.5 270.5 508.6 286.3C500.7 302.1 481.5 308.5 465.7 300.6L439 287.3C428.7 282.1 420.6 273.4 416.2 262.8L406.6 239.8L387.3 305.3L436.8 359.4C442.2 365.3 446.1 372.4 448 380.2L471 472.2C475.3 489.4 464.9 506.8 447.8 511C430.6 515.3 413.2 504.9 408.1 487.8L386.9 399.6L316.3 322.5C301.5 306.4 295.1 283.9 301.6 262.8L318.5 199.3C317.6 199.7 316.6 200.1 315.7 200.5L304.6 205.4zM292.7 344.2L333.4 388.6L318.9 424.8C316.5 430.9 312.9 436.4 308.3 440.9L246.6 502.6C234.1 515.1 213.9 515.1 201.4 502.6C188.9 490.1 188.9 469.9 201.4 457.4L260.7 398L285.7 335.6C287.8 338.6 290.2 341.4 292.7 344.2H292.7zM223.1 274.1C231.7 278.6 234.3 288.3 229.9 295.1L186.1 371.8C185.4 374.5 184.3 377.2 182.9 379.7L118.9 490.6C110 505.9 90.44 511.1 75.14 502.3L19.71 470.3C4.407 461.4-.8371 441.9 7.999 426.6L71.1 315.7C80.84 300.4 100.4 295.2 115.7 303.1L170.1 335.4L202.1 279.1C206.6 272.3 216.3 269.7 223.1 274.1H223.1z\"]\n};\nvar faPersonWalkingWithCane = {\n  prefix: 'fas',\n  iconName: 'person-walking-with-cane',\n  icon: [448, 512, [\"blind\"], \"f29d\", \"M445.2 486.1l-117.3-172.6c-3.002 4.529-6.646 8.652-11.12 12c-4.414 3.318-9.299 5.689-14.43 7.307l116.4 171.3c3.094 4.547 8.127 7.008 13.22 7.008c3.125 0 6.247-.8984 8.997-2.773C448.3 504.2 450.2 494.3 445.2 486.1zM143.1 95.1c26.51 0 48.01-21.49 48.01-47.1S170.5 0 144 0S96 21.49 96 48S117.5 95.1 143.1 95.1zM96.01 348.1l-31.03 124.2c-4.312 17.16 6.125 34.53 23.28 38.81C90.86 511.7 93.48 512 96.04 512c14.34 0 27.38-9.703 31-24.23l22.04-88.18L96.01 346.5V348.1zM313.6 268.8l-76.78-102.4C218.8 142.3 190.1 128 160 128L135.6 127.1c-36.59 0-69.5 20.33-85.87 53.06L3.387 273.7C-4.518 289.5 1.887 308.7 17.7 316.6c4.594 2.297 9.469 3.375 14.28 3.375c11.75 0 23.03-6.469 28.66-17.69l35.38-70.76v56.45c0 8.484 3.375 16.62 9.375 22.63l86.63 86.63v82.75c0 17.67 14.31 32 32 32c17.69 0 32-14.33 32-32v-82.75c0-17.09-6.656-33.16-18.75-45.25L192 306.8V213.3l70.38 93.88c10.59 14.11 30.62 16.98 44.78 6.406C321.3 303 324.2 282.9 313.6 268.8z\"]\n};\nvar faBlind = faPersonWalkingWithCane;\nvar faPesetaSign = {\n  prefix: 'fas',\n  iconName: 'peseta-sign',\n  icon: [384, 512, [], \"e221\", \"M192 32C269.4 32 333.1 86.97 348.8 160H352C369.7 160 384 174.3 384 192C384 209.7 369.7 224 352 224H348.8C333.1 297 269.4 352 192 352H96V448C96 465.7 81.67 480 64 480C46.33 480 32 465.7 32 448V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160V64C32 46.33 46.33 32 64 32H192zM282.5 160C269.4 122.7 233.8 96 192 96H96V160H282.5zM96 224V288H192C233.8 288 269.4 261.3 282.5 224H96z\"]\n};\nvar faPesoSign = {\n  prefix: 'fas',\n  iconName: 'peso-sign',\n  icon: [384, 512, [], \"e222\", \"M176 32C244.4 32 303.7 71.01 332.8 128H352C369.7 128 384 142.3 384 160C384 177.7 369.7 192 352 192H351.3C351.8 197.3 352 202.6 352 208C352 213.4 351.8 218.7 351.3 224H352C369.7 224 384 238.3 384 256C384 273.7 369.7 288 352 288H332.8C303.7 344.1 244.4 384 176 384H96V448C96 465.7 81.67 480 64 480C46.33 480 32 465.7 32 448V288C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224V192C14.33 192 0 177.7 0 160C0 142.3 14.33 128 32 128V64C32 46.33 46.33 32 64 32H176zM254.4 128C234.2 108.2 206.5 96 176 96H96V128H254.4zM96 192V224H286.9C287.6 218.8 288 213.4 288 208C288 202.6 287.6 197.2 286.9 192H96zM254.4 288H96V320H176C206.5 320 234.2 307.8 254.4 288z\"]\n};\nvar faPhone = {\n  prefix: 'fas',\n  iconName: 'phone',\n  icon: [512, 512, [128379, 128222], \"f095\", \"M511.2 387l-23.25 100.8c-3.266 14.25-15.79 24.22-30.46 24.22C205.2 512 0 306.8 0 54.5c0-14.66 9.969-27.2 24.22-30.45l100.8-23.25C139.7-2.602 154.7 5.018 160.8 18.92l46.52 108.5c5.438 12.78 1.77 27.67-8.98 36.45L144.5 207.1c33.98 69.22 90.26 125.5 159.5 159.5l44.08-53.8c8.688-10.78 23.69-14.51 36.47-8.975l108.5 46.51C506.1 357.2 514.6 372.4 511.2 387z\"]\n};\nvar faPhoneFlip = {\n  prefix: 'fas',\n  iconName: 'phone-flip',\n  icon: [512, 512, [128381, \"phone-alt\"], \"f879\", \"M18.92 351.2l108.5-46.52c12.78-5.531 27.77-1.801 36.45 8.98l44.09 53.82c69.25-34 125.5-90.31 159.5-159.5l-53.81-44.04c-10.75-8.781-14.41-23.69-8.974-36.47l46.51-108.5c6.094-13.91 21.1-21.52 35.79-18.11l100.8 23.25c14.25 3.25 24.22 15.8 24.22 30.46c0 252.3-205.2 457.5-457.5 457.5c-14.67 0-27.18-9.968-30.45-24.22l-23.25-100.8C-2.571 372.4 5.018 357.2 18.92 351.2z\"]\n};\nvar faPhoneAlt = faPhoneFlip;\nvar faPhoneSlash = {\n  prefix: 'fas',\n  iconName: 'phone-slash',\n  icon: [640, 512, [], \"f3dd\", \"M271.1 367.5L227.9 313.7c-8.688-10.78-23.69-14.51-36.47-8.974l-108.5 46.51c-13.91 6-21.49 21.19-18.11 35.79l23.25 100.8C91.32 502 103.8 512 118.5 512c107.4 0 206.1-37.46 284.2-99.65l-88.75-69.56C300.6 351.9 286.6 360.3 271.1 367.5zM630.8 469.1l-159.6-125.1c65.03-78.97 104.7-179.5 104.7-289.5c0-14.66-9.969-27.2-24.22-30.45L451 .8125c-14.69-3.406-29.73 4.213-35.82 18.12l-46.52 108.5c-5.438 12.78-1.771 27.67 8.979 36.45l53.82 44.08C419.2 232.1 403.9 256.2 386.2 277.4L38.81 5.111C34.41 1.673 29.19 0 24.03 0C16.91 0 9.84 3.158 5.121 9.189c-8.188 10.44-6.37 25.53 4.068 33.7l591.1 463.1c10.5 8.203 25.57 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faPhoneVolume = {\n  prefix: 'fas',\n  iconName: 'phone-volume',\n  icon: [512, 512, [\"volume-control-phone\"], \"f2a0\", \"M284.6 181.9c-10.28-8.344-25.41-6.875-33.75 3.406C242.4 195.6 243.9 210.7 254.2 219.1c11.31 9.25 17.81 22.69 17.81 36.87c0 14.19-6.5 27.62-17.81 36.87c-10.28 8.406-11.78 23.53-3.375 33.78c4.719 5.812 11.62 8.812 18.56 8.812c5.344 0 10.75-1.781 15.19-5.406c22.53-18.44 35.44-45.4 35.44-74.05S307.1 200.4 284.6 181.9zM345.1 107.1c-10.22-8.344-25.34-6.907-33.78 3.343c-8.406 10.25-6.906 25.37 3.344 33.78c33.88 27.78 53.31 68.18 53.31 110.9s-19.44 83.09-53.31 110.9c-10.25 8.406-11.75 23.53-3.344 33.78c4.75 5.781 11.62 8.781 18.56 8.781c5.375 0 10.75-1.781 15.22-5.438C390.2 367.1 416 313.1 416 255.1S390.2 144.9 345.1 107.1zM406.4 33.15c-10.22-8.344-25.34-6.875-33.78 3.344c-8.406 10.25-6.906 25.37 3.344 33.78C431.9 116.1 464 183.8 464 255.1s-32.09 139.9-88.06 185.7c-10.25 8.406-11.75 23.53-3.344 33.78c4.75 5.781 11.62 8.781 18.56 8.781c5.375 0 10.75-1.781 15.22-5.438C473.5 423.8 512 342.6 512 255.1S473.5 88.15 406.4 33.15zM151.3 174.6C161.1 175.6 172.1 169.5 176 159.6l33.75-84.38C214 64.35 209.1 51.1 200.2 45.86l-67.47-42.17C123.2-2.289 110.9-.8945 102.9 7.08C-34.32 144.3-34.31 367.7 102.9 504.9c7.982 7.984 20.22 9.379 29.75 3.402l67.48-42.19c9.775-6.104 13.9-18.47 9.598-29.3L176 352.5c-3.945-9.963-14.14-16.11-24.73-14.97l-53.24 5.314C78.89 286.7 78.89 225.4 98.06 169.3L151.3 174.6z\"]\n};\nvar faVolumeControlPhone = faPhoneVolume;\nvar faPhotoFilm = {\n  prefix: 'fas',\n  iconName: 'photo-film',\n  icon: [640, 512, [\"photo-video\"], \"f87c\", \"M352 432c0 8.836-7.164 16-16 16H176c-8.838 0-16-7.164-16-16L160 128H48C21.49 128 .0003 149.5 .0003 176v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48L512 384h-160L352 432zM104 439c0 4.969-4.031 9-9 9h-30c-4.969 0-9-4.031-9-9v-30c0-4.969 4.031-9 9-9h30c4.969 0 9 4.031 9 9V439zM104 335c0 4.969-4.031 9-9 9h-30c-4.969 0-9-4.031-9-9v-30c0-4.969 4.031-9 9-9h30c4.969 0 9 4.031 9 9V335zM104 231c0 4.969-4.031 9-9 9h-30c-4.969 0-9-4.031-9-9v-30C56 196 60.03 192 65 192h30c4.969 0 9 4.031 9 9V231zM408 409c0-4.969 4.031-9 9-9h30c4.969 0 9 4.031 9 9v30c0 4.969-4.031 9-9 9h-30c-4.969 0-9-4.031-9-9V409zM591.1 0H239.1C213.5 0 191.1 21.49 191.1 48v256c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48v-256C640 21.49 618.5 0 591.1 0zM303.1 64c17.68 0 32 14.33 32 32s-14.32 32-32 32C286.3 128 271.1 113.7 271.1 96S286.3 64 303.1 64zM574.1 279.6C571.3 284.8 565.9 288 560 288H271.1C265.1 288 260.5 284.6 257.7 279.3C255 273.9 255.5 267.4 259.1 262.6l70-96C332.1 162.4 336.9 160 341.1 160c5.11 0 9.914 2.441 12.93 6.574l22.35 30.66l62.74-94.11C442.1 98.67 447.1 96 453.3 96c5.348 0 10.34 2.672 13.31 7.125l106.7 160C576.6 268 576.9 274.3 574.1 279.6z\"]\n};\nvar faPhotoVideo = faPhotoFilm;\nvar faPiggyBank = {\n  prefix: 'fas',\n  iconName: 'piggy-bank',\n  icon: [576, 512, [], \"f4d3\", \"M400 96L399.1 96.66C394.7 96.22 389.4 96 384 96H256C239.5 96 223.5 98.08 208.2 102C208.1 100 208 98.02 208 96C208 42.98 250.1 0 304 0C357 0 400 42.98 400 96zM384 128C387.5 128 390.1 128.1 394.4 128.3C398.7 128.6 402.9 129 407 129.6C424.6 109.1 450.8 96 480 96H512L493.2 171.1C509.1 185.9 521.9 203.9 530.7 224H544C561.7 224 576 238.3 576 256V352C576 369.7 561.7 384 544 384H512C502.9 396.1 492.1 406.9 480 416V480C480 497.7 465.7 512 448 512H416C398.3 512 384 497.7 384 480V448H256V480C256 497.7 241.7 512 224 512H192C174.3 512 160 497.7 160 480V416C125.1 389.8 101.3 349.8 96.79 304H68C30.44 304 0 273.6 0 236C0 198.4 30.44 168 68 168H72C85.25 168 96 178.7 96 192C96 205.3 85.25 216 72 216H68C56.95 216 48 224.1 48 236C48 247 56.95 256 68 256H99.2C111.3 196.2 156.9 148.5 215.5 133.2C228.4 129.8 241.1 128 256 128H384zM424 240C410.7 240 400 250.7 400 264C400 277.3 410.7 288 424 288C437.3 288 448 277.3 448 264C448 250.7 437.3 240 424 240z\"]\n};\nvar faPills = {\n  prefix: 'fas',\n  iconName: 'pills',\n  icon: [576, 512, [], \"f484\", \"M112 32C50.12 32 0 82.12 0 143.1v223.1c0 61.88 50.12 111.1 112 111.1s112-50.12 112-111.1V143.1C224 82.12 173.9 32 112 32zM160 256H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48V256zM299.8 226.2c-3.5-3.5-9.5-3-12.38 .875c-45.25 62.5-40.38 150.1 15.88 206.4c56.38 56.25 144 61.25 206.5 15.88c4-2.875 4.249-8.75 .75-12.25L299.8 226.2zM529.5 207.2c-56.25-56.25-143.9-61.13-206.4-15.87c-4 2.875-4.375 8.875-.875 12.38l210.9 210.7c3.5 3.5 9.375 3.125 12.25-.75C590.8 351.1 585.9 263.6 529.5 207.2z\"]\n};\nvar faPizzaSlice = {\n  prefix: 'fas',\n  iconName: 'pizza-slice',\n  icon: [512, 512, [], \"f818\", \"M100.4 112.3L.5101 491.7c-1.375 5.625 .1622 11.6 4.287 15.6c4.127 4.125 10.13 5.744 15.63 4.119l379.1-105.1C395.3 231.4 276.5 114.1 100.4 112.3zM127.1 416c-17.62 0-32-14.38-32-31.1c0-17.62 14.39-32 32.01-32c17.63 0 32 14.38 32 31.1C160 401.6 145.6 416 127.1 416zM175.1 271.1c-17.63 0-32-14.38-32-32c0-17.62 14.38-31.1 32-31.1c17.62 0 32 14.38 32 31.1C208 257.6 193.6 271.1 175.1 271.1zM272 367.1c-17.62 0-32-14.38-32-31.1c0-17.62 14.38-32 32-32c17.63 0 32 14.38 32 32C304 353.6 289.6 367.1 272 367.1zM158.9 .1406c-16.13-1.5-31.25 8.501-35.38 24.12L108.7 80.52c187.6 5.5 314.5 130.6 322.5 316.1l56.88-15.75c15.75-4.375 25.5-19.62 23.63-35.87C490.9 165.1 340.8 17.39 158.9 .1406z\"]\n};\nvar faPlaceOfWorship = {\n  prefix: 'fas',\n  iconName: 'place-of-worship',\n  icon: [640, 512, [], \"f67f\", \"M233.4 86.63L308.7 11.32C314.9 5.067 325.1 5.067 331.3 11.32L406.6 86.63C412.6 92.63 416 100.8 416 109.3V217.6L456.7 242C471.2 250.7 480 266.3 480 283.2V512H384V416C384 380.7 355.3 352 319.1 352C284.7 352 255.1 380.7 255.1 416V512H159.1V283.2C159.1 266.3 168.8 250.7 183.3 242L223.1 217.6V109.3C223.1 100.8 227.4 92.63 233.4 86.63H233.4zM24.87 330.3L128 273.6V512H48C21.49 512 0 490.5 0 464V372.4C0 354.9 9.53 338.8 24.87 330.3V330.3zM592 512H512V273.6L615.1 330.3C630.5 338.8 640 354.9 640 372.4V464C640 490.5 618.5 512 592 512V512z\"]\n};\nvar faPlane = {\n  prefix: 'fas',\n  iconName: 'plane',\n  icon: [576, 512, [], \"f072\", \"M482.3 192C516.5 192 576 221 576 256C576 292 516.5 320 482.3 320H365.7L265.2 495.9C259.5 505.8 248.9 512 237.4 512H181.2C170.6 512 162.9 501.8 165.8 491.6L214.9 320H112L68.8 377.6C65.78 381.6 61.04 384 56 384H14.03C6.284 384 0 377.7 0 369.1C0 368.7 .1818 367.4 .5398 366.1L32 256L.5398 145.9C.1818 144.6 0 143.3 0 142C0 134.3 6.284 128 14.03 128H56C61.04 128 65.78 130.4 68.8 134.4L112 192H214.9L165.8 20.4C162.9 10.17 170.6 0 181.2 0H237.4C248.9 0 259.5 6.153 265.2 16.12L365.7 192H482.3z\"]\n};\nvar faPlaneArrival = {\n  prefix: 'fas',\n  iconName: 'plane-arrival',\n  icon: [640, 512, [128748], \"f5af\", \"M.2528 166.9L.0426 67.99C.0208 57.74 9.508 50.11 19.51 52.34L55.07 60.24C65.63 62.58 74.29 70.11 78.09 80.24L95.1 127.1L223.3 165.6L181.8 20.4C178.9 10.18 186.6 .001 197.2 .001H237.3C248.8 .001 259.5 6.236 265.2 16.31L374.2 210.2L481.5 241.8C497.4 246.5 512.2 254.3 525.2 264.7L559.6 292.2C583.7 311.4 577.7 349.5 548.9 360.5C507.7 376.1 462.7 378.5 420.1 367.4L121.7 289.8C110.6 286.9 100.5 281.1 92.4 272.9L9.536 189.4C3.606 183.4 .2707 175.3 .2528 166.9V166.9zM608 448C625.7 448 640 462.3 640 480C640 497.7 625.7 512 608 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H608zM192 368C192 385.7 177.7 400 160 400C142.3 400 128 385.7 128 368C128 350.3 142.3 336 160 336C177.7 336 192 350.3 192 368zM224 384C224 366.3 238.3 352 256 352C273.7 352 288 366.3 288 384C288 401.7 273.7 416 256 416C238.3 416 224 401.7 224 384z\"]\n};\nvar faPlaneCircleCheck = {\n  prefix: 'fas',\n  iconName: 'plane-circle-check',\n  icon: [640, 512, [], \"e555\", \"M320 93.68V178.3L397.1 222.4C350.6 254 320 307.4 320 368C320 422.2 344.5 470.7 383.1 502.1C381 508.3 375.9 512 369.1 512C368.7 512 367.4 511.8 366.1 511.5L256 480L145.9 511.5C144.6 511.8 143.3 512 142 512C134.3 512 128 505.7 128 497.1V456C128 450.1 130.4 446.2 134.4 443.2L192 400V329.1L20.4 378.2C10.17 381.1 0 373.4 0 362.8V297.3C0 291.5 3.076 286.2 8.062 283.4L192 178.3V93.68C192 59.53 221 0 256 0C292 0 320 59.53 320 93.68H320zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faPlaneCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'plane-circle-exclamation',\n  icon: [640, 512, [], \"e556\", \"M320 93.68V178.3L397.1 222.4C350.6 254 320 307.4 320 368C320 422.2 344.5 470.7 383.1 502.1C381 508.3 375.9 512 369.1 512C368.7 512 367.4 511.8 366.1 511.5L256 480L145.9 511.5C144.6 511.8 143.3 512 142 512C134.3 512 128 505.7 128 497.1V456C128 450.1 130.4 446.2 134.4 443.2L192 400V329.1L20.4 378.2C10.17 381.1 0 373.4 0 362.8V297.3C0 291.5 3.076 286.2 8.062 283.4L192 178.3V93.68C192 59.53 221 0 256 0C292 0 320 59.53 320 93.68H320zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faPlaneCircleXmark = {\n  prefix: 'fas',\n  iconName: 'plane-circle-xmark',\n  icon: [640, 512, [], \"e557\", \"M320 93.68V178.3L397.1 222.4C350.6 254 320 307.4 320 368C320 422.2 344.5 470.7 383.1 502.1C381 508.3 375.9 512 369.1 512C368.7 512 367.4 511.8 366.1 511.5L256 480L145.9 511.5C144.6 511.8 143.3 512 142 512C134.3 512 128 505.7 128 497.1V456C128 450.1 130.4 446.2 134.4 443.2L192 400V329.1L20.4 378.2C10.17 381.1 0 373.4 0 362.8V297.3C0 291.5 3.076 286.2 8.062 283.4L192 178.3V93.68C192 59.53 221 0 256 0C292 0 320 59.53 320 93.68H320zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368L555.3 331.3z\"]\n};\nvar faPlaneDeparture = {\n  prefix: 'fas',\n  iconName: 'plane-departure',\n  icon: [640, 512, [128747], \"f5b0\", \"M484.6 62C502.6 52.8 522.6 48 542.8 48H600.2C627.2 48 645.9 74.95 636.4 100.2C618.2 148.9 582.1 188.9 535.6 212.2L262.8 348.6C258.3 350.8 253.4 352 248.4 352H110.7C101.4 352 92.5 347.9 86.42 340.8L13.34 255.6C6.562 247.7 9.019 235.5 18.33 230.8L50.49 214.8C59.05 210.5 69.06 210.2 77.8 214.1L135.1 239.1L234.6 189.7L87.64 95.2C77.21 88.49 78.05 72.98 89.14 67.43L135 44.48C150.1 36.52 169.5 35.55 186.1 41.8L381 114.9L484.6 62zM0 480C0 462.3 14.33 448 32 448H608C625.7 448 640 462.3 640 480C640 497.7 625.7 512 608 512H32C14.33 512 0 497.7 0 480z\"]\n};\nvar faPlaneLock = {\n  prefix: 'fas',\n  iconName: 'plane-lock',\n  icon: [640, 512, [], \"e558\", \"M192 93.68C192 59.53 221 0 256 0C292 0 320 59.53 320 93.68V178.3L421.8 236.4C418 247.6 416 259.6 416 272V296.6C398.1 306.9 385.7 325.7 384.2 347.5L320 329.1V400L377.6 443.2C381.6 446.2 384 450.1 384 456V497.1C384 505.7 377.7 512 369.1 512C368.7 512 367.4 511.8 366.1 511.5L256 480L145.9 511.5C144.6 511.8 143.3 512 142 512C134.3 512 128 505.7 128 497.1V456C128 450.1 130.4 446.2 134.4 443.2L192 400V329.1L20.4 378.2C10.17 381.1 0 373.4 0 362.8V297.3C0 291.5 3.076 286.2 8.062 283.4L192 178.3L192 93.68zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faPlaneSlash = {\n  prefix: 'fas',\n  iconName: 'plane-slash',\n  icon: [640, 512, [], \"e069\", \"M238.1 161.3L197.8 20.4C194.9 10.17 202.6-.0001 213.2-.0001H269.4C280.9-.0001 291.5 6.153 297.2 16.12L397.7 192H514.3C548.5 192 608 221 608 256C608 292 548.5 320 514.3 320H440.6L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.237 28.37-3.065 38.81 5.112L238.1 161.3zM41.54 128.7L362.5 381.6L297.2 495.9C291.5 505.8 280.9 512 269.4 512H213.2C202.6 512 194.9 501.8 197.8 491.6L246.9 319.1H144L100.8 377.6C97.78 381.6 93.04 384 88 384H46.03C38.28 384 32 377.7 32 369.1C32 368.7 32.18 367.4 32.54 366.1L64 255.1L32.54 145.9C32.18 144.6 32 143.3 32 142C32 135.9 35.1 130.6 41.54 128.7V128.7z\"]\n};\nvar faPlaneUp = {\n  prefix: 'fas',\n  iconName: 'plane-up',\n  icon: [512, 512, [], \"e22d\", \"M192 93.68C192 59.53 221 0 256 0C292 0 320 59.53 320 93.68V160L497.8 278.5C506.7 284.4 512 294.4 512 305.1V361.8C512 372.7 501.3 380.4 490.9 376.1L320 319.1V400L377.6 443.2C381.6 446.2 384 450.1 384 456V497.1C384 505.7 377.7 512 369.1 512C368.7 512 367.4 511.8 366.1 511.5L256 480L145.9 511.5C144.6 511.8 143.3 512 142 512C134.3 512 128 505.7 128 497.1V456C128 450.1 130.4 446.2 134.4 443.2L192 400V319.1L21.06 376.1C10.7 380.4 0 372.7 0 361.8V305.1C0 294.4 5.347 284.4 14.25 278.5L192 160L192 93.68z\"]\n};\nvar faPlantWilt = {\n  prefix: 'fas',\n  iconName: 'plant-wilt',\n  icon: [512, 512, [], \"e43b\", \"M288 512H224V248C224 217.1 198.9 192 168 192C137.1 192 112 217.1 112 248V260.1C141.3 270.9 160 295.5 160 331.1C160 359.1 124.2 410.5 80 448C35.83 410.5 0 360.4 0 331.1C0 295.5 18.67 270.9 48 260.1V248C48 181.7 101.7 128 168 128C188.2 128 207.3 133 224 141.8V120C224 53.73 277.7 0 344 0C410.3 0 464 53.73 464 120V132.1C493.3 142.9 512 167.5 512 203.1C512 231.1 476.2 282.5 432 320C387.8 282.5 352 232.4 352 203.1C352 167.5 370.7 142.9 400 132.1V120C400 89.07 374.9 64 344 64C313.1 64 288 89.07 288 120V512z\"]\n};\nvar faPlateWheat = {\n  prefix: 'fas',\n  iconName: 'plate-wheat',\n  icon: [512, 512, [], \"e55a\", \"M256 112V128C256 136.8 248.8 144 240 144C195.8 144 160 108.2 160 64V48C160 39.16 167.2 32 176 32C220.2 32 256 67.82 256 112zM104 64C117.3 64 128 74.75 128 88C128 101.3 117.3 112 104 112H56C42.75 112 32 101.3 32 88C32 74.75 42.75 64 56 64H104zM136 136C149.3 136 160 146.7 160 160C160 173.3 149.3 184 136 184H24C10.75 184 0 173.3 0 160C0 146.7 10.75 136 24 136H136zM32 232C32 218.7 42.75 208 56 208H104C117.3 208 128 218.7 128 232C128 245.3 117.3 256 104 256H56C42.75 256 32 245.3 32 232zM272 48C272 39.16 279.2 32 288 32C332.2 32 368 67.82 368 112V128C368 136.8 360.8 144 352 144C307.8 144 272 108.2 272 64V48zM480 112V128C480 136.8 472.8 144 464 144C419.8 144 384 108.2 384 64V48C384 39.16 391.2 32 400 32C444.2 32 480 67.82 480 112zM480 208C480 252.2 444.2 288 400 288C391.2 288 384 280.8 384 272V256C384 211.8 419.8 176 464 176C472.8 176 480 183.2 480 192V208zM352 176C360.8 176 368 183.2 368 192V208C368 252.2 332.2 288 288 288C279.2 288 272 280.8 272 272V256C272 211.8 307.8 176 352 176zM256 208C256 252.2 220.2 288 176 288C167.2 288 160 280.8 160 272V256C160 211.8 195.8 176 240 176C248.8 176 256 183.2 256 192V208zM0 352C0 334.3 14.33 320 32 320H480C497.7 320 512 334.3 512 352C512 411.7 471.1 461.9 415.8 476C415.9 477.3 416 478.7 416 480C416 497.7 401.7 512 384 512H128C110.3 512 96 497.7 96 480C96 478.7 96.08 477.3 96.24 476C40.91 461.9 0 411.7 0 352V352z\"]\n};\nvar faPlay = {\n  prefix: 'fas',\n  iconName: 'play',\n  icon: [384, 512, [9654], \"f04b\", \"M361 215C375.3 223.8 384 239.3 384 256C384 272.7 375.3 288.2 361 296.1L73.03 472.1C58.21 482 39.66 482.4 24.52 473.9C9.377 465.4 0 449.4 0 432V80C0 62.64 9.377 46.63 24.52 38.13C39.66 29.64 58.21 29.99 73.03 39.04L361 215z\"]\n};\nvar faPlug = {\n  prefix: 'fas',\n  iconName: 'plug',\n  icon: [384, 512, [128268], \"f1e6\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 209.7 369.7 224 352 224V256C352 333.4 297 397.1 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352z\"]\n};\nvar faPlugCircleBolt = {\n  prefix: 'fas',\n  iconName: 'plug-circle-bolt',\n  icon: [576, 512, [], \"e55b\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 194.3 383.7 196.6 383.3 198.8C309.8 219.1 256 287.7 256 368C256 379.4 257.1 390.5 259.1 401.3C248.1 406.4 236.3 410.3 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM464.8 286.4L368.8 358.4C364.7 361.5 362.1 366.9 364.6 371.8C366.2 376.7 370.8 380 376 380H411.6L381.5 434.2C378.8 439.1 379.8 445.3 384.1 449C388.4 452.8 394.7 452.1 399.2 449.6L495.2 377.6C499.3 374.5 501 369.1 499.4 364.2C497.8 359.3 493.2 356 488 356H452.4L482.5 301.8C485.2 296.9 484.2 290.7 479.9 286.1C475.6 283.2 469.3 283 464.8 286.4V286.4z\"]\n};\nvar faPlugCircleCheck = {\n  prefix: 'fas',\n  iconName: 'plug-circle-check',\n  icon: [576, 512, [], \"e55c\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 194.3 383.7 196.6 383.3 198.8C309.8 219.1 256 287.7 256 368C256 379.4 257.1 390.5 259.1 401.3C248.1 406.4 236.3 410.3 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM476.7 324.7L416 385.4L387.3 356.7C381.1 350.4 370.9 350.4 364.7 356.7C358.4 362.9 358.4 373.1 364.7 379.3L404.7 419.3C410.9 425.6 421.1 425.6 427.3 419.3L499.3 347.3C505.6 341.1 505.6 330.9 499.3 324.7C493.1 318.4 482.9 318.4 476.7 324.7H476.7z\"]\n};\nvar faPlugCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'plug-circle-exclamation',\n  icon: [576, 512, [], \"e55d\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 194.3 383.7 196.6 383.3 198.8C309.8 219.1 256 287.7 256 368C256 379.4 257.1 390.5 259.1 401.3C248.1 406.4 236.3 410.3 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464zM415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288z\"]\n};\nvar faPlugCircleMinus = {\n  prefix: 'fas',\n  iconName: 'plug-circle-minus',\n  icon: [576, 512, [], \"e55e\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 194.3 383.7 196.6 383.3 198.8C309.8 219.1 256 287.7 256 368C256 379.4 257.1 390.5 259.1 401.3C248.1 406.4 236.3 410.3 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352zM576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM496 351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1z\"]\n};\nvar faPlugCirclePlus = {\n  prefix: 'fas',\n  iconName: 'plug-circle-plus',\n  icon: [576, 512, [], \"e55f\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 194.3 383.7 196.6 383.3 198.8C309.8 219.1 256 287.7 256 368C256 379.4 257.1 390.5 259.1 401.3C248.1 406.4 236.3 410.3 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM448 303.1C448 295.2 440.8 287.1 432 287.1C423.2 287.1 416 295.2 416 303.1V351.1H368C359.2 351.1 352 359.2 352 367.1C352 376.8 359.2 383.1 368 383.1H416V431.1C416 440.8 423.2 447.1 432 447.1C440.8 447.1 448 440.8 448 431.1V383.1H496C504.8 383.1 512 376.8 512 367.1C512 359.2 504.8 351.1 496 351.1H448V303.1z\"]\n};\nvar faPlugCircleXmark = {\n  prefix: 'fas',\n  iconName: 'plug-circle-xmark',\n  icon: [576, 512, [], \"e560\", \"M96 0C113.7 0 128 14.33 128 32V128H64V32C64 14.33 78.33 0 96 0zM288 0C305.7 0 320 14.33 320 32V128H256V32C256 14.33 270.3 0 288 0zM352 160C369.7 160 384 174.3 384 192C384 194.3 383.7 196.6 383.3 198.8C309.8 219.1 256 287.7 256 368C256 379.4 257.1 390.5 259.1 401.3C248.1 406.4 236.3 410.3 224 412.8V512H160V412.8C86.97 397.1 32 333.4 32 256V224C14.33 224 0 209.7 0 192C0 174.3 14.33 160 32 160H352zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM491.3 331.3C497.6 325.1 497.6 314.9 491.3 308.7C485.1 302.4 474.9 302.4 468.7 308.7L432 345.4L395.3 308.7C389.1 302.4 378.9 302.4 372.7 308.7C366.4 314.9 366.4 325.1 372.7 331.3L409.4 368L372.7 404.7C366.4 410.9 366.4 421.1 372.7 427.3C378.9 433.6 389.1 433.6 395.3 427.3L432 390.6L468.7 427.3C474.9 433.6 485.1 433.6 491.3 427.3C497.6 421.1 497.6 410.9 491.3 404.7L454.6 368L491.3 331.3z\"]\n};\nvar faPlus = {\n  prefix: 'fas',\n  iconName: 'plus',\n  icon: [448, 512, [10133, 61543, \"add\"], \"2b\", \"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"]\n};\nvar faAdd = faPlus;\nvar faPlusMinus = {\n  prefix: 'fas',\n  iconName: 'plus-minus',\n  icon: [384, 512, [], \"e43c\", \"M352 448H32c-17.69 0-32 14.31-32 32s14.31 31.1 32 31.1h320c17.69 0 32-14.31 32-31.1S369.7 448 352 448zM48 208H160v111.1c0 17.69 14.31 31.1 32 31.1s32-14.31 32-31.1V208h112c17.69 0 32-14.32 32-32.01s-14.31-31.99-32-31.99H224v-112c0-17.69-14.31-32.01-32-32.01S160 14.33 160 32.01v112H48c-17.69 0-32 14.31-32 31.99S30.31 208 48 208z\"]\n};\nvar faPodcast = {\n  prefix: 'fas',\n  iconName: 'podcast',\n  icon: [448, 512, [], \"f2ce\", \"M224 0C100.3 0 0 100.3 0 224c0 92.22 55.77 171.4 135.4 205.7c-3.48-20.75-6.17-41.59-6.998-58.15C80.08 340.1 48 285.8 48 224c0-97.05 78.95-176 176-176s176 78.95 176 176c0 61.79-32.08 116.1-80.39 147.6c-.834 16.5-3.541 37.37-7.035 58.17C392.2 395.4 448 316.2 448 224C448 100.3 347.7 0 224 0zM224 312c-32.88 0-64 8.625-64 43.75c0 33.13 12.88 104.3 20.62 132.8C185.8 507.6 205.1 512 224 512s38.25-4.375 43.38-23.38C275.1 459.9 288 388.8 288 355.8C288 320.6 256.9 312 224 312zM224 280c30.95 0 56-25.05 56-56S254.1 168 224 168S168 193 168 224S193 280 224 280zM368 224c0-79.53-64.47-144-144-144S80 144.5 80 224c0 44.83 20.92 84.38 53.04 110.8c4.857-12.65 14.13-25.88 32.05-35.04C165.1 299.7 165.4 299.7 165.6 299.7C142.9 282.1 128 254.9 128 224c0-53.02 42.98-96 96-96s96 42.98 96 96c0 30.92-14.87 58.13-37.57 75.68c.1309 .0254 .5078 .0488 .4746 .0742c17.93 9.16 27.19 22.38 32.05 35.04C347.1 308.4 368 268.8 368 224z\"]\n};\nvar faPoo = {\n  prefix: 'fas',\n  iconName: 'poo',\n  icon: [512, 512, [128169], \"f2fe\", \"M451.4 369.1C468.8 356 480 335.4 480 312c0-39.75-32.25-72-72-72h-14.12C407.3 228.2 416 211.2 416 191.1c0-35.25-28.75-63.1-64-63.1h-5.875C349.8 117.9 352 107.2 352 95.1c0-53-43-96-96-96c-5.25 0-10.25 .75-15.12 1.5C250.3 14.62 256 30.62 256 47.1c0 44.25-35.75 80-80 80H160c-35.25 0-64 28.75-64 63.1c0 19.25 8.75 36.25 22.12 48H104C64.25 239.1 32 272.3 32 312c0 23.38 11.25 44 28.62 57.13C26.25 374.6 0 404.1 0 440C0 479.8 32.25 512 72 512h368c39.75 0 72-32.25 72-72C512 404.1 485.8 374.6 451.4 369.1zM192 256c17.75 0 32 14.25 32 32s-14.25 32-32 32S160 305.8 160 288S174.3 256 192 256zM351.5 395C340.1 422.9 292.1 448 256 448c-36.99 0-84.98-25.12-95.48-53C158.5 389.8 162.5 384 168.3 384h175.5C349.5 384 353.5 389.8 351.5 395zM320 320c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S337.8 320 320 320z\"]\n};\nvar faPooStorm = {\n  prefix: 'fas',\n  iconName: 'poo-storm',\n  icon: [448, 512, [\"poo-bolt\"], \"f75a\", \"M304 368H248.3l38.45-89.7c2.938-6.859 .7187-14.84-5.312-19.23c-6.096-4.422-14.35-4.031-19.94 .8906l-128 111.1c-5.033 4.391-6.783 11.44-4.439 17.67c2.346 6.25 8.314 10.38 14.97 10.38H199.7l-38.45 89.7c-2.938 6.859-.7187 14.84 5.312 19.23C169.4 510.1 172.7 512 175.1 512c3.781 0 7.531-1.328 10.53-3.953l128-111.1c5.033-4.391 6.783-11.44 4.439-17.67C316.6 372.1 310.7 368 304 368zM373.3 226.6C379.9 216.6 384 204.9 384 192c0-35.38-28.62-64-64-64h-5.875C317.8 118 320 107.3 320 96c0-53-43-96-96-96C218.9 0 213.9 .75 208.9 1.5C218.3 14.62 224 30.62 224 48C224 92.13 188.1 128 144 128H128C92.63 128 64 156.6 64 192c0 12.88 4.117 24.58 10.72 34.55C31.98 236.3 0 274.3 0 320c0 53.02 42.98 96 96 96h12.79c-4.033-4.414-7.543-9.318-9.711-15.1c-7.01-18.64-1.645-39.96 13.32-53.02l127.9-111.9C249.1 228.2 260.3 223.1 271.1 224c10.19 0 19.95 3.174 28.26 9.203c18.23 13.27 24.76 36.1 15.89 57.71l-19.33 45.1h7.195c19.89 0 37.95 12.51 44.92 31.11C355.3 384 351 402.8 339.1 416H352c53.02 0 96-42.98 96-96C448 274.3 416 236.3 373.3 226.6z\"]\n};\nvar faPooBolt = faPooStorm;\nvar faPoop = {\n  prefix: 'fas',\n  iconName: 'poop',\n  icon: [512, 512, [], \"f619\", \"M512 440.1C512 479.9 479.7 512 439.1 512H71.92C32.17 512 0 479.8 0 440c0-35.88 26.19-65.35 60.56-70.85C43.31 356 32 335.4 32 312C32 272.2 64.25 240 104 240h13.99C104.5 228.2 96 211.2 96 192c0-35.38 28.56-64 63.94-64h16C220.1 128 256 92.12 256 48c0-17.38-5.784-33.35-15.16-46.47C245.8 .7754 250.9 0 256 0c53 0 96 43 96 96c0 11.25-2.288 22-5.913 32h5.879C387.3 128 416 156.6 416 192c0 19.25-8.59 36.25-22.09 48H408C447.8 240 480 272.2 480 312c0 23.38-11.38 44.01-28.63 57.14C485.7 374.6 512 404.3 512 440.1z\"]\n};\nvar faPowerOff = {\n  prefix: 'fas',\n  iconName: 'power-off',\n  icon: [512, 512, [9211], \"f011\", \"M288 256C288 273.7 273.7 288 256 288C238.3 288 224 273.7 224 256V32C224 14.33 238.3 0 256 0C273.7 0 288 14.33 288 32V256zM80 256C80 353.2 158.8 432 256 432C353.2 432 432 353.2 432 256C432 201.6 407.3 152.9 368.5 120.6C354.9 109.3 353 89.13 364.3 75.54C375.6 61.95 395.8 60.1 409.4 71.4C462.2 115.4 496 181.8 496 255.1C496 388.5 388.5 496 256 496C123.5 496 16 388.5 16 255.1C16 181.8 49.75 115.4 102.6 71.4C116.2 60.1 136.4 61.95 147.7 75.54C158.1 89.13 157.1 109.3 143.5 120.6C104.7 152.9 80 201.6 80 256z\"]\n};\nvar faPrescription = {\n  prefix: 'fas',\n  iconName: 'prescription',\n  icon: [448, 512, [], \"f5b1\", \"M440.1 448.4l-96.28-96.21l95.87-95.95c9.373-9.381 9.373-24.59 0-33.97l-22.62-22.64c-9.373-9.381-24.57-9.381-33.94 0L288.1 295.6L220.5 228c46.86-22.92 76.74-75.46 64.95-133.1C273.9 38.74 221.8 0 164.6 0H31.1C14.33 0 0 14.34 0 32.03v264.1c0 13.26 10.75 24.01 23.1 24.01l31.1 .085c13.25 0 23.1-10.75 23.1-24.02V240.2H119.4l112.1 112L135.4 448.4c-9.373 9.381-9.373 24.59 0 33.97l22.62 22.64c9.373 9.38 24.57 9.38 33.94 0l96.13-96.21l96.28 96.21c9.373 9.381 24.57 9.381 33.94 0l22.62-22.64C450.3 472.9 450.3 457.7 440.1 448.4zM79.1 80.06h87.1c22.06 0 39.1 17.95 39.1 40.03s-17.94 40.03-39.1 40.03H79.1V80.06z\"]\n};\nvar faPrescriptionBottle = {\n  prefix: 'fas',\n  iconName: 'prescription-bottle',\n  icon: [384, 512, [], \"f485\", \"M32 192h112C152.8 192 160 199.2 160 208C160 216.8 152.8 224 144 224H32v64h112C152.8 288 160 295.2 160 304C160 312.8 152.8 320 144 320H32v64h112C152.8 384 160 391.2 160 400C160 408.8 152.8 416 144 416H32v32c0 35.2 28.8 64 64 64h192c35.2 0 64-28.8 64-64V128H32V192zM360 0H24C10.75 0 0 10.75 0 24v48C0 85.25 10.75 96 24 96h336C373.3 96 384 85.25 384 72v-48C384 10.75 373.3 0 360 0z\"]\n};\nvar faPrescriptionBottleMedical = {\n  prefix: 'fas',\n  iconName: 'prescription-bottle-medical',\n  icon: [384, 512, [\"prescription-bottle-alt\"], \"f486\", \"M32 448c0 35.2 28.8 64 64 64h192c35.2 0 64-28.8 64-64V128H32V448zM96 304C96 295.2 103.2 288 112 288H160V240C160 231.2 167.2 224 176 224h32C216.8 224 224 231.2 224 240V288h48C280.8 288 288 295.2 288 304v32c0 8.799-7.199 16-16 16H224v48c0 8.799-7.199 16-16 16h-32C167.2 416 160 408.8 160 400V352H112C103.2 352 96 344.8 96 336V304zM360 0H24C10.75 0 0 10.75 0 24v48C0 85.25 10.75 96 24 96h336C373.3 96 384 85.25 384 72v-48C384 10.75 373.3 0 360 0z\"]\n};\nvar faPrescriptionBottleAlt = faPrescriptionBottleMedical;\nvar faPrint = {\n  prefix: 'fas',\n  iconName: 'print',\n  icon: [512, 512, [128424, 128438, 9113], \"f02f\", \"M448 192H64C28.65 192 0 220.7 0 256v96c0 17.67 14.33 32 32 32h32v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h32c17.67 0 32-14.33 32-32V256C512 220.7 483.3 192 448 192zM384 448H128v-96h256V448zM432 296c-13.25 0-24-10.75-24-24c0-13.27 10.75-24 24-24s24 10.73 24 24C456 285.3 445.3 296 432 296zM128 64h229.5L384 90.51V160h64V77.25c0-8.484-3.375-16.62-9.375-22.62l-45.25-45.25C387.4 3.375 379.2 0 370.8 0H96C78.34 0 64 14.33 64 32v128h64V64z\"]\n};\nvar faPumpMedical = {\n  prefix: 'fas',\n  iconName: 'pump-medical',\n  icon: [384, 512, [], \"e06a\", \"M379.3 94.06l-43.32-43.32C323.1 38.74 307.7 32 290.8 32h-66.75c0-17.67-14.33-32-32-32H127.1c-17.67 0-32 14.33-32 32L96 128h128l-.0002-32h66.75l43.31 43.31c6.248 6.248 16.38 6.248 22.63 0l22.62-22.62C385.6 110.4 385.6 100.3 379.3 94.06zM235.6 160H84.37C51.27 160 23.63 185.2 20.63 218.2l-20.36 224C-3.139 479.7 26.37 512 64.01 512h191.1c37.63 0 67.14-32.31 63.74-69.79l-20.36-224C296.4 185.2 268.7 160 235.6 160zM239.1 333.3c0 7.363-5.971 13.33-13.33 13.33h-40v40c0 7.363-5.969 13.33-13.33 13.33h-26.67c-7.363 0-13.33-5.971-13.33-13.33v-40H93.33c-7.363 0-13.33-5.971-13.33-13.33V306.7c0-7.365 5.971-13.33 13.33-13.33h40v-40C133.3 245.1 139.3 240 146.7 240h26.67c7.363 0 13.33 5.969 13.33 13.33v40h40c7.363 0 13.33 5.969 13.33 13.33V333.3z\"]\n};\nvar faPumpSoap = {\n  prefix: 'fas',\n  iconName: 'pump-soap',\n  icon: [384, 512, [], \"e06b\", \"M235.6 160H84.37C51.27 160 23.63 185.2 20.63 218.2l-20.36 224C-3.139 479.7 26.37 512 64.01 512h191.1c37.63 0 67.14-32.31 63.74-69.79l-20.36-224C296.4 185.2 268.7 160 235.6 160zM159.1 416C124.7 416 96 389.7 96 357.3c0-25 38.08-75.47 55.5-97.27c4.25-5.312 12.75-5.312 17 0C185.9 281.8 224 332.3 224 357.3C224 389.7 195.3 416 159.1 416zM379.3 94.06l-43.32-43.32C323.1 38.74 307.7 32 290.8 32h-66.75c0-17.67-14.33-32-32-32H127.1c-17.67 0-32 14.33-32 32L96 128h128l-.0002-32h66.75l43.31 43.31c6.248 6.248 16.38 6.248 22.63 0l22.62-22.62C385.6 110.4 385.6 100.3 379.3 94.06z\"]\n};\nvar faPuzzlePiece = {\n  prefix: 'fas',\n  iconName: 'puzzle-piece',\n  icon: [512, 512, [129513], \"f12e\", \"M512 288c0 35.35-21.49 64-48 64c-32.43 0-31.72-32-55.64-32C394.9 320 384 330.9 384 344.4V480c0 17.67-14.33 32-32 32h-71.64C266.9 512 256 501.1 256 487.6C256 463.1 288 464.4 288 432c0-26.51-28.65-48-64-48s-64 21.49-64 48c0 32.43 32 31.72 32 55.64C192 501.1 181.1 512 167.6 512H32c-17.67 0-32-14.33-32-32v-135.6C0 330.9 10.91 320 24.36 320C48.05 320 47.6 352 80 352C106.5 352 128 323.3 128 288S106.5 223.1 80 223.1c-32.43 0-31.72 32-55.64 32C10.91 255.1 0 245.1 0 231.6v-71.64c0-17.67 14.33-31.1 32-31.1h135.6C181.1 127.1 192 117.1 192 103.6c0-23.69-32-23.24-32-55.64c0-26.51 28.65-47.1 64-47.1s64 21.49 64 47.1c0 32.43-32 31.72-32 55.64c0 13.45 10.91 24.36 24.36 24.36H352c17.67 0 32 14.33 32 31.1v71.64c0 13.45 10.91 24.36 24.36 24.36c23.69 0 23.24-32 55.64-32C490.5 223.1 512 252.7 512 288z\"]\n};\nvar faQ = {\n  prefix: 'fas',\n  iconName: 'q',\n  icon: [448, 512, [113], \"51\", \"M393.1 402.5c34.12-39.32 54.93-90.48 54.93-146.5c0-123.5-100.5-224-223.1-224S.0001 132.5 .0001 256s100.5 224 223.1 224c44.45 0 85.81-13.16 120.7-35.58l46.73 56.08c6.328 7.594 15.42 11.52 24.59 11.52c21.35 0 31.98-18.26 31.98-32.01c0-7.223-2.433-14.49-7.419-20.47L393.1 402.5zM224 416c-88.22 0-160-71.78-160-160s71.78-159.1 160-159.1s160 71.78 160 159.1c0 36.21-12.55 69.28-32.92 96.12L280.6 267.5c-6.338-7.597-15.44-11.53-24.61-11.53c-21.27 0-31.96 18.22-31.96 32.02c0 7.223 2.433 14.49 7.419 20.47l71.53 85.83C279.6 407.7 252.8 416 224 416z\"]\n};\nvar faQrcode = {\n  prefix: 'fas',\n  iconName: 'qrcode',\n  icon: [448, 512, [], \"f029\", \"M144 32C170.5 32 192 53.49 192 80V176C192 202.5 170.5 224 144 224H48C21.49 224 0 202.5 0 176V80C0 53.49 21.49 32 48 32H144zM128 96H64V160H128V96zM144 288C170.5 288 192 309.5 192 336V432C192 458.5 170.5 480 144 480H48C21.49 480 0 458.5 0 432V336C0 309.5 21.49 288 48 288H144zM128 352H64V416H128V352zM256 80C256 53.49 277.5 32 304 32H400C426.5 32 448 53.49 448 80V176C448 202.5 426.5 224 400 224H304C277.5 224 256 202.5 256 176V80zM320 160H384V96H320V160zM352 448H384V480H352V448zM448 480H416V448H448V480zM416 288H448V416H352V384H320V480H256V288H352V320H416V288z\"]\n};\nvar faQuestion = {\n  prefix: 'fas',\n  iconName: 'question',\n  icon: [320, 512, [10067, 10068, 61736], \"3f\", \"M204.3 32.01H96c-52.94 0-96 43.06-96 96c0 17.67 14.31 31.1 32 31.1s32-14.32 32-31.1c0-17.64 14.34-32 32-32h108.3C232.8 96.01 256 119.2 256 147.8c0 19.72-10.97 37.47-30.5 47.33L127.8 252.4C117.1 258.2 112 268.7 112 280v40c0 17.67 14.31 31.99 32 31.99s32-14.32 32-31.99V298.3L256 251.3c39.47-19.75 64-59.42 64-103.5C320 83.95 268.1 32.01 204.3 32.01zM144 400c-22.09 0-40 17.91-40 40s17.91 39.1 40 39.1s40-17.9 40-39.1S166.1 400 144 400z\"]\n};\nvar faQuoteLeft = {\n  prefix: 'fas',\n  iconName: 'quote-left',\n  icon: [448, 512, [8220, \"quote-left-alt\"], \"f10d\", \"M96 224C84.72 224 74.05 226.3 64 229.9V224c0-35.3 28.7-64 64-64c17.67 0 32-14.33 32-32S145.7 96 128 96C57.42 96 0 153.4 0 224v96c0 53.02 42.98 96 96 96s96-42.98 96-96S149 224 96 224zM352 224c-11.28 0-21.95 2.305-32 5.879V224c0-35.3 28.7-64 64-64c17.67 0 32-14.33 32-32s-14.33-32-32-32c-70.58 0-128 57.42-128 128v96c0 53.02 42.98 96 96 96s96-42.98 96-96S405 224 352 224z\"]\n};\nvar faQuoteLeftAlt = faQuoteLeft;\nvar faQuoteRight = {\n  prefix: 'fas',\n  iconName: 'quote-right',\n  icon: [448, 512, [8221, \"quote-right-alt\"], \"f10e\", \"M96 96C42.98 96 0 138.1 0 192s42.98 96 96 96c11.28 0 21.95-2.305 32-5.879V288c0 35.3-28.7 64-64 64c-17.67 0-32 14.33-32 32s14.33 32 32 32c70.58 0 128-57.42 128-128V192C192 138.1 149 96 96 96zM448 192c0-53.02-42.98-96-96-96s-96 42.98-96 96s42.98 96 96 96c11.28 0 21.95-2.305 32-5.879V288c0 35.3-28.7 64-64 64c-17.67 0-32 14.33-32 32s14.33 32 32 32c70.58 0 128-57.42 128-128V192z\"]\n};\nvar faQuoteRightAlt = faQuoteRight;\nvar faR = {\n  prefix: 'fas',\n  iconName: 'r',\n  icon: [320, 512, [114], \"52\", \"M228.7 309.7C282 288.6 320 236.8 320 176c0-79.41-64.59-144-144-144H32c-17.67 0-32 14.33-32 32v384c0 17.67 14.33 32 32 32s32-14.33 32-32v-128h93.43l104.5 146.6c6.25 8.75 16.09 13.42 26.09 13.42c6.422 0 12.91-1.922 18.55-5.938c14.39-10.27 17.73-30.25 7.484-44.64L228.7 309.7zM64 96.01h112c44.11 0 80 35.89 80 80s-35.89 79.1-80 79.1H64V96.01z\"]\n};\nvar faRadiation = {\n  prefix: 'fas',\n  iconName: 'radiation',\n  icon: [512, 512, [], \"f7b9\", \"M256 303.1c26.5 0 48-21.5 48-48S282.5 207.1 256 207.1S208 229.5 208 255.1S229.5 303.1 256 303.1zM213.6 188L142.7 74.71C132.5 58.41 109.9 54.31 95.25 66.75c-44.94 38.1-76.19 91.82-85.17 152.8C7.266 238.7 22.67 255.8 42.01 255.8h133.8C175.8 227.2 191 202.3 213.6 188zM416.8 66.75c-14.67-12.44-37.21-8.338-47.41 7.965L298.4 188c22.6 14.3 37.8 39.2 37.8 67.8h133.8c19.34 0 34.74-17.13 31.93-36.26C492.9 158.6 461.7 104.8 416.8 66.75zM298.4 323.5C286.1 331.2 271.6 335.9 256 335.9s-30.1-4.701-42.4-12.4L142.7 436.9c-10.14 16.21-4.16 38.2 13.32 45.95C186.6 496.4 220.4 504 256 504s69.42-7.611 100-21.18c17.48-7.752 23.46-29.74 13.32-45.95L298.4 323.5z\"]\n};\nvar faRadio = {\n  prefix: 'fas',\n  iconName: 'radio',\n  icon: [512, 512, [128251], \"f8d7\", \"M447.1 128L218.5 128l276.2-80.97c12.72-3.734 19.1-17.06 16.28-29.78c-3.719-12.7-16.1-19.1-29.78-16.28L51.75 126.9c-29.07 8.512-49.55 34.8-51.39 64.78L.0007 192v255.1c0 35.31 28.69 63.1 63.1 63.1h383.1c35.31 0 63.1-28.69 63.1-63.1V192C511.1 156.7 483.3 128 447.1 128zM80 248c0-4.406 3.594-7.1 7.1-7.1h111.1c4.406 0 7.1 3.594 7.1 7.1V263.1c0 4.406-3.594 7.1-7.1 7.1h-111.1c-4.406 0-7.1-3.594-7.1-7.1V248zM208 391.1c0 4.406-3.594 7.1-7.1 7.1h-111.1c-4.406 0-7.1-3.594-7.1-7.1v-15.1c0-4.406 3.594-7.1 7.1-7.1h111.1c4.406 0 7.1 3.594 7.1 7.1V391.1zM224 327.1c0 4.406-3.594 7.1-7.1 7.1H72c-4.406 0-7.1-3.594-7.1-7.1V311.1c0-4.406 3.594-7.1 7.1-7.1h143.1c4.406 0 7.1 3.594 7.1 7.1V327.1zM367.1 399.1c-44.16 0-80-35.84-80-79.1s35.84-80 80-80s79.1 35.85 79.1 80S412.2 399.1 367.1 399.1z\"]\n};\nvar faRainbow = {\n  prefix: 'fas',\n  iconName: 'rainbow',\n  icon: [640, 512, [127752], \"f75b\", \"M312.3 32.09C137.6 36.22 0 183.3 0 358V464C0 472.8 7.164 480 16 480h32C56.84 480 64 472.8 64 464v-106.9c0-143.2 117.2-263.5 260.4-261.1C463.5 98.4 576 212.3 576 352v112c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16V352C640 172.1 492.3 27.84 312.3 32.09zM313.5 224.2C244.8 227.6 192 286.9 192 355.7V464C192 472.8 199.2 480 208 480h32C248.8 480 256 472.8 256 464v-109.7c0-34.06 25.65-63.85 59.64-66.11C352.9 285.7 384 315.3 384 352v112c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16V352C448 279.3 387 220.5 313.5 224.2zM313.2 128.1C191.4 131.7 96 234.9 96 356.8V464C96 472.8 103.2 480 112 480h32C152.8 480 160 472.8 160 464v-108.1c0-86.64 67.24-160.5 153.8-163.8C404.8 188.7 480 261.7 480 352v112c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16V352C544 226.2 439.8 124.3 313.2 128.1z\"]\n};\nvar faRankingStar = {\n  prefix: 'fas',\n  iconName: 'ranking-star',\n  icon: [640, 512, [], \"e561\", \"M406.1 61.65C415.4 63.09 419.4 74.59 412.6 81.41L374.6 118.1L383.6 170.1C384.1 179.5 375.3 186.7 366.7 182.4L320.2 157.9L273.3 182.7C264.7 187 255 179.8 256.4 170.5L265.4 118.4L227.4 81.41C220.6 74.59 224.6 63.09 233.9 61.65L286.2 54.11L309.8 6.332C314.1-2.289 326.3-1.93 330.2 6.332L353.8 54.11L406.1 61.65zM384 256C401.7 256 416 270.3 416 288V480C416 497.7 401.7 512 384 512H256C238.3 512 224 497.7 224 480V288C224 270.3 238.3 256 256 256H384zM160 320C177.7 320 192 334.3 192 352V480C192 497.7 177.7 512 160 512H32C14.33 512 0 497.7 0 480V352C0 334.3 14.33 320 32 320H160zM448 416C448 398.3 462.3 384 480 384H608C625.7 384 640 398.3 640 416V480C640 497.7 625.7 512 608 512H480C462.3 512 448 497.7 448 480V416z\"]\n};\nvar faReceipt = {\n  prefix: 'fas',\n  iconName: 'receipt',\n  icon: [384, 512, [129534], \"f543\", \"M13.97 2.196C22.49-1.72 32.5-.3214 39.62 5.778L80 40.39L120.4 5.778C129.4-1.926 142.6-1.926 151.6 5.778L192 40.39L232.4 5.778C241.4-1.926 254.6-1.926 263.6 5.778L304 40.39L344.4 5.778C351.5-.3214 361.5-1.72 370 2.196C378.5 6.113 384 14.63 384 24V488C384 497.4 378.5 505.9 370 509.8C361.5 513.7 351.5 512.3 344.4 506.2L304 471.6L263.6 506.2C254.6 513.9 241.4 513.9 232.4 506.2L192 471.6L151.6 506.2C142.6 513.9 129.4 513.9 120.4 506.2L80 471.6L39.62 506.2C32.5 512.3 22.49 513.7 13.97 509.8C5.456 505.9 0 497.4 0 488V24C0 14.63 5.456 6.112 13.97 2.196V2.196zM96 144C87.16 144 80 151.2 80 160C80 168.8 87.16 176 96 176H288C296.8 176 304 168.8 304 160C304 151.2 296.8 144 288 144H96zM96 368H288C296.8 368 304 360.8 304 352C304 343.2 296.8 336 288 336H96C87.16 336 80 343.2 80 352C80 360.8 87.16 368 96 368zM96 240C87.16 240 80 247.2 80 256C80 264.8 87.16 272 96 272H288C296.8 272 304 264.8 304 256C304 247.2 296.8 240 288 240H96z\"]\n};\nvar faRecordVinyl = {\n  prefix: 'fas',\n  iconName: 'record-vinyl',\n  icon: [512, 512, [], \"f8d9\", \"M256 160C202.9 160 160 202.9 160 256s42.92 96 96 96c53.08 0 96-42.92 96-96S309.1 160 256 160zM256 288C238.3 288 224 273.7 224 256s14.33-32 32-32c17.67 0 32 14.33 32 32S273.7 288 256 288zM256 0c-141.4 0-256 114.6-256 256s114.6 256 256 256c141.4 0 256-114.6 256-256S397.4 0 256 0zM256 384c-70.75 0-128-57.25-128-128s57.25-128 128-128s128 57.25 128 128S326.8 384 256 384z\"]\n};\nvar faRectangleAd = {\n  prefix: 'fas',\n  iconName: 'rectangle-ad',\n  icon: [576, 512, [\"ad\"], \"f641\", \"M208 237.7L229.2 280H186.8L208 237.7zM416 280C416 293.3 405.3 304 392 304C378.7 304 368 293.3 368 280C368 266.7 378.7 256 392 256C405.3 256 416 266.7 416 280zM512 32C547.3 32 576 60.65 576 96V416C576 451.3 547.3 480 512 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H512zM229.5 173.3C225.4 165.1 217.1 160 208 160C198.9 160 190.6 165.1 186.5 173.3L114.5 317.3C108.6 329.1 113.4 343.5 125.3 349.5C137.1 355.4 151.5 350.6 157.5 338.7L162.8 328H253.2L258.5 338.7C264.5 350.6 278.9 355.4 290.7 349.5C302.6 343.5 307.4 329.1 301.5 317.3L229.5 173.3zM416 212.1C408.5 209.4 400.4 208 392 208C352.2 208 320 240.2 320 280C320 319.8 352.2 352 392 352C403.1 352 413.6 349.5 423 344.1C427.4 349.3 433.4 352 440 352C453.3 352 464 341.3 464 328V184C464 170.7 453.3 160 440 160C426.7 160 416 170.7 416 184V212.1z\"]\n};\nvar faAd = faRectangleAd;\nvar faRectangleList = {\n  prefix: 'fas',\n  iconName: 'rectangle-list',\n  icon: [576, 512, [\"list-alt\"], \"f022\", \"M0 96C0 60.65 28.65 32 64 32H512C547.3 32 576 60.65 576 96V416C576 451.3 547.3 480 512 480H64C28.65 480 0 451.3 0 416V96zM160 256C160 238.3 145.7 224 128 224C110.3 224 96 238.3 96 256C96 273.7 110.3 288 128 288C145.7 288 160 273.7 160 256zM160 160C160 142.3 145.7 128 128 128C110.3 128 96 142.3 96 160C96 177.7 110.3 192 128 192C145.7 192 160 177.7 160 160zM160 352C160 334.3 145.7 320 128 320C110.3 320 96 334.3 96 352C96 369.7 110.3 384 128 384C145.7 384 160 369.7 160 352zM224 136C210.7 136 200 146.7 200 160C200 173.3 210.7 184 224 184H448C461.3 184 472 173.3 472 160C472 146.7 461.3 136 448 136H224zM224 232C210.7 232 200 242.7 200 256C200 269.3 210.7 280 224 280H448C461.3 280 472 269.3 472 256C472 242.7 461.3 232 448 232H224zM224 328C210.7 328 200 338.7 200 352C200 365.3 210.7 376 224 376H448C461.3 376 472 365.3 472 352C472 338.7 461.3 328 448 328H224z\"]\n};\nvar faListAlt = faRectangleList;\nvar faRectangleXmark = {\n  prefix: 'fas',\n  iconName: 'rectangle-xmark',\n  icon: [512, 512, [62164, \"rectangle-times\", \"times-rectangle\", \"window-close\"], \"f410\", \"M448 32C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z\"]\n};\nvar faRectangleTimes = faRectangleXmark;\nvar faTimesRectangle = faRectangleXmark;\nvar faWindowClose = faRectangleXmark;\nvar faRecycle = {\n  prefix: 'fas',\n  iconName: 'recycle',\n  icon: [512, 512, [9850, 9851, 9842], \"f1b8\", \"M180.2 243.1C185 263.9 162.2 280.2 144.1 268.8L119.8 253.6l-50.9 81.43c-13.33 21.32 2.004 48.98 27.15 48.98h32.02c17.64 0 31.98 14.32 31.98 31.96c0 17.64-14.34 32.05-31.98 32.05H96.15c-75.36 0-121.3-82.84-81.47-146.8L65.51 219.8L41.15 204.5C23.04 193.1 27.66 165.5 48.48 160.7l91.43-21.15C148.5 137.7 157.2 142.9 159.2 151.6L180.2 243.1zM283.1 78.96l41.25 66.14l-24.25 15.08c-18.16 11.31-13.57 38.94 7.278 43.77l91.4 21.15c8.622 1.995 17.23-3.387 19.21-12.01l21.04-91.43c4.789-20.81-17.95-37.05-36.07-25.76l-24.36 15.2L337.4 45.14c-37.58-60.14-125.2-60.18-162.8-.0617L167.2 56.9C157.9 71.75 162.5 91.58 177.3 100.9c14.92 9.359 34.77 4.886 44.11-10.04l7.442-11.89C241.6 58.58 270.9 59.33 283.1 78.96zM497.3 301.3l-16.99-27.26c-9.336-14.98-29.06-19.56-44.04-10.21c-14.94 9.318-19.52 29.15-10.18 44.08l16.99 27.15c13.35 21.32-1.984 49-27.14 49h-95.99l.0234-28.74c0-21.38-25.85-32.09-40.97-16.97l-66.41 66.43c-6.222 6.223-6.222 16.41 .0044 22.63l66.42 66.34c15.12 15.1 40.95 4.386 40.95-16.98l-.0234-28.68h95.86C491.2 448.1 537.2 365.2 497.3 301.3z\"]\n};\nvar faRegistered = {\n  prefix: 'fas',\n  iconName: 'registered',\n  icon: [512, 512, [174], \"f25d\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM349.8 349.8c5.594 12.03 .4375 26.31-11.56 31.94c-3.312 1.531-6.75 2.25-10.19 2.25c-9 0-17.66-5.125-21.75-13.81l-38.46-82.19H208v72c0 13.25-10.75 24-24 24s-24-10.75-24-24V152c0-13.25 10.75-24 24-24l88 .0044c44.13 0 80 35.88 80 80c0 28.32-14.87 53.09-37.12 67.31L349.8 349.8zM272 176h-64v64h64c17.66 0 32-14.34 32-32S289.7 176 272 176z\"]\n};\nvar faRepeat = {\n  prefix: 'fas',\n  iconName: 'repeat',\n  icon: [512, 512, [128257], \"f363\", \"M480 256c-17.67 0-32 14.31-32 32c0 52.94-43.06 96-96 96H192L192 344c0-9.469-5.578-18.06-14.23-21.94C169.1 318.3 159 319.8 151.9 326.2l-80 72C66.89 402.7 64 409.2 64 416s2.891 13.28 7.938 17.84l80 72C156.4 509.9 162.2 512 168 512c3.312 0 6.615-.6875 9.756-2.062C186.4 506.1 192 497.5 192 488L192 448h160c88.22 0 160-71.78 160-160C512 270.3 497.7 256 480 256zM160 128h159.1L320 168c0 9.469 5.578 18.06 14.23 21.94C337.4 191.3 340.7 192 343.1 192c5.812 0 11.57-2.125 16.07-6.156l80-72C445.1 109.3 448 102.8 448 95.1s-2.891-13.28-7.938-17.84l-80-72c-7.047-6.312-17.19-7.875-25.83-4.094C325.6 5.938 319.1 14.53 319.1 24L320 64H160C71.78 64 0 135.8 0 224c0 17.69 14.33 32 32 32s32-14.31 32-32C64 171.1 107.1 128 160 128z\"]\n};\nvar faReply = {\n  prefix: 'fas',\n  iconName: 'reply',\n  icon: [512, 512, [61714, \"mail-reply\"], \"f3e5\", \"M8.31 189.9l176-151.1c15.41-13.3 39.69-2.509 39.69 18.16v80.05C384.6 137.9 512 170.1 512 322.3c0 61.44-39.59 122.3-83.34 154.1c-13.66 9.938-33.09-2.531-28.06-18.62c45.34-145-21.5-183.5-176.6-185.8v87.92c0 20.7-24.31 31.45-39.69 18.16l-176-151.1C-2.753 216.6-2.784 199.4 8.31 189.9z\"]\n};\nvar faMailReply = faReply;\nvar faReplyAll = {\n  prefix: 'fas',\n  iconName: 'reply-all',\n  icon: [576, 512, [\"mail-reply-all\"], \"f122\", \"M136.3 226.2l176 151.1c15.38 13.3 39.69 2.545 39.69-18.16V275.1c108.5 12.58 151.1 58.79 112.6 181.9c-5.031 16.09 14.41 28.56 28.06 18.62c43.75-31.81 83.34-92.69 83.34-154.1c0-131.3-94.86-173.2-224-183.5V56.02c0-20.67-24.28-31.46-39.69-18.16L136.3 189.9C125.2 199.4 125.2 216.6 136.3 226.2zM8.31 226.2l176 151.1c15.38 13.3 39.69 2.545 39.69-18.16v-15.83L66.33 208l157.7-136.2V56.02c0-20.67-24.28-31.46-39.69-18.16l-176 151.1C-2.77 199.4-2.77 216.6 8.31 226.2z\"]\n};\nvar faMailReplyAll = faReplyAll;\nvar faRepublican = {\n  prefix: 'fas',\n  iconName: 'republican',\n  icon: [640, 512, [], \"f75e\", \"M544 191.1c0-88.37-71.62-159.1-159.1-159.1L159.1 32C71.62 32 0 103.6 0 191.1l.025 63.98h543.1V191.1zM176.3 170.4l-19.75 19.37l4.75 27.25c.7498 4.875-4.375 8.625-8.75 6.25l-24.5-12.87L103.5 223.2C99.27 225.6 94.02 221.9 94.77 216.1l4.75-27.25l-19.75-19.37C76.15 166.9 78.15 160.9 83.02 160.2L110.4 156.2l12.25-24.87c2.125-4.5 8.625-4.375 10.62 0L145.5 156.2L172.9 160.2C177.9 160.9 179.8 166.9 176.3 170.4zM320.3 170.4l-19.75 19.37l4.75 27.25c.7498 4.875-4.375 8.625-8.75 6.25L272 210.4l-24.5 12.87C243.3 225.6 238 221.9 238.8 216.1L243.5 189.7l-19.75-19.37c-3.625-3.5-1.625-9.498 3.25-10.12L254.4 156.2l12.25-24.87c2.125-4.5 8.625-4.375 10.62 0L289.5 156.2l27.37 4C321.9 160.9 323.8 166.9 320.3 170.4zM464.3 170.4l-19.75 19.37l4.75 27.25c.7498 4.875-4.375 8.625-8.75 6.25l-24.5-12.87l-24.5 12.87c-4.25 2.375-9.5-1.375-8.75-6.25l4.75-27.25l-19.75-19.37c-3.625-3.5-1.625-9.498 3.25-10.12l27.37-4l12.25-24.87c2.125-4.5 8.625-4.375 10.62 0l12.25 24.87l27.37 4C465.9 160.9 467.8 166.9 464.3 170.4zM624 319.1L592 319.1c-8.799 0-15.1 7.199-15.1 15.1v63.99c0 8.748-7.25 15.1-15.1 15.1c-8.75 0-15.1-7.25-15.1-15.1l-.0313-111.1L.025 287.1v159.1c0 17.6 14.4 31.1 31.1 31.1L95.98 479.1c17.6 0 32.04-14.4 32.04-32v-63.98l191.1-.0169v63.99c0 17.6 14.36 32 31.96 32l64.04 .013c17.6 0 31.1-14.4 31.1-31.1l-.0417-96.01l32.04 .0006v43.25c0 41.79 29.91 80.03 71.48 84.35C599.3 484.5 640 446.9 640 399.1v-63.98C640 327.2 632.8 319.1 624 319.1z\"]\n};\nvar faRestroom = {\n  prefix: 'fas',\n  iconName: 'restroom',\n  icon: [640, 512, [], \"f7bd\", \"M319.1 0C306.8 0 296 10.8 296 24v464c0 13.2 10.8 24 23.1 24s24-10.8 24-24V24C344 10.8 333.2 0 319.1 0zM213.7 171.8C204.9 145.6 180.5 128 152.9 128H103.1C75.47 128 51.06 145.6 42.37 171.8L1.653 293.9c-5.594 16.77 3.469 34.89 20.22 40.48c12.68 4.211 25.93 .1426 34.13-9.18V480c0 17.67 14.33 32 32 32s31.1-14.33 31.1-32l-.0003-144h16l.0003 144c0 17.67 14.33 32 32 32s31.1-14.33 31.1-32l-.0003-155.2c6.041 6.971 14.7 11.25 24 11.25c3.344 0 6.75-.5313 10.13-1.656c16.75-5.594 25.81-23.72 20.22-40.48L213.7 171.8zM128 96c26.5 0 47.1-21.5 47.1-48S154.5 0 128 0S80 21.5 80 48S101.5 96 128 96zM511.1 96c26.5 0 48-21.5 48-48S538.5 0 511.1 0s-47.1 21.5-47.1 48S485.5 96 511.1 96zM638.3 293.9l-40.69-122.1C588.9 145.6 564.5 128 536.9 128h-49.88c-27.59 0-52 17.59-60.69 43.75l-40.72 122.1c-5.594 16.77 3.469 34.89 20.22 40.48c3.422 1.137 6.856 1.273 10.25 1.264L399.1 384h40v96c0 17.67 14.32 32 31.1 32s32-14.33 32-32v-96h16v96c0 17.67 14.32 32 31.1 32s32-14.33 32-32v-96h39.1l-15.99-47.98c3.342 0 6.747-.5313 10.12-1.656C634.9 328.8 643.9 310.6 638.3 293.9z\"]\n};\nvar faRetweet = {\n  prefix: 'fas',\n  iconName: 'retweet',\n  icon: [640, 512, [], \"f079\", \"M614.2 334.8C610.5 325.8 601.7 319.1 592 319.1H544V176C544 131.9 508.1 96 464 96h-128c-17.67 0-32 14.31-32 32s14.33 32 32 32h128C472.8 160 480 167.2 480 176v143.1h-48c-9.703 0-18.45 5.844-22.17 14.82s-1.656 19.29 5.203 26.16l80 80.02C499.7 445.7 505.9 448 512 448s12.28-2.344 16.97-7.031l80-80.02C615.8 354.1 617.9 343.8 614.2 334.8zM304 352h-128C167.2 352 160 344.8 160 336V192h48c9.703 0 18.45-5.844 22.17-14.82s1.656-19.29-5.203-26.16l-80-80.02C140.3 66.34 134.1 64 128 64S115.7 66.34 111 71.03l-80 80.02C24.17 157.9 22.11 168.2 25.83 177.2S38.3 192 48 192H96V336C96 380.1 131.9 416 176 416h128c17.67 0 32-14.31 32-32S321.7 352 304 352z\"]\n};\nvar faRibbon = {\n  prefix: 'fas',\n  iconName: 'ribbon',\n  icon: [448, 512, [127895], \"f4d6\", \"M6.05 444.3c-9.626 10.87-7.501 27.62 4.5 35.75l68.76 27.87c9.876 6.75 23.38 4.1 31.38-3.75l91.76-101.9L123.2 314.3L6.05 444.3zM441.8 444.3c0 0-292-324.5-295.4-329.1c15.38-8.5 40.25-17.1 77.51-17.1s62.13 9.5 77.51 17.1c-3.25 5.5-56.01 64.5-56.01 64.5l79.13 87.75l34.13-37.1c28.75-31.87 33.38-78.62 11.5-115.5L326.5 39.52c-4.25-7.25-9.876-13.25-16.75-17.1c-40.75-27.62-127.5-29.75-171.5 0C131.3 26.27 125.7 32.27 121.4 39.52L77.81 112.8C76.31 115.3 40.68 174.9 89.31 228.8l248.1 275.2c8.001 8.875 21.38 10.5 31.25 3.75l68.88-27.87C449.5 471.9 451.6 455.1 441.8 444.3z\"]\n};\nvar faRightFromBracket = {\n  prefix: 'fas',\n  iconName: 'right-from-bracket',\n  icon: [512, 512, [\"sign-out-alt\"], \"f2f5\", \"M96 480h64C177.7 480 192 465.7 192 448S177.7 416 160 416H96c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h64C177.7 96 192 81.67 192 64S177.7 32 160 32H96C42.98 32 0 74.98 0 128v256C0 437 42.98 480 96 480zM504.8 238.5l-144.1-136c-6.975-6.578-17.2-8.375-26-4.594c-8.803 3.797-14.51 12.47-14.51 22.05l-.0918 72l-128-.001c-17.69 0-32.02 14.33-32.02 32v64c0 17.67 14.34 32 32.02 32l128 .001l.0918 71.1c0 9.578 5.707 18.25 14.51 22.05c8.803 3.781 19.03 1.984 26-4.594l144.1-136C514.4 264.4 514.4 247.6 504.8 238.5z\"]\n};\nvar faSignOutAlt = faRightFromBracket;\nvar faRightLeft = {\n  prefix: 'fas',\n  iconName: 'right-left',\n  icon: [512, 512, [\"exchange-alt\"], \"f362\", \"M32 160h319.9l.0791 72c0 9.547 5.652 18.19 14.41 22c8.754 3.812 18.93 2.078 25.93-4.406l112-104c10.24-9.5 10.24-25.69 0-35.19l-112-104c-6.992-6.484-17.17-8.217-25.93-4.408c-8.758 3.816-14.41 12.46-14.41 22L351.9 96H32C14.31 96 0 110.3 0 127.1S14.31 160 32 160zM480 352H160.1L160 279.1c0-9.547-5.652-18.19-14.41-22C136.9 254.2 126.7 255.9 119.7 262.4l-112 104c-10.24 9.5-10.24 25.69 0 35.19l112 104c6.992 6.484 17.17 8.219 25.93 4.406C154.4 506.2 160 497.5 160 488L160.1 416H480c17.69 0 32-14.31 32-32S497.7 352 480 352z\"]\n};\nvar faExchangeAlt = faRightLeft;\nvar faRightLong = {\n  prefix: 'fas',\n  iconName: 'right-long',\n  icon: [512, 512, [\"long-arrow-alt-right\"], \"f30b\", \"M504.3 273.6l-112.1 104c-6.992 6.484-17.18 8.218-25.94 4.406c-8.758-3.812-14.42-12.45-14.42-21.1L351.9 288H32C14.33 288 .0002 273.7 .0002 255.1S14.33 224 32 224h319.9l0-72c0-9.547 5.66-18.19 14.42-22c8.754-3.809 18.95-2.075 25.94 4.41l112.1 104C514.6 247.9 514.6 264.1 504.3 273.6z\"]\n};\nvar faLongArrowAltRight = faRightLong;\nvar faRightToBracket = {\n  prefix: 'fas',\n  iconName: 'right-to-bracket',\n  icon: [512, 512, [\"sign-in-alt\"], \"f2f6\", \"M344.7 238.5l-144.1-136C193.7 95.97 183.4 94.17 174.6 97.95C165.8 101.8 160.1 110.4 160.1 120V192H32.02C14.33 192 0 206.3 0 224v64c0 17.68 14.33 32 32.02 32h128.1v72c0 9.578 5.707 18.25 14.51 22.05c8.803 3.781 19.03 1.984 26-4.594l144.1-136C354.3 264.4 354.3 247.6 344.7 238.5zM416 32h-64c-17.67 0-32 14.33-32 32s14.33 32 32 32h64c17.67 0 32 14.33 32 32v256c0 17.67-14.33 32-32 32h-64c-17.67 0-32 14.33-32 32s14.33 32 32 32h64c53.02 0 96-42.98 96-96V128C512 74.98 469 32 416 32z\"]\n};\nvar faSignInAlt = faRightToBracket;\nvar faRing = {\n  prefix: 'fas',\n  iconName: 'ring',\n  icon: [512, 512, [], \"f70b\", \"M256 64C109.1 64 0 125.9 0 208v98.13C0 384.5 114.6 448 256 448s256-63.5 256-141.9V208C512 125.9 401.1 64 256 64zM256 288C203.1 288 155.1 279.1 120.4 264.6C155 249.9 201.6 240 256 240s101 9.875 135.6 24.62C356.9 279.1 308.9 288 256 288zM437.1 234.4C392.1 208.3 328.3 192 256 192S119.9 208.3 74.88 234.4C68 226.1 64 217.3 64 208C64 163.9 149.1 128 256 128c105.1 0 192 35.88 192 80C448 217.3 444 226.1 437.1 234.4z\"]\n};\nvar faRoad = {\n  prefix: 'fas',\n  iconName: 'road',\n  icon: [576, 512, [128739], \"f018\", \"M256 96C256 113.7 270.3 128 288 128C305.7 128 320 113.7 320 96V32H394.8C421.9 32 446 49.08 455.1 74.63L572.9 407.2C574.9 413 576 419.2 576 425.4C576 455.5 551.5 480 521.4 480H320V416C320 398.3 305.7 384 288 384C270.3 384 256 398.3 256 416V480H54.61C24.45 480 0 455.5 0 425.4C0 419.2 1.06 413 3.133 407.2L120.9 74.63C129.1 49.08 154.1 32 181.2 32H255.1L256 96zM320 224C320 206.3 305.7 192 288 192C270.3 192 256 206.3 256 224V288C256 305.7 270.3 320 288 320C305.7 320 320 305.7 320 288V224z\"]\n};\nvar faRoadBarrier = {\n  prefix: 'fas',\n  iconName: 'road-barrier',\n  icon: [640, 512, [], \"e562\", \"M32 32C49.67 32 64 46.33 64 64V96H149.2L64 266.3V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448V64C0 46.33 14.33 32 32 32V32zM309.2 288H234.8L330.8 96H405.2L309.2 288zM458.8 96H533.2L437.2 288H362.8L458.8 96zM202.8 96H277.2L181.2 288H106.8L202.8 96zM576 117.7V64C576 46.33 590.3 32 608 32C625.7 32 640 46.33 640 64V448C640 465.7 625.7 480 608 480C590.3 480 576 465.7 576 448V288H490.8L576 117.7z\"]\n};\nvar faRoadBridge = {\n  prefix: 'fas',\n  iconName: 'road-bridge',\n  icon: [640, 512, [], \"e563\", \"M352 0H608C625.7 0 640 14.33 640 32V480C640 497.7 625.7 512 608 512H352C334.3 512 320 497.7 320 480V32C320 14.33 334.3 0 352 0zM456 224V288C456 301.3 466.7 312 480 312C493.3 312 504 301.3 504 288V224C504 210.7 493.3 200 480 200C466.7 200 456 210.7 456 224zM504 384C504 370.7 493.3 360 480 360C466.7 360 456 370.7 456 384V448C456 461.3 466.7 472 480 472C493.3 472 504 461.3 504 448V384zM456 64V128C456 141.3 466.7 152 480 152C493.3 152 504 141.3 504 128V64C504 50.75 493.3 40 480 40C466.7 40 456 50.75 456 64zM32 96H288V160H248V224H288V320C234.1 320 192 362.1 192 416V480C192 497.7 177.7 512 160 512H128C110.3 512 96 497.7 96 480V416C96 362.1 53.02 320 0 320V224H72V160H32C14.33 160 0 145.7 0 128C0 110.3 14.33 96 32 96zM200 160H120V224H200V160z\"]\n};\nvar faRoadCircleCheck = {\n  prefix: 'fas',\n  iconName: 'road-circle-check',\n  icon: [640, 512, [], \"e564\", \"M213.2 32H288V96C288 113.7 302.3 128 320 128C337.7 128 352 113.7 352 96V32H426.8C453.9 32 478 49.08 487.1 74.63L529.8 195.2C518.9 193.1 507.6 192 496 192C436.5 192 383.9 221.6 352 266.8V224C352 206.3 337.7 192 320 192C302.3 192 288 206.3 288 224V288C288 305.7 302.3 320 320 320C322.3 320 324.6 319.7 326.8 319.3C322.4 334.7 320 351.1 320 368C320 373.4 320.2 378.7 320.7 384L320 384C302.3 384 288 398.3 288 416V480H86.61C56.45 480 32 455.5 32 425.4C32 419.2 33.06 413 35.13 407.2L152.9 74.63C161.1 49.08 186.1 32 213.2 32H213.2zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM540.7 324.7L480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7H540.7z\"]\n};\nvar faRoadCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'road-circle-exclamation',\n  icon: [640, 512, [], \"e565\", \"M213.2 32H288V96C288 113.7 302.3 128 320 128C337.7 128 352 113.7 352 96V32H426.8C453.9 32 478 49.08 487.1 74.63L529.8 195.2C518.9 193.1 507.6 192 496 192C436.5 192 383.9 221.6 352 266.8V224C352 206.3 337.7 192 320 192C302.3 192 288 206.3 288 224V288C288 305.7 302.3 320 320 320C322.3 320 324.6 319.7 326.8 319.3C322.4 334.7 320 351.1 320 368C320 373.4 320.2 378.7 320.7 384L320 384C302.3 384 288 398.3 288 416V480H86.61C56.45 480 32 455.5 32 425.4C32 419.2 33.06 413 35.13 407.2L152.9 74.63C161.1 49.08 186.1 32 213.2 32H213.2zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faRoadCircleXmark = {\n  prefix: 'fas',\n  iconName: 'road-circle-xmark',\n  icon: [640, 512, [], \"e566\", \"M213.2 32H288V96C288 113.7 302.3 128 320 128C337.7 128 352 113.7 352 96V32H426.8C453.9 32 478 49.08 487.1 74.63L529.8 195.2C518.9 193.1 507.6 192 496 192C436.5 192 383.9 221.6 352 266.8V224C352 206.3 337.7 192 320 192C302.3 192 288 206.3 288 224V288C288 305.7 302.3 320 320 320C322.3 320 324.6 319.7 326.8 319.3C322.4 334.7 320 351.1 320 368C320 373.4 320.2 378.7 320.7 384L320 384C302.3 384 288 398.3 288 416V480H86.61C56.45 480 32 455.5 32 425.4C32 419.2 33.06 413 35.13 407.2L152.9 74.63C161.1 49.08 186.1 32 213.2 32H213.2zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM518.6 368L555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368z\"]\n};\nvar faRoadLock = {\n  prefix: 'fas',\n  iconName: 'road-lock',\n  icon: [640, 512, [], \"e567\", \"M288 96C288 113.7 302.3 128 320 128C337.7 128 352 113.7 352 96V32H426.8C453.9 32 478 49.08 487.1 74.63L517.5 160.5C460.6 165.8 416 213.7 416 272V296.6C396.9 307.6 384 328.3 384 352V480H352V416C352 398.3 337.7 384 320 384C302.3 384 288 398.3 288 416V480H86.61C56.45 480 32 455.5 32 425.4C32 419.2 33.06 413 35.13 407.2L152.9 74.63C161.1 49.08 186.1 32 213.2 32H287.1L288 96zM352 224C352 206.3 337.7 192 320 192C302.3 192 288 206.3 288 224V288C288 305.7 302.3 320 320 320C337.7 320 352 305.7 352 288V224zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faRoadSpikes = {\n  prefix: 'fas',\n  iconName: 'road-spikes',\n  icon: [640, 512, [], \"e568\", \"M64 116.8C64 101 84.53 94.79 93.31 107.1L192 255.1V116.8C192 101 212.5 94.79 221.3 107.1L320 255.1V116.8C320 101 340.5 94.79 349.3 107.1L448 255.1V116.8C448 101 468.5 94.79 477.3 107.1L606.8 302.2C621 323.5 605.8 351.1 580.2 351.1H64L64 116.8zM608 383.1C625.7 383.1 640 398.3 640 415.1C640 433.7 625.7 447.1 608 447.1H32C14.33 447.1 0 433.7 0 415.1C0 398.3 14.33 383.1 32 383.1H608z\"]\n};\nvar faRobot = {\n  prefix: 'fas',\n  iconName: 'robot',\n  icon: [640, 512, [129302], \"f544\", \"M9.375 233.4C3.375 239.4 0 247.5 0 256v128c0 8.5 3.375 16.62 9.375 22.62S23.5 416 32 416h32V224H32C23.5 224 15.38 227.4 9.375 233.4zM464 96H352V32c0-17.62-14.38-32-32-32S288 14.38 288 32v64H176C131.8 96 96 131.8 96 176V448c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V176C544 131.8 508.3 96 464 96zM256 416H192v-32h64V416zM224 296C201.9 296 184 278.1 184 256S201.9 216 224 216S264 233.9 264 256S246.1 296 224 296zM352 416H288v-32h64V416zM448 416h-64v-32h64V416zM416 296c-22.12 0-40-17.88-40-40S393.9 216 416 216S456 233.9 456 256S438.1 296 416 296zM630.6 233.4C624.6 227.4 616.5 224 608 224h-32v192h32c8.5 0 16.62-3.375 22.62-9.375S640 392.5 640 384V256C640 247.5 636.6 239.4 630.6 233.4z\"]\n};\nvar faRocket = {\n  prefix: 'fas',\n  iconName: 'rocket',\n  icon: [512, 512, [], \"f135\", \"M156.6 384.9L125.7 353.1C117.2 345.5 114.2 333.1 117.1 321.8C120.1 312.9 124.1 301.3 129.8 288H24C15.38 288 7.414 283.4 3.146 275.9C-1.123 268.4-1.042 259.2 3.357 251.8L55.83 163.3C68.79 141.4 92.33 127.1 117.8 127.1H200C202.4 124 204.8 120.3 207.2 116.7C289.1-4.07 411.1-8.142 483.9 5.275C495.6 7.414 504.6 16.43 506.7 28.06C520.1 100.9 516.1 222.9 395.3 304.8C391.8 307.2 387.1 309.6 384 311.1V394.2C384 419.7 370.6 443.2 348.7 456.2L260.2 508.6C252.8 513 243.6 513.1 236.1 508.9C228.6 504.6 224 496.6 224 488V380.8C209.9 385.6 197.6 389.7 188.3 392.7C177.1 396.3 164.9 393.2 156.6 384.9V384.9zM384 167.1C406.1 167.1 424 150.1 424 127.1C424 105.9 406.1 87.1 384 87.1C361.9 87.1 344 105.9 344 127.1C344 150.1 361.9 167.1 384 167.1z\"]\n};\nvar faRotate = {\n  prefix: 'fas',\n  iconName: 'rotate',\n  icon: [512, 512, [128260, \"sync-alt\"], \"f2f1\", \"M449.9 39.96l-48.5 48.53C362.5 53.19 311.4 32 256 32C161.5 32 78.59 92.34 49.58 182.2c-5.438 16.81 3.797 34.88 20.61 40.28c16.97 5.5 34.86-3.812 40.3-20.59C130.9 138.5 189.4 96 256 96c37.96 0 73 14.18 100.2 37.8L311.1 178C295.1 194.8 306.8 223.4 330.4 224h146.9C487.7 223.7 496 215.3 496 204.9V59.04C496 34.99 466.9 22.95 449.9 39.96zM441.8 289.6c-16.94-5.438-34.88 3.812-40.3 20.59C381.1 373.5 322.6 416 256 416c-37.96 0-73-14.18-100.2-37.8L200 334C216.9 317.2 205.2 288.6 181.6 288H34.66C24.32 288.3 16 296.7 16 307.1v145.9c0 24.04 29.07 36.08 46.07 19.07l48.5-48.53C149.5 458.8 200.6 480 255.1 480c94.45 0 177.4-60.34 206.4-150.2C467.9 313 458.6 294.1 441.8 289.6z\"]\n};\nvar faSyncAlt = faRotate;\nvar faRotateLeft = {\n  prefix: 'fas',\n  iconName: 'rotate-left',\n  icon: [512, 512, [\"rotate-back\", \"rotate-backward\", \"undo-alt\"], \"f2ea\", \"M480 256c0 123.4-100.5 223.9-223.9 223.9c-48.84 0-95.17-15.58-134.2-44.86c-14.12-10.59-16.97-30.66-6.375-44.81c10.59-14.12 30.62-16.94 44.81-6.375c27.84 20.91 61 31.94 95.88 31.94C344.3 415.8 416 344.1 416 256s-71.69-159.8-159.8-159.8c-37.46 0-73.09 13.49-101.3 36.64l45.12 45.14c17.01 17.02 4.955 46.1-19.1 46.1H35.17C24.58 224.1 16 215.5 16 204.9V59.04c0-24.04 29.07-36.08 46.07-19.07l47.6 47.63C149.9 52.71 201.5 32.11 256.1 32.11C379.5 32.11 480 132.6 480 256z\"]\n};\nvar faRotateBack = faRotateLeft;\nvar faRotateBackward = faRotateLeft;\nvar faUndoAlt = faRotateLeft;\nvar faRotateRight = {\n  prefix: 'fas',\n  iconName: 'rotate-right',\n  icon: [512, 512, [\"redo-alt\", \"rotate-forward\"], \"f2f9\", \"M468.9 32.11c13.87 0 27.18 10.77 27.18 27.04v145.9c0 10.59-8.584 19.17-19.17 19.17h-145.7c-16.28 0-27.06-13.32-27.06-27.2c0-6.634 2.461-13.4 7.96-18.9l45.12-45.14c-28.22-23.14-63.85-36.64-101.3-36.64c-88.09 0-159.8 71.69-159.8 159.8S167.8 415.9 255.9 415.9c73.14 0 89.44-38.31 115.1-38.31c18.48 0 31.97 15.04 31.97 31.96c0 35.04-81.59 70.41-147 70.41c-123.4 0-223.9-100.5-223.9-223.9S132.6 32.44 256 32.44c54.6 0 106.2 20.39 146.4 55.26l47.6-47.63C455.5 34.57 462.3 32.11 468.9 32.11z\"]\n};\nvar faRedoAlt = faRotateRight;\nvar faRotateForward = faRotateRight;\nvar faRoute = {\n  prefix: 'fas',\n  iconName: 'route',\n  icon: [512, 512, [], \"f4d7\", \"M320 256C302.3 256 288 270.3 288 288C288 305.7 302.3 320 320 320H416C469 320 512 362.1 512 416C512 469 469 512 416 512H139.6C148.3 502.1 158.9 489.4 169.6 475.2C175.9 466.8 182.4 457.6 188.6 448H416C433.7 448 448 433.7 448 416C448 398.3 433.7 384 416 384H320C266.1 384 223.1 341 223.1 288C223.1 234.1 266.1 192 320 192H362.1C340.2 161.5 320 125.4 320 96C320 42.98 362.1 0 416 0C469 0 512 42.98 512 96C512 160 416 256 416 256H320zM416 128C433.7 128 448 113.7 448 96C448 78.33 433.7 64 416 64C398.3 64 384 78.33 384 96C384 113.7 398.3 128 416 128zM118.3 487.8C118.1 488 117.9 488.2 117.7 488.4C113.4 493.4 109.5 497.7 106.3 501.2C105.9 501.6 105.5 502 105.2 502.4C99.5 508.5 96 512 96 512C96 512 0 416 0 352C0 298.1 42.98 255.1 96 255.1C149 255.1 192 298.1 192 352C192 381.4 171.8 417.5 149.9 448C138.1 463.2 127.7 476.9 118.3 487.8L118.3 487.8zM95.1 384C113.7 384 127.1 369.7 127.1 352C127.1 334.3 113.7 320 95.1 320C78.33 320 63.1 334.3 63.1 352C63.1 369.7 78.33 384 95.1 384z\"]\n};\nvar faRss = {\n  prefix: 'fas',\n  iconName: 'rss',\n  icon: [448, 512, [\"feed\"], \"f09e\", \"M25.57 176.1C12.41 175.4 .9117 185.2 .0523 198.4s9.173 24.65 22.39 25.5c120.1 7.875 225.7 112.7 233.6 233.6C256.9 470.3 267.4 480 279.1 480c.5313 0 1.062-.0313 1.594-.0625c13.22-.8438 23.25-12.28 22.39-25.5C294.6 310.3 169.7 185.4 25.57 176.1zM32 32C14.33 32 0 46.31 0 64s14.33 32 32 32c194.1 0 352 157.9 352 352c0 17.69 14.33 32 32 32s32-14.31 32-32C448 218.6 261.4 32 32 32zM63.1 351.9C28.63 351.9 0 380.6 0 416s28.63 64 63.1 64s64.08-28.62 64.08-64S99.37 351.9 63.1 351.9z\"]\n};\nvar faFeed = faRss;\nvar faRubleSign = {\n  prefix: 'fas',\n  iconName: 'ruble-sign',\n  icon: [384, 512, [8381, \"rouble\", \"rub\", \"ruble\"], \"f158\", \"M240 32C319.5 32 384 96.47 384 176C384 255.5 319.5 320 240 320H128V352H288C305.7 352 320 366.3 320 384C320 401.7 305.7 416 288 416H128V448C128 465.7 113.7 480 96 480C78.33 480 64 465.7 64 448V416H32C14.33 416 0 401.7 0 384C0 366.3 14.33 352 32 352H64V320H32C14.33 320 0 305.7 0 288C0 270.3 14.33 256 32 256H64V64C64 46.33 78.33 32 96 32H240zM320 176C320 131.8 284.2 96 240 96H128V256H240C284.2 256 320 220.2 320 176z\"]\n};\nvar faRouble = faRubleSign;\nvar faRub = faRubleSign;\nvar faRuble = faRubleSign;\nvar faRug = {\n  prefix: 'fas',\n  iconName: 'rug',\n  icon: [640, 512, [], \"e569\", \"M80 64V448H24C10.75 448 0 437.3 0 424C0 410.7 10.75 400 24 400H32V360H24C10.75 360 0 349.3 0 336C0 322.7 10.75 312 24 312H32V280H24C10.75 280 0 269.3 0 256C0 242.7 10.75 232 24 232H32V200H24C10.75 200 0 189.3 0 176C0 162.7 10.75 152 24 152H32V112H24C10.75 112 0 101.3 0 88C0 74.75 10.75 64 24 64H80zM112 64H528V448H112V64zM616 112H608V152H616C629.3 152 640 162.7 640 176C640 189.3 629.3 200 616 200H608V232H616C629.3 232 640 242.7 640 256C640 269.3 629.3 280 616 280H608V312H616C629.3 312 640 322.7 640 336C640 349.3 629.3 360 616 360H608V400H616C629.3 400 640 410.7 640 424C640 437.3 629.3 448 616 448H560V64H616C629.3 64 640 74.75 640 88C640 101.3 629.3 112 616 112z\"]\n};\nvar faRuler = {\n  prefix: 'fas',\n  iconName: 'ruler',\n  icon: [512, 512, [128207], \"f545\", \"M177.9 494.1C159.2 512.8 128.8 512.8 110.1 494.1L17.94 401.9C-.8054 383.2-.8054 352.8 17.94 334.1L68.69 283.3L116.7 331.3C122.9 337.6 133.1 337.6 139.3 331.3C145.6 325.1 145.6 314.9 139.3 308.7L91.31 260.7L132.7 219.3L180.7 267.3C186.9 273.6 197.1 273.6 203.3 267.3C209.6 261.1 209.6 250.9 203.3 244.7L155.3 196.7L196.7 155.3L244.7 203.3C250.9 209.6 261.1 209.6 267.3 203.3C273.6 197.1 273.6 186.9 267.3 180.7L219.3 132.7L260.7 91.31L308.7 139.3C314.9 145.6 325.1 145.6 331.3 139.3C337.6 133.1 337.6 122.9 331.3 116.7L283.3 68.69L334.1 17.94C352.8-.8055 383.2-.8055 401.9 17.94L494.1 110.1C512.8 128.8 512.8 159.2 494.1 177.9L177.9 494.1z\"]\n};\nvar faRulerCombined = {\n  prefix: 'fas',\n  iconName: 'ruler-combined',\n  icon: [512, 512, [], \"f546\", \"M0 464V48C0 21.49 21.49 0 48 0H144C170.5 0 192 21.49 192 48V96H112C103.2 96 96 103.2 96 112C96 120.8 103.2 128 112 128H192V192H112C103.2 192 96 199.2 96 208C96 216.8 103.2 224 112 224H192V288H112C103.2 288 96 295.2 96 304C96 312.8 103.2 320 112 320H192V400C192 408.8 199.2 416 208 416C216.8 416 224 408.8 224 400V320H288V400C288 408.8 295.2 416 304 416C312.8 416 320 408.8 320 400V320H384V400C384 408.8 391.2 416 400 416C408.8 416 416 408.8 416 400V320H464C490.5 320 512 341.5 512 368V464C512 490.5 490.5 512 464 512H48C23.15 512 2.706 493.1 .2477 468.9C.0838 467.3 0 465.7 0 464z\"]\n};\nvar faRulerHorizontal = {\n  prefix: 'fas',\n  iconName: 'ruler-horizontal',\n  icon: [640, 512, [], \"f547\", \"M0 176C0 149.5 21.49 128 48 128H112V208C112 216.8 119.2 224 128 224C136.8 224 144 216.8 144 208V128H208V208C208 216.8 215.2 224 224 224C232.8 224 240 216.8 240 208V128H304V208C304 216.8 311.2 224 320 224C328.8 224 336 216.8 336 208V128H400V208C400 216.8 407.2 224 416 224C424.8 224 432 216.8 432 208V128H496V208C496 216.8 503.2 224 512 224C520.8 224 528 216.8 528 208V128H592C618.5 128 640 149.5 640 176V336C640 362.5 618.5 384 592 384H48C21.49 384 0 362.5 0 336V176z\"]\n};\nvar faRulerVertical = {\n  prefix: 'fas',\n  iconName: 'ruler-vertical',\n  icon: [256, 512, [], \"f548\", \"M0 48C0 21.49 21.49 0 48 0H208C234.5 0 256 21.49 256 48V96H176C167.2 96 160 103.2 160 112C160 120.8 167.2 128 176 128H256V192H176C167.2 192 160 199.2 160 208C160 216.8 167.2 224 176 224H256V288H176C167.2 288 160 295.2 160 304C160 312.8 167.2 320 176 320H256V384H176C167.2 384 160 391.2 160 400C160 408.8 167.2 416 176 416H256V464C256 490.5 234.5 512 208 512H48C21.49 512 0 490.5 0 464V48z\"]\n};\nvar faRupeeSign = {\n  prefix: 'fas',\n  iconName: 'rupee-sign',\n  icon: [448, 512, [8360, \"rupee\"], \"f156\", \"M.0003 64C.0003 46.33 14.33 32 32 32H112C191.5 32 256 96.47 256 176C256 234.8 220.8 285.3 170.3 307.7L221.7 436.1C228.3 452.5 220.3 471.1 203.9 477.7C187.5 484.3 168.9 476.3 162.3 459.9L106.3 320H64V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448L.0003 64zM64 256H112C156.2 256 192 220.2 192 176C192 131.8 156.2 96 112 96H64V256zM320.8 282.2C321.3 283.3 322.2 284.8 325 287.1C332.2 292.8 343.7 297.1 362.9 303.8L364.2 304.3C380.3 309.1 402.9 317.9 419.1 332.4C429.5 340.5 437.9 351 443 364.7C448.1 378.4 449.1 393.2 446.8 408.7C442.7 436.8 426.4 457.1 403.1 469.6C381 480.7 354.9 482.1 329.9 477.6L329.7 477.5C320.4 475.8 309.2 471.8 300.5 468.6C294.4 466.3 287.9 463.7 282.7 461.6C280.2 460.6 278.1 459.8 276.4 459.1C259.9 452.7 251.8 434.2 258.2 417.7C264.6 401.2 283.1 393.1 299.6 399.5C302.2 400.5 304.8 401.5 307.5 402.6C312.3 404.5 317.4 406.5 322.9 408.6C331.7 411.9 338.2 413.1 341.6 414.6C357.2 417.5 368.3 415.5 374.5 412.4C379.4 409.9 382.5 406.3 383.5 399.3C384.5 392.4 383.7 388.8 383.1 387.1C382.4 385.4 381.3 383.5 378.6 381.2C371.7 375.4 360.4 370.8 341.6 364.2L338.6 363.1C323.1 357.7 301.6 350.2 285.3 337.2C275.8 329.7 266.1 319.7 261.5 306.3C256.1 292.8 254.9 278.2 257.2 263.1C265.6 205.1 324.2 185.1 374.1 194.2C380.1 195.5 401.4 200 409.5 202.6C426.4 207.8 435.8 225.7 430.6 242.6C425.3 259.5 407.4 268.9 390.5 263.7C385.8 262.2 368.2 258.2 362.6 257.2C347.1 254.5 336.8 256.8 329.1 260.4C323.7 263.7 321.1 267.1 320.5 272.4C319.6 278.4 320.4 281.2 320.8 282.2H320.8z\"]\n};\nvar faRupee = faRupeeSign;\nvar faRupiahSign = {\n  prefix: 'fas',\n  iconName: 'rupiah-sign',\n  icon: [512, 512, [], \"e23d\", \"M.0003 64C.0003 46.33 14.33 32 32 32H112C191.5 32 256 96.47 256 176C256 234.8 220.8 285.3 170.3 307.7L221.7 436.1C228.3 452.5 220.3 471.1 203.9 477.7C187.5 484.3 168.9 476.3 162.3 459.9L106.3 320H64V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448L.0003 64zM64 256H112C156.2 256 192 220.2 192 176C192 131.8 156.2 96 112 96H64V256zM400 160C461.9 160 512 210.1 512 272C512 333.9 461.9 384 400 384H352V480C352 497.7 337.7 512 320 512C302.3 512 288 497.7 288 480V192C288 174.3 302.3 160 320 160H400zM448 272C448 245.5 426.5 224 400 224H352V320H400C426.5 320 448 298.5 448 272z\"]\n};\nvar faS = {\n  prefix: 'fas',\n  iconName: 's',\n  icon: [384, 512, [115], \"53\", \"M349.9 379.1c-6.281 36.63-25.89 65.02-56.69 82.11c-24.91 13.83-54.08 18.98-83.73 18.98c-61.86 0-125.8-22.42-157.5-35.38c-16.38-6.672-24.22-25.34-17.55-41.7c6.641-16.36 25.27-24.28 41.7-17.55c77.56 31.64 150.6 39.39 186.1 19.69c13.83-7.672 21.67-19.42 24.69-36.98c7.25-42.31-18.2-56.75-103.7-81.38C112.6 266.6 15.98 238.7 34.11 133.2c5.484-32 23.64-59.36 51.14-77.02c45.59-29.33 115-31.87 206.4-7.688c17.09 4.531 27.27 22.05 22.75 39.13s-22.06 27.23-39.13 22.75C184 86.17 140.4 96.81 119.8 110c-12.55 8.062-20.17 19.5-22.66 34c-7.266 42.31 18.19 56.75 103.7 81.38C271.4 245.7 368 273.5 349.9 379.1z\"]\n};\nvar faSackDollar = {\n  prefix: 'fas',\n  iconName: 'sack-dollar',\n  icon: [512, 512, [128176], \"f81d\", \"M320 96H192L144.6 24.88C137.5 14.24 145.1 0 157.9 0H354.1C366.9 0 374.5 14.24 367.4 24.88L320 96zM192 128H320C323.8 130.5 328.1 133.3 332.1 136.4C389.7 172.7 512 250.9 512 416C512 469 469 512 416 512H96C42.98 512 0 469 0 416C0 250.9 122.3 172.7 179 136.4C183.9 133.3 188.2 130.5 192 128V128zM276.1 224C276.1 212.9 267.1 203.9 255.1 203.9C244.9 203.9 235.9 212.9 235.9 224V230C230.3 231.2 224.1 232.9 220 235.1C205.1 241.9 192.1 254.5 188.9 272.8C187.1 283 188.1 292.9 192.3 301.8C196.5 310.6 203 316.8 209.6 321.3C221.2 329.2 236.5 333.8 248.2 337.3L250.4 337.9C264.4 342.2 273.8 345.3 279.7 349.6C282.2 351.4 283.1 352.8 283.4 353.7C283.8 354.5 284.4 356.3 283.7 360.3C283.1 363.8 281.2 366.8 275.7 369.1C269.6 371.7 259.7 373 246.9 371C240.9 370 230.2 366.4 220.7 363.2C218.5 362.4 216.3 361.7 214.3 361C203.8 357.5 192.5 363.2 189 373.7C185.5 384.2 191.2 395.5 201.7 398.1C202.9 399.4 204.4 399.9 206.1 400.5C213.1 403.2 226.4 407.4 235.9 409.6V416C235.9 427.1 244.9 436.1 255.1 436.1C267.1 436.1 276.1 427.1 276.1 416V410.5C281.4 409.5 286.6 407.1 291.4 405.9C307.2 399.2 319.8 386.2 323.1 367.2C324.9 356.8 324.1 346.8 320.1 337.7C316.2 328.7 309.9 322.1 303.2 317.3C291.1 308.4 274.9 303.6 262.8 299.9L261.1 299.7C247.8 295.4 238.2 292.4 232.1 288.2C229.5 286.4 228.7 285.2 228.5 284.7C228.3 284.3 227.7 283.1 228.3 279.7C228.7 277.7 230.2 274.4 236.5 271.6C242.1 268.7 252.9 267.1 265.1 268.1C269.5 269.7 283 272.3 286.9 273.3C297.5 276.2 308.5 269.8 311.3 259.1C314.2 248.5 307.8 237.5 297.1 234.7C292.7 233.5 282.7 231.5 276.1 230.3L276.1 224z\"]\n};\nvar faSackXmark = {\n  prefix: 'fas',\n  iconName: 'sack-xmark',\n  icon: [512, 512, [], \"e56a\", \"M144.6 24.88C137.5 14.24 145.1 0 157.9 0H354.1C366.9 0 374.5 14.24 367.4 24.88L320 96H192L144.6 24.88zM332.1 136.4C389.7 172.7 512 250.9 512 416C512 469 469 512 416 512H96C42.98 512 0 469 0 416C0 250.9 122.3 172.7 179 136.4C183.9 133.3 188.2 130.5 192 128H320C323.8 130.5 328.1 133.3 332.1 136.4V136.4zM336.1 288.1C346.3 279.6 346.3 264.4 336.1 255C327.6 245.7 312.4 245.7 303 255L256 302.1L208.1 255C199.6 245.7 184.4 245.7 175 255C165.7 264.4 165.7 279.6 175 288.1L222.1 336L175 383C165.7 392.4 165.7 407.6 175 416.1C184.4 426.3 199.6 426.3 208.1 416.1L256 369.9L303 416.1C312.4 426.3 327.6 426.3 336.1 416.1C346.3 407.6 346.3 392.4 336.1 383L289.9 336L336.1 288.1z\"]\n};\nvar faSailboat = {\n  prefix: 'fas',\n  iconName: 'sailboat',\n  icon: [576, 512, [], \"e445\", \"M256 16C256 9.018 260.5 2.841 267.2 .7414C273.9-1.358 281.1 1.105 285.1 6.826L509.1 326.8C512.5 331.7 512.9 338.1 510.2 343.4C507.4 348.7 501.1 352 496 352H272C263.2 352 256 344.8 256 336V16zM212.1 96.54C219.1 98.4 224 104.7 224 112V336C224 344.8 216.8 352 208 352H80C74.3 352 69.02 348.1 66.16 344C63.3 339.1 63.28 333 66.11 328.1L194.1 104.1C197.7 97.76 205.1 94.68 212.1 96.54V96.54zM5.718 404.3C2.848 394.1 10.52 384 21.12 384H554.9C565.5 384 573.2 394.1 570.3 404.3L566.3 418.7C550.7 473.9 500.4 512 443 512H132.1C75.62 512 25.27 473.9 9.747 418.7L5.718 404.3z\"]\n};\nvar faSatellite = {\n  prefix: 'fas',\n  iconName: 'satellite',\n  icon: [512, 512, [128752], \"f7bf\", \"M502.8 264.1l-80.37-80.37l47.87-47.88c13-13.12 13-34.37 0-47.5l-47.5-47.5c-13.12-13.12-34.38-13.12-47.5 0l-47.88 47.88L247.1 9.25C241 3.375 232.9 0 224.5 0c-8.5 0-16.62 3.375-22.5 9.25l-96.75 96.75c-12.38 12.5-12.38 32.62 0 45.12L185.5 231.5L175.8 241.4c-54-24.5-116.3-22.5-168.5 5.375c-8.498 4.625-9.623 16.38-2.873 23.25l107.6 107.5l-17.88 17.75c-2.625-.75-5-1.625-7.75-1.625c-17.75 0-32 14.38-32 32c0 17.75 14.25 32 32 32c17.62 0 32-14.25 32-32c0-2.75-.875-5.125-1.625-7.75l17.75-17.88l107.6 107.6c6.75 6.75 18.62 5.625 23.12-2.875c27.88-52.25 29.88-114.5 5.375-168.5l10-9.873l80.25 80.36c12.5 12.38 32.62 12.38 44.1 0l96.75-96.75C508.6 304.1 512 295.1 512 287.5C512 279.1 508.6 270.1 502.8 264.1zM219.5 197.4L150.6 128.5l73.87-73.75l68.86 68.88L219.5 197.4zM383.5 361.4L314.6 292.5l73.75-73.88l68.88 68.87L383.5 361.4z\"]\n};\nvar faSatelliteDish = {\n  prefix: 'fas',\n  iconName: 'satellite-dish',\n  icon: [512, 512, [128225], \"f7c0\", \"M216 104C202.8 104 192 114.8 192 128s10.75 24 24 24c79.41 0 144 64.59 144 144C360 309.3 370.8 320 384 320s24-10.75 24-24C408 190.1 321.9 104 216 104zM224 0C206.3 0 192 14.31 192 32s14.33 32 32 32c123.5 0 224 100.5 224 224c0 17.69 14.33 32 32 32s32-14.31 32-32C512 129.2 382.8 0 224 0zM188.9 346l27.37-27.37c2.625 .625 5.059 1.506 7.809 1.506c17.75 0 31.99-14.26 31.99-32c0-17.62-14.24-32.01-31.99-32.01c-17.62 0-31.99 14.38-31.99 32.01c0 2.875 .8099 5.25 1.56 7.875L166.2 323.4L49.37 206.5c-7.25-7.25-20.12-6-24.1 3c-41.75 77.88-29.88 176.7 35.75 242.4c65.62 65.62 164.6 77.5 242.4 35.75c9.125-5 10.38-17.75 3-25L188.9 346z\"]\n};\nvar faScaleBalanced = {\n  prefix: 'fas',\n  iconName: 'scale-balanced',\n  icon: [640, 512, [9878, \"balance-scale\"], \"f24e\", \"M554.9 154.5c-17.62-35.25-68.12-35.38-85.87 0c-87 174.3-84.1 165.9-84.1 181.5c0 44.13 57.25 80 128 80s127.1-35.88 127.1-80C639.1 319.9 641.4 327.3 554.9 154.5zM439.1 320l71.96-144l72.17 144H439.1zM256 336c0-16.12 1.375-8.75-85.12-181.5c-17.62-35.25-68.12-35.38-85.87 0c-87 174.3-84.1 165.9-84.1 181.5c0 44.13 57.25 80 127.1 80S256 380.1 256 336zM127.9 176L200.1 320H55.96L127.9 176zM495.1 448h-143.1V153.3C375.5 143 393.1 121.8 398.4 96h113.6c17.67 0 31.1-14.33 31.1-32s-14.33-32-31.1-32h-128.4c-14.62-19.38-37.5-32-63.62-32S270.1 12.62 256.4 32H128C110.3 32 96 46.33 96 64S110.3 96 127.1 96h113.6c5.25 25.75 22.87 47 46.37 57.25V448H144c-26.51 0-48.01 21.49-48.01 48c0 8.836 7.165 16 16 16h416c8.836 0 16-7.164 16-16C544 469.5 522.5 448 495.1 448z\"]\n};\nvar faBalanceScale = faScaleBalanced;\nvar faScaleUnbalanced = {\n  prefix: 'fas',\n  iconName: 'scale-unbalanced',\n  icon: [640, 512, [\"balance-scale-left\"], \"f515\", \"M85 250.5c-87 174.2-84.1 165.9-84.1 181.5C.0035 476.1 57.25 512 128 512s128-35.88 128-79.1c0-16.12 1.375-8.752-85.12-181.5C153.3 215.3 102.8 215.1 85 250.5zM55.96 416l71.98-143.1l72.15 143.1H55.96zM554.9 122.5c-17.62-35.25-68.08-35.37-85.83 0c-87 174.2-85.04 165.9-85.04 181.5c0 44.12 57.25 79.1 128 79.1s127.1-35.87 127.1-79.1C639.1 287.9 641.4 295.3 554.9 122.5zM439.1 288l72.04-143.1l72.08 143.1H439.1zM495.1 448h-143.1V153.3c20.83-9.117 36.72-26.93 43.78-48.77l126.3-42.11c16.77-5.594 25.83-23.72 20.23-40.48c-5.578-16.73-23.62-25.86-40.48-20.23l-113.3 37.76c-13.94-23.49-39.29-39.41-68.58-39.41c-44.18 0-79.1 35.82-79.1 80c0 2.961 .5587 5.771 .8712 8.648L117.9 129.7C101.1 135.3 92.05 153.4 97.64 170.1c4.469 13.41 16.95 21.88 30.36 21.88c3.344 0 6.768-.5186 10.13-1.644L273.8 145.1C278.2 148.3 282.1 151.1 288 153.3V496C288 504.8 295.2 512 304 512h223.1c8.838 0 16-7.164 16-15.1C543.1 469.5 522.5 448 495.1 448z\"]\n};\nvar faBalanceScaleLeft = faScaleUnbalanced;\nvar faScaleUnbalancedFlip = {\n  prefix: 'fas',\n  iconName: 'scale-unbalanced-flip',\n  icon: [640, 512, [\"balance-scale-right\"], \"f516\", \"M554.9 250.5c-17.62-35.37-68.12-35.25-85.87 0c-86.38 172.7-85.04 165.4-85.04 181.5C383.1 476.1 441.3 512 512 512s127.1-35.88 127.1-79.1C639.1 416.4 642 424.7 554.9 250.5zM439.9 416l72.15-143.1l71.98 143.1H439.9zM512 192c13.41 0 25.89-8.471 30.36-21.88c5.594-16.76-3.469-34.89-20.23-40.48l-122.1-40.1c.3125-2.877 .8712-5.687 .8712-8.648c0-44.18-35.81-80-79.1-80c-29.29 0-54.65 15.92-68.58 39.41l-113.3-37.76C121.3-3.963 103.2 5.162 97.64 21.9C92.05 38.66 101.1 56.78 117.9 62.38l126.3 42.11c7.061 21.84 22.95 39.65 43.78 48.77v294.7H144c-26.51 0-47.1 21.49-47.1 47.1C96 504.8 103.2 512 112 512h223.1c8.836 0 15.1-7.164 15.1-15.1V153.3c5.043-2.207 9.756-4.965 14.19-8.115l135.7 45.23C505.2 191.5 508.7 192 512 192zM256 304c0-15.62 1.1-7.252-85.12-181.5c-17.62-35.37-68.08-35.25-85.83 0c-86.38 172.7-85.04 165.4-85.04 181.5c0 44.12 57.25 79.1 127.1 79.1S256 348.1 256 304zM128 144l72.04 143.1H55.92L128 144z\"]\n};\nvar faBalanceScaleRight = faScaleUnbalancedFlip;\nvar faSchool = {\n  prefix: 'fas',\n  iconName: 'school',\n  icon: [640, 512, [127979], \"f549\", \"M320 128C328.8 128 336 135.2 336 144V160H352C360.8 160 368 167.2 368 176C368 184.8 360.8 192 352 192H320C311.2 192 304 184.8 304 176V144C304 135.2 311.2 128 320 128zM476.8 98.06L602.4 125.1C624.4 130.9 640 150.3 640 172.8V464C640 490.5 618.5 512 592 512H48C21.49 512 0 490.5 0 464V172.8C0 150.3 15.63 130.9 37.59 125.1L163.2 98.06L302.2 5.374C312.1-1.791 327-1.791 337.8 5.374L476.8 98.06zM256 512H384V416C384 380.7 355.3 352 320 352C284.7 352 256 380.7 256 416V512zM96 192C87.16 192 80 199.2 80 208V272C80 280.8 87.16 288 96 288H128C136.8 288 144 280.8 144 272V208C144 199.2 136.8 192 128 192H96zM496 272C496 280.8 503.2 288 512 288H544C552.8 288 560 280.8 560 272V208C560 199.2 552.8 192 544 192H512C503.2 192 496 199.2 496 208V272zM96 320C87.16 320 80 327.2 80 336V400C80 408.8 87.16 416 96 416H128C136.8 416 144 408.8 144 400V336C144 327.2 136.8 320 128 320H96zM496 400C496 408.8 503.2 416 512 416H544C552.8 416 560 408.8 560 400V336C560 327.2 552.8 320 544 320H512C503.2 320 496 327.2 496 336V400zM320 88C271.4 88 232 127.4 232 176C232 224.6 271.4 264 320 264C368.6 264 408 224.6 408 176C408 127.4 368.6 88 320 88z\"]\n};\nvar faSchoolCircleCheck = {\n  prefix: 'fas',\n  iconName: 'school-circle-check',\n  icon: [640, 512, [], \"e56b\", \"M476.8 98.06L602.4 125.1C624.4 130.9 640 150.3 640 172.8V266.8C608.1 221.6 555.5 191.1 496 191.1C457.5 191.1 421.8 204.4 392.9 225.4C402.4 211.3 408 194.3 408 175.1C408 127.4 368.6 87.1 320 87.1C271.4 87.1 232 127.4 232 175.1C232 224.6 271.4 263.1 320 263.1C335.6 263.1 350.2 259.1 362.9 252.9C339.4 279.9 324.1 314.3 320.7 352H320.3L320 352C284.7 352 256 380.7 256 416V512L320 512H48C21.49 512 0 490.5 0 464V172.8C0 150.3 15.63 130.9 37.59 125.1L163.2 98.06L302.2 5.374C312.1-1.791 327-1.791 337.8 5.374L476.8 98.06zM96 192C87.16 192 80 199.2 80 208V272C80 280.8 87.16 288 96 288H128C136.8 288 144 280.8 144 272V208C144 199.2 136.8 192 128 192H96zM96 320C87.16 320 80 327.2 80 336V400C80 408.8 87.16 416 96 416H128C136.8 416 144 408.8 144 400V336C144 327.2 136.8 320 128 320H96zM320 128C328.8 128 336 135.2 336 144V160H352C360.8 160 368 167.2 368 176C368 184.8 360.8 192 352 192H320C311.2 192 304 184.8 304 176V144C304 135.2 311.2 128 320 128zM640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368zM480 385.4L451.3 356.7C445.1 350.4 434.9 350.4 428.7 356.7C422.4 362.9 422.4 373.1 428.7 379.3L468.7 419.3C474.9 425.6 485.1 425.6 491.3 419.3L563.3 347.3C569.6 341.1 569.6 330.9 563.3 324.7C557.1 318.4 546.9 318.4 540.7 324.7L480 385.4z\"]\n};\nvar faSchoolCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'school-circle-exclamation',\n  icon: [640, 512, [], \"e56c\", \"M476.8 98.06L602.4 125.1C624.4 130.9 640 150.3 640 172.8V266.8C608.1 221.6 555.5 191.1 496 191.1C457.5 191.1 421.8 204.4 392.9 225.4C402.4 211.3 408 194.3 408 175.1C408 127.4 368.6 87.1 320 87.1C271.4 87.1 232 127.4 232 175.1C232 224.6 271.4 263.1 320 263.1C335.6 263.1 350.2 259.1 362.9 252.9C339.4 279.9 324.1 314.3 320.7 352H320.3L320 352C284.7 352 256 380.7 256 416V512L320 512H48C21.49 512 0 490.5 0 464V172.8C0 150.3 15.63 130.9 37.59 125.1L163.2 98.06L302.2 5.374C312.1-1.791 327-1.791 337.8 5.374L476.8 98.06zM96 192C87.16 192 80 199.2 80 208V272C80 280.8 87.16 288 96 288H128C136.8 288 144 280.8 144 272V208C144 199.2 136.8 192 128 192H96zM96 320C87.16 320 80 327.2 80 336V400C80 408.8 87.16 416 96 416H128C136.8 416 144 408.8 144 400V336C144 327.2 136.8 320 128 320H96zM320 128C328.8 128 336 135.2 336 144V160H352C360.8 160 368 167.2 368 176C368 184.8 360.8 192 352 192H320C311.2 192 304 184.8 304 176V144C304 135.2 311.2 128 320 128zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faSchoolCircleXmark = {\n  prefix: 'fas',\n  iconName: 'school-circle-xmark',\n  icon: [640, 512, [], \"e56d\", \"M476.8 98.06L602.4 125.1C624.4 130.9 640 150.3 640 172.8V266.8C608.1 221.6 555.5 191.1 496 191.1C457.5 191.1 421.8 204.4 392.9 225.4C402.4 211.3 408 194.3 408 175.1C408 127.4 368.6 87.1 320 87.1C271.4 87.1 232 127.4 232 175.1C232 224.6 271.4 263.1 320 263.1C335.6 263.1 350.2 259.1 362.9 252.9C339.4 279.9 324.1 314.3 320.7 352H320.3L320 352C284.7 352 256 380.7 256 416V512L320 512H48C21.49 512 0 490.5 0 464V172.8C0 150.3 15.63 130.9 37.59 125.1L163.2 98.06L302.2 5.374C312.1-1.791 327-1.791 337.8 5.374L476.8 98.06zM96 192C87.16 192 80 199.2 80 208V272C80 280.8 87.16 288 96 288H128C136.8 288 144 280.8 144 272V208C144 199.2 136.8 192 128 192H96zM96 320C87.16 320 80 327.2 80 336V400C80 408.8 87.16 416 96 416H128C136.8 416 144 408.8 144 400V336C144 327.2 136.8 320 128 320H96zM320 128C328.8 128 336 135.2 336 144V160H352C360.8 160 368 167.2 368 176C368 184.8 360.8 192 352 192H320C311.2 192 304 184.8 304 176V144C304 135.2 311.2 128 320 128zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM518.6 368L555.3 331.3C561.6 325.1 561.6 314.9 555.3 308.7C549.1 302.4 538.9 302.4 532.7 308.7L496 345.4L459.3 308.7C453.1 302.4 442.9 302.4 436.7 308.7C430.4 314.9 430.4 325.1 436.7 331.3L473.4 368L436.7 404.7C430.4 410.9 430.4 421.1 436.7 427.3C442.9 433.6 453.1 433.6 459.3 427.3L496 390.6L532.7 427.3C538.9 433.6 549.1 433.6 555.3 427.3C561.6 421.1 561.6 410.9 555.3 404.7L518.6 368z\"]\n};\nvar faSchoolFlag = {\n  prefix: 'fas',\n  iconName: 'school-flag',\n  icon: [576, 512, [], \"e56e\", \"M288 0H400C408.8 0 416 7.164 416 16V64C416 72.84 408.8 80 400 80H320V95.53L410.3 160H512C547.3 160 576 188.7 576 224V448C576 483.3 547.3 512 512 512H336V400C336 373.5 314.5 352 288 352C261.5 352 240 373.5 240 400V512H64C28.65 512 0 483.3 0 448V224C0 188.7 28.65 160 64 160H165.7L256 95.53V32C256 14.33 270.3 0 288 0V0zM288 192C261.5 192 240 213.5 240 240C240 266.5 261.5 288 288 288C314.5 288 336 266.5 336 240C336 213.5 314.5 192 288 192zM80 224C71.16 224 64 231.2 64 240V304C64 312.8 71.16 320 80 320H112C120.8 320 128 312.8 128 304V240C128 231.2 120.8 224 112 224H80zM448 304C448 312.8 455.2 320 464 320H496C504.8 320 512 312.8 512 304V240C512 231.2 504.8 224 496 224H464C455.2 224 448 231.2 448 240V304zM80 352C71.16 352 64 359.2 64 368V432C64 440.8 71.16 448 80 448H112C120.8 448 128 440.8 128 432V368C128 359.2 120.8 352 112 352H80zM464 352C455.2 352 448 359.2 448 368V432C448 440.8 455.2 448 464 448H496C504.8 448 512 440.8 512 432V368C512 359.2 504.8 352 496 352H464z\"]\n};\nvar faSchoolLock = {\n  prefix: 'fas',\n  iconName: 'school-lock',\n  icon: [640, 512, [], \"e56f\", \"M336 160H352C360.8 160 368 167.2 368 176C368 184.8 360.8 192 352 192H320C311.2 192 304 184.8 304 176V144C304 135.2 311.2 128 320 128C328.8 128 336 135.2 336 144V160zM302.2 5.374C312.1-1.791 327-1.791 337.8 5.374L476.8 98.06L602.4 125.1C624.4 130.9 640 150.3 640 172.8V271.1C640 210.1 589.9 159.1 528 159.1C466.1 159.1 416 210.1 416 271.1V296.6C396.9 307.6 384 328.3 384 352H320.3L320 352C284.7 352 256 380.7 256 416V512H320L48 512C21.49 512 0 490.5 0 464V172.8C0 150.3 15.63 130.9 37.59 125.1L163.2 98.06L302.2 5.374zM80 272C80 280.8 87.16 288 96 288H128C136.8 288 144 280.8 144 272V208C144 199.2 136.8 192 128 192H96C87.16 192 80 199.2 80 208V272zM80 400C80 408.8 87.16 416 96 416H128C136.8 416 144 408.8 144 400V336C144 327.2 136.8 320 128 320H96C87.16 320 80 327.2 80 336V400zM320 264C368.6 264 408 224.6 408 176C408 127.4 368.6 88 320 88C271.4 88 232 127.4 232 176C232 224.6 271.4 264 320 264zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faScissors = {\n  prefix: 'fas',\n  iconName: 'scissors',\n  icon: [512, 512, [9986, 9988, 9984, \"cut\"], \"f0c4\", \"M396.8 51.2C425.1 22.92 470.9 22.92 499.2 51.2C506.3 58.27 506.3 69.73 499.2 76.8L216.5 359.5C221.3 372.1 224 385.7 224 400C224 461.9 173.9 512 112 512C50.14 512 0 461.9 0 400C0 338.1 50.14 287.1 112 287.1C126.3 287.1 139.9 290.7 152.5 295.5L191.1 255.1L152.5 216.5C139.9 221.3 126.3 224 112 224C50.14 224 0 173.9 0 112C0 50.14 50.14 0 112 0C173.9 0 224 50.14 224 112C224 126.3 221.3 139.9 216.5 152.5L255.1 191.1L396.8 51.2zM160 111.1C160 85.49 138.5 63.1 112 63.1C85.49 63.1 64 85.49 64 111.1C64 138.5 85.49 159.1 112 159.1C138.5 159.1 160 138.5 160 111.1zM112 448C138.5 448 160 426.5 160 400C160 373.5 138.5 352 112 352C85.49 352 64 373.5 64 400C64 426.5 85.49 448 112 448zM278.6 342.6L342.6 278.6L499.2 435.2C506.3 442.3 506.3 453.7 499.2 460.8C470.9 489.1 425.1 489.1 396.8 460.8L278.6 342.6z\"]\n};\nvar faCut = faScissors;\nvar faScrewdriver = {\n  prefix: 'fas',\n  iconName: 'screwdriver',\n  icon: [512, 512, [129691], \"f54a\", \"M128 278.6l-117.1 116.9c-14.5 14.62-14.5 38.29 0 52.79l52.75 52.75c14.5 14.5 38.17 14.5 52.79 0L233.4 384c29.12-29.12 29.12-76.25 0-105.4S157.1 249.5 128 278.6zM447.1 0l-128 96L320 158L237 241.1C243.8 245.4 250.3 250.1 256 256c5.875 5.75 10.62 12.25 14.88 19L353.1 192h61.99l95.1-128L447.1 0z\"]\n};\nvar faScrewdriverWrench = {\n  prefix: 'fas',\n  iconName: 'screwdriver-wrench',\n  icon: [512, 512, [\"tools\"], \"f7d9\", \"M331.8 224.1c28.29 0 54.88 10.99 74.86 30.97l19.59 19.59c40.01-17.74 71.25-53.3 81.62-96.65c5.725-23.92 5.34-47.08 .2148-68.4c-2.613-10.88-16.43-14.51-24.34-6.604l-68.9 68.9h-75.6V97.2l68.9-68.9c7.912-7.912 4.275-21.73-6.604-24.34c-21.32-5.125-44.48-5.51-68.4 .2148c-55.3 13.23-98.39 60.22-107.2 116.4C224.5 128.9 224.2 137 224.3 145l82.78 82.86C315.2 225.1 323.5 224.1 331.8 224.1zM384 278.6c-23.16-23.16-57.57-27.57-85.39-13.9L191.1 158L191.1 95.99l-127.1-95.99L0 63.1l96 127.1l62.04 .0077l106.7 106.6c-13.67 27.82-9.251 62.23 13.91 85.39l117 117.1c14.62 14.5 38.21 14.5 52.71-.0016l52.75-52.75c14.5-14.5 14.5-38.08-.0016-52.71L384 278.6zM227.9 307L168.7 247.9l-148.9 148.9c-26.37 26.37-26.37 69.08 0 95.45C32.96 505.4 50.21 512 67.5 512s34.54-6.592 47.72-19.78l119.1-119.1C225.5 352.3 222.6 329.4 227.9 307zM64 472c-13.25 0-24-10.75-24-24c0-13.26 10.75-24 24-24S88 434.7 88 448C88 461.3 77.25 472 64 472z\"]\n};\nvar faTools = faScrewdriverWrench;\nvar faScroll = {\n  prefix: 'fas',\n  iconName: 'scroll',\n  icon: [576, 512, [128220], \"f70e\", \"M48 32C21.5 32 0 53.5 0 80v64C0 152.9 7.125 160 16 160H96V80C96 53.5 74.5 32 48 32zM256 380.6V320h224V128c0-53-43-96-96-96H111.6C121.8 45.38 128 61.88 128 80V384c0 38.88 34.62 69.63 74.75 63.13C234.3 442 256 412.5 256 380.6zM288 352v32c0 52.88-43 96-96 96h272c61.88 0 112-50.13 112-112c0-8.875-7.125-16-16-16H288z\"]\n};\nvar faScrollTorah = {\n  prefix: 'fas',\n  iconName: 'scroll-torah',\n  icon: [640, 512, [\"torah\"], \"f6a0\", \"M320 366.5l17.75-29.62l-35.5 .0011L320 366.5zM382.5 311.5l36.75-.0011l-18.38-30.75L382.5 311.5zM48 0C21.5 0 0 14.38 0 32v448c0 17.62 21.5 32 48 32S96 497.6 96 480V32C96 14.38 74.5 0 48 0zM419.2 200.5L382.4 200.5l18.5 30.79L419.2 200.5zM220.8 311.5l36.87-.0012l-18.5-30.87L220.8 311.5zM287.1 311.5L352.9 311.5l33.25-55.5l-33.25-55.5L287.1 200.5L253.9 256L287.1 311.5zM592 0C565.5 0 544 14.38 544 32v448c0 17.62 21.5 32 48 32s48-14.38 48-32V32C640 14.38 618.5 0 592 0zM128 480h384V32H128V480zM194.8 185.9c3.75-6.625 10.87-10.75 18.5-10.75L272.7 175.1l29.12-48.67C305.6 119.1 312.6 116.1 319.1 116.1c7.375-.125 14.25 3.916 17.1 10.17l29.25 48.87l59.5-.0019c7.625 0 14.62 4.124 18.38 10.75s3.626 14.75-.2493 21.25l-29.25 48.87l29.38 48.1c4 6.5 4.001 14.62 .2506 21.12c-3.75 6.625-10.87 10.75-18.5 10.75l-59.5 .0019l-29.12 48.67c-3.75 6.5-10.62 10.33-18.12 10.46c-7.375 0-14.25-3.874-18-10.25l-29.25-48.87l-59.5 .0019c-7.625 0-14.62-4.124-18.37-10.75S191.3 311.4 195.1 304.9l29.25-48.87L195 207C191.1 200.5 191 192.4 194.8 185.9zM319.1 145.5L302.2 175.1l35.37-.0011L319.1 145.5zM257.5 200.5L220.8 200.5l18.38 30.83L257.5 200.5z\"]\n};\nvar faTorah = faScrollTorah;\nvar faSdCard = {\n  prefix: 'fas',\n  iconName: 'sd-card',\n  icon: [384, 512, [], \"f7c2\", \"M320 0H128L0 128v320c0 35.25 28.75 64 64 64h256c35.25 0 64-28.75 64-64V64C384 28.75 355.3 0 320 0zM160 160H112V64H160V160zM240 160H192V64h48V160zM320 160h-48V64H320V160z\"]\n};\nvar faSection = {\n  prefix: 'fas',\n  iconName: 'section',\n  icon: [256, 512, [], \"e447\", \"M224.5 337.4c15.66-14.28 26.09-33.12 29.8-55.82c14.46-88.44-64.67-112.4-117-128.2L124.7 149.5C65.67 131.2 61.11 119.4 64.83 96.79c1.531-9.344 5.715-16.19 13.21-21.56c14.74-10.56 39.94-13.87 69.23-9.029c10.74 1.75 24.36 5.686 41.66 12.03c16.58 6 34.98-2.438 41.04-19.06c6.059-16.59-2.467-34.97-19.05-41.06c-21.39-7.842-38.35-12.62-53.28-15.06c-46.47-7.781-88.1-.5313-116.9 20.19C19.46 38.52 5.965 60.39 1.686 86.48C-5.182 128.6 9.839 156 31.47 174.7C15.87 188.1 5.406 207.8 1.686 230.5C-12.59 317.9 67.36 342.7 105.7 354.6l12.99 3.967c64.71 19.56 76.92 29.09 72.42 56.59c-1.279 7.688-4.84 18.75-21.23 26.16c-15.27 6.906-37.01 8.406-61.4 4.469c-16.74-2.656-37.32-10.5-55.49-17.41l-9.773-3.719c-16.52-6.156-34.95 2.25-41.16 18.75c-6.184 16.56 2.186 34.1 18.74 41.19l9.463 3.594c21.05 8 44.94 17.12 68.02 20.75c12.21 2.031 24.14 3.032 35.54 3.032c23.17 0 44.28-4.157 62.4-12.34c31.95-14.44 52.53-40.75 58.02-74.12C261.1 383.6 246.8 356.3 224.5 337.4zM64.83 240.8c3.303-20.28 21.22-28.1 38.09-31.04c.9258 .2891 15.81 4.852 15.81 4.852c64.71 19.56 76.92 29.09 72.39 56.62c-3.291 20.2-21.12 28.07-37.93 31.04c-5.488-1.746-28.49-8.754-28.49-8.754C65.67 275.2 61.11 263.4 64.83 240.8z\"]\n};\nvar faSeedling = {\n  prefix: 'fas',\n  iconName: 'seedling',\n  icon: [512, 512, [127793, \"sprout\"], \"f4d8\", \"M64 95.1H0c0 123.8 100.3 224 224 224v128C224 465.6 238.4 480 255.1 480S288 465.6 288 448V320C288 196.3 187.7 95.1 64 95.1zM448 32c-84.25 0-157.4 46.5-195.8 115.3c27.75 30.12 48.25 66.88 59 107.5C424 243.1 512 147.9 512 32H448z\"]\n};\nvar faSprout = faSeedling;\nvar faServer = {\n  prefix: 'fas',\n  iconName: 'server',\n  icon: [512, 512, [], \"f233\", \"M480 288H32c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h448c17.62 0 32-14.38 32-32v-128C512 302.4 497.6 288 480 288zM352 408c-13.25 0-24-10.75-24-24s10.75-24 24-24s24 10.75 24 24S365.3 408 352 408zM416 408c-13.25 0-24-10.75-24-24s10.75-24 24-24s24 10.75 24 24S429.3 408 416 408zM480 32H32C14.38 32 0 46.38 0 64v128c0 17.62 14.38 32 32 32h448c17.62 0 32-14.38 32-32V64C512 46.38 497.6 32 480 32zM352 152c-13.25 0-24-10.75-24-24S338.8 104 352 104S376 114.8 376 128S365.3 152 352 152zM416 152c-13.25 0-24-10.75-24-24S402.8 104 416 104S440 114.8 440 128S429.3 152 416 152z\"]\n};\nvar faShapes = {\n  prefix: 'fas',\n  iconName: 'shapes',\n  icon: [512, 512, [\"triangle-circle-square\"], \"f61f\", \"M411.4 175.5C417.4 185.4 417.5 197.7 411.8 207.8C406.2 217.8 395.5 223.1 384 223.1H192C180.5 223.1 169.8 217.8 164.2 207.8C158.5 197.7 158.6 185.4 164.6 175.5L260.6 15.54C266.3 5.897 276.8 0 288 0C299.2 0 309.7 5.898 315.4 15.54L411.4 175.5zM288 312C288 289.9 305.9 272 328 272H472C494.1 272 512 289.9 512 312V456C512 478.1 494.1 496 472 496H328C305.9 496 288 478.1 288 456V312zM0 384C0 313.3 57.31 256 128 256C198.7 256 256 313.3 256 384C256 454.7 198.7 512 128 512C57.31 512 0 454.7 0 384z\"]\n};\nvar faTriangleCircleSquare = faShapes;\nvar faShare = {\n  prefix: 'fas',\n  iconName: 'share',\n  icon: [512, 512, [\"arrow-turn-right\", \"mail-forward\"], \"f064\", \"M503.7 226.2l-176 151.1c-15.38 13.3-39.69 2.545-39.69-18.16V272.1C132.9 274.3 66.06 312.8 111.4 457.8c5.031 16.09-14.41 28.56-28.06 18.62C39.59 444.6 0 383.8 0 322.3c0-152.2 127.4-184.4 288-186.3V56.02c0-20.67 24.28-31.46 39.69-18.16l176 151.1C514.8 199.4 514.8 216.6 503.7 226.2z\"]\n};\nvar faArrowTurnRight = faShare;\nvar faMailForward = faShare;\nvar faShareFromSquare = {\n  prefix: 'fas',\n  iconName: 'share-from-square',\n  icon: [576, 512, [61509, \"share-square\"], \"f14d\", \"M568.9 143.5l-150.9-138.2C404.8-6.773 384 3.039 384 21.84V96C241.2 97.63 128 126.1 128 260.6c0 54.3 35.2 108.1 74.08 136.2c12.14 8.781 29.42-2.238 24.94-16.46C186.7 252.2 256 224 384 223.1v74.2c0 18.82 20.84 28.59 34.02 16.51l150.9-138.2C578.4 167.8 578.4 152.2 568.9 143.5zM416 384c-17.67 0-32 14.33-32 32v31.1l-320-.0013V128h32c17.67 0 32-14.32 32-32S113.7 64 96 64H64C28.65 64 0 92.65 0 128v319.1c0 35.34 28.65 64 64 64l320-.0013c35.35 0 64-28.66 64-64V416C448 398.3 433.7 384 416 384z\"]\n};\nvar faShareSquare = faShareFromSquare;\nvar faShareNodes = {\n  prefix: 'fas',\n  iconName: 'share-nodes',\n  icon: [448, 512, [\"share-alt\"], \"f1e0\", \"M448 127.1C448 181 405 223.1 352 223.1C326.1 223.1 302.6 213.8 285.4 197.1L191.3 244.1C191.8 248 191.1 251.1 191.1 256C191.1 260 191.8 263.1 191.3 267.9L285.4 314.9C302.6 298.2 326.1 288 352 288C405 288 448 330.1 448 384C448 437 405 480 352 480C298.1 480 256 437 256 384C256 379.1 256.2 376 256.7 372.1L162.6 325.1C145.4 341.8 121.9 352 96 352C42.98 352 0 309 0 256C0 202.1 42.98 160 96 160C121.9 160 145.4 170.2 162.6 186.9L256.7 139.9C256.2 135.1 256 132 256 128C256 74.98 298.1 32 352 32C405 32 448 74.98 448 128L448 127.1zM95.1 287.1C113.7 287.1 127.1 273.7 127.1 255.1C127.1 238.3 113.7 223.1 95.1 223.1C78.33 223.1 63.1 238.3 63.1 255.1C63.1 273.7 78.33 287.1 95.1 287.1zM352 95.1C334.3 95.1 320 110.3 320 127.1C320 145.7 334.3 159.1 352 159.1C369.7 159.1 384 145.7 384 127.1C384 110.3 369.7 95.1 352 95.1zM352 416C369.7 416 384 401.7 384 384C384 366.3 369.7 352 352 352C334.3 352 320 366.3 320 384C320 401.7 334.3 416 352 416z\"]\n};\nvar faShareAlt = faShareNodes;\nvar faSheetPlastic = {\n  prefix: 'fas',\n  iconName: 'sheet-plastic',\n  icon: [384, 512, [], \"e571\", \"M0 64C0 28.65 28.65 0 64 0H320C355.3 0 384 28.65 384 64V352H256C238.3 352 224 366.3 224 384V512H64C28.65 512 0 483.3 0 448V64zM171.3 52.69C165.1 46.44 154.9 46.44 148.7 52.69L52.69 148.7C46.44 154.9 46.44 165.1 52.69 171.3C58.93 177.6 69.06 177.6 75.31 171.3L171.3 75.31C177.6 69.07 177.6 58.94 171.3 52.69V52.69zM267.3 107.3C273.6 101.1 273.6 90.93 267.3 84.69C261.1 78.44 250.9 78.44 244.7 84.69L84.69 244.7C78.44 250.9 78.44 261.1 84.69 267.3C90.93 273.6 101.1 273.6 107.3 267.3L267.3 107.3zM384 384L256 512V384H384z\"]\n};\nvar faShekelSign = {\n  prefix: 'fas',\n  iconName: 'shekel-sign',\n  icon: [448, 512, [8362, \"ils\", \"shekel\", \"sheqel\", \"sheqel-sign\"], \"f20b\", \"M192 32C262.7 32 320 89.31 320 160V320C320 337.7 305.7 352 288 352C270.3 352 256 337.7 256 320V160C256 124.7 227.3 96 192 96H64V448C64 465.7 49.67 480 32 480C14.33 480 0 465.7 0 448V64C0 46.33 14.33 32 32 32H192zM160 480C142.3 480 128 465.7 128 448V192C128 174.3 142.3 160 160 160C177.7 160 192 174.3 192 192V416H320C355.3 416 384 387.3 384 352V64C384 46.33 398.3 32 416 32C433.7 32 448 46.33 448 64V352C448 422.7 390.7 480 320 480H160z\"]\n};\nvar faIls = faShekelSign;\nvar faShekel = faShekelSign;\nvar faSheqel = faShekelSign;\nvar faSheqelSign = faShekelSign;\nvar faShield = {\n  prefix: 'fas',\n  iconName: 'shield',\n  icon: [512, 512, [128737, \"shield-blank\"], \"f132\", \"M256-.0078C260.7-.0081 265.2 1.008 269.4 2.913L457.7 82.79C479.7 92.12 496.2 113.8 496 139.1C495.5 239.2 454.7 420.7 282.4 503.2C265.7 511.1 246.3 511.1 229.6 503.2C57.25 420.7 16.49 239.2 15.1 139.1C15.87 113.8 32.32 92.12 54.3 82.79L242.7 2.913C246.8 1.008 251.4-.0081 256-.0078V-.0078z\"]\n};\nvar faShieldBlank = faShield;\nvar faShieldCat = {\n  prefix: 'fas',\n  iconName: 'shield-cat',\n  icon: [512, 512, [], \"e572\", \"M199.1 272C199.1 263.2 207.2 256 215.1 256C224.8 256 231.1 263.2 231.1 272C231.1 280.8 224.8 288 215.1 288C207.2 288 199.1 280.8 199.1 272zM312 272C312 280.8 304.8 288 296 288C287.2 288 280 280.8 280 272C280 263.2 287.2 256 296 256C304.8 256 312 263.2 312 272zM256.3-.0068C261.9-.0507 267.3 1.386 272.1 4.066L476.5 90.53C487.7 95.27 495.2 105.1 495.9 118.1C501.6 213.6 466.7 421.9 272.5 507.7C267.6 510.5 261.1 512.1 256.3 512C250.5 512.1 244.9 510.5 239.1 507.7C45.8 421.9 10.95 213.6 16.57 118.1C17.28 105.1 24.83 95.27 36.04 90.53L240.4 4.066C245.2 1.386 250.7-.0507 256.3-.0068H256.3zM223.1 208L159.1 144V272C159.1 325 202.1 368 255.1 368C309 368 352 325 352 272V144L288 208H223.1z\"]\n};\nvar faShieldDog = {\n  prefix: 'fas',\n  iconName: 'shield-dog',\n  icon: [512, 512, [], \"e573\", \"M288 208C288 216.8 280.8 224 272 224C263.2 224 255.1 216.8 255.1 208C255.1 199.2 263.2 192 272 192C280.8 192 288 199.2 288 208zM256.3-.0068C261.9-.0507 267.3 1.386 272.1 4.066L476.5 90.53C487.7 95.27 495.2 105.1 495.9 118.1C501.6 213.6 466.7 421.9 272.5 507.7C267.6 510.5 261.1 512.1 256.3 512C250.5 512.1 244.9 510.5 239.1 507.7C45.8 421.9 10.95 213.6 16.57 118.1C17.28 105.1 24.83 95.27 36.04 90.53L240.4 4.066C245.2 1.386 250.7-.0507 256.3-.0068H256.3zM160.9 286.2L143.1 320L272 384V320H320C364.2 320 400 284.2 400 240V208C400 199.2 392.8 192 384 192H320L312.8 177.7C307.4 166.8 296.3 160 284.2 160H239.1V224C239.1 259.3 211.3 288 175.1 288C170.8 288 165.7 287.4 160.9 286.2H160.9zM143.1 176V224C143.1 241.7 158.3 256 175.1 256C193.7 256 207.1 241.7 207.1 224V160H159.1C151.2 160 143.1 167.2 143.1 176z\"]\n};\nvar faShieldHalved = {\n  prefix: 'fas',\n  iconName: 'shield-halved',\n  icon: [512, 512, [\"shield-alt\"], \"f3ed\", \"M256-.0078C260.7-.0081 265.2 1.008 269.4 2.913L457.7 82.79C479.7 92.12 496.2 113.8 496 139.1C495.5 239.2 454.7 420.7 282.4 503.2C265.7 511.1 246.3 511.1 229.6 503.2C57.25 420.7 16.49 239.2 15.1 139.1C15.87 113.8 32.32 92.12 54.3 82.79L242.7 2.913C246.8 1.008 251.4-.0081 256-.0078V-.0078zM256 444.8C393.1 378 431.1 230.1 432 141.4L256 66.77L256 444.8z\"]\n};\nvar faShieldAlt = faShieldHalved;\nvar faShieldHeart = {\n  prefix: 'fas',\n  iconName: 'shield-heart',\n  icon: [512, 512, [], \"e574\", \"M256.3-.0068C261.9-.0507 267.3 1.386 272.1 4.066L476.5 90.53C487.7 95.27 495.2 105.1 495.9 118.1C501.6 213.6 466.7 421.9 272.5 507.7C267.6 510.5 261.1 512.1 256.3 512C250.5 512.1 244.9 510.5 239.1 507.7C45.8 421.9 10.95 213.6 16.57 118.1C17.28 105.1 24.83 95.27 36.04 90.53L240.4 4.066C245.2 1.386 250.7-.0507 256.3-.0068H256.3zM266.1 363.4L364.2 263.6C392.2 234.7 390.5 186.6 358.1 159.5C331.8 135.8 291.5 140.2 266.1 166.5L256.4 176.1L245.9 166.5C221.4 140.2 180.2 135.8 153 159.5C121.5 186.6 119.8 234.7 147.8 263.6L244.2 363.4C251.2 369.5 260.8 369.5 266.1 363.4V363.4z\"]\n};\nvar faShieldVirus = {\n  prefix: 'fas',\n  iconName: 'shield-virus',\n  icon: [512, 512, [], \"e06c\", \"M288 255.1c-8.836 0-16 7.162-16 16c0 8.836 7.164 15.1 16 15.1s16-7.163 16-15.1C304 263.2 296.8 255.1 288 255.1zM224 191.1c-8.836 0-16 7.162-16 16c0 8.836 7.164 16 15.1 16s16-7.164 16-16C240 199.2 232.8 191.1 224 191.1zM466.5 83.68l-192-80.01C269.6 1.641 261.3 0 256.1 0C250.7 0 242.5 1.641 237.6 3.672l-192 80.01C27.69 91.07 16 108.6 16 127.1C16 385.2 205.2 512 255.9 512c52.02 0 240.1-128.2 240.1-384C496 108.6 484.3 91.07 466.5 83.68zM384 255.1h-12.12c-19.29 0-32.06 15.78-32.06 32.23c0 7.862 2.918 15.88 9.436 22.4l8.576 8.576c3.125 3.125 4.688 7.218 4.688 11.31c0 8.527-6.865 15.1-16 15.1c-4.094 0-8.188-1.562-11.31-4.688l-8.576-8.576c-6.519-6.519-14.53-9.436-22.4-9.436c-16.45 0-32.23 12.77-32.23 32.06v12.12c0 8.844-7.156 16-16 16s-16-7.156-16-16v-12.12c0-19.29-15.78-32.06-32.23-32.06c-7.862 0-15.87 2.917-22.39 9.436l-8.576 8.576c-3.125 3.125-7.219 4.688-11.31 4.688c-9.139 0-16-7.473-16-15.1c0-4.094 1.562-8.187 4.688-11.31l8.576-8.576c6.519-6.519 9.436-14.53 9.436-22.4c0-16.45-12.77-32.23-32.06-32.23H128c-8.844 0-16-7.156-16-16s7.156-16 16-16h12.12c19.29 0 32.06-15.78 32.06-32.23c0-7.862-2.918-15.88-9.436-22.4L154.2 160.8C151 157.7 149.5 153.6 149.5 149.5c0-8.527 6.865-15.1 16-15.1c4.094 0 8.188 1.562 11.31 4.688L185.4 146.7C191.9 153.3 199.9 156.2 207.8 156.2c16.45 0 32.23-12.77 32.23-32.07V111.1c0-8.844 7.156-16 16-16s16 7.156 16 16v12.12c0 19.29 15.78 32.07 32.23 32.07c7.862 0 15.88-2.917 22.4-9.436l8.576-8.577c3.125-3.125 7.219-4.688 11.31-4.688c9.139 0 16 7.473 16 15.1c0 4.094-1.562 8.187-4.688 11.31l-8.576 8.577c-6.519 6.519-9.436 14.53-9.436 22.4c0 16.45 12.77 32.23 32.06 32.23h12.12c8.844 0 16 7.156 16 16S392.8 255.1 384 255.1z\"]\n};\nvar faShip = {\n  prefix: 'fas',\n  iconName: 'ship',\n  icon: [576, 512, [128674], \"f21a\", \"M192 32C192 14.33 206.3 0 224 0H352C369.7 0 384 14.33 384 32V64H432C458.5 64 480 85.49 480 112V240L524.4 254.8C547.6 262.5 553.9 292.3 535.9 308.7L434.9 401.4C418.7 410.7 400.2 416.5 384 416.5C364.4 416.5 343.2 408.8 324.8 396.1C302.8 380.6 273.3 380.6 251.2 396.1C234 407.9 213.2 416.5 192 416.5C175.8 416.5 157.3 410.7 141.1 401.3L40.09 308.7C22.1 292.3 28.45 262.5 51.59 254.8L96 239.1V111.1C96 85.49 117.5 63.1 144 63.1H192V32zM160 218.7L267.8 182.7C280.9 178.4 295.1 178.4 308.2 182.7L416 218.7V128H160V218.7zM384 448C410.9 448 439.4 437.2 461.4 421.9L461.5 421.9C473.4 413.4 489.5 414.1 500.7 423.6C515 435.5 533.2 444.6 551.3 448.8C568.5 452.8 579.2 470.1 575.2 487.3C571.2 504.5 553.1 515.2 536.7 511.2C512.2 505.4 491.9 494.6 478.5 486.2C449.5 501.7 417 512 384 512C352.1 512 323.4 502.1 303.6 493.1C297.7 490.5 292.5 487.8 288 485.4C283.5 487.8 278.3 490.5 272.4 493.1C252.6 502.1 223.9 512 192 512C158.1 512 126.5 501.7 97.5 486.2C84.12 494.6 63.79 505.4 39.27 511.2C22.06 515.2 4.853 504.5 .8422 487.3C-3.169 470.1 7.532 452.8 24.74 448.8C42.84 444.6 60.96 435.5 75.31 423.6C86.46 414.1 102.6 413.4 114.5 421.9L114.6 421.9C136.7 437.2 165.1 448 192 448C219.5 448 247 437.4 269.5 421.9C280.6 414 295.4 414 306.5 421.9C328.1 437.4 356.5 448 384 448H384z\"]\n};\nvar faShirt = {\n  prefix: 'fas',\n  iconName: 'shirt',\n  icon: [640, 512, [128085, \"t-shirt\", \"tshirt\"], \"f553\", \"M640 162.8c0 6.917-2.293 13.88-7.012 19.7l-49.96 61.63c-6.32 7.796-15.62 11.85-25.01 11.85c-7.01 0-14.07-2.262-19.97-6.919L480 203.3V464c0 26.51-21.49 48-48 48H208C181.5 512 160 490.5 160 464V203.3L101.1 249.1C96.05 253.7 88.99 255.1 81.98 255.1c-9.388 0-18.69-4.057-25.01-11.85L7.012 182.5C2.292 176.7-.0003 169.7-.0003 162.8c0-9.262 4.111-18.44 12.01-24.68l135-106.6C159.8 21.49 175.7 16 191.1 16H225.6C233.3 61.36 272.5 96 320 96s86.73-34.64 94.39-80h33.6c16.35 0 32.22 5.49 44.99 15.57l135 106.6C635.9 144.4 640 153.6 640 162.8z\"]\n};\nvar faTShirt = faShirt;\nvar faTshirt = faShirt;\nvar faShoePrints = {\n  prefix: 'fas',\n  iconName: 'shoe-prints',\n  icon: [640, 512, [], \"f54b\", \"M192 159.1L224 159.1V32L192 32c-35.38 0-64 28.62-64 63.1S156.6 159.1 192 159.1zM0 415.1c0 35.37 28.62 64.01 64 64.01l32-.0103v-127.1l-32-.0005C28.62 351.1 0 380.6 0 415.1zM337.5 287.1c-35 0-76.25 13.12-104.8 31.1C208 336.4 188.3 351.1 128 351.1v128l57.5 15.98c26.25 7.25 53 13.13 80.38 15.01c32.63 2.375 65.63 .743 97.5-6.132C472.9 481.2 512 429.2 512 383.1C512 319.1 427.9 287.1 337.5 287.1zM491.4 7.252c-31.88-6.875-64.88-8.625-97.5-6.25C366.5 2.877 339.8 8.752 313.5 16L256 32V159.1c60.25 0 80 15.62 104.8 31.1c28.5 18.87 69.75 31.1 104.8 31.1C555.9 223.1 640 191.1 640 127.1C640 82.75 600.9 30.75 491.4 7.252z\"]\n};\nvar faShop = {\n  prefix: 'fas',\n  iconName: 'shop',\n  icon: [640, 512, [\"store-alt\"], \"f54f\", \"M0 155.2C0 147.9 2.153 140.8 6.188 134.7L81.75 21.37C90.65 8.021 105.6 0 121.7 0H518.3C534.4 0 549.3 8.021 558.2 21.37L633.8 134.7C637.8 140.8 640 147.9 640 155.2C640 175.5 623.5 192 603.2 192H36.84C16.5 192 .0003 175.5 .0003 155.2H0zM64 224H128V384H320V224H384V464C384 490.5 362.5 512 336 512H112C85.49 512 64 490.5 64 464V224zM512 224H576V480C576 497.7 561.7 512 544 512C526.3 512 512 497.7 512 480V224z\"]\n};\nvar faStoreAlt = faShop;\nvar faShopLock = {\n  prefix: 'fas',\n  iconName: 'shop-lock',\n  icon: [640, 512, [], \"e4a5\", \"M0 155.2C0 147.9 2.153 140.8 6.188 134.7L81.75 21.37C90.65 8.021 105.6 0 121.7 0H518.3C534.4 0 549.3 8.021 558.2 21.37L633.8 134.7C637.8 140.8 640 147.9 640 155.2C640 174.5 625.2 190.3 606.3 191.9C586.1 172.2 558.5 160 528 160C497.5 160 469.8 172.2 449.6 192H36.84C16.5 192 .0003 175.5 .0003 155.2H0zM384 224V464C384 490.5 362.5 512 336 512H112C85.49 512 64 490.5 64 464V224H128V384H320V224H384zM528 192C572.2 192 608 227.8 608 272V320C625.7 320 640 334.3 640 352V480C640 497.7 625.7 512 608 512H448C430.3 512 416 497.7 416 480V352C416 334.3 430.3 320 448 320V272C448 227.8 483.8 192 528 192zM528 240C510.3 240 496 254.3 496 272V320H560V272C560 254.3 545.7 240 528 240z\"]\n};\nvar faShopSlash = {\n  prefix: 'fas',\n  iconName: 'shop-slash',\n  icon: [640, 512, [\"store-alt-slash\"], \"e070\", \"M74.13 32.8L81.75 21.38C90.65 8.022 105.6 .001 121.7 .001H518.3C534.4 .001 549.3 8.022 558.2 21.38L633.8 134.7C637.8 140.8 640 147.9 640 155.2C640 175.5 623.5 192 603.2 192H277.3L320 225.5V224H384V275.7L512 375.1V224H576V426.2L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L74.13 32.8zM0 155.2C0 147.9 2.153 140.8 6.188 134.7L20.98 112.5L121.8 192H36.84C16.5 192 .0003 175.5 .0003 155.2H0zM320 384V348.1L384 398.5V464C384 490.5 362.5 512 336 512H112C85.49 512 64 490.5 64 464V224H128V384H320z\"]\n};\nvar faStoreAltSlash = faShopSlash;\nvar faShower = {\n  prefix: 'fas',\n  iconName: 'shower',\n  icon: [512, 512, [128703], \"f2cc\", \"M288 384c-17.67 0-32 14.33-32 32c0 17.67 14.33 32 32 32s32-14.33 32-32C320 398.3 305.7 384 288 384zM416 256c-17.67 0-32 14.33-32 32c0 17.67 14.33 32 32 32s32-14.33 32-32C448 270.3 433.7 256 416 256zM480 192c-17.67 0-32 14.33-32 32c0 17.67 14.33 32 32 32s32-14.33 32-32C512 206.3 497.7 192 480 192zM288 320c0-17.67-14.33-32-32-32s-32 14.33-32 32c0 17.67 14.33 32 32 32S288 337.7 288 320zM320 224c-17.67 0-32 14.33-32 32c0 17.67 14.33 32 32 32s32-14.33 32-32C352 238.3 337.7 224 320 224zM384 224c17.67 0 32-14.33 32-32c0-17.67-14.33-32-32-32s-32 14.33-32 32C352 209.7 366.3 224 384 224zM352 320c-17.67 0-32 14.33-32 32c0 17.67 14.33 32 32 32s32-14.33 32-32C384 334.3 369.7 320 352 320zM347.3 91.31l-11.31-11.31c-6.248-6.248-16.38-6.248-22.63 0l-6.631 6.631c-35.15-26.29-81.81-29.16-119.6-8.779L170.5 61.25C132.2 22.95 63.65 18.33 21.98 71.16C7.027 90.11 0 114.3 0 138.4V464C0 472.8 7.164 480 16 480h32C56.84 480 64 472.8 64 464V131.9c0-19.78 16.09-35.87 35.88-35.87c9.438 0 18.69 3.828 25.38 10.5l16.61 16.61C121.5 160.9 124.3 207.6 150.6 242.7L144 249.4c-6.248 6.248-6.248 16.38 0 22.63l11.31 11.31c6.248 6.25 16.38 6.25 22.63 0l169.4-169.4C353.6 107.7 353.6 97.56 347.3 91.31z\"]\n};\nvar faShrimp = {\n  prefix: 'fas',\n  iconName: 'shrimp',\n  icon: [512, 512, [129424], \"e448\", \"M288 320V128H64C46.34 128 32 113.6 32 96s14.34-32 32-32h368c8.844 0 16-7.156 16-16s-7.156-16-16-16H64C28.72 32 0 60.7 0 96s28.72 64 64 64h2.879c15.26 90.77 94.01 160 189.1 160H288zM192 216c-13.25 0-24-10.75-24-24c0-13.26 10.75-24 24-24s24 10.74 24 24C216 205.3 205.3 216 192 216zM225.6 399.4c-4.75 12.36 1.406 26.25 13.78 31.02l5.688 2.188C233.3 434.1 224 443.8 224 456c0 13.25 10.75 24 24 24h72v-70.03l-63.38-24.38C244.3 380.9 230.4 386.1 225.6 399.4zM511.2 286.7c-.5488-5.754-2.201-11.1-3.314-16.65l-124.6 90.62c.3711 2.404 .7383 4.814 .7383 7.322c0 1.836-.3379 3.576-.5391 5.357l90.15 40.06C500.8 379.2 515.8 334.8 511.2 286.7zM352 413.1v66.08c37.23-3.363 71.04-18.3 97.94-41.21l-80.34-35.71C364.7 407.1 358.6 410.7 352 413.1zM497.9 237.7C470.1 172.4 402.8 128 328.4 128h-8.436v192h16c12.28 0 23.36 4.748 31.85 12.33L497.9 237.7z\"]\n};\nvar faShuffle = {\n  prefix: 'fas',\n  iconName: 'shuffle',\n  icon: [512, 512, [128256, \"random\"], \"f074\", \"M424.1 287c-15.13-15.12-40.1-4.426-40.1 16.97V352H336L153.6 108.8C147.6 100.8 138.1 96 128 96H32C14.31 96 0 110.3 0 128s14.31 32 32 32h80l182.4 243.2C300.4 411.3 309.9 416 320 416h63.97v47.94c0 21.39 25.86 32.12 40.99 17l79.1-79.98c9.387-9.387 9.387-24.59 0-33.97L424.1 287zM336 160h47.97v48.03c0 21.39 25.87 32.09 40.1 16.97l79.1-79.98c9.387-9.391 9.385-24.59-.0013-33.97l-79.1-79.98c-15.13-15.12-40.99-4.391-40.99 17V96H320c-10.06 0-19.56 4.75-25.59 12.81L254 162.7L293.1 216L336 160zM112 352H32c-17.69 0-32 14.31-32 32s14.31 32 32 32h96c10.06 0 19.56-4.75 25.59-12.81l40.4-53.87L154 296L112 352z\"]\n};\nvar faRandom = faShuffle;\nvar faShuttleSpace = {\n  prefix: 'fas',\n  iconName: 'shuttle-space',\n  icon: [640, 512, [\"space-shuttle\"], \"f197\", \"M129.1 480H128V384H352L245.2 448.1C210.4 468.1 170.6 480 129.1 480zM352 128H128V32H129.1C170.6 32 210.4 43.03 245.2 63.92L352 128zM104 128C130.2 128 153.4 140.6 168 160H456C525.3 160 591 182.7 635.2 241.6C641.6 250.1 641.6 261.9 635.2 270.4C591 329.3 525.3 352 456 352H168C153.4 371.4 130.2 384 104 384H96V480H80C53.49 480 32 458.5 32 432V384H40C17.91 384 0 366.1 0 344V168C0 145.9 17.89 128 39.96 128H32V80C32 53.49 53.49 32 80 32H96V128H104zM476.4 208C473.1 208 472 209.1 472 212.4V299.6C472 302 473.1 304 476.4 304C496.1 304 512 288.1 512 268.4V243.6C512 223.9 496.1 208 476.4 208z\"]\n};\nvar faSpaceShuttle = faShuttleSpace;\nvar faSignHanging = {\n  prefix: 'fas',\n  iconName: 'sign-hanging',\n  icon: [512, 512, [\"sign\"], \"f4d9\", \"M96 0C113.7 0 128 14.33 128 32V64H480C497.7 64 512 78.33 512 96C512 113.7 497.7 128 480 128H128V480C128 497.7 113.7 512 96 512C78.33 512 64 497.7 64 480V128H32C14.33 128 0 113.7 0 96C0 78.33 14.33 64 32 64H64V32C64 14.33 78.33 0 96 0zM448 160C465.7 160 480 174.3 480 192V352C480 369.7 465.7 384 448 384H192C174.3 384 160 369.7 160 352V192C160 174.3 174.3 160 192 160H448z\"]\n};\nvar faSign = faSignHanging;\nvar faSignal = {\n  prefix: 'fas',\n  iconName: 'signal',\n  icon: [576, 512, [128246, \"signal-5\", \"signal-perfect\"], \"f012\", \"M544 0c-17.67 0-32 14.33-32 31.1V480C512 497.7 526.3 512 544 512s32-14.33 32-31.1V31.1C576 14.33 561.7 0 544 0zM160 288C142.3 288 128 302.3 128 319.1v160C128 497.7 142.3 512 160 512s32-14.33 32-31.1V319.1C192 302.3 177.7 288 160 288zM32 384C14.33 384 0 398.3 0 415.1v64C0 497.7 14.33 512 31.1 512S64 497.7 64 480V415.1C64 398.3 49.67 384 32 384zM416 96c-17.67 0-32 14.33-32 31.1V480C384 497.7 398.3 512 416 512s32-14.33 32-31.1V127.1C448 110.3 433.7 96 416 96zM288 192C270.3 192 256 206.3 256 223.1v256C256 497.7 270.3 512 288 512s32-14.33 32-31.1V223.1C320 206.3 305.7 192 288 192z\"]\n};\nvar faSignal5 = faSignal;\nvar faSignalPerfect = faSignal;\nvar faSignature = {\n  prefix: 'fas',\n  iconName: 'signature',\n  icon: [640, 512, [], \"f5b7\", \"M192 160C192 177.7 177.7 192 160 192C142.3 192 128 177.7 128 160V128C128 74.98 170.1 32 224 32C277 32 320 74.98 320 128V135.8C320 156.6 318.8 177.4 316.4 198.1L438.8 161.3C450.2 157.9 462.6 161.1 470.1 169.7C479.3 178.3 482.1 190.8 478.4 202.1L460.4 255.1H544C561.7 255.1 576 270.3 576 287.1C576 305.7 561.7 319.1 544 319.1H416C405.7 319.1 396.1 315.1 390 306.7C384 298.4 382.4 287.6 385.6 277.9L398.1 240.4L303.7 268.7C291.9 321.5 272.2 372.2 245.3 419.2L231.4 443.5C218.5 466.1 194.5 480 168.5 480C128.5 480 95.1 447.5 95.1 407.5V335.6C95.1 293.2 123.8 255.8 164.4 243.7L248.8 218.3C253.6 191.1 255.1 163.5 255.1 135.8V128C255.1 110.3 241.7 96 223.1 96C206.3 96 191.1 110.3 191.1 128L192 160zM160 335.6V407.5C160 412.2 163.8 416 168.5 416C171.5 416 174.4 414.4 175.9 411.7L189.8 387.4C207.3 356.6 221.4 324.1 231.8 290.3L182.8 304.1C169.3 309 160 321.5 160 335.6V335.6zM24 368H64V407.5C64 410.4 64.11 413.2 64.34 416H24C10.75 416 0 405.3 0 392C0 378.7 10.75 368 24 368zM616 416H283.5C291.7 400.3 299.2 384.3 305.9 368H616C629.3 368 640 378.7 640 392C640 405.3 629.3 416 616 416z\"]\n};\nvar faSignsPost = {\n  prefix: 'fas',\n  iconName: 'signs-post',\n  icon: [512, 512, [\"map-signs\"], \"f277\", \"M223.1 32C223.1 14.33 238.3 0 255.1 0C273.7 0 288 14.33 288 32H441.4C445.6 32 449.7 33.69 452.7 36.69L500.7 84.69C506.9 90.93 506.9 101.1 500.7 107.3L452.7 155.3C449.7 158.3 445.6 160 441.4 160H63.1C46.33 160 31.1 145.7 31.1 128V64C31.1 46.33 46.33 32 63.1 32L223.1 32zM480 320C480 337.7 465.7 352 448 352H70.63C66.38 352 62.31 350.3 59.31 347.3L11.31 299.3C5.065 293.1 5.065 282.9 11.31 276.7L59.31 228.7C62.31 225.7 66.38 223.1 70.63 223.1H223.1V191.1H288V223.1H448C465.7 223.1 480 238.3 480 255.1V320zM255.1 512C238.3 512 223.1 497.7 223.1 480V384H288V480C288 497.7 273.7 512 255.1 512z\"]\n};\nvar faMapSigns = faSignsPost;\nvar faSimCard = {\n  prefix: 'fas',\n  iconName: 'sim-card',\n  icon: [384, 512, [], \"f7c4\", \"M0 64v384c0 35.25 28.75 64 64 64h256c35.25 0 64-28.75 64-64V128l-128-128H64C28.75 0 0 28.75 0 64zM224 256H160V192h64V256zM320 256h-64V192h32c17.75 0 32 14.25 32 32V256zM256 384h64v32c0 17.75-14.25 32-32 32h-32V384zM160 384h64v64H160V384zM64 384h64v64H96c-17.75 0-32-14.25-32-32V384zM64 288h256v64H64V288zM64 224c0-17.75 14.25-32 32-32h32v64H64V224z\"]\n};\nvar faSink = {\n  prefix: 'fas',\n  iconName: 'sink',\n  icon: [512, 512, [], \"e06d\", \"M496 288h-96V256l64 .0002c8.838 0 16-7.164 16-15.1v-15.1c0-8.838-7.162-16-16-16L384 208c-17.67 0-32 14.33-32 32v47.1l-64 .0005v-192c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16v-16c0-59.2-53.85-106-115.1-94.14C255.3 10.71 224 53.36 224 99.79v188.2L160 288V240c0-17.67-14.33-32-32-32L48 208c-8.836 0-16 7.162-16 16v15.1C32 248.8 39.16 256 48 256l64-.0002V288h-96c-8.836 0-16 7.164-16 16v32c0 8.836 7.164 16 16 16h480c8.836 0 16-7.164 16-16V304C512 295.2 504.8 288 496 288zM32 416c0 53.02 42.98 96 96 96h256c53.02 0 96-42.98 96-96v-32H32V416z\"]\n};\nvar faSitemap = {\n  prefix: 'fas',\n  iconName: 'sitemap',\n  icon: [576, 512, [], \"f0e8\", \"M208 80C208 53.49 229.5 32 256 32H320C346.5 32 368 53.49 368 80V144C368 170.5 346.5 192 320 192H312V232H464C494.9 232 520 257.1 520 288V320H528C554.5 320 576 341.5 576 368V432C576 458.5 554.5 480 528 480H464C437.5 480 416 458.5 416 432V368C416 341.5 437.5 320 464 320H472V288C472 283.6 468.4 280 464 280H312V320H320C346.5 320 368 341.5 368 368V432C368 458.5 346.5 480 320 480H256C229.5 480 208 458.5 208 432V368C208 341.5 229.5 320 256 320H264V280H112C107.6 280 104 283.6 104 288V320H112C138.5 320 160 341.5 160 368V432C160 458.5 138.5 480 112 480H48C21.49 480 0 458.5 0 432V368C0 341.5 21.49 320 48 320H56V288C56 257.1 81.07 232 112 232H264V192H256C229.5 192 208 170.5 208 144V80z\"]\n};\nvar faSkull = {\n  prefix: 'fas',\n  iconName: 'skull',\n  icon: [512, 512, [128128], \"f54c\", \"M416 400V464C416 490.5 394.5 512 368 512H320V464C320 455.2 312.8 448 304 448C295.2 448 288 455.2 288 464V512H224V464C224 455.2 216.8 448 208 448C199.2 448 192 455.2 192 464V512H144C117.5 512 96 490.5 96 464V400C96 399.6 96 399.3 96.01 398.9C37.48 357.8 0 294.7 0 224C0 100.3 114.6 0 256 0C397.4 0 512 100.3 512 224C512 294.7 474.5 357.8 415.1 398.9C415.1 399.3 416 399.6 416 400V400zM160 192C124.7 192 96 220.7 96 256C96 291.3 124.7 320 160 320C195.3 320 224 291.3 224 256C224 220.7 195.3 192 160 192zM352 320C387.3 320 416 291.3 416 256C416 220.7 387.3 192 352 192C316.7 192 288 220.7 288 256C288 291.3 316.7 320 352 320z\"]\n};\nvar faSkullCrossbones = {\n  prefix: 'fas',\n  iconName: 'skull-crossbones',\n  icon: [448, 512, [128369, 9760], \"f714\", \"M368 128C368 172.4 342.6 211.5 304 234.4V256C304 273.7 289.7 288 272 288H175.1C158.3 288 143.1 273.7 143.1 256V234.4C105.4 211.5 79.1 172.4 79.1 128C79.1 57.31 144.5 0 223.1 0C303.5 0 368 57.31 368 128V128zM167.1 176C185.7 176 199.1 161.7 199.1 144C199.1 126.3 185.7 112 167.1 112C150.3 112 135.1 126.3 135.1 144C135.1 161.7 150.3 176 167.1 176zM280 112C262.3 112 248 126.3 248 144C248 161.7 262.3 176 280 176C297.7 176 312 161.7 312 144C312 126.3 297.7 112 280 112zM3.378 273.7C11.28 257.9 30.5 251.5 46.31 259.4L223.1 348.2L401.7 259.4C417.5 251.5 436.7 257.9 444.6 273.7C452.5 289.5 446.1 308.7 430.3 316.6L295.6 384L430.3 451.4C446.1 459.3 452.5 478.5 444.6 494.3C436.7 510.1 417.5 516.5 401.7 508.6L223.1 419.8L46.31 508.6C30.5 516.5 11.28 510.1 3.378 494.3C-4.526 478.5 1.881 459.3 17.69 451.4L152.4 384L17.69 316.6C1.881 308.7-4.526 289.5 3.378 273.7V273.7z\"]\n};\nvar faSlash = {\n  prefix: 'fas',\n  iconName: 'slash',\n  icon: [640, 512, [], \"f715\", \"M5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196V9.196z\"]\n};\nvar faSleigh = {\n  prefix: 'fas',\n  iconName: 'sleigh',\n  icon: [640, 512, [], \"f7cc\", \"M63.1 32C66.31 32 68.56 32.24 70.74 32.71C124.1 37.61 174.2 67.59 203.4 114.3L207.7 121.1C247.7 185.1 317.8 224 393.3 224C423.5 224 448 199.5 448 169.3V128C448 110.3 462.3 96 480 96H544C561.7 96 576 110.3 576 128C576 145.7 561.7 160 544 160V256C544 309 501 352 448 352V384H384V352H192V384H128V352C74.98 352 32 309 32 256V96C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H63.1zM640 392C640 440.6 600.6 480 552 480H63.1C46.33 480 31.1 465.7 31.1 448C31.1 430.3 46.33 416 63.1 416H552C565.3 416 576 405.3 576 392V384C576 366.3 590.3 352 608 352C625.7 352 640 366.3 640 384V392z\"]\n};\nvar faSliders = {\n  prefix: 'fas',\n  iconName: 'sliders',\n  icon: [512, 512, [\"sliders-h\"], \"f1de\", \"M0 416C0 398.3 14.33 384 32 384H86.66C99 355.7 127.2 336 160 336C192.8 336 220.1 355.7 233.3 384H480C497.7 384 512 398.3 512 416C512 433.7 497.7 448 480 448H233.3C220.1 476.3 192.8 496 160 496C127.2 496 99 476.3 86.66 448H32C14.33 448 0 433.7 0 416V416zM192 416C192 398.3 177.7 384 160 384C142.3 384 128 398.3 128 416C128 433.7 142.3 448 160 448C177.7 448 192 433.7 192 416zM352 176C384.8 176 412.1 195.7 425.3 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H425.3C412.1 316.3 384.8 336 352 336C319.2 336 291 316.3 278.7 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H278.7C291 195.7 319.2 176 352 176zM384 256C384 238.3 369.7 224 352 224C334.3 224 320 238.3 320 256C320 273.7 334.3 288 352 288C369.7 288 384 273.7 384 256zM480 64C497.7 64 512 78.33 512 96C512 113.7 497.7 128 480 128H265.3C252.1 156.3 224.8 176 192 176C159.2 176 131 156.3 118.7 128H32C14.33 128 0 113.7 0 96C0 78.33 14.33 64 32 64H118.7C131 35.75 159.2 16 192 16C224.8 16 252.1 35.75 265.3 64H480zM160 96C160 113.7 174.3 128 192 128C209.7 128 224 113.7 224 96C224 78.33 209.7 64 192 64C174.3 64 160 78.33 160 96z\"]\n};\nvar faSlidersH = faSliders;\nvar faSmog = {\n  prefix: 'fas',\n  iconName: 'smog',\n  icon: [640, 512, [], \"f75f\", \"M144 288h156.1C322.6 307.8 351.8 320 384 320s61.25-12.25 83.88-32H528C589.9 288 640 237.9 640 176s-50.13-112-112-112c-18 0-34.75 4.625-49.75 12.12C453.1 30.1 406.8 0 352 0c-41 0-77.75 17.25-104 44.75C221.8 17.25 185 0 144 0c-79.5 0-144 64.5-144 144S64.5 288 144 288zM136 464H23.1C10.8 464 0 474.8 0 487.1S10.8 512 23.1 512H136C149.2 512 160 501.2 160 488S149.2 464 136 464zM616 368h-528C74.8 368 64 378.8 64 391.1S74.8 416 87.1 416h528c13.2 0 24-10.8 24-23.1S629.2 368 616 368zM552 464H231.1C218.8 464 208 474.8 208 487.1S218.8 512 231.1 512H552c13.2 0 24-10.8 24-23.1S565.2 464 552 464z\"]\n};\nvar faSmoking = {\n  prefix: 'fas',\n  iconName: 'smoking',\n  icon: [640, 512, [128684], \"f48d\", \"M432 352h-384C21.5 352 0 373.5 0 400v64C0 490.5 21.5 512 48 512h384c8.75 0 16-7.25 16-16v-128C448 359.3 440.8 352 432 352zM400 464H224v-64h176V464zM536 352h-48C483.6 352 480 355.6 480 360v144c0 4.375 3.625 8 8 8h48c4.375 0 8-3.625 8-8v-144C544 355.6 540.4 352 536 352zM632 352h-48C579.6 352 576 355.6 576 360v144c0 4.375 3.625 8 8 8h48c4.375 0 8-3.625 8-8v-144C640 355.6 636.4 352 632 352zM553.3 87.13C547.6 83.25 544 77.12 544 70.25V8C544 3.625 540.4 0 536 0h-48C483.6 0 480 3.625 480 8v62.25c0 22 10.25 43.5 28.62 55.5C550.8 153 576 199.5 576 249.8V280C576 284.4 579.6 288 584 288h48C636.4 288 640 284.4 640 280V249.8C640 184.3 607.6 123.5 553.3 87.13zM487.8 141.6C463.8 125 448 99.25 448 70.25V8C448 3.625 444.4 0 440 0h-48C387.6 0 384 3.625 384 8v66.38C384 118.1 408.6 156 444.3 181.1C466.8 196.8 480 222.3 480 249.8V280C480 284.4 483.6 288 488 288h48C540.4 288 544 284.4 544 280V249.8C544 206.4 523 166.3 487.8 141.6z\"]\n};\nvar faSnowflake = {\n  prefix: 'fas',\n  iconName: 'snowflake',\n  icon: [512, 512, [10054, 10052], \"f2dc\", \"M475.6 384.1C469.7 394.3 458.9 400 447.9 400c-5.488 0-11.04-1.406-16.13-4.375l-25.09-14.64l5.379 20.29c3.393 12.81-4.256 25.97-17.08 29.34c-2.064 .5625-4.129 .8125-6.164 .8125c-10.63 0-20.36-7.094-23.21-17.84l-17.74-66.92L288 311.7l.0002 70.5l48.38 48.88c9.338 9.438 9.244 24.62-.1875 33.94C331.5 469.7 325.4 472 319.3 472c-6.193 0-12.39-2.375-17.08-7.125l-14.22-14.37L288 480c0 17.69-14.34 32-32.03 32s-32.03-14.31-32.03-32l-.0002-29.5l-14.22 14.37c-9.322 9.438-24.53 9.5-33.97 .1875c-9.432-9.312-9.525-24.5-.1875-33.94l48.38-48.88L223.1 311.7l-59.87 34.93l-17.74 66.92c-2.848 10.75-12.58 17.84-23.21 17.84c-2.035 0-4.1-.25-6.164-.8125c-12.82-3.375-20.47-16.53-17.08-29.34l5.379-20.29l-25.09 14.64C75.11 398.6 69.56 400 64.07 400c-11.01 0-21.74-5.688-27.69-15.88c-8.932-15.25-3.785-34.84 11.5-43.75l25.96-15.15l-20.33-5.508C40.7 316.3 33.15 303.1 36.62 290.3S53.23 270 66.09 273.4L132 291.3L192.5 256L132 220.7L66.09 238.6c-2.111 .5625-4.225 .8438-6.305 .8438c-10.57 0-20.27-7.031-23.16-17.72C33.15 208.9 40.7 195.8 53.51 192.3l20.33-5.508L47.88 171.6c-15.28-8.906-20.43-28.5-11.5-43.75c8.885-15.28 28.5-20.44 43.81-11.5l25.09 14.64L99.9 110.7C96.51 97.91 104.2 84.75 116.1 81.38C129.9 77.91 142.1 85.63 146.4 98.41l17.74 66.92L223.1 200.3l-.0002-70.5L175.6 80.88C166.3 71.44 166.3 56.25 175.8 46.94C185.2 37.59 200.4 37.72 209.8 47.13l14.22 14.37L223.1 32c0-17.69 14.34-32 32.03-32s32.03 14.31 32.03 32l.0002 29.5l14.22-14.37c9.307-9.406 24.51-9.531 33.97-.1875c9.432 9.312 9.525 24.5 .1875 33.94l-48.38 48.88L288 200.3l59.87-34.93l17.74-66.92c3.395-12.78 16.56-20.5 29.38-17.03c12.82 3.375 20.47 16.53 17.08 29.34l-5.379 20.29l25.09-14.64c15.28-8.906 34.91-3.75 43.81 11.5c8.932 15.25 3.785 34.84-11.5 43.75l-25.96 15.15l20.33 5.508c12.81 3.469 20.37 16.66 16.89 29.44c-2.895 10.69-12.59 17.72-23.16 17.72c-2.08 0-4.193-.2813-6.305-.8438L379.1 220.7L319.5 256l60.46 35.28l65.95-17.87C458.8 270 471.9 277.5 475.4 290.3c3.473 12.78-4.082 25.97-16.89 29.44l-20.33 5.508l25.96 15.15C479.4 349.3 484.5 368.9 475.6 384.1z\"]\n};\nvar faSnowman = {\n  prefix: 'fas',\n  iconName: 'snowman',\n  icon: [512, 512, [9924, 9731], \"f7d0\", \"M510.9 152.3l-5.875-14.5c-3.25-8-12.62-11.88-20.75-8.625l-28.25 11.5v-29C455.1 103 448.7 96 439.1 96h-16c-8.75 0-16 7-16 15.62V158.5c0 .5 .25 1 .25 1.5l-48.98 20.6c-5.291-12.57-12.98-23.81-22.24-33.55c9.35-14.81 14.98-32.23 14.98-51.04C351.1 42.98 309 0 255.1 0S160 42.98 160 95.1c0 18.81 5.626 36.23 14.98 51.04C165.7 156.8 158.1 168.1 152.8 180.7L103.8 160c0-.5 .25-1 .25-1.5V111.6C104 103 96.76 96 88.01 96h-16c-8.75 0-16 7-16 15.62v29l-28.25-11.5c-8.125-3.25-17.5 .625-20.75 8.625l-5.875 14.5C-2.119 160.4 1.881 169.5 10.01 172.6L144.4 228.4C144.9 240.8 147.3 252.7 151.5 263.7c-33.78 29.34-55.53 72.04-55.53 120.3c0 52.59 25.71 98.84 64.88 128h190.2c39.17-29.17 64.88-75.42 64.88-128c0-48.25-21.76-90.95-55.53-120.3c4.195-11.03 6.599-22.89 7.091-35.27l134.4-55.8C510.1 169.5 514.1 160.4 510.9 152.3zM224 95.1c-8.75 0-15.1-7.25-15.1-15.1s7.25-15.1 15.1-15.1s15.1 7.25 15.1 15.1S232.8 95.1 224 95.1zM256 367.1c-8.75 0-15.1-7.25-15.1-15.1S247.3 335.1 256 335.1s15.1 7.25 15.1 15.1S264.8 367.1 256 367.1zM256 303.1c-8.75 0-15.1-7.25-15.1-15.1S247.3 271.1 256 271.1s15.1 7.25 15.1 15.1S264.8 303.1 256 303.1zM256 239.1c-8.75 0-15.1-7.25-15.1-15.1S247.3 207.1 256 207.1s15.1 7.25 15.1 15.1S264.8 239.1 256 239.1zM256 152c0 0-15.1-23.25-15.1-32S247.3 104 256 104s15.1 7.25 15.1 16S256 152 256 152zM287.1 95.1c-8.75 0-15.1-7.25-15.1-15.1s7.25-15.1 15.1-15.1s15.1 7.25 15.1 15.1S296.7 95.1 287.1 95.1z\"]\n};\nvar faSnowplow = {\n  prefix: 'fas',\n  iconName: 'snowplow',\n  icon: [640, 512, [], \"f7d2\", \"M144 400C144 413.3 133.3 424 120 424C106.7 424 96 413.3 96 400C96 386.7 106.7 376 120 376C133.3 376 144 386.7 144 400zM336 400C336 386.7 346.7 376 360 376C373.3 376 384 386.7 384 400C384 413.3 373.3 424 360 424C346.7 424 336 413.3 336 400zM304 400C304 413.3 293.3 424 280 424C266.7 424 256 413.3 256 400C256 386.7 266.7 376 280 376C293.3 376 304 386.7 304 400zM176 400C176 386.7 186.7 376 200 376C213.3 376 224 386.7 224 400C224 413.3 213.3 424 200 424C186.7 424 176 413.3 176 400zM447.4 249.6C447.8 251.9 448.1 254.3 448 256.7V288H512V235.2C512 220.7 516.9 206.6 526 195.2L583 124C594.1 110.2 614.2 107.1 627.1 119C641.8 130.1 644 150.2 632.1 163.1L576 235.2V402.7L630.6 457.4C643.1 469.9 643.1 490.1 630.6 502.6C618.1 515.1 597.9 515.1 585.4 502.6L530.7 448C518.7 435.1 512 419.7 512 402.7V352H469.2C476.1 366.5 480 382.8 480 400C480 461.9 429.9 512 368 512H112C50.14 512 0 461.9 0 400C0 355.3 26.16 316.8 64 298.8V192C64 174.3 78.33 160 96 160H128V48C128 21.49 149.5 0 176 0H298.9C324.5 0 347.6 15.26 357.7 38.79L445.1 242.7C446.1 244.9 446.9 247.2 447.4 249.6H447.4zM298.9 64H192V160L256 224H367.5L298.9 64zM368 352H112C85.49 352 64 373.5 64 400C64 426.5 85.49 448 112 448H368C394.5 448 416 426.5 416 400C416 373.5 394.5 352 368 352z\"]\n};\nvar faSoap = {\n  prefix: 'fas',\n  iconName: 'soap',\n  icon: [512, 512, [129532], \"e06e\", \"M320 256c35.35 0 64-28.65 64-64c0-35.35-28.65-64-64-64s-64 28.65-64 64C256 227.3 284.7 256 320 256zM160 288c-35.35 0-64 28.65-64 64c0 35.35 28.65 64 64 64h192c35.35 0 64-28.65 64-64c0-35.35-28.65-64-64-64H160zM384 64c17.67 0 32-14.33 32-32c0-17.67-14.33-32-32-32s-32 14.33-32 32C352 49.67 366.3 64 384 64zM208 96C234.5 96 256 74.51 256 48S234.5 0 208 0S160 21.49 160 48S181.5 96 208 96zM416 192c0 27.82-12.02 52.68-30.94 70.21C421.7 275.7 448 310.7 448 352c0 53.02-42.98 96-96 96H160c-53.02 0-96-42.98-96-96s42.98-96 96-96h88.91C233.6 238.1 224 216.7 224 192H96C42.98 192 0 234.1 0 288v128c0 53.02 42.98 96 96 96h320c53.02 0 96-42.98 96-96V288C512 234.1 469 192 416 192z\"]\n};\nvar faSocks = {\n  prefix: 'fas',\n  iconName: 'socks',\n  icon: [576, 512, [129510], \"f696\", \"M319.1 32c0-11 3.125-21.25 8-30.38C325.4 .8721 322.9 0 319.1 0H192C174.4 0 159.1 14.38 159.1 32l.0042 32h160L319.1 32zM246.6 310.1l73.36-55l.0026-159.1h-160l-.0042 175.1l-86.64 64.61c-39.38 29.5-53.86 84.4-29.24 127c18.25 31.62 51.1 48.36 83.97 48.36c20 0 40.26-6.225 57.51-19.22l21.87-16.38C177.6 421 193.9 350.6 246.6 310.1zM351.1 271.1l-86.13 64.61c-39.37 29.5-53.86 84.4-29.23 127C254.9 495.3 287.2 512 320.1 512c20 0 40.25-6.25 57.5-19.25l115.2-86.38C525 382.3 544 344.2 544 303.1v-207.1h-192L351.1 271.1zM512 0h-128c-17.62 0-32 14.38-32 32l-.0003 32H544V32C544 14.38 529.6 0 512 0z\"]\n};\nvar faSolarPanel = {\n  prefix: 'fas',\n  iconName: 'solar-panel',\n  icon: [640, 512, [], \"f5ba\", \"M575.4 25.72C572.4 10.78 559.2 0 543.1 0H96c-15.25 0-28.39 10.78-31.38 25.72l-63.1 320c-1.891 9.406 .5469 19.16 6.625 26.56S22.41 384 32 384h255.1v64.25H239.8c-26.26 0-47.75 21.49-47.75 47.75c0 8.844 7.168 16.01 16.01 16l223.1-.1667c8.828-.0098 15.99-7.17 15.99-16C447.1 469.5 426.6 448 400.2 448h-48.28v-64h256c9.594 0 18.67-4.312 24.75-11.72s8.516-17.16 6.625-26.56L575.4 25.72zM517.8 64l19.2 96h-97.98L429.2 64H517.8zM380.1 64l9.617 96H250l9.873-96H380.1zM210.8 64L201 160H103.1l19.18-96H210.8zM71.16 320l22.28-112h102.7L184.6 320H71.16zM233.8 320l11.37-112h149.7L406.2 320H233.8zM455.4 320l-11.5-112h102.7l22.28 112H455.4z\"]\n};\nvar faSort = {\n  prefix: 'fas',\n  iconName: 'sort',\n  icon: [320, 512, [\"unsorted\"], \"f0dc\", \"M27.66 224h264.7c24.6 0 36.89-29.78 19.54-47.12l-132.3-136.8c-5.406-5.406-12.47-8.107-19.53-8.107c-7.055 0-14.09 2.701-19.45 8.107L8.119 176.9C-9.229 194.2 3.055 224 27.66 224zM292.3 288H27.66c-24.6 0-36.89 29.77-19.54 47.12l132.5 136.8C145.9 477.3 152.1 480 160 480c7.053 0 14.12-2.703 19.53-8.109l132.3-136.8C329.2 317.8 316.9 288 292.3 288z\"]\n};\nvar faUnsorted = faSort;\nvar faSortDown = {\n  prefix: 'fas',\n  iconName: 'sort-down',\n  icon: [320, 512, [\"sort-desc\"], \"f0dd\", \"M311.9 335.1l-132.4 136.8C174.1 477.3 167.1 480 160 480c-7.055 0-14.12-2.702-19.47-8.109l-132.4-136.8C-9.229 317.8 3.055 288 27.66 288h264.7C316.9 288 329.2 317.8 311.9 335.1z\"]\n};\nvar faSortDesc = faSortDown;\nvar faSortUp = {\n  prefix: 'fas',\n  iconName: 'sort-up',\n  icon: [320, 512, [\"sort-asc\"], \"f0de\", \"M27.66 224h264.7c24.6 0 36.89-29.78 19.54-47.12l-132.3-136.8c-5.406-5.406-12.47-8.107-19.53-8.107c-7.055 0-14.09 2.701-19.45 8.107L8.119 176.9C-9.229 194.2 3.055 224 27.66 224z\"]\n};\nvar faSortAsc = faSortUp;\nvar faSpa = {\n  prefix: 'fas',\n  iconName: 'spa',\n  icon: [576, 512, [], \"f5bb\", \"M568.3 192c-29 .125-135 6.124-213.9 82.1C321.2 304.7 301 338.3 288 369.9c-13-31.63-33.25-65.25-66.38-94.87C142.8 198.2 36.75 192.2 7.75 192C3.375 192 0 195.4 0 199.9c.25 27.88 7.125 126.2 88.75 199.3C172.8 481 256 479.1 288 479.1s115.2 1.025 199.3-80.85C568.9 326 575.8 227.7 576 199.9C576 195.4 572.6 192 568.3 192zM288 302.6c12.75-18.87 27.62-35.75 44.13-50.5c19-18.62 39.5-33.37 60.25-45.25c-16.5-70.5-51.75-133-96.75-172.3c-4.125-3.5-11-3.5-15.12 0c-45 39.25-80.25 101.6-96.75 172.1c20.37 11.75 40.5 26.12 59.25 44.37C260 266.4 275.1 283.7 288 302.6z\"]\n};\nvar faSpaghettiMonsterFlying = {\n  prefix: 'fas',\n  iconName: 'spaghetti-monster-flying',\n  icon: [640, 512, [\"pastafarianism\"], \"f67b\", \"M624.5 347.7c-32.63-12.5-57.38 4.241-75.38 16.49c-17 11.5-23.25 14.37-31.38 11.37c-8.125-3.125-10.88-9.358-15.88-29.36c-3.375-13.12-7.5-29.47-18-42.72c2.25-3 4.5-5.875 6.375-8.625C500.5 304.5 513.8 312 532 312c33.1 0 50.87-25.75 61.1-42.88C604.6 253 609 248 616 248C629.3 248 640 237.3 640 224s-10.75-24-24-24c-34 0-50.88 25.75-62 42.88C543.4 259 539 264 532 264c-17.25 0-37.5-61.38-97.25-101.9L452 127.6C485.4 125.5 512 97.97 512 63.97C512 28.6 483.4 0 448 0s-64 28.6-64 63.97c0 13 4 25.15 10.62 35.28L376.5 135.5C359.5 130.9 340.9 128 320 128S280.5 130.9 263.5 135.5L245.4 99.25C252 89.13 256 76.97 256 63.97C256 28.6 227.4 0 192 0S128 28.6 128 63.97C128 97.97 154.5 125.5 188 127.6l17.25 34.5C145.6 202.5 125.1 264 108 264c-7 0-11.31-5-21.94-21.12C74.94 225.8 57.1 200 24 200C10.75 200 0 210.8 0 224s10.75 24 24 24c7 0 11.37 5 21.1 21.12C57.12 286.3 73.1 312 108 312c18.25 0 31.5-7.5 41.75-17.12C151.6 297.6 153.9 300.5 156.1 303.5c-10.5 13.25-14.62 29.59-18 42.72c-5 20-7.75 26.23-15.88 29.36c-8.125 3-14.37 .1314-31.37-11.37c-18.12-12.25-42.75-28.87-75.38-16.49c-12.38 4.75-18.62 18.61-13.88 30.98c4.625 12.38 18.62 18.62 30.88 13.87C40.75 389.6 46.88 392.4 64 403.9c13.5 9.125 30.75 20.86 52.38 20.86c7.125 0 14.88-1.248 23-4.373c32.63-12.5 40-41.34 45.25-62.46c2.25-8.75 4-14.49 6-18.86c16.62 13.62 37 25.86 61.63 34.23C242.3 410.3 220.1 464 192 464c-13.25 0-24 10.74-24 23.99S178.8 512 192 512c66.75 0 97-88.55 107.4-129.1C306.1 383.6 312.9 384 320 384s13.88-.4706 20.62-1.096C351 423.4 381.3 512 448 512c13.25 0 24-10.74 24-23.99S461.3 464 448 464c-28 0-50.25-53.74-60.25-90.74c24.75-8.375 45-20.56 61.63-34.19c2 4.375 3.75 10.11 6 18.86c5.375 21.12 12.62 49.96 45.25 62.46c8.25 3.125 15.88 4.373 23 4.373c21.62 0 38.83-11.74 52.46-20.86c17-11.5 23.29-14.37 31.42-11.37c12.38 4.75 26.25-1.492 30.88-13.87C643.1 366.3 637 352.5 624.5 347.7zM192 79.97c-8.875 0-16-7.125-16-16S183.1 47.98 192 47.98s16 7.118 16 15.99S200.9 79.97 192 79.97zM448 47.98c8.875 0 16 7.118 16 15.99s-7.125 16-16 16s-16-7.125-16-16S439.1 47.98 448 47.98z\"]\n};\nvar faPastafarianism = faSpaghettiMonsterFlying;\nvar faSpellCheck = {\n  prefix: 'fas',\n  iconName: 'spell-check',\n  icon: [576, 512, [], \"f891\", \"M566.6 265.4c-12.5-12.5-32.75-12.5-45.25 0L352 434.8l-73.38-73.38c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25l96 96c6.25 6.25 14.44 9.368 22.62 9.368s16.38-3.118 22.63-9.368l192-192C579.1 298.1 579.1 277.9 566.6 265.4zM221.5 211.7l-80-192C136.6 7.796 124.9 .0147 112 .0147S87.44 7.796 82.47 19.7l-80 192C-4.328 228 3.375 246.8 19.69 253.5c16.36 6.812 35.06-.9375 41.84-17.22l5.131-12.31h90.68l5.131 12.31c5.109 12.28 17.02 19.69 29.55 19.69c4.094 0 8.266-.7812 12.3-2.469C220.6 246.8 228.3 228 221.5 211.7zM93.33 160L112 115.2l18.67 44.81H93.33zM288 256h80c44.11 0 80-35.87 80-79.1c0-23.15-10.03-43.85-25.79-58.47C428.3 106.3 432 93.65 432 80.01c0-44.13-35.89-80-79.1-80L288 .0147c-17.67 0-32 14.31-32 31.1v192C256 241.7 270.3 256 288 256zM320 64.01h32c8.828 0 16 7.188 16 16s-7.172 16-16 16h-32V64.01zM320 160h48c8.828 0 16 7.188 16 16s-7.172 16-16 16H320V160z\"]\n};\nvar faSpider = {\n  prefix: 'fas',\n  iconName: 'spider',\n  icon: [576, 512, [128375], \"f717\", \"M563.3 401.6c2.608 8.443-2.149 17.4-10.62 19.1l-15.35 4.709c-8.48 2.6-17.47-2.139-20.08-10.59L493.2 338l-79.79-31.8l53.47 62.15c5.08 5.904 6.972 13.89 5.08 21.44l-28.23 110.1c-2.151 8.57-10.87 13.78-19.47 11.64l-15.58-3.873c-8.609-2.141-13.84-10.83-11.69-19.4l25.2-98.02l-38.51-44.77c.1529 2.205 .6627 4.307 .6627 6.549c0 53.02-43.15 96-96.37 96S191.6 405 191.6 352c0-2.242 .5117-4.34 .6627-6.543l-38.51 44.76l25.2 98.02c2.151 8.574-3.084 17.26-11.69 19.4l-15.58 3.873c-8.603 2.141-17.32-3.072-19.47-11.64l-28.23-110.1c-1.894-7.543 0-15.53 5.08-21.44l53.47-62.15l-79.79 31.8l-24.01 77.74c-2.608 8.447-11.6 13.19-20.08 10.59l-15.35-4.709c-8.478-2.6-13.23-11.55-10.63-19.1l27.4-88.69c2.143-6.939 7.323-12.54 14.09-15.24L158.9 256l-104.7-41.73C47.43 211.6 42.26 205.1 40.11 199.1L12.72 110.4c-2.608-8.443 2.149-17.4 10.62-19.1l15.35-4.709c8.48-2.6 17.47 2.139 20.08 10.59l24.01 77.74l79.79 31.8L109.1 143.6C104 137.7 102.1 129.7 104 122.2l28.23-110.1c2.151-8.57 10.87-13.78 19.47-11.64l15.58 3.873C175.9 6.494 181.1 15.18 178.1 23.76L153.8 121.8L207.7 184.4l.1542-24.44C206.1 123.4 228.9 91.77 261.4 80.43c5.141-1.793 10.5 2.215 10.5 7.641V112h32.12V88.09c0-5.443 5.394-9.443 10.55-7.641C345.9 91.39 368.3 121 368.3 155.9c0 1.393-.1786 2.689-.2492 4.064L368.3 184.4l53.91-62.66l-25.2-98.02c-2.151-8.574 3.084-17.26 11.69-19.4l15.58-3.873c8.603-2.141 17.32 3.072 19.47 11.64l28.23 110.1c1.894 7.543 0 15.53-5.08 21.44l-53.47 62.15l79.79-31.8l24.01-77.74c2.608-8.447 11.6-13.19 20.08-10.59l15.35 4.709c8.478 2.6 13.23 11.55 10.63 19.1l-27.4 88.69c-2.143 6.939-7.323 12.54-14.09 15.24L417.1 256l104.7 41.73c6.754 2.691 11.92 8.283 14.07 15.21L563.3 401.6z\"]\n};\nvar faSpinner = {\n  prefix: 'fas',\n  iconName: 'spinner',\n  icon: [512, 512, [], \"f110\", \"M304 48C304 74.51 282.5 96 256 96C229.5 96 208 74.51 208 48C208 21.49 229.5 0 256 0C282.5 0 304 21.49 304 48zM304 464C304 490.5 282.5 512 256 512C229.5 512 208 490.5 208 464C208 437.5 229.5 416 256 416C282.5 416 304 437.5 304 464zM0 256C0 229.5 21.49 208 48 208C74.51 208 96 229.5 96 256C96 282.5 74.51 304 48 304C21.49 304 0 282.5 0 256zM512 256C512 282.5 490.5 304 464 304C437.5 304 416 282.5 416 256C416 229.5 437.5 208 464 208C490.5 208 512 229.5 512 256zM74.98 437C56.23 418.3 56.23 387.9 74.98 369.1C93.73 350.4 124.1 350.4 142.9 369.1C161.6 387.9 161.6 418.3 142.9 437C124.1 455.8 93.73 455.8 74.98 437V437zM142.9 142.9C124.1 161.6 93.73 161.6 74.98 142.9C56.24 124.1 56.24 93.73 74.98 74.98C93.73 56.23 124.1 56.23 142.9 74.98C161.6 93.73 161.6 124.1 142.9 142.9zM369.1 369.1C387.9 350.4 418.3 350.4 437 369.1C455.8 387.9 455.8 418.3 437 437C418.3 455.8 387.9 455.8 369.1 437C350.4 418.3 350.4 387.9 369.1 369.1V369.1z\"]\n};\nvar faSplotch = {\n  prefix: 'fas',\n  iconName: 'splotch',\n  icon: [512, 512, [], \"f5bc\", \"M349.3 47.38L367.9 116.1C374.6 142.1 393.2 162.3 417.6 171.2L475.8 192.4C497.5 200.3 512 221 512 244.2C512 261.8 503.6 278.4 489.4 288.8L406.9 348.1C393.3 358.9 385.7 374.1 386.7 391.8L389.8 442.4C392.1 480.1 362.2 511.9 324.4 511.9C308.8 511.9 293.8 506.4 281.1 496.4L236.1 458.2C221.1 444.7 200.9 437.3 180 437.3H171.6C165.1 437.3 160.4 437.8 154.8 438.9L87.81 451.9C63.82 456.6 39.53 445.5 27.41 424.3C17.39 406.7 17.39 385.2 27.41 367.7L55.11 319.2C60.99 308.9 64.09 297.3 64.09 285.4C64.09 272.3 60.33 259.6 53.27 248.6L8.796 179.4C-6.738 155.2-1.267 123.2 21.41 105.6C32.12 97.25 45.52 93.13 59.07 94.01L130.8 98.66C159.8 100.5 187.1 87.91 205.9 64.93L237.3 24.66C249.4 9.133 267.9 .0566 287.6 .0566C316.5 .0566 341.8 19.47 349.3 47.38V47.38z\"]\n};\nvar faSpoon = {\n  prefix: 'fas',\n  iconName: 'spoon',\n  icon: [512, 512, [61873, 129348, \"utensil-spoon\"], \"f2e5\", \"M449.5 242.2C436.4 257.8 419.8 270 400.1 277.8C382.2 285.6 361.7 288.8 341.4 287C326.2 284.5 311.8 278.4 299.5 269.1L68.29 500.3C60.79 507.8 50.61 512 40 512C29.39 512 19.22 507.8 11.71 500.3C4.211 492.8-.0039 482.6-.0039 472C-.0039 461.4 4.211 451.2 11.71 443.7L243 212.5C233.7 200.2 227.6 185.8 225.1 170.6C223.3 150.3 226.5 129.9 234.3 111C242.1 92.22 254.3 75.56 269.9 62.47C337.8-5.437 433.1-20.28 482.7 29.35C532.3 78.95 517.4 174.2 449.5 242.2z\"]\n};\nvar faUtensilSpoon = faSpoon;\nvar faSprayCan = {\n  prefix: 'fas',\n  iconName: 'spray-can',\n  icon: [512, 512, [], \"f5bd\", \"M192 0C209.7 0 224 14.33 224 32V128H96V32C96 14.33 110.3 0 128 0H192zM0 256C0 202.1 42.98 160 96 160H224C277 160 320 202.1 320 256V464C320 490.5 298.5 512 272 512H48C21.49 512 0 490.5 0 464V256zM160 256C115.8 256 80 291.8 80 336C80 380.2 115.8 416 160 416C204.2 416 240 380.2 240 336C240 291.8 204.2 256 160 256zM320 64C320 81.67 305.7 96 288 96C270.3 96 256 81.67 256 64C256 46.33 270.3 32 288 32C305.7 32 320 46.33 320 64zM352 64C352 46.33 366.3 32 384 32C401.7 32 416 46.33 416 64C416 81.67 401.7 96 384 96C366.3 96 352 81.67 352 64zM512 64C512 81.67 497.7 96 480 96C462.3 96 448 81.67 448 64C448 46.33 462.3 32 480 32C497.7 32 512 46.33 512 64zM448 160C448 142.3 462.3 128 480 128C497.7 128 512 142.3 512 160C512 177.7 497.7 192 480 192C462.3 192 448 177.7 448 160zM512 256C512 273.7 497.7 288 480 288C462.3 288 448 273.7 448 256C448 238.3 462.3 224 480 224C497.7 224 512 238.3 512 256zM352 160C352 142.3 366.3 128 384 128C401.7 128 416 142.3 416 160C416 177.7 401.7 192 384 192C366.3 192 352 177.7 352 160z\"]\n};\nvar faSprayCanSparkles = {\n  prefix: 'fas',\n  iconName: 'spray-can-sparkles',\n  icon: [512, 512, [\"air-freshener\"], \"f5d0\", \"M96 32C96 14.33 110.3 0 128 0H192C209.7 0 224 14.33 224 32V128H96V32zM224 160C277 160 320 202.1 320 256V464C320 490.5 298.5 512 272 512H48C21.49 512 0 490.5 0 464V256C0 202.1 42.98 160 96 160H224zM160 416C204.2 416 240 380.2 240 336C240 291.8 204.2 256 160 256C115.8 256 80 291.8 80 336C80 380.2 115.8 416 160 416zM384 48C384 49.36 383 50.97 381.8 51.58L352 64L339.6 93.78C338.1 95 337.4 96 336 96C334.6 96 333 95 332.4 93.78L320 64L290.2 51.58C288.1 50.97 288 49.36 288 48C288 46.62 288.1 45.03 290.2 44.42L320 32L332.4 2.219C333 1 334.6 0 336 0C337.4 0 338.1 1 339.6 2.219L352 32L381.8 44.42C383 45.03 384 46.62 384 48zM460.4 93.78L448 64L418.2 51.58C416.1 50.97 416 49.36 416 48C416 46.62 416.1 45.03 418.2 44.42L448 32L460.4 2.219C461 1 462.6 0 464 0C465.4 0 466.1 1 467.6 2.219L480 32L509.8 44.42C511 45.03 512 46.62 512 48C512 49.36 511 50.97 509.8 51.58L480 64L467.6 93.78C466.1 95 465.4 96 464 96C462.6 96 461 95 460.4 93.78zM467.6 194.2L480 224L509.8 236.4C511 237 512 238.6 512 240C512 241.4 511 242.1 509.8 243.6L480 256L467.6 285.8C466.1 287 465.4 288 464 288C462.6 288 461 287 460.4 285.8L448 256L418.2 243.6C416.1 242.1 416 241.4 416 240C416 238.6 416.1 237 418.2 236.4L448 224L460.4 194.2C461 193 462.6 192 464 192C465.4 192 466.1 193 467.6 194.2zM448 144C448 145.4 447 146.1 445.8 147.6L416 160L403.6 189.8C402.1 191 401.4 192 400 192C398.6 192 397 191 396.4 189.8L384 160L354.2 147.6C352.1 146.1 352 145.4 352 144C352 142.6 352.1 141 354.2 140.4L384 128L396.4 98.22C397 97 398.6 96 400 96C401.4 96 402.1 97 403.6 98.22L416 128L445.8 140.4C447 141 448 142.6 448 144z\"]\n};\nvar faAirFreshener = faSprayCanSparkles;\nvar faSquare = {\n  prefix: 'fas',\n  iconName: 'square',\n  icon: [448, 512, [9723, 9724, 61590, 9632], \"f0c8\", \"M0 96C0 60.65 28.65 32 64 32H384C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96z\"]\n};\nvar faSquareArrowUpRight = {\n  prefix: 'fas',\n  iconName: 'square-arrow-up-right',\n  icon: [448, 512, [\"external-link-square\"], \"f14c\", \"M384 32H64C28.65 32 0 60.66 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.66 419.3 32 384 32zM344 312c0 17.69-14.31 32-32 32s-32-14.31-32-32V245.3l-121.4 121.4C152.4 372.9 144.2 376 136 376s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L234.8 200H168c-17.69 0-32-14.31-32-32s14.31-32 32-32h144c17.69 0 32 14.31 32 32V312z\"]\n};\nvar faExternalLinkSquare = faSquareArrowUpRight;\nvar faSquareCaretDown = {\n  prefix: 'fas',\n  iconName: 'square-caret-down',\n  icon: [448, 512, [\"caret-square-down\"], \"f150\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.65 419.3 32 384 32zM345.6 232.3l-104 112C237 349.2 230.7 352 224 352s-13.03-2.781-17.59-7.656l-104-112c-6.5-7-8.219-17.19-4.407-25.94C101.8 197.7 110.5 192 120 192h208c9.531 0 18.19 5.656 21.1 14.41C353.8 215.2 352.1 225.3 345.6 232.3z\"]\n};\nvar faCaretSquareDown = faSquareCaretDown;\nvar faSquareCaretLeft = {\n  prefix: 'fas',\n  iconName: 'square-caret-left',\n  icon: [448, 512, [\"caret-square-left\"], \"f191\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.65 419.3 32 384 32zM288 360c0 9.531-5.656 18.19-14.41 22C270.5 383.3 267.3 384 264 384c-5.938 0-11.81-2.219-16.34-6.406l-112-104C130.8 269 128 262.7 128 256s2.781-13.03 7.656-17.59l112-104c7.031-6.469 17.22-8.156 25.94-4.406C282.3 133.8 288 142.5 288 152V360z\"]\n};\nvar faCaretSquareLeft = faSquareCaretLeft;\nvar faSquareCaretRight = {\n  prefix: 'fas',\n  iconName: 'square-caret-right',\n  icon: [448, 512, [\"caret-square-right\"], \"f152\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.65 419.3 32 384 32zM312.3 273.6l-112 104C195.8 381.8 189.9 384 184 384c-3.25 0-6.5-.6562-9.594-2C165.7 378.2 160 369.5 160 360v-208c0-9.531 5.656-18.19 14.41-22c8.75-3.75 18.94-2.062 25.94 4.406l112 104C317.2 242.1 320 249.3 320 256S317.2 269 312.3 273.6z\"]\n};\nvar faCaretSquareRight = faSquareCaretRight;\nvar faSquareCaretUp = {\n  prefix: 'fas',\n  iconName: 'square-caret-up',\n  icon: [448, 512, [\"caret-square-up\"], \"f151\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.65 419.3 32 384 32zM349.1 305.6C346.2 314.3 337.5 320 328 320h-208c-9.531 0-18.19-5.656-22-14.41C94.19 296.8 95.91 286.7 102.4 279.7l104-112c9.125-9.75 26.06-9.75 35.19 0l104 112C352.1 286.7 353.8 296.8 349.1 305.6z\"]\n};\nvar faCaretSquareUp = faSquareCaretUp;\nvar faSquareCheck = {\n  prefix: 'fas',\n  iconName: 'square-check',\n  icon: [448, 512, [9989, 61510, 9745, \"check-square\"], \"f14a\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM339.8 211.8C350.7 200.9 350.7 183.1 339.8 172.2C328.9 161.3 311.1 161.3 300.2 172.2L192 280.4L147.8 236.2C136.9 225.3 119.1 225.3 108.2 236.2C97.27 247.1 97.27 264.9 108.2 275.8L172.2 339.8C183.1 350.7 200.9 350.7 211.8 339.8L339.8 211.8z\"]\n};\nvar faCheckSquare = faSquareCheck;\nvar faSquareEnvelope = {\n  prefix: 'fas',\n  iconName: 'square-envelope',\n  icon: [448, 512, [\"envelope-square\"], \"f199\", \"M384 32H64C28.63 32 0 60.63 0 96v320c0 35.38 28.62 64 64 64h320c35.38 0 64-28.62 64-64V96C448 60.63 419.4 32 384 32zM384 336c0 17.67-14.33 32-32 32H96c-17.67 0-32-14.33-32-32V225.9l138.5 69.27C209.3 298.5 216.6 300.2 224 300.2s14.75-1.688 21.47-5.047L384 225.9V336zM384 190.1l-152.8 76.42c-4.5 2.25-9.812 2.25-14.31 0L64 190.1V176c0-17.67 14.33-32 32-32h256c17.67 0 32 14.33 32 32V190.1z\"]\n};\nvar faEnvelopeSquare = faSquareEnvelope;\nvar faSquareFull = {\n  prefix: 'fas',\n  iconName: 'square-full',\n  icon: [512, 512, [128997, 128998, 128999, 129000, 129001, 129002, 129003, 11036, 11035], \"f45c\", \"M0 0H512V512H0V0z\"]\n};\nvar faSquareH = {\n  prefix: 'fas',\n  iconName: 'square-h',\n  icon: [448, 512, [\"h-square\"], \"f0fd\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96C448 60.65 419.3 32 384 32zM336 360c0 13.25-10.75 24-24 24S288 373.3 288 360v-80H160v80C160 373.3 149.3 384 136 384S112 373.3 112 360v-208C112 138.8 122.8 128 136 128S160 138.8 160 152v80h128v-80C288 138.8 298.8 128 312 128s24 10.75 24 24V360z\"]\n};\nvar faHSquare = faSquareH;\nvar faSquareMinus = {\n  prefix: 'fas',\n  iconName: 'square-minus',\n  icon: [448, 512, [61767, \"minus-square\"], \"f146\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM136 232C122.7 232 112 242.7 112 256C112 269.3 122.7 280 136 280H312C325.3 280 336 269.3 336 256C336 242.7 325.3 232 312 232H136z\"]\n};\nvar faMinusSquare = faSquareMinus;\nvar faSquareNfi = {\n  prefix: 'fas',\n  iconName: 'square-nfi',\n  icon: [448, 512, [], \"e576\", \"M0 96C0 60.65 28.65 32 64 32H384C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96zM64 176V336C64 344.8 71.16 352 80 352C88.84 352 96 344.8 96 336V233.8L162.3 344.2C165.1 350.4 173.3 353.3 180.3 351.4C187.2 349.5 191.1 343.2 191.1 336V176C191.1 167.2 184.8 160 175.1 160C167.2 160 159.1 167.2 159.1 176V278.2L93.72 167.8C90.02 161.6 82.66 158.7 75.73 160.6C68.8 162.5 64 168.8 64 176V176zM224 336C224 344.8 231.2 352 240 352C248.8 352 256 344.8 256 336V256H304C312.8 256 320 248.8 320 240C320 231.2 312.8 224 304 224H256V192H304C312.8 192 320 184.8 320 176C320 167.2 312.8 160 304 160H240C231.2 160 224 167.2 224 176V336zM384 176C384 167.2 376.8 160 368 160C359.2 160 352 167.2 352 176V336C352 344.8 359.2 352 368 352C376.8 352 384 344.8 384 336V176z\"]\n};\nvar faSquareParking = {\n  prefix: 'fas',\n  iconName: 'square-parking',\n  icon: [448, 512, [127359, \"parking\"], \"f540\", \"M192 256V192H240C257.7 192 272 206.3 272 224C272 241.7 257.7 256 240 256H192zM384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM336 224C336 170.1 293 128 240 128H168C145.9 128 128 145.9 128 168V352C128 369.7 142.3 384 160 384C177.7 384 192 369.7 192 352V320H240C293 320 336 277 336 224z\"]\n};\nvar faParking = faSquareParking;\nvar faSquarePen = {\n  prefix: 'fas',\n  iconName: 'square-pen',\n  icon: [448, 512, [\"pen-square\", \"pencil-square\"], \"f14b\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM325.8 139.7C310.1 124.1 284.8 124.1 269.2 139.7L247.8 161.1L318.7 232.1L340.1 210.7C355.8 195 355.8 169.7 340.1 154.1L325.8 139.7zM111.5 303.8L96.48 363.1C95.11 369.4 96.71 375.2 100.7 379.2C104.7 383.1 110.4 384.7 115.9 383.4L176 368.3C181.6 366.9 186.8 364 190.9 359.9L296.1 254.7L225.1 183.8L119.9 288.1C115.8 293.1 112.9 298.2 111.5 303.8z\"]\n};\nvar faPenSquare = faSquarePen;\nvar faPencilSquare = faSquarePen;\nvar faSquarePersonConfined = {\n  prefix: 'fas',\n  iconName: 'square-person-confined',\n  icon: [448, 512, [], \"e577\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM208 96C181.5 96 160 117.5 160 144C160 170.5 181.5 192 208 192C234.5 192 256 170.5 256 144C256 117.5 234.5 96 208 96zM240 306.7L198.6 265.4C191.4 258.1 181 254.8 170.9 256.4C160.7 258.1 151.1 264.5 147.4 273.7L99.39 369.7C91.48 385.5 97.89 404.7 113.7 412.6C129.5 420.5 148.7 414.1 156.6 398.3L184.8 342L239.4 396.7C251.8 409.1 268.6 416 286.1 416C322.5 416 352 386.5 352 350.1V248C352 217.1 326.9 192 296 192C265.1 192 240 217.1 240 248V306.7z\"]\n};\nvar faSquarePhone = {\n  prefix: 'fas',\n  iconName: 'square-phone',\n  icon: [448, 512, [\"phone-square\"], \"f098\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96C448 60.65 419.3 32 384 32zM351.6 321.5l-11.62 50.39c-1.633 7.125-7.9 12.11-15.24 12.11c-126.1 0-228.7-102.6-228.7-228.8c0-7.328 4.984-13.59 12.11-15.22l50.38-11.63c7.344-1.703 14.88 2.109 17.93 9.062l23.27 54.28c2.719 6.391 .8828 13.83-4.492 18.22L168.3 232c16.99 34.61 45.14 62.75 79.77 79.75l22.02-26.91c4.344-5.391 11.85-7.25 18.24-4.484l54.24 23.25C349.5 306.6 353.3 314.2 351.6 321.5z\"]\n};\nvar faPhoneSquare = faSquarePhone;\nvar faSquarePhoneFlip = {\n  prefix: 'fas',\n  iconName: 'square-phone-flip',\n  icon: [448, 512, [\"phone-square-alt\"], \"f87b\", \"M0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64H64C28.65 32 0 60.65 0 96zM105.5 303.6l54.24-23.25c6.391-2.766 13.9-.9062 18.24 4.484l22.02 26.91c34.63-17 62.77-45.14 79.77-79.75l-26.91-22.05c-5.375-4.391-7.211-11.83-4.492-18.22l23.27-54.28c3.047-6.953 10.59-10.77 17.93-9.062l50.38 11.63c7.125 1.625 12.11 7.891 12.11 15.22c0 126.1-102.6 228.8-228.7 228.8c-7.336 0-13.6-4.984-15.24-12.11l-11.62-50.39C94.71 314.2 98.5 306.6 105.5 303.6z\"]\n};\nvar faPhoneSquareAlt = faSquarePhoneFlip;\nvar faSquarePlus = {\n  prefix: 'fas',\n  iconName: 'square-plus',\n  icon: [448, 512, [61846, \"plus-square\"], \"f0fe\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM224 368C237.3 368 248 357.3 248 344V280H312C325.3 280 336 269.3 336 256C336 242.7 325.3 232 312 232H248V168C248 154.7 237.3 144 224 144C210.7 144 200 154.7 200 168V232H136C122.7 232 112 242.7 112 256C112 269.3 122.7 280 136 280H200V344C200 357.3 210.7 368 224 368z\"]\n};\nvar faPlusSquare = faSquarePlus;\nvar faSquarePollHorizontal = {\n  prefix: 'fas',\n  iconName: 'square-poll-horizontal',\n  icon: [448, 512, [\"poll-h\"], \"f682\", \"M448 416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384C419.3 32 448 60.65 448 96V416zM256 160C256 142.3 241.7 128 224 128H128C110.3 128 96 142.3 96 160C96 177.7 110.3 192 128 192H224C241.7 192 256 177.7 256 160zM128 224C110.3 224 96 238.3 96 256C96 273.7 110.3 288 128 288H320C337.7 288 352 273.7 352 256C352 238.3 337.7 224 320 224H128zM192 352C192 334.3 177.7 320 160 320H128C110.3 320 96 334.3 96 352C96 369.7 110.3 384 128 384H160C177.7 384 192 369.7 192 352z\"]\n};\nvar faPollH = faSquarePollHorizontal;\nvar faSquarePollVertical = {\n  prefix: 'fas',\n  iconName: 'square-poll-vertical',\n  icon: [448, 512, [\"poll\"], \"f681\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM128 224C110.3 224 96 238.3 96 256V352C96 369.7 110.3 384 128 384C145.7 384 160 369.7 160 352V256C160 238.3 145.7 224 128 224zM192 352C192 369.7 206.3 384 224 384C241.7 384 256 369.7 256 352V160C256 142.3 241.7 128 224 128C206.3 128 192 142.3 192 160V352zM320 288C302.3 288 288 302.3 288 320V352C288 369.7 302.3 384 320 384C337.7 384 352 369.7 352 352V320C352 302.3 337.7 288 320 288z\"]\n};\nvar faPoll = faSquarePollVertical;\nvar faSquareRootVariable = {\n  prefix: 'fas',\n  iconName: 'square-root-variable',\n  icon: [576, 512, [\"square-root-alt\"], \"f698\", \"M576 32.01c0-17.69-14.33-31.1-32-31.1l-224-.0049c-14.69 0-27.48 10-31.05 24.25L197.9 388.3L124.6 241.7C119.2 230.9 108.1 224 96 224L32 224c-17.67 0-32 14.31-32 31.1s14.33 32 32 32h44.22l103.2 206.3c5.469 10.91 16.6 17.68 28.61 17.68c1.172 0 2.323-.0576 3.495-.1826c13.31-1.469 24.31-11.06 27.56-24.06l105.9-423.8H544C561.7 64.01 576 49.7 576 32.01zM566.6 233.4c-12.5-12.5-32.75-12.5-45.25 0L480 274.8l-41.38-41.37c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25l41.38 41.38l-41.38 41.38c-12.5 12.5-12.5 32.75 0 45.25C399.6 412.9 407.8 416 416 416s16.38-3.125 22.62-9.375L480 365.3l41.38 41.38C527.6 412.9 535.8 416 544 416s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25l-41.38-41.38L566.6 278.6C579.1 266.1 579.1 245.9 566.6 233.4z\"]\n};\nvar faSquareRootAlt = faSquareRootVariable;\nvar faSquareRss = {\n  prefix: 'fas',\n  iconName: 'square-rss',\n  icon: [448, 512, [\"rss-square\"], \"f143\", \"M384 32H64C28.65 32 0 60.66 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.66 419.3 32 384 32zM150.6 374.6C144.4 380.9 136.2 384 128 384s-16.38-3.121-22.63-9.371c-12.5-12.5-12.5-32.76 0-45.26C111.6 323.1 119.8 320 128 320s16.38 3.121 22.63 9.371C163.1 341.9 163.1 362.1 150.6 374.6zM249.6 383.9C249 383.1 248.5 384 247.1 384c-12.53 0-23.09-9.75-23.92-22.44C220.5 306.9 173.1 259.5 118.4 255.9c-13.22-.8438-23.25-12.28-22.39-25.5c.8594-13.25 12.41-22.81 25.52-22.38c77.86 5.062 145.3 72.5 150.4 150.4C272.8 371.7 262.8 383.1 249.6 383.9zM345 383.1C344.7 384 344.3 384 343.1 384c-12.8 0-23.42-10.09-23.97-23C315.6 254.6 225.4 164.4 119 159.1C105.8 159.4 95.47 148.3 96.02 135C96.58 121.8 107.9 111.2 121 112c130.7 5.469 241.5 116.3 246.1 246.1C368.5 372.3 358.3 383.4 345 383.1z\"]\n};\nvar faRssSquare = faSquareRss;\nvar faSquareShareNodes = {\n  prefix: 'fas',\n  iconName: 'square-share-nodes',\n  icon: [448, 512, [\"share-alt-square\"], \"f1e1\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM320 96C284.7 96 256 124.7 256 160C256 162.5 256.1 164.9 256.4 167.3L174.5 212C162.8 199.7 146.3 192 128 192C92.65 192 64 220.7 64 256C64 291.3 92.65 320 128 320C146.3 320 162.8 312.3 174.5 299.1L256.4 344.7C256.1 347.1 256 349.5 256 352C256 387.3 284.7 416 320 416C355.3 416 384 387.3 384 352C384 316.7 355.3 288 320 288C304.6 288 290.5 293.4 279.4 302.5L194.1 256L279.4 209.5C290.5 218.6 304.6 224 320 224C355.3 224 384 195.3 384 160C384 124.7 355.3 96 320 96V96z\"]\n};\nvar faShareAltSquare = faSquareShareNodes;\nvar faSquareUpRight = {\n  prefix: 'fas',\n  iconName: 'square-up-right',\n  icon: [448, 512, [8599, \"external-link-square-alt\"], \"f360\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.34 28.65 64 64 64h320c35.35 0 64-28.66 64-64V96C448 60.65 419.3 32 384 32zM330.5 323.9c0 6.473-3.889 12.3-9.877 14.78c-5.979 2.484-12.86 1.105-17.44-3.469l-45.25-45.25l-67.92 67.92c-12.5 12.5-32.72 12.46-45.21-.0411l-22.63-22.63C109.7 322.7 109.6 302.5 122.1 289.1l67.92-67.92L144.8 176.8C140.2 172.2 138.8 165.3 141.3 159.4c2.477-5.984 8.309-9.875 14.78-9.875h158.4c8.835 0 15.1 7.163 15.1 15.1V323.9z\"]\n};\nvar faExternalLinkSquareAlt = faSquareUpRight;\nvar faSquareVirus = {\n  prefix: 'fas',\n  iconName: 'square-virus',\n  icon: [448, 512, [], \"e578\", \"M160 224C160 206.3 174.3 192 192 192C209.7 192 224 206.3 224 224C224 241.7 209.7 256 192 256C174.3 256 160 241.7 160 224zM280 288C280 301.3 269.3 312 256 312C242.7 312 232 301.3 232 288C232 274.7 242.7 264 256 264C269.3 264 280 274.7 280 288zM384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM199.8 117.7C199.8 146.9 164.5 161.6 143.8 140.9C134.4 131.5 119.2 131.5 109.8 140.9C100.5 150.2 100.5 165.4 109.8 174.8C130.5 195.5 115.9 230.9 86.61 230.9C73.35 230.9 62.61 241.6 62.61 254.9C62.61 268.1 73.35 278.9 86.61 278.9C115.9 278.9 130.5 314.3 109.8 334.9C100.5 344.3 100.5 359.5 109.8 368.9C119.2 378.3 134.4 378.3 143.8 368.9C164.5 348.2 199.8 362.9 199.8 392.1C199.8 405.4 210.6 416.1 223.8 416.1C237.1 416.1 247.8 405.4 247.8 392.1C247.8 362.9 283.2 348.2 303.9 368.9C313.3 378.3 328.5 378.3 337.8 368.9C347.2 359.5 347.2 344.3 337.8 334.9C317.2 314.3 331.8 278.9 361.1 278.9C374.3 278.9 385.1 268.1 385.1 254.9C385.1 241.6 374.3 230.9 361.1 230.9C331.8 230.9 317.2 195.5 337.8 174.8C347.2 165.4 347.2 150.2 337.8 140.9C328.5 131.5 313.3 131.5 303.9 140.9C283.2 161.6 247.8 146.9 247.8 117.7C247.8 104.4 237.1 93.65 223.8 93.65C210.6 93.65 199.8 104.4 199.8 117.7H199.8z\"]\n};\nvar faSquareXmark = {\n  prefix: 'fas',\n  iconName: 'square-xmark',\n  icon: [448, 512, [10062, \"times-square\", \"xmark-square\"], \"f2d3\", \"M384 32C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H384zM143 208.1L190.1 255.1L143 303C133.7 312.4 133.7 327.6 143 336.1C152.4 346.3 167.6 346.3 176.1 336.1L223.1 289.9L271 336.1C280.4 346.3 295.6 346.3 304.1 336.1C314.3 327.6 314.3 312.4 304.1 303L257.9 255.1L304.1 208.1C314.3 199.6 314.3 184.4 304.1 175C295.6 165.7 280.4 165.7 271 175L223.1 222.1L176.1 175C167.6 165.7 152.4 165.7 143 175C133.7 184.4 133.7 199.6 143 208.1V208.1z\"]\n};\nvar faTimesSquare = faSquareXmark;\nvar faXmarkSquare = faSquareXmark;\nvar faStaffAesculapius = {\n  prefix: 'fas',\n  iconName: 'staff-aesculapius',\n  icon: [384, 512, [\"rod-asclepius\", \"rod-snake\", \"staff-snake\"], \"e579\", \"M222.5 48H288C341 48 384 90.98 384 144C384 197 341 240 288 240H248V160H288C296.8 160 304 152.8 304 144C304 135.2 296.8 128 288 128H220L215.5 272H256C309 272 352 314.1 352 368C352 421 309 464 256 464H240V384H256C264.8 384 272 376.8 272 368C272 359.2 264.8 352 256 352H212.1L208.5 496C208.2 504.9 200.9 512 191.1 512C183.1 512 175.8 504.9 175.5 496L174.5 464H135.1C113.9 464 95.1 446.1 95.1 424C95.1 401.9 113.9 384 135.1 384H171.1L170.1 352H151.1C98.98 352 55.1 309 55.1 256C55.1 208.4 90.6 168.9 135.1 161.3V256C135.1 264.8 143.2 272 151.1 272H168.5L164 128H122.6C113.6 146.9 94.34 160 72 160H56C25.07 160 0 134.9 0 104C0 73.07 25.07 48 56 48H161.5L160.1 31.98C160.1 31.33 160.1 30.69 160.1 30.05C161.5 13.43 175.1 0 192 0C208.9 0 222.5 13.43 223 30.05C223 30.69 223 31.33 223 31.98L222.5 48zM79.1 96C79.1 87.16 72.84 80 63.1 80C55.16 80 47.1 87.16 47.1 96C47.1 104.8 55.16 112 63.1 112C72.84 112 79.1 104.8 79.1 96z\"]\n};\nvar faRodAsclepius = faStaffAesculapius;\nvar faRodSnake = faStaffAesculapius;\nvar faStaffSnake = faStaffAesculapius;\nvar faStairs = {\n  prefix: 'fas',\n  iconName: 'stairs',\n  icon: [576, 512, [], \"e289\", \"M576 64c0 17.67-14.31 32-32 32h-96v96c0 17.67-14.31 32-32 32h-96v96c0 17.67-14.31 32-32 32H192v96c0 17.67-14.31 32-32 32H32c-17.69 0-32-14.33-32-32s14.31-32 32-32h96v-96c0-17.67 14.31-32 32-32h96V192c0-17.67 14.31-32 32-32h96V64c0-17.67 14.31-32 32-32h128C561.7 32 576 46.33 576 64z\"]\n};\nvar faStamp = {\n  prefix: 'fas',\n  iconName: 'stamp',\n  icon: [512, 512, [], \"f5bf\", \"M366.2 256H400C461.9 256 512 306.1 512 368C512 388.9 498.6 406.7 480 413.3V464C480 490.5 458.5 512 432 512H80C53.49 512 32 490.5 32 464V413.3C13.36 406.7 0 388.9 0 368C0 306.1 50.14 256 112 256H145.8C175.7 256 200 231.7 200 201.8C200 184.3 190.8 168.5 180.1 154.8C167.5 138.5 160 118.1 160 96C160 42.98 202.1 0 256 0C309 0 352 42.98 352 96C352 118.1 344.5 138.5 331.9 154.8C321.2 168.5 312 184.3 312 201.8C312 231.7 336.3 256 366.2 256zM416 416H96V448H416V416z\"]\n};\nvar faStar = {\n  prefix: 'fas',\n  iconName: 'star',\n  icon: [576, 512, [61446, 11088], \"f005\", \"M381.2 150.3L524.9 171.5C536.8 173.2 546.8 181.6 550.6 193.1C554.4 204.7 551.3 217.3 542.7 225.9L438.5 328.1L463.1 474.7C465.1 486.7 460.2 498.9 450.2 506C440.3 513.1 427.2 514 416.5 508.3L288.1 439.8L159.8 508.3C149 514 135.9 513.1 126 506C116.1 498.9 111.1 486.7 113.2 474.7L137.8 328.1L33.58 225.9C24.97 217.3 21.91 204.7 25.69 193.1C29.46 181.6 39.43 173.2 51.42 171.5L195 150.3L259.4 17.97C264.7 6.954 275.9-.0391 288.1-.0391C300.4-.0391 311.6 6.954 316.9 17.97L381.2 150.3z\"]\n};\nvar faStarAndCrescent = {\n  prefix: 'fas',\n  iconName: 'star-and-crescent',\n  icon: [512, 512, [9770], \"f699\", \"M340.5 466.4c-1.5 0-6.875 .5-9.25 .5c-116.3 0-210.8-94.63-210.8-210.9s94.5-210.9 210.8-210.9c2.375 0 7.75 .5 9.25 .5c7.125 0 13.25-5 14.75-12c1.375-7.25-2.625-14.5-9.5-17.12c-29.13-11-59.38-16.5-89.75-16.5c-141.1 0-256 114.9-256 256s114.9 256 256 256c30.25 0 60.25-5.5 89.38-16.38c5.875-2 10.25-7.625 10.25-14.25C355.6 473.4 349.3 466.4 340.5 466.4zM503.5 213.9l-76.38-11.12L392.9 133.5C391.1 129.9 387.5 128 384 128c-3.5 0-7.125 1.875-9 5.5l-34.13 69.25l-76.38 11.12c-8.125 1.125-11.38 11.25-5.5 17l55.25 53.88l-13 76c-1.125 6.5 3.1 11.75 9.75 11.75c1.5 0 3.125-.375 4.625-1.25l68.38-35.88l68.25 35.88c1.625 .875 3.125 1.25 4.75 1.25c5.75 0 10.88-5.25 9.75-11.75l-13-76l55.25-53.88C514.9 225.1 511.6 214.1 503.5 213.9z\"]\n};\nvar faStarHalf = {\n  prefix: 'fas',\n  iconName: 'star-half',\n  icon: [576, 512, [61731], \"f089\", \"M288 439.8L159.8 508.3C149 514 135.9 513.1 126 506C116.1 498.9 111.1 486.7 113.2 474.7L137.8 328.1L33.58 225.9C24.97 217.3 21.91 204.7 25.69 193.1C29.46 181.6 39.43 173.2 51.42 171.5L195 150.3L259.4 17.97C264.7 6.995 275.8 .0131 287.1-.0391L288 439.8zM433.2 512C432.1 512.1 431 512.1 429.9 512H433.2z\"]\n};\nvar faStarHalfStroke = {\n  prefix: 'fas',\n  iconName: 'star-half-stroke',\n  icon: [576, 512, [\"star-half-alt\"], \"f5c0\", \"M463.1 474.7C465.1 486.7 460.2 498.9 450.2 506C440.3 513.1 427.2 514 416.5 508.3L288.1 439.8L159.8 508.3C149 514 135.9 513.1 126 506C116.1 498.9 111.1 486.7 113.2 474.7L137.8 328.1L33.58 225.9C24.97 217.3 21.91 204.7 25.69 193.1C29.46 181.6 39.43 173.2 51.42 171.5L195 150.3L259.4 17.97C264.7 6.954 275.9-.0391 288.1-.0391C300.4-.0391 311.6 6.954 316.9 17.97L381.2 150.3L524.9 171.5C536.8 173.2 546.8 181.6 550.6 193.1C554.4 204.7 551.3 217.3 542.7 225.9L438.5 328.1L463.1 474.7zM288 376.4L288.1 376.3L399.7 435.9L378.4 309.6L469.2 219.8L343.8 201.4L288.1 86.85L288 87.14V376.4z\"]\n};\nvar faStarHalfAlt = faStarHalfStroke;\nvar faStarOfDavid = {\n  prefix: 'fas',\n  iconName: 'star-of-david',\n  icon: [512, 512, [10017], \"f69a\", \"M490.7 345.4L435.6 256l55.1-89.38c14.87-24.25-3.62-54.61-33.12-54.61l-110.6-.005l-57.87-93.1C281.7 6.003 268.9 0 256 0C243.1 0 230.3 6.003 222.9 18L165 112H54.39c-29.62 0-47.99 30.37-33.12 54.62L76.37 256l-55.1 89.38C6.4 369.6 24.77 399.1 54.39 399.1h110.6l57.87 93.1C230.3 505.1 243.1 512 256 512c12.88 0 25.74-6.002 33.12-18l57.83-93.1h110.7C487.2 399.1 505.6 369.6 490.7 345.4zM256 73.77l23.59 38.23H232.5L256 73.77zM89.48 343.1l20.59-33.35l20.45 33.35H89.48zM110 201.3L89.48 168h41.04L110 201.3zM256 438.2l-23.59-38.25h47.08L256 438.2zM313.9 343.1H198L143.8 256l54.22-87.1h116L368.3 256L313.9 343.1zM381.3 343.1l20.67-33.29l20.52 33.29H381.3zM401.1 201.3l-20.51-33.29h41.04L401.1 201.3z\"]\n};\nvar faStarOfLife = {\n  prefix: 'fas',\n  iconName: 'star-of-life',\n  icon: [512, 512, [], \"f621\", \"M489.1 363.3l-24.03 41.59c-6.635 11.48-21.33 15.41-32.82 8.78l-129.1-74.56V488c0 13.25-10.75 24-24.02 24H231.1c-13.27 0-24.02-10.75-24.02-24v-148.9L78.87 413.7c-11.49 6.629-26.19 2.698-32.82-8.78l-24.03-41.59c-6.635-11.48-2.718-26.14 8.774-32.77L159.9 256L30.8 181.5C19.3 174.8 15.39 160.2 22.02 148.7l24.03-41.59c6.635-11.48 21.33-15.41 32.82-8.781l129.1 74.56L207.1 24c0-13.25 10.75-24 24.02-24h48.04c13.27 0 24.02 10.75 24.02 24l.0005 148.9l129.1-74.56c11.49-6.629 26.19-2.698 32.82 8.78l24.02 41.59c6.637 11.48 2.718 26.14-8.774 32.77L352.1 256l129.1 74.53C492.7 337.2 496.6 351.8 489.1 363.3z\"]\n};\nvar faSterlingSign = {\n  prefix: 'fas',\n  iconName: 'sterling-sign',\n  icon: [320, 512, [163, \"gbp\", \"pound-sign\"], \"f154\", \"M112 223.1H224C241.7 223.1 256 238.3 256 255.1C256 273.7 241.7 287.1 224 287.1H112V332.5C112 361.5 104.1 389.1 89.2 414.9L88.52 416H288C305.7 416 320 430.3 320 448C320 465.7 305.7 480 288 480H32C20.47 480 9.834 473.8 4.154 463.8C-1.527 453.7-1.371 441.4 4.56 431.5L34.32 381.9C43.27 367 48 349.9 48 332.5V288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H48V160.4C48 89.47 105.5 32 176.4 32C190.2 32 203.9 34.22 216.1 38.59L298.1 65.64C314.9 71.23 323.9 89.35 318.4 106.1C312.8 122.9 294.6 131.9 277.9 126.4L196.7 99.3C190.2 97.12 183.3 96 176.4 96C140.8 96 112 124.8 112 160.4V223.1z\"]\n};\nvar faGbp = faSterlingSign;\nvar faPoundSign = faSterlingSign;\nvar faStethoscope = {\n  prefix: 'fas',\n  iconName: 'stethoscope',\n  icon: [576, 512, [129658], \"f0f1\", \"M480 112c-44.18 0-80 35.82-80 80c0 32.84 19.81 60.98 48.11 73.31v78.7c0 57.25-50.25 104-112 104c-60 0-109.3-44.1-111.9-99.23C296.1 333.8 352 269.3 352 191.1V36.59c0-11.38-8.15-21.38-19.28-23.5L269.8 .4775c-13-2.625-25.54 5.766-28.16 18.77L238.4 34.99c-2.625 13 5.812 25.59 18.81 28.22l30.69 6.059L287.9 190.7c0 52.88-42.13 96.63-95.13 97.13c-53.38 .5-96.81-42.56-96.81-95.93L95.89 69.37l30.72-6.112c13-2.5 21.41-15.15 18.78-28.15L142.3 19.37c-2.5-13-15.15-21.41-28.15-18.78L51.28 12.99C40.15 15.24 32 25.09 32 36.59v155.4c0 77.25 55.11 142 128.1 156.8C162.7 439.3 240.6 512 336 512c97 0 176-75.37 176-168V265.3c28.23-12.36 48-40.46 48-73.25C560 147.8 524.2 112 480 112zM480 216c-13.25 0-24-10.75-24-24S466.7 168 480 168S504 178.7 504 192S493.3 216 480 216z\"]\n};\nvar faStop = {\n  prefix: 'fas',\n  iconName: 'stop',\n  icon: [384, 512, [9209], \"f04d\", \"M384 128v255.1c0 35.35-28.65 64-64 64H64c-35.35 0-64-28.65-64-64V128c0-35.35 28.65-64 64-64H320C355.3 64 384 92.65 384 128z\"]\n};\nvar faStopwatch = {\n  prefix: 'fas',\n  iconName: 'stopwatch',\n  icon: [448, 512, [9201], \"f2f2\", \"M272 0C289.7 0 304 14.33 304 32C304 49.67 289.7 64 272 64H256V98.45C293.5 104.2 327.7 120 355.7 143L377.4 121.4C389.9 108.9 410.1 108.9 422.6 121.4C435.1 133.9 435.1 154.1 422.6 166.6L398.5 190.8C419.7 223.3 432 262.2 432 304C432 418.9 338.9 512 224 512C109.1 512 16 418.9 16 304C16 200 92.32 113.8 192 98.45V64H176C158.3 64 144 49.67 144 32C144 14.33 158.3 0 176 0L272 0zM248 192C248 178.7 237.3 168 224 168C210.7 168 200 178.7 200 192V320C200 333.3 210.7 344 224 344C237.3 344 248 333.3 248 320V192z\"]\n};\nvar faStopwatch20 = {\n  prefix: 'fas',\n  iconName: 'stopwatch-20',\n  icon: [448, 512, [], \"e06f\", \"M276 256C276 249.4 281.4 244 288 244C294.6 244 300 249.4 300 256V352C300 358.6 294.6 364 288 364C281.4 364 276 358.6 276 352V256zM272 0C289.7 0 304 14.33 304 32C304 49.67 289.7 64 272 64H256V98.45C293.5 104.2 327.7 120 355.7 143L377.4 121.4C389.9 108.9 410.1 108.9 422.6 121.4C435.1 133.9 435.1 154.1 422.6 166.6L398.5 190.8C419.7 223.3 432 262.2 432 304C432 418.9 338.9 512 224 512C109.1 512 16 418.9 16 304C16 200 92.32 113.8 192 98.45V64H176C158.3 64 144 49.67 144 32C144 14.33 158.3 0 176 0L272 0zM288 204C259.3 204 236 227.3 236 256V352C236 380.7 259.3 404 288 404C316.7 404 340 380.7 340 352V256C340 227.3 316.7 204 288 204zM172 256.5V258.8C172 262.4 170.7 265.9 168.3 268.6L129.2 312.5C115.5 327.9 108 347.8 108 368.3V384C108 395 116.1 404 128 404H192C203 404 212 395 212 384C212 372.1 203 364 192 364H148.2C149.1 354.8 152.9 346.1 159.1 339.1L198.2 295.2C207.1 285.1 211.1 272.2 211.1 258.8V256.5C211.1 227.5 188.5 204 159.5 204C136.8 204 116.8 218.5 109.6 239.9L109 241.7C105.5 252.2 111.2 263.5 121.7 266.1C132.2 270.5 143.5 264.8 146.1 254.3L147.6 252.6C149.3 247.5 154.1 244 159.5 244C166.4 244 171.1 249.6 171.1 256.5L172 256.5z\"]\n};\nvar faStore = {\n  prefix: 'fas',\n  iconName: 'store',\n  icon: [576, 512, [], \"f54e\", \"M495.5 223.2C491.6 223.7 487.6 224 483.4 224C457.4 224 434.2 212.6 418.3 195C402.4 212.6 379.2 224 353.1 224C327 224 303.8 212.6 287.9 195C272 212.6 248.9 224 222.7 224C196.7 224 173.5 212.6 157.6 195C141.7 212.6 118.5 224 92.36 224C88.3 224 84.21 223.7 80.24 223.2C24.92 215.8-1.255 150.6 28.33 103.8L85.66 13.13C90.76 4.979 99.87 0 109.6 0H466.4C476.1 0 485.2 4.978 490.3 13.13L547.6 103.8C577.3 150.7 551 215.8 495.5 223.2H495.5zM499.7 254.9C503.1 254.4 508 253.6 512 252.6V448C512 483.3 483.3 512 448 512H128C92.66 512 64 483.3 64 448V252.6C67.87 253.6 71.86 254.4 75.97 254.9L76.09 254.9C81.35 255.6 86.83 256 92.36 256C104.8 256 116.8 254.1 128 250.6V384H448V250.7C459.2 254.1 471.1 256 483.4 256C489 256 494.4 255.6 499.7 254.9L499.7 254.9z\"]\n};\nvar faStoreSlash = {\n  prefix: 'fas',\n  iconName: 'store-slash',\n  icon: [640, 512, [], \"e071\", \"M94.92 49.09L117.7 13.13C122.8 4.98 131.9 .0007 141.6 .0007H498.4C508.1 .0007 517.2 4.979 522.3 13.13L579.6 103.8C609.3 150.7 583 215.8 527.5 223.2C523.6 223.7 519.6 224 515.4 224C489.4 224 466.2 212.6 450.3 195C434.4 212.6 411.2 224 385.1 224C359 224 335.8 212.6 319.9 195C314.4 201.1 308.1 206.4 301.2 210.7L480 350.9V250.7C491.2 254.1 503.1 256 515.4 256C521 256 526.4 255.6 531.7 254.9L531.7 254.9C535.1 254.4 540 253.6 544 252.6V401.1L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L94.92 49.09zM112.2 223.2C68.36 217.3 42.82 175.1 48.9 134.5L155.3 218.4C145.7 222 135.3 224 124.4 224C120.3 224 116.2 223.7 112.2 223.2V223.2zM160 384H365.5L514.9 501.7C504.8 508.2 492.9 512 480 512H160C124.7 512 96 483.3 96 448V252.6C99.87 253.6 103.9 254.4 107.1 254.9L108.1 254.9C113.3 255.6 118.8 256 124.4 256C136.8 256 148.8 254.1 160 250.6V384z\"]\n};\nvar faStreetView = {\n  prefix: 'fas',\n  iconName: 'street-view',\n  icon: [512, 512, [], \"f21d\", \"M320 64C320 99.35 291.3 128 256 128C220.7 128 192 99.35 192 64C192 28.65 220.7 0 256 0C291.3 0 320 28.65 320 64zM288 160C323.3 160 352 188.7 352 224V272C352 289.7 337.7 304 320 304H318.2L307.2 403.5C305.4 419.7 291.7 432 275.4 432H236.6C220.3 432 206.6 419.7 204.8 403.5L193.8 304H192C174.3 304 160 289.7 160 272V224C160 188.7 188.7 160 224 160H288zM63.27 414.7C60.09 416.3 57.47 417.8 55.33 419.2C51.7 421.6 51.72 426.4 55.34 428.8C64.15 434.6 78.48 440.6 98.33 446.1C137.7 456.1 193.5 464 256 464C318.5 464 374.3 456.1 413.7 446.1C433.5 440.6 447.9 434.6 456.7 428.8C460.3 426.4 460.3 421.6 456.7 419.2C454.5 417.8 451.9 416.3 448.7 414.7C433.4 406.1 409.9 399.8 379.7 394.2C366.6 391.8 358 379.3 360.4 366.3C362.8 353.3 375.3 344.6 388.3 347C420.8 352.9 449.2 361.2 470.3 371.8C480.8 377.1 490.6 383.5 498 391.4C505.6 399.5 512 410.5 512 424C512 445.4 496.5 460.1 482.9 469C468.2 478.6 448.6 486.3 426.4 492.4C381.8 504.7 321.6 512 256 512C190.4 512 130.2 504.7 85.57 492.4C63.44 486.3 43.79 478.6 29.12 469C15.46 460.1 0 445.4 0 424C0 410.5 6.376 399.5 13.96 391.4C21.44 383.5 31.24 377.1 41.72 371.8C62.75 361.2 91.24 352.9 123.7 347C136.7 344.6 149.2 353.3 151.6 366.3C153.1 379.3 145.4 391.8 132.3 394.2C102.1 399.8 78.57 406.1 63.27 414.7H63.27z\"]\n};\nvar faStrikethrough = {\n  prefix: 'fas',\n  iconName: 'strikethrough',\n  icon: [512, 512, [], \"f0cc\", \"M332.2 319.9c17.22 12.17 22.33 26.51 18.61 48.21c-3.031 17.59-10.88 29.34-24.72 36.99c-35.44 19.75-108.5 11.96-186-19.68c-16.34-6.686-35.03 1.156-41.72 17.53s1.188 35.05 17.53 41.71c31.75 12.93 95.69 35.37 157.6 35.37c29.62 0 58.81-5.156 83.72-18.96c30.81-17.09 50.44-45.46 56.72-82.11c3.998-23.27 2.168-42.58-3.488-59.05H332.2zM488 239.9l-176.5-.0309c-15.85-5.613-31.83-10.34-46.7-14.62c-85.47-24.62-110.9-39.05-103.7-81.33c2.5-14.53 10.16-25.96 22.72-34.03c20.47-13.15 64.06-23.84 155.4 .3438c17.09 4.531 34.59-5.654 39.13-22.74c4.531-17.09-5.656-34.59-22.75-39.12c-91.31-24.18-160.7-21.62-206.3 7.654C121.8 73.72 103.6 101.1 98.09 133.1C89.26 184.5 107.9 217.3 137.2 239.9L24 239.9c-13.25 0-24 10.75-24 23.1c0 13.25 10.75 23.1 24 23.1h464c13.25 0 24-10.75 24-23.1C512 250.7 501.3 239.9 488 239.9z\"]\n};\nvar faStroopwafel = {\n  prefix: 'fas',\n  iconName: 'stroopwafel',\n  icon: [512, 512, [], \"f551\", \"M188.1 210.8l-45.25 45.25l45.25 45.25l45.25-45.25L188.1 210.8zM301.2 188.1l-45.25-45.25L210.7 188.1l45.25 45.25L301.2 188.1zM210.7 323.9l45.25 45.25l45.25-45.25L255.1 278.6L210.7 323.9zM256 16c-132.5 0-240 107.5-240 240s107.5 240 240 240s240-107.5 240-240S388.5 16 256 16zM442.6 295.6l-11.25 11.25c-3.125 3.125-8.25 3.125-11.38 0L391.8 278.6l-45.25 45.25l34 33.88l16.88-16.88c3.125-3.125 8.251-3.125 11.38 0l11.25 11.25c3.125 3.125 3.125 8.25 0 11.38l-16.88 16.88l16.88 17c3.125 3.125 3.125 8.25 0 11.38l-11.25 11.25c-3.125 3.125-8.251 3.125-11.38 0l-16.88-17l-17 17c-3.125 3.125-8.25 3.125-11.38 0l-11.25-11.25c-3.125-3.125-3.125-8.25 0-11.38l17-17l-34-33.88l-45.25 45.25l28.25 28.25c3.125 3.125 3.125 8.25 0 11.38l-11.25 11.25c-3.125 3.125-8.25 3.125-11.38 0l-28.25-28.25L227.7 442.6c-3.125 3.125-8.25 3.125-11.38 0l-11.25-11.25c-3.125-3.125-3.125-8.25 0-11.38l28.25-28.25l-45.25-45.25l-33.88 34l16.88 16.88c3.125 3.125 3.125 8.25 0 11.38l-11.25 11.25c-3.125 3.125-8.25 3.125-11.38 0L131.6 403.1l-16.1 16.88c-3.125 3.125-8.25 3.125-11.38 0l-11.25-11.25c-3.125-3.125-3.125-8.25 0-11.38l17-16.88l-17-17c-3.125-3.125-3.125-8.25 0-11.38l11.25-11.25c3.125-3.125 8.25-3.125 11.38 0l16.1 17l33.88-34L120.2 278.6l-28.25 28.25c-3.125 3.125-8.25 3.125-11.38 0L69.37 295.6c-3.125-3.125-3.125-8.25 0-11.38l28.25-28.25l-28.25-28.25c-3.125-3.125-3.125-8.25 0-11.38l11.25-11.25c3.125-3.125 8.25-3.125 11.38 0l28.25 28.25l45.25-45.25l-34-34l-16.88 17c-3.125 3.125-8.25 3.125-11.38 0l-11.25-11.25c-3.125-3.125-3.125-8.25 0-11.38l16.88-17l-16.88-16.88c-3.125-3.125-3.125-8.25 0-11.38l11.25-11.25c3.125-3.125 8.25-3.125 11.38 0l16.88 17l17-17c3.125-3.125 8.25-3.125 11.38 0l11.25 11.25c3.125 3.125 3.125 8.25 0 11.38l-17 16.88l34 34l45.25-45.25L205.1 92c-3.125-3.125-3.125-8.25 0-11.38l11.25-11.25c3.125-3.125 8.25-3.125 11.38 0l28.25 28.25l28.25-28.25c3.125-3.125 8.25-3.125 11.38 0l11.25 11.25c3.125 3.125 3.125 8.25 0 11.38l-28.25 28.25l45.25 45.25l34-34l-17-16.88c-3.125-3.125-3.125-8.25 0-11.38l11.25-11.25c3.125-3.125 8.25-3.125 11.38 0l17 16.88l16.88-16.88c3.125-3.125 8.251-3.125 11.38 0l11.25 11.25c3.125 3.125 3.125 8.25 0 11.38l-17 16.88l17 17c3.125 3.125 3.125 8.25 0 11.38l-11.25 11.25c-3.125 3.125-8.251 3.125-11.38 0l-16.88-17l-34 34l45.25 45.25l28.25-28.25c3.125-3.125 8.25-3.125 11.38 0l11.25 11.25c3.125 3.125 3.125 8.25 0 11.38l-28.25 28.25l28.25 28.25C445.7 287.4 445.7 292.5 442.6 295.6zM278.6 256l45.25 45.25l45.25-45.25l-45.25-45.25L278.6 256z\"]\n};\nvar faSubscript = {\n  prefix: 'fas',\n  iconName: 'subscript',\n  icon: [512, 512, [], \"f12c\", \"M480 448v-128c0-11.09-5.75-21.38-15.17-27.22c-9.422-5.875-21.25-6.344-31.14-1.406l-32 16c-15.81 7.906-22.22 27.12-14.31 42.94c5.609 11.22 16.89 17.69 28.62 17.69v80c-17.67 0-32 14.31-32 32s14.33 32 32 32h64c17.67 0 32-14.31 32-32S497.7 448 480 448zM320 128c17.67 0 32-14.31 32-32s-14.33-32-32-32l-32-.0024c-10.44 0-20.23 5.101-26.22 13.66L176 200.2L90.22 77.67C84.23 69.11 74.44 64.01 64 64.01L32 64.01c-17.67 0-32 14.32-32 32s14.33 32 32 32h15.34L136.9 256l-89.6 128H32c-17.67 0-32 14.31-32 32s14.33 31.1 32 31.1l32-.0024c10.44 0 20.23-5.086 26.22-13.65L176 311.8l85.78 122.5C267.8 442.9 277.6 448 288 448l32 .0024c17.67 0 32-14.31 32-31.1s-14.33-32-32-32h-15.34l-89.6-128l89.6-127.1H320z\"]\n};\nvar faSuitcase = {\n  prefix: 'fas',\n  iconName: 'suitcase',\n  icon: [512, 512, [129523], \"f0f2\", \"M0 144v288C0 457.6 22.41 480 48 480H96V96H48C22.41 96 0 118.4 0 144zM336 0h-160C150.4 0 128 22.41 128 48V480h256V48C384 22.41 361.6 0 336 0zM336 96h-160V48h160V96zM464 96H416v384h48c25.59 0 48-22.41 48-48v-288C512 118.4 489.6 96 464 96z\"]\n};\nvar faSuitcaseMedical = {\n  prefix: 'fas',\n  iconName: 'suitcase-medical',\n  icon: [512, 512, [\"medkit\"], \"f0fa\", \"M0 144v288C0 457.6 22.41 480 48 480H64V96H48C22.41 96 0 118.4 0 144zM464 96H448v384h16c25.59 0 48-22.41 48-48v-288C512 118.4 489.6 96 464 96zM384 48C384 22.41 361.6 0 336 0h-160C150.4 0 128 22.41 128 48V96H96v384h320V96h-32V48zM176 48h160V96h-160V48zM352 312C352 316.4 348.4 320 344 320H288v56c0 4.375-3.625 8-8 8h-48C227.6 384 224 380.4 224 376V320H168C163.6 320 160 316.4 160 312v-48C160 259.6 163.6 256 168 256H224V200C224 195.6 227.6 192 232 192h48C284.4 192 288 195.6 288 200V256h56C348.4 256 352 259.6 352 264V312z\"]\n};\nvar faMedkit = faSuitcaseMedical;\nvar faSuitcaseRolling = {\n  prefix: 'fas',\n  iconName: 'suitcase-rolling',\n  icon: [448, 512, [], \"f5c1\", \"M368 128h-47.95l.0123-80c0-26.5-21.5-48-48-48h-96c-26.5 0-48 21.5-48 48L128 128H80C53.5 128 32 149.5 32 176v256C32 458.5 53.5 480 80 480h16.05L96 496C96 504.9 103.1 512 112 512h32C152.9 512 160 504.9 160 496L160.1 480h128L288 496c0 8.875 7.125 16 16 16h32c8.875 0 16-7.125 16-16l.0492-16H368c26.5 0 48-21.5 48-48v-256C416 149.5 394.5 128 368 128zM176.1 48h96V128h-96V48zM336 384h-224C103.2 384 96 376.8 96 368C96 359.2 103.2 352 112 352h224c8.801 0 16 7.199 16 16C352 376.8 344.8 384 336 384zM336 256h-224C103.2 256 96 248.8 96 240C96 231.2 103.2 224 112 224h224C344.8 224 352 231.2 352 240C352 248.8 344.8 256 336 256z\"]\n};\nvar faSun = {\n  prefix: 'fas',\n  iconName: 'sun',\n  icon: [512, 512, [9728], \"f185\", \"M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z\"]\n};\nvar faSunPlantWilt = {\n  prefix: 'fas',\n  iconName: 'sun-plant-wilt',\n  icon: [640, 512, [], \"e57a\", \"M192 160C192 177.7 177.7 192 160 192C142.3 192 128 177.7 128 160C128 142.3 142.3 128 160 128C177.7 128 192 142.3 192 160zM160 0C166.3 0 172 3.708 174.6 9.467L199.4 64.89L256.1 43.23C262 40.98 268.7 42.4 273.1 46.86C277.6 51.32 279 57.99 276.8 63.88L255.1 120.6L310.5 145.4C316.3 147.1 320 153.7 320 160C320 166.3 316.3 172 310.5 174.6L255.1 199.4L276.8 256.1C279 262 277.6 268.7 273.1 273.1C268.7 277.6 262 279 256.1 276.8L199.4 255.1L174.6 310.5C172 316.3 166.3 320 160 320C153.7 320 147.1 316.3 145.4 310.5L120.6 255.1L63.88 276.8C57.99 279 51.32 277.6 46.86 273.1C42.4 268.7 40.98 262 43.23 256.1L64.89 199.4L9.467 174.6C3.708 172 0 166.3 0 160C0 153.7 3.708 147.1 9.467 145.4L64.89 120.6L43.23 63.88C40.98 57.99 42.4 51.32 46.86 46.86C51.32 42.4 57.99 40.98 63.88 43.23L120.6 64.89L145.4 9.467C147.1 3.708 153.7 0 160 0V0zM160 224C195.3 224 224 195.3 224 160C224 124.7 195.3 96 160 96C124.7 96 96 124.7 96 160C96 195.3 124.7 224 160 224zM504 448H608C625.7 448 640 462.3 640 480C640 497.7 625.7 512 608 512H32C14.33 512 .0003 497.7 .0003 480C.0003 462.3 14.33 448 32 448H456V272C456 254.3 441.7 240 424 240C406.3 240 392 254.3 392 272V293.4C406.8 301.1 416 316.5 416 338C416 357.3 394.5 390.1 368 416C341.5 390.1 320 357.6 320 338C320 316.5 329.2 301.1 344 293.4V271.1C344 227.8 379.8 191.1 424 191.1C435.4 191.1 446.2 194.4 456 198.7V175.1C456 131.8 491.8 95.1 536 95.1C580.2 95.1 616 131.8 616 175.1V229.4C630.8 237.1 640 252.5 640 274C640 293.3 618.5 326.1 592 352C565.5 326.1 544 293.6 544 274C544 252.5 553.2 237.1 568 229.4V175.1C568 158.3 553.7 143.1 536 143.1C518.3 143.1 504 158.3 504 175.1V448z\"]\n};\nvar faSuperscript = {\n  prefix: 'fas',\n  iconName: 'superscript',\n  icon: [512, 512, [], \"f12b\", \"M480 160v-128c0-11.09-5.75-21.37-15.17-27.22C455.4-1.048 443.6-1.548 433.7 3.39l-32 16c-15.81 7.906-22.22 27.12-14.31 42.94C392.1 73.55 404.3 80.01 416 80.01v80c-17.67 0-32 14.31-32 32s14.33 32 32 32h64c17.67 0 32-14.31 32-32S497.7 160 480 160zM320 128c17.67 0 32-14.31 32-32s-14.33-32-32-32l-32-.0024c-10.44 0-20.23 5.101-26.22 13.66L176 200.2L90.22 77.67C84.23 69.11 74.44 64.01 64 64.01L32 64.01c-17.67 0-32 14.32-32 32s14.33 32 32 32h15.34L136.9 256l-89.6 128H32c-17.67 0-32 14.31-32 32s14.33 31.1 32 31.1l32-.0024c10.44 0 20.23-5.086 26.22-13.65L176 311.8l85.78 122.5C267.8 442.9 277.6 448 288 448l32 .0024c17.67 0 32-14.31 32-31.1s-14.33-32-32-32h-15.34l-89.6-128l89.6-127.1H320z\"]\n};\nvar faSwatchbook = {\n  prefix: 'fas',\n  iconName: 'swatchbook',\n  icon: [512, 512, [], \"f5c3\", \"M0 32C0 14.33 14.33 0 32 0H160C177.7 0 192 14.33 192 32V416C192 469 149 512 96 512C42.98 512 0 469 0 416V32zM128 64H64V128H128V64zM64 256H128V192H64V256zM96 440C109.3 440 120 429.3 120 416C120 402.7 109.3 392 96 392C82.75 392 72 402.7 72 416C72 429.3 82.75 440 96 440zM224 416V154L299.4 78.63C311.9 66.13 332.2 66.13 344.7 78.63L435.2 169.1C447.7 181.6 447.7 201.9 435.2 214.4L223.6 425.9C223.9 422.7 224 419.3 224 416V416zM374.8 320H480C497.7 320 512 334.3 512 352V480C512 497.7 497.7 512 480 512H182.8L374.8 320z\"]\n};\nvar faSynagogue = {\n  prefix: 'fas',\n  iconName: 'synagogue',\n  icon: [640, 512, [128333], \"f69b\", \"M309.8 3.708C315.7-1.236 324.3-1.236 330.2 3.708L451.2 104.5C469.5 119.7 480 142.2 480 165.1V512H384V384C384 348.7 355.3 320 320 320C284.7 320 256 348.7 256 384V512H160V165.1C160 142.2 170.5 119.7 188.8 104.5L309.8 3.708zM326.1 124.3C323.9 118.9 316.1 118.9 313 124.3L297.2 152.4L264.9 152.1C258.7 152.1 254.8 158.8 257.9 164.2L274.3 191.1L257.9 219.8C254.8 225.2 258.7 231.9 264.9 231.9L297.2 231.6L313 259.7C316.1 265.1 323.9 265.1 326.1 259.7L342.8 231.6L375.1 231.9C381.3 231.9 385.2 225.2 382.1 219.8L365.7 191.1L382.1 164.2C385.2 158.8 381.3 152.1 375.1 152.1L342.8 152.4L326.1 124.3zM512 244.5L540.1 213.3C543.1 209.9 547.5 208 552 208C556.5 208 560.9 209.9 563.9 213.3L627.7 284.2C635.6 292.1 640 304.4 640 316.3V448C640 483.3 611.3 512 576 512H512V244.5zM128 244.5V512H64C28.65 512 0 483.3 0 448V316.3C0 304.4 4.389 292.1 12.32 284.2L76.11 213.3C79.14 209.9 83.46 208 88 208C92.54 208 96.86 209.9 99.89 213.3L128 244.5z\"]\n};\nvar faSyringe = {\n  prefix: 'fas',\n  iconName: 'syringe',\n  icon: [512, 512, [128137], \"f48e\", \"M504.1 71.03l-64-64c-9.375-9.375-24.56-9.375-33.94 0s-9.375 24.56 0 33.94L422.1 56L384 94.06l-55.03-55.03c-9.375-9.375-24.56-9.375-33.94 0c-8.467 8.467-8.873 21.47-2.047 30.86l149.1 149.1C446.3 222.1 451.1 224 456 224c6.141 0 12.28-2.344 16.97-7.031c9.375-9.375 9.375-24.56 0-33.94L417.9 128L456 89.94l15.03 15.03C475.7 109.7 481.9 112 488 112s12.28-2.344 16.97-7.031C514.3 95.59 514.3 80.41 504.1 71.03zM208.8 154.1l58.56 58.56c6.25 6.25 6.25 16.38 0 22.62C264.2 238.4 260.1 240 256 240S247.8 238.4 244.7 235.3L186.1 176.8L144.8 218.1l58.56 58.56c6.25 6.25 6.25 16.38 0 22.62C200.2 302.4 196.1 304 192 304S183.8 302.4 180.7 299.3L122.1 240.8L82.75 280.1C70.74 292.1 64 308.4 64 325.4v88.68l-56.97 56.97c-9.375 9.375-9.375 24.56 0 33.94C11.72 509.7 17.86 512 24 512s12.28-2.344 16.97-7.031L97.94 448h88.69c16.97 0 33.25-6.744 45.26-18.75l187.6-187.6l-149.1-149.1L208.8 154.1z\"]\n};\nvar faT = {\n  prefix: 'fas',\n  iconName: 't',\n  icon: [384, 512, [116], \"54\", \"M384 64.01c0 17.67-14.33 32-32 32h-128v352c0 17.67-14.33 31.99-32 31.99s-32-14.32-32-31.99v-352H32c-17.67 0-32-14.33-32-32s14.33-32 32-32h320C369.7 32.01 384 46.34 384 64.01z\"]\n};\nvar faTable = {\n  prefix: 'fas',\n  iconName: 'table',\n  icon: [512, 512, [], \"f0ce\", \"M448 32C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM224 256V160H64V256H224zM64 320V416H224V320H64zM288 416H448V320H288V416zM448 256V160H288V256H448z\"]\n};\nvar faTableCells = {\n  prefix: 'fas',\n  iconName: 'table-cells',\n  icon: [512, 512, [\"th\"], \"f00a\", \"M448 32C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM152 96H64V160H152V96zM208 160H296V96H208V160zM448 96H360V160H448V96zM64 288H152V224H64V288zM296 224H208V288H296V224zM360 288H448V224H360V288zM152 352H64V416H152V352zM208 416H296V352H208V416zM448 352H360V416H448V352z\"]\n};\nvar faTh = faTableCells;\nvar faTableCellsLarge = {\n  prefix: 'fas',\n  iconName: 'table-cells-large',\n  icon: [512, 512, [\"th-large\"], \"f009\", \"M448 32C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM448 96H288V224H448V96zM448 288H288V416H448V288zM224 224V96H64V224H224zM64 416H224V288H64V416z\"]\n};\nvar faThLarge = faTableCellsLarge;\nvar faTableColumns = {\n  prefix: 'fas',\n  iconName: 'table-columns',\n  icon: [512, 512, [\"columns\"], \"f0db\", \"M0 96C0 60.65 28.65 32 64 32H448C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96zM64 416H224V160H64V416zM448 160H288V416H448V160z\"]\n};\nvar faColumns = faTableColumns;\nvar faTableList = {\n  prefix: 'fas',\n  iconName: 'table-list',\n  icon: [512, 512, [\"th-list\"], \"f00b\", \"M0 96C0 60.65 28.65 32 64 32H448C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96zM64 160H128V96H64V160zM448 96H192V160H448V96zM64 288H128V224H64V288zM448 224H192V288H448V224zM64 416H128V352H64V416zM448 352H192V416H448V352z\"]\n};\nvar faThList = faTableList;\nvar faTableTennisPaddleBall = {\n  prefix: 'fas',\n  iconName: 'table-tennis-paddle-ball',\n  icon: [512, 512, [127955, \"ping-pong-paddle-ball\", \"table-tennis\"], \"f45d\", \"M416 287.1c27.99 0 53.68 9.254 74.76 24.51c14.03-29.82 21.06-62.13 21.06-94.43c0-103.1-79.37-218.1-216.5-218.1c-59.94 0-120.4 23.71-165.5 68.95l-54.66 54.8C73.61 125.3 72.58 126.1 71.14 128.5l230.7 230.7C322.8 317.2 365.8 287.1 416 287.1zM290.3 392.1l-238.6-238.6C38.74 176.2 32.3 199.4 32.3 221.9c0 30.53 11.71 59.94 34.29 82.58l36.6 36.7l-92.38 81.32c-7.177 6.255-10.81 15.02-10.81 23.81c0 8.027 3.032 16.07 9.164 22.24l34.05 34.2c6.145 6.16 14.16 9.205 22.15 9.205c8.749 0 17.47-3.649 23.7-10.86l81.03-92.85l35.95 36.04c23.62 23.68 54.41 35.23 85.37 35.23c4.532 0 9.205-.2677 13.72-.7597c-10.56-18.61-17.12-39.89-17.12-62.81C288 408.1 288.1 400.5 290.3 392.1zM415.1 320c-52.99 0-95.99 42.1-95.99 95.1c0 52.1 42.99 95.99 95.99 95.99c52.1 0 95.99-42.1 95.99-95.99C511.1 363 468.1 320 415.1 320z\"]\n};\nvar faPingPongPaddleBall = faTableTennisPaddleBall;\nvar faTableTennis = faTableTennisPaddleBall;\nvar faTablet = {\n  prefix: 'fas',\n  iconName: 'tablet',\n  icon: [448, 512, [\"tablet-android\"], \"f3fb\", \"M384 0H64C28.65 0 0 28.65 0 64v384c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V64C448 28.65 419.3 0 384 0zM288 447.1C288 456.8 280.8 464 272 464H175.1C167.2 464 160 456.8 160 448S167.2 432 175.1 432h96C280.8 432 288 439.2 288 447.1z\"]\n};\nvar faTabletAndroid = faTablet;\nvar faTabletButton = {\n  prefix: 'fas',\n  iconName: 'tablet-button',\n  icon: [448, 512, [], \"f10a\", \"M384 0H64C28.65 0 0 28.65 0 64v384c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V64C448 28.65 419.3 0 384 0zM224 464c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S241.8 464 224 464z\"]\n};\nvar faTabletScreenButton = {\n  prefix: 'fas',\n  iconName: 'tablet-screen-button',\n  icon: [448, 512, [\"tablet-alt\"], \"f3fa\", \"M384 .0001H64c-35.35 0-64 28.65-64 64v384c0 35.35 28.65 63.1 64 63.1h320c35.35 0 64-28.65 64-63.1v-384C448 28.65 419.3 .0001 384 .0001zM224 480c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S241.8 480 224 480zM384 384H64v-320h320V384z\"]\n};\nvar faTabletAlt = faTabletScreenButton;\nvar faTablets = {\n  prefix: 'fas',\n  iconName: 'tablets',\n  icon: [640, 512, [], \"f490\", \"M159.1 191.1c-81.1 0-147.5 58.51-159.9 134.8C-.7578 331.5 3.367 336 8.365 336h303.3c4.998 0 8.996-4.5 8.248-9.25C307.4 250.5 241.1 191.1 159.1 191.1zM311.5 368H8.365c-4.998 0-9.123 4.5-8.248 9.25C12.49 453.5 78.88 512 159.1 512s147.4-58.5 159.8-134.8C320.7 372.5 316.5 368 311.5 368zM362.9 65.74c-3.502-3.502-9.504-3.252-12.25 .75c-45.52 62.76-40.52 150.4 15.88 206.9c56.52 56.51 144.2 61.39 206.1 15.88c4.002-2.875 4.252-8.877 .75-12.25L362.9 65.74zM593.4 46.61c-56.52-56.51-144.2-61.39-206.1-16c-4.002 2.877-4.252 8.877-.75 12.25l211.3 211.4c3.5 3.502 9.504 3.252 12.25-.75C654.8 190.8 649.9 103.1 593.4 46.61z\"]\n};\nvar faTachographDigital = {\n  prefix: 'fas',\n  iconName: 'tachograph-digital',\n  icon: [640, 512, [\"digital-tachograph\"], \"f566\", \"M576 64H64C28.8 64 0 92.8 0 128v256c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V128C640 92.8 611.2 64 576 64zM64 296C64 291.6 67.63 288 72 288h16C92.38 288 96 291.6 96 296v16C96 316.4 92.38 320 88 320h-16C67.63 320 64 316.4 64 312V296zM336 384h-256C71.2 384 64 376.8 64 368C64 359.2 71.2 352 79.1 352h256c8.801 0 16 7.199 16 16C352 376.8 344.8 384 336 384zM128 312v-16C128 291.6 131.6 288 136 288h16C156.4 288 160 291.6 160 296v16C160 316.4 156.4 320 152 320h-16C131.6 320 128 316.4 128 312zM192 312v-16C192 291.6 195.6 288 200 288h16C220.4 288 224 291.6 224 296v16C224 316.4 220.4 320 216 320h-16C195.6 320 192 316.4 192 312zM256 312v-16C256 291.6 259.6 288 264 288h16C284.4 288 288 291.6 288 296v16C288 316.4 284.4 320 280 320h-16C259.6 320 256 316.4 256 312zM352 312C352 316.4 348.4 320 344 320h-16C323.6 320 320 316.4 320 312v-16C320 291.6 323.6 288 328 288h16C348.4 288 352 291.6 352 296V312zM352 237.7C352 247.9 344.4 256 334.9 256H81.07C71.6 256 64 247.9 64 237.7V146.3C64 136.1 71.6 128 81.07 128h253.9C344.4 128 352 136.1 352 146.3V237.7zM560 384h-160c-8.801 0-16-7.201-16-16c0-8.801 7.199-16 16-16h160c8.801 0 16 7.199 16 16C576 376.8 568.8 384 560 384z\"]\n};\nvar faDigitalTachograph = faTachographDigital;\nvar faTag = {\n  prefix: 'fas',\n  iconName: 'tag',\n  icon: [448, 512, [127991], \"f02b\", \"M48 32H197.5C214.5 32 230.7 38.74 242.7 50.75L418.7 226.7C443.7 251.7 443.7 292.3 418.7 317.3L285.3 450.7C260.3 475.7 219.7 475.7 194.7 450.7L18.75 274.7C6.743 262.7 0 246.5 0 229.5V80C0 53.49 21.49 32 48 32L48 32zM112 176C129.7 176 144 161.7 144 144C144 126.3 129.7 112 112 112C94.33 112 80 126.3 80 144C80 161.7 94.33 176 112 176z\"]\n};\nvar faTags = {\n  prefix: 'fas',\n  iconName: 'tags',\n  icon: [512, 512, [], \"f02c\", \"M472.8 168.4C525.1 221.4 525.1 306.6 472.8 359.6L360.8 472.9C351.5 482.3 336.3 482.4 326.9 473.1C317.4 463.8 317.4 448.6 326.7 439.1L438.6 325.9C472.5 291.6 472.5 236.4 438.6 202.1L310.9 72.87C301.5 63.44 301.6 48.25 311.1 38.93C320.5 29.61 335.7 29.7 344.1 39.13L472.8 168.4zM.0003 229.5V80C.0003 53.49 21.49 32 48 32H197.5C214.5 32 230.7 38.74 242.7 50.75L410.7 218.7C435.7 243.7 435.7 284.3 410.7 309.3L277.3 442.7C252.3 467.7 211.7 467.7 186.7 442.7L18.75 274.7C6.743 262.7 0 246.5 0 229.5L.0003 229.5zM112 112C94.33 112 80 126.3 80 144C80 161.7 94.33 176 112 176C129.7 176 144 161.7 144 144C144 126.3 129.7 112 112 112z\"]\n};\nvar faTape = {\n  prefix: 'fas',\n  iconName: 'tape',\n  icon: [576, 512, [], \"f4db\", \"M288 256C288 291.3 259.3 320 224 320C188.7 320 160 291.3 160 256C160 220.7 188.7 192 224 192C259.3 192 288 220.7 288 256zM544 416C561.7 416 576 430.3 576 448C576 465.7 561.7 480 544 480H224C100.3 480 0 379.7 0 256C0 132.3 100.3 32 224 32C347.7 32 448 132.3 448 256C448 318.7 422.3 375.3 380.8 416H544zM224 352C277 352 320 309 320 256C320 202.1 277 160 224 160C170.1 160 128 202.1 128 256C128 309 170.1 352 224 352z\"]\n};\nvar faTarp = {\n  prefix: 'fas',\n  iconName: 'tarp',\n  icon: [576, 512, [], \"e57b\", \"M576 288H448C430.3 288 416 302.3 416 320V448H64C28.65 448 0 419.3 0 384V128C0 92.65 28.65 64 64 64H512C547.3 64 576 92.65 576 128V288zM96 192C113.7 192 128 177.7 128 160C128 142.3 113.7 128 96 128C78.33 128 64 142.3 64 160C64 177.7 78.33 192 96 192zM448 448V320H576L448 448z\"]\n};\nvar faTarpDroplet = {\n  prefix: 'fas',\n  iconName: 'tarp-droplet',\n  icon: [576, 512, [], \"e57c\", \"M224 100C224 75.95 257.7 29.93 276.2 6.49C282.3-1.226 293.7-1.226 299.8 6.49C318.3 29.93 352 75.95 352 100C352 133.1 323.3 160 288 160C252.7 160 224 133.1 224 100V100zM64 128H197.5C210.6 165.3 246.2 192 288 192C329.8 192 365.4 165.3 378.5 128H512C547.3 128 576 156.7 576 192V352H448C430.3 352 416 366.3 416 384V512H64C28.65 512 0 483.3 0 448V192C0 156.7 28.65 128 64 128V128zM96 256C113.7 256 128 241.7 128 224C128 206.3 113.7 192 96 192C78.33 192 64 206.3 64 224C64 241.7 78.33 256 96 256zM448 512V384H576L448 512z\"]\n};\nvar faTaxi = {\n  prefix: 'fas',\n  iconName: 'taxi',\n  icon: [576, 512, [128662, \"cab\"], \"f1ba\", \"M352 0C369.7 0 384 14.33 384 32V64L384 64.15C422.6 66.31 456.3 91.49 469.2 128.3L504.4 228.8C527.6 238.4 544 261.3 544 288V480C544 497.7 529.7 512 512 512H480C462.3 512 448 497.7 448 480V432H128V480C128 497.7 113.7 512 96 512H64C46.33 512 32 497.7 32 480V288C32 261.3 48.36 238.4 71.61 228.8L106.8 128.3C119.7 91.49 153.4 66.31 192 64.15L192 64V32C192 14.33 206.3 0 224 0L352 0zM197.4 128C183.8 128 171.7 136.6 167.2 149.4L141.1 224H434.9L408.8 149.4C404.3 136.6 392.2 128 378.6 128H197.4zM128 352C145.7 352 160 337.7 160 320C160 302.3 145.7 288 128 288C110.3 288 96 302.3 96 320C96 337.7 110.3 352 128 352zM448 288C430.3 288 416 302.3 416 320C416 337.7 430.3 352 448 352C465.7 352 480 337.7 480 320C480 302.3 465.7 288 448 288z\"]\n};\nvar faCab = faTaxi;\nvar faTeeth = {\n  prefix: 'fas',\n  iconName: 'teeth',\n  icon: [576, 512, [], \"f62e\", \"M480 32H96C42.98 32 0 74.98 0 128v256c0 53.02 42.98 96 96 96h384c53.02 0 96-42.98 96-96V128C576 74.98 533 32 480 32zM144 336C144 362.5 122.5 384 96 384s-48-21.5-48-48v-32C48 295.1 55.13 288 64 288h64c8.875 0 16 7.125 16 16V336zM144 240C144 248.9 136.9 256 128 256H64C55.13 256 48 248.9 48 240v-32C48 181.5 69.5 160 96 160s48 21.5 48 48V240zM272 336C272 362.5 250.5 384 224 384s-48-21.5-48-48v-32C176 295.1 183.1 288 192 288h64c8.875 0 16 7.125 16 16V336zM272 242.3C272 249.9 265.9 256 258.3 256H189.7C182.1 256 176 249.9 176 242.3V176C176 149.5 197.5 128 224 128s48 21.54 48 48V242.3zM400 336c0 26.5-21.5 48-48 48s-48-21.5-48-48v-32C304 295.1 311.1 288 320 288h64c8.875 0 16 7.125 16 16V336zM400 242.3C400 249.9 393.9 256 386.3 256h-68.57C310.1 256 304 249.9 304 242.3V176C304 149.5 325.5 128 352 128s48 21.54 48 48V242.3zM528 336c0 26.5-21.5 48-48 48s-48-21.5-48-48v-32C432 295.1 439.1 288 448 288h64c8.875 0 16 7.125 16 16V336zM528 240C528 248.9 520.9 256 512 256h-64c-8.875 0-16-7.125-16-16v-32C432 181.5 453.5 160 480 160s48 21.5 48 48V240z\"]\n};\nvar faTeethOpen = {\n  prefix: 'fas',\n  iconName: 'teeth-open',\n  icon: [576, 512, [], \"f62f\", \"M512 288H64c-35.35 0-64 28.65-64 64v32c0 53.02 42.98 96 96 96h384c53.02 0 96-42.98 96-96v-32C576 316.7 547.3 288 512 288zM144 368C144 394.5 122.5 416 96 416s-48-21.5-48-48v-32C48 327.1 55.13 320 64 320h64c8.875 0 16 7.125 16 16V368zM272 368C272 394.5 250.5 416 224 416s-48-21.5-48-48v-32C176 327.1 183.1 320 192 320h64c8.875 0 16 7.125 16 16V368zM400 368c0 26.5-21.5 48-48 48s-48-21.5-48-48v-32c0-8.875 7.125-16 16-16h64c8.875 0 16 7.125 16 16V368zM528 368c0 26.5-21.5 48-48 48s-48-21.5-48-48v-32c0-8.875 7.125-16 16-16h64c8.875 0 16 7.125 16 16V368zM480 32H96C42.98 32 0 74.98 0 128v64c0 35.35 28.65 64 64 64h448c35.35 0 64-28.65 64-64V128C576 74.98 533 32 480 32zM144 208C144 216.9 136.9 224 128 224H64C55.13 224 48 216.9 48 208v-32C48 149.5 69.5 128 96 128s48 21.5 48 48V208zM272 210.3C272 217.9 265.9 224 258.3 224H189.7C182.1 224 176 217.9 176 210.3V144C176 117.5 197.5 96 224 96s48 21.54 48 48V210.3zM400 210.3C400 217.9 393.9 224 386.3 224h-68.57C310.1 224 304 217.9 304 210.3V144C304 117.5 325.5 96 352 96s48 21.54 48 48V210.3zM528 208C528 216.9 520.9 224 512 224h-64c-8.875 0-16-7.125-16-16v-32C432 149.5 453.5 128 480 128s48 21.5 48 48V208z\"]\n};\nvar faTemperatureArrowDown = {\n  prefix: 'fas',\n  iconName: 'temperature-arrow-down',\n  icon: [512, 512, [\"temperature-down\"], \"e03f\", \"M159.1 322.9l-.0002-18.92C159.1 295.1 152.9 287.1 144 287.1c-8.875 0-15.1 7.115-15.1 15.99L128 322.9c-22 7.875-35.25 30.38-31.25 53.38C100.6 399.4 120.6 416.1 144 416.1c23.37 0 43.37-16.71 47.25-39.83C195.2 353.3 181.1 330.8 159.1 322.9zM255.1 112C255.1 50.13 205.9 0 144 0C82.13 0 32 50.13 32 112v166.5C12.25 303.3 0 334 0 368C0 447.5 64.5 512 144 512c79.5 0 143.1-64.5 143.1-144c0-34-12.25-64.88-32-89.5V112zM219.9 393.4C208.1 426.1 178.4 447.1 144 447.1c-34.38 0-65-21.84-75.88-54.59C57.25 360.8 68.5 324.9 96 304.3V112C96 85.5 117.5 64 144 64c26.5 0 47.1 21.5 47.1 48v192.3C219.5 324.9 230.7 360.8 219.9 393.4zM499.1 343c-13.77-11.03-33.92-8.75-44.97 5L448 356.8V64c0-17.69-14.33-32-32-32s-32 14.31-32 32v292.8L376.1 348c-11.03-13.81-31.19-16.03-44.97-5c-13.81 11.06-16.05 31.19-5 45l64 80C397.1 475.6 406.3 480 416 480s18.92-4.406 24.98-12l64-80C516 374.2 513.8 354.1 499.1 343z\"]\n};\nvar faTemperatureDown = faTemperatureArrowDown;\nvar faTemperatureArrowUp = {\n  prefix: 'fas',\n  iconName: 'temperature-arrow-up',\n  icon: [512, 512, [\"temperature-up\"], \"e040\", \"M159.1 322.9V112C159.1 103.1 152.9 96 144 96C135.1 96 128 103.1 128 112v210.9c-22 7.875-35.25 30.38-31.25 53.38C100.6 399.4 120.6 416.1 144 416.1c23.37 0 43.37-16.71 47.25-39.83C195.2 353.3 181.1 330.8 159.1 322.9zM255.1 112C255.1 50.13 205.9 0 144 0C82.13 0 32 50.13 32 112v166.5C12.25 303.3 0 334 0 368C0 447.5 64.5 512 144 512c79.5 0 143.1-64.5 143.1-144c0-34-12.25-64.88-32-89.5V112zM219.9 393.4C208.1 426.1 178.4 447.1 144 447.1c-34.38 0-65-21.84-75.88-54.59C57.25 360.8 68.5 324.9 96 304.3V112c0-26.5 21.5-48.01 48-48.01c26.5 0 47.1 21.51 47.1 48.01v192.3C219.5 324.9 230.7 360.8 219.9 393.4zM504.1 124l-64-80c-12.12-15.19-37.84-15.19-49.97 0l-64 80c-11.05 13.81-8.812 33.94 5 45c13.75 11.03 33.94 8.781 44.97-5L384 155.2V448c0 17.69 14.33 32 32 32s32-14.31 32-32V155.2L455 164c6.312 7.906 15.61 12 25 12c7.016 0 14.08-2.281 19.97-7C513.8 157.9 516 137.8 504.1 124z\"]\n};\nvar faTemperatureUp = faTemperatureArrowUp;\nvar faTemperatureEmpty = {\n  prefix: 'fas',\n  iconName: 'temperature-empty',\n  icon: [320, 512, [\"temperature-0\", \"thermometer-0\", \"thermometer-empty\"], \"f2cb\", \"M272 278.5V112c0-61.87-50.12-112-111.1-112S48 50.13 48 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 143.1 144 143.1S304 447.5 304 368C304 334 291.8 303.1 272 278.5zM160 448c-44.13 0-80-35.87-80-79.1c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48s48 21.5 48 48v192.3c19.75 14.75 32 38.25 32 63.75C240 412.1 204.1 448 160 448zM160 320c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S186.5 320 160 320z\"]\n};\nvar faTemperature0 = faTemperatureEmpty;\nvar faThermometer0 = faTemperatureEmpty;\nvar faThermometerEmpty = faTemperatureEmpty;\nvar faTemperatureFull = {\n  prefix: 'fas',\n  iconName: 'temperature-full',\n  icon: [320, 512, [\"temperature-4\", \"thermometer-4\", \"thermometer-full\"], \"f2c7\", \"M176 322.9V112c0-8.75-7.25-16-16-16s-16 7.25-16 16v210.9c-18.62 6.625-32 24.25-32 45.13c0 26.5 21.5 48 48 48s48-21.5 48-48C208 347.1 194.6 329.5 176 322.9zM272 278.5V112c0-61.87-50.12-112-111.1-112S48 50.13 48 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 143.1 144 143.1S304 447.5 304 368C304 334 291.8 303.1 272 278.5zM160 448c-44.13 0-80-35.87-80-79.1c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48s48 21.5 48 48v192.3c19.75 14.75 32 38.25 32 63.75C240 412.1 204.1 448 160 448z\"]\n};\nvar faTemperature4 = faTemperatureFull;\nvar faThermometer4 = faTemperatureFull;\nvar faThermometerFull = faTemperatureFull;\nvar faTemperatureHalf = {\n  prefix: 'fas',\n  iconName: 'temperature-half',\n  icon: [320, 512, [127777, \"temperature-2\", \"thermometer-2\", \"thermometer-half\"], \"f2c9\", \"M176 322.9l.0002-114.9c0-8.75-7.25-16-16-16s-15.1 7.25-15.1 16L144 322.9c-18.62 6.625-32 24.25-32 45.13c0 26.5 21.5 48 48 48s48-21.5 48-48C208 347.1 194.6 329.5 176 322.9zM272 278.5V112c0-61.87-50.12-112-111.1-112S48 50.13 48 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 143.1 144 143.1S304 447.5 304 368C304 334 291.8 303.1 272 278.5zM160 448c-44.13 0-80-35.87-80-79.1c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48s48 21.5 48 48v192.3c19.75 14.75 32 38.25 32 63.75C240 412.1 204.1 448 160 448z\"]\n};\nvar faTemperature2 = faTemperatureHalf;\nvar faThermometer2 = faTemperatureHalf;\nvar faThermometerHalf = faTemperatureHalf;\nvar faTemperatureHigh = {\n  prefix: 'fas',\n  iconName: 'temperature-high',\n  icon: [512, 512, [], \"f769\", \"M160 322.9V112C160 103.3 152.8 96 144 96S128 103.3 128 112v210.9C109.4 329.5 96 347.1 96 368C96 394.5 117.5 416 144 416S192 394.5 192 368C192 347.1 178.6 329.5 160 322.9zM416 0c-52.88 0-96 43.13-96 96s43.13 96 96 96s96-43.13 96-96S468.9 0 416 0zM416 128c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S433.8 128 416 128zM256 112c0-61.88-50.13-112-112-112s-112 50.13-112 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 144 144 144s144-64.5 144-144c0-33.1-12.25-64.88-32-89.5V112zM144 448c-44.13 0-80-35.88-80-80c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48S192 85.5 192 112V304.3c19.75 14.75 32 38.25 32 63.75C224 412.1 188.1 448 144 448z\"]\n};\nvar faTemperatureLow = {\n  prefix: 'fas',\n  iconName: 'temperature-low',\n  icon: [512, 512, [], \"f76b\", \"M160 322.9V304C160 295.3 152.8 288 144 288S128 295.3 128 304v18.88C109.4 329.5 96 347.1 96 368C96 394.5 117.5 416 144 416S192 394.5 192 368C192 347.1 178.6 329.5 160 322.9zM256 112c0-61.88-50.13-112-112-112s-112 50.13-112 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 144 144 144s144-64.5 144-144c0-33.1-12.25-64.88-32-89.5V112zM144 448c-44.13 0-80-35.88-80-80c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48s48 21.5 48 48v192.1c19.75 14.75 32 38.38 32 63.88C224 412.1 188.1 448 144 448zM416 0c-52.88 0-96 43.13-96 96s43.13 96 96 96s96-43.13 96-96S468.9 0 416 0zM416 128c-17.75 0-32-14.25-32-32s14.25-32 32-32s32 14.25 32 32S433.8 128 416 128z\"]\n};\nvar faTemperatureQuarter = {\n  prefix: 'fas',\n  iconName: 'temperature-quarter',\n  icon: [320, 512, [\"temperature-1\", \"thermometer-1\", \"thermometer-quarter\"], \"f2ca\", \"M176 322.9l.0002-50.88c0-8.75-7.25-16-16-16s-15.1 7.25-15.1 16L144 322.9c-18.62 6.625-32 24.25-32 45.13c0 26.5 21.5 48 48 48s48-21.5 48-48C208 347.1 194.6 329.5 176 322.9zM272 278.5V112c0-61.87-50.12-112-111.1-112S48 50.13 48 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 143.1 144 143.1S304 447.5 304 368C304 334 291.8 303.1 272 278.5zM160 448c-44.13 0-80-35.87-80-79.1c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48s48 21.5 48 48v192.3c19.75 14.75 32 38.25 32 63.75C240 412.1 204.1 448 160 448z\"]\n};\nvar faTemperature1 = faTemperatureQuarter;\nvar faThermometer1 = faTemperatureQuarter;\nvar faThermometerQuarter = faTemperatureQuarter;\nvar faTemperatureThreeQuarters = {\n  prefix: 'fas',\n  iconName: 'temperature-three-quarters',\n  icon: [320, 512, [\"temperature-3\", \"thermometer-3\", \"thermometer-three-quarters\"], \"f2c8\", \"M176 322.9V160c0-8.75-7.25-16-16-16s-16 7.25-16 16v162.9c-18.62 6.625-32 24.25-32 45.13c0 26.5 21.5 48 48 48s48-21.5 48-48C208 347.1 194.6 329.5 176 322.9zM272 278.5V112c0-61.87-50.12-112-111.1-112S48 50.13 48 112v166.5c-19.75 24.75-32 55.5-32 89.5c0 79.5 64.5 143.1 144 143.1S304 447.5 304 368C304 334 291.8 303.1 272 278.5zM160 448c-44.13 0-80-35.87-80-79.1c0-25.5 12.25-48.88 32-63.75v-192.3c0-26.5 21.5-48 48-48s48 21.5 48 48v192.3c19.75 14.75 32 38.25 32 63.75C240 412.1 204.1 448 160 448z\"]\n};\nvar faTemperature3 = faTemperatureThreeQuarters;\nvar faThermometer3 = faTemperatureThreeQuarters;\nvar faThermometerThreeQuarters = faTemperatureThreeQuarters;\nvar faTengeSign = {\n  prefix: 'fas',\n  iconName: 'tenge-sign',\n  icon: [384, 512, [8376, \"tenge\"], \"f7d7\", \"M0 64C0 46.33 14.33 32 32 32H352C369.7 32 384 46.33 384 64C384 81.67 369.7 96 352 96H32C14.33 96 0 81.67 0 64zM0 192C0 174.3 14.33 160 32 160H352C369.7 160 384 174.3 384 192C384 209.7 369.7 224 352 224H224V448C224 465.7 209.7 480 192 480C174.3 480 160 465.7 160 448V224H32C14.33 224 0 209.7 0 192z\"]\n};\nvar faTenge = faTengeSign;\nvar faTent = {\n  prefix: 'fas',\n  iconName: 'tent',\n  icon: [576, 512, [], \"e57d\", \"M269.4 5.961C280.5-1.987 295.5-1.987 306.6 5.961L530.6 165.1C538 171.2 542.8 179.4 543.8 188.5L575.8 476.5C576.8 485.5 573.9 494.6 567.8 501.3C561.8 508.1 553.1 512 544 512H416L288 288V512H32C22.9 512 14.23 508.1 8.156 501.3C2.086 494.6-.8093 485.5 .1958 476.5L32.2 188.5C33.2 179.4 38 171.2 45.4 165.1L269.4 5.961z\"]\n};\nvar faTentArrowDownToLine = {\n  prefix: 'fas',\n  iconName: 'tent-arrow-down-to-line',\n  icon: [640, 512, [], \"e57e\", \"M241.8 111.9C250.7 121.8 249.9 136.1 240.1 145.8L160.1 217.8C150.9 226.1 137.1 226.1 127.9 217.8L47.94 145.8C38.09 136.1 37.29 121.8 46.16 111.9C55.03 102.1 70.2 101.3 80.05 110.2L119.1 146.1V24C119.1 10.75 130.7 0 143.1 0C157.3 0 167.1 10.75 167.1 24V146.1L207.9 110.2C217.8 101.3 232.1 102.1 241.8 111.9H241.8zM364.6 134.5C376.1 125.8 391.9 125.8 403.4 134.5L571.4 262.5C578 267.6 582.4 275 583.6 283.3L608.4 448C625.9 448.2 640 462.4 640 480C640 497.7 625.7 512 608 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H159.6L184.4 283.3C185.6 275 189.1 267.6 196.6 262.5L364.6 134.5zM384 448H460.8L384 320V448z\"]\n};\nvar faTentArrowLeftRight = {\n  prefix: 'fas',\n  iconName: 'tent-arrow-left-right',\n  icon: [576, 512, [], \"e57f\", \"M568.1 78.16C573.1 82.71 576 89.2 576 96C576 102.8 573.1 109.3 568.1 113.8L488.1 185.8C478.2 194.7 463 193.9 454.2 184.1C445.3 174.2 446.1 159 455.9 150.2L489.5 120H86.54L120.1 150.2C129.9 159 130.7 174.2 121.8 184.1C112.1 193.9 97.8 194.7 87.94 185.8L7.945 113.8C2.888 109.3 0 102.8 0 96C0 89.2 2.888 82.71 7.945 78.16L87.94 6.161C97.8-2.706 112.1-1.907 121.8 7.945C130.7 17.8 129.9 32.97 120.1 41.84L86.54 72H489.5L455.9 41.84C446.1 32.97 445.3 17.8 454.2 7.945C463-1.907 478.2-2.706 488.1 6.161L568.1 78.16zM475.4 294.5C482 299.6 486.4 307 487.6 315.3L511.6 475.3C513 484.5 510.3 493.8 504.2 500.9C498.2 507.9 489.3 512 480 512H384L287.1 352V512H96C86.68 512 77.83 507.9 71.75 500.9C65.67 493.8 62.97 484.5 64.35 475.3L88.35 315.3C89.59 307 93.98 299.6 100.6 294.5L268.6 166.5C280.1 157.8 295.9 157.8 307.4 166.5L475.4 294.5z\"]\n};\nvar faTentArrowTurnLeft = {\n  prefix: 'fas',\n  iconName: 'tent-arrow-turn-left',\n  icon: [576, 512, [], \"e580\", \"M86.54 72H456C522.3 72 576 125.7 576 192V232C576 245.3 565.3 256 552 256C538.7 256 528 245.3 528 232V192C528 152.2 495.8 120 456 120H86.54L120.1 150.2C129.9 159 130.7 174.2 121.8 184.1C112.1 193.9 97.8 194.7 87.94 185.8L7.945 113.8C2.888 109.3 0 102.8 0 96C0 89.2 2.888 82.71 7.945 78.16L87.94 6.161C97.8-2.706 112.1-1.907 121.8 7.945C130.7 17.8 129.9 32.97 120.1 41.84L86.54 72zM475.4 294.5C482 299.6 486.4 307 487.6 315.3L511.6 475.3C513 484.5 510.3 493.8 504.2 500.9C498.2 507.9 489.3 512 480 512H384L287.1 352V512H96C86.68 512 77.83 507.9 71.75 500.9C65.67 493.8 62.97 484.5 64.35 475.3L88.35 315.3C89.59 307 93.98 299.6 100.6 294.5L268.6 166.5C280.1 157.8 295.9 157.8 307.4 166.5L475.4 294.5z\"]\n};\nvar faTentArrowsDown = {\n  prefix: 'fas',\n  iconName: 'tent-arrows-down',\n  icon: [576, 512, [], \"e581\", \"M209.8 111.9C218.7 121.8 217.9 136.1 208.1 145.8L128.1 217.8C118.9 226.1 105.1 226.1 95.94 217.8L15.94 145.8C6.093 136.1 5.294 121.8 14.16 111.9C23.03 102.1 38.2 101.3 48.06 110.2L88 146.1V24C88 10.75 98.75 0 112 0C125.3 0 136 10.75 136 24V146.1L175.9 110.2C185.8 101.3 200.1 102.1 209.8 111.9H209.8zM561.8 111.9C570.7 121.8 569.9 136.1 560.1 145.8L480.1 217.8C470.9 226.1 457.1 226.1 447.9 217.8L367.9 145.8C358.1 136.1 357.3 121.8 366.2 111.9C375 102.1 390.2 101.3 400.1 110.2L440 146.1V24C440 10.75 450.7 0 464 0C477.3 0 488 10.75 488 24V146.1L527.9 110.2C537.8 101.3 552.1 102.1 561.8 111.9H561.8zM475.4 294.5C482 299.6 486.4 307 487.6 315.3L511.6 475.3C513 484.5 510.3 493.8 504.2 500.9C498.2 507.9 489.3 512 480 512H384L287.1 352V512H96C86.68 512 77.83 507.9 71.75 500.9C65.67 493.8 62.97 484.5 64.35 475.3L88.35 315.3C89.59 307 93.98 299.6 100.6 294.5L268.6 166.5C280.1 157.8 295.9 157.8 307.4 166.5L475.4 294.5z\"]\n};\nvar faTents = {\n  prefix: 'fas',\n  iconName: 'tents',\n  icon: [640, 512, [], \"e582\", \"M396.6 6.546C408.1-2.182 423.9-2.182 435.4 6.546L603.4 134.5C610 139.6 614.4 147 615.6 155.3L639.6 315.3C641 324.5 638.3 333.8 632.2 340.9C626.2 347.9 617.3 352 608 352H461.5L455.3 310.5C452.8 294 444 279.2 430.8 269.1L262.8 141.1C254.6 134.9 245.4 130.9 235.8 129.1L396.6 6.546zM411.4 294.5C418 299.6 422.4 307 423.6 315.3L447.6 475.3C449 484.5 446.3 493.8 440.2 500.9C434.2 507.9 425.3 512 416 512H319.1L223.1 352V512H32C22.68 512 13.83 507.9 7.753 500.9C1.674 493.8-1.028 484.5 .3542 475.3L24.35 315.3C25.59 307 29.98 299.6 36.61 294.5L204.6 166.5C216.1 157.8 231.9 157.8 243.4 166.5L411.4 294.5z\"]\n};\nvar faTerminal = {\n  prefix: 'fas',\n  iconName: 'terminal',\n  icon: [576, 512, [], \"f120\", \"M9.372 86.63C-3.124 74.13-3.124 53.87 9.372 41.37C21.87 28.88 42.13 28.88 54.63 41.37L246.6 233.4C259.1 245.9 259.1 266.1 246.6 278.6L54.63 470.6C42.13 483.1 21.87 483.1 9.372 470.6C-3.124 458.1-3.124 437.9 9.372 425.4L178.7 256L9.372 86.63zM544 416C561.7 416 576 430.3 576 448C576 465.7 561.7 480 544 480H256C238.3 480 224 465.7 224 448C224 430.3 238.3 416 256 416H544z\"]\n};\nvar faTextHeight = {\n  prefix: 'fas',\n  iconName: 'text-height',\n  icon: [576, 512, [], \"f034\", \"M288 32.01H32c-17.67 0-32 14.31-32 32v64c0 17.69 14.33 32 32 32s32-14.31 32-32v-32h64v320H96c-17.67 0-32 14.31-32 32s14.33 32 32 32h128c17.67 0 32-14.31 32-32s-14.33-32-32-32H192v-320h64v32c0 17.69 14.33 32 32 32s32-14.31 32-32v-64C320 46.33 305.7 32.01 288 32.01zM521.4 361.4L512 370.8V141.3l9.375 9.375C527.6 156.9 535.8 160 544 160s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25l-64-64c-12.5-12.5-32.75-12.5-45.25 0l-64 64c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0L448 141.3v229.5l-9.375-9.375c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25l64 64C463.6 476.9 471.8 480 480 480s16.38-3.118 22.62-9.368l64-64c12.5-12.5 12.5-32.75 0-45.25S533.9 348.9 521.4 361.4z\"]\n};\nvar faTextSlash = {\n  prefix: 'fas',\n  iconName: 'text-slash',\n  icon: [640, 512, [\"remove-format\"], \"f87d\", \"M352 416H306.7l18.96-64.1L271.4 308.5L239.1 416H192c-17.67 0-32 14.31-32 32s14.33 31.99 31.1 31.99h160C369.7 480 384 465.7 384 448S369.7 416 352 416zM630.8 469.1l-276.4-216.7l45.63-156.5H512v32c0 17.69 14.33 32 32 32s32-14.31 32-32v-64c0-17.69-14.33-32-32-32H192c-17.67 0-32 14.31-32 32v36.11L38.81 5.13c-10.47-8.219-25.53-6.37-33.7 4.068s-6.349 25.54 4.073 33.69l591.1 463.1c4.406 3.469 9.61 5.127 14.8 5.127c7.125 0 14.17-3.164 18.9-9.195C643.1 492.4 641.2 477.3 630.8 469.1zM300.1 209.9l-82.08-64.33C221.5 140.5 224 134.7 224 128v-32h109.3L300.1 209.9z\"]\n};\nvar faRemoveFormat = faTextSlash;\nvar faTextWidth = {\n  prefix: 'fas',\n  iconName: 'text-width',\n  icon: [448, 512, [], \"f035\", \"M416 32.01H32c-17.67 0-32 14.31-32 32v63.1c0 17.69 14.33 32 32 32s32-14.31 32-32v-32h128v128H176c-17.67 0-32 14.31-32 31.1s14.33 32 32 32h96c17.67 0 32-14.31 32-32s-14.33-31.1-32-31.1H256v-128h128v32c0 17.69 14.33 32 32 32s32-14.32 32-32V64.01C448 46.33 433.7 32.01 416 32.01zM374.6 297.4c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25l9.375 9.375h-229.5L118.6 342.6c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-64 64c-12.5 12.5-12.5 32.75 0 45.25l64 64C79.63 476.9 87.81 480 96 480s16.38-3.118 22.62-9.368c12.5-12.5 12.5-32.75 0-45.25l-9.375-9.375h229.5l-9.375 9.375c-12.5 12.5-12.5 32.75 0 45.25C335.6 476.9 343.8 480 352 480s16.38-3.118 22.62-9.368l64-64c12.5-12.5 12.5-32.75 0-45.25L374.6 297.4z\"]\n};\nvar faThermometer = {\n  prefix: 'fas',\n  iconName: 'thermometer',\n  icon: [512, 512, [], \"f491\", \"M483.1 162.6L229.8 415.9l-99.87-.0001l-88.99 89.02c-9.249 9.377-24.5 9.377-33.87 0c-9.374-9.252-9.374-24.51 0-33.88l88.99-89.02l.0003-100.9l49.05-49.39l51.6 51.59c3.125 3.126 7.218 4.688 11.31 4.688s8.187-1.563 11.31-4.688c6.249-6.252 6.249-16.38 0-22.63L167.6 209.1l41.24-41.52l51.81 51.81c3.125 3.126 7.218 4.688 11.31 4.688s8.187-1.563 11.31-4.688c6.249-6.252 6.249-16.38 0-22.63L231.4 144.8l41.24-41.52l52.02 52.02c3.125 3.126 7.218 4.688 11.31 4.688s8.187-1.563 11.31-4.688c6.249-6.252 6.249-16.38 0-22.63l-52.09-52.09l49.68-50.02c36.37-36.51 94.37-40.88 131.9-10.25C526.2 61.11 518.9 127.8 483.1 162.6z\"]\n};\nvar faThumbsDown = {\n  prefix: 'fas',\n  iconName: 'thumbs-down',\n  icon: [512, 512, [61576, 128078], \"f165\", \"M96 32.04H32c-17.67 0-32 14.32-32 31.1v223.1c0 17.67 14.33 31.1 32 31.1h64c17.67 0 32-14.33 32-31.1V64.03C128 46.36 113.7 32.04 96 32.04zM467.3 240.2C475.1 231.7 480 220.4 480 207.9c0-23.47-16.87-42.92-39.14-47.09C445.3 153.6 448 145.1 448 135.1c0-21.32-14-39.18-33.25-45.43C415.5 87.12 416 83.61 416 79.98C416 53.47 394.5 32 368 32h-58.69c-34.61 0-68.28 11.22-95.97 31.98L179.2 89.57C167.1 98.63 160 112.9 160 127.1l.1074 160c0 0-.0234-.0234 0 0c.0703 13.99 6.123 27.94 17.91 37.36l16.3 13.03C276.2 403.9 239.4 480 302.5 480c30.96 0 49.47-24.52 49.47-48.11c0-15.15-11.76-58.12-34.52-96.02H464c26.52 0 48-21.47 48-47.98C512 262.5 492.2 241.9 467.3 240.2z\"]\n};\nvar faThumbsUp = {\n  prefix: 'fas',\n  iconName: 'thumbs-up',\n  icon: [512, 512, [61575, 128077], \"f164\", \"M128 447.1V223.1c0-17.67-14.33-31.1-32-31.1H32c-17.67 0-32 14.33-32 31.1v223.1c0 17.67 14.33 31.1 32 31.1h64C113.7 479.1 128 465.6 128 447.1zM512 224.1c0-26.5-21.48-47.98-48-47.98h-146.5c22.77-37.91 34.52-80.88 34.52-96.02C352 56.52 333.5 32 302.5 32c-63.13 0-26.36 76.15-108.2 141.6L178 186.6C166.2 196.1 160.2 210 160.1 224c-.0234 .0234 0 0 0 0L160 384c0 15.1 7.113 29.33 19.2 38.39l34.14 25.59C241 468.8 274.7 480 309.3 480H368c26.52 0 48-21.47 48-47.98c0-3.635-.4805-7.143-1.246-10.55C434 415.2 448 397.4 448 376c0-9.148-2.697-17.61-7.139-24.88C463.1 347 480 327.5 480 304.1c0-12.5-4.893-23.78-12.72-32.32C492.2 270.1 512 249.5 512 224.1z\"]\n};\nvar faThumbtack = {\n  prefix: 'fas',\n  iconName: 'thumbtack',\n  icon: [384, 512, [128392, 128204, \"thumb-tack\"], \"f08d\", \"M32 32C32 14.33 46.33 0 64 0H320C337.7 0 352 14.33 352 32C352 49.67 337.7 64 320 64H290.5L301.9 212.2C338.6 232.1 367.5 265.4 381.4 306.9L382.4 309.9C385.6 319.6 383.1 330.4 377.1 338.7C371.9 347.1 362.3 352 352 352H32C21.71 352 12.05 347.1 6.04 338.7C.0259 330.4-1.611 319.6 1.642 309.9L2.644 306.9C16.47 265.4 45.42 232.1 82.14 212.2L93.54 64H64C46.33 64 32 49.67 32 32zM224 384V480C224 497.7 209.7 512 192 512C174.3 512 160 497.7 160 480V384H224z\"]\n};\nvar faThumbTack = faThumbtack;\nvar faTicket = {\n  prefix: 'fas',\n  iconName: 'ticket',\n  icon: [576, 512, [127903], \"f145\", \"M128 160H448V352H128V160zM512 64C547.3 64 576 92.65 576 128V208C549.5 208 528 229.5 528 256C528 282.5 549.5 304 576 304V384C576 419.3 547.3 448 512 448H64C28.65 448 0 419.3 0 384V304C26.51 304 48 282.5 48 256C48 229.5 26.51 208 0 208V128C0 92.65 28.65 64 64 64H512zM96 352C96 369.7 110.3 384 128 384H448C465.7 384 480 369.7 480 352V160C480 142.3 465.7 128 448 128H128C110.3 128 96 142.3 96 160V352z\"]\n};\nvar faTicketSimple = {\n  prefix: 'fas',\n  iconName: 'ticket-simple',\n  icon: [576, 512, [\"ticket-alt\"], \"f3ff\", \"M0 128C0 92.65 28.65 64 64 64H512C547.3 64 576 92.65 576 128V208C549.5 208 528 229.5 528 256C528 282.5 549.5 304 576 304V384C576 419.3 547.3 448 512 448H64C28.65 448 0 419.3 0 384V304C26.51 304 48 282.5 48 256C48 229.5 26.51 208 0 208V128z\"]\n};\nvar faTicketAlt = faTicketSimple;\nvar faTimeline = {\n  prefix: 'fas',\n  iconName: 'timeline',\n  icon: [640, 512, [], \"e29c\", \"M160 224H480V169.3C451.7 156.1 432 128.8 432 96C432 51.82 467.8 16 512 16C556.2 16 592 51.82 592 96C592 128.8 572.3 156.1 544 169.3V224H608C625.7 224 640 238.3 640 256C640 273.7 625.7 288 608 288H352V342.7C380.3 355 400 383.2 400 416C400 460.2 364.2 496 320 496C275.8 496 240 460.2 240 416C240 383.2 259.7 355 288 342.7V288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H96V169.3C67.75 156.1 48 128.8 48 96C48 51.82 83.82 16 128 16C172.2 16 208 51.82 208 96C208 128.8 188.3 156.1 160 169.3V224zM128 120C141.3 120 152 109.3 152 96C152 82.75 141.3 72 128 72C114.7 72 104 82.75 104 96C104 109.3 114.7 120 128 120zM512 72C498.7 72 488 82.75 488 96C488 109.3 498.7 120 512 120C525.3 120 536 109.3 536 96C536 82.75 525.3 72 512 72zM320 440C333.3 440 344 429.3 344 416C344 402.7 333.3 392 320 392C306.7 392 296 402.7 296 416C296 429.3 306.7 440 320 440z\"]\n};\nvar faToggleOff = {\n  prefix: 'fas',\n  iconName: 'toggle-off',\n  icon: [576, 512, [], \"f204\", \"M192 352C138.1 352 96 309 96 256C96 202.1 138.1 160 192 160C245 160 288 202.1 288 256C288 309 245 352 192 352zM384 448H192C85.96 448 0 362 0 256C0 149.1 85.96 64 192 64H384C490 64 576 149.1 576 256C576 362 490 448 384 448zM384 128H192C121.3 128 64 185.3 64 256C64 326.7 121.3 384 192 384H384C454.7 384 512 326.7 512 256C512 185.3 454.7 128 384 128z\"]\n};\nvar faToggleOn = {\n  prefix: 'fas',\n  iconName: 'toggle-on',\n  icon: [576, 512, [], \"f205\", \"M384 64C490 64 576 149.1 576 256C576 362 490 448 384 448H192C85.96 448 0 362 0 256C0 149.1 85.96 64 192 64H384zM384 352C437 352 480 309 480 256C480 202.1 437 160 384 160C330.1 160 288 202.1 288 256C288 309 330.1 352 384 352z\"]\n};\nvar faToilet = {\n  prefix: 'fas',\n  iconName: 'toilet',\n  icon: [448, 512, [128701], \"f7d8\", \"M432 48C440.8 48 448 40.75 448 32V16C448 7.25 440.8 0 432 0h-416C7.25 0 0 7.25 0 16V32c0 8.75 7.25 16 16 16H32v158.7C11.82 221.2 0 237.1 0 256c0 60.98 33.28 115.2 84.1 150.4l-19.59 64.36C59.16 491.3 74.53 512 96.03 512h255.9c21.5 0 36.88-20.75 30.62-41.25L363 406.4C414.7 371.2 448 316.1 448 256c0-18.04-11.82-34.85-32-49.26V48H432zM96 72C96 67.63 99.63 64 104 64h48C156.4 64 160 67.63 160 72v16C160 92.38 156.4 96 152 96h-48C99.63 96 96 92.38 96 88V72zM224 288C135.6 288 64 273.7 64 256c0-17.67 71.63-32 160-32s160 14.33 160 32C384 273.7 312.4 288 224 288z\"]\n};\nvar faToiletPaper = {\n  prefix: 'fas',\n  iconName: 'toilet-paper',\n  icon: [576, 512, [129531], \"f71e\", \"M127.1 0C74.98 0 31.98 86 31.98 192v172.1c0 41.12-9.751 62.75-31.13 126.9C-2.65 501.2 5.101 512 15.98 512h280.9c13.88 0 26-8.75 30.38-21.88c12.88-38.5 24.75-72.37 24.75-126L351.1 192c0-83.62 23.62-153.5 60.5-192H127.1zM95.99 224C87.11 224 79.99 216.9 79.99 208S87.11 192 95.99 192s16 7.125 16 16S104.9 224 95.99 224zM159.1 224c-8.875 0-16-7.125-16-16S151.1 192 159.1 192s16 7.125 16 16S168.9 224 159.1 224zM223.1 224C215.1 224 207.1 216.9 207.1 208S215.1 192 223.1 192c8.875 0 16 7.125 16 16S232.9 224 223.1 224zM287.1 224C279.1 224 271.1 216.9 271.1 208S279.1 192 287.1 192c8.875 0 16 7.125 16 16S296.9 224 287.1 224zM479.1 0c-53 0-96 86.06-96 192.1C383.1 298.1 426.1 384 479.1 384S576 298 576 192C576 86 532.1 0 479.1 0zM479.1 256c-17.63 0-32-28.62-32-64s14.38-64 32-64c17.63 0 32 28.62 32 64S497.6 256 479.1 256z\"]\n};\nvar faToiletPaperSlash = {\n  prefix: 'fas',\n  iconName: 'toilet-paper-slash',\n  icon: [640, 512, [], \"e072\", \"M63.98 191.1v172.1c0 41.12-9.75 62.75-31.13 126.9c-3.5 10.25 4.25 20.1 15.13 20.1l280.9-.0059c13.87 0 25.1-8.75 30.37-21.87c10.08-30.15 19.46-57.6 23.1-93.78L66.51 148.8C64.9 162.7 63.98 177.1 63.98 191.1zM630.8 469.1l-109.8-86.02c48.75-9.144 86.94-91.2 86.94-191.1C607.1 86 564.1 0 511.1 0s-96 86-96 191.1c0 49.25 9.362 94.03 24.62 128l-56.62-44.38l.0049-83.65c0-83.62 23.62-153.5 60.5-191.1H159.1C135.2 0 112.7 18.93 95.72 49.72L38.81 5.109C34.41 1.672 29.19 0 24.03 0c-7.125 0-14.19 3.156-18.91 9.187C-3.061 19.62-1.249 34.72 9.189 42.89l591.1 463.1c10.5 8.203 25.56 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1zM479.1 191.1c0-35.37 14.37-64 32-64c17.62 0 32 28.63 32 64S529.6 255.1 511.1 255.1C494.4 255.1 479.1 227.4 479.1 191.1z\"]\n};\nvar faToiletPortable = {\n  prefix: 'fas',\n  iconName: 'toilet-portable',\n  icon: [320, 512, [], \"e583\", \"M0 32C0 14.33 14.33 0 32 0H288C305.7 0 320 14.33 320 32V64H0V32zM320 96V488C320 501.3 309.3 512 296 512C282.7 512 272 501.3 272 488V480H48V488C48 501.3 37.25 512 24 512C10.75 512 0 501.3 0 488V96H320zM256 240C256 231.2 248.8 224 240 224C231.2 224 224 231.2 224 240V304C224 312.8 231.2 320 240 320C248.8 320 256 312.8 256 304V240z\"]\n};\nvar faToiletsPortable = {\n  prefix: 'fas',\n  iconName: 'toilets-portable',\n  icon: [576, 512, [], \"e584\", \"M224 0C241.7 0 256 14.33 256 32V64H0V32C0 14.33 14.33 0 32 0H224zM0 96H256V488C256 501.3 245.3 512 232 512C218.7 512 208 501.3 208 488V480H48V488C48 501.3 37.25 512 24 512C10.75 512 0 501.3 0 488V96zM176 240V304C176 312.8 183.2 320 192 320C200.8 320 208 312.8 208 304V240C208 231.2 200.8 224 192 224C183.2 224 176 231.2 176 240zM544 0C561.7 0 576 14.33 576 32V64H320V32C320 14.33 334.3 0 352 0H544zM320 96H576V488C576 501.3 565.3 512 552 512C538.7 512 528 501.3 528 488V480H368V488C368 501.3 357.3 512 344 512C330.7 512 320 501.3 320 488V96zM496 240V304C496 312.8 503.2 320 512 320C520.8 320 528 312.8 528 304V240C528 231.2 520.8 224 512 224C503.2 224 496 231.2 496 240z\"]\n};\nvar faToolbox = {\n  prefix: 'fas',\n  iconName: 'toolbox',\n  icon: [512, 512, [129520], \"f552\", \"M502.6 182.6l-45.25-45.25C451.4 131.4 443.3 128 434.8 128H384V80C384 53.5 362.5 32 336 32h-160C149.5 32 128 53.5 128 80V128H77.25c-8.5 0-16.62 3.375-22.62 9.375L9.375 182.6C3.375 188.6 0 196.8 0 205.3V304h128v-32C128 263.1 135.1 256 144 256h32C184.9 256 192 263.1 192 272v32h128v-32C320 263.1 327.1 256 336 256h32C376.9 256 384 263.1 384 272v32h128V205.3C512 196.8 508.6 188.6 502.6 182.6zM336 128h-160V80h160V128zM384 368c0 8.875-7.125 16-16 16h-32c-8.875 0-16-7.125-16-16v-32H192v32C192 376.9 184.9 384 176 384h-32C135.1 384 128 376.9 128 368v-32H0V448c0 17.62 14.38 32 32 32h448c17.62 0 32-14.38 32-32v-112h-128V368z\"]\n};\nvar faTooth = {\n  prefix: 'fas',\n  iconName: 'tooth',\n  icon: [448, 512, [129463], \"f5c9\", \"M394.1 212.8c-20.04 27.67-28.07 60.15-31.18 93.95c-3.748 41.34-8.785 82.46-17.89 122.8l-6.75 29.64c-2.68 12.14-13.29 20.78-25.39 20.78c-12 0-22.39-8.311-25.29-20.23l-29.57-121.2C254.1 322.6 240.1 311.4 224 311.4c-16.18 0-30.21 11.26-34.07 27.23l-29.57 121.2c-2.893 11.92-13.39 20.23-25.29 20.23c-12.21 0-22.71-8.639-25.5-20.78l-6.643-29.64c-9.105-40.36-14.14-81.48-17.1-122.8C81.93 272.1 73.9 240.5 53.86 212.8c-18.75-25.92-27.11-60.15-18.43-96.57c9.428-39.59 40.39-71.75 78.85-82.03c20.14-5.25 39.54-.4375 57.32 9.077l86.14 56.54c6.643 4.375 15.11 1.86 18.96-4.264c4.07-6.454 2.25-15.09-4.18-19.36l-24.21-15.86c3-1.531 6.215-2.735 9-4.813c22.39-16.84 48.75-28.65 76.39-21.33c38.46 10.28 69.43 42.43 78.85 82.03C421.2 152.7 412.9 187 394.1 212.8z\"]\n};\nvar faToriiGate = {\n  prefix: 'fas',\n  iconName: 'torii-gate',\n  icon: [512, 512, [9961], \"f6a1\", \"M0 80V0L71.37 23.79C87.68 29.23 104.8 32 121.1 32H390C407.2 32 424.3 29.23 440.6 23.79L512 0V80C512 106.5 490.5 128 464 128H448V192H384V128H288V192H224V128H128V192H64V128H48C21.49 128 0 106.5 0 80zM32 288C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H448V480C448 497.7 433.7 512 416 512C398.3 512 384 497.7 384 480V288H128V480C128 497.7 113.7 512 96 512C78.33 512 64 497.7 64 480V288H32z\"]\n};\nvar faTornado = {\n  prefix: 'fas',\n  iconName: 'tornado',\n  icon: [448, 512, [127786], \"f76f\", \"M407.8 42.09c7.531-6.562 10.22-17.12 6.688-26.5C410.1 6.219 401.1 0 391.1 0L24.16 .0313c-13 0-23.66 10.38-24 23.38C-.5495 50.32 1.349 74.22 4.945 95.98h353.9C367.9 80.76 383.4 63.34 407.8 42.09zM387.7 195.9c-22.02-25.33-38.96-44.87-39-67.93H12.05c11.47 40.4 30.38 71.34 53.15 96h345.8C403.4 214.1 395.4 204.8 387.7 195.9zM303.6 485.3c-1.125 10.12 4.249 19.84 13.44 24.28C320.3 511.2 323.9 512 327.4 512c6.219 0 12.34-2.406 16.94-7c43.73-43.61 73.32-83.63 89.35-121h-148.6C300.8 408.6 308.7 440 303.6 485.3zM431.7 255.1H100.5C127.1 276.3 155.8 291.6 182.4 305.8c28.14 15.01 54.04 28.9 74.73 46.14h186.8C446.4 341.1 447.1 330.4 448 320C448 295.4 441.4 274.6 431.7 255.1z\"]\n};\nvar faTowerBroadcast = {\n  prefix: 'fas',\n  iconName: 'tower-broadcast',\n  icon: [576, 512, [\"broadcast-tower\"], \"f519\", \"M160.9 59.01C149.3 52.6 134.7 56.76 128.3 68.39C117.6 87.6 112 109.4 112 131.4c0 19.03 4.031 37.44 11.98 54.62c4.047 8.777 12.73 13.93 21.8 13.93c3.375 0 6.797-.7187 10.05-2.219C167.9 192.2 173.1 177.1 167.5 165.9C162.5 155.1 160 143.5 160 131.4c0-13.93 3.547-27.69 10.25-39.81C176.7 80.04 172.5 65.42 160.9 59.01zM62.61 2.363C46.17-4.32 27.58 3.676 20.95 20.02C7.047 54.36 0 90.69 0 127.1C0 165.3 7.047 201.7 20.95 236C25.98 248.5 37.97 256 50.63 256C54.61 256 58.69 255.3 62.61 253.7C79 247 86.91 228.4 80.27 212C69.47 185.3 64 157.1 64 128c0-29.06 5.469-57.3 16.27-83.99C86.91 27.64 79 8.988 62.61 2.363zM555 20.02c-6.609-16.41-25.23-24.31-41.66-17.66c-16.39 6.625-24.3 25.28-17.66 41.65C506.5 70.7 512 98.95 512 128c0 29.06-5.469 57.31-16.27 83.1C489.1 228.4 497 247 513.4 253.7C517.3 255.3 521.4 256 525.4 256c12.66 0 24.64-7.562 29.67-20C568.1 201.7 576 165.3 576 127.1C576 90.69 568.1 54.36 555 20.02zM420.2 58.23c-12.03 5.562-17.28 19.81-11.72 31.84C413.5 100.9 416 112.5 416 124.6c0 13.94-3.547 27.69-10.25 39.81c-6.422 11.59-2.219 26.22 9.375 32.62c3.688 2.031 7.672 3 11.61 3c8.438 0 16.64-4.47 21.02-12.37C458.4 168.4 464 146.6 464 124.6c0-19.03-4.031-37.43-11.98-54.62C446.5 57.89 432.1 52.7 420.2 58.23zM301.8 65.45C260.5 56.78 224 88.13 224 128c0 23.63 12.95 44.04 32 55.12v296.9c0 17.67 14.33 32 32 32s32-14.33 32-32V183.1c23.25-13.54 37.42-40.96 30.03-71.18C344.4 88.91 325 70.31 301.8 65.45z\"]\n};\nvar faBroadcastTower = faTowerBroadcast;\nvar faTowerCell = {\n  prefix: 'fas',\n  iconName: 'tower-cell',\n  icon: [576, 512, [], \"e585\", \"M62.62 2.339C78.1 8.97 86.9 27.63 80.27 44.01C69.79 69.9 64 98.24 64 128C64 157.8 69.79 186.1 80.27 211.1C86.9 228.4 78.1 247 62.62 253.7C46.23 260.3 27.58 252.4 20.95 236C7.428 202.6 0 166.1 0 128C0 89.87 7.428 53.39 20.95 19.99C27.58 3.612 46.23-4.293 62.62 2.339V2.339zM513.4 2.339C529.8-4.293 548.4 3.612 555.1 19.99C568.6 53.39 576 89.87 576 128C576 166.1 568.6 202.6 555.1 236C548.4 252.4 529.8 260.3 513.4 253.7C497 247 489.1 228.4 495.7 211.1C506.2 186.1 512 157.8 512 128C512 98.24 506.2 69.9 495.7 44.01C489.1 27.63 497 8.969 513.4 2.338V2.339zM477.1 466.8C484.4 482.8 477.3 501.8 461.2 509.1C445.2 516.4 426.2 509.3 418.9 493.2L398.3 448H177.7L157.1 493.2C149.8 509.3 130.8 516.4 114.8 509.1C98.67 501.8 91.56 482.8 98.87 466.8L235.9 165.2C228.4 154.7 224 141.9 224 128C224 92.65 252.7 64 288 64C323.3 64 352 92.65 352 128C352 141.9 347.6 154.7 340.1 165.2L477.1 466.8zM369.2 384L354.7 352H221.3L206.8 384H369.2zM250.4 288H325.6L288 205.3L250.4 288zM152 128C152 147.4 156 165.8 163.3 182.4C168.6 194.5 163.1 208.7 150.9 213.1C138.8 219.3 124.6 213.8 119.3 201.6C109.5 179 104 154.1 104 128C104 101.9 109.5 76.96 119.3 54.39C124.6 42.25 138.8 36.7 150.9 42.01C163.1 47.31 168.6 61.46 163.3 73.61C156 90.23 152 108.6 152 128V128zM472 128C472 154.1 466.5 179 456.7 201.6C451.4 213.8 437.2 219.3 425.1 213.1C412.9 208.7 407.4 194.5 412.7 182.4C419.1 165.8 424 147.4 424 128C424 108.6 419.1 90.24 412.7 73.61C407.4 61.46 412.9 47.32 425.1 42.01C437.2 36.7 451.4 42.25 456.7 54.39C466.5 76.96 472 101.9 472 128V128z\"]\n};\nvar faTowerObservation = {\n  prefix: 'fas',\n  iconName: 'tower-observation',\n  icon: [512, 512, [], \"e586\", \"M241.7 3.378C250.7-1.126 261.3-1.126 270.3 3.378L430.3 83.38C446.1 91.28 452.5 110.5 444.6 126.3C439 137.5 427.7 143.1 416 144V224C416 241.7 401.7 256 384 256H379.1L411.1 448H480C497.7 448 512 462.3 512 480C512 497.7 497.7 512 480 512H384.5C384.2 512 383.8 512 383.4 512H128.6C128.2 512 127.9 512 127.5 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H100.9L132.9 256H128C110.3 256 96 241.7 96 224V144C84.27 143.1 72.98 137.5 67.38 126.3C59.47 110.5 65.88 91.28 81.69 83.38L241.7 3.378zM314.5 448L256 399.2L197.5 448H314.5zM193.1 284.3L256 336.8L318.9 284.3L314.2 256H197.8L193.1 284.3zM183.9 339.2L172.8 406.1L218.5 368L183.9 339.2zM293.5 368L339.2 406.1L328.1 339.2L293.5 368zM176 128C167.2 128 160 135.2 160 144C160 152.8 167.2 160 176 160H336C344.8 160 352 152.8 352 144C352 135.2 344.8 128 336 128H176z\"]\n};\nvar faTractor = {\n  prefix: 'fas',\n  iconName: 'tractor',\n  icon: [640, 512, [128668], \"f722\", \"M96 64C96 28.65 124.7 0 160 0H266.3C292.5 0 316 15.93 325.8 40.23L373.7 160H480V126.2C480 101.4 485.8 76.88 496.9 54.66L499.4 49.69C507.3 33.88 526.5 27.47 542.3 35.38C558.1 43.28 564.5 62.5 556.6 78.31L554.1 83.28C547.5 96.61 544 111.3 544 126.2V160H600C622.1 160 640 177.9 640 200V245.4C640 261.9 631.5 277.3 617.4 286.1L574.1 313.2C559.9 307.3 544.3 304 528 304C488.7 304 453.9 322.9 431.1 352H352C352 369.7 337.7 384 320 384H311.8C310.1 388.8 308.2 393.5 305.1 398.1L311.8 403.9C324.3 416.4 324.3 436.6 311.8 449.1L289.1 471.8C276.6 484.3 256.4 484.3 243.9 471.8L238.1 465.1C233.5 468.2 228.8 470.1 224 471.8V480C224 497.7 209.7 512 192 512H160C142.3 512 128 497.7 128 480V471.8C123.2 470.1 118.5 468.2 113.9 465.1L108.1 471.8C95.62 484.3 75.36 484.3 62.86 471.8L40.24 449.1C27.74 436.6 27.74 416.4 40.24 403.9L46.03 398.1C43.85 393.5 41.9 388.8 40.19 384H32C14.33 384 0 369.7 0 352V320C0 302.3 14.33 288 32 288H40.19C41.9 283.2 43.85 278.5 46.03 273.9L40.24 268.1C27.74 255.6 27.74 235.4 40.24 222.9L62.86 200.2C71.82 191.3 84.78 188.7 96 192.6L96 64zM160 64V160H304.7L266.3 64H160zM176 256C131.8 256 96 291.8 96 336C96 380.2 131.8 416 176 416C220.2 416 256 380.2 256 336C256 291.8 220.2 256 176 256zM440 424C440 394.2 454.8 367.9 477.4 352C491.7 341.9 509.2 336 528 336C530.7 336 533.3 336.1 535.9 336.3C580.8 340.3 616 378.1 616 424C616 472.6 576.6 512 528 512C479.4 512 440 472.6 440 424zM528 448C541.3 448 552 437.3 552 424C552 410.7 541.3 400 528 400C514.7 400 504 410.7 504 424C504 437.3 514.7 448 528 448z\"]\n};\nvar faTrademark = {\n  prefix: 'fas',\n  iconName: 'trademark',\n  icon: [640, 512, [8482], \"f25c\", \"M618.1 97.67c-13.02-4.375-27.45 .1562-35.72 11.16L464 266.7l-118.4-157.8c-8.266-11.03-22.64-15.56-35.72-11.16C296.8 102 288 114.2 288 128v256c0 17.69 14.33 32 32 32s32-14.31 32-32v-160l86.41 115.2c12.06 16.12 39.13 16.12 51.19 0L576 224v160c0 17.69 14.33 32 32 32s32-14.31 32-32v-256C640 114.2 631.2 102 618.1 97.67zM224 96.01H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h64v223.1c0 17.69 14.33 31.99 32 31.99s32-14.3 32-31.99V160h64c17.67 0 32-14.31 32-32S241.7 96.01 224 96.01z\"]\n};\nvar faTrafficLight = {\n  prefix: 'fas',\n  iconName: 'traffic-light',\n  icon: [320, 512, [128678], \"f637\", \"M256 0C291.3 0 320 28.65 320 64V352C320 440.4 248.4 512 160 512C71.63 512 0 440.4 0 352V64C0 28.65 28.65 0 64 0H256zM160 320C133.5 320 112 341.5 112 368C112 394.5 133.5 416 160 416C186.5 416 208 394.5 208 368C208 341.5 186.5 320 160 320zM160 288C186.5 288 208 266.5 208 240C208 213.5 186.5 192 160 192C133.5 192 112 213.5 112 240C112 266.5 133.5 288 160 288zM160 64C133.5 64 112 85.49 112 112C112 138.5 133.5 160 160 160C186.5 160 208 138.5 208 112C208 85.49 186.5 64 160 64z\"]\n};\nvar faTrailer = {\n  prefix: 'fas',\n  iconName: 'trailer',\n  icon: [640, 512, [], \"e041\", \"M496 32C522.5 32 544 53.49 544 80V320H608C625.7 320 640 334.3 640 352C640 369.7 625.7 384 608 384H286.9C279.1 329.7 232.4 288 176 288C119.6 288 72.9 329.7 65.13 384H48C21.49 384 0 362.5 0 336V80C0 53.49 21.49 32 48 32H496zM64 112V264.2C73.83 256.1 84.55 249 96 243.2V112C96 103.2 88.84 96 80 96C71.16 96 64 103.2 64 112V112zM176 224C181.4 224 186.7 224.2 192 224.7V112C192 103.2 184.8 96 176 96C167.2 96 160 103.2 160 112V224.7C165.3 224.2 170.6 224 176 224zM256 243.2C267.4 249 278.2 256.1 288 264.2V112C288 103.2 280.8 96 272 96C263.2 96 256 103.2 256 112V243.2zM352 112V304C352 312.8 359.2 320 368 320C376.8 320 384 312.8 384 304V112C384 103.2 376.8 96 368 96C359.2 96 352 103.2 352 112zM480 112C480 103.2 472.8 96 464 96C455.2 96 448 103.2 448 112V304C448 312.8 455.2 320 464 320C472.8 320 480 312.8 480 304V112zM96 400C96 355.8 131.8 320 176 320C220.2 320 256 355.8 256 400C256 444.2 220.2 480 176 480C131.8 480 96 444.2 96 400zM176 432C193.7 432 208 417.7 208 400C208 382.3 193.7 368 176 368C158.3 368 144 382.3 144 400C144 417.7 158.3 432 176 432z\"]\n};\nvar faTrain = {\n  prefix: 'fas',\n  iconName: 'train',\n  icon: [448, 512, [128646], \"f238\", \"M352 0C405 0 448 42.98 448 96V352C448 399.1 412.8 439.7 366.9 446.9L412.9 492.9C419.9 499.9 414.9 512 404.1 512H365.3C356.8 512 348.6 508.6 342.6 502.6L288 448H160L105.4 502.6C99.37 508.6 91.23 512 82.75 512H43.04C33.06 512 28.06 499.9 35.12 492.9L81.14 446.9C35.18 439.7 0 399.1 0 352V96C0 42.98 42.98 0 96 0H352zM64 192C64 209.7 78.33 224 96 224H352C369.7 224 384 209.7 384 192V96C384 78.33 369.7 64 352 64H96C78.33 64 64 78.33 64 96V192zM224 384C250.5 384 272 362.5 272 336C272 309.5 250.5 288 224 288C197.5 288 176 309.5 176 336C176 362.5 197.5 384 224 384z\"]\n};\nvar faTrainSubway = {\n  prefix: 'fas',\n  iconName: 'train-subway',\n  icon: [448, 512, [\"subway\"], \"f239\", \"M352 0C405 0 448 42.98 448 96V352C448 399.1 412.8 439.7 366.9 446.9L412.9 492.9C419.9 499.9 414.9 512 404.1 512H365.3C356.8 512 348.6 508.6 342.6 502.6L288 448H160L105.4 502.6C99.37 508.6 91.23 512 82.75 512H43.04C33.06 512 28.06 499.9 35.12 492.9L81.14 446.9C35.18 439.7 0 399.1 0 352V96C0 42.98 42.98 0 96 0H352zM64 224C64 241.7 78.33 256 96 256H176C193.7 256 208 241.7 208 224V128C208 110.3 193.7 96 176 96H96C78.33 96 64 110.3 64 128V224zM272 96C254.3 96 240 110.3 240 128V224C240 241.7 254.3 256 272 256H352C369.7 256 384 241.7 384 224V128C384 110.3 369.7 96 352 96H272zM96 320C78.33 320 64 334.3 64 352C64 369.7 78.33 384 96 384C113.7 384 128 369.7 128 352C128 334.3 113.7 320 96 320zM352 384C369.7 384 384 369.7 384 352C384 334.3 369.7 320 352 320C334.3 320 320 334.3 320 352C320 369.7 334.3 384 352 384z\"]\n};\nvar faSubway = faTrainSubway;\nvar faTrainTram = {\n  prefix: 'fas',\n  iconName: 'train-tram',\n  icon: [448, 512, [128650, \"tram\"], \"f7da\", \"M86.76 48C74.61 48 63.12 53.52 55.53 63.01L42.74 78.99C34.46 89.34 19.36 91.02 9.007 82.74C-1.343 74.46-3.021 59.36 5.259 49.01L18.04 33.03C34.74 12.15 60.03 0 86.76 0H361.2C387.1 0 413.3 12.15 429.1 33.03L442.7 49.01C451 59.36 449.3 74.46 438.1 82.74C428.6 91.02 413.5 89.34 405.3 78.99L392.5 63.01C384.9 53.52 373.4 48 361.2 48H248V96H288C341 96 384 138.1 384 192V352C384 382.6 369.7 409.8 347.4 427.4L412.9 492.9C419.9 499.9 414.9 512 404.1 512H365.3C356.8 512 348.6 508.6 342.6 502.6L288 448H160L105.4 502.6C99.37 508.6 91.23 512 82.74 512H43.04C33.06 512 28.06 499.9 35.12 492.9L100.6 427.4C78.3 409.8 64 382.6 64 352V192C64 138.1 106.1 96 160 96H200V48H86.76zM160 160C142.3 160 128 174.3 128 192V224C128 241.7 142.3 256 160 256H288C305.7 256 320 241.7 320 224V192C320 174.3 305.7 160 288 160H160zM160 320C142.3 320 128 334.3 128 352C128 369.7 142.3 384 160 384C177.7 384 192 369.7 192 352C192 334.3 177.7 320 160 320zM288 384C305.7 384 320 369.7 320 352C320 334.3 305.7 320 288 320C270.3 320 256 334.3 256 352C256 369.7 270.3 384 288 384z\"]\n};\nvar faTram = faTrainTram;\nvar faTransgender = {\n  prefix: 'fas',\n  iconName: 'transgender',\n  icon: [512, 512, [9895, \"transgender-alt\"], \"f225\", \"M498.6 .0003h-94.37c-17.96 0-26.95 21.71-14.25 34.41L411.1 55.61l-67.01 67.01C318.8 105.9 288.6 96 256 96S193.2 105.9 167.9 122.6L151.6 106.3l6.061-6.062c6.25-6.248 6.25-16.38 0-22.63L146.3 66.34c-6.25-6.248-16.38-6.248-22.63 0L117.7 72.41L100.9 55.61L122.1 34.41c12.7-12.7 3.703-34.41-14.25-34.41H13.44C6.016 .0003 0 6.016 0 13.44v94.37c0 17.96 21.71 26.95 34.41 14.25l21.2-21.2l16.8 16.8L66.35 123.7c-6.25 6.248-6.25 16.38 0 22.63l11.31 11.31c6.25 6.248 16.38 6.248 22.63 0l6.061-6.061L122.6 167.9C105.9 193.2 96 223.4 96 256c0 77.4 54.97 141.9 128 156.8v19.23l-16-.0014c-8.836 0-16 7.165-16 16v15.1c0 8.836 7.164 16 16 16L224 480v16c0 8.836 7.164 16 16 16h32c8.836 0 16-7.164 16-16v-16l16-.0001c8.836 0 16-7.164 16-16v-15.1c0-8.836-7.164-16-16-16L288 432v-19.23c73.03-14.83 128-79.37 128-156.8c0-32.6-9.867-62.85-26.61-88.14l67.01-67.01l21.2 21.2C490.3 134.8 512 125.8 512 107.8V13.44C512 6.016 505.1 .0003 498.6 .0003zM256 336c-44.11 0-80-35.89-80-80c0-44.11 35.89-80 80-80c44.11 0 80 35.89 80 80C336 300.1 300.1 336 256 336z\"]\n};\nvar faTransgenderAlt = faTransgender;\nvar faTrash = {\n  prefix: 'fas',\n  iconName: 'trash',\n  icon: [448, 512, [], \"f1f8\", \"M135.2 17.69C140.6 6.848 151.7 0 163.8 0H284.2C296.3 0 307.4 6.848 312.8 17.69L320 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H128L135.2 17.69zM394.8 466.1C393.2 492.3 372.3 512 346.9 512H101.1C75.75 512 54.77 492.3 53.19 466.1L31.1 128H416L394.8 466.1z\"]\n};\nvar faTrashArrowUp = {\n  prefix: 'fas',\n  iconName: 'trash-arrow-up',\n  icon: [448, 512, [\"trash-restore\"], \"f829\", \"M284.2 0C296.3 0 307.4 6.848 312.8 17.69L320 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H128L135.2 17.69C140.6 6.848 151.7 0 163.8 0H284.2zM31.1 128H416L394.8 466.1C393.2 492.3 372.3 512 346.9 512H101.1C75.75 512 54.77 492.3 53.19 466.1L31.1 128zM207 199L127 279C117.7 288.4 117.7 303.6 127 312.1C136.4 322.3 151.6 322.3 160.1 312.1L199.1 273.9V408C199.1 421.3 210.7 432 223.1 432C237.3 432 248 421.3 248 408V273.9L287 312.1C296.4 322.3 311.6 322.3 320.1 312.1C330.3 303.6 330.3 288.4 320.1 279L240.1 199C236.5 194.5 230.4 191.1 223.1 191.1C217.6 191.1 211.5 194.5 207 199V199z\"]\n};\nvar faTrashRestore = faTrashArrowUp;\nvar faTrashCan = {\n  prefix: 'fas',\n  iconName: 'trash-can',\n  icon: [448, 512, [61460, \"trash-alt\"], \"f2ed\", \"M135.2 17.69C140.6 6.848 151.7 0 163.8 0H284.2C296.3 0 307.4 6.848 312.8 17.69L320 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H128L135.2 17.69zM31.1 128H416V448C416 483.3 387.3 512 352 512H95.1C60.65 512 31.1 483.3 31.1 448V128zM111.1 208V432C111.1 440.8 119.2 448 127.1 448C136.8 448 143.1 440.8 143.1 432V208C143.1 199.2 136.8 192 127.1 192C119.2 192 111.1 199.2 111.1 208zM207.1 208V432C207.1 440.8 215.2 448 223.1 448C232.8 448 240 440.8 240 432V208C240 199.2 232.8 192 223.1 192C215.2 192 207.1 199.2 207.1 208zM304 208V432C304 440.8 311.2 448 320 448C328.8 448 336 440.8 336 432V208C336 199.2 328.8 192 320 192C311.2 192 304 199.2 304 208z\"]\n};\nvar faTrashAlt = faTrashCan;\nvar faTrashCanArrowUp = {\n  prefix: 'fas',\n  iconName: 'trash-can-arrow-up',\n  icon: [448, 512, [\"trash-restore-alt\"], \"f82a\", \"M284.2 0C296.3 0 307.4 6.848 312.8 17.69L320 32H416C433.7 32 448 46.33 448 64C448 81.67 433.7 96 416 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H128L135.2 17.69C140.6 6.848 151.7 0 163.8 0H284.2zM31.1 128H416V448C416 483.3 387.3 512 352 512H95.1C60.65 512 31.1 483.3 31.1 448V128zM207 199L127 279C117.7 288.4 117.7 303.6 127 312.1C136.4 322.3 151.6 322.3 160.1 312.1L199.1 273.9V408C199.1 421.3 210.7 432 223.1 432C237.3 432 248 421.3 248 408V273.9L287 312.1C296.4 322.3 311.6 322.3 320.1 312.1C330.3 303.6 330.3 288.4 320.1 279L240.1 199C236.5 194.5 230.4 191.1 223.1 191.1C217.6 191.1 211.5 194.5 207 199V199z\"]\n};\nvar faTrashRestoreAlt = faTrashCanArrowUp;\nvar faTree = {\n  prefix: 'fas',\n  iconName: 'tree',\n  icon: [448, 512, [127794], \"f1bb\", \"M413.8 447.1L256 448l0 31.99C256 497.7 241.8 512 224.1 512c-17.67 0-32.1-14.32-32.1-31.99l0-31.99l-158.9-.0099c-28.5 0-43.69-34.49-24.69-56.4l68.98-79.59H62.22c-25.41 0-39.15-29.8-22.67-49.13l60.41-70.85H89.21c-21.28 0-32.87-22.5-19.28-37.31l134.8-146.5c10.4-11.3 28.22-11.3 38.62-.0033l134.9 146.5c13.62 14.81 2.001 37.31-19.28 37.31h-10.77l60.35 70.86c16.46 19.34 2.716 49.12-22.68 49.12h-15.2l68.98 79.59C458.7 413.7 443.1 447.1 413.8 447.1z\"]\n};\nvar faTreeCity = {\n  prefix: 'fas',\n  iconName: 'tree-city',\n  icon: [640, 512, [], \"e587\", \"M288 48C288 21.49 309.5 0 336 0H432C458.5 0 480 21.49 480 48V192H520V120C520 106.7 530.7 96 544 96C557.3 96 568 106.7 568 120V192H592C618.5 192 640 213.5 640 240V464C640 490.5 618.5 512 592 512H336C309.5 512 288 490.5 288 464V48zM352 112C352 120.8 359.2 128 368 128H400C408.8 128 416 120.8 416 112V80C416 71.16 408.8 64 400 64H368C359.2 64 352 71.16 352 80V112zM368 160C359.2 160 352 167.2 352 176V208C352 216.8 359.2 224 368 224H400C408.8 224 416 216.8 416 208V176C416 167.2 408.8 160 400 160H368zM352 304C352 312.8 359.2 320 368 320H400C408.8 320 416 312.8 416 304V272C416 263.2 408.8 256 400 256H368C359.2 256 352 263.2 352 272V304zM528 256C519.2 256 512 263.2 512 272V304C512 312.8 519.2 320 528 320H560C568.8 320 576 312.8 576 304V272C576 263.2 568.8 256 560 256H528zM512 400C512 408.8 519.2 416 528 416H560C568.8 416 576 408.8 576 400V368C576 359.2 568.8 352 560 352H528C519.2 352 512 359.2 512 368V400zM224 160C224 166 223 171 222 176C242 190 256 214 256 240C256 285 220 320 176 320H160V480C160 498 145 512 128 512C110 512 96 498 96 480V320H80C35 320 0 285 0 240C0 214 13 190 33 176C32 171 32 166 32 160C32 107 74 64 128 64C181 64 224 107 224 160z\"]\n};\nvar faTriangleExclamation = {\n  prefix: 'fas',\n  iconName: 'triangle-exclamation',\n  icon: [512, 512, [9888, \"exclamation-triangle\", \"warning\"], \"f071\", \"M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z\"]\n};\nvar faExclamationTriangle = faTriangleExclamation;\nvar faWarning = faTriangleExclamation;\nvar faTrophy = {\n  prefix: 'fas',\n  iconName: 'trophy',\n  icon: [576, 512, [127942], \"f091\", \"M572.1 82.38C569.5 71.59 559.8 64 548.7 64h-100.8c.2422-12.45 .1078-23.7-.1559-33.02C447.3 13.63 433.2 0 415.8 0H160.2C142.8 0 128.7 13.63 128.2 30.98C127.1 40.3 127.8 51.55 128.1 64H27.26C16.16 64 6.537 71.59 3.912 82.38C3.1 85.78-15.71 167.2 37.07 245.9c37.44 55.82 100.6 95.03 187.5 117.4c18.7 4.805 31.41 22.06 31.41 41.37C256 428.5 236.5 448 212.6 448H208c-26.51 0-47.99 21.49-47.99 48c0 8.836 7.163 16 15.1 16h223.1c8.836 0 15.1-7.164 15.1-16c0-26.51-21.48-48-47.99-48h-4.644c-23.86 0-43.36-19.5-43.36-43.35c0-19.31 12.71-36.57 31.41-41.37c86.96-22.34 150.1-61.55 187.5-117.4C591.7 167.2 572.9 85.78 572.1 82.38zM77.41 219.8C49.47 178.6 47.01 135.7 48.38 112h80.39c5.359 59.62 20.35 131.1 57.67 189.1C137.4 281.6 100.9 254.4 77.41 219.8zM498.6 219.8c-23.44 34.6-59.94 61.75-109 81.22C426.9 243.1 441.9 171.6 447.2 112h80.39C528.1 135.7 526.5 178.7 498.6 219.8z\"]\n};\nvar faTrowel = {\n  prefix: 'fas',\n  iconName: 'trowel',\n  icon: [512, 512, [], \"e589\", \"M343.9 213.4L245.3 312L310.6 377.4C318.5 385.3 321.8 396.8 319.1 407.6C316.4 418.5 308.2 427.2 297.5 430.5L41.55 510.5C30.18 514.1 17.79 511 9.373 502.6C.9565 494.2-2.093 481.8 1.458 470.5L81.46 214.5C84.8 203.8 93.48 195.6 104.4 192.9C115.2 190.3 126.7 193.5 134.6 201.4L200 266.7L298.6 168.1C284.4 153.5 284.5 130.1 298.9 115.6L394.4 20.18C421.3-6.728 464.9-6.728 491.8 20.18C518.7 47.1 518.7 90.73 491.8 117.6L396.4 213.1C381.9 227.5 358.5 227.6 343.9 213.4V213.4z\"]\n};\nvar faTrowelBricks = {\n  prefix: 'fas',\n  iconName: 'trowel-bricks',\n  icon: [512, 512, [], \"e58a\", \"M240.8 4.779C250.3 10.61 256 20.91 256 32V104H345C348.6 90.2 361.1 80 376 80H464C490.5 80 512 101.5 512 128C512 154.5 490.5 176 464 176H376C361.1 176 348.6 165.8 345 152H256V224C256 235.1 250.3 245.4 240.8 251.2C231.4 257.1 219.6 257.6 209.7 252.6L17.69 156.6C6.848 151.2 0 140.1 0 128C0 115.9 6.848 104.8 17.69 99.38L209.7 3.378C219.6-1.581 231.4-1.051 240.8 4.779V4.779zM288 256C288 238.3 302.3 224 320 224H480C497.7 224 512 238.3 512 256V320C512 337.7 497.7 352 480 352H320C302.3 352 288 337.7 288 320V256zM128 384C145.7 384 160 398.3 160 416V480C160 497.7 145.7 512 128 512H32C14.33 512 0 497.7 0 480V416C0 398.3 14.33 384 32 384H128zM480 384C497.7 384 512 398.3 512 416V480C512 497.7 497.7 512 480 512H224C206.3 512 192 497.7 192 480V416C192 398.3 206.3 384 224 384H480z\"]\n};\nvar faTruck = {\n  prefix: 'fas',\n  iconName: 'truck',\n  icon: [640, 512, [128666, 9951], \"f0d1\", \"M368 0C394.5 0 416 21.49 416 48V96H466.7C483.7 96 499.1 102.7 512 114.7L589.3 192C601.3 204 608 220.3 608 237.3V352C625.7 352 640 366.3 640 384C640 401.7 625.7 416 608 416H576C576 469 533 512 480 512C426.1 512 384 469 384 416H256C256 469 213 512 160 512C106.1 512 64 469 64 416H48C21.49 416 0 394.5 0 368V48C0 21.49 21.49 0 48 0H368zM416 160V256H544V237.3L466.7 160H416zM160 368C133.5 368 112 389.5 112 416C112 442.5 133.5 464 160 464C186.5 464 208 442.5 208 416C208 389.5 186.5 368 160 368zM480 464C506.5 464 528 442.5 528 416C528 389.5 506.5 368 480 368C453.5 368 432 389.5 432 416C432 442.5 453.5 464 480 464z\"]\n};\nvar faTruckArrowRight = {\n  prefix: 'fas',\n  iconName: 'truck-arrow-right',\n  icon: [640, 512, [], \"e58b\", \"M0 48C0 21.49 21.49 0 48 0H368C394.5 0 416 21.49 416 48V96H466.7C483.7 96 499.1 102.7 512 114.7L589.3 192C601.3 204 608 220.3 608 237.3V352C625.7 352 640 366.3 640 384C640 401.7 625.7 416 608 416H576C576 469 533 512 480 512C426.1 512 384 469 384 416H256C256 469 213 512 160 512C106.1 512 64 469 64 416H48C21.49 416 0 394.5 0 368V48zM544 256V237.3L466.7 160H416V256H544zM160 464C186.5 464 208 442.5 208 416C208 389.5 186.5 368 160 368C133.5 368 112 389.5 112 416C112 442.5 133.5 464 160 464zM480 368C453.5 368 432 389.5 432 416C432 442.5 453.5 464 480 464C506.5 464 528 442.5 528 416C528 389.5 506.5 368 480 368zM256.1 95.03C247.6 85.66 232.4 85.66 223 95.03C213.7 104.4 213.7 119.6 223 128.1L262.1 168H96C82.75 168 72 178.7 72 192C72 205.3 82.75 216 96 216H262.1L223 255C213.7 264.4 213.7 279.6 223 288.1C232.4 298.3 247.6 298.3 256.1 288.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175L256.1 95.03z\"]\n};\nvar faTruckDroplet = {\n  prefix: 'fas',\n  iconName: 'truck-droplet',\n  icon: [640, 512, [], \"e58c\", \"M0 48C0 21.49 21.49 0 48 0H368C394.5 0 416 21.49 416 48V96H466.7C483.7 96 499.1 102.7 512 114.7L589.3 192C601.3 204 608 220.3 608 237.3V352C625.7 352 640 366.3 640 384C640 401.7 625.7 416 608 416H576C576 469 533 512 480 512C426.1 512 384 469 384 416H256C256 469 213 512 160 512C106.1 512 64 469 64 416H48C21.49 416 0 394.5 0 368V48zM544 256V237.3L466.7 160H416V256H544zM160 464C186.5 464 208 442.5 208 416C208 389.5 186.5 368 160 368C133.5 368 112 389.5 112 416C112 442.5 133.5 464 160 464zM480 368C453.5 368 432 389.5 432 416C432 442.5 453.5 464 480 464C506.5 464 528 442.5 528 416C528 389.5 506.5 368 480 368zM208 272C247.8 272 280 242.4 280 205.1C280 179 240.6 123 220.1 95.71C213.1 87.54 202 87.54 195.9 95.71C175.4 123 136 179 136 205.1C136 242.4 168.2 272 208 272V272z\"]\n};\nvar faTruckFast = {\n  prefix: 'fas',\n  iconName: 'truck-fast',\n  icon: [640, 512, [\"shipping-fast\"], \"f48b\", \"M112 0C85.49 0 64 21.49 64 48V96H16C7.163 96 0 103.2 0 112C0 120.8 7.163 128 16 128H272C280.8 128 288 135.2 288 144C288 152.8 280.8 160 272 160H48C39.16 160 32 167.2 32 176C32 184.8 39.16 192 48 192H240C248.8 192 256 199.2 256 208C256 216.8 248.8 224 240 224H16C7.163 224 0 231.2 0 240C0 248.8 7.163 256 16 256H208C216.8 256 224 263.2 224 272C224 280.8 216.8 288 208 288H64V416C64 469 106.1 512 160 512C213 512 256 469 256 416H384C384 469 426.1 512 480 512C533 512 576 469 576 416H608C625.7 416 640 401.7 640 384C640 366.3 625.7 352 608 352V237.3C608 220.3 601.3 204 589.3 192L512 114.7C499.1 102.7 483.7 96 466.7 96H416V48C416 21.49 394.5 0 368 0H112zM544 237.3V256H416V160H466.7L544 237.3zM160 464C133.5 464 112 442.5 112 416C112 389.5 133.5 368 160 368C186.5 368 208 389.5 208 416C208 442.5 186.5 464 160 464zM528 416C528 442.5 506.5 464 480 464C453.5 464 432 442.5 432 416C432 389.5 453.5 368 480 368C506.5 368 528 389.5 528 416z\"]\n};\nvar faShippingFast = faTruckFast;\nvar faTruckField = {\n  prefix: 'fas',\n  iconName: 'truck-field',\n  icon: [640, 512, [], \"e58d\", \"M32 96C32 60.65 60.65 32 96 32H320C343.7 32 364.4 44.87 375.4 64H427.2C452.5 64 475.4 78.9 485.7 102L538.5 220.8C538.1 221.9 539.4 222.9 539.8 223.1H544C579.3 223.1 608 252.7 608 287.1V319.1C625.7 319.1 640 334.3 640 352C640 369.7 625.7 384 608 384H576C576 437 533 480 480 480C426.1 480 384 437 384 384H256C256 437 213 480 160 480C106.1 480 64 437 64 384H32C14.33 384 0 369.7 0 352C0 334.3 14.33 319.1 32 319.1V287.1C14.33 287.1 0 273.7 0 255.1V159.1C0 142.3 14.33 127.1 32 127.1V96zM469.9 224L427.2 128H384V224H469.9zM160 432C186.5 432 208 410.5 208 384C208 357.5 186.5 336 160 336C133.5 336 112 357.5 112 384C112 410.5 133.5 432 160 432zM480 336C453.5 336 432 357.5 432 384C432 410.5 453.5 432 480 432C506.5 432 528 410.5 528 384C528 357.5 506.5 336 480 336z\"]\n};\nvar faTruckFieldUn = {\n  prefix: 'fas',\n  iconName: 'truck-field-un',\n  icon: [640, 512, [], \"e58e\", \"M320 32C343.7 32 364.4 44.87 375.4 64H427.2C452.5 64 475.4 78.9 485.7 102L538.5 220.8C538.1 221.9 539.4 222.9 539.8 224H544C579.3 224 608 252.7 608 288V320C625.7 320 640 334.3 640 352C640 369.7 625.7 384 608 384H576C576 437 533 480 480 480C426.1 480 384 437 384 384H256C256 437 213 480 160 480C106.1 480 64 437 64 384H32C14.33 384 0 369.7 0 352C0 334.3 14.33 320 32 320V288C14.33 288 0 273.7 0 256V160C0 142.3 14.33 128 32 128V96C32 60.65 60.65 32 96 32L320 32zM384 128V224H469.9L427.2 128H384zM160 336C133.5 336 112 357.5 112 384C112 410.5 133.5 432 160 432C186.5 432 208 410.5 208 384C208 357.5 186.5 336 160 336zM480 432C506.5 432 528 410.5 528 384C528 357.5 506.5 336 480 336C453.5 336 432 357.5 432 384C432 410.5 453.5 432 480 432zM253.3 135.1C249.4 129.3 242.1 126.6 235.4 128.7C228.6 130.7 224 136.9 224 144V240C224 248.8 231.2 256 240 256C248.8 256 256 248.8 256 240V196.8L290.7 248.9C294.6 254.7 301.9 257.4 308.6 255.3C315.4 253.3 320 247.1 320 240V144C320 135.2 312.8 128 304 128C295.2 128 288 135.2 288 144V187.2L253.3 135.1zM128 144C128 135.2 120.8 128 112 128C103.2 128 96 135.2 96 144V208C96 234.5 117.5 256 144 256C170.5 256 192 234.5 192 208V144C192 135.2 184.8 128 176 128C167.2 128 160 135.2 160 144V208C160 216.8 152.8 224 144 224C135.2 224 128 216.8 128 208V144z\"]\n};\nvar faTruckFront = {\n  prefix: 'fas',\n  iconName: 'truck-front',\n  icon: [512, 512, [], \"e2b7\", \"M0 80C0 35.82 35.82 0 80 0H432C476.2 0 512 35.82 512 80V368C512 394.2 499.4 417.4 480 432V480C480 497.7 465.7 512 448 512H416C398.3 512 384 497.7 384 480V448H128V480C128 497.7 113.7 512 96 512H64C46.33 512 32 497.7 32 480V432C12.57 417.4 0 394.2 0 368V80zM129.9 152.2L112 224H400L382.1 152.2C378.5 137.1 365.7 128 351 128H160.1C146.3 128 133.5 137.1 129.9 152.2H129.9zM96 288C78.33 288 64 302.3 64 320C64 337.7 78.33 352 96 352C113.7 352 128 337.7 128 320C128 302.3 113.7 288 96 288zM416 352C433.7 352 448 337.7 448 320C448 302.3 433.7 288 416 288C398.3 288 384 302.3 384 320C384 337.7 398.3 352 416 352z\"]\n};\nvar faTruckMedical = {\n  prefix: 'fas',\n  iconName: 'truck-medical',\n  icon: [640, 512, [128657, \"ambulance\"], \"f0f9\", \"M368 0C394.5 0 416 21.49 416 48V96H466.7C483.7 96 499.1 102.7 512 114.7L589.3 192C601.3 204 608 220.3 608 237.3V352C625.7 352 640 366.3 640 384C640 401.7 625.7 416 608 416H576C576 469 533 512 480 512C426.1 512 384 469 384 416H256C256 469 213 512 160 512C106.1 512 64 469 64 416H48C21.49 416 0 394.5 0 368V48C0 21.49 21.49 0 48 0H368zM416 160V256H544V237.3L466.7 160H416zM160 368C133.5 368 112 389.5 112 416C112 442.5 133.5 464 160 464C186.5 464 208 442.5 208 416C208 389.5 186.5 368 160 368zM480 464C506.5 464 528 442.5 528 416C528 389.5 506.5 368 480 368C453.5 368 432 389.5 432 416C432 442.5 453.5 464 480 464zM112 176C112 184.8 119.2 192 128 192H176V240C176 248.8 183.2 256 192 256H224C232.8 256 240 248.8 240 240V192H288C296.8 192 304 184.8 304 176V144C304 135.2 296.8 128 288 128H240V80C240 71.16 232.8 64 224 64H192C183.2 64 176 71.16 176 80V128H128C119.2 128 112 135.2 112 144V176z\"]\n};\nvar faAmbulance = faTruckMedical;\nvar faTruckMonster = {\n  prefix: 'fas',\n  iconName: 'truck-monster',\n  icon: [640, 512, [], \"f63b\", \"M419.2 25.6L496 128H576C593.7 128 608 142.3 608 160V224C625.7 224 640 238.3 640 256C640 273.7 625.7 287.1 608 288C578.8 249.1 532.3 224 480 224C427.7 224 381.2 249.1 351.1 288H288C258.8 249.1 212.3 224 160 224C107.7 224 61.18 249.1 31.99 288C14.32 287.1 0 273.7 0 256C0 238.3 14.33 224 32 224V160C32 142.3 46.33 128 64 128H224V48C224 21.49 245.5 0 272 0H368C388.1 0 407.1 9.484 419.2 25.6H419.2zM288 128H416L368 64H288V128zM168 256C180.1 256 190.1 264.9 191.8 276.6C199.4 278.8 206.7 281.9 213.5 285.6C222.9 278.5 236.3 279.3 244.9 287.8L256.2 299.1C264.7 307.7 265.5 321.1 258.4 330.5C262.1 337.3 265.2 344.6 267.4 352.2C279.1 353.9 288 363.9 288 376V392C288 404.1 279.1 414.1 267.4 415.8C265.2 423.4 262.1 430.7 258.4 437.5C265.5 446.9 264.7 460.3 256.2 468.9L244.9 480.2C236.3 488.7 222.9 489.5 213.5 482.4C206.7 486.1 199.4 489.2 191.8 491.4C190.1 503.1 180.1 512 167.1 512H151.1C139.9 512 129.9 503.1 128.2 491.4C120.6 489.2 113.3 486.1 106.5 482.4C97.09 489.5 83.7 488.7 75.15 480.2L63.83 468.9C55.28 460.3 54.53 446.9 61.58 437.5C57.85 430.7 54.81 423.4 52.57 415.8C40.94 414.1 31.1 404.1 31.1 392V376C31.1 363.9 40.94 353.9 52.57 352.2C54.81 344.6 57.85 337.3 61.58 330.5C54.53 321.1 55.28 307.7 63.83 299.1L75.15 287.8C83.7 279.3 97.09 278.5 106.5 285.6C113.3 281.9 120.6 278.8 128.2 276.6C129.9 264.9 139.9 255.1 151.1 255.1L168 256zM160 432C186.5 432 208 410.5 208 384C208 357.5 186.5 336 160 336C133.5 336 112 357.5 112 384C112 410.5 133.5 432 160 432zM448.2 276.6C449.9 264.9 459.9 256 472 256H488C500.1 256 510.1 264.9 511.8 276.6C519.4 278.8 526.7 281.9 533.5 285.6C542.9 278.5 556.3 279.3 564.9 287.8L576.2 299.1C584.7 307.7 585.5 321.1 578.4 330.5C582.1 337.3 585.2 344.6 587.4 352.2C599.1 353.9 608 363.9 608 376V392C608 404.1 599.1 414.1 587.4 415.8C585.2 423.4 582.1 430.7 578.4 437.5C585.5 446.9 584.7 460.3 576.2 468.9L564.9 480.2C556.3 488.7 542.9 489.5 533.5 482.4C526.7 486.1 519.4 489.2 511.8 491.4C510.1 503.1 500.1 512 488 512H472C459.9 512 449.9 503.1 448.2 491.4C440.6 489.2 433.3 486.1 426.5 482.4C417.1 489.5 403.7 488.7 395.1 480.2L383.8 468.9C375.3 460.3 374.5 446.9 381.6 437.5C377.9 430.7 374.8 423.4 372.6 415.8C360.9 414.1 352 404.1 352 392V376C352 363.9 360.9 353.9 372.6 352.2C374.8 344.6 377.9 337.3 381.6 330.5C374.5 321.1 375.3 307.7 383.8 299.1L395.1 287.8C403.7 279.3 417.1 278.5 426.5 285.6C433.3 281.9 440.6 278.8 448.2 276.6L448.2 276.6zM480 336C453.5 336 432 357.5 432 384C432 410.5 453.5 432 480 432C506.5 432 528 410.5 528 384C528 357.5 506.5 336 480 336z\"]\n};\nvar faTruckMoving = {\n  prefix: 'fas',\n  iconName: 'truck-moving',\n  icon: [640, 512, [], \"f4df\", \"M416 32C451.3 32 480 60.65 480 96V144H528.8C545.6 144 561.5 151.5 572.2 164.5L630.1 236.4C636.8 243.5 640 252.5 640 261.7V352C640 369.7 625.7 384 608 384H606.4C607.4 389.2 608 394.5 608 400C608 444.2 572.2 480 528 480C483.8 480 448 444.2 448 400C448 394.5 448.6 389.2 449.6 384H286.4C287.4 389.2 288 394.5 288 400C288 444.2 252.2 480 208 480C181.8 480 158.6 467.4 144 448C129.4 467.4 106.2 480 80 480C35.82 480 0 444.2 0 400V96C0 60.65 28.65 32 64 32H416zM535 194.9C533.5 193.1 531.2 192 528.8 192H480V256H584.1L535 194.9zM528 432C545.7 432 560 417.7 560 400C560 382.3 545.7 368 528 368C510.3 368 496 382.3 496 400C496 417.7 510.3 432 528 432zM208 368C190.3 368 176 382.3 176 400C176 417.7 190.3 432 208 432C225.7 432 240 417.7 240 400C240 382.3 225.7 368 208 368zM80 432C97.67 432 112 417.7 112 400C112 382.3 97.67 368 80 368C62.33 368 48 382.3 48 400C48 417.7 62.33 432 80 432z\"]\n};\nvar faTruckPickup = {\n  prefix: 'fas',\n  iconName: 'truck-pickup',\n  icon: [640, 512, [128763], \"f63c\", \"M272 32H368.6C388.1 32 406.5 40.84 418.6 56.02L527.4 192H576C593.7 192 608 206.3 608 224V288C625.7 288 640 302.3 640 320C640 337.7 625.7 352 608 352H574.9C575.6 357.2 576 362.6 576 368C576 429.9 525.9 480 464 480C402.1 480 352 429.9 352 368C352 362.6 352.4 357.2 353.1 352H286.9C287.6 357.2 288 362.6 288 368C288 429.9 237.9 480 176 480C114.1 480 64 429.9 64 368C64 362.6 64.39 357.2 65.13 352H32C14.33 352 0 337.7 0 320C0 302.3 14.33 288 32 288V224C32 206.3 46.33 192 64 192H224V80C224 53.49 245.5 32 272 32H272zM368.6 96H288V192H445.4L368.6 96zM176 416C202.5 416 224 394.5 224 368C224 341.5 202.5 320 176 320C149.5 320 128 341.5 128 368C128 394.5 149.5 416 176 416zM464 416C490.5 416 512 394.5 512 368C512 341.5 490.5 320 464 320C437.5 320 416 341.5 416 368C416 394.5 437.5 416 464 416z\"]\n};\nvar faTruckPlane = {\n  prefix: 'fas',\n  iconName: 'truck-plane',\n  icon: [640, 512, [], \"e58f\", \"M256 86.06L256 182.9L256 184V411.5L256.1 411.6C257.3 433.8 269.8 452.9 288 463.4V496C288 501.2 288.8 506.3 290.4 510.1L200 480.9L109.1 511.2C104.2 512.8 98.82 511.1 94.64 508.1C90.47 505.1 88 501.1 88 496V464C88 459.1 90.21 454.5 94 451.5L144 411.5V330.3L20.6 367.3C15.75 368.8 10.51 367.9 6.449 364.8C2.391 361.8 0 357.1 0 352V288C0 282.4 2.949 277.2 7.768 274.3L144 192.5V86.06C144 54.68 169.4 0 200 0C231.5 0 256 54.68 256 86.06V86.06zM288 176C288 149.5 309.5 128 336 128H592C618.5 128 640 149.5 640 176V400C640 420.9 626.6 438.7 608 445.3V488C608 501.3 597.3 512 584 512H568C554.7 512 544 501.3 544 488V448H384V488C384 501.3 373.3 512 360 512H344C330.7 512 320 501.3 320 488V445.3C301.4 438.7 288 420.9 288 400V176zM367.8 254.7L352 304H576L560.2 254.7C556.9 246 548.9 240 539.7 240H388.3C379.1 240 371.1 246 367.8 254.7H367.8zM568 400C581.3 400 592 389.3 592 376C592 362.7 581.3 352 568 352C554.7 352 544 362.7 544 376C544 389.3 554.7 400 568 400zM360 352C346.7 352 336 362.7 336 376C336 389.3 346.7 400 360 400C373.3 400 384 389.3 384 376C384 362.7 373.3 352 360 352z\"]\n};\nvar faTruckRampBox = {\n  prefix: 'fas',\n  iconName: 'truck-ramp-box',\n  icon: [640, 512, [\"truck-loading\"], \"f4de\", \"M640 .0003V400C640 461.9 589.9 512 528 512C467 512 417.5 463.3 416 402.7L48.41 502.9C31.36 507.5 13.77 497.5 9.126 480.4C4.48 463.4 14.54 445.8 31.59 441.1L352 353.8V64C352 28.65 380.7 0 416 0L640 .0003zM528 352C501.5 352 480 373.5 480 400C480 426.5 501.5 448 528 448C554.5 448 576 426.5 576 400C576 373.5 554.5 352 528 352zM23.11 207.7C18.54 190.6 28.67 173.1 45.74 168.5L92.1 156.1L112.8 233.4C115.1 241.9 123.9 246.1 132.4 244.7L163.3 236.4C171.8 234.1 176.9 225.3 174.6 216.8L153.9 139.5L200.3 127.1C217.4 122.5 234.9 132.7 239.5 149.7L280.9 304.3C285.5 321.4 275.3 338.9 258.3 343.5L103.7 384.9C86.64 389.5 69.1 379.3 64.52 362.3L23.11 207.7z\"]\n};\nvar faTruckLoading = faTruckRampBox;\nvar faTty = {\n  prefix: 'fas',\n  iconName: 'tty',\n  icon: [512, 512, [\"teletype\"], \"f1e4\", \"M271.1 364v40c0 6.625 5.375 12 12 12h40c6.625 0 12-5.375 12-12v-40c0-6.625-5.375-12-12-12h-40C277.3 352 271.1 357.4 271.1 364zM367.1 364v40c0 6.625 5.375 12 12 12h40c6.625 0 12-5.375 12-12v-40c0-6.625-5.375-12-12-12h-40C373.3 352 367.1 357.4 367.1 364zM275.1 256h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.376 12 12 12h39.1c6.625 0 12-5.375 12-12v-40C287.1 261.4 282.6 256 275.1 256zM83.96 448h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.375 12 12 12h40c6.625 0 12-5.375 12-12v-40C95.96 453.4 90.59 448 83.96 448zM175.1 364v40c0 6.625 5.375 12 12 12h40c6.625 0 12-5.375 12-12v-40c0-6.625-5.375-12-12-12h-40C181.3 352 175.1 357.4 175.1 364zM371.1 256h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.372 12 11.1 12h39.1c6.625 0 12-5.375 12-12v-40C383.1 261.4 378.6 256 371.1 256zM467.1 256h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.369 12 11.99 12h39.1c6.625 0 12.01-5.375 12.01-12v-40C479.1 261.4 474.6 256 467.1 256zM371.1 448h-232c-6.625 0-12 5.375-12 12v40c0 6.625 5.375 12 12 12h232c6.625 0 12-5.375 12-12v-40C383.1 453.4 378.6 448 371.1 448zM179.1 256h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.38 12 12 12h39.1c6.625 0 11.1-5.375 11.1-12v-40C191.1 261.4 186.6 256 179.1 256zM467.1 448h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.375 12 12 12h40c6.625 0 12-5.375 12-12v-40C479.1 453.4 474.6 448 467.1 448zM79.96 364v40c0 6.625 5.375 12 12 12h40c6.625 0 12-5.375 12-12v-40c0-6.625-5.375-12-12-12h-40C85.34 352 79.96 357.4 79.96 364zM83.96 256h-40c-6.625 0-12 5.375-12 12v40c0 6.625 5.383 12 12.01 12H83.97c6.625 0 11.99-5.375 11.99-12v-40C95.96 261.4 90.59 256 83.96 256zM504.9 102.9C367.7-34.31 144.3-34.32 7.083 102.9c-7.975 7.973-9.375 20.22-3.391 29.74l42.17 67.47c6.141 9.844 18.47 13.88 29.35 9.632l84.36-33.74C169.5 172.1 175.6 161.1 174.5 151.3l-5.303-53.27c56.15-19.17 117.4-19.17 173.6 .0059L337.5 151.3c-1.139 10.59 4.997 20.78 14.96 24.73l84.35 33.73c10.83 4.303 23.22 .1608 29.33-9.615l42.18-67.48C514.3 123.2 512.9 110.9 504.9 102.9z\"]\n};\nvar faTeletype = faTty;\nvar faTurkishLiraSign = {\n  prefix: 'fas',\n  iconName: 'turkish-lira-sign',\n  icon: [384, 512, [\"try\", \"turkish-lira\"], \"e2bb\", \"M96 32C113.7 32 128 46.33 128 64V99.29L247.2 65.23C264.2 60.38 281.9 70.22 286.8 87.21C291.6 104.2 281.8 121.9 264.8 126.8L128 165.9V195.3L247.2 161.2C264.2 156.4 281.9 166.2 286.8 183.2C291.6 200.2 281.8 217.9 264.8 222.8L128 261.9V416H191.8C260 416 316.2 362.5 319.6 294.4L320 286.4C320.9 268.8 335.9 255.2 353.6 256C371.2 256.9 384.8 271.9 383.1 289.6L383.6 297.6C378.5 399.8 294.1 480 191.8 480H96C78.33 480 64 465.7 64 448V280.1L40.79 286.8C23.8 291.6 6.087 281.8 1.232 264.8C-3.623 247.8 6.217 230.1 23.21 225.2L64 213.6V184.1L40.79 190.8C23.8 195.6 6.087 185.8 1.232 168.8C-3.623 151.8 6.216 134.1 23.21 129.2L64 117.6V64C64 46.33 78.33 32 96 32L96 32z\"]\n};\nvar faTry = faTurkishLiraSign;\nvar faTurkishLira = faTurkishLiraSign;\nvar faTurnDown = {\n  prefix: 'fas',\n  iconName: 'turn-down',\n  icon: [384, 512, [10549, \"level-down-alt\"], \"f3be\", \"M313.6 392.3l-104 112c-9.5 10.23-25.69 10.23-35.19 0l-104-112c-6.484-6.984-8.219-17.17-4.406-25.92S78.45 352 88 352H160V80C160 71.19 152.8 64 144 64H32C14.33 64 0 49.69 0 32s14.33-32 32-32h112C188.1 0 224 35.88 224 80V352h72c9.547 0 18.19 5.656 22 14.41S320.1 385.3 313.6 392.3z\"]\n};\nvar faLevelDownAlt = faTurnDown;\nvar faTurnUp = {\n  prefix: 'fas',\n  iconName: 'turn-up',\n  icon: [384, 512, [10548, \"level-up-alt\"], \"f3bf\", \"M318 145.6c-3.812 8.75-12.45 14.41-22 14.41L224 160v272c0 44.13-35.89 80-80 80H32c-17.67 0-32-14.31-32-32s14.33-32 32-32h112C152.8 448 160 440.8 160 432V160L88 159.1c-9.547 0-18.19-5.656-22-14.41S63.92 126.7 70.41 119.7l104-112c9.498-10.23 25.69-10.23 35.19 0l104 112C320.1 126.7 321.8 136.8 318 145.6z\"]\n};\nvar faLevelUpAlt = faTurnUp;\nvar faTv = {\n  prefix: 'fas',\n  iconName: 'tv',\n  icon: [640, 512, [63717, \"television\", \"tv-alt\"], \"f26c\", \"M512 448H127.1C110.3 448 96 462.3 96 479.1S110.3 512 127.1 512h384C529.7 512 544 497.7 544 480S529.7 448 512 448zM592 0h-544C21.5 0 0 21.5 0 48v320C0 394.5 21.5 416 48 416h544c26.5 0 48-21.5 48-48v-320C640 21.5 618.5 0 592 0zM576 352H64v-288h512V352z\"]\n};\nvar faTelevision = faTv;\nvar faTvAlt = faTv;\nvar faU = {\n  prefix: 'fas',\n  iconName: 'u',\n  icon: [384, 512, [117], \"55\", \"M384 64.01v225.7c0 104.1-86.13 190.3-192 190.3s-192-85.38-192-190.3V64.01C0 46.34 14.33 32.01 32 32.01S64 46.34 64 64.01v225.7c0 69.67 57.42 126.3 128 126.3s128-56.67 128-126.3V64.01c0-17.67 14.33-32 32-32S384 46.34 384 64.01z\"]\n};\nvar faUmbrella = {\n  prefix: 'fas',\n  iconName: 'umbrella',\n  icon: [576, 512, [], \"f0e9\", \"M255.1 301.7v130.3c0 8.814-7.188 16-16 16c-7.814 0-13.19-5.314-15.1-10.69c-5.906-16.72-24.1-25.41-40.81-19.5c-16.69 5.875-25.41 24.19-19.5 40.79C175.8 490.6 206.2 512 239.1 512C284.1 512 320 476.1 320 431.1v-130.3c-9.094-7.908-19.81-13.61-32-13.61C275.7 288.1 265.6 292.9 255.1 301.7zM575.7 280.9C547.1 144.5 437.3 62.61 320 49.91V32.01c0-17.69-14.31-32.01-32-32.01S255.1 14.31 255.1 32.01v17.91C138.3 62.61 29.48 144.5 .2949 280.9C-1.926 290.1 8.795 302.1 18.98 292.2c52-55.01 107.7-52.39 158.6 37.01c5.312 9.502 14.91 8.625 19.72 0C217.5 293.9 242.2 256 287.1 256c58.5 0 88.19 68.82 90.69 73.2c4.812 8.625 14.41 9.502 19.72 0c51-89.52 107.1-91.39 158.6-37.01C567.3 302.2 577.9 290.1 575.7 280.9z\"]\n};\nvar faUmbrellaBeach = {\n  prefix: 'fas',\n  iconName: 'umbrella-beach',\n  icon: [640, 512, [127958], \"f5ca\", \"M115.4 136.8l102.1 37.35c35.13-81.62 86.25-144.4 139-173.7c-95.88-4.875-188.8 36.96-248.5 111.7C101.2 120.6 105.2 133.2 115.4 136.8zM247.6 185l238.5 86.87c35.75-121.4 18.62-231.6-42.63-253.9c-7.375-2.625-15.12-4.062-23.12-4.062C362.4 13.88 292.1 83.13 247.6 185zM521.5 60.51c6.25 16.25 10.75 34.62 13.13 55.25c5.75 49.87-1.376 108.1-18.88 166.9l102.6 37.37c10.13 3.75 21.25-3.375 21.5-14.12C642.3 210.1 598 118.4 521.5 60.51zM528 448h-207l65-178.5l-60.13-21.87l-72.88 200.4H48C21.49 448 0 469.5 0 496C0 504.8 7.163 512 16 512h544c8.837 0 16-7.163 16-15.1C576 469.5 554.5 448 528 448z\"]\n};\nvar faUnderline = {\n  prefix: 'fas',\n  iconName: 'underline',\n  icon: [448, 512, [], \"f0cd\", \"M416 448H32c-17.69 0-32 14.31-32 32s14.31 32 32 32h384c17.69 0 32-14.31 32-32S433.7 448 416 448zM48 64.01H64v160c0 88.22 71.78 159.1 160 159.1s160-71.78 160-159.1v-160h16c17.69 0 32-14.32 32-32s-14.31-31.1-32-31.1l-96-.0049c-17.69 0-32 14.32-32 32s14.31 32 32 32H320v160c0 52.94-43.06 95.1-96 95.1S128 276.1 128 224v-160h16c17.69 0 32-14.31 32-32s-14.31-32-32-32l-96 .0049c-17.69 0-32 14.31-32 31.1S30.31 64.01 48 64.01z\"]\n};\nvar faUniversalAccess = {\n  prefix: 'fas',\n  iconName: 'universal-access',\n  icon: [512, 512, [], \"f29a\", \"M256 0C114.6 0 0 114.6 0 256c0 141.4 114.6 256 256 256s256-114.6 256-256C512 114.6 397.4 0 256 0zM256 80c22.09 0 40 17.91 40 40S278.1 160 256 160S216 142.1 216 120S233.9 80 256 80zM374.6 215.1L315.3 232C311.6 233.1 307.8 233.6 304 234.4v62.32l30.64 87.34c4.391 12.5-2.188 26.19-14.69 30.59C317.3 415.6 314.6 416 312 416c-9.906 0-19.19-6.188-22.64-16.06l-25.85-70.65c-2.562-7.002-12.46-7.002-15.03 0l-25.85 70.65C219.2 409.8 209.9 416 200 416c-2.641 0-5.312-.4375-7.953-1.344c-12.5-4.406-19.08-18.09-14.69-30.59L208 296.7V234.4C204.2 233.6 200.4 233.1 196.7 232L137.4 215.1C124.7 211.4 117.3 198.2 120.9 185.4S137.9 165.2 150.6 168.9l59.25 16.94c30.17 8.623 62.15 8.623 92.31 0l59.25-16.94c12.7-3.781 26.02 3.719 29.67 16.47C394.7 198.2 387.3 211.4 374.6 215.1z\"]\n};\nvar faUnlock = {\n  prefix: 'fas',\n  iconName: 'unlock',\n  icon: [448, 512, [128275], \"f09c\", \"M144 192H384C419.3 192 448 220.7 448 256V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V256C0 220.7 28.65 192 64 192H80V144C80 64.47 144.5 0 224 0C281.5 0 331 33.69 354.1 82.27C361.7 98.23 354.9 117.3 338.1 124.9C322.1 132.5 303.9 125.7 296.3 109.7C283.4 82.63 255.9 64 224 64C179.8 64 144 99.82 144 144L144 192z\"]\n};\nvar faUnlockKeyhole = {\n  prefix: 'fas',\n  iconName: 'unlock-keyhole',\n  icon: [448, 512, [\"unlock-alt\"], \"f13e\", \"M224 64C179.8 64 144 99.82 144 144V192H384C419.3 192 448 220.7 448 256V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V256C0 220.7 28.65 192 64 192H80V144C80 64.47 144.5 0 224 0C281.5 0 331 33.69 354.1 82.27C361.7 98.23 354.9 117.3 338.1 124.9C322.1 132.5 303.9 125.7 296.3 109.7C283.4 82.63 255.9 64 224 64H224zM256 384C273.7 384 288 369.7 288 352C288 334.3 273.7 320 256 320H192C174.3 320 160 334.3 160 352C160 369.7 174.3 384 192 384H256z\"]\n};\nvar faUnlockAlt = faUnlockKeyhole;\nvar faUpDown = {\n  prefix: 'fas',\n  iconName: 'up-down',\n  icon: [256, 512, [11021, 8597, \"arrows-alt-v\"], \"f338\", \"M249.6 392.3l-104 112c-9.094 9.781-26.09 9.781-35.19 0l-103.1-112c-6.484-6.984-8.219-17.17-4.406-25.92S14.45 352 24 352H80V160H24C14.45 160 5.812 154.3 1.999 145.6C-1.813 136.8-.0781 126.7 6.406 119.7l104-112c9.094-9.781 26.09-9.781 35.19 0l104 112c6.484 6.984 8.219 17.17 4.406 25.92C250.2 154.3 241.5 160 232 160H176v192h56c9.547 0 18.19 5.656 22 14.41S256.1 385.3 249.6 392.3z\"]\n};\nvar faArrowsAltV = faUpDown;\nvar faUpDownLeftRight = {\n  prefix: 'fas',\n  iconName: 'up-down-left-right',\n  icon: [512, 512, [\"arrows-alt\"], \"f0b2\", \"M512 256c0 6.797-2.891 13.28-7.938 17.84l-80 72C419.6 349.9 413.8 352 408 352c-3.312 0-6.625-.6875-9.766-2.078C389.6 346.1 384 337.5 384 328V288h-96v96l40-.0013c9.484 0 18.06 5.578 21.92 14.23s2.25 18.78-4.078 25.83l-72 80C269.3 509.1 262.8 512 255.1 512s-13.28-2.89-17.84-7.937l-71.1-80c-6.328-7.047-7.938-17.17-4.078-25.83s12.44-14.23 21.92-14.23l39.1 .0013V288H128v40c0 9.484-5.578 18.06-14.23 21.92C110.6 351.3 107.3 352 104 352c-5.812 0-11.56-2.109-16.06-6.156l-80-72C2.891 269.3 0 262.8 0 256s2.891-13.28 7.938-17.84l80-72C95 159.8 105.1 158.3 113.8 162.1C122.4 165.9 128 174.5 128 184V224h95.1V128l-39.1-.0013c-9.484 0-18.06-5.578-21.92-14.23S159.8 94.99 166.2 87.94l71.1-80c9.125-10.09 26.56-10.09 35.69 0l72 80c6.328 7.047 7.938 17.17 4.078 25.83s-12.44 14.23-21.92 14.23l-40 .0013V224H384V184c0-9.484 5.578-18.06 14.23-21.92c8.656-3.812 18.77-2.266 25.83 4.078l80 72C509.1 242.7 512 249.2 512 256z\"]\n};\nvar faArrowsAlt = faUpDownLeftRight;\nvar faUpLong = {\n  prefix: 'fas',\n  iconName: 'up-long',\n  icon: [320, 512, [\"long-arrow-alt-up\"], \"f30c\", \"M285.1 145.7c-3.81 8.758-12.45 14.42-21.1 14.42L192 160.1V480c0 17.69-14.33 32-32 32s-32-14.31-32-32V160.1L55.1 160.1c-9.547 0-18.19-5.658-22-14.42c-3.811-8.758-2.076-18.95 4.408-25.94l104-112.1c9.498-10.24 25.69-10.24 35.19 0l104 112.1C288.1 126.7 289.8 136.9 285.1 145.7z\"]\n};\nvar faLongArrowAltUp = faUpLong;\nvar faUpRightAndDownLeftFromCenter = {\n  prefix: 'fas',\n  iconName: 'up-right-and-down-left-from-center',\n  icon: [512, 512, [\"expand-alt\"], \"f424\", \"M208 281.4c-12.5-12.5-32.76-12.5-45.26-.002l-78.06 78.07l-30.06-30.06c-6.125-6.125-14.31-9.367-22.63-9.367c-4.125 0-8.279 .7891-12.25 2.43c-11.97 4.953-19.75 16.62-19.75 29.56v135.1C.0013 501.3 10.75 512 24 512h136c12.94 0 24.63-7.797 29.56-19.75c4.969-11.97 2.219-25.72-6.938-34.87l-30.06-30.06l78.06-78.07c12.5-12.49 12.5-32.75 .002-45.25L208 281.4zM487.1 0h-136c-12.94 0-24.63 7.797-29.56 19.75c-4.969 11.97-2.219 25.72 6.938 34.87l30.06 30.06l-78.06 78.07c-12.5 12.5-12.5 32.76 0 45.26l22.62 22.62c12.5 12.5 32.76 12.5 45.26 0l78.06-78.07l30.06 30.06c9.156 9.141 22.87 11.84 34.87 6.937C504.2 184.6 512 172.9 512 159.1V23.1C512 10.74 501.3 0 487.1 0z\"]\n};\nvar faExpandAlt = faUpRightAndDownLeftFromCenter;\nvar faUpRightFromSquare = {\n  prefix: 'fas',\n  iconName: 'up-right-from-square',\n  icon: [512, 512, [\"external-link-alt\"], \"f35d\", \"M384 320c-17.67 0-32 14.33-32 32v96H64V160h96c17.67 0 32-14.32 32-32s-14.33-32-32-32L64 96c-35.35 0-64 28.65-64 64V448c0 35.34 28.65 64 64 64h288c35.35 0 64-28.66 64-64v-96C416 334.3 401.7 320 384 320zM488 0H352c-12.94 0-24.62 7.797-29.56 19.75c-4.969 11.97-2.219 25.72 6.938 34.88L370.8 96L169.4 297.4c-12.5 12.5-12.5 32.75 0 45.25C175.6 348.9 183.8 352 192 352s16.38-3.125 22.62-9.375L416 141.3l41.38 41.38c9.156 9.141 22.88 11.84 34.88 6.938C504.2 184.6 512 172.9 512 160V24C512 10.74 501.3 0 488 0z\"]\n};\nvar faExternalLinkAlt = faUpRightFromSquare;\nvar faUpload = {\n  prefix: 'fas',\n  iconName: 'upload',\n  icon: [512, 512, [], \"f093\", \"M105.4 182.6c12.5 12.49 32.76 12.5 45.25 .001L224 109.3V352c0 17.67 14.33 32 32 32c17.67 0 32-14.33 32-32V109.3l73.38 73.38c12.49 12.49 32.75 12.49 45.25-.001c12.49-12.49 12.49-32.75 0-45.25l-128-128C272.4 3.125 264.2 0 256 0S239.6 3.125 233.4 9.375L105.4 137.4C92.88 149.9 92.88 170.1 105.4 182.6zM480 352h-160c0 35.35-28.65 64-64 64s-64-28.65-64-64H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM432 456c-13.2 0-24-10.8-24-24c0-13.2 10.8-24 24-24s24 10.8 24 24C456 445.2 445.2 456 432 456z\"]\n};\nvar faUser = {\n  prefix: 'fas',\n  iconName: 'user',\n  icon: [448, 512, [62144, 128100], \"f007\", \"M224 256c70.7 0 128-57.31 128-128s-57.3-128-128-128C153.3 0 96 57.31 96 128S153.3 256 224 256zM274.7 304H173.3C77.61 304 0 381.6 0 477.3c0 19.14 15.52 34.67 34.66 34.67h378.7C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304z\"]\n};\nvar faUserAstronaut = {\n  prefix: 'fas',\n  iconName: 'user-astronaut',\n  icon: [448, 512, [], \"f4fb\", \"M176 448C167.3 448 160 455.3 160 464V512h32v-48C192 455.3 184.8 448 176 448zM272 448c-8.75 0-16 7.25-16 16s7.25 16 16 16s16-7.25 16-16S280.8 448 272 448zM164 172l8.205 24.62c1.215 3.645 6.375 3.645 7.59 0L188 172l24.62-8.203c3.646-1.219 3.646-6.375 0-7.594L188 148L179.8 123.4c-1.215-3.648-6.375-3.648-7.59 0L164 148L139.4 156.2c-3.646 1.219-3.646 6.375 0 7.594L164 172zM336.1 315.4C304 338.6 265.1 352 224 352s-80.03-13.43-112.1-36.59C46.55 340.2 0 403.3 0 477.3C0 496.5 15.52 512 34.66 512H128v-64c0-17.75 14.25-32 32-32h128c17.75 0 32 14.25 32 32v64h93.34C432.5 512 448 496.5 448 477.3C448 403.3 401.5 340.2 336.1 315.4zM64 224h13.5C102.3 280.5 158.4 320 224 320s121.8-39.5 146.5-96H384c8.75 0 16-7.25 16-16v-96C400 103.3 392.8 96 384 96h-13.5C345.8 39.5 289.6 0 224 0S102.3 39.5 77.5 96H64C55.25 96 48 103.3 48 112v96C48 216.8 55.25 224 64 224zM104 136C104 113.9 125.5 96 152 96h144c26.5 0 48 17.88 48 40V160c0 53-43 96-96 96h-48c-53 0-96-43-96-96V136z\"]\n};\nvar faUserCheck = {\n  prefix: 'fas',\n  iconName: 'user-check',\n  icon: [640, 512, [], \"f4fc\", \"M274.7 304H173.3C77.61 304 0 381.6 0 477.3C0 496.5 15.52 512 34.66 512H413.3C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM632.3 134.4c-9.703-9-24.91-8.453-33.92 1.266l-87.05 93.75l-38.39-38.39c-9.375-9.375-24.56-9.375-33.94 0s-9.375 24.56 0 33.94l56 56C499.5 285.5 505.6 288 512 288h.4375c6.531-.125 12.72-2.891 17.16-7.672l104-112C642.6 158.6 642 143.4 632.3 134.4z\"]\n};\nvar faUserClock = {\n  prefix: 'fas',\n  iconName: 'user-clock',\n  icon: [640, 512, [], \"f4fd\", \"M496 224c-79.63 0-144 64.38-144 144s64.38 144 144 144s144-64.38 144-144S575.6 224 496 224zM544 384h-54.25C484.4 384 480 379.6 480 374.3V304c0-8.836 7.164-16 16-16c8.838 0 16 7.164 16 16v48h32c8.838 0 16 7.164 16 15.1S552.8 384 544 384zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM320 368c0-19.3 3.221-37.82 8.961-55.2C311.9 307.2 293.6 304 274.7 304H173.3C77.61 304 0 381.7 0 477.4C0 496.5 15.52 512 34.66 512H395C349.7 480.2 320 427.6 320 368z\"]\n};\nvar faUserDoctor = {\n  prefix: 'fas',\n  iconName: 'user-doctor',\n  icon: [448, 512, [\"user-md\"], \"f0f0\", \"M352 128C352 198.7 294.7 256 223.1 256C153.3 256 95.1 198.7 95.1 128C95.1 57.31 153.3 0 223.1 0C294.7 0 352 57.31 352 128zM287.1 362C260.4 369.1 239.1 394.2 239.1 424V448C239.1 452.2 241.7 456.3 244.7 459.3L260.7 475.3C266.9 481.6 277.1 481.6 283.3 475.3C289.6 469.1 289.6 458.9 283.3 452.7L271.1 441.4V424C271.1 406.3 286.3 392 303.1 392C321.7 392 336 406.3 336 424V441.4L324.7 452.7C318.4 458.9 318.4 469.1 324.7 475.3C330.9 481.6 341.1 481.6 347.3 475.3L363.3 459.3C366.3 456.3 368 452.2 368 448V424C368 394.2 347.6 369.1 320 362V308.8C393.5 326.7 448 392.1 448 472V480C448 497.7 433.7 512 416 512H32C14.33 512 0 497.7 0 480V472C0 393 54.53 326.7 128 308.8V370.3C104.9 377.2 88 398.6 88 424C88 454.9 113.1 480 144 480C174.9 480 200 454.9 200 424C200 398.6 183.1 377.2 160 370.3V304.2C162.7 304.1 165.3 304 168 304H280C282.7 304 285.3 304.1 288 304.2L287.1 362zM167.1 424C167.1 437.3 157.3 448 143.1 448C130.7 448 119.1 437.3 119.1 424C119.1 410.7 130.7 400 143.1 400C157.3 400 167.1 410.7 167.1 424z\"]\n};\nvar faUserMd = faUserDoctor;\nvar faUserGear = {\n  prefix: 'fas',\n  iconName: 'user-gear',\n  icon: [640, 512, [\"user-cog\"], \"f4fe\", \"M425.1 482.6c-2.303-1.25-4.572-2.559-6.809-3.93l-7.818 4.493c-6.002 3.504-12.83 5.352-19.75 5.352c-10.71 0-21.13-4.492-28.97-12.75c-18.41-20.09-32.29-44.15-40.22-69.9c-5.352-18.06 2.343-36.87 17.83-45.24l8.018-4.669c-.0664-2.621-.0664-5.242 0-7.859l-7.655-4.461c-12.3-6.953-19.4-19.66-19.64-33.38C305.6 306.3 290.4 304 274.7 304H173.3C77.61 304 0 381.7 0 477.4C0 496.5 15.52 512 34.66 512H413.3c5.727 0 10.9-1.727 15.66-4.188c-2.271-4.984-3.86-10.3-3.86-16.06V482.6zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM610.5 373.3c2.625-14 2.625-28.5 0-42.5l25.75-15c3-1.625 4.375-5.125 3.375-8.5c-6.75-21.5-18.25-41.13-33.25-57.38c-2.25-2.5-6-3.125-9-1.375l-25.75 14.88c-10.88-9.25-23.38-16.5-36.88-21.25V212.3c0-3.375-2.5-6.375-5.75-7c-22.25-5-45-4.875-66.25 0c-3.25 .625-5.625 3.625-5.625 7v29.88c-13.5 4.75-26 12-36.88 21.25L394.4 248.5c-2.875-1.75-6.625-1.125-9 1.375c-15 16.25-26.5 35.88-33.13 57.38c-1 3.375 .3751 6.875 3.25 8.5l25.75 15c-2.5 14-2.5 28.5 0 42.5l-25.75 15c-3 1.625-4.25 5.125-3.25 8.5c6.625 21.5 18.13 41 33.13 57.38c2.375 2.5 6 3.125 9 1.375l25.88-14.88c10.88 9.25 23.38 16.5 36.88 21.25v29.88c0 3.375 2.375 6.375 5.625 7c22.38 5 45 4.875 66.25 0c3.25-.625 5.75-3.625 5.75-7v-29.88c13.5-4.75 26-12 36.88-21.25l25.75 14.88c2.875 1.75 6.75 1.125 9-1.375c15-16.25 26.5-35.88 33.25-57.38c1-3.375-.3751-6.875-3.375-8.5L610.5 373.3zM496 400.5c-26.75 0-48.5-21.75-48.5-48.5s21.75-48.5 48.5-48.5c26.75 0 48.5 21.75 48.5 48.5S522.8 400.5 496 400.5z\"]\n};\nvar faUserCog = faUserGear;\nvar faUserGraduate = {\n  prefix: 'fas',\n  iconName: 'user-graduate',\n  icon: [512, 512, [], \"f501\", \"M45.63 79.75L52 81.25v58.5C45 143.9 40 151.3 40 160c0 8.375 4.625 15.38 11.12 19.75L35.5 242C33.75 248.9 37.63 256 43.13 256h41.75c5.5 0 9.375-7.125 7.625-13.1L76.88 179.8C83.38 175.4 88 168.4 88 160c0-8.75-5-16.12-12-20.25V87.13L128 99.63l.001 60.37c0 70.75 57.25 128 128 128s127.1-57.25 127.1-128L384 99.62l82.25-19.87c18.25-4.375 18.25-27 0-31.5l-190.4-46c-13-3-26.62-3-39.63 0l-190.6 46C27.5 52.63 27.5 75.38 45.63 79.75zM359.2 312.8l-103.2 103.2l-103.2-103.2c-69.93 22.3-120.8 87.2-120.8 164.5C32 496.5 47.53 512 66.67 512h378.7C464.5 512 480 496.5 480 477.3C480 400 429.1 335.1 359.2 312.8z\"]\n};\nvar faUserGroup = {\n  prefix: 'fas',\n  iconName: 'user-group',\n  icon: [640, 512, [128101, \"user-friends\"], \"f500\", \"M224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM274.7 304H173.3c-95.73 0-173.3 77.6-173.3 173.3C0 496.5 15.52 512 34.66 512H413.3C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304zM479.1 320h-73.85C451.2 357.7 480 414.1 480 477.3C480 490.1 476.2 501.9 470 512h138C625.7 512 640 497.6 640 479.1C640 391.6 568.4 320 479.1 320zM432 256C493.9 256 544 205.9 544 144S493.9 32 432 32c-25.11 0-48.04 8.555-66.72 22.51C376.8 76.63 384 101.4 384 128c0 35.52-11.93 68.14-31.59 94.71C372.7 243.2 400.8 256 432 256z\"]\n};\nvar faUserFriends = faUserGroup;\nvar faUserInjured = {\n  prefix: 'fas',\n  iconName: 'user-injured',\n  icon: [448, 512, [], \"f728\", \"M277.4 11.98C261.1 4.469 243.1 0 224 0C170.3 0 124.5 33.13 105.5 80h81.07L277.4 11.98zM342.5 80c-7.895-19.47-20.66-36.19-36.48-49.51L240 80H342.5zM224 256c70.7 0 128-57.31 128-128c0-5.48-.9453-10.7-1.613-16H97.61C96.95 117.3 96 122.5 96 128C96 198.7 153.3 256 224 256zM272 416h-45.14l58.64 93.83C305.4 503.1 320 485.8 320 464C320 437.5 298.5 416 272 416zM274.7 304H173.3c-5.393 0-10.71 .3242-15.98 .8047L206.9 384H272c44.13 0 80 35.88 80 80c0 18.08-6.252 34.59-16.4 48h77.73C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304zM0 477.3C0 496.5 15.52 512 34.66 512H64v-169.1C24.97 374.7 0 423.1 0 477.3zM96 322.4V512h153.1L123.7 311.3C114.1 314.2 104.8 317.9 96 322.4z\"]\n};\nvar faUserLarge = {\n  prefix: 'fas',\n  iconName: 'user-large',\n  icon: [512, 512, [\"user-alt\"], \"f406\", \"M256 288c79.53 0 144-64.47 144-144s-64.47-144-144-144c-79.52 0-144 64.47-144 144S176.5 288 256 288zM351.1 320H160c-88.36 0-160 71.63-160 160c0 17.67 14.33 32 31.1 32H480c17.67 0 31.1-14.33 31.1-32C512 391.6 440.4 320 351.1 320z\"]\n};\nvar faUserAlt = faUserLarge;\nvar faUserLargeSlash = {\n  prefix: 'fas',\n  iconName: 'user-large-slash',\n  icon: [640, 512, [\"user-alt-slash\"], \"f4fa\", \"M284.9 320l-60.9-.0002c-88.36 0-160 71.63-160 159.1C63.1 497.7 78.33 512 95.1 512l448-.0039c.0137 0-.0137 0 0 0l-14.13-.0013L284.9 320zM630.8 469.1l-249.5-195.5c48.74-22.1 82.65-72.1 82.65-129.6c0-79.53-64.47-143.1-143.1-143.1c-69.64 0-127.3 49.57-140.6 115.3L38.81 5.109C34.41 1.672 29.19 0 24.03 0C16.91 0 9.845 3.156 5.127 9.187c-8.187 10.44-6.375 25.53 4.062 33.7L601.2 506.9c10.5 8.203 25.56 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faUserAltSlash = faUserLargeSlash;\nvar faUserLock = {\n  prefix: 'fas',\n  iconName: 'user-lock',\n  icon: [640, 512, [], \"f502\", \"M592 288H576V212.7c0-41.84-30.03-80.04-71.66-84.27C456.5 123.6 416 161.1 416 208V288h-16C373.6 288 352 309.6 352 336v128c0 26.4 21.6 48 48 48h192c26.4 0 48-21.6 48-48v-128C640 309.6 618.4 288 592 288zM496 432c-17.62 0-32-14.38-32-32s14.38-32 32-32s32 14.38 32 32S513.6 432 496 432zM528 288h-64V208c0-17.62 14.38-32 32-32s32 14.38 32 32V288zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM320 336c0-8.672 1.738-16.87 4.303-24.7C308.6 306.6 291.9 304 274.7 304H173.3C77.61 304 0 381.7 0 477.4C0 496.5 15.52 512 34.66 512h301.7C326.3 498.6 320 482.1 320 464V336z\"]\n};\nvar faUserMinus = {\n  prefix: 'fas',\n  iconName: 'user-minus',\n  icon: [640, 512, [], \"f503\", \"M274.7 304H173.3C77.61 304 0 381.6 0 477.3C0 496.5 15.52 512 34.66 512h378.7C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM616 200h-144C458.8 200 448 210.8 448 224s10.75 24 24 24h144C629.3 248 640 237.3 640 224S629.3 200 616 200z\"]\n};\nvar faUserNinja = {\n  prefix: 'fas',\n  iconName: 'user-ninja',\n  icon: [512, 512, [129399], \"f504\", \"M64 192c27.25 0 51.75-11.5 69.25-29.75c15 54 64 93.75 122.8 93.75c70.75 0 127.1-57.25 127.1-128s-57.25-128-127.1-128c-50.38 0-93.63 29.38-114.5 71.75C124.1 47.75 96 32 64 32c0 33.37 17.12 62.75 43.13 80C81.13 129.3 64 158.6 64 192zM208 96h95.1C321.7 96 336 110.3 336 128h-160C176 110.3 190.3 96 208 96zM337.8 306.9L256 416L174.2 306.9C93.36 321.6 32 392.2 32 477.3c0 19.14 15.52 34.67 34.66 34.67H445.3c19.14 0 34.66-15.52 34.66-34.67C480 392.2 418.6 321.6 337.8 306.9z\"]\n};\nvar faUserNurse = {\n  prefix: 'fas',\n  iconName: 'user-nurse',\n  icon: [448, 512, [], \"f82f\", \"M224 304c70.75 0 128-57.25 128-128V65.88c0-13.38-8.25-25.38-20.75-30L246.5 4.125C239.3 1.375 231.6 0 224 0S208.8 1.375 201.5 4.125L116.8 35.88C104.3 40.5 96 52.5 96 65.88V176C96 246.8 153.3 304 224 304zM184 71.63c0-2.75 2.25-5 5-5h21.62V45c0-2.75 2.25-5 5-5h16.75c2.75 0 5 2.25 5 5v21.62H259c2.75 0 5 2.25 5 5v16.75c0 2.75-2.25 5-5 5h-21.62V115c0 2.75-2.25 5-5 5H215.6c-2.75 0-5-2.25-5-5V93.38H189c-2.75 0-5-2.25-5-5V71.63zM144 160h160v16C304 220.1 268.1 256 224 256S144 220.1 144 176V160zM327.2 312.8L224 416L120.8 312.8c-69.93 22.3-120.8 87.25-120.8 164.6C.0006 496.5 15.52 512 34.66 512H413.3c19.14 0 34.66-15.46 34.66-34.61C447.1 400.1 397.1 335.1 327.2 312.8z\"]\n};\nvar faUserPen = {\n  prefix: 'fas',\n  iconName: 'user-pen',\n  icon: [640, 512, [\"user-edit\"], \"f4ff\", \"M223.1 256c70.7 0 128-57.31 128-128s-57.3-128-128-128C153.3 0 96 57.31 96 128S153.3 256 223.1 256zM274.7 304H173.3C77.61 304 0 381.7 0 477.4C0 496.5 15.52 512 34.66 512h286.4c-1.246-5.531-1.43-11.31-.2832-17.04l14.28-71.41c1.943-9.723 6.676-18.56 13.68-25.56l45.72-45.72C363.3 322.4 321.2 304 274.7 304zM371.4 420.6c-2.514 2.512-4.227 5.715-4.924 9.203l-14.28 71.41c-1.258 6.289 4.293 11.84 10.59 10.59l71.42-14.29c3.482-.6992 6.682-2.406 9.195-4.922l125.3-125.3l-72.01-72.01L371.4 420.6zM629.5 255.7l-21.1-21.11c-14.06-14.06-36.85-14.06-50.91 0l-38.13 38.14l72.01 72.01l38.13-38.13C643.5 292.5 643.5 269.7 629.5 255.7z\"]\n};\nvar faUserEdit = faUserPen;\nvar faUserPlus = {\n  prefix: 'fas',\n  iconName: 'user-plus',\n  icon: [640, 512, [], \"f234\", \"M224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM274.7 304H173.3C77.61 304 0 381.6 0 477.3C0 496.5 15.52 512 34.66 512h378.7C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304zM616 200h-48v-48C568 138.8 557.3 128 544 128s-24 10.75-24 24v48h-48C458.8 200 448 210.8 448 224s10.75 24 24 24h48v48C520 309.3 530.8 320 544 320s24-10.75 24-24v-48h48C629.3 248 640 237.3 640 224S629.3 200 616 200z\"]\n};\nvar faUserSecret = {\n  prefix: 'fas',\n  iconName: 'user-secret',\n  icon: [448, 512, [128373], \"f21b\", \"M377.7 338.8l37.15-92.87C419 235.4 411.3 224 399.1 224h-57.48C348.5 209.2 352 193 352 176c0-4.117-.8359-8.057-1.217-12.08C390.7 155.1 416 142.3 416 128c0-16.08-31.75-30.28-80.31-38.99C323.8 45.15 304.9 0 277.4 0c-10.38 0-19.62 4.5-27.38 10.5c-15.25 11.88-36.75 11.88-52 0C190.3 4.5 181.1 0 170.7 0C143.2 0 124.4 45.16 112.5 88.98C63.83 97.68 32 111.9 32 128c0 14.34 25.31 27.13 65.22 35.92C96.84 167.9 96 171.9 96 176C96 193 99.47 209.2 105.5 224H48.02C36.7 224 28.96 235.4 33.16 245.9l37.15 92.87C27.87 370.4 0 420.4 0 477.3C0 496.5 15.52 512 34.66 512H413.3C432.5 512 448 496.5 448 477.3C448 420.4 420.1 370.4 377.7 338.8zM176 479.1L128 288l64 32l16 32L176 479.1zM271.1 479.1L240 352l16-32l64-32L271.1 479.1zM320 186C320 207 302.8 224 281.6 224h-12.33c-16.46 0-30.29-10.39-35.63-24.99C232.1 194.9 228.4 192 224 192S215.9 194.9 214.4 199C209 213.6 195.2 224 178.8 224h-12.33C145.2 224 128 207 128 186V169.5C156.3 173.6 188.1 176 224 176s67.74-2.383 96-6.473V186z\"]\n};\nvar faUserShield = {\n  prefix: 'fas',\n  iconName: 'user-shield',\n  icon: [640, 512, [], \"f505\", \"M622.3 271.1l-115.1-45.01c-4.125-1.629-12.62-3.754-22.25 0L369.8 271.1C359 275.2 352 285.1 352 295.1c0 111.6 68.75 188.8 132.9 213.9c9.625 3.75 18 1.625 22.25 0C558.4 489.9 640 420.5 640 295.1C640 285.1 633 275.2 622.3 271.1zM496 462.4V273.2l95.5 37.38C585.9 397.8 530.6 446 496 462.4zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM320.6 310.3C305.9 306.3 290.6 304 274.7 304H173.3C77.61 304 0 381.7 0 477.4C0 496.5 15.52 512 34.66 512H413.3c3.143 0 5.967-1.004 8.861-1.789C369.7 469.8 324.1 400.3 320.6 310.3z\"]\n};\nvar faUserSlash = {\n  prefix: 'fas',\n  iconName: 'user-slash',\n  icon: [640, 512, [], \"f506\", \"M95.1 477.3c0 19.14 15.52 34.67 34.66 34.67h378.7c5.625 0 10.73-1.65 15.42-4.029L264.9 304.3C171.3 306.7 95.1 383.1 95.1 477.3zM630.8 469.1l-277.1-217.9c54.69-14.56 95.18-63.95 95.18-123.2C447.1 57.31 390.7 0 319.1 0C250.2 0 193.7 55.93 192.3 125.4l-153.4-120.3C34.41 1.672 29.19 0 24.03 0C16.91 0 9.845 3.156 5.127 9.187c-8.187 10.44-6.375 25.53 4.062 33.7L601.2 506.9c10.5 8.203 25.56 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faUserTag = {\n  prefix: 'fas',\n  iconName: 'user-tag',\n  icon: [640, 512, [], \"f507\", \"M351.8 367.3v-44.1C328.5 310.7 302.4 304 274.7 304H173.3c-95.73 0-173.3 77.65-173.3 173.4C.0005 496.5 15.52 512 34.66 512h378.7c11.86 0 21.82-6.337 28.07-15.43l-61.65-61.57C361.7 416.9 351.8 392.9 351.8 367.3zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM630.6 364.8L540.3 274.8C528.3 262.8 512 256 495 256h-79.23c-17.75 0-31.99 14.25-31.99 32l.0147 79.2c0 17 6.647 33.15 18.65 45.15l90.31 90.27c12.5 12.5 32.74 12.5 45.24 0l92.49-92.5C643.1 397.6 643.1 377.3 630.6 364.8zM447.8 343.9c-13.25 0-24-10.62-24-24c0-13.25 10.75-24 24-24c13.38 0 24 10.75 24 24S461.1 343.9 447.8 343.9z\"]\n};\nvar faUserTie = {\n  prefix: 'fas',\n  iconName: 'user-tie',\n  icon: [448, 512, [], \"f508\", \"M352 128C352 198.7 294.7 256 224 256C153.3 256 96 198.7 96 128C96 57.31 153.3 0 224 0C294.7 0 352 57.31 352 128zM209.1 359.2L176 304H272L238.9 359.2L272.2 483.1L311.7 321.9C388.9 333.9 448 400.7 448 481.3C448 498.2 434.2 512 417.3 512H30.72C13.75 512 0 498.2 0 481.3C0 400.7 59.09 333.9 136.3 321.9L175.8 483.1L209.1 359.2z\"]\n};\nvar faUserXmark = {\n  prefix: 'fas',\n  iconName: 'user-xmark',\n  icon: [640, 512, [\"user-times\"], \"f235\", \"M274.7 304H173.3C77.61 304 0 381.6 0 477.3C0 496.5 15.52 512 34.66 512h378.7C432.5 512 448 496.5 448 477.3C448 381.6 370.4 304 274.7 304zM224 256c70.7 0 128-57.31 128-128S294.7 0 224 0C153.3 0 96 57.31 96 128S153.3 256 224 256zM577.9 223.1l47.03-47.03c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L544 190.1l-47.03-47.03c-9.375-9.375-24.56-9.375-33.94 0s-9.375 24.56 0 33.94l47.03 47.03l-47.03 47.03c-9.375 9.375-9.375 24.56 0 33.94c9.373 9.373 24.56 9.381 33.94 0L544 257.9l47.03 47.03c9.373 9.373 24.56 9.381 33.94 0c9.375-9.375 9.375-24.56 0-33.94L577.9 223.1z\"]\n};\nvar faUserTimes = faUserXmark;\nvar faUsers = {\n  prefix: 'fas',\n  iconName: 'users',\n  icon: [640, 512, [], \"f0c0\", \"M319.9 320c57.41 0 103.1-46.56 103.1-104c0-57.44-46.54-104-103.1-104c-57.41 0-103.1 46.56-103.1 104C215.9 273.4 262.5 320 319.9 320zM369.9 352H270.1C191.6 352 128 411.7 128 485.3C128 500.1 140.7 512 156.4 512h327.2C499.3 512 512 500.1 512 485.3C512 411.7 448.4 352 369.9 352zM512 160c44.18 0 80-35.82 80-80S556.2 0 512 0c-44.18 0-80 35.82-80 80S467.8 160 512 160zM183.9 216c0-5.449 .9824-10.63 1.609-15.91C174.6 194.1 162.6 192 149.9 192H88.08C39.44 192 0 233.8 0 285.3C0 295.6 7.887 304 17.62 304h199.5C196.7 280.2 183.9 249.7 183.9 216zM128 160c44.18 0 80-35.82 80-80S172.2 0 128 0C83.82 0 48 35.82 48 80S83.82 160 128 160zM551.9 192h-61.84c-12.8 0-24.88 3.037-35.86 8.24C454.8 205.5 455.8 210.6 455.8 216c0 33.71-12.78 64.21-33.16 88h199.7C632.1 304 640 295.6 640 285.3C640 233.8 600.6 192 551.9 192z\"]\n};\nvar faUsersBetweenLines = {\n  prefix: 'fas',\n  iconName: 'users-between-lines',\n  icon: [640, 512, [], \"e591\", \"M0 24C0 10.75 10.75 0 24 0H616C629.3 0 640 10.75 640 24C640 37.25 629.3 48 616 48H24C10.75 48 0 37.25 0 24zM0 488C0 474.7 10.75 464 24 464H616C629.3 464 640 474.7 640 488C640 501.3 629.3 512 616 512H24C10.75 512 0 501.3 0 488zM211.2 160C211.2 195.3 182.5 224 147.2 224C111.9 224 83.2 195.3 83.2 160C83.2 124.7 111.9 96 147.2 96C182.5 96 211.2 124.7 211.2 160zM32 320C32 284.7 60.65 256 96 256H192C204.2 256 215.7 259.4 225.4 265.4C188.2 280.5 159.8 312.6 149.6 352H64C46.33 352 32 337.7 32 320V320zM415.9 264.6C425.3 259.1 436.3 256 448 256H544C579.3 256 608 284.7 608 320C608 337.7 593.7 352 576 352H493.6C483.2 311.9 453.1 279.4 415.9 264.6zM391.2 290.4C423.3 297.8 449.3 321.3 460.1 352C463.7 362 465.6 372.8 465.6 384C465.6 401.7 451.3 416 433.6 416H209.6C191.9 416 177.6 401.7 177.6 384C177.6 372.8 179.5 362 183.1 352C193.6 322.3 218.3 299.2 249.1 291.1C256.1 289.1 265.1 288 273.6 288H369.6C377 288 384.3 288.8 391.2 290.4zM563.2 160C563.2 195.3 534.5 224 499.2 224C463.9 224 435.2 195.3 435.2 160C435.2 124.7 463.9 96 499.2 96C534.5 96 563.2 124.7 563.2 160zM241.6 176C241.6 131.8 277.4 96 321.6 96C365.8 96 401.6 131.8 401.6 176C401.6 220.2 365.8 256 321.6 256C277.4 256 241.6 220.2 241.6 176z\"]\n};\nvar faUsersGear = {\n  prefix: 'fas',\n  iconName: 'users-gear',\n  icon: [640, 512, [\"users-cog\"], \"f509\", \"M512 160c44.18 0 80-35.82 80-80S556.2 0 512 0c-44.18 0-80 35.82-80 80S467.8 160 512 160zM128 160c44.18 0 80-35.82 80-80S172.2 0 128 0C83.82 0 48 35.82 48 80S83.82 160 128 160zM319.9 320c57.41 0 103.1-46.56 103.1-104c0-57.44-46.54-104-103.1-104c-57.41 0-103.1 46.56-103.1 104C215.9 273.4 262.5 320 319.9 320zM368 400c0-16.69 3.398-32.46 8.619-47.36C374.3 352.5 372.2 352 369.9 352H270.1C191.6 352 128 411.7 128 485.3C128 500.1 140.7 512 156.4 512h266.1C389.5 485.6 368 445.5 368 400zM183.9 216c0-5.449 .9824-10.63 1.609-15.91C174.6 194.1 162.6 192 149.9 192H88.08C39.44 192 0 233.8 0 285.3C0 295.6 7.887 304 17.62 304h199.5C196.7 280.2 183.9 249.7 183.9 216zM551.9 192h-61.84c-12.8 0-24.88 3.037-35.86 8.24C454.8 205.5 455.8 210.6 455.8 216c0 21.47-5.625 41.38-14.65 59.34C462.2 263.4 486.1 256 512 256c42.48 0 80.27 18.74 106.6 48h3.756C632.1 304 640 295.6 640 285.3C640 233.8 600.6 192 551.9 192zM618.1 366.7c-5.025-16.01-13.59-30.62-24.75-42.71c-1.674-1.861-4.467-2.326-6.699-1.023l-19.17 11.07c-8.096-6.887-17.4-12.28-27.45-15.82V295.1c0-2.514-1.861-4.746-4.281-5.213c-16.56-3.723-33.5-3.629-49.32 0C484.9 291.2 483.1 293.5 483.1 295.1v22.24c-10.05 3.537-19.36 8.932-27.45 15.82l-19.26-11.07c-2.139-1.303-4.932-.8379-6.697 1.023c-11.17 12.1-19.73 26.71-24.66 42.71c-.7441 2.512 .2793 5.117 2.42 6.326l19.17 11.17c-1.859 10.42-1.859 21.21 0 31.64l-19.17 11.17c-2.234 1.209-3.164 3.816-2.42 6.328c4.932 16.01 13.49 30.52 24.66 42.71c1.766 1.863 4.467 2.328 6.697 1.025l19.26-11.07c8.094 6.887 17.4 12.28 27.45 15.82v22.24c0 2.514 1.77 4.746 4.188 5.211c16.66 3.723 33.5 3.629 49.32 0c2.42-.4648 4.281-2.697 4.281-5.211v-22.24c10.05-3.535 19.36-8.932 27.45-15.82l19.17 11.07c2.141 1.303 5.025 .8379 6.699-1.025c11.17-12.1 19.73-26.7 24.75-42.71c.7441-2.512-.2773-5.119-2.512-6.328l-19.17-11.17c1.953-10.42 1.953-21.22 0-31.64l19.17-11.17C618.7 371.8 619.7 369.2 618.1 366.7zM512 432c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32s32 14.33 32 32C544 417.7 529.7 432 512 432z\"]\n};\nvar faUsersCog = faUsersGear;\nvar faUsersLine = {\n  prefix: 'fas',\n  iconName: 'users-line',\n  icon: [640, 512, [], \"e592\", \"M211.2 96C211.2 131.3 182.5 160 147.2 160C111.9 160 83.2 131.3 83.2 96C83.2 60.65 111.9 32 147.2 32C182.5 32 211.2 60.65 211.2 96zM32 256C32 220.7 60.65 192 96 192H192C204.2 192 215.7 195.4 225.4 201.4C188.2 216.5 159.8 248.6 149.6 288H64C46.33 288 32 273.7 32 256V256zM415.9 200.6C425.3 195.1 436.3 192 448 192H544C579.3 192 608 220.7 608 256C608 273.7 593.7 288 576 288H493.6C483.2 247.9 453.1 215.4 415.9 200.6zM391.2 226.4C423.3 233.8 449.3 257.3 460.1 288C463.7 298 465.6 308.8 465.6 320C465.6 337.7 451.3 352 433.6 352H209.6C191.9 352 177.6 337.7 177.6 320C177.6 308.8 179.5 298 183.1 288C193.6 258.3 218.3 235.2 249.1 227.1C256.1 225.1 265.1 224 273.6 224H369.6C377 224 384.3 224.8 391.2 226.4zM563.2 96C563.2 131.3 534.5 160 499.2 160C463.9 160 435.2 131.3 435.2 96C435.2 60.65 463.9 32 499.2 32C534.5 32 563.2 60.65 563.2 96zM241.6 112C241.6 67.82 277.4 32 321.6 32C365.8 32 401.6 67.82 401.6 112C401.6 156.2 365.8 192 321.6 192C277.4 192 241.6 156.2 241.6 112zM608 416C625.7 416 640 430.3 640 448C640 465.7 625.7 480 608 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H608z\"]\n};\nvar faUsersRays = {\n  prefix: 'fas',\n  iconName: 'users-rays',\n  icon: [640, 512, [], \"e593\", \"M112.1 79.03C122.3 88.4 122.3 103.6 112.1 112.1C103.6 122.3 88.4 122.3 79.03 112.1L7.029 40.97C-2.343 31.6-2.343 16.4 7.029 7.029C16.4-2.343 31.6-2.343 40.97 7.029L112.1 79.03zM599 7.029C608.4-2.343 623.6-2.343 632.1 7.029C642.3 16.4 642.3 31.6 632.1 40.97L560.1 112.1C551.6 122.3 536.4 122.3 527 112.1C517.7 103.6 517.7 88.4 527 79.03L599 7.029zM7.029 471L79.03 399C88.4 389.7 103.6 389.7 112.1 399C122.3 408.4 122.3 423.6 112.1 432.1L40.97 504.1C31.6 514.3 16.4 514.3 7.029 504.1C-2.343 495.6-2.343 480.4 7.029 471V471zM527 432.1C517.7 423.6 517.7 408.4 527 399C536.4 389.7 551.6 389.7 560.1 399L632.1 471C642.3 480.4 642.3 495.6 632.1 504.1C623.6 514.3 608.4 514.3 599 504.1L527 432.1zM256 192C256 156.7 284.7 128 320 128C355.3 128 384 156.7 384 192C384 227.3 355.3 256 320 256C284.7 256 256 227.3 256 192zM265.5 289.5C266.3 289.3 267.1 289.1 267.1 288.1C271.9 288.3 275.9 288 280 288H360C364.1 288 368.1 288.3 372 288.1C396.6 293.1 416.9 309.7 426.3 331.1C426.9 333.3 427.4 334.6 427.9 336C430.6 343.5 432 351.6 432 360C432 373.3 421.3 384 408 384H232C218.7 384 208 373.3 208 360C208 351.6 209.4 343.5 212.1 336C220.4 312.5 240.6 294.6 265.5 289.5V289.5zM127.8 176C127.8 149.5 149.3 128 175.8 128C202.3 128 223.8 149.5 223.8 176C223.8 202.5 202.3 224 175.8 224C149.3 224 127.8 202.5 127.8 176V176zM218.7 256C227.8 256 236.5 258.3 244 262.4C211.6 274.3 186.8 301.9 178.8 336H122.7C107.9 336 96 324.1 96 309.3C96 279.9 119.9 256 149.3 256H218.7zM517.3 336H461.2C453.2 301.9 428.4 274.3 395.1 262.4C403.5 258.3 412.2 256 421.3 256H490.7C520.1 256 544 279.9 544 309.3C544 324.1 532.1 336 517.3 336H517.3zM416 176C416 149.5 437.5 128 464 128C490.5 128 512 149.5 512 176C512 202.5 490.5 224 464 224C437.5 224 416 202.5 416 176z\"]\n};\nvar faUsersRectangle = {\n  prefix: 'fas',\n  iconName: 'users-rectangle',\n  icon: [640, 512, [], \"e594\", \"M223.8 176C223.8 202.5 202.3 224 175.8 224C149.3 224 127.8 202.5 127.8 176C127.8 149.5 149.3 128 175.8 128C202.3 128 223.8 149.5 223.8 176zM96 309.3C96 279.9 119.9 256 149.3 256H218.7C227.8 256 236.5 258.3 244 262.4C211.6 274.3 186.8 301.9 178.8 336H122.7C107.9 336 96 324.1 96 309.3H96zM395.1 262.4C403.5 258.3 412.2 256 421.3 256H490.7C520.1 256 544 279.9 544 309.3C544 324.1 532.1 336 517.3 336H461.2C453.2 301.9 428.4 274.3 395.1 262.4H395.1zM372 288.1C398 293.4 419.3 311.7 427.9 336C430.6 343.5 432 351.6 432 360C432 373.3 421.3 384 408 384H232C218.7 384 208 373.3 208 360C208 351.6 209.4 343.5 212.1 336C220.7 311.7 241.1 293.4 267.1 288.1C271.9 288.3 275.9 288 280 288H360C364.1 288 368.1 288.3 372 288.1V288.1zM512 176C512 202.5 490.5 224 464 224C437.5 224 416 202.5 416 176C416 149.5 437.5 128 464 128C490.5 128 512 149.5 512 176zM256 192C256 156.7 284.7 128 320 128C355.3 128 384 156.7 384 192C384 227.3 355.3 256 320 256C284.7 256 256 227.3 256 192zM544 0C597 0 640 42.98 640 96V416C640 469 597 512 544 512H96C42.98 512 0 469 0 416V96C0 42.98 42.98 0 96 0H544zM64 416C64 433.7 78.33 448 96 448H544C561.7 448 576 433.7 576 416V96C576 78.33 561.7 64 544 64H96C78.33 64 64 78.33 64 96V416z\"]\n};\nvar faUsersSlash = {\n  prefix: 'fas',\n  iconName: 'users-slash',\n  icon: [640, 512, [], \"e073\", \"M512 160c44.18 0 80-35.82 80-80S556.2 0 512 0c-44.18 0-80 35.82-80 80S467.8 160 512 160zM490.1 192c-12.8 0-24.88 3.037-35.86 8.24C454.8 205.5 455.8 210.6 455.8 216c0 33.71-12.78 64.21-33.16 88h199.7C632.1 304 640 295.6 640 285.3C640 233.8 600.6 192 551.9 192H490.1zM396.6 285.5C413.4 267.2 423.8 242.9 423.8 216c0-57.44-46.54-104-103.1-104c-35.93 0-67.07 18.53-85.59 46.3L193.1 126.1C202.4 113.1 208 97.24 208 80C208 35.82 172.2 0 128 0C103.8 0 82.52 10.97 67.96 27.95L38.81 5.109C34.41 1.672 29.19 0 24.03 0C16.91 0 9.846 3.156 5.127 9.188C-3.061 19.62-1.248 34.72 9.189 42.89l591.1 463.1c10.5 8.203 25.56 6.328 33.69-4.078c8.188-10.44 6.375-25.53-4.062-33.7L396.6 285.5zM270.1 352C191.6 352 128 411.7 128 485.3C128 500.1 140.7 512 156.4 512h327.2c11.62 0 21.54-6.583 25.95-15.96L325.7 352H270.1zM186.1 243.2L121.6 192H88.08C39.44 192 0 233.8 0 285.3C0 295.6 7.887 304 17.62 304h199.5C202.4 286.8 191.8 266.1 186.1 243.2z\"]\n};\nvar faUsersViewfinder = {\n  prefix: 'fas',\n  iconName: 'users-viewfinder',\n  icon: [640, 512, [], \"e595\", \"M48 136C48 149.3 37.25 160 24 160C10.75 160 0 149.3 0 136V32C0 14.33 14.33 0 32 0H136C149.3 0 160 10.75 160 24C160 37.25 149.3 48 136 48H48V136zM127.8 176C127.8 149.5 149.3 128 175.8 128C202.3 128 223.8 149.5 223.8 176C223.8 202.5 202.3 224 175.8 224C149.3 224 127.8 202.5 127.8 176V176zM218.7 256C227.8 256 236.5 258.3 244 262.4C211.6 274.3 186.8 301.9 178.8 336H122.7C107.9 336 96 324.1 96 309.3C96 279.9 119.9 256 149.3 256H218.7zM517.3 336H461.2C453.2 301.9 428.4 274.3 395.1 262.4C403.5 258.3 412.2 256 421.3 256H490.7C520.1 256 544 279.9 544 309.3C544 324.1 532.1 336 517.3 336H517.3zM432 360C432 373.3 421.3 384 408 384H232C218.7 384 208 373.3 208 360C208 351.6 209.4 343.5 212.1 336C220.7 311.7 241.1 293.4 267.1 288.1C271.9 288.3 275.9 288 280 288H360C364.1 288 368.1 288.3 372 288.1C398 293.4 419.3 311.7 427.9 336C430.6 343.5 432 351.6 432 360zM416 176C416 149.5 437.5 128 464 128C490.5 128 512 149.5 512 176C512 202.5 490.5 224 464 224C437.5 224 416 202.5 416 176zM384 192C384 227.3 355.3 256 320 256C284.7 256 256 227.3 256 192C256 156.7 284.7 128 320 128C355.3 128 384 156.7 384 192zM480 24C480 10.75 490.7 0 504 0H608C625.7 0 640 14.33 640 32V136C640 149.3 629.3 160 616 160C602.7 160 592 149.3 592 136V48H504C490.7 48 480 37.25 480 24zM48 464H136C149.3 464 160 474.7 160 488C160 501.3 149.3 512 136 512H32C14.33 512 0 497.7 0 480V376C0 362.7 10.75 352 24 352C37.25 352 48 362.7 48 376V464zM504 464H592V376C592 362.7 602.7 352 616 352C629.3 352 640 362.7 640 376V480C640 497.7 625.7 512 608 512H504C490.7 512 480 501.3 480 488C480 474.7 490.7 464 504 464z\"]\n};\nvar faUtensils = {\n  prefix: 'fas',\n  iconName: 'utensils',\n  icon: [448, 512, [61685, 127860, \"cutlery\"], \"f2e7\", \"M221.6 148.7C224.7 161.3 224.8 174.5 222.1 187.2C219.3 199.1 213.6 211.9 205.6 222.1C191.1 238.6 173 249.1 151.1 254.1V472C151.1 482.6 147.8 492.8 140.3 500.3C132.8 507.8 122.6 512 111.1 512C101.4 512 91.22 507.8 83.71 500.3C76.21 492.8 71.1 482.6 71.1 472V254.1C50.96 250.1 31.96 238.9 18.3 222.4C10.19 212.2 4.529 200.3 1.755 187.5C-1.019 174.7-.8315 161.5 2.303 148.8L32.51 12.45C33.36 8.598 35.61 5.197 38.82 2.9C42.02 .602 45.97-.4297 49.89 .0026C53.82 .4302 57.46 2.303 60.1 5.259C62.74 8.214 64.18 12.04 64.16 16V160H81.53L98.62 11.91C99.02 8.635 100.6 5.621 103.1 3.434C105.5 1.248 108.7 .0401 111.1 .0401C115.3 .0401 118.5 1.248 120.9 3.434C123.4 5.621 124.1 8.635 125.4 11.91L142.5 160H159.1V16C159.1 12.07 161.4 8.268 163.1 5.317C166.6 2.366 170.2 .474 174.1 .0026C178-.4262 181.1 .619 185.2 2.936C188.4 5.253 190.6 8.677 191.5 12.55L221.6 148.7zM448 472C448 482.6 443.8 492.8 436.3 500.3C428.8 507.8 418.6 512 408 512C397.4 512 387.2 507.8 379.7 500.3C372.2 492.8 368 482.6 368 472V352H351.2C342.8 352 334.4 350.3 326.6 347.1C318.9 343.8 311.8 339.1 305.8 333.1C299.9 327.1 295.2 320 291.1 312.2C288.8 304.4 287.2 296 287.2 287.6L287.1 173.8C288 136.9 299.1 100.8 319.8 70.28C340.5 39.71 369.8 16.05 404.1 2.339C408.1 .401 414.2-.3202 419.4 .2391C424.6 .7982 429.6 2.62 433.9 5.546C438.2 8.472 441.8 12.41 444.2 17.03C446.7 21.64 447.1 26.78 448 32V472z\"]\n};\nvar faCutlery = faUtensils;\nvar faV = {\n  prefix: 'fas',\n  iconName: 'v',\n  icon: [384, 512, [118], \"56\", \"M381.5 76.33l-160 384C216.6 472.2 204.9 480 192 480s-24.56-7.757-29.53-19.68l-160-384c-6.797-16.31 .9062-35.05 17.22-41.84c16.38-6.859 35.08 .9219 41.84 17.22L192 364.8l130.5-313.1c6.766-16.3 25.47-24.09 41.84-17.22C380.6 41.28 388.3 60.01 381.5 76.33z\"]\n};\nvar faVanShuttle = {\n  prefix: 'fas',\n  iconName: 'van-shuttle',\n  icon: [640, 512, [128656, \"shuttle-van\"], \"f5b6\", \"M592 384H576C576 437 533 480 480 480C426.1 480 384 437 384 384H256C256 437 213 480 160 480C106.1 480 64 437 64 384H48C21.49 384 0 362.5 0 336V104C0 64.24 32.24 32 72 32H465.1C483.1 32 501.9 40.34 514.1 54.78L624.1 186.5C634.7 197.1 640 212.6 640 227.7V336C640 362.5 618.5 384 592 384zM64 192H160V96H72C67.58 96 64 99.58 64 104V192zM545.1 192L465.1 96H384V192H545.1zM320 192V96H224V192H320zM480 336C453.5 336 432 357.5 432 384C432 410.5 453.5 432 480 432C506.5 432 528 410.5 528 384C528 357.5 506.5 336 480 336zM160 432C186.5 432 208 410.5 208 384C208 357.5 186.5 336 160 336C133.5 336 112 357.5 112 384C112 410.5 133.5 432 160 432z\"]\n};\nvar faShuttleVan = faVanShuttle;\nvar faVault = {\n  prefix: 'fas',\n  iconName: 'vault',\n  icon: [576, 512, [], \"e2c5\", \"M144 240C144 195.8 179.8 160 224 160C268.2 160 304 195.8 304 240C304 284.2 268.2 320 224 320C179.8 320 144 284.2 144 240zM512 0C547.3 0 576 28.65 576 64V416C576 451.3 547.3 480 512 480H496L480 512H416L400 480H176L160 512H96L80 480H64C28.65 480 0 451.3 0 416V64C0 28.65 28.65 0 64 0H512zM224 400C312.4 400 384 328.4 384 240C384 151.6 312.4 80 224 80C135.6 80 64 151.6 64 240C64 328.4 135.6 400 224 400zM480 221.3C498.6 214.7 512 196.9 512 176C512 149.5 490.5 128 464 128C437.5 128 416 149.5 416 176C416 196.9 429.4 214.7 448 221.3V336C448 344.8 455.2 352 464 352C472.8 352 480 344.8 480 336V221.3z\"]\n};\nvar faVectorSquare = {\n  prefix: 'fas',\n  iconName: 'vector-square',\n  icon: [448, 512, [], \"f5cb\", \"M416 32C433.7 32 448 46.33 448 64V128C448 145.7 433.7 160 416 160V352C433.7 352 448 366.3 448 384V448C448 465.7 433.7 480 416 480H352C334.3 480 320 465.7 320 448H128C128 465.7 113.7 480 96 480H32C14.33 480 0 465.7 0 448V384C0 366.3 14.33 352 32 352V160C14.33 160 0 145.7 0 128V64C0 46.33 14.33 32 32 32H96C113.7 32 128 46.33 128 64H320C320 46.33 334.3 32 352 32H416zM368 80V112H400V80H368zM96 160V352C113.7 352 128 366.3 128 384H320C320 366.3 334.3 352 352 352V160C334.3 160 320 145.7 320 128H128C128 145.7 113.7 160 96 160zM48 400V432H80V400H48zM400 432V400H368V432H400zM80 112V80H48V112H80z\"]\n};\nvar faVenus = {\n  prefix: 'fas',\n  iconName: 'venus',\n  icon: [384, 512, [9792], \"f221\", \"M368 176c0-97.2-78.8-176-176-176c-97.2 0-176 78.8-176 176c0 86.26 62.1 157.9 144 172.1v35.05H112c-8.836 0-16 7.162-16 16v32c0 8.836 7.164 16 16 16H160v48c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16v-48h48c8.838 0 16-7.164 16-16v-32c0-8.838-7.162-16-16-16H224v-35.05C305.9 333.9 368 262.3 368 176zM192 272c-52.93 0-96-43.07-96-96c0-52.94 43.07-96 96-96c52.94 0 96 43.06 96 96C288 228.9 244.9 272 192 272z\"]\n};\nvar faVenusDouble = {\n  prefix: 'fas',\n  iconName: 'venus-double',\n  icon: [640, 512, [9890], \"f226\", \"M368 176c0-97.2-78.8-176-176-176c-97.2 0-176 78.8-176 176c0 86.26 62.1 157.9 144 172.1v35.05H112c-8.836 0-16 7.162-16 16v32c0 8.836 7.164 16 16 16H160v48c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16v-48h48c8.838 0 16-7.164 16-16v-32c0-8.838-7.162-16-16-16H224v-35.05C305.9 333.9 368 262.3 368 176zM192 272c-52.93 0-96-43.07-96-96c0-52.94 43.07-96 96-96c52.94 0 96 43.06 96 96C288 228.9 244.9 272 192 272zM624 176C624 78.8 545.2 0 448 0c-39.02 0-74.95 12.85-104.1 34.34c18.38 19.7 32.94 42.91 42.62 68.58C403.2 88.83 424.5 80 448 80c52.94 0 96 43.06 96 96c0 52.93-43.06 96-96 96c-23.57 0-44.91-8.869-61.63-23.02c-9.572 25.45-23.95 48.54-42.23 68.23C365.1 332.7 389.3 344 416 348.1V384h-48c-8.836 0-16 7.162-16 16v32c0 8.836 7.164 16 16 16H416v48c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16V448h48c8.838 0 16-7.164 16-16v-32c0-8.838-7.162-16-16-16H480v-35.05C561.9 333.9 624 262.3 624 176z\"]\n};\nvar faVenusMars = {\n  prefix: 'fas',\n  iconName: 'venus-mars',\n  icon: [640, 512, [9892], \"f228\", \"M256 384H208v-35.05C289.9 333.9 352 262.3 352 176c0-97.2-78.8-176-176-176c-97.2 0-176 78.8-176 176c0 86.26 62.1 157.9 144 172.1v35.05H96c-8.836 0-16 7.162-16 16v32c0 8.836 7.164 16 16 16h48v48c0 8.836 7.164 16 16 16h32c8.838 0 16-7.164 16-16v-48H256c8.838 0 16-7.164 16-16v-32C272 391.2 264.8 384 256 384zM176 272c-52.93 0-96-43.07-96-96c0-52.94 43.07-96 96-96c52.94 0 96 43.06 96 96C272 228.9 228.9 272 176 272zM624 0h-112.4c-21.38 0-32.09 25.85-16.97 40.97l29.56 29.56l-24.55 24.55c-29.97-20.66-64.81-31.05-99.74-31.05c-15.18 0-30.42 2.225-45.19 6.132c13.55 22.8 22.82 48.36 26.82 75.67c6.088-1.184 12.27-1.785 18.45-1.785c24.58 0 49.17 9.357 67.88 28.07c37.43 37.43 37.43 98.33 0 135.8c-18.71 18.71-43.3 28.07-67.88 28.07c-23.55 0-46.96-8.832-65.35-26.01c-15.92 18.84-34.93 35.1-56.75 47.35c11.45 5.898 20.17 16.3 23.97 28.82C331.5 406 365.7 416 400 416c45.04 0 90.08-17.18 124.5-51.55c60.99-60.99 67.73-155.6 20.47-224.1l24.55-24.55l29.56 29.56c4.889 4.889 10.9 7.078 16.8 7.078C628.2 152.4 640 142.8 640 128.4V16C640 7.164 632.8 0 624 0z\"]\n};\nvar faVest = {\n  prefix: 'fas',\n  iconName: 'vest',\n  icon: [448, 512, [], \"e085\", \"M437.3 239.9L384 160V32c0-17.67-14.33-32-32-32h-32c-4.75 0-9.375 1.406-13.31 4.031l-25 16.66c-35.03 23.38-80.28 23.38-115.4 0l-25-16.66C137.4 1.406 132.8 0 128 0H96C78.33 0 64 14.33 64 32v128L10.75 239.9C3.74 250.4 0 262.7 0 275.4V480c0 17.67 14.33 32 32 32h160V288c0-3.439 .5547-6.855 1.643-10.12l13.49-40.48L150.2 66.56C173.2 79.43 198.5 86.25 224 86.25s50.79-6.824 73.81-19.69L224 288v224h192c17.67 0 32-14.33 32-32V275.4C448 262.7 444.3 250.4 437.3 239.9zM131.3 371.3l-48 48C80.19 422.4 76.09 424 72 424s-8.188-1.562-11.31-4.688c-6.25-6.25-6.25-16.38 0-22.62l48-48c6.25-6.25 16.38-6.25 22.62 0S137.6 365.1 131.3 371.3zM387.3 419.3C384.2 422.4 380.1 424 376 424s-8.188-1.562-11.31-4.688l-48-48c-6.25-6.25-6.25-16.38 0-22.62s16.38-6.25 22.62 0l48 48C393.6 402.9 393.6 413.1 387.3 419.3z\"]\n};\nvar faVestPatches = {\n  prefix: 'fas',\n  iconName: 'vest-patches',\n  icon: [448, 512, [], \"e086\", \"M437.3 239.9L384 160V32c0-17.67-14.33-32-32-32h-32c-4.75 0-9.375 1.406-13.31 4.031l-25 16.66c-35.03 23.38-80.28 23.38-115.4 0l-25-16.66C137.4 1.406 132.8 0 128 0H96C78.33 0 64 14.33 64 32v128L10.75 239.9C3.74 250.4 0 262.7 0 275.4V480c0 17.67 14.33 32 32 32h160V288c0-3.439 .5547-6.855 1.643-10.12l13.49-40.48L150.2 66.56C173.2 79.43 198.5 86.25 224 86.25s50.79-6.824 73.81-19.69L224 288v224h192c17.67 0 32-14.33 32-32V275.4C448 262.7 444.3 250.4 437.3 239.9zM63.5 272.5c-4.656-4.688-4.656-12.31 0-17c4.688-4.688 12.31-4.688 17 0L96 271l15.5-15.5c4.688-4.688 12.31-4.688 17 0c4.656 4.688 4.656 12.31 0 17L113 288l15.5 15.5c4.656 4.688 4.656 12.31 0 17C126.2 322.8 123.1 324 120 324s-6.156-1.156-8.5-3.5L96 305l-15.5 15.5C78.16 322.8 75.06 324 72 324s-6.156-1.156-8.5-3.5c-4.656-4.688-4.656-12.31 0-17L79 288L63.5 272.5zM96 456c-22.09 0-40-17.91-40-40S73.91 376 96 376S136 393.9 136 416S118.1 456 96 456zM359.2 335.8L310.7 336C306.1 336 303.1 333 304 329.3l.2158-48.53c.1445-14.4 12.53-25.98 27.21-24.67c12.79 1.162 22.13 12.62 22.06 25.42l-.0557 5.076l5.069-.0566c12.83-.0352 24.24 9.275 25.4 22.08C385.2 323.3 373.7 335.7 359.2 335.8z\"]\n};\nvar faVial = {\n  prefix: 'fas',\n  iconName: 'vial',\n  icon: [512, 512, [129514], \"f492\", \"M502.6 169.4l-160-160C336.4 3.125 328.2 0 320 0s-16.38 3.125-22.62 9.375c-12.5 12.5-12.5 32.75 0 45.25l6.975 6.977l-271.4 271c-38.75 38.75-45.13 102-9.375 143.5C44.08 500 72.76 512 101.5 512h.4473c26.38 0 52.75-9.1 72.88-30.12l275.2-274.6l7.365 7.367C463.6 220.9 471.8 224 480 224s16.38-3.125 22.62-9.375C515.1 202.1 515.1 181.9 502.6 169.4zM310.6 256H200.2l149.3-149.1l55.18 55.12L310.6 256z\"]\n};\nvar faVialCircleCheck = {\n  prefix: 'fas',\n  iconName: 'vial-circle-check',\n  icon: [512, 512, [], \"e596\", \"M0 64C0 46.33 14.33 32 32 32H224C241.7 32 256 46.33 256 64C256 81.67 241.7 96 224 96V266.8C203.8 295.4 192 330.3 192 368C192 393.2 197.3 417.1 206.8 438.8C189.5 463.7 160.6 480 128 480C74.98 480 32 437 32 384V96C14.33 96 0 81.67 0 64V64zM96 192H160V96H96V192zM512 368C512 447.5 447.5 512 368 512C288.5 512 224 447.5 224 368C224 288.5 288.5 224 368 224C447.5 224 512 288.5 512 368zM412.7 324.7L352 385.4L323.3 356.7C317.1 350.4 306.9 350.4 300.7 356.7C294.4 362.9 294.4 373.1 300.7 379.3L340.7 419.3C346.9 425.6 357.1 425.6 363.3 419.3L435.3 347.3C441.6 341.1 441.6 330.9 435.3 324.7C429.1 318.4 418.9 318.4 412.7 324.7H412.7z\"]\n};\nvar faVialVirus = {\n  prefix: 'fas',\n  iconName: 'vial-virus',\n  icon: [576, 512, [], \"e597\", \"M256 32C273.7 32 288 46.33 288 64C288 81.67 273.7 96 256 96V207.1C252.9 209.1 249.9 211.5 247.2 214.2C225.3 236.1 225.3 271.6 247.2 293.4C247.4 293.6 247.4 293.7 247.5 293.8L247.5 293.8C247.5 293.9 247.5 294.1 247.4 294.4C247.3 294.6 247.1 294.8 247.1 294.8L247 294.9C246.1 294.9 246.8 294.9 246.6 294.9C215.7 294.9 190.6 319.1 190.6 350.9C190.6 381.8 215.7 406.9 246.6 406.9C246.8 406.9 246.1 406.9 247 406.9L247.1 406.9C247.1 406.1 247.3 407.1 247.4 407.4C247.5 407.7 247.5 407.9 247.5 407.1L247.5 408C247.4 408.1 247.4 408.2 247.2 408.3C236 419.5 230.6 434.2 230.8 448.8C213.3 467.1 188 480 160 480C106.1 480 64 437 64 384V96C46.33 96 32 81.67 32 64C32 46.33 46.33 32 64 32H256zM192 192V96H128V192H192zM383.8 189.7C397.1 189.7 407.8 200.4 407.8 213.7C407.8 242.9 443.2 257.6 463.9 236.9C473.3 227.5 488.5 227.5 497.8 236.9C507.2 246.2 507.2 261.4 497.8 270.8C477.2 291.5 491.8 326.9 521.1 326.9C534.3 326.9 545.1 337.6 545.1 350.9C545.1 364.1 534.3 374.9 521.1 374.9C491.8 374.9 477.2 410.3 497.8 430.9C507.2 440.3 507.2 455.5 497.8 464.9C488.5 474.3 473.3 474.3 463.9 464.9C443.2 444.2 407.8 458.9 407.8 488.1C407.8 501.4 397.1 512.1 383.8 512.1C370.6 512.1 359.8 501.4 359.8 488.1C359.8 458.9 324.5 444.2 303.8 464.9C294.4 474.3 279.2 474.3 269.8 464.9C260.5 455.5 260.5 440.3 269.8 430.9C290.5 410.3 275.9 374.9 246.6 374.9C233.4 374.9 222.6 364.1 222.6 350.9C222.6 337.6 233.4 326.9 246.6 326.9C275.9 326.9 290.5 291.5 269.8 270.8C260.5 261.4 260.5 246.2 269.8 236.9C279.2 227.5 294.4 227.5 303.8 236.9C324.5 257.6 359.8 242.9 359.8 213.7C359.8 200.4 370.6 189.7 383.8 189.7H383.8zM352 352C369.7 352 384 337.7 384 320C384 302.3 369.7 288 352 288C334.3 288 320 302.3 320 320C320 337.7 334.3 352 352 352zM416 360C402.7 360 392 370.7 392 384C392 397.3 402.7 408 416 408C429.3 408 440 397.3 440 384C440 370.7 429.3 360 416 360z\"]\n};\nvar faVials = {\n  prefix: 'fas',\n  iconName: 'vials',\n  icon: [512, 512, [], \"f493\", \"M200 32h-176C10.75 32 0 42.74 0 56C0 69.25 10.75 80 24 80H32v320C32 444.1 67.88 480 112 480S192 444.1 192 400v-320h8C213.3 80 224 69.25 224 56C224 42.74 213.3 32 200 32zM144 256h-64V80h64V256zM488 32h-176C298.7 32 288 42.74 288 56c0 13.25 10.75 24 24 24H320v320c0 44.13 35.88 80 80 80s80-35.88 80-80v-320h8C501.3 80 512 69.25 512 56C512 42.74 501.3 32 488 32zM432 256h-64V80h64V256z\"]\n};\nvar faVideo = {\n  prefix: 'fas',\n  iconName: 'video',\n  icon: [576, 512, [\"video-camera\"], \"f03d\", \"M384 112v288c0 26.51-21.49 48-48 48h-288c-26.51 0-48-21.49-48-48v-288c0-26.51 21.49-48 48-48h288C362.5 64 384 85.49 384 112zM576 127.5v256.9c0 25.5-29.17 40.39-50.39 25.79L416 334.7V177.3l109.6-75.56C546.9 87.13 576 102.1 576 127.5z\"]\n};\nvar faVideoCamera = faVideo;\nvar faVideoSlash = {\n  prefix: 'fas',\n  iconName: 'video-slash',\n  icon: [640, 512, [], \"f4e2\", \"M32 399.1c0 26.51 21.49 47.1 47.1 47.1h287.1c19.57 0 36.34-11.75 43.81-28.56L32 121.8L32 399.1zM630.8 469.1l-89.21-69.92l15.99 11.02c21.22 14.59 50.41-.2971 50.41-25.8V127.5c0-25.41-29.07-40.37-50.39-25.76l-109.6 75.56l.0001 148.5l-32-25.08l.0001-188.7c0-26.51-21.49-47.1-47.1-47.1H113.9L38.81 5.111C34.41 1.673 29.19 0 24.03 0C16.91 0 9.84 3.158 5.121 9.189C-3.066 19.63-1.249 34.72 9.189 42.89l591.1 463.1c10.5 8.203 25.57 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1z\"]\n};\nvar faVihara = {\n  prefix: 'fas',\n  iconName: 'vihara',\n  icon: [640, 512, [], \"f6a7\", \"M280.1 22.03L305.8 4.661C307.1 3.715 308.4 2.908 309.9 2.246C313.1 .7309 316.6-.0029 319.1 0C323.4-.0029 326.9 .7309 330.1 2.246C331.6 2.909 332.9 3.716 334.2 4.661L359 22.03C392.1 45.8 430.8 63.52 470.8 74.42L493.8 80.71C495.6 81.17 497.4 81.83 499 82.68C502.2 84.33 504.1 86.66 507.1 89.43C510.8 94.38 512.7 100.7 511.8 107.2C511.4 109.1 510.6 112.6 509.3 115C507.7 118.2 505.3 120.1 502.6 123.1C498.3 126.3 492.1 128.1 487.5 128H480V184.1L491.7 193.3C512.8 210 536.6 222.9 562.2 231.4L591.1 241.1C592.7 241.6 594.2 242.2 595.7 243C598.8 244.8 601.4 247.2 603.5 249.1C605.5 252.8 606.9 256 607.6 259.6C608.1 262.2 608.2 265 607.7 267.8C607.2 270.6 606.3 273.3 604.1 275.7C603.2 278.8 600.8 281.5 598 283.5C595.2 285.5 591.1 286.9 588.4 287.6C586.8 287.9 585.1 288 583.4 288H544V353.9C564.5 376.7 591.4 393 621.4 400.6C632 403 640 412.6 640 424C640 437.3 629.3 448 616 448H576V480C576 497.7 561.7 512 544 512C526.3 512 512 497.7 512 480V448H352V480C352 497.7 337.7 512 320 512C302.3 512 288 497.7 288 480V448H128V480C128 497.7 113.7 512 96 512C78.33 512 64 497.7 64 480V448H24C10.75 448 0 437.3 0 424C0 412.6 7.962 403 18.63 400.6C48.61 393 75.51 376.7 96 353.9V288H56.55C54.87 288 53.2 287.9 51.57 287.6C48.03 286.9 44.77 285.5 41.96 283.5C39.16 281.5 36.77 278.8 35.03 275.7C33.69 273.3 32.76 270.6 32.31 267.8C31.85 265 31.9 262.2 32.41 259.6C33.07 256 34.51 252.8 36.53 249.1C38.55 247.2 41.19 244.8 44.34 243C45.78 242.2 47.32 241.6 48.94 241.1L77.81 231.4C103.4 222.9 127.2 210 148.3 193.3L160 184.1V128H152.5C147 128.1 141.7 126.3 137.4 123.1C134.7 120.1 132.3 118.2 130.7 115C129.4 112.6 128.6 109.1 128.2 107.2C127.3 100.7 129.2 94.38 132.9 89.43C135 86.66 137.8 84.33 140.1 82.68C142.6 81.83 144.4 81.17 146.2 80.71L169.2 74.42C209.2 63.52 247 45.8 280.1 22.03H280.1zM223.1 128V192H416V128H223.1zM159.1 352H480V288H159.1V352z\"]\n};\nvar faVirus = {\n  prefix: 'fas',\n  iconName: 'virus',\n  icon: [512, 512, [], \"e074\", \"M288 43.55C288 93.44 348.3 118.4 383.6 83.15L391.8 74.98C404.3 62.48 424.5 62.48 437 74.98C449.5 87.48 449.5 107.7 437 120.2L428.9 128.4C393.6 163.7 418.6 224 468.5 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H468.5C418.6 288 393.6 348.3 428.9 383.6L437 391.8C449.5 404.3 449.5 424.5 437 437C424.5 449.5 404.3 449.5 391.8 437L383.6 428.9C348.3 393.6 288 418.6 288 468.5V480C288 497.7 273.7 512 256 512C238.3 512 224 497.7 224 480V468.5C224 418.6 163.7 393.6 128.4 428.9L120.2 437C107.7 449.5 87.48 449.5 74.98 437C62.48 424.5 62.48 404.3 74.98 391.8L83.15 383.6C118.4 348.3 93.44 288 43.55 288H32C14.33 288 0 273.7 0 256C0 238.3 14.33 224 32 224H43.55C93.44 224 118.4 163.7 83.15 128.4L74.98 120.2C62.48 107.7 62.48 87.48 74.98 74.98C87.48 62.48 107.7 62.48 120.2 74.98L128.4 83.15C163.7 118.4 224 93.44 224 43.55V32C224 14.33 238.3 0 256 0C273.7 0 288 14.33 288 32V43.55zM224 176C197.5 176 176 197.5 176 224C176 250.5 197.5 272 224 272C250.5 272 272 250.5 272 224C272 197.5 250.5 176 224 176zM304 328C317.3 328 328 317.3 328 304C328 290.7 317.3 280 304 280C290.7 280 280 290.7 280 304C280 317.3 290.7 328 304 328z\"]\n};\nvar faVirusCovid = {\n  prefix: 'fas',\n  iconName: 'virus-covid',\n  icon: [512, 512, [], \"e4a8\", \"M192 24C192 10.75 202.7 0 216 0H296C309.3 0 320 10.75 320 24C320 37.25 309.3 48 296 48H280V81.62C310.7 85.8 338.8 97.88 362.3 115.7L386.1 91.95L374.8 80.64C365.4 71.26 365.4 56.07 374.8 46.7C384.2 37.32 399.4 37.32 408.7 46.7L465.3 103.3C474.7 112.6 474.7 127.8 465.3 137.2C455.9 146.6 440.7 146.6 431.4 137.2L420 125.9L396.3 149.7C414.1 173.2 426.2 201.3 430.4 232H464V216C464 202.7 474.7 192 488 192C501.3 192 512 202.7 512 216V296C512 309.3 501.3 320 488 320C474.7 320 464 309.3 464 296V280H430.4C426.2 310.7 414.1 338.8 396.3 362.3L420 386.1L431.4 374.8C440.7 365.4 455.9 365.4 465.3 374.8C474.7 384.2 474.7 399.4 465.3 408.7L408.7 465.3C399.4 474.7 384.2 474.7 374.8 465.3C365.4 455.9 365.4 440.7 374.8 431.4L386.1 420L362.3 396.3C338.8 414.1 310.7 426.2 280 430.4V464H296C309.3 464 320 474.7 320 488C320 501.3 309.3 512 296 512H216C202.7 512 192 501.3 192 488C192 474.7 202.7 464 216 464H232V430.4C201.3 426.2 173.2 414.1 149.7 396.3L125.9 420.1L137.2 431.4C146.6 440.7 146.6 455.9 137.2 465.3C127.8 474.7 112.6 474.7 103.3 465.3L46.7 408.7C37.32 399.4 37.32 384.2 46.7 374.8C56.07 365.4 71.27 365.4 80.64 374.8L91.95 386.1L115.7 362.3C97.88 338.8 85.8 310.7 81.62 280H48V296C48 309.3 37.25 320 24 320C10.75 320 0 309.3 0 296V216C0 202.7 10.75 192 24 192C37.25 192 48 202.7 48 216V232H81.62C85.8 201.3 97.88 173.2 115.7 149.7L91.95 125.9L80.64 137.2C71.26 146.6 56.07 146.6 46.7 137.2C37.32 127.8 37.32 112.6 46.7 103.3L103.3 46.7C112.6 37.33 127.8 37.33 137.2 46.7C146.6 56.07 146.6 71.27 137.2 80.64L125.9 91.95L149.7 115.7C173.2 97.88 201.3 85.8 232 81.62V48H216C202.7 48 192 37.26 192 24V24zM192 176C165.5 176 144 197.5 144 224C144 250.5 165.5 272 192 272C218.5 272 240 250.5 240 224C240 197.5 218.5 176 192 176zM304 328C317.3 328 328 317.3 328 304C328 290.7 317.3 280 304 280C290.7 280 280 290.7 280 304C280 317.3 290.7 328 304 328z\"]\n};\nvar faVirusCovidSlash = {\n  prefix: 'fas',\n  iconName: 'virus-covid-slash',\n  icon: [640, 512, [], \"e4a9\", \"M134.1 79.83L167.3 46.7C176.6 37.33 191.8 37.33 201.2 46.7C210.6 56.07 210.6 71.27 201.2 80.64L189.9 91.95L213.7 115.7C237.2 97.88 265.3 85.8 295.1 81.62V48H279.1C266.7 48 255.1 37.26 255.1 24C255.1 10.75 266.7 .0003 279.1 .0003H360C373.3 .0003 384 10.75 384 24C384 37.26 373.3 48 360 48H344V81.62C374.7 85.8 402.8 97.88 426.3 115.7L450.1 91.95L438.8 80.64C429.4 71.26 429.4 56.07 438.8 46.7C448.2 37.32 463.4 37.32 472.7 46.7L529.3 103.3C538.7 112.6 538.7 127.8 529.3 137.2C519.9 146.6 504.7 146.6 495.4 137.2L484 125.9L460.3 149.7C478.1 173.2 490.2 201.3 494.4 232H528V216C528 202.7 538.7 192 552 192C565.3 192 576 202.7 576 216V296C576 309.3 565.3 320 552 320C538.7 320 528 309.3 528 296V280H494.4C491.2 303.3 483.4 325.2 472.1 344.7L630.8 469.1C641.2 477.3 643.1 492.4 634.9 502.8C626.7 513.2 611.6 515.1 601.2 506.9L9.196 42.89C-1.236 34.71-3.065 19.63 5.112 9.196C13.29-1.236 28.37-3.065 38.81 5.112L134.1 79.83zM149.2 213.5L401.3 412.2C383.7 421.3 364.4 427.6 344 430.4V464H360C373.3 464 384 474.7 384 488C384 501.3 373.3 512 360 512H279.1C266.7 512 255.1 501.3 255.1 488C255.1 474.7 266.7 464 279.1 464H295.1V430.4C265.3 426.2 237.2 414.1 213.7 396.3L189.9 420.1L201.2 431.4C210.6 440.7 210.6 455.9 201.2 465.3C191.8 474.7 176.6 474.7 167.3 465.3L110.7 408.7C101.3 399.4 101.3 384.2 110.7 374.8C120.1 365.4 135.3 365.4 144.6 374.8L155.1 386.1L179.7 362.3C161.9 338.8 149.8 310.7 145.6 280H111.1V296C111.1 309.3 101.3 320 87.1 320C74.74 320 63.1 309.3 63.1 296V216C63.1 202.7 74.74 192 87.1 192C101.3 192 111.1 202.7 111.1 216V232H145.6C146.5 225.7 147.7 219.6 149.2 213.5L149.2 213.5z\"]\n};\nvar faVirusSlash = {\n  prefix: 'fas',\n  iconName: 'virus-slash',\n  icon: [640, 512, [], \"e075\", \"M113.1 227.6H92.44c-15.72 0-28.45 12.72-28.45 28.45s12.72 28.44 28.45 28.44h21.55c50.68 0 76.06 61.28 40.23 97.11l-15.25 15.25c-11.11 11.11-11.11 29.11-.0006 40.22c5.555 5.555 12.83 8.332 20.11 8.332c7.277 0 14.55-2.779 20.11-8.334l15.24-15.25c35.84-35.84 97.12-10.45 97.12 40.23v21.55c0 15.72 12.72 28.45 28.45 28.45c15.72 0 28.45-12.72 28.45-28.45v-21.55c0-30.08 21.69-50.85 46.74-55.6L150 214.3C140.5 222.2 128.5 227.6 113.1 227.6zM630.8 469.1l-161.2-126.4c-.5176-29.6 21.73-58.3 56.41-58.3h21.55c15.72 0 28.45-12.72 28.45-28.44s-12.72-28.45-28.45-28.45h-21.55c-50.68 0-76.06-61.28-40.23-97.11l15.25-15.25c11.11-11.11 11.11-29.11 .0011-40.22c-11.11-11.11-29.11-11.11-40.22 .0007l-15.24 15.24c-35.84 35.84-97.12 10.46-97.12-40.23V28.44C348.4 12.72 335.7 0 319.1 0C304.3 0 291.6 12.72 291.6 28.44v21.55c0 50.68-61.28 76.06-97.12 40.23L179.2 74.97c-11.11-11.11-29.11-11.11-40.22 0C137.3 76.63 136.2 78.61 135 80.53L38.81 5.112C34.41 1.675 29.19 0 24.03 0C16.91 0 9.845 3.159 5.126 9.19C-3.061 19.63-1.248 34.72 9.189 42.89l591.1 463.1c10.5 8.203 25.56 6.328 33.69-4.078C643.1 492.4 641.2 477.3 630.8 469.1zM334.1 236.6L264.6 182.1c6.904-3.885 14.86-6.109 23.36-6.109c26.51 0 47.1 21.49 47.1 47.1C335.1 228.4 335.2 232.5 334.1 236.6z\"]\n};\nvar faViruses = {\n  prefix: 'fas',\n  iconName: 'viruses',\n  icon: [640, 512, [], \"e076\", \"M346.5 213.3h16.16C374.5 213.3 384 203.8 384 192c0-11.79-9.541-21.33-21.33-21.33h-16.16c-38.01 0-57.05-45.96-30.17-72.84l11.44-11.44c8.332-8.332 8.331-21.83-.0012-30.17c-8.334-8.334-21.83-8.332-30.17 .002L286.2 67.66C259.3 94.54 213.3 75.51 213.3 37.49V21.33C213.3 9.542 203.8 0 192 0S170.7 9.542 170.7 21.33v16.16c0 38.01-45.96 57.05-72.84 30.17L86.4 56.23c-8.334-8.334-21.83-8.336-30.17-.002c-8.332 8.334-8.333 21.84-.0012 30.17L67.66 97.83c26.88 26.88 7.842 72.84-30.17 72.84H21.33C9.541 170.7 0 180.2 0 192c0 11.79 9.541 21.33 21.33 21.33h16.16c38.01 0 57.05 45.96 30.17 72.84L56.23 297.6c-8.332 8.334-8.328 21.84 .0043 30.17c4.168 4.168 9.621 6.248 15.08 6.248s10.92-2.082 15.08-6.25L97.83 316.3c26.88-26.88 72.84-7.842 72.84 30.17v16.16C170.7 374.5 180.2 384 192 384s21.33-9.543 21.33-21.33v-16.16c0-38.01 45.96-57.05 72.84-30.17l11.43 11.43c4.168 4.168 9.625 6.25 15.08 6.25s10.91-2.08 15.08-6.248c8.332-8.332 8.333-21.83 .0012-30.17L316.3 286.2C289.5 259.3 308.5 213.3 346.5 213.3zM160 192C142.3 192 128 177.7 128 160c0-17.67 14.33-32 32-32s32 14.33 32 32C192 177.7 177.7 192 160 192zM240 224C231.2 224 224 216.8 224 208C224 199.2 231.2 192 240 192S256 199.2 256 208C256 216.8 248.8 224 240 224zM624 352h-12.12c-28.51 0-42.79-34.47-22.63-54.63l8.576-8.576c6.25-6.25 6.25-16.37 0-22.62s-16.38-6.253-22.62-.0031l-8.576 8.576C546.5 294.9 512 280.6 512 252.1V240C512 231.2 504.8 224 496 224S480 231.2 480 240v12.12c0 28.51-34.47 42.79-54.63 22.63l-8.576-8.576c-6.25-6.25-16.37-6.253-22.62-.0031s-6.253 16.38-.0031 22.63l8.576 8.576C422.9 317.5 408.6 352 380.1 352H368c-8.844 0-16 7.156-16 16s7.156 16 16 16h12.12c28.51 0 42.79 34.47 22.63 54.63l-8.576 8.576c-6.25 6.25-6.253 16.37-.0031 22.62c3.125 3.125 7.222 4.691 11.32 4.691s8.188-1.562 11.31-4.688l8.576-8.576C445.5 441.1 480 455.4 480 483.9V496c0 8.844 7.156 16 16 16s16-7.156 16-16v-12.12c0-28.51 34.47-42.79 54.63-22.63l8.576 8.576c3.125 3.125 7.219 4.688 11.31 4.688s8.184-1.559 11.31-4.684c6.25-6.25 6.253-16.38 .0031-22.63l-8.576-8.576C569.1 418.5 583.4 384 611.9 384H624c8.844 0 16-7.156 16-16S632.8 352 624 352zM480 384c-17.67 0-32-14.33-32-32c0-17.67 14.33-32 32-32s32 14.33 32 32C512 369.7 497.7 384 480 384z\"]\n};\nvar faVoicemail = {\n  prefix: 'fas',\n  iconName: 'voicemail',\n  icon: [640, 512, [], \"f897\", \"M495.1 96c-53.13 0-102 29.25-127 76.13c-25 46.88-22.25 103.8 7.25 147.9H263.7c36.63-54.88 31.25-127.8-13-176.8c-44.38-48.87-116.4-61.37-174.6-30.25s-87.88 97.88-71.75 162c16 64 73.63 108.1 139.6 108.1h352C575.5 384 640 319.5 640 240S575.5 96 495.1 96zM63.99 240c0-44.12 35.88-80 80-80s80 35.88 80 80s-35.88 79.1-80 79.1S63.99 284.1 63.99 240zM495.1 320c-44.13 0-80-35.88-80-79.1s35.88-80 80-80s80 35.88 80 80S540.1 320 495.1 320z\"]\n};\nvar faVolcano = {\n  prefix: 'fas',\n  iconName: 'volcano',\n  icon: [512, 512, [127755], \"f770\", \"M304.4 224H207.6C197.7 224 188.5 228.5 182.4 236.3l-55.63 71l13.25 16.5C149.7 336 170.2 336 180.1 323.8c10.75-13.5 26.75-21.25 44.13-21.5c17.13-1.5 33.5 7 44.75 20l31.63 36.88c9.751 11.38 29.13 11.38 39 0l45.13-52.62l-55-70.25C323.5 228.5 314.3 224 304.4 224zM159.1 144c12.88 0 24.75-3.875 34.75-10.38L223.1 192h64l29.25-58.38C327.3 140.1 339.1 144 352 144c35.25 0 64-28.75 64-64s-28.75-64-64-64c-15.75 0-30 5.875-41.25 15.38C299.6 12.75 279.4 0 255.1 0C232.6 0 212.4 12.75 201.2 31.38C189.1 21.88 175.7 16 159.1 16c-35.25 0-64 28.75-64 64S124.7 144 159.1 144zM505.5 460.8l-100.8-128.6l-41 47.63C352.8 392.6 336.8 400 320 400s-32.75-7.25-43.75-20.25L244.6 343C239.7 337.3 232.6 334 225.1 334H224.7c-7.751 .25-14.88 3.75-19.63 9.75c-22.13 27.5-68.13 27.5-90.13 0l-8.376-10.62l-100.1 127.6C-9.397 481.9 5.727 512 32.1 512h447.9C506.3 512 521.4 481.9 505.5 460.8z\"]\n};\nvar faVolleyball = {\n  prefix: 'fas',\n  iconName: 'volleyball',\n  icon: [512, 512, [127952, \"volleyball-ball\"], \"f45f\", \"M200.3 106C185.4 80.24 165.2 53.9 137.4 29.26C55.75 72.05 0 157.4 0 256c0 21.33 2.898 41.94 7.814 61.75C53.59 182.1 155.1 124.9 200.3 106zM381.7 281.1c1.24-9.223 2.414-22.08 2.414-37.65c0-59.1-16.93-157.2-111.5-242.6C267.1 .4896 261.6 0 256 0C225.5 0 196.5 5.591 169.4 15.36c93.83 90.15 102.6 198.5 102.8 231.7C287.8 255.9 327.3 275.1 381.7 281.1zM240.1 246.5C239.1 228.5 236.9 184.7 214.9 134.6C173.6 151.6 60.4 211.7 26.67 369.2c15.66 31.64 37.52 59.66 64.22 82.23C122 325.1 211.5 263.3 240.1 246.5zM326.5 10.07c74.79 84.9 89.5 175.9 89.5 234c0 15.45-1.042 28.56-2.27 38.61l.5501 .0005c29.54 0 62.2-4.325 97.16-15.99C511.6 263.1 512 259.6 512 256C512 139.1 433.6 40.72 326.5 10.07zM255.7 274.5c-15.43 9.086-51.89 33.63-84.32 77.86c26.34 20.33 93.51 63.27 189.5 63.27c32.83 0 69.02-5.021 108.1-17.69c19.08-28.59 32.41-61.34 38.71-96.47C474.5 311.1 443 315 414.4 315C334.6 315 276.5 286.3 255.7 274.5zM153.1 379.3c-14.91 25.71-27.62 56.33-35.03 92.72C158.6 497.2 205.5 512 256 512c69 0 131.5-27.43 177.5-71.82c-25.42 5.105-49.71 7.668-72.38 7.668C258.6 447.8 185.5 402.1 153.1 379.3z\"]\n};\nvar faVolleyballBall = faVolleyball;\nvar faVolumeHigh = {\n  prefix: 'fas',\n  iconName: 'volume-high',\n  icon: [640, 512, [128266, \"volume-up\"], \"f028\", \"M412.6 182c-10.28-8.334-25.41-6.867-33.75 3.402c-8.406 10.24-6.906 25.35 3.375 33.74C393.5 228.4 400 241.8 400 255.1c0 14.17-6.5 27.59-17.81 36.83c-10.28 8.396-11.78 23.5-3.375 33.74c4.719 5.806 11.62 8.802 18.56 8.802c5.344 0 10.75-1.779 15.19-5.399C435.1 311.5 448 284.6 448 255.1S435.1 200.4 412.6 182zM473.1 108.2c-10.22-8.334-25.34-6.898-33.78 3.34c-8.406 10.24-6.906 25.35 3.344 33.74C476.6 172.1 496 213.3 496 255.1s-19.44 82.1-53.31 110.7c-10.25 8.396-11.75 23.5-3.344 33.74c4.75 5.775 11.62 8.771 18.56 8.771c5.375 0 10.75-1.779 15.22-5.431C518.2 366.9 544 313 544 255.1S518.2 145 473.1 108.2zM534.4 33.4c-10.22-8.334-25.34-6.867-33.78 3.34c-8.406 10.24-6.906 25.35 3.344 33.74C559.9 116.3 592 183.9 592 255.1s-32.09 139.7-88.06 185.5c-10.25 8.396-11.75 23.5-3.344 33.74C505.3 481 512.2 484 519.2 484c5.375 0 10.75-1.779 15.22-5.431C601.5 423.6 640 342.5 640 255.1S601.5 88.34 534.4 33.4zM301.2 34.98c-11.5-5.181-25.01-3.076-34.43 5.29L131.8 160.1H48c-26.51 0-48 21.48-48 47.96v95.92c0 26.48 21.49 47.96 48 47.96h83.84l134.9 119.8C272.7 477 280.3 479.8 288 479.8c4.438 0 8.959-.9314 13.16-2.835C312.7 471.8 320 460.4 320 447.9V64.12C320 51.55 312.7 40.13 301.2 34.98z\"]\n};\nvar faVolumeUp = faVolumeHigh;\nvar faVolumeLow = {\n  prefix: 'fas',\n  iconName: 'volume-low',\n  icon: [448, 512, [128264, \"volume-down\"], \"f027\", \"M412.6 181.9c-10.28-8.344-25.41-6.875-33.75 3.406c-8.406 10.25-6.906 25.37 3.375 33.78C393.5 228.4 400 241.8 400 256c0 14.19-6.5 27.62-17.81 36.87c-10.28 8.406-11.78 23.53-3.375 33.78c4.719 5.812 11.62 8.812 18.56 8.812c5.344 0 10.75-1.781 15.19-5.406C435.1 311.6 448 284.7 448 256S435.1 200.4 412.6 181.9zM301.2 34.84c-11.5-5.187-25.01-3.116-34.43 5.259L131.8 160H48c-26.51 0-48 21.49-48 47.1v95.1c0 26.51 21.49 47.1 48 47.1h83.84l134.9 119.9C272.7 477.2 280.3 480 288 480c4.438 0 8.959-.9313 13.16-2.837C312.7 472 320 460.6 320 448V64C320 51.41 312.7 39.1 301.2 34.84z\"]\n};\nvar faVolumeDown = faVolumeLow;\nvar faVolumeOff = {\n  prefix: 'fas',\n  iconName: 'volume-off',\n  icon: [320, 512, [], \"f026\", \"M320 64v383.1c0 12.59-7.337 24.01-18.84 29.16C296.1 479.1 292.4 480 288 480c-7.688 0-15.28-2.781-21.27-8.094l-134.9-119.9H48c-26.51 0-48-21.49-48-47.1V208c0-26.51 21.49-47.1 48-47.1h83.84l134.9-119.9c9.422-8.375 22.93-10.45 34.43-5.259C312.7 39.1 320 51.41 320 64z\"]\n};\nvar faVolumeXmark = {\n  prefix: 'fas',\n  iconName: 'volume-xmark',\n  icon: [576, 512, [\"volume-mute\", \"volume-times\"], \"f6a9\", \"M301.2 34.85c-11.5-5.188-25.02-3.122-34.44 5.253L131.8 160H48c-26.51 0-48 21.49-48 47.1v95.1c0 26.51 21.49 47.1 48 47.1h83.84l134.9 119.9c5.984 5.312 13.58 8.094 21.26 8.094c4.438 0 8.972-.9375 13.17-2.844c11.5-5.156 18.82-16.56 18.82-29.16V64C319.1 51.41 312.7 40 301.2 34.85zM513.9 255.1l47.03-47.03c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L480 222.1L432.1 175c-9.375-9.375-24.56-9.375-33.94 0s-9.375 24.56 0 33.94l47.03 47.03l-47.03 47.03c-9.375 9.375-9.375 24.56 0 33.94c9.373 9.373 24.56 9.381 33.94 0L480 289.9l47.03 47.03c9.373 9.373 24.56 9.381 33.94 0c9.375-9.375 9.375-24.56 0-33.94L513.9 255.1z\"]\n};\nvar faVolumeMute = faVolumeXmark;\nvar faVolumeTimes = faVolumeXmark;\nvar faVrCardboard = {\n  prefix: 'fas',\n  iconName: 'vr-cardboard',\n  icon: [640, 512, [], \"f729\", \"M576 64H64c-35.2 0-64 28.8-64 64v256c0 35.2 28.8 64 64 64l128.3 .0001c25.18 0 48.03-14.77 58.37-37.73l27.76-61.65c7.875-17.5 24-28.63 41.63-28.63s33.75 11.13 41.63 28.63l27.75 61.63c10.35 22.98 33.2 37.75 58.4 37.75L576 448c35.2 0 64-28.8 64-64v-256C640 92.8 611.2 64 576 64zM160 304c-35.38 0-64-28.63-64-64s28.62-63.1 64-63.1s64 28.62 64 63.1S195.4 304 160 304zM480 304c-35.38 0-64-28.63-64-64s28.62-63.1 64-63.1s64 28.62 64 63.1S515.4 304 480 304z\"]\n};\nvar faW = {\n  prefix: 'fas',\n  iconName: 'w',\n  icon: [576, 512, [119], \"57\", \"M573.1 75.25l-144 384c-4.703 12.53-16.67 20.77-29.95 20.77c-.4062 0-.8125 0-1.219-.0156c-13.77-.5156-25.66-9.797-29.52-23.03L288 178.3l-81.28 278.7c-3.859 13.23-15.75 22.52-29.52 23.03c-13.75 .4687-26.33-7.844-31.17-20.75l-144-384c-6.203-16.55 2.188-34.98 18.73-41.2C37.31 27.92 55.75 36.23 61.97 52.78l110.2 293.1l85.08-291.7C261.3 41.41 273.8 32.01 288 32.01s26.73 9.396 30.72 23.05l85.08 291.7l110.2-293.1c6.219-16.55 24.67-24.86 41.2-18.73C571.8 40.26 580.2 58.7 573.1 75.25z\"]\n};\nvar faWalkieTalkie = {\n  prefix: 'fas',\n  iconName: 'walkie-talkie',\n  icon: [384, 512, [], \"f8ef\", \"M352 96h-32V80C320 71.16 312.8 64 304 64h-32C263.2 64 256 71.16 256 80V96h-32V80C224 71.16 216.8 64 208 64h-32C167.2 64 160 71.16 160 80V96H112V23.1C112 10.74 101.3 0 88 0S64 10.74 64 23.1V96H32C14.4 96 0 110.4 0 128v178.7c0 8.484 3.373 16.62 9.371 22.62L32 352v112C32 490.5 53.49 512 80 512h224c26.51 0 48-21.49 48-48V352l22.63-22.63C380.6 323.4 384 315.2 384 306.7V128C384 110.4 369.6 96 352 96zM288 312C288 316.4 284.4 320 280 320h-176C99.63 320 96 316.4 96 312v-16C96 291.6 99.63 288 104 288h176C284.4 288 288 291.6 288 296V312zM288 248C288 252.4 284.4 256 280 256h-176C99.63 256 96 252.4 96 248v-16C96 227.6 99.63 224 104 224h176C284.4 224 288 227.6 288 232V248zM288 184C288 188.4 284.4 192 280 192h-176C99.63 192 96 188.4 96 184v-16C96 163.6 99.63 160 104 160h176C284.4 160 288 163.6 288 168V184z\"]\n};\nvar faWallet = {\n  prefix: 'fas',\n  iconName: 'wallet',\n  icon: [512, 512, [], \"f555\", \"M448 32C465.7 32 480 46.33 480 64C480 81.67 465.7 96 448 96H80C71.16 96 64 103.2 64 112C64 120.8 71.16 128 80 128H448C483.3 128 512 156.7 512 192V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM416 336C433.7 336 448 321.7 448 304C448 286.3 433.7 272 416 272C398.3 272 384 286.3 384 304C384 321.7 398.3 336 416 336z\"]\n};\nvar faWandMagic = {\n  prefix: 'fas',\n  iconName: 'wand-magic',\n  icon: [512, 512, [\"magic\"], \"f0d0\", \"M14.06 463.3C-4.686 444.6-4.686 414.2 14.06 395.4L395.4 14.06C414.2-4.686 444.6-4.686 463.3 14.06L497.9 48.64C516.6 67.38 516.6 97.78 497.9 116.5L116.5 497.9C97.78 516.6 67.38 516.6 48.64 497.9L14.06 463.3zM347.6 187.6L452.6 82.58L429.4 59.31L324.3 164.3L347.6 187.6z\"]\n};\nvar faMagic = faWandMagic;\nvar faWandMagicSparkles = {\n  prefix: 'fas',\n  iconName: 'wand-magic-sparkles',\n  icon: [576, 512, [\"magic-wand-sparkles\"], \"e2ca\", \"M248.8 4.994C249.9 1.99 252.8 .0001 256 .0001C259.2 .0001 262.1 1.99 263.2 4.994L277.3 42.67L315 56.79C318 57.92 320 60.79 320 64C320 67.21 318 70.08 315 71.21L277.3 85.33L263.2 123C262.1 126 259.2 128 256 128C252.8 128 249.9 126 248.8 123L234.7 85.33L196.1 71.21C193.1 70.08 192 67.21 192 64C192 60.79 193.1 57.92 196.1 56.79L234.7 42.67L248.8 4.994zM427.4 14.06C446.2-4.686 476.6-4.686 495.3 14.06L529.9 48.64C548.6 67.38 548.6 97.78 529.9 116.5L148.5 497.9C129.8 516.6 99.38 516.6 80.64 497.9L46.06 463.3C27.31 444.6 27.31 414.2 46.06 395.4L427.4 14.06zM461.4 59.31L356.3 164.3L379.6 187.6L484.6 82.58L461.4 59.31zM7.491 117.2L64 96L85.19 39.49C86.88 34.98 91.19 32 96 32C100.8 32 105.1 34.98 106.8 39.49L128 96L184.5 117.2C189 118.9 192 123.2 192 128C192 132.8 189 137.1 184.5 138.8L128 160L106.8 216.5C105.1 221 100.8 224 96 224C91.19 224 86.88 221 85.19 216.5L64 160L7.491 138.8C2.985 137.1 0 132.8 0 128C0 123.2 2.985 118.9 7.491 117.2zM359.5 373.2L416 352L437.2 295.5C438.9 290.1 443.2 288 448 288C452.8 288 457.1 290.1 458.8 295.5L480 352L536.5 373.2C541 374.9 544 379.2 544 384C544 388.8 541 393.1 536.5 394.8L480 416L458.8 472.5C457.1 477 452.8 480 448 480C443.2 480 438.9 477 437.2 472.5L416 416L359.5 394.8C354.1 393.1 352 388.8 352 384C352 379.2 354.1 374.9 359.5 373.2z\"]\n};\nvar faMagicWandSparkles = faWandMagicSparkles;\nvar faWandSparkles = {\n  prefix: 'fas',\n  iconName: 'wand-sparkles',\n  icon: [512, 512, [], \"f72b\", \"M3.682 149.1L53.32 170.7L74.02 220.3c1.016 2.043 3.698 3.696 5.977 3.696c.0078 0-.0078 0 0 0c2.271-.0156 4.934-1.661 5.946-3.696l20.72-49.63l49.62-20.71c2.023-1.008 3.68-3.681 3.691-5.947C159.1 141.7 158.3 139 156.3 138L106.9 117.4L106.5 117L85.94 67.7C84.93 65.66 82.27 64.02 80 64c-.0078 0 .0078 0 0 0c-2.279 0-4.966 1.649-5.981 3.692L53.32 117.3L3.682 138C1.652 139.1 0 141.7 0 144C0 146.3 1.652 148.9 3.682 149.1zM511.1 368c-.0039-2.273-1.658-4.95-3.687-5.966l-49.57-20.67l-20.77-49.67C436.9 289.7 434.3 288 432 288c-2.281 0-4.948 1.652-5.964 3.695l-20.7 49.63l-49.64 20.71c-2.027 1.016-3.684 3.683-3.687 5.956c.0039 2.262 1.662 4.954 3.687 5.966l49.57 20.67l20.77 49.67C427.1 446.3 429.7 448 432 448c2.277 0 4.944-1.656 5.96-3.699l20.69-49.63l49.65-20.71C510.3 372.9 511.1 370.3 511.1 368zM207.1 64l12.42 29.78C221 95.01 222.6 96 223.1 96s2.965-.9922 3.575-2.219L239.1 64l29.78-12.42c1.219-.6094 2.215-2.219 2.215-3.578c0-1.367-.996-2.969-2.215-3.578L239.1 32L227.6 2.219C226.1 .9922 225.4 0 223.1 0S221 .9922 220.4 2.219L207.1 32L178.2 44.42C176.1 45.03 176 46.63 176 48c0 1.359 .9928 2.969 2.21 3.578L207.1 64zM399.1 191.1c8.875 0 15.1-7.127 15.1-16v-28l91.87-101.7c5.75-6.371 5.5-15.1-.4999-22.12L487.8 4.774c-6.125-6.125-15.75-6.375-22.12-.625L186.6 255.1H144c-8.875 0-15.1 7.125-15.1 15.1v36.88l-117.5 106c-13.5 12.25-14.14 33.34-1.145 46.34l41.4 41.41c12.1 12.1 34.13 12.36 46.37-1.133l279.2-309.5H399.1z\"]\n};\nvar faWarehouse = {\n  prefix: 'fas',\n  iconName: 'warehouse',\n  icon: [640, 512, [], \"f494\", \"M0 488V171.3C0 145.2 15.93 121.6 40.23 111.9L308.1 4.753C315.7 1.702 324.3 1.702 331.9 4.753L599.8 111.9C624.1 121.6 640 145.2 640 171.3V488C640 501.3 629.3 512 616 512H568C554.7 512 544 501.3 544 488V223.1C544 206.3 529.7 191.1 512 191.1H128C110.3 191.1 96 206.3 96 223.1V488C96 501.3 85.25 512 72 512H24C10.75 512 0 501.3 0 488zM152 512C138.7 512 128 501.3 128 488V432H512V488C512 501.3 501.3 512 488 512H152zM128 336H512V400H128V336zM128 224H512V304H128V224z\"]\n};\nvar faWater = {\n  prefix: 'fas',\n  iconName: 'water',\n  icon: [576, 512, [], \"f773\", \"M549.8 237.5c-31.23-5.719-46.84-20.06-47.13-20.31C490.4 205 470.3 205.1 457.7 216.8c-1 .9375-25.14 23-73.73 23s-72.73-22.06-73.38-22.62C298.4 204.9 278.3 205.1 265.7 216.8c-1 .9375-25.14 23-73.73 23S119.3 217.8 118.6 217.2C106.4 204.9 86.35 205 73.74 216.9C73.09 217.4 57.48 231.8 26.24 237.5c-17.38 3.188-28.89 19.84-25.72 37.22c3.188 17.38 19.78 29.09 37.25 25.72C63.1 295.8 82.49 287.1 95.96 279.2c19.5 11.53 51.47 24.68 96.04 24.68c44.55 0 76.49-13.12 96-24.65c19.52 11.53 51.45 24.59 96 24.59c44.58 0 76.55-13.09 96.05-24.62c13.47 7.938 32.86 16.62 58.19 21.25c17.56 3.375 34.06-8.344 37.25-25.72C578.7 257.4 567.2 240.7 549.8 237.5zM549.8 381.7c-31.23-5.719-46.84-20.06-47.13-20.31c-12.22-12.19-32.31-12.12-44.91-.375C456.7 361.9 432.6 384 384 384s-72.73-22.06-73.38-22.62c-12.22-12.25-32.3-12.12-44.89-.375C264.7 361.9 240.6 384 192 384s-72.73-22.06-73.38-22.62c-12.22-12.25-32.28-12.16-44.89-.3438c-.6562 .5938-16.27 14.94-47.5 20.66c-17.38 3.188-28.89 19.84-25.72 37.22C3.713 436.3 20.31 448 37.78 444.6C63.1 440 82.49 431.3 95.96 423.4c19.5 11.53 51.51 24.62 96.08 24.62c44.55 0 76.45-13.06 95.96-24.59C307.5 434.9 339.5 448 384.1 448c44.58 0 76.5-13.09 95.1-24.62c13.47 7.938 32.86 16.62 58.19 21.25C555.8 448 572.3 436.3 575.5 418.9C578.7 401.5 567.2 384.9 549.8 381.7zM37.78 156.4c25.33-4.625 44.72-13.31 58.19-21.25c19.5 11.53 51.47 24.68 96.04 24.68c44.55 0 76.49-13.12 96-24.65c19.52 11.53 51.45 24.59 96 24.59c44.58 0 76.55-13.09 96.05-24.62c13.47 7.938 32.86 16.62 58.19 21.25c17.56 3.375 34.06-8.344 37.25-25.72c3.172-17.38-8.344-34.03-25.72-37.22c-31.23-5.719-46.84-20.06-47.13-20.31c-12.22-12.19-32.31-12.12-44.91-.375c-1 .9375-25.14 23-73.73 23s-72.73-22.06-73.38-22.62c-12.22-12.25-32.3-12.12-44.89-.375c-1 .9375-25.14 23-73.73 23S119.3 73.76 118.6 73.2C106.4 60.95 86.35 61.04 73.74 72.85C73.09 73.45 57.48 87.79 26.24 93.51c-17.38 3.188-28.89 19.84-25.72 37.22C3.713 148.1 20.31 159.8 37.78 156.4z\"]\n};\nvar faWaterLadder = {\n  prefix: 'fas',\n  iconName: 'water-ladder',\n  icon: [576, 512, [\"ladder-water\", \"swimming-pool\"], \"f5c5\", \"M320 128c0 .375-.1992 .6855-.2129 1.057C319.8 129.9 320 130.7 320 131.6V128zM192 383.1V288h192v95.99c39.6-.1448 53.95-17.98 64-26.83V128c0-17.62 14.38-32 32-32s32 14.38 32 32c0 17.67 14.33 32 32 32s32-14.33 32-32c0-53-42.1-95.1-95.1-95.1C420.1 32 384 81.94 384 131.6V224H192V128c0-17.62 14.38-32 32-32s32 14.38 32 32c0 17.67 14.33 32 32 32c17.3 0 31.2-13.79 31.79-30.94c-1.227-49.01-37.99-97.06-95.79-97.06C170.1 32 128 74.1 128 128v229.2C138.5 366.4 151.4 383.8 192 383.1zM576 445c0-15.14-10.82-28.59-26.25-31.42c-48.52-8.888-45.5-29.48-69.6-29.48c-25.02 0-31.19 31.79-96.18 31.79c-48.59 0-72.72-22.06-73.38-22.62c-6.141-6.157-14.26-9.188-22.42-9.188c-24.75 0-31.59 31.81-96.2 31.81c-48.59 0-72.69-22.03-73.41-22.59c-6.125-6.157-14.24-9.196-22.4-9.196c-8.072 0-16.18 2.976-22.45 8.852c-29.01 26.25-73.75 12.54-73.75 52.08c0 16.08 12.77 32.07 31.71 32.07c9.77 0 39.65-7.34 64.26-21.84c19.5 11.53 51.51 24.69 96.08 24.69s76.46-13.12 95.96-24.66c19.53 11.53 51.52 24.62 96.06 24.62c44.59 0 76.51-13.12 96.01-24.66c24.71 14.57 54.74 21.83 64.24 21.83C563.2 477.1 576 461.3 576 445z\"]\n};\nvar faLadderWater = faWaterLadder;\nvar faSwimmingPool = faWaterLadder;\nvar faWaveSquare = {\n  prefix: 'fas',\n  iconName: 'wave-square',\n  icon: [640, 512, [], \"f83e\", \"M476 480h-152c-19.88 0-36-16.12-36-36v-348H192v156c0 19.88-16.12 36-36 36H31.1C14.33 288 0 273.7 0 256s14.33-31.1 31.1-31.1H128v-156c0-19.88 16.12-36 36-36h152c19.88 0 36 16.12 36 36v348h96v-156c0-19.88 16.12-36 36-36h124C625.7 224 640 238.3 640 256s-14.33 32-31.1 32H512v156C512 463.9 495.9 480 476 480z\"]\n};\nvar faWeightHanging = {\n  prefix: 'fas',\n  iconName: 'weight-hanging',\n  icon: [512, 512, [], \"f5cd\", \"M510.3 445.9L437.3 153.8C433.5 138.5 420.8 128 406.4 128H346.1c3.625-9.1 5.875-20.75 5.875-32c0-53-42.1-96-96-96S159.1 43 159.1 96c0 11.25 2.25 22 5.875 32H105.6c-14.38 0-27.13 10.5-30.88 25.75l-73.01 292.1C-6.641 479.1 16.36 512 47.99 512h416C495.6 512 518.6 479.1 510.3 445.9zM256 128C238.4 128 223.1 113.6 223.1 96S238.4 64 256 64c17.63 0 32 14.38 32 32S273.6 128 256 128z\"]\n};\nvar faWeightScale = {\n  prefix: 'fas',\n  iconName: 'weight-scale',\n  icon: [512, 512, [\"weight\"], \"f496\", \"M310.3 97.25c-8-3.5-17.5 .25-21 8.5L255.8 184C233.8 184.3 216 202 216 224c0 22.12 17.88 40 40 40S296 246.1 296 224c0-10.5-4.25-20-11-27.12l33.75-78.63C322.3 110.1 318.4 100.8 310.3 97.25zM448 64h-56.23C359.5 24.91 310.7 0 256 0S152.5 24.91 120.2 64H64C28.75 64 0 92.75 0 128v320c0 35.25 28.75 64 64 64h384c35.25 0 64-28.75 64-64V128C512 92.75 483.3 64 448 64zM256 304c-70.58 0-128-57.42-128-128s57.42-128 128-128c70.58 0 128 57.42 128 128S326.6 304 256 304z\"]\n};\nvar faWeight = faWeightScale;\nvar faWheatAwn = {\n  prefix: 'fas',\n  iconName: 'wheat-awn',\n  icon: [512, 512, [\"wheat-alt\"], \"e2cd\", \"M416.1 128.1C407.6 138.3 392.4 138.3 383 128.1C373.7 119.6 373.7 104.4 383 95.03L471 7.029C480.4-2.343 495.6-2.343 504.1 7.029C514.3 16.4 514.3 31.6 504.1 40.97L416.1 128.1zM327.2 230.1L295.3 261.1C323.8 264.7 351.5 277 373.4 298.8L395.1 321.5L373.4 344.1C335.9 381.6 275.1 381.6 237.6 344.1L225.4 331.9L193.5 363.8C221.1 366.5 249.7 378.8 271.5 400.7L294.2 423.3L271.5 445.9C234 483.4 173.3 483.4 135.8 445.9L123.5 433.7L54.63 502.6C42.13 515.1 21.87 515.1 9.372 502.6C-3.124 490.1-3.124 469.9 9.372 457.4L78.29 388.5L67.88 378C30.39 340.6 30.39 279.8 67.88 242.3L90.51 219.6L113.1 242.3C134.1 263.3 146.3 289.7 149.7 317.1L180.1 286.6L169.7 276.2C132.2 238.7 132.2 177.9 169.7 140.5L192.3 117.8L214.1 140.5C235.1 161.4 248.1 187.9 251.5 215.3L281.9 184.8L271.5 174.4C234 136.9 234 76.12 271.5 38.63L294.2 16L316.8 38.63C321.3 43.15 325.4 47.94 329.1 52.93L375 7.03C384.4-2.343 399.6-2.343 408.1 7.03C418.3 16.4 418.3 31.6 408.1 40.97L350.7 99.2C355.9 120.7 355.4 143.2 349.3 164.5C369.6 158.7 391.1 157.1 411.7 162.4L471 103C480.4 93.66 495.6 93.66 504.1 103C514.3 112.4 514.3 127.6 504.1 136.1L458.8 183.2C464.5 187.2 470 191.9 475.2 197L497.8 219.6L475.2 242.3C437.7 279.8 376.9 279.8 339.4 242.3L327.2 230.1z\"]\n};\nvar faWheatAlt = faWheatAwn;\nvar faWheatAwnCircleExclamation = {\n  prefix: 'fas',\n  iconName: 'wheat-awn-circle-exclamation',\n  icon: [640, 512, [], \"e598\", \"M416.1 128.1C407.6 138.3 392.4 138.3 383 128.1C373.7 119.6 373.7 104.4 383 95.03L471 7.03C480.4-2.343 495.6-2.343 504.1 7.03C514.3 16.4 514.3 31.6 504.1 40.97L416.1 128.1zM327.2 230.1L295.3 261.1C312.5 263.6 329.5 268.8 345 277.4C329.1 303.9 320 334.9 320 368C320 369 320 370.1 320 371.1C290.9 375.6 260 366.6 237.6 344.1L225.4 331.9L193.5 363.8C221.1 366.5 249.7 378.8 271.5 400.7L294.2 423.3L271.5 445.9C234 483.4 173.3 483.4 135.8 445.9L123.5 433.7L54.63 502.6C42.13 515.1 21.87 515.1 9.372 502.6C-3.124 490.1-3.124 469.9 9.372 457.4L78.29 388.5L67.88 378C30.39 340.6 30.39 279.8 67.88 242.3L90.51 219.6L113.1 242.3C134.1 263.3 146.3 289.7 149.7 317.1L180.1 286.6L169.7 276.2C132.2 238.7 132.2 177.9 169.7 140.5L192.3 117.8L214.1 140.5C235.1 161.4 248.1 187.9 251.5 215.3L281.9 184.8L271.5 174.4C234 136.9 234 76.12 271.5 38.63L294.2 15.1L316.8 38.63C321.3 43.15 325.4 47.94 329.1 52.93L375 7.029C384.4-2.343 399.6-2.343 408.1 7.029C418.3 16.4 418.3 31.6 408.1 40.97L350.7 99.2C355.9 120.7 355.4 143.2 349.3 164.5C369.6 158.7 391.1 157.1 411.7 162.4L471 103C480.4 93.66 495.6 93.66 504.1 103C514.3 112.4 514.3 127.6 504.1 136.1L458.8 183.1C463.3 186.3 467.6 189.8 471.7 193.7C426.4 199.9 386.5 223.5 359.1 257.4C352 253.3 345.4 248.3 339.4 242.3L327.2 230.1zM352 368C352 288.5 416.5 224 496 224C575.5 224 640 288.5 640 368C640 447.5 575.5 512 496 512C416.5 512 352 447.5 352 368zM496 464C509.3 464 520 453.3 520 440C520 426.7 509.3 416 496 416C482.7 416 472 426.7 472 440C472 453.3 482.7 464 496 464zM479.1 288V368C479.1 376.8 487.2 384 495.1 384C504.8 384 511.1 376.8 511.1 368V288C511.1 279.2 504.8 272 495.1 272C487.2 272 479.1 279.2 479.1 288z\"]\n};\nvar faWheelchair = {\n  prefix: 'fas',\n  iconName: 'wheelchair',\n  icon: [512, 512, [], \"f193\", \"M510.3 421.9c-5.594-16.75-23.53-25.84-40.47-20.22l-19.38 6.438l-41.7-99.97C403.9 295.1 392.2 288 379.1 288h-97.78l-10.4-48h65.11c17.69 0 32-14.31 32-32s-14.31-32-32-32h-78.98L255.6 169.2C251.8 142.1 227.2 124.8 201.2 128.5C174.1 132.2 156.7 156.5 160.5 182.8l23.68 140.4C185.8 339.6 199.6 352 216 352h141.4l44.86 107.9C407.3 472.3 419.3 480 432 480c3.344 0 6.781-.5313 10.12-1.656l48-16C506.9 456.8 515.9 438.7 510.3 421.9zM160 464c-61.76 0-112-50.24-112-112c0-54.25 38.78-99.55 90.06-109.8L130.1 195C56.06 209 0 273.9 0 352c0 88.37 71.63 160 160 160c77.4 0 141.9-54.97 156.8-128h-49.1C252.9 430.1 210.6 464 160 464zM192 96c26.51 0 48-21.49 48-48S218.5 0 192 0S144 21.49 144 48S165.5 96 192 96z\"]\n};\nvar faWheelchairMove = {\n  prefix: 'fas',\n  iconName: 'wheelchair-move',\n  icon: [448, 512, [\"wheelchair-alt\"], \"e2ce\", \"M416 48C416 74.51 394.5 96 368 96C341.5 96 320 74.51 320 48C320 21.49 341.5 0 368 0C394.5 0 416 21.49 416 48zM172.8 54.4C182.3 47.29 194.9 46 205.6 51.05L322.1 105.9C351.3 119.6 358.9 157.5 337.4 181.4L299.1 224H416C425.6 224 434.7 228.3 440.7 235.7C446.8 243.1 449.3 252.9 447.4 262.3L415.4 422.3C411.9 439.6 395.1 450.8 377.7 447.4C360.4 443.9 349.2 427.1 352.6 409.7L376.1 288H306.7C315.3 307.6 320 329.2 320 352C320 440.4 248.4 512 160 512C71.63 512 0 440.4 0 352C0 263.6 71.63 192 160 192C171.1 192 181.1 193.1 192.4 195.3L246.6 141.1L195.8 117.2L147.2 153.6C133.1 164.2 113 161.3 102.4 147.2C91.8 133.1 94.66 113 108.8 102.4L172.8 54.4zM160 448C213 448 256 405 256 352C256 298.1 213 256 160 256C106.1 256 64 298.1 64 352C64 405 106.1 448 160 448z\"]\n};\nvar faWheelchairAlt = faWheelchairMove;\nvar faWhiskeyGlass = {\n  prefix: 'fas',\n  iconName: 'whiskey-glass',\n  icon: [512, 512, [129347, \"glass-whiskey\"], \"f7a0\", \"M479.1 32H32.04C12.55 32-2.324 49.25 .3008 68.51L56.29 425.1C60.79 456.6 87.78 480 119.8 480h272.9c31.74 0 58.86-23.38 63.36-54.89l55.61-356.6C514.3 49.25 499.5 32 479.1 32zM422.7 224H89.49L69.39 96h373.2L422.7 224z\"]\n};\nvar faGlassWhiskey = faWhiskeyGlass;\nvar faWifi = {\n  prefix: 'fas',\n  iconName: 'wifi',\n  icon: [640, 512, [\"wifi-3\", \"wifi-strong\"], \"f1eb\", \"M319.1 351.1c-35.35 0-64 28.66-64 64.01s28.66 64.01 64 64.01c35.34 0 64-28.66 64-64.01S355.3 351.1 319.1 351.1zM320 191.1c-70.25 0-137.9 25.6-190.5 72.03C116.3 275.7 115 295.9 126.7 309.2C138.5 322.4 158.7 323.7 171.9 312C212.8 275.9 265.4 256 320 256s107.3 19.88 148.1 56C474.2 317.4 481.8 320 489.3 320c8.844 0 17.66-3.656 24-10.81C525 295.9 523.8 275.7 510.5 264C457.9 217.6 390.3 191.1 320 191.1zM630.2 156.7C546.3 76.28 436.2 32 320 32S93.69 76.28 9.844 156.7c-12.75 12.25-13.16 32.5-.9375 45.25c12.22 12.78 32.47 13.12 45.25 .9375C125.1 133.1 220.4 96 320 96s193.1 37.97 265.8 106.9C592.1 208.8 600 211.8 608 211.8c8.406 0 16.81-3.281 23.09-9.844C643.3 189.2 642.9 168.1 630.2 156.7z\"]\n};\nvar faWifi3 = faWifi;\nvar faWifiStrong = faWifi;\nvar faWind = {\n  prefix: 'fas',\n  iconName: 'wind',\n  icon: [512, 512, [], \"f72e\", \"M32 192h320c52.94 0 96-43.06 96-96s-43.06-96-96-96h-32c-17.69 0-32 14.31-32 32s14.31 32 32 32h32c17.66 0 32 14.34 32 32s-14.34 32-32 32H32C14.31 128 0 142.3 0 160S14.31 192 32 192zM160 320H32c-17.69 0-32 14.31-32 32s14.31 32 32 32h128c17.66 0 32 14.34 32 32s-14.34 32-32 32H128c-17.69 0-32 14.31-32 32s14.31 32 32 32h32c52.94 0 96-43.06 96-96S212.9 320 160 320zM416 224H32C14.31 224 0 238.3 0 256s14.31 32 32 32h384c17.66 0 32 14.34 32 32s-14.34 32-32 32h-32c-17.69 0-32 14.31-32 32s14.31 32 32 32h32c52.94 0 96-43.06 96-96S468.9 224 416 224z\"]\n};\nvar faWindowMaximize = {\n  prefix: 'fas',\n  iconName: 'window-maximize',\n  icon: [512, 512, [128470], \"f2d0\", \"M448 32C483.3 32 512 60.65 512 96V416C512 451.3 483.3 480 448 480H64C28.65 480 0 451.3 0 416V96C0 60.65 28.65 32 64 32H448zM96 96C78.33 96 64 110.3 64 128C64 145.7 78.33 160 96 160H416C433.7 160 448 145.7 448 128C448 110.3 433.7 96 416 96H96z\"]\n};\nvar faWindowMinimize = {\n  prefix: 'fas',\n  iconName: 'window-minimize',\n  icon: [512, 512, [128469], \"f2d1\", \"M0 448C0 430.3 14.33 416 32 416H480C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H32C14.33 480 0 465.7 0 448z\"]\n};\nvar faWindowRestore = {\n  prefix: 'fas',\n  iconName: 'window-restore',\n  icon: [512, 512, [], \"f2d2\", \"M432 64H208C199.2 64 192 71.16 192 80V96H128V80C128 35.82 163.8 0 208 0H432C476.2 0 512 35.82 512 80V304C512 348.2 476.2 384 432 384H416V320H432C440.8 320 448 312.8 448 304V80C448 71.16 440.8 64 432 64zM0 192C0 156.7 28.65 128 64 128H320C355.3 128 384 156.7 384 192V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V192zM96 256H288C305.7 256 320 241.7 320 224C320 206.3 305.7 192 288 192H96C78.33 192 64 206.3 64 224C64 241.7 78.33 256 96 256z\"]\n};\nvar faWineBottle = {\n  prefix: 'fas',\n  iconName: 'wine-bottle',\n  icon: [512, 512, [], \"f72f\", \"M507.3 72.57l-67.88-67.88c-6.252-6.25-16.38-6.25-22.63 0l-22.63 22.62c-6.25 6.254-6.251 16.38-.0006 22.63l-76.63 76.63c-46.63-19.75-102.4-10.75-140.4 27.25l-158.4 158.4c-25 25-25 65.51 0 90.51l90.51 90.52c25 25 65.51 25 90.51 0l158.4-158.4c38-38 47-93.76 27.25-140.4l76.63-76.63c6.25 6.25 16.5 6.25 22.75 0l22.63-22.63C513.5 88.95 513.5 78.82 507.3 72.57zM179.3 423.2l-90.51-90.51l122-122l90.51 90.52L179.3 423.2z\"]\n};\nvar faWineGlass = {\n  prefix: 'fas',\n  iconName: 'wine-glass',\n  icon: [320, 512, [127863], \"f4e3\", \"M232 464h-40.01v-117.3c68.51-15.88 118-79.86 111.4-154.1L287.5 14.5C286.8 6.25 279.9 0 271.8 0H48.23C40.1 0 33.22 6.25 32.47 14.5L16.6 192.6c-6.626 74.25 42.88 138.2 111.4 154.2V464H87.98c-22.13 0-40.01 17.88-40.01 40c0 4.375 3.626 8 8.002 8h208c4.376 0 8.002-3.625 8.002-8C272 481.9 254.1 464 232 464zM77.72 48h164.6L249.4 128H70.58L77.72 48z\"]\n};\nvar faWineGlassEmpty = {\n  prefix: 'fas',\n  iconName: 'wine-glass-empty',\n  icon: [320, 512, [\"wine-glass-alt\"], \"f5ce\", \"M232 464h-40.01v-117.3c68.52-15.88 118-79.86 111.4-154.1L287.5 14.5C286.8 6.25 279.9 0 271.8 0H48.23C40.1 0 33.22 6.25 32.47 14.5L16.6 192.6c-6.625 74.25 42.88 138.2 111.4 154.2V464H87.98c-22.13 0-40.01 17.88-40.01 40c0 4.375 3.625 8 8.002 8h208c4.377 0 8.002-3.625 8.002-8C272 481.9 254.1 464 232 464zM180.4 300.2c-13.64 3.16-27.84 3.148-41.48-.0371C91.88 289.2 60.09 245.2 64.38 197.1L77.7 48h164.6L255.6 197.2c4.279 48.01-27.5 91.93-74.46 102.8L180.4 300.2z\"]\n};\nvar faWineGlassAlt = faWineGlassEmpty;\nvar faWonSign = {\n  prefix: 'fas',\n  iconName: 'won-sign',\n  icon: [512, 512, [8361, \"krw\", \"won\"], \"f159\", \"M119.1 224H183L224.1 56.24C228.5 41.99 241.3 32 256 32C270.7 32 283.5 41.99 287 56.24L328.1 224H392.9L449.6 53.88C455.2 37.12 473.4 28.05 490.1 33.64C506.9 39.23 515.9 57.35 510.4 74.12L460.4 224H480C497.7 224 512 238.3 512 256C512 273.7 497.7 288 480 288H439.1L382.4 458.1C377.9 471.6 364.1 480.5 350.8 479.1C336.6 479.4 324.4 469.6 320.1 455.8L279 288H232.1L191 455.8C187.6 469.6 175.4 479.4 161.2 479.1C147 480.5 134.1 471.6 129.6 458.1L72.94 288H32C14.33 288 .001 273.7 .001 256C.001 238.3 14.33 224 32 224H51.6L1.643 74.12C-3.946 57.35 5.115 39.23 21.88 33.64C38.65 28.05 56.77 37.12 62.36 53.88L119.1 224zM140.4 288L155.6 333.6L167 288H140.4zM248.1 224H263L256 195.9L248.1 224zM344.1 288L356.4 333.6L371.6 288H344.1z\"]\n};\nvar faKrw = faWonSign;\nvar faWon = faWonSign;\nvar faWorm = {\n  prefix: 'fas',\n  iconName: 'worm',\n  icon: [512, 512, [], \"e599\", \"M256 96C256 42.98 298.1 0 352 0H390.4C439.9 0 480 40.12 480 89.6V376C480 451.1 419.1 512 344 512C268.9 512 208 451.1 208 376V296C208 273.9 190.1 256 168 256C145.9 256 128 273.9 128 296V464C128 490.5 106.5 512 80 512C53.49 512 32 490.5 32 464V296C32 220.9 92.89 160 168 160C243.1 160 304 220.9 304 296V376C304 398.1 321.9 416 344 416C366.1 416 384 398.1 384 376V192H352C298.1 192 256 149 256 96zM376 64C362.7 64 352 74.75 352 88C352 101.3 362.7 112 376 112C389.3 112 400 101.3 400 88C400 74.75 389.3 64 376 64z\"]\n};\nvar faWrench = {\n  prefix: 'fas',\n  iconName: 'wrench',\n  icon: [512, 512, [128295], \"f0ad\", \"M507.6 122.8c-2.904-12.09-18.25-16.13-27.04-7.338l-76.55 76.56l-83.1-.0002l0-83.1l76.55-76.56c8.791-8.789 4.75-24.14-7.336-27.04c-23.69-5.693-49.34-6.111-75.92 .2484c-61.45 14.7-109.4 66.9-119.2 129.3C189.8 160.8 192.3 186.7 200.1 210.1l-178.1 178.1c-28.12 28.12-28.12 73.69 0 101.8C35.16 504.1 53.56 512 71.1 512s36.84-7.031 50.91-21.09l178.1-178.1c23.46 7.736 49.31 10.24 76.17 6.004c62.41-9.84 114.6-57.8 129.3-119.2C513.7 172.1 513.3 146.5 507.6 122.8zM80 456c-13.25 0-24-10.75-24-24c0-13.26 10.75-24 24-24s24 10.74 24 24C104 445.3 93.25 456 80 456z\"]\n};\nvar faX = {\n  prefix: 'fas',\n  iconName: 'x',\n  icon: [384, 512, [120], \"58\", \"M376.6 427.5c11.31 13.58 9.484 33.75-4.094 45.06c-5.984 4.984-13.25 7.422-20.47 7.422c-9.172 0-18.27-3.922-24.59-11.52L192 305.1l-135.4 162.5c-6.328 7.594-15.42 11.52-24.59 11.52c-7.219 0-14.48-2.438-20.47-7.422c-13.58-11.31-15.41-31.48-4.094-45.06l142.9-171.5L7.422 84.5C-3.891 70.92-2.063 50.75 11.52 39.44c13.56-11.34 33.73-9.516 45.06 4.094L192 206l135.4-162.5c11.3-13.58 31.48-15.42 45.06-4.094c13.58 11.31 15.41 31.48 4.094 45.06l-142.9 171.5L376.6 427.5z\"]\n};\nvar faXRay = {\n  prefix: 'fas',\n  iconName: 'x-ray',\n  icon: [512, 512, [], \"f497\", \"M208 352C199.2 352 192 359.2 192 368C192 376.8 199.2 384 208 384S224 376.8 224 368C224 359.2 216.8 352 208 352zM304 384c8.836 0 16-7.164 16-16c0-8.838-7.164-16-16-16S288 359.2 288 368C288 376.8 295.2 384 304 384zM496 96C504.8 96 512 88.84 512 80v-32C512 39.16 504.8 32 496 32h-480C7.164 32 0 39.16 0 48v32C0 88.84 7.164 96 16 96H32v320H16C7.164 416 0 423.2 0 432v32C0 472.8 7.164 480 16 480h480c8.836 0 16-7.164 16-16v-32c0-8.836-7.164-16-16-16H480V96H496zM416 216C416 220.4 412.4 224 408 224H272v32h104C380.4 256 384 259.6 384 264v16C384 284.4 380.4 288 376 288H272v32h69.33c25.56 0 40.8 28.48 26.62 49.75l-21.33 32C340.7 410.7 330.7 416 319.1 416H192c-10.7 0-20.69-5.347-26.62-14.25l-21.33-32C129.9 348.5 145.1 320 170.7 320H240V288H136C131.6 288 128 284.4 128 280v-16C128 259.6 131.6 256 136 256H240V224H104C99.6 224 96 220.4 96 216v-16C96 195.6 99.6 192 104 192H240V160H136C131.6 160 128 156.4 128 152v-16C128 131.6 131.6 128 136 128H240V104C240 99.6 243.6 96 248 96h16c4.4 0 8 3.6 8 8V128h104C380.4 128 384 131.6 384 136v16C384 156.4 380.4 160 376 160H272v32h136C412.4 192 416 195.6 416 200V216z\"]\n};\nvar faXmark = {\n  prefix: 'fas',\n  iconName: 'xmark',\n  icon: [320, 512, [128473, 10005, 10006, 10060, 215, \"close\", \"multiply\", \"remove\", \"times\"], \"f00d\", \"M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z\"]\n};\nvar faClose = faXmark;\nvar faMultiply = faXmark;\nvar faRemove = faXmark;\nvar faTimes = faXmark;\nvar faXmarksLines = {\n  prefix: 'fas',\n  iconName: 'xmarks-lines',\n  icon: [640, 512, [], \"e59a\", \"M608 32C625.7 32 640 46.33 640 64C640 81.67 625.7 96 608 96H32C14.33 96 0 81.67 0 64C0 46.33 14.33 32 32 32H608zM608 416C625.7 416 640 430.3 640 448C640 465.7 625.7 480 608 480H32C14.33 480 0 465.7 0 448C0 430.3 14.33 416 32 416H608zM7.029 167C16.4 157.7 31.6 157.7 40.97 167L96 222.1L151 167C160.4 157.7 175.6 157.7 184.1 167C194.3 176.4 194.3 191.6 184.1 200.1L129.9 256L184.1 311C194.3 320.4 194.3 335.6 184.1 344.1C175.6 354.3 160.4 354.3 151 344.1L96 289.9L40.97 344.1C31.6 354.3 16.4 354.3 7.029 344.1C-2.343 335.6-2.343 320.4 7.029 311L62.06 256L7.029 200.1C-2.343 191.6-2.343 176.4 7.029 167V167zM320 222.1L375 167C384.4 157.7 399.6 157.7 408.1 167C418.3 176.4 418.3 191.6 408.1 200.1L353.9 256L408.1 311C418.3 320.4 418.3 335.6 408.1 344.1C399.6 354.3 384.4 354.3 375 344.1L320 289.9L264.1 344.1C255.6 354.3 240.4 354.3 231 344.1C221.7 335.6 221.7 320.4 231 311L286.1 256L231 200.1C221.7 191.6 221.7 176.4 231 167C240.4 157.7 255.6 157.7 264.1 167L320 222.1zM455 167C464.4 157.7 479.6 157.7 488.1 167L544 222.1L599 167C608.4 157.7 623.6 157.7 632.1 167C642.3 176.4 642.3 191.6 632.1 200.1L577.9 256L632.1 311C642.3 320.4 642.3 335.6 632.1 344.1C623.6 354.3 608.4 354.3 599 344.1L544 289.9L488.1 344.1C479.6 354.3 464.4 354.3 455 344.1C445.7 335.6 445.7 320.4 455 311L510.1 256L455 200.1C445.7 191.6 445.7 176.4 455 167V167z\"]\n};\nvar faY = {\n  prefix: 'fas',\n  iconName: 'y',\n  icon: [384, 512, [121], \"59\", \"M378 82.61L224 298.3v149.8c0 17.67-14.31 31.1-32 31.1S160 465.7 160 448V298.3L5.969 82.61C-4.313 68.23-.9688 48.25 13.41 37.97c14.34-10.27 34.38-6.922 44.63 7.453L192 232.1l133.1-187.5c10.28-14.37 30.28-17.7 44.63-7.453C384.1 48.25 388.3 68.23 378 82.61z\"]\n};\nvar faYenSign = {\n  prefix: 'fas',\n  iconName: 'yen-sign',\n  icon: [320, 512, [165, \"cny\", \"jpy\", \"rmb\", \"yen\"], \"f157\", \"M159.1 198.3L261.4 46.25C271.2 31.54 291 27.57 305.8 37.37C320.5 47.18 324.4 67.04 314.6 81.75L219.8 223.1H272C289.7 223.1 304 238.3 304 255.1C304 273.7 289.7 287.1 272 287.1H192V319.1H272C289.7 319.1 304 334.3 304 352C304 369.7 289.7 384 272 384H192V448C192 465.7 177.7 480 159.1 480C142.3 480 127.1 465.7 127.1 448V384H47.1C30.33 384 15.1 369.7 15.1 352C15.1 334.3 30.33 319.1 47.1 319.1H127.1V287.1H47.1C30.33 287.1 15.1 273.7 15.1 255.1C15.1 238.3 30.33 223.1 47.1 223.1H100.2L5.374 81.75C-4.429 67.04-.456 47.18 14.25 37.37C28.95 27.57 48.82 31.54 58.62 46.25L159.1 198.3z\"]\n};\nvar faCny = faYenSign;\nvar faJpy = faYenSign;\nvar faRmb = faYenSign;\nvar faYen = faYenSign;\nvar faYinYang = {\n  prefix: 'fas',\n  iconName: 'yin-yang',\n  icon: [512, 512, [9775], \"f6ad\", \"M256 128C238.3 128 224 142.4 224 160S238.3 192 256 192s31.97-14.38 31.97-32S273.7 128 256 128zM256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 384c-17.68 0-31.97-14.38-31.97-32S238.3 320 256 320s31.97 14.38 31.97 32S273.7 384 256 384zM256 256c-53.04 0-96.03 43-96.03 96S202.1 448 256 448c-106.1 0-192.1-86-192.1-192S149.9 64 256 64c53.04 0 96.03 43 96.03 96S309 256 256 256z\"]\n};\nvar faZ = {\n  prefix: 'fas',\n  iconName: 'z',\n  icon: [384, 512, [122], \"5a\", \"M384 448c0 17.67-14.31 32-32 32H32c-12.41 0-23.72-7.188-28.97-18.42c-5.281-11.25-3.562-24.53 4.375-34.06l276.3-331.5H32c-17.69 0-32-14.33-32-32s14.31-32 32-32h320c12.41 0 23.72 7.188 28.97 18.42c5.281 11.25 3.562 24.53-4.375 34.06L100.3 416H352C369.7 416 384 430.3 384 448z\"]\n};\nvar _iconsCache = {\n  fa0: fa0,\n  fa1: fa1,\n  fa2: fa2,\n  fa3: fa3,\n  fa4: fa4,\n  fa5: fa5,\n  fa6: fa6,\n  fa7: fa7,\n  fa8: fa8,\n  fa9: fa9,\n  faA: faA,\n  faAddressBook: faAddressBook,\n  faContactBook: faContactBook,\n  faAddressCard: faAddressCard,\n  faContactCard: faContactCard,\n  faVcard: faVcard,\n  faAlignCenter: faAlignCenter,\n  faAlignJustify: faAlignJustify,\n  faAlignLeft: faAlignLeft,\n  faAlignRight: faAlignRight,\n  faAnchor: faAnchor,\n  faAnchorCircleCheck: faAnchorCircleCheck,\n  faAnchorCircleExclamation: faAnchorCircleExclamation,\n  faAnchorCircleXmark: faAnchorCircleXmark,\n  faAnchorLock: faAnchorLock,\n  faAngleDown: faAngleDown,\n  faAngleLeft: faAngleLeft,\n  faAngleRight: faAngleRight,\n  faAngleUp: faAngleUp,\n  faAnglesDown: faAnglesDown,\n  faAngleDoubleDown: faAngleDoubleDown,\n  faAnglesLeft: faAnglesLeft,\n  faAngleDoubleLeft: faAngleDoubleLeft,\n  faAnglesRight: faAnglesRight,\n  faAngleDoubleRight: faAngleDoubleRight,\n  faAnglesUp: faAnglesUp,\n  faAngleDoubleUp: faAngleDoubleUp,\n  faAnkh: faAnkh,\n  faAppleWhole: faAppleWhole,\n  faAppleAlt: faAppleAlt,\n  faArchway: faArchway,\n  faArrowDown: faArrowDown,\n  faArrowDown19: faArrowDown19,\n  faSortNumericAsc: faSortNumericAsc,\n  faSortNumericDown: faSortNumericDown,\n  faArrowDown91: faArrowDown91,\n  faSortNumericDesc: faSortNumericDesc,\n  faSortNumericDownAlt: faSortNumericDownAlt,\n  faArrowDownAZ: faArrowDownAZ,\n  faSortAlphaAsc: faSortAlphaAsc,\n  faSortAlphaDown: faSortAlphaDown,\n  faArrowDownLong: faArrowDownLong,\n  faLongArrowDown: faLongArrowDown,\n  faArrowDownShortWide: faArrowDownShortWide,\n  faSortAmountDesc: faSortAmountDesc,\n  faSortAmountDownAlt: faSortAmountDownAlt,\n  faArrowDownUpAcrossLine: faArrowDownUpAcrossLine,\n  faArrowDownUpLock: faArrowDownUpLock,\n  faArrowDownWideShort: faArrowDownWideShort,\n  faSortAmountAsc: faSortAmountAsc,\n  faSortAmountDown: faSortAmountDown,\n  faArrowDownZA: faArrowDownZA,\n  faSortAlphaDesc: faSortAlphaDesc,\n  faSortAlphaDownAlt: faSortAlphaDownAlt,\n  faArrowLeft: faArrowLeft,\n  faArrowLeftLong: faArrowLeftLong,\n  faLongArrowLeft: faLongArrowLeft,\n  faArrowPointer: faArrowPointer,\n  faMousePointer: faMousePointer,\n  faArrowRight: faArrowRight,\n  faArrowRightArrowLeft: faArrowRightArrowLeft,\n  faExchange: faExchange,\n  faArrowRightFromBracket: faArrowRightFromBracket,\n  faSignOut: faSignOut,\n  faArrowRightLong: faArrowRightLong,\n  faLongArrowRight: faLongArrowRight,\n  faArrowRightToBracket: faArrowRightToBracket,\n  faSignIn: faSignIn,\n  faArrowRightToCity: faArrowRightToCity,\n  faArrowRotateLeft: faArrowRotateLeft,\n  faArrowLeftRotate: faArrowLeftRotate,\n  faArrowRotateBack: faArrowRotateBack,\n  faArrowRotateBackward: faArrowRotateBackward,\n  faUndo: faUndo,\n  faArrowRotateRight: faArrowRotateRight,\n  faArrowRightRotate: faArrowRightRotate,\n  faArrowRotateForward: faArrowRotateForward,\n  faRedo: faRedo,\n  faArrowTrendDown: faArrowTrendDown,\n  faArrowTrendUp: faArrowTrendUp,\n  faArrowTurnDown: faArrowTurnDown,\n  faLevelDown: faLevelDown,\n  faArrowTurnUp: faArrowTurnUp,\n  faLevelUp: faLevelUp,\n  faArrowUp: faArrowUp,\n  faArrowUp19: faArrowUp19,\n  faSortNumericUp: faSortNumericUp,\n  faArrowUp91: faArrowUp91,\n  faSortNumericUpAlt: faSortNumericUpAlt,\n  faArrowUpAZ: faArrowUpAZ,\n  faSortAlphaUp: faSortAlphaUp,\n  faArrowUpFromBracket: faArrowUpFromBracket,\n  faArrowUpFromGroundWater: faArrowUpFromGroundWater,\n  faArrowUpFromWaterPump: faArrowUpFromWaterPump,\n  faArrowUpLong: faArrowUpLong,\n  faLongArrowUp: faLongArrowUp,\n  faArrowUpRightDots: faArrowUpRightDots,\n  faArrowUpRightFromSquare: faArrowUpRightFromSquare,\n  faExternalLink: faExternalLink,\n  faArrowUpShortWide: faArrowUpShortWide,\n  faSortAmountUpAlt: faSortAmountUpAlt,\n  faArrowUpWideShort: faArrowUpWideShort,\n  faSortAmountUp: faSortAmountUp,\n  faArrowUpZA: faArrowUpZA,\n  faSortAlphaUpAlt: faSortAlphaUpAlt,\n  faArrowsDownToLine: faArrowsDownToLine,\n  faArrowsDownToPeople: faArrowsDownToPeople,\n  faArrowsLeftRight: faArrowsLeftRight,\n  faArrowsH: faArrowsH,\n  faArrowsLeftRightToLine: faArrowsLeftRightToLine,\n  faArrowsRotate: faArrowsRotate,\n  faRefresh: faRefresh,\n  faSync: faSync,\n  faArrowsSpin: faArrowsSpin,\n  faArrowsSplitUpAndLeft: faArrowsSplitUpAndLeft,\n  faArrowsToCircle: faArrowsToCircle,\n  faArrowsToDot: faArrowsToDot,\n  faArrowsToEye: faArrowsToEye,\n  faArrowsTurnRight: faArrowsTurnRight,\n  faArrowsTurnToDots: faArrowsTurnToDots,\n  faArrowsUpDown: faArrowsUpDown,\n  faArrowsV: faArrowsV,\n  faArrowsUpDownLeftRight: faArrowsUpDownLeftRight,\n  faArrows: faArrows,\n  faArrowsUpToLine: faArrowsUpToLine,\n  faAsterisk: faAsterisk,\n  faAt: faAt,\n  faAtom: faAtom,\n  faAudioDescription: faAudioDescription,\n  faAustralSign: faAustralSign,\n  faAward: faAward,\n  faB: faB,\n  faBaby: faBaby,\n  faBabyCarriage: faBabyCarriage,\n  faCarriageBaby: faCarriageBaby,\n  faBackward: faBackward,\n  faBackwardFast: faBackwardFast,\n  faFastBackward: faFastBackward,\n  faBackwardStep: faBackwardStep,\n  faStepBackward: faStepBackward,\n  faBacon: faBacon,\n  faBacteria: faBacteria,\n  faBacterium: faBacterium,\n  faBagShopping: faBagShopping,\n  faShoppingBag: faShoppingBag,\n  faBahai: faBahai,\n  faBahtSign: faBahtSign,\n  faBan: faBan,\n  faCancel: faCancel,\n  faBanSmoking: faBanSmoking,\n  faSmokingBan: faSmokingBan,\n  faBandage: faBandage,\n  faBandAid: faBandAid,\n  faBarcode: faBarcode,\n  faBars: faBars,\n  faNavicon: faNavicon,\n  faBarsProgress: faBarsProgress,\n  faTasksAlt: faTasksAlt,\n  faBarsStaggered: faBarsStaggered,\n  faReorder: faReorder,\n  faStream: faStream,\n  faBaseball: faBaseball,\n  faBaseballBall: faBaseballBall,\n  faBaseballBatBall: faBaseballBatBall,\n  faBasketShopping: faBasketShopping,\n  faShoppingBasket: faShoppingBasket,\n  faBasketball: faBasketball,\n  faBasketballBall: faBasketballBall,\n  faBath: faBath,\n  faBathtub: faBathtub,\n  faBatteryEmpty: faBatteryEmpty,\n  faBattery0: faBattery0,\n  faBatteryFull: faBatteryFull,\n  faBattery: faBattery,\n  faBattery5: faBattery5,\n  faBatteryHalf: faBatteryHalf,\n  faBattery3: faBattery3,\n  faBatteryQuarter: faBatteryQuarter,\n  faBattery2: faBattery2,\n  faBatteryThreeQuarters: faBatteryThreeQuarters,\n  faBattery4: faBattery4,\n  faBed: faBed,\n  faBedPulse: faBedPulse,\n  faProcedures: faProcedures,\n  faBeerMugEmpty: faBeerMugEmpty,\n  faBeer: faBeer,\n  faBell: faBell,\n  faBellConcierge: faBellConcierge,\n  faConciergeBell: faConciergeBell,\n  faBellSlash: faBellSlash,\n  faBezierCurve: faBezierCurve,\n  faBicycle: faBicycle,\n  faBinoculars: faBinoculars,\n  faBiohazard: faBiohazard,\n  faBitcoinSign: faBitcoinSign,\n  faBlender: faBlender,\n  faBlenderPhone: faBlenderPhone,\n  faBlog: faBlog,\n  faBold: faBold,\n  faBolt: faBolt,\n  faZap: faZap,\n  faBoltLightning: faBoltLightning,\n  faBomb: faBomb,\n  faBone: faBone,\n  faBong: faBong,\n  faBook: faBook,\n  faBookAtlas: faBookAtlas,\n  faAtlas: faAtlas,\n  faBookBible: faBookBible,\n  faBible: faBible,\n  faBookBookmark: faBookBookmark,\n  faBookJournalWhills: faBookJournalWhills,\n  faJournalWhills: faJournalWhills,\n  faBookMedical: faBookMedical,\n  faBookOpen: faBookOpen,\n  faBookOpenReader: faBookOpenReader,\n  faBookReader: faBookReader,\n  faBookQuran: faBookQuran,\n  faQuran: faQuran,\n  faBookSkull: faBookSkull,\n  faBookDead: faBookDead,\n  faBookmark: faBookmark,\n  faBorderAll: faBorderAll,\n  faBorderNone: faBorderNone,\n  faBorderTopLeft: faBorderTopLeft,\n  faBorderStyle: faBorderStyle,\n  faBoreHole: faBoreHole,\n  faBottleDroplet: faBottleDroplet,\n  faBottleWater: faBottleWater,\n  faBowlFood: faBowlFood,\n  faBowlRice: faBowlRice,\n  faBowlingBall: faBowlingBall,\n  faBox: faBox,\n  faBoxArchive: faBoxArchive,\n  faArchive: faArchive,\n  faBoxOpen: faBoxOpen,\n  faBoxTissue: faBoxTissue,\n  faBoxesPacking: faBoxesPacking,\n  faBoxesStacked: faBoxesStacked,\n  faBoxes: faBoxes,\n  faBoxesAlt: faBoxesAlt,\n  faBraille: faBraille,\n  faBrain: faBrain,\n  faBrazilianRealSign: faBrazilianRealSign,\n  faBreadSlice: faBreadSlice,\n  faBridge: faBridge,\n  faBridgeCircleCheck: faBridgeCircleCheck,\n  faBridgeCircleExclamation: faBridgeCircleExclamation,\n  faBridgeCircleXmark: faBridgeCircleXmark,\n  faBridgeLock: faBridgeLock,\n  faBridgeWater: faBridgeWater,\n  faBriefcase: faBriefcase,\n  faBriefcaseMedical: faBriefcaseMedical,\n  faBroom: faBroom,\n  faBroomBall: faBroomBall,\n  faQuidditch: faQuidditch,\n  faQuidditchBroomBall: faQuidditchBroomBall,\n  faBrush: faBrush,\n  faBucket: faBucket,\n  faBug: faBug,\n  faBugSlash: faBugSlash,\n  faBugs: faBugs,\n  faBuilding: faBuilding,\n  faBuildingCircleArrowRight: faBuildingCircleArrowRight,\n  faBuildingCircleCheck: faBuildingCircleCheck,\n  faBuildingCircleExclamation: faBuildingCircleExclamation,\n  faBuildingCircleXmark: faBuildingCircleXmark,\n  faBuildingColumns: faBuildingColumns,\n  faBank: faBank,\n  faInstitution: faInstitution,\n  faMuseum: faMuseum,\n  faUniversity: faUniversity,\n  faBuildingFlag: faBuildingFlag,\n  faBuildingLock: faBuildingLock,\n  faBuildingNgo: faBuildingNgo,\n  faBuildingShield: faBuildingShield,\n  faBuildingUn: faBuildingUn,\n  faBuildingUser: faBuildingUser,\n  faBuildingWheat: faBuildingWheat,\n  faBullhorn: faBullhorn,\n  faBullseye: faBullseye,\n  faBurger: faBurger,\n  faHamburger: faHamburger,\n  faBurst: faBurst,\n  faBus: faBus,\n  faBusSimple: faBusSimple,\n  faBusAlt: faBusAlt,\n  faBusinessTime: faBusinessTime,\n  faBriefcaseClock: faBriefcaseClock,\n  faC: faC,\n  faCakeCandles: faCakeCandles,\n  faBirthdayCake: faBirthdayCake,\n  faCake: faCake,\n  faCalculator: faCalculator,\n  faCalendar: faCalendar,\n  faCalendarCheck: faCalendarCheck,\n  faCalendarDay: faCalendarDay,\n  faCalendarDays: faCalendarDays,\n  faCalendarAlt: faCalendarAlt,\n  faCalendarMinus: faCalendarMinus,\n  faCalendarPlus: faCalendarPlus,\n  faCalendarWeek: faCalendarWeek,\n  faCalendarXmark: faCalendarXmark,\n  faCalendarTimes: faCalendarTimes,\n  faCamera: faCamera,\n  faCameraAlt: faCameraAlt,\n  faCameraRetro: faCameraRetro,\n  faCameraRotate: faCameraRotate,\n  faCampground: faCampground,\n  faCandyCane: faCandyCane,\n  faCannabis: faCannabis,\n  faCapsules: faCapsules,\n  faCar: faCar,\n  faAutomobile: faAutomobile,\n  faCarBattery: faCarBattery,\n  faBatteryCar: faBatteryCar,\n  faCarBurst: faCarBurst,\n  faCarCrash: faCarCrash,\n  faCarOn: faCarOn,\n  faCarRear: faCarRear,\n  faCarAlt: faCarAlt,\n  faCarSide: faCarSide,\n  faCarTunnel: faCarTunnel,\n  faCaravan: faCaravan,\n  faCaretDown: faCaretDown,\n  faCaretLeft: faCaretLeft,\n  faCaretRight: faCaretRight,\n  faCaretUp: faCaretUp,\n  faCarrot: faCarrot,\n  faCartArrowDown: faCartArrowDown,\n  faCartFlatbed: faCartFlatbed,\n  faDollyFlatbed: faDollyFlatbed,\n  faCartFlatbedSuitcase: faCartFlatbedSuitcase,\n  faLuggageCart: faLuggageCart,\n  faCartPlus: faCartPlus,\n  faCartShopping: faCartShopping,\n  faShoppingCart: faShoppingCart,\n  faCashRegister: faCashRegister,\n  faCat: faCat,\n  faCediSign: faCediSign,\n  faCentSign: faCentSign,\n  faCertificate: faCertificate,\n  faChair: faChair,\n  faChalkboard: faChalkboard,\n  faBlackboard: faBlackboard,\n  faChalkboardUser: faChalkboardUser,\n  faChalkboardTeacher: faChalkboardTeacher,\n  faChampagneGlasses: faChampagneGlasses,\n  faGlassCheers: faGlassCheers,\n  faChargingStation: faChargingStation,\n  faChartArea: faChartArea,\n  faAreaChart: faAreaChart,\n  faChartBar: faChartBar,\n  faBarChart: faBarChart,\n  faChartColumn: faChartColumn,\n  faChartGantt: faChartGantt,\n  faChartLine: faChartLine,\n  faLineChart: faLineChart,\n  faChartPie: faChartPie,\n  faPieChart: faPieChart,\n  faChartSimple: faChartSimple,\n  faCheck: faCheck,\n  faCheckDouble: faCheckDouble,\n  faCheckToSlot: faCheckToSlot,\n  faVoteYea: faVoteYea,\n  faCheese: faCheese,\n  faChess: faChess,\n  faChessBishop: faChessBishop,\n  faChessBoard: faChessBoard,\n  faChessKing: faChessKing,\n  faChessKnight: faChessKnight,\n  faChessPawn: faChessPawn,\n  faChessQueen: faChessQueen,\n  faChessRook: faChessRook,\n  faChevronDown: faChevronDown,\n  faChevronLeft: faChevronLeft,\n  faChevronRight: faChevronRight,\n  faChevronUp: faChevronUp,\n  faChild: faChild,\n  faChildDress: faChildDress,\n  faChildReaching: faChildReaching,\n  faChildRifle: faChildRifle,\n  faChildren: faChildren,\n  faChurch: faChurch,\n  faCircle: faCircle,\n  faCircleArrowDown: faCircleArrowDown,\n  faArrowCircleDown: faArrowCircleDown,\n  faCircleArrowLeft: faCircleArrowLeft,\n  faArrowCircleLeft: faArrowCircleLeft,\n  faCircleArrowRight: faCircleArrowRight,\n  faArrowCircleRight: faArrowCircleRight,\n  faCircleArrowUp: faCircleArrowUp,\n  faArrowCircleUp: faArrowCircleUp,\n  faCircleCheck: faCircleCheck,\n  faCheckCircle: faCheckCircle,\n  faCircleChevronDown: faCircleChevronDown,\n  faChevronCircleDown: faChevronCircleDown,\n  faCircleChevronLeft: faCircleChevronLeft,\n  faChevronCircleLeft: faChevronCircleLeft,\n  faCircleChevronRight: faCircleChevronRight,\n  faChevronCircleRight: faChevronCircleRight,\n  faCircleChevronUp: faCircleChevronUp,\n  faChevronCircleUp: faChevronCircleUp,\n  faCircleDollarToSlot: faCircleDollarToSlot,\n  faDonate: faDonate,\n  faCircleDot: faCircleDot,\n  faDotCircle: faDotCircle,\n  faCircleDown: faCircleDown,\n  faArrowAltCircleDown: faArrowAltCircleDown,\n  faCircleExclamation: faCircleExclamation,\n  faExclamationCircle: faExclamationCircle,\n  faCircleH: faCircleH,\n  faHospitalSymbol: faHospitalSymbol,\n  faCircleHalfStroke: faCircleHalfStroke,\n  faAdjust: faAdjust,\n  faCircleInfo: faCircleInfo,\n  faInfoCircle: faInfoCircle,\n  faCircleLeft: faCircleLeft,\n  faArrowAltCircleLeft: faArrowAltCircleLeft,\n  faCircleMinus: faCircleMinus,\n  faMinusCircle: faMinusCircle,\n  faCircleNodes: faCircleNodes,\n  faCircleNotch: faCircleNotch,\n  faCirclePause: faCirclePause,\n  faPauseCircle: faPauseCircle,\n  faCirclePlay: faCirclePlay,\n  faPlayCircle: faPlayCircle,\n  faCirclePlus: faCirclePlus,\n  faPlusCircle: faPlusCircle,\n  faCircleQuestion: faCircleQuestion,\n  faQuestionCircle: faQuestionCircle,\n  faCircleRadiation: faCircleRadiation,\n  faRadiationAlt: faRadiationAlt,\n  faCircleRight: faCircleRight,\n  faArrowAltCircleRight: faArrowAltCircleRight,\n  faCircleStop: faCircleStop,\n  faStopCircle: faStopCircle,\n  faCircleUp: faCircleUp,\n  faArrowAltCircleUp: faArrowAltCircleUp,\n  faCircleUser: faCircleUser,\n  faUserCircle: faUserCircle,\n  faCircleXmark: faCircleXmark,\n  faTimesCircle: faTimesCircle,\n  faXmarkCircle: faXmarkCircle,\n  faCity: faCity,\n  faClapperboard: faClapperboard,\n  faClipboard: faClipboard,\n  faClipboardCheck: faClipboardCheck,\n  faClipboardList: faClipboardList,\n  faClipboardQuestion: faClipboardQuestion,\n  faClipboardUser: faClipboardUser,\n  faClock: faClock,\n  faClockFour: faClockFour,\n  faClockRotateLeft: faClockRotateLeft,\n  faHistory: faHistory,\n  faClone: faClone,\n  faClosedCaptioning: faClosedCaptioning,\n  faCloud: faCloud,\n  faCloudArrowDown: faCloudArrowDown,\n  faCloudDownload: faCloudDownload,\n  faCloudDownloadAlt: faCloudDownloadAlt,\n  faCloudArrowUp: faCloudArrowUp,\n  faCloudUpload: faCloudUpload,\n  faCloudUploadAlt: faCloudUploadAlt,\n  faCloudBolt: faCloudBolt,\n  faThunderstorm: faThunderstorm,\n  faCloudMeatball: faCloudMeatball,\n  faCloudMoon: faCloudMoon,\n  faCloudMoonRain: faCloudMoonRain,\n  faCloudRain: faCloudRain,\n  faCloudShowersHeavy: faCloudShowersHeavy,\n  faCloudShowersWater: faCloudShowersWater,\n  faCloudSun: faCloudSun,\n  faCloudSunRain: faCloudSunRain,\n  faClover: faClover,\n  faCode: faCode,\n  faCodeBranch: faCodeBranch,\n  faCodeCommit: faCodeCommit,\n  faCodeCompare: faCodeCompare,\n  faCodeFork: faCodeFork,\n  faCodeMerge: faCodeMerge,\n  faCodePullRequest: faCodePullRequest,\n  faCoins: faCoins,\n  faColonSign: faColonSign,\n  faComment: faComment,\n  faCommentDollar: faCommentDollar,\n  faCommentDots: faCommentDots,\n  faCommenting: faCommenting,\n  faCommentMedical: faCommentMedical,\n  faCommentSlash: faCommentSlash,\n  faCommentSms: faCommentSms,\n  faSms: faSms,\n  faComments: faComments,\n  faCommentsDollar: faCommentsDollar,\n  faCompactDisc: faCompactDisc,\n  faCompass: faCompass,\n  faCompassDrafting: faCompassDrafting,\n  faDraftingCompass: faDraftingCompass,\n  faCompress: faCompress,\n  faComputer: faComputer,\n  faComputerMouse: faComputerMouse,\n  faMouse: faMouse,\n  faCookie: faCookie,\n  faCookieBite: faCookieBite,\n  faCopy: faCopy,\n  faCopyright: faCopyright,\n  faCouch: faCouch,\n  faCow: faCow,\n  faCreditCard: faCreditCard,\n  faCreditCardAlt: faCreditCardAlt,\n  faCrop: faCrop,\n  faCropSimple: faCropSimple,\n  faCropAlt: faCropAlt,\n  faCross: faCross,\n  faCrosshairs: faCrosshairs,\n  faCrow: faCrow,\n  faCrown: faCrown,\n  faCrutch: faCrutch,\n  faCruzeiroSign: faCruzeiroSign,\n  faCube: faCube,\n  faCubes: faCubes,\n  faCubesStacked: faCubesStacked,\n  faD: faD,\n  faDatabase: faDatabase,\n  faDeleteLeft: faDeleteLeft,\n  faBackspace: faBackspace,\n  faDemocrat: faDemocrat,\n  faDesktop: faDesktop,\n  faDesktopAlt: faDesktopAlt,\n  faDharmachakra: faDharmachakra,\n  faDiagramNext: faDiagramNext,\n  faDiagramPredecessor: faDiagramPredecessor,\n  faDiagramProject: faDiagramProject,\n  faProjectDiagram: faProjectDiagram,\n  faDiagramSuccessor: faDiagramSuccessor,\n  faDiamond: faDiamond,\n  faDiamondTurnRight: faDiamondTurnRight,\n  faDirections: faDirections,\n  faDice: faDice,\n  faDiceD20: faDiceD20,\n  faDiceD6: faDiceD6,\n  faDiceFive: faDiceFive,\n  faDiceFour: faDiceFour,\n  faDiceOne: faDiceOne,\n  faDiceSix: faDiceSix,\n  faDiceThree: faDiceThree,\n  faDiceTwo: faDiceTwo,\n  faDisease: faDisease,\n  faDisplay: faDisplay,\n  faDivide: faDivide,\n  faDna: faDna,\n  faDog: faDog,\n  faDollarSign: faDollarSign,\n  faDollar: faDollar,\n  faUsd: faUsd,\n  faDolly: faDolly,\n  faDollyBox: faDollyBox,\n  faDongSign: faDongSign,\n  faDoorClosed: faDoorClosed,\n  faDoorOpen: faDoorOpen,\n  faDove: faDove,\n  faDownLeftAndUpRightToCenter: faDownLeftAndUpRightToCenter,\n  faCompressAlt: faCompressAlt,\n  faDownLong: faDownLong,\n  faLongArrowAltDown: faLongArrowAltDown,\n  faDownload: faDownload,\n  faDragon: faDragon,\n  faDrawPolygon: faDrawPolygon,\n  faDroplet: faDroplet,\n  faTint: faTint,\n  faDropletSlash: faDropletSlash,\n  faTintSlash: faTintSlash,\n  faDrum: faDrum,\n  faDrumSteelpan: faDrumSteelpan,\n  faDrumstickBite: faDrumstickBite,\n  faDumbbell: faDumbbell,\n  faDumpster: faDumpster,\n  faDumpsterFire: faDumpsterFire,\n  faDungeon: faDungeon,\n  faE: faE,\n  faEarDeaf: faEarDeaf,\n  faDeaf: faDeaf,\n  faDeafness: faDeafness,\n  faHardOfHearing: faHardOfHearing,\n  faEarListen: faEarListen,\n  faAssistiveListeningSystems: faAssistiveListeningSystems,\n  faEarthAfrica: faEarthAfrica,\n  faGlobeAfrica: faGlobeAfrica,\n  faEarthAmericas: faEarthAmericas,\n  faEarth: faEarth,\n  faEarthAmerica: faEarthAmerica,\n  faGlobeAmericas: faGlobeAmericas,\n  faEarthAsia: faEarthAsia,\n  faGlobeAsia: faGlobeAsia,\n  faEarthEurope: faEarthEurope,\n  faGlobeEurope: faGlobeEurope,\n  faEarthOceania: faEarthOceania,\n  faGlobeOceania: faGlobeOceania,\n  faEgg: faEgg,\n  faEject: faEject,\n  faElevator: faElevator,\n  faEllipsis: faEllipsis,\n  faEllipsisH: faEllipsisH,\n  faEllipsisVertical: faEllipsisVertical,\n  faEllipsisV: faEllipsisV,\n  faEnvelope: faEnvelope,\n  faEnvelopeCircleCheck: faEnvelopeCircleCheck,\n  faEnvelopeOpen: faEnvelopeOpen,\n  faEnvelopeOpenText: faEnvelopeOpenText,\n  faEnvelopesBulk: faEnvelopesBulk,\n  faMailBulk: faMailBulk,\n  faEquals: faEquals,\n  faEraser: faEraser,\n  faEthernet: faEthernet,\n  faEuroSign: faEuroSign,\n  faEur: faEur,\n  faEuro: faEuro,\n  faExclamation: faExclamation,\n  faExpand: faExpand,\n  faExplosion: faExplosion,\n  faEye: faEye,\n  faEyeDropper: faEyeDropper,\n  faEyeDropperEmpty: faEyeDropperEmpty,\n  faEyedropper: faEyedropper,\n  faEyeLowVision: faEyeLowVision,\n  faLowVision: faLowVision,\n  faEyeSlash: faEyeSlash,\n  faF: faF,\n  faFaceAngry: faFaceAngry,\n  faAngry: faAngry,\n  faFaceDizzy: faFaceDizzy,\n  faDizzy: faDizzy,\n  faFaceFlushed: faFaceFlushed,\n  faFlushed: faFlushed,\n  faFaceFrown: faFaceFrown,\n  faFrown: faFrown,\n  faFaceFrownOpen: faFaceFrownOpen,\n  faFrownOpen: faFrownOpen,\n  faFaceGrimace: faFaceGrimace,\n  faGrimace: faGrimace,\n  faFaceGrin: faFaceGrin,\n  faGrin: faGrin,\n  faFaceGrinBeam: faFaceGrinBeam,\n  faGrinBeam: faGrinBeam,\n  faFaceGrinBeamSweat: faFaceGrinBeamSweat,\n  faGrinBeamSweat: faGrinBeamSweat,\n  faFaceGrinHearts: faFaceGrinHearts,\n  faGrinHearts: faGrinHearts,\n  faFaceGrinSquint: faFaceGrinSquint,\n  faGrinSquint: faGrinSquint,\n  faFaceGrinSquintTears: faFaceGrinSquintTears,\n  faGrinSquintTears: faGrinSquintTears,\n  faFaceGrinStars: faFaceGrinStars,\n  faGrinStars: faGrinStars,\n  faFaceGrinTears: faFaceGrinTears,\n  faGrinTears: faGrinTears,\n  faFaceGrinTongue: faFaceGrinTongue,\n  faGrinTongue: faGrinTongue,\n  faFaceGrinTongueSquint: faFaceGrinTongueSquint,\n  faGrinTongueSquint: faGrinTongueSquint,\n  faFaceGrinTongueWink: faFaceGrinTongueWink,\n  faGrinTongueWink: faGrinTongueWink,\n  faFaceGrinWide: faFaceGrinWide,\n  faGrinAlt: faGrinAlt,\n  faFaceGrinWink: faFaceGrinWink,\n  faGrinWink: faGrinWink,\n  faFaceKiss: faFaceKiss,\n  faKiss: faKiss,\n  faFaceKissBeam: faFaceKissBeam,\n  faKissBeam: faKissBeam,\n  faFaceKissWinkHeart: faFaceKissWinkHeart,\n  faKissWinkHeart: faKissWinkHeart,\n  faFaceLaugh: faFaceLaugh,\n  faLaugh: faLaugh,\n  faFaceLaughBeam: faFaceLaughBeam,\n  faLaughBeam: faLaughBeam,\n  faFaceLaughSquint: faFaceLaughSquint,\n  faLaughSquint: faLaughSquint,\n  faFaceLaughWink: faFaceLaughWink,\n  faLaughWink: faLaughWink,\n  faFaceMeh: faFaceMeh,\n  faMeh: faMeh,\n  faFaceMehBlank: faFaceMehBlank,\n  faMehBlank: faMehBlank,\n  faFaceRollingEyes: faFaceRollingEyes,\n  faMehRollingEyes: faMehRollingEyes,\n  faFaceSadCry: faFaceSadCry,\n  faSadCry: faSadCry,\n  faFaceSadTear: faFaceSadTear,\n  faSadTear: faSadTear,\n  faFaceSmile: faFaceSmile,\n  faSmile: faSmile,\n  faFaceSmileBeam: faFaceSmileBeam,\n  faSmileBeam: faSmileBeam,\n  faFaceSmileWink: faFaceSmileWink,\n  faSmileWink: faSmileWink,\n  faFaceSurprise: faFaceSurprise,\n  faSurprise: faSurprise,\n  faFaceTired: faFaceTired,\n  faTired: faTired,\n  faFan: faFan,\n  faFaucet: faFaucet,\n  faFaucetDrip: faFaucetDrip,\n  faFax: faFax,\n  faFeather: faFeather,\n  faFeatherPointed: faFeatherPointed,\n  faFeatherAlt: faFeatherAlt,\n  faFerry: faFerry,\n  faFile: faFile,\n  faFileArrowDown: faFileArrowDown,\n  faFileDownload: faFileDownload,\n  faFileArrowUp: faFileArrowUp,\n  faFileUpload: faFileUpload,\n  faFileAudio: faFileAudio,\n  faFileCircleCheck: faFileCircleCheck,\n  faFileCircleExclamation: faFileCircleExclamation,\n  faFileCircleMinus: faFileCircleMinus,\n  faFileCirclePlus: faFileCirclePlus,\n  faFileCircleQuestion: faFileCircleQuestion,\n  faFileCircleXmark: faFileCircleXmark,\n  faFileCode: faFileCode,\n  faFileContract: faFileContract,\n  faFileCsv: faFileCsv,\n  faFileExcel: faFileExcel,\n  faFileExport: faFileExport,\n  faArrowRightFromFile: faArrowRightFromFile,\n  faFileImage: faFileImage,\n  faFileImport: faFileImport,\n  faArrowRightToFile: faArrowRightToFile,\n  faFileInvoice: faFileInvoice,\n  faFileInvoiceDollar: faFileInvoiceDollar,\n  faFileLines: faFileLines,\n  faFileAlt: faFileAlt,\n  faFileText: faFileText,\n  faFileMedical: faFileMedical,\n  faFilePdf: faFilePdf,\n  faFilePen: faFilePen,\n  faFileEdit: faFileEdit,\n  faFilePowerpoint: faFilePowerpoint,\n  faFilePrescription: faFilePrescription,\n  faFileShield: faFileShield,\n  faFileSignature: faFileSignature,\n  faFileVideo: faFileVideo,\n  faFileWaveform: faFileWaveform,\n  faFileMedicalAlt: faFileMedicalAlt,\n  faFileWord: faFileWord,\n  faFileZipper: faFileZipper,\n  faFileArchive: faFileArchive,\n  faFill: faFill,\n  faFillDrip: faFillDrip,\n  faFilm: faFilm,\n  faFilter: faFilter,\n  faFilterCircleDollar: faFilterCircleDollar,\n  faFunnelDollar: faFunnelDollar,\n  faFilterCircleXmark: faFilterCircleXmark,\n  faFingerprint: faFingerprint,\n  faFire: faFire,\n  faFireBurner: faFireBurner,\n  faFireExtinguisher: faFireExtinguisher,\n  faFireFlameCurved: faFireFlameCurved,\n  faFireAlt: faFireAlt,\n  faFireFlameSimple: faFireFlameSimple,\n  faBurn: faBurn,\n  faFish: faFish,\n  faFishFins: faFishFins,\n  faFlag: faFlag,\n  faFlagCheckered: faFlagCheckered,\n  faFlagUsa: faFlagUsa,\n  faFlask: faFlask,\n  faFlaskVial: faFlaskVial,\n  faFloppyDisk: faFloppyDisk,\n  faSave: faSave,\n  faFlorinSign: faFlorinSign,\n  faFolder: faFolder,\n  faFolderBlank: faFolderBlank,\n  faFolderClosed: faFolderClosed,\n  faFolderMinus: faFolderMinus,\n  faFolderOpen: faFolderOpen,\n  faFolderPlus: faFolderPlus,\n  faFolderTree: faFolderTree,\n  faFont: faFont,\n  faFontAwesome: faFontAwesome,\n  faFontAwesomeFlag: faFontAwesomeFlag,\n  faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n  faFootball: faFootball,\n  faFootballBall: faFootballBall,\n  faForward: faForward,\n  faForwardFast: faForwardFast,\n  faFastForward: faFastForward,\n  faForwardStep: faForwardStep,\n  faStepForward: faStepForward,\n  faFrancSign: faFrancSign,\n  faFrog: faFrog,\n  faFutbol: faFutbol,\n  faFutbolBall: faFutbolBall,\n  faSoccerBall: faSoccerBall,\n  faG: faG,\n  faGamepad: faGamepad,\n  faGasPump: faGasPump,\n  faGauge: faGauge,\n  faDashboard: faDashboard,\n  faGaugeMed: faGaugeMed,\n  faTachometerAltAverage: faTachometerAltAverage,\n  faGaugeHigh: faGaugeHigh,\n  faTachometerAlt: faTachometerAlt,\n  faTachometerAltFast: faTachometerAltFast,\n  faGaugeSimple: faGaugeSimple,\n  faGaugeSimpleMed: faGaugeSimpleMed,\n  faTachometerAverage: faTachometerAverage,\n  faGaugeSimpleHigh: faGaugeSimpleHigh,\n  faTachometer: faTachometer,\n  faTachometerFast: faTachometerFast,\n  faGavel: faGavel,\n  faLegal: faLegal,\n  faGear: faGear,\n  faCog: faCog,\n  faGears: faGears,\n  faCogs: faCogs,\n  faGem: faGem,\n  faGenderless: faGenderless,\n  faGhost: faGhost,\n  faGift: faGift,\n  faGifts: faGifts,\n  faGlassWater: faGlassWater,\n  faGlassWaterDroplet: faGlassWaterDroplet,\n  faGlasses: faGlasses,\n  faGlobe: faGlobe,\n  faGolfBallTee: faGolfBallTee,\n  faGolfBall: faGolfBall,\n  faGopuram: faGopuram,\n  faGraduationCap: faGraduationCap,\n  faMortarBoard: faMortarBoard,\n  faGreaterThan: faGreaterThan,\n  faGreaterThanEqual: faGreaterThanEqual,\n  faGrip: faGrip,\n  faGripHorizontal: faGripHorizontal,\n  faGripLines: faGripLines,\n  faGripLinesVertical: faGripLinesVertical,\n  faGripVertical: faGripVertical,\n  faGroupArrowsRotate: faGroupArrowsRotate,\n  faGuaraniSign: faGuaraniSign,\n  faGuitar: faGuitar,\n  faGun: faGun,\n  faH: faH,\n  faHammer: faHammer,\n  faHamsa: faHamsa,\n  faHand: faHand,\n  faHandPaper: faHandPaper,\n  faHandBackFist: faHandBackFist,\n  faHandRock: faHandRock,\n  faHandDots: faHandDots,\n  faAllergies: faAllergies,\n  faHandFist: faHandFist,\n  faFistRaised: faFistRaised,\n  faHandHolding: faHandHolding,\n  faHandHoldingDollar: faHandHoldingDollar,\n  faHandHoldingUsd: faHandHoldingUsd,\n  faHandHoldingDroplet: faHandHoldingDroplet,\n  faHandHoldingWater: faHandHoldingWater,\n  faHandHoldingHand: faHandHoldingHand,\n  faHandHoldingHeart: faHandHoldingHeart,\n  faHandHoldingMedical: faHandHoldingMedical,\n  faHandLizard: faHandLizard,\n  faHandMiddleFinger: faHandMiddleFinger,\n  faHandPeace: faHandPeace,\n  faHandPointDown: faHandPointDown,\n  faHandPointLeft: faHandPointLeft,\n  faHandPointRight: faHandPointRight,\n  faHandPointUp: faHandPointUp,\n  faHandPointer: faHandPointer,\n  faHandScissors: faHandScissors,\n  faHandSparkles: faHandSparkles,\n  faHandSpock: faHandSpock,\n  faHandcuffs: faHandcuffs,\n  faHands: faHands,\n  faSignLanguage: faSignLanguage,\n  faSigning: faSigning,\n  faHandsAslInterpreting: faHandsAslInterpreting,\n  faAmericanSignLanguageInterpreting: faAmericanSignLanguageInterpreting,\n  faAslInterpreting: faAslInterpreting,\n  faHandsAmericanSignLanguageInterpreting: faHandsAmericanSignLanguageInterpreting,\n  faHandsBound: faHandsBound,\n  faHandsBubbles: faHandsBubbles,\n  faHandsWash: faHandsWash,\n  faHandsClapping: faHandsClapping,\n  faHandsHolding: faHandsHolding,\n  faHandsHoldingChild: faHandsHoldingChild,\n  faHandsHoldingCircle: faHandsHoldingCircle,\n  faHandsPraying: faHandsPraying,\n  faPrayingHands: faPrayingHands,\n  faHandshake: faHandshake,\n  faHandshakeAngle: faHandshakeAngle,\n  faHandsHelping: faHandsHelping,\n  faHandshakeSimple: faHandshakeSimple,\n  faHandshakeAlt: faHandshakeAlt,\n  faHandshakeSimpleSlash: faHandshakeSimpleSlash,\n  faHandshakeAltSlash: faHandshakeAltSlash,\n  faHandshakeSlash: faHandshakeSlash,\n  faHanukiah: faHanukiah,\n  faHardDrive: faHardDrive,\n  faHdd: faHdd,\n  faHashtag: faHashtag,\n  faHatCowboy: faHatCowboy,\n  faHatCowboySide: faHatCowboySide,\n  faHatWizard: faHatWizard,\n  faHeadSideCough: faHeadSideCough,\n  faHeadSideCoughSlash: faHeadSideCoughSlash,\n  faHeadSideMask: faHeadSideMask,\n  faHeadSideVirus: faHeadSideVirus,\n  faHeading: faHeading,\n  faHeader: faHeader,\n  faHeadphones: faHeadphones,\n  faHeadphonesSimple: faHeadphonesSimple,\n  faHeadphonesAlt: faHeadphonesAlt,\n  faHeadset: faHeadset,\n  faHeart: faHeart,\n  faHeartCircleBolt: faHeartCircleBolt,\n  faHeartCircleCheck: faHeartCircleCheck,\n  faHeartCircleExclamation: faHeartCircleExclamation,\n  faHeartCircleMinus: faHeartCircleMinus,\n  faHeartCirclePlus: faHeartCirclePlus,\n  faHeartCircleXmark: faHeartCircleXmark,\n  faHeartCrack: faHeartCrack,\n  faHeartBroken: faHeartBroken,\n  faHeartPulse: faHeartPulse,\n  faHeartbeat: faHeartbeat,\n  faHelicopter: faHelicopter,\n  faHelicopterSymbol: faHelicopterSymbol,\n  faHelmetSafety: faHelmetSafety,\n  faHardHat: faHardHat,\n  faHatHard: faHatHard,\n  faHelmetUn: faHelmetUn,\n  faHighlighter: faHighlighter,\n  faHillAvalanche: faHillAvalanche,\n  faHillRockslide: faHillRockslide,\n  faHippo: faHippo,\n  faHockeyPuck: faHockeyPuck,\n  faHollyBerry: faHollyBerry,\n  faHorse: faHorse,\n  faHorseHead: faHorseHead,\n  faHospital: faHospital,\n  faHospitalAlt: faHospitalAlt,\n  faHospitalWide: faHospitalWide,\n  faHospitalUser: faHospitalUser,\n  faHotTubPerson: faHotTubPerson,\n  faHotTub: faHotTub,\n  faHotdog: faHotdog,\n  faHotel: faHotel,\n  faHourglass: faHourglass,\n  faHourglass2: faHourglass2,\n  faHourglassHalf: faHourglassHalf,\n  faHourglassEmpty: faHourglassEmpty,\n  faHourglassEnd: faHourglassEnd,\n  faHourglass3: faHourglass3,\n  faHourglassStart: faHourglassStart,\n  faHourglass1: faHourglass1,\n  faHouse: faHouse,\n  faHome: faHome,\n  faHomeAlt: faHomeAlt,\n  faHomeLgAlt: faHomeLgAlt,\n  faHouseChimney: faHouseChimney,\n  faHomeLg: faHomeLg,\n  faHouseChimneyCrack: faHouseChimneyCrack,\n  faHouseDamage: faHouseDamage,\n  faHouseChimneyMedical: faHouseChimneyMedical,\n  faClinicMedical: faClinicMedical,\n  faHouseChimneyUser: faHouseChimneyUser,\n  faHouseChimneyWindow: faHouseChimneyWindow,\n  faHouseCircleCheck: faHouseCircleCheck,\n  faHouseCircleExclamation: faHouseCircleExclamation,\n  faHouseCircleXmark: faHouseCircleXmark,\n  faHouseCrack: faHouseCrack,\n  faHouseFire: faHouseFire,\n  faHouseFlag: faHouseFlag,\n  faHouseFloodWater: faHouseFloodWater,\n  faHouseFloodWaterCircleArrowRight: faHouseFloodWaterCircleArrowRight,\n  faHouseLaptop: faHouseLaptop,\n  faLaptopHouse: faLaptopHouse,\n  faHouseLock: faHouseLock,\n  faHouseMedical: faHouseMedical,\n  faHouseMedicalCircleCheck: faHouseMedicalCircleCheck,\n  faHouseMedicalCircleExclamation: faHouseMedicalCircleExclamation,\n  faHouseMedicalCircleXmark: faHouseMedicalCircleXmark,\n  faHouseMedicalFlag: faHouseMedicalFlag,\n  faHouseSignal: faHouseSignal,\n  faHouseTsunami: faHouseTsunami,\n  faHouseUser: faHouseUser,\n  faHomeUser: faHomeUser,\n  faHryvniaSign: faHryvniaSign,\n  faHryvnia: faHryvnia,\n  faHurricane: faHurricane,\n  faI: faI,\n  faICursor: faICursor,\n  faIceCream: faIceCream,\n  faIcicles: faIcicles,\n  faIcons: faIcons,\n  faHeartMusicCameraBolt: faHeartMusicCameraBolt,\n  faIdBadge: faIdBadge,\n  faIdCard: faIdCard,\n  faDriversLicense: faDriversLicense,\n  faIdCardClip: faIdCardClip,\n  faIdCardAlt: faIdCardAlt,\n  faIgloo: faIgloo,\n  faImage: faImage,\n  faImagePortrait: faImagePortrait,\n  faPortrait: faPortrait,\n  faImages: faImages,\n  faInbox: faInbox,\n  faIndent: faIndent,\n  faIndianRupeeSign: faIndianRupeeSign,\n  faIndianRupee: faIndianRupee,\n  faInr: faInr,\n  faIndustry: faIndustry,\n  faInfinity: faInfinity,\n  faInfo: faInfo,\n  faItalic: faItalic,\n  faJ: faJ,\n  faJar: faJar,\n  faJarWheat: faJarWheat,\n  faJedi: faJedi,\n  faJetFighter: faJetFighter,\n  faFighterJet: faFighterJet,\n  faJetFighterUp: faJetFighterUp,\n  faJoint: faJoint,\n  faJugDetergent: faJugDetergent,\n  faK: faK,\n  faKaaba: faKaaba,\n  faKey: faKey,\n  faKeyboard: faKeyboard,\n  faKhanda: faKhanda,\n  faKipSign: faKipSign,\n  faKitMedical: faKitMedical,\n  faFirstAid: faFirstAid,\n  faKitchenSet: faKitchenSet,\n  faKiwiBird: faKiwiBird,\n  faL: faL,\n  faLandMineOn: faLandMineOn,\n  faLandmark: faLandmark,\n  faLandmarkDome: faLandmarkDome,\n  faLandmarkAlt: faLandmarkAlt,\n  faLandmarkFlag: faLandmarkFlag,\n  faLanguage: faLanguage,\n  faLaptop: faLaptop,\n  faLaptopCode: faLaptopCode,\n  faLaptopFile: faLaptopFile,\n  faLaptopMedical: faLaptopMedical,\n  faLariSign: faLariSign,\n  faLayerGroup: faLayerGroup,\n  faLeaf: faLeaf,\n  faLeftLong: faLeftLong,\n  faLongArrowAltLeft: faLongArrowAltLeft,\n  faLeftRight: faLeftRight,\n  faArrowsAltH: faArrowsAltH,\n  faLemon: faLemon,\n  faLessThan: faLessThan,\n  faLessThanEqual: faLessThanEqual,\n  faLifeRing: faLifeRing,\n  faLightbulb: faLightbulb,\n  faLinesLeaning: faLinesLeaning,\n  faLink: faLink,\n  faChain: faChain,\n  faLinkSlash: faLinkSlash,\n  faChainBroken: faChainBroken,\n  faChainSlash: faChainSlash,\n  faUnlink: faUnlink,\n  faLiraSign: faLiraSign,\n  faList: faList,\n  faListSquares: faListSquares,\n  faListCheck: faListCheck,\n  faTasks: faTasks,\n  faListOl: faListOl,\n  faList12: faList12,\n  faListNumeric: faListNumeric,\n  faListUl: faListUl,\n  faListDots: faListDots,\n  faLitecoinSign: faLitecoinSign,\n  faLocationArrow: faLocationArrow,\n  faLocationCrosshairs: faLocationCrosshairs,\n  faLocation: faLocation,\n  faLocationDot: faLocationDot,\n  faMapMarkerAlt: faMapMarkerAlt,\n  faLocationPin: faLocationPin,\n  faMapMarker: faMapMarker,\n  faLocationPinLock: faLocationPinLock,\n  faLock: faLock,\n  faLockOpen: faLockOpen,\n  faLocust: faLocust,\n  faLungs: faLungs,\n  faLungsVirus: faLungsVirus,\n  faM: faM,\n  faMagnet: faMagnet,\n  faMagnifyingGlass: faMagnifyingGlass,\n  faSearch: faSearch,\n  faMagnifyingGlassArrowRight: faMagnifyingGlassArrowRight,\n  faMagnifyingGlassChart: faMagnifyingGlassChart,\n  faMagnifyingGlassDollar: faMagnifyingGlassDollar,\n  faSearchDollar: faSearchDollar,\n  faMagnifyingGlassLocation: faMagnifyingGlassLocation,\n  faSearchLocation: faSearchLocation,\n  faMagnifyingGlassMinus: faMagnifyingGlassMinus,\n  faSearchMinus: faSearchMinus,\n  faMagnifyingGlassPlus: faMagnifyingGlassPlus,\n  faSearchPlus: faSearchPlus,\n  faManatSign: faManatSign,\n  faMap: faMap,\n  faMapLocation: faMapLocation,\n  faMapMarked: faMapMarked,\n  faMapLocationDot: faMapLocationDot,\n  faMapMarkedAlt: faMapMarkedAlt,\n  faMapPin: faMapPin,\n  faMarker: faMarker,\n  faMars: faMars,\n  faMarsAndVenus: faMarsAndVenus,\n  faMarsAndVenusBurst: faMarsAndVenusBurst,\n  faMarsDouble: faMarsDouble,\n  faMarsStroke: faMarsStroke,\n  faMarsStrokeRight: faMarsStrokeRight,\n  faMarsStrokeH: faMarsStrokeH,\n  faMarsStrokeUp: faMarsStrokeUp,\n  faMarsStrokeV: faMarsStrokeV,\n  faMartiniGlass: faMartiniGlass,\n  faGlassMartiniAlt: faGlassMartiniAlt,\n  faMartiniGlassCitrus: faMartiniGlassCitrus,\n  faCocktail: faCocktail,\n  faMartiniGlassEmpty: faMartiniGlassEmpty,\n  faGlassMartini: faGlassMartini,\n  faMask: faMask,\n  faMaskFace: faMaskFace,\n  faMaskVentilator: faMaskVentilator,\n  faMasksTheater: faMasksTheater,\n  faTheaterMasks: faTheaterMasks,\n  faMattressPillow: faMattressPillow,\n  faMaximize: faMaximize,\n  faExpandArrowsAlt: faExpandArrowsAlt,\n  faMedal: faMedal,\n  faMemory: faMemory,\n  faMenorah: faMenorah,\n  faMercury: faMercury,\n  faMessage: faMessage,\n  faCommentAlt: faCommentAlt,\n  faMeteor: faMeteor,\n  faMicrochip: faMicrochip,\n  faMicrophone: faMicrophone,\n  faMicrophoneLines: faMicrophoneLines,\n  faMicrophoneAlt: faMicrophoneAlt,\n  faMicrophoneLinesSlash: faMicrophoneLinesSlash,\n  faMicrophoneAltSlash: faMicrophoneAltSlash,\n  faMicrophoneSlash: faMicrophoneSlash,\n  faMicroscope: faMicroscope,\n  faMillSign: faMillSign,\n  faMinimize: faMinimize,\n  faCompressArrowsAlt: faCompressArrowsAlt,\n  faMinus: faMinus,\n  faSubtract: faSubtract,\n  faMitten: faMitten,\n  faMobile: faMobile,\n  faMobileAndroid: faMobileAndroid,\n  faMobilePhone: faMobilePhone,\n  faMobileButton: faMobileButton,\n  faMobileRetro: faMobileRetro,\n  faMobileScreen: faMobileScreen,\n  faMobileAndroidAlt: faMobileAndroidAlt,\n  faMobileScreenButton: faMobileScreenButton,\n  faMobileAlt: faMobileAlt,\n  faMoneyBill: faMoneyBill,\n  faMoneyBill1: faMoneyBill1,\n  faMoneyBillAlt: faMoneyBillAlt,\n  faMoneyBill1Wave: faMoneyBill1Wave,\n  faMoneyBillWaveAlt: faMoneyBillWaveAlt,\n  faMoneyBillTransfer: faMoneyBillTransfer,\n  faMoneyBillTrendUp: faMoneyBillTrendUp,\n  faMoneyBillWave: faMoneyBillWave,\n  faMoneyBillWheat: faMoneyBillWheat,\n  faMoneyBills: faMoneyBills,\n  faMoneyCheck: faMoneyCheck,\n  faMoneyCheckDollar: faMoneyCheckDollar,\n  faMoneyCheckAlt: faMoneyCheckAlt,\n  faMonument: faMonument,\n  faMoon: faMoon,\n  faMortarPestle: faMortarPestle,\n  faMosque: faMosque,\n  faMosquito: faMosquito,\n  faMosquitoNet: faMosquitoNet,\n  faMotorcycle: faMotorcycle,\n  faMound: faMound,\n  faMountain: faMountain,\n  faMountainCity: faMountainCity,\n  faMountainSun: faMountainSun,\n  faMugHot: faMugHot,\n  faMugSaucer: faMugSaucer,\n  faCoffee: faCoffee,\n  faMusic: faMusic,\n  faN: faN,\n  faNairaSign: faNairaSign,\n  faNetworkWired: faNetworkWired,\n  faNeuter: faNeuter,\n  faNewspaper: faNewspaper,\n  faNotEqual: faNotEqual,\n  faNoteSticky: faNoteSticky,\n  faStickyNote: faStickyNote,\n  faNotesMedical: faNotesMedical,\n  faO: faO,\n  faObjectGroup: faObjectGroup,\n  faObjectUngroup: faObjectUngroup,\n  faOilCan: faOilCan,\n  faOilWell: faOilWell,\n  faOm: faOm,\n  faOtter: faOtter,\n  faOutdent: faOutdent,\n  faDedent: faDedent,\n  faP: faP,\n  faPager: faPager,\n  faPaintRoller: faPaintRoller,\n  faPaintbrush: faPaintbrush,\n  faPaintBrush: faPaintBrush,\n  faPalette: faPalette,\n  faPallet: faPallet,\n  faPanorama: faPanorama,\n  faPaperPlane: faPaperPlane,\n  faPaperclip: faPaperclip,\n  faParachuteBox: faParachuteBox,\n  faParagraph: faParagraph,\n  faPassport: faPassport,\n  faPaste: faPaste,\n  faFileClipboard: faFileClipboard,\n  faPause: faPause,\n  faPaw: faPaw,\n  faPeace: faPeace,\n  faPen: faPen,\n  faPenClip: faPenClip,\n  faPenAlt: faPenAlt,\n  faPenFancy: faPenFancy,\n  faPenNib: faPenNib,\n  faPenRuler: faPenRuler,\n  faPencilRuler: faPencilRuler,\n  faPenToSquare: faPenToSquare,\n  faEdit: faEdit,\n  faPencil: faPencil,\n  faPencilAlt: faPencilAlt,\n  faPeopleArrowsLeftRight: faPeopleArrowsLeftRight,\n  faPeopleArrows: faPeopleArrows,\n  faPeopleCarryBox: faPeopleCarryBox,\n  faPeopleCarry: faPeopleCarry,\n  faPeopleGroup: faPeopleGroup,\n  faPeopleLine: faPeopleLine,\n  faPeoplePulling: faPeoplePulling,\n  faPeopleRobbery: faPeopleRobbery,\n  faPeopleRoof: faPeopleRoof,\n  faPepperHot: faPepperHot,\n  faPercent: faPercent,\n  faPercentage: faPercentage,\n  faPerson: faPerson,\n  faMale: faMale,\n  faPersonArrowDownToLine: faPersonArrowDownToLine,\n  faPersonArrowUpFromLine: faPersonArrowUpFromLine,\n  faPersonBiking: faPersonBiking,\n  faBiking: faBiking,\n  faPersonBooth: faPersonBooth,\n  faPersonBreastfeeding: faPersonBreastfeeding,\n  faPersonBurst: faPersonBurst,\n  faPersonCane: faPersonCane,\n  faPersonChalkboard: faPersonChalkboard,\n  faPersonCircleCheck: faPersonCircleCheck,\n  faPersonCircleExclamation: faPersonCircleExclamation,\n  faPersonCircleMinus: faPersonCircleMinus,\n  faPersonCirclePlus: faPersonCirclePlus,\n  faPersonCircleQuestion: faPersonCircleQuestion,\n  faPersonCircleXmark: faPersonCircleXmark,\n  faPersonDigging: faPersonDigging,\n  faDigging: faDigging,\n  faPersonDotsFromLine: faPersonDotsFromLine,\n  faDiagnoses: faDiagnoses,\n  faPersonDress: faPersonDress,\n  faFemale: faFemale,\n  faPersonDressBurst: faPersonDressBurst,\n  faPersonDrowning: faPersonDrowning,\n  faPersonFalling: faPersonFalling,\n  faPersonFallingBurst: faPersonFallingBurst,\n  faPersonHalfDress: faPersonHalfDress,\n  faPersonHarassing: faPersonHarassing,\n  faPersonHiking: faPersonHiking,\n  faHiking: faHiking,\n  faPersonMilitaryPointing: faPersonMilitaryPointing,\n  faPersonMilitaryRifle: faPersonMilitaryRifle,\n  faPersonMilitaryToPerson: faPersonMilitaryToPerson,\n  faPersonPraying: faPersonPraying,\n  faPray: faPray,\n  faPersonPregnant: faPersonPregnant,\n  faPersonRays: faPersonRays,\n  faPersonRifle: faPersonRifle,\n  faPersonRunning: faPersonRunning,\n  faRunning: faRunning,\n  faPersonShelter: faPersonShelter,\n  faPersonSkating: faPersonSkating,\n  faSkating: faSkating,\n  faPersonSkiing: faPersonSkiing,\n  faSkiing: faSkiing,\n  faPersonSkiingNordic: faPersonSkiingNordic,\n  faSkiingNordic: faSkiingNordic,\n  faPersonSnowboarding: faPersonSnowboarding,\n  faSnowboarding: faSnowboarding,\n  faPersonSwimming: faPersonSwimming,\n  faSwimmer: faSwimmer,\n  faPersonThroughWindow: faPersonThroughWindow,\n  faPersonWalking: faPersonWalking,\n  faWalking: faWalking,\n  faPersonWalkingArrowLoopLeft: faPersonWalkingArrowLoopLeft,\n  faPersonWalkingArrowRight: faPersonWalkingArrowRight,\n  faPersonWalkingDashedLineArrowRight: faPersonWalkingDashedLineArrowRight,\n  faPersonWalkingLuggage: faPersonWalkingLuggage,\n  faPersonWalkingWithCane: faPersonWalkingWithCane,\n  faBlind: faBlind,\n  faPesetaSign: faPesetaSign,\n  faPesoSign: faPesoSign,\n  faPhone: faPhone,\n  faPhoneFlip: faPhoneFlip,\n  faPhoneAlt: faPhoneAlt,\n  faPhoneSlash: faPhoneSlash,\n  faPhoneVolume: faPhoneVolume,\n  faVolumeControlPhone: faVolumeControlPhone,\n  faPhotoFilm: faPhotoFilm,\n  faPhotoVideo: faPhotoVideo,\n  faPiggyBank: faPiggyBank,\n  faPills: faPills,\n  faPizzaSlice: faPizzaSlice,\n  faPlaceOfWorship: faPlaceOfWorship,\n  faPlane: faPlane,\n  faPlaneArrival: faPlaneArrival,\n  faPlaneCircleCheck: faPlaneCircleCheck,\n  faPlaneCircleExclamation: faPlaneCircleExclamation,\n  faPlaneCircleXmark: faPlaneCircleXmark,\n  faPlaneDeparture: faPlaneDeparture,\n  faPlaneLock: faPlaneLock,\n  faPlaneSlash: faPlaneSlash,\n  faPlaneUp: faPlaneUp,\n  faPlantWilt: faPlantWilt,\n  faPlateWheat: faPlateWheat,\n  faPlay: faPlay,\n  faPlug: faPlug,\n  faPlugCircleBolt: faPlugCircleBolt,\n  faPlugCircleCheck: faPlugCircleCheck,\n  faPlugCircleExclamation: faPlugCircleExclamation,\n  faPlugCircleMinus: faPlugCircleMinus,\n  faPlugCirclePlus: faPlugCirclePlus,\n  faPlugCircleXmark: faPlugCircleXmark,\n  faPlus: faPlus,\n  faAdd: faAdd,\n  faPlusMinus: faPlusMinus,\n  faPodcast: faPodcast,\n  faPoo: faPoo,\n  faPooStorm: faPooStorm,\n  faPooBolt: faPooBolt,\n  faPoop: faPoop,\n  faPowerOff: faPowerOff,\n  faPrescription: faPrescription,\n  faPrescriptionBottle: faPrescriptionBottle,\n  faPrescriptionBottleMedical: faPrescriptionBottleMedical,\n  faPrescriptionBottleAlt: faPrescriptionBottleAlt,\n  faPrint: faPrint,\n  faPumpMedical: faPumpMedical,\n  faPumpSoap: faPumpSoap,\n  faPuzzlePiece: faPuzzlePiece,\n  faQ: faQ,\n  faQrcode: faQrcode,\n  faQuestion: faQuestion,\n  faQuoteLeft: faQuoteLeft,\n  faQuoteLeftAlt: faQuoteLeftAlt,\n  faQuoteRight: faQuoteRight,\n  faQuoteRightAlt: faQuoteRightAlt,\n  faR: faR,\n  faRadiation: faRadiation,\n  faRadio: faRadio,\n  faRainbow: faRainbow,\n  faRankingStar: faRankingStar,\n  faReceipt: faReceipt,\n  faRecordVinyl: faRecordVinyl,\n  faRectangleAd: faRectangleAd,\n  faAd: faAd,\n  faRectangleList: faRectangleList,\n  faListAlt: faListAlt,\n  faRectangleXmark: faRectangleXmark,\n  faRectangleTimes: faRectangleTimes,\n  faTimesRectangle: faTimesRectangle,\n  faWindowClose: faWindowClose,\n  faRecycle: faRecycle,\n  faRegistered: faRegistered,\n  faRepeat: faRepeat,\n  faReply: faReply,\n  faMailReply: faMailReply,\n  faReplyAll: faReplyAll,\n  faMailReplyAll: faMailReplyAll,\n  faRepublican: faRepublican,\n  faRestroom: faRestroom,\n  faRetweet: faRetweet,\n  faRibbon: faRibbon,\n  faRightFromBracket: faRightFromBracket,\n  faSignOutAlt: faSignOutAlt,\n  faRightLeft: faRightLeft,\n  faExchangeAlt: faExchangeAlt,\n  faRightLong: faRightLong,\n  faLongArrowAltRight: faLongArrowAltRight,\n  faRightToBracket: faRightToBracket,\n  faSignInAlt: faSignInAlt,\n  faRing: faRing,\n  faRoad: faRoad,\n  faRoadBarrier: faRoadBarrier,\n  faRoadBridge: faRoadBridge,\n  faRoadCircleCheck: faRoadCircleCheck,\n  faRoadCircleExclamation: faRoadCircleExclamation,\n  faRoadCircleXmark: faRoadCircleXmark,\n  faRoadLock: faRoadLock,\n  faRoadSpikes: faRoadSpikes,\n  faRobot: faRobot,\n  faRocket: faRocket,\n  faRotate: faRotate,\n  faSyncAlt: faSyncAlt,\n  faRotateLeft: faRotateLeft,\n  faRotateBack: faRotateBack,\n  faRotateBackward: faRotateBackward,\n  faUndoAlt: faUndoAlt,\n  faRotateRight: faRotateRight,\n  faRedoAlt: faRedoAlt,\n  faRotateForward: faRotateForward,\n  faRoute: faRoute,\n  faRss: faRss,\n  faFeed: faFeed,\n  faRubleSign: faRubleSign,\n  faRouble: faRouble,\n  faRub: faRub,\n  faRuble: faRuble,\n  faRug: faRug,\n  faRuler: faRuler,\n  faRulerCombined: faRulerCombined,\n  faRulerHorizontal: faRulerHorizontal,\n  faRulerVertical: faRulerVertical,\n  faRupeeSign: faRupeeSign,\n  faRupee: faRupee,\n  faRupiahSign: faRupiahSign,\n  faS: faS,\n  faSackDollar: faSackDollar,\n  faSackXmark: faSackXmark,\n  faSailboat: faSailboat,\n  faSatellite: faSatellite,\n  faSatelliteDish: faSatelliteDish,\n  faScaleBalanced: faScaleBalanced,\n  faBalanceScale: faBalanceScale,\n  faScaleUnbalanced: faScaleUnbalanced,\n  faBalanceScaleLeft: faBalanceScaleLeft,\n  faScaleUnbalancedFlip: faScaleUnbalancedFlip,\n  faBalanceScaleRight: faBalanceScaleRight,\n  faSchool: faSchool,\n  faSchoolCircleCheck: faSchoolCircleCheck,\n  faSchoolCircleExclamation: faSchoolCircleExclamation,\n  faSchoolCircleXmark: faSchoolCircleXmark,\n  faSchoolFlag: faSchoolFlag,\n  faSchoolLock: faSchoolLock,\n  faScissors: faScissors,\n  faCut: faCut,\n  faScrewdriver: faScrewdriver,\n  faScrewdriverWrench: faScrewdriverWrench,\n  faTools: faTools,\n  faScroll: faScroll,\n  faScrollTorah: faScrollTorah,\n  faTorah: faTorah,\n  faSdCard: faSdCard,\n  faSection: faSection,\n  faSeedling: faSeedling,\n  faSprout: faSprout,\n  faServer: faServer,\n  faShapes: faShapes,\n  faTriangleCircleSquare: faTriangleCircleSquare,\n  faShare: faShare,\n  faArrowTurnRight: faArrowTurnRight,\n  faMailForward: faMailForward,\n  faShareFromSquare: faShareFromSquare,\n  faShareSquare: faShareSquare,\n  faShareNodes: faShareNodes,\n  faShareAlt: faShareAlt,\n  faSheetPlastic: faSheetPlastic,\n  faShekelSign: faShekelSign,\n  faIls: faIls,\n  faShekel: faShekel,\n  faSheqel: faSheqel,\n  faSheqelSign: faSheqelSign,\n  faShield: faShield,\n  faShieldBlank: faShieldBlank,\n  faShieldCat: faShieldCat,\n  faShieldDog: faShieldDog,\n  faShieldHalved: faShieldHalved,\n  faShieldAlt: faShieldAlt,\n  faShieldHeart: faShieldHeart,\n  faShieldVirus: faShieldVirus,\n  faShip: faShip,\n  faShirt: faShirt,\n  faTShirt: faTShirt,\n  faTshirt: faTshirt,\n  faShoePrints: faShoePrints,\n  faShop: faShop,\n  faStoreAlt: faStoreAlt,\n  faShopLock: faShopLock,\n  faShopSlash: faShopSlash,\n  faStoreAltSlash: faStoreAltSlash,\n  faShower: faShower,\n  faShrimp: faShrimp,\n  faShuffle: faShuffle,\n  faRandom: faRandom,\n  faShuttleSpace: faShuttleSpace,\n  faSpaceShuttle: faSpaceShuttle,\n  faSignHanging: faSignHanging,\n  faSign: faSign,\n  faSignal: faSignal,\n  faSignal5: faSignal5,\n  faSignalPerfect: faSignalPerfect,\n  faSignature: faSignature,\n  faSignsPost: faSignsPost,\n  faMapSigns: faMapSigns,\n  faSimCard: faSimCard,\n  faSink: faSink,\n  faSitemap: faSitemap,\n  faSkull: faSkull,\n  faSkullCrossbones: faSkullCrossbones,\n  faSlash: faSlash,\n  faSleigh: faSleigh,\n  faSliders: faSliders,\n  faSlidersH: faSlidersH,\n  faSmog: faSmog,\n  faSmoking: faSmoking,\n  faSnowflake: faSnowflake,\n  faSnowman: faSnowman,\n  faSnowplow: faSnowplow,\n  faSoap: faSoap,\n  faSocks: faSocks,\n  faSolarPanel: faSolarPanel,\n  faSort: faSort,\n  faUnsorted: faUnsorted,\n  faSortDown: faSortDown,\n  faSortDesc: faSortDesc,\n  faSortUp: faSortUp,\n  faSortAsc: faSortAsc,\n  faSpa: faSpa,\n  faSpaghettiMonsterFlying: faSpaghettiMonsterFlying,\n  faPastafarianism: faPastafarianism,\n  faSpellCheck: faSpellCheck,\n  faSpider: faSpider,\n  faSpinner: faSpinner,\n  faSplotch: faSplotch,\n  faSpoon: faSpoon,\n  faUtensilSpoon: faUtensilSpoon,\n  faSprayCan: faSprayCan,\n  faSprayCanSparkles: faSprayCanSparkles,\n  faAirFreshener: faAirFreshener,\n  faSquare: faSquare,\n  faSquareArrowUpRight: faSquareArrowUpRight,\n  faExternalLinkSquare: faExternalLinkSquare,\n  faSquareCaretDown: faSquareCaretDown,\n  faCaretSquareDown: faCaretSquareDown,\n  faSquareCaretLeft: faSquareCaretLeft,\n  faCaretSquareLeft: faCaretSquareLeft,\n  faSquareCaretRight: faSquareCaretRight,\n  faCaretSquareRight: faCaretSquareRight,\n  faSquareCaretUp: faSquareCaretUp,\n  faCaretSquareUp: faCaretSquareUp,\n  faSquareCheck: faSquareCheck,\n  faCheckSquare: faCheckSquare,\n  faSquareEnvelope: faSquareEnvelope,\n  faEnvelopeSquare: faEnvelopeSquare,\n  faSquareFull: faSquareFull,\n  faSquareH: faSquareH,\n  faHSquare: faHSquare,\n  faSquareMinus: faSquareMinus,\n  faMinusSquare: faMinusSquare,\n  faSquareNfi: faSquareNfi,\n  faSquareParking: faSquareParking,\n  faParking: faParking,\n  faSquarePen: faSquarePen,\n  faPenSquare: faPenSquare,\n  faPencilSquare: faPencilSquare,\n  faSquarePersonConfined: faSquarePersonConfined,\n  faSquarePhone: faSquarePhone,\n  faPhoneSquare: faPhoneSquare,\n  faSquarePhoneFlip: faSquarePhoneFlip,\n  faPhoneSquareAlt: faPhoneSquareAlt,\n  faSquarePlus: faSquarePlus,\n  faPlusSquare: faPlusSquare,\n  faSquarePollHorizontal: faSquarePollHorizontal,\n  faPollH: faPollH,\n  faSquarePollVertical: faSquarePollVertical,\n  faPoll: faPoll,\n  faSquareRootVariable: faSquareRootVariable,\n  faSquareRootAlt: faSquareRootAlt,\n  faSquareRss: faSquareRss,\n  faRssSquare: faRssSquare,\n  faSquareShareNodes: faSquareShareNodes,\n  faShareAltSquare: faShareAltSquare,\n  faSquareUpRight: faSquareUpRight,\n  faExternalLinkSquareAlt: faExternalLinkSquareAlt,\n  faSquareVirus: faSquareVirus,\n  faSquareXmark: faSquareXmark,\n  faTimesSquare: faTimesSquare,\n  faXmarkSquare: faXmarkSquare,\n  faStaffAesculapius: faStaffAesculapius,\n  faRodAsclepius: faRodAsclepius,\n  faRodSnake: faRodSnake,\n  faStaffSnake: faStaffSnake,\n  faStairs: faStairs,\n  faStamp: faStamp,\n  faStar: faStar,\n  faStarAndCrescent: faStarAndCrescent,\n  faStarHalf: faStarHalf,\n  faStarHalfStroke: faStarHalfStroke,\n  faStarHalfAlt: faStarHalfAlt,\n  faStarOfDavid: faStarOfDavid,\n  faStarOfLife: faStarOfLife,\n  faSterlingSign: faSterlingSign,\n  faGbp: faGbp,\n  faPoundSign: faPoundSign,\n  faStethoscope: faStethoscope,\n  faStop: faStop,\n  faStopwatch: faStopwatch,\n  faStopwatch20: faStopwatch20,\n  faStore: faStore,\n  faStoreSlash: faStoreSlash,\n  faStreetView: faStreetView,\n  faStrikethrough: faStrikethrough,\n  faStroopwafel: faStroopwafel,\n  faSubscript: faSubscript,\n  faSuitcase: faSuitcase,\n  faSuitcaseMedical: faSuitcaseMedical,\n  faMedkit: faMedkit,\n  faSuitcaseRolling: faSuitcaseRolling,\n  faSun: faSun,\n  faSunPlantWilt: faSunPlantWilt,\n  faSuperscript: faSuperscript,\n  faSwatchbook: faSwatchbook,\n  faSynagogue: faSynagogue,\n  faSyringe: faSyringe,\n  faT: faT,\n  faTable: faTable,\n  faTableCells: faTableCells,\n  faTh: faTh,\n  faTableCellsLarge: faTableCellsLarge,\n  faThLarge: faThLarge,\n  faTableColumns: faTableColumns,\n  faColumns: faColumns,\n  faTableList: faTableList,\n  faThList: faThList,\n  faTableTennisPaddleBall: faTableTennisPaddleBall,\n  faPingPongPaddleBall: faPingPongPaddleBall,\n  faTableTennis: faTableTennis,\n  faTablet: faTablet,\n  faTabletAndroid: faTabletAndroid,\n  faTabletButton: faTabletButton,\n  faTabletScreenButton: faTabletScreenButton,\n  faTabletAlt: faTabletAlt,\n  faTablets: faTablets,\n  faTachographDigital: faTachographDigital,\n  faDigitalTachograph: faDigitalTachograph,\n  faTag: faTag,\n  faTags: faTags,\n  faTape: faTape,\n  faTarp: faTarp,\n  faTarpDroplet: faTarpDroplet,\n  faTaxi: faTaxi,\n  faCab: faCab,\n  faTeeth: faTeeth,\n  faTeethOpen: faTeethOpen,\n  faTemperatureArrowDown: faTemperatureArrowDown,\n  faTemperatureDown: faTemperatureDown,\n  faTemperatureArrowUp: faTemperatureArrowUp,\n  faTemperatureUp: faTemperatureUp,\n  faTemperatureEmpty: faTemperatureEmpty,\n  faTemperature0: faTemperature0,\n  faThermometer0: faThermometer0,\n  faThermometerEmpty: faThermometerEmpty,\n  faTemperatureFull: faTemperatureFull,\n  faTemperature4: faTemperature4,\n  faThermometer4: faThermometer4,\n  faThermometerFull: faThermometerFull,\n  faTemperatureHalf: faTemperatureHalf,\n  faTemperature2: faTemperature2,\n  faThermometer2: faThermometer2,\n  faThermometerHalf: faThermometerHalf,\n  faTemperatureHigh: faTemperatureHigh,\n  faTemperatureLow: faTemperatureLow,\n  faTemperatureQuarter: faTemperatureQuarter,\n  faTemperature1: faTemperature1,\n  faThermometer1: faThermometer1,\n  faThermometerQuarter: faThermometerQuarter,\n  faTemperatureThreeQuarters: faTemperatureThreeQuarters,\n  faTemperature3: faTemperature3,\n  faThermometer3: faThermometer3,\n  faThermometerThreeQuarters: faThermometerThreeQuarters,\n  faTengeSign: faTengeSign,\n  faTenge: faTenge,\n  faTent: faTent,\n  faTentArrowDownToLine: faTentArrowDownToLine,\n  faTentArrowLeftRight: faTentArrowLeftRight,\n  faTentArrowTurnLeft: faTentArrowTurnLeft,\n  faTentArrowsDown: faTentArrowsDown,\n  faTents: faTents,\n  faTerminal: faTerminal,\n  faTextHeight: faTextHeight,\n  faTextSlash: faTextSlash,\n  faRemoveFormat: faRemoveFormat,\n  faTextWidth: faTextWidth,\n  faThermometer: faThermometer,\n  faThumbsDown: faThumbsDown,\n  faThumbsUp: faThumbsUp,\n  faThumbtack: faThumbtack,\n  faThumbTack: faThumbTack,\n  faTicket: faTicket,\n  faTicketSimple: faTicketSimple,\n  faTicketAlt: faTicketAlt,\n  faTimeline: faTimeline,\n  faToggleOff: faToggleOff,\n  faToggleOn: faToggleOn,\n  faToilet: faToilet,\n  faToiletPaper: faToiletPaper,\n  faToiletPaperSlash: faToiletPaperSlash,\n  faToiletPortable: faToiletPortable,\n  faToiletsPortable: faToiletsPortable,\n  faToolbox: faToolbox,\n  faTooth: faTooth,\n  faToriiGate: faToriiGate,\n  faTornado: faTornado,\n  faTowerBroadcast: faTowerBroadcast,\n  faBroadcastTower: faBroadcastTower,\n  faTowerCell: faTowerCell,\n  faTowerObservation: faTowerObservation,\n  faTractor: faTractor,\n  faTrademark: faTrademark,\n  faTrafficLight: faTrafficLight,\n  faTrailer: faTrailer,\n  faTrain: faTrain,\n  faTrainSubway: faTrainSubway,\n  faSubway: faSubway,\n  faTrainTram: faTrainTram,\n  faTram: faTram,\n  faTransgender: faTransgender,\n  faTransgenderAlt: faTransgenderAlt,\n  faTrash: faTrash,\n  faTrashArrowUp: faTrashArrowUp,\n  faTrashRestore: faTrashRestore,\n  faTrashCan: faTrashCan,\n  faTrashAlt: faTrashAlt,\n  faTrashCanArrowUp: faTrashCanArrowUp,\n  faTrashRestoreAlt: faTrashRestoreAlt,\n  faTree: faTree,\n  faTreeCity: faTreeCity,\n  faTriangleExclamation: faTriangleExclamation,\n  faExclamationTriangle: faExclamationTriangle,\n  faWarning: faWarning,\n  faTrophy: faTrophy,\n  faTrowel: faTrowel,\n  faTrowelBricks: faTrowelBricks,\n  faTruck: faTruck,\n  faTruckArrowRight: faTruckArrowRight,\n  faTruckDroplet: faTruckDroplet,\n  faTruckFast: faTruckFast,\n  faShippingFast: faShippingFast,\n  faTruckField: faTruckField,\n  faTruckFieldUn: faTruckFieldUn,\n  faTruckFront: faTruckFront,\n  faTruckMedical: faTruckMedical,\n  faAmbulance: faAmbulance,\n  faTruckMonster: faTruckMonster,\n  faTruckMoving: faTruckMoving,\n  faTruckPickup: faTruckPickup,\n  faTruckPlane: faTruckPlane,\n  faTruckRampBox: faTruckRampBox,\n  faTruckLoading: faTruckLoading,\n  faTty: faTty,\n  faTeletype: faTeletype,\n  faTurkishLiraSign: faTurkishLiraSign,\n  faTry: faTry,\n  faTurkishLira: faTurkishLira,\n  faTurnDown: faTurnDown,\n  faLevelDownAlt: faLevelDownAlt,\n  faTurnUp: faTurnUp,\n  faLevelUpAlt: faLevelUpAlt,\n  faTv: faTv,\n  faTelevision: faTelevision,\n  faTvAlt: faTvAlt,\n  faU: faU,\n  faUmbrella: faUmbrella,\n  faUmbrellaBeach: faUmbrellaBeach,\n  faUnderline: faUnderline,\n  faUniversalAccess: faUniversalAccess,\n  faUnlock: faUnlock,\n  faUnlockKeyhole: faUnlockKeyhole,\n  faUnlockAlt: faUnlockAlt,\n  faUpDown: faUpDown,\n  faArrowsAltV: faArrowsAltV,\n  faUpDownLeftRight: faUpDownLeftRight,\n  faArrowsAlt: faArrowsAlt,\n  faUpLong: faUpLong,\n  faLongArrowAltUp: faLongArrowAltUp,\n  faUpRightAndDownLeftFromCenter: faUpRightAndDownLeftFromCenter,\n  faExpandAlt: faExpandAlt,\n  faUpRightFromSquare: faUpRightFromSquare,\n  faExternalLinkAlt: faExternalLinkAlt,\n  faUpload: faUpload,\n  faUser: faUser,\n  faUserAstronaut: faUserAstronaut,\n  faUserCheck: faUserCheck,\n  faUserClock: faUserClock,\n  faUserDoctor: faUserDoctor,\n  faUserMd: faUserMd,\n  faUserGear: faUserGear,\n  faUserCog: faUserCog,\n  faUserGraduate: faUserGraduate,\n  faUserGroup: faUserGroup,\n  faUserFriends: faUserFriends,\n  faUserInjured: faUserInjured,\n  faUserLarge: faUserLarge,\n  faUserAlt: faUserAlt,\n  faUserLargeSlash: faUserLargeSlash,\n  faUserAltSlash: faUserAltSlash,\n  faUserLock: faUserLock,\n  faUserMinus: faUserMinus,\n  faUserNinja: faUserNinja,\n  faUserNurse: faUserNurse,\n  faUserPen: faUserPen,\n  faUserEdit: faUserEdit,\n  faUserPlus: faUserPlus,\n  faUserSecret: faUserSecret,\n  faUserShield: faUserShield,\n  faUserSlash: faUserSlash,\n  faUserTag: faUserTag,\n  faUserTie: faUserTie,\n  faUserXmark: faUserXmark,\n  faUserTimes: faUserTimes,\n  faUsers: faUsers,\n  faUsersBetweenLines: faUsersBetweenLines,\n  faUsersGear: faUsersGear,\n  faUsersCog: faUsersCog,\n  faUsersLine: faUsersLine,\n  faUsersRays: faUsersRays,\n  faUsersRectangle: faUsersRectangle,\n  faUsersSlash: faUsersSlash,\n  faUsersViewfinder: faUsersViewfinder,\n  faUtensils: faUtensils,\n  faCutlery: faCutlery,\n  faV: faV,\n  faVanShuttle: faVanShuttle,\n  faShuttleVan: faShuttleVan,\n  faVault: faVault,\n  faVectorSquare: faVectorSquare,\n  faVenus: faVenus,\n  faVenusDouble: faVenusDouble,\n  faVenusMars: faVenusMars,\n  faVest: faVest,\n  faVestPatches: faVestPatches,\n  faVial: faVial,\n  faVialCircleCheck: faVialCircleCheck,\n  faVialVirus: faVialVirus,\n  faVials: faVials,\n  faVideo: faVideo,\n  faVideoCamera: faVideoCamera,\n  faVideoSlash: faVideoSlash,\n  faVihara: faVihara,\n  faVirus: faVirus,\n  faVirusCovid: faVirusCovid,\n  faVirusCovidSlash: faVirusCovidSlash,\n  faVirusSlash: faVirusSlash,\n  faViruses: faViruses,\n  faVoicemail: faVoicemail,\n  faVolcano: faVolcano,\n  faVolleyball: faVolleyball,\n  faVolleyballBall: faVolleyballBall,\n  faVolumeHigh: faVolumeHigh,\n  faVolumeUp: faVolumeUp,\n  faVolumeLow: faVolumeLow,\n  faVolumeDown: faVolumeDown,\n  faVolumeOff: faVolumeOff,\n  faVolumeXmark: faVolumeXmark,\n  faVolumeMute: faVolumeMute,\n  faVolumeTimes: faVolumeTimes,\n  faVrCardboard: faVrCardboard,\n  faW: faW,\n  faWalkieTalkie: faWalkieTalkie,\n  faWallet: faWallet,\n  faWandMagic: faWandMagic,\n  faMagic: faMagic,\n  faWandMagicSparkles: faWandMagicSparkles,\n  faMagicWandSparkles: faMagicWandSparkles,\n  faWandSparkles: faWandSparkles,\n  faWarehouse: faWarehouse,\n  faWater: faWater,\n  faWaterLadder: faWaterLadder,\n  faLadderWater: faLadderWater,\n  faSwimmingPool: faSwimmingPool,\n  faWaveSquare: faWaveSquare,\n  faWeightHanging: faWeightHanging,\n  faWeightScale: faWeightScale,\n  faWeight: faWeight,\n  faWheatAwn: faWheatAwn,\n  faWheatAlt: faWheatAlt,\n  faWheatAwnCircleExclamation: faWheatAwnCircleExclamation,\n  faWheelchair: faWheelchair,\n  faWheelchairMove: faWheelchairMove,\n  faWheelchairAlt: faWheelchairAlt,\n  faWhiskeyGlass: faWhiskeyGlass,\n  faGlassWhiskey: faGlassWhiskey,\n  faWifi: faWifi,\n  faWifi3: faWifi3,\n  faWifiStrong: faWifiStrong,\n  faWind: faWind,\n  faWindowMaximize: faWindowMaximize,\n  faWindowMinimize: faWindowMinimize,\n  faWindowRestore: faWindowRestore,\n  faWineBottle: faWineBottle,\n  faWineGlass: faWineGlass,\n  faWineGlassEmpty: faWineGlassEmpty,\n  faWineGlassAlt: faWineGlassAlt,\n  faWonSign: faWonSign,\n  faKrw: faKrw,\n  faWon: faWon,\n  faWorm: faWorm,\n  faWrench: faWrench,\n  faX: faX,\n  faXRay: faXRay,\n  faXmark: faXmark,\n  faClose: faClose,\n  faMultiply: faMultiply,\n  faRemove: faRemove,\n  faTimes: faTimes,\n  faXmarksLines: faXmarksLines,\n  faY: faY,\n  faYenSign: faYenSign,\n  faCny: faCny,\n  faJpy: faJpy,\n  faRmb: faRmb,\n  faYen: faYen,\n  faYinYang: faYinYang,\n  faZ: faZ\n};\n\nexport { _iconsCache as fas, prefix, fa0, fa1, fa2, fa3, fa4, fa5, fa6, fa7, fa8, fa9, faA, faAddressBook, faContactBook, faAddressCard, faContactCard, faVcard, faAlignCenter, faAlignJustify, faAlignLeft, faAlignRight, faAnchor, faAnchorCircleCheck, faAnchorCircleExclamation, faAnchorCircleXmark, faAnchorLock, faAngleDown, faAngleLeft, faAngleRight, faAngleUp, faAnglesDown, faAngleDoubleDown, faAnglesLeft, faAngleDoubleLeft, faAnglesRight, faAngleDoubleRight, faAnglesUp, faAngleDoubleUp, faAnkh, faAppleWhole, faAppleAlt, faArchway, faArrowDown, faArrowDown19, faSortNumericAsc, faSortNumericDown, faArrowDown91, faSortNumericDesc, faSortNumericDownAlt, faArrowDownAZ, faSortAlphaAsc, faSortAlphaDown, faArrowDownLong, faLongArrowDown, faArrowDownShortWide, faSortAmountDesc, faSortAmountDownAlt, faArrowDownUpAcrossLine, faArrowDownUpLock, faArrowDownWideShort, faSortAmountAsc, faSortAmountDown, faArrowDownZA, faSortAlphaDesc, faSortAlphaDownAlt, faArrowLeft, faArrowLeftLong, faLongArrowLeft, faArrowPointer, faMousePointer, faArrowRight, faArrowRightArrowLeft, faExchange, faArrowRightFromBracket, faSignOut, faArrowRightLong, faLongArrowRight, faArrowRightToBracket, faSignIn, faArrowRightToCity, faArrowRotateLeft, faArrowLeftRotate, faArrowRotateBack, faArrowRotateBackward, faUndo, faArrowRotateRight, faArrowRightRotate, faArrowRotateForward, faRedo, faArrowTrendDown, faArrowTrendUp, faArrowTurnDown, faLevelDown, faArrowTurnUp, faLevelUp, faArrowUp, faArrowUp19, faSortNumericUp, faArrowUp91, faSortNumericUpAlt, faArrowUpAZ, faSortAlphaUp, faArrowUpFromBracket, faArrowUpFromGroundWater, faArrowUpFromWaterPump, faArrowUpLong, faLongArrowUp, faArrowUpRightDots, faArrowUpRightFromSquare, faExternalLink, faArrowUpShortWide, faSortAmountUpAlt, faArrowUpWideShort, faSortAmountUp, faArrowUpZA, faSortAlphaUpAlt, faArrowsDownToLine, faArrowsDownToPeople, faArrowsLeftRight, faArrowsH, faArrowsLeftRightToLine, faArrowsRotate, faRefresh, faSync, faArrowsSpin, faArrowsSplitUpAndLeft, faArrowsToCircle, faArrowsToDot, faArrowsToEye, faArrowsTurnRight, faArrowsTurnToDots, faArrowsUpDown, faArrowsV, faArrowsUpDownLeftRight, faArrows, faArrowsUpToLine, faAsterisk, faAt, faAtom, faAudioDescription, faAustralSign, faAward, faB, faBaby, faBabyCarriage, faCarriageBaby, faBackward, faBackwardFast, faFastBackward, faBackwardStep, faStepBackward, faBacon, faBacteria, faBacterium, faBagShopping, faShoppingBag, faBahai, faBahtSign, faBan, faCancel, faBanSmoking, faSmokingBan, faBandage, faBandAid, faBarcode, faBars, faNavicon, faBarsProgress, faTasksAlt, faBarsStaggered, faReorder, faStream, faBaseball, faBaseballBall, faBaseballBatBall, faBasketShopping, faShoppingBasket, faBasketball, faBasketballBall, faBath, faBathtub, faBatteryEmpty, faBattery0, faBatteryFull, faBattery, faBattery5, faBatteryHalf, faBattery3, faBatteryQuarter, faBattery2, faBatteryThreeQuarters, faBattery4, faBed, faBedPulse, faProcedures, faBeerMugEmpty, faBeer, faBell, faBellConcierge, faConciergeBell, faBellSlash, faBezierCurve, faBicycle, faBinoculars, faBiohazard, faBitcoinSign, faBlender, faBlenderPhone, faBlog, faBold, faBolt, faZap, faBoltLightning, faBomb, faBone, faBong, faBook, faBookAtlas, faAtlas, faBookBible, faBible, faBookBookmark, faBookJournalWhills, faJournalWhills, faBookMedical, faBookOpen, faBookOpenReader, faBookReader, faBookQuran, faQuran, faBookSkull, faBookDead, faBookmark, faBorderAll, faBorderNone, faBorderTopLeft, faBorderStyle, faBoreHole, faBottleDroplet, faBottleWater, faBowlFood, faBowlRice, faBowlingBall, faBox, faBoxArchive, faArchive, faBoxOpen, faBoxTissue, faBoxesPacking, faBoxesStacked, faBoxes, faBoxesAlt, faBraille, faBrain, faBrazilianRealSign, faBreadSlice, faBridge, faBridgeCircleCheck, faBridgeCircleExclamation, faBridgeCircleXmark, faBridgeLock, faBridgeWater, faBriefcase, faBriefcaseMedical, faBroom, faBroomBall, faQuidditch, faQuidditchBroomBall, faBrush, faBucket, faBug, faBugSlash, faBugs, faBuilding, faBuildingCircleArrowRight, faBuildingCircleCheck, faBuildingCircleExclamation, faBuildingCircleXmark, faBuildingColumns, faBank, faInstitution, faMuseum, faUniversity, faBuildingFlag, faBuildingLock, faBuildingNgo, faBuildingShield, faBuildingUn, faBuildingUser, faBuildingWheat, faBullhorn, faBullseye, faBurger, faHamburger, faBurst, faBus, faBusSimple, faBusAlt, faBusinessTime, faBriefcaseClock, faC, faCakeCandles, faBirthdayCake, faCake, faCalculator, faCalendar, faCalendarCheck, faCalendarDay, faCalendarDays, faCalendarAlt, faCalendarMinus, faCalendarPlus, faCalendarWeek, faCalendarXmark, faCalendarTimes, faCamera, faCameraAlt, faCameraRetro, faCameraRotate, faCampground, faCandyCane, faCannabis, faCapsules, faCar, faAutomobile, faCarBattery, faBatteryCar, faCarBurst, faCarCrash, faCarOn, faCarRear, faCarAlt, faCarSide, faCarTunnel, faCaravan, faCaretDown, faCaretLeft, faCaretRight, faCaretUp, faCarrot, faCartArrowDown, faCartFlatbed, faDollyFlatbed, faCartFlatbedSuitcase, faLuggageCart, faCartPlus, faCartShopping, faShoppingCart, faCashRegister, faCat, faCediSign, faCentSign, faCertificate, faChair, faChalkboard, faBlackboard, faChalkboardUser, faChalkboardTeacher, faChampagneGlasses, faGlassCheers, faChargingStation, faChartArea, faAreaChart, faChartBar, faBarChart, faChartColumn, faChartGantt, faChartLine, faLineChart, faChartPie, faPieChart, faChartSimple, faCheck, faCheckDouble, faCheckToSlot, faVoteYea, faCheese, faChess, faChessBishop, faChessBoard, faChessKing, faChessKnight, faChessPawn, faChessQueen, faChessRook, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faChild, faChildDress, faChildReaching, faChildRifle, faChildren, faChurch, faCircle, faCircleArrowDown, faArrowCircleDown, faCircleArrowLeft, faArrowCircleLeft, faCircleArrowRight, faArrowCircleRight, faCircleArrowUp, faArrowCircleUp, faCircleCheck, faCheckCircle, faCircleChevronDown, faChevronCircleDown, faCircleChevronLeft, faChevronCircleLeft, faCircleChevronRight, faChevronCircleRight, faCircleChevronUp, faChevronCircleUp, faCircleDollarToSlot, faDonate, faCircleDot, faDotCircle, faCircleDown, faArrowAltCircleDown, faCircleExclamation, faExclamationCircle, faCircleH, faHospitalSymbol, faCircleHalfStroke, faAdjust, faCircleInfo, faInfoCircle, faCircleLeft, faArrowAltCircleLeft, faCircleMinus, faMinusCircle, faCircleNodes, faCircleNotch, faCirclePause, faPauseCircle, faCirclePlay, faPlayCircle, faCirclePlus, faPlusCircle, faCircleQuestion, faQuestionCircle, faCircleRadiation, faRadiationAlt, faCircleRight, faArrowAltCircleRight, faCircleStop, faStopCircle, faCircleUp, faArrowAltCircleUp, faCircleUser, faUserCircle, faCircleXmark, faTimesCircle, faXmarkCircle, faCity, faClapperboard, faClipboard, faClipboardCheck, faClipboardList, faClipboardQuestion, faClipboardUser, faClock, faClockFour, faClockRotateLeft, faHistory, faClone, faClosedCaptioning, faCloud, faCloudArrowDown, faCloudDownload, faCloudDownloadAlt, faCloudArrowUp, faCloudUpload, faCloudUploadAlt, faCloudBolt, faThunderstorm, faCloudMeatball, faCloudMoon, faCloudMoonRain, faCloudRain, faCloudShowersHeavy, faCloudShowersWater, faCloudSun, faCloudSunRain, faClover, faCode, faCodeBranch, faCodeCommit, faCodeCompare, faCodeFork, faCodeMerge, faCodePullRequest, faCoins, faColonSign, faComment, faCommentDollar, faCommentDots, faCommenting, faCommentMedical, faCommentSlash, faCommentSms, faSms, faComments, faCommentsDollar, faCompactDisc, faCompass, faCompassDrafting, faDraftingCompass, faCompress, faComputer, faComputerMouse, faMouse, faCookie, faCookieBite, faCopy, faCopyright, faCouch, faCow, faCreditCard, faCreditCardAlt, faCrop, faCropSimple, faCropAlt, faCross, faCrosshairs, faCrow, faCrown, faCrutch, faCruzeiroSign, faCube, faCubes, faCubesStacked, faD, faDatabase, faDeleteLeft, faBackspace, faDemocrat, faDesktop, faDesktopAlt, faDharmachakra, faDiagramNext, faDiagramPredecessor, faDiagramProject, faProjectDiagram, faDiagramSuccessor, faDiamond, faDiamondTurnRight, faDirections, faDice, faDiceD20, faDiceD6, faDiceFive, faDiceFour, faDiceOne, faDiceSix, faDiceThree, faDiceTwo, faDisease, faDisplay, faDivide, faDna, faDog, faDollarSign, faDollar, faUsd, faDolly, faDollyBox, faDongSign, faDoorClosed, faDoorOpen, faDove, faDownLeftAndUpRightToCenter, faCompressAlt, faDownLong, faLongArrowAltDown, faDownload, faDragon, faDrawPolygon, faDroplet, faTint, faDropletSlash, faTintSlash, faDrum, faDrumSteelpan, faDrumstickBite, faDumbbell, faDumpster, faDumpsterFire, faDungeon, faE, faEarDeaf, faDeaf, faDeafness, faHardOfHearing, faEarListen, faAssistiveListeningSystems, faEarthAfrica, faGlobeAfrica, faEarthAmericas, faEarth, faEarthAmerica, faGlobeAmericas, faEarthAsia, faGlobeAsia, faEarthEurope, faGlobeEurope, faEarthOceania, faGlobeOceania, faEgg, faEject, faElevator, faEllipsis, faEllipsisH, faEllipsisVertical, faEllipsisV, faEnvelope, faEnvelopeCircleCheck, faEnvelopeOpen, faEnvelopeOpenText, faEnvelopesBulk, faMailBulk, faEquals, faEraser, faEthernet, faEuroSign, faEur, faEuro, faExclamation, faExpand, faExplosion, faEye, faEyeDropper, faEyeDropperEmpty, faEyedropper, faEyeLowVision, faLowVision, faEyeSlash, faF, faFaceAngry, faAngry, faFaceDizzy, faDizzy, faFaceFlushed, faFlushed, faFaceFrown, faFrown, faFaceFrownOpen, faFrownOpen, faFaceGrimace, faGrimace, faFaceGrin, faGrin, faFaceGrinBeam, faGrinBeam, faFaceGrinBeamSweat, faGrinBeamSweat, faFaceGrinHearts, faGrinHearts, faFaceGrinSquint, faGrinSquint, faFaceGrinSquintTears, faGrinSquintTears, faFaceGrinStars, faGrinStars, faFaceGrinTears, faGrinTears, faFaceGrinTongue, faGrinTongue, faFaceGrinTongueSquint, faGrinTongueSquint, faFaceGrinTongueWink, faGrinTongueWink, faFaceGrinWide, faGrinAlt, faFaceGrinWink, faGrinWink, faFaceKiss, faKiss, faFaceKissBeam, faKissBeam, faFaceKissWinkHeart, faKissWinkHeart, faFaceLaugh, faLaugh, faFaceLaughBeam, faLaughBeam, faFaceLaughSquint, faLaughSquint, faFaceLaughWink, faLaughWink, faFaceMeh, faMeh, faFaceMehBlank, faMehBlank, faFaceRollingEyes, faMehRollingEyes, faFaceSadCry, faSadCry, faFaceSadTear, faSadTear, faFaceSmile, faSmile, faFaceSmileBeam, faSmileBeam, faFaceSmileWink, faSmileWink, faFaceSurprise, faSurprise, faFaceTired, faTired, faFan, faFaucet, faFaucetDrip, faFax, faFeather, faFeatherPointed, faFeatherAlt, faFerry, faFile, faFileArrowDown, faFileDownload, faFileArrowUp, faFileUpload, faFileAudio, faFileCircleCheck, faFileCircleExclamation, faFileCircleMinus, faFileCirclePlus, faFileCircleQuestion, faFileCircleXmark, faFileCode, faFileContract, faFileCsv, faFileExcel, faFileExport, faArrowRightFromFile, faFileImage, faFileImport, faArrowRightToFile, faFileInvoice, faFileInvoiceDollar, faFileLines, faFileAlt, faFileText, faFileMedical, faFilePdf, faFilePen, faFileEdit, faFilePowerpoint, faFilePrescription, faFileShield, faFileSignature, faFileVideo, faFileWaveform, faFileMedicalAlt, faFileWord, faFileZipper, faFileArchive, faFill, faFillDrip, faFilm, faFilter, faFilterCircleDollar, faFunnelDollar, faFilterCircleXmark, faFingerprint, faFire, faFireBurner, faFireExtinguisher, faFireFlameCurved, faFireAlt, faFireFlameSimple, faBurn, faFish, faFishFins, faFlag, faFlagCheckered, faFlagUsa, faFlask, faFlaskVial, faFloppyDisk, faSave, faFlorinSign, faFolder, faFolderBlank, faFolderClosed, faFolderMinus, faFolderOpen, faFolderPlus, faFolderTree, faFont, faFontAwesome, faFontAwesomeFlag, faFontAwesomeLogoFull, faFootball, faFootballBall, faForward, faForwardFast, faFastForward, faForwardStep, faStepForward, faFrancSign, faFrog, faFutbol, faFutbolBall, faSoccerBall, faG, faGamepad, faGasPump, faGauge, faDashboard, faGaugeMed, faTachometerAltAverage, faGaugeHigh, faTachometerAlt, faTachometerAltFast, faGaugeSimple, faGaugeSimpleMed, faTachometerAverage, faGaugeSimpleHigh, faTachometer, faTachometerFast, faGavel, faLegal, faGear, faCog, faGears, faCogs, faGem, faGenderless, faGhost, faGift, faGifts, faGlassWater, faGlassWaterDroplet, faGlasses, faGlobe, faGolfBallTee, faGolfBall, faGopuram, faGraduationCap, faMortarBoard, faGreaterThan, faGreaterThanEqual, faGrip, faGripHorizontal, faGripLines, faGripLinesVertical, faGripVertical, faGroupArrowsRotate, faGuaraniSign, faGuitar, faGun, faH, faHammer, faHamsa, faHand, faHandPaper, faHandBackFist, faHandRock, faHandDots, faAllergies, faHandFist, faFistRaised, faHandHolding, faHandHoldingDollar, faHandHoldingUsd, faHandHoldingDroplet, faHandHoldingWater, faHandHoldingHand, faHandHoldingHeart, faHandHoldingMedical, faHandLizard, faHandMiddleFinger, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandScissors, faHandSparkles, faHandSpock, faHandcuffs, faHands, faSignLanguage, faSigning, faHandsAslInterpreting, faAmericanSignLanguageInterpreting, faAslInterpreting, faHandsAmericanSignLanguageInterpreting, faHandsBound, faHandsBubbles, faHandsWash, faHandsClapping, faHandsHolding, faHandsHoldingChild, faHandsHoldingCircle, faHandsPraying, faPrayingHands, faHandshake, faHandshakeAngle, faHandsHelping, faHandshakeSimple, faHandshakeAlt, faHandshakeSimpleSlash, faHandshakeAltSlash, faHandshakeSlash, faHanukiah, faHardDrive, faHdd, faHashtag, faHatCowboy, faHatCowboySide, faHatWizard, faHeadSideCough, faHeadSideCoughSlash, faHeadSideMask, faHeadSideVirus, faHeading, faHeader, faHeadphones, faHeadphonesSimple, faHeadphonesAlt, faHeadset, faHeart, faHeartCircleBolt, faHeartCircleCheck, faHeartCircleExclamation, faHeartCircleMinus, faHeartCirclePlus, faHeartCircleXmark, faHeartCrack, faHeartBroken, faHeartPulse, faHeartbeat, faHelicopter, faHelicopterSymbol, faHelmetSafety, faHardHat, faHatHard, faHelmetUn, faHighlighter, faHillAvalanche, faHillRockslide, faHippo, faHockeyPuck, faHollyBerry, faHorse, faHorseHead, faHospital, faHospitalAlt, faHospitalWide, faHospitalUser, faHotTubPerson, faHotTub, faHotdog, faHotel, faHourglass, faHourglass2, faHourglassHalf, faHourglassEmpty, faHourglassEnd, faHourglass3, faHourglassStart, faHourglass1, faHouse, faHome, faHomeAlt, faHomeLgAlt, faHouseChimney, faHomeLg, faHouseChimneyCrack, faHouseDamage, faHouseChimneyMedical, faClinicMedical, faHouseChimneyUser, faHouseChimneyWindow, faHouseCircleCheck, faHouseCircleExclamation, faHouseCircleXmark, faHouseCrack, faHouseFire, faHouseFlag, faHouseFloodWater, faHouseFloodWaterCircleArrowRight, faHouseLaptop, faLaptopHouse, faHouseLock, faHouseMedical, faHouseMedicalCircleCheck, faHouseMedicalCircleExclamation, faHouseMedicalCircleXmark, faHouseMedicalFlag, faHouseSignal, faHouseTsunami, faHouseUser, faHomeUser, faHryvniaSign, faHryvnia, faHurricane, faI, faICursor, faIceCream, faIcicles, faIcons, faHeartMusicCameraBolt, faIdBadge, faIdCard, faDriversLicense, faIdCardClip, faIdCardAlt, faIgloo, faImage, faImagePortrait, faPortrait, faImages, faInbox, faIndent, faIndianRupeeSign, faIndianRupee, faInr, faIndustry, faInfinity, faInfo, faItalic, faJ, faJar, faJarWheat, faJedi, faJetFighter, faFighterJet, faJetFighterUp, faJoint, faJugDetergent, faK, faKaaba, faKey, faKeyboard, faKhanda, faKipSign, faKitMedical, faFirstAid, faKitchenSet, faKiwiBird, faL, faLandMineOn, faLandmark, faLandmarkDome, faLandmarkAlt, faLandmarkFlag, faLanguage, faLaptop, faLaptopCode, faLaptopFile, faLaptopMedical, faLariSign, faLayerGroup, faLeaf, faLeftLong, faLongArrowAltLeft, faLeftRight, faArrowsAltH, faLemon, faLessThan, faLessThanEqual, faLifeRing, faLightbulb, faLinesLeaning, faLink, faChain, faLinkSlash, faChainBroken, faChainSlash, faUnlink, faLiraSign, faList, faListSquares, faListCheck, faTasks, faListOl, faList12, faListNumeric, faListUl, faListDots, faLitecoinSign, faLocationArrow, faLocationCrosshairs, faLocation, faLocationDot, faMapMarkerAlt, faLocationPin, faMapMarker, faLocationPinLock, faLock, faLockOpen, faLocust, faLungs, faLungsVirus, faM, faMagnet, faMagnifyingGlass, faSearch, faMagnifyingGlassArrowRight, faMagnifyingGlassChart, faMagnifyingGlassDollar, faSearchDollar, faMagnifyingGlassLocation, faSearchLocation, faMagnifyingGlassMinus, faSearchMinus, faMagnifyingGlassPlus, faSearchPlus, faManatSign, faMap, faMapLocation, faMapMarked, faMapLocationDot, faMapMarkedAlt, faMapPin, faMarker, faMars, faMarsAndVenus, faMarsAndVenusBurst, faMarsDouble, faMarsStroke, faMarsStrokeRight, faMarsStrokeH, faMarsStrokeUp, faMarsStrokeV, faMartiniGlass, faGlassMartiniAlt, faMartiniGlassCitrus, faCocktail, faMartiniGlassEmpty, faGlassMartini, faMask, faMaskFace, faMaskVentilator, faMasksTheater, faTheaterMasks, faMattressPillow, faMaximize, faExpandArrowsAlt, faMedal, faMemory, faMenorah, faMercury, faMessage, faCommentAlt, faMeteor, faMicrochip, faMicrophone, faMicrophoneLines, faMicrophoneAlt, faMicrophoneLinesSlash, faMicrophoneAltSlash, faMicrophoneSlash, faMicroscope, faMillSign, faMinimize, faCompressArrowsAlt, faMinus, faSubtract, faMitten, faMobile, faMobileAndroid, faMobilePhone, faMobileButton, faMobileRetro, faMobileScreen, faMobileAndroidAlt, faMobileScreenButton, faMobileAlt, faMoneyBill, faMoneyBill1, faMoneyBillAlt, faMoneyBill1Wave, faMoneyBillWaveAlt, faMoneyBillTransfer, faMoneyBillTrendUp, faMoneyBillWave, faMoneyBillWheat, faMoneyBills, faMoneyCheck, faMoneyCheckDollar, faMoneyCheckAlt, faMonument, faMoon, faMortarPestle, faMosque, faMosquito, faMosquitoNet, faMotorcycle, faMound, faMountain, faMountainCity, faMountainSun, faMugHot, faMugSaucer, faCoffee, faMusic, faN, faNairaSign, faNetworkWired, faNeuter, faNewspaper, faNotEqual, faNoteSticky, faStickyNote, faNotesMedical, faO, faObjectGroup, faObjectUngroup, faOilCan, faOilWell, faOm, faOtter, faOutdent, faDedent, faP, faPager, faPaintRoller, faPaintbrush, faPaintBrush, faPalette, faPallet, faPanorama, faPaperPlane, faPaperclip, faParachuteBox, faParagraph, faPassport, faPaste, faFileClipboard, faPause, faPaw, faPeace, faPen, faPenClip, faPenAlt, faPenFancy, faPenNib, faPenRuler, faPencilRuler, faPenToSquare, faEdit, faPencil, faPencilAlt, faPeopleArrowsLeftRight, faPeopleArrows, faPeopleCarryBox, faPeopleCarry, faPeopleGroup, faPeopleLine, faPeoplePulling, faPeopleRobbery, faPeopleRoof, faPepperHot, faPercent, faPercentage, faPerson, faMale, faPersonArrowDownToLine, faPersonArrowUpFromLine, faPersonBiking, faBiking, faPersonBooth, faPersonBreastfeeding, faPersonBurst, faPersonCane, faPersonChalkboard, faPersonCircleCheck, faPersonCircleExclamation, faPersonCircleMinus, faPersonCirclePlus, faPersonCircleQuestion, faPersonCircleXmark, faPersonDigging, faDigging, faPersonDotsFromLine, faDiagnoses, faPersonDress, faFemale, faPersonDressBurst, faPersonDrowning, faPersonFalling, faPersonFallingBurst, faPersonHalfDress, faPersonHarassing, faPersonHiking, faHiking, faPersonMilitaryPointing, faPersonMilitaryRifle, faPersonMilitaryToPerson, faPersonPraying, faPray, faPersonPregnant, faPersonRays, faPersonRifle, faPersonRunning, faRunning, faPersonShelter, faPersonSkating, faSkating, faPersonSkiing, faSkiing, faPersonSkiingNordic, faSkiingNordic, faPersonSnowboarding, faSnowboarding, faPersonSwimming, faSwimmer, faPersonThroughWindow, faPersonWalking, faWalking, faPersonWalkingArrowLoopLeft, faPersonWalkingArrowRight, faPersonWalkingDashedLineArrowRight, faPersonWalkingLuggage, faPersonWalkingWithCane, faBlind, faPesetaSign, faPesoSign, faPhone, faPhoneFlip, faPhoneAlt, faPhoneSlash, faPhoneVolume, faVolumeControlPhone, faPhotoFilm, faPhotoVideo, faPiggyBank, faPills, faPizzaSlice, faPlaceOfWorship, faPlane, faPlaneArrival, faPlaneCircleCheck, faPlaneCircleExclamation, faPlaneCircleXmark, faPlaneDeparture, faPlaneLock, faPlaneSlash, faPlaneUp, faPlantWilt, faPlateWheat, faPlay, faPlug, faPlugCircleBolt, faPlugCircleCheck, faPlugCircleExclamation, faPlugCircleMinus, faPlugCirclePlus, faPlugCircleXmark, faPlus, faAdd, faPlusMinus, faPodcast, faPoo, faPooStorm, faPooBolt, faPoop, faPowerOff, faPrescription, faPrescriptionBottle, faPrescriptionBottleMedical, faPrescriptionBottleAlt, faPrint, faPumpMedical, faPumpSoap, faPuzzlePiece, faQ, faQrcode, faQuestion, faQuoteLeft, faQuoteLeftAlt, faQuoteRight, faQuoteRightAlt, faR, faRadiation, faRadio, faRainbow, faRankingStar, faReceipt, faRecordVinyl, faRectangleAd, faAd, faRectangleList, faListAlt, faRectangleXmark, faRectangleTimes, faTimesRectangle, faWindowClose, faRecycle, faRegistered, faRepeat, faReply, faMailReply, faReplyAll, faMailReplyAll, faRepublican, faRestroom, faRetweet, faRibbon, faRightFromBracket, faSignOutAlt, faRightLeft, faExchangeAlt, faRightLong, faLongArrowAltRight, faRightToBracket, faSignInAlt, faRing, faRoad, faRoadBarrier, faRoadBridge, faRoadCircleCheck, faRoadCircleExclamation, faRoadCircleXmark, faRoadLock, faRoadSpikes, faRobot, faRocket, faRotate, faSyncAlt, faRotateLeft, faRotateBack, faRotateBackward, faUndoAlt, faRotateRight, faRedoAlt, faRotateForward, faRoute, faRss, faFeed, faRubleSign, faRouble, faRub, faRuble, faRug, faRuler, faRulerCombined, faRulerHorizontal, faRulerVertical, faRupeeSign, faRupee, faRupiahSign, faS, faSackDollar, faSackXmark, faSailboat, faSatellite, faSatelliteDish, faScaleBalanced, faBalanceScale, faScaleUnbalanced, faBalanceScaleLeft, faScaleUnbalancedFlip, faBalanceScaleRight, faSchool, faSchoolCircleCheck, faSchoolCircleExclamation, faSchoolCircleXmark, faSchoolFlag, faSchoolLock, faScissors, faCut, faScrewdriver, faScrewdriverWrench, faTools, faScroll, faScrollTorah, faTorah, faSdCard, faSection, faSeedling, faSprout, faServer, faShapes, faTriangleCircleSquare, faShare, faArrowTurnRight, faMailForward, faShareFromSquare, faShareSquare, faShareNodes, faShareAlt, faSheetPlastic, faShekelSign, faIls, faShekel, faSheqel, faSheqelSign, faShield, faShieldBlank, faShieldCat, faShieldDog, faShieldHalved, faShieldAlt, faShieldHeart, faShieldVirus, faShip, faShirt, faTShirt, faTshirt, faShoePrints, faShop, faStoreAlt, faShopLock, faShopSlash, faStoreAltSlash, faShower, faShrimp, faShuffle, faRandom, faShuttleSpace, faSpaceShuttle, faSignHanging, faSign, faSignal, faSignal5, faSignalPerfect, faSignature, faSignsPost, faMapSigns, faSimCard, faSink, faSitemap, faSkull, faSkullCrossbones, faSlash, faSleigh, faSliders, faSlidersH, faSmog, faSmoking, faSnowflake, faSnowman, faSnowplow, faSoap, faSocks, faSolarPanel, faSort, faUnsorted, faSortDown, faSortDesc, faSortUp, faSortAsc, faSpa, faSpaghettiMonsterFlying, faPastafarianism, faSpellCheck, faSpider, faSpinner, faSplotch, faSpoon, faUtensilSpoon, faSprayCan, faSprayCanSparkles, faAirFreshener, faSquare, faSquareArrowUpRight, faExternalLinkSquare, faSquareCaretDown, faCaretSquareDown, faSquareCaretLeft, faCaretSquareLeft, faSquareCaretRight, faCaretSquareRight, faSquareCaretUp, faCaretSquareUp, faSquareCheck, faCheckSquare, faSquareEnvelope, faEnvelopeSquare, faSquareFull, faSquareH, faHSquare, faSquareMinus, faMinusSquare, faSquareNfi, faSquareParking, faParking, faSquarePen, faPenSquare, faPencilSquare, faSquarePersonConfined, faSquarePhone, faPhoneSquare, faSquarePhoneFlip, faPhoneSquareAlt, faSquarePlus, faPlusSquare, faSquarePollHorizontal, faPollH, faSquarePollVertical, faPoll, faSquareRootVariable, faSquareRootAlt, faSquareRss, faRssSquare, faSquareShareNodes, faShareAltSquare, faSquareUpRight, faExternalLinkSquareAlt, faSquareVirus, faSquareXmark, faTimesSquare, faXmarkSquare, faStaffAesculapius, faRodAsclepius, faRodSnake, faStaffSnake, faStairs, faStamp, faStar, faStarAndCrescent, faStarHalf, faStarHalfStroke, faStarHalfAlt, faStarOfDavid, faStarOfLife, faSterlingSign, faGbp, faPoundSign, faStethoscope, faStop, faStopwatch, faStopwatch20, faStore, faStoreSlash, faStreetView, faStrikethrough, faStroopwafel, faSubscript, faSuitcase, faSuitcaseMedical, faMedkit, faSuitcaseRolling, faSun, faSunPlantWilt, faSuperscript, faSwatchbook, faSynagogue, faSyringe, faT, faTable, faTableCells, faTh, faTableCellsLarge, faThLarge, faTableColumns, faColumns, faTableList, faThList, faTableTennisPaddleBall, faPingPongPaddleBall, faTableTennis, faTablet, faTabletAndroid, faTabletButton, faTabletScreenButton, faTabletAlt, faTablets, faTachographDigital, faDigitalTachograph, faTag, faTags, faTape, faTarp, faTarpDroplet, faTaxi, faCab, faTeeth, faTeethOpen, faTemperatureArrowDown, faTemperatureDown, faTemperatureArrowUp, faTemperatureUp, faTemperatureEmpty, faTemperature0, faThermometer0, faThermometerEmpty, faTemperatureFull, faTemperature4, faThermometer4, faThermometerFull, faTemperatureHalf, faTemperature2, faThermometer2, faThermometerHalf, faTemperatureHigh, faTemperatureLow, faTemperatureQuarter, faTemperature1, faThermometer1, faThermometerQuarter, faTemperatureThreeQuarters, faTemperature3, faThermometer3, faThermometerThreeQuarters, faTengeSign, faTenge, faTent, faTentArrowDownToLine, faTentArrowLeftRight, faTentArrowTurnLeft, faTentArrowsDown, faTents, faTerminal, faTextHeight, faTextSlash, faRemoveFormat, faTextWidth, faThermometer, faThumbsDown, faThumbsUp, faThumbtack, faThumbTack, faTicket, faTicketSimple, faTicketAlt, faTimeline, faToggleOff, faToggleOn, faToilet, faToiletPaper, faToiletPaperSlash, faToiletPortable, faToiletsPortable, faToolbox, faTooth, faToriiGate, faTornado, faTowerBroadcast, faBroadcastTower, faTowerCell, faTowerObservation, faTractor, faTrademark, faTrafficLight, faTrailer, faTrain, faTrainSubway, faSubway, faTrainTram, faTram, faTransgender, faTransgenderAlt, faTrash, faTrashArrowUp, faTrashRestore, faTrashCan, faTrashAlt, faTrashCanArrowUp, faTrashRestoreAlt, faTree, faTreeCity, faTriangleExclamation, faExclamationTriangle, faWarning, faTrophy, faTrowel, faTrowelBricks, faTruck, faTruckArrowRight, faTruckDroplet, faTruckFast, faShippingFast, faTruckField, faTruckFieldUn, faTruckFront, faTruckMedical, faAmbulance, faTruckMonster, faTruckMoving, faTruckPickup, faTruckPlane, faTruckRampBox, faTruckLoading, faTty, faTeletype, faTurkishLiraSign, faTry, faTurkishLira, faTurnDown, faLevelDownAlt, faTurnUp, faLevelUpAlt, faTv, faTelevision, faTvAlt, faU, faUmbrella, faUmbrellaBeach, faUnderline, faUniversalAccess, faUnlock, faUnlockKeyhole, faUnlockAlt, faUpDown, faArrowsAltV, faUpDownLeftRight, faArrowsAlt, faUpLong, faLongArrowAltUp, faUpRightAndDownLeftFromCenter, faExpandAlt, faUpRightFromSquare, faExternalLinkAlt, faUpload, faUser, faUserAstronaut, faUserCheck, faUserClock, faUserDoctor, faUserMd, faUserGear, faUserCog, faUserGraduate, faUserGroup, faUserFriends, faUserInjured, faUserLarge, faUserAlt, faUserLargeSlash, faUserAltSlash, faUserLock, faUserMinus, faUserNinja, faUserNurse, faUserPen, faUserEdit, faUserPlus, faUserSecret, faUserShield, faUserSlash, faUserTag, faUserTie, faUserXmark, faUserTimes, faUsers, faUsersBetweenLines, faUsersGear, faUsersCog, faUsersLine, faUsersRays, faUsersRectangle, faUsersSlash, faUsersViewfinder, faUtensils, faCutlery, faV, faVanShuttle, faShuttleVan, faVault, faVectorSquare, faVenus, faVenusDouble, faVenusMars, faVest, faVestPatches, faVial, faVialCircleCheck, faVialVirus, faVials, faVideo, faVideoCamera, faVideoSlash, faVihara, faVirus, faVirusCovid, faVirusCovidSlash, faVirusSlash, faViruses, faVoicemail, faVolcano, faVolleyball, faVolleyballBall, faVolumeHigh, faVolumeUp, faVolumeLow, faVolumeDown, faVolumeOff, faVolumeXmark, faVolumeMute, faVolumeTimes, faVrCardboard, faW, faWalkieTalkie, faWallet, faWandMagic, faMagic, faWandMagicSparkles, faMagicWandSparkles, faWandSparkles, faWarehouse, faWater, faWaterLadder, faLadderWater, faSwimmingPool, faWaveSquare, faWeightHanging, faWeightScale, faWeight, faWheatAwn, faWheatAlt, faWheatAwnCircleExclamation, faWheelchair, faWheelchairMove, faWheelchairAlt, faWhiskeyGlass, faGlassWhiskey, faWifi, faWifi3, faWifiStrong, faWind, faWindowMaximize, faWindowMinimize, faWindowRestore, faWineBottle, faWineGlass, faWineGlassEmpty, faWineGlassAlt, faWonSign, faKrw, faWon, faWorm, faWrench, faX, faXRay, faXmark, faClose, faMultiply, faRemove, faTimes, faXmarksLines, faY, faYenSign, faCny, faJpy, faRmb, faYen, faYinYang, faZ };\n","// https://fontawesome.com/docs/web/use-with/vue/add-icons\n\n/* import the fontawesome core */\nimport {library} from '@fortawesome/fontawesome-svg-core';\n\n/* import font awesome icon component */\nimport {FontAwesomeIcon} from '@fortawesome/vue-fontawesome';\n\n/* import specific icons */\nimport {\n\tfaPlay,\n\tfaPause,\n\tfaChevronLeft,\n\tfaChevronRight,\n\tfaChevronUp,\n\tfaChevronDown,\n\tfaInfinity,\n\tfaRecycle,\n\tfaExclamationTriangle,\n\tfaClock,\n\tfaXmark,\n\tfaRepeat,\n\tfaRotate,\n\tfaAlignLeft,\n\tfaSquare,\n\tfaCircle,\n\tfaCheck,\n\tfaExpand,\n\tfaUsers,\n\tfaCodeFork,\n\tfaCloudArrowDown,\n\tfaExpandAlt,\n\tfaArrowPointer,\n} from '@fortawesome/free-solid-svg-icons';\n\n/* add icons to the library */\nlibrary.add(\n\tfaPlay,\n\tfaPause,\n\tfaChevronLeft,\n\tfaChevronRight,\n\tfaChevronUp,\n\tfaChevronDown,\n\tfaInfinity,\n\tfaRecycle,\n\tfaExclamationTriangle,\n\tfaClock,\n\tfaXmark,\n\tfaRepeat,\n\tfaRotate,\n\tfaAlignLeft,\n\tfaSquare,\n\tfaCircle,\n\tfaCheck,\n\tfaExpand,\n\tfaUsers,\n\tfaCodeFork,\n\tfaCloudArrowDown,\n\tfaExpandAlt,\n\tfaArrowPointer\n);\n\nexport {FontAwesomeIcon};\n","import AppComponent from '../App.vue';\n\nimport {\n\tcreateApp,\n\tApp,\n\tComponentPublicInstance,\n\tComponentOptionsBase,\n\tComputedOptions,\n\tMethodOptions,\n\tComponent,\n} from 'vue';\n// import {Router, Matcher} from 'vue-router';\n\nimport {FontAwesomeIcon} from '../editor/components/widgets/icons/fontawesome/fontawesomeInstall';\nimport MultiplePanel from '../editor/components/panels/multiple/Multiple.vue';\nimport DropDownMenu from '../editor/components/widgets/DropDownMenu.vue';\nimport DropDownMenuModal from '../editor/components/widgets/dropdown/DropDownMenuModal.vue';\nimport NodeTree from '../editor/components/widgets/NodeTree.vue';\nimport {EditorLayoutData} from '../editor/types';\nimport {AppSceneLoader} from './AppSceneLoader';\nimport {router} from '../routes';\n// import {RouterUtils} from './RouterUtils';\n\ntype LayoutDataFunction = () => EditorLayoutData;\n\nexport class AppLoaderClass {\n\tprivate static _instance: AppLoaderClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new AppLoaderClass());\n\t}\n\tprivate constructor() {}\n\t// private _router?: Router;\n\t// private _matcher?: Matcher;\n\t// private _routerUtils?: RouterUtils;\n\tprivate _vueInstance: App<Element> | undefined;\n\tprotected _editorComponent:\n\t\t| ComponentPublicInstance<\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\t{},\n\t\t\t\tfalse,\n\t\t\t\tComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}>\n\t\t  >\n\t\t| undefined; // TODO: vue - try and find a better way to type this\n\tmount(elementOrId: string | HTMLElement) {\n\t\tconst app = createApp(AppComponent as any as Component<any, any, any, ComputedOptions, MethodOptions>);\n\t\t// const createdRouterData = _createRouter();\n\t\t// if (!createdRouterData) {\n\t\t// \tconsole.error('failed to create router');\n\t\t// \treturn;\n\t\t// }\n\t\t// const {router, matcher} = createdRouterData;\n\t\t// this._router = router;\n\t\t// this._matcher = matcher;\n\t\t// this._routerUtils = new RouterUtils(router);\n\t\tapp.use(router);\n\t\tapp.component('MultiplePanel', MultiplePanel as any);\n\t\tapp.component('DropDownMenu', DropDownMenu as any);\n\t\tapp.component('DropDownMenuModal', DropDownMenuModal as any);\n\t\tapp.component('NodeTree', NodeTree as any);\n\t\tapp.component('font-awesome-icon', FontAwesomeIcon);\n\t\tthis._vueInstance = app;\n\n\t\tthis._editorComponent = app.mount(elementOrId);\n\n\t\tAppSceneLoader.redirectLegacyExampleId();\n\t}\n\tunmount() {\n\t\t// this.instance()._unmount();\n\t\t// this._instance = undefined;\n\t\tif (!this._vueInstance) {\n\t\t\treturn;\n\t\t}\n\t\tthis._vueInstance.unmount();\n\t\t// this._vueInstance\n\t\tthis._vueInstance = undefined;\n\t}\n\tprivate _layoutDataFunction: LayoutDataFunction | undefined;\n\tsetLayoutDataFunction(layoutDataFunction: LayoutDataFunction) {\n\t\tthis._layoutDataFunction = layoutDataFunction;\n\t}\n\tlayoutDataFunction() {\n\t\treturn this._layoutDataFunction;\n\t}\n\n\t// routerUtils aliases\n\t// closeModals = () => this._routerUtils?.closeModals();\n}\n\nexport const AppLoader = AppLoaderClass.instance();\n","import {JsonImporterMigrateHelper} from './../MigrateHelper';\nimport {CoreType} from './../../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {ParamType} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {SimpleParamJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/IOController';\nimport {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {BlendFunction} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/post/utils/BuilderEffect';\n\nexport function migratePostNodeBlendFunction(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (!migrateHelper.oldPolygonjsVersionLessThan('1.2.19')) {\n\t\treturn;\n\t}\n\n\tconst paramsData = nodeData['params'];\n\tif (!paramsData) {\n\t\treturn;\n\t}\n\tconst blendFunction = paramsData['blendFunction'] as SimpleParamJsonExporterData<ParamType.INTEGER> | undefined;\n\tif (!blendFunction) {\n\t\treturn;\n\t}\n\tif (!CoreType.isNumber(blendFunction)) {\n\t\treturn;\n\t}\n\n\tconst BLEND_FUNCTIONS_LEGACY: BlendFunction[] = [\n\t\tBlendFunction.SKIP,\n\t\tBlendFunction.ADD,\n\t\tBlendFunction.ALPHA,\n\t\tBlendFunction.AVERAGE,\n\t\tBlendFunction.COLOR_BURN,\n\t\tBlendFunction.COLOR_DODGE,\n\t\tBlendFunction.DARKEN,\n\t\tBlendFunction.DIFFERENCE,\n\t\tBlendFunction.EXCLUSION,\n\t\tBlendFunction.LIGHTEN,\n\t\tBlendFunction.MULTIPLY,\n\t\tBlendFunction.DIVIDE,\n\t\tBlendFunction.NEGATION,\n\t\tBlendFunction.NORMAL,\n\t\tBlendFunction.OVERLAY,\n\t\tBlendFunction.REFLECT,\n\t\tBlendFunction.SCREEN,\n\t\tBlendFunction.SET,\n\t\tBlendFunction.SOFT_LIGHT,\n\t\tBlendFunction.SUBTRACT,\n\t];\n\tconst newBlendFunction = BLEND_FUNCTIONS_LEGACY[blendFunction];\n\tif (newBlendFunction == null) {\n\t\treturn;\n\t}\n\tparamsData['blendFunction'] = newBlendFunction;\n}\n","import {JsonImporterMigrateHelper} from './../MigrateHelper';\nimport {SDFMaterialGlNode} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFMaterial';\nimport {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\n\nfunction migrateSDFMaterial(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.23')) {\n\t\tconst params = nodeData['params'];\n\t\tif (params) {\n\t\t\tconst absorbtion = params['absorbtion'];\n\t\t\tif (absorbtion != null) {\n\t\t\t\tparams['absorption'] = absorbtion;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function paramsMigrateGl(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst nodeType = nodeData.type;\n\tswitch (nodeType) {\n\t\tcase SDFMaterialGlNode.type(): {\n\t\t\treturn migrateSDFMaterial(nodeData, migrateHelper);\n\t\t}\n\t}\n}\n","import {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {SceneJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\n\nexport interface JsonNodeInfo {\n\tnode: NodeJsonExporterData;\n\tsibblings: NodeJsonExporterData[];\n\tparent?: NodeJsonExporterData;\n}\ntype TraverseNodeCallback = (info: JsonNodeInfo) => void;\n\nexport abstract class BaseSceneDataMigrator {\n\tabstract editorVersion(): string;\n\tabstract migrateData(data: SceneJsonExporterData): SceneJsonExporterData;\n\n\ttraverseNodes(data: SceneJsonExporterData, callback: TraverseNodeCallback) {\n\t\tif (data.root) {\n\t\t\tthis._traverseNode({node: data.root, sibblings: [], parent: undefined}, callback);\n\t\t}\n\t}\n\tprivate _traverseNode(info: JsonNodeInfo, callback: TraverseNodeCallback) {\n\t\tcallback(info);\n\t\tconst node = info.node;\n\t\tconst childrenDict = node.nodes;\n\t\tif (!childrenDict) {\n\t\t\treturn;\n\t\t}\n\t\tconst childrenNames = Object.keys(childrenDict);\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = childrenDict[childName];\n\t\t\tif (child) {\n\t\t\t\tconst sibblingNames = childrenNames.filter((otherChildName) => otherChildName != childName);\n\t\t\t\tconst sibblings = sibblingNames.map((sibblingName) => childrenDict[sibblingName]);\n\t\t\t\tconst childInfo: JsonNodeInfo = {\n\t\t\t\t\tnode: child,\n\t\t\t\t\tsibblings,\n\t\t\t\t\tparent: node,\n\t\t\t\t};\n\t\t\t\tthis._traverseNode(childInfo, callback);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {JsConnectionPointType} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js';\nimport {CoreType} from './../../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {SceneJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {BaseSceneDataMigrator, JsonNodeInfo} from './_Base';\nimport {ParamType} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\n\ninterface OnScenePlayPauseReplacement {\n\tpause: string;\n\tplay: string;\n}\n\nexport class SceneDataMigrator_1_4_8 extends BaseSceneDataMigrator {\n\teditorVersion() {\n\t\treturn '1.4.8-1';\n\t}\n\tmigrateData(data: SceneJsonExporterData): SceneJsonExporterData {\n\t\tthis.traverseNodes(data, (info) => {\n\t\t\tif (info.node.type == 'actor' || info.node.type == 'actorsNetwork') {\n\t\t\t\tthis.splitOnScenePlayState(info);\n\t\t\t\tthis.replaceGetObjectOutputs(info);\n\t\t\t\tthis.replaceGetMaterialOutputs(info);\n\t\t\t\t// this.replaceOrInputs(info);\n\t\t\t\t// this.replaceAndInputs(info);\n\t\t\t\tthis.replaceAttribNameSpareParam(info);\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n\tprivate replaceAttribNameSpareParam(info: JsonNodeInfo) {\n\t\tconst children = info.node.nodes;\n\t\tif (!children) {\n\t\t\treturn;\n\t\t}\n\t\tconst childrenNames = Object.keys(children);\n\t\tconst attribTypes = new Set([\n\t\t\t'getChildrenAttributes',\n\t\t\t'getObjectAttribute',\n\t\t\t'onChildAttributeUpdate',\n\t\t\t'onObjectAttributeUpdate',\n\t\t\t'setObjectAttribute',\n\t\t]);\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = children[childName];\n\t\t\tif (attribTypes.has(child.type)) {\n\t\t\t\tconst params = child.params;\n\t\t\t\tif (params) {\n\t\t\t\t\tconst attribNameParam = params['attribName'];\n\t\t\t\t\tif (CoreType.isString(attribNameParam)) {\n\t\t\t\t\t\tconst value = attribNameParam;\n\t\t\t\t\t\tparams['attribName'] = {\n\t\t\t\t\t\t\ttype: ParamType.STRING,\n\t\t\t\t\t\t\tdefault_value: '',\n\t\t\t\t\t\t\toptions: {spare: true, editable: true},\n\t\t\t\t\t\t\traw_input: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate replaceGetObjectOutputs(info: JsonNodeInfo) {\n\t\tconst children = info.node.nodes;\n\t\tif (!children) {\n\t\t\treturn;\n\t\t}\n\t\tconst getObject = 'getObject';\n\t\tconst childrenNames = Object.keys(children);\n\t\tconst getObjectNames: Set<string> = new Set();\n\t\t// find getObjectNames\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = children[childName];\n\t\t\tif (child.type == getObject) {\n\t\t\t\tgetObjectNames.add(childName);\n\t\t\t}\n\t\t}\n\t\t// replace inputs pointing to getObject nodes\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = children[childName];\n\t\t\tconst inputs = child.inputs;\n\t\t\tif (inputs) {\n\t\t\t\tfor (const input of inputs) {\n\t\t\t\t\tif (!CoreType.isString(input) && input != null) {\n\t\t\t\t\t\tif (getObjectNames.has(input.node)) {\n\t\t\t\t\t\t\tif (input.output == 'object3D') {\n\t\t\t\t\t\t\t\tinput.output = JsConnectionPointType.OBJECT_3D;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate replaceGetMaterialOutputs(info: JsonNodeInfo) {\n\t\tconst children = info.node.nodes;\n\t\tif (!children) {\n\t\t\treturn;\n\t\t}\n\t\tconst getMaterial = 'getMaterial';\n\t\tconst childrenNames = Object.keys(children);\n\t\tconst getMaterialNames: Set<string> = new Set();\n\t\t// find getObjectNames\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = children[childName];\n\t\t\tif (child.type == getMaterial) {\n\t\t\t\tgetMaterialNames.add(childName);\n\t\t\t}\n\t\t}\n\t\t// replace inputs pointing to getObject nodes\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = children[childName];\n\t\t\tconst inputs = child.inputs;\n\t\t\tif (inputs) {\n\t\t\t\tfor (const input of inputs) {\n\t\t\t\t\tif (!CoreType.isString(input) && input != null) {\n\t\t\t\t\t\tif (getMaterialNames.has(input.node)) {\n\t\t\t\t\t\t\tif (input.output == 'material') {\n\t\t\t\t\t\t\t\tinput.output = JsConnectionPointType.MATERIAL;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// private replaceOrInputs(info: JsonNodeInfo) {}\n\t// private replaceAndInputs(info: JsonNodeInfo) {}\n\tprivate splitOnScenePlayState(info: JsonNodeInfo) {\n\t\tconst children = info.node.nodes;\n\t\tif (!children) {\n\t\t\treturn;\n\t\t}\n\t\tconst onScenePlayState = 'onScenePlayState';\n\t\tconst originalNameToNewNames: Map<string, OnScenePlayPauseReplacement> = new Map();\n\t\tlet index = 1;\n\t\tconst childrenNames = Object.keys(children);\n\t\t// find onScenePlayState nodes and delete them\n\t\tfor (const childName of childrenNames) {\n\t\t\tconst child = children[childName];\n\t\t\tif (child.type == onScenePlayState) {\n\t\t\t\tconst onScenePause = `onScenePause${index}`;\n\t\t\t\tconst onScenePlay = `onScenePlay${index}`;\n\t\t\t\toriginalNameToNewNames.set(childName, {pause: onScenePause, play: onScenePlay});\n\n\t\t\t\t// delete onScenePlayState and add replacement\n\t\t\t\tdelete children[childName];\n\t\t\t\tchildren[onScenePause] = {type: 'onScenePause'};\n\t\t\t\tchildren[onScenePlay] = {type: 'onScenePlay'};\n\n\t\t\t\t//\n\t\t\t\tindex++;\n\t\t\t}\n\t\t}\n\t\t// replace inputs that were connected to onScenePlayState\n\t\tconst childrenNames2 = Object.keys(children);\n\t\tfor (const childName of childrenNames2) {\n\t\t\tconst child = children[childName];\n\t\t\tconst inputs = child.inputs;\n\t\t\tif (inputs) {\n\t\t\t\tfor (const input of inputs) {\n\t\t\t\t\tif (!CoreType.isString(input) && input != null) {\n\t\t\t\t\t\tconst replacement = originalNameToNewNames.get(input.node);\n\t\t\t\t\t\tif (replacement != null) {\n\t\t\t\t\t\t\tif (input.output == 'triggerPause') {\n\t\t\t\t\t\t\t\tinput.node = replacement.pause;\n\t\t\t\t\t\t\t\tinput['output'] = 'trigger';\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (input.output == 'triggerPlay') {\n\t\t\t\t\t\t\t\t\tinput.node = replacement.play;\n\t\t\t\t\t\t\t\t\tinput['output'] = 'trigger';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {SceneJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {BaseSceneDataMigrator, JsonNodeInfo} from './_Base';\nimport {SopType} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {ATTRIBUTE_CLASSES, AttribClass} from './../../../../../../@polygonjs/polygonjs/src/core/geometry/Constant';\n\nexport class SceneDataMigrator_1_5_0 extends BaseSceneDataMigrator {\n\teditorVersion() {\n\t\treturn '1.5.0-1';\n\t}\n\tmigrateData(data: SceneJsonExporterData): SceneJsonExporterData {\n\t\tthis.traverseNodes(data, (info) => {\n\t\t\tconst type = info.node.type;\n\t\t\tswitch (type) {\n\t\t\t\tcase SopType.ATTRIB_COPY:\n\t\t\t\tcase SopType.ATTRIB_CREATE:\n\t\t\t\tcase SopType.ATTRIB_DELETE:\n\t\t\t\tcase SopType.ATTRIB_ID:\n\t\t\t\tcase SopType.ATTRIB_RENAME:\n\t\t\t\tcase SopType.ATTRIB_SET_AT_INDEX:\n\t\t\t\tcase SopType.AUDIO_NOTES:\n\t\t\t\tcase SopType.DELETE:\n\t\t\t\tcase SopType.PALETTE: {\n\t\t\t\t\treturn this._fixAttribClass(info);\n\t\t\t\t}\n\t\t\t\tcase SopType.ATTRIB_PROMOTE: {\n\t\t\t\t\treturn this._fixAttribClassFromTo(info);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n\tprivate _fixAttribClass(info: JsonNodeInfo) {\n\t\tconst params = info.node.params;\n\t\tif (!params) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentClass = params['class'];\n\t\tif (currentClass == null) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (currentClass) {\n\t\t\tcase 0: {\n\t\t\t\tparams['class'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 1: {\n\t\t\t\tparams['class'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 1: {\n\t\t\t\tparams['class'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.CORE_GROUP);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tprivate _fixAttribClassFromTo(info: JsonNodeInfo) {\n\t\tconst params = info.node.params;\n\t\tif (!params) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentClassFrom = params['classFrom'];\n\t\tconst currentClassTo = params['classTo'];\n\t\tif (currentClassFrom != null) {\n\t\t\tswitch (currentClassFrom) {\n\t\t\t\tcase 0: {\n\t\t\t\t\tparams['classFrom'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 1: {\n\t\t\t\t\tparams['classFrom'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 1: {\n\t\t\t\t\tparams['classFrom'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.CORE_GROUP);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (currentClassTo != null) {\n\t\t\tswitch (currentClassTo) {\n\t\t\t\tcase 0: {\n\t\t\t\t\tparams['classTo'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 1: {\n\t\t\t\t\tparams['classTo'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 1: {\n\t\t\t\t\tparams['classTo'] = ATTRIBUTE_CLASSES.indexOf(AttribClass.CORE_GROUP);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {SceneJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {BaseSceneDataMigrator, JsonNodeInfo} from './_Base';\nimport {JsType} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Js';\nimport {ANGLE_DEGREES} from './../../../../../../@polygonjs/polygonjs/src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsSwipeController';\n\nenum PreviousJsType {\n\tON_OBJECT_SWIPEDOWN = 'onObjectSwipedown',\n\tON_OBJECT_SWIPELEFT = 'onObjectSwipeleft',\n\tON_OBJECT_SWIPERIGHT = 'onObjectSwiperight',\n\tON_OBJECT_SWIPEUP = 'onObjectSwipeup',\n}\nconst ANGLE_BY_TYPE: Record<PreviousJsType, number> = {\n\t[PreviousJsType.ON_OBJECT_SWIPEDOWN]: ANGLE_DEGREES.DOWN,\n\t[PreviousJsType.ON_OBJECT_SWIPELEFT]: ANGLE_DEGREES.LEFT,\n\t[PreviousJsType.ON_OBJECT_SWIPERIGHT]: ANGLE_DEGREES.RIGHT,\n\t[PreviousJsType.ON_OBJECT_SWIPEUP]: ANGLE_DEGREES.UP,\n};\n\nexport class SceneDataMigrator_1_5_23 extends BaseSceneDataMigrator {\n\teditorVersion() {\n\t\treturn '1.5.23-1';\n\t}\n\tmigrateData(data: SceneJsonExporterData): SceneJsonExporterData {\n\t\tthis.traverseNodes(data, (info) => {\n\t\t\tconst type = info.node.type;\n\t\t\tswitch (type) {\n\t\t\t\tcase PreviousJsType.ON_OBJECT_SWIPEDOWN:\n\t\t\t\tcase PreviousJsType.ON_OBJECT_SWIPELEFT:\n\t\t\t\tcase PreviousJsType.ON_OBJECT_SWIPERIGHT:\n\t\t\t\tcase PreviousJsType.ON_OBJECT_SWIPEUP: {\n\t\t\t\t\treturn this._fixSwipeNode(info);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n\tprivate _fixSwipeNode(info: JsonNodeInfo) {\n\t\tconst previousType = info.node.type as PreviousJsType;\n\t\tinfo.node.type = JsType.ON_OBJECT_SWIPE;\n\t\tconst angle = ANGLE_BY_TYPE[previousType];\n\t\tinfo.node.params = info.node.params || {};\n\t\tinfo.node.params['angle'] = angle;\n\t}\n}\n","import {JsConnectionPointType} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js';\nimport {JS_CONNECTION_POINT_TYPES} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SetMaterialUniform';\nimport {JsonImporterMigrateHelper} from './../../MigrateHelper';\nimport {NodeJsonExporterData} from './../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {CoreType} from './../../../../../../../@polygonjs/polygonjs/src/core/Type';\n\nfunction SetMaterialUniform_1_2_69(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst OLD_GL_CONNECTION_POINT_TYPES: Array<JsConnectionPointType> = [\n\t\tJsConnectionPointType.INT,\n\t\tJsConnectionPointType.FLOAT,\n\t\tJsConnectionPointType.VECTOR2,\n\t\tJsConnectionPointType.VECTOR3,\n\t\tJsConnectionPointType.COLOR,\n\t\tJsConnectionPointType.VECTOR4,\n\t];\n\tconst paramsData = nodeData['params'];\n\tif (!paramsData) {\n\t\treturn;\n\t}\n\tconst paramTypeValue = paramsData['type'];\n\tif (paramTypeValue == null) {\n\t\treturn;\n\t}\n\tif (!CoreType.isNumber(paramTypeValue)) {\n\t\t// most likely will be a number\n\t\treturn;\n\t}\n\tconst oldType = OLD_GL_CONNECTION_POINT_TYPES[paramTypeValue];\n\tconst newIndex = (JS_CONNECTION_POINT_TYPES as JsConnectionPointType[]).indexOf(oldType);\n\tif (newIndex < 0) {\n\t\tconsole.warn('failed to migrate correctly actor/setMaterialUniform node');\n\t\treturn;\n\t}\n\tparamsData['type'] = newIndex;\n}\n\nexport function migrateSetMaterialUniformActorNode(\n\tnodeData: NodeJsonExporterData,\n\tmigrateHelper: JsonImporterMigrateHelper\n) {\n\tif (\n\t\tmigrateHelper.oldPolygonjsVersionLessThan('1.2.69') &&\n\t\tmigrateHelper.newVersionSuperiorThanOrEqualTo('1.2.69')\n\t) {\n\t\tSetMaterialUniform_1_2_69(nodeData, migrateHelper);\n\t}\n}\n","import {PolyDictionary} from './../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {JsonImporterMigrateHelper} from './../MigrateHelper';\nimport {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {migrateSetMaterialUniformActorNode} from './actor/SetMaterialUniform';\n\nexport function migrateActorNodeType(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst nodeType = nodeData.type;\n\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.60')) {\n\t\tconst ACTOR_NEW_TYPES: PolyDictionary<string> = {\n\t\t\tonEventChildAttributeUpdated: 'OnChildAttributeUpdate',\n\t\t\tonEventManualTrigger: 'OnManualTrigger',\n\t\t\tonEventObjectAttributeUpdated: 'OnObjectAttributeUpdate',\n\t\t\tonEventObjectClicked: 'OnObjectClick',\n\t\t\tonEventObjectHovered: 'OnObjectHover',\n\t\t\tonEventTick: 'OnTick',\n\t\t\tOnObjectPointerDown: 'OnObjectPointerdown',\n\t\t\tOnObjectPointerUp: 'OnObjectPointerup',\n\t\t\tOnPointerDown: 'OnPointerdown',\n\t\t\tOnPointerUp: 'OnPointerup',\n\t\t};\n\t\treturn ACTOR_NEW_TYPES[nodeType];\n\t}\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.69')) {\n\t\tconst ACTOR_NEW_TYPES: PolyDictionary<string> = {\n\t\t\tobjectUpdateMatrix: 'object3DUpdateMatrix',\n\t\t\tobjectUpdateWorldMatrix: 'object3DUpdateWorldMatrix',\n\t\t};\n\t\treturn ACTOR_NEW_TYPES[nodeType];\n\t}\n}\n\ntype MigrateFunction = (nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) => void;\nconst migrateFunctionByNodeType: Map<string, MigrateFunction> = new Map();\nmigrateFunctionByNodeType.set('setMaterialUniform', migrateSetMaterialUniformActorNode);\n\nexport function paramsMigrateActor(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst migrateFunction = migrateFunctionByNodeType.get(nodeData.type);\n\tif (migrateFunction) {\n\t\tmigrateFunction(nodeData, migrateHelper);\n\t}\n}\n","import {JsonImporterMigrateHelper} from './../../MigrateHelper';\nimport {NodeJsonExporterData} from './../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {ImageExtension} from './../../../../../../../@polygonjs/polygonjs/src/core/FileTypeController';\nimport {CoreBaseLoader} from './../../../../../../../@polygonjs/polygonjs/src/core/loader/_Base';\n\nimport {CopTypeImage} from './../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cop';\nexport function migrateImageCopNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst url = nodeData.params?.url as string;\n\tif (url) {\n\t\tconst ext = CoreBaseLoader.extension(url) as ImageExtension;\n\n\t\tfunction imageTypeByExt(ext: ImageExtension) {\n\t\t\tswitch (ext) {\n\t\t\t\tcase ImageExtension.EXR: {\n\t\t\t\t\treturn CopTypeImage.IMAGE_EXR;\n\t\t\t\t}\n\t\t\t\tcase ImageExtension.HDR: {\n\t\t\t\t\treturn CopTypeImage.IMAGE_HDR;\n\t\t\t\t}\n\t\t\t\tcase ImageExtension.KTX2: {\n\t\t\t\t\treturn CopTypeImage.IMAGE_KTX2;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TypeAssert.unreachable(ext);\n\t\t}\n\t\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.19')) {\n\t\t\treturn imageTypeByExt(ext);\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from './../../MigrateHelper';\nimport {NodeJsonExporterData} from './../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nexport function migrateVideoCopNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.3.7')) {\n\t\tconst url = nodeData.params?.url as string;\n\t\tif (nodeData.params && url) {\n\t\t\tnodeData.params['urlsCount'] = 1;\n\t\t\tnodeData.params['url1'] = url;\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from './../MigrateHelper';\n\nimport {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {migrateImageCopNode} from './cop/Image';\nimport {migrateVideoCopNode} from './cop/Video';\n\nexport function migrateCop(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst nodeType = nodeData.type;\n\tif (nodeType == 'imageSequence') {\n\t\treturn 'video';\n\t}\n\tswitch (nodeType) {\n\t\tcase 'image': {\n\t\t\treturn migrateImageCopNode(nodeData, migrateHelper);\n\t\t}\n\t\tcase 'video': {\n\t\t\treturn migrateVideoCopNode(nodeData, migrateHelper);\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from './../MigrateHelper';\nimport {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {PolyDictionary} from './../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nconst GL_NEW_TYPES: PolyDictionary<string> = {\n\tsubstract: 'subtract',\n\tSDFSubtraction: 'SDFSubtract',\n\tSDFIntersection: 'SDFIntersect',\n};\n\nexport function migrateGl(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst nodeType = nodeData.type;\n\tconst newType = GL_NEW_TYPES[nodeType];\n\tif (newType) {\n\t\treturn newType;\n\t}\n}\n","import {JsonImporterMigrateHelper} from '../../MigrateHelper';\nimport {NodeJsonExporterData} from '../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {PolyDictionary} from '../../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\n\nexport function migrateCSGNetworkSopNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.4.3')) {\n\t\tnodeData.type = 'subnet';\n\n\t\tconst newTypesMap: PolyDictionary<string> = {\n\t\t\tarc: 'CSGArc',\n\t\t\tboolean: 'CSGBoolean',\n\t\t\tcenter: 'CSGCenter',\n\t\t\tcircle: 'CSGCircle',\n\t\t\tcube: 'CSGBox',\n\t\t\tcylinder: 'CSGTube',\n\t\t\tcylinderElliptic: 'CSGTubeElliptic',\n\t\t\tdodecahedron: 'CSGDodecahedron',\n\t\t\tellipse: 'CSGEllipse',\n\t\t\tellipsoid: 'CSGEllipsoid',\n\t\t\texpand: 'CSGExpand',\n\t\t\textrudeLinear: 'CSGExtrudeLinear',\n\t\t\textrudeRectangular: 'CSGExtrudeRectangular',\n\t\t\textrudeRotate: 'CSGExtrudeRotate',\n\t\t\thull: 'CSGHull',\n\t\t\tline: 'CSGLine',\n\t\t\tmirror: 'CSGMirror',\n\t\t\toffset: 'CSGOffset',\n\t\t\tpolygon: 'CSGPolygon',\n\t\t\tpolyhedron: 'CSGPolyhedron',\n\t\t\tproject: 'CSGProject',\n\t\t\trectangle: 'CSGRectangle',\n\t\t\tresetTransform: 'CSGTransformReset',\n\t\t\trotate: 'transform',\n\t\t\tscale: 'transform',\n\t\t\tsphere: 'CSGSphere',\n\t\t\tstar: 'CSGStar',\n\t\t\ttorus: 'CSGTorus',\n\t\t\ttranslate: 'transform',\n\t\t\ttriangle: 'CSGTriangle',\n\t\t};\n\t\tif (nodeData.nodes) {\n\t\t\tconst currentNodeNames = Object.keys(nodeData.nodes);\n\t\t\tfor (let nodeName of currentNodeNames) {\n\t\t\t\tconst childNodeData: NodeJsonExporterData = nodeData.nodes[nodeName];\n\t\t\t\tconst childNodeType = childNodeData.type;\n\t\t\t\tconst newChildNodeType = newTypesMap[childNodeType] || childNodeType;\n\t\t\t\tchildNodeData.type = newChildNodeType;\n\t\t\t}\n\t\t}\n\n\t\treturn 'subnet';\n\t}\n}\n","import {JsonImporterMigrateHelper} from '../../MigrateHelper';\nimport {NodeJsonExporterData} from '../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\n\nexport function migrateSpotLightSopNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.3.7')) {\n\t\tconst previousDecay = 0.1;\n\t\tif (nodeData.params == null) {\n\t\t\tnodeData.params = {decay: previousDecay};\n\t\t} else {\n\t\t\tif (nodeData.params.decay == null) {\n\t\t\t\tnodeData.params.decay = 0.1;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from '../../MigrateHelper';\nimport {NodeJsonExporterData} from '../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\n\nexport function migratePointLightSopNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.3.7')) {\n\t\tconst previousDecay = 0.1;\n\t\tif (nodeData.params == null) {\n\t\t\tnodeData.params = {decay: previousDecay};\n\t\t} else {\n\t\t\tif (nodeData.params.decay == null) {\n\t\t\t\tnodeData.params.decay = 0.1;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from './../MigrateHelper';\nimport {GeometryExtension} from './../../../../../../@polygonjs/polygonjs/src/core/FileTypeController';\nimport {CoreBaseLoader} from './../../../../../../@polygonjs/polygonjs/src/core/loader/_Base';\nimport {\n\tSopExporter,\n\tSopTypeFile,\n\tSopTypeFileMulti,\n} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {NodeJsonExporterData} from './../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {LightType} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Light';\nimport {migrateCSGNetworkSopNode} from './sop/CSGNetwork';\nimport {migrateSpotLightSopNode} from './sop/SpotLight';\nimport {migratePointLightSopNode} from './sop/PointLight';\nexport function migrateSop(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst nodeType = nodeData.type;\n\tswitch (nodeType) {\n\t\tcase 'csgNetwork': {\n\t\t\treturn migrateCSGNetworkSopNode(nodeData, migrateHelper);\n\t\t}\n\t\tcase 'exporter': {\n\t\t\treturn SopExporter.EXPORTER_GLTF;\n\t\t}\n\t\tcase 'file': {\n\t\t\tconst url = nodeData.params?.url as string;\n\t\t\tif (url) {\n\t\t\t\tconst ext = CoreBaseLoader.extension(url) as GeometryExtension;\n\n\t\t\t\tfunction imageTypeByExt(ext: GeometryExtension) {\n\t\t\t\t\tswitch (ext) {\n\t\t\t\t\t\tcase GeometryExtension.DRC: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_DRC;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.FBX: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_FBX;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.GLB:\n\t\t\t\t\t\tcase GeometryExtension.GLTF: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_GLTF;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.JSON: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_JSON;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.MPD: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_MPD;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.OBJ: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_OBJ;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.PDB: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_PDB;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.PLY: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_PLY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GeometryExtension.STL: {\n\t\t\t\t\t\t\treturn SopTypeFile.FILE_STL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// TypeAssert.unreachable(ext);\n\t\t\t\t}\n\n\t\t\t\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.19')) {\n\t\t\t\t\treturn imageTypeByExt(ext);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcase 'fileMulti': {\n\t\t\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.19')) {\n\t\t\t\treturn SopTypeFileMulti.FILE_OBJ;\n\t\t\t}\n\t\t}\n\t\tcase 'svg': {\n\t\t\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.19')) {\n\t\t\t\treturn SopTypeFile.FILE_SVG;\n\t\t\t}\n\t\t}\n\t\tcase 'playerCapsule': {\n\t\t\tif (migrateHelper.oldPolygonjsVersionLessThan('1.2.19')) {\n\t\t\t\treturn 'capsule';\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch (nodeType) {\n\t\tcase LightType.SPOT: {\n\t\t\treturn migrateSpotLightSopNode(nodeData, migrateHelper);\n\t\t}\n\t\tcase LightType.POINT: {\n\t\t\treturn migratePointLightSopNode(nodeData, migrateHelper);\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from '../../MigrateHelper';\nimport {NodeJsonExporterData} from '../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\n\nexport function migrateSpotLightObjNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.3.7')) {\n\t\tconst previousDecay = 0.1;\n\t\tif (nodeData.params == null) {\n\t\t\tnodeData.params = {decay: previousDecay};\n\t\t} else {\n\t\t\tif (nodeData.params.decay == null) {\n\t\t\t\tnodeData.params.decay = 0.1;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from '../../MigrateHelper';\nimport {NodeJsonExporterData} from '../../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\n\nexport function migratePointLightObjNode(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tif (migrateHelper.oldPolygonjsVersionLessThan('1.3.7')) {\n\t\tconst previousDecay = 0.1;\n\t\tif (nodeData.params == null) {\n\t\t\tnodeData.params = {decay: previousDecay};\n\t\t} else {\n\t\t\tif (nodeData.params.decay == null) {\n\t\t\t\tnodeData.params.decay = 0.1;\n\t\t\t}\n\t\t}\n\t}\n}\n","import {JsonImporterMigrateHelper} from '../MigrateHelper';\n\nimport {NodeJsonExporterData} from '../../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {LightType} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Light';\nimport {migrateSpotLightObjNode} from './obj/SpotLight';\nimport {migratePointLightObjNode} from './obj/PointLight';\nexport function migrateObjParams(nodeData: NodeJsonExporterData, migrateHelper: JsonImporterMigrateHelper) {\n\tconst nodeType = nodeData.type;\n\n\tswitch (nodeType) {\n\t\tcase LightType.SPOT: {\n\t\t\treturn migrateSpotLightObjNode(nodeData, migrateHelper);\n\t\t}\n\t\tcase LightType.POINT: {\n\t\t\treturn migratePointLightObjNode(nodeData, migrateHelper);\n\t\t}\n\t}\n}\n","\nimport {PolyDictionary} from './../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\n\n\nexport const POST_NEW_TYPES: PolyDictionary<string> = {\n\tRGBShift: 'chromaticAberration',\n\timage: 'texture',\n\tfilm: 'noise',\n\tFXAA: 'antialiasing',\n\thorizontalBlur: 'blur',\n\ttriangleBlur: 'blur',\n\tunrealBloom: 'bloom',\n\tverticalBlur: 'blur',\n};\n","import {SceneJsonImporter} from './../../../../../@polygonjs/polygonjs/src/engine/io/json/import/Scene';\nimport {BaseNodeType} from './../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from './../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {NodeJsonExporterData} from './../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Node';\nimport {migratePostNodeBlendFunction} from './params/post';\nimport {paramsMigrateGl} from './params/gl';\nimport {versions} from './../../../../editor/versions';\nimport {SceneJsonExporterData} from './../../../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {BaseSceneDataMigrator} from './data/_Base';\n\nimport {SceneDataMigrator_1_4_8} from './data/SceneDataMigrator_1_4_8';\nimport {SceneDataMigrator_1_5_0} from './data/SceneDataMigrator_1_5_0';\nimport {SceneDataMigrator_1_5_23} from './data/SceneDataMigrator_1_5_23';\n\nimport {migrateActorNodeType, paramsMigrateActor} from './nodes/actor';\nimport {migrateCop} from './nodes/cop';\nimport {migrateGl} from './nodes/gl';\nimport {migrateSop} from './nodes/sop';\nimport {migrateObjParams} from './nodes/obj';\nimport {POST_NEW_TYPES} from './nodes/post';\n\nfunction versionStrToNum(v: string) {\n\tconst elements = v.split('.').map((e) => parseInt(e));\n\tconst a = elements[0];\n\tconst b = elements[1];\n\tconst c = elements[2];\n\treturn 1000 * a + b + c / 1000;\n}\n\nconst AVAILABLE_DATA_MIGRATOR: BaseSceneDataMigrator[] = [\n\tnew SceneDataMigrator_1_4_8(),\n\tnew SceneDataMigrator_1_5_0(),\n\tnew SceneDataMigrator_1_5_23(),\n];\n\nexport class JsonImporterMigrateHelper {\n\tpublic readonly oldPolygonjsSceneVersion: number | undefined;\n\tconstructor(public readonly sceneImporter: SceneJsonImporter) {\n\t\tconst verStr = sceneImporter.oldPolygonjsSceneVersion();\n\t\tif (verStr) {\n\t\t\tthis.oldPolygonjsSceneVersion = versionStrToNum(verStr);\n\t\t}\n\t}\n\tnewPolygonjsVersion() {\n\t\treturn versionStrToNum(versions().polygonjs);\n\t}\n\toldPolygonjsVersionLessThan(comparedVersionStr: string) {\n\t\tconst oldVersion = this.oldPolygonjsSceneVersion;\n\t\tif (oldVersion == null) {\n\t\t\treturn false;\n\t\t}\n\t\tconst comparedVersion = versionStrToNum(comparedVersionStr);\n\t\treturn oldVersion < comparedVersion;\n\t}\n\tnewVersionSuperiorThanOrEqualTo(comparedVersionStr: string) {\n\t\tconst newVersion = this.newPolygonjsVersion();\n\n\t\tconst comparedVersion = versionStrToNum(comparedVersionStr);\n\t\treturn newVersion >= comparedVersion;\n\t}\n\tmigrateData(data: SceneJsonExporterData) {\n\t\tconst dataMigrators: BaseSceneDataMigrator[] = AVAILABLE_DATA_MIGRATOR.filter((dataMigrator) => {\n\t\t\tconst migratorVersion = versionStrToNum(dataMigrator.editorVersion());\n\t\t\tif (!this.oldPolygonjsSceneVersion) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.oldPolygonjsSceneVersion < migratorVersion && this.newPolygonjsVersion() >= migratorVersion;\n\t\t});\n\t\tfor (const dataMigrator of dataMigrators) {\n\t\t\tconsole.log(`migrating data from ${dataMigrator.editorVersion()}`);\n\t\t\tdata = dataMigrator.migrateData(data);\n\t\t}\n\t\treturn data;\n\t}\n\n\tmigrateNodeType(parentNode: BaseNodeType, nodeData: NodeJsonExporterData) {\n\t\tconst nodeType = nodeData.type;\n\t\tconst context = parentNode.childrenControllerContext() as NodeContext | string;\n\t\tswitch (context) {\n\t\t\tcase 'actor':\n\t\t\tcase NodeContext.JS: {\n\t\t\t\treturn migrateActorNodeType(nodeData, this) || nodeType;\n\t\t\t}\n\t\t\tcase NodeContext.COP: {\n\t\t\t\treturn migrateCop(nodeData, this) || nodeType;\n\t\t\t}\n\t\t\tcase NodeContext.GL: {\n\t\t\t\treturn migrateGl(nodeData, this) || nodeType;\n\t\t\t}\n\t\t\t// case NodeContext.OBJ: {\n\t\t\t// \treturn migrateObj(nodeData, this); // || nodeType;\n\t\t\t// }\n\t\t\tcase NodeContext.SOP: {\n\t\t\t\treturn migrateSop(nodeData, this) || nodeType;\n\t\t\t}\n\t\t\tcase NodeContext.POST: {\n\t\t\t\treturn POST_NEW_TYPES[nodeType] || nodeType;\n\t\t\t}\n\t\t}\n\t\treturn nodeType;\n\t}\n\tmigrateParams(parentNode: BaseNodeType, nodeData: NodeJsonExporterData) {\n\t\tconst context = parentNode.childrenControllerContext() as NodeContext | string;\n\t\tswitch (context) {\n\t\t\tcase 'actor':\n\t\t\tcase NodeContext.JS: {\n\t\t\t\treturn paramsMigrateActor(nodeData, this);\n\t\t\t}\n\t\t\tcase NodeContext.GL: {\n\t\t\t\treturn paramsMigrateGl(nodeData, this);\n\t\t\t}\n\t\t\tcase NodeContext.OBJ: {\n\t\t\t\treturn migrateObjParams(nodeData, this);\n\t\t\t}\n\t\t\tcase NodeContext.POST: {\n\t\t\t\tif (this.oldPolygonjsVersionLessThan('1.2.11')) {\n\t\t\t\t\treturn migratePostNodeBlendFunction(nodeData, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../_Base';\nimport {NodeUIDataJson} from './UIData';\nimport {BaseConnectionPointData} from './io/connections/_Base';\nimport {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\n\nexport interface NodeSerializerData {\n\tname: string;\n\ttype: string;\n\tgraph_node_id: CoreGraphNodeId;\n\tis_dirty: boolean;\n\tui_data_json: NodeUIDataJson;\n\terror_message: string | undefined;\n\tchildren: CoreGraphNodeId[];\n\tmaxInputsCount: number;\n\tinputs: Readonly<Array<CoreGraphNodeId | undefined>>;\n\tinput_connection_output_indices: Readonly<Array<number | undefined>> | undefined;\n\tnamed_input_connection_points: Readonly<BaseConnectionPointData[]>;\n\tnamed_output_connection_points: Readonly<BaseConnectionPointData[]>;\n\tparam_ids: CoreGraphNodeId[];\n\t// spare_params: PolyDictionary<string>;\n\toverride_cloned_state_allowed: boolean;\n\tinputs_clone_required_states: boolean | boolean[];\n\tflags?: {\n\t\t//has_display: this.has_display_flag()\n\t\tdisplay?: boolean;\n\t\tbypass?: boolean;\n\t\toptimize?: boolean;\n\t};\n\tselection?: CoreGraphNodeId[];\n\tpolyNode?: {\n\t\tlocked: boolean;\n\t};\n}\n\nexport class CoreNodeSerializer {\n\tconstructor(protected node: BaseNodeType) {}\n\n\tdispose() {}\n\n\ttoJSON(includeParamComponents: boolean = false): NodeSerializerData {\n\t\tconst data: NodeSerializerData = {\n\t\t\tname: this.node.name(),\n\t\t\ttype: this.node.type(),\n\t\t\tgraph_node_id: this.node.graphNodeId(),\n\t\t\tis_dirty: this.node.isDirty(),\n\t\t\tui_data_json: this.node.uiData.toJSON(),\n\t\t\terror_message: this.node.states.error.message(),\n\t\t\tchildren: this.childrenIds(),\n\t\t\tmaxInputsCount: this.maxInputsCount(),\n\t\t\tinputs: this.inputIds(),\n\t\t\tinput_connection_output_indices: this.inputConnectionOutputIndices(),\n\t\t\tnamed_input_connection_points: this.namedInputConnectionPoints() || [],\n\t\t\tnamed_output_connection_points: this.namedOutputConnectionPoints() || [],\n\t\t\tparam_ids: this.to_json_params(includeParamComponents),\n\t\t\t// spare_params: this.to_json_spare_params(include_param_components),\n\t\t\toverride_cloned_state_allowed: this.node.io.inputs.overrideClonedStateAllowed(),\n\t\t\tinputs_clone_required_states: this.node.io.inputs.cloneRequiredStates(),\n\t\t\tflags: {\n\t\t\t\t//has_display: this.has_display_flag()\n\t\t\t\tdisplay: this.node.flags?.display?.active(),\n\t\t\t\tbypass: this.node.flags?.bypass?.active(),\n\t\t\t\toptimize: this.node.flags?.optimize?.active(),\n\t\t\t},\n\t\t\tselection: undefined as CoreGraphNodeId[] | undefined,\n\t\t};\n\n\t\tif (this.node.childrenAllowed() && this.node.childrenController) {\n\t\t\tconst selectedNodeIds: number[] = [];\n\t\t\tthis.node.childrenController.selection.toJSON(selectedNodeIds);\n\t\t\tdata['selection'] = selectedNodeIds;\n\t\t}\n\t\tif (this.node.polyNodeController) {\n\t\t\tdata['polyNode'] = {\n\t\t\t\tlocked: this.node.polyNodeController.locked(),\n\t\t\t};\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tchildrenIds() {\n\t\treturn this.node.children().map((node) => node.graphNodeId());\n\t}\n\n\tmaxInputsCount() {\n\t\treturn this.node.io.inputs.maxInputsCount();\n\t}\n\n\tinputIds(): Readonly<(CoreGraphNodeId | undefined)[]> {\n\t\treturn this.node.io.inputs.inputs().map((node) => (node != null ? node.graphNodeId() : undefined));\n\t}\n\n\tinputConnectionOutputIndices(): Readonly<(number | undefined)[]> | undefined {\n\t\treturn this.node.io.connections\n\t\t\t.inputConnections()\n\t\t\t?.map((connection) => (connection != null ? connection.outputIndex() : undefined));\n\t}\n\tnamedInputConnectionPoints(): Readonly<BaseConnectionPointData[]> {\n\t\treturn (this.node.io.inputs.namedInputConnectionPoints() || []).map((i) => i.toJSON());\n\t}\n\tnamedOutputConnectionPoints(): Readonly<BaseConnectionPointData[]> {\n\t\treturn (this.node.io.outputs.namedOutputConnectionPoints() || []).map((o) => o.toJSON());\n\t}\n\n\tto_json_params_from_names(param_names: string[], include_components: boolean = false) {\n\t\treturn param_names.map((param_name) => {\n\t\t\treturn this.node.params.get(param_name)!.graphNodeId();\n\t\t});\n\t\t// const params_json_by_name: PolyDictionary<string> = {};\n\t\t// for (let param_name of param_names) {\n\t\t// \tconst param = this.node.params.get(param_name);\n\t\t// \tif (param) {\n\t\t// \t\tparams_json_by_name[param_name] = param.graphNodeId();\n\n\t\t// \t\tif (include_components && param.isMultiple() && param.components) {\n\t\t// \t\t\tfor (let component of param.components) {\n\t\t// \t\t\t\tparams_json_by_name[component.name] = component.graphNodeId();\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\t\t// return params_json_by_name;\n\t}\n\tto_json_params(include_components: boolean = false) {\n\t\treturn this.to_json_params_from_names(this.node.params.names, include_components);\n\t}\n\t// to_json_params_without_components(){\n\t// \treturn this.to_json_params(false)\n\t// }\n\t// to_json_params_with_components(){\n\t// \treturn this.to_json_params(true)\n\t// }\n\t// to_json_spare_params(include_components: boolean = false) {\n\t// \treturn this.to_json_params_from_names(this.node.params.spare_names, include_components);\n\t// }\n}\n","import {CoreGraphNodeId} from '../../../core/graph/CoreGraph';\nimport {TypedParam} from '../_Base';\nimport {\n\tParamValueSerializedTypeMap,\n\tParamValuePreConversionSerializedTypeMap,\n} from '../types/ParamValueSerializedTypeMap';\nimport {ParamType} from '../../poly/ParamType';\nimport {ParamInitValueSerializedTypeMap} from '../types/ParamInitValueSerializedTypeMap';\n\nexport interface ParamSerializerData<T extends ParamType> {\n\tname: string;\n\ttype: T;\n\traw_input: ParamInitValueSerializedTypeMap[T];\n\tvalue: ParamValueSerializedTypeMap[T];\n\tvalue_pre_conversion: ParamValuePreConversionSerializedTypeMap[T];\n\texpression?: string;\n\tgraph_node_id: CoreGraphNodeId;\n\t// is_dirty: boolean;\n\terror_message?: string;\n\tis_visible: boolean;\n\teditable: boolean;\n\tfolder_name?: string;\n\tcomponents?: Readonly<CoreGraphNodeId[]>;\n}\n\nexport class CoreParamSerializer<T extends ParamType> {\n\tconstructor(public readonly param: TypedParam<T>) {}\n\n\ttoJSON(): ParamSerializerData<T> {\n\t\tconst data: ParamSerializerData<T> = {\n\t\t\tname: this.param.name(),\n\t\t\ttype: this.param.type(),\n\t\t\traw_input: this.rawInput(),\n\t\t\tvalue: this.value(),\n\t\t\tvalue_pre_conversion: this.value_pre_conversion(),\n\t\t\texpression: this.expression(),\n\t\t\tgraph_node_id: this.param.graphNodeId(),\n\t\t\t// is_dirty: this.param.isDirty(),\n\t\t\terror_message: this.error_message(),\n\t\t\tis_visible: this.is_visible(),\n\t\t\teditable: this.editable(),\n\t\t\t// folder_name: this.param.uiData.folder_name,\n\t\t\tcomponents: undefined,\n\t\t};\n\n\t\tif (this.param.isMultiple() && this.param.components) {\n\t\t\tdata['components'] = this.param.components.map((component) => component.graphNodeId());\n\t\t}\n\n\t\treturn data;\n\t}\n\n\trawInput() {\n\t\treturn this.param.rawInputSerialized();\n\t}\n\tvalue() {\n\t\treturn this.param.valueSerialized();\n\t}\n\tvalue_pre_conversion() {\n\t\treturn this.param.valuePreConversionSerialized();\n\t}\n\texpression() {\n\t\treturn this.param.hasExpression() ? this.param.expressionController?.expression() : undefined;\n\t}\n\terror_message() {\n\t\treturn this.param.states.error.message();\n\t}\n\tis_visible() {\n\t\treturn this.param.options.isVisible();\n\t}\n\teditable() {\n\t\treturn this.param.options.editable();\n\t}\n}\n\nexport type BaseParamSerializer = typeof CoreParamSerializer<ParamType>;\n","// import {EditorProps} from '../editor/types';\n// import {AppLoader} from './AppLoader';\nimport {SceneData} from '../editor/types';\nimport {\n\t// App,\n\t// ComponentPublicInstance,\n\t// ComponentOptionsBase,\n\tref,\n} from 'vue';\nimport {JsonImporterMigrateHelper} from '../engine/io/json/import/MigrateHelper';\nimport {FeaturesController} from '../editor/core/FeaturesController';\nimport {FigmaPluginController} from '../plugins/figma/FigmaPluginController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\nimport {SceneJsonImporter} from '../../@polygonjs/polygonjs/src/engine/io/json/import/Scene';\nimport {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {CoreAutoLayout} from '../editor/core/AutoLayout';\nimport {OnProgressArguments} from './../../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/LoadProgress';\nimport {AVAILABLE_LINK_INDEX_VALUES} from '../editor/components/panels/common/LinkIndex';\nimport {SceneJsonExporterData} from '../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {Poly} from '../../@polygonjs/polygonjs/src/engine/Poly';\nimport {EditorLayoutData, EditorPropsLegacy} from '../editor/types';\nimport {ExamplesRegisterAsync} from '../engine/examples/ExamplesRegisterAsync';\nimport {AppConfig} from './AppConfig';\nimport {Example} from './../engine/examples/Example';\nimport {OnAfterExampleLoaded, exampleNameToId} from '../engine/examples/Common';\nimport {examplePath, router} from '../routes';\nimport {Editor} from '../editor/Editor';\nimport {CoreNodeSerializer} from '../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {CoreParamSerializer} from '../../@polygonjs/polygonjs/src/engine/params/utils/CoreParamSerializer';\n\nexport interface LoadSceneData {\n\tscene_code: SceneJsonExporterData;\n\teditor_data: EditorLayoutData;\n\tsceneName: string | null;\n}\nexport interface WrappedLoadData {\n\terror?: string;\n\tsceneData?: LoadSceneData;\n}\n\ntype LoadSceneDataCallback = (sceneName: string | null) => Promise<SceneData | undefined>;\ntype OnSceneCreatedCallback = (scene: PolyScene) => Promise<void>;\n// type OnSceneReadyCallback = (scene: PolyScene) => Promise<void>;\n\n// interface AppSceneLoaderOptions {\n// \teditorProps: EditorProps;\n// \tloadSceneCallback: LoadSceneData;\n// }\n// type RegisterResolve = () => void;\nexport class AppSceneLoaderClass {\n\tprivate static _instance: AppSceneLoaderClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new AppSceneLoaderClass());\n\t}\n\tprivate constructor() {}\n\n\tprivate __loadSceneDataCallback__: LoadSceneDataCallback | undefined;\n\tprivate _onSceneCreatedCallback: OnSceneCreatedCallback | undefined;\n\tprivate _sceneLoadedFromExample = ref(false);\n\tprivate _scene: PolyScene | undefined;\n\tprivate _example: Example | undefined;\n\tprivate _scenePersisted = ref(false);\n\tprivate _sceneUpdateAllowed = ref(false);\n\tprivate _onlyASingleScenePerPage = true;\n\n\tsetLoadSceneDataCallback(callback: LoadSceneDataCallback) {\n\t\tthis.__loadSceneDataCallback__ = callback;\n\t}\n\tsetOnSceneCreatedCallback(callback: OnSceneCreatedCallback) {\n\t\tthis._onSceneCreatedCallback = callback;\n\t}\n\tsetOnlyASingleScenePerPage(state: boolean) {\n\t\tthis._onlyASingleScenePerPage = state;\n\t}\n\tonlyASingleScenePerPage() {\n\t\treturn this._onlyASingleScenePerPage;\n\t}\n\n\tsceneLoadedFromExample() {\n\t\treturn this._sceneLoadedFromExample.value;\n\t}\n\tmarkScenePersisted(state: boolean) {\n\t\tthis._scenePersisted.value = state;\n\t}\n\tmarkSceneUpdateAllowed(state: boolean) {\n\t\tthis._sceneUpdateAllowed.value = state;\n\t}\n\tscene() {\n\t\treturn this._scene;\n\t}\n\tscenePersisted(): boolean {\n\t\treturn this._scenePersisted.value || this._scene?.uuid != null;\n\t}\n\tsceneUpdateAllowed(): boolean {\n\t\treturn this._sceneUpdateAllowed.value;\n\t}\n\texample() {\n\t\treturn this._example;\n\t}\n\tprivate async _loadSceneData(sceneName: string | null): Promise<SceneData | undefined> {\n\t\tif (FigmaPluginController.active()) {\n\t\t\tconst data = await FigmaPluginController.loadSceneData(sceneName);\n\t\t\tif (data) {\n\t\t\t\tconst {sceneData, layoutData} = data;\n\t\t\t\tAppConfig.setEditorLayoutData(layoutData);\n\t\t\t\treturn sceneData;\n\t\t\t}\n\t\t}\n\t\tif (this.__loadSceneDataCallback__) {\n\t\t\treturn await this.__loadSceneDataCallback__(sceneName);\n\t\t} else {\n\t\t\tconsole.error('no scene load callback defined');\n\t\t}\n\t}\n\tasync loadSceneFromSceneName(sceneName: string | null) {\n\t\tconst sceneData = await this._loadSceneData(sceneName);\n\t\tif (sceneData) {\n\t\t\tconst scene = await this._sceneFromSceneData(sceneData);\n\t\t\tif (!scene) {\n\t\t\t\tconsole.error('failed to load scene');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._postLoadScene(scene);\n\t\t\tif (this._onSceneCreatedCallback) {\n\t\t\t\tawait this._onSceneCreatedCallback(scene);\n\t\t\t}\n\t\t\tthis._sceneLoadedFromExample.value = false;\n\t\t\treturn scene;\n\t\t}\n\t}\n\tasync loadSceneFromExampleId(exampleId: string) {\n\t\tconst example = (await ExamplesRegisterAsync()).exampleFromId(exampleId);\n\t\tthis._example = example;\n\t\tif (!example) {\n\t\t\tconsole.error('example not found:', exampleId);\n\t\t\treturn;\n\t\t}\n\n\t\tconst scene = await this._sceneFromExample(example);\n\t\tthis._sceneLoadedFromExample.value = true;\n\t\tthis._postLoadScene(scene);\n\t\tthis.markScenePersisted(false);\n\t\tthis.markSceneUpdateAllowed(true);\n\t\treturn scene;\n\t}\n\n\tprivate _postLoadScene(scene?: PolyScene) {\n\t\tthis._scene = scene;\n\n\t\tif (!scene) {\n\t\t\talert('EDITOR LOAD ERROR');\n\t\t\treturn;\n\t\t}\n\n\t\tif (scene) {\n\t\t\tStoreController.setScene(scene);\n\t\t}\n\t\t// this is just useful to debug in the console\n\t\t(window as any).scene = scene;\n\t\t(window as any).POLY = Poly;\n\n\t\tEditor.instance().api.html.head.updateCurrentPage();\n\t\tFeaturesController.createDefinedVariables();\n\n\t\t// configureScene is ran after StoreController.set_scene\n\t\t// so that if scene.play() is called in configureScene\n\t\t// the editor will update the UI accordingly\n\t\t// UPDATE: I need to run configureScene before,\n\t\t// as otherwise the scene.assets.root()\n\t\t// is not taken into account by the assets loaders.\n\t\t// A solution for the UI to update accordingly,\n\t\t// could simply be for it to check the state of the scene when calling set_scene()\n\t\t// const configureScene = window.__POLYGONJS_POLY_CONFIG_CONFIGURE_SCENE;\n\t\t// if (configureScene) {\n\t\t// \tconfigureScene(scene);\n\t\t// }\n\n\t\tconst props = AppConfig.editorProps();\n\t\tlet navigationHistory = props.navigationHistory;\n\t\tlet navigationHistoryUsed = false;\n\t\tif (navigationHistory) {\n\t\t\ttry {\n\t\t\t\tStoreController.editor.navigationHistory.fromJSON(navigationHistory);\n\t\t\t\tnavigationHistoryUsed = true;\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not parse navigationHistory');\n\t\t\t\tconsole.log(navigationHistory);\n\t\t\t}\n\t\t}\n\t\tif (!navigationHistoryUsed) {\n\t\t\tlet currentNodes = props.currentNodes;\n\t\t\tif (!currentNodes) {\n\t\t\t\tcurrentNodes = [props.current_node || '/'];\n\t\t\t}\n\t\t\tlet cmptr = 0;\n\t\t\tlet lastCurrentNode = currentNodes[cmptr];\n\t\t\tfor (let index = 0; index < AVAILABLE_LINK_INDEX_VALUES.length; index++) {\n\t\t\t\tconst currentNode = currentNodes[cmptr] || lastCurrentNode;\n\t\t\t\tconst node = scene.node(currentNode);\n\t\t\t\tif (node) {\n\t\t\t\t\tStoreController.editor.setCurrentNode(AVAILABLE_LINK_INDEX_VALUES[index], node);\n\t\t\t\t} else {\n\t\t\t\t\t// console.warn(`node '${currentNode}' not found for index '${index}'`);\n\t\t\t\t}\n\t\t\t\tcmptr++;\n\t\t\t\tlastCurrentNode = currentNode;\n\t\t\t}\n\t\t}\n\n\t\tlet fullscreenPanelId = props.fullscreenPanelId;\n\t\tif (fullscreenPanelId == null) {\n\t\t\tfullscreenPanelId = (props as EditorPropsLegacy).fullscreen_panel_id;\n\t\t}\n\t\tif (fullscreenPanelId) {\n\t\t\tStoreController.editor.panel.setFullscreenPanelId(fullscreenPanelId);\n\t\t}\n\t\tStoreController.editor.preferences.setFromEditor(props);\n\t\tStoreController.editor.paramsModals.setFromEditor(props);\n\t}\n\n\tprotected async _sceneFromSceneData(sceneData: SceneData) {\n\t\tconst configureScene = window.__POLYGONJS_POLY_CONFIG_CONFIGURE_SCENE;\n\t\t// const LOAD_SCENE_WITH_POTENTIAL_LOCK = false;\n\t\tconst _loadSceneWithoutLock = async () => {\n\t\t\tconst importer = new SceneJsonImporter(sceneData.json, {\n\t\t\t\tconfigureScene,\n\t\t\t\tsceneName: sceneData.name,\n\t\t\t\tmeasurePerformanceOnLoad: FeaturesController.measurePerformanceOnLoad(),\n\t\t\t});\n\t\t\timporter.setMigrateHelper(new JsonImporterMigrateHelper(importer));\n\t\t\tconst scene = await importer.scene({\n\t\t\t\tnodeSerializerClass: CoreNodeSerializer,\n\t\t\t\tparamsSerializerClass: CoreParamSerializer,\n\t\t\t});\n\t\t\treturn {scene, importer};\n\t\t};\n\t\t// const _loadSceneWithPotentialLock = async () => {\n\t\t// \tconst result = await ScenePlayerImporter.loadSceneData({\n\t\t// \t\tsceneData: sceneData.json,\n\t\t// \t\tsceneName: sceneData.name || 'unnamed',\n\t\t// \t\tautoPlay: true,\n\t\t// \t});\n\t\t// \treturn result;\n\t\t// };\n\t\t// const {scene, importer} = LOAD_SCENE_WITH_POTENTIAL_LOCK\n\t\t// \t? await _loadSceneWithPotentialLock()\n\t\t// \t: await _loadSceneWithougLock();\n\t\tconst {scene, importer} = await _loadSceneWithoutLock();\n\t\tif (sceneData.uuid) {\n\t\t\tscene.setUuid(sceneData.uuid);\n\t\t}\n\t\tif (!importer) {\n\t\t\tconsole.error('importer not found');\n\t\t\treturn;\n\t\t}\n\t\tAppConfig.setEditorPropsWarnings(importer.report.warnings());\n\t\t// props.scene_load_warnings = importer.report.warnings();\n\t\t// readonly\n\t\tconst sceneReadonly = importer.report.readonly();\n\t\tconst loadedWithoutAssemblers = importer.report.loadedWithoutAssemblers();\n\t\tif (sceneReadonly) {\n\t\t\tStoreController.editor.readonly.markAsReadonly();\n\t\t}\n\t\tif (loadedWithoutAssemblers) {\n\t\t\tStoreController.editor.readonly.markAsLoadedWithoutAssemblers();\n\t\t}\n\t\treturn scene;\n\t}\n\tprivate _onAfterLoaded: OnAfterExampleLoaded | undefined;\n\tprotected async _sceneFromExample(example: Example) {\n\t\tconsole.log(`>>> loading example '${example.name()}'`);\n\t\t// make sure to set loading mode, as well as cooker block/unblock\n\t\tconst scene = new PolyScene({\n\t\t\troot: {serializerClass: CoreNodeSerializer},\n\t\t\tparamsSerializerClass: CoreParamSerializer,\n\t\t});\n\t\t// scene.setName(exampleId); // scene is not saved, and therefore should not have a name\n\t\tdocument.title = example.name();\n\t\tscene.setName(example.name());\n\t\tthis._sceneLoadedFromExample.value = true;\n\t\tscene.loadingController.markAsLoading();\n\t\tscene.cooker.block();\n\t\tconst {focusedNodes, autoLayout, playWhenLoaded, cameraPath, onAfterLoaded} = await example.data({\n\t\t\tscene,\n\t\t\tEditor,\n\t\t});\n\t\tscene.root().mainCameraController.setCameraPath(cameraPath);\n\n\t\tlet doPlayWhenloaded = playWhenLoaded;\n\t\tif (doPlayWhenloaded == null) {\n\t\t\tdoPlayWhenloaded = false;\n\t\t}\n\t\tscene.loadingController.markAsLoaded();\n\t\tscene.cooker.unblock();\n\t\tif (doPlayWhenloaded) {\n\t\t\tasync function _waitForSceneLoad(): Promise<void> {\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\tscene\n\t\t\t\t\t\t.root()\n\t\t\t\t\t\t.loadProgress.watchNodesProgress((nodesCookProgress: number, args: OnProgressArguments) => {\n\t\t\t\t\t\t\tif (nodesCookProgress == 1) {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait _waitForSceneLoad();\n\t\t\tif (onAfterLoaded) {\n\t\t\t\tthis._onAfterLoaded = onAfterLoaded;\n\t\t\t}\n\t\t\tscene.play();\n\t\t}\n\t\tconst props = AppConfig.editorProps();\n\n\t\t// current node\n\t\tlet currentNodePath = undefined;\n\t\tconst firstNode = focusedNodes ? focusedNodes[0] : undefined;\n\t\tif (firstNode) {\n\t\t\tconst parent = firstNode.parent();\n\t\t\tif (parent) {\n\t\t\t\tcurrentNodePath = parent.path();\n\t\t\t\tprops.current_node = currentNodePath;\n\t\t\t\tprops.currentNodes = undefined;\n\t\t\t\tprops.navigationHistory = undefined;\n\t\t\t\tif (focusedNodes) {\n\t\t\t\t\tparent.childrenController?.selection.set(focusedNodes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// auto layout\n\t\tlet doAutoLayout = autoLayout;\n\t\tif (doAutoLayout == null) {\n\t\t\tdoAutoLayout = false;\n\t\t}\n\t\tif (doAutoLayout) {\n\t\t\tconst autoLayout = new CoreAutoLayout();\n\t\t\tautoLayout.traverseScene(scene);\n\t\t}\n\t\t// we need to remove the init_layout_data\n\t\t// in case it contains a viewer data which would try and load a non existing camera.\n\t\t// That said, this removal could be more targeted toward the viewers only.\n\t\t// Or it may also be good to leave it like this, as the whole layout\n\t\t// may be undesirable for the demo scene\n\t\tprops.init_layout_data = undefined;\n\n\t\treturn scene;\n\t}\n\trunAfterLoad() {\n\t\tif (this._onAfterLoaded) {\n\t\t\tthis._onAfterLoaded();\n\t\t}\n\t}\n\n\tredirectLegacyExampleId() {\n\t\t// redirects legacy url\n\t\t// ?example=bynode/actor/animationmixer/onsceneplay\n\t\t// to the current one\n\t\t// /examples/:id\n\t\tconst legacyExampleId = FeaturesController.legacyExampleId();\n\t\tif (legacyExampleId) {\n\t\t\tconst exampleId = exampleNameToId(legacyExampleId);\n\t\t\trouter.replace(examplePath(exampleId));\n\t\t}\n\t}\n}\n\nexport const AppSceneLoader = AppSceneLoaderClass.instance();\n","import {Route} from '../../npm_module/NpmModuleTypes';\nexport enum ApiName {\n\tINDEX = '',\n\tPolyScene = 'PolyScene',\n\tTypedViewer = 'TypedViewer',\n\tThreejsViewer = 'ThreejsViewer',\n\tTypedNode = 'TypedNode',\n\tTypedAnimNode = 'TypedAnimNode',\n\tTypedAudioNode = 'TypedAudioNode',\n\tTypedCopNode = 'TypedCopNode',\n\tTypedEventNode = 'TypedEventNode',\n\tTypedGlNode = 'TypedGlNode',\n\tTypedJsNode = 'TypedJsNode',\n\tTypedMatNode = 'TypedMatNode',\n\tTypedObjNode = 'TypedObjNode',\n\tTypedPostNode = 'TypedPostNode',\n\tTypedRopNode = 'TypedRopNode',\n\tTypedSopNode = 'TypedSopNode',\n\tCoreGraphNode = 'CoreGraphNode',\n}\n\nexport const CHILD_API_NAMES: ApiName[] = [\n\tApiName.PolyScene,\n\tApiName.TypedViewer,\n\tApiName.ThreejsViewer,\n\tApiName.TypedNode,\n\tApiName.TypedAnimNode,\n\tApiName.TypedAudioNode,\n\tApiName.TypedCopNode,\n\tApiName.TypedEventNode,\n\tApiName.TypedGlNode,\n\tApiName.TypedJsNode,\n\tApiName.TypedMatNode,\n\tApiName.TypedObjNode,\n\tApiName.TypedPostNode,\n\tApiName.TypedRopNode,\n\tApiName.TypedSopNode,\n\tApiName.CoreGraphNode,\n];\n\nexport const API_NAMES: ApiName[] = [ApiName.INDEX].concat(CHILD_API_NAMES);\n\nexport function apiRoute(apiName: ApiName) {\n\treturn `api/${apiName}`;\n}\nexport function docsApiRoute(apiName: ApiName) {\n\treturn `${Route.DOCS}/${apiRoute(apiName)}`;\n}\n","import {PolyDictionary} from '../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {RouteLocationNormalizedLoaded} from 'vue-router';\nimport {CHILD_API_NAMES, ApiName, apiRoute} from '../api/Common';\nimport {MDXProps} from 'mdx/types';\nexport type JSXPageGenerator = (props: MDXProps) => JSX.Element;\n\nconst PageAssetsSupportedFiles = () => import('./mdx/assets/SupportedFiles.vue');\nconst DocsApi = () => import('../api/Api.vue');\n\nexport const MDX_PATH: Record<string, string> = {\n\tapi: 'api/index',\n\tassets: 'assets/index',\n\teditor: 'editor/index',\n\texport: 'export/index',\n\tinstall: 'install/index',\n\tintegrations: 'integrations/index',\n\tplugins: 'plugins/index',\n\tresources: 'resources/index',\n\ttutorials: 'tutorials/index',\n};\nexport async function importMDX(resolvedPageName: string, route?: RouteLocationNormalizedLoaded) {\n\tconst templatePath = MDX_PATH[resolvedPageName] || resolvedPageName || 'index';\n\tif (!templatePath) {\n\t\tconsole.warn('no template path found ', route?.path, route?.name);\n\t\treturn;\n\t}\n\ttry {\n\t\tconst imported = await import(`./mdx/${templatePath}.mdx`);\n\t\treturn imported;\n\t} catch (err) {}\n}\n\nexport enum DocsRoute {\n\t//\n\tINDEX = '',\n\tYOUR_FIRST_SCENE = 'your_first_scene',\n\tINSTALL = 'install',\n\tINSTALL_NEW_PROJECT = 'install/new',\n\tINSTALL_ADD_TO_EXISTING_PROJECT = 'install/add',\n\t//\n\tEXPORT = 'export',\n\tEXPORT_ONLINE = 'export/online',\n\tEXPORT_LOCAL = 'export/local',\n\t//\n\tUPGRADE = 'upgrade',\n\t//\n\tEDITOR = 'editor',\n\tEDITOR_PANEL_NETWORK = 'editor/network',\n\tEDITOR_PANEL_VIEWER = 'editor/viewer',\n\tEDITOR_PANEL_PARAMS = 'editor/params',\n\tEDITOR_PANEL_SCENE_TREE = 'editor/scenetree',\n\tEDITOR_PANEL_SPREADSHEET = 'editor/spreadsheet',\n\tEDITOR_PANEL_PERFORMANCE = 'editor/performance',\n\tEDITOR_PANEL_CODE_PREVIEW = 'editor/codepreview',\n\tEDITOR_CONFIG = 'editor/config',\n\tCOPY_PASTE = 'editor/copy_paste',\n\t//\n\tNODES = 'nodes',\n\tNODE_CONTEXT = 'nodes/:context',\n\tNODE = 'nodes/:context/:type',\n\t//\n\tEXPRESSIONS = 'expressions',\n\tEXPRESSION = 'expressions/:expressionName',\n\t//\n\tEXAMPLES = 'examples',\n\t// EXAMPLE = 'examples/:id', //\n\tEXAMPLES_CATEGORY = 'examples-category/:category',\n\t//\n\tPLUGINS_INDEX = 'plugins',\n\tPLUGINS_IFC = 'plugins/ifc',\n\tPLUGINS_MAPBOX = 'plugins/mapbox',\n\tPLUGINS_MARKER_TRACKING = 'plugins/marker-tracking',\n\tPLUGINS_OCCLUSION = 'plugins/occlusion',\n\tPLUGINS_TRACE = 'plugins/trace',\n\t//\n\t// API_INDEX = 'api',\n\t// API_PAGE_POLY_SCENE = 'api/PolyScene',\n\t// API_PAGE_TYPED_VIEWER = 'api/TypedViewer',\n\t// API_PAGE_THREEJS_VIEWER = 'api/ThreejsViewer',\n\t// API_PAGE_TYPED_NODE = 'api/TypedNode',\n\t// API_PAGE_TYPED_ACTOR_NODE = 'api/TypedActorNode',\n\t// API_PAGE_TYPED_ANIM_NODE = 'api/TypedAnimNode',\n\t// API_PAGE_TYPED_AUDIO_NODE = 'api/TypedAudioNode',\n\t// API_PAGE_TYPED_COP_NODE = 'api/TypedCopNode',\n\t// API_PAGE_TYPED_CSG_NODE = 'api/TypedCsgNode',\n\t// API_PAGE_TYPED_EVENT_NODE = 'api/TypedEventNode',\n\t// API_PAGE_TYPED_GL_NODE = 'api/TypedGlNode',\n\t// API_PAGE_TYPED_MAT_NODE = 'api/TypedMatNode',\n\t// API_PAGE_TYPED_OBJ_NODE = 'api/TypedObjNode',\n\t// API_PAGE_TYPED_POST_NODE = 'api/TypedPostNode',\n\t// API_PAGE_TYPED_ROP_NODE = 'api/TypedRopNode',\n\t// API_PAGE_TYPED_SOP_NODE = 'api/TypedSopNode',\n\t// API_PAGE_CORE_GRAPH_NODE = 'api/CoreGraphNode',\n\t//\n\tTUTORIALS_INDEX = 'tutorials',\n\tTUTORIAL_PAGE = 'tutorials/:id',\n\t//\n\tINTEGRATIONS_INDEX = 'integrations',\n\tINTEGRATION_PAGE_VUE = 'integrations/vue',\n\tINTEGRATION_PAGE_REACT = 'integrations/react',\n\tINTEGRATION_PAGE_REACT_THREE_FIBER = 'integrations/react_three_fiber',\n\tINTEGRATION_PAGE_THREEJS = 'integrations/threejs',\n\tINTEGRATION_PAGE_THREEJS_STEP_BY_STEP = 'integrations/threejs/stepbystep',\n\tINTEGRATION_PAGE_WEBFLOW = 'integrations/webflow',\n\tINTEGRATION_PAGE_MAPBOX = 'integrations/mapbox',\n\tINTEGRATION_PAGE_FX_HASH = 'integrations/fxhash',\n\tINTEGRATION_PAGE_GIT = 'integrations/git',\n\tINTEGRATION_PAGE_S3 = 'integrations/s3',\n\tINTEGRATION_PAGE_WORDPRESS = 'integrations/wordpress',\n\t//\n\tRESOURCES_INDEX = 'resources',\n\tRESOURCES_PAGE_API = 'resources/api',\n\tRESOURCES_PAGE_AUDIO = 'resources/audio',\n\tRESOURCES_PAGE_DESIGN = 'resources/design',\n\tRESOURCES_PAGE_FORUMS = 'resources/forums',\n\tRESOURCES_PAGE_MATERIALS = 'resources/materials',\n\tRESOURCES_PAGE_MODELS = 'resources/models',\n\tRESOURCES_PAGE_SITE_BUILDERS = 'resources/site_builders',\n\tRESOURCES_PAGE_TEXTURES = 'resources/textures',\n\tRESOURCES_PAGE_THREEJS = 'resources/threejs',\n\t//\n\tASSETS_INDEX = 'assets',\n\tASSETS_IMPORT_MODELS = 'assets/import/models',\n\tASSETS_IMPORT_TEXTURES = 'assets/import/textures',\n\tASSETS_EXPORT = 'assets/export',\n\tASSETS_FILES = 'assets/list',\n\n\t//\n\tHELP = 'help',\n\tMULTIPLAYER = 'multiplayer',\n}\nexport const DOCS_ROUTES: Set<DocsRoute> = new Set([\n\tDocsRoute.INDEX,\n\tDocsRoute.YOUR_FIRST_SCENE,\n\tDocsRoute.INSTALL,\n\tDocsRoute.INSTALL_NEW_PROJECT,\n\tDocsRoute.INSTALL_ADD_TO_EXISTING_PROJECT,\n\tDocsRoute.UPGRADE,\n\tDocsRoute.EXPORT,\n\tDocsRoute.EXPORT_ONLINE,\n\tDocsRoute.EXPORT_LOCAL,\n\tDocsRoute.UPGRADE,\n\t//\n\tDocsRoute.EDITOR,\n\tDocsRoute.EDITOR_PANEL_NETWORK,\n\tDocsRoute.EDITOR_PANEL_VIEWER,\n\tDocsRoute.EDITOR_PANEL_PARAMS,\n\tDocsRoute.EDITOR_PANEL_SCENE_TREE,\n\tDocsRoute.EDITOR_PANEL_SPREADSHEET,\n\tDocsRoute.EDITOR_PANEL_PERFORMANCE,\n\tDocsRoute.EDITOR_PANEL_CODE_PREVIEW,\n\tDocsRoute.COPY_PASTE,\n\t//\n\tDocsRoute.NODES,\n\tDocsRoute.NODE_CONTEXT,\n\tDocsRoute.NODE,\n\tDocsRoute.EXPRESSIONS,\n\tDocsRoute.EXPRESSION,\n\t// DocsRoute.EXAMPLE,\n\tDocsRoute.EXAMPLES,\n\tDocsRoute.EXAMPLES_CATEGORY,\n\tDocsRoute.HELP,\n\tDocsRoute.MULTIPLAYER,\n\t//\n\t// DocsRoute.API_INDEX,\n\t// DocsRoute.API_PAGE_POLY_SCENE,\n\t// DocsRoute.API_PAGE_TYPED_VIEWER,\n\t// DocsRoute.API_PAGE_THREEJS_VIEWER,\n\t// DocsRoute.API_PAGE_TYPED_NODE,\n\t// DocsRoute.API_PAGE_TYPED_ACTOR_NODE,\n\t// DocsRoute.API_PAGE_TYPED_ANIM_NODE,\n\t// DocsRoute.API_PAGE_TYPED_AUDIO_NODE,\n\t// DocsRoute.API_PAGE_TYPED_COP_NODE,\n\t// DocsRoute.API_PAGE_TYPED_CSG_NODE,\n\t// DocsRoute.API_PAGE_TYPED_EVENT_NODE,\n\t// DocsRoute.API_PAGE_TYPED_GL_NODE,\n\t// DocsRoute.API_PAGE_TYPED_MAT_NODE,\n\t// DocsRoute.API_PAGE_TYPED_OBJ_NODE,\n\t// DocsRoute.API_PAGE_TYPED_POST_NODE,\n\t// DocsRoute.API_PAGE_TYPED_ROP_NODE,\n\t// DocsRoute.API_PAGE_TYPED_SOP_NODE,\n\t// DocsRoute.API_PAGE_CORE_GRAPH_NODE,\n\t//\n\tDocsRoute.TUTORIALS_INDEX,\n\tDocsRoute.TUTORIAL_PAGE,\n\t//\n\tDocsRoute.INTEGRATIONS_INDEX,\n\tDocsRoute.INTEGRATION_PAGE_VUE,\n\tDocsRoute.INTEGRATION_PAGE_REACT,\n\tDocsRoute.INTEGRATION_PAGE_REACT_THREE_FIBER,\n\tDocsRoute.INTEGRATION_PAGE_THREEJS,\n\tDocsRoute.INTEGRATION_PAGE_WEBFLOW,\n\tDocsRoute.INTEGRATION_PAGE_MAPBOX,\n\tDocsRoute.INTEGRATION_PAGE_FX_HASH,\n\tDocsRoute.INTEGRATION_PAGE_GIT,\n\tDocsRoute.INTEGRATION_PAGE_S3,\n\tDocsRoute.INTEGRATION_PAGE_WORDPRESS,\n\t//\n\tDocsRoute.ASSETS_INDEX,\n\tDocsRoute.ASSETS_IMPORT_MODELS,\n\tDocsRoute.ASSETS_IMPORT_TEXTURES,\n\tDocsRoute.ASSETS_EXPORT,\n\tDocsRoute.ASSETS_FILES,\n]);\n\nconst EXPORT_PAGES: DocsRoute[] = [DocsRoute.EXPORT_ONLINE, DocsRoute.EXPORT_LOCAL];\nconst EXPORT_PAGE_LABEL: Record<string, string> = {\n\t[DocsRoute.EXPORT_ONLINE]: 'Online',\n\t[DocsRoute.EXPORT_LOCAL]: 'Local',\n};\n// const API_PAGES: DocsRoute[] = [\n// \tDocsRoute.API_PAGE_POLY_SCENE,\n// \tDocsRoute.API_PAGE_TYPED_VIEWER,\n// \tDocsRoute.API_PAGE_THREEJS_VIEWER,\n// \tDocsRoute.API_PAGE_TYPED_NODE,\n// \tDocsRoute.API_PAGE_TYPED_ACTOR_NODE,\n// \tDocsRoute.API_PAGE_TYPED_ANIM_NODE,\n// \tDocsRoute.API_PAGE_TYPED_AUDIO_NODE,\n// \tDocsRoute.API_PAGE_TYPED_COP_NODE,\n// \tDocsRoute.API_PAGE_TYPED_CSG_NODE,\n// \tDocsRoute.API_PAGE_TYPED_EVENT_NODE,\n// \tDocsRoute.API_PAGE_TYPED_GL_NODE,\n// \tDocsRoute.API_PAGE_TYPED_MAT_NODE,\n// \tDocsRoute.API_PAGE_TYPED_OBJ_NODE,\n// \tDocsRoute.API_PAGE_TYPED_POST_NODE,\n// \tDocsRoute.API_PAGE_TYPED_ROP_NODE,\n// \tDocsRoute.API_PAGE_TYPED_SOP_NODE,\n// \tDocsRoute.API_PAGE_CORE_GRAPH_NODE,\n// ];\n// const API_PAGE_LABEL: Record<string, string> = {\n// \t[DocsRoute.API_PAGE_POLY_SCENE]: 'PolyScene',\n// \t[DocsRoute.API_PAGE_TYPED_VIEWER]: 'TypedViewer',\n// \t[DocsRoute.API_PAGE_THREEJS_VIEWER]: 'ThreejsViewer',\n// \t[DocsRoute.API_PAGE_TYPED_NODE]: 'TypedNode',\n// \t[DocsRoute.API_PAGE_TYPED_ACTOR_NODE]: 'TypedActorNode',\n// \t[DocsRoute.API_PAGE_TYPED_ANIM_NODE]: 'TypedAnimNode',\n// \t[DocsRoute.API_PAGE_TYPED_AUDIO_NODE]: 'TypedAudioNode',\n// \t[DocsRoute.API_PAGE_TYPED_COP_NODE]: 'TypedCopNode',\n// \t[DocsRoute.API_PAGE_TYPED_CSG_NODE]: 'TypedCsgNode',\n// \t[DocsRoute.API_PAGE_TYPED_EVENT_NODE]: 'TypedEventNode',\n// \t[DocsRoute.API_PAGE_TYPED_GL_NODE]: 'TypedGlNode',\n// \t[DocsRoute.API_PAGE_TYPED_MAT_NODE]: 'TypedMatNode',\n// \t[DocsRoute.API_PAGE_TYPED_OBJ_NODE]: 'TypedObjNode',\n// \t[DocsRoute.API_PAGE_TYPED_POST_NODE]: 'TypedPostNode',\n// \t[DocsRoute.API_PAGE_TYPED_ROP_NODE]: 'TypedRopNode',\n// \t[DocsRoute.API_PAGE_TYPED_SOP_NODE]: 'TypedSopNode',\n// \t[DocsRoute.API_PAGE_CORE_GRAPH_NODE]: 'CoreGraphNode',\n// };\nconst EDITOR_PAGES: DocsRoute[] = [\n\tDocsRoute.EDITOR_PANEL_NETWORK,\n\tDocsRoute.EDITOR_PANEL_VIEWER,\n\tDocsRoute.EDITOR_PANEL_PARAMS,\n\tDocsRoute.EDITOR_PANEL_SCENE_TREE,\n\tDocsRoute.EDITOR_PANEL_SPREADSHEET,\n\tDocsRoute.EDITOR_PANEL_CODE_PREVIEW,\n\tDocsRoute.EDITOR_PANEL_PERFORMANCE,\n\tDocsRoute.EDITOR_CONFIG,\n\tDocsRoute.COPY_PASTE,\n];\n\nconst EDITOR_PAGE_LABEL: Record<string, string> = {\n\t[DocsRoute.EDITOR_PANEL_NETWORK]: 'Node Network',\n\t[DocsRoute.EDITOR_PANEL_VIEWER]: 'Viewer',\n\t[DocsRoute.EDITOR_PANEL_PARAMS]: 'Params Panel',\n\t[DocsRoute.EDITOR_PANEL_SCENE_TREE]: 'Scene Tree',\n\t[DocsRoute.EDITOR_PANEL_SPREADSHEET]: 'Spreadsheet',\n\t[DocsRoute.EDITOR_PANEL_CODE_PREVIEW]: 'Code Preview',\n\t[DocsRoute.EDITOR_PANEL_PERFORMANCE]: 'Performance',\n\t[DocsRoute.EDITOR_CONFIG]: 'Configuring The Editor',\n\t[DocsRoute.COPY_PASTE]: 'Copy & Paste',\n};\nconst INTEGRATION_PAGES: DocsRoute[] = [\n\tDocsRoute.INTEGRATION_PAGE_VUE,\n\tDocsRoute.INTEGRATION_PAGE_REACT,\n\tDocsRoute.INTEGRATION_PAGE_REACT_THREE_FIBER,\n\tDocsRoute.INTEGRATION_PAGE_THREEJS,\n\tDocsRoute.INTEGRATION_PAGE_WEBFLOW,\n\tDocsRoute.INTEGRATION_PAGE_MAPBOX,\n\tDocsRoute.INTEGRATION_PAGE_FX_HASH,\n\tDocsRoute.INTEGRATION_PAGE_GIT,\n\tDocsRoute.INTEGRATION_PAGE_S3,\n\tDocsRoute.INTEGRATION_PAGE_WORDPRESS,\n];\n\nconst INTEGRATION_PAGE_LABEL: Record<string, string> = {\n\t[DocsRoute.INTEGRATION_PAGE_VUE]: 'Vue',\n\t[DocsRoute.INTEGRATION_PAGE_REACT]: 'React',\n\t[DocsRoute.INTEGRATION_PAGE_REACT_THREE_FIBER]: 'React Three Fiber',\n\t[DocsRoute.INTEGRATION_PAGE_THREEJS]: 'Threejs',\n\t[DocsRoute.INTEGRATION_PAGE_THREEJS_STEP_BY_STEP]: 'Threejs Step By Step',\n\t[DocsRoute.INTEGRATION_PAGE_WEBFLOW]: 'Webflow',\n\t[DocsRoute.INTEGRATION_PAGE_MAPBOX]: 'Mapbox',\n\t[DocsRoute.INTEGRATION_PAGE_FX_HASH]: 'FxHash',\n\t[DocsRoute.INTEGRATION_PAGE_GIT]: 'Git',\n\t[DocsRoute.INTEGRATION_PAGE_S3]: 'AWS S3',\n\t[DocsRoute.INTEGRATION_PAGE_WORDPRESS]: 'Wordpress',\n};\n\nconst PLUGINS_PAGES: DocsRoute[] = [\n\tDocsRoute.PLUGINS_IFC,\n\tDocsRoute.PLUGINS_MAPBOX,\n\tDocsRoute.PLUGINS_MARKER_TRACKING,\n\tDocsRoute.PLUGINS_OCCLUSION,\n\tDocsRoute.PLUGINS_TRACE,\n];\nconst PLUGINS_PAGE_LABEL: Record<string, string> = {\n\t[DocsRoute.PLUGINS_MAPBOX]: 'Mapbox',\n\t[DocsRoute.PLUGINS_MARKER_TRACKING]: 'Marker-Tracking',\n\t[DocsRoute.PLUGINS_OCCLUSION]: 'Occlusion',\n};\nconst RESOURCES_PAGES: DocsRoute[] = [\n\tDocsRoute.RESOURCES_PAGE_API,\n\tDocsRoute.RESOURCES_PAGE_AUDIO,\n\tDocsRoute.RESOURCES_PAGE_DESIGN,\n\tDocsRoute.RESOURCES_PAGE_FORUMS,\n\tDocsRoute.RESOURCES_PAGE_MATERIALS,\n\tDocsRoute.RESOURCES_PAGE_MODELS,\n\tDocsRoute.RESOURCES_PAGE_SITE_BUILDERS,\n\tDocsRoute.RESOURCES_PAGE_TEXTURES,\n\tDocsRoute.RESOURCES_PAGE_THREEJS,\n];\nconst RESOURCES_PAGE_LABEL: Record<string, string> = {\n\t[DocsRoute.RESOURCES_PAGE_API]: 'APIs',\n\t[DocsRoute.RESOURCES_PAGE_AUDIO]: 'Audio',\n\t[DocsRoute.RESOURCES_PAGE_DESIGN]: 'Design',\n\t[DocsRoute.RESOURCES_PAGE_FORUMS]: 'Forums',\n\t[DocsRoute.RESOURCES_PAGE_MATERIALS]: 'Materials',\n\t[DocsRoute.RESOURCES_PAGE_MODELS]: 'Models',\n\t[DocsRoute.RESOURCES_PAGE_SITE_BUILDERS]: 'Site Builders',\n\t[DocsRoute.RESOURCES_PAGE_TEXTURES]: 'Textures',\n\t[DocsRoute.RESOURCES_PAGE_THREEJS]: 'Threejs & WebGL',\n};\n\n// export interface MdImport {\n// \tdefault: string;\n// }\ntype RawRouteComponent = any;\nexport interface PageData {\n\tname: string;\n\troute: DocsRoute;\n\tcomponent?: RawRouteComponent;\n\tchildren?: PageData[];\n\tprops?: Record<string, any>;\n}\n\nexport const DOCS_PAGES: PageData[] = [\n\t// {\n\t// \troute: DocsRoute.INDEX,\n\t// \tname: 'Guide',\n\t// },\n\t{\n\t\troute: DocsRoute.YOUR_FIRST_SCENE,\n\t\tname: 'Your first scene',\n\t},\n\t{\n\t\troute: DocsRoute.INSTALL,\n\t\tname: 'Install',\n\t\tchildren: [\n\t\t\t{\n\t\t\t\troute: DocsRoute.INSTALL_NEW_PROJECT,\n\t\t\t\tname: 'New Project',\n\t\t\t},\n\t\t\t{\n\t\t\t\troute: DocsRoute.INSTALL_ADD_TO_EXISTING_PROJECT,\n\t\t\t\tname: 'Add To An Existing Project',\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\troute: DocsRoute.EXPORT,\n\t\tname: 'Export',\n\t\tchildren: EXPORT_PAGES.map((apiPage) => {\n\t\t\treturn {\n\t\t\t\troute: apiPage,\n\t\t\t\tname: EXPORT_PAGE_LABEL[apiPage],\n\t\t\t};\n\t\t}),\n\t},\n\t{\n\t\troute: DocsRoute.UPGRADE,\n\t\tname: 'Upgrade',\n\t},\n\t{\n\t\troute: DocsRoute.ASSETS_INDEX,\n\t\tname: 'Import/Export Assets',\n\t\tchildren: [\n\t\t\t{\n\t\t\t\troute: DocsRoute.ASSETS_IMPORT_MODELS,\n\t\t\t\tname: 'Import Models',\n\t\t\t},\n\t\t\t{\n\t\t\t\troute: DocsRoute.ASSETS_IMPORT_TEXTURES,\n\t\t\t\tname: 'Import Textures',\n\t\t\t},\n\t\t\t{\n\t\t\t\troute: DocsRoute.ASSETS_EXPORT,\n\t\t\t\tname: 'Export',\n\t\t\t},\n\t\t\t{\n\t\t\t\troute: DocsRoute.ASSETS_FILES,\n\t\t\t\tname: 'Supported Files',\n\t\t\t\tcomponent: PageAssetsSupportedFiles,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\troute: DocsRoute.EDITOR,\n\t\tname: 'The Editor',\n\t\tchildren: EDITOR_PAGES.map((apiPage) => {\n\t\t\treturn {\n\t\t\t\troute: apiPage,\n\t\t\t\tname: EDITOR_PAGE_LABEL[apiPage],\n\t\t\t};\n\t\t}),\n\t},\n\n\t{\n\t\troute: DocsRoute.TUTORIALS_INDEX,\n\t\tname: 'Tutorials',\n\t},\n\t{\n\t\troute: DocsRoute.INTEGRATIONS_INDEX,\n\t\tname: 'Integrations',\n\t\tchildren: INTEGRATION_PAGES.map((apiPage) => {\n\t\t\treturn {\n\t\t\t\troute: apiPage,\n\t\t\t\tname: INTEGRATION_PAGE_LABEL[apiPage],\n\t\t\t\tchildren:\n\t\t\t\t\tapiPage == DocsRoute.INTEGRATION_PAGE_THREEJS\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\troute: DocsRoute.INTEGRATION_PAGE_THREEJS_STEP_BY_STEP,\n\t\t\t\t\t\t\t\t\tname: INTEGRATION_PAGE_LABEL[DocsRoute.INTEGRATION_PAGE_THREEJS_STEP_BY_STEP],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t  ]\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}),\n\t},\n\t{\n\t\troute: DocsRoute.MULTIPLAYER,\n\t\tname: 'Multiplayer',\n\t},\n\t{\n\t\troute: apiRoute(ApiName.INDEX) as string as DocsRoute,\n\t\tname: 'API',\n\t\tcomponent: DocsApi,\n\t\tprops: {apiName: ApiName.INDEX},\n\t\tchildren: CHILD_API_NAMES.map((apiName) => {\n\t\t\treturn {\n\t\t\t\troute: apiRoute(apiName) as DocsRoute,\n\t\t\t\tname: apiName,\n\t\t\t\tcomponent: DocsApi,\n\t\t\t\tprops: {apiName},\n\t\t\t};\n\t\t}),\n\t},\n\t{\n\t\troute: DocsRoute.PLUGINS_INDEX,\n\t\tname: 'Plugins',\n\t\tchildren: PLUGINS_PAGES.map((apiPage) => {\n\t\t\treturn {\n\t\t\t\troute: apiPage,\n\t\t\t\tname: PLUGINS_PAGE_LABEL[apiPage],\n\t\t\t};\n\t\t}),\n\t},\n\t{\n\t\troute: DocsRoute.RESOURCES_INDEX,\n\t\tname: 'Resources',\n\t\tchildren: RESOURCES_PAGES.map((apiPage) => {\n\t\t\treturn {\n\t\t\t\troute: apiPage,\n\t\t\t\tname: RESOURCES_PAGE_LABEL[apiPage],\n\t\t\t};\n\t\t}),\n\t},\n];\n\ntype PageCallback = (pageData: PageData) => void;\nfunction _traversePages(pages: PageData[], callback: PageCallback) {\n\tfor (let page of pages) {\n\t\tcallback(page);\n\t\tif (page.children) {\n\t\t\t_traversePages(page.children, callback);\n\t\t}\n\t}\n}\nfunction _buildDocsPagesByRoute() {\n\tconst dict: PolyDictionary<PageData> = {};\n\t_traversePages(DOCS_PAGES, (page) => {\n\t\tdict[page.route] = page;\n\t});\n\treturn dict;\n}\n\nexport const DOCS_PAGES_BY_ROUTE = _buildDocsPagesByRoute();\n","import {PanelApi} from './Panel';\n\nexport class PanelCustomApi {\n\tprivate _HTMLByPanelName: Map<string, string> = new Map();\n\tconstructor(public readonly panelApi: PanelApi) {\n\t\t// this._html_by_panel_name.set('bayer1', '<a href=\"https://polygonjs.com\">This is a link</a>');\n\t\t// this._html_by_panel_name.set('bayer2', ``);\n\t}\n\n\taddPanel(panelName: string, content: string) {\n\t\tthis._HTMLByPanelName.set(panelName, content);\n\t}\n\tpanelNames() {\n\t\tlet list: string[] = [];\n\t\tthis._HTMLByPanelName.forEach((panel, name) => {\n\t\t\tlist.push(name);\n\t\t});\n\t\tlist = list.sort();\n\t\treturn list;\n\t}\n\tcontentForPanel(panel_name: string) {\n\t\treturn this._HTMLByPanelName.get(panel_name);\n\t}\n}\n","import {PanelCustomApi} from './Custom';\nimport {EditorApi} from '../EditorApi';\n// import {PanelViewerApi} from './Viewer';\n\nexport class PanelApi {\n\tconstructor(public readonly editorApi: EditorApi) {}\n\tpublic readonly custom = new PanelCustomApi(this);\n\t// public readonly viewer = new PanelViewerApi(this);\n}\n","import {HTMLApi} from './HTML';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png'];\nconst VIDEO_EXTENSIONS = ['mp4', 'ogv', 'ogg'];\nconst JS_EXTENSIONS = ['js'];\nimport _template from 'lodash/template';\n\n// @ts-ignore\n// import CSS_BASE from '!!raw-loader!../../self_contained/templates/base.css';\nconst CSS_BASE = `\nhtml,\nbody,\n.polygonjs-app {\n\tmargin: 0px;\n\theight: 100%;\n\toverflow: hidden;\n\tdisplay: block;\n}\n.polygonjs-app canvas {\n\tdisplay: block;\n\theight: 100%;\n\tuser-select: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n}\n.polygonjs-app canvas.active {\n\tcursor: pointer;\n}\n`;\n\ninterface StylesheetTagData {\n\tid: string;\n\tcontent: string;\n}\ninterface ScriptTagData {\n\tid: string;\n\tcontent: string;\n\ttype?: 'application/javascript' | 'module';\n}\n\nexport interface PreloadLinkTagOptions {\n\tas?: string;\n\tcrossorigin?: boolean;\n}\ninterface TagsOptions {\n\tautoPlay: boolean;\n}\n\nconst DEFAULT_TITLE = 'a WebGL Experience created with @polygonjs';\nexport class HTMLHeadApi {\n\tprivate _stylesheetContentById: Map<string, string> = new Map();\n\tprivate _scriptDataById: Map<string, ScriptTagData> = new Map();\n\tprivate _preloadUrls: Map<string, PreloadLinkTagOptions> = new Map();\n\n\tconstructor(protected htmlApi: HTMLApi) {\n\t\tthis.addStylesheet({id: 'polygonjs-default', content: CSS_BASE});\n\t}\n\n\t/*\n\t *\n\t * OPTIONS\n\t *\n\t */\n\tprivate _title: string = DEFAULT_TITLE;\n\tprivate _description: string = DEFAULT_TITLE;\n\tprivate _twitter: string = '@polygonjs';\n\tprivate _siteUrl: string = 'https://polygonjs.com';\n\tprivate _autoPlay: boolean = true;\n\tsetTitle(title: string) {\n\t\tthis._title = title;\n\t}\n\ttitle() {\n\t\treturn this._title;\n\t}\n\tsetDescription(description: string) {\n\t\tthis._description = description;\n\t}\n\tdescription() {\n\t\treturn this._description;\n\t}\n\tsetSiteUrl(url: string) {\n\t\tthis._siteUrl = url;\n\t}\n\tsiteUrl() {\n\t\treturn this._siteUrl;\n\t}\n\tsetTwitter(twitter: string) {\n\t\tthis._twitter = twitter;\n\t}\n\ttwitter() {\n\t\treturn this._twitter;\n\t}\n\tsetAutoPlay(autoPlay: boolean) {\n\t\tthis._autoPlay = autoPlay;\n\t}\n\n\t/*\n\t *\n\t * ALL\n\t *\n\t */\n\ttags(): string {\n\t\treturn [this.metaTags(), this.titleTag(), this.stylesheets(), this.scripts(), this.preloadLinks()].join('\\n');\n\t}\n\n\t/*\n\t *\n\t * TITLE\n\t *\n\t */\n\t// setTitle(title: string) {\n\t// \tthis._title = title;\n\t// }\n\ttitleTag(): string {\n\t\treturn `<title>${this.title()}</title>`;\n\t}\n\n\t/*\n\t *\n\t * STYLE\n\t *\n\t */\n\taddStylesheet(data: StylesheetTagData) {\n\t\tconst existingData = this._stylesheetContentById.get(data.id);\n\t\tif (existingData) {\n\t\t\tconsole.error(`stylesheet with id '${data.id}' already given`);\n\t\t\treturn;\n\t\t}\n\t\tthis._stylesheetContentById.set(data.id, data.content);\n\t}\n\tstylesheets(): string {\n\t\tconst tags: string[] = [];\n\t\tthis._stylesheetContentById.forEach((content, id) => {\n\t\t\tconst tag = `\n<style id=\"${id}\">\n\t${content}\n</style>`;\n\t\t\ttags.push(tag);\n\t\t});\n\t\treturn tags.join('\\n');\n\t}\n\n\t/*\n\t *\n\t * JAVASCRIPT TAGS\n\t *\n\t */\n\taddScript(data: ScriptTagData) {\n\t\tconst existingData = this._scriptDataById.get(data.id);\n\t\tif (existingData) {\n\t\t\tconsole.error(`script with id '${data.id}' already given`);\n\t\t\treturn;\n\t\t}\n\t\tthis._scriptDataById.set(data.id, data);\n\t}\n\tprivate _scriptTags(): string[] {\n\t\tconst tags: string[] = [];\n\t\tthis._scriptDataById.forEach((data, id) => {\n\t\t\tconst tag = this._scriptTag(data, {autoPlay: this._autoPlay});\n\t\t\ttags.push(tag);\n\t\t});\n\t\treturn tags;\n\t}\n\tscripts(): string {\n\t\treturn this._scriptTags().join('\\n');\n\t}\n\n\t/*\n\t *\n\t * PRELOAD LINKS\n\t *\n\t */\n\taddPreloadUrl(url: string, options?: PreloadLinkTagOptions) {\n\t\tthis._preloadUrls.set(url, options || {});\n\t}\n\tpreloadLinks(): string {\n\t\tconst tags: string[] = [];\n\t\tthis._preloadUrls.forEach((options, url) => {\n\t\t\tconst tag = HTMLHeadApi.preloadLinkTagFromUrl(url, options);\n\t\t\ttags.push(tag);\n\t\t});\n\t\treturn tags.join('\\n');\n\t}\n\n\t/*\n\t *\n\t * METATAGS\n\t *\n\t */\n\tprivate _metaTagStrings: string[] = [];\n\tmetaTags() {\n\t\tconst tags: string[] = [];\n\t\tfor (let metaTag of this._metaTagStrings) {\n\t\t\ttags.push(metaTag);\n\t\t}\n\t\treturn tags.join('\\n');\n\t}\n\n\taddMetaTag(metaTagString: string) {\n\t\tthis._metaTagStrings.push(metaTagString);\n\t}\n\n\t/*\n\t *\n\t * UTILS\n\t *\n\t */\n\tupdateCurrentPage() {\n\t\tconst head = document.getElementsByTagName('head')[0];\n\t\tthis._scriptDataById.forEach((data, id) => {\n\t\t\tconst scriptTag = document.createElement('script');\n\t\t\t// when using innerText, if there are multiple lines in the content,\n\t\t\t// this will insert <br> tags in between each lines.\n\t\t\t// And using innerHTML seems to behave as expected\n\t\t\tscriptTag.innerHTML = data.content;\n\t\t\tscriptTag.id = id;\n\t\t\tif (data.type) {\n\t\t\t\tscriptTag.type = data.type;\n\t\t\t}\n\t\t\thead.appendChild(scriptTag);\n\t\t});\n\t}\n\tinsertIntoHTML(template: string) {\n\t\tconst lines = template.split('\\n');\n\t\tconst newLines: string[] = [];\n\t\tfor (let line of lines) {\n\t\t\tif (line.includes('</head>')) {\n\t\t\t\tthis._scriptDataById.forEach((data, id) => {\n\t\t\t\t\tconst tag = this._scriptTag(data);\n\t\t\t\t\tnewLines.push(tag);\n\t\t\t\t});\n\t\t\t}\n\t\t\tnewLines.push(line);\n\t\t}\n\t\treturn newLines.join('\\n');\n\t}\n\tprivate _scriptTag(data: ScriptTagData, options?: TagsOptions) {\n\t\tconst attributes: string[] = [];\n\t\tattributes.push(`id=\"${data.id}\"`);\n\t\tif (data.type) {\n\t\t\tattributes.push(`type=\"${data.type}\"`);\n\t\t}\n\t\tconst content = options ? _template(data.content)(options) : data.content;\n\t\treturn `\n<script ${attributes.join(' ')}>\n\t${content}\n</script>`;\n\t}\n\n\tstatic preloadLinkTagFromUrl(url: string, options?: PreloadLinkTagOptions): string {\n\t\tconst crossorigin = options?.crossorigin || false;\n\t\tconst urlElements = url.split('?');\n\t\tconst extElements = urlElements[0].split('.');\n\t\tconst ext = extElements[extElements.length - 1].toLowerCase();\n\t\tlet asAttribute = options?.as;\n\n\t\tif (asAttribute == null) {\n\t\t\tasAttribute = 'fetch';\n\n\t\t\tif (IMAGE_EXTENSIONS.includes(ext)) {\n\t\t\t\tasAttribute = 'image';\n\t\t\t}\n\t\t\tif (VIDEO_EXTENSIONS.includes(ext)) {\n\t\t\t\tasAttribute = 'video';\n\t\t\t}\n\t\t\tif (JS_EXTENSIONS.includes(ext)) {\n\t\t\t\tasAttribute = 'script';\n\t\t\t}\n\t\t}\n\n\t\tconst crossoriginAttr = crossorigin ? 'crossorigin' : '';\n\t\treturn `<link rel=\"preload\" href=\"${url}\" as=\"${asAttribute}\" ${crossoriginAttr}/>`;\n\t}\n}\n","import {HTMLApi} from './HTML';\n\ninterface TagData {\n\tid: string;\n\tcontent: string;\n}\n\ntype PolygonjsIdCallback = (sceneName: string) => void;\n\nexport class HTMLBodyApi {\n\tprivate _tagsByIdByGroup: Map<string, Map<string, TagData>> = new Map();\n\tconstructor(protected htmlApi: HTMLApi) {}\n\n\taddTag(groupName: string, data: TagData) {\n\t\tlet groupMap = this._tagsByIdByGroup.get(groupName);\n\t\tif (!groupMap) {\n\t\t\tgroupMap = new Map();\n\t\t\tthis._tagsByIdByGroup.set(groupName, groupMap);\n\t\t}\n\t\tgroupMap.set(data.id, data);\n\t}\n\ttags(groupName: string): string {\n\t\tconst tags: string[] = [];\n\t\tconst groupMap = this._tagsByIdByGroup.get(groupName);\n\t\tif (groupMap) {\n\t\t\tgroupMap.forEach((data, id) => {\n\t\t\t\ttags.push(data.content);\n\t\t\t});\n\t\t}\n\t\treturn tags.join('\\n');\n\t}\n\n\tprivate _polygonjsIdFunction: PolygonjsIdCallback = (sceneName: string) => {\n\t\treturn `polygonjs-app-${sceneName}`;\n\t};\n\tpolygonjsId(sceneName: string) {\n\t\treturn this._polygonjsIdFunction(sceneName);\n\t}\n\tsetPolygonjsIdCallback(callback: PolygonjsIdCallback) {\n\t\tthis._polygonjsIdFunction = callback;\n\t}\n}\n","import {HTMLApi} from './HTML';\n\ninterface BaseProgressBarTemplates {\n\tHTML: string;\n\tJS: string;\n\tCSS: string;\n}\n\ninterface BaseProgressBar {\n\ttemplates: (options: any) => BaseProgressBarTemplates;\n}\n\nexport class HTMLViewerApi {\n\tprivate _progressBar: BaseProgressBar | undefined;\n\tconstructor(protected htmlApi: HTMLApi) {}\n\n\tsetProgressBar(progressBar: BaseProgressBar | undefined) {\n\t\tthis._progressBar = progressBar;\n\t}\n\tprogressBar(): BaseProgressBar | undefined {\n\t\treturn this._progressBar;\n\t}\n}\n","import {HTMLHeadApi} from './Head';\nimport {HTMLBodyApi} from './Body';\nimport {HTMLViewerApi} from './Viewer';\nimport {EditorApi} from '../EditorApi';\n\nexport class HTMLApi {\n\tconstructor(public readonly editorApi: EditorApi) {}\n\tpublic readonly head = new HTMLHeadApi(this);\n\tpublic readonly body = new HTMLBodyApi(this);\n\tpublic readonly viewer = new HTMLViewerApi(this);\n}\n","import {EditorApi} from '../EditorApi';\n\nexport interface PostExportCallbackArgs {\n\texportFolder: string;\n\tsceneName: string;\n}\nexport interface PostExportCallbackReturnValue {\n\tcommand: string;\n\tpublicPath: string;\n}\ntype PostExportCallback = (args: PostExportCallbackArgs) => PostExportCallbackReturnValue;\n\nexport class ExportApi {\n\tconstructor(public readonly editorApi: EditorApi) {}\n\tprivate _postExportCallback: PostExportCallback | undefined;\n\tsetPostExportCommand(callback: PostExportCallback) {\n\t\tthis._postExportCallback = callback;\n\t}\n\tpostExportCommand(args: PostExportCallbackArgs) {\n\t\tif (this._postExportCallback) {\n\t\t\treturn this._postExportCallback(args);\n\t\t}\n\t}\n\tprivate _exportFolder: string | undefined;\n\tsetExportFolder(exportFolder: string) {\n\t\tthis._exportFolder = exportFolder;\n\t}\n\texportFolder() {\n\t\treturn this._exportFolder;\n\t}\n}\n","import {EditorApi} from '../EditorApi';\n\nexport class RemoteApi {\n\tpublic readonly ngrok = new NGrok();\n\tconstructor(public readonly editorApi: EditorApi) {}\n}\n\nclass NGrok {\n\tprivate _authToken?: string;\n\tprivate _closeExistingTunnelsOnCreate: boolean = true;\n\tsetAuthToken(authToken?: string) {\n\t\tthis._authToken = authToken;\n\t}\n\tauthToken() {\n\t\treturn this._authToken;\n\t}\n\tsetCloseExistingTunnelsOnCreate(state: boolean) {\n\t\tthis._closeExistingTunnelsOnCreate = state;\n\t}\n\tcloseExistingTunnelsOnCreate() {\n\t\treturn this._closeExistingTunnelsOnCreate;\n\t}\n}\n","import {RemoteApi} from './Remote';\nimport {EditorApi} from '../EditorApi';\n\nexport class MultiPlayerApi {\n\tconstructor(public readonly editorApi: EditorApi) {}\n\tpublic readonly remote = new RemoteApi(this.editorApi);\n}\n","import {PanelApi} from './panel/Panel';\nimport {HTMLApi} from './html/HTML';\nimport {ExportApi} from './export/Export';\nimport {MultiPlayerApi} from './multiplayer/MultiPlayer';\n\nexport class EditorApi {\n\tpublic readonly html = new HTMLApi(this);\n\tpublic readonly panel = new PanelApi(this);\n\tpublic readonly export = new ExportApi(this);\n\tpublic readonly multiplayer = new MultiPlayerApi(this);\n\n\tprivate _projectName: string | undefined;\n\tsetProjectName(sceneName: string) {\n\t\tthis._projectName = sceneName;\n\t}\n\tprojectName() {\n\t\treturn this._projectName;\n\t}\n}\n\n// used in configureEditor\nexport interface EditorApiOptions {\n\tapi: EditorApi;\n\tsceneName: string;\n}\n\nexport type ConfigureEditor = (options: EditorApiOptions) => void;\n","import {Ref, ref} from 'vue';\nimport {Editor} from '../Editor';\n\nexport class ViewerComponentsRegister {\n\tprivate _nextId = 0;\n\tprivate _firstViewerId: Ref<number> = ref(-1);\n\tprivate _viewerComponentsById: Map<number, boolean> = new Map();\n\tconstructor(protected editor: Editor) {}\n\tnextId() {\n\t\tthis._nextId += 1;\n\t\treturn this._nextId;\n\t}\n\tregisterViewerComponent(id: number) {\n\t\tthis._viewerComponentsById.set(id, true);\n\t\tthis._updateFirstViewer();\n\t}\n\tunregisterViewerComponent(id: number) {\n\t\tthis._viewerComponentsById.delete(id);\n\t\tthis._updateFirstViewer();\n\t}\n\n\tprivate _updateFirstViewer() {\n\t\tthis._firstViewerId.value = -1;\n\t\tthis._viewerComponentsById.forEach((val, id) => {\n\t\t\tif (this._firstViewerId.value == -1) {\n\t\t\t\tthis._firstViewerId.value = id;\n\t\t\t}\n\t\t});\n\t}\n\tisFirstRegistered(id: number) {\n\t\treturn this._firstViewerId.value == id;\n\t}\n}\n","// import {CoreAutoLayout} from './core/AutoLayout';\n// import {ExamplesRegister} from './../engine/examples/ExamplesRegister';\n// import {Example, OnAfterExampleLoaded} from './../engine/examples/Example';\n// import {JsonImporterMigrateHelper} from '../engine/io/json/import/MigrateHelper';\nimport {PolyNodeController} from './../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {NodePolyNodeLockCommand} from './history/commands/NodePolyNodeLock';\nimport {NodesSubnetCollapseCommand} from './history/commands/NodesSubnetCollapse';\nimport {NodeSelectCommand} from './history/commands/NodeSelect';\nimport {SelectionMethod} from './core/Selection';\n// import {OnProgressArguments} from './../../@polygonjs/polygonjs/src/engine/nodes/manager/utils/Scene/LoadProgress';\n// import DebugJSX from './Debug';\n// Vue composition api\n// import './Editor.css';\n// Vuex\n// import {\n// \t// App,\n// \t// ComponentPublicInstance,\n// \t// ComponentOptionsBase,\n// \tref,\n// } from 'vue';\n// import {EditorStore} from './store/Store';\nimport {StoreController} from './store/controllers/StoreController';\n// StoreController.set_store();\nimport {\n\t// EditorPropsLegacy,\n\t// OnExportCallback,\n\tOnSaveCallback,\n\tEditorType,\n\tOnViewExportCallback,\n\tPolyNodeCreateCallbackData,\n\tPolyNodeUpdateCallbackData,\n\tPolyNodeIndexCallbackData,\n\tPolyNodeDownloadCallbackData,\n} from './types';\nimport {AppSceneLoader} from '../config/AppSceneLoader';\n// icons\n// import {Heroicons} from './components/Heroicons';\n\n// to ensure that .vue components are loaded, see tips in webpack config\n// the still remaining issue is that when the file path is wrong, there is no warning in the editor\n// and the error message can be confusing\n// import EditorComponent from './components/editor/Editor.vue';\n\n// import {SceneJsonImporter} from '../../@polygonjs/polygonjs/src/engine/io/json/import/Scene';\n// import {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\n// import {EditorCoreHooksController} from './core/hooks/HooksController';\n\nimport {\n\tEditorLayoutData,\n\tEditorEvent,\n\tCallbackByEditorEvent,\n\t// EditorProps,\n\t// SceneData,\n\tPolyNodeUploadCallbackData,\n} from './types';\n// import {Poly} from '../../@polygonjs/polygonjs/src/engine/Poly';\n// import {PanelsConfig} from './helpers/PanelsConfig';\n// import {FileType} from '../../@polygonjs/polygonjs/src/engine/params/utils/OptionsController';\n// import {StringParam} from '../../@polygonjs/polygonjs/src/engine/params/String';\n\n// const _POLYGONJS_VERSION = POLYGONJS_VERSION;\n// import config from '../../package.json';\n\n// const EDITOR_VERSION = (config as PackageConfig).version;\n\n// import {SelfContainedSceneWriterAssembler} from './self_contained/WriterAssembler';\nimport {EditorApi} from './api/EditorApi';\n// import {AVAILABLE_LINK_INDEX_VALUES} from './components/panels/common/LinkIndex';\nimport {ViewerComponentsRegister} from './helpers/ViewerComponentsRegister';\nimport {FeaturesController} from './core/FeaturesController';\nimport {ErrorsNotifier} from './core/error/ErrorsNotifier';\nimport {sceneDataWithVersion} from './versions';\nimport {LAYOUT, LayoutEntryId} from './components/editor/top/Layout';\nimport {BaseCommand} from './history/commands/_Base';\nimport {BaseSerializedStack} from './history/serializedStack/_BaseSerializedStack';\nimport {AppLoader} from '../config/AppLoader';\nimport {FigmaPluginController} from '../plugins/figma/FigmaPluginController';\n\ndeclare global {\n\tinterface Window {\n\t\teditor: Editor | undefined;\n\t}\n}\n\nexport class Editor {\n\tstatic _instance: Editor | undefined;\n\tprivate _type: EditorType = EditorType.WEB;\n\t// private _loaded: boolean = false;\n\t// private _scene: PolyScene | undefined;\n\n\t// private _vueInstance: App<Element> | undefined;\n\t// public _editor_component:\n\t// \t| ComponentPublicInstance<\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\t{},\n\t// \t\t\tfalse,\n\t// \t\t\tComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}>\n\t// \t  >\n\t// \t| undefined; // TODO: vue - try and find a better way to type this\n\tpublic readonly viewerComponentsRegister = new ViewerComponentsRegister(this);\n\t// callbacks\n\tprivate _callbacks: CallbackByEditorEvent = {\n\t\t[EditorEvent.NEW_SCENE]: undefined,\n\t\t[EditorEvent.DASHBOARD]: undefined,\n\t\t[EditorEvent.PLAY]: undefined,\n\t\t// [EditorEvent.OPEN_EXPORT_PANEL]: undefined,\n\t\t[EditorEvent.VIEW_EXPORT]: undefined,\n\t\t[EditorEvent.SAVE]: undefined,\n\t\t[EditorEvent.FORK]: undefined,\n\t\t[EditorEvent.SAVE_AS]: undefined,\n\t\t// [EditorEvent.LOAD_SCENE]: undefined,\n\t\t[EditorEvent.CREATE_POLY_NODE]: undefined,\n\t\t[EditorEvent.SAVE_POLY_NODE]: undefined,\n\t\t[EditorEvent.MARKETPLACE_DOWNLOAD_POLY_NODE]: undefined,\n\t\t[EditorEvent.MARKETPLACE_UPLOAD_POLY_NODE]: undefined,\n\t\t[EditorEvent.MARKETPLACE_INDEX_POLY_NODE]: undefined,\n\t\t[EditorEvent.MARKETPLACE_SEARCH]: undefined,\n\t\t[EditorEvent.SETTINGS]: undefined,\n\t\t[EditorEvent.VIEWER_CAPTURE_STATIC]: undefined,\n\t\t[EditorEvent.VIEWER_CAPTURE_ANIMATION]: undefined,\n\t\t[EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_SAVE]: undefined,\n\t\t[EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_LOAD]: undefined,\n\t\t[EditorEvent.LOCAL_ASSET_UPLOAD_REQUEST]: undefined,\n\t\t[EditorEvent.LIBRARY_INSTALL_DRACO_REQUEST]: undefined,\n\t\t// [EditorEvent.SCENE_CREATED]: undefined,\n\t\t// [EditorEvent.COMMAND_PUSH]: undefined,\n\t\t// [EditorEvent.COMMAND_UNDO]: undefined,\n\t\t// [EditorEvent.COMMAND_REDO]: undefined,\n\t\t// desktop:\n\t\t// [EditorEvent.NEW_PROJECT]: undefined,\n\t\t// [EditorEvent.OPEN_PROJECT]: undefined,\n\t\t// [EditorEvent.SAVE_PROJECT]: undefined,\n\t\t[EditorEvent.LOGOUT]: undefined,\n\t\t// [EditorEvent.ACCOUNT_SETTINGS]: undefined,\n\t\t[EditorEvent.DISPLAY_LOGIN_FORM]: undefined,\n\t\t[EditorEvent.MOUNTED]: undefined,\n\t\t// [EditorEvent.QUIT]: undefined,\n\t\t// [EditorEvent.FILE_BROWSE]: undefined,\n\t};\n\t// private _upload_allowed_extensions_by_file_type: Dictionary<string[]> = {};\n\t//\n\t// public readonly panels_config: PanelsConfig = new PanelsConfig();\n\tpublic readonly api = new EditorApi();\n\t// test is used in system tests\n\tpublic readonly test = {\n\t\tcmd: {\n\t\t\tNodesSubnetCollapseCommand,\n\t\t\tNodeSelectCommand,\n\t\t\tNodePolyNodeLockCommand,\n\t\t},\n\t\tenum: {\n\t\t\tSelectionMethod,\n\t\t},\n\t\tPolyNodeController,\n\t\tdialog: {\n\t\t\t// try and not have access to currentUser,\n\t\t\t// so that it's not possible (or not easy)\n\t\t\t// to override the .isPro\n\t\t\tpolyNodeCreateForm: StoreController.editor.polyNodeCreateForm,\n\t\t\tpolyNodeUpdateForm: StoreController.editor.polyNodeUpdateForm,\n\t\t\tcontextMenu: StoreController.editor.contextMenu,\n\t\t\texportPanel: StoreController.editor.exportPanel,\n\t\t\tpreferences: StoreController.editor.preferences,\n\t\t\tshare: StoreController.editor.share,\n\t\t},\n\t};\n\t//\n\tprivate constructor() {\n\t\twindow.editor = this;\n\t\t// Poly.log(`EDITOR VERSION '${this._version}'`);\n\t\t// do not use here to not polute the desktop app\n\t\t// WindowController.instance().init_event();\n\t\tErrorsNotifier.setup();\n\n\t\t// EditorCoreHooksController.registerAll();\n\n\t\t// StoreController.editor.status.setLoading('testing...');\n\t\t// StoreController.editor.status.setError('testing...');\n\n\t\t// always renderers debugging for now\n\t\t// update: not ideal when you use the console,\n\t\t// it feels like there are bugs\n\t\t// Poly.renderersController.setPrintDebug(true);\n\n\t\t// this.api.panel.viewer.setData({\n\t\t// \tviewerId: 'polygonjs-app',\n\t\t// \thtml: `<!DOCTYPE html>\n\t\t// \t<html>\n\t\t// \t\t<head>\n\t\t// \t\t\t<meta charset=\"utf-8\" />\n\t\t// \t\t\t<style>\n\t\t// \t\t\t\thtml,\n\t\t// \t\t\t\tbody,\n\t\t// \t\t\t\t#polygonjs-app {\n\t\t// \t\t\t\t\tmargin: 0px;\n\t\t// \t\t\t\t\theight: 100%;\n\t\t// \t\t\t\t\toverflow: hidden;\n\t\t// \t\t\t\t\tdisplay: block;\n\t\t// \t\t\t\t\tbackground-color: red;\n\t\t// \t\t\t\t}\n\t\t// \t\t\t\t#polygonjs-app canvas {\n\t\t// \t\t\t\t\tdisplay: block;\n\t\t// \t\t\t\t\theight: 100%;\n\t\t// \t\t\t\t}\n\t\t// \t\t\t\t#polygonjs-app canvas.active {\n\t\t// \t\t\t\t\tcursor: pointer;\n\t\t// \t\t\t\t}\n\t\t// \t\t\t</style>\n\t\t// \t\t</head>\n\t\t// \t\t<body>\n\t\t// \t\t\t<div>before</div>\n\t\t// \t\t\t<div id='polygonjs-app'></div>\n\t\t// \t\t\t<div>after</div>\n\t\t// \t\t</body>\n\t\t// \t</html>\n\t\t// \t`,\n\t\t// });\n\t}\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new Editor());\n\t}\n\n\tprivate setType(type: EditorType) {\n\t\tthis._type = type;\n\t}\n\tstatic setType(type: EditorType) {\n\t\tthis.instance().setType(type);\n\t}\n\ttype() {\n\t\treturn this._type;\n\t}\n\tstatic type() {\n\t\treturn this.instance()._type;\n\t}\n\n\t//\n\t//\n\t// PUBLIC API\n\t//\n\t//\n\t// static async loadSceneData(scene_data: SceneData, props: EditorProps = {}) {\n\t// \treturn await this.instance().loadSceneData(scene_data, props);\n\t// }\n\t// static mountScene(element_or_id: HTMLElement | string, scene: PolyScene, props: EditorProps = {}) {\n\t// \treturn this.instance().mountScene(element_or_id, scene, props);\n\t// }\n\t// static unmount() {\n\t// \tthis.instance()._unmount();\n\t// \tthis._instance = undefined;\n\t// }\n\n\tstatic on<T extends EditorEvent>(eventName: T, callback: CallbackByEditorEvent[T]) {\n\t\tthis.instance().set_callback(eventName, callback);\n\t}\n\t// private _root_url: string | undefined;\n\t// set_root_url(url: string) {\n\t// \tthis._root_url = url;\n\t// }\n\t// root_url(){\n\t// \treturn this._root_url\n\t// }\n\n\t//\n\t//\n\t// INTERNALS\n\t//\n\t//\n\n\t// upload_allowed_extensions_by_file_type() {\n\t// \treturn this._upload_allowed_extensions_by_file_type;\n\t// }\n\tset_uploads_reload_required() {\n\t\tStoreController.editor.uploads.set_reload_required();\n\t}\n\n\t// desktop_controller() {\n\t// \treturn DesktopController.instance();\n\t// }\n\tasync save_scene() {\n\t\tconst callback = this._callbacks[EditorEvent.SAVE];\n\t\tif (callback) {\n\t\t\tawait this.saveWithCallback(callback);\n\t\t}\n\t}\n\tasync forkScene() {\n\t\tconst callback = this._callbacks[EditorEvent.FORK];\n\t\tif (callback) {\n\t\t\tawait this.saveWithCallback(callback);\n\t\t}\n\t}\n\tasync save_scene_as() {\n\t\tconst callback = this._callbacks[EditorEvent.SAVE_AS];\n\t\tif (callback) {\n\t\t\tawait this.saveWithCallback(callback);\n\t\t}\n\t}\n\t// load_scene() {\n\t// \tconst callback = this._callbacks[EditorEvent.LOAD_SCENE];\n\t// \tif (callback) {\n\t// \t\t// removing the save as this does not seem necessary\n\t// \t\t// when loading a scene in a separate tab.\n\t// \t\t// Also, it seems to set the status bar to 'saving...'\n\t// \t\t// without doing anything\n\t// \t\t// this._save_with_callback(callback);\n\t// \t\tcallback();\n\t// \t}\n\t// }\n\tasync requestLibraryInstallationDraco() {\n\t\tconst callback = this._callbacks[EditorEvent.LIBRARY_INSTALL_DRACO_REQUEST];\n\t\tif (callback) {\n\t\t\tawait callback();\n\t\t}\n\t}\n\n\t// private async _onSceneCreated(scene: PolyScene) {\n\t// \tconst callback = this._callbacks[EditorEvent.SCENE_CREATED];\n\t// \tif (callback) {\n\t// \t\tawait callback(scene);\n\t// \t}\n\t// }\n\tsave() {\n\t\tlet callback = this._callbacks[EditorEvent.SAVE];\n\t\tif (callback) {\n\t\t\tthis.saveWithCallback(callback);\n\t\t} else {\n\t\t\t// callback = this._callbacks[EditorEvent.SAVE_PROJECT];\n\t\t\t// if (callback) {\n\t\t\t// \tthis._save_with_callback(callback);\n\t\t\t// }\n\t\t}\n\t}\n\n\tasync saveWithCallback(callback: OnSaveCallback) {\n\t\tconst scene = AppSceneLoader.scene();\n\t\tif (!scene) {\n\t\t\tconsole.warn('cannot save, no scene has been loaded');\n\t\t\treturn;\n\t\t}\n\t\t// if (!this._editor_component) {\n\t\t// \tconsole.warn('cannot save, vue not initialized');\n\t\t// \treturn;\n\t\t// }\n\t\tStoreController.editor.status.setLoading(`saving...`);\n\t\tconst sceneData = await sceneDataWithVersion({scene, withPersistedConfig: true});\n\n\t\ttry {\n\t\t\tif (FeaturesController.forceSceneSaveCrash()) {\n\t\t\t\tthrow 'debug forced scene save crash';\n\t\t\t}\n\n\t\t\tconst layoutData = this.layoutData();\n\n\t\t\tthis.historyStack()?.markSceneAsSaved();\n\t\t\tawait callback(scene, sceneData, layoutData);\n\t\t} catch (err) {\n\t\t\tStoreController.editor.status.setError(\n\t\t\t\t`failed to save the scene. Please check the dev console for errors and send them to gui@polygonjs.com`\n\t\t\t);\n\t\t\tconsole.error(err);\n\t\t}\n\t}\n\tprivate _historySerializedStack: BaseSerializedStack | undefined;\n\tsetHistorySerializedStack(stack: BaseSerializedStack) {\n\t\tthis._historySerializedStack = stack;\n\t}\n\thistoryStack() {\n\t\treturn this._historySerializedStack;\n\t}\n\tasync pushCommand(command: BaseCommand) {\n\t\tif (command.pushed()) {\n\t\t\tconsole.error('command already pushed', command);\n\t\t\treturn;\n\t\t}\n\t\tcommand.markAsPushed();\n\t\tawait this._historySerializedStack?.requestPushCommand(command);\n\t}\n\tasync undo() {\n\t\tawait this._historySerializedStack?.requestUndo();\n\t}\n\tasync redo() {\n\t\tawait this._historySerializedStack?.requestRedo();\n\t}\n\n\tlayoutData(): EditorLayoutData {\n\t\tconst defaultData: EditorLayoutData = {\n\t\t\tmultiple_panel: JSON.parse(JSON.stringify(LAYOUT[LayoutEntryId.NETWORK_RIGHT])),\n\t\t\tcurrentNodes: [] as string[],\n\t\t\tfullscreenPanelId: null,\n\t\t};\n\n\t\ttry {\n\t\t\tconst layoutData = AppLoader.layoutDataFunction(); //(this._editor_component as any).layoutData;\n\t\t\tif (layoutData) {\n\t\t\t\treturn layoutData() as EditorLayoutData;\n\t\t\t} else {\n\t\t\t\treturn defaultData;\n\t\t\t}\n\t\t\t// return defaultData;\n\t\t} catch (err) {\n\t\t\tconsole.log(err);\n\t\t\tthrow 'AHH';\n\t\t\treturn defaultData;\n\t\t}\n\t}\n\tcheckRemoteAssetsUse(): boolean | undefined {\n\t\tconst checkRemoteAssetsUse = this.layoutData().saveOptions?.checkRemoteAssetsUse;\n\t\tif (checkRemoteAssetsUse == null) {\n\t\t\treturn true;\n\t\t}\n\t\treturn checkRemoteAssetsUse;\n\t}\n\t// private async _export_with_callback(callback: OnExportCallback) {\n\t// \tif (StoreController.editor.userPlan.nodesCountLimitReached()) {\n\t// \t\tStoreController.editor.userPlan.displayExportsDisabledNotice();\n\t// \t\treturn;\n\t// \t}\n\n\t// \tconst response = await StoreController.editor.exportFormWeb.display();\n\t// \tconst exportType = response.exportType;\n\n\t// \tthis._save_with_callback(async (scene, scene_data, layout_data) => {\n\t// \t\tconst blobs = await SelfContainedSceneWriterAssembler.getBlobs(scene, scene_data, layout_data, exportType);\n\t// \t\tif (blobs) {\n\t// \t\t\tcallback(scene, blobs, scene_data, layout_data);\n\t// \t\t}\n\t// \t});\n\t// }\n\tprivate async _viewExportWithCallback(callback: OnViewExportCallback) {\n\t\tconst scene = AppSceneLoader.scene();\n\t\tif (!scene) {\n\t\t\tconsole.warn('cannot save, no scene has been loaded');\n\t\t\treturn;\n\t\t}\n\t\tif (!scene.name()) {\n\t\t\tawait StoreController.editor.dialogNotice.show({\n\t\t\t\ttitle: 'Scene has no name',\n\t\t\t\tmessage: 'Please save your scene first',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (StoreController.editor.userPlan.nodesCountLimitReached()) {\n\t\t\tStoreController.editor.userPlan.displayExportsDisabledNotice();\n\t\t\treturn;\n\t\t}\n\t\tcallback(scene);\n\t}\n\n\tnew_scene() {\n\t\tconst callback = this._callbacks[EditorEvent.NEW_SCENE];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\topen_dashboard() {\n\t\tif (FigmaPluginController.active()) {\n\t\t\tFigmaPluginController.sendMessageOpenDashboard();\n\t\t\treturn;\n\t\t}\n\t\tconst callback = this._callbacks[EditorEvent.DASHBOARD];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\topen_play_page() {\n\t\tconst callback = this._callbacks[EditorEvent.PLAY];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\t// export_scene() {\n\t// \tconst callback = this._callbacks[EditorEvent.EXPORT];\n\t// \tif (callback) {\n\t// \t\tthis._export_with_callback(callback);\n\t// \t}\n\t// }\n\tviewExport() {\n\t\tconst callback = this._callbacks[EditorEvent.VIEW_EXPORT];\n\t\tif (callback) {\n\t\t\tthis._viewExportWithCallback(callback);\n\t\t}\n\t}\n\topen_settings() {\n\t\tconst callback = this._callbacks[EditorEvent.SETTINGS];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\tcreatePolyNode(data: PolyNodeCreateCallbackData) {\n\t\tconst callback = this._callbacks[EditorEvent.CREATE_POLY_NODE];\n\t\tif (callback) {\n\t\t\tcallback(data);\n\t\t} else {\n\t\t\tconsole.error(' no editor callback for ', EditorEvent.CREATE_POLY_NODE);\n\t\t}\n\t}\n\tsavePolyNode(data: PolyNodeUpdateCallbackData) {\n\t\tconst callback = this._callbacks[EditorEvent.SAVE_POLY_NODE];\n\t\tif (callback) {\n\t\t\tcallback(data);\n\t\t} else {\n\t\t\tconsole.error(' no editor callback for ', EditorEvent.CREATE_POLY_NODE);\n\t\t}\n\t}\n\tasync marketplaceDownloadPolyNode(data: PolyNodeDownloadCallbackData) {\n\t\tconst callback = this._callbacks[EditorEvent.MARKETPLACE_DOWNLOAD_POLY_NODE];\n\t\tif (callback) {\n\t\t\tawait callback(data);\n\t\t}\n\t}\n\tasync marketplaceUploadPolyNode(data: PolyNodeUploadCallbackData) {\n\t\tconst callback = this._callbacks[EditorEvent.MARKETPLACE_UPLOAD_POLY_NODE];\n\t\tif (callback) {\n\t\t\tawait callback(data);\n\t\t}\n\t}\n\tasync marketplaceIndexPolyNode(data: PolyNodeIndexCallbackData = {}) {\n\t\tconst callback = this._callbacks[EditorEvent.MARKETPLACE_INDEX_POLY_NODE];\n\t\tif (callback) {\n\t\t\treturn await callback(data);\n\t\t}\n\t}\n\tasync marketplacePolyNodeSearch(q: string) {\n\t\tconst callback = this._callbacks[EditorEvent.MARKETPLACE_SEARCH];\n\t\tif (callback) {\n\t\t\treturn await callback({q});\n\t\t}\n\t}\n\t//\n\t// Desktop\n\t//\n\t// new_project(options: NewProjectOptions) {\n\t// \tconst callback = this._callbacks[EditorEvent.NEW_PROJECT];\n\t// \tif (callback) {\n\t// \t\tcallback(options);\n\t// \t}\n\t// }\n\t// open_project() {\n\t// \tconst callback = this._callbacks[EditorEvent.OPEN_PROJECT];\n\t// \tif (callback) {\n\t// \t\tcallback();\n\t// \t}\n\t// }\n\t// save_project() {\n\t// \tconst callback = this._callbacks[EditorEvent.SAVE_PROJECT];\n\t// \tif (callback) {\n\t// \t\tthis._save_with_callback(callback);\n\t// \t}\n\t// }\n\n\t//\n\t// user\n\t//\n\tlogout() {\n\t\tconst callback = this._callbacks[EditorEvent.LOGOUT];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\taccountSettings() {\n\t\tconst root = process.env.NODE_ENV != 'development' ? 'http://localhost:5000' : 'https://polygonjs.com';\n\t\tthis.open_in_new_tab(`${root}/account`);\n\t\t// const callback = this._callbacks[EditorEvent.ACCOUNT_SETTINGS];\n\t\t// if (callback) {\n\t\t// \tcallback();\n\t\t// }\n\t}\n\tdisplayLoginForm() {\n\t\tconst callback = this._callbacks[EditorEvent.DISPLAY_LOGIN_FORM];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\trunOnMountedCallback() {\n\t\tconst callback = this._callbacks[EditorEvent.MOUNTED];\n\t\tif (callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\t// quit() {\n\t// \tconst callback = this._callbacks[EditorEvent.QUIT];\n\t// \tif (callback) {\n\t// \t\tcallback();\n\t// \t}\n\t// }\n\t// browse_file(param: StringParam, file_types: FileType[]): Promise<string | undefined> {\n\t// \treturn new Promise((resolve) => {\n\t// \t\tconst callback = this._callbacks[EditorEvent.FILE_BROWSE];\n\t// \t\tif (callback) {\n\t// \t\t\tconst path = callback(param, file_types, param.raw_input);\n\t// \t\t\tresolve(path);\n\t// \t\t}\n\t// \t});\n\t// }\n\n\tset_callback<T extends EditorEvent>(event_name: T, callback: CallbackByEditorEvent[T]) {\n\t\tthis._callbacks[event_name] = callback;\n\t}\n\tcallback<T extends EditorEvent>(event_name: T): CallbackByEditorEvent[T] {\n\t\treturn this._callbacks[event_name];\n\t}\n\thas_callback<T extends EditorEvent>(event_name: T): boolean {\n\t\treturn this._callbacks[event_name] != null;\n\t}\n\tprivate static _fileBrowseAllowed = false;\n\tstatic allowFileBrowse() {\n\t\tthis._fileBrowseAllowed = true;\n\t}\n\tstatic fileBrowseAllowed() {\n\t\treturn this._fileBrowseAllowed;\n\t}\n\n\t// private _sceneLoadedFromExample = ref(false);\n\t// sceneLoadedFromExample() {\n\t// \treturn this._sceneLoadedFromExample.value;\n\t// }\n\t// private async loadSceneData(scene_data: SceneData, props: EditorProps) {\n\t// \tif (this._loaded) {\n\t// \t\treturn;\n\t// \t}\n\t// \tthis._loaded = true;\n\n\t// \t// this.api.html.head.updateCurrentPage();\n\n\t// \t// FeaturesController.createDefinedVariables();\n\n\t// \t// const exampleId = FeaturesController.exampleId();\n\t// \t// const example = exampleId ? ExamplesRegister.exampleFromId(exampleId) : null;\n\t// \t// if (exampleId && !example) {\n\t// \t// \tconsole.warn(`example ${exampleId} not found, loading default scene`);\n\t// \t// }\n\t// \t// const scene = await (example\n\t// \t// \t? this._sceneFromExample(example, props)\n\t// \t// \t: this._sceneFromSceneData(scene_data, props));\n\t// \t// if (!scene) {\n\t// \t// \treturn;\n\t// \t// }\n\t// \t// scene.root().loadProgress.watchNodesProgress((nodesCookProgress: number, args: OnProgressArguments) => {\n\t// \t// \tif (nodesCookProgress >= 1) {\n\t// \t// \t\tscene.loadingController.dispatchReadyEvent();\n\t// \t// \t}\n\t// \t// });\n\n\t// \t// // if (scene_data.name) {\n\t// \t// // \tscene.setName(scene_data.name);\n\t// \t// // }\n\t// \t// if (scene_data.uuid) {\n\t// \t// \tscene.setUuid(scene_data.uuid);\n\t// \t// }\n\t// \t// if (scene_data.assets_root) {\n\t// \t// \tscene.assets.setRoot(scene_data.assets_root);\n\t// \t// }\n\n\t// \t// await this._onSceneCreated(scene);\n\n\t// \t// const res = this.mountScene(scene, props);\n\t// \t// if (this._onAfterLoaded) {\n\t// \t// \tthis._onAfterLoaded();\n\t// \t// }\n\t// \t// return res;\n\t// }\n\t// mountScene(scene: PolyScene, props: EditorProps) {\n\t// \tthis._scene = scene;\n\n\t// \tif (!this._scene) {\n\t// \t\tconsole.log('EDITOR LOAD ERROR');\n\t// \t}\n\n\t// \tStoreController.setScene(this._scene);\n\t// \t// this is just useful to debug in the console\n\t// \t(window as any).scene = this._scene;\n\t// \t(window as any).POLY = Poly;\n\n\t// \t// configureScene is ran after StoreController.set_scene\n\t// \t// so that if scene.play() is called in configureScene\n\t// \t// the editor will update the UI accordingly\n\t// \t// UPDATE: I need to run configureScene before,\n\t// \t// as otherwise the scene.assets.root()\n\t// \t// is not taken into account by the assets loaders.\n\t// \t// A solution for the UI to update accordingly,\n\t// \t// could simply be for it to check the state of the scene when calling set_scene()\n\t// \t// const configureScene = window.__POLYGONJS_POLY_CONFIG_CONFIGURE_SCENE;\n\t// \t// if (configureScene) {\n\t// \t// \tconfigureScene(scene);\n\t// \t// }\n\n\t// \tlet navigationHistory = props.navigationHistory;\n\t// \tlet navigationHistoryUsed = false;\n\t// \tif (navigationHistory) {\n\t// \t\ttry {\n\t// \t\t\tStoreController.editor.navigationHistory.fromJSON(navigationHistory);\n\t// \t\t\tnavigationHistoryUsed = true;\n\t// \t\t} catch (err) {\n\t// \t\t\tconsole.error('could not parse navigationHistory');\n\t// \t\t\tconsole.log(navigationHistory);\n\t// \t\t}\n\t// \t}\n\t// \tif (!navigationHistoryUsed) {\n\t// \t\tlet currentNodes = props.currentNodes;\n\t// \t\tif (!currentNodes) {\n\t// \t\t\tcurrentNodes = [props.current_node || '/'];\n\t// \t\t}\n\t// \t\tlet cmptr = 0;\n\t// \t\tlet lastCurrentNode = currentNodes[cmptr];\n\t// \t\tfor (let index = 0; index < AVAILABLE_LINK_INDEX_VALUES.length; index++) {\n\t// \t\t\tconst currentNode = currentNodes[cmptr] || lastCurrentNode;\n\t// \t\t\tconst node = this._scene.node(currentNode);\n\t// \t\t\tif (node) {\n\t// \t\t\t\tStoreController.editor.setCurrentNode(AVAILABLE_LINK_INDEX_VALUES[index], node);\n\t// \t\t\t} else {\n\t// \t\t\t\t// console.warn(`node '${currentNode}' not found for index '${index}'`);\n\t// \t\t\t}\n\t// \t\t\tcmptr++;\n\t// \t\t\tlastCurrentNode = currentNode;\n\t// \t\t}\n\t// \t}\n\n\t// \tlet fullscreenPanelId = props.fullscreenPanelId;\n\t// \tif (fullscreenPanelId == null) {\n\t// \t\tfullscreenPanelId = (props as EditorPropsLegacy).fullscreen_panel_id;\n\t// \t}\n\t// \tif (fullscreenPanelId) {\n\t// \t\tStoreController.editor.panel.setFullscreenPanelId(fullscreenPanelId);\n\t// \t}\n\t// \tStoreController.editor.preferences.setFromEditor(props);\n\t// \tStoreController.editor.paramsModals.setFromEditor(props);\n\n\t// \t// let app_element: HTMLElement | null;\n\t// \t// if (element_or_id instanceof HTMLElement) {\n\t// \t// \tapp_element = element_or_id;\n\t// \t// } else {\n\t// \t// \tapp_element = document.getElementById(element_or_id);\n\t// \t// }\n\t// \t// if (app_element) {\n\t// \t// \tconst upload_allowed_extensions_by_file_type = app_element.dataset['uploadAllowedExtensionsByFileType'];\n\t// \t// \tif (upload_allowed_extensions_by_file_type) {\n\t// \t// \t\tthis._upload_allowed_extensions_by_file_type = JSON.parse(upload_allowed_extensions_by_file_type);\n\t// \t// \t}\n\t// \t// }\n\n\t// \t// TODO: vue3\n\t// \t// console.log(EditorComponent);\n\t// \t// const vnode = DebugJSX\n\n\t// \t// console.warn('mount app');\n\t// \t// const app = createApp(AppComponent as any as Component<any, any, any, ComputedOptions, MethodOptions>);\n\t// \t// app.use(router);\n\t// \t// app.component('MultiplePanel', MultiplePanel as any);\n\t// \t// app.component('DropDownMenu', DropDownMenu as any);\n\t// \t// app.component('DropDownMenuModal', DropDownMenuModal as any);\n\t// \t// app.component('NodeTree', NodeTree as any);\n\t// \t// app.component('font-awesome-icon', FontAwesomeIcon);\n\n\t// \t// // const iconNames = Object.keys(Heroicons);\n\t// \t// // for (let iconName of iconNames) {\n\t// \t// // \tapp.component(iconName, Heroicons[iconName]);\n\t// \t// // }\n\n\t// \t// this._vueInstance = app;\n\n\t// \t// window.editor = this;\n\t// \t// // console.log(\n\t// \t// // \telement_or_id,\n\t// \t// // \ttypeof element_or_id == 'string' ? document.getElementById(element_or_id) : element_or_id\n\t// \t// // );\n\t// \t// this._editor_component = app.mount(element_or_id);\n\t// \t// console.log(result, result.layoutData);\n\t// \t// this._vueInstance\n\t// \t// this._vueInstance = new Vue({\n\t// \t// \tel: element_or_id,\n\t// \t// \tstore: EditorStore,\n\t// \t// \trender: (createElement) => {\n\t// \t// \t\treturn createElement(EditorComponent, {\n\t// \t// \t\t\tprops: props,\n\t// \t// \t\t});\n\t// \t// \t},\n\t// \t// });\n\t// \t// console.log(this._vueInstance, this._vueInstance._component);\n\t// \t// this._editor_component = this._vueInstance._component; //.$children[0];\n\t// \treturn this._scene;\n\t// }\n\t// private async _sceneFromSceneData(scene_data: SceneData, props: EditorProps) {\n\t// \tconst configureScene = window.__POLYGONJS_POLY_CONFIG_CONFIGURE_SCENE;\n\t// \tconst importer = new SceneJsonImporter(scene_data.json, {\n\t// \t\tconfigureScene,\n\t// \t\tsceneName: scene_data.name,\n\t// \t\tmeasurePerformanceOnLoad: FeaturesController.measurePerformanceOnLoad(),\n\t// \t});\n\t// \timporter.setMigrateHelper(new JsonImporterMigrateHelper(importer));\n\t// \tconst scene = await importer.scene();\n\t// \tprops.scene_load_warnings = importer.report.warnings();\n\t// \t// readonly\n\t// \tconst sceneReadonly = importer.report.readonly();\n\t// \tconst loadedWithoutAssemblers = importer.report.loadedWithoutAssemblers();\n\t// \tif (sceneReadonly) {\n\t// \t\tStoreController.editor.readonly.markAsReadonly();\n\t// \t}\n\t// \tif (loadedWithoutAssemblers) {\n\t// \t\tStoreController.editor.readonly.markAsLoadedWithoutAssemblers();\n\t// \t}\n\t// \treturn scene;\n\t// }\n\t// private _onAfterLoaded: OnAfterExampleLoaded | undefined;\n\t// private async _sceneFromExample(example: Example, props: EditorProps) {\n\t// \tconsole.log(`>>> loading example '${example.name()}'`);\n\t// \t// make sure to set loading mode, as well as cooker block/unblock\n\t// \tconst scene = new PolyScene();\n\t// \t// scene.setName(exampleId); // scene is not saved, and therefore should not have a name\n\t// \tdocument.title = example.name();\n\t// \tscene.setName(example.name());\n\t// \tthis._sceneLoadedFromExample.value = true;\n\t// \tscene.loadingController.markAsLoading();\n\t// \tscene.cooker.block();\n\t// \tconst {focusedNodes, autoLayout, playWhenLoaded, cameraPath, onAfterLoaded} = example.data(scene);\n\t// \tscene.root().mainCameraController.setCameraPath(cameraPath);\n\n\t// \tlet doPlayWhenloaded = playWhenLoaded;\n\t// \tif (doPlayWhenloaded == null) {\n\t// \t\tdoPlayWhenloaded = false;\n\t// \t}\n\t// \tscene.loadingController.markAsLoaded();\n\t// \tscene.cooker.unblock();\n\t// \tif (doPlayWhenloaded) {\n\t// \t\tasync function _waitForSceneLoad(): Promise<void> {\n\t// \t\t\treturn new Promise((resolve) => {\n\t// \t\t\t\tscene\n\t// \t\t\t\t\t.root()\n\t// \t\t\t\t\t.loadProgress.watchNodesProgress((nodesCookProgress: number, args: OnProgressArguments) => {\n\t// \t\t\t\t\t\tif (nodesCookProgress == 1) {\n\t// \t\t\t\t\t\t\tresolve();\n\t// \t\t\t\t\t\t}\n\t// \t\t\t\t\t});\n\t// \t\t\t});\n\t// \t\t}\n\t// \t\tawait _waitForSceneLoad();\n\t// \t\tif (onAfterLoaded) {\n\t// \t\t\tthis._onAfterLoaded = onAfterLoaded;\n\t// \t\t}\n\t// \t\tscene.play();\n\t// \t}\n\n\t// \t// current node\n\t// \tlet currentNodePath = undefined;\n\t// \tconst firstNode = focusedNodes[0];\n\t// \tif (firstNode) {\n\t// \t\tconst parent = firstNode.parent();\n\t// \t\tif (parent) {\n\t// \t\t\tcurrentNodePath = parent.path();\n\t// \t\t\tprops.current_node = currentNodePath;\n\t// \t\t\tprops.currentNodes = undefined;\n\t// \t\t\tprops.navigationHistory = undefined;\n\t// \t\t\tparent.childrenController?.selection.set(focusedNodes);\n\t// \t\t}\n\t// \t}\n\n\t// \t// auto layout\n\t// \tlet doAutoLayout = autoLayout;\n\t// \tif (doAutoLayout == null) {\n\t// \t\tdoAutoLayout = false;\n\t// \t}\n\t// \tif (doAutoLayout) {\n\t// \t\tconst autoLayout = new CoreAutoLayout();\n\t// \t\tautoLayout.traverseScene(scene);\n\t// \t}\n\t// \t// we need to remove the init_layout_data\n\t// \t// in case it contains a viewer data which would try and load a non existing camera.\n\t// \t// That said, this removal could be more targeted toward the viewers only.\n\t// \t// Or it may also be good to leave it like this, as the whole layout\n\t// \t// may be undesirable for the demo scene\n\t// \tprops.init_layout_data = undefined;\n\n\t// \treturn scene;\n\t// }\n\t// private _unmount() {\n\t// \tif (!this._vueInstance) {\n\t// \t\treturn;\n\t// \t}\n\t// \tthis._vueInstance.unmount();\n\t// \t// this._vueInstance\n\t// \tthis._vueInstance = undefined;\n\t// \t// TODO: vue3\n\n\t// \t// if (this._vueInstance) {\n\t// \t// \tconst element = this._vueInstance.$el;\n\t// \t// \tif (element) {\n\t// \t// \t\telement.parentElement?.removeChild(element);\n\t// \t// \t}\n\t// \t// \tthis._vueInstance.$destroy();\n\t// \t// \tthis._vueInstance = undefined;\n\t// \t// }\n\t// }\n\n\topen_in_new_tab(url: string) {\n\t\tconst link = document.createElement('a');\n\t\t// if (!DesktopController.instance().active()) {\n\t\t// do not add _blank when using the desktop app\n\t\t// as it would open outside of it.\n\t\t// UPDATE: Now that the desktop app is only a single page with the editor, this is fine\n\t\tlink.setAttribute('target', '_blank');\n\t\t// } else {\n\t\t// but we need information to know if we need to display a prompt\n\t\t// \tconst prompt_required = WindowController.instance().prompt_required();\n\t\t// \tif (prompt_required) {\n\t\t// \t\turl = `${url}?prompt_required=1`;\n\t\t// \t}\n\t\t// }\n\t\tlink.setAttribute('href', url);\n\t\tlink.click();\n\t}\n\n\t// methods that are only here to avoir compilation recursive loops\n\t// showUpgradeRequiredNotice() {\n\t// \tStoreController.editor.dialogConfirm\n\t// \t\t.show({\n\t// \t\t\ttitle: 'Upgrade needed',\n\t// \t\t\tmessage:\n\t// \t\t\t\t'You have reached the maximum number of nodes you can create under this plan. Please upgrade to create more.',\n\t// \t\t\tacceptLabel: 'Okay, let me check the options',\n\t// \t\t})\n\t// \t\t.then((confirmResponse) => {\n\t// \t\t\tif (confirmResponse) {\n\t// \t\t\t\tconsole.log('upgrading....');\n\t// \t\t\t\tEditor.instance().open_in_new_tab('https://polygonjs.com/pricing');\n\t// \t\t\t}\n\t// \t\t});\n\t// }\n}\n","import {setToArray} from './../../../../../@polygonjs/polygonjs/src/core/SetUtils';\nimport {\n\tPanelInitLayoutData,\n\tMultiplePanelSplitMode,\n\tPanelType,\n\tPanelData,\n\tViewerPanelInitLayoutData,\n} from './../../../types';\nexport enum LayoutEntryId {\n\tVIEWPORT_ONLY = 'Viewport Only',\n\tNETWORK_RIGHT = 'Network Right',\n\tPARAMS_RIGHT = 'Params Right',\n\tVIEWPORT_LARGE = 'Viewport Large',\n\tNETWORK_AND_PARAMS = 'Network + Params',\n\tPERFORMANCE = 'Performance',\n\tSPREADSHEET = 'Spreadsheet',\n\tMULTIPLE_NETWORKS = 'Multiple Networks',\n\tSHADER_PREVIEW = 'Shader Preview',\n\tSCENE_TREE_LEFT = 'Scene Tree Left',\n\tPARAMS_STACK = 'Params Stack',\n\tANIMATION = 'Animation Editor',\n}\n\nconst viewerData: ViewerPanelInitLayoutData = {\n\tisViewerInitLayoutData: true,\n\tcamera: '/perspectiveCamera1',\n\tlinkIndex: 1,\n};\n\nconst VIEWPORT_ONLY: PanelInitLayoutData = {\n\tcurrentPanelIndex: 0,\n\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS],\n};\nconst NETWORK_RIGHT: PanelInitLayoutData = {\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.5,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.VIEWER],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: viewerData,\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.PARAMS, PanelType.SPREADSHEET],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {active_folder: null, linkIndex: 1},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS],\n\t\tcurrentPanelIndex: 0,\n\t\tpanel_data: {camera: {position: {x: 38, y: 4}, zoom: 0.5}, history: {}, linkIndex: 1},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst PARAMS_RIGHT: PanelInitLayoutData = {\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.5,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.SPREADSHEET],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: viewerData,\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {active_folder: null, linkIndex: 1},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS],\n\t\tcurrentPanelIndex: 1,\n\t\tpanel_data: {camera: {position: {x: 38, y: 4}, zoom: 0.5}, history: {}, linkIndex: 1},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst VIEWPORT_LARGE: PanelInitLayoutData = {\n\tsplit_ratio: 0.6216006216006216,\n\tsplit_panel0: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS],\n\t\tcurrentPanelIndex: 1,\n\t\tpanel_data: viewerData,\n\t},\n\tsplit_panel1: {\n\t\tsplit_ratio: 0.5,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {\n\t\t\t\tcamera: {position: {x: 10.539325842696627, y: -160.40449438202248}, zoom: 0.44499999999999995},\n\t\t\t\thistory: {},\n\t\t\t\tlinkIndex: 1,\n\t\t\t},\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS],\n\t\t\tcurrentPanelIndex: 1,\n\t\t\tpanel_data: {active_folder: null, linkIndex: 1},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst NETWORK_AND_PARAMS: PanelInitLayoutData = {\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS],\n\t\tcurrentPanelIndex: 2,\n\t\tpanel_data: {active_folder: null, linkIndex: 1},\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS],\n\t\tcurrentPanelIndex: 0,\n\t\tpanel_data: {camera: {position: {x: 38, y: 4}, zoom: 0.5}, history: {}, linkIndex: 1},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst PERFORMANCE: PanelInitLayoutData = {\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS],\n\t\tcurrentPanelIndex: 1,\n\t\tpanel_data: viewerData,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS, PanelType.PERFORMANCE],\n\t\tcurrentPanelIndex: 2,\n\t\tpanel_data: {recording: false},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst SPREADSHEET: PanelInitLayoutData = {\n\tsplit_ratio: 0.6216006216006216,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.5,\n\t\tsplit_panel0: {\n\t\t\tsplit_ratio: 0.5,\n\t\t\tsplit_panel0: {\n\t\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 1,\n\t\t\t\tpanel_data: viewerData,\n\t\t\t},\n\t\t\tsplit_panel1: {\n\t\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 2,\n\t\t\t\tpanel_data: {active_folder: null, linkIndex: 1},\n\t\t\t},\n\t\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.VIEWER, PanelType.PARAMS, PanelType.SPREADSHEET],\n\t\t\tcurrentPanelIndex: 3,\n\t\t\tpanel_data: {linkIndex: 1},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS, PanelType.PERFORMANCE],\n\t\tcurrentPanelIndex: 0,\n\t\tpanel_data: {camera: {position: {x: -8, y: 46}, zoom: 0.5}, history: {}, linkIndex: 1},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst MULTIPLE_NETWORKS: PanelInitLayoutData = {\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.31313131313131315,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: viewerData,\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tsplit_ratio: 0.48755656108597284,\n\t\t\tsplit_panel0: {\n\t\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 2,\n\t\t\t\tpanel_data: {active_folder: null, linkIndex: 1},\n\t\t\t},\n\t\t\tsplit_panel1: {\n\t\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 1,\n\t\t\t\tpanel_data: {camera: {position: {x: -26, y: -76}, zoom: 0.5}, history: {}, linkIndex: 1},\n\t\t\t},\n\t\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t},\n\tsplit_panel1: {\n\t\tsplit_ratio: 0.6487956487956488,\n\t\tsplit_panel0: {\n\t\t\tsplit_ratio: 0.4802395209580838,\n\t\t\tsplit_panel0: {\n\t\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS, PanelType.SPREADSHEET],\n\t\t\t\tcurrentPanelIndex: 3,\n\t\t\t\tpanel_data: {linkIndex: 2},\n\t\t\t},\n\t\t\tsplit_panel1: {\n\t\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 2,\n\t\t\t\tpanel_data: {active_folder: 30, linkIndex: 2},\n\t\t\t},\n\t\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.VIEWER, PanelType.NETWORK, PanelType.PARAMS],\n\t\t\tcurrentPanelIndex: 1,\n\t\t\tpanel_data: {camera: {position: {x: 146, y: -10}, zoom: 0.5}, history: {}, linkIndex: 2},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t},\n\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n};\nconst SHADER_PREVIEW: PanelInitLayoutData = {\n\tsplit_ratio: 0.5316363636363637,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.37528344671201813,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.VIEWER],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: viewerData,\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tsplit_ratio: 0.5,\n\t\t\tsplit_panel0: {\n\t\t\t\tpanelTypes: [PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 0,\n\t\t\t\tpanel_data: {linkIndex: 1},\n\t\t\t},\n\t\t\tsplit_panel1: {\n\t\t\t\tpanelTypes: [PanelType.NETWORK],\n\t\t\t\tcurrentPanelIndex: 0,\n\t\t\t\tpanel_data: {\n\t\t\t\t\tcamera: {position: {x: -72.50991348200778, y: 47.21331521739131}, zoom: 0.5},\n\t\t\t\t\thistory: {'295': {position: {x: -72.50991348200778, y: 47.21331521739131}, zoom: 0.5}},\n\t\t\t\t\tlinkIndex: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS, PanelType.VIEWER, PanelType.CODE_PREVIEW],\n\t\tcurrentPanelIndex: 3,\n\t\tpanel_data: {linkIndex: 1},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst SCENE_TREE_LEFT: PanelInitLayoutData = {\n\tsplit_ratio: 0.2,\n\tsplit_panel0: {\n\t\tpanelTypes: [PanelType.SCENE_TREE],\n\t\tcurrentPanelIndex: 0,\n\t\tpanel_data: {linkIndex: 1},\n\t},\n\tsplit_panel1: NETWORK_RIGHT,\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\nconst PARAMS_STACK: PanelInitLayoutData = {\n\tsplit_ratio: 0.2890666666666667,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.5543217692883486,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.VIEWER],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {\n\t\t\t\tcamera: '/cameras/cameras:sopGroup/perspectiveCamera1',\n\t\t\t\tisViewerInitLayoutData: true,\n\t\t\t\tlinkIndex: 1,\n\t\t\t\toverlayedNetwork: {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\tdisplayed: false,\n\t\t\t\t\tinitLayoutData: {\n\t\t\t\t\t\tcamera: {position: {x: 0, y: 0}, zoom: 1},\n\t\t\t\t\t\thistory: {},\n\t\t\t\t\t\tparamsDisplayed: false,\n\t\t\t\t\t\tlinkIndex: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.SCENE_TREE, PanelType.SPREADSHEET],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {mask: '*'},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t},\n\tsplit_panel1: {\n\t\tsplit_ratio: 0.3885971492873218,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.NETWORK, PanelType.PARAMS, PanelType.VIEWER, PanelType.PARAMS_STACK],\n\t\t\tcurrentPanelIndex: 3,\n\t\t\tpanel_data: {linkIndex: 1, serializedStack: []},\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: [PanelType.NETWORK],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {\n\t\t\t\tcamera: {position: {x: 33.20225870246935, y: 235.73401791313532}, zoom: 0.9542221069335934},\n\t\t\t\thistory: {'2': {position: {x: 33.20225870246935, y: 235.73401791313532}, zoom: 0.9542221069335934}},\n\t\t\t\tparamsDisplayed: false,\n\t\t\t\tlinkIndex: 1,\n\t\t\t},\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t},\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n};\n\nconst ANIMATION: PanelInitLayoutData = {\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tsplit_ratio: 0.33,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: [PanelType.VIEWER],\n\t\t\tcurrentPanelIndex: 0,\n\t\t\tpanel_data: {linkIndex: 1},\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tsplit_ratio: 0.5,\n\t\t\tsplit_panel0: {\n\t\t\t\tpanelTypes: [PanelType.PARAMS],\n\t\t\t\tcurrentPanelIndex: 0,\n\t\t\t\tpanel_data: {linkIndex: 1},\n\t\t\t},\n\t\t\tsplit_panel1: {\n\t\t\t\tpanelTypes: [PanelType.NETWORK],\n\t\t\t\tcurrentPanelIndex: 0,\n\t\t\t\tpanel_data: {linkIndex: 1},\n\t\t\t},\n\t\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t\t},\n\t\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.ANIMATION, PanelType.NETWORK],\n\t\tcurrentPanelIndex: 0,\n\t\tpanel_data: {linkIndex: 1},\n\t},\n\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n};\nexport const LAYOUT: Record<LayoutEntryId, PanelInitLayoutData> = {\n\t[LayoutEntryId.VIEWPORT_ONLY]: VIEWPORT_ONLY,\n\t[LayoutEntryId.NETWORK_RIGHT]: NETWORK_RIGHT,\n\t[LayoutEntryId.PARAMS_RIGHT]: PARAMS_RIGHT,\n\t[LayoutEntryId.PARAMS_STACK]: PARAMS_STACK,\n\t[LayoutEntryId.VIEWPORT_LARGE]: VIEWPORT_LARGE,\n\t[LayoutEntryId.NETWORK_AND_PARAMS]: NETWORK_AND_PARAMS,\n\t[LayoutEntryId.PERFORMANCE]: PERFORMANCE,\n\t[LayoutEntryId.SPREADSHEET]: SPREADSHEET,\n\t[LayoutEntryId.MULTIPLE_NETWORKS]: MULTIPLE_NETWORKS,\n\t[LayoutEntryId.SHADER_PREVIEW]: SHADER_PREVIEW,\n\t[LayoutEntryId.SCENE_TREE_LEFT]: SCENE_TREE_LEFT,\n\t[LayoutEntryId.ANIMATION]: ANIMATION,\n};\n\nfunction traversePanels(initData: PanelInitLayoutData, callback: (panelData: PanelData) => void) {\n\tconst {panel_data, split_panel0, split_panel1} = initData;\n\tif (panel_data) {\n\t\tcallback(panel_data);\n\t\treturn;\n\t} else {\n\t\tif (split_panel0 && split_panel1) {\n\t\t\ttraversePanels(split_panel0, callback);\n\t\t\ttraversePanels(split_panel1, callback);\n\t\t\treturn;\n\t\t}\n\t}\n\tconsole.warn('shouldnt be here (no panel_data or split_panels)', initData);\n}\nfunction getCameraPaths(initData: PanelInitLayoutData) {\n\tconst set: Set<string> = new Set();\n\ttraversePanels(initData, (panelData) => {\n\t\tif ((panelData as ViewerPanelInitLayoutData).isViewerInitLayoutData) {\n\t\t\tconst viewerData = panelData as ViewerPanelInitLayoutData;\n\t\t\tif (viewerData.camera) {\n\t\t\t\tset.add(viewerData.camera);\n\t\t\t}\n\t\t}\n\t});\n\treturn setToArray(set, []);\n}\nfunction setCameraPaths(initData: PanelInitLayoutData, cameraPaths: string[]) {\n\ttraversePanels(initData, (panelData) => {\n\t\tif ((panelData as ViewerPanelInitLayoutData).isViewerInitLayoutData) {\n\t\t\tconst viewerData = panelData as ViewerPanelInitLayoutData;\n\t\t\t// if we have more than 1 cam, use the first one once,\n\t\t\t// but if there is only one, keep using that one\n\t\t\tconst camera = cameraPaths.length > 1 ? cameraPaths.shift() : cameraPaths[0];\n\t\t\tviewerData.camera = camera;\n\t\t}\n\t});\n}\nexport function transferCameraPaths(srcData: PanelInitLayoutData, dest: PanelInitLayoutData) {\n\tconst cameraPaths = getCameraPaths(srcData);\n\tsetCameraPaths(dest, cameraPaths);\n}\n\nexport function layoutDataTogglePanelType(srcData: PanelInitLayoutData, panelType: PanelType): PanelInitLayoutData {\n\tconst _panelPresent = () => {\n\t\tif ((srcData.split_mode = MultiplePanelSplitMode.HORIZONTAL)) {\n\t\t\tconst rightPanel = srcData.split_panel1;\n\t\t\tif (rightPanel) {\n\t\t\t\tconst rightPanelType = (rightPanel.panelTypes || [])[rightPanel.currentPanelIndex || 0];\n\t\t\t\treturn rightPanelType == panelType;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst panelPresent = _panelPresent();\n\n\tif (panelPresent) {\n\t\tconst leftPanel = srcData.split_panel0;\n\t\tif (!leftPanel) {\n\t\t\treturn srcData;\n\t\t}\n\n\t\tsrcData.split_panel0 = leftPanel.split_panel0;\n\t\tsrcData.split_panel1 = leftPanel.split_panel1;\n\t\tsrcData.split_mode = leftPanel.split_mode;\n\t\tsrcData.split_ratio = leftPanel.split_ratio;\n\t\tsrcData.panel_data = leftPanel.panel_data;\n\t} else {\n\t\tconst currentPanels = {...srcData};\n\t\tsrcData.split_panel0 = currentPanels;\n\t\tsrcData.split_panel1 = {\n\t\t\tpanelTypes: [panelType],\n\t\t\tcurrentPanelIndex: 0,\n\t\t};\n\t\tsrcData.split_mode = MultiplePanelSplitMode.HORIZONTAL;\n\t\tsrcData.split_ratio = 0.66;\n\t\tsrcData.panel_data = {};\n\t}\n\n\t// if ((srcData.split_mode = MultiplePanelSplitMode.HORIZONTAL)) {\n\t// \tconst rightPanel = srcData.split_panel1;\n\t// \tif (rightPanel) {\n\t// \t\tconst rightPanelType = (rightPanel.panelTypes || [])[rightPanel.currentPanelIndex || 0];\n\t// \t\tif (rightPanelType != PanelType.CODE_PREVIEW) {\n\t// \t\t\trightPanel.panelTypes = [PanelType.CODE_PREVIEW, rightPanelType];\n\t// \t\t\trightPanel.currentPanelIndex = 0;\n\t// \t\t}\n\t// \t}\n\t// }\n\n\t// srcData.split_ratio = 0.5;\n\treturn srcData;\n}\n\nexport function layoutDataToggleCodePreview(srcData: PanelInitLayoutData): PanelInitLayoutData {\n\treturn layoutDataTogglePanelType(srcData, PanelType.CODE_PREVIEW);\n}\nexport function layoutDataToggleSceneTree(srcData: PanelInitLayoutData): PanelInitLayoutData {\n\treturn layoutDataTogglePanelType(srcData, PanelType.SCENE_TREE);\n}\nexport function layoutDataToggleParamsStack(srcData: PanelInitLayoutData): PanelInitLayoutData {\n\treturn layoutDataTogglePanelType(srcData, PanelType.PARAMS_STACK);\n}\n","import {TypedViewer} from '../../../../../@polygonjs/polygonjs/src/engine/viewers/_Base';\nimport {Ref, ref} from 'vue';\nimport {Editor} from '../../../Editor';\nimport {PanelInitLayoutData} from '../../../types';\nimport {transferCameraPaths} from './Layout';\n\nexport class LayoutSwitchControllerClass {\n\tprivate static _instance: LayoutSwitchControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new LayoutSwitchControllerClass());\n\t}\n\n\tprivate _inProgress = ref(false);\n\tprivate _canvasesById: Map<string, HTMLCanvasElement> = new Map();\n\tprivate _canvases: HTMLCanvasElement[] = [];\n\tpublic readonly layoutRef: Ref<PanelInitLayoutData | null> = ref(null);\n\n\tinProgress() {\n\t\treturn this._inProgress.value;\n\t}\n\tsetInProgress(state: boolean) {\n\t\tthis._inProgress.value = state;\n\t\tif (state == true) {\n\t\t\tthis._canvases.splice(0, this._canvases.length);\n\t\t\tthis._canvasesById.forEach((canvas) => this._canvases.push(canvas));\n\t\t}\n\t}\n\n\tcanvas() {\n\t\tconst _createCanvas = () => {\n\t\t\tconst canvas = TypedViewer.createCanvas();\n\t\t\tthis._canvasesById.set(canvas.id, canvas);\n\t\t\treturn canvas;\n\t\t};\n\t\tif (!this.inProgress()) {\n\t\t\tconst canvas = _createCanvas();\n\t\t\treturn canvas;\n\t\t} else {\n\t\t\treturn this._canvases.shift() || _createCanvas();\n\t\t}\n\t}\n\tupdateLayout(layoutData: PanelInitLayoutData, callback: (newLayoutData: PanelInitLayoutData) => void) {\n\t\tthis.setInProgress(true);\n\t\tconst currentLayoutData = Editor.instance().layoutData();\n\t\tconst clonedLayoutData: PanelInitLayoutData = JSON.parse(JSON.stringify(layoutData));\n\t\ttransferCameraPaths(currentLayoutData.multiple_panel, clonedLayoutData);\n\t\tcallback(clonedLayoutData);\n\t\tthis.layoutRef.value = clonedLayoutData;\n\t\tsetTimeout(() => {\n\t\t\tthis.setInProgress(false);\n\t\t}, 2000);\n\t}\n}\n\nexport const LayoutSwitchController = LayoutSwitchControllerClass.instance();\n","import {computed, Ref, ref} from 'vue';\nimport {StoreController} from '../../store/controllers/StoreController';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport type {NodeSerializerData} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {CoreGraphNodeId} from '../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {SetupLinkIndexReturn} from '../panels/common/LinkIndex';\n\nexport interface SetupSelectedNodeOptions {\n\t// id\n\tfirst_selected_node_id: Readonly<Ref<CoreGraphNodeId | null>>;\n\tfirst_or_previous_selected_node_id: Readonly<Ref<CoreGraphNodeId | null>>;\n\t// isRootNode: Readonly<Ref<boolean>>;\n\t// json node\n\tfirst_selected_json_node: Readonly<Ref<Readonly<NodeSerializerData> | null>>;\n\tfirst_or_previous_selected_json_node: Readonly<Ref<Readonly<NodeSerializerData> | null>>;\n\t// json node name, type\n\tselected_node_name: Readonly<Ref<string | undefined>>;\n\tselected_node_type: Readonly<Ref<string | undefined>>;\n\tselected_or_previous_node_name: Readonly<Ref<string | undefined>>;\n\tselected_or_previous_node_type: Readonly<Ref<string | undefined>>;\n\t// display_selected_or_previous_node_type: Readonly<Ref<boolean>>;\n\t// node\n\tfirst_selected_node: () => BaseNodeType | null;\n\tfirst_or_previous_node: () => BaseNodeType | null;\n}\n\nexport function SetupSelectedNode(setupLinkIndex: SetupLinkIndexReturn): SetupSelectedNodeOptions {\n\tconst previous_first_selected_node_id: Ref<number | null> = ref(null);\n\n\t//\n\t//\n\t// ID\n\t//\n\t//\n\tconst first_selected_node_id = computed(() => {\n\t\t// if (StoreController.editor.rootSelected()) {\n\t\t// \treturn StoreController.editor.scene.root().graphNodeId();\n\t\t// }\n\t\tconst parent_node_id = StoreController.editor.current_node_graph_id(setupLinkIndex.linkIndex.value);\n\t\tif (parent_node_id) {\n\t\t\tconst parent_node_json = StoreController.engine.json_node(parent_node_id);\n\t\t\tif (parent_node_json && parent_node_json.selection) {\n\t\t\t\tconst id = parent_node_json.selection[0];\n\t\t\t\tif (id != null) {\n\t\t\t\t\tprevious_first_selected_node_id.value = id;\n\t\t\t\t}\n\t\t\t\treturn id;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t});\n\tconst first_or_previous_selected_node_id = computed(() => {\n\t\treturn first_selected_node_id.value || previous_first_selected_node_id.value;\n\t});\n\n\t// const isRootNode = computed(() => {\n\t// \treturn StoreController.editor.rootSelected();\n\t// });\n\t//\n\t//\n\t// JSON NODE\n\t//\n\t//\n\tconst first_selected_json_node = computed(() => {\n\t\tif (first_selected_node_id.value) {\n\t\t\treturn StoreController.engine.json_node(first_selected_node_id.value);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t});\n\tconst previous_selected_json_node = computed(() => {\n\t\tif (previous_first_selected_node_id.value) {\n\t\t\treturn StoreController.engine.json_node(previous_first_selected_node_id.value);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t});\n\tconst first_or_previous_selected_json_node = computed(() => {\n\t\treturn first_selected_json_node.value || previous_selected_json_node.value;\n\t});\n\n\t//\n\t//\n\t// JSON NODE NAME, TYPE\n\t//\n\t//\n\tconst selected_node_name = computed(() => {\n\t\treturn first_selected_json_node.value?.name;\n\t});\n\tconst selected_node_type = computed(() => {\n\t\treturn first_selected_json_node.value?.type;\n\t});\n\tconst previous_node_name = computed(() => {\n\t\treturn previous_selected_json_node.value?.name;\n\t});\n\tconst previous_node_type = computed(() => {\n\t\treturn previous_selected_json_node.value?.type;\n\t});\n\tconst selected_or_previous_node_name = computed(() => {\n\t\treturn selected_node_name.value || previous_node_name.value;\n\t});\n\tconst selected_or_previous_node_type = computed(() => {\n\t\treturn selected_node_type.value || previous_node_type.value;\n\t});\n\t// const display_selected_or_previous_node_type = computed(() => {\n\t// \treturn (\n\t// \t\t!isRootNode.value &&\n\t// \t\tselected_or_previous_node_type.value != null &&\n\t// \t\tselected_or_previous_node_type.value.length > 0\n\t// \t);\n\t// });\n\n\t//\n\t//\n\t// NODE\n\t//\n\t//\n\tfunction first_selected_node() {\n\t\tconst id = first_selected_node_id.value;\n\t\tif (id) {\n\t\t\treturn StoreController.engine.node(id);\n\t\t}\n\t\treturn null;\n\t}\n\tfunction previous_node() {\n\t\tconst id = previous_first_selected_node_id.value;\n\t\tif (id) {\n\t\t\treturn StoreController.engine.node(id);\n\t\t}\n\t\treturn null;\n\t}\n\tfunction first_or_previous_node() {\n\t\treturn first_selected_node() || previous_node();\n\t}\n\n\treturn {\n\t\t// id\n\t\tfirst_selected_node_id,\n\t\tfirst_or_previous_selected_node_id,\n\t\t// isRootNode,\n\t\t// json node\n\t\tfirst_selected_json_node,\n\t\tfirst_or_previous_selected_json_node,\n\t\t// json node name, type\n\t\tselected_node_name,\n\t\tselected_node_type,\n\t\tselected_or_previous_node_name,\n\t\tselected_or_previous_node_type,\n\t\t// display_selected_or_previous_node_type,\n\t\t// node\n\t\tfirst_selected_node,\n\t\tfirst_or_previous_node,\n\t};\n}\n","import {ref, Ref} from 'vue';\n\nexport type LinkIndex = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface LinkIndexInitLayoutData {\n\tlinkIndex: LinkIndex;\n}\n// interface SetupLinkIndexProps {\n// \tinit_layout_data: LinkIndexInitLayoutData;\n// }\n\nexport const AVAILABLE_LINK_INDEX_VALUES: LinkIndex[] = [1, 2, 3, 4, 5, 6, 7, 8];\n\nfunction linkIndexPropValidator(value: number) {\n\treturn AVAILABLE_LINK_INDEX_VALUES.includes(value as LinkIndex);\n}\nexport const linkIndexProps = {\n\tlinkIndex: {\n\t\ttype: Number as () => LinkIndex,\n\t\trequired: true as true,\n\t\tvalidator: linkIndexPropValidator,\n\t},\n};\nexport interface LinkIndexProps {\n\tlinkIndex: LinkIndex;\n}\n\nexport interface SetupLinkIndexReturn {\n\tlinkIndex: Ref<LinkIndex>;\n\tonLinkIndexUpdate: (index: LinkIndex) => void;\n\tfromJSON(json: LinkIndexInitLayoutData): void;\n\ttoJSON(): LinkIndexInitLayoutData;\n}\n\nexport function SetupLinkIndex(initLinkIndex?: LinkIndex): SetupLinkIndexReturn {\n\tif (initLinkIndex == null) {\n\t\tinitLinkIndex = AVAILABLE_LINK_INDEX_VALUES[0];\n\t}\n\tconst linkIndex = ref(initLinkIndex);\n\n\tfunction fromJSON(json: LinkIndexInitLayoutData) {\n\t\tconst newLinkIndex = json['linkIndex'];\n\t\tif (newLinkIndex != null) {\n\t\t\tlinkIndex.value = newLinkIndex;\n\t\t}\n\t}\n\tfunction toJSON() {\n\t\treturn {\n\t\t\tlinkIndex: linkIndex.value,\n\t\t};\n\t}\n\n\tfunction onLinkIndexUpdate(index: LinkIndex) {\n\t\tlinkIndex.value = index;\n\t}\n\n\treturn {linkIndex, onLinkIndexUpdate, fromJSON, toJSON};\n}\n","import {PanelInitLayoutData, MultiplePanelSplitMode, PanelType} from '../../../../types';\nimport {computed, Ref} from 'vue';\nimport {SetupMultiplePanelSplit} from './Split';\nimport {ComponentPublicInstance} from 'vue';\nconst DEFAULT_PANELS = [PanelType.VIEWER, PanelType.PARAMS, PanelType.NETWORK];\n\nexport const DEFAULT_LAYOUT: PanelInitLayoutData = {\n\tsplit_mode: MultiplePanelSplitMode.HORIZONTAL,\n\tsplit_ratio: 0.5,\n\tsplit_panel0: {\n\t\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\t\tsplit_ratio: 0.5,\n\t\tsplit_panel0: {\n\t\t\tpanelTypes: DEFAULT_PANELS,\n\t\t\tcurrentPanelIndex: DEFAULT_PANELS.indexOf(PanelType.VIEWER),\n\t\t},\n\t\tsplit_panel1: {\n\t\t\tpanelTypes: DEFAULT_PANELS,\n\t\t\tcurrentPanelIndex: DEFAULT_PANELS.indexOf(PanelType.PARAMS),\n\t\t},\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: DEFAULT_PANELS,\n\t\tcurrentPanelIndex: DEFAULT_PANELS.indexOf(PanelType.NETWORK),\n\t},\n};\n\nexport function SetupMultiplePanelLayoutData(\n\t// current_panel: Ref<Vue | null>,\n\tsplit_panel0: Ref<ComponentPublicInstance<any> | null>,\n\tsplit_panel1: Ref<ComponentPublicInstance<any> | null>,\n\tSplitMixin: ReturnType<typeof SetupMultiplePanelSplit>,\n\t// PanelsMixin: ReturnType<typeof SetupMultiplePanelPanels>,\n\tinit_properties_for_split_panels: () => PanelInitLayoutData\n\t// image_element_ref: Ref<HTMLElement>,\n\t// {emit},\n) {\n\tconst linkIndex = computed(() => {\n\t\treturn (init_properties_for_split_panels().panel_data as any).linkIndex || -1;\n\t});\n\n\tfunction layoutData(): PanelInitLayoutData {\n\t\tif (SplitMixin.isSplit.value) {\n\t\t\tconst data: PanelInitLayoutData = {\n\t\t\t\tsplit_ratio: SplitMixin.split_ratio.value,\n\t\t\t\tsplit_panel0: (split_panel0.value as any).layoutData(),\n\t\t\t\tsplit_panel1: (split_panel1.value as any).layoutData(),\n\t\t\t};\n\t\t\tif (SplitMixin.split_mode.value) {\n\t\t\t\tdata['split_mode'] = SplitMixin.split_mode.value;\n\t\t\t}\n\t\t\treturn data;\n\t\t} else {\n\t\t\treturn init_properties_for_split_panels();\n\t\t\t// const panelTypes: string[] = PanelsMixin.panelTypes.value;\n\t\t\t// const currentPanelIndex = panelTypes.indexOf(PanelsMixin.currentPanelType.value);\n\t\t\t// return {\n\t\t\t// \tpanelTypes: panelTypes,\n\t\t\t// \tcurrentPanelIndex: currentPanelIndex,\n\t\t\t// \tpanel_data: (current_panel.value as any).layoutData(),\n\t\t\t// };\n\t\t}\n\t}\n\n\treturn {\n\t\tlinkIndex,\n\t\tlayoutData,\n\t};\n}\n","import {Editor} from './../../../../../../Editor';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {computed} from 'vue';\nimport {NodeSetCommentCommand} from '../../../../../../history/commands/NodeSetComment';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {BaseNodeType} from '../../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nexport async function editNodeComment(node: BaseNodeType) {\n\tif (node.insideALockedParent()) {\n\t\tconsole.warn('node is inside a locked parent, and therefore its comment cannot be edited');\n\t\treturn;\n\t}\n\n\tconst currentComment = node.uiData.comment();\n\tconst formValue: string = currentComment ? splitCommentLines(currentComment).join('\\n\\r') : '';\n\tconst has_comment: boolean = currentComment != null && currentComment != '';\n\tconst title = has_comment ? 'Update comment' : 'Add comment';\n\tconst new_comment = await StoreController.editor.dialogPrompt.show({\n\t\ttitle: title,\n\t\tmultiline: true,\n\t\tdefaultValue: formValue || '',\n\t\tconfirmLabel: 'Save',\n\t});\n\tif (new_comment == null) {\n\t\treturn;\n\t}\n\tconst parent = node.parent();\n\tif (!parent) {\n\t\treturn;\n\t}\n\tconst cmd = new NodeSetCommentCommand(parent, node, new_comment);\n\tawait Editor.instance().pushCommand(cmd);\n}\n\nexport function splitCommentLines(comment: string) {\n\tfunction _splitWeirdLineBreak(word: string): string[] {\n\t\tconst characters = word.split('');\n\t\tconst newWords: string[] = [];\n\t\tlet index = 0;\n\t\tfor (let character of characters) {\n\t\t\tconst charCode = character.charCodeAt(0);\n\t\t\tif (charCode == 10) {\n\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tnewWords[index] = newWords[index] || '';\n\t\t\t\tnewWords[index] += character;\n\t\t\t}\n\t\t}\n\t\treturn newWords;\n\t}\n\t// first we need to split with 2x \\n\n\t// as this is what would be persisted in json\n\tlet linesTmp = comment.split(/\\\\n\\\\n/);\n\t// Then we also need to split with 1x \\n and this weird line break representation \"↵\"\n\t// as this is what is created when we edit/create a comment.\n\t// although for \"↵\"\n\t// it seems to escape the regex when no using it in the browser console.\n\t// So for now, I look at the char codes of each character, and if it matches the \"↵\", which has a charcode of 10,\n\t// I then replace it with \\n\n\t// This is really a code smell, though\n\n\tconst lines: string[] = [];\n\tfor (let lineTmp of linesTmp) {\n\t\tconst splitLineTmp = _splitWeirdLineBreak(lineTmp).map((w) => w.split(/(\\\\n)|(\\r)|(\\r\\n)/));\n\t\tfor (let i of splitLineTmp) {\n\t\t\tif (i)\n\t\t\t\tfor (let l of i) {\n\t\t\t\t\tif (l) {\n\t\t\t\t\t\tlines.push(l);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t}\n\treturn lines.filter((line) => line != '\\\\n');\n}\n\nexport function SetupCommentable(\n\tjson_node: EngineNodeData\n\t// body_size: Readonly<\n\t// \tRef<\n\t// \t\tReadonly<{\n\t// \t\t\tx: number;\n\t// \t\t\ty: number;\n\t// \t\t}>\n\t// \t>\n\t// >,\n\t// layout_vertical: Readonly<Ref<boolean>>,\n\t// has_params_label: Readonly<Ref<boolean>>\n) {\n\tconst comment = computed(() => {\n\t\treturn json_node.ui_data_json.comment;\n\t});\n\tconst displayComment = computed(() => {\n\t\treturn comment.value != null && comment.value != '';\n\t});\n\t// const comment_lines = computed(() => {\n\t// \tif (comment.value) {\n\t// \t\tsplitCommentLines(comment.value)\n\t// \t} else {\n\t// \t\treturn [];\n\t// \t}\n\t// });\n\n\t// const params_label_height = 25;\n\t// const vertical_margin_for_horizontal_layout = 15;\n\t// const comment_container_style_object = computed(() => {\n\t// \tif (layout_vertical.value) {\n\t// \t\treturn {\n\t// \t\t\tleft: `${0.5 * body_size.value.x}px`,\n\t// \t\t\ttop: `${0.5 * body_size.value.y + (has_params_label.value ? params_label_height : 0)}px`,\n\t// \t\t};\n\t// \t} else {\n\t// \t\treturn {\n\t// \t\t\tleft: `${+0.5 * body_size.value.x - 10}px`,\n\t// \t\t\ttop: `${\n\t// \t\t\t\t0.5 * body_size.value.y +\n\t// \t\t\t\tvertical_margin_for_horizontal_layout +\n\t// \t\t\t\t(has_params_label.value ? params_label_height : 0)\n\t// \t\t\t}px`,\n\t// \t\t};\n\t// \t}\n\t// });\n\tasync function edit_comment() {\n\t\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\t\tif (node) {\n\t\t\teditNodeComment(node);\n\t\t}\n\t}\n\n\treturn {\n\t\tdisplayComment,\n\t\tcomment,\n\t\t// comment_lines,\n\t\t// comment_container_style_object,\n\t\tedit_comment,\n\t};\n}\n","/**\n * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2022 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n  return !Array.isArray\n    ? getTag(value) === '[object Array]'\n    : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\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  let result = value + '';\n  return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n  return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n  return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n  return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n  return (\n    value === true ||\n    value === false ||\n    (isObjectLike(value) && getTag(value) == '[object Boolean]')\n  )\n}\n\nfunction isObject(value) {\n  return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n  return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n  return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n  return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n  return value == null\n    ? value === undefined\n      ? '[object Undefined]'\n      : '[object Null]'\n    : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n  `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n  `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n  `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n  constructor(keys) {\n    this._keys = [];\n    this._keyMap = {};\n\n    let totalWeight = 0;\n\n    keys.forEach((key) => {\n      let obj = createKey(key);\n\n      totalWeight += obj.weight;\n\n      this._keys.push(obj);\n      this._keyMap[obj.id] = obj;\n\n      totalWeight += obj.weight;\n    });\n\n    // Normalize weights so that their sum is equal to 1\n    this._keys.forEach((key) => {\n      key.weight /= totalWeight;\n    });\n  }\n  get(keyId) {\n    return this._keyMap[keyId]\n  }\n  keys() {\n    return this._keys\n  }\n  toJSON() {\n    return JSON.stringify(this._keys)\n  }\n}\n\nfunction createKey(key) {\n  let path = null;\n  let id = null;\n  let src = null;\n  let weight = 1;\n  let getFn = null;\n\n  if (isString(key) || isArray(key)) {\n    src = key;\n    path = createKeyPath(key);\n    id = createKeyId(key);\n  } else {\n    if (!hasOwn.call(key, 'name')) {\n      throw new Error(MISSING_KEY_PROPERTY('name'))\n    }\n\n    const name = key.name;\n    src = name;\n\n    if (hasOwn.call(key, 'weight')) {\n      weight = key.weight;\n\n      if (weight <= 0) {\n        throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n      }\n    }\n\n    path = createKeyPath(name);\n    id = createKeyId(name);\n    getFn = key.getFn;\n  }\n\n  return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n  return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n  return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n  let list = [];\n  let arr = false;\n\n  const deepGet = (obj, path, index) => {\n    if (!isDefined(obj)) {\n      return\n    }\n    if (!path[index]) {\n      // If there's no path left, we've arrived at the object we care about.\n      list.push(obj);\n    } else {\n      let key = path[index];\n\n      const value = obj[key];\n\n      if (!isDefined(value)) {\n        return\n      }\n\n      // If we're at the last value in the path, and if it's a string/number/bool,\n      // add it to the list\n      if (\n        index === path.length - 1 &&\n        (isString(value) || isNumber(value) || isBoolean(value))\n      ) {\n        list.push(toString(value));\n      } else if (isArray(value)) {\n        arr = true;\n        // Search each item in the array.\n        for (let i = 0, len = value.length; i < len; i += 1) {\n          deepGet(value[i], path, index + 1);\n        }\n      } else if (path.length) {\n        // An object. Recurse further.\n        deepGet(value, path, index + 1);\n      }\n    }\n  };\n\n  // Backwards compatibility (since path used to be a string)\n  deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n  return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n  // Whether the matches should be included in the result set. When `true`, each record in the result\n  // set will include the indices of the matched characters.\n  // These can consequently be used for highlighting purposes.\n  includeMatches: false,\n  // When `true`, the matching function will continue to the end of a search pattern even if\n  // a perfect match has already been located in the string.\n  findAllMatches: false,\n  // Minimum number of characters that must be matched before a result is considered a match\n  minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n  // When `true`, the algorithm continues searching to the end of the input even if a perfect\n  // match is found before the end of the same input.\n  isCaseSensitive: false,\n  // When true, the matching function will continue to the end of a search pattern even if\n  includeScore: false,\n  // List of properties that will be searched. This also supports nested properties.\n  keys: [],\n  // Whether to sort the result list, by score\n  shouldSort: true,\n  // Default sort function: sort by ascending score, ascending index\n  sortFn: (a, b) =>\n    a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n  // Approximately where in the text is the pattern expected to be found?\n  location: 0,\n  // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n  // (of both letters and location), a threshold of '1.0' would match anything.\n  threshold: 0.6,\n  // Determines how close the match must be to the fuzzy location (specified above).\n  // An exact letter match which is 'distance' characters away from the fuzzy location\n  // would score as a complete mismatch. A distance of '0' requires the match be at\n  // the exact location specified, a threshold of '1000' would require a perfect match\n  // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n  distance: 100\n};\n\nconst AdvancedOptions = {\n  // When `true`, it enables the use of unix-like search commands\n  useExtendedSearch: false,\n  // The get function to use when fetching an object's properties.\n  // The default will search nested paths *ie foo.bar.baz*\n  getFn: get,\n  // When `true`, search will ignore `location` and `distance`, so it won't matter\n  // where in the string the pattern appears.\n  // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n  ignoreLocation: false,\n  // When `true`, the calculation for the relevance score (used for sorting) will\n  // ignore the field-length norm.\n  // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n  ignoreFieldNorm: false,\n  // The weight to determine how much field length norm effects scoring.\n  fieldNormWeight: 1\n};\n\nvar Config = {\n  ...BasicOptions,\n  ...MatchOptions,\n  ...FuzzyOptions,\n  ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n  const cache = new Map();\n  const m = Math.pow(10, mantissa);\n\n  return {\n    get(value) {\n      const numTokens = value.match(SPACE).length;\n\n      if (cache.has(numTokens)) {\n        return cache.get(numTokens)\n      }\n\n      // Default function is 1/sqrt(x), weight makes that variable\n      const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n      // In place of `toFixed(mantissa)`, for faster computation\n      const n = parseFloat(Math.round(norm * m) / m);\n\n      cache.set(numTokens, n);\n\n      return n\n    },\n    clear() {\n      cache.clear();\n    }\n  }\n}\n\nclass FuseIndex {\n  constructor({\n    getFn = Config.getFn,\n    fieldNormWeight = Config.fieldNormWeight\n  } = {}) {\n    this.norm = norm(fieldNormWeight, 3);\n    this.getFn = getFn;\n    this.isCreated = false;\n\n    this.setIndexRecords();\n  }\n  setSources(docs = []) {\n    this.docs = docs;\n  }\n  setIndexRecords(records = []) {\n    this.records = records;\n  }\n  setKeys(keys = []) {\n    this.keys = keys;\n    this._keysMap = {};\n    keys.forEach((key, idx) => {\n      this._keysMap[key.id] = idx;\n    });\n  }\n  create() {\n    if (this.isCreated || !this.docs.length) {\n      return\n    }\n\n    this.isCreated = true;\n\n    // List is Array<String>\n    if (isString(this.docs[0])) {\n      this.docs.forEach((doc, docIndex) => {\n        this._addString(doc, docIndex);\n      });\n    } else {\n      // List is Array<Object>\n      this.docs.forEach((doc, docIndex) => {\n        this._addObject(doc, docIndex);\n      });\n    }\n\n    this.norm.clear();\n  }\n  // Adds a doc to the end of the index\n  add(doc) {\n    const idx = this.size();\n\n    if (isString(doc)) {\n      this._addString(doc, idx);\n    } else {\n      this._addObject(doc, idx);\n    }\n  }\n  // Removes the doc at the specified index of the index\n  removeAt(idx) {\n    this.records.splice(idx, 1);\n\n    // Change ref index of every subsquent doc\n    for (let i = idx, len = this.size(); i < len; i += 1) {\n      this.records[i].i -= 1;\n    }\n  }\n  getValueForItemAtKeyId(item, keyId) {\n    return item[this._keysMap[keyId]]\n  }\n  size() {\n    return this.records.length\n  }\n  _addString(doc, docIndex) {\n    if (!isDefined(doc) || isBlank(doc)) {\n      return\n    }\n\n    let record = {\n      v: doc,\n      i: docIndex,\n      n: this.norm.get(doc)\n    };\n\n    this.records.push(record);\n  }\n  _addObject(doc, docIndex) {\n    let record = { i: docIndex, $: {} };\n\n    // Iterate over every key (i.e, path), and fetch the value at that key\n    this.keys.forEach((key, keyIndex) => {\n      let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n      if (!isDefined(value)) {\n        return\n      }\n\n      if (isArray(value)) {\n        let subRecords = [];\n        const stack = [{ nestedArrIndex: -1, value }];\n\n        while (stack.length) {\n          const { nestedArrIndex, value } = stack.pop();\n\n          if (!isDefined(value)) {\n            continue\n          }\n\n          if (isString(value) && !isBlank(value)) {\n            let subRecord = {\n              v: value,\n              i: nestedArrIndex,\n              n: this.norm.get(value)\n            };\n\n            subRecords.push(subRecord);\n          } else if (isArray(value)) {\n            value.forEach((item, k) => {\n              stack.push({\n                nestedArrIndex: k,\n                value: item\n              });\n            });\n          } else ;\n        }\n        record.$[keyIndex] = subRecords;\n      } else if (isString(value) && !isBlank(value)) {\n        let subRecord = {\n          v: value,\n          n: this.norm.get(value)\n        };\n\n        record.$[keyIndex] = subRecord;\n      }\n    });\n\n    this.records.push(record);\n  }\n  toJSON() {\n    return {\n      keys: this.keys,\n      records: this.records\n    }\n  }\n}\n\nfunction createIndex(\n  keys,\n  docs,\n  { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n  const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n  myIndex.setKeys(keys.map(createKey));\n  myIndex.setSources(docs);\n  myIndex.create();\n  return myIndex\n}\n\nfunction parseIndex(\n  data,\n  { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n  const { keys, records } = data;\n  const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n  myIndex.setKeys(keys);\n  myIndex.setIndexRecords(records);\n  return myIndex\n}\n\nfunction computeScore$1(\n  pattern,\n  {\n    errors = 0,\n    currentLocation = 0,\n    expectedLocation = 0,\n    distance = Config.distance,\n    ignoreLocation = Config.ignoreLocation\n  } = {}\n) {\n  const accuracy = errors / pattern.length;\n\n  if (ignoreLocation) {\n    return accuracy\n  }\n\n  const proximity = Math.abs(expectedLocation - currentLocation);\n\n  if (!distance) {\n    // Dodge divide by zero error.\n    return proximity ? 1.0 : accuracy\n  }\n\n  return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n  matchmask = [],\n  minMatchCharLength = Config.minMatchCharLength\n) {\n  let indices = [];\n  let start = -1;\n  let end = -1;\n  let i = 0;\n\n  for (let len = matchmask.length; i < len; i += 1) {\n    let match = matchmask[i];\n    if (match && start === -1) {\n      start = i;\n    } else if (!match && start !== -1) {\n      end = i - 1;\n      if (end - start + 1 >= minMatchCharLength) {\n        indices.push([start, end]);\n      }\n      start = -1;\n    }\n  }\n\n  // (i-1 - start) + 1 => i - start\n  if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n    indices.push([start, i - 1]);\n  }\n\n  return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n  text,\n  pattern,\n  patternAlphabet,\n  {\n    location = Config.location,\n    distance = Config.distance,\n    threshold = Config.threshold,\n    findAllMatches = Config.findAllMatches,\n    minMatchCharLength = Config.minMatchCharLength,\n    includeMatches = Config.includeMatches,\n    ignoreLocation = Config.ignoreLocation\n  } = {}\n) {\n  if (pattern.length > MAX_BITS) {\n    throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n  }\n\n  const patternLen = pattern.length;\n  // Set starting location at beginning text and initialize the alphabet.\n  const textLen = text.length;\n  // Handle the case when location > text.length\n  const expectedLocation = Math.max(0, Math.min(location, textLen));\n  // Highest score beyond which we give up.\n  let currentThreshold = threshold;\n  // Is there a nearby exact match? (speedup)\n  let bestLocation = expectedLocation;\n\n  // Performance: only computer matches when the minMatchCharLength > 1\n  // OR if `includeMatches` is true.\n  const computeMatches = minMatchCharLength > 1 || includeMatches;\n  // A mask of the matches, used for building the indices\n  const matchMask = computeMatches ? Array(textLen) : [];\n\n  let index;\n\n  // Get all exact matches, here for speed up\n  while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n    let score = computeScore$1(pattern, {\n      currentLocation: index,\n      expectedLocation,\n      distance,\n      ignoreLocation\n    });\n\n    currentThreshold = Math.min(score, currentThreshold);\n    bestLocation = index + patternLen;\n\n    if (computeMatches) {\n      let i = 0;\n      while (i < patternLen) {\n        matchMask[index + i] = 1;\n        i += 1;\n      }\n    }\n  }\n\n  // Reset the best location\n  bestLocation = -1;\n\n  let lastBitArr = [];\n  let finalScore = 1;\n  let binMax = patternLen + textLen;\n\n  const mask = 1 << (patternLen - 1);\n\n  for (let i = 0; i < patternLen; i += 1) {\n    // Scan for the best match; each iteration allows for one more error.\n    // Run a binary search to determine how far from the match location we can stray\n    // at this error level.\n    let binMin = 0;\n    let binMid = binMax;\n\n    while (binMin < binMid) {\n      const score = computeScore$1(pattern, {\n        errors: i,\n        currentLocation: expectedLocation + binMid,\n        expectedLocation,\n        distance,\n        ignoreLocation\n      });\n\n      if (score <= currentThreshold) {\n        binMin = binMid;\n      } else {\n        binMax = binMid;\n      }\n\n      binMid = Math.floor((binMax - binMin) / 2 + binMin);\n    }\n\n    // Use the result from this iteration as the maximum for the next.\n    binMax = binMid;\n\n    let start = Math.max(1, expectedLocation - binMid + 1);\n    let finish = findAllMatches\n      ? textLen\n      : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n    // Initialize the bit array\n    let bitArr = Array(finish + 2);\n\n    bitArr[finish + 1] = (1 << i) - 1;\n\n    for (let j = finish; j >= start; j -= 1) {\n      let currentLocation = j - 1;\n      let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n      if (computeMatches) {\n        // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n        matchMask[currentLocation] = +!!charMatch;\n      }\n\n      // First pass: exact match\n      bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n      // Subsequent passes: fuzzy match\n      if (i) {\n        bitArr[j] |=\n          ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n      }\n\n      if (bitArr[j] & mask) {\n        finalScore = computeScore$1(pattern, {\n          errors: i,\n          currentLocation,\n          expectedLocation,\n          distance,\n          ignoreLocation\n        });\n\n        // This match will almost certainly be better than any existing match.\n        // But check anyway.\n        if (finalScore <= currentThreshold) {\n          // Indeed it is\n          currentThreshold = finalScore;\n          bestLocation = currentLocation;\n\n          // Already passed `loc`, downhill from here on in.\n          if (bestLocation <= expectedLocation) {\n            break\n          }\n\n          // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n          start = Math.max(1, 2 * expectedLocation - bestLocation);\n        }\n      }\n    }\n\n    // No hope for a (better) match at greater error levels.\n    const score = computeScore$1(pattern, {\n      errors: i + 1,\n      currentLocation: expectedLocation,\n      expectedLocation,\n      distance,\n      ignoreLocation\n    });\n\n    if (score > currentThreshold) {\n      break\n    }\n\n    lastBitArr = bitArr;\n  }\n\n  const result = {\n    isMatch: bestLocation >= 0,\n    // Count exact matches (those with a score of 0) to be \"almost\" exact\n    score: Math.max(0.001, finalScore)\n  };\n\n  if (computeMatches) {\n    const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n    if (!indices.length) {\n      result.isMatch = false;\n    } else if (includeMatches) {\n      result.indices = indices;\n    }\n  }\n\n  return result\n}\n\nfunction createPatternAlphabet(pattern) {\n  let mask = {};\n\n  for (let i = 0, len = pattern.length; i < len; i += 1) {\n    const char = pattern.charAt(i);\n    mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n  }\n\n  return mask\n}\n\nclass BitapSearch {\n  constructor(\n    pattern,\n    {\n      location = Config.location,\n      threshold = Config.threshold,\n      distance = Config.distance,\n      includeMatches = Config.includeMatches,\n      findAllMatches = Config.findAllMatches,\n      minMatchCharLength = Config.minMatchCharLength,\n      isCaseSensitive = Config.isCaseSensitive,\n      ignoreLocation = Config.ignoreLocation\n    } = {}\n  ) {\n    this.options = {\n      location,\n      threshold,\n      distance,\n      includeMatches,\n      findAllMatches,\n      minMatchCharLength,\n      isCaseSensitive,\n      ignoreLocation\n    };\n\n    this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n    this.chunks = [];\n\n    if (!this.pattern.length) {\n      return\n    }\n\n    const addChunk = (pattern, startIndex) => {\n      this.chunks.push({\n        pattern,\n        alphabet: createPatternAlphabet(pattern),\n        startIndex\n      });\n    };\n\n    const len = this.pattern.length;\n\n    if (len > MAX_BITS) {\n      let i = 0;\n      const remainder = len % MAX_BITS;\n      const end = len - remainder;\n\n      while (i < end) {\n        addChunk(this.pattern.substr(i, MAX_BITS), i);\n        i += MAX_BITS;\n      }\n\n      if (remainder) {\n        const startIndex = len - MAX_BITS;\n        addChunk(this.pattern.substr(startIndex), startIndex);\n      }\n    } else {\n      addChunk(this.pattern, 0);\n    }\n  }\n\n  searchIn(text) {\n    const { isCaseSensitive, includeMatches } = this.options;\n\n    if (!isCaseSensitive) {\n      text = text.toLowerCase();\n    }\n\n    // Exact match\n    if (this.pattern === text) {\n      let result = {\n        isMatch: true,\n        score: 0\n      };\n\n      if (includeMatches) {\n        result.indices = [[0, text.length - 1]];\n      }\n\n      return result\n    }\n\n    // Otherwise, use Bitap algorithm\n    const {\n      location,\n      distance,\n      threshold,\n      findAllMatches,\n      minMatchCharLength,\n      ignoreLocation\n    } = this.options;\n\n    let allIndices = [];\n    let totalScore = 0;\n    let hasMatches = false;\n\n    this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n      const { isMatch, score, indices } = search(text, pattern, alphabet, {\n        location: location + startIndex,\n        distance,\n        threshold,\n        findAllMatches,\n        minMatchCharLength,\n        includeMatches,\n        ignoreLocation\n      });\n\n      if (isMatch) {\n        hasMatches = true;\n      }\n\n      totalScore += score;\n\n      if (isMatch && indices) {\n        allIndices = [...allIndices, ...indices];\n      }\n    });\n\n    let result = {\n      isMatch: hasMatches,\n      score: hasMatches ? totalScore / this.chunks.length : 1\n    };\n\n    if (hasMatches && includeMatches) {\n      result.indices = allIndices;\n    }\n\n    return result\n  }\n}\n\nclass BaseMatch {\n  constructor(pattern) {\n    this.pattern = pattern;\n  }\n  static isMultiMatch(pattern) {\n    return getMatch(pattern, this.multiRegex)\n  }\n  static isSingleMatch(pattern) {\n    return getMatch(pattern, this.singleRegex)\n  }\n  search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n  const matches = pattern.match(exp);\n  return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'exact'\n  }\n  static get multiRegex() {\n    return /^=\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^=(.*)$/\n  }\n  search(text) {\n    const isMatch = text === this.pattern;\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, this.pattern.length - 1]\n    }\n  }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'inverse-exact'\n  }\n  static get multiRegex() {\n    return /^!\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^!(.*)$/\n  }\n  search(text) {\n    const index = text.indexOf(this.pattern);\n    const isMatch = index === -1;\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, text.length - 1]\n    }\n  }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'prefix-exact'\n  }\n  static get multiRegex() {\n    return /^\\^\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^\\^(.*)$/\n  }\n  search(text) {\n    const isMatch = text.startsWith(this.pattern);\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, this.pattern.length - 1]\n    }\n  }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'inverse-prefix-exact'\n  }\n  static get multiRegex() {\n    return /^!\\^\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^!\\^(.*)$/\n  }\n  search(text) {\n    const isMatch = !text.startsWith(this.pattern);\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, text.length - 1]\n    }\n  }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'suffix-exact'\n  }\n  static get multiRegex() {\n    return /^\"(.*)\"\\$$/\n  }\n  static get singleRegex() {\n    return /^(.*)\\$$/\n  }\n  search(text) {\n    const isMatch = text.endsWith(this.pattern);\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [text.length - this.pattern.length, text.length - 1]\n    }\n  }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'inverse-suffix-exact'\n  }\n  static get multiRegex() {\n    return /^!\"(.*)\"\\$$/\n  }\n  static get singleRegex() {\n    return /^!(.*)\\$$/\n  }\n  search(text) {\n    const isMatch = !text.endsWith(this.pattern);\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices: [0, text.length - 1]\n    }\n  }\n}\n\nclass FuzzyMatch extends BaseMatch {\n  constructor(\n    pattern,\n    {\n      location = Config.location,\n      threshold = Config.threshold,\n      distance = Config.distance,\n      includeMatches = Config.includeMatches,\n      findAllMatches = Config.findAllMatches,\n      minMatchCharLength = Config.minMatchCharLength,\n      isCaseSensitive = Config.isCaseSensitive,\n      ignoreLocation = Config.ignoreLocation\n    } = {}\n  ) {\n    super(pattern);\n    this._bitapSearch = new BitapSearch(pattern, {\n      location,\n      threshold,\n      distance,\n      includeMatches,\n      findAllMatches,\n      minMatchCharLength,\n      isCaseSensitive,\n      ignoreLocation\n    });\n  }\n  static get type() {\n    return 'fuzzy'\n  }\n  static get multiRegex() {\n    return /^\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^(.*)$/\n  }\n  search(text) {\n    return this._bitapSearch.searchIn(text)\n  }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n  constructor(pattern) {\n    super(pattern);\n  }\n  static get type() {\n    return 'include'\n  }\n  static get multiRegex() {\n    return /^'\"(.*)\"$/\n  }\n  static get singleRegex() {\n    return /^'(.*)$/\n  }\n  search(text) {\n    let location = 0;\n    let index;\n\n    const indices = [];\n    const patternLen = this.pattern.length;\n\n    // Get all exact matches\n    while ((index = text.indexOf(this.pattern, location)) > -1) {\n      location = index + patternLen;\n      indices.push([index, location - 1]);\n    }\n\n    const isMatch = !!indices.length;\n\n    return {\n      isMatch,\n      score: isMatch ? 0 : 1,\n      indices\n    }\n  }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n  ExactMatch,\n  IncludeMatch,\n  PrefixExactMatch,\n  InversePrefixExactMatch,\n  InverseSuffixExactMatch,\n  SuffixExactMatch,\n  InverseExactMatch,\n  FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n  return pattern.split(OR_TOKEN).map((item) => {\n    let query = item\n      .trim()\n      .split(SPACE_RE)\n      .filter((item) => item && !!item.trim());\n\n    let results = [];\n    for (let i = 0, len = query.length; i < len; i += 1) {\n      const queryItem = query[i];\n\n      // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n      let found = false;\n      let idx = -1;\n      while (!found && ++idx < searchersLen) {\n        const searcher = searchers[idx];\n        let token = searcher.isMultiMatch(queryItem);\n        if (token) {\n          results.push(new searcher(token, options));\n          found = true;\n        }\n      }\n\n      if (found) {\n        continue\n      }\n\n      // 2. Handle single query matches (i.e, once that are *not* quoted)\n      idx = -1;\n      while (++idx < searchersLen) {\n        const searcher = searchers[idx];\n        let token = searcher.isSingleMatch(queryItem);\n        if (token) {\n          results.push(new searcher(token, options));\n          break\n        }\n      }\n    }\n\n    return results\n  })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token       | Match type                 | Description                            |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript`   | fuzzy-match                | Items that fuzzy match `jscript`       |\n * | `=scheme`   | exact-match                | Items that are `scheme`                |\n * | `'python`   | include-match              | Items that include `python`            |\n * | `!ruby`     | inverse-exact-match        | Items that do not include `ruby`       |\n * | `^java`     | prefix-exact-match         | Items that start with `java`           |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$`      | suffix-exact-match         | Items that end with `.js`              |\n * | `!.go$`     | inverse-suffix-exact-match | Items that do not end with `.go`       |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n  constructor(\n    pattern,\n    {\n      isCaseSensitive = Config.isCaseSensitive,\n      includeMatches = Config.includeMatches,\n      minMatchCharLength = Config.minMatchCharLength,\n      ignoreLocation = Config.ignoreLocation,\n      findAllMatches = Config.findAllMatches,\n      location = Config.location,\n      threshold = Config.threshold,\n      distance = Config.distance\n    } = {}\n  ) {\n    this.query = null;\n    this.options = {\n      isCaseSensitive,\n      includeMatches,\n      minMatchCharLength,\n      findAllMatches,\n      ignoreLocation,\n      location,\n      threshold,\n      distance\n    };\n\n    this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n    this.query = parseQuery(this.pattern, this.options);\n  }\n\n  static condition(_, options) {\n    return options.useExtendedSearch\n  }\n\n  searchIn(text) {\n    const query = this.query;\n\n    if (!query) {\n      return {\n        isMatch: false,\n        score: 1\n      }\n    }\n\n    const { includeMatches, isCaseSensitive } = this.options;\n\n    text = isCaseSensitive ? text : text.toLowerCase();\n\n    let numMatches = 0;\n    let allIndices = [];\n    let totalScore = 0;\n\n    // ORs\n    for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n      const searchers = query[i];\n\n      // Reset indices\n      allIndices.length = 0;\n      numMatches = 0;\n\n      // ANDs\n      for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n        const searcher = searchers[j];\n        const { isMatch, indices, score } = searcher.search(text);\n\n        if (isMatch) {\n          numMatches += 1;\n          totalScore += score;\n          if (includeMatches) {\n            const type = searcher.constructor.type;\n            if (MultiMatchSet.has(type)) {\n              allIndices = [...allIndices, ...indices];\n            } else {\n              allIndices.push(indices);\n            }\n          }\n        } else {\n          totalScore = 0;\n          numMatches = 0;\n          allIndices.length = 0;\n          break\n        }\n      }\n\n      // OR condition, so if TRUE, return\n      if (numMatches) {\n        let result = {\n          isMatch: true,\n          score: totalScore / numMatches\n        };\n\n        if (includeMatches) {\n          result.indices = allIndices;\n        }\n\n        return result\n      }\n    }\n\n    // Nothing was matched\n    return {\n      isMatch: false,\n      score: 1\n    }\n  }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n  registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n  for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n    let searcherClass = registeredSearchers[i];\n    if (searcherClass.condition(pattern, options)) {\n      return new searcherClass(pattern, options)\n    }\n  }\n\n  return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n  AND: '$and',\n  OR: '$or'\n};\n\nconst KeyType = {\n  PATH: '$path',\n  PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n  !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n  !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n  [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n    [key]: query[key]\n  }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n  const next = (query) => {\n    let keys = Object.keys(query);\n\n    const isQueryPath = isPath(query);\n\n    if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n      return next(convertToExplicit(query))\n    }\n\n    if (isLeaf(query)) {\n      const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n      const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n      if (!isString(pattern)) {\n        throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n      }\n\n      const obj = {\n        keyId: createKeyId(key),\n        pattern\n      };\n\n      if (auto) {\n        obj.searcher = createSearcher(pattern, options);\n      }\n\n      return obj\n    }\n\n    let node = {\n      children: [],\n      operator: keys[0]\n    };\n\n    keys.forEach((key) => {\n      const value = query[key];\n\n      if (isArray(value)) {\n        value.forEach((item) => {\n          node.children.push(next(item));\n        });\n      }\n    });\n\n    return node\n  };\n\n  if (!isExpression(query)) {\n    query = convertToExplicit(query);\n  }\n\n  return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n  results,\n  { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n  results.forEach((result) => {\n    let totalScore = 1;\n\n    result.matches.forEach(({ key, norm, score }) => {\n      const weight = key ? key.weight : null;\n\n      totalScore *= Math.pow(\n        score === 0 && weight ? Number.EPSILON : score,\n        (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n      );\n    });\n\n    result.score = totalScore;\n  });\n}\n\nfunction transformMatches(result, data) {\n  const matches = result.matches;\n  data.matches = [];\n\n  if (!isDefined(matches)) {\n    return\n  }\n\n  matches.forEach((match) => {\n    if (!isDefined(match.indices) || !match.indices.length) {\n      return\n    }\n\n    const { indices, value } = match;\n\n    let obj = {\n      indices,\n      value\n    };\n\n    if (match.key) {\n      obj.key = match.key.src;\n    }\n\n    if (match.idx > -1) {\n      obj.refIndex = match.idx;\n    }\n\n    data.matches.push(obj);\n  });\n}\n\nfunction transformScore(result, data) {\n  data.score = result.score;\n}\n\nfunction format(\n  results,\n  docs,\n  {\n    includeMatches = Config.includeMatches,\n    includeScore = Config.includeScore\n  } = {}\n) {\n  const transformers = [];\n\n  if (includeMatches) transformers.push(transformMatches);\n  if (includeScore) transformers.push(transformScore);\n\n  return results.map((result) => {\n    const { idx } = result;\n\n    const data = {\n      item: docs[idx],\n      refIndex: idx\n    };\n\n    if (transformers.length) {\n      transformers.forEach((transformer) => {\n        transformer(result, data);\n      });\n    }\n\n    return data\n  })\n}\n\nclass Fuse {\n  constructor(docs, options = {}, index) {\n    this.options = { ...Config, ...options };\n\n    if (\n      this.options.useExtendedSearch &&\n      !true\n    ) {\n      throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n    }\n\n    this._keyStore = new KeyStore(this.options.keys);\n\n    this.setCollection(docs, index);\n  }\n\n  setCollection(docs, index) {\n    this._docs = docs;\n\n    if (index && !(index instanceof FuseIndex)) {\n      throw new Error(INCORRECT_INDEX_TYPE)\n    }\n\n    this._myIndex =\n      index ||\n      createIndex(this.options.keys, this._docs, {\n        getFn: this.options.getFn,\n        fieldNormWeight: this.options.fieldNormWeight\n      });\n  }\n\n  add(doc) {\n    if (!isDefined(doc)) {\n      return\n    }\n\n    this._docs.push(doc);\n    this._myIndex.add(doc);\n  }\n\n  remove(predicate = (/* doc, idx */) => false) {\n    const results = [];\n\n    for (let i = 0, len = this._docs.length; i < len; i += 1) {\n      const doc = this._docs[i];\n      if (predicate(doc, i)) {\n        this.removeAt(i);\n        i -= 1;\n        len -= 1;\n\n        results.push(doc);\n      }\n    }\n\n    return results\n  }\n\n  removeAt(idx) {\n    this._docs.splice(idx, 1);\n    this._myIndex.removeAt(idx);\n  }\n\n  getIndex() {\n    return this._myIndex\n  }\n\n  search(query, { limit = -1 } = {}) {\n    const {\n      includeMatches,\n      includeScore,\n      shouldSort,\n      sortFn,\n      ignoreFieldNorm\n    } = this.options;\n\n    let results = isString(query)\n      ? isString(this._docs[0])\n        ? this._searchStringList(query)\n        : this._searchObjectList(query)\n      : this._searchLogical(query);\n\n    computeScore(results, { ignoreFieldNorm });\n\n    if (shouldSort) {\n      results.sort(sortFn);\n    }\n\n    if (isNumber(limit) && limit > -1) {\n      results = results.slice(0, limit);\n    }\n\n    return format(results, this._docs, {\n      includeMatches,\n      includeScore\n    })\n  }\n\n  _searchStringList(query) {\n    const searcher = createSearcher(query, this.options);\n    const { records } = this._myIndex;\n    const results = [];\n\n    // Iterate over every string in the index\n    records.forEach(({ v: text, i: idx, n: norm }) => {\n      if (!isDefined(text)) {\n        return\n      }\n\n      const { isMatch, score, indices } = searcher.searchIn(text);\n\n      if (isMatch) {\n        results.push({\n          item: text,\n          idx,\n          matches: [{ score, value: text, norm, indices }]\n        });\n      }\n    });\n\n    return results\n  }\n\n  _searchLogical(query) {\n\n    const expression = parse(query, this.options);\n\n    const evaluate = (node, item, idx) => {\n      if (!node.children) {\n        const { keyId, searcher } = node;\n\n        const matches = this._findMatches({\n          key: this._keyStore.get(keyId),\n          value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n          searcher\n        });\n\n        if (matches && matches.length) {\n          return [\n            {\n              idx,\n              item,\n              matches\n            }\n          ]\n        }\n\n        return []\n      }\n\n      const res = [];\n      for (let i = 0, len = node.children.length; i < len; i += 1) {\n        const child = node.children[i];\n        const result = evaluate(child, item, idx);\n        if (result.length) {\n          res.push(...result);\n        } else if (node.operator === LogicalOperator.AND) {\n          return []\n        }\n      }\n      return res\n    };\n\n    const records = this._myIndex.records;\n    const resultMap = {};\n    const results = [];\n\n    records.forEach(({ $: item, i: idx }) => {\n      if (isDefined(item)) {\n        let expResults = evaluate(expression, item, idx);\n\n        if (expResults.length) {\n          // Dedupe when adding\n          if (!resultMap[idx]) {\n            resultMap[idx] = { idx, item, matches: [] };\n            results.push(resultMap[idx]);\n          }\n          expResults.forEach(({ matches }) => {\n            resultMap[idx].matches.push(...matches);\n          });\n        }\n      }\n    });\n\n    return results\n  }\n\n  _searchObjectList(query) {\n    const searcher = createSearcher(query, this.options);\n    const { keys, records } = this._myIndex;\n    const results = [];\n\n    // List is Array<Object>\n    records.forEach(({ $: item, i: idx }) => {\n      if (!isDefined(item)) {\n        return\n      }\n\n      let matches = [];\n\n      // Iterate over every key (i.e, path), and fetch the value at that key\n      keys.forEach((key, keyIndex) => {\n        matches.push(\n          ...this._findMatches({\n            key,\n            value: item[keyIndex],\n            searcher\n          })\n        );\n      });\n\n      if (matches.length) {\n        results.push({\n          idx,\n          item,\n          matches\n        });\n      }\n    });\n\n    return results\n  }\n  _findMatches({ key, value, searcher }) {\n    if (!isDefined(value)) {\n      return []\n    }\n\n    let matches = [];\n\n    if (isArray(value)) {\n      value.forEach(({ v: text, i: idx, n: norm }) => {\n        if (!isDefined(text)) {\n          return\n        }\n\n        const { isMatch, score, indices } = searcher.searchIn(text);\n\n        if (isMatch) {\n          matches.push({\n            score,\n            key,\n            value: text,\n            idx,\n            norm,\n            indices\n          });\n        }\n      });\n    } else {\n      const { v: text, n: norm } = value;\n\n      const { isMatch, score, indices } = searcher.searchIn(text);\n\n      if (isMatch) {\n        matches.push({ score, key, value: text, norm, indices });\n      }\n    }\n\n    return matches\n  }\n}\n\nFuse.version = '6.6.2';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n  Fuse.parseQuery = parse;\n}\n\n{\n  register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import {Ref} from 'vue';\nimport {LinkIndex} from './../../../common/LinkIndex';\nimport {DropDownMenuEntry} from './../../../../../types';\nimport {PolyDictionary} from './../../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {StoreController} from './../../../../../store/controllers/StoreController';\nimport {BaseNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from './../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {Poly} from '../../../../../../../@polygonjs/polygonjs/src/engine/Poly';\nimport Fuse from 'fuse.js';\nimport {isBooleanTrue} from '../../../../../../../@polygonjs/polygonjs/src/core/Type';\n\nexport function tabMenuEntries(context: NodeContext, parent_node: BaseNodeType) {\n\tconst username = StoreController.editor.currentUser.username();\n\n\tconst nodes_by_category: PolyDictionary<string[]> = {};\n\tPoly.nodesRegister.registeredNodesForParentNode(parent_node).forEach((node) => {\n\t\tconst parentContextAndType = `${parent_node.context()}/${parent_node.type()}`;\n\t\tconst category = Poly.nodesRegister.registeredCategory(context, node.type());\n\t\tconst options = Poly.nodesRegister.nodeOptions(context, node.type());\n\t\tlet userAllowed = true;\n\t\tif (options) {\n\t\t\tif (options.userAllowed === false) {\n\t\t\t\tuserAllowed = false;\n\t\t\t}\n\t\t\tif (options.except) {\n\t\t\t\tif (options.except.includes(parentContextAndType)) {\n\t\t\t\t\tuserAllowed = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (process.env.NODE_ENV != 'development') {\n\t\t\tif (username.value != 'gui') {\n\t\t\t\tif (['anim/keyframes', 'actor/keyframes'].includes(parentContextAndType)) {\n\t\t\t\t\tuserAllowed = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (category && userAllowed) {\n\t\t\tfor (let categoryItem of category) {\n\t\t\t\tnodes_by_category[categoryItem] = nodes_by_category[categoryItem] || [];\n\t\t\t\tnodes_by_category[categoryItem].push(node.type());\n\t\t\t}\n\t\t}\n\t});\n\treturn nodes_by_category;\n}\n\ninterface ComputeEntriesOptionsCommon {\n\tlinkIndex: LinkIndex;\n\tisFilterEmpty: boolean;\n\tfilter: string;\n}\ninterface ComputeEntriesOptions extends ComputeEntriesOptionsCommon {\n\tfuzzy: boolean;\n}\ninterface ComputeDefaultThenFuzzyOptions extends ComputeEntriesOptionsCommon {\n\tresultsFoundViaFuzzySearch: Ref<boolean>;\n}\n\nfunction _computeMenuEntries(options: ComputeEntriesOptions): DropDownMenuEntry[] {\n\tconst {linkIndex, isFilterEmpty, filter, fuzzy} = options;\n\t// const available_children_classes = this.node.available_children_classes();\n\tconst node = StoreController.editor.currentNode(linkIndex);\n\tif (!node.childrenAllowed() || !node.childrenController) {\n\t\treturn [];\n\t}\n\n\tconst registeredEntries = tabMenuEntries(node.childrenController.context, node);\n\n\tif (isBooleanTrue(isFilterEmpty)) {\n\t\tconst allEntries: DropDownMenuEntry[] = [];\n\t\tObject.keys(registeredEntries).forEach(function (category) {\n\t\t\tconst children = registeredEntries[category]\n\t\t\t\t.sort()\n\t\t\t\t.map((sub_entry) => ({id: sub_entry.toLowerCase(), label: sub_entry}));\n\t\t\tallEntries.push({id: category, label: category, children});\n\t\t});\n\t\treturn allEntries;\n\t} else {\n\t\tconst filterLowercase = filter.toLowerCase();\n\t\tconst allTypes: string[] = Object.values(registeredEntries).flat();\n\n\t\tfunction _fuzzyFilter(): DropDownMenuEntry[] {\n\t\t\tconst fuse = new Fuse(allTypes, {\n\t\t\t\tisCaseSensitive: false,\n\t\t\t\tincludeScore: true,\n\t\t\t\tincludeMatches: true,\n\t\t\t\tminMatchCharLength: 2,\n\t\t\t});\n\t\t\tconst result = fuse.search(filterLowercase);\n\t\t\t// take the first 10\n\t\t\tconst validResults: Fuse.FuseResult<string>[] = [];\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tconst resultItem = result[i];\n\t\t\t\tif (resultItem) {\n\t\t\t\t\tvalidResults.push(resultItem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// const validResults = result.filter((r) => r.score != null && r.score < 0.002);\n\t\t\treturn validResults.map((r) => {\n\t\t\t\tconst type = r.item;\n\t\t\t\tconst id: string = type.toLowerCase();\n\t\t\t\tconst label: string = type;\n\t\t\t\tconst emphasis: Array<[number, number]> = [];\n\t\t\t\tif (r.matches) {\n\t\t\t\t\tfor (let match of r.matches) {\n\t\t\t\t\t\tfor (let index of match.indices) {\n\t\t\t\t\t\t\temphasis.push([index[0], index[1]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst entry: DropDownMenuEntry = {id, label, emphasis};\n\t\t\t\treturn entry;\n\t\t\t});\n\t\t}\n\t\tfunction _basicFilter(): DropDownMenuEntry[] {\n\t\t\tconst filteredTypes: string[] = allTypes.filter((type) => {\n\t\t\t\treturn type.toLowerCase().includes(filterLowercase);\n\t\t\t});\n\t\t\tconst entries = filteredTypes.map((type) => {\n\t\t\t\tconst id: string = type.toLowerCase();\n\t\t\t\tconst emphasisStart = id.indexOf(filter);\n\t\t\t\tconst emphasisEnd = emphasisStart + filter.length;\n\t\t\t\tconst emphasis: Array<[number, number]> = [[emphasisStart, emphasisEnd]];\n\t\t\t\tconst entry: DropDownMenuEntry = {id, label: type, emphasis};\n\t\t\t\treturn entry;\n\t\t\t});\n\t\t\treturn entries;\n\t\t}\n\n\t\tconst filteredTypes = isBooleanTrue(fuzzy) ? _fuzzyFilter() : _basicFilter();\n\n\t\treturn filteredTypes;\n\t}\n}\n\nexport function computeDefaultThenFuzzy(options: ComputeDefaultThenFuzzyOptions) {\n\tfunction _sortEntries(entries: DropDownMenuEntry[]) {\n\t\tconst entriesByName: Record<string, DropDownMenuEntry> = {};\n\t\tentries.forEach((entry) => {\n\t\t\tentriesByName[entry.label || entry.id] = entry;\n\t\t});\n\n\t\tconst names = Object.keys(entriesByName).sort();\n\t\treturn names.map((name) => entriesByName[name]);\n\t}\n\n\tlet entries = _sortEntries(_computeMenuEntries({...options, fuzzy: false}));\n\n\tif (entries.length === 0) {\n\t\toptions.resultsFoundViaFuzzySearch.value = true;\n\t\t// _trimFilter();\n\t\tentries = _sortEntries(_computeMenuEntries({...options, fuzzy: true}));\n\t} else {\n\t\toptions.resultsFoundViaFuzzySearch.value = false;\n\t}\n\treturn entries;\n}\n","import {Editor} from './../../../../../../Editor';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {EngineParamData} from '../../../../../../store/modules/Engine';\nimport {ParamSetCommand} from '../../../../../../history/commands/ParamSet';\nimport {FloatParam} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Float';\nimport {IntegerParam} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Integer';\n\nexport const SetupFieldCommonProps = {\n\tjson_param: {\n\t\ttype: Object as () => EngineParamData,\n\t\tdefault() {\n\t\t\treturn {};\n\t\t},\n\t},\n\tdisplays_expression_result: {\n\t\ttype: Boolean,\n\t\tdefault: false,\n\t},\n};\nexport interface ISetupFieldCommonProps {\n\tjson_param: EngineParamData;\n\tdisplays_expression_result: boolean;\n}\n\nimport {computed, watch} from 'vue';\nexport function SetupFieldCommon(props: ISetupFieldCommonProps) {\n\tconst param = StoreController.engine.param(props.json_param.graph_node_id)!;\n\n\t// param() {\n\t// \treturn $store.scene.graph().node_from_id(json_param != null ? json_param.graph_node_id : undefined);\n\t// },\n\tconst name = computed(() => {\n\t\treturn props.json_param.name;\n\t});\n\n\tconst raw_input = computed(() => {\n\t\treturn props.json_param.raw_input;\n\t});\n\tconst value = computed(() => {\n\t\treturn props.json_param.value;\n\t});\n\tconst expression = computed(() => {\n\t\treturn props.json_param.expression;\n\t});\n\tconst has_expression = computed(() => {\n\t\treturn expression.value != null;\n\t});\n\tconst error_message = computed(() => {\n\t\treturn props.json_param.error_message;\n\t});\n\tconst is_errored = computed(() => {\n\t\treturn error_message.value != null;\n\t});\n\t// const is_dirty = computed(() => {\n\t// \treturn json_param.isDirty();\n\t// });\n\n\tconst field_component_type = computed(() => {\n\t\treturn props.json_param.type;\n\t});\n\n\tconst class_object = computed(() => {\n\t\t// TODO: no idea why this gets called forever for a string\n\t\t// if (param.options.displays_expression_only === true) {\n\t\t// \tif (is_dirty) {\n\t\t// \t\tparam.eval((value) => {\n\t\t// \t\t\treturn console.log(value, json_param.result);\n\t\t// \t\t});\n\t\t// \t}\n\t\t// \treturn (object = {\n\t\t// \t\tdisplays_expression_result: true,\n\t\t// \t\tdisplays_expression_only: true,\n\t\t// \t});\n\t\t// } else {\n\t\treturn {displays_expression_result: props.displays_expression_result};\n\t\t// }\n\t});\n\n\tconst input_value_class_object = computed(() => {\n\t\treturn {\n\t\t\thas_expression: has_expression.value,\n\t\t\tis_errored: is_errored.value,\n\t\t};\n\t});\n\n\tconst is_field_visible = computed(() => {\n\t\treturn !param.options.isFieldHidden();\n\t});\n\tconst isFieldDisabled = computed(() => {\n\t\tif (props.json_param.editable == false) {\n\t\t\treturn true;\n\t\t}\n\t\tconst node = param.node;\n\t\tconst locked = node.insideALockedParent();\n\t\tif (locked) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t});\n\tconst displays_expression_result_computed = computed(() => {\n\t\treturn props.displays_expression_result;\n\t});\n\n\twatch(displays_expression_result_computed, async (new_display, old_display) => {\n\t\tif (new_display) {\n\t\t\tif (param.isDirty()) {\n\t\t\t\tawait param.compute();\n\t\t\t}\n\t\t}\n\t});\n\n\t// functions\n\tfunction on_update_value(e: Event) {\n\t\tconst target = e.currentTarget as HTMLInputElement | null;\n\t\tif (target) {\n\t\t\tconst new_value = target.value;\n\t\t\tif (!param.isRawInputEqual(new_value)) {\n\t\t\t\tcreate_set_command(target.value);\n\t\t\t}\n\t\t}\n\t}\n\tasync function on_keyup(e: KeyboardEvent) {\n\t\tlet offset: number | undefined = undefined;\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowUp':\n\t\t\t\toffset = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\toffset = -1;\n\t\t\t\tbreak;\n\t\t}\n\t\tif (offset) {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\toffset *= 0.1;\n\t\t\t} else {\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\toffset *= 10;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (param instanceof FloatParam || param instanceof IntegerParam) {\n\t\t\t\tconst value = param.value;\n\t\t\t\tconst cmd = new ParamSetCommand(param, value + offset);\n\t\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t\t}\n\t\t}\n\n\t\te.preventDefault();\n\t}\n\n\t// NOT USED, since it is annoying when trying to scroll\n\t// function on_wheel(e: WheelEvent) {\n\t// \tif (has_expression.value) {\n\t// \t\treturn;\n\t// \t}\n\n\t// \tconst type = field_component_type.value;\n\t// \tif (type == ParamType.FLOAT || type == ParamType.INTEGER) {\n\t// \t\tconst down = e.deltaY > 0;\n\t// \t\tlet offset = 0.1;\n\t// \t\tif (down) {\n\t// \t\t\toffset *= -1;\n\t// \t\t}\n\t// \t\tparam.set(((<any>value) as number) + offset);\n\t// \t}\n\t// \t// TODO: how can I generate a command only when the mouse wheel has stopped?\n\t// }\n\n\tfunction resetToDefault() {\n\t\t// as opposed to the resetToDefault which is called\n\t\t// when clicking on the label, and can be run when ctrl OR shift\n\t\t// are pressed, for the actual inputs, we should probably only call them\n\t\t// when ctrl is pressed, and not shift, so that this doesn't happen when trying to select content.\n\t\t// but it could be detected as safe to do, so it's still up in the air.\n\t\tif (!param.isDefault()) {\n\t\t\tcreate_set_command(param.defaultValue());\n\t\t}\n\t}\n\n\tasync function create_set_command(value: any) {\n\t\tconst cmd = new ParamSetCommand(param as any, value);\n\t\tawait Editor.instance().pushCommand(cmd);\n\t}\n\n\treturn {\n\t\tname,\n\t\tvalue,\n\t\texpression,\n\t\traw_input,\n\t\thas_expression,\n\t\terror_message,\n\t\tis_errored,\n\t\t// is_dirty,\n\t\tfield_component_type,\n\t\tclass_object,\n\t\tinput_value_class_object,\n\t\tis_field_visible,\n\t\tisFieldDisabled,\n\t\t// functions\n\t\ton_update_value,\n\t\ton_keyup,\n\t\t// on_wheel,\n\t\tresetToDefault,\n\t};\n}\n","import {ParamType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {BaseParamType} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\n\nexport function fieldComponentType(param: BaseParamType) {\n\tlet converted_type: string = param.type();\n\t// switch (type.value) {\n\t// case ParamType.INTEGER:\n\tif (param.options.hasMenu()) {\n\t\tconverted_type = 'radio';\n\t} else {\n\t\t// converted_type = type.value;\n\t}\n\t// break;\n\t// }\n\n\treturn `${converted_type.replace('_', '-')}-field`;\n}\n\nexport function fieldComponentTypeFromType(paramType: ParamType) {\n\treturn `${paramType.replace('_', '-')}`;\n}\n","import {BaseNodeType} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {Group} from 'three';\nimport {Number3} from '../../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {Camera} from 'three';\nimport {TransformControls} from 'three/examples/jsm/controls/TransformControls';\n\nexport interface BaseHandlerOptions<N extends BaseNodeType> {\n\tnode: N;\n\tdummy: Group;\n\tcamera: Camera;\n\tdomElement: HTMLElement;\n}\nconst CALLBACK_NAME = 'BaseHandler';\nexport class BaseHandler<N extends BaseNodeType> {\n\tprotected _controls: TransformControls | undefined;\n\tprotected v3Array: Number3 = [0, 0, 0];\n\tconstructor(protected _options: BaseHandlerOptions<N>) {}\n\tcontrols() {\n\t\treturn this._controls;\n\t}\n\tdragStart() {}\n\t// bindEvents() {}\n\tdispose() {\n\t\tconst {node} = this._options;\n\t\tnode.cookController.deregisterOnCookEnd(CALLBACK_NAME);\n\t}\n\tbindParamsChangeEvents() {\n\t\tconst {node} = this._options;\n\t\tnode.cookController.registerOnCookEnd(CALLBACK_NAME, () => {\n\t\t\tthis.setAxisStates();\n\t\t\tthis.placeDummy();\n\t\t});\n\t}\n\tsetAxisStates() {}\n\tplaceDummy() {}\n\tupdate() {}\n\tcreateHistoryCommand() {}\n\tonKeyDown(event: KeyboardEvent) {}\n\tonKeyUp(event: KeyboardEvent) {}\n\tviewerHints(): string[] {\n\t\treturn [];\n\t}\n}\n","import {\n\tBoxGeometry,\n\tBufferGeometry,\n\tCylinderGeometry,\n\tDoubleSide,\n\tEuler,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tOctahedronGeometry,\n\tPlaneGeometry,\n\tQuaternion,\n\tRaycaster,\n\tSphereGeometry,\n\tTorusGeometry,\n\tVector3\n} from 'three';\n\nconst _raycaster = new Raycaster();\n\nconst _tempVector = new Vector3();\nconst _tempVector2 = new Vector3();\nconst _tempQuaternion = new Quaternion();\nconst _unit = {\n\tX: new Vector3( 1, 0, 0 ),\n\tY: new Vector3( 0, 1, 0 ),\n\tZ: new Vector3( 0, 0, 1 )\n};\n\nconst _changeEvent = { type: 'change' };\nconst _mouseDownEvent = { type: 'mouseDown', mode: null };\nconst _mouseUpEvent = { type: 'mouseUp', mode: null };\nconst _objectChangeEvent = { type: 'objectChange' };\n\nclass TransformControls extends Object3D {\n\n\tconstructor( camera, domElement ) {\n\n\t\tsuper();\n\n\t\tif ( domElement === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.TransformControls: The second parameter \"domElement\" is now mandatory.' );\n\t\t\tdomElement = document;\n\n\t\t}\n\n\t\tthis.isTransformControls = true;\n\n\t\tthis.visible = false;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\tconst _gizmo = new TransformControlsGizmo();\n\t\tthis._gizmo = _gizmo;\n\t\tthis.add( _gizmo );\n\n\t\tconst _plane = new TransformControlsPlane();\n\t\tthis._plane = _plane;\n\t\tthis.add( _plane );\n\n\t\tconst scope = this;\n\n\t\t// Defined getter, setter and store for a property\n\t\tfunction defineProperty( propName, defaultValue ) {\n\n\t\t\tlet propValue = defaultValue;\n\n\t\t\tObject.defineProperty( scope, propName, {\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn propValue !== undefined ? propValue : defaultValue;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( propValue !== value ) {\n\n\t\t\t\t\t\tpropValue = value;\n\t\t\t\t\t\t_plane[ propName ] = value;\n\t\t\t\t\t\t_gizmo[ propName ] = value;\n\n\t\t\t\t\t\tscope.dispatchEvent( { type: propName + '-changed', value: value } );\n\t\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tscope[ propName ] = defaultValue;\n\t\t\t_plane[ propName ] = defaultValue;\n\t\t\t_gizmo[ propName ] = defaultValue;\n\n\t\t}\n\n\t\t// Define properties with getters/setter\n\t\t// Setting the defined property will automatically trigger change event\n\t\t// Defined properties are passed down to gizmo and plane\n\n\t\tdefineProperty( 'camera', camera );\n\t\tdefineProperty( 'object', undefined );\n\t\tdefineProperty( 'enabled', true );\n\t\tdefineProperty( 'axis', null );\n\t\tdefineProperty( 'mode', 'translate' );\n\t\tdefineProperty( 'translationSnap', null );\n\t\tdefineProperty( 'rotationSnap', null );\n\t\tdefineProperty( 'scaleSnap', null );\n\t\tdefineProperty( 'space', 'world' );\n\t\tdefineProperty( 'size', 1 );\n\t\tdefineProperty( 'dragging', false );\n\t\tdefineProperty( 'showX', true );\n\t\tdefineProperty( 'showY', true );\n\t\tdefineProperty( 'showZ', true );\n\n\t\t// Reusable utility variables\n\n\t\tconst worldPosition = new Vector3();\n\t\tconst worldPositionStart = new Vector3();\n\t\tconst worldQuaternion = new Quaternion();\n\t\tconst worldQuaternionStart = new Quaternion();\n\t\tconst cameraPosition = new Vector3();\n\t\tconst cameraQuaternion = new Quaternion();\n\t\tconst pointStart = new Vector3();\n\t\tconst pointEnd = new Vector3();\n\t\tconst rotationAxis = new Vector3();\n\t\tconst rotationAngle = 0;\n\t\tconst eye = new Vector3();\n\n\t\t// TODO: remove properties unused in plane and gizmo\n\n\t\tdefineProperty( 'worldPosition', worldPosition );\n\t\tdefineProperty( 'worldPositionStart', worldPositionStart );\n\t\tdefineProperty( 'worldQuaternion', worldQuaternion );\n\t\tdefineProperty( 'worldQuaternionStart', worldQuaternionStart );\n\t\tdefineProperty( 'cameraPosition', cameraPosition );\n\t\tdefineProperty( 'cameraQuaternion', cameraQuaternion );\n\t\tdefineProperty( 'pointStart', pointStart );\n\t\tdefineProperty( 'pointEnd', pointEnd );\n\t\tdefineProperty( 'rotationAxis', rotationAxis );\n\t\tdefineProperty( 'rotationAngle', rotationAngle );\n\t\tdefineProperty( 'eye', eye );\n\n\t\tthis._offset = new Vector3();\n\t\tthis._startNorm = new Vector3();\n\t\tthis._endNorm = new Vector3();\n\t\tthis._cameraScale = new Vector3();\n\n\t\tthis._parentPosition = new Vector3();\n\t\tthis._parentQuaternion = new Quaternion();\n\t\tthis._parentQuaternionInv = new Quaternion();\n\t\tthis._parentScale = new Vector3();\n\n\t\tthis._worldScaleStart = new Vector3();\n\t\tthis._worldQuaternionInv = new Quaternion();\n\t\tthis._worldScale = new Vector3();\n\n\t\tthis._positionStart = new Vector3();\n\t\tthis._quaternionStart = new Quaternion();\n\t\tthis._scaleStart = new Vector3();\n\n\t\tthis._getPointer = getPointer.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerHover = onPointerHover.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t// updateMatrixWorld updates key transformation variables\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\tif ( this.object.parent === null ) {\n\n\t\t\t\tconsole.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );\n\n\t\t\t} else {\n\n\t\t\t\tthis.object.parent.matrixWorld.decompose( this._parentPosition, this._parentQuaternion, this._parentScale );\n\n\t\t\t}\n\n\t\t\tthis.object.matrixWorld.decompose( this.worldPosition, this.worldQuaternion, this._worldScale );\n\n\t\t\tthis._parentQuaternionInv.copy( this._parentQuaternion ).invert();\n\t\t\tthis._worldQuaternionInv.copy( this.worldQuaternion ).invert();\n\n\t\t}\n\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorld.decompose( this.cameraPosition, this.cameraQuaternion, this._cameraScale );\n\n\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\tthis.camera.getWorldDirection( this.eye ).negate();\n\n\t\t} else {\n\n\t\t\tthis.eye.copy( this.cameraPosition ).sub( this.worldPosition ).normalize();\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tpointerHover( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true ) return;\n\n\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst intersect = intersectObjectWithRay( this._gizmo.picker[ this.mode ], _raycaster );\n\n\t\tif ( intersect ) {\n\n\t\t\tthis.axis = intersect.object.name;\n\n\t\t} else {\n\n\t\t\tthis.axis = null;\n\n\t\t}\n\n\t}\n\n\tpointerDown( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || ( pointer != null && pointer.button !== 0 ) ) return;\n\n\t\tif ( this.axis !== null ) {\n\n\t\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n\t\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\t\tif ( planeIntersect ) {\n\n\t\t\t\tthis.object.updateMatrixWorld();\n\t\t\t\tthis.object.parent.updateMatrixWorld();\n\n\t\t\t\tthis._positionStart.copy( this.object.position );\n\t\t\t\tthis._quaternionStart.copy( this.object.quaternion );\n\t\t\t\tthis._scaleStart.copy( this.object.scale );\n\n\t\t\t\tthis.object.matrixWorld.decompose( this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart );\n\n\t\t\t\tthis.pointStart.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\t\t}\n\n\t\t\tthis.dragging = true;\n\t\t\t_mouseDownEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseDownEvent );\n\n\t\t}\n\n\t}\n\n\tpointerMove( pointer ) {\n\n\t\tconst axis = this.axis;\n\t\tconst mode = this.mode;\n\t\tconst object = this.object;\n\t\tlet space = this.space;\n\n\t\tif ( mode === 'scale' ) {\n\n\t\t\tspace = 'local';\n\n\t\t} else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n\t\t\tspace = 'world';\n\n\t\t}\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || ( pointer !== null && pointer.button !== - 1 ) ) return;\n\n\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\tif ( ! planeIntersect ) return;\n\n\t\tthis.pointEnd.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\tif ( mode === 'translate' ) {\n\n\t\t\t// Apply translate\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t}\n\n\t\t\tif ( axis.indexOf( 'X' ) === - 1 ) this._offset.x = 0;\n\t\t\tif ( axis.indexOf( 'Y' ) === - 1 ) this._offset.y = 0;\n\t\t\tif ( axis.indexOf( 'Z' ) === - 1 ) this._offset.z = 0;\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._quaternionStart ).divide( this._parentScale );\n\n\t\t\t} else {\n\n\t\t\t\tthis._offset.applyQuaternion( this._parentQuaternionInv ).divide( this._parentScale );\n\n\t\t\t}\n\n\t\t\tobject.position.copy( this._offset ).add( this._positionStart );\n\n\t\t\t// Apply translation snap\n\n\t\t\tif ( this.translationSnap ) {\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\tobject.position.applyQuaternion( _tempQuaternion.copy( this._quaternionStart ).invert() );\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.position.applyQuaternion( this._quaternionStart );\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'world' ) {\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'scale' ) {\n\n\t\t\tif ( axis.search( 'XYZ' ) !== - 1 ) {\n\n\t\t\t\tlet d = this.pointEnd.length() / this.pointStart.length();\n\n\t\t\t\tif ( this.pointEnd.dot( this.pointStart ) < 0 ) d *= - 1;\n\n\t\t\t\t_tempVector2.set( d, d, d );\n\n\t\t\t} else {\n\n\t\t\t\t_tempVector.copy( this.pointStart );\n\t\t\t\t_tempVector2.copy( this.pointEnd );\n\n\t\t\t\t_tempVector.applyQuaternion( this._worldQuaternionInv );\n\t\t\t\t_tempVector2.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t\t_tempVector2.divide( _tempVector );\n\n\t\t\t\tif ( axis.search( 'X' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.x = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.y = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.z = 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply scale\n\n\t\t\tobject.scale.copy( this._scaleStart ).multiply( _tempVector2 );\n\n\t\t\tif ( this.scaleSnap ) {\n\n\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'rotate' ) {\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tconst ROTATION_SPEED = 20 / this.worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n\t\t\tlet _inPlaneRotation = false;\n\n\t\t\tif ( axis === 'XYZE' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this._offset ).cross( this.eye ).normalize();\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.copy( this.rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n\t\t\t} else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n\t\t\t\tthis.rotationAxis.copy( _unit[ axis ] );\n\n\t\t\t\t_tempVector.copy( _unit[ axis ] );\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\t_tempVector.cross( this.eye );\n\n\t\t\t\t// When _tempVector is 0 after cross with this.eye the vectors are parallel and should use in-plane rotation logic.\n\t\t\t\tif ( _tempVector.length() === 0 ) {\n\n\t\t\t\t\t_inPlaneRotation = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.normalize() ) * ROTATION_SPEED;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\tif ( axis === 'E' || _inPlaneRotation ) {\n\n\t\t\t\tthis.rotationAxis.copy( this.eye );\n\t\t\t\tthis.rotationAngle = this.pointEnd.angleTo( this.pointStart );\n\n\t\t\t\tthis._startNorm.copy( this.pointStart ).normalize();\n\t\t\t\tthis._endNorm.copy( this.pointEnd ).normalize();\n\n\t\t\t\tthis.rotationAngle *= ( this._endNorm.cross( this._startNorm ).dot( this.eye ) < 0 ? 1 : - 1 );\n\n\t\t\t}\n\n\t\t\t// Apply rotation snap\n\n\t\t\tif ( this.rotationSnap ) this.rotationAngle = Math.round( this.rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n\t\t\t// Apply rotate\n\t\t\tif ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n\t\t\t\tobject.quaternion.copy( this._quaternionStart );\n\t\t\t\tobject.quaternion.multiply( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\tthis.rotationAxis.applyQuaternion( this._parentQuaternionInv );\n\t\t\t\tobject.quaternion.copy( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) );\n\t\t\t\tobject.quaternion.multiply( this._quaternionStart ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( _changeEvent );\n\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t}\n\n\tpointerUp( pointer ) {\n\n\t\tif ( pointer !== null && pointer.button !== 0 ) return;\n\n\t\tif ( this.dragging && ( this.axis !== null ) ) {\n\n\t\t\t_mouseUpEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseUpEvent );\n\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tthis.axis = null;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.traverse( function ( child ) {\n\n\t\t\tif ( child.geometry ) child.geometry.dispose();\n\t\t\tif ( child.material ) child.material.dispose();\n\n\t\t} );\n\n\t}\n\n\t// Set current object\n\tattach( object ) {\n\n\t\tthis.object = object;\n\t\tthis.visible = true;\n\n\t\treturn this;\n\n\t}\n\n\t// Detach from object\n\tdetach() {\n\n\t\tthis.object = undefined;\n\t\tthis.visible = false;\n\t\tthis.axis = null;\n\n\t\treturn this;\n\n\t}\n\n\treset() {\n\n\t\tif ( ! this.enabled ) return;\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis.object.position.copy( this._positionStart );\n\t\t\tthis.object.quaternion.copy( this._quaternionStart );\n\t\t\tthis.object.scale.copy( this._scaleStart );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t\t\tthis.pointStart.copy( this.pointEnd );\n\n\t\t}\n\n\t}\n\n\tgetRaycaster() {\n\n\t\treturn _raycaster;\n\n\t}\n\n\t// TODO: deprecate\n\n\tgetMode() {\n\n\t\treturn this.mode;\n\n\t}\n\n\tsetMode( mode ) {\n\n\t\tthis.mode = mode;\n\n\t}\n\n\tsetTranslationSnap( translationSnap ) {\n\n\t\tthis.translationSnap = translationSnap;\n\n\t}\n\n\tsetRotationSnap( rotationSnap ) {\n\n\t\tthis.rotationSnap = rotationSnap;\n\n\t}\n\n\tsetScaleSnap( scaleSnap ) {\n\n\t\tthis.scaleSnap = scaleSnap;\n\n\t}\n\n\tsetSize( size ) {\n\n\t\tthis.size = size;\n\n\t}\n\n\tsetSpace( space ) {\n\n\t\tthis.space = space;\n\n\t}\n\n}\n\n// mouse / touch event handlers\n\nfunction getPointer( event ) {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement ) {\n\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tbutton: event.button\n\t\t};\n\n\t} else {\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\n\t\treturn {\n\t\t\tx: ( event.clientX - rect.left ) / rect.width * 2 - 1,\n\t\t\ty: - ( event.clientY - rect.top ) / rect.height * 2 + 1,\n\t\t\tbutton: event.button\n\t\t};\n\n\t}\n\n}\n\nfunction onPointerHover( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tswitch ( event.pointerType ) {\n\n\t\tcase 'mouse':\n\t\tcase 'pen':\n\t\t\tthis.pointerHover( this._getPointer( event ) );\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tif ( ! document.pointerLockElement ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t}\n\n\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerHover( this._getPointer( event ) );\n\tthis.pointerDown( this._getPointer( event ) );\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.pointerMove( this._getPointer( event ) );\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerUp( this._getPointer( event ) );\n\n}\n\nfunction intersectObjectWithRay( object, raycaster, includeInvisible ) {\n\n\tconst allIntersections = raycaster.intersectObject( object, true );\n\n\tfor ( let i = 0; i < allIntersections.length; i ++ ) {\n\n\t\tif ( allIntersections[ i ].object.visible || includeInvisible ) {\n\n\t\t\treturn allIntersections[ i ];\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\n//\n\n// Reusable utility variables\n\nconst _tempEuler = new Euler();\nconst _alignVector = new Vector3( 0, 1, 0 );\nconst _zeroVector = new Vector3( 0, 0, 0 );\nconst _lookAtMatrix = new Matrix4();\nconst _tempQuaternion2 = new Quaternion();\nconst _identityQuaternion = new Quaternion();\nconst _dirVector = new Vector3();\nconst _tempMatrix = new Matrix4();\n\nconst _unitX = new Vector3( 1, 0, 0 );\nconst _unitY = new Vector3( 0, 1, 0 );\nconst _unitZ = new Vector3( 0, 0, 1 );\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\nclass TransformControlsGizmo extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isTransformControlsGizmo = true;\n\n\t\tthis.type = 'TransformControlsGizmo';\n\n\t\t// shared materials\n\n\t\tconst gizmoMaterial = new MeshBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tconst gizmoLineMaterial = new LineBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t// Make unique material for each axis/color\n\n\t\tconst matInvisible = gizmoMaterial.clone();\n\t\tmatInvisible.opacity = 0.15;\n\n\t\tconst matHelper = gizmoLineMaterial.clone();\n\t\tmatHelper.opacity = 0.5;\n\n\t\tconst matRed = gizmoMaterial.clone();\n\t\tmatRed.color.setHex( 0xff0000 );\n\n\t\tconst matGreen = gizmoMaterial.clone();\n\t\tmatGreen.color.setHex( 0x00ff00 );\n\n\t\tconst matBlue = gizmoMaterial.clone();\n\t\tmatBlue.color.setHex( 0x0000ff );\n\n\t\tconst matRedTransparent = gizmoMaterial.clone();\n\t\tmatRedTransparent.color.setHex( 0xff0000 );\n\t\tmatRedTransparent.opacity = 0.5;\n\n\t\tconst matGreenTransparent = gizmoMaterial.clone();\n\t\tmatGreenTransparent.color.setHex( 0x00ff00 );\n\t\tmatGreenTransparent.opacity = 0.5;\n\n\t\tconst matBlueTransparent = gizmoMaterial.clone();\n\t\tmatBlueTransparent.color.setHex( 0x0000ff );\n\t\tmatBlueTransparent.opacity = 0.5;\n\n\t\tconst matWhiteTransparent = gizmoMaterial.clone();\n\t\tmatWhiteTransparent.opacity = 0.25;\n\n\t\tconst matYellowTransparent = gizmoMaterial.clone();\n\t\tmatYellowTransparent.color.setHex( 0xffff00 );\n\t\tmatYellowTransparent.opacity = 0.25;\n\n\t\tconst matYellow = gizmoMaterial.clone();\n\t\tmatYellow.color.setHex( 0xffff00 );\n\n\t\tconst matGray = gizmoMaterial.clone();\n\t\tmatGray.color.setHex( 0x787878 );\n\n\t\t// reusable geometry\n\n\t\tconst arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );\n\t\tarrowGeometry.translate( 0, 0.05, 0 );\n\n\t\tconst scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );\n\t\tscaleHandleGeometry.translate( 0, 0.04, 0 );\n\n\t\tconst lineGeometry = new BufferGeometry();\n\t\tlineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n\t\tconst lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );\n\t\tlineGeometry2.translate( 0, 0.25, 0 );\n\n\t\tfunction CircleGeometry( radius, arc ) {\n\n\t\t\tconst geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );\n\t\t\tgeometry.rotateY( Math.PI / 2 );\n\t\t\tgeometry.rotateX( Math.PI / 2 );\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n\t\tfunction TranslateHelperGeometry() {\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n\t\tconst gizmoTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent.clone() ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperTranslate = {\n\t\t\tSTART: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tEND: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tDELTA: [\n\t\t\t\t[ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperRotate = {\n\t\t\tAXIS: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ],\n\t\t\t]\n\t\t};\n\n\t\tconst pickerScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],\n\t\t\t]\n\t\t};\n\n\t\tconst helperScale = {\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\t// Creates an Object3D with gizmos described in custom hierarchy definition.\n\n\t\tfunction setupGizmo( gizmoMap ) {\n\n\t\t\tconst gizmo = new Object3D();\n\n\t\t\tfor ( const name in gizmoMap ) {\n\n\t\t\t\tfor ( let i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\t\tconst object = gizmoMap[ name ][ i ][ 0 ].clone();\n\t\t\t\t\tconst position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\t\tconst rotation = gizmoMap[ name ][ i ][ 2 ];\n\t\t\t\t\tconst scale = gizmoMap[ name ][ i ][ 3 ];\n\t\t\t\t\tconst tag = gizmoMap[ name ][ i ][ 4 ];\n\n\t\t\t\t\t// name and tag properties are essential for picking and updating logic.\n\t\t\t\t\tobject.name = name;\n\t\t\t\t\tobject.tag = tag;\n\n\t\t\t\t\tif ( position ) {\n\n\t\t\t\t\t\tobject.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( rotation ) {\n\n\t\t\t\t\t\tobject.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scale ) {\n\n\t\t\t\t\t\tobject.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.updateMatrix();\n\n\t\t\t\t\tconst tempGeometry = object.geometry.clone();\n\t\t\t\t\ttempGeometry.applyMatrix4( object.matrix );\n\t\t\t\t\tobject.geometry = tempGeometry;\n\t\t\t\t\tobject.renderOrder = Infinity;\n\n\t\t\t\t\tobject.position.set( 0, 0, 0 );\n\t\t\t\t\tobject.rotation.set( 0, 0, 0 );\n\t\t\t\t\tobject.scale.set( 1, 1, 1 );\n\n\t\t\t\t\tgizmo.add( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn gizmo;\n\n\t\t}\n\n\t\t// Gizmo creation\n\n\t\tthis.gizmo = {};\n\t\tthis.picker = {};\n\t\tthis.helper = {};\n\n\t\tthis.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) );\n\t\tthis.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) );\n\t\tthis.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) );\n\t\tthis.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) );\n\t\tthis.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) );\n\t\tthis.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) );\n\t\tthis.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) );\n\t\tthis.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) );\n\t\tthis.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) );\n\n\t\t// Pickers should be hidden always\n\n\t\tthis.picker[ 'translate' ].visible = false;\n\t\tthis.picker[ 'rotate' ].visible = false;\n\t\tthis.picker[ 'scale' ].visible = false;\n\n\t}\n\n\t// updateMatrixWorld will update transformations and appearance of individual handles\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst space = ( this.mode === 'scale' ) ? 'local' : this.space; // scale always oriented to local rotation\n\n\t\tconst quaternion = ( space === 'local' ) ? this.worldQuaternion : _identityQuaternion;\n\n\t\t// Show only gizmos for current transform mode\n\n\t\tthis.gizmo[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.gizmo[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.gizmo[ 'scale' ].visible = this.mode === 'scale';\n\n\t\tthis.helper[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.helper[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.helper[ 'scale' ].visible = this.mode === 'scale';\n\n\n\t\tlet handles = [];\n\t\thandles = handles.concat( this.picker[ this.mode ].children );\n\t\thandles = handles.concat( this.gizmo[ this.mode ].children );\n\t\thandles = handles.concat( this.helper[ this.mode ].children );\n\n\t\tfor ( let i = 0; i < handles.length; i ++ ) {\n\n\t\t\tconst handle = handles[ i ];\n\n\t\t\t// hide aligned to camera\n\n\t\t\thandle.visible = true;\n\t\t\thandle.rotation.set( 0, 0, 0 );\n\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\tlet factor;\n\n\t\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\t\tfactor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom;\n\n\t\t\t} else {\n\n\t\t\t\tfactor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 );\n\n\t\t\t}\n\n\t\t\thandle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );\n\n\t\t\t// TODO: simplify helpers and consider decoupling from gizmo\n\n\t\t\tif ( handle.tag === 'helper' ) {\n\n\t\t\t\thandle.visible = false;\n\n\t\t\t\tif ( handle.name === 'AXIS' ) {\n\n\t\t\t\t\thandle.visible = !! this.axis;\n\n\t\t\t\t\tif ( this.axis === 'X' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Y' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, Math.PI / 2 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Z' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'XYZE' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\t_alignVector.copy( this.rotationAxis );\n\t\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( _zeroVector, _alignVector, _unitY ) );\n\t\t\t\t\t\thandle.quaternion.multiply( _tempQuaternion );\n\t\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'E' ) {\n\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else if ( handle.name === 'START' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'END' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPosition );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'DELTA' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.quaternion.copy( this.worldQuaternionStart );\n\t\t\t\t\t_tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 );\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() );\n\t\t\t\t\thandle.scale.copy( _tempVector );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\t\t\tif ( this.dragging ) {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis ) {\n\n\t\t\t\t\t\thandle.visible = this.axis.search( handle.name ) !== - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// If updating helper, skip rest of the loop\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Align handles to current local or world rotation\n\n\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\tif ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n\t\t\t\t// Hide translate and scale axis facing the camera\n\n\t\t\t\tconst AXIS_HIDE_THRESHOLD = 0.99;\n\t\t\t\tconst PLANE_HIDE_THRESHOLD = 0.2;\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XY' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'YZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.mode === 'rotate' ) {\n\n\t\t\t\t// Align handles to current local or world rotation\n\n\t\t\t\t_tempQuaternion2.copy( quaternion );\n\t\t\t\t_alignVector.copy( this.eye ).applyQuaternion( _tempQuaternion.copy( quaternion ).invert() );\n\n\t\t\t\tif ( handle.name.search( 'E' ) !== - 1 ) {\n\n\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( this.eye, _zeroVector, _unitY ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitX, Math.atan2( - _alignVector.y, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitY, Math.atan2( _alignVector.x, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitZ, Math.atan2( _alignVector.y, _alignVector.x ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Hide disabled axes\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );\n\n\t\t\t// highlight selected axis\n\n\t\t\thandle.material._color = handle.material._color || handle.material.color.clone();\n\t\t\thandle.material._opacity = handle.material._opacity || handle.material.opacity;\n\n\t\t\thandle.material.color.copy( handle.material._color );\n\t\t\thandle.material.opacity = handle.material._opacity;\n\n\t\t\tif ( this.enabled && this.axis ) {\n\n\t\t\t\tif ( handle.name === this.axis ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t} else if ( this.axis.split( '' ).some( function ( a ) {\n\n\t\t\t\t\treturn handle.name === a;\n\n\t\t\t\t} ) ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n//\n\nclass TransformControlsPlane extends Mesh {\n\n\tconstructor() {\n\n\t\tsuper(\n\t\t\tnew PlaneGeometry( 100000, 100000, 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false } )\n\t\t);\n\n\t\tthis.isTransformControlsPlane = true;\n\n\t\tthis.type = 'TransformControlsPlane';\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet space = this.space;\n\n\t\tthis.position.copy( this.worldPosition );\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\t_v1.copy( _unitX ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v2.copy( _unitY ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v3.copy( _unitZ ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\n\t\t// Align the plane for current transform mode, axis and space.\n\n\t\t_alignVector.copy( _v2 );\n\n\t\tswitch ( this.mode ) {\n\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\t\t\t\tswitch ( this.axis ) {\n\n\t\t\t\t\tcase 'X':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v1 );\n\t\t\t\t\t\t_dirVector.copy( _v1 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v2 );\n\t\t\t\t\t\t_dirVector.copy( _v2 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v3 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XY':\n\t\t\t\t\t\t_dirVector.copy( _v3 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'YZ':\n\t\t\t\t\t\t_dirVector.copy( _v1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XZ':\n\t\t\t\t\t\t_alignVector.copy( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v2 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XYZ':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\t\t_dirVector.set( 0, 0, 0 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'rotate':\n\t\t\tdefault:\n\t\t\t\t// special case for rotate\n\t\t\t\t_dirVector.set( 0, 0, 0 );\n\n\t\t}\n\n\t\tif ( _dirVector.length() === 0 ) {\n\n\t\t\t// If in rotate mode, make the plane parallel to camera\n\t\t\tthis.quaternion.copy( this.cameraQuaternion );\n\n\t\t} else {\n\n\t\t\t_tempMatrix.lookAt( _tempVector.set( 0, 0, 0 ), _dirVector, _alignVector );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( _tempMatrix );\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nexport { TransformControls, TransformControlsGizmo, TransformControlsPlane };\n","import {Editor} from './../../../../../Editor';\nimport {BaseNodeType} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseHandler, BaseHandlerOptions} from './_Base';\nimport {TransformControls} from '../../../../../../../@polygonjs/polygonjs/src/modules/three/examples/jsm/controls/TransformControls';\nimport {Vector2Param} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector2';\nimport {Vector3Param} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector3';\nimport {FloatParam} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/Float';\nimport {Vector2, Vector3, Euler, MathUtils} from 'three';\nimport {MultipleCommand} from '../../../../../history/commands/Multiple';\nimport {ParamSetCommand} from '../../../../../history/commands/ParamSet';\n\nexport {TransformControls};\n\nexport enum ControlsMode {\n\tTRANSLATE = 'translate',\n\tROTATE = 'rotate',\n\tSCALE = 'scale',\n}\nexport type ControlsAxis = 'X' | 'Y' | 'Z' | 'E' | 'XY' | 'YZ' | 'XZ' | 'XYZ' | 'XYZE' | null;\n\nenum ControlsSpace {\n\tLOCAL = 'local',\n\tWORLD = 'world',\n}\ninterface MultiCmdValues1 {\n\told: number;\n\tnew: number;\n}\ninterface MultiCmdValues2 {\n\told: Vector2;\n\tnew: Vector2;\n}\ninterface MultiCmdValues3 {\n\told: Vector3;\n\tnew: Vector3;\n}\n\nexport class BaseTransformHandler<N extends BaseNodeType> extends BaseHandler<N> {\n\tprivate static _lastMode: ControlsMode = ControlsMode.TRANSLATE;\n\n\tconstructor(protected override _options: BaseHandlerOptions<N>) {\n\t\tsuper(_options);\n\t\tthis._controls = new TransformControls(this._options.camera, this._options.domElement);\n\t\tthis._controls.space = ControlsSpace.WORLD;\n\t\t// set the mode to the last one set\n\t\tthis._setMode(BaseTransformHandler._lastMode);\n\t}\n\n\tlastMode() {\n\t\treturn BaseTransformHandler._lastMode;\n\t}\n\n\toverride onKeyDown(event: KeyboardEvent) {\n\t\tif (event.shiftKey) {\n\t\t\tthis._setSnap(true);\n\t\t}\n\t\tswitch (event.code) {\n\t\t\tcase 'KeyE': {\n\t\t\t\tthis._setMode(ControlsMode.SCALE);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'KeyR': {\n\t\t\t\tthis._setMode(ControlsMode.ROTATE);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'KeyT': {\n\t\t\t\tthis._setMode(ControlsMode.TRANSLATE);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'KeyQ': {\n\t\t\t\t// Q like in threejs example\n\t\t\t\tthis._toggleSpace();\n\t\t\t}\n\t\t}\n\t}\n\toverride onKeyUp(event: KeyboardEvent) {\n\t\tthis._setSnap(false);\n\t}\n\tprotected _availableModes(): ControlsMode[] {\n\t\treturn [ControlsMode.TRANSLATE, ControlsMode.ROTATE, ControlsMode.SCALE];\n\t}\n\tprivate _setMode(mode: ControlsMode) {\n\t\tif (!this._controls) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._availableModes().includes(mode)) {\n\t\t\tmode = this._availableModes()[0];\n\t\t}\n\t\tthis._controls.setMode(mode);\n\t\tBaseTransformHandler._lastMode = mode;\n\t\tthis.setAxisStates();\n\t}\n\tprivate _setSnap(state: boolean) {\n\t\tif (!this._controls) {\n\t\t\treturn;\n\t\t}\n\t\tif (state) {\n\t\t\tthis._controls.setTranslationSnap(1);\n\t\t\tthis._controls.setRotationSnap(MathUtils.degToRad(5));\n\t\t\tthis._controls.setScaleSnap(0.25);\n\t\t} else {\n\t\t\tthis._controls.setTranslationSnap(null);\n\t\t\tthis._controls.setRotationSnap(null);\n\t\t\tthis._controls.setScaleSnap(null);\n\t\t}\n\t}\n\tprivate _toggleSpace() {\n\t\tif (!this._controls) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._controls.space == ControlsSpace.LOCAL) {\n\t\t\tthis._controls.space = ControlsSpace.WORLD;\n\t\t} else {\n\t\t\tthis._controls.space = ControlsSpace.LOCAL;\n\t\t}\n\t}\n\n\tprotected _controlsAxisListXYZ() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst axis = controls.axis;\n\t\tif (!axis) {\n\t\t\treturn;\n\t\t}\n\t\tconst list: Array<'x' | 'y' | 'z'> = axis\n\t\t\t.split('')\n\t\t\t.sort()\n\t\t\t.map((l) => l.toLowerCase())\n\t\t\t.filter((l) => ['x', 'y', 'z'].includes(l)) as Array<'x' | 'y' | 'z'>;\n\n\t\treturn list;\n\t}\n\tprotected _controlsAxisListXY() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst axis = controls.axis;\n\t\tif (!axis) {\n\t\t\treturn;\n\t\t}\n\t\tconst list: Array<'x' | 'y'> = axis\n\t\t\t.split('')\n\t\t\t.sort()\n\t\t\t.map((l) => l.toLowerCase())\n\t\t\t.filter((l) => ['x', 'y'].includes(l)) as Array<'x' | 'y'>;\n\n\t\treturn list;\n\t}\n\tprotected _controlsAxisListXZ() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst axis = controls.axis;\n\t\tif (!axis) {\n\t\t\treturn;\n\t\t}\n\t\tconst list: Array<'x' | 'z'> = axis\n\t\t\t.split('')\n\t\t\t.sort()\n\t\t\t.map((l) => l.toLowerCase())\n\t\t\t.filter((l) => ['x', 'z'].includes(l)) as Array<'x' | 'z'>;\n\n\t\treturn list;\n\t}\n\tprotected _updateParamFromNumber(floatParam: FloatParam, value: number) {\n\t\tconst list = this._controlsAxisListXYZ();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tconst param = floatParam;\n\t\tif (!param.hasExpression()) {\n\t\t\tparam.set(value);\n\t\t}\n\t}\n\tprotected _updateParamFromVector2(vector2Param: Vector2Param, vector: Vector2) {\n\t\tconst list = this._controlsAxisListXY();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tvector2Param.scene().batchUpdates(() => {\n\t\t\tfor (let axisName of list) {\n\t\t\t\tconst param = vector2Param[axisName];\n\t\t\t\tif (!param.hasExpression()) {\n\t\t\t\t\tparam.set(vector[axisName]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tprotected _updateParamFromVector2XZ(vector2Param: Vector2Param, vector: Vector2) {\n\t\tconst list = this._controlsAxisListXZ();\n\t\tif (!list) {\n\t\t\tconsole.warn('no list');\n\t\t\treturn;\n\t\t}\n\t\tvector2Param.scene().batchUpdates(() => {\n\t\t\tconst paramX = vector2Param.x;\n\t\t\tconst paramY = vector2Param.y;\n\t\t\tif (!paramX.hasExpression()) {\n\t\t\t\tparamX.set(vector.x);\n\t\t\t}\n\t\t\tif (!paramY.hasExpression()) {\n\t\t\t\tparamY.set(vector.y);\n\t\t\t}\n\t\t});\n\t}\n\tprotected _updateParamFromVector3(vector3Param: Vector3Param, vector: Vector3) {\n\t\tconst list = this._controlsAxisListXYZ();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tvector3Param.scene().batchUpdates(() => {\n\t\t\tfor (let axisName of list) {\n\t\t\t\tconst param = vector3Param[axisName];\n\t\t\t\tif (!param.hasExpression()) {\n\t\t\t\t\tparam.set(vector[axisName]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tprotected _updateParamRFromEuler(vector3Param: Vector3Param, vector: Euler) {\n\t\tconst list = this._controlsAxisListXYZ();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tvector3Param.scene().batchUpdates(() => {\n\t\t\tfor (let axisName of list) {\n\t\t\t\tconst param = vector3Param[axisName];\n\t\t\t\tif (!param.hasExpression()) {\n\t\t\t\t\tparam.set(MathUtils.radToDeg(vector[axisName]));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected async _pushCmdNumber(param: FloatParam, values: MultiCmdValues1) {\n\t\tconst list = this._controlsAxisListXY();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!param.hasExpression()) {\n\t\t\t// param.set(values.old[axisName]);\n\t\t\tconst cmd = new ParamSetCommand(param, values.new, values.old);\n\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t}\n\t}\n\tprotected async _pushMultiCmdXY(vector2Param: Vector2Param, values: MultiCmdValues2) {\n\t\tconst list = this._controlsAxisListXY();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tconst multiCmd = new MultipleCommand(vector2Param.node.scene());\n\t\tfor (let axisName of list) {\n\t\t\tconst param = vector2Param[axisName];\n\t\t\tif (!param.hasExpression()) {\n\t\t\t\t// param.set(values.old[axisName]);\n\t\t\t\tconst axisCmd = new ParamSetCommand(param, values.new[axisName], values.old[axisName]);\n\t\t\t\tmultiCmd.pushCommand(axisCmd);\n\t\t\t}\n\t\t}\n\t\tawait Editor.instance().pushCommand(multiCmd);\n\t}\n\tprotected async _pushMultiCmdXZ(vector2Param: Vector2Param, values: MultiCmdValues3) {\n\t\tconst list = this._controlsAxisListXZ();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tconst multiCmd = new MultipleCommand(vector2Param.node.scene());\n\t\t// param x from value x\n\t\tconst paramX = vector2Param.x;\n\t\tif (!paramX.hasExpression()) {\n\t\t\tconst axisCmd = new ParamSetCommand(paramX, values.new.x, values.old.x);\n\t\t\tmultiCmd.pushCommand(axisCmd);\n\t\t}\n\n\t\t// param z from value y\n\t\tconst paramY = vector2Param.y;\n\t\tif (!paramY.hasExpression()) {\n\t\t\tconst axisCmd = new ParamSetCommand(paramY, values.new.z, values.old.z);\n\t\t\tmultiCmd.pushCommand(axisCmd);\n\t\t}\n\n\t\tawait Editor.instance().pushCommand(multiCmd);\n\t}\n\tprotected async _pushMultiCmdXYZ(vector3Param: Vector3Param, values: MultiCmdValues3) {\n\t\tconst list = this._controlsAxisListXYZ();\n\t\tif (!list) {\n\t\t\treturn;\n\t\t}\n\t\tconst multiCmd = new MultipleCommand(vector3Param.node.scene());\n\t\tfor (let axisName of list) {\n\t\t\tconst param = vector3Param[axisName];\n\t\t\tif (!param.hasExpression()) {\n\t\t\t\t// param.set(values.old[axisName]);\n\t\t\t\tconst axisCmd = new ParamSetCommand(param, values.new[axisName], values.old[axisName]);\n\t\t\t\tmultiCmd.pushCommand(axisCmd);\n\t\t\t}\n\t\t}\n\t\tawait Editor.instance().pushCommand(multiCmd);\n\t}\n\toverride viewerHints(): string[] {\n\t\treturn [`E: scale, R: rotate, T: translate, Q: toggle world/local, Shift + Drag: snap`];\n\t}\n}\n","import {Editor} from './../Editor';\nimport {Ref, ref} from 'vue';\nimport {ParamSetCommand} from './../history/commands/ParamSet';\nimport {rangeWithEnd} from './../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {CoreGraphNodeId} from './../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {StringParam} from './../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {EngineParamData} from './../store/modules/Engine';\nimport {Asset, FileWatchData, TIMESTAMP_URL_PARAM_NAME} from './../../npm_module/NpmModuleTypes';\nimport {LocalAssetsSceneTraverser} from './scene_traversers/LocalAssets';\nimport {StoreController} from '../store/controllers/StoreController';\nimport {NpmModuleApiController} from '../../npm_module/NpmModuleApiController';\nimport {EditorType} from '../types';\n\nexport enum LineItemState {\n\tREMOTE = 'REMOTE',\n\tLOCAL = 'LOCAL',\n\t// DOWNLOAD_IN_PROGRESS = 'DOWNLOAD_IN_PROGRESS',\n\t// DOWNLOAD_FAILED = 'DOWNLOAD_FAILED',\n\t// LOCAL_UP_TO_DATE = 'LOCAL_UP_TO_DATE',\n\t// LOCAL_OUT_OF_DATE = 'LOCAL_OUT_OF_DATE',\n}\n\nexport interface LineItem {\n\tparamId: CoreGraphNodeId;\n\tparamValue: string;\n\tfilePath: string;\n\tcurrentTimestamp: number;\n\tnewTimestamp: number;\n\tmoreRecentTimestamp: boolean;\n\tparamPath: string;\n\tstate: LineItemState;\n}\n\nconst DEBUG_LINE_ITEMS: Array<LineItem> = rangeWithEnd(20).map((i) => ({\n\tparamId: 1,\n\tparamValue: `test-${i}`,\n\tfilePath: `filepath-${i}`,\n\tcurrentTimestamp: 1,\n\tnewTimestamp: 2,\n\tmoreRecentTimestamp: true,\n\tparamPath: `parampath${i}`,\n\tstate: i % 2 == 0 ? LineItemState.REMOTE : LineItemState.LOCAL,\n}));\nconst DEBUG = false;\n\n// we need to test against those prefix for now\n// as the param could load the asset with either of those urls\n// - models/data.json\n// - /models/data.json\n// - ./models/data.json\n//\n// but the fileDatas will contain\n// - models/data.json\nconst POSSIBLE_PREFIXES: ReadonlyArray<string> = ['', '/', './'];\nconst DUMMY_URL = 'https://dummy-domain.com';\n\nexport class AssetsHelperClass {\n\tprivate static _instance: AssetsHelperClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new AssetsHelperClass());\n\t}\n\tprivate _jsonParams: Ref<EngineParamData[]> = ref([]);\n\tprivate _fileDatas = ref<Asset.FileData[]>([]);\n\n\tgetfilePath(paramValue: string) {\n\t\treturn paramValue.split('?')[0];\n\t}\n\tgetExt(filePath: string) {\n\t\tconst elements = filePath.split('.');\n\t\treturn elements[elements.length - 1];\n\t}\n\tgetTimestamp(filePath: string) {\n\t\tconst urlSearchParam = new URLSearchParams(filePath.split('?')[1]);\n\t\tconst val = urlSearchParam.get(TIMESTAMP_URL_PARAM_NAME) || '-1';\n\n\t\treturn parseInt(val);\n\t}\n\tasync getParams() {\n\t\tconst scene = StoreController.engine.scene;\n\t\tconst jsonParams = this._jsonParams.value;\n\t\tconst traverser = new LocalAssetsSceneTraverser(scene);\n\t\tawait traverser.traverseScene();\n\n\t\tjsonParams.splice(0, jsonParams.length);\n\t\tconst assetParams = traverser.params();\n\t\tconst paramsReferencingRemoteAsset = traverser.paramsReferencingRemoteAsset();\n\t\tconst params = assetParams.concat(paramsReferencingRemoteAsset);\n\n\t\tfor (let param of params) {\n\t\t\tlet jsonParam = StoreController.engine.json_param(param.graphNodeId());\n\t\t\tif (!jsonParam) {\n\t\t\t\tStoreController.engine.addNodeParamsToStore(param.node.graphNodeId());\n\t\t\t}\n\t\t\tjsonParam = StoreController.engine.json_param(param.graphNodeId());\n\t\t\tif (jsonParam) {\n\t\t\t\tjsonParams.push(jsonParam);\n\t\t\t} else {\n\t\t\t\tconsole.warn(`no jsonParam found for param ${param.path()} (${param.graphNodeId()})`);\n\t\t\t}\n\t\t}\n\t}\n\tasync getFilesData() {\n\t\tconst fileDatas = this._fileDatas.value;\n\t\tconst jsonParams = this._jsonParams.value;\n\t\t// we assume here that the jsonParams are StringParam\n\t\t// and we can therefore convert the value to a string\n\t\tconst paramValues = jsonParams.map((jsonParam) => `${jsonParam.value}`);\n\t\tconst filePaths = paramValues.map(AssetsHelper.getfilePath);\n\t\tconst extensions = filePaths.map(AssetsHelper.getExt);\n\n\t\tfileDatas.splice(0, fileDatas.length);\n\t\tconst json = await NpmModuleApiController.assets.index(extensions);\n\t\tif (!json) {\n\t\t\treturn;\n\t\t}\n\t\tconst newFileDatas = json.filesData || [];\n\t\tfor (let fileData of newFileDatas) {\n\t\t\tfileDatas.push(fileData);\n\t\t}\n\t}\n\tasync loadData() {\n\t\t// 1. first we get the params\n\t\tawait this.getParams();\n\t\t// 2. then the files, now that we know what extensions to search for\n\t\tawait this.getFilesData();\n\t}\n\n\tlineItems() {\n\t\tconst fileDatas = this._fileDatas.value;\n\t\tconst jsonParams = this._jsonParams.value;\n\t\tconst graphNodeIds = jsonParams.map((jsonParam) => jsonParam.graph_node_id);\n\t\tconst paramPaths = jsonParams.map((jsonParam) => {\n\t\t\tconst param = StoreController.engine.param(jsonParam.graph_node_id);\n\t\t\treturn param ? param.path() : '';\n\t\t});\n\t\tconst paramValues = jsonParams.map((jsonParam) => `${jsonParam.value}`);\n\t\tconst filePaths = paramValues.map(AssetsHelper.getfilePath);\n\t\tconst currentTimestamps = paramValues.map(AssetsHelper.getTimestamp);\n\n\t\tconst newTimestamps = filePaths.map((filePath) => {\n\t\t\tconst fileData = fileDatas.find((fileData) => {\n\t\t\t\tlet matchFound = false;\n\t\t\t\tfor (let prefix of POSSIBLE_PREFIXES) {\n\t\t\t\t\tif (`${prefix}${fileData.filePath}` == filePath) {\n\t\t\t\t\t\tmatchFound = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn matchFound;\n\t\t\t});\n\t\t\treturn fileData?.timestamp || -1;\n\t\t});\n\t\tconst list: LineItem[] = DEBUG ? DEBUG_LINE_ITEMS : [];\n\n\t\tlet i = 0;\n\t\tfor (let graphNodeId of graphNodeIds) {\n\t\t\tconst state = LocalAssetsSceneTraverser.isHTTP(paramValues[i]) ? LineItemState.REMOTE : LineItemState.LOCAL;\n\t\t\tconst lineItem: LineItem = {\n\t\t\t\tparamId: graphNodeId,\n\t\t\t\tparamValue: paramValues[i],\n\t\t\t\tfilePath: filePaths[i],\n\t\t\t\tcurrentTimestamp: currentTimestamps[i],\n\t\t\t\tnewTimestamp: newTimestamps[i],\n\t\t\t\tmoreRecentTimestamp: currentTimestamps[i] < newTimestamps[i],\n\t\t\t\tparamPath: paramPaths[i],\n\t\t\t\tstate,\n\t\t\t};\n\t\t\ti++;\n\t\t\tlist.push(lineItem);\n\t\t}\n\t\treturn list;\n\t}\n\tupdateTimestampCommand(lineItem: LineItem) {\n\t\tconst param = StoreController.engine.param(lineItem.paramId) as StringParam;\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newValue = `${lineItem.filePath}?${TIMESTAMP_URL_PARAM_NAME}=${lineItem.newTimestamp}`;\n\t\tconst cmd = new ParamSetCommand(param, newValue);\n\t\treturn cmd;\n\t}\n\n\tasync reloadParam(param: StringParam) {\n\t\tif (Editor.type() != EditorType.LOCAL) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.loadData();\n\t\tconst lineItems = this.lineItems();\n\t\tconst lineItem = lineItems.find((lineItem) => lineItem.paramId == param.graphNodeId());\n\t\tif (!lineItem) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmd = this.updateTimestampCommand(lineItem);\n\t\tif (!cmd) {\n\t\t\treturn;\n\t\t}\n\t\tawait Editor.instance().pushCommand(cmd);\n\t}\n\tasync updateFromFileChangeEvent(data: FileWatchData) {\n\t\tconst {requestedUrl} = data;\n\n\t\tawait this.loadData();\n\t\tconst lineItems = this.lineItems();\n\n\t\tconst lineItem = lineItems.find((lineItem) => {\n\t\t\tlet matchFound = false;\n\t\t\t// for (let prefix of POSSIBLE_PREFIXES) {\n\t\t\tconst parsed = {\n\t\t\t\trequestedUrl: new URL(requestedUrl, DUMMY_URL),\n\t\t\t\tparamValue: new URL(lineItem.paramValue, DUMMY_URL),\n\t\t\t};\n\t\t\tconst result = parsed.requestedUrl.pathname == parsed.paramValue.pathname;\n\t\t\tif (result) {\n\t\t\t\tmatchFound = true;\n\t\t\t}\n\t\t\t// }\n\t\t\treturn matchFound;\n\t\t});\n\t\tif (!lineItem) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmd = this.updateTimestampCommand(lineItem);\n\t\tif (!cmd) {\n\t\t\treturn;\n\t\t}\n\t\tawait Editor.instance().pushCommand(cmd);\n\n\t\t// let foundParams: StringParam[] = [];\n\t\t// StoreController.scene.traverseNodes((node) => {\n\t\t// \tconst params = node.params.all;\n\t\t// \tfor (let param of params) {\n\t\t// \t\tif (param.type() == ParamType.STRING && param.options.fileBrowseAllowed()) {\n\t\t// \t\t\tconst stringParam = param as StringParam;\n\t\t// \t\t\tif (requestedUrl.includes(stringParam.value)) {\n\t\t// \t\t\t\tfoundParams.push(stringParam);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// });\n\t\t// console.log(args, foundParams);\n\t\t// for (let param of foundParams) {\n\t\t// \tconst baseUrl = requestedUrl.split('?')[0];\n\t\t// \tconst newValue = `${baseUrl}?${TIMESTAMP_URL_PARAM_NAME}=${args.newTimestamp}`;\n\t\t// \tconst cmd = new ParamSetCommand(param, newValue);\n\t\t// \tcmd.push();\n\t\t// }\n\t}\n}\n\nexport const AssetsHelper = AssetsHelperClass.instance();\n","import {BaseNodeType} from '../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {PolyScene} from '../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\n\n// very very lame auto layout\nexport class CoreAutoLayout {\n\tconstructor() {}\n\n\ttraverseScene(scene: PolyScene) {\n\t\tthis.traverseNode(scene.root());\n\t}\n\n\ttraverseNode(node: BaseNodeType) {\n\t\t// sort root nodes on the x axis, ordered by name\n\t\tconst root_nodes = this._find_root_nodes(node);\n\n\t\tconst child_by_name: Map<string, BaseNodeType> = new Map();\n\t\tfor (let child of root_nodes) {\n\t\t\tchild_by_name.set(child.name(), child);\n\t\t}\n\t\tconst names = root_nodes.map((c) => c.name()).sort();\n\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\tconst name = names[i];\n\t\t\tconst child = child_by_name.get(name);\n\t\t\tif (child) {\n\t\t\t\tchild.uiData.setPosition(200 * i, 0);\n\t\t\t\tthis.traverseNode(child);\n\t\t\t}\n\t\t}\n\n\t\t// sort root nodes inputs\n\t\tfor (let root_node of root_nodes) {\n\t\t\tthis._auto_layout_input_nodes(root_node);\n\t\t}\n\t}\n\n\tprivate _auto_layout_input_nodes(node: BaseNodeType) {\n\t\tconst input_nodes = node.io.inputs.inputs();\n\t\tlet x = 0;\n\t\tfor (let i = 0; i < input_nodes.length; i++) {\n\t\t\tconst input_node = input_nodes[i];\n\t\t\tif (input_node) {\n\t\t\t\tinput_node.uiData.setPosition(node.uiData.position().x + x * 200, node.uiData.position().y - 200);\n\t\t\t\tx++;\n\t\t\t\tthis._auto_layout_input_nodes(input_node);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _find_root_nodes(parent_node: BaseNodeType) {\n\t\tconst nodes = parent_node.children();\n\t\tconst nodes_with_output_by_name: Map<string, BaseNodeType> = new Map();\n\t\tconst nodes_with_no_output: BaseNodeType[] = [];\n\n\t\tfor (let node of nodes) {\n\t\t\tconst max_inputs_count: number = node.io.inputs.maxInputsCount();\n\t\t\tfor (let i = 0; i < max_inputs_count; i++) {\n\t\t\t\tconst input = node.io.inputs.input(i);\n\t\t\t\tif (input) {\n\t\t\t\t\tnodes_with_output_by_name.set(input.name(), input);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let node of nodes) {\n\t\t\tif (!nodes_with_output_by_name.get(node.name())) {\n\t\t\t\tnodes_with_no_output.push(node);\n\t\t\t}\n\t\t}\n\t\treturn nodes_with_no_output;\n\t}\n}\n","export enum CaptureType {\n\tIMAGE = 'image',\n\tVIDEO = 'video',\n}\n","import {TailwindColor} from './Tailwind';\nimport {TypeAssert} from './../../../@polygonjs/polygonjs/src/engine/poly/Assert';\n// import {JsConnectionPointType} from './../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js';\nimport {\n\tEventConnectionPointType,\n\tEVENT_CONNECTION_POINT_TYPES,\n} from './../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Event';\nimport {\n\tJsConnectionPointType,\n\tJS_CONNECTION_POINT_TYPES,\n} from './../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js';\nimport {\n\tGlConnectionPointType,\n\tGL_CONNECTION_POINT_TYPES,\n} from './../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Gl';\n\nexport enum CssType {\n\tBG = 'bg',\n\tBORDER = 'border',\n\tSTROKE = 'stroke',\n\tTEXT = 'text',\n}\n// export enum ColorValue {\n// \tLIGHT = 'light',\n// \tDARK = 'dark',\n// }\ntype ColorValue = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nfunction className(color: TailwindColor, cssType: CssType, colorvalue: ColorValue) {\n\treturn `${cssType}-${color}-${colorvalue}`;\n}\n\nfunction glTypeClassName(type: GlConnectionPointType): TailwindColor {\n\tswitch (type) {\n\t\tcase GlConnectionPointType.BOOL: {\n\t\t\treturn TailwindColor.ROSE;\n\t\t}\n\t\tcase GlConnectionPointType.INT: {\n\t\t\treturn TailwindColor.ORANGE;\n\t\t}\n\t\tcase GlConnectionPointType.FLOAT: {\n\t\t\treturn TailwindColor.YELLOW;\n\t\t}\n\t\tcase GlConnectionPointType.VEC2: {\n\t\t\treturn TailwindColor.TEAL;\n\t\t}\n\t\tcase GlConnectionPointType.VEC3: {\n\t\t\treturn TailwindColor.BLUE;\n\t\t}\n\t\tcase GlConnectionPointType.VEC4: {\n\t\t\treturn TailwindColor.LIME;\n\t\t}\n\t\tcase GlConnectionPointType.MAT3: {\n\t\t\treturn TailwindColor.PINK;\n\t\t}\n\t\tcase GlConnectionPointType.MAT4: {\n\t\t\treturn TailwindColor.VIOLET;\n\t\t}\n\t\tcase GlConnectionPointType.SAMPLER_2D: {\n\t\t\treturn TailwindColor.PURPLE;\n\t\t}\n\t\tcase GlConnectionPointType.SAMPLER_2D_ARRAY: {\n\t\t\treturn TailwindColor.INDIGO;\n\t\t}\n\t\tcase GlConnectionPointType.SAMPLER_3D: {\n\t\t\treturn TailwindColor.INDIGO;\n\t\t}\n\t\tcase GlConnectionPointType.SAMPLER_CUBE: {\n\t\t\treturn TailwindColor.FUCHSIA;\n\t\t}\n\t\tcase GlConnectionPointType.SSS_MODEL: {\n\t\t\treturn TailwindColor.EMERALD;\n\t\t}\n\t\tcase GlConnectionPointType.SDF_CONTEXT: {\n\t\t\treturn TailwindColor.CYAN;\n\t\t}\n\t\tcase GlConnectionPointType.SDF_MATERIAL: {\n\t\t\treturn TailwindColor.LIME;\n\t\t}\n\t}\n\n\tTypeAssert.unreachable(type);\n}\n\nfunction jsTypeClassName(type: JsConnectionPointType): TailwindColor {\n\tswitch (type) {\n\t\tcase JsConnectionPointType.ANIMATION_MIXER: {\n\t\t\treturn TailwindColor.PINK;\n\t\t}\n\t\tcase JsConnectionPointType.ANIMATION_ACTION: {\n\t\t\treturn TailwindColor.PINK;\n\t\t}\n\t\tcase JsConnectionPointType.BOOLEAN: {\n\t\t\treturn TailwindColor.ROSE;\n\t\t}\n\t\tcase JsConnectionPointType.BOOLEAN_ARRAY: {\n\t\t\treturn TailwindColor.ROSE;\n\t\t}\n\t\tcase JsConnectionPointType.BOX3: {\n\t\t\treturn TailwindColor.SLATE;\n\t\t}\n\t\tcase JsConnectionPointType.CAMERA: {\n\t\t\treturn TailwindColor.BLUE;\n\t\t}\n\t\tcase JsConnectionPointType.CATMULL_ROM_CURVE3: {\n\t\t\treturn TailwindColor.STONE;\n\t\t}\n\t\tcase JsConnectionPointType.COLOR: {\n\t\t\treturn TailwindColor.PURPLE;\n\t\t}\n\t\tcase JsConnectionPointType.COLOR_ARRAY: {\n\t\t\treturn TailwindColor.PURPLE;\n\t\t}\n\t\tcase JsConnectionPointType.EULER: {\n\t\t\treturn TailwindColor.STONE;\n\t\t}\n\t\tcase JsConnectionPointType.EULER_ARRAY: {\n\t\t\treturn TailwindColor.STONE;\n\t\t}\n\t\tcase JsConnectionPointType.FLOAT: {\n\t\t\treturn TailwindColor.YELLOW;\n\t\t}\n\t\tcase JsConnectionPointType.FLOAT_ARRAY: {\n\t\t\treturn TailwindColor.YELLOW;\n\t\t}\n\t\tcase JsConnectionPointType.INT: {\n\t\t\treturn TailwindColor.ORANGE;\n\t\t}\n\t\tcase JsConnectionPointType.INT_ARRAY: {\n\t\t\treturn TailwindColor.ORANGE;\n\t\t}\n\t\tcase JsConnectionPointType.INTERSECTION: {\n\t\t\treturn TailwindColor.VIOLET;\n\t\t}\n\t\tcase JsConnectionPointType.INTERSECTION_ARRAY: {\n\t\t\treturn TailwindColor.VIOLET;\n\t\t}\n\t\tcase JsConnectionPointType.MATERIAL: {\n\t\t\treturn TailwindColor.PINK;\n\t\t}\n\t\tcase JsConnectionPointType.MATRIX4: {\n\t\t\treturn TailwindColor.SKY;\n\t\t}\n\t\tcase JsConnectionPointType.MATRIX4_ARRAY: {\n\t\t\treturn TailwindColor.SKY;\n\t\t}\n\t\tcase JsConnectionPointType.NODE: {\n\t\t\treturn TailwindColor.GREEN;\n\t\t}\n\t\tcase JsConnectionPointType.OBJECT_3D: {\n\t\t\treturn TailwindColor.INDIGO;\n\t\t}\n\t\tcase JsConnectionPointType.OBJECT_3D_ARRAY: {\n\t\t\treturn TailwindColor.INDIGO;\n\t\t}\n\t\tcase JsConnectionPointType.PARAM: {\n\t\t\treturn TailwindColor.ZINC;\n\t\t}\n\t\tcase JsConnectionPointType.PLANE: {\n\t\t\treturn TailwindColor.SLATE;\n\t\t}\n\t\tcase JsConnectionPointType.QUATERNION: {\n\t\t\treturn TailwindColor.CYAN;\n\t\t}\n\t\tcase JsConnectionPointType.QUATERNION_ARRAY: {\n\t\t\treturn TailwindColor.CYAN;\n\t\t}\n\t\tcase JsConnectionPointType.RAY: {\n\t\t\treturn TailwindColor.FUCHSIA;\n\t\t}\n\t\tcase JsConnectionPointType.SPHERE: {\n\t\t\treturn TailwindColor.SLATE;\n\t\t}\n\t\tcase JsConnectionPointType.STRING: {\n\t\t\treturn TailwindColor.EMERALD;\n\t\t}\n\t\tcase JsConnectionPointType.STRING_ARRAY: {\n\t\t\treturn TailwindColor.EMERALD;\n\t\t}\n\t\tcase JsConnectionPointType.TEXTURE: {\n\t\t\treturn TailwindColor.GRAY;\n\t\t}\n\t\tcase JsConnectionPointType.TEXTURE_ARRAY: {\n\t\t\treturn TailwindColor.GRAY;\n\t\t}\n\t\tcase JsConnectionPointType.TRIGGER: {\n\t\t\treturn TailwindColor.NEUTRAL;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR2: {\n\t\t\treturn TailwindColor.TEAL;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR2_ARRAY: {\n\t\t\treturn TailwindColor.TEAL;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR3: {\n\t\t\treturn TailwindColor.BLUE;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR3_ARRAY: {\n\t\t\treturn TailwindColor.BLUE;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR4: {\n\t\t\treturn TailwindColor.LIME;\n\t\t}\n\t\tcase JsConnectionPointType.VECTOR4_ARRAY: {\n\t\t\treturn TailwindColor.LIME;\n\t\t}\n\t}\n\n\tTypeAssert.unreachable(type);\n}\nfunction eventTypeClassName(type: EventConnectionPointType): TailwindColor {\n\tswitch (type) {\n\t\tcase EventConnectionPointType.BASE: {\n\t\t\treturn TailwindColor.ROSE;\n\t\t}\n\t\tcase EventConnectionPointType.DRAG: {\n\t\t\treturn TailwindColor.ORANGE;\n\t\t}\n\t\tcase EventConnectionPointType.KEYBOARD: {\n\t\t\treturn TailwindColor.YELLOW;\n\t\t}\n\t\tcase EventConnectionPointType.MOUSE: {\n\t\t\treturn TailwindColor.TEAL;\n\t\t}\n\t\tcase EventConnectionPointType.POINTER: {\n\t\t\treturn TailwindColor.BLUE;\n\t\t}\n\t}\n\n\tTypeAssert.unreachable(type);\n}\n\nexport function typeClassName(type: string, cssType: CssType, colorvalue: ColorValue): string | undefined {\n\tlet color: TailwindColor | undefined = undefined;\n\tif (GL_CONNECTION_POINT_TYPES.includes(type as GlConnectionPointType)) {\n\t\tcolor = glTypeClassName(type as GlConnectionPointType);\n\t}\n\tif (EVENT_CONNECTION_POINT_TYPES.includes(type as EventConnectionPointType)) {\n\t\tcolor = eventTypeClassName(type as EventConnectionPointType);\n\t}\n\tif (JS_CONNECTION_POINT_TYPES.includes(type as JsConnectionPointType)) {\n\t\tif ((type as JsConnectionPointType) == JsConnectionPointType.TRIGGER) {\n\t\t\tcolorvalue = 200;\n\t\t}\n\t\tcolor = jsTypeClassName(type as JsConnectionPointType);\n\t}\n\n\tif (color) {\n\t\treturn className(color, cssType, colorvalue);\n\t}\n}\n","export class Csrf {\n\tprivate static _token: string | undefined;\n\tstatic headers(): Dictionary<string> {\n\t\tconst token = this.token();\n\t\tif (token) {\n\t\t\treturn {\n\t\t\t\t'X-CSRF-Token': token,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\tstatic token() {\n\t\treturn (this._token = this._token || this._findToken());\n\t}\n\tprivate static _findToken() {\n\t\tconst metaTokenElement = document.querySelector('meta[name=\"csrf-token\"]');\n\t\tif (metaTokenElement) {\n\t\t\treturn metaTokenElement.getAttribute('content') || undefined;\n\t\t}\n\t\t// if(meta_token_element){\n\t\t// \taxios.defaults.headers.common['X-CSRF-Token'] =\n\t\t// }\n\t}\n}\n","export class DateUtils {\n\tstatic nowHuman() {\n\t\tconst date = new Date();\n\t\tconst h = `${date.getHours()}`.padStart(2, '0');\n\t\tconst m = `${date.getMinutes()}`.padStart(2, '0');\n\t\tconst s = `${date.getSeconds()}`.padStart(2, '0');\n\t\tconst currentTime = `${h}:${m}:${s}`;\n\t\tconst formatedTime = `${currentTime} on ${date.toDateString()}`;\n\t\treturn formatedTime;\n\t}\n\tstatic secondsToTimeCode(s: number) {\n\t\treturn this.millisecondsToTimeCode(s * 1000);\n\t}\n\tstatic millisecondsToTimeCode(s: number) {\n\t\tvar ms = s % 1000;\n\t\ts = (s - ms) / 1000;\n\t\tvar secs = s % 60;\n\t\ts = (s - secs) / 60;\n\t\tvar mins = s % 60;\n\t\tvar hrs = (s - mins) / 60;\n\n\t\tconst strings = [`${hrs}`.padStart(2, '0'), `${mins}`.padStart(2, '0'), `${secs}`.padStart(2, '0')].join(':');\n\t\treturn strings;\n\t\t// return hrs + ':' + mins + ':' + secs;\n\t}\n}\n","// const NO_USER_SELECT = 'disable-select';\nconst CURSOR_COL_RESIZE = 'cursor_col_resize';\n\nexport class CoreDom {\n\tstatic addDragClasses() {\n\t\t// document.body.classList.add(NO_USER_SELECT);\n\t\t// changing the style seems faster than adding the class above ( 30ms instead of 50ms )\n\t\tdocument.body.style.userSelect = 'none';\n\t}\n\tstatic removeDragClasses() {\n\t\t// document.body.classList.remove(NO_USER_SELECT);\n\t\tdocument.body.style.userSelect = 'auto';\n\t}\n\n\tstatic setCursorColResize() {\n\t\tdocument.body.classList.add(CURSOR_COL_RESIZE);\n\t}\n\tstatic unsetCursorColResize() {\n\t\tdocument.body.classList.remove(CURSOR_COL_RESIZE);\n\t}\n}\n","import {CoreFeaturesController} from './../../../@polygonjs/polygonjs/src/core/FeaturesController';\nexport const EXAMPLES_REGISTER_URL_PARAM_NAME = 'example';\n\nexport enum UrlParamFeature {\n\tMULTIPLAYER_PORT = 'multiplayerPort',\n}\n\nexport class FeaturesController extends CoreFeaturesController {\n\t// static sceneName(): string | null {\n\t// \treturn this.urlParam('scene');\n\t// }\n\tstatic legacyExampleId(): string | null {\n\t\treturn this.urlParam(EXAMPLES_REGISTER_URL_PARAM_NAME);\n\t}\n\tstatic layoutName(): string | null {\n\t\treturn this.urlParam('layout');\n\t}\n\tstatic forceSceneSaveCrash(): boolean {\n\t\treturn this.urlParam('__forceSceneSaveCrash__') == '1';\n\t}\n\tstatic measurePerformanceOnLoad(): boolean {\n\t\treturn this.urlParam('measurePerformanceOnLoad') == '1';\n\t}\n\tstatic viewerCaptureVideoMbsPerSecond(): number | undefined {\n\t\tconst numberAsStr = this.urlParam('viewerCaptureVideoMbsPerSecond');\n\t\tif (numberAsStr) {\n\t\t\treturn parseInt(numberAsStr);\n\t\t}\n\t}\n\tstatic inFigmaPlugin(): boolean {\n\t\treturn this.urlParam('inFigmaPlugin') == '1';\n\t}\n\tstatic mockFigmaPlugin(): boolean {\n\t\treturn this.urlParam('mockFigmaPlugin') == '1';\n\t}\n\tstatic displayViewerLogo(): boolean {\n\t\treturn this.urlParam('displayViewerLogo') == '1';\n\t}\n\tstatic debugErrorsNotifier(): boolean {\n\t\treturn this.urlParam('debugErrorsNotifier') == '1';\n\t}\n\tstatic noErrorsNotifier(): boolean {\n\t\treturn this.urlParam('noErrorsNotifier') == '1';\n\t}\n\tstatic loaderDebug(): boolean {\n\t\treturn this.urlParam('loaderDebug') != null;\n\t}\n\tstatic polyNodeDebugLevel(): number {\n\t\tconst param = this.urlParam('polyNodeDebugLevel');\n\t\tif (param) {\n\t\t\treturn parseInt(param);\n\t\t}\n\t\treturn -1;\n\t}\n\tstatic marketplaceDebug(): boolean {\n\t\treturn this.urlParam('marketplaceDebug') == '1';\n\t}\n\tprivate static _multiplayerActive: boolean = this.urlParam('multiplayer') == '1';\n\tstatic multiplayerActive() {\n\t\treturn this._multiplayerActive;\n\t}\n\tprivate static _multiplayerPort: string = this.urlParam(UrlParamFeature.MULTIPLAYER_PORT) || '8091';\n\tstatic multiplayerPort() {\n\t\treturn this._multiplayerPort;\n\t}\n\n\tstatic createDefinedVariables() {\n\t\t// allow the creation of global variables from the url of the editor\n\t\t// although a similar functionality can be achieved from EditorConfig (in the local app only)\n\t\tconst entries = this.urlParams().entries();\n\t\tfor (const entry of entries) {\n\t\t\tconst [entryName, entryValue] = entry;\n\t\t\tconst elements = entryName.split('-');\n\t\t\tif (elements[0] == 'polydefine') {\n\t\t\t\tconst varName = elements[1];\n\t\t\t\t(window as any)[varName] = entryValue;\n\t\t\t\tconsole.log(`created global var:${varName}=`, (window as any)[varName]);\n\t\t\t}\n\t\t}\n\t}\n}\n","// import { DirectUploadController } from \"./activestorage/direct_upload_controller\";\n// import { DirectUpload } from \"@rails/activestorage\"\n\nimport {CoreType} from '../../../@polygonjs/polygonjs/src/core/Type';\n\ninterface BlobToFileOptions {\n\taddExtFromBlobType: boolean;\n}\nexport class CoreFileUtils {\n\t//\n\t//\n\t// CONVERSIONS\n\t//\n\t//\n\t// datauri_to_blob(datauri: string): Blob{\n\t// \t// convert base64 to raw binary data held in a string\n\t// \t// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n\t// \tconst datauri_elements = datauri.split(',');\n\t// \tconst encoded_type = datauri_elements[0].split(';')[1];\n\n\t// \tconst is_base64 = (encoded_type != null) && (encoded_type === 'base64');\n\t// \tconst byteString = is_base64 ?\n\t// \t\tatob(datauri_elements[1])\n\t// \t:\n\t// \t\tdatauri_elements[1];\n\n\t// \t// separate out the mime component\n\t// \tconst mimeString = datauri.split(',')[0].split(':')[1].split(';')[0];\n\n\t// \t// write the bytes of the string to an ArrayBuffer\n\t// \tconst ab = new ArrayBuffer(byteString.length);\n\n\t// \t// create a view into the buffer\n\t// \tconst ia = new Uint8Array(ab);\n\n\t// \t// set the bytes of the buffer to the correct values\n\t// \t//for (i = 0; i < byteString.length; i++)\n\t// \tfor (let i = 0, end = byteString.length, asc = 0 <= end; asc ? i < end : i > end; asc ? i++ : i--) {\n\t// \t\tia[i] = byteString.charCodeAt(i);\n\t// \t}\n\n\t// \t// write the ArrayBuffer to a blob, and you're done\n\t// \tconst blob = new Blob([ab], {type: mimeString});\n\t// \treturn blob;\n\t// }\n\n\t// text_to_blob: (text) ->\n\t// \tbyteString = atob(text)\n\n\t// \tab = new ArrayBuffer(byteString.length)\n\n\t// \t# create a view into the buffer\n\t// \tia = new Uint8Array(ab)\n\n\t// \t# set the bytes of the buffer to the correct values\n\t// \t#for (i = 0; i < byteString.length; i++)\n\t// \tfor i in [0...byteString.length]\n\t// \t\tia[i] = byteString.charCodeAt(i)\n\n\t// \t# write the ArrayBuffer to a blob, and you're done\n\t// \tblob = new Blob([ab], {type: mimeString})\n\t// \tblob\n\n\tstatic async imageToBlob(image: HTMLImageElement): Promise<Blob | null> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst canvasElement = document.createElement('canvas');\n\t\t\t// videoWidth and videoHeight are more robust than .width and .height (see https://discourse.threejs.org/t/how-to-get-camera-video-texture-size-or-resolution/2879)\n\t\t\tcanvasElement.width = image.width;\n\t\t\tcanvasElement.height = image.height;\n\t\t\tconst canvasCtx = canvasElement.getContext('2d')!;\n\t\t\tcanvasCtx.drawImage(image, 0, 0, canvasElement.width, canvasElement.height);\n\t\t\tcanvasElement.toBlob((blob) => {\n\t\t\t\tresolve(blob);\n\t\t\t});\n\t\t});\n\t}\n\n\tstatic async imageUrlToBlob(url: string): Promise<Blob | null> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst image = new Image();\n\t\t\timage.crossOrigin = 'Anonymous';\n\t\t\timage.onload = () => {\n\t\t\t\t// const response = await fetch(url, {mode: 'no-cors'});\n\t\t\t\t// const blob = await response.blob();\n\n\t\t\t\t// document.body.innerHTML = `<img src=\"${CoreFileUtils.blobToDatauri(blob)}\"></img>`;\n\t\t\t\t// document.body.innerHTML = '';\n\t\t\t\t// document.body.append(image);\n\n\t\t\t\tthis.imageToBlob(image).then((blob) => {\n\t\t\t\t\tresolve(blob);\n\t\t\t\t});\n\n\t\t\t\t//this.setThumbnailStaticBlob(blob);\n\t\t\t};\n\t\t\timage.src = url;\n\t\t});\n\t}\n\n\tstatic downloadBlob(blob: Blob, filename: string) {\n\t\tconst urlCreator = window.URL || window.webkitURL;\n\t\tconst blobUrl = urlCreator.createObjectURL(blob);\n\n\t\tconst element = document.createElement('a');\n\t\telement.setAttribute('href', blobUrl);\n\t\telement.setAttribute('target', '_blank');\n\t\telement.setAttribute('download', filename);\n\n\t\telement.style.display = 'none';\n\t\tdocument.body.appendChild(element);\n\t\telement.click();\n\n\t\tdocument.body.removeChild(element);\n\t}\n\n\tstatic blobToFile(blob: Blob, filename: string, options: BlobToFileOptions = {addExtFromBlobType: true}): File {\n\t\t// A Blob() is almost a File() - it's just missing the two properties below which we will add\n\t\t// blob.lastModifiedDate = new Date()\n\t\t// blob.name = filename\n\t\t// blob\n\t\tif (options.addExtFromBlobType) {\n\t\t\tconst ext = blob.type.split('/')[1];\n\t\t\tfilename = `${filename}.${ext}`;\n\t\t}\n\t\treturn new File([blob], filename, {type: blob.type});\n\t}\n\tstatic async blobToDatauri(blob: Blob): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (e: ProgressEvent<FileReader>) => {\n\t\t\t\tconst result = e.target?.result;\n\t\t\t\tif (CoreType.isString(result)) {\n\t\t\t\t\tresolve(result);\n\t\t\t\t}\n\t\t\t};\n\t\t\treader.readAsDataURL(blob);\n\t\t});\n\t}\n\t// https://stackoverflow.com/questions/12168909/blob-from-dataurl\n\tstatic async dataUriToBlob(dataUri: string): Promise<Blob> {\n\t\tconst response = await fetch(dataUri);\n\t\tconst blob = await response.blob();\n\t\treturn blob;\n\t}\n\tstatic fileToDataURL(file: File): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// encode the file using the FileReader API\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onloadend = () => {\n\t\t\t\t// use a regex to remove data url part\n\t\t\t\tconst base64String = (reader.result as any).replace('data:', '').replace(/^.+,/, '');\n\n\t\t\t\t// log to console\n\t\t\t\t// logs wL2dvYWwgbW9yZ...\n\t\t\t\tresolve(base64String);\n\t\t\t};\n\t\t\treader.readAsDataURL(file);\n\t\t});\n\t}\n}\n","export enum Keyboard {\n\tENTER = 'Enter',\n\tTAB = 'Tab',\n\tARROW_LEFT = 'ArrowLeft',\n\tARROW_RIGHT = 'ArrowRight',\n\tARROW_UP = 'ArrowUp',\n\tARROW_DOWN = 'ArrowDown',\n}\n","export function removeLoader() {\n\tconst loadingContainer = document.getElementById('scene_loading_container');\n\tif (!loadingContainer) {\n\t\treturn;\n\t}\n\tloadingContainer.classList.add('opacity-0');\n\tloadingContainer.classList.remove('opacity-100');\n\tsetTimeout(() => {\n\t\tloadingContainer?.remove();\n\t}, 1000);\n}\n","import {TypedNodeConnection} from './../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\nimport {BaseNodeType} from './../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from './../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\ninterface Connection {\n\tdestNode: {\n\t\tnode: BaseNodeType;\n\t\tinputIndex: number;\n\t};\n\toutputIndex: number;\n}\n\nexport class NodeChangeType {\n\tconstructor(private oldNode: BaseNodeType) {}\n\n\toutputConnectionData() {\n\t\t// save the outputs\n\t\tconst outputConnectionsData: Set<Connection> = new Set();\n\t\tconst currentOutputConnections: TypedNodeConnection<NodeContext>[] = [];\n\t\tthis.oldNode.io.connections.outputConnections(currentOutputConnections);\n\t\tfor (let connection of currentOutputConnections) {\n\t\t\toutputConnectionsData.add({\n\t\t\t\tdestNode: {\n\t\t\t\t\tnode: connection.nodeDest(),\n\t\t\t\t\tinputIndex: connection.inputIndex(),\n\t\t\t\t},\n\t\t\t\toutputIndex: connection.outputIndex(),\n\t\t\t});\n\t\t}\n\t\treturn outputConnectionsData;\n\t}\n\trestoreOutputConnections(outputConnectionsData: Set<Connection>, newNode: BaseNodeType) {\n\t\toutputConnectionsData.forEach((connectionData) => {\n\t\t\tconst node = connectionData.destNode.node;\n\t\t\tnode.setInput(connectionData.destNode.inputIndex, newNode, connectionData.outputIndex);\n\t\t});\n\t}\n}\n","import {Editor} from './../Editor';\nimport type {NodeSerializerData} from './../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {StoreController} from './../store/controllers/StoreController';\nimport {BaseNodeType} from './../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeSetNameCommand} from '../history/commands/NodeSetName';\nexport async function editNodeName(jsonNode: NodeSerializerData) {\n\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as BaseNodeType;\n\tif (!node) {\n\t\treturn;\n\t}\n\tif (node.insideALockedParent()) {\n\t\treturn;\n\t}\n\n\tconst newName: string | null = await StoreController.editor.dialogPrompt.show({\n\t\ttitle: 'Rename Node:',\n\t\tdefaultValue: jsonNode.name,\n\t\tconfirmLabel: 'Update Name',\n\t});\n\n\tif (newName != null && newName.length > 0) {\n\t\tconst parent = node.parent();\n\t\tif (parent) {\n\t\t\tconst cmd = new NodeSetNameCommand(parent, node, newName);\n\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t}\n\t}\n}\n","import {AVAILABLE_LINK_INDEX_VALUES, LinkIndex} from './../components/panels/common/LinkIndex';\nimport {StoreController} from './../store/controllers/StoreController';\nimport {BaseNodeType} from './../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nfunction getParents(node: BaseNodeType): BaseNodeType[] {\n\tconst list: BaseNodeType[] = [];\n\n\tlet current = node;\n\tlet parent: BaseNodeType | null = null;\n\twhile ((parent = current.parent())) {\n\t\tlist.push(parent);\n\t\tcurrent = parent;\n\t}\n\treturn list;\n}\n\nfunction updateCurrentNodeIfRequired(linkIndex: LinkIndex, graphNodeIdsToDelete: Set<number>) {\n\tconst currentJSONNode = StoreController.editor.current_json_node(linkIndex);\n\tif (!currentJSONNode) {\n\t\treturn;\n\t}\n\tconst currentNode = StoreController.engine.node(currentJSONNode.graph_node_id);\n\tif (!currentNode) {\n\t\treturn;\n\t}\n\tconst nodesToCheck = [currentNode, ...getParents(currentNode)];\n\tlet lastParentToDelete: BaseNodeType | null = null;\n\tfor (let i = 0; i < nodesToCheck.length; i++) {\n\t\tconst nodeToCheck = nodesToCheck[i];\n\t\tif (graphNodeIdsToDelete.has(nodeToCheck.graphNodeId())) {\n\t\t\tlastParentToDelete = nodeToCheck;\n\t\t}\n\t}\n\tif (lastParentToDelete) {\n\t\tconst newParent = lastParentToDelete.parent() || StoreController.scene.root();\n\t\tStoreController.editor.setCurrentNode(linkIndex, newParent);\n\t}\n}\n\nexport class SafeNodeRemover {\n\tstatic removeNodes(parentNode: BaseNodeType, nodes: BaseNodeType[]) {\n\t\t// before removing, we check that the nodes to remove, or any of their children\n\t\t// are not part of the current nodes for network view\n\t\tconst graphNodeIdsToDelete: Set<number> = new Set();\n\t\tfor (let node of nodes) {\n\t\t\tgraphNodeIdsToDelete.add(node.graphNodeId());\n\t\t}\n\n\t\tfor (let index of AVAILABLE_LINK_INDEX_VALUES) {\n\t\t\tupdateCurrentNodeIfRequired(index, graphNodeIdsToDelete);\n\t\t}\n\n\t\t// remove nodes\n\t\tfor (let node of nodes) {\n\t\t\tparentNode.removeNode(node);\n\t\t}\n\t}\n}\n","import {PolyNodeController} from '../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {StoreController} from '../store/controllers/StoreController';\nimport {SceneJsonExporterData} from '../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\n\nconst DEFAULT_SCENE_SAVE_MESSAGE = `scene not saved as no name was given`;\nexport class BaseSaveController {\n\tconstructor() {}\n\tstatic updateStatusBarWithNoSave(message = DEFAULT_SCENE_SAVE_MESSAGE) {\n\t\tStoreController.editor.status.setMessage(message);\n\t}\n\tupdateStatusBarWithNoSave(message = DEFAULT_SCENE_SAVE_MESSAGE) {\n\t\tBaseSaveController.updateStatusBarWithNoSave(message);\n\t}\n\tstatic embedPolyNodes(code: SceneJsonExporterData) {\n\t\tPolyNodeController.register().forEach((typesName, node_context) => {\n\t\t\ttypesName.forEach((definition, node_type) => {\n\t\t\t\tcode.embeddedPolyNodes = code.embeddedPolyNodes || {};\n\t\t\t\tconst key: string = `${node_context}/${node_type}`;\n\t\t\t\tcode.embeddedPolyNodes[key] = definition;\n\t\t\t});\n\t\t});\n\t}\n}\n","export enum SelectionMethod {\n\tOVERRIDE = 'OVERRIDE',\n\tADD = 'ADD',\n\tREMOVE = 'REMOVE',\n}\n","export enum TailwindColor {\n\tSLATE = 'slate',\n\tGRAY = 'gray',\n\tZINC = 'zinc',\n\tNEUTRAL = 'neutral',\n\tSTONE = 'stone',\n\tRED = 'red',\n\tORANGE = 'orange',\n\tAMBER = 'amber',\n\tYELLOW = 'yellow',\n\tLIME = 'lime',\n\tGREEN = 'green',\n\tEMERALD = 'emerald',\n\tTEAL = 'teal',\n\tCYAN = 'cyan',\n\tSKY = 'sky',\n\tBLUE = 'blue',\n\tINDIGO = 'indigo',\n\tVIOLET = 'violet',\n\tPURPLE = 'purple',\n\tFUCHSIA = 'fuchsia',\n\tPINK = 'pink',\n\tROSE = 'rose',\n}\nexport const TAILWIND_COLORS: TailwindColor[] = [\n\tTailwindColor.SLATE,\n\tTailwindColor.GRAY,\n\tTailwindColor.ZINC,\n\tTailwindColor.NEUTRAL,\n\tTailwindColor.STONE,\n\tTailwindColor.RED,\n\tTailwindColor.ORANGE,\n\tTailwindColor.AMBER,\n\tTailwindColor.YELLOW,\n\tTailwindColor.LIME,\n\tTailwindColor.GREEN,\n\tTailwindColor.EMERALD,\n\tTailwindColor.TEAL,\n\tTailwindColor.CYAN,\n\tTailwindColor.SKY,\n\tTailwindColor.BLUE,\n\tTailwindColor.INDIGO,\n\tTailwindColor.VIOLET,\n\tTailwindColor.PURPLE,\n\tTailwindColor.FUCHSIA,\n\tTailwindColor.PINK,\n\tTailwindColor.ROSE,\n];\n\n// in order to add colors to be automatically included in the stylesheet,\n// add them here.\n// It currently includes:\n// 1. bg-*-*\n// 2. border-*-*\n// 3. stroke-*-*\nexport enum TailwindPalette {\n\tBG_SLATE_50 = 'bg-slate-50',\n\tBG_SLATE_100 = 'bg-slate-100',\n\tBG_SLATE_200 = 'bg-slate-200',\n\tBG_SLATE_300 = 'bg-slate-300',\n\tBG_SLATE_400 = 'bg-slate-400',\n\tBG_SLATE_500 = 'bg-slate-500',\n\tBG_SLATE_600 = 'bg-slate-600',\n\tBG_SLATE_700 = 'bg-slate-700',\n\tBG_SLATE_800 = 'bg-slate-800',\n\tBG_SLATE_900 = 'bg-slate-900',\n\tBG_GRAY_50 = 'bg-gray-50',\n\tBG_GRAY_100 = 'bg-gray-100',\n\tBG_GRAY_200 = 'bg-gray-200',\n\tBG_GRAY_300 = 'bg-gray-300',\n\tBG_GRAY_400 = 'bg-gray-400',\n\tBG_GRAY_500 = 'bg-gray-500',\n\tBG_GRAY_600 = 'bg-gray-600',\n\tBG_GRAY_700 = 'bg-gray-700',\n\tBG_GRAY_800 = 'bg-gray-800',\n\tBG_GRAY_900 = 'bg-gray-900',\n\tBG_ZINC_50 = 'bg-zinc-50',\n\tBG_ZINC_100 = 'bg-zinc-100',\n\tBG_ZINC_200 = 'bg-zinc-200',\n\tBG_ZINC_300 = 'bg-zinc-300',\n\tBG_ZINC_400 = 'bg-zinc-400',\n\tBG_ZINC_500 = 'bg-zinc-500',\n\tBG_ZINC_600 = 'bg-zinc-600',\n\tBG_ZINC_700 = 'bg-zinc-700',\n\tBG_ZINC_800 = 'bg-zinc-800',\n\tBG_ZINC_900 = 'bg-zinc-900',\n\tBG_NEUTRAL_50 = 'bg-neutral-50',\n\tBG_NEUTRAL_100 = 'bg-neutral-100',\n\tBG_NEUTRAL_200 = 'bg-neutral-200',\n\tBG_NEUTRAL_300 = 'bg-neutral-300',\n\tBG_NEUTRAL_400 = 'bg-neutral-400',\n\tBG_NEUTRAL_500 = 'bg-neutral-500',\n\tBG_NEUTRAL_600 = 'bg-neutral-600',\n\tBG_NEUTRAL_700 = 'bg-neutral-700',\n\tBG_NEUTRAL_800 = 'bg-neutral-800',\n\tBG_NEUTRAL_900 = 'bg-neutral-900',\n\tBG_STONE_50 = 'bg-stone-50',\n\tBG_STONE_100 = 'bg-stone-100',\n\tBG_STONE_200 = 'bg-stone-200',\n\tBG_STONE_300 = 'bg-stone-300',\n\tBG_STONE_400 = 'bg-stone-400',\n\tBG_STONE_500 = 'bg-stone-500',\n\tBG_STONE_600 = 'bg-stone-600',\n\tBG_STONE_700 = 'bg-stone-700',\n\tBG_STONE_800 = 'bg-stone-800',\n\tBG_STONE_900 = 'bg-stone-900',\n\tBG_RED_50 = 'bg-red-50',\n\tBG_RED_100 = 'bg-red-100',\n\tBG_RED_200 = 'bg-red-200',\n\tBG_RED_300 = 'bg-red-300',\n\tBG_RED_400 = 'bg-red-400',\n\tBG_RED_500 = 'bg-red-500',\n\tBG_RED_600 = 'bg-red-600',\n\tBG_RED_700 = 'bg-red-700',\n\tBG_RED_800 = 'bg-red-800',\n\tBG_RED_900 = 'bg-red-900',\n\tBG_ORANGE_50 = 'bg-orange-50',\n\tBG_ORANGE_100 = 'bg-orange-100',\n\tBG_ORANGE_200 = 'bg-orange-200',\n\tBG_ORANGE_300 = 'bg-orange-300',\n\tBG_ORANGE_400 = 'bg-orange-400',\n\tBG_ORANGE_500 = 'bg-orange-500',\n\tBG_ORANGE_600 = 'bg-orange-600',\n\tBG_ORANGE_700 = 'bg-orange-700',\n\tBG_ORANGE_800 = 'bg-orange-800',\n\tBG_ORANGE_900 = 'bg-orange-900',\n\tBG_AMBER_50 = 'bg-amber-50',\n\tBG_AMBER_100 = 'bg-amber-100',\n\tBG_AMBER_200 = 'bg-amber-200',\n\tBG_AMBER_300 = 'bg-amber-300',\n\tBG_AMBER_400 = 'bg-amber-400',\n\tBG_AMBER_500 = 'bg-amber-500',\n\tBG_AMBER_600 = 'bg-amber-600',\n\tBG_AMBER_700 = 'bg-amber-700',\n\tBG_AMBER_800 = 'bg-amber-800',\n\tBG_AMBER_900 = 'bg-amber-900',\n\tBG_YELLOW_50 = 'bg-yellow-50',\n\tBG_YELLOW_100 = 'bg-yellow-100',\n\tBG_YELLOW_200 = 'bg-yellow-200',\n\tBG_YELLOW_300 = 'bg-yellow-300',\n\tBG_YELLOW_400 = 'bg-yellow-400',\n\tBG_YELLOW_500 = 'bg-yellow-500',\n\tBG_YELLOW_600 = 'bg-yellow-600',\n\tBG_YELLOW_700 = 'bg-yellow-700',\n\tBG_YELLOW_800 = 'bg-yellow-800',\n\tBG_YELLOW_900 = 'bg-yellow-900',\n\tBG_LIME_50 = 'bg-lime-50',\n\tBG_LIME_100 = 'bg-lime-100',\n\tBG_LIME_200 = 'bg-lime-200',\n\tBG_LIME_300 = 'bg-lime-300',\n\tBG_LIME_400 = 'bg-lime-400',\n\tBG_LIME_500 = 'bg-lime-500',\n\tBG_LIME_600 = 'bg-lime-600',\n\tBG_LIME_700 = 'bg-lime-700',\n\tBG_LIME_800 = 'bg-lime-800',\n\tBG_LIME_900 = 'bg-lime-900',\n\tBG_GREEN_50 = 'bg-green-50',\n\tBG_GREEN_100 = 'bg-green-100',\n\tBG_GREEN_200 = 'bg-green-200',\n\tBG_GREEN_300 = 'bg-green-300',\n\tBG_GREEN_400 = 'bg-green-400',\n\tBG_GREEN_500 = 'bg-green-500',\n\tBG_GREEN_600 = 'bg-green-600',\n\tBG_GREEN_700 = 'bg-green-700',\n\tBG_GREEN_800 = 'bg-green-800',\n\tBG_GREEN_900 = 'bg-green-900',\n\tBG_EMERALD_50 = 'bg-emerald-50',\n\tBG_EMERALD_100 = 'bg-emerald-100',\n\tBG_EMERALD_200 = 'bg-emerald-200',\n\tBG_EMERALD_300 = 'bg-emerald-300',\n\tBG_EMERALD_400 = 'bg-emerald-400',\n\tBG_EMERALD_500 = 'bg-emerald-500',\n\tBG_EMERALD_600 = 'bg-emerald-600',\n\tBG_EMERALD_700 = 'bg-emerald-700',\n\tBG_EMERALD_800 = 'bg-emerald-800',\n\tBG_EMERALD_900 = 'bg-emerald-900',\n\tBG_TEAL_50 = 'bg-teal-50',\n\tBG_TEAL_100 = 'bg-teal-100',\n\tBG_TEAL_200 = 'bg-teal-200',\n\tBG_TEAL_300 = 'bg-teal-300',\n\tBG_TEAL_400 = 'bg-teal-400',\n\tBG_TEAL_500 = 'bg-teal-500',\n\tBG_TEAL_600 = 'bg-teal-600',\n\tBG_TEAL_700 = 'bg-teal-700',\n\tBG_TEAL_800 = 'bg-teal-800',\n\tBG_TEAL_900 = 'bg-teal-900',\n\tBG_CYAN_50 = 'bg-cyan-50',\n\tBG_CYAN_100 = 'bg-cyan-100',\n\tBG_CYAN_200 = 'bg-cyan-200',\n\tBG_CYAN_300 = 'bg-cyan-300',\n\tBG_CYAN_400 = 'bg-cyan-400',\n\tBG_CYAN_500 = 'bg-cyan-500',\n\tBG_CYAN_600 = 'bg-cyan-600',\n\tBG_CYAN_700 = 'bg-cyan-700',\n\tBG_CYAN_800 = 'bg-cyan-800',\n\tBG_CYAN_900 = 'bg-cyan-900',\n\tBG_SKY_50 = 'bg-sky-50',\n\tBG_SKY_100 = 'bg-sky-100',\n\tBG_SKY_200 = 'bg-sky-200',\n\tBG_SKY_300 = 'bg-sky-300',\n\tBG_SKY_400 = 'bg-sky-400',\n\tBG_SKY_500 = 'bg-sky-500',\n\tBG_SKY_600 = 'bg-sky-600',\n\tBG_SKY_700 = 'bg-sky-700',\n\tBG_SKY_800 = 'bg-sky-800',\n\tBG_SKY_900 = 'bg-sky-900',\n\tBG_BLUE_50 = 'bg-blue-50',\n\tBG_BLUE_100 = 'bg-blue-100',\n\tBG_BLUE_200 = 'bg-blue-200',\n\tBG_BLUE_300 = 'bg-blue-300',\n\tBG_BLUE_400 = 'bg-blue-400',\n\tBG_BLUE_500 = 'bg-blue-500',\n\tBG_BLUE_600 = 'bg-blue-600',\n\tBG_BLUE_700 = 'bg-blue-700',\n\tBG_BLUE_800 = 'bg-blue-800',\n\tBG_BLUE_900 = 'bg-blue-900',\n\tBG_INDIGO_50 = 'bg-indigo-50',\n\tBG_INDIGO_100 = 'bg-indigo-100',\n\tBG_INDIGO_200 = 'bg-indigo-200',\n\tBG_INDIGO_300 = 'bg-indigo-300',\n\tBG_INDIGO_400 = 'bg-indigo-400',\n\tBG_INDIGO_500 = 'bg-indigo-500',\n\tBG_INDIGO_600 = 'bg-indigo-600',\n\tBG_INDIGO_700 = 'bg-indigo-700',\n\tBG_INDIGO_800 = 'bg-indigo-800',\n\tBG_INDIGO_900 = 'bg-indigo-900',\n\tBG_VIOLET_50 = 'bg-violet-50',\n\tBG_VIOLET_100 = 'bg-violet-100',\n\tBG_VIOLET_200 = 'bg-violet-200',\n\tBG_VIOLET_300 = 'bg-violet-300',\n\tBG_VIOLET_400 = 'bg-violet-400',\n\tBG_VIOLET_500 = 'bg-violet-500',\n\tBG_VIOLET_600 = 'bg-violet-600',\n\tBG_VIOLET_700 = 'bg-violet-700',\n\tBG_VIOLET_800 = 'bg-violet-800',\n\tBG_VIOLET_900 = 'bg-violet-900',\n\tBG_PURPLE_50 = 'bg-purple-50',\n\tBG_PURPLE_100 = 'bg-purple-100',\n\tBG_PURPLE_200 = 'bg-purple-200',\n\tBG_PURPLE_300 = 'bg-purple-300',\n\tBG_PURPLE_400 = 'bg-purple-400',\n\tBG_PURPLE_500 = 'bg-purple-500',\n\tBG_PURPLE_600 = 'bg-purple-600',\n\tBG_PURPLE_700 = 'bg-purple-700',\n\tBG_PURPLE_800 = 'bg-purple-800',\n\tBG_PURPLE_900 = 'bg-purple-900',\n\tBG_FUCHSIA_50 = 'bg-fuchsia-50',\n\tBG_FUCHSIA_100 = 'bg-fuchsia-100',\n\tBG_FUCHSIA_200 = 'bg-fuchsia-200',\n\tBG_FUCHSIA_300 = 'bg-fuchsia-300',\n\tBG_FUCHSIA_400 = 'bg-fuchsia-400',\n\tBG_FUCHSIA_500 = 'bg-fuchsia-500',\n\tBG_FUCHSIA_600 = 'bg-fuchsia-600',\n\tBG_FUCHSIA_700 = 'bg-fuchsia-700',\n\tBG_FUCHSIA_800 = 'bg-fuchsia-800',\n\tBG_FUCHSIA_900 = 'bg-fuchsia-900',\n\tBG_PINK_50 = 'bg-pink-50',\n\tBG_PINK_100 = 'bg-pink-100',\n\tBG_PINK_200 = 'bg-pink-200',\n\tBG_PINK_300 = 'bg-pink-300',\n\tBG_PINK_400 = 'bg-pink-400',\n\tBG_PINK_500 = 'bg-pink-500',\n\tBG_PINK_600 = 'bg-pink-600',\n\tBG_PINK_700 = 'bg-pink-700',\n\tBG_PINK_800 = 'bg-pink-800',\n\tBG_PINK_900 = 'bg-pink-900',\n\tBG_ROSE_50 = 'bg-rose-50',\n\tBG_ROSE_100 = 'bg-rose-100',\n\tBG_ROSE_200 = 'bg-rose-200',\n\tBG_ROSE_300 = 'bg-rose-300',\n\tBG_ROSE_400 = 'bg-rose-400',\n\tBG_ROSE_500 = 'bg-rose-500',\n\tBG_ROSE_600 = 'bg-rose-600',\n\tBG_ROSE_700 = 'bg-rose-700',\n\tBG_ROSE_800 = 'bg-rose-800',\n\tBG_ROSE_900 = 'bg-rose-900',\n\t//\n\tBORDER_SLATE_50 = 'border-slate-50',\n\tBORDER_SLATE_100 = 'border-slate-100',\n\tBORDER_SLATE_200 = 'border-slate-200',\n\tBORDER_SLATE_300 = 'border-slate-300',\n\tBORDER_SLATE_400 = 'border-slate-400',\n\tBORDER_SLATE_500 = 'border-slate-500',\n\tBORDER_SLATE_600 = 'border-slate-600',\n\tBORDER_SLATE_700 = 'border-slate-700',\n\tBORDER_SLATE_800 = 'border-slate-800',\n\tBORDER_SLATE_900 = 'border-slate-900',\n\tBORDER_GRAY_50 = 'border-gray-50',\n\tBORDER_GRAY_100 = 'border-gray-100',\n\tBORDER_GRAY_200 = 'border-gray-200',\n\tBORDER_GRAY_300 = 'border-gray-300',\n\tBORDER_GRAY_400 = 'border-gray-400',\n\tBORDER_GRAY_500 = 'border-gray-500',\n\tBORDER_GRAY_600 = 'border-gray-600',\n\tBORDER_GRAY_700 = 'border-gray-700',\n\tBORDER_GRAY_800 = 'border-gray-800',\n\tBORDER_GRAY_900 = 'border-gray-900',\n\tBORDER_ZINC_50 = 'border-zinc-50',\n\tBORDER_ZINC_100 = 'border-zinc-100',\n\tBORDER_ZINC_200 = 'border-zinc-200',\n\tBORDER_ZINC_300 = 'border-zinc-300',\n\tBORDER_ZINC_400 = 'border-zinc-400',\n\tBORDER_ZINC_500 = 'border-zinc-500',\n\tBORDER_ZINC_600 = 'border-zinc-600',\n\tBORDER_ZINC_700 = 'border-zinc-700',\n\tBORDER_ZINC_800 = 'border-zinc-800',\n\tBORDER_ZINC_900 = 'border-zinc-900',\n\tBORDER_NEUTRAL_50 = 'border-neutral-50',\n\tBORDER_NEUTRAL_100 = 'border-neutral-100',\n\tBORDER_NEUTRAL_200 = 'border-neutral-200',\n\tBORDER_NEUTRAL_300 = 'border-neutral-300',\n\tBORDER_NEUTRAL_400 = 'border-neutral-400',\n\tBORDER_NEUTRAL_500 = 'border-neutral-500',\n\tBORDER_NEUTRAL_600 = 'border-neutral-600',\n\tBORDER_NEUTRAL_700 = 'border-neutral-700',\n\tBORDER_NEUTRAL_800 = 'border-neutral-800',\n\tBORDER_NEUTRAL_900 = 'border-neutral-900',\n\tBORDER_STONE_50 = 'border-stone-50',\n\tBORDER_STONE_100 = 'border-stone-100',\n\tBORDER_STONE_200 = 'border-stone-200',\n\tBORDER_STONE_300 = 'border-stone-300',\n\tBORDER_STONE_400 = 'border-stone-400',\n\tBORDER_STONE_500 = 'border-stone-500',\n\tBORDER_STONE_600 = 'border-stone-600',\n\tBORDER_STONE_700 = 'border-stone-700',\n\tBORDER_STONE_800 = 'border-stone-800',\n\tBORDER_STONE_900 = 'border-stone-900',\n\tBORDER_RED_50 = 'border-red-50',\n\tBORDER_RED_100 = 'border-red-100',\n\tBORDER_RED_200 = 'border-red-200',\n\tBORDER_RED_300 = 'border-red-300',\n\tBORDER_RED_400 = 'border-red-400',\n\tBORDER_RED_500 = 'border-red-500',\n\tBORDER_RED_600 = 'border-red-600',\n\tBORDER_RED_700 = 'border-red-700',\n\tBORDER_RED_800 = 'border-red-800',\n\tBORDER_RED_900 = 'border-red-900',\n\tBORDER_ORANGE_50 = 'border-orange-50',\n\tBORDER_ORANGE_100 = 'border-orange-100',\n\tBORDER_ORANGE_200 = 'border-orange-200',\n\tBORDER_ORANGE_300 = 'border-orange-300',\n\tBORDER_ORANGE_400 = 'border-orange-400',\n\tBORDER_ORANGE_500 = 'border-orange-500',\n\tBORDER_ORANGE_600 = 'border-orange-600',\n\tBORDER_ORANGE_700 = 'border-orange-700',\n\tBORDER_ORANGE_800 = 'border-orange-800',\n\tBORDER_ORANGE_900 = 'border-orange-900',\n\tBORDER_AMBER_50 = 'border-amber-50',\n\tBORDER_AMBER_100 = 'border-amber-100',\n\tBORDER_AMBER_200 = 'border-amber-200',\n\tBORDER_AMBER_300 = 'border-amber-300',\n\tBORDER_AMBER_400 = 'border-amber-400',\n\tBORDER_AMBER_500 = 'border-amber-500',\n\tBORDER_AMBER_600 = 'border-amber-600',\n\tBORDER_AMBER_700 = 'border-amber-700',\n\tBORDER_AMBER_800 = 'border-amber-800',\n\tBORDER_AMBER_900 = 'border-amber-900',\n\tBORDER_YELLOW_50 = 'border-yellow-50',\n\tBORDER_YELLOW_100 = 'border-yellow-100',\n\tBORDER_YELLOW_200 = 'border-yellow-200',\n\tBORDER_YELLOW_300 = 'border-yellow-300',\n\tBORDER_YELLOW_400 = 'border-yellow-400',\n\tBORDER_YELLOW_500 = 'border-yellow-500',\n\tBORDER_YELLOW_600 = 'border-yellow-600',\n\tBORDER_YELLOW_700 = 'border-yellow-700',\n\tBORDER_YELLOW_800 = 'border-yellow-800',\n\tBORDER_YELLOW_900 = 'border-yellow-900',\n\tBORDER_LIME_50 = 'border-lime-50',\n\tBORDER_LIME_100 = 'border-lime-100',\n\tBORDER_LIME_200 = 'border-lime-200',\n\tBORDER_LIME_300 = 'border-lime-300',\n\tBORDER_LIME_400 = 'border-lime-400',\n\tBORDER_LIME_500 = 'border-lime-500',\n\tBORDER_LIME_600 = 'border-lime-600',\n\tBORDER_LIME_700 = 'border-lime-700',\n\tBORDER_LIME_800 = 'border-lime-800',\n\tBORDER_LIME_900 = 'border-lime-900',\n\tBORDER_GREEN_50 = 'border-green-50',\n\tBORDER_GREEN_100 = 'border-green-100',\n\tBORDER_GREEN_200 = 'border-green-200',\n\tBORDER_GREEN_300 = 'border-green-300',\n\tBORDER_GREEN_400 = 'border-green-400',\n\tBORDER_GREEN_500 = 'border-green-500',\n\tBORDER_GREEN_600 = 'border-green-600',\n\tBORDER_GREEN_700 = 'border-green-700',\n\tBORDER_GREEN_800 = 'border-green-800',\n\tBORDER_GREEN_900 = 'border-green-900',\n\tBORDER_EMERALD_50 = 'border-emerald-50',\n\tBORDER_EMERALD_100 = 'border-emerald-100',\n\tBORDER_EMERALD_200 = 'border-emerald-200',\n\tBORDER_EMERALD_300 = 'border-emerald-300',\n\tBORDER_EMERALD_400 = 'border-emerald-400',\n\tBORDER_EMERALD_500 = 'border-emerald-500',\n\tBORDER_EMERALD_600 = 'border-emerald-600',\n\tBORDER_EMERALD_700 = 'border-emerald-700',\n\tBORDER_EMERALD_800 = 'border-emerald-800',\n\tBORDER_EMERALD_900 = 'border-emerald-900',\n\tBORDER_TEAL_50 = 'border-teal-50',\n\tBORDER_TEAL_100 = 'border-teal-100',\n\tBORDER_TEAL_200 = 'border-teal-200',\n\tBORDER_TEAL_300 = 'border-teal-300',\n\tBORDER_TEAL_400 = 'border-teal-400',\n\tBORDER_TEAL_500 = 'border-teal-500',\n\tBORDER_TEAL_600 = 'border-teal-600',\n\tBORDER_TEAL_700 = 'border-teal-700',\n\tBORDER_TEAL_800 = 'border-teal-800',\n\tBORDER_TEAL_900 = 'border-teal-900',\n\tBORDER_CYAN_50 = 'border-cyan-50',\n\tBORDER_CYAN_100 = 'border-cyan-100',\n\tBORDER_CYAN_200 = 'border-cyan-200',\n\tBORDER_CYAN_300 = 'border-cyan-300',\n\tBORDER_CYAN_400 = 'border-cyan-400',\n\tBORDER_CYAN_500 = 'border-cyan-500',\n\tBORDER_CYAN_600 = 'border-cyan-600',\n\tBORDER_CYAN_700 = 'border-cyan-700',\n\tBORDER_CYAN_800 = 'border-cyan-800',\n\tBORDER_CYAN_900 = 'border-cyan-900',\n\tBORDER_SKY_50 = 'border-sky-50',\n\tBORDER_SKY_100 = 'border-sky-100',\n\tBORDER_SKY_200 = 'border-sky-200',\n\tBORDER_SKY_300 = 'border-sky-300',\n\tBORDER_SKY_400 = 'border-sky-400',\n\tBORDER_SKY_500 = 'border-sky-500',\n\tBORDER_SKY_600 = 'border-sky-600',\n\tBORDER_SKY_700 = 'border-sky-700',\n\tBORDER_SKY_800 = 'border-sky-800',\n\tBORDER_SKY_900 = 'border-sky-900',\n\tBORDER_BLUE_50 = 'border-blue-50',\n\tBORDER_BLUE_100 = 'border-blue-100',\n\tBORDER_BLUE_200 = 'border-blue-200',\n\tBORDER_BLUE_300 = 'border-blue-300',\n\tBORDER_BLUE_400 = 'border-blue-400',\n\tBORDER_BLUE_500 = 'border-blue-500',\n\tBORDER_BLUE_600 = 'border-blue-600',\n\tBORDER_BLUE_700 = 'border-blue-700',\n\tBORDER_BLUE_800 = 'border-blue-800',\n\tBORDER_BLUE_900 = 'border-blue-900',\n\tBORDER_INDIGO_50 = 'border-indigo-50',\n\tBORDER_INDIGO_100 = 'border-indigo-100',\n\tBORDER_INDIGO_200 = 'border-indigo-200',\n\tBORDER_INDIGO_300 = 'border-indigo-300',\n\tBORDER_INDIGO_400 = 'border-indigo-400',\n\tBORDER_INDIGO_500 = 'border-indigo-500',\n\tBORDER_INDIGO_600 = 'border-indigo-600',\n\tBORDER_INDIGO_700 = 'border-indigo-700',\n\tBORDER_INDIGO_800 = 'border-indigo-800',\n\tBORDER_INDIGO_900 = 'border-indigo-900',\n\tBORDER_VIOLET_50 = 'border-violet-50',\n\tBORDER_VIOLET_100 = 'border-violet-100',\n\tBORDER_VIOLET_200 = 'border-violet-200',\n\tBORDER_VIOLET_300 = 'border-violet-300',\n\tBORDER_VIOLET_400 = 'border-violet-400',\n\tBORDER_VIOLET_500 = 'border-violet-500',\n\tBORDER_VIOLET_600 = 'border-violet-600',\n\tBORDER_VIOLET_700 = 'border-violet-700',\n\tBORDER_VIOLET_800 = 'border-violet-800',\n\tBORDER_VIOLET_900 = 'border-violet-900',\n\tBORDER_PURPLE_50 = 'border-purple-50',\n\tBORDER_PURPLE_100 = 'border-purple-100',\n\tBORDER_PURPLE_200 = 'border-purple-200',\n\tBORDER_PURPLE_300 = 'border-purple-300',\n\tBORDER_PURPLE_400 = 'border-purple-400',\n\tBORDER_PURPLE_500 = 'border-purple-500',\n\tBORDER_PURPLE_600 = 'border-purple-600',\n\tBORDER_PURPLE_700 = 'border-purple-700',\n\tBORDER_PURPLE_800 = 'border-purple-800',\n\tBORDER_PURPLE_900 = 'border-purple-900',\n\tBORDER_FUCHSIA_50 = 'border-fuchsia-50',\n\tBORDER_FUCHSIA_100 = 'border-fuchsia-100',\n\tBORDER_FUCHSIA_200 = 'border-fuchsia-200',\n\tBORDER_FUCHSIA_300 = 'border-fuchsia-300',\n\tBORDER_FUCHSIA_400 = 'border-fuchsia-400',\n\tBORDER_FUCHSIA_500 = 'border-fuchsia-500',\n\tBORDER_FUCHSIA_600 = 'border-fuchsia-600',\n\tBORDER_FUCHSIA_700 = 'border-fuchsia-700',\n\tBORDER_FUCHSIA_800 = 'border-fuchsia-800',\n\tBORDER_FUCHSIA_900 = 'border-fuchsia-900',\n\tBORDER_PINK_50 = 'border-pink-50',\n\tBORDER_PINK_100 = 'border-pink-100',\n\tBORDER_PINK_200 = 'border-pink-200',\n\tBORDER_PINK_300 = 'border-pink-300',\n\tBORDER_PINK_400 = 'border-pink-400',\n\tBORDER_PINK_500 = 'border-pink-500',\n\tBORDER_PINK_600 = 'border-pink-600',\n\tBORDER_PINK_700 = 'border-pink-700',\n\tBORDER_PINK_800 = 'border-pink-800',\n\tBORDER_PINK_900 = 'border-pink-900',\n\tBORDER_ROSE_50 = 'border-rose-50',\n\tBORDER_ROSE_100 = 'border-rose-100',\n\tBORDER_ROSE_200 = 'border-rose-200',\n\tBORDER_ROSE_300 = 'border-rose-300',\n\tBORDER_ROSE_400 = 'border-rose-400',\n\tBORDER_ROSE_500 = 'border-rose-500',\n\tBORDER_ROSE_600 = 'border-rose-600',\n\tBORDER_ROSE_700 = 'border-rose-700',\n\tBORDER_ROSE_800 = 'border-rose-800',\n\tBORDER_ROSE_900 = 'border-rose-900',\n\t//\n\tSTROKE_SLATE_50 = 'stroke-slate-50',\n\tSTROKE_SLATE_100 = 'stroke-slate-100',\n\tSTROKE_SLATE_200 = 'stroke-slate-200',\n\tSTROKE_SLATE_300 = 'stroke-slate-300',\n\tSTROKE_SLATE_400 = 'stroke-slate-400',\n\tSTROKE_SLATE_500 = 'stroke-slate-500',\n\tSTROKE_SLATE_600 = 'stroke-slate-600',\n\tSTROKE_SLATE_700 = 'stroke-slate-700',\n\tSTROKE_SLATE_800 = 'stroke-slate-800',\n\tSTROKE_SLATE_900 = 'stroke-slate-900',\n\tSTROKE_GRAY_50 = 'stroke-gray-50',\n\tSTROKE_GRAY_100 = 'stroke-gray-100',\n\tSTROKE_GRAY_200 = 'stroke-gray-200',\n\tSTROKE_GRAY_300 = 'stroke-gray-300',\n\tSTROKE_GRAY_400 = 'stroke-gray-400',\n\tSTROKE_GRAY_500 = 'stroke-gray-500',\n\tSTROKE_GRAY_600 = 'stroke-gray-600',\n\tSTROKE_GRAY_700 = 'stroke-gray-700',\n\tSTROKE_GRAY_800 = 'stroke-gray-800',\n\tSTROKE_GRAY_900 = 'stroke-gray-900',\n\tSTROKE_ZINC_50 = 'stroke-zinc-50',\n\tSTROKE_ZINC_100 = 'stroke-zinc-100',\n\tSTROKE_ZINC_200 = 'stroke-zinc-200',\n\tSTROKE_ZINC_300 = 'stroke-zinc-300',\n\tSTROKE_ZINC_400 = 'stroke-zinc-400',\n\tSTROKE_ZINC_500 = 'stroke-zinc-500',\n\tSTROKE_ZINC_600 = 'stroke-zinc-600',\n\tSTROKE_ZINC_700 = 'stroke-zinc-700',\n\tSTROKE_ZINC_800 = 'stroke-zinc-800',\n\tSTROKE_ZINC_900 = 'stroke-zinc-900',\n\tSTROKE_NEUTRAL_50 = 'stroke-neutral-50',\n\tSTROKE_NEUTRAL_100 = 'stroke-neutral-100',\n\tSTROKE_NEUTRAL_200 = 'stroke-neutral-200',\n\tSTROKE_NEUTRAL_300 = 'stroke-neutral-300',\n\tSTROKE_NEUTRAL_400 = 'stroke-neutral-400',\n\tSTROKE_NEUTRAL_500 = 'stroke-neutral-500',\n\tSTROKE_NEUTRAL_600 = 'stroke-neutral-600',\n\tSTROKE_NEUTRAL_700 = 'stroke-neutral-700',\n\tSTROKE_NEUTRAL_800 = 'stroke-neutral-800',\n\tSTROKE_NEUTRAL_900 = 'stroke-neutral-900',\n\tSTROKE_STONE_50 = 'stroke-stone-50',\n\tSTROKE_STONE_100 = 'stroke-stone-100',\n\tSTROKE_STONE_200 = 'stroke-stone-200',\n\tSTROKE_STONE_300 = 'stroke-stone-300',\n\tSTROKE_STONE_400 = 'stroke-stone-400',\n\tSTROKE_STONE_500 = 'stroke-stone-500',\n\tSTROKE_STONE_600 = 'stroke-stone-600',\n\tSTROKE_STONE_700 = 'stroke-stone-700',\n\tSTROKE_STONE_800 = 'stroke-stone-800',\n\tSTROKE_STONE_900 = 'stroke-stone-900',\n\tSTROKE_RED_50 = 'stroke-red-50',\n\tSTROKE_RED_100 = 'stroke-red-100',\n\tSTROKE_RED_200 = 'stroke-red-200',\n\tSTROKE_RED_300 = 'stroke-red-300',\n\tSTROKE_RED_400 = 'stroke-red-400',\n\tSTROKE_RED_500 = 'stroke-red-500',\n\tSTROKE_RED_600 = 'stroke-red-600',\n\tSTROKE_RED_700 = 'stroke-red-700',\n\tSTROKE_RED_800 = 'stroke-red-800',\n\tSTROKE_RED_900 = 'stroke-red-900',\n\tSTROKE_ORANGE_50 = 'stroke-orange-50',\n\tSTROKE_ORANGE_100 = 'stroke-orange-100',\n\tSTROKE_ORANGE_200 = 'stroke-orange-200',\n\tSTROKE_ORANGE_300 = 'stroke-orange-300',\n\tSTROKE_ORANGE_400 = 'stroke-orange-400',\n\tSTROKE_ORANGE_500 = 'stroke-orange-500',\n\tSTROKE_ORANGE_600 = 'stroke-orange-600',\n\tSTROKE_ORANGE_700 = 'stroke-orange-700',\n\tSTROKE_ORANGE_800 = 'stroke-orange-800',\n\tSTROKE_ORANGE_900 = 'stroke-orange-900',\n\tSTROKE_AMBER_50 = 'stroke-amber-50',\n\tSTROKE_AMBER_100 = 'stroke-amber-100',\n\tSTROKE_AMBER_200 = 'stroke-amber-200',\n\tSTROKE_AMBER_300 = 'stroke-amber-300',\n\tSTROKE_AMBER_400 = 'stroke-amber-400',\n\tSTROKE_AMBER_500 = 'stroke-amber-500',\n\tSTROKE_AMBER_600 = 'stroke-amber-600',\n\tSTROKE_AMBER_700 = 'stroke-amber-700',\n\tSTROKE_AMBER_800 = 'stroke-amber-800',\n\tSTROKE_AMBER_900 = 'stroke-amber-900',\n\tSTROKE_YELLOW_50 = 'stroke-yellow-50',\n\tSTROKE_YELLOW_100 = 'stroke-yellow-100',\n\tSTROKE_YELLOW_200 = 'stroke-yellow-200',\n\tSTROKE_YELLOW_300 = 'stroke-yellow-300',\n\tSTROKE_YELLOW_400 = 'stroke-yellow-400',\n\tSTROKE_YELLOW_500 = 'stroke-yellow-500',\n\tSTROKE_YELLOW_600 = 'stroke-yellow-600',\n\tSTROKE_YELLOW_700 = 'stroke-yellow-700',\n\tSTROKE_YELLOW_800 = 'stroke-yellow-800',\n\tSTROKE_YELLOW_900 = 'stroke-yellow-900',\n\tSTROKE_LIME_50 = 'stroke-lime-50',\n\tSTROKE_LIME_100 = 'stroke-lime-100',\n\tSTROKE_LIME_200 = 'stroke-lime-200',\n\tSTROKE_LIME_300 = 'stroke-lime-300',\n\tSTROKE_LIME_400 = 'stroke-lime-400',\n\tSTROKE_LIME_500 = 'stroke-lime-500',\n\tSTROKE_LIME_600 = 'stroke-lime-600',\n\tSTROKE_LIME_700 = 'stroke-lime-700',\n\tSTROKE_LIME_800 = 'stroke-lime-800',\n\tSTROKE_LIME_900 = 'stroke-lime-900',\n\tSTROKE_GREEN_50 = 'stroke-green-50',\n\tSTROKE_GREEN_100 = 'stroke-green-100',\n\tSTROKE_GREEN_200 = 'stroke-green-200',\n\tSTROKE_GREEN_300 = 'stroke-green-300',\n\tSTROKE_GREEN_400 = 'stroke-green-400',\n\tSTROKE_GREEN_500 = 'stroke-green-500',\n\tSTROKE_GREEN_600 = 'stroke-green-600',\n\tSTROKE_GREEN_700 = 'stroke-green-700',\n\tSTROKE_GREEN_800 = 'stroke-green-800',\n\tSTROKE_GREEN_900 = 'stroke-green-900',\n\tSTROKE_EMERALD_50 = 'stroke-emerald-50',\n\tSTROKE_EMERALD_100 = 'stroke-emerald-100',\n\tSTROKE_EMERALD_200 = 'stroke-emerald-200',\n\tSTROKE_EMERALD_300 = 'stroke-emerald-300',\n\tSTROKE_EMERALD_400 = 'stroke-emerald-400',\n\tSTROKE_EMERALD_500 = 'stroke-emerald-500',\n\tSTROKE_EMERALD_600 = 'stroke-emerald-600',\n\tSTROKE_EMERALD_700 = 'stroke-emerald-700',\n\tSTROKE_EMERALD_800 = 'stroke-emerald-800',\n\tSTROKE_EMERALD_900 = 'stroke-emerald-900',\n\tSTROKE_TEAL_50 = 'stroke-teal-50',\n\tSTROKE_TEAL_100 = 'stroke-teal-100',\n\tSTROKE_TEAL_200 = 'stroke-teal-200',\n\tSTROKE_TEAL_300 = 'stroke-teal-300',\n\tSTROKE_TEAL_400 = 'stroke-teal-400',\n\tSTROKE_TEAL_500 = 'stroke-teal-500',\n\tSTROKE_TEAL_600 = 'stroke-teal-600',\n\tSTROKE_TEAL_700 = 'stroke-teal-700',\n\tSTROKE_TEAL_800 = 'stroke-teal-800',\n\tSTROKE_TEAL_900 = 'stroke-teal-900',\n\tSTROKE_CYAN_50 = 'stroke-cyan-50',\n\tSTROKE_CYAN_100 = 'stroke-cyan-100',\n\tSTROKE_CYAN_200 = 'stroke-cyan-200',\n\tSTROKE_CYAN_300 = 'stroke-cyan-300',\n\tSTROKE_CYAN_400 = 'stroke-cyan-400',\n\tSTROKE_CYAN_500 = 'stroke-cyan-500',\n\tSTROKE_CYAN_600 = 'stroke-cyan-600',\n\tSTROKE_CYAN_700 = 'stroke-cyan-700',\n\tSTROKE_CYAN_800 = 'stroke-cyan-800',\n\tSTROKE_CYAN_900 = 'stroke-cyan-900',\n\tSTROKE_SKY_50 = 'stroke-sky-50',\n\tSTROKE_SKY_100 = 'stroke-sky-100',\n\tSTROKE_SKY_200 = 'stroke-sky-200',\n\tSTROKE_SKY_300 = 'stroke-sky-300',\n\tSTROKE_SKY_400 = 'stroke-sky-400',\n\tSTROKE_SKY_500 = 'stroke-sky-500',\n\tSTROKE_SKY_600 = 'stroke-sky-600',\n\tSTROKE_SKY_700 = 'stroke-sky-700',\n\tSTROKE_SKY_800 = 'stroke-sky-800',\n\tSTROKE_SKY_900 = 'stroke-sky-900',\n\tSTROKE_BLUE_50 = 'stroke-blue-50',\n\tSTROKE_BLUE_100 = 'stroke-blue-100',\n\tSTROKE_BLUE_200 = 'stroke-blue-200',\n\tSTROKE_BLUE_300 = 'stroke-blue-300',\n\tSTROKE_BLUE_400 = 'stroke-blue-400',\n\tSTROKE_BLUE_500 = 'stroke-blue-500',\n\tSTROKE_BLUE_600 = 'stroke-blue-600',\n\tSTROKE_BLUE_700 = 'stroke-blue-700',\n\tSTROKE_BLUE_800 = 'stroke-blue-800',\n\tSTROKE_BLUE_900 = 'stroke-blue-900',\n\tSTROKE_INDIGO_50 = 'stroke-indigo-50',\n\tSTROKE_INDIGO_100 = 'stroke-indigo-100',\n\tSTROKE_INDIGO_200 = 'stroke-indigo-200',\n\tSTROKE_INDIGO_300 = 'stroke-indigo-300',\n\tSTROKE_INDIGO_400 = 'stroke-indigo-400',\n\tSTROKE_INDIGO_500 = 'stroke-indigo-500',\n\tSTROKE_INDIGO_600 = 'stroke-indigo-600',\n\tSTROKE_INDIGO_700 = 'stroke-indigo-700',\n\tSTROKE_INDIGO_800 = 'stroke-indigo-800',\n\tSTROKE_INDIGO_900 = 'stroke-indigo-900',\n\tSTROKE_VIOLET_50 = 'stroke-violet-50',\n\tSTROKE_VIOLET_100 = 'stroke-violet-100',\n\tSTROKE_VIOLET_200 = 'stroke-violet-200',\n\tSTROKE_VIOLET_300 = 'stroke-violet-300',\n\tSTROKE_VIOLET_400 = 'stroke-violet-400',\n\tSTROKE_VIOLET_500 = 'stroke-violet-500',\n\tSTROKE_VIOLET_600 = 'stroke-violet-600',\n\tSTROKE_VIOLET_700 = 'stroke-violet-700',\n\tSTROKE_VIOLET_800 = 'stroke-violet-800',\n\tSTROKE_VIOLET_900 = 'stroke-violet-900',\n\tSTROKE_PURPLE_50 = 'stroke-purple-50',\n\tSTROKE_PURPLE_100 = 'stroke-purple-100',\n\tSTROKE_PURPLE_200 = 'stroke-purple-200',\n\tSTROKE_PURPLE_300 = 'stroke-purple-300',\n\tSTROKE_PURPLE_400 = 'stroke-purple-400',\n\tSTROKE_PURPLE_500 = 'stroke-purple-500',\n\tSTROKE_PURPLE_600 = 'stroke-purple-600',\n\tSTROKE_PURPLE_700 = 'stroke-purple-700',\n\tSTROKE_PURPLE_800 = 'stroke-purple-800',\n\tSTROKE_PURPLE_900 = 'stroke-purple-900',\n\tSTROKE_FUCHSIA_50 = 'stroke-fuchsia-50',\n\tSTROKE_FUCHSIA_100 = 'stroke-fuchsia-100',\n\tSTROKE_FUCHSIA_200 = 'stroke-fuchsia-200',\n\tSTROKE_FUCHSIA_300 = 'stroke-fuchsia-300',\n\tSTROKE_FUCHSIA_400 = 'stroke-fuchsia-400',\n\tSTROKE_FUCHSIA_500 = 'stroke-fuchsia-500',\n\tSTROKE_FUCHSIA_600 = 'stroke-fuchsia-600',\n\tSTROKE_FUCHSIA_700 = 'stroke-fuchsia-700',\n\tSTROKE_FUCHSIA_800 = 'stroke-fuchsia-800',\n\tSTROKE_FUCHSIA_900 = 'stroke-fuchsia-900',\n\tSTROKE_PINK_50 = 'stroke-pink-50',\n\tSTROKE_PINK_100 = 'stroke-pink-100',\n\tSTROKE_PINK_200 = 'stroke-pink-200',\n\tSTROKE_PINK_300 = 'stroke-pink-300',\n\tSTROKE_PINK_400 = 'stroke-pink-400',\n\tSTROKE_PINK_500 = 'stroke-pink-500',\n\tSTROKE_PINK_600 = 'stroke-pink-600',\n\tSTROKE_PINK_700 = 'stroke-pink-700',\n\tSTROKE_PINK_800 = 'stroke-pink-800',\n\tSTROKE_PINK_900 = 'stroke-pink-900',\n\tSTROKE_ROSE_50 = 'stroke-rose-50',\n\tSTROKE_ROSE_100 = 'stroke-rose-100',\n\tSTROKE_ROSE_200 = 'stroke-rose-200',\n\tSTROKE_ROSE_300 = 'stroke-rose-300',\n\tSTROKE_ROSE_400 = 'stroke-rose-400',\n\tSTROKE_ROSE_500 = 'stroke-rose-500',\n\tSTROKE_ROSE_600 = 'stroke-rose-600',\n\tSTROKE_ROSE_700 = 'stroke-rose-700',\n\tSTROKE_ROSE_800 = 'stroke-rose-800',\n\tSTROKE_ROSE_900 = 'stroke-rose-900',\n}\n\n// from https://github.com/tailwindlabs/tailwindcss/blob/master/src/public/colors.js\n// (copied and adapted)\n\ntype TailwindValue = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950;\nexport const HEX_BY_TAILWIND_COLOR: Record<TailwindColor, Record<TailwindValue, string>> = {\n\t// inherit: 'inherit',\n\t// current: 'currentColor',\n\t// transparent: 'transparent',\n\t// black: '#000',\n\t// [TailwindColor.WHITE]: '#fff',\n\t[TailwindColor.SLATE]: {\n\t\t50: '#f8fafc',\n\t\t100: '#f1f5f9',\n\t\t200: '#e2e8f0',\n\t\t300: '#cbd5e1',\n\t\t400: '#94a3b8',\n\t\t500: '#64748b',\n\t\t600: '#475569',\n\t\t700: '#334155',\n\t\t800: '#1e293b',\n\t\t900: '#0f172a',\n\t\t950: '#020617',\n\t},\n\t[TailwindColor.GRAY]: {\n\t\t50: '#f9fafb',\n\t\t100: '#f3f4f6',\n\t\t200: '#e5e7eb',\n\t\t300: '#d1d5db',\n\t\t400: '#9ca3af',\n\t\t500: '#6b7280',\n\t\t600: '#4b5563',\n\t\t700: '#374151',\n\t\t800: '#1f2937',\n\t\t900: '#111827',\n\t\t950: '#030712',\n\t},\n\t[TailwindColor.ZINC]: {\n\t\t50: '#fafafa',\n\t\t100: '#f4f4f5',\n\t\t200: '#e4e4e7',\n\t\t300: '#d4d4d8',\n\t\t400: '#a1a1aa',\n\t\t500: '#71717a',\n\t\t600: '#52525b',\n\t\t700: '#3f3f46',\n\t\t800: '#27272a',\n\t\t900: '#18181b',\n\t\t950: '#09090b',\n\t},\n\t[TailwindColor.NEUTRAL]: {\n\t\t50: '#fafafa',\n\t\t100: '#f5f5f5',\n\t\t200: '#e5e5e5',\n\t\t300: '#d4d4d4',\n\t\t400: '#a3a3a3',\n\t\t500: '#737373',\n\t\t600: '#525252',\n\t\t700: '#404040',\n\t\t800: '#262626',\n\t\t900: '#171717',\n\t\t950: '#0a0a0a',\n\t},\n\t[TailwindColor.STONE]: {\n\t\t50: '#fafaf9',\n\t\t100: '#f5f5f4',\n\t\t200: '#e7e5e4',\n\t\t300: '#d6d3d1',\n\t\t400: '#a8a29e',\n\t\t500: '#78716c',\n\t\t600: '#57534e',\n\t\t700: '#44403c',\n\t\t800: '#292524',\n\t\t900: '#1c1917',\n\t\t950: '#0c0a09',\n\t},\n\t[TailwindColor.RED]: {\n\t\t50: '#fef2f2',\n\t\t100: '#fee2e2',\n\t\t200: '#fecaca',\n\t\t300: '#fca5a5',\n\t\t400: '#f87171',\n\t\t500: '#ef4444',\n\t\t600: '#dc2626',\n\t\t700: '#b91c1c',\n\t\t800: '#991b1b',\n\t\t900: '#7f1d1d',\n\t\t950: '#450a0a',\n\t},\n\t[TailwindColor.ORANGE]: {\n\t\t50: '#fff7ed',\n\t\t100: '#ffedd5',\n\t\t200: '#fed7aa',\n\t\t300: '#fdba74',\n\t\t400: '#fb923c',\n\t\t500: '#f97316',\n\t\t600: '#ea580c',\n\t\t700: '#c2410c',\n\t\t800: '#9a3412',\n\t\t900: '#7c2d12',\n\t\t950: '#431407',\n\t},\n\t[TailwindColor.AMBER]: {\n\t\t50: '#fffbeb',\n\t\t100: '#fef3c7',\n\t\t200: '#fde68a',\n\t\t300: '#fcd34d',\n\t\t400: '#fbbf24',\n\t\t500: '#f59e0b',\n\t\t600: '#d97706',\n\t\t700: '#b45309',\n\t\t800: '#92400e',\n\t\t900: '#78350f',\n\t\t950: '#451a03',\n\t},\n\t[TailwindColor.YELLOW]: {\n\t\t50: '#fefce8',\n\t\t100: '#fef9c3',\n\t\t200: '#fef08a',\n\t\t300: '#fde047',\n\t\t400: '#facc15',\n\t\t500: '#eab308',\n\t\t600: '#ca8a04',\n\t\t700: '#a16207',\n\t\t800: '#854d0e',\n\t\t900: '#713f12',\n\t\t950: '#422006',\n\t},\n\t[TailwindColor.LIME]: {\n\t\t50: '#f7fee7',\n\t\t100: '#ecfccb',\n\t\t200: '#d9f99d',\n\t\t300: '#bef264',\n\t\t400: '#a3e635',\n\t\t500: '#84cc16',\n\t\t600: '#65a30d',\n\t\t700: '#4d7c0f',\n\t\t800: '#3f6212',\n\t\t900: '#365314',\n\t\t950: '#1a2e05',\n\t},\n\t[TailwindColor.GREEN]: {\n\t\t50: '#f0fdf4',\n\t\t100: '#dcfce7',\n\t\t200: '#bbf7d0',\n\t\t300: '#86efac',\n\t\t400: '#4ade80',\n\t\t500: '#22c55e',\n\t\t600: '#16a34a',\n\t\t700: '#15803d',\n\t\t800: '#166534',\n\t\t900: '#14532d',\n\t\t950: '#052e16',\n\t},\n\t[TailwindColor.EMERALD]: {\n\t\t50: '#ecfdf5',\n\t\t100: '#d1fae5',\n\t\t200: '#a7f3d0',\n\t\t300: '#6ee7b7',\n\t\t400: '#34d399',\n\t\t500: '#10b981',\n\t\t600: '#059669',\n\t\t700: '#047857',\n\t\t800: '#065f46',\n\t\t900: '#064e3b',\n\t\t950: '#022c22',\n\t},\n\t[TailwindColor.TEAL]: {\n\t\t50: '#f0fdfa',\n\t\t100: '#ccfbf1',\n\t\t200: '#99f6e4',\n\t\t300: '#5eead4',\n\t\t400: '#2dd4bf',\n\t\t500: '#14b8a6',\n\t\t600: '#0d9488',\n\t\t700: '#0f766e',\n\t\t800: '#115e59',\n\t\t900: '#134e4a',\n\t\t950: '#042f2e',\n\t},\n\t[TailwindColor.CYAN]: {\n\t\t50: '#ecfeff',\n\t\t100: '#cffafe',\n\t\t200: '#a5f3fc',\n\t\t300: '#67e8f9',\n\t\t400: '#22d3ee',\n\t\t500: '#06b6d4',\n\t\t600: '#0891b2',\n\t\t700: '#0e7490',\n\t\t800: '#155e75',\n\t\t900: '#164e63',\n\t\t950: '#083344',\n\t},\n\t[TailwindColor.SKY]: {\n\t\t50: '#f0f9ff',\n\t\t100: '#e0f2fe',\n\t\t200: '#bae6fd',\n\t\t300: '#7dd3fc',\n\t\t400: '#38bdf8',\n\t\t500: '#0ea5e9',\n\t\t600: '#0284c7',\n\t\t700: '#0369a1',\n\t\t800: '#075985',\n\t\t900: '#0c4a6e',\n\t\t950: '#082f49',\n\t},\n\t[TailwindColor.BLUE]: {\n\t\t50: '#eff6ff',\n\t\t100: '#dbeafe',\n\t\t200: '#bfdbfe',\n\t\t300: '#93c5fd',\n\t\t400: '#60a5fa',\n\t\t500: '#3b82f6',\n\t\t600: '#2563eb',\n\t\t700: '#1d4ed8',\n\t\t800: '#1e40af',\n\t\t900: '#1e3a8a',\n\t\t950: '#172554',\n\t},\n\t[TailwindColor.INDIGO]: {\n\t\t50: '#eef2ff',\n\t\t100: '#e0e7ff',\n\t\t200: '#c7d2fe',\n\t\t300: '#a5b4fc',\n\t\t400: '#818cf8',\n\t\t500: '#6366f1',\n\t\t600: '#4f46e5',\n\t\t700: '#4338ca',\n\t\t800: '#3730a3',\n\t\t900: '#312e81',\n\t\t950: '#1e1b4b',\n\t},\n\t[TailwindColor.VIOLET]: {\n\t\t50: '#f5f3ff',\n\t\t100: '#ede9fe',\n\t\t200: '#ddd6fe',\n\t\t300: '#c4b5fd',\n\t\t400: '#a78bfa',\n\t\t500: '#8b5cf6',\n\t\t600: '#7c3aed',\n\t\t700: '#6d28d9',\n\t\t800: '#5b21b6',\n\t\t900: '#4c1d95',\n\t\t950: '#2e1065',\n\t},\n\t[TailwindColor.PURPLE]: {\n\t\t50: '#faf5ff',\n\t\t100: '#f3e8ff',\n\t\t200: '#e9d5ff',\n\t\t300: '#d8b4fe',\n\t\t400: '#c084fc',\n\t\t500: '#a855f7',\n\t\t600: '#9333ea',\n\t\t700: '#7e22ce',\n\t\t800: '#6b21a8',\n\t\t900: '#581c87',\n\t\t950: '#3b0764',\n\t},\n\t[TailwindColor.FUCHSIA]: {\n\t\t50: '#fdf4ff',\n\t\t100: '#fae8ff',\n\t\t200: '#f5d0fe',\n\t\t300: '#f0abfc',\n\t\t400: '#e879f9',\n\t\t500: '#d946ef',\n\t\t600: '#c026d3',\n\t\t700: '#a21caf',\n\t\t800: '#86198f',\n\t\t900: '#701a75',\n\t\t950: '#4a044e',\n\t},\n\t[TailwindColor.PINK]: {\n\t\t50: '#fdf2f8',\n\t\t100: '#fce7f3',\n\t\t200: '#fbcfe8',\n\t\t300: '#f9a8d4',\n\t\t400: '#f472b6',\n\t\t500: '#ec4899',\n\t\t600: '#db2777',\n\t\t700: '#be185d',\n\t\t800: '#9d174d',\n\t\t900: '#831843',\n\t\t950: '#500724',\n\t},\n\t[TailwindColor.ROSE]: {\n\t\t50: '#fff1f2',\n\t\t100: '#ffe4e6',\n\t\t200: '#fecdd3',\n\t\t300: '#fda4af',\n\t\t400: '#fb7185',\n\t\t500: '#f43f5e',\n\t\t600: '#e11d48',\n\t\t700: '#be123c',\n\t\t800: '#9f1239',\n\t\t900: '#881337',\n\t\t950: '#4c0519',\n\t},\n};\n","import {CoreUserAgent} from './../../../@polygonjs/polygonjs/src/core/UserAgent';\nexport class EditorUserAgent extends CoreUserAgent {\n\tstatic isTouchOrMobile() {\n\t\treturn CoreUserAgent.isTouchDevice() || CoreUserAgent.isMobile();\n\t}\n}\n","import {isBooleanTrue} from '../../../@polygonjs/polygonjs/src/core/Type';\nimport {Editor} from '../Editor';\n// import {HistoryStack} from '../history/Stack';\nimport {StoreController} from '../store/controllers/StoreController';\n\ndeclare global {\n\tinterface Window {\n\t\tskipOnWindowReloadPrompt: boolean | undefined;\n\t}\n}\nexport class WindowController {\n\tprivate static _instance: WindowController;\n\tprivate _eventCreated = false;\n\tprivate _uploadsInProgressCount: number = 0;\n\tprivate _sceneSavingInProgress: boolean = false;\n\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new WindowController());\n\t}\n\tconstructor() {}\n\tinitEvent() {\n\t\tif (this._eventCreated) {\n\t\t\treturn;\n\t\t}\n\t\tthis._eventCreated = true;\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload\n\t\twindow.addEventListener('beforeunload', (event) => {\n\t\t\tthis.onbeforeunload(event);\n\t\t});\n\t}\n\n\tincrementUploadsInProgress() {\n\t\tthis._uploadsInProgressCount += 1;\n\t}\n\tdecrementUploadsInProgress() {\n\t\tthis._uploadsInProgressCount -= 1;\n\t}\n\tmarkSceneSavingInProgress() {\n\t\tthis._sceneSavingInProgress = true;\n\t}\n\tmarkSceneSavingCompleted() {\n\t\tthis._sceneSavingInProgress = false;\n\t}\n\tsceneSavingInProgress() {\n\t\treturn this._sceneSavingInProgress;\n\t}\n\tprivate _uploadsInProgress() {\n\t\treturn this._uploadsInProgressCount > 0;\n\t}\n\tprivate _sceneModified(): boolean {\n\t\treturn Editor.instance().historyStack()?.sceneModified() || false;\n\t}\n\tskipPrompt() {\n\t\twindow.skipOnWindowReloadPrompt = true;\n\t}\n\tpromptRequired() {\n\t\tif (window.skipOnWindowReloadPrompt == true) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (\n\t\t\tthis._uploadsInProgress() ||\n\t\t\t(this._sceneModified() && !StoreController.editor.readonly.readonly()) ||\n\t\t\tisBooleanTrue(this._sceneSavingInProgress)\n\t\t);\n\t}\n\tprivate onbeforeunload(event: BeforeUnloadEvent) {\n\t\t// If we are on the desktop, it's better to have the desktop app handle this event.\n\t\t// If it was handled here, this would attempt to create an alert popup,\n\t\t// but such popup does not work on electron, so it appears as if nothing happens,\n\t\t// and to the user it simply looks like the app refuses to close.\n\t\t// if (DesktopController.instance().active()) {\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (this.promptRequired()) {\n\t\t\tevent.preventDefault(); // If you prevent default behavior in Mozilla Firefox prompt will always be shown\n\t\t\t// Chrome requires returnValue to be set\n\t\t\tevent.returnValue = '';\n\t\t}\n\t}\n}\n","import {PolyScene} from './../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {NodeChangeType} from './NodeChangeType';\nimport {SafeNodeRemover} from './SafeNodeRemover';\nimport {PolyNode} from './../../npm_module/NpmModuleTypes';\nimport {PolyNodeDataRegister} from '../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDataRegister';\nimport {NodeContext} from '../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {BaseNodeType} from '../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodesCodeExporter} from '../../engine/io/code/export/Nodes';\nimport {CoreClipboard} from './clipboard/CoreClipboard';\nimport {PolyNodeController} from '../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {FeaturesController} from './FeaturesController';\n\nexport interface PolyNodeCRUDServerResponse {\n\terror?: string;\n}\nexport interface PolyNodeDownloadOptions {\n\tnode_context: string;\n\tnode_type: string;\n\tversion: number;\n\t// \t// fromOtherUser: false,\n\tusername: string;\n}\nexport abstract class BasePolyNodeSaveController {\n\tconstructor() {}\n\n\tstatic readonly DEBUG_LEVEL = FeaturesController.polyNodeDebugLevel();\n\n\tstatic changeType(oldNode: BaseNodeType, newType: string) {\n\t\tconst parentNode = oldNode.parent();\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parent on oldNode, cancelling changeType', oldNode.name(), oldNode.graphNodeId());\n\t\t\treturn;\n\t\t}\n\t\tconst scene = parentNode.scene();\n\t\tscene.cooker.block();\n\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 4) {\n\t\t\tconsole.log('changeType START', oldNode.path(), newType);\n\t\t}\n\t\tconst isNodeSelected = parentNode.childrenController?.selection.contains(oldNode);\n\t\tconst prevLockedState = oldNode.polyNodeController?.locked() || false;\n\n\t\t// generate instructions to copy node, while making sure not to generate the children\n\t\tconst exporter = new NodesCodeExporter([oldNode], {ignoreGrandChildren: true, replaceTypeWith: newType});\n\t\tconst lines: string[] = exporter.process_with_existing_nodes(parentNode, CoreClipboard.PARENT_NODE_VAR_NAME);\n\t\tlet code = lines.join('\\n');\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 6) {\n\t\t\tconsole.log(code);\n\t\t}\n\t\t// save the outputs\n\t\tconst nodeChangeType = new NodeChangeType(oldNode);\n\t\tconst outputConnectionData = nodeChangeType.outputConnectionData();\n\n\t\t// remove type of current node if it is not a polyNode already\n\t\t// otherwise when running the code again it will simply create another subnet\n\t\t// if (!node.polyNodeController) {\n\t\t// \t// TODO: this should ideally be done inside the code exporter\n\t\t// \tconst lineToReplace = `${node.name()} = parentNode.createNode('${node.type()}')`;\n\t\t// \tconst lineUpdated = `${node.name()} = parentNode.createNode('${newType}')`;\n\t\t// \tconsole.log(lineToReplace);\n\t\t// \tconsole.log(lineUpdated);\n\t\t// \tcode = code.replace(lineToReplace, lineUpdated);\n\t\t// }\n\n\t\t// delete\n\t\tparentNode.childrenController?.selection.remove([oldNode]);\n\t\tSafeNodeRemover.removeNodes(parentNode, [oldNode]);\n\n\t\t//\n\n\t\t// paste\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log('CoreClipboard.run START');\n\t\t}\n\t\tCoreClipboard.run(parentNode, code);\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log('CoreClipboard.run DONE');\n\t\t}\n\t\tconst newNode = parentNode.node(oldNode.name());\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log(oldNode.name(), newNode);\n\t\t}\n\t\tif (isNodeSelected) {\n\t\t\tif (newNode) {\n\t\t\t\tparentNode.childrenController?.selection.add([newNode]);\n\t\t\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'node added to selection',\n\t\t\t\t\t\tparentNode.childrenController?.selection.contains(newNode),\n\t\t\t\t\t\tparentNode.childrenController?.selection.nodeIds()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// restore output connections\n\t\tif (newNode) {\n\t\t\tnodeChangeType.restoreOutputConnections(outputConnectionData, newNode);\n\t\t\tnewNode.polyNodeController?.setLockedState(prevLockedState);\n\t\t}\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log(\n\t\t\t\t'changeType COMPLETED',\n\t\t\t\tnewNode,\n\t\t\t\tnewNode?.path(),\n\t\t\t\tnewNode?.graphNodeId(),\n\t\t\t\tnewNode?.polyNodeController?.locked()\n\t\t\t);\n\t\t}\n\t\tscene.cooker.unblock();\n\n\t\treturn newNode;\n\t}\n\n\tabstract readAndRegisterPolyNodes(): void;\n\tabstract create(node: BaseNodeType, polyNodeData: PolyNode.DataRegisterDummy): Promise<BaseNodeType | undefined>;\n\tabstract update(\n\t\tnode: BaseNodeType,\n\t\tpolyNodeData: PolyNode.DataRegisterDummy,\n\t\tscene: PolyScene\n\t): Promise<BaseNodeType | undefined>;\n\n\tprotected _createPolyNodeAndReplaceNode(node: BaseNodeType, polyNodeData: PolyNodeDataRegister<NodeContext>) {\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log('_createPolyNodeAndReplaceNode START', polyNodeData);\n\t\t}\n\t\tPolyNodeController.createNodeClassAndRegister(polyNodeData);\n\t\tconst {node_type} = polyNodeData;\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log(polyNodeData, node_type);\n\t\t}\n\t\tconst newNode = BasePolyNodeSaveController.changeType(node, node_type);\n\t\tnewNode?.polyNodeController?.setLockedState(false);\n\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\tconsole.log('_createPolyNodeAndReplaceNode DONE', newNode);\n\t\t}\n\t\treturn newNode;\n\t}\n\tprotected _updatePolyNodeAndReplaceNodes(\n\t\tnodeToUpdate: BaseNodeType | undefined,\n\t\tpolyNodeData: PolyNodeDataRegister<NodeContext>,\n\t\tscene: PolyScene\n\t) {\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 0) {\n\t\t\tconsole.log('_updatePolyNodeAndReplaceNodes', polyNodeData, nodeToUpdate);\n\t\t}\n\t\tPolyNodeController.createNodeClassAndRegister(polyNodeData);\n\t\tconst {node_type, node_context} = polyNodeData;\n\t\tlet newNode: BaseNodeType | undefined | null = null;\n\t\tconst nodesWithSameType = scene.nodesController.nodesByContextAndType(\n\t\t\tnode_context as any,\n\t\t\tnode_type as any\n\t\t) as BaseNodeType[];\n\t\tif (nodeToUpdate) {\n\t\t\tnewNode = BasePolyNodeSaveController.changeType(nodeToUpdate, node_type);\n\t\t\tnewNode?.polyNodeController?.setLockedState(false);\n\t\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 3) {\n\t\t\t\tconsole.log('newNode', newNode, newNode?.graphNodeId(), newNode?.path());\n\t\t\t}\n\t\t}\n\n\t\tconst filteredNodesWithSameType = nodesWithSameType.filter(\n\t\t\t(n) => n.graphNodeId() != nodeToUpdate?.graphNodeId()\n\t\t);\n\t\t// only update the nodes that are locked\n\t\tconst filteredNodesLocked = filteredNodesWithSameType.filter(\n\t\t\t(n) => n.polyNodeController && n.polyNodeController.locked()\n\t\t);\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 0) {\n\t\t\tconsole.log(\n\t\t\t\t'nodesWithSameType',\n\t\t\t\tnode_context,\n\t\t\t\tnode_type,\n\t\t\t\tnodesWithSameType,\n\t\t\t\t'filteredNodesWithSameType',\n\t\t\t\tfilteredNodesWithSameType,\n\t\t\t\tfilteredNodesWithSameType.map((n) => n.path()),\n\t\t\t\t'filteredNodesLocked',\n\t\t\t\tfilteredNodesLocked,\n\t\t\t\tfilteredNodesLocked.map((n) => n.path())\n\t\t\t);\n\t\t}\n\t\tconst convertedNodes: BaseNodeType[] = [];\n\t\tfor (let nodeWithSameType of filteredNodesLocked) {\n\t\t\tconst convertedNode = BasePolyNodeSaveController.changeType(nodeWithSameType, node_type);\n\t\t\tif (convertedNode) {\n\t\t\t\tconvertedNodes.push(convertedNode);\n\t\t\t}\n\t\t}\n\t\treturn {newNode, convertedNodes};\n\t}\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar durl = function (c) { return URL.createObjectURL(new Blob([c], { type: 'text/javascript' })); };\nvar cwk = function (u) { return new Worker(u); };\ntry {\n    URL.revokeObjectURL(durl(''));\n}\ncatch (e) {\n    // We're in Deno or a very old browser\n    durl = function (c) { return 'data:application/javascript;charset=UTF-8,' + encodeURI(c); };\n    // If Deno, this is necessary; if not, this changes nothing\n    cwk = function (u) { return new Worker(u, { type: 'module' }); };\n}\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = cwk(ch2[id] || (ch2[id] = durl(c)));\n    w.onerror = function (e) { return cb(e.error, null); };\n    w.onmessage = function (e) { return cb(null, e.data); };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new u32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i)\n        ++l[cd[i] - 1];\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 0; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >>> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) | 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n    n.set(v.subarray(s, e));\n    return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n    // source length\n    var sl = dat.length;\n    if (!sl || (st && !st.l && sl < 5))\n        return buf || new u8(0);\n    // have to estimate size\n    var noBuf = !buf || st;\n    // no state\n    var noSt = !st || st.i;\n    if (!st)\n        st = {};\n    // Assumes roughly 33% compression ratio average\n    if (!buf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            st.f = final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        throw 'unexpected EOF';\n                    break;\n                }\n                // ensure size\n                if (noBuf)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >>> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                throw 'invalid block type';\n            if (pos > tbts) {\n                if (noSt)\n                    throw 'unexpected EOF';\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17;\n        if (noBuf)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    throw 'unexpected EOF';\n                break;\n            }\n            if (!c)\n                throw 'invalid length/literal';\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n                if (!d)\n                    throw 'invalid distance';\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        throw 'unexpected EOF';\n                    break;\n                }\n                if (noBuf)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                for (; bt < end; bt += 4) {\n                    buf[bt] = buf[bt - dt];\n                    buf[bt + 1] = buf[bt + 1 - dt];\n                    buf[bt + 2] = buf[bt + 2 - dt];\n                    buf[bt + 3] = buf[bt + 3 - dt];\n                }\n                bt = end;\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >>> 8;\n    d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return [et, 0];\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return [v, 1];\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >>> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n    var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n    var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n    var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        lcfreq[lclt[i] & 31]++;\n    for (var i = 0; i < lcdt.length; ++i)\n        lcfreq[lcdt[i] & 31]++;\n    var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n    if (flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        if (syms[i] > 255) {\n            var len = (syms[i] >>> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n            var dst = syms[i] & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n    var s = dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var pos = 0;\n    if (!lvl || s < 8) {\n        for (var i = 0; i <= s; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e < s) {\n                // write full block\n                pos = wfblk(w, pos, dat.subarray(i, e));\n            }\n            else {\n                // write final block\n                w[i] = lst;\n                pos = wfblk(w, pos, dat.subarray(i, s));\n            }\n        }\n    }\n    else {\n        var opt = deo[lvl - 1];\n        var n = opt >>> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = new u16(32768), head = new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new u32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index  l/lind  waitdx  bitpos\n        var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n        for (; i < s; ++i) {\n            // hash value\n            // deopt when i > s - 3 - at end, deopt acceptable\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = (i - dif + j + 32768) & 32767;\n                                    var pti = prev[ti];\n                                    var cd = (ti - pti + 32768) & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += (imod - pimod + 32768) & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one Uint32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        // this is the easiest way to avoid needing to maintain state\n        if (!lst && pos & 7)\n            pos = wfblk(w, pos + 1, et);\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new u32(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Alder32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    var _a;\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n        ch[id] = wcln(fns[m], fnStr, td_1);\n    }\n    var td = mrg({}, ch[id][1]);\n    return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.push = function (d, f) {\n        if (t)\n            throw 'stream finished';\n        if (!strm.ondata)\n            throw 'no stream handler';\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        throw 'invalid gzip data';\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += d[10] | (d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n    if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        throw 'invalid zlib data';\n    if (d[1] & 32)\n        throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n    if (!cb && typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (!cb && typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, !f), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (this.d)\n            throw 'stream finished';\n        if (!this.ondata)\n            throw 'no stream handler';\n        this.d = final;\n        this.p(chunk, final || false);\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an inflation stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Inflate(cb) {\n        this.s = {};\n        this.p = new u8(0);\n        this.ondata = cb;\n    }\n    Inflate.prototype.e = function (c) {\n        if (this.d)\n            throw 'stream finished';\n        if (!this.ondata)\n            throw 'no stream handler';\n        var l = this.p.length;\n        var n = new u8(l + c.length);\n        n.set(this.p), n.set(c, l), this.p = n;\n    };\n    Inflate.prototype.c = function (final) {\n        this.d = this.s.i = final || false;\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.o, this.s);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous inflation stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncInflate(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, 0, function () {\n            var strm = new Inflate();\n            onmessage = astrm(strm);\n        }, 7);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n    return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        this.c.p(c);\n        this.l += c.length;\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a GUNZIP stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Gunzip(cb) {\n        this.v = 1;\n        Inflate.call(this, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            var s = this.p.length > 3 ? gzs(this.p) : 4;\n            if (s >= this.p.length && !final)\n                return;\n            this.p = this.p.subarray(s), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 8)\n                throw 'invalid gzip stream';\n            this.p = this.p.subarray(0, -8);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous GUNZIP stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncGunzip(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, 0, function () {\n            var strm = new Gunzip();\n            onmessage = astrm(strm);\n        }, 9);\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n    return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        this.c.p(c);\n        var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    /**\n     * Creates a Zlib decompression stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Unzlib(cb) {\n        this.v = 1;\n        Inflate.call(this, cb);\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 2 && !final)\n                return;\n            this.p = this.p.subarray(2), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                throw 'invalid zlib stream';\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous Zlib decompression stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncUnzlib(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, 0, function () {\n            var strm = new Unzlib();\n            onmessage = astrm(strm);\n        }, 11);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n    return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    /**\n     * Creates a decompression stream\n     * @param cb The callback to call whenever data is decompressed\n     */\n    function Decompress(cb) {\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            throw 'no stream handler';\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                var _this_1 = this;\n                var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(cb)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(cb)\n                        : new this.Z(cb);\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    /**\n   * Creates an asynchronous decompression stream\n   * @param cb The callback to call whenever data is decompressed\n   */\n    function AsyncDecompress(cb) {\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, out)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, out)\n            : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k;\n        if (val instanceof u8)\n            t[n] = [val, o];\n        else if (Array.isArray(val))\n            t[n] = [val[0], mrg(o, val[1])];\n        else\n            fltn(val, n + '/', t, o);\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return [r, slc(d, i - 1)];\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            throw 'no callback';\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    throw 'invalid utf-8 data';\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            throw 'stream finished';\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), ch = _a[0], np = _a[1];\n        if (final) {\n            if (np.length)\n                throw 'invalid utf-8 data';\n            this.p = null;\n        }\n        else\n            this.p = np;\n        this.ondata(ch, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            throw 'no callback';\n        if (this.d)\n            throw 'stream finished';\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td)\n        return td.decode(dat);\n    else {\n        var _a = dutf8(dat), out = _a[0], ext = _a[1];\n        if (ext.length)\n            throw 'invalid utf-8 data';\n        return out;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n    var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                throw 'extra field too long';\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        throw 'date not in range 1980-2099';\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n    if (c != null) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            throw 'no callback - add to ZIP archive before pushing';\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this_1 = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this_1.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this_1 = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this_1.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this_1 = this;\n        if (this.d & 2)\n            throw 'stream finished';\n        var f = strToU8(file.filename), fl = f.length;\n        var com = file.comment, o = com && strToU8(com);\n        var u = fl != file.filename.length || (o && (com.length != o.length));\n        var hl = fl + exfl(file.extra) + 30;\n        if (fl > 65535)\n            throw 'filename too long';\n        var header = new u8(hl);\n        wzh(header, 0, file, f, u);\n        var chks = [header];\n        var pAll = function () {\n            for (var _i = 0, chks_1 = chks; _i < chks_1.length; _i++) {\n                var chk = chks_1[_i];\n                _this_1.ondata(null, chk, false);\n            }\n            chks = [];\n        };\n        var tr = this.d;\n        this.d = 0;\n        var ind = this.u.length;\n        var uf = mrg(file, {\n            f: f,\n            u: u,\n            o: o,\n            t: function () {\n                if (file.terminate)\n                    file.terminate();\n            },\n            r: function () {\n                pAll();\n                if (tr) {\n                    var nxt = _this_1.u[ind + 1];\n                    if (nxt)\n                        nxt.r();\n                    else\n                        _this_1.d = 1;\n                }\n                tr = 1;\n            }\n        });\n        var cl = 0;\n        file.ondata = function (err, dat, final) {\n            if (err) {\n                _this_1.ondata(err, dat, final);\n                _this_1.terminate();\n            }\n            else {\n                cl += dat.length;\n                chks.push(dat);\n                if (final) {\n                    var dd = new u8(16);\n                    wbytes(dd, 0, 0x8074B50);\n                    wbytes(dd, 4, file.crc);\n                    wbytes(dd, 8, cl);\n                    wbytes(dd, 12, file.size);\n                    chks.push(dd);\n                    uf.c = cl, uf.b = hl + cl + 16, uf.crc = file.crc, uf.size = file.size;\n                    if (tr)\n                        uf.r();\n                    tr = 1;\n                }\n                else if (tr)\n                    pAll();\n            }\n        };\n        this.u.push(uf);\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this_1 = this;\n        if (this.d & 2) {\n            if (this.d & 1)\n                throw 'stream finishing';\n            throw 'stream finished';\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this_1.d & 1))\n                        return;\n                    _this_1.u.splice(-1, 1);\n                    _this_1.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cb(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cb(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cb(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl('filename too long', null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            throw 'filename too long';\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (data, final) {\n        this.ondata(null, data, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this_1 = this;\n        this.i = new Inflate(function (dat, final) {\n            _this_1.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (data, final) {\n        try {\n            this.i.push(data, final);\n        }\n        catch (e) {\n            this.ondata(e, data, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this_1 = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this_1.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this_1.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (data, final) {\n        if (this.i.terminate)\n            data = slc(data, 0);\n        this.i.push(data, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this_1 = this;\n        if (!this.onfile)\n            throw 'no callback';\n        if (!this.p)\n            throw 'stream finished';\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var _a;\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_2 = [];\n                        this_1.k.unshift(chks_2);\n                        f = 2;\n                        var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        if (sc_1 == 4294967295) {\n                            _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n                        }\n                        else if (dd)\n                            sc_1 = -1;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    throw 'no callback';\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this_1.o[cmp_1];\n                                    if (!ctr)\n                                        throw 'unknown compression type ' + cmp_1;\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_3 = chks_2; _i < chks_3.length; _i++) {\n                                        var dat = chks_3[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this_1.k[0] == chks_2 && _this_1.c)\n                                        _this_1.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                throw 'invalid zip file';\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n    if (typeof cb != 'function')\n        throw 'no callback';\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cb('invalid zip file', null);\n            return;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (!lft)\n        cb(null, {});\n    var c = lft;\n    var o = b4(data, e + 16);\n    var z = o == 4294967295;\n    if (z) {\n        e = b4(data, e - 12);\n        if (b4(data, e) != 0x6064B50) {\n            cb('invalid zip file', null);\n            return;\n        }\n        c = lft = b4(data, e + 32);\n        o = b4(data, e + 48);\n    }\n    var _loop_3 = function (i) {\n        var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cb(e, null);\n            }\n            else {\n                files[fn] = d;\n                if (!--lft)\n                    cb(null, files);\n            }\n        };\n        if (!c_1)\n            cbl(null, slc(data, b, b + sc));\n        else if (c_1 == 8) {\n            var infl = data.subarray(b, b + sc);\n            if (sc < 320000) {\n                try {\n                    cbl(null, inflateSync(infl, new u8(su)));\n                }\n                catch (e) {\n                    cbl(e, null);\n                }\n            }\n            else\n                term.push(inflate(infl, { size: su }, cbl));\n        }\n        else\n            cbl('unknown compression type ' + c_1, null);\n    };\n    for (var i = 0; i < c; ++i) {\n        _loop_3(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            throw 'invalid zip file';\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295;\n    if (z) {\n        e = b4(data, e - 12);\n        if (b4(data, e) != 0x6064B50)\n            throw 'invalid zip file';\n        c = b4(data, e + 32);\n        o = b4(data, e + 48);\n    }\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!c_2)\n            files[fn] = slc(data, b, b + sc);\n        else if (c_2 == 8)\n            files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n        else\n            throw 'unknown compression type ' + c_2;\n    }\n    return files;\n}\n","import {StoreController} from '../../store/controllers/StoreController';\nimport {DateUtils} from '../DateUtils';\nimport {zipSync, Zippable} from 'fflate';\nimport {CoreFileUtils} from '../FileUtils';\n\nexport interface RecordedFrame {\n\tsceneFrame: number;\n\tblob: Blob;\n}\nexport const FPS = 60;\nexport function updateStatusBarWithProgress(startTime: number, recordedFrames: number, requestedFramesCount: number) {\n\tconst elapsedTime = performance.now() - startTime;\n\n\tconst renderedRatio = recordedFrames / requestedFramesCount;\n\tconst percent = Math.ceil(100 * renderedRatio);\n\t// const remainingRatio = 1-renderedRatio\n\tconst expectedTotalTime = elapsedTime / renderedRatio;\n\tconst remainingTime = expectedTotalTime - elapsedTime;\n\tconst remainingTimecode = DateUtils.millisecondsToTimeCode(remainingTime);\n\t// console.log({renderedRatio, startTime, elapsedTime, expectedTotalTime, remainingTime, remainingTimecode});\n\tStoreController.editor.status.setLoading(\n\t\t`capturing video (frame: ${recordedFrames}/${requestedFramesCount}, progress: ${percent}%, remaining: ${remainingTimecode})`\n\t);\n}\n\nexport function updateStatusBarWithTotalTime(startTime: number) {\n\tconst elapsedTime = performance.now() - startTime;\n\tconst timecode = DateUtils.millisecondsToTimeCode(elapsedTime);\n\tconst message = `capturing video completed in ${timecode}`;\n\tStoreController.editor.status.setMessage(message);\n\n\tconsole.log(message);\n}\n\nexport function completedOrInterrupted(recordedFrames: number, requestedFramesCount: number) {\n\tconst recordingCompleted = recordedFrames >= requestedFramesCount;\n\tconst recordingInterrupted = StoreController.editor.captureForm.interrupted();\n\treturn recordingCompleted || recordingInterrupted;\n}\n\nasync function blobToUint8Array(blob: Blob) {\n\tconst arrayBuffer = await new Response(blob).arrayBuffer();\n\tconst array = new Uint8Array(arrayBuffer);\n\treturn array;\n}\nexport function fileNamePaddedFrame(frame: number): string {\n\treturn `${frame}`.padStart(5, '0');\n}\nexport async function zipFrames(frames: RecordedFrame[]) {\n\tconsole.log(frames.length);\n\n\tconst wrappedZippedData: Zippable = {};\n\tfor (let frame of frames) {\n\t\tconst frameIndex = fileNamePaddedFrame(frame.sceneFrame);\n\t\twrappedZippedData[`image_${frameIndex}.png`] = await blobToUint8Array(frame.blob);\n\t}\n\tconst zipped = zipSync(wrappedZippedData);\n\n\tconst blob = new Blob([zipped]);\n\n\t// const blob = tsWhammy.fromImageArray(frames, FPS);\n\t// console.log(blob);\n\t// if (blob && blob instanceof Blob) {\n\t// \tthis._blob = blob;\n\t// \t// console.log(this._blob);\n\t// }\n\tCoreFileUtils.downloadBlob(blob, `videocapture.zip`);\n\treturn blob;\n}\n","import {ParamType} from '../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {Poly} from '../../../../@polygonjs/polygonjs/src/engine/Poly';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodesByRequestedName} from '../../../engine/io/code/export/Nodes';\n\ninterface CoreClipboardRunOptions {\n\tprintToConsole?: boolean;\n}\n\ntype ParamTypeMapGeneric = {[key in string]: ParamType};\nconst paramTypeMap: ParamTypeMapGeneric = {\n\t[ParamType.BOOLEAN.toUpperCase()]: ParamType.BOOLEAN,\n\t[ParamType.BUTTON.toUpperCase()]: ParamType.BUTTON,\n\t[ParamType.COLOR.toUpperCase()]: ParamType.COLOR,\n\t[ParamType.FLOAT.toUpperCase()]: ParamType.FLOAT,\n\t[ParamType.FOLDER.toUpperCase()]: ParamType.FOLDER,\n\t[ParamType.INTEGER.toUpperCase()]: ParamType.INTEGER,\n\t[ParamType.NODE_PATH.toUpperCase()]: ParamType.NODE_PATH,\n\t[ParamType.PARAM_PATH.toUpperCase()]: ParamType.PARAM_PATH,\n\t[ParamType.RAMP.toUpperCase()]: ParamType.RAMP,\n\t[ParamType.STRING.toUpperCase()]: ParamType.STRING,\n\t[ParamType.VECTOR2.toUpperCase()]: ParamType.VECTOR2,\n\t[ParamType.VECTOR3.toUpperCase()]: ParamType.VECTOR3,\n\t[ParamType.VECTOR4.toUpperCase()]: ParamType.VECTOR4,\n};\ntype NodesByRequestedNameFunc = (scene: PolyScene, paramTypeMap: ParamTypeMapGeneric) => NodesByRequestedName;\n\nexport class CoreClipboard {\n\tstatic PARENT_NODE_VAR_NAME = 'parentNode';\n\tstatic run(parentNode: BaseNodeType, code: string, options?: CoreClipboardRunOptions) {\n\t\t//code = lodash_flatten(code_lines).join(\";\\n\")\n\t\tconst codeWrappedTimestamp = Math.floor(performance.now() * 10000);\n\t\tconst codeWrappedFunctionName = `pasteClipboard${codeWrappedTimestamp}`;\n\t\tconst codeWrapped = `var ${codeWrappedFunctionName} = function(${CoreClipboard.PARENT_NODE_VAR_NAME}){\n\t\t${code} };\n\t\treturn ${codeWrappedFunctionName}(scene.node('${parentNode.path()}'));`;\n\t\tif (Poly.env() != 'test' && Poly.env() != 'development' && options?.printToConsole == true) {\n\t\t\t// if (Poly.env() == 'test') {\n\t\t\tconsole.log('================== clipboard code START: ==================');\n\t\t\tconsole.log(codeWrapped);\n\t\t\tconsole.log('================== clipboard code END ==================');\n\t\t}\n\t\tconst codeWrappedFunction: NodesByRequestedNameFunc = new Function(\n\t\t\t'scene',\n\t\t\t'ParamType',\n\t\t\tcodeWrapped\n\t\t) as NodesByRequestedNameFunc;\n\t\tparentNode.scene().cooker.block();\n\t\ttry {\n\t\t\tconst nodesByRequestedName = codeWrappedFunction(parentNode.scene(), paramTypeMap);\n\t\t\tparentNode.scene().cooker.unblock();\n\t\t\treturn nodesByRequestedName;\n\t\t} catch (err) {\n\t\t\tconsole.warn('copy/paste error:');\n\t\t\tconsole.error(err);\n\t\t\tparentNode.scene().cooker.unblock();\n\t\t}\n\t}\n}\n","import {StoreController} from './../../store/controllers/StoreController';\n/*\nMultiple strategies where used to save the buffer of the code to create nodes:\n- save to localstorage\n- use clipboardJS ( https://github.com/zenorocha/clipboard.js/ )\n- use clipboard api ( https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API )\n\n- the localstorage works best when only using either the local or web version, but does not help when needed to share in between.\n- clipboardJS helps copying the code to the clipboard, but not when pasting\n- clipboard api needs a permission setting, but once that's done, it helps sharing between web and local, which seems to be the most convenient.\n\nAnd note that for tests to work, I also copy to localStorage. So real route to nodes/copy paste should still be tested manually.\n*/\n\nimport {Vector2} from 'three';\nimport {NodesCodeExporter, NodesByRequestedName} from '../../../engine/io/code/export/Nodes';\nimport {Constants} from '../network/Constants';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeEvent} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeEvent';\nimport {CoreGraphNodeId} from '../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Poly} from '../../../../@polygonjs/polygonjs/src/engine/Poly';\nimport {NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {CoreType} from '../../../../@polygonjs/polygonjs/src/core/Type';\nimport {CoreClipboard} from './CoreClipboard';\n\ntype ClipboardBuffer = {[key in NodeContext]?: string};\n\nexport interface NetworkClipBoardHelperOptions {\n\tprintToConsole: boolean;\n\tstoreCode: boolean;\n}\n\nexport interface NetworkClipBoardHelperJSON {\n\tcode?: string;\n}\n\nexport class NetworkClipBoardHelper {\n\tprivate _lastSavedCode: string | undefined;\n\tprivate _serializedCode?: string;\n\tprivate _options: NetworkClipBoardHelperOptions = {\n\t\tprintToConsole: true,\n\t\tstoreCode: true,\n\t};\n\tconstructor(_options: Partial<NetworkClipBoardHelperOptions> = {}) {\n\t\tif (_options.printToConsole != null) {\n\t\t\tthis._options.printToConsole = _options.printToConsole;\n\t\t}\n\t\tif (_options.storeCode != null) {\n\t\t\tthis._options.storeCode = _options.storeCode;\n\t\t}\n\t}\n\tprivate _setSerializedCode(code?: string) {\n\t\tthis._serializedCode = code;\n\t}\n\n\tasync copySelection(parent_node: BaseNodeType) {\n\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\tparent_node.childrenController?.selection.nodes(selectedNodes);\n\t\tif (selectedNodes) {\n\t\t\tawait this.copyFromNode(parent_node, selectedNodes);\n\t\t} else {\n\t\t\tconsole.warn('copySelection: no selected nodes');\n\t\t}\n\t}\n\n\tasync copyFromNode(parent_node: BaseNodeType, childNodes: BaseNodeType[]) {\n\t\tconst code = this.createCodeForNodes(parent_node, childNodes);\n\t\tif (code && parent_node.childrenController) {\n\t\t\tthis._lastSavedCode = code;\n\t\t\tthis._writeToLocalStorage(parent_node.childrenController.context, code);\n\t\t\ttry {\n\t\t\t\tawait this._copyToClipboard(parent_node.childrenController.context, code);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn('copyFromNode: error while copying to clipboard');\n\t\t\t\tconsole.log(err);\n\t\t\t}\n\t\t}\n\t}\n\tprivate async _code(parentNode: BaseNodeType) {\n\t\tif (!parentNode.childrenController) {\n\t\t\tconsole.warn('paste code: parentNode cannot have children');\n\t\t\treturn;\n\t\t}\n\t\tif (this._serializedCode) {\n\t\t\treturn this._serializedCode;\n\t\t}\n\t\tconst code = this._options.storeCode\n\t\t\t? await this._readCache(parentNode.childrenController.context)\n\t\t\t: this._lastSavedCode;\n\t\treturn code || undefined;\n\t}\n\n\tasync pasteInNode(parentNode: BaseNodeType, position?: Vector2) {\n\t\t// if (StoreController.editor.userPlan.nodesCountLimitReached()) {\n\t\t// \tEditor.instance().showUpgradeRequiredNotice();\n\t\t// \treturn;\n\t\t// }\n\n\t\tconst code = await this._code(parentNode);\n\t\tif (!code) {\n\t\t\tconsole.warn('paste: no code to paste');\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.runCodeInNode(parentNode, code, position);\n\t}\n\trunCodeInNode(parentNode: BaseNodeType, code: string, position?: Vector2) {\n\t\tlet newNodes: BaseNodeType[] = [];\n\t\tlet nodesByRequestedName: NodesByRequestedName | undefined = {};\n\t\tparentNode.scene().lifecycleController.onAfterCreatedPrevent(async () => {\n\t\t\tif (!parentNode.childrenController) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!code) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst current_node_ids: CoreGraphNodeId[] = parentNode.children().map((c) => c.graphNodeId());\n\n\t\t\tnodesByRequestedName = CoreClipboard.run(parentNode, code, this._options);\n\n\t\t\t// select the newly created nodes\n\t\t\tconst new_node_ids = parentNode\n\t\t\t\t.children()\n\t\t\t\t.map((c) => c.graphNodeId())\n\t\t\t\t.filter((id) => {\n\t\t\t\t\treturn !current_node_ids.includes(id);\n\t\t\t\t});\n\t\t\tnewNodes = new_node_ids.map((id) => parentNode.scene().graph.nodeFromId(id)) as BaseNodeType[];\n\n\t\t\tif (position) {\n\t\t\t\tconst cameraPosition = position.clone();\n\t\t\t\tthis.offsetNodes(newNodes, cameraPosition.multiplyScalar(-1));\n\t\t\t\tnewNodes.forEach((node) => {\n\t\t\t\t\tnode.emit(NodeEvent.PARAMS_UPDATED);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// if (StoreController.editor.userPlan.nodesCountLimitReached()) {\n\t\t\t// \tEditor.instance().showUpgradeRequiredNotice();\n\t\t\t// \tSafeNodeRemover.removeNodes(parentNode, newNodes);\n\t\t\t// \treturn;\n\t\t\t// }\n\n\t\t\t// console.log('new_nodes', new_nodes, new_nodes.length);\n\t\t\tparentNode.childrenController.selection.set(newNodes);\n\t\t});\n\t\treturn {newNodes, nodesByRequestedName};\n\t}\n\n\toffsetNodes(nodes: BaseNodeType[], cameraPosition: Vector2) {\n\t\tconst positions = nodes.map((node) => node.uiData.position());\n\t\tconst xs = positions.map((p) => p.x);\n\t\tconst ys = positions.map((p) => p.y);\n\t\tconst min = new Vector2(Math.min(...xs), Math.min(...ys));\n\t\tconst max = new Vector2(Math.max(...xs), Math.max(...ys));\n\t\tconst center = min.add(max).multiplyScalar(0.5);\n\t\tconst offset = cameraPosition.sub(center);\n\n\t\tconst precision = 1 * Constants.NODE_UNIT;\n\t\toffset.x = precision * Math.round(offset.x / precision);\n\t\toffset.y = precision * Math.round(offset.y / precision);\n\n\t\tnodes.forEach((node) => {\n\t\t\tnode.uiData.translate(offset, true);\n\t\t});\n\t}\n\n\tcreateCodeForNodes(parent_node: BaseNodeType, nodes: BaseNodeType[]): string | undefined {\n\t\tconst positions = nodes.map((node) => node.uiData.position());\n\t\tconst positions_xs = positions.map((p) => p.x);\n\t\tconst min_x = Math.min(...positions_xs);\n\t\tconst max_x = Math.max(...positions_xs);\n\t\tif (max_x != null && min_x != null) {\n\t\t\tconst position_x_offset = max_x - min_x + 2;\n\n\t\t\tconst exporter = new NodesCodeExporter(nodes);\n\t\t\tconst lines: string[] = exporter.process_with_existing_nodes(\n\t\t\t\tparent_node,\n\t\t\t\tCoreClipboard.PARENT_NODE_VAR_NAME,\n\t\t\t\tposition_x_offset\n\t\t\t);\n\t\t\treturn lines.join('\\n');\n\t\t}\n\t}\n\n\tprivate async _copyToClipboard(nodeContext: NodeContext, text: string) {\n\t\tif (!this._options.storeCode) {\n\t\t\treturn;\n\t\t}\n\t\t// this._currentClipboardBuffer[nodeContext] = text;\n\n\t\t// const button = document.createElement('button');\n\t\t// document.body.append(button);\n\t\t// const clipboard = new ClipboardJS(button, {text: () => JSON.stringify(this._currentClipboardBuffer)});\n\t\tconst buffer = await this._readClipboardBuffer();\n\t\tif (!buffer) {\n\t\t\treturn;\n\t\t}\n\t\tbuffer[nodeContext] = text;\n\t\tnavigator.clipboard.writeText(JSON.stringify(buffer));\n\t\t// clipboard.on('success', function (e) {\n\t\t// \tconsole.info('Action:', e.action);\n\t\t// \tconsole.info('Text:', e.text);\n\t\t// \tconsole.info('Trigger:', e.trigger);\n\n\t\t// \te.clearSelection();\n\t\t// });\n\n\t\t// clipboard.on('error', function (e) {\n\t\t// \tconsole.error('Action:', e.action);\n\t\t// \tconsole.error('Trigger:', e.trigger);\n\t\t// });\n\t\t// button.click();\n\t\t// document.body.removeChild(button);\n\t\t// clipboard.destroy();\n\n\t\t// localStorage.setItem(cache_name, text);\n\t\t// console.log('======================');\n\t\t// console.log(text);\n\t\t// console.log('======================');\n\t\t// if (Poly.env() == 'test') {\n\t\t// \treturn;\n\t\t// }\n\n\t\t// ClipboardHelper.copy(text);\n\t}\n\t// at the moment while I can save the content to the system clipboard,\n\t// I cannot read it back without using the clipboard API\n\t// navigator.clipboard.readText().then((text) => console.log('text:', text));\n\t// which displays a permission request in a popup.\n\t// so this is not ideal.\n\t// private _write_in_system_clipboard(text: string) {\n\t// \tconst input = document.createElement('input');\n\t// \tdocument.body.appendChild(input);\n\t// \tinput.value = text;\n\t// \tinput.select();\n\t// \tinput.setSelectionRange(0, 99999);\n\t// \tdocument.execCommand('copy');\n\t// \tconsole.log(text);\n\t// \tdocument.body.removeChild(input);\n\t// }\n\n\tprivate async _readCache(nodeContext: NodeContext) {\n\t\tif (!this._options.storeCode) {\n\t\t\tconsole.warn('cannot read cache, storeCode is false');\n\t\t\treturn;\n\t\t}\n\t\tlet content: string | null | undefined = undefined;\n\n\t\tif (Poly.env() == 'test') {\n\t\t\tcontent = await this._readFromLocalStorage(nodeContext);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tcontent = await this._readFromClipboard(nodeContext);\n\t\t\t\tif (!content) {\n\t\t\t\t\tcontent = await this._readFromLocalStorage(nodeContext);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn('clipboard readCache, read from clipboard failed, trying localstorage');\n\t\t\t\tconsole.error(err);\n\t\t\t\tcontent = await this._readFromLocalStorage(nodeContext);\n\t\t\t}\n\t\t}\n\n\t\treturn content;\n\n\t\t// const permission = {name: 'clipboard-read'};\n\t\t// const result = await navigator.permissions.query(permission as any);\n\t\t// // If permission to read the clipboard is granted or if the user will\n\t\t// // be prompted to allow it, we proceed.\n\n\t\t// if (result.state == 'granted' || result.state == 'prompt') {\n\t\t// \treturn ClipboardHelper.paste();\n\t\t// } else {\n\t\t// \treturn this._readFromLocalStorage(cacheName);\n\t\t// }\n\n\t\t// const queryOpts = {name: 'clipboard-read', allowWithoutGesture: false};\n\t\t// const permissionStatus = await navigator.permissions.query(queryOpts as any);\n\t\t// console.log(permissionStatus);\n\t\t// if (permissionStatus.state == 'granted') {\n\t\t// \tconsole.log('A');\n\t\t// \treturn ClipboardHelper.paste();\n\t\t// } else {\n\t\t// \tconsole.log('B');\n\t\t// \treturn this._readFromLocalStorate(cacheName)\n\t}\n\tprivate async _requestClipboardPermission() {\n\t\tconst permission: PermissionDescriptor = {name: 'clipboard-read'} as any;\n\t\tconst result = await navigator.permissions.query(permission);\n\t\tif (result.state == 'granted' || result.state == 'prompt') {\n\t\t\treturn true;\n\t\t} else {\n\t\t\tconsole.warn('clipboard permission denied');\n\t\t\treturn false;\n\t\t}\n\t}\n\tprivate async _readFromClipboard(nodeContext: NodeContext) {\n\t\t// const textarea = document.createElement('textarea')\n\t\t// textarea.exec\n\t\t// console.log('read from clipboard', nodeContext);\n\t\t// return '';\n\n\t\tconst currentBuffer = await this._readClipboardBuffer();\n\t\tif (currentBuffer) {\n\t\t\treturn currentBuffer[nodeContext];\n\t\t} else {\n\t\t\tconsole.warn('clipboard is empty');\n\t\t}\n\t}\n\t// private _currentClipboardBuffer: ClipboardBuffer = {};\n\tprivate async _readClipboardBuffer(): Promise<ClipboardBuffer | void> {\n\t\tif (!this._options.storeCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tif (!this._requestClipboardPermission()) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.log('caught an error while trying to read the clipboard');\n\t\t\tconsole.error(err);\n\t\t\treturn {};\n\t\t}\n\t\tconst currentBuffer = await navigator.clipboard.readText();\n\n\t\tif (currentBuffer == null || currentBuffer.length == 0 || !CoreType.isString(currentBuffer)) {\n\t\t\treturn {};\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst parsedBuffer = JSON.parse(currentBuffer);\n\t\t\t\tif (CoreType.isNumber(parsedBuffer)) {\n\t\t\t\t\treturn {};\n\t\t\t\t} else {\n\t\t\t\t\treturn parsedBuffer;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t}\n\t}\n\tprivate _readFromLocalStorage(nodeContext: NodeContext): Promise<string | null> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst code = localStorage.getItem(nodeContext);\n\t\t\tif (code == null) {\n\t\t\t\tconsole.warn(`no cache available at '${nodeContext}'`);\n\t\t\t}\n\t\t\tresolve(code);\n\t\t});\n\t}\n\tprivate _writeToLocalStorage(nodeContext: NodeContext, text: string) {\n\t\tif (!this._options.storeCode) {\n\t\t\treturn;\n\t\t}\n\n\t\tNetworkClipBoardHelper.writeToLocalStorage(nodeContext, text);\n\n\t\tif (Poly.env() != 'test' && Poly.env() != 'development' && this._options.printToConsole) {\n\t\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\t\tconst usernameOk = username != null && ['gui', 'guillaumefradin'].includes(username);\n\t\t\t// console.log(Poly.env(), username, usernameOk);\n\t\t\t// const webOk = Editor.instance().type() == EditorType.WEB && username=='guillaumefradin'\n\t\t\t// const localOk = Editor.instance().type() == EditorType.WEB && username=='guillaumefradin'\n\t\t\tif (usernameOk) {\n\t\t\t\tconsole.log('======================');\n\t\t\t\tconsole.log(text);\n\t\t\t\tconsole.log('======================');\n\t\t\t}\n\t\t}\n\t}\n\tstatic writeToLocalStorage(nodeContext: NodeContext, text: string) {\n\t\ttry {\n\t\t\tlocalStorage.setItem(nodeContext, text);\n\t\t} catch (err) {\n\t\t\tconsole.log('failed to write to local storage');\n\t\t\tconsole.warn(err);\n\t\t}\n\t}\n\n\tasync toJSON(parentNode: BaseNodeType): Promise<NetworkClipBoardHelperJSON> {\n\t\treturn {\n\t\t\tcode: await this._code(parentNode),\n\t\t};\n\t}\n\tstatic fromJSON(json: NetworkClipBoardHelperJSON, options?: NetworkClipBoardHelperOptions) {\n\t\tconst helper = new NetworkClipBoardHelper(options);\n\t\thelper._setSerializedCode(json.code);\n\t\treturn helper;\n\t}\n}\n","import {NetworkClipBoardHelper} from './NetworkClipboardHelper';\nimport {LinkIndex} from './../../components/panels/common/LinkIndex';\nclass NetworkClipboardHelperRegisterClass {\n\tstatic _instance: NetworkClipboardHelperRegisterClass | undefined;\n\tprivate constructor() {}\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NetworkClipboardHelperRegisterClass());\n\t}\n\n\tprivate _helperByLinkIndex: Map<LinkIndex, NetworkClipBoardHelper> = new Map();\n\thelper(linkIndex: LinkIndex) {\n\t\tlet h = this._helperByLinkIndex.get(linkIndex);\n\t\tif (!h) {\n\t\t\th = new NetworkClipBoardHelper();\n\t\t\tthis._helperByLinkIndex.set(linkIndex, h);\n\t\t}\n\t\treturn h;\n\t}\n}\n\nexport const NetworkClipboardHelperRegister = NetworkClipboardHelperRegisterClass.instance();\n","/*\n * This file defines flags and constants that can be modified during compile time in order to facilitate tree shaking\n * for users.\n *\n * Debug flags need to be declared in each package individually and must not be imported across package boundaries,\n * because some build tools have trouble tree-shaking imported guards.\n *\n * As a convention, we define debug flags in a `flags.ts` file in the root of a package's `src` folder.\n *\n * Debug flag files will contain \"magic strings\" like `__SENTRY_DEBUG__` that may get replaced with actual values during\n * our, or the user's build process. Take care when introducing new flags - they must not throw if they are not\n * replaced.\n */\n/** Flag that is true for debug builds, false otherwise. */\nexport var IS_DEBUG_BUILD = typeof __SENTRY_DEBUG__ === 'undefined' ? true : __SENTRY_DEBUG__;\n//# sourceMappingURL=flags.js.map","import { getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass, options) {\n    if (options.debug === true) {\n        if (IS_DEBUG_BUILD) {\n            logger.enable();\n        }\n        else {\n            // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n            // eslint-disable-next-line no-console\n            console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n        }\n    }\n    var hub = getCurrentHub();\n    var scope = hub.getScope();\n    if (scope) {\n        scope.update(options.initialScope);\n    }\n    var client = new clientClass(options);\n    hub.bindClient(client);\n}\n//# sourceMappingURL=sdk.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __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\nexport function __read(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\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { __read, __spread } from \"tslib\";\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\nvar InboundFilters = /** @class */ (function () {\n    function InboundFilters(_options) {\n        if (_options === void 0) { _options = {}; }\n        this._options = _options;\n        /**\n         * @inheritDoc\n         */\n        this.name = InboundFilters.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    InboundFilters.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (event) {\n            var hub = getCurrentHub();\n            if (hub) {\n                var self_1 = hub.getIntegration(InboundFilters);\n                if (self_1) {\n                    var client = hub.getClient();\n                    var clientOptions = client ? client.getOptions() : {};\n                    var options = _mergeOptions(self_1._options, clientOptions);\n                    return _shouldDropEvent(event, options) ? null : event;\n                }\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    InboundFilters.id = 'InboundFilters';\n    return InboundFilters;\n}());\nexport { InboundFilters };\n/** JSDoc */\nexport function _mergeOptions(internalOptions, clientOptions) {\n    if (internalOptions === void 0) { internalOptions = {}; }\n    if (clientOptions === void 0) { clientOptions = {}; }\n    return {\n        allowUrls: __spread((internalOptions.whitelistUrls || []), (internalOptions.allowUrls || []), (clientOptions.whitelistUrls || []), (clientOptions.allowUrls || [])),\n        denyUrls: __spread((internalOptions.blacklistUrls || []), (internalOptions.denyUrls || []), (clientOptions.blacklistUrls || []), (clientOptions.denyUrls || [])),\n        ignoreErrors: __spread((internalOptions.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),\n        ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n    };\n}\n/** JSDoc */\nexport function _shouldDropEvent(event, options) {\n    if (options.ignoreInternal && _isSentryError(event)) {\n        IS_DEBUG_BUILD &&\n            logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n        return true;\n    }\n    if (_isIgnoredError(event, options.ignoreErrors)) {\n        IS_DEBUG_BUILD &&\n            logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n        return true;\n    }\n    if (_isDeniedUrl(event, options.denyUrls)) {\n        IS_DEBUG_BUILD &&\n            logger.warn(\"Event dropped due to being matched by `denyUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + _getEventFilterUrl(event));\n        return true;\n    }\n    if (!_isAllowedUrl(event, options.allowUrls)) {\n        IS_DEBUG_BUILD &&\n            logger.warn(\"Event dropped due to not being matched by `allowUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + _getEventFilterUrl(event));\n        return true;\n    }\n    return false;\n}\nfunction _isIgnoredError(event, ignoreErrors) {\n    if (!ignoreErrors || !ignoreErrors.length) {\n        return false;\n    }\n    return _getPossibleEventMessages(event).some(function (message) {\n        return ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });\n    });\n}\nfunction _isDeniedUrl(event, denyUrls) {\n    // TODO: Use Glob instead?\n    if (!denyUrls || !denyUrls.length) {\n        return false;\n    }\n    var url = _getEventFilterUrl(event);\n    return !url ? false : denyUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n}\nfunction _isAllowedUrl(event, allowUrls) {\n    // TODO: Use Glob instead?\n    if (!allowUrls || !allowUrls.length) {\n        return true;\n    }\n    var url = _getEventFilterUrl(event);\n    return !url ? true : allowUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n}\nfunction _getPossibleEventMessages(event) {\n    if (event.message) {\n        return [event.message];\n    }\n    if (event.exception) {\n        try {\n            var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;\n            return [\"\" + value, type + \": \" + value];\n        }\n        catch (oO) {\n            IS_DEBUG_BUILD && logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n            return [];\n        }\n    }\n    return [];\n}\nfunction _isSentryError(event) {\n    try {\n        // @ts-ignore can't be a sentry error if undefined\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        return event.exception.values[0].type === 'SentryError';\n    }\n    catch (e) {\n        // ignore\n    }\n    return false;\n}\nfunction _getLastValidUrl(frames) {\n    if (frames === void 0) { frames = []; }\n    for (var i = frames.length - 1; i >= 0; i--) {\n        var frame = frames[i];\n        if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n            return frame.filename || null;\n        }\n    }\n    return null;\n}\nfunction _getEventFilterUrl(event) {\n    try {\n        if (event.stacktrace) {\n            return _getLastValidUrl(event.stacktrace.frames);\n        }\n        var frames_1;\n        try {\n            // @ts-ignore we only care about frames if the whole thing here is defined\n            frames_1 = event.exception.values[0].stacktrace.frames;\n        }\n        catch (e) {\n            // ignore\n        }\n        return frames_1 ? _getLastValidUrl(frames_1) : null;\n    }\n    catch (oO) {\n        IS_DEBUG_BUILD && logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n        return null;\n    }\n}\n//# sourceMappingURL=inboundfilters.js.map","import { getOriginalFunction } from '@sentry/utils';\nvar originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\nvar FunctionToString = /** @class */ (function () {\n    function FunctionToString() {\n        /**\n         * @inheritDoc\n         */\n        this.name = FunctionToString.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    FunctionToString.prototype.setupOnce = function () {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        originalFunctionToString = Function.prototype.toString;\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        Function.prototype.toString = function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var context = getOriginalFunction(this) || this;\n            return originalFunctionToString.apply(context, args);\n        };\n    };\n    /**\n     * @inheritDoc\n     */\n    FunctionToString.id = 'FunctionToString';\n    return FunctionToString;\n}());\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __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\nexport function __read(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\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export var SDK_VERSION = '6.19.7';\n//# sourceMappingURL=version.js.map","export var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties);\n/**\n * setPrototypeOf polyfill using __proto__\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction setProtoOf(obj, proto) {\n    // @ts-ignore __proto__ does not exist on obj\n    obj.__proto__ = proto;\n    return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction mixinProperties(obj, proto) {\n    for (var prop in proto) {\n        if (!Object.prototype.hasOwnProperty.call(obj, prop)) {\n            // @ts-ignore typescript complains about indexing so we remove\n            obj[prop] = proto[prop];\n        }\n    }\n    return obj;\n}\n//# sourceMappingURL=polyfill.js.map","import { __extends } from \"tslib\";\nimport { setPrototypeOf } from './polyfill';\n/** An error emitted by Sentry SDKs and related utilities. */\nvar SentryError = /** @class */ (function (_super) {\n    __extends(SentryError, _super);\n    function SentryError(message) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, message) || this;\n        _this.message = message;\n        _this.name = _newTarget.prototype.constructor.name;\n        setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return SentryError;\n}(Error));\nexport { SentryError };\n//# sourceMappingURL=error.js.map","import { __read } from \"tslib\";\nimport { SentryError } from './error';\nimport { IS_DEBUG_BUILD } from './flags';\n/** Regular expression used to parse a Dsn. */\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\nfunction isValidProtocol(protocol) {\n    return protocol === 'http' || protocol === 'https';\n}\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nexport function dsnToString(dsn, withPassword) {\n    if (withPassword === void 0) { withPassword = false; }\n    var host = dsn.host, path = dsn.path, pass = dsn.pass, port = dsn.port, projectId = dsn.projectId, protocol = dsn.protocol, publicKey = dsn.publicKey;\n    return (protocol + \"://\" + publicKey + (withPassword && pass ? \":\" + pass : '') +\n        (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId));\n}\nfunction dsnFromString(str) {\n    var match = DSN_REGEX.exec(str);\n    if (!match) {\n        throw new SentryError(\"Invalid Sentry Dsn: \" + str);\n    }\n    var _a = __read(match.slice(1), 6), protocol = _a[0], publicKey = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];\n    var path = '';\n    var projectId = lastPath;\n    var split = projectId.split('/');\n    if (split.length > 1) {\n        path = split.slice(0, -1).join('/');\n        projectId = split.pop();\n    }\n    if (projectId) {\n        var projectMatch = projectId.match(/^\\d+/);\n        if (projectMatch) {\n            projectId = projectMatch[0];\n        }\n    }\n    return dsnFromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, publicKey: publicKey });\n}\nfunction dsnFromComponents(components) {\n    // TODO this is for backwards compatibility, and can be removed in a future version\n    if ('user' in components && !('publicKey' in components)) {\n        components.publicKey = components.user;\n    }\n    return {\n        user: components.publicKey || '',\n        protocol: components.protocol,\n        publicKey: components.publicKey || '',\n        pass: components.pass || '',\n        host: components.host,\n        port: components.port || '',\n        path: components.path || '',\n        projectId: components.projectId,\n    };\n}\nfunction validateDsn(dsn) {\n    if (!IS_DEBUG_BUILD) {\n        return;\n    }\n    var port = dsn.port, projectId = dsn.projectId, protocol = dsn.protocol;\n    var requiredComponents = ['protocol', 'publicKey', 'host', 'projectId'];\n    requiredComponents.forEach(function (component) {\n        if (!dsn[component]) {\n            throw new SentryError(\"Invalid Sentry Dsn: \" + component + \" missing\");\n        }\n    });\n    if (!projectId.match(/^\\d+$/)) {\n        throw new SentryError(\"Invalid Sentry Dsn: Invalid projectId \" + projectId);\n    }\n    if (!isValidProtocol(protocol)) {\n        throw new SentryError(\"Invalid Sentry Dsn: Invalid protocol \" + protocol);\n    }\n    if (port && isNaN(parseInt(port, 10))) {\n        throw new SentryError(\"Invalid Sentry Dsn: Invalid port \" + port);\n    }\n    return true;\n}\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nexport function makeDsn(from) {\n    var components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n    validateDsn(components);\n    return components;\n}\n//# sourceMappingURL=dsn.js.map","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Helper to decycle json objects\n */\nexport function memoBuilder() {\n    var hasWeakSet = typeof WeakSet === 'function';\n    var inner = hasWeakSet ? new WeakSet() : [];\n    function memoize(obj) {\n        if (hasWeakSet) {\n            if (inner.has(obj)) {\n                return true;\n            }\n            inner.add(obj);\n            return false;\n        }\n        // eslint-disable-next-line @typescript-eslint/prefer-for-of\n        for (var i = 0; i < inner.length; i++) {\n            var value = inner[i];\n            if (value === obj) {\n                return true;\n            }\n        }\n        inner.push(obj);\n        return false;\n    }\n    function unmemoize(obj) {\n        if (hasWeakSet) {\n            inner.delete(obj);\n        }\n        else {\n            for (var i = 0; i < inner.length; i++) {\n                if (inner[i] === obj) {\n                    inner.splice(i, 1);\n                    break;\n                }\n            }\n        }\n    }\n    return [memoize, unmemoize];\n}\n//# sourceMappingURL=memo.js.map","import { __read } from \"tslib\";\nimport { isError, isEvent, isNaN, isSyntheticEvent } from './is';\nimport { memoBuilder } from './memo';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normallized output..\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\nexport function normalize(input, depth, maxProperties) {\n    if (depth === void 0) { depth = +Infinity; }\n    if (maxProperties === void 0) { maxProperties = +Infinity; }\n    try {\n        // since we're at the outermost level, there is no key\n        return visit('', input, depth, maxProperties);\n    }\n    catch (err) {\n        return { ERROR: \"**non-serializable** (\" + err + \")\" };\n    }\n}\n/** JSDoc */\nexport function normalizeToSize(object, \n// Default Node.js REPL depth\ndepth, \n// 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n    if (depth === void 0) { depth = 3; }\n    if (maxSize === void 0) { maxSize = 100 * 1024; }\n    var normalized = normalize(object, depth);\n    if (jsonSize(normalized) > maxSize) {\n        return normalizeToSize(object, depth - 1, maxSize);\n    }\n    return normalized;\n}\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(key, value, depth, maxProperties, memo) {\n    if (depth === void 0) { depth = +Infinity; }\n    if (maxProperties === void 0) { maxProperties = +Infinity; }\n    if (memo === void 0) { memo = memoBuilder(); }\n    var _a = __read(memo, 2), memoize = _a[0], unmemoize = _a[1];\n    // If the value has a `toJSON` method, see if we can bail and let it do the work\n    var valueWithToJSON = value;\n    if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n        try {\n            return valueWithToJSON.toJSON();\n        }\n        catch (err) {\n            // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n        }\n    }\n    // Get the simple cases out of the way first\n    if (value === null || (['number', 'boolean', 'string'].includes(typeof value) && !isNaN(value))) {\n        return value;\n    }\n    var stringified = stringifyValue(key, value);\n    // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n    // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n    if (!stringified.startsWith('[object ')) {\n        return stringified;\n    }\n    // We're also done if we've reached the max depth\n    if (depth === 0) {\n        // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n        return stringified.replace('object ', '');\n    }\n    // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n    if (memoize(value)) {\n        return '[Circular ~]';\n    }\n    // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n    // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n    // property/entry, and keep track of the number of items we add to it.\n    var normalized = (Array.isArray(value) ? [] : {});\n    var numAdded = 0;\n    // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n    // properties are non-enumerable and otherwise would get missed.\n    var visitable = (isError(value) || isEvent(value) ? convertToPlainObject(value) : value);\n    for (var visitKey in visitable) {\n        // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n        if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n            continue;\n        }\n        if (numAdded >= maxProperties) {\n            normalized[visitKey] = '[MaxProperties ~]';\n            break;\n        }\n        // Recursively visit all the child nodes\n        var visitValue = visitable[visitKey];\n        normalized[visitKey] = visit(visitKey, visitValue, depth - 1, maxProperties, memo);\n        numAdded += 1;\n    }\n    // Once we've visited all the branches, remove the parent from memo storage\n    unmemoize(value);\n    // Return accumulated values\n    return normalized;\n}\n// TODO remove this in v7 (this means the method will no longer be exported, under any name)\nexport { visit as walk };\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(key, \n// this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n// our internal use, it'll do\nvalue) {\n    try {\n        if (key === 'domain' && value && typeof value === 'object' && value._events) {\n            return '[Domain]';\n        }\n        if (key === 'domainEmitter') {\n            return '[DomainEmitter]';\n        }\n        // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n        // which won't throw if they are not present.\n        if (typeof global !== 'undefined' && value === global) {\n            return '[Global]';\n        }\n        // eslint-disable-next-line no-restricted-globals\n        if (typeof window !== 'undefined' && value === window) {\n            return '[Window]';\n        }\n        // eslint-disable-next-line no-restricted-globals\n        if (typeof document !== 'undefined' && value === document) {\n            return '[Document]';\n        }\n        // React's SyntheticEvent thingy\n        if (isSyntheticEvent(value)) {\n            return '[SyntheticEvent]';\n        }\n        if (typeof value === 'number' && value !== value) {\n            return '[NaN]';\n        }\n        // this catches `undefined` (but not `null`, which is a primitive and can be serialized on its own)\n        if (value === void 0) {\n            return '[undefined]';\n        }\n        if (typeof value === 'function') {\n            return \"[Function: \" + getFunctionName(value) + \"]\";\n        }\n        if (typeof value === 'symbol') {\n            return \"[\" + String(value) + \"]\";\n        }\n        // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n        if (typeof value === 'bigint') {\n            return \"[BigInt: \" + String(value) + \"]\";\n        }\n        // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n        // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n        // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n        // we can make sure that only plain objects come out that way.\n        return \"[object \" + Object.getPrototypeOf(value).constructor.name + \"]\";\n    }\n    catch (err) {\n        return \"**non-serializable** (\" + err + \")\";\n    }\n}\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n    // eslint-disable-next-line no-bitwise\n    return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\nfunction jsonSize(value) {\n    return utf8Length(JSON.stringify(value));\n}\n//# sourceMappingURL=normalize.js.map","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { addNonEnumerableProperty, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\nexport var installedIntegrations = [];\n/**\n * @private\n */\nfunction filterDuplicates(integrations) {\n    return integrations.reduce(function (acc, integrations) {\n        if (acc.every(function (accIntegration) { return integrations.name !== accIntegration.name; })) {\n            acc.push(integrations);\n        }\n        return acc;\n    }, []);\n}\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options) {\n    var defaultIntegrations = (options.defaultIntegrations && __spread(options.defaultIntegrations)) || [];\n    var userIntegrations = options.integrations;\n    var integrations = __spread(filterDuplicates(defaultIntegrations));\n    if (Array.isArray(userIntegrations)) {\n        // Filter out integrations that are also included in user options\n        integrations = __spread(integrations.filter(function (integrations) {\n            return userIntegrations.every(function (userIntegration) { return userIntegration.name !== integrations.name; });\n        }), filterDuplicates(userIntegrations));\n    }\n    else if (typeof userIntegrations === 'function') {\n        integrations = userIntegrations(integrations);\n        integrations = Array.isArray(integrations) ? integrations : [integrations];\n    }\n    // Make sure that if present, `Debug` integration will always run last\n    var integrationsNames = integrations.map(function (i) { return i.name; });\n    var alwaysLastToRun = 'Debug';\n    if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n        integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n    }\n    return integrations;\n}\n/** Setup given integration */\nexport function setupIntegration(integration) {\n    if (installedIntegrations.indexOf(integration.name) !== -1) {\n        return;\n    }\n    integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n    installedIntegrations.push(integration.name);\n    IS_DEBUG_BUILD && logger.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options) {\n    var integrations = {};\n    getIntegrationsToSetup(options).forEach(function (integration) {\n        integrations[integration.name] = integration;\n        setupIntegration(integration);\n    });\n    // set the `initialized` flag so we don't run through the process again unecessarily; use `Object.defineProperty`\n    // because by default it creates a property which is nonenumerable, which we want since `initialized` shouldn't be\n    // considered a member of the index the way the actual integrations are\n    addNonEnumerableProperty(integrations, 'initialized', true);\n    return integrations;\n}\n//# sourceMappingURL=integration.js.map","import { __assign, __read, __spread, __values } from \"tslib\";\n/* eslint-disable max-lines */\nimport { Scope } from '@sentry/hub';\nimport { checkOrSetAlreadyCaught, dateTimestampInSeconds, isPlainObject, isPrimitive, isThenable, logger, makeDsn, normalize, rejectedSyncPromise, resolvedSyncPromise, SentryError, SyncPromise, truncate, uuid4, } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { setupIntegrations } from './integration';\nvar ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(NodeBackend, options);\n *   }\n *\n *   // ...\n * }\n */\nvar BaseClient = /** @class */ (function () {\n    /**\n     * Initializes this client instance.\n     *\n     * @param backendClass A constructor function to create the backend.\n     * @param options Options for the client.\n     */\n    function BaseClient(backendClass, options) {\n        /** Array of used integrations. */\n        this._integrations = {};\n        /** Number of calls being processed */\n        this._numProcessing = 0;\n        this._backend = new backendClass(options);\n        this._options = options;\n        if (options.dsn) {\n            this._dsn = makeDsn(options.dsn);\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    BaseClient.prototype.captureException = function (exception, hint, scope) {\n        var _this = this;\n        // ensure we haven't captured this very object before\n        if (checkOrSetAlreadyCaught(exception)) {\n            IS_DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n            return;\n        }\n        var eventId = hint && hint.event_id;\n        this._process(this._getBackend()\n            .eventFromException(exception, hint)\n            .then(function (event) { return _this._captureEvent(event, hint, scope); })\n            .then(function (result) {\n            eventId = result;\n        }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n        var _this = this;\n        var eventId = hint && hint.event_id;\n        var promisedEvent = isPrimitive(message)\n            ? this._getBackend().eventFromMessage(String(message), level, hint)\n            : this._getBackend().eventFromException(message, hint);\n        this._process(promisedEvent\n            .then(function (event) { return _this._captureEvent(event, hint, scope); })\n            .then(function (result) {\n            eventId = result;\n        }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureEvent = function (event, hint, scope) {\n        // ensure we haven't captured this very object before\n        if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n            IS_DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n            return;\n        }\n        var eventId = hint && hint.event_id;\n        this._process(this._captureEvent(event, hint, scope).then(function (result) {\n            eventId = result;\n        }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureSession = function (session) {\n        if (!this._isEnabled()) {\n            IS_DEBUG_BUILD && logger.warn('SDK not enabled, will not capture session.');\n            return;\n        }\n        if (!(typeof session.release === 'string')) {\n            IS_DEBUG_BUILD && logger.warn('Discarded session because of missing or non-string release');\n        }\n        else {\n            this._sendSession(session);\n            // After sending, we set init false to indicate it's not the first occurrence\n            session.update({ init: false });\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getDsn = function () {\n        return this._dsn;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getOptions = function () {\n        return this._options;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getTransport = function () {\n        return this._getBackend().getTransport();\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.flush = function (timeout) {\n        var _this = this;\n        return this._isClientDoneProcessing(timeout).then(function (clientFinished) {\n            return _this.getTransport()\n                .close(timeout)\n                .then(function (transportFlushed) { return clientFinished && transportFlushed; });\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.close = function (timeout) {\n        var _this = this;\n        return this.flush(timeout).then(function (result) {\n            _this.getOptions().enabled = false;\n            return result;\n        });\n    };\n    /**\n     * Sets up the integrations\n     */\n    BaseClient.prototype.setupIntegrations = function () {\n        if (this._isEnabled() && !this._integrations.initialized) {\n            this._integrations = setupIntegrations(this._options);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getIntegration = function (integration) {\n        try {\n            return this._integrations[integration.id] || null;\n        }\n        catch (_oO) {\n            IS_DEBUG_BUILD && logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n            return null;\n        }\n    };\n    /** Updates existing session based on the provided event */\n    BaseClient.prototype._updateSessionFromEvent = function (session, event) {\n        var e_1, _a;\n        var crashed = false;\n        var errored = false;\n        var exceptions = event.exception && event.exception.values;\n        if (exceptions) {\n            errored = true;\n            try {\n                for (var exceptions_1 = __values(exceptions), exceptions_1_1 = exceptions_1.next(); !exceptions_1_1.done; exceptions_1_1 = exceptions_1.next()) {\n                    var ex = exceptions_1_1.value;\n                    var mechanism = ex.mechanism;\n                    if (mechanism && mechanism.handled === false) {\n                        crashed = true;\n                        break;\n                    }\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (exceptions_1_1 && !exceptions_1_1.done && (_a = exceptions_1.return)) _a.call(exceptions_1);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n        }\n        // A session is updated and that session update is sent in only one of the two following scenarios:\n        // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n        // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n        var sessionNonTerminal = session.status === 'ok';\n        var shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n        if (shouldUpdateAndSend) {\n            session.update(__assign(__assign({}, (crashed && { status: 'crashed' })), { errors: session.errors || Number(errored || crashed) }));\n            this.captureSession(session);\n        }\n    };\n    /** Deliver captured session to Sentry */\n    BaseClient.prototype._sendSession = function (session) {\n        this._getBackend().sendSession(session);\n    };\n    /**\n     * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n     * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n     *\n     * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n     * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n     * `true`.\n     * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n     * `false` otherwise\n     */\n    BaseClient.prototype._isClientDoneProcessing = function (timeout) {\n        var _this = this;\n        return new SyncPromise(function (resolve) {\n            var ticked = 0;\n            var tick = 1;\n            var interval = setInterval(function () {\n                if (_this._numProcessing == 0) {\n                    clearInterval(interval);\n                    resolve(true);\n                }\n                else {\n                    ticked += tick;\n                    if (timeout && ticked >= timeout) {\n                        clearInterval(interval);\n                        resolve(false);\n                    }\n                }\n            }, tick);\n        });\n    };\n    /** Returns the current backend. */\n    BaseClient.prototype._getBackend = function () {\n        return this._backend;\n    };\n    /** Determines whether this SDK is enabled and a valid Dsn is present. */\n    BaseClient.prototype._isEnabled = function () {\n        return this.getOptions().enabled !== false && this._dsn !== undefined;\n    };\n    /**\n     * Adds common information to events.\n     *\n     * The information includes release and environment from `options`,\n     * breadcrumbs and context (extra, tags and user) from the scope.\n     *\n     * Information that is already present in the event is never overwritten. For\n     * nested objects, such as the context, keys are merged.\n     *\n     * @param event The original event.\n     * @param hint May contain additional information about the original exception.\n     * @param scope A scope containing event metadata.\n     * @returns A new event with more information.\n     */\n    BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n        var _this = this;\n        var _a = this.getOptions(), _b = _a.normalizeDepth, normalizeDepth = _b === void 0 ? 3 : _b, _c = _a.normalizeMaxBreadth, normalizeMaxBreadth = _c === void 0 ? 1000 : _c;\n        var prepared = __assign(__assign({}, event), { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : uuid4()), timestamp: event.timestamp || dateTimestampInSeconds() });\n        this._applyClientOptions(prepared);\n        this._applyIntegrationsMetadata(prepared);\n        // If we have scope given to us, use it as the base for further modifications.\n        // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n        var finalScope = scope;\n        if (hint && hint.captureContext) {\n            finalScope = Scope.clone(finalScope).update(hint.captureContext);\n        }\n        // We prepare the result here with a resolved Event.\n        var result = resolvedSyncPromise(prepared);\n        // This should be the last thing called, since we want that\n        // {@link Hub.addEventProcessor} gets the finished prepared event.\n        if (finalScope) {\n            // In case we have a hub we reassign it.\n            result = finalScope.applyToEvent(prepared, hint);\n        }\n        return result.then(function (evt) {\n            if (evt) {\n                // TODO this is more of the hack trying to solve https://github.com/getsentry/sentry-javascript/issues/2809\n                // it is only attached as extra data to the event if the event somehow skips being normalized\n                evt.sdkProcessingMetadata = __assign(__assign({}, evt.sdkProcessingMetadata), { normalizeDepth: normalize(normalizeDepth) + \" (\" + typeof normalizeDepth + \")\" });\n            }\n            if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n                return _this._normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n            }\n            return evt;\n        });\n    };\n    /**\n     * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n     * Normalized keys:\n     * - `breadcrumbs.data`\n     * - `user`\n     * - `contexts`\n     * - `extra`\n     * @param event Event\n     * @returns Normalized event\n     */\n    BaseClient.prototype._normalizeEvent = function (event, depth, maxBreadth) {\n        if (!event) {\n            return null;\n        }\n        var normalized = __assign(__assign(__assign(__assign(__assign({}, event), (event.breadcrumbs && {\n            breadcrumbs: event.breadcrumbs.map(function (b) { return (__assign(__assign({}, b), (b.data && {\n                data: normalize(b.data, depth, maxBreadth),\n            }))); }),\n        })), (event.user && {\n            user: normalize(event.user, depth, maxBreadth),\n        })), (event.contexts && {\n            contexts: normalize(event.contexts, depth, maxBreadth),\n        })), (event.extra && {\n            extra: normalize(event.extra, depth, maxBreadth),\n        }));\n        // event.contexts.trace stores information about a Transaction. Similarly,\n        // event.spans[] stores information about child Spans. Given that a\n        // Transaction is conceptually a Span, normalization should apply to both\n        // Transactions and Spans consistently.\n        // For now the decision is to skip normalization of Transactions and Spans,\n        // so this block overwrites the normalized event to add back the original\n        // Transaction information prior to normalization.\n        if (event.contexts && event.contexts.trace) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            normalized.contexts.trace = event.contexts.trace;\n        }\n        normalized.sdkProcessingMetadata = __assign(__assign({}, normalized.sdkProcessingMetadata), { baseClientNormalized: true });\n        return normalized;\n    };\n    /**\n     *  Enhances event using the client configuration.\n     *  It takes care of all \"static\" values like environment, release and `dist`,\n     *  as well as truncating overly long values.\n     * @param event event instance to be enhanced\n     */\n    BaseClient.prototype._applyClientOptions = function (event) {\n        var options = this.getOptions();\n        var environment = options.environment, release = options.release, dist = options.dist, _a = options.maxValueLength, maxValueLength = _a === void 0 ? 250 : _a;\n        if (!('environment' in event)) {\n            event.environment = 'environment' in options ? environment : 'production';\n        }\n        if (event.release === undefined && release !== undefined) {\n            event.release = release;\n        }\n        if (event.dist === undefined && dist !== undefined) {\n            event.dist = dist;\n        }\n        if (event.message) {\n            event.message = truncate(event.message, maxValueLength);\n        }\n        var exception = event.exception && event.exception.values && event.exception.values[0];\n        if (exception && exception.value) {\n            exception.value = truncate(exception.value, maxValueLength);\n        }\n        var request = event.request;\n        if (request && request.url) {\n            request.url = truncate(request.url, maxValueLength);\n        }\n    };\n    /**\n     * This function adds all used integrations to the SDK info in the event.\n     * @param event The event that will be filled with all integrations.\n     */\n    BaseClient.prototype._applyIntegrationsMetadata = function (event) {\n        var integrationsArray = Object.keys(this._integrations);\n        if (integrationsArray.length > 0) {\n            event.sdk = event.sdk || {};\n            event.sdk.integrations = __spread((event.sdk.integrations || []), integrationsArray);\n        }\n    };\n    /**\n     * Tells the backend to send this event\n     * @param event The Sentry event to send\n     */\n    BaseClient.prototype._sendEvent = function (event) {\n        this._getBackend().sendEvent(event);\n    };\n    /**\n     * Processes the event and logs an error in case of rejection\n     * @param event\n     * @param hint\n     * @param scope\n     */\n    BaseClient.prototype._captureEvent = function (event, hint, scope) {\n        return this._processEvent(event, hint, scope).then(function (finalEvent) {\n            return finalEvent.event_id;\n        }, function (reason) {\n            IS_DEBUG_BUILD && logger.error(reason);\n            return undefined;\n        });\n    };\n    /**\n     * Processes an event (either error or message) and sends it to Sentry.\n     *\n     * This also adds breadcrumbs and context information to the event. However,\n     * platform specific meta data (such as the User's IP address) must be added\n     * by the SDK implementor.\n     *\n     *\n     * @param event The event to send to Sentry.\n     * @param hint May contain additional information about the original exception.\n     * @param scope A scope containing event metadata.\n     * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n     */\n    BaseClient.prototype._processEvent = function (event, hint, scope) {\n        var _this = this;\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;\n        var transport = this.getTransport();\n        function recordLostEvent(outcome, category) {\n            if (transport.recordLostEvent) {\n                transport.recordLostEvent(outcome, category);\n            }\n        }\n        if (!this._isEnabled()) {\n            return rejectedSyncPromise(new SentryError('SDK not enabled, will not capture event.'));\n        }\n        var isTransaction = event.type === 'transaction';\n        // 1.0 === 100% events are sent\n        // 0.0 === 0% events are sent\n        // Sampling for transaction happens somewhere else\n        if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n            recordLostEvent('sample_rate', 'event');\n            return rejectedSyncPromise(new SentryError(\"Discarding event because it's not included in the random sample (sampling rate = \" + sampleRate + \")\"));\n        }\n        return this._prepareEvent(event, scope, hint)\n            .then(function (prepared) {\n            if (prepared === null) {\n                recordLostEvent('event_processor', event.type || 'event');\n                throw new SentryError('An event processor returned null, will not send event.');\n            }\n            var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n            if (isInternalException || isTransaction || !beforeSend) {\n                return prepared;\n            }\n            var beforeSendResult = beforeSend(prepared, hint);\n            return _ensureBeforeSendRv(beforeSendResult);\n        })\n            .then(function (processedEvent) {\n            if (processedEvent === null) {\n                recordLostEvent('before_send', event.type || 'event');\n                throw new SentryError('`beforeSend` returned `null`, will not send event.');\n            }\n            var session = scope && scope.getSession && scope.getSession();\n            if (!isTransaction && session) {\n                _this._updateSessionFromEvent(session, processedEvent);\n            }\n            _this._sendEvent(processedEvent);\n            return processedEvent;\n        })\n            .then(null, function (reason) {\n            if (reason instanceof SentryError) {\n                throw reason;\n            }\n            _this.captureException(reason, {\n                data: {\n                    __sentry__: true,\n                },\n                originalException: reason,\n            });\n            throw new SentryError(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n        });\n    };\n    /**\n     * Occupies the client with processing and event\n     */\n    BaseClient.prototype._process = function (promise) {\n        var _this = this;\n        this._numProcessing += 1;\n        void promise.then(function (value) {\n            _this._numProcessing -= 1;\n            return value;\n        }, function (reason) {\n            _this._numProcessing -= 1;\n            return reason;\n        });\n    };\n    return BaseClient;\n}());\nexport { BaseClient };\n/**\n * Verifies that return value of configured `beforeSend` is of expected type.\n */\nfunction _ensureBeforeSendRv(rv) {\n    var nullErr = '`beforeSend` method has to return `null` or a valid event.';\n    if (isThenable(rv)) {\n        return rv.then(function (event) {\n            if (!(isPlainObject(event) || event === null)) {\n                throw new SentryError(nullErr);\n            }\n            return event;\n        }, function (e) {\n            throw new SentryError(\"beforeSend rejected with \" + e);\n        });\n    }\n    else if (!(isPlainObject(rv) || rv === null)) {\n        throw new SentryError(nullErr);\n    }\n    return rv;\n}\n//# sourceMappingURL=baseclient.js.map","import { dsnToString, makeDsn, urlEncode } from '@sentry/utils';\nvar SENTRY_API_VERSION = '7';\n/**\n * Helper class to provide urls, headers and metadata that can be used to form\n * different types of requests to Sentry endpoints.\n * Supports both envelopes and regular event requests.\n *\n * @deprecated Please use APIDetails\n **/\nvar API = /** @class */ (function () {\n    /** Create a new instance of API */\n    function API(dsn, metadata, tunnel) {\n        if (metadata === void 0) { metadata = {}; }\n        this.dsn = dsn;\n        this._dsnObject = makeDsn(dsn);\n        this.metadata = metadata;\n        this._tunnel = tunnel;\n    }\n    /** Returns the Dsn object. */\n    API.prototype.getDsn = function () {\n        return this._dsnObject;\n    };\n    /** Does this transport force envelopes? */\n    API.prototype.forceEnvelope = function () {\n        return !!this._tunnel;\n    };\n    /** Returns the prefix to construct Sentry ingestion API endpoints. */\n    API.prototype.getBaseApiEndpoint = function () {\n        return getBaseApiEndpoint(this._dsnObject);\n    };\n    /** Returns the store endpoint URL. */\n    API.prototype.getStoreEndpoint = function () {\n        return getStoreEndpoint(this._dsnObject);\n    };\n    /**\n     * Returns the store endpoint URL with auth in the query string.\n     *\n     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n     */\n    API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n        return getStoreEndpointWithUrlEncodedAuth(this._dsnObject);\n    };\n    /**\n     * Returns the envelope endpoint URL with auth in the query string.\n     *\n     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n     */\n    API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {\n        return getEnvelopeEndpointWithUrlEncodedAuth(this._dsnObject, this._tunnel);\n    };\n    return API;\n}());\nexport { API };\n/** Initializes API Details */\nexport function initAPIDetails(dsn, metadata, tunnel) {\n    return {\n        initDsn: dsn,\n        metadata: metadata || {},\n        dsn: makeDsn(dsn),\n        tunnel: tunnel,\n    };\n}\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn) {\n    var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n    var port = dsn.port ? \":\" + dsn.port : '';\n    return protocol + \"//\" + dsn.host + port + (dsn.path ? \"/\" + dsn.path : '') + \"/api/\";\n}\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn, target) {\n    return \"\" + getBaseApiEndpoint(dsn) + dsn.projectId + \"/\" + target + \"/\";\n}\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn) {\n    return urlEncode({\n        // We send only the minimum set of required information. See\n        // https://github.com/getsentry/sentry-javascript/issues/2572.\n        sentry_key: dsn.publicKey,\n        sentry_version: SENTRY_API_VERSION,\n    });\n}\n/** Returns the store endpoint URL. */\nfunction getStoreEndpoint(dsn) {\n    return _getIngestEndpoint(dsn, 'store');\n}\n/**\n * Returns the store endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getStoreEndpointWithUrlEncodedAuth(dsn) {\n    return getStoreEndpoint(dsn) + \"?\" + _encodedAuth(dsn);\n}\n/** Returns the envelope endpoint URL. */\nfunction _getEnvelopeEndpoint(dsn) {\n    return _getIngestEndpoint(dsn, 'envelope');\n}\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(dsn, tunnel) {\n    return tunnel ? tunnel : _getEnvelopeEndpoint(dsn) + \"?\" + _encodedAuth(dsn);\n}\n/**\n * Returns an object that can be used in request headers.\n * This is needed for node and the old /store endpoint in sentry\n */\nexport function getRequestHeaders(dsn, clientName, clientVersion) {\n    // CHANGE THIS to use metadata but keep clientName and clientVersion compatible\n    var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n    header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n    header.push(\"sentry_key=\" + dsn.publicKey);\n    if (dsn.pass) {\n        header.push(\"sentry_secret=\" + dsn.pass);\n    }\n    return {\n        'Content-Type': 'application/json',\n        'X-Sentry-Auth': header.join(', '),\n    };\n}\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(dsnLike, dialogOptions) {\n    var dsn = makeDsn(dsnLike);\n    var endpoint = getBaseApiEndpoint(dsn) + \"embed/error-page/\";\n    var encodedOptions = \"dsn=\" + dsnToString(dsn);\n    for (var key in dialogOptions) {\n        if (key === 'dsn') {\n            continue;\n        }\n        if (key === 'user') {\n            if (!dialogOptions.user) {\n                continue;\n            }\n            if (dialogOptions.user.name) {\n                encodedOptions += \"&name=\" + encodeURIComponent(dialogOptions.user.name);\n            }\n            if (dialogOptions.user.email) {\n                encodedOptions += \"&email=\" + encodeURIComponent(dialogOptions.user.email);\n            }\n        }\n        else {\n            encodedOptions += \"&\" + encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]);\n        }\n    }\n    return endpoint + \"?\" + encodedOptions;\n}\n//# sourceMappingURL=api.js.map","import { __read, __spread } from \"tslib\";\nimport { isPrimitive } from './is';\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope(headers, items) {\n    if (items === void 0) { items = []; }\n    return [headers, items];\n}\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope(envelope, newItem) {\n    var _a = __read(envelope, 2), headers = _a[0], items = _a[1];\n    return [headers, __spread(items, [newItem])];\n}\n/**\n * Get the type of the envelope. Grabs the type from the first envelope item.\n */\nexport function getEnvelopeType(envelope) {\n    var _a = __read(envelope, 2), _b = __read(_a[1], 1), _c = __read(_b[0], 1), firstItemHeader = _c[0];\n    return firstItemHeader.type;\n}\n/**\n * Serializes an envelope into a string.\n */\nexport function serializeEnvelope(envelope) {\n    var _a = __read(envelope, 2), headers = _a[0], items = _a[1];\n    var serializedHeaders = JSON.stringify(headers);\n    // Have to cast items to any here since Envelope is a union type\n    // Fixed in Typescript 4.2\n    // TODO: Remove any[] cast when we upgrade to TS 4.2\n    // https://github.com/microsoft/TypeScript/issues/36390\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return items.reduce(function (acc, item) {\n        var _a = __read(item, 2), itemHeaders = _a[0], payload = _a[1];\n        // We do not serialize payloads that are primitives\n        var serializedPayload = isPrimitive(payload) ? String(payload) : JSON.stringify(payload);\n        return acc + \"\\n\" + JSON.stringify(itemHeaders) + \"\\n\" + serializedPayload;\n    }, serializedHeaders);\n}\n//# sourceMappingURL=envelope.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { createEnvelope, dsnToString, normalize, serializeEnvelope } from '@sentry/utils';\nimport { getEnvelopeEndpointWithUrlEncodedAuth, getStoreEndpointWithUrlEncodedAuth } from './api';\n/** Extract sdk info from from the API metadata */\nfunction getSdkMetadataForEnvelopeHeader(api) {\n    if (!api.metadata || !api.metadata.sdk) {\n        return;\n    }\n    var _a = api.metadata.sdk, name = _a.name, version = _a.version;\n    return { name: name, version: version };\n}\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event, sdkInfo) {\n    if (!sdkInfo) {\n        return event;\n    }\n    event.sdk = event.sdk || {};\n    event.sdk.name = event.sdk.name || sdkInfo.name;\n    event.sdk.version = event.sdk.version || sdkInfo.version;\n    event.sdk.integrations = __spread((event.sdk.integrations || []), (sdkInfo.integrations || []));\n    event.sdk.packages = __spread((event.sdk.packages || []), (sdkInfo.packages || []));\n    return event;\n}\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(session, api) {\n    var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n    var envelopeHeaders = __assign(__assign({ sent_at: new Date().toISOString() }, (sdkInfo && { sdk: sdkInfo })), (!!api.tunnel && { dsn: dsnToString(api.dsn) }));\n    // I know this is hacky but we don't want to add `sessions` to request type since it's never rate limited\n    var type = 'aggregates' in session ? 'sessions' : 'session';\n    // TODO (v7) Have to cast type because envelope items do not accept a `SentryRequestType`\n    var envelopeItem = [{ type: type }, session];\n    var envelope = createEnvelope(envelopeHeaders, [envelopeItem]);\n    return [envelope, type];\n}\n/** Creates a SentryRequest from a Session. */\nexport function sessionToSentryRequest(session, api) {\n    var _a = __read(createSessionEnvelope(session, api), 2), envelope = _a[0], type = _a[1];\n    return {\n        body: serializeEnvelope(envelope),\n        type: type,\n        url: getEnvelopeEndpointWithUrlEncodedAuth(api.dsn, api.tunnel),\n    };\n}\n/**\n * Create an Envelope from an event. Note that this is duplicated from below,\n * but on purpose as this will be refactored in v7.\n */\nexport function createEventEnvelope(event, api) {\n    var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n    var eventType = event.type || 'event';\n    var transactionSampling = (event.sdkProcessingMetadata || {}).transactionSampling;\n    var _a = transactionSampling || {}, samplingMethod = _a.method, sampleRate = _a.rate;\n    // TODO: Below is a temporary hack in order to debug a serialization error - see\n    // https://github.com/getsentry/sentry-javascript/issues/2809,\n    // https://github.com/getsentry/sentry-javascript/pull/4425, and\n    // https://github.com/getsentry/sentry-javascript/pull/4574.\n    //\n    // TL; DR: even though we normalize all events (which should prevent this), something is causing `JSON.stringify` to\n    // throw a circular reference error.\n    //\n    // When it's time to remove it:\n    // 1. Delete everything between here and where the request object `req` is created, EXCEPT the line deleting\n    //    `sdkProcessingMetadata`\n    // 2. Restore the original version of the request body, which is commented out\n    // 3. Search for either of the PR URLs above and pull out the companion hacks in the browser playwright tests and the\n    //    baseClient tests in this package\n    enhanceEventWithSdkInfo(event, api.metadata.sdk);\n    event.tags = event.tags || {};\n    event.extra = event.extra || {};\n    // In theory, all events should be marked as having gone through normalization and so\n    // we should never set this tag/extra data\n    if (!(event.sdkProcessingMetadata && event.sdkProcessingMetadata.baseClientNormalized)) {\n        event.tags.skippedNormalization = true;\n        event.extra.normalizeDepth = event.sdkProcessingMetadata ? event.sdkProcessingMetadata.normalizeDepth : 'unset';\n    }\n    // prevent this data from being sent to sentry\n    // TODO: This is NOT part of the hack - DO NOT DELETE\n    delete event.sdkProcessingMetadata;\n    var envelopeHeaders = __assign(__assign({ event_id: event.event_id, sent_at: new Date().toISOString() }, (sdkInfo && { sdk: sdkInfo })), (!!api.tunnel && { dsn: dsnToString(api.dsn) }));\n    var eventItem = [\n        {\n            type: eventType,\n            sample_rates: [{ id: samplingMethod, rate: sampleRate }],\n        },\n        event,\n    ];\n    return createEnvelope(envelopeHeaders, [eventItem]);\n}\n/** Creates a SentryRequest from an event. */\nexport function eventToSentryRequest(event, api) {\n    var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n    var eventType = event.type || 'event';\n    var useEnvelope = eventType === 'transaction' || !!api.tunnel;\n    var transactionSampling = (event.sdkProcessingMetadata || {}).transactionSampling;\n    var _a = transactionSampling || {}, samplingMethod = _a.method, sampleRate = _a.rate;\n    // TODO: Below is a temporary hack in order to debug a serialization error - see\n    // https://github.com/getsentry/sentry-javascript/issues/2809,\n    // https://github.com/getsentry/sentry-javascript/pull/4425, and\n    // https://github.com/getsentry/sentry-javascript/pull/4574.\n    //\n    // TL; DR: even though we normalize all events (which should prevent this), something is causing `JSON.stringify` to\n    // throw a circular reference error.\n    //\n    // When it's time to remove it:\n    // 1. Delete everything between here and where the request object `req` is created, EXCEPT the line deleting\n    //    `sdkProcessingMetadata`\n    // 2. Restore the original version of the request body, which is commented out\n    // 3. Search for either of the PR URLs above and pull out the companion hacks in the browser playwright tests and the\n    //    baseClient tests in this package\n    enhanceEventWithSdkInfo(event, api.metadata.sdk);\n    event.tags = event.tags || {};\n    event.extra = event.extra || {};\n    // In theory, all events should be marked as having gone through normalization and so\n    // we should never set this tag/extra data\n    if (!(event.sdkProcessingMetadata && event.sdkProcessingMetadata.baseClientNormalized)) {\n        event.tags.skippedNormalization = true;\n        event.extra.normalizeDepth = event.sdkProcessingMetadata ? event.sdkProcessingMetadata.normalizeDepth : 'unset';\n    }\n    // prevent this data from being sent to sentry\n    // TODO: This is NOT part of the hack - DO NOT DELETE\n    delete event.sdkProcessingMetadata;\n    var body;\n    try {\n        // 99.9% of events should get through just fine - no change in behavior for them\n        body = JSON.stringify(event);\n    }\n    catch (err) {\n        // Record data about the error without replacing original event data, then force renormalization\n        event.tags.JSONStringifyError = true;\n        event.extra.JSONStringifyError = err;\n        try {\n            body = JSON.stringify(normalize(event));\n        }\n        catch (newErr) {\n            // At this point even renormalization hasn't worked, meaning something about the event data has gone very wrong.\n            // Time to cut our losses and record only the new error. With luck, even in the problematic cases we're trying to\n            // debug with this hack, we won't ever land here.\n            var innerErr = newErr;\n            body = JSON.stringify({\n                message: 'JSON.stringify error after renormalization',\n                // setting `extra: { innerErr }` here for some reason results in an empty object, so unpack manually\n                extra: { message: innerErr.message, stack: innerErr.stack },\n            });\n        }\n    }\n    var req = {\n        // this is the relevant line of code before the hack was added, to make it easy to undo said hack once we've solved\n        // the mystery\n        // body: JSON.stringify(sdkInfo ? enhanceEventWithSdkInfo(event, api.metadata.sdk) : event),\n        body: body,\n        type: eventType,\n        url: useEnvelope\n            ? getEnvelopeEndpointWithUrlEncodedAuth(api.dsn, api.tunnel)\n            : getStoreEndpointWithUrlEncodedAuth(api.dsn),\n    };\n    // https://develop.sentry.dev/sdk/envelopes/\n    // Since we don't need to manipulate envelopes nor store them, there is no\n    // exported concept of an Envelope with operations including serialization and\n    // deserialization. Instead, we only implement a minimal subset of the spec to\n    // serialize events inline here.\n    if (useEnvelope) {\n        var envelopeHeaders = __assign(__assign({ event_id: event.event_id, sent_at: new Date().toISOString() }, (sdkInfo && { sdk: sdkInfo })), (!!api.tunnel && { dsn: dsnToString(api.dsn) }));\n        var eventItem = [\n            {\n                type: eventType,\n                sample_rates: [{ id: samplingMethod, rate: sampleRate }],\n            },\n            req.body,\n        ];\n        var envelope = createEnvelope(envelopeHeaders, [eventItem]);\n        req.body = serializeEnvelope(envelope);\n    }\n    return req;\n}\n//# sourceMappingURL=request.js.map","import { resolvedSyncPromise } from '@sentry/utils';\n/** Noop transport */\nvar NoopTransport = /** @class */ (function () {\n    function NoopTransport() {\n    }\n    /**\n     * @inheritDoc\n     */\n    NoopTransport.prototype.sendEvent = function (_) {\n        return resolvedSyncPromise({\n            reason: 'NoopTransport: Event has been skipped because no Dsn is configured.',\n            status: 'skipped',\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    NoopTransport.prototype.close = function (_) {\n        return resolvedSyncPromise(true);\n    };\n    return NoopTransport;\n}());\nexport { NoopTransport };\n//# sourceMappingURL=noop.js.map","import { __read } from \"tslib\";\nimport { logger, SentryError } from '@sentry/utils';\nimport { initAPIDetails } from './api';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { createEventEnvelope, createSessionEnvelope } from './request';\nimport { NoopTransport } from './transports/noop';\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nvar BaseBackend = /** @class */ (function () {\n    /** Creates a new backend instance. */\n    function BaseBackend(options) {\n        this._options = options;\n        if (!this._options.dsn) {\n            IS_DEBUG_BUILD && logger.warn('No DSN provided, backend will not do anything.');\n        }\n        this._transport = this._setupTransport();\n    }\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n        throw new SentryError('Backend has to implement `eventFromException` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n        throw new SentryError('Backend has to implement `eventFromMessage` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.sendEvent = function (event) {\n        // TODO(v7): Remove the if-else\n        if (this._newTransport &&\n            this._options.dsn &&\n            this._options._experiments &&\n            this._options._experiments.newTransport) {\n            var api = initAPIDetails(this._options.dsn, this._options._metadata, this._options.tunnel);\n            var env = createEventEnvelope(event, api);\n            void this._newTransport.send(env).then(null, function (reason) {\n                IS_DEBUG_BUILD && logger.error('Error while sending event:', reason);\n            });\n        }\n        else {\n            void this._transport.sendEvent(event).then(null, function (reason) {\n                IS_DEBUG_BUILD && logger.error('Error while sending event:', reason);\n            });\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.sendSession = function (session) {\n        if (!this._transport.sendSession) {\n            IS_DEBUG_BUILD && logger.warn(\"Dropping session because custom transport doesn't implement sendSession\");\n            return;\n        }\n        // TODO(v7): Remove the if-else\n        if (this._newTransport &&\n            this._options.dsn &&\n            this._options._experiments &&\n            this._options._experiments.newTransport) {\n            var api = initAPIDetails(this._options.dsn, this._options._metadata, this._options.tunnel);\n            var _a = __read(createSessionEnvelope(session, api), 1), env = _a[0];\n            void this._newTransport.send(env).then(null, function (reason) {\n                IS_DEBUG_BUILD && logger.error('Error while sending session:', reason);\n            });\n        }\n        else {\n            void this._transport.sendSession(session).then(null, function (reason) {\n                IS_DEBUG_BUILD && logger.error('Error while sending session:', reason);\n            });\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.getTransport = function () {\n        return this._transport;\n    };\n    /**\n     * Sets up the transport so it can be used later to send requests.\n     */\n    BaseBackend.prototype._setupTransport = function () {\n        return new NoopTransport();\n    };\n    return BaseBackend;\n}());\nexport { BaseBackend };\n//# sourceMappingURL=basebackend.js.map","/**\n * TODO(v7): Remove this enum and replace with SeverityLevel\n */\nexport var Severity;\n(function (Severity) {\n    /** JSDoc */\n    Severity[\"Fatal\"] = \"fatal\";\n    /** JSDoc */\n    Severity[\"Error\"] = \"error\";\n    /** JSDoc */\n    Severity[\"Warning\"] = \"warning\";\n    /** JSDoc */\n    Severity[\"Log\"] = \"log\";\n    /** JSDoc */\n    Severity[\"Info\"] = \"info\";\n    /** JSDoc */\n    Severity[\"Debug\"] = \"debug\";\n    /** JSDoc */\n    Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {}));\n// TODO: in v7, these can disappear, because they now also exist in `@sentry/utils`. (Having them there rather than here\n// is nice because then it enforces the idea that only types are exported from `@sentry/types`.)\nexport var SeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug', 'critical'];\n//# sourceMappingURL=severity.js.map","import { __read } from \"tslib\";\n// global reference to slice\nvar UNKNOWN_FUNCTION = '?';\nvar OPERA10_PRIORITY = 10;\nvar OPERA11_PRIORITY = 20;\nvar CHROME_PRIORITY = 30;\nvar WINJS_PRIORITY = 40;\nvar GECKO_PRIORITY = 50;\nfunction createFrame(filename, func, lineno, colno) {\n    var frame = {\n        filename: filename,\n        function: func,\n        // All browser frames are considered in_app\n        in_app: true,\n    };\n    if (lineno !== undefined) {\n        frame.lineno = lineno;\n    }\n    if (colno !== undefined) {\n        frame.colno = colno;\n    }\n    return frame;\n}\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nvar chromeRegex = /^\\s*at (?:(.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nvar chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\nvar chrome = function (line) {\n    var parts = chromeRegex.exec(line);\n    if (parts) {\n        var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n        if (isEval) {\n            var subMatch = chromeEvalRegex.exec(parts[2]);\n            if (subMatch) {\n                // throw out eval line/column and use top-most line/column number\n                parts[2] = subMatch[1]; // url\n                parts[3] = subMatch[2]; // line\n                parts[4] = subMatch[3]; // column\n            }\n        }\n        // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n        // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n        var _a = __read(extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]), 2), func = _a[0], filename = _a[1];\n        return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n    }\n    return;\n};\nexport var chromeStackParser = [CHROME_PRIORITY, chrome];\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nvar geckoREgex = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nvar gecko = function (line) {\n    var _a;\n    var parts = geckoREgex.exec(line);\n    if (parts) {\n        var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n        if (isEval) {\n            var subMatch = geckoEvalRegex.exec(parts[3]);\n            if (subMatch) {\n                // throw out eval line/column and use top-most line number\n                parts[1] = parts[1] || 'eval';\n                parts[3] = subMatch[1];\n                parts[4] = subMatch[2];\n                parts[5] = ''; // no column when eval\n            }\n        }\n        var filename = parts[3];\n        var func = parts[1] || UNKNOWN_FUNCTION;\n        _a = __read(extractSafariExtensionDetails(func, filename), 2), func = _a[0], filename = _a[1];\n        return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n    }\n    return;\n};\nexport var geckoStackParser = [GECKO_PRIORITY, gecko];\nvar winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nvar winjs = function (line) {\n    var parts = winjsRegex.exec(line);\n    return parts\n        ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n        : undefined;\n};\nexport var winjsStackParser = [WINJS_PRIORITY, winjs];\nvar opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\nvar opera10 = function (line) {\n    var parts = opera10Regex.exec(line);\n    return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\nexport var opera10StackParser = [OPERA10_PRIORITY, opera10];\nvar opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\nvar opera11 = function (line) {\n    var parts = opera11Regex.exec(line);\n    return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\nexport var opera11StackParser = [OPERA11_PRIORITY, opera11];\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n *   at function@url:row:col\n *   at function@url:row:col\n *   at function@url:row:col\n *\n * it produces something like:\n *\n *   function@url:row:col\n *   function@url:row:col\n *   function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nvar extractSafariExtensionDetails = function (func, filename) {\n    var isSafariExtension = func.indexOf('safari-extension') !== -1;\n    var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n    return isSafariExtension || isSafariWebExtension\n        ? [\n            func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n            isSafariExtension ? \"safari-extension:\" + filename : \"safari-web-extension:\" + filename,\n        ]\n        : [func, filename];\n};\n//# sourceMappingURL=stack-parsers.js.map","import { __assign } from \"tslib\";\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addExceptionTypeValue, createStackParser, extractExceptionKeysForMessage, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, normalizeToSize, resolvedSyncPromise, } from '@sentry/utils';\nimport { chromeStackParser, geckoStackParser, opera10StackParser, opera11StackParser, winjsStackParser, } from './stack-parsers';\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromError(ex) {\n    // Get the frames first since Opera can lose the stack if we touch anything else first\n    var frames = parseStackFrames(ex);\n    var exception = {\n        type: ex && ex.name,\n        value: extractMessage(ex),\n    };\n    if (frames.length) {\n        exception.stacktrace = { frames: frames };\n    }\n    if (exception.type === undefined && exception.value === '') {\n        exception.value = 'Unrecoverable error caught';\n    }\n    return exception;\n}\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception, syntheticException, isUnhandledRejection) {\n    var event = {\n        exception: {\n            values: [\n                {\n                    type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n                    value: \"Non-Error \" + (isUnhandledRejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception),\n                },\n            ],\n        },\n        extra: {\n            __serialized__: normalizeToSize(exception),\n        },\n    };\n    if (syntheticException) {\n        var frames_1 = parseStackFrames(syntheticException);\n        if (frames_1.length) {\n            event.stacktrace = { frames: frames_1 };\n        }\n    }\n    return event;\n}\n/**\n * @hidden\n */\nexport function eventFromError(ex) {\n    return {\n        exception: {\n            values: [exceptionFromError(ex)],\n        },\n    };\n}\n/** Parses stack frames from an error */\nexport function parseStackFrames(ex) {\n    // Access and store the stacktrace property before doing ANYTHING\n    // else to it because Opera is not very good at providing it\n    // reliably in other circumstances.\n    var stacktrace = ex.stacktrace || ex.stack || '';\n    var popSize = getPopSize(ex);\n    try {\n        return createStackParser(opera10StackParser, opera11StackParser, chromeStackParser, winjsStackParser, geckoStackParser)(stacktrace, popSize);\n    }\n    catch (e) {\n        // no-empty\n    }\n    return [];\n}\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nvar reactMinifiedRegexp = /Minified React error #\\d+;/i;\nfunction getPopSize(ex) {\n    if (ex) {\n        if (typeof ex.framesToPop === 'number') {\n            return ex.framesToPop;\n        }\n        if (reactMinifiedRegexp.test(ex.message)) {\n            return 1;\n        }\n    }\n    return 0;\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n    var message = ex && ex.message;\n    if (!message) {\n        return 'No error message';\n    }\n    if (message.error && typeof message.error.message === 'string') {\n        return message.error.message;\n    }\n    return message;\n}\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(exception, hint, attachStacktrace) {\n    var syntheticException = (hint && hint.syntheticException) || undefined;\n    var event = eventFromUnknownInput(exception, syntheticException, attachStacktrace);\n    addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n    event.level = Severity.Error;\n    if (hint && hint.event_id) {\n        event.event_id = hint.event_id;\n    }\n    return resolvedSyncPromise(event);\n}\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(message, level, hint, attachStacktrace) {\n    if (level === void 0) { level = Severity.Info; }\n    var syntheticException = (hint && hint.syntheticException) || undefined;\n    var event = eventFromString(message, syntheticException, attachStacktrace);\n    event.level = level;\n    if (hint && hint.event_id) {\n        event.event_id = hint.event_id;\n    }\n    return resolvedSyncPromise(event);\n}\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(exception, syntheticException, attachStacktrace, isUnhandledRejection) {\n    var event;\n    if (isErrorEvent(exception) && exception.error) {\n        // If it is an ErrorEvent with `error` property, extract it to get actual Error\n        var errorEvent = exception;\n        return eventFromError(errorEvent.error);\n    }\n    // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n    // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n    // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n    //\n    // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n    // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n    // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n    if (isDOMError(exception) || isDOMException(exception)) {\n        var domException = exception;\n        if ('stack' in exception) {\n            event = eventFromError(exception);\n        }\n        else {\n            var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n            var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n            event = eventFromString(message, syntheticException, attachStacktrace);\n            addExceptionTypeValue(event, message);\n        }\n        if ('code' in domException) {\n            event.tags = __assign(__assign({}, event.tags), { 'DOMException.code': \"\" + domException.code });\n        }\n        return event;\n    }\n    if (isError(exception)) {\n        // we have a real Error object, do nothing\n        return eventFromError(exception);\n    }\n    if (isPlainObject(exception) || isEvent(exception)) {\n        // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n        // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n        // group on any key/value change.\n        var objectException = exception;\n        event = eventFromPlainObject(objectException, syntheticException, isUnhandledRejection);\n        addExceptionMechanism(event, {\n            synthetic: true,\n        });\n        return event;\n    }\n    // If none of previous checks were valid, then it means that it's not:\n    // - an instance of DOMError\n    // - an instance of DOMException\n    // - an instance of Event\n    // - an instance of Error\n    // - a valid ErrorEvent (one with an error property)\n    // - a plain Object\n    //\n    // So bail out and capture it as a simple message:\n    event = eventFromString(exception, syntheticException, attachStacktrace);\n    addExceptionTypeValue(event, \"\" + exception, undefined);\n    addExceptionMechanism(event, {\n        synthetic: true,\n    });\n    return event;\n}\n/**\n * @hidden\n */\nexport function eventFromString(input, syntheticException, attachStacktrace) {\n    var event = {\n        message: input,\n    };\n    if (attachStacktrace && syntheticException) {\n        var frames_2 = parseStackFrames(syntheticException);\n        if (frames_2.length) {\n            event.stacktrace = { frames: frames_2 };\n        }\n    }\n    return event;\n}\n//# sourceMappingURL=eventbuilder.js.map","import { SentryError } from './error';\nimport { rejectedSyncPromise, resolvedSyncPromise, SyncPromise } from './syncpromise';\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer(limit) {\n    var buffer = [];\n    function isReady() {\n        return limit === undefined || buffer.length < limit;\n    }\n    /**\n     * Remove a promise from the queue.\n     *\n     * @param task Can be any PromiseLike<T>\n     * @returns Removed promise.\n     */\n    function remove(task) {\n        return buffer.splice(buffer.indexOf(task), 1)[0];\n    }\n    /**\n     * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n     *\n     * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n     *        PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n     *        functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n     *        requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n     *        limit check.\n     * @returns The original promise.\n     */\n    function add(taskProducer) {\n        if (!isReady()) {\n            return rejectedSyncPromise(new SentryError('Not adding Promise due to buffer limit reached.'));\n        }\n        // start the task and add its promise to the queue\n        var task = taskProducer();\n        if (buffer.indexOf(task) === -1) {\n            buffer.push(task);\n        }\n        void task\n            .then(function () { return remove(task); })\n            // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n            // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n            // have promises, so TS has to polyfill when down-compiling.)\n            .then(null, function () {\n            return remove(task).then(null, function () {\n                // We have to add another catch here because `remove()` starts a new promise chain.\n            });\n        });\n        return task;\n    }\n    /**\n     * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n     *\n     * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n     * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n     * `true`.\n     * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n     * `false` otherwise\n     */\n    function drain(timeout) {\n        return new SyncPromise(function (resolve, reject) {\n            var counter = buffer.length;\n            if (!counter) {\n                return resolve(true);\n            }\n            // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n            var capturedSetTimeout = setTimeout(function () {\n                if (timeout && timeout > 0) {\n                    resolve(false);\n                }\n            }, timeout);\n            // if all promises resolve in time, cancel the timer and resolve to `true`\n            buffer.forEach(function (item) {\n                void resolvedSyncPromise(item).then(function () {\n                    // eslint-disable-next-line no-plusplus\n                    if (!--counter) {\n                        clearTimeout(capturedSetTimeout);\n                        resolve(true);\n                    }\n                }, reject);\n            });\n        });\n    }\n    return {\n        $: buffer,\n        add: add,\n        drain: drain,\n    };\n}\n//# sourceMappingURL=promisebuffer.js.map","import { __assign, __values } from \"tslib\";\nexport var DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nexport function parseRetryAfterHeader(header, now) {\n    if (now === void 0) { now = Date.now(); }\n    var headerDelay = parseInt(\"\" + header, 10);\n    if (!isNaN(headerDelay)) {\n        return headerDelay * 1000;\n    }\n    var headerDate = Date.parse(\"\" + header);\n    if (!isNaN(headerDate)) {\n        return headerDate - now;\n    }\n    return DEFAULT_RETRY_AFTER;\n}\n/**\n * Gets the time that given category is disabled until for rate limiting\n */\nexport function disabledUntil(limits, category) {\n    return limits[category] || limits.all || 0;\n}\n/**\n * Checks if a category is rate limited\n */\nexport function isRateLimited(limits, category, now) {\n    if (now === void 0) { now = Date.now(); }\n    return disabledUntil(limits, category) > now;\n}\n/**\n * Update ratelimits from incoming headers.\n * Returns true if headers contains a non-empty rate limiting header.\n */\nexport function updateRateLimits(limits, headers, now) {\n    var e_1, _a, e_2, _b;\n    if (now === void 0) { now = Date.now(); }\n    var updatedRateLimits = __assign({}, limits);\n    // \"The name is case-insensitive.\"\n    // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n    var rateLimitHeader = headers['x-sentry-rate-limits'];\n    var retryAfterHeader = headers['retry-after'];\n    if (rateLimitHeader) {\n        try {\n            /**\n             * rate limit headers are of the form\n             *     <header>,<header>,..\n             * where each <header> is of the form\n             *     <retry_after>: <categories>: <scope>: <reason_code>\n             * where\n             *     <retry_after> is a delay in seconds\n             *     <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n             *         <category>;<category>;...\n             *     <scope> is what's being limited (org, project, or key) - ignored by SDK\n             *     <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n             */\n            for (var _c = __values(rateLimitHeader.trim().split(',')), _d = _c.next(); !_d.done; _d = _c.next()) {\n                var limit = _d.value;\n                var parameters = limit.split(':', 2);\n                var headerDelay = parseInt(parameters[0], 10);\n                var delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n                if (!parameters[1]) {\n                    updatedRateLimits.all = now + delay;\n                }\n                else {\n                    try {\n                        for (var _e = (e_2 = void 0, __values(parameters[1].split(';'))), _f = _e.next(); !_f.done; _f = _e.next()) {\n                            var category = _f.value;\n                            updatedRateLimits[category] = now + delay;\n                        }\n                    }\n                    catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                    finally {\n                        try {\n                            if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n                        }\n                        finally { if (e_2) throw e_2.error; }\n                    }\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n    }\n    else if (retryAfterHeader) {\n        updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n    }\n    return updatedRateLimits;\n}\n//# sourceMappingURL=ratelimit.js.map","/**\n * Converts an HTTP status code to sentry status {@link EventStatus}.\n *\n * @param code number HTTP status code\n * @returns EventStatus\n */\nexport function eventStatusFromHttpCode(code) {\n    if (code >= 200 && code < 300) {\n        return 'success';\n    }\n    if (code === 429) {\n        return 'rate_limit';\n    }\n    if (code >= 400 && code < 500) {\n        return 'invalid';\n    }\n    if (code >= 500) {\n        return 'failed';\n    }\n    return 'unknown';\n}\n//# sourceMappingURL=status.js.map","import { disabledUntil, eventStatusFromHttpCode, getEnvelopeType, isRateLimited, makePromiseBuffer, rejectedSyncPromise, resolvedSyncPromise, serializeEnvelope, updateRateLimits, } from '@sentry/utils';\nexport var ERROR_TRANSPORT_CATEGORY = 'error';\nexport var TRANSACTION_TRANSPORT_CATEGORY = 'transaction';\nexport var ATTACHMENT_TRANSPORT_CATEGORY = 'attachment';\nexport var SESSION_TRANSPORT_CATEGORY = 'session';\nexport var DEFAULT_TRANSPORT_BUFFER_SIZE = 30;\n/**\n * Creates a `NewTransport`\n *\n * @param options\n * @param makeRequest\n */\nexport function createTransport(options, makeRequest, buffer) {\n    if (buffer === void 0) { buffer = makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE); }\n    var rateLimits = {};\n    var flush = function (timeout) { return buffer.drain(timeout); };\n    function send(envelope) {\n        var envCategory = getEnvelopeType(envelope);\n        var category = envCategory === 'event' ? 'error' : envCategory;\n        var request = {\n            category: category,\n            body: serializeEnvelope(envelope),\n        };\n        // Don't add to buffer if transport is already rate-limited\n        if (isRateLimited(rateLimits, category)) {\n            return rejectedSyncPromise({\n                status: 'rate_limit',\n                reason: getRateLimitReason(rateLimits, category),\n            });\n        }\n        var requestTask = function () {\n            return makeRequest(request).then(function (_a) {\n                var body = _a.body, headers = _a.headers, reason = _a.reason, statusCode = _a.statusCode;\n                var status = eventStatusFromHttpCode(statusCode);\n                if (headers) {\n                    rateLimits = updateRateLimits(rateLimits, headers);\n                }\n                if (status === 'success') {\n                    return resolvedSyncPromise({ status: status, reason: reason });\n                }\n                return rejectedSyncPromise({\n                    status: status,\n                    reason: reason ||\n                        body ||\n                        (status === 'rate_limit' ? getRateLimitReason(rateLimits, category) : 'Unknown transport error'),\n                });\n            });\n        };\n        return buffer.add(requestTask);\n    }\n    return {\n        send: send,\n        flush: flush,\n    };\n}\nfunction getRateLimitReason(rateLimits, category) {\n    return \"Too many \" + category + \" requests, backing off until: \" + new Date(disabledUntil(rateLimits, category)).toISOString();\n}\n//# sourceMappingURL=base.js.map","/**\n * Consumes the promise and logs the error when it rejects.\n * @param promise A promise to forget.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function forget(promise) {\n    void promise.then(null, function (e) {\n        // TODO: Use a better logging mechanism\n        // eslint-disable-next-line no-console\n        console.error(e);\n    });\n}\n//# sourceMappingURL=async.js.map","/*\n * This file defines flags and constants that can be modified during compile time in order to facilitate tree shaking\n * for users.\n *\n * Debug flags need to be declared in each package individually and must not be imported across package boundaries,\n * because some build tools have trouble tree-shaking imported guards.\n *\n * As a convention, we define debug flags in a `flags.ts` file in the root of a package's `src` folder.\n *\n * Debug flag files will contain \"magic strings\" like `__SENTRY_DEBUG__` that may get replaced with actual values during\n * our, or the user's build process. Take care when introducing new flags - they must not throw if they are not\n * replaced.\n */\n/** Flag that is true for debug builds, false otherwise. */\nexport var IS_DEBUG_BUILD = typeof __SENTRY_DEBUG__ === 'undefined' ? true : __SENTRY_DEBUG__;\n//# sourceMappingURL=flags.js.map","import { forget, getGlobalObject, isNativeFetch, logger, supportsFetch } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\nvar global = getGlobalObject();\nvar cachedFetchImpl;\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n *   const p = f.apply(this, arguments);\n *\n *   p.then(function() {\n *     console.log('hi.');\n *   });\n *\n *   return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome:  Failed to fetch\n * Edge:    Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari:  resource blocked by content blocker\n */\nexport function getNativeFetchImplementation() {\n    if (cachedFetchImpl) {\n        return cachedFetchImpl;\n    }\n    /* eslint-disable @typescript-eslint/unbound-method */\n    // Fast path to avoid DOM I/O\n    if (isNativeFetch(global.fetch)) {\n        return (cachedFetchImpl = global.fetch.bind(global));\n    }\n    var document = global.document;\n    var fetchImpl = global.fetch;\n    // eslint-disable-next-line deprecation/deprecation\n    if (document && typeof document.createElement === 'function') {\n        try {\n            var sandbox = document.createElement('iframe');\n            sandbox.hidden = true;\n            document.head.appendChild(sandbox);\n            var contentWindow = sandbox.contentWindow;\n            if (contentWindow && contentWindow.fetch) {\n                fetchImpl = contentWindow.fetch;\n            }\n            document.head.removeChild(sandbox);\n        }\n        catch (e) {\n            IS_DEBUG_BUILD &&\n                logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n        }\n    }\n    return (cachedFetchImpl = fetchImpl.bind(global));\n    /* eslint-enable @typescript-eslint/unbound-method */\n}\n/**\n * Sends sdk client report using sendBeacon or fetch as a fallback if available\n *\n * @param url report endpoint\n * @param body report payload\n */\nexport function sendReport(url, body) {\n    var isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';\n    var hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';\n    if (hasSendBeacon) {\n        // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n        var sendBeacon = global.navigator.sendBeacon.bind(global.navigator);\n        return sendBeacon(url, body);\n    }\n    if (supportsFetch()) {\n        var fetch_1 = getNativeFetchImplementation();\n        return forget(fetch_1(url, {\n            body: body,\n            method: 'POST',\n            credentials: 'omit',\n            keepalive: true,\n        }));\n    }\n}\n//# sourceMappingURL=utils.js.map","import { __assign } from \"tslib\";\nimport { createTransport, } from '@sentry/core';\nimport { getNativeFetchImplementation } from './utils';\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeNewFetchTransport(options, nativeFetch) {\n    if (nativeFetch === void 0) { nativeFetch = getNativeFetchImplementation(); }\n    function makeRequest(request) {\n        var requestOptions = __assign({ body: request.body, method: 'POST', referrerPolicy: 'origin' }, options.requestOptions);\n        return nativeFetch(options.url, requestOptions).then(function (response) {\n            return response.text().then(function (body) { return ({\n                body: body,\n                headers: {\n                    'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n                    'retry-after': response.headers.get('Retry-After'),\n                },\n                reason: response.statusText,\n                statusCode: response.status,\n            }); });\n        });\n    }\n    return createTransport({ bufferSize: options.bufferSize }, makeRequest);\n}\n//# sourceMappingURL=new-fetch.js.map","import { createEnvelope } from './envelope';\nimport { dateTimestampInSeconds } from './time';\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nexport function createClientReportEnvelope(discarded_events, dsn, timestamp) {\n    var clientReportItem = [\n        { type: 'client_report' },\n        {\n            timestamp: timestamp || dateTimestampInSeconds(),\n            discarded_events: discarded_events,\n        },\n    ];\n    return createEnvelope(dsn ? { dsn: dsn } : {}, [clientReportItem]);\n}\n//# sourceMappingURL=clientreport.js.map","import { __read } from \"tslib\";\nimport { eventToSentryRequest, getEnvelopeEndpointWithUrlEncodedAuth, getStoreEndpointWithUrlEncodedAuth, initAPIDetails, sessionToSentryRequest, } from '@sentry/core';\nimport { createClientReportEnvelope, disabledUntil, dsnToString, eventStatusFromHttpCode, getGlobalObject, isRateLimited, logger, makePromiseBuffer, serializeEnvelope, updateRateLimits, } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\nimport { sendReport } from './utils';\nfunction requestTypeToCategory(ty) {\n    var tyStr = ty;\n    return tyStr === 'event' ? 'error' : tyStr;\n}\nvar global = getGlobalObject();\n/** Base Transport class implementation */\nvar BaseTransport = /** @class */ (function () {\n    function BaseTransport(options) {\n        var _this = this;\n        this.options = options;\n        /** A simple buffer holding all requests. */\n        this._buffer = makePromiseBuffer(30);\n        /** Locks transport after receiving rate limits in a response */\n        this._rateLimits = {};\n        this._outcomes = {};\n        this._api = initAPIDetails(options.dsn, options._metadata, options.tunnel);\n        // eslint-disable-next-line deprecation/deprecation\n        this.url = getStoreEndpointWithUrlEncodedAuth(this._api.dsn);\n        if (this.options.sendClientReports && global.document) {\n            global.document.addEventListener('visibilitychange', function () {\n                if (global.document.visibilityState === 'hidden') {\n                    _this._flushOutcomes();\n                }\n            });\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.sendEvent = function (event) {\n        return this._sendRequest(eventToSentryRequest(event, this._api), event);\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.sendSession = function (session) {\n        return this._sendRequest(sessionToSentryRequest(session, this._api), session);\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.close = function (timeout) {\n        return this._buffer.drain(timeout);\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.recordLostEvent = function (reason, category) {\n        var _a;\n        if (!this.options.sendClientReports) {\n            return;\n        }\n        // We want to track each category (event, transaction, session) separately\n        // but still keep the distinction between different type of outcomes.\n        // We could use nested maps, but it's much easier to read and type this way.\n        // A correct type for map-based implementation if we want to go that route\n        // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n        var key = requestTypeToCategory(category) + \":\" + reason;\n        IS_DEBUG_BUILD && logger.log(\"Adding outcome: \" + key);\n        this._outcomes[key] = (_a = this._outcomes[key], (_a !== null && _a !== void 0 ? _a : 0)) + 1;\n    };\n    /**\n     * Send outcomes as an envelope\n     */\n    BaseTransport.prototype._flushOutcomes = function () {\n        if (!this.options.sendClientReports) {\n            return;\n        }\n        var outcomes = this._outcomes;\n        this._outcomes = {};\n        // Nothing to send\n        if (!Object.keys(outcomes).length) {\n            IS_DEBUG_BUILD && logger.log('No outcomes to flush');\n            return;\n        }\n        IS_DEBUG_BUILD && logger.log(\"Flushing outcomes:\\n\" + JSON.stringify(outcomes, null, 2));\n        var url = getEnvelopeEndpointWithUrlEncodedAuth(this._api.dsn, this._api.tunnel);\n        var discardedEvents = Object.keys(outcomes).map(function (key) {\n            var _a = __read(key.split(':'), 2), category = _a[0], reason = _a[1];\n            return {\n                reason: reason,\n                category: category,\n                quantity: outcomes[key],\n            };\n            // TODO: Improve types on discarded_events to get rid of cast\n        });\n        var envelope = createClientReportEnvelope(discardedEvents, this._api.tunnel && dsnToString(this._api.dsn));\n        try {\n            sendReport(url, serializeEnvelope(envelope));\n        }\n        catch (e) {\n            IS_DEBUG_BUILD && logger.error(e);\n        }\n    };\n    /**\n     * Handle Sentry repsonse for promise-based transports.\n     */\n    BaseTransport.prototype._handleResponse = function (_a) {\n        var requestType = _a.requestType, response = _a.response, headers = _a.headers, resolve = _a.resolve, reject = _a.reject;\n        var status = eventStatusFromHttpCode(response.status);\n        this._rateLimits = updateRateLimits(this._rateLimits, headers);\n        // eslint-disable-next-line deprecation/deprecation\n        if (this._isRateLimited(requestType)) {\n            IS_DEBUG_BUILD &&\n                // eslint-disable-next-line deprecation/deprecation\n                logger.warn(\"Too many \" + requestType + \" requests, backing off until: \" + this._disabledUntil(requestType));\n        }\n        if (status === 'success') {\n            resolve({ status: status });\n            return;\n        }\n        reject(response);\n    };\n    /**\n     * Gets the time that given category is disabled until for rate limiting\n     *\n     * @deprecated Please use `disabledUntil` from @sentry/utils\n     */\n    BaseTransport.prototype._disabledUntil = function (requestType) {\n        var category = requestTypeToCategory(requestType);\n        return new Date(disabledUntil(this._rateLimits, category));\n    };\n    /**\n     * Checks if a category is rate limited\n     *\n     * @deprecated Please use `isRateLimited` from @sentry/utils\n     */\n    BaseTransport.prototype._isRateLimited = function (requestType) {\n        var category = requestTypeToCategory(requestType);\n        return isRateLimited(this._rateLimits, category);\n    };\n    return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __extends } from \"tslib\";\nimport { SentryError, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\nimport { getNativeFetchImplementation } from './utils';\n/** `fetch` based transport */\nvar FetchTransport = /** @class */ (function (_super) {\n    __extends(FetchTransport, _super);\n    function FetchTransport(options, fetchImpl) {\n        if (fetchImpl === void 0) { fetchImpl = getNativeFetchImplementation(); }\n        var _this = _super.call(this, options) || this;\n        _this._fetch = fetchImpl;\n        return _this;\n    }\n    /**\n     * @param sentryRequest Prepared SentryRequest to be delivered\n     * @param originalPayload Original payload used to create SentryRequest\n     */\n    FetchTransport.prototype._sendRequest = function (sentryRequest, originalPayload) {\n        var _this = this;\n        // eslint-disable-next-line deprecation/deprecation\n        if (this._isRateLimited(sentryRequest.type)) {\n            this.recordLostEvent('ratelimit_backoff', sentryRequest.type);\n            return Promise.reject({\n                event: originalPayload,\n                type: sentryRequest.type,\n                // eslint-disable-next-line deprecation/deprecation\n                reason: \"Transport for \" + sentryRequest.type + \" requests locked till \" + this._disabledUntil(sentryRequest.type) + \" due to too many requests.\",\n                status: 429,\n            });\n        }\n        var options = {\n            body: sentryRequest.body,\n            method: 'POST',\n            // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n            // (see https://caniuse.com/#feat=referrer-policy),\n            // it doesn't. And it throws an exception instead of ignoring this parameter...\n            // REF: https://github.com/getsentry/raven-js/issues/1233\n            referrerPolicy: (supportsReferrerPolicy() ? 'origin' : ''),\n        };\n        if (this.options.fetchParameters !== undefined) {\n            Object.assign(options, this.options.fetchParameters);\n        }\n        if (this.options.headers !== undefined) {\n            options.headers = this.options.headers;\n        }\n        return this._buffer\n            .add(function () {\n            return new SyncPromise(function (resolve, reject) {\n                void _this._fetch(sentryRequest.url, options)\n                    .then(function (response) {\n                    var headers = {\n                        'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n                        'retry-after': response.headers.get('Retry-After'),\n                    };\n                    _this._handleResponse({\n                        requestType: sentryRequest.type,\n                        response: response,\n                        headers: headers,\n                        resolve: resolve,\n                        reject: reject,\n                    });\n                })\n                    .catch(reject);\n            });\n        })\n            .then(undefined, function (reason) {\n            // It's either buffer rejection or any other xhr/fetch error, which are treated as NetworkError.\n            if (reason instanceof SentryError) {\n                _this.recordLostEvent('queue_overflow', sentryRequest.type);\n            }\n            else {\n                _this.recordLostEvent('network_error', sentryRequest.type);\n            }\n            throw reason;\n        });\n    };\n    return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import { createTransport, } from '@sentry/core';\nimport { SyncPromise } from '@sentry/utils';\n/**\n * The DONE ready state for XmlHttpRequest\n *\n * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined\n * (e.g. during testing, it is `undefined`)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}\n */\nvar XHR_READYSTATE_DONE = 4;\n/**\n * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.\n */\nexport function makeNewXHRTransport(options) {\n    function makeRequest(request) {\n        return new SyncPromise(function (resolve, _reject) {\n            var xhr = new XMLHttpRequest();\n            xhr.onreadystatechange = function () {\n                if (xhr.readyState === XHR_READYSTATE_DONE) {\n                    var response = {\n                        body: xhr.response,\n                        headers: {\n                            'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),\n                            'retry-after': xhr.getResponseHeader('Retry-After'),\n                        },\n                        reason: xhr.statusText,\n                        statusCode: xhr.status,\n                    };\n                    resolve(response);\n                }\n            };\n            xhr.open('POST', options.url);\n            for (var header in options.headers) {\n                if (Object.prototype.hasOwnProperty.call(options.headers, header)) {\n                    xhr.setRequestHeader(header, options.headers[header]);\n                }\n            }\n            xhr.send(request.body);\n        });\n    }\n    return createTransport({ bufferSize: options.bufferSize }, makeRequest);\n}\n//# sourceMappingURL=new-xhr.js.map","import { __extends } from \"tslib\";\nimport { SentryError, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\n/** `XHR` based transport */\nvar XHRTransport = /** @class */ (function (_super) {\n    __extends(XHRTransport, _super);\n    function XHRTransport() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * @param sentryRequest Prepared SentryRequest to be delivered\n     * @param originalPayload Original payload used to create SentryRequest\n     */\n    XHRTransport.prototype._sendRequest = function (sentryRequest, originalPayload) {\n        var _this = this;\n        // eslint-disable-next-line deprecation/deprecation\n        if (this._isRateLimited(sentryRequest.type)) {\n            this.recordLostEvent('ratelimit_backoff', sentryRequest.type);\n            return Promise.reject({\n                event: originalPayload,\n                type: sentryRequest.type,\n                // eslint-disable-next-line deprecation/deprecation\n                reason: \"Transport for \" + sentryRequest.type + \" requests locked till \" + this._disabledUntil(sentryRequest.type) + \" due to too many requests.\",\n                status: 429,\n            });\n        }\n        return this._buffer\n            .add(function () {\n            return new SyncPromise(function (resolve, reject) {\n                var request = new XMLHttpRequest();\n                request.onreadystatechange = function () {\n                    if (request.readyState === 4) {\n                        var headers = {\n                            'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'),\n                            'retry-after': request.getResponseHeader('Retry-After'),\n                        };\n                        _this._handleResponse({ requestType: sentryRequest.type, response: request, headers: headers, resolve: resolve, reject: reject });\n                    }\n                };\n                request.open('POST', sentryRequest.url);\n                for (var header in _this.options.headers) {\n                    if (Object.prototype.hasOwnProperty.call(_this.options.headers, header)) {\n                        request.setRequestHeader(header, _this.options.headers[header]);\n                    }\n                }\n                request.send(sentryRequest.body);\n            });\n        })\n            .then(undefined, function (reason) {\n            // It's either buffer rejection or any other xhr/fetch error, which are treated as NetworkError.\n            if (reason instanceof SentryError) {\n                _this.recordLostEvent('queue_overflow', sentryRequest.type);\n            }\n            else {\n                _this.recordLostEvent('network_error', sentryRequest.type);\n            }\n            throw reason;\n        });\n    };\n    return XHRTransport;\n}(BaseTransport));\nexport { XHRTransport };\n//# sourceMappingURL=xhr.js.map","import { __assign, __extends } from \"tslib\";\nimport { BaseBackend, getEnvelopeEndpointWithUrlEncodedAuth, initAPIDetails } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { supportsFetch } from '@sentry/utils';\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { FetchTransport, makeNewFetchTransport, makeNewXHRTransport, XHRTransport } from './transports';\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nvar BrowserBackend = /** @class */ (function (_super) {\n    __extends(BrowserBackend, _super);\n    function BrowserBackend() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype.eventFromException = function (exception, hint) {\n        return eventFromException(exception, hint, this._options.attachStacktrace);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n        if (level === void 0) { level = Severity.Info; }\n        return eventFromMessage(message, level, hint, this._options.attachStacktrace);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype._setupTransport = function () {\n        if (!this._options.dsn) {\n            // We return the noop transport here in case there is no Dsn.\n            return _super.prototype._setupTransport.call(this);\n        }\n        var transportOptions = __assign(__assign({}, this._options.transportOptions), { dsn: this._options.dsn, tunnel: this._options.tunnel, sendClientReports: this._options.sendClientReports, _metadata: this._options._metadata });\n        var api = initAPIDetails(transportOptions.dsn, transportOptions._metadata, transportOptions.tunnel);\n        var url = getEnvelopeEndpointWithUrlEncodedAuth(api.dsn, api.tunnel);\n        if (this._options.transport) {\n            return new this._options.transport(transportOptions);\n        }\n        if (supportsFetch()) {\n            var requestOptions = __assign({}, transportOptions.fetchParameters);\n            this._newTransport = makeNewFetchTransport({ requestOptions: requestOptions, url: url });\n            return new FetchTransport(transportOptions);\n        }\n        this._newTransport = makeNewXHRTransport({\n            url: url,\n            headers: transportOptions.headers,\n        });\n        return new XHRTransport(transportOptions);\n    };\n    return BrowserBackend;\n}(BaseBackend));\nexport { BrowserBackend };\n//# sourceMappingURL=backend.js.map","/*! *****************************************************************************\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/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = 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.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 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}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __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\nexport function __read(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\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { __assign, __read, __spread } from \"tslib\";\nimport { getCurrentHub } from '@sentry/hub';\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction callOnHub(method) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    var hub = getCurrentHub();\n    if (hub && hub[method]) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return hub[method].apply(hub, __spread(args));\n    }\n    throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function captureException(exception, captureContext) {\n    var syntheticException = new Error('Sentry syntheticException');\n    return callOnHub('captureException', exception, {\n        captureContext: captureContext,\n        originalException: exception,\n        syntheticException: syntheticException,\n    });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param Severity Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message, captureContext) {\n    var syntheticException = new Error(message);\n    // This is necessary to provide explicit scopes upgrade, without changing the original\n    // arity of the `captureMessage(message, level)` method.\n    var level = typeof captureContext === 'string' ? captureContext : undefined;\n    var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined;\n    return callOnHub('captureMessage', message, level, __assign({ originalException: message, syntheticException: syntheticException }, context));\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event) {\n    return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback) {\n    callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb) {\n    callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function setContext(name, context) {\n    callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras) {\n    callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags) {\n    callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key, extra) {\n    callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key, value) {\n    callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user) {\n    callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n *     pushScope();\n *     callback();\n *     popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback) {\n    callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _callOnClient(method) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    callOnHub.apply(void 0, __spread(['_invokeClient', method], args));\n}\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\nexport function startTransaction(context, customSamplingContext) {\n    return callOnHub('startTransaction', __assign({}, context), customSamplingContext);\n}\n//# sourceMappingURL=index.js.map","import { __assign } from \"tslib\";\nimport { captureException, getReportDialogEndpoint, withScope } from '@sentry/core';\nimport { addExceptionMechanism, addExceptionTypeValue, addNonEnumerableProperty, getGlobalObject, getOriginalFunction, logger, markFunctionWrapped, } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from './flags';\nvar global = getGlobalObject();\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError() {\n    return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\nexport function ignoreNextOnError() {\n    // onerror should trigger before setTimeout\n    ignoreOnError += 1;\n    setTimeout(function () {\n        ignoreOnError -= 1;\n    });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(fn, options, before) {\n    // for future readers what this does is wrap a function and then create\n    // a bi-directional wrapping between them.\n    //\n    // example: wrapped = wrap(original);\n    //  original.__sentry_wrapped__ -> wrapped\n    //  wrapped.__sentry_original__ -> original\n    if (options === void 0) { options = {}; }\n    if (typeof fn !== 'function') {\n        return fn;\n    }\n    try {\n        // if we're dealing with a function that was previously wrapped, return\n        // the original wrapper.\n        var wrapper = fn.__sentry_wrapped__;\n        if (wrapper) {\n            return wrapper;\n        }\n        // We don't wanna wrap it twice\n        if (getOriginalFunction(fn)) {\n            return fn;\n        }\n    }\n    catch (e) {\n        // Just accessing custom props in some Selenium environments\n        // can cause a \"Permission denied\" exception (see raven-js#495).\n        // Bail on wrapping and return the function as-is (defers to window.onerror).\n        return fn;\n    }\n    /* eslint-disable prefer-rest-params */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var sentryWrapped = function () {\n        var args = Array.prototype.slice.call(arguments);\n        try {\n            if (before && typeof before === 'function') {\n                before.apply(this, arguments);\n            }\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n            var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });\n            // Attempt to invoke user-land function\n            // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n            //       means the sentry.javascript SDK caught an error invoking your application code. This\n            //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n            return fn.apply(this, wrappedArguments);\n        }\n        catch (ex) {\n            ignoreNextOnError();\n            withScope(function (scope) {\n                scope.addEventProcessor(function (event) {\n                    if (options.mechanism) {\n                        addExceptionTypeValue(event, undefined, undefined);\n                        addExceptionMechanism(event, options.mechanism);\n                    }\n                    event.extra = __assign(__assign({}, event.extra), { arguments: args });\n                    return event;\n                });\n                captureException(ex);\n            });\n            throw ex;\n        }\n    };\n    /* eslint-enable prefer-rest-params */\n    // Accessing some objects may throw\n    // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n    try {\n        for (var property in fn) {\n            if (Object.prototype.hasOwnProperty.call(fn, property)) {\n                sentryWrapped[property] = fn[property];\n            }\n        }\n    }\n    catch (_oO) { } // eslint-disable-line no-empty\n    // Signal that this function has been wrapped/filled already\n    // for both debugging and to prevent it to being wrapped/filled twice\n    markFunctionWrapped(sentryWrapped, fn);\n    addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n    // Restore original function name (not all browsers allow that)\n    try {\n        var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n        if (descriptor.configurable) {\n            Object.defineProperty(sentryWrapped, 'name', {\n                get: function () {\n                    return fn.name;\n                },\n            });\n        }\n        // eslint-disable-next-line no-empty\n    }\n    catch (_oO) { }\n    return sentryWrapped;\n}\n/**\n * Injects the Report Dialog script\n * @hidden\n */\nexport function injectReportDialog(options) {\n    if (options === void 0) { options = {}; }\n    if (!global.document) {\n        return;\n    }\n    if (!options.eventId) {\n        IS_DEBUG_BUILD && logger.error('Missing eventId option in showReportDialog call');\n        return;\n    }\n    if (!options.dsn) {\n        IS_DEBUG_BUILD && logger.error('Missing dsn option in showReportDialog call');\n        return;\n    }\n    var script = global.document.createElement('script');\n    script.async = true;\n    script.src = getReportDialogEndpoint(options.dsn, options);\n    if (options.onLoad) {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        script.onload = options.onLoad;\n    }\n    var injectionPoint = global.document.head || global.document.body;\n    if (injectionPoint) {\n        injectionPoint.appendChild(script);\n    }\n}\n//# sourceMappingURL=helpers.js.map","export var SeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug', 'critical'];\n//# sourceMappingURL=enums.js.map","import { Severity } from '@sentry/types';\nimport { SeverityLevels } from './enums';\nfunction isSupportedSeverity(level) {\n    return SeverityLevels.indexOf(level) !== -1;\n}\n/**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\nexport function severityFromString(level) {\n    if (level === 'warn')\n        return Severity.Warning;\n    if (isSupportedSeverity(level)) {\n        return level;\n    }\n    return Severity.Log;\n}\n//# sourceMappingURL=severity.js.map","import { __assign } from \"tslib\";\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable max-lines */\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addInstrumentationHandler, getEventDescription, getGlobalObject, htmlTreeAsString, parseUrl, safeJoin, severityFromString, } from '@sentry/utils';\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nvar Breadcrumbs = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Breadcrumbs(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = Breadcrumbs.id;\n        this._options = __assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);\n    }\n    /**\n     * Create a breadcrumb of `sentry` from the events themselves\n     */\n    Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {\n        if (!this._options.sentry) {\n            return;\n        }\n        getCurrentHub().addBreadcrumb({\n            category: \"sentry.\" + (event.type === 'transaction' ? 'transaction' : 'event'),\n            event_id: event.event_id,\n            level: event.level,\n            message: getEventDescription(event),\n        }, {\n            event: event,\n        });\n    };\n    /**\n     * Instrument browser built-ins w/ breadcrumb capturing\n     *  - Console API\n     *  - DOM API (click/typing)\n     *  - XMLHttpRequest API\n     *  - Fetch API\n     *  - History API\n     */\n    Breadcrumbs.prototype.setupOnce = function () {\n        if (this._options.console) {\n            addInstrumentationHandler('console', _consoleBreadcrumb);\n        }\n        if (this._options.dom) {\n            addInstrumentationHandler('dom', _domBreadcrumb(this._options.dom));\n        }\n        if (this._options.xhr) {\n            addInstrumentationHandler('xhr', _xhrBreadcrumb);\n        }\n        if (this._options.fetch) {\n            addInstrumentationHandler('fetch', _fetchBreadcrumb);\n        }\n        if (this._options.history) {\n            addInstrumentationHandler('history', _historyBreadcrumb);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Breadcrumbs.id = 'Breadcrumbs';\n    return Breadcrumbs;\n}());\nexport { Breadcrumbs };\n/**\n * A HOC that creaes a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _domBreadcrumb(dom) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function _innerDomBreadcrumb(handlerData) {\n        var target;\n        var keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n        if (typeof keyAttrs === 'string') {\n            keyAttrs = [keyAttrs];\n        }\n        // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n        try {\n            target = handlerData.event.target\n                ? htmlTreeAsString(handlerData.event.target, keyAttrs)\n                : htmlTreeAsString(handlerData.event, keyAttrs);\n        }\n        catch (e) {\n            target = '<unknown>';\n        }\n        if (target.length === 0) {\n            return;\n        }\n        getCurrentHub().addBreadcrumb({\n            category: \"ui.\" + handlerData.name,\n            message: target,\n        }, {\n            event: handlerData.event,\n            name: handlerData.name,\n            global: handlerData.global,\n        });\n    }\n    return _innerDomBreadcrumb;\n}\n/**\n * Creates breadcrumbs from console API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _consoleBreadcrumb(handlerData) {\n    var breadcrumb = {\n        category: 'console',\n        data: {\n            arguments: handlerData.args,\n            logger: 'console',\n        },\n        level: severityFromString(handlerData.level),\n        message: safeJoin(handlerData.args, ' '),\n    };\n    if (handlerData.level === 'assert') {\n        if (handlerData.args[0] === false) {\n            breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n            breadcrumb.data.arguments = handlerData.args.slice(1);\n        }\n        else {\n            // Don't capture a breadcrumb for passed assertions\n            return;\n        }\n    }\n    getCurrentHub().addBreadcrumb(breadcrumb, {\n        input: handlerData.args,\n        level: handlerData.level,\n    });\n}\n/**\n * Creates breadcrumbs from XHR API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _xhrBreadcrumb(handlerData) {\n    if (handlerData.endTimestamp) {\n        // We only capture complete, non-sentry requests\n        if (handlerData.xhr.__sentry_own_request__) {\n            return;\n        }\n        var _a = handlerData.xhr.__sentry_xhr__ || {}, method = _a.method, url = _a.url, status_code = _a.status_code, body = _a.body;\n        getCurrentHub().addBreadcrumb({\n            category: 'xhr',\n            data: {\n                method: method,\n                url: url,\n                status_code: status_code,\n            },\n            type: 'http',\n        }, {\n            xhr: handlerData.xhr,\n            input: body,\n        });\n        return;\n    }\n}\n/**\n * Creates breadcrumbs from fetch API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _fetchBreadcrumb(handlerData) {\n    // We only capture complete fetch requests\n    if (!handlerData.endTimestamp) {\n        return;\n    }\n    if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n        // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n        return;\n    }\n    if (handlerData.error) {\n        getCurrentHub().addBreadcrumb({\n            category: 'fetch',\n            data: handlerData.fetchData,\n            level: Severity.Error,\n            type: 'http',\n        }, {\n            data: handlerData.error,\n            input: handlerData.args,\n        });\n    }\n    else {\n        getCurrentHub().addBreadcrumb({\n            category: 'fetch',\n            data: __assign(__assign({}, handlerData.fetchData), { status_code: handlerData.response.status }),\n            type: 'http',\n        }, {\n            input: handlerData.args,\n            response: handlerData.response,\n        });\n    }\n}\n/**\n * Creates breadcrumbs from history API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _historyBreadcrumb(handlerData) {\n    var global = getGlobalObject();\n    var from = handlerData.from;\n    var to = handlerData.to;\n    var parsedLoc = parseUrl(global.location.href);\n    var parsedFrom = parseUrl(from);\n    var parsedTo = parseUrl(to);\n    // Initial pushState doesn't provide `from` information\n    if (!parsedFrom.path) {\n        parsedFrom = parsedLoc;\n    }\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n        to = parsedTo.relative;\n    }\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n        from = parsedFrom.relative;\n    }\n    getCurrentHub().addBreadcrumb({\n        category: 'navigation',\n        data: {\n            from: from,\n            to: to,\n        },\n    });\n}\n//# sourceMappingURL=breadcrumbs.js.map","import { __assign, __extends } from \"tslib\";\nimport { BaseClient, SDK_VERSION } from '@sentry/core';\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { BrowserBackend } from './backend';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { injectReportDialog } from './helpers';\nimport { Breadcrumbs } from './integrations';\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nvar BrowserClient = /** @class */ (function (_super) {\n    __extends(BrowserClient, _super);\n    /**\n     * Creates a new Browser SDK instance.\n     *\n     * @param options Configuration options for this SDK.\n     */\n    function BrowserClient(options) {\n        if (options === void 0) { options = {}; }\n        var _this = this;\n        options._metadata = options._metadata || {};\n        options._metadata.sdk = options._metadata.sdk || {\n            name: 'sentry.javascript.browser',\n            packages: [\n                {\n                    name: 'npm:@sentry/browser',\n                    version: SDK_VERSION,\n                },\n            ],\n            version: SDK_VERSION,\n        };\n        _this = _super.call(this, BrowserBackend, options) || this;\n        return _this;\n    }\n    /**\n     * Show a report dialog to the user to send feedback to a specific event.\n     *\n     * @param options Set individual options for the dialog\n     */\n    BrowserClient.prototype.showReportDialog = function (options) {\n        if (options === void 0) { options = {}; }\n        // doesn't work without a document (React Native)\n        var document = getGlobalObject().document;\n        if (!document) {\n            return;\n        }\n        if (!this._isEnabled()) {\n            IS_DEBUG_BUILD && logger.error('Trying to call showReportDialog with Sentry Client disabled');\n            return;\n        }\n        injectReportDialog(__assign(__assign({}, options), { dsn: options.dsn || this.getDsn() }));\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n        event.platform = event.platform || 'javascript';\n        return _super.prototype._prepareEvent.call(this, event, scope, hint);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserClient.prototype._sendEvent = function (event) {\n        var integration = this.getIntegration(Breadcrumbs);\n        if (integration) {\n            integration.addSentryBreadcrumb(event);\n        }\n        _super.prototype._sendEvent.call(this, event);\n    };\n    return BrowserClient;\n}(BaseClient));\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map","import { __assign } from \"tslib\";\nimport { fill, getFunctionName, getGlobalObject, getOriginalFunction } from '@sentry/utils';\nimport { wrap } from '../helpers';\nvar DEFAULT_EVENT_TARGET = [\n    'EventTarget',\n    'Window',\n    'Node',\n    'ApplicationCache',\n    'AudioTrackList',\n    'ChannelMergerNode',\n    'CryptoOperation',\n    'EventSource',\n    'FileReader',\n    'HTMLUnknownElement',\n    'IDBDatabase',\n    'IDBRequest',\n    'IDBTransaction',\n    'KeyOperation',\n    'MediaController',\n    'MessagePort',\n    'ModalWindow',\n    'Notification',\n    'SVGElementInstance',\n    'Screen',\n    'TextTrack',\n    'TextTrackCue',\n    'TextTrackList',\n    'WebSocket',\n    'WebSocketWorker',\n    'Worker',\n    'XMLHttpRequest',\n    'XMLHttpRequestEventTarget',\n    'XMLHttpRequestUpload',\n];\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nvar TryCatch = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function TryCatch(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = TryCatch.id;\n        this._options = __assign({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options);\n    }\n    /**\n     * Wrap timer functions and event targets to catch errors\n     * and provide better metadata.\n     */\n    TryCatch.prototype.setupOnce = function () {\n        var global = getGlobalObject();\n        if (this._options.setTimeout) {\n            fill(global, 'setTimeout', _wrapTimeFunction);\n        }\n        if (this._options.setInterval) {\n            fill(global, 'setInterval', _wrapTimeFunction);\n        }\n        if (this._options.requestAnimationFrame) {\n            fill(global, 'requestAnimationFrame', _wrapRAF);\n        }\n        if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n            fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n        }\n        var eventTargetOption = this._options.eventTarget;\n        if (eventTargetOption) {\n            var eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n            eventTarget.forEach(_wrapEventTarget);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    TryCatch.id = 'TryCatch';\n    return TryCatch;\n}());\nexport { TryCatch };\n/** JSDoc */\nfunction _wrapTimeFunction(original) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var originalCallback = args[0];\n        args[0] = wrap(originalCallback, {\n            mechanism: {\n                data: { function: getFunctionName(original) },\n                handled: true,\n                type: 'instrument',\n            },\n        });\n        return original.apply(this, args);\n    };\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function (callback) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        return original.apply(this, [\n            wrap(callback, {\n                mechanism: {\n                    data: {\n                        function: 'requestAnimationFrame',\n                        handler: getFunctionName(original),\n                    },\n                    handled: true,\n                    type: 'instrument',\n                },\n            }),\n        ]);\n    };\n}\n/** JSDoc */\nfunction _wrapXHR(originalSend) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        var xhr = this;\n        var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n        xmlHttpRequestProps.forEach(function (prop) {\n            if (prop in xhr && typeof xhr[prop] === 'function') {\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                fill(xhr, prop, function (original) {\n                    var wrapOptions = {\n                        mechanism: {\n                            data: {\n                                function: prop,\n                                handler: getFunctionName(original),\n                            },\n                            handled: true,\n                            type: 'instrument',\n                        },\n                    };\n                    // If Instrument integration has been called before TryCatch, get the name of original function\n                    var originalFunction = getOriginalFunction(original);\n                    if (originalFunction) {\n                        wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n                    }\n                    // Otherwise wrap directly\n                    return wrap(original, wrapOptions);\n                });\n            }\n        });\n        return originalSend.apply(this, args);\n    };\n}\n/** JSDoc */\nfunction _wrapEventTarget(target) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var global = getGlobalObject();\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    var proto = global[target] && global[target].prototype;\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n    if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n        return;\n    }\n    fill(proto, 'addEventListener', function (original) {\n        return function (eventName, fn, options) {\n            try {\n                if (typeof fn.handleEvent === 'function') {\n                    fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n                        mechanism: {\n                            data: {\n                                function: 'handleEvent',\n                                handler: getFunctionName(fn),\n                                target: target,\n                            },\n                            handled: true,\n                            type: 'instrument',\n                        },\n                    });\n                }\n            }\n            catch (err) {\n                // can sometimes get 'Permission denied to access property \"handle Event'\n            }\n            return original.apply(this, [\n                eventName,\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                wrap(fn, {\n                    mechanism: {\n                        data: {\n                            function: 'addEventListener',\n                            handler: getFunctionName(fn),\n                            target: target,\n                        },\n                        handled: true,\n                        type: 'instrument',\n                    },\n                }),\n                options,\n            ]);\n        };\n    });\n    fill(proto, 'removeEventListener', function (originalRemoveEventListener) {\n        return function (eventName, fn, options) {\n            /**\n             * There are 2 possible scenarios here:\n             *\n             * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n             * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n             * as a pass-through, and call original `removeEventListener` with it.\n             *\n             * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n             * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n             * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n             * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n             * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n             *\n             * When someone adds a handler prior to initialization, and then do it again, but after,\n             * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n             * to get rid of the initial handler and it'd stick there forever.\n             */\n            var wrappedEventHandler = fn;\n            try {\n                var originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n                if (originalEventHandler) {\n                    originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n                }\n            }\n            catch (e) {\n                // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n            }\n            return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n        };\n    });\n}\n//# sourceMappingURL=trycatch.js.map","import { __assign, __read } from \"tslib\";\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addInstrumentationHandler, getLocationHref, isErrorEvent, isPrimitive, isString, logger, } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { IS_DEBUG_BUILD } from '../flags';\nimport { shouldIgnoreOnError } from '../helpers';\n/** Global handlers */\nvar GlobalHandlers = /** @class */ (function () {\n    /** JSDoc */\n    function GlobalHandlers(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = GlobalHandlers.id;\n        /**\n         * Stores references functions to installing handlers. Will set to undefined\n         * after they have been run so that they are not used twice.\n         */\n        this._installFunc = {\n            onerror: _installGlobalOnErrorHandler,\n            onunhandledrejection: _installGlobalOnUnhandledRejectionHandler,\n        };\n        this._options = __assign({ onerror: true, onunhandledrejection: true }, options);\n    }\n    /**\n     * @inheritDoc\n     */\n    GlobalHandlers.prototype.setupOnce = function () {\n        Error.stackTraceLimit = 50;\n        var options = this._options;\n        // We can disable guard-for-in as we construct the options object above + do checks against\n        // `this._installFunc` for the property.\n        // eslint-disable-next-line guard-for-in\n        for (var key in options) {\n            var installFunc = this._installFunc[key];\n            if (installFunc && options[key]) {\n                globalHandlerLog(key);\n                installFunc();\n                this._installFunc[key] = undefined;\n            }\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    GlobalHandlers.id = 'GlobalHandlers';\n    return GlobalHandlers;\n}());\nexport { GlobalHandlers };\n/** JSDoc */\nfunction _installGlobalOnErrorHandler() {\n    addInstrumentationHandler('error', \n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function (data) {\n        var _a = __read(getHubAndAttachStacktrace(), 2), hub = _a[0], attachStacktrace = _a[1];\n        if (!hub.getIntegration(GlobalHandlers)) {\n            return;\n        }\n        var msg = data.msg, url = data.url, line = data.line, column = data.column, error = data.error;\n        if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n            return;\n        }\n        var event = error === undefined && isString(msg)\n            ? _eventFromIncompleteOnError(msg, url, line, column)\n            : _enhanceEventWithInitialFrame(eventFromUnknownInput(error || msg, undefined, attachStacktrace, false), url, line, column);\n        event.level = Severity.Error;\n        addMechanismAndCapture(hub, error, event, 'onerror');\n    });\n}\n/** JSDoc */\nfunction _installGlobalOnUnhandledRejectionHandler() {\n    addInstrumentationHandler('unhandledrejection', \n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function (e) {\n        var _a = __read(getHubAndAttachStacktrace(), 2), hub = _a[0], attachStacktrace = _a[1];\n        if (!hub.getIntegration(GlobalHandlers)) {\n            return;\n        }\n        var error = e;\n        // dig the object of the rejection out of known event types\n        try {\n            // PromiseRejectionEvents store the object of the rejection under 'reason'\n            // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n            if ('reason' in e) {\n                error = e.reason;\n            }\n            // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n            // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n            // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n            // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n            // https://github.com/getsentry/sentry-javascript/issues/2380\n            else if ('detail' in e && 'reason' in e.detail) {\n                error = e.detail.reason;\n            }\n        }\n        catch (_oO) {\n            // no-empty\n        }\n        if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n            return true;\n        }\n        var event = isPrimitive(error)\n            ? _eventFromRejectionWithPrimitive(error)\n            : eventFromUnknownInput(error, undefined, attachStacktrace, true);\n        event.level = Severity.Error;\n        addMechanismAndCapture(hub, error, event, 'onunhandledrejection');\n        return;\n    });\n}\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason) {\n    return {\n        exception: {\n            values: [\n                {\n                    type: 'UnhandledRejection',\n                    // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n                    value: \"Non-Error promise rejection captured with value: \" + String(reason),\n                },\n            ],\n        },\n    };\n}\n/**\n * This function creates a stack from an old, error-less onerror handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _eventFromIncompleteOnError(msg, url, line, column) {\n    var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n    // If 'message' is ErrorEvent, get real message from inside\n    var message = isErrorEvent(msg) ? msg.message : msg;\n    var name = 'Error';\n    var groups = message.match(ERROR_TYPES_RE);\n    if (groups) {\n        name = groups[1];\n        message = groups[2];\n    }\n    var event = {\n        exception: {\n            values: [\n                {\n                    type: name,\n                    value: message,\n                },\n            ],\n        },\n    };\n    return _enhanceEventWithInitialFrame(event, url, line, column);\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event, url, line, column) {\n    // event.exception\n    var e = (event.exception = event.exception || {});\n    // event.exception.values\n    var ev = (e.values = e.values || []);\n    // event.exception.values[0]\n    var ev0 = (ev[0] = ev[0] || {});\n    // event.exception.values[0].stacktrace\n    var ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n    // event.exception.values[0].stacktrace.frames\n    var ev0sf = (ev0s.frames = ev0s.frames || []);\n    var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n    var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n    var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n    // event.exception.values[0].stacktrace.frames\n    if (ev0sf.length === 0) {\n        ev0sf.push({\n            colno: colno,\n            filename: filename,\n            function: '?',\n            in_app: true,\n            lineno: lineno,\n        });\n    }\n    return event;\n}\nfunction globalHandlerLog(type) {\n    IS_DEBUG_BUILD && logger.log(\"Global Handler attached: \" + type);\n}\nfunction addMechanismAndCapture(hub, error, event, type) {\n    addExceptionMechanism(event, {\n        handled: false,\n        type: type,\n    });\n    hub.captureEvent(event, {\n        originalException: error,\n    });\n}\nfunction getHubAndAttachStacktrace() {\n    var hub = getCurrentHub();\n    var client = hub.getClient();\n    var attachStacktrace = client && client.getOptions().attachStacktrace;\n    return [hub, attachStacktrace];\n}\n//# sourceMappingURL=globalhandlers.js.map","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromError } from '../eventbuilder';\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\nvar LinkedErrors = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function LinkedErrors(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = LinkedErrors.id;\n        this._key = options.key || DEFAULT_KEY;\n        this._limit = options.limit || DEFAULT_LIMIT;\n    }\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event, hint) {\n            var self = getCurrentHub().getIntegration(LinkedErrors);\n            return self ? _handler(self._key, self._limit, event, hint) : event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.id = 'LinkedErrors';\n    return LinkedErrors;\n}());\nexport { LinkedErrors };\n/**\n * @inheritDoc\n */\nexport function _handler(key, limit, event, hint) {\n    if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n        return event;\n    }\n    var linkedErrors = _walkErrorTree(limit, hint.originalException, key);\n    event.exception.values = __spread(linkedErrors, event.exception.values);\n    return event;\n}\n/**\n * JSDOC\n */\nexport function _walkErrorTree(limit, error, key, stack) {\n    if (stack === void 0) { stack = []; }\n    if (!isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {\n        return stack;\n    }\n    var exception = exceptionFromError(error[key]);\n    return _walkErrorTree(limit, error[key], key, __spread([exception], stack));\n}\n//# sourceMappingURL=linkederrors.js.map","import { logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\n/** Deduplication filter */\nvar Dedupe = /** @class */ (function () {\n    function Dedupe() {\n        /**\n         * @inheritDoc\n         */\n        this.name = Dedupe.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    Dedupe.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (currentEvent) {\n            var self = getCurrentHub().getIntegration(Dedupe);\n            if (self) {\n                // Juuust in case something goes wrong\n                try {\n                    if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n                        IS_DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n                        return null;\n                    }\n                }\n                catch (_oO) {\n                    return (self._previousEvent = currentEvent);\n                }\n                return (self._previousEvent = currentEvent);\n            }\n            return currentEvent;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Dedupe.id = 'Dedupe';\n    return Dedupe;\n}());\nexport { Dedupe };\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent, previousEvent) {\n    if (!previousEvent) {\n        return false;\n    }\n    if (_isSameMessageEvent(currentEvent, previousEvent)) {\n        return true;\n    }\n    if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n        return true;\n    }\n    return false;\n}\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent, previousEvent) {\n    var currentMessage = currentEvent.message;\n    var previousMessage = previousEvent.message;\n    // If neither event has a message property, they were both exceptions, so bail out\n    if (!currentMessage && !previousMessage) {\n        return false;\n    }\n    // If only one event has a stacktrace, but not the other one, they are not the same\n    if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n        return false;\n    }\n    if (currentMessage !== previousMessage) {\n        return false;\n    }\n    if (!_isSameFingerprint(currentEvent, previousEvent)) {\n        return false;\n    }\n    if (!_isSameStacktrace(currentEvent, previousEvent)) {\n        return false;\n    }\n    return true;\n}\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent, previousEvent) {\n    var previousException = _getExceptionFromEvent(previousEvent);\n    var currentException = _getExceptionFromEvent(currentEvent);\n    if (!previousException || !currentException) {\n        return false;\n    }\n    if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n        return false;\n    }\n    if (!_isSameFingerprint(currentEvent, previousEvent)) {\n        return false;\n    }\n    if (!_isSameStacktrace(currentEvent, previousEvent)) {\n        return false;\n    }\n    return true;\n}\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent, previousEvent) {\n    var currentFrames = _getFramesFromEvent(currentEvent);\n    var previousFrames = _getFramesFromEvent(previousEvent);\n    // If neither event has a stacktrace, they are assumed to be the same\n    if (!currentFrames && !previousFrames) {\n        return true;\n    }\n    // If only one event has a stacktrace, but not the other one, they are not the same\n    if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n        return false;\n    }\n    currentFrames = currentFrames;\n    previousFrames = previousFrames;\n    // If number of frames differ, they are not the same\n    if (previousFrames.length !== currentFrames.length) {\n        return false;\n    }\n    // Otherwise, compare the two\n    for (var i = 0; i < previousFrames.length; i++) {\n        var frameA = previousFrames[i];\n        var frameB = currentFrames[i];\n        if (frameA.filename !== frameB.filename ||\n            frameA.lineno !== frameB.lineno ||\n            frameA.colno !== frameB.colno ||\n            frameA.function !== frameB.function) {\n            return false;\n        }\n    }\n    return true;\n}\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent, previousEvent) {\n    var currentFingerprint = currentEvent.fingerprint;\n    var previousFingerprint = previousEvent.fingerprint;\n    // If neither event has a fingerprint, they are assumed to be the same\n    if (!currentFingerprint && !previousFingerprint) {\n        return true;\n    }\n    // If only one event has a fingerprint, but not the other one, they are not the same\n    if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n        return false;\n    }\n    currentFingerprint = currentFingerprint;\n    previousFingerprint = previousFingerprint;\n    // Otherwise, compare the two\n    try {\n        return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n    }\n    catch (_oO) {\n        return false;\n    }\n}\n/** JSDoc */\nfunction _getExceptionFromEvent(event) {\n    return event.exception && event.exception.values && event.exception.values[0];\n}\n/** JSDoc */\nfunction _getFramesFromEvent(event) {\n    var exception = event.exception;\n    if (exception) {\n        try {\n            // @ts-ignore Object could be undefined\n            return exception.values[0].stacktrace.frames;\n        }\n        catch (_oO) {\n            return undefined;\n        }\n    }\n    else if (event.stacktrace) {\n        return event.stacktrace.frames;\n    }\n    return undefined;\n}\n//# sourceMappingURL=dedupe.js.map","import { __assign } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nvar global = getGlobalObject();\n/** UserAgent */\nvar UserAgent = /** @class */ (function () {\n    function UserAgent() {\n        /**\n         * @inheritDoc\n         */\n        this.name = UserAgent.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    UserAgent.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event) {\n            if (getCurrentHub().getIntegration(UserAgent)) {\n                // if none of the information we want exists, don't bother\n                if (!global.navigator && !global.location && !global.document) {\n                    return event;\n                }\n                // grab as much info as exists and add it to the event\n                var url = (event.request && event.request.url) || (global.location && global.location.href);\n                var referrer = (global.document || {}).referrer;\n                var userAgent = (global.navigator || {}).userAgent;\n                var headers = __assign(__assign(__assign({}, (event.request && event.request.headers)), (referrer && { Referer: referrer })), (userAgent && { 'User-Agent': userAgent }));\n                var request = __assign(__assign({}, (url && { url: url })), { headers: headers });\n                return __assign(__assign({}, event), { request: request });\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    UserAgent.id = 'UserAgent';\n    return UserAgent;\n}());\nexport { UserAgent };\n//# sourceMappingURL=useragent.js.map","import { __assign } from \"tslib\";\nimport { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { addInstrumentationHandler, getGlobalObject, logger, resolvedSyncPromise } from '@sentry/utils';\nimport { BrowserClient } from './client';\nimport { IS_DEBUG_BUILD } from './flags';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, Dedupe, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\nexport var defaultIntegrations = [\n    new CoreIntegrations.InboundFilters(),\n    new CoreIntegrations.FunctionToString(),\n    new TryCatch(),\n    new Breadcrumbs(),\n    new GlobalHandlers(),\n    new LinkedErrors(),\n    new Dedupe(),\n    new UserAgent(),\n];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n *   scope.setExtra({ battery: 0.7 });\n *   scope.setTag({ user_mode: 'admin' });\n *   scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options) {\n    if (options === void 0) { options = {}; }\n    if (options.defaultIntegrations === undefined) {\n        options.defaultIntegrations = defaultIntegrations;\n    }\n    if (options.release === undefined) {\n        var window_1 = getGlobalObject();\n        // This supports the variable that sentry-webpack-plugin injects\n        if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n            options.release = window_1.SENTRY_RELEASE.id;\n        }\n    }\n    if (options.autoSessionTracking === undefined) {\n        options.autoSessionTracking = true;\n    }\n    if (options.sendClientReports === undefined) {\n        options.sendClientReports = true;\n    }\n    initAndBind(BrowserClient, options);\n    if (options.autoSessionTracking) {\n        startSessionTracking();\n    }\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options) {\n    if (options === void 0) { options = {}; }\n    var hub = getCurrentHub();\n    var scope = hub.getScope();\n    if (scope) {\n        options.user = __assign(__assign({}, scope.getUser()), options.user);\n    }\n    if (!options.eventId) {\n        options.eventId = hub.lastEventId();\n    }\n    var client = hub.getClient();\n    if (client) {\n        client.showReportDialog(options);\n    }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId() {\n    return getCurrentHub().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad() {\n    // Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback) {\n    callback();\n}\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function flush(timeout) {\n    var client = getCurrentHub().getClient();\n    if (client) {\n        return client.flush(timeout);\n    }\n    IS_DEBUG_BUILD && logger.warn('Cannot flush events. No client defined.');\n    return resolvedSyncPromise(false);\n}\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function close(timeout) {\n    var client = getCurrentHub().getClient();\n    if (client) {\n        return client.close(timeout);\n    }\n    IS_DEBUG_BUILD && logger.warn('Cannot flush events and disable SDK. No client defined.');\n    return resolvedSyncPromise(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn) {\n    return internalWrap(fn)();\n}\nfunction startSessionOnHub(hub) {\n    hub.startSession({ ignoreDuration: true });\n    hub.captureSession();\n}\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking() {\n    var window = getGlobalObject();\n    var document = window.document;\n    if (typeof document === 'undefined') {\n        IS_DEBUG_BUILD && logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n        return;\n    }\n    var hub = getCurrentHub();\n    // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n    // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n    // pinned at the same version in package.json, but there are edge cases where it's possible. See\n    // https://github.com/getsentry/sentry-javascript/issues/3207 and\n    // https://github.com/getsentry/sentry-javascript/issues/3234 and\n    // https://github.com/getsentry/sentry-javascript/issues/3278.\n    if (!hub.captureSession) {\n        return;\n    }\n    // The session duration for browser sessions does not track a meaningful\n    // concept that can be used as a metric.\n    // Automatically captured sessions are akin to page views, and thus we\n    // discard their duration.\n    startSessionOnHub(hub);\n    // We want to create a session for every navigation as well\n    addInstrumentationHandler('history', function (_a) {\n        var from = _a.from, to = _a.to;\n        // Don't create an additional session for the initial route or if the location did not change\n        if (!(from === undefined || from === to)) {\n            startSessionOnHub(getCurrentHub());\n        }\n    });\n}\n//# sourceMappingURL=sdk.js.map","export var TRACEPARENT_REGEXP = new RegExp('^[ \\\\t]*' + // whitespace\n    '([0-9a-f]{32})?' + // trace_id\n    '-?([0-9a-f]{16})?' + // span_id\n    '-?([01])?' + // sampled\n    '[ \\\\t]*$');\n/**\n * Extract transaction context data from a `sentry-trace` header.\n *\n * @param traceparent Traceparent string\n *\n * @returns Object containing data from the header, or undefined if traceparent string is malformed\n */\nexport function extractTraceparentData(traceparent) {\n    var matches = traceparent.match(TRACEPARENT_REGEXP);\n    if (matches) {\n        var parentSampled = void 0;\n        if (matches[3] === '1') {\n            parentSampled = true;\n        }\n        else if (matches[3] === '0') {\n            parentSampled = false;\n        }\n        return {\n            traceId: matches[1],\n            parentSampled: parentSampled,\n            parentSpanId: matches[2],\n        };\n    }\n    return undefined;\n}\n//# sourceMappingURL=tracing.js.map","import { getGlobalObject, logger } from '@sentry/utils';\nimport { FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS } from '../constants';\nimport { IS_DEBUG_BUILD } from '../flags';\nimport { getActiveTransaction } from '../utils';\nvar global = getGlobalObject();\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nexport function registerBackgroundTabDetection() {\n    if (global && global.document) {\n        global.document.addEventListener('visibilitychange', function () {\n            var activeTransaction = getActiveTransaction();\n            if (global.document.hidden && activeTransaction) {\n                var statusType = 'cancelled';\n                IS_DEBUG_BUILD &&\n                    logger.log(\"[Tracing] Transaction: \" + statusType + \" -> since tab moved to the background, op: \" + activeTransaction.op);\n                // We should not set status if it is already set, this prevent important statuses like\n                // error or data loss from being overwritten on transaction.\n                if (!activeTransaction.status) {\n                    activeTransaction.setStatus(statusType);\n                }\n                activeTransaction.setTag('visibilitychange', 'document.hidden');\n                activeTransaction.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[2]);\n                activeTransaction.finish();\n            }\n        });\n    }\n    else {\n        IS_DEBUG_BUILD && logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n    }\n}\n//# sourceMappingURL=backgroundtab.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nexport var bindReporter = function (callback, metric, reportAllChanges) {\n    var prevValue;\n    return function (forceReport) {\n        if (metric.value >= 0) {\n            if (forceReport || reportAllChanges) {\n                metric.delta = metric.value - (prevValue || 0);\n                // Report the metric if there's a non-zero delta or if no previous\n                // value exists (which can happen in the case of the document becoming\n                // hidden when the metric value is 0).\n                // See: https://github.com/GoogleChrome/web-vitals/issues/14\n                if (metric.delta || prevValue === undefined) {\n                    prevValue = metric.value;\n                    callback(metric);\n                }\n            }\n        }\n    };\n};\n//# sourceMappingURL=bindReporter.js.map","/*\n * Copyright 2020 Google LLC\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 *     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/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nexport var generateUniqueID = function () {\n    return \"v2-\" + Date.now() + \"-\" + (Math.floor(Math.random() * (9e12 - 1)) + 1e12);\n};\n//# sourceMappingURL=generateUniqueID.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nimport { generateUniqueID } from './generateUniqueID';\nexport var initMetric = function (name, value) {\n    return {\n        name: name,\n        value: (value !== null && value !== void 0 ? value : -1),\n        delta: 0,\n        entries: [],\n        id: generateUniqueID(),\n    };\n};\n//# sourceMappingURL=initMetric.js.map","/*\n * Copyright 2020 Google LLC\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 *     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/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nexport var observe = function (type, callback) {\n    try {\n        if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n            // More extensive feature detect needed for Firefox due to:\n            // https://github.com/GoogleChrome/web-vitals/issues/142\n            if (type === 'first-input' && !('PerformanceEventTiming' in self)) {\n                return;\n            }\n            var po = new PerformanceObserver(function (l) { return l.getEntries().map(callback); });\n            po.observe({ type: type, buffered: true });\n            return po;\n        }\n    }\n    catch (e) {\n        // Do nothing.\n    }\n    return;\n};\n//# sourceMappingURL=observe.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nimport { getGlobalObject } from '@sentry/utils';\nexport var onHidden = function (cb, once) {\n    var onHiddenOrPageHide = function (event) {\n        if (event.type === 'pagehide' || getGlobalObject().document.visibilityState === 'hidden') {\n            cb(event);\n            if (once) {\n                removeEventListener('visibilitychange', onHiddenOrPageHide, true);\n                removeEventListener('pagehide', onHiddenOrPageHide, true);\n            }\n        }\n    };\n    addEventListener('visibilitychange', onHiddenOrPageHide, true);\n    // Some browsers have buggy implementations of visibilitychange,\n    // so we use pagehide in addition, just to be safe.\n    addEventListener('pagehide', onHiddenOrPageHide, true);\n};\n//# sourceMappingURL=onHidden.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nexport var getCLS = function (onReport, reportAllChanges) {\n    var metric = initMetric('CLS', 0);\n    var report;\n    var sessionValue = 0;\n    var sessionEntries = [];\n    var entryHandler = function (entry) {\n        // Only count layout shifts without recent user input.\n        // TODO: Figure out why entry can be undefined\n        if (entry && !entry.hadRecentInput) {\n            var firstSessionEntry = sessionEntries[0];\n            var lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n            // If the entry occurred less than 1 second after the previous entry and\n            // less than 5 seconds after the first entry in the session, include the\n            // entry in the current session. Otherwise, start a new session.\n            if (sessionValue &&\n                sessionEntries.length !== 0 &&\n                entry.startTime - lastSessionEntry.startTime < 1000 &&\n                entry.startTime - firstSessionEntry.startTime < 5000) {\n                sessionValue += entry.value;\n                sessionEntries.push(entry);\n            }\n            else {\n                sessionValue = entry.value;\n                sessionEntries = [entry];\n            }\n            // If the current session value is larger than the current CLS value,\n            // update CLS and the entries contributing to it.\n            if (sessionValue > metric.value) {\n                metric.value = sessionValue;\n                metric.entries = sessionEntries;\n                if (report) {\n                    report();\n                }\n            }\n        }\n    };\n    var po = observe('layout-shift', entryHandler);\n    if (po) {\n        report = bindReporter(onReport, metric, reportAllChanges);\n        onHidden(function () {\n            po.takeRecords().map(entryHandler);\n            report(true);\n        });\n    }\n};\n//# sourceMappingURL=getCLS.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nimport { getGlobalObject } from '@sentry/utils';\nimport { onHidden } from './onHidden';\nvar firstHiddenTime = -1;\nvar initHiddenTime = function () {\n    return getGlobalObject().document.visibilityState === 'hidden' ? 0 : Infinity;\n};\nvar trackChanges = function () {\n    // Update the time if/when the document becomes hidden.\n    onHidden(function (_a) {\n        var timeStamp = _a.timeStamp;\n        firstHiddenTime = timeStamp;\n    }, true);\n};\nexport var getVisibilityWatcher = function () {\n    if (firstHiddenTime < 0) {\n        // If the document is hidden when this code runs, assume it was hidden\n        // since navigation start. This isn't a perfect heuristic, but it's the\n        // best we can do until an API is available to support querying past\n        // visibilityState.\n        firstHiddenTime = initHiddenTime();\n        trackChanges();\n    }\n    return {\n        get firstHiddenTime() {\n            return firstHiddenTime;\n        },\n    };\n};\n//# sourceMappingURL=getVisibilityWatcher.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nexport var getFID = function (onReport, reportAllChanges) {\n    var visibilityWatcher = getVisibilityWatcher();\n    var metric = initMetric('FID');\n    var report;\n    var entryHandler = function (entry) {\n        // Only report if the page wasn't hidden prior to the first input.\n        if (report && entry.startTime < visibilityWatcher.firstHiddenTime) {\n            metric.value = entry.processingStart - entry.startTime;\n            metric.entries.push(entry);\n            report(true);\n        }\n    };\n    var po = observe('first-input', entryHandler);\n    if (po) {\n        report = bindReporter(onReport, metric, reportAllChanges);\n        onHidden(function () {\n            po.takeRecords().map(entryHandler);\n            po.disconnect();\n        }, true);\n    }\n};\n//# sourceMappingURL=getFID.js.map","/*\n * Copyright 2020 Google LLC\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 *     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 */\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nvar reportedMetricIDs = {};\nexport var getLCP = function (onReport, reportAllChanges) {\n    var visibilityWatcher = getVisibilityWatcher();\n    var metric = initMetric('LCP');\n    var report;\n    var entryHandler = function (entry) {\n        // The startTime attribute returns the value of the renderTime if it is not 0,\n        // and the value of the loadTime otherwise.\n        var value = entry.startTime;\n        // If the page was hidden prior to paint time of the entry,\n        // ignore it and mark the metric as final, otherwise add the entry.\n        if (value < visibilityWatcher.firstHiddenTime) {\n            metric.value = value;\n            metric.entries.push(entry);\n        }\n        if (report) {\n            report();\n        }\n    };\n    var po = observe('largest-contentful-paint', entryHandler);\n    if (po) {\n        report = bindReporter(onReport, metric, reportAllChanges);\n        var stopListening_1 = function () {\n            if (!reportedMetricIDs[metric.id]) {\n                po.takeRecords().map(entryHandler);\n                po.disconnect();\n                reportedMetricIDs[metric.id] = true;\n                report(true);\n            }\n        };\n        // Stop listening after input. Note: while scrolling is an input that\n        // stop LCP observation, it's unreliable since it can be programmatically\n        // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n        ['keydown', 'click'].forEach(function (type) {\n            addEventListener(type, stopListening_1, { once: true, capture: true });\n        });\n        onHidden(stopListening_1, true);\n    }\n};\n//# sourceMappingURL=getLCP.js.map","import { __assign, __rest } from \"tslib\";\nimport { browserPerformanceTimeOrigin, getGlobalObject, htmlTreeAsString, isNodeEnv, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\nimport { msToSec } from '../utils';\nimport { getCLS } from './web-vitals/getCLS';\nimport { getFID } from './web-vitals/getFID';\nimport { getLCP } from './web-vitals/getLCP';\nimport { getVisibilityWatcher } from './web-vitals/lib/getVisibilityWatcher';\nvar global = getGlobalObject();\n/** Class tracking metrics  */\nvar MetricsInstrumentation = /** @class */ (function () {\n    function MetricsInstrumentation(_reportAllChanges) {\n        if (_reportAllChanges === void 0) { _reportAllChanges = false; }\n        this._reportAllChanges = _reportAllChanges;\n        this._measurements = {};\n        this._performanceCursor = 0;\n        if (!isNodeEnv() && global && global.performance && global.document) {\n            if (global.performance.mark) {\n                global.performance.mark('sentry-tracing-init');\n            }\n            this._trackCLS();\n            this._trackLCP();\n            this._trackFID();\n        }\n    }\n    /** Add performance related spans to a transaction */\n    MetricsInstrumentation.prototype.addPerformanceEntries = function (transaction) {\n        var _this = this;\n        if (!global || !global.performance || !global.performance.getEntries || !browserPerformanceTimeOrigin) {\n            // Gatekeeper if performance API not available\n            return;\n        }\n        IS_DEBUG_BUILD && logger.log('[Tracing] Adding & adjusting spans using Performance API');\n        var timeOrigin = msToSec(browserPerformanceTimeOrigin);\n        var responseStartTimestamp;\n        var requestStartTimestamp;\n        global.performance\n            .getEntries()\n            .slice(this._performanceCursor)\n            .forEach(function (entry) {\n            var startTime = msToSec(entry.startTime);\n            var duration = msToSec(entry.duration);\n            if (transaction.op === 'navigation' && timeOrigin + startTime < transaction.startTimestamp) {\n                return;\n            }\n            switch (entry.entryType) {\n                case 'navigation': {\n                    addNavigationSpans(transaction, entry, timeOrigin);\n                    responseStartTimestamp = timeOrigin + msToSec(entry.responseStart);\n                    requestStartTimestamp = timeOrigin + msToSec(entry.requestStart);\n                    break;\n                }\n                case 'mark':\n                case 'paint':\n                case 'measure': {\n                    var startTimestamp = addMeasureSpans(transaction, entry, startTime, duration, timeOrigin);\n                    // capture web vitals\n                    var firstHidden = getVisibilityWatcher();\n                    // Only report if the page wasn't hidden prior to the web vital.\n                    var shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n                    if (entry.name === 'first-paint' && shouldRecord) {\n                        IS_DEBUG_BUILD && logger.log('[Measurements] Adding FP');\n                        _this._measurements['fp'] = { value: entry.startTime };\n                        _this._measurements['mark.fp'] = { value: startTimestamp };\n                    }\n                    if (entry.name === 'first-contentful-paint' && shouldRecord) {\n                        IS_DEBUG_BUILD && logger.log('[Measurements] Adding FCP');\n                        _this._measurements['fcp'] = { value: entry.startTime };\n                        _this._measurements['mark.fcp'] = { value: startTimestamp };\n                    }\n                    break;\n                }\n                case 'resource': {\n                    var resourceName = entry.name.replace(global.location.origin, '');\n                    addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin);\n                    break;\n                }\n                default:\n                // Ignore other entry types.\n            }\n        });\n        this._performanceCursor = Math.max(performance.getEntries().length - 1, 0);\n        this._trackNavigator(transaction);\n        // Measurements are only available for pageload transactions\n        if (transaction.op === 'pageload') {\n            // normalize applicable web vital values to be relative to transaction.startTimestamp\n            var timeOrigin_1 = msToSec(browserPerformanceTimeOrigin);\n            // Generate TTFB (Time to First Byte), which measured as the time between the beginning of the transaction and the\n            // start of the response in milliseconds\n            if (typeof responseStartTimestamp === 'number') {\n                IS_DEBUG_BUILD && logger.log('[Measurements] Adding TTFB');\n                this._measurements['ttfb'] = { value: (responseStartTimestamp - transaction.startTimestamp) * 1000 };\n                if (typeof requestStartTimestamp === 'number' && requestStartTimestamp <= responseStartTimestamp) {\n                    // Capture the time spent making the request and receiving the first byte of the response.\n                    // This is the time between the start of the request and the start of the response in milliseconds.\n                    this._measurements['ttfb.requestTime'] = { value: (responseStartTimestamp - requestStartTimestamp) * 1000 };\n                }\n            }\n            ['fcp', 'fp', 'lcp'].forEach(function (name) {\n                if (!_this._measurements[name] || timeOrigin_1 >= transaction.startTimestamp) {\n                    return;\n                }\n                // The web vitals, fcp, fp, lcp, and ttfb, all measure relative to timeOrigin.\n                // Unfortunately, timeOrigin is not captured within the transaction span data, so these web vitals will need\n                // to be adjusted to be relative to transaction.startTimestamp.\n                var oldValue = _this._measurements[name].value;\n                var measurementTimestamp = timeOrigin_1 + msToSec(oldValue);\n                // normalizedValue should be in milliseconds\n                var normalizedValue = Math.abs((measurementTimestamp - transaction.startTimestamp) * 1000);\n                var delta = normalizedValue - oldValue;\n                IS_DEBUG_BUILD &&\n                    logger.log(\"[Measurements] Normalized \" + name + \" from \" + oldValue + \" to \" + normalizedValue + \" (\" + delta + \")\");\n                _this._measurements[name].value = normalizedValue;\n            });\n            if (this._measurements['mark.fid'] && this._measurements['fid']) {\n                // create span for FID\n                _startChild(transaction, {\n                    description: 'first input delay',\n                    endTimestamp: this._measurements['mark.fid'].value + msToSec(this._measurements['fid'].value),\n                    op: 'web.vitals',\n                    startTimestamp: this._measurements['mark.fid'].value,\n                });\n            }\n            // If FCP is not recorded we should not record the cls value\n            // according to the new definition of CLS.\n            if (!('fcp' in this._measurements)) {\n                delete this._measurements.cls;\n            }\n            transaction.setMeasurements(this._measurements);\n            tagMetricInfo(transaction, this._lcpEntry, this._clsEntry);\n            transaction.setTag('sentry_reportAllChanges', this._reportAllChanges);\n        }\n    };\n    /**\n     * Capture the information of the user agent.\n     */\n    MetricsInstrumentation.prototype._trackNavigator = function (transaction) {\n        var navigator = global.navigator;\n        if (!navigator) {\n            return;\n        }\n        // track network connectivity\n        var connection = navigator.connection;\n        if (connection) {\n            if (connection.effectiveType) {\n                transaction.setTag('effectiveConnectionType', connection.effectiveType);\n            }\n            if (connection.type) {\n                transaction.setTag('connectionType', connection.type);\n            }\n            if (isMeasurementValue(connection.rtt)) {\n                this._measurements['connection.rtt'] = { value: connection.rtt };\n            }\n            if (isMeasurementValue(connection.downlink)) {\n                this._measurements['connection.downlink'] = { value: connection.downlink };\n            }\n        }\n        if (isMeasurementValue(navigator.deviceMemory)) {\n            transaction.setTag('deviceMemory', String(navigator.deviceMemory));\n        }\n        if (isMeasurementValue(navigator.hardwareConcurrency)) {\n            transaction.setTag('hardwareConcurrency', String(navigator.hardwareConcurrency));\n        }\n    };\n    /** Starts tracking the Cumulative Layout Shift on the current page. */\n    MetricsInstrumentation.prototype._trackCLS = function () {\n        var _this = this;\n        // See:\n        // https://web.dev/evolving-cls/\n        // https://web.dev/cls-web-tooling/\n        getCLS(function (metric) {\n            var entry = metric.entries.pop();\n            if (!entry) {\n                return;\n            }\n            IS_DEBUG_BUILD && logger.log('[Measurements] Adding CLS');\n            _this._measurements['cls'] = { value: metric.value };\n            _this._clsEntry = entry;\n        });\n    };\n    /** Starts tracking the Largest Contentful Paint on the current page. */\n    MetricsInstrumentation.prototype._trackLCP = function () {\n        var _this = this;\n        getLCP(function (metric) {\n            var entry = metric.entries.pop();\n            if (!entry) {\n                return;\n            }\n            var timeOrigin = msToSec(browserPerformanceTimeOrigin);\n            var startTime = msToSec(entry.startTime);\n            IS_DEBUG_BUILD && logger.log('[Measurements] Adding LCP');\n            _this._measurements['lcp'] = { value: metric.value };\n            _this._measurements['mark.lcp'] = { value: timeOrigin + startTime };\n            _this._lcpEntry = entry;\n        }, this._reportAllChanges);\n    };\n    /** Starts tracking the First Input Delay on the current page. */\n    MetricsInstrumentation.prototype._trackFID = function () {\n        var _this = this;\n        getFID(function (metric) {\n            var entry = metric.entries.pop();\n            if (!entry) {\n                return;\n            }\n            var timeOrigin = msToSec(browserPerformanceTimeOrigin);\n            var startTime = msToSec(entry.startTime);\n            IS_DEBUG_BUILD && logger.log('[Measurements] Adding FID');\n            _this._measurements['fid'] = { value: metric.value };\n            _this._measurements['mark.fid'] = { value: timeOrigin + startTime };\n        });\n    };\n    return MetricsInstrumentation;\n}());\nexport { MetricsInstrumentation };\n/** Instrument navigation entries */\nfunction addNavigationSpans(transaction, entry, timeOrigin) {\n    ['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'].forEach(function (event) {\n        addPerformanceNavigationTiming(transaction, entry, event, timeOrigin);\n    });\n    addPerformanceNavigationTiming(transaction, entry, 'secureConnection', timeOrigin, 'TLS/SSL', 'connectEnd');\n    addPerformanceNavigationTiming(transaction, entry, 'fetch', timeOrigin, 'cache', 'domainLookupStart');\n    addPerformanceNavigationTiming(transaction, entry, 'domainLookup', timeOrigin, 'DNS');\n    addRequest(transaction, entry, timeOrigin);\n}\n/** Create measure related spans */\nfunction addMeasureSpans(transaction, entry, startTime, duration, timeOrigin) {\n    var measureStartTimestamp = timeOrigin + startTime;\n    var measureEndTimestamp = measureStartTimestamp + duration;\n    _startChild(transaction, {\n        description: entry.name,\n        endTimestamp: measureEndTimestamp,\n        op: entry.entryType,\n        startTimestamp: measureStartTimestamp,\n    });\n    return measureStartTimestamp;\n}\n/** Create resource-related spans */\nexport function addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin) {\n    // we already instrument based on fetch and xhr, so we don't need to\n    // duplicate spans here.\n    if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n        return;\n    }\n    var data = {};\n    if ('transferSize' in entry) {\n        data['Transfer Size'] = entry.transferSize;\n    }\n    if ('encodedBodySize' in entry) {\n        data['Encoded Body Size'] = entry.encodedBodySize;\n    }\n    if ('decodedBodySize' in entry) {\n        data['Decoded Body Size'] = entry.decodedBodySize;\n    }\n    var startTimestamp = timeOrigin + startTime;\n    var endTimestamp = startTimestamp + duration;\n    _startChild(transaction, {\n        description: resourceName,\n        endTimestamp: endTimestamp,\n        op: entry.initiatorType ? \"resource.\" + entry.initiatorType : 'resource',\n        startTimestamp: startTimestamp,\n        data: data,\n    });\n}\n/** Create performance navigation related spans */\nfunction addPerformanceNavigationTiming(transaction, entry, event, timeOrigin, description, eventEnd) {\n    var end = eventEnd ? entry[eventEnd] : entry[event + \"End\"];\n    var start = entry[event + \"Start\"];\n    if (!start || !end) {\n        return;\n    }\n    _startChild(transaction, {\n        op: 'browser',\n        description: (description !== null && description !== void 0 ? description : event),\n        startTimestamp: timeOrigin + msToSec(start),\n        endTimestamp: timeOrigin + msToSec(end),\n    });\n}\n/** Create request and response related spans */\nfunction addRequest(transaction, entry, timeOrigin) {\n    _startChild(transaction, {\n        op: 'browser',\n        description: 'request',\n        startTimestamp: timeOrigin + msToSec(entry.requestStart),\n        endTimestamp: timeOrigin + msToSec(entry.responseEnd),\n    });\n    _startChild(transaction, {\n        op: 'browser',\n        description: 'response',\n        startTimestamp: timeOrigin + msToSec(entry.responseStart),\n        endTimestamp: timeOrigin + msToSec(entry.responseEnd),\n    });\n}\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\nexport function _startChild(transaction, _a) {\n    var startTimestamp = _a.startTimestamp, ctx = __rest(_a, [\"startTimestamp\"]);\n    if (startTimestamp && transaction.startTimestamp > startTimestamp) {\n        transaction.startTimestamp = startTimestamp;\n    }\n    return transaction.startChild(__assign({ startTimestamp: startTimestamp }, ctx));\n}\n/**\n * Checks if a given value is a valid measurement value.\n */\nfunction isMeasurementValue(value) {\n    return typeof value === 'number' && isFinite(value);\n}\n/** Add LCP / CLS data to transaction to allow debugging */\nfunction tagMetricInfo(transaction, lcpEntry, clsEntry) {\n    if (lcpEntry) {\n        IS_DEBUG_BUILD && logger.log('[Measurements] Adding LCP Data');\n        // Capture Properties of the LCP element that contributes to the LCP.\n        if (lcpEntry.element) {\n            transaction.setTag('lcp.element', htmlTreeAsString(lcpEntry.element));\n        }\n        if (lcpEntry.id) {\n            transaction.setTag('lcp.id', lcpEntry.id);\n        }\n        if (lcpEntry.url) {\n            // Trim URL to the first 200 characters.\n            transaction.setTag('lcp.url', lcpEntry.url.trim().slice(0, 200));\n        }\n        transaction.setTag('lcp.size', lcpEntry.size);\n    }\n    // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n    if (clsEntry && clsEntry.sources) {\n        IS_DEBUG_BUILD && logger.log('[Measurements] Adding CLS Data');\n        clsEntry.sources.forEach(function (source, index) {\n            return transaction.setTag(\"cls.source.\" + (index + 1), htmlTreeAsString(source.node));\n        });\n    }\n}\n//# sourceMappingURL=metrics.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { addInstrumentationHandler, isInstanceOf, isMatchingPattern } from '@sentry/utils';\nimport { getActiveTransaction, hasTracingEnabled } from '../utils';\nexport var DEFAULT_TRACING_ORIGINS = ['localhost', /^\\//];\nexport var defaultRequestInstrumentationOptions = {\n    traceFetch: true,\n    traceXHR: true,\n    tracingOrigins: DEFAULT_TRACING_ORIGINS,\n};\n/** Registers span creators for xhr and fetch requests  */\nexport function instrumentOutgoingRequests(_options) {\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    var _a = __assign(__assign({}, defaultRequestInstrumentationOptions), _options), traceFetch = _a.traceFetch, traceXHR = _a.traceXHR, tracingOrigins = _a.tracingOrigins, shouldCreateSpanForRequest = _a.shouldCreateSpanForRequest;\n    // We should cache url -> decision so that we don't have to compute\n    // regexp everytime we create a request.\n    var urlMap = {};\n    var defaultShouldCreateSpan = function (url) {\n        if (urlMap[url]) {\n            return urlMap[url];\n        }\n        var origins = tracingOrigins;\n        urlMap[url] =\n            origins.some(function (origin) { return isMatchingPattern(url, origin); }) &&\n                !isMatchingPattern(url, 'sentry_key');\n        return urlMap[url];\n    };\n    // We want that our users don't have to re-implement shouldCreateSpanForRequest themselves\n    // That's why we filter out already unwanted Spans from tracingOrigins\n    var shouldCreateSpan = defaultShouldCreateSpan;\n    if (typeof shouldCreateSpanForRequest === 'function') {\n        shouldCreateSpan = function (url) {\n            return defaultShouldCreateSpan(url) && shouldCreateSpanForRequest(url);\n        };\n    }\n    var spans = {};\n    if (traceFetch) {\n        addInstrumentationHandler('fetch', function (handlerData) {\n            fetchCallback(handlerData, shouldCreateSpan, spans);\n        });\n    }\n    if (traceXHR) {\n        addInstrumentationHandler('xhr', function (handlerData) {\n            xhrCallback(handlerData, shouldCreateSpan, spans);\n        });\n    }\n}\n/**\n * Create and track fetch request spans\n */\nexport function fetchCallback(handlerData, shouldCreateSpan, spans) {\n    if (!hasTracingEnabled() || !(handlerData.fetchData && shouldCreateSpan(handlerData.fetchData.url))) {\n        return;\n    }\n    if (handlerData.endTimestamp) {\n        var spanId = handlerData.fetchData.__span;\n        if (!spanId)\n            return;\n        var span = spans[spanId];\n        if (span) {\n            if (handlerData.response) {\n                // TODO (kmclb) remove this once types PR goes through\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                span.setHttpStatus(handlerData.response.status);\n            }\n            else if (handlerData.error) {\n                span.setStatus('internal_error');\n            }\n            span.finish();\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete spans[spanId];\n        }\n        return;\n    }\n    var activeTransaction = getActiveTransaction();\n    if (activeTransaction) {\n        var span = activeTransaction.startChild({\n            data: __assign(__assign({}, handlerData.fetchData), { type: 'fetch' }),\n            description: handlerData.fetchData.method + \" \" + handlerData.fetchData.url,\n            op: 'http.client',\n        });\n        handlerData.fetchData.__span = span.spanId;\n        spans[span.spanId] = span;\n        var request = (handlerData.args[0] = handlerData.args[0]);\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var options = (handlerData.args[1] = handlerData.args[1] || {});\n        var headers = options.headers;\n        if (isInstanceOf(request, Request)) {\n            headers = request.headers;\n        }\n        if (headers) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            if (typeof headers.append === 'function') {\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                headers.append('sentry-trace', span.toTraceparent());\n            }\n            else if (Array.isArray(headers)) {\n                headers = __spread(headers, [['sentry-trace', span.toTraceparent()]]);\n            }\n            else {\n                headers = __assign(__assign({}, headers), { 'sentry-trace': span.toTraceparent() });\n            }\n        }\n        else {\n            headers = { 'sentry-trace': span.toTraceparent() };\n        }\n        options.headers = headers;\n    }\n}\n/**\n * Create and track xhr request spans\n */\nexport function xhrCallback(handlerData, shouldCreateSpan, spans) {\n    if (!hasTracingEnabled() ||\n        (handlerData.xhr && handlerData.xhr.__sentry_own_request__) ||\n        !(handlerData.xhr && handlerData.xhr.__sentry_xhr__ && shouldCreateSpan(handlerData.xhr.__sentry_xhr__.url))) {\n        return;\n    }\n    var xhr = handlerData.xhr.__sentry_xhr__;\n    // check first if the request has finished and is tracked by an existing span which should now end\n    if (handlerData.endTimestamp) {\n        var spanId = handlerData.xhr.__sentry_xhr_span_id__;\n        if (!spanId)\n            return;\n        var span = spans[spanId];\n        if (span) {\n            span.setHttpStatus(xhr.status_code);\n            span.finish();\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete spans[spanId];\n        }\n        return;\n    }\n    // if not, create a new span to track it\n    var activeTransaction = getActiveTransaction();\n    if (activeTransaction) {\n        var span = activeTransaction.startChild({\n            data: __assign(__assign({}, xhr.data), { type: 'xhr', method: xhr.method, url: xhr.url }),\n            description: xhr.method + \" \" + xhr.url,\n            op: 'http.client',\n        });\n        handlerData.xhr.__sentry_xhr_span_id__ = span.spanId;\n        spans[handlerData.xhr.__sentry_xhr_span_id__] = span;\n        if (handlerData.xhr.setRequestHeader) {\n            try {\n                handlerData.xhr.setRequestHeader('sentry-trace', span.toTraceparent());\n            }\n            catch (_) {\n                // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n            }\n        }\n    }\n}\n//# sourceMappingURL=request.js.map","import { addInstrumentationHandler, getGlobalObject, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\nvar global = getGlobalObject();\n/**\n * Default function implementing pageload and navigation transactions\n */\nexport function instrumentRoutingWithDefaults(customStartTransaction, startTransactionOnPageLoad, startTransactionOnLocationChange) {\n    if (startTransactionOnPageLoad === void 0) { startTransactionOnPageLoad = true; }\n    if (startTransactionOnLocationChange === void 0) { startTransactionOnLocationChange = true; }\n    if (!global || !global.location) {\n        IS_DEBUG_BUILD && logger.warn('Could not initialize routing instrumentation due to invalid location');\n        return;\n    }\n    var startingUrl = global.location.href;\n    var activeTransaction;\n    if (startTransactionOnPageLoad) {\n        activeTransaction = customStartTransaction({ name: global.location.pathname, op: 'pageload' });\n    }\n    if (startTransactionOnLocationChange) {\n        addInstrumentationHandler('history', function (_a) {\n            var to = _a.to, from = _a.from;\n            /**\n             * This early return is there to account for some cases where a navigation transaction starts right after\n             * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n             * create an uneccessary navigation transaction.\n             *\n             * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n             * only be caused in certain development environments where the usage of a hot module reloader is causing\n             * errors.\n             */\n            if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n                startingUrl = undefined;\n                return;\n            }\n            if (from !== to) {\n                startingUrl = undefined;\n                if (activeTransaction) {\n                    IS_DEBUG_BUILD && logger.log(\"[Tracing] Finishing current transaction with op: \" + activeTransaction.op);\n                    // If there's an open transaction on the scope, we need to finish it before creating an new one.\n                    activeTransaction.finish();\n                }\n                activeTransaction = customStartTransaction({ name: global.location.pathname, op: 'navigation' });\n            }\n        });\n    }\n}\n//# sourceMappingURL=router.js.map","import { __assign } from \"tslib\";\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { IS_DEBUG_BUILD } from '../flags';\nimport { startIdleTransaction } from '../hubextensions';\nimport { DEFAULT_IDLE_TIMEOUT } from '../idletransaction';\nimport { extractTraceparentData, secToMs } from '../utils';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { MetricsInstrumentation } from './metrics';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests, } from './request';\nimport { instrumentRoutingWithDefaults } from './router';\nexport var DEFAULT_MAX_TRANSACTION_DURATION_SECONDS = 600;\nvar DEFAULT_BROWSER_TRACING_OPTIONS = __assign({ idleTimeout: DEFAULT_IDLE_TIMEOUT, markBackgroundTransactions: true, maxTransactionDuration: DEFAULT_MAX_TRANSACTION_DURATION_SECONDS, routingInstrumentation: instrumentRoutingWithDefaults, startTransactionOnLocationChange: true, startTransactionOnPageLoad: true }, defaultRequestInstrumentationOptions);\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library. This integration uses {@see IdleTransaction} to create transactions.\n */\nvar BrowserTracing = /** @class */ (function () {\n    function BrowserTracing(_options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = BrowserTracing.id;\n        /** Store configured idle timeout so that it can be added as a tag to transactions */\n        this._configuredIdleTimeout = undefined;\n        var tracingOrigins = defaultRequestInstrumentationOptions.tracingOrigins;\n        // NOTE: Logger doesn't work in constructors, as it's initialized after integrations instances\n        if (_options) {\n            this._configuredIdleTimeout = _options.idleTimeout;\n            if (_options.tracingOrigins && Array.isArray(_options.tracingOrigins) && _options.tracingOrigins.length !== 0) {\n                tracingOrigins = _options.tracingOrigins;\n            }\n            else {\n                IS_DEBUG_BUILD && (this._emitOptionsWarning = true);\n            }\n        }\n        this.options = __assign(__assign(__assign({}, DEFAULT_BROWSER_TRACING_OPTIONS), _options), { tracingOrigins: tracingOrigins });\n        var _metricOptions = this.options._metricOptions;\n        this._metrics = new MetricsInstrumentation(_metricOptions && _metricOptions._reportAllChanges);\n    }\n    /**\n     * @inheritDoc\n     */\n    BrowserTracing.prototype.setupOnce = function (_, getCurrentHub) {\n        var _this = this;\n        this._getCurrentHub = getCurrentHub;\n        if (this._emitOptionsWarning) {\n            IS_DEBUG_BUILD &&\n                logger.warn('[Tracing] You need to define `tracingOrigins` in the options. Set an array of urls or patterns to trace.');\n            IS_DEBUG_BUILD &&\n                logger.warn(\"[Tracing] We added a reasonable default for you: \" + defaultRequestInstrumentationOptions.tracingOrigins);\n        }\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _a = this.options, instrumentRouting = _a.routingInstrumentation, startTransactionOnLocationChange = _a.startTransactionOnLocationChange, startTransactionOnPageLoad = _a.startTransactionOnPageLoad, markBackgroundTransactions = _a.markBackgroundTransactions, traceFetch = _a.traceFetch, traceXHR = _a.traceXHR, tracingOrigins = _a.tracingOrigins, shouldCreateSpanForRequest = _a.shouldCreateSpanForRequest;\n        instrumentRouting(function (context) { return _this._createRouteTransaction(context); }, startTransactionOnPageLoad, startTransactionOnLocationChange);\n        if (markBackgroundTransactions) {\n            registerBackgroundTabDetection();\n        }\n        instrumentOutgoingRequests({ traceFetch: traceFetch, traceXHR: traceXHR, tracingOrigins: tracingOrigins, shouldCreateSpanForRequest: shouldCreateSpanForRequest });\n    };\n    /** Create routing idle transaction. */\n    BrowserTracing.prototype._createRouteTransaction = function (context) {\n        var _this = this;\n        if (!this._getCurrentHub) {\n            IS_DEBUG_BUILD &&\n                logger.warn(\"[Tracing] Did not create \" + context.op + \" transaction because _getCurrentHub is invalid.\");\n            return undefined;\n        }\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _a = this.options, beforeNavigate = _a.beforeNavigate, idleTimeout = _a.idleTimeout, maxTransactionDuration = _a.maxTransactionDuration;\n        var parentContextFromHeader = context.op === 'pageload' ? getHeaderContext() : undefined;\n        var expandedContext = __assign(__assign(__assign({}, context), parentContextFromHeader), { trimEnd: true });\n        var modifiedContext = typeof beforeNavigate === 'function' ? beforeNavigate(expandedContext) : expandedContext;\n        // For backwards compatibility reasons, beforeNavigate can return undefined to \"drop\" the transaction (prevent it\n        // from being sent to Sentry).\n        var finalContext = modifiedContext === undefined ? __assign(__assign({}, expandedContext), { sampled: false }) : modifiedContext;\n        if (finalContext.sampled === false) {\n            IS_DEBUG_BUILD && logger.log(\"[Tracing] Will not send \" + finalContext.op + \" transaction because of beforeNavigate.\");\n        }\n        IS_DEBUG_BUILD && logger.log(\"[Tracing] Starting \" + finalContext.op + \" transaction on scope\");\n        var hub = this._getCurrentHub();\n        var location = getGlobalObject().location;\n        var idleTransaction = startIdleTransaction(hub, finalContext, idleTimeout, true, { location: location });\n        idleTransaction.registerBeforeFinishCallback(function (transaction, endTimestamp) {\n            _this._metrics.addPerformanceEntries(transaction);\n            adjustTransactionDuration(secToMs(maxTransactionDuration), transaction, endTimestamp);\n        });\n        idleTransaction.setTag('idleTimeout', this._configuredIdleTimeout);\n        return idleTransaction;\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserTracing.id = 'BrowserTracing';\n    return BrowserTracing;\n}());\nexport { BrowserTracing };\n/**\n * Gets transaction context from a sentry-trace meta.\n *\n * @returns Transaction context data from the header or undefined if there's no header or the header is malformed\n */\nexport function getHeaderContext() {\n    var header = getMetaContent('sentry-trace');\n    if (header) {\n        return extractTraceparentData(header);\n    }\n    return undefined;\n}\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName) {\n    var el = getGlobalObject().document.querySelector(\"meta[name=\" + metaName + \"]\");\n    return el ? el.getAttribute('content') : null;\n}\n/** Adjusts transaction value based on max transaction duration */\nfunction adjustTransactionDuration(maxDuration, transaction, endTimestamp) {\n    var diff = endTimestamp - transaction.startTimestamp;\n    var isOutdatedTransaction = endTimestamp && (diff > maxDuration || diff < 0);\n    if (isOutdatedTransaction) {\n        transaction.setStatus('deadline_exceeded');\n        transaction.setTag('maxTransactionDurationExceeded', 'true');\n    }\n}\n//# sourceMappingURL=browsertracing.js.map","import { addExtensionMethods } from './hubextensions';\nimport * as Integrations from './integrations';\nexport { Integrations };\n// This is already exported as part of `Integrations` above (and for the moment will remain so for\n// backwards compatibility), but that interferes with treeshaking, so we also export it separately\n// here.\n//\n// Previously we expected users to import tracing integrations like\n//\n// import { Integrations } from '@sentry/tracing';\n// const instance = new Integrations.BrowserTracing();\n//\n// This makes the integrations unable to be treeshaken though. To address this, we now have\n// this individual export. We now expect users to consume BrowserTracing like so:\n//\n// import { BrowserTracing } from '@sentry/tracing';\n// const instance = new BrowserTracing();\n//\n// For an example of of the new usage of BrowserTracing, see @sentry/nextjs index.client.ts\nexport { BrowserTracing } from './browser';\nexport { Span, spanStatusfromHttpCode } from './span';\n// eslint-disable-next-line deprecation/deprecation\nexport { SpanStatus } from './spanstatus';\nexport { Transaction } from './transaction';\nexport { \n// TODO deprecate old name in v7\ninstrumentOutgoingRequests as registerRequestInstrumentation, defaultRequestInstrumentationOptions, } from './browser';\nexport { IdleTransaction } from './idletransaction';\nexport { startIdleTransaction } from './hubextensions';\n// We are patching the global object with our hub extension methods\naddExtensionMethods();\nexport { addExtensionMethods };\nexport { extractTraceparentData, getActiveTransaction, hasTracingEnabled, stripUrlQueryAndFragment, TRACEPARENT_REGEXP, } from './utils';\n//# sourceMappingURL=index.js.map","import * as Sentry from '@sentry/browser';\n// import {EventProcessor} from '@sentry/types/types/eventprocessor';\nimport {BrowserTracing} from '@sentry/tracing';\nimport {StoreController} from '../../store/controllers/StoreController';\nimport {sceneDataWithVersion} from '../../versions';\nimport {FeaturesController} from '../FeaturesController';\n// import {Editor} from '../Editor';\n\nfunction addSceneToEvent(event: Sentry.Event, hint?: Sentry.EventHint) {\n\ttry {\n\t\tconst scene = StoreController.scene;\n\t\tif (!scene) {\n\t\t\treturn;\n\t\t}\n\t\tconst sceneData = sceneDataWithVersion({scene, withPersistedConfig: false});\n\t\tevent.extra = {\n\t\t\tsceneData: JSON.stringify(sceneData),\n\t\t};\n\t} catch (err) {\n\t\tconsole.warn('failed to add scene data to event');\n\t\tconsole.error(err);\n\t}\n\t// Add anything to the event here\n\t// returning null will drop the event\n}\nfunction skipEvent(event: Sentry.Event, hint?: Sentry.EventHint): boolean {\n\t// console.log(event, hint);\n\t// console.log(event.message);\n\tconst values = event.exception?.values;\n\tif (values) {\n\t\tconst value = values[0];\n\t\tif (value) {\n\t\t\t// fetch for \\\"http://localhost:8091/three/js/libs/draco/gltf/draco_wasm_wrapper.js\\\" responded with 500: Internal Server Error\n\t\t\tif (\n\t\t\t\tvalue.value?.startsWith(`fetch for \"`) &&\n\t\t\t\tvalue.value?.endsWith(`responded with 500: Internal Server Error`)\n\t\t\t) {\n\t\t\t\tconsole.log(`skip lib fetch error`);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\nexport class ErrorsNotifier {\n\tstatic setup() {\n\t\tif (process.env.NODE_ENV != 'production') {\n\t\t\t// console.log(`sentry NOT initialised (NODE_ENV=${process.env.NODE_ENV})`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (FeaturesController.noErrorsNotifier()) {\n\t\t\treturn;\n\t\t}\n\n\t\tSentry.init({\n\t\t\tdsn: 'https://4e4ff56fa8934b03be5b2ba051145947@o276149.ingest.sentry.io/1494410',\n\t\t\tintegrations: [new BrowserTracing()],\n\n\t\t\t// Set tracesSampleRate to 1.0 to capture 100%\n\t\t\t// of transactions for performance monitoring.\n\t\t\t// We recommend adjusting this value in production\n\t\t\ttracesSampleRate: 1.0,\n\t\t\tbeforeSend: (event, hint) => {\n\t\t\t\tif (skipEvent(event)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\taddSceneToEvent(event);\n\t\t\t\treturn event;\n\t\t\t},\n\t\t});\n\n\t\t// Sentry.configureScope(function (scope) {\n\t\t// \tconsole.log(scope);\n\t\t// \tscope.addEventProcessor(function (event, hint) {\n\t\t// \t\taddSceneToEvent(event)\n\t\t// \t\treturn event;\n\t\t// \t});\n\t\t// });\n\n\t\t// const eventProcess:EventProcessor = (event: Sentry.Event)=>{\n\t\t// \tconst client = Sentry.getCurrentHub().getClient();\n\t\t// }\n\n\t\t// Sentry.addGlobalEventProcessor((event: Event) => {\n\t\t// \ttry {\n\t\t// \t  const client = Sentry.getCurrentHub().getClient();\n\t\t// \t  const endpoint = attachmentUrlFromDsn(\n\t\t// \t\tclient.getDsn(),\n\t\t// \t\tevent.event_id\n\t\t// \t  );\n\t\t// \t  const formData = new FormData();\n\t\t// \t  formData.append(\n\t\t// \t\t'my-attachment',\n\t\t// \t\tnew Blob([JSON.stringify({ logEntries: [\"my log\"] })], {\n\t\t// \t\t  type: 'application/json',\n\t\t// \t\t}),\n\t\t// \t\t'logs.json'\n\t\t// \t  );\n\t\t// \t  fetch(endpoint, {\n\t\t// \t\tmethod: 'POST',\n\t\t// \t\tbody: formData,\n\t\t// \t  }).catch((ex) => {\n\t\t// \t\t// we have to catch this otherwise it throws an infinite loop in Sentry\n\t\t// \t\tconsole.error(ex);\n\t\t// \t  });\n\t\t// \t  return event;\n\t\t// \t} catch (ex) {\n\t\t// \t  console.error(ex);\n\t\t// \t}\n\t\t//   });\n\n\t\tif (FeaturesController.debugErrorsNotifier()) {\n\t\t\tconsole.log('sentry initialized');\n\t\t}\n\t}\n\n\tstatic updateMetadata() {\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (!username) {\n\t\t\tconsole.warn('no username detected, you may not be logged in');\n\t\t\treturn;\n\t\t}\n\t\tSentry.setUser({username});\n\t}\n}\n","export const Constants = {\n\tNODE_HEIGHT: 50,\n\tCONNECTION_VERTICAL_MARGIN: 12,\n\tCONNECTION_VERTICAL_SPACING: 20,\n\tCONNECTION_VERTICAL_START: 10,\n\tNODE_UNIT: 50,\n\t// NODE_SIZE: 50,\n\t// NODE_POS_MULT: 1\n};\n","import {StoreController} from '../../store/controllers/StoreController';\nimport {PathTracingRendererRopNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/rop/PathTracingRenderer';\n\ninterface PaddedFrameOptions {\n\tframe: number;\n\textension: string;\n\tfileNamePrefix: string;\n\tframePadding: number;\n}\nfunction _paddedFrame(options: PaddedFrameOptions) {\n\tconst {extension, frame, fileNamePrefix, framePadding} = options;\n\tconst paddedFrame = `${frame}`.padStart(framePadding, '0');\n\tconst fileName = `${fileNamePrefix}.${paddedFrame}.${extension}`;\n\treturn fileName;\n}\nexport const PATH_TRACING_RENDER_EXTENSION = 'png';\n\ninterface FileNameOptions {\n\tnode: PathTracingRendererRopNode;\n\tframe: number;\n}\n\nexport async function pathTracingRendererFileName(options: FileNameOptions) {\n\tconst {node, frame} = options;\n\tconst fileNameParam = node.p.fileName;\n\tconst framePaddingParam = node.p.framePadding;\n\tif (fileNameParam.isDirty()) {\n\t\tawait fileNameParam.compute();\n\t}\n\tif (framePaddingParam.isDirty()) {\n\t\tawait framePaddingParam.compute();\n\t}\n\tconst fileNamePrefix = fileNameParam.value;\n\tconst framePadding = framePaddingParam.value;\n\treturn _paddedFrame({frame, extension: PATH_TRACING_RENDER_EXTENSION, fileNamePrefix, framePadding});\n}\n\nexport function pathTracingRendererFileNameSync(options: FileNameOptions) {\n\tconst {node, frame} = options;\n\tconst fileNameParamId = node.p.fileName.graphNodeId();\n\tconst framePaddingParamId = node.p.framePadding.graphNodeId();\n\tconst fileNameJsonParam = StoreController.engine.json_param(fileNameParamId);\n\tconst framePaddingJsonParam = StoreController.engine.json_param(framePaddingParamId);\n\tif (fileNameJsonParam == null) {\n\t\treturn;\n\t}\n\tif (framePaddingJsonParam == null) {\n\t\treturn;\n\t}\n\tconst fileNamePrefix = fileNameJsonParam.value as string;\n\tconst framePadding = framePaddingJsonParam.value as number;\n\n\treturn _paddedFrame({frame, extension: PATH_TRACING_RENDER_EXTENSION, fileNamePrefix, framePadding});\n}\n","import {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StringParam} from '../../../../@polygonjs/polygonjs/src/engine/params/String';\n\nexport function isHTTP(path: string) {\n\treturn path.startsWith('http://') || path.startsWith('https://');\n}\n\ninterface CheckNodeLocalAssetsOptions {\n\tparamsReferencingRemoteAsset: Set<StringParam>;\n\tparamsReferencingLocalAsset: StringParam[];\n}\n\nexport async function checkNodeLocalAssets(node: BaseNodeType, options: CheckNodeLocalAssetsOptions): Promise<void> {\n\tconst params = node.params.all;\n\tfor (let param of params) {\n\t\tif (param.type() == StringParam.type()) {\n\t\t\tconst stringParam = param as StringParam;\n\t\t\tif (stringParam.options.fileBrowseAllowed()) {\n\t\t\t\tif (stringParam.isDirty()) {\n\t\t\t\t\tawait stringParam.compute();\n\t\t\t\t}\n\n\t\t\t\tconst value = stringParam.value;\n\t\t\t\tif (value != null && value.length > 0) {\n\t\t\t\t\tif (isHTTP(value)) {\n\t\t\t\t\t\toptions.paramsReferencingRemoteAsset.add(stringParam);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toptions.paramsReferencingLocalAsset.push(stringParam);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\nimport {StringParam} from '../../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {setToArray} from '../../../../@polygonjs/polygonjs/src/core/SetUtils';\nimport {arrayUniq} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {Poly} from '../../../../@polygonjs/polygonjs/src/engine/Poly';\nimport {checkNodeLocalAssets, isHTTP} from './Common';\n\nexport class LocalAssetsSceneTraverser extends BaseSceneTraverser {\n\tprivate _paramsReferencingLocalAsset: StringParam[] = [];\n\tprivate _paramsReferencingRemoteAsset: Set<StringParam> = new Set();\n\n\tprotected override async _onBeforeTraverse() {\n\t\tthis._paramsReferencingLocalAsset.length = 0;\n\t\tthis._paramsReferencingRemoteAsset.clear();\n\t}\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tawait checkNodeLocalAssets(node, {\n\t\t\tparamsReferencingRemoteAsset: this._paramsReferencingRemoteAsset,\n\t\t\tparamsReferencingLocalAsset: this._paramsReferencingLocalAsset,\n\t\t});\n\t}\n\tstatic isHTTP(path: string) {\n\t\treturn isHTTP(path);\n\t}\n\n\tparams() {\n\t\treturn this._paramsReferencingLocalAsset;\n\t}\n\tparamsReferencingRemoteAsset() {\n\t\treturn setToArray(this._paramsReferencingRemoteAsset, []);\n\t}\n\tasync urls() {\n\t\t// const urls:string[]=[]\n\t\t// Poly.blobs.traverse((params)=>{\n\t\t// \turls.push(params.url)\n\t\t// })\n\t\t// return urls\n\n\t\t// const {fullUrls, storedUrls} = Poly.blobs.assetsManifestWithBlobsMap();\n\n\t\tconst paramValues: string[] = [];\n\t\tfor (const param of this._paramsReferencingLocalAsset) {\n\t\t\tif (param.isDirty()) {\n\t\t\t\tawait param.compute();\n\t\t\t}\n\t\t\tparamValues.push(param.value);\n\t\t}\n\n\t\t// function filterStoredUrls() {\n\t\t// \tconst fullUrlsPreQuery = new Set<string>();\n\t\t// \tfor (let fullUrl of fullUrls) {\n\t\t// \t\tconst preQueryUrl = fullUrl.split('?')[0];\n\t\t// \t\tfullUrlsPreQuery.add(preQueryUrl);\n\t\t// \t}\n\t\t// \tconst filteredStoredUrls = storedUrls.filter((storedUrl) => !fullUrlsPreQuery.has(storedUrl));\n\t\t// \treturn filteredStoredUrls;\n\t\t// }\n\t\t// const filteredStoredUrls = filterStoredUrls();\n\t\t// console.log(paramValues);\n\t\t// console.log(fullUrls);\n\t\t// console.log(storedUrls);\n\t\t// console.log(filteredStoredUrls);\n\n\t\t// also add the global blobs\n\t\tconst blobUrls: string[] = [];\n\t\tPoly.blobs.traverse((blobData) => {\n\t\t\tblobUrls.push(blobData.url);\n\t\t});\n\n\t\t// const list: string[] = [...paramValues, ...fullUrls, ...filteredStoredUrls];\n\t\tconst list: string[] = [...paramValues, ...blobUrls];\n\t\t// console.log(list);\n\t\tconst uniqList: string[] = [];\n\t\tarrayUniq(list, uniqList);\n\t\treturn uniqList;\n\t}\n}\n","// import {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\nimport {NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {OptimizedNodesJsonImporter} from '../../../../@polygonjs/polygonjs/src/engine/io/json/import/OptimizedNodes';\nimport {OPERATIONS_COMPOSER_NODE_TYPE} from '../../../../@polygonjs/polygonjs/src/engine/operations/_Base';\nimport {setToArray} from '../../../../@polygonjs/polygonjs/src/core/SetUtils';\nimport {PersistedConfigBaseJsData} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/_BaseJsPersistedConfig';\n\nconst NON_EXPORTED_CONTEXTS: Readonly<Set<NodeContext>> = new Set([NodeContext.GL, NodeContext.JS]);\nexport class UsedNodesSceneTraverser extends BaseSceneTraverser {\n\tprivate _nodeTypes: Set<string> = new Set();\n\tprivate _operationTypes: Set<string> = new Set();\n\tprivate _jsFunctionTypes: Set<string> = new Set();\n\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tconst node_type: string = node.type();\n\t\tconst context = node.context();\n\n\t\t//\n\t\tif (!NON_EXPORTED_CONTEXTS.has(context)) {\n\t\t\tconst context_and_type = `${context}/${node_type}`;\n\n\t\t\tconst is_optimized_root = OptimizedNodesJsonImporter.is_optimized_root_node_from_node(node);\n\t\t\tconst is_optimized = node.flags?.optimize?.active();\n\n\t\t\t// if is_optimized_root == true, the node is saved in both nodes and operations\n\t\t\t// but the node will be OperationsComposer\n\t\t\tif (is_optimized_root) {\n\t\t\t\tthis._operationTypes.add(context_and_type);\n\t\t\t\tconst node_type = OPERATIONS_COMPOSER_NODE_TYPE;\n\t\t\t\tconst node_context_and_type = `${context}/${node_type}`;\n\t\t\t\tthis._nodeTypes.add(node_context_and_type);\n\t\t\t} else {\n\t\t\t\tif (is_optimized) {\n\t\t\t\t\tthis._operationTypes.add(context_and_type);\n\t\t\t\t} else {\n\t\t\t\t\tthis._nodeTypes.add(context_and_type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\tif (node.persisted_config) {\n\t\t\t// in case the node is not displayed,\n\t\t\t// it may not be computed already,\n\t\t\t// and this is necessary to have an up to date persisted_config\n\t\t\t// UPDATE: but computing some actor nodes can take a long time,\n\t\t\t// so it should really be the minimum required to get the functionBody\n\t\t\t// await node.compute();\n\t\t\tconst data = await node.persisted_config.toData();\n\t\t\tif (data) {\n\t\t\t\tconst jsData = data as PersistedConfigBaseJsData;\n\t\t\t\tif (jsData.functionNames) {\n\t\t\t\t\tfor (const functionName of jsData.functionNames) {\n\t\t\t\t\t\tthis._jsFunctionTypes.add(functionName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// the sort is very important\n\t// to easily know if the matching engine export has been created or not\n\tusedNodes(): string[] {\n\t\treturn setToArray(this._nodeTypes, []).sort();\n\t}\n\tusedOperations(): string[] {\n\t\treturn setToArray(this._operationTypes, []).sort();\n\t}\n\tusedJsFunctionTypes(): string[] {\n\t\treturn setToArray(this._jsFunctionTypes, []).sort();\n\t}\n}\n","import {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\n\nexport class UsedAssemblersSceneTraverser extends BaseSceneTraverser {\n\tprivate _assembler_names: Dictionary<boolean> = {};\n\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tconst assembler_name = node.usedAssembler();\n\n\t\tif (assembler_name) {\n\t\t\tthis._assembler_names[assembler_name] = true;\n\t\t}\n\t}\n\n\tused_assemblers(): string[] {\n\t\t// the sort is very important\n\t\t// to easily know if the matching engine export has been created or not\n\t\treturn Object.keys(this._assembler_names).sort();\n\t}\n}\n","import {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\nimport {IntegrationData} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nexport class UsedIntegrationsSceneTraverser extends BaseSceneTraverser {\n\tprivate _integration_datas: Map<string, IntegrationData> = new Map();\n\n\t// constructor(protected override _scene: PolyScene) {\n\t// \tsuper(_scene, (node: BaseNodeType) => {\n\n\t// \t});\n\t// }\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tconst integration_data = node.integrationData();\n\t\tif (integration_data) {\n\t\t\tthis._integration_datas.set(integration_data.name, integration_data);\n\t\t}\n\t}\n\n\tused_integrations(): IntegrationData[] {\n\t\tconst datas: IntegrationData[] = [];\n\t\tthis._integration_datas.forEach((data) => {\n\t\t\tdatas.push(data);\n\t\t});\n\t\treturn datas;\n\t}\n}\n","import {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\nimport {NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {OptimizedNodesJsonImporter} from '../../../../@polygonjs/polygonjs/src/engine/io/json/import/OptimizedNodes';\nimport {OPERATIONS_COMPOSER_NODE_TYPE} from '../../../../@polygonjs/polygonjs/src/engine/operations/_Base';\n\nconst NON_EXPORTED_CONTEXTS = [NodeContext.GL, NodeContext.JS];\nexport class NodesMapSceneTraverser extends BaseSceneTraverser {\n\tprivate _node_type_by_node_path: Dictionary<string> = {};\n\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tconst is_optimized_root = OptimizedNodesJsonImporter.is_optimized_root_node_from_node(node);\n\n\t\tif (node.flags?.optimize?.active() && !is_optimized_root) {\n\t\t\treturn;\n\t\t}\n\t\tconst node_type: string = node.type();\n\t\tconst context = node.context();\n\t\tif (!NON_EXPORTED_CONTEXTS.includes(context)) {\n\t\t\tlet context_and_type = `${context}/${node_type}`;\n\t\t\tif (is_optimized_root) {\n\t\t\t\tcontext_and_type = `${context}/${OPERATIONS_COMPOSER_NODE_TYPE}`;\n\t\t\t}\n\t\t\tthis._node_type_by_node_path[node.path()] = context_and_type;\n\t\t}\n\t}\n\n\tnodes_map() {\n\t\treturn this._node_type_by_node_path;\n\t}\n}\n","import {NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {PolyNodeController} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {PolyNodeDataRegister} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDataRegister';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\n\nexport class PolyNodesSceneTraverser extends BaseSceneTraverser {\n\tprivate _polyNodes: Set<string> = new Set();\n\tprivate _polyNodeDataByContextAndType: Map<string, PolyNodeDataRegister<NodeContext>> = new Map();\n\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tif (node.polyNodeController) {\n\t\t\tconst str = `${node.context()}/${node.type()}`;\n\t\t\tif (!this._polyNodes.has(str)) {\n\t\t\t\tthis._polyNodes.add(str);\n\t\t\t\tconst data = await PolyNodeController.polyNodeData(node);\n\t\t\t\tthis._polyNodeDataByContextAndType.set(str, {\n\t\t\t\t\tnode_context: node.context(),\n\t\t\t\t\tnode_type: node.type(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tusedPolyNodes() {\n\t\treturn Array.from(this._polyNodes);\n\t}\n\tpolyNodesData() {\n\t\tconst list: PolyNodeDataRegister<NodeContext>[] = [];\n\t\tthis._polyNodeDataByContextAndType.forEach((data) => {\n\t\t\tlist.push(data);\n\t\t});\n\t\treturn list;\n\t}\n}\n","import {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseSceneTraverser} from './_Base';\nimport {NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {OptimizedNodesJsonImporter} from '../../../../@polygonjs/polygonjs/src/engine/io/json/import/OptimizedNodes';\nimport {ParamType} from '../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\n\nconst NON_EXPORTED_CONTEXTS = [NodeContext.GL, NodeContext.JS];\nexport class PropTypesSceneTraverser extends BaseSceneTraverser {\n\tprivate _paramTypeByPropPath: Map<string, ParamType> = new Map();\n\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tconst is_optimized_root = OptimizedNodesJsonImporter.is_optimized_root_node_from_node(node);\n\n\t\tif (node.flags?.optimize?.active() && !is_optimized_root) {\n\t\t\treturn;\n\t\t}\n\t\tconst context = node.context();\n\t\tif (!NON_EXPORTED_CONTEXTS.includes(context)) {\n\t\t\t// this._node_type_by_node_path[node.path()] = context_and_type;\n\n\t\t\tconst params = node.params.all;\n\t\t\tconst nodePath = node.path().replace(/\\//g, '-').substring(1);\n\t\t\tfor (let param of params) {\n\t\t\t\tconst paramPath = `${nodePath}--${param.name()}`;\n\t\t\t\tthis._paramTypeByPropPath.set(paramPath, param.type());\n\n\t\t\t\tif (param.components) {\n\t\t\t\t\tfor (let component of param.components) {\n\t\t\t\t\t\tconst componentPath = `${paramPath}-${component.name()}`;\n\t\t\t\t\t\tthis._paramTypeByPropPath.set(componentPath, component.type());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpropTypesMap() {\n\t\tconst lines: string[] = [];\n\t\tthis._paramTypeByPropPath.forEach((paramType, path) => {\n\t\t\tconst line = `\t'${path}'?: ParamValueSerializedTypeMap['${paramType}'];`;\n\t\t\tlines.push(line);\n\t\t});\n\t\treturn `{\n${lines.join('\\n')}\n}`;\n\t}\n}\n","import {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {ModuleName} from '../../../../@polygonjs/polygonjs/src/engine/poly/registers/modules/Common';\n\nexport class RequiredModulesSceneTraverser {\n\tprivate _requiredModules: ModuleName[] = [];\n\n\tconstructor(protected _scene: PolyScene) {}\n\n\tasync traverseScene() {\n\t\tconst usedModules: Map<ModuleName, boolean> = new Map();\n\t\tconst nodes = this._scene.nodesController.allNodes();\n\t\tfor (let node of nodes) {\n\t\t\tconst requiredModules: ModuleName[] | void = node.requiredModules();\n\t\t\tif (requiredModules) {\n\t\t\t\tfor (let requiredModule of requiredModules) {\n\t\t\t\t\tusedModules.set(requiredModule, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst names: ModuleName[] = [];\n\t\tusedModules.forEach((state, module_name) => {\n\t\t\tnames.push(module_name);\n\t\t});\n\t\tnames.sort();\n\t\tthis._requiredModules = names;\n\t}\n\n\trequiredModules() {\n\t\treturn this._requiredModules;\n\t}\n}\n","import {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {UsedNodesSceneTraverser} from './UsedNodes';\nimport {UsedAssemblersSceneTraverser} from './UsedAssemblers';\nimport {UsedIntegrationsSceneTraverser} from './UsedIntegrations';\nimport {NodesMapSceneTraverser} from './NodesMap';\nimport {PolyNodesSceneTraverser} from './PolyNodes';\nimport {LocalAssetsSceneTraverser} from './LocalAssets';\nimport {PropTypesSceneTraverser} from './PropTypes';\nimport {RequiredModulesSceneTraverser} from './RequiredModules';\n\nexport class MetaSceneTraverser {\n\tpublic readonly nodes: UsedNodesSceneTraverser;\n\tpublic readonly assemblers: UsedAssemblersSceneTraverser;\n\tpublic readonly integrations: UsedIntegrationsSceneTraverser;\n\tpublic readonly nodesMap: NodesMapSceneTraverser;\n\tpublic readonly polyNodes: PolyNodesSceneTraverser;\n\tpublic readonly localAssets: LocalAssetsSceneTraverser;\n\tpublic readonly propTypes: PropTypesSceneTraverser;\n\tpublic readonly modules: RequiredModulesSceneTraverser;\n\n\tconstructor(protected _scene: PolyScene) {\n\t\tthis.nodes = new UsedNodesSceneTraverser(this._scene);\n\t\tthis.assemblers = new UsedAssemblersSceneTraverser(this._scene);\n\t\tthis.integrations = new UsedIntegrationsSceneTraverser(this._scene);\n\t\tthis.nodesMap = new NodesMapSceneTraverser(this._scene);\n\t\tthis.polyNodes = new PolyNodesSceneTraverser(this._scene);\n\t\tthis.localAssets = new LocalAssetsSceneTraverser(this._scene);\n\t\tthis.propTypes = new PropTypesSceneTraverser(this._scene);\n\t\tthis.modules = new RequiredModulesSceneTraverser(this._scene);\n\t}\n\n\tasync traverseScene() {\n\t\tawait this.nodes.traverseScene();\n\t\tawait this.assemblers.traverseScene();\n\t\tawait this.integrations.traverseScene();\n\t\tawait this.nodesMap.traverseScene();\n\t\tawait this.polyNodes.traverseScene();\n\t\tawait this.localAssets.traverseScene();\n\t\tawait this.propTypes.traverseScene();\n\t\tawait this.modules.traverseScene();\n\t}\n}\n","// import {PhysicsRBDJointsSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PhysicsRBDJoints';\n// import {PhysicsRBDAttributesSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PhysicsRBDAttributes';\n// import {PhysicsGroundSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PhysicsGround';\n// import {PhysicsWorldSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PhysicsWorld';\n// import {SetPhysicsWorldGravityActorNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/actor/SetPhysicsWorldGravity';\n// import {SetPhysicsRBDPositionActorNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/actor/SetPhysicsRBDPosition';\n// import {PhysicsWorldStepSimulationActorNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/actor/PhysicsWorldStepSimulation';\n// import {PhysicsWorldResetActorNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/actor/PhysicsWorldReset';\n// import {PhysicsRBDApplyImpulseActorNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/actor/PhysicsRBDApplyImpulse';\nimport {BaseNodeType, BaseNodeClass} from './../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {setToArray} from './../../../../@polygonjs/polygonjs/src/core/SetUtils';\nimport {BaseSceneTraverser} from './_Base';\n\n// IFC\n// import {FileIFCSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/FileIFC';\n\n// Manifold\nimport {SDFBuilderSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/SDFBuilder';\n\n// mediapipe\nimport {TrackFaceJsNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/js/TrackFace';\nimport {TrackHandJsNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/js/TrackHand';\n\n// mapbox\nimport {MapboxElevationCopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/cop/MapboxElevation';\nimport {MapboxSatelliteCopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/cop/MapboxSatellite';\nimport {MapboxCameraSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxCamera';\nimport {MapboxLayerSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxLayer';\nimport {MapboxPlaneSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxPlane';\nimport {MapboxTransformSopNode} from './../../../../@polygonjs/polygonjs/src/engine/nodes/sop/MapboxTransform';\nimport {ModuleName} from './../../../../@polygonjs/polygonjs/src/engine/poly/registers/modules/Common';\nimport {StringParam} from '../../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {checkNodeLocalAssets} from './Common';\n\nconst IFC: any[] = [\n\t/*FileIFCSopNode*/\n];\nconst MANIFOLD = [SDFBuilderSopNode];\nconst MEDIAPIPE = [TrackFaceJsNode, TrackHandJsNode];\nconst MAPBOX_NODES = [\n\tMapboxElevationCopNode,\n\tMapboxSatelliteCopNode,\n\tMapboxCameraSopNode,\n\tMapboxLayerSopNode,\n\tMapboxPlaneSopNode,\n\tMapboxTransformSopNode,\n];\n\nconst NON_QUICK_EXPORTABLE_NODES: Array<typeof BaseNodeClass> = [\n\t// computer vision\n\t// actor\n\t...IFC,\n\t...MANIFOLD,\n\t...MEDIAPIPE,\n\t// physics\n\t// actor\n\t// PhysicsRBDApplyImpulseActorNode,\n\t// PhysicsWorldResetActorNode,\n\t// PhysicsWorldStepSimulationActorNode,\n\t// SetPhysicsRBDPositionActorNode,\n\t// SetPhysicsWorldGravityActorNode,\n\t// sop\n\t// PhysicsWorldSopNode,\n\t// PhysicsGroundSopNode,\n\t// PhysicsRBDAttributesSopNode,\n\t// PhysicsRBDJointsSopNode,\n\t// mapbox\n\t...MAPBOX_NODES,\n];\nconst SIGNATURES: Set<string> = new Set();\nfor (let nodeClass of NON_QUICK_EXPORTABLE_NODES) {\n\tSIGNATURES.add(`${nodeClass.context()}/${nodeClass.type()}`);\n}\nexport enum ExportNotAllowedReason {\n\tUSING_NON_EXPORTABLE_NODES = 'USING_NON_EXPORTABLE_NODES',\n\tUSING_LOCAL_ASSETS = 'USING_LOCAL_ASSETS',\n}\n\nexport class QuickExportableSceneTraverser extends BaseSceneTraverser {\n\tprivate _nonExportableNodes: Set<string> = new Set();\n\tprivate _paramsReferencingLocalAsset: StringParam[] = [];\n\tprivate _paramsReferencingRemoteAsset: Set<StringParam> = new Set();\n\n\tprotected override async _onBeforeTraverse() {\n\t\tthis._paramsReferencingLocalAsset.length = 0;\n\t\tthis._paramsReferencingRemoteAsset.clear();\n\t}\n\n\tprotected override async _traverse(node: BaseNodeType) {\n\t\tconst signature = `${node.context()}/${node.type()}`;\n\t\tif (SIGNATURES.has(signature)) {\n\t\t\tthis._nonExportableNodes.add(node.path());\n\t\t}\n\t\tconst requiredModules = node.requiredModules();\n\t\tif (requiredModules != null && requiredModules.includes(ModuleName.CAD)) {\n\t\t\tthis._nonExportableNodes.add(node.path());\n\t\t}\n\t\tawait checkNodeLocalAssets(node, {\n\t\t\tparamsReferencingRemoteAsset: this._paramsReferencingRemoteAsset,\n\t\t\tparamsReferencingLocalAsset: this._paramsReferencingLocalAsset,\n\t\t});\n\t}\n\tnonExportableNodePaths() {\n\t\treturn setToArray(this._nonExportableNodes, []);\n\t}\n\n\texportable() {\n\t\treturn this._nonExportableNodes.size == 0 && this._paramsReferencingLocalAsset.length == 0;\n\t}\n\treasons() {\n\t\tconst reasons: ExportNotAllowedReason[] = [];\n\t\tif (this._nonExportableNodes.size > 0) {\n\t\t\treasons.push(ExportNotAllowedReason.USING_NON_EXPORTABLE_NODES);\n\t\t}\n\t\tif (this._paramsReferencingLocalAsset.length > 0) {\n\t\t\treasons.push(ExportNotAllowedReason.USING_LOCAL_ASSETS);\n\t\t}\n\t\treturn reasons;\n\t}\n}\n","import {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\n// type OnBeforeTraverseCallback = () => void;\n// type TraverseCallback = (node: BaseNodeType) => void;\n\n// interface Options {\n// \tonBeforeTraverse?: OnBeforeTraverseCallback;\n// \tonTraverse: TraverseCallback;\n// }\n\nexport class BaseSceneTraverser {\n\tconstructor(protected _scene: PolyScene) {}\n\n\tprotected async _onBeforeTraverse() {}\n\tprotected async _traverse(node: BaseNodeType) {}\n\n\tasync traverseScene() {\n\t\tawait this._onBeforeTraverse();\n\t\tawait this.traverseNode(this._scene.root());\n\t}\n\n\tasync traverseNode(parent: BaseNodeType) {\n\t\tconst nodes = parent.children();\n\t\tif (!nodes || nodes.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let node of nodes) {\n\t\t\tawait this._traverse(node);\n\n\t\t\tif (node.childrenController) {\n\t\t\t\tawait this.traverseNode(node);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {BaseNodeType} from '../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseParamType} from '../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {StoreController} from '../store/controllers/StoreController';\n\nexport class ClipboardHelper {\n\tprivate static _copied_node: BaseNodeType;\n\tprivate static _copied_param: BaseParamType;\n\tconstructor() {}\n\n\tstatic copy_node(node: BaseNodeType) {\n\t\tthis._copied_node = node;\n\t\tthis.copy(node.path());\n\t\tStoreController.editor.clipboard.set_node_id(node.graphNodeId());\n\t}\n\tstatic get copied_node() {\n\t\treturn this._copied_node;\n\t}\n\tstatic copy_param(param: BaseParamType) {\n\t\tthis._copied_param = param;\n\t\tthis.copy(param.path());\n\t\tStoreController.editor.clipboard.set_param_id(param.graphNodeId());\n\t}\n\tstatic get copied_param() {\n\t\treturn this._copied_param;\n\t}\n\n\tstatic copy(text: string) {\n\t\tconst input = document.createElement('textarea');\n\t\tdocument.body.appendChild(input);\n\t\tinput.value = text;\n\t\tinput.select();\n\t\tdocument.execCommand('copy');\n\t\tdocument.body.removeChild(input);\n\t}\n\n\t// This does not yet work,\n\t// although I could use the Clipboard API\n\t// but that would require a notification\n\tstatic async paste() {\n\t\treturn navigator.clipboard.readText();\n\t\t// const input = document.createElement('textarea');\n\t\t// document.body.appendChild(input);\n\t\t// input.select();\n\t\t// document.execCommand('paste');\n\t\t// document.body.removeChild(input);\n\t}\n}\n","import {PolyScene} from './../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {StoreController} from '../store/controllers/StoreController';\nimport {Editor} from '../Editor';\nimport {TimeController} from '../../../@polygonjs/polygonjs/src/engine/scene/utils/TimeController';\nimport {\n\tlayoutDataToggleCodePreview,\n\tlayoutDataToggleSceneTree,\n\tlayoutDataToggleParamsStack,\n} from '../components/editor/top/Layout';\nimport {LayoutSwitchController} from '../components/editor/top/LayoutSwitchController';\n// import {EditorLayoutData} from '../types';\n\nenum EventName {\n\tPRESS = 'onKeypress',\n\tDOWN = 'onKeydown',\n\tUP = 'onKeyup',\n}\n\nexport interface KeyEventProcessor {\n\tpanelId: string;\n\tonKeypress: (event: KeyboardEvent) => boolean;\n\tonKeydown: (event: KeyboardEvent) => boolean;\n\tonKeyup: (event: KeyboardEvent) => boolean;\n\temit: (eventName: string, data?: any) => void;\n}\nfunction _toggleFullscreen(panelId: string) {\n\tif (StoreController.editor.panel.fullscreenPanelId()) {\n\t\tStoreController.editor.panel.setFullscreenPanelId(null);\n\t} else {\n\t\tStoreController.editor.panel.setFullscreenPanelId(panelId);\n\t}\n}\n\ninterface CallbackOptions {\n\tevent: KeyboardEvent;\n\tprocessor?: KeyEventProcessor;\n\tscene: PolyScene;\n}\ntype KeyboardEventCallback = (options: CallbackOptions) => void;\n\nconst closePopups = function () {\n\tStoreController.closeAllPopups();\n};\nconst moveForward = function (options: CallbackOptions) {\n\t// moving forward/backward should only work when not playing\n\t// so that we don't conflict with player controls\n\t// or even just the normal timeline\n\tif (options.scene.timeController.playing()) {\n\t\treturn;\n\t}\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\treturn options.scene.setFrame(options.scene.maxFrame());\n\t} else {\n\t\treturn options.scene.timeController.setFrame(options.scene.frame() + 1);\n\t}\n};\nconst moveBackward = function (options: CallbackOptions) {\n\tif (options.scene.timeController.playing()) {\n\t\treturn;\n\t}\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\treturn options.scene.setFrame(TimeController.START_FRAME);\n\t} else {\n\t\treturn options.scene.timeController.setFrame(options.scene.frame() - 1);\n\t}\n};\nconst toggleFullScreen: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\tif (options.processor) {\n\t\t\t_toggleFullscreen(options.processor.panelId);\n\t\t\toptions.event.preventDefault();\n\t\t}\n\t}\n};\nconst toggleCodePreview: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\tif (!options.processor) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentLayoutData = Editor.instance().layoutData();\n\t\tconst newMultiplePanel = layoutDataToggleCodePreview(currentLayoutData.multiple_panel);\n\t\tLayoutSwitchController.updateLayout(newMultiplePanel, () => {});\n\t}\n};\nconst toggleSceneTree: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\tif (!options.processor) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentLayoutData = Editor.instance().layoutData();\n\t\tconst newMultiplePanel = layoutDataToggleSceneTree(currentLayoutData.multiple_panel);\n\t\tLayoutSwitchController.updateLayout(newMultiplePanel, () => {});\n\n\t\toptions.event.preventDefault();\n\t}\n};\nconst toggleParamsStack: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\tif (!options.processor) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentLayoutData = Editor.instance().layoutData();\n\t\tconst newMultiplePanel = layoutDataToggleParamsStack(currentLayoutData.multiple_panel);\n\t\tLayoutSwitchController.updateLayout(newMultiplePanel, () => {});\n\n\t\toptions.event.preventDefault();\n\t}\n};\nconst redo: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\treturn Editor.instance().redo();\n\t}\n};\nconst saveScene: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\toptions.event.preventDefault();\n\t\tEditor.instance().save();\n\t\treturn false;\n\t}\n};\nconst showCommandPalette: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\t// prevent print window\n\t\toptions.event.preventDefault();\n\t\tStoreController.editor.commandPalette.displayToGoNode();\n\t\treturn false;\n\t}\n};\nconst togglePlayPause = function (options: CallbackOptions) {\n\treturn StoreController.scene.timeController.togglePlayPause();\n};\nconst undo: KeyboardEventCallback = function (options: CallbackOptions) {\n\tif (options.event.ctrlKey || options.event.metaKey) {\n\t\treturn Editor.instance().undo();\n\t}\n};\nconst interruptVideoCapture = function () {\n\tStoreController.editor.captureForm.interrupt();\n};\n\nconst ON_KEYPRESS: Map<string, KeyboardEventCallback> = new Map();\n// symbols\nON_KEYPRESS.set('ArrowLeft', moveBackward);\nON_KEYPRESS.set('ArrowRight', moveForward);\n// play/pause with arrows are annoying when playing and controlling a character\n// UPDATE: I re-introduce them since the player can also be controlled with WASD\nON_KEYPRESS.set('ArrowUp', togglePlayPause);\nON_KEYPRESS.set('ArrowDown', togglePlayPause);\n// uppercase\nON_KEYPRESS.set('P', showCommandPalette);\nON_KEYPRESS.set('S', saveScene);\n// lowercase\n// ON_KEYPRESS.set('b', toggleFullScreen); // do not activate or this opens the bookmarks in firefox\nON_KEYPRESS.set('i', toggleCodePreview);\nON_KEYPRESS.set('9', toggleParamsStack);\nON_KEYPRESS.set('0', toggleSceneTree);\nON_KEYPRESS.set('p', showCommandPalette);\nON_KEYPRESS.set('s', saveScene);\nON_KEYPRESS.set('y', redo);\nON_KEYPRESS.set('z', undo);\n\nconst ON_KEYDOWN: Map<string, KeyboardEventCallback> = new Map();\n// symbols\nON_KEYDOWN.set('ArrowLeft', moveBackward);\nON_KEYDOWN.set('ArrowRight', moveForward);\nON_KEYDOWN.set('ArrowUp', togglePlayPause);\nON_KEYDOWN.set('ArrowDown', togglePlayPause);\n// uppercase\nON_KEYDOWN.set('P', showCommandPalette);\nON_KEYDOWN.set('S', saveScene);\n// lowercase\nON_KEYDOWN.set('b', toggleFullScreen);\nON_KEYDOWN.set('i', toggleCodePreview);\nON_KEYDOWN.set('9', toggleParamsStack);\nON_KEYDOWN.set('0', toggleSceneTree);\nON_KEYDOWN.set('p', showCommandPalette);\nON_KEYDOWN.set('s', saveScene);\nON_KEYDOWN.set('y', redo);\nON_KEYDOWN.set('z', undo);\nON_KEYDOWN.set('Escape', interruptVideoCapture);\n\nconst ON_KEYUP: Map<string, KeyboardEventCallback> = new Map();\n// symbols\nON_KEYUP.set('Escape', closePopups);\n\nexport class KeyEventsDispatcher {\n\tprivate static _instance: KeyEventsDispatcher | undefined;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new KeyEventsDispatcher());\n\t}\n\n\tprivate _active: boolean = false;\n\tprivate _on_keypress_bound: (event: KeyboardEvent) => void;\n\tprivate _on_keydown_bound: (event: KeyboardEvent) => void;\n\tprivate _on_keyup_bound: (event: KeyboardEvent) => void;\n\tprivate _processor: KeyEventProcessor | undefined;\n\n\t// TODO: typescript - do I need this to have a component?\n\t// probably not, as it only seems to be to access the store\n\tprivate constructor(/*component?: any*/) {\n\t\t// this.component = component;\n\t\t// this._processor = null;\n\t\tthis._on_keypress_bound = this._onKeypress.bind(this);\n\t\tthis._on_keydown_bound = this._onKeydown.bind(this);\n\t\tthis._on_keyup_bound = this._onKeyup.bind(this);\n\t\tthis.activate();\n\t}\n\n\tstatic activate() {\n\t\tthis.instance().activate();\n\t}\n\tactivate() {\n\t\tif (!this._active) {\n\t\t\tthis._active = true;\n\t\t\tdocument.addEventListener('keypress', this._on_keypress_bound);\n\t\t\tdocument.addEventListener('keydown', this._on_keydown_bound);\n\t\t\tdocument.addEventListener('keyup', this._on_keyup_bound);\n\t\t}\n\t}\n\tstatic deactivate() {\n\t\tthis.instance().deactivate();\n\t}\n\tdeactivate() {\n\t\tif (this._active) {\n\t\t\tthis._active = false;\n\t\t\tdocument.removeEventListener('keypress', this._on_keypress_bound);\n\t\t\tdocument.removeEventListener('keydown', this._on_keydown_bound);\n\t\t\tdocument.removeEventListener('keyup', this._on_keyup_bound);\n\t\t}\n\t}\n\n\tregisterProcessor(processor: KeyEventProcessor) {\n\t\tif (processor !== this._processor) {\n\t\t\tthis._processor = processor;\n\t\t}\n\t}\n\tderegisterProcessor(processor: KeyEventProcessor) {\n\t\tif (processor === this._processor) {\n\t\t\tthis._processor = undefined;\n\t\t}\n\t}\n\n\tprivate _onKeypress(e: KeyboardEvent) {\n\t\tthis._processOnKeyEvent(e, EventName.PRESS);\n\t}\n\tprivate _onKeydown(e: KeyboardEvent) {\n\t\tthis._processOnKeyEvent(e, EventName.DOWN);\n\t}\n\tprivate _onKeyup(e: KeyboardEvent) {\n\t\tthis._processOnKeyEvent(e, EventName.UP);\n\t}\n\n\t_processOnKeyEvent(event: KeyboardEvent, eventType: EventName) {\n\t\tlet keyProcessed: boolean = false;\n\t\tif (this._processor) {\n\t\t\tconst method = this._processor[eventType];\n\t\t\tif (method) {\n\t\t\t\tkeyProcessed = method(event);\n\t\t\t}\n\t\t}\n\t\tif (!keyProcessed) {\n\t\t\tthis[eventType](event);\n\t\t}\n\t}\n\n\tprivate _callbackExecutedOnKeydown: KeyboardEventCallback | undefined;\n\tonKeypress(event: KeyboardEvent) {\n\t\tconst callback = ON_KEYPRESS.get(event.key);\n\t\tif (this._callbackExecutedOnKeydown === callback) {\n\t\t\t// as firefox does not seem to run undo/redo shortcuts\n\t\t\t// in onKeypress,\n\t\t\t// we have to run them in onKeydown.\n\t\t\t// But that could lead to a double undo in chrome,\n\t\t\t// so we check here that we are not about to run the\n\t\t\t// same callback twice\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tcallback({\n\t\t\t\tevent,\n\t\t\t\tprocessor: this._processor,\n\t\t\t\tscene: StoreController.engine.scene,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\t// switch (event.key) {\n\t\t// \tcase 'y':\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\treturn Editor.instance().redo();\n\t\t// \t\t}\n\t\t// \t\tbreak;\n\t\t// \tcase 'z':\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\treturn Editor.instance().undo();\n\t\t// \t\t}\n\t\t// \t\tbreak;\n\t\t// \tdefault:\n\t\t// \t\tswitch (event.code) {\n\t\t// \t\t\tcase 'Space':\n\t\t// \t\t\t\treturn StoreController.scene.timeController.togglePlayPause();\n\t\t// \t\t}\n\t\t// }\n\t\t// // }\n\t}\n\n\tonKeydown(event: KeyboardEvent) {\n\t\tthis._callbackExecutedOnKeydown = ON_KEYDOWN.get(event.key);\n\t\tif (this._callbackExecutedOnKeydown) {\n\t\t\tthis._callbackExecutedOnKeydown({\n\t\t\t\tevent,\n\t\t\t\tprocessor: this._processor,\n\t\t\t\tscene: StoreController.engine.scene,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\t// switch (event.key) {\n\t\t// \tcase 'y':\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\treturn Editor.instance().redo();\n\t\t// \t\t}\n\t\t// \t\tbreak;\n\t\t// \tcase 'z':\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\treturn Editor.instance().undo();\n\t\t// \t\t}\n\t\t// \t\tbreak;\n\t\t// \tcase 'b': {\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\tif (this._processor) {\n\t\t// \t\t\t\t_toggleFullscreen(this._processor?.panelId);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t\treturn;\n\t\t// \t}\n\t\t// \tcase 's':\n\t\t// \tcase 'S': // also catch uppercase, in case capslock is on\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\tevent.preventDefault();\n\t\t// \t\t\tEditor.instance().save();\n\t\t// \t\t\treturn false;\n\t\t// \t\t}\n\t\t// \t\tbreak;\n\t\t// \tcase 'p':\n\t\t// \tcase 'P': {\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\t// prevent print window\n\t\t// \t\t\tevent.preventDefault();\n\t\t// \t\t\tStoreController.editor.commandPalette.displayToGoNode();\n\t\t// \t\t\treturn false;\n\t\t// \t\t}\n\t\t// \t\tbreak;\n\t\t// \t}\n\n\t\t// \tcase 'ArrowRight':\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\treturn scene.setFrame(scene.maxFrame());\n\t\t// \t\t} else {\n\t\t// \t\t\treturn scene.timeController.setFrame(scene.frame() + 1);\n\t\t// \t\t}\n\t\t// \tcase 'ArrowLeft':\n\t\t// \t\tif (event.ctrlKey || event.metaKey) {\n\t\t// \t\t\treturn scene.setFrame(TimeController.START_FRAME);\n\t\t// \t\t} else {\n\t\t// \t\t\treturn scene.timeController.setFrame(scene.frame() - 1);\n\t\t// \t\t}\n\t\t// }\n\t}\n\n\tonKeyup(event: KeyboardEvent) {\n\t\t// if (event.key == 'Escape') {\n\t\t// \tStoreController.closeAllPopups();\n\t\t// }\n\t\tconst callback = ON_KEYUP.get(event.key);\n\t\tif (callback) {\n\t\t\tcallback({\n\t\t\t\tevent,\n\t\t\t\tprocessor: this._processor,\n\t\t\t\tscene: StoreController.engine.scene,\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t}\n}\n","import {createCommandFromJSON} from './utils/CommandFactory';\nimport {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, CommandTypeJSON, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\n\nexport interface MultipleCommandJSON extends BaseCommandJSON {\n\tsubCommands: CommandTypeJSON[];\n}\n\nexport class MultipleCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.MULTIPLE;\n\tprivate _commands: BaseCommand[] = [];\n\n\tpushCommand(command: BaseCommand) {\n\t\tthis._commands.push(command);\n\t}\n\tcommandsCount() {\n\t\treturn this._commands.length;\n\t}\n\toverride dataUpdateRequired() {\n\t\tfor (let cmd of this._commands) {\n\t\t\tif (cmd.dataUpdateRequired()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tasync _do() {\n\t\tthis._scene.cooker.block();\n\t\tfor (let command of this._commands) {\n\t\t\tawait command._do();\n\t\t}\n\t\tthis._scene.cooker.unblock();\n\t}\n\n\tasync _undo() {\n\t\tfor (let i = this._commands.length - 1; i >= 0; i--) {\n\t\t\tawait this._commands[i]._undo();\n\t\t}\n\t}\n\toverride async toJSON(): Promise<MultipleCommandJSON> {\n\t\tconst subCommands: CommandTypeJSON[] = [];\n\t\tfor (let subCommand of this._commands) {\n\t\t\tsubCommands.push(await subCommand.toJSON());\n\t\t}\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tsubCommands,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: MultipleCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst multiCmd = new MultipleCommand(scene);\n\t\tfor (let subCommandData of json.subCommands) {\n\t\t\tconst cmd = createCommandFromJSON(scene, subCommandData, mode);\n\t\t\tif (cmd) {\n\t\t\t\tmultiCmd.pushCommand(cmd);\n\t\t\t} else {\n\t\t\t\tconsole.warn('failed to generate command from ', subCommandData);\n\t\t\t}\n\t\t}\n\t\treturn multiCmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {LinkIndex} from './../../components/panels/common/LinkIndex';\nimport {NetworkClipboardHelperRegister} from './../../core/clipboard/NetworkClipboardHelperRegister';\nimport {Vector2Like} from './../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {SafeNodeRemover} from './../../core/SafeNodeRemover';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {\n\tNetworkClipBoardHelper,\n\tNetworkClipBoardHelperJSON,\n\tNetworkClipBoardHelperOptions,\n} from '../../core/clipboard/NetworkClipboardHelper';\nimport {Vector2} from 'three';\nimport {arrayXOR} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nexport interface NodeClipboardPasteJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tlinkIndex: LinkIndex;\n\tcamPosition: Vector2Like;\n\tclipboardHelper: NetworkClipBoardHelperJSON;\n\taddedNodeNames: string[];\n}\ninterface SerializedData {\n\tclipboardHelper: NetworkClipBoardHelperJSON;\n\taddedNodeNames: string[];\n}\nconst CLIPBOARD_HELPER_OPTIONS: NetworkClipBoardHelperOptions = {\n\tprintToConsole: false,\n\tstoreCode: false,\n};\nexport class NodeClipboardPasteCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_CLIPBOARD_PASTE;\n\tprivate _camPosition: Vector2;\n\tprivate _addedNodeNames: string[] = [];\n\tprivate _parentPath: string;\n\tprivate _clipboardHelper: NetworkClipBoardHelper;\n\tconstructor(private _parentNode: BaseNodeType, private _linkIndex: LinkIndex, _camPosition: Vector2) {\n\t\tsuper(_parentNode.scene());\n\t\tthis._parentPath = _parentNode.path();\n\t\tthis._camPosition = _camPosition.clone();\n\t\tthis._clipboardHelper = NetworkClipboardHelperRegister.helper(this._linkIndex);\n\t}\n\toverride dataUpdateRequired() {\n\t\treturn true;\n\t}\n\tprivate _setSerializedData(data: SerializedData) {\n\t\tthis._clipboardHelper = NetworkClipBoardHelper.fromJSON(data.clipboardHelper, CLIPBOARD_HELPER_OPTIONS);\n\t\tthis._addedNodeNames = data.addedNodeNames;\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parent to paste into');\n\t\t\treturn;\n\t\t}\n\t\tconst existingNodeNames = parentNode.children().map((n: BaseNodeType) => n.name());\n\t\tawait this._clipboardHelper.pasteInNode(parentNode, this._camPosition);\n\t\tconst newNodeNames = parentNode.children().map((n: BaseNodeType) => n.name());\n\t\tarrayXOR(newNodeNames, existingNodeNames, this._addedNodeNames);\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tparentNode.scene().batchUpdates(() => {\n\t\t\tfor (let nodeName of this._addedNodeNames) {\n\t\t\t\tconst node = parentNode.node(nodeName);\n\t\t\t\tif (node) {\n\t\t\t\t\tSafeNodeRemover.removeNodes(parentNode, [node]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\toverride async toJSON(): Promise<NodeClipboardPasteJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tlinkIndex: this._linkIndex,\n\t\t\tcamPosition: {x: this._camPosition.x, y: this._camPosition.y},\n\t\t\tclipboardHelper: await this._clipboardHelper.toJSON(this._parentNode),\n\t\t\taddedNodeNames: this._addedNodeNames,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeClipboardPasteJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst linkIndex = json.linkIndex;\n\t\tconst camPosition = new Vector2(json.camPosition.x, json.camPosition.y);\n\t\tconst cmd = new NodeClipboardPasteCommand(parent, linkIndex, camPosition);\n\t\tcmd._setSerializedData(json);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\ninterface IsNodeConnectCommandRequiredOptions {\n\tnodeSrc: BaseNodeType | null;\n\tnodeDest: BaseNodeType;\n\tinputIndex: number;\n\toutputIndex?: number;\n}\n\nexport function isNodeConnectCommandRequired(options: IsNodeConnectCommandRequiredOptions): boolean {\n\tconst {nodeSrc, nodeDest, inputIndex, outputIndex} = options;\n\tif (!nodeSrc) {\n\t\t// if there is no nodeSrc, and nodeDest input is already null, no need for this command\n\t\tif (nodeDest.io.inputs.input(inputIndex) == null) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tconst connection = nodeDest.io.connections.inputConnection(inputIndex);\n\tif (!connection) {\n\t\t// if there is no connection, we need the comand\n\t\treturn true;\n\t}\n\tif (connection.nodeSrc() != nodeSrc) {\n\t\t// if the connection node_src is different, we need the comand\n\t\treturn true;\n\t}\n\tif (connection.outputIndex() != outputIndex) {\n\t\t// if the connection output_index is different, we need the comand\n\t\treturn true;\n\t}\n\t// otherwise, return false\n\treturn false;\n}\ninterface OldNodeData {\n\tsrcName?: string;\n\toutputIndex?: number;\n}\nexport interface NodeConnectCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeSrcName: string | null;\n\tnodeDestName: string;\n\tinputIndex: number;\n\toutputIndex?: number;\n\toldNodeData: OldNodeData;\n}\n\nexport class NodeConnectCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_CONNECT;\n\tprivate _parentPath: string;\n\tprivate _nodeSrcName: string | null = null;\n\tprivate _nodeDestName: string;\n\tprivate readonly _oldNodeData: OldNodeData = {};\n\t// private _oldNodeSrcName: string | null = null;\n\t// private _oldNodeOutputIndex: number | undefined;\n\n\tconstructor(\n\t\t_parent: BaseNodeType,\n\t\t_nodeSrc: BaseNodeType | null,\n\t\t_nodeDest: BaseNodeType,\n\t\tprivate _inputIndex: number,\n\t\tprivate _outputIndex?: number\n\t) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tif (_nodeSrc) {\n\t\t\tthis._nodeSrcName = _nodeSrc.name();\n\t\t}\n\t\tthis._nodeDestName = _nodeDest.name();\n\n\t\tthis._oldNodeData.srcName = _nodeDest.io.inputs.input(this._inputIndex)?.name();\n\t\t// this._setOldNodeSrcName(_nodeDest.io.inputs.input(this._inputIndex)?.name());\n\t\tconst input_connection = (_nodeDest.io.inputs.namedInputConnectionPoints()||[])[this._inputIndex];\n\t\tif (input_connection) {\n\t\t\tconst input_connections = _nodeDest.io.connections.inputConnections();\n\t\t\tif (input_connections) {\n\t\t\t\tconst input_connection = input_connections[this._inputIndex];\n\t\t\t\tif (input_connection) {\n\t\t\t\t\tthis._oldNodeData.outputIndex = input_connection.outputIndex();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _setOldNodeData(data: OldNodeData) {\n\t\tthis._oldNodeData.srcName = data.srcName;\n\t\tthis._oldNodeData.outputIndex = data.outputIndex;\n\t}\n\tprivate _nodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\treturn {\n\t\t\tsrcNode: this._nodeSrcName ? parentNode.node(this._nodeSrcName) : null,\n\t\t\tdestNode: parentNode.node(this._nodeDestName),\n\t\t};\n\t}\n\n\tasync _do() {\n\t\tconst nodesData = this._nodes();\n\t\tif (!nodesData) {\n\t\t\treturn;\n\t\t}\n\t\tconst {destNode, srcNode} = nodesData;\n\t\tif (!destNode) {\n\t\t\treturn;\n\t\t}\n\t\tdestNode.setInput(this._inputIndex, srcNode, this._outputIndex);\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parentNode');\n\t\t\treturn;\n\t\t}\n\t\tconst nodesData = this._nodes();\n\t\tif (!nodesData) {\n\t\t\tconsole.warn('no nodesData');\n\t\t\treturn;\n\t\t}\n\t\tconst {destNode} = nodesData;\n\t\tif (!destNode) {\n\t\t\tconsole.warn('no destNode');\n\t\t\treturn;\n\t\t}\n\t\tconst oldNodeSrc = this._oldNodeData.srcName ? parentNode.node(this._oldNodeData.srcName) : null;\n\t\tdestNode.setInput(this._inputIndex, oldNodeSrc, this._oldNodeData.outputIndex);\n\t}\n\toverride async toJSON(): Promise<NodeConnectCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeSrcName: this._nodeSrcName,\n\t\t\tnodeDestName: this._nodeDestName,\n\t\t\tinputIndex: this._inputIndex,\n\t\t\toutputIndex: this._outputIndex,\n\t\t\toldNodeData: this._oldNodeData,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeConnectCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parentNode = scene.node(json.parentPath);\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parentNode');\n\t\t\treturn;\n\t\t}\n\t\tconst nodeDest = parentNode.node(json.nodeDestName);\n\t\tif (!nodeDest) {\n\t\t\tconsole.warn('no nodeDest');\n\t\t\treturn;\n\t\t}\n\t\tconst nodeSrc = json.nodeSrcName ? parentNode.node(json.nodeSrcName) : null;\n\t\tconst cmd = new NodeConnectCommand(parentNode, nodeSrc, nodeDest, json.inputIndex, json.outputIndex);\n\t\tcmd._setOldNodeData(json.oldNodeData);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {Vector2Like} from './../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {SafeNodeRemover} from './../../core/SafeNodeRemover';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {Vector2} from 'three';\n\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\n\ninterface NodeCreateConnectInputData {\n\tnode: BaseNodeType;\n\tindex: number;\n}\ninterface NodeCreateConnectInputDataJSON {\n\tnodePath: string;\n\tindex: number;\n}\nfunction _nodeCreateConnectInputDataToJSON(data: NodeCreateConnectInputData): NodeCreateConnectInputDataJSON {\n\treturn {\n\t\tnodePath: data.node.path(),\n\t\tindex: data.index,\n\t};\n}\nfunction _nodeCreateConnectInputDataFromJSON(\n\tscene: PolyScene,\n\tjson: NodeCreateConnectInputDataJSON\n): NodeCreateConnectInputData | undefined {\n\tconst node = scene.node(json.nodePath);\n\tif (!node) {\n\t\treturn;\n\t}\n\treturn {\n\t\tnode,\n\t\tindex: json.index,\n\t};\n}\nexport interface NodeCreateCommandConnectionData {\n\tnodeSrc: BaseNodeType;\n\tnodeDest: BaseNodeType;\n\tinputIndex: number;\n\toutputIndex: number;\n}\ninterface NodeCreateCommandConnectionDataJSON {\n\tnodeSrcPath: string;\n\tnodeDestPath: string;\n\tinputIndex: number;\n\toutputIndex: number;\n}\nfunction _connectionDataToJSON(data: NodeCreateCommandConnectionData): NodeCreateCommandConnectionDataJSON {\n\treturn {\n\t\tnodeSrcPath: data.nodeSrc.path(),\n\t\tnodeDestPath: data.nodeDest.path(),\n\t\tinputIndex: data.inputIndex,\n\t\toutputIndex: data.outputIndex,\n\t};\n}\nfunction _connectionDataFromJSON(\n\tscene: PolyScene,\n\tjson: NodeCreateCommandConnectionDataJSON\n): NodeCreateCommandConnectionData | undefined {\n\tconst nodeSrc = scene.node(json.nodeSrcPath);\n\tconst nodeDest = scene.node(json.nodeDestPath);\n\tif (!(nodeSrc && nodeDest)) {\n\t\treturn;\n\t}\n\treturn {\n\t\tnodeSrc,\n\t\tnodeDest,\n\t\tinputIndex: json.inputIndex,\n\t\toutputIndex: json.outputIndex,\n\t};\n}\n\nexport interface NodeCreateConnectOptions {\n\tnewNodeInput?: NodeCreateConnectInputData;\n\tnewNodeOutput?: NodeCreateConnectInputData;\n\tconnection?: NodeCreateCommandConnectionData;\n}\ninterface NodeCreateConnectOptionsJSON {\n\tnewNodeInput?: NodeCreateConnectInputDataJSON;\n\tnewNodeOutput?: NodeCreateConnectInputDataJSON;\n\tconnection?: NodeCreateCommandConnectionDataJSON;\n}\nfunction nodeCreateOptionsToJSON(options: NodeCreateConnectOptions): NodeCreateConnectOptionsJSON {\n\treturn {\n\t\tnewNodeInput: options.newNodeInput ? _nodeCreateConnectInputDataToJSON(options.newNodeInput) : undefined,\n\t\tnewNodeOutput: options.newNodeOutput ? _nodeCreateConnectInputDataToJSON(options.newNodeOutput) : undefined,\n\t\tconnection: options.connection ? _connectionDataToJSON(options.connection) : undefined,\n\t};\n}\nfunction nodeCreateOptionsFromJSON(scene: PolyScene, json: NodeCreateConnectOptionsJSON): NodeCreateConnectOptions {\n\treturn {\n\t\tnewNodeInput: json.newNodeInput ? _nodeCreateConnectInputDataFromJSON(scene, json.newNodeInput) : undefined,\n\t\tnewNodeOutput: json.newNodeOutput ? _nodeCreateConnectInputDataFromJSON(scene, json.newNodeOutput) : undefined,\n\t\tconnection: json.connection ? _connectionDataFromJSON(scene, json.connection) : undefined,\n\t};\n}\n\nexport interface NodeCreateCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeType: string;\n\tnodePos: Vector2Like;\n\toptions?: NodeCreateConnectOptionsJSON;\n\tnodeName?: string;\n}\n\nexport class NodeCreateCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_CREATE;\n\tprivate _parentPath: string;\n\tprivate _nodeName: string | undefined;\n\n\tconstructor(\n\t\t_parent: BaseNodeType,\n\t\tprivate _nodeType: string,\n\t\tprivate _nodePos: Vector2,\n\t\tprivate _options?: NodeCreateConnectOptions\n\t) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t}\n\toverride dataUpdateRequired() {\n\t\treturn true;\n\t}\n\tprivate _setNodeName(nodeName?: string) {\n\t\tthis._nodeName = nodeName;\n\t}\n\n\tasync _do() {\n\t\tconst parenNode = this._scene.node(this._parentPath);\n\t\tif (!parenNode) {\n\t\t\tconsole.warn('command not run as no parent found');\n\t\t\treturn;\n\t\t}\n\t\tconst node = parenNode.createNode(this._nodeType) as BaseNodeType;\n\t\tif (node) {\n\t\t\tnode.uiData.setPosition(this._nodePos);\n\t\t\tconst {EditorCoreHooksController} = await import('../../../../src/editor/core/hooks/HooksController');\n\t\t\tEditorCoreHooksController.onCreate.run_on_create_hooks(node);\n\n\t\t\tif (this._options) {\n\t\t\t\tconst newNodeInput = this._options.newNodeInput;\n\t\t\t\tconst newNodeOutput = this._options.newNodeOutput;\n\t\t\t\tconst connection = this._options.connection;\n\t\t\t\tif (newNodeInput) {\n\t\t\t\t\tif (newNodeInput.node.io.inputs.maxInputsCount() > newNodeInput.index) {\n\t\t\t\t\t\tnewNodeInput.node.setInput(newNodeInput.index, node);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newNodeOutput) {\n\t\t\t\t\t\tif (node.io.inputs.maxInputsCount() > 0) {\n\t\t\t\t\t\t\tnode.setInput(0, newNodeOutput.node, newNodeOutput.index);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (connection) {\n\t\t\t\t\t\t\tif (node.io.inputs.maxInputsCount() > 0) {\n\t\t\t\t\t\t\t\tnode.setInput(0, connection.nodeSrc, connection.outputIndex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (node.io.outputs.hasOutputs() || node.io.outputs.hasNamedOutputs()) {\n\t\t\t\t\t\t\t\tconnection.nodeDest.setInput(connection.inputIndex, node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._setNodeName(node.name());\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._nodeName) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parentNode.node(this._nodeName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tSafeNodeRemover.removeNodes(parentNode, [node]);\n\t}\n\n\toverride async toJSON(): Promise<NodeCreateCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeType: this._nodeType,\n\t\t\tnodePos: {x: this._nodePos.x, y: this._nodePos.y},\n\t\t\toptions: this._options ? nodeCreateOptionsToJSON(this._options) : undefined,\n\t\t\tnodeName: this._nodeName,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeCreateCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\tconsole.log('no parent');\n\t\t\treturn;\n\t\t}\n\n\t\tconst nodePos = new Vector2(json.nodePos.x, json.nodePos.y);\n\t\tconst cmd = new NodeCreateCommand(\n\t\t\tparent,\n\t\t\tjson.nodeType,\n\t\t\tnodePos,\n\t\t\tjson.options ? nodeCreateOptionsFromJSON(scene, json.options) : undefined\n\t\t);\n\t\tcmd._setNodeName(json.nodeName);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {SafeNodeRemover} from '../../core/SafeNodeRemover';\nimport {NodesStateController, NodesStateControllerJSON} from './utils/NodesStateController';\n\n// TODO:\n// when I delete a node plugged on the second input (of a copy SOP for instance)\n// the re-created connections are messed up\n\nexport interface NodeDeleteCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\tnodesState: NodesStateControllerJSON;\n}\n\nexport class NodeDeleteCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_DELETE;\n\t// private _undo_code_lines: string[] = [];\n\t// private _required_nodes_code_by_name: Dictionary<string> = {};\n\t// private _required_outputs_code_by_name: Map<string, Map<number, string>> = new Map();\n\t// private _old_selected_nodes: BaseNode[]\n\t// private _old_display_node_name: string | undefined;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[];\n\tprivate _nodesState: NodesStateController;\n\n\tconstructor(_parent: BaseNodeType, _nodes: BaseNodeType[]) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\tthis._nodesState = new NodesStateController(this, _parent.scene(), this._parentPath, this._nodeNames);\n\t\tthis._nodesState.save();\n\t}\n\tprivate _setNodeState(nodesState: NodesStateController) {\n\t\tthis._nodesState = nodesState;\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tthis._nodeNames.map((nodeName) => parentNode.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\tconst firstNode = nodes[0];\n\t\tif (!firstNode) {\n\t\t\treturn;\n\t\t}\n\t\tthis._scene.batchUpdates(() => {\n\t\t\tSafeNodeRemover.removeNodes(parentNode, nodes);\n\t\t});\n\n\t\t// this._change_display_flag();\n\t}\n\n\tasync _undo() {\n\t\tthis._nodesState.restore();\n\t}\n\n\toverride async toJSON(): Promise<NodeDeleteCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\tnodesState: this._nodesState.toJSON(),\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeDeleteCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\tconsole.log('no parent');\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tjson.nodeNames.map((nodeName) => parent.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\tconst cmd = new NodeDeleteCommand(parent, nodes);\n\t\tcmd._setNodeState(NodesStateController.fromJSON(scene, cmd, json.nodesState));\n\t\treturn cmd;\n\t}\n}\n","import {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {Vector2Like} from './../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {Vector2} from 'three';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\n\nexport type PosByNodeName = Record<string, Vector2Like>;\nconst tmpV2 = new Vector2();\n\nexport interface NodeMoveCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\tnewPositions: PosByNodeName;\n\toldPositions: PosByNodeName;\n\t// invertedOffset: Vector2Like;\n}\n\nexport function nodeMoveCommandPrepareMaps(nodes: BaseNodeType[], startPositions: Vector2[], offset: Vector2) {\n\tconst newPositions: PosByNodeName = {};\n\tconst oldPositions: PosByNodeName = {};\n\tfor (let i = 0; i < nodes.length; i++) {\n\t\tconst node = nodes[i];\n\t\tconst startPos = startPositions[i];\n\t\t// node.uiData.setPosition(startPos);\n\t\toldPositions[node.name()] = {x: startPos.x, y: startPos.y};\n\t\ttmpV2.copy(startPos).add(offset);\n\t\tnewPositions[node.name()] = {x: tmpV2.x, y: tmpV2.y};\n\t}\n\treturn {newPositions, oldPositions};\n}\n\nexport class NodeMoveCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_MOVE;\n\t// private _invertedOffset: Vector2 = new Vector2();\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[] = [];\n\tconstructor(\n\t\t_parent: BaseNodeType,\n\t\t_nodes: BaseNodeType[],\n\t\tprivate _newPositions: PosByNodeName,\n\t\tprivate _oldPositions: PosByNodeName\n\t) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\t// this._invertedOffset.copy(this._offset).multiplyScalar(-1);\n\t}\n\n\tprivate _nodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn [];\n\t\t}\n\t\tconst nodes:BaseNodeType[]=[]\n\t\tArrayUtils.compact(this._nodeNames.map((nodeName) => parentNode.node(nodeName)),nodes);\n\t\treturn nodes\n\t}\n\n\tasync _do() {\n\t\tconst nodes = this._nodes();\n\t\tfor (let node of nodes) {\n\t\t\tconst newPosition = this._newPositions[node.name()];\n\t\t\tif (newPosition) {\n\t\t\t\ttmpV2.set(newPosition.x, newPosition.y);\n\t\t\t\tnode.uiData.setPosition(tmpV2);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst nodes = this._nodes();\n\t\tfor (let node of nodes) {\n\t\t\tconst oldPosition = this._oldPositions[node.name()];\n\t\t\tif (oldPosition) {\n\t\t\t\ttmpV2.set(oldPosition.x, oldPosition.y);\n\t\t\t\tnode.uiData.setPosition(tmpV2);\n\t\t\t}\n\t\t}\n\t}\n\toverride async toJSON(): Promise<NodeMoveCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\t// invertedOffset: {x: this._invertedOffset.x, y: this._invertedOffset.y},\n\t\t\tnewPositions: this._newPositions,\n\t\t\toldPositions: this._oldPositions,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeMoveCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes:BaseNodeType[] =[] \n\t\tArrayUtils.compact(json.nodeNames.map((nodeName) => parent.node(nodeName)),nodes);\n\t\t// const offset = new Vector2(-json.invertedOffset.x, -json.invertedOffset.y);\n\t\treturn new NodeMoveCommand(parent, nodes, json.newPositions, json.oldPositions);\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BasePolyNodeSaveController} from '../../core/_BasePolyNodeSaveController';\nimport {NodesStateController, NodesStateControllerJSON} from './utils/NodesStateController';\n\nexport interface NodePolyNodeLockCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeName: string;\n\tnodesState: NodesStateControllerJSON;\n}\n\nexport class NodePolyNodeLockCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_POLY_NODE_LOCK;\n\tprivate _parentPath: string;\n\tprivate _nodeName: string;\n\tprivate _nodesState: NodesStateController;\n\tconstructor(_parent: BaseNodeType, _node: BaseNodeType) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeName = _node.name();\n\t\tthis._nodesState = new NodesStateController(this, _parent.scene(), this._parentPath, [this._nodeName]);\n\t\tthis._nodesState.save();\n\t}\n\tprepare() {\n\t\tthis._nodesState.save();\n\t}\n\n\tprivate _node() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn parentNode.node(this._nodeName);\n\t}\n\tprivate _setNodeState(nodesState: NodesStateController) {\n\t\tthis._nodesState = nodesState;\n\t}\n\n\tasync _do() {\n\t\tconst node = this._node();\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\t// node.polyNodeController?.setLockedState(true);\n\t\tconst newNode = BasePolyNodeSaveController.changeType(node, node.type());\n\t\tnewNode?.polyNodeController?.setLockedState(true);\n\t}\n\n\tasync _undo() {\n\t\tconst node = this._node();\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tparentNode.removeNode(node);\n\t\t// node.polyNodeController?.setLockedState(false);\n\t\tthis._nodesState.restore();\n\t}\n\toverride async toJSON(): Promise<NodePolyNodeLockCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeName: this._nodeName,\n\t\t\tnodesState: this._nodesState.toJSON(),\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodePolyNodeLockCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parent.node(json.nodeName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmd = new NodePolyNodeLockCommand(parent, node);\n\t\tcmd._setNodeState(NodesStateController.fromJSON(scene, cmd, json.nodesState));\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BasePolyNodeSaveController} from '../../core/_BasePolyNodeSaveController';\n\nexport interface NodePolyNodeUnlockCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeName: string;\n}\n\nexport class NodePolyNodeUnlockCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_POLY_NODE_UNLOCK;\n\tprivate _parentPath: string;\n\tprivate _nodeName: string;\n\tconstructor(_parent: BaseNodeType, _node: BaseNodeType) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeName = _node.name();\n\t}\n\n\tprivate _node() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn parentNode.node(this._nodeName);\n\t}\n\n\tasync _do() {\n\t\tconst node = this._node();\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tnode.polyNodeController?.setLockedState(false);\n\t}\n\n\tasync _undo() {\n\t\tconst node = this._node();\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\t// node.polyNodeController?.setLockedState(true);\n\t\tconst newNode = BasePolyNodeSaveController.changeType(node, node.type());\n\t\tnewNode?.polyNodeController?.setLockedState(true);\n\t}\n\toverride async toJSON(): Promise<NodePolyNodeUnlockCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeName: this._nodeName,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodePolyNodeUnlockCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parent.node(json.nodeName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\treturn new NodePolyNodeUnlockCommand(parent, node);\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {TypeAssert} from '../../../../@polygonjs/polygonjs/src/engine/poly/Assert';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {SelectionMethod} from '../../core/Selection';\n\nexport interface NodeSelectCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\tmethod: SelectionMethod;\n\toldNodesNames?: string[];\n}\n\nexport class NodeSelectCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_SELECT;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[];\n\tprivate _oldNodesNames: string[] | undefined;\n\n\tconstructor(_parent: BaseNodeType, _nodes: Readonly<BaseNodeType[]>, private _method: SelectionMethod) {\n\t\tsuper(_parent.scene());\n\t\tif (_parent.childrenAllowed() && _parent.childrenController) {\n\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\t_parent.childrenController.selection.nodes(nodes);\n\t\t\tthis._setOldNodesNames(nodes.map((n) => n.name()));\n\t\t}\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\tthis._parentPath = _parent.path();\n\t}\n\tprivate _setOldNodesNames(nodesNames?: string[]) {\n\t\tthis._oldNodesNames = nodesNames;\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tthis._nodeNames.map((nodeName) => parentNode.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\n\t\tif (parentNode.childrenAllowed() && parentNode.childrenController) {\n\t\t\tconst selection = parentNode.childrenController.selection;\n\t\t\tswitch (this._method) {\n\t\t\t\tcase SelectionMethod.OVERRIDE:\n\t\t\t\t\treturn selection.set(nodes);\n\t\t\t\tcase SelectionMethod.ADD:\n\t\t\t\t\treturn selection.add(nodes);\n\t\t\t\tcase SelectionMethod.REMOVE:\n\t\t\t\t\treturn selection.remove(nodes);\n\t\t\t}\n\t\t\tTypeAssert.unreachable(this._method);\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._oldNodesNames) {\n\t\t\tconst oldNodes: BaseNodeType[] = [];\n\t\t\tArrayUtils.compact(\n\t\t\t\tthis._oldNodesNames.map((nodeName) => parentNode.node(nodeName)),\n\t\t\t\toldNodes\n\t\t\t);\n\t\t\tif (parentNode.childrenAllowed() && parentNode.childrenController) {\n\t\t\t\tparentNode.childrenController.selection.set(oldNodes);\n\t\t\t}\n\t\t}\n\t}\n\toverride async toJSON(): Promise<NodeSelectCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\tmethod: this._method,\n\t\t\toldNodesNames: this._oldNodesNames,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeSelectCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tjson.nodeNames.map((nodeName) => parent.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\tconst cmd = new NodeSelectCommand(parent, nodes, json.method);\n\t\tcmd._setOldNodesNames(json.oldNodesNames);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nexport interface NodeSetCommentCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeName: string;\n\tnewComment: string;\n\toldComment?: string;\n}\n\nexport class NodeSetCommentCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_SET_COMMENT;\n\tprivate _oldComment: string | undefined;\n\tprivate _parentPath: string;\n\tprivate _nodeName: string;\n\n\tconstructor(_parent: BaseNodeType, _node: BaseNodeType, private _newComment: string) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeName = _node.name();\n\t\tthis._setOldComment(_node.uiData.comment());\n\t}\n\tprivate _setOldComment(oldComment?: string) {\n\t\tthis._oldComment = oldComment;\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parentNode.node(this._nodeName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tnode.uiData.setComment(this._newComment);\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parentNode.node(this._nodeName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tnode.uiData.setComment(this._oldComment);\n\t}\n\toverride async toJSON(): Promise<NodeSetCommentCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeName: this._nodeName,\n\t\t\tnewComment: this._newComment,\n\t\t\toldComment: this._oldComment,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeSetCommentCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parent.node(json.nodeName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmd = new NodeSetCommentCommand(parent, node, json.newComment);\n\t\tcmd._setOldComment(json.oldComment);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nexport interface NodeSetNameCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\toldName: string;\n\tnewName: string;\n}\n\nexport class NodeSetNameCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_SET_NAME;\n\tprivate _oldName: string;\n\tprivate _parentPath: string;\n\n\tconstructor(_parent: BaseNodeType, _node: BaseNodeType, private _newName: string) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._oldName = _node.name();\n\t}\n\toverride dataUpdateRequired() {\n\t\treturn true;\n\t}\n\tprivate _setOldName(oldName: string) {\n\t\tthis._oldName = oldName;\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parentNode.node(this._oldName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tnode.setName(this._newName);\n\t\tthis._newName = node.name();\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parentNode.node(this._newName);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tnode.setName(this._oldName);\n\t}\n\toverride async toJSON(): Promise<NodeSetNameCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\toldName: this._oldName,\n\t\t\tnewName: this._newName,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodeSetNameCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\tconsole.warn('no parent found with name', json.parentPath);\n\t\t\treturn;\n\t\t}\n\t\tconst nodeName = mode == BaseCommandFromJSONMode.DO ? json.oldName : json.newName;\n\t\tconst node = parent.node(nodeName);\n\t\tif (!node) {\n\t\t\tconsole.warn('no node found with name', nodeName);\n\t\t\treturn;\n\t\t}\n\t\tconst cmd = new NodeSetNameCommand(parent, node, json.newName);\n\t\tcmd._setOldName(json.oldName);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nexport interface NodeSetOverrideClonableStateCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\tnewState: boolean;\n\toldState: boolean;\n}\n\nexport class NodeSetOverrideClonableStateCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_SET_OVERRIDE_CLONABLE_STATE;\n\tprivate _oldState: boolean = false;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[];\n\n\tconstructor(_parent: BaseNodeType, _nodes: BaseNodeType[], private _newState: boolean) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\tconst node = _nodes[0];\n\t\tif (node) {\n\t\t\tthis._oldState = node.io.inputs.clonedStateOverriden();\n\t\t}\n\t}\n\tprivate _setOldState(oldState: boolean) {\n\t\tthis._oldState = oldState;\n\t}\n\n\tprivate _nodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn [];\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tthis._nodeNames.map((nodeName) => parentNode.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\treturn nodes;\n\t}\n\n\tasync _do() {\n\t\tconst nodes = this._nodes();\n\t\tfor (let node of nodes) {\n\t\t\tif (node.io && node.io.inputs) {\n\t\t\t\tnode.io.inputs.overrideClonedState(this._newState);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst nodes = this._nodes();\n\t\tfor (let node of nodes) {\n\t\t\tif (node.io && node.io.inputs) {\n\t\t\t\tnode.io.inputs.overrideClonedState(this._oldState);\n\t\t\t}\n\t\t}\n\t}\n\toverride async toJSON(): Promise<NodeSetOverrideClonableStateCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\tnewState: this._newState,\n\t\t\toldState: this._oldState,\n\t\t};\n\t}\n\tstatic override fromJSON(\n\t\tscene: PolyScene,\n\t\tjson: NodeSetOverrideClonableStateCommandJSON,\n\t\tmode: BaseCommandFromJSONMode\n\t) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tjson.nodeNames.map((nodeName) => parent.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\tconst cmd = new NodeSetOverrideClonableStateCommand(parent, nodes, json.newState);\n\t\tcmd._setOldState(json.oldState);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {\n\tNetworkClipBoardHelper,\n\tNetworkClipBoardHelperJSON,\n\tNetworkClipBoardHelperOptions,\n} from './../../core/clipboard/NetworkClipboardHelper';\nimport {SafeNodeRemover} from './../../core/SafeNodeRemover';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType, TypedNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {Vector2} from 'three';\nimport {Box2} from 'three';\nimport {\n\tNetworkChildNodeType,\n\tNetworkNodeType,\n\tNodeContext,\n} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {CoreGraphNodeId} from '../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {TypedNodeConnection} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\nimport {MapUtils} from '../../../../@polygonjs/polygonjs/src/core/MapUtils';\nimport {TypeAssert} from '../../../../@polygonjs/polygonjs/src/engine/poly/Assert';\nimport {BaseGlNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/gl/_Base';\nimport {\n\tGlConnectionPointType,\n\tBaseGlConnectionPoint,\n} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Gl';\nimport {JsConnectionPointType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js';\nimport {EventConnectionPointType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Event';\n// subnet\n// import {SubnetActorNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/actor/Subnet';\nimport {SubnetAnimNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/anim/Subnet';\nimport {SubnetGlNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/gl/Subnet';\nimport {SubnetJsNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/Subnet';\nimport {SubnetSopNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Subnet';\n// subnetInput\n// import {SubnetInputActorNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/actor/SubnetInput';\nimport {SubnetInputAnimNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/anim/SubnetInput';\nimport {SubnetInputGlNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SubnetInput';\nimport {SubnetInputJsNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/SubnetInput';\nimport {SubnetInputSopNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/sop/SubnetInput';\n// subnetOutput\n// import {SubnetOutputActorNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/actor/SubnetOutput';\nimport {SubnetOutputAnimNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/anim/SubnetOutput';\nimport {SubnetOutputGlNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SubnetOutput';\nimport {SubnetOutputJsNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/SubnetOutput';\nimport {SubnetOutputSopNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/sop/SubnetOutput';\n\ninterface NameSerializedConnection {\n\tinputIndex: number;\n\toutputIndex: number;\n\tnodeDestName: string;\n\tnodeSrcName: string;\n}\nfunction serializeConnection<NC extends NodeContext>(connection: TypedNodeConnection<NC>) {\n\treturn {\n\t\tinputIndex: connection.inputIndex(),\n\t\toutputIndex: connection.outputIndex(),\n\t\tnodeDestName: connection.nodeDest().name(),\n\t\tnodeSrcName: connection.nodeSrc().name(),\n\t};\n}\n\ntype SubnetNode = SubnetAnimNode | SubnetGlNode | SubnetJsNode | SubnetSopNode;\ntype SubnetInputNode = SubnetInputAnimNode | SubnetInputGlNode | SubnetInputJsNode | SubnetInputSopNode;\ntype SubnetOutputNode = SubnetOutputAnimNode | SubnetOutputGlNode | SubnetOutputJsNode | SubnetOutputSopNode;\n\nconst DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS = 200;\n\ninterface SerializedData {\n\tsubnetName?: string;\n\tclipboardHelper: NetworkClipBoardHelperJSON;\n\texternalInputConnections: Record<string, Record<number, TypedNodeConnection<any>[]>>;\n\texternalOutputConnections: Record<string, Record<number, NameSerializedConnection[]>>;\n}\nexport interface NodesSubnetCollapseCommandJSON extends BaseCommandJSON, SerializedData {\n\tparentPath: string;\n\tnodeNames: string[];\n}\nconst CLIPBOARD_HELPER_OPTIONS: NetworkClipBoardHelperOptions = {\n\tprintToConsole: false,\n\tstoreCode: false,\n};\n\nfunction mapToRecord<T>(map: Map<string, Map<number, T[]>>): Record<string, Record<number, T[]>> {\n\tconst record: Record<string, Record<number, T[]>> = {};\n\tmap.forEach((subMap, str) => {\n\t\trecord[str] = {};\n\t\tsubMap.forEach((list, num) => {\n\t\t\trecord[str][num] = list;\n\t\t});\n\t});\n\treturn record;\n}\nfunction recordToMap<T>(record: Record<string, Record<number, T[]>>): Map<string, Map<number, T[]>> {\n\tconst map: Map<string, Map<number, T[]>> = new Map();\n\n\tconst keysStr = Object.keys(record);\n\tfor (let keyStr of keysStr) {\n\t\tconst subMap = new Map();\n\t\tmap.set(keyStr, subMap);\n\t\tconst subRecord = record[keyStr];\n\t\tconst subKeysNum = Object.keys(subRecord);\n\t\tfor (let subKeyNum of subKeysNum) {\n\t\t\tsubMap.set(subKeyNum, subRecord[subKeyNum as any]);\n\t\t}\n\t}\n\n\treturn map;\n}\n\nexport class NodesSubnetCollapseCommand<NC extends NodeContext> extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_SUBNET_COLLAPSE;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[];\n\tprivate _subnetName: string | undefined;\n\tprivate _externalInputConnections: Map<string, Map<number, TypedNodeConnection<NC>[]>> = new Map();\n\tprivate _externalOutputConnections: Map<string, Map<number, NameSerializedConnection[]>> = new Map();\n\tconstructor(private _parent: BaseNodeType, _nodes: TypedNode<NC, any>[]) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t}\n\toverride dataUpdateRequired() {\n\t\treturn true;\n\t}\n\tprivate _clipboardHelper = new NetworkClipBoardHelper(CLIPBOARD_HELPER_OPTIONS);\n\tprivate _setSerializedData(data: SerializedData) {\n\t\tthis._clipboardHelper = NetworkClipBoardHelper.fromJSON(data.clipboardHelper, CLIPBOARD_HELPER_OPTIONS);\n\t\tthis._subnetName = data.subnetName;\n\t\tthis._externalInputConnections = recordToMap(data.externalInputConnections);\n\t\tthis._externalOutputConnections = recordToMap(data.externalOutputConnections);\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes:BaseNodeType[] = []\n\t\tArrayUtils.compact(this._nodeNames.map((nodeName) => parentNode.node(nodeName)),nodes);\n\t\tif (!nodes.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait parentNode.scene().batchUpdates(async () => {\n\t\t\tawait this._clipboardHelper.copyFromNode(parentNode, nodes);\n\t\t\tconst subnet = parentNode.createNode(NetworkNodeType.SUBNET) as SubnetNode;\n\t\t\tif (!subnet) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._placeSubnet(subnet, nodes);\n\t\t\tthis._subnetName = subnet.name();\n\t\t\tthis._findExternalNodeInputs(parentNode, nodes);\n\t\t\tthis._findExternalNodeOutputs(parentNode, nodes);\n\t\t\tthis._prepareSubnet(parentNode, subnet);\n\t\t\tthis._connectSubnetInputs(parentNode, subnet);\n\t\t\tawait this._clipboardHelper.pasteInNode(subnet);\n\t\t\tthis._connectSubnetInputInputs(parentNode, subnet);\n\t\t\tthis._connectSubnetOutputs(parentNode, subnet);\n\t\t\tthis._placeSubnetInputsAndOutputs(subnet);\n\t\t\tSafeNodeRemover.removeNodes(parentNode, nodes);\n\t\t});\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parentNode');\n\t\t\treturn;\n\t\t}\n\t\tif (!this._subnetName) {\n\t\t\tconsole.warn('no subnetName');\n\t\t\treturn;\n\t\t}\n\t\tconst subnet = parentNode.node(this._subnetName);\n\t\tif (!subnet) {\n\t\t\treturn;\n\t\t}\n\t\tawait parentNode.scene().batchUpdates(async () => {\n\t\t\tSafeNodeRemover.removeNodes(parentNode, [subnet]);\n\t\t\tawait this._clipboardHelper.pasteInNode(parentNode);\n\t\t\tthis._restoreOutputConnections(parentNode);\n\t\t});\n\t}\n\n\tprivate _placeSubnet(subnet: SubnetNode, nodes: TypedNode<NC, any>[]) {\n\t\tconst pos = new Vector2();\n\t\tfor (let node of nodes) {\n\t\t\tpos.add(node.uiData.position());\n\t\t}\n\t\tpos.x /= nodes.length;\n\t\tpos.y /= nodes.length;\n\t\tpos.x = 100 * Math.round(pos.x / 100);\n\t\tpos.y = 100 * Math.round(pos.y / 100);\n\t\tsubnet.uiData.setPosition(pos);\n\t}\n\n\tprivate _findExternalNodeInputs(parentNode: BaseNodeType, nodes: TypedNode<NC, any>[]) {\n\t\tconst currentNodeids = new Set<CoreGraphNodeId>(nodes.map((n) => n.graphNodeId()));\n\n\t\tthis._externalInputConnections.clear();\n\n\t\tfor (let node of nodes) {\n\t\t\tconst connections = node.io.connections.inputConnections();\n\t\t\tif (connections) {\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tconst nodeSrc = connection.nodeSrc();\n\t\t\t\t\t\tif (!currentNodeids.has(nodeSrc.graphNodeId())) {\n\t\t\t\t\t\t\tconst nodeName = nodeSrc.name();\n\t\t\t\t\t\t\tlet indexMap = this._externalInputConnections.get(nodeName);\n\t\t\t\t\t\t\tif (!indexMap) {\n\t\t\t\t\t\t\t\tindexMap = new Map();\n\t\t\t\t\t\t\t\tthis._externalInputConnections.set(nodeName, indexMap);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tMapUtils.pushOnArrayAtEntry(indexMap, connection.outputIndex(), connection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _findExternalNodeOutputs(parentNode: BaseNodeType, nodes: TypedNode<NC, any>[]) {\n\t\tconst currentNodeids = new Set<CoreGraphNodeId>(nodes.map((n) => n.graphNodeId()));\n\n\t\tthis._externalOutputConnections.clear();\n\n\t\tfor (let node of nodes) {\n\t\t\tconst connections: TypedNodeConnection<NC>[] = [];\n\t\t\tnode.io.connections.outputConnections(connections);\n\t\t\tif (connections) {\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tconst nodeDest = connection.nodeDest();\n\t\t\t\t\t\tif (!currentNodeids.has(nodeDest.graphNodeId())) {\n\t\t\t\t\t\t\tconst nodeName = nodeDest.name();\n\t\t\t\t\t\t\tlet indexMap = this._externalOutputConnections.get(nodeName);\n\t\t\t\t\t\t\tif (!indexMap) {\n\t\t\t\t\t\t\t\tindexMap = new Map();\n\t\t\t\t\t\t\t\tthis._externalOutputConnections.set(nodeName, indexMap);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tMapUtils.pushOnArrayAtEntry(\n\t\t\t\t\t\t\t\tindexMap,\n\t\t\t\t\t\t\t\tconnection.inputIndex(),\n\t\t\t\t\t\t\t\tserializeConnection(connection)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _prepareSubnet(parentNode: BaseNodeType, subnet: SubnetNode) {\n\t\tif (!(subnet instanceof SubnetGlNode)) {\n\t\t\treturn;\n\t\t}\n\t\t// let inputsCount = 0;\n\t\tconst inputTypes: Array<EventConnectionPointType | JsConnectionPointType | GlConnectionPointType> = [];\n\t\tthis._externalInputConnections.forEach((indexMap, nodeName) => {\n\t\t\tindexMap.forEach((connections, outputIndex) => {\n\t\t\t\t// inputsCount++;\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tconst connectionPoints = connection.nodeSrc().io.outputs.namedOutputConnectionPoints() as\n\t\t\t\t\t\t| BaseGlConnectionPoint[]\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (connectionPoints) {\n\t\t\t\t\t\tconst connectionPoint = connectionPoints[connection.outputIndex()];\n\t\t\t\t\t\tif (connectionPoint) {\n\t\t\t\t\t\t\tinputTypes.push(connectionPoint.type());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tthis._externalOutputConnections.forEach((indexMap, nodeName) => {\n\t\t\tindexMap.forEach((connections, inputIndex) => {\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tconst destName = connection.nodeDestName;\n\t\t\t\t\tconst destNode = parentNode.node(destName);\n\t\t\t\t\tif (destNode) {\n\t\t\t\t\t\tconst connectionPoints =\n\t\t\t\t\t\t\tdestNode.io.inputs.namedInputConnectionPoints() as BaseGlConnectionPoint[];\n\t\t\t\t\t\tconst connectionPoint = connectionPoints[connection.inputIndex];\n\t\t\t\t\t\tif (connectionPoint) {\n\t\t\t\t\t\t\tconst outputType = connectionPoint.type();\n\t\t\t\t\t\t\tif (!inputTypes.includes(outputType)) {\n\t\t\t\t\t\t\t\tinputTypes.push(outputType);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tsubnet.p.inputsCount.set(inputTypes.length);\n\t\tlet i = 0;\n\t\tfor (let inputType of inputTypes) {\n\t\t\tsubnet.setInputType(i, inputType as GlConnectionPointType);\n\t\t\ti++;\n\t\t}\n\t\ti = 0;\n\t\tthis._externalInputConnections.forEach((indexMap, nodeName) => {\n\t\t\tindexMap.forEach((connections, outputIndex) => {\n\t\t\t\tconnections.forEach((connection) => {\n\t\t\t\t\tconst inputNode = connection.nodeSrc() as BaseGlNodeType;\n\t\t\t\t\tconst connectionPoints = inputNode.io.outputs.namedOutputConnectionPoints();\n\t\t\t\t\tif (connectionPoints) {\n\t\t\t\t\t\tconst connectionPoint = connectionPoints[connection.outputIndex()];\n\t\t\t\t\t\tif (connectionPoint) {\n\t\t\t\t\t\t\tsubnet.setInputType(i, connectionPoint.type());\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// subnet.setInputType(i, connection.name());\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ti++;\n\t\t\t});\n\t\t});\n\t}\n\tprivate _connectSubnetInputs(parentNode: BaseNodeType, subnet: SubnetNode) {\n\t\tlet i = 0;\n\t\tthis._externalInputConnections.forEach((indexMap, nodeName) => {\n\t\t\tindexMap.forEach((connections, outputIndex) => {\n\t\t\t\tconst node = parentNode.node(nodeName);\n\t\t\t\tif (node) {\n\t\t\t\t\tthis._findOrCreateSubnetInput(subnet, i);\n\t\t\t\t\tsubnet.setInput(i, node as any, outputIndex);\n\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('node not found', nodeName);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\tprivate _connectSubnetInputInputs(parentNode: BaseNodeType, subnet: SubnetNode) {\n\t\tlet i = 0;\n\t\tthis._externalInputConnections.forEach((indexMap, nodeName) => {\n\t\t\tindexMap.forEach((connections, outputIndex) => {\n\t\t\t\tconst node = parentNode.node(nodeName);\n\t\t\t\tif (node) {\n\t\t\t\t\tconst subnetInput = this._findOrCreateSubnetInput(subnet, i);\n\n\t\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\t\tconst oldNodeDest = connection.nodeDest();\n\t\t\t\t\t\tconst nodeDestName = oldNodeDest.name();\n\t\t\t\t\t\tconst nodeDest = subnet.node(nodeDestName);\n\t\t\t\t\t\tif (nodeDest) {\n\t\t\t\t\t\t\tif (subnetInput.io.outputs.hasNamedOutputs()) {\n\t\t\t\t\t\t\t\tnodeDest.setInput(connection.inputIndex(), subnetInput, i);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnodeDest.setInput(connection.inputIndex(), subnetInput);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('node dest not found', nodeDestName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('node not found', nodeName);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _connectSubnetOutputs(parentNode: BaseNodeType, subnet: SubnetNode) {\n\t\tconst subnetOutput = this._createSubnetOutput(subnet);\n\n\t\tif (this._externalOutputConnections.size == 0) {\n\t\t\t// if we have no output connections, it's probably because the last node was the displayed one\n\t\t\tconst displayNode = subnet.displayNodeController?.displayNode() as BaseNodeType;\n\t\t\tif (displayNode) {\n\t\t\t\t(subnetOutput as BaseNodeType).setInput(0, displayNode);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._externalOutputConnections.forEach((indexMap, nodeName) => {\n\t\t\t\tindexMap.forEach((connections, inputIndex) => {\n\t\t\t\t\tconst node = parentNode.node(nodeName);\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\t\t\tnode.setInput(inputIndex, subnet as any, connection.outputIndex);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\t\t\tconst nodeSrcName = connection.nodeSrcName;\n\t\t\t\t\t\t\tconst nodeSrc = subnet.node(nodeSrcName);\n\t\t\t\t\t\t\tif (nodeSrc) {\n\t\t\t\t\t\t\t\tsubnetOutput.setInput(0, nodeSrc as any);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\tprivate _restoreOutputConnections(parentNode: BaseNodeType) {\n\t\tthis._externalOutputConnections.forEach((indexMap, nodeName) => {\n\t\t\tindexMap.forEach((connections, inputIndex) => {\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tconst nodeSrc = parentNode.node(connection.nodeSrcName);\n\t\t\t\t\tconst nodeDest = parentNode.node(connection.nodeDestName);\n\t\t\t\t\tif (nodeDest) {\n\t\t\t\t\t\tnodeDest.setInput(connection.inputIndex, nodeSrc, connection.outputIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/*\n\t *\n\t * CREATION UTILS\n\t *\n\t */\n\tprivate _findOrCreateSubnetInput(subnet: SubnetNode, index: number) {\n\t\t// if (subnet instanceof SubnetActorNode) {\n\t\t// \treturn subnet.nodesByType(NetworkChildNodeType.INPUT)[0] || subnet.createNode(NetworkChildNodeType.INPUT);\n\t\t// }\n\t\tif (subnet instanceof SubnetAnimNode) {\n\t\t\tconst node =\n\t\t\t\tsubnet.nodesByType(NetworkChildNodeType.INPUT).filter((s) => s.pv.input == index)[0] ||\n\t\t\t\tsubnet.createNode(NetworkChildNodeType.INPUT);\n\t\t\tnode.p.input.set(index);\n\t\t\treturn node;\n\t\t}\n\t\tif (subnet instanceof SubnetGlNode) {\n\t\t\treturn subnet.nodesByType(NetworkChildNodeType.INPUT)[0] || subnet.createNode(NetworkChildNodeType.INPUT);\n\t\t}\n\t\tif (subnet instanceof SubnetJsNode) {\n\t\t\treturn subnet.nodesByType(NetworkChildNodeType.INPUT)[0] || subnet.createNode(NetworkChildNodeType.INPUT);\n\t\t}\n\t\tif (subnet instanceof SubnetSopNode) {\n\t\t\tconst node =\n\t\t\t\tsubnet.nodesByType(NetworkChildNodeType.INPUT).filter((s) => s.pv.input == index)[0] ||\n\t\t\t\tsubnet.createNode(NetworkChildNodeType.INPUT);\n\t\t\tnode.p.input.set(index);\n\t\t\treturn node;\n\t\t}\n\t\tTypeAssert.unreachable(subnet);\n\t}\n\tprivate _findSubnetInputs(subnet: SubnetNode) {\n\t\tconst context = subnet.context();\n\t\t// if (context == NodeContext.ACTOR || subnet instanceof SubnetActorNode) {\n\t\t// \treturn (subnet as SubnetActorNode).nodesByType(NetworkChildNodeType.INPUT);\n\t\t// }\n\t\tif (context == NodeContext.ANIM || subnet instanceof SubnetAnimNode) {\n\t\t\treturn (subnet as SubnetAnimNode).nodesByType(NetworkChildNodeType.INPUT);\n\t\t}\n\t\tif (context == NodeContext.GL || subnet instanceof SubnetGlNode) {\n\t\t\treturn (subnet as SubnetGlNode).nodesByType(NetworkChildNodeType.INPUT);\n\t\t}\n\t\tif (context == NodeContext.JS || subnet instanceof SubnetJsNode) {\n\t\t\treturn (subnet as SubnetJsNode).nodesByType(NetworkChildNodeType.INPUT);\n\t\t}\n\t\tif (context == NodeContext.SOP || subnet instanceof SubnetSopNode) {\n\t\t\treturn (subnet as SubnetSopNode).nodesByType(NetworkChildNodeType.INPUT);\n\t\t}\n\t\tTypeAssert.unreachable(subnet);\n\t}\n\n\tprivate _createSubnetOutput(subnet: SubnetNode) {\n\t\tconst context = subnet.context();\n\t\t// if (context == NodeContext.ACTOR || subnet instanceof SubnetActorNode) {\n\t\t// \treturn (subnet as SubnetActorNode).createNode(NetworkChildNodeType.OUTPUT);\n\t\t// }\n\t\tif (context == NodeContext.ANIM || subnet instanceof SubnetAnimNode) {\n\t\t\treturn (subnet as SubnetAnimNode).createNode(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tif (context == NodeContext.GL || subnet instanceof SubnetGlNode) {\n\t\t\treturn (subnet as SubnetGlNode).createNode(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tif (context == NodeContext.JS || subnet instanceof SubnetJsNode) {\n\t\t\treturn (subnet as SubnetJsNode).createNode(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tif (context == NodeContext.SOP || subnet instanceof SubnetSopNode) {\n\t\t\treturn (subnet as SubnetSopNode).createNode(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tTypeAssert.unreachable(subnet);\n\t}\n\tprivate _findSubnetOutputs(subnet: SubnetNode) {\n\t\tconst context = subnet.context();\n\t\t// if (context == NodeContext.ACTOR || subnet instanceof SubnetActorNode) {\n\t\t// \treturn (subnet as SubnetActorNode).nodesByType(NetworkChildNodeType.OUTPUT);\n\t\t// }\n\t\tif (context == NodeContext.ANIM || subnet instanceof SubnetAnimNode) {\n\t\t\treturn (subnet as SubnetAnimNode).nodesByType(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tif (context == NodeContext.GL || subnet instanceof SubnetGlNode) {\n\t\t\treturn (subnet as SubnetGlNode).nodesByType(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tif (context == NodeContext.JS || subnet instanceof SubnetJsNode) {\n\t\t\treturn (subnet as SubnetJsNode).nodesByType(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tif (context == NodeContext.SOP || subnet instanceof SubnetSopNode) {\n\t\t\treturn (subnet as SubnetSopNode).nodesByType(NetworkChildNodeType.OUTPUT);\n\t\t}\n\t\tTypeAssert.unreachable(subnet);\n\t}\n\n\t/*\n\t *\n\t * NODE POSITIONS\n\t *\n\t */\n\tprivate _placeSubnetInputsAndOutputs(subnet: SubnetNode) {\n\t\tthis._placeSubnetInputs(subnet);\n\t\tthis._placeSubnetOutputs(subnet);\n\t}\n\tprivate _placeSubnetInputs(subnet: SubnetNode) {\n\t\tconst subnetInputs = this._findSubnetInputs(subnet);\n\t\tconst firstSubnetInput = subnetInputs[0];\n\t\tif (!firstSubnetInput) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst connectedNodes: Set<BaseNodeType> = new Set();\n\n\t\tsubnetInputs.forEach((subnetInput: SubnetInputNode, i: number) => {\n\t\t\tconst connections: TypedNodeConnection<NodeContext.SOP>[] = [];\n\t\t\tsubnetInput.io.connections.outputConnections(connections as never);\n\t\t\tconnections.forEach((connection: TypedNodeConnection<any>) => {\n\t\t\t\tif (connection) {\n\t\t\t\t\tconnectedNodes.add(connection.nodeDest());\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tconst offset = new Vector2();\n\t\tif (firstSubnetInput.uiData.isLayoutVertical()) {\n\t\t\toffset.x = DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t} else {\n\t\t\toffset.y = DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t}\n\n\t\tconst connectedNodesBox = new Box2();\n\t\tconst nodePositions: Vector2[] = [];\n\t\tconnectedNodes.forEach((node) => {\n\t\t\tnodePositions.push(node.uiData.position());\n\t\t});\n\t\tif (nodePositions.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconnectedNodesBox.setFromPoints(nodePositions);\n\t\tconst posStart = new Vector2();\n\t\tif (firstSubnetInput.uiData.isLayoutVertical()) {\n\t\t\tposStart.x = 0.5 * (connectedNodesBox.min.x + connectedNodesBox.max.x);\n\t\t\tposStart.y = connectedNodesBox.min.y - DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t} else {\n\t\t\tposStart.x = connectedNodesBox.min.x - DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t\tposStart.y = 0.5 * (connectedNodesBox.min.y + connectedNodesBox.max.y);\n\t\t}\n\n\t\tconst pos = new Vector2();\n\t\tpos.copy(posStart);\n\t\tfor (let subnetInput of subnetInputs) {\n\t\t\tpos.x = 100 * Math.floor(pos.x / 100);\n\t\t\tpos.y = 100 * Math.floor(pos.y / 100);\n\n\t\t\tsubnetInput.uiData.setPosition(pos);\n\n\t\t\tpos.add(offset);\n\t\t}\n\t}\n\tprivate _placeSubnetOutputs(subnet: SubnetNode) {\n\t\tconst subnetOutputs = this._findSubnetOutputs(subnet);\n\t\tconst firstSubnetOutput = subnetOutputs[0];\n\t\tif (!firstSubnetOutput) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst connectedNodes: Set<BaseNodeType> = new Set();\n\n\t\tsubnetOutputs.forEach((subnetOutput: SubnetOutputNode, i: number) => {\n\t\t\tsubnetOutput.io.connections\n\t\t\t\t.inputConnections()\n\t\t\t\t?.forEach((connection: TypedNodeConnection<any> | undefined) => {\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tconnectedNodes.add(connection.nodeSrc());\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\n\t\tconst offset = new Vector2();\n\t\tif (firstSubnetOutput.uiData.isLayoutVertical()) {\n\t\t\toffset.x = DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t} else {\n\t\t\toffset.y = DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t}\n\n\t\tconst connectedNodesBox = new Box2();\n\t\tconst nodePositions: Vector2[] = [];\n\t\tconnectedNodes.forEach((node) => {\n\t\t\tnodePositions.push(node.uiData.position());\n\t\t});\n\t\tif (nodePositions.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconnectedNodesBox.setFromPoints(nodePositions);\n\t\tconst subnetOutputsCenter = new Vector2();\n\t\tif (firstSubnetOutput.uiData.isLayoutVertical()) {\n\t\t\tsubnetOutputsCenter.x = 0.5 * (connectedNodesBox.min.x + connectedNodesBox.max.x);\n\t\t\tsubnetOutputsCenter.y = connectedNodesBox.max.y + DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t} else {\n\t\t\tsubnetOutputsCenter.x = connectedNodesBox.max.x + DISTANCE_BETWEEN_SUBNET_INPUTS_OR_OUTPUTS;\n\t\t\tsubnetOutputsCenter.y = 0.5 * (connectedNodesBox.min.y + connectedNodesBox.max.y);\n\t\t}\n\n\t\tconst pos = new Vector2();\n\t\tpos.copy(subnetOutputsCenter);\n\t\tfor (let subnetInput of subnetOutputs) {\n\t\t\tpos.x = 100 * Math.floor(pos.x / 100);\n\t\t\tpos.y = 100 * Math.floor(pos.y / 100);\n\n\t\t\tsubnetInput.uiData.setPosition(pos);\n\n\t\t\tpos.add(offset);\n\t\t}\n\t}\n\n\toverride async toJSON(): Promise<NodesSubnetCollapseCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\tsubnetName: this._subnetName,\n\t\t\tclipboardHelper: await this._clipboardHelper.toJSON(this._parent),\n\t\t\texternalInputConnections: mapToRecord(this._externalInputConnections),\n\t\t\texternalOutputConnections: mapToRecord(this._externalOutputConnections),\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodesSubnetCollapseCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes:BaseNodeType[] = []\n\t\tArrayUtils.compact(json.nodeNames.map((nodeName) => parent.node(nodeName)),nodes);\n\t\tconst cmd = new NodesSubnetCollapseCommand(parent, nodes);\n\t\tcmd._setSerializedData(json);\n\t\treturn cmd;\n\t}\n}\n","import {CoreType} from './../../../../@polygonjs/polygonjs/src/core/Type';\nimport {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {\n\tNetworkClipBoardHelper,\n\tNetworkClipBoardHelperJSON,\n\tNetworkClipBoardHelperOptions,\n} from './../../core/clipboard/NetworkClipboardHelper';\nimport {SafeNodeRemover} from './../../core/SafeNodeRemover';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType, TypedNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {Vector2} from 'three';\nimport {NetworkChildNodeType, NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {SubnetSopNode} from '../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Subnet';\nimport {TypedNodeConnection} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\nimport {MapUtils} from '../../../../@polygonjs/polygonjs/src/core/MapUtils';\n\ninterface NameSerializedConnection {\n\tinputIndex: number;\n\toutputIndex: number;\n\tnodeDestName: string;\n\tnodeSrcName: string;\n}\nfunction serializeConnection<NC extends NodeContext>(connection: TypedNodeConnection<NC>) {\n\treturn {\n\t\tinputIndex: connection.inputIndex(),\n\t\toutputIndex: connection.outputIndex(),\n\t\tnodeDestName: connection.nodeDest().name(),\n\t\tnodeSrcName: connection.nodeSrc().name(),\n\t};\n}\n\ninterface SerializedData {\n\tclipboardHelper: {do: NetworkClipBoardHelperJSON; undo: NetworkClipBoardHelperJSON};\n\tnewNodeNewNamesByOriginalName: Record<string, string>;\n\tnewNodeNames: string[];\n\tsubnetInput_OutputConnectionsBySubnetInput: Record<number, NameSerializedConnection[]>;\n\tsubnet_InputConnectionsBySubnetInput: Record<number, NameSerializedConnection>;\n\tsubnetOutput_InputConnectionsBySubnetInput: Record<number, NameSerializedConnection>;\n\tsubnet_OutputConnectionsBySubnetOutput: Record<number, NameSerializedConnection[]>;\n}\n\nexport interface NodesSubnetExtractCommandJSON extends BaseCommandJSON, SerializedData {\n\tparentPath: string;\n\tsubnetName: string;\n}\n\nconst CLIPBOARD_HELPER_OPTIONS: NetworkClipBoardHelperOptions = {\n\tprintToConsole: false,\n\tstoreCode: false,\n};\nfunction stringMapToRecord<T>(map: Map<string, T>): Record<string, T> {\n\tconst record: Record<string, T> = {};\n\tmap.forEach((v, k) => {\n\t\trecord[k] = v;\n\t});\n\treturn record;\n}\nfunction numberMapToRecord<T extends object>(map: Map<number, T>): Record<number, T> {\n\tconst record: Record<number, T> = {};\n\tmap.forEach((v, k) => {\n\t\trecord[k] = v;\n\t});\n\treturn record;\n}\nfunction stringRecordToMap<T>(record: Record<string, T>): Map<string, T> {\n\tconst map: Map<string, T> = new Map();\n\tconst keys = Object.keys(record);\n\tfor (let key of keys) {\n\t\tmap.set(key, record[key]);\n\t}\n\treturn map;\n}\nfunction numberRecordToMap<T>(record: Record<number, T>): Map<number, T> {\n\tconst map: Map<number, T> = new Map();\n\tconst keys = Object.keys(record);\n\tfor (let key of keys) {\n\t\tmap.set(key as any, record[key as any]);\n\t}\n\treturn map;\n}\n\nexport class NodesSubnetExtractCommand<NC extends NodeContext> extends BaseCommand {\n\tstatic override type: CommandType = CommandType.NODE_SUBNET_EXTRACT;\n\tprivate _parentPath: string;\n\tprivate _subnetName: string;\n\tprivate _doClipboardHelper = new NetworkClipBoardHelper(CLIPBOARD_HELPER_OPTIONS);\n\tprivate _undoClipboardHelper = new NetworkClipBoardHelper(CLIPBOARD_HELPER_OPTIONS);\n\tprivate _newNodeNewNamesByOriginalName: Map<string, string> = new Map();\n\tprivate _newNodeNames: string[] = [];\n\tprivate _subnetInput_OutputConnectionsBySubnetInput: Map<number, NameSerializedConnection[]> = new Map();\n\tprivate _subnet_InputConnectionsBySubnetInput: Map<number, NameSerializedConnection> = new Map();\n\tprivate _subnetOutput_InputConnectionsBySubnetInput: Map<number, NameSerializedConnection> = new Map();\n\tprivate _subnet_OutputConnectionsBySubnetOutput: Map<number, NameSerializedConnection[]> = new Map();\n\n\tconstructor(private _parentNode: BaseNodeType, _nodeOrSubnetName: TypedNode<NC, any> | string) {\n\t\tsuper(_parentNode.scene());\n\t\tthis._parentPath = _parentNode.path();\n\t\tif (CoreType.isString(_nodeOrSubnetName)) {\n\t\t\tthis._subnetName = _nodeOrSubnetName;\n\t\t} else {\n\t\t\tthis._subnetName = _nodeOrSubnetName.name();\n\t\t}\n\t}\n\toverride dataUpdateRequired() {\n\t\treturn true;\n\t}\n\tprivate _setSerializedData(data: SerializedData) {\n\t\tthis._doClipboardHelper = NetworkClipBoardHelper.fromJSON(data.clipboardHelper.do, CLIPBOARD_HELPER_OPTIONS);\n\t\tthis._undoClipboardHelper = NetworkClipBoardHelper.fromJSON(\n\t\t\tdata.clipboardHelper.undo,\n\t\t\tCLIPBOARD_HELPER_OPTIONS\n\t\t);\n\t\tthis._newNodeNewNamesByOriginalName = stringRecordToMap(data.newNodeNewNamesByOriginalName);\n\t\tthis._newNodeNames = data.newNodeNames;\n\t\tthis._subnetInput_OutputConnectionsBySubnetInput = numberRecordToMap(\n\t\t\tdata.subnetInput_OutputConnectionsBySubnetInput\n\t\t);\n\t\tthis._subnet_InputConnectionsBySubnetInput = numberRecordToMap(data.subnet_InputConnectionsBySubnetInput);\n\t\tthis._subnetOutput_InputConnectionsBySubnetInput = numberRecordToMap(\n\t\t\tdata.subnetOutput_InputConnectionsBySubnetInput\n\t\t);\n\t\tthis._subnet_OutputConnectionsBySubnetOutput = numberRecordToMap(data.subnet_OutputConnectionsBySubnetOutput);\n\t}\n\n\tasync _do() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parentNode');\n\t\t\treturn;\n\t\t}\n\t\tconst subnet = parentNode.node(this._subnetName) as SubnetSopNode;\n\t\tif (!subnet) {\n\t\t\tconsole.warn('no subnet');\n\t\t\treturn;\n\t\t}\n\n\t\tawait parentNode.scene().batchUpdates(async () => {\n\t\t\tawait this._copySubnetContent(subnet);\n\t\t\tthis._storeSubnetInputs(subnet);\n\t\t\tthis._storeSubnetOutputs(subnet);\n\t\t\t// 4. create the subnet inputs required, and connect\n\n\t\t\tSafeNodeRemover.removeNodes(parentNode, [subnet]);\n\t\t\tawait this._createNodes();\n\t\t\t// 5. create the subnet outputs required, and connect\n\t\t\t// 6. connect the subnet inputs\n\t\t\t// 7. connect the subnet outputs\n\t\t\tthis._connectExtractedNodeInputs(subnet);\n\t\t\tthis._connectExtractedNodeOutputs(subnet);\n\t\t});\n\t}\n\n\tasync _undo() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\tconsole.warn('no parentNode');\n\t\t\treturn;\n\t\t}\n\t\tfor (let newNodeName of this._newNodeNames) {\n\t\t\tconst node = parentNode.node(newNodeName);\n\t\t\tif (node) {\n\t\t\t\tSafeNodeRemover.removeNodes(parentNode, [node]);\n\t\t\t}\n\t\t}\n\t\tawait this._undoClipboardHelper.pasteInNode(parentNode, new Vector2(0, 0));\n\t\tthis._restoreExternalOutConnections();\n\t}\n\n\tprivate async _copySubnetContent(subnet: SubnetSopNode) {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst subnetInOutTypes: string[] = [NetworkChildNodeType.INPUT, NetworkChildNodeType.OUTPUT];\n\t\tconst children = subnet.children();\n\t\tconst childrenExceptInOuts = children.filter((child) => !subnetInOutTypes.includes(child.type()));\n\n\t\tawait this._doClipboardHelper.copyFromNode(subnet, childrenExceptInOuts);\n\t\tawait this._undoClipboardHelper.copyFromNode(parentNode, [subnet]);\n\t}\n\tprivate _storeSubnetInputs(subnet: SubnetSopNode) {\n\t\tthis._subnetInput_OutputConnectionsBySubnetInput.clear();\n\t\tthis._subnet_InputConnectionsBySubnetInput.clear();\n\t\tconst subnetInputs = subnet.nodesByType(NetworkChildNodeType.INPUT);\n\n\t\tfor (let subnetInput of subnetInputs) {\n\t\t\tconst connections: TypedNodeConnection<NodeContext.SOP>[] = [];\n\t\t\tsubnetInput.io.connections.outputConnections(connections);\n\t\t\tif (connections) {\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tMapUtils.pushOnArrayAtEntry(\n\t\t\t\t\t\t\tthis._subnetInput_OutputConnectionsBySubnetInput,\n\t\t\t\t\t\t\tsubnetInput.pv.input,\n\t\t\t\t\t\t\tserializeConnection(connection)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst connections = subnet.io.connections.inputConnections();\n\t\tif (connections) {\n\t\t\tfor (let connection of connections) {\n\t\t\t\tif (connection) {\n\t\t\t\t\tthis._subnet_InputConnectionsBySubnetInput.set(\n\t\t\t\t\t\tconnection.inputIndex(),\n\t\t\t\t\t\tserializeConnection(connection)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _storeSubnetOutputs(subnet: SubnetSopNode) {\n\t\tthis._subnetOutput_InputConnectionsBySubnetInput.clear();\n\t\tthis._subnet_OutputConnectionsBySubnetOutput.clear();\n\n\t\tconst subnetOutputs = subnet.nodesByType(NetworkChildNodeType.OUTPUT);\n\n\t\tfor (let subnetOutput of subnetOutputs) {\n\t\t\tconst connections = subnetOutput.io.connections.inputConnections();\n\t\t\tif (connections) {\n\t\t\t\tfor (let connection of connections) {\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tthis._subnetOutput_InputConnectionsBySubnetInput.set(0, serializeConnection(connection));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst connections: TypedNodeConnection<NodeContext.SOP>[] = [];\n\t\tsubnet.io.connections.outputConnections(connections);\n\t\tif (connections) {\n\t\t\tfor (let connection of connections) {\n\t\t\t\tif (connection) {\n\t\t\t\t\tMapUtils.pushOnArrayAtEntry(\n\t\t\t\t\t\tthis._subnet_OutputConnectionsBySubnetOutput,\n\t\t\t\t\t\tconnection.outputIndex(),\n\t\t\t\t\t\tserializeConnection(connection)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async _createNodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst data = await this._doClipboardHelper.pasteInNode(parentNode, new Vector2(0, 0));\n\t\tthis._newNodeNewNamesByOriginalName.clear();\n\t\tif (data) {\n\t\t\tthis._newNodeNames = data.newNodes.map((n) => n.name());\n\t\t\tconst previousNames = Object.keys(data.nodesByRequestedName);\n\t\t\tfor (let previousName of previousNames) {\n\t\t\t\tconst newNode = data.nodesByRequestedName[previousName];\n\t\t\t\tif (newNode) {\n\t\t\t\t\tthis._newNodeNewNamesByOriginalName.set(previousName, newNode.name());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _connectExtractedNodeInputs(subnet: SubnetSopNode) {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tthis._subnet_InputConnectionsBySubnetInput.forEach((connection, inputIndex) => {\n\t\t\tconst subnetInput_OutConnections = this._subnetInput_OutputConnectionsBySubnetInput.get(inputIndex);\n\t\t\tif (subnetInput_OutConnections) {\n\t\t\t\tfor (let subnetInput_OutConnection of subnetInput_OutConnections) {\n\t\t\t\t\tconst nodeSrc = parentNode.node(connection.nodeSrcName);\n\t\t\t\t\tconst newNodeDestName = this._newNodeNewNamesByOriginalName.get(\n\t\t\t\t\t\tsubnetInput_OutConnection.nodeDestName\n\t\t\t\t\t);\n\t\t\t\t\tif (newNodeDestName) {\n\t\t\t\t\t\tconst nodeDest = parentNode.node(newNodeDestName);\n\n\t\t\t\t\t\tif (nodeDest && nodeSrc) {\n\t\t\t\t\t\t\tnodeDest.setInput(subnetInput_OutConnection.inputIndex, nodeSrc, connection.outputIndex);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tprivate _connectExtractedNodeOutputs(subnet: SubnetSopNode) {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tthis._subnet_OutputConnectionsBySubnetOutput.forEach((connections, outputIndex) => {\n\t\t\tfor (let connection of connections) {\n\t\t\t\tconst subnetOutput_InConnection = this._subnetOutput_InputConnectionsBySubnetInput.get(outputIndex);\n\t\t\t\tif (subnetOutput_InConnection) {\n\t\t\t\t\tconst newNodeSrcName = this._newNodeNewNamesByOriginalName.get(\n\t\t\t\t\t\tsubnetOutput_InConnection.nodeSrcName\n\t\t\t\t\t);\n\t\t\t\t\tif (newNodeSrcName) {\n\t\t\t\t\t\tconst nodeSrc = parentNode.node(newNodeSrcName);\n\t\t\t\t\t\tconst nodeDest = parentNode.node(connection.nodeDestName);\n\n\t\t\t\t\t\tif (nodeDest && nodeSrc) {\n\t\t\t\t\t\t\tnodeDest.setInput(connection.inputIndex, nodeSrc, subnetOutput_InConnection.outputIndex);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _restoreExternalOutConnections() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tthis._subnet_OutputConnectionsBySubnetOutput.forEach((connections, outputIndex) => {\n\t\t\tfor (let connection of connections) {\n\t\t\t\tconst nodeSrc = parentNode.node(connection.nodeSrcName);\n\t\t\t\tconst nodeDest = parentNode.node(connection.nodeDestName);\n\t\t\t\tif (nodeDest) {\n\t\t\t\t\tnodeDest.setInput(connection.inputIndex, nodeSrc, connection.outputIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\toverride async toJSON(): Promise<NodesSubnetExtractCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tsubnetName: this._subnetName,\n\t\t\tclipboardHelper: {\n\t\t\t\tdo: await this._doClipboardHelper.toJSON(this._parentNode),\n\t\t\t\tundo: await this._undoClipboardHelper.toJSON(this._parentNode),\n\t\t\t},\n\t\t\tnewNodeNewNamesByOriginalName: stringMapToRecord(this._newNodeNewNamesByOriginalName),\n\t\t\tnewNodeNames: this._newNodeNames,\n\t\t\tsubnetInput_OutputConnectionsBySubnetInput: numberMapToRecord(\n\t\t\t\tthis._subnetInput_OutputConnectionsBySubnetInput\n\t\t\t),\n\t\t\tsubnet_InputConnectionsBySubnetInput: numberMapToRecord(this._subnet_InputConnectionsBySubnetInput),\n\t\t\tsubnetOutput_InputConnectionsBySubnetInput: numberMapToRecord(\n\t\t\t\tthis._subnetOutput_InputConnectionsBySubnetInput\n\t\t\t),\n\t\t\tsubnet_OutputConnectionsBySubnetOutput: numberMapToRecord(this._subnet_OutputConnectionsBySubnetOutput),\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: NodesSubnetExtractCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = parent.node(json.subnetName) as TypedNode<NodeContext, any>;\n\t\tconst cmd = new NodesSubnetExtractCommand(parent, mode == BaseCommandFromJSONMode.DO ? node : json.subnetName);\n\t\tcmd._setSerializedData(json);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {ParamType} from '../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {ParamConstructorMap} from '../../../../@polygonjs/polygonjs/src/engine/params/types/ParamConstructorMap';\nimport {ParamInitValuesTypeMap} from '../../../../@polygonjs/polygonjs/src/engine/params/types/ParamInitValuesTypeMap';\nimport {cloneDeep} from 'lodash';\nexport interface ParamSetCommandJSON extends BaseCommandJSON {\n\tnodePath: string;\n\tparamName: string;\n\tnewRawInput: ParamInitValuesTypeMap[ParamType];\n\toldRawInput?: ParamInitValuesTypeMap[ParamType];\n}\n\nexport class ParamSetCommand<T extends ParamType> extends BaseCommand {\n\tstatic override type: CommandType = CommandType.PARAM_SET;\n\tprivate _nodePath: string;\n\tprivate _paramName: string;\n\tconstructor(\n\t\t_param: ParamConstructorMap[T],\n\t\tprivate _newRawInput: ParamInitValuesTypeMap[T],\n\t\tprivate _oldRawInput?: ParamInitValuesTypeMap[T]\n\t) {\n\t\tsuper(_param.node.scene());\n\n\t\tthis._nodePath = _param.node.path();\n\t\tthis._paramName = _param.name();\n\n\t\tif (this._oldRawInput == null) {\n\t\t\tthis._oldRawInput = _param.rawInput() as ParamInitValuesTypeMap[T];\n\t\t}\n\t}\n\tprivate _param() {\n\t\tconst node = this._scene.node(this._nodePath);\n\t\tif (!node) {\n\t\t\tconsole.warn(`no node with name ${this._nodePath}`);\n\t\t\treturn;\n\t\t}\n\t\treturn node.params.get(this._paramName);\n\t}\n\n\tasync _do() {\n\t\tconst param = this._param();\n\t\tif (!param) {\n\t\t\tconsole.warn(`no param`);\n\t\t\treturn;\n\t\t}\n\t\tparam.set(this._newRawInput as never);\n\t}\n\n\tasync _undo() {\n\t\tconst param = this._param();\n\t\tif (!param) {\n\t\t\tconsole.warn(`no param`);\n\t\t\treturn;\n\t\t}\n\t\tparam.set(this._oldRawInput as never);\n\t}\n\n\toverride async toJSON(): Promise<ParamSetCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tnodePath: this._nodePath,\n\t\t\tparamName: this._paramName,\n\t\t\tnewRawInput: cloneDeep(this._newRawInput),\n\t\t\toldRawInput: cloneDeep(this._oldRawInput),\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: ParamSetCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst node = scene.node(json.nodePath);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst param = node.params.get(json.paramName);\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\treturn new ParamSetCommand(param as ParamConstructorMap[ParamType], json.newRawInput, json.oldRawInput);\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nexport interface SetFlagBypassCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\toldState?: boolean;\n}\n\nexport class SetFlagBypassCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.SET_FLAG_BYPASS;\n\tprivate _oldState: boolean | undefined;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[] = [];\n\n\tconstructor(_parent: BaseNodeType, _nodes: BaseNodeType[]) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\tconst _firstNode = _nodes[0];\n\t\tif (_firstNode) {\n\t\t\tthis._oldState = _firstNode.flags?.bypass?.active();\n\t\t}\n\t}\n\tprivate _setOldState(oldState?: boolean) {\n\t\tthis._oldState = oldState;\n\t}\n\n\tprivate _nodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn [];\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tthis._nodeNames.map((nodeName) => parentNode.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\treturn nodes;\n\t}\n\n\tasync _do() {\n\t\tconst nodes = this._nodes();\n\t\tconst firstNode = nodes[0];\n\t\tif (firstNode && this._oldState != null) {\n\t\t\tconst cooker = firstNode.scene().cooker;\n\t\t\tcooker.block();\n\t\t\tfor (let node of nodes) {\n\t\t\t\tnode.flags?.bypass?.set(!this._oldState);\n\t\t\t}\n\t\t\tcooker.unblock();\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst nodes = this._nodes();\n\t\tconst firstNode = nodes[0];\n\t\tif (firstNode && this._oldState != null) {\n\t\t\tfor (let node of nodes) {\n\t\t\t\tnode.flags?.bypass?.set(this._oldState);\n\t\t\t}\n\t\t}\n\t}\n\toverride async toJSON(): Promise<SetFlagBypassCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\toldState: this._oldState,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: SetFlagBypassCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(\n\t\t\tjson.nodeNames.map((nodeName) => parent.node(nodeName)),\n\t\t\tnodes\n\t\t);\n\t\tconst cmd = new SetFlagBypassCommand(parent, nodes);\n\t\tcmd._setOldState(json.oldState);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nexport interface SetFlagDisplayCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\tnewDisplayState?: boolean;\n\toldNodeName?: string;\n}\n\nexport class SetFlagDisplayCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.SET_FLAG_DISPLAY;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[] = [];\n\tprivate _oldNodeName: string | undefined;\n\tprivate _newDisplayState: boolean | undefined;\n\n\tconstructor(_parent: BaseNodeType, _nodes: BaseNodeType[]) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\tconst firstNode = _nodes[0];\n\t\tif (firstNode) {\n\t\t\tconst parent = firstNode.parent();\n\t\t\tif (parent) {\n\t\t\t\tif (parent.displayNodeController) {\n\t\t\t\t\tthis._oldNodeName = parent.displayNodeController.displayNode()?.name();\n\t\t\t\t} else {\n\t\t\t\t\tthis._newDisplayState = !firstNode.flags?.display?.active();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate _setData(oldNodeName?: string, newDisplayState?: boolean) {\n\t\tthis._oldNodeName = oldNodeName;\n\t\tthis._newDisplayState = newDisplayState;\n\t}\n\n\tprivate _nodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn [];\n\t\t}\n\t\tconst nodes:BaseNodeType[]=[]\n\t\tArrayUtils.compact(this._nodeNames.map((nodeName) => parentNode.node(nodeName)),nodes);\n\t\treturn nodes\n\t}\n\n\tasync _do() {\n\t\tconst nodes = this._nodes();\n\t\tconst firstNode = nodes[0];\n\t\tif (!firstNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (parentNode && firstNode) {\n\t\t\tif (parentNode.displayNodeController) {\n\t\t\t\tfirstNode.flags?.display?.set(true);\n\t\t\t\t// for (let node of this._nodes) {\n\t\t\t\t// \tnode.flags?.display?.set(true);\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tif (this._newDisplayState != null) {\n\t\t\t\t\tfor (let node of nodes) {\n\t\t\t\t\t\tnode.flags?.display?.set(this._newDisplayState);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst nodes = this._nodes();\n\t\tconst firstNode = nodes[0];\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst oldNode = this._oldNodeName ? parentNode.node(this._oldNodeName) : null;\n\n\t\tif (!firstNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (oldNode) {\n\t\t\toldNode.flags?.display?.set(true);\n\t\t} else {\n\t\t\tif (this._newDisplayState != null) {\n\t\t\t\tfor (let node of nodes) {\n\t\t\t\t\tnode.flags?.display?.set(!this._newDisplayState);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\toverride async toJSON(): Promise<SetFlagDisplayCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\toldNodeName: this._oldNodeName,\n\t\t\tnewDisplayState: this._newDisplayState,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: SetFlagDisplayCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes:BaseNodeType[] = []\n\t\tArrayUtils.compact(json.nodeNames.map((nodeName) => parent.node(nodeName)),nodes);\n\t\tconst cmd = new SetFlagDisplayCommand(parent, nodes);\n\t\tcmd._setData(json.oldNodeName, json.newDisplayState);\n\t\treturn cmd;\n\t}\n}\n","import {PolyScene} from './../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseCommandJSON, CommandType, BaseCommandFromJSONMode} from './utils/CommandType';\nimport {BaseCommand} from './_Base';\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nexport interface SetFlagOptimizeCommandJSON extends BaseCommandJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\toldState?: boolean;\n}\n\nexport class SetFlagOptimizeCommand extends BaseCommand {\n\tstatic override type: CommandType = CommandType.SET_FLAG_OPTIMIZE;\n\tprivate _parentPath: string;\n\tprivate _nodeNames: string[] = [];\n\tprivate _oldState: boolean | undefined;\n\n\tconstructor(_parent: BaseNodeType, _nodes: BaseNodeType[]) {\n\t\tsuper(_parent.scene());\n\t\tthis._parentPath = _parent.path();\n\t\tthis._nodeNames = _nodes.map((n) => n.name());\n\t\tconst firstNode = _nodes[0];\n\t\tif (firstNode) {\n\t\t\tthis._oldState = firstNode.flags?.optimize?.active();\n\t\t}\n\t}\n\tprivate _setOldState(oldState?: boolean) {\n\t\tthis._oldState = oldState;\n\t}\n\tprivate _nodes() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn [];\n\t\t}\n\t\tconst nodes:BaseNodeType[]=[]\n\t\tArrayUtils.compact(this._nodeNames.map((nodeName) => parentNode.node(nodeName)),nodes);\n\t\treturn nodes\n\t}\n\n\tasync _do() {\n\t\tconst nodes = this._nodes();\n\t\tconst firstNode = nodes[0];\n\t\tif (!firstNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._oldState != null) {\n\t\t\tconst cooker = this._scene.cooker;\n\t\t\tcooker.block();\n\t\t\tfor (let node of nodes) {\n\t\t\t\tnode.flags?.optimize?.set(!this._oldState);\n\t\t\t}\n\t\t\tcooker.unblock();\n\t\t}\n\t}\n\n\tasync _undo() {\n\t\tconst nodes = this._nodes();\n\t\tconst firstNode = nodes[0];\n\t\tif (!firstNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._oldState != null) {\n\t\t\tfor (let node of nodes) {\n\t\t\t\tnode.flags?.optimize?.set(this._oldState);\n\t\t\t}\n\t\t}\n\t}\n\toverride async toJSON(): Promise<SetFlagOptimizeCommandJSON> {\n\t\treturn {\n\t\t\t...(await super.toJSON()),\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\toldState: this._oldState,\n\t\t};\n\t}\n\tstatic override fromJSON(scene: PolyScene, json: SetFlagOptimizeCommandJSON, mode: BaseCommandFromJSONMode) {\n\t\tconst parent = scene.node(json.parentPath);\n\t\tif (!parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes:BaseNodeType[] = []\n\t\tArrayUtils.compact(json.nodeNames.map((nodeName) => parent.node(nodeName)), nodes);\n\t\tconst cmd = new SetFlagOptimizeCommand(parent, nodes);\n\t\tcmd._setOldState(json.oldState);\n\t\treturn cmd;\n\t}\n}\n","import {BaseCommandFromJSONMode} from './utils/CommandType';\n// import {Editor} from './../../Editor';\nimport {BaseCommandJSON, CommandType} from './utils/CommandType';\nimport type {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseSerializedStack} from '../serializedStack/_BaseSerializedStack';\n\nexport abstract class BaseCommand {\n\tstatic type: CommandType = CommandType.BASE;\n\tprivate _pushed: boolean = false;\n\tconstructor(protected _scene: PolyScene) {}\n\tdataUpdateRequired() {\n\t\treturn false;\n\t}\n\n\t// uuid() {\n\t// \treturn this._uuid;\n\t// }\n\t// __setUuid(uuid: string) {\n\t// \tthis._uuid = uuid;\n\t// }\n\tmarkAsPushed() {\n\t\tthis._pushed = true;\n\t}\n\tpushed() {\n\t\treturn this._pushed;\n\t}\n\t// async push() {\n\t// \t// \tif (this._pushed) {\n\t// \t// \t\tconsole.error('this command was already pushed', this);\n\t// \t// \t\treturn;\n\t// \t// \t}\n\t// \t// \tthis._pushed = true;\n\t// \t// \tawait Editor.instance().pushCommand(this);\n\t// }\n\tasync do(stack: BaseSerializedStack) {\n\t\tif (!stack.doInProgress()) {\n\t\t\tconst message = 'stack is not doInProgress';\n\t\t\tconsole.error(message);\n\t\t\tthrow new Error(message);\n\t\t}\n\t\tawait this._do();\n\t}\n\tasync undo(stack: BaseSerializedStack) {\n\t\tif (!stack.undoInProgress()) {\n\t\t\tconst message = 'stack is not undoInProgress';\n\t\t\tconsole.error(message);\n\t\t\tthrow new Error(message);\n\t\t}\n\t\tawait this._undo();\n\t}\n\n\tabstract _do(): Promise<void>;\n\tabstract _undo(): Promise<void>;\n\tasync toJSON(): Promise<BaseCommandJSON> {\n\t\treturn {type: (this.constructor as any).type};\n\t}\n\tstatic fromJSON(scene: PolyScene, json: BaseCommandJSON, mode: BaseCommandFromJSONMode) {}\n}\n","import {SetFlagDisplayCommand, SetFlagDisplayCommandJSON} from './../SetFlagDisplay';\nimport {SetFlagOptimizeCommand, SetFlagOptimizeCommandJSON} from './../SetFlagOptimize';\nimport {SetFlagBypassCommand, SetFlagBypassCommandJSON} from './../SetFlagBypass';\nimport {ParamSetCommand, ParamSetCommandJSON} from './../ParamSet';\nimport {NodesSubnetExtractCommand, NodesSubnetExtractCommandJSON} from './../NodesSubnetExtract';\nimport {NodesSubnetCollapseCommand, NodesSubnetCollapseCommandJSON} from './../NodesSubnetCollapse';\nimport {\n\tNodeSetOverrideClonableStateCommand,\n\tNodeSetOverrideClonableStateCommandJSON,\n} from './../NodeSetOverrideClonableState';\nimport {NodeSetNameCommand, NodeSetNameCommandJSON} from './../NodeSetName';\nimport {NodeSetCommentCommand, NodeSetCommentCommandJSON} from './../NodeSetComment';\nimport {NodeSelectCommand, NodeSelectCommandJSON} from './../NodeSelect';\nimport {NodePolyNodeUnlockCommand, NodePolyNodeUnlockCommandJSON} from './../NodePolyNodeUnlock';\nimport {NodePolyNodeLockCommand, NodePolyNodeLockCommandJSON} from './../NodePolyNodeLock';\nimport {NodeDeleteCommand, NodeDeleteCommandJSON} from './../NodeDelete';\nimport {NodeCreateCommand, NodeCreateCommandJSON} from './../NodeCreate';\nimport {MultipleCommand, MultipleCommandJSON} from './../Multiple';\nimport {NodeConnectCommand, NodeConnectCommandJSON} from './../NodeConnect';\nimport {NodeClipboardPasteCommand, NodeClipboardPasteJSON} from './../NodeClipboardPaste';\nimport {NodeMoveCommand, NodeMoveCommandJSON} from './../NodeMove';\n// import {AnimationKeyframeSelectCommand, AnimationKeyframeSelectCommandJSON} from './../AnimationKeyframeSelect';\nimport {TypeAssert} from './../../../../../@polygonjs/polygonjs/src/engine/poly/Assert';\nimport {CommandTypeJSON, CommandType, BaseCommandFromJSONMode} from './CommandType';\nimport {PolyScene} from './../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nexport function createCommandFromJSON(scene: PolyScene, json: CommandTypeJSON, mode: BaseCommandFromJSONMode) {\n\tconst type = json.type as CommandType;\n\n\tfunction _instantiateCommand() {\n\t\tswitch (type) {\n\t\t\tcase CommandType.BASE: {\n\t\t\t\tconsole.error('received base command type', type);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// case CommandType.ANIMATION_KEYFRAME_SELECT: {\n\t\t\t// \treturn AnimationKeyframeSelectCommand.fromJSON(scene, json as AnimationKeyframeSelectCommandJSON, mode);\n\t\t\t// }\n\t\t\tcase CommandType.MULTIPLE: {\n\t\t\t\treturn MultipleCommand.fromJSON(scene, json as MultipleCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_CLIPBOARD_PASTE: {\n\t\t\t\treturn NodeClipboardPasteCommand.fromJSON(scene, json as NodeClipboardPasteJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_CREATE: {\n\t\t\t\treturn NodeCreateCommand.fromJSON(scene, json as NodeCreateCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_DELETE: {\n\t\t\t\treturn NodeDeleteCommand.fromJSON(scene, json as NodeDeleteCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_CONNECT: {\n\t\t\t\treturn NodeConnectCommand.fromJSON(scene, json as NodeConnectCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_MOVE: {\n\t\t\t\treturn NodeMoveCommand.fromJSON(scene, json as NodeMoveCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_POLY_NODE_LOCK: {\n\t\t\t\treturn NodePolyNodeLockCommand.fromJSON(scene, json as NodePolyNodeLockCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_POLY_NODE_UNLOCK: {\n\t\t\t\treturn NodePolyNodeUnlockCommand.fromJSON(scene, json as NodePolyNodeUnlockCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_SELECT: {\n\t\t\t\treturn NodeSelectCommand.fromJSON(scene, json as NodeSelectCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_SET_COMMENT: {\n\t\t\t\treturn NodeSetCommentCommand.fromJSON(scene, json as NodeSetCommentCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_SET_NAME: {\n\t\t\t\treturn NodeSetNameCommand.fromJSON(scene, json as NodeSetNameCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_SET_OVERRIDE_CLONABLE_STATE: {\n\t\t\t\treturn NodeSetOverrideClonableStateCommand.fromJSON(\n\t\t\t\t\tscene,\n\t\t\t\t\tjson as NodeSetOverrideClonableStateCommandJSON,\n\t\t\t\t\tmode\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase CommandType.NODE_SUBNET_COLLAPSE: {\n\t\t\t\treturn NodesSubnetCollapseCommand.fromJSON(scene, json as NodesSubnetCollapseCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.NODE_SUBNET_EXTRACT: {\n\t\t\t\treturn NodesSubnetExtractCommand.fromJSON(scene, json as NodesSubnetExtractCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.PARAM_SET: {\n\t\t\t\treturn ParamSetCommand.fromJSON(scene, json as ParamSetCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.SET_FLAG_BYPASS: {\n\t\t\t\treturn SetFlagBypassCommand.fromJSON(scene, json as SetFlagBypassCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.SET_FLAG_DISPLAY: {\n\t\t\t\treturn SetFlagDisplayCommand.fromJSON(scene, json as SetFlagDisplayCommandJSON, mode);\n\t\t\t}\n\t\t\tcase CommandType.SET_FLAG_OPTIMIZE: {\n\t\t\t\treturn SetFlagOptimizeCommand.fromJSON(scene, json as SetFlagOptimizeCommandJSON, mode);\n\t\t\t}\n\t\t}\n\t\tTypeAssert.unreachable(type);\n\t}\n\n\tconst cmd = _instantiateCommand();\n\tif (!cmd) {\n\t\treturn;\n\t}\n\t// cmd.__setUuid(json.uuid);\n\treturn cmd;\n}\n","// import {MultipleCommandJSON} from './../Multiple';\n// import {NodeClipboardPasteJSON} from './../NodeClipboardPaste';\n// import {NodeConnectCommandJSON} from './../NodeConnect';\n// import {NodeMoveCommandJSON} from './../NodeMove';\n// import {NodeDeleteCommandJSON} from '../NodeDelete';\n\nexport interface BaseCommandJSON {\n\ttype: string;\n}\nexport type CommandTypeJSON = BaseCommandJSON;\n// | MultipleCommandJSON\n// | NodeClipboardPasteJSON\n// | NodeConnectCommandJSON\n// | NodeDeleteCommandJSON\n// | NodeMoveCommandJSON;\n\nexport enum BaseCommandFromJSONMode {\n\tDO = 'do',\n\tUNDO = 'undo',\n}\n\nexport enum CommandType {\n\tBASE = 'base',\n\t// ANIMATION_KEYFRAME_SELECT = 'animationKeyframeSelect',\n\tMULTIPLE = 'multi',\n\tNODE_CLIPBOARD_PASTE = 'nodeClipboardPaste',\n\tNODE_CONNECT = 'nodeConnect',\n\tNODE_CREATE = 'nodeCreate',\n\tNODE_DELETE = 'nodeDelete',\n\tNODE_MOVE = 'nodeMove',\n\tNODE_POLY_NODE_LOCK = 'nodePolyNodeLock',\n\tNODE_POLY_NODE_UNLOCK = 'nodePolyNodeUnLock',\n\tNODE_SELECT = 'nodeSelect',\n\tNODE_SET_COMMENT = 'nodeSetComment',\n\tNODE_SET_NAME = 'nodeSetName',\n\tNODE_SET_OVERRIDE_CLONABLE_STATE = 'nodeSetOverrideClonableState',\n\tNODE_SUBNET_COLLAPSE = 'nodeSubnetCollapse',\n\tNODE_SUBNET_EXTRACT = 'nodeSubnetExtract',\n\tPARAM_SET = 'paramSet',\n\tSET_FLAG_BYPASS = 'setFlagBypass',\n\tSET_FLAG_DISPLAY = 'setFlagDisplay',\n\tSET_FLAG_OPTIMIZE = 'setFlagOptimize',\n}\n","import {NetworkClipBoardHelper} from './../../../core/clipboard/NetworkClipboardHelper';\nimport {PolyScene} from './../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {BaseNodeType, TypedNode} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from '../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {ArrayUtils} from '../../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {BaseCommand} from '../_Base';\nimport {TypedNodeConnection} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\n\ninterface ConnectionData {\n\tname: {src: string; dest: string};\n\tindex: {input: number; output: number};\n}\n\nexport interface NodesStateControllerJSON {\n\tparentPath: string;\n\tnodeNames: string[];\n\tconnectionDatas: ConnectionData[];\n\tcode?: string;\n}\n\nexport class NodesStateController {\n\tprivate _connectionsData: ConnectionData[] = [];\n\tprivate _code: string | undefined;\n\n\tconstructor(\n\t\tprivate _cmd: BaseCommand,\n\t\tprivate _scene: PolyScene,\n\t\tprivate _parentPath: string,\n\t\tprivate _nodeNames: string[]\n\t) {}\n\n\tsave() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst helper = new NetworkClipBoardHelper();\n\t\tconst parentNodes = this._nodeNames.map((nodeName) => parentNode.node(nodeName));\n\t\tconst uniqParentNodes: BaseNodeType[] = [];\n\t\tArrayUtils.compact(parentNodes, uniqParentNodes);\n\t\tthis._code = helper.createCodeForNodes(parentNode, uniqParentNodes);\n\n\t\tthis._connectionsData = [];\n\t\tfor (let node of uniqParentNodes as TypedNode<NodeContext, any>[]) {\n\t\t\tconst connections: TypedNodeConnection<NodeContext>[] = [];\n\t\t\tnode.io.connections.outputConnections(connections);\n\t\t\tfor (const connection of connections) {\n\t\t\t\tconst data: ConnectionData = {\n\t\t\t\t\tname: {\n\t\t\t\t\t\tsrc: connection.nodeSrc().name(),\n\t\t\t\t\t\tdest: connection.nodeDest().name(),\n\t\t\t\t\t},\n\t\t\t\t\tindex: {\n\t\t\t\t\t\tinput: connection.inputIndex(),\n\t\t\t\t\t\toutput: connection.outputIndex(),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tthis._connectionsData.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// const exporter = new NodesCodeExporter(this._nodes);\n\t\t// this._undo_code_lines = exporter.process(TMP_PARENT);\n\n\t\t// const required_nodes_by_name: Dictionary<BaseNodeType> = {};\n\t\t// this._nodes.forEach((node) => {\n\t\t// \tnode.io.inputs.inputs().forEach((input) => {\n\t\t// \t\tif (input) {\n\t\t// \t\t\tconst name = input.name();\n\t\t// \t\t\trequired_nodes_by_name[name] = input;\n\t\t// \t\t}\n\t\t// \t});\n\t\t// \tnode.io.connections.outputConnections().forEach((output_connection) => {\n\t\t// \t\tif (output_connection) {\n\t\t// \t\t\tconst output_node = output_connection.node_dest;\n\t\t// \t\t\tconst name = output_node.name();\n\t\t// \t\t\trequired_nodes_by_name[name] = output_node;\n\t\t// \t\t\tconst input_index = output_connection.input_index;\n\t\t// \t\t\tconst output_index = output_connection.output_index;\n\n\t\t// \t\t\tif (!this._required_outputs_code_by_name.get(name)) {\n\t\t// \t\t\t\tthis._required_outputs_code_by_name.set(name, new Map());\n\t\t// \t\t\t}\n\t\t// \t\t\tconst line = `${name}.setInput(${input_index}, ${node.name()}, ${output_index})`;\n\t\t// \t\t\tthis._required_outputs_code_by_name.get(name)!.set(input_index, line);\n\t\t// \t\t}\n\t\t// \t});\n\t\t// });\n\n\t\t// lodash_values(required_nodes_by_name).forEach((node) => {\n\t\t// \tconst name = node.name();\n\t\t// \tthis._required_nodes_code_by_name[name] = `const ${name} = ${TMP_PARENT}.node('${name}')`;\n\t\t// });\n\n\t\t// this._old_selected_nodes = [];\n\t}\n\trestore() {\n\t\tconst parentNode = this._scene.node(this._parentPath);\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._scene.batchUpdates(() => {\n\t\t\tif (!this._code) {\n\t\t\t\tconsole.warn('NodesStateController: no code', this._cmd);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst helper = new NetworkClipBoardHelper();\n\t\t\thelper.runCodeInNode(parentNode, this._code);\n\n\t\t\tfor (let data of this._connectionsData) {\n\t\t\t\tconst destNode = parentNode.node(data.name.dest);\n\t\t\t\tconst srcNode = parentNode.node(data.name.src);\n\n\t\t\t\tdestNode?.setInput(data.index.input, srcNode, data.index.output);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _setConnectionsData(connectionsData: ConnectionData[]) {\n\t\tfor (let connectionData of connectionsData) {\n\t\t\tthis._connectionsData.push(connectionData);\n\t\t}\n\t}\n\tprivate _setCode(code?: string) {\n\t\tthis._code = code;\n\t}\n\ttoJSON(): NodesStateControllerJSON {\n\t\treturn {\n\t\t\tparentPath: this._parentPath,\n\t\t\tnodeNames: this._nodeNames,\n\t\t\tconnectionDatas: this._connectionsData,\n\t\t\tcode: this._code,\n\t\t};\n\t}\n\tstatic fromJSON(scene: PolyScene, cmd: BaseCommand, json: NodesStateControllerJSON): NodesStateController {\n\t\tconst controller = new NodesStateController(cmd, scene, json.parentPath, json.nodeNames);\n\t\tcontroller._setConnectionsData(json.connectionDatas);\n\t\tcontroller._setCode(json.code);\n\t\treturn controller;\n\t}\n}\n","// import {PolyDictionary} from '../../../@polygonjs/polygonjs/src/types/GlobalTypes';\n// import {removeImportExport} from '../../../@polygonjs/polygonjs/src/core/ImportUtils';\n// import {ManifestContent} from '../../../@polygonjs/polygonjs/src/engine/io/manifest/import/SceneData';\n// import {Poly} from '../../../@polygonjs/polygonjs/src/engine/Poly';\nimport {CoreFileUtils} from '../core/FileUtils';\nimport _ from 'lodash';\n\n// @ts-ignore\n// import BUNDLED_TYPES from '../../engine/types/bundled_types.d.ts.edited.txt';\n// console.log(BUNDLED_TYPES);\n// import {PolyNodeDataRegister} from '../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDataRegister';\n// import {NodeContext} from '../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n\n// interface OptimizedLoadSceneTemplateOptions {\n// \telementId: string;\n// \tmanifestContent: ManifestContent;\n// \tassetsManifest: PolyDictionary<string>;\n// \tALL_IMPORT_PATH: string;\n// \tPOLY_NODES_DATA: PolyNodeDataRegister<NodeContext>[];\n// }\n\nexport class FilesRegister {\n\t// protected static _polygonjs: string;\n\t// protected static _polygonjsLicense: string;\n\t// protected static _polygonjsBundledTypes: string;\n\t// protected static _viewer: string;\n\t// protected static _sceneDataLoader: string;\n\tprotected static _thumbnailStaticBlob: Blob | undefined;\n\t// protected static _optimizedLoadScene: string;\n\tprivate static _bundledTypes: string | undefined;\n\n\tprivate static _initialized = false;\n\tstatic async init() {\n\t\tif (this._initialized) {\n\t\t\treturn;\n\t\t}\n\t\tthis._initialized = true;\n\t\t// @ts-ignore\n\t\t// const POLYGONJS = await import(`!!raw-loader!../../../@polygonjs/polygonjs/dist/all.js?v=2`);\n\t\t// this._polygonjs = (POLYGONJS as any).default;\n\t\t// @ts-ignore\n\t\t// const POLYGONJS_LICENSE = await import(`!!raw-loader!../../../@polygonjs/polygonjs/dist/all.js.LICENSE.txt`);\n\t\t// this._polygonjsLicense = (POLYGONJS_LICENSE as any).default;\n\t\t// @ts-ignore\n\t\t// const bundledTypes = await import('raw-loader!../../../dist/bundled_types.d.ts.txt');\n\t\t// this._polygonjsBundledTypes = bundledTypes as any;\n\t\t// console.log('A this._polygonjsBundledTypes');\n\t\t// console.log(this._polygonjsBundledTypes);\n\t\t// console.log('B this._polygonjsBundledTypes');\n\n\t\t// @ts-ignore\n\t\t// const VIEWER = await import('raw-loader!../../../@polygonjs/polygonjs/dist/viewer.js');\n\t\t// this._viewer = (VIEWER as any).default;\n\t\t// @ts-ignore\n\t\t// const SCENE_DATA_LOADER = await import('raw-loader!../../../@polygonjs/polygonjs/dist/sceneDataLoader.js');\n\t\t// this._sceneDataLoader = (SCENE_DATA_LOADER as any).default;\n\t\t// @ts-ignore\n\t\t// const OPTIMIZED_LOAD_SCENE = await import('raw-loader!./templates/OptimizedLoad.ts');\n\t\t// this._optimizedLoadScene = removeImportExport(OPTIMIZED_LOAD_SCENE.default);\n\n\t\tthis._loadThumbnailstaticBlob();\n\t}\n\n\tprivate static _polyConfig: string | undefined;\n\tstatic polyConfig() {\n\t\treturn this._polyConfig;\n\t}\n\tstatic async registerPolyConfig(url: string) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst text = await response.text();\n\t\t\tthis._polyConfig = text;\n\t\t} catch (err) {}\n\t}\n\t// static optimizedLoadScene(options: OptimizedLoadSceneTemplateOptions) {\n\t// \tconst {elementId, manifestContent, assetsManifest, ALL_IMPORT_PATH, POLY_NODES_DATA} = options;\n\n\t// \tconst assetsMap = JSON.stringify(assetsManifest, null, 2);\n\t// \tconst manifestContentStr = JSON.stringify(manifestContent, null, 2);\n\t// \tconst POLY_LIB_ROOT = Poly.libs.root() || '';\n\n\t// \t// console.log(_.templateSettings.interpolate, _.templateSettings);\n\t// \t// const prevInterpolate = _.templateSettings.interpolate;\n\t// \t// _.templateSettings.interpolate = undefined;\n\t// \tconsole.log('optimizedLoadScene', options, assetsMap);\n\t// \tconst compileFileContent = _.template(this._optimizedLoadScene)({\n\t// \t\telementId,\n\t// \t\tALL_IMPORT_PATH,\n\t// \t\tPOLY_LIB_ROOT,\n\t// \t\t// assetsMap,\n\t// \t\t// manifestContent: manifestContentStr,\n\t// \t\tmoduleName: 'moduleNameReallyShouldNotBeReplaced',\n\t// \t})\n\t// \t\t// we use .replace as we need to remove the single quotes (')\n\t// \t\t.replace(\"'___ASSETS_MAP___'\", assetsMap)\n\t// \t\t.replace(\"'___MANIFEST_CONTENT___'\", manifestContentStr)\n\t// \t\t.replace(\"'___POLY_NODES_DATA___'\", JSON.stringify(POLY_NODES_DATA));\n\t// \t//.replace(/\\/\\/ @ts-ignore/g, '')\n\t// \t//.replace(/\\s/g, '\\t');\n\n\t// \t// _.templateSettings.interpolate = prevInterpolate;\n\t// \treturn compileFileContent;\n\n\t// \t// \tthis._optimizedLoadScene\n\t// \t// \t\t.replace('${elementId}', elementId)\n\t// \t// \t\t.replace('${ALL_IMPORT_PATH}', ALL_IMPORT_PATH)\n\t// \t// \t\t.replace('${POLY_LIB_ROOT}', Poly.libs.root() || '')\n\t// \t// \t\t.replace(\"'${assetsMap}'\", JSON.stringify(assetsManifest, null, 2))\n\t// \t// \t\t// Be careful here, as the single quotes are also part of what is replaced\n\t// \t// \t\t.replace(\"'${manifestContent}'\", JSON.stringify(manifestContent, null, 2))\n\t// \t// );\n\t// }\n\n\t// static polygonjs() {\n\t// \treturn this._polygonjs;\n\t// }\n\t// static polygonjsLicense() {\n\t// \treturn this._polygonjsLicense;\n\t// }\n\tstatic async polygonjsBundledTypes() {\n\t\treturn this._bundledTypes || (await this.fetchBundleTypes());\n\t}\n\tstatic async fetchBundleTypes() {\n\t\tconst url = `/editor/codenodes/bundledTypes.d.ts.edited.txt?t=${Date.now()}`;\n\t\tconst response = await fetch(url);\n\t\treturn await response.text();\n\t}\n\t// static viewer() {\n\t// \treturn this._viewer;\n\t// }\n\t// static sceneDataLoader() {\n\t// \treturn this._sceneDataLoader;\n\t// }\n\n\t//\n\t//\n\t// THUMBNAIL STATIC BLOB\n\t//\n\t//\n\tprivate static async _loadThumbnailstaticBlob() {\n\t\tconst elementId = 'thumbnail_static_for_self_contained_export';\n\t\tconst image = document.getElementById(elementId) as HTMLImageElement;\n\t\tif (!image) {\n\t\t\t// no need for a warning here,\n\t\t\t// as the element will not be present for the local app\n\t\t\t// console.log('❌ no image to load thumbnail blob from');\n\t\t\treturn;\n\t\t}\n\t\tconst url = image.src;\n\t\ttry {\n\t\t\tconst blob = await CoreFileUtils.imageUrlToBlob(url);\n\t\t\t// console.log(url);\n\t\t\t// const image = new Image();\n\t\t\t// image.onload = () => {\n\t\t\t// \t// const response = await fetch(url, {mode: 'no-cors'});\n\t\t\t// \t// const blob = await response.blob();\n\n\t\t\t// \tdocument.body.innerHTML = '';\n\t\t\t// \tdocument.body.append(image);\n\t\t\tif (blob) {\n\t\t\t\t// const datauri = await CoreFileUtils.blobToDatauri(blob);\n\t\t\t\t// document.body.innerHTML = `<img src=\"${datauri}\"></img>`;\n\t\t\t\tthis.setThumbnailStaticBlob(blob);\n\t\t\t\t// console.log('✅ registered thumbnail blob');\n\t\t\t}\n\t\t\t// };\n\t\t\t// image.src = url;\n\t\t} catch (err) {\n\t\t\tconsole.log('FilesRegister: thumbnail not found at url', url);\n\t\t}\n\t}\n\tstatic setThumbnailStaticBlob(blob: Blob) {\n\t\tthis._thumbnailStaticBlob = blob;\n\t}\n\tstatic thumbnailStaticBlob() {\n\t\treturn this._thumbnailStaticBlob;\n\t}\n}\n","import {EditorClipboardMutation, EditorClipboardPayloadByMutationMap} from '../../modules/editor/Clipboard';\nimport {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Ref, ref} from 'vue';\n\nexport class EditorClipboardStoreControllerClass {\n\tprivate static _instance: EditorClipboardStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorClipboardStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _node_id: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate readonly _param_id: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate readonly _upload_name: Ref<string | null> = ref('');\n\n\tnode_id(): CoreGraphNodeId | null {\n\t\treturn this._node_id.value;\n\t}\n\tparam_id(): CoreGraphNodeId | null {\n\t\treturn this._param_id.value;\n\t}\n\tupload_name(): string | null {\n\t\treturn this._upload_name.value;\n\t}\n\n\t// mutations\n\tset_node_id(node_id: EditorClipboardPayloadByMutationMap[EditorClipboardMutation.NODE_ID]): void {\n\t\tthis._node_id.value = node_id;\n\t}\n\tset_param_id(param_id: EditorClipboardPayloadByMutationMap[EditorClipboardMutation.PARAM_ID]): void {\n\t\tthis._param_id.value = param_id;\n\t}\n\tset_upload_name(upload_name: EditorClipboardPayloadByMutationMap[EditorClipboardMutation.UPLOAD_NAME]): void {\n\t\tthis._upload_name.value = upload_name;\n\t}\n}\n\nexport const EditorClipboardStoreController = EditorClipboardStoreControllerClass.instance();\n","import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Vector2Like} from '../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {ref, Ref} from 'vue';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nexport type OpenTabMenuForChangeTypeCallback = (node: BaseNodeType) => void;\nexport class EditorContextMenuStoreControllerClass {\n\tprivate static _instance: EditorContextMenuStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorContextMenuStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _position: Ref<Vector2Like> = ref({\n\t\tx: 0,\n\t\ty: 0,\n\t});\n\tprivate _nodeId: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate _paramId: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate _uploadName: Ref<string | null> = ref(null);\n\tprivate _openTabMenuForChangeType: OpenTabMenuForChangeTypeCallback | undefined;\n\n\t// getters\n\n\tposition(): Vector2Like {\n\t\treturn this._position.value;\n\t}\n\tnodeId(): CoreGraphNodeId | null {\n\t\treturn this._nodeId.value;\n\t}\n\tparamId(): CoreGraphNodeId | null {\n\t\treturn this._paramId.value;\n\t}\n\tuploadName(): string | null {\n\t\treturn this._uploadName.value;\n\t}\n\topenTabMenuForChangeType() {\n\t\treturn this._openTabMenuForChangeType;\n\t}\n\n\t// mutations\n\tsetPosition(position: Vector2Like): void {\n\t\tthis._position.value.x = position.x;\n\t\tthis._position.value.y = position.y;\n\t}\n\tsetNodeId(nodeId: CoreGraphNodeId | null, openTabMenuForChangeType?: OpenTabMenuForChangeTypeCallback): void {\n\t\tthis._openTabMenuForChangeType = openTabMenuForChangeType;\n\t\tthis._nodeId.value = nodeId;\n\t}\n\tsetParamId(paramId: CoreGraphNodeId | null): void {\n\t\tthis._paramId.value = paramId;\n\t}\n\tsetUploadName(uploadName: string | null): void {\n\t\tthis._uploadName.value = uploadName;\n\t}\n}\n\nexport const EditorContextMenuStoreController = EditorContextMenuStoreControllerClass.instance();\n","import {ref} from 'vue';\nimport {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\ntype OnCloseCallback = () => void;\n\ninterface EditorDialogAboutShowOptions {\n\tversionPolygonjs: string;\n\tversionEditor: string;\n}\n\nexport class EditorDialogWAboutStoreControllerClass {\n\tprivate static _instance: EditorDialogWAboutStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogWAboutStoreControllerClass());\n\t}\n\n\t// private _displayed = ref(false);\n\tprivate _versionPolygonjs = ref('');\n\tprivate _versionEditor = ref('');\n\tprivate _onCloseCallback: OnCloseCallback | undefined;\n\tprivate constructor() {}\n\n\t// private _reset() {\n\t// \tthis._displayed.value = false;\n\t// }\n\n\t// displayed(): boolean {\n\t// \treturn this._displayed.value;\n\t// }\n\tversionPolygonjs(): string {\n\t\treturn this._versionPolygonjs.value;\n\t}\n\tversionEditor(): string {\n\t\treturn this._versionEditor.value;\n\t}\n\n\t// mutations\n\tasync show(options: EditorDialogAboutShowOptions): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// this._displayed.value = true;\n\t\t\trouter.push({name: EditorRoute.ABOUT});\n\t\t\tthis._versionPolygonjs.value = options.versionPolygonjs;\n\t\t\tthis._versionEditor.value = options.versionEditor;\n\t\t\tthis._onCloseCallback = resolve;\n\t\t});\n\t}\n\thide() {\n\t\tcloseModals();\n\t\t// router.push(Route.EDITOR);\n\t\t// this._reset();\n\t\tif (this._onCloseCallback) {\n\t\t\tthis._onCloseCallback();\n\t\t}\n\t}\n}\n\nexport const EditorDialogAboutStoreController = EditorDialogWAboutStoreControllerClass.instance();\n","import {ref} from 'vue';\ntype OnCloseCallback = () => void;\n\ninterface EditorDialogWarningsShowOptions {\n\ttitle: string;\n\twarnings: string[];\n}\n\nconst DEFAULT = {\n\ttitle: 'no title',\n\twarnings: [] as string[],\n};\nexport class EditorDialogWarningsStoreControllerClass {\n\tprivate static _instance: EditorDialogWarningsStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogWarningsStoreControllerClass());\n\t}\n\n\tprivate _displayed = ref(false);\n\tprivate _title = ref(DEFAULT.title);\n\tprivate _warnings = ref(DEFAULT.warnings);\n\t// private _resizable = ref(DEFAULT.resizable);\n\t// private _width = ref(DEFAULT.width);\n\t// private _height = ref(DEFAULT.height);\n\tprivate _on_close_callback: OnCloseCallback | undefined;\n\tprivate constructor() {}\n\n\tprivate _reset() {\n\t\tthis._displayed.value = false;\n\t\tthis._title.value = DEFAULT.title;\n\t\tthis._warnings.value.splice(0, this._warnings.value.length);\n\t\t// this._resizable.value = DEFAULT.resizable;\n\t\t// this._width.value = DEFAULT.width;\n\t\t// this._height.value = DEFAULT.height;\n\t}\n\n\tdisplayed(): boolean {\n\t\treturn this._displayed.value;\n\t}\n\ttitle(): string {\n\t\treturn this._title.value;\n\t}\n\twarnings(): string[] {\n\t\treturn this._warnings.value;\n\t}\n\t// resizable(): boolean {\n\t// \treturn this._resizable.value;\n\t// }\n\t// width() {\n\t// \treturn this._width.value;\n\t// }\n\t// height() {\n\t// \treturn this._height.value;\n\t// }\n\n\t// mutations\n\tasync show(options: EditorDialogWarningsShowOptions): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._displayed.value = true;\n\t\t\tthis._title.value = options.title;\n\t\t\tfor (const warning of options.warnings) {\n\t\t\t\tthis._warnings.value.push(warning);\n\t\t\t}\n\t\t\t// this._resizable.value = options.resizable || false;\n\t\t\t// this._width.value = options.width || DEFAULT.width;\n\t\t\t// this._height.value = options.height || DEFAULT.height;\n\t\t\tthis._on_close_callback = resolve;\n\t\t});\n\t}\n\thide() {\n\t\tthis._reset();\n\t\tif (this._on_close_callback) {\n\t\t\tthis._on_close_callback();\n\t\t}\n\t}\n}\n\nexport const EditorDialogWarningsStoreController = EditorDialogWarningsStoreControllerClass.instance();\n","// import {EditorDialogConfirmShowOptions, EditorDialogConfirmOnAcceptCallback} from '../../modules/editor/DialogConfirm';\nimport {Ref, ref} from 'vue';\n\ntype EditorDialogConfirmOnAcceptCallback = (response: boolean) => void;\n// export interface EditorDialogConfirmState {\n// \tdisplay: boolean;\n// \tquestion: string;\n// \taccept_label: string;\n// \tresolve: EditorDialogConfirmOnAcceptCallback | undefined;\n// }\ninterface EditorDialogConfirmShowOptions {\n\ttitle: string;\n\tmessage: string;\n\tacceptLabel: string;\n}\n\nconst debugOptions: EditorDialogConfirmShowOptions = {\n\ttitle: 'this is a title',\n\tmessage: 'this is a message',\n\tacceptLabel: 'will you accept?',\n};\n\nconst prodDefault: EditorDialogConfirmShowOptions = {\n\ttitle: '',\n\tmessage: '',\n\tacceptLabel: '',\n};\nconst debug = false;\nconst DEFAULT = debug ? debugOptions : prodDefault;\nexport class EditorDialogConfirmStoreControllerClass {\n\tprivate static _instance: EditorDialogConfirmStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogConfirmStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _displayed: Ref<boolean> = ref(debug);\n\tprivate _title: Ref<string> = ref(DEFAULT.title);\n\tprivate _message: Ref<string> = ref(DEFAULT.message);\n\tprivate _acceptLabel: Ref<string> = ref(DEFAULT.acceptLabel);\n\tprivate _resolve: EditorDialogConfirmOnAcceptCallback | undefined;\n\tdisplayed(): boolean {\n\t\treturn this._displayed.value;\n\t}\n\ttitle(): string {\n\t\treturn this._title.value;\n\t}\n\tmessage(): string {\n\t\treturn this._message.value;\n\t}\n\tacceptLabel(): string {\n\t\treturn this._acceptLabel.value;\n\t}\n\tresolve(): EditorDialogConfirmOnAcceptCallback | undefined {\n\t\treturn this._resolve;\n\t}\n\n\t// mutations\n\tasync show(options: EditorDialogConfirmShowOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._displayed.value = true;\n\t\t\tthis._title.value = options.title;\n\t\t\tthis._message.value = options.message;\n\t\t\tthis._acceptLabel.value = options.acceptLabel;\n\t\t\tthis._resolve = resolve;\n\t\t});\n\t}\n\tclose() {\n\t\tthis._displayed.value = false;\n\t\tthis._resolve = undefined;\n\t}\n}\n\nexport const EditorDialogConfirmStoreController = EditorDialogConfirmStoreControllerClass.instance();\n","import {ref} from 'vue';\n\nexport type EditorDialogPromptSaveCallback = (newVal: string | null) => void;\nexport interface EditorDialogPromptShowOptions {\n\ttitle: string;\n\tdefaultValue: string;\n\tconfirmLabel: string;\n\tmultiline?: boolean;\n}\n\nexport class EditorDialogPromptStoreControllerClass {\n\tprivate static _instance: EditorDialogPromptStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogPromptStoreControllerClass());\n\t}\n\n\tprivate _displayed = ref(false);\n\tprivate _title = ref('Prompt');\n\tprivate _multiline = ref(false);\n\tprivate _defaultValue = ref('');\n\tprivate _confirmLabel = ref('ok');\n\tprivate _on_save_callback: EditorDialogPromptSaveCallback | undefined;\n\tprivate constructor() {}\n\n\t// getters\n\tdisplayed(): boolean {\n\t\treturn this._displayed.value;\n\t}\n\ttitle(): string {\n\t\treturn this._title.value;\n\t}\n\tmultiline(): boolean {\n\t\treturn this._multiline.value;\n\t}\n\tdefaultValue(): string {\n\t\treturn this._defaultValue.value;\n\t}\n\tconfirmLabel(): string {\n\t\treturn this._confirmLabel.value;\n\t}\n\texecuteOnSaveCallback(value: string | null) {\n\t\tif (value) {\n\t\t\tthis._defaultValue.value = value;\n\t\t}\n\t\tif (this._on_save_callback) {\n\t\t\tconst callback = this._on_save_callback;\n\t\t\tthis._on_save_callback = undefined;\n\t\t\tcallback(value);\n\t\t}\n\t}\n\n\t// mutations\n\tasync show(options: EditorDialogPromptShowOptions): Promise<string | null> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._displayed.value = true;\n\t\t\tthis._title.value = options.title;\n\t\t\tthis._multiline.value = options.multiline || false;\n\t\t\tthis._confirmLabel.value = options.confirmLabel;\n\t\t\tthis._defaultValue.value = options.defaultValue;\n\t\t\tthis._on_save_callback = resolve;\n\t\t});\n\t}\n\thide() {\n\t\tthis._displayed.value = false;\n\t\tthis.executeOnSaveCallback(null);\n\t}\n}\n\nexport const EditorDialogPromptStoreController = EditorDialogPromptStoreControllerClass.instance();\n","import {ref} from 'vue';\n\nexport type EditorDialogNoticeSaveCallback = (new_val: string) => void;\nexport interface EditorDialogNoticeShowOptions {\n\ttitle: string;\n\tmessage: string;\n}\n\nexport class EditorDialogNoticeStoreControllerClass {\n\tprivate static _instance: EditorDialogNoticeStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogNoticeStoreControllerClass());\n\t}\n\n\tprivate _displayed = ref(false);\n\tprivate _message = ref('test message');\n\tprivate _title = ref('test title');\n\tprivate _on_ok_callback: EditorDialogNoticeSaveCallback | undefined;\n\tprivate constructor() {}\n\n\t// getters\n\tdisplayed(): boolean {\n\t\treturn this._displayed.value;\n\t}\n\ttitle(): string {\n\t\treturn this._title.value;\n\t}\n\tmessage(): string {\n\t\treturn this._message.value;\n\t}\n\texecute_on_ok_callback(value: string) {\n\t\tif (this._on_ok_callback) {\n\t\t\tconst callback = this._on_ok_callback;\n\t\t\tthis._on_ok_callback = undefined;\n\t\t\tcallback(value);\n\t\t}\n\t}\n\n\t// mutations\n\tasync show(options: EditorDialogNoticeShowOptions): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._displayed.value = true;\n\t\t\tthis._title.value = options.title;\n\t\t\tthis._message.value = options.message;\n\t\t});\n\t}\n\thide() {\n\t\tthis._displayed.value = false;\n\t}\n}\n\nexport const EditorDialogNoticeStoreController = EditorDialogNoticeStoreControllerClass.instance();\n","import {ref, Ref} from 'vue';\nimport {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n\ntype Callback = () => void;\nexport class EditorDialogApiLoginStoreControllerClass {\n\tprivate static _instance: EditorDialogApiLoginStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogApiLoginStoreControllerClass());\n\t}\n\n\t// private _displayed = ref(false);\n\tprivate _errorMessage: Ref<string | null> = ref(null);\n\tprivate _callback: Callback | undefined;\n\tprivate constructor() {}\n\n\t// displayed(): boolean {\n\t// \treturn this._displayed.value;\n\t// }\n\terrorMessage(): string | null {\n\t\treturn this._errorMessage.value;\n\t}\n\n\t//\n\t// methods\n\t//\n\tasync show() {\n\t\treturn new Promise((resolve) => {\n\t\t\trouter.push({name: EditorRoute.LOGIN});\n\t\t\t// this._displayed.value = true;\n\t\t\tthis._callback = () => {\n\t\t\t\tresolve(undefined);\n\t\t\t};\n\t\t});\n\t}\n\thide() {\n\t\t// this._displayed.value = false;\n\t\tcloseModals();\n\t}\n\texecuteCallback() {\n\t\tif (!this._callback) {\n\t\t\treturn;\n\t\t}\n\t\tconst callback = this._callback;\n\t\tthis._callback = undefined;\n\t\tcallback();\n\t}\n\tsetErrorMessage(message: string | null) {\n\t\tthis._errorMessage.value = message;\n\t}\n}\n\nexport const EditorDialogApiLoginStoreController = EditorDialogApiLoginStoreControllerClass.instance();\n","import {ref} from 'vue';\nimport {WebGLRenderer} from 'three';\n\nexport class EditorDialogWebGLCapabilitiesStoreControllerClass {\n\tprivate static _instance: EditorDialogWebGLCapabilitiesStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDialogWebGLCapabilitiesStoreControllerClass());\n\t}\n\n\tprivate _renderer: WebGLRenderer | undefined;\n\tprivate _displayed = ref(false);\n\tprivate constructor() {}\n\n\t// getters\n\tdisplayed(): boolean {\n\t\treturn this._displayed.value;\n\t}\n\trenderer() {\n\t\treturn this._renderer;\n\t}\n\n\t// mutations\n\tasync show(renderer: WebGLRenderer): Promise<string> {\n\t\tthis._renderer = renderer;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._displayed.value = true;\n\t\t});\n\t}\n\thide() {\n\t\tthis._displayed.value = false;\n\t\tthis._renderer = undefined;\n\t}\n}\n\nexport const EditorDialogWebGLCapabilitiesStoreController =\n\tEditorDialogWebGLCapabilitiesStoreControllerClass.instance();\n","import {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n\ninterface MarketplacePolyNodesControllerClassOptions {}\n\nexport class MarketplacePolyNodesControllerClass {\n\tprivate static _instance: MarketplacePolyNodesControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new MarketplacePolyNodesControllerClass());\n\t}\n\n\t// private _displayed: Ref<boolean> = ref(false);\n\tprivate constructor() {}\n\n\t// displayed() {\n\t// \treturn this._displayed.value;\n\t// }\n\n\t//\n\t// methods\n\t//\n\tasync show(options: MarketplacePolyNodesControllerClassOptions = {}) {\n\t\t// this._displayed.value = true;\n\t\trouter.push({name: EditorRoute.MARKET});\n\t}\n\tclose() {\n\t\t// this._displayed.value = false;\n\t\tcloseModals();\n\t}\n}\n\nexport const MarketplacePolyNodesController = MarketplacePolyNodesControllerClass.instance();\n","import {ref, computed} from 'vue';\n\nexport class EditorCommandPaletteControllerClass {\n\tprivate static _instance: EditorCommandPaletteControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorCommandPaletteControllerClass());\n\t}\n\n\tprivate _goToNodedisplayed = ref(false);\n\n\tpublic goToNodeDisplayed = computed(() => this._goToNodedisplayed.value);\n\n\tdisplayToGoNode() {\n\t\tthis._goToNodedisplayed.value = true;\n\t}\n\thide() {\n\t\tthis._goToNodedisplayed.value = false;\n\t}\n}\n\nexport const EditorCommandPaletteStoreController = EditorCommandPaletteControllerClass.instance();\n","import {ref, Ref} from 'vue';\nexport class EditorUserPlanStoreControllerClass {\n\tprivate static _instance: EditorUserPlanStoreControllerClass;\n\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorUserPlanStoreControllerClass());\n\t}\n\n\tprivate _loggedIn: Ref<boolean> = ref(false);\n\tprivate _pro: Ref<boolean> = ref(false);\n\tprivate _nodesCount: Ref<number> = ref(0);\n\tprivate _exportsDisabledNoticeDisplayed: Ref<boolean> = ref(false);\n\tprivate constructor() {}\n\n\tloggedIn(): boolean {\n\t\treturn this._loggedIn.value;\n\t}\n\tisPro(): boolean {\n\t\treturn this._pro.value;\n\t}\n\n\tnodesCount() {\n\t\treturn this._nodesCount.value;\n\t}\n\tmaxNodesCount() {\n\t\treturn 100;\n\t}\n\tnodesCountLimitReached() {\n\t\tif (this.isPro()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.nodesCount() >= this.maxNodesCount();\n\t}\n\n\t// methods\n\tsetPro(state: boolean) {\n\t\tthis._pro.value = state;\n\t}\n\tsetLoggedIn(state: boolean) {\n\t\tthis._loggedIn.value = state;\n\t}\n\n\tincrementNodesCount() {\n\t\tthis._nodesCount.value += 1;\n\t}\n\tdecrementNodesCount() {\n\t\tthis._nodesCount.value -= 1;\n\t}\n\tdisplayExportsDisabledNotice() {\n\t\tthis._exportsDisabledNoticeDisplayed.value = true;\n\t}\n\thideExportsDisabledNotice() {\n\t\tthis._exportsDisabledNoticeDisplayed.value = false;\n\t}\n\texportsDisabledNoticeDisplayed() {\n\t\treturn this._exportsDisabledNoticeDisplayed.value;\n\t}\n}\n\nexport const EditorUserPlanStoreController = EditorUserPlanStoreControllerClass.instance();\n","import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Ref, ref} from 'vue';\n\nexport class EditorNetworkStoreControllerClass {\n\tprivate static _instance: EditorNetworkStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorNetworkStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _node_ids_being_moved: Ref<Dictionary<boolean>> = ref({});\n\n\t// getters\n\tnode_ids_being_moved(): Readonly<Dictionary<boolean>> {\n\t\treturn this._node_ids_being_moved.value;\n\t}\n\n\t// mutations\n\tset_node_ids_being_moved(ids: CoreGraphNodeId[]) {\n\t\tfor (let id of ids) {\n\t\t\tthis._node_ids_being_moved.value[id] = true;\n\t\t}\n\t}\n\treset_node_ids_being_moved() {\n\t\tconst ids = Object.keys(this._node_ids_being_moved.value);\n\t\tfor (let id of ids) {\n\t\t\tdelete this._node_ids_being_moved.value[id];\n\t\t}\n\t}\n}\n\nexport const EditorNetworkStoreController = EditorNetworkStoreControllerClass.instance();\n","import {EditorNumericSliderShowOptions} from '../../modules/editor/NumericSlider';\nimport {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Vector2Like} from '../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {Ref, ref} from 'vue';\n\nexport class EditorNumericSliderStoreControllerClass {\n\tprivate static _instance: EditorNumericSliderStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorNumericSliderStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _param_id: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate _position: Ref<Vector2Like> = ref({x: 0, y: 0});\n\n\t// getters\n\n\tparam_id(): CoreGraphNodeId | null {\n\t\treturn this._param_id.value;\n\t}\n\tposition(): Vector2Like {\n\t\treturn this._position.value;\n\t}\n\tdisplayed() {\n\t\treturn this._param_id.value != null;\n\t}\n\n\t// mutations\n\topen(options: EditorNumericSliderShowOptions): void {\n\t\tthis._param_id.value = options.param_id;\n\t\tthis._position.value.x = options.position.x;\n\t\tthis._position.value.y = options.position.y;\n\t}\n\tclose() {\n\t\tthis._param_id.value = null;\n\t}\n}\n\nexport const EditorNumericSliderStoreController = EditorNumericSliderStoreControllerClass.instance();\n","import {Ref, ref} from 'vue';\n\nexport class EditorPanelStoreControllerClass {\n\tprivate static _instance: EditorPanelStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPanelStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _fullscreenPanelId: Ref<string | null> = ref(null);\n\n\t// getters\n\n\tfullscreenPanelId(): string | null {\n\t\treturn this._fullscreenPanelId.value;\n\t}\n\n\t// mutations\n\tsetFullscreenPanelId(panelId: string | null): void {\n\t\tthis._fullscreenPanelId.value = panelId;\n\t\tsetTimeout(() => {\n\t\t\twindow.dispatchEvent(new Event('resize'));\n\t\t}, 0);\n\t}\n}\n\nexport const EditorPanelStoreController = EditorPanelStoreControllerClass.instance();\n","import {router, closeModals, nodePathToUrl, paramFromUrl} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n// import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n// import {ref, Ref} from 'vue';\nimport {NodePathParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/NodePath';\nimport {ParamPathParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/ParamPath';\n\ninterface EditorPanelNodeSelectorOptions {\n\tparam: NodePathParam | ParamPathParam;\n}\nexport class EditorPanelNodeSelectorStoreControllerClass {\n\tprivate static _instance: EditorPanelNodeSelectorStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPanelNodeSelectorStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _paramId: Ref<CoreGraphNodeId | null> = ref(null);\n\n\t// getters\n\t// paramId(): CoreGraphNodeId | null {\n\t// return this._paramId.value;\n\t// }\n\n\t// mutations\n\topen(options: EditorPanelNodeSelectorOptions): void {\n\t\t// this._paramId.value = options.paramId;\n\t\trouter.push({name: EditorRoute.SELECT_NODE, params: {urlParamPath: nodePathToUrl(options.param.path())}});\n\t}\n\tparamFromUrl = paramFromUrl;\n\tclose() {\n\t\t// this._paramId.value = null;\n\t\tcloseModals();\n\t}\n}\n\nexport const EditorPanelNodeSelectorStoreController = EditorPanelNodeSelectorStoreControllerClass.instance();\n","import {router, closeModals, nodePathToUrl, paramFromUrl} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n// import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {ref, Ref} from 'vue';\nimport {StringParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {PolyDictionary} from './../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\ninterface EditorPanelFileSelectorOptions {\n\tparam: StringParam;\n}\nexport class EditorPanelFileSelectorStoreControllerClass {\n\tprivate static _instance: EditorPanelFileSelectorStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPanelFileSelectorStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _paramId: Ref<CoreGraphNodeId | null> = ref(null);\n\tpublic readonly folderPathByParamId: Ref<PolyDictionary<string[]>> = ref({});\n\t// private _filter: Ref<string> = ref('');\n\n\t// getters\n\t// paramId(): CoreGraphNodeId | null {\n\t// \t// console.log(this._paramId.value);\n\t// \t// return 451;\n\t// \treturn this._paramId.value;\n\t// }\n\t// folderPathByParamId() {\n\t// \treturn this._folderPathByParamId;\n\t// }\n\t// filter(): string {\n\t// \treturn this._filter.value;\n\t// }\n\n\t// mutations\n\topen(options: EditorPanelFileSelectorOptions): void {\n\t\t// this._paramId.value = options.param.graphNodeId();\n\t\trouter.push({name: EditorRoute.SELECT_FILE, params: {urlParamPath: nodePathToUrl(options.param.path())}});\n\t}\n\tparamFromUrl = paramFromUrl;\n\tclose() {\n\t\t// this._paramId.value = null;\n\t\tcloseModals();\n\t}\n\t// setFilter(filter: string) {\n\t// \tthis._filter.value = filter;\n\t// }\n}\n\nexport const EditorPanelFileSelectorStoreController = EditorPanelFileSelectorStoreControllerClass.instance();\n","import {router, closeModals, nodePathToUrl, paramFromUrl} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n// import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {StringParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {CoreGroup} from '../../../../../@polygonjs/polygonjs/src/core/geometry/Group';\nimport {NodeContext} from '../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {BaseSopNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport {BaseParamType} from '../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {ref, Ref} from 'vue';\ninterface EditorPanelObjectMaskOptions {\n\tparam: StringParam;\n}\nexport class EditorPanelObjectMaskStoreControllerClass {\n\tprivate static _instance: EditorPanelObjectMaskStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPanelObjectMaskStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _paramId: Ref<CoreGraphNodeId | null> = ref(null); // 184\n\tprivate _loading: Ref<boolean> = ref(false);\n\tprivate _errorMessage: Ref<string | null> = ref(null);\n\tprivate _useCoreGroup: Ref<boolean> = ref(false);\n\tprivate _coreGroup: CoreGroup | undefined;\n\n\t// getters\n\t// paramId(): CoreGraphNodeId | null {\n\t// \treturn this._paramId.value;\n\t// }\n\tloading() {\n\t\treturn this._loading.value;\n\t}\n\terrorMessage() {\n\t\treturn this._errorMessage.value;\n\t}\n\tuseCoreGroup() {\n\t\treturn this._useCoreGroup;\n\t}\n\tcoreGroup() {\n\t\treturn this._coreGroup;\n\t}\n\n\t// mutations\n\tasync open(options: EditorPanelObjectMaskOptions): Promise<void> {\n\t\t// this._paramId.value = options.param.graphNodeId();\n\t\trouter.push({\n\t\t\tname: EditorRoute.SELECT_OBJECT_MASK,\n\t\t\tparams: {urlParamPath: nodePathToUrl(options.param.path())},\n\t\t});\n\t\tawait this.loadNode(options.param);\n\t}\n\tparamFromUrl = paramFromUrl;\n\tasync loadNode(param: BaseParamType) {\n\t\tconst node = param.node;\n\t\tthis._loading.value = true;\n\t\tthis._reset();\n\t\tif (node.context() == NodeContext.SOP && param.options.objectMaskFromInputOnly()) {\n\t\t\tconst sopNode = node as BaseSopNodeType;\n\t\t\t// we actually do not want the output of the current node,\n\t\t\t// but the one of its first input\n\t\t\tconst inputIndex = param.options.objectMaskInputIndex();\n\t\t\tconst input = sopNode.io.inputs.input(inputIndex);\n\t\t\tif (input) {\n\t\t\t\tconst container = await input.compute();\n\t\t\t\tconst coreGroup = container.coreContent();\n\t\t\t\tif (!coreGroup) {\n\t\t\t\t\tconst errorMessage = sopNode.states.error.message();\n\t\t\t\t\tthis._errorMessage.value = errorMessage || 'invalid node';\n\t\t\t\t} else {\n\t\t\t\t\tthis._coreGroup = coreGroup;\n\t\t\t\t\tthis._useCoreGroup.value = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// this._errorMessage.value = 'test error';\n\t\tthis._loading.value = false;\n\t}\n\tprivate _reset() {\n\t\tthis._errorMessage.value = null;\n\t\tthis._coreGroup = undefined;\n\t\tthis._useCoreGroup.value = false;\n\t}\n\tclose() {\n\t\t// this._paramId.value = null;\n\t\tcloseModals();\n\t\tthis._loading.value = false;\n\t\tthis._reset();\n\t}\n}\n\nexport const EditorPanelObjectMaskStoreController = EditorPanelObjectMaskStoreControllerClass.instance();\n","import {router, closeModals, nodePathToUrl, nodeUrlToPath} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n// import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n// import {ref, Ref} from 'vue';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\ninterface EditorPanelSpareParamsEditorOptions {\n\tnode: BaseNodeType;\n}\n\nexport class EditorPanelSpareParamsEditorStoreControllerClass {\n\tprivate static _instance: EditorPanelSpareParamsEditorStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPanelSpareParamsEditorStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _nodeId: Ref<CoreGraphNodeId | null> = ref(null);\n\n\t// getters\n\t// nodeId(): CoreGraphNodeId | null {\n\t// \t// console.log(this._nodeId.value);\n\t// \treturn this._nodeId.value;\n\t// }\n\n\t// mutations\n\topen(options: EditorPanelSpareParamsEditorOptions): void {\n\t\t// this._nodeId.value = options.node.graphNodeId();\n\t\trouter.push({name: EditorRoute.SPARE_PARAMS_EDIT, params: {urlNodePath: nodePathToUrl(options.node.path())}});\n\t}\n\tnodeUrlToPath = nodeUrlToPath;\n\tclose() {\n\t\t// this._nodeId.value = null;\n\t\tcloseModals();\n\t}\n}\n\nexport const EditorPanelSpareParamsEditorStoreController = EditorPanelSpareParamsEditorStoreControllerClass.instance();\n","// import {ref} from 'vue';\nimport {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\nexport class EditorWindowsLibrariesManagerControllerClass {\n\tprivate static _instance: EditorWindowsLibrariesManagerControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorWindowsLibrariesManagerControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _displayed = ref(false);\n\n\t// displayed(): boolean {\n\t// \treturn this._displayed.value;\n\t// }\n\n\t// mutations\n\topen(): void {\n\t\trouter.push({name: EditorRoute.LIBRARIES});\n\t\t// this._displayed.value = true;\n\t}\n\tclose() {\n\t\tcloseModals();\n\t\t// this._displayed.value = false;\n\t}\n}\n\nexport const EditorWindowsLibrariesManagerController = EditorWindowsLibrariesManagerControllerClass.instance();\n","import {Ref, ref} from 'vue';\n\nexport class EditorUploadsStoreControllerClass {\n\tprivate static _instance: EditorUploadsStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorUploadsStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _reloadRequired: Ref<boolean> = ref(false);\n\n\t// getters\n\n\treload_required(): boolean {\n\t\treturn this._reloadRequired.value;\n\t}\n\n\t// mutations\n\tset_reload_required() {\n\t\tthis._reloadRequired.value = true;\n\t}\n\tunset_reload_required() {\n\t\tthis._reloadRequired.value = false;\n\t}\n}\n\nexport const EditorUploadsStoreController = EditorUploadsStoreControllerClass.instance();\n","import {ref, Ref, watch} from 'vue';\nimport {ErrorsNotifier} from '../../../core/error/ErrorsNotifier';\n\nexport class EditorCurrentUserControllerClass {\n\tprivate static _instance: EditorCurrentUserControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorCurrentUserControllerClass());\n\t}\n\n\tprivate _username: Ref<string | null> = ref(null);\n\tprivate _betaApproved: Ref<boolean> = ref(false);\n\tprivate constructor() {\n\t\twatch(this._username, () => {\n\t\t\tErrorsNotifier.updateMetadata();\n\t\t});\n\t}\n\n\tusername() {\n\t\treturn this._username;\n\t}\n\tisBetaApproved(): boolean {\n\t\treturn this._betaApproved.value;\n\t}\n\n\tsetUsername(username: string) {\n\t\tthis._username.value = username;\n\t}\n\tsetBetaApproved(state: boolean) {\n\t\tthis._betaApproved.value = state;\n\t}\n}\n\nexport const EditorCurrentUserController = EditorCurrentUserControllerClass.instance();\n","import {router, closeModals, nodePathToUrl, nodeUrlToPath} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n// import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n// import {ref, Ref} from 'vue';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\ninterface EditorPolyNodeCreateFormControllerClassOptions {\n\tnode: BaseNodeType;\n}\n\nexport class EditorPolyNodeCreateFormControllerClass {\n\tprivate static _instance: EditorPolyNodeCreateFormControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPolyNodeCreateFormControllerClass());\n\t}\n\n\t// private _nodeId: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate constructor() {}\n\n\t// nodeId() {\n\t// \t// console.log(this._nodeId.value);\n\t// \treturn this._nodeId.value;\n\t// }\n\n\t//\n\t// methods\n\t//\n\tasync show(options: EditorPolyNodeCreateFormControllerClassOptions) {\n\t\t// this._nodeId.value = options.node.graphNodeId();\n\t\trouter.push({name: EditorRoute.POLY_NODE_CREATE, params: {urlNodePath: nodePathToUrl(options.node.path())}});\n\t}\n\tnodeUrlToPath = nodeUrlToPath;\n\tclose() {\n\t\t// this._nodeId.value = null;\n\t\tcloseModals();\n\t}\n}\n\nexport const EditorPolyNodeCreateFormController = EditorPolyNodeCreateFormControllerClass.instance();\n","import {router, closeModals, nodePathToUrl, nodeUrlToPath} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n// import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n// import {ref, Ref} from 'vue';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\ninterface EditorPolyNodeUpdateFormControllerClassOptions {\n\tnode: BaseNodeType;\n}\n\nexport class EditorPolyNodeUpdateFormControllerClass {\n\tprivate static _instance: EditorPolyNodeUpdateFormControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPolyNodeUpdateFormControllerClass());\n\t}\n\n\t// private _nodeId: Ref<CoreGraphNodeId | null> = ref(null /*223*/);\n\tprivate constructor() {}\n\n\t// nodeId() {\n\t// \t// console.log(this._nodeId.value);\n\t// \treturn this._nodeId.value;\n\t// }\n\n\t//\n\t// methods\n\t//\n\tasync show(options: EditorPolyNodeUpdateFormControllerClassOptions) {\n\t\t// this._nodeId.value = options.node.graphNodeId();\n\t\trouter.push({name: EditorRoute.POLY_NODE_UPDATE, params: {urlNodePath: nodePathToUrl(options.node.path())}});\n\t}\n\tnodeUrlToPath = nodeUrlToPath;\n\tclose() {\n\t\t// this._nodeId.value = null;\n\t\tcloseModals();\n\t}\n}\n\nexport const EditorPolyNodeUpdateFormController = EditorPolyNodeUpdateFormControllerClass.instance();\n","import {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\nexport class ShareControllerClass {\n\tprivate static _instance: ShareControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new ShareControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _displayed: Ref<boolean> = ref(false);\n\n\t// getters\n\t// displayed() {\n\t// \treturn this._displayed.value;\n\t// }\n\n\topen(): void {\n\t\t// this._displayed.value = true;\n\t\trouter.push({name: EditorRoute.SHARE});\n\t}\n\tclose() {\n\t\t// this._displayed.value = false;\n\t\tcloseModals();\n\t}\n}\n\nexport const ShareController = ShareControllerClass.instance();\n","import {LinkIndex} from './../../../components/panels/common/LinkIndex';\nimport {ref, Ref} from 'vue';\n\ninterface TabMenuOpenOptions {\n\tlinkIndex: LinkIndex;\n\tpanelId: string | null;\n\tuseCombobox: boolean;\n}\ntype TabMenuResolve = (nodeType: string) => void;\n\nexport class TabMenuControllerClass {\n\tprivate static _instance: TabMenuControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new TabMenuControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _displayed: Ref<boolean> = ref(false);\n\tprivate _useCombobox: Ref<boolean> = ref(false);\n\tpublic pointerPosition = ref({x: 0, y: 0});\n\tprivate _linkIndex: Ref<LinkIndex> = ref(1);\n\tprivate _panelId: Ref<string | null> = ref(null);\n\tprivate _resolve: TabMenuResolve | undefined;\n\n\t// getters\n\tdisplayed() {\n\t\treturn this._displayed.value;\n\t}\n\tuseCombobox() {\n\t\treturn this._useCombobox.value;\n\t}\n\tlinkIndex() {\n\t\treturn this._linkIndex;\n\t}\n\tpanelId() {\n\t\treturn this._panelId;\n\t}\n\n\topen(options: TabMenuOpenOptions): Promise<string> {\n\t\tthis._linkIndex.value = options.linkIndex;\n\t\tthis._panelId.value = options.panelId;\n\t\tthis._displayed.value = true;\n\t\tthis._useCombobox.value = options.useCombobox;\n\t\treturn new Promise((resolve) => {\n\t\t\tthis._resolve = resolve;\n\t\t});\n\t}\n\tcreateNode(nodeType: string) {\n\t\tif (this._resolve) {\n\t\t\tthis._resolve(nodeType);\n\t\t}\n\t\tthis.close();\n\t}\n\tclose() {\n\t\tthis._resolve = undefined;\n\t\tthis._displayed.value = false;\n\t}\n}\n\nexport const TabMenuController = TabMenuControllerClass.instance();\n","import {ref, Ref} from 'vue';\nexport class SceneReadonlyController {\n\tprivate _readonly: Ref<boolean> = ref(false);\n\tprivate _loginRequired: Ref<boolean> = ref(false);\n\tprivate _loadedWithoutAssemblers: Ref<boolean> = ref(false);\n\tprivate _assetDroppedOnParam: Ref<boolean> = ref(false);\n\n\treadonly() {\n\t\treturn this._readonly.value;\n\t}\n\tloginRequired() {\n\t\treturn this._loginRequired.value;\n\t}\n\tloadedWithoutAssemblers() {\n\t\treturn this._loadedWithoutAssemblers.value;\n\t}\n\tassetDroppedOnParam() {\n\t\treturn this._assetDroppedOnParam.value;\n\t}\n\treason() {\n\t\tif (this._loginRequired.value) {\n\t\t\treturn 'it was created by someone else';\n\t\t}\n\t\tif (this._loadedWithoutAssemblers.value) {\n\t\t\treturn 'it was loaded without assemblers';\n\t\t}\n\t\tif (this._assetDroppedOnParam.value) {\n\t\t\treturn 'an asset was drag & dropped on a parameter';\n\t\t}\n\t}\n\n\tmarkAsReadonly() {\n\t\tthis._readonly.value = true;\n\t}\n\tsetLoginRequired() {\n\t\tthis.markAsReadonly();\n\t\tthis._loginRequired.value = true;\n\t}\n\tmarkAsLoadedWithoutAssemblers() {\n\t\tthis.markAsReadonly();\n\t\tthis._loadedWithoutAssemblers.value = true;\n\t}\n\tmarkAsAssetDroppedOnParam() {\n\t\tthis.markAsReadonly();\n\t\tthis._assetDroppedOnParam.value = true;\n\t}\n}\n","import {ref} from 'vue';\n\nexport class DocsControllerClass {\n\tprivate static _instance: DocsControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new DocsControllerClass());\n\t}\n\n\tpublic readonly searchDisplayed = ref(false);\n\tpublic readonly searchQuery = ref('');\n\tpublic readonly mobileNavigationDisplayed = ref(false);\n\tprivate constructor() {}\n}\n\nexport const DocsController = DocsControllerClass.instance();\n","import {DebugLinesContainer} from '../../../../../@polygonjs/polygonjs/src/engine/scene/utils/DispatchController';\nimport {ref, Ref} from 'vue';\nimport {DebugLine} from '../../../../../@polygonjs/polygonjs/src/engine/functions/_Debug';\n// import {StoreController} from '../StoreController';\n\nexport class EditorDebugJsNodeControllerClass {\n\tprivate static _instance: EditorDebugJsNodeControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorDebugJsNodeControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tpublic lastProcessedFrame = -1;\n\tpublic debugContentByFrameByNodePath: Ref<Record<string, DebugLine[]>> = ref({});\n\tpublic arrayByNodePath: Map<string, Array<DebugLine>> = new Map();\n\tcontent() {\n\t\treturn this.debugContentByFrameByNodePath.value;\n\t}\n\n\tactorEvaluatorDebug(options: DebugLinesContainer) {\n\t\t// optionsToDebugLines(StoreController.scene, options, this);\n\t\tthis.debugContentByFrameByNodePath.value[options.nodePath] = [...options.debugLines];\n\t}\n}\n\nexport const DebugJsNode = EditorDebugJsNodeControllerClass.instance();\n","import {ref, Ref} from 'vue';\nexport class EditorNodeInfoStoreControllerClass {\n\tprivate static _instance: EditorNodeInfoStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorNodeInfoStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _shaderExpanded: Ref<boolean> = ref(false);\n\t// init() {\n\t// \tthis._shaderExpanded\n\t// }\n\tshaderExpanded() {\n\t\treturn this._shaderExpanded;\n\t}\n}\n\nexport const EditorNodeInfoStoreController = EditorNodeInfoStoreControllerClass.instance();\n","import {ref, Ref} from 'vue';\nexport class EditorSplitPanelsControllerClass {\n\tprivate static _instance: EditorSplitPanelsControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorSplitPanelsControllerClass());\n\t}\n\n\tprivate constructor() {\n\t\twindow.addEventListener('resize', this._boundOnResize);\n\t}\n\n\tprivate _dragInProgress: Ref<boolean> = ref(false);\n\tprivate _windowResizeInProgress: Ref<boolean> = ref(false);\n\tprivate _timeout: number | undefined;\n\n\tprivate _allowOnResize = true;\n\ttriggerWindowResizeWithoutEvent() {\n\t\twindow.removeEventListener('resize', this._boundOnResize);\n\t\twindow.dispatchEvent(new Event('resize'));\n\n\t\tsetTimeout(() => {\n\t\t\twindow.addEventListener('resize', this._boundOnResize);\n\t\t}, 50);\n\t}\n\n\tprivate _boundOnResize = this.onResize.bind(this);\n\tonResize() {\n\t\tif (this._allowOnResize == false) {\n\t\t\treturn;\n\t\t}\n\t\tthis._windowResizeInProgress.value = true;\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\t\tthis._timeout = setTimeout(() => {\n\t\t\tthis._windowResizeInProgress.value = false;\n\t\t}, 1000) as any /* the build fails if we use the node type NodeJs.Timeout */;\n\t}\n\n\t// getters\n\tdragInprogress() {\n\t\treturn this._dragInProgress.value;\n\t}\n\twindowResizeInProgress() {\n\t\treturn this._windowResizeInProgress.value;\n\t}\n\n\t// mutations\n\tsetDragInProgress(state: boolean): void {\n\t\tthis._dragInProgress.value = state;\n\t}\n}\n\nexport const SplitPanels = EditorSplitPanelsControllerClass.instance();\n","import {CaptureType} from './../../../core/CaptureType';\nimport {Ref, ref, watch, computed} from 'vue';\nimport {Vector2} from 'three';\nimport {FeaturesController} from '../../../core/FeaturesController';\nimport {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {StoreController} from '../StoreController';\nimport {RopType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Rop';\nimport type {PathTracingRendererRopNode} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/rop/PathTracingRenderer';\nimport {Capture} from '../../../../npm_module/NpmModuleTypes';\nimport {CaptureOnFrameSaveOptions, CaptureOnFrameReadOptions} from '../../../types';\n\nexport enum CaptureRendererType {\n\tWEBGL = 'webgl',\n\tPATH_TRACING = 'pathTracing',\n}\ninterface DisplayOptions {\n\t// rendererType:CaptureRendererType\n\trendererNodeId: CoreGraphNodeId | null;\n}\n\ninterface CaptureFormData {\n\tcaptureType: CaptureType;\n\tvideoDuration: number;\n\tvideoMbsPerSecond: number;\n\tdelay: number;\n\t// videoFPS: number;\n}\n\ntype LocalStorageData = Partial<CaptureFormData>;\nconst LOCAL_STORAGE_KEY = 'EditorCaptureFormControllerClass';\n\ntype CaptureFormCallback = (args: CaptureFormData) => void;\n\nfunction _loadLocalStorage() {\n\tconst content = localStorage.getItem(LOCAL_STORAGE_KEY);\n\tif (!content) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst json = JSON.parse(content) as LocalStorageData;\n\t\treturn json;\n\t} catch (e) {\n\t\treturn;\n\t}\n}\nconst saved = _loadLocalStorage();\nexport class EditorCaptureFormControllerClass {\n\tprivate static _instance: EditorCaptureFormControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorCaptureFormControllerClass());\n\t}\n\n\tprivate _displayed = ref(false);\n\tprivate _rendererNodeId: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate _captureType = ref(saved?.captureType || CaptureType.IMAGE);\n\tprivate _videoDuration = ref(saved?.videoDuration == null ? 3 : saved?.videoDuration);\n\tprivate _videoMbsPerSecond = ref(\n\t\tsaved?.videoMbsPerSecond == null\n\t\t\t? FeaturesController.viewerCaptureVideoMbsPerSecond() || 20\n\t\t\t: saved?.videoMbsPerSecond\n\t);\n\tprivate _delay = ref(saved?.delay == null ? 0 : saved?.delay);\n\tprivate _formDisplayForced = ref(false);\n\tprivate _captureStarted = ref(false);\n\tprivate _interrupted = ref(false);\n\t// private _videoFPS!: Ref<number>; // not yet supported by the mediaRecorder\n\tprivate _resolve: CaptureFormCallback | undefined;\n\tprivate constructor() {\n\t\tconst saveToLocalStorage = this._saveToLocalStorage.bind(this);\n\t\twatch(this._captureType, saveToLocalStorage);\n\t\twatch(this._videoDuration, saveToLocalStorage);\n\t\twatch(this._videoMbsPerSecond, saveToLocalStorage);\n\t}\n\n\t// getters\n\tdisplayed() {\n\t\treturn this._displayed.value;\n\t}\n\tcaptureType() {\n\t\treturn this._captureType.value;\n\t}\n\tvideoDuration() {\n\t\treturn this._videoDuration.value;\n\t}\n\tvideoMbsPerSecond() {\n\t\treturn this._videoMbsPerSecond.value;\n\t}\n\tdelay() {\n\t\treturn this._delay.value;\n\t}\n\tformDisplayForced() {\n\t\treturn this._formDisplayForced.value;\n\t}\n\tcaptureStarted = computed(() => this._captureStarted.value);\n\tcaptureInProgress = computed(() => this._captureStarted.value);\n\tinterrupted() {\n\t\treturn this._interrupted.value;\n\t}\n\tviewerResolution = computed(() => {\n\t\tif (this.captureInProgress.value) {\n\t\t\tif (this.formDisplayForced()) {\n\t\t\t\treturn new Vector2(400, 400);\n\t\t\t}\n\t\t\tif (this.pathTracingData.value) {\n\t\t\t\treturn this.pathTracingData.value.resolution;\n\t\t\t}\n\t\t}\n\t});\n\tpublic rendererType = computed(() => {\n\t\tif (this._rendererNodeId.value == null) {\n\t\t\treturn CaptureRendererType.WEBGL;\n\t\t}\n\t\tconst jsonNode = StoreController.engine.json_node(this._rendererNodeId.value);\n\t\tif (!jsonNode) {\n\t\t\treturn CaptureRendererType.WEBGL;\n\t\t}\n\t\tif (jsonNode.type == RopType.PATH_TRACING) {\n\t\t\treturn CaptureRendererType.PATH_TRACING;\n\t\t}\n\t\treturn CaptureRendererType.WEBGL;\n\t});\n\tpublic isWebGL = computed(() => this.rendererType.value == CaptureRendererType.WEBGL);\n\tpublic isPathTracing = computed(() => this.rendererType.value == CaptureRendererType.PATH_TRACING);\n\tpublic pathTracingData = computed(() => {\n\t\tif (this.isPathTracing.value && this._rendererNodeId.value != null) {\n\t\t\tconst node = StoreController.engine.node(this._rendererNodeId.value) as PathTracingRendererRopNode | null;\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tf: node.pv.f,\n\t\t\t\tsamplesPerAnimationFrame: node.pv.samplesPerAnimationFrame,\n\t\t\t\tresolution: node.pv.resolution,\n\t\t\t\tnodePath: node.path(),\n\t\t\t\tnodeId: this._rendererNodeId.value,\n\t\t\t};\n\t\t}\n\t});\n\n\t// videoFPS() {\n\t// \treturn this._videoFPS.value;\n\t// }\n\n\t// mutations\n\tdisplay(options: DisplayOptions): Promise<CaptureFormData> {\n\t\tthis._rendererNodeId.value = options.rendererNodeId;\n\t\tthis._displayed.value = true;\n\t\tthis._interrupted.value = false;\n\t\treturn new Promise((resolve) => {\n\t\t\tthis._resolve = resolve;\n\t\t});\n\t}\n\tconfirm() {\n\t\tconst delay = this._delay.value;\n\t\tsetTimeout(() => {\n\t\t\tif (this._resolve && this._interrupted.value == false) {\n\t\t\t\tthis._resolve(this._data());\n\t\t\t}\n\t\t}, delay * 1000);\n\t\tthis._captureStarted.value = true;\n\t\tthis._close();\n\t}\n\tinterrupt() {\n\t\tconsole.log('interrupt');\n\t\tthis._interrupted.value = true;\n\t}\n\tcancel() {\n\t\tthis._close();\n\t\tthis.markAsCompleted();\n\t\tthis._resolve = undefined;\n\t}\n\tprivate _close() {\n\t\tthis._displayed.value = false;\n\t}\n\tmarkAsCompleted() {\n\t\tthis._captureStarted.value = false;\n\t}\n\tsetCaptureType(type: CaptureType): void {\n\t\tthis._captureType.value = type;\n\t}\n\tsetVideoDuration(duration: number): void {\n\t\tthis._videoDuration.value = duration;\n\t}\n\tsetVideoMbsPerSecond(mbs: number) {\n\t\tthis._videoMbsPerSecond.value = mbs;\n\t}\n\tsetDelay(delay: number) {\n\t\tthis._delay.value = delay;\n\t}\n\tforceFormDisplay() {\n\t\tthis._formDisplayForced.value = true;\n\t}\n\tprivate _data(): CaptureFormData {\n\t\treturn {\n\t\t\tcaptureType: this._captureType.value,\n\t\t\tvideoDuration: this._videoDuration.value,\n\t\t\tvideoMbsPerSecond: this._videoMbsPerSecond.value,\n\t\t\tdelay: this._delay.value,\n\t\t\t// videoFPS: this._videoFPS.value,\n\t\t};\n\t}\n\n\tprivate _saveToLocalStorage() {\n\t\tlocalStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(this._data()));\n\t}\n\n\t//\n\t//\n\t// editor callbacks\n\t//\n\t//\n\tprivate rendereredImageByFileNameByNodePath: Map<string, Map<string, string>> = new Map();\n\tonFrameSave(options: CaptureOnFrameSaveOptions): Promise<void> {\n\t\tconst {file, rendererNodePath, fileName} = options;\n\t\treturn new Promise((resolve) => {\n\t\t\tlet mapForNode = this.rendereredImageByFileNameByNodePath.get(rendererNodePath);\n\t\t\tif (!mapForNode) {\n\t\t\t\tmapForNode = new Map();\n\t\t\t\tthis.rendereredImageByFileNameByNodePath.set(rendererNodePath, mapForNode);\n\t\t\t}\n\t\t\tconst filePath = URL.createObjectURL(file);\n\t\t\tmapForNode.set(fileName, filePath);\n\t\t\tresolve();\n\t\t});\n\t}\n\tonFrameRead(options: CaptureOnFrameReadOptions): Promise<Capture.RequestLoadAnimationFrameResponse | undefined> {\n\t\tconst {rendererNodePath, fileName} = options;\n\t\treturn new Promise((resolve) => {\n\t\t\tconst filePath = this.rendereredImageByFileNameByNodePath.get(rendererNodePath)?.get(fileName);\n\t\t\tif (filePath) {\n\t\t\t\tresolve({filePath});\n\t\t\t}\n\t\t});\n\t}\n\n\t//\n\t//\n\t// hooks for test\n\t//\n\t//\n\t// private _forceReadRendersFromMemory: Ref<boolean> = ref(false);\n\t// forceReadRendersFromMemory() {\n\t// \treturn this._forceReadRendersFromMemory.value;\n\t// }\n\t// async withForceReadRendersFromMemory(callback: () => Promise<void>) {\n\t// \tthis._forceReadRendersFromMemory.value = true;\n\t// \tawait callback();\n\t// \tthis._forceReadRendersFromMemory.value = false;\n\t// }\n}\n\nexport const CaptureForm = EditorCaptureFormControllerClass.instance();\n","import {Csrf} from './../../../core/Csrf';\nimport {Ref, ref} from 'vue';\nimport {CaptureType} from './../../../core/CaptureType';\nimport {StoreController} from '../StoreController';\nimport {AppSceneLoader} from '../../../../config/AppSceneLoader';\nimport {FigmaPluginController} from '../../../../plugins/figma/FigmaPluginController';\ninterface OnDownloadData {\n\tfile: File;\n}\ninterface CaptureResultDisplayOptions {\n\tcaptureType: CaptureType;\n\tfile: File;\n\tonDownload: (data: OnDownloadData) => void;\n}\n\ntype OnDownloadCallback = (args: OnDownloadData) => void;\n\nexport class EditorCaptureResultControllerClass {\n\tprivate static _instance: EditorCaptureResultControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorCaptureResultControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _displayed = ref(false);\n\tprivate _captureType = ref(CaptureType.IMAGE);\n\tprivate _file: File | undefined;\n\tprivate _lastCaptureUrl: Ref<string | null> = ref(null);\n\tprivate _onDownload: OnDownloadCallback | undefined;\n\n\t// getters\n\tdisplayed() {\n\t\treturn this._displayed.value;\n\t}\n\tcaptureType() {\n\t\treturn this._captureType.value;\n\t}\n\tfile() {\n\t\treturn this._file;\n\t}\n\tlastCaptureUrl() {\n\t\treturn this._lastCaptureUrl.value;\n\t}\n\t// mutations\n\tdisplay(options: CaptureResultDisplayOptions): void {\n\t\tStoreController.editor.captureForm.markAsCompleted();\n\t\tthis._captureType.value = options.captureType;\n\t\tthis._displayed.value = true;\n\t\tthis._file = options.file;\n\t\tFigmaPluginController.sendMessageImageCaptured(this._file);\n\t\tthis._onDownload = options.onDownload;\n\t}\n\tsetLastCaptureUrl(url: string) {\n\t\tthis._lastCaptureUrl.value = url;\n\t}\n\tdownload() {\n\t\tif (this._file && this._onDownload) {\n\t\t\tthis._onDownload({file: this._file});\n\t\t}\n\t}\n\tasync downloadForExample() {\n\t\tif (!this._file) {\n\t\t\tconsole.warn('no file');\n\t\t\treturn;\n\t\t}\n\t\tconst example = AppSceneLoader.example();\n\t\tif (!example) {\n\t\t\treturn;\n\t\t}\n\t\tconst exampleId = example.id(); //FeaturesController.legacyExampleId();\n\t\tif (!exampleId) {\n\t\t\tconsole.warn('no exampleId');\n\t\t\treturn;\n\t\t}\n\t\t// this url is not part of the npm module API,\n\t\t// as it only exists to save examples thumbnails\n\t\tconst url = '/scenes/save_example_thumbnail';\n\t\tconst formData = new FormData();\n\t\tformData.append('example_id', exampleId.replace(/:/g, '/'));\n\t\tformData.append('capture_type', this._captureType.value);\n\t\tformData.append('file', this._file);\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: formData,\n\t\t\theaders: {\n\t\t\t\t...Csrf.headers(),\n\t\t\t\t// 'Content-Type': 'application/json',\n\t\t\t},\n\t\t});\n\t\tconst json = await response.json();\n\t\tconsole.log('save thumbnail response:', json);\n\t\tif (response.ok) {\n\t\t\tStoreController.editor.status.setMessage(`${this._captureType.value} example downloaded successfully`);\n\t\t} else {\n\t\t\tStoreController.editor.status.setError(`${this._captureType.value} example NOT downloaded`);\n\t\t}\n\t}\n\tclose() {\n\t\tthis._close();\n\t\tthis._onDownload = undefined;\n\t\tthis._file = undefined;\n\t}\n\tprivate _close() {\n\t\tthis._displayed.value = false;\n\t}\n}\n\nexport const CaptureResult = EditorCaptureResultControllerClass.instance();\n","import {ref, watch} from 'vue';\n\nexport enum ExportType {\n\t// SINGLE_HTML_FILE = 'single html file',\n\tSELF_CONTAINED_SCENE = 'self contained scene',\n\tOPTIMIZED = 'optimized',\n}\ninterface ExportFormData {\n\texportType: ExportType;\n}\n// type LocalStorageData = Partial<ExportFormData>;\nconst LOCAL_STORAGE_KEY = 'EditorSceneExportFormControllerClass';\n\ntype SceneExportFormCallback = (args: ExportFormData) => void;\n\nexport class EditorSceneExportFormontrollerClass {\n\tprivate static _instance: EditorSceneExportFormontrollerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorSceneExportFormontrollerClass());\n\t}\n\n\tprivate constructor() {\n\t\tconst saveToLocalStorage = this._saveToLocalStorage.bind(this);\n\t\twatch(this._exportType, saveToLocalStorage);\n\t}\n\n\tprivate _displayed = ref(false);\n\tprivate _exportType = ref(ExportType.OPTIMIZED);\n\tprivate _resolve: SceneExportFormCallback | undefined;\n\t// init() {\n\t// \t// this._displayed\n\t// \t// const saved = this._loadLocalStorage();\n\t// \t// this._exportType = ref(saved?.exportType || ExportType.OPTIMIZED);\n\t// \t// this._exportType\n\n\t// }\n\n\t// getters\n\tdisplayed() {\n\t\treturn this._displayed.value;\n\t}\n\texportType() {\n\t\treturn this._exportType.value;\n\t}\n\n\t// mutations\n\tdisplay(): Promise<ExportFormData> {\n\t\tthis._displayed.value = true;\n\t\treturn new Promise((resolve) => {\n\t\t\tthis._resolve = resolve;\n\t\t});\n\t}\n\tconfirm() {\n\t\tif (this._resolve) {\n\t\t\tthis._resolve(this._data());\n\t\t}\n\t\tthis._close();\n\t}\n\tcancel() {\n\t\tthis._close();\n\t\tthis._resolve = undefined;\n\t}\n\tprivate _close() {\n\t\tthis._displayed.value = false;\n\t}\n\tsetExportType(type: ExportType): void {\n\t\tthis._exportType.value = type;\n\t}\n\tprivate _data(): ExportFormData {\n\t\treturn {\n\t\t\texportType: this._exportType.value,\n\t\t};\n\t}\n\n\tprivate _saveToLocalStorage() {\n\t\tlocalStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(this._data()));\n\t}\n\t// private _loadLocalStorage() {\n\t// \tconst content = localStorage.getItem(LOCAL_STORAGE_KEY);\n\t// \tif (!content) {\n\t// \t\treturn;\n\t// \t}\n\t// \ttry {\n\t// \t\tconst json = JSON.parse(content) as LocalStorageData;\n\t// \t\treturn json;\n\t// \t} catch (e) {\n\t// \t\treturn;\n\t// \t}\n\t// }\n}\n\nexport const ExportFormWeb = EditorSceneExportFormontrollerClass.instance();\n","import {QuickExportableSceneTraverser, ExportNotAllowedReason} from './../../../core/scene_traversers/QuickExportable';\n\n// import {PolyScene} from '../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {ref, Ref} from 'vue';\nimport {StoreController} from '../StoreController';\n// import {StoreController} from '../StoreController';\n\n// type ExportFormLocalCallback = () => void;\n\ninterface SetExportableOptions {\n\texportable: boolean;\n\tnonExportableNodePaths: string[];\n\treasons: ExportNotAllowedReason[];\n}\n\nexport class EditorExportFormLocalControllerClass {\n\tprivate static _instance: EditorExportFormLocalControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorExportFormLocalControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// private _displayed = ref(false);\n\tprivate _exportable = ref(true);\n\tprivate _nonExportableNodePaths: Ref<string[]> = ref([]);\n\tprivate _exportNotAllowdReasons: Ref<ExportNotAllowedReason[]> = ref([]);\n\t// private _resolve: ExportFormLocalCallback | undefined;\n\n\t// getters\n\t// displayed() {\n\t// \treturn this._displayed.value;\n\t// }\n\texportable() {\n\t\treturn this._exportable.value;\n\t}\n\tnonExportableNodePaths() {\n\t\treturn this._nonExportableNodePaths.value;\n\t}\n\treasons() {\n\t\treturn this._exportNotAllowdReasons.value;\n\t}\n\n\t// mutations\n\t// display(): Promise<void> {\n\t// \tthis._displayed.value = true;\n\t// \tcheckSceneExportable(StoreController.scene, this);\n\t// \treturn new Promise((resolve) => {\n\t// \t\tthis._resolve = resolve;\n\t// \t});\n\t// }\n\tasync checkSceneExportable() {\n\t\tconst scene = StoreController.engine.scene;\n\t\tconst traverser = new QuickExportableSceneTraverser(scene);\n\t\tawait traverser.traverseScene();\n\t\tconst exportable = traverser.exportable();\n\t\tconst nonExportableNodePaths = traverser.nonExportableNodePaths();\n\t\tconst reasons = traverser.reasons();\n\t\tthis._setExportable({exportable, nonExportableNodePaths, reasons});\n\t}\n\tprivate _setExportable(options: SetExportableOptions) {\n\t\tthis._exportable.value = options.exportable;\n\t\tthis._nonExportableNodePaths.value.splice(0, this._nonExportableNodePaths.value.length);\n\t\tfor (const nodePath of options.nonExportableNodePaths) {\n\t\t\tthis._nonExportableNodePaths.value.push(nodePath);\n\t\t}\n\t\tthis._exportNotAllowdReasons.value.length = 0;\n\t\tfor (const reason of options.reasons) {\n\t\t\tthis._exportNotAllowdReasons.value.push(reason);\n\t\t}\n\t}\n\t// confirm() {\n\t// \tif (this._resolve) {\n\t// \t\tthis._resolve();\n\t// \t}\n\t// \tthis._close();\n\t// }\n\t// cancel() {\n\t// \tthis._close();\n\t// \tthis._resolve = undefined;\n\t// }\n\t// private _close() {\n\t// \tthis._displayed.value = false;\n\t// }\n}\n\nexport const ExportFormLocal = EditorExportFormLocalControllerClass.instance();\n","import {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n\ntype ExportPanelCallback = () => void;\n\nexport class EditorExportPanelControllerClass {\n\tprivate static _instance: EditorExportPanelControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorExportPanelControllerClass());\n\t}\n\n\t// private _displayed = ref(false);\n\tprivate _resolve: ExportPanelCallback | undefined;\n\n\t// getters\n\t// displayed() {\n\t// \treturn this._displayed.value;\n\t// }\n\n\t// mutations\n\tdisplay(): Promise<void> {\n\t\trouter.push({name: EditorRoute.EXPORT});\n\t\t// this._displayed.value = true;\n\t\treturn new Promise((resolve) => {\n\t\t\tthis._resolve = resolve;\n\t\t});\n\t}\n\tconfirm() {\n\t\tif (this._resolve) {\n\t\t\tthis._resolve();\n\t\t}\n\t\tthis._close();\n\t}\n\tclose() {\n\t\tthis._close();\n\t\tthis._resolve = undefined;\n\t}\n\tprivate _close() {\n\t\tcloseModals();\n\t\t// router.push(Route.EDITOR);\n\t\t// this._displayed.value = false;\n\t}\n}\n\nexport const ExportPanel = EditorExportPanelControllerClass.instance();\n","import {router, closeModals, updateEditorAssetsRoute} from '../../../../routes';\nimport {AssetsHelper} from '../../../core/AssetsHelper';\nimport {Ref, ref} from 'vue';\ntype OnCloseCallback = () => void;\ninterface EditorPanelAssetsListOptions {\n\tonClose?: OnCloseCallback;\n}\n\nexport class EditorPanelAssetsListStoreControllerClass {\n\tprivate static _instance: EditorPanelAssetsListStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPanelAssetsListStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _loading: Ref<boolean> = ref(false);\n\tprivate _onClose: OnCloseCallback | undefined;\n\n\tloading(): boolean {\n\t\treturn this._loading.value;\n\t}\n\tasync loadData() {\n\t\tthis._loading.value = true;\n\t\tawait AssetsHelper.loadData();\n\t\tthis._loading.value = false;\n\t}\n\n\t// mutations\n\tasync open(options?: EditorPanelAssetsListOptions): Promise<void> {\n\t\tawait this.loadData();\n\t\tconst itemsCount = AssetsHelper.lineItems().length;\n\t\tconst newRoute = updateEditorAssetsRoute(itemsCount);\n\t\tif (newRoute) {\n\t\t\trouter.push({name: newRoute.name});\n\t\t\tthis._onClose = options?.onClose;\n\t\t}\n\t}\n\tclose() {\n\t\t// this._displayed.value = false;\n\t\tcloseModals();\n\t\tif (this._onClose) {\n\t\t\tthis._onClose();\n\t\t\tthis._onClose = undefined;\n\t\t}\n\t}\n}\n\nexport const EditorPanelAssetsListStoreController = EditorPanelAssetsListStoreControllerClass.instance();\n","import type {EditorApi} from '../../../api/EditorApi';\nimport {ref, Ref} from 'vue';\nimport {EditorProps} from '../../../types';\nimport {StoreController} from '../StoreController';\nimport {sanitizeUrl} from '../../../../../@polygonjs/polygonjs/src/core/UrlHelper';\nimport {EditorSaveOptions} from '../../../../npm_module/NpmModuleTypes';\nimport {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\ninterface LocalState {\n\t// displayed: Ref<boolean>;\n\t//\n\t// createExport: Ref<boolean>;\n\tcheckRemoteAssetsUse: Ref<boolean>;\n\tminimizeFilesCount: Ref<boolean>;\n\t// compressJs: Ref<boolean>;\n\t// createZip: Ref<boolean>;\n\t// runPostExportCommand: Ref<boolean>;\n}\n\nexport class EditorPreferencesControllerClass {\n\tprivate static _instance: EditorPreferencesControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorPreferencesControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _state: LocalState = {\n\t\t// displayed: ref(false),\n\t\t// let's have those set to true\n\t\t// as it makes things easier for newcomers\n\t\tcheckRemoteAssetsUse: ref(true),\n\t\t// createExport: ref(false),\n\t\t// runPostExportCommand: ref(false),\n\t\tminimizeFilesCount: ref(false),\n\t\t// compressJs: ref(true),\n\t\t// createZip: ref(false),\n\t};\n\tsetFromEditor(props: EditorProps) {\n\t\tconst saveOptions = props.saveOptions;\n\t\tif (saveOptions == null) {\n\t\t\treturn;\n\t\t}\n\t\t// only use those values if they are present,\n\t\t// as they might not be when the schema changes\n\t\t// if (saveOptions.createExport != null) {\n\t\t// \tthis._state.createExport.value = saveOptions.createExport;\n\t\t// }\n\t\tif (saveOptions.checkRemoteAssetsUse != null) {\n\t\t\tthis._state.checkRemoteAssetsUse.value = saveOptions.checkRemoteAssetsUse;\n\t\t}\n\t\tif (saveOptions.minimizeFilesCount != null) {\n\t\t\tthis._state.minimizeFilesCount.value = saveOptions.minimizeFilesCount;\n\t\t}\n\t\t// if (saveOptions.compressJs != null) {\n\t\t// \tthis._state.compressJs.value = saveOptions.compressJs;\n\t\t// }\n\t\t// if (saveOptions.createZip != null) {\n\t\t// \tthis._state.createZip.value = saveOptions.createZip;\n\t\t// }\n\t\t// if (saveOptions.runPostExportCommand != null) {\n\t\t// \tthis._state.runPostExportCommand.value = saveOptions.runPostExportCommand;\n\t\t// }\n\t}\n\tstate() {\n\t\treturn this._state;\n\t}\n\teditorLayoutData(): EditorSaveOptions {\n\t\treturn {\n\t\t\t// createExport: this._state.createExport.value,\n\t\t\tcheckRemoteAssetsUse: this._state.checkRemoteAssetsUse.value,\n\t\t\t// skipExportSinceRemoteAssetsPresents: false,\n\t\t\tminimizeFilesCount: this._state.minimizeFilesCount.value,\n\t\t\t// compressJs: this._state.compressJs.value,\n\t\t\t// createZip: this._state.createZip.value,\n\t\t\t// runPostExportCommand: this._state.runPostExportCommand.value,\n\t\t};\n\t}\n\tdisplay() {\n\t\trouter.push({name: EditorRoute.PREFERENCES});\n\t\t// this._state.displayed.value = true;\n\t}\n\tclose() {\n\t\tcloseModals();\n\t\t// router.push(currentEditorRoute());\n\t\t// this._state.displayed.value = false;\n\t}\n\n\tuploadedExportData(editorApi: EditorApi) {\n\t\tconst sceneName = StoreController.scene.name();\n\t\tconst sceneSaved = sceneName != null;\n\t\tif (!sceneSaved) {\n\t\t\treturn;\n\t\t}\n\t\tif (!sceneName) {\n\t\t\treturn;\n\t\t}\n\t\tconst localExportFolder = editorApi.export.exportFolder();\n\t\tif (!localExportFolder) {\n\t\t\treturn;\n\t\t}\n\t\tconst postExportCommand = editorApi.export.postExportCommand({\n\t\t\tsceneName: sceneName,\n\t\t\texportFolder: localExportFolder,\n\t\t});\n\n\t\tfunction _makePublicPath() {\n\t\t\tif (!postExportCommand) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet path = sanitizeUrl(postExportCommand.publicPath);\n\t\t\tif (path.endsWith('/')) {\n\t\t\t\tpath = path.slice(0, path.length - 1);\n\t\t\t}\n\t\t\treturn path;\n\t\t}\n\t\tconst publicPath = _makePublicPath();\n\t\tif (!publicPath) {\n\t\t\treturn;\n\t\t}\n\t\tconst indexHtmlPath = sanitizeUrl(`${publicPath}/index.html?t=${Date.now()}`);\n\n\t\treturn {\n\t\t\tpostExportCommand,\n\t\t\tpublicPath,\n\t\t\tindexHtmlPath,\n\t\t};\n\t}\n}\n\nexport const preferences = EditorPreferencesControllerClass.instance();\n","import {ref, Ref} from 'vue';\nimport {SaveWarningResponse} from '../../../../npm_module/controllers/Common';\n\ntype Resolve = (response: SaveWarningResponse) => void;\n\nexport class EditorSaveWarningsControllerClass {\n\tprivate static _instance: EditorSaveWarningsControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorSaveWarningsControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _displayed: Ref<boolean> = ref(false);\n\tprivate _resolve: Resolve | undefined;\n\tdisplayed() {\n\t\treturn this._displayed.value;\n\t}\n\tdisplay(): Promise<SaveWarningResponse> {\n\t\treturn new Promise((resolve) => {\n\t\t\tthis._displayed.value = true;\n\t\t\tthis._resolve = resolve;\n\t\t});\n\t}\n\tskip() {\n\t\tthis._displayed.value = false;\n\t\tif (this._resolve) {\n\t\t\tconst callback = this._resolve;\n\t\t\tthis._resolve = undefined;\n\t\t\tcallback(SaveWarningResponse.SKIP);\n\t\t}\n\t}\n\tsaveAgain() {\n\t\tthis._displayed.value = false;\n\t\tif (this._resolve) {\n\t\t\tconst callback = this._resolve;\n\t\t\tthis._resolve = undefined;\n\t\t\tcallback(SaveWarningResponse.SAVE_AGAIN);\n\t\t}\n\t}\n}\n\nexport const SaveWarnings = EditorSaveWarningsControllerClass.instance();\n","import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {ref, Ref} from 'vue';\nimport {AVAILABLE_LINK_INDEX_VALUES, LinkIndex} from '../../../components/panels/common/LinkIndex';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StoreController} from '../StoreController';\nimport {ArrayUtils} from '../../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nconst MAX_HISTORY_LENGTH = 20;\ninterface CurrentNodeIdHistoryByLinkIndex {\n\t1: CoreGraphNodeId[];\n\t2: CoreGraphNodeId[];\n\t3: CoreGraphNodeId[];\n\t4: CoreGraphNodeId[];\n\t5: CoreGraphNodeId[];\n\t6: CoreGraphNodeId[];\n\t7: CoreGraphNodeId[];\n\t8: CoreGraphNodeId[];\n}\ninterface CurrentNodeIdHistoryByLinkIndexJSON {\n\t1: string[];\n\t2: string[];\n\t3: string[];\n\t4: string[];\n\t5: string[];\n\t6: string[];\n\t7: string[];\n\t8: string[];\n}\ninterface CurrentNodeIdHistoryIndexByLinkIndex {\n\t1: Ref<number>;\n\t2: Ref<number>;\n\t3: Ref<number>;\n\t4: Ref<number>;\n\t5: Ref<number>;\n\t6: Ref<number>;\n\t7: Ref<number>;\n\t8: Ref<number>;\n}\ninterface CurrentNodeIdHistoryIndexByLinkIndexJSON {\n\t1: number;\n\t2: number;\n\t3: number;\n\t4: number;\n\t5: number;\n\t6: number;\n\t7: number;\n\t8: number;\n}\n\nexport interface NavigationHistoryJSON {\n\tnodePaths: CurrentNodeIdHistoryByLinkIndexJSON;\n\tindex: CurrentNodeIdHistoryIndexByLinkIndexJSON;\n}\n\nconst DEFAULT_INDEX = -1;\nexport class NavigationHistoryStoreControllerClass {\n\tprivate static _instance: NavigationHistoryStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NavigationHistoryStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\t// navigation cannot be using nodeIds, as when a node is deleted, and recreated via undo, that stops working\n\t// it cannot use paths either, as nodes can be renamed\n\t// using both id and paths does not seem very reliable either\n\t// ideally, I would use the missing references system, which is also used for nodepath params.\n\t// but for now, I'll use ids, and when we goForward, goBackward, request node lists, or save toJSON,\n\t// or when nodes are added/deleted/renamed in the store\n\t// then the history gets a sanity check done\n\tprivate _nodeId: Ref<CurrentNodeIdHistoryByLinkIndex> = ref({\n\t\t1: [],\n\t\t2: [],\n\t\t3: [],\n\t\t4: [],\n\t\t5: [],\n\t\t6: [],\n\t\t7: [],\n\t\t8: [],\n\t});\n\tprivate _index: CurrentNodeIdHistoryIndexByLinkIndex = {\n\t\t1: ref(DEFAULT_INDEX),\n\t\t2: ref(DEFAULT_INDEX),\n\t\t3: ref(DEFAULT_INDEX),\n\t\t4: ref(DEFAULT_INDEX),\n\t\t5: ref(DEFAULT_INDEX),\n\t\t6: ref(DEFAULT_INDEX),\n\t\t7: ref(DEFAULT_INDEX),\n\t\t8: ref(DEFAULT_INDEX),\n\t};\n\n\treset() {\n\t\tfor (let linkIndex of AVAILABLE_LINK_INDEX_VALUES) {\n\t\t\tthis._nodeId.value[linkIndex].splice(0, this._nodeId.value[linkIndex].length);\n\t\t\tthis._index[linkIndex].value = DEFAULT_INDEX;\n\t\t}\n\t}\n\tprivate _performSanityCheck() {\n\t\tfor (let linkIndex of AVAILABLE_LINK_INDEX_VALUES) {\n\t\t\tconst index = this._index[linkIndex];\n\t\t\tlet i = 0;\n\t\t\tfor (let nodeId of this._nodeId.value[linkIndex]) {\n\t\t\t\tconst node = StoreController.engine.node(nodeId);\n\t\t\t\tif (!node) {\n\t\t\t\t\tthis._nodeId.value[linkIndex].splice(i, 1);\n\t\t\t\t\tif (i <= index.value) {\n\t\t\t\t\t\tindex.value -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\n\t// getters\n\tcurrentNodeHistory(linkIndex: LinkIndex): CoreGraphNodeId[] {\n\t\treturn this._nodeId.value[linkIndex];\n\t}\n\tcurrentNodeHistoryIndex(linkIndex: LinkIndex): number {\n\t\treturn this._index[linkIndex].value;\n\t}\n\n\tgoBackwardAllowed(linkIndex: LinkIndex) {\n\t\tconst index = this._index[linkIndex].value;\n\t\tconst history = this._nodeId.value[linkIndex];\n\t\treturn index >= 0 && history.length > 0;\n\t}\n\tgoForwardAllowed(linkIndex: LinkIndex) {\n\t\tconst index = this._index[linkIndex].value;\n\t\tconst history = this._nodeId.value[linkIndex];\n\t\treturn index < history.length - 1;\n\t}\n\ttoJSON(): NavigationHistoryJSON | undefined {\n\t\ttry {\n\t\t\tthis._performSanityCheck();\n\t\t\tconst indexJSON: CurrentNodeIdHistoryIndexByLinkIndexJSON = {\n\t\t\t\t1: this._index[1].value,\n\t\t\t\t2: this._index[2].value,\n\t\t\t\t3: this._index[3].value,\n\t\t\t\t4: this._index[4].value,\n\t\t\t\t5: this._index[5].value,\n\t\t\t\t6: this._index[6].value,\n\t\t\t\t7: this._index[7].value,\n\t\t\t\t8: this._index[8].value,\n\t\t\t};\n\t\t\tconst nodeName = (nodeId: CoreGraphNodeId) => {\n\t\t\t\treturn StoreController.engine.node(nodeId)!.path();\n\t\t\t};\n\t\t\tconst nodePathsJSON: CurrentNodeIdHistoryByLinkIndexJSON = {\n\t\t\t\t1: this._nodeId.value[1].map(nodeName),\n\t\t\t\t2: this._nodeId.value[2].map(nodeName),\n\t\t\t\t3: this._nodeId.value[3].map(nodeName),\n\t\t\t\t4: this._nodeId.value[4].map(nodeName),\n\t\t\t\t5: this._nodeId.value[5].map(nodeName),\n\t\t\t\t6: this._nodeId.value[6].map(nodeName),\n\t\t\t\t7: this._nodeId.value[7].map(nodeName),\n\t\t\t\t8: this._nodeId.value[8].map(nodeName),\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tnodePaths: nodePathsJSON,\n\t\t\t\tindex: indexJSON,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tconsole.log(err);\n\t\t\tconsole.warn('navigation history will not be saved');\n\t\t}\n\t}\n\n\t// mutations\n\tfromJSON(json: NavigationHistoryJSON) {\n\t\tlet linkIndices = Object.keys(json.nodePaths);\n\t\tfor (let i of linkIndices) {\n\t\t\tconst linkIndex = parseInt(i) as LinkIndex;\n\t\t\tconst nodePaths = json.nodePaths[linkIndex];\n\t\t\tfor (let nodePath of nodePaths) {\n\t\t\t\tconst node = StoreController.scene.node(nodePath);\n\t\t\t\tconst nodeId = node?.graphNodeId();\n\t\t\t\tif (nodeId != null) {\n\t\t\t\t\tthis._nodeId.value[linkIndex].push(nodeId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlinkIndices = Object.keys(json.index);\n\t\tfor (let i of linkIndices) {\n\t\t\tconst linkIndex = parseInt(i) as LinkIndex;\n\t\t\tconst index = this._index[linkIndex];\n\t\t\tindex.value = json.index[linkIndex];\n\t\t\tconst currentNodeId = this._nodeId.value[linkIndex][index.value];\n\t\t\tif (currentNodeId != null) {\n\t\t\t\tconst node = StoreController.engine.node(currentNodeId);\n\t\t\t\tif (node) {\n\t\t\t\t\tStoreController.editor.setCurrentNode(linkIndex, node, {pushToHistory: false});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpushCurrentNode(linkIndex: LinkIndex, node: BaseNodeType) {\n\t\tconst nodeId = node.graphNodeId();\n\t\tconst index = this._index[linkIndex];\n\t\tconst nodeIds = this._nodeId.value[linkIndex];\n\t\tif (nodeIds.length > index.value + 1) {\n\t\t\tnodeIds.splice(index.value + 1, nodeIds.length - index.value);\n\t\t}\n\t\tconst lastNodeId = nodeIds[nodeIds.length - 1];\n\t\tif (lastNodeId == nodeId) {\n\t\t\treturn;\n\t\t}\n\t\tnodeIds.push(nodeId);\n\t\twhile (nodeIds.length > MAX_HISTORY_LENGTH) {\n\t\t\tnodeIds.shift();\n\t\t}\n\t\tindex.value = nodeIds.length - 1;\n\t}\n\tgoBackward(linkIndex: LinkIndex) {\n\t\tthis._performSanityCheck();\n\t\tif (!this.goBackwardAllowed(linkIndex)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._go(linkIndex, -1);\n\t}\n\tgoForward(linkIndex: LinkIndex) {\n\t\tthis._performSanityCheck();\n\t\tif (!this.goForwardAllowed(linkIndex)) {\n\t\t\treturn;\n\t\t}\n\t\tthis._go(linkIndex, +1);\n\t}\n\n\ttoggleDisplayBackwardNodeList(event: MouseEvent, linkIndex: LinkIndex, element: HTMLElement) {\n\t\tthis._performSanityCheck();\n\t\tthis._toggleDisplayNodeList(\n\t\t\tevent,\n\t\t\tlinkIndex,\n\t\t\tArrayUtils.shallowClone(this.backwardNodeIds(linkIndex)).reverse(),\n\t\t\telement\n\t\t);\n\t}\n\ttoggleDisplayForwardNodeList(event: MouseEvent, linkIndex: LinkIndex, element: HTMLElement) {\n\t\tthis._performSanityCheck();\n\t\tthis._toggleDisplayNodeList(event, linkIndex, this.forwardNodeIds(linkIndex), element);\n\t}\n\tprivate _toggleDisplayNodeList(\n\t\tevent: MouseEvent,\n\t\tlinkIndex: LinkIndex,\n\t\tnodeIds: CoreGraphNodeId[],\n\t\telement: HTMLElement\n\t) {\n\t\tStoreController.editor.navigationNodeList.toggleDisplay({\n\t\t\tposition: {\n\t\t\t\tx: event.pageX,\n\t\t\t\ty: event.pageY,\n\t\t\t},\n\t\t\tlinkIndex: linkIndex,\n\t\t\tnodeIds: nodeIds,\n\t\t\tparentId: null,\n\t\t\telement: element,\n\t\t});\n\t}\n\n\tbackwardNodeIds(linkIndex: LinkIndex) {\n\t\treturn this._nodeId.value[linkIndex].slice(0, this._index[linkIndex].value);\n\t}\n\tforwardNodeIds(linkIndex: LinkIndex) {\n\t\treturn this._nodeId.value[linkIndex].slice(this._index[linkIndex].value + 1);\n\t}\n\tprivate _go(linkIndex: LinkIndex, offset: number) {\n\t\tconst index = this._index[linkIndex];\n\t\tindex.value += offset;\n\t\tconst history = this._nodeId.value[linkIndex];\n\t\tconst nodeId = history[index.value];\n\t\tif (!nodeId) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = StoreController.engine.node(nodeId);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tStoreController.editor.setCurrentNode(linkIndex, node, {pushToHistory: false});\n\t}\n}\n\nexport const NavigationHistoryStoreController = NavigationHistoryStoreControllerClass.instance();\n","import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Vector2Like} from '../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {ref, Ref} from 'vue';\nimport {LinkIndex} from '../../../components/panels/common/LinkIndex';\nimport {isBooleanTrue} from '../../../../../@polygonjs/polygonjs/src/core/Type';\n\ninterface Options {\n\tparentId: CoreGraphNodeId | null;\n\tposition: Vector2Like;\n\tnodeIds: CoreGraphNodeId[];\n\tlinkIndex: LinkIndex;\n\telement: HTMLElement;\n}\n\nexport class EditorNavigationNodeListStoreControllerClass {\n\tprivate static _instance: EditorNavigationNodeListStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorNavigationNodeListStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _displayed: Ref<boolean> = ref(false);\n\tprivate _position: Ref<Vector2Like> = ref({\n\t\tx: 0,\n\t\ty: 0,\n\t});\n\tprivate _parentId: Ref<CoreGraphNodeId | null> = ref(null);\n\tprivate _nodeIds: Ref<CoreGraphNodeId[]> = ref([]);\n\tprivate _linkIndex: Ref<LinkIndex> = ref(1);\n\tprivate _element: HTMLElement | undefined;\n\t// init() {\n\t// \tthis._displayed\n\t// \tthis._position ;\n\t// \tthis._nodeIds\n\t// \tthis._parentId\n\t// \tthis._linkIndex\n\t// }\n\n\t// getters\n\tposition(): Vector2Like {\n\t\treturn this._position.value;\n\t}\n\tparentId() {\n\t\treturn this._parentId.value;\n\t}\n\tnodeIds(): CoreGraphNodeId[] {\n\t\treturn this._nodeIds.value;\n\t}\n\tlinkIndex() {\n\t\treturn this._linkIndex.value;\n\t}\n\tdisplayed() {\n\t\treturn isBooleanTrue(this._displayed.value);\n\t}\n\n\t// mutations\n\tdisplay(options: Options) {\n\t\tthis._element = options.element;\n\t\tthis._displayed.value = true;\n\t\tthis._parentId.value = options.parentId;\n\t\tthis._setPosition(options.position);\n\t\tthis._linkIndex.value = options.linkIndex;\n\t\tthis._setNodeIds(options.nodeIds);\n\t}\n\ttoggleDisplay(options: Options) {\n\t\t// if we toggle display it from the same element\n\t\t// we probably meant to hide it\n\t\tif (isBooleanTrue(this._displayed.value) && this._element == options.element) {\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis.display(options);\n\t\t}\n\t}\n\tclose() {\n\t\tthis._element = undefined;\n\t\tthis._displayed.value = false;\n\t\tthis._position.value.x = -1000;\n\t\tthis._position.value.y = -1000;\n\t}\n\tprivate _setPosition(position: Vector2Like): void {\n\t\tthis._position.value.x = position.x;\n\t\tthis._position.value.y = position.y;\n\t}\n\tprivate _setNodeIds(nodeIds: CoreGraphNodeId[]): void {\n\t\tthis._nodeIds.value.splice(0, this._nodeIds.value.length);\n\t\tfor (let nodeId of nodeIds) {\n\t\t\tthis._nodeIds.value.push(nodeId);\n\t\t}\n\t}\n}\n\nexport const NavigationNodeListController = EditorNavigationNodeListStoreControllerClass.instance();\n","import {RouteLocationNormalizedLoaded} from 'vue-router';\nimport {ref, Ref} from 'vue';\n\nimport {KeyframeEditorController} from './editor/KeyframeEditor';\nimport {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\n\nimport {BaseNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base.js';\nimport {StoreController} from './StoreController';\n\nimport {EditorClipboardStoreController} from './editor/EditorClipboardStoreController';\nimport {EditorContextMenuStoreController} from './editor/EditorContextMenuStoreController';\nimport {EditorDialogAboutStoreController} from './editor/EditorDialogAboutStoreController';\nimport {EditorDialogWarningsStoreController} from './editor/EditorDialogWarningsStoreController';\nimport {EditorDialogConfirmStoreController} from './editor/EditorDialogConfirmStoreController';\n// import {EditorDialogDesktopLoginStoreController} from './editor/EditorDialogDesktopLoginStoreController';\nimport {EditorDialogPromptStoreController} from './editor/EditorDialogPromptStoreController';\nimport {EditorDialogNoticeStoreController} from './editor/EditorDialogNoticeStoreController';\nimport {EditorDialogApiLoginStoreController} from './editor/EditorDialogApiLoginStoreController';\n// import {EditorDialogApiExportStoreController} from './editor/EditorDialogApiExportStoreController';\nimport {EditorDialogWebGLCapabilitiesStoreController} from './editor/EditorDialogWebGLCapabilitiesStoreController';\nimport {MarketplacePolyNodesController} from './editor/MarketplacePolyNodes';\nimport {EditorCommandPaletteStoreController} from './editor/EditorCommandPalette';\nimport {EditorUserPlanStoreController} from './editor/EditorUserPlan';\n\n// import {EditorDialogNewProjectStoreController} from './editor/EditorDialogNewProjectStoreController';\nimport {EditorNetworkStoreController} from './editor/EditorNetworkStoreController';\nimport {EditorNumericSliderStoreController} from './editor/EditorNumericSliderStoreController';\nimport {EditorPanelStoreController} from './editor/EditorPanelStoreController';\nimport {EditorPanelNodeSelectorStoreController} from './editor/EditorPanelNodeSelectorController';\nimport {EditorPanelFileSelectorStoreController} from './editor/EditorPanelFileSelectorController';\nimport {EditorPanelObjectMaskStoreController} from './editor/EditorPanelObjectMaskController';\nimport {EditorPanelSpareParamsEditorStoreController} from './editor/EditorPanelSpareParamsEditorController';\n// import {EditorPanelSceneSelectorStoreController} from './editor/EditorPanelSceneSelectorController';\nimport {EditorParamsModalsController} from './editor/EditorParamsModalsController';\nimport {EditorWindowsLibrariesManagerController} from './editor/EditorWindowsLibrariesManagerController';\nimport {EditorStatusStoreController} from './editor/EditorStatusStoreController';\nimport {EditorUploadsStoreController} from './editor/EditorUploadsStoreController';\nimport {EditorCurrentUserController} from './editor/EditorCurrentUserController';\nimport {EditorPolyNodeCreateFormController} from './editor/EditorPolyNodeCreateFormController';\nimport {EditorPolyNodeUpdateFormController} from './editor/EditorPolyNodeUpdateFormController';\nimport {ShareController} from './editor/ShareController';\nimport {MultiPlayerController} from './editor/MultiPlayerController';\nimport {TabMenuController} from './editor/TabMenuController';\nimport {SceneReadonlyController} from './editor/SceneReadonly';\nimport {DocsController} from './editor/DocsController';\nimport {DebugJsNode} from './editor/DebugJsNode';\n// import {ViewerHTMLController} from './editor/ViewerHTML';\n\nimport {EditorNodeInfoStoreController} from './editor/EditorNodeInfoStoreController';\n\nimport {SplitPanels} from './editor/SplitPanels';\nimport {CaptureForm} from './editor/CaptureForm';\nimport {CaptureResult} from './editor/CaptureResult';\nimport {ExportFormWeb} from './editor/ExportFormWeb';\nimport {ExportFormLocal} from './editor/ExportFormLocal';\nimport {ExportPanel} from './editor/ExportPanel';\nimport {EditorPanelAssetsListStoreController} from './editor/EditorPanelAssetsList';\nimport {preferences} from './editor/Preferences';\nimport {SaveWarnings} from './editor/SaveWarnings';\n\nimport {EngineNodeData} from '../modules/Engine';\nimport {CoreGraphNodeId} from '../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {LinkIndex} from '../../components/panels/common/LinkIndex';\nimport {NavigationHistoryStoreController} from './editor/NavigationHistoryController';\nimport {NavigationNodeListController} from './editor/NavigationNodeListController';\nimport {ROUTES_WITH_NO_MODAL} from '../../../routes';\n\ninterface CurrentNodeIdByLinkIndex {\n\t1: CoreGraphNodeId;\n\t2: CoreGraphNodeId;\n\t3: CoreGraphNodeId;\n\t4: CoreGraphNodeId;\n\t5: CoreGraphNodeId;\n\t6: CoreGraphNodeId;\n\t7: CoreGraphNodeId;\n\t8: CoreGraphNodeId;\n}\n\ninterface SetCurrentNodeOptions {\n\tpushToHistory: boolean;\n}\nexport class EditorStoreControllerClass {\n\t// private _store!: Store<State>;\n\tprivate _scene!: PolyScene;\n\n\tprivate _currentNodeId!: Ref<CurrentNodeIdByLinkIndex>;\n\t// private _rootSelected!: Ref<boolean>;\n\n\tpublic readonly clipboard = EditorClipboardStoreController;\n\tpublic readonly contextMenu = EditorContextMenuStoreController;\n\tpublic readonly dialogAbout = EditorDialogAboutStoreController;\n\tpublic readonly dialogWarnings = EditorDialogWarningsStoreController;\n\tpublic readonly dialogConfirm = EditorDialogConfirmStoreController;\n\t// public readonly dialog_desktop_login = EditorDialogDesktopLoginStoreController;\n\tpublic readonly dialogPrompt = EditorDialogPromptStoreController;\n\tpublic readonly dialogNotice = EditorDialogNoticeStoreController;\n\tpublic readonly dialogApiLogin = EditorDialogApiLoginStoreController;\n\t// public readonly dialog_api_export = EditorDialogApiExportStoreController;\n\tpublic readonly dialogWebGLCapabilities = EditorDialogWebGLCapabilitiesStoreController;\n\t// public readonly dialog_new_project = EditorDialogNewProjectStoreController;\n\tpublic readonly keyframeEditor = KeyframeEditorController;\n\tpublic readonly network = EditorNetworkStoreController;\n\tpublic readonly numericSlider = EditorNumericSliderStoreController;\n\tpublic readonly panel = EditorPanelStoreController;\n\tpublic readonly panelNodeSelector = EditorPanelNodeSelectorStoreController;\n\tpublic readonly panelFileSelector = EditorPanelFileSelectorStoreController;\n\tpublic readonly panelObjectMask = EditorPanelObjectMaskStoreController;\n\tpublic readonly panelSpareParams = EditorPanelSpareParamsEditorStoreController;\n\t// public readonly panelSceneSelector = EditorPanelSceneSelectorStoreController;\n\tpublic readonly paramsModals = EditorParamsModalsController;\n\tpublic readonly windowsLibrariesManager = EditorWindowsLibrariesManagerController;\n\tpublic readonly status = EditorStatusStoreController;\n\tpublic readonly uploads = EditorUploadsStoreController;\n\tpublic readonly userPlan = EditorUserPlanStoreController;\n\tpublic readonly nodeInfo = EditorNodeInfoStoreController;\n\tpublic readonly navigationHistory = NavigationHistoryStoreController;\n\tpublic readonly navigationNodeList = NavigationNodeListController;\n\tpublic readonly splitPanels = SplitPanels;\n\tpublic readonly captureForm = CaptureForm;\n\tpublic readonly captureResult = CaptureResult;\n\tpublic readonly exportFormWeb = ExportFormWeb;\n\tpublic readonly exportFormLocal = ExportFormLocal;\n\tpublic readonly exportPanel = ExportPanel;\n\tpublic readonly panelAssetsList = EditorPanelAssetsListStoreController;\n\tpublic readonly preferences = preferences;\n\tpublic readonly saveWarnings = SaveWarnings;\n\tpublic readonly currentUser = EditorCurrentUserController;\n\tpublic readonly polyNodeCreateForm = EditorPolyNodeCreateFormController;\n\tpublic readonly polyNodeUpdateForm = EditorPolyNodeUpdateFormController;\n\tpublic readonly marketplacePolyNodes = MarketplacePolyNodesController;\n\tpublic readonly commandPalette = EditorCommandPaletteStoreController;\n\tpublic readonly share = ShareController;\n\tpublic readonly multiPlayer = MultiPlayerController;\n\tpublic readonly tabMenu = TabMenuController;\n\tpublic readonly readonly = new SceneReadonlyController();\n\tpublic readonly docs = DocsController;\n\tpublic readonly debugJsNode = DebugJsNode;\n\n\tprivate static _instance: EditorStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\tsetScene(scene: PolyScene) {\n\t\tthis._scene = scene;\n\t\tthis.init();\n\t}\n\tget scene() {\n\t\treturn this._scene;\n\t}\n\n\tprivate init() {\n\t\tconst rootId = this.scene.root().graphNodeId();\n\t\tthis._currentNodeId = ref({\n\t\t\t1: rootId,\n\t\t\t2: rootId,\n\t\t\t3: rootId,\n\t\t\t4: rootId,\n\t\t\t5: rootId,\n\t\t\t6: rootId,\n\t\t\t7: rootId,\n\t\t\t8: rootId,\n\t\t});\n\t\tthis.keyframeEditor.init();\n\t}\n\treset() {\n\t\tthis.navigationHistory.reset();\n\t}\n\n\tanyModalOpen(route: RouteLocationNormalizedLoaded): boolean {\n\t\tconst matchedRoutes = route.matched;\n\t\tconst lastMatch = matchedRoutes[matchedRoutes.length - 1];\n\t\tconst atRoot = lastMatch != null && ROUTES_WITH_NO_MODAL.includes(lastMatch.path);\n\t\treturn (\n\t\t\tatRoot == false ||\n\t\t\tthis.dialogConfirm.displayed() ||\n\t\t\tthis.numericSlider.displayed() ||\n\t\t\tthis.tabMenu.displayed()\n\t\t);\n\t}\n\n\tcloseAllPopups() {\n\t\tthis.removeContextMenus();\n\t\t// this.dialog_alert.hide()\n\t\tthis.dialogConfirm.close();\n\t\t// this.dialog_prompt.hide()\n\t\tthis.numericSlider.close();\n\t\tthis.panelNodeSelector.close();\n\t\tthis.panelFileSelector.close();\n\t\tthis.windowsLibrariesManager.close();\n\t}\n\tremoveContextMenus() {\n\t\tthis.contextMenu.setNodeId(null);\n\t\tthis.contextMenu.setParamId(null);\n\t\tthis.navigationNodeList.close();\n\t}\n\n\t// getters\n\tcurrent_node_graph_id(linkIndex: LinkIndex): CoreGraphNodeId {\n\t\treturn this._currentNodeId.value[linkIndex];\n\t\t// return this._store.getters['editor/current_node_id'];\n\t}\n\t// rootSelected(): boolean {\n\t// \treturn this._rootSelected.value;\n\t// \t// return this._store.getters['editor/current_node_id'];\n\t// }\n\tcurrent_json_node(linkIndex: LinkIndex): EngineNodeData | null {\n\t\tconst id = this.current_node_graph_id(linkIndex);\n\t\tif (id) {\n\t\t\treturn StoreController.engine.json_node(id);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\tcurrentNode(linkIndex: LinkIndex): BaseNodeType {\n\t\tconst id = this.current_node_graph_id(linkIndex);\n\t\tif (id) {\n\t\t\tconst node = this._scene.graph.nodeFromId(id);\n\t\t\tif (node) {\n\t\t\t\treturn node as BaseNodeType;\n\t\t\t}\n\t\t}\n\t\treturn StoreController.scene.root();\n\t}\n\n\t// mutations\n\tsetCurrentNode(linkIndex: LinkIndex, node: BaseNodeType, options?: SetCurrentNodeOptions) {\n\t\tif (!node.childrenController) {\n\t\t\tconst parent = node.parent();\n\t\t\tif (parent) {\n\t\t\t\tthis.setCurrentNode(linkIndex, parent, options);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet pushToHistory = true;\n\t\tif (options) {\n\t\t\tpushToHistory = options.pushToHistory;\n\t\t}\n\t\tconst nodeId = node.graphNodeId();\n\t\tthis._currentNodeId.value[linkIndex] = nodeId;\n\t\tif (pushToHistory) {\n\t\t\tthis.navigationHistory.pushCurrentNode(linkIndex, node);\n\t\t}\n\t\tthis.multiPlayer.awareness.updatePath();\n\t}\n\t// selectRoot() {\n\t// \tthis.paramsModals.add(this.scene.root());\n\t// \t// this._rootSelected.value = true;\n\t// }\n\t// deselectRoot() {\n\t// \tthis._rootSelected.value = false;\n\t// }\n\tgoUp(linkIndex: LinkIndex) {\n\t\tconst parent = this.currentNode(linkIndex).parent();\n\t\tif (parent) {\n\t\t\tthis.setCurrentNode(linkIndex, parent);\n\t\t}\n\t}\n\tgoDown(linkIndex: LinkIndex) {\n\t\tconst node = this.currentNode(linkIndex);\n\t\tif (node.childrenAllowed() && node.childrenController) {\n\t\t\tconst childNode = node.childrenController.selection.nodeFromIndex(0);\n\t\t\tif (childNode && childNode.childrenAllowed()) {\n\t\t\t\tthis.setCurrentNode(linkIndex, childNode);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const EditorStoreController = EditorStoreControllerClass.instance();\n","import {AssetsHelper} from './../../core/AssetsHelper';\nimport {StringParam} from './../../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {ParamType} from './../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {EngineNodeData, EngineParamData} from '../modules/Engine';\nimport {BaseNodeType, EmitDataByNodeEventMap} from '../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseParamType} from '../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {NodeEvent} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeEvent';\nimport {CoreGraphNodeId} from '../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Ref, ref} from 'vue';\nimport {PolyDictionary} from '../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {StoreController} from './StoreController';\nimport {arrayCompact, arrayXOR} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {NodeSerializerData} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\n\nexport class EngineStoreControllerClass {\n\tprivate _scene!: PolyScene;\n\tprivate _frame: Ref<number> = ref(0);\n\tprivate _maxFrame: Ref<number> = ref(0);\n\tprivate _maxFrameLocked: Ref<boolean> = ref(false);\n\tprivate _realtimeState: Ref<boolean> = ref(false);\n\tprivate _playingState: Ref<boolean> = ref(false);\n\tprivate _nodesByGraphNodeId: Ref<PolyDictionary<EngineNodeData>> = ref({});\n\tprivate _params: Ref<PolyDictionary<EngineParamData>> = ref({});\n\n\tprivate static _instance: EngineStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EngineStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\tsetScene(scene: PolyScene) {\n\t\tthis._scene = scene;\n\t\tthis.update_scene();\n\t}\n\tget scene() {\n\t\treturn this._scene;\n\t}\n\n\tnode(id: CoreGraphNodeId): BaseNodeType | null {\n\t\treturn this._scene.graph.nodeFromId(id) as BaseNodeType;\n\t}\n\tparam(id: CoreGraphNodeId): BaseParamType | null {\n\t\treturn this._scene.graph.nodeFromId(id) as BaseParamType;\n\t}\n\n\t// getters\n\tjson_node(id: CoreGraphNodeId): EngineNodeData | null {\n\t\treturn this._nodesByGraphNodeId.value[id];\n\t}\n\tjson_param(id: CoreGraphNodeId): EngineParamData | null {\n\t\treturn this._params.value[id];\n\t}\n\tjson_children(id: CoreGraphNodeId): EngineNodeData[] {\n\t\tconst json_node = this.json_node(id);\n\t\tif (json_node) {\n\t\t\tconst children_ids = json_node.children;\n\t\t\tconst children = children_ids.map((children_id) => this._nodesByGraphNodeId.value[children_id]);\n\n\t\t\t// check if any resolves to null\n\t\t\tconst compacted_children: NodeSerializerData[] = [];\n\t\t\tarrayCompact(children, compacted_children);\n\t\t\tif (compacted_children.length !== children.length) {\n\t\t\t\tconsole.warn('some children resolved to null in engine/json_children!', children);\n\t\t\t}\n\t\t\t// updated_children_ids = lodash_map( compacted_children, (child)->child.graph_node_id )\n\t\t\t// POLY.store.commit 'engine/json_children_ids',\n\t\t\t// \tjson_node: json_node\n\t\t\t// \tchildren_ids: updated_children_ids\n\n\t\t\treturn compacted_children;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\tframe(): number {\n\t\treturn this._frame.value;\n\t}\n\tmaxFrame(): number {\n\t\treturn this._maxFrame.value;\n\t}\n\tmaxFrameLocked(): boolean {\n\t\treturn this._maxFrameLocked.value;\n\t}\n\trealtimeState(): boolean {\n\t\treturn this._realtimeState.value;\n\t}\n\tplaying_state(): boolean {\n\t\treturn this._playingState.value;\n\t}\n\n\t// mutations\n\t// scene mutations\n\tupdate_scene() {\n\t\tthis.update_frame();\n\t\tthis.update_frame_range();\n\t\tthis.update_realtimeState();\n\t\tthis.update_play_state();\n\n\t\tconst include_node_param_components = false;\n\t\tfor (const node of this._scene.nodesController.allNodes()) {\n\t\t\tconst nodeData = node.toJSON(include_node_param_components);\n\t\t\tif (nodeData) {\n\t\t\t\tthis._nodesByGraphNodeId.value[node.graphNodeId()] = nodeData;\n\t\t\t\tStoreController.editor.userPlan.incrementNodesCount();\n\t\t\t}\n\t\t}\n\n\t\tthis._params.value = {}; //json.params_by_graph_node_id;\n\t}\n\tupdate_frame() {\n\t\tthis._frame.value = this._scene.frame();\n\t\t// this._store.commit(`engine/${EngineMutation.SCENE_FRAME_UPDATED}`);\n\t}\n\tupdate_frame_range() {\n\t\tthis._maxFrame.value = this._scene.timeController.maxFrame();\n\t\tthis._maxFrameLocked.value = this._scene.timeController.maxFrameLocked();\n\t\t// this._store.commit(`engine/${EngineMutation.SCENE_FRAME_RANGE_UPDATED}`);\n\t}\n\tupdate_realtimeState() {\n\t\tthis._realtimeState.value = this._scene.timeController.realtimeState();\n\t}\n\tupdate_play_state() {\n\t\tthis._playingState.value = this._scene.timeController.playing();\n\t}\n\n\t// node mutations\n\tprivate _nodeAndJson(node_id: CoreGraphNodeId) {\n\t\tconst node = this.node(node_id);\n\t\tconst jsonNode = this.json_node(node_id);\n\t\treturn {node, jsonNode};\n\t}\n\tupdate_node_error(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.error_message = node.states.error.message();\n\t}\n\tupdate_node_ui_data_position(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.ui_data_json.x = node.uiData.position().x;\n\t\tjsonNode.ui_data_json.y = node.uiData.position().y;\n\t}\n\tupdate_node_ui_data_comment(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.ui_data_json.comment = node.uiData.comment();\n\t}\n\tupdate_node_selection(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(node.childrenAllowed() && node.childrenController)) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.selection = jsonNode.selection || [];\n\t\tnode.childrenController.selection.toJSON(jsonNode.selection);\n\t\t// if (!jsonNode.selection) {\n\t\t// \treturn;\n\t\t// }\n\t\t// while (jsonNode.selection.pop()) {}\n\t\t// const new_ids = node.childrenController.selection.toJSON();\n\t\t// for (let id of new_ids) {\n\t\t// \tjsonNode.selection.push(id);\n\t\t// }\n\t}\n\tupdate_node_display_flag(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.flags == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.flags.display == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (jsonNode.flags == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (jsonNode.flags.display == null) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.flags.display = node.flags.display.active();\n\t}\n\tupdate_node_bypass_flag(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.flags == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.flags.bypass == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (jsonNode.flags == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (jsonNode.flags.bypass == null) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.flags.bypass = node.flags.bypass.active();\n\t}\n\tupdate_node_optimize_flag(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.flags == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.flags.optimize == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (jsonNode.flags == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (jsonNode.flags.optimize == null) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.flags.optimize = node.flags.optimize.active();\n\t}\n\tupdate_node_name(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.name = node.name();\n\t}\n\tupdate_node_inputs(node_id: CoreGraphNodeId) {\n\t\tthis._updateNodeInputsAndOutputs(node_id);\n\t}\n\tupdate_node_clonable_state(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.override_cloned_state_allowed = node.io.inputs.overrideClonedStateAllowed();\n\t\tjsonNode.inputs_clone_required_states = node.io.inputs.cloneRequiredStates();\n\t}\n\tupdate_node_named_inputs(node_id: CoreGraphNodeId) {\n\t\tthis._updateNodeInputsAndOutputs(node_id);\n\t}\n\tupdate_node_named_outputs(node_id: CoreGraphNodeId) {\n\t\tthis._updateNodeInputsAndOutputs(node_id);\n\t}\n\tupdatePolyNodeLockState(nodeId: CoreGraphNodeId) {\n\t\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\t\tconst node = StoreController.engine.node(nodeId);\n\t\tif (jsonNode && node) {\n\t\t\tjsonNode.polyNode = jsonNode.polyNode || {locked: false};\n\t\t\tjsonNode.polyNode.locked = node.polyNodeController?.locked() || false;\n\t\t}\n\t}\n\taddNodeParamsToStore(nodeId: CoreGraphNodeId) {\n\t\tconst node = this.node(nodeId);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let param of node.params.all) {\n\t\t\tconst paramId = param.graphNodeId();\n\t\t\tif (!this._params.value[paramId]) {\n\t\t\t\tconst paramJSON = param.toJSON();\n\t\t\t\tif (paramJSON) {\n\t\t\t\t\tthis._params.value[paramId] = paramJSON;\n\t\t\t\t}\n\t\t\t\tif (param.components) {\n\t\t\t\t\tfor (let component of param.components) {\n\t\t\t\t\t\tconst componentId = component.graphNodeId();\n\t\t\t\t\t\tconst componentJSON = component.toJSON();\n\t\t\t\t\t\tif (componentJSON) {\n\t\t\t\t\t\t\tthis._params.value[componentId] = componentJSON;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tupdateParams(nodeId: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(nodeId);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tconst include_node_param_components = false;\n\t\tif (!node.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tconst newIds = node.serializer.to_json_params(include_node_param_components);\n\t\t// const idsToKeep = ArrayUtils.intersection(jsonNode.param_ids, newIds);\n\t\tconst idsToRemove: number[] = [];\n\t\tarrayXOR(jsonNode.param_ids, newIds, idsToRemove);\n\t\tfor (let param_id of idsToRemove) {\n\t\t\tdelete this._params.value[param_id];\n\t\t}\n\n\t\tjsonNode.param_ids = newIds;\n\t\tfor (let param of node.params.all) {\n\t\t\tconst paramId = param.graphNodeId();\n\t\t\tthis._params.value[paramId] = this._params.value[paramId] || param.toJSON();\n\t\t\tif (param.components) {\n\t\t\t\tfor (let component of param.components) {\n\t\t\t\t\tconst componentId = component.graphNodeId();\n\t\t\t\t\tthis._params.value[componentId] = this._params.value[componentId] || component.toJSON();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\taddNode(node_id: CoreGraphNodeId, data: EmitDataByNodeEventMap[NodeEvent.CREATED]) {\n\t\t// this._commit(EngineMutation.NODE_CREATED, {parent_id: node_id, child_node_json: data.child_node_json});\n\t\tStoreController.editor.userPlan.incrementNodesCount();\n\n\t\tconst parent_node_id = node_id;\n\t\tconst parent_node = StoreController.engine.node(parent_node_id);\n\t\tif (parent_node) {\n\t\t\tconst child_node_json = data.child_node_json;\n\n\t\t\tthis._nodesByGraphNodeId.value[child_node_json.graph_node_id] = child_node_json;\n\t\t\tconst parent_data = this._nodesByGraphNodeId.value[parent_node.graphNodeId()];\n\t\t\tparent_data.children.push(child_node_json.graph_node_id);\n\t\t}\n\t}\n\tdeleteNode(node_id: CoreGraphNodeId, data: EmitDataByNodeEventMap[NodeEvent.DELETED]) {\n\t\tStoreController.editor.userPlan.decrementNodesCount();\n\n\t\tconst parent_node_id = data.parent_id;\n\t\tconst parent_data = this._nodesByGraphNodeId.value[parent_node_id];\n\t\tif (parent_data) {\n\t\t\tconst child_id = node_id;\n\n\t\t\tconst index = parent_data.children.indexOf(child_id);\n\t\t\tparent_data.children.splice(index, 1);\n\n\t\t\tdelete this._nodesByGraphNodeId.value[child_id];\n\t\t\t// Vue.delete(state.nodes_by_graph_node_id, child_id);\n\t\t}\n\t}\n\n\t// params\n\tprivate _paramAndJson(param_id: CoreGraphNodeId) {\n\t\tconst param = StoreController.engine.param(param_id);\n\t\tconst paramJson = this._params.value[param_id];\n\t\treturn {param, paramJson};\n\t}\n\tupdate_param_raw_input(param_id: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(param_id);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!param.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tparamJson.raw_input = param.serializer.rawInput();\n\t}\n\tupdate_param_value(param_id: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(param_id);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!param.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tparamJson.value = param.serializer.value();\n\t}\n\tupdate_param_expression(param_id: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(param_id);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!param.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tparamJson.expression = param.serializer.expression();\n\t}\n\tupdate_param_error(param_id: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(param_id);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!param.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tparamJson.error_message = param.serializer.error_message();\n\t}\n\tupdate_param_visible_state(param_id: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(param_id);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!param.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tparamJson.is_visible = param.serializer.is_visible();\n\t}\n\tupdate_param_editable_state(param_id: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(param_id);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!param.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tparamJson.editable = param.serializer.editable();\n\t}\n\treloadParamAsset(paramId: CoreGraphNodeId) {\n\t\tconst {param, paramJson} = this._paramAndJson(paramId);\n\t\tif (!(param && paramJson)) {\n\t\t\treturn;\n\t\t}\n\t\tif (param.type() != ParamType.STRING) {\n\t\t\treturn;\n\t\t}\n\t\tconst stringParam = param as StringParam;\n\t\tAssetsHelper.reloadParam(stringParam);\n\t}\n\n\tprivate _updateNodeInputsAndOutputs(node_id: CoreGraphNodeId) {\n\t\tconst {node, jsonNode} = this._nodeAndJson(node_id);\n\t\tif (!(node && jsonNode)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!node.serializer) {\n\t\t\treturn;\n\t\t}\n\t\tjsonNode.maxInputsCount = node.serializer.maxInputsCount();\n\t\tjsonNode.inputs = node.serializer.inputIds();\n\t\tjsonNode.input_connection_output_indices = node.serializer.inputConnectionOutputIndices();\n\t\tjsonNode.named_input_connection_points = node.serializer.namedInputConnectionPoints() || [];\n\t\tjsonNode.named_output_connection_points = node.serializer.namedOutputConnectionPoints() || [];\n\t}\n}\n\nexport const EngineStoreController = EngineStoreControllerClass.instance();\n","// import { ActorJsSopNode } from '../../../../@polygonjs/polygonjs/src/engine/nodes/sop/ActorJs';\nimport {\n\tnodeMethodName,\n\tgetInputIndices,\n\tmethodNameData,\n} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorAssemblerUtils';\nimport {NodeContext} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n// import {CoreType} from '../../../../@polygonjs/polygonjs/src/core/Type';\nimport {ActorEvaluator} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {BaseJsNodeType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/_Base';\nimport {ActorBuilderNode} from '../../../../@polygonjs/polygonjs/src/engine/scene/utils/ActorsManager';\nimport {TypedNodeConnection} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\nimport {SceneConnectionTriggerDispatcher} from '../../../../@polygonjs/polygonjs/src/engine/scene/utils/events/ConnectionTriggerDispatcher';\nimport {JsConnectionPointType} from '../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/Js';\nimport {ArrayUtils} from '../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {setToArray} from '../../../../@polygonjs/polygonjs/src/core/SetUtils';\n\nconst lastFrameTriggeredByConnection: WeakMap<TypedNodeConnection<NodeContext.JS>, number> = new WeakMap();\nfunction _highlightConnections(\n\ttime: number,\n\tdispatcher: SceneConnectionTriggerDispatcher,\n\tconnections: TypedNodeConnection<NodeContext.JS>[],\n\tinputIndex: number\n) {\n\tfor (let connection of connections) {\n\t\tif (connection.inputIndex() == inputIndex) {\n\t\t\tconst lastFrame = lastFrameTriggeredByConnection.get(connection);\n\t\t\t// ensure we only dispatch once per frame,\n\t\t\t// as this could be otherwise dispatch as many times\n\t\t\t// as a geometry has points, when using the sop/actorPoint\n\t\t\tif (lastFrame == null || time != lastFrame) {\n\t\t\t\tdispatcher.dispatchTrigger(connection);\n\t\t\t\tlastFrameTriggeredByConnection.set(connection, time);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _getConnectionsToTrigger(node: ActorBuilderNode, methodName: string): TypedNodeConnection<NodeContext.JS>[] {\n\tconst triggeringNodes = triggeringChildren(node, methodName);\n\n\tconst triggerData = methodNameData(methodName);\n\n\tconst connections: Set<TypedNodeConnection<NodeContext.JS>> = new Set();\n\tfor (let triggeringNode of triggeringNodes) {\n\t\tconst indices = getInputIndices(triggeringNode, (c) => {\n\t\t\treturn c.type() == JsConnectionPointType.TRIGGER && c.name() == triggerData.outputName;\n\t\t});\n\t\tconst nodeInputConnections: TypedNodeConnection<NodeContext.JS>[] = [];\n\t\tArrayUtils.compact(\n\t\t\tindices.map((i) => triggeringNode.io.connections.inputConnection(i)),\n\t\t\tnodeInputConnections\n\t\t);\n\t\tfor (let connection of nodeInputConnections) {\n\t\t\tconnections.add(connection);\n\t\t}\n\t}\n\treturn setToArray(connections, []);\n}\n\n// https://flaviocopes.com/how-to-list-object-methods-javascript/\nconst getMethods = (obj: any): string[] => {\n\tlet properties = new Set();\n\tlet currentObj = obj;\n\tdo {\n\t\tObject.getOwnPropertyNames(currentObj).map((item) => properties.add(item));\n\t} while ((currentObj = Object.getPrototypeOf(currentObj)));\n\treturn [...properties.keys()].filter((item) => typeof obj[item as any] === 'function') as string[];\n};\n\nfunction triggeringChildren(node: ActorBuilderNode, methodName: string) {\n\tconst nodes: BaseJsNodeType[] = [];\n\tconst triggerData = methodNameData(methodName);\n\tnode.childrenController?.traverseChildren((child) => {\n\t\tif (\n\t\t\tchild.context() == NodeContext.JS &&\n\t\t\tnodeMethodName(child as BaseJsNodeType) == triggerData.methodNameWithoutOutputName\n\t\t) {\n\t\t\tnodes.push(child as BaseJsNodeType);\n\t\t}\n\t});\n\treturn nodes;\n}\nexport class ActorEvaluatorWrapper {\n\tstatic wrap(evaluator: ActorEvaluator): ActorEvaluator {\n\t\tconst node = evaluator.node;\n\t\tconst scene = node.scene();\n\t\tconst timeUniform = scene.timeController.timeUniform();\n\t\tconst dispatcher = node.scene().eventsDispatcher.connectionTriggerDispatcher;\n\t\tconst functionNames = getMethods(evaluator);\n\t\tconst connectionsByMethodName: Map<string, TypedNodeConnection<NodeContext.JS>[]> = new Map();\n\t\tfor (let methodName of functionNames) {\n\t\t\tconst connections = _getConnectionsToTrigger(node, methodName);\n\t\t\tconnectionsByMethodName.set(methodName, connections);\n\t\t}\n\t\tfor (let methodName of functionNames) {\n\t\t\tconst method = evaluator[methodName as keyof ActorEvaluator] as Function;\n\t\t\tif (method) {\n\t\t\t\tconst currentMethod = method.bind(evaluator);\n\n\t\t\t\tconst connections = connectionsByMethodName.get(methodName);\n\t\t\t\tif (connections != null && connections.length > 0) {\n\t\t\t\t\t// only replace method if we find nodes matching the method name\n\t\t\t\t\t(evaluator as any)[methodName] = (inputIndex: number) => {\n\t\t\t\t\t\t_highlightConnections(timeUniform.value, dispatcher, connections, inputIndex);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcurrentMethod(methodName);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.warn(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn evaluator;\n\t}\n}\n","import {CoreGraphNode} from '../../../../@polygonjs/polygonjs/src/core/graph/CoreGraphNode';\nimport {SceneEvent} from '../../../../@polygonjs/polygonjs/src/engine/poly/SceneEvent';\nimport {NodeEvent} from '../../../../@polygonjs/polygonjs/src/engine/poly/NodeEvent';\nimport {ParamEvent} from '../../../../@polygonjs/polygonjs/src/engine/poly/ParamEvent';\nimport {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {AppSceneLoader} from '../../../config/AppSceneLoader';\n\nimport {EditorStoreController, EditorStoreControllerClass} from './EditorStoreController';\nimport {EngineStoreController, EngineStoreControllerClass} from './EngineStoreController';\n// import {State} from '../Store';\nimport {AVAILABLE_LINK_INDEX_VALUES} from '../../components/panels/common/LinkIndex';\nimport {ActorEvaluator} from '../../../../@polygonjs/polygonjs/src/engine/nodes/js/code/assemblers/actor/ActorEvaluator';\nimport {ActorEvaluatorWrapper} from '../../core/actor/ActorEvaluatorWrapper';\nimport {DebugLinesContainer} from '../../../../@polygonjs/polygonjs/src/engine/scene/utils/DispatchController';\n\nclass StoreControllerClass {\n\tprivate static _instance: StoreControllerClass;\n\tprivate _scene!: PolyScene;\n\n\tpublic readonly editor: EditorStoreControllerClass = EditorStoreController;\n\tpublic readonly engine: EngineStoreControllerClass = EngineStoreController;\n\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new StoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\tsetScene(scene: PolyScene) {\n\t\t// If we already have a scene,\n\t\t// we can assume that things will pile up in memory.\n\t\t// So we do a full page reload for now\n\t\t// console.log(scene, this._scene, scene != this._scene, scene !== this._scene);\n\t\tif (this._scene && scene.name() != this._scene.name() && AppSceneLoader.onlyASingleScenePerPage()) {\n\t\t\tconsole.log('force page reload');\n\t\t\twindow.location.reload();\n\t\t\treturn;\n\t\t}\n\n\t\tthis._scene = scene;\n\t\tthis._scene.dispatchController.setListener(this);\n\t\tthis.editor.setScene(scene);\n\t\tthis.engine.setScene(scene);\n\n\t\tAVAILABLE_LINK_INDEX_VALUES.forEach((linkIndex) => {\n\t\t\tthis.editor.setCurrentNode(linkIndex, scene.root(), {pushToHistory: false});\n\t\t});\n\t}\n\tget scene() {\n\t\treturn this._scene;\n\t}\n\t// async save_scene() {\n\t// \tEditor.instance().save();\n\t// }\n\t// async new_scene() {\n\t// \tEditor.instance().new_scene();\n\t// }\n\n\t// set_store() {\n\t// \t// (window as any).store = store;\n\t// \t// this.editor.set_store();\n\t// \t// this.engine.set_store(store);\n\t// }\n\n\tcloseAllPopups() {\n\t\tthis.editor.closeAllPopups();\n\t}\n\n\tprocessEvents(emitter: CoreGraphNode, event_name: SceneEvent | NodeEvent | ParamEvent, data?: any): void {\n\t\tconst id = emitter.graphNodeId();\n\t\tswitch (event_name) {\n\t\t\t// scene events\n\t\t\tcase SceneEvent.FRAME_UPDATED:\n\t\t\t\treturn this.engine.update_frame();\n\t\t\tcase SceneEvent.MAX_FRAME_UPDATED:\n\t\t\t\treturn this.engine.update_frame_range();\n\t\t\tcase SceneEvent.REALTIME_STATUS_UPDATED:\n\t\t\t\treturn this.engine.update_realtimeState();\n\t\t\tcase SceneEvent.PLAY_STATE_UPDATED:\n\t\t\t\treturn this.engine.update_play_state();\n\n\t\t\t// node events\n\t\t\tcase NodeEvent.ERROR_UPDATED:\n\t\t\t\treturn this.engine.update_node_error(id);\n\t\t\tcase NodeEvent.UI_DATA_POSITION_UPDATED:\n\t\t\t\treturn this.engine.update_node_ui_data_position(id);\n\t\t\tcase NodeEvent.UI_DATA_COMMENT_UPDATED:\n\t\t\t\treturn this.engine.update_node_ui_data_comment(id);\n\t\t\tcase NodeEvent.SELECTION_UPDATED:\n\t\t\t\treturn this.engine.update_node_selection(id);\n\t\t\tcase NodeEvent.FLAG_DISPLAY_UPDATED:\n\t\t\t\treturn this.engine.update_node_display_flag(id);\n\t\t\tcase NodeEvent.FLAG_BYPASS_UPDATED:\n\t\t\t\treturn this.engine.update_node_bypass_flag(id);\n\t\t\tcase NodeEvent.FLAG_OPTIMIZE_UPDATED:\n\t\t\t\treturn this.engine.update_node_optimize_flag(id);\n\t\t\tcase NodeEvent.NAME_UPDATED:\n\t\t\t\treturn this.engine.update_node_name(id);\n\t\t\tcase NodeEvent.INPUTS_UPDATED:\n\t\t\t\treturn this.engine.update_node_inputs(id);\n\t\t\tcase NodeEvent.OVERRIDE_CLONABLE_STATE_UPDATE:\n\t\t\t\treturn this.engine.update_node_clonable_state(id);\n\t\t\tcase NodeEvent.NAMED_INPUTS_UPDATED:\n\t\t\t\treturn this.engine.update_node_named_inputs(id);\n\t\t\tcase NodeEvent.NAMED_OUTPUTS_UPDATED:\n\t\t\t\treturn this.engine.update_node_named_outputs(id);\n\t\t\tcase NodeEvent.PARAMS_UPDATED:\n\t\t\t\treturn this.engine.updateParams(id);\n\t\t\tcase NodeEvent.CREATED:\n\t\t\t\treturn this.engine.addNode(id, data);\n\t\t\tcase NodeEvent.DELETED:\n\t\t\t\treturn this.engine.deleteNode(id, data);\n\t\t\tcase NodeEvent.POLY_NODE_LOCK_STATE_UPDATED:\n\t\t\t\treturn this.engine.updatePolyNodeLockState(id);\n\n\t\t\t// param events\n\t\t\tcase ParamEvent.RAW_INPUT_UPDATED:\n\t\t\t\treturn this.engine.update_param_raw_input(id);\n\t\t\tcase ParamEvent.VALUE_UPDATED:\n\t\t\t\treturn this.engine.update_param_value(id);\n\t\t\tcase ParamEvent.EXPRESSION_UPDATED:\n\t\t\t\treturn this.engine.update_param_expression(id);\n\t\t\tcase ParamEvent.ERROR_UPDATED:\n\t\t\t\treturn this.engine.update_param_error(id);\n\t\t\tcase ParamEvent.VISIBLE_UPDATED:\n\t\t\t\treturn this.engine.update_param_visible_state(id);\n\t\t\tcase ParamEvent.EDITABLE_UPDATED:\n\t\t\t\treturn this.engine.update_param_editable_state(id);\n\t\t\tcase ParamEvent.ASSET_RELOAD_REQUEST:\n\t\t\t\treturn this.engine.reloadParamAsset(id);\n\t\t}\n\t}\n\tprocessActorEvaluator(evaluator: ActorEvaluator): ActorEvaluator {\n\t\treturn ActorEvaluatorWrapper.wrap(evaluator);\n\t}\n\tactorEvaluatorDebug(options: DebugLinesContainer) {\n\t\tthis.editor.debugJsNode.actorEvaluatorDebug(options);\n\t}\n}\n\nexport const StoreController = StoreControllerClass.instance();\n","import {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {ref, Ref} from 'vue';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ModalStyle} from '../../../core/Modal';\nimport {EditorProps} from '../../../types';\nimport {CoreType} from '../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {StoreController} from '../StoreController';\n\ninterface ParamModalData {\n\tnodeId: CoreGraphNodeId;\n\tstyle: ModalStyle;\n}\ninterface ParamModalDataJSON {\n\tnodePath: string;\n\tstyle: ModalStyle;\n}\n\nexport function modalHeight(desiredHeight: number) {\n\treturn Math.min(desiredHeight, window.innerHeight * 0.6);\n}\n\nfunction createDefaultStyle(): ModalStyle {\n\tconst size = {x: 600, y: modalHeight(650)};\n\tconst style: ModalStyle = {\n\t\tleft: window.innerWidth * 0.5 - size.x * 0.5,\n\t\ttop: 200,\n\t\twidth: size.x,\n\t\theight: size.y,\n\t};\n\treturn style;\n}\n// const DEBUG: ParamModalData = {\n// \tnodeId: 276,\n// \tstyle: createDefaultStyle(),\n// };\n\nexport type ParamModalLayoutJSON = ParamModalDataJSON[];\nexport class EditorParamsModalsControllerClass {\n\tprivate static _instance: EditorParamsModalsControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorParamsModalsControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tprivate _list: Ref<ParamModalData[]> = ref([]);\n\t// init() {\n\t// \tthis._list\n\t// }\n\n\t// getters\n\tlist(): ParamModalData[] {\n\t\treturn this._list.value;\n\t}\n\tmodalStyle(node: BaseNodeType) {\n\t\tconst index = this._getIndex(node);\n\t\tif (index < 0) {\n\t\t\treturn;\n\t\t}\n\t\treturn this._list.value[index].style;\n\t}\n\ttoJSON(): ParamModalLayoutJSON {\n\t\tconst json: ParamModalLayoutJSON = [];\n\t\tfor (let e of this._list.value) {\n\t\t\tconst node = StoreController.engine.node(e.nodeId);\n\t\t\tif (node) {\n\t\t\t\tconst elem = {\n\t\t\t\t\tnodePath: node.path(),\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\ttop: e.style.top,\n\t\t\t\t\t\tleft: e.style.left,\n\t\t\t\t\t\twidth: e.style.width,\n\t\t\t\t\t\theight: e.style.height,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tjson.push(elem);\n\t\t\t}\n\t\t}\n\t\treturn json;\n\t}\n\tfromJSON(json: ParamModalLayoutJSON) {\n\t\tif (!CoreType.isArray(json)) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let element of json) {\n\t\t\tif (element.nodePath != null && element.style != null) {\n\t\t\t\tconst node = StoreController.engine.scene.node(element.nodePath);\n\t\t\t\tif (node) {\n\t\t\t\t\tconst style = element.style;\n\t\t\t\t\tif (style.top != null && style.left != null && style.width != null && style.height != null) {\n\t\t\t\t\t\tthis._list.value.push({\n\t\t\t\t\t\t\tnodeId: node.graphNodeId(),\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\ttop: style.top,\n\t\t\t\t\t\t\t\tleft: style.left,\n\t\t\t\t\t\t\t\twidth: style.width,\n\t\t\t\t\t\t\t\theight: style.height,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsetFromEditor(props: EditorProps) {\n\t\tconst paramsModal = props.paramsModal;\n\t\tif (paramsModal == null) {\n\t\t\treturn;\n\t\t}\n\t\tthis.fromJSON(paramsModal);\n\t}\n\n\t// mutations\n\tadd(node: BaseNodeType, style?: Partial<ModalStyle>): void {\n\t\t// we first need to to remove it, in case it is already present\n\t\t// as it would lead to duplicate modals\n\t\tthis.remove(node);\n\t\tconst newStyle = {\n\t\t\t...createDefaultStyle(),\n\t\t\t...style,\n\t\t};\n\n\t\tthis._list.value.push({\n\t\t\tnodeId: node.graphNodeId(),\n\t\t\tstyle: newStyle,\n\t\t});\n\t}\n\tremove(node: BaseNodeType): ParamModalData | undefined {\n\t\tconst index = this._getIndex(node);\n\t\tif (index < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst removedElements = this._list.value.splice(index, 1);\n\t\treturn removedElements[0];\n\t}\n\tasync updateStyle(node: BaseNodeType, newStyle: ModalStyle) {\n\t\tconst index = this._getIndex(node);\n\t\tif (index < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst style = this._list.value[index].style;\n\t\tstyle.top = newStyle.top;\n\t\tstyle.left = newStyle.left;\n\t\tstyle.width = newStyle.width;\n\t\tstyle.height = newStyle.height;\n\t}\n\tprivate _getIndex(node: BaseNodeType) {\n\t\treturn this._list.value.map((e) => e.nodeId).indexOf(node.graphNodeId());\n\t}\n\n\tmoveToFront(node: BaseNodeType) {\n\t\tconst removedElement = this.remove(node);\n\t\tif (removedElement) {\n\t\t\tthis.add(node, removedElement.style);\n\t\t}\n\t}\n}\n\nexport const EditorParamsModalsController = EditorParamsModalsControllerClass.instance();\n","import {ref, Ref} from 'vue';\n\nexport enum StatusType {\n\tDEFAULT = 'default',\n\tLOADING = 'loading',\n\tALERT = 'alert',\n\tWARNING = 'warning',\n}\nexport interface EditorStatusState {\n\ttype: StatusType;\n\tmessage: string;\n}\n\nexport class EditorStatusStoreControllerClass {\n\t// private _store!: Store<State>;\n\tprivate _type: Ref<StatusType> = ref(StatusType.DEFAULT);\n\tprivate _message: Ref<string> = ref('');\n\tprivate _autoClear: Ref<boolean> = ref(true);\n\n\tprivate static _instance: EditorStatusStoreControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorStatusStoreControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\ttype() {\n\t\treturn this._type.value;\n\t}\n\tmessage(): string {\n\t\treturn this._message.value;\n\t}\n\tautoClear() {\n\t\treturn this._autoClear.value;\n\t}\n\n\t// methods\n\thide() {\n\t\tthis.setMessage('');\n\t}\n\tsetMessage(message: string) {\n\t\tthis._autoClear.value = true;\n\t\tthis._message.value = message;\n\t\tthis._type.value = StatusType.DEFAULT;\n\t}\n\tsetLoading(message: string) {\n\t\tthis._autoClear.value = false;\n\t\tthis._message.value = message;\n\t\tthis._type.value = StatusType.LOADING;\n\t}\n\tsetError(message: string) {\n\t\tthis._autoClear.value = false;\n\t\tthis._message.value = message;\n\t\tthis._type.value = StatusType.ALERT;\n\t}\n\tsetWarning(message: string) {\n\t\tthis._autoClear.value = false;\n\t\tthis._message.value = message;\n\t\tthis._type.value = StatusType.WARNING;\n\t}\n}\n\nexport const EditorStatusStoreController = EditorStatusStoreControllerClass.instance();\n","// import { BaseObject } from '../../../components/panels/animation/keyframeEditorSceneController/objects/_Base';\nimport {AVAILABLE_LINK_INDEX_VALUES} from '../../../components/panels/common/LinkIndex';\nimport {CoreGraphNodeId} from '../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\nimport {router, closeModals, nodePathToUrl, nodeUrlToPath} from '../../../../routes';\nimport {Ref, ref, computed, watch, ComputedRef} from 'vue';\nimport {StoreController} from '../StoreController';\nimport {\n\tARRAY_SIZE_BY_TYPE,\n\tAVAILABLE_JS_CONNECTION_POINT_TYPES,\n\tCHANNEL_SUFFIX_BY_CHANNEL_INDEX,\n\tKeyframesJsNode,\n} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/js/Keyframes';\nimport {BaseParamType} from '../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {\n\tChannelDataByName,\n\tChannelData,\n\tKeyframeData,\n\tChannelInterpolation,\n} from '../../../../../@polygonjs/polygonjs/src/core/keyframes/KeyframeCommon';\nimport {channelDataFromString} from '../../../../../@polygonjs/polygonjs/src/core/keyframes/KeyframeSerialize';\nimport {TailwindColor} from '../../../core/Tailwind';\nimport {BaseObjectSelectionData} from '../../../components/panels/animation/keyframeEditorSceneController/common/Common';\nimport {JsType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Js';\n\nexport const CHANNEL_TAILWIND_COLORS: TailwindColor[] = [\n\t// TailwindColor.SLATE,\n\t// TailwindColor.GRAY,\n\t// TailwindColor.ZINC,\n\t// TailwindColor.NEUTRAL,\n\t// TailwindColor.STONE,\n\tTailwindColor.RED,\n\tTailwindColor.ORANGE,\n\tTailwindColor.AMBER,\n\tTailwindColor.YELLOW,\n\tTailwindColor.LIME,\n\tTailwindColor.GREEN,\n\tTailwindColor.EMERALD,\n\tTailwindColor.TEAL,\n\tTailwindColor.CYAN,\n\tTailwindColor.SKY,\n\tTailwindColor.BLUE,\n\tTailwindColor.INDIGO,\n\tTailwindColor.VIOLET,\n\tTailwindColor.PURPLE,\n\tTailwindColor.FUCHSIA,\n\tTailwindColor.PINK,\n\tTailwindColor.ROSE,\n];\n\ninterface EditorPanelSpareParamsEditorOptions {\n\tnode: BaseNodeType;\n}\ntype ColorValue = 400 | 500 | 600 | 700;\nexport const COLOR_VALUES_BY_SUBCHANNEL_INDEX: ColorValue[] = [400, 500, 600, 700];\nexport type KeyframeIndices = number[];\nexport type KeyframeIndicesByChannelIndex = KeyframeIndices[];\nexport type KeyframeIndicesBySubChannelByChannelIndex = KeyframeIndicesByChannelIndex[];\nexport type KeyframeIndicesBySubChannelIndexByChannelIndexByNodeId = Record<\n\tCoreGraphNodeId,\n\tKeyframeIndicesBySubChannelByChannelIndex\n>;\n\ninterface ChannelDisplayStateOption {\n\tnodeId: CoreGraphNodeId;\n\tchannelIndex: number;\n\tsubChannelIndex: number;\n}\n\nfunction setArraySize<T>(target: Array<T>, expectedLength: number, createElement: () => T) {\n\tif (target.length < expectedLength) {\n\t\tfor (let j = target.length; j < expectedLength; j++) {\n\t\t\ttarget.push(createElement());\n\t\t}\n\t}\n}\nfunction _createEmptyArray<T>(count: number, createElement: () => T): Array<T> {\n\treturn new Array(count).fill(1).map(createElement);\n}\n\nconst _channelDataByChanneIndexByNodeId: Map<CoreGraphNodeId, ChannelData[][]> = new Map();\nfunction _createEmptyChannelData(): ChannelData {\n\treturn {keyframes: [], interpolation: ChannelInterpolation.CUBIC};\n}\nfunction _createEmptyChannels(count: number) {\n\treturn _createEmptyArray(count, _createEmptyChannelData);\n}\n\nexport function jsKeyframeChannelsCount(nodeId: CoreGraphNodeId): number {\n\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\tif (jsonNode) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\tif (node) {\n\t\t\tconst channelsCountParamId = node.p.channelsCount.graphNodeId();\n\t\t\tconst jsonChannelsCountParam = StoreController.engine.json_param(channelsCountParamId);\n\t\t\tconst channelsCount: number = jsonChannelsCountParam ? (jsonChannelsCountParam.value as number) : 0;\n\t\t\treturn channelsCount;\n\t\t}\n\t}\n\treturn 0;\n}\ninterface JsKeyframeSubChannelsCountOptions {\n\tnode: KeyframesJsNode;\n\tchannelIndex: number;\n}\nexport function jsKeyframeSubChannelsCount(options: JsKeyframeSubChannelsCountOptions): number {\n\tconst {node, channelIndex} = options;\n\tconst typeParams = node.channelTypeParams();\n\tconst typeValue = _paramJsonValue(typeParams[channelIndex], DEFAULT_TYPE_VALUE);\n\tconst channelType = AVAILABLE_JS_CONNECTION_POINT_TYPES[typeValue];\n\tconst arrayElementsCount = ARRAY_SIZE_BY_TYPE[channelType];\n\treturn arrayElementsCount;\n}\ninterface JsKeyframeSubChannelsCountFromNodeIdOptions {\n\tnodeId: CoreGraphNodeId;\n\tchannelIndex: number;\n}\nexport function jsKeyframeSubChannelsCountFromNodeId(options: JsKeyframeSubChannelsCountFromNodeIdOptions): number {\n\tconst {nodeId, channelIndex} = options;\n\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\tif (jsonNode) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\tif (node) {\n\t\t\treturn jsKeyframeSubChannelsCount({node, channelIndex});\n\t\t}\n\t}\n\treturn 0;\n}\nexport interface SubChannelNameOptions {\n\tchannelName: string;\n\tsubChannelIndex: number;\n}\nfunction subChannelName(options: SubChannelNameOptions): string {\n\treturn `${options.channelName}.${CHANNEL_SUFFIX_BY_CHANNEL_INDEX[options.subChannelIndex]}`;\n}\nfunction _paramJsonValue<T>(param: BaseParamType, defaultValue: T): T {\n\tconst paramId = param.graphNodeId();\n\tconst jsonParam = StoreController.engine.json_param(paramId);\n\treturn jsonParam ? (jsonParam.value as T) : defaultValue;\n}\n// export function channelNamesForNodeId(nodeId: CoreGraphNodeId): string[] | undefined {\n// \tconst jsonNode = StoreController.engine.json_node(nodeId);\n// \tif (jsonNode) {\n// \t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n// \t\tif (node) {\n// \t\t\tconst channelsCount = jsKeyframeChannelsCount(nodeId);\n// \t\t\tconst channelNames: string[] = [];\n\n// \t\t\tconst nameParams = node.channelNameParams();\n// \t\t\tlet channelIndex = 0;\n// \t\t\tfor (const nameParam of nameParams) {\n// \t\t\t\tif (channelIndex < channelsCount) {\n// \t\t\t\t\tconst channelName = _paramJsonValue(nameParam, '');\n// \t\t\t\t\tchannelNames[channelIndex] = channelName;\n\n// \t\t\t\t\tchannelIndex++;\n// \t\t\t\t}\n// \t\t\t}\n// \t\t\treturn channelNames;\n// \t\t}\n// \t}\n// }\nexport function subChannelNamesForNodeId(nodeId: CoreGraphNodeId): string[][] | undefined {\n\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\tif (jsonNode) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\tif (node) {\n\t\t\tconst channelsCount = jsKeyframeChannelsCount(nodeId);\n\t\t\tconst channelNames: string[][] = [];\n\n\t\t\tconst nameParams = node.channelNameParams();\n\t\t\tlet channelIndex = 0;\n\t\t\tfor (const nameParam of nameParams) {\n\t\t\t\tchannelNames[channelIndex] = channelNames[channelIndex] || [];\n\t\t\t\tif (channelIndex < channelsCount) {\n\t\t\t\t\tconst subChannelsCount = jsKeyframeSubChannelsCountFromNodeId({nodeId, channelIndex});\n\t\t\t\t\tconst channelName = _paramJsonValue(nameParam, '');\n\t\t\t\t\tif (subChannelsCount == 1) {\n\t\t\t\t\t\tchannelNames[channelIndex].push(channelName);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (let subChannelIndex = 0; subChannelIndex < subChannelsCount; subChannelIndex++) {\n\t\t\t\t\t\t\tchannelNames[channelIndex].push(subChannelName({channelName, subChannelIndex}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchannelIndex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn channelNames;\n\t\t}\n\t}\n}\nexport function dataParamIdsForNodeId(nodeId: CoreGraphNodeId): CoreGraphNodeId[] | undefined {\n\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\tif (jsonNode) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\tif (node) {\n\t\t\tconst channelsCount = jsKeyframeChannelsCount(nodeId);\n\t\t\tconst data: CoreGraphNodeId[] = [];\n\n\t\t\tconst dataParams = node.channelDataParams();\n\t\t\tlet i = 0;\n\t\t\tfor (const dataParam of dataParams) {\n\t\t\t\tif (i < channelsCount) {\n\t\t\t\t\tdata.push(dataParam.graphNodeId());\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t}\n\t}\n}\n\nfunction channelDataByNameForNodeId(nodeId: CoreGraphNodeId): ChannelDataByName | undefined {\n\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\tif (jsonNode) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\tif (node) {\n\t\t\tconst channelsCount = jsKeyframeChannelsCount(nodeId);\n\t\t\tlet dataByIndex: ChannelData[][] | undefined = _channelDataByChanneIndexByNodeId.get(nodeId);\n\t\t\tif (!dataByIndex) {\n\t\t\t\tdataByIndex = [];\n\t\t\t\t_channelDataByChanneIndexByNodeId.set(nodeId, dataByIndex);\n\t\t\t}\n\t\t\tconst dataByName: ChannelDataByName = {};\n\n\t\t\tconst nameParams = node.channelNameParams();\n\t\t\tconst dataParams = node.channelDataParams();\n\t\t\tnameParams.forEach((nameParam, channelIndex) => {\n\t\t\t\tif (channelIndex < channelsCount && dataByIndex) {\n\t\t\t\t\tconst channelData = _paramJsonValue(dataParams[channelIndex], '');\n\t\t\t\t\tconst channelName = _paramJsonValue(nameParam, '');\n\t\t\t\t\tconst subChannelsCount = jsKeyframeSubChannelsCount({node, channelIndex});\n\t\t\t\t\tlet target: ChannelData[] = dataByIndex[channelIndex];\n\t\t\t\t\tif (target) {\n\t\t\t\t\t\tsetArraySize(target, subChannelsCount, _createEmptyChannelData);\n\t\t\t\t\t\t// if (target.length < subChannelsCount) {\n\t\t\t\t\t\t// \tfor (let j = target.length; j < subChannelsCount; j++) {\n\t\t\t\t\t\t// \t\ttarget.push(_createEmptyChannelData());\n\t\t\t\t\t\t// \t}\n\t\t\t\t\t\t// }\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget = _createEmptyChannels(subChannelsCount);\n\t\t\t\t\t\tdataByIndex[channelIndex] = target;\n\t\t\t\t\t}\n\t\t\t\t\tchannelDataFromString(channelData, target);\n\t\t\t\t\tif (target.length == 1) {\n\t\t\t\t\t\tdataByName[channelName] = target[0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.forEach((channelData, subChannelIndex) => {\n\t\t\t\t\t\t\tdataByName[subChannelName({channelName, subChannelIndex})] = channelData;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn dataByName;\n\t\t}\n\t}\n}\n\nconst DEFAULT_CHANNEL_DATA_STRING: string = '';\nconst DEFAULT_TYPE_VALUE: number = 0;\nexport function channelDatasForNodeId(nodeId: CoreGraphNodeId): ChannelData[][] | undefined {\n\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\tif (jsonNode) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\tif (node) {\n\t\t\tconst channelsCount = jsKeyframeChannelsCount(nodeId);\n\t\t\tlet dataByIndex: ChannelData[][] | undefined = _channelDataByChanneIndexByNodeId.get(nodeId);\n\t\t\tif (!dataByIndex) {\n\t\t\t\tdataByIndex = [];\n\t\t\t\t_channelDataByChanneIndexByNodeId.set(nodeId, dataByIndex);\n\t\t\t}\n\n\t\t\tconst dataParams = node.channelDataParams();\n\t\t\tdataParams.forEach((dataParam, channelIndex) => {\n\t\t\t\tif (channelIndex < channelsCount && dataByIndex) {\n\t\t\t\t\tconst channelData = _paramJsonValue(dataParam, DEFAULT_CHANNEL_DATA_STRING);\n\t\t\t\t\tconst subChannelsCount = jsKeyframeSubChannelsCount({node, channelIndex});\n\t\t\t\t\tlet target: ChannelData[] = dataByIndex[channelIndex];\n\t\t\t\t\tif (target) {\n\t\t\t\t\t\tsetArraySize(target, subChannelsCount, _createEmptyChannelData);\n\t\t\t\t\t\t// if (target.length < subChannelsCount) {\n\t\t\t\t\t\t// \tfor (let j = target.length; j < subChannelsCount; j++) {\n\t\t\t\t\t\t// \t\ttarget.push(_createEmptyChannelData());\n\t\t\t\t\t\t// \t}\n\t\t\t\t\t\t// }\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget = _createEmptyChannels(subChannelsCount);\n\t\t\t\t\t\tdataByIndex[channelIndex] = target;\n\t\t\t\t\t}\n\t\t\t\t\tchannelDataFromString(channelData, target);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn dataByIndex;\n\t\t}\n\t}\n}\nexport function subChannelDatasForSelectionData(selectionData: BaseObjectSelectionData): ChannelData[] | undefined {\n\tconst channelsData = channelDatasForNodeId(selectionData.nodeId);\n\tif (!channelsData) {\n\t\treturn;\n\t}\n\tconst channelData = channelsData[selectionData.channelIndex];\n\tif (!channelData) {\n\t\treturn;\n\t}\n\treturn channelData;\n}\nexport function subChannelDataForSelectionData(selectionData: BaseObjectSelectionData): ChannelData | undefined {\n\tconst subChannelDatas = subChannelDatasForSelectionData(selectionData);\n\tif (!subChannelDatas) {\n\t\treturn;\n\t}\n\treturn subChannelDatas[selectionData.subChannelIndex];\n}\nexport function keyframeDataForSelectionData(selectionData: BaseObjectSelectionData): KeyframeData | undefined {\n\tconst channelData = subChannelDataForSelectionData(selectionData);\n\tif (!channelData) {\n\t\treturn;\n\t}\n\treturn channelData.keyframes[selectionData.keyframeIndex];\n}\nexport function otherKeyframeDatasForSelectionData(selectionData: BaseObjectSelectionData): KeyframeData[] | undefined {\n\tconst channelData = subChannelDataForSelectionData(selectionData);\n\tif (!channelData) {\n\t\treturn;\n\t}\n\treturn channelData.keyframes.filter((k, i) => i != selectionData.keyframeIndex);\n}\nfunction selectionDatasSharingSubChannelWithSelectionData(\n\tselectionData: BaseObjectSelectionData\n): BaseObjectSelectionData[] {\n\tconst list: BaseObjectSelectionData[] = [];\n\ttraverseSelection(StoreController.editor.keyframeEditor.selection.value, (selectionData) => {\n\t\tif (\n\t\t\tselectionData.nodeId == selectionData.nodeId &&\n\t\t\tselectionData.channelIndex == selectionData.channelIndex &&\n\t\t\tselectionData.subChannelIndex == selectionData.subChannelIndex\n\t\t) {\n\t\t\tlist.push(selectionData);\n\t\t}\n\t});\n\treturn list;\n}\nexport function otherKeyframeDatasForSelectionDataNotInSelection(\n\tselectionData: BaseObjectSelectionData\n): KeyframeData[] | undefined {\n\tconst channelData = subChannelDataForSelectionData(selectionData);\n\tif (!channelData) {\n\t\treturn;\n\t}\n\tconst selectionDataForSubChannel = selectionDatasSharingSubChannelWithSelectionData(selectionData);\n\tconst selectedKeyframeIndices: number[] = selectionDataForSubChannel.map((s) => s.keyframeIndex);\n\tconst selectedKeyframeIndicesSet = new Set(selectedKeyframeIndices);\n\tconst otherKeyframes = channelData.keyframes.filter(\n\t\t(k, i) => i != selectionData.keyframeIndex && !selectedKeyframeIndicesSet.has(selectionData.keyframeIndex)\n\t);\n\n\treturn otherKeyframes;\n}\nexport function dataParamIdForSelectionData(selectionData: BaseObjectSelectionData): CoreGraphNodeId | undefined {\n\tconst paramIds = dataParamIdsForNodeId(selectionData.nodeId);\n\tif (paramIds != null) {\n\t\treturn paramIds[selectionData.channelIndex];\n\t}\n}\n// export function dataParamValueForSelectionData(selectionData: BaseObjectSelectionData): (string|undefined) {\n// \tconst paramId = dataParamIdForSelectionData(selectionData);\n// \tif (paramId != null) {\n// \t\treturn StoreController.engine.json_param(paramId)?.value as string | undefined\n// \t}\n// }\nexport type TraverseSelectionCallback = (selectionData: BaseObjectSelectionData) => void;\nexport function traverseSelection(\n\tselection: KeyframeIndicesBySubChannelIndexByChannelIndexByNodeId,\n\tcallback: TraverseSelectionCallback\n) {\n\tconst nodeIds = Object.keys(selection).map((e) => parseInt(e));\n\tfor (let nodeId of nodeIds) {\n\t\tconst channelsData = selection[nodeId];\n\t\tchannelsData.forEach((keyframeIndicesByChannelIndex, channelIndex) => {\n\t\t\tkeyframeIndicesByChannelIndex.forEach((keyframeIndices, subChannelIndex) => {\n\t\t\t\tkeyframeIndices.forEach((keyframeIndex) => {\n\t\t\t\t\tcallback({nodeId, channelIndex, subChannelIndex, keyframeIndex});\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function copySelection(\n\tsrc: KeyframeIndicesBySubChannelIndexByChannelIndexByNodeId,\n\ttarget: KeyframeIndicesBySubChannelIndexByChannelIndexByNodeId\n) {\n\t// clear existing\n\tconst existingNodeIds = Object.keys(target);\n\tfor (let nodeId of existingNodeIds) {\n\t\tdelete (target as any)[nodeId];\n\t}\n\n\t// copy\n\tconst nodeIds = Object.keys(src).map((e) => parseInt(e));\n\tfor (let nodeId of nodeIds) {\n\t\ttarget[nodeId] = [];\n\t\tconst keyframeIndicesList = src[nodeId];\n\t\tconst listCount = keyframeIndicesList.length;\n\t\tfor (let i = 0; i < listCount; i++) {\n\t\t\ttarget[nodeId][i] = [];\n\t\t\tconst srcKeyframes = keyframeIndicesList[i];\n\t\t\tfor (let srcKeyframe of srcKeyframes) {\n\t\t\t\ttarget[nodeId][i].push(srcKeyframe);\n\t\t\t}\n\t\t}\n\t}\n}\nexport class KeyframeEditorControllerClass {\n\tprivate static _instance: KeyframeEditorControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new KeyframeEditorControllerClass());\n\t}\n\n\tprivate constructor() {\n\t\twatch(\n\t\t\tthis.nodeIds,\n\t\t\t() => {\n\t\t\t\tthis._updateChannelColors();\n\t\t\t},\n\t\t\t{deep: true}\n\t\t);\n\t}\n\tinit() {\n\t\t// listen to selection changes\n\t\tfor (const linkIndex of AVAILABLE_LINK_INDEX_VALUES) {\n\t\t\tconst selectedNodeIds = computed(() => {\n\t\t\t\tconst parentNodeId = StoreController.editor.current_node_graph_id(linkIndex);\n\t\t\t\tif (parentNodeId) {\n\t\t\t\t\tconst parentNodeJson = StoreController.engine.json_node(parentNodeId);\n\t\t\t\t\treturn parentNodeJson?.selection || null;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t});\n\t\t\twatch(\n\t\t\t\tselectedNodeIds,\n\t\t\t\t(newSelectedNodeIds, oldVal) => {\n\t\t\t\t\tif (!newSelectedNodeIds) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (newSelectedNodeIds.length == 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// store current state as sets\n\t\t\t\t\tconst nodeIdsSet = new Set(this.nodeIds.value);\n\t\t\t\t\t// const selectedNodeIdsSet = new Set(selectedNodeIds.value);\n\n\t\t\t\t\tnewSelectedNodeIds.forEach((selectedNodeId) => {\n\t\t\t\t\t\tif (!nodeIdsSet.has(selectedNodeId)) {\n\t\t\t\t\t\t\tconst jsonNode = StoreController.engine.json_node(selectedNodeId);\n\t\t\t\t\t\t\tif (jsonNode && jsonNode.type == JsType.KEYFRAMES) {\n\t\t\t\t\t\t\t\tthis.nodeIds.value.push(selectedNodeId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// const pinnedNodeIdsSet = new Set(this.pinnedNodeIds.value);\n\n\t\t\t\t\t// // clear existing\n\t\t\t\t\t// this.nodeIds.value.splice(0, this.nodeIds.value.length);\n\n\t\t\t\t\t// // keep pinned\n\t\t\t\t\t// nodeIdsSet.forEach((nodeId) => {\n\t\t\t\t\t// \tif (pinnedNodeIdsSet.has(nodeId)) {\n\t\t\t\t\t// \t\tthis.nodeIds.value.push(nodeId);\n\t\t\t\t\t// \t}\n\t\t\t\t\t// });\n\n\t\t\t\t\t// for (let nodeId of newVal) {\n\t\t\t\t\t// \tconst jsonNode = StoreController.engine.json_node(nodeId);\n\t\t\t\t\t// \tif (jsonNode && jsonNode.type == JsType.KEYFRAMES) {\n\t\t\t\t\t// \t\tif (this.nodeIds.value.indexOf(nodeId) == -1) {\n\t\t\t\t\t// \t\t\tthis.nodeIds.value.push(nodeId);\n\t\t\t\t\t// \t\t}\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t},\n\t\t\t\t{deep: true}\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic readonly nodeIds: Ref<CoreGraphNodeId[]> = ref([]);\n\tpublic readonly collapsedNodeIds: Ref<CoreGraphNodeId[]> = ref([]);\n\tprivate _channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId: Ref<Record<CoreGraphNodeId, boolean[][]>> =\n\t\tref({});\n\tpublic readonly channelColorByParamId: Ref<Record<CoreGraphNodeId, TailwindColor>> = ref({});\n\tpublic readonly selection: Ref<KeyframeIndicesBySubChannelIndexByChannelIndexByNodeId> = ref({});\n\tpublic readonly tangentsDisplayed: Ref<boolean> = ref(true);\n\n\tpublic channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId = computed(() => {\n\t\tconst data: Record<CoreGraphNodeId, boolean[][]> = {};\n\t\tconst nodeIds = this.nodeIds.value;\n\t\tfor (const nodeId of nodeIds) {\n\t\t\tconst jsonNode = StoreController.engine.json_node(nodeId);\n\t\t\tif (jsonNode) {\n\t\t\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\t\t\tif (node) {\n\t\t\t\t\tconst nodeData =\n\t\t\t\t\t\tthis._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[nodeId] || [];\n\t\t\t\t\tdata[nodeId] = nodeData;\n\t\t\t\t\tconst dataParams = node.channelDataParams();\n\t\t\t\t\tdataParams.forEach((dataParam, channelIndex) => {\n\t\t\t\t\t\tconst subChannelsData = nodeData[channelIndex] || [];\n\t\t\t\t\t\tdata[nodeId][channelIndex] = [];\n\t\t\t\t\t\tconst subChannelsCount = jsKeyframeSubChannelsCount({node, channelIndex});\n\t\t\t\t\t\tfor (let subChannelIndex = 0; subChannelIndex < subChannelsCount; subChannelIndex++) {\n\t\t\t\t\t\t\tconst currentState = subChannelsData[subChannelIndex];\n\t\t\t\t\t\t\tdata[nodeId][channelIndex][subChannelIndex] = currentState == null ? true : currentState;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// const paramIds = this.channelDataParamIdsByNodeId.value[nodeId] || [];\n\t\t\t// const states = paramIds.map((paramId) => {\n\t\t\t// \tconst subChannelsCount = jsKeyframeSubChannelsCountFromNodeId(node, i);\n\t\t\t// \tlet stateBySubChannelIndex = this._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[paramId];\n\t\t\t// \tif(stateBySubChannelIndex){\n\t\t\t// \t\tsetArraySize(stateBySubChannelIndex, subChannelsCount,()=>true)\n\t\t\t// \t}else{\n\t\t\t// \t\tstateBySubChannelIndex = _createEmptyArray(subChannelsCount,()=>true)\n\t\t\t// \t\tthis._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[paramId] = stateBySubChannelIndex;\n\n\t\t\t// \t}\n\n\t\t\t// \treturn stateBySubChannelIndex;\n\t\t\t// });\n\t\t\t// data[nodeId] = states;\n\t\t}\n\t\treturn data;\n\t});\n\n\tisKeyframeSelected(selectionData: BaseObjectSelectionData): boolean {\n\t\tconst {nodeId, channelIndex, subChannelIndex, keyframeIndex} = selectionData;\n\n\t\tconst nodeIds = Object.keys(this.selection.value).map((e) => parseInt(e));\n\t\tif (!nodeIds.includes(nodeId)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst channelIndices = this.selection.value[nodeId];\n\t\tif (!channelIndices[channelIndex]) {\n\t\t\treturn false;\n\t\t}\n\t\tconst subChannelIndices = channelIndices[channelIndex];\n\t\tif (!subChannelIndices[subChannelIndex]) {\n\t\t\treturn false;\n\t\t}\n\t\tconst keyframeIndices = subChannelIndices[subChannelIndex];\n\t\treturn keyframeIndices.includes(keyframeIndex);\n\t}\n\n\tpublic selectedSelectionData: ComputedRef<BaseObjectSelectionData[]> = computed(() => {\n\t\tconst list: BaseObjectSelectionData[] = [];\n\n\t\tconst nodeIds = Object.keys(this.selection.value).map((e) => parseInt(e));\n\n\t\tnodeIds.forEach((nodeId) => {\n\t\t\tconst selectionDataForNodeId = this.selection.value[nodeId];\n\t\t\tif (selectionDataForNodeId) {\n\t\t\t\tselectionDataForNodeId.forEach((channelData, channelIndex) => {\n\t\t\t\t\tchannelData.forEach((subChannelData, subChannelIndex) => {\n\t\t\t\t\t\tsubChannelData.forEach((keyframeIndex) => {\n\t\t\t\t\t\t\tlist.push({\n\t\t\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\t\t\tchannelIndex,\n\t\t\t\t\t\t\t\tsubChannelIndex,\n\t\t\t\t\t\t\t\tkeyframeIndex,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn list;\n\t});\n\n\tpublic subChannelNamesByNodeId = computed(() => {\n\t\tconst jsonNodes = this.nodeIds.value.map((nodeId) => StoreController.engine.json_node(nodeId));\n\t\tconst data: Record<CoreGraphNodeId, string[][]> = {};\n\t\tfor (const jsonNode of jsonNodes) {\n\t\t\tif (jsonNode) {\n\t\t\t\tconst channelNames = subChannelNamesForNodeId(jsonNode.graph_node_id);\n\t\t\t\tif (channelNames) {\n\t\t\t\t\tdata[jsonNode.graph_node_id] = channelNames;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t});\n\tpublic channelDataParamIdsByNodeId = computed(() => {\n\t\tconst jsonNodes = this.nodeIds.value.map((nodeId) => StoreController.engine.json_node(nodeId));\n\t\tconst data: Record<CoreGraphNodeId, CoreGraphNodeId[]> = {};\n\t\tfor (const jsonNode of jsonNodes) {\n\t\t\tif (jsonNode) {\n\t\t\t\tconst paramIds = dataParamIdsForNodeId(jsonNode.graph_node_id);\n\t\t\t\tif (paramIds) {\n\t\t\t\t\tdata[jsonNode.graph_node_id] = paramIds;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t});\n\tpublic channelColorsByNodeId = computed(() => {\n\t\tconst jsonNodes = this.nodeIds.value.map((nodeId) => StoreController.engine.json_node(nodeId));\n\t\tconst data: Record<CoreGraphNodeId, string[]> = {};\n\t\tfor (const jsonNode of jsonNodes) {\n\t\t\tif (jsonNode) {\n\t\t\t\tconst paramIds = dataParamIdsForNodeId(jsonNode.graph_node_id);\n\t\t\t\tif (paramIds) {\n\t\t\t\t\tdata[jsonNode.graph_node_id] = paramIds.map((paramId) => this.channelColorByParamId.value[paramId]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t});\n\tpublic channelDataByNameByNodeId = computed(() => {\n\t\tconst jsonNodes = this.nodeIds.value.map((nodeId) => StoreController.engine.json_node(nodeId));\n\t\tconst data: Record<CoreGraphNodeId, ChannelDataByName> = {};\n\t\tfor (const jsonNode of jsonNodes) {\n\t\t\tif (jsonNode) {\n\t\t\t\tconst channelsDataByName = channelDataByNameForNodeId(jsonNode.graph_node_id);\n\t\t\t\tif (channelsDataByName) {\n\t\t\t\t\tdata[jsonNode.graph_node_id] = channelsDataByName;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t});\n\tpublic channelDatasByNodeIds = computed(() => {\n\t\tconst jsonNodes = this.nodeIds.value.map((nodeId) => StoreController.engine.json_node(nodeId));\n\t\tconst data: Record<CoreGraphNodeId, ChannelData[][]> = {};\n\t\tfor (const jsonNode of jsonNodes) {\n\t\t\tif (jsonNode) {\n\t\t\t\tconst channelsData = channelDatasForNodeId(jsonNode.graph_node_id);\n\t\t\t\tif (channelsData) {\n\t\t\t\t\tdata[jsonNode.graph_node_id] = channelsData;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t});\n\n\tprivate _nextColorIndex = 0;\n\tprivate _updateChannelColors() {\n\t\tconst jsonNodes = this.nodeIds.value.map((nodeId) => StoreController.engine.json_node(nodeId));\n\t\tfor (const jsonNode of jsonNodes) {\n\t\t\tif (jsonNode) {\n\t\t\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id) as KeyframesJsNode | undefined;\n\t\t\t\tif (node) {\n\t\t\t\t\tconst dataParams = node.channelDataParams();\n\t\t\t\t\tfor (const dataParam of dataParams) {\n\t\t\t\t\t\tconst paramId = dataParam.graphNodeId();\n\t\t\t\t\t\tif (paramId != null) {\n\t\t\t\t\t\t\tlet colorName = this.channelColorByParamId.value[paramId];\n\t\t\t\t\t\t\tif (!colorName) {\n\t\t\t\t\t\t\t\tcolorName =\n\t\t\t\t\t\t\t\t\tCHANNEL_TAILWIND_COLORS[this._nextColorIndex % CHANNEL_TAILWIND_COLORS.length];\n\t\t\t\t\t\t\t\tthis._nextColorIndex++;\n\t\t\t\t\t\t\t\tthis.channelColorByParamId.value[paramId] = colorName;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// mutations\n\topen(options: EditorPanelSpareParamsEditorOptions): void {\n\t\trouter.push({name: EditorRoute.KEYFRAMES, params: {urlNodePath: nodePathToUrl(options.node.path())}});\n\t}\n\tnodeUrlToPath = nodeUrlToPath;\n\tclose() {\n\t\t// this._nodeId.value = null;\n\t\tcloseModals();\n\t}\n\n\tremoveNode(nodeId: CoreGraphNodeId) {\n\t\tconst index = this.nodeIds.value.indexOf(nodeId);\n\t\tif (index < 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.nodeIds.value.splice(index, 1);\n\t}\n\ttoggleNodeCollpasedState(nodeId: CoreGraphNodeId) {\n\t\tconst index = this.collapsedNodeIds.value.indexOf(nodeId);\n\t\tif (index == -1) {\n\t\t\tthis.collapsedNodeIds.value.push(nodeId);\n\t\t} else {\n\t\t\tthis.collapsedNodeIds.value.splice(index, 1);\n\t\t}\n\t}\n\tmoveNodeIdUp(nodeId: CoreGraphNodeId) {\n\t\tconst index = this.nodeIds.value.indexOf(nodeId);\n\t\tif (index <= 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.nodeIds.value.splice(index, 1);\n\t\tthis.nodeIds.value.splice(index - 1, 0, nodeId);\n\t}\n\tmoveNodeIdDown(nodeId: CoreGraphNodeId) {\n\t\tconst index = this.nodeIds.value.indexOf(nodeId);\n\t\tif (index >= this.nodeIds.value.length) {\n\t\t\treturn;\n\t\t}\n\t\tthis.nodeIds.value.splice(index, 1);\n\t\tthis.nodeIds.value.splice(index + 1, 0, nodeId);\n\t}\n\n\ttoggleChannelDisplayState(options: ChannelDisplayStateOption) {\n\t\tconst {nodeId, channelIndex, subChannelIndex} = options;\n\t\tlet nodeState = this._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[nodeId];\n\t\tif (!nodeState) {\n\t\t\tnodeState = [];\n\t\t\tthis._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[nodeId] = nodeState;\n\t\t}\n\t\tlet subChannelStates = nodeState[channelIndex];\n\t\tif (!subChannelStates) {\n\t\t\tsubChannelStates = [];\n\t\t\tnodeState[channelIndex] = subChannelStates;\n\t\t}\n\t\tconst currentValue = subChannelStates[subChannelIndex];\n\t\tconst currentState = currentValue == null || currentValue == true;\n\t\tsubChannelStates[subChannelIndex] = !currentState;\n\t}\n\tisChannelDisplayed(options: ChannelDisplayStateOption): boolean {\n\t\tconst {nodeId, channelIndex, subChannelIndex} = options;\n\t\tlet nodeState = this._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[nodeId];\n\t\tif (!nodeState) {\n\t\t\tnodeState = [];\n\t\t\tthis._channelDisplayedStateBySubChannelIndexByChannelIndexByNodeId.value[nodeId] = nodeState;\n\t\t}\n\t\tlet subChannelStates = nodeState[channelIndex];\n\t\tif (!subChannelStates) {\n\t\t\tsubChannelStates = [];\n\t\t\tnodeState[channelIndex] = subChannelStates;\n\t\t}\n\t\tconst currentValue = subChannelStates[subChannelIndex];\n\t\tconst currentState = currentValue == null || currentValue == true;\n\t\treturn currentState;\n\t}\n\n\tsetSelection(selection: KeyframeIndicesBySubChannelIndexByChannelIndexByNodeId) {\n\t\tcopySelection(selection, this.selection.value);\n\t}\n\tclearSelection() {\n\t\tthis.selection.value = {};\n\t}\n}\n\nexport const KeyframeEditorController = KeyframeEditorControllerClass.instance();\n","import {NpmAuthController} from './../../../../../npm_module/NpmAuthController';\nimport {MultiPlayerControllerClass} from './../MultiPlayerController';\nimport {NpmModuleApiController} from './../../../../../npm_module/NpmModuleApiController';\nimport {ref, Ref, computed} from 'vue';\n\nexport class MultiPlayerSessionsStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\tprivate _loading: Ref<boolean> = ref(false);\n\tprivate _error: Ref<string | null> = ref(null);\n\tprivate _creationAllowed: Ref<boolean> = ref(false);\n\tprivate _shareUrl: Ref<string | null> = ref(null);\n\tprivate _startedBy: Ref<string | null> = ref(null);\n\tprivate _socketConnected: Ref<boolean> = ref(false);\n\tloading() {\n\t\treturn this._loading.value;\n\t}\n\terror() {\n\t\treturn this._error.value;\n\t}\n\tshareUrl() {\n\t\treturn this._shareUrl.value;\n\t}\n\tcreationAllowed() {\n\t\treturn this._creationAllowed.value;\n\t}\n\tstartedBy() {\n\t\treturn this._startedBy.value;\n\t}\n\tactive = computed(() => this._shareUrl.value != null);\n\tsocketConnected() {\n\t\treturn this._socketConnected.value;\n\t}\n\tsetSocketConnected(state: boolean) {\n\t\tthis._socketConnected.value = state;\n\t}\n\n\tasync fetchCreationAllowed() {\n\t\tconst secret = NpmAuthController.secret();\n\t\tthis._error.value = null;\n\t\tif (!secret) {\n\t\t\tthis._error.value = 'login required';\n\t\t\treturn;\n\t\t}\n\t\tthis._creationAllowed.value = false;\n\t\tthis._loading.value = true;\n\t\tconst json = await NpmModuleApiController.multiPlayer.sessions.creationAllowed({secret});\n\t\tthis._loading.value = false;\n\n\t\tif (json) {\n\t\t\tthis._creationAllowed.value = json.sessionCreationAllowed;\n\t\t}\n\t\treturn json;\n\t}\n\tasync create() {\n\t\tconst secret = NpmAuthController.secret();\n\t\tthis._error.value = null;\n\t\tif (!secret) {\n\t\t\tthis._error.value = 'login required';\n\t\t\treturn;\n\t\t}\n\t\tthis._loading.value = true;\n\t\tconst json = await NpmModuleApiController.multiPlayer.sessions.create({secret});\n\t\tthis._loading.value = false;\n\t\tif (!json) {\n\t\t\tthis._error.value = 'failed to create session';\n\t\t\treturn;\n\t\t}\n\t\tthis._error.value = json.error || null;\n\t\tthis._shareUrl.value = json.shareUrl || null;\n\t\tthis._startedBy.value = json.startedBy || null;\n\t}\n\tasync show() {\n\t\tthis._loading.value = true;\n\t\tconst json = await NpmModuleApiController.multiPlayer.sessions.show();\n\t\tif (json) {\n\t\t\tthis._shareUrl.value = json.shareUrl || null;\n\t\t\tthis._startedBy.value = json.startedBy || null;\n\t\t}\n\t\tthis._loading.value = false;\n\t}\n\tasync close() {\n\t\tconst secret = NpmAuthController.secret();\n\t\tthis._error.value = null;\n\t\tif (!secret) {\n\t\t\tthis._error.value = 'login required';\n\t\t\treturn;\n\t\t}\n\t\tthis._loading.value = true;\n\t\tconst json = await NpmModuleApiController.multiPlayer.sessions.destroy({\n\t\t\tsecret,\n\t\t\tbrowserIdToKeep: NpmAuthController.browserId(),\n\t\t});\n\t\tthis._loading.value = false;\n\t\tif (json) {\n\t\t\tthis._error.value = json.error || null;\n\t\t\tif (json.destroyed) {\n\t\t\t\tthis._shareUrl.value = null;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._error.value = 'failed to close session';\n\t\t}\n\t}\n}\n","import {MultiPlayerControllerClass, MULTIPLAYER_AWARENESS_DEFAULT_LINK_INDEX} from './../MultiPlayerController';\nimport {NpmModuleApiController} from './../../../../../npm_module/NpmModuleApiController';\nimport {ref, Ref, computed} from 'vue';\nimport {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {CoreMath} from './../../../../../../@polygonjs/polygonjs/src/core/math/_Module';\nimport {Vector2Like} from './../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {StoreController} from '../../StoreController';\nimport {Color} from 'three';\n// https://stackoverflow.com/questions/3426404/create-a-hexadecimal-colour-based-on-a-string-with-javascript\n// export function stringToColour(str: string) {\n// \tvar hash = 0;\n// \tfor (var i = 0; i < str.length; i++) {\n// \t\thash = str.charCodeAt(i) + ((hash << 5) - hash);\n// \t}\n// \tvar colour = '#';\n// \tconsole.log(hash);\n// \tfor (var i = 0; i < 3; i++) {\n// \t\tvar value = (hash >> (i * 8)) & 0xff;\n// \t\tconsole.log(value);\n// \t\tcolour += ('00' + value.toString(16)).substr(-2);\n// \t}\n// \treturn colour;\n// }\nconst color = new Color();\nconst S = 0.8;\nconst L = 0.3;\nfunction stringToColour(str: string) {\n\tlet hash = 0;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = str.charCodeAt(i) + ((hash << 5) - hash);\n\t}\n\tconst rand = CoreMath.randFloat(hash);\n\tconst hue = rand;\n\tcolor.setHSL(hue, S, L);\n\treturn color.getStyle();\n}\nexport class MultiPlayerAwarenessStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\t// private _loading: Ref<boolean> = ref(false);\n\t// private _error: Ref<string | null> = ref(null);\n\tprivate _awareness: Ref<MultiPlayer.Awareness.DataRecord> = ref({});\n\n\tawareness() {\n\t\treturn this._awareness.value;\n\t}\n\tawarenessRef() {\n\t\treturn this._awareness;\n\t}\n\n\tpublic readonly colorByUsername: Ref<Record<string, string>> = computed(() => {\n\t\tconst dict: Record<string, string> = {};\n\t\tconst users = this.multiPlayer.users.usersRef();\n\t\tfor (let user of users.value) {\n\t\t\tdict[user.username] = stringToColour(user.username);\n\t\t}\n\t\treturn dict;\n\t});\n\n\tsetAwareness(awareness: MultiPlayer.Awareness.DataRecord) {\n\t\tconst usernames = Object.keys(awareness);\n\t\tfor (let username of usernames) {\n\t\t\tconst newData = awareness[username];\n\t\t\tif (this._awareness.value[username] != null) {\n\t\t\t\tconst userData = this._awareness.value[username];\n\t\t\t\tuserData.path = newData.path;\n\t\t\t\tuserData.cursor.x = newData.cursor.x;\n\t\t\t\tuserData.cursor.y = newData.cursor.y;\n\t\t\t\tuserData.camera.position.x = newData.camera.position.x;\n\t\t\t\tuserData.camera.position.y = newData.camera.position.y;\n\t\t\t\tuserData.camera.zoom = newData.camera.zoom;\n\t\t\t} else {\n\t\t\t\tthis._awareness.value[username] = newData;\n\t\t\t}\n\t\t}\n\t\tthis._updatePathFromFollowedUsername();\n\t}\n\tprivate _updatePathFromFollowedUsername() {\n\t\tconst followedUsername = this.multiPlayer.follow.username();\n\t\tif (followedUsername == null) {\n\t\t\treturn;\n\t\t}\n\t\tconst userData = this._awareness.value[followedUsername];\n\t\tif (!userData) {\n\t\t\treturn;\n\t\t}\n\t\tconst linkIndex = MULTIPLAYER_AWARENESS_DEFAULT_LINK_INDEX;\n\t\tconst currentNode = StoreController.editor.currentNode(linkIndex);\n\t\tif (!currentNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (currentNode.path() == userData.path) {\n\t\t\treturn;\n\t\t}\n\t\tconst newNode = StoreController.engine.scene.node(userData.path);\n\t\tif (!newNode) {\n\t\t\treturn;\n\t\t}\n\t\tStoreController.editor.setCurrentNode(linkIndex, newNode);\n\t}\n\tupdatePath() {\n\t\tif (!this.multiPlayer.active.value) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentNode = StoreController.editor.currentNode(MULTIPLAYER_AWARENESS_DEFAULT_LINK_INDEX);\n\t\tif (currentNode) {\n\t\t\t// StoreController.editor.multiPlayer.awareness.updatePath(currentNode.path());\n\t\t\tNpmModuleApiController.multiPlayer.awareness.updatePath(currentNode.path());\n\t\t}\n\t}\n\tupdatePos(pos: Vector2Like) {\n\t\tif (!this.multiPlayer.active.value) {\n\t\t\treturn;\n\t\t}\n\t\tNpmModuleApiController.multiPlayer.awareness.updatePos(pos);\n\t}\n\tupdateCamera(cameraData: MultiPlayer.Awareness.CameraData) {\n\t\tif (!this.multiPlayer.active.value) {\n\t\t\treturn;\n\t\t}\n\t\tNpmModuleApiController.multiPlayer.awareness.updateCamera(cameraData);\n\t}\n}\n","import {MultiPlayerControllerClass} from './../MultiPlayerController';\nimport {ref, Ref} from 'vue';\n\nexport class MultiPlayerFollowStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\t// private _loading: Ref<boolean> = ref(false);\n\t// private _error: Ref<string | null> = ref(null);\n\tprivate _username: Ref<string | null> = ref(null);\n\n\tfollow(username: string) {\n\t\tconst user = this.multiPlayer.users.users().find((u) => u.username);\n\t\tif (!user) {\n\t\t\tconsole.error(`cannot follow, user '${username}' not found`);\n\t\t\treturn;\n\t\t}\n\t\tif (user.banned) {\n\t\t\tconsole.error(`cannot follow, user '${username}' is banned`);\n\t\t\treturn;\n\t\t}\n\t\tthis._username.value = username;\n\t}\n\tunfollow() {\n\t\tthis._username.value = null;\n\t}\n\tusername() {\n\t\treturn this._username.value;\n\t}\n\tfollowingInProgress(): boolean {\n\t\tconst user = this.multiPlayer.users.users().find((u) => u.username);\n\t\treturn this._username.value != null && user != null && !user.banned;\n\t}\n}\n","import {MultiPlayerControllerClass} from './../MultiPlayerController';\nimport {NpmModuleApiController} from './../../../../../npm_module/NpmModuleApiController';\nimport {StackIndex, StackTimestamp} from './../../../../../npm_module/NpmModuleTypes';\nimport {CommandTypeJSON, CommandType, BaseCommandJSON} from './../../../../history/commands/utils/CommandType';\nimport {StoreController} from '../../StoreController';\nimport {Editor} from './../../../../Editor';\n\ninterface ProcessConfirmedCommandOptions extends StackIndex, StackTimestamp {\n\tcommandData: BaseCommandJSON;\n\tuuid: string;\n}\ninterface ProcessConfirmedUndoOptions extends StackIndex, StackTimestamp {\n\tcommandData?: BaseCommandJSON;\n}\ninterface ProcessConfirmedRedoOptions extends StackIndex, StackTimestamp {\n\tcommandData?: BaseCommandJSON;\n}\n\nexport class MultiPlayerCommandsStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\tasync requestPushCommandData(data: CommandTypeJSON) {\n\t\tif (data.type == CommandType.BASE) {\n\t\t\tconsole.error('cannot push base command', data);\n\t\t\treturn;\n\t\t}\n\t\tconst username = StoreController.editor.currentUser.username().value || undefined;\n\t\tawait NpmModuleApiController.multiPlayer.commands.requestCommandData({\n\t\t\tcommand: data,\n\t\t\tsceneName: this.multiPlayer.sceneName(),\n\t\t\tusername,\n\t\t});\n\t}\n\tasync requestUndo() {\n\t\tconst username = StoreController.editor.currentUser.username().value || undefined;\n\t\tconst sceneName = this.multiPlayer.sceneName();\n\t\tawait NpmModuleApiController.multiPlayer.commands.requestUndo({sceneName, username});\n\t}\n\tasync requestRedo() {\n\t\tconst username = StoreController.editor.currentUser.username().value || undefined;\n\t\tconst sceneName = this.multiPlayer.sceneName();\n\t\tawait NpmModuleApiController.multiPlayer.commands.requestRedo({sceneName, username});\n\t}\n\n\tasync processConfirmedCommand(options: ProcessConfirmedCommandOptions) {\n\t\tconst historyStack = Editor.instance().historyStack();\n\t\tif (!historyStack) {\n\t\t\tconsole.error('no history stack found');\n\t\t\treturn;\n\t\t}\n\t\tconst pushCommandResult = await historyStack.confirmPushCommand(options);\n\t\tif (!pushCommandResult) {\n\t\t\treturn;\n\t\t}\n\t\tconst {command, updatedCommandData} = pushCommandResult;\n\n\t\tthis.multiPlayer.sceneData.save(options);\n\n\t\tif (command.dataUpdateRequired()) {\n\t\t\tNpmModuleApiController.multiPlayer.commands.updateCommandData({\n\t\t\t\tuuid: options.uuid,\n\t\t\t\tcommand: updatedCommandData,\n\t\t\t\tsceneName: this.multiPlayer.sceneName(),\n\t\t\t});\n\t\t}\n\t}\n\n\tasync processConfirmedUndo(options: ProcessConfirmedUndoOptions) {\n\t\tawait Editor.instance().historyStack()?.confirmUndo(options);\n\t\tthis.multiPlayer.sceneData.save(options);\n\t}\n\n\tasync processConfirmedRedo(options: ProcessConfirmedRedoOptions) {\n\t\tawait Editor.instance().historyStack()?.confirmRedo(options);\n\t\tthis.multiPlayer.sceneData.save(options);\n\t}\n}\n","import {MultiPlayerControllerClass} from './../MultiPlayerController';\nimport {NpmModuleApiController} from './../../../../../npm_module/NpmModuleApiController';\n// import {ref, Ref} from 'vue';\nimport {StackTimestamp} from './../../../../../npm_module/NpmModuleTypes';\nimport {sceneDataWithVersion} from './../../../../versions';\nimport {StoreController} from '../../StoreController';\n\nexport class MultiPlayerSceneDataStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\tasync save(options: StackTimestamp) {\n\t\t// do not save if there is no multiplayer session\n\t\tif (this.multiPlayer.active.value == false) {\n\t\t\treturn;\n\t\t}\n\n\t\t//\n\t\tconst sceneData = {\n\t\t\t...(await sceneDataWithVersion({\n\t\t\t\tscene: StoreController.engine.scene,\n\t\t\t\twithPersistedConfig: false,\n\t\t\t})),\n\t\t};\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (!username) {\n\t\t\treturn;\n\t\t}\n\t\tawait NpmModuleApiController.multiPlayer.sceneData.save({\n\t\t\tsceneName: this.multiPlayer.sceneName(),\n\t\t\tsceneData,\n\t\t\tstackUpdateConfirmedAt: options.stackUpdateConfirmedAt,\n\t\t\tusername,\n\t\t});\n\t}\n\t// async request(sceneName: string) {\n\t// \tif (!this._loadSceneFromMemory()) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst username = StoreController.editor.currentUser.username().value;\n\t// \tif (!username) {\n\t// \t\tconsole.log('no username to request sceneData');\n\t// \t\treturn;\n\t// \t}\n\t// \tconst response = await NpmModuleApiController.multiPlayer.sceneData.request({sceneName, username});\n\t// \tif (!response.ok) {\n\t// \t\tconsole.log('sceneData request response not valid');\n\t// \t\treturn;\n\t// \t}\n\t// \tconst json = (await response.json()) as MultiPlayer.SceneData.RequestSceneDataResponse;\n\t// \treturn json.sceneData;\n\t// }\n\t// private _loadSceneFromMemory() {\n\t// \treturn this.multiPlayer.active.value;\n\t// }\n}\n","import {MultiPlayerControllerClass} from './../MultiPlayerController';\nimport {NpmModuleApiController} from './../../../../../npm_module/NpmModuleApiController';\nimport {ref, Ref} from 'vue';\nimport {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\n\nexport class MultiPlayerUserRequestsStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\tprivate _loading: Ref<boolean> = ref(false);\n\tprivate _error: Ref<string | null> = ref(null);\n\tprivate _userRequests: Ref<MultiPlayer.UserRequest.ServerSideUserRequestData[]> = ref([]);\n\n\tloading() {\n\t\treturn this._loading.value;\n\t}\n\terror() {\n\t\treturn this._error.value;\n\t}\n\n\trequests() {\n\t\treturn this._userRequests.value;\n\t}\n\tsetRequests(requests: MultiPlayer.UserRequest.ServerSideUserRequestData[]) {\n\t\tthis._userRequests.value = requests;\n\t}\n\tasync fetchIndex() {\n\t\tthis._loading.value = true;\n\t\tconst results = await NpmModuleApiController.multiPlayer.userRequests.index();\n\t\tthis._loading.value = false;\n\t\tif (results) {\n\t\t\tthis._userRequests.value = results.requests;\n\t\t} else {\n\t\t\tthis._error.value = 'users could not be loaded';\n\t\t}\n\t}\n\n\tasync approve(username: string) {\n\t\treturn await NpmModuleApiController.multiPlayer.userRequests.approve(username);\n\t}\n\tasync reject(username: string) {\n\t\treturn await NpmModuleApiController.multiPlayer.userRequests.reject(username);\n\t}\n}\n","import {MultiPlayerControllerClass} from './../MultiPlayerController';\nimport {NpmModuleApiController} from './../../../../../npm_module/NpmModuleApiController';\nimport {ref, Ref, computed} from 'vue';\nimport {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {StoreController} from '../../StoreController';\n\nexport class MultiPlayerUsersStoreController {\n\tconstructor(public readonly multiPlayer: MultiPlayerControllerClass) {}\n\n\tprivate _loading: Ref<boolean> = ref(false);\n\tprivate _error: Ref<string | null> = ref(null);\n\tprivate _users: Ref<MultiPlayer.User.ServerSideUserData[]> = ref([]);\n\n\tcurrentUser = computed(() => {\n\t\tconst _currentUser = StoreController.editor.currentUser.username().value;\n\t\treturn this._users.value.find((user) => user.username == _currentUser);\n\t});\n\tcurrentUserInUsers = computed(() => this.currentUser.value != null);\n\tloading() {\n\t\treturn this._loading.value;\n\t}\n\terror() {\n\t\treturn this._error.value;\n\t}\n\tusers() {\n\t\treturn this._users.value;\n\t}\n\tusersRef() {\n\t\treturn this._users;\n\t}\n\tsetUsers(users: MultiPlayer.User.ServerSideUserData[]) {\n\t\tthis._users.value = users;\n\t}\n\tasync fetchIndex() {\n\t\tthis._loading.value = true;\n\t\tconst results = await NpmModuleApiController.multiPlayer.users.index();\n\t\tthis._loading.value = false;\n\t\tif (results) {\n\t\t\tthis._users.value = results.users;\n\t\t} else {\n\t\t\tthis._error.value = 'users could not be loaded';\n\t\t}\n\t}\n}\n","import {MultiPlayerSessionsStoreController} from './multiPlayer/MultiPlayerSessionsStoreController';\nimport {MultiPlayerAwarenessStoreController} from './multiPlayer/MultiPlayerAwarenessStoreController';\nimport {MultiPlayerFollowStoreController} from './multiPlayer/MultiPlayerFollowStoreController';\nimport {MultiPlayerCommandsStoreController} from './multiPlayer/MultiPlayerCommandsStoreController';\nimport {MultiPlayerSceneDataStoreController} from './multiPlayer/MultiPlayerSceneDataStoreController';\nimport {MultiPlayerUserRequestsStoreController} from './multiPlayer/MultiPlayerUserRequestsController';\nimport {MultiPlayerUsersStoreController} from './multiPlayer/MultiPlayerUsersStoreController';\nimport {MathUtils} from 'three';\nimport {StoreController} from './../StoreController';\nimport {computed} from 'vue';\nimport {LinkIndex} from './../../../components/panels/common/LinkIndex';\nimport {router, closeModals} from '../../../../routes';\nimport {EditorRoute} from '../../../../npm_module/NpmModuleTypes';\n\nexport const MULTIPLAYER_AWARENESS_DEFAULT_LINK_INDEX: LinkIndex = 1;\n\nexport class MultiPlayerControllerClass {\n\tprivate static _instance: MultiPlayerControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new MultiPlayerControllerClass());\n\t}\n\n\tpublic readonly awareness = new MultiPlayerAwarenessStoreController(this);\n\tpublic readonly commands = new MultiPlayerCommandsStoreController(this);\n\tpublic readonly follow = new MultiPlayerFollowStoreController(this);\n\tpublic readonly sceneData = new MultiPlayerSceneDataStoreController(this);\n\tpublic readonly sessions = new MultiPlayerSessionsStoreController(this);\n\tpublic readonly userRequests = new MultiPlayerUserRequestsStoreController(this);\n\tpublic readonly users = new MultiPlayerUsersStoreController(this);\n\n\tprivate constructor() {}\n\n\t// private _displayed: Ref<boolean> = ref(false);\n\n\t// getters\n\t// displayed() {\n\t// return this._displayed.value;\n\t// }\n\tloading = computed(() => this.users.loading() || this.userRequests.loading() || this.sessions.loading());\n\terror = computed(() => this.users.error() || this.userRequests.error() || this.sessions.error());\n\tshareUrl = computed(() => this.sessions.shareUrl());\n\tsessionCreateAllowed = computed(() => this.sessions.creationAllowed());\n\tsessionStartedBy = computed(() => this.sessions.startedBy());\n\tactive = computed(() => this.sessions.active.value);\n\n\topen(): void {\n\t\t// this._displayed.value = true;\n\t\trouter.push({name: EditorRoute.MULTIPLAYER});\n\t}\n\tclose() {\n\t\t// this._displayed.value = false;\n\t\tcloseModals();\n\t}\n\n\tsceneName() {\n\t\treturn StoreController.engine.scene?.name() || this._defaultSceneName();\n\t}\n\tprivate __defaultSceneName: string | undefined;\n\tprivate _defaultSceneName() {\n\t\treturn (this.__defaultSceneName =\n\t\t\tthis.__defaultSceneName ||\n\t\t\t[\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t\tMathUtils.generateUUID(),\n\t\t\t].join('-'));\n\t}\n}\n\nexport const MultiPlayerController = MultiPlayerControllerClass.instance();\n","import {Ref, ref} from 'vue';\n\nexport class NodeInfoControllerClass {\n\tprivate static _instance: NodeInfoControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NodeInfoControllerClass());\n\t}\n\n\tprivate constructor() {}\n\n\tpublic readonly displayedByNodeId: Ref<Record<number, boolean>> = ref({});\n}\n\nexport const NodeInfoController = NodeInfoControllerClass.instance();\n","import {MarketPlace, PolyNode, MultiPlayer, EditorSaveOptions, Capture} from '../npm_module/NpmModuleTypes';\n// import { PolyScene, StringParam, DesktopFileType } from \"./editor_global_types\";\n// export type SceneJsonExporterData = any;\n// START OF PART TO REPLACE\nimport {NavigationHistoryJSON} from './store/controllers/editor/NavigationHistoryController';\nimport {SceneJsonExporterData} from '../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {ParamModalLayoutJSON} from './store/controllers/editor/EditorParamsModalsController';\nimport {BaseNodeType} from '../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {LinkIndexInitLayoutData} from './components/panels/common/LinkIndex';\nimport {CoreGraphNodeId} from '../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n// import {BaseCommand} from './history/commands/_Base';\n// END OF PART TO REPLACE\n\n// export enum NewProjectStartMode {\n// \tFROM_SCRATCH = 'from_scratch',\n// \tFROM_SCENE_JSON = 'from_scene_json',\n// }\n// export interface NewProjectOptions {\n// \tstart_mode: NewProjectStartMode;\n// \tscene_data?: string;\n// }\nexport interface DesktopLoginOptions {\n\temail: string;\n\tpassword: string;\n}\n\nexport enum EditorEvent {\n\tNEW_SCENE = 'NEW_SCENE',\n\tDASHBOARD = 'DASHBOARD',\n\tPLAY = 'PLAY',\n\t// OPEN_EXPORT_PANEL = 'OPEN_EXPORT_PANEL',\n\tVIEW_EXPORT = 'VIEW_EXPORT',\n\tSAVE = 'SAVE',\n\tFORK = 'FORK',\n\tSAVE_AS = 'SAVE_AS',\n\t// LOAD_SCENE = 'LOAD_SCENE',\n\t// SCENE_CREATED = 'SCENE_CREATED',\n\tCREATE_POLY_NODE = 'CREATE_POLY_NODE',\n\tSAVE_POLY_NODE = 'SAVE_POLY_NODE',\n\tMARKETPLACE_DOWNLOAD_POLY_NODE = 'MARKETPLACE_DOWNLOAD_POLY_NODE',\n\tMARKETPLACE_UPLOAD_POLY_NODE = 'MARKETPLACE_UPLOAD_POLY_NODE',\n\tMARKETPLACE_INDEX_POLY_NODE = 'MARKETPLACE_INDEX_POLY_NODE',\n\tMARKETPLACE_SEARCH = 'MARKETPLACE_SEARCH',\n\tSETTINGS = 'SETTINGS',\n\tVIEWER_CAPTURE_STATIC = 'VIEWER_CAPTURE_STATIC',\n\tVIEWER_CAPTURE_ANIMATION = 'VIEWER_CAPTURE_ANIMATION',\n\tVIEWER_CAPTURE_ANIMATION_FRAME_SAVE = 'VIEWER_CAPTURE_ANIMATION_FRAME_SAVE',\n\tVIEWER_CAPTURE_ANIMATION_FRAME_LOAD = 'VIEWER_CAPTURE_ANIMATION_FRAME_LOAD',\n\tLOCAL_ASSET_UPLOAD_REQUEST = 'LOCAL_ASSET_UPLOAD_REQUEST',\n\tLIBRARY_INSTALL_DRACO_REQUEST = 'LIBRARY_INSTALL_DRACO_REQUEST',\n\t// commands\n\t// COMMAND_PUSH = 'COMMAND_PUSH',\n\t// COMMAND_UNDO = 'COMMAND_UNDO',\n\t// COMMAND_REDO = 'COMMAND_REDO',\n\t// desktop\n\t// NEW_PROJECT = 'NEW_PROJECT',\n\t// SAVE_PROJECT = 'SAVE_PROJECT',\n\t// OPEN_PROJECT = 'OPEN_PROJECT',\n\t// LOGOUT = 'LOGOUT',\n\t// QUIT = 'QUIT',\n\t// FILE_BROWSE = 'FILE_BROWSE',\n\t// user\n\t// ACCOUNT_SETTINGS = 'ACCOUNT_SETTINGS',\n\tLOGOUT = 'LOGOUT',\n\tDISPLAY_LOGIN_FORM = 'DISPLAY_LOGIN_FORM',\n\tMOUNTED = 'MOUNTED',\n}\n\nexport enum EditorType {\n\tWEB = 'web',\n\tLOCAL = 'local',\n}\n\nexport enum MultiplePanelSplitMode {\n\tHORIZONTAL = 'horizontal',\n\tVERTICAL = 'vertical',\n}\n\nexport enum PanelType {\n\t// ASSET = 'asset',\n\t// CUSTOM_NODE_EDITOR = 'custom_node_editor',\n\tANIMATION = 'animation',\n\tNETWORK = 'network',\n\tPARAMS = 'params',\n\t// PARAM_EDIT = 'param_edit',\n\tPERFORMANCE = 'performance',\n\tSPREADSHEET = 'spreadsheet',\n\tVIEWER = 'viewer',\n\t// ASSETS = 'assets',\n\tSCENE_TREE = 'sceneTree',\n\tCODE_PREVIEW = 'codePreview',\n\tNODE_DOCS = 'nodeDocs',\n\tPARAMS_STACK = 'paramsStack',\n}\nexport const PANEL_TYPES: Array<PanelType> = [\n\t// PanelType.ASSET,\n\t// PanelType.CUSTOM_NODE_EDITOR,\n\tPanelType.NETWORK,\n\tPanelType.PARAMS,\n\t// PanelType.PARAM_EDIT,\n\tPanelType.PERFORMANCE,\n\tPanelType.SPREADSHEET,\n\tPanelType.VIEWER,\n\tPanelType.SCENE_TREE,\n\tPanelType.CODE_PREVIEW,\n\tPanelType.NODE_DOCS,\n\tPanelType.PARAMS_STACK,\n\t// PanelType.ASSETS,\n\tPanelType.ANIMATION,\n];\n// if (process.env.NODE_ENV == 'development') {\n// \tPANEL_TYPES.push(PanelType.ANIMATION);\n// }\n\nexport interface CustomPanelInitLayoutData {}\nexport interface AnimationPanelInitLayoutData extends LinkIndexInitLayoutData {}\nexport interface NetworkPanelInitLayoutData extends LinkIndexInitLayoutData {\n\tcamera: MultiPlayer.Awareness.CameraData;\n\thistory: Dictionary<MultiPlayer.Awareness.CameraData>;\n\tparamsDisplayed: boolean;\n}\nexport interface ParamsPanelInitLayoutData extends LinkIndexInitLayoutData {}\nexport interface PerformancePanelInitLayoutData {\n\trecording: boolean;\n}\nexport interface SceneTreePanelInitLayoutData {\n\tmask: string;\n}\nexport interface ShaderCodePreviewPanelInitLayoutData extends LinkIndexInitLayoutData {}\nexport interface SpreadsheetPanelInitLayoutData extends LinkIndexInitLayoutData {}\nexport interface NodeDocsPanelInitLayoutData extends LinkIndexInitLayoutData {}\n\nexport interface ParamsStackItemData {\n\tnodeId: CoreGraphNodeId;\n\texpanded: boolean;\n}\nexport interface SerializedParamsStackItemData {\n\tnodePath: string;\n\texpanded: boolean;\n}\n\nexport interface ParamsStackPanelInitLayoutData extends LinkIndexInitLayoutData {\n\tserializedStack: SerializedParamsStackItemData[];\n}\nexport interface ViewerPanelInitLayoutData extends LinkIndexInitLayoutData {\n\tisViewerInitLayoutData: boolean;\n\tcamera?: string;\n\toverlayedNetwork?: {\n\t\tallowed: boolean;\n\t\tdisplayed: boolean;\n\t\tinitLayoutData?: NetworkPanelInitLayoutData;\n\t};\n\t// html?: {\n\t// \tactive: boolean;\n\t// \thtml: string;\n\t// \tviewerId: string;\n\t// \tinShadowRoot: boolean;\n\t// };\n}\nexport type PanelData =\n\t| CustomPanelInitLayoutData\n\t| NetworkPanelInitLayoutData\n\t| ParamsPanelInitLayoutData\n\t| PerformancePanelInitLayoutData\n\t| SceneTreePanelInitLayoutData\n\t| ShaderCodePreviewPanelInitLayoutData\n\t| SpreadsheetPanelInitLayoutData\n\t| ViewerPanelInitLayoutData\n\t| NodeDocsPanelInitLayoutData\n\t| ParamsStackPanelInitLayoutData;\n// type ViewerPanelInitLayoutData = object;\nexport interface PanelInitLayoutData {\n\tpanelTypes?: PanelType[];\n\tcurrentPanelIndex?: number;\n\tsplit_mode?: MultiplePanelSplitMode;\n\tsplit_ratio?: number;\n\tsplit_panel0?: PanelInitLayoutData;\n\tsplit_panel1?: PanelInitLayoutData;\n\tpanel_data?: PanelData;\n\t// viewer?: ViewerPanelInitLayoutData;\n}\nexport interface PanelInitLayoutDataLegacy extends PanelInitLayoutData {\n\tpanel_types?: string[];\n\tcurrent_panel_index?: number;\n}\n\nexport interface MultiplePanelProps {\n\tinit_layout_data: PanelInitLayoutData;\n\tlevel: number;\n\tpanelId: string;\n\tpanelSide: number;\n\t// scene_update_allowed: boolean;\n}\n\nexport interface EditorLayoutData {\n\tmultiple_panel: PanelInitLayoutData;\n\tcurrent_node?: string;\n\tcurrentNodes: string[];\n\tnavigationHistory?: NavigationHistoryJSON;\n\tfullscreenPanelId: string | null;\n\tsaveOptions?: EditorSaveOptions;\n\tparamsModal?: ParamModalLayoutJSON;\n}\nexport interface EditorLayoutDataLegacy extends EditorLayoutData {\n\tfullscreen_panel_id: string | null;\n}\n\nexport interface DropDownMenuEntry {\n\tid: string;\n\tlabel?: string;\n\tdisabled?: boolean;\n\tchildren?: DropDownMenuEntry[];\n\tseparatorBefore?: boolean;\n\tseparatorAfter?: boolean;\n\temphasis?: Array<[number, number]>;\n}\n\nexport enum TopMenuFileEntry {\n\t// web editor\n\tNEW_SCENE = 'New Scene',\n\tSAVE_SCENE = 'Save Scene',\n\tSAVE_SCENE_AS = 'Save As...',\n\t// LOAD_SCENE = 'Load',\n\tSCENE_SETTINGS = 'Scene Settings',\n\tPREFERENCES = 'Preferences...',\n\tEXPORT_SCENE = 'Export Scene',\n\tVIEW_EXPORT = 'View Export',\n\tPUBLIC_PAGE = 'Public Page',\n\tDASHBOARD = 'Dashboard',\n\t// windows\n\tLIBRARIES_MANAGER = 'Libraries Manager',\n\tFULLSCREEN = 'Fullscreen',\n\tROOT_NODE_PARAMS = 'Root Node Params',\n\tASSETS = 'Assets',\n\tSHARE_SCENE = 'Share Scene',\n\tMULTIPLAYER = 'Multiplayer',\n\tMARKETPLACE = 'Marketplace',\n\t// desktop\n\t// NEW_PROJECT = 'New Project',\n\t// OPEN_PROJECT = 'Open Project',\n\t// SAVE_PROJECT = 'Save Project',\n\t// LOGOUT = 'Logout',\n\tQUIT = 'Quit', // figma\n}\n\nexport interface EditorProps {\n\t// scene_update_allowed?: boolean;\n\tcurrent_node?: string;\n\tcurrentNodes?: string[];\n\tnavigationHistory?: NavigationHistoryJSON;\n\tscene_load_warnings?: string[];\n\t// selected?: string;\n\tperf?: boolean;\n\t// play?: boolean;\n\t//\n\tfullscreenPanelId?: string | null;\n\tsaveOptions?: EditorSaveOptions;\n\tparamsModal?: ParamModalLayoutJSON;\n\tinit_layout_data?: PanelInitLayoutData;\n\ttop_menu_entries?: TopMenuFileEntry[];\n\tshow_local_install_notice?: boolean;\n}\nexport interface EditorPropsLegacy extends EditorProps {\n\tfullscreen_panel_id?: string | null;\n}\n\ntype NoArgsCallback = () => void;\nexport type OnSaveCallback = (\n\tscene: PolyScene,\n\tscene_json: SceneJsonExporterData,\n\tlayout_data: EditorLayoutData\n\t// Version is removed to avoid having unnecessary webpack define when using the engine.\n\t// Instead, it should be possible to simply save the same version than the one of the loaded js.\n\t// engine_version: string\n) => Promise<void>;\n// export type OnExportPanelCallback = () => // scene: PolyScene,\n// // blobs: {polygonjs: Blob; zipWithHTML: Blob},\n// // scene_json: SceneJsonExporterData,\n// // layout_data: EditorLayoutData\n// void;\nexport type OnViewExportCallback = (scene: PolyScene) => void;\n\nexport type OnLoadCallback = () => void;\nexport type OnSceneCreatedCallback = (scene: PolyScene) => void;\n\nexport interface PolyNodeCreateCallbackData {\n\tnode: BaseNodeType;\n\tpolyNodeData: PolyNode.DataRegisterDummy;\n\tcallback: (newNode?: BaseNodeType) => void;\n}\nexport interface PolyNodeUpdateCallbackData {\n\tnode: BaseNodeType;\n\tpolyNodeData: PolyNode.DataRegisterDummy;\n\tcallback: (newNode?: BaseNodeType) => void;\n}\nexport interface PolyNodeDownloadCallbackData {\n\tnode_context: string;\n\tnode_type: string;\n\tversion: number;\n\t// \t// fromOtherUser: false,\n\tusername: string;\n\tcallback: (updatedNodes?: BaseNodeType[]) => void;\n}\nexport interface PolyNodeUploadCallbackData {\n\tnode_context: string;\n\tnode_type: string;\n}\nexport interface PolyNodeIndexCallbackData {}\nexport interface PolyNodeSearchCallbackData {\n\tq: string;\n}\nexport type OnCreatePolyNodeCallback = (data: PolyNodeCreateCallbackData) => void;\nexport type OnSavePolyNodeCallback = (data: PolyNodeUpdateCallbackData) => void;\nexport type OnMarketplaceDownloadPolyNodeCallback = (data: PolyNodeDownloadCallbackData) => Promise<void>;\nexport type OnMarketplaceUploadPolyNodeCallback = (data: PolyNodeUploadCallbackData) => Promise<void>;\nexport type OnMarketplaceIndexPolyNodeCallback = (\n\tdata: PolyNodeIndexCallbackData\n) => Promise<MarketPlace.PolyNodeIndexResponseFromLocal | undefined>;\nexport type OnMarketplaceSearchPolyNodeCallback = (\n\tdata: PolyNodeSearchCallbackData\n) => Promise<MarketPlace.PolyNodeSearchResponseFromMarket>;\n\ntype OnViewerCaptureCompletedCallback = (file: File) => Promise<void>;\nexport interface CaptureOnFrameSaveOptions {\n\tfile: File;\n\trendererNodePath: string;\n\tfileName: string;\n}\ntype OnViewerCaptureAnimationFrameSaveCallback = (options: CaptureOnFrameSaveOptions) => Promise<void>;\nexport interface CaptureOnFrameReadOptions {\n\trendererNodePath: string;\n\tfileName: string;\n}\ntype OnViewerCaptureAnimationFrameLoadCallback = (\n\toptions: CaptureOnFrameReadOptions\n) => Promise<Capture.RequestLoadAnimationFrameResponse | undefined>;\ntype OnLocalAssetUploadRequestCallback = (file: File) => Promise<void>;\ntype OnLibraryInstallDracoRequestCallback = () => Promise<void>;\n// type OnCommandPush = (command: BaseCommand) => Promise<void>;\n// type OnUndo = () => Promise<void>;\n// type OnRedo = () => Promise<void>;\n// type OnFileBrowseCallback = (param: StringParam) => void;\n// export type OnNewProjectCallback = (options: NewProjectOptions) => Promise<void>;\n\nexport interface CallbackByEditorEvent {\n\t[EditorEvent.NEW_SCENE]: NoArgsCallback | undefined;\n\t[EditorEvent.DASHBOARD]: NoArgsCallback | undefined;\n\t[EditorEvent.PLAY]: NoArgsCallback | undefined;\n\t// [EditorEvent.OPEN_EXPORT_PANEL]: OnExportPanelCallback | undefined;\n\t[EditorEvent.VIEW_EXPORT]: OnViewExportCallback | undefined;\n\t[EditorEvent.SAVE]: OnSaveCallback | undefined;\n\t[EditorEvent.FORK]: OnSaveCallback | undefined;\n\t[EditorEvent.SAVE_AS]: OnSaveCallback | undefined;\n\t// [EditorEvent.LOAD_SCENE]: OnLoadCallback | undefined;\n\t// [EditorEvent.SCENE_CREATED]: OnSceneCreatedCallback | undefined;\n\t[EditorEvent.CREATE_POLY_NODE]: OnCreatePolyNodeCallback | undefined;\n\t[EditorEvent.SAVE_POLY_NODE]: OnSavePolyNodeCallback | undefined;\n\t[EditorEvent.MARKETPLACE_DOWNLOAD_POLY_NODE]: OnMarketplaceDownloadPolyNodeCallback | undefined;\n\t[EditorEvent.MARKETPLACE_UPLOAD_POLY_NODE]: OnMarketplaceUploadPolyNodeCallback | undefined;\n\t[EditorEvent.MARKETPLACE_INDEX_POLY_NODE]: OnMarketplaceIndexPolyNodeCallback | undefined;\n\t[EditorEvent.MARKETPLACE_SEARCH]: OnMarketplaceSearchPolyNodeCallback | undefined;\n\t[EditorEvent.SETTINGS]: NoArgsCallback | undefined;\n\t[EditorEvent.VIEWER_CAPTURE_STATIC]: OnViewerCaptureCompletedCallback | undefined;\n\t[EditorEvent.VIEWER_CAPTURE_ANIMATION]: OnViewerCaptureCompletedCallback | undefined;\n\t[EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_SAVE]: OnViewerCaptureAnimationFrameSaveCallback | undefined;\n\t[EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_LOAD]: OnViewerCaptureAnimationFrameLoadCallback | undefined;\n\t[EditorEvent.LOCAL_ASSET_UPLOAD_REQUEST]: OnLocalAssetUploadRequestCallback | undefined;\n\t[EditorEvent.LIBRARY_INSTALL_DRACO_REQUEST]: OnLibraryInstallDracoRequestCallback | undefined;\n\t// [EditorEvent.COMMAND_PUSH]: OnCommandPush | undefined;\n\t// [EditorEvent.COMMAND_UNDO]: OnUndo | undefined;\n\t// [EditorEvent.COMMAND_REDO]: OnRedo | undefined;\n\t// [EditorEvent.NEW_PROJECT]: OnNewProjectCallback | undefined;\n\t// [EditorEvent.SAVE_PROJECT]: OnSaveCallback | undefined;\n\t// [EditorEvent.OPEN_PROJECT]: NoArgsCallback | undefined;\n\t// [EditorEvent.QUIT]: NoArgsCallback | undefined;\n\t// [EditorEvent.FILE_BROWSE]: OnFileBrowseCallback | undefined;\n\t[EditorEvent.LOGOUT]: NoArgsCallback | undefined;\n\t// [EditorEvent.ACCOUNT_SETTINGS]: NoArgsCallback | undefined;\n\t[EditorEvent.DISPLAY_LOGIN_FORM]: NoArgsCallback | undefined;\n\t[EditorEvent.MOUNTED]: NoArgsCallback | undefined;\n}\n\nexport interface SceneData {\n\tjson: SceneJsonExporterData;\n\tuuid?: string;\n\tname?: string;\n\tassets_root?: string;\n}\n// just to make it a module\nexport const test = {};\n","import {PolyDictionary} from './../../../../types/GlobalTypes';\nimport {PolyNodeDefinition} from './../../../nodes/utils/poly/PolyNodeDefinition';\nimport {PolyScene} from '../../../scene/PolyScene';\nimport {NodeJsonExporterData, NodeJsonExporterUIData, NodeJSONFunctionBodiesData, NodeJSONShadersData} from './Node';\nimport {JsonExportDispatcher} from './Dispatcher';\nimport {TimeController} from '../../../scene/utils/TimeController';\n\ninterface Versions {\n\tpolygonjs: string;\n}\nexport interface SceneJsonExporterDataProperties {\n\tframe: number;\n\tmaxFrame: number;\n\tmaxFrameLocked: boolean;\n\trealtimeState: boolean;\n\tmainCameraPath?: string | null;\n\tmainCameraNodePath?: string | null;\n\tversions?: Versions;\n}\nexport interface SceneJsonExporterData {\n\tproperties?: SceneJsonExporterDataProperties;\n\troot?: NodeJsonExporterData;\n\tui?: NodeJsonExporterUIData;\n\tshaders?: NodeJSONShadersData;\n\tjsFunctionBodies?: NodeJSONFunctionBodiesData;\n\tembeddedPolyNodes?: PolyDictionary<PolyNodeDefinition>;\n}\n\ninterface SceneJsonExporterDataOptions {\n\tversions?: Versions;\n\twithPersistedConfig?: boolean;\n}\n\nexport class SceneJsonExporter {\n\tprivate _data: SceneJsonExporterData = {};\n\tprivate dispatcher: JsonExportDispatcher = new JsonExportDispatcher();\n\tconstructor(private _scene: PolyScene) {}\n\n\tasync data(options: SceneJsonExporterDataOptions = {}): Promise<SceneJsonExporterData> {\n\t\tthis._scene.nodesController.resetNodeContextSignatures();\n\t\tconst rootExporter = this.dispatcher.dispatchNode(this._scene.root());\n\t\tconst nodesData = await rootExporter.data(options);\n\t\tconst uiData = rootExporter.uiData(options);\n\t\tconst shadersData: NodeJSONShadersData = {};\n\t\tconst jsFunctionBodiesData: NodeJSONFunctionBodiesData = {};\n\t\tawait rootExporter.persistedConfigData(shadersData, jsFunctionBodiesData, options);\n\n\t\tthis._data = {\n\t\t\tproperties: {\n\t\t\t\tframe: this._scene.frame() || TimeController.START_FRAME,\n\t\t\t\tmaxFrame: this._scene.maxFrame(),\n\t\t\t\tmaxFrameLocked: this._scene.timeController.maxFrameLocked(),\n\t\t\t\trealtimeState: this._scene.timeController.realtimeState(),\n\t\t\t\tmainCameraPath: this._scene.camerasController.mainCameraPath(),\n\t\t\t\tversions: options.versions,\n\t\t\t},\n\t\t\troot: nodesData,\n\t\t\tui: uiData,\n\t\t\tshaders: shadersData,\n\t\t\tjsFunctionBodies: jsFunctionBodiesData,\n\t\t};\n\n\t\treturn this._data;\n\t}\n}\n","import {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {SceneJsonExporter} from '../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport engine_config from '../../@polygonjs/polygonjs/package.json';\nimport editor_config from '../../package.json';\ninterface PackageConfig {\n\tversion: string;\n\tname: string;\n}\nconst ENGINE_VERSION = (engine_config as PackageConfig).version;\nconst EDITOR_VERSION = (editor_config as PackageConfig).version;\n\nexport function versions() {\n\treturn {\n\t\tpolygonjs: ENGINE_VERSION,\n\t\teditor: EDITOR_VERSION,\n\t};\n}\n\ninterface SceneDataWithVersionOptions {\n\tscene: PolyScene;\n\twithPersistedConfig: boolean;\n}\n\nexport function sceneDataWithVersion(options: SceneDataWithVersionOptions) {\n\tconst exporter = new SceneJsonExporter(options.scene);\n\tconst sceneData = exporter.data({\n\t\tversions: {polygonjs: ENGINE_VERSION},\n\t\twithPersistedConfig: options.withPersistedConfig,\n\t});\n\treturn sceneData;\n}\n\n// this returns a version like\n//\n// 1.4.16 (editor: 1.4.16-1)\n//\n// which is the same as in the file\n// config/initializers/js_versions.json\nexport function jsVersionMatchingWebApp() {\n\tconst {polygonjs, editor} = versions();\n\treturn `${polygonjs} (editor: ${editor})`;\n}\n","import type {BaseNodeType} from './../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport type {PolyScene} from './../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport type {BaseNodeClass} from '../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport type {ExpressionType} from '../../../@polygonjs/polygonjs/src/engine/expressions/methods/Common';\nimport type {Editor} from '../../editor/Editor';\nimport type {NodeContext} from '../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nexport type OnAfterExampleLoaded = () => void;\n\nexport interface ExampleData {\n\tscene: PolyScene;\n\tcameraPath: string;\n\tfocusedNodes: Readonly<BaseNodeType[]> | undefined;\n\tautoLayout?: boolean;\n\tplayWhenLoaded?: boolean;\n\tonAfterLoaded?: OnAfterExampleLoaded;\n}\nexport interface DataCallbackOptions {\n\tscene: PolyScene;\n\tEditor: typeof Editor;\n}\ntype DataCallback = (options: DataCallbackOptions) => ExampleData;\ninterface DataCallbackExport {\n\tcreateData: DataCallback;\n}\n\nexport enum ExamplePrefix {\n\tBY_NODE = 'By Node',\n\tBY_CATEGORY = 'By Category',\n\tUSING_EXPRESSIONS = 'Using Expressions',\n\t//\n\t// CUSTOM_MATERIALS = 'Custom Materials',\n\t// EFFECTS = 'Effects',\n\t// PHYSICS = 'Physics',\n\t// HTML_IN_3D = 'HTML in 3D',\n\t// AR = 'AR',\n\t// VR = 'VR',\n\t// COMPUTER_VISION = 'Computer Vision',\n}\nexport enum ExampleCategory {\n\tANIMATION = 'Animation',\n\tCONTROLS = 'Controls',\n\tCUSTOM_MATERIALS = 'Custom Materials',\n\tEFFECTS = 'Effects',\n\tHTML_IN_3D = 'HTML in 3D',\n\tINSTANCING = 'Instancing',\n\tMAPS = 'Maps',\n\tMODELING = 'Modeling',\n\tPHYSICS = 'Physics',\n\tRENDER = 'Render',\n\tSTATE_AND_EVENTS = 'State & Events',\n\tASSETS = 'Assets',\n\tAR = 'AR',\n\tVR = 'VR',\n\tCOMPUTER_VISION = 'Computer Vision',\n}\nexport const EXAMPLE_CATEGORIES: ExampleCategory[] = [\n\tExampleCategory.CUSTOM_MATERIALS,\n\tExampleCategory.CONTROLS,\n\tExampleCategory.STATE_AND_EVENTS,\n\tExampleCategory.EFFECTS,\n\tExampleCategory.INSTANCING,\n\tExampleCategory.PHYSICS,\n\tExampleCategory.MAPS,\n\tExampleCategory.MODELING,\n\tExampleCategory.ANIMATION,\n\tExampleCategory.ASSETS,\n\tExampleCategory.HTML_IN_3D,\n\tExampleCategory.AR,\n\tExampleCategory.VR,\n\tExampleCategory.COMPUTER_VISION,\n];\n// interface NodeDescriptor {\n// \tcontext:NodeContext\n// \ttype:string\n// }\nexport interface NodeContextAndType {\n\tcontext: NodeContext;\n\ttype: string;\n}\n\nexport interface ExampleRelatedNodeWithLabel {\n\tnode: typeof BaseNodeClass;\n\tlabel: string;\n}\nexport interface ExampleCategoryWithLabel {\n\tcategory: ExampleCategory;\n\tlabel: string;\n}\nexport type ExampleRelatedNodes = Array<ExampleRelatedNodeWithLabel | typeof BaseNodeClass>;\nexport type ExampleCategories = Array<ExampleCategoryWithLabel | ExampleCategory>;\nexport type ExampleRelatedExpressions = Array<ExpressionType>;\nexport interface ExampleBaseOptions {\n\tname: string;\n\t//\n\tcategories?: ExampleCategories;\n\trelatedNodeContextAndTypes?: NodeContextAndType[];\n\trelatedExpressionTypes?: ExpressionType[];\n\tlabel?: string;\n\tlabelByCategory?: Record<ExampleCategory, string>;\n\t// thumbnail?: boolean;\n}\nexport interface ExampleOptions extends ExampleBaseOptions {\n\tcreateData: () => Promise<DataCallbackExport>;\n}\n// export interface ExampleAsyncOptions extends ExampleBaseOptions {\n// \tcreateData: () => Promise<DataCallback>;\n// }\nexport function exampleNameToId(exampleName: string): string {\n\treturn exampleName\n\t\t.replace(/[^A-Za-z0-9\\/]/g, '')\n\t\t.toLowerCase()\n\t\t.replace(/\\//g, ':');\n}\n","export async function ExamplesRegisterAsync() {\n\tconst {__ExamplesRegister__} = await import('./ExamplesRegister');\n\tconst ExamplesRegisterAsync = __ExamplesRegister__;\n\treturn ExamplesRegisterAsync;\n}\n","import {PolyScene} from '../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {CoreString} from '../../../../../@polygonjs/polygonjs/src/core/String';\nimport {CodeExporterDispatcher} from './Dispatcher';\n\nexport class SceneCodeExporter {\n\tconstructor(private _scene: PolyScene) {}\n\n\tprocess(): string {\n\t\tconst lines: string[] = [];\n\n\t\tthis._scene.nodesController.resetNodeContextSignatures();\n\n\t\tCodeExporterDispatcher.dispatch_node(this._scene.root(), {})\n\t\t\t.create()\n\t\t\t.forEach((root_line) => {\n\t\t\t\tlines.push(root_line);\n\t\t\t});\n\n\t\tlines.push(`${this.var_name()}.setFrame(${this._scene.frame() || 1})`);\n\t\tlines.push(`${this.var_name()}.setMaxFrame(${this._scene.maxFrame()})`);\n\t\tlines.push(\n\t\t\t`${this.var_name()}.timeController.setMaxFrameLocked(${this._scene.timeController.maxFrameLocked()})`\n\t\t);\n\t\t// lines.push(`${this.var_name()}.time_controller.set_fps(${this._scene.time_controller.fps})`);\n\n\t\t// const cameraPath = this._scene.camerasController.mainCameraObjectPath();\n\t\t// if (cameraPath) {\n\t\t// \tlines.push(`${this.var_name()}.camerasController.setMainCameraObjectPath('${cameraPath}')`);\n\t\t// }\n\t\tthis.add_semi_colons(lines);\n\t\treturn lines.join('\\n');\n\t}\n\tprivate add_semi_colons(lines: string[]) {\n\t\tconst characters_without_semi_colon = '{}';\n\t\tlines.forEach((line, i) => {\n\t\t\tconst last_char = line[line.length - 1];\n\t\t\tif (!characters_without_semi_colon.includes(last_char)) {\n\t\t\t\tlines[i] = `${line};`;\n\t\t\t}\n\t\t});\n\t}\n\n\tvar_name() {\n\t\t//\"window.scenes_by_uuid['#{this.name()}']\"\n\t\treturn 'scene';\n\t}\n\tstatic sanitize_string(word: string): string {\n\t\tword = word.replace(/'/g, \"\\\\'\"); // escapes ' (uses 2 \\, as opposed to the json exporter which uses only 1)\n\t\tword = CoreString.escapeLineBreaks(word); // escapes line breaks (for shader code for instance)\n\t\treturn word;\n\t}\n}\n","const RESERVED_WORDS = [\n\t'abstract',\n\t'arguments',\n\t'await*',\n\t'boolean',\n\t'break',\n\t'byte',\n\t'case',\n\t'catch',\n\t'char',\n\t'class*',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'double',\n\t'else',\n\t'enum*',\n\t'eval',\n\t'export*',\n\t'extends*',\n\t'false',\n\t'final',\n\t'finally',\n\t'float',\n\t'for',\n\t'function',\n\t'goto',\n\t'if',\n\t'implements',\n\t'import*',\n\t'in',\n\t'instanceof',\n\t'int',\n\t'interface',\n\t'let*',\n\t'long',\n\t'native',\n\t'new',\n\t'null',\n\t'package',\n\t'private',\n\t'protected',\n\t'public',\n\t'return',\n\t'short',\n\t'static',\n\t'super*',\n\t'switch',\n\t'synchronized',\n\t'this',\n\t'throw',\n\t'throws',\n\t'transient',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'volatile',\n\t'while',\n\t'with',\n\t'yield',\n];\n\nexport function ensureNotAReservedWord(word: string) {\n\tif (RESERVED_WORDS.includes(word)) {\n\t\treturn `${word}_NOT_RESERVED`;\n\t}\n\treturn word;\n}\n","import {CoreString} from './../../../../../@polygonjs/polygonjs/src/core/String';\nimport {BaseNodeType, TypedNode} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {arraySortBy, arrayCopy} from '../../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {SceneCodeExporter} from './Scene';\nimport {NodesCodeExporterOption, NodesCodeExporter} from './Nodes';\nimport {CodeExporterDispatcher} from './Dispatcher';\nimport {BaseNodeByContextMap, NodeContext} from '../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n// import {NodeTypeMap} from '../../../../../@polygonjs/polygonjs/src/engine/containers/utils/ContainerMap';\nimport {ensureNotAReservedWord} from './ReservedWords';\nimport {PolyNodeController} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {SetInputsOptions} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/InputsController';\n\ninterface PositionData {\n\tposition_x_offset?: number;\n}\nconst setInputsOptions: SetInputsOptions = {\n\tnoExceptionOnInvalidInput: true,\n};\nconst setInputsOptionsJSON = JSON.stringify(setInputsOptions);\n\nexport class NodeCodeExporter<NC extends NodeContext> {\n\tprotected _lines: string[] = [];\n\tconstructor(protected _node: TypedNode<NC, any>, protected options: NodesCodeExporterOption) {}\n\n\tcreate(parent_var_name?: string): string[] {\n\t\tthis.reset();\n\n\t\tif (!this.is_root()) {\n\t\t\tthis.add_create(parent_var_name);\n\t\t\tthis.add_name();\n\t\t}\n\t\tthis._preAddChildren();\n\t\tif (!this.options.ignoreGrandChildren) {\n\t\t\tthis.add_children();\n\t\t\tthis.add_selection();\n\t\t}\n\n\t\tthis.add_comment();\n\t\tthis.add_position({});\n\t\tthis.add_input_clonable_state();\n\t\tthis.add_flags();\n\t\tthis.add_params();\n\t\tthis.add_custom();\n\n\t\t// already called in create_node()\n\t\t// this._lines.push(`${this.var_name()}.lifecycle.set_creation_completed();`);\n\n\t\treturn this._lines;\n\t}\n\n\tprotected _preAddChildren() {\n\t\tthis._lines.push(this.nodesVarNameDeclareLine());\n\t}\n\n\tset_up(options: object = {}): string[] {\n\t\tthis.reset();\n\t\tthis.add_input();\n\t\t// this.add_position(options)\n\t\t// this.add_bypass_flag()\n\t\t// this.add_params()\n\t\t// this.add_children()\n\t\t// this.add_custom()\n\t\t// this.add_selection()\n\n\t\treturn this._lines;\n\t}\n\t// children_and_selection(): string[]{\n\t// \tthis.reset()\n\t// \tthis.add_children()\n\t// \tthis.add_selection()\n\t// }\n\tcreate_function_declare(parent_var_name: string): string[] {\n\t\tthis._node.scene().nodesController.registerNodeContextSignature(this._node);\n\n\t\tconst ls: string[] = [];\n\t\tls.push(`function ${this.function_name()}(${parent_var_name}/*: ${this.functionArgumentType()}*/){`);\n\t\tthis.create(parent_var_name).forEach((l) => {\n\t\t\tls.push(`\t${l}`);\n\t\t});\n\t\tls.push(`\treturn {node: ${this.var_name()}, children: ${this.nodesVarName()}}`);\n\t\tls.push(`}`);\n\t\treturn ls;\n\t}\n\tcreate_function_call(parentVarName?: string): string {\n\t\tconst parent = this._node.parent();\n\t\tif (!parent) {\n\t\t\treturn 'console.error(\"no parent found\")';\n\t\t}\n\t\tconst parentDispatcher = CodeExporterDispatcher.dispatch_node(parent, this.options);\n\t\tif (parentVarName == null) {\n\t\t\tparentVarName = parentDispatcher.var_name(); //.visit(CodeExporterVisitor).var_name()\n\t\t}\n\t\t// var ${this.var_name()}\n\t\treturn `${this.varNameInParentNodesContainer()} = ${this.function_name()}(${parentVarName})`;\n\t}\n\n\tvar_name(): string {\n\t\tif (this.is_root()) {\n\t\t\tconst scene_exporter = new SceneCodeExporter(this._node.scene());\n\t\t\treturn `${scene_exporter.var_name()}.root`;\n\t\t} else {\n\t\t\t// add a _ in front in case the name starts by a number\n\t\t\t// return `context._${this._node.path().replace(/\\//g, '_').substr(1)}`;\n\t\t\tlet varName = this._node.name().replace(/\\//g, '_');\n\t\t\t// ensure it is not a reserved javascript word\n\t\t\tvarName = ensureNotAReservedWord(varName);\n\t\t\treturn varName;\n\t\t}\n\t}\n\tvarNameInParentNodesContainer() {\n\t\tconst parent = this._node.parent();\n\t\tif (!parent) {\n\t\t\treturn 'console.error(\"no parent found\")';\n\t\t}\n\t\tconst parentDispatcher = CodeExporterDispatcher.dispatch_node(parent, this.options);\n\t\tconst parentNodesVarName = parentDispatcher.nodesVarName();\n\t\treturn `${parentNodesVarName}['${this.var_name()}']`;\n\t}\n\tvarNameInParentNodes() {\n\t\treturn `${this.varNameInParentNodesContainer()}.node`;\n\t}\n\tnodesVarName(): string {\n\t\treturn `${this.var_name()}_nodes`.replace('.', '_');\n\t}\n\tnodesVarNameDeclareLine() {\n\t\treturn `const ${this.nodesVarName()} /*: ReturnedNodeDataDict*/ = {};`;\n\t}\n\tprotected function_name(): string {\n\t\treturn 'create_' + this.var_name().replace(/[^a-z0-9]/gim, '_');\n\t}\n\tprotected functionArgumentType(): string {\n\t\tconst parent = this._node.parent() || this._node.root();\n\t\treturn CoreString.titleize(parent.type()) + CoreString.titleize(parent.context()) + 'Node';\n\t}\n\n\tprivate is_root() {\n\t\treturn this._node.parent() === null && this._node.graphNodeId() == this._node.root().graphNodeId();\n\t}\n\n\tprivate reset() {\n\t\tthis._lines = [];\n\t}\n\n\tprotected add_create(parent_var_name?: string) {\n\t\tif (parent_var_name == null) {\n\t\t\tconst parent = this._node.parent();\n\t\t\tif (parent) {\n\t\t\t\tconst parent_exporter = CodeExporterDispatcher.dispatch_node(parent, this.options);\n\t\t\t\tparent_var_name = parent_exporter.var_name();\n\t\t\t}\n\t\t}\n\t\tconst nodeType = this.options.replaceTypeWith || this._node.type();\n\t\tconst create_node_line = `var ${this.var_name()} = ${parent_var_name}.createNode('${nodeType}')`;\n\t\tthis._lines.push(create_node_line);\n\t}\n\n\tprotected add_name() {\n\t\tif (this._node.graphNodeId() !== this._node.root().graphNodeId()) {\n\t\t\tthis._lines.push(`${this.var_name()}.setName('${this._node.name()}')`);\n\t\t}\n\t}\n\n\tprotected add_input() {\n\t\tconst inputs = this._node.io.inputs.inputs();\n\t\t// this._node.io.inputs.inputs().forEach((input: NodeTypeMap[NC] | null, input_index: number) => {\n\n\t\tfor (let input_index = 0; input_index < inputs.length; input_index++) {\n\t\t\tconst input: BaseNodeByContextMap[NC] | null = inputs[input_index];\n\t\t\t// const input = this._node.input(input_index);\n\t\t\tconst input_connection = this._node.io.connections.inputConnection(input_index);\n\t\t\tif (input && input_connection) {\n\t\t\t\tconst output_index = input_connection.outputIndex();\n\t\t\t\tconst input_exporter = CodeExporterDispatcher.dispatch_node(input, this.options);\n\t\t\t\tlet line;\n\t\t\t\tif (this._node.io.inputs.hasNamedInputs()) {\n\t\t\t\t\tconst inputConnectionPoints = this._node.io.inputs.namedInputConnectionPoints();\n\t\t\t\t\tconst outputConnectionPoints = input.io.outputs.namedOutputConnectionPoints();\n\t\t\t\t\tif (inputConnectionPoints && outputConnectionPoints) {\n\t\t\t\t\t\tconst input_connection_point = inputConnectionPoints[input_index];\n\t\t\t\t\t\tconst output_connection_point = outputConnectionPoints[output_index];\n\t\t\t\t\t\tif (input_connection_point && output_connection_point) {\n\t\t\t\t\t\t\tconst input_name = input_connection_point.name();\n\t\t\t\t\t\t\tconst output_name = output_connection_point.name();\n\t\t\t\t\t\t\tline = `${this.varNameInParentNodes()}.setInput('${input_name}', ${input_exporter.varNameInParentNodes()}, '${output_name}', ${setInputsOptionsJSON})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline = `${this.varNameInParentNodes()}.setInput(${input_index}, ${input_exporter.varNameInParentNodes()}, ${setInputsOptionsJSON})`;\n\t\t\t\t}\n\t\t\t\tif (line) {\n\t\t\t\t\tthis._lines.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprotected add_comment() {\n\t\tconst parent = this._node.parent();\n\t\tif (parent) {\n\t\t\t// if not root\n\t\t\tlet comment = this._node.uiData.comment();\n\t\t\tif (comment) {\n\t\t\t\tcomment = SceneCodeExporter.sanitize_string(comment);\n\t\t\t\tthis._lines.push(`${this.var_name()}.uiData.setComment('${comment}')`);\n\t\t\t}\n\t\t}\n\t}\n\tprotected add_position(options: PositionData = {}) {\n\t\tconst parent = this._node.parent();\n\t\tif (parent) {\n\t\t\t// if not root\n\t\t\tlet x_offset;\n\t\t\tconst pos = this._node.uiData.position().clone();\n\t\t\tif ((x_offset = options['position_x_offset']) != null) {\n\t\t\t\tpos.x += x_offset;\n\t\t\t}\n\t\t\tthis._lines.push(`${this.var_name()}.uiData.setPosition(${pos.x}, ${pos.y})`);\n\t\t}\n\t}\n\n\tprotected add_params() {\n\t\tlet paramsToSave = this._node.params.all;\n\n\t\tif (this.options.replaceTypeWith) {\n\t\t\tconst definition = PolyNodeController.definition(this._node.context(), this.options.replaceTypeWith);\n\t\t\tif (definition) {\n\t\t\t\tconst paramsFromDefinition = definition.params || [];\n\t\t\t\tparamsToSave = paramsToSave.filter((paramToSave) => {\n\t\t\t\t\tconst paramFromDefinition = paramsFromDefinition.find((p) => p.name == paramToSave.name());\n\t\t\t\t\treturn paramFromDefinition != null && paramFromDefinition.type == paramToSave.type();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tparamsToSave.forEach((param) => {\n\t\t\tconst param_exporter = CodeExporterDispatcher.dispatch_param(param);\n\t\t\tconst param_lines: string[] = param_exporter.process();\n\t\t\tparam_lines.forEach((param_line) => {\n\t\t\t\tthis._lines.push(param_line);\n\t\t\t});\n\t\t});\n\n\t\t// to ensure that gl nodes have the spare params up to date\n\t\tthis._lines.push(`${this.var_name()}.params.postCreateSpareParams()`);\n\t\t// to ensure that gl nodes like the constant and attribute have their inputs/outputs updated\n\t\tthis._lines.push(`${this.var_name()}.params.runOnSceneLoadHooks()`);\n\t}\n\n\tprotected add_input_clonable_state() {\n\t\tif (this._node.io.inputs.overrideClonedStateAllowed()) {\n\t\t\tconst overriden = this._node.io.inputs.clonedStateOverriden();\n\t\t\tif (overriden) {\n\t\t\t\tthis._lines.push(`${this.var_name()}.io.inputs.overrideClonedState(true)`);\n\t\t\t}\n\t\t}\n\t}\n\tprotected add_flags() {\n\t\tthis.add_bypass_flag();\n\t\tthis.add_display_flag();\n\t\tthis.add_optimize_flag();\n\t}\n\tprotected add_bypass_flag() {\n\t\tif (this._node.flags?.hasBypass()) {\n\t\t\tif (this._node.flags.bypass?.active()) {\n\t\t\t\tthis._lines.push(`${this.var_name()}.flags.bypass.set(true)`);\n\t\t\t}\n\t\t}\n\t}\n\tprotected add_display_flag() {\n\t\tif (this._node.flags?.hasDisplay()) {\n\t\t\tconst active = this._node.flags.display?.active();\n\t\t\tif (this._node.parent()?.displayNodeController) {\n\t\t\t\tif (active) {\n\t\t\t\t\tthis._lines.push(`${this.var_name()}.flags.display.set(true)`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._lines.push(`${this.var_name()}.flags.display.set(${active})`);\n\t\t\t}\n\t\t}\n\t}\n\tprotected add_optimize_flag() {\n\t\tif (this._node.flags?.hasOptimize()) {\n\t\t\tconst active = this._node.flags.optimize?.active();\n\t\t\tif (active) {\n\t\t\t\tthis._lines.push(`${this.var_name()}.flags.optimize.set(true)`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected add_children() {\n\t\tconst children: BaseNodeType[] = [];\n\t\tarrayCopy(this._node.children(), children);\n\t\tarraySortBy(children, (child) => child.name());\n\t\tconst nodes_exporter = new NodesCodeExporter(children);\n\t\tnodes_exporter.process(this.var_name()).forEach((child_line) => {\n\t\t\tthis._lines.push(child_line);\n\t\t});\n\t}\n\t// protected add_children_function_declare(){\n\t// \tconst nodes_exporter = new NodesExporter(this._node.children())\n\t// \tnodes_exporter.create_function_declare().forEach(child_line=>{\n\t// \t\tthis._lines.push(child_line)\n\t// \t})\n\t// }\n\t// protected add_children_function_call(){\n\t// \tconst nodes_exporter = new NodesExporter(this._node.children())\n\t// \tnodes_exporter.create_function_call().forEach(child_line=>{\n\t// \t\tthis._lines.push(child_line)\n\t// \t})\n\t// }\n\n\tprotected add_custom() {}\n\n\tprotected add_selection() {\n\t\tif (this._node.childrenController?.selection != null) {\n\t\t\tconst varNames: string[] = [];\n\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\tthis._node.childrenController.selection.nodes(nodes);\n\t\t\tfor (let node of nodes) {\n\t\t\t\tconst node_exporter = CodeExporterDispatcher.dispatch_node(node, this.options);\n\t\t\t\tvarNames.push(node_exporter.varNameInParentNodes());\n\t\t\t}\n\t\t\tthis._lines.push(\n\t\t\t\t`if(${this.var_name()}.childrenController){${this.var_name()}.childrenController.selection.set([${varNames.join(\n\t\t\t\t\t', '\n\t\t\t\t)}])}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import {PolyNodeController} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {NodeContext} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n\nimport {NodeCodeExporter} from '../Node';\nexport class PolyNodeCodeExporter extends NodeCodeExporter<NodeContext> {\n\tprotected override add_children() {\n\t\tconst polyNodeController = this._node.polyNodeController as PolyNodeController;\n\n\t\tif (polyNodeController && polyNodeController.locked()) {\n\t\t\tthis._lines.push(`${this.var_name()}.polyNodeController.createChildNodesFromDefinition()`);\n\t\t} else {\n\t\t\tif (polyNodeController) {\n\t\t\t\tthis._lines.push(`${this.var_name()}.polyNodeController.setLockedState(false)`);\n\t\t\t}\n\n\t\t\tsuper.add_children();\n\t\t}\n\n\t\tif (polyNodeController) {\n\t\t\tthis._lines.push(\n\t\t\t\t`${this.var_name()}.polyNodeController.setLockedState(${\n\t\t\t\t\tpolyNodeController.locked() ? 'true' : 'false'\n\t\t\t\t})`\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {TypedNumericParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/_Numeric';\nimport {ParamType} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\n\nexport function escapeExpression(expression: string) {\n\treturn expression.replace(/'/g, \"\\\\'\");\n}\nexport function setNumericContent(param: TypedNumericParam<ParamType>) {\n\tconst expression = param.expressionController?.expression();\n\tif (param.hasExpression() && param.expressionController && expression) {\n\t\tconst escaped_expression = escapeExpression(expression);\n\t\treturn `'${escaped_expression}'`;\n\t} else {\n\t\treturn param.value;\n\t}\n}\nexport class ParamNumericCodeExporter extends ParamCodeExporter<TypedNumericParam<ParamType>> {\n\toverride add_main() {\n\t\t// const expression = this._param.expressionController?.expression();\n\t\t// if (this._param.hasExpression() && this._param.expressionController && expression) {\n\t\t// \tconst escaped_expression = escapeExpression(expression);\n\t\t// \tthis._lines.push(this.prefix() + `.set('${escaped_expression}')`);\n\t\t// } else {\n\t\tthis._lines.push(this.prefix() + `.set(${setNumericContent(this._param)})`);\n\t\t// }\n\t}\n\n\toverride HTMLSnippet() {\n\t\tconst range = this._param.options.range();\n\t\tconst stepFloat = this._param.options.step() || 0.01;\n\t\tconst step = this._param.type() == ParamType.INTEGER ? 1 : stepFloat;\n\t\tconst id = this._HTMLId(this._param);\n\t\tconst label = `<label for='${id}'>${id}</label>`;\n\t\tconst numberInput = `<input type='number' id='${id}' name='${id}' min=${range[0] || 0} max=${\n\t\t\trange[1] || 1\n\t\t} step=${step} value=${this._param.value}></input>`;\n\t\t// const rangeInput = `<input type='range' id='${this._HTMLId()}' name='${this._HTMLId()}' min=${\n\t\t// \trange[0] || 0\n\t\t// } max=${range[1] || 1} step=${step} value=${this._param.value}></input>`\n\t\treturn `${label}\n${numberInput}`;\n\t}\n\toverride JSSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\treturn `document.getElementById('${id}').addEventListener('input', function(event){\n\tscene.node('${this._param.node.path()}').p.${this._param.name()}.set(event.target.value);\n})`;\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {TypedMultipleParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/_Multiple';\nimport {ParamType} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {TypedNumericParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/_Numeric';\nimport {setNumericContent} from './Numeric';\n\nexport class ParamMultipleCodeExporter extends ParamCodeExporter<TypedMultipleParam<ParamType>> {\n\t// as_code_default_value_string() {\n\t// \tlet values = this._param.components.map((c) => c.value);\n\t// \treturn `[${values.join(',')}]`;\n\t// }\n\toverride add_main() {\n\t\t// this._param.components.forEach((component) => {\n\t\t// \tCodeExporterDispatcher.dispatch_param(component)\n\t\t// \t\t.process()\n\t\t// \t\t.forEach((component_line) => {\n\t\t// \t\t\tthis._lines.push(component_line);\n\t\t// \t\t});\n\t\t// });\n\t\tconst componentsContents = this._param.components.map((c) => setNumericContent(c));\n\t\tthis._lines.push(this.prefix() + `.set([${componentsContents.join(', ')}])`);\n\t}\n\toverride HTMLSnippet() {\n\t\treturn this._param.components\n\t\t\t.map((c) => {\n\t\t\t\treturn this._componentHTMLSnippet(c);\n\t\t\t})\n\t\t\t.join('\\n');\n\t}\n\toverride JSSnippet() {\n\t\treturn this._param.components\n\t\t\t.map((c) => {\n\t\t\t\treturn this._componentJSSnippet(c);\n\t\t\t})\n\t\t\t.join('\\n');\n\t}\n\tprivate _componentHTMLSnippet(component: TypedNumericParam<ParamType>) {\n\t\tconst range = component.options.range();\n\t\tconst stepFloat = component.options.step() || 0.01;\n\t\tconst step = component.type() == ParamType.INTEGER ? 1 : stepFloat;\n\t\tconst id = this._HTMLId(component);\n\t\tconst label = `<label for='${id}'>${id}</label>`;\n\t\tconst numberInput = `<input type='number' id='${id}' name='${id}' min=${range[0] || 0} max=${\n\t\t\trange[1] || 1\n\t\t} step=${step} value=${component.value}></input>`;\n\t\t// const rangeInput = `<input type='range' id='${this._HTMLId()}' name='${this._HTMLId()}' min=${\n\t\t// \trange[0] || 0\n\t\t// } max=${range[1] || 1} step=${step} value=${this._param.value}></input>`\n\t\treturn `${label}\n${numberInput}`;\n\t}\n\tprivate _componentJSSnippet(component: TypedNumericParam<ParamType>) {\n\t\tconst id = this._HTMLId(component);\n\t\treturn `document.getElementById('${id}').addEventListener('input', function(event){\n\t\t\tscene.node('${component.node.path()}').p.${component.name()}.set(event.target.value);\n\t\t})`;\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {NodePathParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/NodePath';\n\nexport class ParamNodePathCodeExporter extends ParamCodeExporter<NodePathParam> {\n\t// as_code_default_value_string() {\n\t// \treturn `'${this._param.defaultValue()}'`;\n\t// }\n\n\toverride add_main() {\n\t\tlet val = this._param.rawInput();\n\t\tval = val.replace(/'/g, \"\\\\'\");\n\t\tconst line = this.prefix() + `.set('${val}')`;\n\t\tthis._lines.push(line);\n\t}\n\n\toverride HTMLSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\tconst label = `<label for='${id}'>${id}</label>`;\n\t\tconst numberInput = `<input type='text' id='${id}' name='${id}' value=${this._param.value.path()}></input>`;\n\t\treturn `${label}\n${numberInput}`;\n\t}\n\toverride JSSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\treturn `document.getElementById('${id}').addEventListener('input', function(event){\n\tscene.node('${this._param.node.path()}').p.${this._param.name()}.set(event.target.value);\n})`;\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {ParamPathParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/ParamPath';\n\nexport class ParamParamPathCodeExporter extends ParamCodeExporter<ParamPathParam> {\n\t// as_code_default_value_string() {\n\t// \treturn `'${this._param.defaultValue()}'`;\n\t// }\n\n\toverride add_main() {\n\t\tlet val = this._param.rawInput();\n\t\tval = val.replace(/'/g, \"\\\\'\");\n\t\tconst line = this.prefix() + `.set('${val}')`;\n\t\tthis._lines.push(line);\n\t}\n\toverride HTMLSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\tconst label = `<label for='${id}'>${id}</label>`;\n\t\tconst numberInput = `<input type='text' id='${id}' name='${id}' value=${this._param.value.path()}></input>`;\n\t\treturn `${label}\n${numberInput}`;\n\t}\n\toverride JSSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\treturn `document.getElementById('${id}').addEventListener('input', function(event){\n\tscene.node('${this._param.node.path()}').p.${this._param.name()}.set(event.target.value);\n})`;\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {SceneCodeExporter} from '../Scene';\nimport {StringParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/String';\nimport {CoreType} from '../../../../../../@polygonjs/polygonjs/src/core/Type';\n\nexport class ParamStringCodeExporter extends ParamCodeExporter<StringParam> {\n\t// as_code_default_value_string() {\n\t// \treturn `'${this._param.defaultValue()}'`;\n\t// }\n\n\toverride add_main() {\n\t\t// if this.hasExpression()\n\t\t// \tthis.as_code_prefix() + \".set_expression('#{this.expression()}')\"\n\t\t// else\n\t\tlet val = this._param.rawInput();\n\t\tif (CoreType.isString(val)) {\n\t\t\tval = SceneCodeExporter.sanitize_string(val);\n\t\t}\n\t\t// if (this._param.hasExpression()){\n\t\t// \tval = this.expression()\n\t\t// }\n\t\t// if (CoreType.isString(val)){\n\t\t// \tval = val.replace(/'/g, \"\\\\'\"); // escapes '\n\t\t// \tval = val.replace(/(\\r\\n|\\n|\\r)/gm, \"\\\\n\"); // escapes line breaks (for shader code for instance)\n\t\t// }\n\t\tconst line = this.prefix() + `.set('${val}')`;\n\t\tthis._lines.push(line);\n\t}\n\n\toverride HTMLSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\tconst label = `<label for='${id}'>${id}</label>`;\n\t\tconst numberInput = `<input type='text' id='${id}' name='${id}' value=${this._param.value}></input>`;\n\t\treturn `${label}\n${numberInput}`;\n\t}\n\toverride JSSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\treturn `document.getElementById('${id}').addEventListener('input', function(event){\n\tscene.node('${this._param.node.path()}').p.${this._param.name()}.set(event.target.value);\n})`;\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {RampParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/Ramp';\n\nexport class ParamRampCodeExporter extends ParamCodeExporter<RampParam> {\n\toverride default_value() {\n\t\t// do not use JSON.stringify, otherwise, copy/paste fails for spare params\n\t\treturn this._param.defaultValueSerialized();\n\t}\n\n\toverride add_main() {\n\t\tlet val = this._param.value;\n\t\tconst json = val.toJSON();\n\t\tconst line = this.prefix() + `.set(${JSON.stringify(json)})`;\n\t\tthis._lines.push(line);\n\t}\n}\n","import {ParamCodeExporter} from '../Param';\nimport {ButtonParam} from '../../../../../../@polygonjs/polygonjs/src/engine/params/Button';\n\nexport class ParamButtonCodeExporter extends ParamCodeExporter<ButtonParam> {\n\toverride add_main() {}\n\toverride HTMLSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\tconst buttonInput = `<button id='${id}'>${id}</button>`;\n\t\treturn buttonInput;\n\t}\n\toverride JSSnippet() {\n\t\tconst id = this._HTMLId(this._param);\n\t\treturn `document.getElementById('${id}').addEventListener('click', function(event){\n\tscene.node('${this._param.node.path()}').p.${this._param.name()}.pressButton();\n})`;\n\t}\n}\n","import {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {NodeCodeExporter} from '../../Node';\n\nexport class SubnetGlCodeExporter extends NodeCodeExporter<NodeContext.GL> {\n\tprotected override _preAddChildren() {\n\t\tsuper._preAddChildren();\n\t\t// this node needs to create the params before the children\n\t\t// so that the input connections are created,\n\t\t// and so that the subnet inputs and outputs can have the right connections\n\t\tthis.add_params();\n\t}\n}\n","import {PolyNodeCodeExporter} from './node/Poly';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BaseParamType} from '../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {TypedMultipleParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/_Multiple';\nimport {TypedNumericParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/_Numeric';\n// import {OperatorPathParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/OperatorPath';\nimport {NodePathParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/NodePath';\nimport {StringParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/String';\n\nimport {NodeCodeExporter} from './Node';\n// import {BaseNodeObjCodeExporter} from './node/Obj';\n// import {BaseNodeSopSubnetworkCodeExporter} from './node/Subnetwork';\n\nimport {ParamCodeExporter} from './Param';\nimport {ParamMultipleCodeExporter} from './param/Multiple';\nimport {ParamNumericCodeExporter} from './param/Numeric';\n// import {ParamOperatorPathCodeExporter} from './param/OperatorPath';\nimport {ParamNodePathCodeExporter} from './param/NodePath';\nimport {ParamParamPathCodeExporter} from './param/ParamPath';\nimport {ParamStringCodeExporter} from './param/String';\nimport {ParamRampCodeExporter} from './param/Ramp';\nimport {ParamButtonCodeExporter} from './param/Button';\nimport {ParamPathParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/ParamPath';\nimport {ParamType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {RampParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/Ramp';\nimport {ButtonParam} from '../../../../../@polygonjs/polygonjs/src/engine/params/Button';\nimport {SubnetGlNode} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/Subnet';\nimport {IfThenGlNode} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/IfThen';\nimport {ForLoopGlNode} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/ForLoop';\nimport {SubnetGlCodeExporter} from './node/gl/Subnet';\nimport {NodesCodeExporterOption} from './Nodes';\n\nexport class CodeExporterDispatcher {\n\tstatic dispatch_node(node: BaseNodeType, options: NodesCodeExporterOption) {\n\t\tif (node.polyNodeController) {\n\t\t\treturn new PolyNodeCodeExporter(node, options);\n\t\t}\n\t\tif (node instanceof SubnetGlNode || node instanceof IfThenGlNode || node instanceof ForLoopGlNode) {\n\t\t\treturn new SubnetGlCodeExporter(node, options);\n\t\t}\n\t\treturn new NodeCodeExporter(node, options);\n\t}\n\n\t// static node(node: BaseNode): NodeCodeExporter {\n\t// \treturn new NodeCodeExporter(node);\n\t// }\n\t// static node_obj(node: BaseNode) {\n\t// \treturn new BaseNodeObjCodeExporter(node);\n\t// }\n\t// static node_sop_subnetwork(node: BaseNode) {\n\t// \treturn new BaseNodeSopSubnetworkCodeExporter(node);\n\t// }\n\tstatic dispatch_param(param: BaseParamType): ParamCodeExporter<BaseParamType> {\n\t\tconst paramType = param.type();\n\t\t// using comparison with types here instead of using instanceof\n\t\t// to ensure that plugins do not have the instanceof messed up\n\t\tconst multipleTypes = [ParamType.VECTOR2, ParamType.VECTOR3, ParamType.VECTOR4, ParamType.COLOR];\n\t\tif (multipleTypes.includes(paramType)) {\n\t\t\treturn new ParamMultipleCodeExporter(param as TypedMultipleParam<any>);\n\t\t}\n\t\tconst numericTypes = [ParamType.FLOAT, ParamType.INTEGER, ParamType.BOOLEAN];\n\t\tif (numericTypes.includes(paramType)) {\n\t\t\treturn new ParamNumericCodeExporter(param as TypedNumericParam<any>);\n\t\t}\n\t\tif (paramType == ParamType.BUTTON) {\n\t\t\treturn new ParamButtonCodeExporter(param as ButtonParam);\n\t\t}\n\t\t// if (paramType == ParamType.OPERATOR_PATH) {\n\t\t// \treturn new ParamOperatorPathCodeExporter(param as OperatorPathParam);\n\t\t// }\n\t\tif (paramType == ParamType.NODE_PATH) {\n\t\t\treturn new ParamNodePathCodeExporter(param as NodePathParam);\n\t\t}\n\t\tif (paramType == ParamType.PARAM_PATH) {\n\t\t\treturn new ParamParamPathCodeExporter(param as ParamPathParam);\n\t\t}\n\t\tif (paramType == ParamType.STRING) {\n\t\t\treturn new ParamStringCodeExporter(param as StringParam);\n\t\t}\n\t\tif (paramType == ParamType.RAMP) {\n\t\t\treturn new ParamRampCodeExporter(param as RampParam);\n\t\t}\n\t\treturn new ParamCodeExporter(param);\n\t}\n}\n// \tstatic visit_param(param: BaseParamType) {\n// \t\treturn new ParamCodeExporter(param);\n// \t}\n// \tstatic param_multiple(param: BaseParam) {\n// \t\treturn new ParamMultipleCodeExporter(param);\n// \t}\n// \tstatic param_numeric(param: BaseParam) {\n// \t\treturn new ParamNumericCodeExporter(param);\n// \t}\n// \tstatic param_operator_path(param: BaseParam) {\n// \t\treturn new ParamOperatorPathCodeExporter(param);\n// \t}\n// \tstatic param_string(param: BaseParam) {\n// \t\treturn new ParamStringCodeExporter(param);\n// \t}\n// \tstatic param_ramp(param: BaseParam) {\n// \t\treturn new ParamRampCodeExporter(param);\n// \t}\n// }\n","import {PolyDictionary} from '../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {CodeExporterDispatcher} from './Dispatcher';\n\ninterface CodeOptions {\n\tnodesMapVarName: string;\n}\nexport type NodesByRequestedName = PolyDictionary<BaseNodeType>;\n\nexport interface NodesCodeExporterOption {\n\tignoreGrandChildren?: boolean;\n\treplaceTypeWith?: string;\n}\nexport class NodesCodeExporter {\n\t_lines: string[] = [];\n\tconstructor(private _nodes: BaseNodeType[], protected options: NodesCodeExporterOption = {}) {}\n\n\tprocess(parent_var_name?: string, position_x_offset?: number) {\n\t\tthis._lines = [];\n\n\t\tthis.add_process(parent_var_name, position_x_offset);\n\n\t\treturn this._lines;\n\t}\n\n\tprocess_with_existing_nodes(parent: BaseNodeType, parent_var_name: string, position_x_offset?: number) {\n\t\tthis._lines = [];\n\n\t\tconst nodesMapVarName = `nodesByRequestedName_${parent.graphNodeId()}`;\n\t\tconst parentDispatcher = CodeExporterDispatcher.dispatch_node(parent, this.options);\n\n\t\tthis._lines.push(`var ${nodesMapVarName} = {}`);\n\t\tthis._lines.push(parentDispatcher.nodesVarNameDeclareLine());\n\n\t\tthis.add_existing_nodes(parent, parent_var_name);\n\t\tthis.add_process(parent_var_name, position_x_offset, {nodesMapVarName});\n\t\tthis._lines.push(`return ${nodesMapVarName}`);\n\n\t\treturn this._lines;\n\t}\n\n\tprivate add_process(parent_var_name?: string, position_x_offset?: number, options?: CodeOptions) {\n\t\tif (parent_var_name) {\n\t\t\tthis.multi_push(this.create_function_declare(parent_var_name));\n\t\t\tthis.multi_push(this.create_function_call(parent_var_name, options));\n\t\t}\n\n\t\tfor (let node of this._nodes) {\n\t\t\tthis.multi_push(\n\t\t\t\tCodeExporterDispatcher.dispatch_node(node, this.options).set_up({position_x_offset: position_x_offset})\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate add_existing_nodes(parent: BaseNodeType, parent_var_name: string) {\n\t\tconst children = parent.children();\n\t\tfor (let child of children) {\n\t\t\tconst childVarName = CodeExporterDispatcher.dispatch_node(\n\t\t\t\tchild,\n\t\t\t\tthis.options\n\t\t\t).varNameInParentNodesContainer();\n\t\t\tconst line = `${childVarName} = {node: ${parent_var_name}.node('${child.name()}')}`;\n\t\t\tthis._lines.push(line);\n\t\t}\n\t}\n\n\tcreate_function_declare(parent_var_name: string): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (let node of this._nodes) {\n\t\t\tconst child_lines = CodeExporterDispatcher.dispatch_node(node, this.options).create_function_declare(\n\t\t\t\tparent_var_name\n\t\t\t);\n\t\t\tchild_lines.forEach((child_line) => {\n\t\t\t\tlines.push(child_line);\n\t\t\t});\n\t\t}\n\t\treturn lines;\n\t}\n\tcreate_function_call(parent_var_name: string, options?: CodeOptions): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (let node of this._nodes) {\n\t\t\tconst nodeExporter = CodeExporterDispatcher.dispatch_node(node, this.options);\n\t\t\tconst child_line = nodeExporter.create_function_call(parent_var_name);\n\t\t\tlines.push(child_line);\n\t\t\tconst nodesMapVarName = options?.nodesMapVarName;\n\t\t\tif (nodesMapVarName) {\n\t\t\t\tlines.push(`${nodesMapVarName}['${nodeExporter.var_name()}'] = ${nodeExporter.varNameInParentNodes()}`);\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate multi_push(child_lines: string[]) {\n\t\tchild_lines.forEach((child_line) => {\n\t\t\tthis._lines.push(child_line);\n\t\t});\n\t}\n}\n","import {BaseParamType} from '../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {CoreType} from '../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {CodeExporterDispatcher} from './Dispatcher';\nimport {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {ParamType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {PARAM_OPTION_NAMES} from '../../../../../@polygonjs/polygonjs/src/engine/params/utils/OptionsController';\n\nexport class ParamCodeExporter<T extends BaseParamType> {\n\t_lines: string[] = [];\n\tconstructor(protected _param: T) {}\n\n\tprocess(): string[] {\n\t\tthis._lines = [];\n\n\t\tlet default_value = this.default_value();\n\t\tif (CoreType.isString(default_value)) {\n\t\t\tdefault_value = `'${default_value}'`;\n\t\t}\n\t\tif (CoreType.isArray(default_value)) {\n\t\t\tdefault_value = `[${default_value}]`;\n\t\t}\n\t\tif (CoreType.isObject(default_value)) {\n\t\t\tdefault_value = `${JSON.stringify(default_value)}`;\n\t\t}\n\n\t\tif (this._param.options.isSpare() && !this._param.parentParam()) {\n\t\t\tconst create_line = `${this.node_var_name()}.addParam(ParamType.${this._param\n\t\t\t\t.type()\n\t\t\t\t.toUpperCase()}, '${this._param.name()}', ${default_value}, ${JSON.stringify(\n\t\t\t\tthis._param.options.current()\n\t\t\t)})`;\n\t\t\tthis._lines.push(create_line);\n\t\t}\n\n\t\tif (!this._param.isDefault() && !this._param.parentParam()) {\n\t\t\tthis.add_main();\n\t\t}\n\t\tthis.add_options();\n\n\t\treturn this._lines;\n\t}\n\n\tsetValueLinesWithFullPath(): string {\n\t\tconst node: BaseNodeType = this._param.node;\n\n\t\tlet current_value = this._param.rawInput();\n\t\tif (CoreType.isString(current_value)) {\n\t\t\tcurrent_value = `'${current_value}'`;\n\t\t}\n\t\tif (CoreType.isArray(current_value)) {\n\t\t\tcurrent_value = `[${current_value}]`;\n\t\t}\n\n\t\tlet actionCall: string = `set(${current_value})`;\n\n\t\t// TODO: have this in a specialized class\n\t\tif (this._param.type() == ParamType.BUTTON) {\n\t\t\tactionCall = 'pressButton()';\n\t\t}\n\n\t\treturn `scene.node('${node.path()}').p.${this._param.name()}.${actionCall}`;\n\t}\n\n\t// as_code_default_value_string() {\n\t// \treturn `${this.default_value()}`;\n\t// }\n\t// as_code_create() {\n\t// \treturn `${this.node().code_var_name()}.add_spare_param( '${this.type()}', '${this.name()}', ${this.as_code_default_value_string()}, ${JSON.stringify(this.options())})`;\n\t// }\n\n\tdefault_value() {\n\t\treturn this._param.defaultValue();\n\t}\n\n\tnode_var_name() {\n\t\treturn CodeExporterDispatcher.dispatch_node(this._param.node, {}).var_name();\n\t}\n\tprefix() {\n\t\t// const parentParam = this._param.parentParam()\n\t\t// const paramName = parentParam ? `${parentParam.name()}.${}`\n\t\tif (this._param.options.isSpare()) {\n\t\t\treturn `${this.node_var_name()}.params.get('${this._param.name()}')`;\n\t\t} else {\n\t\t\treturn `${this.node_var_name()}.p.${this._param.name()}`;\n\t\t}\n\t}\n\n\tprotected add_main() {\n\t\tthrow `as_code_main abstract call (param type: ${this._param.type()}, path: ${this._param.path()})`;\n\t}\n\n\tadd_options() {\n\t\tif (this._param.options.hasOptionsOverridden()) {\n\t\t\tconst options_overridden = this._param.options.overriddenOptions();\n\t\t\tconst keys = this._param.options.overriddenOptionNames();\n\t\t\tfor (let option_name of keys) {\n\t\t\t\t// callback is not set, since it is not serializable\n\t\t\t\tif (option_name != PARAM_OPTION_NAMES.CALLBACK_OPTION) {\n\t\t\t\t\tconst option_value = options_overridden[option_name];\n\t\t\t\t\tconst line =\n\t\t\t\t\t\tthis.prefix() + `.options.setOption('${option_name}', ${JSON.stringify(option_value)})`;\n\t\t\t\t\tthis._lines.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//\n\t//\n\t// HTML/JS SNIPPETS\n\t//\n\t//\n\tparamHTMLSnippet() {\n\t\treturn CodeExporterDispatcher.dispatch_param(this._param).HTMLSnippet();\n\t}\n\tHTMLSnippet(): string | undefined {\n\t\treturn undefined;\n\t}\n\tparamJSSnippet() {\n\t\treturn CodeExporterDispatcher.dispatch_param(this._param).JSSnippet();\n\t}\n\tJSSnippet(): string | undefined {\n\t\treturn undefined;\n\t}\n\tprotected _HTMLId(param: BaseParamType) {\n\t\tconst elements = param.path().split('/');\n\t\telements.shift();\n\t\treturn elements.join('-');\n\t}\n}\n","type WasmExportFunc = (n: number, n2: number) => number;\nexport interface WasmExport {\n\tencode: WasmExportFunc;\n\tdecode: WasmExportFunc;\n}\nfunction defaultWasmFunc(a: number, b: number) {\n\treturn a;\n}\nconst importObject: WasmExport = {\n\tencode: defaultWasmFunc,\n\tdecode: defaultWasmFunc,\n};\nlet loaded = false;\nasync function fetchWasmExporter(): Promise<WasmExport> {\n\t// https://developer.mozilla.org/en-US/docs/WebAssembly/Loading_and_running\n\n\tif (loaded) {\n\t\treturn importObject;\n\t}\n\n\tconst url = '/scene_exporter/release.wasm';\n\tconsole.log('fetching wasm', url);\n\tconst response = await fetch(url);\n\tconst arrayBuffer = await response.arrayBuffer();\n\tconsole.log(arrayBuffer, new Uint8Array(arrayBuffer).toString());\n\treturn await createImportObject(arrayBuffer);\n}\nasync function createImportObject(arrayBuffer: ArrayBuffer) {\n\tif (loaded) {\n\t\treturn importObject;\n\t}\n\tconst results = await WebAssembly.instantiate(arrayBuffer, {});\n\timportObject.encode = results.instance.exports.encode as any;\n\timportObject.decode = results.instance.exports.decode as any;\n\tloaded = true;\n\treturn importObject;\n}\n// create this buffer from the function fetchWasmExporter.\n// This wasm is currently created from the repository scene_exporter3\n// https://bitbucket.org/frading/scene_exporter3/src/main/\nconst preloadedBuffer = [\n\t0, 97, 115, 109, 1, 0, 0, 0, 1, 7, 1, 96, 2, 127, 127, 1, 127, 3, 3, 2, 0, 0, 5, 3, 1, 0, 0, 7, 28, 3, 6, 101, 110,\n\t99, 111, 100, 101, 0, 0, 6, 100, 101, 99, 111, 100, 101, 0, 1, 6, 109, 101, 109, 111, 114, 121, 2, 0, 10, 107, 2,\n\t52, 1, 1, 127, 32, 0, 32, 1, 65, 57, 111, 34, 2, 65, 3, 106, 32, 2, 32, 1, 65, 188, 10, 72, 32, 1, 65, 145, 1, 74,\n\t113, 27, 34, 1, 65, 7, 106, 32, 1, 32, 0, 65, 5, 72, 32, 0, 65, 2, 74, 113, 27, 106, 11, 52, 1, 1, 127, 32, 0, 32,\n\t1, 65, 57, 111, 34, 2, 65, 3, 106, 32, 2, 32, 1, 65, 188, 10, 72, 32, 1, 65, 145, 1, 74, 113, 27, 34, 1, 65, 7, 106,\n\t32, 1, 32, 0, 65, 5, 72, 32, 0, 65, 2, 74, 113, 27, 107, 11, 0, 36, 16, 115, 111, 117, 114, 99, 101, 77, 97, 112,\n\t112, 105, 110, 103, 85, 82, 76, 18, 46, 47, 114, 101, 108, 101, 97, 115, 101, 46, 119, 97, 115, 109, 46, 109, 97,\n\t112,\n];\n\nasync function createWasmExporter(): Promise<WasmExport> {\n\tif (loaded) {\n\t\treturn importObject;\n\t}\n\tconst array = new Uint8Array(preloadedBuffer);\n\treturn await createImportObject(array.buffer);\n}\n\nconst isPreLoaded = true;\nexport async function wasmExport() {\n\tif (isPreLoaded) {\n\t\treturn await createWasmExporter();\n\t} else {\n\t\treturn await fetchWasmExporter();\n\t}\n}\n","import {CoreFileUtils} from '../editor/core/FileUtils';\nimport {SceneConfig} from './controllers/ScenesController';\nimport {wasmExport} from './WasmExporterLoader';\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n// // https://developer.mozilla.org/en-US/docs/Web/API/btoa\n// function toBinary(string: string) {\n// \tconst codeUnits = Uint16Array.from({length: string.length}, (element, index) => string.charCodeAt(index));\n// \tconst charCodes = new Uint8Array(codeUnits.buffer);\n\n// \tlet result = '';\n// \tcharCodes.forEach((char) => {\n// \t\tresult += String.fromCharCode(char);\n// \t});\n// \treturn result;\n// }\n// function fromBinary(binary: string) {\n// \tconst bytes = Uint8Array.from({length: binary.length}, (element, index) => binary.charCodeAt(index));\n// \tconst charCodes = new Uint16Array(bytes.buffer);\n\n// \tlet result = '';\n// \tcharCodes.forEach((char) => {\n// \t\tresult += String.fromCharCode(char);\n// \t});\n// \treturn result;\n// }\n\n// https://coolaj86.com/articles/typedarray-buffer-to-base64-in-javascript/\n// function bufferToString(buf: ArrayBufferLike) {\n// \tconst string = buf.toString();\n// \tconst binstr = Array.prototype.map\n// \t\t.call(string, function (ch) {\n// \t\t\treturn String.fromCharCode(ch);\n// \t\t})\n// \t\t.join('');\n// \t// console.log(binstr);\n// \t// return binstr;\n// \treturn btoa(binstr);\n// }\n// function stringToBuffer(base64: string):ArrayBufferLike {\n// \tvar binstr = atob(base64);\n// \t// console.log(binstr);\n// \tvar buf = new Uint8Array(binstr.length);\n// \tArray.prototype.forEach.call(binstr, function (ch, i) {\n// \t\tbuf[i] = ch.charCodeAt(0);\n// \t});\n// \tconsole.log(buf);\n// \tconst str = buf.join(',');\n// \t// console.log(buf)\n// \t// return buf;\n// \t// var binstr = atob(base64);\n// \t// var buf = new Float32Array(binstr.length);\n// \t// Array.prototype.forEach.call(binstr, function (ch, i) {\n// \t// buf[i] = ch.charCodeAt(0);\n// \t// });\n// \t// const elements = buf.split(',').map((s) => parseInt(s));\n// \t// return new Float32Array(elements);\n// \t// return buf;\n// }\n\nconst VERSION = 1;\nconst METADATA_SIZE = 2;\n\nfunction writeMetadata(uint8Array: Uint8Array) {\n\tconst dataSize = uint8Array.length;\n\tconst tmpArray: number[] = new Array(dataSize + METADATA_SIZE);\n\ttmpArray.fill(0);\n\ttmpArray[0] = VERSION;\n\ttmpArray[1] = dataSize;\n\tfor (let i = 0; i < dataSize; i++) {\n\t\ttmpArray[i + METADATA_SIZE] = uint8Array[i];\n\t}\n\tconst arrayWithMetadata = new Float32Array(tmpArray);\n\treturn arrayWithMetadata;\n}\nfunction readMetadata(arrayWithMetadata: Float32Array) {\n\t// const version = arrayWithMetadata[0];\n\tconst dataSize = arrayWithMetadata[1];\n\tconst tmpArray: number[] = new Array(dataSize);\n\tfor (let i = 0; i < dataSize; i++) {\n\t\ttmpArray[i] = arrayWithMetadata[i + METADATA_SIZE];\n\t}\n\tconst uint8Array = new Uint8Array(tmpArray);\n\treturn uint8Array;\n}\nconst EMOJI = '😊';\nasync function sceneConfigToBinary(sceneConfig: SceneConfig): Promise<Uint8Array> {\n\t// https://emojipedia.org/smiling-face-with-smiling-eyes/\n\tconst sceneDataStr = EMOJI + JSON.stringify(sceneConfig) + EMOJI;\n\tconst uint8Array = encoder.encode(sceneDataStr);\n\n\tconst {encode} = await wasmExport();\n\tconst count = uint8Array.length;\n\tfor (let i = 0; i < count; i++) {\n\t\tuint8Array[i] = encode(uint8Array[i], i);\n\t}\n\n\treturn uint8Array;\n}\nasync function binaryToSceneConfig(uint8Array: Uint8Array): Promise<SceneConfig> {\n\tconst {decode} = await wasmExport();\n\tconst count = uint8Array.length;\n\tfor (let i = 0; i < count; i++) {\n\t\tuint8Array[i] = decode(uint8Array[i], i);\n\t}\n\n\tconst str = decoder.decode(uint8Array);\n\tconst strWithoutEmoji = str.slice(EMOJI.length, str.length - EMOJI.length);\n\treturn JSON.parse(strWithoutEmoji) as SceneConfig;\n}\nconst DATA_URL_PREFIX = 'data:octet/stream;base64,';\nexport class BinaryController {\n\tstatic async encode(sceneConfig: SceneConfig): Promise<string> {\n\t\tconst binary = await sceneConfigToBinary(sceneConfig);\n\t\tconst binaryWithMetadata = writeMetadata(binary);\n\t\t// return atob(binaryWithMetadata)\n\t\tconst blob = new Blob([binaryWithMetadata], {type: 'octet/stream'});\n\t\tconst fileDataURLWithPrefix = await CoreFileUtils.blobToDatauri(blob);\n\t\tconst fileDataURL = fileDataURLWithPrefix.slice(DATA_URL_PREFIX.length);\n\t\treturn fileDataURL;\n\t\t// const file = CoreFileUtils.blobToFile(blob, `${sceneConfig.name}.poly`);\n\t\t// const fileDataURL = await CoreFileUtils.fileToDataURL(file);\n\t\t// return fileDataURL;\n\t}\n\tstatic async decode(fileDataURL: string): Promise<SceneConfig> {\n\t\t// const binaryWithMetadata: Float32Array = ''\n\t\tconst fileDataURLWithPrefix = DATA_URL_PREFIX + fileDataURL;\n\t\tconst blob = await CoreFileUtils.dataUriToBlob(fileDataURLWithPrefix);\n\t\tconst buffer = await blob.arrayBuffer();\n\t\tconst binaryWithMetadata = new Float32Array(buffer);\n\t\t// console.log(fileDataURL);\n\t\t// const arrayWithMetadata = stringToBuffer(fileDataURL);\n\n\t\tconst binaryWithoutMetadata = readMetadata(binaryWithMetadata);\n\t\tconst sceneConfig = await binaryToSceneConfig(binaryWithoutMetadata);\n\t\treturn sceneConfig;\n\t\t// try {\n\t\t// \treturn JSON.parse(text);\n\t\t// } catch (err) {\n\t\t// \tconsole.error('failed to parse binary file');\n\t\t// \treturn {} as any;\n\t\t// }\n\t}\n}\n","import {MathUtils} from 'three';\nconst KEY = {BROWSER_ID: 'browserId', SECRET: 'secret'};\n\nexport class NpmAuthControllerClass {\n\tprivate static _instance: NpmAuthControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NpmAuthControllerClass());\n\t}\n\n\tbrowserId() {\n\t\tconst key = KEY.BROWSER_ID;\n\t\tlet id = localStorage.getItem(key);\n\t\tif (!id) {\n\t\t\tid = this._createBrowseId();\n\t\t\tlocalStorage.setItem(key, id);\n\t\t}\n\t\treturn id;\n\t}\n\tclear() {\n\t\tlocalStorage.removeItem(KEY.BROWSER_ID);\n\t\tlocalStorage.removeItem(KEY.SECRET);\n\t}\n\n\tsetSecret(secret: string) {\n\t\tlocalStorage.setItem(KEY.SECRET, secret);\n\t}\n\tsecret() {\n\t\treturn localStorage.getItem(KEY.SECRET) || undefined;\n\t}\n\tprivate _createBrowseId() {\n\t\t// return MathUtils.generateUUID().substring(0, 6);\n\t\tlet uuids: string[] = [];\n\t\tfor (let i = 0; i < 20; i++) {\n\t\t\tuuids.push(MathUtils.generateUUID());\n\t\t}\n\t\treturn uuids.join(':');\n\t}\n}\n\nexport const NpmAuthController = NpmAuthControllerClass.instance();\n","import {LocalServerUrl, Config} from './../NpmModuleTypes';\nimport {API_ROOT_URL} from './Common';\n\nexport class ConfigController {\n\tstatic polyConfigUrl(options: Config.PolyConfigQuery) {\n\t\t// const params: Config.PolyConfigQuery = options;///{raw: '1'};\n\t\t// the name cannot be added at the end of this url, as it would not work\n\t\t// when used in a <script> tag, with import {X} from '<url>'.\n\t\t// Also, for new (unsaved) scenes, the sceneName would be null\n\t\treturn `${API_ROOT_URL}${LocalServerUrl.POLY_CONFIG_LOAD}?sceneName=${options.sceneName}`;\n\t\t// const response = await fetch(url);\n\t\t// return response;\n\t}\n\tstatic polyConfigUrlRaw(options: Config.PolyConfigQuery) {\n\t\treturn this.polyConfigUrl(options);\n\t\t// return `${API_ROOT_URL}${LocalServerUrl.POLY_CONFIG_LOAD}?raw=${params.raw}`;\n\t\t// const response = await fetch(url);\n\t\t// return response;\n\t}\n\tstatic loadEditorConfigUrl() {\n\t\treturn `${API_ROOT_URL}${LocalServerUrl.EDITOR_CONFIG_LOAD}`;\n\t}\n}\n","// Generated file. Do not edit\nexport var StatusCodes;\n(function (StatusCodes) {\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.3.3\n     *\n     * The request has been received but not yet acted upon. It is non-committal, meaning that there is no way in HTTP to later send an asynchronous response indicating the outcome of processing the request. It is intended for cases where another process or server handles the request, or for batch processing.\n     */\n    StatusCodes[StatusCodes[\"ACCEPTED\"] = 202] = \"ACCEPTED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.6.3\n     *\n     * This error response means that the server, while working as a gateway to get a response needed to handle the request, got an invalid response.\n     */\n    StatusCodes[StatusCodes[\"BAD_GATEWAY\"] = 502] = \"BAD_GATEWAY\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.1\n     *\n     * This response means that server could not understand the request due to invalid syntax.\n     */\n    StatusCodes[StatusCodes[\"BAD_REQUEST\"] = 400] = \"BAD_REQUEST\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.8\n     *\n     * This response is sent when a request conflicts with the current state of the server.\n     */\n    StatusCodes[StatusCodes[\"CONFLICT\"] = 409] = \"CONFLICT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.2.1\n     *\n     * This interim response indicates that everything so far is OK and that the client should continue with the request or ignore it if it is already finished.\n     */\n    StatusCodes[StatusCodes[\"CONTINUE\"] = 100] = \"CONTINUE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.3.2\n     *\n     * The request has succeeded and a new resource has been created as a result of it. This is typically the response sent after a PUT request.\n     */\n    StatusCodes[StatusCodes[\"CREATED\"] = 201] = \"CREATED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.14\n     *\n     * This response code means the expectation indicated by the Expect request header field can't be met by the server.\n     */\n    StatusCodes[StatusCodes[\"EXPECTATION_FAILED\"] = 417] = \"EXPECTATION_FAILED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.5\n     *\n     * The request failed due to failure of a previous request.\n     */\n    StatusCodes[StatusCodes[\"FAILED_DEPENDENCY\"] = 424] = \"FAILED_DEPENDENCY\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.3\n     *\n     * The client does not have access rights to the content, i.e. they are unauthorized, so server is rejecting to give proper response. Unlike 401, the client's identity is known to the server.\n     */\n    StatusCodes[StatusCodes[\"FORBIDDEN\"] = 403] = \"FORBIDDEN\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.6.5\n     *\n     * This error response is given when the server is acting as a gateway and cannot get a response in time.\n     */\n    StatusCodes[StatusCodes[\"GATEWAY_TIMEOUT\"] = 504] = \"GATEWAY_TIMEOUT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.9\n     *\n     * This response would be sent when the requested content has been permenantly deleted from server, with no forwarding address. Clients are expected to remove their caches and links to the resource. The HTTP specification intends this status code to be used for \"limited-time, promotional services\". APIs should not feel compelled to indicate resources that have been deleted with this status code.\n     */\n    StatusCodes[StatusCodes[\"GONE\"] = 410] = \"GONE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.6.6\n     *\n     * The HTTP version used in the request is not supported by the server.\n     */\n    StatusCodes[StatusCodes[\"HTTP_VERSION_NOT_SUPPORTED\"] = 505] = \"HTTP_VERSION_NOT_SUPPORTED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2324#section-2.3.2\n     *\n     * Any attempt to brew coffee with a teapot should result in the error code \"418 I'm a teapot\". The resulting entity body MAY be short and stout.\n     */\n    StatusCodes[StatusCodes[\"IM_A_TEAPOT\"] = 418] = \"IM_A_TEAPOT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.6\n     *\n     * The 507 (Insufficient Storage) status code means the method could not be performed on the resource because the server is unable to store the representation needed to successfully complete the request. This condition is considered to be temporary. If the request which received this status code was the result of a user action, the request MUST NOT be repeated until it is requested by a separate user action.\n     */\n    StatusCodes[StatusCodes[\"INSUFFICIENT_SPACE_ON_RESOURCE\"] = 419] = \"INSUFFICIENT_SPACE_ON_RESOURCE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.6\n     *\n     * The server has an internal configuration error: the chosen variant resource is configured to engage in transparent content negotiation itself, and is therefore not a proper end point in the negotiation process.\n     */\n    StatusCodes[StatusCodes[\"INSUFFICIENT_STORAGE\"] = 507] = \"INSUFFICIENT_STORAGE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.6.1\n     *\n     * The server encountered an unexpected condition that prevented it from fulfilling the request.\n     */\n    StatusCodes[StatusCodes[\"INTERNAL_SERVER_ERROR\"] = 500] = \"INTERNAL_SERVER_ERROR\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.10\n     *\n     * The server rejected the request because the Content-Length header field is not defined and the server requires it.\n     */\n    StatusCodes[StatusCodes[\"LENGTH_REQUIRED\"] = 411] = \"LENGTH_REQUIRED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.4\n     *\n     * The resource that is being accessed is locked.\n     */\n    StatusCodes[StatusCodes[\"LOCKED\"] = 423] = \"LOCKED\";\n    /**\n     * @deprecated\n     * Official Documentation @ https://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt\n     *\n     * A deprecated response used by the Spring Framework when a method has failed.\n     */\n    StatusCodes[StatusCodes[\"METHOD_FAILURE\"] = 420] = \"METHOD_FAILURE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.5\n     *\n     * The request method is known by the server but has been disabled and cannot be used. For example, an API may forbid DELETE-ing a resource. The two mandatory methods, GET and HEAD, must never be disabled and should not return this error code.\n     */\n    StatusCodes[StatusCodes[\"METHOD_NOT_ALLOWED\"] = 405] = \"METHOD_NOT_ALLOWED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.4.2\n     *\n     * This response code means that URI of requested resource has been changed. Probably, new URI would be given in the response.\n     */\n    StatusCodes[StatusCodes[\"MOVED_PERMANENTLY\"] = 301] = \"MOVED_PERMANENTLY\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.4.3\n     *\n     * This response code means that URI of requested resource has been changed temporarily. New changes in the URI might be made in the future. Therefore, this same URI should be used by the client in future requests.\n     */\n    StatusCodes[StatusCodes[\"MOVED_TEMPORARILY\"] = 302] = \"MOVED_TEMPORARILY\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.2\n     *\n     * A Multi-Status response conveys information about multiple resources in situations where multiple status codes might be appropriate.\n     */\n    StatusCodes[StatusCodes[\"MULTI_STATUS\"] = 207] = \"MULTI_STATUS\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.4.1\n     *\n     * The request has more than one possible responses. User-agent or user should choose one of them. There is no standardized way to choose one of the responses.\n     */\n    StatusCodes[StatusCodes[\"MULTIPLE_CHOICES\"] = 300] = \"MULTIPLE_CHOICES\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc6585#section-6\n     *\n     * The 511 status code indicates that the client needs to authenticate to gain network access.\n     */\n    StatusCodes[StatusCodes[\"NETWORK_AUTHENTICATION_REQUIRED\"] = 511] = \"NETWORK_AUTHENTICATION_REQUIRED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.3.5\n     *\n     * There is no content to send for this request, but the headers may be useful. The user-agent may update its cached headers for this resource with the new ones.\n     */\n    StatusCodes[StatusCodes[\"NO_CONTENT\"] = 204] = \"NO_CONTENT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.3.4\n     *\n     * This response code means returned meta-information set is not exact set as available from the origin server, but collected from a local or a third party copy. Except this condition, 200 OK response should be preferred instead of this response.\n     */\n    StatusCodes[StatusCodes[\"NON_AUTHORITATIVE_INFORMATION\"] = 203] = \"NON_AUTHORITATIVE_INFORMATION\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.6\n     *\n     * This response is sent when the web server, after performing server-driven content negotiation, doesn't find any content following the criteria given by the user agent.\n     */\n    StatusCodes[StatusCodes[\"NOT_ACCEPTABLE\"] = 406] = \"NOT_ACCEPTABLE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.4\n     *\n     * The server can not find requested resource. In the browser, this means the URL is not recognized. In an API, this can also mean that the endpoint is valid but the resource itself does not exist. Servers may also send this response instead of 403 to hide the existence of a resource from an unauthorized client. This response code is probably the most famous one due to its frequent occurence on the web.\n     */\n    StatusCodes[StatusCodes[\"NOT_FOUND\"] = 404] = \"NOT_FOUND\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.6.2\n     *\n     * The request method is not supported by the server and cannot be handled. The only methods that servers are required to support (and therefore that must not return this code) are GET and HEAD.\n     */\n    StatusCodes[StatusCodes[\"NOT_IMPLEMENTED\"] = 501] = \"NOT_IMPLEMENTED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7232#section-4.1\n     *\n     * This is used for caching purposes. It is telling to client that response has not been modified. So, client can continue to use same cached version of response.\n     */\n    StatusCodes[StatusCodes[\"NOT_MODIFIED\"] = 304] = \"NOT_MODIFIED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.3.1\n     *\n     * The request has succeeded. The meaning of a success varies depending on the HTTP method:\n     * GET: The resource has been fetched and is transmitted in the message body.\n     * HEAD: The entity headers are in the message body.\n     * POST: The resource describing the result of the action is transmitted in the message body.\n     * TRACE: The message body contains the request message as received by the server\n     */\n    StatusCodes[StatusCodes[\"OK\"] = 200] = \"OK\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7233#section-4.1\n     *\n     * This response code is used because of range header sent by the client to separate download into multiple streams.\n     */\n    StatusCodes[StatusCodes[\"PARTIAL_CONTENT\"] = 206] = \"PARTIAL_CONTENT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.2\n     *\n     * This response code is reserved for future use. Initial aim for creating this code was using it for digital payment systems however this is not used currently.\n     */\n    StatusCodes[StatusCodes[\"PAYMENT_REQUIRED\"] = 402] = \"PAYMENT_REQUIRED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7538#section-3\n     *\n     * This means that the resource is now permanently located at another URI, specified by the Location: HTTP Response header. This has the same semantics as the 301 Moved Permanently HTTP response code, with the exception that the user agent must not change the HTTP method used: if a POST was used in the first request, a POST must be used in the second request.\n     */\n    StatusCodes[StatusCodes[\"PERMANENT_REDIRECT\"] = 308] = \"PERMANENT_REDIRECT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7232#section-4.2\n     *\n     * The client has indicated preconditions in its headers which the server does not meet.\n     */\n    StatusCodes[StatusCodes[\"PRECONDITION_FAILED\"] = 412] = \"PRECONDITION_FAILED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc6585#section-3\n     *\n     * The origin server requires the request to be conditional. Intended to prevent the 'lost update' problem, where a client GETs a resource's state, modifies it, and PUTs it back to the server, when meanwhile a third party has modified the state on the server, leading to a conflict.\n     */\n    StatusCodes[StatusCodes[\"PRECONDITION_REQUIRED\"] = 428] = \"PRECONDITION_REQUIRED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.1\n     *\n     * This code indicates that the server has received and is processing the request, but no response is available yet.\n     */\n    StatusCodes[StatusCodes[\"PROCESSING\"] = 102] = \"PROCESSING\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7235#section-3.2\n     *\n     * This is similar to 401 but authentication is needed to be done by a proxy.\n     */\n    StatusCodes[StatusCodes[\"PROXY_AUTHENTICATION_REQUIRED\"] = 407] = \"PROXY_AUTHENTICATION_REQUIRED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc6585#section-5\n     *\n     * The server is unwilling to process the request because its header fields are too large. The request MAY be resubmitted after reducing the size of the request header fields.\n     */\n    StatusCodes[StatusCodes[\"REQUEST_HEADER_FIELDS_TOO_LARGE\"] = 431] = \"REQUEST_HEADER_FIELDS_TOO_LARGE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.7\n     *\n     * This response is sent on an idle connection by some servers, even without any previous request by the client. It means that the server would like to shut down this unused connection. This response is used much more since some browsers, like Chrome, Firefox 27+, or IE9, use HTTP pre-connection mechanisms to speed up surfing. Also note that some servers merely shut down the connection without sending this message.\n     */\n    StatusCodes[StatusCodes[\"REQUEST_TIMEOUT\"] = 408] = \"REQUEST_TIMEOUT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.11\n     *\n     * Request entity is larger than limits defined by server; the server might close the connection or return an Retry-After header field.\n     */\n    StatusCodes[StatusCodes[\"REQUEST_TOO_LONG\"] = 413] = \"REQUEST_TOO_LONG\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.12\n     *\n     * The URI requested by the client is longer than the server is willing to interpret.\n     */\n    StatusCodes[StatusCodes[\"REQUEST_URI_TOO_LONG\"] = 414] = \"REQUEST_URI_TOO_LONG\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7233#section-4.4\n     *\n     * The range specified by the Range header field in the request can't be fulfilled; it's possible that the range is outside the size of the target URI's data.\n     */\n    StatusCodes[StatusCodes[\"REQUESTED_RANGE_NOT_SATISFIABLE\"] = 416] = \"REQUESTED_RANGE_NOT_SATISFIABLE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.3.6\n     *\n     * This response code is sent after accomplishing request to tell user agent reset document view which sent this request.\n     */\n    StatusCodes[StatusCodes[\"RESET_CONTENT\"] = 205] = \"RESET_CONTENT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.4.4\n     *\n     * Server sent this response to directing client to get requested resource to another URI with an GET request.\n     */\n    StatusCodes[StatusCodes[\"SEE_OTHER\"] = 303] = \"SEE_OTHER\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.6.4\n     *\n     * The server is not ready to handle the request. Common causes are a server that is down for maintenance or that is overloaded. Note that together with this response, a user-friendly page explaining the problem should be sent. This responses should be used for temporary conditions and the Retry-After: HTTP header should, if possible, contain the estimated time before the recovery of the service. The webmaster must also take care about the caching-related headers that are sent along with this response, as these temporary condition responses should usually not be cached.\n     */\n    StatusCodes[StatusCodes[\"SERVICE_UNAVAILABLE\"] = 503] = \"SERVICE_UNAVAILABLE\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.2.2\n     *\n     * This code is sent in response to an Upgrade request header by the client, and indicates the protocol the server is switching too.\n     */\n    StatusCodes[StatusCodes[\"SWITCHING_PROTOCOLS\"] = 101] = \"SWITCHING_PROTOCOLS\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.4.7\n     *\n     * Server sent this response to directing client to get requested resource to another URI with same method that used prior request. This has the same semantic than the 302 Found HTTP response code, with the exception that the user agent must not change the HTTP method used: if a POST was used in the first request, a POST must be used in the second request.\n     */\n    StatusCodes[StatusCodes[\"TEMPORARY_REDIRECT\"] = 307] = \"TEMPORARY_REDIRECT\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc6585#section-4\n     *\n     * The user has sent too many requests in a given amount of time (\"rate limiting\").\n     */\n    StatusCodes[StatusCodes[\"TOO_MANY_REQUESTS\"] = 429] = \"TOO_MANY_REQUESTS\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7235#section-3.1\n     *\n     * Although the HTTP standard specifies \"unauthorized\", semantically this response means \"unauthenticated\". That is, the client must authenticate itself to get the requested response.\n     */\n    StatusCodes[StatusCodes[\"UNAUTHORIZED\"] = 401] = \"UNAUTHORIZED\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7725\n     *\n     * The user-agent requested a resource that cannot legally be provided, such as a web page censored by a government.\n     */\n    StatusCodes[StatusCodes[\"UNAVAILABLE_FOR_LEGAL_REASONS\"] = 451] = \"UNAVAILABLE_FOR_LEGAL_REASONS\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc2518#section-10.3\n     *\n     * The request was well-formed but was unable to be followed due to semantic errors.\n     */\n    StatusCodes[StatusCodes[\"UNPROCESSABLE_ENTITY\"] = 422] = \"UNPROCESSABLE_ENTITY\";\n    /**\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.5.13\n     *\n     * The media format of the requested data is not supported by the server, so the server is rejecting the request.\n     */\n    StatusCodes[StatusCodes[\"UNSUPPORTED_MEDIA_TYPE\"] = 415] = \"UNSUPPORTED_MEDIA_TYPE\";\n    /**\n     * @deprecated\n     * Official Documentation @ https://tools.ietf.org/html/rfc7231#section-6.4.6\n     *\n     * Was defined in a previous version of the HTTP specification to indicate that a requested response must be accessed by a proxy. It has been deprecated due to security concerns regarding in-band configuration of a proxy.\n     */\n    StatusCodes[StatusCodes[\"USE_PROXY\"] = 305] = \"USE_PROXY\";\n    /**\n     * Official Documentation @ https://datatracker.ietf.org/doc/html/rfc7540#section-9.1.2\n     *\n     * Defined in the specification of HTTP/2 to indicate that a server is not able to produce a response for the combination of scheme and authority that are included in the request URI.\n     */\n    StatusCodes[StatusCodes[\"MISDIRECTED_REQUEST\"] = 421] = \"MISDIRECTED_REQUEST\";\n})(StatusCodes || (StatusCodes = {}));\n","import {NpmModuleApiController} from '../NpmModuleApiController';\nimport {NpmAuthController} from '../NpmAuthController';\nimport {LocalServerUrl, AuthSession} from '../NpmModuleTypes';\n\ninterface CreateTokenParams {\n\temail: string;\n\tpassword: string;\n}\nimport {API_ROOT_URL} from './Common';\nimport {StoreController} from '../../editor/store/controllers/StoreController';\nimport {StatusCodes} from 'http-status-codes';\n\nexport class SingleUserSessionsController {\n\tstatic async create(params: CreateTokenParams) {\n\t\tconst data: AuthSession.CreateBody = {...params, browserId: NpmAuthController.browserId()};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.TOKEN_CREATE}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as AuthSession.CreateResponse;\n\t\t\t// console.log('createToken response', json);\n\t\t\tNpmAuthController.setSecret(json.secret);\n\t\t\t// if the response is ok, we can try to save again\n\t\t\tStoreController.editor.dialogApiLogin.setErrorMessage(null);\n\t\t\tStoreController.editor.dialogApiLogin.executeCallback();\n\t\t\tStoreController.editor.dialogApiLogin.hide();\n\t\t\tthis.show();\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.dialogApiLogin.setErrorMessage(error);\n\t\t}\n\t\treturn response;\n\t}\n\n\tstatic async show() {\n\t\tconst data: AuthSession.ShowBody = {\n\t\t\tbrowserId: NpmAuthController.browserId(),\n\t\t\tsecret: NpmAuthController.secret(),\n\t\t};\n\t\tconst urlParams = new URLSearchParams();\n\t\tconst keys = Object.keys(data) as Array<keyof AuthSession.ShowBody>;\n\t\tfor (let key of keys) {\n\t\t\tconst val = data[key];\n\t\t\tif (val) {\n\t\t\t\turlParams.append(key, val);\n\t\t\t}\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.TOKEN_GET}`;\n\t\tconst urlWithQuery = `${url}?${urlParams.toString()}`;\n\t\tconst response = await fetch(urlWithQuery);\n\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json: AuthSession.UserDataResponse = await response.json();\n\t\t\tStoreController.editor.currentUser.setUsername(json.username);\n\t\t\tStoreController.editor.currentUser.setBetaApproved(json.beta_approved);\n\t\t\tStoreController.editor.userPlan.setPro(json.pro);\n\t\t\tStoreController.editor.userPlan.setLoggedIn(true);\n\n\t\t\tNpmModuleApiController.multiPlayer.userRequests.create();\n\t\t\t// if (process.env.NODE_ENV == 'development') {\n\t\t\t// \tStoreController.editor.marketplacePolyNodes.show();\n\t\t\t// }\n\t\t} else {\n\t\t\tconst json = await response.json();\n\t\t\tconsole.warn('login error', json);\n\t\t\tStoreController.editor.userPlan.setLoggedIn(false);\n\n\t\t\t// if we are in multiplayer, login is required, so we display the form again\n\t\t\tif (StoreController.editor.multiPlayer.active.value) {\n\t\t\t\tawait StoreController.editor.dialogApiLogin.show();\n\t\t\t\tthis.show();\n\t\t\t}\n\t\t}\n\t}\n\tstatic async destroy() {\n\t\tconst data: AuthSession.DestroyBody = {\n\t\t\tbrowserId: NpmAuthController.browserId(),\n\t\t\tsecret: NpmAuthController.secret(),\n\t\t};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.LOGOUT}`;\n\t\tawait fetch(url, {\n\t\t\tmethod: 'DELETE',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tNpmAuthController.clear();\n\t\tlocation.reload();\n\t}\n}\n","import {LocalServerUrl, Scene} from '../NpmModuleTypes';\n\nimport {API_ROOT_URL} from './Common';\nimport {errorString, FetchErrorMessage} from './Common';\n\nexport class SceneNamesController {\n\tstatic async index(): Promise<Scene.IndexRequestResponse> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SCENES}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst json = await response.json();\n\t\t\t\treturn json;\n\t\t\t} else {\n\t\t\t\t// displayError(FetchErrorMessage.LOAD_SCENE_NAMES);\n\t\t\t\treturn {error: errorString(FetchErrorMessage.LOAD_SCENE_NAMES)};\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t// displayError(FetchErrorMessage.LOAD_SCENE_NAMES);\n\t\t\treturn {error: errorString(FetchErrorMessage.LOAD_SCENE_NAMES)};\n\t\t}\n\t}\n}\n","import {LocalServerUrl, Asset, ASSETS_EXTENSIONS_SEPARATOR} from './../NpmModuleTypes';\nimport {API_ROOT_URL} from './Common';\n\nimport {displayError, errorString, FetchErrorMessage} from './Common';\nimport {ArrayUtils} from '../../../@polygonjs/polygonjs/src/core/ArrayUtils';\n\nexport class AssetsController {\n\tstatic async index(extensions: string[]): Promise<Asset.IndexRequestResponse> {\n\t\tconst uniqExtensions: string[] = [];\n\t\tArrayUtils.uniq(extensions, uniqExtensions);\n\t\tconst params: Asset.IndexRequestBody = {\n\t\t\textensionsJoined: uniqExtensions.join(ASSETS_EXTENSIONS_SEPARATOR),\n\t\t};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.ASSETS}?extensionsJoined=${params.extensionsJoined}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tif (response.ok) {\n\t\t\t\tconst json: Asset.IndexRequestResponse = await response.json();\n\t\t\t\treturn json;\n\t\t\t} else {\n\t\t\t\tdisplayError(FetchErrorMessage.LOAD_ASSETS);\n\t\t\t\treturn {error: errorString(FetchErrorMessage.LOAD_ASSETS)};\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tdisplayError(FetchErrorMessage.LOAD_ASSETS);\n\t\t\treturn {error: errorString(FetchErrorMessage.LOAD_ASSETS)};\n\t\t}\n\t}\n\tstatic async download(remoteUrl: string) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.ASSET_DOWNLOAD}`;\n\t\tconst data: Asset.DownloadRequestBody = {remoteUrl};\n\t\tconst body = JSON.stringify(data);\n\t\t// console.log(body);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: body,\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tconst json = (await response.json()) as Asset.DownloadRequestResponse;\n\t\t\t\treturn json;\n\t\t\t} else {\n\t\t\t\tdisplayError(FetchErrorMessage.DOWNLOAD_ASSETS);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tdisplayError(FetchErrorMessage.DOWNLOAD_ASSETS);\n\t\t}\n\t}\n}\n","import {NpmModuleApiController} from './NpmModuleApiController';\nimport {BaseSaveController} from '../editor/core/SceneSaveController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\n\nexport class NpmModuleStatusPingController extends BaseSaveController {\n\tprivate _pingActive: boolean = false;\n\tprivate _pingsCount = 0;\n\tprivate _statusChangesCount = 0;\n\tprivate _prevStatus: string | null = null;\n\tstart() {\n\t\tthis._pingActive = true;\n\t\tthis._pingsCount = 0;\n\t\tthis._statusChangesCount = 0;\n\t\tthis._prevStatus = null;\n\t\tthis._pingStatus();\n\t}\n\tchangesCount() {\n\t\treturn this._statusChangesCount;\n\t}\n\tprivate async _pingStatus() {\n\t\tif (!this._pingActive) {\n\t\t\treturn;\n\t\t}\n\t\tconst status = await NpmModuleApiController.status.show({pingCount: this._pingsCount});\n\t\tif (status != this._prevStatus) {\n\t\t\tthis._prevStatus = status;\n\t\t\tthis._statusChangesCount++;\n\t\t}\n\t\tthis._pingsCount++;\n\t\tif (!this._pingActive) {\n\t\t\treturn;\n\t\t}\n\t\tStoreController.editor.status.setLoading(status);\n\t\tsetTimeout(() => {\n\t\t\tthis._pingStatus();\n\t\t}, 200);\n\t}\n\tend() {\n\t\tthis._pingActive = false;\n\t\tthis._pingsCount = 0;\n\t}\n}\n","import {API_ROOT_URL, SaveWarningResponse} from './Common';\nimport {LocalServerUrl, SceneSaveBinaryBody, Scene, ResponseMessageFromLocalServer} from './../NpmModuleTypes';\nimport {NpmModuleStatusPingController} from '../StatusPing';\nimport {PluginsRegisterData} from '../../../@polygonjs/polygonjs/src/engine/poly/registers/plugins/PluginsRegister';\nimport {SceneJsonExporterData} from '../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {IntegrationData} from '../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {EditorLayoutData} from '../../editor/types';\nimport {WindowController} from '../../editor/core/WindowController';\nimport {BinaryController} from '../BinaryController';\nimport {StoreController} from '../../editor/store/controllers/StoreController';\nimport {StatusCodes} from 'http-status-codes';\nimport {DateUtils} from '../../editor/core/DateUtils';\nimport {NpmModuleSceneLoadController} from '../NpmModuleSceneLoadController';\nimport {AppSceneLoader} from '../../config/AppSceneLoader';\nexport interface SceneConfig {\n\tengine_version: string;\n\t// editor_version: string;\n\tname: string;\n\tcode: SceneJsonExporterData;\n\tlayout_data: EditorLayoutData;\n\tnodes: string[];\n\toperations: string[];\n\tjsFunctionTypes: string[];\n\tmodules: string[]; // TODO: could be removed now that modules are not used, but this is kept in case it breaks something in the exporter\n\tassemblers: string[];\n\tintegrations: IntegrationData[];\n\tnodes_map: Dictionary<string>;\n\tplugins_data: PluginsRegisterData;\n\tpoly_nodes: string[];\n\tassets: string[];\n\tlibsRoot: string;\n\tassetsRoot: string;\n\tscenePropTypes: string;\n}\n\nexport class ScenesController {\n\tprivate static _statusPing = new NpmModuleStatusPingController();\n\n\t// static async LoadDefaultSceneResponse(sceneName: string | null) {\n\t// \tconst params: LoadSceneQuery = {scene: sceneName};\n\t// \tconst url = `${API_ROOT_URL}${LocalServerUrl.SCENE_LOAD}?scene=${params.scene}`;\n\t// \tconst response = await fetch(url);\n\t// \treturn response;\n\t// }\n\tstatic async load(sceneName: string | null) {\n\t\tconst params: Scene.ShowBody = {scene: sceneName || ''};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SCENE_LOAD}?scene=${params.scene}`;\n\t\tconst response = await fetch(url);\n\t\treturn response;\n\t}\n\n\tstatic async save(sceneConfig: SceneConfig) {\n\t\tif (WindowController.instance().sceneSavingInProgress()) {\n\t\t\talert('the scene is currently being saved, please wait');\n\t\t\treturn;\n\t\t}\n\t\tWindowController.instance().markSceneSavingInProgress();\n\t\tthis._statusPing.start();\n\n\t\tfunction _bodyAsJSON() {\n\t\t\tconst data = {scene_config: sceneConfig};\n\t\t\tconst body = JSON.stringify(data);\n\t\t\treturn body;\n\t\t\t// const body = {scene_config: uint8Array};\n\t\t}\n\t\tasync function _bodyAsBinary() {\n\t\t\tconst fileDataURL = await BinaryController.encode(sceneConfig);\n\t\t\t// const decoded = await BinaryController.decode(fileDataURL);\n\t\t\t// console.log(decoded);\n\t\t\tconst data: SceneSaveBinaryBody = {\n\t\t\t\tbinary: 1,\n\t\t\t\tsceneName: sceneConfig.name,\n\t\t\t\tfileDataURL,\n\t\t\t};\n\t\t\tconst body = JSON.stringify(data);\n\t\t\treturn body;\n\t\t}\n\t\t// const body = [_bodyAsJSON(), await _bodyAsBinary()][0];\n\t\tconst limitReached = StoreController.editor.userPlan.nodesCountLimitReached();\n\t\tconst body = limitReached ? await _bodyAsBinary() : _bodyAsJSON();\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SCENE_SAVE}`;\n\t\t// DO NOT change scene_config to sceneConfig\n\t\t// without changing it on the server too!!\n\n\t\tconst controller = new AbortController();\n\t\tconst timeoutDuration = 10;\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tif (this._statusPing.changesCount() > 3) {\n\t\t\t\t// if the status ping has changed multiple times,\n\t\t\t\t// we can assume that the server is working\n\t\t\t\t// and there is therefore no need to abort\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontroller.abort();\n\t\t\tconsole.log(`request timed out after ${timeoutDuration}sec`);\n\t\t\tStoreController.editor.status.setWarning(\n\t\t\t\t`Polygonjs hasn't responded in ${timeoutDuration} seconds, the scene may not be saved. Try and save again, or double check Polygonjs is correctly running.`\n\t\t\t);\n\t\t\tWindowController.instance().markSceneSavingCompleted();\n\t\t\tthis._statusPing.end();\n\t\t}, timeoutDuration * 1000);\n\t\t// console.log(body);\n\t\tconst response = await fetch(url, {\n\t\t\tsignal: controller.signal,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: body,\n\t\t});\n\t\tclearTimeout(timeoutId);\n\t\tWindowController.instance().markSceneSavingCompleted();\n\t\tthis._statusPing.end();\n\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tStoreController.editor.status.setMessage(`Scene saved`);\n\n\t\t\tconst json = (await response.json()) as Scene.SaveResponse;\n\t\t\tif (json.warning) {\n\t\t\t\tif (json.warning == ResponseMessageFromLocalServer.NO_NODE_MODULES) {\n\t\t\t\t\tconst response = await StoreController.editor.saveWarnings.display();\n\t\t\t\t\tif (response == SaveWarningResponse.SAVE_AGAIN) {\n\t\t\t\t\t\tsetTimeout(() => this.save(sceneConfig), 200);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tStoreController.editor.status.setMessage(`✅ scene saved at ${DateUtils.nowHuman()}`);\n\t\t\tAppSceneLoader.markScenePersisted(true);\n\t\t\tNpmModuleSceneLoadController.updateUrl(sceneConfig.name);\n\t\t} else {\n\t\t\tawait this._handle_save_scene_error(response, sceneConfig);\n\t\t}\n\n\t\treturn true;\n\t}\n\tstatic async updateName(options: Scene.UpdateNameBody): Promise<Scene.UpdateNameResponse> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SCENE_UPDATE_NAME}`;\n\t\tconst body = JSON.stringify(options);\n\t\tconst response = await fetch(url, {\n\t\t\t// signal: controller.signal,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: body,\n\t\t});\n\t\tconst json = (await response.json()) as Scene.UpdateNameResponse;\n\t\treturn json;\n\t}\n\tstatic async delete(options: Scene.DeleteBody): Promise<Scene.DeleteResponse> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SCENE_DELETE}`;\n\t\tconst body = JSON.stringify(options);\n\t\tconst response = await fetch(url, {\n\t\t\t// signal: controller.signal,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: body,\n\t\t});\n\t\tconst json = (await response.json()) as Scene.DeleteResponse;\n\t\treturn json;\n\t}\n\n\tprivate static async _handle_save_scene_error(response: Response, scene_config: SceneConfig) {\n\t\tconst json = await response.json();\n\t\tconst error = json.error;\n\t\tswitch (error) {\n\t\t\tcase ResponseMessageFromLocalServer.NO_USER: {\n\t\t\t\tawait StoreController.editor.dialogApiLogin.show();\n\t\t\t\tthis.save(scene_config);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// case ResponseMessageFromLocalServer.NO_EXPORT_TYPE: {\n\t\t\t// \tawait StoreController.editor.dialog_api_export.show();\n\t\t\t// \tthis.save_scene(scene_config);\n\t\t\t// \tbreak;\n\t\t\t// }\n\t\t\tdefault: {\n\t\t\t\tconsole.error(error);\n\t\t\t\tStoreController.editor.status.setError(`failed to save scene (error: ${error})`);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {LocalServerUrl, Share} from './../NpmModuleTypes';\n\nimport {API_ROOT_URL} from './Common';\nimport {FetchErrorMessage, displayError, errorString} from './Common';\n\nexport class SharesController {\n\tstatic async uploadScene(data: Share.UploadSceneRequestBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SHARE_SCENE_UPLOAD}`;\n\t\tconst body = JSON.stringify(data);\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: body,\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst json = (await response.json()) as Share.UploadSceneResponse;\n\t\t\t\treturn json;\n\t\t\t} else {\n\t\t\t\tdisplayError(FetchErrorMessage.SHARE_SCENE);\n\t\t\t\treturn {error: errorString(FetchErrorMessage.SHARE_SCENE)};\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tdisplayError(FetchErrorMessage.SHARE_SCENE);\n\t\t\treturn {error: errorString(FetchErrorMessage.SHARE_SCENE)};\n\t\t}\n\t}\n\tstatic async createZip(data: Share.CreateZipRequestBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.SHARE_ZIP}`;\n\t\tconst body = JSON.stringify(data);\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: body,\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst json = (await response.json()) as Share.CreateZipResponse;\n\t\t\t\treturn json;\n\t\t\t} else {\n\t\t\t\tdisplayError(FetchErrorMessage.SHARE_ZIP);\n\t\t\t\treturn {error: errorString(FetchErrorMessage.SHARE_ZIP)};\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tdisplayError(FetchErrorMessage.SHARE_ZIP);\n\t\t\treturn {error: errorString(FetchErrorMessage.SHARE_ZIP)};\n\t\t}\n\t}\n}\n","import {LocalServerUrl, Capture} from './../NpmModuleTypes';\n\nimport {API_ROOT_URL} from './Common';\nimport {StoreController} from '../../editor/store/controllers/StoreController';\nimport {CoreFileUtils} from '../../editor/core/FileUtils';\n// import {FilesRegister} from '../../editor/self_contained/FilesRegister';\n\nexport class CapturesController {\n\tstatic async saveAnimation(sceneName: string, file: File) {\n\t\tconst data: Capture.RequestSaveBody = {\n\t\t\tsceneName,\n\t\t\tfileDataURL: await CoreFileUtils.fileToDataURL(file),\n\t\t};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.CAPTURE_ANIMATION_SAVE}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.ok) {\n\t\t\tconst json = (await response.json()) as Capture.RequestSaveResponse;\n\t\t\tStoreController.editor.captureResult.setLastCaptureUrl(json.url);\n\t\t\t// this status update is redundant with the modal displayed\n\t\t\t// StoreController.editor.status.setMessage(`video saved to ${json.url}`);\n\t\t} else {\n\t\t\tStoreController.editor.status.setError(`failed to save video`);\n\t\t}\n\t}\n\tstatic async requestStatus(options: Capture.RequestStatusBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.CAPTURE_STATUS_REQUEST}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(options),\n\t\t});\n\t\tif (response.ok) {\n\t\t\tconst json = (await response.json()) as Capture.RequestStatusResponse;\n\t\t\treturn json;\n\t\t} else {\n\t\t\tStoreController.editor.status.setError(`failed to save video`);\n\t\t}\n\t}\n\tstatic async saveStatic(sceneName: string, file: File) {\n\t\tconst data: Capture.RequestSaveBody = {\n\t\t\tsceneName,\n\t\t\tfileDataURL: await CoreFileUtils.fileToDataURL(file),\n\t\t};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.CAPTURE_STATIC_SAVE}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.ok) {\n\t\t\tconst json = (await response.json()) as Capture.RequestSaveResponse;\n\t\t\tStoreController.editor.captureResult.setLastCaptureUrl(json.url);\n\t\t\t// this status update is redundant with the modal displayed\n\t\t\t// StoreController.editor.status.setMessage(`image saved to ${json.url}`);\n\t\t} else {\n\t\t\tStoreController.editor.status.setError(`failed to save static image`);\n\t\t}\n\t}\n\tstatic async saveAnimationFrame(sceneName: string, file: File, fileName: string) {\n\t\tconst data: Capture.RequestSaveAnimationFrameBody = {\n\t\t\tsceneName,\n\t\t\tfileDataURL: await CoreFileUtils.fileToDataURL(file),\n\t\t\tfileName,\n\t\t};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.CAPTURE_ANIMATION_FRAME_SAVE}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.ok) {\n\t\t\tconst json = (await response.json()) as Capture.RequestSaveAnimationFrameResponse;\n\t\t\tStoreController.editor.status.setMessage(`frame saved to ${json.filePath}`);\n\t\t} else {\n\t\t\tStoreController.editor.status.setError(`failed to save frame`);\n\t\t}\n\t}\n\tstatic async loadAnimationFrame(sceneName: string, fileName: string) {\n\t\tconst data: Capture.RequestLoadAnimationFrameBody = {\n\t\t\tsceneName,\n\t\t\tfileName,\n\t\t};\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.CAPTURE_ANIMATION_FRAME_LOAD}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.ok) {\n\t\t\tconst json = (await response.json()) as Capture.RequestLoadAnimationFrameResponse;\n\t\t\treturn json;\n\t\t\t// StoreController.editor.status.setMessage(`frame saved to ${json.filePath}`);\n\t\t} else {\n\t\t\t// StoreController.editor.status.setError(`failed to save frame`);\n\t\t}\n\t}\n\t// static async loadStatic(sceneName: string) {\n\t// \tconst params: Capture.RequestLoadQuery = {\n\t// \t\tsceneName,\n\t// \t};\n\t// \tconst url = `${API_ROOT_URL}${LocalServerUrl.CAPTURE_STATIC_LOAD}?sceneName=${params.sceneName}`;\n\t// \tconst response = await fetch(url);\n\t// \tif (response.ok) {\n\t// \t\tconst blob = await response.blob();\n\t// \t\tFilesRegister.setThumbnailStaticBlob(blob);\n\t// \t\t// StoreController.editor.status.setMessage(`image saved to ${json.filePath}`);\n\t// \t} else {\n\t// \t\tconst json = (await response.json()) as Capture.RequestLoadErrorResponse;\n\t// \t\tconsole.warn(json.error);\n\t// \t\t// StoreController.editor.status.setError(`failed to load static image`);\n\t// \t}\n\t// }\n}\n","import {LocalServerUrl, Status} from './../NpmModuleTypes';\ninterface StatusOptions {\n\tpingCount: number;\n}\nimport {API_ROOT_URL} from './Common';\n\nexport class StatusController {\n\tstatic async show(options: StatusOptions) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.STATUS}?ping=${options.pingCount}`;\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst json: Status.ShowResponse = await response.json();\n\t\t\treturn json.status;\n\t\t} catch (err) {\n\t\t\treturn 'failed to read ping status';\n\t\t}\n\t}\n}\n","import {LocalServerUrl, NodeFile} from './../NpmModuleTypes';\ninterface FileDownloadOptions {\n\tblob: Blob;\n\tfileName: string;\n}\nimport {API_ROOT_URL} from './Common';\nimport {CoreFileUtils} from '../../editor/core/FileUtils';\nimport {Editor} from '../../editor/Editor';\nimport {EditorType} from '../../editor/types';\nimport {downloadBlob} from '../../../@polygonjs/polygonjs/src/core/BlobUtils';\nimport {StoreController} from '../../editor/store/controllers/StoreController';\n\nexport class NodeFilesController {\n\tstatic async download(options: FileDownloadOptions) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.NODE_FILE_DOWNLOAD}`;\n\t\tconst file = CoreFileUtils.blobToFile(options.blob, options.fileName);\n\n\t\tif (Editor.type() == EditorType.WEB) {\n\t\t\tconst elements = options.fileName.split('/');\n\t\t\tconst fileName = elements[elements.length - 1];\n\t\t\tdownloadBlob(options.blob, fileName);\n\t\t\treturn;\n\t\t}\n\n\t\tconst data: NodeFile.DownloadSaveBody = {\n\t\t\tfileName: options.fileName,\n\t\t\tfileDataURL: await CoreFileUtils.fileToDataURL(file),\n\t\t};\n\n\t\tfunction showErr() {\n\t\t\tStoreController.editor.status.setError(`failed to save file`);\n\t\t}\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tconst json = (await response.json()) as NodeFile.DownloadSaveResponse;\n\t\t\t\tStoreController.editor.status.setMessage(`✅ file saved to ${json.filePath}`);\n\t\t\t} else {\n\t\t\t\tshowErr();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tshowErr();\n\t\t}\n\t}\n}\n","import {PolyNodeDataRegister} from '../../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDataRegister';\nimport {NodeContext} from '../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {LocalServerUrl, PolyNode} from './../NpmModuleTypes';\nimport {API_ROOT_URL} from './Common';\n\nexport class PolyNodesController {\n\tstatic async index() {\n\t\t// const username = StoreController.editor.currentUser.username().value;\n\t\t// if (!username) {\n\t\t// \tconsole.warn('you need to be logged in to fetch polyNodes');\n\t\t// \treturn;\n\t\t// }\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.POLY_NODES_INDEX}`;\n\t\t// const urlParams = new URLSearchParams();\n\t\t// urlParams.append('username', username);\n\t\t// const urlWithQuery = `${url}?${urlParams.toString()}`;\n\t\tconst response = await fetch(url);\n\t\tconst json = (await response.json()) as PolyNode.DataRegisterDummy[];\n\t\t// console.log(\n\t\t// \t'local polyNodes:',\n\t\t// \tjson.map((elem) => `${elem.username || ''}/${elem.node_context}/${elem.node_type}`).sort(),\n\t\t// \tjson\n\t\t// );\n\t\treturn json;\n\t}\n\tstatic async create(data: PolyNodeDataRegister<NodeContext>) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.POLY_NODE_CREATE}`;\n\t\tconst body = JSON.stringify(data);\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: body,\n\t\t});\n\t\tconst json = (await response.json()) as PolyNode.CreateResponse;\n\t\treturn json;\n\t}\n\tstatic async update(data: PolyNodeDataRegister<NodeContext>) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.POLY_NODE_UPDATE}`;\n\t\tconst body = JSON.stringify(data);\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: body,\n\t\t});\n\t\tconst json = (await response.json()) as PolyNode.UpdateResponse;\n\t\treturn json;\n\t}\n}\n","import {StatusCodes} from 'http-status-codes';\nimport {StoreController} from '../../../editor/store/controllers/StoreController';\nimport {LocalServerUrl, MultiPlayer} from './../../NpmModuleTypes';\n\nimport {API_ROOT_URL} from '../Common';\n\nexport class SceneDataController {\n\tstatic async save(options: MultiPlayer.SceneData.SaveBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_SCENE_DATA_SAVE}`;\n\t\tconst data: MultiPlayer.SceneData.SaveBody = options;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\t//\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\treturn response;\n\t}\n\t// static async request(options: MultiPlayer.SceneData.RequestSceneData) {\n\t// \tconst data: MultiPlayer.SceneData.RequestSceneData = options;\n\t// \tconst urlParams = new URLSearchParams();\n\t// \tconst keys = Object.keys(data) as Array<keyof MultiPlayer.SceneData.RequestSceneData>;\n\t// \tfor (let key of keys) {\n\t// \t\turlParams.append(key, data[key]);\n\t// \t}\n\t// \tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_SCENE_DATA_REQUEST}`;\n\t// \tconst urlWithQuery = `${url}?${urlParams.toString()}`;\n\t// \tconst response = await fetch(urlWithQuery, {\n\t// \t\tmethod: 'GET',\n\t// \t\theaders: {\n\t// \t\t\t'Content-Type': 'application/json',\n\t// \t\t\tAccept: 'application/json',\n\t// \t\t},\n\t// \t\t// body: JSON.stringify(data),\n\t// \t});\n\t// \tif (response.status == StatusCodes.OK) {\n\t// \t\t//\n\t// \t} else {\n\t// \t\t// if the response is not ok, we show the error on the prompt\n\t// \t\tconst json = await response.json();\n\t// \t\tconst error: string = json.error;\n\t// \t\tStoreController.editor.status.setError(error);\n\t// \t}\n\t// \treturn response;\n\t// }\n}\n","import {StatusCodes} from 'http-status-codes';\nimport {StoreController} from '../../../editor/store/controllers/StoreController';\nimport {LocalServerUrl, MultiPlayer} from './../../NpmModuleTypes';\nimport {MathUtils} from 'three';\nimport {API_ROOT_URL} from '../Common';\n\ntype OnSuccessCallback = (response: Response) => Promise<void>;\ntype OnSuccessDisconnectedCallback = (response: Response) => Promise<void>;\ntype OnTimeoutCallback = () => Promise<void>;\ntype OnErrorCallback = () => Promise<void>;\ninterface PostOptions {\n\turl: string;\n\tbody?: BodyInit | null | undefined;\n\ttimeoutDuration?: number;\n\tonSuccess?: OnSuccessCallback;\n\tonSuccessDisconnected?: OnSuccessDisconnectedCallback;\n\tonTimeout?: OnTimeoutCallback;\n\tonError?: OnErrorCallback;\n}\n\nfunction warnTimeout(timeoutDuration?: number) {\n\tStoreController.editor.status.setWarning(\n\t\t`Polygonjs hasn't responded in ${timeoutDuration} seconds, please check that the app is still running`\n\t);\n}\nfunction warnSceneSaveComprised() {\n\tStoreController.editor.status.setWarning(`Please check that the app is running in order to save the scene`);\n}\nfunction warnUndoComprised() {\n\tStoreController.editor.status.setWarning(`Undo not possible, please check that the app is running`);\n}\nfunction warnRedoComprised() {\n\tStoreController.editor.status.setWarning(`Redo not possible, please check that the app is running`);\n}\n\nexport class CommandsController {\n\tprivate static _lastStackIndex = -1;\n\tstatic async requestCommandData(options: MultiPlayer.Command.RequestCommandData): Promise<void> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_COMMAND_REQUEST}`;\n\t\tconst data: MultiPlayer.Command.RequestCommandData = options;\n\t\tconst body = JSON.stringify(data);\n\t\tconst confirmCommand = async () => {\n\t\t\tconst uuid = MathUtils.generateUUID();\n\t\t\tawait StoreController.editor.multiPlayer.commands.processConfirmedCommand({\n\t\t\t\tcommandData: data.command,\n\t\t\t\tstackIndex: this._lastStackIndex,\n\t\t\t\tstackUpdateConfirmedAt: performance.now(),\n\t\t\t\tuuid,\n\t\t\t});\n\t\t\tthis._lastStackIndex++;\n\t\t};\n\t\tconst onSuccess: OnSuccessCallback = async (response: Response) => {\n\t\t\tconst json = (await response.json()) as MultiPlayer.Command.ConfirmCommandData;\n\t\t\tthis._lastStackIndex = json.stackIndex;\n\t\t};\n\t\tconst onSuccessDisconnected: OnSuccessDisconnectedCallback = async (response: Response) => {\n\t\t\tawait confirmCommand();\n\t\t};\n\t\tconst onError: OnErrorCallback = async () => {\n\t\t\twarnSceneSaveComprised();\n\t\t\tawait confirmCommand();\n\t\t};\n\n\t\tawait this._postWithTimeout({\n\t\t\turl,\n\t\t\tbody,\n\t\t\tonSuccess,\n\t\t\tonSuccessDisconnected,\n\t\t\tonError,\n\t\t});\n\t}\n\tstatic async updateCommandData(options: MultiPlayer.Command.UpdateCommandData): Promise<void> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_COMMAND_UPDATE}`;\n\t\tconst data: MultiPlayer.Command.UpdateCommandData = options;\n\t\tconst body = JSON.stringify(data);\n\n\t\t// no need to have errors handling here\n\t\t// as this would only be needed if undo/redo were possible\n\t\t// when app is not running, but it is not the case now\n\t\tawait this._postWithTimeout({\n\t\t\turl,\n\t\t\tbody,\n\t\t});\n\t}\n\n\tstatic async requestUndo(options: MultiPlayer.Command.RequestUndoData): Promise<void> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_UNDO_REQUEST}`;\n\t\tconst data: MultiPlayer.Command.RequestUndoData = options;\n\t\tconst body = JSON.stringify(data);\n\n\t\tconst onError: OnErrorCallback = async () => {\n\t\t\twarnUndoComprised();\n\t\t};\n\t\tawait this._postWithTimeout({\n\t\t\turl,\n\t\t\tbody,\n\t\t\tonError,\n\t\t});\n\t}\n\n\tstatic async requestRedo(options: MultiPlayer.Command.RequestRedoData): Promise<void> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_REDO_REQUEST}`;\n\t\tconst data: MultiPlayer.Command.RequestRedoData = options;\n\t\tconst body = JSON.stringify(data);\n\n\t\tconst onError: OnErrorCallback = async () => {\n\t\t\twarnRedoComprised();\n\t\t};\n\t\tawait this._postWithTimeout({\n\t\t\turl,\n\t\t\tbody,\n\t\t\tonError,\n\t\t});\n\t}\n\tprivate static async _postWithTimeout(options: PostOptions) {\n\t\tconst {url, body, onSuccess, onSuccessDisconnected, onTimeout, onError} = options;\n\t\tlet {timeoutDuration} = options;\n\t\tif (timeoutDuration == null) {\n\t\t\ttimeoutDuration = 3000;\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tcontroller.abort();\n\t\t\tif (onTimeout) {\n\t\t\t\tonTimeout();\n\t\t\t} else {\n\t\t\t\twarnTimeout(timeoutDuration);\n\t\t\t}\n\t\t}, timeoutDuration);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody,\n\t\t\t});\n\t\t\tclearTimeout(timeoutId);\n\t\t\tif (response.status == StatusCodes.OK) {\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tawait onSuccess(response);\n\t\t\t\t}\n\t\t\t\tconst socketConnected = StoreController.editor.multiPlayer.sessions.socketConnected();\n\t\t\t\tif (!socketConnected) {\n\t\t\t\t\tif (onSuccessDisconnected) {\n\t\t\t\t\t\tawait onSuccessDisconnected(response);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//\n\t\t\t} else {\n\t\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\t\tconst json = await response.json();\n\t\t\t\tconst error: string = json.error;\n\t\t\t\tStoreController.editor.status.setError(error);\n\t\t\t}\n\t\t\treturn response;\n\t\t} catch (err) {\n\t\t\tclearTimeout(timeoutId);\n\n\t\t\tif (onError) {\n\t\t\t\tonError();\n\t\t\t}\n\t\t}\n\t}\n}\n","import {StatusCodes} from 'http-status-codes';\nimport {StoreController} from '../../../editor/store/controllers/StoreController';\nimport {LocalServerUrl, MultiPlayer} from './../../NpmModuleTypes';\n\nimport {API_ROOT_URL} from '../Common';\nimport {Vector2Like} from './../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\n\nexport class AwarenessController {\n\tstatic async updatePath(path: string) {\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (!username) {\n\t\t\treturn;\n\t\t}\n\t\tconst sceneName = StoreController.editor.multiPlayer.sceneName();\n\t\tif (!sceneName) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_AWARENESS_UPDATE_PATH}`;\n\t\tconst data: MultiPlayer.Awareness.UpdatePathBody = {sceneName, username, path};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\t// const json = (await response.json()) as MultiplayerUsersCreateResponse;\n\t\t\t// return json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\t// const json = await response.json();\n\t\t\t// const error: string = json.error;\n\t\t\t// StoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async updatePos(pos: Vector2Like) {\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (!username) {\n\t\t\treturn;\n\t\t}\n\t\tconst sceneName = StoreController.editor.multiPlayer.sceneName();\n\t\tif (!sceneName) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_AWARENESS_UPDATE_POSITION}`;\n\t\tconst data: MultiPlayer.Awareness.UpdatePositionBody = {sceneName, username, cursor: pos};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\t// const json = (await response.json()) as MultiplayerUsersDestroyResponse;\n\t\t\t// return json;\n\t\t} else {\n\t\t\t// // if the response is not ok, we show the error on the prompt\n\t\t\t// const json = await response.json();\n\t\t\t// const error: string = json.error;\n\t\t\t// StoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async updateCamera(cameraData: MultiPlayer.Awareness.CameraData) {\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (!username) {\n\t\t\treturn;\n\t\t}\n\t\tconst sceneName = StoreController.editor.multiPlayer.sceneName();\n\t\tif (!sceneName) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_AWARENESS_UPDATE_CAMERA}`;\n\t\tconst data: MultiPlayer.Awareness.UpdateCameraBody = {sceneName, username, camera: cameraData};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\t// const json = (await response.json()) as MultiplayerUsersDestroyResponse;\n\t\t\t// return json;\n\t\t} else {\n\t\t\t// // if the response is not ok, we show the error on the prompt\n\t\t\t// const json = await response.json();\n\t\t\t// const error: string = json.error;\n\t\t\t// StoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n}\n","import {StatusCodes} from 'http-status-codes';\nimport {StoreController} from '../../../editor/store/controllers/StoreController';\nimport {LocalServerUrl, MultiPlayer} from '../../NpmModuleTypes';\n\nimport {API_ROOT_URL} from '../Common';\n\nexport class MultiPlayerSessionsController {\n\tstatic async creationAllowed(options: MultiPlayer.Session.CheckCreationAllowedBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_SESSION_CHECK_CREATION_ALLOWED}`;\n\t\tconst data: MultiPlayer.Session.CheckCreationAllowedBody = options;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.Session.CheckCreationAllowedResponse;\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async create(options: MultiPlayer.Session.CreateBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_SESSION_CREATE}`;\n\t\tconst data: MultiPlayer.Session.CreateBody = options;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.Session.CreateResponse;\n\t\t\tthis.show();\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async show() {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_SESSION_SHOW}`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\t// body: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.Session.ShowResponse;\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async destroy(options: MultiPlayer.Session.DestroyBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_SESSION_DESTROY}`;\n\t\tconst data: MultiPlayer.Session.DestroyBody = options;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\t//\n\t\t\tconst json = (await response.json()) as MultiPlayer.Session.DestroyResponse;\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n}\n","import {StatusCodes} from 'http-status-codes';\nimport {StoreController} from '../../../editor/store/controllers/StoreController';\nimport {NpmAuthController} from './../../NpmAuthController';\nimport {LocalServerUrl, MultiPlayer} from './../../NpmModuleTypes';\n\nimport {API_ROOT_URL} from '../Common';\n\nexport class UserRequestsController {\n\tstatic async index() {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_REQUEST_INDEX}`;\n\t\t// const data: MultiplayerUsersDestroyBody = options;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\t// body: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.UserRequest.IndexResponse;\n\t\t\t// StoreController.editor.multiPlayer.setUsersData(json);\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async create() {\n\t\tif (!StoreController.editor.multiPlayer.active.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst secret = NpmAuthController.secret();\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (!secret) {\n\t\t\tconsole.error('cannot create multiplayer user');\n\t\t\treturn;\n\t\t}\n\t\tif (!username) {\n\t\t\tconsole.error('cannot create multiplayer user as no username found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_REQUEST_CREATE}`;\n\t\tconst data: MultiPlayer.UserRequest.CreateBody = {\n\t\t\tsecret,\n\t\t\tusername,\n\t\t};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.UserRequest.CreateResponse;\n\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async approve(username: string) {\n\t\tif (!StoreController.editor.multiPlayer.active.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst secret = NpmAuthController.secret();\n\t\tif (!secret) {\n\t\t\tconsole.error('cannot create multiplayer user');\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_REQUEST_APPROVE}`;\n\t\tconst data: MultiPlayer.UserRequest.ApproveBody = {\n\t\t\tsecret,\n\t\t\tusername,\n\t\t};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.UserRequest.ApproveResponse;\n\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async reject(username: string) {\n\t\tif (!StoreController.editor.multiPlayer.active.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst secret = NpmAuthController.secret();\n\t\tif (!secret) {\n\t\t\tconsole.error('cannot create multiplayer user');\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_REQUEST_REJECT}`;\n\t\tconst data: MultiPlayer.UserRequest.RejectBody = {\n\t\t\tsecret,\n\t\t\tusername,\n\t\t};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.UserRequest.RejectResponse;\n\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n}\n","// import {MULTIPLAYER_AWARENESS_DEFAULT_LINK_INDEX} from './../../../store/controllers/editor/MultiPlayerController';\nimport {NpmAuthController} from './../../NpmAuthController';\nimport {StatusCodes} from 'http-status-codes';\nimport {StoreController} from '../../../editor/store/controllers/StoreController';\nimport {LocalServerUrl, MultiPlayer} from './../../NpmModuleTypes';\n\nimport {API_ROOT_URL} from '../Common';\n\nexport class UsersController {\n\tstatic async index() {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_INDEX}`;\n\t\t// const data: MultiplayerUsersDestroyBody = options;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\t// body: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.User.IndexResponse;\n\t\t\t// StoreController.editor.multiPlayer.setUsersData(json);\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\t// static async create() {\n\t// \tif (!StoreController.editor.multiPlayer.active.value) {\n\t// \t\treturn;\n\t// \t}\n\n\t// \tconst secret = NpmAuthController.secret();\n\t// \tconst username = StoreController.editor.currentUser.username().value;\n\t// \tif (!secret) {\n\t// \t\tconsole.error('cannot create multiplayer user');\n\t// \t\treturn;\n\t// \t}\n\t// \tif (!username) {\n\t// \t\tconsole.error('cannot create multiplayer user as no username found');\n\t// \t\treturn;\n\t// \t}\n\n\t// \tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_CREATE}`;\n\t// \tconst data: MultiPlayer.User.CreateBody = {\n\t// \t\tsecret,\n\t// \t\tusername,\n\t// \t};\n\t// \tconst response = await fetch(url, {\n\t// \t\tmethod: 'POST',\n\t// \t\theaders: {\n\t// \t\t\t'Content-Type': 'application/json',\n\t// \t\t\tAccept: 'application/json',\n\t// \t\t},\n\t// \t\tbody: JSON.stringify(data),\n\t// \t});\n\t// \tif (response.status == StatusCodes.OK) {\n\t// \t\tconst json = (await response.json()) as MultiPlayer.User.CreateResponse;\n\n\t// \t\t// add the current path as soon as the user is created\n\t// \t\tconst currentNode = StoreController.editor.currentNode(MULTIPLAYER_AWARENESS_DEFAULT_LINK_INDEX);\n\t// \t\tif (currentNode) {\n\t// \t\t\tStoreController.editor.multiPlayer.awareness.updatePath(currentNode.path());\n\t// \t\t}\n\n\t// \t\twindow.removeEventListener('beforeunload', this._destroyBound);\n\t// \t\twindow.addEventListener('beforeunload', this._destroyBound);\n\n\t// \t\treturn json;\n\t// \t} else {\n\t// \t\t// if the response is not ok, we show the error on the prompt\n\t// \t\tconst json = await response.json();\n\t// \t\tconst error: string = json.error;\n\t// \t\tStoreController.editor.status.setError(error);\n\t// \t}\n\t// \t// return response;\n\t// }\n\n\t//\n\t//\n\t// it could be useful to remove the user\n\t// with window.removeEventListener('beforeunload'\n\t// but that would remove it too eagerly\n\t// if multiple tabs were being used at the same time.\n\t// Another strategy to investigate would be\n\t// to mark it as inactive if its awareness data had not been updated in 1 or 10 minutes\n\t//\n\t// private static _destroyBound = this.destroy.bind(this);\n\t// static async destroy() {\n\t// \tif (!StoreController.editor.multiPlayer.active.value) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst secret = NpmAuthController.secret();\n\t// \tif (!secret) {\n\t// \t\tconsole.error('cannot create multiplayer user');\n\t// \t\treturn;\n\t// \t}\n\n\t// \tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_DESTROY}`;\n\t// \tconst data: MultiPlayer.User.DestroyBody = {\n\t// \t\tsecret,\n\t// \t};\n\t// \tconst response = await fetch(url, {\n\t// \t\tmethod: 'POST',\n\t// \t\theaders: {\n\t// \t\t\t'Content-Type': 'application/json',\n\t// \t\t\tAccept: 'application/json',\n\t// \t\t},\n\t// \t\tbody: JSON.stringify(data),\n\t// \t});\n\t// \tif (response.status == StatusCodes.OK) {\n\t// \t\tconst json = (await response.json()) as MultiPlayer.User.DestroyResponse;\n\t// \t\treturn json;\n\t// \t} else {\n\t// \t\t// if the response is not ok, we show the error on the prompt\n\t// \t\tconst json = await response.json();\n\t// \t\tconst error: string = json.error;\n\t// \t\tStoreController.editor.status.setError(error);\n\t// \t}\n\t// \t// return response;\n\t// }\n\tstatic async ban(username: string) {\n\t\tconst secret = NpmAuthController.secret();\n\t\tif (!secret) {\n\t\t\tconsole.error('cannot ban user');\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_BAN}`;\n\t\tconst data: MultiPlayer.User.BanBody = {\n\t\t\tsecret,\n\t\t\tusername,\n\t\t};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.User.BanResponse;\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n\tstatic async unban(username: string) {\n\t\tconst secret = NpmAuthController.secret();\n\t\tif (!secret) {\n\t\t\tconsole.error('cannot create multiplayer user');\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MULTIPLAYER_USER_UNBAN}`;\n\t\tconst data: MultiPlayer.User.UnBanBody = {\n\t\t\tsecret,\n\t\t\tusername,\n\t\t};\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tif (response.status == StatusCodes.OK) {\n\t\t\tconst json = (await response.json()) as MultiPlayer.User.UnBanResponse;\n\t\t\treturn json;\n\t\t} else {\n\t\t\t// if the response is not ok, we show the error on the prompt\n\t\t\tconst json = await response.json();\n\t\t\tconst error: string = json.error;\n\t\t\tStoreController.editor.status.setError(error);\n\t\t}\n\t\t// return response;\n\t}\n}\n","import {Poly} from '../../../@polygonjs/polygonjs/src/engine/Poly';\nimport {LocalServerUrl, Library} from './../NpmModuleTypes';\n\nimport {API_ROOT_URL} from './Common';\n\nimport {displayError, FetchErrorMessage} from './Common';\n\ninterface InstallOptions {\n\treInstallIfAlreadyPresent: boolean;\n}\nexport class LibrariesController {\n\tstatic async installDraco() {\n\t\treturn this._installLib(LocalServerUrl.INSTALL_DRACO, {reInstallIfAlreadyPresent: false});\n\t}\n\tstatic async installKTX2() {\n\t\treturn this._installLib(LocalServerUrl.INSTALL_KTX2, {reInstallIfAlreadyPresent: false});\n\t}\n\tstatic async installXAtlas() {\n\t\treturn this._installLib(LocalServerUrl.INSTALL_XATLAS, {reInstallIfAlreadyPresent: false});\n\t}\n\tstatic async installOCCT() {\n\t\treturn this._installLib(LocalServerUrl.INSTALL_OCCT, {reInstallIfAlreadyPresent: false});\n\t}\n\tstatic async installManifold() {\n\t\treturn this._installLib(LocalServerUrl.INSTALL_MANIFOLD, {reInstallIfAlreadyPresent: false});\n\t}\n\t// static async installWebIFC() {\n\t// \treturn this._installLib(LocalServerUrl.INSTALL_WEB_IFC, {reInstallIfAlreadyPresent: false});\n\t// }\n\tstatic async reInstallAllIfAlreadyPresent() {\n\t\tconst reInstallIfAlreadyPresent = true;\n\t\tawait this._installLib(LocalServerUrl.INSTALL_DRACO, {reInstallIfAlreadyPresent});\n\t\tawait this._installLib(LocalServerUrl.INSTALL_KTX2, {reInstallIfAlreadyPresent});\n\t\tawait this._installLib(LocalServerUrl.INSTALL_XATLAS, {reInstallIfAlreadyPresent});\n\t\tawait this._installLib(LocalServerUrl.INSTALL_OCCT, {reInstallIfAlreadyPresent});\n\t\tawait this._installLib(LocalServerUrl.INSTALL_MANIFOLD, {reInstallIfAlreadyPresent});\n\t\t// await this._installLib(LocalServerUrl.INSTALL_WEB_IFC, {reInstallIfAlreadyPresent});\n\t}\n\tprivate static async _installLib(routeName: string, options: InstallOptions) {\n\t\tconst libsRoot = Poly.libs.root();\n\t\tif (!libsRoot) {\n\t\t\treturn;\n\t\t}\n\t\tconst params: Library.InstallBody = {\n\t\t\tlibsRoot: libsRoot,\n\t\t\treInstallIfAlreadyPresent: options.reInstallIfAlreadyPresent,\n\t\t};\n\t\t// const urlParams = new URLSearchParams();\n\t\t// \t\t\turlParams.append('libsRoot', params.libsRoot);\n\t\t// \t\t\turlParams.append('reInstallIfOutOfDate', params.reInstallIfOutOfDate?1:0);\n\t\tconst url = `${API_ROOT_URL}${routeName}`;\n\t\tconsole.log(url);\n\t\tconst body = JSON.stringify(params);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: body,\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\treturn response;\n\t\t\t} else {\n\t\t\t\tdisplayError(FetchErrorMessage.INSTALL_LIB);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tdisplayError(FetchErrorMessage.INSTALL_LIB);\n\t\t}\n\t}\n}\n","import {ConfigController} from './controllers/ConfigController';\nimport {SingleUserSessionsController} from './controllers/SingleUserSessionsController';\nimport {SceneNamesController} from './controllers/SceneNamesController';\nimport {AssetsController} from './controllers/AssetsController';\nimport {ScenesController} from './controllers/ScenesController';\nimport {SharesController} from './controllers/SharesController';\nimport {CapturesController} from './controllers/CapturesController';\nimport {StatusController} from './controllers/StatusController';\nimport {NodeFilesController} from './controllers/NodeFilesController';\nimport {PolyNodesController} from './controllers/PolyNodesController';\nimport {SceneDataController} from './controllers/multiPlayer/SceneDataController';\nimport {CommandsController} from './controllers/multiPlayer/CommandsController';\nimport {AwarenessController} from './controllers/multiPlayer/AwarenessController';\nimport {MultiPlayerSessionsController} from './controllers/multiPlayer/MultiPlayerSessionsController';\nimport {UserRequestsController} from './controllers/multiPlayer/UserRequestsController';\n\nimport {UsersController} from './controllers/multiPlayer/UsersController';\nimport {LibrariesController} from './controllers/LibrariesController';\n\ndeclare global {\n\tinterface Window {\n\t\tskip_token_with_username: string | undefined;\n\t}\n}\n\nexport class NpmModuleApiController {\n\tstatic assets = AssetsController;\n\tstatic captures = CapturesController;\n\tstatic config = ConfigController;\n\tstatic libraries = LibrariesController;\n\tstatic nodeFiles = NodeFilesController;\n\tstatic polyNodes = PolyNodesController;\n\tstatic sceneNames = SceneNamesController;\n\tstatic scenes = ScenesController;\n\tstatic sessions = SingleUserSessionsController;\n\tstatic shares = SharesController;\n\tstatic status = StatusController;\n\tpublic static readonly multiPlayer = {\n\t\tsessions: MultiPlayerSessionsController,\n\t\tuserRequests: UserRequestsController,\n\t\tusers: UsersController,\n\t\tawareness: AwarenessController,\n\t\tcommands: CommandsController,\n\t\tsceneData: SceneDataController,\n\t};\n}\n","import {PolyEventName} from '../../poly/utils/PolyEventName';\n\nexport class PolyEventsDispatcher {\n\tstatic dispatchProgressEvent(progress: number, sceneName?: string) {\n\t\tconst createEvent = (eventName: string) => {\n\t\t\treturn new CustomEvent(eventName, {\n\t\t\t\tdetail: {\n\t\t\t\t\tprogress,\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t\tdocument.dispatchEvent(createEvent(PolyEventName.POLY_PROGRESS));\n\t\tdocument.dispatchEvent(createEvent(`${PolyEventName.POLY_PROGRESS}-${sceneName}`));\n\t}\n}\n","export const PROGRESS_RATIO = {\n\tsceneData: {start: 0, mult: 0.25},\n\tassets: {start: 0.25, mult: 0.0},\n\tnodes: {start: 0.25, mult: 0.75},\n};\n","export enum SelfContainedFileName {\n\tEXPORT_MANIFEST = 'scene/export_manifest.json',\n\t// SCENE_MANIFEST = 'scene/scene_manifest.json',\n\tCODE_PREFIX = 'scene/code',\n\tPROPERTIES = 'scene/code/properties.json',\n\tEDITOR = 'scene/editor.json',\n\tASSETS = 'scene/assets.json',\n\tPOLYGONJS = 'js/all.js',\n\tSCENE_DATA_LOADER = 'js/sceneDataLoader.js',\n\tPOLY_CONFIG = 'js/polyConfig.js',\n\tJS_FILES = 'scene/js_files.json',\n\tPOSTER = 'images/poster.png',\n}\nexport type JsFilesManifest = {\n\tmodules: string[];\n};\nexport interface SelfContainedManifestContent {\n\tsource: string;\n\tuseConfigureScene: boolean;\n\tversion: {\n\t\tpolygonjs: string;\n\t\teditor: string;\n\t};\n}\n","import {NodeJSONShadersData, NodeJSONFunctionBodiesData} from './../../json/export/Node';\nimport {sanitizeUrl} from '../../../../core/UrlHelper';\nimport {PolyDictionary} from '../../../../types/GlobalTypes';\nimport {PolyEventsDispatcher} from '../../common/EventsDispatcher';\nimport {PROGRESS_RATIO} from '../../common/Progress';\nimport {NodeJsonExporterData, NodeJsonExporterUIData} from '../../json/export/Node';\nimport {SceneJsonExporterData, SceneJsonExporterDataProperties} from '../../json/export/Scene';\nimport {SelfContainedFileName} from '../../self_contained/Common';\n\nexport type ManifestNodesData = PolyDictionary<string>;\nexport type NodeJSONShadersTimestampData = PolyDictionary<PolyDictionary<string>>;\nexport type JsFunctionBodyDataTimestampData = PolyDictionary<string>;\nexport interface ManifestContent {\n\tproperties: string;\n\troot: string;\n\tnodes: ManifestNodesData;\n\tshaders: NodeJSONShadersTimestampData;\n\tjsFunctionBodies: JsFunctionBodyDataTimestampData;\n}\n\ntype ProgressCallback = (ratio: number) => void;\ninterface ImportData {\n\tsceneName?: string;\n\turlPrefix?: string;\n\tmanifest: ManifestContent;\n\teditorMode?: boolean;\n\tonProgress?: ProgressCallback;\n}\n\nexport interface SceneDataElements {\n\troot: NodeJsonExporterData;\n\tproperties: SceneJsonExporterDataProperties;\n\tui?: NodeJsonExporterUIData;\n\tshaders?: NodeJSONShadersData;\n\tjsFunctionBodies?: NodeJSONFunctionBodiesData;\n}\n\ninterface ShaderUrlOptionsBasic {\n\tnodePath: string;\n\tshaderName: string;\n\ttimestamp: string;\n}\ninterface JsFunctionBodyUrlOptionsBasic {\n\tnodePath: string;\n\ttimestamp: string;\n}\ninterface ShaderUrlOptions extends ShaderUrlOptionsBasic {\n\turlPrefix: string;\n}\ninterface JsFunctionBodyUrlOptions extends JsFunctionBodyUrlOptionsBasic {\n\turlPrefix: string;\n}\nfunction _shaderUrl(options: ShaderUrlOptions) {\n\tconst {urlPrefix, nodePath, shaderName, timestamp} = options;\n\treturn `${urlPrefix}/root/${nodePath}.${shaderName}.glsl?t=${timestamp}`;\n}\nfunction _jsFunctionBodyUrl(options: JsFunctionBodyUrlOptions) {\n\tconst {urlPrefix, nodePath, timestamp} = options;\n\treturn `${urlPrefix}/root/${nodePath}.txt?t=${timestamp}`;\n}\nfunction _iterateShaders(manifest: ManifestContent, callback: (options: ShaderUrlOptionsBasic) => void) {\n\tconst shaderNodePaths = Object.keys(manifest.shaders);\n\tfor (let nodePath of shaderNodePaths) {\n\t\tconst nodeShaders = manifest.shaders[nodePath];\n\t\tconst nodeShaderNames = Object.keys(nodeShaders);\n\t\tfor (let shaderName of nodeShaderNames) {\n\t\t\tconst timestamp = nodeShaders[shaderName];\n\t\t\tcallback({nodePath, shaderName, timestamp});\n\t\t}\n\t}\n}\nfunction _iterateFunctionBodies(manifest: ManifestContent, callback: (options: JsFunctionBodyUrlOptionsBasic) => void) {\n\tconst nodePaths = Object.keys(manifest.jsFunctionBodies);\n\tfor (let nodePath of nodePaths) {\n\t\tconst timestamp = manifest.jsFunctionBodies[nodePath];\n\t\tcallback({nodePath, timestamp});\n\t}\n}\n\nexport class SceneDataManifestImporter {\n\tstatic async importSceneData(importData: ImportData): Promise<SceneJsonExporterData> {\n\t\tif (importData.editorMode == null) {\n\t\t\timportData.editorMode = false;\n\t\t}\n\t\tconst manifest = importData.manifest;\n\t\tconst urlPrefix = importData.urlPrefix || SelfContainedFileName.CODE_PREFIX;\n\t\tconst nodePaths = Object.keys(manifest.nodes);\n\t\tconst nodeUrls: string[] = [];\n\t\tfor (let node_path of nodePaths) {\n\t\t\tconst timestamp = manifest.nodes[node_path];\n\t\t\tconst url = `${urlPrefix}/root/${node_path}.json?t=${timestamp}`;\n\t\t\tnodeUrls.push(url);\n\t\t}\n\t\tconst root_url = `${urlPrefix}/root.json?t=${manifest.root}`;\n\t\tconst properties_url = `${urlPrefix}/properties.json?t=${manifest.properties}`;\n\t\tconst allUrls = [root_url, properties_url];\n\n\t\t// add editor urls if needed\n\t\tif (importData.editorMode) {\n\t\t\tconst now = Date.now();\n\t\t\tallUrls.push(`${urlPrefix}/ui.json?t=${now}`);\n\t\t\t//all_urls.push(`${url_prefix}/editor.json?t=${now}`);\n\t\t}\n\n\t\t// add all nodes\n\t\tfor (let nodeUrl of nodeUrls) {\n\t\t\tallUrls.push(nodeUrl);\n\t\t}\n\t\t// add all shaders\n\t\tconst shaderUrls: string[] = [];\n\t\t_iterateShaders(manifest, (options) => {\n\t\t\tconst shaderUrl = _shaderUrl({urlPrefix, ...options});\n\t\t\tallUrls.push(shaderUrl);\n\t\t\tshaderUrls.push(shaderUrl);\n\t\t});\n\t\t// add all function bodies\n\t\tconst jsFunctionBodiesUrls: string[] = [];\n\t\t_iterateFunctionBodies(manifest, (options) => {\n\t\t\tconst jsFunctionBodyUrl = _jsFunctionBodyUrl({urlPrefix, ...options});\n\t\t\tallUrls.push(jsFunctionBodyUrl);\n\t\t\tjsFunctionBodiesUrls.push(jsFunctionBodyUrl);\n\t\t});\n\n\t\tlet count = 0;\n\t\tconst jsonPayloadsCount = allUrls.length - (shaderUrls.length + jsFunctionBodiesUrls.length);\n\t\tconst total = allUrls.length;\n\n\t\tfunction _incrementCount() {\n\t\t\tcount++;\n\t\t\tconst ratio = count / total;\n\t\t\tconst progressRatio = PROGRESS_RATIO.sceneData;\n\t\t\tconst progress = progressRatio.start + progressRatio.mult * ratio;\n\t\t\tif (importData.onProgress) {\n\t\t\t\timportData.onProgress(progress);\n\t\t\t}\n\t\t\tPolyEventsDispatcher.dispatchProgressEvent(progress, importData.sceneName);\n\t\t}\n\n\t\tconst sanitizedUrls = allUrls.map((url) => sanitizeUrl(url));\n\t\tconst promises = sanitizedUrls.map((url) => fetch(url));\n\t\tconst responses = await Promise.all(promises);\n\t\tconst jsonResponses = responses.slice(0, jsonPayloadsCount);\n\t\tconst textResponses = responses.slice(jsonPayloadsCount);\n\t\tconst results = await Promise.all([\n\t\t\t...jsonResponses.map((response) => {\n\t\t\t\t_incrementCount();\n\t\t\t\treturn response.json();\n\t\t\t}),\n\t\t\t...textResponses.map((response) => {\n\t\t\t\t_incrementCount();\n\t\t\t\treturn response.text();\n\t\t\t}),\n\t\t]);\n\t\tconst jsons = results.slice(0, jsonPayloadsCount);\n\t\tconst texts = results.slice(jsonPayloadsCount);\n\t\tlet textIndex = 0;\n\t\tconst shadersData: NodeJSONShadersData = {};\n\t\t_iterateShaders(manifest, (options) => {\n\t\t\tconst text = texts[textIndex];\n\t\t\tconst {nodePath, shaderName} = options;\n\t\t\tshadersData[nodePath] = shadersData[nodePath] || {};\n\t\t\tshadersData[nodePath][shaderName] = text;\n\t\t\ttextIndex++;\n\t\t});\n\t\tconst jsFunctionBodiesData: NodeJSONFunctionBodiesData = {};\n\t\t_iterateFunctionBodies(manifest, (options) => {\n\t\t\tconst text = texts[textIndex];\n\t\t\tconst {nodePath} = options;\n\t\t\tjsFunctionBodiesData[nodePath] = text;\n\t\t\ttextIndex++;\n\t\t});\n\n\t\tconst assembleData: SceneDataElements = {\n\t\t\troot: jsons[0],\n\t\t\tproperties: jsons[1],\n\t\t\tshaders: shadersData,\n\t\t\tjsFunctionBodies: jsFunctionBodiesData,\n\t\t};\n\t\tlet responseOffset = 2;\n\t\tif (importData.editorMode) {\n\t\t\tassembleData['ui'] = jsons[2];\n\t\t\tresponseOffset += 1;\n\t\t}\n\n\t\tconst jsonByName: PolyDictionary<object> = {};\n\t\tconst manifestNodes = Object.keys(manifest.nodes);\n\t\tfor (let i = 0; i < manifestNodes.length; i++) {\n\t\t\tconst manifestName = manifestNodes[i];\n\t\t\tconst json = jsons[i + responseOffset];\n\t\t\tjsonByName[manifestName] = json;\n\t\t}\n\n\t\treturn this.assemble(assembleData, manifestNodes, jsonByName);\n\t}\n\n\tstatic async assemble(\n\t\tassembleData: SceneDataElements,\n\t\tmanifestNodes: string[],\n\t\tjsonByName: PolyDictionary<object>\n\t) {\n\t\tconst sceneData: SceneJsonExporterData = {\n\t\t\troot: assembleData.root,\n\t\t\tproperties: assembleData.properties,\n\t\t\tui: assembleData.ui,\n\t\t\tshaders: assembleData.shaders,\n\t\t\tjsFunctionBodies: assembleData.jsFunctionBodies,\n\t\t};\n\n\t\tfor (let i = 0; i < manifestNodes.length; i++) {\n\t\t\tconst manifestName = manifestNodes[i];\n\t\t\tconst json = jsonByName[manifestName];\n\t\t\tthis._insertChildData(sceneData.root, manifestName, json);\n\t\t}\n\t\treturn sceneData;\n\t}\n\n\tprivate static _insertChildData(data: any, path: string, json: object) {\n\t\tconst elements = path.split('/');\n\t\tif (elements.length == 1) {\n\t\t\tif (!data.nodes) {\n\t\t\t\tdata.nodes = {};\n\t\t\t}\n\t\t\tdata.nodes[path] = json;\n\t\t} else {\n\t\t\tconst parentName: string = elements.shift() as string;\n\t\t\tconst pathWithoutParent: string = elements.join('/');\n\t\t\tconst parentData = data.nodes[parentName];\n\t\t\tthis._insertChildData(parentData, pathWithoutParent, json);\n\t\t}\n\t}\n}\n","// import {StoreController} from './../store/controllers/StoreController';\nimport {AppSceneLoader, LoadSceneData, WrappedLoadData} from '../config/AppSceneLoader';\nimport {BinaryController} from './BinaryController';\nimport {EditorLayoutData} from '../editor/types';\nimport {SceneJsonExporterData} from '../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {NpmModuleApiController} from './NpmModuleApiController';\nimport {\n\tSceneDataManifestImporter,\n\tSceneDataElements,\n} from '../../@polygonjs/polygonjs/src/engine/io/manifest/import/SceneData';\n// import {StatusCodes} from 'http-status-codes';\nimport {Scene, ResponseMessageFromLocalServer} from './NpmModuleTypes';\n// import {FeaturesController} from '../editor/core/FeaturesController';\nimport {router, editScenePath} from '../routes';\n\n// const DEFAULT_URL = {\n// \tCODE: '/examples/scenes/simple/code.json',\n// \tEDITOR: '/examples/scenes/simple/editor.json',\n// };\n// interface WrapOptions{\n// \tsceneName:string | null;\n// \teditor_data: EditorLayoutData\n// \tscene_code: SceneJsonExporterData\n// }\n\nexport class NpmModuleSceneLoadController {\n\t// static sceneUrl(sceneName: string | null) {\n\t// \tconst rootUrl = window.location.origin;\n\t// \t// there are cases where opening the page even with an empty sceneName\n\t// \t// would load a pre-existing scene. So to be safe, I just remove the scene url param totally\n\t// \tif (sceneName) {\n\t// \t\tconst route = editSceneRoute(sceneName);\n\t// \t\tconst url = `${rootUrl}/${route}`;\n\t// \t\tconsole.log(url);\n\t// \t\treturn url;\n\t// \t} else {\n\t// \t\treturn rootUrl;\n\t// \t}\n\t// }\n\tstatic updateUrl(sceneName: string) {\n\t\trouter.push(editScenePath(sceneName));\n\t\t// const url = this.sceneUrl(sceneName);\n\t\t// const urlSceneName = FeaturesController.sceneName();\n\t\t// console.log(url, window.location.href);\n\n\t\t// we check first that the new url is different\n\t\t// otherwise this forces a full page reload on every scene save\n\t\t//if (urlSceneName != window.location.href) {\n\t\t// update we now check that the scene names match,\n\t\t// so that we can keep url parameters like measurePerformanceOnLoad\n\t\t// if (urlSceneName != sceneName) {\n\t\t// \t(window as any).location = url;\n\t\t// }\n\n\t\tthis.updateDocumentTitle(sceneName);\n\t}\n\tstatic updateDocumentTitle(sceneName: string | null) {\n\t\tif (sceneName) {\n\t\t\tdocument.title = `${sceneName} (Polygonjs Editor)`;\n\t\t} else {\n\t\t\tdocument.title = `Polygonjs Editor`;\n\t\t}\n\t}\n\n\tstatic async load(sceneName: string | null): Promise<WrappedLoadData | undefined> {\n\t\tconst response = await NpmModuleApiController.scenes.load(sceneName);\n\t\tif (!response.ok) {\n\t\t\talert('The scene cannot be loaded, please check the app is running');\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst json = (await response.json()) as Scene.ShowResponse;\n\t\t\tif (json.error) {\n\t\t\t\t// if sceneName is not null, and the error is 'no manifest',\n\t\t\t\t// then we know we got code for a new scene, while we expected a proper one.\n\t\t\t\t// therefore we should redirect\n\t\t\t\tif (sceneName != null && json.error == ResponseMessageFromLocalServer.NO_MANIFEST) {\n\t\t\t\t\treturn {error: ResponseMessageFromLocalServer.NO_MANIFEST};\n\t\t\t\t} else {\n\t\t\t\t\tconst response_data = json as any as Scene.LoadDefaultResponse;\n\t\t\t\t\tconst scene_code = response_data.scene.code as SceneJsonExporterData;\n\n\t\t\t\t\tconst editor_data = response_data.scene.editor as EditorLayoutData;\n\t\t\t\t\tAppSceneLoader.markScenePersisted(false);\n\t\t\t\t\tAppSceneLoader.markSceneUpdateAllowed(true);\n\t\t\t\t\treturn {sceneData: {scene_code, editor_data, sceneName: null}};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tAppSceneLoader.markScenePersisted(true);\n\t\t\t\tAppSceneLoader.markSceneUpdateAllowed(true);\n\t\t\t\tif (json.fileDataURL) {\n\t\t\t\t\treturn {sceneData: await this._loadFromServerBinary(json, sceneName)};\n\t\t\t\t} else {\n\t\t\t\t\treturn {sceneData: await this._loadFromServerJSON(json, sceneName)};\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\talert('The scene files are not loaded correctly');\n\t\t\treturn;\n\t\t}\n\t}\n\tprivate static async _loadFromServerBinary(data: Scene.ShowResponse, sceneName: string | null) {\n\t\tconst {fileDataURL} = data;\n\t\tif (!fileDataURL) {\n\t\t\talert('it looks like the scene was not saved property');\n\t\t\treturn;\n\t\t\t// return this._load_default();\n\t\t}\n\t\tconst content = await BinaryController.decode(fileDataURL);\n\t\tconst scene_code = content.code;\n\t\tconst editor_data = content.layout_data;\n\n\t\treturn await this._wrapData({\n\t\t\tsceneName,\n\t\t\tscene_code,\n\t\t\teditor_data,\n\t\t});\n\t}\n\n\tprivate static async _loadFromServerJSON(data: Scene.ShowResponse, sceneName: string | null) {\n\t\tconst requiredProperties: Array<keyof Scene.ShowResponse> = [\n\t\t\t'manifest',\n\t\t\t'editor_data',\n\t\t\t'jsons_by_name',\n\t\t\t'root',\n\t\t\t'ui',\n\t\t\t'properties',\n\t\t];\n\t\tconst absentProperties: Array<keyof Scene.ShowResponse> = requiredProperties.filter(\n\t\t\t(propName) => data[propName] == null\n\t\t);\n\n\t\tif (absentProperties.length > 0) {\n\t\t\talert('it looks like the scene was not saved property');\n\n\t\t\tconsole.log('properties missing:', absentProperties);\n\t\t\tconsole.log(data);\n\t\t\treturn;\n\t\t\t// return this._load_default();\n\t\t}\n\n\t\tconst assemble_data: SceneDataElements = {\n\t\t\troot: data.root as any,\n\t\t\tproperties: data.properties as any,\n\t\t\tui: data.ui as any,\n\t\t};\n\n\t\t//\n\t\t// do not use SceneDataManifestImporter\n\t\t//\n\t\t// if we use SceneDataManifestImporter here,\n\t\t// it messes up with sceneData from Multiplayer mode,\n\t\t// as it will load the json files in public dir,\n\t\t// when this is not necessary, as all the data is already present\n\t\t//\n\t\tlet scene_code: SceneJsonExporterData = assemble_data;\n\t\tif (\n\t\t\tdata.multiplayer == null &&\n\t\t\tdata.manifest != null &&\n\t\t\tdata.manifest.nodes != null &&\n\t\t\tdata.jsons_by_name != null\n\t\t) {\n\t\t\t// using the SceneDataManifestImporter is very much necessary when not in multiplayer\n\t\t\t// so we expect to go here only if manifest is null,\n\t\t\t// which should only happen .multiplayer==false\n\t\t\tscene_code = await SceneDataManifestImporter.assemble(\n\t\t\t\tassemble_data,\n\t\t\t\tObject.keys(data.manifest.nodes),\n\t\t\t\tdata.jsons_by_name\n\t\t\t);\n\t\t}\n\t\t//\n\t\t// data.manifest != null && data.jsons_by_name != null\n\t\t// \t? await SceneDataManifestImporter.assemble(\n\t\t// \t\t\tassemble_data,\n\t\t// \t\t\tObject.keys(data.manifest.nodes),\n\t\t// \t\t\tdata.jsons_by_name\n\t\t// \t  )\n\t\t// \t: assemble_data;\n\n\t\t//\n\t\t//\n\t\t//\n\t\t// note, do not try and display this modal here,\n\t\t// as it can't be displayed before the editor is mounted\n\t\t// const scenePolygonjsVersion = scene_code.properties?.versions?.polygonjs;\n\t\t// if (scenePolygonjsVersion) {\n\t\t// \tconst currentVersion = NpmModuleSceneSaveController.engineVersion();\n\t\t// \tif (currentVersion != scenePolygonjsVersion) {\n\t\t// \t\tconst message = `you are loading a scene saved with Polygonjs version ${scenePolygonjsVersion}, but the editor you are loading it with is using version ${currentVersion}. You can proceed and check that your scene works well. But if not, you can load the editor with the same version with 'npx polygonjs-editor@${scenePolygonjsVersion}-1'.`;\n\t\t// \t\tawait StoreController.editor.dialogNotice.show({\n\t\t// \t\t\ttitle: 'Scene versions conflict',\n\t\t// \t\t\tmessage: message,\n\t\t// \t\t});\n\t\t// \t}\n\t\t// }\n\t\treturn await this._wrapData({\n\t\t\tsceneName,\n\t\t\tscene_code,\n\t\t\teditor_data: data.editor_data as EditorLayoutData,\n\t\t});\n\t\t// const editor_data = data.editor_data as EditorLayoutData;\n\t\t// this.updateDocumentTitle(sceneName);\n\t\t// return {scene_code, editor_data, sceneName};\n\t}\n\tprivate static async _wrapData(options: LoadSceneData) {\n\t\tconst {editor_data, sceneName} = options;\n\t\tlet {scene_code} = options;\n\n\t\t// if (sceneName) {\n\t\t// \tconst multiplayerSceneData = await StoreController.editor.multiPlayer.sceneData.request(sceneName);\n\t\t// \tif (multiplayerSceneData) {\n\t\t// \t\tscene_code = multiplayerSceneData;\n\t\t// \t}\n\t\t// }\n\t\t// const editor_data = data.editor_data as EditorLayoutData;\n\t\tthis.updateDocumentTitle(sceneName);\n\t\treturn {scene_code, editor_data, sceneName};\n\t}\n\t// private static async _load_default() {\n\t// \tconst promises = [fetch(DEFAULT_URL.CODE), fetch(DEFAULT_URL.EDITOR)];\n\t// \tconst responses = await Promise.all(promises);\n\t// \tconst [code_response, editor_response] = responses;\n\t// \tconst scene_code = (await code_response.json()) as SceneJsonExporterData;\n\t// \tconst editor_data = (await editor_response.json()) as EditorLayoutData;\n\t// \treturn {scene_code, editor_data};\n\t// }\n}\n","import {PolyNodeDefinition} from '../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDefinition';\n\n/**\n * below this line, the declaration should be identical to the ones in the npm server\n */\n\nexport interface Dictionary<T> {\n\t[Key: string]: T;\n}\nexport enum ResponseMessageFromLocalServer {\n\tNO_USER = 'no user',\n\tNO_MANIFEST = 'no manifest',\n\tNO_POLY_CONFIG = 'no poly plugins',\n\tNO_EDITOR_CONFIG = 'no editor config',\n\tNO_EDITOR = 'no editor data',\n\t// NO_EXPORT_TYPE = 'no export type',\n\tNO_NODE_MODULES = 'no node_modules',\n\t// NO_ASSETS_CONFIG = 'no assets config, make sure to save your scene',\n\tNO_LIBS_ROOT = 'no libs root',\n\tTHREEJS_NOT_INSTALLED = 'threejs is not installed',\n\tXATLAS_NOT_INSTALLED = 'xatlas is not installed',\n\tPOLYGONJS_NOT_INSTALLED = 'polygonjs is not installed',\n}\nexport enum LocalServerUrl {\n\tROOT = '/',\n\t// auth\n\tTOKEN_CREATE = '/api/tokens',\n\tTOKEN_GET = '/api/token',\n\tLOGOUT = '/api/logout',\n\t// scene\n\tSCENES = '/api/scenes',\n\tSCENE_LOAD = '/api/scenes/load',\n\tSCENE_SAVE = '/api/scenes/save',\n\tSCENE_UPDATE_NAME = '/api/scenes/updateName',\n\tSCENE_DELETE = '/api/scenes/delete',\n\t// polyNodes\n\tPOLY_NODES_INDEX = '/api/poly_nodes',\n\tPOLY_NODE_CREATE = '/api/poly_nodes/create',\n\tPOLY_NODE_UPDATE = '/api/poly_nodes/update',\n\t// marketplace themes\n\t// MARKETPLACE_TEMPLATE_CREATE = '/marketplace/templates/create',\n\t// marketplace poly nodes\n\tMARKETPLACE_POLY_NODES_INDEX = '/api/marketplace/poly_nodes',\n\tMARKETPLACE_POLY_NODES_SEARCH = '/api/marketplace/poly_nodes/search',\n\tMARKETPLACE_POLY_NODES_DOWNLOAD = '/api/marketplace/poly_nodes/download',\n\tMARKETPLACE_POLY_NODES_UPLOAD = '/api/marketplace/poly_nodes/upload',\n\t// share\n\tSHARE_SCENE_UPLOAD = '/api/share/upload',\n\tSHARE_ZIP = '/api/share/zip',\n\t// capture\n\tCAPTURE_ANIMATION_SAVE = '/api/captures/animation/save',\n\tCAPTURE_STATUS_REQUEST = '/api/captures/status',\n\tCAPTURE_STATIC_SAVE = '/api/captures/static/save',\n\tCAPTURE_STATIC_LOAD = '/api/captures/static/load',\n\tCAPTURE_ANIMATION_FRAME_SAVE = '/api/captures/animation/frame/save',\n\tCAPTURE_ANIMATION_FRAME_LOAD = '/api/captures/animation/frame/load',\n\t// configs\n\t// EXPORT_TYPE_SAVE = '/export_type/save',\n\tPOLY_CONFIG_LOAD = '/api/poly_config/load.js',\n\tEDITOR_CONFIG_LOAD = '/api/editor_config/load.js',\n\t// assets\n\tASSETS = '/api/assets.json',\n\tASSET_DOWNLOAD = '/api/assets/download.json',\n\t// libraries\n\tINSTALL_DRACO = '/api/install/draco.json',\n\tINSTALL_KTX2 = '/api/install/ktx2.json',\n\tINSTALL_XATLAS = '/api/install/xatlas.json',\n\tINSTALL_OCCT = '/api/install/occt.json',\n\tINSTALL_MANIFOLD = '/api/install/manifold.json',\n\t// INSTALL_WEB_IFC = '/api/install/ifc.json',\n\t// utils\n\tSTATUS = '/api/utils/status.json',\n\t// node files download\n\tNODE_FILE_DOWNLOAD = '/api/node_files/download',\n\t// multiplayer\n\tMULTIPLAYER_SESSION_CHECK_CREATION_ALLOWED = '/api/multiplayer/sessions/checkCreationAllowed',\n\tMULTIPLAYER_SESSION_CREATE = '/api/multiplayer/sessions/create',\n\tMULTIPLAYER_SESSION_SHOW = '/api/multiplayer/sessions/show',\n\tMULTIPLAYER_SESSION_DESTROY = '/api/multiplayer/sessions/destroy',\n\tMULTIPLAYER_USER_REQUEST_INDEX = '/api/multiplayer/userRequests/index',\n\tMULTIPLAYER_USER_REQUEST_CREATE = '/api/multiplayer/userRequests/create',\n\tMULTIPLAYER_USER_REQUEST_APPROVE = '/api/multiplayer/userRequests/approve',\n\tMULTIPLAYER_USER_REQUEST_REJECT = '/api/multiplayer/userRequests/reject',\n\t// MULTIPLAYER_USER_CREATE = '/multiplayer/users/create',\n\tMULTIPLAYER_USER_INDEX = '/api/multiplayer/users/index',\n\tMULTIPLAYER_USER_DESTROY = '/api/multiplayer/users/destroy',\n\tMULTIPLAYER_USER_BAN = '/api/multiplayer/users/ban',\n\tMULTIPLAYER_USER_UNBAN = '/api/multiplayer/users/unban',\n\tMULTIPLAYER_AWARENESS_UPDATE_PATH = '/api/multiplayer/awareness/path/update',\n\tMULTIPLAYER_AWARENESS_UPDATE_POSITION = '/api/multiplayer/awareness/position/update',\n\tMULTIPLAYER_AWARENESS_UPDATE_CAMERA = '/api/multiplayer/awareness/camera/update',\n\tMULTIPLAYER_COMMAND_REQUEST = '/api/multiplayer/commands/request',\n\tMULTIPLAYER_COMMAND_UPDATE = '/api/multiplayer/commands/update',\n\tMULTIPLAYER_UNDO_REQUEST = '/api/multiplayer/undo/request',\n\tMULTIPLAYER_REDO_REQUEST = '/api/multiplayer/redo/request',\n\tMULTIPLAYER_SCENE_DATA_SAVE = '/api/multiplayer/sceneData/save',\n\t// MULTIPLAYER_SCENE_DATA_REQUEST = '/multiplayer/sceneData/request',\n\t// plugins\n\tPLUGIN_FIGMA_PING = '/plugins/figma/ping',\n}\n\nexport enum Route {\n\tROOT = '/',\n\tSCENE_NEW = '/scenes/new',\n\tSCENE_EDIT = '/scenes/:sceneName/edit',\n\tSCENE_SETTINGS = '/scenes/:sceneName/settings',\n\tPROFILE_SCENE_EDIT = '/:username/:sceneName/edit',\n\tEXAMPLE = '/examples/:exampleId',\n\tDEMO = '/demo',\n\tDOCS = '/docs',\n\t// TEST = '/test',\n}\n// export const ASSET_EMOJIS = [\n// \t'🦓',\n// \t'🐴',\n// \t'🐯',\n// \t'🐱',\n// \t'🦝',\n// \t'🦊',\n// \t'🐷',\n// \t'🐏',\n// \t'🐑',\n// \t'🐩',\n// \t'🐉',\n// \t'🦕',\n// \t'🦍',\n// \t'🐺',\n// \t'🐗',\n// \t'🦒',\n// \t'🦙',\n// \t'🐫',\n// \t'🐁',\n// \t'🐀',\n// \t'🐹',\n// \t'🐰',\n// \t'🐇',\n// \t'🦫',\n// \t'🦔',\n// \t'🦇',\n// \t'🐻',\n// \t'🐨',\n// \t'🐼',\n// \t'🦥',\n// \t'🦦',\n// \t'🦨',\n// \t'🦘',\n// \t'🦡',\n// \t'🦃',\n// \t'🐔',\n// \t'🐓',\n// \t'🐦',\n// \t'🐧',\n// \t'🦅',\n// \t'🦆',\n// \t'🦢',\n// \t'🦉',\n// \t'🦤',\n// \t'🪶',\n// \t'🦩',\n// \t'🦚',\n// \t'🦜',\n// \t'🐸',\n// \t'🐊',\n// \t'🐢',\n// \t'🦎',\n// \t'🐍',\n// \t'🐲',\n// \t'🐉',\n// \t'🦕',\n// \t'🦖',\n// \t'🐳',\n// \t'🐋',\n// \t'🐬',\n// \t'🦭',\n// \t'🐟',\n// \t'🐠',\n// \t'🐡',\n// \t'🦈',\n// \t'🐙',\n// \t'🐚',\n// \t'🪸',\n// \t'🐌',\n// \t'🦋',\n// \t'🐛',\n// \t'🐜',\n// \t'🐝',\n// \t'🪲',\n// \t'🐞',\n// \t'🦗',\n// \t'🪳',\n// \t'🦂',\n// ];\nexport enum EditorRoute {\n\tABOUT = 'about',\n\tASSETS = 'assets',\n\tEXPORT = 'export',\n\tLIBRARIES = 'libraries',\n\tLOGIN = 'login',\n\tPOLY_NODE_CREATE = 'polynodes/create/:urlNodePath',\n\tPOLY_NODE_UPDATE = 'polynodes/update/:urlNodePath',\n\tPREFERENCES = 'preferences',\n\tMARKET = 'market',\n\tSELECT_FILE = 'select/file/:urlParamPath',\n\tSELECT_NODE = 'select/node/:urlParamPath',\n\tSELECT_OBJECT_MASK = 'select/objectmask/:urlParamPath',\n\tSHARE = 'share',\n\tSPARE_PARAMS_EDIT = 'spareparams/:urlNodePath',\n\tMULTIPLAYER = 'multiplayer',\n\t// VIEWER_HTML = 'viewerHTML',\n\tKEYFRAMES = 'keyframes/:urlNodePath',\n}\nexport const EDITOR_ROUTES: EditorRoute[] = [\n\tEditorRoute.ABOUT,\n\tEditorRoute.ASSETS,\n\tEditorRoute.EXPORT,\n\tEditorRoute.LIBRARIES,\n\tEditorRoute.LOGIN,\n\tEditorRoute.POLY_NODE_CREATE,\n\tEditorRoute.POLY_NODE_UPDATE,\n\tEditorRoute.PREFERENCES,\n\tEditorRoute.MARKET,\n\tEditorRoute.SELECT_FILE,\n\tEditorRoute.SELECT_NODE,\n\tEditorRoute.SELECT_OBJECT_MASK,\n\tEditorRoute.SHARE,\n\tEditorRoute.SPARE_PARAMS_EDIT,\n\tEditorRoute.MULTIPLAYER,\n\t// EditorRoute.VIEWER_HTML,\n\tEditorRoute.KEYFRAMES,\n];\nexport const RESERVED_PUBLIC_ASSETS_FOLDER_NAMES = [\n\t'audio',\n\t'images',\n\t'fonts',\n\t'models',\n\t'textures',\n\t'three', // for js/lib\n];\nexport enum SocketEvent {\n\tAUTH_SESSION_DESTROYED = 'auth-session-destroyed',\n\tFILE_CHANGED = 'file-changed',\n\tMULTIPLAYER_SESSION_DESTROYED = 'multiplayer-session-destroyed',\n\tMULTIPLAYER_USERS_UPDATED = 'multiplayer-users-updated',\n\tMULTIPLAYER_AWARENESS_UPDATED = 'multiplayer-awareness-updated',\n\tMULTIPLAYER_COMMAND_CONFIRMED = 'multiplayer-command-confirmed',\n\tMULTIPLAYER_UNDO_CONFIRMED = 'multiplayer-undo-confirmed',\n\tMULTIPLAYER_REDO_CONFIRMED = 'multiplayer-redo-confirmed',\n}\n\nexport interface EditorSaveOptions {\n\t// createExport: boolean;\n\t// skipExportSinceRemoteAssetsPresents: boolean;\n\tcheckRemoteAssetsUse: boolean;\n\tminimizeFilesCount: boolean;\n\t// compressJs: boolean;\n\t// createZip: boolean;\n\t// runPostExportCommand: boolean;\n}\nexport interface SceneSaveBinaryBody {\n\tbinary: number;\n\tsceneName: string;\n\tfileDataURL: string;\n}\n\n// When the ManifestContent interface is updated\n// make sure to sync it with SceneDataManifestImporter\n// to allow the engine to load it.\nexport type ManifestNodesData = Dictionary<string>;\nexport type PersistedConfigsShadersData = Dictionary<Dictionary<string>>;\nexport type JsFunctionBodiesData = Dictionary<string>;\nexport interface ManifestContent {\n\tproperties: string;\n\troot: string;\n\tnodes: ManifestNodesData;\n\tshaders2: PersistedConfigsShadersData;\n\tjsFunctionBodies: JsFunctionBodiesData;\n}\nexport interface ServerSideSceneJsonExporterData {\n\tproperties: object;\n\troot: object;\n\tui: object;\n\tshaders?: PersistedConfigsShadersData;\n\tjsFunctionBodies?: JsFunctionBodiesData;\n\tembeddedPolyNodes?: Dictionary<object>;\n}\n\nexport namespace Config {\n\texport interface PolyConfigQuery {\n\t\tsceneName: string;\n\t\t// raw: '0' | '1';\n\t}\n\n\texport type LoadPolyConfigResponse = string;\n\texport type LoadEditorConfigResponse = Dictionary<string>;\n}\n\nexport namespace AuthSession {\n\texport interface UserDataResponse {\n\t\tusername: string;\n\t\tpro: boolean;\n\t\tbeta_approved: boolean;\n\t\tdestroyed_tokens: string[];\n\t}\n\texport interface CreateBody {\n\t\tbrowserId: string;\n\t\temail: string;\n\t\tpassword: string;\n\t}\n\texport interface CreateResponse {\n\t\tsecret: string;\n\t\tdestroyed_tokens: string[];\n\t}\n\texport interface ShowBody {\n\t\tbrowserId: string;\n\t\tsecret?: string;\n\t}\n\texport interface DestroyedData {\n\t\tbrowserIds: string[];\n\t\t// browserIdToKeep: string;\n\t\t// username: string;\n\t}\n\texport interface DestroyBody {\n\t\tbrowserId: string;\n\t\tsecret?: string;\n\t}\n\texport interface DestroyResponse {\n\t\tdestroyed_tokens: string[];\n\t\terror?: string;\n\t}\n}\nexport namespace Capture {\n\texport interface RequestSaveBody {\n\t\tsceneName: string;\n\t\tfileDataURL: string;\n\t}\n\texport interface RequestSaveResponse {\n\t\tfilePath: string;\n\t\turl: string;\n\t}\n\texport interface RequestLoadQuery {\n\t\tsceneName: string;\n\t}\n\texport interface RequestLoadErrorResponse {\n\t\terror: string;\n\t}\n\texport interface RequestStatusBody {\n\t\tsceneName: string;\n\t}\n\texport interface RequestStatusResponse {\n\t\tstaticThumbnailExists: boolean;\n\t\tanimationExists: boolean;\n\t}\n\texport interface RequestSaveAnimationFrameBody {\n\t\tsceneName: string;\n\t\tfileDataURL: string;\n\t\tfileName: string;\n\t}\n\texport interface RequestSaveAnimationFrameResponse {\n\t\tfilePath: string;\n\t}\n\texport interface RequestLoadAnimationFrameBody {\n\t\tsceneName: string;\n\t\tfileName: string;\n\t}\n\texport interface RequestLoadAnimationFrameResponse {\n\t\tfilePath: string;\n\t}\n}\n// export interface ExportTypeRequestBody {\n// \texport: SceneExportType;\n// }\nexport const TIMESTAMP_URL_PARAM_NAME = 'timestamp';\nexport const ASSETS_EXTENSIONS_SEPARATOR = ',';\nexport namespace Asset {\n\texport interface FileData {\n\t\tfilePath: string;\n\t\ttimestamp: number;\n\t}\n\texport interface IndexRequestBody {\n\t\textensionsJoined: string;\n\t}\n\texport interface IndexRequestResponse {\n\t\terror?: string;\n\t\tfilesData?: FileData[];\n\t}\n\texport interface DownloadRequestBody {\n\t\tremoteUrl: string;\n\t}\n\texport interface DownloadRequestResponse {\n\t\tlocalUrl: string;\n\t\ttimestamp: number;\n\t}\n}\n\nexport namespace Library {\n\texport interface InstallBody {\n\t\tlibsRoot: string;\n\t\treInstallIfAlreadyPresent: boolean;\n\t}\n}\n\n// export interface AssetsRequestResponse {\n// \terror?: string;\n// \tpaths?: string[];\n// }\nexport namespace Scene {\n\texport interface IndexRequestResponse {\n\t\terror?: string;\n\t\tscenes?: string[];\n\t}\n\texport interface ShowBody {\n\t\tscene: string | null;\n\t}\n\texport interface ShowResponse {\n\t\tmanifest?: ManifestContent;\n\t\teditor_data?: object;\n\t\troot?: object;\n\t\tproperties?: object;\n\t\tui?: object;\n\t\tjsons_by_name?: Dictionary<object>;\n\t\terror?: string;\n\t\tfileDataURL?: string;\n\t\tmultiplayer?: boolean;\n\t}\n\texport interface SaveResponse {\n\t\twarning?: string;\n\t}\n\texport interface LoadDefaultResponse {\n\t\terror: string;\n\t\tscene: {\n\t\t\tcode: object;\n\t\t\teditor: object;\n\t\t};\n\t}\n\texport interface UpdateNameBody {\n\t\toriginalSceneName: string;\n\t\tnewSceneName: string;\n\t}\n\texport interface UpdateNameResponse {\n\t\terror?: string;\n\t\tupdatedSceneName?: string;\n\t}\n\texport interface DeleteBody {\n\t\tsceneName: string;\n\t}\n\texport interface DeleteResponse {\n\t\terror?: string;\n\t}\n}\n// export interface ExportSceneQuery {\n// \tscene: string;\n// \tminify: '0' | '1';\n// \tgzip: '0' | '1';\n// \tbrotli: '0' | '1';\n// }\n// export interface ExportSceneResponse {\n// \tuncompressed: string;\n// \tgzip: string;\n// \tbrotli: string;\n// }\n\nexport namespace Status {\n\texport interface ShowResponse {\n\t\tstatus: string;\n\t}\n}\n\n// export enum SceneExportType {\n// \tTYPESCRIPT = 'typescript',\n// \tJAVASCRIPT = 'javascript',\n// \tHTML = 'html',\n// }\n\n//\n// POLY NODES\n//\nexport namespace PolyNode {\n\texport interface MetaData {\n\t\tnode_context: string;\n\t\tnode_type: string;\n\t\tusername?: string;\n\t\tversion?: number;\n\t}\n\texport interface PolyNodeThumbnail {\n\t\tthumbnail_url?: string;\n\t}\n\texport interface DataRegisterDummy extends MetaData {\n\t\tdata: PolyNodeDefinition;\n\t}\n\texport interface PolyNodeVersions {\n\t\tlocalVersion?: number;\n\t}\n\texport interface DataRegisterDummyWithVersions extends DataRegisterDummy, PolyNodeVersions {\n\t\tdata: PolyNodeDefinition;\n\t\tfromMarketplace: boolean;\n\t}\n\texport interface IndexRequestBody {\n\t\t// username: string;\n\t}\n\texport type IndexResponse = DataRegisterDummyWithVersions[];\n\texport type CreateRequestBody = DataRegisterDummy;\n\texport interface CreateResponse {\n\t\terror?: string;\n\t}\n\texport type UpdateRequestBody = DataRegisterDummy;\n\texport interface UpdateResponse {\n\t\terror?: string;\n\t}\n}\n\n// export type MarketplaceThemeRequestBody = {\n// \tname: string;\n// };\nexport namespace MarketPlace {\n\texport interface MyPolyNodeData extends PolyNode.MetaData, PolyNode.PolyNodeVersions, PolyNode.PolyNodeThumbnail {\n\t\tlocal: boolean;\n\t\t// localDownloaded: boolean;\n\t\tonline: boolean;\n\t}\n\texport interface PolyNodeMetaDataWithThumbnail extends PolyNode.MetaData, PolyNode.PolyNodeThumbnail {}\n\texport interface BrowsePolyNodeData extends PolyNode.MetaData, PolyNode.PolyNodeThumbnail {\n\t\tinstalledVersion?: number;\n\t}\n\texport interface AuthOptions {\n\t\tskip_token_with_username?: string;\n\t}\n\texport interface PolyNodeIndexRequestBody extends AuthOptions {\n\t\tusername: string;\n\t\tsecret: string;\n\t}\n\texport interface PolyNodeIndexResponseFromMarket {\n\t\tpolyNodes?: MyPolyNodeData[];\n\t\terror?: string;\n\t}\n\texport type PolyNodeIndexResponseFromLocal = PolyNodeIndexResponseFromMarket;\n\texport interface PolyNodeSearchRequestFromEditorBody extends AuthOptions {\n\t\tq: string;\n\t\t// secret: string;\n\t}\n\texport interface PolyNodeSearchResponseFromMarket {\n\t\tpolyNodes?: BrowsePolyNodeData[];\n\t\terror?: string;\n\t}\n\texport type PolyNodeSearchResponseFromServer = PolyNodeSearchResponseFromMarket;\n\n\texport interface PolyNodeUploadRequestFromWebEditorBody extends AuthOptions {\n\t\tnode_context: string;\n\t\tnode_type: string;\n\t}\n\texport interface PolyNodeUploadRequestFromLocalEditorBody extends PolyNodeUploadRequestFromWebEditorBody {\n\t\tsecret: string;\n\t}\n\texport interface PolyNodeDownloadRequestFromEditorBody extends AuthOptions {\n\t\tusername: string;\n\t\tnode_context: string;\n\t\tnode_type: string;\n\t\tversion: number;\n\t\tsecret?: string;\n\t\t// fromOtherUser: boolean;\n\t}\n\texport type PolyNodeUploadRequestFromServerToMarketBody = {\n\t\tnode_context: string;\n\t\tnode_type: string;\n\t\tdata: string;\n\t};\n\texport type PolyNodeUploadResponseFromServerToClient = {\n\t\terror?: string;\n\t};\n\texport type PolyNodeDownloadRequestFromServerBody = {\n\t\tusername: string;\n\t\tnode_context: string;\n\t\tnode_type: string;\n\t\tversion: number;\n\t};\n\texport type PolyNodeDownloadResponseFromMarket = PolyNodeDefinition;\n\texport type PolyNodeDownloadResponseFromLocal = {\n\t\tpolyNodeDefinition?: PolyNodeDownloadResponseFromMarket;\n\t\terror?: string;\n\t};\n}\n\nexport namespace NodeFile {\n\texport interface DownloadSaveBody {\n\t\tfileName: string;\n\t\tfileDataURL: string;\n\t}\n\texport interface DownloadSaveResponse {\n\t\tfilePath: string;\n\t}\n}\n\nexport namespace Share {\n\texport interface UploadSceneRequestBody {\n\t\tname: string;\n\t\tcode: string;\n\t\tcode_editor: string;\n\t\tjs_version: string;\n\t\tsecret: string;\n\t}\n\texport interface UploadSceneResponse {\n\t\turl?: string;\n\t\terror?: string;\n\t}\n\texport interface CreateZipRequestBody {\n\t\tname: string;\n\t}\n\texport interface CreateZipResponse {\n\t\turl?: string;\n\t\terror?: string;\n\t}\n}\n\n/**\n *\n * FILES WATCHING\n *\n */\nexport interface FileWatchData {\n\trequestedUrl: string;\n\tfullFilePath: string;\n\tnewTimestamp: number;\n}\n\n/**\n *\n * MULTIPLAYER\n *\n */\ninterface SceneName {\n\tsceneName: string;\n}\nexport interface StackIndex {\n\tstackIndex: number;\n}\nexport interface StackTimestamp {\n\tstackUpdateConfirmedAt: number;\n}\nexport namespace MultiPlayer {\n\texport namespace Session {\n\t\texport interface CheckCreationAllowedBody {\n\t\t\tsecret: string;\n\t\t}\n\t\texport interface CheckCreationAllowedResponse {\n\t\t\tsessionCreationAllowed: boolean;\n\t\t\terror?: string;\n\t\t}\n\t\texport interface CreateBody {\n\t\t\tsecret: string;\n\t\t}\n\t\texport interface CreateResponse {\n\t\t\tshareUrl?: string;\n\t\t\tstartedBy?: string;\n\t\t\tstarted: boolean;\n\t\t\terror?: string;\n\t\t}\n\t\texport interface ShowResponse {\n\t\t\tshareUrl?: string;\n\t\t\tstartedBy?: string;\n\t\t\tstarted: boolean;\n\t\t}\n\t\texport interface DestroyBody {\n\t\t\tbrowserIdToKeep: string;\n\t\t\tsecret: string;\n\t\t}\n\t\texport interface DestroyResponse {\n\t\t\terror?: string;\n\t\t\tdestroyed: boolean;\n\t\t}\n\t\texport interface DestroyedData {\n\t\t\tbrowserIdToKeep?: string;\n\t\t\tejectAll: boolean;\n\t\t}\n\t}\n\texport namespace UserRequest {\n\t\texport interface ServerSideUserRequestData {\n\t\t\tusername: string;\n\t\t\trejected: boolean;\n\t\t}\n\t\texport interface IndexResponse {\n\t\t\trequests: ServerSideUserRequestData[];\n\t\t}\n\t\texport interface CreateBody {\n\t\t\tsecret: string;\n\t\t\tusername: string;\n\t\t}\n\t\texport interface CreateResponse {\n\t\t\terror?: string;\n\t\t}\n\t\texport interface ApproveBody {\n\t\t\tsecret: string;\n\t\t\tusername: string;\n\t\t}\n\t\texport interface ApproveResponse {\n\t\t\terror?: string;\n\t\t}\n\t\texport interface RejectBody {\n\t\t\tsecret: string;\n\t\t\tusername: string;\n\t\t}\n\t\texport interface RejectResponse {\n\t\t\terror?: string;\n\t\t}\n\t}\n\texport namespace User {\n\t\texport interface ServerSideUserData {\n\t\t\tusername: string;\n\t\t\tbanned: boolean;\n\t\t}\n\t\t// export interface MultiplayerUserData {\n\t\t// \tusername: string;\n\t\t// }\n\t\texport interface IndexResponse {\n\t\t\tusers: ServerSideUserData[];\n\t\t}\n\n\t\t// export interface CreateBody {\n\t\t// \tsecret: string;\n\t\t// \tusername: string;\n\t\t// }\n\t\t// export interface CreateResponse {\n\t\t// \terror?: string;\n\t\t// }\n\n\t\texport interface DestroyBody {\n\t\t\tsecret: string;\n\t\t}\n\t\texport interface DestroyResponse {}\n\t\texport interface BanBody {\n\t\t\tsecret: string;\n\t\t\tusername: string;\n\t\t}\n\t\texport interface BanResponse {}\n\t\texport interface UnBanBody {\n\t\t\tsecret: string;\n\t\t\tusername: string;\n\t\t}\n\t\texport interface UnBanResponse {}\n\t\texport interface UpdatedData extends IndexResponse {\n\t\t\tusers: ServerSideUserData[];\n\t\t\trequests: MultiPlayer.UserRequest.ServerSideUserRequestData[];\n\t\t}\n\t}\n\texport namespace Command {\n\t\texport interface BaseJSONDummy {\n\t\t\ttype: string;\n\t\t}\n\t\texport interface RequestCommandData extends SceneName {\n\t\t\tcommand: BaseJSONDummy;\n\t\t\tusername?: string;\n\t\t}\n\n\t\texport interface UpdateCommandData extends SceneName {\n\t\t\tcommand: BaseJSONDummy;\n\t\t\tuuid: string;\n\t\t}\n\n\t\texport interface ConfirmCommandData extends StackIndex, StackTimestamp, SceneName {\n\t\t\tcommand: BaseJSONDummy;\n\t\t\tuuid: string;\n\t\t}\n\t\texport interface RequestUndoData extends SceneName {\n\t\t\tusername?: string;\n\t\t}\n\t\texport interface ConfirmUndoData extends StackIndex, StackTimestamp, SceneName {\n\t\t\tcommand?: BaseJSONDummy;\n\t\t\tcommandFound: boolean;\n\t\t}\n\t\texport interface RequestRedoData extends SceneName {\n\t\t\tusername?: string;\n\t\t}\n\t\texport interface ConfirmRedoData extends StackIndex, StackTimestamp, SceneName {\n\t\t\tcommand?: BaseJSONDummy;\n\t\t\tcommandFound: boolean;\n\t\t}\n\t}\n\texport namespace Awareness {\n\t\tinterface PathData {\n\t\t\tpath: string;\n\t\t}\n\t\tinterface UsernameData {\n\t\t\tusername: string;\n\t\t}\n\t\texport interface PositionData {\n\t\t\tcursor: {x: number; y: number};\n\t\t}\n\t\texport interface CameraData {\n\t\t\tposition: {x: number; y: number};\n\t\t\tzoom: number;\n\t\t}\n\t\tinterface AwarenessCameraData {\n\t\t\tcamera: CameraData;\n\t\t}\n\t\tinterface AwarenessData extends PathData, PositionData, AwarenessCameraData {}\n\t\t// export interface UpdatePathData extends AwarenessPathData, AwarenessUsernameData {}\n\t\t// export interface UpdatePositionData extends AwarenessPositionData, AwarenessUsernameData {}\n\t\texport type DataRecord = Record<string, AwarenessData>;\n\t\texport interface UpdatePathBody extends PathData, UsernameData {\n\t\t\tsceneName: string;\n\t\t}\n\t\texport interface UpdatePositionBody extends PositionData, UsernameData {\n\t\t\tsceneName: string;\n\t\t}\n\t\texport interface UpdateCameraBody extends AwarenessCameraData, UsernameData {\n\t\t\tsceneName: string;\n\t\t}\n\t\texport type UpdateData = Record<string, DataRecord>;\n\t}\n\texport namespace SceneData {\n\t\texport type SceneData = Scene.ShowResponse;\n\t\texport interface SaveBody extends SceneName, StackTimestamp {\n\t\t\tsceneData: Scene.ShowResponse;\n\t\t\tusername: string;\n\t\t}\n\t\t// export interface RequestSceneData extends SceneName {\n\t\t// \tusername: string;\n\t\t// }\n\t\t// export interface RequestSceneDataResponse {\n\t\t// \tsceneData?: SceneData;\n\t\t// \tsceneDataFound: boolean;\n\t\t// }\n\t}\n}\n","import {FeaturesController} from '../../editor/core/FeaturesController';\nimport {StoreController} from '../../editor/store/controllers/StoreController';\n\nconst IS_PROD = process.env.NODE_ENV == 'production';\n\nconst LOCALHOST = window.location.hostname == 'localhost' ? 'localhost' : '192.168.1.26';\nexport const PORT =\n\twindow.location.port == '5000' ? '8091' : window.location.port || FeaturesController.multiplayerPort();\nexport const API_ROOT_URL = IS_PROD ? '' : `http://${LOCALHOST}:${PORT}`;\nexport const MARKETPLACE_ROOT = IS_PROD ? `https://market.polygonjs.com/` : `http://${LOCALHOST}:3000/`;\n\nexport enum SaveWarningResponse {\n\tSKIP = 'skip',\n\tSAVE_AGAIN = 'save again',\n}\nexport enum FetchErrorMessage {\n\tDOWNLOAD_ASSETS = 'download asset',\n\tINSTALL_LIB = 'install library',\n\tLOAD_ASSETS = 'load assets',\n\tLOAD_SCENE_NAMES = 'load scene names',\n\tSHARE_SCENE = 'share scene',\n\tSHARE_ZIP = 'share zip',\n}\n\nexport function errorString(prefix: FetchErrorMessage) {\n\treturn `failed to ${prefix}, are you sure the app is still running?`;\n}\n\nexport function displayError(prefix: FetchErrorMessage) {\n\tStoreController.editor.status.setError(errorString(prefix));\n}\n","export const FIGMA_PLUGIN_ID = '1245442724251687819';\nexport const FIGMA_URL = 'https://www.figma.com';\n","export enum FigmaPluginSceneOrigin {\n\tLOCAL = 'local',\n\tWEB = 'web',\n\tMARKET = 'market',\n}\n\nexport interface FigmaNodeData {\n\torigin: FigmaPluginSceneOrigin;\n}\nexport interface FigmaNodeDataWeb extends FigmaNodeData {\n\torigin: FigmaPluginSceneOrigin.WEB;\n\tsceneName: string;\n\tusername: string;\n}\nexport interface FigmaNodeDataLocal extends FigmaNodeData {\n\torigin: FigmaPluginSceneOrigin.LOCAL;\n\tsceneName: string;\n}\nexport interface FigmaNodeDataMarket extends FigmaNodeData {\n\torigin: FigmaPluginSceneOrigin.MARKET;\n\tsceneName: string;\n\tsceneUuid: string;\n\tversion: number;\n}\n\nexport interface FigmaSceneAndEditorData {\n\tsceneData: string;\n\tsceneName: string;\n\tlayoutData: string;\n\tversions: {\n\t\tpolygonjs: string;\n\t\teditor: string;\n\t};\n}\nexport interface WebUserData {\n\tusername: string;\n\ttoken: string;\n}\ninterface Vector2Like {\n\tx: number;\n\ty: number;\n}\nexport interface FigmaPluginDocumentDimensions {\n\tpos: Vector2Like;\n\tsize: Vector2Like;\n}\nexport interface FigmaPluginUserConfig {\n\twebUserData?: WebUserData;\n\tdocumentDimensions?: FigmaPluginDocumentDimensions;\n}\n\nexport enum FigmaMessageType {\n\tOPEN_DASHBOARD = 'polygonjs-editor-open-dashboard',\n\tUPDATE_DIMENSIONS_REQUEST = 'polygonjs-editor-update-dimensions-request',\n\tREAD_USER_CONFIG_REQUEST = 'polygonjs-editor-read-user-config-request',\n\tREAD_USER_CONFIG_RESPONSE = 'polygonjs-editor-read-user-config-response',\n\tSAVE_USER_CONFIG_REQUEST = 'polygonjs-editor-save-user-config-request',\n\tREQUEST_LOCAL_SCENE = 'polygonjs-editor-request-local-scene',\n\tREQUEST_WEB_SCENE = 'polygonjs-editor-request-web-scene',\n\tREQUEST_MARKET_SCENE = 'polygonjs-editor-request-market-scene',\n\tREQUEST_MARKET_SCENE_DATA = 'polygonjs-editor-request-market-scene-data',\n\tEDITOR_LOADED = 'polygonjs-editor-loaded',\n\tSCENE_AND_EDITOR_DATA = 'polygonjs-editor-scene-and-editor-data',\n\tSTART_LISTENING_TO_MESSAGE = 'polygonjs-editor-start-listening-to-messages',\n\tQUIT = 'quit',\n\tIMAGE_CAPTURED = 'polygonjs-editor-image-captured',\n}\nexport interface FigmaMessage {\n\ttype: FigmaMessageType;\n}\nexport interface FigmaMessageUpdateDimensionsRequest extends FigmaMessage {\n\ttype: FigmaMessageType.UPDATE_DIMENSIONS_REQUEST;\n\tdimensions: FigmaPluginDocumentDimensions;\n}\nexport interface FigmaMessageReadUserConfigRequest extends FigmaMessage {\n\ttype: FigmaMessageType.READ_USER_CONFIG_REQUEST;\n}\nexport interface FigmaMessageReadUserConfigResponse extends FigmaMessage {\n\ttype: FigmaMessageType.READ_USER_CONFIG_RESPONSE;\n\tconfig?: FigmaPluginUserConfig;\n}\n\nexport interface FigmaMessageSaveUserConfigRequest extends FigmaMessage {\n\ttype: FigmaMessageType.SAVE_USER_CONFIG_REQUEST;\n\tconfig?: FigmaPluginUserConfig;\n}\nexport interface FigmaMessageRequestLocalScene extends FigmaMessage {\n\ttype: FigmaMessageType.REQUEST_LOCAL_SCENE;\n\tsceneName: string;\n}\nexport interface FigmaMessageRequestWebScene extends FigmaMessage {\n\ttype: FigmaMessageType.REQUEST_WEB_SCENE;\n\tsceneName: string;\n\tusername: string;\n}\nexport interface FigmaMessageRequestMarketScene extends FigmaMessage {\n\ttype: FigmaMessageType.REQUEST_MARKET_SCENE;\n\tsceneName: string;\n\tsceneUuid: string;\n\tcode: string;\n\tcodeEditor: string;\n\tengineVersion: string;\n\teditorVersion: string;\n\tversion: number;\n}\nexport interface FigmaMessageRequestMarketSceneData extends FigmaMessage {\n\ttype: FigmaMessageType.REQUEST_MARKET_SCENE_DATA;\n\tsceneName: string;\n\tsceneUuid: string;\n\tversion: number;\n}\nexport interface FigmaMessageSceneAndEditorData extends FigmaMessage {\n\ttype: FigmaMessageType.SCENE_AND_EDITOR_DATA;\n\tfigmaNodeData?: FigmaSceneAndEditorData;\n}\nexport interface FigmaMessageImageCaptured extends FigmaMessage {\n\ttype: FigmaMessageType.IMAGE_CAPTURED;\n\tdatauri: string;\n\t// pluginData: FigmaPluginData;\n}\n","// import {versions} from '../../editor/versions';\nimport {FeaturesController} from '../../editor/core/FeaturesController';\nimport {CoreFileUtils} from '../../editor/core/FileUtils';\nimport {Editor} from '../../editor/Editor';\nimport {EditorLayoutData, SceneData} from '../../editor/types';\nimport {FIGMA_PLUGIN_ID, FIGMA_URL} from './FigmaPluginConstants';\nimport {\n\tFigmaMessageType,\n\tFigmaMessage,\n\tFigmaMessageSceneAndEditorData,\n\tFigmaMessageImageCaptured,\n\tFigmaMessageUpdateDimensionsRequest,\n} from './FigmaPluginTypes';\nimport {ref, watch} from 'vue';\nimport {Vector2} from 'three';\nimport {SceneJsonExporterData} from '../../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\n\ninterface SceneDataAndEditor {\n\tsceneData: SceneData;\n\tlayoutData: EditorLayoutData;\n}\ntype OnSceneDataResolve = (value: SceneDataAndEditor | undefined) => void;\n\nclass FigmaPluginControllerClass {\n\tprivate static _instance: FigmaPluginControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new FigmaPluginControllerClass());\n\t}\n\tpublic readonly documentDimensions = ref({\n\t\tpos: new Vector2(0, 0),\n\t\tsize: new Vector2(window.innerWidth, window.innerHeight),\n\t});\n\tprivate constructor() {\n\t\tthis._listenToMessages();\n\n\t\twatch(\n\t\t\tthis.documentDimensions,\n\t\t\t() => {\n\t\t\t\tthis.sendMessageDimensionsUpdated();\n\t\t\t},\n\t\t\t{deep: true}\n\t\t);\n\t}\n\tactive() {\n\t\treturn FeaturesController.inFigmaPlugin();\n\t}\n\tmocked() {\n\t\treturn FeaturesController.mockFigmaPlugin();\n\t}\n\tprivate _postMessage(message: FigmaMessage) {\n\t\tparent.postMessage({pluginMessage: message, pluginId: FIGMA_PLUGIN_ID}, FIGMA_URL);\n\t}\n\tprivate _listenToMessages() {\n\t\twindow.addEventListener('message', (event) => {\n\t\t\tconst {pluginMessage} = event.data;\n\t\t\tif (!pluginMessage) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswitch (pluginMessage.type as FigmaMessageType) {\n\t\t\t\tcase FigmaMessageType.SCENE_AND_EDITOR_DATA: {\n\t\t\t\t\treturn this.onSceneData(pluginMessage as FigmaMessageSceneAndEditorData);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tprivate _onSceneDataReceivedResolve: OnSceneDataResolve | undefined;\n\tasync loadSceneData(sceneName: string | null): Promise<SceneDataAndEditor | undefined> {\n\t\tif (this.mocked()) {\n\t\t\treturn;\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\tthis._onSceneDataReceivedResolve = resolve;\n\t\t\tthis.sendMessageLoaded();\n\t\t});\n\t}\n\tsendMessageOpenDashboard() {\n\t\tconst message: FigmaMessage = {type: FigmaMessageType.OPEN_DASHBOARD};\n\t\tthis._postMessage(message);\n\t}\n\tsendMessageLoaded() {\n\t\tif (!FeaturesController.inFigmaPlugin()) {\n\t\t\treturn;\n\t\t}\n\t\tconst _sendMessageLoaded = () => {\n\t\t\tconst message: FigmaMessage = {type: FigmaMessageType.EDITOR_LOADED};\n\t\t\tthis._postMessage(message);\n\t\t};\n\t\tif (this.mocked()) {\n\t\t\ttry {\n\t\t\t\t_sendMessageLoaded();\n\t\t\t} catch (err) {}\n\t\t} else {\n\t\t\t_sendMessageLoaded();\n\t\t}\n\t}\n\tsendMessageDimensionsUpdated() {\n\t\tconst {pos, size} = this.documentDimensions.value;\n\t\tconst message: FigmaMessageUpdateDimensionsRequest = {\n\t\t\ttype: FigmaMessageType.UPDATE_DIMENSIONS_REQUEST,\n\t\t\tdimensions: {\n\t\t\t\tpos: {x: pos.x, y: pos.y},\n\t\t\t\tsize: {x: size.x, y: size.y},\n\t\t\t},\n\t\t};\n\t\tthis._postMessage(message);\n\t}\n\tsendMessageQuit() {\n\t\tif (!FeaturesController.inFigmaPlugin()) {\n\t\t\treturn;\n\t\t}\n\t\tconst message: FigmaMessage = {type: FigmaMessageType.QUIT};\n\t\tthis._postMessage(message);\n\t}\n\tasync sendMessageImageCaptured(file: File) {\n\t\tif (!FeaturesController.inFigmaPlugin()) {\n\t\t\treturn;\n\t\t}\n\t\tconst datauri = await CoreFileUtils.blobToDatauri(file);\n\n\t\tawait Editor.instance().saveWithCallback(async (scene, sceneData, layoutData) => {\n\t\t\tconst message: FigmaMessageImageCaptured = {\n\t\t\t\ttype: FigmaMessageType.IMAGE_CAPTURED,\n\t\t\t\tdatauri,\n\t\t\t\t// figmaNodeData: {\n\t\t\t\t// \t// clone seems to be required otherwise postMessage fails\n\t\t\t\t// \tsceneData: JSON.parse(JSON.stringify(sceneData)),\n\t\t\t\t// \tsceneName: scene.name() || 'unnamed scene',\n\t\t\t\t// \tlayoutData: JSON.parse(JSON.stringify(layoutData)),\n\t\t\t\t// \tversions: versions(),\n\t\t\t\t// },\n\t\t\t};\n\t\t\tthis._postMessage(message);\n\t\t});\n\t}\n\tonSceneData(msg: FigmaMessageSceneAndEditorData) {\n\t\tif (this._onSceneDataReceivedResolve) {\n\t\t\tconst _parseSceneData = (): SceneJsonExporterData | undefined => {\n\t\t\t\tconst sceneData = msg.figmaNodeData?.sceneData;\n\t\t\t\ttry {\n\t\t\t\t\tif (sceneData) {\n\t\t\t\t\t\treturn JSON.parse(sceneData);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {}\n\t\t\t};\n\t\t\tconst _getSceneName = (): string => {\n\t\t\t\treturn msg.figmaNodeData?.sceneName || 'unnamed scene';\n\t\t\t};\n\t\t\tconst _parseLayoutData = (): EditorLayoutData | undefined => {\n\t\t\t\tconst layoutData = msg.figmaNodeData?.layoutData;\n\t\t\t\ttry {\n\t\t\t\t\tif (layoutData) {\n\t\t\t\t\t\treturn JSON.parse(layoutData);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {}\n\t\t\t};\n\n\t\t\tconst sceneJson = _parseSceneData();\n\t\t\tconst sceneData: SceneData | undefined = sceneJson\n\t\t\t\t? {\n\t\t\t\t\t\tjson: sceneJson,\n\t\t\t\t\t\tname: _getSceneName(),\n\t\t\t\t  }\n\t\t\t\t: undefined;\n\t\t\tconst layoutData = _parseLayoutData();\n\t\t\tconst data = sceneData && layoutData ? {sceneData, layoutData} : undefined;\n\t\t\tthis._onSceneDataReceivedResolve(data);\n\t\t}\n\t}\n}\n\nexport const FigmaPluginController = FigmaPluginControllerClass.instance();\n","import {\n\tcreateRouter,\n\tcreateWebHistory,\n\tRouteRecordRaw,\n\tcreateRouterMatcher,\n\tRouteRecordName,\n\tRouteLocationNormalizedLoaded,\n\tRouteRecordNormalized,\n\tRouter,\n\t// useRoute\n} from 'vue-router';\n\nimport {AppConfig} from './config/AppConfig';\nimport {NodeContext} from '../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {SopType} from '../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {sanitizeUrl} from '../@polygonjs/polygonjs/src/core/UrlHelper';\nimport {DOCS_PAGES, DocsRoute, PageData} from './docs/pages/Pages';\nimport {StoreController} from './editor/store/controllers/StoreController';\nimport {\n\tRoute,\n\tEditorRoute,\n\tEDITOR_ROUTES,\n\t// ASSET_EMOJIS\n} from './npm_module/NpmModuleTypes';\nimport {MapUtils} from '../@polygonjs/polygonjs/src/core/MapUtils';\nimport {Poly} from '../@polygonjs/polygonjs/src/engine/Poly';\n// import {API_NAMES} from './docs/api/Common';\n\n// import Debug from './components/editor/Debug.vue';\n\n// type Lazy<T> = () => Promise<T>;\ntype RawRouteComponent = any; //RouteComponent | Lazy<RouteComponent>;\n//\n// editor routes\n//\nconst Dashboard = () => import('./dashboard/Dashboard.vue');\nconst SceneSettings = () => import('./dashboard/SceneSettings.vue');\nconst EditorSceneLoader = () => import('./editor/components/editor/EditorSceneLoader.vue');\nconst EditorExampleLoader = () => import('./editor/components/editor/EditorExampleLoader.vue');\nconst DialogAbout = () => import('./editor/components/widgets/dialogs/About.vue');\nconst DialogPreferences = () => import('./editor/components/widgets/dialogs/preferences/Preferences.vue');\nconst DialogExport = () => import('./editor/components/widgets/dialogs/export/ExportPanel.vue');\nconst WindowsLibrariesManager = () => import('./editor/components/editor/widgets/WindowsLibrariesManager.vue');\nconst MarketplacePolyNodes = () => import('./editor/components/widgets/dialogs/marketplace/MarketplacePolyNodes.vue');\nconst PanelShare = () => import('./editor/components/widgets/dialogs/share/PanelShare.vue');\nconst PanelMultiPlayer = () => import('./editor/components/widgets/dialogs/multiPlayer/PanelMultiPlayer.vue');\nconst PanelAssetsList = () => import('./editor/components/editor/widgets/PanelAssetsList.vue');\nconst PanelApiLogin = () => import('./editor/components/widgets/dialogs/ApiLogin.vue');\nconst PanelSpareParamsEditor = () => import('./editor/components/editor/widgets/PanelSpareParamsEditor.vue');\nconst PolyNodeCreateForm = () => import('./editor/components/widgets/dialogs/polyNode/PolyNodeCreateForm.vue');\nconst PolyNodeUpdateForm = () => import('./editor/components/widgets/dialogs/polyNode/PolyNodeUpdateForm.vue');\nconst PanelFileSelector = () => import('./editor/components/editor/widgets/PanelFileSelector.vue');\nconst PanelNodeSelector = () => import('./editor/components/editor/widgets/PanelNodeSelector.vue');\nconst PanelObjectMask = () => import('./editor/components/editor/widgets/PanelObjectMask.vue');\n// const PanelViewerHTML = () => import('./editor/components/widgets/dialogs/viewerHTML/ViewerHTML.vue');\nconst AnimationModal = () => import('./editor/components/panels/animation/AnimationModal.vue');\n// const TestSuiteRunner = () => import('./editor/components/tests/TestSuiteRunner.vue');\n\n// const DialogScenesSelector = () => import('./editor/components/editor/widgets/PanelSceneSelector.vue');\n//\n// docs\n//\nconst Docs = () => import('./docs/Docs.vue');\nconst DocsPage = () => import('./docs/pages/Page.vue');\nconst DocsRootPage = () => import('./docs/pages/RootPage.vue');\n// const DocsHome = () => import('./docs/DocsHome.vue');\nconst DocsNodes = () => import('./docs/nodes/Nodes.vue');\nconst DocsNodeContext = () => import('./docs/nodes/NodeContext.vue');\nconst DocsNode = () => import('./docs/nodes/Node.vue');\nconst DocsExpressions = () => import('./docs/expressions/Expressions.vue');\nconst DocsExpression = () => import('./docs/expressions/Expression.vue');\nconst DocsExamples = () => import('./docs/examples/Examples.vue');\n// const DocsApi = () => import('./docs/api/Api.vue');\n// const DocsApi = () => import('./docs/api/Api.vue');\nconst DocsHelp = () => import('./docs/help/Help.vue');\nconst NotFound = () => import('./docs/pages/NotFound.vue');\nconst SearchExport = () => import('./docs/search/SearchExport.vue');\n\nconst PATH_SEPARATOR = ':';\nexport const nodePathToUrl = (path: string) => path.replace(/\\//g, PATH_SEPARATOR);\nexport const nodeUrlToPath = (url: string) => url.replace(/:/g, '/');\nexport const paramFromUrl = (url: string) => {\n\tconst path = nodeUrlToPath(url);\n\tconst elements = path.split('/');\n\tconst paramName = elements.pop();\n\tif (!paramName) {\n\t\treturn;\n\t}\n\tconst nodePath = elements.join('/');\n\treturn StoreController.scene.node(nodePath)?.params.get(paramName);\n};\n\ninterface DocPageRouteProps {\n\tpageName: DocsRoute;\n\t// mdxPath?: string;\n}\ninterface DocPageRoute {\n\tname: string;\n\tpath: string;\n\tcomponent: RawRouteComponent;\n\tprops: DocPageRouteProps | Record<string, any>;\n\t// children?: DocPageRoute[];\n}\nfunction docPageToRoute(docPage: PageData, level: number): DocPageRoute {\n\t// const routeElements = docPage.route.split('/');\n\t// const lastRouteElement = routeElements[routeElements.length - 1];\n\treturn {\n\t\tname: docPage.route,\n\t\tpath: docPage.route,\n\t\tcomponent: docPage.component || (DocsPage as RawRouteComponent),\n\t\tprops: docPage.props || {\n\t\t\tpageName: docPage.route,\n\t\t\t// mdxPath: docPage.mdxPath,\n\t\t},\n\t};\n}\n\ntype PageCallback = (pageData: PageData) => void;\ntype RouteCallback = (route: RouteRecordRaw) => void;\nfunction _createDocPageRoutes() {\n\tconst list: RouteRecordRaw[] = [];\n\n\tfunction _traverseDocPage(pageData: PageData, callback: PageCallback) {\n\t\tcallback(pageData);\n\t\tif (pageData.children) {\n\t\t\tfor (let child of pageData.children) {\n\t\t\t\t_traverseDocPage(child, callback);\n\t\t\t}\n\t\t}\n\t}\n\tfor (let docPage of DOCS_PAGES) {\n\t\t_traverseDocPage(docPage, (pageData) => {\n\t\t\tlist.push(docPageToRoute(pageData, 0));\n\t\t});\n\t}\n\treturn list;\n}\nexport const DOC_PAGE_ROUTES = _createDocPageRoutes();\nfunction _traverseRoute(route: RouteRecordRaw, callback: RouteCallback, _recursive?: boolean) {\n\tcallback(route);\n\n\tif (route.children) {\n\t\tfor (let child of route.children) {\n\t\t\t_traverseRoute(child, callback);\n\t\t}\n\t}\n}\nfunction _tokenizeRoutes(routes: RouteRecordRaw[]) {\n\tfor (let route of routes) {\n\t\t_traverseRoute(\n\t\t\troute,\n\t\t\t(route) => {\n\t\t\t\tif (!route.path.startsWith('/')) {\n\t\t\t\t\troute.path = `/${route.path}`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\t}\n\treturn routes;\n}\n\ninterface EditorRouteWithCatchAll {\n\tcomponent: RawRouteComponent;\n\tprops?: boolean;\n}\n\n// double check if some roads have the same name\nfunction _checkDuplicateNames(router: Router) {\n\tconst routesList = router.getRoutes();\n\tconst routeByName: Map<RouteRecordName, RouteRecordNormalized[]> = new Map();\n\tfor (const route of routesList) {\n\t\tif (route.name) {\n\t\t\tMapUtils.pushOnArrayAtEntry(routeByName, route.name, route);\n\t\t}\n\t}\n\tlet duplicatesCount = 0;\n\trouteByName.forEach((routesForName, routeName) => {\n\t\tif (routesForName.length > 1) {\n\t\t\tconsole.log(routeName.toString(), routesForName.length);\n\t\t\tconsole.log(`%c${routeName.toString()}:${routesForName.length}`, 'background-color: red; color: white;');\n\t\t\tduplicatesCount++;\n\t\t} else {\n\t\t\t// console.log(routeName, routesForName.length);\n\t\t}\n\t});\n\tif (process.env.NODE_ENV == 'development' && Poly.env() != 'test' && duplicatesCount > 0) {\n\t\tconsole.warn(`${duplicatesCount} duplicate routes found`);\n\t}\n}\n\n//\n//\n//\n//\nconst remote = () => AppConfig.remote();\n// const _routesForEditorAtRoot = () => AppConfig.editorAtRoot();\n// const _docsOrEditorAtRoot = () => _docsAtRoot() || _routesForEditorAtRoot();\nexport const nodesPath = () => docsRoute(DocsRoute.NODES);\nexport const integrationsPath = () => docsRoute(DocsRoute.INTEGRATIONS_INDEX);\nexport const installPath = () => docsRoute(DocsRoute.INSTALL);\nexport const docsNode = (context: NodeContext, type: string) =>\n\tdocsRoute(DocsRoute.NODE).replace(':context', context).replace(':type', type);\n// export const editorRoute = (route: EditorRoute) => {\n// \t// when using this route from an example scene, opened from the docs,\n// \t// this currently sends me to /export\n// \t// instead of /examples/:id/export\n// \t// _docsOrEditorAtRoot() ? `/${route}` : `${currentEditorRoute()}/${route}`;\n// \treturn sanitizeUrl(`${currentEditorRoute()}/${route}`);\n// };\n\nexport const docsRoute = (route: DocsRoute) => `${Route.DOCS}/${route}`;\nexport const withoutDocRoute = (route: DocsRoute) => route.replace('/docs', '');\n// export const isTopDocRoute = (route: string) => {\n// \tif (_docsOrEditorAtRoot()) {\n// \t\treturn route == '/' || route == '';\n// \t} else {\n// \t\treturn route == Route.DOCS;\n// \t}\n// };\nconst pathToUrl = (path: string) => {\n\t// const elements: string[] = [window.location.origin, AppConfig.routeBase() || '', path];\n\tconst elements: string[] = [window.location.origin, path];\n\tconst url = elements.join('/');\n\t// let's sanitize this 2x just to be sure\n\tconst sanitizedUrl = sanitizeUrl(sanitizeUrl(url));\n\treturn sanitizedUrl;\n};\nexport const rootPath = () => Route.ROOT;\nexport const docsPath = () => Route.DOCS;\nexport const docsNodeContext = (context: NodeContext) => docsRoute(DocsRoute.NODE_CONTEXT).replace(':context', context);\n//\n//\n//\n//\n\nexport const SEARCH_EXPORT_ROUTE_NAME = 'searchexport';\nconst SEARCH_EXPORT_ROUTE = {\n\tpath: SEARCH_EXPORT_ROUTE_NAME,\n\tname: SEARCH_EXPORT_ROUTE_NAME,\n\tcomponent: SearchExport as RawRouteComponent,\n};\nconst ADD_SEARCH_EXPORT_ROUTE: boolean = process.env.NODE_ENV == 'development' && Poly.env() != 'test';\nexport const NOT_FOUND_ROUTE_NAME = 'not_found';\nconst NOT_FOUND_ROUTE = {\n\tpath: ':catchAll(.*)*',\n\tname: NOT_FOUND_ROUTE_NAME,\n\tcomponent: NotFound as RawRouteComponent,\n};\nconst PARTICLES_ROUTE = {\n\tpath: 'particles',\n\tredirect: docsNode(NodeContext.SOP, SopType.PARTICLES_SYSTEM_GPU),\n\t// component: DocsNode as RawRouteComponent,\n\t// props: {\n\t// \tcontext: NodeContext.SOP,\n\t// \ttype: SopType.PARTICLES_SYSTEM_GPU,\n\t// },\n};\nconst componentByEditorRoute: Record<EditorRoute, RawRouteComponent> = {\n\t[EditorRoute.ABOUT]: DialogAbout as RawRouteComponent,\n\t[EditorRoute.LOGIN]: PanelApiLogin as RawRouteComponent,\n\t[EditorRoute.ASSETS]: PanelAssetsList as RawRouteComponent,\n\t[EditorRoute.EXPORT]: DialogExport as RawRouteComponent,\n\t[EditorRoute.LIBRARIES]: WindowsLibrariesManager as RawRouteComponent,\n\t[EditorRoute.POLY_NODE_CREATE]: PolyNodeCreateForm as RawRouteComponent,\n\t[EditorRoute.POLY_NODE_UPDATE]: PolyNodeUpdateForm as RawRouteComponent,\n\t[EditorRoute.PREFERENCES]: DialogPreferences as RawRouteComponent,\n\t[EditorRoute.MARKET]: MarketplacePolyNodes as RawRouteComponent,\n\t[EditorRoute.SELECT_FILE]: PanelFileSelector as RawRouteComponent,\n\t[EditorRoute.SELECT_NODE]: PanelNodeSelector as RawRouteComponent,\n\t[EditorRoute.SELECT_OBJECT_MASK]: PanelObjectMask as RawRouteComponent,\n\t[EditorRoute.SHARE]: PanelShare as RawRouteComponent,\n\t[EditorRoute.SPARE_PARAMS_EDIT]: PanelSpareParamsEditor as RawRouteComponent,\n\t[EditorRoute.MULTIPLAYER]: PanelMultiPlayer as RawRouteComponent,\n\t// [EditorRoute.VIEWER_HTML]: PanelViewerHTML as RawRouteComponent,\n\t[EditorRoute.KEYFRAMES]: AnimationModal as RawRouteComponent,\n};\nfunction _createEditorRoute(route: EditorRoute) {\n\treturn {\n\t\tname: route,\n\t\tpath: route,\n\t\tcomponent: componentByEditorRoute[route] as RawRouteComponent,\n\t\tprops: true,\n\t};\n}\nexport const EDITOR_CHILD_ROUTES: RouteRecordRaw[] = EDITOR_ROUTES.map(_createEditorRoute);\nlet currentEditorRoute: RouteRecordName | undefined;\nexport function addEditorRoutes(currentRoute: RouteLocationNormalizedLoaded) {\n\tremoveEditorRoutes();\n\tcurrentEditorRoute = currentRoute.name || undefined;\n\tif (!currentEditorRoute) {\n\t\treturn;\n\t}\n\tfor (const childRoute of EDITOR_CHILD_ROUTES) {\n\t\trouter.addRoute(currentEditorRoute, childRoute);\n\t}\n\t_checkDuplicateNames(router);\n\t// console.log('replace', currentRoute.fullPath, decodeURI(currentRoute.fullPath));\n\t// here I need to add decodeURI so that the url is caught on page reload\n\tconst newRoute = decodeURI(currentRoute.fullPath);\n\trouter.replace(newRoute);\n}\nexport function removeEditorRoutes() {\n\tif (!currentEditorRoute) {\n\t\treturn;\n\t}\n\tcurrentEditorRoute = undefined;\n\tfor (const childRoute of EDITOR_CHILD_ROUTES) {\n\t\tif (childRoute.name) {\n\t\t\trouter.removeRoute(childRoute.name);\n\t\t}\n\t}\n\t_checkDuplicateNames(router);\n}\ntype RemoveRouteCallback = () => void;\nlet _removeMultiEmojiAssetsRoute: RemoveRouteCallback | undefined;\nexport function updateEditorAssetsRoute(assetsCount: number) {\n\tif (!currentEditorRoute) {\n\t\treturn;\n\t}\n\t// const assetsRoute = EDITOR_CHILD_ROUTES.find((route) => {\n\t// \tconsole.log(route.path, route.name, EditorRoute.ASSETS);\n\t// \treturn route.name == EditorRoute.ASSETS;\n\t// \t// return route.path.startsWith(EditorRoute.ASSETS);\n\t// });\n\t// console.log(`assetsRoute:'${assetsRoute}'`, assetsRoute);\n\t// if (!assetsRoute) {\n\t// \tconsole.warn('no asset route');\n\t// \treturn;\n\t// }\n\t// if (!assetsRoute.name) {\n\t// \tconsole.warn('asset route has no name');\n\t// \treturn;\n\t// }\n\t// router.removeRoute(assetsRoute.name);\n\tif (_removeMultiEmojiAssetsRoute) {\n\t\t_removeMultiEmojiAssetsRoute();\n\t}\n\t// const newRoute = _createEditorRoute(EditorRoute.ASSETS);\n\tconst additionalEmojis = ''; // ASSET_EMOJIS.slice(0, assetsCount).join('');\n\tconst newRoutePath = `${EditorRoute.ASSETS}${additionalEmojis}`;\n\tconst newRoute = {\n\t\tname: newRoutePath,\n\t\tpath: newRoutePath,\n\t\tcomponent: componentByEditorRoute[EditorRoute.ASSETS] as RawRouteComponent,\n\t};\n\t_removeMultiEmojiAssetsRoute = router.addRoute(currentEditorRoute, newRoute);\n\treturn newRoute;\n}\nexport const ROUTES_WITH_NO_MODAL: string[] = [];\n\nfunction _createRouter() {\n\tconst routeBase = AppConfig.routeBase();\n\n\t// const docPageRoutes = DOCS_PAGES.map((docPage) => {\n\t// \tconst routeData = docPageToRoute(docPage, 0);\n\t// \tif (docPage.children) {\n\t// \t\trouteData.children = docPage.children.map((childDocPage) => docPageToRoute(childDocPage, 1));\n\t// \t}\n\t// \treturn routeData;\n\t// });\n\n\tfunction _createRootRoute(): RouteRecordRaw {\n\t\t// if (remote() == true) {\n\t\t// \treturn {\n\t\t// \t\tname: Route.ROOT,\n\t\t// \t\tpath: Route.ROOT,\n\t\t// \t\tcomponent: Dashboard as RawRouteComponent,\n\t\t// \t\tbeforeEnter: (to, from) => {\n\t\t// \t\t\twindow.location.href = window.location.origin;\n\t\t// \t\t\t// reject the navigation\n\t\t// \t\t\t// return false\n\t\t// \t\t\treturn false;\n\t\t// \t\t},\n\t\t// \t};\n\t\t// } else {\n\t\tROUTES_WITH_NO_MODAL.push(Route.ROOT);\n\t\treturn {\n\t\t\tname: Route.ROOT,\n\t\t\tpath: Route.ROOT,\n\t\t\tcomponent: Dashboard as RawRouteComponent,\n\t\t\tbeforeEnter: (to, from) => {\n\t\t\t\tif (remote() == true) {\n\t\t\t\t\twindow.location.href = window.location.origin;\n\t\t\t\t\t// reject the navigation\n\t\t\t\t\t// return false\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\t// }\n\t}\n\tfunction _editorRouteWithCatchAll(route: Route, options: EditorRouteWithCatchAll): RouteRecordRaw[] {\n\t\tROUTES_WITH_NO_MODAL.push(route);\n\t\tconst defaultRoute = {\n\t\t\tname: route,\n\t\t\tpath: route,\n\t\t\tcomponent: options.component,\n\t\t\t// children: EDITOR_CHILD_ROUTES,\n\t\t\tprops: options?.props || false,\n\t\t};\n\t\tconst routeWithCatchall = {\n\t\t\tname: `${route}/:catchAll(.*)*`,\n\t\t\tpath: `${route}/:catchAll(.*)*`,\n\t\t\tcomponent: EditorSceneLoader,\n\t\t\t// children: EDITOR_CHILD_ROUTES,\n\t\t\tprops: options?.props || false,\n\t\t};\n\t\treturn [defaultRoute, routeWithCatchall];\n\t}\n\tfunction _remoteRoutes(): RouteRecordRaw[] {\n\t\tif (remote() == false) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [\n\t\t\t..._editorRouteWithCatchAll(Route.DEMO, {component: EditorSceneLoader}),\n\t\t\t..._editorRouteWithCatchAll(Route.PROFILE_SCENE_EDIT, {component: EditorSceneLoader}),\n\t\t];\n\t}\n\n\tconst docChildRoutes: RouteRecordRaw[] = [\n\t\t...DOC_PAGE_ROUTES,\n\t\t{\n\t\t\tpath: DocsRoute.INDEX,\n\t\t\tcomponent: DocsRootPage as RawRouteComponent,\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.TUTORIAL_PAGE,\n\t\t\tcomponent: DocsPage as RawRouteComponent,\n\t\t\tprops: {\n\t\t\t\tpageName: DocsRoute.TUTORIAL_PAGE,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.NODES,\n\t\t\tcomponent: DocsNodes as RawRouteComponent,\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.NODE_CONTEXT,\n\t\t\tcomponent: DocsNodeContext as RawRouteComponent,\n\t\t\tprops: true,\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.NODE,\n\t\t\tcomponent: DocsNode as RawRouteComponent,\n\t\t\tprops: true,\n\t\t},\n\t\tPARTICLES_ROUTE,\n\t\t{\n\t\t\tpath: DocsRoute.EXPRESSIONS,\n\t\t\tcomponent: DocsExpressions as RawRouteComponent,\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.EXPRESSION,\n\t\t\tcomponent: DocsExpression as RawRouteComponent,\n\t\t\tprops: true,\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.EXAMPLES,\n\t\t\tcomponent: DocsExamples as RawRouteComponent,\n\t\t},\n\t\t{\n\t\t\tpath: DocsRoute.EXAMPLES_CATEGORY,\n\t\t\tcomponent: DocsExamples as RawRouteComponent,\n\t\t\tprops: true,\n\t\t},\n\t\t// {\n\t\t// \tpath: DocsRoute.API_INDEX,\n\t\t// \tcomponent: DocsApi as RawRouteComponent,\n\t\t// \tprops: {apiName: 'index'},\n\t\t// },\n\t\t// ...API_NAMES.map((apiName) => ({\n\t\t// \tpath: `api/${apiName}`,\n\t\t// \tcomponent: DocsApi as RawRouteComponent,\n\t\t// \tprops: {apiName},\n\t\t// })),\n\t\t// {\n\t\t// \tpath: DocsRoute.API_INDEX,\n\t\t// \tcomponent: DocsApi as RawRouteComponent,\n\t\t// },\n\t\t// {\n\t\t// \tpath: DocsRoute.API_PAGE,\n\t\t// \tcomponent: DocsApi as RawRouteComponent,\n\t\t// \tprops: true,\n\t\t// },\n\t\t{\n\t\t\tpath: DocsRoute.HELP,\n\t\t\tcomponent: DocsHelp as RawRouteComponent,\n\t\t},\n\t\t...(ADD_SEARCH_EXPORT_ROUTE ? [SEARCH_EXPORT_ROUTE] : []),\n\n\t\tNOT_FOUND_ROUTE,\n\t];\n\n\tfunction _createRoutes() {\n\t\tconst _routes: Readonly<RouteRecordRaw[]> = [\n\t\t\t_createRootRoute(),\n\t\t\t..._remoteRoutes(),\n\t\t\t..._editorRouteWithCatchAll(Route.SCENE_NEW, {component: EditorSceneLoader}),\n\t\t\t..._editorRouteWithCatchAll(Route.SCENE_EDIT, {component: EditorSceneLoader, props: true}),\n\t\t\t..._editorRouteWithCatchAll(Route.EXAMPLE, {component: EditorExampleLoader, props: true}),\n\t\t\t{\n\t\t\t\tpath: Route.SCENE_SETTINGS,\n\t\t\t\tcomponent: SceneSettings as RawRouteComponent,\n\t\t\t\tprops: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: Route.DOCS,\n\t\t\t\tcomponent: Docs as RawRouteComponent,\n\t\t\t\tchildren: docChildRoutes,\n\t\t\t},\n\n\t\t\t// {\n\t\t\t// \tpath: Route.TEST,\n\t\t\t// \tcomponent: TestSuiteRunner as RawRouteComponent,\n\t\t\t// },\n\t\t\t..._tokenizeRoutes([NOT_FOUND_ROUTE]),\n\t\t];\n\t\treturn _routes;\n\t}\n\t// function _routesForEditorAtRoot() {\n\t// \tconst _routes: Readonly<RouteRecordRaw[]> = [\n\t// \t\t{\n\t// \t\t\tpath: Route.ROOT,\n\t// \t\t\tcomponent: EditorSceneLoader as RawRouteComponent,\n\t// \t\t\tchildren: EDITOR_CHILD_ROUTES,\n\t// \t\t},\n\t// \t\t{\n\t// \t\t\tpath: Route.EXAMPLE,\n\t// \t\t\tcomponent: EditorExampleLoader as RawRouteComponent,\n\t// \t\t\tchildren: EDITOR_CHILD_ROUTES,\n\t// \t\t\tprops: true,\n\t// \t\t},\n\t// \t\t{\n\t// \t\t\tpath: Route.DOCS,\n\t// \t\t\tcomponent: Docs as RawRouteComponent,\n\t// \t\t\tchildren: docChildRoutes,\n\t// \t\t},\n\t// \t\t..._tokenizeRoutes([NOT_FOUND_ROUTE]),\n\t// \t];\n\t// \treturn _routes;\n\t// }\n\t// function _routesForDocsAtRoot() {\n\t// \tconst _routes: Readonly<RouteRecordRaw[]> = [\n\t// \t\t{\n\t// \t\t\tpath: '',\n\t// \t\t\tcomponent: Docs as RawRouteComponent,\n\t// \t\t\tchildren: _tokenizeRoutes(docChildRoutes),\n\t// \t\t},\n\t// \t\t{\n\t// \t\t\tpath: Route.EXAMPLE,\n\t// \t\t\tcomponent: EditorExampleLoader as RawRouteComponent,\n\t// \t\t\tchildren: EDITOR_CHILD_ROUTES,\n\t// \t\t\tprops: true,\n\t// \t\t},\n\t// \t\t..._tokenizeRoutes([NOT_FOUND_ROUTE]),\n\t// \t];\n\t// \treturn _routes;\n\t// }\n\n\t// if (routeBase == null) {\n\t// \tconsole.error('no router base found');\n\t// }\n\tconst routes = _createRoutes();\n\t// const routes = AppConfig.docsAtRoot()\n\t// \t? _routesForDocsAtRoot()\n\t// \t: AppConfig.editorAtRoot()\n\t// \t? _routesForEditorAtRoot()\n\t// \t: _defaultRoutes();\n\n\t// const _router = createRouter({\n\t// \thistory: createWebHistory(routeBase),\n\t// \troutes,\n\t// });\n\tconst _router = createRouter({\n\t\thistory: createWebHistory(routeBase),\n\t\troutes,\n\t\tscrollBehavior(to, from, savedPosition) {\n\t\t\tif (savedPosition) {\n\t\t\t\treturn savedPosition;\n\t\t\t} else {\n\t\t\t\treturn {top: 0};\n\t\t\t}\n\t\t},\n\t});\n\tconst matcher = createRouterMatcher(routes, {});\n\t_router.beforeEach((to, from) => {\n\t\t// console.log({from, to});\n\t\t// remove sidebar when navigating from it\n\t\tStoreController.editor.docs.mobileNavigationDisplayed.value = false;\n\n\t\t// explicitly return false to cancel the navigation\n\t\t// return false\n\t});\n\n\t_checkDuplicateNames(_router);\n\treturn {router: _router, matcher};\n}\n\nexport const {router, matcher} = _createRouter();\n// (window as any).router = router;\n\n// export function currentEditorRoute(): string {\n// \t// if (AppConfig.editorAtRoot()) {\n// \t// \treturn Route.ROOT;\n// \t// }\n\n// \trouter.getRoutes();\n// \tconst currentRoute = router.currentRoute.value.path;\n// \t// new scene\n// \tif (currentRoute == Route.SCENE_NEW) {\n// \t\treturn currentRoute;\n// \t}\n// \tconst elements = currentRoute.split('/');\n// \t// scene\n// \tif (currentRoute.startsWith('/scenes/') && currentRoute.includes('/edit')) {\n// \t\tconst sceneName = elements[2];\n// \t\treturn editScenePath(sceneName);\n// \t}\n// \t// examples\n// \tif (currentRoute.startsWith('/examples/') && elements.length >= 3) {\n// \t\tconst exampleId = elements[2];\n// \t\treturn examplePath(exampleId);\n// \t}\n// \t// demo\n// \tif (currentRoute.startsWith('/demo') && elements.length >= 2) {\n// \t\treturn demoPath();\n// \t}\n// \treturn Route.SCENE_NEW;\n// }\nexport function closeModals() {\n\tif (!currentEditorRoute) {\n\t\treturn;\n\t}\n\tconst route = router.getRoutes().find((route) => route.name == currentEditorRoute);\n\tif (!route) {\n\t\treturn;\n\t}\n\trouter.push(route);\n}\n\nexport const docsExpression = (expressionName: string) =>\n\tdocsRoute(DocsRoute.EXPRESSION).replace(':expressionName', expressionName);\nexport const docsExamplesPath = () => docsRoute(DocsRoute.EXAMPLES);\nexport const docsExampleCategoryPath = (category: string) =>\n\tdocsRoute(DocsRoute.EXAMPLES_CATEGORY).replace(':category', category);\n// export const scenePath = (sceneName: string) => Route.SCENE.replace(':sceneName', sceneName);\nexport const demoPath = () => Route.DEMO;\nexport const examplesPath = () => docsRoute(DocsRoute.EXAMPLES);\nexport const examplePath = (exampleId: string) => Route.EXAMPLE.replace(':exampleId', exampleId);\nexport const exampleUrl = (exampleId: string) => pathToUrl(examplePath(exampleId));\nexport const editScenePath = (sceneName: string) => Route.SCENE_EDIT.replace(':sceneName', sceneName);\nexport const settingsScenePath = (sceneName: string) => Route.SCENE_SETTINGS.replace(':sceneName', sceneName);\nexport const newScenePath = () => Route.SCENE_NEW;\nexport const editSceneUrl = (sceneName: string) => pathToUrl(editScenePath(sceneName));\nexport const settingsSceneUrl = (sceneName: string) => pathToUrl(settingsScenePath(sceneName));\nexport const newSceneUrl = () => pathToUrl(newScenePath());\n","export default \"\\n\\n// https://stackoverflow.com/questions/23793698/how-to-implement-slerp-in-glsl-hlsl\\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t)\\n// {\\n// \\tfloat dotp = dot(normalize(p0), normalize(p1));\\n// \\tif ((dotp > 0.9999) || (dotp < -0.9999))\\n// \\t{\\n// \\t\\tif (t<=0.5)\\n// \\t\\t\\treturn p0;\\n// \\t\\treturn p1;\\n// \\t}\\n// \\tfloat theta = acos(dotp);\\n// \\tvec4 P = ((p0*sin((1.0-t)*theta) + p1*sin(t*theta)) / sin(theta));\\n// \\tP.w = 1.0;\\n// \\treturn P;\\n// }\\n\\n// https://devcry.heiho.net/html/2017/20170521-slerp.html\\n// float lerp(float a, float b, float t) {\\n// \\treturn (1.0 - t) * a + t * b;\\n// }\\n// vec4 quatSlerp(vec4 p0, vec4 p1, float t){\\n// \\tvec4 qb = p1;\\n\\n// \\t// cos(a) = dot product\\n// \\tfloat cos_a = p0.x * qb.x + p0.y * qb.y + p0.z * qb.z + p0.w * qb.w;\\n// \\tif (cos_a < 0.0f) {\\n// \\t\\tcos_a = -cos_a;\\n// \\t\\tqb = -qb;\\n// \\t}\\n\\n// \\t// close to zero, cos(a) ~= 1\\n// \\t// do linear interpolation\\n// \\tif (cos_a > 0.999) {\\n// \\t\\treturn vec4(\\n// \\t\\t\\tlerp(p0.x, qb.x, t),\\n// \\t\\t\\tlerp(p0.y, qb.y, t),\\n// \\t\\t\\tlerp(p0.z, qb.z, t),\\n// \\t\\t\\tlerp(p0.w, qb.w, t)\\n// \\t\\t);\\n// \\t}\\n\\n// \\tfloat alpha = acos(cos_a);\\n// \\treturn (p0 * sin(1.0 - t) + p1 * sin(t * alpha)) / sin(alpha);\\n// }\\n\\n// https://stackoverflow.com/questions/62943083/interpolate-between-two-quaternions-the-long-way\\nvec4 quatSlerp(vec4 q1, vec4 q2, float t){\\n\\tfloat angle = acos(dot(q1, q2));\\n\\tfloat denom = sin(angle);\\n\\t//check if denom is zero\\n\\treturn (q1*sin((1.0-t)*angle)+q2*sin(t*angle))/denom;\\n}\\n// TO CHECK:\\n// this page https://www.reddit.com/r/opengl/comments/704la7/glsl_quaternion_library/\\n// has a link to a potentially nice pdf:\\n// http://web.mit.edu/2.998/www/QuaternionReport1.pdf\\n\\n// https://github.com/mattatz/ShibuyaCrowd/blob/master/source/shaders/common/quaternion.glsl\\nvec4 quatMult(vec4 q1, vec4 q2)\\n{\\n\\treturn vec4(\\n\\tq1.w * q2.x + q1.x * q2.w + q1.z * q2.y - q1.y * q2.z,\\n\\tq1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x,\\n\\tq1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y,\\n\\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z\\n\\t);\\n}\\n// http://glmatrix.net/docs/quat.js.html#line97\\n//   let ax = a[0], ay = a[1], az = a[2], aw = a[3];\\n\\n//   let bx = b[0], by = b[1], bz = b[2], bw = b[3];\\n\\n//   out[0] = ax * bw + aw * bx + ay * bz - az * by;\\n\\n//   out[1] = ay * bw + aw * by + az * bx - ax * bz;\\n\\n//   out[2] = az * bw + aw * bz + ax * by - ay * bx;\\n\\n//   out[3] = aw * bw - ax * bx - ay * by - az * bz;\\n\\n//   return out\\n\\n\\n\\n// http://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/\\nmat4 rotationMatrix(vec3 axis, float angle)\\n{\\n\\taxis = normalize(axis);\\n\\tfloat s = sin(angle);\\n\\tfloat c = cos(angle);\\n\\tfloat oc = 1.0 - c;\\n\\n \\treturn mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s,  oc * axis.z * axis.x + axis.y * s, 0.0, oc * axis.x * axis.y + axis.z * s,  oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,  0.0, oc * axis.z * axis.x - axis.y * s,  oc * axis.y * axis.z + axis.x * s,  oc * axis.z * axis.z + c, 0.0, 0.0, 0.0, 0.0, 1.0);\\n}\\n\\n// https://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/\\nvec4 quatFromAxisAngle(vec3 axis, float angle)\\n{\\n\\tvec4 qr;\\n\\tfloat half_angle = (angle * 0.5); // * 3.14159 / 180.0;\\n\\tfloat sin_half_angle = sin(half_angle);\\n\\tqr.x = axis.x * sin_half_angle;\\n\\tqr.y = axis.y * sin_half_angle;\\n\\tqr.z = axis.z * sin_half_angle;\\n\\tqr.w = cos(half_angle);\\n\\treturn qr;\\n}\\nvec3 rotateWithAxisAngle(vec3 position, vec3 axis, float angle)\\n{\\n\\tvec4 q = quatFromAxisAngle(axis, angle);\\n\\tvec3 v = position.xyz;\\n\\treturn v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);\\n}\\n// vec3 applyQuaternionToVector( vec4 q, vec3 v ){\\n// \\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\\n// }\\nvec3 rotateWithQuat( vec3 v, vec4 q )\\n{\\n\\t// vec4 qv = multQuat( quat, vec4(vec, 0.0) );\\n\\t// return multQuat( qv, vec4(-quat.x, -quat.y, -quat.z, quat.w) ).xyz;\\n\\treturn v + 2.0 * cross( q.xyz, cross( q.xyz, v ) + q.w * v );\\n}\\n// https://github.com/glslify/glsl-look-at/blob/gh-pages/index.glsl\\n// mat3 rotation_matrix(vec3 origin, vec3 target, float roll) {\\n// \\tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\\n// \\tvec3 ww = normalize(target - origin);\\n// \\tvec3 uu = normalize(cross(ww, rr));\\n// \\tvec3 vv = normalize(cross(uu, ww));\\n\\n// \\treturn mat3(uu, vv, ww);\\n// }\\n// mat3 rotation_matrix(vec3 target, float roll) {\\n// \\tvec3 rr = vec3(sin(roll), cos(roll), 0.0);\\n// \\tvec3 ww = normalize(target);\\n// \\tvec3 uu = normalize(cross(ww, rr));\\n// \\tvec3 vv = normalize(cross(uu, ww));\\n\\n// \\treturn mat3(uu, vv, ww);\\n// }\\n\\nfloat vectorAngle(vec3 start, vec3 dest){\\n\\tstart = normalize(start);\\n\\tdest = normalize(dest);\\n\\n\\tfloat cosTheta = dot(start, dest);\\n\\tvec3 c1 = cross(start, dest);\\n\\t// We use the dot product of the cross with the Y axis.\\n\\t// This is a little arbitrary, but can still give a good sense of direction\\n\\tvec3 y_axis = vec3(0.0, 1.0, 0.0);\\n\\tfloat d1 = dot(c1, y_axis);\\n\\tfloat angle = acos(cosTheta) * sign(d1);\\n\\treturn angle;\\n}\\n\\n// http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/#i-need-an-equivalent-of-glulookat-how-do-i-orient-an-object-towards-a-point-\\nvec4 vectorAlign(vec3 start, vec3 dest){\\n\\tstart = normalize(start);\\n\\tdest = normalize(dest);\\n\\n\\tfloat cosTheta = dot(start, dest);\\n\\tvec3 axis;\\n\\n\\t// if (cosTheta < -1 + 0.001f){\\n\\t// \\t// special case when vectors in opposite directions:\\n\\t// \\t// there is no ideal rotation axis\\n\\t// \\t// So guess one; any will do as long as it's perpendicular to start\\n\\t// \\taxis = cross(vec3(0.0f, 0.0f, 1.0f), start);\\n\\t// \\tif (length2(axis) < 0.01 ) // bad luck, they were parallel, try again!\\n\\t// \\t\\taxis = cross(vec3(1.0f, 0.0f, 0.0f), start);\\n\\n\\t// \\taxis = normalize(axis);\\n\\t// \\treturn gtx::quaternion::angleAxis(glm::radians(180.0f), axis);\\n\\t// }\\n\\tif(cosTheta > (1.0 - 0.0001) || cosTheta < (-1.0 + 0.0001) ){\\n\\t\\taxis = normalize(cross(start, vec3(0.0, 1.0, 0.0)));\\n\\t\\tif (length(axis) < 0.001 ){ // bad luck, they were parallel, try again!\\n\\t\\t\\taxis = normalize(cross(start, vec3(1.0, 0.0, 0.0)));\\n\\t\\t}\\n\\t} else {\\n\\t\\taxis = normalize(cross(start, dest));\\n\\t}\\n\\n\\tfloat angle = acos(cosTheta);\\n\\n\\treturn quatFromAxisAngle(axis, angle);\\n}\\nvec4 vectorAlignWithUp(vec3 start, vec3 dest, vec3 up){\\n\\tvec4 rot1 = vectorAlign(start, dest);\\n\\tup = normalize(up);\\n\\n\\t// Recompute desiredUp so that it's perpendicular to the direction\\n\\t// You can skip that part if you really want to force desiredUp\\n\\t// vec3 right = normalize(cross(dest, up));\\n\\t// up = normalize(cross(right, dest));\\n\\n\\t// Because of the 1rst rotation, the up is probably completely screwed up.\\n\\t// Find the rotation between the up of the rotated object, and the desired up\\n\\tvec3 newUp = rotateWithQuat(vec3(0.0, 1.0, 0.0), rot1);//rot1 * vec3(0.0, 1.0, 0.0);\\n\\tvec4 rot2 = vectorAlign(up, newUp);\\n\\n\\t// return rot1;\\n\\treturn rot2;\\n\\t// return multQuat(rot1, rot2);\\n\\t// return rot2 * rot1;\\n\\n}\\n\\n// https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\\nfloat quatToAngle(vec4 q){\\n\\treturn 2.0 * acos(q.w);\\n}\\nvec3 quatToAxis(vec4 q){\\n\\treturn vec3(\\n\\t\\tq.x / sqrt(1.0-q.w*q.w),\\n\\t\\tq.y / sqrt(1.0-q.w*q.w),\\n\\t\\tq.z / sqrt(1.0-q.w*q.w)\\n\\t);\\n}\\n\\nvec4 align(vec3 dir, vec3 up){\\n\\tvec3 start_dir = vec3(0.0, 0.0, 1.0);\\n\\tvec3 start_up = vec3(0.0, 1.0, 0.0);\\n\\tvec4 rot1 = vectorAlign(start_dir, dir);\\n\\tup = normalize(up);\\n\\n\\t// Recompute desiredUp so that it's perpendicular to the direction\\n\\t// You can skip that part if you really want to force desiredUp\\n\\tvec3 right = normalize(cross(dir, up));\\n\\tif(length(right)<0.001){\\n\\t\\tright = vec3(1.0, 0.0, 0.0);\\n\\t}\\n\\tup = normalize(cross(right, dir));\\n\\n\\t// Because of the 1rst rotation, the up is probably completely screwed up.\\n\\t// Find the rotation between the up of the rotated object, and the desired up\\n\\tvec3 newUp = rotateWithQuat(start_up, rot1);//rot1 * vec3(0.0, 1.0, 0.0);\\n\\tvec4 rot2 = vectorAlign(normalize(newUp), up);\\n\\n\\t// return rot1;\\n\\treturn quatMult(rot1, rot2);\\n\\t// return rot2 * rot1;\\n\\n}\"","export default \"float dot2( in vec2 v ) { return dot(v,v); }\\nfloat dot2( in vec3 v ) { return dot(v,v); }\\nfloat ndot( in vec2 a, in vec2 b ) { return a.x*b.x - a.y*b.y; }\"","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// runtime helper for setting properties on components\n// in a tree-shakable way\nexports.default = (sfc, props) => {\n    const target = sfc.__vccOpts || sfc;\n    for (const [key, val] of props) {\n        target[key] = val;\n    }\n    return target;\n};\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"NavigationWithLinkedIndex grid-x mt-0 lg:mt-1\" }\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = { class: \"cell shrink hidden lg:block\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_Navigation = _resolveComponent(\"Navigation\")!\n  const _component_LinkIndexDropdownProps = _resolveComponent(\"LinkIndexDropdownProps\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createVNode(_component_Navigation, { linkIndex: _ctx.linkIndex }, null, 8 /* PROPS */, [\"linkIndex\"])\n    ]),\n    _createElementVNode(\"div\", _hoisted_3, [\n      _createVNode(_component_LinkIndexDropdownProps, {\n        linkIndex: _ctx.linkIndex,\n        onLinkIndexUpdate: _ctx.onLinkIndexUpdate\n      }, null, 8 /* PROPS */, [\"linkIndex\", \"onLinkIndexUpdate\"])\n    ])\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationWithLinkedIndex.vue?vue&type=template&id=5268785e&ts=true\"","import { resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"NavigationBar disable-select\" }\nconst _hoisted_2 = { class: \"grid-x\" }\nconst _hoisted_3 = { class: \"cell shrink\" }\nconst _hoisted_4 = { class: \"button-group mt-px\" }\nconst _hoisted_5 = { class: \"cell auto\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n  const _component_NavigationPathElement = _resolveComponent(\"NavigationPathElement\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createElementVNode(\"div\", _hoisted_4, [\n          _createElementVNode(\"div\", {\n            ref: \"backwardButton\",\n            class: _normalizeClass([\n\t\t\t\t\t\t\t'backward ml-1 inline-flex items-center px-2 py-1 text-xs font-medium rounded shadow-sm text-text bg-blue-700 hover:text-white focus:outline-none h-full saturate-0',\n\t\t\t\t\t\t\t_ctx.goBackwardClassObject,\n\t\t\t\t\t\t]),\n            onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.go_backward && _ctx.go_backward(...args))),\n            onContextmenu: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.onBackwardContextmenu && _ctx.onBackwardContextmenu(...args)))\n          }, [\n            _createVNode(_component_font_awesome_icon, {\n              icon: \"fa-solid fa-chevron-left\",\n              class: \"w-2 h-4\"\n            })\n          ], 34 /* CLASS, HYDRATE_EVENTS */),\n          _createElementVNode(\"div\", {\n            ref: \"forwardButton\",\n            class: _normalizeClass([\n\t\t\t\t\t\t\t'forward ml-1 inline-flex items-center px-2 py-1 text-xs font-medium rounded shadow-sm text-text bg-blue-700 hover:text-white focus:outline-none h-full saturate-0',\n\t\t\t\t\t\t\t_ctx.goForwardClassObject,\n\t\t\t\t\t\t]),\n            onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.go_forward && _ctx.go_forward(...args))),\n            onContextmenu: _cache[3] || (_cache[3] = \n//@ts-ignore\n(...args) => (_ctx.onForwardContextmenu && _ctx.onForwardContextmenu(...args)))\n          }, [\n            _createVNode(_component_font_awesome_icon, {\n              icon: \"fa-solid fa-chevron-right\",\n              class: \"w-2 h-4\"\n            })\n          ], 34 /* CLASS, HYDRATE_EVENTS */)\n        ])\n      ]),\n      _createElementVNode(\"div\", _hoisted_5, [\n        _createElementVNode(\"ul\", {\n          class: \"path_elements thin_scrollbar\",\n          ref: \"pathElementsList\",\n          onMousewheel: _cache[4] || (_cache[4] = \n//@ts-ignore\n(...args) => (_ctx.onPathElementsMouseWheel && _ctx.onPathElementsMouseWheel(...args)))\n        }, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.nodeIds, (nodeId, i) => {\n            return (_openBlock(), _createBlock(_component_NavigationPathElement, {\n              key: nodeId,\n              linkIndex: _ctx.linkIndex,\n              nodeId: _ctx.nodeIds[i],\n              isFirst: _ctx.isFirsts[i],\n              isLast: _ctx.isLasts[i]\n            }, null, 8 /* PROPS */, [\"linkIndex\", \"nodeId\", \"isFirst\", \"isLast\"]))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 544 /* HYDRATE_EVENTS, NEED_PATCH */)\n      ])\n    ])\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=template&id=8a617f46&ts=true\"","import { withModifiers as _withModifiers, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  class: \"NavigationPathElement\",\n  ref: \"element\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"li\", _hoisted_1, [\n    _createElementVNode(\"span\", {\n      class: \"path_separator\",\n      onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.goToParent && _ctx.goToParent(...args))),\n      onContextmenu: _cache[1] || (_cache[1] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onSlashContextMenu && _ctx.onSlashContextMenu(...args)), [\"stop\",\"prevent\"]))\n    }, \"/\", 32 /* HYDRATE_EVENTS */),\n    (_ctx.displayName)\n      ? (_openBlock(), _createElementBlock(\"span\", {\n          key: 0,\n          class: \"path_element_name\",\n          onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.goToPathElement && _ctx.goToPathElement(...args))),\n          onContextmenu: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onNameContextMenu && _ctx.onNameContextMenu(...args)), [\"stop\",\"prevent\"]))\n        }, _toDisplayString(_ctx.nodeName), 33 /* TEXT, HYDRATE_EVENTS */))\n      : _createCommentVNode(\"v-if\", true)\n  ], 512 /* NEED_PATCH */))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=template&id=24e23714&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=style&index=0&id=24e23714&lang=sass\"","import { render } from \"./NavigationPathElement.vue?vue&type=template&id=24e23714&ts=true\"\nimport script from \"./NavigationPathElement.vue?vue&type=script&lang=ts\"\nexport * from \"./NavigationPathElement.vue?vue&type=script&lang=ts\"\n\nimport \"./NavigationPathElement.vue?vue&type=style&index=0&id=24e23714&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=style&index=0&id=8a617f46&lang=sass\"","import { render } from \"./Navigation.vue?vue&type=template&id=8a617f46&ts=true\"\nimport script from \"./Navigation.vue?vue&type=script&lang=ts\"\nexport * from \"./Navigation.vue?vue&type=script&lang=ts\"\n\nimport \"./Navigation.vue?vue&type=style&index=0&id=8a617f46&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Panel-Link-Index-Dropdown\" }\nconst _hoisted_2 = { class: \"inline-block border border-text rounded-full text-xs text-center\" }\nconst _hoisted_3 = { class: \"inline-block w-4 h-4\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_DropDownMenu = _resolveComponent(\"DropDownMenu\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createVNode(_component_DropDownMenu, {\n      label_padding: [2, 5],\n      on_hover: false,\n      entries: _ctx.dropdownEntries,\n      onSelect: _ctx.onDropdownSelect\n    }, {\n      default: _withCtx(() => [\n        _createElementVNode(\"div\", _hoisted_2, [\n          _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.dropdownLabel), 1 /* TEXT */)\n        ])\n      ]),\n      _: 1 /* STABLE */\n    }, 8 /* PROPS */, [\"entries\", \"onSelect\"])\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=template&id=5956e24c&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=style&index=0&id=5956e24c&lang=sass\"","import { render } from \"./LinkIndexDropdown.vue?vue&type=template&id=5956e24c&ts=true\"\nimport script from \"./LinkIndexDropdown.vue?vue&type=script&lang=ts\"\nexport * from \"./LinkIndexDropdown.vue?vue&type=script&lang=ts\"\n\nimport \"./LinkIndexDropdown.vue?vue&type=style&index=0&id=5956e24c&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationWithLinkedIndex.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationWithLinkedIndex.vue?vue&type=script&lang=ts\"","import { render } from \"./NavigationWithLinkedIndex.vue?vue&type=template&id=5268785e&ts=true\"\nimport script from \"./NavigationWithLinkedIndex.vue?vue&type=script&lang=ts\"\nexport * from \"./NavigationWithLinkedIndex.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle, normalizeClass as _normalizeClass, withModifiers as _withModifiers, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createVNode as _createVNode, withCtx as _withCtx, resolveDynamicComponent as _resolveDynamicComponent } from \"vue\"\n\nconst _hoisted_1 = [\"data-panelId\", \"data-splitMode\", \"data-currentPanelType\", \"data-linkIndex\"]\nconst _hoisted_2 = { class: \"full_height_container grid-y\" }\nconst _hoisted_3 = { class: \"full_height_container grid-y\" }\nconst _hoisted_4 = {\n  key: 1,\n  class: \"full_height_container grid-y\"\n}\nconst _hoisted_5 = {\n  key: 0,\n  class: \"cell shrink panel_tabs select-none hidden lg:block\"\n}\nconst _hoisted_6 = { class: \"grid-x\" }\nconst _hoisted_7 = { class: \"cell auto\" }\nconst _hoisted_8 = { class: \"no-bullet tab_list\" }\nconst _hoisted_9 = { class: \"tab_item\" }\nconst _hoisted_10 = [\"data-panelType\", \"onClick\"]\nconst _hoisted_11 = [\"onClick\"]\nconst _hoisted_12 = { class: \"tab_item_container new_panel\" }\nconst _hoisted_13 = { class: \"cell shrink split_menu_container_container\" }\nconst _hoisted_14 = { class: \"split_menu_container bg-bg\" }\nconst _hoisted_15 = { class: \"cell auto panels_container\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_MultiplePanel = _resolveComponent(\"MultiplePanel\")!\n  const _component_PlusCircleIcon = _resolveComponent(\"PlusCircleIcon\")!\n  const _component_DropDownMenu = _resolveComponent(\"DropDownMenu\")!\n  const _component_EllipsisHorizontalCircleIcon = _resolveComponent(\"EllipsisHorizontalCircleIcon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"Panel Multiple cell auto bg-bg text-text\",\n    ref: \"element\",\n    \"data-panelId\": _ctx.panelId,\n    \"data-splitMode\": _ctx.split_mode,\n    \"data-currentPanelType\": _ctx.currentPanelType,\n    \"data-linkIndex\": _ctx.linkIndex\n  }, [\n    (_ctx.isSplit)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 0,\n          class: _normalizeClass(_ctx.split_container_class_object)\n        }, [\n          _createElementVNode(\"div\", {\n            class: \"cell\",\n            style: _normalizeStyle(_ctx.cell_style_objects[0])\n          }, [\n            _createElementVNode(\"div\", _hoisted_2, [\n              (_openBlock(), _createBlock(_component_MultiplePanel, {\n                key: _ctx.split_panel_key0,\n                level: _ctx.level + 1,\n                panelSide: 0,\n                init_layout_data: _ctx.split_panel_init_layout_data0,\n                panelId: _ctx.cellPanelIds[0],\n                ref: \"splitPanel0\",\n                onDeletePanel: _ctx.deleteSplitPanel,\n                onDeletePanelFromParent: _ctx.deletePanelFromParent\n              }, null, 8 /* PROPS */, [\"level\", \"init_layout_data\", \"panelId\", \"onDeletePanel\", \"onDeletePanelFromParent\"]))\n            ])\n          ], 4 /* STYLE */),\n          _createElementVNode(\"div\", {\n            class: \"cell\",\n            style: _normalizeStyle(_ctx.cell_style_objects[1])\n          }, [\n            _createElementVNode(\"div\", _hoisted_3, [\n              (_openBlock(), _createBlock(_component_MultiplePanel, {\n                key: _ctx.split_panel_key1,\n                level: _ctx.level + 1,\n                panelSide: 1,\n                init_layout_data: _ctx.split_panel_init_layout_data1,\n                panelId: _ctx.cellPanelIds[1],\n                ref: \"splitPanel1\",\n                onDeletePanel: _ctx.deleteSplitPanel,\n                onDeletePanelFromParent: _ctx.deletePanelFromParent\n              }, null, 8 /* PROPS */, [\"level\", \"init_layout_data\", \"panelId\", \"onDeletePanel\", \"onDeletePanelFromParent\"]))\n            ])\n          ], 4 /* STYLE */),\n          (!_ctx.full_screen_activated)\n            ? (_openBlock(), _createElementBlock(\"div\", {\n                key: 0,\n                class: \"split_panel_separator touch-none\",\n                style: _normalizeStyle(_ctx.split_panel_separator_style_object),\n                onDblclick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.on_dblclick && _ctx.on_dblclick(...args))),\n                onPointerdown: _cache[1] || (_cache[1] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onSplitPointerdown && _ctx.onSplitPointerdown(...args)), [\"stop\",\"prevent\"]))\n              }, [\n                _createElementVNode(\"div\", {\n                  class: _normalizeClass(['split_panel_separator_line bg-bg hover:bg-bg-dark', _ctx.isTouchOrMobile ? 'large' : ''])\n                }, null, 2 /* CLASS */)\n              ], 36 /* STYLE, HYDRATE_EVENTS */))\n            : _createCommentVNode(\"v-if\", true)\n        ], 2 /* CLASS */))\n      : (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n          (!_ctx.full_screen_activated)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n                _createElementVNode(\"div\", _hoisted_6, [\n                  _createElementVNode(\"div\", _hoisted_7, [\n                    _createElementVNode(\"ul\", _hoisted_8, [\n                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.panelTypes, (panelType, i) => {\n                        return (_openBlock(), _createElementBlock(\"li\", {\n                          class: _normalizeClass([[\n\t\t\t\t\t\t\t\t\t_ctx.tab_class_objects[i],\n\t\t\t\t\t\t\t\t\t`bg-${_ctx.tabPanelTypeClass(panelType)}-${i === _ctx.currentPanelIndex ? 800 : 900}`,\n\t\t\t\t\t\t\t\t\ti === _ctx.currentPanelIndex ? 'text-text-light' : `saturate-10 text-text-faded`,\n\t\t\t\t\t\t\t\t], \"tab_item_container border-t border-bg-dark\"])\n                        }, [\n                          _createElementVNode(\"span\", _hoisted_9, [\n                            _createElementVNode(\"span\", {\n                              class: \"panel_type_name\",\n                              \"data-panelType\": panelType,\n                              onClick: ($event: any) => (_ctx.setCurrentPanelIndex(i))\n                            }, _toDisplayString(panelType), 9 /* TEXT, PROPS */, _hoisted_10),\n                            (_ctx.tab_delete_allowed)\n                              ? (_openBlock(), _createElementBlock(\"span\", {\n                                  key: 0,\n                                  class: \"panel_type_close\",\n                                  onClick: ($event: any) => (_ctx.remove_tab(i))\n                                }, \"✕\", 8 /* PROPS */, _hoisted_11))\n                              : _createCommentVNode(\"v-if\", true)\n                          ])\n                        ], 2 /* CLASS */))\n                      }), 256 /* UNKEYED_FRAGMENT */)),\n                      _createElementVNode(\"li\", _hoisted_12, [\n                        _createVNode(_component_DropDownMenu, {\n                          label: '+',\n                          entries: _ctx.availablePanelTypes,\n                          on_hover: false,\n                          onSelect: _ctx.add_tab,\n                          label_padding: [0, 2]\n                        }, {\n                          default: _withCtx(() => [\n                            _createVNode(_component_PlusCircleIcon, { class: \"inline w-4 h-4 opacity-70 hover:opacity-100 relative\" })\n                          ]),\n                          _: 1 /* STABLE */\n                        }, 8 /* PROPS */, [\"entries\", \"onSelect\"])\n                      ])\n                    ])\n                  ]),\n                  _createElementVNode(\"div\", _hoisted_13, [\n                    _createElementVNode(\"div\", _hoisted_14, [\n                      _createVNode(_component_DropDownMenu, {\n                        id: 'splitTypeDropDown' + _ctx.panelId,\n                        entries: _ctx.split_types,\n                        on_hover: false,\n                        onSelect: _ctx.set_split_mode,\n                        label_padding: [0, 2],\n                        right_aligned: true\n                      }, {\n                        default: _withCtx(() => [\n                          _createVNode(_component_EllipsisHorizontalCircleIcon, { class: \"w-4 h-4 opacity-70 hover:opacity-100\" })\n                        ]),\n                        _: 1 /* STABLE */\n                      }, 8 /* PROPS */, [\"id\", \"entries\", \"onSelect\"])\n                    ])\n                  ])\n                ])\n              ]))\n            : _createCommentVNode(\"v-if\", true),\n          _createElementVNode(\"div\", _hoisted_15, [\n            (_openBlock(), _createBlock(_resolveDynamicComponent(_ctx.current_panel_component_type), {\n              custom_name: _ctx.current_panel_custom_name,\n              panelId: _ctx.panelId,\n              init_layout_data: _ctx.singlePanelInitLayoutData,\n              ref: \"current_panel\"\n            }, null, 8 /* PROPS */, [\"custom_name\", \"panelId\", \"init_layout_data\"]))\n          ])\n        ]))\n  ], 8 /* PROPS */, _hoisted_1))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=template&id=4878295c&ts=true\"","// import lodash_camelCase from 'lodash/camelCase';\n// import lodash_upperFirst from 'lodash/upperFirst';\n\n// const GUEST_PanelTypes: Array<PanelType> = [\n// \tPanelType.NETWORK,\n// \tPanelType.PARAMS,\n// \tPanelType.PERFORMANCE,\n// \tPanelType.SPREADSHEET,\n// \tPanelType.VIEWER,\n// ];\n\nimport {MultiplePanelProps, PanelInitLayoutData, PanelType, PANEL_TYPES} from '../../../../types';\nimport {ref, Ref, computed, SetupContext} from 'vue';\nimport {SplitDataMinimal, DeletePanelFromParentEmitParams} from './Split';\nimport {Editor} from '../../../../Editor';\nimport {PanelInitLayoutDataLegacy} from '../../../../types';\n// import {EditorEvent} from '../../../../types';\n\nconst DEFAULT_PanelTypes: Array<PanelType> = [PanelType.NETWORK, PanelType.PARAMS, PanelType.VIEWER];\n\n// export interface ISetupMultiplePanelPanels {\n// \tset_panel_types_from_split_panel: (index: number) => void;\n// \tset_panel_types_from_json: (new_panel_types: PanelType[]) => void;\n// \tsetCurrentPanelIndex: (index: number) => void;\n// \tremove_tab: (index: number) => void;\n// \tadd_tab: (type: PanelType) => void;\n// \ttab_class_objects: Readonly<\n// \t\tRef<\n// \t\t\treadonly {\n// \t\t\t\t[x: string]: boolean;\n// \t\t\t\tactive: boolean;\n// \t\t\t}[]\n// \t\t>\n// \t>;\n// \ttab_delete_allowed: Readonly<Ref<boolean>>;\n// \tcurrent_panel_type: Readonly<Ref<string>>;\n// \tavailable_panel_types: Readonly<\n// \t\tRef<\n// \t\t\treadonly {\n// \t\t\t\tid: PanelType;\n// \t\t\t}[]\n// \t\t>\n// \t>;\n// \tpanel_types: Ref<string[]>;\n// \tcurrentPanelIndex: Ref<number>;\n// }\n\nconst CUSTOM_SPLIT_WORD = ' - ';\n\n// we use MockComponent here\n// to try and find the properties of the Vue component\n// there may be a better way.\n// But be careful not to use component.$data\n// as while this works in dev, this fails in production\nimport {ComponentPublicInstance} from 'vue';\nexport interface VueComponentWithSplitParams extends ComponentPublicInstance<any> {\n\tlevel: number;\n\tpanelId: string;\n\tisSplit: boolean;\n\tpanelTypes: PanelType[];\n\tcurrentPanelIndex: number;\n\tlayoutData: () => PanelInitLayoutData;\n}\n\nexport function SetupMultiplePanelPanels(\n\tprops: MultiplePanelProps,\n\tcontext: SetupContext,\n\tsplitPanel0: Ref<VueComponentWithSplitParams | null>,\n\tsplitPanel1: Ref<VueComponentWithSplitParams | null>,\n\tsinglePanelInitLayoutData: Ref<Object>\n) {\n\tconst currentPanelIndex = ref(\n\t\tprops.init_layout_data.currentPanelIndex ||\n\t\t\t(props.init_layout_data as PanelInitLayoutDataLegacy).current_panel_index ||\n\t\t\t0\n\t);\n\tconst initPanelTypes: PanelType[] =\n\t\t(props.init_layout_data.panelTypes as PanelType[]) ||\n\t\t((props.init_layout_data as PanelInitLayoutDataLegacy).panel_types as PanelType[]);\n\tconst panelTypes = ref<PanelType[]>(initPanelTypes || DEFAULT_PanelTypes);\n\n\tconst available_panel_names = computed(() => {\n\t\tconst list: string[] = PANEL_TYPES.slice();\n\t\t// if (!props.scene_update_allowed) {\n\t\t// \tlist = GUEST_PanelTypes;\n\t\t// }\n\t\t// if (Editor.instance().has_callback(EditorEvent.FILE_BROWSE)) {\n\t\t// \tconst index = list.indexOf(PanelType.ASSETS);\n\t\t// \tif (index >= 0) {\n\t\t// \t\tlist.splice(index, 1);\n\t\t// \t}\n\t\t// }\n\t\tconst custom_names = Editor.instance().api.panel.custom.panelNames();\n\t\tfor (let custom_name of custom_names) {\n\t\t\tlist.push(`custom${CUSTOM_SPLIT_WORD}${custom_name}`);\n\t\t}\n\n\t\treturn list;\n\t});\n\n\tconst availablePanelTypes = computed(() => {\n\t\treturn available_panel_names.value.map((panelType) => ({id: panelType}));\n\t});\n\n\tconst currentPanelType = computed(() => {\n\t\tlet name: string = panelTypes.value[currentPanelIndex.value];\n\t\tif (name == null) {\n\t\t\tname = panelTypes.value[0];\n\t\t}\n\t\t//  else {\n\t\t// \t// if name can be split in element using ' - '\n\t\t// \t// then it is a custom panel\n\t\t// \tconst elements = name.split(CUSTOM_SPLIT_WORD);\n\t\t// \tif (elements.length > 1) {\n\t\t// \t\tname = elements[0];\n\t\t// \t}\n\t\t// }\n\t\treturn name;\n\t\t// return lodash_upperFirst(lodash_camelCase(name));\n\t});\n\tconst current_panel_component_type = computed(() => {\n\t\t// if name can be split in element using ' - '\n\t\t// then it is a custom panel\n\t\tlet name = currentPanelType.value;\n\t\tconst elements = name.split(CUSTOM_SPLIT_WORD);\n\t\tif (elements.length > 1) {\n\t\t\tname = elements[0];\n\t\t}\n\t\treturn name;\n\t});\n\tconst current_panel_custom_name = computed(() => {\n\t\tlet name = currentPanelType.value;\n\t\tconst elements = name.split(CUSTOM_SPLIT_WORD);\n\t\tif (elements.length > 1) {\n\t\t\tname = elements[1];\n\t\t}\n\t\treturn name;\n\t});\n\n\tconst tab_delete_allowed = computed(() => {\n\t\treturn panelTypes.value.length > 1;\n\t});\n\n\tconst tab_class_objects = computed(() => {\n\t\treturn panelTypes.value.map((panelType, i) => {\n\t\t\treturn {\n\t\t\t\tactive: i === currentPanelIndex.value,\n\t\t\t\t[panelType]: true,\n\t\t\t};\n\t\t});\n\t});\n\n\t// functions\n\tfunction add_tab(type: PanelType) {\n\t\tpanelTypes.value.push(type);\n\t\tsetCurrentPanelIndex(panelTypes.value.length - 1);\n\t}\n\tfunction remove_tab(index: number) {\n\t\tif (tab_delete_allowed.value) {\n\t\t\tpanelTypes.value.splice(index, 1);\n\n\t\t\tif (currentPanelIndex.value >= panelTypes.value.length) {\n\t\t\t\tcurrentPanelIndex.value = panelTypes.value.length - 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setCurrentPanelIndex(i: number) {\n\t\tcurrentPanelIndex.value = i;\n\t}\n\n\t// function setPanelTypesFromJSON(newPanelTypes: PanelType[]) {\n\t// \tpanelTypes.value = newPanelTypes;\n\t// }\n\n\tfunction deleteSplitPanel(\n\t\t// panelIndex: number,\n\t\tpanelId: string,\n\t\tsplit_data: SplitDataMinimal,\n\t\tprops: MultiplePanelProps\n\t) {\n\t\tif (splitPanel0.value && splitPanel1.value) {\n\t\t\tconst panels = [splitPanel0.value, splitPanel1.value];\n\t\t\tconst remainingPanel = panels.filter((panel) => panel.panelId != panelId)[0];\n\n\t\t\tif (remainingPanel.isSplit) {\n\t\t\t\tconst panelIdEmitter = props.panelSide;\n\t\t\t\tconst layoutData = remainingPanel.layoutData();\n\t\t\t\tconst emitParams: DeletePanelFromParentEmitParams = {\n\t\t\t\t\tlayoutData: layoutData,\n\t\t\t\t\tpanelIdEmitter,\n\t\t\t\t};\n\t\t\t\t// be careful as if props.level == 0\n\t\t\t\t// the emit will be caught by Editor.vue, not by Multiple.vue\n\t\t\t\tcontext.emit('deletePanelFromParent', emitParams);\n\t\t\t} else {\n\t\t\t\tconst layoutData = (remainingPanel as any).current_panel.layoutData();\n\t\t\t\tsinglePanelInitLayoutData.value = layoutData;\n\t\t\t\tpanelTypes.value = remainingPanel.panelTypes;\n\t\t\t\tcurrentPanelIndex.value = remainingPanel.currentPanelIndex;\n\t\t\t\tsplit_data.split_mode.value = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tdeleteSplitPanel,\n\t\t// setPanelTypesFromJSON,\n\t\tsetCurrentPanelIndex,\n\t\tremove_tab,\n\t\tadd_tab,\n\t\ttab_class_objects,\n\t\ttab_delete_allowed,\n\t\tcurrentPanelType,\n\t\tcurrent_panel_component_type,\n\t\tcurrent_panel_custom_name,\n\t\tavailable_panel_names,\n\t\tavailablePanelTypes,\n\t\tpanelTypes,\n\t\tcurrentPanelIndex,\n\t\t// deletePanelFromParent0,\n\t\t// deletePanelFromParent1,\n\t};\n}\n","export class EventHelper {\n\tstatic stopEvent(event: Event) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tevent.stopImmediatePropagation();\n\t}\n}\n","import {EventHelper} from './../../../../core/EventHelper';\nimport lodash_cloneDeep from 'lodash/cloneDeep';\nimport {CoreDom} from '../../../../core/Dom';\nimport {MultiplePanelProps, PanelInitLayoutData, MultiplePanelSplitMode, PanelType} from '../../../../types';\nimport {ref, Ref, onBeforeMount, computed, SetupContext} from 'vue';\n\nenum MultiplePanelSplitLabel {\n\tHORIZONTAL = 'left/right',\n\tVERTICAL = 'top/bottom',\n}\n\nexport enum MultiplePanelSplitAction {\n\tDELETE = 'delete',\n}\n\nimport {SetupMultiplePanelPanels} from './Panels';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {CoreMath} from '../../../../../../@polygonjs/polygonjs/src/core/math/_Module';\nimport {MouseButton} from '../../../../../../@polygonjs/polygonjs/src/core/MouseButton';\n\nexport interface SplitDataMinimal {\n\tsplit_mode: Ref<MultiplePanelSplitMode | null>;\n}\n\nconst left_column_init_properties: PanelInitLayoutData = {\n\tsplit_mode: MultiplePanelSplitMode.VERTICAL,\n\tsplit_panel0: {\n\t\tpanelTypes: [PanelType.VIEWER],\n\t\tcurrentPanelIndex: 0,\n\t},\n\tsplit_panel1: {\n\t\tpanelTypes: [PanelType.PARAMS],\n\t\tcurrentPanelIndex: 0,\n\t},\n};\n\nconst network_init_properties: PanelInitLayoutData = {\n\tpanelTypes: [PanelType.NETWORK],\n\tcurrentPanelIndex: 0,\n};\n\nexport interface DeletePanelFromParentEmitParams {\n\tlayoutData: PanelInitLayoutData;\n\tpanelIdEmitter?: number;\n}\n\nexport function SetupMultiplePanelSplit(\n\tprops: MultiplePanelProps,\n\tcontext: SetupContext,\n\telement: Ref<HTMLElement | null>,\n\tPanelsMixin: ReturnType<typeof SetupMultiplePanelPanels>,\n\tinit_properties_for_split_panels: () => PanelInitLayoutData\n\t// image_element_ref: Ref<HTMLElement>,\n\t// {emit},\n) {\n\tconst split_mode = ref<MultiplePanelSplitMode | null>(props.init_layout_data.split_mode || null);\n\tconst split_panel_init_layout_data0 = ref<PanelInitLayoutData>(\n\t\tprops.init_layout_data.split_panel0 || left_column_init_properties\n\t);\n\tconst split_panel_init_layout_data1 = ref<PanelInitLayoutData>(\n\t\tprops.init_layout_data.split_panel1 || network_init_properties\n\t);\n\t// const split_panel_init_layout_data = ref<[PanelInitLayoutData, PanelInitLayoutData]>([\n\t// \tprops.init_layout_data.split_panel0 || left_column_init_properties,\n\t// \tprops.init_layout_data.split_panel1 || network_init_properties,\n\t// ]);\n\tconst split_panel_key0 = ref<number>(1);\n\tconst split_panel_key1 = ref<number>(1);\n\tconst split_ratio = ref(props.init_layout_data.split_ratio || 0.5);\n\tconst cells_visible_state = computed(() => {\n\t\tconst fullscreenPanelId = StoreController.editor.panel.fullscreenPanelId();\n\t\tif (fullscreenPanelId) {\n\t\t\tif (fullscreenPanelId.includes(cellPanelIds.value[0])) {\n\t\t\t\treturn [true, false];\n\t\t\t} else {\n\t\t\t\treturn [false, true];\n\t\t\t}\n\t\t} else {\n\t\t\treturn [true, true];\n\t\t}\n\t});\n\tconst overriden_split_ratio = computed(() => {\n\t\tconst fullscreenPanelId = StoreController.editor.panel.fullscreenPanelId();\n\t\tif (fullscreenPanelId) {\n\t\t\tif (fullscreenPanelId.includes(cellPanelIds.value[0])) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t} else {\n\t\t\treturn split_ratio.value;\n\t\t}\n\t});\n\n\tonBeforeMount(() => {});\n\n\tconst isSplit = computed(() => split_mode.value != null);\n\n\tconst isSplitHorizontally = computed(() => isSplit.value && split_mode.value == MultiplePanelSplitMode.HORIZONTAL);\n\tconst isSplitVertically = computed(() => isSplit.value && split_mode.value == MultiplePanelSplitMode.VERTICAL);\n\tconst split_types = computed(() => {\n\t\tconst list = [\n\t\t\t{id: MultiplePanelSplitMode.HORIZONTAL as string, label: `split ${MultiplePanelSplitLabel.HORIZONTAL}`},\n\t\t\t{id: MultiplePanelSplitMode.VERTICAL as string, label: `split ${MultiplePanelSplitLabel.VERTICAL}`},\n\t\t];\n\n\t\tif (props.level > 0) {\n\t\t\tlist.push({id: MultiplePanelSplitAction.DELETE, label: 'delete'});\n\t\t}\n\n\t\treturn list;\n\t});\n\tconst split_container_class_object = computed(() => {\n\t\treturn {\n\t\t\t'split-panel-horizontal': isSplitHorizontally.value,\n\t\t\t'split-panel-vertical': isSplitVertically.value,\n\t\t\t'full_height_container grid-x': isSplitHorizontally.value,\n\t\t\t'full_height_container grid-y': isSplitVertically.value,\n\t\t};\n\t});\n\n\tconst full_screen_activated = computed(() => {\n\t\tconst fullscreenPanelId = StoreController.editor.panel.fullscreenPanelId();\n\t\treturn fullscreenPanelId != null;\n\t});\n\tconst cellPanelIds = computed(() => {\n\t\treturn [props.panelId + ':0', props.panelId + ':1'];\n\t});\n\tconst cell_style_objects = computed(() => {\n\t\tconst style_keys = isSplitHorizontally.value ? 'width' : 'height';\n\t\tconst style0: Dictionary<string> = {};\n\t\tconst style1: Dictionary<string> = {};\n\t\tstyle0[style_keys] = `${100 * overriden_split_ratio.value}%`;\n\t\tstyle1[style_keys] = `${100 * (1 - overriden_split_ratio.value)}%`;\n\n\t\tif (!cells_visible_state.value[0]) {\n\t\t\tstyle0['display'] = 'none';\n\t\t}\n\t\tif (!cells_visible_state.value[1]) {\n\t\t\tstyle1['display'] = 'none';\n\t\t}\n\n\t\treturn [style0, style1];\n\t});\n\n\tconst split_panel_separator_style_object = computed(() => {\n\t\tif (isSplitHorizontally.value) {\n\t\t\treturn {left: `${100 * split_ratio.value}%`};\n\t\t} else {\n\t\t\treturn {top: `${100 * split_ratio.value}%`};\n\t\t}\n\t});\n\n\t// functions\n\tfunction set_split_mode(mode: MultiplePanelSplitMode | MultiplePanelSplitAction) {\n\t\tif (mode === MultiplePanelSplitAction.DELETE) {\n\t\t\tcontext.emit('deletePanel', props.panelId);\n\t\t} else {\n\t\t\tsplit_mode.value = mode;\n\t\t\tconst props = init_properties_for_split_panels();\n\t\t\tsplit_panel_init_layout_data0.value = lodash_cloneDeep(props);\n\t\t\tsplit_panel_init_layout_data1.value = lodash_cloneDeep(props);\n\t\t}\n\t}\n\n\tfunction deleteSplitPanel(panelId: string) {\n\t\tPanelsMixin.deleteSplitPanel(panelId, {split_mode}, props);\n\t}\n\t// function deleteSplitPanel1(panelId: string) {\n\t// \tPanelsMixin.deleteSplitPanel(panelId, {split_mode}, props);\n\t// }\n\tfunction deletePanelFromParent(params: DeletePanelFromParentEmitParams) {\n\t\tconst {layoutData, panelIdEmitter} = params;\n\t\tif (panelIdEmitter == 0) {\n\t\t\tsplit_panel_init_layout_data0.value = layoutData;\n\t\t\tsplit_panel_key0.value++;\n\t\t} else {\n\t\t\tsplit_panel_init_layout_data1.value = layoutData;\n\t\t\tsplit_panel_key1.value++;\n\t\t}\n\t\t// PanelsMixin.deletePanelFromParent0(0, layoutData);\n\t}\n\n\tconst current_element_bbox = {\n\t\tmin: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t},\n\t\tsize: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t},\n\t};\n\tfunction on_dblclick(e: MouseEvent) {\n\t\t// double click on the separator can be useful\n\t\t// to just reset it to the middle\n\t\tif (!element.value) {\n\t\t\treturn;\n\t\t}\n\t\tsplit_ratio.value = 0.5;\n\t\tsetTimeout(() => {\n\t\t\t// window.dispatchEvent(new Event('resize'));\n\t\t\tStoreController.editor.splitPanels.setDragInProgress(true);\n\t\t\tsetTimeout(() => {\n\t\t\t\tStoreController.editor.splitPanels.setDragInProgress(false);\n\t\t\t}, 1000);\n\t\t}, 50);\n\t\tEventHelper.stopEvent(e);\n\t}\n\tfunction onSplitPointerdown(e: PointerEvent) {\n\t\tif (!element.value) {\n\t\t\treturn;\n\t\t}\n\t\tif (e.button != MouseButton.LEFT) {\n\t\t\treturn;\n\t\t}\n\t\telement.value.setPointerCapture(e.pointerId);\n\t\tconst rect = element.value.getBoundingClientRect();\n\t\tcurrent_element_bbox.min.x = rect.left;\n\t\tcurrent_element_bbox.min.y = rect.top;\n\t\tcurrent_element_bbox.size.x = element.value.offsetWidth;\n\t\tcurrent_element_bbox.size.y = element.value.offsetHeight;\n\n\t\tCoreDom.addDragClasses();\n\t\tdocument.addEventListener('pointermove', _onpointermove);\n\t\tdocument.addEventListener('pointerup', _onpointerup);\n\t\tStoreController.editor.splitPanels.setDragInProgress(true);\n\t\tEventHelper.stopEvent(e);\n\t}\n\n\tfunction _onpointermove(e: PointerEvent) {\n\t\tconst current_mouse_pos = {\n\t\t\tx: e.pageX,\n\t\t\ty: e.pageY,\n\t\t};\n\n\t\tconst ratio = {\n\t\t\tx: (current_mouse_pos.x - current_element_bbox.min.x) / current_element_bbox.size.x,\n\t\t\ty: (current_mouse_pos.y - current_element_bbox.min.y) / current_element_bbox.size.y,\n\t\t};\n\t\t// we clamp, to prevent the draggable element\n\t\t// from going under the playbar or under the top menu.\n\t\tratio.x = CoreMath.clamp(ratio.x, 0, 1);\n\t\tratio.y = CoreMath.clamp(ratio.y, 0, 1);\n\n\t\tsplit_ratio.value = isSplitHorizontally.value ? ratio.x : ratio.y;\n\t\t// window.dispatchEvent(new Event('resize'));\n\t\tStoreController.editor.splitPanels.setDragInProgress(true);\n\t}\n\n\tfunction _onpointerup(e: PointerEvent) {\n\t\telement.value?.releasePointerCapture(e.pointerId);\n\t\tdocument.removeEventListener('pointermove', _onpointermove);\n\t\tdocument.removeEventListener('pointerup', _onpointerup);\n\t\tCoreDom.removeDragClasses();\n\n\t\t// window.dispatchEvent(new Event('resize'));\n\t\tStoreController.editor.splitPanels.setDragInProgress(false);\n\t}\n\n\treturn {\n\t\tisSplit,\n\t\tsplit_ratio,\n\t\ton_dblclick,\n\t\tonSplitPointerdown,\n\t\tdeleteSplitPanel,\n\t\t// deleteSplitPanel1,\n\t\tdeletePanelFromParent,\n\t\tset_split_mode,\n\t\tsplit_mode,\n\t\tfull_screen_activated,\n\t\tsplit_panel_separator_style_object,\n\t\tcellPanelIds,\n\t\tcell_style_objects,\n\t\tsplit_container_class_object,\n\t\tsplit_types,\n\t\tsplit_panel_init_layout_data0,\n\t\tsplit_panel_init_layout_data1,\n\t\tsplit_panel_key0,\n\t\tsplit_panel_key1,\n\t};\n}\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Panel Network full_height_container grid-y relative bg-bg\" }\nconst _hoisted_2 = { class: \"cell shrink bg-bg\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", {\n  id: \"debug-hammer\",\n  class: \"absolute bottom-0 bg-blue-800 text-white p-px\"\n}, null, -1 /* HOISTED */)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NavigationWithLinkedIndex = _resolveComponent(\"NavigationWithLinkedIndex\")!\n  const _component_NetworkCore = _resolveComponent(\"NetworkCore\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createVNode(_component_NavigationWithLinkedIndex, {\n        linkIndex: _ctx.linkIndex,\n        onLinkIndexUpdate: _ctx.onLinkIndexUpdate\n      }, null, 8 /* PROPS */, [\"linkIndex\", \"onLinkIndexUpdate\"])\n    ]),\n    _createVNode(_component_NetworkCore, {\n      ref: \"networkCore\",\n      panelId: _ctx.panelId,\n      init_layout_data: _ctx.init_layout_data,\n      transparent: false\n    }, null, 8 /* PROPS */, [\"panelId\", \"init_layout_data\"]),\n    _hoisted_3\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Network.vue?vue&type=template&id=35a5db46&ts=true\"","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {onBeforeMount, Ref} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {NetworkPanelInitLayoutData} from '../../../../types';\n\nexport interface NetworkPanelProps {\n\tpanelId: string;\n\tinit_layout_data: NetworkPanelInitLayoutData;\n}\nexport interface NetworkPanelCoreProps extends NetworkPanelProps {\n\ttransparent: boolean;\n\tparamsAlwaysDisplayed: boolean;\n}\ninterface ParentOptions {\n\tnetworkCore: Ref<HTMLElement | null>;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n}\ninterface SetupLayoutDataArgs {\n\tprops: NetworkPanelProps;\n\tcamera_data: Ref<MultiPlayer.Awareness.CameraData>;\n\tcameraTransformByNodeId: Ref<Dictionary<MultiPlayer.Awareness.CameraData>>;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n\tparamsDisplayed: Ref<boolean>;\n\tzoomCommited: Ref<number>;\n}\n\nexport function SetupLayoutDataParentComponent(options: ParentOptions) {\n\tconst {networkCore, setupLinkIndex} = options;\n\tfunction fromJSON(json: NetworkPanelInitLayoutData) {\n\t\tconsole.log('network fromJSON', json);\n\t\tif (networkCore.value) {\n\t\t\t(networkCore.value as any).fromJSON(json);\n\t\t}\n\t}\n\tfunction layoutData(): NetworkPanelInitLayoutData {\n\t\tif (networkCore.value) {\n\t\t\treturn {\n\t\t\t\t...(networkCore.value as any).layoutData(),\n\t\t\t\tlinkIndex: setupLinkIndex.linkIndex.value,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tlinkIndex: setupLinkIndex.linkIndex.value,\n\t\t\t\tcamera: {position: {x: 0, y: 0}, zoom: 1},\n\t\t\t\thistory: {},\n\t\t\t\tparamsDisplayed: false,\n\t\t\t};\n\t\t}\n\t}\n\treturn {fromJSON, layoutData};\n}\n\nexport function SetupLayoutDataCore(options: SetupLayoutDataArgs) {\n\tconst {props, camera_data, cameraTransformByNodeId, setupLinkIndex, paramsDisplayed, zoomCommited} = options;\n\tonBeforeMount(() => {\n\t\tfromJSON(props.init_layout_data);\n\t});\n\n\tfunction fromJSON(json: NetworkPanelInitLayoutData) {\n\t\tconst loaded_camera_data = json['camera'];\n\t\tif (loaded_camera_data) {\n\t\t\tconst position = loaded_camera_data.position;\n\t\t\tconst zoom = loaded_camera_data.zoom;\n\t\t\t// this.camera = camera_data\n\t\t\tif (position) {\n\t\t\t\tcamera_data.value.position.x = position.x;\n\t\t\t\tcamera_data.value.position.y = position.y;\n\t\t\t}\n\t\t\tif (zoom) {\n\t\t\t\tcamera_data.value.zoom = zoom;\n\t\t\t\tzoomCommited.value = zoom;\n\t\t\t}\n\t\t}\n\n\t\tconst json_camera_history = json['history'];\n\t\tif (json_camera_history) {\n\t\t\tfor (let id of Object.keys(json_camera_history)) {\n\t\t\t\tcameraTransformByNodeId.value[id] = json_camera_history[id];\n\t\t\t}\n\t\t}\n\t\tif (json.paramsDisplayed != null) {\n\t\t\tparamsDisplayed.value = json.paramsDisplayed;\n\t\t}\n\n\t\tsetupLinkIndex.fromJSON(json);\n\t}\n\n\tfunction layoutData(): NetworkPanelInitLayoutData {\n\t\treturn {\n\t\t\tcamera: {\n\t\t\t\tposition: {\n\t\t\t\t\tx: camera_data.value.position.x,\n\t\t\t\t\ty: camera_data.value.position.y,\n\t\t\t\t},\n\t\t\t\tzoom: camera_data.value.zoom,\n\t\t\t},\n\t\t\t// currently not saving camera history anymore\n\t\t\t// since as we have the ability to have linked panels,\n\t\t\t// this seems unnecessary,\n\t\t\t// and void accumulating large json in editor.json\n\t\t\t// UPDATE: the camera history should be saved,\n\t\t\t// as it's really inconvenient not to have the navigation history\n\t\t\t// preserved when reloading the page, which happens often.\n\t\t\t// And it should not accumulate, since the keys are node ids,\n\t\t\t// so it's not like it will be an infinite queue\n\t\t\thistory: cameraTransformByNodeId.value,\n\t\t\tparamsDisplayed: paramsDisplayed.value,\n\t\t\t...setupLinkIndex.toJSON(),\n\t\t};\n\t}\n\n\treturn {fromJSON, layoutData};\n}\n","import {StoreController} from '../../../../store/controllers/StoreController';\n\nimport {computed} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nexport function SetupNodeNavigation(setupLinkIndexReturn: SetupLinkIndexReturn) {\n\tconst current_node_graph_id = computed(() =>\n\t\tStoreController.editor.current_node_graph_id(setupLinkIndexReturn.linkIndex.value)\n\t);\n\tconst display_go_up_button = computed(() => {\n\t\tif (current_node_graph_id == null) {\n\t\t\treturn false;\n\t\t}\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndexReturn.linkIndex.value);\n\t\tif (!node) {\n\t\t\treturn false;\n\t\t}\n\t\treturn node.parent() != null;\n\t});\n\n\tfunction go_up() {\n\t\tStoreController.editor.goUp(setupLinkIndexReturn.linkIndex.value);\n\t}\n\n\treturn {\n\t\tdisplay_go_up_button,\n\t\tgo_up,\n\t};\n}\n","import { resolveComponent as _resolveComponent, normalizeStyle as _normalizeStyle, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createVNode as _createVNode, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, vShow as _vShow, withDirectives as _withDirectives } from \"vue\"\n\nconst _hoisted_1 = { class: \"network-core h-full\" }\nconst _hoisted_2 = { class: \"w-0 h-0 relative\" }\nconst _hoisted_3 = { class: \"cell auto h-full grid-y relative\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"absolute top-0 right-0 z-40 h-96 w-96 max-w-[50%] max-h-full pl-1 pb-1 bg-bg-medium\"\n}\nconst _hoisted_5 = { class: \"absolute top left w-full z-50 pointer-events-none\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"absolute top-0 left-2/4 -translate-x-1/2 hidden lg:block\"\n}\nconst _hoisted_7 = { class: \"inline-flex px-2 py-1 border border-transparent text-black text-xl font-bold opacity-30 select-none\" }\nconst _hoisted_8 = {\n  key: 1,\n  class: \"absolute top-10 left-2/4 -translate-x-1/2\"\n}\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"inline-flex px-2 py-1 border border-transparent text-orange-500 text-xl font-bold opacity-30 select-none\" }, \" Unlock this PolyNode to edit its content \", -1 /* HOISTED */)\nconst _hoisted_10 = [\n  _hoisted_9\n]\nconst _hoisted_11 = { class: \"flex text-xs font-sm p-1 border-t-2 border-neutral-900\" }\nconst _hoisted_12 = { class: \"\" }\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"inline-block align-middle leading-[0]\" }, \"Add Node\", -1 /* HOISTED */)\nconst _hoisted_14 = { class: \"text-right flex-1\" }\nconst _hoisted_15 = {\n  key: 0,\n  class: \"inline-block go-up-button-container above-event-catcher\"\n}\nconst _hoisted_16 = {\n  key: 2,\n  class: \"m-1 px-2 py-1 bg-red-400 text-white rounded-sm flex space-x-2 items-center pointer-events-auto\"\n}\nconst _hoisted_17 = /*#__PURE__*/_createElementVNode(\"span\", null, \"ERROR\", -1 /* HOISTED */)\nconst _hoisted_18 = { class: \"cell auto\" }\nconst _hoisted_19 = {\n  class: \"canvas_container\",\n  ref: \"canvas_container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_TabMenu = _resolveComponent(\"TabMenu\")!\n  const _component_Params = _resolveComponent(\"Params\")!\n  const _component_PlusCircleIcon = _resolveComponent(\"PlusCircleIcon\")!\n  const _component_ListBulletIcon = _resolveComponent(\"ListBulletIcon\")!\n  const _component_ShareIcon = _resolveComponent(\"ShareIcon\")!\n  const _component_AdjustmentsVerticalIcon = _resolveComponent(\"AdjustmentsVerticalIcon\")!\n  const _component_ChevronDoubleUpIcon = _resolveComponent(\"ChevronDoubleUpIcon\")!\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n  const _component_MultiPlayerCursors = _resolveComponent(\"MultiPlayerCursors\")!\n  const _component_Node = _resolveComponent(\"Node\")!\n  const _component_InterractiveConnectionMultiple = _resolveComponent(\"InterractiveConnectionMultiple\")!\n  const _component_NodesList = _resolveComponent(\"NodesList\")!\n  const _component_NetworkHints = _resolveComponent(\"NetworkHints\")!\n  const _component_MiniMap = _resolveComponent(\"MiniMap\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      (_ctx.tabMenuActive)\n        ? (_openBlock(), _createBlock(_component_TabMenu, {\n            key: 0,\n            linkIndex: _ctx.linkIndex,\n            style: _normalizeStyle(_ctx.tab_menu_style_object),\n            onClose: _ctx.close_tab_menu,\n            onSelect: _ctx.on_tab_menu_select\n          }, null, 8 /* PROPS */, [\"linkIndex\", \"style\", \"onClose\", \"onSelect\"]))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    _createElementVNode(\"div\", _hoisted_3, [\n      _createCommentVNode(\"\\n\\t\\t\\t\\tDO NOT add an opacity to this with something like 'opacity-80 hover:opacity-100'\\n\\t\\t\\t\\tas this seems to let touch events go through, which has the consequence of clearing the node selection\\n\\t\\t\\t\\twhen changing a parameter via a slider or trying to focus on a number input\\n\\t\\t\\t\"),\n      ((_ctx.paramsAlwaysDisplayed || _ctx.paramsDisplayed) && _ctx.paramsPanelNodeId != null)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n            _createVNode(_component_Params, {\n              nodeId: _ctx.paramsPanelNodeId,\n              init_layout_data: _ctx.init_layout_data,\n              displayNavBar: false,\n              displayHelpButton: false\n            }, null, 8 /* PROPS */, [\"nodeId\", \"init_layout_data\"])\n          ]))\n        : _createCommentVNode(\"v-if\", true),\n      _createElementVNode(\"div\", _hoisted_5, [\n        (!_ctx.transparent)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n              _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.nodeChildrenContext.toUpperCase()), 1 /* TEXT */)\n            ]))\n          : _createCommentVNode(\"v-if\", true),\n        (_ctx.currentPolyNodeLocked)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, _hoisted_10))\n          : _createCommentVNode(\"v-if\", true),\n        _createElementVNode(\"div\", _hoisted_11, [\n          _createElementVNode(\"div\", _hoisted_12, [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"inline-flex items-center px-2 py-1 border border-transparent shadow-sm rounded-md text-white bg-blue-600 hover:bg-blue-700 cursor-pointer pointer-events-auto\",\n              onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.toggle_tab_menu())),\n              onContextmenuCapture: _cache[1] || (_cache[1] = _withModifiers(($event: any) => (_ctx.toggle_tab_menu()), [\"prevent\"])),\n              title: \"open node menu (press 'Tab')\"\n            }, [\n              _createVNode(_component_PlusCircleIcon, {\n                class: \"-ml-0.5 mr-2 h-4 w-4\",\n                \"aria-hidden\": \"true\"\n              }),\n              _hoisted_13\n            ], 32 /* HYDRATE_EVENTS */),\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"inline-flex items-center ml-2 p-1 border border-transparent shadow-sm text-white bg-green-600 hover:bg-green-700 cursor-pointer rounded-full pointer-events-auto\",\n              onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.toggleListMode && _ctx.toggleListMode(...args))),\n              title: \"toggle list view (press 'l')\"\n            }, [\n              (!_ctx.listMode)\n                ? (_openBlock(), _createBlock(_component_ListBulletIcon, {\n                    key: 0,\n                    class: \"h-4 w-4\"\n                  }))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.listMode)\n                ? (_openBlock(), _createBlock(_component_ShareIcon, {\n                    key: 1,\n                    class: \"h-4 w-4\"\n                  }))\n                : _createCommentVNode(\"v-if\", true)\n            ]),\n            (!_ctx.paramsAlwaysDisplayed)\n              ? (_openBlock(), _createElementBlock(\"button\", {\n                  key: 0,\n                  type: \"button\",\n                  class: _normalizeClass([\n\t\t\t\t\t\t\t\t'inline-flex items-center ml-2 p-1 border border-transparent shadow-sm text-white bg-green-600 hover:bg-green-700 cursor-pointer rounded-full pointer-events-auto',\n\t\t\t\t\t\t\t\t_ctx.paramsDisplayed ? '' : 'opacity-30',\n\t\t\t\t\t\t\t]),\n                  onClick: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.toggleParamsDisplayed && _ctx.toggleParamsDisplayed(...args)), [\"stop\"])),\n                  title: \"toggle param panel (press 'e')\"\n                }, [\n                  _createVNode(_component_AdjustmentsVerticalIcon, { class: \"h-4 w-4\" })\n                ], 2 /* CLASS */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _createElementVNode(\"div\", _hoisted_14, [\n            (_ctx.display_go_up_button)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n                  _createElementVNode(\"button\", {\n                    type: \"button\",\n                    class: \"go-up-button inline-flex items-center ml-2 p-1 border border-transparent shadow-sm text-white bg-green-600 hover:bg-green-700 cursor-pointer rounded-full pointer-events-auto\",\n                    onClick: _cache[4] || (_cache[4] = \n//@ts-ignore\n(...args) => (_ctx.go_up && _ctx.go_up(...args))),\n                    title: \"go up (press 'u')\",\n                    id: \"network-go-up-button\"\n                  }, [\n                    _createVNode(_component_ChevronDoubleUpIcon, { class: \"h-4 w-4\" })\n                  ]),\n                  _createCommentVNode(\" <div class=\\\"go-up-button\\\" @click=\\\"go_up\\\"><ChevronDoubleUpIcon></ChevronDoubleUpIcon></div> \")\n                ]))\n              : _createCommentVNode(\"v-if\", true)\n          ])\n        ]),\n        (_ctx.isParentNodeErrored)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_16, [\n              _createVNode(_component_font_awesome_icon, {\n                icon: \"fa-solid fa-exclamation-triangle\",\n                class: \"text-red-600 h-4 w-4\"\n              }),\n              _hoisted_17,\n              _createElementVNode(\"span\", {\n                onClick: _cache[5] || (_cache[5] = \n//@ts-ignore\n(...args) => (_ctx.parentErrorGoUpAndSelect && _ctx.parentErrorGoUpAndSelect(...args))),\n                onContextmenu: _cache[6] || (_cache[6] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onErrorMessageContextMenu && _ctx.onErrorMessageContextMenu(...args)), [\"stop\",\"prevent\"])),\n                class: \"border-b-2 border-red-200 cursor-pointer\"\n              }, _toDisplayString(_ctx.parentNodePath) + \":\", 33 /* TEXT, HYDRATE_EVENTS */),\n              _createElementVNode(\"span\", null, _toDisplayString(_ctx.parentNodeErrorMessage), 1 /* TEXT */)\n            ]))\n          : _createCommentVNode(\"v-if\", true)\n      ]),\n      _createElementVNode(\"div\", _hoisted_18, [\n        _withDirectives(_createElementVNode(\"div\", _hoisted_19, [\n          _createElementVNode(\"div\", {\n            class: _normalizeClass([\"canvas\", _ctx.canvas_class_object]),\n            ref: \"canvas\",\n            onClick: _cache[10] || (_cache[10] = \n//@ts-ignore\n(...args) => (_ctx.on_click && _ctx.on_click(...args))),\n            onWheel: _cache[11] || (_cache[11] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_wheel && _ctx.on_wheel(...args)), [\"prevent\"]))\n          }, [\n            _createElementVNode(\"div\", {\n              class: \"zoom-container\",\n              style: _normalizeStyle(_ctx.zoom_container_style_object)\n            }, [\n              _createElementVNode(\"div\", {\n                class: \"pan-container\",\n                style: _normalizeStyle(_ctx.pan_container_style_object)\n              }, [\n                _createElementVNode(\"div\", {\n                  class: _normalizeClass([\"nodes-container\", _ctx.nodes_container_class_object]),\n                  ref: \"nodes_container\",\n                  onPointerdown: _cache[7] || (_cache[7] = \n//@ts-ignore\n(...args) => (_ctx.on_pointer_down && _ctx.on_pointer_down(...args))),\n                  onMousemove: _cache[8] || (_cache[8] = \n//@ts-ignore\n(...args) => (_ctx.on_mouse_move && _ctx.on_mouse_move(...args))),\n                  onTouchstart: _cache[9] || (_cache[9] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.ontouchstart && _ctx.ontouchstart(...args)), [\"stop\",\"prevent\"])),\n                  style: _normalizeStyle(_ctx.currentPolyNodeLocked ? {opacity: 0.25} : {})\n                }, [\n                  (_ctx.multiPlayerActive)\n                    ? (_openBlock(), _createBlock(_component_MultiPlayerCursors, {\n                        key: 0,\n                        scale: _ctx.cursorScale\n                      }, null, 8 /* PROPS */, [\"scale\"]))\n                    : _createCommentVNode(\"v-if\", true),\n                  _createElementVNode(\"div\", {\n                    class: \"nodes-container-events-catcher\",\n                    style: _normalizeStyle(_ctx.eventsCatcherStyleObject)\n                  }, null, 4 /* STYLE */),\n                  _createElementVNode(\"div\", {\n                    class: \"selection-rectangle\",\n                    style: _normalizeStyle(_ctx.selection_rectangle_style_object)\n                  }, null, 4 /* STYLE */),\n                  _createElementVNode(\"div\", {\n                    class: \"node-creation-rectangle\",\n                    style: _normalizeStyle(_ctx.node_creation_rectangle_style_object)\n                  }, null, 4 /* STYLE */),\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.json_children, (json_child, i) => {\n                    return (_openBlock(), _createBlock(_component_Node, {\n                      key: json_child.graph_node_id,\n                      json_node: json_child,\n                      json_parent: _ctx.json_node,\n                      action_in_progress: _ctx.action_in_progress,\n                      fullVisible: _ctx.nodeFullVisibleStates[i],\n                      linkIndex: _ctx.linkIndex,\n                      zoom: _ctx.zoomCommited,\n                      openTabMenuForChangeType: _ctx.openTabMenuForChangeType,\n                      onCapture_node_for_move: _ctx.on_capture_node_for_move,\n                      onCapture_node_src_for_connection: _ctx.on_capture_node_src_for_connection,\n                      onCapture_node_dest_for_connection: _ctx.on_capture_node_dest_for_connection,\n                      onCapture_node_input_for_node_creation: _ctx.on_capture_node_input_for_node_creation,\n                      onCapture_node_output_for_node_creation: \n\t\t\t\t\t\t\t\t\t\t\t_ctx.on_capture_node_output_for_node_creation\n\t\t\t\t\t\t\t\t\t\t,\n                      onRelease_node_input_for_node_creation: _ctx.on_release_node_input_for_node_creation,\n                      onRelease_node_output_for_node_creation: \n\t\t\t\t\t\t\t\t\t\t\t_ctx.on_release_node_output_for_node_creation\n\t\t\t\t\t\t\t\t\t\t,\n                      onCapture_node_for_contextMenu: _ctx.on_capture_node_for_contextMenu,\n                      onCapture_connection_for_node_creation: _ctx.on_capture_connection_for_node_creation,\n                      onRelease_connection_for_node_creation: _ctx.on_release_connection_for_node_creation,\n                      onCapture_node_final_for_connection: _ctx.on_capture_node_final_for_connection,\n                      onSet_display_flag: _ctx.on_set_display_flag,\n                      onSet_bypass_flag: _ctx.on_set_bypass_flag\n                    }, null, 8 /* PROPS */, [\"json_node\", \"json_parent\", \"action_in_progress\", \"fullVisible\", \"linkIndex\", \"zoom\", \"openTabMenuForChangeType\", \"onCapture_node_for_move\", \"onCapture_node_src_for_connection\", \"onCapture_node_dest_for_connection\", \"onCapture_node_input_for_node_creation\", \"onCapture_node_output_for_node_creation\", \"onRelease_node_input_for_node_creation\", \"onRelease_node_output_for_node_creation\", \"onCapture_node_for_contextMenu\", \"onCapture_connection_for_node_creation\", \"onRelease_connection_for_node_creation\", \"onCapture_node_final_for_connection\", \"onSet_display_flag\", \"onSet_bypass_flag\"]))\n                  }), 128 /* KEYED_FRAGMENT */)),\n                  _createCommentVNode(\" <InterractiveConnection\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tv-if=\\\"false && connection_data.active\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t:mouse_start=\\\"connection_data.mouse_start\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t:mouse_progress=\\\"connection_data.mouse_progress\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t></InterractiveConnection> \"),\n                  (_ctx.connection_data.active)\n                    ? (_openBlock(), _createBlock(_component_InterractiveConnectionMultiple, {\n                        key: 1,\n                        json_parent: _ctx.json_node,\n                        data: _ctx.connection_data\n                      }, null, 8 /* PROPS */, [\"json_parent\", \"data\"]))\n                    : _createCommentVNode(\"v-if\", true)\n                ], 38 /* CLASS, STYLE, HYDRATE_EVENTS */)\n              ], 4 /* STYLE */)\n            ], 4 /* STYLE */)\n          ], 34 /* CLASS, HYDRATE_EVENTS */)\n        ], 512 /* NEED_PATCH */), [\n          [_vShow, !_ctx.listMode]\n        ]),\n        _createCommentVNode(\" <table class=\\\"list-nodes-container\\\">\\n\\t\\t\\t\\t\\t<thead>\\n\\t\\t\\t\\t\\t\\t<td>name</td>\\n\\t\\t\\t\\t\\t\\t<td>select</td>\\n\\t\\t\\t\\t\\t</thead> \"),\n        _createCommentVNode(\" @set_display_flag=\\\"on_set_display_flag\\\" \"),\n        _createCommentVNode(\" @set_bypass_flag=\\\"on_set_bypass_flag\\\" \"),\n        _withDirectives(_createVNode(_component_NodesList, {\n          linkIndex: _ctx.linkIndex,\n          jsonChildrenSorted: _ctx.jsonChildrenSorted,\n          jsonNode: _ctx.json_node,\n          openTabMenuForChangeType: _ctx.openTabMenuForChangeType\n        }, null, 8 /* PROPS */, [\"linkIndex\", \"jsonChildrenSorted\", \"jsonNode\", \"openTabMenuForChangeType\"]), [\n          [_vShow, _ctx.listMode]\n        ]),\n        _createCommentVNode(\" </table> \")\n      ]),\n      (!_ctx.transparent && !_ctx.listMode)\n        ? (_openBlock(), _createBlock(_component_NetworkHints, {\n            key: 1,\n            class: \"hidden lg:block\",\n            tabMenuActive: _ctx.tabMenuActive\n          }, null, 8 /* PROPS */, [\"tabMenuActive\"]))\n        : _createCommentVNode(\"v-if\", true),\n      (!_ctx.listMode)\n        ? (_openBlock(), _createBlock(_component_MiniMap, {\n            key: 2,\n            class: \"hidden lg:block\",\n            jsonChildren: _ctx.json_children,\n            zoom: _ctx.zoom,\n            cameraPosition: _ctx.cameraPosition,\n            onCameraPositionRequested: _ctx.updateCameraPositionFromMinimap\n          }, null, 8 /* PROPS */, [\"jsonChildren\", \"zoom\", \"cameraPosition\", \"onCameraPositionRequested\"]))\n        : _createCommentVNode(\"v-if\", true)\n    ])\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=template&id=426ccc10&ts=true\"","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {CameraAnimationHelper} from '../helpers/CameraAnimation';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {watch, onMounted, onUnmounted, Ref, computed, nextTick, ComputedRef, StyleValue} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {Vector2} from 'three';\nimport {NetworkPanelCoreProps} from './LayoutData';\nexport interface SetupCameraOptions {\n\tzoom_container_style_object: Ref<{\n\t\ttransform: string;\n\t}>;\n\tpan_container_style_object: Ref<{left: string; top: string}>;\n\t// object_parents_style_object,\n\tsave_camera_history_for_json_node: (id: CoreGraphNodeId) => void;\n\teventsCatcherStyleObject: ComputedRef<StyleValue>;\n\tupdateCameraPositionFromMinimap: (v: Vector2) => void;\n}\n\ninterface SetupCameraArg {\n\tprops: NetworkPanelCoreProps;\n\tcanvas: Ref<HTMLCanvasElement | null>;\n\tcamera_data: Ref<MultiPlayer.Awareness.CameraData>;\n\tcameraDataAnimated: Ref<MultiPlayer.Awareness.CameraData>;\n\tcameraTransformByNodeId: Ref<Dictionary<MultiPlayer.Awareness.CameraData>>;\n\tcam_animation_helper: CameraAnimationHelper;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n\tzoomCommited: Ref<number>;\n}\n\nexport function SetupCamera(options: SetupCameraArg): SetupCameraOptions {\n\tconst {\n\t\tprops,\n\t\tcanvas,\n\t\tcamera_data,\n\t\tcameraDataAnimated,\n\t\tcameraTransformByNodeId,\n\t\tcam_animation_helper,\n\t\tsetupLinkIndex,\n\t\tzoomCommited,\n\t} = options;\n\n\tonMounted(() => {\n\t\tif (canvas.value) {\n\t\t\tcam_animation_helper.set_element(canvas.value);\n\t\t\tset_camera_helper_node();\n\t\t}\n\t});\n\n\tconst eventsCatcherStyleObject = computed(() => {\n\t\tconst v = 60;\n\t\tconst c = `rgb(${v},${v},${v})`;\n\t\t// const c = `rgb(255,0,255)`;\n\t\tconst size = 50 * 2 ** bgPatternSizeExp.value;\n\t\tconst strokeWidth = (size * 4) / 100;\n\t\tconst svgPattern = `<svg xmlns='http://www.w3.org/2000/svg' height=\"${size}\" width=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\n   <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"${size}\" style=\"stroke:${c};stroke-width:${strokeWidth}\" />\n  <line x1=\"0\" y1=\"0\" x2=\"${size}\" y2=\"0\" style=\"stroke:${c};stroke-width:${strokeWidth}\" />\n</svg>`;\n\n\t\tconst urlEncodedSvg = encodeURI(svgPattern);\n\t\tconst patternUrl = `url(\"data:image/svg+xml,${urlEncodedSvg}\")`;\n\t\treturn {\n\t\t\tbackgroundImage: patternUrl,\n\t\t\topacity: props.transparent ? 0 : 1,\n\t\t};\n\t});\n\t// const object_parents_style_object = computed(() => {\n\t// \treturn {};\n\t// });\n\n\tconst current_node_graph_id = computed(() =>\n\t\tStoreController.editor.current_node_graph_id(setupLinkIndex.linkIndex.value)\n\t);\n\twatch(current_node_graph_id, (node_graph_id, prev_node_graph_id) => {\n\t\tif (prev_node_graph_id) {\n\t\t\tsave_camera_history_for_json_node(prev_node_graph_id);\n\t\t}\n\t\tif (node_graph_id) {\n\t\t\tload_camera_history_for_json_node(node_graph_id);\n\t\t}\n\t\t// this.$nextTick(() => {\n\t\tset_camera_helper_node();\n\t\t// });\n\t});\n\n\t// functions\n\tfunction set_camera_helper_node() {\n\t\tconst currentNode = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (currentNode) {\n\t\t\tcam_animation_helper.set_parent_node(currentNode);\n\t\t}\n\t}\n\n\t// function set_camera_history(history: Dictionary<CameraData>) {\n\t// \tcamera_history = json || {};\n\t// }\n\t// function camera_history() {\n\t// \tthis._camera_history = this._camera_history || {}\n\t// }\n\t// function camera_history_for_node(graph_node_id: string) {\n\t// \treturn camera_history[graph_node_id];\n\t// }\n\tfunction save_camera_history_for_json_node(graph_node_id: CoreGraphNodeId) {\n\t\tconst entry: MultiPlayer.Awareness.CameraData = {\n\t\t\tposition: {\n\t\t\t\tx: camera_data.value.position.x,\n\t\t\t\ty: camera_data.value.position.y,\n\t\t\t},\n\t\t\tzoom: camera_data.value.zoom,\n\t\t};\n\t\tcameraTransformByNodeId.value[graph_node_id] = entry;\n\t}\n\tfunction load_camera_history_for_json_node(graph_node_id: CoreGraphNodeId) {\n\t\tconst node_history = cameraTransformByNodeId.value[graph_node_id];\n\t\tif (node_history) {\n\t\t\tcamera_data.value.zoom = node_history.zoom;\n\t\t\tzoomCommited.value = node_history.zoom;\n\t\t\tcamera_data.value.position.x = node_history.position.x;\n\t\t\tcamera_data.value.position.y = node_history.position.y;\n\t\t} else {\n\t\t\tnextTick(() => {\n\t\t\t\tcam_animation_helper.frameSelection();\n\t\t\t});\n\t\t}\n\t}\n\tfunction updateCameraPositionFromMinimap(position: Vector2) {\n\t\tcamera_data.value.position.x = position.x;\n\t\tcamera_data.value.position.y = position.y;\n\t}\n\n\t/**\n\t *\n\t * multiplayer follow\n\t *\n\t */\n\tconst controller = StoreController.editor.multiPlayer;\n\tconst followingInProgress = computed(() => controller.follow.followingInProgress());\n\tconst followedAwarenessData = computed(() => {\n\t\tconst username = controller.follow.username();\n\t\tif (username) {\n\t\t\treturn controller.awareness.awarenessRef().value[username];\n\t\t}\n\t});\n\n\twatch(followingInProgress, () => {\n\t\tif (followingInProgress.value == true) {\n\t\t\tstartAnimation();\n\t\t} else {\n\t\t\tendAnimation();\n\t\t}\n\t});\n\tonUnmounted(endAnimation);\n\tlet _requestAnimationFrameId: number | undefined;\n\tfunction startAnimation() {\n\t\t_requestAnimationFrameId = requestAnimationFrame(animate);\n\t}\n\tfunction endAnimation() {\n\t\tif (_requestAnimationFrameId) {\n\t\t\tcancelAnimationFrame(_requestAnimationFrameId);\n\t\t}\n\t}\n\tconst LERP = 0.2;\n\tfunction _lerp(startValue: number, endValue: number, lerp: number) {\n\t\t// return startValue * lerp + endValue * (1 - lerp);\n\t\treturn startValue + (endValue - startValue) * lerp;\n\t}\n\tfunction animate() {\n\t\t_requestAnimationFrameId = requestAnimationFrame(animate);\n\n\t\tconst targetData = followedAwarenessData.value?.camera;\n\t\tif (!targetData) {\n\t\t\treturn;\n\t\t}\n\t\t// console.log(targetData.position.x);\n\t\t// cameraDataAnimated.value.position.x = targetData.position.x;\n\t\t// cameraDataAnimated.value.position.y = targetData.position.y;\n\t\t// cameraDataAnimated.value.zoom = targetData.zoom;\n\t\tcameraDataAnimated.value.position.x = _lerp(cameraDataAnimated.value.position.x, targetData.position.x, LERP);\n\t\t// console.log(cameraDataAnimated.value.position.x);\n\t\tcameraDataAnimated.value.position.y = _lerp(cameraDataAnimated.value.position.y, targetData.position.y, LERP);\n\t\tcameraDataAnimated.value.zoom = _lerp(cameraDataAnimated.value.zoom, targetData.zoom, LERP);\n\t\tzoomCommited.value = cameraDataAnimated.value.zoom;\n\t}\n\n\t/**\n\t *\n\t * style\n\t *\n\t */\n\tconst zoom_container_style_object = computed(() => {\n\t\treturn {\n\t\t\ttransform: `scale(${camera_data.value.zoom})`,\n\t\t};\n\t});\n\tconst pan_container_style_object = computed(() => {\n\t\treturn {\n\t\t\tleft: `${camera_data.value.position.x}px`,\n\t\t\ttop: `${camera_data.value.position.y}px`,\n\t\t};\n\t});\n\tconst bgPatternSizeExp = computed(() => {\n\t\tconst zoom = camera_data.value.zoom;\n\t\t// console.log(zoom);\n\t\tif (zoom > 0.85) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (zoom > 0.6) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (zoom > 0.4) {\n\t\t\treturn 2;\n\t\t}\n\t\tif (zoom > 0.2) {\n\t\t\treturn 3;\n\t\t}\n\t\treturn 4;\n\t});\n\n\treturn {\n\t\tzoom_container_style_object,\n\t\tpan_container_style_object,\n\t\t// object_parents_style_object,\n\t\tsave_camera_history_for_json_node,\n\t\teventsCatcherStyleObject,\n\t\tupdateCameraPositionFromMinimap,\n\t};\n}\n","import {Editor} from './../../../../Editor';\nimport {BaseCommand} from '../../../../history/commands/_Base';\nimport {MultipleCommand} from '../../../../history/commands/Multiple';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {NodeConnectCommand} from '../../../../history/commands/NodeConnect';\nimport {TypedNodeConnection} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\n\nexport class NodeConnetionsHelper {\n\tconstructor(private nodeParent: BaseNodeType, private nodes: BaseNodeType[]) {}\n\n\tasync shiftInputs() {\n\t\tif (this.nodes.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst subCommands: BaseCommand[] = [];\n\t\tfor (let node of this.nodes) {\n\t\t\tconst nodeCommands = this._shiftInputsForNode(node);\n\t\t\tif (nodeCommands) {\n\t\t\t\tfor (let cmd of nodeCommands) {\n\t\t\t\t\tsubCommands.push(cmd);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (subCommands.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scene = StoreController.scene;\n\t\tconst multiCmd = new MultipleCommand(scene);\n\t\tfor (let cmd of subCommands) {\n\t\t\tmultiCmd.pushCommand(cmd);\n\t\t}\n\t\tawait Editor.instance().pushCommand(multiCmd);\n\t}\n\tprivate _shiftInputsForNode(node: BaseNodeType) {\n\t\t//const inputs = node.io.inputs.inputs()\n\t\tconst inputConnections = node.io.connections.inputConnections();\n\t\tif (!inputConnections) {\n\t\t\treturn;\n\t\t}\n\t\tif (inputConnections.length < 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst inputIndexByConnection = new Map<TypedNodeConnection<any>, number>();\n\t\tinputConnections.forEach((connection, index) => {\n\t\t\tif (connection != null) {\n\t\t\t\tinputIndexByConnection.set(connection, connection.inputIndex());\n\t\t\t}\n\t\t});\n\n\t\t// swap connection indices\n\t\tinputIndexByConnection.forEach((index, input) => {\n\t\t\tconst connectionToReplace = inputConnections[index + 1] || inputConnections[0];\n\t\t\tif (connectionToReplace) {\n\t\t\t\tinputIndexByConnection.set(input, connectionToReplace?.inputIndex());\n\t\t\t}\n\t\t});\n\n\t\t// generate commands\n\t\tconst cmds: NodeConnectCommand[] = [];\n\t\tinputIndexByConnection.forEach((index, connection) => {\n\t\t\tconst cmd = new NodeConnectCommand(\n\t\t\t\tthis.nodeParent,\n\t\t\t\tconnection.nodeSrc(),\n\t\t\t\tnode,\n\t\t\t\tindex,\n\t\t\t\tconnection.outputIndex()\n\t\t\t);\n\t\t\tcmds.push(cmd);\n\t\t});\n\t\treturn cmds;\n\t}\n}\n","export function dictionaryInvert<T extends string, U extends string>(dict: Record<T, U>): Record<U, T> {\n\tconst invertedDict: Record<U, T> = {} as Record<U, T>;\n\tconst keys = Object.keys(dict);\n\tfor (const key of keys) {\n\t\tconst value = dict[key as T];\n\t\tinvertedDict[value as U] = key as T;\n\t}\n\treturn invertedDict;\n}\n","import {dictionaryInvert} from '../../../../../../@polygonjs/polygonjs/src/core/DictUtils';\n\nexport enum ViewerKeyActionName {\n\tFRAME_CAMERA = 'Frame Camera',\n\tTOGGLE_OVERLAY_NETWORK = 'Toggle Overlay Network',\n}\nexport enum ViewerKey {\n\tF = 'f',\n\tG = 'g',\n}\nexport const VIEWER_ACTION_NAME_BY_KEY: Record<ViewerKey, ViewerKeyActionName> = {\n\tf: ViewerKeyActionName.FRAME_CAMERA,\n\tg: ViewerKeyActionName.TOGGLE_OVERLAY_NETWORK,\n};\n\nexport const KEY_BY_VIEWER_ACTION: Record<ViewerKeyActionName, ViewerKey> = dictionaryInvert(VIEWER_ACTION_NAME_BY_KEY);\n\nexport type BreakableFunction = () => boolean;\n","import {Ref, SetupContext} from 'vue';\nimport {useRoute} from 'vue-router';\nimport {Editor} from './../../../../Editor';\nimport {NetworkClipBoardHelper} from '../../../../core/clipboard/NetworkClipboardHelper';\nimport {NodeDeleteCommand} from '../../../../history/commands/NodeDelete';\nimport {NodeSelectCommand} from '../../../../history/commands/NodeSelect';\nimport {SetFlagBypassCommand} from '../../../../history/commands/SetFlagBypass';\nimport {SetFlagDisplayCommand} from '../../../../history/commands/SetFlagDisplay';\nimport {SelectionMethod} from '../../../../core/Selection';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {CameraAnimationHelper} from '../helpers/CameraAnimation';\nimport {TabMenuOptions} from './TabMenuOwner';\nimport {NetworkAction} from './EventMouse';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {NodeClipboardPasteCommand} from '../../../../history/commands/NodeClipboardPaste';\nimport {NodeConnetionsHelper} from '../helpers/NodeConnectionsHelper';\nimport {NodesSubnetCollapseCommand} from '../../../../history/commands/NodesSubnetCollapse';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {KEY_BY_VIEWER_ACTION, ViewerKeyActionName} from '../../viewer/mixins/Common';\nimport {NodeInfoController} from '../../../../store/controllers/editor/NodeInfoController';\n\ntype EventCallback = (event: KeyboardEvent) => void;\ntype EventContainer = Record<string, EventCallback>;\ninterface SetupEventKeyOptions {\n\tmode: Ref<NetworkAction | null>;\n\tclipboard_helper: NetworkClipBoardHelper;\n\tcam_animation_helper: CameraAnimationHelper;\n\ttab_menu_options: TabMenuOptions;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n\ttoggleListMode: () => void;\n\ttoggleParamsDisplayed: () => void;\n\tcontext: SetupContext<'hide'[]>;\n}\n\nexport function SetupEventKey(options: SetupEventKeyOptions) {\n\tconst {\n\t\tmode,\n\t\tclipboard_helper,\n\t\tcam_animation_helper,\n\t\ttab_menu_options,\n\t\tsetupLinkIndex,\n\t\ttoggleParamsDisplayed,\n\t\ttoggleListMode,\n\t\tcontext,\n\t} = options;\n\tfunction onKeypress(event: KeyboardEvent) {\n\t\treturn false;\n\t}\n\n\tconst route = useRoute();\n\n\t// better to have Tab on key down,\n\t// otherwise, it gets detected when switching windows with alt+tab\n\tfunction onKeydown(event: KeyboardEvent): boolean {\n\t\tfunction openTabMenu(useCombobox: boolean) {\n\t\t\ttab_menu_options.toggle_tab_menu({\n\t\t\t\tuseCombobox,\n\t\t\t});\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\n\t\tlet key_processed = true;\n\n\t\tconst CTRL_EVENTS: EventContainer = {};\n\t\tconst SHIFT_EVENTS: EventContainer = {};\n\t\tconst NO_MODIFIER_EVENTS: EventContainer = {};\n\t\tfunction addCallback(container: Record<string, Function>, key: string, func: EventCallback) {\n\t\t\tconst currentFunc = container[key];\n\t\t\tif (currentFunc) {\n\t\t\t\tconsole.error('callback already exists', container, key, func);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontainer[key] = func;\n\t\t}\n\t\taddCallback(CTRL_EVENTS, 'a', (event) => {\n\t\t\tselectAllNodes();\n\t\t\t// stop event to avoid selecting all text\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t});\n\t\taddCallback(CTRL_EVENTS, 'c', copy);\n\t\taddCallback(CTRL_EVENTS, 'Tab', () => {\n\t\t\t// it seems we can't run this with ctrlKey, but I haven't yet tested with metaKey\n\t\t\topenTabMenu(true);\n\t\t});\n\t\taddCallback(CTRL_EVENTS, 'v', paste);\n\t\taddCallback(CTRL_EVENTS, 'x', cut);\n\n\t\taddCallback(SHIFT_EVENTS, 'c', collapseSelectionIntoSubnet);\n\t\taddCallback(SHIFT_EVENTS, 'C', collapseSelectionIntoSubnet);\n\t\taddCallback(SHIFT_EVENTS, 'r', shiftSelectedNodeInputs);\n\t\taddCallback(SHIFT_EVENTS, 'R', shiftSelectedNodeInputs);\n\t\taddCallback(SHIFT_EVENTS, 'Tab', () => openTabMenu(true));\n\n\t\taddCallback(NO_MODIFIER_EVENTS, 'Delete', deleteIfNoModalOpen);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'Backspace', deleteIfNoModalOpen);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'a', goBackward);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'b', bypassSelectedNodes);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'd', goForward);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'e', toggleParamsDisplayed);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'f', () => cam_animation_helper.frameSelection());\n\t\taddCallback(NO_MODIFIER_EVENTS, 'i', goDown);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'l', toggleListMode);\n\t\taddCallback(NO_MODIFIER_EVENTS, 's', goUp);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'q', nodeInfoDisplayToggle);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'u', goUp);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'w', goDown);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'x', setDisplayFlagToSelectedNode);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'Escape', escape);\n\t\taddCallback(NO_MODIFIER_EVENTS, 'Tab', () => openTabMenu(false));\n\t\taddCallback(NO_MODIFIER_EVENTS, KEY_BY_VIEWER_ACTION[ViewerKeyActionName.TOGGLE_OVERLAY_NETWORK], () =>\n\t\t\tcontext.emit('hide')\n\t\t);\n\n\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\tconst callback = CTRL_EVENTS[event.key];\n\t\t\tif (callback) {\n\t\t\t\tcallback(event);\n\t\t\t} else {\n\t\t\t\tkey_processed = false;\n\t\t\t}\n\t\t} else {\n\t\t\tif (event.shiftKey) {\n\t\t\t\tconst callback = SHIFT_EVENTS[event.key];\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback(event);\n\t\t\t\t} else {\n\t\t\t\t\tkey_processed = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst callback = NO_MODIFIER_EVENTS[event.key];\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback(event);\n\t\t\t\t} else {\n\t\t\t\t\tkey_processed = false;\n\t\t\t\t}\n\t\t\t\t// switch (event.key) {\n\t\t\t\t// \tcase 'Delete':\n\t\t\t\t// \t// in order to test backspace on linux, I use the same condition as for backspace\n\t\t\t\t// \tcase 'Backspace': {\n\t\t\t\t// \t\t// using backspace is very dangerous,\n\t\t\t\t// \t\t// since it currently means nodes can be deleted\n\t\t\t\t// \t\t// when pressing it while editing a field (such as from the polyNodeUpdateForm)\n\t\t\t\t// \t\t// or when the tab menu is open.\n\t\t\t\t// \t\t//\n\t\t\t\t// \t\t//\n\t\t\t\t// \t\t// 2 solutions to help avoid this:\n\t\t\t\t// \t\t//\n\t\t\t\t// \t\t// - we use events on all input that can accept backspace key (input with type=\"number\" and type=\"text\"). It looks like this:\n\t\t\t\t// \t\t//\n\t\t\t\t// \t\t// @keypress.stop=\"\"\n\t\t\t\t// \t\t// @keyup.stop=\"\"\n\t\t\t\t// \t\t// @keydown.stop=\"\"\n\t\t\t\t// \t\t//\n\t\t\t\t// \t\t// - we test the route to make sure we are on root\n\t\t\t\t// \t\t// which should be a good enough condition telling use that we do not have a modal open, and we therefore are not editing an input on that modal\n\t\t\t\t// \t\t//\n\t\t\t\t// \t\t//\n\n\t\t\t\t// \t\tif (StoreController.editor.anyModalOpen(route) == true) {\n\t\t\t\t// \t\t\tbreak;\n\t\t\t\t// \t\t}\n\n\t\t\t\t// \t\tdeleteSelectedNodes();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'a': {\n\t\t\t\t// \t\tStoreController.editor.navigationHistory.goBackward(setupLinkIndex.linkIndex.value);\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'd': {\n\t\t\t\t// \t\tStoreController.editor.navigationHistory.goForward(setupLinkIndex.linkIndex.value);\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 's':\n\t\t\t\t// \tcase 'u': {\n\t\t\t\t// \t\tStoreController.editor.goUp(setupLinkIndex.linkIndex.value);\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'w':\n\t\t\t\t// \tcase 'i': {\n\t\t\t\t// \t\tStoreController.editor.goDown(setupLinkIndex.linkIndex.value);\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'b': {\n\t\t\t\t// \t\tbypassSelectedNodes();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'x': {\n\t\t\t\t// \t\tsetDisplayFlagToSelectedNode();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'f': {\n\t\t\t\t// \t\tcam_animation_helper.frameSelection();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase KEY_BY_VIEWER_ACTION[ViewerKeyActionName.TOGGLE_OVERLAY_NETWORK]: {\n\t\t\t\t// \t\tcontext.emit('hide');\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'l': {\n\t\t\t\t// \t\ttoggleListMode();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'e': {\n\t\t\t\t// \t\ttoggleParamsDisplayed();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'Escape': {\n\t\t\t\t// \t\tmode.value = null;\n\t\t\t\t// \t\ttab_menu_options.close_tab_menu();\n\t\t\t\t// \t\ttab_menu_options.close_node_create();\n\t\t\t\t// \t\tStoreController.editor.captureForm.interrupt();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tcase 'Tab': {\n\t\t\t\t// \t\topenTabMenu(false);\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \t}\n\t\t\t\t// \tdefault:\n\t\t\t\t// \t\t//this.add_to_context_menu_filter(event.key)\n\t\t\t\t// \t\tkey_processed = false;\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t\treturn key_processed;\n\t}\n\n\tfunction onKeyup(event: KeyboardEvent) {\n\t\treturn false;\n\t}\n\n\tfunction goBackward() {\n\t\tStoreController.editor.navigationHistory.goBackward(setupLinkIndex.linkIndex.value);\n\t}\n\tfunction goForward() {\n\t\tStoreController.editor.navigationHistory.goForward(setupLinkIndex.linkIndex.value);\n\t}\n\tfunction goUp() {\n\t\tStoreController.editor.goUp(setupLinkIndex.linkIndex.value);\n\t}\n\tfunction goDown() {\n\t\tStoreController.editor.goDown(setupLinkIndex.linkIndex.value);\n\t}\n\tfunction escape() {\n\t\tmode.value = null;\n\t\ttab_menu_options.close_tab_menu();\n\t\ttab_menu_options.close_node_create();\n\t\tStoreController.editor.captureForm.interrupt();\n\t}\n\tfunction nodeInfoDisplayToggle() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (!(node && node.childrenAllowed() && node.childrenController)) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodes: BaseNodeType[] = [];\n\t\tnode.childrenController.selection.nodes(nodes);\n\t\tconst firstNode = nodes[0];\n\t\tif (!firstNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst firstNodeStatus = NodeInfoController.displayedByNodeId.value[firstNode.graphNodeId()] || false;\n\t\tfor (const node of nodes) {\n\t\t\tNodeInfoController.displayedByNodeId.value[node.graphNodeId()] = !firstNodeStatus;\n\t\t}\n\t}\n\n\tfunction deleteIfNoModalOpen() {\n\t\t// case 'Delete':\n\t\t// in order to test backspace on linux, I use the same condition as for backspace\n\t\t// case 'Backspace': {\n\t\t// using backspace is very dangerous,\n\t\t// since it currently means nodes can be deleted\n\t\t// when pressing it while editing a field (such as from the polyNodeUpdateForm)\n\t\t// or when the tab menu is open.\n\t\t//\n\t\t//\n\t\t// 2 solutions to help avoid this:\n\t\t//\n\t\t// - we use events on all input that can accept backspace key (input with type=\"number\" and type=\"text\"). It looks like this:\n\t\t//\n\t\t// @keypress.stop=\"\"\n\t\t// @keyup.stop=\"\"\n\t\t// @keydown.stop=\"\"\n\t\t//\n\t\t// - we test the route to make sure we are on root\n\t\t// which should be a good enough condition telling use that we do not have a modal open, and we therefore are not editing an input on that modal\n\t\t//\n\t\t//\n\n\t\tif (StoreController.editor.anyModalOpen(route) == true) {\n\t\t\treturn;\n\t\t}\n\n\t\tdeleteSelectedNodes();\n\t\t// break;\n\t\t// }\n\t}\n\n\tasync function deleteSelectedNodes() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (node && node.childrenAllowed() && node.childrenController) {\n\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\tnode.childrenController.selection.nodes(nodes);\n\t\t\tconst command = new NodeDeleteCommand(node, nodes);\n\t\t\tawait Editor.instance().pushCommand(command);\n\t\t}\n\t}\n\tasync function bypassSelectedNodes() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (node && node.childrenAllowed() && node.childrenController) {\n\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\tnode.childrenController.selection.nodes(nodes);\n\t\t\tconst command = new SetFlagBypassCommand(node, nodes);\n\t\t\tawait Editor.instance().pushCommand(command);\n\t\t}\n\t}\n\tasync function setDisplayFlagToSelectedNode() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (node && node.childrenAllowed() && node.childrenController) {\n\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\tnode.childrenController.selection.nodes(nodes);\n\t\t\tconst command = new SetFlagDisplayCommand(node, nodes);\n\t\t\tawait Editor.instance().pushCommand(command);\n\t\t}\n\t}\n\n\t//\n\t//\n\t// BUFFER COPY/PASTE\n\t//\n\t//\n\tasync function selectAllNodes() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (node && node.childrenAllowed() && node.childrenController) {\n\t\t\tconst command = new NodeSelectCommand(node, node.children(), SelectionMethod.OVERRIDE);\n\t\t\tawait Editor.instance().pushCommand(command);\n\t\t}\n\t}\n\tasync function cut() {\n\t\tawait copy();\n\t\tdeleteSelectedNodes();\n\t}\n\t//\n\tasync function copy() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (node) {\n\t\t\tawait clipboard_helper.copySelection(node);\n\t\t} else {\n\t\t\tconsole.warn('copy: no node');\n\t\t}\n\t}\n\tasync function paste() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tif (node) {\n\t\t\tconst command = new NodeClipboardPasteCommand(\n\t\t\t\tnode,\n\t\t\t\tsetupLinkIndex.linkIndex.value,\n\t\t\t\tcam_animation_helper.position()\n\t\t\t);\n\t\t\tawait Editor.instance().pushCommand(command);\n\t\t} else {\n\t\t\tconsole.warn('paste: no node');\n\t\t}\n\t}\n\tasync function collapseSelectionIntoSubnet() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\tnode.childrenController?.selection.nodes(selectedNodes);\n\t\tif (!selectedNodes) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmd = new NodesSubnetCollapseCommand(node, selectedNodes);\n\t\tawait Editor.instance().pushCommand(cmd);\n\t}\n\n\tfunction shiftSelectedNodeInputs() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndex.linkIndex.value);\n\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\tnode.childrenController?.selection.nodes(selectedNodes);\n\t\tif (!selectedNodes) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodeConnetionsHelper = new NodeConnetionsHelper(node, selectedNodes);\n\t\tnodeConnetionsHelper.shiftInputs();\n\t}\n\n\treturn {\n\t\tonKeypress,\n\t\tonKeydown,\n\t\tonKeyup,\n\t\tdeleteSelectedNodes,\n\t\tcut,\n\t\tcopy,\n\t\tpaste,\n\t};\n}\n","import {EventHelper} from './../../../../core/EventHelper';\n// import EventHelper from '../../Helper/Event';\nimport {MouseButton} from '../../../../../../@polygonjs/polygonjs/src/core/MouseButton';\n\nimport {Ref} from 'vue';\nimport {NodeAnimationHelper} from '../helpers/NodeAnimation';\nimport {ConnectionHelper} from '../helpers/Connection';\nimport {NodeSelectionHelper} from '../helpers/NodeSelection';\nimport {CameraAnimationHelper} from '../helpers/CameraAnimation';\nimport {NodeCreationHelper} from '../helpers/NodeCreation';\nimport {TabMenuOptions} from './TabMenuOwner';\nimport {MultiPlayerFunctions} from './MultiPlayer';\nimport {KeyEventsDispatcher, KeyEventProcessor} from '../../../../helpers/KeyEventsDispatcher';\nimport {SetupCameraOptions} from './Camera';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {NodeContext} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n// import {EditorUserAgent} from '../../../../core/UserAgent';\n\n// import Hammer from 'hammerjs';\n// // @ts-ignore\n// import TouchEmulator from 'hammer-touchemulator';\n// const doPan = false;\n// // const doPinch = false;\n// const touchPan = false;\n// const touchZoom = false;\n// const isTouchOrMobile = EditorUserAgent.isTouchOrMobile();\n// const debugHammer = isTouchOrMobile;\n// if (debugHammer) {\n// \t// TouchEmulator();\n// }\n// export function logHammer(message: string) {\n// \t_debugElement = _debugElement || document.getElementById('debug-hammer');\n// \tif (_debugElement) {\n// \t\t_debugElement.innerText = message;\n// \t\tconsole.log(message);\n// \t}\n// }\n\nexport interface Helpers {\n\tbuttonStart: Ref<MouseButton | null>;\n\tmode: Ref<NetworkAction | null>;\n\tnode_animation_helper: NodeAnimationHelper;\n\tconnection_helper: ConnectionHelper<NodeContext>;\n\tnode_selection_helper: NodeSelectionHelper;\n\tcam_animation_helper: CameraAnimationHelper;\n\tnode_creation_helper: NodeCreationHelper;\n\tnodes_container: Ref<HTMLElement | null>;\n}\nexport interface SetupEventMouseOptions {\n\tevent_key_options: KeyEventProcessor;\n\ttab_menu_options: TabMenuOptions;\n\tcamera_options: SetupCameraOptions;\n\tmultiPlayer: MultiPlayerFunctions;\n}\n\nexport enum NetworkAction {\n\tCAMERA_PAN = 'CAMERA_PAN',\n\tCAMERA_ZOOM = 'CAMERA_ZOOM',\n\tCONNECT = 'CONNECT',\n\tNODE_CREATE = 'NODE_CREATE',\n\tNODE_MOVE = 'NODE_MOVE',\n\tSELECTION_RECTANGLE_CREATE = 'SELECTION_RECTANGLE_CREATE',\n}\n\n// let _debugElement: HTMLElement | null = null;\n\n// export interface HammerCallbacks {\n// \tcreate: () => void;\n// \tdispose: () => void;\n// }\n\nexport function SetupEventMouse(\n\thelpers: Helpers,\n\toptions: SetupEventMouseOptions,\n\tsetupLinkIndex: SetupLinkIndexReturn\n) {\n\tconst {buttonStart, mode, node_selection_helper, cam_animation_helper, nodes_container} = helpers;\n\tconst {event_key_options, tab_menu_options, camera_options} = options;\n\n\t// onMounted()\n\tfunction ontouchstart(event: TouchEvent) {\n\t\t// console.log('ontouchstart', event);\n\t\tif (event.touches.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\t_addDocumentTouchEvents();\n\t\tswitch (event.touches.length) {\n\t\t\tcase 1: {\n\t\t\t\tnode_selection_helper.moveStart(event);\n\t\t\t\tmode.value = NetworkAction.SELECTION_RECTANGLE_CREATE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2: {\n\t\t\t\t// stop the node_selection_helper as soon as we have 2 touches detected\n\t\t\t\tnode_selection_helper.move_end(event);\n\t\t\t\t// const averagePos = touchesAveragePos(event.touches);\n\t\t\t\t// const dist = touchesDist(event.touches);\n\t\t\t\t// if (averagePos) {\n\t\t\t\tcam_animation_helper.touchStart(event);\n\t\t\t\t// }\n\t\t\t\t// if (dist != null) {\n\t\t\t\t// cam_animation_helper.touchZoomStart(dist);\n\t\t\t\t// }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tEventHelper.stopEvent(event);\n\t}\n\n\tfunction ontouchmove(event: TouchEvent) {\n\t\t// console.log('ontouchmove', event);\n\t\tif (event.touches.length < 2) {\n\t\t\treturn;\n\t\t}\n\t\tcam_animation_helper.touchProgress(event);\n\t\t// const averagePos = touchesAveragePos(event.touches);\n\t\t// const dist = touchesDist(event.touches);\n\t\t// if (averagePos) {\n\t\t// \tcam_animation_helper.touchPanProgress(averagePos);\n\t\t// }\n\t\t// if (dist != null) {\n\t\t// \tcam_animation_helper.touchZoomProgress(dist);\n\t\t// }\n\t}\n\tfunction ontouchend(event: TouchEvent) {\n\t\t// console.log('ontouchend', event);\n\t\t// cam_animation_helper.pan_end();\n\t\tcam_animation_helper.touchEnd();\n\t\t_removeDocumentTouchEvents();\n\t}\n\tfunction _addDocumentTouchEvents() {\n\t\tdocument.addEventListener('touchmove', ontouchmove);\n\t\tdocument.addEventListener('touchend', ontouchend);\n\t}\n\tfunction _removeDocumentTouchEvents() {\n\t\tdocument.removeEventListener('touchmove', ontouchmove);\n\t\tdocument.removeEventListener('touchend', ontouchend);\n\t}\n\n\t// let _hammerManager: HammerManager | undefined;\n\t// onMounted(createHammer);\n\t// connection_helper.setHammerCallbacks({create: createHammer, dispose: disposeHammer});\n\t// function createHammer() {\n\t// \tif (_hammerManager) {\n\t// \t\treturn;\n\t// \t}\n\t// \tif (true || (isTouchOrMobile && nodes_container.value)) {\n\t// \t\t// pan\n\n\t// \t\tif (doPan) {\n\t// \t\t\tconsole.log('hammer pre create', nodes_container.value!.style);\n\t// \t\t\t_hammerManager = new Hammer(nodes_container.value!);\n\t// \t\t\tconsole.log('hammer CREATE', nodes_container.value!.style);\n\t// \t\t\tlogHammer(`tm:${isTouchOrMobile}`);\n\t// \t\t\tif (isTouchOrMobile) {\n\t// \t\t\t\t// if debugHammer on desktop is needed, hammertime.get will prevent it\n\t// \t\t\t\t// from working\n\n\t// \t\t\t\t_hammerManager.get('pan').set({pointers: 2, threshold: 5});\n\t// \t\t\t}\n\t// \t\t\t_hammerManager.on('panstart', function (ev) {\n\t// \t\t\t\t// logHammer('panstart');\n\t// \t\t\t\tconst pointers = ev.pointers as PointerEvent[];\n\t// \t\t\t\tif (touchPan) {\n\t// \t\t\t\t\tconst averagePos = pointersAveragePos(pointers);\n\t// \t\t\t\t\tif (averagePos != null) {\n\t// \t\t\t\t\t\tcam_animation_helper.touchPanStart(averagePos);\n\t// \t\t\t\t\t}\n\t// \t\t\t\t}\n\t// \t\t\t\tconst dist = pointersDist(pointers);\n\t// \t\t\t\tif (touchZoom) {\n\t// \t\t\t\t\tif (dist != null) {\n\t// \t\t\t\t\t\tcam_animation_helper.touchZoomStart(dist);\n\t// \t\t\t\t\t}\n\t// \t\t\t\t}\n\t// \t\t\t});\n\t// \t\t\t_hammerManager.on('pan', function (ev) {\n\t// \t\t\t\t// logHammer(\n\t// \t\t\t\t// \t[\n\t// \t\t\t\t// \t\t// `${ev.srcEvent.constructor.name}`,\n\t// \t\t\t\t// \t\t// `dx:${ev.deltaX}`,\n\t// \t\t\t\t// \t\t// `d:${Math.round(ev.distance)}`,\n\t// \t\t\t\t// \t\t// `s:${ev.scale}`,\n\t// \t\t\t\t// \t\t`p:${ev.pointers.length}`,\n\t// \t\t\t\t// \t].join(',')\n\t// \t\t\t\t// );\n\t// \t\t\t\t// if (ev.isFirst) {\n\t// \t\t\t\t// \tcam_animation_helper.pan_start(ev.srcEvent, camera_options);\n\t// \t\t\t\t// } else {\n\t// \t\t\t\t// \tif (ev.isFinal) {\n\t// \t\t\t\t// \t\tcam_animation_helper.pan_end();\n\t// \t\t\t\t// \t} else {\n\t// \t\t\t\tconst pointers = ev.pointers as PointerEvent[];\n\t// \t\t\t\tif (touchPan) {\n\t// \t\t\t\t\tconst averagePos = pointersAveragePos(pointers);\n\t// \t\t\t\t\tif (averagePos != null) {\n\t// \t\t\t\t\t\tcam_animation_helper.touchPanProgress(averagePos);\n\t// \t\t\t\t\t}\n\t// \t\t\t\t}\n\t// \t\t\t\tconst dist = pointersDist(pointers);\n\t// \t\t\t\tif (dist != null) {\n\t// \t\t\t\t\tif (touchZoom) cam_animation_helper.touchZoomProgress(dist);\n\t// \t\t\t\t}\n\t// \t\t\t});\n\t// \t\t\t_hammerManager.on('panend', function (ev) {\n\t// \t\t\t\t// logHammer('panend');\n\t// \t\t\t\tcam_animation_helper.pan_end();\n\t// \t\t\t\tif (touchZoom) {\n\t// \t\t\t\t\tcam_animation_helper.touchZoomEnd();\n\t// \t\t\t\t}\n\t// \t\t\t});\n\t// \t\t}\n\t// \t\t// pinch\n\t// \t\t// if (doPinch) {\n\t// \t\t// \thammertime.get('pinch').set({enable: true, pointers: 1});\n\t// \t\t// \thammertime.on('pinchstart', function (ev) {\n\t// \t\t// \t\tlogHammer('pinchstart');\n\t// \t\t// \t\tcam_animation_helper.zoom_start(ev.srcEvent);\n\t// \t\t// \t});\n\t// \t\t// \thammertime.on('pinch', function (ev) {\n\t// \t\t// \t\tlogHammer('pinch');\n\t// \t\t// \t\tconsole.log(ev.type, ev.scale, ev.eventType, ev.pointers);\n\t// \t\t// \t\t// if (ev.isFirst) {\n\t// \t\t// \t\t// \tcam_animation_helper.pan_start(ev.srcEvent, camera_options);\n\t// \t\t// \t\t// } else {\n\t// \t\t// \t\t// \tif (ev.isFinal) {\n\t// \t\t// \t\t// \t\tcam_animation_helper.pan_end();\n\t// \t\t// \t\t// \t} else {\n\t// \t\t// \t\tcam_animation_helper.zoom_progress(ev.srcEvent);\n\t// \t\t// \t\t// }\n\t// \t\t// \t\t// }\n\t// \t\t// \t});\n\t// \t\t// \thammertime.on('pinchend', function (ev) {\n\t// \t\t// \t\tlogHammer('pinchend');\n\t// \t\t// \t\tcam_animation_helper.zoom_end();\n\t// \t\t// \t});\n\t// \t\t// }\n\t// \t}\n\t// }\n\t// function disposeHammer() {\n\t// \tif (!_hammerManager) {\n\t// \t\treturn;\n\t// \t}\n\t// \t_hammerManager.destroy();\n\t// \t_hammerManager = undefined;\n\t// \tconsole.log('hammer dispose', nodes_container.value);\n\t// \tnodes_container.value!.removeAttribute('style');\n\t// \tnodes_container.value!.style.touchAction = 'none';\n\t// }\n\n\t// const pointers: PointerEvent[] = [];\n\t// const pointerPositions: Array<Vector2> = [];\n\tfunction on_pointer_down(event: PointerEvent) {\n\t\tif (mode.value != null) {\n\t\t\treturn;\n\t\t}\n\t\t// if (pointers.length === 0) {\n\t\t// nodes_container.value?.setPointerCapture(event.pointerId);\n\n\t\t// }\n\t\t// addPointer(event);\n\n\t\tif (event.pointerType === 'touch') {\n\t\t\t// \tonTouchStart(event);\n\t\t} else {\n\t\t\t// nodes_container.value?.addEventListener('pointermove', on_pointer_move);\n\t\t\tnodes_container.value?.addEventListener('pointerup', on_pointer_up);\n\t\t\tonMouseDown(event);\n\t\t}\n\t}\n\n\tfunction onMouseDown(event: PointerEvent) {\n\t\tbuttonStart.value = event.button;\n\t\tswitch (event.button) {\n\t\t\tcase MouseButton.LEFT:\n\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\tcam_animation_helper.pan_start(event, camera_options);\n\t\t\t\t\tmode.value = NetworkAction.CAMERA_PAN;\n\t\t\t\t} else {\n\t\t\t\t\tnode_selection_helper.moveStart(event);\n\t\t\t\t\tmode.value = NetworkAction.SELECTION_RECTANGLE_CREATE;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase MouseButton.MIDDLE:\n\t\t\t\tcam_animation_helper.pan_start(event, camera_options);\n\t\t\t\tmode.value = NetworkAction.CAMERA_PAN;\n\t\t\t\tbreak;\n\n\t\t\tcase MouseButton.RIGHT:\n\t\t\t\tcam_animation_helper.zoom_start(event, camera_options);\n\t\t\t\tmode.value = NetworkAction.CAMERA_ZOOM;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tfunction on_mouse_move(event: MouseEvent) {\n\t\tKeyEventsDispatcher.instance().registerProcessor(event_key_options);\n\t\t// this needs to be always active, so that the tab menu\n\t\t// can be positioned on desktop\n\t\ttab_menu_options.update_tab_menu_position(event);\n\t\toptions.multiPlayer.updateMultiPlayerCursor(event);\n\t\t// node_creation_helper.move_progress(event);\n\t}\n\tfunction on_pointer_up(event: PointerEvent) {\n\t\t// removePointer(event);\n\t\t// if (pointers.length === 0) {\n\t\t// nodes_container.value?.releasePointerCapture(event.pointerId);\n\t\t// nodes_container.value?.removeEventListener('pointermove', on_pointer_move);\n\t\tnodes_container.value?.removeEventListener('pointerup', on_pointer_up);\n\t\t// }\n\t\ttab_menu_options.close_tab_menu();\n\t}\n\n\t// function addPointer(event: PointerEvent) {\n\t// \tpointers.push(event);\n\t// }\n\n\t// function removePointer(event: PointerEvent) {\n\t// \tdelete pointerPositions[event.pointerId];\n\n\t// \tfor (let i = 0; i < pointers.length; i++) {\n\t// \t\tif (pointers[i].pointerId == event.pointerId) {\n\t// \t\t\tpointers.splice(i, 1);\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t}\n\t// }\n\t// function trackPointer(event: PointerEvent) {\n\t// \tlet position = pointerPositions[event.pointerId];\n\n\t// \tif (position === undefined) {\n\t// \t\tposition = new Vector2();\n\t// \t\tpointerPositions[event.pointerId] = position;\n\t// \t}\n\t// \tposition.set(event.pageX, event.pageY);\n\t// }\n\n\t// function on_double_click(event: MouseEvent) {\n\t// \t// const intersect = this.ray_helper.intersected_mesh_with_callback(event, 'dbl_click', this.camera);\n\t// \t// if (intersect != null) {\n\t// \t// \treturn intersect.callbacks['dbl_click']();\n\t// \t// }\n\t// }\n\tfunction on_click(event: MouseEvent) {\n\t\ttab_menu_options.close_tab_menu();\n\t\t// node_creation_helper.create(event);\n\t}\n\tfunction on_context_menu(event: MouseEvent) {\n\t\t//this.toggle_tab_menu()\n\t\t//event.stopPropagation()\n\t\treturn false;\n\t}\n\tfunction on_wheel(event: WheelEvent) {\n\t\tcam_animation_helper.zoomFromWheelEvent(event);\n\t\tconst id = StoreController.editor.current_node_graph_id(setupLinkIndex.linkIndex.value);\n\t\tif (id) {\n\t\t\tcamera_options.save_camera_history_for_json_node(id);\n\t\t}\n\t}\n\n\treturn {\n\t\ton_pointer_down,\n\t\ton_mouse_move,\n\t\ton_pointer_up,\n\t\ton_click,\n\t\ton_context_menu,\n\t\ton_wheel,\n\t\tontouchstart,\n\t\t// disposeHammer,\n\t\t// createHammer,\n\t};\n}\n","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {Vector2} from 'three';\n// import {MultiPlayerController} from './../../../../core/multiplayer/MultiplayerController';\nimport {StoreController} from './../../../../store/controllers/StoreController';\nimport {Ref, onMounted, onUnmounted, computed, watch} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nexport interface MultiPlayerFunctions {\n\tupdateMultiPlayerCursor: (event: TouchEvent | MouseEvent) => void;\n}\n\n// https://stackoverflow.com/questions/64990541/how-to-implement-debounce-in-vue3\n// function createDebounce() {\n// \tlet timeout: NodeJS.Timeout | undefined;\n// \treturn function (fnc: () => void, delayMs: number) {\n// \t\tclearTimeout(timeout as any);\n// \t\ttimeout = setTimeout(() => {\n// \t\t\tfnc();\n// \t\t}, delayMs);\n// \t};\n// }\ninterface SetupMultiPlayerOptions {\n\tnodesContainer: Ref<HTMLElement | null>;\n\tcameraData: Ref<MultiPlayer.Awareness.CameraData>;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n}\n\nconst DELAY = 100;\n\nexport function SetupMultiPlayer(options: SetupMultiPlayerOptions) {\n\tconst {nodesContainer, cameraData} = options;\n\tconst eventHelper: EventHelper = new EventHelper(document.body);\n\tlet _receivedAt: number = -1;\n\tlet _emittedAt: number = -1;\n\tlet _interval: NodeJS.Timeout | undefined;\n\tconst position = new Vector2();\n\tconst controller = StoreController.editor.multiPlayer;\n\tconst multiPlayerActive = computed(() => controller.active.value);\n\n\t/**\n\t *\n\t * start interval\n\t *\n\t */\n\tonMounted(_setEventHelper);\n\tonMounted(_startPeriodicCheck);\n\tonUnmounted(_closePeriodicCheck);\n\tfunction _setEventHelper() {\n\t\tif (nodesContainer.value) {\n\t\t\teventHelper.setElement(nodesContainer.value);\n\t\t} else {\n\t\t\tconsole.error('no nodesContainer found');\n\t\t}\n\t}\n\tfunction _startPeriodicCheck() {\n\t\t_interval = setInterval(_emitLastIfRequired, DELAY);\n\t}\n\tfunction _closePeriodicCheck() {\n\t\tclearInterval(_interval as any as number);\n\t}\n\t/**\n\t *\n\t * update pos\n\t *\n\t */\n\tfunction updateMultiPlayerCursor(event: TouchEvent | MouseEvent) {\n\t\tif (!controller.active.value) {\n\t\t\treturn;\n\t\t}\n\n\t\teventHelper.elementPosition(event, position);\n\t\tposition.divideScalar(cameraData.value.zoom);\n\n\t\t_emitNowIfAllowed();\n\t}\n\t/**\n\t *\n\t * update camera\n\t *\n\t */\n\twatch(cameraData, _updateCamera, {deep: true});\n\tfunction _updateCamera() {\n\t\tif (!controller.active.value) {\n\t\t\treturn;\n\t\t}\n\n\t\t_emitNowIfAllowed();\n\t}\n\t/**\n\t *\n\t * emit\n\t *\n\t */\n\tfunction _emitNowIfAllowed() {\n\t\tconst now = performance.now();\n\t\t_receivedAt = now;\n\n\t\tif (now - _emittedAt > DELAY) {\n\t\t\t_emit(now);\n\t\t}\n\t}\n\tfunction _emitLastIfRequired() {\n\t\tconst now = performance.now();\n\t\tif (_receivedAt > _emittedAt && now - _emittedAt > DELAY) {\n\t\t\t_emit(performance.now());\n\t\t}\n\t}\n\tfunction _emit(now: number) {\n\t\t_emittedAt = now;\n\t\tStoreController.editor.multiPlayer.awareness.updatePos(position);\n\t\tStoreController.editor.multiPlayer.awareness.updateCamera(cameraData.value);\n\t}\n\t// function onMultiplayerMouseMove(event: TouchEvent | MouseEvent) {\n\t// \tupdateMultiPlayerCursor(event);\n\t// }\n\tconst cursorScale = computed(() => 1 / cameraData.value.zoom);\n\n\treturn {\n\t\t// onMultiplayerMouseMove,\n\t\tmultiPlayerActive,\n\t\tupdateMultiPlayerCursor,\n\t\tcursorScale,\n\t};\n}\n","import {Ref, onMounted} from 'vue';\nimport {NodeAnimationHelper} from '../helpers/NodeAnimation';\nexport function SetupNodeAnimation(\n\tnode_animation_helper: NodeAnimationHelper,\n\tnodes_container: Ref<HTMLElement | null>\n) {\n\tonMounted(() => {\n\t\tif (nodes_container.value) {\n\t\t\tnode_animation_helper.set_element(nodes_container.value);\n\t\t}\n\t});\n\n\treturn {};\n}\n","import {ConnectionHelper} from '../helpers/Connection';\n// import {Constants} from '../helpers/Constants';\nimport {NodeContext} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n// const PADDING = 5;\n// import {StoreController} from '../../../../store/controllers/StoreController';\nimport {Ref, onMounted} from 'vue';\nexport function SetupNodeConnection(\n\t// node_connection_data: ConnectionData,\n\tconnection_helper: ConnectionHelper<NodeContext>,\n\tnodes_container: Ref<HTMLElement | null>\n) {\n\tonMounted(() => {\n\t\tif (nodes_container.value) {\n\t\t\tconnection_helper.set_element(nodes_container.value);\n\t\t}\n\t});\n\n\t// const connection_src_json_node = computed(() => {\n\t// \tconst id = node_connection_data.node_src_id;\n\t// \tif (id) {\n\t// \t\treturn StoreController.engine.json_node(id);\n\t// \t} else {\n\t// \t\treturn null;\n\t// \t}\n\t// });\n\t// const connection_dest_json_node = computed(() => {\n\t// \tconst id = node_connection_data.node_dest_id;\n\t// \tif (id) {\n\t// \t\treturn StoreController.engine.json_node(id);\n\t// \t} else {\n\t// \t\treturn null;\n\t// \t}\n\t// });\n\n\treturn {};\n}\n\n// export const NodeConnection = {\n\n// \tcomputed: {\n// \t\t,\n\n// node_connection_line_style_object(): object {\n// \tconst display = this.connection_line.active ? 'block' : 'none'\n// \tconst size = Constants.NODE_UNIT\n// \treturn {\n// \t\tdisplay: `${display}`,\n// \t\tleft: `${this.connection_line.position.x}px`,\n// \t\ttop: `${this.connection_line.position.y}px`,\n// \t\twidth: `${size}px`,\n// \t\theight: `${size}px`\n// \t}\n// }\n\n// connection_line_svg_style_object(){\n// \treturn {\n// \t\tleft: `${this.svg_src_point.x-PADDING}px`,\n// \t\ttop: `${this.svg_src_point.y-PADDING}px`,\n// \t\twidth: `${this.size.x + 2*PADDING}px`,\n// \t\theight: `${this.size.y + 2*PADDING}px`\n// \t}\n// },\n// connection_line_container_style_object(){\n// \tconst zoom = this.camera.zoom\n// \t// const zoom_inverse = (1/this.camera.zoom)\n// \tconst display = this.connection_line.active ? 'block' : 'none'\n// \treturn {\n// \t\tdisplay: display,\n// \t\tleft: `${-zoom*this.camera.position.x}px`,\n// \t\ttop: `${-zoom*this.camera.position.y}px`,\n// \t\ttransform: `scale(${this.camera.zoom})`\n// \t}\n// },\n\n// connection_line_start_point(){\n// \tif(this.connection_line.node_src_id){\n// \t\tconst json_node = this.$store.getters['engine/json_node'](this.connection_line.node_src_id)\n// \t\tconst pos = json_node.ui_data\n\n// \t\treturn {\n// \t\t\tx: (0.5 * Constants.NODE_UNIT + pos.x) + this.camera.position.x,\n// \t\t\ty: (4+10+ Constants.NODE_UNIT + pos.y) + this.camera.position.y\n// \t\t}\n// \t} else {\n// \t\tif(this.connection_line.node_dest_id){\n// \t\t\tconst json_node = this.$store.getters['engine/json_node'](this.connection_line.node_dest_id)\n// \t\t\tconst pos = json_node.ui_data\n\n// \t\t\treturn {\n// \t\t\t\tx: (0.5 * Constants.NODE_UNIT + pos.x) + this.camera.position.x,\n// \t\t\t\ty: (-4-10+ 0*Constants.NODE_UNIT + pos.y) + this.camera.position.y\n// \t\t\t}\n// \t\t} else {\n// \t\t\treturn {\n// \t\t\t\tx: 0,\n// \t\t\t\ty: 0\n// \t\t\t}\n// \t\t}\n// \t}\n// },\n// connection_line_end_point(){\n// \treturn {\n// \t\tx: this.connection_line.end_pos.x,\n// \t\ty: this.connection_line.end_pos.y\n// \t}\n// }\n// },\n\n// watch: {\n// \tjson_node(){\n// \t\tthis.$nextTick(() => {\n// \t\t\tthis.set_connection_helper_node()\n// \t\t});\n// \t}\n// },\n// methods: {\n// \tset_connection_helper_node(){\n// \t\tthis.connection_helper.set_parent_node(this.node)\n// \t}\n// }\n// };\n","import {NodeCreationHelper} from '../helpers/NodeCreation';\nimport {Constants} from '../../../../core/network/Constants';\nimport {StoreController} from '../../../../store/controllers/StoreController';\n\nimport {Ref, onMounted, computed, watch} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nexport function SetupNodeCreation(\n\tnodes_container: Ref<HTMLElement | null>,\n\tnode_creation_helper: NodeCreationHelper,\n\tsetupLinkIndexReturn: SetupLinkIndexReturn\n) {\n\tconst current_node_graph_id = computed(() =>\n\t\tStoreController.editor.current_node_graph_id(setupLinkIndexReturn.linkIndex.value)\n\t);\n\n\tonMounted(() => {\n\t\tif (nodes_container.value) {\n\t\t\tnode_creation_helper.setElement(nodes_container.value);\n\t\t}\n\t\tset_node_creation_helper_node();\n\t});\n\twatch(current_node_graph_id, (new_val, old_val) => {\n\t\tset_node_creation_helper_node();\n\t});\n\n\tconst node_creation_rectangle_style_object = computed(() => {\n\t\tconst active = node_creation_helper.active();\n\t\tif (active) {\n\t\t\tconst size = Constants.NODE_UNIT;\n\t\t\treturn {\n\t\t\t\tdisplay: 'block',\n\t\t\t\tleft: `${node_creation_helper.position().x}px`,\n\t\t\t\ttop: `${node_creation_helper.position().y}px`,\n\t\t\t\twidth: `${size}px`,\n\t\t\t\theight: `${size}px`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {display: 'none'};\n\t\t}\n\t});\n\n\tfunction set_node_creation_helper_node() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndexReturn.linkIndex.value);\n\t\tnode_creation_helper.setParentNode(node);\n\t}\n\n\treturn {node_creation_rectangle_style_object};\n}\n","import {Editor} from './../../../../Editor';\nimport {TabMenuOptions} from './TabMenuOwner';\nimport {Helpers, NetworkAction} from './EventMouse';\nimport {SetFlagDisplayCommand} from '../../../../history/commands/SetFlagDisplay';\nimport {SetFlagBypassCommand} from '../../../../history/commands/SetFlagBypass';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {NodeCreateCommandConnectionData} from '../../../../history/commands/NodeCreate';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\n\nexport function SetupNodeEvent(\n\thelpers: Helpers,\n\tsetupLinkIndexReturn: SetupLinkIndexReturn,\n\ttabMenuOptions: TabMenuOptions\n) {\n\tconst {node_animation_helper, connection_helper, mode, node_creation_helper, nodes_container} = helpers;\n\n\tfunction on_capture_node_for_move(event: MouseEvent, id: CoreGraphNodeId) {\n\t\tif (mode.value == null) {\n\t\t\tnode_animation_helper.capture_node(id);\n\t\t\tmode.value = NetworkAction.NODE_MOVE;\n\t\t\tnode_animation_helper.move_start(event);\n\t\t}\n\t}\n\tfunction on_capture_node_for_contextMenu(id: CoreGraphNodeId) {\n\t\tif (\n\t\t\tmode.value == null ||\n\t\t\t(mode.value == NetworkAction.NODE_MOVE && node_animation_helper.mouse_barely_moved())\n\t\t) {\n\t\t\tStoreController.editor.contextMenu.setNodeId(id, tabMenuOptions.open_tab_menu);\n\t\t}\n\t}\n\t// function on_capture_node_for_selection(node: BaseNodeType) {\n\t// \tthis.debug_node_infos(node);\n\n\t// \tnode_selection_helper.capture_node(node);\n\t// }\n\n\tfunction on_capture_node_src_for_connection(event: PointerEvent, id: CoreGraphNodeId, index: number) {\n\t\t// logHammer(`? ${mode.value}`);\n\t\tif (!nodes_container.value) {\n\t\t\treturn;\n\t\t}\n\t\tif (mode.value == null || mode.value == NetworkAction.CONNECT) {\n\t\t\tconnection_helper.capture_node_src(id, index, nodes_container.value, event);\n\t\t\tif (mode.value == null) {\n\t\t\t\tmode.value = NetworkAction.CONNECT;\n\t\t\t\tconnection_helper.move_start(event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mode.value == NetworkAction.CONNECT) {\n\t\t\t\tconnection_helper.move_end(event);\n\t\t\t}\n\t\t}\n\t}\n\tfunction on_capture_node_dest_for_connection(event: PointerEvent, id: CoreGraphNodeId, index: number) {\n\t\t// logHammer(`? dest ${mode.value}`);\n\t\tif (!nodes_container.value) {\n\t\t\treturn;\n\t\t}\n\t\tif (mode.value == null || mode.value == NetworkAction.CONNECT) {\n\t\t\tconnection_helper.capture_node_dest(id, index, nodes_container.value, event);\n\t\t\tif (mode.value == null) {\n\t\t\t\tmode.value = NetworkAction.CONNECT;\n\t\t\t\tconnection_helper.move_start(event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mode.value == NetworkAction.CONNECT) {\n\t\t\t\tconnection_helper.move_end(event);\n\t\t\t}\n\t\t}\n\t}\n\tfunction on_capture_node_input_for_node_creation(event: MouseEvent, id: CoreGraphNodeId, index: number) {\n\t\tconst node = StoreController.engine.node(id);\n\t\tif (node) {\n\t\t\tnode_creation_helper.setHoveredNodeInput(node, index);\n\t\t}\n\t}\n\tfunction on_capture_node_output_for_node_creation(event: MouseEvent, id: CoreGraphNodeId, index: number) {\n\t\tconst node = StoreController.engine.node(id);\n\t\tif (node) {\n\t\t\tnode_creation_helper.setHoveredNodeOutput(node, index);\n\t\t}\n\t}\n\tfunction on_release_node_input_for_node_creation(event: MouseEvent, id: CoreGraphNodeId, index: number) {\n\t\tconst node = StoreController.engine.node(id);\n\t\tif (node) {\n\t\t\tnode_creation_helper.unsetHoveredNodeInput();\n\t\t}\n\t}\n\tfunction on_release_node_output_for_node_creation(event: MouseEvent, id: CoreGraphNodeId, index: number) {\n\t\tconst node = StoreController.engine.node(id);\n\t\tif (node) {\n\t\t\tnode_creation_helper.unsetHoveredNodeOutput();\n\t\t}\n\t}\n\tfunction on_capture_node_final_for_connection(event: PointerEvent, id: CoreGraphNodeId) {\n\t\tif (mode.value == NetworkAction.CONNECT) {\n\t\t\tconnection_helper.capture_node_final(id);\n\t\t\tconnection_helper.move_end(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\t}\n\tfunction on_capture_connection_for_node_creation(data: NodeCreateCommandConnectionData) {\n\t\tnode_creation_helper.setHoveredConnection(data);\n\t}\n\tfunction on_release_connection_for_node_creation() {\n\t\tnode_creation_helper.unsetHoveredConnection();\n\t}\n\t// function on_capture_node_for_select(event: MouseEvent, id: CoreGraphNodeId) {\n\t// \tif (mode.value == null) {\n\t// \t\tnode_selection_helper.updateMethodFromEvent(event);\n\t// \t\tnode_selection_helper.capture_node(id);\n\t// \t\tevent.preventDefault();\n\t// \t\tevent.stopPropagation();\n\t// \t\tevent.stopImmediatePropagation();\n\t// \t}\n\t// }\n\tasync function on_set_display_flag(id: CoreGraphNodeId) {\n\t\tconst node = StoreController.engine.node(id)!;\n\t\tconst current_node = StoreController.editor.currentNode(setupLinkIndexReturn.linkIndex.value);\n\t\tif (current_node && current_node.childrenAllowed() && current_node.childrenController) {\n\t\t\tconst selection = current_node.childrenController.selection;\n\t\t\tconst _tmp: BaseNodeType[] = [];\n\t\t\tconst nodes = selection.contains(node) ? selection.nodes(_tmp) : [node];\n\n\t\t\tconst cmd = new SetFlagDisplayCommand(current_node, nodes);\n\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t}\n\t}\n\tasync function on_set_bypass_flag(id: CoreGraphNodeId) {\n\t\tconst node = StoreController.engine.node(id)!;\n\t\tconst current_node = StoreController.editor.currentNode(setupLinkIndexReturn.linkIndex.value);\n\t\tif (current_node && current_node.childrenAllowed() && current_node.childrenController) {\n\t\t\tconst selection = current_node.childrenController.selection;\n\t\t\tconst _tmp: BaseNodeType[] = [];\n\t\t\tconst nodes = selection.contains(node) ? selection.nodes(_tmp) : [node];\n\n\t\t\tconst cmd = new SetFlagBypassCommand(current_node, nodes);\n\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t}\n\t}\n\n\treturn {\n\t\ton_capture_node_for_move,\n\t\ton_capture_node_src_for_connection,\n\t\ton_capture_node_dest_for_connection,\n\t\ton_capture_node_input_for_node_creation,\n\t\ton_capture_node_output_for_node_creation,\n\t\ton_release_node_input_for_node_creation,\n\t\ton_release_node_output_for_node_creation,\n\t\ton_capture_node_final_for_connection,\n\t\ton_capture_node_for_contextMenu,\n\t\ton_capture_connection_for_node_creation,\n\t\ton_release_connection_for_node_creation,\n\t\t// on_capture_node_for_select,\n\t\ton_set_display_flag,\n\t\ton_set_bypass_flag,\n\t};\n}\n","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport type {NodeSerializerData} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {Ref, ComputedRef, computed} from 'vue';\n\nexport interface SetupNodesVisibilityOptions {\n\tcameraData: Ref<MultiPlayer.Awareness.CameraData>;\n\tjson_children: ComputedRef<NodeSerializerData[]>;\n\tcanvas: Ref<HTMLCanvasElement | null>;\n}\n\nexport function SetupNodeVisibleState(options: SetupNodesVisibilityOptions) {\n\tconst jsonChildren = options.json_children;\n\tconst {canvas, cameraData} = options;\n\n\tconst nodeFullVisibleStates = computed(() => {\n\t\tconst list: boolean[] = new Array(jsonChildren.value.length).fill(true);\n\t\tif (!canvas.value) {\n\t\t\treturn list;\n\t\t}\n\n\t\tconst {position, zoom} = cameraData.value;\n\t\tconst rect = canvas.value.getBoundingClientRect();\n\t\tconst halfW = (rect.width * 0.5) / zoom;\n\t\tconst halfH = (rect.height * 0.5) / zoom;\n\t\tconst padding = 200 / zoom;\n\t\tlet i = 0;\n\t\tfor (let jsonChild of jsonChildren.value) {\n\t\t\tconst {x, y} = jsonChild.ui_data_json;\n\t\t\tconst minX = -position.x - halfW - padding;\n\t\t\tconst maxX = -position.x + halfW + padding;\n\t\t\tconst minY = -position.y - halfH - padding;\n\t\t\tconst maxY = -position.y + halfH + padding;\n\t\t\tconst isVisibleX = x > minX && x < maxX;\n\t\t\tconst isVisibleY = y > minY && y < maxY;\n\t\t\tconst isVisible = isVisibleX && isVisibleY;\n\n\t\t\tlist[i] = isVisible;\n\t\t\ti++;\n\t\t}\n\t\treturn list;\n\t});\n\n\treturn {nodeFullVisibleStates};\n}\n","import {NodeContext} from './../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {Vector2} from 'three';\nimport {NodeSelectionHelper, NodeSelectionData} from '../helpers/NodeSelection';\nimport {StoreController} from '../../../../store/controllers/StoreController';\n\nimport {Ref, onMounted, computed, watch} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nexport function SetupNodeSelection(\n\tnode_selection_data: NodeSelectionData,\n\tnode_selection_helper: NodeSelectionHelper,\n\tnodes_container: Ref<HTMLElement | null>,\n\tsetupLinkIndexReturn: SetupLinkIndexReturn\n) {\n\tconst current_node_graph_id = computed(() =>\n\t\tStoreController.editor.current_node_graph_id(setupLinkIndexReturn.linkIndex.value)\n\t);\n\n\tconst nodeChildrenContext = computed(() => {\n\t\tconst node = StoreController.engine.node(current_node_graph_id.value);\n\t\treturn node?.childrenController?.context || NodeContext.OBJ;\n\t});\n\n\tonMounted(() => {\n\t\tif (nodes_container.value) {\n\t\t\tnode_selection_helper.setElement(nodes_container.value);\n\t\t}\n\t\tset_selection_helper_node();\n\t});\n\twatch(current_node_graph_id, (new_val, old_val) => {\n\t\tset_selection_helper_node();\n\t});\n\n\tconst selection_rectangle_style_object = computed(() => {\n\t\tconst box = node_selection_helper.box();\n\t\tconst size = new Vector2();\n\t\tbox.getSize(size);\n\t\tconst display = node_selection_data.active ? 'block' : 'none';\n\t\treturn {\n\t\t\tdisplay: `${display}`,\n\t\t\tleft: `${box.min.x}px`,\n\t\t\ttop: `${box.min.y}px`,\n\t\t\twidth: `${size.x}px`,\n\t\t\theight: `${size.y}px`,\n\t\t};\n\t});\n\n\tfunction set_selection_helper_node() {\n\t\tconst node = StoreController.editor.currentNode(setupLinkIndexReturn.linkIndex.value);\n\t\tif (node) {\n\t\t\tnode_selection_helper.set_parent_node(node);\n\t\t}\n\t}\n\n\treturn {selection_rectangle_style_object, nodeChildrenContext};\n}\n","// import {Constants} from './../../../../core/network/Constants';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {Ref, computed} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {NodeSelectCommand} from '../../../../history/commands/NodeSelect';\nimport {SelectionMethod} from '../../../../core/Selection';\nimport {Editor} from '../../../../Editor';\n\ninterface Options {\n\t// networkCore: Ref<HTMLElement | null>;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n}\n\nexport function SetupParentNodeErrored(options: Options) {\n\tconst {setupLinkIndex} = options;\n\tconst jsonNode = computed(() => {\n\t\tconst id = StoreController.editor.current_node_graph_id(setupLinkIndex.linkIndex.value);\n\t\tif (id != null) {\n\t\t\treturn StoreController.engine.json_node(id);\n\t\t}\n\t});\n\tconst parentNodePath = computed(() => {\n\t\tif (jsonNode.value == null) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = StoreController.engine.node(jsonNode.value.graph_node_id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\treturn node.path();\n\t});\n\tconst parentNodeErrorMessage = computed(() => {\n\t\tif (jsonNode.value) {\n\t\t\treturn jsonNode.value.error_message;\n\t\t}\n\t});\n\tconst isParentNodeErrored: Readonly<Ref<boolean>> = computed(() => {\n\t\treturn parentNodeErrorMessage.value != null;\n\t});\n\n\tfunction _parentErrorGoUp() {\n\t\tStoreController.editor.goUp(setupLinkIndex.linkIndex.value);\n\t}\n\tasync function parentErrorGoUpAndSelect() {\n\t\tif (jsonNode.value == null) {\n\t\t\treturn;\n\t\t}\n\t\tconst node = StoreController.engine.node(jsonNode.value.graph_node_id);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst parentNode = node.parent();\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log('select', parentNode.path(), node.path());\n\t\tconst command = new NodeSelectCommand(parentNode, [node], SelectionMethod.OVERRIDE);\n\t\tawait Editor.instance().pushCommand(command);\n\t\t_parentErrorGoUp();\n\t}\n\n\tfunction onErrorMessageContextMenu(event: MouseEvent) {\n\t\t// const menu_node_id = StoreController.editor.contextMenu.nodeId();\n\t\tif (!jsonNode.value) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentNodeId = jsonNode.value.graph_node_id;\n\t\t// if (menu_node_id == current_node_id) {\n\t\t// _onContextmenuClose();\n\t\t// } else {\n\t\tStoreController.editor.contextMenu.setNodeId(currentNodeId);\n\t\t// }\n\t\tStoreController.editor.contextMenu.setPosition({\n\t\t\tx: event.pageX,\n\t\t\ty: event.pageY,\n\t\t});\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tevent.stopImmediatePropagation();\n\t}\n\t// function _onContextmenuClose() {\n\t// \tStoreController.editor.contextMenu.setNodeId(null);\n\t// }\n\n\treturn {\n\t\tparentNodePath,\n\t\tparentNodeErrorMessage,\n\t\tisParentNodeErrored,\n\t\tparentErrorGoUpAndSelect,\n\t\tonErrorMessageContextMenu,\n\t};\n}\n","import {StoreController} from './../../../../store/controllers/StoreController';\n\nimport {computed} from 'vue';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nexport function SetupPolyNodeLockedState(setupLinkIndexReturn: SetupLinkIndexReturn) {\n\tconst current_node_graph_id = computed(() =>\n\t\tStoreController.editor.current_node_graph_id(setupLinkIndexReturn.linkIndex.value)\n\t);\n\tconst currentPolyNodeLocked = computed(() => {\n\t\tconst jsonNode = StoreController.engine.json_node(current_node_graph_id.value);\n\t\tif (!jsonNode) {\n\t\t\treturn false;\n\t\t}\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id);\n\t\tif (!node) {\n\t\t\treturn false;\n\t\t}\n\t\treturn node.lockedOrInsideALockedParent();\n\t\t// return jsonNode?.polyNode?.locked || false;\n\t});\n\n\treturn {currentPolyNodeLocked};\n}\n","// import {MultiPlayer} from './../../../../npm_module/NpmModuleTypes';\nimport {Vector2Like} from './../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {Editor} from './../../../../Editor';\nimport {EditorUserAgent} from './../../../../core/UserAgent';\nimport {SetupLinkIndexReturn} from './../../common/LinkIndex';\nimport {NodeChangeType} from './../../../../core/NodeChangeType';\nimport {OpenTabMenuForChangeTypeCallback} from './../../../../store/controllers/editor/EditorContextMenuStoreController';\n// import lodash_last from 'lodash/last';\n\n// components\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nimport {Vector2} from 'three';\nimport {Ref, computed, ComputedRef} from 'vue';\nimport {NetworkAction} from './EventMouse';\nimport {NodeCreationHelper} from '../helpers/NodeCreation';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {ParamInitValueSerialized} from '../../../../../../@polygonjs/polygonjs/src/engine/params/types/ParamInitValueSerialized';\n// import { DropDownMenuEntry } from '../../../types/props';\nimport {MultipleCommand} from '../../../../history/commands/Multiple';\nimport {NodeDeleteCommand} from '../../../../history/commands/NodeDelete';\nimport {NodeCreateCommand} from '../../../../history/commands/NodeCreate';\nimport {NodeSelectCommand, } from '../../../../history/commands/NodeSelect';\nimport {SelectionMethod} from '../../../../core/Selection';\n\nexport interface TabMenuStyleObject {\n\tleft: string;\n\ttop: string;\n}\nexport interface ToggleTabMenuOptions {\n\tuseCombobox: boolean;\n}\n\nexport interface TabMenuOptions {\n\ttabMenuActive: ComputedRef<boolean>;\n\ttab_menu_style_object: Ref<TabMenuStyleObject>;\n\topen_tab_menu: () => void;\n\tclose_tab_menu: () => void;\n\tclose_node_create: () => void;\n\ttoggle_tab_menu: (options?: ToggleTabMenuOptions) => void;\n\ton_tab_menu_select: (str: string) => void;\n\tupdate_tab_menu_position: (event: PointerEvent | MouseEvent) => Vector2Like | undefined;\n\topenTabMenuForChangeType: OpenTabMenuForChangeTypeCallback;\n}\n\n// const documentEventHelper: EventHelper = new EventHelper(document.body);\ninterface SetupTabMenuOptions {\n\tmode: Ref<NetworkAction | null>;\n\tcanvas: Ref<HTMLCanvasElement | null>;\n\t// cameraData: Ref<MultiPlayer.Awareness.CameraData>,\n\tnode_creation_helper: NodeCreationHelper;\n\tcurrentPolyNodeLocked: ComputedRef<boolean>;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n\tpanelId: string;\n}\n\nexport function SetupTabMenu(options: SetupTabMenuOptions): TabMenuOptions {\n\tconst {mode, canvas, node_creation_helper, currentPolyNodeLocked, setupLinkIndex, panelId} = options;\n\t// const _tab_menu_opened = ref(false);\n\t// const tab_menu_mouse_position = ref({x: 0, y: 0});\n\tconst controller = StoreController.editor.tabMenu;\n\tconst position = controller.pointerPosition;\n\tlet nodeToChangeType: BaseNodeType | undefined;\n\n\tconst tab_menu_style_object = computed(() => {\n\t\tconst left = position.value.x - 50;\n\t\tconst top = position.value.y - 40;\n\t\treturn {\n\t\t\tleft: `${left}px`,\n\t\t\ttop: `${top}px`,\n\t\t};\n\t});\n\n\tconst tabMenuActive: ComputedRef<boolean> = computed(() => {\n\t\treturn controller.displayed() && controller.panelId().value == panelId;\n\t});\n\n\tlet __eventHelper: EventHelper | undefined;\n\tfunction _eventHelper() {\n\t\tif (canvas.value) {\n\t\t\treturn (__eventHelper = __eventHelper || new EventHelper(canvas.value));\n\t\t}\n\t}\n\n\t// functions\n\tlet eventPosition: PointerEvent | MouseEvent | undefined;\n\tfunction update_tab_menu_position(event: PointerEvent | MouseEvent) {\n\t\tif (!controller.displayed()) {\n\t\t\t// if (0 + 0) documentEventHelper.element_position(event, tab_menu_mouse_position.value as Vector2);\n\t\t\t_eventHelper()?.elementPosition(event, position.value as Vector2);\n\n\t\t\teventPosition = event;\n\t\t\treturn position.value;\n\t\t}\n\t}\n\n\tasync function open_tab_menu() {\n\t\t_set_tab_menu_state(true, {useCombobox: false});\n\t}\n\n\tfunction toggle_tab_menu(options?: ToggleTabMenuOptions) {\n\t\t_set_tab_menu_state(!controller.displayed(), options);\n\t}\n\n\tfunction close_tab_menu() {\n\t\t_setNodeToChangeType(undefined);\n\t\t_set_tab_menu_state(false, {useCombobox: false});\n\t}\n\n\tasync function _set_tab_menu_state(state: boolean, options?: ToggleTabMenuOptions) {\n\t\tif (state == controller.displayed()) {\n\t\t\treturn;\n\t\t}\n\t\tif (currentPolyNodeLocked.value == true) {\n\t\t\tconsole.warn('cannot open the tab menu as this node is locked');\n\t\t\treturn;\n\t\t}\n\t\tif (state) {\n\t\t\tconst useCombobox: boolean = EditorUserAgent.isTouchOrMobile() ? true : options?.useCombobox || false;\n\t\t\tconst nodeType = await controller.open({\n\t\t\t\tlinkIndex: setupLinkIndex.linkIndex.value,\n\t\t\t\tpanelId,\n\t\t\t\tuseCombobox,\n\t\t\t});\n\t\t\tconsole.log('nodeType:', nodeType);\n\t\t\ton_tab_menu_select(nodeType);\n\t\t} else {\n\t\t\tcontroller.close();\n\t\t}\n\t}\n\tfunction openTabMenuForChangeType(node: BaseNodeType) {\n\t\t_setNodeToChangeType(node);\n\t\t_set_tab_menu_state(true, {useCombobox: true});\n\t}\n\n\tfunction _setNodeToChangeType(node: BaseNodeType | undefined) {\n\t\tnodeToChangeType = node;\n\t}\n\n\tfunction on_tab_menu_select(entry: string) {\n\t\tconst elements = entry.split('/');\n\t\tconst lastElement = elements[elements.length - 1];\n\t\tif (nodeToChangeType) {\n\t\t\t_changeNodeType(nodeToChangeType, lastElement);\n\t\t} else {\n\t\t\tif (eventPosition) {\n\t\t\t\tnode_creation_helper.setPositionFromEvent(eventPosition);\n\t\t\t}\n\t\t\tnode_creation_helper.activate(lastElement.toLowerCase());\n\t\t\tmode.value = NetworkAction.NODE_CREATE;\n\t\t}\n\t}\n\n\tfunction close_node_create() {\n\t\tnode_creation_helper.deactivate();\n\t}\n\n\tasync function _changeNodeType(node: BaseNodeType, nodeType: string) {\n\t\tconst parentNode = node.parent();\n\t\tif (!parentNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentNodeName = node.name();\n\n\t\tconst nodeChangeType = new NodeChangeType(node);\n\t\tconst outputConnectionData = nodeChangeType.outputConnectionData();\n\n\t\t// store the current node param values\n\t\tconst currentNodeParamValues: Map<string, ParamInitValueSerialized> = new Map();\n\t\tfor (let param of node.params.all) {\n\t\t\tif (!param.components) {\n\t\t\t\tif (!param.isDefault()) {\n\t\t\t\t\tcurrentNodeParamValues.set(param.name(), param.valueSerialized());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst currentChildNodeIds = parentNode.children().map((node) => node.graphNodeId());\n\n\t\tconst multiCmd = new MultipleCommand(StoreController.scene);\n\t\tconst cmdDelete = new NodeDeleteCommand(parentNode, [node]);\n\t\tconst cmdCreate = new NodeCreateCommand(parentNode, nodeType, node.uiData.position());\n\n\t\tmultiCmd.pushCommand(cmdDelete);\n\t\tmultiCmd.pushCommand(cmdCreate);\n\n\t\tawait Editor.instance().pushCommand(multiCmd);\n\n\t\t// once the command has run, we can set the new node params without needing a command\n\t\t// since undoing this would delete the node anyway\n\t\tconst childNodes = parentNode.children();\n\t\tconst newNode = childNodes.find((node) => !currentChildNodeIds.includes(node.graphNodeId()));\n\t\tif (!newNode) {\n\t\t\tconsole.warn('new node not found');\n\t\t\treturn;\n\t\t}\n\t\tnewNode.setName(currentNodeName);\n\t\tcurrentNodeParamValues.forEach((paramValue, paramName) => {\n\t\t\tconst param = newNode.params.get(paramName);\n\t\t\tif (param) {\n\t\t\t\tparam.set(paramValue);\n\t\t\t}\n\t\t});\n\t\tnodeChangeType.restoreOutputConnections(outputConnectionData, newNode);\n\t\t// add a select command to see the new node in the params panel\n\t\tconst cmdSelect = new NodeSelectCommand(parentNode, [newNode], SelectionMethod.OVERRIDE);\n\t\tawait Editor.instance().pushCommand(cmdSelect);\n\t}\n\n\treturn {\n\t\ttabMenuActive,\n\t\ttab_menu_style_object,\n\t\topen_tab_menu,\n\t\ttoggle_tab_menu,\n\t\tclose_tab_menu,\n\t\ton_tab_menu_select,\n\t\tclose_node_create,\n\t\tupdate_tab_menu_position,\n\t\topenTabMenuForChangeType,\n\t};\n}\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createCommentVNode as _createCommentVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"TabMenu\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_DropDownMenu = _resolveComponent(\"DropDownMenu\")!\n\n  return (!_ctx.useCombobox)\n    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n        _createVNode(_component_DropDownMenu, {\n          display_label: false,\n          always_visible: true,\n          entries: _ctx.menuEntries,\n          initHoveredEntryIndex: _ctx.hoveredEntryIndex,\n          sort_entries: false,\n          onSelect: _ctx.on_select,\n          onClose: _ctx.close,\n          onHoveredEntryIndexChanged: _ctx.onHoveredEntryIndexChanged\n        }, null, 8 /* PROPS */, [\"entries\", \"initHoveredEntryIndex\", \"onSelect\", \"onClose\", \"onHoveredEntryIndexChanged\"]),\n        _createCommentVNode(\" <input ref=\\\"mobileKeyboardInput\\\" class=\\\"h-0 w-0\\\" tab=\\\"1\\\" type=\\\"text\\\" /> \")\n      ]))\n    : _createCommentVNode(\"v-if\", true)\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=template&id=705f0260&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=style&index=0&id=705f0260&lang=sass\"","import { render } from \"./TabMenu.vue?vue&type=template&id=705f0260&ts=true\"\nimport script from \"./TabMenu.vue?vue&type=script&lang=ts\"\nexport * from \"./TabMenu.vue?vue&type=script&lang=ts\"\n\nimport \"./TabMenu.vue?vue&type=style&index=0&id=705f0260&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = [\"data-testnodeid\"]\nconst _hoisted_2 = [\"id\", \"data-nodeId\"]\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = {\n  key: 6,\n  class: \"flag-optimize-container disable-select\"\n}\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"flag-optimize-label-element bg-yellow-700\" }, \"OPTIMIZED\", -1 /* HOISTED */)\nconst _hoisted_6 = [\n  _hoisted_5\n]\nconst _hoisted_7 = {\n  key: 0,\n  class: \"params-label-container disable-select\"\n}\nconst _hoisted_8 = { class: \"comment-container\" }\nconst _hoisted_9 = [\"id\"]\nconst _hoisted_10 = [\"title\"]\nconst _hoisted_11 = [\"data-nodeId\"]\nconst _hoisted_12 = { class: \"z-30 relative text-white\" }\nconst _hoisted_13 = [\"title\", \"data-input-index\", \"onPointerdown\", \"onMouseenter\", \"onMouseleave\", \"onPointerupe\"]\nconst _hoisted_14 = [\"data-nodeId\"]\nconst _hoisted_15 = { class: \"z-30 relative text-white\" }\nconst _hoisted_16 = [\"title\", \"data-output-index\", \"onPointerdown\", \"onMouseenter\", \"onMouseleave\", \"onPointerupe\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeError = _resolveComponent(\"NodeError\")!\n  const _component_ParamLabelResult = _resolveComponent(\"ParamLabelResult\")!\n  const _component_NodeComment = _resolveComponent(\"NodeComment\")!\n  const _component_NodeExtrasContainer = _resolveComponent(\"NodeExtrasContainer\")!\n  const _component_ChevronDoubleDownIcon = _resolveComponent(\"ChevronDoubleDownIcon\")!\n  const _component_LockClosedIcon = _resolveComponent(\"LockClosedIcon\")!\n  const _component_LockOpenIcon = _resolveComponent(\"LockOpenIcon\")!\n  const _component_Connection = _resolveComponent(\"Connection\")!\n  const _component_NodeInfo = _resolveComponent(\"NodeInfo\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"NetworkNode\", _ctx.class_object]),\n    style: _normalizeStyle(_ctx.style_object),\n    \"data-testnodeid\": _ctx.graph_node_id\n  }, [\n    (_ctx.fullVisible)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 0,\n          class: _normalizeClass(_ctx.nodeBodyClassObject),\n          style: _normalizeStyle(_ctx.nodeBodyStyleObject),\n          id: 'network-node-body-' + _ctx.graph_node_id,\n          \"data-nodeId\": _ctx.graph_node_id,\n          onPointerdown: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.onBodyPointerdown && _ctx.onBodyPointerdown(...args))),\n          onTouchstart: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.onBodyTouchstart && _ctx.onBodyTouchstart(...args))),\n          onPointerupe: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.on_body_mouseup && _ctx.on_body_mouseup(...args))),\n          onDblclick: _cache[3] || (_cache[3] = \n//@ts-ignore\n(...args) => (_ctx.on_body_dblclick && _ctx.on_body_dblclick(...args))),\n          onContextmenu: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)), [\"stop\",\"prevent\"]))\n        }, [\n          _createCommentVNode(\" <div class=\\\"icon-container\\\" v-if=\\\"display_icon\\\">\\n\\t\\t\\t\\t<v-icon :name=\\\"icon\\\" scale=\\\"1\\\"></v-icon>\\n\\t\\t\\t</div> \")\n        ], 46 /* CLASS, STYLE, PROPS, HYDRATE_EVENTS */, _hoisted_2))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.is_errored && _ctx.error_message)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 1,\n          class: \"error-flag-container\",\n          style: _normalizeStyle(_ctx.error_flag_container_style_object),\n          title: _ctx.error_message\n        }, [\n          _createVNode(_component_NodeError, {\n            errorMessage: _ctx.error_message,\n            linkIndex: _ctx.linkIndex,\n            jsonNode: _ctx.json_node\n          }, null, 8 /* PROPS */, [\"errorMessage\", \"linkIndex\", \"jsonNode\"])\n        ], 12 /* STYLE, PROPS */, _hoisted_3))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.4 && _ctx.has_bypass_flag)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 2,\n          class: \"flag-container\",\n          style: _normalizeStyle(_ctx.bypass_flag_container_style_object)\n        }, [\n          _createElementVNode(\"div\", {\n            class: _normalizeClass([\"node-flag bypass-flag border border-yellow-600\", _ctx.bypass_flag_class_object]),\n            style: _normalizeStyle(_ctx.bypass_flag_style_object),\n            onPointerdown: _cache[5] || (_cache[5] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_bypass_flag_click && _ctx.on_bypass_flag_click(...args)), [\"self\",\"stop\",\"prevent\"]))\n          }, null, 38 /* CLASS, STYLE, HYDRATE_EVENTS */)\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.4 && _ctx.has_display_flag)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 3,\n          class: \"flag-container\",\n          style: _normalizeStyle(_ctx.display_flag_container_style_object)\n        }, [\n          _createElementVNode(\"div\", {\n            class: _normalizeClass([\"node-flag display-flag border border-blue-600\", _ctx.display_flag_class_object]),\n            style: _normalizeStyle(_ctx.display_flag_style_object),\n            onPointerdown: _cache[6] || (_cache[6] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_display_flag_click && _ctx.on_display_flag_click(...args)), [\"self\",\"stop\",\"prevent\"]))\n          }, null, 38 /* CLASS, STYLE, HYDRATE_EVENTS */)\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.displayLargeDisplayFlag)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 4,\n          style: _normalizeStyle([_ctx.largeDisplayFlagStyleObject, {\"transform\":\"translate(-50%, -50%)\"}]),\n          class: \"flag-display-large bg-blue-700 rounded-full absolute top-0 left-0 opacity-50 hover:opacity-70 pointer-events-none\"\n        }, null, 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.2)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 5,\n          class: \"name-container disable-select\",\n          style: _normalizeStyle(_ctx.name_container_style_object)\n        }, [\n          _createCommentVNode(\"\\n\\t\\t\\t\\tif the name prompt opening is set to pointerdown,\\n\\t\\t\\t\\tfor some reason it will have the dialog close right away.\\n\\t\\t\\t\\tSo for now, it is set to click and touchstart, which seems to work\\n\\t\\t\\t \"),\n          _createElementVNode(\"div\", {\n            class: \"name-element\",\n            onClick: _cache[7] || (_cache[7] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onNameClick && _ctx.onNameClick(...args)), [\"stop\",\"prevent\"])),\n            onTouchstart: _cache[8] || (_cache[8] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onNameClick && _ctx.onNameClick(...args)), [\"stop\",\"prevent\"]))\n          }, _toDisplayString(_ctx.name), 33 /* TEXT, HYDRATE_EVENTS */)\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.3 && _ctx.is_optimized)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, _hoisted_6))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.3)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 7,\n          class: \"node-local-info-container pointer-events-none\",\n          style: _normalizeStyle(_ctx.displayNodeNetworkInfoStyleObject)\n        }, [\n          (_ctx.hasParamsLabelResult)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.paramsLabelResult, (item, i) => {\n                  return (_openBlock(), _createBlock(_component_ParamLabelResult, {\n                    key: i,\n                    result: item\n                  }, null, 8 /* PROPS */, [\"result\"]))\n                }), 128 /* KEYED_FRAGMENT */))\n              ]))\n            : _createCommentVNode(\"v-if\", true),\n          _createElementVNode(\"div\", _hoisted_8, [\n            (_ctx.displayComment && _ctx.comment)\n              ? (_openBlock(), _createElementBlock(\"div\", {\n                  key: 0,\n                  class: \"comment-element bg-sky-800\",\n                  onDblclick: _cache[9] || (_cache[9] = \n//@ts-ignore\n(...args) => (_ctx.edit_comment && _ctx.edit_comment(...args)))\n                }, [\n                  _createVNode(_component_NodeComment, {\n                    linkIndex: _ctx.linkIndex,\n                    comment: _ctx.comment,\n                    json_node: _ctx.json_node\n                  }, null, 8 /* PROPS */, [\"linkIndex\", \"comment\", \"json_node\"])\n                ], 32 /* HYDRATE_EVENTS */))\n              : _createCommentVNode(\"v-if\", true)\n          ])\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.showExtrasContainer && _ctx.fullVisible && _ctx.zoom > 0.3)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 8,\n          class: \"node-local-info-container pointer-events-none\",\n          style: _normalizeStyle(_ctx.displayNodeNetworkInfoStyleObject)\n        }, [\n          (_openBlock(), _createBlock(_component_NodeExtrasContainer, {\n            json_node: _ctx.json_node,\n            key: _ctx.extrasContainerKey\n          }, null, 8 /* PROPS */, [\"json_node\"]))\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.2 && _ctx.children_allowed)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 9,\n          class: \"enter-button-container\",\n          style: _normalizeStyle(_ctx.enterButtonContainerStyleObject)\n        }, [\n          _createElementVNode(\"div\", {\n            class: \"enter-button bg-green-700 hover:bg-green-800 text-white\",\n            onClick: _cache[10] || (_cache[10] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.openNodeFromClickEvent && _ctx.openNodeFromClickEvent(...args)), [\"stop\"])),\n            onTouchstart: _cache[11] || (_cache[11] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.openNodeFromTouchEvent && _ctx.openNodeFromTouchEvent(...args)), [\"stop\"])),\n            title: \"Go Inside Node\",\n            id: _ctx.enterNodeButtonId\n          }, [\n            _createVNode(_component_ChevronDoubleDownIcon)\n          ], 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_9)\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.3 && _ctx.isPolyNode)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 10,\n          class: \"poly-node-icon-container\",\n          style: _normalizeStyle(_ctx.polyNodeLockStateIconStyleObject)\n        }, [\n          _createElementVNode(\"div\", {\n            class: _normalizeClass(['poly-node-icon text-white', _ctx.isPolyNodeLocked ? 'bg-green-700' : 'bg-orange-600']),\n            title: _ctx.isPolyNodeLocked ? 'this Poly Node is locked' : 'this Poly Node is unlocked'\n          }, [\n            (_ctx.isPolyNodeLocked)\n              ? (_openBlock(), _createBlock(_component_LockClosedIcon, { key: 0 }))\n              : _createCommentVNode(\"v-if\", true),\n            (!_ctx.isPolyNodeLocked)\n              ? (_openBlock(), _createBlock(_component_LockOpenIcon, { key: 1 }))\n              : _createCommentVNode(\"v-if\", true)\n          ], 10 /* CLASS, PROPS */, _hoisted_10)\n        ], 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.2)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 11,\n          class: \"inputs-container\",\n          style: _normalizeStyle(_ctx.inputs_container_style_object),\n          \"data-nodeId\": _ctx.graph_node_id\n        }, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.available_inputs, (_, i) => {\n            return (_openBlock(), _createElementBlock(\"div\", {\n              class: \"connection-pixel input-pixel\",\n              style: _normalizeStyle(_ctx.inputs_pixel_style_objects[i])\n            }, [\n              (_ctx.fullVisible && _ctx.zoom > 0.5 && _ctx.input_names[i])\n                ? (_openBlock(), _createElementBlock(\"div\", {\n                    key: 0,\n                    class: _normalizeClass([\"relative connection-name-element bg-black border border-slate-600\", _ctx.input_connection_name_element_class_objects[i]])\n                  }, [\n                    _createCommentVNode(\" <div class=\\\"z-10 absolute inset-0 w-full h-full bg-black\\\"></div> \"),\n                    _createElementVNode(\"div\", {\n                      class: _normalizeClass([\"z-20 absolute inset-0 w-full h-full brightness-50 saturate-50\", _ctx.input_connection_name_element_bg_class_objects[i]])\n                    }, null, 2 /* CLASS */),\n                    _createElementVNode(\"div\", _hoisted_12, _toDisplayString(_ctx.input_names[i]), 1 /* TEXT */)\n                  ], 2 /* CLASS */))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"div\", {\n                class: _normalizeClass([\"connection-element\", [_ctx.connection_pixel_input_class_objects[i], , _ctx.isTouchOrMobile ? 'isTouchOrMobile' : '']]),\n                title: _ctx.input_titles[i],\n                \"data-input-index\": i,\n                onPointerdown: _withModifiers(($event: any) => (_ctx.on_input_mousedown($event, i)), [\"stop\",\"prevent\"]),\n                onTouchstart: _cache[12] || (_cache[12] = _withModifiers(() => {}, [\"stop\",\"prevent\"])),\n                onMouseenter: ($event: any) => (_ctx.on_input_hover($event, i)),\n                onMouseleave: ($event: any) => (_ctx.on_input_mouseleave($event, i)),\n                onPointerupe: ($event: any) => (_ctx.on_input_mouseup($event, i))\n              }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_13)\n            ], 4 /* STYLE */))\n          }), 256 /* UNKEYED_FRAGMENT */))\n        ], 12 /* STYLE, PROPS */, _hoisted_11))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.fullVisible && _ctx.zoom > 0.2 && _ctx.has_outputs)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 12,\n          class: \"outputs-container\",\n          style: _normalizeStyle(_ctx.output_container_style_object),\n          \"data-nodeId\": _ctx.graph_node_id\n        }, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.available_outputs, (_, i) => {\n            return (_openBlock(), _createElementBlock(\"div\", {\n              class: \"connection-pixel output-pixel\",\n              style: _normalizeStyle(_ctx.outputs_pixel_style_objects[i])\n            }, [\n              (_ctx.fullVisible && _ctx.zoom > 0.5 && _ctx.output_names[i])\n                ? (_openBlock(), _createElementBlock(\"div\", {\n                    key: 0,\n                    class: _normalizeClass([\"connection-name-element bg-black border border-slate-600\", _ctx.output_connection_name_element_class_objects[i]])\n                  }, [\n                    _createCommentVNode(\" <div class=\\\"z-10 absolute inset-0 w-full h-full bg-black\\\"></div> \"),\n                    _createElementVNode(\"div\", {\n                      class: _normalizeClass([\"z-20 absolute inset-0 w-full h-full brightness-50 saturate-50\", _ctx.output_connection_name_element_bg_class_objects[i]])\n                    }, null, 2 /* CLASS */),\n                    _createElementVNode(\"div\", _hoisted_15, _toDisplayString(_ctx.output_names[i]), 1 /* TEXT */)\n                  ], 2 /* CLASS */))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"div\", {\n                class: _normalizeClass([\"connection-element\", [_ctx.connection_pixel_output_class_objects[i], _ctx.isTouchOrMobile ? 'isTouchOrMobile' : '']]),\n                title: _ctx.output_titles[i],\n                \"data-output-index\": i,\n                onPointerdown: _withModifiers(($event: any) => (_ctx.on_output_mousedown($event, i)), [\"stop\",\"prevent\"]),\n                onTouchstart: _cache[13] || (_cache[13] = _withModifiers(() => {}, [\"stop\",\"prevent\"])),\n                onMouseenter: ($event: any) => (_ctx.on_output_hover($event, i)),\n                onMouseleave: ($event: any) => (_ctx.on_output_mouseleave($event, i)),\n                onPointerupe: ($event: any) => (_ctx.on_output_mouseup($event, i))\n              }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_16)\n            ], 4 /* STYLE */))\n          }), 256 /* UNKEYED_FRAGMENT */))\n        ], 12 /* STYLE, PROPS */, _hoisted_14))\n      : _createCommentVNode(\"v-if\", true),\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.inputs, (inputNodeGraphNodeId, i) => {\n      return (_openBlock(), _createElementBlock(\"div\", null, [\n        (_ctx.input_valid_states[i] && inputNodeGraphNodeId != null)\n          ? (_openBlock(), _createBlock(_component_Connection, {\n              key: `${i}:${_ctx.input_connection_output_indices[i]}:${_ctx.input_json_nodes[i]?.graph_node_id}`,\n              input_index: i,\n              output_index: _ctx.input_connection_output_indices[i],\n              src_json_node: _ctx.input_json_nodes[i],\n              dest_json_node: _ctx.json_node,\n              json_parent: _ctx.json_parent,\n              onCapture_connection_for_node_creation: ($event: any) => (\n\t\t\t\t\t_ctx.on_capture_connection_for_node_creation(inputNodeGraphNodeId, i, _ctx.input_connection_output_indices[i])\n\t\t\t\t),\n              onRelease_connection_for_node_creation: _ctx.on_release_connection_for_node_creation\n            }, null, 8 /* PROPS */, [\"input_index\", \"output_index\", \"src_json_node\", \"dest_json_node\", \"json_parent\", \"onCapture_connection_for_node_creation\", \"onRelease_connection_for_node_creation\"]))\n          : _createCommentVNode(\"v-if\", true)\n      ]))\n    }), 256 /* UNKEYED_FRAGMENT */)),\n    (_ctx.nodeInfoDisplayed)\n      ? (_openBlock(), _createBlock(_component_NodeInfo, {\n          key: 13,\n          graph_node_id: _ctx.graph_node_id,\n          linkIndex: _ctx.linkIndex,\n          onClose: _ctx.hideInfo\n        }, null, 8 /* PROPS */, [\"graph_node_id\", \"linkIndex\", \"onClose\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ], 14 /* CLASS, STYLE, PROPS */, _hoisted_1))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=template&id=9c087fe0&ts=true\"","import {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {SetupContext} from 'vue';\nimport {NodeCreateCommandConnectionData} from '../../../../../../history/commands/NodeCreate';\n\nexport interface SetupCaptureOptions {\n\tcapture_node_for_move: (event: MouseEvent) => void;\n\tcapture_node_src_for_connection: (event: MouseEvent, index: number) => void;\n\tcapture_node_dest_for_connection: (event: MouseEvent, index: number) => void;\n\tcapture_node_input_for_node_creation: (event: MouseEvent, index: number) => void;\n\tcapture_node_output_for_node_creation: (event: MouseEvent, index: number) => void;\n\trelease_node_input_for_node_creation: (event: MouseEvent, index: number) => void;\n\trelease_node_output_for_node_creation: (event: MouseEvent, index: number) => void;\n\tcapture_node_final_for_connection: (event: MouseEvent) => void;\n\tcapture_node_for_contextMenu: () => void;\n\t// capture_node_for_select: (event: MouseEvent) => void;\n\tcapture_connection_for_node_creation: (data: NodeCreateCommandConnectionData) => void;\n\trelease_connection_for_node_creation: (index: number) => void;\n}\n\nexport function SetupCapture(json_node: EngineNodeData, context: SetupContext): SetupCaptureOptions {\n\tfunction capture_node_for_move(event: MouseEvent) {\n\t\tcontext.emit('capture_node_for_move', event, json_node.graph_node_id);\n\t}\n\tfunction capture_node_src_for_connection(event: MouseEvent, index: number) {\n\t\tcontext.emit('capture_node_src_for_connection', event, json_node.graph_node_id, index);\n\t}\n\tfunction capture_node_dest_for_connection(event: MouseEvent, index: number) {\n\t\tcontext.emit('capture_node_dest_for_connection', event, json_node.graph_node_id, index);\n\t}\n\tfunction capture_node_final_for_connection(event: MouseEvent) {\n\t\tcontext.emit('capture_node_final_for_connection', event, json_node.graph_node_id);\n\t}\n\tfunction capture_node_input_for_node_creation(event: MouseEvent, index: number) {\n\t\tcontext.emit('capture_node_input_for_node_creation', event, json_node.graph_node_id, index);\n\t}\n\tfunction capture_node_output_for_node_creation(event: MouseEvent, index: number) {\n\t\tcontext.emit('capture_node_output_for_node_creation', event, json_node.graph_node_id, index);\n\t}\n\tfunction release_node_input_for_node_creation(event: MouseEvent, index: number) {\n\t\tcontext.emit('release_node_input_for_node_creation', event, json_node.graph_node_id, index);\n\t}\n\tfunction release_node_output_for_node_creation(event: MouseEvent, index: number) {\n\t\tcontext.emit('release_node_output_for_node_creation', event, json_node.graph_node_id, index);\n\t}\n\tfunction capture_node_for_contextMenu() {\n\t\tcontext.emit('capture_node_for_contextMenu', json_node.graph_node_id);\n\t}\n\tfunction capture_connection_for_node_creation(data: NodeCreateCommandConnectionData) {\n\t\tcontext.emit('capture_connection_for_node_creation', data);\n\t}\n\tfunction release_connection_for_node_creation(index: number) {\n\t\tcontext.emit('release_connection_for_node_creation', json_node.graph_node_id, index);\n\t}\n\t// function capture_node_for_select(event: MouseEvent) {\n\t// \tcontext.emit('capture_node_for_select', event, json_node.graph_node_id);\n\t// }\n\n\treturn {\n\t\tcapture_node_for_move,\n\t\tcapture_node_src_for_connection,\n\t\tcapture_node_dest_for_connection,\n\t\tcapture_node_input_for_node_creation,\n\t\tcapture_node_output_for_node_creation,\n\t\trelease_node_input_for_node_creation,\n\t\trelease_node_output_for_node_creation,\n\t\tcapture_node_final_for_connection,\n\t\tcapture_node_for_contextMenu,\n\t\tcapture_connection_for_node_creation,\n\t\trelease_connection_for_node_creation,\n\t\t// capture_node_for_select,\n\t};\n}\n","import {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {computed, Ref, ComputedRef} from 'vue';\nexport type EnterButtonContainerStyleObjectNumber = ComputedRef<{\n\ttop: number;\n\tright?: number;\n\tleft?: number;\n}>;\ntype EnterButtonContainerStyleObject = ComputedRef<{\n\ttop: string;\n\tright?: string;\n\tleft?: string;\n}>;\n\nexport function SetupChildrenOwner(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>,\n\tlayout_vertical: Readonly<Ref<boolean>>\n) {\n\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst children_allowed = computed(() => {\n\t\treturn node?.childrenAllowed() || false;\n\t});\n\tconst enterButtonContainerStyleObjectNumber: EnterButtonContainerStyleObjectNumber = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\treturn {\n\t\t\t\ttop: 0.0 * body_size.value.y,\n\t\t\t\tright: 0.5 * body_size.value.x,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\ttop: -0.5 * body_size.value.y - 20,\n\t\t\t\tleft: -1.0 * body_size.value.x - 10,\n\t\t\t};\n\t\t}\n\t});\n\tconst enterButtonContainerStyleObject: EnterButtonContainerStyleObject = computed(() => {\n\t\tconst v = enterButtonContainerStyleObjectNumber.value;\n\t\treturn {\n\t\t\ttop: `${v.top}px`,\n\t\t\tright: v.right ? `${v.right}px` : undefined,\n\t\t\tleft: v.left ? `${v.left}px` : undefined,\n\t\t};\n\t});\n\n\treturn {\n\t\tchildren_allowed,\n\t\tenterButtonContainerStyleObjectNumber,\n\t\tenterButtonContainerStyleObject,\n\t};\n}\n","import {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {computed, Ref, ComputedRef} from 'vue';\n\ninterface SetupNodeNetworkInfoOptions {\n\tjson_node: EngineNodeData;\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>;\n\tlayout_vertical: Readonly<Ref<boolean>>;\n\tdisplayComment: Readonly<ComputedRef<boolean>>;\n\thasParamsLabelResult: Readonly<ComputedRef<boolean>>;\n}\n\nexport function SetupNodeNetworkInfo(options: SetupNodeNetworkInfoOptions) {\n\tconst {body_size, layout_vertical, displayComment, hasParamsLabelResult} = options;\n\tconst displayNodeNetworkInfo = computed(() => {\n\t\treturn displayComment.value && hasParamsLabelResult.value;\n\t});\n\n\t// const params_label_height = 25;\n\tconst vertical_margin_for_horizontal_layout = 15;\n\tconst displayNodeNetworkInfoStyleObject = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\treturn {\n\t\t\t\tleft: `${0.5 * body_size.value.x}px`,\n\t\t\t\ttop: `${0.5 * body_size.value.y}px`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tleft: `${+0.5 * body_size.value.x - 10}px`,\n\t\t\t\ttop: `${0.5 * body_size.value.y + vertical_margin_for_horizontal_layout}px`,\n\t\t\t};\n\t\t}\n\t});\n\n\treturn {\n\t\tdisplayNodeNetworkInfo,\n\t\tdisplayNodeNetworkInfoStyleObject,\n\t};\n}\n","import {OpenTabMenuForChangeTypeCallback} from './../../../../../../store/controllers/editor/EditorContextMenuStoreController';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\n\ninterface SetupContextMenuOptions {\n\tjson_node: EngineNodeData;\n\topenTabMenu: OpenTabMenuForChangeTypeCallback;\n}\n\nexport function SetupContextMenu(options: SetupContextMenuOptions) {\n\tconst {json_node, openTabMenu} = options;\n\tfunction on_contextmenu(event: MouseEvent) {\n\t\tconst menu_node_id = StoreController.editor.contextMenu.nodeId();\n\t\tconst current_node_id = json_node.graph_node_id;\n\t\tif (menu_node_id == current_node_id) {\n\t\t\ton_contextmenu_close();\n\t\t} else {\n\t\t\tStoreController.editor.contextMenu.setNodeId(current_node_id, openTabMenu);\n\t\t}\n\t\tStoreController.editor.contextMenu.setPosition({\n\t\t\tx: event.pageX,\n\t\t\ty: event.pageY,\n\t\t});\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tevent.stopImmediatePropagation();\n\t}\n\tfunction on_contextmenu_close() {\n\t\tStoreController.editor.contextMenu.setNodeId(null);\n\t}\n\n\treturn {\n\t\ton_contextmenu,\n\t\ton_contextmenu_close,\n\t};\n}\n","import {StoreController} from '../../../../../../src/editor/store/controllers/StoreController';\nimport type {NodeSerializerData} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\n\nexport const NODE_WIDTH_UNIT = 50;\n\nexport class NodeSize {\n\tstatic width(jsonNode: NodeSerializerData) {\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id);\n\t\tif (!node) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (node.uiData.isLayoutVertical()) {\n\t\t\tconst available_inputs = jsonNode.maxInputsCount;\n\t\t\treturn Math.max(NODE_WIDTH_UNIT, NODE_WIDTH_UNIT * Math.ceil(available_inputs / 2));\n\t\t} else {\n\t\t\treturn NODE_WIDTH_UNIT;\n\t\t}\n\t}\n}\n","import {Constants} from './../../../../../../core/network/Constants';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {Ref, computed} from 'vue';\nimport {NodeSize} from '../../../helpers/NodeSize';\n\nexport function SetupFlagBypass(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>\n) {\n\tconst has_bypass_flag: Readonly<Ref<Readonly<boolean>>> = computed(() => {\n\t\treturn json_node.flags?.bypass != null;\n\t});\n\tconst is_bypassed: Readonly<Ref<Readonly<boolean>>> = computed(() => {\n\t\treturn json_node.flags?.bypass == true;\n\t});\n\tconst bypass_flag_container_style_object = computed(() => {\n\t\treturn {\n\t\t\ttop: `${-0.5 * Constants.NODE_HEIGHT}px`,\n\t\t\tleft: `${-0.5 * (NodeSize.width(json_node) || 100) + 2}px`,\n\t\t\theight: `${body_size.value.y}px`,\n\t\t};\n\t});\n\tconst bypass_flag_style_object = computed(() => {\n\t\tconst v_padding = 5;\n\t\treturn {\n\t\t\ttop: `${v_padding}px`,\n\t\t\theight: `${body_size.value.y - 2 * v_padding}px`,\n\t\t};\n\t});\n\tconst bypass_flag_class_object = computed(() => {\n\t\treturn {\n\t\t\ton: is_bypassed.value,\n\t\t\toff: !is_bypassed.value,\n\t\t};\n\t});\n\n\treturn {\n\t\thas_bypass_flag,\n\t\tis_bypassed,\n\t\tbypass_flag_container_style_object,\n\t\tbypass_flag_style_object,\n\t\tbypass_flag_class_object,\n\t};\n}\n","import {Constants} from './../../../../../../core/network/Constants';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\n\nimport {Ref, computed} from 'vue';\nimport {NodeSize} from '../../../helpers/NodeSize';\nexport function SetupFlagDisplay(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>\n) {\n\tconst has_display_flag: Readonly<Ref<boolean>> = computed(() => {\n\t\treturn json_node.flags?.display != null;\n\t});\n\tconst display_flag_container_style_object = computed(() => {\n\t\treturn {\n\t\t\ttop: `${-0.5 * Constants.NODE_HEIGHT}px`,\n\t\t\tleft: `${0.5 * NodeSize.width(json_node) - 2}px`,\n\t\t\theight: `${body_size.value.y}px`,\n\t\t};\n\t});\n\tconst display_flag_style_object = computed(() => {\n\t\tconst v_padding = 5;\n\t\treturn {\n\t\t\ttop: `${v_padding}px`,\n\t\t\theight: `${body_size.value.y - 2 * v_padding}px`,\n\t\t};\n\t});\n\tconst display_flag_class_object = computed(() => {\n\t\tconst display = json_node.flags?.display == true;\n\t\treturn {\n\t\t\ton: display,\n\t\t\toff: !display,\n\t\t};\n\t});\n\n\treturn {\n\t\thas_display_flag,\n\t\tdisplay_flag_container_style_object,\n\t\tdisplay_flag_style_object,\n\t\tdisplay_flag_class_object,\n\t};\n}\n","import {StoreController} from './../../../../../../store/controllers/StoreController';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {Ref, computed} from 'vue';\nimport {NodeContext} from './../../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nexport function SetupFlagDisplaySop(json_node: EngineNodeData, zoom: Ref<number>) {\n\tconst hasDisplayFlag: Readonly<Ref<boolean>> = computed(() => {\n\t\treturn json_node.flags?.display != null;\n\t});\n\tconst isSop = computed(() => {\n\t\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\t\tif (!node) {\n\t\t\treturn false;\n\t\t}\n\t\tconst parent = node.parent();\n\t\tif (!parent) {\n\t\t\treturn false;\n\t\t}\n\t\treturn parent.childrenControllerContext() == NodeContext.SOP;\n\t});\n\tconst displayLargeDisplayFlag = computed(\n\t\t() => hasDisplayFlag.value && json_node.flags?.display == true && isSop.value\n\t);\n\tconst largeDisplayFlagStyleObject = computed(() => {\n\t\tconst size = 100 / zoom.value;\n\t\treturn {\n\t\t\twidth: `${size}px`,\n\t\t\theight: `${size}px`,\n\t\t};\n\t});\n\n\treturn {\n\t\tdisplayLargeDisplayFlag,\n\t\tlargeDisplayFlagStyleObject,\n\t};\n}\n","// import {Constants} from '../../../helpers/Constants';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\n\nimport {Ref, computed} from 'vue';\n// import {StoreController} from '../../../../../../store/controllers/StoreController';\nexport function SetupFlagOptimize(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>\n) {\n\t// const node = StoreController.engine.node(json_node.graph_node_id);\n\n\t// const has_optimize_flag: Readonly<Ref<Readonly<boolean>>> = computed(() => {\n\t// \treturn json_node.flags?.optimize != null;\n\t// });\n\tconst is_optimized: Readonly<Ref<Readonly<boolean>>> = computed(() => {\n\t\treturn json_node.flags?.optimize == true;\n\t});\n\n\treturn {\n\t\tis_optimized,\n\t};\n}\n","import {Constants} from './../../../../../../core/network/Constants';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {Ref, computed} from 'vue';\nimport {NodeSize} from '../../../helpers/NodeSize';\n\nexport function SetupErrored(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>\n) {\n\tconst error_message = computed(() => {\n\t\tif (json_node) {\n\t\t\treturn json_node.error_message;\n\t\t}\n\t});\n\tconst is_errored: Readonly<Ref<boolean>> = computed(() => {\n\t\treturn error_message.value != null;\n\t});\n\tconst error_flag_container_style_object = computed(() => {\n\t\tconst width = NodeSize.width(json_node);\n\t\treturn {\n\t\t\ttop: `${-0.5 * Constants.NODE_HEIGHT}px`,\n\t\t\tleft: `${-0.5 * width}px`,\n\t\t\twidth: `${width}px`,\n\t\t\theight: `${body_size.value.y}px`,\n\t\t};\n\t});\n\n\treturn {\n\t\terror_message,\n\t\tis_errored,\n\t\terror_flag_container_style_object,\n\t};\n}\n","import {Editor} from './../../../../../../Editor';\nimport {NodeSelectCommand} from './../../../../../../history/commands/NodeSelect';\nimport {SelectionMethod} from './../../../../../../core/Selection';\nimport {MouseButton} from '../../../../../../../../@polygonjs/polygonjs/src/core/MouseButton';\nimport {OpenTabMenuForChangeTypeCallback} from './../../../../../../store/controllers/editor/EditorContextMenuStoreController';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {SetupCaptureOptions} from './Capture';\nimport {SetupContext, computed} from 'vue';\nimport {SetupInfosOptions} from './Infos';\nimport {NodeCreateCommandConnectionData} from '../../../../../../history/commands/NodeCreate';\nimport {NodeProps} from './NodeTypes';\n// import {logHammer} from '../../../mixins/EventMouse';\nimport {EventHelper} from './../../../../../../core/EventHelper';\ninterface SetupNodeEventMouseOptions {\n\tprops: NodeProps;\n\tjson_node: EngineNodeData;\n\tcontext: SetupContext;\n\tcapture_options: SetupCaptureOptions;\n\tinfosOptions: SetupInfosOptions;\n\topenTabMenu: OpenTabMenuForChangeTypeCallback;\n}\n\nexport function SetupNodeEventMouse(options: SetupNodeEventMouseOptions) {\n\tconst {props, json_node, context, capture_options, infosOptions} = options;\n\tfunction onBodyPointerdown(event: PointerEvent) {\n\t\t// if (event.pointerType == 'touch') {\n\t\t// if we only process non touch events here, the onBodyTouchstart will not yet allow for node move actions\n\t\t// \treturn;\n\t\t// }\n\t\tswitch (event.button) {\n\t\t\tcase MouseButton.LEFT:\n\t\t\t\tEventHelper.stopEvent(event);\n\t\t\t\tcapture_options.capture_node_for_move(event);\n\t\t\t\tbreak;\n\t\t\tcase MouseButton.MIDDLE:\n\t\t\t\tEventHelper.stopEvent(event);\n\t\t\t\tinfosOptions.displayInfo(event.target as HTMLElement);\n\t\t\t\tbreak;\n\n\t\t\t// case Core.Event.MOUSE_BUTTON_MIDDLE:\n\t\t\t// \tthis.cam_animation_helper.pan_start(event);\n\t\t\t// \tthis.pan_in_progress = true;\n\t\t\t// \tbreak\n\n\t\t\t// case Core.Event.MOUSE_BUTTON_RIGHT:\n\t\t\t// \tthis.cam_animation_helper.zoom_start(event);\n\t\t\t// \tthis.zoom_in_progress = true;\n\t\t\t// \tbreak\n\t\t}\n\t\tif (event.pointerType == 'touch') {\n\t\t\t// if the event is touch, we do not propagate, as it would start a selection rectangle\n\t\t\tEventHelper.stopEvent(event);\n\t\t\treturn;\n\t\t}\n\t}\n\tlet _lastTouchTimestamp: number | undefined;\n\tconst MAX_TIME_QUICK_TAP = 200;\n\tconst MAX_TIME_DOUBLE_TAP = 300;\n\tconst MIN_TIME_LONG_PRESS = 500;\n\tfunction onBodyTouchstart(eventTouchStart: TouchEvent) {\n\t\tconst now = Date.now();\n\t\tlet tapActive = true;\n\t\tfunction getDelta() {\n\t\t\tif (_lastTouchTimestamp != null) {\n\t\t\t\tconst delta = now - _lastTouchTimestamp;\n\t\t\t\t_lastTouchTimestamp = now;\n\t\t\t\treturn delta;\n\t\t\t}\n\t\t\t_lastTouchTimestamp = now;\n\t\t}\n\t\tfunction _checkOpenNode() {\n\t\t\tconst delta = getDelta();\n\n\t\t\tif (delta != null && delta < MAX_TIME_DOUBLE_TAP) {\n\t\t\t\t// if it's a fast double tap, enter node\n\t\t\t\topen_node();\n\t\t\t\ttapActive = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tasync function _checkQuickTapForSelect() {\n\t\t\tconst delta = getDelta();\n\t\t\tif (delta == null || delta > MAX_TIME_QUICK_TAP) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst parentNode = node.parent();\n\t\t\tif (!parentNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst command = new NodeSelectCommand(parentNode, [node], SelectionMethod.OVERRIDE);\n\t\t\tawait Editor.instance().pushCommand(command);\n\t\t}\n\t\tfunction _checkContextMenu() {\n\t\t\t// I'm not sure why the context menu works out of the box on the param label,\n\t\t\t// but not on the node body. So for now, this function seems necessary\n\t\t\tfunction onTouchEnd(eventTouchEnd: TouchEvent) {\n\t\t\t\tdocument.body.removeEventListener('touchend', onTouchEnd);\n\t\t\t\ttapActive = false;\n\t\t\t\t_checkQuickTapForSelect();\n\t\t\t\tEventHelper.stopEvent(eventTouchEnd);\n\t\t\t}\n\t\t\tdocument.body.addEventListener('touchend', onTouchEnd);\n\t\t\t// if there is no touchend until a specific\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (tapActive) {\n\t\t\t\t\t// we can't open the context menu directly here,\n\t\t\t\t\t// as we first need to check that the node has not been moved by the move action.\n\t\t\t\t\t// so this is better done at the network level\n\t\t\t\t\tcapture_options.capture_node_for_contextMenu();\n\t\t\t\t\t// StoreController.editor.contextMenu.setNodeId(json_node.graph_node_id, openTabMenu);\n\t\t\t\t}\n\t\t\t}, MIN_TIME_LONG_PRESS);\n\t\t}\n\t\t_checkOpenNode();\n\t\t_checkContextMenu();\n\t\tEventHelper.stopEvent(eventTouchStart);\n\t}\n\tfunction on_body_mouseup(event: MouseEvent) {\n\t\t// logHammer(`on_body_mouseup ${event.button}==${MouseButton.MIDDLE} (${event.type})`);\n\t\tif (event.button == MouseButton.MIDDLE) {\n\t\t\tinfosOptions.hideInfo();\n\t\t\tEventHelper.stopEvent(event);\n\t\t} else {\n\t\t\t// logHammer(`capture final`);\n\t\t\t// capture_options.capture_node_final_for_connection(event);\n\t\t}\n\t}\n\n\t// on_body_click(event: MouseEvent){\n\t// \tconsole.log(\"click\")\n\t// },\n\t// function on_body_click(event: MouseEvent) {\n\t// \tcapture_options.capture_node_for_select(event);\n\t// }\n\tfunction on_body_dblclick() {\n\t\topen_node();\n\t}\n\tfunction openNodeFromTouchEvent(event: TouchEvent) {\n\t\topen_node();\n\t}\n\tfunction openNodeFromClickEvent(event: MouseEvent) {\n\t\topen_node();\n\t}\n\tfunction open_node() {\n\t\t// console.log(event);\n\t\t// if (event.pointerType === 'mouse'){return}\n\t\t// if(event instanceof TouchEvent)\n\t\t// if (event.pointerType === 'touch') {\n\t\t// \t// \tonTouchStart(event);\n\t\t// } else {\n\t\t// \t// nodes_container.value?.addEventListener('pointermove', on_pointer_move);\n\t\t// \tnodes_container.value?.addEventListener('pointerup', on_pointer_up);\n\t\t// \tonMouseDown(event);\n\t\t// }\n\n\t\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\t\tif (node) {\n\t\t\tif (node.childrenAllowed()) {\n\t\t\t\tStoreController.editor.setCurrentNode(props.linkIndex, node);\n\t\t\t}\n\t\t}\n\t}\n\tconst enterNodeButtonId = computed(() => {\n\t\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\t\tif (node) {\n\t\t\treturn `network-enter-node-button-${node.path().split('/').join('-')}`;\n\t\t}\n\t});\n\t// on_click() {\n\t// \tthis.close_tab_menu();\n\t// },\n\t// on_context_menu(event: MouseEvent){\n\t// \t//this.toggle_tab_menu()\n\t// \t//event.stopPropagation()\n\t// \treturn false;\n\t// }\n\n\tfunction on_input_mousedown(event: PointerEvent, index: number) {\n\t\t// releasing here is necessary to allow the pointerup event to be tied to another element\n\t\t// which itself is necessary to complete a connection\n\t\t(event.target as HTMLElement).releasePointerCapture(event.pointerId);\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcapture_options.capture_node_dest_for_connection(event, index);\n\t\t}\n\t\tEventHelper.stopEvent(event);\n\t}\n\tfunction on_input_hover(event: MouseEvent, index: number) {\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcapture_options.capture_node_input_for_node_creation(event, index);\n\t\t}\n\t}\n\tfunction on_input_mouseleave(event: MouseEvent, index: number) {\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcapture_options.release_node_input_for_node_creation(event, index);\n\t\t}\n\t}\n\tfunction on_input_mouseup(event: MouseEvent, index: number) {\n\t\tcapture_options.capture_node_dest_for_connection(event, index);\n\t}\n\tfunction on_output_mousedown(event: PointerEvent, index: number) {\n\t\t// logHammer(`on_output_mousedown:${event.button == MouseButton.LEFT}`);\n\t\t(event.target as HTMLElement).releasePointerCapture(event.pointerId);\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcapture_options.capture_node_src_for_connection(event, index);\n\t\t}\n\t\tEventHelper.stopEvent(event);\n\t}\n\tfunction on_output_hover(event: MouseEvent, index: number) {\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcapture_options.capture_node_output_for_node_creation(event, index);\n\t\t}\n\t}\n\tfunction on_output_mouseleave(event: MouseEvent, index: number) {\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcapture_options.release_node_output_for_node_creation(event, index);\n\t\t}\n\t}\n\tfunction on_output_mouseup(event: MouseEvent, index: number) {\n\t\tcapture_options.capture_node_src_for_connection(event, index);\n\t}\n\tfunction on_display_flag_click(event: MouseEvent) {\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcontext.emit('set_display_flag', json_node.graph_node_id);\n\t\t}\n\t\tEventHelper.stopEvent(event);\n\t}\n\tfunction on_bypass_flag_click(event: MouseEvent) {\n\t\tif (event.button == MouseButton.LEFT) {\n\t\t\tcontext.emit('set_bypass_flag', json_node.graph_node_id);\n\t\t}\n\t\tEventHelper.stopEvent(event);\n\t}\n\n\tfunction on_name_mouseup() {\n\t\t// this is only here to prevent selection from being cleared\n\t\t// when clicking on the name to rename a node\n\t}\n\n\tfunction on_capture_connection_for_node_creation(\n\t\tinputNodeGraphNodeId: number,\n\t\tinputIndex: number,\n\t\toutputIndex?: number\n\t) {\n\t\tif (outputIndex == null) {\n\t\t\treturn;\n\t\t}\n\t\tconst nodeDest = StoreController.engine.node(json_node.graph_node_id);\n\t\tconst nodeSrc = StoreController.engine.node(inputNodeGraphNodeId);\n\t\tif (nodeSrc && nodeDest) {\n\t\t\tconst data: NodeCreateCommandConnectionData = {\n\t\t\t\tnodeSrc,\n\t\t\t\tnodeDest,\n\t\t\t\tinputIndex,\n\t\t\t\toutputIndex,\n\t\t\t};\n\t\t\tcapture_options.capture_connection_for_node_creation(data);\n\t\t}\n\t}\n\tfunction on_release_connection_for_node_creation(index: number) {\n\t\tcapture_options.release_connection_for_node_creation(index);\n\t}\n\n\treturn {\n\t\tonBodyPointerdown,\n\t\tonBodyTouchstart,\n\t\ton_body_mouseup,\n\t\t// on_body_click,\n\t\ton_input_hover,\n\t\ton_output_hover,\n\t\ton_input_mouseleave,\n\t\ton_output_mouseleave,\n\t\ton_capture_connection_for_node_creation,\n\t\ton_release_connection_for_node_creation,\n\n\t\ton_body_dblclick,\n\t\topenNodeFromTouchEvent,\n\t\topenNodeFromClickEvent,\n\t\ton_input_mousedown,\n\t\ton_input_mouseup,\n\t\ton_output_mousedown,\n\t\ton_output_mouseup,\n\t\ton_display_flag_click,\n\t\ton_bypass_flag_click,\n\t\ton_name_mouseup,\n\t\topen_node,\n\t\tenterNodeButtonId,\n\t};\n}\n","import {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {NodeContext} from '../../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {BaseNodeClass} from '../../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {computed} from 'vue';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\n\n// js\nimport {DebugJsNode} from '../../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/Debug';\n\ninterface NodeData {\n\tcontext: NodeContext;\n\ttype: string;\n}\nfunction nodeData(node: typeof BaseNodeClass): NodeData {\n\treturn {\n\t\tcontext: node.context(),\n\t\ttype: node.type(),\n\t};\n}\nconst NODES_WITH_EXTRA = [\n\t// js\n\tnodeData(DebugJsNode),\n].map((data) => `${data.context}/${data.type}`);\n\nexport function SetupExtras(JSONNode: EngineNodeData) {\n\t// const showExtrasContainer = ref(false);\n\n\tconst json_node_id = computed(() => {\n\t\treturn JSONNode.graph_node_id;\n\t});\n\tconst extrasContainerKey = computed(() => {\n\t\treturn JSONNode.graph_node_id;\n\t});\n\n\tconst showExtrasContainer = computed(() => {\n\t\tif (json_node_id.value == null) {\n\t\t\treturn false;\n\t\t}\n\t\tconst node = StoreController.engine.node(json_node_id.value);\n\t\tif (node == null) {\n\t\t\treturn false;\n\t\t}\n\t\tconst contextAndType = `${node.context()}/${node.type()}`;\n\t\treturn NODES_WITH_EXTRA.includes(contextAndType);\n\t});\n\n\treturn {\n\t\tshowExtrasContainer,\n\t\textrasContainerKey,\n\t};\n}\n","import {EngineNodeData} from '../../../../../../store/modules/Engine';\n// import {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {computed} from 'vue';\nexport function SetupIcon(json_node: EngineNodeData) {\n\t// const node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst icon = computed(() => {\n\t\t// TODO: it could make the engine lighter if refs to the icons were in the editor only\n\t\treturn null; //node?.uiData.icon();\n\t});\n\tconst display_icon = computed(() => {\n\t\treturn icon.value != null;\n\t});\n\n\treturn {\n\t\ticon,\n\t\tdisplay_icon,\n\t};\n}\n","import {computed, ComputedRef} from 'vue';\nimport type {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {NodeInfoController} from '../../../../../../store/controllers/editor/NodeInfoController';\n\nexport interface SetupInfosOptions {\n\tnodeInfoDisplayed: ComputedRef<boolean>;\n\tdisplayInfo: (element: HTMLElement) => void;\n\thideInfo: () => void;\n}\n\nexport function SetupInfos(jsonNode: EngineNodeData): SetupInfosOptions {\n\tconst nodeInfoDisplayed = computed(() => {\n\t\treturn NodeInfoController.displayedByNodeId.value[jsonNode.graph_node_id] || false;\n\t});\n\n\tlet triggeredElement: HTMLElement | undefined;\n\tfunction displayInfo(element?: HTMLElement) {\n\t\tNodeInfoController.displayedByNodeId.value[jsonNode.graph_node_id] = true;\n\t\ttriggeredElement = element;\n\t\ttriggeredElement?.addEventListener('pointerup', hideInfo);\n\t}\n\tfunction hideInfo() {\n\t\tdelete NodeInfoController.displayedByNodeId.value[jsonNode.graph_node_id];\n\t\ttriggeredElement?.removeEventListener('pointerup', hideInfo);\n\t\ttriggeredElement = undefined;\n\t}\n\n\treturn {\n\t\tnodeInfoDisplayed,\n\t\tdisplayInfo,\n\t\thideInfo,\n\t};\n}\n","import {BaseAnimNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/anim/_Base';\nimport {AnimType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Anim';\n\nconst INPUT_GEOMETRY_NAME = 'input animation clip';\nconst DEFAULT_INPUT_NAMES = [INPUT_GEOMETRY_NAME, INPUT_GEOMETRY_NAME, INPUT_GEOMETRY_NAME, INPUT_GEOMETRY_NAME];\n\nexport function nodeInputNamesAnim(node: BaseAnimNodeType): string[] {\n\tswitch (node.type()) {\n\t\tcase AnimType.PLAY: {\n\t\t\treturn ['from', 'to'];\n\t\t}\n\t}\n\treturn DEFAULT_INPUT_NAMES;\n}\n","import {BaseAudioNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/audio/_Base';\nimport {AudioType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Audio';\n\nconst INPUT_NAME = 'input audio properties';\nconst DEFAULT_INPUT_NAMES = [INPUT_NAME, INPUT_NAME, INPUT_NAME, INPUT_NAME];\n\nconst MAP: Record<string, string[]> = {\n\t[AudioType.AM_SYNTH]: ['envelope'],\n\t[AudioType.FM_SYNTH]: ['envelope'],\n\t[AudioType.MONO_SYNTH]: ['envelope'],\n\t[AudioType.POLY_SYNTH]: ['envelope'],\n\t[AudioType.SAMPLER]: ['envelope'],\n\t[AudioType.SYNTH]: ['envelope'],\n};\n\nexport function nodeInputNamesAudio(node: BaseAudioNodeType): string[] {\n\treturn MAP[node.type()] || DEFAULT_INPUT_NAMES;\n}\n","import {BaseCopNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/cop/_Base';\nimport {CopType, CopTypeImage} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cop';\n\nconst INPUT_COP_NAME = 'input texture';\nconst DEFAULT_INPUT_NAMES = [INPUT_COP_NAME, INPUT_COP_NAME, INPUT_COP_NAME, INPUT_COP_NAME];\n\nconst MAP: Record<string, string[]> = {\n\t[CopType.GIF]: ['optional texture to copy attributes from'],\n\t[CopTypeImage.IMAGE]: ['optional texture to copy attributes from'],\n\t[CopTypeImage.IMAGE_EXR]: ['optional texture to copy attributes from'],\n\t[CopTypeImage.IMAGE_HDR]: ['optional texture to copy attributes from'],\n\t[CopTypeImage.IMAGE_KTX2]: ['optional texture to copy attributes from'],\n\t[CopType.SNAPSHOT]: ['input to take a snapshot of'],\n\t[CopType.VIDEO]: ['optional texture to copy attributes from'],\n\t[CopType.WEB_CAM]: ['optional texture to copy attributes from'],\n};\n\nexport function nodeInputNamesCop(node: BaseCopNodeType): string[] {\n\treturn MAP[node.type()] || DEFAULT_INPUT_NAMES;\n}\n","import {BaseObjNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/_Base';\n// import {ObjType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Obj';\n\nconst INPUT_OBJECT_NAME = 'parent object';\nconst DEFAULT_INPUT_NAMES = [INPUT_OBJECT_NAME, INPUT_OBJECT_NAME, INPUT_OBJECT_NAME, INPUT_OBJECT_NAME];\n\n// const MAP: Record<string, string[]> = {\n// \t[CopType.GIF]: ['optional texture to copy attributes from'],\n// \t[CopTypeImage.IMAGE]: ['optional texture to copy attributes from'],\n// \t[CopTypeImage.IMAGE_EXR]: ['optional texture to copy attributes from'],\n// \t[CopTypeImage.IMAGE_HDR]: ['optional texture to copy attributes from'],\n// \t[CopTypeImage.IMAGE_KTX2]: ['optional texture to copy attributes from'],\n// \t[CopType.SNAPSHOT]: ['input to take a snapshot of'],\n// \t[CopType.VIDEO]: ['optional texture to copy attributes from'],\n// \t[CopType.WEB_CAM]: ['optional texture to copy attributes from'],\n// };\n\nexport function nodeInputNamesObj(node: BaseObjNodeType): string[] {\n\treturn DEFAULT_INPUT_NAMES;\n}\n","import {BasePostProcessNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/post/_Base';\nimport {PostType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Post';\nimport {RANGE as EffectPassRANGE} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/post/EffectPass';\n\nconst INPUT_PASS_NAME = 'input pass';\nconst DEFAULT_INPUT_NAMES = [INPUT_PASS_NAME];\n\nconst MAP: Record<string, string[]> = {\n\t[PostType.EFFECT_PASS]: ['input pass', ...EffectPassRANGE.map((i) => `combined pass ${i}`)],\n\t[PostType.UPDATE_SCENE]: ['previous pass', 'updateScene node to reset changes of'],\n};\n\nexport function nodeInputNamesPost(node: BasePostProcessNodeType): string[] {\n\treturn MAP[node.type()] || DEFAULT_INPUT_NAMES;\n}\n","import {BaseSopNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport {SopType} from '../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\n\nconst INPUT_GEOMETRY_NAME = 'input geometry';\nconst DEFAULT_INPUT_NAMES = [INPUT_GEOMETRY_NAME, INPUT_GEOMETRY_NAME, INPUT_GEOMETRY_NAME, INPUT_GEOMETRY_NAME];\n\nconst MAP: Record<string, string[]> = {\n\t[SopType.ADD]: ['geometry to create polygons from (optional)'],\n\t[SopType.ANIMATION_COPY]: ['geometry to copy animation to', 'geometry to copy animation from'],\n\t[SopType.ATTRIB_COPY]: ['geometry to copy attributes to', 'geometry to copy attributes from'],\n\t[SopType.ATTRIB_DELETE]: ['geometry to delete attributes from'],\n\t[SopType.ATTRIB_TRANSFER]: ['geometry to transfer attributes to', 'geometry to transfer attributes from'],\n\t[SopType.BBOX_SCATTER]: ['geometry to create points from'],\n\t[SopType.BLEND]: ['geometry to blend from', 'geometry to blend to'],\n\t[SopType.BOX]: ['geometry to create bounding box from (optional)'],\n\t[SopType.BOX_LINES]: ['geometry to create bounding lines from (optional)'],\n\t[SopType.BVH]: ['geometry to create BVH from'],\n\t[SopType.BVH_VISUALIZER]: ['geometry with bvh'],\n\t[SopType.CACHE]: ['geometry to cache'],\n\t[SopType.CAD_GROUP]: ['input geometries', 'bounding box (optional)'],\n\t[SopType.CAD_LOFT]: ['curves'],\n\t[SopType.CAD_PIPE]: ['profiles', 'paths'],\n\t[SopType.CAD_TRANSFORM]: ['geometries or objects to transform'],\n\t[SopType.CAMERA_PROJECT]: ['points to project/unproject', 'camera'],\n\t[SopType.COLOR]: ['geometry to update color of'],\n\t[SopType.COPY]: ['geometry to be copied', 'points to copy to (optional)'],\n\t[SopType.DECAL]: ['geometry to create decal from'],\n\t[SopType.DELETE]: ['geometry to delete from', 'points inside this geometry will be deleted (optional)'],\n\t[SopType.FACET]: ['geometry to update normals of'],\n\t[SopType.FUSE]: ['points to fuse together'],\n\t[SopType.HIERARCHY]: [\n\t\t'geometry to add or remove parents to/from',\n\t\t'objects to use as parent or children (optional)',\n\t],\n\t[SopType.INSTANCE]: ['geometry to be instanciated', 'points to instance to'],\n\t[SopType.INSTANCE_UPDATE]: ['instance to update', 'geometry to copy attributes from'],\n\t[SopType.JITTER]: ['geometry to jitter points of'],\n\t[SopType.LAYER]: ['objects to change layers of'],\n\t[SopType.LOD]: ['high res', 'mid res', 'low res'],\n\t[SopType.LOOK_AT]: ['geometries or objects to transform'],\n\t[SopType.MAPBOX_TRANSFORM]: ['points to transform in mapbox space'],\n\t[SopType.MATERIAL]: ['objects to assign material to'],\n\t[SopType.MATERIAL_PROPERTIES]: ['objects with materials to change properties of'],\n\t[SopType.MERGE]: (function () {\n\t\tconst I = 'geometries to merge';\n\t\treturn [I, I, I, I];\n\t})(),\n\t[SopType.METABALL]: ['points to create metaballs from'],\n\t[SopType.NOISE]: ['geometry to add noise to'],\n\t[SopType.NORMALS]: ['geometry to update normals of'],\n\t[SopType.NORMALS_HELPER]: ['geometry to view normals of'],\n\t[SopType.OBJECT_PROPERTIES]: ['objects to change properties of'],\n\t[SopType.OBJECTS_LAYOUT]: ['objects to transform'],\n\t[SopType.PARTICLES_SYSTEM_GPU]: ['points to emit particles from'],\n\t[SopType.PHYSICS_PLAYER]: ['player object (optional)', 'camera (optional)'],\n\t[SopType.PHYSICS_RBD_ATTRIBUTES]: ['objects to add physics RBD attributes to'],\n\t[SopType.PHYSICS_RBD_JOINTS]: ['RBD objects to create joints for'],\n\t[SopType.PLANE]: ['geometry to create plane from (optional)'],\n\t[SopType.POINT]: ['points to move'],\n\t[SopType.POLAR_TRANSFORM]: ['geometries or objects to transform'],\n\t[SopType.POLYWIRE]: ['lines to create tubes from'],\n\t[SopType.RAY]: ['geometry to move', 'geometry to ray onto'],\n\t[SopType.REFLECTOR]: ['geometry to create a reflector from'],\n\t[SopType.ROUNDED_BOX]: ['geometry to create rounded box from (optional)'],\n\t[SopType.SCATTER]: ['geometry to scatter points onto'],\n\t[SopType.SET_CHILDREN]: ['object to set the children of', 'objects to use as children'],\n\t[SopType.SET_GEOMETRY]: ['objects to places geometries into', 'objects to take geometries from'],\n\t[SopType.SHEAR]: ['geometries or objects to transform'],\n\t[SopType.SKELETON_HELPER]: ['geometry to view skeleton of'],\n\t[SopType.SKIN]: ['lines to create polygons from', 'if used, lines from both inputs will be used'],\n\t[SopType.SORT]: ['geometry to sort'],\n\t[SopType.SPLIT]: ['geometry to split in multiple objects'],\n\t[SopType.SWITCH]: (function () {\n\t\tconst I = 'geometry to switch to';\n\t\treturn [I, I, I, I];\n\t})(),\n\t[SopType.TET_EMBED]: ['tetrahedrons', 'highres threejs geometry'],\n\t[SopType.TEXTURE_COPY]: ['objects to copy textures to', 'objects to copy textures from'],\n\t[SopType.TEXTURE_PROPERTIES]: ['objects with textures to change properties of'],\n\t[SopType.TRANSFORM]: ['geometries or objects to transform'],\n\t[SopType.TRANSFORM_COPY]: ['objects to transform', 'objects to copy transform from'],\n\t[SopType.TRANSFORM_MULTI]: ['objects to transform', 'objects to copy initial transform from'],\n\t[SopType.TRANSFORM_RESET]: ['objects to reset transform', 'optional reference for center'],\n\t[SopType.UV_LAYOUT]: ['geometries to unwrap UVs'],\n\t[SopType.UV_UNWRAP]: ['geometries to unwrap UVs'],\n\t[SopType.WEB_XR_AR_ESTIMATED_LIGHT]: ['default lights'],\n\t[SopType.WFC_BUILDER]: ['quads', 'tiles'],\n\t[SopType.WFC_SOLVER]: ['quads', 'tiles and rules'],\n};\n\nexport function nodeInputNamesSop(node: BaseSopNodeType): string[] {\n\treturn MAP[node.type()] || DEFAULT_INPUT_NAMES;\n}\n","import {BaseNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from '../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n//\nimport {BaseAnimNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/anim/_Base';\nimport {BaseAudioNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/audio/_Base';\nimport {BaseCopNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/cop/_Base';\nimport {BaseObjNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/_Base';\nimport {BasePostProcessNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/post/_Base';\nimport {BaseSopNodeType} from '../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\n//\nimport {nodeInputNamesAnim} from './NodeInputNamesAnim';\nimport {nodeInputNamesAudio} from './NodeInputNamesAudio';\nimport {nodeInputNamesCop} from './NodeInputNamesCop';\nimport {nodeInputNamesObj} from './NodeInputNamesObj';\nimport {nodeInputNamesPost} from './NodeInputNamesPost';\nimport {nodeInputNamesSop} from './NodeInputNamesSop';\n//\nexport function nodeInputNames(node: BaseNodeType): string[] {\n\tconst displayedInputNames = node.displayedInputNames();\n\tif (displayedInputNames) {\n\t\treturn displayedInputNames;\n\t}\n\n\tconst context = node.context();\n\tswitch (context) {\n\t\tcase NodeContext.ANIM: {\n\t\t\treturn nodeInputNamesAnim(node as BaseAnimNodeType);\n\t\t}\n\t\tcase NodeContext.AUDIO: {\n\t\t\treturn nodeInputNamesAudio(node as BaseAudioNodeType);\n\t\t}\n\t\tcase NodeContext.COP: {\n\t\t\treturn nodeInputNamesCop(node as BaseCopNodeType);\n\t\t}\n\t\tcase NodeContext.OBJ: {\n\t\t\treturn nodeInputNamesObj(node as BaseObjNodeType);\n\t\t}\n\t\tcase NodeContext.POST: {\n\t\t\treturn nodeInputNamesPost(node as BasePostProcessNodeType);\n\t\t}\n\t\tcase NodeContext.SOP: {\n\t\t\treturn nodeInputNamesSop(node as BaseSopNodeType);\n\t\t}\n\t}\n\treturn ['input', 'input', 'input', 'input'];\n}\n","import {Constants} from './../../../../../../core/network/Constants';\nimport {typeClassName, CssType} from './../../../../../../core/ColorUtils';\nimport {ArrayUtils} from './../../../../../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {PolyDictionary} from './../../../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport lodash_range from 'lodash/range';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\n// import {BaseNodeClass} from '../../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {computed, ComputedRef, Ref} from 'vue';\nimport {CoreGraphNodeId} from '../../../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {nodeInputNames} from './../../../../../../../../src/editor/core/hooks/inputNames/NodeInputNames';\n\nconst DEFAULT_BG_CLASS_NAME = 'bg-sky-500';\nconst DEFAULT_BG_CLASS_OBJECT = {[DEFAULT_BG_CLASS_NAME]: true};\ntype ClassObject = PolyDictionary<boolean>;\n\nexport function SetupInputs(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>,\n\tlayout_vertical: Readonly<Ref<boolean>>\n) {\n\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst inputs = computed(() => {\n\t\treturn json_node.inputs || [];\n\t});\n\tconst input_names = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\t\treturn json_node.named_input_connection_points.map((i) => i.name);\n\t\t\t} else {\n\t\t\t\treturn nodeInputNames(node); //(node.constructor as typeof BaseNodeClass).displayedInputNames();\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst input_titles = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\t\treturn json_node.named_input_connection_points.map((i) => `${i.name} (${i.type})`);\n\t\t\t} else {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\t\treturn [];\n\t});\n\tconst input_connection_output_indices = computed(() => {\n\t\t// if (!json_node.input_connection_output_indices) {\n\t\t// \treturn [];\n\t\t// }\n\t\t// const list: Array<number | undefined> = [];\n\t\t// const inputsCount = json_node.inputs.length;\n\t\t// for (let i = 0; i < inputsCount; i++) {\n\t\t// \tif (json_node.inputs[i] != null) {\n\t\t// \t\tlist.push(json_node.input_connection_output_indices[i]);\n\t\t// \t}\n\t\t// }\n\t\t// return list;\n\t\t// return json_node.inputs.map((graph_node_id, i) => {\n\t\t// \treturn graph_node_id != null;\n\t\t// });\n\t\treturn json_node.input_connection_output_indices || [];\n\t});\n\tconst input_json_nodes = computed(() => {\n\t\treturn json_node.inputs.map((graph_node_id) => {\n\t\t\tif (graph_node_id) {\n\t\t\t\treturn StoreController.engine.json_node(graph_node_id);\n\t\t\t}\n\t\t});\n\t});\n\tconst validInputJsonNodes = computed(() => {\n\t\treturn inputsWithValidStates.value.map((graph_node_id) => {\n\t\t\tif (graph_node_id) {\n\t\t\t\treturn StoreController.engine.json_node(graph_node_id);\n\t\t\t}\n\t\t});\n\t});\n\tconst input_valid_states = computed(() => {\n\t\treturn json_node.inputs.map((graph_node_id) => {\n\t\t\treturn graph_node_id != null;\n\t\t});\n\t});\n\tconst inputsWithValidStates: ComputedRef<CoreGraphNodeId[]> = computed(() => {\n\t\tconst ids:number[]=[]\n\t\tArrayUtils.compact(json_node.inputs,ids);\n\t\treturn ids\n\t});\n\tconst max_inputs_count: Readonly<Ref<number>> = computed(() => {\n\t\treturn json_node.maxInputsCount;\n\t});\n\tconst available_inputs: Readonly<Ref<readonly number[]>> = computed(() => {\n\t\tlet count: number = max_inputs_count.value;\n\t\tif (node) {\n\t\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\t\tcount = json_node.named_input_connection_points.length;\n\t\t\t}\n\t\t\treturn lodash_range(count);\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst inputs_container_style_object = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\treturn {\n\t\t\t\tbottom: `${0.5 * body_size.value.y}px`,\n\t\t\t\tleft: `${-0.5 * body_size.value.x}px`,\n\t\t\t\twidth: `${body_size.value.x}px`,\n\t\t\t\theight: `${Constants.CONNECTION_VERTICAL_MARGIN}px`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\ttop: `${-0.5 * body_size.value.y}px`,\n\t\t\t\tleft: `${-0.5 * body_size.value.x - Constants.CONNECTION_VERTICAL_MARGIN}px`,\n\t\t\t\twidth: `${Constants.CONNECTION_VERTICAL_MARGIN}px`,\n\t\t\t\theight: `${body_size.value.y}px`,\n\t\t\t};\n\t\t}\n\t});\n\t// input_style_objects() {\n\t// \tconst intervals_count = this.max_inputs_count + 1\n\t// \treturn lodash_range(this.max_inputs_count).map((input, i)=>{\n\t// \t\treturn {\n\t// \t\t\tmarginLeft: `${100*(i+2)/intervals_count}%`\n\t// \t\t}\n\t// \t})\n\t// },\n\tconst inputs_pixel_style_objects = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\tconst intervals_count = available_inputs.value.length + 1;\n\t\t\treturn available_inputs.value.map((input, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tmarginLeft: `${(100 * (i + 1)) / intervals_count}%`,\n\t\t\t\t};\n\t\t\t});\n\t\t} else {\n\t\t\treturn available_inputs.value.map((input, i) => {\n\t\t\t\treturn {\n\t\t\t\t\ttop: `${Constants.CONNECTION_VERTICAL_SPACING * i + Constants.CONNECTION_VERTICAL_START}px`,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t});\n\tconst connection_pixel_input_class_objects: ComputedRef<ClassObject[]> = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\t\treturn json_node.named_input_connection_points.map((connection, i) => {\n\t\t\t\t\t// const className = connection.type.replace('[]', '');\n\t\t\t\t\tconst type = connection.type;\n\t\t\t\t\tconst className = typeClassName(type, CssType.BG, 500) || DEFAULT_BG_CLASS_NAME;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t[className]: true,\n\t\t\t\t\t\tisArray: connection.isArray,\n\t\t\t\t\t} as ClassObject;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn available_inputs.value.map((o) => DEFAULT_BG_CLASS_OBJECT);\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst input_connection_name_element_class_objects = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\t\t// const connectionPoints = json_node.named_input_connection_points;\n\t\t\t\treturn available_inputs.value.map((input, i) => {\n\t\t\t\t\t// const connectionPoint = connectionPoints[i];\n\t\t\t\t\t// const type = connectionPoint.type;\n\t\t\t\t\t// const className = 'bg-black'; //typeClassName(type, CssType.BG, 900);\n\t\t\t\t\treturn {\n\t\t\t\t\t\t// [className]: true,\n\t\t\t\t\t\tnamed_element: true,\n\t\t\t\t\t} as ClassObject;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn available_inputs.value.map((input, i) => {\n\t\t\t\t\treturn {non_named_element: true};\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst input_connection_name_element_bg_class_objects = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.inputs.hasNamedInputs()) {\n\t\t\t\tconst connectionPoints = json_node.named_input_connection_points;\n\t\t\t\treturn available_inputs.value.map((input, i) => {\n\t\t\t\t\tconst connectionPoint = connectionPoints[i];\n\t\t\t\t\tconst type = connectionPoint.type;\n\t\t\t\t\tconst className = typeClassName(type, CssType.BG, 900) || DEFAULT_BG_CLASS_NAME;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t[className]: true,\n\t\t\t\t\t} as ClassObject;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn available_inputs.value.map((input, i) => {\n\t\t\t\t\treturn {};\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\n\treturn {\n\t\tinputs,\n\t\tinput_names,\n\t\tinput_titles,\n\t\tinput_connection_output_indices,\n\t\tinput_json_nodes,\n\t\tvalidInputJsonNodes,\n\t\tinput_valid_states,\n\t\tinputsWithValidStates,\n\t\tmax_inputs_count,\n\t\tavailable_inputs,\n\t\tinputs_container_style_object,\n\t\tinputs_pixel_style_objects,\n\t\tconnection_pixel_input_class_objects,\n\t\tinput_connection_name_element_class_objects,\n\t\tinput_connection_name_element_bg_class_objects,\n\t};\n}\n","import {EventHelper} from './../../../../../../core/EventHelper';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\n\nimport {computed, Ref} from 'vue';\nimport {editNodeName} from '../../../../../../core/NodeNameEdit';\nexport function SetupNamed(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>,\n\tlayout_vertical: Readonly<Ref<boolean>>\n) {\n\t// const node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst name = computed(() => {\n\t\treturn json_node.name;\n\t});\n\tconst name_container_style_object = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\treturn {\n\t\t\t\tleft: `${0.5 * body_size.value.x}px`,\n\t\t\t\t// top: `${has_params_label ? -30 : 0}px`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tleft: `${-0.5 * body_size.value.x}px`,\n\t\t\t\ttop: `${-0.5 * body_size.value.y}px`,\n\t\t\t};\n\t\t}\n\t});\n\n\tasync function onNameClick(event: TouchEvent | MouseEvent) {\n\t\tEventHelper.stopEvent(event);\n\t\tawait editNodeName(json_node);\n\t}\n\n\treturn {\n\t\tname,\n\t\tname_container_style_object,\n\t\tonNameClick,\n\t};\n}\n","import {Constants} from './../../../../../../core/network/Constants';\nimport {typeClassName, CssType} from './../../../../../../core/ColorUtils';\nimport {PolyDictionary} from './../../../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {ComputedRef} from 'vue';\nimport lodash_range from 'lodash/range';\n\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {computed, Ref} from 'vue';\n\nconst DEFAULT_BG_CLASS_NAME = 'bg-green-500';\nconst DEFAULT_BG_CLASS_OBJECT = {[DEFAULT_BG_CLASS_NAME]: true};\n\ntype ClassObject = PolyDictionary<boolean>;\n\nexport function SetupOutputs(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>,\n\tlayout_vertical: Readonly<Ref<boolean>>\n) {\n\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst has_outputs: Readonly<Ref<boolean>> = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\treturn json_node.named_output_connection_points.length > 0;\n\t\t\t} else {\n\t\t\t\treturn node.io.outputs.hasOutputs();\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n\tconst output_container_style_object = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\treturn {\n\t\t\t\ttop: `${0.5 * body_size.value.y}px`,\n\t\t\t\tleft: `${-0.5 * body_size.value.x}px`,\n\t\t\t\twidth: `${body_size.value.x}px`,\n\t\t\t\theight: `${Constants.CONNECTION_VERTICAL_MARGIN}px`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\ttop: `${-0.5 * body_size.value.y}px`,\n\t\t\t\tleft: `${0.5 * body_size.value.x}px`,\n\t\t\t\twidth: `${Constants.CONNECTION_VERTICAL_MARGIN}px`,\n\t\t\t\theight: `${body_size.value.x}px`,\n\t\t\t};\n\t\t}\n\t});\n\tconst output_names: Readonly<Ref<readonly string[]>> = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\treturn json_node.named_output_connection_points.map((o) => o.name);\n\t\t\t} else {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst output_titles: Readonly<Ref<readonly string[]>> = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\treturn json_node.named_output_connection_points.map((o) => `${o.name} (${o.type})`);\n\t\t\t} else {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst max_outputs_count = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\treturn json_node.named_output_connection_points.length;\n\t\t\t} else {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t});\n\tconst available_outputs = computed(() => {\n\t\treturn lodash_range(max_outputs_count.value);\n\t});\n\tconst outputs_pixel_style_objects = computed(() => {\n\t\tif (layout_vertical.value) {\n\t\t\t// const intervals_count = this.available_outputs.length + 1\n\t\t\treturn available_outputs.value.map((output, i) => {\n\t\t\t\treturn {\n\t\t\t\t\t// marginLeft: `${100*(i+1)/intervals_count}%`\n\t\t\t\t};\n\t\t\t});\n\t\t} else {\n\t\t\treturn available_outputs.value.map((output, i) => {\n\t\t\t\treturn {\n\t\t\t\t\ttop: `${Constants.CONNECTION_VERTICAL_SPACING * i + Constants.CONNECTION_VERTICAL_START}px`,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t});\n\tconst connection_pixel_output_class_objects: ComputedRef<ClassObject[]> = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\treturn json_node.named_output_connection_points.map((connection, i) => {\n\t\t\t\t\t// const className = connection.type.replace('[]', '');\n\t\t\t\t\tconst type = connection.type;\n\t\t\t\t\tconst className = typeClassName(type, CssType.BG, 500) || DEFAULT_BG_CLASS_NAME;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t[className]: true,\n\t\t\t\t\t\tisArray: connection.isArray,\n\t\t\t\t\t} as ClassObject;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn available_outputs.value.map((o) => DEFAULT_BG_CLASS_OBJECT);\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst output_connection_name_element_class_objects = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\treturn available_outputs.value.map((output, i) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnamed_element: true,\n\t\t\t\t\t} as ClassObject;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn available_outputs.value.map((input, i) => {\n\t\t\t\t\treturn {non_named_element: true};\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst output_connection_name_element_bg_class_objects = computed(() => {\n\t\tif (node) {\n\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\tconst connectionPoints = json_node.named_output_connection_points;\n\t\t\t\treturn available_outputs.value.map((output, i) => {\n\t\t\t\t\tconst connectionPoint = connectionPoints[i];\n\t\t\t\t\tconst type = connectionPoint.type;\n\t\t\t\t\tconst className = typeClassName(type, CssType.BG, 900) || DEFAULT_BG_CLASS_NAME;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t[className]: true,\n\t\t\t\t\t} as ClassObject;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn available_outputs.value.map((input, i) => {\n\t\t\t\t\treturn {};\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\n\treturn {\n\t\thas_outputs,\n\t\toutput_container_style_object,\n\t\toutput_names,\n\t\toutput_titles,\n\t\tmax_outputs_count,\n\t\tavailable_outputs,\n\t\toutputs_pixel_style_objects,\n\t\tconnection_pixel_output_class_objects,\n\t\toutput_connection_name_element_class_objects,\n\t\toutput_connection_name_element_bg_class_objects,\n\t};\n}\n","import {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {computed, ComputedRef, ref, Ref, onMounted, onBeforeMount, onUnmounted} from 'vue';\nimport {CoreGraphNode} from '../../../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraphNode';\nimport {CoreType} from '../../../../../../../../@polygonjs/polygonjs/src/core/Type';\n\nimport {ParamsLabelResult} from '../../../../../../core/hooks/paramsLabel/BaseSetup';\nexport function SetupParamsLabel(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>,\n\tlayout_vertical: Readonly<Ref<boolean>>,\n\tzoom: ComputedRef<number>\n) {\n\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\t// let labels_controller: ParamsLabelController | undefined;\n\tlet coreGraphNode: CoreGraphNode | undefined;\n\tconst paramsLabelResult = ref<ParamsLabelResult[]>([]);\n\n\tonMounted(() => {\n\t\t// if (node) {\n\t\t// \tif (node.params.hasLabelController()) {\n\t\t// \t\tlabels_controller = node.params.label;\n\t\tsetupGraphNode();\n\t\t// }\n\t\t// }\n\t});\n\tonBeforeMount(disconnectGraphNode);\n\tonUnmounted(disconnectGraphNode);\n\tfunction disconnectGraphNode() {\n\t\tif (coreGraphNode) {\n\t\t\tcoreGraphNode.graphRemove();\n\t\t\tcoreGraphNode = undefined;\n\t\t}\n\t}\n\n\tconst hasParamsLabelResult = computed(() => {\n\t\treturn zoom.value > 0.4 && paramsLabelResult.value != null && paramsLabelResult.value.length > 0;\n\t});\n\n\tasync function setupGraphNode() {\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\t// load hooks controller async\n\t\tconst {EditorCoreHooksController} = await import('../../../../../../core/hooks/HooksController');\n\t\tconst setupFunc = EditorCoreHooksController.paramsLabel.nodeConfig(node);\n\t\tif (!setupFunc) {\n\t\t\treturn;\n\t\t}\n\t\tconst {params, callback} = setupFunc(node);\n\t\tconst paramsList = CoreType.isArray(params) ? params : [params];\n\n\t\tasync function evalDirtyParamsAndSetResult() {\n\t\t\tconst dirtyParams = paramsList.filter((p) => p.isDirty());\n\t\t\tawait Promise.all(dirtyParams.map((p) => p.compute()));\n\t\t\tsetResult(await callback());\n\t\t}\n\n\t\tcoreGraphNode = new CoreGraphNode(node.scene(), 'ParamsLabel');\n\t\tfor (let param of paramsList) {\n\t\t\tcoreGraphNode.addGraphInput(param, false);\n\t\t}\n\t\tcoreGraphNode.addPostDirtyHook('ParamsLabel', evalDirtyParamsAndSetResult);\n\t\tevalDirtyParamsAndSetResult();\n\t}\n\tfunction setResult(result: ParamsLabelResult | ParamsLabelResult[]) {\n\t\tparamsLabelResult.value?.splice(0, paramsLabelResult.value.length);\n\t\tif (CoreType.isArray(result)) {\n\t\t\tfor (let item of result) {\n\t\t\t\tparamsLabelResult.value.push(item);\n\t\t\t}\n\t\t} else {\n\t\t\tparamsLabelResult.value.push(result);\n\t\t}\n\t}\n\n\t// const paramsLabelContainerStyleObject = computed(() => {\n\t// \tif (layout_vertical.value) {\n\t// \t\treturn {\n\t// \t\t\tleft: `${0.5 * body_size.value.x}px`,\n\t// \t\t\ttop: `${25}px`,\n\t// \t\t};\n\t// \t} else {\n\t// \t\treturn {\n\t// \t\t\tleft: `${-0.5 * body_size.value.x - 10}px`,\n\t// \t\t\ttop: `${0.5 * body_size.value.y + 15}px`,\n\t// \t\t};\n\t// \t}\n\t// });\n\n\treturn {\n\t\thasParamsLabelResult,\n\t\t// paramsLabelContainerStyleObject,\n\t\tparamsLabelResult,\n\t};\n}\n","import {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {EnterButtonContainerStyleObjectNumber} from './ChildrenOwner';\n\nimport {computed, Ref} from 'vue';\nexport function SetupPolyNode(\n\tjson_node: EngineNodeData,\n\tbody_size: Readonly<\n\t\tRef<\n\t\t\tReadonly<{\n\t\t\t\tx: number;\n\t\t\t\ty: number;\n\t\t\t}>\n\t\t>\n\t>,\n\tlayout_vertical: Readonly<Ref<boolean>>,\n\tenterButtonContainerStyleObjectNumber: EnterButtonContainerStyleObjectNumber\n) {\n\tconst node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst isPolyNode = computed(() => {\n\t\treturn node && node.polyNodeController;\n\t});\n\tconst isPolyNodeLocked = computed(() => {\n\t\treturn json_node.polyNode?.locked || false;\n\t});\n\tconst polyNodeLockStateIconStyleObject = computed(() => {\n\t\tconst v = enterButtonContainerStyleObjectNumber.value;\n\t\treturn {\n\t\t\ttop: `${v.top}px`,\n\t\t\tright: v.right ? `${v.right + 40}px` : undefined,\n\t\t\tleft: v.left ? `${v.left - 40}px` : undefined,\n\t\t};\n\t});\n\n\treturn {\n\t\tisPolyNode,\n\t\tisPolyNodeLocked,\n\t\tpolyNodeLockStateIconStyleObject,\n\t};\n}\n","import {computed} from 'vue';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {Vector2} from 'three';\nexport function SetupPosition(json_node: EngineNodeData) {\n\t// const node = StoreController.engine.node(json_node.graph_node_id);\n\n\tconst position_v = new Vector2();\n\tconst position = computed(() => {\n\t\tposition_v.set(json_node.ui_data_json.x, json_node.ui_data_json.y);\n\t\treturn position_v;\n\t});\n\tconst is_being_moved = computed(() => {\n\t\tconst state_by_node_ids = StoreController.editor.network.node_ids_being_moved();\n\t\treturn state_by_node_ids[json_node.graph_node_id] || false;\n\t\t// const node_ids = this.$store.getters['editor/network/node_ids_being_moved'];\n\t\t// return lodash_includes(node_ids, this.node.graph_node_id());\n\t});\n\n\treturn {\n\t\tposition,\n\t\tis_being_moved,\n\t};\n}\n","import {computed, Ref} from 'vue';\nimport {EngineNodeData} from '../../../../../../store/modules/Engine';\nexport function SetupSelection(json_node: EngineNodeData, json_parent: EngineNodeData) {\n\t// const json_selection = computed(()=>{\n\t// \treturn json_parent.selection\n\t// })\n\tconst isSelected: Readonly<Ref<boolean>> = computed(() => {\n\t\tif (json_parent.selection) {\n\t\t\tconst res: boolean = json_parent.selection.includes(json_node.graph_node_id);\n\t\t\treturn res;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n\n\treturn {\n\t\tisSelected,\n\t};\n}\n","import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"NetworkNodeConnection\"\n}\nconst _hoisted_2 = [\"x1\", \"y1\", \"x2\", \"y2\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_ctx.src_position && _ctx.dest_position)\n    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n        (_openBlock(), _createElementBlock(\"svg\", {\n          style: _normalizeStyle(_ctx.svg_style_object)\n        }, [\n          _createElementVNode(\"line\", {\n            class: _normalizeClass(_ctx.line_class_object),\n            x1: _ctx.src_position.x,\n            y1: _ctx.src_position.y,\n            x2: _ctx.dest_position.x,\n            y2: _ctx.dest_position.y,\n            onMouseenter: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.on_connection_mouseenter && _ctx.on_connection_mouseenter(...args))),\n            onMouseleave: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.on_connection_mouseleave && _ctx.on_connection_mouseleave(...args)))\n          }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_2)\n        ], 4 /* STYLE */))\n      ]))\n    : _createCommentVNode(\"v-if\", true)\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=template&id=9554779c&ts=true\"","import {Constants} from './../../../../../core/network/Constants';\nimport {NodeSize} from './../../helpers/NodeSize';\nimport {BaseNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StoreController} from './../../../../../store/controllers/StoreController';\nimport {Box2, Vector2} from 'three';\nimport {EngineNodeData} from './../../../../../store/modules/Engine';\nimport {isBooleanTrue} from './../../../../../../../@polygonjs/polygonjs/src/core/Type';\nfunction nodeFromJSON(json: EngineNodeData): BaseNodeType {\n\treturn StoreController.engine.node(json.graph_node_id)!;\n}\nconst node_box_v = new Vector2();\n\nfunction _nodeBoxInPlace(node: BaseNodeType, layout_vertical: boolean): Box2 {\n\tconst jsonNode = StoreController.engine.json_node(node.graphNodeId());\n\tif (!jsonNode) {\n\t\treturn new Box2();\n\t}\n\tconst width = NodeSize.width(jsonNode);\n\tlet connections_height = 0;\n\tif (!isBooleanTrue(layout_vertical)) {\n\t\tconst inputConnectionPoints = node.io.inputs.namedInputConnectionPoints();\n\t\tconst ouputConnectionPoints = node.io.outputs.namedOutputConnectionPoints();\n\t\tconst max_outputs_count = Math.max(\n\t\t\tinputConnectionPoints ? inputConnectionPoints.length : 0,\n\t\t\touputConnectionPoints ? ouputConnectionPoints.length : 0\n\t\t);\n\t\tconnections_height =\n\t\t\tConstants.CONNECTION_VERTICAL_START + max_outputs_count * Constants.CONNECTION_VERTICAL_SPACING;\n\t}\n\tconst node_height = Math.max(Constants.NODE_HEIGHT, connections_height);\n\tconst delta = new Vector2(\n\t\t0.5 * width + 2 * Constants.CONNECTION_VERTICAL_MARGIN,\n\t\t0.5 * node_height + 2 * Constants.CONNECTION_VERTICAL_MARGIN\n\t);\n\n\t// currently remove the caching of vectors\n\t// as this creates some bugs when copy/pasting objects,\n\t// where some connections appear incomplete.\n\t// The only reason for that change was to give a smoother\n\t// movement when moving nodes around.\n\t// (and the slow down is only noticeable when moving 20+ nodes)\n\t// let box = _box_by_node.get(node.graphNodeId());\n\t// if (!box) {\n\t// \tbox = new Box2();\n\t// \t_box_by_node.set(node.graphNodeId(), box);\n\t// }\n\t// box.min.copy(delta).multiplyScalar(-1);\n\t// box.max.copy(delta);\n\t// return box;\n\n\treturn new Box2(delta.clone().multiplyScalar(-1), delta);\n}\nexport function _nodeBox(json_node: EngineNodeData, layout_vertical: boolean): Box2 {\n\tconst node = nodeFromJSON(json_node);\n\tnode_box_v.x = json_node.ui_data_json.x;\n\tnode_box_v.y = json_node.ui_data_json.y;\n\tconst bbox = _nodeBoxInPlace(node, layout_vertical);\n\treturn bbox.translate(node_box_v);\n}\nexport function _nodeHeight(node: BaseNodeType, layout_vertical: boolean): number {\n\tconst box = _nodeBoxInPlace(node, layout_vertical);\n\tif (!box) {\n\t\treturn 0;\n\t}\n\tconst size = new Vector2();\n\tbox.getSize(size);\n\treturn size.y;\n}\n","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=style&index=0&id=9554779c&lang=sass\"","import { render } from \"./Connection.vue?vue&type=template&id=9554779c&ts=true\"\nimport script from \"./Connection.vue?vue&type=script&lang=ts\"\nexport * from \"./Connection.vue?vue&type=script&lang=ts\"\n\nimport \"./Connection.vue?vue&type=style&index=0&id=9554779c&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, renderList as _renderList, Fragment as _Fragment, withModifiers as _withModifiers } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"arrow-left h-0 w-0 border-y-8 border-y-transparent border-r-[16px] border-r-gray-300\" }, null, -1 /* HOISTED */)\nconst _hoisted_2 = { class: \"node_title_container bg-bg-dark text-white\" }\nconst _hoisted_3 = { class: \"grid-x\" }\nconst _hoisted_4 = { class: \"cell auto\" }\nconst _hoisted_5 = { class: \"cell shrink\" }\nconst _hoisted_6 = { class: \"node_info_container\" }\nconst _hoisted_7 = {\n  key: 0,\n  class: \"error_message icon_prefixed text-red-700 font-bold whitespace-nowrap\"\n}\nconst _hoisted_8 = {\n  key: 1,\n  class: \"time_dependency icon_prefixed text-green-700 whitespace-nowrap\"\n}\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", null, \"node computed successfully\", -1 /* HOISTED */)\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"node_info_separator bg-black\" }, null, -1 /* HOISTED */)\nconst _hoisted_11 = {\n  key: 3,\n  class: \"node_info_separator bg-black\"\n}\nconst _hoisted_12 = { class: \"dependencies\" }\nconst _hoisted_13 = { class: \"dependencies_section dependencies_predecessors\" }\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"dependencies_section_title\" }, \"PREDECESSORS:\", -1 /* HOISTED */)\nconst _hoisted_15 = { class: \"dependencies_list\" }\nconst _hoisted_16 = [\"onClick\"]\nconst _hoisted_17 = { class: \"dependencies_section dependencies_successors\" }\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"dependencies_section_title\" }, \"SUCCESSORS:\", -1 /* HOISTED */)\nconst _hoisted_19 = { class: \"dependencies_list\" }\nconst _hoisted_20 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"NetworkNodeInfo bg-bg border-2 border-gray-300 text-text shadow-2xl shadow-black\",\n    onPointerdown: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"])),\n    onPointerup: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n    onDblclick: _cache[3] || (_cache[3] = _withModifiers(() => {}, [\"stop\"]))\n  }, [\n    _hoisted_1,\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createElementVNode(\"div\", _hoisted_4, [\n          _createElementVNode(\"span\", {\n            onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.onNameClick && _ctx.onNameClick(...args)))\n          }, _toDisplayString(_ctx.node_name), 1 /* TEXT */)\n        ]),\n        _createElementVNode(\"div\", _hoisted_5, [\n          _createVNode(_component_font_awesome_icon, {\n            icon: \"fa-solid fa-xmark\",\n            onClick: _ctx.close\n          }, null, 8 /* PROPS */, [\"onClick\"])\n        ])\n      ])\n    ]),\n    _createElementVNode(\"div\", _hoisted_6, [\n      _createElementVNode(\"div\", {\n        class: _normalizeClass([\n\t\t\t\t\t'time_dependency icon_prefixed  font-bold whitespace-nowrap',\n\t\t\t\t\t_ctx.time_dependent ? 'text-yellow-600' : 'text-text',\n\t\t\t\t])\n      }, [\n        _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-clock\" }),\n        _createTextVNode(),\n        _createElementVNode(\"span\", null, _toDisplayString(_ctx.time_dependency_label), 1 /* TEXT */)\n      ], 2 /* CLASS */),\n      (_ctx.error_message)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n            _createVNode(_component_font_awesome_icon, {\n              icon: \"fa-solid fa-exclamation-triangle\",\n              class: \"text-red-800\"\n            }),\n            _createElementVNode(\"span\", null, _toDisplayString(_ctx.error_message), 1 /* TEXT */)\n          ]))\n        : _createCommentVNode(\"v-if\", true),\n      (!_ctx.error_message)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n            _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-check\" }),\n            _createTextVNode(),\n            _hoisted_9\n          ]))\n        : _createCommentVNode(\"v-if\", true),\n      _createCommentVNode(\" <div class=\\\"text-green-700\\\" v-else>not errored</div> \"),\n      _hoisted_10,\n      (_ctx.current_node_info_type)\n        ? (_openBlock(), _createBlock(_resolveDynamicComponent(_ctx.current_node_info_type), {\n            key: _ctx.subComponentKey,\n            graph_node_id: _ctx.graph_node_id\n          }, null, 8 /* PROPS */, [\"graph_node_id\"]))\n        : _createCommentVNode(\"v-if\", true),\n      (_ctx.current_node_info_type)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11))\n        : _createCommentVNode(\"v-if\", true),\n      _createElementVNode(\"div\", _hoisted_12, [\n        _createElementVNode(\"div\", _hoisted_13, [\n          _hoisted_14,\n          _createElementVNode(\"div\", _hoisted_15, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.scene_predecessor_paths, (node_path, _) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: \"dependendies_item\",\n                onClick: ($event: any) => (_ctx.go_to_node_path(node_path))\n              }, _toDisplayString(node_path), 9 /* TEXT, PROPS */, _hoisted_16))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ])\n        ]),\n        _createElementVNode(\"div\", _hoisted_17, [\n          _hoisted_18,\n          _createElementVNode(\"div\", _hoisted_19, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.scene_successor_paths, (node_path, _) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: \"dependendies_item hover:bg-black hover:text-white\",\n                onClick: ($event: any) => (_ctx.go_to_node_path(node_path))\n              }, _toDisplayString(node_path), 9 /* TEXT, PROPS */, _hoisted_20))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ])\n        ])\n      ])\n    ])\n  ], 32 /* HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=template&id=69803565&ts=true\"","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoAnim\" }\nconst _hoisted_2 = { class: \"node_info_anim_section tracks_count\" }\nconst _hoisted_3 = { class: \"node_info_anim_section_title\" }\nconst _hoisted_4 = { class: \"node_info_anim_section_content\" }\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"node_info_separator\" }, null, -1 /* HOISTED */)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"strong\", _hoisted_3, _toDisplayString(_ctx.tracks_count) + \" tracks\", 1 /* TEXT */),\n      _createElementVNode(\"div\", _hoisted_4, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.track_names, (track_name) => {\n          return (_openBlock(), _createElementBlock(\"div\", null, _toDisplayString(track_name), 1 /* TEXT */))\n        }), 256 /* UNKEYED_FRAGMENT */))\n      ])\n    ]),\n    _hoisted_5\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=template&id=06fa5f68&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=style&index=0&id=06fa5f68&lang=sass\"","import { render } from \"./Anim.vue?vue&type=template&id=06fa5f68&ts=true\"\nimport script from \"./Anim.vue?vue&type=script&lang=ts\"\nexport * from \"./Anim.vue?vue&type=script&lang=ts\"\n\nimport \"./Anim.vue?vue&type=style&index=0&id=06fa5f68&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoAudio\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Audio.vue?vue&type=template&id=4515bb54&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Audio.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Audio.vue?vue&type=script&lang=ts\"","import { render } from \"./Audio.vue?vue&type=template&id=4515bb54&ts=true\"\nimport script from \"./Audio.vue?vue&type=script&lang=ts\"\nexport * from \"./Audio.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoCop\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"node_info_cop_section inline resolution\"\n}\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"node_info_cop_section_title\" }, \"resolution:\", -1 /* HOISTED */)\nconst _hoisted_4 = { class: \"node_info_cop_section_content\" }\nconst _hoisted_5 = { class: \"node_info_cop_section relative\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"absolute top-0 left-0 bg-white text-black p-2\"\n}\nconst _hoisted_7 = [\"width\", \"height\"]\nconst _hoisted_8 = [\"width\", \"height\"]\nconst _hoisted_9 = { class: \"my-2\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_ctx.resolution)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          _hoisted_3,\n          _createElementVNode(\"div\", _hoisted_4, [\n            _createElementVNode(\"span\", null, _toDisplayString(_ctx.resolution), 1 /* TEXT */)\n          ])\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_5, [\n      (_ctx.rendering)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, \"loading...\"))\n        : _createCommentVNode(\"v-if\", true),\n      _createElementVNode(\"div\", {\n        class: \"canvas-container\",\n        ref: \"canvasContainer\",\n        width: _ctx.canvas_width,\n        height: _ctx.canvas_height,\n        style: _normalizeStyle(_ctx.canvas_style_object)\n      }, [\n        _createElementVNode(\"canvas\", {\n          ref: \"canvasElement\",\n          class: \"w-full max-w-full\",\n          width: _ctx.canvas_width,\n          height: _ctx.canvas_height\n        }, null, 8 /* PROPS */, _hoisted_8)\n      ], 12 /* STYLE, PROPS */, _hoisted_7),\n      _createElementVNode(\"div\", _hoisted_9, [\n        _createElementVNode(\"button\", {\n          onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.download && _ctx.download(...args))),\n          class: \"rounded-sm bg-yellow-600 px-5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-yellow-500\"\n        }, \" Download Texture \")\n      ])\n    ])\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=template&id=e4e085c2&ts=true\"","// import {WebGLRenderer} from 'three';\nimport {PolyScene} from '../../../../../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {NodeInfoCopSceneController} from './SceneController';\nimport {\n\tCamera,\n\tScene,\n\tWebGLRenderTarget,\n\tWebGLRenderer,\n\tLinearFilter,\n\tNearestFilter,\n\tRGBAFormat,\n\tFloatType,\n\t// Vector2,\n} from 'three';\n\n// import {Poly} from '../../../../../../../../../@polygonjs/polygonjs/src/engine/Poly';\n\n// export const RESOLUTION = 512;\n// const rendererSize = new Vector2();\n\n// function createRenderer() {\n// \t// const context = canvas.getContext('webgl', {preserveDrawingBuffer: true});\n// \tconst renderer = new WebGLRenderer({\n// \t\tantialias: true,\n// \t\talpha: true,\n// \t\tpreserveDrawingBuffer: true,\n// \t\t// context: context || undefined,\n// \t});\n// \treturn renderer;\n// }\nfunction createRenderTarget() {\n\treturn new WebGLRenderTarget(512, 512, {\n\t\tminFilter: LinearFilter,\n\t\tmagFilter: NearestFilter,\n\t\tformat: RGBAFormat,\n\t\ttype: FloatType,\n\t});\n}\n// export const RENDERER = createRenderer();\nconst RENDER_TARGET = createRenderTarget();\nexport class NodeInfoCopRendererController {\n\t// private _renderer: WebGLRenderer | undefined;\n\tprivate _renderTarget: WebGLRenderTarget | undefined;\n\tprivate _singlePixelBuffer = new Float32Array(4);\n\tprivate width: number = 0;\n\tprivate height: number = 0;\n\tconstructor(private sceneController: NodeInfoCopSceneController) {\n\t\t// preserveDrawingBuffer is set to true, so that the image can be downloaded\n\t\t// this._renderer.shadowMap.enabled = true;\n\t\t// this._renderer.shadowMap.type = PCFSoftShadowMap;\n\t\t// this._renderer.physicallyCorrectLights = true;\n\t\t// this._renderer.toneMapping = ACESFilmicToneMapping;\n\t\t// this._renderer.toneMappingExposure = 1;\n\t\t// this._renderer.outputEncoding = sRGBEncoding;\n\t\t// this._renderer.setPixelRatio(window.devicePixelRatio);\n\t}\n\t// setContainer(canvasContainer: HTMLElement) {\n\t// \t// const download_full_size = true;\n\t// \t// this.width = download_full_size ? this._canvasContainer.width : this._canvasContainer.offsetWidth;\n\t// \t// this.height = download_full_size ? this._canvasContainer.height : this._canvasContainer.offsetHeight;\n\n\t// \tcanvasContainer.appendChild(RENDERER.domElement);\n\t// }\n\t// setSize(w: number, h: number) {\n\t// \tthis.width = w;\n\t// \tthis.height = h;\n\t// \tRENDERER.setSize(w, h);\n\t// \tRENDERER.domElement.width = w;\n\t// \tRENDERER.domElement.height = w;\n\t// \tRENDER_TARGET.setSize(w, h);\n\t// }\n\t// async renderer() {\n\t// \tconst PolyRenderer = await Poly.renderersController.firstRenderer();\n\t// \tif (PolyRenderer) {\n\t// \t\treturn PolyRenderer;\n\t// \t} else {\n\t// \t\treturn (this._renderer = this._renderer || this._createRenderer());\n\t// \t}\n\t// }\n\t// renderTarget() {\n\t// \treturn (this._renderTarget =\n\t// \t\tthis._renderTarget ||\n\t// \t\tnew WebGLRenderTarget(this.width, this.height, {\n\t// \t\t\tminFilter: LinearFilter,\n\t// \t\t\tmagFilter: NearestFilter,\n\t// \t\t\tformat: RGBAFormat,\n\t// \t\t\ttype: FloatType,\n\t// \t\t}));\n\t// }\n\n\t// private _createRenderer() {\n\t// \tconsole.log('createRenderer');\n\n\t// \trenderer.setSize(this._canvas.width, this.height);\n\t// \treturn renderer;\n\t// }\n\t// domElement() {\n\t// \treturn RENDERER.domElement;\n\t// }\n\n\tasync render(scene: PolyScene, threejsScene: Scene, camera: Camera) {\n\t\tconst renderer = await scene.renderersRegister.waitForRenderer();\n\t\tif (!(renderer instanceof WebGLRenderer)) {\n\t\t\treturn;\n\t\t}\n\t\t// store renderer state\n\t\tlet prevRenderTarget = renderer.getRenderTarget();\n\t\t// renderer.getSize(rendererSize);\n\t\t// console.log(rendererSize.toArray());\n\n\t\t// on render target\n\t\tconst newSize = this.sceneController.size();\n\t\t// renderer.setSize(newSize.x, newSize.y);\n\t\tRENDER_TARGET.setSize(newSize.x, newSize.y);\n\t\trenderer.setRenderTarget(RENDER_TARGET);\n\t\trenderer.clear();\n\t\trenderer.render(threejsScene, camera);\n\n\t\t// read buffer\n\t\tconst bufferSize = newSize.x * newSize.y * 4;\n\t\tconst buffer = new Float32Array(bufferSize);\n\t\trenderer.readRenderTargetPixels(RENDER_TARGET, 0, 0, newSize.x, newSize.y, buffer);\n\n\t\t// write to canvas\n\t\tconst canvas = this.sceneController.canvas();\n\t\tif (canvas) {\n\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\tif (!ctx) {\n\t\t\t\tconsole.error('failed to create canvas');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst ctxData = ctx.getImageData(0, 0, newSize.x, newSize.y);\n\n\t\t\tconst stride = 4;\n\t\t\tfor (let i = 0; i < bufferSize; i++) {\n\t\t\t\tctxData.data[i * stride] = 255 * buffer[i * stride];\n\t\t\t\tctxData.data[i * stride + 1] = 255 * buffer[i * stride + 1];\n\t\t\t\tctxData.data[i * stride + 2] = 255 * buffer[i * stride + 2];\n\t\t\t\tctxData.data[i * stride + 3] = 255 * buffer[i * stride + 3];\n\t\t\t}\n\n\t\t\tctx.putImageData(ctxData, 0, 0);\n\t\t}\n\n\t\t// restore renderer state\n\t\trenderer.setRenderTarget(prevRenderTarget);\n\t\trenderer.clear();\n\t\t// console.log('setSize', rendererSize.x, rendererSize.y);\n\t\t// renderer.setSize(rendererSize.x, rendererSize.y);\n\t\twindow.dispatchEvent(new Event('resize'));\n\t}\n\tasync readPixel(scene: PolyScene, x: number, y: number) {\n\t\tconst renderer = await scene.renderersRegister.waitForRenderer();\n\t\tif (!(renderer instanceof WebGLRenderer)) {\n\t\t\treturn;\n\t\t}\n\t\trenderer.readRenderTargetPixels(RENDER_TARGET, x * this.width, y * this.height, 1, 1, this._singlePixelBuffer);\n\t\treturn this._singlePixelBuffer;\n\t}\n\tdispose() {\n\t\t// this._renderer?.dispose();\n\t\tthis._renderTarget?.dispose();\n\t}\n}\n","import {MeshBasicMaterial} from 'three';\nimport {Texture} from 'three';\nimport {NodeInfoCopSceneController} from './SceneController';\nimport {DoubleSide} from 'three';\n\nconst MATERIAL = new MeshBasicMaterial({\n\tside: DoubleSide,\n});\nexport class NodeInfoCopMaterialsController {\n\tconstructor(protected _sceneController: NodeInfoCopSceneController) {}\n\n\tmaterial() {\n\t\treturn MATERIAL;\n\t}\n\tsetTexture(texture: Texture) {\n\t\tMATERIAL.map = texture;\n\t}\n\tdispose() {\n\t\t// this._mat.dispose();\n\t}\n}\n","import {PlaneGeometry, Matrix4, Mesh} from 'three';\nimport {NodeInfoCopSceneController} from './SceneController';\n\nfunction createMesh() {\n\tconst geometry = new PlaneGeometry(1, 1, 8);\n\n\tconst plane = new Mesh(geometry);\n\tconst matrix = new Matrix4();\n\tmatrix.makeTranslation(0.5, 0.5, 0);\n\tgeometry.applyMatrix4(matrix);\n\n\treturn plane;\n}\nconst MESH = createMesh();\nexport class NodeInfoCopMeshController {\n\tprivate _mesh: Mesh | undefined;\n\tconstructor(protected sceneController: NodeInfoCopSceneController) {}\n\tbuild() {\n\t\tthis.sceneController.threejsScene.add(this.mesh());\n\t}\n\tmesh() {\n\t\treturn (this._mesh = this._mesh || this._buildMesh());\n\t}\n\tprivate _buildMesh() {\n\t\tMESH.material = this.sceneController.materialsController.material();\n\t\treturn MESH;\n\t}\n\n\tdispose() {\n\t\t// this.mesh.geometry.dispose();\n\t}\n}\n","import {OrthographicCamera} from 'three';\nimport {NodeInfoCopSceneController} from './SceneController';\n\nfunction createCamera() {\n\tconst width = 1;\n\tconst height = width;\n\tconst camera = new OrthographicCamera(width / -2, width / 2, height / 2, height / -2, 1, 1000);\n\tcamera.position.z = 5;\n\tcamera.position.x = 0.5;\n\tcamera.position.y = 0.5;\n\treturn camera;\n}\nconst CAMERA = createCamera();\nexport class NodeInfoCopCameraController {\n\tconstructor(protected sceneController: NodeInfoCopSceneController) {}\n\tbuild() {\n\t\tthis.sceneController.threejsScene.add(CAMERA);\n\t}\n\tcamera() {\n\t\treturn CAMERA;\n\t}\n}\n","import {Texture, Scene, Vector2} from 'three';\nimport {NodeInfoCopRendererController} from './RendererController';\nimport {NodeInfoCopMaterialsController} from './MaterialController';\nimport {NodeInfoCopMeshController} from './MeshController';\nimport {NodeInfoCopCameraController} from './CameraController';\nimport {PolyScene} from '../../../../../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\n\nexport enum ColorSpace {\n\tRGB = 'RGB',\n\tHSL = 'HSL',\n\tHSLUV = 'HSLUV',\n}\nexport const COLOR_SPACES: Array<ColorSpace> = [ColorSpace.RGB, ColorSpace.HSL, ColorSpace.HSLUV];\n\nexport class NodeInfoCopSceneController {\n\tprivate _threejsScene: Scene = new Scene();\n\tpublic materialsController = new NodeInfoCopMaterialsController(this);\n\tpublic meshController = new NodeInfoCopMeshController(this);\n\tpublic cameraController = new NodeInfoCopCameraController(this);\n\tpublic rendererController = new NodeInfoCopRendererController(this);\n\tpublic readonly rendererSize = new Vector2();\n\tprivate _canvas: HTMLCanvasElement | undefined;\n\tconstructor(public readonly scene: PolyScene) {\n\t\tthis.build();\n\t}\n\tget threejsScene() {\n\t\treturn this._threejsScene;\n\t}\n\t// setContainer(canvasContainer: HTMLElement) {\n\t// \t// this.rendererController.setContainer(canvasContainer);\n\t// }\n\tsetCanvas(canvas: HTMLCanvasElement) {\n\t\tthis._canvas = canvas;\n\t}\n\tcanvas() {\n\t\treturn this._canvas;\n\t}\n\n\trender() {\n\t\tthis.rendererController.render(this.scene, this._threejsScene, this.cameraController.camera());\n\t}\n\t// readPixel(x: number, y: number) {\n\t// \treturn this.rendererController.readPixel(x, y);\n\t// }\n\tsetTexture(texture: Texture) {\n\t\tthis.materialsController.setTexture(texture);\n\t}\n\tsetSize(w: number, h: number) {\n\t\tthis.rendererSize.set(w, h);\n\t\t// this.rendererController.setSize(w, h);\n\t}\n\tsize() {\n\t\treturn this.rendererSize;\n\t}\n\t// domElement() {\n\t// \treturn this.rendererController.domElement();\n\t// }\n\n\tdispose() {\n\t\tthis.rendererController.dispose();\n\t\tthis.meshController.dispose();\n\t\tthis.materialsController.dispose();\n\t}\n\n\tbuild() {\n\t\tthis.meshController.build();\n\t\tthis.cameraController.build();\n\t}\n}\n","export class CanvasToDownload {\n\tconstructor(private canvas: HTMLCanvasElement, private image_short_name: string) {}\n\n\tdownload() {\n\t\tconst filename = `${this.image_short_name}.png`;\n\t\tconst datauri = this.canvas.toDataURL();\n\t\tlet img = document.createElement('img');\n\t\timg.onload = async () => {\n\t\t\tconst element = document.createElement('a');\n\t\t\telement.setAttribute('href', datauri);\n\t\t\telement.setAttribute('download', filename);\n\n\t\t\telement.style.display = 'none';\n\t\t\tdocument.body.appendChild(element);\n\n\t\t\telement.click();\n\t\t};\n\t\timg.src = datauri;\n\t}\n}\n","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=style&index=0&id=e4e085c2&lang=sass\"","import { render } from \"./Cop.vue?vue&type=template&id=e4e085c2&ts=true\"\nimport script from \"./Cop.vue?vue&type=script&lang=ts\"\nexport * from \"./Cop.vue?vue&type=script&lang=ts\"\n\nimport \"./Cop.vue?vue&type=style&index=0&id=e4e085c2&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { vModelCheckbox as _vModelCheckbox, createElementVNode as _createElementVNode, withDirectives as _withDirectives, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoGl\" }\nconst _hoisted_2 = { key: 0 }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"label\", {\n  for: \"shaderExpanded\",\n  class: \"ml-1\"\n}, \"Expand Shader\", -1 /* HOISTED */)\nconst _hoisted_4 = { class: \"buttons mt-2\" }\nconst _hoisted_5 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_ctx.shader_names.length > 0)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          _withDirectives(_createElementVNode(\"input\", {\n            type: \"checkbox\",\n            id: \"shaderExpanded\",\n            \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.shaderExpanded) = $event))\n          }, null, 512 /* NEED_PATCH */), [\n            [_vModelCheckbox, _ctx.shaderExpanded]\n          ]),\n          _hoisted_3\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_4, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.shader_names, (shader_name, _) => {\n        return (_openBlock(), _createElementBlock(\"div\", {\n          class: \"block mt-1 justify-center rounded-md text-center border border-transparent shadow-sm px-4 py-2 bg-green-700 text-base font-medium text-white hover:bg-green-800 sm:w-auto sm:text-sm cursor-pointer\",\n          onClick: ($event: any) => (_ctx.copy_shader(shader_name))\n        }, \" Copy Shader \" + _toDisplayString(shader_name), 9 /* TEXT, PROPS */, _hoisted_5))\n      }), 256 /* UNKEYED_FRAGMENT */))\n    ])\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=template&id=7ae9c476&ts=true\"","export class ShaderHelper {\n\tstatic escapeText(text: string) {\n\t\ttext = text.replace(/(\\t)/gm, ' ');\n\t\ttext = text.replace(/(\\r\\n|\\n|\\r)/gm, '\\\\n');\n\t\ttext = text.replace(/\"/gm, '');\n\t\treturn text;\n\t}\n}\n","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=style&index=0&id=7ae9c476&lang=sass\"","import { render } from \"./Gl.vue?vue&type=template&id=7ae9c476&ts=true\"\nimport script from \"./Gl.vue?vue&type=script&lang=ts\"\nexport * from \"./Gl.vue?vue&type=script&lang=ts\"\n\nimport \"./Gl.vue?vue&type=style&index=0&id=7ae9c476&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { vModelCheckbox as _vModelCheckbox, createElementVNode as _createElementVNode, withDirectives as _withDirectives, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoMat\" }\nconst _hoisted_2 = { key: 0 }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"label\", {\n  for: \"shaderExpanded\",\n  class: \"ml-1\"\n}, \"Expand Shader\", -1 /* HOISTED */)\nconst _hoisted_4 = { class: \"buttons mt-2\" }\nconst _hoisted_5 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_ctx.shader_names.length > 0)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          _withDirectives(_createElementVNode(\"input\", {\n            type: \"checkbox\",\n            id: \"shaderExpanded\",\n            \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.shaderExpanded) = $event))\n          }, null, 512 /* NEED_PATCH */), [\n            [_vModelCheckbox, _ctx.shaderExpanded]\n          ]),\n          _hoisted_3\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_4, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.shader_names, (shader_name, _) => {\n        return (_openBlock(), _createElementBlock(\"div\", {\n          class: \"block mt-1 justify-center rounded-md text-center border border-transparent shadow-sm px-4 py-2 bg-green-700 text-base font-medium text-white hover:bg-green-800 sm:w-auto sm:text-sm cursor-pointer\",\n          onClick: ($event: any) => (_ctx.copy_shader(shader_name))\n        }, \" Copy \" + _toDisplayString(shader_name) + \" Shader \", 9 /* TEXT, PROPS */, _hoisted_5))\n      }), 256 /* UNKEYED_FRAGMENT */))\n    ])\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=template&id=8baf624c&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=style&index=0&id=8baf624c&lang=sass\"","import { render } from \"./Mat.vue?vue&type=template&id=8baf624c&ts=true\"\nimport script from \"./Mat.vue?vue&type=script&lang=ts\"\nexport * from \"./Mat.vue?vue&type=script&lang=ts\"\n\nimport \"./Mat.vue?vue&type=style&index=0&id=8baf624c&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoObj\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _renderSlot(_ctx.$slots, \"default\")\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Obj.vue?vue&type=template&id=f28818c6&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Obj.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Obj.vue?vue&type=script&lang=ts\"","import { render } from \"./Obj.vue?vue&type=template&id=f28818c6&ts=true\"\nimport script from \"./Obj.vue?vue&type=script&lang=ts\"\nexport * from \"./Obj.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeInfoObj = _resolveComponent(\"NodeInfoObj\")!\n\n  return (_openBlock(), _createBlock(_component_NodeInfoObj, { graph_node_id: _ctx.graph_node_id }, null, 8 /* PROPS */, [\"graph_node_id\"]))\n}","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ObjThreejsCamera.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ObjThreejsCamera.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ObjThreejsCamera.vue?vue&type=style&index=0&id=4576b05e&lang=sass\"","import { render } from \"./ObjThreejsCamera.vue?vue&type=template&id=4576b05e&ts=true\"\nimport script from \"./ObjThreejsCamera.vue?vue&type=script&lang=ts\"\nexport * from \"./ObjThreejsCamera.vue?vue&type=script&lang=ts\"\n\nimport \"./ObjThreejsCamera.vue?vue&type=style&index=0&id=4576b05e&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInfoSop\" }\nconst _hoisted_2 = { class: \"node_info_sop_section inline objects_count\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"node_info_sop_section_title\" }, \"objects count:\", -1 /* HOISTED */)\nconst _hoisted_4 = { class: \"node_info_sop_section_content\" }\nconst _hoisted_5 = { class: \"node_info_sop_section my-4 border-t-2 border-b-2 border-gray-600 objects_data\" }\nconst _hoisted_6 = { class: \"node_info_sop_section_content\" }\nconst _hoisted_7 = { class: \"objects_data_container\" }\nconst _hoisted_8 = { class: \"objects_data w-full\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"last_line\"\n}\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1 /* HOISTED */)\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1 /* HOISTED */)\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1 /* HOISTED */)\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"node_info_separator\" }, null, -1 /* HOISTED */)\nconst _hoisted_14 = { class: \"node_info_sop_section attributes block\" }\nconst _hoisted_15 = { key: 0 }\nconst _hoisted_16 = { class: \"node_info_sop_section_content attribute_info\" }\nconst _hoisted_17 = { key: 1 }\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"strong\", { class: \"node_info_sop_section_title\" }, \"groups:\", -1 /* HOISTED */)\nconst _hoisted_19 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"node_info_sop_section_content attribute_info none\" }, \"none\", -1 /* HOISTED */)\nconst _hoisted_20 = [\n  _hoisted_18,\n  _hoisted_19\n]\nconst _hoisted_21 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"node_info_separator\" }, null, -1 /* HOISTED */)\nconst _hoisted_22 = { class: \"node_info_sop_section attributes block\" }\nconst _hoisted_23 = /*#__PURE__*/_createElementVNode(\"strong\", { class: \"node_info_sop_section_title\" }, \"point attributes:\", -1 /* HOISTED */)\nconst _hoisted_24 = { key: 0 }\nconst _hoisted_25 = {\n  key: 1,\n  class: \"node_info_sop_section_content attribute_info none\"\n}\nconst _hoisted_26 = { class: \"node_info_sop_section attributes block\" }\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"strong\", { class: \"node_info_sop_section_title\" }, \"vertex attributes:\", -1 /* HOISTED */)\nconst _hoisted_28 = { key: 0 }\nconst _hoisted_29 = {\n  key: 1,\n  class: \"node_info_sop_section_content attribute_info none\"\n}\nconst _hoisted_30 = { class: \"node_info_sop_section attributes block\" }\nconst _hoisted_31 = /*#__PURE__*/_createElementVNode(\"strong\", { class: \"node_info_sop_section_title\" }, \"primitive attributes:\", -1 /* HOISTED */)\nconst _hoisted_32 = { key: 0 }\nconst _hoisted_33 = {\n  key: 1,\n  class: \"node_info_sop_section_content attribute_info none\"\n}\nconst _hoisted_34 = { class: \"node_info_sop_section attributes block\" }\nconst _hoisted_35 = /*#__PURE__*/_createElementVNode(\"strong\", { class: \"node_info_sop_section_title\" }, \"object attributes:\", -1 /* HOISTED */)\nconst _hoisted_36 = { key: 0 }\nconst _hoisted_37 = {\n  key: 1,\n  class: \"node_info_sop_section_content attribute_info none\"\n}\nconst _hoisted_38 = { class: \"node_info_sop_section attributes block\" }\nconst _hoisted_39 = /*#__PURE__*/_createElementVNode(\"strong\", { class: \"node_info_sop_section_title\" }, \"container attributes:\", -1 /* HOISTED */)\nconst _hoisted_40 = { key: 0 }\nconst _hoisted_41 = {\n  key: 1,\n  class: \"node_info_sop_section_content attribute_info none\"\n}\nconst _hoisted_42 = { class: \"bbox_infos\" }\nconst _hoisted_43 = { class: \"number\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _hoisted_3,\n      _createElementVNode(\"div\", _hoisted_4, [\n        _createElementVNode(\"span\", null, _toDisplayString(_ctx.objects_count), 1 /* TEXT */),\n        _createElementVNode(\"span\", {\n          class: _normalizeClass([\"objects_count_visible\", _ctx.objects_count_visible_class_object])\n        }, \"(visible: \" + _toDisplayString(_ctx.objects_visible_count) + \")\", 3 /* TEXT, CLASS */)\n      ])\n    ]),\n    _createElementVNode(\"div\", _hoisted_5, [\n      _createElementVNode(\"div\", _hoisted_6, [\n        _createElementVNode(\"div\", _hoisted_7, [\n          _createElementVNode(\"table\", _hoisted_8, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.objects_data, (object_data, i) => {\n              return (_openBlock(), _createElementBlock(\"tr\", {\n                class: _normalizeClass({even: i % 2 == 0, odd: i % 2 == 1})\n              }, [\n                _createElementVNode(\"td\", null, [\n                  _createElementVNode(\"strong\", null, _toDisplayString(object_data.type) + \":\", 1 /* TEXT */)\n                ]),\n                _createElementVNode(\"td\", null, _toDisplayString(object_data.name), 1 /* TEXT */),\n                _createElementVNode(\"td\", {\n                  class: _normalizeClass({faded: object_data.childrenCount == 0})\n                }, _toDisplayString(object_data.childrenCount) + \" children \", 3 /* TEXT, CLASS */),\n                _createElementVNode(\"td\", {\n                  class: _normalizeClass({faded: object_data.pointsCount == 0})\n                }, _toDisplayString(object_data.pointsCount) + \" points\", 3 /* TEXT, CLASS */),\n                _createElementVNode(\"td\", {\n                  class: _normalizeClass({faded: object_data.verticesCount == 0})\n                }, _toDisplayString(object_data.verticesCount) + \" vertices \", 3 /* TEXT, CLASS */),\n                _createElementVNode(\"td\", {\n                  class: _normalizeClass({faded: object_data.primitivesCount == 0})\n                }, _toDisplayString(object_data.primitivesCount) + \" \" + _toDisplayString(object_data.primitivesCount > 1\n\t\t\t\t\t\t\t\t\t\t? `${object_data.primitiveName}s`\n\t\t\t\t\t\t\t\t\t\t: object_data.primitiveName), 3 /* TEXT, CLASS */)\n              ], 2 /* CLASS */))\n            }), 256 /* UNKEYED_FRAGMENT */)),\n            (_ctx.totalPointsCount > 0 || _ctx.totalVerticesCount > 0 || _ctx.totalPrimitivesCount > 0)\n              ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_9, [\n                  _hoisted_10,\n                  _hoisted_11,\n                  _hoisted_12,\n                  _createElementVNode(\"td\", null, [\n                    _createElementVNode(\"strong\", null, _toDisplayString(_ctx.totalPointsCount) + \" points\", 1 /* TEXT */)\n                  ]),\n                  _createElementVNode(\"td\", null, [\n                    _createElementVNode(\"strong\", null, _toDisplayString(_ctx.totalVerticesCount) + \" vertices\", 1 /* TEXT */)\n                  ]),\n                  _createElementVNode(\"td\", null, [\n                    _createElementVNode(\"strong\", null, _toDisplayString(_ctx.totalPrimitivesCount) + \" primitives\", 1 /* TEXT */)\n                  ])\n                ]))\n              : _createCommentVNode(\"v-if\", true)\n          ])\n        ])\n      ])\n    ]),\n    _hoisted_13,\n    _createElementVNode(\"div\", _hoisted_14, [\n      (_ctx.groupTypes.length > 0)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.groupTypes, (groupType) => {\n              return (_openBlock(), _createElementBlock(\"div\", _hoisted_16, [\n                _createElementVNode(\"strong\", null, _toDisplayString(groupType) + \" groups:\", 1 /* TEXT */),\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.groupData[groupType], (typedGroupData) => {\n                  return (_openBlock(), _createElementBlock(\"div\", null, [\n                    _createElementVNode(\"div\", null, _toDisplayString(typedGroupData.name) + \": \" + _toDisplayString(typedGroupData.entitiesCount), 1 /* TEXT */)\n                  ]))\n                }), 256 /* UNKEYED_FRAGMENT */))\n              ]))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, _hoisted_20))\n    ]),\n    _hoisted_21,\n    _createCommentVNode(\" point attributes \"),\n    _createElementVNode(\"div\", _hoisted_22, [\n      _hoisted_23,\n      (_ctx.pointAttributeNames.length > 0)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.pointAttributeNames, (name) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: _normalizeClass([\"node_info_sop_section_content attribute_info\", _ctx.pointClassObjectsByName[name]])\n              }, _toDisplayString(name) + \" (\" + _toDisplayString(_ctx.pointHumanLabelsByName[name]) + \") \", 3 /* TEXT, CLASS */))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_25, \"none\"))\n    ]),\n    _createCommentVNode(\" vertex attributes \"),\n    _createElementVNode(\"div\", _hoisted_26, [\n      _hoisted_27,\n      (_ctx.vertexAttributeNames.length > 0)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.vertexAttributeNames, (name) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: _normalizeClass([\"node_info_sop_section_content attribute_info\", _ctx.vertexClassObjectsByName[name]])\n              }, _toDisplayString(name) + \" (\" + _toDisplayString(_ctx.vertexHumanLabelsByName[name]) + \") \", 3 /* TEXT, CLASS */))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_29, \"none\"))\n    ]),\n    _createCommentVNode(\" primitive attributes \"),\n    _createElementVNode(\"div\", _hoisted_30, [\n      _hoisted_31,\n      (_ctx.primitiveAttributeNames.length > 0)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.primitiveAttributeNames, (name) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: _normalizeClass([\"node_info_sop_section_content attribute_info\", _ctx.primitiveClassObjectsByName[name]])\n              }, _toDisplayString(name) + \" (\" + _toDisplayString(_ctx.primitiveHumanLabelsByName[name]) + \") \", 3 /* TEXT, CLASS */))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_33, \"none\"))\n    ]),\n    _createCommentVNode(\" object attributes \"),\n    _createElementVNode(\"div\", _hoisted_34, [\n      _hoisted_35,\n      (_ctx.objectAttributeNames.length > 0)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.objectAttributeNames, (name) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: _normalizeClass([\"node_info_sop_section_content attribute_info\", _ctx.objectClassObjectsByName[name]])\n              }, _toDisplayString(name) + \" (\" + _toDisplayString(_ctx.objectHumanLabelsByName[name]) + \") \", 3 /* TEXT, CLASS */))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_37, \"none\"))\n    ]),\n    _createCommentVNode(\" core group attributes \"),\n    _createElementVNode(\"div\", _hoisted_38, [\n      _hoisted_39,\n      (_ctx.coreGroupAttributeNames.length > 0)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_40, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.coreGroupAttributeNames, (name) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: _normalizeClass([\"node_info_sop_section_content attribute_info\", _ctx.coreGroupClassObjectByName[name]])\n              }, _toDisplayString(name) + \" (\" + _toDisplayString(_ctx.coreGroupHumanLabelsByName[name]) + \") \", 3 /* TEXT, CLASS */))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_41, \"none\"))\n    ]),\n    _createCommentVNode(\" bbox \"),\n    _createElementVNode(\"div\", _hoisted_42, [\n      _createElementVNode(\"table\", null, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.table_prop_names, (prop_name) => {\n          return (_openBlock(), _createElementBlock(\"tr\", null, [\n            _createElementVNode(\"td\", null, _toDisplayString(prop_name), 1 /* TEXT */),\n            (_openBlock(), _createElementBlock(_Fragment, null, _renderList([0, 1, 2], (j) => {\n              return _createElementVNode(\"td\", _hoisted_43, _toDisplayString(_ctx.table_props[prop_name][j]), 1 /* TEXT */)\n            }), 64 /* STABLE_FRAGMENT */))\n          ]))\n        }), 256 /* UNKEYED_FRAGMENT */))\n      ])\n    ]),\n    _renderSlot(_ctx.$slots, \"default\")\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=template&id=6ef1a367&ts=true\"","import type {Box3} from 'three';\nimport {GeometryContainer} from '..//Geometry';\nimport {PolyDictionary, AttribValue} from '../../..//types/GlobalTypes';\nimport {\n\tcorePointClassFactory,\n\tcoreVertexClassFactory,\n\tcorePrimitiveClassFactory,\n\tcoreObjectClassFactory,\n} from '../../..//core/geometry/CoreObjectFactory';\nimport {\n\tcoreObjectsAttribSizesByName,\n\tcoreObjectAttributeTypesByName,\n} from '../../..//core/geometry/entities/object/BaseCoreObjectUtils';\nimport {addToSetAtEntry} from '../../../core/MapUtils';\nimport {setToArray} from '../../..//core/SetUtils';\nimport {ObjectData, AttribSize, AttribType} from '../../..//core/geometry/Constant';\n\nfunction _firstObject(sopContainer: GeometryContainer) {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (!coreGroup) {\n\t\treturn;\n\t}\n\treturn coreGroup.allObjects()[0];\n}\n\n//\n//\n// POINT ATTRIBUTES\n//\n//\nexport function pointAttributeSizesByName(sopContainer: GeometryContainer) {\n\tconst sizesByName: PolyDictionary<number> = {};\n\tconst object = _firstObject(sopContainer);\n\tif (object) {\n\t\tconst entityClass = corePointClassFactory(object);\n\t\tconst attributeNames = entityClass.attributeNames(object);\n\t\tfor (const attribName of attributeNames) {\n\t\t\tsizesByName[attribName] = entityClass.attribSize(object, attribName);\n\t\t}\n\t}\n\treturn sizesByName;\n}\nexport function pointAttributeTypesByName(sopContainer: GeometryContainer): PolyDictionary<AttribType> {\n\tconst typesByName: PolyDictionary<AttribType> = {};\n\tconst object = _firstObject(sopContainer);\n\tif (!object) {\n\t\treturn typesByName;\n\t}\n\tconst entityClass = corePointClassFactory(object);\n\tconst attributes = entityClass.attributes(object);\n\tif (!attributes) {\n\t\treturn typesByName;\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tfor (const attribName of attribNames) {\n\t\tconst attribType = entityClass.attribType(object, attribName);\n\t\ttypesByName[attribName] = attribType;\n\t}\n\treturn typesByName;\n}\n\n//\n//\n// VERTEX ATTRIBUTES\n//\n//\nexport function vertexAttributeSizesByName(sopContainer: GeometryContainer) {\n\tconst sizesByName: PolyDictionary<number> = {};\n\tconst object = _firstObject(sopContainer);\n\tif (object) {\n\t\tconst entityClass = coreVertexClassFactory(object);\n\t\tconst attributeNames = entityClass.attributeNames(object);\n\t\tfor (const attribName of attributeNames) {\n\t\t\tsizesByName[attribName] = entityClass.attribSize(object, attribName);\n\t\t}\n\t}\n\treturn sizesByName;\n}\nexport function vertexAttributeTypesByName(sopContainer: GeometryContainer): PolyDictionary<AttribType> {\n\tconst typesByName: PolyDictionary<AttribType> = {};\n\tconst object = _firstObject(sopContainer);\n\tif (!object) {\n\t\treturn typesByName;\n\t}\n\tconst entityClass = coreVertexClassFactory(object);\n\tconst attributes = entityClass.attributes(object);\n\tif (!attributes) {\n\t\treturn typesByName;\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tfor (const attribName of attribNames) {\n\t\tconst attribType = entityClass.attribType(object, attribName);\n\t\ttypesByName[attribName] = attribType;\n\t}\n\treturn typesByName;\n}\n\n//\n//\n// PRIMITIVE ATTRIBUTES\n//\n//\nexport function primitiveAttributeSizesByName(sopContainer: GeometryContainer) {\n\tconst sizesByName: PolyDictionary<number> = {};\n\tconst object = _firstObject(sopContainer);\n\tif (object) {\n\t\tconst entityClass = corePrimitiveClassFactory(object);\n\t\tconst attributeNames = entityClass.attributeNames(object);\n\t\tfor (const attribName of attributeNames) {\n\t\t\tsizesByName[attribName] = entityClass.attribSize(object, attribName);\n\t\t}\n\t}\n\treturn sizesByName;\n}\nexport function primitiveAttributeTypesByName(sopContainer: GeometryContainer): PolyDictionary<AttribType> {\n\tconst typesByName: PolyDictionary<AttribType> = {};\n\tconst object = _firstObject(sopContainer);\n\tif (!object) {\n\t\treturn typesByName;\n\t}\n\tconst entityClass = corePrimitiveClassFactory(object);\n\tconst attributes = entityClass.attributes(object);\n\tif (!attributes) {\n\t\treturn typesByName;\n\t}\n\tconst attribNames = Object.keys(attributes);\n\tfor (const attribName of attribNames) {\n\t\tconst attribType = entityClass.attribType(object, attribName);\n\t\ttypesByName[attribName] = attribType;\n\t}\n\treturn typesByName;\n}\n\n//\n//\n// OBJECT ATTRIBUTES\n//\n//\nexport function objectAttributeSizesByName(sopContainer: GeometryContainer): PolyDictionary<AttribSize[]> | undefined {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (!coreGroup) {\n\t\treturn;\n\t}\n\treturn coreObjectsAttribSizesByName(coreGroup.allCoreObjects());\n}\nexport function objectAttributeTypesByName(sopContainer: GeometryContainer): PolyDictionary<AttribType[]> | undefined {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (!coreGroup) {\n\t\treturn;\n\t}\n\treturn coreObjectAttributeTypesByName(coreGroup.allCoreObjects());\n}\nexport function objectAttributeTypeAndSizesByName(\n\tsopContainer: GeometryContainer\n): PolyDictionary<Record<AttribType, AttribSize[]>> | undefined {\n\tconst _sizesByTypeByName: Map<string, Map<AttribType, Set<AttribSize>>> = new Map();\n\tconst coreGroup = sopContainer.coreContent();\n\tif (!coreGroup) {\n\t\treturn;\n\t}\n\tconst objects = coreGroup.allObjects();\n\tfor (const object of objects) {\n\t\tconst coreObjectClass = coreObjectClassFactory(object);\n\t\tconst objectAttriNames = coreObjectClass.attribNames(object);\n\t\tfor (const attribName of objectAttriNames) {\n\t\t\tconst attribType = coreObjectClass.attribType(object, attribName);\n\t\t\tconst attribSize = coreObjectClass.attribSize(object, attribName);\n\t\t\tlet mapForName = _sizesByTypeByName.get(attribName);\n\t\t\tif (!mapForName) {\n\t\t\t\tmapForName = new Map();\n\t\t\t}\n\t\t\t_sizesByTypeByName.set(attribName, mapForName);\n\t\t\taddToSetAtEntry(mapForName, attribType, attribSize);\n\t\t}\n\t}\n\n\tconst sizesByTypeByName: PolyDictionary<Record<AttribType, AttribSize[]>> = {};\n\t_sizesByTypeByName.forEach((mapForName, attribName) => {\n\t\tsizesByTypeByName[attribName] = {[AttribType.NUMERIC]: [], [AttribType.STRING]: []};\n\t\tmapForName.forEach((attribSizes, attribType) => {\n\t\t\tsizesByTypeByName[attribName][attribType] = setToArray(attribSizes, []);\n\t\t});\n\t});\n\treturn sizesByTypeByName;\n\t// const core_object = this.firstCoreObject();\n\t// if (core_object) {\n\t// \tfor (let name of core_object.attribNames()) {\n\t// \t\ttypes_by_name[name] = core_object.attribType(name);\n\t// \t}\n\t// }\n\t// return types_by_name;\n}\n\n//\n//\n// CORE GROUP ATTRIBUTES\n//\n//\nexport function coreGroupAttributeSizesByName(sopContainer: GeometryContainer) {\n\tconst sizes_by_name: PolyDictionary<number> = {};\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\tconst attribNames = coreGroup.attribNames();\n\t\tfor (const attribName of attribNames) {\n\t\t\tconst size = coreGroup.attribSize(attribName);\n\t\t\tif (size != null) {\n\t\t\t\tsizes_by_name[attribName] = size;\n\t\t\t}\n\t\t}\n\t}\n\treturn sizes_by_name;\n}\nexport function coreGroupAttributeTypesByName(sopContainer: GeometryContainer) {\n\tconst types_by_name: PolyDictionary<AttribType> = {};\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\tconst attribNames = coreGroup.attribNames();\n\t\tfor (const attribName of attribNames) {\n\t\t\ttypes_by_name[attribName] = coreGroup.attribType(attribName);\n\t\t}\n\t}\n\treturn types_by_name;\n}\n\nexport function coreGroupAttributeValuesByName(sopContainer: GeometryContainer) {\n\tconst valuesByName: PolyDictionary<AttribValue> = {};\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\tconst attribNames = coreGroup.attribNames();\n\t\tfor (const attribName of attribNames) {\n\t\t\tvaluesByName[attribName] = coreGroup.attribValue(attribName);\n\t\t}\n\t}\n\treturn valuesByName;\n}\n\nexport function objectsData(sopContainer: GeometryContainer): Array<ObjectData> {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\treturn coreGroup.objectsData();\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexport function totalPointsCount(sopContainer: GeometryContainer): number {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\treturn coreGroup.totalPointsCount();\n\t} else {\n\t\treturn 0;\n\t}\n}\n\n//\n//\n// MISC\n//\n//\nexport function boundingBox(sopContainer: GeometryContainer, target: Box3) {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\treturn coreGroup.boundingBox(target);\n\t} else {\n\t\ttarget.makeEmpty();\n\t}\n}\n\nexport function objectsCountByType(sopContainer: GeometryContainer) {\n\tconst count_by_type: PolyDictionary<number> = {};\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\tfor (const core_object of coreGroup.allCoreObjects()) {\n\t\t\tconst human_type = core_object.humanType();\n\t\t\tif (count_by_type[human_type] == null) {\n\t\t\t\tcount_by_type[human_type] = 0;\n\t\t\t}\n\t\t\tcount_by_type[human_type] += 1;\n\t\t}\n\t}\n\treturn count_by_type;\n}\nexport function objectsNamesByType(sopContainer: GeometryContainer) {\n\tconst names_by_type: PolyDictionary<string[]> = {};\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\tconst coreObjects = coreGroup.allCoreObjects();\n\t\tfor (const core_object of coreObjects) {\n\t\t\tconst human_type = core_object.humanType();\n\t\t\tnames_by_type[human_type] = names_by_type[human_type] || [];\n\t\t\tnames_by_type[human_type].push(core_object.name());\n\t\t}\n\t}\n\treturn names_by_type;\n}\nexport function objectsVisibleCount(sopContainer: GeometryContainer): number {\n\tlet count = 0;\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\tconst objects = coreGroup.allObjects();\n\t\tfor (const object of objects) {\n\t\t\tif (object.visible) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t}\n\treturn count;\n}\nexport function pointsCount(sopContainer: GeometryContainer): number {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\treturn coreGroup.pointsCount();\n\t} else {\n\t\treturn 0;\n\t}\n}\nexport function objectsCount(sopContainer: GeometryContainer): number {\n\tconst coreGroup = sopContainer.coreContent();\n\tif (coreGroup) {\n\t\treturn coreGroup.allObjects().length;\n\t} else {\n\t\treturn 0;\n\t}\n}\n","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=style&index=0&id=6ef1a367&lang=sass\"","import { render } from \"./Sop.vue?vue&type=template&id=6ef1a367&ts=true\"\nimport script from \"./Sop.vue?vue&type=script&lang=ts\"\nexport * from \"./Sop.vue?vue&type=script&lang=ts\"\n\nimport \"./Sop.vue?vue&type=style&index=0&id=6ef1a367&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"buttons\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeInfoSop = _resolveComponent(\"NodeInfoSop\")!\n\n  return (_openBlock(), _createBlock(_component_NodeInfoSop, { graph_node_id: _ctx.graph_node_id }, {\n    default: _withCtx(() => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createElementVNode(\"div\", {\n          class: \"button expanded\",\n          onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.copy_cache && _ctx.copy_cache(...args)))\n        }, \"Copy Cache\")\n      ])\n    ]),\n    _: 1 /* STABLE */\n  }, 8 /* PROPS */, [\"graph_node_id\"]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=template&id=2e23de42&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=style&index=0&id=2e23de42&lang=sass\"","import { render } from \"./SopCache.vue?vue&type=template&id=2e23de42&ts=true\"\nimport script from \"./SopCache.vue?vue&type=script&lang=ts\"\nexport * from \"./SopCache.vue?vue&type=script&lang=ts\"\n\nimport \"./SopCache.vue?vue&type=style&index=0&id=2e23de42&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"buttons mt-2\" }\nconst _hoisted_2 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeInfoSop = _resolveComponent(\"NodeInfoSop\")!\n\n  return (_openBlock(), _createBlock(_component_NodeInfoSop, { graph_node_id: _ctx.graph_node_id }, {\n    default: _withCtx(() => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.shader_names, (shader_name, _) => {\n          return (_openBlock(), _createElementBlock(\"div\", {\n            class: \"block mt-1 justify-center rounded-md text-center border border-transparent shadow-sm px-4 py-2 bg-green-700 text-base font-medium text-white hover:bg-green-800 sm:w-auto sm:text-sm cursor-pointer\",\n            onClick: ($event: any) => (_ctx.copy_shader(shader_name))\n          }, \" Copy Shader \" + _toDisplayString(shader_name), 9 /* TEXT, PROPS */, _hoisted_2))\n        }), 256 /* UNKEYED_FRAGMENT */))\n      ])\n    ]),\n    _: 1 /* STABLE */\n  }, 8 /* PROPS */, [\"graph_node_id\"]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=template&id=d7b6c3ca&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=style&index=0&id=d7b6c3ca&lang=sass\"","import { render } from \"./SopParticlesSystemGPU.vue?vue&type=template&id=d7b6c3ca&ts=true\"\nimport script from \"./SopParticlesSystemGPU.vue?vue&type=script&lang=ts\"\nexport * from \"./SopParticlesSystemGPU.vue?vue&type=script&lang=ts\"\n\nimport \"./SopParticlesSystemGPU.vue?vue&type=style&index=0&id=d7b6c3ca&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeInfoSop = _resolveComponent(\"NodeInfoSop\")!\n\n  return (_openBlock(), _createBlock(_component_NodeInfoSop, { graph_node_id: _ctx.graph_node_id }, null, 8 /* PROPS */, [\"graph_node_id\"]))\n}","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopPostProcessNetwork.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopPostProcessNetwork.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopPostProcessNetwork.vue?vue&type=style&index=0&id=1afbfc86&lang=sass\"","import { render } from \"./SopPostProcessNetwork.vue?vue&type=template&id=1afbfc86&ts=true\"\nimport script from \"./SopPostProcessNetwork.vue?vue&type=script&lang=ts\"\nexport * from \"./SopPostProcessNetwork.vue?vue&type=script&lang=ts\"\n\nimport \"./SopPostProcessNetwork.vue?vue&type=style&index=0&id=1afbfc86&lang=sass\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=style&index=0&id=69803565&lang=sass\"","import { render } from \"./NodeInfo.vue?vue&type=template&id=69803565&ts=true\"\nimport script from \"./NodeInfo.vue?vue&type=script&lang=ts\"\nexport * from \"./NodeInfo.vue?vue&type=script&lang=ts\"\n\nimport \"./NodeInfo.vue?vue&type=style&index=0&id=69803565&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeStyle as _normalizeStyle, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"ParamLabelResult\" }\nconst _hoisted_2 = [\"innerHTML\"]\nconst _hoisted_3 = {\n  key: 2,\n  class: \"w-64 truncate\"\n}\nconst _hoisted_4 = { class: \"ml-1 first:ml-0 whitespace-nowrap\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (!_ctx.isDetailed && !_ctx.isColor)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 0,\n          class: \"ParamLabelResultString\",\n          innerHTML: _ctx.result\n        }, null, 8 /* PROPS */, _hoisted_2))\n      : _createCommentVNode(\"v-if\", true),\n    (!_ctx.isDetailed && _ctx.isColor)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 1,\n          class: \"ParamLabelResultColor\",\n          style: _normalizeStyle(_ctx.colorStyleObject)\n        }, null, 4 /* STYLE */))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.isDetailed && _ctx.detailedElements)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.detailedElements, (detail) => {\n            return (_openBlock(), _createElementBlock(\"span\", _hoisted_4, [\n              _createElementVNode(\"span\", {\n                class: _normalizeClass([\n\t\t\t\t\t\t!_ctx.CoreType.isString(detail) && detail.bold == true ? 'font-bold' : '',\n\t\t\t\t\t\t_ctx.CoreType.isString(detail) ? '' : detail.className,\n\t\t\t\t\t])\n              }, _toDisplayString(_ctx.CoreType.isString(detail) ? detail : detail.label), 3 /* TEXT, CLASS */)\n            ]))\n          }), 256 /* UNKEYED_FRAGMENT */))\n        ]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=template&id=a8f62f94&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=style&index=0&id=a8f62f94&lang=sass\"","import { render } from \"./ParamLabelResult.vue?vue&type=template&id=a8f62f94&ts=true\"\nimport script from \"./ParamLabelResult.vue?vue&type=script&lang=ts\"\nexport * from \"./ParamLabelResult.vue?vue&type=script&lang=ts\"\n\nimport \"./ParamLabelResult.vue?vue&type=style&index=0&id=a8f62f94&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, withModifiers as _withModifiers } from \"vue\"\n\nconst _hoisted_1 = [\"innerHTML\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"node-markdown-comment-container\",\n    onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onClick && _ctx.onClick(...args)), [\"stop\",\"prevent\"])),\n    onPointerdown: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.onPointerdown && _ctx.onPointerdown(...args)))\n  }, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.parsedElements, (parsedElement) => {\n      return (_openBlock(), _createElementBlock(\"div\", {\n        class: \"mb-2 last:mb-0\",\n        innerHTML: parsedElement\n      }, null, 8 /* PROPS */, _hoisted_1))\n    }), 256 /* UNKEYED_FRAGMENT */))\n  ], 32 /* HYDRATE_EVENTS */))\n}","import {Editor} from '../../../../../Editor';\nimport {router} from '../../../../../../routes';\nimport {StoreController} from '../../../../../store/controllers/StoreController';\nimport {NodeSelectCommand} from '../../../../../history/commands/NodeSelect';\nimport {SelectionMethod} from '../../../../../core/Selection';\nimport {EngineNodeData} from '../../../../../store/modules/Engine';\nimport {LinkIndex} from '../../../common/LinkIndex';\nexport interface SetupMarkdownHelperOptions {\n\tjsonNode: EngineNodeData;\n\tlinkIndex: LinkIndex;\n}\n\nexport function setupMarkdownHelper(options: SetupMarkdownHelperOptions) {\n\tconst {jsonNode, linkIndex} = options;\n\tasync function onPointerdown(event: PointerEvent) {\n\t\tconst target = event.target;\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(target instanceof HTMLElement)) {\n\t\t\treturn;\n\t\t}\n\t\ttarget?.addEventListener('pointerup', _onPointerup);\n\t}\n\tasync function _onPointerup(event: PointerEvent) {\n\t\tconst target = event.target;\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!(target instanceof HTMLElement)) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.removeEventListener('pointerup', _onPointerup);\n\t\tawait _openLink(target);\n\t}\n\n\tasync function onClick(event: MouseEvent) {\n\t\tconst target = event.target;\n\t\t// if (event.button == MouseButton.LEFT) {\n\t\tevent.stopPropagation();\n\t\t// Editor.instance().open_in_new_tab(url);\n\t\t// }\n\t\t// console.log(event, target);\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\tif (!(target instanceof HTMLElement)) {\n\t\t\treturn;\n\t\t}\n\t\tawait _openLink(target);\n\t}\n\tasync function _openLink(target: HTMLElement) {\n\t\tconst href = target.getAttribute('href');\n\t\tif (!href) {\n\t\t\treturn;\n\t\t}\n\t\tconst url = href;\n\t\tif (url.startsWith('http')) {\n\t\t\t_openAsExternalLink(url);\n\t\t} else if (url.startsWith('/docs/') || url.startsWith('docs/')) {\n\t\t\t_openAsDocLink(url);\n\t\t} else {\n\t\t\tawait _openAsNodeLink(url);\n\t\t}\n\t}\n\tfunction _openAsExternalLink(url: string) {\n\t\t// console.log(event.button, MouseButton.LEFT);\n\t\t// if (event.button == MouseButton.LEFT) {\n\t\t// event.stopPropagation();\n\t\tEditor.instance().open_in_new_tab(url);\n\t\t// }\n\t}\n\tfunction _openAsDocLink(url: string) {\n\t\trouter.push(url);\n\t}\n\tasync function _openAsNodeLink(url: string) {\n\t\t// if (url.startsWith('/')) {\n\t\tconst nodePath = url;\n\t\tconst node = StoreController.engine.node(jsonNode.graph_node_id);\n\t\tif (!node) {\n\t\t\tconsole.warn('no node');\n\t\t\treturn;\n\t\t}\n\t\tconst linkedNode = node.node(nodePath);\n\t\tif (linkedNode) {\n\t\t\t// const parent = linkedNode.parent();\n\t\t\t// if (parent) {\n\t\t\t// \t_goToNode(parent, linkedNode);\n\t\t\t// }\n\t\t\tif (linkedNode.childrenController) {\n\t\t\t\tStoreController.editor.setCurrentNode(linkIndex, linkedNode);\n\t\t\t} else {\n\t\t\t\tconst linkedNodeParent = linkedNode.parent();\n\t\t\t\tif (linkedNodeParent) {\n\t\t\t\t\tStoreController.editor.setCurrentNode(linkIndex, linkedNodeParent);\n\t\t\t\t\t// this is currently placed in a setTimeout, so that\n\t\t\t\t\t// the selection does not get cancelled by the pointerup event from the nodeSelection helper,\n\t\t\t\t\tconst selectLinkedNode = async () => {\n\t\t\t\t\t\tconst cmd = new NodeSelectCommand(linkedNodeParent, [linkedNode], SelectionMethod.OVERRIDE);\n\t\t\t\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t\t\t\t};\n\t\t\t\t\tsetTimeout(selectLinkedNode, 100);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// const linkedNodeParent = linkedNode.parent();\n\t\t\t// if (linkedNodeParent && linkedNodeParent == node.parent()) {\n\t\t\t// \tconst cmd = new NodeSelectCommand(linkedNodeParent, [linkedNode], SelectionMethod.OVERRIDE);\n\t\t\t// \tcmd.push();\n\t\t\t// \t// node.parent()?.childrenController?.selection.set([linkedNode]);\n\t\t\t// } else {\n\t\t\t// \tStoreController.editor.setCurrentNode(props.linkIndex, linkedNode);\n\t\t\t// }\n\t\t} else {\n\t\t\tStoreController.editor.status.setError(`no node found with path '${nodePath}' from node '${node.path()}'`);\n\t\t}\n\t\t// }\n\t}\n\n\treturn {onPointerdown, onClick};\n}\n","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeComment.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeComment.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeComment.vue?vue&type=style&index=0&id=14e0d5f3&lang=sass\"","import { render } from \"./NodeComment.vue?vue&type=template&id=14e0d5f3&ts=true\"\nimport script from \"./NodeComment.vue?vue&type=script&lang=ts\"\nexport * from \"./NodeComment.vue?vue&type=script&lang=ts\"\n\nimport \"./NodeComment.vue?vue&type=style&index=0&id=14e0d5f3&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, withModifiers as _withModifiers, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"error-flag h-full w-full\" }\nconst _hoisted_2 = [\"innerHTML\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createVNode(_component_font_awesome_icon, {\n      icon: \"fa-solid fa-exclamation-triangle\",\n      class: \"text-red-600 h-full w-full\"\n    }),\n    _createElementVNode(\"div\", {\n      class: \"relative top-4 border-2 border-red-600 bg-black rounded px-2 py-1 block w-72 opacity-80 z-50\",\n      onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onClick && _ctx.onClick(...args)), [\"stop\",\"prevent\"])),\n      onPointerdown: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.onPointerdown && _ctx.onPointerdown(...args)))\n    }, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.parsedElements, (parsedElement) => {\n        return (_openBlock(), _createElementBlock(\"div\", {\n          class: \"mb-2 last:mb-0\",\n          innerHTML: parsedElement\n        }, null, 8 /* PROPS */, _hoisted_2))\n      }), 256 /* UNKEYED_FRAGMENT */))\n    ], 32 /* HYDRATE_EVENTS */)\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=template&id=accab5ec&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=style&index=0&id=accab5ec&lang=sass\"","import { render } from \"./NodeError.vue?vue&type=template&id=accab5ec&ts=true\"\nimport script from \"./NodeError.vue?vue&type=script&lang=ts\"\nexport * from \"./NodeError.vue?vue&type=script&lang=ts\"\n\nimport \"./NodeError.vue?vue&type=style&index=0&id=accab5ec&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(), _createBlock(_resolveDynamicComponent(_ctx.componentType), { json_node: _ctx.json_node }, null, 8 /* PROPS */, [\"json_node\"]))\n  ]))\n}","export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeExtras.vue?vue&type=template&id=325d052f&ts=true\"","export { default } from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeExtras.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeExtras.vue?vue&type=script&lang=ts\"","import { render } from \"./NodeExtras.vue?vue&type=template&id=325d052f&ts=true\"\nimport script from \"./NodeExtras.vue?vue&type=script&lang=ts\"\nexport * from \"./NodeExtras.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=style&index=0&id=9c087fe0&lang=sass\"","import { render } from \"./Node.vue?vue&type=template&id=9c087fe0&ts=true\"\nimport script from \"./Node.vue?vue&type=script&lang=ts\"\nexport * from \"./Node.vue?vue&type=script&lang=ts\"\n\nimport \"./Node.vue?vue&type=style&index=0&id=9c087fe0&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"NetworkNodeInterractiveConnectionMultiple pointer-events-none touch-none\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_InterractiveConnectionFromSrc = _resolveComponent(\"InterractiveConnectionFromSrc\")!\n  const _component_InterractiveConnectionFromDest = _resolveComponent(\"InterractiveConnectionFromDest\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.srcJSONNodes, (srcJSONNode) => {\n      return (_openBlock(), _createBlock(_component_InterractiveConnectionFromSrc, {\n        json_parent: _ctx.json_parent,\n        src_json_node: srcJSONNode,\n        output_index: _ctx.data.output_index,\n        mouse_progress: _ctx.data.mouse_progress\n      }, null, 8 /* PROPS */, [\"json_parent\", \"src_json_node\", \"output_index\", \"mouse_progress\"]))\n    }), 256 /* UNKEYED_FRAGMENT */)),\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.destJSONNodes, (destJSONNode) => {\n      return (_openBlock(), _createBlock(_component_InterractiveConnectionFromDest, {\n        json_parent: _ctx.json_parent,\n        dest_json_node: destJSONNode,\n        input_index: _ctx.data.input_index,\n        mouse_progress: _ctx.data.mouse_progress\n      }, null, 8 /* PROPS */, [\"json_parent\", \"dest_json_node\", \"input_index\", \"mouse_progress\"]))\n    }), 256 /* UNKEYED_FRAGMENT */))\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionMultiple.vue?vue&type=template&id=985c4028&ts=true\"","import { createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"NetworkNodeInterractiveConnectionFromSrc\"\n}\nconst _hoisted_2 = [\"x1\", \"y1\", \"x2\", \"y2\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_ctx.src_position && _ctx.dest_position)\n    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n        (_openBlock(), _createElementBlock(\"svg\", {\n          style: _normalizeStyle(_ctx.svg_style_object)\n        }, [\n          _createElementVNode(\"line\", {\n            x1: _ctx.src_position.x,\n            y1: _ctx.src_position.y,\n            x2: _ctx.dest_position.x,\n            y2: _ctx.dest_position.y\n          }, null, 8 /* PROPS */, _hoisted_2)\n        ], 4 /* STYLE */))\n      ]))\n    : _createCommentVNode(\"v-if\", true)\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=template&id=a15c0e14&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=style&index=0&id=a15c0e14&lang=sass\"","import { render } from \"./InterractiveConnectionFromSrc.vue?vue&type=template&id=a15c0e14&ts=true\"\nimport script from \"./InterractiveConnectionFromSrc.vue?vue&type=script&lang=ts\"\nexport * from \"./InterractiveConnectionFromSrc.vue?vue&type=script&lang=ts\"\n\nimport \"./InterractiveConnectionFromSrc.vue?vue&type=style&index=0&id=a15c0e14&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"NetworkNodeInterractiveConnectionFromDest\"\n}\nconst _hoisted_2 = [\"x1\", \"y1\", \"x2\", \"y2\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_ctx.src_position && _ctx.dest_position)\n    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n        (_openBlock(), _createElementBlock(\"svg\", {\n          style: _normalizeStyle(_ctx.svg_style_object)\n        }, [\n          _createElementVNode(\"line\", {\n            x1: _ctx.src_position.x,\n            y1: _ctx.src_position.y,\n            x2: _ctx.dest_position.x,\n            y2: _ctx.dest_position.y\n          }, null, 8 /* PROPS */, _hoisted_2)\n        ], 4 /* STYLE */))\n      ]))\n    : _createCommentVNode(\"v-if\", true)\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=template&id=66f67dbc&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=style&index=0&id=66f67dbc&lang=sass\"","import { render } from \"./InterractiveConnectionFromDest.vue?vue&type=template&id=66f67dbc&ts=true\"\nimport script from \"./InterractiveConnectionFromDest.vue?vue&type=script&lang=ts\"\nexport * from \"./InterractiveConnectionFromDest.vue?vue&type=script&lang=ts\"\n\nimport \"./InterractiveConnectionFromDest.vue?vue&type=style&index=0&id=66f67dbc&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionMultiple.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionMultiple.vue?vue&type=script&lang=ts\"","import { render } from \"./InterractiveConnectionMultiple.vue?vue&type=template&id=985c4028&ts=true\"\nimport script from \"./InterractiveConnectionMultiple.vue?vue&type=script&lang=ts\"\nexport * from \"./InterractiveConnectionMultiple.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"overflow-auto h-full max-h-full flex flex-col\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"h-10 opacity-0 pointer-events-none\" }, \"dummy content\", -1 /* HOISTED */)\nconst _hoisted_3 = { class: \"flex-1 mt-6 p-4\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"list-none ml-0 -my-5 divide-y divide-bg-light pb-10\"\n}\nconst _hoisted_5 = {\n  key: 1,\n  class: \"w-full text-center w-full\"\n}\nconst _hoisted_6 = { class: \"mx-auto text-sm text-text-faded\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeListItem = _resolveComponent(\"NodeListItem\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _hoisted_2,\n    _createElementVNode(\"div\", _hoisted_3, [\n      (_ctx.jsonChildrenSorted.length > 0)\n        ? (_openBlock(), _createElementBlock(\"ul\", _hoisted_4, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.jsonChildrenSorted, (jsonChildNode) => {\n              return (_openBlock(), _createBlock(_component_NodeListItem, {\n                key: jsonChildNode.graph_node_id,\n                jsonNode: jsonChildNode,\n                jsonParent: _ctx.jsonNode,\n                openTabMenuForChangeType: _ctx.openTabMenuForChangeType\n              }, null, 8 /* PROPS */, [\"jsonNode\", \"jsonParent\", \"openTabMenuForChangeType\"]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n            _createElementVNode(\"div\", _hoisted_6, \"there no nodes inside \" + _toDisplayString(_ctx.jsonNode.name), 1 /* TEXT */),\n            _createElementVNode(\"button\", {\n              class: \"mt-4 w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-16 py-2 bg-green-600 text-base font-medium text-white hover:bg-green-700 sm:ml-3 sm:w-auto sm:text-sm cursor-pointer whitespace-nowrap\",\n              \"aria-label\": \"Go Up\",\n              onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.goUp && _ctx.goUp(...args)))\n            }, \" Go Up \")\n          ]))\n    ])\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodesList.vue?vue&type=template&id=614a5e3c&ts=true\"","import { createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"py-1 hover:bg-bg-light px-2\" }\nconst _hoisted_2 = { class: \"flex items-center space-x-4\" }\nconst _hoisted_3 = { class: \"flex-1 min-w-0\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"li\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createCommentVNode(\" <div class=\\\"flex-shrink-0\\\">\\n\\t\\t\\t\\t\\t\\t\\t<img class=\\\"h-8 w-8 rounded-full\\\" :src=\\\"person.imageUrl\\\" alt=\\\"\\\" />\\n\\t\\t\\t\\t\\t\\t</div> \"),\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createElementVNode(\"div\", {\n          class: \"text-sm font-medium truncate\",\n          onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onNameClick && _ctx.onNameClick(...args)), [\"stop\",\"prevent\"]))\n        }, _toDisplayString(_ctx.jsonNode.name), 1 /* TEXT */),\n        _createCommentVNode(\" <p class=\\\"text-xs text-text-faded truncate\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{ jsonNode.type }}\\n\\t\\t\\t\\t\\t\\t</p> \")\n      ]),\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"span\", {\n          class: _normalizeClass([\"select-none inline-flex items-center shadow-sm px-2.5 py-0.5 text-xs font-medium rounded-full cursor-pointer\", [\n\t\t\t\t\t\t_ctx.selected\n\t\t\t\t\t\t\t? 'bg-emerald-600 hover:bg-emerald-500 text-text hover:text-text-light'\n\t\t\t\t\t\t\t: 'bg-white hover:bg-gray-50 text-gray-700 hover:text-gray-800',\n\t\t\t\t\t]]),\n          onClick: _cache[1] || (_cache[1] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.toggleSelect && _ctx.toggleSelect(...args)), [\"stop\"]))\n        }, _toDisplayString(_ctx.selected ? 'De-Select' : 'Select'), 3 /* TEXT, CLASS */)\n      ])\n    ])\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeListItem.vue?vue&type=template&id=1909f1b0&ts=true\"","export class EditorCoreType {\n\tstatic isTouchEvent(event: Event): boolean {\n\t\t// https://stackoverflow.com/questions/27313488/touchevent-not-working-in-firefox-and-other-website-browser\n\t\treturn window.TouchEvent && event instanceof TouchEvent;\n\t}\n}\n","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {Editor} from './../../../../Editor';\nimport {EditorCoreType} from './../../../../core/EditorCoreType';\nimport {Vector2} from 'three';\nimport {Box2} from 'three';\nimport {CoreDom} from '../../../../core/Dom';\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nimport {Constants} from '../../../../core/network/Constants';\nimport {Ref} from 'vue';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeSelectCommand} from '../../../../history/commands/NodeSelect';\nimport {SelectionMethod} from '../../../../core/Selection';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {Vector2Like} from '../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {NetworkAction} from '../mixins/EventMouse';\n\nexport interface NodeSelectionData {\n\tstart: Vector2Like;\n\tend: Vector2Like;\n\tactive: boolean;\n}\n\nexport class NodeSelectionHelper {\n\tprivate event_helper: EventHelper = new EventHelper(document.body);\n\n\tprivate parent_node: BaseNodeType | undefined;\n\tprivate method: SelectionMethod = SelectionMethod.ADD;\n\tprivate start_position: Vector2 = new Vector2();\n\tprivate end_position: Vector2 = new Vector2();\n\tprivate node_around_mouse_position: Vector2 = new Vector2();\n\n\tconstructor(\n\t\tprivate mode: Ref<NetworkAction | null>,\n\t\tprivate data: NodeSelectionData,\n\t\tprivate camera_data: MultiPlayer.Awareness.CameraData\n\t) {}\n\n\tsetElement(element: HTMLElement) {\n\t\tthis.event_helper.setElement(element);\n\t}\n\n\tset_parent_node(parent_node: BaseNodeType) {\n\t\tthis.parent_node = parent_node;\n\t}\n\n\tcapture_node(id: CoreGraphNodeId) {\n\t\tconst node = StoreController.engine.node(id);\n\t\tif (node) {\n\t\t\tthis.capture_nodes([node]);\n\t\t} else {\n\t\t\tthis.capture_nodes([]);\n\t\t}\n\t}\n\tasync capture_nodes(nodes: BaseNodeType[]) {\n\t\tif (this.parent_node && this.parent_node.childrenAllowed() && this.parent_node.childrenController) {\n\t\t\tif (!this.parent_node.childrenController.selection.equals(nodes)) {\n\t\t\t\tconst command = new NodeSelectCommand(this.parent_node, nodes, this.method);\n\t\t\t\tawait Editor.instance().pushCommand(command);\n\t\t\t} else {\n\t\t\t\t// console.log(\"selection has not changed\");\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('selection has no parent node');\n\t\t}\n\t}\n\tclear_selection() {\n\t\tthis.capture_nodes([]);\n\t}\n\n\tmouse_barely_moved(event: TouchEvent | MouseEvent): boolean {\n\t\t// if (!((this.start_position != null) && (this.end_position != null))) { return true; }\n\n\t\t// const delta = {\n\t\t// \tx: this.end_position.x - this.start_position.x,\n\t\t// \ty: this.end_position.y - this.start_position.y\n\t\t// };\n\t\tconst delta = this.start_position.distanceTo(this.end_position);\n\t\treturn delta < 3;\n\n\t\t// const max_dist = 0.05;\n\t\t// return (Math.abs(delta.x) < max_dist) && (Math.abs(delta.y) < max_dist);\n\t}\n\n\t//\n\t//\n\t// MOVE\n\t//\n\t//\n\tprivate _lastEvent: TouchEvent | MouseEvent | undefined;\n\tmoveStart(event: TouchEvent | MouseEvent) {\n\t\tCoreDom.addDragClasses();\n\t\tthis._addDocumentEvents(event);\n\n\t\tthis._lastEvent = event;\n\t\tthis.event_helper.elementPosition(event, this.start_position);\n\t\tthis.start_position.divideScalar(this.camera_data.zoom);\n\t\t// this.start_position.multiplyScalar(this.camera_data.zoom)\n\t\tthis.data.start.x = this.start_position.x;\n\t\tthis.data.start.y = this.start_position.y;\n\t\tthis.data.end.x = this.data.start.x;\n\t\tthis.data.end.y = this.data.start.y;\n\t\tthis.data.active = true;\n\t\t// this.move_start_position = this.ray_helper.intersect_plane_from_event(event, this.camera);\n\t\t// this.move_end_position = this.move_start_position;\n\t\t// this._update_position();\n\t\t// return this._mesh.visible = true;\n\t}\n\tprivate _boundPointermove = (event: PointerEvent) => {\n\t\tthis._moveProgress(event);\n\t};\n\tprivate _boundTouchmove = (event: TouchEvent) => {\n\t\tthis._moveProgress(event);\n\t};\n\tprivate _boundPointerup = (event: PointerEvent) => {\n\t\tthis.move_end(event);\n\t};\n\tprivate _boundTouchend = (event: TouchEvent) => {\n\t\tthis.move_end(event);\n\t};\n\tprivate _addDocumentEvents(event: TouchEvent | MouseEvent) {\n\t\tif (EditorCoreType.isTouchEvent(event)) {\n\t\t\tdocument.addEventListener('touchmove', this._boundTouchmove);\n\t\t\tdocument.addEventListener('touchend', this._boundTouchend);\n\t\t} else {\n\t\t\tdocument.addEventListener('pointermove', this._boundPointermove);\n\t\t\tdocument.addEventListener('pointerup', this._boundPointerup);\n\t\t}\n\t}\n\tprivate removeDocumentEvents() {\n\t\tdocument.removeEventListener('touchmove', this._boundTouchmove);\n\t\tdocument.removeEventListener('touchend', this._boundTouchend);\n\t\tdocument.removeEventListener('pointermove', this._boundPointermove);\n\t\tdocument.removeEventListener('pointerup', this._boundPointerup);\n\t}\n\n\tprivate _moveProgress(event: TouchEvent | MouseEvent) {\n\t\tif (!this.data.active) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._lastEvent = event;\n\t\tthis.event_helper.elementPosition(event, this.end_position);\n\t\tthis.end_position.divideScalar(this.camera_data.zoom);\n\t\tthis.data.end.x = this.end_position.x;\n\t\tthis.data.end.y = this.end_position.y;\n\t\t// this.move_end_position = this.ray_helper.intersect_plane_from_event(event, this.camera);\n\t\t// this._update_position();\n\t}\n\n\tstatic methodFromEvent(event: TouchEvent | MouseEvent) {\n\t\tif (event.shiftKey || event.metaKey) {\n\t\t\treturn SelectionMethod.ADD;\n\t\t}\n\t\tif (event.ctrlKey) {\n\t\t\treturn SelectionMethod.REMOVE;\n\t\t}\n\t\treturn SelectionMethod.OVERRIDE;\n\t}\n\n\tupdateMethodFromEvent(event: TouchEvent | MouseEvent) {\n\t\tthis.method = NodeSelectionHelper.methodFromEvent(event);\n\t}\n\n\tmove_end(_: TouchEvent | MouseEvent) {\n\t\tthis.removeDocumentEvents();\n\t\tCoreDom.removeDragClasses();\n\t\tif (!this._lastEvent) {\n\t\t\treturn;\n\t\t}\n\t\tconst event = this._lastEvent;\n\t\tthis.updateMethodFromEvent(event);\n\n\t\tlet nodes = this.nodes_inside_box();\n\t\tconst move_barely_moved = this.mouse_barely_moved(event);\n\t\t// const move_in_progress = false;\n\t\tif (move_barely_moved) {\n\t\t\tconst found_node = this.node_around_mouse(event);\n\t\t\tif (found_node) {\n\t\t\t\tnodes = [found_node];\n\t\t\t}\n\t\t}\n\n\t\t// if (!move_in_progress || move_barely_moved) {\n\t\tif (move_barely_moved) {\n\t\t\tif (nodes.length == 0) {\n\t\t\t\tthis.clear_selection();\n\t\t\t} else {\n\t\t\t\tthis.capture_nodes(nodes);\n\t\t\t}\n\t\t} else {\n\t\t\tif (nodes.length > 0) {\n\t\t\t\tthis.capture_nodes(nodes);\n\t\t\t} else {\n\t\t\t\tthis.clear_selection();\n\t\t\t}\n\t\t}\n\t\t// }\n\n\t\t// this.start_position = null\n\t\t// this.end_position = null\n\t\tthis.data.active = false;\n\t\tthis.mode.value = null;\n\t}\n\n\t// _position_from_event: (event)->\n\t// \t{\n\t// \t\tx: event.screenX,\n\t// \t\ty: event.screenY,\n\t// \t}\n\n\tnode_around_mouse(event: TouchEvent | MouseEvent) {\n\t\tthis.event_helper.elementPosition(event, this.node_around_mouse_position);\n\t\tthis.node_around_mouse_position.divideScalar(this.camera_data.zoom);\n\t\tconst corner = this.node_around_mouse_position;\n\t\tconst box = new Box2(corner, corner);\n\t\tlet found_node = null;\n\t\tif (this.parent_node) {\n\t\t\tfor (let node of this.parent_node.children()) {\n\t\t\t\tconst node_box = this.node_box(node);\n\t\t\t\tif (box.intersectsBox(node_box)) {\n\t\t\t\t\tfound_node = found_node || node;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn found_node;\n\t}\n\n\tbox(): Box2 {\n\t\tconst r = this.data;\n\t\tconst min = new Vector2(Math.min(r.end.x, r.start.x), Math.min(r.end.y, r.start.y));\n\t\tconst max = new Vector2(Math.max(r.end.x, r.start.x), Math.max(r.end.y, r.start.y));\n\t\t// const size = new Vector2(\n\t\t// \tMath.abs( r.end.x - r.start.x ),\n\t\t// \tMath.abs( r.end.y - r.start.y )\n\t\t// )\n\t\treturn new Box2(min, max);\n\t}\n\n\tprivate nodes_inside_box(): BaseNodeType[] {\n\t\t// const min = this._min_position();\n\t\t// const max = this._max_position();\n\n\t\t// const bbox = new Box2(\n\t\t// \tnew Vector2(min.x, min.y),\n\t\t// \tnew Vector2(max.x, max.y)\n\t\t// \t);\n\t\tconst box = this.box();\n\t\t// const cam_pos = this.camera_data.position\n\t\t// const camera_position_offset = new Vector2(cam_pos.x, cam_pos.y)\n\t\tconst nodes = [];\n\n\t\tif (this.parent_node) {\n\t\t\tfor (let node of this.parent_node.children()) {\n\t\t\t\t// const pos = node.ui_data().position();\n\t\t\t\t// const adjusted_pos = pos.clone().multiplyScalar(50).sub(this.camera_data.position)\n\t\t\t\tconst node_box = this.node_box(node); //.translate(camera_position_offset)\n\t\t\t\tif (box.intersectsBox(node_box)) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nodes;\n\t}\n\n\tprivate node_box(node: BaseNodeType): Box2 {\n\t\t// const pos_mult = Constants.NODE_POS_MULT\n\t\tconst size = Constants.NODE_UNIT;\n\t\tconst pos = node.uiData.position().clone(); //.multiplyScalar(pos_mult)\n\t\treturn new Box2(pos.clone().subScalar(size * 0.5), pos.clone().addScalar(size * 0.5));\n\t}\n}\n","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeListItem.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeListItem.vue?vue&type=script&lang=ts\"","import { render } from \"./NodeListItem.vue?vue&type=template&id=1909f1b0&ts=true\"\nimport script from \"./NodeListItem.vue?vue&type=script&lang=ts\"\nexport * from \"./NodeListItem.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodesList.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodesList.vue?vue&type=script&lang=ts\"","import { render } from \"./NodesList.vue?vue&type=template&id=614a5e3c&ts=true\"\nimport script from \"./NodesList.vue?vue&type=script&lang=ts\"\nexport * from \"./NodesList.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"absolute bottom-0 text-center w-full pointer-events-none select-none text-gray-600\" }\nconst _hoisted_2 = { class: \"relative text-xs mx-auto\" }\nconst _hoisted_3 = {\n  key: 1,\n  class: \"relative text-xs mx-auto\"\n}\nconst _hoisted_4 = { class: \"flex gap-2 items-center justify-center\" }\nconst _hoisted_5 = { class: \"flex gap-1 items-center\" }\nconst _hoisted_6 = { class: \"font-bold\" }\nconst _hoisted_7 = { class: \"\" }\nconst _hoisted_8 = {\n  key: 0,\n  class: \"flex gap-1 items-center\"\n}\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", null, \"/\", -1 /* HOISTED */)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_router_link = _resolveComponent(\"router-link\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_ctx.tabMenuActive)\n      ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList(_ctx.TAB_MENU_LINES, (line) => {\n          return (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString(line), 1 /* TEXT */))\n        }), 256 /* UNKEYED_FRAGMENT */))\n      : (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.SORTED_KEYS, (keyList, i) => {\n            return (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(keyList, (key) => {\n                return (_openBlock(), _createElementBlock(\"span\", _hoisted_5, [\n                  _createElementVNode(\"span\", _hoisted_6, _toDisplayString(key) + \":\", 1 /* TEXT */),\n                  _createElementVNode(\"span\", _hoisted_7, _toDisplayString(_ctx.LABEL_BY_ACTIONS[key]), 1 /* TEXT */)\n                ]))\n              }), 256 /* UNKEYED_FRAGMENT */)),\n              (i == _ctx.SORTED_KEYS.length - 1)\n                ? (_openBlock(), _createElementBlock(\"span\", _hoisted_8, [\n                    _hoisted_9,\n                    _createVNode(_component_router_link, {\n                      class: \"pointer-events-auto cursor-pointer select-none text-gray-500 hover:text-gray-400\",\n                      to: \"/docs/editor/network\",\n                      target: \"_blank\"\n                    }, {\n                      default: _withCtx(() => [\n                        _createTextVNode(\"more\")\n                      ]),\n                      _: 1 /* STABLE */\n                    })\n                  ]))\n                : _createCommentVNode(\"v-if\", true)\n            ]))\n          }), 256 /* UNKEYED_FRAGMENT */))\n        ]))\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkHints.vue?vue&type=template&id=90044560&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkHints.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkHints.vue?vue&type=script&lang=ts\"","import { render } from \"./NetworkHints.vue?vue&type=template&id=90044560&ts=true\"\nimport script from \"./NetworkHints.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkHints.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref: \"minimapContainer\",\n    class: \"absolute bottom-0 right-0 w-32 h-32 border-2 border-gray-500 bg-slate-800 opacity-20 hover:opacity-50 cursor-pointer\",\n    onPointerdown: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.onPointerdown && _ctx.onPointerdown(...args)))\n  }, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.nodeStyleObjects, (nodeSyleObject) => {\n      return (_openBlock(), _createElementBlock(\"div\", {\n        style: _normalizeStyle(nodeSyleObject),\n        class: \"absolute w-1 h-1 bg-white rounded-full pointer-events-none\"\n      }, null, 4 /* STYLE */))\n    }), 256 /* UNKEYED_FRAGMENT */)),\n    _createElementVNode(\"div\", {\n      style: _normalizeStyle(_ctx.cameraStyleObject),\n      class: \"absolute w-2 h-2 bg-blue-600 rounded-full pointer-events-none\"\n    }, null, 4 /* STYLE */)\n  ], 544 /* HYDRATE_EVENTS, NEED_PATCH */))\n}","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./MiniMap.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./MiniMap.vue?vue&type=script&lang=ts\"","import { render } from \"./MiniMap.vue?vue&type=template&id=b218298c&ts=true\"\nimport script from \"./MiniMap.vue?vue&type=script&lang=ts\"\nexport * from \"./MiniMap.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"absolute inset-0 pointer-events-none z-50 opacity-75\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.styleObjects, (styleObject, i) => {\n      return (_openBlock(), _createElementBlock(\"div\", {\n        style: _normalizeStyle(styleObject),\n        class: \"absolute\"\n      }, [\n        _createVNode(_component_font_awesome_icon, {\n          icon: \"fa-solid fa-arrow-pointer\",\n          class: \"w-2 h-4\"\n        }),\n        _createElementVNode(\"div\", {\n          style: _normalizeStyle(_ctx.usernameStyleObjects[i]),\n          class: \"absolute top-full left-0 text-xs text-white px-1 py-0.5 opacity-50\"\n        }, _toDisplayString(_ctx.displayedUsers[i].username), 5 /* TEXT, STYLE */)\n      ], 4 /* STYLE */))\n    }), 256 /* UNKEYED_FRAGMENT */))\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./MultiPlayerCursors.vue?vue&type=template&id=d76408ac&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./MultiPlayerCursors.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./MultiPlayerCursors.vue?vue&type=script&lang=ts\"","import { render } from \"./MultiPlayerCursors.vue?vue&type=template&id=d76408ac&ts=true\"\nimport script from \"./MultiPlayerCursors.vue?vue&type=script&lang=ts\"\nexport * from \"./MultiPlayerCursors.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {Editor} from './../../../../Editor';\nimport {Keyboard} from './../../../../core/Keyboard';\nimport {KeyEventsDispatcher} from './../../../../helpers/KeyEventsDispatcher';\nimport {Vector2} from 'three';\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nimport {Vector2Like} from '../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {Constants} from '../../../../core/network/Constants';\nimport {Ref} from 'vue';\n// import {StoreController} from '../../../../store/controllers/StoreController';\n// import {Editor} from '../../../../Editor';\nimport {NetworkAction} from '../mixins/EventMouse';\nimport {\n\tNodeCreateCommand,\n\tNodeCreateCommandConnectionData,\n\tNodeCreateConnectOptions,\n} from '../../../../history/commands/NodeCreate';\n\nexport interface NodeCreationData {\n\tactive: boolean;\n\tposition: Vector2Like;\n}\n\ninterface HoveredNodeData {\n\tnode: BaseNodeType;\n\tindex: number;\n}\ninterface CreateOptions {\n\tsetSelectedNodeAsInput: boolean;\n}\n\nexport class NodeCreationHelper {\n\tprivate _parentNode: BaseNodeType | undefined;\n\tprivate _nodeType: string | undefined;\n\t// private position: Vector2\n\tprivate move_progress_position: Vector2 = new Vector2();\n\tprivate create_position: Vector2 = new Vector2();\n\tprivate event_helper: EventHelper = new EventHelper(document.body);\n\tprivate _hoveredNodeForInput: HoveredNodeData | undefined;\n\tprivate _hoveredNodeForOutput: HoveredNodeData | undefined;\n\tprivate _hoveredConnectionData: NodeCreateCommandConnectionData | undefined;\n\n\tconstructor(\n\t\tprivate mode: Ref<NetworkAction | null>,\n\t\tprivate data: Ref<NodeCreationData>,\n\t\tprivate camera_data: MultiPlayer.Awareness.CameraData\n\t) {\n\t\t//\n\t}\n\tsetElement(element: HTMLElement) {\n\t\tthis.event_helper.setElement(element);\n\t}\n\n\tsetParentNode(parentNode: BaseNodeType) {\n\t\tthis._parentNode = parentNode;\n\t\tthis._nodeType = undefined;\n\t}\n\n\tactive(): boolean {\n\t\treturn this.data.value.active;\n\t}\n\tposition() {\n\t\treturn this.data.value.position;\n\t}\n\tsetPositionFromEvent(event: PointerEvent | MouseEvent) {\n\t\tthis.event_helper.elementPosition(event, this.move_progress_position);\n\t\tthis.move_progress_position.divideScalar(this.camera_data.zoom);\n\t\tthis.data.value.position.x = this.move_progress_position.x - 0.5 * Constants.NODE_UNIT;\n\t\tthis.data.value.position.y = this.move_progress_position.y - 0.5 * Constants.NODE_UNIT;\n\t\t// this.data.value.position.x = pos.x;\n\t\t// this.data.value.position.y = pos.y;\n\t}\n\tactivate(node_type: string) {\n\t\tif (this.is_node_type_a_valid_child_type(node_type)) {\n\t\t\tthis._nodeType = node_type;\n\t\t\tthis.data.value.active = true;\n\n\t\t\tthis._addDocumentEvents();\n\t\t}\n\t}\n\tdeactivate() {\n\t\t//return this._mesh.visible = false;\n\t\tthis.data.value.active = false;\n\t}\n\n\tprivate _on_keydownBound = this._on_keydown.bind(this);\n\tprivate _on_keydown(event: KeyboardEvent) {\n\t\tlet key_processed = true;\n\t\tswitch (event.key) {\n\t\t\tcase Keyboard.ENTER:\n\t\t\t\tthis._create({setSelectedNodeAsInput: event.ctrlKey});\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tkey_processed = false;\n\t\t}\n\t\treturn key_processed;\n\t}\n\n\tprivate _register_key_processor() {\n\t\tKeyEventsDispatcher.instance().deactivate();\n\t\t// document.addEventListener('keypress', _on_keypress);\n\t\tdocument.addEventListener('keydown', this._on_keydownBound);\n\t\t// document.addEventListener('keyup', _on_keyup);\n\t}\n\tprivate _deregister_key_processor() {\n\t\t// document.removeEventListener('keypress', _on_keypress);\n\t\tdocument.removeEventListener('keydown', this._on_keydownBound);\n\t\t// document.removeEventListener('keyup', _on_keyup);\n\t\tKeyEventsDispatcher.instance().activate();\n\t}\n\n\tactivated(): boolean {\n\t\treturn this.data.value.active;\n\t}\n\tprivate _boundPointermove = this._onpointermove.bind(this);\n\tprivate _boundPointerdown = this._onpointerdown.bind(this);\n\tprivate _boundClick = this._onclick.bind(this);\n\tprivate _addDocumentEvents() {\n\t\tdocument.addEventListener('pointermove', this._boundPointermove);\n\t\tdocument.addEventListener('pointerdown', this._boundPointerdown);\n\t\tdocument.addEventListener('click', this._boundClick);\n\t\tthis._register_key_processor();\n\t}\n\tprivate removeDocumentEvents() {\n\t\tdocument.removeEventListener('pointermove', this._boundPointermove);\n\t\tdocument.removeEventListener('pointerdown', this._boundPointerdown);\n\t\tdocument.removeEventListener('click', this._boundClick);\n\t\tthis._deregister_key_processor();\n\t}\n\tprivate _onpointermove(event: PointerEvent) {\n\t\t//return if !this.activated() # we don't check if it's activated here\n\t\t// as otherwise the position will not be set if the user just closes the tab menu\n\t\t// without moving the mouse\n\n\t\t// return this._update_transform();\n\t\tthis.setPositionFromEvent(event);\n\t}\n\n\tprivate _onpointerdown(event: PointerEvent) {\n\t\tif (event.pointerType != 'touch') {\n\t\t\treturn;\n\t\t}\n\t\tthis.setPositionFromEvent(event);\n\t\tthis._create({setSelectedNodeAsInput: event.ctrlKey});\n\t}\n\tprivate _onclick(event: MouseEvent) {\n\t\tthis.setPositionFromEvent(event);\n\t\tthis._create({setSelectedNodeAsInput: event.ctrlKey});\n\t}\n\n\t// _update_transform() {\n\t// \t// this._mesh.position.x = this.move_end_position.x;\n\t// \t// return this._mesh.position.y = this.move_end_position.y;\n\t// }\n\n\tsetHoveredConnection(data: NodeCreateCommandConnectionData) {\n\t\tthis._hoveredConnectionData = data;\n\t}\n\tunsetHoveredConnection() {\n\t\tthis._hoveredConnectionData = undefined;\n\t}\n\tsetHoveredNodeInput(node: BaseNodeType, index: number) {\n\t\tthis._hoveredNodeForInput = {node, index};\n\t\tthis._hoveredNodeForOutput = undefined;\n\t}\n\tsetHoveredNodeOutput(node: BaseNodeType, index: number) {\n\t\tthis._hoveredNodeForInput = undefined;\n\t\tthis._hoveredNodeForOutput = {node, index};\n\t}\n\tunsetHoveredNodeInput() {\n\t\tthis._hoveredNodeForInput = undefined;\n\t}\n\tunsetHoveredNodeOutput() {\n\t\tthis._hoveredNodeForOutput = undefined;\n\t}\n\n\tprivate async _create(options: CreateOptions) {\n\t\tthis.removeDocumentEvents();\n\t\tif (!this.activated()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.mode.value = null;\n\n\t\t// if (StoreController.editor.userPlan.nodesCountLimitReached()) {\n\t\t// \tEditor.instance().showUpgradeRequiredNotice();\n\t\t// \treturn;\n\t\t// }\n\n\t\t// const cam_pos = this.camera_data.position\n\t\t// const pos = {\n\t\t// \tx: this.data.position.x/this.camera_data.zoom - cam_pos.x,\n\t\t// \ty: this.data.position.y/this.camera_data.zoom - cam_pos.y,\n\t\t// }\n\t\t// this.event_helper.element_position(event, this.create_position);\n\t\t// this.create_position.divideScalar(this.camera_data.zoom);\n\t\tthis.create_position.x = this.move_progress_position.x;\n\t\tthis.create_position.y = this.move_progress_position.y;\n\n\t\tconst precision = 1 * Constants.NODE_HEIGHT;\n\t\tthis.create_position.x = precision * Math.round(this.create_position.x / precision);\n\t\tthis.create_position.y = precision * Math.round(this.create_position.y / precision);\n\n\t\tif (this._parentNode && this._nodeType) {\n\t\t\tif (this.is_node_type_a_valid_child_type(this._nodeType)) {\n\t\t\t\tconst _getSelectedNode = (): HoveredNodeData | undefined => {\n\t\t\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\t\t\tthis._parentNode?.childrenController?.selection?.nodes(nodes);\n\t\t\t\t\tnodes.sort((a, b) => {\n\t\t\t\t\t\tconst aPos = a.uiData.position();\n\t\t\t\t\t\tconst bPos = b.uiData.position();\n\t\t\t\t\t\tconst aDist = aPos.distanceTo(this.create_position);\n\t\t\t\t\t\tconst bDist = bPos.distanceTo(this.create_position);\n\t\t\t\t\t\treturn aDist - bDist;\n\t\t\t\t\t});\n\t\t\t\t\tconst closestNode = nodes[0];\n\t\t\t\t\tif (!closestNode) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: closestNode,\n\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst newNodeOutput = this._hoveredNodeForOutput\n\t\t\t\t\t? this._hoveredNodeForOutput\n\t\t\t\t\t: options.setSelectedNodeAsInput\n\t\t\t\t\t? _getSelectedNode()\n\t\t\t\t\t: undefined;\n\t\t\t\tconst createOptions: NodeCreateConnectOptions = {\n\t\t\t\t\tnewNodeInput: this._hoveredNodeForInput,\n\t\t\t\t\tnewNodeOutput,\n\t\t\t\t\tconnection: this._hoveredConnectionData,\n\t\t\t\t};\n\t\t\t\tconst nodeCreateCommand = new NodeCreateCommand(\n\t\t\t\t\tthis._parentNode,\n\t\t\t\t\tthis._nodeType,\n\t\t\t\t\tthis.create_position.clone(),\n\t\t\t\t\tcreateOptions\n\t\t\t\t);\n\t\t\t\tawait Editor.instance().pushCommand(nodeCreateCommand);\n\t\t\t\tthis._hoveredNodeForInput = undefined;\n\t\t\t\tthis._hoveredNodeForOutput = undefined;\n\t\t\t\tthis._hoveredConnectionData = undefined;\n\t\t\t}\n\t\t}\n\n\t\tthis.deactivate();\n\t}\n\tis_node_type_a_valid_child_type(node_type: string): boolean {\n\t\tif (this._parentNode && this._parentNode.childrenController && node_type) {\n\t\t\treturn this._parentNode.childrenController.isValidChildType(node_type);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// _create_rectangle(index: number) {\n\t// \tthis._update_position();\n\t// }\n\n\t// _update_position() {\n\t// \tconst size = 0.5;\n\t// \tconst min = {x: -size, y: -size};\n\t// \tconst max = {x: +size, y: +size};\n\t// \tconst z = 1;\n\t// \tconst positions = [min.x, min.y, z, min.x, max.y, z, max.x, max.y, z, max.x, min.y, z];\n\t// \t// const position_attribute = this._geometry.getAttribute('position');\n\t// \t// const { array } = position_attribute;\n\t// \t// lodash_each(positions, (pos, i)=> array[i] = pos);\n\t// \t// return position_attribute.needsUpdate = true;\n\t// }\n}\n","import {Vector2} from 'three';\n\nclass VectorPair {\n\tpublic v0 = new Vector2();\n\tpublic v1 = new Vector2();\n\n\tcopyTouches(touches: TouchList) {\n\t\tconst touch0 = touches[0];\n\t\tconst touch1 = touches[1];\n\t\tif (!(touch0 && touch1)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.v0.set(touch0.pageX, touch0.pageY);\n\t\tthis.v1.set(touch1.pageX, touch1.pageY);\n\t}\n\ttouchesDistance() {\n\t\treturn this.v0.distanceTo(this.v1);\n\t}\n\tcopy(src: VectorPair) {\n\t\tthis.v0.copy(src.v0);\n\t\tthis.v1.copy(src.v1);\n\t\treturn this;\n\t}\n\tsub(src: VectorPair) {\n\t\tthis.v0.sub(src.v0);\n\t\tthis.v1.sub(src.v1);\n\t\treturn this;\n\t}\n\tnormalize() {\n\t\tthis.v0.normalize();\n\t\tthis.v1.normalize();\n\t\treturn this;\n\t}\n\tdotProduct() {\n\t\treturn this.v0.dot(this.v1);\n\t}\n}\n\nexport class TouchEventHelper {\n\tprivate _startPos = new VectorPair();\n\tprivate _currentPos = new VectorPair();\n\tprivate _delta = new VectorPair();\n\tprivate _deltaNormalized = new VectorPair();\n\tprivate _startDist = -1;\n\tsetStartEvent(event: TouchEvent) {\n\t\tthis._startPos.copyTouches(event.touches);\n\t\tthis._startDist = this._startPos.touchesDistance();\n\t\tthis.setCurrentEvent(event);\n\t}\n\tsetCurrentEvent(event: TouchEvent) {\n\t\tthis._currentPos.copyTouches(event.touches);\n\t\tthis._delta.copy(this._currentPos).sub(this._startPos);\n\t\tthis._deltaNormalized.copy(this._delta).normalize();\n\t}\n\tdotProduct() {\n\t\treturn this._deltaNormalized.dotProduct();\n\t}\n\t// averagePos(target: Vector2) {\n\t// \treturn target.copy(this._currentPos[0]).add(this._currentPos[1]).multiplyScalar(0.5);\n\t// }\n\ttotalDeltaDist() {\n\t\treturn this._delta.v0.length() + this._delta.v1.length();\n\t}\n\tdistRatio() {\n\t\tconst currentDist = this._currentPos.touchesDistance();\n\t\treturn currentDist / this._startDist;\n\t}\n\taverageDelta(target: Vector2) {\n\t\treturn target.copy(this._delta.v0).add(this._delta.v1).multiplyScalar(0.5);\n\t}\n}\n","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {TouchEventHelper} from './../../../../core/TouchEventHelper';\nimport {Vector2} from 'three';\nimport {Box2} from 'three';\nimport {CoreMath} from '../../../../../../@polygonjs/polygonjs/src/core/math/_Module';\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {SetupCameraOptions} from '../mixins/Camera';\nimport {ref, Ref} from 'vue';\nimport {NetworkAction} from '../mixins/EventMouse';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\n// import {logHammer} from '../mixins/EventMouse';\n\nconst ZOOM_PROJ_VECTOR = new Vector2(1, -1);\n\nexport class CameraAnimationHelper {\n\t// public camera_position: Vector2 = new Vector2(50,50)\n\t// private properties_by_current_node: object = {}\n\t// private _parent_node: BaseNode\n\n\tprivate event_helper: EventHelper = new EventHelper(document.body);\n\n\tprivate pan_start_mouse_position: Vector2 = new Vector2();\n\tprivate pan_start_camera_position: Vector2 = new Vector2();\n\tprivate mouse_position: Vector2 = new Vector2();\n\tprivate pan_progress_position: Vector2 = new Vector2();\n\tprivate _pan_in_progress = ref(false);\n\n\tprivate zoom_start_mouse_position: Vector2 = new Vector2();\n\tprivate zoom_current_mouse_position: Vector2 = new Vector2();\n\tprivate _zoom_offset: Vector2 = new Vector2();\n\tprivate _zoom_in_progress = ref(false);\n\n\tprivate min_zoom: number = 0.1;\n\tprivate max_zoom: number = 2;\n\n\t// private _zoom_offset: number\n\n\tprivate parent_node: BaseNodeType | undefined;\n\t// private _touchPanDisabledWhileZoomInProgress = false;\n\t// private _touchZoomDisabledWhilePanInProgress = false;\n\n\tconstructor(\n\t\tprivate mode: Ref<NetworkAction | null>,\n\t\tprivate data: MultiPlayer.Awareness.CameraData,\n\t\tprivate zoomCommited: Ref<number>,\n\t\tprotected setupLinkIndex: SetupLinkIndexReturn\n\t) {}\n\n\tset_element(element: HTMLElement) {\n\t\tthis.event_helper.setElement(element);\n\t}\n\tset_parent_node(node: BaseNodeType) {\n\t\tthis.parent_node = node;\n\t}\n\tposition(): Vector2 {\n\t\treturn new Vector2(this.data.position.x, this.data.position.y);\n\t}\n\n\t//\n\t//\n\t// NAVIGATION\n\t//\n\t//\n\n\treset() {\n\t\t// this.camera.position.x = 0;\n\t\t// this.camera.position.y = 0;\n\t}\n\n\t//\n\t// PAN\n\t//\n\tpan_start(event: TouchEvent | MouseEvent | PointerEvent, camera_options: SetupCameraOptions) {\n\t\tthis.event_helper.elementPosition(event, this.pan_start_mouse_position);\n\t\tthis._panStartCommon();\n\t\t// this.pan_camera = this.camera.clone();\n\t\t// this.pan_start_position = this.ray_helper.intersect_plane_from_event(event, this.pan_camera);\n\t\t// this.pan_start_camera_position = this.camera.position.clone();\n\t\tthis._addDocumentEventsPan(camera_options);\n\t}\n\t// private _touchPanStart = new Vector2();\n\tprivate _touchPanDelta = new Vector2();\n\tprivate _touchEventHelper = new TouchEventHelper();\n\ttouchStart(event: TouchEvent) {\n\t\tthis._touchEventHelper.setStartEvent(event);\n\t\t// this._touchPanStart.copy(pos);\n\t\t// this._touchStartCommon();\n\t\t// this._initTouchZoom(dist);\n\t}\n\tprivate _panStartCommon() {\n\t\t// store the camera start pos\n\t\tthis.pan_start_camera_position.x = this.data.position.x;\n\t\tthis.pan_start_camera_position.y = this.data.position.y;\n\t\tthis._pan_in_progress.value = true;\n\t}\n\n\tprivate _camera_options: SetupCameraOptions | undefined;\n\tprivate _bound_pan_progress = this.pan_progress.bind(this);\n\tprivate _bound_pan_end = this.pan_end.bind(this);\n\tprivate _addDocumentEventsPan(camera_options: SetupCameraOptions) {\n\t\tthis._camera_options = camera_options;\n\t\tdocument.addEventListener('pointermove', this._bound_pan_progress);\n\t\tdocument.addEventListener('pointerup', this._bound_pan_end);\n\t}\n\tprivate removeDocumentEventsPan() {\n\t\tdocument.removeEventListener('pointermove', this._bound_pan_progress);\n\t\tdocument.removeEventListener('pointerup', this._bound_pan_end);\n\t}\n\tprivate _bound_zoom_progress = this.zoom_progress.bind(this);\n\tprivate _bound_zoom_end = this.zoom_end.bind(this);\n\tprivate _addDocumentEventsZoom(camera_options: SetupCameraOptions) {\n\t\tthis._camera_options = camera_options;\n\t\tdocument.addEventListener('pointermove', this._bound_zoom_progress);\n\t\tdocument.addEventListener('pointerup', this._bound_zoom_end);\n\t}\n\tprivate removeDocumentEventsZoom() {\n\t\tdocument.removeEventListener('pointermove', this._bound_zoom_progress);\n\t\tdocument.removeEventListener('pointerup', this._bound_zoom_end);\n\t}\n\n\tpan_progress(event: TouchEvent | MouseEvent | PointerEvent) {\n\t\tthis.event_helper.elementPosition(event, this.mouse_position);\n\t\tconst pan_mouse_offset = this.mouse_position /*.clone()*/\n\t\t\t.sub(this.pan_start_mouse_position)\n\t\t\t.divideScalar(this.data.zoom);\n\n\t\tthis._panProgressCommon(pan_mouse_offset);\n\n\t\t// const pan_prev_position = (this.pan_current_position || this.pan_start_position).clone();\n\t\t// this.pan_current_position = this.ray_helper.intersect_plane_from_event(event, this.pan_camera);\n\n\t\t// const pan_offset = this.pan_start_position.clone().sub(this.pan_current_position);\n\t\t// const new_pos = this.pan_start_camera_position.clone().add(pan_offset);\n\n\t\t// this.camera.position.x = new_pos.x;\n\t\t// this.camera.position.y = new_pos.y;\n\t\t// this.camera.updateProjectionMatrix();\n\t\treturn true;\n\t}\n\n\tprivate _touchesDeltaDotProduct: number | undefined;\n\tprivate _touchPanInProgress() {\n\t\treturn this._touchesDeltaDotProduct != null && this._touchesDeltaDotProduct > 0;\n\t}\n\tprivate _touchZoomInProgress() {\n\t\treturn this._touchesDeltaDotProduct != null && !this._touchPanInProgress();\n\t}\n\ttouchProgress(event: TouchEvent) {\n\t\tthis._touchEventHelper.setCurrentEvent(event);\n\t\tif (this._touchesDeltaDotProduct == null) {\n\t\t\tconst totalDelta = this._touchEventHelper.totalDeltaDist();\n\t\t\t// only check the dot product once the touches have travelled at least some distance\n\t\t\tif (totalDelta > 5) {\n\t\t\t\tthis._touchesDeltaDotProduct = this._touchEventHelper.dotProduct();\n\n\t\t\t\tif (this._touchPanInProgress()) {\n\t\t\t\t\tthis._panStartCommon();\n\t\t\t\t} else {\n\t\t\t\t\tif (this._touchZoomInProgress()) {\n\t\t\t\t\t\tthis._initTouchZoom();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst _touchPanProgress = () => {\n\t\t\tthis._touchEventHelper.averageDelta(this._touchPanDelta);\n\t\t\tthis._touchPanDelta.divideScalar(this.data.zoom);\n\n\t\t\tthis._panProgressCommon(this._touchPanDelta);\n\t\t};\n\t\tconst _touchZoomProgress = () => {\n\t\t\tconst distRatio = this._touchEventHelper.distRatio();\n\t\t\tconst newZoom = this._touchZoomStart * distRatio;\n\t\t\tthis.setZoom(newZoom);\n\t\t};\n\t\tif (this._touchPanInProgress()) {\n\t\t\t_touchPanProgress();\n\t\t} else {\n\t\t\tif (this._touchZoomInProgress()) {\n\t\t\t\t_touchZoomProgress();\n\t\t\t}\n\t\t}\n\t}\n\ttouchEnd() {\n\t\tthis._touchesDeltaDotProduct = undefined;\n\t\tif (this._touchPanInProgress()) {\n\t\t\tthis.pan_end();\n\t\t}\n\t}\n\tprivate _panProgressCommon(pos: Vector2) {\n\t\tthis.pan_progress_position.copy(this.pan_start_camera_position).add(pos);\n\t\tthis.data.position.x = this.pan_progress_position.x;\n\t\tthis.data.position.y = this.pan_progress_position.y;\n\t}\n\n\tpan_end(/*event: MouseEvent*/) {\n\t\tthis.removeDocumentEventsPan();\n\t\t// const pan_was_in_progress = this.is_pan_in_progress();\n\t\tthis._panEndCommon();\n\t\t// this.pan_camera = null;\n\t\t// this.pan_current_position = null;\n\n\t\t// this._update_json();\n\n\t\t// return pan_was_in_progress;\n\t}\n\t// touchPanEnd() {\n\t// \tthis._panEndCommon();\n\t// }\n\tprivate _panEndCommon() {\n\t\tthis._pan_in_progress.value = false;\n\n\t\tconst id = StoreController.editor.current_node_graph_id(this.setupLinkIndex.linkIndex.value);\n\t\tif (id) {\n\t\t\tthis._camera_options?.save_camera_history_for_json_node(id);\n\t\t}\n\t\tthis.mode.value = null;\n\t\t// this._touchZoomDisabledWhilePanInProgress = false;\n\t}\n\n\tpanInProgress() {\n\t\treturn this._pan_in_progress;\n\t}\n\n\t//\n\t// ZOOM\n\t//\n\tzoom_start(event: TouchEvent | MouseEvent | PointerEvent, camera_options: SetupCameraOptions) {\n\t\tthis.event_helper.elementPosition(event, this.zoom_start_mouse_position);\n\t\tthis._zoom_in_progress.value = true;\n\t\t// this.zoom_camera = this.camera.clone();\n\t\t// this.zoom_start_position = this.ray_helper.intersect_plane_from_event(event, this.zoom_camera);\n\t\t// this.zoom_start_camera_position = this.camera.position.clone();\n\t\t// return this.zoom_start_camera_zoom = this.camera.zoom;\n\t\tif (camera_options) {\n\t\t\tthis._addDocumentEventsZoom(camera_options);\n\t\t}\n\t}\n\t// private _touchZoomDistStart: number | undefined = undefined;\n\tprivate _touchZoomStart: number = 1;\n\t// touchZoomStart(event: TouchEvent) {\n\t// \tthis._initTouchZoom(dist);\n\t// }\n\tprivate _initTouchZoom() {\n\t\t// if (this._touchZoomDistStart == undefined) {\n\t\t// this._touchZoomDistStart = dist;\n\t\tthis._touchZoomStart = this.data.zoom;\n\t\t// this._zoom_in_progress.value = true;\n\t\t// }\n\t}\n\n\tzoom_progress(event: TouchEvent | MouseEvent | PointerEvent) {\n\t\tthis.event_helper.elementPosition(event, this.zoom_current_mouse_position);\n\n\t\t// // const zoom_prev_position = (this.zoom_current_position || this.zoom_start_position).clone();\n\t\t// this.zoom_current_position = this.ray_helper.intersect_plane_from_event(event, this.zoom_camera);\n\n\t\tthis._zoom_offset.copy(this.zoom_start_mouse_position);\n\t\tthis._zoom_offset.sub(this.zoom_current_mouse_position);\n\n\t\tconst dot = this._zoom_offset.dot(ZOOM_PROJ_VECTOR);\n\t\tconst newZoom = this.data.zoom - 0.001 * dot;\n\n\t\tthis.setZoom(newZoom);\n\t\tthis.zoom_start_mouse_position.copy(this.zoom_current_mouse_position);\n\t\t// return true;\n\t}\n\n\t// touchZoomProgress(dist: number) {\n\t// \tif (this._touchZoomDisabledWhilePanInProgress) {\n\t// \t\treturn;\n\t// \t}\n\t// \tthis._initTouchZoom(dist);\n\t// \tif (this._touchZoomDistStart != null && this._touchZoomStart != null) {\n\t// \t\tconst distDelta = this._touchZoomDistStart - dist;\n\t// \t\tthis._touchPanDisabledWhileZoomInProgress = Math.abs(distDelta) > 4;\n\t// \t\tconst distRatio = this._touchZoomDistStart / dist;\n\t// \t\t// logHammer(`d:${Math.floor(distDelta)}`);\n\t// \t\tconst newZoom = this._touchZoomStart / distRatio;\n\t// \t\tconsole.log(distRatio.toFixed(), this._touchZoomDistStart.toFixed(), dist.toFixed());\n\t// \t\tthis.set_zoom(newZoom);\n\t// \t}\n\t// }\n\n\tzoom_end(/*event: MouseEvent*/) {\n\t\tthis.removeDocumentEventsZoom();\n\t\t// const zoom_was_in_progress = this.is_zoom_in_progress();\n\t\t// this.zoom_start_position = null;\n\t\t// this.zoom_camera = null;\n\t\t// this.zoom_current_position = null;\n\t\t// this._zoom_offset = null;\n\t\t// this.zoom_start_mouse_position = null\n\t\tthis._zoom_in_progress.value = false;\n\t\t// return zoom_was_in_progress;\n\t\tconst id = StoreController.editor.current_node_graph_id(this.setupLinkIndex.linkIndex.value);\n\t\tif (id) {\n\t\t\tthis._camera_options?.save_camera_history_for_json_node(id);\n\t\t}\n\t\tthis.mode.value = null;\n\t\tthis.zoomCommited.value = this.data.zoom;\n\t}\n\t// touchZoomEnd() {\n\t// \tthis._zoom_in_progress.value = false;\n\t// \tthis.mode.value = null;\n\t// \tthis._touchZoomDistStart = undefined;\n\t// \tthis._touchZoomStart = undefined;\n\t// }\n\n\tzoomInProgress() {\n\t\t//@zoom_camera?\n\t\treturn this._zoom_in_progress;\n\t\t// return (this._zoom_offset != null) && (this._zoom_offset.length() > 0.01);\n\t}\n\n\tzoomFromWheelEvent(wheel_event: WheelEvent) {\n\t\tconst direction_in = wheel_event.deltaY < 0;\n\t\tconst current_zoom = this.data.zoom;\n\n\t\tlet mult = 0.9;\n\t\tif (direction_in) {\n\t\t\tmult = 1 / mult;\n\t\t}\n\n\t\tconst newZoom = current_zoom * mult;\n\t\tthis.setZoom(newZoom);\n\t\tthis.zoomCommited.value = this.data.zoom;\n\t}\n\tsetZoom(newZoom: number) {\n\t\tnewZoom = CoreMath.clamp(newZoom, this.min_zoom, this.max_zoom);\n\n\t\tthis.data.zoom = newZoom;\n\t\t// this._update_json();\n\t}\n\n\tframeSelection() {\n\t\tif (!this.parent_node) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.parent_node.childrenAllowed() || !this.parent_node.childrenController) {\n\t\t\treturn;\n\t\t}\n\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\tthis.parent_node.childrenController.selection.nodes(selectedNodes);\n\t\tconst nodes = selectedNodes.length > 0 ? selectedNodes : this.parent_node.children();\n\n\t\tconst box = new Box2();\n\t\tnodes.forEach((node) => {\n\t\t\tbox.expandByPoint(node.uiData.position());\n\t\t});\n\t\tconst center = new Vector2();\n\t\tbox.getCenter(center);\n\n\t\tthis.data.position.x = -center.x;\n\t\tthis.data.position.y = -center.y;\n\n\t\tthis.zoomCommited.value = this.data.zoom;\n\t}\n}\n","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {Editor} from './../../../../Editor';\nimport {Constants} from './../../../../core/network/Constants';\nimport lodash_compact from 'lodash/compact';\nimport {Vector2} from 'three';\nimport {CoreDom} from '../../../../core/Dom';\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeMoveCommand, nodeMoveCommandPrepareMaps} from '../../../../history/commands/NodeMove';\nimport {NodeSelectCommand} from '../../../../history/commands/NodeSelect';\nimport {SelectionMethod} from '../../../../core/Selection';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {NetworkAction} from '../mixins/EventMouse';\nimport {Ref} from 'vue';\n\nconst offset = new Vector2();\nconst offsetRounded = new Vector2();\nexport class NodeAnimationHelper {\n\tprivate _captured_node: BaseNodeType | undefined;\n\tprivate node_start_positions: Vector2[] = [];\n\tprivate start_position: Vector2 = new Vector2();\n\tprivate _pos_tmp = new Vector2();\n\tprivate move_progress_current_position: Vector2 = new Vector2();\n\tprivate move_offset: Vector2 = new Vector2();\n\tprivate event_helper: EventHelper = new EventHelper(document.body);\n\tprivate _move_in_progress: boolean = false;\n\n\tconstructor(private mode: Ref<NetworkAction | null>, private camera_data: MultiPlayer.Awareness.CameraData) {}\n\t//\n\tset_element(element: HTMLElement) {\n\t\tthis.event_helper.setElement(element);\n\t}\n\n\tcapture_node(id: CoreGraphNodeId) {\n\t\tconst node = StoreController.engine.node(id) || undefined;\n\t\tthis._captured_node = node;\n\t}\n\tprivate has_captured_nodes(): boolean {\n\t\treturn this.captured_nodes().length > 0;\n\t}\n\n\tcaptured_nodes(): BaseNodeType[] {\n\t\tif (this._captured_node) {\n\t\t\tconst parent = this._captured_node.parent();\n\t\t\tif (parent && parent.childrenAllowed() && parent.childrenController) {\n\t\t\t\tif (parent.childrenController.selection.contains(this._captured_node)) {\n\t\t\t\t\tconst nodes: BaseNodeType[] = [];\n\t\t\t\t\tparent.childrenController.selection.nodes(nodes);\n\t\t\t\t\treturn nodes;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn lodash_compact([this._captured_node]);\n\t}\n\n\t//\n\t//\n\t// MOVE\n\t//\n\t//\n\tmove_start(event: MouseEvent): boolean {\n\t\tif (!this.has_captured_nodes()) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._addDocumentEvents();\n\t\tCoreDom.addDragClasses();\n\t\tthis._move_in_progress = true;\n\n\t\tconst nodes = this.captured_nodes();\n\t\tthis.node_start_positions = nodes.map((node) => {\n\t\t\tconst pos = node.uiData.position().clone();\n\t\t\tconst precision = 1 * Constants.NODE_UNIT;\n\t\t\tpos.x = precision * Math.round(pos.x / precision);\n\t\t\tpos.y = precision * Math.round(pos.y / precision);\n\t\t\treturn pos;\n\t\t});\n\t\tthis.event_helper.elementPosition(event, this.start_position);\n\t\tthis.start_position.divideScalar(this.camera_data.zoom);\n\n\t\tthis.move_offset.set(0, 0); // = new Vector2(0, 0);\n\n\t\tconst node_ids = nodes.map((n) => n.graphNodeId());\n\t\tStoreController.editor.network.set_node_ids_being_moved(node_ids);\n\n\t\treturn true;\n\t}\n\tprivate _bound_mouse_progress = this._move_progress.bind(this);\n\tprivate _bound_mouse_end = this._move_end.bind(this);\n\tprivate _addDocumentEvents() {\n\t\tdocument.addEventListener('pointermove', this._bound_mouse_progress);\n\t\tdocument.addEventListener('pointerup', this._bound_mouse_end);\n\t}\n\tprivate removeDocumentEvents() {\n\t\tdocument.removeEventListener('pointermove', this._bound_mouse_progress);\n\t\tdocument.removeEventListener('pointerup', this._bound_mouse_end);\n\t}\n\n\tprivate _move_progress(event: MouseEvent) {\n\t\tif (!this.has_captured_nodes()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.event_helper.elementPosition(event, this.move_progress_current_position);\n\t\tthis.move_progress_current_position.divideScalar(this.camera_data.zoom);\n\t\t// const move_current_position = this.ray_helper.intersect_plane_from_event(event, this.camera);\n\n\t\tthis.move_offset.copy(this.move_progress_current_position).sub(this.start_position);\n\t\t// this.move_offset.divideScalar(this.camera_data.zoom)\n\n\t\tconst nodes = this.captured_nodes();\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tconst node = nodes[i];\n\t\t\tconst start_position = this.node_start_positions[i];\n\t\t\tthis._pos_tmp.copy(start_position).add(this.move_offset);\n\t\t\tnode.uiData.setPosition(this._pos_tmp);\n\t\t}\n\t}\n\n\tprivate async _move_end(/*event: MouseEvent*/) {\n\t\tthis.removeDocumentEvents();\n\t\tif (!this.has_captured_nodes()) {\n\t\t\treturn;\n\t\t}\n\t\tCoreDom.removeDragClasses();\n\n\t\tconst nodes = this.captured_nodes();\n\t\t// snap\n\t\tconst precision = 1 * Constants.NODE_UNIT;\n\t\tif (nodes.length > 0 && this.move_offset) {\n\t\t\toffset.copy(this.move_offset);\n\t\t\toffsetRounded.x = precision * Math.round(offset.x / precision);\n\t\t\toffsetRounded.y = precision * Math.round(offset.y / precision);\n\n\t\t\t// const resetNodesPosition = () => {\n\t\t\t// \tfor (let i = 0; i < nodes.length; i++) {\n\t\t\t// \t\tconst node = nodes[i];\n\t\t\t// \t\tconst startPos = this.node_start_positions[i];\n\t\t\t// \t\tnode.uiData.setPosition(startPos);\n\t\t\t// \t}\n\t\t\t// };\n\t\t\t// const newPositions: PosByNodeName = {};\n\t\t\t// const oldPositions: PosByNodeName = {};\n\t\t\t// for (let i = 0; i < nodes.length; i++) {\n\t\t\t// \tconst node = nodes[i];\n\t\t\t// \tconst startPos = this.node_start_positions[i];\n\t\t\t// \t// node.uiData.setPosition(startPos);\n\t\t\t// \toldPositions[node.name()] = {x: startPos.x, y: startPos.y};\n\t\t\t// \ttmpV2.copy(startPos).add(offset);\n\t\t\t// \tnewPositions[node.name()] = {x: tmpV2.x, y: tmpV2.y};\n\t\t\t// }\n\t\t\tconst {newPositions, oldPositions} = nodeMoveCommandPrepareMaps(\n\t\t\t\tnodes,\n\t\t\t\tthis.node_start_positions,\n\t\t\t\toffsetRounded\n\t\t\t);\n\n\t\t\tconst node = nodes[0];\n\t\t\tconst parentNode = node.parent();\n\t\t\tif (parentNode) {\n\t\t\t\tif (Math.abs(offset.x) > 0 || Math.abs(offset.y) > 0) {\n\t\t\t\t\tconst command = new NodeMoveCommand(parentNode, nodes, newPositions, oldPositions);\n\t\t\t\t\tawait Editor.instance().pushCommand(command);\n\t\t\t\t} else {\n\t\t\t\t\t// if we barely moved, the node is selected instead\n\t\t\t\t\tconst command = new NodeSelectCommand(parentNode, nodes, SelectionMethod.OVERRIDE);\n\t\t\t\t\tawait Editor.instance().pushCommand(command);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// release\n\t\tStoreController.editor.network.reset_node_ids_being_moved();\n\t\tthis._captured_node = undefined;\n\t\tthis.node_start_positions = [];\n\t\tthis.mode.value = null;\n\t\t// this.start_position = null;\n\t\t// this.move_offset = null;\n\t\tthis._move_in_progress = false;\n\t}\n\n\tmove_in_progress(): boolean {\n\t\treturn this._move_in_progress;\n\t}\n\tmouse_barely_moved(): boolean {\n\t\t// if (!(this.start_position != null && this.move_offset != null)) {\n\t\t// \treturn true;\n\t\t// }\n\n\t\treturn this.move_offset.length() < 5;\n\n\t\t// const delta = {\n\t\t// \tx: this.move_offset.x,\n\t\t// \ty: this.move_offset.y,\n\t\t// };\n\t\t// const max_dist = 0.05;\n\t\t// return Math.abs(delta.x) < max_dist && Math.abs(delta.y) < max_dist;\n\t}\n}\n","import {MultiPlayer} from './../../../../../npm_module/NpmModuleTypes';\nimport {Editor} from './../../../../Editor';\nimport {Vector2} from 'three';\nimport {CoreDom} from '../../../../core/Dom';\nimport {EventHelper} from '../../../../../../@polygonjs/polygonjs/src/core/EventHelper';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {NodeConnectCommand, isNodeConnectCommandRequired} from '../../../../history/commands/NodeConnect';\nimport {MultipleCommand} from '../../../../history/commands/Multiple';\nimport {Vector2Like} from '../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport {TypedNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {NetworkAction} from '../mixins/EventMouse';\nimport {ConnectionPointTypeMap} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/connections/ConnectionMap';\nimport {Ref} from 'vue';\nimport {TypedNodeConnection} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/io/NodeConnection';\n// import Material from './Material';\n\ninterface BaseConnectionData {\n\toutput_index: number;\n\tinput_index: number;\n\tmouse_start: Vector2Like;\n\tmouse_progress: Vector2Like;\n\tactive: boolean;\n}\nexport interface ConnectionData extends BaseConnectionData {\n\tnode_src_id: CoreGraphNodeId | null;\n\tnode_dest_id: CoreGraphNodeId | null;\n}\nexport interface InterractiveConnectionData extends BaseConnectionData {\n\tnode_src_ids: CoreGraphNodeId[];\n\tnode_dest_ids: CoreGraphNodeId[];\n}\n\nfunction traverseElementAncestors(element: HTMLElement): number | undefined {\n\tconst nodeIdStr = element.dataset['nodeid'];\n\tif (nodeIdStr) {\n\t\tconst nodeId = parseInt(nodeIdStr);\n\t\tif (!isNaN(nodeId)) {\n\t\t\treturn nodeId;\n\t\t}\n\t}\n\tconst parentElement = element.parentElement;\n\tif (parentElement) {\n\t\treturn traverseElementAncestors(parentElement);\n\t}\n}\n\nexport class ConnectionHelper<NC extends NodeContext> {\n\t// private node_src: BaseNode\n\t// private node_dest: BaseNode\n\t// private input_index: number\n\tprivate start_position: Vector2 = new Vector2();\n\tprivate move_position: Vector2 = new Vector2();\n\tprivate event_helper: EventHelper = new EventHelper(document.body);\n\n\tconstructor(\n\t\tprivate mode: Ref<NetworkAction | null>,\n\t\tprivate data: InterractiveConnectionData,\n\t\tprivate camera_data: MultiPlayer.Awareness.CameraData\n\t) {}\n\tset_element(element: HTMLElement) {\n\t\tthis.event_helper.setElement(element);\n\t}\n\n\t// line() {\n\t// \treturn this._mesh;\n\t// }\n\n\tcapture_node_src(id: CoreGraphNodeId, index: number, element?: HTMLElement, event?: PointerEvent) {\n\t\t// this.node_src = node;\n\t\tconst node = StoreController.engine.node(id)!;\n\t\tthis.data.node_src_ids.splice(0, this.data.node_src_ids.length);\n\n\t\tconst parent = node.parent();\n\t\tif (!(parent && parent.childrenController)) {\n\t\t\treturn;\n\t\t}\n\t\tif (parent.childrenController.selection.contains(node)) {\n\t\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\t\tparent.childrenController.selection.nodes(selectedNodes);\n\t\t\tconst selectedNodesWithRelevantInput = selectedNodes.filter((node) => {\n\t\t\t\t// if the node has no namedOutput, we just need to check that it does have an output\n\t\t\t\tif (!node.io.outputs.hasNamedOutputs()) {\n\t\t\t\t\treturn node.io.outputs.hasOutputs();\n\t\t\t\t}\n\t\t\t\t// if it has namedOutputs, we need to check the index is valid\n\t\t\t\treturn (node.io.outputs.namedOutputConnectionPoints() || []).length > index;\n\t\t\t});\n\t\t\tthis.data.node_src_ids.push(...selectedNodesWithRelevantInput.map((node) => node.graphNodeId()));\n\t\t} else {\n\t\t\tthis.data.node_src_ids.push(node.graphNodeId());\n\t\t}\n\n\t\tthis.data.output_index = index;\n\t\tif (element && event) {\n\t\t\tthis._addDocumentEvents(element, event);\n\t\t}\n\t\t// if(this.both_end_captured()){ this.create_connection()}\n\t}\n\tcapture_node_dest(id: CoreGraphNodeId, index: number, element?: HTMLElement, event?: PointerEvent) {\n\t\t// this.node_dest = node;\n\t\t// this.input_index = index;\n\t\tconst node = StoreController.engine.node(id)!;\n\t\tthis.data.node_dest_ids.splice(0, this.data.node_dest_ids.length);\n\t\tconst parent = node.parent();\n\t\tif (!(parent && parent.childrenController)) {\n\t\t\treturn;\n\t\t}\n\t\tif (parent.childrenController.selection.contains(node)) {\n\t\t\tconst selectedNodes: BaseNodeType[] = [];\n\t\t\tparent.childrenController.selection.nodes(selectedNodes);\n\t\t\tconst selectedNodesWithRelevantInput = selectedNodes.filter((node) => {\n\t\t\t\t// if the node has no namedInput, we just need to check that it does have an input\n\t\t\t\tif (!node.io.inputs.hasNamedInputs()) {\n\t\t\t\t\treturn node.io.inputs.maxInputsCount() > index;\n\t\t\t\t}\n\t\t\t\t// if it has namedOutputs, we need to check the index is valid\n\t\t\t\tconst connectionPoints = node.io.inputs.namedInputConnectionPoints();\n\t\t\t\tconst connectionPointsCount = connectionPoints ? connectionPoints.length : 0;\n\t\t\t\treturn connectionPointsCount > index;\n\t\t\t});\n\t\t\tthis.data.node_dest_ids.push(...selectedNodesWithRelevantInput.map((node) => node.graphNodeId()));\n\t\t} else {\n\t\t\tthis.data.node_dest_ids.push(node.graphNodeId());\n\t\t}\n\n\t\tthis.data.input_index = index;\n\t\tif (element && event) {\n\t\t\tthis._addDocumentEvents(element, event);\n\t\t}\n\t\t// if(this.both_end_captured()){ this.create_connection()}\n\t}\n\tcapture_node_final(id: CoreGraphNodeId) {\n\t\tconst node = StoreController.engine.node(id)! as TypedNode<NC, any>;\n\t\tconst finalizeData = () => {\n\t\t\tif (this.data.node_dest_ids.length > 0) {\n\t\t\t\tthis.data.node_src_ids.push(node.graphNodeId());\n\t\t\t\t// we need to set .output_index to 0 here\n\t\t\t\t// or it could also be done in the reset?\n\t\t\t\t// but if it is not set, the following sets could lead to a bug:\n\t\t\t\t//\n\t\t\t\t// 1. \tDrag from the output 2 of a node which has at least 3 outputs (like onTick).\n\t\t\t\t// \t\tThe drag could be to create a connection or to nothing\n\t\t\t\t// 2.\tDrag from the input 0 of any node into a node'body which has only 1 output\n\t\t\t\t// \t\t(for instance drag from input 0 of actor/sin to the body of a constant node)\n\t\t\t\t// 3. \tSee that a connection has been created from the non existing\n\t\t\t\t//\t\toutput 2 of the constant node (incorrect) to the input 0 of the sin (correct)\n\t\t\t\t//\n\t\t\t\tthis.data.output_index = 0;\n\t\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\t\tconst namedOutputsConnectionPoints = node.io.outputs.namedOutputConnectionPoints() || [];\n\t\t\t\t\tconst namedOutputsConnectionPointNames = namedOutputsConnectionPoints.map((n) => n && n.name());\n\t\t\t\t\tconst existingConnections: TypedNodeConnection<NC>[] = [];\n\t\t\t\t\tnode.io.connections.outputConnections(existingConnections);\n\t\t\t\t\tconst existingConnectionIds = existingConnections.map((c) => c.outputIndex());\n\t\t\t\t\tconst outputsWithoutConnections = namedOutputsConnectionPoints.filter(\n\t\t\t\t\t\t(cp, i) => !existingConnectionIds.includes(i)\n\t\t\t\t\t);\n\t\t\t\t\tconst getExpectedType = () => {\n\t\t\t\t\t\tconst node = StoreController.engine.node(this.data.node_dest_ids[0]) as TypedNode<NC, any>;\n\t\t\t\t\t\tif (!node) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst nodeInput = (node.io.inputs.namedInputConnectionPoints() || [])[this.data.input_index];\n\t\t\t\t\t\tif (nodeInput == null) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nodeInput.type();\n\t\t\t\t\t};\n\t\t\t\t\tconst expectedType = getExpectedType();\n\t\t\t\t\t// 1. try and find next non connected output with same type\n\t\t\t\t\tconst outputsWithoutConnectionsAndWithSameType = outputsWithoutConnections.filter(\n\t\t\t\t\t\t(cp) => cp && cp.type() == expectedType\n\t\t\t\t\t);\n\t\t\t\t\tconst firstOutputWithoutConnectionsAndWithSameType: ConnectionPointTypeMap[NC] | undefined =\n\t\t\t\t\t\toutputsWithoutConnectionsAndWithSameType[0];\n\t\t\t\t\tif (firstOutputWithoutConnectionsAndWithSameType != null) {\n\t\t\t\t\t\tthis.data.output_index = namedOutputsConnectionPointNames.indexOf(\n\t\t\t\t\t\t\tfirstOutputWithoutConnectionsAndWithSameType.name()\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// 2. try and find last already connected output with same type\n\t\t\t\t\tconst outputsWithSameType = namedOutputsConnectionPoints.filter(\n\t\t\t\t\t\t(cp, i) => cp && cp.type() == expectedType\n\t\t\t\t\t);\n\t\t\t\t\tconst lastOutputWithSameType = outputsWithSameType[outputsWithSameType.length - 1];\n\t\t\t\t\tif (lastOutputWithSameType != null) {\n\t\t\t\t\t\tthis.data.output_index = namedOutputsConnectionPointNames.indexOf(\n\t\t\t\t\t\t\tlastOutputWithSameType.name()\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 3. maybe there is a third option?\n\t\t\t\t} else {\n\t\t\t\t\tthis.data.output_index = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.data.node_src_ids.length > 0) {\n\t\t\t\t\t// set default\n\t\t\t\t\tthis.data.node_dest_ids.push(node.graphNodeId());\n\t\t\t\t\tconst maxInputsCount = node.io.inputs.maxInputsCount();\n\t\t\t\t\tconst inputs = node.io.inputs.inputs();\n\t\t\t\t\tlet nextInputIndex: number | null = null;\n\t\t\t\t\t// take the first available input\n\t\t\t\t\tfor (let i = 0; i < maxInputsCount; i++) {\n\t\t\t\t\t\tconst input = inputs[i];\n\t\t\t\t\t\tif (input == null && nextInputIndex == null) {\n\t\t\t\t\t\t\tnextInputIndex = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (nextInputIndex == null) {\n\t\t\t\t\t\tnextInputIndex = maxInputsCount - 1;\n\t\t\t\t\t}\n\t\t\t\t\tthis.data.input_index = Math.min(nextInputIndex, maxInputsCount - 1);\n\n\t\t\t\t\tif (node.io.outputs.hasNamedOutputs()) {\n\t\t\t\t\t\tconst namedInputsConnectionPoints = node.io.inputs.namedInputConnectionPoints() || [];\n\t\t\t\t\t\tconst namedInputsConnectionPointNames = namedInputsConnectionPoints.map((n) => n && n.name());\n\t\t\t\t\t\tconst existingConnections = node.io.connections.inputConnections();\n\t\t\t\t\t\tif (!existingConnections) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst existingConnectionIds = existingConnections.map((c) => {\n\t\t\t\t\t\t\tif (c != null) {\n\t\t\t\t\t\t\t\treturn c.inputIndex();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst inputsWithoutConnections = namedInputsConnectionPoints.filter(\n\t\t\t\t\t\t\t(cp, i) => !existingConnectionIds.includes(i)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst getExpectedType = () => {\n\t\t\t\t\t\t\tconst node = StoreController.engine.node(this.data.node_src_ids[0]) as TypedNode<NC, any>;\n\t\t\t\t\t\t\tif (!node) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst nodeOutput = (node.io.outputs.namedOutputConnectionPoints() || [])[\n\t\t\t\t\t\t\t\tthis.data.output_index\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\tif (nodeOutput == null) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn nodeOutput.type();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst expectedType = getExpectedType();\n\t\t\t\t\t\t// 1. try and find next non connected output with same type\n\t\t\t\t\t\tconst inputsWithoutConnectionsAndWithSameType = inputsWithoutConnections.filter(\n\t\t\t\t\t\t\t(cp) => cp && cp.type() == expectedType\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst firstInputWithoutConnectionsAndWithSameType: ConnectionPointTypeMap[NC] | undefined =\n\t\t\t\t\t\t\tinputsWithoutConnectionsAndWithSameType[0];\n\t\t\t\t\t\tif (firstInputWithoutConnectionsAndWithSameType != null) {\n\t\t\t\t\t\t\tthis.data.input_index = namedInputsConnectionPointNames.indexOf(\n\t\t\t\t\t\t\t\tfirstInputWithoutConnectionsAndWithSameType.name()\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 2. try and find last already connected output with same type\n\t\t\t\t\t\tconst inputsWithSameType = namedInputsConnectionPoints.filter(\n\t\t\t\t\t\t\t(cp, i) => cp && cp.type() == expectedType\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastInputWithSameType = inputsWithSameType[inputsWithSameType.length - 1];\n\t\t\t\t\t\tif (lastInputWithSameType != null) {\n\t\t\t\t\t\t\tthis.data.input_index = namedInputsConnectionPointNames.indexOf(\n\t\t\t\t\t\t\t\tlastInputWithSameType.name()\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfinalizeData();\n\n\t\tif (this.both_end_captured()) {\n\t\t\tthis.create_connection();\n\t\t}\n\t\tthis.reset();\n\t}\n\t//\n\t//\n\t// MOVE\n\t//\n\t//\n\tmove_start(event: MouseEvent): boolean {\n\t\tif (!this.has_captured_node()) {\n\t\t\treturn false;\n\t\t}\n\t\tCoreDom.addDragClasses();\n\n\t\t// this.data.mouse_start = this.event_helper.element_position_old(event).divideScalar(this.camera_data.zoom)\n\t\tthis.event_helper.elementPosition(event, this.start_position);\n\t\tthis.start_position.divideScalar(this.camera_data.zoom);\n\t\tthis.data.mouse_start.x = this.start_position.x;\n\t\tthis.data.mouse_start.y = this.start_position.y;\n\n\t\tthis.data.mouse_progress.x = this.data.mouse_start.x;\n\t\tthis.data.mouse_progress.y = this.data.mouse_start.y;\n\t\t// do not set the active just now\n\t\t// to avoid seeing the connections\n\t\t// with incomplete position data\n\t\t// resulting in a line that appears randomly set\n\t\t// until we start dragging\n\t\t// this.data.active = true;\n\t\t// this.move_start_position = this.ray_helper.intersect_plane_from_event(event, this.camera);\n\t\t// this.move_current_position = this.move_start_position;\n\t\t// this._update_position();\n\t\t// return this._mesh\n\t\treturn true;\n\t}\n\n\tprivate _bound_mouse_progress = this._move_progress.bind(this);\n\tprivate _bound_mouse_end = this.move_end.bind(this);\n\t// private _captureElement: HTMLElement | undefined;\n\t// private _previousTouchAction: string = 'none';\n\tprivate _addDocumentEvents(element: HTMLElement, event: PointerEvent) {\n\t\t// if (this._captureElement) {\n\t\t// \treturn;\n\t\t// }\n\t\tCoreDom.addDragClasses();\n\t\t// this._previousTouchAction = element.style.touchAction;\n\t\t// element.style.touchAction = 'none';\n\t\t// console.log('capture', this._hammerCallbacks);\n\t\t// if (this._hammerCallbacks) {\n\t\t// \tthis._hammerCallbacks.dispose();\n\t\t// }\n\t\t// element.setPointerCapture(event.pointerId);\n\t\t// this._captureElement = element;\n\t\tdocument.addEventListener('pointermove', this._bound_mouse_progress);\n\t\tdocument.addEventListener('pointercancel', this._boundOnpointercancel);\n\t\tdocument.addEventListener('pointerup', this._bound_mouse_end);\n\t}\n\tprivate removeDocumentEvents(event: PointerEvent) {\n\t\tCoreDom.removeDragClasses();\n\t\t// if (this._captureElement) {\n\t\t// this._captureElement.style.touchAction = this._previousTouchAction;\n\t\t// }\n\t\t// console.log('release', this._hammerCallbacks);\n\t\t// if (this._hammerCallbacks) {\n\t\t// \tthis._hammerCallbacks.create();\n\t\t// }\n\t\t// this._captureElement?.releasePointerCapture(event.pointerId);\n\t\t// this._captureElement = undefined;\n\t\tdocument.removeEventListener('pointermove', this._bound_mouse_progress);\n\t\tdocument.removeEventListener('pointercancel', this._boundOnpointercancel);\n\t\tdocument.removeEventListener('pointerup', this._bound_mouse_end);\n\t}\n\n\tprivate _move_progress(event: MouseEvent) {\n\t\tif (!this.has_captured_node()) {\n\t\t\treturn;\n\t\t}\n\t\t// console.log(event.target);\n\n\t\t// this.data.mouse_progress = this.event_helper.element_position_old(event).divideScalar(this.camera_data.zoom)\n\t\tthis.event_helper.elementPosition(event, this.move_position);\n\t\tthis.move_position.divideScalar(this.camera_data.zoom);\n\t\tthis.data.mouse_progress.x = this.move_position.x;\n\t\tthis.data.mouse_progress.y = this.move_position.y;\n\t\t//\n\t\tthis.data.active = true;\n\t\t// this.data.mouse_progress.x = this.move_position.x\n\t\t// this.data.mouse_progress.y = this.move_position.y\n\n\t\t// this.data.mouse_delta = current_pos.sub(this.start_position)\n\t\t// this.data.line_end.x -= this.camera_data.position.x\n\t\t// this.data.line_end.y -= this.camera_data.position.y\n\t\t// this.move_current_position = this.ray_helper.intersect_plane_from_event(event, this.camera);\n\t\t// return this._update_position();\n\t}\n\n\tmove_end(event: PointerEvent) {\n\t\tthis.removeDocumentEvents(event);\n\t\t// if (!this.has_captured_node()) {\n\t\t// \treturn;\n\t\t// }\n\t\tconst targetElement = event.target as HTMLElement | undefined;\n\t\tif (targetElement) {\n\t\t\tconst nodeId = traverseElementAncestors(targetElement);\n\t\t\tconst outputIndex = targetElement.dataset['outputIndex'];\n\t\t\tconst inputIndex = targetElement.dataset['inputIndex'];\n\n\t\t\tif (nodeId) {\n\t\t\t\tif (outputIndex == null && inputIndex == null) {\n\t\t\t\t\tthis.capture_node_final(nodeId);\n\t\t\t\t} else {\n\t\t\t\t\tif (outputIndex != null) {\n\t\t\t\t\t\tthis.capture_node_src(nodeId, parseInt(outputIndex));\n\t\t\t\t\t}\n\t\t\t\t\tif (inputIndex != null) {\n\t\t\t\t\t\tthis.capture_node_dest(nodeId, parseInt(inputIndex));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// const intersect = this.ray_helper.intersected_mesh_with_callback(event, 'move_end', this.camera);\n\t\t\t// if (intersect) {\n\t\t\t// \tintersect.callbacks['move_end']();\n\t\t\t// }\n\n\t\t\t// const command = (() => {\n\t\t\t// \tif ((this.node_src != null) && (this.node_dest != null)) { // both input and output present\n\t\t\t// \treturn new History.Command.NodeConnect(this.node_src, this.node_dest, this.input_index);\n\t\t\t// } else if ((this.node_src == null) && (this.node_dest != null)) { // node_dest only\n\t\t\t// \treturn new History.Command.NodeConnect(this.node_src, this.node_dest, this.input_index);\n\t\t\t// }\n\t\t\t// })();\n\t\t\t// if (command != null) {\n\t\t\t// \tcommand.push(this.component);\n\t\t\t// }\n\n\t\t\tif (this.both_end_captured()) {\n\t\t\t\tthis.create_connection();\n\t\t\t} else {\n\t\t\t\tif (this.data.node_dest_ids.length != 0 && this.data.node_src_ids.length == 0) {\n\t\t\t\t\tthis.disconnect_dest();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.reset();\n\t\tthis.mode.value = null;\n\t}\n\n\tprivate async create_connection() {\n\t\tif (!this.data.node_src_ids.length || !this.data.node_dest_ids.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet inputIndex = this.data.input_index;\n\t\tlet outputIndex = this.data.output_index;\n\t\tlet cmds: NodeConnectCommand[] = [];\n\t\tfor (let srcId of this.data.node_src_ids) {\n\t\t\tconst nodeSrc = StoreController.scene.graph.nodeFromId(srcId) as BaseNodeType;\n\t\t\tfor (let destId of this.data.node_dest_ids) {\n\t\t\t\tconst nodeDest = StoreController.scene.graph.nodeFromId(destId) as BaseNodeType;\n\t\t\t\tconst parent = nodeDest.parent() || nodeSrc.parent();\n\t\t\t\tif (parent && nodeDest.io.inputs.inputGraphNode(inputIndex) != null) {\n\t\t\t\t\t// still check that the named input exists if it has namedInputs\n\t\t\t\t\tconst hasNamedInputs = nodeDest.io.inputs.hasNamedInputs();\n\t\t\t\t\tconst hasExpectedNamedInput =\n\t\t\t\t\t\t(nodeDest.io.inputs.namedInputConnectionPoints() || [])[inputIndex] != null;\n\t\t\t\t\tif (!hasNamedInputs || hasExpectedNamedInput) {\n\t\t\t\t\t\tif (isNodeConnectCommandRequired({nodeSrc, nodeDest, inputIndex, outputIndex})) {\n\t\t\t\t\t\t\tconst cmd = new NodeConnectCommand(parent, nodeSrc, nodeDest, inputIndex, outputIndex);\n\t\t\t\t\t\t\tcmds.push(cmd);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// outputIndex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tinputIndex++;\n\t\t}\n\t\tif (cmds.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmdMulti = new MultipleCommand(StoreController.engine.scene);\n\t\tfor (let cmd of cmds) {\n\t\t\tcmdMulti.pushCommand(cmd);\n\t\t}\n\t\tawait Editor.instance().pushCommand(cmdMulti);\n\t}\n\tasync disconnect_dest() {\n\t\tif (!this.data.node_dest_ids.length) {\n\t\t\treturn;\n\t\t}\n\t\tlet cmds: NodeConnectCommand[] = [];\n\n\t\tconst nodeSrc = null;\n\t\tconst inputIndex = this.data.input_index;\n\t\tconst outputIndex = undefined;\n\t\tfor (let destId of this.data.node_dest_ids) {\n\t\t\tconst nodeDest = StoreController.scene.graph.nodeFromId(destId) as BaseNodeType;\n\t\t\tconst parent = nodeDest.parent();\n\t\t\tif (!parent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isNodeConnectCommandRequired({nodeSrc, nodeDest, inputIndex, outputIndex})) {\n\t\t\t\tconst cmd = new NodeConnectCommand(parent, nodeSrc, nodeDest, inputIndex, outputIndex);\n\t\t\t\tcmds.push(cmd);\n\t\t\t}\n\t\t}\n\t\tif (cmds.length == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst cmdMulti = new MultipleCommand(StoreController.engine.scene);\n\t\tfor (let cmd of cmds) {\n\t\t\tcmdMulti.pushCommand(cmd);\n\t\t}\n\t\tawait Editor.instance().pushCommand(cmdMulti);\n\t}\n\n\tprivate reset() {\n\t\t// this.node_dest = null;\n\t\t// this.node_src = null;\n\t\t// this.input_index = null;\n\n\t\tthis.data.node_src_ids.splice(0, this.data.node_src_ids.length);\n\t\tthis.data.node_dest_ids.splice(0, this.data.node_dest_ids.length);\n\t\tthis.data.mouse_start.x = 0;\n\t\tthis.data.mouse_start.y = 0;\n\t\tthis.data.mouse_progress.x = 0;\n\t\tthis.data.mouse_progress.y = 0;\n\t\t// this.data.index = null;\n\t\tthis.data.active = false;\n\t}\n\n\tprivate has_captured_node(): boolean {\n\t\treturn this.data.node_dest_ids.length > 0 || this.data.node_src_ids.length > 0;\n\t}\n\tprivate both_end_captured(): boolean {\n\t\treturn this.data.node_dest_ids.length > 0 && this.data.node_src_ids.length > 0;\n\t}\n\n\tprivate _boundOnpointercancel = this._onpointercancel.bind(this);\n\tprivate _onpointercancel(e: PointerEvent) {\n\t\tconsole.log('cancel', e.target, (e.target as HTMLElement).style);\n\t}\n\n\t// private _hammerCallbacks: HammerCallbacks | undefined;\n\t// setHammerCallbacks(callbacks: HammerCallbacks) {\n\t// \tthis._hammerCallbacks = callbacks;\n\t// }\n\n\t// _start_position(): Vector3 {\n\t// \tconst pos = this.move_start_position || new Vector3(0,0,0);\n\t// \tpos.z = 0;\n\t// \treturn pos;\n\t// }\n\t// _end_position(): Vector3 {\n\t// \tconst pos = this.move_current_position || new Vector3(0,1,0);\n\t// \tpos.z = 0;\n\t// \treturn pos;\n\t// }\n\n\t// _create_line() {\n\t// \treturn this._mesh;\n\t// }\n\n\t// _update_position(){\n\t// \tthis._geometry.vertices[0] = this._start_position();\n\t// \tthis._geometry.vertices[1] = this._end_position();\n\t// \treturn this._geometry.verticesNeedUpdate = true;\n\t// }\n\n\t// src_position(): Vector2 {\n\t// \tif(this.node_src){\n\t// \t\tconst pos = this.node_src.ui_data().position().clone()\n\n\t// \t\tpos.y += 10+Constants.NODE_UNIT\n\t// \t\treturn pos\n\t// \t} else {\n\t// \t\treturn this.data.line_end\n\t// \t}\n\t// }\n\t// dest_position() {\n\t// \tif(this.node_dest){\n\t// \t\tconst pos = this.node_dest.ui_data().position().clone()\n\t// \t\tpos.y -= 10\n\t// \t\treturn pos\n\t// \t} else {\n\t// \t\treturn this.data.line_end\n\t// \t}\n\t// }\n}\n","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=style&index=0&id=426ccc10&lang=sass\"","import { render } from \"./NetworkCore.vue?vue&type=template&id=426ccc10&ts=true\"\nimport script from \"./NetworkCore.vue?vue&type=script&lang=ts\"\nexport * from \"./NetworkCore.vue?vue&type=script&lang=ts\"\n\nimport \"./NetworkCore.vue?vue&type=style&index=0&id=426ccc10&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Network.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Network.vue?vue&type=script&lang=ts\"","import { render } from \"./Network.vue?vue&type=template&id=35a5db46&ts=true\"\nimport script from \"./Network.vue?vue&type=script&lang=ts\"\nexport * from \"./Network.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, createBlock as _createBlock, normalizeClass as _normalizeClass, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"cell shrink viewer_top_bar relative\" }\nconst _hoisted_2 = { class: \"grid-x\" }\nconst _hoisted_3 = { class: \"cell shrink\" }\nconst _hoisted_4 = { class: \"rounded bg-bg-dark inline-flex gap-2 px-2 py-1 ml-2 lg:m-2\" }\nconst _hoisted_5 = { class: \"text-xs hidden lg:inline\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"cell shrink\"\n}\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"cell auto\" }, null, -1 /* HOISTED */)\nconst _hoisted_8 = { class: \"cell shrink\" }\nconst _hoisted_9 = [\"title\"]\nconst _hoisted_10 = [\"title\"]\nconst _hoisted_11 = {\n  key: 0,\n  class: \"text-xs mr-4 absolute left-0 top-full w-full block py-4 opacity-70 z-50 text-center pointer-events-none\"\n}\nconst _hoisted_12 = { class: \"mx-auto px-2 py-1 bg-bg-dark rounded-md\" }\nconst _hoisted_13 = { class: \"cell auto relative\" }\nconst _hoisted_14 = {\n  key: 0,\n  class: \"absolute inset-0\"\n}\nconst _hoisted_15 = { class: \"absolute top-20 left-0 p-2 h-full z-50 pointer-events-none\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_ChevronDownIcon = _resolveComponent(\"ChevronDownIcon\")!\n  const _component_DropDownMenu = _resolveComponent(\"DropDownMenu\")!\n  const _component_PlusIcon = _resolveComponent(\"PlusIcon\")!\n  const _component_CheckIcon = _resolveComponent(\"CheckIcon\")!\n  const _component_NoSymbolIcon = _resolveComponent(\"NoSymbolIcon\")!\n  const _component_FlagIcon = _resolveComponent(\"FlagIcon\")!\n  const _component_ClockIcon = _resolveComponent(\"ClockIcon\")!\n  const _component_CameraIcon = _resolveComponent(\"CameraIcon\")!\n  const _component_WrenchScrewdriverIcon = _resolveComponent(\"WrenchScrewdriverIcon\")!\n  const _component_ArrowsPointingOutIcon = _resolveComponent(\"ArrowsPointingOutIcon\")!\n  const _component_NetworkCore = _resolveComponent(\"NetworkCore\")!\n  const _component_ErrorComponent = _resolveComponent(\"ErrorComponent\")!\n  const _component_ViewerHints = _resolveComponent(\"ViewerHints\")!\n\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    _createCommentVNode(\" we need the relative class for the error container to display correctly \"),\n    _createElementVNode(\"div\", {\n      class: \"Panel Viewer full_height_container grid-y disable-select relative\",\n      onPointermove: _cache[8] || (_cache[8] = \n//@ts-ignore\n(...args) => (_ctx.on_pointer_move && _ctx.on_pointer_move(...args)))\n    }, [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createElementVNode(\"div\", _hoisted_2, [\n          _createElementVNode(\"div\", _hoisted_3, [\n            _createVNode(_component_DropDownMenu, {\n              label: _ctx.cameraMenuLabel,\n              entries: _ctx.cameraMenuEntries,\n              sort_entries: true,\n              label_padding: [0, 0],\n              onSelect: _ctx.on_select_camera_menu_entry_select,\n              onOn_label_mouseenter: _ctx.on_camera_menu_label_mousenter\n            }, {\n              default: _withCtx(() => [\n                _createElementVNode(\"div\", _hoisted_4, [\n                  _createElementVNode(\"span\", _hoisted_5, _toDisplayString(_ctx.cameraMenuLabel), 1 /* TEXT */),\n                  _createVNode(_component_ChevronDownIcon, { class: \"w-4 h-4\" })\n                ])\n              ]),\n              _: 1 /* STABLE */\n            }, 8 /* PROPS */, [\"label\", \"entries\", \"onSelect\", \"onOn_label_mouseenter\"])\n          ]),\n          (!_ctx.isTouchOrMobile)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n                _createCommentVNode(\" <div\\n\\t\\t\\t\\t\\t\\tv-if=\\\"isCurrentCameraDefault\\\"\\n\\t\\t\\t\\t\\t\\tclass=\\\"px-2 py-1 lg:my-2 text-xs select-none text-text-faded opacity-70\\\"\\n\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\tdefault camera\\n\\t\\t\\t\\t\\t</div> \"),\n                (!_ctx.isCurrentCameraDefault)\n                  ? (_openBlock(), _createElementBlock(\"div\", {\n                      key: 0,\n                      class: \"px-2 py-1 lg:my-2 bg-amber-800 hover:bg-amber-600 cursor-pointer text-xs rounded select-none\",\n                      onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.makeCurrentCameraDefault && _ctx.makeCurrentCameraDefault(...args)))\n                    }, \" make default \"))\n                  : _createCommentVNode(\"v-if\", true)\n              ]))\n            : _createCommentVNode(\"v-if\", true),\n          _hoisted_7,\n          _createElementVNode(\"div\", _hoisted_8, [\n            _createCommentVNode(\"\\n\\t\\t\\t\\t\\tI've added 'relative -top-px' so that this aligns horizontally better with the camera dropbox\\n\\t\\t\\t\\t\\tbut there surely is a better way\\n\\t\\t\\t\\t\"),\n            _createElementVNode(\"div\", {\n              class: _normalizeClass([\n\t\t\t\t\t\t\t'rounded inline-flex gap-2 px-2 py-1',\n\t\t\t\t\t\t\t_ctx.isTouchOrMobile ? 'ml-2 mt-px relative -top-px' : 'm-2',\n\t\t\t\t\t\t\t_ctx.viewerActive ? 'bg-bg-dark' : 'bg-red-900',\n\t\t\t\t\t\t])\n            }, [\n              (!_ctx.viewerActive)\n                ? (_openBlock(), _createElementBlock(\"span\", {\n                    key: 0,\n                    class: \"viewer-control-button\",\n                    style: _normalizeStyle(_ctx.renderSingleFrameStyleObject),\n                    onClick: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.renderSingleFrame && _ctx.renderSingleFrame(...args))),\n                    title: \"render single frame\"\n                  }, [\n                    _createVNode(_component_PlusIcon, { class: \"w-4 h-4\" })\n                  ], 4 /* STYLE */))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"span\", {\n                class: \"viewer-control-button\",\n                onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.toggleViewerActive && _ctx.toggleViewerActive(...args))),\n                title: _ctx.toggleViewerActiveButtonTitle\n              }, [\n                _createElementVNode(\"span\", null, [\n                  (_ctx.viewerActive)\n                    ? (_openBlock(), _createBlock(_component_CheckIcon, {\n                        key: 0,\n                        class: \"w-4 h-4\"\n                      }))\n                    : (_openBlock(), _createBlock(_component_NoSymbolIcon, {\n                        key: 1,\n                        class: \"text-red-500 w-4 h-4\"\n                      }))\n                ])\n              ], 8 /* PROPS */, _hoisted_9),\n              _createElementVNode(\"span\", {\n                class: \"viewer-control-button\",\n                onClick: _cache[3] || (_cache[3] = \n//@ts-ignore\n(...args) => (_ctx.showViewerCapabilities && _ctx.showViewerCapabilities(...args))),\n                title: \"Show WebGL Capabilities On This Device\"\n              }, [\n                _createVNode(_component_FlagIcon, { class: \"w-4 h-4\" })\n              ]),\n              (_ctx.scene_update_allowed)\n                ? (_openBlock(), _createElementBlock(\"span\", {\n                    key: 1,\n                    class: _normalizeClass(['viewer-control-button', _ctx.statsActive ? 'active text-green-500' : '']),\n                    onClick: _cache[4] || (_cache[4] = \n//@ts-ignore\n(...args) => (_ctx.toggleStatsActive && _ctx.toggleStatsActive(...args))),\n                    title: \"Display Performance Stats\"\n                  }, [\n                    _createVNode(_component_ClockIcon, { class: \"w-4 h-4\" })\n                  ], 2 /* CLASS */))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.captureButtonDisplayed)\n                ? (_openBlock(), _createElementBlock(\"span\", {\n                    key: 2,\n                    id: \"viewer-open-capture-form\",\n                    class: \"viewer-control-button\",\n                    onClick: _cache[5] || (_cache[5] = \n//@ts-ignore\n(...args) => (_ctx.request_capture_animation_duration && _ctx.request_capture_animation_duration(...args))),\n                    title: \"Capture Image & Video\"\n                  }, [\n                    _createVNode(_component_CameraIcon, { class: \"w-4 h-4\" })\n                  ]))\n                : _createCommentVNode(\"v-if\", true),\n              _createCommentVNode(\" <span\\n\\t\\t\\t\\t\\t\\t\\tid=\\\"viewer-open-html-editor-panel\\\"\\n\\t\\t\\t\\t\\t\\t\\tclass=\\\"viewer-control-button\\\"\\n\\t\\t\\t\\t\\t\\t\\t:class=\\\"['viewer-control-button', htmlActive ? 'active text-blue-500' : '']\\\"\\n\\t\\t\\t\\t\\t\\t\\t@click=\\\"openViewerHTMLEditor\\\"\\n\\t\\t\\t\\t\\t\\t\\ttitle=\\\"Edit Viewer HTML (ie: to test animations on scroll)\\\"\\n\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t<CodeBracketIcon class=\\\"w-4 h-4\\\"></CodeBracketIcon>\\n\\t\\t\\t\\t\\t\\t</span> \"),\n              _createElementVNode(\"span\", {\n                class: _normalizeClass([\n\t\t\t\t\t\t\t\t'viewer-control-button',\n\t\t\t\t\t\t\t\t_ctx.overlayNetworkAllowed\n\t\t\t\t\t\t\t\t\t? _ctx.overlayNetworkDisplayed\n\t\t\t\t\t\t\t\t\t\t? 'text-green-500'\n\t\t\t\t\t\t\t\t\t\t: 'text-blue-500'\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t]),\n                onClick: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.toggledAllowOverlayNetwork && _ctx.toggledAllowOverlayNetwork(...args))),\n                title: _ctx.toggleAllowOverlayNetworkButtonTitle\n              }, [\n                _createVNode(_component_WrenchScrewdriverIcon, { class: \"w-4 h-4\" })\n              ], 10 /* CLASS, PROPS */, _hoisted_10),\n              _createElementVNode(\"span\", {\n                class: \"viewer-control-button\",\n                onClick: _cache[7] || (_cache[7] = \n//@ts-ignore\n(...args) => (_ctx.toggle_fullscreen && _ctx.toggle_fullscreen(...args))),\n                title: \"Toggle FullScreen\"\n              }, [\n                _createVNode(_component_ArrowsPointingOutIcon, { class: \"w-4 h-4\" })\n              ])\n            ], 2 /* CLASS */),\n            _createCommentVNode(\" \\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t \")\n          ])\n        ]),\n        (_ctx.displayViewerResolutionLabel)\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_11, [\n              _createElementVNode(\"span\", _hoisted_12, _toDisplayString(_ctx.viewerResolutionLabel), 1 /* TEXT */)\n            ]))\n          : _createCommentVNode(\"v-if\", true)\n      ]),\n      _createElementVNode(\"div\", _hoisted_13, [\n        _createElementVNode(\"div\", {\n          class: \"h-full viewers_container\",\n          ref: \"viewer_container\",\n          style: _normalizeStyle(_ctx.viewerContainerStyleObject)\n        }, null, 4 /* STYLE */),\n        _createCommentVNode(\" <div\\n\\t\\t\\t\\tv-if=\\\"useViewerDataApi\\\"\\n\\t\\t\\t\\t:key=\\\"viewerApiContainerKey\\\"\\n\\t\\t\\t\\tclass=\\\"h-full no-overflow viewers_container\\\"\\n\\t\\t\\t\\tref=\\\"viewer_container_api\\\"\\n\\t\\t\\t></div>\\n\\t\\t\\t<div\\n\\t\\t\\t\\tv-else\\n\\t\\t\\t\\tclass=\\\"h-full viewers_container\\\"\\n\\t\\t\\t\\tref=\\\"viewer_container\\\"\\n\\t\\t\\t\\t:style=\\\"viewerContainerStyleObject\\\"\\n\\t\\t\\t></div> \"),\n        (_ctx.overlayNetworkAllowed)\n          ? _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n              _createVNode(_component_NetworkCore, {\n                ref: \"networkCore\",\n                panelId: _ctx.overlayedNetworkPanelId,\n                init_layout_data: _ctx.overlayedNetworkInitLayoutData,\n                transparent: true,\n                paramsAlwaysDisplayed: true,\n                onHide: _ctx.hideOverlayedNetwork\n              }, null, 8 /* PROPS */, [\"panelId\", \"init_layout_data\", \"onHide\"])\n            ], 512 /* NEED_PATCH */)), [\n              [_vShow, _ctx.overlayNetworkDisplayed]\n            ])\n          : _createCommentVNode(\"v-if\", true)\n      ]),\n      _createElementVNode(\"div\", _hoisted_15, [\n        (_ctx.errorMessage)\n          ? (_openBlock(), _createBlock(_component_ErrorComponent, {\n              key: 0,\n              title: \"Error\",\n              message: _ctx.errorMessage\n            }, null, 8 /* PROPS */, [\"message\"]))\n          : _createCommentVNode(\"v-if\", true)\n      ]),\n      _createVNode(_component_ViewerHints, {\n        class: \"hidden lg:block\",\n        lines: _ctx.viewerHints\n      }, null, 8 /* PROPS */, [\"lines\"])\n    ], 32 /* HYDRATE_EVENTS */)\n  ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=template&id=2578fa84&ts=true\"","// links:\n// https://webrtc.github.io/samples/src/content/capture/canvas-record/\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream\nimport {CoreFileUtils} from '../FileUtils';\nimport {PolyScene} from '../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {AbstractRenderer} from '../../../../@polygonjs/polygonjs/src/engine/viewers/Common';\n// import {FeaturesController} from './FeaturesController';\n\nconst TYPES = [\n\t// 'image/png',\n\t// do not yet save in mp4, as this woudl conflict\n\t// with the format and extensions expected in the polygonjs-editor server\n\t// 'video/mp4',\n\t'video/webm',\n\t'video/webm,codecs=vp9',\n\t// 'video/vp8',\n\t'video/webm;codecs=vp8',\n\t'video/webm;codecs=daala',\n\t'video/webm;codecs=h264',\n\t// 'video/mpeg',\n];\n\nexport interface HTMLCanvasElementWithStream extends HTMLCanvasElement {\n\tcaptureStream: () => MediaStream;\n}\n\ntype StopCallback = () => void;\n\nexport const MEGABIT = 1_000_000;\n// const MEGABITS_SEC = FeaturesController.viewerCaptureVideoMbsPerSecond() || 20;\n\nexport interface CanvasToWebMOptions<R extends AbstractRenderer> {\n\tscene: PolyScene;\n\tcanvas: HTMLCanvasElementWithStream;\n\tvideoBitsPerSecond: number;\n\t// renderer: R;\n}\n\nexport interface CaptureAnimationOptions {\n\tduration: number;\n\tplayScene: boolean;\n}\nexport type OnCompleted = () => Promise<void> | void;\n\nexport interface CanvasToWebmStartOptions {\n\tplayScene: boolean;\n\tduration: number;\n\tscene: PolyScene;\n\tonCompleted: OnCompleted;\n}\n\nexport class BaseCanvasToWebm<R extends AbstractRenderer> {\n\tprotected mediaRecorder: MediaRecorder | undefined;\n\tprotected supportedType: string | undefined;\n\t// private videoBitsPerSecond: number = MEGABITS_SEC * 1_000_000; //2500000 // 2.5Mbps\n\n\tprotected recordedBlobs: Blob[] = [];\n\tprotected _blob: Blob | undefined;\n\tprotected _stop_callback: StopCallback | undefined;\n\t// private video: HTMLVideoElement\n\n\tconstructor(protected _options: CanvasToWebMOptions<R>) {\n\t\tthis.find_supported_type();\n\n\t\t// this.video = document.createElement('video') as HTMLVideoElement\n\t}\n\tstart(options: CanvasToWebmStartOptions) {}\n\tprotected stop(callback: () => void) {\n\t\tthis._stop_callback = callback;\n\t\ttry {\n\t\t\tthis.mediaRecorder?.stop();\n\t\t} catch (e) {\n\t\t\tconsole.warn('could not stop mediaRecorder. Maybe it was already stopped?');\n\t\t}\n\t}\n\tfile() {\n\t\tconst filename = `${this._options.scene.name()}.webm`;\n\t\tif (this._blob) {\n\t\t\treturn CoreFileUtils.blobToFile(this._blob, filename, {addExtFromBlobType: false});\n\t\t}\n\t}\n\n\tprotected onstop() {\n\t\tthis._blob = new Blob(this.recordedBlobs, {type: 'video/webm'});\n\t\tif (this._stop_callback) {\n\t\t\tthis._stop_callback();\n\t\t}\n\t}\n\tprotected addEventBlob(event: BlobEvent) {\n\t\tif (event.data && event.data.size > 0) {\n\t\t\tthis.recordedBlobs.push(event.data);\n\t\t}\n\t}\n\n\tprivate find_supported_type() {\n\t\tfor (let i in TYPES) {\n\t\t\tif (MediaRecorder.isTypeSupported(TYPES[i])) {\n\t\t\t\tthis.supportedType = TYPES[i];\n\t\t\t\t// console.log('this.supported_type', this.supported_type);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tprotected options() {\n\t\tif (this.supportedType == null) {\n\t\t\tconsole.warn('No supported type found for MediaRecorder');\n\t\t}\n\t\treturn {\n\t\t\tmimeType: this.supportedType,\n\t\t\tvideoBitsPerSecond: this._options.videoBitsPerSecond * MEGABIT,\n\t\t};\n\t}\n}\n","import {BaseCanvasToWebm, CanvasToWebmStartOptions} from './_BaseCanvasToWebm';\nimport {WebGLRenderer} from 'three';\nexport class CanvasToWebm extends BaseCanvasToWebm<WebGLRenderer> {\n\toverride start(options: CanvasToWebmStartOptions) {\n\t\tconst {playScene, duration, scene, onCompleted} = options;\n\t\tscene.play();\n\t\tsetTimeout(() => {\n\t\t\tthis.record();\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.stop(async () => {\n\t\t\t\t\tawait onCompleted();\n\t\t\t\t});\n\t\t\t\tif (playScene) {\n\t\t\t\t\t// pause scene if the capture required it to be playing\n\t\t\t\t\tscene.pause();\n\t\t\t\t}\n\t\t\t}, duration * 1000);\n\t\t}, 500);\n\t}\n\n\trecord() {\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream\n\t\tconst stream = this._options.canvas.captureStream(); // frames per second\n\t\tconst options = this.options();\n\t\ttry {\n\t\t\tconsole.log(`starting capture at ${options.videoBitsPerSecond} bits/sec`);\n\t\t\t// var options = {\n\t\t\t// \taudioBitsPerSecond: 128000,\n\t\t\t// \tvideoBitsPerSecond: 2500000,\n\t\t\t// \tmimeType: 'video/mp4',\n\t\t\t// };\n\t\t\tthis.mediaRecorder = new MediaRecorder(stream, options);\n\n\t\t\t// console.log('mime:', this.media_recorder.mimeType);\n\t\t} catch (e) {\n\t\t\tconsole.log('Unable to create MediaRecorder with options Object: ', options);\n\t\t}\n\t\tif (this.mediaRecorder) {\n\t\t\tthis.mediaRecorder.onstop = this.onstop.bind(this);\n\t\t\tthis.mediaRecorder.ondataavailable = this.addEventBlob.bind(this);\n\t\t\tthis.mediaRecorder.start(100); // collect 100ms of data\n\t\t}\n\t}\n}\n","import {BaseCanvasToWebm, CanvasToWebmStartOptions, CanvasToWebMOptions} from './_BaseCanvasToWebm';\nimport {PathTracingRendererContainer} from '../../../../@polygonjs/polygonjs/src/engine/nodes/rop/utils/pathTracing/PathTracingRendererContainer';\nimport {PathTracingViewer} from '../../../../@polygonjs/polygonjs/src/engine/viewers/PathTracingViewer';\nimport {\n\tupdateStatusBarWithProgress,\n\tupdateStatusBarWithTotalTime,\n\tcompletedOrInterrupted,\n\t// zipFrames,\n\t// RecordedFrame,\n\t// FPS,\n\t// fileNamePaddedFrame,\n} from './CanvasToWebmCommon';\nimport {CoreFileUtils} from '../FileUtils';\nimport {StoreController} from '../../store/controllers/StoreController';\nimport {Editor} from '../../Editor';\nimport {EditorEvent} from '../../types';\nimport {pathTracingRendererFileName, PATH_TRACING_RENDER_EXTENSION} from '../render/PBRUtils';\n// technique 1\n// canvas-capture cannot be used as\n// it overrides setTimeout globally,\n// and we need to use it to have CoreSleep\n// in the render loop\n// import CanvasCapture from 'canvas-capture';\n\n// work around: save setTimeout\n\n// technique 2\n// using mediastream doesn't work as this is not real time\n\n// technique 3\n// using whammy doesn't work as I can't find a way to reliably capture\n// canvas frames with toDataURL\n// import './utils/whammy.js';\n\n// technique 4\n// using 'ts-whammy';\n// since whammy is old and webm format has since changed\n// import tsWhammy from 'ts-whammy';\n// too unstable\n\n// technique 5\n// save images as zip and compress client or server side with ffmpeg?\n\ninterface CanvasToWebmPBROptions extends CanvasToWebMOptions<PathTracingRendererContainer> {\n\tviewer: PathTracingViewer<any>;\n}\ninterface CanvasToWebmPBRStartOptions extends CanvasToWebmStartOptions {\n\t// onFrameCompleted:(fileName:string)=>void\n\trenderer: PathTracingRendererContainer;\n}\n\nexport class CanvasToWebmPBR extends BaseCanvasToWebm<PathTracingRendererContainer> {\n\tconstructor(protected override _options: CanvasToWebmPBROptions) {\n\t\tsuper(_options);\n\n\t\t// this.video = document.createElement('video') as HTMLVideoElement\n\t}\n\toverride start(options: CanvasToWebmPBRStartOptions) {\n\t\tconst {scene, onCompleted} = options;\n\t\tconst renderer = options.renderer;\n\t\tconst viewer = this._options.viewer;\n\t\t// const canvas = this._options.canvas;\n\n\t\t// let lastBlob: Blob | undefined;\n\t\t// const frames: RecordedFrame[] = [];\n\t\tconst startTime = performance.now();\n\t\tconst startFrame = renderer.frameRange.x;\n\t\tconst endFrame = renderer.frameRange.y;\n\t\t// const fileNamePrefix = renderer.sequenceFrameFileName;\n\t\tconst node = renderer.node;\n\t\t// const fileNameParam = node.p.fileName;\n\t\t// const framePaddingParam = node.p.framePadding;\n\n\t\tscene.setFrame(startFrame);\n\n\t\tconst requestedFramesCount = endFrame - startFrame + 1;\n\t\tlet recordedFrames = 0;\n\n\t\t// console.log({requestedFramesCount});\n\t\tconst previousRealtimeState = scene.timeController.realtimeState();\n\t\tscene.timeController.setRealtimeState(false);\n\n\t\tconst _maxSamplesCount: number = renderer.maxSamplesCount;\n\n\t\t// scene.play();\n\n\t\t// save globals before initializing CanvasCapture;\n\t\t// const _setTimeout = setTimeout;\n\t\t// const _requestAnimationFrame = requestAnimationFrame;\n\t\t// function sleepCallback(duration: number): Promise<void> {\n\t\t// \treturn new Promise((resolve, reject) => {\n\t\t// \t\t_setTimeout(() => {\n\t\t// \t\t\tresolve();\n\t\t// \t\t}, duration);\n\t\t// \t});\n\t\t// }\n\n\t\t// const onSampleCompleted = () => {\n\t\t// \tviewer.updateDebugDisplay();\n\t\t// };\n\t\tconst onFrameCompleted = async () => {\n\t\t\t// const frame = renderer.domElement.toDataURL('image/png');\n\t\t\t// console.log('B');\n\t\t\t// const blob = await CoreFileUtils.dataUriToBlob(frame);\n\n\t\t\t// const paddedFrame: string = fileNamePaddedFrame(scene.frame());\n\t\t\t// if (fileNameParam.isDirty()) {\n\t\t\t// \tawait fileNameParam.compute();\n\t\t\t// }\n\t\t\t// if (framePaddingParam.isDirty()) {\n\t\t\t// \tawait framePaddingParam.compute();\n\t\t\t// }\n\t\t\t// const fileNamePrefix = fileNameParam.value; //`${fileNamePrefix}.${paddedFrame}.png`;\n\t\t\t// const framePadding = framePaddingParam.value; //`${fileNamePrefix}.${paddedFrame}.png`;\n\t\t\t// const elements = fileName.split('.');\n\t\t\t// const extension = 'png'; //elements[elements.length - 1];\n\t\t\t// const paddedFrame= `${scene.frame()}`.padStart(framePadding, '0');\n\t\t\tconst fileName = await pathTracingRendererFileName({node, frame: scene.frame()});\n\n\t\t\tconst mimeType = `image/${PATH_TRACING_RENDER_EXTENSION}`;\n\n\t\t\tasync function _getBlob(): Promise<Blob | null> {\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\trenderer.domElement.toBlob((blob) => {\n\t\t\t\t\t\tresolve(blob);\n\t\t\t\t\t}, mimeType);\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst blob = await _getBlob();\n\t\t\tif (!blob) {\n\t\t\t\tconsole.log('no blob');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// CoreFileUtils.downloadBlob(blob, `videocapture_${paddedFrame}.png`);\n\t\t\tconst sceneName = StoreController.scene.name();\n\t\t\tif (!sceneName) {\n\t\t\t\tconsole.warn('scene not saved, cannot save frame');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst file = CoreFileUtils.blobToFile(blob, fileName, {\n\t\t\t\taddExtFromBlobType: false,\n\t\t\t});\n\t\t\t// await NpmModuleApiController.captures.saveAnimationFrame(sceneName, file, fileName);\n\t\t\t//Editor.instance().save_scene();\n\t\t\tconst callback = Editor.instance().callback(EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_SAVE);\n\t\t\tif (callback) {\n\t\t\t\tawait callback({file, rendererNodePath: node.path(), fileName});\n\t\t\t} else {\n\t\t\t\tconsole.warn('no callback', EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_SAVE);\n\t\t\t}\n\n\t\t\trenderer.reset();\n\n\t\t\t// frames.push({sceneFrame: scene.frame(), blob});\n\t\t\t// const image = new Image();\n\t\t\t// document.body.append(image);\n\t\t\t// image.onload = () => {\n\t\t\t// \tconsole.log([image.width, image.height]);\n\t\t\t// };\n\t\t\t// image.src = frame;\n\t\t\t// encoder.add();\n\n\t\t\t// console.log('record frame', recordedFrames);\n\t\t\t// if (lastBlob) {\n\t\t\t// \tthis.recordedBlobs.push(lastBlob);\n\t\t\t// }\n\t\t\t// const capturedFramed = canvas.toDataURL('image/webp', 1);\n\t\t\t// console.log(capturedFramed);\n\t\t\t// frames.push(capturedFramed);\n\t\t\t// console.log('frame completed', recordedFrames, recordedFrames / requestedFramesCount, this.recordedBlobs);\n\t\t\t// await sleepCallback(100);\n\t\t\t// CanvasCapture.takeJPEGSnapshot({\n\t\t\t// \tonExport: (blob) => {\n\t\t\t// \t\tconsole.log(blob);\n\t\t\t// \t\tconst image = new Image();\n\t\t\t// \t\tdocument.body.append(image);\n\t\t\t// \t\timage.onload = () => {\n\t\t\t// \t\t\tconsole.log([image.width, image.height]);\n\t\t\t// \t\t};\n\t\t\t// \t\timage.src = URL.createObjectURL(blob);\n\t\t\t// \t},\n\t\t\t// \tonError: (err) => {\n\t\t\t// \t\tconsole.log(err);\n\t\t\t// \t},\n\t\t\t// });\n\t\t\t// CanvasCapture.recordFrame();\n\t\t\t// await sleepCallback(1000);\n\t\t\t// const elapsedTime = performance.now() - startTime;\n\n\t\t\trecordedFrames++;\n\t\t\t// const renderedRatio = recordedFrames / requestedFramesCount;\n\t\t\t// const percent = Math.ceil(100 * renderedRatio);\n\t\t\t// // const remainingRatio = 1-renderedRatio\n\t\t\t// const expectedTotalTime = elapsedTime / renderedRatio;\n\t\t\t// const remainingTime = expectedTotalTime - elapsedTime;\n\t\t\t// const remainingTimecode = DateUtils.secondsToTimeCode(remainingTime);\n\t\t\t// // console.log({renderedRatio, startTime, elapsedTime, expectedTotalTime, remainingTime, remainingTimecode});\n\t\t\t// StoreController.editor.status.setLoading(\n\t\t\t// \t`capturing video (frame: ${recordedFrames}/${requestedFramesCount}, progress: ${percent}%, remaining: ${remainingTimecode})`\n\t\t\t// );\n\t\t\tupdateStatusBarWithProgress(startTime, recordedFrames, requestedFramesCount);\n\n\t\t\tif (completedOrInterrupted(recordedFrames, requestedFramesCount)) {\n\t\t\t\t// if (playScene) {\n\t\t\t\t// \tscene.pause();\n\t\t\t\t// }\n\t\t\t\t// console.log(frames);\n\t\t\t\t// for (let frame of frames) {\n\t\t\t\t// \tconst image = new Image();\n\t\t\t\t// \tdocument.body.append(image);\n\t\t\t\t// \timage.onload = () => {\n\t\t\t\t// \t\tconsole.log([image.width, image.height]);\n\t\t\t\t// \t};\n\t\t\t\t// \timage.src = frame;\n\t\t\t\t// }\n\n\t\t\t\t// this._blob = ((window as any).Whammy as any).fromImageArray(frames, 1000 / 60);\n\t\t\t\t// onCompleted(options);\n\t\t\t\t// url = window.URL.createObjectURL(webmBlob);\n\t\t\t\trenderer.maxSamplesCount = _maxSamplesCount;\n\t\t\t\tviewer.setRecordingState({isRecording: false});\n\t\t\t\tupdateStatusBarWithTotalTime(startTime);\n\n\t\t\t\t// this.stop(async () => {\n\t\t\t\t// \tawait onCompleted(options);\n\t\t\t\t// \trenderer.setRecordingState({isRecording: false});\n\t\t\t\t// });\n\t\t\t\t// pause scene if the capture required it to be playing\n\t\t\t\tscene.timeController.setRealtimeState(previousRealtimeState);\n\t\t\t\tscene.setFrame(startFrame);\n\t\t\t\t// scene.pause();\n\t\t\t\t// CanvasCapture.stopRecord();\n\n\t\t\t\t// zipFrames(frames);\n\t\t\t\tawait onCompleted();\n\n\t\t\t\t// const blob = tsWhammy.fromImageArray(frames, FPS);\n\t\t\t\t// if (blob && blob instanceof Blob) {\n\t\t\t\t// \tthis._blob = blob;\n\t\t\t\t// \t// console.log(this._blob);\n\t\t\t\t// }\n\t\t\t\t// console.log(this._blob);\n\t\t\t\t// await onCompleted(options);\n\t\t\t} else {\n\t\t\t\tscene.setFrame(scene.frame() + 1);\n\t\t\t\t// in most animated scene, the renderer will detect a scene change\n\t\t\t\t// and re-generate.\n\t\t\t\t// But when capturing a static scene, nothing will happen,\n\t\t\t\t// so we force the re-generate here. Even though it will trigger 2 generate\n\t\t\t\t// on animated scenes\n\t\t\t\trenderer.generate(scene.threejsScene());\n\t\t\t}\n\t\t};\n\n\t\t// const startMediaRecorder = () => {\n\t\t// \t// https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream\n\t\t// \tconst stream = this._options.canvas.captureStream(); // frames per second\n\t\t// \tconst options = this.options();\n\t\t// \ttry {\n\t\t// \t\tconsole.log(`starting capture at ${options.videoBitsPerSecond} bits/sec`);\n\t\t// \t\t// var options = {\n\t\t// \t\t// \taudioBitsPerSecond: 128000,\n\t\t// \t\t// \tvideoBitsPerSecond: 2500000,\n\t\t// \t\t// \tmimeType: 'video/mp4',\n\t\t// \t\t// };\n\t\t// \t\tthis.mediaRecorder = new MediaRecorder(stream, options);\n\n\t\t// \t\t// console.log('mime:', this.media_recorder.mimeType);\n\t\t// \t} catch (e) {\n\t\t// \t\tconsole.log('Unable to create MediaRecorder with options Object: ', options);\n\t\t// \t}\n\t\t// \tif (this.mediaRecorder) {\n\t\t// \t\tthis.mediaRecorder.onstop = this.onstop.bind(this);\n\t\t// \t\tthis.mediaRecorder.ondataavailable = (event: BlobEvent) => {\n\t\t// \t\t\tif (event.data && event.data.size > 0) {\n\t\t// \t\t\t\tlastBlob = event.data;\n\t\t// \t\t\t\tthis.recordedBlobs.push(event.data);\n\t\t// \t\t\t}\n\t\t// \t\t};\n\t\t// \t\t// this.addEventBlob.bind(this);\n\t\t// \t\tthis.mediaRecorder.start(100); // collect 100ms of data\n\t\t// \t}\n\t\t// };\n\n\t\t// setTimeout(() => {\n\t\t// startTime = performance.now();\n\n\t\trenderer.maxSamplesCount = renderer.samplesPerAnimationFrame;\n\t\tviewer.setRecordingState({\n\t\t\tisRecording: true,\n\t\t\tonFrameCompleted,\n\t\t\trecordingSamplesPerFrame: renderer.samplesPerAnimationFrame,\n\t\t});\n\t\t// console.log('init');\n\t\t// renderer.setRecordingState({\n\t\t// \tisRecording: true,\n\t\t// \t// onSampleCompleted,\n\t\t// \tonFrameCompleted,\n\t\t// \tsleepCallback,\n\t\t// \tsetTimeout: _setTimeout,\n\t\t// \trequestAnimationFrame: _requestAnimationFrame,\n\t\t// });\n\t\t// startMediaRecorder();\n\t\t// console.log(this._options.canvas);\n\n\t\t// var encoder = new Whammy.Video(15);\n\t\t// CanvasCapture.init(this._options.canvas, {\n\t\t// \t// verbose: true,\n\t\t// });\n\t\t// if (1) {\n\t\t// \tCanvasCapture.beginVideoRecord({\n\t\t// \t\tformat: CanvasCapture.WEBM,\n\t\t// \t\tfps: FPS,\n\t\t// \t\tonExport: async (blob) => {\n\t\t// \t\t\tthis.recordedBlobs.push(blob);\n\t\t// \t\t\tthis.onstop();\n\t\t// \t\t\tconsole.log('blob', blob, this.file());\n\t\t// \t\t\tonCompleted(options);\n\t\t// \t\t},\n\t\t// \t\tonError: (err) => {\n\t\t// \t\t\tconsole.warn('recording error');\n\t\t// \t\t\tconsole.log(err);\n\t\t// \t\t\tStoreController.editor.status.setError(err);\n\t\t// \t\t\tonCompleted(options);\n\t\t// \t\t},\n\t\t// \t});\n\t\t// }\n\t\t// }, 100);\n\t}\n}\n","import {BaseCanvasToWebm} from '../../../../core/capture/_BaseCanvasToWebm';\nimport {CanvasToWebm} from '../../../../core/capture/CanvasToWebm';\nimport {CanvasToWebmPBR} from '../../../../core/capture/CanvasToWebmPBR';\nimport {StoreController} from '../../../../../editor/store/controllers/StoreController';\nimport {Editor} from '../../../../Editor';\nimport {EditorEvent, EditorType} from '../../../../types';\nimport {WindowController} from '../../../../core/WindowController';\nimport {CanvasToDownload} from '../../../../core/CanvasToDownload';\nimport {Ref, ref, onMounted, computed} from 'vue';\nimport {CoreFileUtils} from '../../../../core/FileUtils';\nimport {FilesRegister} from '../../../../self_contained/FilesRegister';\nimport {BaseViewerType} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/_Base';\nimport {CaptureType} from '../../../../core/CaptureType';\nimport {AppConfig} from '../../../../../config/AppConfig';\nimport {AppSceneLoader} from '../../../../../config/AppSceneLoader';\nimport {WebGLRenderer} from 'three';\nimport {PathTracingRendererContainer} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/rop/utils/pathTracing/PathTracingRendererContainer';\nimport {AbstractRenderer} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/Common';\nimport {PathTracingViewer} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/PathTracingViewer';\nimport {ThreejsViewer} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/Threejs';\nimport {MapboxViewer} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/Mapbox';\n\nexport interface BaseViewerContainerObject {\n\tviewer: BaseViewerType | null;\n}\ninterface BaseCaptureOptions {\n\tshowPopup: boolean;\n}\ninterface CaptureStaticOptions extends BaseCaptureOptions {}\ninterface CaptureAnimationOptions extends BaseCaptureOptions {\n\tduration: number;\n\tplayScene: boolean;\n}\ninterface SetupCaptureOptions {\n\tscene_update_allowed: Ref<boolean>;\n\tviewerContainerObject: BaseViewerContainerObject;\n}\nconst MS_PER_SECONDS = 1000;\n\nexport function SetupCapture(options: SetupCaptureOptions) {\n\tconst {scene_update_allowed, viewerContainerObject} = options;\n\tconst capture = ref({active: false, animation: false, seconds_count: 3});\n\n\tconst captureButtonDisplayed = computed(() => {\n\t\treturn scene_update_allowed.value || Editor.instance().type() == EditorType.WEB;\n\t});\n\n\t// const capture_menu_entries = computed(() => {\n\t// \treturn [{id: CaptureEntry.STATIC}, {id: CaptureEntry.ANIMATION}];\n\t// });\n\tonMounted(_captureIfRequired);\n\tasync function _captureIfRequired() {\n\t\tif (!AppSceneLoader.scenePersisted()) {\n\t\t\treturn;\n\t\t}\n\t\tconst scene = StoreController.scene;\n\t\tconst sceneName = scene.name();\n\t\tif (!sceneName) {\n\t\t\treturn;\n\t\t}\n\t\tconst captureStatus = await AppConfig.requestCaptureStatus(sceneName);\n\t\tif (!captureStatus) {\n\t\t\treturn;\n\t\t}\n\t\t// do not capture if video missing, as a user may not want a video to clutter the repo\n\t\tif (captureStatus.staticThumbnailExists /*&& captureStatus.animationExists*/) {\n\t\t\treturn;\n\t\t}\n\t\tlet seconds = 3;\n\t\tconsole.log(`image thumbnail missing, scheduling capture in ${seconds} seconds.`, captureStatus);\n\t\tasync function _startCapture() {\n\t\t\tif (!captureStatus) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!captureStatus.staticThumbnailExists) {\n\t\t\t\tawait captureStaticImage({showPopup: false});\n\t\t\t}\n\t\t\t// if (!captureStatus.animationExists) {\n\t\t\t// \tawait captureAnimation({showPopup: false, duration: 1, playScene: false});\n\t\t\t// }\n\t\t}\n\t\tconst intervalId = setInterval(() => {\n\t\t\tseconds -= 1;\n\t\t\tconsole.log(seconds == 0 ? 'capture starting...' : seconds);\n\t\t\tif (seconds <= 0) {\n\t\t\t\tclearInterval(intervalId);\n\t\t\t\t_startCapture();\n\t\t\t}\n\t\t}, MS_PER_SECONDS);\n\n\t\t// setTimeout(_startCapture, seconds * MS_PER_SECONDS);\n\t}\n\n\tfunction reset() {\n\t\tcapture.value.active = false;\n\t\tcapture.value.animation = false;\n\t}\n\n\tasync function request_capture_animation_duration() {\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\treturn;\n\t\t}\n\t\tconst rendererConfig = viewerContainerObject.viewer?.rendererConfig();\n\t\tconst rendererNodeId = rendererConfig?.rendererNode?.graphNodeId() || null;\n\n\t\tconst data = await StoreController.editor.captureForm.display({rendererNodeId});\n\t\tswitch (data.captureType) {\n\t\t\tcase CaptureType.IMAGE: {\n\t\t\t\tawait captureStaticImage({showPopup: true});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CaptureType.VIDEO: {\n\t\t\t\tcaptureAnimation({duration: data.videoDuration, playScene: true, showPopup: true});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// async function captureStaticImageAndAnimation(options: CaptureAnimationOptions) {\n\t// \tawait captureStaticImage(options);\n\t// \tawait captureAnimation(options);\n\t// }\n\n\tfunction _canvasData() {\n\t\tif (!viewerContainerObject.viewer) {\n\t\t\tconsole.warn('no viewer available');\n\t\t\treturn;\n\t\t}\n\t\tconst canvas = viewerContainerObject.viewer.canvas(); //viewer_container.value.querySelector('canvas');\n\t\tif (!canvas) {\n\t\t\tconsole.warn('no canvas to capture');\n\t\t\treturn;\n\t\t}\n\t\treturn {canvas, viewer: viewerContainerObject.viewer};\n\t}\n\n\tfunction captureStaticImage(options: CaptureStaticOptions) {\n\t\treturn new Promise((resolve) => {\n\t\t\t// if (!viewer_container.value) {\n\t\t\t// \tconsole.warn('no canvas to capture animation from');\n\t\t\t// \treturn;\n\t\t\t// }\n\n\t\t\tconst data = _canvasData();\n\t\t\tif (!data) {\n\t\t\t\tconsole.warn('no canvas data');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst {canvas, viewer} = data;\n\n\t\t\tconst mimeType = 'image/png';\n\t\t\tconst callbackName = 'image capture';\n\t\t\tviewer.registerOnAfterRender(callbackName, () => {\n\t\t\t\t// for the .toBlob call to work\n\t\t\t\t// without needing preserveDrawingBuffer: true\n\t\t\t\t// it seems like it has to be called right after a render.\n\t\t\t\t// Which is why we do it in a onAfterRender callback\n\t\t\t\tcanvas.toBlob(async (blob: Blob | null) => {\n\t\t\t\t\tif (blob) {\n\t\t\t\t\t\tFilesRegister.setThumbnailStaticBlob(blob);\n\t\t\t\t\t\tconst callback = Editor.instance().callback(EditorEvent.VIEWER_CAPTURE_STATIC);\n\t\t\t\t\t\tif (callback) {\n\t\t\t\t\t\t\tconst file = CoreFileUtils.blobToFile(blob, 'thumbnail_static.png', {\n\t\t\t\t\t\t\t\taddExtFromBlobType: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tawait callback(file);\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('no callback for static capture');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (options.showPopup) {\n\t\t\t\t\t\t\tconst filename = `${fileBaseName()}.png`;\n\t\t\t\t\t\t\tStoreController.editor.captureResult.display({\n\t\t\t\t\t\t\t\tfile: CoreFileUtils.blobToFile(blob, filename),\n\t\t\t\t\t\t\t\tcaptureType: CaptureType.IMAGE,\n\t\t\t\t\t\t\t\tonDownload: (options) => {\n\t\t\t\t\t\t\t\t\tCoreFileUtils.downloadBlob(options.file, filename);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('no blob captured');\n\t\t\t\t\t}\n\t\t\t\t}, mimeType);\n\t\t\t\tviewer.unRegisterOnAfterRender(callbackName);\n\t\t\t});\n\t\t});\n\t}\n\n\tfunction fileBaseName() {\n\t\tconst scene = StoreController.scene;\n\t\treturn `${scene.name()}`;\n\t}\n\n\tlet canvasToWebm: BaseCanvasToWebm<AbstractRenderer> | undefined;\n\tfunction captureAnimation(options: CaptureAnimationOptions) {\n\t\tconst data = _canvasData();\n\t\tif (!data) {\n\t\t\tconsole.error('no canvas data to capture');\n\t\t\treturn;\n\t\t}\n\t\tconst {canvas} = data;\n\t\tconst scene = StoreController.engine.scene;\n\n\t\tWindowController.instance().incrementUploadsInProgress();\n\t\tStoreController.editor.status.setLoading('capturing video');\n\n\t\t// add a set time out before record starts\n\t\t// as I've seen cases where the play would not actually play\n\t\t// (possibly because I was capturing an image first?)\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\tconsole.error('no viewer');\n\t\t\treturn;\n\t\t}\n\t\tconst renderer = viewerContainerObject.viewer?.renderer();\n\t\tif (!renderer) {\n\t\t\tconsole.error('no renderer');\n\t\t\treturn;\n\t\t}\n\t\tif (renderer instanceof WebGLRenderer) {\n\t\t\tif (viewer instanceof ThreejsViewer || viewer instanceof MapboxViewer) {\n\t\t\t\tcanvasToWebm = new CanvasToWebm({\n\t\t\t\t\tscene,\n\t\t\t\t\tcanvas,\n\t\t\t\t\t// renderer,\n\t\t\t\t\t// viewer,\n\t\t\t\t\tvideoBitsPerSecond: StoreController.editor.captureForm.videoMbsPerSecond(),\n\t\t\t\t});\n\t\t\t\tcanvasToWebm.start({\n\t\t\t\t\tplayScene: options.playScene,\n\t\t\t\t\tduration: options.duration,\n\t\t\t\t\tscene: scene,\n\t\t\t\t\tonCompleted: async () => {\n\t\t\t\t\t\tawait onCaptureAnimationCompletedWebGL(options);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconsole.error('unsupported viewer', viewer);\n\t\t\t}\n\t\t} else if (renderer instanceof PathTracingRendererContainer && viewer instanceof PathTracingViewer) {\n\t\t\tcanvasToWebm = new CanvasToWebmPBR({\n\t\t\t\tscene,\n\t\t\t\tcanvas,\n\t\t\t\t// renderer,\n\t\t\t\tviewer,\n\t\t\t\tvideoBitsPerSecond: StoreController.editor.captureForm.videoMbsPerSecond(),\n\t\t\t});\n\t\t\t(canvasToWebm as CanvasToWebmPBR).start({\n\t\t\t\tplayScene: options.playScene,\n\t\t\t\tduration: options.duration,\n\t\t\t\tscene: scene,\n\t\t\t\trenderer,\n\t\t\t\tonCompleted: async () => {\n\t\t\t\t\tStoreController.editor.captureForm.markAsCompleted();\n\t\t\t\t\t// NpmModuleApiController.captures.saveStatic(sceneName, file);\n\t\t\t\t\t// await on_capture_animation_completed(options);\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tconsole.error('unsupported renderer', renderer, viewer);\n\t\t}\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log(viewerContainerObject.viewer);\n\n\t\t// \tcanvas_to_webm.record();\n\t\t// \tsetTimeout(() => {\n\t\t// \t\tif (canvas_to_webm) {\n\t\t// \t\t\tcanvas_to_webm.stop(async () => {\n\t\t// \t\t\t\tawait on_capture_animation_completed(options);\n\t\t// \t\t\t});\n\t\t// \t\t\tif (options.playScene) {\n\t\t// \t\t\t\t// pause scene if the capture required it to be playing\n\t\t// \t\t\t\tscene.pause();\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}, options.duration * 1000);\n\t\t// }, 500);\n\t}\n\tasync function onCaptureAnimationCompletedWebGL(options: CaptureAnimationOptions) {\n\t\tStoreController.editor.captureForm.markAsCompleted();\n\t\tif (!canvasToWebm) {\n\t\t\treturn;\n\t\t}\n\t\tconst webmFile = canvasToWebm.file();\n\t\tif (!webmFile) {\n\t\t\treturn;\n\t\t}\n\t\tconst file = webmFile;\n\t\t// const file = CoreFfmpeg.webMtoMp4(webmFile);\n\t\tconst callback = Editor.instance().callback(EditorEvent.VIEWER_CAPTURE_ANIMATION);\n\t\treset();\n\t\tif (file && callback) {\n\t\t\tawait callback(file);\n\t\t}\n\t\tif (file && options.showPopup) {\n\t\t\tconst filename = `${fileBaseName()}.webm`;\n\t\t\tStoreController.editor.captureResult.display({\n\t\t\t\tfile: file,\n\t\t\t\tcaptureType: CaptureType.VIDEO,\n\t\t\t\tonDownload: (options) => {\n\t\t\t\t\tCoreFileUtils.downloadBlob(options.file, filename);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tWindowController.instance().decrementUploadsInProgress();\n\n\t\t// const active_storage_bridge = window.POLY.active_storage_bridge();\n\t\t// const input_id = INPUT_THUMBNAIL_WEBM_ID;\n\t\t// const input = document.getElementById(input_id) as HTMLInputElement;\n\t\t// active_storage_bridge.start_upload(file, input, (progress: number) => {\n\t\t// \tconst percent = Math.floor(100 * progress);\n\t\t// \tthis.$store.commit('editor/status_bar/notice', `uploading... (${percent}%)`);\n\n\t\t// \tif (percent >= 100 && this._capture_start_at) {\n\t\t// \t\tconst capture_duration = performance.now() - this._capture_start_at;\n\t\t// \t\tconsole.log('capture_duration (sec):', Math.round(capture_duration / 1000));\n\t\t// \t\tthis._capture_start_at = null;\n\t\t// \t}\n\t\t// });\n\n\t\t// const label = 'animation captured';\n\t\t// this.$store.commit('editor/status_bar/notice', label);\n\t\t// this.$emit('capture_render_completed');\n\t}\n\n\t// let bg_image: HTMLImageElement | undefined;\n\t// In order to capture an image, make sure to add CONTEXT_OPTIONS.preserveDrawingBuffer\n\t// NOT TO THE RENDERER,\n\t// but to the context, in RenderersController (plural!)\n\tasync function capture_static_thumbnail() {\n\t\tcapture.value.animation = false;\n\t\tcapture.value.active = true;\n\n\t\tconst data = _canvasData();\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tconst {canvas} = data;\n\t\tconst downloader = new CanvasToDownload(canvas, 'polygon');\n\t\tdownloader.download();\n\n\t\t// const datauri = canvas.toDataURL();\n\t\t// let img = document.createElement('img');\n\t\t// img.onload = async () => {\n\t\t// \t// document.body.style.overflow = 'auto';\n\t\t// \t// document.body.appendChild(img);\n\t\t// \t// let a = 1;\n\t\t// \t// if (a == 1) {\n\t\t// \t// img.width = 400;\n\t\t// \t// img.height = 400;\n\n\t\t// \t// bg_image = bg_image || (await CoreImage.create_white_image(img.width, img.height));\n\t\t// \t// const composite_image = await CoreImage.overlay(bg_image, img);\n\t\t// \t// const square_image = await CoreImage.make_square(composite_image);\n\t\t// \t// const blob = await CoreImage.image_to_blob(img);\n\t\t// \t// const file = CoreFileUtils.blob_to_file(blob, `thumbnail.png`, false);\n\t\t// \t// console.log('static', file);\n\t\t// \t// const callback = Editor.instance().callback(EditorEvent.VIEWER_CAPTURE_STATIC);\n\t\t// \t// if (file && callback) {\n\t\t// \t// \tawait callback(file);\n\t\t// \t// }\n\t\t// \tconst element = document.createElement('a');\n\t\t// \telement.setAttribute('href', datauri);\n\t\t// \telement.setAttribute('download', 'polygonjs.png');\n\n\t\t// \telement.style.display = 'none';\n\t\t// \tdocument.body.appendChild(element);\n\n\t\t// \telement.click();\n\t\t// \t// }\n\t\t// \t// no need to reset since static capture is automated\n\t\t// \t// reset();\n\t\t// };\n\t\t// img.src = datauri;\n\t}\n\t(window as any).capture_static_thumbnail = capture_static_thumbnail;\n\n\treturn {\n\t\trequest_capture_animation_duration,\n\t\tcaptureButtonDisplayed,\n\t};\n}\n","import {StoreController} from '../../../../../editor/store/controllers/StoreController';\nimport {DropDownMenuEntry} from '../../../../types';\nimport {ComputedRef, Ref, ref, computed, onMounted, watch} from 'vue';\nimport {ArrayUtils} from '../../../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {Camera} from '../../../../../../@polygonjs/polygonjs/node_modules/@types/three';\nimport {CorePath} from '../../../../../../@polygonjs/polygonjs/src/core/geometry/CorePath';\n\nexport interface CameraContainerObject {\n\tcamera: Camera | null;\n}\n\nconst DEFAULT_CAMERA_SUFFIX = ' ( default ) ';\n\nexport function SetupCameraMenu(\n\tcurrentCameraObjectPath: Ref<string | null>,\n\tonUpdateObjectsPathsCallback: () => void\n\t// current_camera_node_graph_id: Ref<CoreGraphNodeId | null>\n) {\n\tconst objectsPaths: Ref<string[]> = ref([]);\n\n\tonMounted(updateObjectsPaths);\n\tonMounted(addRootParamsToStore);\n\twatch(\n\t\tobjectsPaths,\n\t\t() => {\n\t\t\tonUpdateObjectsPathsCallback();\n\t\t},\n\t\t{deep: true}\n\t);\n\n\tconst currentCameraExists = computed(() =>\n\t\tcurrentCameraObjectPath.value ? objectsPaths.value.includes(currentCameraObjectPath.value) : false\n\t);\n\tconst cameraErrorMessage = computed(() => {\n\t\tif (currentCameraExists.value) {\n\t\t\treturn;\n\t\t}\n\t\tif (objectsPaths.value.length == 0) {\n\t\t\treturn `no cameras found`;\n\t\t}\n\t\treturn `camera '${currentCameraObjectPath.value}' does not exist in the scene, select another one from the dropdown`;\n\t});\n\tconst cameraMenuLabel = computed(() => {\n\t\tlet defaultLabel = currentCameraObjectPath.value || 'no camera selected'; //current_camera_node.value?.name() || 'no camera';\n\t\tif (!currentCameraExists.value) {\n\t\t\tdefaultLabel = `🔴 ${defaultLabel}`;\n\t\t} else {\n\t\t\tif (currentDefaultCamera.value == currentCameraObjectPath.value) {\n\t\t\t\tdefaultLabel += DEFAULT_CAMERA_SUFFIX;\n\t\t\t}\n\t\t}\n\t\treturn defaultLabel;\n\t});\n\tconst cameraMenuEntries = computed(() => {\n\t\treturn objectsPaths.value.map((path) => {\n\t\t\tconst entry: DropDownMenuEntry = {\n\t\t\t\tid: path,\n\t\t\t\tlabel: currentDefaultCamera.value == path ? `${path}${DEFAULT_CAMERA_SUFFIX}` : path,\n\t\t\t};\n\t\t\treturn entry;\n\t\t});\n\t});\n\tfunction makeCurrentCameraDefault() {\n\t\tif (!currentCameraObjectPath.value) {\n\t\t\tStoreController.editor.status.setError('no camera to set');\n\t\t\treturn;\n\t\t}\n\t\tStoreController.engine.scene.root().mainCameraController.setCameraPath(currentCameraObjectPath.value);\n\t}\n\tconst currentDefaultCamera = computed(() => {\n\t\tconst root = StoreController.engine.scene.root();\n\t\tconst param = StoreController.engine.json_param(root.mainCameraController.mainCameraPathParam().graphNodeId());\n\t\tif (!param) {\n\t\t\treturn '';\n\t\t}\n\t\tconst currentValue = param.raw_input;\n\t\treturn currentValue;\n\t});\n\tfunction addRootParamsToStore() {\n\t\tconst root = StoreController.engine.scene.root();\n\t\tif (!root) {\n\t\t\tconsole.error(`failed to add root node to store`);\n\t\t\treturn;\n\t\t}\n\t\tStoreController.engine.addNodeParamsToStore(root.graphNodeId());\n\t}\n\tconst isCurrentCameraDefault: ComputedRef<boolean> = computed(() => {\n\t\treturn currentDefaultCamera.value == currentCameraObjectPath.value;\n\t});\n\tfunction on_select_camera_menu_entry_select(entryId: string) {\n\t\tcurrentCameraObjectPath.value = entryId;\n\t}\n\n\tfunction on_camera_menu_label_mousenter() {\n\t\tupdateObjectsPaths();\n\t}\n\n\tfunction updateObjectsPaths() {\n\t\tconst cameras: Camera[] = [];\n\t\tconst scene = StoreController.engine.scene;\n\t\tscene.camerasController.cameraObjects(cameras);\n\t\tconst newObjectPaths: string[] = [];\n\t\tArrayUtils.uniq(\n\t\t\tcameras.map((c) => CorePath.objectPath(c)),\n\t\t\tnewObjectPaths\n\t\t);\n\t\tnewObjectPaths.sort();\n\t\tconst newObjectPathsStr = newObjectPaths.join(',');\n\t\tconst currentObjectPathsStr = objectsPaths.value.join(',');\n\t\t// if I don't check if the new value is the same, this unnecessarily re-creates a viewer,\n\t\t// which can have the side effect of recycling/dispose viewers, which in turns have env maps disappear\n\t\tif (newObjectPathsStr != currentObjectPathsStr) {\n\t\t\tobjectsPaths.value = newObjectPaths;\n\t\t}\n\t\t// objectsPaths.value.splice(0, objectsPaths.value.length);\n\t\t// for (let newObjectPath of newObjectPaths) {\n\t\t// \tobjectsPaths.value.push(newObjectPath);\n\t\t// }\n\t}\n\n\treturn {\n\t\tmakeCurrentCameraDefault,\n\t\tisCurrentCameraDefault,\n\t\tcameraErrorMessage,\n\t\tobjectsPaths,\n\t\tupdateObjectsPaths,\n\t\tcameraMenuLabel,\n\t\tcameraMenuEntries,\n\t\ton_select_camera_menu_entry_select,\n\t\ton_camera_menu_label_mousenter,\n\t};\n}\n","import {Ref, computed, ref, watch, ComputedRef, CSSProperties} from 'vue';\nimport {BaseViewerContainerObject} from './Capture';\nimport {ThreejsViewer} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/Threejs';\nimport {Camera} from 'three';\n\nexport function SetupViewerActive(\n\tviewerContainer: Ref<HTMLElement | null>,\n\tviewerContainerObject: BaseViewerContainerObject\n) {\n\tconst viewerActive = ref<boolean>(true);\n\n\twatch(viewerActive, updateViewer);\n\tfunction updateViewer() {\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\treturn;\n\t\t}\n\t\tconst threejsViewer = viewer as ThreejsViewer<Camera>;\n\t\tif (!threejsViewer.setAutoRender) {\n\t\t\treturn;\n\t\t}\n\t\tthreejsViewer.setAutoRender(viewerActive.value, {cancelAnimate: false});\n\t}\n\n\tfunction toggleViewerActive() {\n\t\tviewerActive.value = !viewerActive.value;\n\t}\n\tfunction renderSingleFrame() {\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\treturn;\n\t\t}\n\t\tconst threejsViewer = viewer as ThreejsViewer<Camera>;\n\t\tif (!threejsViewer.setAutoRender) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentAutoRenderState = threejsViewer.autoRenderState();\n\t\tconst callbackName = 'SetupViewerCapture';\n\t\tviewer.registerOnAfterRender(callbackName, () => {\n\t\t\tviewer.unRegisterOnAfterRender(callbackName);\n\t\t\tthreejsViewer.setAutoRender(currentAutoRenderState);\n\t\t});\n\t\tif (!currentAutoRenderState) {\n\t\t\tthreejsViewer.setAutoRender(true);\n\t\t}\n\t}\n\tconst toggleViewerActiveButtonTitle = computed(() => {\n\t\treturn viewerActive.value\n\t\t\t? 'Viewer is rendering every frame, click to stop render'\n\t\t\t: 'Viewer is not rendering. Click to render every frame';\n\t});\n\tconst renderSingleFrameStyleObject: ComputedRef<CSSProperties> = computed(() => {\n\t\treturn {\n\t\t\topacity: viewerActive.value ? 0 : 1,\n\t\t\t'pointer-events': viewerActive.value ? 'none' : 'auto',\n\t\t};\n\t});\n\n\treturn {\n\t\tviewerActive,\n\t\ttoggleViewerActive,\n\t\trenderSingleFrame,\n\t\ttoggleViewerActiveButtonTitle,\n\t\trenderSingleFrameStyleObject,\n\t\tupdateViewer,\n\t};\n}\n","import {onBeforeMount, Ref} from 'vue';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {CoreType} from '../../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {NetworkPanelInitLayoutData, ViewerPanelInitLayoutData} from '../../../../types';\n\nexport interface ViewerPanelProps {\n\tinit_layout_data: ViewerPanelInitLayoutData;\n\tpanelId: string;\n}\nexport interface SetupLayoutDataOptions {\n\tprops: ViewerPanelProps;\n\tcurrentCameraObjectPath: Ref<string | null>;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n\tnetworkCore: Ref<HTMLElement | null>;\n\t// network overlay\n\toverlayNetworkAllowed: Ref<boolean>;\n\toverlayNetworkDisplayed: Ref<boolean>;\n\toverlayedNetworkInitLayoutData: Ref<NetworkPanelInitLayoutData>;\n\t// html (for scroll)\n\t// htmlActive: Ref<boolean>;\n\t// htmlHtml: Ref<string | null>;\n\t// htmlViewerId: Ref<string | null>;\n\t// htmlInShadowRoot: Ref<boolean>;\n}\n\nexport function SetupLayoutData(options: SetupLayoutDataOptions) {\n\tconst {\n\t\tprops,\n\t\tcurrentCameraObjectPath,\n\t\tsetupLinkIndex,\n\t\tnetworkCore,\n\t\t// network overlay\n\t\toverlayNetworkAllowed,\n\t\toverlayNetworkDisplayed,\n\t\toverlayedNetworkInitLayoutData,\n\t\t// html (for scroll)\n\t\t// htmlActive,\n\t\t// htmlHtml,\n\t\t// htmlViewerId,\n\t\t// htmlInShadowRoot,\n\t} = options;\n\n\tonBeforeMount(() => {\n\t\tfromJSON(props.init_layout_data);\n\t});\n\n\tfunction fromJSON(json: ViewerPanelInitLayoutData) {\n\t\tconst cameraPath = json['camera'];\n\t\t// we need to check that cameraPath is a string,\n\t\t// as when splitting panels, it could still receive the data object 'camera'\n\t\t// from the network panel, which is an object\n\t\tif (cameraPath && CoreType.isString(cameraPath)) {\n\t\t\t// const cameraObject = StoreController.engine.scene.objectsController.findObjectByMask(cameraPath)\n\t\t\t// if (cameraObject) {\n\t\t\t// const id = camera_node.graphNodeId();\n\t\t\tcurrentCameraObjectPath.value = cameraPath;\n\t\t\tconst currentMainCameraPath = StoreController.scene.camerasController.mainCameraPath();\n\t\t\tif (currentMainCameraPath == '') {\n\t\t\t\tStoreController.scene.camerasController.setMainCameraPath(cameraPath);\n\t\t\t}\n\t\t\t// }\n\t\t} else {\n\t\t\t// const cameraObject = StoreController.scene.camerasController.mainCameraObject();\n\t\t\t// if (cameraObject) {\n\t\t\t// \tcurrentCameraObjectPath.value = StoreController.scene.objectsController.objectPath(cameraObject);\n\t\t\t// }\n\t\t}\n\n\t\tif (json.overlayedNetwork != null) {\n\t\t\tif (json.overlayedNetwork.initLayoutData) {\n\t\t\t\toverlayedNetworkInitLayoutData.value = json.overlayedNetwork.initLayoutData;\n\t\t\t}\n\t\t\toverlayNetworkAllowed.value = json.overlayedNetwork.allowed || false;\n\t\t\toverlayNetworkDisplayed.value = json.overlayedNetwork.displayed || false;\n\t\t}\n\t\t// if (json.html) {\n\t\t// \thtmlActive.value = json.html.active;\n\t\t// \thtmlHtml.value = json.html.html;\n\t\t// \thtmlViewerId.value = json.html.viewerId;\n\t\t// \thtmlInShadowRoot.value = json.html.inShadowRoot;\n\t\t// }\n\n\t\tsetupLinkIndex.fromJSON(json);\n\t}\n\n\tfunction layoutData(): ViewerPanelInitLayoutData {\n\t\t// if (currentCameraObjectPath.value) {\n\t\t// const camera_node = StoreController.engine.node(current_camera_node_graph_id.value);\n\t\t// if (camera_node) {\n\t\t// const camera_fullPath = camera_node.path();\n\t\treturn {\n\t\t\tcamera: currentCameraObjectPath.value || '',\n\t\t\tisViewerInitLayoutData: true,\n\t\t\t...setupLinkIndex.toJSON(),\n\t\t\toverlayedNetwork: {\n\t\t\t\tallowed: overlayNetworkAllowed.value,\n\t\t\t\tdisplayed: overlayNetworkDisplayed.value,\n\t\t\t\tinitLayoutData: networkCore.value ? (networkCore.value as any).layoutData() : undefined,\n\t\t\t},\n\t\t\t// html:\n\t\t\t// \thtmlHtml.value != null && htmlViewerId.value != null && htmlInShadowRoot.value != null\n\t\t\t// \t\t? {\n\t\t\t// \t\t\t\tactive: htmlActive.value,\n\t\t\t// \t\t\t\thtml: htmlHtml.value,\n\t\t\t// \t\t\t\tviewerId: htmlViewerId.value,\n\t\t\t// \t\t\t\tinShadowRoot: htmlInShadowRoot.value,\n\t\t\t// \t\t  }\n\t\t\t// \t\t: undefined,\n\t\t};\n\t\t// }\n\t\t// }\n\t\t// return {...setupLinkIndex.toJSON(), isViewerInitLayoutData: true};\n\t}\n\n\treturn {fromJSON, layoutData};\n}\n","import {watch, computed, onMounted, onUnmounted} from 'vue';\nimport {ViewerPanelInitLayoutData} from '../../../../types';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {NodeContext} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n// import { ObjType } from '../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Obj';\n// import { BaseNodeClassWithDisplayFlag } from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {SubnetSopNodeLike} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/utils/subnet/SopSubnetChildrenDisplayController';\n// import type {GeoObjNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/Geo';\ninterface SetupSubnetDisplayFlagOptions {\n\tprops: {\n\t\tpanelId: string;\n\t\tinit_layout_data: ViewerPanelInitLayoutData;\n\t};\n}\n\nexport function SetupSubnetDisplayFlag(options: SetupSubnetDisplayFlagOptions) {\n\tconst {props} = options;\n\n\tconst _nodeId = computed(() => StoreController.editor.current_node_graph_id(props.init_layout_data.linkIndex));\n\twatch(_nodeId, (newNodeId, oldNodeId) => {\n\t\t_unsetNodeId(oldNodeId);\n\t\t_setNodeId(newNodeId);\n\t});\n\tonMounted(() => {\n\t\t_setNodeId(_nodeId.value);\n\t});\n\tonUnmounted(() => {\n\t\t_unsetNodeId(_nodeId.value);\n\t});\n\n\tfunction _getFirstSubnetSopNode(nodeId: number) {\n\t\tconst node = StoreController.engine.node(nodeId);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.context() == NodeContext.SOP && node instanceof SubnetSopNodeLike) {\n\t\t\treturn node;\n\t\t}\n\t\tconst subnetSopNode: SubnetSopNodeLike<any> | null = node.parentController.findParent((parent) => {\n\t\t\treturn parent.context() == NodeContext.SOP && parent instanceof SubnetSopNodeLike;\n\t\t}) as SubnetSopNodeLike<any> | null;\n\t\treturn subnetSopNode;\n\t}\n\n\tfunction _unsetNodeId(nodeId: number) {\n\t\tconst subnetSopNode = _getFirstSubnetSopNode(nodeId);\n\t\tif (!subnetSopNode) {\n\t\t\treturn;\n\t\t}\n\t\t_setSubnetNode(subnetSopNode, false);\n\t}\n\tfunction _setNodeId(nodeId: number) {\n\t\tconst subnetSopNode = _getFirstSubnetSopNode(nodeId);\n\t\tif (!subnetSopNode) {\n\t\t\treturn;\n\t\t}\n\t\t_setSubnetNode(subnetSopNode, true);\n\t}\n\tfunction _setSubnetNode(subnetSopNode: SubnetSopNodeLike<any>, overrideOutputNode: boolean) {\n\t\tsubnetSopNode.setOverrideOutputNode(overrideOutputNode);\n\t}\n\n\treturn {};\n}\n","import {BaseObjNodeType} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/_Base';\nimport {GeoObjNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/Geo';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {Vector3} from 'three';\n\ninterface TRSValues {\n\tt: Vector3;\n\tr: Vector3;\n\ts: Vector3;\n}\n\nexport class ObjNodeHandler extends BaseTransformHandler<BaseObjNodeType> {\n\tprivate initParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\ts: new Vector3(),\n\t};\n\tprivate currentParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\ts: new Vector3(),\n\t};\n\n\toverride dragStart() {\n\t\tthis._setTRSValues(this._options.node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: BaseObjNodeType, values: TRSValues) {\n\t\tif (!(node.p.t != null && node.p.r != null && node.p.s != null)) {\n\t\t\treturn;\n\t\t}\n\t\tconst geoNode = node as GeoObjNode;\n\t\tvalues.t.copy(geoNode.pv.t);\n\t\tvalues.r.copy(geoNode.pv.r);\n\t\tvalues.s.copy(geoNode.pv.s);\n\t}\n\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as GeoObjNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.t;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn node.p.r;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn node.p.s;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = !param.y.hasExpression();\n\t\tcontrols.showZ = !param.z.hasExpression();\n\t}\n\toverride async placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst objNode = this._options.node as BaseObjNodeType;\n\t\tawait objNode.compute();\n\t\tconst object = objNode.object;\n\t\tconst dummy = this._options.dummy;\n\t\t// dummy.matrixWorld.copy(object.matrixWorld);\n\t\t// dummy.matrix.copy(object.matrix);\n\t\tdummy.position.copy(object.position);\n\t\t// dummy.rotation.copy(object.rotation);\n\t\tdummy.scale.copy(object.scale);\n\n\t\tlet parent = object.parent ? object.parent : objNode.scene().threejsScene();\n\t\tparent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\tif (!(node.p.t != null && node.p.r != null && node.p.s != null)) {\n\t\t\treturn;\n\t\t}\n\t\tconst geoNode = node as GeoObjNode;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\treturn this._updateParamFromVector3(geoNode.p.t, dummy.position);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\treturn this._updateParamRFromEuler(geoNode.p.r, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\treturn this._updateParamFromVector3(geoNode.p.s, dummy.scale);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(() => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\t\t\tconst geoNode = node as GeoObjNode;\n\n\t\t\tif (!this._controls) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn this._pushMultiCmdXYZ(geoNode.p.t, {\n\t\t\t\t\t\told: this.initParamValues.t,\n\t\t\t\t\t\tnew: this.currentParamValues.t,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn this._pushMultiCmdXYZ(geoNode.p.r, {\n\t\t\t\t\t\told: this.initParamValues.r,\n\t\t\t\t\t\tnew: this.currentParamValues.r,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn this._pushMultiCmdXYZ(geoNode.p.s, {\n\t\t\t\t\t\told: this.initParamValues.s,\n\t\t\t\t\t\tnew: this.currentParamValues.s,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseSopNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {CameraNodeType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n// import {CadType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cad';\nimport {PerspectiveCameraSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PerspectiveCamera';\nimport {OrthographicCameraSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/OrthographicCamera';\n// import {TransformCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Transform';\nimport {MathUtils, Vector3} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n\ninterface TRSValues {\n\tposition: Vector3;\n\trotation: Vector3;\n}\n\nexport type PositionRotationSopControlsTargetNode = PerspectiveCameraSopNode | OrthographicCameraSopNode;\nconst SOP_NODE_TYPES: CameraNodeType[] = [CameraNodeType.PERSPECTIVE, CameraNodeType.ORTHOGRAPHIC];\n// const CAD_NODE_TYPES: CadType[] = [CadType.TRANSFORM];\nexport function isPositionRotationSopControllable(node: BaseSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\t// case NodeContext.CAD: {\n\t\t// \treturn CAD_NODE_TYPES.includes(node.type() as CadType);\n\t\t// }\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as CameraNodeType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class PositionRotationSopNodeHandler extends BaseTransformHandler<PositionRotationSopControlsTargetNode> {\n\tprotected override _availableModes(): ControlsMode[] {\n\t\treturn [ControlsMode.TRANSLATE, ControlsMode.ROTATE];\n\t}\n\tprivate initParamValues: TRSValues = {\n\t\tposition: new Vector3(),\n\t\trotation: new Vector3(),\n\t};\n\tprivate currentParamValues: TRSValues = {\n\t\tposition: new Vector3(),\n\t\trotation: new Vector3(),\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: PositionRotationSopControlsTargetNode, values: TRSValues) {\n\t\tif (!(node.p.position != null && node.p.rotation != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.position.copy(node.pv.position);\n\t\tvalues.rotation.copy(node.pv.rotation);\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as PositionRotationSopControlsTargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.position;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn node.p.rotation;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\tcontrols.showX = false;\n\t\t\tcontrols.showY = false;\n\t\t\tcontrols.showZ = false;\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = !param.y.hasExpression();\n\t\tcontrols.showZ = !param.z.hasExpression();\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\tif (node.type() == SopType.TRANSFORM) {\n\t\t\tconst transformSopNode = node as PositionRotationSopControlsTargetNode;\n\t\t\tconst pv = transformSopNode.pv;\n\t\t\tdummy.position.copy(pv.position);\n\t\t\tdummy.rotation.set(\n\t\t\t\tMathUtils.degToRad(pv.rotation.x),\n\t\t\t\tMathUtils.degToRad(pv.rotation.y),\n\t\t\t\tMathUtils.degToRad(pv.rotation.z)\n\t\t\t);\n\t\t\tdummy.scale.set(1, 1, 1);\n\t\t}\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\treturn this._updateParamFromVector3(node.p.position, dummy.position);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\treturn this._updateParamRFromEuler(node.p.rotation, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t// return this._updateParamFromVector3(node.p.s, dummy.scale);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.position, {\n\t\t\t\t\t\told: this.initParamValues.position,\n\t\t\t\t\t\tnew: this.currentParamValues.position,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.rotation, {\n\t\t\t\t\t\told: this.initParamValues.rotation,\n\t\t\t\t\t\tnew: this.currentParamValues.rotation,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.s, {\n\t\t\t\t\t// \told: this.initParamValues.s,\n\t\t\t\t\t// \tnew: this.currentParamValues.s,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {GlType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Gl';\nimport {JsType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Js';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {Vector3} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {Vector3Param} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector3';\n\n// gl\nimport type {SDFBoxFrameGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFBoxFrame';\nimport type {SDFBoxRoundGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFBoxRound';\nimport type {SDFBoxGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFBox';\nimport type {SDFCapsuleGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFCapsule';\nimport type {SDFCapsuleVerticalGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFCapsuleVertical';\nimport type {SDFConeGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFCone';\nimport type {SDFConeRoundGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFConeRound';\nimport type {SDFElongateGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFElongate';\nimport type {SDFFractalMandelbrotGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFFractalMandelbrot';\nimport type {SDFHexagonalPrismGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFHexagonalPrism';\nimport type {SDFHorseShoeGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFHorseShoe';\nimport type {SDFLinkGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFLink';\nimport type {SDFPlaneGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFPlane';\nimport type {SDFPyramidGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFPyramid';\nimport type {SDFRevolutionGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFRevolution';\nimport type {SDFRhombusGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFRhombus';\nimport type {SDFRhombusTriacontahedronGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFRhombusTriacontahedron';\nimport type {SDFOctahedronGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFOctahedron';\nimport type {SDFOctogonalPrismGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFOctogonalPrism';\nimport type {SDFSolidAngleGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFSolidAngle';\nimport type {SDFSphereGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFSphere';\nimport type {SDFSphereCutGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFSphereCut';\nimport type {SDFSphereHollowGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFSphereHollow';\nimport type {SDFQuadGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFQuad';\nimport type {SDFTorusGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTorus';\n// import type {SDFTransformGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTransform';\nimport type {SDFTriangleGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTriangle';\nimport type {SDFTriangularPrismGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTriangularPrism';\nimport type {SDFTubeGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTube';\n\n// js\nimport type {SDFBoxJsNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDFBox';\nimport type {SDFElongateJsNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDFElongate';\nimport type {SDFRevolutionJsNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDFRevolution';\nimport type {SDFSphereJsNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDFSphere';\n\n//\nimport {BaseGlNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/_Base';\nimport {BaseJsNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/_Base';\nimport {BaseSopNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\n//\n// import type {BoxCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Box';\n// import type {CircleCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Circle';\n// import type {ConeCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Cone';\n// import type {CylinderCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Cylinder';\n// import type {PointCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Point';\n// import type {RectangleCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Rectangle';\n// import type {SphereCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Sphere';\n// import type {TorusCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Torus';\n//\nimport type {AxesHelperSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/AxesHelper';\nimport type {BoxSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Box';\nimport type {BoxLinesSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/BoxLines';\n// CAD\nimport type {CADBoxSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADBox';\nimport type {CADCircleSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADCircle';\nimport type {CADSphereSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADSphere';\nimport type {CADPointSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADPoint';\nimport type {CADRectangleSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADRectangle';\nimport type {CADTorusSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADTorus';\nimport type {CADTubeSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADTube';\n//\nimport type {CapsuleSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Capsule';\nimport type {CircleSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Circle';\nimport type {ConeSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Cone';\n// CSG\nimport type {CSGBoxSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGBox';\nimport type {CSGEllipsoidSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGEllipsoid';\nimport type {CSGSphereSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGSphere';\nimport type {CSGTubeSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGTube';\nimport type {CSGTubeEllipticSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGTubeElliptic';\n//\nimport type {IcosahedronSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Icosahedron';\nimport type {MirrorSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Mirror';\nimport type {PlaneSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Plane';\nimport type {PolarTransformSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PolarTransform';\n// QUAD\nimport type {QuadPlaneSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/QuadPlane';\n//\nimport type {RingSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Ring';\nimport type {RoundedBoxSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/RoundedBox';\n//\nimport type {ShearSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Shear';\nimport type {SphereSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Sphere';\nimport type {TetrahedronSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Tetrahedron';\nimport type {TorusSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Torus';\nimport type {TorusKnotSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/TorusKnot';\nimport type {TubeSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Tube';\n\ninterface CenterableValues {\n\tcenter: Vector3;\n}\n\n// type _CenterableCadControlsTargetNode =\n// \t| BoxCadNode\n// \t| CircleCadNode\n// \t| ConeCadNode\n// \t| CylinderCadNode\n// \t| PointCadNode\n// \t| RectangleCadNode\n// \t| SphereCadNode\n// \t| TorusCadNode;\ntype _CenterableSopControlsTargetNode =\n\t// GL\n\t| SDFBoxFrameGlNode\n\t| SDFBoxRoundGlNode\n\t| SDFBoxGlNode\n\t| SDFCapsuleGlNode\n\t| SDFCapsuleVerticalGlNode\n\t| SDFConeGlNode\n\t| SDFConeRoundGlNode\n\t| SDFElongateGlNode\n\t| SDFFractalMandelbrotGlNode\n\t| SDFHexagonalPrismGlNode\n\t| SDFHorseShoeGlNode\n\t| SDFLinkGlNode\n\t| SDFPlaneGlNode\n\t| SDFPyramidGlNode\n\t| SDFRevolutionGlNode\n\t| SDFRhombusGlNode\n\t| SDFRhombusTriacontahedronGlNode\n\t| SDFOctahedronGlNode\n\t| SDFOctogonalPrismGlNode\n\t| SDFSolidAngleGlNode\n\t| SDFSphereGlNode\n\t| SDFSphereCutGlNode\n\t| SDFSphereHollowGlNode\n\t| SDFQuadGlNode\n\t| SDFTorusGlNode\n\t// SDFTransformGlNode|\n\t| SDFTriangleGlNode\n\t| SDFTriangularPrismGlNode\n\t| SDFTubeGlNode\n\t// \t// JS\n\t| SDFBoxJsNode\n\t| SDFElongateJsNode\n\t| SDFRevolutionJsNode\n\t| SDFSphereJsNode\n\t// SOP\n\t| AxesHelperSopNode\n\t| BoxSopNode\n\t| BoxLinesSopNode\n\t// CAD\n\t| CADBoxSopNode\n\t| CADCircleSopNode\n\t| CADPointSopNode\n\t| CADSphereSopNode\n\t| CADRectangleSopNode\n\t| CADTorusSopNode\n\t| CADTubeSopNode\n\t//\n\t| CapsuleSopNode\n\t| CircleSopNode\n\t| ConeSopNode\n\t// CSG\n\t| CSGBoxSopNode\n\t| CSGEllipsoidSopNode\n\t| CSGSphereSopNode\n\t| CSGTubeSopNode\n\t| CSGTubeEllipticSopNode\n\t//\n\t| IcosahedronSopNode\n\t| MirrorSopNode\n\t| PlaneSopNode\n\t| PolarTransformSopNode\n\t// QUAD\n\t| QuadPlaneSopNode\n\t//\n\t| RingSopNode\n\t| RoundedBoxSopNode\n\t// SDF\n\t// | SDFBoxSopNode\n\t// | SDFSphereSopNode\n\t//\n\t| ShearSopNode\n\t| SphereSopNode\n\t| TetrahedronSopNode\n\t| TorusSopNode\n\t| TorusKnotSopNode\n\t| TubeSopNode;\n\ntype CenterableControlsTargetNode = _CenterableSopControlsTargetNode;\n\nconst GL_NODE_TYPES: GlType[] = [\n\tGlType.SDF_BOX,\n\tGlType.SDF_BOX_FRAME,\n\tGlType.SDF_BOX_ROUND,\n\tGlType.SDF_CAPSULE,\n\tGlType.SDF_CAPSULE_VERTICAL,\n\tGlType.SDF_CONE,\n\tGlType.SDF_CONE_ROUND,\n\tGlType.SDF_ELONGATE,\n\tGlType.SDF_FRACTAL_MANDELBROT,\n\tGlType.SDF_HEXAGONAL_PRISM,\n\tGlType.SDF_HORSE_SHOE,\n\tGlType.SDF_LINK,\n\tGlType.SDF_OCTAHEDRON,\n\tGlType.SDF_OCTOGONAL_PRISM,\n\tGlType.SDF_PLANE,\n\tGlType.SDF_PYRAMID,\n\tGlType.SDF_QUAD,\n\tGlType.SDF_REPEAT_POLAR,\n\tGlType.SDF_REVOLUTION,\n\tGlType.SDF_RHOMBUS,\n\tGlType.SDF_RHOMBUS_TRIACONTAHEDRON,\n\tGlType.SDF_SOLID_ANGLE,\n\tGlType.SDF_SPHERE,\n\tGlType.SDF_SPHERE_CUT,\n\tGlType.SDF_SPHERE_HOLLOW,\n\tGlType.SDF_TORUS,\n\tGlType.SDF_TRIANGULAR_PRISM,\n\tGlType.SDF_TRIANGLE,\n\tGlType.SDF_TUBE,\n\tGlType.SDF_TWIST,\n];\nconst JS_NODE_TYPES: JsType[] = [\n\tJsType.SDF_BOX,\n\tJsType.SDF_ELONGATE,\n\tJsType.SDF_REVOLUTION,\n\tJsType.SDF_SPHERE,\n\tJsType.SDF_TORUS,\n\tJsType.SDF_TRANSFORM,\n\tJsType.SDF_TUBE,\n];\nconst SOP_NODE_TYPES: SopType[] = [\n\tSopType.AXES_HELPER,\n\tSopType.BOX,\n\tSopType.BOX_LINES,\n\t// CAD\n\tSopType.CAD_BOX,\n\tSopType.CAD_CIRCLE,\n\tSopType.CAD_POINT,\n\tSopType.CAD_SPHERE,\n\tSopType.CAD_RECTANGLE,\n\tSopType.CAD_TORUS,\n\tSopType.CAD_TUBE,\n\t//\n\tSopType.CAPSULE,\n\tSopType.CIRCLE,\n\tSopType.CIRCLE_3_POINTS,\n\tSopType.CONE,\n\t// CSG\n\tSopType.CSG_BOX,\n\tSopType.CSG_ELLIPSOID,\n\tSopType.CSG_SPHERE,\n\tSopType.CSG_TUBE,\n\tSopType.CSG_TUBE_ELLIPTIC,\n\t//\n\tSopType.ICOSAHEDRON,\n\tSopType.MIRROR,\n\tSopType.PLANE,\n\tSopType.POLAR_TRANSFORM,\n\t// QUAD\n\tSopType.QUAD_PLANE,\n\t//\n\tSopType.RING,\n\tSopType.ROUNDED_BOX,\n\t//\n\tSopType.SHEAR,\n\tSopType.SPHERE,\n\tSopType.TETRAHEDRON,\n\tSopType.TORUS,\n\tSopType.TORUS_KNOT,\n\tSopType.TUBE,\n];\n// const CAD_NODE_TYPES: CadType[] = [CadType.TRANSFORM];\nexport function isCenterableControllable(node: BaseGlNodeType | BaseJsNodeType | BaseSopNodeType) {\n\tconst context = node.context();\n\n\tfunction hasRequiredParams() {\n\t\tconst _node = node as CenterableControlsTargetNode;\n\t\treturn _node.p.center != null && _node.p.center instanceof Vector3Param;\n\t}\n\tif (!hasRequiredParams()) {\n\t\treturn;\n\t}\n\n\tswitch (context) {\n\t\tcase NodeContext.GL: {\n\t\t\treturn GL_NODE_TYPES.includes(node.type() as GlType);\n\t\t}\n\t\tcase NodeContext.JS: {\n\t\t\treturn JS_NODE_TYPES.includes(node.type() as JsType);\n\t\t}\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class CenterableNodeHandler extends BaseTransformHandler<CenterableControlsTargetNode> {\n\tprotected override _availableModes(): ControlsMode[] {\n\t\treturn [ControlsMode.TRANSLATE];\n\t}\n\tprivate initParamValues: CenterableValues = {\n\t\tcenter: new Vector3(),\n\t};\n\tprivate currentParamValues: CenterableValues = {\n\t\tcenter: new Vector3(),\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: CenterableControlsTargetNode, values: CenterableValues) {\n\t\tif (!(node.p.center != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.center.copy(node.pv.center);\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as CenterableControlsTargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.center;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\tcontrols.showX = false;\n\t\t\tcontrols.showY = false;\n\t\t\tcontrols.showZ = false;\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = !param.y.hasExpression();\n\t\tcontrols.showZ = !param.z.hasExpression();\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\t// if (node.type() == SopType.TRANSFORM) {\n\t\tconst transformSopNode = node as CenterableControlsTargetNode;\n\t\tconst pv = transformSopNode.pv;\n\t\tdummy.position.copy(pv.center);\n\t\tdummy.rotation.set(0, 0, 0);\n\t\tdummy.scale.set(1, 1, 1);\n\t\t// }\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\treturn this._updateParamFromVector3(node.p.center, dummy.position);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t// return this._updateParamRFromEuler(node.p.r, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t// return this._updateParamFromVector3(node.p.s, dummy.scale);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.center, {\n\t\t\t\t\t\told: this.initParamValues.center,\n\t\t\t\t\t\tnew: this.currentParamValues.center,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.r, {\n\t\t\t\t\t// \told: this.initParamValues.r,\n\t\t\t\t\t// \tnew: this.currentParamValues.r,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.s, {\n\t\t\t\t\t// \told: this.initParamValues.s,\n\t\t\t\t\t// \tnew: this.currentParamValues.s,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","// import {CadType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cad';\nimport {GlType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Gl';\nimport {JsType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Js';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {Vector3, Vector2} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n//\n// import {BaseCadNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/_Base';\nimport {BaseGlNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/_Base';\nimport {BaseJsNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/_Base';\nimport {BaseSopNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\n// gl\nimport type {SDF2DBoxGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DBox';\nimport type {SDF2DCircleGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DCircle';\nimport type {SDF2DCrossGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DCross';\nimport type {SDF2DHeartGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DHeart';\nimport type {SDF2DRoundedXGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DRoundedX';\nimport type {SDF2DStairsGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DStairs';\n// js\nimport type {SDF2DCircleJsNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDF2DCircle';\n// sop\nimport type {CADCircle2DSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADCircle2D';\nimport type {CADEllipse2DSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADEllipse2D';\nimport type {CADPoint2DSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADPoint2D';\n\n//\n\nfunction v3ToV2(v3: Vector3, v2: Vector2) {\n\tv2.x = v3.x;\n\tv2.y = v3.y;\n}\nconst tmpV2 = new Vector2();\ninterface Centerable2DXYValues {\n\tcenter: Vector2;\n}\n\ntype _CenterableCadControlsTargetNode =\n\t// gl\n\t| SDF2DBoxGlNode\n\t| SDF2DCircleGlNode\n\t| SDF2DCrossGlNode\n\t| SDF2DHeartGlNode\n\t| SDF2DRoundedXGlNode\n\t| SDF2DStairsGlNode\n\t// js\n\t| SDF2DCircleJsNode\n\t// sop\n\t| CADCircle2DSopNode\n\t| CADEllipse2DSopNode\n\t| CADPoint2DSopNode;\n\ntype CenterableControlsTargetNode = _CenterableCadControlsTargetNode;\n\n// const CAD_NODE_TYPES: CadType[] = [ CadType.POINT_2D];\nconst GL_NODE_TYPES: GlType[] = [\n\tGlType.SDF_2D_BOX,\n\tGlType.SDF_2D_CIRCLE,\n\tGlType.SDF_2D_CROSS,\n\tGlType.SDF_2D_HEART,\n\tGlType.SDF_2D_ROUNDED_X,\n\tGlType.SDF_2D_STAIRS,\n];\nconst JS_NODE_TYPES: JsType[] = [\n\tJsType.SDF_2D_BOX,\n\tJsType.SDF_2D_CIRCLE,\n\tJsType.SDF_2D_CROSS,\n\tJsType.SDF_2D_HEART,\n\tJsType.SDF_2D_ROUNDED_X,\n];\nconst SOP_NODE_TYPES: SopType[] = [SopType.CAD_CIRCLE_2D, SopType.CAD_ELLIPSE_2D, SopType.CAD_POINT_2D];\nexport function isCenterable2DXYControllable(node: BaseGlNodeType | BaseJsNodeType | BaseSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\tcase NodeContext.GL: {\n\t\t\treturn GL_NODE_TYPES.includes(node.type() as GlType);\n\t\t}\n\t\tcase NodeContext.JS: {\n\t\t\treturn JS_NODE_TYPES.includes(node.type() as JsType);\n\t\t}\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class Centerable2DXYNodeHandler extends BaseTransformHandler<CenterableControlsTargetNode> {\n\tprotected override _availableModes(): ControlsMode[] {\n\t\treturn [ControlsMode.TRANSLATE];\n\t}\n\tprivate initParamValues: Centerable2DXYValues = {\n\t\tcenter: new Vector2(),\n\t};\n\tprivate currentParamValues: Centerable2DXYValues = {\n\t\tcenter: new Vector2(),\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: CenterableControlsTargetNode, values: Centerable2DXYValues) {\n\t\tif (!(node.p.center != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.center.copy(node.pv.center);\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as CenterableControlsTargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.center;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\tcontrols.showX = false;\n\t\t\tcontrols.showY = false;\n\t\t\tcontrols.showZ = false;\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = !param.y.hasExpression();\n\t\tcontrols.showZ = false;\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\t// if (node.type() == SopType.TRANSFORM) {\n\t\tconst transformSopNode = node as CenterableControlsTargetNode;\n\t\tconst pv = transformSopNode.pv;\n\t\tdummy.position.set(pv.center.x, pv.center.y, 0);\n\t\tdummy.rotation.set(0, 0, 0);\n\t\tdummy.scale.set(1, 1, 1);\n\t\t// }\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\tv3ToV2(dummy.position, tmpV2);\n\t\t\t\treturn this._updateParamFromVector2(node.p.center, tmpV2);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t// return this._updateParamRFromEuler(node.p.r, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t// return this._updateParamFromVector3(node.p.s, dummy.scale);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXY(node.p.center, {\n\t\t\t\t\t\told: this.initParamValues.center,\n\t\t\t\t\t\tnew: this.currentParamValues.center,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.r, {\n\t\t\t\t\t// \told: this.initParamValues.r,\n\t\t\t\t\t// \tnew: this.currentParamValues.r,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.s, {\n\t\t\t\t\t// \told: this.initParamValues.s,\n\t\t\t\t\t// \tnew: this.currentParamValues.s,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","// import {CadType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cad';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {Vector3, Vector2} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n//\n// import {BaseCadNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/_Base';\nimport {BaseSopNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\n//\n// import {Circle2DCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Circle2D';\n// import {Ellipse2DCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Ellipse2D';\nimport type {CSGArcSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGArc';\nimport type {CSGCircleSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGCircle';\nimport type {CSGEllipseSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGEllipse';\nimport type {CSGRectangleSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGRectangle';\nimport type {PhysicsGroundSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PhysicsGround';\n//\n\nfunction v3ToV2(v3: Vector3, v2: Vector2) {\n\tv2.x = v3.x;\n\tv2.y = v3.z;\n}\nconst tmpV2 = new Vector2();\ninterface Centerable2DXZValues {\n\tcenter: Vector3;\n}\n\ntype _CenterableCadControlsTargetNode =\n\t| CSGArcSopNode\n\t| CSGCircleSopNode\n\t| CSGEllipseSopNode\n\t| CSGRectangleSopNode\n\t| PhysicsGroundSopNode;\n\ntype CenterableControlsTargetNode = _CenterableCadControlsTargetNode;\n\n// const CAD_NODE_TYPES: CadType[] = [ CadType.POINT_2D];\nconst SOP_NODE_TYPES: SopType[] = [\n\tSopType.CSG_ARC,\n\tSopType.CSG_CIRCLE,\n\tSopType.CSG_ELLIPSE,\n\tSopType.CSG_RECTANGLE,\n\tSopType.PHYSICS_GROUND,\n];\nexport function isCenterable2DXZControllable(node: BaseSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\t// case NodeContext.CAD: {\n\t\t// \treturn CAD_NODE_TYPES.includes(node.type() as CadType);\n\t\t// }\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class Centerable2DXZNodeHandler extends BaseTransformHandler<CenterableControlsTargetNode> {\n\tprotected override _availableModes(): ControlsMode[] {\n\t\treturn [ControlsMode.TRANSLATE];\n\t}\n\tprivate initParamValues: Centerable2DXZValues = {\n\t\tcenter: new Vector3(),\n\t};\n\tprivate currentParamValues: Centerable2DXZValues = {\n\t\tcenter: new Vector3(),\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: CenterableControlsTargetNode, values: Centerable2DXZValues) {\n\t\tif (!(node.p.center != null)) {\n\t\t\treturn;\n\t\t}\n\t\t// values.center.copy(node.pv.center);\n\t\tvalues.center.x = node.pv.center.x;\n\t\tvalues.center.z = node.pv.center.y;\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as CenterableControlsTargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.center;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\tcontrols.showX = false;\n\t\t\tcontrols.showY = false;\n\t\t\tcontrols.showZ = false;\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = false;\n\t\tcontrols.showZ = !param.y.hasExpression();\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\t// if (node.type() == SopType.TRANSFORM) {\n\t\tconst transformSopNode = node as CenterableControlsTargetNode;\n\t\tconst pv = transformSopNode.pv;\n\t\tdummy.position.set(pv.center.x, 0, pv.center.y);\n\t\tdummy.rotation.set(0, 0, 0);\n\t\tdummy.scale.set(1, 1, 1);\n\t\t// }\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\tv3ToV2(dummy.position, tmpV2);\n\t\t\t\treturn this._updateParamFromVector2XZ(node.p.center, tmpV2);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t// return this._updateParamRFromEuler(node.p.r, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t// return this._updateParamFromVector3(node.p.s, dummy.scale);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXZ(node.p.center, {\n\t\t\t\t\t\told: this.initParamValues.center,\n\t\t\t\t\t\tnew: this.currentParamValues.center,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.r, {\n\t\t\t\t\t// \told: this.initParamValues.r,\n\t\t\t\t\t// \tnew: this.currentParamValues.r,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\t// return await this._pushMultiCmdXYZ(node.p.s, {\n\t\t\t\t\t// \told: this.initParamValues.s,\n\t\t\t\t\t// \tnew: this.currentParamValues.s,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseGlNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/_Base';\nimport {MathUtils, Vector3} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n//\nimport {GlType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Gl';\nimport {JsType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Js';\n//\nimport {SDFTransformGlNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTransform';\nimport {SDFTransformJsNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDFTransform';\n\ninterface TRValues {\n\tt: Vector3;\n\tr: Vector3;\n\t// s: Vector3;\n}\n\nexport type TransformGlJsControlsTargetNode = SDFTransformGlNode | SDFTransformJsNode;\nconst GL_NODE_TYPES: GlType[] = [GlType.SDF_TRANSFORM];\nconst JS_NODE_TYPES: JsType[] = [JsType.SDF_TRANSFORM];\n// const CAD_NODE_TYPES: CadType[] = [CadType.TRANSFORM];\nexport function isTransformGlJsControllable(node: BaseGlNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\tcase NodeContext.JS: {\n\t\t\treturn JS_NODE_TYPES.includes(node.type() as JsType);\n\t\t}\n\t\tcase NodeContext.GL: {\n\t\t\treturn GL_NODE_TYPES.includes(node.type() as GlType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class TransformGlJsNodeHandler extends BaseTransformHandler<TransformGlJsControlsTargetNode> {\n\tprivate initParamValues: TRValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\t// s: new Vector3(),\n\t};\n\tprivate currentParamValues: TRValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\t// s: new Vector3(),\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: TransformGlJsControlsTargetNode, values: TRValues) {\n\t\tif (!(node.p.t != null && node.p.r != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.t.copy(node.pv.t);\n\t\tvalues.r.copy(node.pv.r);\n\t\t// values.s.copy(node.pv.s);\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as TransformGlJsControlsTargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.t;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn node.p.r;\n\t\t\t\t}\n\t\t\t\t// case ControlsMode.SCALE: {\n\t\t\t\t// \treturn node.p.s;\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = !param.y.hasExpression();\n\t\tcontrols.showZ = !param.z.hasExpression();\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\tif (node.type() == GlType.SDF_TRANSFORM) {\n\t\t\tconst transformNode = node as TransformGlJsControlsTargetNode;\n\t\t\tconst pv = transformNode.pv;\n\t\t\tdummy.position.copy(pv.t);\n\t\t\tdummy.rotation.set(MathUtils.degToRad(pv.r.x), MathUtils.degToRad(pv.r.y), MathUtils.degToRad(pv.r.z));\n\t\t\t// dummy.scale.copy(pv.s);\n\t\t}\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\treturn this._updateParamFromVector3(node.p.t, dummy.position);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\tdummy.rotation.x = -MathUtils.degToRad(dummy.rotation.x);\n\t\t\t\tdummy.rotation.y = -MathUtils.degToRad(dummy.rotation.y);\n\t\t\t\tdummy.rotation.z = -MathUtils.degToRad(dummy.rotation.z);\n\t\t\t\treturn this._updateParamRFromEuler(node.p.r, dummy.rotation);\n\t\t\t}\n\t\t\t// case ControlsMode.SCALE: {\n\t\t\t// \treturn this._updateParamFromVector3(node.p.s, dummy.scale);\n\t\t\t// }\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.t, {\n\t\t\t\t\t\told: this.initParamValues.t,\n\t\t\t\t\t\tnew: this.currentParamValues.t,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.r, {\n\t\t\t\t\t\told: this.initParamValues.r,\n\t\t\t\t\t\tnew: this.currentParamValues.r,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// case ControlsMode.SCALE: {\n\t\t\t\t// \treturn await this._pushMultiCmdXYZ(node.p.s, {\n\t\t\t\t// \t\told: this.initParamValues.s,\n\t\t\t\t// \t\tnew: this.currentParamValues.s,\n\t\t\t\t// \t});\n\t\t\t\t// }\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseSopNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport {CopySopNode} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Copy';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\n// import {CadType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Cad';\nimport {TransformSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Transform';\n// import {TransformCadNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Transform';\nimport {MathUtils, Vector3} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n\ninterface TRSValues {\n\tt: Vector3;\n\tr: Vector3;\n\ts: Vector3;\n}\n\nexport type TransformSopControlsTargetNode = TransformSopNode | CopySopNode;\nconst SOP_NODE_TYPES: SopType[] = [SopType.TRANSFORM, SopType.COPY];\n// const CAD_NODE_TYPES: CadType[] = [CadType.TRANSFORM];\nexport function isTransformSopControllable(node: BaseSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\t// case NodeContext.CAD: {\n\t\t// \treturn CAD_NODE_TYPES.includes(node.type() as CadType);\n\t\t// }\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class TransformSopNodeHandler extends BaseTransformHandler<TransformSopControlsTargetNode> {\n\tprivate initParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\ts: new Vector3(),\n\t};\n\tprivate currentParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\ts: new Vector3(),\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: TransformSopControlsTargetNode, values: TRSValues) {\n\t\tif (!(node.p.t != null && node.p.r != null && node.p.s != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.t.copy(node.pv.t);\n\t\tvalues.r.copy(node.pv.r);\n\t\tvalues.s.copy(node.pv.s);\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as TransformSopControlsTargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.t;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn node.p.r;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn node.p.s;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tcontrols.showX = !param.x.hasExpression();\n\t\tcontrols.showY = !param.y.hasExpression();\n\t\tcontrols.showZ = !param.z.hasExpression();\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\tif (node.type() == SopType.TRANSFORM) {\n\t\t\tconst transformSopNode = node as TransformSopControlsTargetNode;\n\t\t\tconst pv = transformSopNode.pv;\n\t\t\tdummy.position.copy(pv.t);\n\t\t\tdummy.rotation.set(MathUtils.degToRad(pv.r.x), MathUtils.degToRad(pv.r.y), MathUtils.degToRad(pv.r.z));\n\t\t\tdummy.scale.copy(pv.s);\n\t\t}\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\treturn this._updateParamFromVector3(node.p.t, dummy.position);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\treturn this._updateParamRFromEuler(node.p.r, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\treturn this._updateParamFromVector3(node.p.s, dummy.scale);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.t, {\n\t\t\t\t\t\told: this.initParamValues.t,\n\t\t\t\t\t\tnew: this.currentParamValues.t,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.r, {\n\t\t\t\t\t\told: this.initParamValues.r,\n\t\t\t\t\t\tnew: this.currentParamValues.r,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.s, {\n\t\t\t\t\t\told: this.initParamValues.s,\n\t\t\t\t\t\tnew: this.currentParamValues.s,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseCADSopNodeType} from './../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseCAD';\n// import {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport type {CADTransformSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADTransform';\nimport {MathUtils, Vector3} from 'three';\nimport {BaseTransformHandler, ControlsMode, TransformControls} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {Vector3Param} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector3';\nimport {ParamSetCommand} from '../../../../../history/commands/ParamSet';\nimport {Editor} from './../../../../../Editor';\n\ninterface TRSValues {\n\tt: Vector3;\n\tr: Vector3;\n\ts: number;\n}\n\nexport type TargetNode = CADTransformSopNode;\nconst SOP_NODE_TYPES: SopType[] = [SopType.CAD_TRANSFORM];\nexport function isTransformCadControllable(node: BaseCADSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\t// case NodeContext.CAD: {\n\t\t// return CAD_NODE_TYPES.includes(node.type() as CadType);\n\t\t// }\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class TransformCadNodeHandler extends BaseTransformHandler<TargetNode> {\n\tprivate initParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\ts: 1,\n\t};\n\tprivate currentParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: new Vector3(),\n\t\ts: 1,\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: TargetNode, values: TRSValues) {\n\t\tif (!(node.p.t != null && node.p.r != null && node.p.s != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.t.copy(node.pv.t);\n\t\tvalues.r.copy(node.pv.r);\n\t\tvalues.s = node.pv.s;\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as TargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tfunction getParam(controls: TransformControls) {\n\t\t\tswitch (controls.mode) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn node.p.t;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn node.p.r;\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn node.p.s;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst param = getParam(controls);\n\t\tif (!param) {\n\t\t\treturn;\n\t\t}\n\t\tif (param instanceof Vector3Param) {\n\t\t\tcontrols.showX = !param.x.hasExpression();\n\t\t\tcontrols.showY = !param.y.hasExpression();\n\t\t\tcontrols.showZ = !param.z.hasExpression();\n\t\t} else {\n\t\t\tcontrols.showX = !param.hasExpression();\n\t\t\tcontrols.showY = false;\n\t\t\tcontrols.showZ = false;\n\t\t}\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\t// if (node.type() == SopType.CAD_TRANSFORM) {\n\t\tconst transformSopNode = node as TargetNode;\n\t\tconst pv = transformSopNode.pv;\n\t\tdummy.position.copy(pv.t);\n\t\tdummy.rotation.set(MathUtils.degToRad(pv.r.x), MathUtils.degToRad(pv.r.y), MathUtils.degToRad(pv.r.z));\n\t\tdummy.scale.set(pv.s, pv.s, pv.s);\n\t\t// }\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\treturn this._updateParamFromVector3(node.p.t, dummy.position);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\treturn this._updateParamRFromEuler(node.p.r, dummy.rotation);\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\treturn this._updateParamFromNumber(node.p.s, dummy.scale.x);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.t, {\n\t\t\t\t\t\told: this.initParamValues.t,\n\t\t\t\t\t\tnew: this.currentParamValues.t,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXYZ(node.p.r, {\n\t\t\t\t\t\told: this.initParamValues.r,\n\t\t\t\t\t\tnew: this.currentParamValues.r,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\tconst cmd = new ParamSetCommand(node.p.s, this.currentParamValues.s, this.initParamValues.s);\n\t\t\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t\t\t\treturn;\n\t\t\t\t\t// return this._pushMultiCmdForEachAxis(node.p.s, {\n\t\t\t\t\t// \told: this.initParamValues.s,\n\t\t\t\t\t// \tnew: this.currentParamValues.s,\n\t\t\t\t\t// });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseSopNodeType} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport type {CADTransform2DSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADTransform2D';\nimport {Vector2, Vector3, MathUtils} from 'three';\nimport {BaseTransformHandler, ControlsMode} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n\ninterface TRSValues {\n\tt: Vector2;\n\tr: number;\n\ts: number;\n}\nconst tmpV2 = new Vector2();\n// function v2ToV3(v2:Vector2, v3:Vector3){\n// \tv3.x = v2.x\n// \tv3.y = v2.y\n// \tv3.x = 0\n// }\nfunction v3ToV2(v3: Vector3, v2: Vector2) {\n\tv2.x = v3.x;\n\tv2.y = v3.y;\n}\n\nexport type TargetNode = CADTransform2DSopNode;\nconst SOP_NODE_TYPES: SopType[] = [SopType.CAD_TRANSFORM_2D];\nexport function isTransform2DCadControllable(node: BaseSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\t// case NodeContext.CAD: {\n\t\t// \treturn CAD_NODE_TYPES.includes(node.type() as CadType);\n\t\t// }\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class Transform2DCadNodeHandler extends BaseTransformHandler<TargetNode> {\n\tprivate initParamValues: TRSValues = {\n\t\tt: new Vector2(),\n\t\tr: 0,\n\t\ts: 1,\n\t};\n\tprivate currentParamValues: TRSValues = {\n\t\tt: new Vector2(),\n\t\tr: 0,\n\t\ts: 1,\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: TargetNode, values: TRSValues) {\n\t\tif (!(node.p.t != null && node.p.r != null && node.p.s != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.t.copy(node.pv.t);\n\t\tvalues.r = node.pv.r;\n\t\tvalues.s = node.pv.s;\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as TargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\tconst param = node.p.t;\n\t\t\t\tcontrols.showX = !param.x.hasExpression();\n\t\t\t\tcontrols.showY = !param.y.hasExpression();\n\t\t\t\tcontrols.showZ = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\tconst param = node.p.r;\n\t\t\t\tcontrols.showX = false;\n\t\t\t\tcontrols.showY = false;\n\t\t\t\tcontrols.showZ = !param.hasExpression();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\tconst param = node.p.s;\n\t\t\t\tcontrols.showX = !param.hasExpression();\n\t\t\t\tcontrols.showY = false;\n\t\t\t\tcontrols.showZ = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\t// if (node.type() == CadType.TRANSFORM_2D) {\n\t\tconst transformSopNode = node as TargetNode;\n\t\tconst pv = transformSopNode.pv;\n\t\tdummy.position.set(pv.t.x, pv.t.y, 0);\n\t\tdummy.rotation.set(0, 0, MathUtils.degToRad(pv.r));\n\t\tdummy.scale.set(pv.s, pv.s, pv.s);\n\t\t// }\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\tv3ToV2(dummy.position, tmpV2);\n\t\t\t\treturn this._updateParamFromVector2(node.p.t, tmpV2);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\treturn this._updateParamFromNumber(node.p.r, MathUtils.radToDeg(dummy.rotation.z));\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\treturn this._updateParamFromNumber(node.p.s, dummy.scale.x);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXY(node.p.t, {\n\t\t\t\t\t\told: this.initParamValues.t,\n\t\t\t\t\t\tnew: this.currentParamValues.t,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn await this._pushCmdNumber(node.p.r, {\n\t\t\t\t\t\told: this.initParamValues.r,\n\t\t\t\t\t\tnew: this.currentParamValues.r,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn await this._pushCmdNumber(node.p.s, {\n\t\t\t\t\t\told: this.initParamValues.s,\n\t\t\t\t\t\tnew: this.currentParamValues.s,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {BaseSopNodeType} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport {SopType} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/registers/nodes/types/Sop';\nimport type {CSGTransform2DSopNode} from '../../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGTransform2D';\nimport {Vector2, Vector3, MathUtils} from 'three';\nimport {BaseTransformHandler, ControlsMode} from './_BaseTransform';\nimport {NodeContext} from '../../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\n\ninterface TRSValues {\n\tt: Vector3;\n\tr: number;\n\ts: number;\n}\nconst tmpV2 = new Vector2();\n// function v2ToV3(v2:Vector2, v3:Vector3){\n// \tv3.x = v2.x\n// \tv3.y = v2.y\n// \tv3.x = 0\n// }\nfunction v3ToV2(v3: Vector3, v2: Vector2) {\n\tv2.x = v3.x;\n\tv2.y = v3.z;\n}\n\nexport type TargetNode = CSGTransform2DSopNode;\nconst SOP_NODE_TYPES: SopType[] = [SopType.CSG_TRANSFORM_2D];\nexport function isTransform2DCsgControllable(node: BaseSopNodeType) {\n\tconst context = node.context();\n\tswitch (context) {\n\t\t// case NodeContext.CAD: {\n\t\t// \treturn CAD_NODE_TYPES.includes(node.type() as CadType);\n\t\t// }\n\t\tcase NodeContext.SOP: {\n\t\t\treturn SOP_NODE_TYPES.includes(node.type() as SopType);\n\t\t}\n\t}\n\treturn false;\n}\nexport class Transform2DCsgNodeHandler extends BaseTransformHandler<TargetNode> {\n\tprivate initParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: 0,\n\t\ts: 1,\n\t};\n\tprivate currentParamValues: TRSValues = {\n\t\tt: new Vector3(),\n\t\tr: 0,\n\t\ts: 1,\n\t};\n\n\toverride dragStart() {\n\t\tconst {node} = this._options;\n\t\tthis._setTRSValues(node, this.initParamValues);\n\t}\n\tprivate _setTRSValues(node: TargetNode, values: TRSValues) {\n\t\tif (!(node.p.t != null && node.p.r != null && node.p.s != null)) {\n\t\t\treturn;\n\t\t}\n\t\tvalues.t.x = node.pv.t.x;\n\t\tvalues.t.z = node.pv.t.y;\n\t\tvalues.r = node.pv.r;\n\t\tvalues.s = node.pv.s;\n\t}\n\toverride setAxisStates() {\n\t\tconst node = this._options.node as TargetNode;\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\tconst param = node.p.t;\n\t\t\t\tcontrols.showX = !param.x.hasExpression();\n\t\t\t\tcontrols.showY = false;\n\t\t\t\tcontrols.showZ = !param.y.hasExpression();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\tconst param = node.p.r;\n\t\t\t\tcontrols.showX = false;\n\t\t\t\tcontrols.showY = !param.hasExpression();\n\t\t\t\tcontrols.showZ = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\tconst param = node.p.s;\n\t\t\t\tcontrols.showX = !param.hasExpression();\n\t\t\t\tcontrols.showY = false;\n\t\t\t\tcontrols.showZ = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\toverride placeDummy() {\n\t\tif (this._controls?.dragging) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\t\t// if (node.type() == CadType.TRANSFORM_2D) {\n\t\tconst transformSopNode = node as TargetNode;\n\t\tconst pv = transformSopNode.pv;\n\t\tdummy.position.set(pv.t.x, 0, pv.t.y);\n\t\tdummy.rotation.set(0, MathUtils.degToRad(pv.r), 0);\n\t\tdummy.scale.set(pv.s, pv.s, pv.s);\n\t\t// }\n\t\tdummy.updateMatrix();\n\t\tdummy.updateMatrixWorld();\n\n\t\tconst parentObjNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tconst dummyParent = parentObjNode ? parentObjNode.object : node.scene().threejsScene();\n\n\t\tdummyParent.add(dummy);\n\t}\n\toverride update() {\n\t\tconst controls = this._controls;\n\t\tif (!controls) {\n\t\t\treturn;\n\t\t}\n\t\tconst {node, dummy} = this._options;\n\n\t\tswitch (controls.mode) {\n\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\tv3ToV2(dummy.position, tmpV2);\n\t\t\t\treturn this._updateParamFromVector2XZ(node.p.t, tmpV2);\n\t\t\t}\n\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\tif (!node.p.r.hasExpression()) {\n\t\t\t\t\tnode.p.r.set(MathUtils.radToDeg(dummy.rotation.y));\n\t\t\t\t}\n\t\t\t\treturn; // this._updateParamFromNumber(node.p.r, MathUtils.radToDeg(dummy.rotation.z));\n\t\t\t}\n\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\treturn this._updateParamFromNumber(node.p.s, dummy.scale.x);\n\t\t\t}\n\t\t}\n\t}\n\toverride createHistoryCommand() {\n\t\tconst {node} = this._options;\n\t\tnode.scene().batchUpdates(async () => {\n\t\t\tthis._setTRSValues(node, this.currentParamValues);\n\t\t\tswitch (this.lastMode()) {\n\t\t\t\tcase ControlsMode.TRANSLATE: {\n\t\t\t\t\treturn await this._pushMultiCmdXZ(node.p.t, {\n\t\t\t\t\t\told: this.initParamValues.t,\n\t\t\t\t\t\tnew: this.currentParamValues.t,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.ROTATE: {\n\t\t\t\t\treturn await this._pushCmdNumber(node.p.r, {\n\t\t\t\t\t\told: this.initParamValues.r,\n\t\t\t\t\t\tnew: this.currentParamValues.r,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase ControlsMode.SCALE: {\n\t\t\t\t\treturn await this._pushCmdNumber(node.p.s, {\n\t\t\t\t\t\told: this.initParamValues.s,\n\t\t\t\t\t\tnew: this.currentParamValues.s,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import {computed, Ref, watch, ref} from 'vue';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {BaseNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {NodeContext} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {TransformControls} from 'three/examples/jsm/controls/TransformControls';\nimport {BaseCameraObjNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/_BaseCamera';\nimport {BaseViewerType} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/_Base';\nimport {PolyScene} from '../../../../../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {Group, Camera, Event} from 'three';\nimport {BaseHandler} from './controls/_Base';\nimport {AVAILABLE_LINK_INDEX_VALUES, LinkIndex} from '../../common/LinkIndex';\nimport {SetupViewerRegisterReturn} from './Register';\nimport {isBooleanTrue} from '../../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {BaseViewerContainerObject} from './Capture';\nimport {ThreejsCoreObject} from '../../../../../../@polygonjs/polygonjs/src/core/geometry/modules/three/ThreejsCoreObject';\nimport {CameraAttribute} from '../../../../../../@polygonjs/polygonjs/src/core/camera/CoreCamera';\n// import {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n\n//\nimport type {BaseGlNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/_Base';\nimport type {BaseJsNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/_Base';\nimport type {BaseObjNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/_Base';\nimport type {BaseSopNodeType} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_Base';\nimport type {BaseCADSopNodeType} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseCAD';\nimport type {BaseCSGSopNodeType} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/_BaseCSG';\n// import {BaseCadNodeType} from './../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/_Base';\n//\nimport type {SDF2DCircleGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDF2DCircle';\nimport type {SDFSphereGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFSphere';\nimport type {SDFTransformGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/SDFTransform';\nimport type {SDF2DCircleJsNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDF2DCircle';\nimport type {SDFBoxJsNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/SDFBox';\nimport type {TransformSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Transform';\nimport type {PerspectiveCameraSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/PerspectiveCamera';\n// import {BoxCadNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/cad/Box';\nimport type {BoxSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Box';\nimport type {CADPoint2DSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADPoint2D';\nimport type {CADTransformSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADTransform';\nimport type {CADTransform2DSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADTransform2D';\nimport type {CSGArcSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGArc';\nimport type {CSGTransform2DSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CSGTransform2D';\n//\nimport {ObjNodeHandler} from './controls/Obj';\nimport {isPositionRotationSopControllable, PositionRotationSopNodeHandler} from './controls/PositionRotationSop';\nimport {isCenterableControllable, CenterableNodeHandler} from './controls/Centerable';\nimport {isCenterable2DXYControllable, Centerable2DXYNodeHandler} from './controls/Centerable2DXY';\nimport {isCenterable2DXZControllable, Centerable2DXZNodeHandler} from './controls/Centerable2DXZ';\nimport {isTransformGlJsControllable, TransformGlJsNodeHandler} from './controls/TransformGlJs';\nimport {isTransformSopControllable, TransformSopNodeHandler} from './controls/TransformSop';\nimport {isTransformCadControllable, TransformCadNodeHandler} from './controls/TransformCad';\nimport {isTransform2DCadControllable, Transform2DCadNodeHandler} from './controls/Transform2DCad';\nimport {isTransform2DCsgControllable, Transform2DCsgNodeHandler} from './controls/Transform2DCsg';\n\nexport interface SetupControlsOptions {\n\tviewer?: BaseViewerType;\n\tcameraNode?: BaseCameraObjNodeType;\n}\ntype TransformControlCallback = (event: Event) => void;\n\nexport function SetupControls(\n\t// options: SetupControlsOptions,\n\tsetupViewerRegister: SetupViewerRegisterReturn,\n\tcurrentCameraObjectPath: Ref<string | null>,\n\tviewerContainer: BaseViewerContainerObject,\n\tviewerHints: Ref<string[]>\n) {\n\tconst lastSelectedNodeId: Ref<number | null> = ref(null);\n\n\tfunction _getCameraNodeGeneratorId() {\n\t\tconst camera = viewerContainer.viewer?.camera();\n\t\tconst nodeGeneratorId: number | undefined = camera\n\t\t\t? (ThreejsCoreObject.attribValue(camera, CameraAttribute.NODE_ID) as number)\n\t\t\t: undefined;\n\n\t\treturn nodeGeneratorId;\n\t}\n\n\tfunction setupSelectionUpdateFromLinkIndex(linkIndex: LinkIndex) {\n\t\tconst previousFirstSelectedNodeId: Ref<number | null> = ref(null);\n\t\tconst firstSelectedNodeId = computed(() => {\n\t\t\t// if (StoreController.editor.rootSelected()) {\n\t\t\t// \treturn StoreController.editor.scene.root().graphNodeId();\n\t\t\t// }\n\t\t\tconst parentNodeId = StoreController.editor.current_node_graph_id(linkIndex);\n\t\t\tif (parentNodeId) {\n\t\t\t\tconst parentNodeJSON = StoreController.engine.json_node(parentNodeId);\n\t\t\t\tif (parentNodeJSON && parentNodeJSON.selection) {\n\t\t\t\t\tconst selectedIds = parentNodeJSON.selection;\n\t\t\t\t\tconst nodeGeneratorId = _getCameraNodeGeneratorId();\n\t\t\t\t\tconst selectedIdsExceptCurrentCamera: number[] = selectedIds.filter((selectedId) => {\n\t\t\t\t\t\t// here we make sure not to display the camera if the selected node\n\t\t\t\t\t\t// is the camera we are looking through\n\t\t\t\t\t\treturn selectedId != nodeGeneratorId; //currentCameraObjectPath.value;\n\t\t\t\t\t});\n\t\t\t\t\tconst id = selectedIdsExceptCurrentCamera[0];\n\t\t\t\t\t// if previousFirstSelectedNodeId is only set when\n\t\t\t\t\t// there is a node\n\t\t\t\t\t// the controls will not disappear when we unselect all nodes.\n\t\t\t\t\t// This can be what we want,\n\t\t\t\t\t// but it can also be really annoying when trying to make the controls disappear.\n\t\t\t\t\t// And it is especially annoying when we are viewing through a camera\n\t\t\t\t\t// while at the same time having it selected.\n\t\t\t\t\t// if (id != null) {\n\t\t\t\t\t// if (id) {\n\n\t\t\t\t\tpreviousFirstSelectedNodeId.value = id;\n\t\t\t\t\t// }\n\t\t\t\t\t// }\n\t\t\t\t\treturn id;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t\tif (0 + 0) {\n\t\t\tconsole.log(firstSelectedNodeId);\n\t\t}\n\t\twatch(firstSelectedNodeId, () => {\n\t\t\tif (0 + 0) console.log('firstSelectedNodeId update', linkIndex, firstSelectedNodeId);\n\t\t});\n\t\tfunction update() {\n\t\t\tlastSelectedNodeId.value = previousFirstSelectedNodeId.value;\n\t\t}\n\t\twatch(previousFirstSelectedNodeId, update);\n\t\twatch(currentCameraObjectPath, update);\n\t}\n\tfor (let linkIndex of AVAILABLE_LINK_INDEX_VALUES) {\n\t\tsetupSelectionUpdateFromLinkIndex(linkIndex);\n\t}\n\n\tconst firstSelectedJSONNode = computed(() => {\n\t\tif (lastSelectedNodeId.value) {\n\t\t\treturn StoreController.engine.json_node(lastSelectedNodeId.value);\n\t\t}\n\t});\n\twatch(firstSelectedJSONNode, () => {\n\t\tcreateControls();\n\t});\n\n\tlet nodeHandler: BaseHandler<BaseNodeType> | undefined;\n\tlet control: TransformControls | undefined;\n\tlet domElement: HTMLElement | undefined;\n\tlet keyEventsDomElement = document.body;\n\tlet scene: PolyScene | undefined;\n\tconst dummy = (() => {\n\t\tconst group = new Group();\n\t\tgroup.name = 'transformControlsDummy';\n\t\treturn group;\n\t})();\n\tlet onDraggingChangedBound: TransformControlCallback | undefined;\n\tlet onObjectChangeBound: TransformControlCallback | undefined;\n\tfunction disposeControls() {\n\t\tif (!scene) {\n\t\t\treturn;\n\t\t}\n\t\tif (!control) {\n\t\t\treturn;\n\t\t}\n\t\tviewerHints.value = [];\n\t\tcontrol.detach();\n\t\tcontrol.dispose();\n\t\tcontrol.parent?.remove(control);\n\t\tdummy.parent?.remove(dummy);\n\n\t\tif (onDraggingChangedBound) {\n\t\t\tcontrol.removeEventListener('dragging-changed', onDraggingChangedBound);\n\t\t}\n\t\tif (onObjectChangeBound) {\n\t\t\tcontrol.removeEventListener('objectChange', onObjectChangeBound);\n\t\t}\n\t\tkeyEventsDomElement.removeEventListener('keydown', onKeyDown);\n\n\t\tnodeHandler?.dispose();\n\t\tnodeHandler = undefined;\n\t\tcontrol = undefined;\n\t}\n\n\tfunction createControls() {\n\t\tif (!isBooleanTrue(setupViewerRegister.isFirstRegistered.value)) {\n\t\t\tconsole.warn('setupViewerRegister.isFirstRegistered.value', setupViewerRegister.isFirstRegistered.value);\n\t\t\treturn;\n\t\t}\n\n\t\tdisposeControls();\n\t\tconst nodeId = firstSelectedJSONNode.value?.graph_node_id;\n\t\tif (!nodeId) {\n\t\t\t// console.warn('nodeId', nodeId);\n\t\t\treturn;\n\t\t}\n\t\tconst node = StoreController.engine.node(nodeId);\n\n\t\tif (!node) {\n\t\t\tconsole.warn('no node', node);\n\t\t\treturn;\n\t\t}\n\t\tif (!isNodeTransformable(node)) {\n\t\t\t// console.warn('isNodeTransformable(node)', isNodeTransformable(node));\n\t\t\treturn;\n\t\t}\n\t\tconst {viewer} = viewerContainer;\n\t\tif (!viewer) {\n\t\t\tconsole.warn('no viewer');\n\t\t\treturn;\n\t\t}\n\t\tconst camera = viewer.camera();\n\t\t// const {cameraNode} = options;\n\t\t// if (!cameraNode) {\n\t\t// \tconsole.warn('no cameraNode');\n\t\t// \treturn;\n\t\t// }\n\t\tdomElement = viewer.domElement();\n\t\tif (!domElement) {\n\t\t\tconsole.warn('no domElement');\n\t\t\treturn;\n\t\t}\n\t\tnodeHandler = createHandler(node, camera, domElement);\n\t\tif (!nodeHandler) {\n\t\t\tconsole.warn('no nodeHandler');\n\t\t\treturn;\n\t\t}\n\t\tviewerHints.value = nodeHandler.viewerHints();\n\t\tcontrol = nodeHandler.controls();\n\t\tif (!control) {\n\t\t\tconsole.warn('no control');\n\t\t\treturn;\n\t\t}\n\t\t// we use the document here, as the transform control now adds touch-action:none\n\t\t// to its domElement, which seems to prevent key events\n\t\tkeyEventsDomElement.addEventListener('keydown', onKeyDown);\n\t\tkeyEventsDomElement.addEventListener('keyup', onKeyUp);\n\n\t\tlet dragging = false;\n\t\tconst controls = viewer.controlsController()?.controls();\n\t\tif (controls) {\n\t\t\tonDraggingChangedBound = (event: Event) => {\n\t\t\t\tdragging = !dragging;\n\t\t\t\tcontrols.enabled = !dragging;\n\t\t\t\tif (dragging) {\n\t\t\t\t\tnodeHandler?.dragStart();\n\t\t\t\t} else {\n\t\t\t\t\tnodeHandler?.createHistoryCommand();\n\t\t\t\t}\n\t\t\t};\n\t\t\tcontrol.addEventListener('dragging-changed', onDraggingChangedBound);\n\t\t}\n\n\t\tonObjectChangeBound = (event: Event) => {\n\t\t\tnodeHandler?.update();\n\t\t};\n\t\tcontrol.addEventListener('objectChange', onObjectChangeBound);\n\n\t\tnodeHandler.bindParamsChangeEvents();\n\t\tnodeHandler.setAxisStates();\n\t\tnodeHandler.placeDummy();\n\n\t\tcontrol.attach(dummy);\n\n\t\tscene = viewer.scene();\n\t\t// dummy.parent?.add(control);\n\t\tscene.threejsScene().add(control);\n\t}\n\n\tfunction createHandler(node: BaseNodeType, camera: Camera, domElement: HTMLElement) {\n\t\tconst options = {\n\t\t\tdummy,\n\t\t\tcamera,\n\t\t\tdomElement,\n\t\t};\n\t\tswitch (node.context()) {\n\t\t\tcase NodeContext.GL: {\n\t\t\t\tif (isTransformGlJsControllable(node as BaseGlNodeType)) {\n\t\t\t\t\treturn new TransformGlJsNodeHandler({...options, node: node as SDFTransformGlNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterable2DXYControllable(node as BaseGlNodeType)) {\n\t\t\t\t\treturn new Centerable2DXYNodeHandler({...options, node: node as SDF2DCircleGlNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterableControllable(node as BaseGlNodeType)) {\n\t\t\t\t\treturn new CenterableNodeHandler({...options, node: node as SDFSphereGlNode});\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase NodeContext.JS: {\n\t\t\t\tif (isTransformGlJsControllable(node as BaseGlNodeType)) {\n\t\t\t\t\treturn new TransformGlJsNodeHandler({...options, node: node as SDFTransformGlNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterable2DXYControllable(node as BaseJsNodeType)) {\n\t\t\t\t\treturn new Centerable2DXYNodeHandler({...options, node: node as SDF2DCircleJsNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterableControllable(node as BaseJsNodeType)) {\n\t\t\t\t\treturn new CenterableNodeHandler({...options, node: node as SDFBoxJsNode});\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase NodeContext.OBJ: {\n\t\t\t\treturn new ObjNodeHandler({...options, node: node as BaseObjNodeType});\n\t\t\t}\n\t\t\tcase NodeContext.SOP: {\n\t\t\t\tif (isTransformSopControllable(node as BaseSopNodeType)) {\n\t\t\t\t\treturn new TransformSopNodeHandler({...options, node: node as TransformSopNode});\n\t\t\t\t}\n\t\t\t\tif (isPositionRotationSopControllable(node as BaseSopNodeType)) {\n\t\t\t\t\treturn new PositionRotationSopNodeHandler({...options, node: node as PerspectiveCameraSopNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterableControllable(node as BaseSopNodeType)) {\n\t\t\t\t\treturn new CenterableNodeHandler({...options, node: node as BoxSopNode});\n\t\t\t\t}\n\t\t\t\tif (isTransformCadControllable(node as BaseCADSopNodeType)) {\n\t\t\t\t\treturn new TransformCadNodeHandler({...options, node: node as CADTransformSopNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterable2DXYControllable(node as BaseCADSopNodeType)) {\n\t\t\t\t\treturn new Centerable2DXYNodeHandler({...options, node: node as CADPoint2DSopNode});\n\t\t\t\t}\n\t\t\t\tif (isCenterable2DXZControllable(node as BaseCADSopNodeType)) {\n\t\t\t\t\treturn new Centerable2DXZNodeHandler({...options, node: node as CSGArcSopNode});\n\t\t\t\t}\n\t\t\t\tif (isTransform2DCadControllable(node as BaseSopNodeType)) {\n\t\t\t\t\treturn new Transform2DCadNodeHandler({...options, node: node as CADTransform2DSopNode});\n\t\t\t\t}\n\t\t\t\tif (isTransform2DCsgControllable(node as BaseSopNodeType)) {\n\t\t\t\t\treturn new Transform2DCsgNodeHandler({...options, node: node as CSGTransform2DSopNode});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction isNodeTransformable(node: BaseNodeType) {\n\t\tswitch (node.context()) {\n\t\t\tcase NodeContext.GL: {\n\t\t\t\treturn (\n\t\t\t\t\tisTransformGlJsControllable(node as BaseGlNodeType) ||\n\t\t\t\t\tisCenterable2DXYControllable(node as BaseGlNodeType) ||\n\t\t\t\t\tisCenterableControllable(node as BaseGlNodeType)\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase NodeContext.JS: {\n\t\t\t\treturn (\n\t\t\t\t\tisTransformGlJsControllable(node as BaseGlNodeType) ||\n\t\t\t\t\tisCenterable2DXYControllable(node as BaseJsNodeType) ||\n\t\t\t\t\tisCenterableControllable(node as BaseJsNodeType)\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase NodeContext.OBJ: {\n\t\t\t\treturn node.p.t != null && node.p.r != null && node.p.s != null;\n\t\t\t}\n\t\t\tcase NodeContext.SOP: {\n\t\t\t\treturn (\n\t\t\t\t\tisTransformSopControllable(node as BaseSopNodeType) ||\n\t\t\t\t\tisPositionRotationSopControllable(node as BaseSopNodeType) ||\n\t\t\t\t\tisCenterableControllable(node as BaseSopNodeType) ||\n\t\t\t\t\tisTransformCadControllable(node as BaseCADSopNodeType) ||\n\t\t\t\t\tisCenterable2DXYControllable(node as BaseCADSopNodeType) ||\n\t\t\t\t\tisCenterable2DXZControllable(node as BaseCSGSopNodeType) ||\n\t\t\t\t\tisTransform2DCadControllable(node as BaseCADSopNodeType) ||\n\t\t\t\t\tisTransform2DCsgControllable(node as BaseCSGSopNodeType)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction onKeyDown(event: KeyboardEvent) {\n\t\tnodeHandler?.onKeyDown(event);\n\t}\n\tfunction onKeyUp(event: KeyboardEvent) {\n\t\tnodeHandler?.onKeyUp(event);\n\t}\n\n\treturn {};\n}\n","import {ref, Ref, onMounted, onUnmounted, computed, watch} from 'vue';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {BaseViewerType} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/_Base';\n\nexport function SetupViewerResolution(\n\tviewer_container: Ref<HTMLElement | null>,\n\tviewerContainerApi: Ref<HTMLElement | null>\n) {\n\tconst resolution = ref({x: 0, y: 0});\n\tconst elementPresent = ref(false);\n\n\tonMounted(() => {\n\t\taddResizeEvent();\n\t});\n\tonUnmounted(() => {\n\t\tremoveResizeEvent();\n\t});\n\n\tfunction registerOnResizeForViewer(viewer: BaseViewerType) {\n\t\tviewer.registerOnResizeCallback(onResize);\n\t}\n\tfunction unregisterOnResizeForViewer(viewer: BaseViewerType) {\n\t\tviewer.unregisterOnResizeCallback(onResize);\n\t}\n\n\tfunction onResize() {\n\t\tlet element = viewer_container.value;\n\t\tif (!element) {\n\t\t\telement = viewerContainerApi.value;\n\t\t}\n\t\telementPresent.value = element != null;\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\t\tconst box = element.getBoundingClientRect();\n\t\tresolution.value.x = Math.floor(box.width);\n\t\tresolution.value.y = Math.floor(box.height);\n\t}\n\tfunction addResizeEvent() {\n\t\twindow.addEventListener('resize', onResize);\n\t\tsetTimeout(() => {\n\t\t\twindow.dispatchEvent(new Event('resize'));\n\t\t}, 500);\n\t}\n\tfunction removeResizeEvent() {\n\t\twindow.removeEventListener('resize', onResize);\n\t}\n\n\tconst displayViewerResolutionLabel = computed(() => {\n\t\treturn (\n\t\t\telementPresent.value &&\n\t\t\t(StoreController.editor.splitPanels.dragInprogress() ||\n\t\t\t\tStoreController.editor.splitPanels.windowResizeInProgress())\n\t\t);\n\t});\n\twatch(displayViewerResolutionLabel, () => {\n\t\tsetTimeout(() => {\n\t\t\tif (displayViewerResolutionLabel.value == false) {\n\t\t\t\tStoreController.editor.splitPanels.triggerWindowResizeWithoutEvent();\n\t\t\t}\n\t\t}, 100);\n\t});\n\n\tconst viewerResolutionLabel = computed(() => {\n\t\treturn `${resolution.value.x} x ${resolution.value.y}`;\n\t});\n\n\treturn {\n\t\tdisplayViewerResolutionLabel,\n\t\tviewerResolutionLabel,\n\t\tregisterOnResizeForViewer,\n\t\tunregisterOnResizeForViewer,\n\t};\n}\n","import {computed, onMounted, onUnmounted, ref} from 'vue';\nimport {Editor} from '../../../../Editor';\n\nexport function SetupViewerRegister() {\n\tconst viewerId = ref(Editor.instance().viewerComponentsRegister.nextId());\n\n\tonMounted(() => {\n\t\tEditor.instance().viewerComponentsRegister.registerViewerComponent(viewerId.value);\n\t});\n\tonUnmounted(() => {\n\t\tEditor.instance().viewerComponentsRegister.unregisterViewerComponent(viewerId.value);\n\t});\n\n\tconst isFirstRegistered = computed(() => {\n\t\treturn Editor.instance().viewerComponentsRegister.isFirstRegistered(viewerId.value);\n\t});\n\n\treturn {viewerId, isFirstRegistered};\n}\n\nexport type SetupViewerRegisterReturn = ReturnType<typeof SetupViewerRegister>;\n","var Stats = function () {\n\n\tvar mode = 0;\n\n\tvar container = document.createElement( 'div' );\n\tcontainer.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n\tcontainer.addEventListener( 'click', function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tshowPanel( ++ mode % container.children.length );\n\n\t}, false );\n\n\t//\n\n\tfunction addPanel( panel ) {\n\n\t\tcontainer.appendChild( panel.dom );\n\t\treturn panel;\n\n\t}\n\n\tfunction showPanel( id ) {\n\n\t\tfor ( var i = 0; i < container.children.length; i ++ ) {\n\n\t\t\tcontainer.children[ i ].style.display = i === id ? 'block' : 'none';\n\n\t\t}\n\n\t\tmode = id;\n\n\t}\n\n\t//\n\n\tvar beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n\n\tvar fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n\tvar msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );\n\n\tif ( self.performance && self.performance.memory ) {\n\n\t\tvar memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n\t}\n\n\tshowPanel( 0 );\n\n\treturn {\n\n\t\tREVISION: 16,\n\n\t\tdom: container,\n\n\t\taddPanel: addPanel,\n\t\tshowPanel: showPanel,\n\n\t\tbegin: function () {\n\n\t\t\tbeginTime = ( performance || Date ).now();\n\n\t\t},\n\n\t\tend: function () {\n\n\t\t\tframes ++;\n\n\t\t\tvar time = ( performance || Date ).now();\n\n\t\t\tmsPanel.update( time - beginTime, 200 );\n\n\t\t\tif ( time >= prevTime + 1000 ) {\n\n\t\t\t\tfpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n\t\t\t\tprevTime = time;\n\t\t\t\tframes = 0;\n\n\t\t\t\tif ( memPanel ) {\n\n\t\t\t\t\tvar memory = performance.memory;\n\t\t\t\t\tmemPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn time;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tbeginTime = this.end();\n\n\t\t},\n\n\t\t// Backwards Compatibility\n\n\t\tdomElement: container,\n\t\tsetMode: showPanel\n\n\t};\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n\tvar min = Infinity, max = 0, round = Math.round;\n\tvar PR = round( window.devicePixelRatio || 1 );\n\n\tvar WIDTH = 80 * PR, HEIGHT = 48 * PR,\n\t\tTEXT_X = 3 * PR, TEXT_Y = 2 * PR,\n\t\tGRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n\t\tGRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tcanvas.width = WIDTH;\n\tcanvas.height = HEIGHT;\n\tcanvas.style.cssText = 'width:80px;height:48px';\n\n\tvar context = canvas.getContext( '2d' );\n\tcontext.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n\tcontext.textBaseline = 'top';\n\n\tcontext.fillStyle = bg;\n\tcontext.fillRect( 0, 0, WIDTH, HEIGHT );\n\n\tcontext.fillStyle = fg;\n\tcontext.fillText( name, TEXT_X, TEXT_Y );\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\tcontext.fillStyle = bg;\n\tcontext.globalAlpha = 0.9;\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\treturn {\n\n\t\tdom: canvas,\n\n\t\tupdate: function ( value, maxValue ) {\n\n\t\t\tmin = Math.min( min, value );\n\t\t\tmax = Math.max( max, value );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 1;\n\t\t\tcontext.fillRect( 0, 0, WIDTH, GRAPH_Y );\n\t\t\tcontext.fillStyle = fg;\n\t\t\tcontext.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n\t\t\tcontext.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 0.9;\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n\t\t}\n\n\t};\n\n};\n\nexport default Stats;\n","import Stats from 'three/examples/jsm/libs/stats.module';\nexport abstract class StatsClass {\n\tpublic domElement!: HTMLElement;\n\tabstract update(): void;\n}\nexport function createStats() {\n\tconst stats = new (Stats as any)() as StatsClass;\n\treturn stats;\n}\n\nimport {BaseViewerType} from '../_Base';\n\nconst CALLBACK_NAME = 'viewer-stats';\nexport function addStatsToViewer(viewer: BaseViewerType) {\n\tconst stats = new Stats();\n\tconst viewerElement = viewer.domElement();\n\tif (!viewerElement) {\n\t\tconsole.warn('viewer has no element');\n\t\treturn;\n\t}\n\tviewerElement.appendChild(stats.dom);\n\n\tviewer.registerOnAfterRender(CALLBACK_NAME, () => {\n\t\tstats.update();\n\t});\n\tconst removeStatsFromViewer = () => {\n\t\tviewer.unRegisterOnAfterRender(CALLBACK_NAME);\n\t};\n\n\treturn {viewerElement, stats, removeStatsFromViewer};\n}\n","import {Ref, ref, watch} from 'vue';\nimport {BaseViewerContainerObject} from './Capture';\nimport {StatsClass, createStats} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/utils/Stats';\n\nlet nextId = 0;\n\nexport function SetupViewerStats(\n\tviewerContainer: Ref<HTMLElement | null>,\n\tviewerContainerObject: BaseViewerContainerObject\n) {\n\tconst statsActive = ref<boolean>(false);\n\tconst callbackName = `stats-${(nextId += 1)}`;\n\n\tlet stats: StatsClass | undefined;\n\tfunction _createStats() {\n\t\tconst _stats = createStats();\n\t\t_stats.domElement.style.position = 'absolute';\n\t\t// stats.domElement.style.top = '0px';\n\t\t_stats.domElement.style.left = ''; // necessary to cancel the left hardcoded in Stats\n\t\t_stats.domElement.style.right = '0px';\n\t\treturn _stats;\n\t}\n\twatch(statsActive, updateViewer);\n\tfunction updateViewer() {\n\t\tif (statsActive.value) {\n\t\t\t_addStats();\n\t\t} else {\n\t\t\t_removeStats();\n\t\t}\n\t}\n\tfunction _addStats() {\n\t\tstats = stats || _createStats();\n\t\tconst element = viewerContainer.value;\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\treturn;\n\t\t}\n\t\telement.appendChild(stats.domElement);\n\t\tviewer.registerOnAfterRender(callbackName, _updateStats);\n\t}\n\n\tfunction _removeStats() {\n\t\tif (!stats) {\n\t\t\treturn;\n\t\t}\n\t\tconst element = viewerContainer.value;\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\treturn;\n\t\t}\n\t\tif (stats.domElement.parentElement == element) {\n\t\t\telement.removeChild(stats.domElement);\n\t\t}\n\t\tviewer.unRegisterOnAfterRender(callbackName);\n\t}\n\tfunction _updateStats() {\n\t\tif (!stats) {\n\t\t\treturn;\n\t\t}\n\t\tstats.update();\n\t}\n\tfunction toggleStatsActive() {\n\t\tstatsActive.value = !statsActive.value;\n\t}\n\n\treturn {\n\t\tstatsActive,\n\t\ttoggleStatsActive,\n\t\tupdateViewer,\n\t};\n}\n","import {Ref, ref, computed} from 'vue';\n\nexport interface SetupViewerHintsOptions {\n\toverlayNetworkAllowed: Ref<boolean>;\n}\n\nexport function SetupViewerHints(options: SetupViewerHintsOptions) {\n\tconst {overlayNetworkAllowed} = options;\n\tconst currentOperationViewerHints: Ref<string[]> = ref([]);\n\tconst viewerHints = computed(() => {\n\t\tif (currentOperationViewerHints.value.length > 0) {\n\t\t\treturn currentOperationViewerHints.value;\n\t\t}\n\n\t\tconst controls: string[] = ['Ctrl+B: toggle full screen', 'F: frame camera'];\n\t\tif (overlayNetworkAllowed.value) {\n\t\t\tcontrols.push('G: toggle overlay network');\n\t\t}\n\t\treturn [controls.join(' / ')];\n\t});\n\n\treturn {viewerHints, currentOperationViewerHints};\n}\n","import {BaseViewerContainerObject} from './Capture';\nimport {CameraControlsNodeType, NodeContext} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport type {CameraOrbitControlsEventNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/event/CameraOrbitControls';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {Object3D, Box3, Vector3} from 'three';\nimport {ParamSetCommand} from '../../../../history/commands/ParamSet';\nimport {Editor} from '../../../../Editor';\nimport {BaseObjNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/obj/_Base';\nimport {TransformControls} from './controls/_BaseTransform';\nimport {isArray} from '../../../../../../@polygonjs/polygonjs/src/core/Type';\n\ninterface SetupCameraFrameOptions {\n\tviewerContainerObject: BaseViewerContainerObject;\n\tsetupLinkIndex: SetupLinkIndexReturn;\n}\nconst EPS = 0.001;\n\nexport function SetupCameraFrame(options: SetupCameraFrameOptions) {\n\tconst {setupLinkIndex, viewerContainerObject} = options;\n\n\t// const jsonNode = computed(() => {\n\t// \tconst id = StoreController.editor.current_node_graph_id(setupLinkIndex.linkIndex.value);\n\t// \tif (id != null) {\n\t// \t\treturn StoreController.engine.json_node(id);\n\t// \t}\n\t// });\n\t// const parentNodePath = computed(() => {\n\t// \tif (jsonNode.value == null) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst node = StoreController.engine.node(jsonNode.value.graph_node_id);\n\t// \tif (!node) {\n\t// \t\treturn;\n\t// \t}\n\t// \treturn node.path();\n\t// });\n\tconst _previousParentByObject: Map<Object3D, Object3D> = new Map();\n\tconst _objectsToRemove: Set<Object3D> = new Set();\n\tfunction _removeInfiniteObjects(objects: Object3D[]) {\n\t\t_previousParentByObject.clear();\n\t\t_objectsToRemove.clear();\n\t\tfor (let object of objects) {\n\t\t\tobject.traverse((child) => {\n\t\t\t\tif (child instanceof TransformControls) {\n\t\t\t\t\t_objectsToRemove.add(child);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t_objectsToRemove.forEach((child) => {\n\t\t\tconst parent = child.parent;\n\t\t\tif (parent) {\n\t\t\t\t_previousParentByObject.set(child, parent);\n\t\t\t}\n\t\t});\n\t\t_objectsToRemove.forEach((child) => {\n\t\t\tconst parent = child.parent;\n\t\t\tif (parent) {\n\t\t\t\tparent.remove(child);\n\t\t\t}\n\t\t});\n\t}\n\tfunction _restoreInfiniteObjects() {\n\t\t_previousParentByObject.forEach((parent, child) => {\n\t\t\tparent.add(child);\n\t\t});\n\t}\n\n\tconst selectedNodes: BaseObjNodeType[] = [];\n\tfunction _targetObject(): Object3D | Object3D[] | undefined {\n\t\tconst nodeId = StoreController.editor.current_node_graph_id(setupLinkIndex.linkIndex.value);\n\t\tif (nodeId == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst node = StoreController.engine.node(nodeId);\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tif (node == StoreController.scene.root()) {\n\t\t\tconst root = StoreController.scene.root();\n\t\t\tselectedNodes.length = 0;\n\t\t\troot.childrenController?.selection?.nodes(selectedNodes);\n\t\t\treturn selectedNodes.length > 0 ? selectedNodes.map((n) => n.object) : undefined;\n\t\t}\n\n\t\tif (node.context() == NodeContext.OBJ) {\n\t\t\treturn (node as BaseObjNodeType).object;\n\t\t}\n\t\tconst geoNode = node.firstAncestorWithContext(NodeContext.OBJ);\n\t\tif (geoNode) {\n\t\t\treturn geoNode.object;\n\t\t}\n\t\treturn;\n\t}\n\tconst box3 = new Box3();\n\tconst center = new Vector3();\n\tconst size = new Vector3();\n\tconst delta = new Vector3();\n\n\tasync function frameCamera() {\n\t\tconst viewer = viewerContainerObject.viewer;\n\t\tif (!viewer) {\n\t\t\treturn;\n\t\t}\n\t\tconst camera = viewer.camera();\n\t\tconst controlsNode = viewer.controlsNode();\n\t\tif (!controlsNode) {\n\t\t\treturn;\n\t\t}\n\t\tif (controlsNode.type() != CameraControlsNodeType.ORBIT) {\n\t\t\treturn;\n\t\t}\n\t\tconst orbitControlsNode = controlsNode as CameraOrbitControlsEventNode;\n\n\t\tconst targetObject = _targetObject() || StoreController.scene.threejsScene();\n\t\tif (!targetObject) {\n\t\t\treturn;\n\t\t}\n\t\tconst objects = isArray(targetObject) ? targetObject : [targetObject];\n\t\t_removeInfiniteObjects(objects);\n\t\tbox3.makeEmpty();\n\t\tfor (let object of objects) {\n\t\t\tobject.traverse((child) => {\n\t\t\t\tbox3.expandByObject(child);\n\t\t\t});\n\t\t}\n\t\tbox3.getCenter(center);\n\t\tbox3.getSize(size);\n\t\tsize.x = size.x < EPS ? 0.1 : size.x;\n\t\tsize.y = size.y < EPS ? 0.1 : size.y;\n\t\tsize.z = size.z < EPS ? 0.1 : size.z;\n\t\t_restoreInfiniteObjects();\n\n\t\tconst targetParam = orbitControlsNode.p.target;\n\t\tconst cmd = new ParamSetCommand(targetParam, center.toArray());\n\t\tawait Editor.instance().pushCommand(cmd);\n\n\t\t//\n\t\tdelta.copy(camera.position).sub(center);\n\t\tdelta.normalize().multiplyScalar(size.length() * 1.5);\n\t\tcamera.position.copy(center).add(delta);\n\t\tcamera.updateMatrix();\n\t}\n\n\treturn {\n\t\tframeCamera,\n\t};\n}\n","import {isBooleanTrue} from '../../../../../../@polygonjs/polygonjs/src/core/Type';\nimport {Ref, watch} from 'vue';\nimport {KeyEventProcessor, KeyEventsDispatcher} from '../../../../helpers/KeyEventsDispatcher';\nimport {BreakableFunction, ViewerKey, ViewerKeyActionName, VIEWER_ACTION_NAME_BY_KEY} from './Common';\n\ninterface SetupEventKeyOptions {\n\toverlayNetworkAllowed: Ref<boolean>;\n\toverlayNetworkDisplayed: Ref<boolean>;\n\tpanelId: string;\n\tframeCamera: Function;\n\temit: (eventName: string) => void;\n}\n\nexport function SetupEventKey(options: SetupEventKeyOptions) {\n\tconst {overlayNetworkAllowed, overlayNetworkDisplayed, panelId, frameCamera, emit} = options;\n\tfunction onKeypress(event: KeyboardEvent) {\n\t\treturn false;\n\t}\n\n\tconst _frameCamera: BreakableFunction = () => {\n\t\tframeCamera();\n\t\treturn true;\n\t};\n\tconst _toggleOverlayNetworkIfVisible: BreakableFunction = () => {\n\t\tif (overlayNetworkAllowed.value == true) {\n\t\t\toverlayNetworkDisplayed.value = !overlayNetworkDisplayed.value;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\tconst FUNCTION_BY_ACTION: Record<ViewerKeyActionName, BreakableFunction> = {\n\t\t[ViewerKeyActionName.FRAME_CAMERA]: _frameCamera,\n\t\t// case 'Space': // not sure why Space was here, it probably should not toggle the network display\n\t\t// this now uses g instead of d, as to not conflict with the network d which navigates to the next node.\n\t\t// Also: make sure that the network has the corresponding key, that emits the 'hide' event.\n\t\t[ViewerKeyActionName.TOGGLE_OVERLAY_NETWORK]: _toggleOverlayNetworkIfVisible,\n\t};\n\n\tfunction onKeydown(event: KeyboardEvent): boolean {\n\t\tlet keyProcessed = false;\n\t\tconst actionName = VIEWER_ACTION_NAME_BY_KEY[event.key as ViewerKey];\n\t\tif (actionName) {\n\t\t\tconst action = FUNCTION_BY_ACTION[actionName];\n\t\t\tkeyProcessed = action();\n\t\t}\n\t\treturn keyProcessed;\n\t}\n\n\tfunction onKeyup(event: KeyboardEvent) {\n\t\treturn false;\n\t}\n\n\tconst eventKeyOptions: KeyEventProcessor = {\n\t\tonKeypress,\n\t\tonKeydown,\n\t\tonKeyup,\n\t\tpanelId,\n\t\temit,\n\t};\n\n\tfunction registerProcessor() {\n\t\tKeyEventsDispatcher.instance().registerProcessor(eventKeyOptions);\n\t}\n\twatch(overlayNetworkDisplayed, () => {\n\t\tif (!isBooleanTrue(overlayNetworkDisplayed.value)) {\n\t\t\tregisterProcessor();\n\t\t}\n\t});\n\n\treturn eventKeyOptions;\n}\n","import {KeyEventsDispatcher, KeyEventProcessor} from '../../../../helpers/KeyEventsDispatcher';\n\ninterface Options {\n\teventKeyOptions: KeyEventProcessor;\n}\n\nexport function SetupEventMouse(options: Options) {\n\tconst {eventKeyOptions} = options;\n\n\tfunction on_pointer_move(event: MouseEvent) {\n\t\tKeyEventsDispatcher.instance().registerProcessor(eventKeyOptions);\n\t}\n\n\treturn {\n\t\ton_pointer_move,\n\t};\n}\n","import {Ref, ref, computed} from 'vue';\nimport {ViewerPanelInitLayoutData, NetworkPanelInitLayoutData} from '../../../../types';\nimport {KEY_BY_VIEWER_ACTION, ViewerKeyActionName} from './Common';\n\ninterface SetupNetworkOverlayOptions {\n\tprops: {\n\t\tpanelId: string;\n\t\tinit_layout_data: ViewerPanelInitLayoutData;\n\t};\n}\n\nexport function SetupNetworkOverlay(options: SetupNetworkOverlayOptions) {\n\tconst {props} = options;\n\tconst networkCore = ref<HTMLElement | null>(null);\n\tconst overlayedNetworkPanelId = ref(`${props.panelId}-overlayedNetwork`);\n\tconst overlayNetworkAllowed = ref(false);\n\tconst overlayNetworkDisplayed = ref(false);\n\tconst overlayedNetworkInitLayoutData: Ref<NetworkPanelInitLayoutData> = ref({\n\t\tlinkIndex: props.init_layout_data.linkIndex,\n\t\tcamera: {position: {x: 0, y: 0}, zoom: 1},\n\t\thistory: {},\n\t\tparamsDisplayed: false,\n\t});\n\n\tfunction toggleOverlayedNetwork() {\n\t\toverlayNetworkDisplayed.value = !overlayNetworkDisplayed.value;\n\t}\n\tfunction hideOverlayedNetwork() {\n\t\toverlayNetworkDisplayed.value = false;\n\t}\n\tfunction toggledAllowOverlayNetwork() {\n\t\tif (overlayNetworkAllowed.value == false) {\n\t\t\toverlayNetworkAllowed.value = true;\n\t\t\toverlayNetworkDisplayed.value = true;\n\t\t} else {\n\t\t\toverlayNetworkAllowed.value = false;\n\t\t}\n\t}\n\tconst toggleAllowOverlayNetworkButtonTitle = computed(() => {\n\t\tconst key = KEY_BY_VIEWER_ACTION[ViewerKeyActionName.TOGGLE_OVERLAY_NETWORK];\n\t\treturn `Toggle Overlayed Network (press this button once, then press '${key}' to toggle)`;\n\t});\n\n\treturn {\n\t\tnetworkCore,\n\t\toverlayedNetworkPanelId,\n\t\toverlayNetworkAllowed,\n\t\toverlayNetworkDisplayed,\n\t\toverlayedNetworkInitLayoutData,\n\t\ttoggleOverlayedNetwork,\n\t\thideOverlayedNetwork,\n\t\ttoggledAllowOverlayNetwork,\n\t\ttoggleAllowOverlayNetworkButtonTitle,\n\t};\n}\n","import {BaseViewerType} from '../../../../../../@polygonjs/polygonjs/src/engine/viewers/_Base';\n\nexport class EditorViewersRegisterClass {\n\tprivate static _instance: EditorViewersRegisterClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new EditorViewersRegisterClass());\n\t}\n\tprivate constructor() {}\n\n\tprivate _viewersById: Map<string, BaseViewerType> = new Map();\n\n\tregisterViewer(viewer: BaseViewerType) {\n\t\tthis._viewersById.set(viewer.id(), viewer);\n\t}\n\tunregisterViewer(viewer: BaseViewerType) {\n\t\tthis._viewersById.delete(viewer.id());\n\t}\n\ttraverseViewers(callback: (viewer: BaseViewerType) => void) {\n\t\tthis._viewersById.forEach(callback);\n\t}\n}\nexport const EditorViewersRegister = EditorViewersRegisterClass.instance();\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"absolute bottom-0 text-center w-full pointer-events-none select-none\" }\nconst _hoisted_2 = { class: \"relative text-gray-600 text-xs mx-auto\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.lines, (line) => {\n      return (_openBlock(), _createElementBlock(\"div\", _hoisted_2, _toDisplayString(line), 1 /* TEXT */))\n    }), 256 /* UNKEYED_FRAGMENT */))\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ViewerHints.vue?vue&type=template&id=28524e20&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ViewerHints.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ViewerHints.vue?vue&type=script&lang=ts\"","import { render } from \"./ViewerHints.vue?vue&type=template&id=28524e20&ts=true\"\nimport script from \"./ViewerHints.vue?vue&type=script&lang=ts\"\nexport * from \"./ViewerHints.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=style&index=0&id=2578fa84&lang=sass\"","import { render } from \"./Viewer.vue?vue&type=template&id=2578fa84&ts=true\"\nimport script from \"./Viewer.vue?vue&type=script&lang=ts\"\nexport * from \"./Viewer.vue?vue&type=script&lang=ts\"\n\nimport \"./Viewer.vue?vue&type=style&index=0&id=2578fa84&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Panel Custom full_height_container grid-y\" }\nconst _hoisted_2 = { class: \"text-center\" }\nconst _hoisted_3 = [\"innerHTML\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, \"Custom Panel (\" + _toDisplayString(_ctx.custom_name) + \")\", 1 /* TEXT */),\n    _createElementVNode(\"div\", {\n      class: \"panel-custom-container full_height_container grid-y\",\n      innerHTML: _ctx.html\n    }, null, 8 /* PROPS */, _hoisted_3)\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=template&id=9394139c&ts=true\"","import {CustomPanelInitLayoutData} from '../../../../types';\nimport {onBeforeMount} from 'vue';\n\nexport interface CustomPanelProps {\n\tinit_layout_data: CustomPanelInitLayoutData;\n\tcustom_name: string;\n}\n\nexport function SetupLayoutData(props: CustomPanelProps) {\n\tonBeforeMount(() => {\n\t\tfromJSON(props.init_layout_data);\n\t});\n\n\tfunction fromJSON(json: CustomPanelInitLayoutData) {}\n\n\tfunction layoutData(): CustomPanelInitLayoutData {\n\t\treturn props;\n\t}\n\n\treturn {fromJSON, layoutData};\n}\n","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=style&index=0&id=9394139c&lang=sass\"","import { render } from \"./Custom.vue?vue&type=template&id=9394139c&ts=true\"\nimport script from \"./Custom.vue?vue&type=script&lang=ts\"\nexport * from \"./Custom.vue?vue&type=script&lang=ts\"\n\nimport \"./Custom.vue?vue&type=style&index=0&id=9394139c&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=style&index=0&id=4878295c&lang=sass\"","import { render } from \"./Multiple.vue?vue&type=template&id=4878295c&ts=true\"\nimport script from \"./Multiple.vue?vue&type=script&lang=ts\"\nexport * from \"./Multiple.vue?vue&type=script&lang=ts\"\n\nimport \"./Multiple.vue?vue&type=style&index=0&id=4878295c&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"fixed inset-0 bg-gray-800 bg-opacity-25 transition-opacity\" }, null, -1 /* HOISTED */)\nconst _hoisted_2 = { class: \"fixed inset-0 z-10 overflow-y-auto p-4 sm:p-6 md:p-20\" }\nconst _hoisted_3 = { class: \"relative flex items-center bg-black\" }\nconst _hoisted_4 = { class: \"px-4\" }\nconst _hoisted_5 = {\n  hold: \"\",\n  class: \"-mx-2 text-sm text-gray-700 max-h-[50vh]\"\n}\nconst _hoisted_6 = { class: \"ml-4 flex-auto\" }\nconst _hoisted_7 = {\n  key: 1,\n  class: \"py-14 px-6 text-center text-sm sm:px-14\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_ChevronLeftIcon = _resolveComponent(\"ChevronLeftIcon\")!\n  const _component_MagnifyingGlassIcon = _resolveComponent(\"MagnifyingGlassIcon\")!\n  const _component_ComboBoxHack = _resolveComponent(\"ComboBoxHack\")!\n  const _component_ComboboxInput = _resolveComponent(\"ComboboxInput\")!\n  const _component_ChevronRightIcon = _resolveComponent(\"ChevronRightIcon\")!\n  const _component_ComboboxOption = _resolveComponent(\"ComboboxOption\")!\n  const _component_ComboboxOptions = _resolveComponent(\"ComboboxOptions\")!\n  const _component_EmptyState = _resolveComponent(\"EmptyState\")!\n  const _component_Combobox = _resolveComponent(\"Combobox\")!\n  const _component_DialogPanel = _resolveComponent(\"DialogPanel\")!\n  const _component_Dialog = _resolveComponent(\"Dialog\")!\n\n  return (_ctx.displayed)\n    ? (_openBlock(), _createBlock(_component_Dialog, {\n        key: 0,\n        as: \"div\",\n        open: true,\n        class: \"relative z-50 tab-menu-combobox-container\",\n        onClose: _ctx.close\n      }, {\n        default: _withCtx(() => [\n          _hoisted_1,\n          _createElementVNode(\"div\", _hoisted_2, [\n            _createVNode(_component_DialogPanel, { class: \"mx-auto max-w-5xl transform divide-y divide-gray-900 overflow-hidden rounded-xl bg-bg shadow-2xl ring-1 ring-black ring-opacity-5 transition-all\" }, {\n              default: _withCtx(() => [\n                _createVNode(_component_Combobox, { \"onUpdate:modelValue\": _ctx.onSelect }, {\n                  default: _withCtx(({activeOption, activeIndex}) => [\n                    _createElementVNode(\"div\", _hoisted_3, [\n                      _createElementVNode(\"span\", {\n                        class: _normalizeClass([\n\t\t\t\t\t\t\t\t'h-full p-4 cursor-pointer bg-amber-600 hover:bg-amber-900',\n\t\t\t\t\t\t\t\t_ctx.displayBackButton ? 'opacity-100' : 'opacity-0',\n\t\t\t\t\t\t\t]),\n                        onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.goBack && _ctx.goBack(...args)))\n                      }, [\n                        _createVNode(_component_ChevronLeftIcon, {\n                          class: \"h-5 w-5 text-gray-400\",\n                          \"aria-hidden\": \"true\"\n                        })\n                      ], 2 /* CLASS */),\n                      _createElementVNode(\"span\", _hoisted_4, [\n                        _createVNode(_component_MagnifyingGlassIcon, {\n                          class: \"pointer-events-none h-5 w-5 text-gray-400\",\n                          \"aria-hidden\": \"true\"\n                        })\n                      ]),\n                      (_openBlock(), _createBlock(_component_ComboBoxHack, {\n                        index: activeIndex,\n                        key: activeIndex,\n                        onChange: _ctx.onIndexChange\n                      }, null, 8 /* PROPS */, [\"index\", \"onChange\"])),\n                      _createVNode(_component_ComboboxInput, {\n                        class: \"h-12 w-full border-0 px-4 text-gray-200 bg-black placeholder-gray-400 focus:ring-0 sm:text-sm\",\n                        placeholder: \"Search Any Node...\",\n                        onChange: _cache[1] || (_cache[1] = ($event: any) => (_ctx.query = $event.target.value)),\n                        onKeydown: _ctx.onKeydown\n                      }, null, 8 /* PROPS */, [\"onKeydown\"])\n                    ]),\n                    (_ctx.menuEntries.length > 0)\n                      ? (_openBlock(), _createBlock(_component_ComboboxOptions, {\n                          key: 0,\n                          class: \"flex divide-x divide-gray-900\",\n                          as: \"div\",\n                          static: \"\",\n                          hold: \"\"\n                        }, {\n                          default: _withCtx(() => [\n                            _createElementVNode(\"div\", {\n                              class: _normalizeClass([\n\t\t\t\t\t\t\t\t'h-full min-w-0 flex-auto scroll-py-4 overflow-y-auto px-6 py-4',\n\t\t\t\t\t\t\t\tactiveOption && 'sm:h-full',\n\t\t\t\t\t\t\t])\n                            }, [\n                              _createCommentVNode(\" <h2 v-if=\\\"query === ''\\\" class=\\\"mt-2 mb-4 text-xs font-semibold text-gray-500\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\tRecent searches\\n\\t\\t\\t\\t\\t\\t\\t</h2> \"),\n                              _createElementVNode(\"div\", _hoisted_5, [\n                                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.menuEntries, (entry) => {\n                                  return (_openBlock(), _createBlock(_component_ComboboxOption, {\n                                    key: entry.id,\n                                    value: entry,\n                                    as: \"template\"\n                                  }, {\n                                    default: _withCtx(({active}) => [\n                                      _createElementVNode(\"li\", {\n                                        class: _normalizeClass([\n\t\t\t\t\t\t\t\t\t\t\t'flex select-none rounded-xl p-3 cursor-pointer',\n\t\t\t\t\t\t\t\t\t\t\tactive && 'bg-bg-dark',\n\t\t\t\t\t\t\t\t\t\t])\n                                      }, [\n                                        _createElementVNode(\"div\", _hoisted_6, [\n                                          _createElementVNode(\"p\", {\n                                            class: _normalizeClass([\n\t\t\t\t\t\t\t\t\t\t\t\t\t'text-sm font-medium',\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive ? 'text-gray-100' : 'text-gray-300',\n\t\t\t\t\t\t\t\t\t\t\t\t])\n                                          }, _toDisplayString(entry.id), 3 /* TEXT, CLASS */)\n                                        ]),\n                                        (entry.children)\n                                          ? (_openBlock(), _createBlock(_component_ChevronRightIcon, {\n                                              key: 0,\n                                              class: \"flex h-4 flex-none items-center justify-center text-gray-500\",\n                                              \"aria-hidden\": \"true\"\n                                            }))\n                                          : _createCommentVNode(\"v-if\", true)\n                                      ], 2 /* CLASS */)\n                                    ]),\n                                    _: 2 /* DYNAMIC */\n                                  }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"value\"]))\n                                }), 128 /* KEYED_FRAGMENT */))\n                              ])\n                            ], 2 /* CLASS */)\n                          ]),\n                          _: 2 /* DYNAMIC */\n                        }, 1024 /* DYNAMIC_SLOTS */))\n                      : _createCommentVNode(\"v-if\", true),\n                    (_ctx.menuEntries.length === 0)\n                      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n                          _createVNode(_component_EmptyState, {\n                            title: \"No node found\",\n                            subtitle: \"We couldn’t find any node with that term. Please try again.\"\n                          })\n                        ]))\n                      : _createCommentVNode(\"v-if\", true)\n                  ]),\n                  _: 1 /* STABLE */\n                }, 8 /* PROPS */, [\"onUpdate:modelValue\"])\n              ]),\n              _: 1 /* STABLE */\n            })\n          ])\n        ]),\n        _: 1 /* STABLE */\n      }, 8 /* PROPS */, [\"onClose\"]))\n    : _createCommentVNode(\"v-if\", true)\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=template&id=6dce7fd4&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=style&index=0&id=6dce7fd4&lang=sass\"","import { render } from \"./TabMenuCombobox.vue?vue&type=template&id=6dce7fd4&ts=true\"\nimport script from \"./TabMenuCombobox.vue?vue&type=script&lang=ts\"\nexport * from \"./TabMenuCombobox.vue?vue&type=script&lang=ts\"\n\nimport \"./TabMenuCombobox.vue?vue&type=style&index=0&id=6dce7fd4&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"cell shrink bg-bg\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"text-center no_node_selected bg-bg-medium\"\n}\nconst _hoisted_3 = {\n  key: 2,\n  class: \"cell shrink\"\n}\nconst _hoisted_4 = { class: \"grid-x\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"cell shrink flex\"\n}\nconst _hoisted_6 = {\n  key: 1,\n  class: \"cell shrink flex\"\n}\nconst _hoisted_7 = { class: \"cell auto text-xs lg:text-md text-ellipsis overflow-hidden\" }\nconst _hoisted_8 = { class: \"node_name_container text-center h-5 leading-5\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"node_type hidden md:inline\"\n}\nconst _hoisted_10 = { class: \"cell shrink flex\" }\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"preset_dropdown_title inline-block text-xs h-5 leading-5 pr-1\" }, \"presets\", -1 /* HOISTED */)\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"w-2 lg:w-2 px-1\" }, null, -1 /* HOISTED */)\nconst _hoisted_13 = {\n  key: 0,\n  class: \"text-center text-xs text-text-faded p-4\"\n}\nconst _hoisted_14 = {\n  key: 1,\n  class: \"grid-y\"\n}\nconst _hoisted_15 = { class: \"cell shrink params_container\" }\nconst _hoisted_16 = { class: \"form pl-2 lg:pl-0\" }\nconst _hoisted_17 = {\n  key: 0,\n  class: \"min-w-full w-full flex flex-nowrap overflow-x-scroll md:overflow-visible\"\n}\nconst _hoisted_18 = [\"onClick\"]\nconst _hoisted_19 = {\n  key: 0,\n  class: \"cell shrink extras_container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NavigationWithLinkedIndex = _resolveComponent(\"NavigationWithLinkedIndex\")!\n  const _component_EmptyState = _resolveComponent(\"EmptyState\")!\n  const _component_MinusCircleIcon = _resolveComponent(\"MinusCircleIcon\")!\n  const _component_PlusCircleIcon = _resolveComponent(\"PlusCircleIcon\")!\n  const _component_ChevronUpIcon = _resolveComponent(\"ChevronUpIcon\")!\n  const _component_ChevronDownIcon = _resolveComponent(\"ChevronDownIcon\")!\n  const _component_DropDownMenu = _resolveComponent(\"DropDownMenu\")!\n  const _component_MapPinIcon = _resolveComponent(\"MapPinIcon\")!\n  const _component_ArrowTopRightOnSquareIcon = _resolveComponent(\"ArrowTopRightOnSquareIcon\")!\n  const _component_QuestionMarkCircleIcon = _resolveComponent(\"QuestionMarkCircleIcon\")!\n  const _component_router_link = _resolveComponent(\"router-link\")!\n  const _component_XCircleIcon = _resolveComponent(\"XCircleIcon\")!\n  const _component_ParamFieldContainer = _resolveComponent(\"ParamFieldContainer\")!\n  const _component_ParamExtrasContainer = _resolveComponent(\"ParamExtrasContainer\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"Panel Params full_height_container grid-y bg-bg-medium text-text\",\n    onPointermove: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.on_pointer_move && _ctx.on_pointer_move(...args)))\n  }, [\n    (_ctx.displayNavigationBar)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n          _createVNode(_component_NavigationWithLinkedIndex, {\n            linkIndex: _ctx.linkIndex,\n            onLinkIndexUpdate: _ctx.onLinkIndexUpdate\n          }, null, 8 /* PROPS */, [\"linkIndex\", \"onLinkIndexUpdate\"])\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    (!_ctx.JSONNode)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          _createVNode(_component_EmptyState, {\n            displayEmoji: false,\n            title: \"Parameters Panel\",\n            subtitle: \"Select any node to display and edit its \\n\\t\\t\\t\\tparameters here\"\n          })\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.displayContent)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n          _createElementVNode(\"div\", _hoisted_4, [\n            (_ctx.expandable)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n                  (_ctx.expanded)\n                    ? (_openBlock(), _createBlock(_component_MinusCircleIcon, {\n                        key: 0,\n                        class: \"ml-4 inline-block w-5 lg:w-5 cursor-pointer hover:opacity-80 mx-1\",\n                        onClick: _ctx.toggleExpanded,\n                        title: \"Show Parameters\"\n                      }, null, 8 /* PROPS */, [\"onClick\"]))\n                    : (_openBlock(), _createBlock(_component_PlusCircleIcon, {\n                        key: 1,\n                        class: \"ml-4 inline-block w-5 lg:w-5 cursor-pointer hover:opacity-80\",\n                        onClick: _ctx.toggleExpanded,\n                        title: \"Hide Parameters\"\n                      }, null, 8 /* PROPS */, [\"onClick\"]))\n                ]))\n              : _createCommentVNode(\"v-if\", true),\n            (_ctx.moveableUp || _ctx.moveableDown)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n                  _createVNode(_component_ChevronUpIcon, {\n                    class: _normalizeClass([\n\t\t\t\t\t\t\t'ml-1 inline-block w-5 lg:w-5',\n\t\t\t\t\t\t\t_ctx.moveableUp ? 'cursor-pointer hover:opacity-80' : 'opacity-0',\n\t\t\t\t\t\t]),\n                    onClick: _ctx.moveUp,\n                    title: \"Move Up\"\n                  }, null, 8 /* PROPS */, [\"class\", \"onClick\"]),\n                  _createVNode(_component_ChevronDownIcon, {\n                    class: _normalizeClass([\n\t\t\t\t\t\t\t'ml-1 mr-2 inline-block w-5 lg:w-5',\n\t\t\t\t\t\t\t_ctx.moveableDown ? 'cursor-pointer hover:opacity-80' : 'opacity-0',\n\t\t\t\t\t\t]),\n                    onClick: _ctx.moveDown,\n                    title: \"Move Down\"\n                  }, null, 8 /* PROPS */, [\"class\", \"onClick\"])\n                ]))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"div\", _hoisted_7, [\n              _createElementVNode(\"div\", _hoisted_8, [\n                _createElementVNode(\"span\", {\n                  class: \"node_name hover:text-white\",\n                  onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.onNameClick && _ctx.onNameClick(...args)))\n                }, _toDisplayString(_ctx.nodeName), 1 /* TEXT */),\n                (_ctx.nodeType)\n                  ? (_openBlock(), _createElementBlock(\"span\", _hoisted_9, \"(\" + _toDisplayString(_ctx.nodeType) + \")\", 1 /* TEXT */))\n                  : _createCommentVNode(\"v-if\", true)\n              ])\n            ]),\n            _createElementVNode(\"div\", _hoisted_10, [\n              (_ctx.has_presets)\n                ? (_openBlock(), _createBlock(_component_DropDownMenu, {\n                    label: 'presets',\n                    label_padding: [0, 0],\n                    entries: _ctx.preset_entries,\n                    onSelect: _ctx.use_preset,\n                    key: _ctx.presets_key,\n                    right_aligned: false\n                  }, {\n                    default: _withCtx(() => [\n                      _hoisted_11\n                    ]),\n                    _: 1 /* STABLE */\n                  }, 8 /* PROPS */, [\"entries\", \"onSelect\"]))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.displayGoToNodeButton)\n                ? (_openBlock(), _createBlock(_component_MapPinIcon, {\n                    key: 1,\n                    class: \"ml-4 inline-block w-5 lg:w-5 cursor-pointer hover:opacity-80 mx-1\",\n                    onClick: _ctx.emitGoToNode,\n                    title: \"Go To Node\"\n                  }, null, 8 /* PROPS */, [\"onClick\"]))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.displayOpenInModal)\n                ? (_openBlock(), _createBlock(_component_ArrowTopRightOnSquareIcon, {\n                    key: 2,\n                    class: \"inline-block w-5 lg:w-5 cursor-pointer hover:opacity-80 mx-1\",\n                    onClick: _ctx.openParamsModal,\n                    title: \"Open Params In Modal\"\n                  }, null, 8 /* PROPS */, [\"onClick\"]))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.displayHelpButton && _ctx.display_node_doc_help)\n                ? (_openBlock(), _createBlock(_component_router_link, {\n                    key: 3,\n                    class: \"node_help_button cursor-pointer px-1 text-text hover:text-text-light bg-bg-medium\",\n                    to: _ctx.nodeDocUrl,\n                    target: \"_blank\"\n                  }, {\n                    default: _withCtx(() => [\n                      _createVNode(_component_QuestionMarkCircleIcon, { class: \"w-5 lg:w-5\" })\n                    ]),\n                    _: 1 /* STABLE */\n                  }, 8 /* PROPS */, [\"to\"]))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.displayCloseButton)\n                ? (_openBlock(), _createBlock(_component_XCircleIcon, {\n                    key: 4,\n                    class: \"inline-block w-5 lg:w-5 text-red-400 mx-1 cursor-pointer hover:opacity-80\",\n                    onClick: _ctx.emitClose,\n                    title: \"Remove Params\"\n                  }, null, 8 /* PROPS */, [\"onClick\"]))\n                : _createCommentVNode(\"v-if\", true),\n              _hoisted_12\n            ])\n          ])\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    (_ctx.JSONNode && _ctx.expanded)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 3,\n          class: _normalizeClass(['cell  ', _ctx.overflowYAuto ? 'auto overflow-y-auto styled-scroll-bar' : 'shrink'])\n        }, [\n          (_ctx.JSONNode.param_ids.length == 0)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, \" This node has no parameters \"))\n            : (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n                _createElementVNode(\"div\", _hoisted_15, [\n                  _createElementVNode(\"div\", _hoisted_16, [\n                    (_ctx.display_top_folders)\n                      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [\n                          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.top_folder_json_params, (json_param, i) => {\n                            return (_openBlock(), _createElementBlock(\"div\", {\n                              class: _normalizeClass([\"flex-1 params_folder\", _ctx.folder_class_objects[i]])\n                            }, [\n                              (json_param && json_param.name.length > 0)\n                                ? (_openBlock(), _createElementBlock(\"div\", {\n                                    key: 0,\n                                    class: _normalizeClass([\"folder_name disable-select border-b-2 opacity-80 hover:opacity-100\", [_ctx.folderActiveStates[i] ? 'border-white text-white' : 'border-bg-light']]),\n                                    onClick: ($event: any) => (_ctx.set_active_folder_id(json_param.graph_node_id))\n                                  }, _toDisplayString(json_param.name), 11 /* TEXT, CLASS, PROPS */, _hoisted_18))\n                                : _createCommentVNode(\"v-if\", true)\n                            ], 2 /* CLASS */))\n                          }), 256 /* UNKEYED_FRAGMENT */))\n                        ]))\n                      : _createCommentVNode(\"v-if\", true),\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.displayedSelectedNodeJsonParamsForCurrentFolder, (json_param, i) => {\n                      return (_openBlock(), _createBlock(_component_ParamFieldContainer, {\n                        json_param: json_param,\n                        key: json_param.graph_node_id,\n                        tooltip: _ctx.tooltips[json_param.name],\n                        linkIndex: _ctx.linkIndex,\n                        paramIndex: i,\n                        params: _ctx.displayedSelectedNodeJsonParamsForCurrentFolder,\n                        onToggleFullScreen: _ctx.toggleFullScreen\n                      }, null, 8 /* PROPS */, [\"json_param\", \"tooltip\", \"linkIndex\", \"paramIndex\", \"params\", \"onToggleFullScreen\"]))\n                    }), 128 /* KEYED_FRAGMENT */))\n                  ])\n                ]),\n                _createCommentVNode(\" <div class=\\\"cell shrink inputs_container\\\" v-if=\\\"showInputsContainer\\\" :key=\\\"inputsContainerKey\\\">\\n\\t\\t\\t\\t\\t<ParamInputsContainer :nodeId=\\\"nodeIdJSON\\\"></ParamInputsContainer>\\n\\t\\t\\t\\t</div> \"),\n                (_ctx.showExtrasContainer)\n                  ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [\n                      (_openBlock(), _createBlock(_component_ParamExtrasContainer, {\n                        nodeId: _ctx.nodeIdJSON,\n                        key: _ctx.extrasContainerKey\n                      }, null, 8 /* PROPS */, [\"nodeId\"]))\n                    ]))\n                  : _createCommentVNode(\"v-if\", true)\n              ]))\n        ], 2 /* CLASS */))\n      : _createCommentVNode(\"v-if\", true)\n  ], 32 /* HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=template&id=5e2ef8c2&ts=true\"","import {ArrayUtils} from './../../../../../../@polygonjs/polygonjs/src/core/ArrayUtils';\nimport {EngineParamData} from '../../../../store/modules/Engine';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {ParamType} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport type {NodeSerializerData} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {ref, onMounted, computed, watch, Ref} from 'vue';\n// import {FolderParam} from '../../../../../engine/params/Folder';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\n\nexport function SetupFolders(JSONNode: Ref<NodeSerializerData | null>) {\n\tconst active_folder_param_id = ref<CoreGraphNodeId | null>(null);\n\tconst history_active_folder_id_by_param_graph_id: Map<CoreGraphNodeId, CoreGraphNodeId> = new Map();\n\n\tconst selected_graph_node_id = computed(() => {\n\t\treturn JSONNode.value?.graph_node_id;\n\t});\n\tfunction add_to_store_if_required() {\n\t\tif (JSONNode.value) {\n\t\t\t// check that params have been added to the store\n\t\t\tconst first_id = JSONNode.value.param_ids[0];\n\t\t\tif (first_id) {\n\t\t\t\tconst first_json_param = StoreController.engine.json_param(first_id);\n\t\t\t\tif (!first_json_param) {\n\t\t\t\t\tStoreController.engine.addNodeParamsToStore(JSONNode.value.graph_node_id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tinit_folder_name();\n\t\t}\n\t}\n\n\tconst json_params = computed(() => {\n\t\tif (JSONNode.value) {\n\t\t\treturn JSONNode.value.param_ids.map((param_id) => StoreController.engine.json_param(param_id));\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\tconst top_folder_json_params = computed(() => {\n\t\treturn json_params.value.filter((json_param) => {\n\t\t\tif (json_param) {\n\t\t\t\treturn _is_json_param_top_folder(json_param);\n\t\t\t}\n\t\t});\n\t});\n\tconst display_top_folders = computed(() => {\n\t\t// no need to display folders if there is only 1\n\t\treturn top_folder_json_params.value.length > 1;\n\t});\n\n\t// const top_folder_names = computed(() => {\n\t// \treturn top_folder_json_params.value.map((json_param) => {\n\t// \t\tif (json_param) {\n\t// \t\t\treturn json_param.name;\n\t// \t\t}\n\t// \t});\n\t// });\n\tconst NO_FOLDER_NAME = -1;\n\tconst param_ids_by_top_folder_ids = computed(() => {\n\t\tlet last_folder_param_id: CoreGraphNodeId = NO_FOLDER_NAME;\n\t\tconst dict: Dictionary<CoreGraphNodeId[]> = {};\n\t\tif (JSONNode.value) {\n\t\t\tconst json_params = JSONNode.value.param_ids.map((param_id) => StoreController.engine.json_param(param_id));\n\t\t\tjson_params.forEach((json_param) => {\n\t\t\t\tif (json_param) {\n\t\t\t\t\tif (_is_json_param_top_folder(json_param)) {\n\t\t\t\t\t\tlast_folder_param_id = json_param.graph_node_id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdict[last_folder_param_id] = dict[last_folder_param_id] || [];\n\t\t\t\t\t\tdict[last_folder_param_id].push(json_param.graph_node_id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn dict;\n\t});\n\n\tconst folderActiveStates = computed(() => {\n\t\treturn top_folder_json_params.value.map(\n\t\t\t(json_param) => active_folder_param_id.value == json_param?.graph_node_id\n\t\t);\n\t});\n\tconst folder_class_objects = computed(() => {\n\t\treturn top_folder_json_params.value.map((json_param, i) => {\n\t\t\treturn {\n\t\t\t\tactive: folderActiveStates.value[i],\n\t\t\t};\n\t\t});\n\t});\n\tfunction _is_json_param_top_folder(json_param: EngineParamData) {\n\t\tif (json_param.type == ParamType.FOLDER) {\n\t\t\tconst param = StoreController.engine.param(json_param.graph_node_id);\n\t\t\tif (param) {\n\t\t\t\tif (param.options.level() == 0) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t// const selected_node_json_params_for_current_folder = computed(() => {\n\t// \tif (selected_node_json_params_by_folder_name) {\n\t// \t\treturn selected_node_json_params_by_folder_name[active_folder_name] || [];\n\t// \t} else {\n\t// \t\treturn [];\n\t// \t}\n\t// });\n\t// const param_tab_indices = computed(() => {\n\t// \treturn selected_node_json_params_for_current_folder.map((p, i) => 1000 + i * 100);\n\t// });\n\t// const spare_param_tab_indices = computed(() => {\n\t// \treturn selected_node_json_spare_params.map((p, i) => 2000 + i * 100);\n\t// });\n\n\tconst selected_node_json_params_for_current_folder = computed(() => {\n\t\tif (JSONNode.value) {\n\t\t\tadd_to_store_if_required();\n\n\t\t\t// get the list\n\t\t\tlet json_params: (EngineParamData | null)[] | undefined = undefined;\n\t\t\tif (active_folder_param_id.value) {\n\t\t\t\tconst ids = param_ids_by_top_folder_ids.value[active_folder_param_id.value];\n\t\t\t\tif (ids) {\n\t\t\t\t\tjson_params = ids.map((id) => StoreController.engine.json_param(id));\n\t\t\t\t} // else {\n\t\t\t\t//\tjson_params = [];\n\t\t\t\t//}\n\t\t\t}\n\t\t\tif (!json_params) {\n\t\t\t\tjson_params = JSONNode.value.param_ids.map((id) => StoreController.engine.json_param(id));\n\t\t\t}\n\t\t\tconst compactedJsonParams: EngineParamData[] = []\n\t\t\tArrayUtils.compact(json_params,compactedJsonParams);\n\n\t\t\treturn compactedJsonParams.filter((json_param) => {\n\t\t\t\tif (json_param) {\n\t\t\t\t\tconst param = StoreController.engine.param(json_param.graph_node_id);\n\t\t\t\t\treturn param && param.parentParam() == null && param.type() != ParamType.FOLDER;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t});\n\n\tconst jsonParamDisplayeds = computed(() => {\n\t\tconst paramJSONs = selected_node_json_params_for_current_folder.value;\n\t\treturn paramJSONs.map((paramJSON) => {\n\t\t\tif (!paramJSON) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst param = StoreController.engine.param(paramJSON.graph_node_id);\n\t\t\tif (!param) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn !param.options.joinToPreviousParam();\n\t\t});\n\t});\n\n\tconst displayedSelectedNodeJsonParamsForCurrentFolder = computed(() => {\n\t\treturn selected_node_json_params_for_current_folder.value.filter((param, i) => jsonParamDisplayeds.value[i]);\n\t});\n\n\tonMounted(() => {\n\t\t// _selected_folder_by_node_id = _selected_folder_by_node_id || {};\n\t\tinit_folder_name();\n\t});\n\n\twatch(selected_graph_node_id, (new_id, old_id) => {\n\t\tif (new_id) {\n\t\t\tinit_folder_name();\n\t\t}\n\t});\n\n\t// // functions\n\tfunction init_folder_name() {\n\t\tif (JSONNode.value) {\n\t\t\tconst node_id = JSONNode.value.graph_node_id;\n\t\t\tif (history_active_folder_id_by_param_graph_id.has(node_id)) {\n\t\t\t\tconst folder_id = history_active_folder_id_by_param_graph_id.get(node_id);\n\t\t\t\tif (folder_id) {\n\t\t\t\t\tset_active_folder_id(folder_id);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (top_folder_json_params.value[0]) {\n\t\t\t\t\tset_active_folder_id(top_folder_json_params.value[0]?.graph_node_id);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// \tconst folder_name = _selected_folder_by_node_id[selected_json_node.graph_node_id];\n\t\t// \tif (folder_name) {\n\t\t// \t\tset_active_folder(folder_name);\n\t\t// \t}\n\t\t// } else {\n\t\t// \tif (selected_node_folder_names.indexOf(active_folder_name) < 0) {\n\t\t// \t\tset_active_folder(selected_node_folder_names[0]);\n\t\t// \t}\n\t\t// }\n\t}\n\tfunction set_active_folder_id(folder_id: CoreGraphNodeId) {\n\t\tactive_folder_param_id.value = folder_id;\n\n\t\tif (JSONNode.value) {\n\t\t\thistory_active_folder_id_by_param_graph_id.set(JSONNode.value.graph_node_id, folder_id);\n\t\t}\n\t}\n\n\treturn {\n\t\tdisplay_top_folders,\n\t\ttop_folder_json_params,\n\t\tselected_node_json_params_for_current_folder,\n\t\tjsonParamDisplayeds,\n\t\tdisplayedSelectedNodeJsonParamsForCurrentFolder,\n\t\tfolder_class_objects,\n\t\tfolderActiveStates,\n\t\tactive_folder_param_id,\n\t\t// functions\n\t\tset_active_folder_id,\n\t};\n\t// return {\n\t// \tactive_folder_name,\n\t// \tfolder_class_objects,\n\t// \tselected_node_json_params_for_current_folder,\n\t// \tparam_tab_indices,\n\t// \tspare_param_tab_indices,\n\t// \t// functions\n\t// \tinit_folder_name,\n\t// \tset_active_folder,\n\t// };\n}\n","import {onBeforeMount} from 'vue';\nimport {CoreGraphNodeId} from '../../../../../../@polygonjs/polygonjs/src/core/graph/CoreGraph';\nimport {SetupLinkIndexReturn} from '../../common/LinkIndex';\nimport {ParamsPanelInitLayoutData} from '../../../../types';\n\nexport interface ParamsPanelProps {\n\tpanelId: string;\n\tnodeId: CoreGraphNodeId;\n\tinit_layout_data: ParamsPanelInitLayoutData;\n\tdisplayNavBar: boolean;\n\toverflowYAuto: boolean;\n\tdisplayCloseButton: boolean;\n\tdisplayGoToNodeButton: boolean;\n}\n\nimport {SetupFolders} from './Folders';\n\nexport function SetupLayoutData(\n\tprops: ParamsPanelProps,\n\tFoldersMixin: ReturnType<typeof SetupFolders>,\n\tsetupLinkIndexReturn: SetupLinkIndexReturn\n) {\n\tonBeforeMount(() => {\n\t\tfromJSON(props.init_layout_data);\n\t});\n\n\tfunction fromJSON(json: ParamsPanelInitLayoutData) {\n\t\tsetupLinkIndexReturn.fromJSON(json);\n\t}\n\n\tfunction layoutData() {\n\t\treturn {\n\t\t\tactive_folder: FoldersMixin.active_folder_param_id.value,\n\t\t\t...setupLinkIndexReturn.toJSON(),\n\t\t};\n\t}\n\n\treturn {fromJSON, layoutData};\n}\n","import {PropertyNameAnimNode} from '../../../src/engine/nodes/anim/PropertyName';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst PropertyNameAnimNodePresetsCollectionFactory: PresetsCollectionFactory<PropertyNameAnimNode> = (\n\tnode: PropertyNameAnimNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst position = new BasePreset().addEntry(node.p.name, `position`);\n\tconst positionX = new BasePreset().addEntry(node.p.name, `position.x`);\n\tconst positionY = new BasePreset().addEntry(node.p.name, `position.y`);\n\tconst positionZ = new BasePreset().addEntry(node.p.name, `position.z`);\n\tconst rotation = new BasePreset().addEntry(node.p.name, `rotation`);\n\tconst rotationX = new BasePreset().addEntry(node.p.name, `rotation.x`);\n\tconst rotationY = new BasePreset().addEntry(node.p.name, `rotation.y`);\n\tconst rotationZ = new BasePreset().addEntry(node.p.name, `rotation.z`);\n\tconst scale = new BasePreset().addEntry(node.p.name, `scale`);\n\tconst scaleX = new BasePreset().addEntry(node.p.name, `scale.x`);\n\tconst scaleY = new BasePreset().addEntry(node.p.name, `scale.y`);\n\tconst scaleZ = new BasePreset().addEntry(node.p.name, `scale.z`);\n\tconst materialColor = new BasePreset().addEntry(node.p.name, `material.color`);\n\tconst materialMetalness = new BasePreset().addEntry(node.p.name, `material.metalness`);\n\tconst materialRoughness = new BasePreset().addEntry(node.p.name, `material.roughness`);\n\n\tcollection.setPresets({\n\t\tposition,\n\t\tpositionX,\n\t\tpositionY,\n\t\tpositionZ,\n\t\trotation,\n\t\trotationX,\n\t\trotationY,\n\t\trotationZ,\n\t\tscale,\n\t\tscaleX,\n\t\tscaleY,\n\t\tscaleZ,\n\t\tmaterialColor,\n\t\tmaterialMetalness,\n\t\tmaterialRoughness,\n\t});\n\n\treturn collection;\n};\nexport const propertyNameAnimPresetRegister: PresetRegister<typeof PropertyNameAnimNode, PropertyNameAnimNode> = {\n\tnodeClass: PropertyNameAnimNode,\n\tsetupFunc: PropertyNameAnimNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {FileAudioNode} from '../../../src/engine/nodes/audio/File';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst fileAudioNodePresetsCollectionFactory: PresetsCollectionFactory<FileAudioNode> = (node: FileAudioNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst ambient_mp3 = new BasePreset().addEntry(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/audio/Thrystero_Diagonal-160.mp3`\n\t);\n\tconst ambient_ogg = new BasePreset().addEntry(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/audio/Thrystero_Diagonal-160.ogg`\n\t);\n\tconst helicopter_ogg = new BasePreset().addEntry(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/audio/497848__amaida1__helicopter-sound.ogg`\n\t);\n\tconst helicopter_wav = new BasePreset().addEntry(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/audio/497848__amaida1__helicopter-sound.wav`\n\t);\n\n\tconst shortNames: string[] = [\n\t\t'177242__deleted-user-3277771__cinematic-impact.mp3',\n\t\t'33637__herbertboland__cinematicboomnorm.mp3',\n\t\t'492495__soundflakes__atmosphere-distant-moaning-01.mp3',\n\t\t'636301__discordantscraps__cyber-ghost-trick-7.mp3',\n\t\t'657826__the-sacha-rush__thoughtful-atmospheric-rapid-intro.mp3',\n\t];\n\tconst shortPresets: Record<string, BasePreset> = {};\n\tfor (let shortName of shortNames) {\n\t\tconst preset = new BasePreset().addEntry(\n\t\t\tnode.p.url,\n\t\t\t`${DEMO_ASSETS_ROOT_URL}/audio/resources/freesound/short/${shortName}`\n\t\t);\n\t\tconst elements = shortName.split('.')[0].split('__');\n\t\telements.shift();\n\t\tconst shortShortName = elements.join('__');\n\t\tshortPresets[`freesound/${shortShortName}`] = preset;\n\t}\n\n\tcollection.setPresets({\n\t\tambient_mp3,\n\t\tambient_ogg,\n\t\thelicopter_ogg,\n\t\thelicopter_wav,\n\t\t...shortPresets,\n\t});\n\n\treturn collection;\n};\nexport const fileAudioPresetRegister: PresetRegister<typeof FileAudioNode, FileAudioNode> = {\n\tnodeClass: FileAudioNode,\n\tsetupFunc: fileAudioNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {SamplerAudioNode} from '../../../src/engine/nodes/audio/Sampler';\n\nconst samplerAudioNodePresetsCollectionFactory: PresetsCollectionFactory<SamplerAudioNode> = (\n\tnode: SamplerAudioNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst tonejs_samples = new BasePreset().addEntry(\n\t\tnode.p.baseUrl,\n\t\t`${DEMO_ASSETS_ROOT_URL}/audio/resources/tonejs.github.io/samples`\n\t);\n\n\tcollection.setPresets({\n\t\ttonejs_samples,\n\t});\n\n\treturn collection;\n};\nexport const samplerAudioPresetRegister: PresetRegister<typeof SamplerAudioNode, SamplerAudioNode> = {\n\tnodeClass: SamplerAudioNode,\n\tsetupFunc: samplerAudioNodePresetsCollectionFactory,\n};\n","import {AudioAnalyserCopNode} from '../../../src/engine/nodes/cop/AudioAnalyser';\nimport {ParamType} from '../../../src/engine/poly/ParamType';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst audioAnalyserCopNodePresetsCollectionFactory: PresetsCollectionFactory<AudioAnalyserCopNode> = (\n\tnode: AudioAnalyserCopNode\n) => {\n\tconst normalised = new BasePreset()\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeR, [0, 1])\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeG, [0, 1])\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeB, [0, 1])\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeA, [0, 1]);\n\tconst decibels = new BasePreset()\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeR, [-200, 0])\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeG, [-200, 0])\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeB, [-200, 0])\n\t\t.addEntry<ParamType.VECTOR2>(node.p.rangeA, [-200, 0]);\n\n\treturn new NodePresetsCollection().setPresets({normalised, decibels});\n};\nexport const audioAnalyserCopPresetRegister: PresetRegister<typeof AudioAnalyserCopNode, AudioAnalyserCopNode> = {\n\tnodeClass: AudioAnalyserCopNode,\n\tsetupFunc: audioAnalyserCopNodePresetsCollectionFactory,\n};\n","import {SRGBColorSpace} from 'three';\nimport {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {\n\tCubeMapCopNode,\n\tCubeMapUrlAxis,\n\tcubeMapUrlExpression,\n\tCubeMapUrlKey,\n} from '../../../src/engine/nodes/cop/CubeMap';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst cubeMapCopNodePresetsCollectionFactory: PresetsCollectionFactory<CubeMapCopNode> = (node: CubeMapCopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction defaultUrls(preset: BasePreset) {\n\t\treturn preset\n\t\t\t.addEntry(node.p.px, cubeMapUrlExpression(CubeMapUrlKey.P, CubeMapUrlAxis.X))\n\t\t\t.addEntry(node.p.nx, cubeMapUrlExpression(CubeMapUrlKey.N, CubeMapUrlAxis.X))\n\t\t\t.addEntry(node.p.py, cubeMapUrlExpression(CubeMapUrlKey.P, CubeMapUrlAxis.Y))\n\t\t\t.addEntry(node.p.ny, cubeMapUrlExpression(CubeMapUrlKey.N, CubeMapUrlAxis.Y))\n\t\t\t.addEntry(node.p.pz, cubeMapUrlExpression(CubeMapUrlKey.P, CubeMapUrlAxis.Z))\n\t\t\t.addEntry(node.p.nz, cubeMapUrlExpression(CubeMapUrlKey.N, CubeMapUrlAxis.Z));\n\t}\n\tfunction posNegUrls(preset: BasePreset) {\n\t\tfunction _expression(urlKey: string, urlAxis: string) {\n\t\t\treturn `\\`ch('prefix')\\`${urlKey}${urlAxis}\\`ch('suffix')\\``;\n\t\t}\n\t\tconst n = 'neg';\n\t\tconst p = 'pos';\n\n\t\treturn preset\n\t\t\t.addEntry(node.p.px, _expression(p, CubeMapUrlAxis.X))\n\t\t\t.addEntry(node.p.nx, _expression(n, CubeMapUrlAxis.X))\n\t\t\t.addEntry(node.p.py, _expression(p, CubeMapUrlAxis.Y))\n\t\t\t.addEntry(node.p.ny, _expression(n, CubeMapUrlAxis.Y))\n\t\t\t.addEntry(node.p.pz, _expression(p, CubeMapUrlAxis.Z))\n\t\t\t.addEntry(node.p.nz, _expression(n, CubeMapUrlAxis.Z));\n\t}\n\n\tconst piza = defaultUrls(\n\t\tnew BasePreset()\n\t\t\t.addEntry(node.p.prefix, `${DEMO_ASSETS_ROOT_URL}/textures/cube/pisa/`)\n\t\t\t.addEntry(node.p.suffix, `.png`)\n\t\t\t.addEntry(node.p.tcolorSpace, 1)\n\t\t\t.addEntry(node.p.colorSpace, SRGBColorSpace)\n\t);\n\n\tconst bridge = posNegUrls(\n\t\tnew BasePreset()\n\t\t\t.addEntry(node.p.prefix, `${DEMO_ASSETS_ROOT_URL}/textures/cube/Bridge2/`)\n\t\t\t.addEntry(node.p.suffix, `.jpg`)\n\t\t\t.addEntry(node.p.tcolorSpace, 1)\n\t\t\t.addEntry(node.p.colorSpace, SRGBColorSpace)\n\t);\n\n\tcollection.setPresets({\n\t\tpiza,\n\t\tbridge,\n\t});\n\n\treturn collection;\n};\nexport const cubeMapCopPresetRegister: PresetRegister<typeof CubeMapCopNode, CubeMapCopNode> = {\n\tnodeClass: CubeMapCopNode,\n\tsetupFunc: cubeMapCopNodePresetsCollectionFactory,\n};\n","import {Attribute} from '../../../src/core/geometry/Attribute';\nimport {InstanceAttrib} from '../../../src/core/geometry/Instancer';\nimport {AttribLookup} from '../../../src/core/geometry/operation/TextureFromAttribute';\nimport {GeometryAttributeCopNode} from '../../../src/engine/nodes/cop/GeometryAttribute';\nimport {GlobalsTextureHandler} from '../../../src/engine/nodes/gl/code/globals/Texture';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst GeometryAttributeCopNodePresetsCollectionFactory: PresetsCollectionFactory<GeometryAttributeCopNode> = (\n\tnode: GeometryAttributeCopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst color = new BasePreset().addEntry(node.p.attribute, Attribute.COLOR);\n\tconst instanceColor = new BasePreset().addEntry(node.p.attribute, InstanceAttrib.COLOR);\n\tconst instanceQuaternion = new BasePreset().addEntry(node.p.attribute, InstanceAttrib.QUATERNION);\n\tconst instancePosition = new BasePreset().addEntry(node.p.attribute, InstanceAttrib.POSITION);\n\tconst instanceScale = new BasePreset().addEntry(node.p.attribute, InstanceAttrib.SCALE);\n\tconst instanceUv = new BasePreset().addEntry(node.p.attribute, InstanceAttrib.UV);\n\tconst position = new BasePreset().addEntry(node.p.attribute, Attribute.POSITION);\n\tconst normal = new BasePreset().addEntry(node.p.attribute, Attribute.NORMAL);\n\tconst uv = new BasePreset().addEntry(node.p.attribute, Attribute.UV);\n\tconst id = new BasePreset().addEntry(node.p.attribute, `id`);\n\tconst idn = new BasePreset().addEntry(node.p.attribute, `idn`);\n\tconst pti = new BasePreset().addEntry(node.p.attribute, `pti`);\n\t// const randomId = new BasePreset().addEntry(node.p.name, `randomId`);\n\tconst restP = new BasePreset().addEntry(node.p.attribute, `restP`);\n\tconst restN = new BasePreset().addEntry(node.p.attribute, `restN`);\n\tconst velocity = new BasePreset().addEntry(node.p.attribute, `velocity`);\n\tconst attribLookupId = new BasePreset().addEntry(node.p.attribute, AttribLookup.ID);\n\tconst attribLookupUv = new BasePreset().addEntry(node.p.attribute, AttribLookup.UV);\n\tconst particlesSimUv = new BasePreset().addEntry(node.p.attribute, GlobalsTextureHandler.PARTICLES_SIM_UV_ATTRIB);\n\n\tcollection.setPresets({\n\t\tcolor,\n\t\tinstanceColor,\n\t\tinstanceQuaternion,\n\t\tinstancePosition,\n\t\tinstanceScale,\n\t\tinstanceUv,\n\t\tposition,\n\t\tnormal,\n\t\tuv,\n\t\tid,\n\t\tidn,\n\t\tpti,\n\t\trestP,\n\t\trestN,\n\t\t// randomId,\n\t\tvelocity,\n\t\tattribLookupId,\n\t\tattribLookupUv,\n\t\tparticlesSimUv,\n\t});\n\n\treturn collection;\n};\nexport const geometryAttributeCopPresetRegister: PresetRegister<\n\ttypeof GeometryAttributeCopNode,\n\tGeometryAttributeCopNode\n> = {\n\tnodeClass: GeometryAttributeCopNode,\n\tsetupFunc: GeometryAttributeCopNodePresetsCollectionFactory,\n};\n","// https://github.com/nidorx/matcaps\n\nimport {ImageCopNode} from '../../../../src/engine/nodes/cop/Image';\nimport {BasePreset} from '../../BasePreset';\n\n// https://observablehq.com/@makio135/matcaps?ui=classic\nconst matcapIds = [\n\t'0404E8_0404B5_0404CB_3333FC',\n\t'045C5C_0DBDBD_049393_04A4A4',\n\t'046363_0CC3C3_049B9B_04ACAC',\n\t'0489C5_0DDDF9_04C3EE_04AFE1',\n\t'04989A_0CE3E4_04D2D5_04C7C8',\n\t'04C455_0EFABC_04F097_04E17A',\n\t'04CC77_0CF7CA_04E9A7_04AB54',\n\t'04E804_04B504_04CB04_33FC33',\n\t'04E8E8_04B5B5_04CCCC_33FCFC',\n\t'050505_747474_4C4C4C_333333',\n\t'070B0C_B2C7CE_728FA3_5B748B',\n\t'090909_9C9C9C_555555_7C7C7C',\n\t'0A0A0A_A9A9A9_525252_747474',\n\t'0C0CC3_04049F_040483_04045C',\n\t'0C430C_257D25_439A43_3C683C',\n\t'0D0DBD_040497_04047B_040455',\n\t'0D0DE3_040486_0404AF_0404CF',\n\t'0DBD0D_049704_047B04_045504',\n\t'0F0F0F_4B4B4B_1C1C1C_2C2C2C',\n\t'0F990F_047B04_044604_046704',\n\t'15100F_241D1B_292424_2C2C27',\n\t'161B1F_C7E0EC_90A5B3_7B8C9B',\n\t'167E76_36D6D2_23B2AC_27C1BE',\n\t'17395A_7EBCC7_4D8B9F_65A1B5',\n\t'181F1F_475057_616566_525C62',\n\t'191514_6D5145_4E3324_3B564D',\n\t'1A2461_3D70DB_2C3C8F_2C6CAC',\n\t'1B1B1B_515151_7E7E7E_6C6C6C',\n\t'1B1B1B_999999_575757_747474',\n\t'1B1C19_5F615D_4B4E4C_3F403D',\n\t'1C1810_352F23_2B2C1C_2B2C24',\n\t'1C70C6_09294C_0F3F73_52B3F6',\n\t'1D2424_565F66_4E555A_646C6E',\n\t'1D2A21_43443B_655B54_545C54',\n\t'1D3FCC_051B5F_81A0F2_5579E9',\n\t'221917_928380_5F504D_7C746C',\n\t'232014_908B78_5E5743_747460',\n\t'242733_333A4D_3E4554_3C3B43',\n\t'245642_3D8168_3D6858_417364',\n\t'253C3C_528181_406C6C_385F5F',\n\t'254FB0_99AFF0_6587D8_1D3279',\n\t'27222B_677491_484F6A_5D657A',\n\t'281813_604233_4B3426_442B22',\n\t'28292A_D3DAE5_A3ACB8_818183',\n\t'291912_473531_3C2C25_3A2424',\n\t'293534_B2BFC5_738289_8A9AA7',\n\t'293D21_ABC692_73B255_667C5C',\n\t'2A2A2A_B3B3B3_6D6D6D_848C8C',\n\t'2A2A2A_DBDBDB_6A6A6A_949494',\n\t'2A2D21_555742_898974_6C745B',\n\t'2A4BA7_1B2D44_1F3768_233C81',\n\t'2A6276_041218_739BA6_042941',\n\t'2B2828_7B796F_534F4A_616464',\n\t'2B2B22_3C3C30_464538_121210',\n\t'2D2D2A_74716E_8F8C8C_92958E',\n\t'2D2D2F_C6C2C5_727176_94949B',\n\t'2D8753_5CD6A5_45BB82_4CC494',\n\t'2E2E2D_7D7C76_A3A39F_949C94',\n\t'2E763A_78A0B7_B3D1CF_14F209',\n\t'2EAC9E_61EBE3_4DDDD1_43D1C6',\n\t'2F2FAA_1E1E87_10104E_1C1C70',\n\t'2F3747_6A7C9E_54637F_62748B',\n\t'300706_888576_822821_876E79',\n\t'302721_CAC1BB_7A706A_91959B',\n\t'304FB1_69A1EF_5081DF_5C8CE6',\n\t'312C34_A2AAB3_61656A_808494',\n\t'312D20_80675C_8B8C8B_85848C',\n\t'313131_BBBBBB_878787_A3A4A4',\n\t'320455_720DBE_560496_47047B',\n\t'32201D_613C3C_563533_8C655F',\n\t'32302B_4C4842_121211_1C1C14',\n\t'323C4D_B79039_7C6A44_605C48',\n\t'326666_66CBC9_C0B8AE_52B3B4',\n\t'331A0B_B17038_7D4E28_5B351A',\n\t'336EB3_152578_A4C5E2_74AED9',\n\t'34352A_718184_50605E_6E6761',\n\t'346088_6ABED7_56A0C5_4E91B8',\n\t'34A09C_6EE5E3_5CD7D3_4EC9C6',\n\t'34AB94_36DFC1_19F9EB_6C6E62',\n\t'353535_CFCFCF_828282_A4A4A4',\n\t'36220C_C6C391_8C844A_8B7B4C',\n\t'36312E_726461_59504D_645C5C',\n\t'365123_C6E5A3_A8D18D_8EB16C',\n\t'36C8FA_176ACB_24A7EF_1D93EC',\n\t'37C337_279F27_186018_248824',\n\t'385264_A1D3E2_86ADC1_6E94A8',\n\t'385862_6D8B8D_647B80_1A2E2F',\n\t'386169_A9CFDB_153C23_7CA3AC',\n\t'38925D_142B23_1D4835_2A6449',\n\t'392307_B3AE7D_6D5618_847C42',\n\t'39433A_65866E_86BF8B_BFF8D8',\n\t'394641_B1A67E_75BEBE_7D7256',\n\t'3A2412_A78B5F_705434_836C47',\n\t'3A3329_C9B090_928069_A9957A',\n\t'3A3D37_7E7F75_BCBFB6_9C9C94',\n\t'3B3B3B_C7C7C7_878787_A4A4A4',\n\t'3B3C3F_DAD9D5_929290_ABACA8',\n\t'3B4235_7B9395_5B716C_70847B',\n\t'3B6E10_E3F2C3_88AC2E_99CE51',\n\t'3D1F12_653821_070404_22130B',\n\t'3E2335_D36A1B_8E4A2E_2842A5',\n\t'3E3D39_D6CEAF_91BAC1_897966',\n\t'3E3E36_72726D_63645D_0E0F0C',\n\t'3E3E3E_AEAEAE_848484_777777',\n\t'3E95CC_65D9F1_A2E2F6_679BD4',\n\t'3F3A2F_91D0A5_7D876A_94977B',\n\t'3F3D52_CCCED9_AFB0C6_8D8CAC',\n\t'3F4441_D1D7D6_888F87_A2ADA1',\n\t'403A34_B0936E_7F979C_7E6956',\n\t'415325_83A24E_678239_748C3C',\n\t'416BA7_A5B8D0_0D2549_65ABEB',\n\t'422509_C89536_824512_0A0604',\n\t'422A1E_716767_685D59_5E4F4A',\n\t'424244_BDBBBE_8A898E_A3A4A9',\n\t'425F84_1C2939_2A3F57_24344C',\n\t'430404_BD9295_7E1E21_94544C',\n\t'432322_5E3839_170C0B_543433',\n\t'433D3F_A58D7D_786760_8C7C6D',\n\t'434240_D3D3CF_898784_A4A49F',\n\t'434343_9E9E9E_8C8C8C_848484',\n\t'434C32_62704C_546244_2F3220',\n\t'442C27_A79E90_847066_8D837C',\n\t'447072_8ACACB_65A4A5_74B3B3',\n\t'45432C_808361_B8C8BC_A5A27A',\n\t'454447_908E9A_181716_7C7C7B',\n\t'456A73_779B9E_173A46_154C5D',\n\t'463F37_ACCFBB_818B78_91A494',\n\t'464445_D2D0CB_919196_A8ADB0',\n\t'464543_D1CFC1_8E8C83_A4AC9C',\n\t'46804D_CBE9AC_90B57C_95D38F',\n\t'468126_C1DDB5_8AC460_A1D07C',\n\t'47392E_997E69_7C6553_8B745F',\n\t'474444_7B7575_9E9899_8C8C8B',\n\t'474643_696F7D_A9ABB8_8B8C93',\n\t'474843_CECEC4_898883_A3A3A4',\n\t'48270F_C4723B_9B5728_7B431B',\n\t'482908_894E0D_FBDB52_CA7420',\n\t'487FC9_A8E7F8_88CCF2_70AFDE',\n\t'489B7A_A0E7D9_6DC5AC_87DAC7',\n\t'48C381_226640_369F64_3CAC74',\n\t'49200B_C6926C_9C642B_A45C26',\n\t'495CA6_CCD2E6_A5B1D8_1E2852',\n\t'495E48_0D100D_9D9C87_9ECC9C',\n\t'496DBA_94C9F2_72A7E2_84B4EC',\n\t'4A6442_D0AB75_81CD94_181B12',\n\t'4B362C_715A4F_211913_644C44',\n\t'4B4A3A_94A3A4_68766F_988475',\n\t'4B5455_BBBFC4_97A0A6_838C90',\n\t'4C240E_A5613B_895134_734C44',\n\t'4C342A_7B584B_271912_6B4C44',\n\t'4C462E_6D876C_9AAC8F_9AABA6',\n\t'4C4C4C_D2D2D2_8F8F8F_ACACAC',\n\t'4D595E_858D87_596F84_748480',\n\t'4E4C42_B8C4C5_898E89_A3ACA4',\n\t'4E4D40_979786_AEAEA1_878678',\n\t'4E5150_9FA3A3_848C8A_82848C',\n\t'4F251B_381710_43241B_602F23',\n\t'4F439F_A28BE5_8570D6_7765C9',\n\t'4F4742_B7B1AA_847E79_969294',\n\t'4F4C45_A7AEAA_7A8575_9D97A2',\n\t'4F4F4F_9C9C9C_121212_7C7C7C',\n\t'4F4F4F_A1A1A1_8C8C8C_848484',\n\t'4F5246_8C8D84_7B7C74_131611',\n\t'4FE34F_2BB02B_3CD03C_1C861C',\n\t'50332C_D98D79_955F52_AA7C6C',\n\t'503522_C38254_9F6B45_845838',\n\t'504D3C_979C9D_81837D_9C998A',\n\t'513A11_CDBEB5_C8811C_9A733F',\n\t'51462B_DFCA7E_948050_A49874',\n\t'515151_DCDCDC_B7B7B7_9B9B9B',\n\t'515341_9A9C86_16180D_838474',\n\t'517919_659623_34460C_3E5813',\n\t'519C8D_83DAC7_9DEDE0_2B5B4C',\n\t'522221_91343B_7F6F6B_744960',\n\t'522A1A_94543A_C3896F_AB7D66',\n\t'525050_D4D3D3_959393_ACACAC',\n\t'533B33_AF9998_866965_9C7E7B',\n\t'535A2F_CDCA91_91915B_A4AC6F',\n\t'535F6B_A6BDC8_8FA3B4_7F91A2',\n\t'537387_75BBB9_152E5B_0E85E8',\n\t'54584E_B1BAC5_818B91_A7ACA3',\n\t'545B4D_D8DDC8_A0A792_B2C1A3',\n\t'54C104_BBFA0F_97EF04_7AE104',\n\t'55382F_78554E_271A16_6C4C44',\n\t'555555_C8C8C8_8B8B8B_A4A4A4',\n\t'556F42_112817_81927F_223E24',\n\t'55C404_BCFA0E_97F004_7AE104',\n\t'562D2A_2E1615_7E4945_703C3C',\n\t'56352F_1E110F_311C19_3C231C',\n\t'57553F_C6C3AF_8C8768_868C8C',\n\t'57583E_969788_292920_848474',\n\t'579241_B5D25D_0E1D2D_97C284',\n\t'582410_83381A_1F0C04_30140A',\n\t'583629_2E1810_765648_3C1C14',\n\t'584F3A_BEC3BD_C5A57D_A39073',\n\t'586A51_CCD5AA_8C9675_8DBBB7',\n\t'593E2C_E5D8A9_BC9F79_9F8A68',\n\t'595356_CDBFC6_AA9DA3_BBB3BC',\n\t'59554F_171716_847C74_2C2C24',\n\t'596773_B3C6CE_98AFB9_879AA8',\n\t'597C3F_254319_6C9668_7C9B53',\n\t'5A492B_DEC583_987D4D_AC9C74',\n\t'5A643B_454D2C_393F25_202315',\n\t'5B4CBC_B59AF2_9B84EB_8F78E4',\n\t'5B5428_C5A052_A28B46_ADA752',\n\t'5B574E_586967_807C6F_6A746C',\n\t'5C045C_BD0DBD_930493_A404A4',\n\t'5C2E0C_C36924_9F4F14_834114',\n\t'5C4E41_CCCDD6_9B979B_B1AFB0',\n\t'5C5743_262418_393727_342C20',\n\t'5C5C04_BDBD0D_939304_A4A404',\n\t'5C5C5C_A2A2A2_8C8C8C_848484',\n\t'5D5854_1A1714_373330_2C2424',\n\t'5D5D5D_CDCDCD_232323_ACACAC',\n\t'5D5E5A_A1A29B_2A2927_8B948C',\n\t'5E423A_8C6E69_382416_745D64',\n\t'5E5049_CDC2BE_9C8E88_B7ACA4',\n\t'5E5855_C6C4CD_C89B67_8F8E98',\n\t'5E5F62_A7B2BE_211C17_939CA3',\n\t'5ECBA4_BCFAE7_92EED0_A1F4DC',\n\t'5F1827_9B4A60_1F0404_340406',\n\t'5F4C4B_A07C7D_A8AFBF_868185',\n\t'5F4F50_A18E8E_8C7C7B_211A1A',\n\t'5F5F5F_BDBDBD_A4A4A4_9C9C9C',\n\t'604A30_DC9065_212C14_AC9C92',\n\t'60534A_211813_9B948E_8E837D',\n\t'605352_E9CCC5_C7A8A3_A89291',\n\t'606857_9BA894_8C9C83_8C9483',\n\t'613F04_D68C04_A45F04_1F0F04',\n\t'61583E_252314_928972_342C1C',\n\t'617586_23304C_1B1E30_4988CF',\n\t'622F19_885934_9A7748_94603A',\n\t'623622_A1756F_986353_89645B',\n\t'624541_FCD0C6_E4A19A_FCBCB4',\n\t'626262_9E9E9E_848484_262626',\n\t'626262_A8A8A8_949494_1F1F1F',\n\t'626A57_3B3F33_7D8973_444C3C',\n\t'626D5C_B8C2BB_1B230F_A4ACA3',\n\t'627D72_A6CAAA_202C28_B4D4B4',\n\t'630463_C30CC3_9B049B_AC04AC',\n\t'63533B_AA9472_1C1108_9B8C68',\n\t'63584B_E6E0D6_A8A092_BFB6A8',\n\t'635D52_A9BCC0_B1AEA0_819598',\n\t'636363_AAAAAA_949494_252525',\n\t'636D6C_D4E7ED_ABBCC4_9BA4A8',\n\t'637598_B7C4D3_22293A_9BACBF',\n\t'64554D_D1C9C1_ABADA0_0E0C0A',\n\t'64686F_BDC0C4_161718_A4A7AB',\n\t'647171_1F3349_2A475C_87A5AD',\n\t'647686_23292E_333C44_404B55',\n\t'656662_9B9B99_393B31_8B8C8C',\n\t'657274_2A2F30_A0A7B0_363C44',\n\t'65A0BA_C3E4F1_A7D5E6_97CADF',\n\t'65A0C7_C3E4F8_A7D5EF_97CAE9',\n\t'660505_F2B090_DD4D37_AA1914',\n\t'66605E_939198_2E261F_3C332A',\n\t'666864_B3B4AB_2F2F2C_9CA49B',\n\t'673B2A_99735C_99593A_3A160E',\n\t'677E93_36444D_99A9BA_435464',\n\t'678E67_C4D9C4_ACC8AC_98B898',\n\t'68049F_C90DE6_A404CF_B304DC',\n\t'683F2D_9F736D_431D06_966152',\n\t'68493E_B2AAA9_978C8C_130907',\n\t'684C40_776E69_9B7765_758D96',\n\t'685B57_BEB1B1_9B99A4_1E1D1D',\n\t'686464_CCCAC7_A4A19F_BCB4B4',\n\t'686B73_2A2B2D_D5D9DD_B0B3BC',\n\t'686E55_353C2F_869B7F_444434',\n\t'696347_98B0A2_28261E_362B22',\n\t'696969_A0A0A0_949494_8C8C8C',\n\t'6A3C15_EFC898_D59D59_B38346',\n\t'6A5338_1C120B_C5975F_96886C',\n\t'6A8287_405153_839EBE_424C5C',\n\t'6B3822_A65D48_824E48_401E0C',\n\t'6BBD6B_C8F3C8_A3E2A3_B4ECB4',\n\t'6C52AA_C9A6EA_A681D6_B494E2',\n\t'6C5DC3_352D66_5C4CAB_544CA5',\n\t'6C6F76_CBD1D7_B2BDC7_A6B0BF',\n\t'6C8996_14223F_B9DEDD_2E445C',\n\t'6D1616_E6CDBA_DE2B24_230F0F',\n\t'6D3B1C_895638_502A0D_844C31',\n\t'6D6050_C8C2B9_A2998E_B4AA9F',\n\t'6D6D6D_3E3E3E_C0C0C0_949494',\n\t'6E2E36_D3A1A0_BD7175_C78C8B',\n\t'6E5137_E8CA90_271912_B99C74',\n\t'6E524D_8496C5_AF6624_100B11',\n\t'6E6D69_D0ECE9_AAC7C6_200C0C',\n\t'6E7181_D1CFDF_ABAFC7_B4BCCE',\n\t'6E8C48_B8CDA7_344018_A8BC94',\n\t'6EC66E_C9F8C9_A3E8A3_B4F1B4',\n\t'6F503E_D59A70_221812_B0A899',\n\t'705B4B_312821_AF927B_44342C',\n\t'706962_24211E_BCB6AF_ACA494',\n\t'713A28_A87661_3A160D_9B6454',\n\t'714C30_EAD7C5_CC9265_E2B48F',\n\t'716049_D1C8B9_3F160C_BAA6A9',\n\t'71623B_ECDE8C_30250A_ABA69A',\n\t'72625B_F0DFD0_D9BAA5_C3A595',\n\t'726F5B_A09C88_8B8C7B_94907C',\n\t'727167_2F2F2B_A3A6A2_44443C',\n\t'728473_534C40_7BCEC8_7BB9B6',\n\t'736655_D9D8D5_2F281F_B1AEAB',\n\t'745359_BFAEA8_9B8384_AC9392',\n\t'746761_291C19_AB9385_3C2B27',\n\t'747A6F_292E2A_ACA79F_45453B',\n\t'74A192_041B0D_194C33_235B4C',\n\t'75322B_96463F_51201A_3D1814',\n\t'75723E_C0C3A0_2A1E0E_AFAE77',\n\t'75746F_333330_A2A1A9_444444',\n\t'758391_BAC2CA_435263_A1ACBC',\n\t'763B28_D0BDB8_ADA39E_1E1D1D',\n\t'763C39_431510_210504_55241C',\n\t'764739_D0917B_2A1611_B37C68',\n\t'765938_1F1009_A59C7C_C9A382',\n\t'766554_C1BEBB_2A1A0E_B4ABAC',\n\t'76787C_2F3031_A5A9B8_444446',\n\t'767989_323437_B6C4EE_343C44',\n\t'771A1F_D2939E_B6595D_9D4B54',\n\t'773012_AE5124_4D1908_340F04',\n\t'776045_D2CCC3_281910_BBB5AA',\n\t'776A5C_BA9A89_302C26_443C34',\n\t'776C62_292622_474039_3C342C',\n\t'777C61_333727_BABFA1_A5AC8C',\n\t'777D7D_BDCAD2_3E3C2E_B1B8B6',\n\t'787165_DAD9CD_9DC0CE_36302A',\n\t'7877EE_D87FC5_75D9C7_1C78C0',\n\t'794E40_361612_4C2A21_441B1B',\n\t'795038_C2856B_533320_AC7C61',\n\t'796D6B_DED3CB_C6BAB1_ADA09B',\n\t'796F52_36413A_C9B48C_B6A77F',\n\t'797367_302E29_ABA3A0_443C35',\n\t'7A6959_2D271D_C1B5A9_B4A393',\n\t'7A736F_463F33_575046_4B463D',\n\t'7A7A7A_D0D0D0_BCBCBC_B4B4B4',\n\t'7A7A7A_D9D9D9_BCBCBC_B4B4B4',\n\t'7A7C63_625531_665B3F_5B4B29',\n\t'7A9196_485C64_425459_C1E4E7',\n\t'7B5254_E9DCC7_B19986_C8AC91',\n\t'7B6857_383028_BCA38F_4C3C34',\n\t'7B6E5B_C5CACC_B1B2AE_322415',\n\t'7B7E82_343536_A0B1C8_44444C',\n\t'7C584C_27140D_B3765C_3D2318',\n\t'7C7C71_353630_ADAFAF_444444',\n\t'7D6651_F8E3BF_CEA987_E7C29C',\n\t'7D7673_353230_AEA7B0_4C4444',\n\t'7DA1BA_A4CCE8_5D7A8B_5E7C94',\n\t'7E5344_22120E_CCAB9C_8D919D',\n\t'7E5E57_AD9794_612D1D_C9997D',\n\t'7E8174_39444D_CECAA7_B3B49B',\n\t'7F5134_22120A_452110_9F7D5F',\n\t'7F8896_3B3936_BBCFE9_4B4B4D',\n\t'803537_310F10_C35A5D_D89093',\n\t'807068_C3B0AB_443E3B_AC9C94',\n\t'80726C_DCDBD7_9AA6C2_B7BFCA',\n\t'808A5B_E0E1D4_2C4304_C5C7B0',\n\t'80A6B4_D5E9EF_B2D0D9_C1DCE4',\n\t'80CA23_B7EE37_D5FA4C_A3E434',\n\t'812828_521818_C94141_AB3737',\n\t'812E39_551C24_381117_9E3C49',\n\t'815C41_F6C99A_D39F77_BB9474',\n\t'815F54_DECBC6_301813_C5A8A0',\n\t'8194AB_D6DFEB_C0CEDE_B0BFD1',\n\t'81ADB3_D6ECEE_BFDEE1_AFD1D7',\n\t'81BABA_D5F3F3_BBE4E4_ABDCDC',\n\t'825C4D_A08175_97746C_613B2F',\n\t'826A59_E0C9B9_CBAD99_3D2615',\n\t'827C87_4F3937_605457_534C4E',\n\t'834741_4C281D_BE8F8C_AE6A65',\n\t'835984_39273A_4C334C_593D5A',\n\t'837667_DCD4C8_C5BAAC_3C2E22',\n\t'846556_503E33_61493D_5C4434',\n\t'848679_363630_AABBB7_4B4B44',\n\t'855D08_DAC31B_BF9B0C_AF860C',\n\t'85694C_D1A67A_3C2F22_EBBF8F',\n\t'857B61_ACE5D4_593D28_5B4334',\n\t'858362_9F9F80_9C9673_70714B',\n\t'85B9D3_C9EAF9_417277_528789',\n\t'866C5B_544237_B29B8C_AC8F7C',\n\t'872F2D_AB403E_682421_581F1C',\n\t'877B70_34302B_CBB3A4_524C44',\n\t'877C72_B6ACBB_36322D_4C443B',\n\t'878787_4C4C4C_646464_5C5C5C',\n\t'887153_E5C188_433729_C1A484',\n\t'888D8F_515454_646A6C_6C6C6D',\n\t'89204B_17080D_DA4377_F780B5',\n\t'8955D0_744CC4_EA4AEF_954DA4',\n\t'8A3B3D_DA5F62_461F20_BC7F81',\n\t'8A3DA1_D77CE4_C263D4_B75AC9',\n\t'8A5B34_F3BD7C_DA9758_BE7E45',\n\t'8A6565_2E214D_D48A5F_ADA59C',\n\t'8A7666_3C332C_C6AEA2_54443C',\n\t'8A7968_3C342D_C6B3A5_54443B',\n\t'8B7469_443E39_C7A797_544443',\n\t'8B795F_291504_EFE5D4_4A3518',\n\t'8B892C_D4E856_475E2D_47360A',\n\t'8C5945_D4C0B6_C3A49C_430504',\n\t'8CAEBC_3A4443_506463_DAEFEF',\n\t'8D553D_3C2419_5D3727_AA766C',\n\t'8D8D8D_DDDDDD_CCCCCC_B7B7B7',\n\t'8E6767_D9C4C4_C8ACAC_B89898',\n\t'8E7C67_E2C6A5_3B332A_C3AB94',\n\t'8E907C_B1B5A7_D7DBD0_CCCFBA',\n\t'8F4277_361530_BF538E_52274C',\n\t'8F4E20_E8B06B_391A08_CC8944',\n\t'8F5D3C_5B3B26_382416_70482E',\n\t'8F7B61_D6B892_4E4436_C3AC86',\n\t'8F894E_DAD79B_C9C384_C4BE7B',\n\t'903B2A_EC9888_D96747_58190D',\n\t'906867_C7B6BC_5D2E26_BEA4A3',\n\t'908887_3C3229_C7C6D0_554A45',\n\t'908E8E_292828_454444_595757',\n\t'909473_555D4B_C2CCA2_645B3C',\n\t'910E5A_E127C3_CF1CA3_C1158F',\n\t'926B48_4C2D0D_5F3913_AA8874',\n\t'927253_EECEA7_D8B792_C7A883',\n\t'935555_F6DAD9_D39393_593333',\n\t'936451_C29A8F_5F3A2B_361D14',\n\t'938C8D_403731_CECED8_554C4C',\n\t'942967_D292B5_C76E9E_551A4C',\n\t'945D43_E5AAA0_351F14_CC8B78',\n\t'94615B_DACED1_C3B9A4_CCABAA',\n\t'94624F_573529_24110C_733424',\n\t'9650CA_46236A_7239A6_633492',\n\t'965146_2B191D_DF7A5C_BFD6E1',\n\t'96785D_B8A398_63452C_6C5435',\n\t'975337_EEBE98_4B211C_D88659',\n\t'977970_E1D9D8_DAC8C1_C4B2AD',\n\t'98332E_4A100D_691A16_A85A5B',\n\t'989784_665542_BFECE5_6D644C',\n\t'9A5A55_31110D_582A24_703C34',\n\t'9A7467_D2C2BF_662D22_CCB2A5',\n\t'9AA8B6_313133_4E5055_D7EBF8',\n\t'9B4816_E8A138_CC7421_DC8827',\n\t'9B9994_E1E0DB_474643_544C4C',\n\t'9B9B9B_1E1E1E_5C5C5C_444444',\n\t'9C5B3B_49200A_E9C8AB_DDAB7D',\n\t'9CC338_4E671A_799F27_8CAC2C',\n\t'9D282A_38191D_DFC6CD_D6495A',\n\t'9D4343_E38989_D37474_CE6C6C',\n\t'9D602E_E4C363_D5A64F_C38A44',\n\t'9D7F6E_C6DAD4_6D4C4B_C6BBBC',\n\t'9D8F84_5D4544_D9D3C9_62555A',\n\t'9D9D9D_4E4E4E_646464_6C6C6C',\n\t'9E7C7E_DDCBD0_351D20_683B38',\n\t'9E9C77_6E6F4E_7C7C54_C7BF96',\n\t'9F1A27_F1AF7F_CD5845_D08441',\n\t'9F4738_CE958D_4F0C0A_C0837C',\n\t'9F7D30_B69F75_B9B7BE_CB9C4D',\n\t'9F886D_362F25_E8C9A4_5C4C3C',\n\t'9F9F9F_E4E4E4_D4D4D4_CCCCCC',\n\t'A05F31_D5C2BC_D9996F_42230E',\n\t'A0A8B0_424336_E7E9EF_545C5C',\n\t'A1824F_4A2A06_F7E29F_B3A598',\n\t'A27216_E9D036_D0AB24_DCB927',\n\t'A28766_E4D6C3_D6C4AA_CAB598',\n\t'A3B2A4_3B3E3D_676F6A_535C57',\n\t'A48DA4_E8DDE8_C9B7C9_D4C2D4',\n\t'A49994_695244_C4C2CF_76645C',\n\t'A67362_36150C_5E2E1E_F6C3BF',\n\t'A84337_611D18_3F110F_7C2A22',\n\t'A88C77_DAD2C7_623532_956229',\n\t'A95E4D_57261A_6E3223_773C24',\n\t'A971A9_E8CBE8_D4A8D4_DCB3DC',\n\t'A98D6A_F2D3AB_FBE6BE_695332',\n\t'A9A2A0_2F211C_544440_6D5E5A',\n\t'AA526C_EAA6C9_DC88AF_D17BA0',\n\t'AB2C2C_EBB4B3_561212_DE8484',\n\t'AB2D08_C35E5A_C75522_C56C70',\n\t'AB54A8_EBAAE9_DF8FDD_D37ED0',\n\t'AC171C_FA8593_E84854_D3464E',\n\t'AC725C_2E1610_663E31_E78F6B',\n\t'AC7F84_78463A_C4AABB_885454',\n\t'AC8942_432D19_6E4D27_5F3B1C',\n\t'AC8961_EBDAC3_D1B791_DCC2A0',\n\t'AD9E81_F1E5CE_6B5C3E_5A492A',\n\t'ADC2CD_DFF7FA_C9E6F5_C1DBEC',\n\t'AE9D99_29303B_585F70_875C33',\n\t'AF986F_CDB489_9C7C5B_7E6C4D',\n\t'AF987A_2F2416_523F27_6B5331',\n\t'AF9A72_504718_74652B_E2C2A2',\n\t'B06932_451B09_7B3E16_150804',\n\t'B09273_7A573D_C7AF97_84644C',\n\t'B0A2A8_866A63_E8E9F2_614C4F',\n\t'B0B0B0_6E6E6E_848484_8C8C8C',\n\t'B1A395_EFE6E1_635A47_786D5D',\n\t'B2674B_552913_7C442F_733919',\n\t'B26F52_4B2E2B_79493A_663B32',\n\t'B27744_5A2804_F6C488_EBB27D',\n\t'B38B76_40251D_745042_5F3A30',\n\t'B3AA93_F4EFD7_E1DDC2_DCD3BB',\n\t'B47A5B_301E14_704A31_633C23',\n\t'B4B29D_442D0D_604E2A_736542',\n\t'B5987E_F8E4DC_6F5939_E9CCBA',\n\t'B5BBB5_3B4026_6E745D_5C6147',\n\t'B62D33_E4868B_7E2D34_DD6469',\n\t'B66D59_F0C9B2_E5B49C_DAA084',\n\t'B67F6B_4B2E2A_6C3A34_F3DBC6',\n\t'B6B8B1_994A24_315C81_927963',\n\t'B76E5E_7F3A2F_EE938C_F8A5A1',\n\t'B7A763_E6E1CC_554A1E_6C6428',\n\t'B86137_FBCA6F_6F3C37_040404',\n\t'B9896A_5B341B_F4CAA3_6C4C2D',\n\t'B98A6D_7B4F38_D1A68F_8C5B43',\n\t'B9B37A_F1EED0_E5E4BA_DAD6A8',\n\t'B9CDD2_775339_958272_7F6A5E',\n\t'BA472D_CA6E67_C76150_CA6C59',\n\t'BA5DBA_F2BEF2_E69BE6_DC8CDC',\n\t'BA864A_5D381E_644422_FBE97A',\n\t'BA8979_DDCBCA_9A4726_892407',\n\t'BAADA8_ECE6E7_9A8378_E3DCD3',\n\t'BC5B43_95170B_EEAC92_DB8C7C',\n\t'BC928D_F9E2D6_654445_835A51',\n\t'BD0D0D_970404_7B0404_550404',\n\t'BD5345_460F11_732622_EDB7B1',\n\t'BDB466_F3EDC3_E3DD9F_ECE3AA',\n\t'BE5F5F_F4BDBD_ECA4A4_E29191',\n\t'BEE2E9_7E6A53_9AA09C_87837E',\n\t'BF7051_994C2D_E99A7B_DE8C74',\n\t'BF7745_F5D08E_E5AE6B_ECBC7C',\n\t'BF8E78_E5CCBF_753E32_4A261E',\n\t'BFAA83_F5EAD6_E1D0B1_EBDDC0',\n\t'BFB5A4_DEDCCB_D7D4CC_DCD3C2',\n\t'C05429_ED6129_94492A_834729',\n\t'C09E5C_DAD2B9_654429_81582D',\n\t'C1AA92_AD6E29_737889_CED1D7',\n\t'C1B3A1_F6EEE5_E1D7C7_ECE4D3',\n\t'C21338_920C24_E71C54_F34A7D',\n\t'C28E4E_845119_0B0805_713C0C',\n\t'C2A391_523728_785741_694836',\n\t'C2A584_363B41_71665B_8C7367',\n\t'C2AB7D_4A412E_7A6B4E_F9EDBE',\n\t'C30C0C_9F0404_830404_5C0404',\n\t'C33829_48171A_752523_942923',\n\t'C345EC_5F1DAA_9F31DB_872CCD',\n\t'C35C04_F9C30C_EE9F04_E08304',\n\t'C3CCD4_5F3B23_948A7B_A9A49A',\n\t'C47004_F9D00C_EDAF04_E09704',\n\t'C4A591_635448_F2D9D5_856D5B',\n\t'C4C6C6_4D5756_646463_7A8080',\n\t'C4DEDE_97B5B5_EAF9F9_ABC4C4',\n\t'C5A292_635247_F2D7D6_846A5B',\n\t'C5BBB6_F8F4F1_E2DAD6_ECE3DF',\n\t'C75F55_F8BDA9_EB9484_F4A494',\n\t'C7938D_E0DBE1_D1BBBC_D5CCCB',\n\t'C7B9A1_F8F1E4_EEE4D2_E4D8C4',\n\t'C7C0AC_2E181B_543B30_6B6270',\n\t'C7C7D7_4C4E5A_818393_6C6C74',\n\t'C87157_F8CBAE_E9A582_F2B394',\n\t'C88467_5B3333_875C5A_7A3822',\n\t'C8AF84_F9ECD7_EFDEBF_E6D1AF',\n\t'C8C8C8_3F3F3F_787878_5C5C5C',\n\t'C8D1DC_575B62_818892_6E747B',\n\t'C98D7F_3B0B0B_A97667_94433F',\n\t'C99A8B_491B0E_6E4136_8A4D28',\n\t'C9C7BE_55514B_888279_7B6E5F',\n\t'CA4FE1_6B2398_A337C7_9334BC',\n\t'CA8892_F9D7DC_EBB8C0_F3C4CC',\n\t'CAA094_875343_956255_EADEDC',\n\t'CAA78A_F9E7D7_EAD0B9_F3DCC3',\n\t'CAAC80_FAEBD5_F2DEBF_EAD1AF',\n\t'CAB094_F9ECDD_EFDEC8_E8D4BD',\n\t'CAB79D_F9F1E3_F1E5D1_E9DAC6',\n\t'CAE24E_6C9A23_A3C737_B3D43C',\n\t'CB4934_FB9971_F07554_F68464',\n\t'CB4E88_F99AD6_F384C3_ED75B9',\n\t'CB5E3B_FABC7A_EF965E_F4A46C',\n\t'CB7146_551D0F_7C270D_E5AB9C',\n\t'CB7846_753C22_AB5C32_B46C3C',\n\t'CB919B_F9DDE1_ECC0C8_F4CCD4',\n\t'CBCBCB_595959_8C8C8C_747474',\n\t'CC7C5F_A15436_B26346_AF5C3C',\n\t'CC9A7E_8A5249_C06A3E_DADADA',\n\t'CCC5C9_3B2B2B_67585B_7F7375',\n\t'CCF6FA_9DD9EB_82C5D9_ACD4E4',\n\t'CDC3B8_5A3F3C_67545A_8D7769',\n\t'CDCBC8_444342_696765_81807E',\n\t'CE8C15_EAC79B_DDAB57_F9C962',\n\t'CE8F3D_F0D2B0_F3C77D_E6B278',\n\t'CEB299_6B5C4C_887564_746355',\n\t'D04444_AF2F2F_8B2424_9B2C2C',\n\t'D07E3F_FBBD1F_8D2840_24120C',\n\t'D0CCCB_524D50_928891_727581',\n\t'D0D3BE_816854_998366_685146',\n\t'D1AC04_F8E50A_EDD004_B38D04',\n\t'D3CAAB_8C866E_C0B89A_AEA68A',\n\t'D4855F_92512D_AE6742_A75C2C',\n\t'D54C2B_5F1105_F39382_F08375',\n\t'D5B5B4_9E6C6F_F5E9EF_A57986',\n\t'D5D5D5_929292_ACACAC_B4B4B4',\n\t'D64480_E27497_EA9BB1_CD156F',\n\t'D7D7C3_AAAA92_F5F5EA_BCBCA4',\n\t'D7DFDB_AAB5AF_F5FAF7_BCC4C4',\n\t'D8388B_230A14_FCC8FC_FC71E1',\n\t'D8C949_F5F19E_6B7855_9A9858',\n\t'D8D8E5_9D9DAF_B4B4C4_B4B4CC',\n\t'DA5788_DE94BD_E078A3_DD83B4',\n\t'DBDBBB_F7F7E4_AFAF89_C4C49C',\n\t'DC3E04_B52604_FC7D20_F85F04',\n\t'DE9261_86361E_A85A37_944C2C',\n\t'DEDEC4_B5B597_F9F9EA_C4C4AB',\n\t'DEE3E8_A6AEB5_BCC4CC_BCC4C4',\n\t'DEE8DE_A6B5A6_BCCCBC_BCC4BC',\n\t'DEE8E8_A6B5B5_BCCCCC_BAC4C4',\n\t'DFD9C2_B5AE92_F9F7EA_C4C4A4',\n\t'DFDBB7_F9F8E3_B5AF86_BCBC8C',\n\t'DFDFCA_4D2D07_6B5224_857145',\n\t'DFDFD6_58544E_81766A_989288',\n\t'E1E1D4_777C7B_9FA19A_898F8D',\n\t'E1E1E0_363636_989897_747472',\n\t'E2D3BC_867255_B39E7F_96836C',\n\t'E2E2E7_AEAEB5_C4C4CC_C4C4C4',\n\t'E42E12_F35132_F86949_B71B0A',\n\t'E5DED7_AFA69D_C4BCB4_C3BAAB',\n\t'E6BF3C_5A4719_977726_FCFC82',\n\t'E6E3E3_B5AFAF_CCC4C4_C4C4C4',\n\t'E6E6E6_AAAAAA_C4C4C4_CCCCCC',\n\t'E7632F_FBA06B_BB2905_FB865E',\n\t'E7E2D8_B1AA9D_C9C2B3_BCB4AC',\n\t'E80404_B50404_CB0404_FC3333',\n\t'E804E8_B504B5_CC04CC_FC33FC',\n\t'E8DEE1_B5A6AA_CCBCC1_C4BBBC',\n\t'E8E5DE_B5AFA6_CCC5BC_C4C4BB',\n\t'E8E8DE_B5B5A6_CCCCBC_C4C4BA',\n\t'E9CCA1_A63106_DF8C3B_621304',\n\t'EA783E_6D4830_905837_FCDC6C',\n\t'EAD8D6_B59A97_CCB4B0_C9ABAB',\n\t'EAEAEA_B5B5B5_CCCCCC_D4D4D4',\n\t'EAEAEA_B6B6B6_CCCCCC_C4C4C4',\n\t'ED4630_791A0E_A42716_501009',\n\t'ED5087_FAC3D0_1C0B0C_FC84CC',\n\t'ED7F04_FCD60E_7E2D04_B73E04',\n\t'EDED06_B5B504_CCCC04_D4D404',\n\t'EE4128_FC8E82_9A0704_BF0F05',\n\t'EEECFB_BFB6D5_D0C8EB_CCC4DC',\n\t'F0D504_FBFAD3_B98609_CDA204',\n\t'F75F0B_461604_9A3004_FB9D2F',\n\t'F77777_FBE1E1_FAB2B2_FBC4C4',\n\t'F79686_FCCBD4_E76644_E76B56',\n\t'F9E6C7_FCF7DF_EDD3AA_F1D4B4',\n\t'FBB43F_FBE993_FB552E_FCDD65',\n\t'FBB82D_FBEDBF_FBDE7D_FB7E05',\n];\n\n// const qualities = ['64', '128', '256', '512', '1024'];\nconst qualities = ['512'];\n\nexport function matcapElements(node: ImageCopNode) {\n\tconst elements: Record<string, BasePreset> = {};\n\tfor (let matcapId of matcapIds) {\n\t\tfor (let quality of qualities) {\n\t\t\tconst url = `https://makio135.com/matcaps/${quality}/${matcapId}${\n\t\t\t\tquality === '1024' ? '' : `-${quality}px`\n\t\t\t}.png`;\n\t\t\tconst preset = new BasePreset().addEntry(node.p.url, url);\n\t\t\t// .addEntry(node.p.tanisotropy, 1)\n\t\t\t// .addEntry(node.p.useRendererMaxAnisotropy, 1);\n\t\t\t// .addEntry(node.p.tminFilter, 1)\n\t\t\t// .addEntry(node.p.tmagFilter, 1);\n\t\t\telements[`matcap/${matcapId}`] = preset;\n\t\t\t// dict[`${matcapId}-${quality}`] = matcapURL;\n\t\t}\n\t}\n\treturn elements;\n}\n","import {SRGBColorSpace, NoColorSpace} from 'three';\nimport {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {ImageCopNode} from '../../../src/engine/nodes/cop/Image';\nimport {PolyDictionary} from '../../../src/types/GlobalTypes';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {matcapElements} from './image/matcap';\n\ninterface PolyhavenOptions {\n\tdisplacement?: boolean;\n}\ninterface ImageOptions {\n\tsRGB?: boolean;\n}\n\nconst imageCopNodePresetsCollectionFactory: PresetsCollectionFactory<ImageCopNode> = (node: ImageCopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction sRGBImage(fileName: string) {\n\t\treturn new BasePreset()\n\t\t\t.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/textures/${fileName}`)\n\t\t\t.addEntry(node.p.tcolorSpace, 1)\n\t\t\t.addEntry(node.p.colorSpace, SRGBColorSpace);\n\t}\n\tfunction linearImage(fileName: string) {\n\t\treturn new BasePreset()\n\t\t\t.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/textures/${fileName}`)\n\t\t\t.addEntry(node.p.tcolorSpace, 0)\n\t\t\t.addEntry(node.p.colorSpace, NoColorSpace);\n\t}\n\tconst asphalt = sRGBImage(`asphalt.jpg`);\n\tconst scratches = sRGBImage(`lens-dirt/scratches.jpg`);\n\tconst bunny_SSS_thickness = new BasePreset()\n\t\t.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/fbx/bunny_thickness.jpg`)\n\t\t.addEntry(node.p.tcolorSpace, 0)\n\t\t.addEntry(node.p.colorSpace, NoColorSpace)\n\t\t.addEntry(node.p.colorSpace, NoColorSpace);\n\tconst disk = linearImage(`disk.png`);\n\t// const envMap = linearImage(`piz_compressed.exr`);\n\tconst uv = sRGBImage(`uv.jpg`);\n\tconst ktx2 = sRGBImage(`sample_uastc_zstd.ktx2`);\n\n\tfunction artveeSet() {\n\t\tfunction artvee(fileName: string) {\n\t\t\treturn new BasePreset()\n\t\t\t\t.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/textures/resources/artvee.com/${fileName}`)\n\t\t\t\t.addEntry(node.p.tanisotropy, 1)\n\t\t\t\t.addEntry(node.p.useRendererMaxAnisotropy, 1)\n\t\t\t\t.addEntry(node.p.tminFilter, 1)\n\t\t\t\t.addEntry(node.p.tmagFilter, 1)\n\t\t\t\t.addEntry(node.p.tcolorSpace, 1)\n\t\t\t\t.addEntry(node.p.colorSpace, SRGBColorSpace);\n\t\t}\n\t\treturn {\n\t\t\t'all-his-own': artvee('all-his-own-by-John-Samuel-Pughe.jpg'),\n\t\t\t'Bouquet-of-Flowers-in-a-Blue-Porcelain-Vase': artvee(\n\t\t\t\t'Bouquet-of-Flowers-in-a-Blue-Porcelain-Vase-by-Anne-Vallayer-Coster.jpg'\n\t\t\t),\n\t\t\t'Samson-and-Delilah': artvee('Samson-and-Delilah-by-Gerard-van-Honthorst.jpg'),\n\t\t\t'The-Milkmaid': artvee('The-Milkmaid-Johannes-Vermeer.jpg'),\n\t\t\t'The-Triumph-of-Aemilius-Paulus': artvee('The-Triumph-of-Aemilius-Paulus.jpg'),\n\t\t};\n\t}\n\tfunction polyhavenSets() {\n\t\tfunction polyhaven(fileName: string, options?: ImageOptions) {\n\t\t\tconst preset = new BasePreset()\n\t\t\t\t.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/textures/resources/polyhaven.com/${fileName}`)\n\t\t\t\t.addEntry(node.p.tanisotropy, 1)\n\t\t\t\t.addEntry(node.p.useRendererMaxAnisotropy, 1)\n\t\t\t\t.addEntry(node.p.tminFilter, 1)\n\t\t\t\t.addEntry(node.p.tmagFilter, 1);\n\n\t\t\tif (options && options.sRGB) {\n\t\t\t\tpreset.addEntry(node.p.tcolorSpace, 1).addEntry(node.p.colorSpace, SRGBColorSpace);\n\t\t\t} else {\n\t\t\t\tpreset.addEntry(node.p.tcolorSpace, 0).addEntry(node.p.colorSpace, NoColorSpace);\n\t\t\t}\n\n\t\t\treturn preset;\n\t\t}\n\t\tfunction polyhavenSet(setName: string, options?: PolyhavenOptions) {\n\t\t\tconst elements: PolyDictionary<BasePreset> = {\n\t\t\t\t[`${setName}/diffuse`]: polyhaven(`${setName}/2k/diffuse.jpg`, {sRGB: true}),\n\t\t\t\t[`${setName}/rough`]: polyhaven(`${setName}/2k/rough.jpg`),\n\t\t\t};\n\t\t\tlet displacement = true;\n\t\t\tif (options && options.displacement != null) {\n\t\t\t\tdisplacement = options.displacement;\n\t\t\t}\n\t\t\tif (displacement) {\n\t\t\t\telements[`${setName}/displacement`] = polyhaven(`${setName}/2k/displacement.png`);\n\t\t\t}\n\n\t\t\treturn elements;\n\t\t}\n\t\treturn {\n\t\t\t...polyhavenSet('brick_floor_002'),\n\t\t\t...polyhavenSet('brick_floor_003'),\n\t\t\t...polyhavenSet('concrete_floor_painted'),\n\t\t\t...polyhavenSet('floor_tiles_06'),\n\t\t\t...polyhavenSet('floor_tiles_08'),\n\t\t\t...polyhavenSet('large_floor_tiles_02'),\n\t\t\t...polyhavenSet('marble_01'),\n\t\t\t...polyhavenSet('medieval_blocks_05'),\n\t\t\t...polyhavenSet('medieval_blocks_05'),\n\t\t\t...polyhavenSet('square_floor'),\n\t\t\t...polyhavenSet('tiled_floor_001'),\n\t\t\t...polyhavenSet('aerial_rocks_02'),\n\t\t\t...polyhavenSet('brick_moss_001'),\n\t\t\t...polyhavenSet('denmin_fabric_02', {displacement: false}),\n\t\t\t...polyhavenSet('fabric_pattern_07', {displacement: false}),\n\t\t};\n\t}\n\tfunction unsplash() {\n\t\tfunction _unsplash(fileName: string) {\n\t\t\treturn new BasePreset()\n\t\t\t\t.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/textures/resources/unsplash.com/${fileName}`)\n\t\t\t\t.addEntry(node.p.tanisotropy, 1)\n\t\t\t\t.addEntry(node.p.useRendererMaxAnisotropy, 1)\n\t\t\t\t.addEntry(node.p.tminFilter, 1)\n\t\t\t\t.addEntry(node.p.tmagFilter, 1)\n\t\t\t\t.addEntry(node.p.tcolorSpace, 1)\n\t\t\t\t.addEntry(node.p.colorSpace, SRGBColorSpace);\n\t\t}\n\t\tconst dict: Record<string, BasePreset> = {\n\t\t\t'claudio-testa': _unsplash('claudio-testa--SO3JtE3gZo-unsplash.jpg'),\n\t\t\tcharlesdeluvio: _unsplash('charlesdeluvio-pOUA8Xay514-unsplash.jpg'),\n\t\t\t'ivana-cajina': _unsplash('ivana-cajina-dnL6ZIpht2s-unsplash.jpg'),\n\t\t\t'joel-mott': _unsplash('joel-mott-LaK153ghdig-unsplash.jpg'),\n\t\t\t'johannes-plenio': _unsplash('johannes-plenio-DKix6Un55mw-unsplash.jpg'),\n\t\t\t'prince-akachi': _unsplash('prince-akachi-LWkFHEGpleE-unsplash.jpg'),\n\t\t\t'vince-fleming': _unsplash('vince-fleming-j3lf-Jn6deo-unsplash.jpg'),\n\t\t};\n\t\tconst keys = Object.keys(dict);\n\t\tconst unsplashDisct: Record<string, BasePreset> = {};\n\t\tfor (let key of keys) {\n\t\t\tunsplashDisct[`unsplash/${key}`] = dict[key];\n\t\t}\n\t\treturn unsplashDisct;\n\t}\n\n\tcollection.setPresets({\n\t\tasphalt,\n\t\tscratches,\n\t\tbunny_SSS_thickness,\n\t\tdisk,\n\t\t// envMap,\n\t\tuv,\n\t\tktx2,\n\t\t...artveeSet(),\n\t\t...polyhavenSets(),\n\t\t...matcapElements(node),\n\t\t...unsplash(),\n\t});\n\n\treturn collection;\n};\nexport const imageCopPresetRegister: PresetRegister<typeof ImageCopNode, ImageCopNode> = {\n\tnodeClass: ImageCopNode,\n\tsetupFunc: imageCopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {LutCopNode} from '../../../src/engine/nodes/cop/Lut';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst lutCopNodePresetsCollectionFactory: PresetsCollectionFactory<LutCopNode> = (node: LutCopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction png(fileName: string) {\n\t\treturn new BasePreset().addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/textures/lut/png/${fileName}.png`);\n\t}\n\n\tconst bleachBypass = png(`bleach-bypass`);\n\tconst candleLight = png(`candle-light`);\n\tconst coolContrast = png(`cool-contrast`);\n\tconst desaturatedFog = png(`desaturated-fog`);\n\tconst evening = png(`evening`);\n\tconst fall = png(`fall`);\n\tconst filmic1 = png(`filmic1`);\n\tconst filmic2 = png(`filmic2`);\n\tconst matrixGreen = png(`matrix-green`);\n\tconst strongAmber = png(`strong-amber`);\n\tconst warmContrast = png(`warm-contrast`);\n\n\tcollection.setPresets({\n\t\tbleachBypass,\n\t\tcandleLight,\n\t\tcoolContrast,\n\t\tdesaturatedFog,\n\t\tevening,\n\t\tfall,\n\t\tfilmic1,\n\t\tfilmic2,\n\t\tmatrixGreen,\n\t\tstrongAmber,\n\t\twarmContrast,\n\t});\n\n\treturn collection;\n};\nexport const lutCopPresetRegister: PresetRegister<typeof LutCopNode, LutCopNode> = {\n\tnodeClass: LutCopNode,\n\tsetupFunc: lutCopNodePresetsCollectionFactory,\n};\n","import {MapboxElevationCopNode} from '../../../../src/engine/nodes/cop/MapboxElevation';\nimport {MapboxSatelliteCopNode} from '../../../../src/engine/nodes/cop/MapboxSatellite';\nimport {MapboxCameraSopNode} from '../../../../src/engine/nodes/sop/MapboxCamera';\nimport {BasePreset} from '../../BasePreset';\n\ntype MapboxNode = MapboxElevationCopNode | MapboxSatelliteCopNode | MapboxCameraSopNode;\nexport function mapboxCollection(node: MapboxNode) {\n\tconst london = new BasePreset()\n\t\t.addEntry(node.p.longitude, -0.07956)\n\t\t.addEntry(node.p.latitude, 51.5146)\n\t\t.addEntry(node.p.zoom, 11);\n\tconst mountFuji = new BasePreset()\n\t\t.addEntry(node.p.longitude, 138.725)\n\t\t.addEntry(node.p.latitude, 35.3547)\n\t\t.addEntry(node.p.zoom, 12);\n\tconst elCapitan = new BasePreset()\n\t\t.addEntry(node.p.longitude, -119.63)\n\t\t.addEntry(node.p.latitude, 37.7331199)\n\t\t.addEntry(node.p.zoom, 13);\n\tconst sydney = new BasePreset()\n\t\t.addEntry(node.p.longitude, 151.154952)\n\t\t.addEntry(node.p.latitude, -33.8730748)\n\t\t.addEntry(node.p.zoom, 13);\n\tconst wellington = new BasePreset()\n\t\t.addEntry(node.p.longitude, 174.82731)\n\t\t.addEntry(node.p.latitude, -41.2853599)\n\t\t.addEntry(node.p.zoom, 13);\n\tconst everest = new BasePreset()\n\t\t.addEntry(node.p.longitude, 86.916198)\n\t\t.addEntry(node.p.latitude, 27.9881388)\n\t\t.addEntry(node.p.zoom, 13);\n\tconst k2 = new BasePreset()\n\t\t.addEntry(node.p.longitude, 76.5063)\n\t\t.addEntry(node.p.latitude, 35.8800041)\n\t\t.addEntry(node.p.zoom, 13);\n\t// const grandCanyon = new BasePreset()\n\t// \t.addEntry(node.p.longitude, -113.404)\n\t// \t.addEntry(node.p.latitude, 36.0922083)\n\t// \t.addEntry(node.p.zoom, 13);\n\tconst grandCanyon = new BasePreset()\n\t\t.addEntry(node.p.longitude, -111.866201)\n\t\t.addEntry(node.p.latitude, 36.3955956)\n\t\t.addEntry(node.p.zoom, 13);\n\tconst mountBlanc = new BasePreset()\n\t\t.addEntry(node.p.longitude, 6.652151)\n\t\t.addEntry(node.p.latitude, 45.8854421)\n\t\t.addEntry(node.p.zoom, 13);\n\tconst paris = new BasePreset()\n\t\t.addEntry(node.p.longitude, 2.2768)\n\t\t.addEntry(node.p.latitude, 48.8589465)\n\t\t.addEntry(node.p.zoom, 13);\n\n\treturn {\n\t\tlondon,\n\t\tmountFuji,\n\t\telCapitan,\n\t\tsydney,\n\t\twellington,\n\t\teverest,\n\t\tk2,\n\t\tgrandCanyon,\n\t\tmountBlanc,\n\t\tparis,\n\t};\n}\n","import {MapboxElevationCopNode} from '../../../src/engine/nodes/cop/MapboxElevation';\nimport {NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {mapboxCollection} from '../common/mapbox/MapboxCopCommon';\n\nconst mapboxElevationCopNodePresetsCollectionFactory: PresetsCollectionFactory<MapboxElevationCopNode> = (\n\tnode: MapboxElevationCopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tcollection.setPresets(mapboxCollection(node));\n\n\treturn collection;\n};\nexport const mapboxElevationCopPresetRegister: PresetRegister<typeof MapboxElevationCopNode, MapboxElevationCopNode> = {\n\tnodeClass: MapboxElevationCopNode,\n\tsetupFunc: mapboxElevationCopNodePresetsCollectionFactory,\n};\n","import {MapboxSatelliteCopNode} from '../../../src/engine/nodes/cop/MapboxSatellite';\nimport {NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {mapboxCollection} from '../common/mapbox/MapboxCopCommon';\n\nconst mapboxSatelliteCopNodePresetsCollectionFactory: PresetsCollectionFactory<MapboxSatelliteCopNode> = (\n\tnode: MapboxSatelliteCopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tcollection.setPresets(mapboxCollection(node));\n\n\treturn collection;\n};\nexport const mapboxSatelliteCopPresetRegister: PresetRegister<typeof MapboxSatelliteCopNode, MapboxSatelliteCopNode> = {\n\tnodeClass: MapboxSatelliteCopNode,\n\tsetupFunc: mapboxSatelliteCopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {SDFFromUrlCopNode} from '../../../src/engine/nodes/cop/SDFFromUrl';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst SDFFromUrlCopNodePresetsCollectionFactory: PresetsCollectionFactory<SDFFromUrlCopNode> = (\n\tnode: SDFFromUrlCopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction sdfMap() {\n\t\tconst list = [\n\t\t\t'deer',\n\t\t\t'deer_head',\n\t\t\t'dolphin',\n\t\t\t'eagle',\n\t\t\t'einstein',\n\t\t\t'female-average-head',\n\t\t\t'gui_fradin',\n\t\t\t'horse_head',\n\t\t\t'male-average-head',\n\t\t\t'pan',\n\t\t\t'pan.high',\n\t\t\t'rhino.high',\n\t\t\t'rhino.low',\n\t\t\t'rhino.mid',\n\t\t\t'suzanne.high',\n\t\t\t'suzanne.mid',\n\t\t\t'wolf',\n\t\t\t'zenobia_in_chain',\n\t\t];\n\n\t\tconst dict: Record<string, BasePreset> = {};\n\t\tfor (let fileName of list) {\n\t\t\tconst preset = new BasePreset().addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/sdf/${fileName}.bin`);\n\t\t\tdict[`${fileName}`] = preset;\n\t\t}\n\t\treturn dict;\n\t}\n\n\tcollection.setPresets({\n\t\t...sdfMap(),\n\t});\n\n\treturn collection;\n};\nexport const SDFFromUrlCopPresetRegister: PresetRegister<typeof SDFFromUrlCopNode, SDFFromUrlCopNode> = {\n\tnodeClass: SDFFromUrlCopNode,\n\tsetupFunc: SDFFromUrlCopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {TextCopNode} from '../../../src/engine/nodes/cop/Text';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\ninterface PresetCreateData {\n\tpreset: BasePreset;\n\tpresetName: string;\n}\n\nconst textCopNodeNodePresetsCollectionFactory: PresetsCollectionFactory<TextCopNode> = (node: TextCopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction _preset(fontName: string, presetName: string) {\n\t\tconst preset = new BasePreset().addEntry(node.p.font, `${DEMO_ASSETS_ROOT_URL}/fonts/${fontName}`);\n\t\treturn {preset, presetName};\n\t}\n\n\tfunction _sourcecodepro(presetName: string) {\n\t\treturn _preset(`SourceCodePro-${presetName}.ttf`, presetName);\n\t}\n\n\tconst FONT_DICT: Record<string, PresetCreateData[]> = {\n\t\tSourceCodePro: [\n\t\t\t'BlackIt',\n\t\t\t'Black',\n\t\t\t'BoldIt',\n\t\t\t'Bold',\n\t\t\t'ExtraLightIt',\n\t\t\t'ExtraLight',\n\t\t\t'LightIt',\n\t\t\t'Light',\n\t\t\t'MediumIt',\n\t\t\t'Medium',\n\t\t\t'Regular',\n\t\t\t'SemiboldIt',\n\t\t\t'Semibold',\n\t\t].map(_sourcecodepro),\n\t\tTastysushi: [_preset('Tastysushi.ttf', 'Regular'), _preset('TastysushiLine.ttf', 'Line')],\n\t\tmisc: [\n\t\t\t_preset('kenpixel.ttf', 'Kenpixel'),\n\t\t\t_preset('Wintersoul.ttf', 'Wintersoul'),\n\t\t\t_preset('Absolute.ttf', 'Absolute'),\n\t\t\t_preset('SpecialValentine.ttf', 'SpecialValentine'),\n\t\t\t_preset('Waterlily_Script.ttf', 'Waterlily_Script'),\n\t\t],\n\t};\n\n\tconst fontGroupNames: string[] = Object.keys(FONT_DICT);\n\tfor (let fontGroupName of fontGroupNames) {\n\t\tconst presetDatas = FONT_DICT[fontGroupName];\n\t\tif (presetDatas) {\n\t\t\tfor (let presetData of presetDatas) {\n\t\t\t\tconst fullName = `${fontGroupName}/${presetData.presetName}`;\n\t\t\t\tcollection.addPreset(fullName, presetData.preset);\n\t\t\t}\n\t\t\t// const presetName = fontName.split('.')[0];\n\t\t}\n\t}\n\n\treturn collection;\n};\nexport const textCopPresetRegister: PresetRegister<typeof TextCopNode, TextCopNode> = {\n\tnodeClass: TextCopNode,\n\tsetupFunc: textCopNodeNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {VideoCopNode} from '../../../src/engine/nodes/cop/Video';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst videoCopNodePresetsCollectionFactory: PresetsCollectionFactory<VideoCopNode> = (node: VideoCopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst blenderSintel = new BasePreset()\n\t\t.addEntry(node.p.urlsCount, 2)\n\t\t.addEntry(node.p.url1, `${DEMO_ASSETS_ROOT_URL}/textures/sintel.mp4`)\n\t\t.addEntry(node.p.url2, `${DEMO_ASSETS_ROOT_URL}/textures/sintel.ogv`);\n\n\tcollection.setPresets({\n\t\tblenderSintel,\n\t});\n\n\treturn collection;\n};\nexport const videoCopPresetRegister: PresetRegister<typeof VideoCopNode, VideoCopNode> = {\n\tnodeClass: VideoCopNode,\n\tsetupFunc: videoCopNodePresetsCollectionFactory,\n};\n","import {\n\tCameraOrbitControlsEventNode,\n\tMOUSE_CONTROLS,\n\tMouseControl,\n} from '../../../src/engine/nodes/event/CameraOrbitControls';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst cameraOrbitControlsEventNodePresetsCollectionFactory: PresetsCollectionFactory<CameraOrbitControlsEventNode> = (\n\tnode: CameraOrbitControlsEventNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst houdini = new BasePreset()\n\t\t.addEntry(node.p.middleMouseButton, MOUSE_CONTROLS.indexOf(MouseControl.PAN))\n\t\t.addEntry(node.p.rightMouseButton, MOUSE_CONTROLS.indexOf(MouseControl.DOLLY));\n\tconst threejs = new BasePreset()\n\t\t.addEntry(node.p.middleMouseButton, MOUSE_CONTROLS.indexOf(MouseControl.DOLLY))\n\t\t.addEntry(node.p.rightMouseButton, MOUSE_CONTROLS.indexOf(MouseControl.PAN));\n\n\tcollection.setPresets({\n\t\thoudini,\n\t\tthreejs,\n\t});\n\n\treturn collection;\n};\nexport const cameraOrbitControlsEventPresetRegister: PresetRegister<\n\ttypeof CameraOrbitControlsEventNode,\n\tCameraOrbitControlsEventNode\n> = {\n\tnodeClass: CameraOrbitControlsEventNode,\n\tsetupFunc: cameraOrbitControlsEventNodePresetsCollectionFactory,\n};\n","import {Attribute} from '../../../src/core/geometry/Attribute';\nimport {InstanceAttrib} from '../../../src/core/geometry/Instancer';\nimport {AttribLookup} from '../../../src/core/geometry/operation/TextureFromAttribute';\nimport {AttributeGlNode, ATTRIBUTE_NODE_AVAILABLE_GL_TYPES} from '../../../src/engine/nodes/gl/Attribute';\nimport {GlobalsTextureHandler} from '../../../src/engine/nodes/gl/code/globals/Texture';\nimport {GlConnectionPointType} from '../../../src/engine/nodes/utils/io/connections/Gl';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME} from '../../../src/engine/nodes/cop/utils/lightMap/LightMapMaterial';\n\nconst attributeGlNodePresetsCollectionFactory: PresetsCollectionFactory<AttributeGlNode> = (node: AttributeGlNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst f = ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.indexOf(GlConnectionPointType.FLOAT);\n\tconst v2 = ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.indexOf(GlConnectionPointType.VEC2);\n\tconst v3 = ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.indexOf(GlConnectionPointType.VEC3);\n\tconst v4 = ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.indexOf(GlConnectionPointType.VEC4);\n\n\tconst color = new BasePreset().addEntry(node.p.name, Attribute.COLOR).addEntry(node.p.type, v3);\n\tconst instanceColor = new BasePreset().addEntry(node.p.name, InstanceAttrib.COLOR).addEntry(node.p.type, v3);\n\tconst instanceQuaternion = new BasePreset()\n\t\t.addEntry(node.p.name, InstanceAttrib.QUATERNION)\n\t\t.addEntry(node.p.type, v4);\n\tconst instancePosition = new BasePreset().addEntry(node.p.name, InstanceAttrib.POSITION).addEntry(node.p.type, v3);\n\tconst instanceScale = new BasePreset().addEntry(node.p.name, InstanceAttrib.SCALE).addEntry(node.p.type, v3);\n\tconst instanceUv = new BasePreset().addEntry(node.p.name, InstanceAttrib.UV).addEntry(node.p.type, v2);\n\tconst position = new BasePreset().addEntry(node.p.name, Attribute.POSITION).addEntry(node.p.type, v3);\n\tconst normal = new BasePreset().addEntry(node.p.name, Attribute.NORMAL).addEntry(node.p.type, v3);\n\tconst uv = new BasePreset().addEntry(node.p.name, Attribute.UV).addEntry(node.p.type, v2);\n\tconst uvLightMap = new BasePreset()\n\t\t.addEntry(node.p.name, DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME)\n\t\t.addEntry(node.p.type, v2);\n\tconst id = new BasePreset().addEntry(node.p.name, `id`).addEntry(node.p.type, f);\n\tconst idn = new BasePreset().addEntry(node.p.name, `idn`).addEntry(node.p.type, f);\n\tconst pti = new BasePreset().addEntry(node.p.name, `pti`).addEntry(node.p.type, f);\n\t// const randomId = new BasePreset().addEntry(node.p.name, `randomId`).addEntry(node.p.type, f);\n\tconst restP = new BasePreset().addEntry(node.p.name, `restP`).addEntry(node.p.type, v3);\n\tconst restN = new BasePreset().addEntry(node.p.name, `restN`).addEntry(node.p.type, v3);\n\tconst velocity = new BasePreset().addEntry(node.p.name, `velocity`).addEntry(node.p.type, v3);\n\tconst attribLookupId = new BasePreset().addEntry(node.p.name, AttribLookup.ID).addEntry(node.p.type, f);\n\tconst attribLookupUv = new BasePreset().addEntry(node.p.name, AttribLookup.UV).addEntry(node.p.type, v2);\n\tconst particlesSimUv = new BasePreset()\n\t\t.addEntry(node.p.name, GlobalsTextureHandler.PARTICLES_SIM_UV_ATTRIB)\n\t\t.addEntry(node.p.type, v2);\n\n\tcollection.setPresets({\n\t\tcolor,\n\t\tinstanceColor,\n\t\tinstanceQuaternion,\n\t\tinstancePosition,\n\t\tinstanceScale,\n\t\tinstanceUv,\n\t\tposition,\n\t\tnormal,\n\t\tuv,\n\t\tuvLightMap,\n\t\tid,\n\t\tidn,\n\t\tpti,\n\t\trestP,\n\t\trestN,\n\t\t// randomId,\n\t\tvelocity,\n\t\tattribLookupId,\n\t\tattribLookupUv,\n\t\tparticlesSimUv,\n\t});\n\n\treturn collection;\n};\nexport const attributeGlPresetRegister: PresetRegister<typeof AttributeGlNode, AttributeGlNode> = {\n\tnodeClass: AttributeGlNode,\n\tsetupFunc: attributeGlNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {NeighbourAttractRepulseGlNode} from '../../../src/engine/nodes/gl/NeighbourAttractRepulse';\n\nconst neighbourAttractRepulseGlNodePresetsCollectionFactory: PresetsCollectionFactory<NeighbourAttractRepulseGlNode> = (\n\tnode: NeighbourAttractRepulseGlNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst position = new BasePreset().addEntry(node.p.positionAttribName, 'position');\n\tconst instancePosition = new BasePreset().addEntry(node.p.positionAttribName, 'instancePosition');\n\n\tcollection.setPresets({\n\t\tposition,\n\t\tinstancePosition,\n\t});\n\n\treturn collection;\n};\nexport const neighbourAttractRepulseGlPresetRegister: PresetRegister<\n\ttypeof NeighbourAttractRepulseGlNode,\n\tNeighbourAttractRepulseGlNode\n> = {\n\tnodeClass: NeighbourAttractRepulseGlNode,\n\tsetupFunc: neighbourAttractRepulseGlNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {NeighbourAttractGlNode} from '../../../src/engine/nodes/gl/NeighbourAttract';\nimport {NeighbourRepulseGlNode} from '../../../src/engine/nodes/gl/NeighbourRepulse';\n\ntype NeighbourGlNode = NeighbourAttractGlNode | NeighbourRepulseGlNode;\n\nconst neighbourGlNodePresetsCollectionFactory: PresetsCollectionFactory<NeighbourGlNode> = (node: NeighbourGlNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst position = new BasePreset().addEntry(node.p.positionAttribName, 'position');\n\tconst instancePosition = new BasePreset().addEntry(node.p.positionAttribName, 'instancePosition');\n\n\tcollection.setPresets({\n\t\tposition,\n\t\tinstancePosition,\n\t});\n\n\treturn collection;\n};\nexport const neighbourAttractGlPresetRegister: PresetRegister<typeof NeighbourAttractGlNode, NeighbourAttractGlNode> = {\n\tnodeClass: NeighbourAttractGlNode,\n\tsetupFunc: neighbourGlNodePresetsCollectionFactory,\n};\nexport const neighbourRepulseGlPresetRegister: PresetRegister<typeof NeighbourRepulseGlNode, NeighbourRepulseGlNode> = {\n\tnodeClass: NeighbourRepulseGlNode,\n\tsetupFunc: neighbourGlNodePresetsCollectionFactory,\n};\n","import {Attribute} from '../../../src/core/geometry/Attribute';\nimport {InstanceAttrib} from '../../../src/core/geometry/Instancer';\nimport {AttribLookup} from '../../../src/core/geometry/operation/TextureFromAttribute';\nimport {GlobalsTextureHandler} from '../../../src/engine/nodes/gl/code/globals/Texture';\nimport {AttributeJsNode, ATTRIBUTE_NODE_AVAILABLE_JS_TYPES} from '../../../src/engine/nodes/js/Attribute';\nimport {JsConnectionPointType} from '../../../src/engine/nodes/utils/io/connections/Js';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME} from '../../../src/engine/nodes/cop/utils/lightMap/LightMapMaterial';\n\nconst attributeJsNodePresetsCollectionFactory: PresetsCollectionFactory<AttributeJsNode> = (node: AttributeJsNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst f = ATTRIBUTE_NODE_AVAILABLE_JS_TYPES.indexOf(JsConnectionPointType.FLOAT);\n\tconst v2 = ATTRIBUTE_NODE_AVAILABLE_JS_TYPES.indexOf(JsConnectionPointType.VECTOR2);\n\tconst v3 = ATTRIBUTE_NODE_AVAILABLE_JS_TYPES.indexOf(JsConnectionPointType.VECTOR3);\n\tconst v4 = ATTRIBUTE_NODE_AVAILABLE_JS_TYPES.indexOf(JsConnectionPointType.VECTOR4);\n\n\tconst color = new BasePreset().addEntry(node.p.name, Attribute.COLOR).addEntry(node.p.type, v3);\n\tconst instanceColor = new BasePreset().addEntry(node.p.name, InstanceAttrib.COLOR).addEntry(node.p.type, v3);\n\tconst instanceQuaternion = new BasePreset()\n\t\t.addEntry(node.p.name, InstanceAttrib.QUATERNION)\n\t\t.addEntry(node.p.type, v4);\n\tconst instancePosition = new BasePreset().addEntry(node.p.name, InstanceAttrib.POSITION).addEntry(node.p.type, v3);\n\tconst instanceScale = new BasePreset().addEntry(node.p.name, InstanceAttrib.SCALE).addEntry(node.p.type, v3);\n\tconst instanceUv = new BasePreset().addEntry(node.p.name, InstanceAttrib.UV).addEntry(node.p.type, v2);\n\tconst position = new BasePreset().addEntry(node.p.name, Attribute.POSITION).addEntry(node.p.type, v3);\n\tconst normal = new BasePreset().addEntry(node.p.name, Attribute.NORMAL).addEntry(node.p.type, v3);\n\tconst uv = new BasePreset().addEntry(node.p.name, Attribute.UV).addEntry(node.p.type, v2);\n\tconst uvLightMap = new BasePreset()\n\t\t.addEntry(node.p.name, DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME)\n\t\t.addEntry(node.p.type, v2);\n\tconst id = new BasePreset().addEntry(node.p.name, `id`).addEntry(node.p.type, f);\n\tconst idn = new BasePreset().addEntry(node.p.name, `idn`).addEntry(node.p.type, f);\n\tconst pti = new BasePreset().addEntry(node.p.name, `pti`).addEntry(node.p.type, f);\n\t// const randomId = new BasePreset().addEntry(node.p.name, `randomId`).addEntry(node.p.type, f);\n\tconst restP = new BasePreset().addEntry(node.p.name, `restP`).addEntry(node.p.type, v3);\n\tconst restN = new BasePreset().addEntry(node.p.name, `restN`).addEntry(node.p.type, v3);\n\tconst velocity = new BasePreset().addEntry(node.p.name, `velocity`).addEntry(node.p.type, v3);\n\tconst attribLookupId = new BasePreset().addEntry(node.p.name, AttribLookup.ID).addEntry(node.p.type, f);\n\tconst attribLookupUv = new BasePreset().addEntry(node.p.name, AttribLookup.UV).addEntry(node.p.type, v2);\n\tconst particlesSimUv = new BasePreset().addEntry(node.p.name, GlobalsTextureHandler.PARTICLES_SIM_UV_ATTRIB);\n\n\tcollection.setPresets({\n\t\tcolor,\n\t\tinstanceColor,\n\t\tinstanceQuaternion,\n\t\tinstancePosition,\n\t\tinstanceScale,\n\t\tinstanceUv,\n\t\tposition,\n\t\tnormal,\n\t\tuv,\n\t\tuvLightMap,\n\t\tid,\n\t\tidn,\n\t\tpti,\n\t\trestP,\n\t\trestN,\n\t\t// randomId,\n\t\tvelocity,\n\t\tattribLookupId,\n\t\tattribLookupUv,\n\t\tparticlesSimUv,\n\t});\n\n\treturn collection;\n};\nexport const attributeJsPresetRegister: PresetRegister<typeof AttributeJsNode, AttributeJsNode> = {\n\tnodeClass: AttributeJsNode,\n\tsetupFunc: attributeJsNodePresetsCollectionFactory,\n};\n","import {/*BasePreset,*/ NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {GetChildrenAttributesJsNode} from '../../../src/engine/nodes/js/GetChildrenAttributes';\n// import {ObjectAttribute} from '../../../src/core/geometry/Attribute';\n// import {\n// \tJsConnectionPointType,\n// \tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n// } from '../../../src/engine/nodes/utils/io/connections/Js';\n\nconst getChildrenAttributesJsNodePresetsCollectionFactory: PresetsCollectionFactory<GetChildrenAttributesJsNode> = (\n\tnode: GetChildrenAttributesJsNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\t// const b = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.BOOLEAN);\n\n\t// const hovered = new BasePreset().addEntry(node.p.attribName, ObjectAttribute.HOVERED).addEntry(node.p.type, b);\n\n\tcollection.setPresets({\n\t\t// hovered,\n\t});\n\n\treturn collection;\n};\nexport const getChildrenAttributesJsPresetRegister: PresetRegister<\n\ttypeof GetChildrenAttributesJsNode,\n\tGetChildrenAttributesJsNode\n> = {\n\tnodeClass: GetChildrenAttributesJsNode,\n\tsetupFunc: getChildrenAttributesJsNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {GetObjectAttributeJsNode} from '../../../src/engine/nodes/js/GetObjectAttribute';\nimport {ObjectAttribute} from '../../../src/core/geometry/Attribute';\nimport {\n\tJsConnectionPointType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../../../src/engine/nodes/utils/io/connections/Js';\nimport {StringParam} from '../../../src/engine/params/String';\n\nconst getObjectAttributeJsNodePresetsCollectionFactory: PresetsCollectionFactory<GetObjectAttributeJsNode> = (\n\tnode: GetObjectAttributeJsNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst b = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.BOOLEAN);\n\n\tconst hovered = new BasePreset()\n\t\t.addEntry(node.params.get('attribName') as StringParam, ObjectAttribute.HOVERED)\n\t\t.addEntry(node.p.type, b);\n\n\tcollection.setPresets({\n\t\thovered,\n\t});\n\n\treturn collection;\n};\nexport const getObjectAttributeJsPresetRegister: PresetRegister<\n\ttypeof GetObjectAttributeJsNode,\n\tGetObjectAttributeJsNode\n> = {\n\tnodeClass: GetObjectAttributeJsNode,\n\tsetupFunc: getObjectAttributeJsNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {GetObjectUserDataJsNode} from '../../../src/engine/nodes/js/GetObjectUserData';\nimport {JsConnectionPointType, JS_CONNECTION_POINT_TYPES} from '../../../src/engine/nodes/utils/io/connections/Js';\nimport {ObjectUserData} from '../../../src/core/UserData';\n\nconst getObjectUserDataJsNodePresetsCollectionFactory: PresetsCollectionFactory<GetObjectUserDataJsNode> = (\n\tnode: GetObjectUserDataJsNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst TYPES = {\n\t\tcatmulRomCurve3: JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.CATMULL_ROM_CURVE3),\n\t\tObject3D: JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.OBJECT_3D),\n\t};\n\tconst _withName = (userDataName: string) => {\n\t\treturn new BasePreset().addEntry(node.p.name, userDataName);\n\t};\n\tconst _catmulRomCurve3 = (userDataName: string) => {\n\t\treturn _withName(userDataName).addEntry(node.p.type, TYPES.catmulRomCurve3);\n\t};\n\tconst _object3D = (userDataName: string) => {\n\t\treturn _withName(userDataName).addEntry(node.p.type, TYPES.Object3D);\n\t};\n\n\tconst path = _catmulRomCurve3(ObjectUserData.PATH);\n\tconst lowResSoftBodyMesh = _object3D(ObjectUserData.LOW_RES_SOFT_BODY_MESH);\n\n\tcollection.setPresets({\n\t\tpath,\n\t\tlowResSoftBodyMesh,\n\t});\n\n\treturn collection;\n};\nexport const getObjectUserDataJsPresetRegister: PresetRegister<\n\ttypeof GetObjectUserDataJsNode,\n\tGetObjectUserDataJsNode\n> = {\n\tnodeClass: GetObjectUserDataJsNode,\n\tsetupFunc: getObjectUserDataJsNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {OnChildAttributeUpdateJsNode} from '../../../src/engine/nodes/js/OnChildAttributeUpdate';\nimport {ObjectAttribute} from '../../../src/core/geometry/Attribute';\nimport {\n\tJsConnectionPointType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../../../src/engine/nodes/utils/io/connections/Js';\nimport {StringParam} from '../../../src/engine/params/String';\n\nconst onChildAttributeUpdateJsNodePresetsCollectionFactory: PresetsCollectionFactory<OnChildAttributeUpdateJsNode> = (\n\tnode: OnChildAttributeUpdateJsNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst b = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.BOOLEAN);\n\n\tconst hovered = new BasePreset()\n\t\t.addEntry(node.params.get('attribName') as StringParam, ObjectAttribute.HOVERED)\n\t\t.addEntry(node.p.type, b);\n\n\tcollection.setPresets({\n\t\thovered,\n\t});\n\n\treturn collection;\n};\nexport const onChildAttributeUpdateJsPresetRegister: PresetRegister<\n\ttypeof OnChildAttributeUpdateJsNode,\n\tOnChildAttributeUpdateJsNode\n> = {\n\tnodeClass: OnChildAttributeUpdateJsNode,\n\tsetupFunc: onChildAttributeUpdateJsNodePresetsCollectionFactory,\n};\n","import {OnKeyJsNode} from '../../../src/engine/nodes/js/OnKey';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst onKeyJsNodePresetsCollectionFactory: PresetsCollectionFactory<OnKeyJsNode> = (node: OnKeyJsNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst WASD_ARROWS = new BasePreset().addEntry(\n\t\tnode.p.keyCodes,\n\t\t'Space ShiftLeft ShiftRight KeyW KeyA KeyS KeyD ArrowUp ArrowLeft ArrowDown ArrowRight'\n\t);\n\tconst ARROWS = new BasePreset().addEntry(\n\t\tnode.p.keyCodes,\n\t\t'Space ShiftLeft ShiftRight ArrowUp ArrowLeft ArrowDown ArrowRight'\n\t);\n\tconst WASD = new BasePreset().addEntry(node.p.keyCodes, 'Space ShiftLeft ShiftRight KeyW KeyA KeyS KeyD');\n\tcollection.setPresets({\n\t\tWASD_ARROWS,\n\t\tARROWS,\n\t\tWASD,\n\t});\n\n\treturn collection;\n};\nexport const onKeyJsPresetRegister: PresetRegister<typeof OnKeyJsNode, OnKeyJsNode> = {\n\tnodeClass: OnKeyJsNode,\n\tsetupFunc: onKeyJsNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {OnObjectAttributeUpdateJsNode} from '../../../src/engine/nodes/js/OnObjectAttributeUpdate';\nimport {ObjectAttribute} from '../../../src/core/geometry/Attribute';\nimport {\n\tJsConnectionPointType,\n\tPARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES,\n} from '../../../src/engine/nodes/utils/io/connections/Js';\nimport {StringParam} from '../../../src/engine/params/String';\n\nconst onObjectAttributeUpdateJsNodePresetsCollectionFactory: PresetsCollectionFactory<OnObjectAttributeUpdateJsNode> = (\n\tnode: OnObjectAttributeUpdateJsNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst b = PARAM_CONVERTIBLE_JS_CONNECTION_POINT_TYPES.indexOf(JsConnectionPointType.BOOLEAN);\n\n\tconst hovered = new BasePreset()\n\t\t.addEntry(node.params.get('attribName') as StringParam, ObjectAttribute.HOVERED)\n\t\t.addEntry(node.p.type, b);\n\n\tcollection.setPresets({\n\t\thovered,\n\t});\n\n\treturn collection;\n};\nexport const onObjectAttributeUpdateJsPresetRegister: PresetRegister<\n\ttypeof OnObjectAttributeUpdateJsNode,\n\tOnObjectAttributeUpdateJsNode\n> = {\n\tnodeClass: OnObjectAttributeUpdateJsNode,\n\tsetupFunc: onObjectAttributeUpdateJsNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {OnObjectSwipeJsNode} from '../../../src/engine/nodes/js/OnObjectSwipe';\nimport {OnObjectSwipeGPUJsNode} from '../../../src/engine/nodes/js/OnObjectSwipeGPU';\nimport {ANGLE_DEGREES} from '../../../src/engine/scene/utils/actors/rayObjectIntersection/RayObjectIntersectionsSwipeController';\n\ntype SwipeNode = OnObjectSwipeJsNode | OnObjectSwipeGPUJsNode;\n\nconst onObjectSwipeJsNodePresetsCollectionFactory: PresetsCollectionFactory<SwipeNode> = (node: SwipeNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst left = new BasePreset().addEntry(node.p.angle, ANGLE_DEGREES.LEFT);\n\tconst right = new BasePreset().addEntry(node.p.angle, ANGLE_DEGREES.RIGHT);\n\tconst up = new BasePreset().addEntry(node.p.angle, ANGLE_DEGREES.UP);\n\tconst down = new BasePreset().addEntry(node.p.angle, ANGLE_DEGREES.DOWN);\n\n\tcollection.setPresets({\n\t\tleft,\n\t\tright,\n\t\tup,\n\t\tdown,\n\t});\n\n\treturn collection;\n};\nexport const onObjectSwipeJsPresetRegister: PresetRegister<typeof OnObjectSwipeJsNode, OnObjectSwipeJsNode> = {\n\tnodeClass: OnObjectSwipeJsNode,\n\tsetupFunc: onObjectSwipeJsNodePresetsCollectionFactory,\n};\nexport const onObjectSwipeGPUJsPresetRegister: PresetRegister<typeof OnObjectSwipeGPUJsNode, OnObjectSwipeGPUJsNode> = {\n\tnodeClass: OnObjectSwipeGPUJsNode,\n\tsetupFunc: onObjectSwipeJsNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {RayFromCameraJsNode} from '../../../src/engine/nodes/js/RayFromCamera';\n\nconst rayFromCameraJsNodePresetsCollectionFactory: PresetsCollectionFactory<RayFromCameraJsNode> = (\n\tnode: RayFromCameraJsNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst center = new BasePreset().addEntry(node.p.x, 0).addEntry(node.p.y, 0);\n\tconst bottomLeft = new BasePreset().addEntry(node.p.x, -1).addEntry(node.p.y, -1);\n\tconst topLeft = new BasePreset().addEntry(node.p.x, -1).addEntry(node.p.y, 1);\n\tconst bottomRight = new BasePreset().addEntry(node.p.x, 1).addEntry(node.p.y, 1);\n\tconst topRight = new BasePreset().addEntry(node.p.x, 1).addEntry(node.p.y, -1);\n\n\tcollection.setPresets({\n\t\tcenter,\n\t\tbottomLeft,\n\t\ttopLeft,\n\t\tbottomRight,\n\t\ttopRight,\n\t});\n\n\treturn collection;\n};\nexport const rayFromCameraJsPresetRegister: PresetRegister<typeof RayFromCameraJsNode, RayFromCameraJsNode> = {\n\tnodeClass: RayFromCameraJsNode,\n\tsetupFunc: rayFromCameraJsNodePresetsCollectionFactory,\n};\n","import {CodeMatNode, VERTEX_DEFAULT} from '../../../src/engine/nodes/mat/Code';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst EvanWallaceCC0 = `// https://madebyevan.com/shaders/grid/`;\n\nconst AntialiasedGridY = {\n\tvertex: VERTEX_DEFAULT,\n\tfragment: `\n${EvanWallaceCC0}\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\t// Pick a coordinate to visualize in a grid\n  float coord = 5.0 * vWorldPosition.y;\n\n  // Compute anti-aliased world-space grid lines\n  float line = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);\n\n  // Just visualize the grid lines directly\n  float color = 1.0 - min(line, 1.0);\n\n  // Apply gamma correction\n  color = pow(color, 1.0 / 2.2);\n  gl_FragColor = vec4(vec3(color), 1.0);\n\n}\n`,\n};\n\nconst AntialiasedGridXZ = {\n\tvertex: VERTEX_DEFAULT,\n\tfragment: `\n${EvanWallaceCC0}\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\t// Pick a coordinate to visualize in a grid\n\tvec2 coord = 5.0 * vWorldPosition.xz;\n\n\t// Compute anti-aliased world-space grid lines\n\tvec2 grid = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);\n\tfloat line = min(grid.x, grid.y);\n\n\t// Just visualize the grid lines directly\n\tfloat color = 1.0 - min(line, 1.0);\n\n\t// Apply gamma correction\n\tcolor = pow(color, 1.0 / 2.2);\n\tgl_FragColor = vec4(vec3(color), 1.0);\n\n}\n`,\n};\n\nconst AntialiasedGridXYZ = {\n\tvertex: VERTEX_DEFAULT,\n\tfragment: `\n${EvanWallaceCC0}\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\t// Pick a coordinate to visualize in a grid\n\tvec3 coord = 5.0 * vWorldPosition.xyz;\n\n\t// Compute anti-aliased world-space grid lines\n\tvec3 grid = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);\n\tfloat line = min(min(grid.x, grid.y), grid.z);\n\n\t// Just visualize the grid lines directly\n\tfloat color = 1.0 - min(line, 1.0);\n\n\t// Apply gamma correction\n\tcolor = pow(color, 1.0 / 2.2);\n\tgl_FragColor = vec4(vec3(color), 1.0);\n}\n`,\n};\n\nconst AntialiasedGridLengthXZ = {\n\tvertex: VERTEX_DEFAULT,\n\tfragment: `\n${EvanWallaceCC0}\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\t// Pick a coordinate to visualize in a grid\n\tfloat coord = 5.0 * length(vWorldPosition.xz);\n\n\t// Compute anti-aliased world-space grid lines\n\tfloat line = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);\n\n\t// Just visualize the grid lines directly\n\tfloat color = 1.0 - min(line, 1.0);\n\n\t// Apply gamma correction\n\tcolor = pow(color, 1.0 / 2.2);\n\tgl_FragColor = vec4(vec3(color), 1.0);\n\t}\n`,\n};\n\nconst AntialiasedGridWeb = {\n\tvertex: VERTEX_DEFAULT,\n\tfragment: `\n${EvanWallaceCC0}\nvarying vec3 vWorldPosition;\n\nvoid main() {\n\n\t// Pick a coordinate to visualize in a grid\n\tconst float pi = 3.141592653589793;\n\tconst float scale = 10.0;\n\tvec2 coord = vec2(length(5.0 * vWorldPosition.xz), atan(5.0 * vWorldPosition.x, 5.0 * vWorldPosition.z) * scale / pi);\n\n\t// Handling the wrap-around is tricky in this case. The function atan()\n\t// is not continuous and jumps when it wraps from -pi to pi. The screen-\n\t// space partial derivative will be huge along that boundary. To avoid\n\t// this, compute another coordinate that places the jump at a different\n\t// place, then use the coordinate where the jump is farther away.\n\t//\n\t// When doing this, make sure to always evaluate both fwidth() calls even\n\t// though we only use one. All fragment shader threads in the thread group\n\t// actually share a single instruction pointer, so threads that diverge\n\t// down different conditional branches actually cause both branches to be\n\t// serialized one after the other. Calling fwidth() from a thread next to\n\t// an inactive thread ends up reading inactive registers with old values\n\t// in them and you get an undefined value.\n\t//\n\t// The conditional uses +/-scale/2 since coord.y has a range of +/-scale.\n\t// The jump is at +/-scale for coord and at 0 for wrapped.\n\tvec2 wrapped = vec2(coord.x, fract(coord.y / (2.0 * scale)) * (2.0 * scale));\n\tvec2 coordWidth = fwidth(coord);\n\tvec2 wrappedWidth = fwidth(wrapped);\n\tvec2 width = coord.y < -scale * 0.5 || coord.y > scale * 0.5 ? wrappedWidth : coordWidth;\n\n\t// Compute anti-aliased world-space grid lines\n\tvec2 grid = abs(fract(coord - 0.5) - 0.5) / width;\n\tfloat line = min(grid.x, grid.y);\n\n\t// Just visualize the grid lines directly\n\tfloat color = 1.0 - min(line, 1.0);\n\n\t// Apply gamma correction\n\tcolor = pow(color, 1.0 / 2.2);\n\tgl_FragColor = vec4(vec3(color), 1.0);\n}\n`,\n};\n\nconst codeMatNodePresetsCollectionFactory: PresetsCollectionFactory<CodeMatNode> = (node: CodeMatNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst antialiasedGridY = new BasePreset()\n\t\t.addEntry(node.p.vertex, AntialiasedGridY.vertex)\n\t\t.addEntry(node.p.fragment, AntialiasedGridY.fragment)\n\t\t.addEntry(node.p.clipCullDistance, true)\n\t\t.addEntry(node.p.multiDraw, true);\n\tconst antialiasedGridXZ = new BasePreset()\n\t\t.addEntry(node.p.vertex, AntialiasedGridXZ.vertex)\n\t\t.addEntry(node.p.fragment, AntialiasedGridXZ.fragment)\n\t\t.addEntry(node.p.clipCullDistance, true)\n\t\t.addEntry(node.p.multiDraw, true);\n\tconst antialiasedGridXYZ = new BasePreset()\n\t\t.addEntry(node.p.vertex, AntialiasedGridXYZ.vertex)\n\t\t.addEntry(node.p.fragment, AntialiasedGridXYZ.fragment)\n\t\t.addEntry(node.p.clipCullDistance, true)\n\t\t.addEntry(node.p.multiDraw, true);\n\tconst antialiasedGridLengthXZ = new BasePreset()\n\t\t.addEntry(node.p.vertex, AntialiasedGridLengthXZ.vertex)\n\t\t.addEntry(node.p.fragment, AntialiasedGridLengthXZ.fragment)\n\t\t.addEntry(node.p.clipCullDistance, true)\n\t\t.addEntry(node.p.multiDraw, true);\n\tconst antialiasedGridWeb = new BasePreset()\n\t\t.addEntry(node.p.vertex, AntialiasedGridWeb.vertex)\n\t\t.addEntry(node.p.fragment, AntialiasedGridWeb.fragment)\n\t\t.addEntry(node.p.clipCullDistance, true)\n\t\t.addEntry(node.p.multiDraw, true);\n\n\tcollection.setPresets({\n\t\tantialiasedGridY,\n\t\tantialiasedGridXZ,\n\t\tantialiasedGridXYZ,\n\t\tantialiasedGridLengthXZ,\n\t\tantialiasedGridWeb,\n\t});\n\n\treturn collection;\n};\nexport const codeMatPresetRegister: PresetRegister<typeof CodeMatNode, CodeMatNode> = {\n\tnodeClass: CodeMatNode,\n\tsetupFunc: codeMatNodePresetsCollectionFactory,\n};\n","import {ATTRIBUTE_CLASSES, AttribClass, ATTRIBUTE_TYPES, AttribType} from '../../../src/core/geometry/Constant';\nimport {CSSObjectAttribute} from '../../../src/core/render/CSSRenderers/CSSObjectAttribute';\nimport {WFCQuadAttribute} from '../../../src/core/wfc/WFCAttributes';\nimport {tileConfigToString} from '../../../src/core/wfc/WFCTileConfig';\nimport {AttribCreateSopNode} from '../../../src/engine/nodes/sop/AttribCreate';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst attribCreateSopNodePresetsCollectionFactory: PresetsCollectionFactory<AttribCreateSopNode> = (\n\tnode: AttribCreateSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction _makeSize1(preset: BasePreset) {\n\t\treturn preset.addEntry(node.p.size, 1);\n\t}\n\tfunction _makeSize3(preset: BasePreset) {\n\t\treturn preset.addEntry(node.p.size, 3);\n\t}\n\tfunction _makeAttribClassPrimitive(preset: BasePreset) {\n\t\treturn preset.addEntry(node.p.class, ATTRIBUTE_CLASSES.indexOf(AttribClass.PRIMITIVE));\n\t}\n\tfunction _makeAttribClassObject(preset: BasePreset) {\n\t\treturn preset.addEntry(node.p.class, ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT));\n\t}\n\tfunction _numeric() {\n\t\treturn new BasePreset()\n\t\t\t.addEntry(node.p.type, ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC))\n\t\t\t.addEntry(node.p.string, '')\n\t\t\t.addEntry(node.p.value1, 0)\n\t\t\t.addEntry(node.p.value2, 0)\n\t\t\t.addEntry(node.p.value3, 0)\n\t\t\t.addEntry(node.p.value4, 0);\n\t}\n\tfunction _string() {\n\t\treturn new BasePreset()\n\t\t\t.addEntry(node.p.type, ATTRIBUTE_TYPES.indexOf(AttribType.STRING))\n\t\t\t.addEntry(node.p.value1, 0)\n\t\t\t.addEntry(node.p.value2, 0)\n\t\t\t.addEntry(node.p.value3, 0)\n\t\t\t.addEntry(node.p.value4, 0);\n\t}\n\tfunction _size1() {\n\t\treturn _makeSize1(_numeric());\n\t}\n\tfunction _size3() {\n\t\treturn _makeSize3(_numeric());\n\t}\n\tfunction CSSObject(attribName: CSSObjectAttribute) {\n\t\treturn _makeAttribClassObject(_string().addEntry(node.p.name, attribName));\n\t}\n\n\tconst id = _size1().addEntry(node.p.name, 'id').addEntry(node.p.value1, '@ptnum');\n\tconst pti = _size1().addEntry(node.p.name, 'pti').addEntry(node.p.value1, '@ptnum / (pointsCount(0)-1)');\n\tconst bbx = _size1()\n\t\t.addEntry(node.p.name, 'bbx')\n\t\t.addEntry(node.p.value1, `(@P.x - bbox(0, 'min').x) / bbox(0,'size').x`);\n\tconst bby = _size1()\n\t\t.addEntry(node.p.name, 'bby')\n\t\t.addEntry(node.p.value1, `(@P.y - bbox(0, 'min').y) / bbox(0,'size').y`);\n\tconst bbz = _size1()\n\t\t.addEntry(node.p.name, 'bbz')\n\t\t.addEntry(node.p.value1, `(@P.z - bbox(0, 'min').z) / bbox(0,'size').z`);\n\tconst randomId = _size1()\n\t\t.addEntry(node.p.name, 'randomId')\n\t\t.addEntry(node.p.value1, `10000 * rand(@ptnum * 124.543)`);\n\tconst up = _size3().addEntry(node.p.name, 'up').addEntry(node.p.value3, [0, 1, 0]);\n\n\tconst html = {\n\t\tid: CSSObject(CSSObjectAttribute.ID),\n\t\tclass: CSSObject(CSSObjectAttribute.CLASS),\n\t\thtml: CSSObject(CSSObjectAttribute.HTML),\n\t};\n\tconst SAMPLE_TILE_NAME = 'my-tile-name';\n\tconst WFC = {\n\t\t[WFCQuadAttribute.QUAD_ID]: _makeAttribClassPrimitive(_size1())\n\t\t\t.addEntry(node.p.group, '')\n\t\t\t.addEntry(node.p.name, WFCQuadAttribute.QUAD_ID)\n\t\t\t.addEntry(node.p.value1, '@primnum'),\n\t\t[WFCQuadAttribute.FLOOR_INDEX]: _makeAttribClassObject(_size1())\n\t\t\t.addEntry(node.p.group, '')\n\t\t\t.addEntry(node.p.name, WFCQuadAttribute.FLOOR_INDEX)\n\t\t\t.addEntry(node.p.value1, '@objnum'),\n\t\t[WFCQuadAttribute.TILE_ID]: _makeAttribClassPrimitive(_string())\n\t\t\t.addEntry(node.p.group, '')\n\t\t\t.addEntry(node.p.name, WFCQuadAttribute.TILE_ID)\n\t\t\t.addEntry(node.p.string, SAMPLE_TILE_NAME),\n\t\t[WFCQuadAttribute.SOLVE_ALLOWED]: _makeAttribClassPrimitive(_size1())\n\t\t\t.addEntry(node.p.group, '0')\n\t\t\t.addEntry(node.p.name, WFCQuadAttribute.SOLVE_ALLOWED)\n\t\t\t.addEntry(node.p.value1, 0),\n\t\t[WFCQuadAttribute.SOLVED_TILE_CONFIGS]: _makeAttribClassPrimitive(_string())\n\t\t\t.addEntry(node.p.group, '')\n\t\t\t.addEntry(node.p.name, WFCQuadAttribute.SOLVED_TILE_CONFIGS)\n\t\t\t.addEntry(node.p.string, tileConfigToString({tileId: SAMPLE_TILE_NAME, rotation: 0})),\n\t};\n\n\tcollection.setPresets({\n\t\tid,\n\t\tpti,\n\t\tbbx,\n\t\tbby,\n\t\tbbz,\n\t\trandomId,\n\t\tup,\n\t\t'html/id': html.id,\n\t\t'html/class': html.class,\n\t\t'html/html': html.html,\n\t\t[`WFC/${WFCQuadAttribute.QUAD_ID}`]: WFC[WFCQuadAttribute.QUAD_ID],\n\t\t[`WFC/${WFCQuadAttribute.FLOOR_INDEX}`]: WFC[WFCQuadAttribute.FLOOR_INDEX],\n\t\t[`WFC/${WFCQuadAttribute.TILE_ID}`]: WFC[WFCQuadAttribute.TILE_ID],\n\t\t[`WFC/${WFCQuadAttribute.SOLVE_ALLOWED}`]: WFC[WFCQuadAttribute.SOLVE_ALLOWED],\n\t\t[`WFC/${WFCQuadAttribute.SOLVED_TILE_CONFIGS}`]: WFC[WFCQuadAttribute.SOLVED_TILE_CONFIGS],\n\t});\n\n\treturn collection;\n};\nexport const attribCreateSopPresetRegister: PresetRegister<typeof AttribCreateSopNode, AttribCreateSopNode> = {\n\tnodeClass: AttribCreateSopNode,\n\tsetupFunc: attribCreateSopNodePresetsCollectionFactory,\n};\n","import {ATTRIBUTE_CLASSES, AttribClass} from './../../../src/core/geometry/Constant';\nimport {AttribPromoteSopNode} from '../../../src/engine/nodes/sop/AttribPromote';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst attribPromoteSopNodeNodePresetsCollectionFactory: PresetsCollectionFactory<AttribPromoteSopNode> = (\n\tnode: AttribPromoteSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst points = ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT);\n\tconst primitives = ATTRIBUTE_CLASSES.indexOf(AttribClass.PRIMITIVE);\n\tconst objects = ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT);\n\n\tcollection.addPreset(\n\t\t'Object -> Point',\n\t\tnew BasePreset().addEntry(node.p.classFrom, objects).addEntry(node.p.classTo, points)\n\t);\n\tcollection.addPreset(\n\t\t'Object -> Primitive',\n\t\tnew BasePreset().addEntry(node.p.classFrom, objects).addEntry(node.p.classTo, primitives)\n\t);\n\tcollection.addPreset(\n\t\t'Point -> Object',\n\t\tnew BasePreset().addEntry(node.p.classFrom, points).addEntry(node.p.classTo, objects)\n\t);\n\tcollection.addPreset(\n\t\t'Point -> Primitive',\n\t\tnew BasePreset().addEntry(node.p.classFrom, points).addEntry(node.p.classTo, primitives)\n\t);\n\n\treturn collection;\n};\nexport const attribPromoteSopPresetRegister: PresetRegister<typeof AttribPromoteSopNode, AttribPromoteSopNode> = {\n\tnodeClass: AttribPromoteSopNode,\n\tsetupFunc: attribPromoteSopNodeNodePresetsCollectionFactory,\n};\n","import {ASSETS_ROOT} from '../../../src/core/loader/AssetsUtils';\nimport {sanitizeUrl} from '../../../src/core/UrlHelper';\nimport {CADFileSTEPSopNode} from '../../../src/engine/nodes/sop/CADFileSTEP';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst CADFileSTEPSopNodePresetsCollectionFactory: PresetsCollectionFactory<CADFileSTEPSopNode> = (\n\tnode: CADFileSTEPSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst _url = (url: string) => {\n\t\treturn new BasePreset().addEntry(node.p.url, sanitizeUrl(`${ASSETS_ROOT}/models/${url}`));\n\t};\n\tcollection.setPresets({\n\t\t'3M_961401-9040704-AR': _url('3M_961401-9040704-AR.STEP'),\n\t\t'grabcad/legowhitehousejp': _url('resources/grabcad/legowhitehousejp.STEP'),\n\t\t'grabcad/pigsignaler': _url('resources/grabcad/pigsignaler.STEP'),\n\t});\n\n\treturn collection;\n};\nexport const cadFileSTEPSopPresetRegister: PresetRegister<typeof CADFileSTEPSopNode, CADFileSTEPSopNode> = {\n\tnodeClass: CADFileSTEPSopNode,\n\tsetupFunc: CADFileSTEPSopNodePresetsCollectionFactory,\n};\n","export const EXAMPLE_COLOR = `<div id='my-viewer'></div>\n<div id='color-bars'>\n\t<div class='color-bar red'></div>\n\t<div class='color-bar green'></div>\n\t<div class='color-bar blue'></div>\n</div>\n\n<style>\n\t#my-viewer {\n\t\theight: 100%;\n\t}\n\t#color-bars {\n\t\tposition: absolute;\n\t\ttop: 0px;\n\t\tleft: 0px;\n\t\twidth: 100%;\n\t\theight: 20px;\n\t\tdisplay: flex;\n\t\tgap: 0.5rem;\n\t\talign-items: center;\n\t}\n\t.color-bar {\n\t\theight: 100%;\n\t\tflex: 1 1 0%;\n\t\tdisplay: inline-block;\n\t}\n\t.color-bar.red { background-color: red; }\n\t.color-bar.green { background-color: green; }\n\t.color-bar.blue { background-color: blue; }\n</style>\n\n`;\n","export const EXAMPLE_DEVICE_ORIENTATION_PERMISSION = `<div id='my-viewer'></div>\n<div id='button-container'>\n\t<button id=\"startButton\">START</button>\n</div>\n\n<style>\n\t#my-viewer {\n\t\theight: 100%;\n\t}\n\t#button-container {\n\t\tposition: absolute;\n\t\ttop: 0px;\n\t\tleft: 0px;\n\t\twidth: 100%;\n\t\tpadding: 20px 20px;\n\t}\n\t#startButton {\n\t\twidth: 100%;\n\t\tpadding: 10px 10px;\n\t\tdisplay: block;\n\t\tmargin: auto;\n\t\tbackground-color: #eb660d;\n\t\tborder: 2px solid #dc550c;\n\t\tcolor: white;\n\t\tcursor: pointer;\n\t}\n</style>\n<script>\n\t// do not use const so that we don't get 'already declared variables' errors\n\t// when loading this multiple times\n\tstartButton = document.getElementById('startButton');\n\tstartButton.onclick = function() {\n\t\tif (\n\t\t\twindow.DeviceOrientationEvent !== undefined &&\n\t\t\ttypeof window.DeviceOrientationEvent.requestPermission === 'function'\n\t\t) {\n\t\t\twindow.DeviceOrientationEvent.requestPermission()\n\t\t\t\t.then(function (response) {\n\t\t\t\t\tif (response == 'granted') {\n\t\t\t\t\t\tscene.play();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(function (error) {\n\t\t\t\t\t// alert('error:\"'+error+'\"');\n\t\t\t\t});\n\t\t} else {\n\t\t\tscene.play();\n\t\t}\n\t\tstartButton.parentElement.removeChild(startButton);\n\t}\n</script>\n`;\n","export const EXAMPLE_SCROLL = `<div id=\"main-container\">\n\t<div id=\"my-viewer\"></div>\n\t<div id=\"scroll-container\">\n\t\t<div class=\"checkpoint-padding orange\">padding 1</div>\n\t\t<div id=\"checkpoint1\" class=\"red\">#checkpoint1</div>\n\t\t<div class=\"checkpoint-padding green\">padding 2</div>\n\t\t<div id=\"checkpoint2\" class=\"green\">#checkpoint2</div>\n\t\t<div class=\"checkpoint-padding purple\">padding 3</div>\n\t\t<div id=\"checkpoint3\" class=\"teal\">#checkpoint3</div>\n\t\t<div class=\"checkpoint-padding yellow\">padding 4</div>\n\t\t<div id=\"checkpoint4\" class=\"lightgreen\">#checkpoint4</div>\n\t\t<div class=\"checkpoint-padding red\">padding 5</div>\n\t</div>\n</div>\n\n<style>\n\t#main-container {\n\t\tposition: relative;\n\t\theight: 100%;\n\t\tbackground-color: rgb(0, 255, 0);\n\t}\n\t#my-viewer {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\t#scroll-container {\n\t\tposition: relative;\n\t\theight: 100%;\n\t\toverflow-y: scroll;\n\t}\n\t.checkpoint-padding {\n\t\tpointer-events: none;\n\t\theight: 120vh;\n\t\tcolor: orange;\n\t\tborder: 4px solid transparent;\n\t}\n\t.checkpoint {\n\t\tpointer-events: none;\n\t\theight: 120vh;\n\t\tcolor: white;\n\t\tborder: 4px solid transparent;\n\t}\n\t.orange { border-color: orange; }\n\t.red { border-color: red; }\n\t.green { border-color: green; }\n\t.blue { border-color: blue; }\n\t.purple { border-color: purple; }\n\t.teal { border-color: teal; }\n\t.yellow { border-color: yellow; }\n\t.lightgreen { border-color: lightgreen; }\n</style>\n`;\n","/**\n * this is necessary for the js/onObjectSwipe nodes to work\n */\nexport const EXAMPLE_TOUCH_ACTION_NONE = `\n<div id=\"my-viewer\"></div>\n\n<style>\n\t#my-viewer {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\ttouch-action: none;\n\t}\n</style>\n`;\n","import {CameraViewerCodeSopNode} from '../../../src/engine/nodes/sop/CameraViewerCode';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {EXAMPLE_COLOR} from './CameraViewerCode/color';\nimport {EXAMPLE_DEVICE_ORIENTATION_PERMISSION} from './CameraViewerCode/deviceOrientationPermission';\nimport {EXAMPLE_SCROLL} from './CameraViewerCode/onScroll';\nimport {EXAMPLE_TOUCH_ACTION_NONE} from './CameraViewerCode/touchActionNone';\n\nexport enum CameraViewerCodePresetName {\n\tCOLOR = 'color',\n\tDEVICE_ORIENTATION_PERMISSION = 'deviceOrientationPermission',\n\tON_SCROLL = 'onScroll',\n\tTOUCH_ACTION_NONE = 'touchActionNone',\n}\nconst cameraViewerCodeSopNodePresetsCollectionFactory: PresetsCollectionFactory<CameraViewerCodeSopNode> = (\n\tnode: CameraViewerCodeSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst basePresetNoShadowRoot = () => {\n\t\tconst preset = new BasePreset().addEntry(node.p.viewerId, 'my-viewer');\n\t\t// preset.addEntry(node.p.shadowRoot, true)\n\t\treturn preset;\n\t};\n\t// const basePresetNoShadowRoot = () => new BasePreset().addEntry(node.p.viewerId, 'my-viewer');\n\n\tconst color = basePresetNoShadowRoot().addEntry(node.p.html, EXAMPLE_COLOR);\n\tconst deviceOrientationPermission = basePresetNoShadowRoot().addEntry(\n\t\tnode.p.html,\n\t\tEXAMPLE_DEVICE_ORIENTATION_PERMISSION\n\t);\n\tconst onScroll = basePresetNoShadowRoot().addEntry(node.p.html, EXAMPLE_SCROLL);\n\tconst onTouchActionNone = basePresetNoShadowRoot().addEntry(node.p.html, EXAMPLE_TOUCH_ACTION_NONE);\n\n\tcollection.setPresets({\n\t\t[CameraViewerCodePresetName.COLOR]: color,\n\t\t[CameraViewerCodePresetName.DEVICE_ORIENTATION_PERMISSION]: deviceOrientationPermission,\n\t\t[CameraViewerCodePresetName.ON_SCROLL]: onScroll,\n\t\t[CameraViewerCodePresetName.TOUCH_ACTION_NONE]: onTouchActionNone,\n\t});\n\treturn collection;\n};\nexport const cameraViewerCodeSopPresetRegister: PresetRegister<\n\ttypeof CameraViewerCodeSopNode,\n\tCameraViewerCodeSopNode\n> = {\n\tnodeClass: CameraViewerCodeSopNode,\n\tsetupFunc: cameraViewerCodeSopNodePresetsCollectionFactory,\n};\n","import {CameraWebXRARMarkerTrackingSopNode} from '../../../src/engine/nodes/sop/CameraWebXRARMarkerTracking';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nimport {\n\t// MarkerTrackingControllerConfig,\n\tMarkerTrackingSourceMode,\n\tMARKER_TRACKING_SOURCE_MODES,\n\t// MARKER_TRACKING_TRANSFORM_MODES,\n\t// MarkerTrackingTransformMode,\n} from '../../../src/core/webXR/markerTracking/Common';\nimport {ASSETS_ROOT} from '../../../src/core/loader/AssetsUtils';\nimport {sanitizeUrl} from '../../../src/core/UrlHelper';\n\nconst cameraWebXRARMarkerTrackingSopNodePresetsCollectionFactory: PresetsCollectionFactory<\n\tCameraWebXRARMarkerTrackingSopNode\n> = (node: CameraWebXRARMarkerTrackingSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst videoUrl = sanitizeUrl(`${ASSETS_ROOT}/textures/markertracking/marker_tracking1.mp4`);\n\tconst imageUrl = sanitizeUrl(`${ASSETS_ROOT}/textures/markertracking/marker_tracking1.png`);\n\n\tconst webcam = new BasePreset().addEntry(\n\t\tnode.p.sourceMode,\n\t\tMARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.WEBCAM)\n\t);\n\tconst videoSample = new BasePreset()\n\t\t.addEntry(node.p.sourceMode, MARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.VIDEO))\n\t\t.addEntry(node.p.sourceUrl, `\\`blob('${videoUrl}')\\``);\n\tconst imageSample = new BasePreset()\n\t\t.addEntry(node.p.sourceMode, MARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.IMAGE))\n\t\t.addEntry(node.p.sourceUrl, `\\`blob('${imageUrl}')\\``);\n\tcollection.setPresets({\n\t\tvideoSample,\n\t\timageSample,\n\t\twebcam,\n\t});\n\n\treturn collection;\n};\nexport const cameraWebXRARMarkerTrackingSopPresetRegister: PresetRegister<\n\ttypeof CameraWebXRARMarkerTrackingSopNode,\n\tCameraWebXRARMarkerTrackingSopNode\n> = {\n\tnodeClass: CameraWebXRARMarkerTrackingSopNode,\n\tsetupFunc: cameraWebXRARMarkerTrackingSopNodePresetsCollectionFactory,\n};\n","import {CapsuleSopNode} from '../../../src/engine/nodes/sop/Capsule';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst capsuleSopNodePresetsCollectionFactory: PresetsCollectionFactory<CapsuleSopNode> = (node: CapsuleSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst playerControls = new BasePreset().addEntry(node.p.center, [0, `-(ch('height')*0.5 - ch('radius'))`, 0]);\n\tcollection.setPresets({\n\t\tplayerControls,\n\t});\n\n\treturn collection;\n};\nexport const capsuleSopPresetRegister: PresetRegister<typeof CapsuleSopNode, CapsuleSopNode> = {\n\tnodeClass: CapsuleSopNode,\n\tsetupFunc: capsuleSopNodePresetsCollectionFactory,\n};\n","// this preset works well with an input being a line with many points\nconst LINE_TWIST = `\nconst otherPos = new Vector3();\nconst currentPos = new Vector3();\nconst tangent = new Vector3();\nconst tangentOffset = new Vector3();\nconst normalVector = new Vector3();\n\nexport class CodeSopProcessor extends BaseCodeSopProcessor {\n\toverride initializeProcessor() {}\n\toverride cook(inputCoreGroups: CoreGroup[]) {\n\t\tconst inputCoreGroup = inputCoreGroups[0];\n\t\tconst objects = inputCoreGroup.threejsObjectsWithGeo();\n\t\tfor (let object of objects) {\n\t\t\tthis._processObject(object);\n\t\t}\n\t\tthis.setCoreGroup(inputCoreGroup);\n\t}\n\tprivate _processObject(object: Object3DWithGeometry) {\n\t\tconst geometry = object.geometry;\n\t\tconst position = geometry.getAttribute('position');\n\t\tconst restP = geometry.getAttribute('restP');\n\t\tif (!position) {\n\t\t\treturn;\n\t\t}\n\t\tif (!restP) {\n\t\t\treturn console.warn('no restP');\n\t\t}\n\t\tconst {mult, twist} = this.pv;\n\t\tconst restPArray = restP.array;\n\t\tconst positionArray = position.array;\n\t\tconst stride = 3;\n\t\tconst pointsCount = position.count;\n\t\tfor (let i = 0; i < pointsCount; i++) {\n\t\t\tif (i < pointsCount - 1) {\n\t\t\t\tcurrentPos.fromArray(restPArray, i * stride);\n\t\t\t\totherPos.fromArray(restPArray, (i + 1) * stride);\n\t\t\t\ttangent.copy(currentPos).sub(otherPos);\n\t\t\t} else {\n\t\t\t\tcurrentPos.fromArray(restPArray, i * stride);\n\t\t\t\totherPos.fromArray(restPArray, (i - 1) * stride);\n\t\t\t\ttangent.copy(otherPos).sub(currentPos);\n\t\t\t}\n\t\t\ttangent.normalize();\n\t\t\ttangentOffset.copy(tangent);\n\t\t\ttangentOffset.x += 0.1;\n\t\t\ttangentOffset.normalize();\n\t\t\tnormalVector.crossVectors(tangentOffset, tangent);\n\t\t\tnormalVector.normalize();\n\t\t\tnormalVector.applyAxisAngle(tangent, i * twist);\n\n\t\t\tcurrentPos.add(normalVector.multiplyScalar(mult));\n\t\t\tcurrentPos.toArray(positionArray, i * stride);\n\t\t}\n\t}\n}\n`;\n\nimport {CodeSopNode} from '../../../src/engine/nodes/sop/Code';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst codeSopNodePresetsCollectionFactory: PresetsCollectionFactory<CodeSopNode> = (node: CodeSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst lineTwist = new BasePreset().addEntry(node.p.codeTypescript, LINE_TWIST);\n\tcollection.setPresets({\n\t\tlineTwist,\n\t});\n\n\treturn collection;\n};\nexport const codeSopPresetRegister: PresetRegister<typeof CodeSopNode, CodeSopNode> = {\n\tnodeClass: CodeSopNode,\n\tsetupFunc: codeSopNodePresetsCollectionFactory,\n};\n","import {ColorSopNode} from '../../../src/engine/nodes/sop/Color';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\n// export function ColorSopNodePresets() {\n// \treturn {\n// \t\tfromColor: function (node: ColorSopNode) {\n// \t\t\tnode.p.color.set(['@Cd.r', '@Cd.g', '@Cd.b']);\n// \t\t},\n// \t\tfromPosition: function (node: ColorSopNode) {\n// \t\t\tnode.p.color.set(['@P.x', '@P.y', '@P.z']);\n// \t\t},\n// \t};\n// }\n\nconst colorSopNodePresetsCollectionFactory: PresetsCollectionFactory<ColorSopNode> = (node: ColorSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst fromColor = new BasePreset().addEntry(node.p.color, ['@Cd.r', '@Cd.g', '@Cd.b']);\n\tconst fromPosition = new BasePreset().addEntry(node.p.color, ['@P.x', '@P.y', '@P.z']);\n\tcollection.setPresets({\n\t\tfromColor,\n\t\tfromPosition,\n\t});\n\n\treturn collection;\n};\nexport const colorSopPresetRegister: PresetRegister<typeof ColorSopNode, ColorSopNode> = {\n\tnodeClass: ColorSopNode,\n\tsetupFunc: colorSopNodePresetsCollectionFactory,\n};\n","import {CSS2DObjectSopNode} from '../../../src/engine/nodes/sop/CSS2DObject';\nimport {ParamType} from '../../../src/engine/poly/ParamType';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\n// export function CSS2DObjectSopNodePresets() {\n// \treturn {\n// \t\tsmooth_transform: function (node: CSS2DObjectSopNode) {\n// \t\t\tnode.p.useHTMLAttrib.set(false);\n// \t\t\tnode.p.html.set(`<div style='will-change: transform;'>default html</div>`);\n// \t\t},\n// \t\tsmooth_opacity: function (node: CSS2DObjectSopNode) {\n// \t\t\tnode.p.useHTMLAttrib.set(false);\n// \t\t\tnode.p.html.set(\"<div style='will-change: opacity;'>default html</div>\");\n// \t\t},\n// \t\tsmooth_opacity_and_transform: function (node: CSS2DObjectSopNode) {\n// \t\t\tnode.p.useHTMLAttrib.set(false);\n// \t\t\tnode.p.html.set(\"<div style='will-change: transform, opacity;'>default html</div>\");\n// \t\t},\n// \t};\n// }\n\nconst CSS2DObjectSopNodePresetsCollectionFactory: PresetsCollectionFactory<CSS2DObjectSopNode> = (\n\tnode: CSS2DObjectSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst smooth_transform = new BasePreset()\n\t\t.addEntry(node.p.overrideHTML, true)\n\t\t.addEntry<ParamType.STRING>(node.p.html, `<div style='will-change: transform;'>default html</div>`);\n\tconst smooth_opacity = new BasePreset()\n\t\t.addEntry(node.p.overrideHTML, true)\n\t\t.addEntry<ParamType.STRING>(node.p.html, `<div style='will-change: opacity;'>default html</div>`);\n\tconst smooth_opacity_and_transform = new BasePreset()\n\t\t.addEntry(node.p.overrideHTML, true)\n\t\t.addEntry<ParamType.STRING>(node.p.html, `<div style='will-change: transform, opacity;'>default html</div>`);\n\tcollection.setPresets({\n\t\tsmooth_transform,\n\t\tsmooth_opacity,\n\t\tsmooth_opacity_and_transform,\n\t});\n\n\treturn collection;\n};\nexport const CSS2DObjectPresetRegister: PresetRegister<typeof CSS2DObjectSopNode, CSS2DObjectSopNode> = {\n\tnodeClass: CSS2DObjectSopNode,\n\tsetupFunc: CSS2DObjectSopNodePresetsCollectionFactory,\n};\n","import {DataSopNode} from '../../../src/engine/nodes/sop/Data';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nconst BASIC_DATA = [{height: 3}, {height: 4}];\nconst DEFAULT_DATA = [\n\t{value: -40},\n\t{value: -30},\n\t{value: -20},\n\t{value: -10},\n\t{value: 0},\n\t{value: 10},\n\t{value: 20},\n\t{value: 30},\n\t{value: 40},\n\t{value: 50},\n\t{value: 60},\n\t{value: 70},\n\t{value: 80},\n];\n\n// export function DataSopNodePresets() {\n// \treturn {\n// \t\tbasic: function (node: DataSopNode) {\n// \t\t\tnode.p.data.set(JSON.stringify(BASIC_DATA));\n// \t\t},\n// \t\tdefault: function (node: DataSopNode) {\n// \t\t\tnode.p.data.set(JSON.stringify(DEFAULT_DATA));\n// \t\t},\n// \t};\n// }\n\nconst dataSopNodePresetsCollectionFactory: PresetsCollectionFactory<DataSopNode> = (node: DataSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst basic = new BasePreset().addEntry(node.p.data, JSON.stringify(BASIC_DATA));\n\tconst defaultPreset = new BasePreset().addEntry(node.p.data, JSON.stringify(DEFAULT_DATA));\n\tcollection.setPresets({\n\t\tbasic,\n\t\tdefault: defaultPreset,\n\t});\n\n\treturn collection;\n};\nexport const dataSopPresetRegister: PresetRegister<typeof DataSopNode, DataSopNode> = {\n\tnodeClass: DataSopNode,\n\tsetupFunc: dataSopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {DataType, DataUrlSopNode, DATA_TYPES} from '../../../src/engine/nodes/sop/DataUrl';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst dataUrlSopNodePresetsCollectionFactory: PresetsCollectionFactory<DataUrlSopNode> = (node: DataUrlSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction cleanPreset() {\n\t\tconst preset = new BasePreset();\n\t\tpreset.addEntry(node.p.jsonDataKeysPrefix, '');\n\t\tpreset.addEntry(node.p.readAttribNamesFromFile, false);\n\t\treturn preset;\n\t}\n\n\tfunction jsonPreset() {\n\t\tconst preset = cleanPreset();\n\t\tpreset.addEntry(node.p.dataType, DATA_TYPES.indexOf(DataType.JSON));\n\t\treturn preset;\n\t}\n\tfunction csvPreset() {\n\t\tconst preset = cleanPreset();\n\t\tpreset.addEntry(node.p.dataType, DATA_TYPES.indexOf(DataType.CSV));\n\t\treturn preset;\n\t}\n\tfunction withUrl(preset: BasePreset, fileName: string) {\n\t\tpreset.addEntry(node.p.url, `${DEMO_ASSETS_ROOT_URL}/nodes/sop/DataUrl/${fileName}`);\n\t\treturn preset;\n\t}\n\n\tconst basic = withUrl(jsonPreset(), 'basic.json');\n\tconst basicWithPosition = withUrl(jsonPreset(), 'basicWithPosition.json');\n\tconst basicWithPrefix = withUrl(jsonPreset(), 'basicWithPrefix.json').addEntry(node.p.jsonDataKeysPrefix, 'myData');\n\tconst defaultPreset = withUrl(jsonPreset(), 'default.json');\n\tconst csvWithAttribNames = withUrl(csvPreset(), 'with_attrib_names.csv').addEntry(\n\t\tnode.p.readAttribNamesFromFile,\n\t\ttrue\n\t);\n\tconst csvWithoutAttribNames = withUrl(csvPreset(), 'without_attrib_names.csv')\n\t\t.addEntry(node.p.readAttribNamesFromFile, false)\n\t\t.addEntry(node.p.attribNames, 'id height scale strength');\n\tcollection.setPresets({\n\t\tbasic,\n\t\tbasicWithPosition,\n\t\tbasicWithPrefix,\n\t\tdefault: defaultPreset,\n\t\tcsvWithAttribNames,\n\t\tcsvWithoutAttribNames,\n\t});\n\n\treturn collection;\n};\nexport const dataUrlSopPresetRegister: PresetRegister<typeof DataUrlSopNode, DataUrlSopNode> = {\n\tnodeClass: DataUrlSopNode,\n\tsetupFunc: dataUrlSopNodePresetsCollectionFactory,\n};\n","import {AttribClass, ATTRIBUTE_CLASSES} from '../../../src/core/geometry/Constant';\nimport {DeleteSopNode} from '../../../src/engine/nodes/sop/Delete';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst deleteSopNodePresetsCollectionFactory: PresetsCollectionFactory<DeleteSopNode> = (node: DeleteSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst allFaces = new BasePreset()\n\t\t.addEntry(node.p.class, ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT))\n\t\t.addEntry(node.p.byExpression, true)\n\t\t.addEntry(node.p.expression, true)\n\t\t.addEntry(node.p.keepPoints, true);\n\tcollection.setPresets({\n\t\tallFaces,\n\t});\n\n\treturn collection;\n};\nexport const deleteSopPresetRegister: PresetRegister<typeof DeleteSopNode, DeleteSopNode> = {\n\tnodeClass: DeleteSopNode,\n\tsetupFunc: deleteSopNodePresetsCollectionFactory,\n};\n","import {DirectionalLightSopNode} from '../../../src/engine/nodes/sop/DirectionalLight';\nimport {PolyDictionary} from '../../../src/types/GlobalTypes';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst shadowSizePowers = [5, 6, 7, 8, 9, 10, 11];\n\nconst directionalLightSopNodePresetsCollectionFactory: PresetsCollectionFactory<DirectionalLightSopNode> = (\n\tnode: DirectionalLightSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst presetsByName: PolyDictionary<BasePreset> = {};\n\tfor (let i = 0; i < shadowSizePowers.length; i++) {\n\t\tconst shadowSizePower = shadowSizePowers[i];\n\t\tconst shadowSize = 2 ** shadowSizePower;\n\t\tconst preset = new BasePreset().addEntry(node.p.shadowRes, [shadowSize, shadowSize]);\n\t\tconst presetName = `shadow resolution ${i}: 2^${shadowSize} (${shadowSize}x${shadowSize})`;\n\t\tpresetsByName[presetName] = preset;\n\t}\n\n\tcollection.setPresets(presetsByName);\n\n\treturn collection;\n};\nexport const directionalLightSopPresetRegister: PresetRegister<\n\ttypeof DirectionalLightSopNode,\n\tDirectionalLightSopNode\n> = {\n\tnodeClass: DirectionalLightSopNode,\n\tsetupFunc: directionalLightSopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {FileDRCSopNode} from '../../../src/engine/nodes/sop/FileDRC';\nimport {FileFBXSopNode} from '../../../src/engine/nodes/sop/FileFBX';\nimport {FileGLTFSopNode} from '../../../src/engine/nodes/sop/FileGLTF';\nimport {FileJSONSopNode} from '../../../src/engine/nodes/sop/FileJSON';\nimport {FileMPDSopNode} from '../../../src/engine/nodes/sop/FileMPD';\nimport {FileOBJSopNode} from '../../../src/engine/nodes/sop/FileOBJ';\nimport {FilePDBSopNode} from '../../../src/engine/nodes/sop/FilePDB';\nimport {FilePLYSopNode} from '../../../src/engine/nodes/sop/FilePLY';\nimport {FileSTLSopNode} from '../../../src/engine/nodes/sop/FileSTL';\nimport {ParamType} from '../../../src/engine/poly/ParamType';\nimport {PolyDictionary} from '../../../src/types/GlobalTypes';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nfunction generateThreedScans(node: FileGLTFSopNode) {\n\treturn function _threedscans() {\n\t\tfunction _threedscan(fileName: string) {\n\t\t\treturn new BasePreset().addEntry<ParamType.STRING>(\n\t\t\t\tnode.p.url,\n\t\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/resources/threedscans.com/${fileName}.glb`\n\t\t\t);\n\t\t}\n\t\tconst fileNames = [\n\t\t\t'beethoven',\n\t\t\t'eagle',\n\t\t\t'einstein',\n\t\t\t'horse_head',\n\t\t\t'jenner',\n\t\t\t'pan',\n\t\t\t'rhino',\n\t\t\t'theodoric_the_great',\n\t\t\t'zenobia_in_chains',\n\t\t];\n\t\tconst dict: PolyDictionary<BasePreset> = {};\n\t\tfor (let fileName of fileNames) {\n\t\t\tdict[`threedscans.com/${fileName}`] = _threedscan(fileName);\n\t\t}\n\t\treturn dict;\n\t};\n}\nfunction _quaternius(node: FileGLTFSopNode) {\n\tfunction _quaterniusAnimal(animal: string) {\n\t\treturn new BasePreset().addEntry<ParamType.STRING>(\n\t\t\tnode.p.url,\n\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/resources/quaternius/animals/${animal}.gltf`\n\t\t);\n\t}\n\n\tconst animals: string[] = [\n\t\t'Alpaca',\n\t\t'Bull',\n\t\t'Cow',\n\t\t'Deer',\n\t\t'Donkey',\n\t\t'Fox',\n\t\t'Horse',\n\t\t'Horse_White',\n\t\t'Husky',\n\t\t'ShibaInu',\n\t\t'Stag',\n\t\t'Wolf',\n\t];\n\tconst dict: PolyDictionary<BasePreset> = {};\n\tfor (let animal of animals) {\n\t\tdict[`quaternius/${animal}`] = _quaterniusAnimal(animal);\n\t}\n\treturn dict;\n}\n\nconst drc = (node: FileDRCSopNode) => {\n\treturn {\n\t\tbunny_drc: new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/bunny.drc`),\n\t};\n};\n\nconst fbx = (node: FileFBXSopNode) => {\n\treturn {\n\t\tbunny_fbx: new BasePreset().addEntry<ParamType.STRING>(\n\t\t\tnode.p.url,\n\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/fbx/stanford-bunny.fbx`\n\t\t),\n\t};\n};\nconst mpd = (node: FileMPDSopNode) => {\n\tconst list = [\n\t\t`10174-1-ImperialAT-ST-UCS.mpd_Packed`,\n\t\t`1621-1-LunarMPVVehicle.mpd_Packed`,\n\t\t`30023-1-Lighthouse.ldr_Packed`,\n\t\t`30051-1-X-wingFighter-Mini.mpd_Packed`,\n\t\t`30054-1-AT-ST-Mini.mpd_Packed`,\n\t\t`4489-1-AT-AT-Mini.mpd_Packed`,\n\t\t`4494-1-Imperial Shuttle-Mini.mpd_Packed`,\n\t\t`4838-1-MiniVehicles.mpd_Packed`,\n\t\t`4915-1-MiniConstruction.mpd_Packed`,\n\t\t`4918-1-MiniFlyers.mpd_Packed`,\n\t\t`5935-1-IslandHopper.mpd_Packed`,\n\t\t`6965-1-TIEIntercep_4h4MXk5.mpd_Packed`,\n\t\t`6966-1-JediStarfighter-Mini.mpd_Packed`,\n\t\t`7140-1-X-wingFighter.mpd_Packed`,\n\t\t`889-1-RadarTruck.mpd_Packed`,\n\t\t`car.ldr_Packed`,\n\t];\n\n\tconst data: PolyDictionary<BasePreset> = {};\n\tfor (let elem of list) {\n\t\tdata[elem] = new BasePreset().addEntry<ParamType.STRING>(\n\t\t\tnode.p.url,\n\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/ldraw/officialLibrary/models/${elem}.mpd`\n\t\t);\n\t}\n\n\treturn data;\n};\n\nconst pdb = (node: FileMPDSopNode) => {\n\treturn {\n\t\tethanol: new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/ethanol.pdb`),\n\t};\n};\nconst ply = (node: FileMPDSopNode) => {\n\treturn {\n\t\tdolphine: new BasePreset().addEntry<ParamType.STRING>(\n\t\t\tnode.p.url,\n\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/dolphins_be.ply`\n\t\t),\n\t};\n};\nconst gltf = (node: FileGLTFSopNode) => {\n\tconst car = new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/car.glb`);\n\tconst flamingo = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/flamingo.glb`\n\t);\n\tconst parrot = new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/parrot.glb`);\n\tconst soldier = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/soldier.glb`\n\t);\n\tconst sphere_with_texture = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/sphere_with_texture.glb`\n\t);\n\tfunction _photogrammetry() {\n\t\tfunction _photogrammetryModel(fileName: string) {\n\t\t\treturn new BasePreset().addEntry<ParamType.STRING>(\n\t\t\t\tnode.p.url,\n\t\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/photogrammetry/${fileName}.glb`\n\t\t\t);\n\t\t}\n\t\tconst fileNames = [\n\t\t\t'gui_fradin_head_only_hi_res',\n\t\t\t'gui_fradin_head_only_lo_res',\n\t\t\t'gui_fradin_hi_res',\n\t\t\t'gui_fradin_lo_res',\n\t\t\t'gui_fradin_textured',\n\t\t\t'gui_fradin_textured_head_only',\n\t\t];\n\t\tconst dict: PolyDictionary<BasePreset> = {};\n\t\tfor (let fileName of fileNames) {\n\t\t\tdict[`photogrammetry/${fileName}`] = _photogrammetryModel(fileName);\n\t\t}\n\t\treturn dict;\n\t}\n\treturn {\n\t\tcar,\n\t\tflamingo,\n\t\tparrot,\n\t\tsoldier,\n\t\tsphere_with_texture,\n\t\t..._photogrammetry(),\n\t};\n};\nconst obj = (node: FileOBJSopNode) => {\n\tconst deer = new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/deer.obj`);\n\tconst wolf = new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/wolf.obj`);\n\tconst dolphin = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/dolphin.obj`\n\t);\n\tfunction _3dscanstores() {\n\t\tfunction _3dscanstore(fileName: string) {\n\t\t\treturn new BasePreset().addEntry<ParamType.STRING>(\n\t\t\t\tnode.p.url,\n\t\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/resources/3dscanstore.com/BaseMeshes/OBJ/${fileName}.obj`\n\t\t\t);\n\t\t}\n\t\tconst fileNames = [\n\t\t\t'Female-Average-Head',\n\t\t\t'Female-Average-Head.capped',\n\t\t\t'Male-Average-Head',\n\t\t\t'Male-Average-Head.capped',\n\t\t\t'Super-Average-Head',\n\t\t];\n\t\tconst dict: PolyDictionary<BasePreset> = {};\n\t\tfor (let fileName of fileNames) {\n\t\t\tdict[`3dscanstore.com/${fileName}`] = _3dscanstore(fileName);\n\t\t}\n\t\treturn dict;\n\t}\n\tfunction _renderPeoples() {\n\t\tfunction _renderPeople(fileName: string) {\n\t\t\treturn new BasePreset().addEntry<ParamType.STRING>(\n\t\t\t\tnode.p.url,\n\t\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/resources/renderpeople.com/${fileName}.obj`\n\t\t\t);\n\t\t}\n\t\tconst fileNameDatas = [\n\t\t\t{dennis_30k: 'rp_dennis_posed_004_OBJ/rp_dennis_posed_004_30k'},\n\t\t\t{dennis_2k: 'rp_dennis_posed_004_OBJ/rp_dennis_posed_004_2k'},\n\t\t\t{fabienne: 'rp_fabienne_percy_posed_001_OBJ/rp_fabienne_percy_posed_001_60k'},\n\t\t\t{mei_30k: 'rp_mei_posed_001_OBJ/rp_mei_posed_001_30k'},\n\t\t\t{mei_2k: 'rp_mei_posed_001_OBJ/rp_mei_posed_001_2k'},\n\t\t];\n\t\tconst dict: PolyDictionary<BasePreset> = {};\n\t\tfor (let fileNameData of fileNameDatas) {\n\t\t\tconst shortName = Object.keys(fileNameData)[0];\n\t\t\tconst fileName = Object.values(fileNameData)[0];\n\t\t\tdict[`renderpeople.com/${shortName}`] = _renderPeople(fileName);\n\t\t}\n\t\treturn dict;\n\t}\n\treturn {\n\t\tdeer,\n\t\twolf,\n\t\tdolphin,\n\t\t..._3dscanstores(),\n\t\t..._renderPeoples(),\n\t};\n};\nconst threejsJSON = (node: FileJSONSopNode) => {\n\treturn {\n\t\tscatteredBoxes: new BasePreset().addEntry<ParamType.STRING>(\n\t\t\tnode.p.url,\n\t\t\t`${DEMO_ASSETS_ROOT_URL}/models/threejs/scatteredBoxes.json`\n\t\t),\n\t};\n};\nconst stl = (node: FileSTLSopNode) => {\n\treturn {\n\t\twarrior: new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/warrior.stl`),\n\t};\n};\n\nconst fileDRCSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileDRCSopNode> = (node: FileDRCSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...drc(node),\n\t});\n\n\treturn collection;\n};\nconst fileFBXSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileFBXSopNode> = (node: FileFBXSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...fbx(node),\n\t});\n\n\treturn collection;\n};\nconst fileGLTFSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileGLTFSopNode> = (node: FileGLTFSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...gltf(node),\n\t\t...generateThreedScans(node)(),\n\t\t..._quaternius(node),\n\t});\n\n\treturn collection;\n};\n\nconst fileJSONSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileJSONSopNode> = (node: FileJSONSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...threejsJSON(node),\n\t});\n\n\treturn collection;\n};\nconst fileMPDSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileMPDSopNode> = (node: FileMPDSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...mpd(node),\n\t});\n\n\treturn collection;\n};\nconst fileOBJSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileOBJSopNode> = (node: FileOBJSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...obj(node),\n\t});\n\n\treturn collection;\n};\nconst filePDBSopNodePresetsCollectionFactory: PresetsCollectionFactory<FilePDBSopNode> = (node: FilePDBSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...pdb(node),\n\t});\n\n\treturn collection;\n};\nconst filePLYSopNodePresetsCollectionFactory: PresetsCollectionFactory<FilePDBSopNode> = (node: FilePLYSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...ply(node),\n\t});\n\n\treturn collection;\n};\nconst fileSTLSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileSTLSopNode> = (node: FileSTLSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\tcollection.setPresets({\n\t\t...stl(node),\n\t});\n\n\treturn collection;\n};\nexport const fileDRCSopPresetRegister: PresetRegister<typeof FileDRCSopNode, FileDRCSopNode> = {\n\tnodeClass: FileDRCSopNode,\n\tsetupFunc: fileDRCSopNodePresetsCollectionFactory,\n};\nexport const fileFBXSopPresetRegister: PresetRegister<typeof FileFBXSopNode, FileFBXSopNode> = {\n\tnodeClass: FileFBXSopNode,\n\tsetupFunc: fileFBXSopNodePresetsCollectionFactory,\n};\nexport const fileGLTFSopPresetRegister: PresetRegister<typeof FileGLTFSopNode, FileGLTFSopNode> = {\n\tnodeClass: FileGLTFSopNode,\n\tsetupFunc: fileGLTFSopNodePresetsCollectionFactory,\n};\n\nexport const fileJSONSopPresetRegister: PresetRegister<typeof FileJSONSopNode, FileJSONSopNode> = {\n\tnodeClass: FileJSONSopNode,\n\tsetupFunc: fileJSONSopNodePresetsCollectionFactory,\n};\nexport const fileMPDSopPresetRegister: PresetRegister<typeof FileMPDSopNode, FileMPDSopNode> = {\n\tnodeClass: FileMPDSopNode,\n\tsetupFunc: fileMPDSopNodePresetsCollectionFactory,\n};\nexport const fileOBJSopPresetRegister: PresetRegister<typeof FileOBJSopNode, FileOBJSopNode> = {\n\tnodeClass: FileOBJSopNode,\n\tsetupFunc: fileOBJSopNodePresetsCollectionFactory,\n};\nexport const filePDBSopPresetRegister: PresetRegister<typeof FilePDBSopNode, FilePDBSopNode> = {\n\tnodeClass: FilePDBSopNode,\n\tsetupFunc: filePDBSopNodePresetsCollectionFactory,\n};\nexport const filePLYSopPresetRegister: PresetRegister<typeof FilePLYSopNode, FilePLYSopNode> = {\n\tnodeClass: FilePLYSopNode,\n\tsetupFunc: filePLYSopNodePresetsCollectionFactory,\n};\nexport const fileSTLSopPresetRegister: PresetRegister<typeof FileSTLSopNode, FileSTLSopNode> = {\n\tnodeClass: FileSTLSopNode,\n\tsetupFunc: fileSTLSopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {ParamType} from '../../../src/engine/poly/ParamType';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {FileSVGSopNode} from '../../../src/engine/nodes/sop/FileSVG';\n\nconst fileSVGSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileSVGSopNode> = (node: FileSVGSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst tiger = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/svg/tiger.svg`\n\t);\n\tconst wolf = new BasePreset().addEntry<ParamType.STRING>(node.p.url, `${DEMO_ASSETS_ROOT_URL}/models/svg/wolf.svg`);\n\n\tcollection.setPresets({\n\t\ttiger,\n\t\twolf,\n\t});\n\n\treturn collection;\n};\n\nexport const fileSVGSopPresetRegister: PresetRegister<typeof FileSVGSopNode, FileSVGSopNode> = {\n\tnodeClass: FileSVGSopNode,\n\tsetupFunc: fileSVGSopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {ParamType} from '../../../src/engine/poly/ParamType';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {FileGEOJSONSopNode} from '../../../src/engine/nodes/sop/FileGEOJSON';\n\nconst fileGEOJSONSopNodePresetsCollectionFactory: PresetsCollectionFactory<FileGEOJSONSopNode> = (\n\tnode: FileGEOJSONSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst wikipediaSample = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/geojson/wikipedia.geojson`\n\t);\n\tconst brooklyn = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/geojson/ebrelsford/brooklyn.geojson`\n\t);\n\tconst queens = new BasePreset().addEntry<ParamType.STRING>(\n\t\tnode.p.url,\n\t\t`${DEMO_ASSETS_ROOT_URL}/models/geojson/ebrelsford/queens.geojson`\n\t);\n\t// const ibm_bounded = new BasePreset().addEntry<ParamType.STRING>(\n\t// \tnode.p.url,\n\t// \t`${DEMO_ASSETS_ROOT_URL}/models/geojson/ibm.bounded.geojson`\n\t// );\n\t// const ibm_features = new BasePreset().addEntry<ParamType.STRING>(\n\t// \tnode.p.url,\n\t// \t`${DEMO_ASSETS_ROOT_URL}/models/geojson/ibm.features.geojson`\n\t// );\n\t// const ibm_line = new BasePreset().addEntry<ParamType.STRING>(\n\t// \tnode.p.url,\n\t// \t`${DEMO_ASSETS_ROOT_URL}/models/geojson/ibm.line.geojson`\n\t// );\n\n\tcollection.setPresets({\n\t\twikipediaSample,\n\t\tbrooklyn,\n\t\tqueens,\n\t\t// ibm_bounded,\n\t\t// ibm_features,\n\t\t// ibm_line,\n\t});\n\n\treturn collection;\n};\n\nexport const fileGEOJSONSopPresetRegister: PresetRegister<typeof FileGEOJSONSopNode, FileGEOJSONSopNode> = {\n\tnodeClass: FileGEOJSONSopNode,\n\tsetupFunc: fileGEOJSONSopNodePresetsCollectionFactory,\n};\n","import {ParamType} from '../../../src/engine/poly/ParamType';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {MapboxCameraSopNode} from '../../../src/engine/nodes/sop/MapboxCamera';\nimport {mapboxCollection} from '../common/mapbox/MapboxCopCommon';\nconst mapboxCameraSopNodePresetsCollectionFactory: PresetsCollectionFactory<MapboxCameraSopNode> = (\n\tnode: MapboxCameraSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tfunction setStyle(preset: BasePreset, url: string) {\n\t\treturn preset.addEntry<ParamType.STRING>(node.p.style, url);\n\t}\n\tfunction style(url: string) {\n\t\treturn setStyle(new BasePreset(), url);\n\t}\n\n\tconst dark = style('mapbox://styles/mapbox/dark-v11');\n\tconst streets = style('mapbox://styles/mapbox/streets-v12');\n\tconst outdoors = style('mapbox://styles/mapbox/outdoors-v12');\n\tconst light = style('mapbox://styles/mapbox/light-v11');\n\tconst satellite = style('mapbox://styles/mapbox/satellite-v9');\n\tconst satelliteStreets = style('mapbox://styles/mapbox/satellite-streets-v12');\n\tconst navigationDay = style('mapbox://styles/mapbox/navigation-day-v1');\n\tconst navigationNight = style('mapbox://styles/mapbox/navigation-night-v1');\n\n\tconst styles = {\n\t\tdark,\n\t\tstreets,\n\t\toutdoors,\n\t\tlight,\n\t\tsatellite,\n\t\tsatelliteStreets,\n\t\tnavigationDay,\n\t\tnavigationNight,\n\t};\n\tconst styleNames = Object.keys(styles);\n\tconst stylesAsSubCategory: Record<string, BasePreset> = {};\n\tfor (let styleName of styleNames) {\n\t\tstylesAsSubCategory[`style/${styleName}`] = (styles as any)[styleName as any];\n\t}\n\n\tconst locationPresets = mapboxCollection(node);\n\tconst locationNames = Object.keys(locationPresets);\n\tconst locationsAsSubCategory: Record<string, BasePreset> = {};\n\tfor (let locationName of locationNames) {\n\t\tlocationsAsSubCategory[`location/${locationName}`] = (locationPresets as any)[locationName as any];\n\t}\n\n\tcollection.setPresets({...stylesAsSubCategory, ...locationsAsSubCategory});\n\n\treturn collection;\n};\n\nexport const mapboxCameraSopPresetRegister: PresetRegister<typeof MapboxCameraSopNode, MapboxCameraSopNode> = {\n\tnodeClass: MapboxCameraSopNode,\n\tsetupFunc: mapboxCameraSopNodePresetsCollectionFactory,\n};\n","import {NormalsSopNode} from '../../../src/engine/nodes/sop/Normals';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst normalsSopNodePresetsCollectionFactory: PresetsCollectionFactory<NormalsSopNode> = (node: NormalsSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst positionToNormal = new BasePreset()\n\t\t.addEntry(node.p.edit, true)\n\t\t.addEntry(node.p.updateX, true)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, true)\n\t\t.addEntry(node.p.x, '@P.x')\n\t\t.addEntry(node.p.y, '@P.y')\n\t\t.addEntry(node.p.z, '@P.z');\n\n\tconst x = new BasePreset()\n\t\t.addEntry(node.p.edit, true)\n\t\t.addEntry(node.p.updateX, true)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, true)\n\t\t.addEntry(node.p.x, 1)\n\t\t.addEntry(node.p.y, 0)\n\t\t.addEntry(node.p.z, 0);\n\tconst y = new BasePreset()\n\t\t.addEntry(node.p.edit, true)\n\t\t.addEntry(node.p.updateX, true)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, true)\n\t\t.addEntry(node.p.x, 0)\n\t\t.addEntry(node.p.y, 1)\n\t\t.addEntry(node.p.z, 0);\n\tconst z = new BasePreset()\n\t\t.addEntry(node.p.edit, true)\n\t\t.addEntry(node.p.updateX, true)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, true)\n\t\t.addEntry(node.p.x, 0)\n\t\t.addEntry(node.p.y, 0)\n\t\t.addEntry(node.p.z, 1);\n\n\tcollection.setPresets({\n\t\tpositionToNormal,\n\t\tx,\n\t\ty,\n\t\tz,\n\t});\n\n\treturn collection;\n};\nexport const normalsSopPresetRegister: PresetRegister<typeof NormalsSopNode, NormalsSopNode> = {\n\tnodeClass: NormalsSopNode,\n\tsetupFunc: normalsSopNodePresetsCollectionFactory,\n};\n","import {PointSopNode} from '../../../src/engine/nodes/sop/Point';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME} from '../../../src/engine/nodes/cop/utils/lightMap/LightMapMaterial';\n\nconst pointSopNodePresetsCollectionFactory: PresetsCollectionFactory<PointSopNode> = (node: PointSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst UvToPosition = new BasePreset()\n\t\t.addEntry(node.p.updateX, true)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, true)\n\t\t.addEntry(node.p.x, '@uv.x')\n\t\t.addEntry(node.p.y, '@uv.y')\n\t\t.addEntry(node.p.z, 0);\n\n\tconst UvLightMapToPosition = new BasePreset()\n\t\t.addEntry(node.p.updateX, true)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, true)\n\t\t.addEntry(node.p.x, `@${DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME}.x`)\n\t\t.addEntry(node.p.y, `@${DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME}.y`)\n\t\t.addEntry(node.p.z, 0);\n\n\tconst wave = new BasePreset()\n\t\t.addEntry(node.p.updateX, false)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, false)\n\t\t.addEntry(node.p.y, 'sin(@P.z)');\n\n\tconst animatedWave = new BasePreset()\n\t\t.addEntry(node.p.updateX, false)\n\t\t.addEntry(node.p.updateY, true)\n\t\t.addEntry(node.p.updateZ, false)\n\t\t.addEntry(node.p.y, 'sin(@P.z + 2*$T)');\n\n\tcollection.setPresets({\n\t\tUvToPosition,\n\t\tUvLightMapToPosition,\n\t\twave,\n\t\tanimatedWave,\n\t});\n\n\treturn collection;\n};\nexport const pointSopPresetRegister: PresetRegister<typeof PointSopNode, PointSopNode> = {\n\tnodeClass: PointSopNode,\n\tsetupFunc: pointSopNodePresetsCollectionFactory,\n};\n","import {RoundedBoxSopNode} from '../../../src/engine/nodes/sop/RoundedBox';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\n// export function RoundedBoxSopNodePresets() {\n// \treturn {\n// \t\tplayerCapsule: function (node: RoundedBoxSopNode) {\n// \t\t\tnode.p.size.set([1, 2, 1]);\n// \t\t\tnode.p.divisions.set(10);\n// \t\t\tnode.p.bevel.set(0.5);\n// \t\t\tnode.p.center.set([0, -0.5, 0]);\n// \t\t},\n// \t};\n// }\n\nconst roundedBoxSopNodePresetsCollectionFactory: PresetsCollectionFactory<RoundedBoxSopNode> = (\n\tnode: RoundedBoxSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst playerCapsule = new BasePreset()\n\t\t.addEntry(node.p.size, [1, 2, 1])\n\t\t.addEntry(node.p.divisions, 10)\n\t\t.addEntry(node.p.bevel, 0.5)\n\t\t.addEntry(node.p.center, [0, -0.5, 0]);\n\n\tcollection.setPresets({\n\t\tplayerCapsule,\n\t});\n\n\treturn collection;\n};\nexport const roundedBoxSopPresetRegister: PresetRegister<typeof RoundedBoxSopNode, RoundedBoxSopNode> = {\n\tnodeClass: RoundedBoxSopNode,\n\tsetupFunc: roundedBoxSopNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {ScatterSopNode} from '../../../src/engine/nodes/sop/Scatter';\n\nconst scatterSopNodePresetsCollectionFactory: PresetsCollectionFactory<ScatterSopNode> = (node: ScatterSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\t[2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((i, k) => {\n\t\tconst size = 2 ** i;\n\t\tconst preset = new BasePreset().addEntry(node.p.pointsCount, `${size} * ${size}`);\n\t\tcollection.addPreset(`${k + 1}: ${size}x${size} (=${size * size})`, preset);\n\t});\n\treturn collection;\n};\nexport const scatterSopPresetRegister: PresetRegister<typeof ScatterSopNode, ScatterSopNode> = {\n\tnodeClass: ScatterSopNode,\n\tsetupFunc: scatterSopNodePresetsCollectionFactory,\n};\n","import {SpotLightSopNode} from '../../../src/engine/nodes/sop/SpotLight';\nimport {PolyDictionary} from '../../../src/types/GlobalTypes';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst shadowSizePowers = [5, 6, 7, 8, 9, 10, 11];\n\nconst spotLightSopNodePresetsCollectionFactory: PresetsCollectionFactory<SpotLightSopNode> = (\n\tnode: SpotLightSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst presetsByName: PolyDictionary<BasePreset> = {};\n\tfor (let i = 0; i < shadowSizePowers.length; i++) {\n\t\tconst shadowSizePower = shadowSizePowers[i];\n\t\tconst shadowSize = 2 ** shadowSizePower;\n\t\tconst powerAlphabetical = `${shadowSizePower}`.padStart(2, '0');\n\t\tconst preset = new BasePreset().addEntry(node.p.shadowRes, [shadowSize, shadowSize]);\n\t\tconst presetName = `shadow resolution: 2^${powerAlphabetical} ( ${shadowSize} x ${shadowSize} )`;\n\t\tpresetsByName[presetName] = preset;\n\t}\n\n\tcollection.setPresets(presetsByName);\n\n\treturn collection;\n};\nexport const spotLightSopPresetRegister: PresetRegister<typeof SpotLightSopNode, SpotLightSopNode> = {\n\tnodeClass: SpotLightSopNode,\n\tsetupFunc: spotLightSopNodePresetsCollectionFactory,\n};\n","import {DEMO_ASSETS_ROOT_URL} from '../../../src/core/Assets';\nimport {TextSopNode} from '../../../src/engine/nodes/sop/Text';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\n// const FONT_NAMES: Record<string,string> = {\n// \t'Absolute':'Absolute.ttf',\n// \t'ColorTime':'ColorTime-TTF.ttf',\n// }\n// \t'Absolute.ttf',\n// \t'ColorTime-TTF.ttf',\n// \t'DancingintheRainbow.ttf',\n// \t'droid_sans_bold.typeface.json',\n// \t'droid_sans_mono_regular.typeface.json',\n// \t'droid_sans_regular.typeface.json',\n// \t'droid_serif_bold.typeface.json',\n// \t'droid_serif_regular.typeface.json',\n// \t'fabfeltscript-bold.ttf',\n// \t'gentilis_bold.typeface.json',\n// \t'gentilis_regular.typeface.json',\n// \t'helvetiker_bold.typeface.json',\n// \t'helvetiker_regular.typeface.json',\n// \t'kenpixel.ttf',\n// \t'Libertinage.ttf',\n// \t'montserrat-600.woff',\n// \t// 'montserrat-600.woff2',\n// \t'Multistrokes.ttf',\n// \t'NERVOUSM_BOLD_ITALIC.ttf',\n// \t'NERVOUSM_BOLD.ttf',\n// \t'NERVOUSM_ITALIC.ttf',\n// \t'NERVOUSM.ttf',\n// \t'Nickainley-Normal.ttf',\n// \t'optimer_bold.typeface.json',\n// \t'optimer_regular.typeface.json',\n// \t'ProximaNova-Light-webfont.woff',\n// \t// 'ProximaNova-Light-webfont.woff2',\n// \t'ProximaNova-Reg-webfont.woff',\n// \t// 'ProximaNova-Reg-webfont.woff2',\n// \t'ProximaNova-Sbold-webfont.woff',\n// \t// 'ProximaNova-Sbold-webfont.woff2',\n// \t'roboto-mono-regular.woff',\n// \t// 'roboto-mono-regular.woff2',\n// \t'SaturdaybelikeMadness.ttf',\n// \t'SleepinginCastleland.ttf',\n// \t'SourceCodePro-BlackIt.ttf',\n// \t'SourceCodePro-Black.ttf',\n// \t'SourceCodePro-BoldIt.ttf',\n// \t'SourceCodePro-Bold.ttf',\n// \t'SourceCodePro-ExtraLightIt.ttf',\n// \t'SourceCodePro-ExtraLight.ttf',\n// \t'SourceCodePro-It.ttf',\n// \t'SourceCodePro-LightIt.ttf',\n// \t'SourceCodePro-Light.ttf',\n// \t'SourceCodePro-MediumIt.ttf',\n// \t'SourceCodePro-Medium.ttf',\n// \t'SourceCodePro-Regular.ttf',\n// \t'SourceCodePro-SemiboldIt.ttf',\n// \t'SourceCodePro-Semibold.ttf',\n// \t'SpecialValentine.ttf',\n// \t'TastysushiLine.ttf',\n// \t'Tastysushi.ttf',\n// \t'Waterlily_Script.ttf',\n// \t'Wintersoul.ttf',\n// ];\n\n// type TextSopNodePresetFunction = (node: TextSopNode) => void;\n// export function TextSopNodePresets() {\n// \tconst data: PolyDictionary<TextSopNodePresetFunction> = {};\n// \tfor (let fontName of FONT_NAMES) {\n// \t\tconst presetName = fontName.split('.')[0];\n// \t\tdata[presetName] = function (node: TextSopNode) {\n// \t\t\tnode.p.font.set(`${DEMO_ASSETS_ROOT_URL}/fonts/${fontName}`);\n// \t\t};\n// \t}\n// \treturn data;\n// }\ninterface PresetCreateData {\n\tpreset: BasePreset;\n\tpresetName: string;\n}\ninterface PresetOptions {\n\tsegments?: number;\n}\n\nconst textSopNodeNodePresetsCollectionFactory: PresetsCollectionFactory<TextSopNode> = (node: TextSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst optimerOptions: PresetOptions = {\n\t\tsegments: 4,\n\t};\n\tconst helvetikerOptions: PresetOptions = {\n\t\tsegments: 4,\n\t};\n\tconst droidOptions: PresetOptions = {\n\t\tsegments: 4,\n\t};\n\tconst sourcecodeproOptions: PresetOptions = {\n\t\tsegments: 2,\n\t};\n\n\tfunction _preset(fontName: string, presetName: string, options: PresetOptions = {}) {\n\t\toptions['segments'] = options['segments'] || 1;\n\t\tconst preset = new BasePreset()\n\t\t\t.addEntry(node.p.font, `${DEMO_ASSETS_ROOT_URL}/fonts/${fontName}`)\n\t\t\t.addEntry(node.p.segments, options['segments']);\n\t\treturn {preset, presetName};\n\t}\n\tfunction _droid(fontName: string, presetName: string) {\n\t\treturn _preset(fontName, presetName, droidOptions);\n\t}\n\tfunction _helvetiker(fontName: string, presetName: string) {\n\t\treturn _preset(fontName, presetName, helvetikerOptions);\n\t}\n\tfunction _optimer(fontName: string, presetName: string) {\n\t\treturn _preset(fontName, presetName, optimerOptions);\n\t}\n\tfunction _sourcecodepro(presetName: string) {\n\t\treturn _preset(`SourceCodePro-${presetName}.ttf`, presetName, sourcecodeproOptions);\n\t}\n\n\tconst FONT_DICT: Record<string, PresetCreateData[]> = {\n\t\t// 'Absolute':'Absolute.ttf',\n\t\t// 'ColorTime':'ColorTime-TTF.ttf',\n\t\t// Proxima: [\n\t\t// \t_preset('ProximaNova-Light-webfont.woff', 'Light'),\n\t\t// \t// 'ProximaNova-Light-webfont.woff2',\n\t\t// \t_preset('ProximaNova-Reg-webfont.woff', 'Reg'),\n\t\t// \t// 'ProximaNova-Reg-webfont.woff2',\n\t\t// \t_preset('ProximaNova-Sbold-webfont.woff', 'Sbold'),\n\t\t// ],\n\t\tDroid: [\n\t\t\t_droid('droid_sans_bold.typeface.json', 'Sans Bold'),\n\t\t\t_droid('droid_sans_mono_regular.typeface.json', 'Sans Mono'),\n\t\t\t_droid('droid_sans_regular.typeface.json', 'Sans Regular'),\n\t\t\t_droid('droid_serif_bold.typeface.json', 'Serif Bold'),\n\t\t\t_droid('droid_serif_regular.typeface.json', 'Serif Regular'),\n\t\t],\n\t\tGentillis: [\n\t\t\t_preset('gentilis_bold.typeface.json', 'Bold'),\n\t\t\t_preset('gentilis_regular.typeface.json', 'Regular'),\n\t\t],\n\t\tHelvetiker: [\n\t\t\t_helvetiker('helvetiker_bold.typeface.json', 'Bold'),\n\t\t\t_helvetiker('helvetiker_regular.typeface.json', 'Regular'),\n\t\t],\n\t\t// NervousM: [\n\t\t// \t_preset('NERVOUSM_BOLD_ITALIC.ttf', 'Italic'),\n\t\t// \t_preset('NERVOUSM_BOLD.ttf', 'Bold'),\n\t\t// \t_preset('NERVOUSM_ITALIC.ttf', 'Italic'),\n\t\t// \t_preset('NERVOUSM.ttf', 'Regular'),\n\t\t// ],\n\t\tOptimer: [_optimer('optimer_bold.typeface.json', 'Bold'), _optimer('optimer_regular.typeface.json', 'Regular')],\n\t\tSourceCodePro: [\n\t\t\t'BlackIt',\n\t\t\t'Black',\n\t\t\t'BoldIt',\n\t\t\t'Bold',\n\t\t\t'ExtraLightIt',\n\t\t\t'ExtraLight',\n\t\t\t'LightIt',\n\t\t\t'Light',\n\t\t\t'MediumIt',\n\t\t\t'Medium',\n\t\t\t'Regular',\n\t\t\t'SemiboldIt',\n\t\t\t'Semibold',\n\t\t].map(_sourcecodepro),\n\t\tTastysushi: [_preset('Tastysushi.ttf', 'Regular'), _preset('TastysushiLine.ttf', 'Line')],\n\t\tmisc: [\n\t\t\t_preset('kenpixel.ttf', 'Kenpixel'),\n\t\t\t_preset('Wintersoul.ttf', 'Wintersoul'),\n\t\t\t_preset('Absolute.ttf', 'Absolute'),\n\t\t\t_preset('SpecialValentine.ttf', 'SpecialValentine'),\n\t\t\t_preset('Waterlily_Script.ttf', 'Waterlily_Script'),\n\t\t],\n\t};\n\n\tconst fontGroupNames: string[] = Object.keys(FONT_DICT);\n\tfor (let fontGroupName of fontGroupNames) {\n\t\tconst presetDatas = FONT_DICT[fontGroupName];\n\t\tif (presetDatas) {\n\t\t\tfor (let presetData of presetDatas) {\n\t\t\t\tconst fullName = `${fontGroupName}/${presetData.presetName}`;\n\t\t\t\tcollection.addPreset(fullName, presetData.preset);\n\t\t\t}\n\t\t\t// const preset = _preset(fontName)\n\t\t\t// const presetName = fontName.split('.')[0];\n\t\t}\n\t}\n\n\treturn collection;\n};\nexport const textSopPresetRegister: PresetRegister<typeof TextSopNode, TextSopNode> = {\n\tnodeClass: TextSopNode,\n\tsetupFunc: textSopNodeNodePresetsCollectionFactory,\n};\n","import {TransformSopNode} from '../../../src/engine/nodes/sop/Transform';\nimport {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\n\nconst transformSopNodePresetsCollectionFactory: PresetsCollectionFactory<TransformSopNode> = (\n\tnode: TransformSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tconst onGround = new BasePreset().addEntry(node.p.t.y, `-bbox(0, 'min').y`);\n\tconst centerToOrigin = new BasePreset().addEntry(node.p.t, ['-$CEX', '-$CEY', '-$CEZ']);\n\tconst pivotOnCenter = new BasePreset().addEntry(node.p.pivot, ['$CEX', '$CEY', '$CEZ']);\n\tconst scaleTo1 = new BasePreset().addEntry(node.p.scale, '1/bbox(0,\"size\").x');\n\n\tcollection.setPresets({onGround, centerToOrigin, scaleTo1, pivotOnCenter});\n\n\treturn collection;\n};\nexport const transformSopPresetRegister: PresetRegister<typeof TransformSopNode, TransformSopNode> = {\n\tnodeClass: TransformSopNode,\n\tsetupFunc: transformSopNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {WFCDebugSopNode} from '../../../src/engine/nodes/sop/WFCDebug';\nimport {EMPTY_TILE_ID} from '../../../src/core/wfc/WFCConstant';\n\nconst WFCDebugSopNodePresetsCollectionFactory: PresetsCollectionFactory<WFCDebugSopNode> = (node: WFCDebugSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tcollection.addPreset(\n\t\t`all to all`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, '*').addEntry(node.p.destTileId, '*')\n\t);\n\tcollection.addPreset(\n\t\t`all to all (except empty tile)`,\n\t\tnew BasePreset()\n\t\t\t.addEntry(node.p.srcTileId, `* ^${EMPTY_TILE_ID}`)\n\t\t\t.addEntry(node.p.destTileId, `* ^${EMPTY_TILE_ID}`)\n\t);\n\tcollection.addPreset(\n\t\t`t0 to all`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, 't0').addEntry(node.p.destTileId, '*')\n\t);\n\tcollection.addPreset(\n\t\t`t0 to empty tile`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, 't0').addEntry(node.p.destTileId, EMPTY_TILE_ID)\n\t);\n\tcollection.addPreset(\n\t\t`t0 to all (except empty tile)`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, 't0').addEntry(node.p.destTileId, `* ^${EMPTY_TILE_ID}`)\n\t);\n\n\treturn collection;\n};\nexport const WFCDebugSopPresetRegister: PresetRegister<typeof WFCDebugSopNode, WFCDebugSopNode> = {\n\tnodeClass: WFCDebugSopNode,\n\tsetupFunc: WFCDebugSopNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {WFCRuleConnectionFromSideNameSopNode} from '../../../src/engine/nodes/sop/WFCRuleConnectionFromSideName';\nimport {EMPTY_TILE_ID} from '../../../src/core/wfc/WFCConstant';\n\nconst WFCRuleConnectionFromSideNameSopNodePresetsCollectionFactory: PresetsCollectionFactory<\n\tWFCRuleConnectionFromSideNameSopNode\n> = (node: WFCRuleConnectionFromSideNameSopNode) => {\n\tconst collection = new NodePresetsCollection();\n\n\tcollection.addPreset(\n\t\t`all to all`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, '*').addEntry(node.p.destTileId, '*')\n\t);\n\tcollection.addPreset(\n\t\t`all to all (except empty tile)`,\n\t\tnew BasePreset()\n\t\t\t.addEntry(node.p.srcTileId, `* ^${EMPTY_TILE_ID}`)\n\t\t\t.addEntry(node.p.destTileId, `* ^${EMPTY_TILE_ID}`)\n\t);\n\tcollection.addPreset(\n\t\t`t0 to all`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, 't0').addEntry(node.p.destTileId, '*')\n\t);\n\tcollection.addPreset(\n\t\t`t0 to empty tile`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, 't0').addEntry(node.p.destTileId, EMPTY_TILE_ID)\n\t);\n\tcollection.addPreset(\n\t\t`t0 to all (except empty tile)`,\n\t\tnew BasePreset().addEntry(node.p.srcTileId, 't0').addEntry(node.p.destTileId, `* ^${EMPTY_TILE_ID}`)\n\t);\n\n\treturn collection;\n};\nexport const WFCRuleConnectionFromSideNameSopPresetRegister: PresetRegister<\n\ttypeof WFCRuleConnectionFromSideNameSopNode,\n\tWFCRuleConnectionFromSideNameSopNode\n> = {\n\tnodeClass: WFCRuleConnectionFromSideNameSopNode,\n\tsetupFunc: WFCRuleConnectionFromSideNameSopNodePresetsCollectionFactory,\n};\n","import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset';\nimport {WFCTilePropertiesSopNode} from '../../../src/engine/nodes/sop/WFCTileProperties';\n\nconst WFCTilePropertiesSopNodePresetsCollectionFactory: PresetsCollectionFactory<WFCTilePropertiesSopNode> = (\n\tnode: WFCTilePropertiesSopNode\n) => {\n\tconst collection = new NodePresetsCollection();\n\n\tcollection.addPreset(\n\t\t`use object name`,\n\t\tnew BasePreset().addEntry(node.p.addId, 1).addEntry(node.p.id, '`@objname`').addEntry(node.p.addName, 0)\n\t);\n\n\treturn collection;\n};\nexport const WFCTilePropertiesSopPresetRegister: PresetRegister<\n\ttypeof WFCTilePropertiesSopNode,\n\tWFCTilePropertiesSopNode\n> = {\n\tnodeClass: WFCTilePropertiesSopNode,\n\tsetupFunc: WFCTilePropertiesSopNodePresetsCollectionFactory,\n};\n","import {NodeContext} from '../../src/engine/poly/NodeContext';\n\n// anim\nimport {propertyNameAnimPresetRegister} from './anim/PropertyName';\n// audio\nimport {fileAudioPresetRegister} from './audio/File';\nimport {samplerAudioPresetRegister} from './audio/Sampler';\n// cop\nimport {audioAnalyserCopPresetRegister} from './cop/AudioAnalyser';\nimport {cubeMapCopPresetRegister} from './cop/CubeMap';\nimport {geometryAttributeCopPresetRegister} from './cop/GeometryAttribute';\nimport {imageCopPresetRegister} from './cop/Image';\nimport {imageEXRCopPresetRegister} from './cop/ImageEXR';\nimport {lutCopPresetRegister} from './cop/Lut';\nimport {mapboxElevationCopPresetRegister} from './cop/MapboxElevation';\nimport {mapboxSatelliteCopPresetRegister} from './cop/MapboxSatellite';\nimport {SDFFromUrlCopPresetRegister} from './cop/SDFFromUrl';\nimport {textCopPresetRegister} from './cop/Text';\nimport {videoCopPresetRegister} from './cop/Video';\n// event\nimport {cameraOrbitControlsEventPresetRegister} from './event/CameraOrbitControls';\n// gl\nimport {attributeGlPresetRegister} from './gl/Attribute';\nimport {neighbourAttractRepulseGlPresetRegister} from './gl/NeighbourAttractRepulse';\nimport {neighbourAttractGlPresetRegister, neighbourRepulseGlPresetRegister} from './gl/Neighbour';\n// js\nimport {attributeJsPresetRegister} from './js/Attribute';\nimport {getChildrenAttributesJsPresetRegister} from './js/GetChildrenAttributes';\nimport {getObjectAttributeJsPresetRegister} from './js/GetObjectAttribute';\nimport {getObjectUserDataJsPresetRegister} from './js/GetObjectUserData';\nimport {onChildAttributeUpdateJsPresetRegister} from './js/OnChildAttributeUpdate';\nimport {onKeyJsPresetRegister} from './js/OnKey';\nimport {onObjectAttributeUpdateJsPresetRegister} from './js/OnObjectAttributeUpdate';\nimport {onObjectSwipeJsPresetRegister, onObjectSwipeGPUJsPresetRegister} from './js/OnObjectSwipe';\nimport {rayFromCameraJsPresetRegister} from './js/RayFromCamera';\n\n// // mat\n// import {meshSubsurfaceScatteringMatPresetRegister} from './mat/MeshSubsurfaceScattering';\nimport {codeMatPresetRegister} from './mat/Code';\n// obj\n// sop\nimport {attribCreateSopPresetRegister} from './sop/AttribCreate';\nimport {attribPromoteSopPresetRegister} from './sop/AttribPromote';\nimport {cadFileSTEPSopPresetRegister} from './sop/CADFileSTEP';\nimport {cameraViewerCodeSopPresetRegister} from './sop/CameraViewerCode';\nimport {cameraWebXRARMarkerTrackingSopPresetRegister} from './sop/CameraWebXRARMarkerTracking';\nimport {capsuleSopPresetRegister} from './sop/Capsule';\nimport {codeSopPresetRegister} from './sop/Code';\nimport {colorSopPresetRegister} from './sop/Color';\nimport {CSS2DObjectPresetRegister} from './sop/CSS2DObject';\nimport {dataSopPresetRegister} from './sop/Data';\nimport {dataUrlSopPresetRegister} from './sop/DataUrl';\nimport {deleteSopPresetRegister} from './sop/Delete';\nimport {directionalLightSopPresetRegister} from './sop/DirectionalLight';\nimport {\n\tfileDRCSopPresetRegister,\n\tfileFBXSopPresetRegister,\n\tfileGLTFSopPresetRegister,\n\tfileJSONSopPresetRegister,\n\tfileMPDSopPresetRegister,\n\tfileOBJSopPresetRegister,\n\tfilePDBSopPresetRegister,\n\tfilePLYSopPresetRegister,\n\tfileSTLSopPresetRegister,\n} from './sop/File';\nimport {fileSVGSopPresetRegister} from './sop/FileSVG';\nimport {fileGEOJSONSopPresetRegister} from './sop/FileGEOJSON';\nimport {mapboxCameraSopPresetRegister} from './sop/MapboxCamera';\nimport {normalsSopPresetRegister} from './sop/Normals';\nimport {pointSopPresetRegister} from './sop/Point';\nimport {roundedBoxSopPresetRegister} from './sop/RoundedBox';\nimport {scatterSopPresetRegister} from './sop/Scatter';\nimport {spotLightSopPresetRegister} from './sop/SpotLight';\nimport {textSopPresetRegister} from './sop/Text';\nimport {transformSopPresetRegister} from './sop/Transform';\nimport {WFCDebugSopPresetRegister} from './sop/WFCDebug';\nimport {WFCRuleConnectionFromSideNameSopPresetRegister} from './sop/WFCRuleConnectionFromSideName';\nimport {WFCTilePropertiesSopPresetRegister} from './sop/WFCTileProperties';\n\nimport {PresetRegister} from './BasePreset';\nimport {BaseNodeClass, BaseNodeType} from '../../src/engine/nodes/_Base';\n\nclass PresetLibraryClass {\n\tstatic _instance: PresetLibraryClass | undefined;\n\tprivate _presetsByContextAndType: Map<NodeContext, Map<string, PresetRegister<any, any>>> = new Map();\n\tprivate constructor() {\n\t\t// anim\n\t\tthis._registerPreset(propertyNameAnimPresetRegister);\n\t\t// audio\n\t\tthis._registerPreset(fileAudioPresetRegister);\n\t\tthis._registerPreset(samplerAudioPresetRegister);\n\t\t// cop\n\t\tthis._registerPreset(audioAnalyserCopPresetRegister);\n\t\tthis._registerPreset(cubeMapCopPresetRegister);\n\t\tthis._registerPreset(geometryAttributeCopPresetRegister);\n\t\tthis._registerPreset(imageCopPresetRegister);\n\t\tthis._registerPreset(imageEXRCopPresetRegister);\n\t\tthis._registerPreset(lutCopPresetRegister);\n\t\tthis._registerPreset(mapboxElevationCopPresetRegister);\n\t\tthis._registerPreset(mapboxSatelliteCopPresetRegister);\n\t\tthis._registerPreset(SDFFromUrlCopPresetRegister);\n\t\tthis._registerPreset(textCopPresetRegister);\n\t\tthis._registerPreset(videoCopPresetRegister);\n\t\t// event\n\t\tthis._registerPreset(cameraOrbitControlsEventPresetRegister);\n\t\t// gl\n\t\tthis._registerPreset(attributeGlPresetRegister);\n\t\tthis._registerPreset(neighbourAttractRepulseGlPresetRegister);\n\t\tthis._registerPreset(neighbourAttractGlPresetRegister);\n\t\tthis._registerPreset(neighbourRepulseGlPresetRegister);\n\t\t// js\n\t\tthis._registerPreset(attributeJsPresetRegister);\n\t\tthis._registerPreset(getChildrenAttributesJsPresetRegister);\n\t\tthis._registerPreset(getObjectAttributeJsPresetRegister);\n\t\tthis._registerPreset(getObjectUserDataJsPresetRegister);\n\t\tthis._registerPreset(onChildAttributeUpdateJsPresetRegister);\n\t\tthis._registerPreset(onKeyJsPresetRegister);\n\t\tthis._registerPreset(onObjectAttributeUpdateJsPresetRegister);\n\t\tthis._registerPreset(onObjectSwipeJsPresetRegister);\n\t\tthis._registerPreset(onObjectSwipeGPUJsPresetRegister);\n\t\tthis._registerPreset(rayFromCameraJsPresetRegister);\n\t\t// mat\n\t\t// this._registerPreset(meshSubsurfaceScatteringMatPresetRegister);\n\t\tthis._registerPreset(codeMatPresetRegister);\n\t\t// sop\n\t\tthis._registerPreset(attribCreateSopPresetRegister);\n\t\tthis._registerPreset(attribPromoteSopPresetRegister);\n\t\tthis._registerPreset(cadFileSTEPSopPresetRegister);\n\t\tthis._registerPreset(cameraViewerCodeSopPresetRegister);\n\t\tthis._registerPreset(cameraWebXRARMarkerTrackingSopPresetRegister);\n\t\tthis._registerPreset(capsuleSopPresetRegister);\n\t\tthis._registerPreset(codeSopPresetRegister);\n\t\tthis._registerPreset(colorSopPresetRegister);\n\t\tthis._registerPreset(CSS2DObjectPresetRegister);\n\t\tthis._registerPreset(dataSopPresetRegister);\n\t\tthis._registerPreset(dataUrlSopPresetRegister);\n\t\tthis._registerPreset(deleteSopPresetRegister);\n\t\tthis._registerPreset(directionalLightSopPresetRegister);\n\t\tthis._registerPreset(fileDRCSopPresetRegister);\n\t\tthis._registerPreset(fileFBXSopPresetRegister);\n\t\tthis._registerPreset(fileGEOJSONSopPresetRegister);\n\t\tthis._registerPreset(fileGLTFSopPresetRegister);\n\t\tthis._registerPreset(fileJSONSopPresetRegister);\n\t\tthis._registerPreset(fileMPDSopPresetRegister);\n\t\tthis._registerPreset(fileOBJSopPresetRegister);\n\t\tthis._registerPreset(filePDBSopPresetRegister);\n\t\tthis._registerPreset(filePLYSopPresetRegister);\n\t\tthis._registerPreset(fileSTLSopPresetRegister);\n\t\tthis._registerPreset(fileSVGSopPresetRegister);\n\t\tthis._registerPreset(mapboxCameraSopPresetRegister);\n\t\tthis._registerPreset(normalsSopPresetRegister);\n\t\tthis._registerPreset(pointSopPresetRegister);\n\t\tthis._registerPreset(roundedBoxSopPresetRegister);\n\t\tthis._registerPreset(scatterSopPresetRegister);\n\t\tthis._registerPreset(spotLightSopPresetRegister);\n\t\tthis._registerPreset(textSopPresetRegister);\n\t\tthis._registerPreset(transformSopPresetRegister);\n\t\tthis._registerPreset(WFCDebugSopPresetRegister);\n\t\tthis._registerPreset(WFCRuleConnectionFromSideNameSopPresetRegister);\n\t\tthis._registerPreset(WFCTilePropertiesSopPresetRegister);\n\t}\n\n\tprivate _registerPreset<N extends typeof BaseNodeClass, NI extends BaseNodeClass>(register: PresetRegister<N, NI>) {\n\t\tconst context = register.nodeClass.context();\n\t\tconst type = register.nodeClass.type();\n\t\tlet typeMap = this._presetsByContextAndType.get(context);\n\t\tif (!typeMap) {\n\t\t\ttypeMap = new Map<string, PresetRegister<any, any>>();\n\t\t\tthis._presetsByContextAndType.set(context, typeMap);\n\t\t}\n\t\ttypeMap.set(type, register);\n\t}\n\tpreset(node: BaseNodeType) {\n\t\treturn this._presetsByContextAndType.get(node.context())?.get(node.type());\n\t}\n\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new PresetLibraryClass());\n\t}\n}\nexport const PresetLibrary = PresetLibraryClass.instance();\n","import {Editor} from './../../../../Editor';\nimport {DropDownMenuEntry} from './../../../../types';\nimport {StoreController} from '../../../../store/controllers/StoreController';\nimport {ref, computed, watch, onMounted, Ref} from 'vue';\nimport {NodePresetsCollection} from '../../../../../../@polygonjs/polygonjs/examples/presets/BasePreset';\nimport type {NodeSerializerData} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {MultipleCommand} from '../../../../history/commands/Multiple';\nimport {ParamSetCommand} from '../../../../history/commands/ParamSet';\n\n//\n//\nimport {PresetLibrary} from '../../../../../../@polygonjs/polygonjs/examples/presets/index';\nconst loadPresetsLibrary = async () => {\n\t// Presets currently have to be loaded async and on demand.\n\t// so that we can load plugins, and set mixins from them,\n\t// before the related nodes are loaded by the mixins.\n\t// This is mostly the case for the sop/cameraWebXRARMarkerTracking\n\t// const {PresetLibrary} = await import('../../../../../../@polygonjs/polygonjs/examples/presets/index');\n\treturn {PresetLibrary};\n};\n//\n//\n\nconst entriesById: Map<string, DropDownMenuEntry> = new Map();\n\nexport function SetupPresets(JSONNode: Ref<NodeSerializerData | null>) {\n\tconst preset_names = ref<string[]>([]);\n\n\tconst selected_graph_node_id = computed(() => {\n\t\treturn JSONNode.value?.graph_node_id;\n\t});\n\tconst has_presets = computed(() => {\n\t\treturn selected_graph_node_id.value && preset_names.value.length > 0;\n\t});\n\tconst presets_key = computed(() => {\n\t\treturn selected_graph_node_id.value;\n\t});\n\tconst preset_entries = computed(() => {\n\t\tentriesById.clear();\n\t\tconst entries: DropDownMenuEntry[] = [];\n\n\t\tfor (let presetName of preset_names.value) {\n\t\t\tconst elements = presetName.split('/');\n\t\t\tconst id = elements[0];\n\t\t\tlet existingEntry = entriesById.get(id);\n\t\t\tif (!existingEntry) {\n\t\t\t\texistingEntry = {id};\n\t\t\t\tentriesById.set(id, existingEntry);\n\t\t\t\tentries.push(existingEntry);\n\t\t\t}\n\t\t\tif (elements.length > 1) {\n\t\t\t\tconst subEntry = {id: elements[1]};\n\t\t\t\texistingEntry.children = existingEntry.children || [];\n\t\t\t\texistingEntry.children.push(subEntry);\n\t\t\t}\n\t\t}\n\t\treturn entries;\n\t});\n\tfunction get_selected_node() {\n\t\treturn selected_graph_node_id.value ? StoreController.engine.node(selected_graph_node_id.value) : undefined;\n\t}\n\n\tlet presetsCollection: NodePresetsCollection | undefined;\n\tasync function createPresetsCollection(): Promise<NodePresetsCollection | undefined> {\n\t\tif (JSONNode.value) {\n\t\t\tconst selectedNode = get_selected_node();\n\t\t\tif (selectedNode) {\n\t\t\t\tconst {PresetLibrary} = await loadPresetsLibrary();\n\t\t\t\tconst nodePresets = PresetLibrary.preset(selectedNode);\n\t\t\t\tif (nodePresets) {\n\t\t\t\t\treturn nodePresets.setupFunc(selectedNode);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tonMounted(async () => {\n\t\tawait load_presets_manifest();\n\t});\n\n\twatch(selected_graph_node_id, async () => {\n\t\tawait load_presets_manifest();\n\t});\n\n\tasync function load_presets_manifest() {\n\t\treset_preset_names();\n\n\t\tpresetsCollection = await createPresetsCollection();\n\t\tif (presetsCollection) {\n\t\t\tconst presetNames = presetsCollection.presetNames();\n\t\t\tfor (let presetName of presetNames) {\n\t\t\t\tpreset_names.value.push(presetName);\n\t\t\t}\n\t\t}\n\t}\n\tfunction reset_preset_names() {\n\t\twhile (preset_names.value.pop()) {}\n\t}\n\tasync function use_preset(entry: string) {\n\t\tconst preset = presetsCollection?.getPreset(entry);\n\t\tconst selected_node = get_selected_node();\n\t\tif (preset && selected_node) {\n\t\t\tconst entries = preset.entries();\n\t\t\tconst multiCmd = new MultipleCommand(selected_node.scene());\n\t\t\tfor (let entry of entries) {\n\t\t\t\tconst subCmd = new ParamSetCommand(entry.param, entry.value);\n\t\t\t\tmultiCmd.pushCommand(subCmd);\n\t\t\t}\n\t\t\tawait Editor.instance().pushCommand(multiCmd);\n\t\t}\n\t}\n\n\treturn {\n\t\thas_presets,\n\t\tpresets_key,\n\t\tpreset_entries,\n\t\tuse_preset,\n\t};\n}\n","import {StoreController} from '../../../../store/controllers/StoreController';\nimport {ref, computed, watch, onMounted, Ref} from 'vue';\nimport {PolyDictionary} from '../../../../../../@polygonjs/polygonjs/src/types/GlobalTypes';\nimport docs_json_import from '../../../../docs/params/tooltips.json';\nimport type {NodeSerializerData} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\ntype TooltipDocData = PolyDictionary<PolyDictionary<PolyDictionary<string>>>;\nexport const TOOLTIP_PARAMS_DOC_MAP: TooltipDocData = docs_json_import as TooltipDocData;\n\nexport function SetupTooltips(JSONNode: Ref<NodeSerializerData | null>) {\n\tconst tooltips = ref<Dictionary<string>>({});\n\n\tconst selected_graph_node_id = computed(() => {\n\t\treturn JSONNode.value?.graph_node_id;\n\t});\n\n\tfunction get_selected_node() {\n\t\treturn selected_graph_node_id.value ? StoreController.engine.node(selected_graph_node_id.value) : undefined;\n\t}\n\n\tonMounted(async () => {\n\t\tawait load_tooltips();\n\t});\n\n\twatch(selected_graph_node_id, async () => {\n\t\tawait load_tooltips();\n\t});\n\n\tasync function load_tooltips() {\n\t\t// reset_preset_names();\n\n\t\tconst node = get_selected_node();\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst map_for_context = TOOLTIP_PARAMS_DOC_MAP[node.context()];\n\t\t// console.log(node.context(), map_for_context);\n\t\tif (!map_for_context) {\n\t\t\t// console.log('no params doc for context', node.context());\n\t\t\treturn;\n\t\t}\n\t\tconst className = node.type().toLowerCase();\n\t\tconst map_for_node = map_for_context[className];\n\t\tif (!map_for_node) {\n\t\t\t// console.log(`no params doc for node ${node.context()}/${className}`, Object.keys(map_for_context));\n\t\t\treturn;\n\t\t}\n\n\t\tconst paramNames = Object.keys(map_for_node);\n\t\tfor (let paramName of paramNames) {\n\t\t\ttooltips.value[paramName] = map_for_node[paramName];\n\t\t}\n\t}\n\t// function reset_preset_names() {\n\t// \t// const keys = Object.keys(tooltips.value)\n\t// \t// while (preset_names.value.pop()) {}\n\t// }\n\n\treturn {\n\t\ttooltips,\n\t};\n}\n","import {KeyEventsDispatcher, KeyEventProcessor} from '../../../../helpers/KeyEventsDispatcher';\n\nexport function SetupEventMouse(panelId: string, emit: (eventName: string) => void) {\n\tconst processor: KeyEventProcessor = {\n\t\tpanelId,\n\t\tonKeypress: (event: KeyboardEvent) => false,\n\t\tonKeydown: (event: KeyboardEvent) => false,\n\t\tonKeyup: (event: KeyboardEvent) => false,\n\t\temit,\n\t};\n\n\tfunction on_pointer_move(event: MouseEvent) {\n\t\tKeyEventsDispatcher.instance().registerProcessor(processor);\n\t}\n\n\treturn {\n\t\ton_pointer_move,\n\t};\n}\n","import {\n\tNoColorSpace,\n\tDoubleSide,\n} from 'three';\n\nimport {\n\tstrToU8,\n\tzipSync,\n} from '../libs/fflate.module.js';\n\nimport { decompress } from './../utils/TextureUtils.js';\n\nclass USDZExporter {\n\n\tparse( scene, onDone, onError, options ) {\n\n\t\tthis.parseAsync( scene, options ).then( onDone ).catch( onError );\n\n\t}\n\n\tasync parseAsync( scene, options = {} ) {\n\n\t\toptions = Object.assign( {\n\t\t\tar: {\n\t\t\t\tanchoring: { type: 'plane' },\n\t\t\t\tplaneAnchoring: { alignment: 'horizontal' }\n\t\t\t},\n\t\t\tincludeAnchoringProperties: true,\n\t\t\tquickLookCompatible: false,\n\t\t\tmaxTextureSize: 1024,\n\t\t}, options );\n\n\t\tconst files = {};\n\t\tconst modelFileName = 'model.usda';\n\n\t\t// model file should be first in USDZ archive so we init it here\n\t\tfiles[ modelFileName ] = null;\n\n\t\tlet output = buildHeader();\n\n\t\toutput += buildSceneStart( options );\n\n\t\tconst materials = {};\n\t\tconst textures = {};\n\n\t\tscene.traverseVisible( ( object ) => {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\tconst geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';\n\n\t\t\t\t\tif ( ! ( geometryFileName in files ) ) {\n\n\t\t\t\t\t\tconst meshObject = buildMeshObject( geometry );\n\t\t\t\t\t\tfiles[ geometryFileName ] = buildUSDFileAsString( meshObject );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! ( material.uuid in materials ) ) {\n\n\t\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutput += buildXform( object, geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)', object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isCamera ) {\n\n\t\t\t\toutput += buildCamera( object );\n\n\t\t\t}\n\n\t\t} );\n\n\n\t\toutput += buildSceneEnd();\n\n\t\toutput += buildMaterials( materials, textures, options.quickLookCompatible );\n\n\t\tfiles[ modelFileName ] = strToU8( output );\n\t\toutput = null;\n\n\t\tfor ( const id in textures ) {\n\n\t\t\tlet texture = textures[ id ];\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\ttexture = decompress( texture );\n\n\t\t\t}\n\n\t\t\tconst canvas = imageToCanvas( texture.image, texture.flipY, options.maxTextureSize );\n\t\t\tconst blob = await new Promise( resolve => canvas.toBlob( resolve, 'image/png', 1 ) );\n\n\t\t\tfiles[ `textures/Texture_${ id }.png` ] = new Uint8Array( await blob.arrayBuffer() );\n\n\t\t}\n\n\t\t// 64 byte alignment\n\t\t// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n\t\tlet offset = 0;\n\n\t\tfor ( const filename in files ) {\n\n\t\t\tconst file = files[ filename ];\n\t\t\tconst headerSize = 34 + filename.length;\n\n\t\t\toffset += headerSize;\n\n\t\t\tconst offsetMod64 = offset & 63;\n\n\t\t\tif ( offsetMod64 !== 4 ) {\n\n\t\t\t\tconst padLength = 64 - offsetMod64;\n\t\t\t\tconst padding = new Uint8Array( padLength );\n\n\t\t\t\tfiles[ filename ] = [ file, { extra: { 12345: padding } } ];\n\n\t\t\t}\n\n\t\t\toffset = file.length;\n\n\t\t}\n\n\t\treturn zipSync( files, { level: 0 } );\n\n\t}\n\n}\n\nfunction imageToCanvas( image, flipY, maxTextureSize ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\tconst scale = maxTextureSize / Math.max( image.width, image.height );\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = image.width * Math.min( 1, scale );\n\t\tcanvas.height = image.height * Math.min( 1, scale );\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\t// TODO: We should be able to do this in the UsdTransform2d?\n\n\t\tif ( flipY === true ) {\n\n\t\t\tcontext.translate( 0, canvas.height );\n\t\t\tcontext.scale( 1, - 1 );\n\n\t\t}\n\n\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\treturn canvas;\n\n\t} else {\n\n\t\tthrow new Error( 'THREE.USDZExporter: No valid image data found. Unable to process texture.' );\n\n\t}\n\n}\n\n//\n\nconst PRECISION = 7;\n\nfunction buildHeader() {\n\n\treturn `#usda 1.0\n(\n\tcustomLayerData = {\n\t\tstring creator = \"Three.js USDZExporter\"\n\t}\n\tdefaultPrim = \"Root\"\n\tmetersPerUnit = 1\n\tupAxis = \"Y\"\n)\n\n`;\n\n}\n\nfunction buildSceneStart( options ) {\n\n\tconst alignment = options.includeAnchoringProperties === true ? `\n\t\ttoken preliminary:anchoring:type = \"${options.ar.anchoring.type}\"\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.ar.planeAnchoring.alignment}\"\n\t` : '';\n\treturn `def Xform \"Root\"\n{\n\tdef Scope \"Scenes\" (\n\t\tkind = \"sceneLibrary\"\n\t)\n\t{\n\t\tdef Xform \"Scene\" (\n\t\t\tcustomData = {\n\t\t\t\tbool preliminary_collidesWithEnvironment = 0\n\t\t\t\tstring sceneName = \"Scene\"\n\t\t\t}\n\t\t\tsceneName = \"Scene\"\n\t\t)\n\t\t{${alignment}\n`;\n\n}\n\nfunction buildSceneEnd() {\n\n\treturn `\n\t\t}\n\t}\n}\n\n`;\n\n}\n\nfunction buildUSDFileAsString( dataToInsert ) {\n\n\tlet output = buildHeader();\n\toutput += dataToInsert;\n\treturn strToU8( output );\n\n}\n\n// Xform\n\nfunction buildXform( object, geometry, material ) {\n\n\tconst name = 'Object_' + object.id;\n\tconst transform = buildMatrix( object.matrixWorld );\n\n\tif ( object.matrixWorld.determinant() < 0 ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support negative scales', object );\n\n\t}\n\n\treturn `def Xform \"${ name }\" (\n\tprepend references = @./geometries/Geometry_${ geometry.id }.usda@</Geometry>\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\n)\n{\n\tmatrix4d xformOp:transform = ${ transform }\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\trel material:binding = </Materials/Material_${ material.id }>\n}\n\n`;\n\n}\n\nfunction buildMatrix( matrix ) {\n\n\tconst array = matrix.elements;\n\n\treturn `( ${ buildMatrixRow( array, 0 ) }, ${ buildMatrixRow( array, 4 ) }, ${ buildMatrixRow( array, 8 ) }, ${ buildMatrixRow( array, 12 ) } )`;\n\n}\n\nfunction buildMatrixRow( array, offset ) {\n\n\treturn `(${ array[ offset + 0 ] }, ${ array[ offset + 1 ] }, ${ array[ offset + 2 ] }, ${ array[ offset + 3 ] })`;\n\n}\n\n// Mesh\n\nfunction buildMeshObject( geometry ) {\n\n\tconst mesh = buildMesh( geometry );\n\treturn `\ndef \"Geometry\"\n{\n${mesh}\n}\n`;\n\n}\n\nfunction buildMesh( geometry ) {\n\n\tconst name = 'Geometry';\n\tconst attributes = geometry.attributes;\n\tconst count = attributes.position.count;\n\n\treturn `\n\tdef Mesh \"${ name }\"\n\t{\n\t\tint[] faceVertexCounts = [${ buildMeshVertexCount( geometry ) }]\n\t\tint[] faceVertexIndices = [${ buildMeshVertexIndices( geometry ) }]\n\t\tnormal3f[] normals = [${ buildVector3Array( attributes.normal, count )}] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)\n\t\tpoint3f[] points = [${ buildVector3Array( attributes.position, count )}]\n${ buildPrimvars( attributes ) }\n\t\tuniform token subdivisionScheme = \"none\"\n\t}\n`;\n\n}\n\nfunction buildMeshVertexCount( geometry ) {\n\n\tconst count = geometry.index !== null ? geometry.index.count : geometry.attributes.position.count;\n\n\treturn Array( count / 3 ).fill( 3 ).join( ', ' );\n\n}\n\nfunction buildMeshVertexIndices( geometry ) {\n\n\tconst index = geometry.index;\n\tconst array = [];\n\n\tif ( index !== null ) {\n\n\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\tarray.push( index.getX( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst length = geometry.attributes.position.count;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tarray.push( i );\n\n\t\t}\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector3Array( attribute, count ) {\n\n\tif ( attribute === undefined ) {\n\n\t\tconsole.warn( 'USDZExporter: Normals missing.' );\n\t\treturn Array( count ).fill( '(0, 0, 0)' ).join( ', ' );\n\n\t}\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\t\tconst z = attribute.getZ( i );\n\n\t\tarray.push( `(${ x.toPrecision( PRECISION ) }, ${ y.toPrecision( PRECISION ) }, ${ z.toPrecision( PRECISION ) })` );\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector2Array( attribute ) {\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\n\t\tarray.push( `(${ x.toPrecision( PRECISION ) }, ${ 1 - y.toPrecision( PRECISION ) })` );\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildPrimvars( attributes ) {\n\n\tlet string = '';\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst id = ( i > 0 ? i : '' );\n\t\tconst attribute = attributes[ 'uv' + id ];\n\n\t\tif ( attribute !== undefined ) {\n\n\t\t\tstring += `\n\t\ttexCoord2f[] primvars:st${ id } = [${ buildVector2Array( attribute )}] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)`;\n\n\t\t}\n\n\t}\n\n\t// vertex colors\n\n\tconst colorAttribute = attributes.color;\n\n\tif ( colorAttribute !== undefined ) {\n\n\t\tconst count = colorAttribute.count;\n\n\t\tstring += `\n\tcolor3f[] primvars:displayColor = [${buildVector3Array( colorAttribute, count )}] (\n\t\tinterpolation = \"vertex\"\n\t\t)`;\n\n\t}\n\n\treturn string;\n\n}\n\n// Materials\n\nfunction buildMaterials( materials, textures, quickLookCompatible = false ) {\n\n\tconst array = [];\n\n\tfor ( const uuid in materials ) {\n\n\t\tconst material = materials[ uuid ];\n\n\t\tarray.push( buildMaterial( material, textures, quickLookCompatible ) );\n\n\t}\n\n\treturn `def \"Materials\"\n{\n${ array.join( '' ) }\n}\n\n`;\n\n}\n\nfunction buildMaterial( material, textures, quickLookCompatible = false ) {\n\n\t// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n\tconst pad = '\t\t\t';\n\tconst inputs = [];\n\tconst samplers = [];\n\n\tfunction buildTexture( texture, mapType, color ) {\n\n\t\tconst id = texture.source.id + '_' + texture.flipY;\n\n\t\ttextures[ id ] = texture;\n\n\t\tconst uv = texture.channel > 0 ? 'st' + texture.channel : 'st';\n\n\t\tconst WRAPPINGS = {\n\t\t\t1000: 'repeat', // RepeatWrapping\n\t\t\t1001: 'clamp', // ClampToEdgeWrapping\n\t\t\t1002: 'mirror' // MirroredRepeatWrapping\n\t\t};\n\n\t\tconst repeat = texture.repeat.clone();\n\t\tconst offset = texture.offset.clone();\n\t\tconst rotation = texture.rotation;\n\n\t\t// rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\n\t\tconst xRotationOffset = Math.sin( rotation );\n\t\tconst yRotationOffset = Math.cos( rotation );\n\n\t\t// texture coordinates start in the opposite corner, need to correct\n\t\toffset.y = 1 - offset.y - repeat.y;\n\n\t\t// turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order.\n\t\t// Apple Feedback: \tFB10036297 and FB11442287\n\t\tif ( quickLookCompatible ) {\n\n\t\t\t// This is NOT correct yet in QuickLook, but comes close for a range of models.\n\t\t\t// It becomes more incorrect the bigger the offset is\n\n\t\t\toffset.x = offset.x / repeat.x;\n\t\t\toffset.y = offset.y / repeat.y;\n\n\t\t\toffset.x += xRotationOffset / repeat.x;\n\t\t\toffset.y += yRotationOffset - 1;\n\n\t\t} else {\n\n\t\t\t// results match glTF results exactly. verified correct in usdview.\n\t\t\toffset.x += xRotationOffset * repeat.x;\n\t\t\toffset.y += ( 1 - yRotationOffset ) * repeat.y;\n\n\t\t}\n\n\t\treturn `\n\t\tdef Shader \"PrimvarReader_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPrimvarReader_float2\"\n\t\t\tfloat2 inputs:fallback = (0.0, 0.0)\n\t\t\ttoken inputs:varname = \"${ uv }\"\n\t\t\tfloat2 outputs:result\n\t\t}\n\n\t\tdef Shader \"Transform2d_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdTransform2d\"\n\t\t\ttoken inputs:in.connect = </Materials/Material_${ material.id }/PrimvarReader_${ mapType }.outputs:result>\n\t\t\tfloat inputs:rotation = ${ ( rotation * ( 180 / Math.PI ) ).toFixed( PRECISION ) }\n\t\t\tfloat2 inputs:scale = ${ buildVector2( repeat ) }\n\t\t\tfloat2 inputs:translation = ${ buildVector2( offset ) }\n\t\t\tfloat2 outputs:result\n\t\t}\n\n\t\tdef Shader \"Texture_${ texture.id }_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdUVTexture\"\n\t\t\tasset inputs:file = @textures/Texture_${ id }.png@\n\t\t\tfloat2 inputs:st.connect = </Materials/Material_${ material.id }/Transform2d_${ mapType }.outputs:result>\n\t\t\t${ color !== undefined ? 'float4 inputs:scale = ' + buildColor4( color ) : '' }\n\t\t\ttoken inputs:sourceColorSpace = \"${ texture.colorSpace === NoColorSpace ? 'raw' : 'sRGB' }\"\n\t\t\ttoken inputs:wrapS = \"${ WRAPPINGS[ texture.wrapS ] }\"\n\t\t\ttoken inputs:wrapT = \"${ WRAPPINGS[ texture.wrapT ] }\"\n\t\t\tfloat outputs:r\n\t\t\tfloat outputs:g\n\t\t\tfloat outputs:b\n\t\t\tfloat3 outputs:rgb\n\t\t\t${ material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : '' }\n\t\t}`;\n\n\t}\n\n\n\tif ( material.side === DoubleSide ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support double sided materials', material );\n\n\t}\n\n\tif ( material.map !== null ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:diffuseColor.connect = </Materials/Material_${ material.id }/Texture_${ material.map.id }_diffuse.outputs:rgb>` );\n\n\t\tif ( material.transparent ) {\n\n\t\t\tinputs.push( `${ pad }float inputs:opacity.connect = </Materials/Material_${ material.id }/Texture_${ material.map.id }_diffuse.outputs:a>` );\n\n\t\t} else if ( material.alphaTest > 0.0 ) {\n\n\t\t\tinputs.push( `${ pad }float inputs:opacity.connect = </Materials/Material_${ material.id }/Texture_${ material.map.id }_diffuse.outputs:a>` );\n\t\t\tinputs.push( `${ pad }float inputs:opacityThreshold = ${material.alphaTest}` );\n\n\t\t}\n\n\t\tsamplers.push( buildTexture( material.map, 'diffuse', material.color ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }color3f inputs:diffuseColor = ${ buildColor( material.color ) }` );\n\n\t}\n\n\tif ( material.emissiveMap !== null ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:emissiveColor.connect = </Materials/Material_${ material.id }/Texture_${ material.emissiveMap.id }_emissive.outputs:rgb>` );\n\n\t\tsamplers.push( buildTexture( material.emissiveMap, 'emissive' ) );\n\n\t} else if ( material.emissive.getHex() > 0 ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:emissiveColor = ${ buildColor( material.emissive ) }` );\n\n\t}\n\n\tif ( material.normalMap !== null ) {\n\n\t\tinputs.push( `${ pad }normal3f inputs:normal.connect = </Materials/Material_${ material.id }/Texture_${ material.normalMap.id }_normal.outputs:rgb>` );\n\n\t\tsamplers.push( buildTexture( material.normalMap, 'normal' ) );\n\n\t}\n\n\tif ( material.aoMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:occlusion.connect = </Materials/Material_${ material.id }/Texture_${ material.aoMap.id }_occlusion.outputs:r>` );\n\n\t\tsamplers.push( buildTexture( material.aoMap, 'occlusion' ) );\n\n\t}\n\n\tif ( material.roughnessMap !== null && material.roughness === 1 ) {\n\n\t\tinputs.push( `${ pad }float inputs:roughness.connect = </Materials/Material_${ material.id }/Texture_${ material.roughnessMap.id }_roughness.outputs:g>` );\n\n\t\tsamplers.push( buildTexture( material.roughnessMap, 'roughness' ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }float inputs:roughness = ${ material.roughness }` );\n\n\t}\n\n\tif ( material.metalnessMap !== null && material.metalness === 1 ) {\n\n\t\tinputs.push( `${ pad }float inputs:metallic.connect = </Materials/Material_${ material.id }/Texture_${ material.metalnessMap.id }_metallic.outputs:b>` );\n\n\t\tsamplers.push( buildTexture( material.metalnessMap, 'metallic' ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }float inputs:metallic = ${ material.metalness }` );\n\n\t}\n\n\tif ( material.alphaMap !== null ) {\n\n\t\tinputs.push( `${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>` );\n\t\tinputs.push( `${pad}float inputs:opacityThreshold = 0.0001` );\n\n\t\tsamplers.push( buildTexture( material.alphaMap, 'opacity' ) );\n\n\t} else {\n\n\t\tinputs.push( `${pad}float inputs:opacity = ${material.opacity}` );\n\n\t}\n\n\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\tinputs.push( `${ pad }float inputs:clearcoat = ${ material.clearcoat }` );\n\t\tinputs.push( `${ pad }float inputs:clearcoatRoughness = ${ material.clearcoatRoughness }` );\n\t\tinputs.push( `${ pad }float inputs:ior = ${ material.ior }` );\n\n\t}\n\n\treturn `\n\tdef Material \"Material_${ material.id }\"\n\t{\n\t\tdef Shader \"PreviewSurface\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\n${ inputs.join( '\\n' ) }\n\t\t\tint inputs:useSpecularWorkflow = 0\n\t\t\ttoken outputs:surface\n\t\t}\n\n\t\ttoken outputs:surface.connect = </Materials/Material_${ material.id }/PreviewSurface.outputs:surface>\n\n${ samplers.join( '\\n' ) }\n\n\t}\n`;\n\n}\n\nfunction buildColor( color ) {\n\n\treturn `(${ color.r }, ${ color.g }, ${ color.b })`;\n\n}\n\nfunction buildColor4( color ) {\n\n\treturn `(${ color.r }, ${ color.g }, ${ color.b }, 1.0)`;\n\n}\n\nfunction buildVector2( vector ) {\n\n\treturn `(${ vector.x }, ${ vector.y })`;\n\n}\n\n\nfunction buildCamera( camera ) {\n\n\tconst name = camera.name ? camera.name : 'Camera_' + camera.id;\n\n\tconst transform = buildMatrix( camera.matrixWorld );\n\n\tif ( camera.matrixWorld.determinant() < 0 ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support negative scales', camera );\n\n\t}\n\n\tif ( camera.isOrthographicCamera ) {\n\n\t\treturn `def Camera \"${name}\"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${ transform }\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\t\t\tfloat2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) })\n\t\t\tfloat horizontalAperture = ${ ( ( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10 ).toPrecision( PRECISION ) }\n\t\t\tfloat verticalAperture = ${ ( ( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10 ).toPrecision( PRECISION ) }\n\t\t\ttoken projection = \"orthographic\"\n\t\t}\n\t\n\t`;\n\n\t} else {\n\n\t\treturn `def Camera \"${name}\"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${ transform }\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\t\t\tfloat2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) })\n\t\t\tfloat focalLength = ${ camera.getFocalLength().toPrecision( PRECISION ) }\n\t\t\tfloat focusDistance = ${ camera.focus.toPrecision( PRECISION ) }\n\t\t\tfloat horizontalAperture = ${ camera.getFilmWidth().toPrecision( PRECISION ) }\n\t\t\ttoken projection = \"perspective\"\n\t\t\tfloat verticalAperture = ${ camera.getFilmHeight().toPrecision( PRECISION ) }\n\t\t}\n\t\n\t`;\n\n\t}\n\n}\n\nexport { USDZExporter };\n","/**\n * Exports the input as USDZ\n *\n * @remarks\n */\n\nimport {ExporterSopNode, BaseExporterSopParamsConfig} from './_BaseExporter';\nimport {USDZExporter} from 'three/examples/jsm/exporters/USDZExporter';\nimport {SopExporter} from '../../poly/registers/nodes/types/Sop';\n\nclass ExporterUSDZSopParamsConfig extends BaseExporterSopParamsConfig {}\nconst ParamsConfig = new ExporterUSDZSopParamsConfig();\n\nexport class ExporterUSDZSopNode extends ExporterSopNode<ExporterUSDZSopParamsConfig> {\n\toverride paramsConfig = ParamsConfig;\n\tstatic override type() {\n\t\treturn SopExporter.EXPORTER_USDZ;\n\t}\n\n\tfileExtension() {\n\t\treturn 'usdz';\n\t}\n\tcreateBlob(): Promise<Blob> {\n\t\treturn new Promise(async (resolve) => {\n\t\t\tconst sceneData = await this._prepareScene();\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst {scene, objects} = sceneData;\n\n\t\t\tconst exporter = new USDZExporter();\n\t\t\tconst result = await exporter.parseAsync(scene);\n\t\t\tconsole.log(result);\n\t\t\tthis._handleResult(result, objects, resolve);\n\t\t});\n\t}\n}\n","import {StoreController} from '../../../../store/controllers/StoreController';\nimport type {NodeSerializerData} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/utils/CoreNodeSerializer';\nimport {NodeContext, CameraSopNodeType} from '../../../../../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {BaseNodeClass} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {computed, Ref} from 'vue';\n\n// anim\nimport {NullAnimNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/anim/Null';\nimport {PlayAnimNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/anim/Play';\n// audio\nimport {FileAudioNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/audio/File';\nimport {PlayInstrumentAudioNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/audio/PlayInstrument';\nimport {SwitchAudioNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/audio/Switch';\n// cop\nimport {ImageEXRCopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/cop/ImageEXR';\nimport {SDFExporterCopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/cop/SDFExporter';\n// gl\nimport {ParamGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/Param';\nimport {RampGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/Ramp';\nimport {TextureGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/Texture';\nimport {Texture2DArrayGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/Texture2DArray';\nimport {TextureSDFGlNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/gl/TextureSDF';\n// js\nimport {KeyframesJsNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/js/Keyframes';\n// rop\nimport {PathTracingRendererRopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/rop/PathTracingRenderer';\n// sop\n// import {CameraWebXRARMarkerTrackingSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CameraWebXRARMarkerTracking';\nimport {DecomposeSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Decompose';\nimport {CADExporterSTEPSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/CADExporterSTEP';\nimport {ExporterGLTFSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterGLTF';\nimport {ExporterOBJSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterOBJ';\nimport {ExporterPLYSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterPLY';\nimport {ExporterSTLSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterSTL';\nimport {ExporterUSDZSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/ExporterUSDZ';\nimport {MergeSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Merge';\nimport {SwitchSopNode} from '../../../../../../@polygonjs/polygonjs/src/engine/nodes/sop/Switch';\n\ninterface NodeData {\n\tcontext: NodeContext;\n\ttype: string;\n}\nfunction nodeData(node: typeof BaseNodeClass): NodeData {\n\treturn {\n\t\tcontext: node.context(),\n\t\ttype: node.type(),\n\t};\n}\nconst NODES_WITH_EXTRA = [\n\t// anim\n\tnodeData(NullAnimNode),\n\tnodeData(PlayAnimNode),\n\t// audio\n\tnodeData(FileAudioNode),\n\tnodeData(PlayInstrumentAudioNode),\n\tnodeData(SwitchAudioNode),\n\t// cop\n\tnodeData(ImageEXRCopNode),\n\tnodeData(SDFExporterCopNode),\n\t// gl\n\tnodeData(ParamGlNode),\n\tnodeData(RampGlNode),\n\tnodeData(TextureGlNode),\n\tnodeData(Texture2DArrayGlNode),\n\tnodeData(TextureSDFGlNode),\n\t// js\n\tnodeData(KeyframesJsNode),\n\t// rop\n\tnodeData(PathTracingRendererRopNode),\n\t// sop\n\t{context: NodeContext.SOP, type: CameraSopNodeType.WEBXR_AR_MARKER_TRACKING}, // CameraWebXRARMarkerTrackingSopNode,\n\tnodeData(DecomposeSopNode),\n\tnodeData(CADExporterSTEPSopNode),\n\tnodeData(ExporterGLTFSopNode),\n\tnodeData(ExporterOBJSopNode),\n\tnodeData(ExporterPLYSopNode),\n\tnodeData(ExporterSTLSopNode),\n\tnodeData(ExporterUSDZSopNode),\n\tnodeData(MergeSopNode),\n\tnodeData(SwitchSopNode),\n].map((data) => `${data.context}/${data.type}`);\n\nexport function SetupExtras(JSONNode: Ref<NodeSerializerData | null>) {\n\t// const showExtrasContainer = ref(false);\n\n\tconst json_node_id = computed(() => {\n\t\treturn JSONNode.value?.graph_node_id;\n\t});\n\tconst extrasContainerKey = computed(() => {\n\t\treturn JSONNode.value?.graph_node_id;\n\t});\n\n\tconst showExtrasContainer = computed(() => {\n\t\tif (json_node_id.value == null) {\n\t\t\treturn false;\n\t\t}\n\t\tconst node = StoreController.engine.node(json_node_id.value);\n\t\tif (node == null) {\n\t\t\treturn false;\n\t\t}\n\t\tconst contextAndType = `${node.context()}/${node.type()}`;\n\t\treturn NODES_WITH_EXTRA.includes(contextAndType);\n\t});\n\n\t// onMounted(() => {\n\t// \tupdateShowExtrasContainer();\n\t// });\n\n\t// watch(json_node_id, (new_id, old_id) => {\n\t// \tshowExtrasContainer.value = false;\n\t// \t// setTimeout(() => {\n\t// \tupdateShowExtrasContainer();\n\t// \t// }, 100);\n\t// });\n\n\t// function updateShowExtrasContainer() {\n\t// \tif (json_node_id.value) {\n\t// \t\tconst node = StoreController.engine.node(json_node_id.value);\n\t// \t\tif (node) {\n\t// \t\t\tconst contextAndType = `${node.context()}/${node.type()}`;\n\t// \t\t\tif (NODES_WITH_EXTRA.includes(contextAndType)) {\n\t// \t\t\t\tshowExtrasContainer.value = true;\n\t// \t\t\t\treturn;\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \tshowExtrasContainer.value = false;\n\t// }\n\n\treturn {\n\t\tshowExtrasContainer,\n\t\textrasContainerKey,\n\t};\n}\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = [\"data-param-id\"]\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"ParamSeparator\"\n}\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"horizontal-border bg-bg-light\" }, null, -1 /* HOISTED */)\nconst _hoisted_5 = [\n  _hoisted_4\n]\nconst _hoisted_6 = { class: \"grid grid-rows-2 lg:grid-rows-1 lg:grid-cols-4 gap-0\" }\nconst _hoisted_7 = [\"title\"]\nconst _hoisted_8 = {\n  key: 0,\n  class: \"cursor-pointer text-xs inline-block align-middle absolute top-1/2 -translate-y-2/4 left-0 lg:right-0 mr-4 max-w-full\"\n}\nconst _hoisted_9 = {\n  key: 1,\n  class: \"ParamSeparator\"\n}\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"horizontal-border bg-bg-light\" }, null, -1 /* HOISTED */)\nconst _hoisted_11 = [\n  _hoisted_10\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_ctx.param_visible)\n    ? (_openBlock(), _createElementBlock(\"div\", {\n        key: 0,\n        class: _normalizeClass([\"ParamContainer grid-x mb-px max-w-full\", _ctx.paramClassObject]),\n        style: _normalizeStyle(_ctx.paramStyleObject),\n        \"data-param-id\": _ctx.paramId\n      }, [\n        _createElementVNode(\"div\", _hoisted_2, [\n          (_ctx.separatorBefore)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, _hoisted_5))\n            : _createCommentVNode(\"v-if\", true),\n          _createElementVNode(\"div\", _hoisted_6, [\n            (_ctx.display_label_column)\n              ? (_openBlock(), _createElementBlock(\"div\", {\n                  key: 0,\n                  class: \"col-span-4 lg:col-span-1 cursor-pointer text-left lg:text-right flex items-start lg:items-end px-0 md:px-3 leading-2 select-none relative hover:bg-bg-light max-w-full\",\n                  title: _ctx.label_tooltip,\n                  onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.onLabelClick && _ctx.onLabelClick(...args))),\n                  onMousedown: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.open_numeric_slider_if_numeric_or_color && _ctx.open_numeric_slider_if_numeric_or_color(...args))),\n                  onContextmenu: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n                }, [\n                  (_ctx.display_label)\n                    ? (_openBlock(), _createElementBlock(\"label\", _hoisted_8, _toDisplayString(_ctx.name), 1 /* TEXT */))\n                    : _createCommentVNode(\"v-if\", true)\n                ], 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_7))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"div\", {\n              class: _normalizeClass([\n\t\t\t\t\t\t'col-span-4 param_fields max-w-full',\n\t\t\t\t\t\t_ctx.display_label_column ? 'small-9 lg:col-span-3' : 'lg:col-span-4 auto no_labels_on_any_param',\n\t\t\t\t\t])\n            }, [\n              (_openBlock(), _createBlock(_resolveDynamicComponent(_ctx.field_component_type), {\n                json_param: _ctx.json_param,\n                displays_expression_result: _ctx.displays_expression_result,\n                linkIndex: _ctx.linkIndex,\n                paramIndex: _ctx.paramIndex,\n                params: _ctx.params,\n                onToggleFullScreen: _ctx.toggleFullScreen\n              }, null, 40 /* PROPS, HYDRATE_EVENTS */, [\"json_param\", \"displays_expression_result\", \"linkIndex\", \"paramIndex\", \"params\", \"onToggleFullScreen\"]))\n            ], 2 /* CLASS */)\n          ]),\n          (_ctx.separatorAfter)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, _hoisted_11))\n            : _createCommentVNode(\"v-if\", true)\n        ])\n      ], 14 /* CLASS, STYLE, PROPS */, _hoisted_1))\n    : _createCommentVNode(\"v-if\", true)\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=template&id=a4559d7a&ts=true\"","import {MouseButton} from '../../../../../../../../@polygonjs/polygonjs/src/core/MouseButton';\n\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {EngineParamData} from '../../../../../../store/modules/Engine';\nexport function SetupGlobalSliderOwner(json_param: EngineParamData) {\n\tfunction open_numeric_slider(e: MouseEvent) {\n\t\tif (e.button == MouseButton.MIDDLE) {\n\t\t\tStoreController.editor.numericSlider.open({\n\t\t\t\tparam_id: json_param.graph_node_id,\n\t\t\t\tposition: {x: e.clientX, y: e.clientY},\n\t\t\t});\n\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tfunction on_paste(e: Event) {\n\t\t// to prevent paste into field\n\t\t// which happens on linux when opening or closing the global slider with middle mouse button\n\t\tconst param_id = StoreController.editor.numericSlider.param_id();\n\t\tif (param_id != null) {\n\t\t\treturn e.preventDefault();\n\t\t}\n\t}\n\n\treturn {\n\t\topen_numeric_slider,\n\t\ton_paste,\n\t};\n}\n","import {StoreController} from '../../../../../store/controllers/StoreController';\nimport {EngineParamData} from '../../../../../store/modules/Engine';\nimport {BaseParamType} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\n\nexport function SetupContextMenu(json_param: EngineParamData, param: BaseParamType) {\n\tfunction on_contextmenu(event: MouseEvent) {\n\t\tconst menu_param_id = StoreController.editor.contextMenu.paramId();\n\t\tconst current_param_id = json_param.graph_node_id;\n\t\tif (menu_param_id == current_param_id) {\n\t\t\ton_contextmenu_close();\n\t\t} else {\n\t\t\tStoreController.editor.contextMenu.setParamId(current_param_id);\n\t\t}\n\t\tStoreController.editor.contextMenu.setPosition({\n\t\t\tx: event.pageX,\n\t\t\ty: event.pageY,\n\t\t});\n\t}\n\tfunction on_contextmenu_close() {\n\t\tStoreController.editor.contextMenu.setParamId(null);\n\t}\n\n\treturn {\n\t\ton_contextmenu,\n\t\ton_contextmenu_close,\n\t};\n}\n","import {EngineParamData} from '../../../../../store/modules/Engine';\nimport {BaseParamType} from '../../../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {computed} from 'vue';\nimport {StoreController} from '../../../../../store/controllers/StoreController';\nimport {fieldComponentType} from './Utils';\n\nexport function SetupJoinedParams(\n\tjson_param: EngineParamData,\n\tparam: BaseParamType,\n\tparamIndex: number,\n\tparamJSONs: EngineParamData[]\n) {\n\tconst joinedParams = computed(() => {\n\t\tconst list: EngineParamData[] = [];\n\n\t\tfunction paramIsJoined(index: number) {\n\t\t\tconst paramJSON = paramJSONs[i];\n\t\t\tif (!paramJSON) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst param = StoreController.engine.param(paramJSON.graph_node_id);\n\t\t\tif (!param) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn param.options.joinToPreviousParam();\n\t\t}\n\n\t\tlet i = paramIndex + 1;\n\t\twhile (paramIsJoined(i++)) {\n\t\t\tlist.push(paramJSONs[i]);\n\t\t}\n\t\treturn list;\n\t});\n\tconst joinedParamsFieldComponentTypes = computed(() => {\n\t\treturn joinedParams.value.map((joinedParam) => {\n\t\t\tconst param = StoreController.engine.param(joinedParam.graph_node_id);\n\t\t\tif (param) {\n\t\t\t\treturn fieldComponentType(param);\n\t\t\t}\n\t\t});\n\t});\n\n\treturn {joinedParams, joinedParamsFieldComponentTypes};\n}\n","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"cell shrink mx-1\" }\nconst _hoisted_2 = [\"checked\", \"disabled\"]\nconst _hoisted_3 = { class: \"cell auto\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_Numeric = _resolveComponent(\"Numeric\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field Boolean grid-x\", _ctx.class_object]),\n    onContextmenu: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"input\", {\n        class: \"focus:ring-0 focus:ring-offset-0 focus:outline-none h-4 w-4 bg-black text-emerald-600 border-0 focus:border-0\",\n        type: \"checkbox\",\n        onChange: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.on_checkbox_update && _ctx.on_checkbox_update(...args))),\n        checked: _ctx.checked,\n        disabled: _ctx.isFieldDisabled\n      }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_2)\n    ]),\n    _createElementVNode(\"div\", _hoisted_3, [\n      (_ctx.is_field_visible)\n        ? (_openBlock(), _createBlock(_component_Numeric, {\n            key: 0,\n            json_param: _ctx.json_param,\n            displays_expression_result: _ctx.displays_expression_result\n          }, null, 8 /* PROPS */, [\"json_param\", \"displays_expression_result\"]))\n        : (_openBlock(), _createElementBlock(\"label\", {\n            key: 1,\n            class: \"disable-select\",\n            onClick: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.toggle_param && _ctx.toggle_param(...args)))\n          }, _toDisplayString(_ctx.name), 1 /* TEXT */))\n    ])\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=template&id=46e50090&ts=true\"","import { withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"value\", \"title\", \"disabled\"]\nconst _hoisted_2 = [\"value\", \"title\", \"disabled\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field Numeric\", _ctx.class_object]),\n    onContextmenu: _cache[11] || (_cache[11] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"input\", {\n      class: _normalizeClass([\"raw_input shadow appearance-none border border-black rounded w-full py-2 px-3 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-100 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\", _ctx.input_value_class_object]),\n      value: _ctx.raw_input,\n      onKeypress: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"])),\n      onKeyup: _cache[1] || (_cache[1] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_keyup && _ctx.on_keyup(...args)), [\"stop\"])),\n      onKeydown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n      onChange: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n      onBlur: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n      type: \"text\",\n      onMousedown: _cache[5] || (_cache[5] = \n//@ts-ignore\n(...args) => (_ctx.open_numeric_slider && _ctx.open_numeric_slider(...args))),\n      onPaste: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.on_paste && _ctx.on_paste(...args))),\n      onClick: _cache[7] || (_cache[7] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.resetToDefault && _ctx.resetToDefault(...args)), [\"ctrl\"])),\n      title: _ctx.error_message,\n      disabled: _ctx.isFieldDisabled\n    }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_1),\n    _createElementVNode(\"input\", {\n      class: \"expression_result shadow appearance-none border border-black rounded w-full py-2 px-3 bg-green-400 focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-800 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n      value: _ctx.value,\n      readonly: \"\",\n      type: \"text\",\n      title: `${_ctx.value}`,\n      disabled: _ctx.isFieldDisabled,\n      onKeypress: _cache[8] || (_cache[8] = _withModifiers(() => {}, [\"stop\"])),\n      onKeyup: _cache[9] || (_cache[9] = _withModifiers(() => {}, [\"stop\"])),\n      onKeydown: _cache[10] || (_cache[10] = _withModifiers(() => {}, [\"stop\"]))\n    }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_2)\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Numeric.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Numeric.vue?vue&type=script&lang=ts\"","import { render } from \"./Numeric.vue?vue&type=template&id=89794f20&ts=true\"\nimport script from \"./Numeric.vue?vue&type=script&lang=ts\"\nexport * from \"./Numeric.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=style&index=0&id=46e50090&lang=sass\"","import { render } from \"./Boolean.vue?vue&type=template&id=46e50090&ts=true\"\nimport script from \"./Boolean.vue?vue&type=script&lang=ts\"\nexport * from \"./Boolean.vue?vue&type=script&lang=ts\"\n\nimport \"./Boolean.vue?vue&type=style&index=0&id=46e50090&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Button max-w-full overflow-hidden\" }\nconst _hoisted_2 = [\"id\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"button\", {\n      id: _ctx.buttonId,\n      class: \"max-w-full md:w-full px-1 py-1 md:px-3 md:py-2 text-text-light text-xs lg:text-base bg-blue-700 hover:bg-blue-800 hover:text-white cursor-pointer rounded truncate\",\n      onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.onclick && _ctx.onclick(...args)), [\"self\",\"prevent\"])),\n      onContextmenu: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n    }, _toDisplayString(_ctx.label), 41 /* TEXT, PROPS, HYDRATE_EVENTS */, _hoisted_2)\n  ]))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=template&id=676427ac&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=style&index=0&id=676427ac&lang=sass\"","import { render } from \"./Button.vue?vue&type=template&id=676427ac&ts=true\"\nimport script from \"./Button.vue?vue&type=script&lang=ts\"\nexport * from \"./Button.vue?vue&type=script&lang=ts\"\n\nimport \"./Button.vue?vue&type=style&index=0&id=676427ac&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Multiple Color grid-x\" }\nconst _hoisted_2 = { class: \"cell shrink\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"cell auto\" }\nconst _hoisted_5 = { class: \"grid-x\" }\nconst _hoisted_6 = { class: \"cell auto\" }\nconst _hoisted_7 = { class: \"grid-x\" }\nconst _hoisted_8 = { class: \"cell shrink text-right ml-1\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_Numeric = _resolveComponent(\"Numeric\")!\n  const _component_SelectInput = _resolveComponent(\"SelectInput\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _withDirectives(_createElementVNode(\"input\", {\n        class: \"focus:ring-0 focus:ring-offset-0 focus:outline-none h-full w-4 border-0 focus:border-0\",\n        type: \"color\",\n        ref: \"color_input\",\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.hex_color) = $event)),\n        onFocus: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.color_input_focused && _ctx.color_input_focused(...args))),\n        onInput: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.color_input_updated && _ctx.color_input_updated(...args))),\n        onChange: _cache[3] || (_cache[3] = \n//@ts-ignore\n(...args) => (_ctx.color_input_changed && _ctx.color_input_changed(...args))),\n        onBlur: _cache[4] || (_cache[4] = \n//@ts-ignore\n(...args) => (_ctx.color_input_blurred && _ctx.color_input_blurred(...args))),\n        disabled: _ctx.isFieldDisabled\n      }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_3), [\n        [_vModelText, _ctx.hex_color]\n      ])\n    ]),\n    _createElementVNode(\"div\", _hoisted_4, [\n      _createElementVNode(\"div\", _hoisted_5, [\n        _createElementVNode(\"div\", _hoisted_6, [\n          _createElementVNode(\"div\", _hoisted_7, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.json_components, (json_component, i) => {\n              return (_openBlock(), _createElementBlock(\"div\", {\n                class: \"cell small-4\",\n                key: i\n              }, [\n                json_component\n                  ? (_openBlock(), _createBlock(_component_Numeric, {\n                      key: 0,\n                      json_param: json_component,\n                      displays_expression_result: _ctx.displays_expression_result,\n                      class: _normalizeClass(_ctx.classObjects[i])\n                    }, null, 8 /* PROPS */, [\"json_param\", \"displays_expression_result\", \"class\"]))\n                  : _createCommentVNode(\"v-if\", true)\n              ]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ])\n        ]),\n        _createElementVNode(\"div\", _hoisted_8, [\n          _createCommentVNode(\" <select\\n\\t\\t\\t\\t\\t\\tclass=\\\"block w-full pl-2 pr-2 border-gray-300 focus:outline-none focus:ring-0 rounded-md leading-4 text-sm h-8\\\"\\n\\t\\t\\t\\t\\t\\tref=\\\"select\\\"\\n\\t\\t\\t\\t\\t\\t@change=\\\"set_convert_action_from_select\\\"\\n\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t<option\\n\\t\\t\\t\\t\\t\\t\\tv-for=\\\"(entry, i) in entries\\\"\\n\\t\\t\\t\\t\\t\\t\\t:key=\\\"i\\\"\\n\\t\\t\\t\\t\\t\\t\\t:value=\\\"entry.value\\\"\\n\\t\\t\\t\\t\\t\\t\\t:selected=\\\"selected_states[i]\\\"\\n\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t{{ entry.name }}\\n\\t\\t\\t\\t\\t\\t</option>\\n\\t\\t\\t\\t\\t</select> \"),\n          (_openBlock(), _createBlock(_component_SelectInput, {\n            class: \"w-36\",\n            key: _ctx.colorConversionSelectInputKey,\n            entries: _ctx.entries,\n            value: _ctx.currentColorConversionIndex,\n            disabled: _ctx.isFieldDisabled,\n            onChange: _ctx.onColorConversionSelectEntry\n          }, null, 8 /* PROPS */, [\"entries\", \"value\", \"disabled\", \"onChange\"]))\n        ])\n      ])\n    ])\n  ]))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=template&id=878a24ee&ts=true\"","import {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {EngineParamData} from '../../../../../../store/modules/Engine';\n\nimport {computed} from 'vue';\nexport function SetupMultipleParamCommon(json_param: EngineParamData) {\n\tconst json_components = computed(() => {\n\t\treturn json_param.components?.map((id) => StoreController.engine.json_param(id)) || [];\n\t});\n\n\tconst cell_class_object = computed(() => {\n\t\tconst columns_count_per_components = 12 / json_components.value.length;\n\t\tconst class_name = `small-${columns_count_per_components}`;\n\t\treturn {\n\t\t\t[class_name]: true,\n\t\t};\n\t});\n\n\treturn {\n\t\tjson_components,\n\t\tcell_class_object,\n\t};\n}\n","import {ColorConversion} from './../../../@polygonjs/polygonjs/src/core/Color';\ntype ColorConversionLabelMapMapGeneric = {[key in ColorConversion]: string};\n\nexport const COLOR_CONVERSION_LABELS_BY_COLOR_CONVERSION: ColorConversionLabelMapMapGeneric = {\n\t[ColorConversion.NONE]: 'no conversion',\n\t[ColorConversion.SRGB_TO_LINEAR]: 'sRGB -> linear',\n\t[ColorConversion.LINEAR_TO_SRGB]: 'linear -> sRGB',\n};\n","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=style&index=0&id=878a24ee&lang=sass\"","import { render } from \"./Color.vue?vue&type=template&id=878a24ee&ts=true\"\nimport script from \"./Color.vue?vue&type=script&lang=ts\"\nexport * from \"./Color.vue?vue&type=script&lang=ts\"\n\nimport \"./Color.vue?vue&type=style&index=0&id=878a24ee&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid-x\" }\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = [\"value\", \"title\", \"disabled\"]\nconst _hoisted_4 = [\"value\", \"title\"]\nconst _hoisted_5 = {\n  key: 0,\n  class: \"cell small-10 slider_container px-2\"\n}\nconst _hoisted_6 = [\"min\", \"max\", \"step\", \"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field Float\", _ctx.class_object]),\n    onContextmenu: _cache[16] || (_cache[16] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"input\", {\n          class: _normalizeClass([\"raw_input shadow appearance-none border border-black rounded w-full py-2 px-3 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-100 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\", _ctx.input_value_class_object]),\n          value: _ctx.raw_input,\n          onKeypress: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[1] || (_cache[1] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_keyup && _ctx.on_keyup(...args)), [\"stop\"])),\n          onKeydown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n          onChange: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n          onFocus: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_focus && _ctx.on_focus(...args)), [\"stop\"])),\n          onBlur: _cache[5] || (_cache[5] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_blur && _ctx.on_blur(...args)), [\"stop\"])),\n          type: \"text\",\n          onMousedown: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.open_numeric_slider && _ctx.open_numeric_slider(...args))),\n          onPaste: _cache[7] || (_cache[7] = \n//@ts-ignore\n(...args) => (_ctx.on_paste && _ctx.on_paste(...args))),\n          onClick: _cache[8] || (_cache[8] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.resetToDefault && _ctx.resetToDefault(...args)), [\"ctrl\"])),\n          title: _ctx.error_message,\n          disabled: _ctx.isFieldDisabled\n        }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_3),\n        _createElementVNode(\"input\", {\n          class: \"expression_result shadow appearance-none border border-black rounded w-full py-2 px-3 bg-green-700 focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-800 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n          value: _ctx.value,\n          readonly: \"\",\n          type: \"text\",\n          title: `${_ctx.value}`,\n          onKeypress: _cache[9] || (_cache[9] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[10] || (_cache[10] = _withModifiers(() => {}, [\"stop\"])),\n          onKeydown: _cache[11] || (_cache[11] = _withModifiers(() => {}, [\"stop\"]))\n        }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_4)\n      ]),\n      (_ctx.display_slider)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n            _createElementVNode(\"input\", {\n              type: \"range\",\n              min: _ctx.param_range[0],\n              max: _ctx.param_range[1],\n              step: _ctx.slider_step,\n              value: _ctx.value,\n              onMousedown: _cache[12] || (_cache[12] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_mousedown && _ctx.on_slider_mousedown(...args))),\n              onMouseup: _cache[13] || (_cache[13] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_mouseup && _ctx.on_slider_mouseup(...args))),\n              onChange: _cache[14] || (_cache[14] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_change && _ctx.on_slider_change(...args))),\n              onInput: _cache[15] || (_cache[15] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_drag && _ctx.on_slider_drag(...args)))\n            }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_6)\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ])\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=template&id=3e751d81&ts=true\"","import {Editor} from './../../../../../../Editor';\nimport {EngineParamData} from '../../../../../../store/modules/Engine';\nimport {ParamSetCommand} from '../../../../../../history/commands/ParamSet';\nimport {BaseParamType} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/_Base';\nimport {ColorParam} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Color';\nimport {Vector2Param} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector2';\nimport {Vector3Param} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector3';\nimport {Vector4Param} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Vector4';\nimport {FloatParam} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Float';\nimport {IntegerParam} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/Integer';\nimport {ParamType} from '../../../../../../../../@polygonjs/polygonjs/src/engine/poly/ParamType';\nimport {ParamInitValuesTypeMap} from '../../../../../../../../@polygonjs/polygonjs/src/engine/params/types/ParamInitValuesTypeMap';\nexport function SetupNumericSlider(json_param: EngineParamData, param: BaseParamType) {\n\tlet slider_start_value: ParamInitValuesTypeMap[ParamType] | undefined = undefined;\n\tlet slider_start_expression: string | undefined = undefined;\n\tfunction on_slider_mousedown(e: Event) {\n\t\tconst target = e.target as HTMLInputElement;\n\t\tif (target) {\n\t\t\tif (param.hasExpression() && param.expressionController) {\n\t\t\t\tslider_start_expression = param.expressionController.expression();\n\t\t\t} else {\n\t\t\t\tslider_start_value = param.valueSerialized();\n\t\t\t}\n\t\t}\n\t}\n\tasync function on_slider_mouseup(e: Event) {\n\t\tconst target = e.target as HTMLInputElement;\n\n\t\tconst is_param_allowed =\n\t\t\tparam instanceof ColorParam ||\n\t\t\tparam instanceof Vector2Param ||\n\t\t\tparam instanceof Vector3Param ||\n\t\t\tparam instanceof Vector4Param ||\n\t\t\tparam instanceof FloatParam ||\n\t\t\tparam instanceof IntegerParam;\n\t\tif (!is_param_allowed) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (target) {\n\t\t\tif (slider_start_expression) {\n\t\t\t\tconst cmd = new ParamSetCommand(param as any, param.valueSerialized(), slider_start_expression);\n\t\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t\t} else {\n\t\t\t\tif (!param.isValueEqual(slider_start_value as any)) {\n\t\t\t\t\tconst cmd = new ParamSetCommand(param as any, param.valueSerialized(), slider_start_value);\n\t\t\t\t\tawait Editor.instance().pushCommand(cmd);\n\t\t\t\t}\n\t\t\t}\n\t\t\tslider_start_value = undefined;\n\t\t\tslider_start_expression = undefined;\n\t\t}\n\t}\n\tfunction on_slider_drag(e: Event) {\n\t\tconst target = e.target as HTMLInputElement;\n\t\tif (target) {\n\t\t\tconst value = target.value;\n\t\t\tif (!param.isRawInputEqual(value)) {\n\t\t\t\tparam.set(value);\n\t\t\t}\n\t\t}\n\t}\n\tfunction on_slider_change(e: Event) {\n\t\tconst target = e.target as HTMLInputElement;\n\t\tif (target) {\n\t\t}\n\t}\n\n\treturn {\n\t\ton_slider_mousedown,\n\t\ton_slider_mouseup,\n\t\ton_slider_drag,\n\t\ton_slider_change,\n\t};\n}\n","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=style&index=0&id=3e751d81&lang=sass\"","import { render } from \"./Float.vue?vue&type=template&id=3e751d81&ts=true\"\nimport script from \"./Float.vue?vue&type=script&lang=ts\"\nexport * from \"./Float.vue?vue&type=script&lang=ts\"\n\nimport \"./Float.vue?vue&type=style&index=0&id=3e751d81&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Folder\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=template&id=623edac2&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=style&index=0&id=623edac2&lang=sass\"","import { render } from \"./Folder.vue?vue&type=template&id=623edac2&ts=true\"\nimport script from \"./Folder.vue?vue&type=script&lang=ts\"\nexport * from \"./Folder.vue?vue&type=script&lang=ts\"\n\nimport \"./Folder.vue?vue&type=style&index=0&id=623edac2&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid-x\" }\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = [\"value\", \"title\", \"disabled\"]\nconst _hoisted_4 = [\"value\", \"title\", \"disabled\"]\nconst _hoisted_5 = {\n  key: 0,\n  class: \"cell small-10 slider_container flex\"\n}\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"grow-0 w-2\" }, null, -1 /* HOISTED */)\nconst _hoisted_7 = [\"min\", \"max\", \"step\", \"value\"]\nconst _hoisted_8 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"grow-0 w-1\" }, null, -1 /* HOISTED */)\nconst _hoisted_9 = { class: \"grow-0 whitespace-nowrap select-none flex items-center justify-center\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_ChevronLeftIcon = _resolveComponent(\"ChevronLeftIcon\")!\n  const _component_ChevronRightIcon = _resolveComponent(\"ChevronRightIcon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field Integer\", _ctx.class_object]),\n    onContextmenu: _cache[16] || (_cache[16] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"input\", {\n          class: _normalizeClass([\"raw_input shadow appearance-none border border-black rounded w-full py-2 px-3 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-100 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\", _ctx.input_value_class_object]),\n          value: _ctx.raw_input,\n          onKeypress: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[1] || (_cache[1] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_keyup && _ctx.on_keyup(...args)), [\"stop\"])),\n          onKeydown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n          onChange: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n          onFocus: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_focus && _ctx.on_focus(...args)), [\"stop\"])),\n          onBlur: _cache[5] || (_cache[5] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_blur && _ctx.on_blur(...args)), [\"stop\"])),\n          type: \"text\",\n          onMousedown: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.open_numeric_slider && _ctx.open_numeric_slider(...args))),\n          onPaste: _cache[7] || (_cache[7] = \n//@ts-ignore\n(...args) => (_ctx.on_paste && _ctx.on_paste(...args))),\n          onClick: _cache[8] || (_cache[8] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.resetToDefault && _ctx.resetToDefault(...args)), [\"ctrl\"])),\n          title: _ctx.error_message,\n          disabled: _ctx.isFieldDisabled\n        }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_3),\n        _createElementVNode(\"input\", {\n          class: \"expression_result shadow appearance-none border border-black rounded w-full py-2 px-3 bg-green-700 focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-800 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n          value: _ctx.value,\n          readonly: \"\",\n          type: \"text\",\n          title: `${_ctx.value}`,\n          disabled: _ctx.isFieldDisabled,\n          onKeypress: _cache[9] || (_cache[9] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[10] || (_cache[10] = _withModifiers(() => {}, [\"stop\"])),\n          onKeydown: _cache[11] || (_cache[11] = _withModifiers(() => {}, [\"stop\"]))\n        }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_4)\n      ]),\n      (_ctx.display_slider)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n            _hoisted_6,\n            _createElementVNode(\"input\", {\n              class: \"grow\",\n              type: \"range\",\n              min: _ctx.param_range[0],\n              max: _ctx.param_range[1],\n              step: _ctx.slider_step,\n              value: _ctx.value,\n              onMousedown: _cache[12] || (_cache[12] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_mousedown && _ctx.on_slider_mousedown(...args))),\n              onMouseup: _cache[13] || (_cache[13] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_mouseup && _ctx.on_slider_mouseup(...args))),\n              onChange: _cache[14] || (_cache[14] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_change && _ctx.on_slider_change(...args))),\n              onInput: _cache[15] || (_cache[15] = \n//@ts-ignore\n(...args) => (_ctx.on_slider_drag && _ctx.on_slider_drag(...args)))\n            }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_7),\n            _hoisted_8,\n            _createElementVNode(\"div\", _hoisted_9, [\n              _createVNode(_component_ChevronLeftIcon, {\n                class: _normalizeClass([\n\t\t\t\t\t\t\t'inline-block h-4 w-6 px-1',\n\t\t\t\t\t\t\t_ctx.decrementValueAllowed ? 'cursor-pointer hover:opacity-80' : 'opacity-30',\n\t\t\t\t\t\t]),\n                onClick: _ctx.decrementValue\n              }, null, 8 /* PROPS */, [\"class\", \"onClick\"]),\n              _createVNode(_component_ChevronRightIcon, {\n                class: _normalizeClass([\n\t\t\t\t\t\t\t'inline-block h-4 w-6 px-1',\n\t\t\t\t\t\t\t_ctx.incrementValueAllowed ? 'cursor-pointer hover:opacity-80' : 'opacity-30',\n\t\t\t\t\t\t]),\n                onClick: _ctx.incrementValue\n              }, null, 8 /* PROPS */, [\"class\", \"onClick\"])\n            ])\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ])\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=template&id=1ed861e0&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=style&index=0&id=1ed861e0&lang=sass\"","import { render } from \"./Integer.vue?vue&type=template&id=1ed861e0&ts=true\"\nimport script from \"./Integer.vue?vue&type=script&lang=ts\"\nexport * from \"./Integer.vue?vue&type=script&lang=ts\"\n\nimport \"./Integer.vue?vue&type=style&index=0&id=1ed861e0&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid-x\" }\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = [\"value\", \"title\", \"disabled\"]\nconst _hoisted_4 = [\"value\", \"disabled\"]\nconst _hoisted_5 = { class: \"cell shrink\" }\nconst _hoisted_6 = { class: \"button-group h-full\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field NodePath\", _ctx.class_object]),\n    onContextmenu: _cache[10] || (_cache[10] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"input\", {\n          class: \"raw_input shadow appearance-none border border-black rounded w-full py-2 px-3 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n          value: _ctx.raw_input,\n          onKeypress: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"])),\n          onKeydown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n          onChange: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n          onBlue: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n          type: \"text\",\n          title: _ctx.error_message,\n          disabled: _ctx.isFieldDisabled\n        }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_3),\n        _createElementVNode(\"input\", {\n          class: \"expression_result shadow appearance-none border border-black rounded w-full py-2 px-3 bg-green-400 focus:outline-none focus:ring-0 focus:border-blue-500 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n          value: _ctx.valuePath,\n          readonly: \"\",\n          type: \"text\",\n          disabled: _ctx.isFieldDisabled,\n          onKeypress: _cache[5] || (_cache[5] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[6] || (_cache[6] = _withModifiers(() => {}, [\"stop\"])),\n          onKeydown: _cache[7] || (_cache[7] = _withModifiers(() => {}, [\"stop\"]))\n        }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_4)\n      ]),\n      _createElementVNode(\"div\", _hoisted_5, [\n        _createElementVNode(\"div\", _hoisted_6, [\n          _createElementVNode(\"div\", {\n            class: \"cursor-pointer inline-flex items-center ml-1 px-3 py-2 text-sm font-medium rounded text-white border border-transparent bg-blue-700 hover:bg-blue-600\",\n            title: \"Click: Go to node / Ctrl+Click: Go inside node\",\n            onClick: _cache[8] || (_cache[8] = \n//@ts-ignore\n(...args) => (_ctx.go_to_node && _ctx.go_to_node(...args)))\n          }, [\n            _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-chevron-right h-8 w-8\" })\n          ]),\n          _createElementVNode(\"div\", {\n            class: \"open_node_selector cursor-pointer inline-flex items-center ml-1 px-3 py-2 text-sm font-medium rounded text-white border border-transparent bg-orange-700 hover:bg-orange-600\",\n            title: \"select node\",\n            onClick: _cache[9] || (_cache[9] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.open_node_selector && _ctx.open_node_selector(...args)), [\"stop\"]))\n          }, [\n            _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-align-left h-8 w-8\" })\n          ])\n        ])\n      ])\n    ])\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodePath.vue?vue&type=template&id=9f44b706&ts=true\"","import {ParamPathParam} from './../../../../../../../../@polygonjs/polygonjs/src/engine/params/ParamPath';\nimport {NodePathParam} from './../../../../../../../../@polygonjs/polygonjs/src/engine/params/NodePath';\nimport {StoreController} from '../../../../../../store/controllers/StoreController';\nimport {EngineParamData} from '../../../../../../store/modules/Engine';\nimport {computed, watch, ref} from 'vue';\n\nexport interface SetupPathParamProps {\n\tjson_param: EngineParamData;\n\tdisplays_expression_result: boolean;\n}\n\nexport function SetupPathParam(props: SetupPathParamProps) {\n\tconst param = StoreController.engine.param(props.json_param.graph_node_id)! as NodePathParam | ParamPathParam;\n\n\tconst displays_expression_result = computed(() => props.displays_expression_result);\n\tconst valuePath = ref(param.value.path());\n\twatch(displays_expression_result, () => {\n\t\tif (displays_expression_result.value) {\n\t\t\t_updateValuePath();\n\t\t}\n\t});\n\tasync function _updateValuePath() {\n\t\tawait param.compute();\n\t\tvaluePath.value = param.value.path();\n\t}\n\n\treturn {\n\t\tvaluePath,\n\t};\n}\n","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodePath.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodePath.vue?vue&type=script&lang=ts\"","import { render } from \"./NodePath.vue?vue&type=template&id=9f44b706&ts=true\"\nimport script from \"./NodePath.vue?vue&type=script&lang=ts\"\nexport * from \"./NodePath.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid-x\" }\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = [\"value\", \"title\", \"disabled\"]\nconst _hoisted_4 = [\"value\", \"disabled\"]\nconst _hoisted_5 = { class: \"cell shrink\" }\nconst _hoisted_6 = { class: \"button-group h-full\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field ParamPath\", _ctx.class_object]),\n    onContextmenu: _cache[10] || (_cache[10] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"input\", {\n          class: \"raw_input shadow appearance-none border border-black rounded w-full py-2 px-3 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-white leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n          value: _ctx.raw_input,\n          onKeypress: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"])),\n          onKeydown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n          onChange: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n          onBlue: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n          type: \"text\",\n          title: _ctx.error_message,\n          disabled: _ctx.isFieldDisabled\n        }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_3),\n        _createElementVNode(\"input\", {\n          class: \"expression_result shadow appearance-none border border-black rounded w-full py-2 px-3 bg-green-400 focus:outline-none focus:ring-0 focus:border-blue-500 text-white leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n          value: _ctx.valuePath,\n          readonly: \"\",\n          type: \"text\",\n          disabled: _ctx.isFieldDisabled,\n          onKeypress: _cache[5] || (_cache[5] = _withModifiers(() => {}, [\"stop\"])),\n          onKeyup: _cache[6] || (_cache[6] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_keyup && _ctx.on_keyup(...args)), [\"stop\"])),\n          onKeydown: _cache[7] || (_cache[7] = _withModifiers(() => {}, [\"stop\"]))\n        }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_4)\n      ]),\n      _createElementVNode(\"div\", _hoisted_5, [\n        _createElementVNode(\"div\", _hoisted_6, [\n          _createElementVNode(\"div\", {\n            class: \"cursor-pointer inline-flex items-center ml-1 px-3 py-2 text-sm font-medium rounded text-white border border-transparent bg-blue-700 hover:bg-blue-600\",\n            title: \"go to node\",\n            onClick: _cache[8] || (_cache[8] = \n//@ts-ignore\n(...args) => (_ctx.go_to_node && _ctx.go_to_node(...args)))\n          }, [\n            _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-chevron-right h-8 w-8\" })\n          ]),\n          _createElementVNode(\"div\", {\n            class: \"ursor-pointer inline-flex items-center ml-1 px-3 py-2 text-sm font-medium rounded text-white border border-transparent bg-orange-700 hover:bg-orange-600\",\n            title: \"select node\",\n            onClick: _cache[9] || (_cache[9] = \n//@ts-ignore\n(...args) => (_ctx.open_node_selector && _ctx.open_node_selector(...args)))\n          }, [\n            _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-align-left h-8 w-8\" })\n          ])\n        ])\n      ])\n    ])\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamPath.vue?vue&type=template&id=b6947946&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamPath.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamPath.vue?vue&type=script&lang=ts\"","import { render } from \"./ParamPath.vue?vue&type=template&id=b6947946&ts=true\"\nimport script from \"./ParamPath.vue?vue&type=script&lang=ts\"\nexport * from \"./ParamPath.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, createVNode as _createVNode, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Radio flex\" }\nconst _hoisted_2 = { class: \"radio_inputs_container grow\" }\nconst _hoisted_3 = { class: \"grow-0 select-none flex items-center justify-center\" }\nconst _hoisted_4 = { class: \"\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_SelectInput = _resolveComponent(\"SelectInput\")!\n  const _component_ChevronLeftIcon = _resolveComponent(\"ChevronLeftIcon\")!\n  const _component_ChevronRightIcon = _resolveComponent(\"ChevronRightIcon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createCommentVNode(\" <select\\n\\t\\t\\t\\tclass=\\\"block w-full pl-2 pr-2 border-gray-300 focus:outline-none focus:ring-0 rounded-md leading-4 text-sm h-8\\\"\\n\\t\\t\\t\\tref=\\\"select\\\"\\n\\t\\t\\t\\t@change=\\\"set_from_select\\\"\\n\\t\\t\\t>\\n\\t\\t\\t\\t<option v-for=\\\"(entry, i) in entries\\\" :key=\\\"i\\\" :value=\\\"entry.value\\\" :selected=\\\"selected_states[i]\\\">\\n\\t\\t\\t\\t\\t{{ entry.name }}\\n\\t\\t\\t\\t</option>\\n\\t\\t\\t</select> \"),\n      (_openBlock(), _createBlock(_component_SelectInput, {\n        key: _ctx.radioSelectInputKey,\n        entries: _ctx.entries,\n        value: _ctx.value,\n        disabled: _ctx.isFieldDisabled,\n        onChange: _ctx.onSelectEntry\n      }, null, 8 /* PROPS */, [\"entries\", \"value\", \"disabled\", \"onChange\"]))\n    ]),\n    _createElementVNode(\"div\", _hoisted_3, [\n      _createElementVNode(\"div\", _hoisted_4, [\n        _createVNode(_component_ChevronLeftIcon, {\n          class: _normalizeClass([\n\t\t\t\t\t\t'inline-block h-4 w-6 px-1',\n\t\t\t\t\t\t_ctx.decrementValueAllowed ? 'cursor-pointer hover:opacity-80' : 'opacity-30',\n\t\t\t\t\t]),\n          onClick: _ctx.decrementValue\n        }, null, 8 /* PROPS */, [\"class\", \"onClick\"]),\n        _createVNode(_component_ChevronRightIcon, {\n          class: _normalizeClass([\n\t\t\t\t\t\t'inline-block h-4 w-6 px-1',\n\t\t\t\t\t\t_ctx.incrementValueAllowed ? 'cursor-pointer hover:opacity-80' : 'opacity-30',\n\t\t\t\t\t]),\n          onClick: _ctx.incrementValue\n        }, null, 8 /* PROPS */, [\"class\", \"onClick\"])\n      ])\n    ])\n  ]))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=template&id=13d1ac6b&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=style&index=0&id=13d1ac6b&lang=sass\"","import { render } from \"./Radio.vue?vue&type=template&id=13d1ac6b&ts=true\"\nimport script from \"./Radio.vue?vue&type=script&lang=ts\"\nexport * from \"./Radio.vue?vue&type=script&lang=ts\"\n\nimport \"./Radio.vue?vue&type=style&index=0&id=13d1ac6b&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Separator\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"horizontal-border\" }, null, -1 /* HOISTED */)\nconst _hoisted_3 = [\n  _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, _hoisted_3))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=template&id=563a32cc&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=style&index=0&id=563a32cc&lang=sass\"","import { render } from \"./Separator.vue?vue&type=template&id=563a32cc&ts=true\"\nimport script from \"./Separator.vue?vue&type=script&lang=ts\"\nexport * from \"./Separator.vue?vue&type=script&lang=ts\"\n\nimport \"./Separator.vue?vue&type=style&index=0&id=563a32cc&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"single_line_inputs_container\"\n}\nconst _hoisted_2 = { class: \"grid-x\" }\nconst _hoisted_3 = { class: \"cell auto\" }\nconst _hoisted_4 = [\"value\", \"disabled\"]\nconst _hoisted_5 = [\"value\"]\nconst _hoisted_6 = {\n  key: 0,\n  class: \"cell shrink h-full\"\n}\nconst _hoisted_7 = [\"id\"]\nconst _hoisted_8 = {\n  key: 1,\n  class: \"cell shrink h-full\"\n}\nconst _hoisted_9 = { class: \"button-group-displaySceneTreeButton h-full\" }\nconst _hoisted_10 = {\n  key: 2,\n  class: \"cell shrink\"\n}\nconst _hoisted_11 = { key: 1 }\nconst _hoisted_12 = {\n  key: 0,\n  class: \"monaco-label-container\"\n}\nconst _hoisted_13 = {\n  key: 2,\n  class: \"block\"\n}\nconst _hoisted_14 = [\"rows\", \"disabled\"]\nconst _hoisted_15 = [\"rows\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_MagnifyingGlassIcon = _resolveComponent(\"MagnifyingGlassIcon\")!\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n  const _component_MonacoEditorWrapper = _resolveComponent(\"MonacoEditorWrapper\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field String\", _ctx.class_object]),\n    onContextmenu: _cache[19] || (_cache[19] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    (_ctx.is_single_line && !_ctx.has_language)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n          _createElementVNode(\"div\", _hoisted_2, [\n            _createElementVNode(\"div\", _hoisted_3, [\n              _createElementVNode(\"input\", {\n                class: _normalizeClass([\"raw_input shadow appearance-none border border-black rounded w-full py-2 px-3 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-100 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\", _ctx.input_value_class_object]),\n                value: _ctx.raw_input,\n                onKeypress: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"])),\n                onKeyup: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"])),\n                onKeydown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n                onChange: _cache[3] || (_cache[3] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n                onBlur: _cache[4] || (_cache[4] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n                type: \"text\",\n                disabled: _ctx.isFieldDisabled\n              }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_4),\n              _createElementVNode(\"input\", {\n                class: \"expression_result shadow appearance-none border border-black rounded w-full py-2 px-3 bg-green-400 focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-800 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm h-8\",\n                value: _ctx.value,\n                readonly: \"\",\n                type: \"text\",\n                onKeypress: _cache[5] || (_cache[5] = _withModifiers(() => {}, [\"stop\"])),\n                onKeyup: _cache[6] || (_cache[6] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_keyup && _ctx.on_keyup(...args)), [\"stop\"])),\n                onKeydown: _cache[7] || (_cache[7] = _withModifiers(() => {}, [\"stop\"]))\n              }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_5)\n            ]),\n            (_ctx.displayBrowseButton)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n                  _createElementVNode(\"button\", {\n                    id: `browse-button-param-${_ctx.json_param.graph_node_id}`,\n                    class: \"ml-1 px-3 py-2 bg-orange-700 text-text-light hover:bg-orange-800 hover:text-white cursor-pointer rounded inline-flex\",\n                    onClick: _cache[8] || (_cache[8] = \n//@ts-ignore\n(...args) => (_ctx.browseFile && _ctx.browseFile(...args)))\n                  }, [\n                    _createVNode(_component_MagnifyingGlassIcon, {\n                      class: \"mr-2 h-4 w-4\",\n                      \"aria-hidden\": \"true\"\n                    }),\n                    _createTextVNode(\" Browse Files \")\n                  ], 8 /* PROPS */, _hoisted_7)\n                ]))\n              : _createCommentVNode(\"v-if\", true),\n            (_ctx.isObjectMask)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n                  _createElementVNode(\"div\", _hoisted_9, [\n                    _createElementVNode(\"div\", {\n                      class: \"cursor-pointer inline-flex items-center ml-1 px-3 py-2 text-sm font-medium rounded text-white border border-transparent bg-orange-400 hover:bg-orange-600\",\n                      onClick: _cache[9] || (_cache[9] = \n//@ts-ignore\n(...args) => (_ctx.displaySceneTree && _ctx.displaySceneTree(...args)))\n                    }, [\n                      _createVNode(_component_font_awesome_icon, { icon: \"fa-solid fa-align-left h-8 w-8\" })\n                    ])\n                  ])\n                ]))\n              : _createCommentVNode(\"v-if\", true),\n            (_ctx.displayDragAndDrop)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [\n                  _createElementVNode(\"div\", {\n                    class: _normalizeClass([\"button warning tiny drag_n_drop_zone\", _ctx.dropZoneClassObject]),\n                    onDrop: _cache[10] || (_cache[10] = \n//@ts-ignore\n(...args) => (_ctx.onDrop && _ctx.onDrop(...args))),\n                    onDragenter: _cache[11] || (_cache[11] = \n//@ts-ignore\n(...args) => (_ctx.onDragenter && _ctx.onDragenter(...args))),\n                    onDragleave: _cache[12] || (_cache[12] = \n//@ts-ignore\n(...args) => (_ctx.onDragleave && _ctx.onDragleave(...args))),\n                    onDragover: _cache[13] || (_cache[13] = \n//@ts-ignore\n(...args) => (_ctx.onDragover && _ctx.onDragover(...args)))\n                  }, \" Drag and Drop File \", 34 /* CLASS, HYDRATE_EVENTS */)\n                ]))\n              : _createCommentVNode(\"v-if\", true)\n          ])\n        ]))\n      : (_ctx.has_language)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [\n            (_ctx.display_label)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_12, _toDisplayString(_ctx.name) + \":\", 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createVNode(_component_MonacoEditorWrapper, {\n              json_param: _ctx.json_param,\n              onToggleFullScreen: _ctx.toggleFullScreen,\n              uniqueId: _ctx.monacoEditorUniqueId\n            }, null, 8 /* PROPS */, [\"json_param\", \"onToggleFullScreen\", \"uniqueId\"])\n          ]))\n        : (_ctx.is_multiline)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, [\n              _createElementVNode(\"textarea\", {\n                class: _normalizeClass([\"raw_input shadow appearance-none border border-black rounded w-full py-1 px-1 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-100 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm block\", _ctx.input_value_class_object]),\n                rows: _ctx.rows,\n                onKeypress: _cache[14] || (_cache[14] = _withModifiers(() => {}, [\"stop\"])),\n                onKeyup: _cache[15] || (_cache[15] = _withModifiers(() => {}, [\"stop\"])),\n                onKeydown: _cache[16] || (_cache[16] = _withModifiers(() => {}, [\"stop\"])),\n                onChange: _cache[17] || (_cache[17] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n                onBlur: _cache[18] || (_cache[18] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.on_update_value && _ctx.on_update_value(...args)), [\"stop\"])),\n                disabled: _ctx.isFieldDisabled\n              }, _toDisplayString(_ctx.raw_input), 43 /* TEXT, CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_14),\n              _createElementVNode(\"textarea\", {\n                class: \"expression_result shadow appearance-none border border-black rounded w-full py-1 px-1 bg-black focus:outline-none focus:ring-0 focus:border-blue-500 text-gray-100 leading-6 transition-colors duration-200 ease-in-out border-transparent number required text-sm block\",\n                rows: _ctx.rows,\n                readonly: \"\"\n              }, _toDisplayString(_ctx.value), 9 /* TEXT, PROPS */, _hoisted_15)\n            ]))\n          : _createCommentVNode(\"v-if\", true)\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=template&id=d39b9dee&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=style&index=0&id=d39b9dee&lang=sass\"","import { render } from \"./String.vue?vue&type=template&id=d39b9dee&ts=true\"\nimport script from \"./String.vue?vue&type=script&lang=ts\"\nexport * from \"./String.vue?vue&type=script&lang=ts\"\n\nimport \"./String.vue?vue&type=style&index=0&id=d39b9dee&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Multiple Vector grid-x\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_Numeric = _resolveComponent(\"Numeric\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.json_components, (json_component, i) => {\n      return (_openBlock(), _createElementBlock(\"div\", {\n        class: _normalizeClass([\"cell\", _ctx.cell_class_object]),\n        key: i\n      }, [\n        json_component\n          ? (_openBlock(), _createBlock(_component_Numeric, {\n              key: 0,\n              json_param: json_component,\n              displays_expression_result: _ctx.displays_expression_result,\n              class: _normalizeClass(_ctx.classObjects[i])\n            }, null, 8 /* PROPS */, [\"json_param\", \"displays_expression_result\", \"class\"]))\n          : _createCommentVNode(\"v-if\", true)\n      ], 2 /* CLASS */))\n    }), 128 /* KEYED_FRAGMENT */))\n  ]))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=template&id=0e6cbcf4&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=style&index=0&id=0e6cbcf4&lang=sass\"","import { render } from \"./Vector2.vue?vue&type=template&id=0e6cbcf4&ts=true\"\nimport script from \"./Vector2.vue?vue&type=script&lang=ts\"\nexport * from \"./Vector2.vue?vue&type=script&lang=ts\"\n\nimport \"./Vector2.vue?vue&type=style&index=0&id=0e6cbcf4&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Multiple Vector grid-x\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_Numeric = _resolveComponent(\"Numeric\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.json_components, (json_component, i) => {\n      return (_openBlock(), _createElementBlock(\"div\", {\n        class: _normalizeClass([\"cell\", _ctx.cell_class_object]),\n        key: i\n      }, [\n        json_component\n          ? (_openBlock(), _createBlock(_component_Numeric, {\n              key: 0,\n              json_param: json_component,\n              displays_expression_result: _ctx.displays_expression_result,\n              class: _normalizeClass(_ctx.classObjects[i])\n            }, null, 8 /* PROPS */, [\"json_param\", \"displays_expression_result\", \"class\"]))\n          : _createCommentVNode(\"v-if\", true)\n      ], 2 /* CLASS */))\n    }), 128 /* KEYED_FRAGMENT */))\n  ]))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=template&id=287da675&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=style&index=0&id=287da675&lang=sass\"","import { render } from \"./Vector3.vue?vue&type=template&id=287da675&ts=true\"\nimport script from \"./Vector3.vue?vue&type=script&lang=ts\"\nexport * from \"./Vector3.vue?vue&type=script&lang=ts\"\n\nimport \"./Vector3.vue?vue&type=style&index=0&id=287da675&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"Field Multiple Vector grid-x\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_Numeric = _resolveComponent(\"Numeric\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.json_components, (json_component, i) => {\n      return (_openBlock(), _createElementBlock(\"div\", {\n        class: _normalizeClass([\"cell\", _ctx.cell_class_object]),\n        key: i\n      }, [\n        json_component\n          ? (_openBlock(), _createBlock(_component_Numeric, {\n              key: 0,\n              json_param: json_component,\n              displays_expression_result: _ctx.displays_expression_result,\n              class: _normalizeClass(_ctx.classObjects[i])\n            }, null, 8 /* PROPS */, [\"json_param\", \"displays_expression_result\", \"class\"]))\n          : _createCommentVNode(\"v-if\", true)\n      ], 2 /* CLASS */))\n    }), 128 /* KEYED_FRAGMENT */))\n  ]))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=template&id=5164de14&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=style&index=0&id=5164de14&lang=sass\"","import { render } from \"./Vector4.vue?vue&type=template&id=5164de14&ts=true\"\nimport script from \"./Vector4.vue?vue&type=script&lang=ts\"\nexport * from \"./Vector4.vue?vue&type=script&lang=ts\"\n\nimport \"./Vector4.vue?vue&type=style&index=0&id=5164de14&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, withModifiers as _withModifiers, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid-x\" }\nconst _hoisted_2 = { class: \"cell auto\" }\nconst _hoisted_3 = { class: \"points_container bg-black text-white\" }\nconst _hoisted_4 = [\"cx\", \"cy\"]\nconst _hoisted_5 = [\"cx\", \"cy\", \"onMousedown\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"Field Ramp\", _ctx.class_object]),\n    onContextmenu: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.on_contextmenu && _ctx.on_contextmenu(...args)))\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"div\", _hoisted_3, [\n          (_openBlock(), _createElementBlock(\"svg\", {\n            ref: \"svg\",\n            class: _normalizeClass(_ctx.svgClassObject),\n            onClick: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.add_point && _ctx.add_point(...args)))\n          }, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.curve_points, (curve_point, i) => {\n              return (_openBlock(), _createElementBlock(\"circle\", {\n                class: _normalizeClass([\"interpolated_curve_point\", _ctx.interpolated_curve_class_object]),\n                cx: _ctx.curve_point_positions_percent[i],\n                cy: _ctx.curve_point_values_percent[i]\n              }, null, 10 /* CLASS, PROPS */, _hoisted_4))\n            }), 256 /* UNKEYED_FRAGMENT */)),\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.valueSerialized.points, (ramp_point, i) => {\n              return (_openBlock(), _createElementBlock(\"circle\", {\n                class: _normalizeClass([\"control_point\", _ctx.control_point_class_objects[i]]),\n                cx: _ctx.control_point_positions_percent[i],\n                cy: _ctx.control_point_values_percent[i],\n                onMousedown: _withModifiers(($event: any) => (_ctx.on_point_move_start($event, i)), [\"stop\"]),\n                onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n              }, null, 42 /* CLASS, PROPS, HYDRATE_EVENTS */, _hoisted_5))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ], 2 /* CLASS */))\n        ])\n      ])\n    ])\n  ], 34 /* CLASS, HYDRATE_EVENTS */))\n}","export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=template&id=085aa853&ts=true\"","export { default } from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../../node_modules/vue-style-loader/index.js!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=style&index=0&id=085aa853&lang=sass\"","import { render } from \"./Ramp.vue?vue&type=template&id=085aa853&ts=true\"\nimport script from \"./Ramp.vue?vue&type=script&lang=ts\"\nexport * from \"./Ramp.vue?vue&type=script&lang=ts\"\n\nimport \"./Ramp.vue?vue&type=style&index=0&id=085aa853&lang=sass\"\n\nimport exportComponent from \"../../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=style&index=0&id=a4559d7a&lang=sass\"","import { render } from \"./Param.vue?vue&type=template&id=a4559d7a&ts=true\"\nimport script from \"./Param.vue?vue&type=script&lang=ts\"\nexport * from \"./Param.vue?vue&type=script&lang=ts\"\n\nimport \"./Param.vue?vue&type=style&index=0&id=a4559d7a&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"ParamExtrasContainer grid-x w-full\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(), _createBlock(_resolveDynamicComponent(_ctx.componentType), { nodeId: _ctx.nodeId }, null, 8 /* PROPS */, [\"nodeId\"]))\n  ]))\n}","export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=template&id=1c08ebea&ts=true\"","export { default } from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../../node_modules/vue-style-loader/index.js!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=style&index=0&id=1c08ebea&lang=sass\"","import { render } from \"./Extras.vue?vue&type=template&id=1c08ebea&ts=true\"\nimport script from \"./Extras.vue?vue&type=script&lang=ts\"\nexport * from \"./Extras.vue?vue&type=script&lang=ts\"\n\nimport \"./Extras.vue?vue&type=style&index=0&id=1c08ebea&lang=sass\"\n\nimport exportComponent from \"../../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=style&index=0&id=5e2ef8c2&lang=sass\"","import { render } from \"./Params.vue?vue&type=template&id=5e2ef8c2&ts=true\"\nimport script from \"./Params.vue?vue&type=script&lang=ts\"\nexport * from \"./Params.vue?vue&type=script&lang=ts\"\n\nimport \"./Params.vue?vue&type=style&index=0&id=5e2ef8c2&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderSlot as _renderSlot, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, resolveComponent as _resolveComponent, createBlock as _createBlock, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = { class: \"\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_DropDownMenuEntryComponent = _resolveComponent(\"DropDownMenuEntryComponent\")!\n  const _component_DropDownMenu = _resolveComponent(\"DropDownMenu\", true)!\n  const _component_DropDownMenuModal = _resolveComponent(\"DropDownMenuModal\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"dropdown_menu disable-select\", [_ctx.topclass, _ctx.dropdown_menu_class_object, _ctx.level > 0 ? 'absolute top-0' : '']]),\n    onClick: _cache[2] || (_cache[2] = \n//@ts-ignore\n(...args) => (_ctx.toggle_display && _ctx.toggle_display(...args)))\n  }, [\n    _createElementVNode(\"div\", {\n      class: _normalizeClass([\"dropdown_menu_label_content_container\", _ctx.dropdown_menu_label_object]),\n      style: _normalizeStyle(_ctx.menu_label_style_object)\n    }, [\n      (_ctx.display_label)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 0,\n            class: \"dropdown_menu_label_content\",\n            onMouseenter: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.on_label_mouseenter && _ctx.on_label_mouseenter(...args)))\n          }, [\n            _renderSlot(_ctx.$slots, \"default\", {}, () => [\n              _createTextVNode(_toDisplayString(_ctx.label), 1 /* TEXT */)\n            ])\n          ], 32 /* HYDRATE_EVENTS */))\n        : _createCommentVNode(\"v-if\", true),\n      (!_ctx.isTouchOrMobile)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 1,\n            class: _normalizeClass([\"dropdown_menu_pixel\", _ctx.pixel_class_object])\n          }, [\n            _createElementVNode(\"div\", {\n              class: _normalizeClass([\"dropdown_menu_content\", [\n\t\t\t\t\t\t_ctx.content_class_object,\n\t\t\t\t\t\t'drop-shadow-xl shadow-zinc-800 bg-bg rounded-md border border-bg-medium',\n\t\t\t\t\t]]),\n              ref: \"dropdown_menu_content\",\n              style: _normalizeStyle(_ctx.content_style_object),\n              onMouseleave: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.unset_hovered_entry && _ctx.unset_hovered_entry(...args)))\n            }, [\n              _createElementVNode(\"ul\", _hoisted_1, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sorted_entries, (entry, i) => {\n                  return (_openBlock(), _createBlock(_component_DropDownMenuEntryComponent, {\n                    key: i,\n                    onMouseenter: ($event: any) => (_ctx.set_hovered_entry_index(i)),\n                    onSelect: ($event: any) => (_ctx.select(entry.id)),\n                    ref_for: true,\n                    ref: \"entry_element\",\n                    entry: entry,\n                    hovered: _ctx.hovered_entry_index == i,\n                    current: _ctx.entry_current_states[i]\n                  }, null, 8 /* PROPS */, [\"onMouseenter\", \"onSelect\", \"entry\", \"hovered\", \"current\"]))\n                }), 128 /* KEYED_FRAGMENT */))\n              ])\n            ], 38 /* CLASS, STYLE, HYDRATE_EVENTS */),\n            (_ctx.hovered_entry_has_children)\n              ? (_openBlock(), _createElementBlock(\"div\", {\n                  key: 0,\n                  class: \"sub-dropdown relative top-0 h-0\",\n                  style: _normalizeStyle(_ctx.sub_dropdown_style_object)\n                }, [\n                  (_openBlock(), _createBlock(_component_DropDownMenu, {\n                    init_position_top: _ctx.sub_dropdown_init_position_top,\n                    level: _ctx.level + 1,\n                    display_label: false,\n                    entries: _ctx.hovered_entry_children,\n                    event_id_prefix: _ctx.hovered_entry_id,\n                    always_visible: true,\n                    key: _ctx.hovered_entry_id,\n                    onSelect: _ctx.on_entry_select\n                  }, null, 8 /* PROPS */, [\"init_position_top\", \"level\", \"entries\", \"event_id_prefix\", \"onSelect\"]))\n                ], 4 /* STYLE */))\n              : _createCommentVNode(\"v-if\", true)\n          ], 2 /* CLASS */))\n        : _createCommentVNode(\"v-if\", true)\n    ], 6 /* CLASS, STYLE */),\n    ((_ctx.always_visible || _ctx.displayed) && _ctx.isTouchOrMobile)\n      ? (_openBlock(), _createBlock(_component_DropDownMenuModal, {\n          key: 0,\n          title: _ctx.label,\n          sorted_entries: _ctx.sorted_entries,\n          onClose: _ctx.close,\n          onSelect: _ctx.select\n        }, null, 8 /* PROPS */, [\"title\", \"sorted_entries\", \"onClose\", \"onSelect\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ], 2 /* CLASS */))\n}","export * from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=template&id=bca9e746&ts=true\"","export { default } from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../node_modules/vue-style-loader/index.js!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=style&index=0&id=bca9e746&lang=sass\"","import { render } from \"./DropDownMenu.vue?vue&type=template&id=bca9e746&ts=true\"\nimport script from \"./DropDownMenu.vue?vue&type=script&lang=ts\"\nexport * from \"./DropDownMenu.vue?vue&type=script&lang=ts\"\n\nimport \"./DropDownMenu.vue?vue&type=style&index=0&id=bca9e746&lang=sass\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"h-full m-2 lg:m-8 text-center border-4 border-gray-600 border-dashed rounded-lg p-4 flex items-center justify-center\" }\nconst _hoisted_2 = { class: \"text-center\" }\nconst _hoisted_3 = { class: \"mt-2 font-bold\" }\nconst _hoisted_4 = { class: \"mt-1 text-xs opacity-70\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_FaceFrownIcon = _resolveComponent(\"FaceFrownIcon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      (_ctx.displayEmoji)\n        ? (_openBlock(), _createBlock(_component_FaceFrownIcon, {\n            key: 0,\n            class: \"block w-12 mx-auto opacity-70\"\n          }))\n        : _createCommentVNode(\"v-if\", true),\n      _createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.title), 1 /* TEXT */),\n      _createElementVNode(\"p\", _hoisted_4, _toDisplayString(_ctx.subtitle), 1 /* TEXT */)\n    ]),\n    _createCommentVNode(\" <div class=\\\"mt-6\\\">\\n      <button type=\\\"button\\\" class=\\\"inline-flex items-center px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500\\\">\\n        <PlusIcon class=\\\"-ml-1 mr-2 h-5 w-5\\\" aria-hidden=\\\"true\\\" />\\n        New Project\\n      </button>\\n    </div> \")\n  ]))\n}","export * from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./EmptyState.vue?vue&type=template&id=862b18d2&ts=true\"","export { default } from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./EmptyState.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./EmptyState.vue?vue&type=script&lang=ts\"","import { render } from \"./EmptyState.vue?vue&type=template&id=862b18d2&ts=true\"\nimport script from \"./EmptyState.vue?vue&type=script&lang=ts\"\nexport * from \"./EmptyState.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createBlock as _createBlock, vShow as _vShow, withDirectives as _withDirectives } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid-x\" }\nconst _hoisted_2 = { class: \"cell shrink\" }\nconst _hoisted_3 = { class: \"cell auto\" }\nconst _hoisted_4 = { class: \"children\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_NodeTree = _resolveComponent(\"NodeTree\", true)!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"NodeTree disable-select bg-black text-text\", _ctx.class_object])\n  }, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"div\", {\n          class: \"expand_button w-4\",\n          onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.toggle_expanded && _ctx.toggle_expanded(...args))),\n          style: _normalizeStyle(_ctx.expand_button_class_object)\n        }, _toDisplayString(_ctx.expand_label), 5 /* TEXT, STYLE */)\n      ]),\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createElementVNode(\"div\", {\n          class: _normalizeClass([\n\t\t\t\t\t\t'node_name cursor-pointer hover:text-white hover:bg-bg-dark',\n\t\t\t\t\t\t_ctx.selected ? 'text-white bg-bg-dark' : '',\n\t\t\t\t\t]),\n          onClick: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.on_click && _ctx.on_click(...args)))\n        }, _toDisplayString(_ctx.node_name), 3 /* TEXT, CLASS */),\n        _withDirectives(_createElementVNode(\"div\", _hoisted_4, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.children, (child) => {\n            return (_openBlock(), _createBlock(_component_NodeTree, {\n              ref_for: true,\n              ref: \"childNodeTrees\",\n              graph_node_id: child.graphNodeId(),\n              node_context: _ctx.node_context,\n              selected_graph_node_id: _ctx.selected_graph_node_id,\n              key: child.graphNodeId(),\n              expandedIds: _ctx.expandedIds,\n              onSelect: _ctx.on_child_select\n            }, null, 8 /* PROPS */, [\"graph_node_id\", \"node_context\", \"selected_graph_node_id\", \"expandedIds\", \"onSelect\"]))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 512 /* NEED_PATCH */), [\n          [_vShow, _ctx.expanded]\n        ])\n      ])\n    ])\n  ], 2 /* CLASS */))\n}","export * from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=template&id=399e0528&ts=true\"","export { default } from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../node_modules/vue-style-loader/index.js!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=style&index=0&id=399e0528&lang=sass\"","import { render } from \"./NodeTree.vue?vue&type=template&id=399e0528&ts=true\"\nimport script from \"./NodeTree.vue?vue&type=script&lang=ts\"\nexport * from \"./NodeTree.vue?vue&type=script&lang=ts\"\n\nimport \"./NodeTree.vue?vue&type=style&index=0&id=399e0528&lang=sass\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"rounded-md bg-red-50 p-4\" }\nconst _hoisted_2 = { class: \"flex\" }\nconst _hoisted_3 = { class: \"flex-shrink-0\" }\nconst _hoisted_4 = { class: \"ml-3\" }\nconst _hoisted_5 = { class: \"text-sm font-bold text-red-800\" }\nconst _hoisted_6 = { class: \"mt-2 text-sm text-red-700\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_XCircleIcon = _resolveComponent(\"XCircleIcon\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createVNode(_component_XCircleIcon, {\n          class: \"h-5 w-5 text-red-400\",\n          \"aria-hidden\": \"true\"\n        })\n      ]),\n      _createElementVNode(\"div\", _hoisted_4, [\n        _createElementVNode(\"h3\", _hoisted_5, _toDisplayString(_ctx.title), 1 /* TEXT */),\n        _createElementVNode(\"div\", _hoisted_6, [\n          _createElementVNode(\"p\", null, _toDisplayString(_ctx.message), 1 /* TEXT */),\n          _renderSlot(_ctx.$slots, \"default\")\n        ])\n      ])\n    ])\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Error.vue?vue&type=template&id=760cc206&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Error.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Error.vue?vue&type=script&lang=ts\"","import { render } from \"./Error.vue?vue&type=template&id=760cc206&ts=true\"\nimport script from \"./Error.vue?vue&type=script&lang=ts\"\nexport * from \"./Error.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  return (_openBlock(), _createElementBlock(\"span\"))\n}","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ComboBoxHack.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ComboBoxHack.vue?vue&type=script&lang=ts\"","import { render } from \"./ComboBoxHack.vue?vue&type=template&id=13987e8b&ts=true\"\nimport script from \"./ComboBoxHack.vue?vue&type=script&lang=ts\"\nexport * from \"./ComboBoxHack.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, normalizeClass as _normalizeClass, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"fixed inset-0 bg-black bg-opacity-60 transition-opacity\" }, null, -1 /* HOISTED */)\nconst _hoisted_2 = { class: \"fixed z-10 inset-0 overflow-y-auto\" }\nconst _hoisted_3 = { class: \"block absolute top-0 right-0 pt-4 pr-4\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"sr-only\" }, \"Close\", -1 /* HOISTED */)\nconst _hoisted_5 = {\n  key: 0,\n  class: \"sm:flex sm:items-start\"\n}\nconst _hoisted_6 = { class: \"mt-3 text-left lg:text-center sm:mt-0 sm:ml-4\" }\nconst _hoisted_7 = {\n  key: 1,\n  class: \"flex-1\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_XMarkIcon = _resolveComponent(\"XMarkIcon\")!\n  const _component_DialogTitle = _resolveComponent(\"DialogTitle\")!\n  const _component_DialogPanel = _resolveComponent(\"DialogPanel\")!\n  const _component_Dialog = _resolveComponent(\"Dialog\")!\n\n  return (_openBlock(), _createBlock(_component_Dialog, {\n    open: _ctx.displayed,\n    as: \"div\",\n    class: \"relative Polygon-Modal-Container-Non-Resizable\",\n    onClose: _ctx.close\n  }, {\n    default: _withCtx(() => [\n      _hoisted_1,\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"div\", {\n          class: _normalizeClass([\n\t\t\t\t\t_ctx.fullHeight ? 'sm:items-stretch' : 'sm:items-center',\n\t\t\t\t\t'flex items-start justify-center min-h-full p-4 text-center sm:p-0',\n\t\t\t\t])\n        }, [\n          _createVNode(_component_DialogPanel, {\n            class: _normalizeClass([\n\t\t\t\t\t\t'relative bg-bg rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8  sm:w-full sm:p-6 flex flex-col',\n\t\t\t\t\t\t_ctx.large ? 'sm:max-w-4xl' : 'sm:max-w-lg',\n\t\t\t\t\t])\n          }, {\n            default: _withCtx(() => [\n              _createElementVNode(\"div\", _hoisted_3, [\n                _createElementVNode(\"button\", {\n                  type: \"button\",\n                  class: \"text-text hover:text-white cursor-pointer focus:outline-0\",\n                  onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.close && _ctx.close(...args)))\n                }, [\n                  _hoisted_4,\n                  _createVNode(_component_XMarkIcon, {\n                    class: \"h-4 w-4 lg:h-6 lg:w-6\",\n                    \"aria-hidden\": \"true\"\n                  })\n                ])\n              ]),\n              (_ctx.displayTitle)\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n                    _createElementVNode(\"div\", _hoisted_6, [\n                      _createVNode(_component_DialogTitle, {\n                        as: \"h3\",\n                        class: \"text-md lg:text-lg leading-6 font-medium text-gray-400 lg:text-white mb-4 lg:mb-0 border-b-2 border-gray-400 lg:border-b-0\"\n                      }, {\n                        default: _withCtx(() => [\n                          _createTextVNode(_toDisplayString(_ctx.title), 1 /* TEXT */)\n                        ]),\n                        _: 1 /* STABLE */\n                      })\n                    ])\n                  ]))\n                : _createCommentVNode(\"v-if\", true),\n              (_ctx.fullHeight)\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n                    _renderSlot(_ctx.$slots, \"default\")\n                  ]))\n                : _renderSlot(_ctx.$slots, \"default\", { key: 2 })\n            ]),\n            _: 3 /* FORWARDED */\n          }, 8 /* PROPS */, [\"class\"])\n        ], 2 /* CLASS */)\n      ])\n    ]),\n    _: 3 /* FORWARDED */\n  }, 8 /* PROPS */, [\"open\", \"onClose\"]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=template&id=be506a40&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=script&lang=ts\"","export * from \"-!../../../../../node_modules/vue-style-loader/index.js!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=style&index=0&id=be506a40&lang=sass\"","import { render } from \"./Modal.vue?vue&type=template&id=be506a40&ts=true\"\nimport script from \"./Modal.vue?vue&type=script&lang=ts\"\nexport * from \"./Modal.vue?vue&type=script&lang=ts\"\n\nimport \"./Modal.vue?vue&type=style&index=0&id=be506a40&lang=sass\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withModifiers as _withModifiers } from \"vue\"\n\nconst _hoisted_1 = { class: \"text-text\" }\nconst _hoisted_2 = { key: 0 }\nconst _hoisted_3 = { key: 1 }\nconst _hoisted_4 = { class: \"px-2 py-1\" }\nconst _hoisted_5 = {\n  key: 2,\n  class: \"children-arrow\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n\n  return (_openBlock(), _createElementBlock(\"li\", _hoisted_1, [\n    _createCommentVNode(\" default text color here as otherwise when on mobile it doesn't take it from the top editor element since it's a modal \"),\n    (_ctx.entry.separatorBefore)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 0,\n          class: _normalizeClass(['entry-separator bg-zinc-600 h-px mx-[10px] my-[5px]', _ctx.isTouchOrMobile ? 'my-[5px]' : 'my-[10px]'])\n        }, null, 2 /* CLASS */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", {\n      class: _normalizeClass([\"entry\", [\n\t\t\t\t_ctx.classObject,\n\t\t\t\t'px-[10px]',\n\t\t\t\t_ctx.isTouchOrMobile ? 'py-[10px]' : 'py-[5px]',\n\t\t\t\t_ctx.entry.disabled ? 'text-text-faded opacity-50' : _ctx.current ? 'bg-slate-700 text-text-light' : '',\n\t\t\t]]),\n      onClick: _cache[0] || (_cache[0] = _withModifiers(\n//@ts-ignore\n(...args) => (_ctx.select && _ctx.select(...args)), [\"stop\"]))\n    }, [\n      (_ctx.entry.emphasis)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.wordElements, (wordElement) => {\n              return (_openBlock(), _createElementBlock(\"span\", null, [\n                _createElementVNode(\"span\", {\n                  class: _normalizeClass([wordElement.emphasized ? 'emphasis font-bold border-b-2 border-white' : ''])\n                }, _toDisplayString(wordElement.word), 3 /* TEXT, CLASS */)\n              ]))\n            }), 256 /* UNKEYED_FRAGMENT */))\n          ]))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_3, [\n            _createElementVNode(\"span\", _hoisted_4, _toDisplayString(_ctx.label), 1 /* TEXT */)\n          ])),\n      (_ctx.entry.children)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, [\n            _createVNode(_component_font_awesome_icon, {\n              icon: \"fa-solid fa-chevron-right\",\n              class: \"w-2 h-4\"\n            })\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ], 2 /* CLASS */),\n    (_ctx.entry.separatorAfter)\n      ? (_openBlock(), _createElementBlock(\"div\", {\n          key: 1,\n          class: _normalizeClass(['entry-separator bg-zinc-600 h-px mx-[10px] my-[5px]', _ctx.isTouchOrMobile ? 'my-[5px]' : 'my-[10px]'])\n        }, null, 2 /* CLASS */))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenuEntry.vue?vue&type=template&id=af44e558&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenuEntry.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenuEntry.vue?vue&type=script&lang=ts\"","import { render } from \"./DropDownMenuEntry.vue?vue&type=template&id=af44e558&ts=true\"\nimport script from \"./DropDownMenuEntry.vue?vue&type=script&lang=ts\"\nexport * from \"./DropDownMenuEntry.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createBlock as _createBlock, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"max-h-[80vh] overflow-y-auto\" }\nconst _hoisted_2 = { class: \"mb-4 pt-4 border-b-2 border-gray-400 lg:border-b-0\" }\nconst _hoisted_3 = { class: \"inline text-md lg:text-lg leading-6 font-medium text-gray-400 lg:text-white lg:mb-0\" }\nconst _hoisted_4 = { class: \"w-100\" }\nconst _hoisted_5 = { class: \"\" }\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"div\", {\n  tabIndex: \"1\",\n  class: \"opacity-0\"\n}, null, -1 /* HOISTED */)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\")!\n  const _component_DropDownMenuEntryComponent = _resolveComponent(\"DropDownMenuEntryComponent\")!\n  const _component_Modal = _resolveComponent(\"Modal\")!\n\n  return (_openBlock(), _createBlock(_component_Modal, {\n    displayed: true,\n    onClose: _ctx.close,\n    size: {x: 520, y: 450},\n    resizable: false,\n    displayTitle: false\n  }, {\n    default: _withCtx(() => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createElementVNode(\"div\", _hoisted_2, [\n          (_ctx.displayBackButton)\n            ? (_openBlock(), _createElementBlock(\"span\", {\n                key: 0,\n                class: \"children-arrow\",\n                onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.goBack && _ctx.goBack(...args)))\n              }, [\n                _createVNode(_component_font_awesome_icon, {\n                  icon: \"fa-solid fa-chevron-left\",\n                  class: \"w-2 h-4 text-white pr-4\"\n                })\n              ]))\n            : _createCommentVNode(\"v-if\", true),\n          _createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.currentTitle), 1 /* TEXT */)\n        ]),\n        _createElementVNode(\"div\", _hoisted_4, [\n          _createElementVNode(\"ul\", _hoisted_5, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.currentEntries, (entry, i) => {\n              return (_openBlock(), _createBlock(_component_DropDownMenuEntryComponent, {\n                key: i,\n                onSelect: _ctx.select,\n                entry: entry\n              }, null, 8 /* PROPS */, [\"onSelect\", \"entry\"]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ]),\n          _hoisted_6\n        ])\n      ])\n    ]),\n    _: 1 /* STABLE */\n  }, 8 /* PROPS */, [\"onClose\"]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenuModal.vue?vue&type=template&id=25383d63&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenuModal.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenuModal.vue?vue&type=script&lang=ts\"","import { render } from \"./DropDownMenuModal.vue?vue&type=template&id=25383d63&ts=true\"\nimport script from \"./DropDownMenuModal.vue?vue&type=script&lang=ts\"\nexport * from \"./DropDownMenuModal.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createBlock as _createBlock, Transition as _Transition } from \"vue\"\n\nconst _hoisted_1 = { class: \"relative\" }\nconst _hoisted_2 = [\"id\"]\nconst _hoisted_3 = { class: \"absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none\" }\nconst _hoisted_4 = [\"onClick\"]\nconst _hoisted_5 = [\"id\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_ChevronUpDownIcon = _resolveComponent(\"ChevronUpDownIcon\")!\n  const _component_ListboxButton = _resolveComponent(\"ListboxButton\")!\n  const _component_CheckIcon = _resolveComponent(\"CheckIcon\")!\n  const _component_ListboxOption = _resolveComponent(\"ListboxOption\")!\n  const _component_ListboxOptions = _resolveComponent(\"ListboxOptions\")!\n  const _component_Listbox = _resolveComponent(\"Listbox\")!\n\n  return (_openBlock(), _createBlock(_component_Listbox, {\n    as: \"div\",\n    class: _normalizeClass([_ctx.disabled ? 'opacity-50' : 'opacity-100'])\n  }, {\n    default: _withCtx(() => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createVNode(_component_ListboxButton, { class: \"block w-full pl-2 pr-2 border-gray-300 focus:outline-none focus:ring-0 rounded leading-4 text-sm h-8 text-left bg-black text-text-light\" }, {\n          default: _withCtx(() => [\n            _createElementVNode(\"span\", {\n              id: _ctx.idPrefix + '-label',\n              class: \"block truncate\"\n            }, _toDisplayString(_ctx.displayedLabel), 9 /* TEXT, PROPS */, _hoisted_2),\n            _createElementVNode(\"span\", _hoisted_3, [\n              _createVNode(_component_ChevronUpDownIcon, {\n                class: \"h-5 w-5 text-gray-400\",\n                \"aria-hidden\": \"true\"\n              })\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }),\n        _createVNode(_Transition, {\n          \"leave-active-class\": \"transition ease-in duration-100\",\n          \"leave-from-class\": \"opacity-100\",\n          \"leave-to-class\": \"opacity-0\"\n        }, {\n          default: _withCtx(() => [\n            (!_ctx.disabled)\n              ? (_openBlock(), _createBlock(_component_ListboxOptions, {\n                  key: 0,\n                  class: \"absolute z-10 ml-0 mt-1 w-full border-2 border-sky-200 drop-shadow-2xl max-h-60 rounded py-1 text-base ring-1 ring-black ring-opacity-5 overflow-auto focus:outline-none sm:text-sm bg-black\"\n                }, {\n                  default: _withCtx(() => [\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.entries, (entry, i) => {\n                      return (_openBlock(), _createBlock(_component_ListboxOption, {\n                        as: \"template\",\n                        key: i,\n                        value: entry.value\n                      }, {\n                        default: _withCtx(({active, selected}) => [\n                          _createElementVNode(\"li\", {\n                            class: _normalizeClass([\n\t\t\t\t\t\t\t\tactive ? 'text-white bg-bg-medium' : '',\n\t\t\t\t\t\t\t\t'select-none relative py-2 pl-3 pr-9 cursor-pointer',\n\t\t\t\t\t\t\t]),\n                            onClick: ($event: any) => (_ctx.selectEntry($event, entry))\n                          }, [\n                            _createElementVNode(\"span\", {\n                              id: `${_ctx.idPrefix}-${entry.value}`,\n                              class: _normalizeClass([selected ? 'font-semibold' : 'font-normal', 'block whitespace-nowrap'])\n                            }, _toDisplayString(entry.name), 11 /* TEXT, CLASS, PROPS */, _hoisted_5),\n                            selected\n                              ? (_openBlock(), _createElementBlock(\"span\", {\n                                  key: 0,\n                                  class: _normalizeClass([\n\t\t\t\t\t\t\t\t\tactive ? 'text-white' : 'text-indigo-600',\n\t\t\t\t\t\t\t\t\t'absolute inset-y-0 right-0 flex items-center pr-4',\n\t\t\t\t\t\t\t\t])\n                                }, [\n                                  _createVNode(_component_CheckIcon, {\n                                    class: \"h-5 w-5\",\n                                    \"aria-hidden\": \"true\"\n                                  })\n                                ], 2 /* CLASS */))\n                              : _createCommentVNode(\"v-if\", true)\n                          ], 10 /* CLASS, PROPS */, _hoisted_4)\n                        ]),\n                        _: 2 /* DYNAMIC */\n                      }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"value\"]))\n                    }), 128 /* KEYED_FRAGMENT */))\n                  ]),\n                  _: 1 /* STABLE */\n                }))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        })\n      ])\n    ]),\n    _: 1 /* STABLE */\n  }, 8 /* PROPS */, [\"class\"]))\n}","export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SelectInput.vue?vue&type=template&id=4b174a7e&ts=true\"","export { default } from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SelectInput.vue?vue&type=script&lang=ts\"; export * from \"-!../../../../../node_modules/esbuild-loader/dist/index.cjs??clonedRuleSet-2.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SelectInput.vue?vue&type=script&lang=ts\"","import { render } from \"./SelectInput.vue?vue&type=template&id=4b174a7e&ts=true\"\nimport script from \"./SelectInput.vue?vue&type=script&lang=ts\"\nexport * from \"./SelectInput.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=style&index=0&id=5956e24c&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"7f637986\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=style&index=0&id=5956e24c&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./LinkIndexDropdown.vue?vue&type=style&index=0&id=5956e24c&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=style&index=0&id=8a617f46&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"465d78ba\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=style&index=0&id=8a617f46&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Navigation.vue?vue&type=style&index=0&id=8a617f46&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=style&index=0&id=24e23714&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"0962b9ca\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=style&index=0&id=24e23714&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NavigationPathElement.vue?vue&type=style&index=0&id=24e23714&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=style&index=0&id=9394139c&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"b398b07c\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=style&index=0&id=9394139c&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Custom.vue?vue&type=style&index=0&id=9394139c&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=style&index=0&id=4878295c&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"55d22448\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=style&index=0&id=4878295c&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Multiple.vue?vue&type=style&index=0&id=4878295c&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=style&index=0&id=426ccc10&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"05519176\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=style&index=0&id=426ccc10&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NetworkCore.vue?vue&type=style&index=0&id=426ccc10&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=style&index=0&id=9554779c&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4319226e\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=style&index=0&id=9554779c&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Connection.vue?vue&type=style&index=0&id=9554779c&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=style&index=0&id=66f67dbc&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"0fe09165\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=style&index=0&id=66f67dbc&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromDest.vue?vue&type=style&index=0&id=66f67dbc&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=style&index=0&id=a15c0e14&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"54ee3843\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=style&index=0&id=a15c0e14&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./InterractiveConnectionFromSrc.vue?vue&type=style&index=0&id=a15c0e14&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=style&index=0&id=9c087fe0&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"34f025ef\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=style&index=0&id=9c087fe0&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Node.vue?vue&type=style&index=0&id=9c087fe0&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeComment.vue?vue&type=style&index=0&id=14e0d5f3&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"fe87ee0e\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeComment.vue?vue&type=style&index=0&id=14e0d5f3&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeComment.vue?vue&type=style&index=0&id=14e0d5f3&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=style&index=0&id=accab5ec&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"0100cb5e\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=style&index=0&id=accab5ec&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeError.vue?vue&type=style&index=0&id=accab5ec&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=style&index=0&id=69803565&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"295f690a\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=style&index=0&id=69803565&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeInfo.vue?vue&type=style&index=0&id=69803565&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=style&index=0&id=a8f62f94&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"37ff5bae\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=style&index=0&id=a8f62f94&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ParamLabelResult.vue?vue&type=style&index=0&id=a8f62f94&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=style&index=0&id=06fa5f68&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"10055256\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=style&index=0&id=06fa5f68&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Anim.vue?vue&type=style&index=0&id=06fa5f68&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=style&index=0&id=e4e085c2&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"30812e3c\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=style&index=0&id=e4e085c2&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Cop.vue?vue&type=style&index=0&id=e4e085c2&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=style&index=0&id=7ae9c476&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"6ae32350\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=style&index=0&id=7ae9c476&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Gl.vue?vue&type=style&index=0&id=7ae9c476&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=style&index=0&id=8baf624c&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"a66b0280\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=style&index=0&id=8baf624c&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Mat.vue?vue&type=style&index=0&id=8baf624c&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ObjThreejsCamera.vue?vue&type=style&index=0&id=4576b05e&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"aac9ed80\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ObjThreejsCamera.vue?vue&type=style&index=0&id=4576b05e&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./ObjThreejsCamera.vue?vue&type=style&index=0&id=4576b05e&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=style&index=0&id=6ef1a367&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"94a39156\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=style&index=0&id=6ef1a367&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Sop.vue?vue&type=style&index=0&id=6ef1a367&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=style&index=0&id=2e23de42&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3a28d2d5\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=style&index=0&id=2e23de42&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopCache.vue?vue&type=style&index=0&id=2e23de42&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=style&index=0&id=d7b6c3ca&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"808742a6\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=style&index=0&id=d7b6c3ca&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopParticlesSystemGPU.vue?vue&type=style&index=0&id=d7b6c3ca&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopPostProcessNetwork.vue?vue&type=style&index=0&id=1afbfc86&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"7976c68e\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopPostProcessNetwork.vue?vue&type=style&index=0&id=1afbfc86&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./SopPostProcessNetwork.vue?vue&type=style&index=0&id=1afbfc86&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=style&index=0&id=705f0260&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4856a61c\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=style&index=0&id=705f0260&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenu.vue?vue&type=style&index=0&id=705f0260&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=style&index=0&id=6dce7fd4&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3d9cec76\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=style&index=0&id=6dce7fd4&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./TabMenuCombobox.vue?vue&type=style&index=0&id=6dce7fd4&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=style&index=0&id=5e2ef8c2&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"68aa2234\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=style&index=0&id=5e2ef8c2&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Params.vue?vue&type=style&index=0&id=5e2ef8c2&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=style&index=0&id=1c08ebea&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"0418c3d8\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=style&index=0&id=1c08ebea&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Extras.vue?vue&type=style&index=0&id=1c08ebea&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=style&index=0&id=a4559d7a&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"050dcbcd\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=style&index=0&id=a4559d7a&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Param.vue?vue&type=style&index=0&id=a4559d7a&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=style&index=0&id=46e50090&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"8ccc6328\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=style&index=0&id=46e50090&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Boolean.vue?vue&type=style&index=0&id=46e50090&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=style&index=0&id=676427ac&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"1a114a47\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=style&index=0&id=676427ac&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Button.vue?vue&type=style&index=0&id=676427ac&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=style&index=0&id=878a24ee&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"9f8f2d66\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=style&index=0&id=878a24ee&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Color.vue?vue&type=style&index=0&id=878a24ee&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=style&index=0&id=3e751d81&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"41145d42\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=style&index=0&id=3e751d81&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Float.vue?vue&type=style&index=0&id=3e751d81&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=style&index=0&id=623edac2&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"768fcf6b\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=style&index=0&id=623edac2&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Folder.vue?vue&type=style&index=0&id=623edac2&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=style&index=0&id=1ed861e0&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"a9c4e71e\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=style&index=0&id=1ed861e0&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Integer.vue?vue&type=style&index=0&id=1ed861e0&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=style&index=0&id=13d1ac6b&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"f070af00\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=style&index=0&id=13d1ac6b&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Radio.vue?vue&type=style&index=0&id=13d1ac6b&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=style&index=0&id=085aa853&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"52e96cb8\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=style&index=0&id=085aa853&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Ramp.vue?vue&type=style&index=0&id=085aa853&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=style&index=0&id=563a32cc&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"434f969e\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=style&index=0&id=563a32cc&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Separator.vue?vue&type=style&index=0&id=563a32cc&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=style&index=0&id=d39b9dee&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"9456c9f0\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=style&index=0&id=d39b9dee&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./String.vue?vue&type=style&index=0&id=d39b9dee&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=style&index=0&id=0e6cbcf4&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"8fa01098\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=style&index=0&id=0e6cbcf4&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector2.vue?vue&type=style&index=0&id=0e6cbcf4&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=style&index=0&id=287da675&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"1af1ef89\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=style&index=0&id=287da675&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector3.vue?vue&type=style&index=0&id=287da675&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=style&index=0&id=5164de14&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"6eb357fe\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=style&index=0&id=5164de14&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Vector4.vue?vue&type=style&index=0&id=5164de14&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=style&index=0&id=2578fa84&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"24873bee\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=style&index=0&id=2578fa84&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Viewer.vue?vue&type=style&index=0&id=2578fa84&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=style&index=0&id=bca9e746&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"371c8c12\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=style&index=0&id=bca9e746&lang=sass\", function() {\n     var newContent = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./DropDownMenu.vue?vue&type=style&index=0&id=bca9e746&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=style&index=0&id=399e0528&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"122782e2\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=style&index=0&id=399e0528&lang=sass\", function() {\n     var newContent = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./NodeTree.vue?vue&type=style&index=0&id=399e0528&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=style&index=0&id=be506a40&lang=sass\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"176be12a\", content, false, {});\n// Hot Module Replacement\nif(module.hot) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=style&index=0&id=be506a40&lang=sass\", function() {\n     var newContent = require(\"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-7.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[1].rules[14].use[0]!./Modal.vue?vue&type=style&index=0&id=be506a40&lang=sass\");\n     if(newContent.__esModule) newContent = newContent.default;\n     if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}","/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nexport default function listToStyles (parentId, list) {\n  var styles = []\n  var newStyles = {}\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i]\n    var id = item[0]\n    var css = item[1]\n    var media = item[2]\n    var sourceMap = item[3]\n    var part = {\n      id: parentId + ':' + i,\n      css: css,\n      media: media,\n      sourceMap: sourceMap\n    }\n    if (!newStyles[id]) {\n      styles.push(newStyles[id] = { id: id, parts: [part] })\n    } else {\n      newStyles[id].parts.push(part)\n    }\n  }\n  return styles\n}\n","/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n  Modified by Evan You @yyx990803\n*/\n\nimport listToStyles from './listToStyles'\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n  if (!hasDocument) {\n    throw new Error(\n    'vue-style-loader cannot be used in a non-browser environment. ' +\n    \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n  ) }\n}\n\n/*\ntype StyleObject = {\n  id: number;\n  parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n  css: string;\n  media: string;\n  sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n  [id: number]: {\n    id: number,\n    refs: number,\n    parts: Array<(obj?: StyleObjectPart) => void>\n  }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nexport default function addStylesClient (parentId, list, _isProduction, _options) {\n  isProduction = _isProduction\n\n  options = _options || {}\n\n  var styles = listToStyles(parentId, list)\n  addStylesToDom(styles)\n\n  return function update (newList) {\n    var mayRemove = []\n    for (var i = 0; i < styles.length; i++) {\n      var item = styles[i]\n      var domStyle = stylesInDom[item.id]\n      domStyle.refs--\n      mayRemove.push(domStyle)\n    }\n    if (newList) {\n      styles = listToStyles(parentId, newList)\n      addStylesToDom(styles)\n    } else {\n      styles = []\n    }\n    for (var i = 0; i < mayRemove.length; i++) {\n      var domStyle = mayRemove[i]\n      if (domStyle.refs === 0) {\n        for (var j = 0; j < domStyle.parts.length; j++) {\n          domStyle.parts[j]()\n        }\n        delete stylesInDom[domStyle.id]\n      }\n    }\n  }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n  for (var i = 0; i < styles.length; i++) {\n    var item = styles[i]\n    var domStyle = stylesInDom[item.id]\n    if (domStyle) {\n      domStyle.refs++\n      for (var j = 0; j < domStyle.parts.length; j++) {\n        domStyle.parts[j](item.parts[j])\n      }\n      for (; j < item.parts.length; j++) {\n        domStyle.parts.push(addStyle(item.parts[j]))\n      }\n      if (domStyle.parts.length > item.parts.length) {\n        domStyle.parts.length = item.parts.length\n      }\n    } else {\n      var parts = []\n      for (var j = 0; j < item.parts.length; j++) {\n        parts.push(addStyle(item.parts[j]))\n      }\n      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n    }\n  }\n}\n\nfunction createStyleElement () {\n  var styleElement = document.createElement('style')\n  styleElement.type = 'text/css'\n  head.appendChild(styleElement)\n  return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n  var update, remove\n  var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n  if (styleElement) {\n    if (isProduction) {\n      // has SSR styles and in production mode.\n      // simply do nothing.\n      return noop\n    } else {\n      // has SSR styles but in dev mode.\n      // for some reason Chrome can't handle source map in server-rendered\n      // style tags - source maps in <style> only works if the style tag is\n      // created and inserted dynamically. So we remove the server rendered\n      // styles and inject new ones.\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  if (isOldIE) {\n    // use singleton mode for IE9.\n    var styleIndex = singletonCounter++\n    styleElement = singletonElement || (singletonElement = createStyleElement())\n    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n  } else {\n    // use multi-style-tag mode in all other cases\n    styleElement = createStyleElement()\n    update = applyToTag.bind(null, styleElement)\n    remove = function () {\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  update(obj)\n\n  return function updateStyle (newObj /* StyleObjectPart */) {\n    if (newObj) {\n      if (newObj.css === obj.css &&\n          newObj.media === obj.media &&\n          newObj.sourceMap === obj.sourceMap) {\n        return\n      }\n      update(obj = newObj)\n    } else {\n      remove()\n    }\n  }\n}\n\nvar replaceText = (function () {\n  var textStore = []\n\n  return function (index, replacement) {\n    textStore[index] = replacement\n    return textStore.filter(Boolean).join('\\n')\n  }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n  var css = remove ? '' : obj.css\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = replaceText(index, css)\n  } else {\n    var cssNode = document.createTextNode(css)\n    var childNodes = styleElement.childNodes\n    if (childNodes[index]) styleElement.removeChild(childNodes[index])\n    if (childNodes.length) {\n      styleElement.insertBefore(cssNode, childNodes[index])\n    } else {\n      styleElement.appendChild(cssNode)\n    }\n  }\n}\n\nfunction applyToTag (styleElement, obj) {\n  var css = obj.css\n  var media = obj.media\n  var sourceMap = obj.sourceMap\n\n  if (media) {\n    styleElement.setAttribute('media', media)\n  }\n  if (options.ssrId) {\n    styleElement.setAttribute(ssrIdKey, obj.id)\n  }\n\n  if (sourceMap) {\n    // https://developer.chrome.com/devtools/docs/javascript-debugging\n    // this makes source maps inside style tags work properly in Chrome\n    css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n    // http://stackoverflow.com/a/26603875\n    css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n  }\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = css\n  } else {\n    while (styleElement.firstChild) {\n      styleElement.removeChild(styleElement.firstChild)\n    }\n    styleElement.appendChild(document.createTextNode(css))\n  }\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar compilerDom = require('@vue/compiler-dom');\nvar runtimeDom = require('@vue/runtime-dom');\nvar shared = require('@vue/shared');\n\nfunction _interopNamespaceDefault(e) {\n  var n = Object.create(null);\n  if (e) {\n    for (var k in e) {\n      n[k] = e[k];\n    }\n  }\n  n.default = e;\n  return Object.freeze(n);\n}\n\nvar runtimeDom__namespace = /*#__PURE__*/_interopNamespaceDefault(runtimeDom);\n\nconst compileCache = /* @__PURE__ */ Object.create(null);\nfunction compileToFunction(template, options) {\n  if (!shared.isString(template)) {\n    if (template.nodeType) {\n      template = template.innerHTML;\n    } else {\n      return shared.NOOP;\n    }\n  }\n  const key = template;\n  const cached = compileCache[key];\n  if (cached) {\n    return cached;\n  }\n  if (template[0] === \"#\") {\n    const el = document.querySelector(template);\n    template = el ? el.innerHTML : ``;\n  }\n  const opts = shared.extend(\n    {\n      hoistStatic: true,\n      onError: void 0,\n      onWarn: shared.NOOP\n    },\n    options\n  );\n  if (!opts.isCustomElement && typeof customElements !== \"undefined\") {\n    opts.isCustomElement = (tag) => !!customElements.get(tag);\n  }\n  const { code } = compilerDom.compile(template, opts);\n  const render = new Function(\"Vue\", code)(runtimeDom__namespace);\n  render._rc = true;\n  return compileCache[key] = render;\n}\nruntimeDom.registerRuntimeCompiler(compileToFunction);\n\nexports.compile = compileToFunction;\nObject.keys(runtimeDom).forEach(function (k) {\n  if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = runtimeDom[k];\n});\n","'use strict'\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./dist/vue.cjs.prod.js')\n} else {\n  module.exports = require('./dist/vue.cjs.js')\n}\n","import { extend, isArray, isMap, isIntegerKey, hasOwn, isSymbol, isObject, hasChanged, makeMap, capitalize, toRawType, def, isFunction, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n  console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n  constructor(detached = false) {\n    this.detached = detached;\n    /**\n     * @internal\n     */\n    this._active = true;\n    /**\n     * @internal\n     */\n    this.effects = [];\n    /**\n     * @internal\n     */\n    this.cleanups = [];\n    this.parent = activeEffectScope;\n    if (!detached && activeEffectScope) {\n      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n        this\n      ) - 1;\n    }\n  }\n  get active() {\n    return this._active;\n  }\n  run(fn) {\n    if (this._active) {\n      const currentEffectScope = activeEffectScope;\n      try {\n        activeEffectScope = this;\n        return fn();\n      } finally {\n        activeEffectScope = currentEffectScope;\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`cannot run an inactive effect scope.`);\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  on() {\n    activeEffectScope = this;\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  off() {\n    activeEffectScope = this.parent;\n  }\n  stop(fromParent) {\n    if (this._active) {\n      let i, l;\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].stop();\n      }\n      for (i = 0, l = this.cleanups.length; i < l; i++) {\n        this.cleanups[i]();\n      }\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].stop(true);\n        }\n      }\n      if (!this.detached && this.parent && !fromParent) {\n        const last = this.parent.scopes.pop();\n        if (last && last !== this) {\n          this.parent.scopes[this.index] = last;\n          last.index = this.index;\n        }\n      }\n      this.parent = void 0;\n      this._active = false;\n    }\n  }\n}\nfunction effectScope(detached) {\n  return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n  if (scope && scope.active) {\n    scope.effects.push(effect);\n  }\n}\nfunction getCurrentScope() {\n  return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n  if (activeEffectScope) {\n    activeEffectScope.cleanups.push(fn);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(\n      `onScopeDispose() is called when there is no active effect scope to be associated with.`\n    );\n  }\n}\n\nconst createDep = (effects) => {\n  const dep = new Set(effects);\n  dep.w = 0;\n  dep.n = 0;\n  return dep;\n};\nconst wasTracked = (dep) => (dep.w & trackOpBit) > 0;\nconst newTracked = (dep) => (dep.n & trackOpBit) > 0;\nconst initDepMarkers = ({ deps }) => {\n  if (deps.length) {\n    for (let i = 0; i < deps.length; i++) {\n      deps[i].w |= trackOpBit;\n    }\n  }\n};\nconst finalizeDepMarkers = (effect) => {\n  const { deps } = effect;\n  if (deps.length) {\n    let ptr = 0;\n    for (let i = 0; i < deps.length; i++) {\n      const dep = deps[i];\n      if (wasTracked(dep) && !newTracked(dep)) {\n        dep.delete(effect);\n      } else {\n        deps[ptr++] = dep;\n      }\n      dep.w &= ~trackOpBit;\n      dep.n &= ~trackOpBit;\n    }\n    deps.length = ptr;\n  }\n};\n\nconst targetMap = /* @__PURE__ */ new WeakMap();\nlet effectTrackDepth = 0;\nlet trackOpBit = 1;\nconst maxMarkerBits = 30;\nlet activeEffect;\nconst ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"iterate\" : \"\");\nconst MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"Map key iterate\" : \"\");\nclass ReactiveEffect {\n  constructor(fn, scheduler = null, scope) {\n    this.fn = fn;\n    this.scheduler = scheduler;\n    this.active = true;\n    this.deps = [];\n    this.parent = void 0;\n    recordEffectScope(this, scope);\n  }\n  run() {\n    if (!this.active) {\n      return this.fn();\n    }\n    let parent = activeEffect;\n    let lastShouldTrack = shouldTrack;\n    while (parent) {\n      if (parent === this) {\n        return;\n      }\n      parent = parent.parent;\n    }\n    try {\n      this.parent = activeEffect;\n      activeEffect = this;\n      shouldTrack = true;\n      trackOpBit = 1 << ++effectTrackDepth;\n      if (effectTrackDepth <= maxMarkerBits) {\n        initDepMarkers(this);\n      } else {\n        cleanupEffect(this);\n      }\n      return this.fn();\n    } finally {\n      if (effectTrackDepth <= maxMarkerBits) {\n        finalizeDepMarkers(this);\n      }\n      trackOpBit = 1 << --effectTrackDepth;\n      activeEffect = this.parent;\n      shouldTrack = lastShouldTrack;\n      this.parent = void 0;\n      if (this.deferStop) {\n        this.stop();\n      }\n    }\n  }\n  stop() {\n    if (activeEffect === this) {\n      this.deferStop = true;\n    } else if (this.active) {\n      cleanupEffect(this);\n      if (this.onStop) {\n        this.onStop();\n      }\n      this.active = false;\n    }\n  }\n}\nfunction cleanupEffect(effect2) {\n  const { deps } = effect2;\n  if (deps.length) {\n    for (let i = 0; i < deps.length; i++) {\n      deps[i].delete(effect2);\n    }\n    deps.length = 0;\n  }\n}\nfunction effect(fn, options) {\n  if (fn.effect) {\n    fn = fn.effect.fn;\n  }\n  const _effect = new ReactiveEffect(fn);\n  if (options) {\n    extend(_effect, options);\n    if (options.scope)\n      recordEffectScope(_effect, options.scope);\n  }\n  if (!options || !options.lazy) {\n    _effect.run();\n  }\n  const runner = _effect.run.bind(_effect);\n  runner.effect = _effect;\n  return runner;\n}\nfunction stop(runner) {\n  runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction track(target, type, key) {\n  if (shouldTrack && activeEffect) {\n    let depsMap = targetMap.get(target);\n    if (!depsMap) {\n      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n    }\n    let dep = depsMap.get(key);\n    if (!dep) {\n      depsMap.set(key, dep = createDep());\n    }\n    const eventInfo = !!(process.env.NODE_ENV !== \"production\") ? { effect: activeEffect, target, type, key } : void 0;\n    trackEffects(dep, eventInfo);\n  }\n}\nfunction trackEffects(dep, debuggerEventExtraInfo) {\n  let shouldTrack2 = false;\n  if (effectTrackDepth <= maxMarkerBits) {\n    if (!newTracked(dep)) {\n      dep.n |= trackOpBit;\n      shouldTrack2 = !wasTracked(dep);\n    }\n  } else {\n    shouldTrack2 = !dep.has(activeEffect);\n  }\n  if (shouldTrack2) {\n    dep.add(activeEffect);\n    activeEffect.deps.push(dep);\n    if (!!(process.env.NODE_ENV !== \"production\") && activeEffect.onTrack) {\n      activeEffect.onTrack(\n        extend(\n          {\n            effect: activeEffect\n          },\n          debuggerEventExtraInfo\n        )\n      );\n    }\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    return;\n  }\n  let deps = [];\n  if (type === \"clear\") {\n    deps = [...depsMap.values()];\n  } else if (key === \"length\" && isArray(target)) {\n    const newLength = Number(newValue);\n    depsMap.forEach((dep, key2) => {\n      if (key2 === \"length\" || key2 >= newLength) {\n        deps.push(dep);\n      }\n    });\n  } else {\n    if (key !== void 0) {\n      deps.push(depsMap.get(key));\n    }\n    switch (type) {\n      case \"add\":\n        if (!isArray(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        } else if (isIntegerKey(key)) {\n          deps.push(depsMap.get(\"length\"));\n        }\n        break;\n      case \"delete\":\n        if (!isArray(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        }\n        break;\n      case \"set\":\n        if (isMap(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n        }\n        break;\n    }\n  }\n  const eventInfo = !!(process.env.NODE_ENV !== \"production\") ? { target, type, key, newValue, oldValue, oldTarget } : void 0;\n  if (deps.length === 1) {\n    if (deps[0]) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        triggerEffects(deps[0], eventInfo);\n      } else {\n        triggerEffects(deps[0]);\n      }\n    }\n  } else {\n    const effects = [];\n    for (const dep of deps) {\n      if (dep) {\n        effects.push(...dep);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      triggerEffects(createDep(effects), eventInfo);\n    } else {\n      triggerEffects(createDep(effects));\n    }\n  }\n}\nfunction triggerEffects(dep, debuggerEventExtraInfo) {\n  const effects = isArray(dep) ? dep : [...dep];\n  for (const effect2 of effects) {\n    if (effect2.computed) {\n      triggerEffect(effect2, debuggerEventExtraInfo);\n    }\n  }\n  for (const effect2 of effects) {\n    if (!effect2.computed) {\n      triggerEffect(effect2, debuggerEventExtraInfo);\n    }\n  }\n}\nfunction triggerEffect(effect2, debuggerEventExtraInfo) {\n  if (effect2 !== activeEffect || effect2.allowRecurse) {\n    if (!!(process.env.NODE_ENV !== \"production\") && effect2.onTrigger) {\n      effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));\n    }\n    if (effect2.scheduler) {\n      effect2.scheduler();\n    } else {\n      effect2.run();\n    }\n  }\n}\nfunction getDepFromReactive(object, key) {\n  var _a;\n  return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nconst get$1 = /* @__PURE__ */ createGetter();\nconst shallowGet = /* @__PURE__ */ createGetter(false, true);\nconst readonlyGet = /* @__PURE__ */ createGetter(true);\nconst shallowReadonlyGet = /* @__PURE__ */ createGetter(true, true);\nconst arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n  const instrumentations = {};\n  [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      const arr = toRaw(this);\n      for (let i = 0, l = this.length; i < l; i++) {\n        track(arr, \"get\", i + \"\");\n      }\n      const res = arr[key](...args);\n      if (res === -1 || res === false) {\n        return arr[key](...args.map(toRaw));\n      } else {\n        return res;\n      }\n    };\n  });\n  [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      pauseTracking();\n      const res = toRaw(this)[key].apply(this, args);\n      resetTracking();\n      return res;\n    };\n  });\n  return instrumentations;\n}\nfunction hasOwnProperty(key) {\n  const obj = toRaw(this);\n  track(obj, \"has\", key);\n  return obj.hasOwnProperty(key);\n}\nfunction createGetter(isReadonly2 = false, shallow = false) {\n  return function get2(target, key, receiver) {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_isShallow\") {\n      return shallow;\n    } else if (key === \"__v_raw\" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {\n      return target;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly2) {\n      if (targetIsArray && hasOwn(arrayInstrumentations, key)) {\n        return Reflect.get(arrayInstrumentations, key, receiver);\n      }\n      if (key === \"hasOwnProperty\") {\n        return hasOwnProperty;\n      }\n    }\n    const res = Reflect.get(target, key, receiver);\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly2) {\n      track(target, \"get\", key);\n    }\n    if (shallow) {\n      return res;\n    }\n    if (isRef(res)) {\n      return targetIsArray && isIntegerKey(key) ? res : res.value;\n    }\n    if (isObject(res)) {\n      return isReadonly2 ? readonly(res) : reactive(res);\n    }\n    return res;\n  };\n}\nconst set$1 = /* @__PURE__ */ createSetter();\nconst shallowSet = /* @__PURE__ */ createSetter(true);\nfunction createSetter(shallow = false) {\n  return function set2(target, key, value, receiver) {\n    let oldValue = target[key];\n    if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {\n      return false;\n    }\n    if (!shallow) {\n      if (!isShallow(value) && !isReadonly(value)) {\n        oldValue = toRaw(oldValue);\n        value = toRaw(value);\n      }\n      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n        oldValue.value = value;\n        return true;\n      }\n    }\n    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(target, key, value, receiver);\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  };\n}\nfunction deleteProperty(target, key) {\n  const hadKey = hasOwn(target, key);\n  const oldValue = target[key];\n  const result = Reflect.deleteProperty(target, key);\n  if (result && hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction has$1(target, key) {\n  const result = Reflect.has(target, key);\n  if (!isSymbol(key) || !builtInSymbols.has(key)) {\n    track(target, \"has\", key);\n  }\n  return result;\n}\nfunction ownKeys(target) {\n  track(target, \"iterate\", isArray(target) ? \"length\" : ITERATE_KEY);\n  return Reflect.ownKeys(target);\n}\nconst mutableHandlers = {\n  get: get$1,\n  set: set$1,\n  deleteProperty,\n  has: has$1,\n  ownKeys\n};\nconst readonlyHandlers = {\n  get: readonlyGet,\n  set(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  },\n  deleteProperty(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n};\nconst shallowReactiveHandlers = /* @__PURE__ */ extend(\n  {},\n  mutableHandlers,\n  {\n    get: shallowGet,\n    set: shallowSet\n  }\n);\nconst shallowReadonlyHandlers = /* @__PURE__ */ extend(\n  {},\n  readonlyHandlers,\n  {\n    get: shallowReadonlyGet\n  }\n);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly = false, isShallow = false) {\n  target = target[\"__v_raw\"];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (!isReadonly) {\n    if (key !== rawKey) {\n      track(rawTarget, \"get\", key);\n    }\n    track(rawTarget, \"get\", rawKey);\n  }\n  const { has: has2 } = getProto(rawTarget);\n  const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n  if (has2.call(rawTarget, key)) {\n    return wrap(target.get(key));\n  } else if (has2.call(rawTarget, rawKey)) {\n    return wrap(target.get(rawKey));\n  } else if (target !== rawTarget) {\n    target.get(key);\n  }\n}\nfunction has(key, isReadonly = false) {\n  const target = this[\"__v_raw\"];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (!isReadonly) {\n    if (key !== rawKey) {\n      track(rawTarget, \"has\", key);\n    }\n    track(rawTarget, \"has\", rawKey);\n  }\n  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n  target = target[\"__v_raw\"];\n  !isReadonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n  return Reflect.get(target, \"size\", target);\n}\nfunction add(value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const proto = getProto(target);\n  const hadKey = proto.has.call(target, value);\n  if (!hadKey) {\n    target.add(value);\n    trigger(target, \"add\", value, value);\n  }\n  return this;\n}\nfunction set(key, value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const { has: has2, get: get2 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get2.call(target, key);\n  target.set(key, value);\n  if (!hadKey) {\n    trigger(target, \"add\", key, value);\n  } else if (hasChanged(value, oldValue)) {\n    trigger(target, \"set\", key, value, oldValue);\n  }\n  return this;\n}\nfunction deleteEntry(key) {\n  const target = toRaw(this);\n  const { has: has2, get: get2 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get2 ? get2.call(target, key) : void 0;\n  const result = target.delete(key);\n  if (hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction clear() {\n  const target = toRaw(this);\n  const hadItems = target.size !== 0;\n  const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n  const result = target.clear();\n  if (hadItems) {\n    trigger(target, \"clear\", void 0, void 0, oldTarget);\n  }\n  return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n  return function forEach(callback, thisArg) {\n    const observed = this;\n    const target = observed[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n    return target.forEach((value, key) => {\n      return callback.call(thisArg, wrap(value), wrap(key), observed);\n    });\n  };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n  return function(...args) {\n    const target = this[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(\n      rawTarget,\n      \"iterate\",\n      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n    );\n    return {\n      // iterator protocol\n      next() {\n        const { value, done } = innerIterator.next();\n        return done ? { value, done } : {\n          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n          done\n        };\n      },\n      // iterable protocol\n      [Symbol.iterator]() {\n        return this;\n      }\n    };\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      console.warn(\n        `${capitalize(type)} operation ${key}failed: target is readonly.`,\n        toRaw(this)\n      );\n    }\n    return type === \"delete\" ? false : this;\n  };\n}\nfunction createInstrumentations() {\n  const mutableInstrumentations2 = {\n    get(key) {\n      return get(this, key);\n    },\n    get size() {\n      return size(this);\n    },\n    has,\n    add,\n    set,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, false)\n  };\n  const shallowInstrumentations2 = {\n    get(key) {\n      return get(this, key, false, true);\n    },\n    get size() {\n      return size(this);\n    },\n    has,\n    add,\n    set,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, true)\n  };\n  const readonlyInstrumentations2 = {\n    get(key) {\n      return get(this, key, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has.call(this, key, true);\n    },\n    add: createReadonlyMethod(\"add\"),\n    set: createReadonlyMethod(\"set\"),\n    delete: createReadonlyMethod(\"delete\"),\n    clear: createReadonlyMethod(\"clear\"),\n    forEach: createForEach(true, false)\n  };\n  const shallowReadonlyInstrumentations2 = {\n    get(key) {\n      return get(this, key, true, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has.call(this, key, true);\n    },\n    add: createReadonlyMethod(\"add\"),\n    set: createReadonlyMethod(\"set\"),\n    delete: createReadonlyMethod(\"delete\"),\n    clear: createReadonlyMethod(\"clear\"),\n    forEach: createForEach(true, true)\n  };\n  const iteratorMethods = [\"keys\", \"values\", \"entries\", Symbol.iterator];\n  iteratorMethods.forEach((method) => {\n    mutableInstrumentations2[method] = createIterableMethod(\n      method,\n      false,\n      false\n    );\n    readonlyInstrumentations2[method] = createIterableMethod(\n      method,\n      true,\n      false\n    );\n    shallowInstrumentations2[method] = createIterableMethod(\n      method,\n      false,\n      true\n    );\n    shallowReadonlyInstrumentations2[method] = createIterableMethod(\n      method,\n      true,\n      true\n    );\n  });\n  return [\n    mutableInstrumentations2,\n    readonlyInstrumentations2,\n    shallowInstrumentations2,\n    shallowReadonlyInstrumentations2\n  ];\n}\nconst [\n  mutableInstrumentations,\n  readonlyInstrumentations,\n  shallowInstrumentations,\n  shallowReadonlyInstrumentations\n] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n  const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(\n      hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n      key,\n      receiver\n    );\n  };\n}\nconst mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has2, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has2.call(target, rawKey)) {\n    const type = toRawType(target);\n    console.warn(\n      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n    );\n  }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1 /* COMMON */;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2 /* COLLECTION */;\n    default:\n      return 0 /* INVALID */;\n  }\n}\nfunction getTargetType(value) {\n  return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n  if (isReadonly(target)) {\n    return target;\n  }\n  return createReactiveObject(\n    target,\n    false,\n    mutableHandlers,\n    mutableCollectionHandlers,\n    reactiveMap\n  );\n}\nfunction shallowReactive(target) {\n  return createReactiveObject(\n    target,\n    false,\n    shallowReactiveHandlers,\n    shallowCollectionHandlers,\n    shallowReactiveMap\n  );\n}\nfunction readonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    readonlyHandlers,\n    readonlyCollectionHandlers,\n    readonlyMap\n  );\n}\nfunction shallowReadonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    shallowReadonlyHandlers,\n    shallowReadonlyCollectionHandlers,\n    shallowReadonlyMap\n  );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      console.warn(`value cannot be made reactive: ${String(target)}`);\n    }\n    return target;\n  }\n  if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0 /* INVALID */) {\n    return target;\n  }\n  const proxy = new Proxy(\n    target,\n    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n  );\n  proxyMap.set(target, proxy);\n  return proxy;\n}\nfunction isReactive(value) {\n  if (isReadonly(value)) {\n    return isReactive(value[\"__v_raw\"]);\n  }\n  return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n  return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n  return isReactive(value) || isReadonly(value);\n}\nfunction toRaw(observed) {\n  const raw = observed && observed[\"__v_raw\"];\n  return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n  def(value, \"__v_skip\", true);\n  return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction trackRefValue(ref2) {\n  if (shouldTrack && activeEffect) {\n    ref2 = toRaw(ref2);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      trackEffects(ref2.dep || (ref2.dep = createDep()), {\n        target: ref2,\n        type: \"get\",\n        key: \"value\"\n      });\n    } else {\n      trackEffects(ref2.dep || (ref2.dep = createDep()));\n    }\n  }\n}\nfunction triggerRefValue(ref2, newVal) {\n  ref2 = toRaw(ref2);\n  const dep = ref2.dep;\n  if (dep) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      triggerEffects(dep, {\n        target: ref2,\n        type: \"set\",\n        key: \"value\",\n        newValue: newVal\n      });\n    } else {\n      triggerEffects(dep);\n    }\n  }\n}\nfunction isRef(r) {\n  return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n  return createRef(value, false);\n}\nfunction shallowRef(value) {\n  return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n  if (isRef(rawValue)) {\n    return rawValue;\n  }\n  return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n  constructor(value, __v_isShallow) {\n    this.__v_isShallow = __v_isShallow;\n    this.dep = void 0;\n    this.__v_isRef = true;\n    this._rawValue = __v_isShallow ? value : toRaw(value);\n    this._value = __v_isShallow ? value : toReactive(value);\n  }\n  get value() {\n    trackRefValue(this);\n    return this._value;\n  }\n  set value(newVal) {\n    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n    newVal = useDirectValue ? newVal : toRaw(newVal);\n    if (hasChanged(newVal, this._rawValue)) {\n      this._rawValue = newVal;\n      this._value = useDirectValue ? newVal : toReactive(newVal);\n      triggerRefValue(this, newVal);\n    }\n  }\n}\nfunction triggerRef(ref2) {\n  triggerRefValue(ref2, !!(process.env.NODE_ENV !== \"production\") ? ref2.value : void 0);\n}\nfunction unref(ref2) {\n  return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n  return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n  set: (target, key, value, receiver) => {\n    const oldValue = target[key];\n    if (isRef(oldValue) && !isRef(value)) {\n      oldValue.value = value;\n      return true;\n    } else {\n      return Reflect.set(target, key, value, receiver);\n    }\n  }\n};\nfunction proxyRefs(objectWithRefs) {\n  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n  constructor(factory) {\n    this.dep = void 0;\n    this.__v_isRef = true;\n    const { get, set } = factory(\n      () => trackRefValue(this),\n      () => triggerRefValue(this)\n    );\n    this._get = get;\n    this._set = set;\n  }\n  get value() {\n    return this._get();\n  }\n  set value(newVal) {\n    this._set(newVal);\n  }\n}\nfunction customRef(factory) {\n  return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n    console.warn(`toRefs() expects a reactive object but received a plain one.`);\n  }\n  const ret = isArray(object) ? new Array(object.length) : {};\n  for (const key in object) {\n    ret[key] = propertyToRef(object, key);\n  }\n  return ret;\n}\nclass ObjectRefImpl {\n  constructor(_object, _key, _defaultValue) {\n    this._object = _object;\n    this._key = _key;\n    this._defaultValue = _defaultValue;\n    this.__v_isRef = true;\n  }\n  get value() {\n    const val = this._object[this._key];\n    return val === void 0 ? this._defaultValue : val;\n  }\n  set value(newVal) {\n    this._object[this._key] = newVal;\n  }\n  get dep() {\n    return getDepFromReactive(toRaw(this._object), this._key);\n  }\n}\nclass GetterRefImpl {\n  constructor(_getter) {\n    this._getter = _getter;\n    this.__v_isRef = true;\n    this.__v_isReadonly = true;\n  }\n  get value() {\n    return this._getter();\n  }\n}\nfunction toRef(source, key, defaultValue) {\n  if (isRef(source)) {\n    return source;\n  } else if (isFunction(source)) {\n    return new GetterRefImpl(source);\n  } else if (isObject(source) && arguments.length > 1) {\n    return propertyToRef(source, key, defaultValue);\n  } else {\n    return ref(source);\n  }\n}\nfunction propertyToRef(source, key, defaultValue) {\n  const val = source[key];\n  return isRef(val) ? val : new ObjectRefImpl(\n    source,\n    key,\n    defaultValue\n  );\n}\n\nclass ComputedRefImpl {\n  constructor(getter, _setter, isReadonly, isSSR) {\n    this._setter = _setter;\n    this.dep = void 0;\n    this.__v_isRef = true;\n    this[\"__v_isReadonly\"] = false;\n    this._dirty = true;\n    this.effect = new ReactiveEffect(getter, () => {\n      if (!this._dirty) {\n        this._dirty = true;\n        triggerRefValue(this);\n      }\n    });\n    this.effect.computed = this;\n    this.effect.active = this._cacheable = !isSSR;\n    this[\"__v_isReadonly\"] = isReadonly;\n  }\n  get value() {\n    const self = toRaw(this);\n    trackRefValue(self);\n    if (self._dirty || !self._cacheable) {\n      self._dirty = false;\n      self._value = self.effect.run();\n    }\n    return self._value;\n  }\n  set value(newValue) {\n    this._setter(newValue);\n  }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n  let getter;\n  let setter;\n  const onlyGetter = isFunction(getterOrOptions);\n  if (onlyGetter) {\n    getter = getterOrOptions;\n    setter = !!(process.env.NODE_ENV !== \"production\") ? () => {\n      console.warn(\"Write operation failed: computed value is readonly\");\n    } : NOOP;\n  } else {\n    getter = getterOrOptions.get;\n    setter = getterOrOptions.set;\n  }\n  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n  if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n    cRef.effect.onTrack = debugOptions.onTrack;\n    cRef.effect.onTrigger = debugOptions.onTrigger;\n  }\n  return cRef;\n}\n\nconst tick = /* @__PURE__ */ Promise.resolve();\nconst queue = [];\nlet queued = false;\nconst scheduler = (fn) => {\n  queue.push(fn);\n  if (!queued) {\n    queued = true;\n    tick.then(flush);\n  }\n};\nconst flush = () => {\n  for (let i = 0; i < queue.length; i++) {\n    queue[i]();\n  }\n  queue.length = 0;\n  queued = false;\n};\nclass DeferredComputedRefImpl {\n  constructor(getter) {\n    this.dep = void 0;\n    this._dirty = true;\n    this.__v_isRef = true;\n    this[\"__v_isReadonly\"] = true;\n    let compareTarget;\n    let hasCompareTarget = false;\n    let scheduled = false;\n    this.effect = new ReactiveEffect(getter, (computedTrigger) => {\n      if (this.dep) {\n        if (computedTrigger) {\n          compareTarget = this._value;\n          hasCompareTarget = true;\n        } else if (!scheduled) {\n          const valueToCompare = hasCompareTarget ? compareTarget : this._value;\n          scheduled = true;\n          hasCompareTarget = false;\n          scheduler(() => {\n            if (this.effect.active && this._get() !== valueToCompare) {\n              triggerRefValue(this);\n            }\n            scheduled = false;\n          });\n        }\n        for (const e of this.dep) {\n          if (e.computed instanceof DeferredComputedRefImpl) {\n            e.scheduler(\n              true\n              /* computedTrigger */\n            );\n          }\n        }\n      }\n      this._dirty = true;\n    });\n    this.effect.computed = this;\n  }\n  _get() {\n    if (this._dirty) {\n      this._dirty = false;\n      return this._value = this.effect.run();\n    }\n    return this._value;\n  }\n  get value() {\n    trackRefValue(this);\n    return toRaw(this)._get();\n  }\n}\nfunction deferredComputed(getter) {\n  return new DeferredComputedRefImpl(getter);\n}\n\nexport { EffectScope, ITERATE_KEY, ReactiveEffect, computed, customRef, deferredComputed, effect, effectScope, enableTracking, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, pauseTracking, proxyRefs, reactive, readonly, ref, resetTracking, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, track, trigger, triggerRef, unref };\n","import { pauseTracking, resetTracking, isRef, toRaw, getCurrentScope, isShallow as isShallow$1, isReactive, ReactiveEffect, ref, shallowReadonly, track, reactive, shallowReactive, trigger, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1, isReadonly } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, customRef, effect, effectScope, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, isPromise, isArray, NOOP, getGlobalThis, extend, EMPTY_OBJ, toHandlerKey, looseToNumber, hyphenate, camelize, isObject, isOn, hasOwn, isModelListener, toNumber, hasChanged, remove, isSet, isMap, isPlainObject, isBuiltInDirective, invokeArrayFns, isRegExp, capitalize, isGloballyWhitelisted, NO, def, isReservedProp, EMPTY_ARR, toRawType, makeMap, normalizeClass, normalizeStyle } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n  stack.push(vnode);\n}\nfunction popWarningContext() {\n  stack.pop();\n}\nfunction warn(msg, ...args) {\n  if (!!!(process.env.NODE_ENV !== \"production\"))\n    return;\n  pauseTracking();\n  const instance = stack.length ? stack[stack.length - 1].component : null;\n  const appWarnHandler = instance && instance.appContext.config.warnHandler;\n  const trace = getComponentTrace();\n  if (appWarnHandler) {\n    callWithErrorHandling(\n      appWarnHandler,\n      instance,\n      11,\n      [\n        msg + args.join(\"\"),\n        instance && instance.proxy,\n        trace.map(\n          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n        ).join(\"\\n\"),\n        trace\n      ]\n    );\n  } else {\n    const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n    if (trace.length && // avoid spamming console during tests\n    true) {\n      warnArgs.push(`\n`, ...formatTrace(trace));\n    }\n    console.warn(...warnArgs);\n  }\n  resetTracking();\n}\nfunction getComponentTrace() {\n  let currentVNode = stack[stack.length - 1];\n  if (!currentVNode) {\n    return [];\n  }\n  const normalizedStack = [];\n  while (currentVNode) {\n    const last = normalizedStack[0];\n    if (last && last.vnode === currentVNode) {\n      last.recurseCount++;\n    } else {\n      normalizedStack.push({\n        vnode: currentVNode,\n        recurseCount: 0\n      });\n    }\n    const parentInstance = currentVNode.component && currentVNode.component.parent;\n    currentVNode = parentInstance && parentInstance.vnode;\n  }\n  return normalizedStack;\n}\nfunction formatTrace(trace) {\n  const logs = [];\n  trace.forEach((entry, i) => {\n    logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n  });\n  return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n  const isRoot = vnode.component ? vnode.component.parent == null : false;\n  const open = ` at <${formatComponentName(\n    vnode.component,\n    vnode.type,\n    isRoot\n  )}`;\n  const close = `>` + postfix;\n  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n  const res = [];\n  const keys = Object.keys(props);\n  keys.slice(0, 3).forEach((key) => {\n    res.push(...formatProp(key, props[key]));\n  });\n  if (keys.length > 3) {\n    res.push(` ...`);\n  }\n  return res;\n}\nfunction formatProp(key, value, raw) {\n  if (isString(value)) {\n    value = JSON.stringify(value);\n    return raw ? value : [`${key}=${value}`];\n  } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n    return raw ? value : [`${key}=${value}`];\n  } else if (isRef(value)) {\n    value = formatProp(key, toRaw(value.value), true);\n    return raw ? value : [`${key}=Ref<`, value, `>`];\n  } else if (isFunction(value)) {\n    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n  } else {\n    value = toRaw(value);\n    return raw ? value : [`${key}=`, value];\n  }\n}\nfunction assertNumber(val, type) {\n  if (!!!(process.env.NODE_ENV !== \"production\"))\n    return;\n  if (val === void 0) {\n    return;\n  } else if (typeof val !== \"number\") {\n    warn(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n  } else if (isNaN(val)) {\n    warn(`${type} is NaN - the duration expression might be incorrect.`);\n  }\n}\n\nconst ErrorTypeStrings = {\n  [\"sp\"]: \"serverPrefetch hook\",\n  [\"bc\"]: \"beforeCreate hook\",\n  [\"c\"]: \"created hook\",\n  [\"bm\"]: \"beforeMount hook\",\n  [\"m\"]: \"mounted hook\",\n  [\"bu\"]: \"beforeUpdate hook\",\n  [\"u\"]: \"updated\",\n  [\"bum\"]: \"beforeUnmount hook\",\n  [\"um\"]: \"unmounted hook\",\n  [\"a\"]: \"activated hook\",\n  [\"da\"]: \"deactivated hook\",\n  [\"ec\"]: \"errorCaptured hook\",\n  [\"rtc\"]: \"renderTracked hook\",\n  [\"rtg\"]: \"renderTriggered hook\",\n  [0]: \"setup function\",\n  [1]: \"render function\",\n  [2]: \"watcher getter\",\n  [3]: \"watcher callback\",\n  [4]: \"watcher cleanup function\",\n  [5]: \"native event handler\",\n  [6]: \"component event handler\",\n  [7]: \"vnode hook\",\n  [8]: \"directive hook\",\n  [9]: \"transition hook\",\n  [10]: \"app errorHandler\",\n  [11]: \"app warnHandler\",\n  [12]: \"ref function\",\n  [13]: \"async component loader\",\n  [14]: \"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n  let res;\n  try {\n    res = args ? fn(...args) : fn();\n  } catch (err) {\n    handleError(err, instance, type);\n  }\n  return res;\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n  if (isFunction(fn)) {\n    const res = callWithErrorHandling(fn, instance, type, args);\n    if (res && isPromise(res)) {\n      res.catch((err) => {\n        handleError(err, instance, type);\n      });\n    }\n    return res;\n  }\n  const values = [];\n  for (let i = 0; i < fn.length; i++) {\n    values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n  }\n  return values;\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n  const contextVNode = instance ? instance.vnode : null;\n  if (instance) {\n    let cur = instance.parent;\n    const exposedInstance = instance.proxy;\n    const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings[type] : type;\n    while (cur) {\n      const errorCapturedHooks = cur.ec;\n      if (errorCapturedHooks) {\n        for (let i = 0; i < errorCapturedHooks.length; i++) {\n          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n            return;\n          }\n        }\n      }\n      cur = cur.parent;\n    }\n    const appErrorHandler = instance.appContext.config.errorHandler;\n    if (appErrorHandler) {\n      callWithErrorHandling(\n        appErrorHandler,\n        null,\n        10,\n        [err, exposedInstance, errorInfo]\n      );\n      return;\n    }\n  }\n  logError(err, type, contextVNode, throwInDev);\n}\nfunction logError(err, type, contextVNode, throwInDev = true) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const info = ErrorTypeStrings[type];\n    if (contextVNode) {\n      pushWarningContext(contextVNode);\n    }\n    warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n    if (contextVNode) {\n      popWarningContext();\n    }\n    if (throwInDev) {\n      throw err;\n    } else {\n      console.error(err);\n    }\n  } else {\n    console.error(err);\n  }\n}\n\nlet isFlushing = false;\nlet isFlushPending = false;\nconst queue = [];\nlet flushIndex = 0;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n  const p = currentFlushPromise || resolvedPromise;\n  return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n  let start = flushIndex + 1;\n  let end = queue.length;\n  while (start < end) {\n    const middle = start + end >>> 1;\n    const middleJobId = getId(queue[middle]);\n    middleJobId < id ? start = middle + 1 : end = middle;\n  }\n  return start;\n}\nfunction queueJob(job) {\n  if (!queue.length || !queue.includes(\n    job,\n    isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex\n  )) {\n    if (job.id == null) {\n      queue.push(job);\n    } else {\n      queue.splice(findInsertionIndex(job.id), 0, job);\n    }\n    queueFlush();\n  }\n}\nfunction queueFlush() {\n  if (!isFlushing && !isFlushPending) {\n    isFlushPending = true;\n    currentFlushPromise = resolvedPromise.then(flushJobs);\n  }\n}\nfunction invalidateJob(job) {\n  const i = queue.indexOf(job);\n  if (i > flushIndex) {\n    queue.splice(i, 1);\n  }\n}\nfunction queuePostFlushCb(cb) {\n  if (!isArray(cb)) {\n    if (!activePostFlushCbs || !activePostFlushCbs.includes(\n      cb,\n      cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex\n    )) {\n      pendingPostFlushCbs.push(cb);\n    }\n  } else {\n    pendingPostFlushCbs.push(...cb);\n  }\n  queueFlush();\n}\nfunction flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  for (; i < queue.length; i++) {\n    const cb = queue[i];\n    if (cb && cb.pre) {\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      queue.splice(i, 1);\n      i--;\n      cb();\n    }\n  }\n}\nfunction flushPostFlushCbs(seen) {\n  if (pendingPostFlushCbs.length) {\n    const deduped = [...new Set(pendingPostFlushCbs)];\n    pendingPostFlushCbs.length = 0;\n    if (activePostFlushCbs) {\n      activePostFlushCbs.push(...deduped);\n      return;\n    }\n    activePostFlushCbs = deduped;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      seen = seen || /* @__PURE__ */ new Map();\n    }\n    activePostFlushCbs.sort((a, b) => getId(a) - getId(b));\n    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {\n        continue;\n      }\n      activePostFlushCbs[postFlushIndex]();\n    }\n    activePostFlushCbs = null;\n    postFlushIndex = 0;\n  }\n}\nconst getId = (job) => job.id == null ? Infinity : job.id;\nconst comparator = (a, b) => {\n  const diff = getId(a) - getId(b);\n  if (diff === 0) {\n    if (a.pre && !b.pre)\n      return -1;\n    if (b.pre && !a.pre)\n      return 1;\n  }\n  return diff;\n};\nfunction flushJobs(seen) {\n  isFlushPending = false;\n  isFlushing = true;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  queue.sort(comparator);\n  const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n  try {\n    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job && job.active !== false) {\n        if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n          continue;\n        }\n        callWithErrorHandling(job, null, 14);\n      }\n    }\n  } finally {\n    flushIndex = 0;\n    queue.length = 0;\n    flushPostFlushCbs(seen);\n    isFlushing = false;\n    currentFlushPromise = null;\n    if (queue.length || pendingPostFlushCbs.length) {\n      flushJobs(seen);\n    }\n  }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n  if (!seen.has(fn)) {\n    seen.set(fn, 1);\n  } else {\n    const count = seen.get(fn);\n    if (count > RECURSION_LIMIT) {\n      const instance = fn.ownerInstance;\n      const componentName = instance && getComponentName(instance.type);\n      warn(\n        `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`\n      );\n      return true;\n    } else {\n      seen.set(fn, count + 1);\n    }\n  }\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Set();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  getGlobalThis().__VUE_HMR_RUNTIME__ = {\n    createRecord: tryWrap(createRecord),\n    rerender: tryWrap(rerender),\n    reload: tryWrap(reload)\n  };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n  const id = instance.type.__hmrId;\n  let record = map.get(id);\n  if (!record) {\n    createRecord(id, instance.type);\n    record = map.get(id);\n  }\n  record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n  map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n  if (map.has(id)) {\n    return false;\n  }\n  map.set(id, {\n    initialDef: normalizeClassComponent(initialDef),\n    instances: /* @__PURE__ */ new Set()\n  });\n  return true;\n}\nfunction normalizeClassComponent(component) {\n  return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n  const record = map.get(id);\n  if (!record) {\n    return;\n  }\n  record.initialDef.render = newRender;\n  [...record.instances].forEach((instance) => {\n    if (newRender) {\n      instance.render = newRender;\n      normalizeClassComponent(instance.type).render = newRender;\n    }\n    instance.renderCache = [];\n    isHmrUpdating = true;\n    instance.update();\n    isHmrUpdating = false;\n  });\n}\nfunction reload(id, newComp) {\n  const record = map.get(id);\n  if (!record)\n    return;\n  newComp = normalizeClassComponent(newComp);\n  updateComponentDef(record.initialDef, newComp);\n  const instances = [...record.instances];\n  for (const instance of instances) {\n    const oldComp = normalizeClassComponent(instance.type);\n    if (!hmrDirtyComponents.has(oldComp)) {\n      if (oldComp !== record.initialDef) {\n        updateComponentDef(oldComp, newComp);\n      }\n      hmrDirtyComponents.add(oldComp);\n    }\n    instance.appContext.propsCache.delete(instance.type);\n    instance.appContext.emitsCache.delete(instance.type);\n    instance.appContext.optionsCache.delete(instance.type);\n    if (instance.ceReload) {\n      hmrDirtyComponents.add(oldComp);\n      instance.ceReload(newComp.styles);\n      hmrDirtyComponents.delete(oldComp);\n    } else if (instance.parent) {\n      queueJob(instance.parent.update);\n    } else if (instance.appContext.reload) {\n      instance.appContext.reload();\n    } else if (typeof window !== \"undefined\") {\n      window.location.reload();\n    } else {\n      console.warn(\n        \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n      );\n    }\n  }\n  queuePostFlushCb(() => {\n    for (const instance of instances) {\n      hmrDirtyComponents.delete(\n        normalizeClassComponent(instance.type)\n      );\n    }\n  });\n}\nfunction updateComponentDef(oldComp, newComp) {\n  extend(oldComp, newComp);\n  for (const key in oldComp) {\n    if (key !== \"__file\" && !(key in newComp)) {\n      delete oldComp[key];\n    }\n  }\n}\nfunction tryWrap(fn) {\n  return (id, arg) => {\n    try {\n      return fn(id, arg);\n    } catch (e) {\n      console.error(e);\n      console.warn(\n        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n      );\n    }\n  };\n}\n\nlet devtools;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n  if (devtools) {\n    devtools.emit(event, ...args);\n  } else if (!devtoolsNotInstalled) {\n    buffer.push({ event, args });\n  }\n}\nfunction setDevtoolsHook(hook, target) {\n  var _a, _b;\n  devtools = hook;\n  if (devtools) {\n    devtools.enabled = true;\n    buffer.forEach(({ event, args }) => devtools.emit(event, ...args));\n    buffer = [];\n  } else if (\n    // handle late devtools injection - only do this if we are in an actual\n    // browser environment to avoid the timer handle stalling test runner exit\n    // (#4815)\n    typeof window !== \"undefined\" && // some envs mock window but not fully\n    window.HTMLElement && // also exclude jsdom\n    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n  ) {\n    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n    replay.push((newHook) => {\n      setDevtoolsHook(newHook, target);\n    });\n    setTimeout(() => {\n      if (!devtools) {\n        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n        devtoolsNotInstalled = true;\n        buffer = [];\n      }\n    }, 3e3);\n  } else {\n    devtoolsNotInstalled = true;\n    buffer = [];\n  }\n}\nfunction devtoolsInitApp(app, version) {\n  emit$1(\"app:init\" /* APP_INIT */, app, version, {\n    Fragment,\n    Text,\n    Comment,\n    Static\n  });\n}\nfunction devtoolsUnmountApp(app) {\n  emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:added\" /* COMPONENT_ADDED */\n);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n  if (devtools && typeof devtools.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n  !devtools.cleanupBuffer(component)) {\n    _devtoolsComponentRemoved(component);\n  }\n};\nfunction createDevtoolsComponentHook(hook) {\n  return (component) => {\n    emit$1(\n      hook,\n      component.appContext.app,\n      component.uid,\n      component.parent ? component.parent.uid : void 0,\n      component\n    );\n  };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\n  \"perf:start\" /* PERFORMANCE_START */\n);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\n  \"perf:end\" /* PERFORMANCE_END */\n);\nfunction createDevtoolsPerformanceHook(hook) {\n  return (component, type, time) => {\n    emit$1(hook, component.appContext.app, component.uid, component, type, time);\n  };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n  emit$1(\n    \"component:emit\" /* COMPONENT_EMIT */,\n    component.appContext.app,\n    component,\n    event,\n    params\n  );\n}\n\nfunction emit(instance, event, ...rawArgs) {\n  if (instance.isUnmounted)\n    return;\n  const props = instance.vnode.props || EMPTY_OBJ;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const {\n      emitsOptions,\n      propsOptions: [propsOptions]\n    } = instance;\n    if (emitsOptions) {\n      if (!(event in emitsOptions) && true) {\n        if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {\n          warn(\n            `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(event)}\" prop.`\n          );\n        }\n      } else {\n        const validator = emitsOptions[event];\n        if (isFunction(validator)) {\n          const isValid = validator(...rawArgs);\n          if (!isValid) {\n            warn(\n              `Invalid event arguments: event validation failed for event \"${event}\".`\n            );\n          }\n        }\n      }\n    }\n  }\n  let args = rawArgs;\n  const isModelListener = event.startsWith(\"update:\");\n  const modelArg = isModelListener && event.slice(7);\n  if (modelArg && modelArg in props) {\n    const modifiersKey = `${modelArg === \"modelValue\" ? \"model\" : modelArg}Modifiers`;\n    const { number, trim } = props[modifiersKey] || EMPTY_OBJ;\n    if (trim) {\n      args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n    }\n    if (number) {\n      args = rawArgs.map(looseToNumber);\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsComponentEmit(instance, event, args);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const lowerCaseEvent = event.toLowerCase();\n    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n      warn(\n        `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n          instance,\n          instance.type\n        )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(event)}\" instead of \"${event}\".`\n      );\n    }\n  }\n  let handlerName;\n  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n  props[handlerName = toHandlerKey(camelize(event))];\n  if (!handler && isModelListener) {\n    handler = props[handlerName = toHandlerKey(hyphenate(event))];\n  }\n  if (handler) {\n    callWithAsyncErrorHandling(\n      handler,\n      instance,\n      6,\n      args\n    );\n  }\n  const onceHandler = props[handlerName + `Once`];\n  if (onceHandler) {\n    if (!instance.emitted) {\n      instance.emitted = {};\n    } else if (instance.emitted[handlerName]) {\n      return;\n    }\n    instance.emitted[handlerName] = true;\n    callWithAsyncErrorHandling(\n      onceHandler,\n      instance,\n      6,\n      args\n    );\n  }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n  const cache = appContext.emitsCache;\n  const cached = cache.get(comp);\n  if (cached !== void 0) {\n    return cached;\n  }\n  const raw = comp.emits;\n  let normalized = {};\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendEmits = (raw2) => {\n      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n      if (normalizedFromExtend) {\n        hasExtends = true;\n        extend(normalized, normalizedFromExtend);\n      }\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendEmits);\n    }\n    if (comp.extends) {\n      extendEmits(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendEmits);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, null);\n    }\n    return null;\n  }\n  if (isArray(raw)) {\n    raw.forEach((key) => normalized[key] = null);\n  } else {\n    extend(normalized, raw);\n  }\n  if (isObject(comp)) {\n    cache.set(comp, normalized);\n  }\n  return normalized;\n}\nfunction isEmitListener(options, key) {\n  if (!options || !isOn(key)) {\n    return false;\n  }\n  key = key.slice(2).replace(/Once$/, \"\");\n  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n  const prev = currentRenderingInstance;\n  currentRenderingInstance = instance;\n  currentScopeId = instance && instance.type.__scopeId || null;\n  return prev;\n}\nfunction pushScopeId(id) {\n  currentScopeId = id;\n}\nfunction popScopeId() {\n  currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n  if (!ctx)\n    return fn;\n  if (fn._n) {\n    return fn;\n  }\n  const renderFnWithContext = (...args) => {\n    if (renderFnWithContext._d) {\n      setBlockTracking(-1);\n    }\n    const prevInstance = setCurrentRenderingInstance(ctx);\n    let res;\n    try {\n      res = fn(...args);\n    } finally {\n      setCurrentRenderingInstance(prevInstance);\n      if (renderFnWithContext._d) {\n        setBlockTracking(1);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentUpdated(ctx);\n    }\n    return res;\n  };\n  renderFnWithContext._n = true;\n  renderFnWithContext._c = true;\n  renderFnWithContext._d = true;\n  return renderFnWithContext;\n}\n\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n  accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n  const {\n    type: Component,\n    vnode,\n    proxy,\n    withProxy,\n    props,\n    propsOptions: [propsOptions],\n    slots,\n    attrs,\n    emit,\n    render,\n    renderCache,\n    data,\n    setupState,\n    ctx,\n    inheritAttrs\n  } = instance;\n  let result;\n  let fallthroughAttrs;\n  const prev = setCurrentRenderingInstance(instance);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    accessedAttrs = false;\n  }\n  try {\n    if (vnode.shapeFlag & 4) {\n      const proxyToUse = withProxy || proxy;\n      result = normalizeVNode(\n        render.call(\n          proxyToUse,\n          proxyToUse,\n          renderCache,\n          props,\n          setupState,\n          data,\n          ctx\n        )\n      );\n      fallthroughAttrs = attrs;\n    } else {\n      const render2 = Component;\n      if (!!(process.env.NODE_ENV !== \"production\") && attrs === props) {\n        markAttrsAccessed();\n      }\n      result = normalizeVNode(\n        render2.length > 1 ? render2(\n          props,\n          !!(process.env.NODE_ENV !== \"production\") ? {\n            get attrs() {\n              markAttrsAccessed();\n              return attrs;\n            },\n            slots,\n            emit\n          } : { attrs, slots, emit }\n        ) : render2(\n          props,\n          null\n          /* we know it doesn't need it */\n        )\n      );\n      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);\n    }\n  } catch (err) {\n    blockStack.length = 0;\n    handleError(err, instance, 1);\n    result = createVNode(Comment);\n  }\n  let root = result;\n  let setRoot = void 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && result.patchFlag > 0 && result.patchFlag & 2048) {\n    [root, setRoot] = getChildRoot(result);\n  }\n  if (fallthroughAttrs && inheritAttrs !== false) {\n    const keys = Object.keys(fallthroughAttrs);\n    const { shapeFlag } = root;\n    if (keys.length) {\n      if (shapeFlag & (1 | 6)) {\n        if (propsOptions && keys.some(isModelListener)) {\n          fallthroughAttrs = filterModelListeners(\n            fallthroughAttrs,\n            propsOptions\n          );\n        }\n        root = cloneVNode(root, fallthroughAttrs);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !accessedAttrs && root.type !== Comment) {\n        const allAttrs = Object.keys(attrs);\n        const eventAttrs = [];\n        const extraAttrs = [];\n        for (let i = 0, l = allAttrs.length; i < l; i++) {\n          const key = allAttrs[i];\n          if (isOn(key)) {\n            if (!isModelListener(key)) {\n              eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n            }\n          } else {\n            extraAttrs.push(key);\n          }\n        }\n        if (extraAttrs.length) {\n          warn(\n            `Extraneous non-props attributes (${extraAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`\n          );\n        }\n        if (eventAttrs.length) {\n          warn(\n            `Extraneous non-emits event listeners (${eventAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the \"emits\" option.`\n          );\n        }\n      }\n    }\n  }\n  if (vnode.dirs) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn(\n        `Runtime directive used on component with non-element root node. The directives will not function as intended.`\n      );\n    }\n    root = cloneVNode(root);\n    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n  }\n  if (vnode.transition) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn(\n        `Component inside <Transition> renders non-element root node that cannot be animated.`\n      );\n    }\n    root.transition = vnode.transition;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && setRoot) {\n    setRoot(root);\n  } else {\n    result = root;\n  }\n  setCurrentRenderingInstance(prev);\n  return result;\n}\nconst getChildRoot = (vnode) => {\n  const rawChildren = vnode.children;\n  const dynamicChildren = vnode.dynamicChildren;\n  const childRoot = filterSingleRoot(rawChildren);\n  if (!childRoot) {\n    return [vnode, void 0];\n  }\n  const index = rawChildren.indexOf(childRoot);\n  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n  const setRoot = (updatedRoot) => {\n    rawChildren[index] = updatedRoot;\n    if (dynamicChildren) {\n      if (dynamicIndex > -1) {\n        dynamicChildren[dynamicIndex] = updatedRoot;\n      } else if (updatedRoot.patchFlag > 0) {\n        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n      }\n    }\n  };\n  return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children) {\n  let singleRoot;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (isVNode(child)) {\n      if (child.type !== Comment || child.children === \"v-if\") {\n        if (singleRoot) {\n          return;\n        } else {\n          singleRoot = child;\n        }\n      }\n    } else {\n      return;\n    }\n  }\n  return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n  let res;\n  for (const key in attrs) {\n    if (key === \"class\" || key === \"style\" || isOn(key)) {\n      (res || (res = {}))[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst filterModelListeners = (attrs, props) => {\n  const res = {};\n  for (const key in attrs) {\n    if (!isModelListener(key) || !(key.slice(9) in props)) {\n      res[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst isElementRoot = (vnode) => {\n  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n  const { props: prevProps, children: prevChildren, component } = prevVNode;\n  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n  const emits = component.emitsOptions;\n  if (!!(process.env.NODE_ENV !== \"production\") && (prevChildren || nextChildren) && isHmrUpdating) {\n    return true;\n  }\n  if (nextVNode.dirs || nextVNode.transition) {\n    return true;\n  }\n  if (optimized && patchFlag >= 0) {\n    if (patchFlag & 1024) {\n      return true;\n    }\n    if (patchFlag & 16) {\n      if (!prevProps) {\n        return !!nextProps;\n      }\n      return hasPropsChanged(prevProps, nextProps, emits);\n    } else if (patchFlag & 8) {\n      const dynamicProps = nextVNode.dynamicProps;\n      for (let i = 0; i < dynamicProps.length; i++) {\n        const key = dynamicProps[i];\n        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {\n          return true;\n        }\n      }\n    }\n  } else {\n    if (prevChildren || nextChildren) {\n      if (!nextChildren || !nextChildren.$stable) {\n        return true;\n      }\n    }\n    if (prevProps === nextProps) {\n      return false;\n    }\n    if (!prevProps) {\n      return !!nextProps;\n    }\n    if (!nextProps) {\n      return true;\n    }\n    return hasPropsChanged(prevProps, nextProps, emits);\n  }\n  return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n  const nextKeys = Object.keys(nextProps);\n  if (nextKeys.length !== Object.keys(prevProps).length) {\n    return true;\n  }\n  for (let i = 0; i < nextKeys.length; i++) {\n    const key = nextKeys[i];\n    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction updateHOCHostEl({ vnode, parent }, el) {\n  while (parent && parent.subTree === vnode) {\n    (vnode = parent.vnode).el = el;\n    parent = parent.parent;\n  }\n}\n\nconst isSuspense = (type) => type.__isSuspense;\nconst SuspenseImpl = {\n  name: \"Suspense\",\n  // In order to make Suspense tree-shakable, we need to avoid importing it\n  // directly in the renderer. The renderer checks for the __isSuspense flag\n  // on a vnode's type and calls the `process` method, passing in renderer\n  // internals.\n  __isSuspense: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {\n    if (n1 == null) {\n      mountSuspense(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    } else {\n      patchSuspense(\n        n1,\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        isSVG,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    }\n  },\n  hydrate: hydrateSuspense,\n  create: createSuspenseBoundary,\n  normalize: normalizeSuspenseChildren\n};\nconst Suspense = SuspenseImpl ;\nfunction triggerEvent(vnode, name) {\n  const eventListener = vnode.props && vnode.props[name];\n  if (isFunction(eventListener)) {\n    eventListener();\n  }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {\n  const {\n    p: patch,\n    o: { createElement }\n  } = rendererInternals;\n  const hiddenContainer = createElement(\"div\");\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    container,\n    hiddenContainer,\n    anchor,\n    isSVG,\n    slotScopeIds,\n    optimized,\n    rendererInternals\n  );\n  patch(\n    null,\n    suspense.pendingBranch = vnode.ssContent,\n    hiddenContainer,\n    null,\n    parentComponent,\n    suspense,\n    isSVG,\n    slotScopeIds\n  );\n  if (suspense.deps > 0) {\n    triggerEvent(vnode, \"onPending\");\n    triggerEvent(vnode, \"onFallback\");\n    patch(\n      null,\n      vnode.ssFallback,\n      container,\n      anchor,\n      parentComponent,\n      null,\n      // fallback tree will not have suspense context\n      isSVG,\n      slotScopeIds\n    );\n    setActiveBranch(suspense, vnode.ssFallback);\n  } else {\n    suspense.resolve(false, true);\n  }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n  const suspense = n2.suspense = n1.suspense;\n  suspense.vnode = n2;\n  n2.el = n1.el;\n  const newBranch = n2.ssContent;\n  const newFallback = n2.ssFallback;\n  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n  if (pendingBranch) {\n    suspense.pendingBranch = newBranch;\n    if (isSameVNodeType(newBranch, pendingBranch)) {\n      patch(\n        pendingBranch,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else if (isInFallback) {\n        patch(\n          activeBranch,\n          newFallback,\n          container,\n          anchor,\n          parentComponent,\n          null,\n          // fallback tree will not have suspense context\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        setActiveBranch(suspense, newFallback);\n      }\n    } else {\n      suspense.pendingId++;\n      if (isHydrating) {\n        suspense.isHydrating = false;\n        suspense.activeBranch = pendingBranch;\n      } else {\n        unmount(pendingBranch, parentComponent, suspense);\n      }\n      suspense.deps = 0;\n      suspense.effects.length = 0;\n      suspense.hiddenContainer = createElement(\"div\");\n      if (isInFallback) {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        } else {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n        patch(\n          activeBranch,\n          newBranch,\n          container,\n          anchor,\n          parentComponent,\n          suspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        suspense.resolve(true);\n      } else {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        }\n      }\n    }\n  } else {\n    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n      patch(\n        activeBranch,\n        newBranch,\n        container,\n        anchor,\n        parentComponent,\n        suspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n      setActiveBranch(suspense, newBranch);\n    } else {\n      triggerEvent(n2, \"onPending\");\n      suspense.pendingBranch = newBranch;\n      suspense.pendingId++;\n      patch(\n        null,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else {\n        const { timeout, pendingId } = suspense;\n        if (timeout > 0) {\n          setTimeout(() => {\n            if (suspense.pendingId === pendingId) {\n              suspense.fallback(newFallback);\n            }\n          }, timeout);\n        } else if (timeout === 0) {\n          suspense.fallback(newFallback);\n        }\n      }\n    }\n  }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n  if (!!(process.env.NODE_ENV !== \"production\") && true && !hasWarned) {\n    hasWarned = true;\n    console[console.info ? \"info\" : \"log\"](\n      `<Suspense> is an experimental feature and its API will likely change.`\n    );\n  }\n  const {\n    p: patch,\n    m: move,\n    um: unmount,\n    n: next,\n    o: { parentNode, remove }\n  } = rendererInternals;\n  let parentSuspenseId;\n  const isSuspensible = isVNodeSuspensible(vnode);\n  if (isSuspensible) {\n    if (parentSuspense == null ? void 0 : parentSuspense.pendingBranch) {\n      parentSuspenseId = parentSuspense.pendingId;\n      parentSuspense.deps++;\n    }\n  }\n  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(timeout, `Suspense timeout`);\n  }\n  const suspense = {\n    vnode,\n    parent: parentSuspense,\n    parentComponent,\n    isSVG,\n    container,\n    hiddenContainer,\n    anchor,\n    deps: 0,\n    pendingId: 0,\n    timeout: typeof timeout === \"number\" ? timeout : -1,\n    activeBranch: null,\n    pendingBranch: null,\n    isInFallback: true,\n    isHydrating,\n    isUnmounted: false,\n    effects: [],\n    resolve(resume = false, sync = false) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!resume && !suspense.pendingBranch) {\n          throw new Error(\n            `suspense.resolve() is called without a pending branch.`\n          );\n        }\n        if (suspense.isUnmounted) {\n          throw new Error(\n            `suspense.resolve() is called on an already unmounted suspense boundary.`\n          );\n        }\n      }\n      const {\n        vnode: vnode2,\n        activeBranch,\n        pendingBranch,\n        pendingId,\n        effects,\n        parentComponent: parentComponent2,\n        container: container2\n      } = suspense;\n      if (suspense.isHydrating) {\n        suspense.isHydrating = false;\n      } else if (!resume) {\n        const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === \"out-in\";\n        if (delayEnter) {\n          activeBranch.transition.afterLeave = () => {\n            if (pendingId === suspense.pendingId) {\n              move(pendingBranch, container2, anchor2, 0);\n            }\n          };\n        }\n        let { anchor: anchor2 } = suspense;\n        if (activeBranch) {\n          anchor2 = next(activeBranch);\n          unmount(activeBranch, parentComponent2, suspense, true);\n        }\n        if (!delayEnter) {\n          move(pendingBranch, container2, anchor2, 0);\n        }\n      }\n      setActiveBranch(suspense, pendingBranch);\n      suspense.pendingBranch = null;\n      suspense.isInFallback = false;\n      let parent = suspense.parent;\n      let hasUnresolvedAncestor = false;\n      while (parent) {\n        if (parent.pendingBranch) {\n          parent.effects.push(...effects);\n          hasUnresolvedAncestor = true;\n          break;\n        }\n        parent = parent.parent;\n      }\n      if (!hasUnresolvedAncestor) {\n        queuePostFlushCb(effects);\n      }\n      suspense.effects = [];\n      if (isSuspensible) {\n        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {\n          parentSuspense.deps--;\n          if (parentSuspense.deps === 0 && !sync) {\n            parentSuspense.resolve();\n          }\n        }\n      }\n      triggerEvent(vnode2, \"onResolve\");\n    },\n    fallback(fallbackVNode) {\n      if (!suspense.pendingBranch) {\n        return;\n      }\n      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense;\n      triggerEvent(vnode2, \"onFallback\");\n      const anchor2 = next(activeBranch);\n      const mountFallback = () => {\n        if (!suspense.isInFallback) {\n          return;\n        }\n        patch(\n          null,\n          fallbackVNode,\n          container2,\n          anchor2,\n          parentComponent2,\n          null,\n          // fallback tree will not have suspense context\n          isSVG2,\n          slotScopeIds,\n          optimized\n        );\n        setActiveBranch(suspense, fallbackVNode);\n      };\n      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === \"out-in\";\n      if (delayEnter) {\n        activeBranch.transition.afterLeave = mountFallback;\n      }\n      suspense.isInFallback = true;\n      unmount(\n        activeBranch,\n        parentComponent2,\n        null,\n        // no suspense so unmount hooks fire now\n        true\n        // shouldRemove\n      );\n      if (!delayEnter) {\n        mountFallback();\n      }\n    },\n    move(container2, anchor2, type) {\n      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);\n      suspense.container = container2;\n    },\n    next() {\n      return suspense.activeBranch && next(suspense.activeBranch);\n    },\n    registerDep(instance, setupRenderEffect) {\n      const isInPendingSuspense = !!suspense.pendingBranch;\n      if (isInPendingSuspense) {\n        suspense.deps++;\n      }\n      const hydratedEl = instance.vnode.el;\n      instance.asyncDep.catch((err) => {\n        handleError(err, instance, 0);\n      }).then((asyncSetupResult) => {\n        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {\n          return;\n        }\n        instance.asyncResolved = true;\n        const { vnode: vnode2 } = instance;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(vnode2);\n        }\n        handleSetupResult(instance, asyncSetupResult, false);\n        if (hydratedEl) {\n          vnode2.el = hydratedEl;\n        }\n        const placeholder = !hydratedEl && instance.subTree.el;\n        setupRenderEffect(\n          instance,\n          vnode2,\n          // component may have been moved before resolve.\n          // if this is not a hydration, instance.subTree will be the comment\n          // placeholder.\n          parentNode(hydratedEl || instance.subTree.el),\n          // anchor will not be used if this is hydration, so only need to\n          // consider the comment placeholder case.\n          hydratedEl ? null : next(instance.subTree),\n          suspense,\n          isSVG,\n          optimized\n        );\n        if (placeholder) {\n          remove(placeholder);\n        }\n        updateHOCHostEl(instance, vnode2.el);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        if (isInPendingSuspense && --suspense.deps === 0) {\n          suspense.resolve();\n        }\n      });\n    },\n    unmount(parentSuspense2, doRemove) {\n      suspense.isUnmounted = true;\n      if (suspense.activeBranch) {\n        unmount(\n          suspense.activeBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n      if (suspense.pendingBranch) {\n        unmount(\n          suspense.pendingBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n    }\n  };\n  return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    node.parentNode,\n    document.createElement(\"div\"),\n    null,\n    isSVG,\n    slotScopeIds,\n    optimized,\n    rendererInternals,\n    true\n    /* hydrating */\n  );\n  const result = hydrateNode(\n    node,\n    suspense.pendingBranch = vnode.ssContent,\n    parentComponent,\n    suspense,\n    slotScopeIds,\n    optimized\n  );\n  if (suspense.deps === 0) {\n    suspense.resolve(false, true);\n  }\n  return result;\n}\nfunction normalizeSuspenseChildren(vnode) {\n  const { shapeFlag, children } = vnode;\n  const isSlotChildren = shapeFlag & 32;\n  vnode.ssContent = normalizeSuspenseSlot(\n    isSlotChildren ? children.default : children\n  );\n  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n  let block;\n  if (isFunction(s)) {\n    const trackBlock = isBlockTreeEnabled && s._c;\n    if (trackBlock) {\n      s._d = false;\n      openBlock();\n    }\n    s = s();\n    if (trackBlock) {\n      s._d = true;\n      block = currentBlock;\n      closeBlock();\n    }\n  }\n  if (isArray(s)) {\n    const singleChild = filterSingleRoot(s);\n    if (!!(process.env.NODE_ENV !== \"production\") && !singleChild) {\n      warn(`<Suspense> slots expect a single root node.`);\n    }\n    s = singleChild;\n  }\n  s = normalizeVNode(s);\n  if (block && !s.dynamicChildren) {\n    s.dynamicChildren = block.filter((c) => c !== s);\n  }\n  return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n  if (suspense && suspense.pendingBranch) {\n    if (isArray(fn)) {\n      suspense.effects.push(...fn);\n    } else {\n      suspense.effects.push(fn);\n    }\n  } else {\n    queuePostFlushCb(fn);\n  }\n}\nfunction setActiveBranch(suspense, branch) {\n  suspense.activeBranch = branch;\n  const { vnode, parentComponent } = suspense;\n  const el = vnode.el = branch.el;\n  if (parentComponent && parentComponent.subTree === vnode) {\n    parentComponent.vnode.el = el;\n    updateHOCHostEl(parentComponent, el);\n  }\n}\nfunction isVNodeSuspensible(vnode) {\n  var _a;\n  return ((_a = vnode.props) == null ? void 0 : _a.suspensible) != null && vnode.props.suspensible !== false;\n}\n\nfunction watchEffect(effect, options) {\n  return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n  );\n}\nfunction watchSyncEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n  );\n}\nconst INITIAL_WATCHER_VALUE = {};\nfunction watch(source, cb, options) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n    warn(\n      `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n    );\n  }\n  return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {\n  var _a;\n  if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n    if (immediate !== void 0) {\n      warn(\n        `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (deep !== void 0) {\n      warn(\n        `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n  }\n  const warnInvalidSource = (s) => {\n    warn(\n      `Invalid watch source: `,\n      s,\n      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n    );\n  };\n  const instance = getCurrentScope() === ((_a = currentInstance) == null ? void 0 : _a.scope) ? currentInstance : null;\n  let getter;\n  let forceTrigger = false;\n  let isMultiSource = false;\n  if (isRef(source)) {\n    getter = () => source.value;\n    forceTrigger = isShallow$1(source);\n  } else if (isReactive(source)) {\n    getter = () => source;\n    deep = true;\n  } else if (isArray(source)) {\n    isMultiSource = true;\n    forceTrigger = source.some((s) => isReactive(s) || isShallow$1(s));\n    getter = () => source.map((s) => {\n      if (isRef(s)) {\n        return s.value;\n      } else if (isReactive(s)) {\n        return traverse(s);\n      } else if (isFunction(s)) {\n        return callWithErrorHandling(s, instance, 2);\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n      }\n    });\n  } else if (isFunction(source)) {\n    if (cb) {\n      getter = () => callWithErrorHandling(source, instance, 2);\n    } else {\n      getter = () => {\n        if (instance && instance.isUnmounted) {\n          return;\n        }\n        if (cleanup) {\n          cleanup();\n        }\n        return callWithAsyncErrorHandling(\n          source,\n          instance,\n          3,\n          [onCleanup]\n        );\n      };\n    }\n  } else {\n    getter = NOOP;\n    !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n  }\n  if (cb && deep) {\n    const baseGetter = getter;\n    getter = () => traverse(baseGetter());\n  }\n  let cleanup;\n  let onCleanup = (fn) => {\n    cleanup = effect.onStop = () => {\n      callWithErrorHandling(fn, instance, 4);\n    };\n  };\n  let ssrCleanup;\n  if (isInSSRComponentSetup) {\n    onCleanup = NOOP;\n    if (!cb) {\n      getter();\n    } else if (immediate) {\n      callWithAsyncErrorHandling(cb, instance, 3, [\n        getter(),\n        isMultiSource ? [] : void 0,\n        onCleanup\n      ]);\n    }\n    if (flush === \"sync\") {\n      const ctx = useSSRContext();\n      ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n    } else {\n      return NOOP;\n    }\n  }\n  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n  const job = () => {\n    if (!effect.active) {\n      return;\n    }\n    if (cb) {\n      const newValue = effect.run();\n      if (deep || forceTrigger || (isMultiSource ? newValue.some(\n        (v, i) => hasChanged(v, oldValue[i])\n      ) : hasChanged(newValue, oldValue)) || false) {\n        if (cleanup) {\n          cleanup();\n        }\n        callWithAsyncErrorHandling(cb, instance, 3, [\n          newValue,\n          // pass undefined as the old value when it's changed for the first time\n          oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n          onCleanup\n        ]);\n        oldValue = newValue;\n      }\n    } else {\n      effect.run();\n    }\n  };\n  job.allowRecurse = !!cb;\n  let scheduler;\n  if (flush === \"sync\") {\n    scheduler = job;\n  } else if (flush === \"post\") {\n    scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);\n  } else {\n    job.pre = true;\n    if (instance)\n      job.id = instance.uid;\n    scheduler = () => queueJob(job);\n  }\n  const effect = new ReactiveEffect(getter, scheduler);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    effect.onTrack = onTrack;\n    effect.onTrigger = onTrigger;\n  }\n  if (cb) {\n    if (immediate) {\n      job();\n    } else {\n      oldValue = effect.run();\n    }\n  } else if (flush === \"post\") {\n    queuePostRenderEffect(\n      effect.run.bind(effect),\n      instance && instance.suspense\n    );\n  } else {\n    effect.run();\n  }\n  const unwatch = () => {\n    effect.stop();\n    if (instance && instance.scope) {\n      remove(instance.scope.effects, effect);\n    }\n  };\n  if (ssrCleanup)\n    ssrCleanup.push(unwatch);\n  return unwatch;\n}\nfunction instanceWatch(source, value, options) {\n  const publicThis = this.proxy;\n  const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n  let cb;\n  if (isFunction(value)) {\n    cb = value;\n  } else {\n    cb = value.handler;\n    options = value;\n  }\n  const cur = currentInstance;\n  setCurrentInstance(this);\n  const res = doWatch(getter, cb.bind(publicThis), options);\n  if (cur) {\n    setCurrentInstance(cur);\n  } else {\n    unsetCurrentInstance();\n  }\n  return res;\n}\nfunction createPathGetter(ctx, path) {\n  const segments = path.split(\".\");\n  return () => {\n    let cur = ctx;\n    for (let i = 0; i < segments.length && cur; i++) {\n      cur = cur[segments[i]];\n    }\n    return cur;\n  };\n}\nfunction traverse(value, seen) {\n  if (!isObject(value) || value[\"__v_skip\"]) {\n    return value;\n  }\n  seen = seen || /* @__PURE__ */ new Set();\n  if (seen.has(value)) {\n    return value;\n  }\n  seen.add(value);\n  if (isRef(value)) {\n    traverse(value.value, seen);\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      traverse(value[i], seen);\n    }\n  } else if (isSet(value) || isMap(value)) {\n    value.forEach((v) => {\n      traverse(v, seen);\n    });\n  } else if (isPlainObject(value)) {\n    for (const key in value) {\n      traverse(value[key], seen);\n    }\n  }\n  return value;\n}\n\nfunction validateDirectiveName(name) {\n  if (isBuiltInDirective(name)) {\n    warn(\"Do not use built-in directive ids as custom directive id: \" + name);\n  }\n}\nfunction withDirectives(vnode, directives) {\n  const internalInstance = currentRenderingInstance;\n  if (internalInstance === null) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`withDirectives can only be used inside render functions.`);\n    return vnode;\n  }\n  const instance = getExposeProxy(internalInstance) || internalInstance.proxy;\n  const bindings = vnode.dirs || (vnode.dirs = []);\n  for (let i = 0; i < directives.length; i++) {\n    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n    if (dir) {\n      if (isFunction(dir)) {\n        dir = {\n          mounted: dir,\n          updated: dir\n        };\n      }\n      if (dir.deep) {\n        traverse(value);\n      }\n      bindings.push({\n        dir,\n        instance,\n        value,\n        oldValue: void 0,\n        arg,\n        modifiers\n      });\n    }\n  }\n  return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n  const bindings = vnode.dirs;\n  const oldBindings = prevVNode && prevVNode.dirs;\n  for (let i = 0; i < bindings.length; i++) {\n    const binding = bindings[i];\n    if (oldBindings) {\n      binding.oldValue = oldBindings[i].value;\n    }\n    let hook = binding.dir[name];\n    if (hook) {\n      pauseTracking();\n      callWithAsyncErrorHandling(hook, instance, 8, [\n        vnode.el,\n        binding,\n        vnode,\n        prevVNode\n      ]);\n      resetTracking();\n    }\n  }\n}\n\nfunction useTransitionState() {\n  const state = {\n    isMounted: false,\n    isLeaving: false,\n    isUnmounting: false,\n    leavingVNodes: /* @__PURE__ */ new Map()\n  };\n  onMounted(() => {\n    state.isMounted = true;\n  });\n  onBeforeUnmount(() => {\n    state.isUnmounting = true;\n  });\n  return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n  mode: String,\n  appear: Boolean,\n  persisted: Boolean,\n  // enter\n  onBeforeEnter: TransitionHookValidator,\n  onEnter: TransitionHookValidator,\n  onAfterEnter: TransitionHookValidator,\n  onEnterCancelled: TransitionHookValidator,\n  // leave\n  onBeforeLeave: TransitionHookValidator,\n  onLeave: TransitionHookValidator,\n  onAfterLeave: TransitionHookValidator,\n  onLeaveCancelled: TransitionHookValidator,\n  // appear\n  onBeforeAppear: TransitionHookValidator,\n  onAppear: TransitionHookValidator,\n  onAfterAppear: TransitionHookValidator,\n  onAppearCancelled: TransitionHookValidator\n};\nconst BaseTransitionImpl = {\n  name: `BaseTransition`,\n  props: BaseTransitionPropsValidators,\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    let prevTransitionKey;\n    return () => {\n      const children = slots.default && getTransitionRawChildren(slots.default(), true);\n      if (!children || !children.length) {\n        return;\n      }\n      let child = children[0];\n      if (children.length > 1) {\n        let hasFound = false;\n        for (const c of children) {\n          if (c.type !== Comment) {\n            if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n              warn(\n                \"<transition> can only be used on a single element or component. Use <transition-group> for lists.\"\n              );\n              break;\n            }\n            child = c;\n            hasFound = true;\n            if (!!!(process.env.NODE_ENV !== \"production\"))\n              break;\n          }\n        }\n      }\n      const rawProps = toRaw(props);\n      const { mode } = rawProps;\n      if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n        warn(`invalid <transition> mode: ${mode}`);\n      }\n      if (state.isLeaving) {\n        return emptyPlaceholder(child);\n      }\n      const innerChild = getKeepAliveChild(child);\n      if (!innerChild) {\n        return emptyPlaceholder(child);\n      }\n      const enterHooks = resolveTransitionHooks(\n        innerChild,\n        rawProps,\n        state,\n        instance\n      );\n      setTransitionHooks(innerChild, enterHooks);\n      const oldChild = instance.subTree;\n      const oldInnerChild = oldChild && getKeepAliveChild(oldChild);\n      let transitionKeyChanged = false;\n      const { getTransitionKey } = innerChild.type;\n      if (getTransitionKey) {\n        const key = getTransitionKey();\n        if (prevTransitionKey === void 0) {\n          prevTransitionKey = key;\n        } else if (key !== prevTransitionKey) {\n          prevTransitionKey = key;\n          transitionKeyChanged = true;\n        }\n      }\n      if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {\n        const leavingHooks = resolveTransitionHooks(\n          oldInnerChild,\n          rawProps,\n          state,\n          instance\n        );\n        setTransitionHooks(oldInnerChild, leavingHooks);\n        if (mode === \"out-in\") {\n          state.isLeaving = true;\n          leavingHooks.afterLeave = () => {\n            state.isLeaving = false;\n            if (instance.update.active !== false) {\n              instance.update();\n            }\n          };\n          return emptyPlaceholder(child);\n        } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n            const leavingVNodesCache = getLeavingNodesForType(\n              state,\n              oldInnerChild\n            );\n            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n            el._leaveCb = () => {\n              earlyRemove();\n              el._leaveCb = void 0;\n              delete enterHooks.delayedLeave;\n            };\n            enterHooks.delayedLeave = delayedLeave;\n          };\n        }\n      }\n      return child;\n    };\n  }\n};\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n  const { leavingVNodes } = state;\n  let leavingVNodesCache = leavingVNodes.get(vnode.type);\n  if (!leavingVNodesCache) {\n    leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n    leavingVNodes.set(vnode.type, leavingVNodesCache);\n  }\n  return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance) {\n  const {\n    appear,\n    mode,\n    persisted = false,\n    onBeforeEnter,\n    onEnter,\n    onAfterEnter,\n    onEnterCancelled,\n    onBeforeLeave,\n    onLeave,\n    onAfterLeave,\n    onLeaveCancelled,\n    onBeforeAppear,\n    onAppear,\n    onAfterAppear,\n    onAppearCancelled\n  } = props;\n  const key = String(vnode.key);\n  const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n  const callHook = (hook, args) => {\n    hook && callWithAsyncErrorHandling(\n      hook,\n      instance,\n      9,\n      args\n    );\n  };\n  const callAsyncHook = (hook, args) => {\n    const done = args[1];\n    callHook(hook, args);\n    if (isArray(hook)) {\n      if (hook.every((hook2) => hook2.length <= 1))\n        done();\n    } else if (hook.length <= 1) {\n      done();\n    }\n  };\n  const hooks = {\n    mode,\n    persisted,\n    beforeEnter(el) {\n      let hook = onBeforeEnter;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onBeforeAppear || onBeforeEnter;\n        } else {\n          return;\n        }\n      }\n      if (el._leaveCb) {\n        el._leaveCb(\n          true\n          /* cancelled */\n        );\n      }\n      const leavingVNode = leavingVNodesCache[key];\n      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el._leaveCb) {\n        leavingVNode.el._leaveCb();\n      }\n      callHook(hook, [el]);\n    },\n    enter(el) {\n      let hook = onEnter;\n      let afterHook = onAfterEnter;\n      let cancelHook = onEnterCancelled;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onAppear || onEnter;\n          afterHook = onAfterAppear || onAfterEnter;\n          cancelHook = onAppearCancelled || onEnterCancelled;\n        } else {\n          return;\n        }\n      }\n      let called = false;\n      const done = el._enterCb = (cancelled) => {\n        if (called)\n          return;\n        called = true;\n        if (cancelled) {\n          callHook(cancelHook, [el]);\n        } else {\n          callHook(afterHook, [el]);\n        }\n        if (hooks.delayedLeave) {\n          hooks.delayedLeave();\n        }\n        el._enterCb = void 0;\n      };\n      if (hook) {\n        callAsyncHook(hook, [el, done]);\n      } else {\n        done();\n      }\n    },\n    leave(el, remove) {\n      const key2 = String(vnode.key);\n      if (el._enterCb) {\n        el._enterCb(\n          true\n          /* cancelled */\n        );\n      }\n      if (state.isUnmounting) {\n        return remove();\n      }\n      callHook(onBeforeLeave, [el]);\n      let called = false;\n      const done = el._leaveCb = (cancelled) => {\n        if (called)\n          return;\n        called = true;\n        remove();\n        if (cancelled) {\n          callHook(onLeaveCancelled, [el]);\n        } else {\n          callHook(onAfterLeave, [el]);\n        }\n        el._leaveCb = void 0;\n        if (leavingVNodesCache[key2] === vnode) {\n          delete leavingVNodesCache[key2];\n        }\n      };\n      leavingVNodesCache[key2] = vnode;\n      if (onLeave) {\n        callAsyncHook(onLeave, [el, done]);\n      } else {\n        done();\n      }\n    },\n    clone(vnode2) {\n      return resolveTransitionHooks(vnode2, props, state, instance);\n    }\n  };\n  return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n  if (isKeepAlive(vnode)) {\n    vnode = cloneVNode(vnode);\n    vnode.children = null;\n    return vnode;\n  }\n}\nfunction getKeepAliveChild(vnode) {\n  return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode;\n}\nfunction setTransitionHooks(vnode, hooks) {\n  if (vnode.shapeFlag & 6 && vnode.component) {\n    setTransitionHooks(vnode.component.subTree, hooks);\n  } else if (vnode.shapeFlag & 128) {\n    vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n  } else {\n    vnode.transition = hooks;\n  }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n  let ret = [];\n  let keyedFragmentCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    let child = children[i];\n    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n    if (child.type === Fragment) {\n      if (child.patchFlag & 128)\n        keyedFragmentCount++;\n      ret = ret.concat(\n        getTransitionRawChildren(child.children, keepComment, key)\n      );\n    } else if (keepComment || child.type !== Comment) {\n      ret.push(key != null ? cloneVNode(child, { key }) : child);\n    }\n  }\n  if (keyedFragmentCount > 1) {\n    for (let i = 0; i < ret.length; i++) {\n      ret[i].patchFlag = -2;\n    }\n  }\n  return ret;\n}\n\nfunction defineComponent(options, extraOptions) {\n  return isFunction(options) ? (\n    // #8326: extend call and options.name access are considered side-effects\n    // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n  ) : options;\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\nfunction defineAsyncComponent(source) {\n  if (isFunction(source)) {\n    source = { loader: source };\n  }\n  const {\n    loader,\n    loadingComponent,\n    errorComponent,\n    delay = 200,\n    timeout,\n    // undefined = never times out\n    suspensible = true,\n    onError: userOnError\n  } = source;\n  let pendingRequest = null;\n  let resolvedComp;\n  let retries = 0;\n  const retry = () => {\n    retries++;\n    pendingRequest = null;\n    return load();\n  };\n  const load = () => {\n    let thisRequest;\n    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n      err = err instanceof Error ? err : new Error(String(err));\n      if (userOnError) {\n        return new Promise((resolve, reject) => {\n          const userRetry = () => resolve(retry());\n          const userFail = () => reject(err);\n          userOnError(err, userRetry, userFail, retries + 1);\n        });\n      } else {\n        throw err;\n      }\n    }).then((comp) => {\n      if (thisRequest !== pendingRequest && pendingRequest) {\n        return pendingRequest;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n        warn(\n          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n        );\n      }\n      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n        comp = comp.default;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n        throw new Error(`Invalid async component load result: ${comp}`);\n      }\n      resolvedComp = comp;\n      return comp;\n    }));\n  };\n  return defineComponent({\n    name: \"AsyncComponentWrapper\",\n    __asyncLoader: load,\n    get __asyncResolved() {\n      return resolvedComp;\n    },\n    setup() {\n      const instance = currentInstance;\n      if (resolvedComp) {\n        return () => createInnerComp(resolvedComp, instance);\n      }\n      const onError = (err) => {\n        pendingRequest = null;\n        handleError(\n          err,\n          instance,\n          13,\n          !errorComponent\n          /* do not throw in dev if user provided error component */\n        );\n      };\n      if (suspensible && instance.suspense || isInSSRComponentSetup) {\n        return load().then((comp) => {\n          return () => createInnerComp(comp, instance);\n        }).catch((err) => {\n          onError(err);\n          return () => errorComponent ? createVNode(errorComponent, {\n            error: err\n          }) : null;\n        });\n      }\n      const loaded = ref(false);\n      const error = ref();\n      const delayed = ref(!!delay);\n      if (delay) {\n        setTimeout(() => {\n          delayed.value = false;\n        }, delay);\n      }\n      if (timeout != null) {\n        setTimeout(() => {\n          if (!loaded.value && !error.value) {\n            const err = new Error(\n              `Async component timed out after ${timeout}ms.`\n            );\n            onError(err);\n            error.value = err;\n          }\n        }, timeout);\n      }\n      load().then(() => {\n        loaded.value = true;\n        if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n          queueJob(instance.parent.update);\n        }\n      }).catch((err) => {\n        onError(err);\n        error.value = err;\n      });\n      return () => {\n        if (loaded.value && resolvedComp) {\n          return createInnerComp(resolvedComp, instance);\n        } else if (error.value && errorComponent) {\n          return createVNode(errorComponent, {\n            error: error.value\n          });\n        } else if (loadingComponent && !delayed.value) {\n          return createVNode(loadingComponent);\n        }\n      };\n    }\n  });\n}\nfunction createInnerComp(comp, parent) {\n  const { ref: ref2, props, children, ce } = parent.vnode;\n  const vnode = createVNode(comp, props, children);\n  vnode.ref = ref2;\n  vnode.ce = ce;\n  delete parent.vnode.ce;\n  return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n  name: `KeepAlive`,\n  // Marker for special handling inside the renderer. We are not using a ===\n  // check directly on KeepAlive in the renderer, because importing it directly\n  // would prevent it from being tree-shaken.\n  __isKeepAlive: true,\n  props: {\n    include: [String, RegExp, Array],\n    exclude: [String, RegExp, Array],\n    max: [String, Number]\n  },\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const sharedContext = instance.ctx;\n    if (!sharedContext.renderer) {\n      return () => {\n        const children = slots.default && slots.default();\n        return children && children.length === 1 ? children[0] : children;\n      };\n    }\n    const cache = /* @__PURE__ */ new Map();\n    const keys = /* @__PURE__ */ new Set();\n    let current = null;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.__v_cache = cache;\n    }\n    const parentSuspense = instance.suspense;\n    const {\n      renderer: {\n        p: patch,\n        m: move,\n        um: _unmount,\n        o: { createElement }\n      }\n    } = sharedContext;\n    const storageContainer = createElement(\"div\");\n    sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {\n      const instance2 = vnode.component;\n      move(vnode, container, anchor, 0, parentSuspense);\n      patch(\n        instance2.vnode,\n        vnode,\n        container,\n        anchor,\n        instance2,\n        parentSuspense,\n        isSVG,\n        vnode.slotScopeIds,\n        optimized\n      );\n      queuePostRenderEffect(() => {\n        instance2.isDeactivated = false;\n        if (instance2.a) {\n          invokeArrayFns(instance2.a);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    sharedContext.deactivate = (vnode) => {\n      const instance2 = vnode.component;\n      move(vnode, storageContainer, null, 1, parentSuspense);\n      queuePostRenderEffect(() => {\n        if (instance2.da) {\n          invokeArrayFns(instance2.da);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n        instance2.isDeactivated = true;\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    function unmount(vnode) {\n      resetShapeFlag(vnode);\n      _unmount(vnode, instance, parentSuspense, true);\n    }\n    function pruneCache(filter) {\n      cache.forEach((vnode, key) => {\n        const name = getComponentName(vnode.type);\n        if (name && (!filter || !filter(name))) {\n          pruneCacheEntry(key);\n        }\n      });\n    }\n    function pruneCacheEntry(key) {\n      const cached = cache.get(key);\n      if (!current || !isSameVNodeType(cached, current)) {\n        unmount(cached);\n      } else if (current) {\n        resetShapeFlag(current);\n      }\n      cache.delete(key);\n      keys.delete(key);\n    }\n    watch(\n      () => [props.include, props.exclude],\n      ([include, exclude]) => {\n        include && pruneCache((name) => matches(include, name));\n        exclude && pruneCache((name) => !matches(exclude, name));\n      },\n      // prune post-render after `current` has been updated\n      { flush: \"post\", deep: true }\n    );\n    let pendingCacheKey = null;\n    const cacheSubtree = () => {\n      if (pendingCacheKey != null) {\n        cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n      }\n    };\n    onMounted(cacheSubtree);\n    onUpdated(cacheSubtree);\n    onBeforeUnmount(() => {\n      cache.forEach((cached) => {\n        const { subTree, suspense } = instance;\n        const vnode = getInnerChild(subTree);\n        if (cached.type === vnode.type && cached.key === vnode.key) {\n          resetShapeFlag(vnode);\n          const da = vnode.component.da;\n          da && queuePostRenderEffect(da, suspense);\n          return;\n        }\n        unmount(cached);\n      });\n    });\n    return () => {\n      pendingCacheKey = null;\n      if (!slots.default) {\n        return null;\n      }\n      const children = slots.default();\n      const rawVNode = children[0];\n      if (children.length > 1) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(`KeepAlive should contain exactly one component child.`);\n        }\n        current = null;\n        return children;\n      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n        current = null;\n        return rawVNode;\n      }\n      let vnode = getInnerChild(rawVNode);\n      const comp = vnode.type;\n      const name = getComponentName(\n        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n      );\n      const { include, exclude, max } = props;\n      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n        current = vnode;\n        return rawVNode;\n      }\n      const key = vnode.key == null ? comp : vnode.key;\n      const cachedVNode = cache.get(key);\n      if (vnode.el) {\n        vnode = cloneVNode(vnode);\n        if (rawVNode.shapeFlag & 128) {\n          rawVNode.ssContent = vnode;\n        }\n      }\n      pendingCacheKey = key;\n      if (cachedVNode) {\n        vnode.el = cachedVNode.el;\n        vnode.component = cachedVNode.component;\n        if (vnode.transition) {\n          setTransitionHooks(vnode, vnode.transition);\n        }\n        vnode.shapeFlag |= 512;\n        keys.delete(key);\n        keys.add(key);\n      } else {\n        keys.add(key);\n        if (max && keys.size > parseInt(max, 10)) {\n          pruneCacheEntry(keys.values().next().value);\n        }\n      }\n      vnode.shapeFlag |= 256;\n      current = vnode;\n      return isSuspense(rawVNode.type) ? rawVNode : vnode;\n    };\n  }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n  if (isArray(pattern)) {\n    return pattern.some((p) => matches(p, name));\n  } else if (isString(pattern)) {\n    return pattern.split(\",\").includes(name);\n  } else if (isRegExp(pattern)) {\n    return pattern.test(name);\n  }\n  return false;\n}\nfunction onActivated(hook, target) {\n  registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n  registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n  const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n    let current = target;\n    while (current) {\n      if (current.isDeactivated) {\n        return;\n      }\n      current = current.parent;\n    }\n    return hook();\n  });\n  injectHook(type, wrappedHook, target);\n  if (target) {\n    let current = target.parent;\n    while (current && current.parent) {\n      if (isKeepAlive(current.parent.vnode)) {\n        injectToKeepAliveRoot(wrappedHook, type, target, current);\n      }\n      current = current.parent;\n    }\n  }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n  const injected = injectHook(\n    type,\n    hook,\n    keepAliveRoot,\n    true\n    /* prepend */\n  );\n  onUnmounted(() => {\n    remove(keepAliveRoot[type], injected);\n  }, target);\n}\nfunction resetShapeFlag(vnode) {\n  vnode.shapeFlag &= ~256;\n  vnode.shapeFlag &= ~512;\n}\nfunction getInnerChild(vnode) {\n  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n  if (target) {\n    const hooks = target[type] || (target[type] = []);\n    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n      if (target.isUnmounted) {\n        return;\n      }\n      pauseTracking();\n      setCurrentInstance(target);\n      const res = callWithAsyncErrorHandling(hook, target, type, args);\n      unsetCurrentInstance();\n      resetTracking();\n      return res;\n    });\n    if (prepend) {\n      hooks.unshift(wrappedHook);\n    } else {\n      hooks.push(wrappedHook);\n    }\n    return wrappedHook;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, \"\"));\n    warn(\n      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n    );\n  }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => (\n  // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)\n  (!isInSSRComponentSetup || lifecycle === \"sp\") && injectHook(lifecycle, (...args) => hook(...args), target)\n);\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\"bu\");\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\"bum\");\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\"sp\");\nconst onRenderTriggered = createHook(\n  \"rtg\"\n);\nconst onRenderTracked = createHook(\n  \"rtc\"\n);\nfunction onErrorCaptured(hook, target = currentInstance) {\n  injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n  if (isString(component)) {\n    return resolveAsset(COMPONENTS, component, false) || component;\n  } else {\n    return component || NULL_DYNAMIC_COMPONENT;\n  }\n}\nfunction resolveDirective(name) {\n  return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n  const instance = currentRenderingInstance || currentInstance;\n  if (instance) {\n    const Component = instance.type;\n    if (type === COMPONENTS) {\n      const selfName = getComponentName(\n        Component,\n        false\n        /* do not include inferred name to avoid breaking existing code */\n      );\n      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n        return Component;\n      }\n    }\n    const res = (\n      // local registration\n      // check instance[type] first which is resolved for options API\n      resolve(instance[type] || Component[type], name) || // global registration\n      resolve(instance.appContext[type], name)\n    );\n    if (!res && maybeSelfReference) {\n      return Component;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n      const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n      warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n    }\n    return res;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(\n      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n    );\n  }\n}\nfunction resolve(registry, name) {\n  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n  let ret;\n  const cached = cache && cache[index];\n  if (isArray(source) || isString(source)) {\n    ret = new Array(source.length);\n    for (let i = 0, l = source.length; i < l; i++) {\n      ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);\n    }\n  } else if (typeof source === \"number\") {\n    if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n      warn(`The v-for range expect an integer value but got ${source}.`);\n    }\n    ret = new Array(source);\n    for (let i = 0; i < source; i++) {\n      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n    }\n  } else if (isObject(source)) {\n    if (source[Symbol.iterator]) {\n      ret = Array.from(\n        source,\n        (item, i) => renderItem(item, i, void 0, cached && cached[i])\n      );\n    } else {\n      const keys = Object.keys(source);\n      ret = new Array(keys.length);\n      for (let i = 0, l = keys.length; i < l; i++) {\n        const key = keys[i];\n        ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n      }\n    }\n  } else {\n    ret = [];\n  }\n  if (cache) {\n    cache[index] = ret;\n  }\n  return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n  for (let i = 0; i < dynamicSlots.length; i++) {\n    const slot = dynamicSlots[i];\n    if (isArray(slot)) {\n      for (let j = 0; j < slot.length; j++) {\n        slots[slot[j].name] = slot[j].fn;\n      }\n    } else if (slot) {\n      slots[slot.name] = slot.key ? (...args) => {\n        const res = slot.fn(...args);\n        if (res)\n          res.key = slot.key;\n        return res;\n      } : slot.fn;\n    }\n  }\n  return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n  if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {\n    if (name !== \"default\")\n      props.name = name;\n    return createVNode(\"slot\", props, fallback && fallback());\n  }\n  let slot = slots[name];\n  if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n    warn(\n      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n    );\n    slot = () => [];\n  }\n  if (slot && slot._c) {\n    slot._d = false;\n  }\n  openBlock();\n  const validSlotContent = slot && ensureValidVNode(slot(props));\n  const rendered = createBlock(\n    Fragment,\n    {\n      key: props.key || // slot content array of a dynamic conditional slot may have a branch\n      // key attached in the `createSlots` helper, respect that\n      validSlotContent && validSlotContent.key || `_${name}`\n    },\n    validSlotContent || (fallback ? fallback() : []),\n    validSlotContent && slots._ === 1 ? 64 : -2\n  );\n  if (!noSlotted && rendered.scopeId) {\n    rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n  }\n  if (slot && slot._c) {\n    slot._d = true;\n  }\n  return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n  return vnodes.some((child) => {\n    if (!isVNode(child))\n      return true;\n    if (child.type === Comment)\n      return false;\n    if (child.type === Fragment && !ensureValidVNode(child.children))\n      return false;\n    return true;\n  }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n  const ret = {};\n  if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n    warn(`v-on with no argument expects an object value.`);\n    return ret;\n  }\n  for (const key in obj) {\n    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n  }\n  return ret;\n}\n\nconst getPublicInstance = (i) => {\n  if (!i)\n    return null;\n  if (isStatefulComponent(i))\n    return getExposeProxy(i) || i.proxy;\n  return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n  // Move PURE marker to new line to workaround compiler discarding it\n  // due to type annotation\n  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n    $: (i) => i,\n    $el: (i) => i.vnode.el,\n    $data: (i) => i.data,\n    $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n    $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n    $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n    $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n    $parent: (i) => getPublicInstance(i.parent),\n    $root: (i) => getPublicInstance(i.root),\n    $emit: (i) => i.emit,\n    $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n    $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),\n    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n    $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n  })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n  get({ _: instance }, key) {\n    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n    if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n      return true;\n    }\n    let normalizedProps;\n    if (key[0] !== \"$\") {\n      const n = accessCache[key];\n      if (n !== void 0) {\n        switch (n) {\n          case 1 /* SETUP */:\n            return setupState[key];\n          case 2 /* DATA */:\n            return data[key];\n          case 4 /* CONTEXT */:\n            return ctx[key];\n          case 3 /* PROPS */:\n            return props[key];\n        }\n      } else if (hasSetupBinding(setupState, key)) {\n        accessCache[key] = 1 /* SETUP */;\n        return setupState[key];\n      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n        accessCache[key] = 2 /* DATA */;\n        return data[key];\n      } else if (\n        // only cache other properties when instance has declared (thus stable)\n        // props\n        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n      ) {\n        accessCache[key] = 3 /* PROPS */;\n        return props[key];\n      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n        accessCache[key] = 4 /* CONTEXT */;\n        return ctx[key];\n      } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n        accessCache[key] = 0 /* OTHER */;\n      }\n    }\n    const publicGetter = publicPropertiesMap[key];\n    let cssModule, globalProperties;\n    if (publicGetter) {\n      if (key === \"$attrs\") {\n        track(instance, \"get\", key);\n        !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n      } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n        track(instance, \"get\", key);\n      }\n      return publicGetter(instance);\n    } else if (\n      // css module (injected by vue-loader)\n      (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n    ) {\n      return cssModule;\n    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n      accessCache[key] = 4 /* CONTEXT */;\n      return ctx[key];\n    } else if (\n      // global properties\n      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n    ) {\n      {\n        return globalProperties[key];\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n    // to infinite warning loop\n    key.indexOf(\"__v\") !== 0)) {\n      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n        warn(\n          `Property ${JSON.stringify(\n            key\n          )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n        );\n      } else if (instance === currentRenderingInstance) {\n        warn(\n          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n        );\n      }\n    }\n  },\n  set({ _: instance }, key, value) {\n    const { data, setupState, ctx } = instance;\n    if (hasSetupBinding(setupState, key)) {\n      setupState[key] = value;\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n      warn(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n      return false;\n    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n      data[key] = value;\n      return true;\n    } else if (hasOwn(instance.props, key)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n      return false;\n    }\n    if (key[0] === \"$\" && key.slice(1) in instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(\n        `Attempting to mutate public property \"${key}\". Properties starting with $ are reserved and readonly.`\n      );\n      return false;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && key in instance.appContext.config.globalProperties) {\n        Object.defineProperty(ctx, key, {\n          enumerable: true,\n          configurable: true,\n          value\n        });\n      } else {\n        ctx[key] = value;\n      }\n    }\n    return true;\n  },\n  has({\n    _: { data, setupState, accessCache, ctx, appContext, propsOptions }\n  }, key) {\n    let normalizedProps;\n    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);\n  },\n  defineProperty(target, key, descriptor) {\n    if (descriptor.get != null) {\n      target._.accessCache[key] = 0;\n    } else if (hasOwn(descriptor, \"value\")) {\n      this.set(target, key, descriptor.value, null);\n    }\n    return Reflect.defineProperty(target, key, descriptor);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\") && true) {\n  PublicInstanceProxyHandlers.ownKeys = (target) => {\n    warn(\n      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`\n    );\n    return Reflect.ownKeys(target);\n  };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend(\n  {},\n  PublicInstanceProxyHandlers,\n  {\n    get(target, key) {\n      if (key === Symbol.unscopables) {\n        return;\n      }\n      return PublicInstanceProxyHandlers.get(target, key, target);\n    },\n    has(_, key) {\n      const has = key[0] !== \"_\" && !isGloballyWhitelisted(key);\n      if (!!(process.env.NODE_ENV !== \"production\") && !has && PublicInstanceProxyHandlers.has(_, key)) {\n        warn(\n          `Property ${JSON.stringify(\n            key\n          )} should not start with _ which is a reserved prefix for Vue internals.`\n        );\n      }\n      return has;\n    }\n  }\n);\nfunction createDevRenderContext(instance) {\n  const target = {};\n  Object.defineProperty(target, `_`, {\n    configurable: true,\n    enumerable: false,\n    get: () => instance\n  });\n  Object.keys(publicPropertiesMap).forEach((key) => {\n    Object.defineProperty(target, key, {\n      configurable: true,\n      enumerable: false,\n      get: () => publicPropertiesMap[key](instance),\n      // intercepted by the proxy so no need for implementation,\n      // but needed to prevent set errors\n      set: NOOP\n    });\n  });\n  return target;\n}\nfunction exposePropsOnRenderContext(instance) {\n  const {\n    ctx,\n    propsOptions: [propsOptions]\n  } = instance;\n  if (propsOptions) {\n    Object.keys(propsOptions).forEach((key) => {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => instance.props[key],\n        set: NOOP\n      });\n    });\n  }\n}\nfunction exposeSetupStateOnRenderContext(instance) {\n  const { ctx, setupState } = instance;\n  Object.keys(toRaw(setupState)).forEach((key) => {\n    if (!setupState.__isScriptSetup) {\n      if (isReservedPrefix(key[0])) {\n        warn(\n          `setup() return property ${JSON.stringify(\n            key\n          )} should not start with \"$\" or \"_\" which are reserved prefixes for Vue internals.`\n        );\n        return;\n      }\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => setupState[key],\n        set: NOOP\n      });\n    }\n  });\n}\n\nconst warnRuntimeUsage = (method) => warn(\n  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`\n);\nfunction defineProps() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineProps`);\n  }\n  return null;\n}\nfunction defineEmits() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineEmits`);\n  }\n  return null;\n}\nfunction defineExpose(exposed) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineExpose`);\n  }\n}\nfunction defineOptions(options) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineOptions`);\n  }\n}\nfunction defineSlots() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineSlots`);\n  }\n  return null;\n}\nfunction defineModel() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(\"defineModel\");\n  }\n}\nfunction withDefaults(props, defaults) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`withDefaults`);\n  }\n  return null;\n}\nfunction useSlots() {\n  return getContext().slots;\n}\nfunction useAttrs() {\n  return getContext().attrs;\n}\nfunction useModel(props, name, options) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn(`useModel() called without active instance.`);\n    return ref();\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !i.propsOptions[0][name]) {\n    warn(`useModel() called with prop \"${name}\" which is not declared.`);\n    return ref();\n  }\n  if (options && options.local) {\n    const proxy = ref(props[name]);\n    watch(\n      () => props[name],\n      (v) => proxy.value = v\n    );\n    watch(proxy, (value) => {\n      if (value !== props[name]) {\n        i.emit(`update:${name}`, value);\n      }\n    });\n    return proxy;\n  } else {\n    return {\n      __v_isRef: true,\n      get value() {\n        return props[name];\n      },\n      set value(value) {\n        i.emit(`update:${name}`, value);\n      }\n    };\n  }\n}\nfunction getContext() {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn(`useContext() called without active instance.`);\n  }\n  return i.setupContext || (i.setupContext = createSetupContext(i));\n}\nfunction normalizePropsOrEmits(props) {\n  return isArray(props) ? props.reduce(\n    (normalized, p) => (normalized[p] = null, normalized),\n    {}\n  ) : props;\n}\nfunction mergeDefaults(raw, defaults) {\n  const props = normalizePropsOrEmits(raw);\n  for (const key in defaults) {\n    if (key.startsWith(\"__skip\"))\n      continue;\n    let opt = props[key];\n    if (opt) {\n      if (isArray(opt) || isFunction(opt)) {\n        opt = props[key] = { type: opt, default: defaults[key] };\n      } else {\n        opt.default = defaults[key];\n      }\n    } else if (opt === null) {\n      opt = props[key] = { default: defaults[key] };\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`props default key \"${key}\" has no corresponding declaration.`);\n    }\n    if (opt && defaults[`__skip_${key}`]) {\n      opt.skipFactory = true;\n    }\n  }\n  return props;\n}\nfunction mergeModels(a, b) {\n  if (!a || !b)\n    return a || b;\n  if (isArray(a) && isArray(b))\n    return a.concat(b);\n  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));\n}\nfunction createPropsRestProxy(props, excludedKeys) {\n  const ret = {};\n  for (const key in props) {\n    if (!excludedKeys.includes(key)) {\n      Object.defineProperty(ret, key, {\n        enumerable: true,\n        get: () => props[key]\n      });\n    }\n  }\n  return ret;\n}\nfunction withAsyncContext(getAwaitable) {\n  const ctx = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !ctx) {\n    warn(\n      `withAsyncContext called without active current instance. This is likely a bug.`\n    );\n  }\n  let awaitable = getAwaitable();\n  unsetCurrentInstance();\n  if (isPromise(awaitable)) {\n    awaitable = awaitable.catch((e) => {\n      setCurrentInstance(ctx);\n      throw e;\n    });\n  }\n  return [awaitable, () => setCurrentInstance(ctx)];\n}\n\nfunction createDuplicateChecker() {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (type, key) => {\n    if (cache[key]) {\n      warn(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n    } else {\n      cache[key] = type;\n    }\n  };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n  const options = resolveMergedOptions(instance);\n  const publicThis = instance.proxy;\n  const ctx = instance.ctx;\n  shouldCacheAccess = false;\n  if (options.beforeCreate) {\n    callHook(options.beforeCreate, instance, \"bc\");\n  }\n  const {\n    // state\n    data: dataOptions,\n    computed: computedOptions,\n    methods,\n    watch: watchOptions,\n    provide: provideOptions,\n    inject: injectOptions,\n    // lifecycle\n    created,\n    beforeMount,\n    mounted,\n    beforeUpdate,\n    updated,\n    activated,\n    deactivated,\n    beforeDestroy,\n    beforeUnmount,\n    destroyed,\n    unmounted,\n    render,\n    renderTracked,\n    renderTriggered,\n    errorCaptured,\n    serverPrefetch,\n    // public API\n    expose,\n    inheritAttrs,\n    // assets\n    components,\n    directives,\n    filters\n  } = options;\n  const checkDuplicateProperties = !!(process.env.NODE_ENV !== \"production\") ? createDuplicateChecker() : null;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const [propsOptions] = instance.propsOptions;\n    if (propsOptions) {\n      for (const key in propsOptions) {\n        checkDuplicateProperties(\"Props\" /* PROPS */, key);\n      }\n    }\n  }\n  if (injectOptions) {\n    resolveInjections(injectOptions, ctx, checkDuplicateProperties);\n  }\n  if (methods) {\n    for (const key in methods) {\n      const methodHandler = methods[key];\n      if (isFunction(methodHandler)) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          Object.defineProperty(ctx, key, {\n            value: methodHandler.bind(publicThis),\n            configurable: true,\n            enumerable: true,\n            writable: true\n          });\n        } else {\n          ctx[key] = methodHandler.bind(publicThis);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkDuplicateProperties(\"Methods\" /* METHODS */, key);\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn(\n          `Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. Did you reference the function correctly?`\n        );\n      }\n    }\n  }\n  if (dataOptions) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(dataOptions)) {\n      warn(\n        `The data option must be a function. Plain object usage is no longer supported.`\n      );\n    }\n    const data = dataOptions.call(publicThis, publicThis);\n    if (!!(process.env.NODE_ENV !== \"production\") && isPromise(data)) {\n      warn(\n        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`\n      );\n    }\n    if (!isObject(data)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`data() should return an object.`);\n    } else {\n      instance.data = reactive(data);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (const key in data) {\n          checkDuplicateProperties(\"Data\" /* DATA */, key);\n          if (!isReservedPrefix(key[0])) {\n            Object.defineProperty(ctx, key, {\n              configurable: true,\n              enumerable: true,\n              get: () => data[key],\n              set: NOOP\n            });\n          }\n        }\n      }\n    }\n  }\n  shouldCacheAccess = true;\n  if (computedOptions) {\n    for (const key in computedOptions) {\n      const opt = computedOptions[key];\n      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;\n      if (!!(process.env.NODE_ENV !== \"production\") && get === NOOP) {\n        warn(`Computed property \"${key}\" has no getter.`);\n      }\n      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : !!(process.env.NODE_ENV !== \"production\") ? () => {\n        warn(\n          `Write operation failed: computed property \"${key}\" is readonly.`\n        );\n      } : NOOP;\n      const c = computed({\n        get,\n        set\n      });\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => c.value,\n        set: (v) => c.value = v\n      });\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        checkDuplicateProperties(\"Computed\" /* COMPUTED */, key);\n      }\n    }\n  }\n  if (watchOptions) {\n    for (const key in watchOptions) {\n      createWatcher(watchOptions[key], ctx, publicThis, key);\n    }\n  }\n  if (provideOptions) {\n    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;\n    Reflect.ownKeys(provides).forEach((key) => {\n      provide(key, provides[key]);\n    });\n  }\n  if (created) {\n    callHook(created, instance, \"c\");\n  }\n  function registerLifecycleHook(register, hook) {\n    if (isArray(hook)) {\n      hook.forEach((_hook) => register(_hook.bind(publicThis)));\n    } else if (hook) {\n      register(hook.bind(publicThis));\n    }\n  }\n  registerLifecycleHook(onBeforeMount, beforeMount);\n  registerLifecycleHook(onMounted, mounted);\n  registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n  registerLifecycleHook(onUpdated, updated);\n  registerLifecycleHook(onActivated, activated);\n  registerLifecycleHook(onDeactivated, deactivated);\n  registerLifecycleHook(onErrorCaptured, errorCaptured);\n  registerLifecycleHook(onRenderTracked, renderTracked);\n  registerLifecycleHook(onRenderTriggered, renderTriggered);\n  registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n  registerLifecycleHook(onUnmounted, unmounted);\n  registerLifecycleHook(onServerPrefetch, serverPrefetch);\n  if (isArray(expose)) {\n    if (expose.length) {\n      const exposed = instance.exposed || (instance.exposed = {});\n      expose.forEach((key) => {\n        Object.defineProperty(exposed, key, {\n          get: () => publicThis[key],\n          set: (val) => publicThis[key] = val\n        });\n      });\n    } else if (!instance.exposed) {\n      instance.exposed = {};\n    }\n  }\n  if (render && instance.render === NOOP) {\n    instance.render = render;\n  }\n  if (inheritAttrs != null) {\n    instance.inheritAttrs = inheritAttrs;\n  }\n  if (components)\n    instance.components = components;\n  if (directives)\n    instance.directives = directives;\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {\n  if (isArray(injectOptions)) {\n    injectOptions = normalizeInject(injectOptions);\n  }\n  for (const key in injectOptions) {\n    const opt = injectOptions[key];\n    let injected;\n    if (isObject(opt)) {\n      if (\"default\" in opt) {\n        injected = inject(\n          opt.from || key,\n          opt.default,\n          true\n          /* treat default function as factory */\n        );\n      } else {\n        injected = inject(opt.from || key);\n      }\n    } else {\n      injected = inject(opt);\n    }\n    if (isRef(injected)) {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => injected.value,\n        set: (v) => injected.value = v\n      });\n    } else {\n      ctx[key] = injected;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      checkDuplicateProperties(\"Inject\" /* INJECT */, key);\n    }\n  }\n}\nfunction callHook(hook, instance, type) {\n  callWithAsyncErrorHandling(\n    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),\n    instance,\n    type\n  );\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n  const getter = key.includes(\".\") ? createPathGetter(publicThis, key) : () => publicThis[key];\n  if (isString(raw)) {\n    const handler = ctx[raw];\n    if (isFunction(handler)) {\n      watch(getter, handler);\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`Invalid watch handler specified by key \"${raw}\"`, handler);\n    }\n  } else if (isFunction(raw)) {\n    watch(getter, raw.bind(publicThis));\n  } else if (isObject(raw)) {\n    if (isArray(raw)) {\n      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));\n    } else {\n      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];\n      if (isFunction(handler)) {\n        watch(getter, handler, raw);\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n      }\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(`Invalid watch option: \"${key}\"`, raw);\n  }\n}\nfunction resolveMergedOptions(instance) {\n  const base = instance.type;\n  const { mixins, extends: extendsOptions } = base;\n  const {\n    mixins: globalMixins,\n    optionsCache: cache,\n    config: { optionMergeStrategies }\n  } = instance.appContext;\n  const cached = cache.get(base);\n  let resolved;\n  if (cached) {\n    resolved = cached;\n  } else if (!globalMixins.length && !mixins && !extendsOptions) {\n    {\n      resolved = base;\n    }\n  } else {\n    resolved = {};\n    if (globalMixins.length) {\n      globalMixins.forEach(\n        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)\n      );\n    }\n    mergeOptions(resolved, base, optionMergeStrategies);\n  }\n  if (isObject(base)) {\n    cache.set(base, resolved);\n  }\n  return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n  const { mixins, extends: extendsOptions } = from;\n  if (extendsOptions) {\n    mergeOptions(to, extendsOptions, strats, true);\n  }\n  if (mixins) {\n    mixins.forEach(\n      (m) => mergeOptions(to, m, strats, true)\n    );\n  }\n  for (const key in from) {\n    if (asMixin && key === \"expose\") {\n      !!(process.env.NODE_ENV !== \"production\") && warn(\n        `\"expose\" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`\n      );\n    } else {\n      const strat = internalOptionMergeStrats[key] || strats && strats[key];\n      to[key] = strat ? strat(to[key], from[key]) : from[key];\n    }\n  }\n  return to;\n}\nconst internalOptionMergeStrats = {\n  data: mergeDataFn,\n  props: mergeEmitsOrPropsOptions,\n  emits: mergeEmitsOrPropsOptions,\n  // objects\n  methods: mergeObjectOptions,\n  computed: mergeObjectOptions,\n  // lifecycle\n  beforeCreate: mergeAsArray,\n  created: mergeAsArray,\n  beforeMount: mergeAsArray,\n  mounted: mergeAsArray,\n  beforeUpdate: mergeAsArray,\n  updated: mergeAsArray,\n  beforeDestroy: mergeAsArray,\n  beforeUnmount: mergeAsArray,\n  destroyed: mergeAsArray,\n  unmounted: mergeAsArray,\n  activated: mergeAsArray,\n  deactivated: mergeAsArray,\n  errorCaptured: mergeAsArray,\n  serverPrefetch: mergeAsArray,\n  // assets\n  components: mergeObjectOptions,\n  directives: mergeObjectOptions,\n  // watch\n  watch: mergeWatchOptions,\n  // provide / inject\n  provide: mergeDataFn,\n  inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n  if (!from) {\n    return to;\n  }\n  if (!to) {\n    return from;\n  }\n  return function mergedDataFn() {\n    return (extend)(\n      isFunction(to) ? to.call(this, this) : to,\n      isFunction(from) ? from.call(this, this) : from\n    );\n  };\n}\nfunction mergeInject(to, from) {\n  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n  if (isArray(raw)) {\n    const res = {};\n    for (let i = 0; i < raw.length; i++) {\n      res[raw[i]] = raw[i];\n    }\n    return res;\n  }\n  return raw;\n}\nfunction mergeAsArray(to, from) {\n  return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;\n}\nfunction mergeEmitsOrPropsOptions(to, from) {\n  if (to) {\n    if (isArray(to) && isArray(from)) {\n      return [.../* @__PURE__ */ new Set([...to, ...from])];\n    }\n    return extend(\n      /* @__PURE__ */ Object.create(null),\n      normalizePropsOrEmits(to),\n      normalizePropsOrEmits(from != null ? from : {})\n    );\n  } else {\n    return from;\n  }\n}\nfunction mergeWatchOptions(to, from) {\n  if (!to)\n    return from;\n  if (!from)\n    return to;\n  const merged = extend(/* @__PURE__ */ Object.create(null), to);\n  for (const key in from) {\n    merged[key] = mergeAsArray(to[key], from[key]);\n  }\n  return merged;\n}\n\nfunction createAppContext() {\n  return {\n    app: null,\n    config: {\n      isNativeTag: NO,\n      performance: false,\n      globalProperties: {},\n      optionMergeStrategies: {},\n      errorHandler: void 0,\n      warnHandler: void 0,\n      compilerOptions: {}\n    },\n    mixins: [],\n    components: {},\n    directives: {},\n    provides: /* @__PURE__ */ Object.create(null),\n    optionsCache: /* @__PURE__ */ new WeakMap(),\n    propsCache: /* @__PURE__ */ new WeakMap(),\n    emitsCache: /* @__PURE__ */ new WeakMap()\n  };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n  return function createApp(rootComponent, rootProps = null) {\n    if (!isFunction(rootComponent)) {\n      rootComponent = extend({}, rootComponent);\n    }\n    if (rootProps != null && !isObject(rootProps)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`root props passed to app.mount() must be an object.`);\n      rootProps = null;\n    }\n    const context = createAppContext();\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      Object.defineProperty(context.config, \"unwrapInjectedRef\", {\n        get() {\n          return true;\n        },\n        set() {\n          warn(\n            `app.config.unwrapInjectedRef has been deprecated. 3.3 now alawys unwraps injected refs in Options API.`\n          );\n        }\n      });\n    }\n    const installedPlugins = /* @__PURE__ */ new Set();\n    let isMounted = false;\n    const app = context.app = {\n      _uid: uid$1++,\n      _component: rootComponent,\n      _props: rootProps,\n      _container: null,\n      _context: context,\n      _instance: null,\n      version,\n      get config() {\n        return context.config;\n      },\n      set config(v) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\n            `app.config cannot be replaced. Modify individual options instead.`\n          );\n        }\n      },\n      use(plugin, ...options) {\n        if (installedPlugins.has(plugin)) {\n          !!(process.env.NODE_ENV !== \"production\") && warn(`Plugin has already been applied to target app.`);\n        } else if (plugin && isFunction(plugin.install)) {\n          installedPlugins.add(plugin);\n          plugin.install(app, ...options);\n        } else if (isFunction(plugin)) {\n          installedPlugins.add(plugin);\n          plugin(app, ...options);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\n            `A plugin must either be a function or an object with an \"install\" function.`\n          );\n        }\n        return app;\n      },\n      mixin(mixin) {\n        if (__VUE_OPTIONS_API__) {\n          if (!context.mixins.includes(mixin)) {\n            context.mixins.push(mixin);\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn(\n              \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n            );\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\"Mixins are only available in builds supporting Options API\");\n        }\n        return app;\n      },\n      component(name, component) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateComponentName(name, context.config);\n        }\n        if (!component) {\n          return context.components[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n          warn(`Component \"${name}\" has already been registered in target app.`);\n        }\n        context.components[name] = component;\n        return app;\n      },\n      directive(name, directive) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateDirectiveName(name);\n        }\n        if (!directive) {\n          return context.directives[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n          warn(`Directive \"${name}\" has already been registered in target app.`);\n        }\n        context.directives[name] = directive;\n        return app;\n      },\n      mount(rootContainer, isHydrate, isSVG) {\n        if (!isMounted) {\n          if (!!(process.env.NODE_ENV !== \"production\") && rootContainer.__vue_app__) {\n            warn(\n              `There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling \\`app.unmount()\\` first.`\n            );\n          }\n          const vnode = createVNode(\n            rootComponent,\n            rootProps\n          );\n          vnode.appContext = context;\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            context.reload = () => {\n              render(cloneVNode(vnode), rootContainer, isSVG);\n            };\n          }\n          if (isHydrate && hydrate) {\n            hydrate(vnode, rootContainer);\n          } else {\n            render(vnode, rootContainer, isSVG);\n          }\n          isMounted = true;\n          app._container = rootContainer;\n          rootContainer.__vue_app__ = app;\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = vnode.component;\n            devtoolsInitApp(app, version);\n          }\n          return getExposeProxy(vnode.component) || vnode.component.proxy;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\n            `App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \\`const createMyApp = () => createApp(App)\\``\n          );\n        }\n      },\n      unmount() {\n        if (isMounted) {\n          render(null, app._container);\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = null;\n            devtoolsUnmountApp(app);\n          }\n          delete app._container.__vue_app__;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(`Cannot unmount an app that is not mounted.`);\n        }\n      },\n      provide(key, value) {\n        if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n          warn(\n            `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n          );\n        }\n        context.provides[key] = value;\n        return app;\n      },\n      runWithContext(fn) {\n        currentApp = app;\n        try {\n          return fn();\n        } finally {\n          currentApp = null;\n        }\n      }\n    };\n    return app;\n  };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n  if (!currentInstance) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`provide() can only be used inside setup().`);\n    }\n  } else {\n    let provides = currentInstance.provides;\n    const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n    if (parentProvides === provides) {\n      provides = currentInstance.provides = Object.create(parentProvides);\n    }\n    provides[key] = value;\n  }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n  const instance = currentInstance || currentRenderingInstance;\n  if (instance || currentApp) {\n    const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;\n    if (provides && key in provides) {\n      return provides[key];\n    } else if (arguments.length > 1) {\n      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`injection \"${String(key)}\" not found.`);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(`inject() can only be used inside setup() or functional components.`);\n  }\n}\nfunction hasInjectionContext() {\n  return !!(currentInstance || currentRenderingInstance || currentApp);\n}\n\nfunction initProps(instance, rawProps, isStateful, isSSR = false) {\n  const props = {};\n  const attrs = {};\n  def(attrs, InternalObjectKey, 1);\n  instance.propsDefaults = /* @__PURE__ */ Object.create(null);\n  setFullProps(instance, rawProps, props, attrs);\n  for (const key in instance.propsOptions[0]) {\n    if (!(key in props)) {\n      props[key] = void 0;\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n  if (isStateful) {\n    instance.props = isSSR ? props : shallowReactive(props);\n  } else {\n    if (!instance.type.props) {\n      instance.props = attrs;\n    } else {\n      instance.props = props;\n    }\n  }\n  instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n  while (instance) {\n    if (instance.type.__hmrId)\n      return true;\n    instance = instance.parent;\n  }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n  const {\n    props,\n    attrs,\n    vnode: { patchFlag }\n  } = instance;\n  const rawCurrentProps = toRaw(props);\n  const [options] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  if (\n    // always force full diff in dev\n    // - #1942 if hmr is enabled with sfc component\n    // - vite#872 non-sfc component used by sfc component\n    !(!!(process.env.NODE_ENV !== \"production\") && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)\n  ) {\n    if (patchFlag & 8) {\n      const propsToUpdate = instance.vnode.dynamicProps;\n      for (let i = 0; i < propsToUpdate.length; i++) {\n        let key = propsToUpdate[i];\n        if (isEmitListener(instance.emitsOptions, key)) {\n          continue;\n        }\n        const value = rawProps[key];\n        if (options) {\n          if (hasOwn(attrs, key)) {\n            if (value !== attrs[key]) {\n              attrs[key] = value;\n              hasAttrsChanged = true;\n            }\n          } else {\n            const camelizedKey = camelize(key);\n            props[camelizedKey] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              camelizedKey,\n              value,\n              instance,\n              false\n              /* isAbsent */\n            );\n          }\n        } else {\n          if (value !== attrs[key]) {\n            attrs[key] = value;\n            hasAttrsChanged = true;\n          }\n        }\n      }\n    }\n  } else {\n    if (setFullProps(instance, rawProps, props, attrs)) {\n      hasAttrsChanged = true;\n    }\n    let kebabKey;\n    for (const key in rawCurrentProps) {\n      if (!rawProps || // for camelCase\n      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case\n      // and converted to camelCase (#955)\n      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {\n        if (options) {\n          if (rawPrevProps && // for camelCase\n          (rawPrevProps[key] !== void 0 || // for kebab-case\n          rawPrevProps[kebabKey] !== void 0)) {\n            props[key] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              key,\n              void 0,\n              instance,\n              true\n              /* isAbsent */\n            );\n          }\n        } else {\n          delete props[key];\n        }\n      }\n    }\n    if (attrs !== rawCurrentProps) {\n      for (const key in attrs) {\n        if (!rawProps || !hasOwn(rawProps, key) && true) {\n          delete attrs[key];\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (hasAttrsChanged) {\n    trigger(instance, \"set\", \"$attrs\");\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n  const [options, needCastKeys] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  let rawCastValues;\n  if (rawProps) {\n    for (let key in rawProps) {\n      if (isReservedProp(key)) {\n        continue;\n      }\n      const value = rawProps[key];\n      let camelKey;\n      if (options && hasOwn(options, camelKey = camelize(key))) {\n        if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n          props[camelKey] = value;\n        } else {\n          (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n        }\n      } else if (!isEmitListener(instance.emitsOptions, key)) {\n        if (!(key in attrs) || value !== attrs[key]) {\n          attrs[key] = value;\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (needCastKeys) {\n    const rawCurrentProps = toRaw(props);\n    const castValues = rawCastValues || EMPTY_OBJ;\n    for (let i = 0; i < needCastKeys.length; i++) {\n      const key = needCastKeys[i];\n      props[key] = resolvePropValue(\n        options,\n        rawCurrentProps,\n        key,\n        castValues[key],\n        instance,\n        !hasOwn(castValues, key)\n      );\n    }\n  }\n  return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n  const opt = options[key];\n  if (opt != null) {\n    const hasDefault = hasOwn(opt, \"default\");\n    if (hasDefault && value === void 0) {\n      const defaultValue = opt.default;\n      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {\n        const { propsDefaults } = instance;\n        if (key in propsDefaults) {\n          value = propsDefaults[key];\n        } else {\n          setCurrentInstance(instance);\n          value = propsDefaults[key] = defaultValue.call(\n            null,\n            props\n          );\n          unsetCurrentInstance();\n        }\n      } else {\n        value = defaultValue;\n      }\n    }\n    if (opt[0 /* shouldCast */]) {\n      if (isAbsent && !hasDefault) {\n        value = false;\n      } else if (opt[1 /* shouldCastTrue */] && (value === \"\" || value === hyphenate(key))) {\n        value = true;\n      }\n    }\n  }\n  return value;\n}\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n  const cache = appContext.propsCache;\n  const cached = cache.get(comp);\n  if (cached) {\n    return cached;\n  }\n  const raw = comp.props;\n  const normalized = {};\n  const needCastKeys = [];\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendProps = (raw2) => {\n      hasExtends = true;\n      const [props, keys] = normalizePropsOptions(raw2, appContext, true);\n      extend(normalized, props);\n      if (keys)\n        needCastKeys.push(...keys);\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendProps);\n    }\n    if (comp.extends) {\n      extendProps(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendProps);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, EMPTY_ARR);\n    }\n    return EMPTY_ARR;\n  }\n  if (isArray(raw)) {\n    for (let i = 0; i < raw.length; i++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !isString(raw[i])) {\n        warn(`props must be strings when using array syntax.`, raw[i]);\n      }\n      const normalizedKey = camelize(raw[i]);\n      if (validatePropName(normalizedKey)) {\n        normalized[normalizedKey] = EMPTY_OBJ;\n      }\n    }\n  } else if (raw) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isObject(raw)) {\n      warn(`invalid props options`, raw);\n    }\n    for (const key in raw) {\n      const normalizedKey = camelize(key);\n      if (validatePropName(normalizedKey)) {\n        const opt = raw[key];\n        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);\n        if (prop) {\n          const booleanIndex = getTypeIndex(Boolean, prop.type);\n          const stringIndex = getTypeIndex(String, prop.type);\n          prop[0 /* shouldCast */] = booleanIndex > -1;\n          prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex;\n          if (booleanIndex > -1 || hasOwn(prop, \"default\")) {\n            needCastKeys.push(normalizedKey);\n          }\n        }\n      }\n    }\n  }\n  const res = [normalized, needCastKeys];\n  if (isObject(comp)) {\n    cache.set(comp, res);\n  }\n  return res;\n}\nfunction validatePropName(key) {\n  if (key[0] !== \"$\") {\n    return true;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(`Invalid prop name: \"${key}\" is a reserved property.`);\n  }\n  return false;\n}\nfunction getType(ctor) {\n  const match = ctor && ctor.toString().match(/^\\s*(function|class) (\\w+)/);\n  return match ? match[2] : ctor === null ? \"null\" : \"\";\n}\nfunction isSameType(a, b) {\n  return getType(a) === getType(b);\n}\nfunction getTypeIndex(type, expectedTypes) {\n  if (isArray(expectedTypes)) {\n    return expectedTypes.findIndex((t) => isSameType(t, type));\n  } else if (isFunction(expectedTypes)) {\n    return isSameType(expectedTypes, type) ? 0 : -1;\n  }\n  return -1;\n}\nfunction validateProps(rawProps, props, instance) {\n  const resolvedValues = toRaw(props);\n  const options = instance.propsOptions[0];\n  for (const key in options) {\n    let opt = options[key];\n    if (opt == null)\n      continue;\n    validateProp(\n      key,\n      resolvedValues[key],\n      opt,\n      !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key))\n    );\n  }\n}\nfunction validateProp(name, value, prop, isAbsent) {\n  const { type, required, validator, skipCheck } = prop;\n  if (required && isAbsent) {\n    warn('Missing required prop: \"' + name + '\"');\n    return;\n  }\n  if (value == null && !required) {\n    return;\n  }\n  if (type != null && type !== true && !skipCheck) {\n    let isValid = false;\n    const types = isArray(type) ? type : [type];\n    const expectedTypes = [];\n    for (let i = 0; i < types.length && !isValid; i++) {\n      const { valid, expectedType } = assertType(value, types[i]);\n      expectedTypes.push(expectedType || \"\");\n      isValid = valid;\n    }\n    if (!isValid) {\n      warn(getInvalidTypeMessage(name, value, expectedTypes));\n      return;\n    }\n  }\n  if (validator && !validator(value)) {\n    warn('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n  }\n}\nconst isSimpleType = /* @__PURE__ */ makeMap(\n  \"String,Number,Boolean,Function,Symbol,BigInt\"\n);\nfunction assertType(value, type) {\n  let valid;\n  const expectedType = getType(type);\n  if (isSimpleType(expectedType)) {\n    const t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    if (!valid && t === \"object\") {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === \"Object\") {\n    valid = isObject(value);\n  } else if (expectedType === \"Array\") {\n    valid = isArray(value);\n  } else if (expectedType === \"null\") {\n    valid = value === null;\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid,\n    expectedType\n  };\n}\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n  let message = `Invalid prop: type check failed for prop \"${name}\". Expected ${expectedTypes.map(capitalize).join(\" | \")}`;\n  const expectedType = expectedTypes[0];\n  const receivedType = toRawType(value);\n  const expectedValue = styleValue(value, expectedType);\n  const receivedValue = styleValue(value, receivedType);\n  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {\n    message += ` with value ${expectedValue}`;\n  }\n  message += `, got ${receivedType} `;\n  if (isExplicable(receivedType)) {\n    message += `with value ${receivedValue}.`;\n  }\n  return message;\n}\nfunction styleValue(value, type) {\n  if (type === \"String\") {\n    return `\"${value}\"`;\n  } else if (type === \"Number\") {\n    return `${Number(value)}`;\n  } else {\n    return `${value}`;\n  }\n}\nfunction isExplicable(type) {\n  const explicitTypes = [\"string\", \"number\", \"boolean\"];\n  return explicitTypes.some((elem) => type.toLowerCase() === elem);\n}\nfunction isBoolean(...args) {\n  return args.some((elem) => elem.toLowerCase() === \"boolean\");\n}\n\nconst isInternalKey = (key) => key[0] === \"_\" || key === \"$stable\";\nconst normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n  if (rawSlot._n) {\n    return rawSlot;\n  }\n  const normalized = withCtx((...args) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && currentInstance) {\n      warn(\n        `Slot \"${key}\" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`\n      );\n    }\n    return normalizeSlotValue(rawSlot(...args));\n  }, ctx);\n  normalized._c = false;\n  return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n  const ctx = rawSlots._ctx;\n  for (const key in rawSlots) {\n    if (isInternalKey(key))\n      continue;\n    const value = rawSlots[key];\n    if (isFunction(value)) {\n      slots[key] = normalizeSlot(key, value, ctx);\n    } else if (value != null) {\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        warn(\n          `Non-function value encountered for slot \"${key}\". Prefer function slots for better performance.`\n        );\n      }\n      const normalized = normalizeSlotValue(value);\n      slots[key] = () => normalized;\n    }\n  }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isKeepAlive(instance.vnode) && true) {\n    warn(\n      `Non-function value encountered for default slot. Prefer function slots for better performance.`\n    );\n  }\n  const normalized = normalizeSlotValue(children);\n  instance.slots.default = () => normalized;\n};\nconst initSlots = (instance, children) => {\n  if (instance.vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      instance.slots = toRaw(children);\n      def(children, \"_\", type);\n    } else {\n      normalizeObjectSlots(\n        children,\n        instance.slots = {});\n    }\n  } else {\n    instance.slots = {};\n    if (children) {\n      normalizeVNodeSlots(instance, children);\n    }\n  }\n  def(instance.slots, InternalObjectKey, 1);\n};\nconst updateSlots = (instance, children, optimized) => {\n  const { vnode, slots } = instance;\n  let needDeletionCheck = true;\n  let deletionComparisonTarget = EMPTY_OBJ;\n  if (vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n        extend(slots, children);\n        trigger(instance, \"set\", \"$slots\");\n      } else if (optimized && type === 1) {\n        needDeletionCheck = false;\n      } else {\n        extend(slots, children);\n        if (!optimized && type === 1) {\n          delete slots._;\n        }\n      }\n    } else {\n      needDeletionCheck = !children.$stable;\n      normalizeObjectSlots(children, slots);\n    }\n    deletionComparisonTarget = children;\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n    deletionComparisonTarget = { default: 1 };\n  }\n  if (needDeletionCheck) {\n    for (const key in slots) {\n      if (!isInternalKey(key) && !(key in deletionComparisonTarget)) {\n        delete slots[key];\n      }\n    }\n  }\n};\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n  if (isArray(rawRef)) {\n    rawRef.forEach(\n      (r, i) => setRef(\n        r,\n        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n        parentSuspense,\n        vnode,\n        isUnmount\n      )\n    );\n    return;\n  }\n  if (isAsyncWrapper(vnode) && !isUnmount) {\n    return;\n  }\n  const refValue = vnode.shapeFlag & 4 ? getExposeProxy(vnode.component) || vnode.component.proxy : vnode.el;\n  const value = isUnmount ? null : refValue;\n  const { i: owner, r: ref } = rawRef;\n  if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n    warn(\n      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n    );\n    return;\n  }\n  const oldRef = oldRawRef && oldRawRef.r;\n  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n  const setupState = owner.setupState;\n  if (oldRef != null && oldRef !== ref) {\n    if (isString(oldRef)) {\n      refs[oldRef] = null;\n      if (hasOwn(setupState, oldRef)) {\n        setupState[oldRef] = null;\n      }\n    } else if (isRef(oldRef)) {\n      oldRef.value = null;\n    }\n  }\n  if (isFunction(ref)) {\n    callWithErrorHandling(ref, owner, 12, [value, refs]);\n  } else {\n    const _isString = isString(ref);\n    const _isRef = isRef(ref);\n    if (_isString || _isRef) {\n      const doSet = () => {\n        if (rawRef.f) {\n          const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;\n          if (isUnmount) {\n            isArray(existing) && remove(existing, refValue);\n          } else {\n            if (!isArray(existing)) {\n              if (_isString) {\n                refs[ref] = [refValue];\n                if (hasOwn(setupState, ref)) {\n                  setupState[ref] = refs[ref];\n                }\n              } else {\n                ref.value = [refValue];\n                if (rawRef.k)\n                  refs[rawRef.k] = ref.value;\n              }\n            } else if (!existing.includes(refValue)) {\n              existing.push(refValue);\n            }\n          }\n        } else if (_isString) {\n          refs[ref] = value;\n          if (hasOwn(setupState, ref)) {\n            setupState[ref] = value;\n          }\n        } else if (_isRef) {\n          ref.value = value;\n          if (rawRef.k)\n            refs[rawRef.k] = value;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n        }\n      };\n      if (value) {\n        doSet.id = -1;\n        queuePostRenderEffect(doSet, parentSuspense);\n      } else {\n        doSet();\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n    }\n  }\n}\n\nlet hasMismatch = false;\nconst isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== \"foreignObject\";\nconst isComment = (node) => node.nodeType === 8 /* COMMENT */;\nfunction createHydrationFunctions(rendererInternals) {\n  const {\n    mt: mountComponent,\n    p: patch,\n    o: {\n      patchProp,\n      createText,\n      nextSibling,\n      parentNode,\n      remove,\n      insert,\n      createComment\n    }\n  } = rendererInternals;\n  const hydrate = (vnode, container) => {\n    if (!container.hasChildNodes()) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(\n        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n      );\n      patch(null, vnode, container);\n      flushPostFlushCbs();\n      container._vnode = vnode;\n      return;\n    }\n    hasMismatch = false;\n    hydrateNode(container.firstChild, vnode, null, null, null);\n    flushPostFlushCbs();\n    container._vnode = vnode;\n    if (hasMismatch && true) {\n      console.error(`Hydration completed but contains mismatches.`);\n    }\n  };\n  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n    const isFragmentStart = isComment(node) && node.data === \"[\";\n    const onMismatch = () => handleMismatch(\n      node,\n      vnode,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      isFragmentStart\n    );\n    const { type, ref, shapeFlag, patchFlag } = vnode;\n    let domType = node.nodeType;\n    vnode.el = node;\n    if (patchFlag === -2) {\n      optimized = false;\n      vnode.dynamicChildren = null;\n    }\n    let nextNode = null;\n    switch (type) {\n      case Text:\n        if (domType !== 3 /* TEXT */) {\n          if (vnode.children === \"\") {\n            insert(vnode.el = createText(\"\"), parentNode(node), node);\n            nextNode = node;\n          } else {\n            nextNode = onMismatch();\n          }\n        } else {\n          if (node.data !== vnode.children) {\n            hasMismatch = true;\n            !!(process.env.NODE_ENV !== \"production\") && warn(\n              `Hydration text mismatch:\n- Client: ${JSON.stringify(node.data)}\n- Server: ${JSON.stringify(vnode.children)}`\n            );\n            node.data = vnode.children;\n          }\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Comment:\n        if (domType !== 8 /* COMMENT */ || isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Static:\n        if (isFragmentStart) {\n          node = nextSibling(node);\n          domType = node.nodeType;\n        }\n        if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {\n          nextNode = node;\n          const needToAdoptContent = !vnode.children.length;\n          for (let i = 0; i < vnode.staticCount; i++) {\n            if (needToAdoptContent)\n              vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;\n            if (i === vnode.staticCount - 1) {\n              vnode.anchor = nextNode;\n            }\n            nextNode = nextSibling(nextNode);\n          }\n          return isFragmentStart ? nextSibling(nextNode) : nextNode;\n        } else {\n          onMismatch();\n        }\n        break;\n      case Fragment:\n        if (!isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = hydrateFragment(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            slotScopeIds,\n            optimized\n          );\n        }\n        break;\n      default:\n        if (shapeFlag & 1) {\n          if (domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = hydrateElement(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized\n            );\n          }\n        } else if (shapeFlag & 6) {\n          vnode.slotScopeIds = slotScopeIds;\n          const container = parentNode(node);\n          mountComponent(\n            vnode,\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            isSVGContainer(container),\n            optimized\n          );\n          nextNode = isFragmentStart ? locateClosingAsyncAnchor(node) : nextSibling(node);\n          if (nextNode && isComment(nextNode) && nextNode.data === \"teleport end\") {\n            nextNode = nextSibling(nextNode);\n          }\n          if (isAsyncWrapper(vnode)) {\n            let subTree;\n            if (isFragmentStart) {\n              subTree = createVNode(Fragment);\n              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n            } else {\n              subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n            }\n            subTree.el = node;\n            vnode.component.subTree = subTree;\n          }\n        } else if (shapeFlag & 64) {\n          if (domType !== 8 /* COMMENT */) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = vnode.type.hydrate(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized,\n              rendererInternals,\n              hydrateChildren\n            );\n          }\n        } else if (shapeFlag & 128) {\n          nextNode = vnode.type.hydrate(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            isSVGContainer(parentNode(node)),\n            slotScopeIds,\n            optimized,\n            rendererInternals,\n            hydrateNode\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode);\n    }\n    return nextNode;\n  };\n  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const { type, props, patchFlag, shapeFlag, dirs } = vnode;\n    const forcePatchValue = type === \"input\" && dirs || type === \"option\";\n    if (!!(process.env.NODE_ENV !== \"production\") || forcePatchValue || patchFlag !== -1) {\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n      }\n      if (props) {\n        if (forcePatchValue || !optimized || patchFlag & (16 | 32)) {\n          for (const key in props) {\n            if (forcePatchValue && key.endsWith(\"value\") || isOn(key) && !isReservedProp(key)) {\n              patchProp(\n                el,\n                key,\n                null,\n                props[key],\n                false,\n                void 0,\n                parentComponent\n              );\n            }\n          }\n        } else if (props.onClick) {\n          patchProp(\n            el,\n            \"onClick\",\n            null,\n            props.onClick,\n            false,\n            void 0,\n            parentComponent\n          );\n        }\n      }\n      let vnodeHooks;\n      if (vnodeHooks = props && props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n      }\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n      }\n      if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {\n        queueEffectWithSuspense(() => {\n          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n          dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n        }, parentSuspense);\n      }\n      if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n      !(props && (props.innerHTML || props.textContent))) {\n        let next = hydrateChildren(\n          el.firstChild,\n          vnode,\n          el,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        let hasWarned = false;\n        while (next) {\n          hasMismatch = true;\n          if (!!(process.env.NODE_ENV !== \"production\") && !hasWarned) {\n            warn(\n              `Hydration children mismatch in <${vnode.type}>: server rendered element contains more child nodes than client vdom.`\n            );\n            hasWarned = true;\n          }\n          const cur = next;\n          next = next.nextSibling;\n          remove(cur);\n        }\n      } else if (shapeFlag & 8) {\n        if (el.textContent !== vnode.children) {\n          hasMismatch = true;\n          !!(process.env.NODE_ENV !== \"production\") && warn(\n            `Hydration text content mismatch in <${vnode.type}>:\n- Client: ${el.textContent}\n- Server: ${vnode.children}`\n          );\n          el.textContent = vnode.children;\n        }\n      }\n    }\n    return el.nextSibling;\n  };\n  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!parentVNode.dynamicChildren;\n    const children = parentVNode.children;\n    const l = children.length;\n    let hasWarned = false;\n    for (let i = 0; i < l; i++) {\n      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n      if (node) {\n        node = hydrateNode(\n          node,\n          vnode,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      } else if (vnode.type === Text && !vnode.children) {\n        continue;\n      } else {\n        hasMismatch = true;\n        if (!!(process.env.NODE_ENV !== \"production\") && !hasWarned) {\n          warn(\n            `Hydration children mismatch in <${container.tagName.toLowerCase()}>: server rendered element contains fewer child nodes than client vdom.`\n          );\n          hasWarned = true;\n        }\n        patch(\n          null,\n          vnode,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          isSVGContainer(container),\n          slotScopeIds\n        );\n      }\n    }\n    return node;\n  };\n  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    const container = parentNode(node);\n    const next = hydrateChildren(\n      nextSibling(node),\n      vnode,\n      container,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      optimized\n    );\n    if (next && isComment(next) && next.data === \"]\") {\n      return nextSibling(vnode.anchor = next);\n    } else {\n      hasMismatch = true;\n      insert(vnode.anchor = createComment(`]`), container, next);\n      return next;\n    }\n  };\n  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n    hasMismatch = true;\n    !!(process.env.NODE_ENV !== \"production\") && warn(\n      `Hydration node mismatch:\n- Client vnode:`,\n      vnode.type,\n      `\n- Server rendered DOM:`,\n      node,\n      node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``\n    );\n    vnode.el = null;\n    if (isFragment) {\n      const end = locateClosingAsyncAnchor(node);\n      while (true) {\n        const next2 = nextSibling(node);\n        if (next2 && next2 !== end) {\n          remove(next2);\n        } else {\n          break;\n        }\n      }\n    }\n    const next = nextSibling(node);\n    const container = parentNode(node);\n    remove(node);\n    patch(\n      null,\n      vnode,\n      container,\n      next,\n      parentComponent,\n      parentSuspense,\n      isSVGContainer(container),\n      slotScopeIds\n    );\n    return next;\n  };\n  const locateClosingAsyncAnchor = (node) => {\n    let match = 0;\n    while (node) {\n      node = nextSibling(node);\n      if (node && isComment(node)) {\n        if (node.data === \"[\")\n          match++;\n        if (node.data === \"]\") {\n          if (match === 0) {\n            return nextSibling(node);\n          } else {\n            match--;\n          }\n        }\n      }\n    }\n    return node;\n  };\n  return [hydrate, hydrateNode];\n}\n\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    perf.mark(`vue-${type}-${instance.uid}`);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction endMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    const startTag = `vue-${type}-${instance.uid}`;\n    const endTag = startTag + `:end`;\n    perf.mark(endTag);\n    perf.measure(\n      `<${formatComponentName(instance, instance.type)}> ${type}`,\n      startTag,\n      endTag\n    );\n    perf.clearMarks(startTag);\n    perf.clearMarks(endTag);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction isSupported() {\n  if (supported !== void 0) {\n    return supported;\n  }\n  if (typeof window !== \"undefined\" && window.performance) {\n    supported = true;\n    perf = window.performance;\n  } else {\n    supported = false;\n  }\n  return supported;\n}\n\nfunction initFeatureFlags() {\n  const needWarn = [];\n  if (typeof __VUE_OPTIONS_API__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_OPTIONS_API__`);\n    getGlobalThis().__VUE_OPTIONS_API__ = true;\n  }\n  if (typeof __VUE_PROD_DEVTOOLS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_DEVTOOLS__`);\n    getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && needWarn.length) {\n    const multi = needWarn.length > 1;\n    console.warn(\n      `Feature flag${multi ? `s` : ``} ${needWarn.join(\", \")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.\n\nFor more details, see https://link.vuejs.org/feature-flags.`\n    );\n  }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense ;\nfunction createRenderer(options) {\n  return baseCreateRenderer(options);\n}\nfunction createHydrationRenderer(options) {\n  return baseCreateRenderer(options, createHydrationFunctions);\n}\nfunction baseCreateRenderer(options, createHydrationFns) {\n  {\n    initFeatureFlags();\n  }\n  const target = getGlobalThis();\n  target.__VUE__ = true;\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n  }\n  const {\n    insert: hostInsert,\n    remove: hostRemove,\n    patchProp: hostPatchProp,\n    createElement: hostCreateElement,\n    createText: hostCreateText,\n    createComment: hostCreateComment,\n    setText: hostSetText,\n    setElementText: hostSetElementText,\n    parentNode: hostParentNode,\n    nextSibling: hostNextSibling,\n    setScopeId: hostSetScopeId = NOOP,\n    insertStaticContent: hostInsertStaticContent\n  } = options;\n  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, slotScopeIds = null, optimized = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n    if (n1 === n2) {\n      return;\n    }\n    if (n1 && !isSameVNodeType(n1, n2)) {\n      anchor = getNextHostNode(n1);\n      unmount(n1, parentComponent, parentSuspense, true);\n      n1 = null;\n    }\n    if (n2.patchFlag === -2) {\n      optimized = false;\n      n2.dynamicChildren = null;\n    }\n    const { type, ref, shapeFlag } = n2;\n    switch (type) {\n      case Text:\n        processText(n1, n2, container, anchor);\n        break;\n      case Comment:\n        processCommentNode(n1, n2, container, anchor);\n        break;\n      case Static:\n        if (n1 == null) {\n          mountStaticNode(n2, container, anchor, isSVG);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          patchStaticNode(n1, n2, container, isSVG);\n        }\n        break;\n      case Fragment:\n        processFragment(\n          n1,\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        break;\n      default:\n        if (shapeFlag & 1) {\n          processElement(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 6) {\n          processComponent(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 64) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (shapeFlag & 128) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(\"Invalid VNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null && parentComponent) {\n      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n    }\n  };\n  const processText = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateText(n2.children),\n        container,\n        anchor\n      );\n    } else {\n      const el = n2.el = n1.el;\n      if (n2.children !== n1.children) {\n        hostSetText(el, n2.children);\n      }\n    }\n  };\n  const processCommentNode = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateComment(n2.children || \"\"),\n        container,\n        anchor\n      );\n    } else {\n      n2.el = n1.el;\n    }\n  };\n  const mountStaticNode = (n2, container, anchor, isSVG) => {\n    [n2.el, n2.anchor] = hostInsertStaticContent(\n      n2.children,\n      container,\n      anchor,\n      isSVG,\n      n2.el,\n      n2.anchor\n    );\n  };\n  const patchStaticNode = (n1, n2, container, isSVG) => {\n    if (n2.children !== n1.children) {\n      const anchor = hostNextSibling(n1.anchor);\n      removeStaticNode(n1);\n      [n2.el, n2.anchor] = hostInsertStaticContent(\n        n2.children,\n        container,\n        anchor,\n        isSVG\n      );\n    } else {\n      n2.el = n1.el;\n      n2.anchor = n1.anchor;\n    }\n  };\n  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostInsert(el, container, nextSibling);\n      el = next;\n    }\n    hostInsert(anchor, container, nextSibling);\n  };\n  const removeStaticNode = ({ el, anchor }) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostRemove(el);\n      el = next;\n    }\n    hostRemove(anchor);\n  };\n  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    isSVG = isSVG || n2.type === \"svg\";\n    if (n1 == null) {\n      mountElement(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      patchElement(\n        n1,\n        n2,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    let el;\n    let vnodeHook;\n    const { type, props, shapeFlag, transition, dirs } = vnode;\n    el = vnode.el = hostCreateElement(\n      vnode.type,\n      isSVG,\n      props && props.is,\n      props\n    );\n    if (shapeFlag & 8) {\n      hostSetElementText(el, vnode.children);\n    } else if (shapeFlag & 16) {\n      mountChildren(\n        vnode.children,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        isSVG && type !== \"foreignObject\",\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n    }\n    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n    if (props) {\n      for (const key in props) {\n        if (key !== \"value\" && !isReservedProp(key)) {\n          hostPatchProp(\n            el,\n            key,\n            null,\n            props[key],\n            isSVG,\n            vnode.children,\n            parentComponent,\n            parentSuspense,\n            unmountChildren\n          );\n        }\n      }\n      if (\"value\" in props) {\n        hostPatchProp(el, \"value\", null, props.value);\n      }\n      if (vnodeHook = props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHook, parentComponent, vnode);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      Object.defineProperty(el, \"__vnode\", {\n        value: vnode,\n        enumerable: false\n      });\n      Object.defineProperty(el, \"__vueParentComponent\", {\n        value: parentComponent,\n        enumerable: false\n      });\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n    }\n    const needCallTransitionHooks = (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;\n    if (needCallTransitionHooks) {\n      transition.beforeEnter(el);\n    }\n    hostInsert(el, container, anchor);\n    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        needCallTransitionHooks && transition.enter(el);\n        dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n      }, parentSuspense);\n    }\n  };\n  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n    if (scopeId) {\n      hostSetScopeId(el, scopeId);\n    }\n    if (slotScopeIds) {\n      for (let i = 0; i < slotScopeIds.length; i++) {\n        hostSetScopeId(el, slotScopeIds[i]);\n      }\n    }\n    if (parentComponent) {\n      let subTree = parentComponent.subTree;\n      if (!!(process.env.NODE_ENV !== \"production\") && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {\n        subTree = filterSingleRoot(subTree.children) || subTree;\n      }\n      if (vnode === subTree) {\n        const parentVNode = parentComponent.vnode;\n        setScopeId(\n          el,\n          parentVNode,\n          parentVNode.scopeId,\n          parentVNode.slotScopeIds,\n          parentComponent.parent\n        );\n      }\n    }\n  };\n  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);\n      patch(\n        null,\n        child,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    const el = n2.el = n1.el;\n    let { patchFlag, dynamicChildren, dirs } = n2;\n    patchFlag |= n1.patchFlag & 16;\n    const oldProps = n1.props || EMPTY_OBJ;\n    const newProps = n2.props || EMPTY_OBJ;\n    let vnodeHook;\n    parentComponent && toggleRecurse(parentComponent, false);\n    if (vnodeHook = newProps.onVnodeBeforeUpdate) {\n      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n    }\n    if (dirs) {\n      invokeDirectiveHook(n2, n1, parentComponent, \"beforeUpdate\");\n    }\n    parentComponent && toggleRecurse(parentComponent, true);\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    const areChildrenSVG = isSVG && n2.type !== \"foreignObject\";\n    if (dynamicChildren) {\n      patchBlockChildren(\n        n1.dynamicChildren,\n        dynamicChildren,\n        el,\n        parentComponent,\n        parentSuspense,\n        areChildrenSVG,\n        slotScopeIds\n      );\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        traverseStaticChildren(n1, n2);\n      }\n    } else if (!optimized) {\n      patchChildren(\n        n1,\n        n2,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        areChildrenSVG,\n        slotScopeIds,\n        false\n      );\n    }\n    if (patchFlag > 0) {\n      if (patchFlag & 16) {\n        patchProps(\n          el,\n          n2,\n          oldProps,\n          newProps,\n          parentComponent,\n          parentSuspense,\n          isSVG\n        );\n      } else {\n        if (patchFlag & 2) {\n          if (oldProps.class !== newProps.class) {\n            hostPatchProp(el, \"class\", null, newProps.class, isSVG);\n          }\n        }\n        if (patchFlag & 4) {\n          hostPatchProp(el, \"style\", oldProps.style, newProps.style, isSVG);\n        }\n        if (patchFlag & 8) {\n          const propsToUpdate = n2.dynamicProps;\n          for (let i = 0; i < propsToUpdate.length; i++) {\n            const key = propsToUpdate[i];\n            const prev = oldProps[key];\n            const next = newProps[key];\n            if (next !== prev || key === \"value\") {\n              hostPatchProp(\n                el,\n                key,\n                prev,\n                next,\n                isSVG,\n                n1.children,\n                parentComponent,\n                parentSuspense,\n                unmountChildren\n              );\n            }\n          }\n        }\n      }\n      if (patchFlag & 1) {\n        if (n1.children !== n2.children) {\n          hostSetElementText(el, n2.children);\n        }\n      }\n    } else if (!optimized && dynamicChildren == null) {\n      patchProps(\n        el,\n        n2,\n        oldProps,\n        newProps,\n        parentComponent,\n        parentSuspense,\n        isSVG\n      );\n    }\n    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n        dirs && invokeDirectiveHook(n2, n1, parentComponent, \"updated\");\n      }, parentSuspense);\n    }\n  };\n  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG, slotScopeIds) => {\n    for (let i = 0; i < newChildren.length; i++) {\n      const oldVNode = oldChildren[i];\n      const newVNode = newChildren[i];\n      const container = (\n        // oldVNode may be an errored async setup() component inside Suspense\n        // which will not have a mounted element\n        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent\n        // of the Fragment itself so it can move its children.\n        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement\n        // which also requires the correct parent container\n        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.\n        oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (\n          // In other cases, the parent container is not actually used so we\n          // just pass the block element here to avoid a DOM parentNode call.\n          fallbackContainer\n        )\n      );\n      patch(\n        oldVNode,\n        newVNode,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        true\n      );\n    }\n  };\n  const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {\n    if (oldProps !== newProps) {\n      if (oldProps !== EMPTY_OBJ) {\n        for (const key in oldProps) {\n          if (!isReservedProp(key) && !(key in newProps)) {\n            hostPatchProp(\n              el,\n              key,\n              oldProps[key],\n              null,\n              isSVG,\n              vnode.children,\n              parentComponent,\n              parentSuspense,\n              unmountChildren\n            );\n          }\n        }\n      }\n      for (const key in newProps) {\n        if (isReservedProp(key))\n          continue;\n        const next = newProps[key];\n        const prev = oldProps[key];\n        if (next !== prev && key !== \"value\") {\n          hostPatchProp(\n            el,\n            key,\n            prev,\n            next,\n            isSVG,\n            vnode.children,\n            parentComponent,\n            parentSuspense,\n            unmountChildren\n          );\n        }\n      }\n      if (\"value\" in newProps) {\n        hostPatchProp(el, \"value\", oldProps.value, newProps.value);\n      }\n    }\n  };\n  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(\"\");\n    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(\"\");\n    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && // #5523 dev root fragment may inherit directives\n    (isHmrUpdating || patchFlag & 2048)) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    if (n1 == null) {\n      hostInsert(fragmentStartAnchor, container, anchor);\n      hostInsert(fragmentEndAnchor, container, anchor);\n      mountChildren(\n        n2.children,\n        container,\n        fragmentEndAnchor,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result\n      // of renderSlot() with no valid children\n      n1.dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          container,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          traverseStaticChildren(n1, n2);\n        } else if (\n          // #2080 if the stable fragment has a key, it's a <template v-for> that may\n          //  get moved around. Make sure all root level vnodes inherit el.\n          // #2134 or if it's a component root, it may also get moved around\n          // as the component is being moved.\n          n2.key != null || parentComponent && n2 === parentComponent.subTree\n        ) {\n          traverseStaticChildren(\n            n1,\n            n2,\n            true\n            /* shallow */\n          );\n        }\n      } else {\n        patchChildren(\n          n1,\n          n2,\n          container,\n          fragmentEndAnchor,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n  };\n  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    n2.slotScopeIds = slotScopeIds;\n    if (n1 == null) {\n      if (n2.shapeFlag & 512) {\n        parentComponent.ctx.activate(\n          n2,\n          container,\n          anchor,\n          isSVG,\n          optimized\n        );\n      } else {\n        mountComponent(\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          optimized\n        );\n      }\n    } else {\n      updateComponent(n1, n2, optimized);\n    }\n  };\n  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {\n    const instance = (initialVNode.component = createComponentInstance(\n      initialVNode,\n      parentComponent,\n      parentSuspense\n    ));\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      registerHMR(instance);\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      pushWarningContext(initialVNode);\n      startMeasure(instance, `mount`);\n    }\n    if (isKeepAlive(initialVNode)) {\n      instance.ctx.renderer = internals;\n    }\n    {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        startMeasure(instance, `init`);\n      }\n      setupComponent(instance);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        endMeasure(instance, `init`);\n      }\n    }\n    if (instance.asyncDep) {\n      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);\n      if (!initialVNode.el) {\n        const placeholder = instance.subTree = createVNode(Comment);\n        processCommentNode(null, placeholder, container, anchor);\n      }\n      return;\n    }\n    setupRenderEffect(\n      instance,\n      initialVNode,\n      container,\n      anchor,\n      parentSuspense,\n      isSVG,\n      optimized\n    );\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      popWarningContext();\n      endMeasure(instance, `mount`);\n    }\n  };\n  const updateComponent = (n1, n2, optimized) => {\n    const instance = n2.component = n1.component;\n    if (shouldUpdateComponent(n1, n2, optimized)) {\n      if (instance.asyncDep && !instance.asyncResolved) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(n2);\n        }\n        updateComponentPreRender(instance, n2, optimized);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        return;\n      } else {\n        instance.next = n2;\n        invalidateJob(instance.update);\n        instance.update();\n      }\n    } else {\n      n2.el = n1.el;\n      instance.vnode = n2;\n    }\n  };\n  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {\n    const componentUpdateFn = () => {\n      if (!instance.isMounted) {\n        let vnodeHook;\n        const { el, props } = initialVNode;\n        const { bm, m, parent } = instance;\n        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n        toggleRecurse(instance, false);\n        if (bm) {\n          invokeArrayFns(bm);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {\n          invokeVNodeHook(vnodeHook, parent, initialVNode);\n        }\n        toggleRecurse(instance, true);\n        if (el && hydrateNode) {\n          const hydrateSubTree = () => {\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `render`);\n            }\n            instance.subTree = renderComponentRoot(instance);\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `render`);\n            }\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `hydrate`);\n            }\n            hydrateNode(\n              el,\n              instance.subTree,\n              instance,\n              parentSuspense,\n              null\n            );\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `hydrate`);\n            }\n          };\n          if (isAsyncWrapperVNode) {\n            initialVNode.type.__asyncLoader().then(\n              // note: we are moving the render call into an async callback,\n              // which means it won't track dependencies - but it's ok because\n              // a server-rendered async wrapper is already in resolved state\n              // and it will never need to change.\n              () => !instance.isUnmounted && hydrateSubTree()\n            );\n          } else {\n            hydrateSubTree();\n          }\n        } else {\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `render`);\n          }\n          const subTree = instance.subTree = renderComponentRoot(instance);\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `render`);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `patch`);\n          }\n          patch(\n            null,\n            subTree,\n            container,\n            anchor,\n            instance,\n            parentSuspense,\n            isSVG\n          );\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `patch`);\n          }\n          initialVNode.el = subTree.el;\n        }\n        if (m) {\n          queuePostRenderEffect(m, parentSuspense);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {\n          const scopedInitialVNode = initialVNode;\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),\n            parentSuspense\n          );\n        }\n        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {\n          instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n        }\n        instance.isMounted = true;\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentAdded(instance);\n        }\n        initialVNode = container = anchor = null;\n      } else {\n        let { next, bu, u, parent, vnode } = instance;\n        let originNext = next;\n        let vnodeHook;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(next || instance.vnode);\n        }\n        toggleRecurse(instance, false);\n        if (next) {\n          next.el = vnode.el;\n          updateComponentPreRender(instance, next, optimized);\n        } else {\n          next = vnode;\n        }\n        if (bu) {\n          invokeArrayFns(bu);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {\n          invokeVNodeHook(vnodeHook, parent, next, vnode);\n        }\n        toggleRecurse(instance, true);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `render`);\n        }\n        const nextTree = renderComponentRoot(instance);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `render`);\n        }\n        const prevTree = instance.subTree;\n        instance.subTree = nextTree;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `patch`);\n        }\n        patch(\n          prevTree,\n          nextTree,\n          // parent may have changed if it's in a teleport\n          hostParentNode(prevTree.el),\n          // anchor may have changed if it's in a fragment\n          getNextHostNode(prevTree),\n          instance,\n          parentSuspense,\n          isSVG\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `patch`);\n        }\n        next.el = nextTree.el;\n        if (originNext === null) {\n          updateHOCHostEl(instance, nextTree.el);\n        }\n        if (u) {\n          queuePostRenderEffect(u, parentSuspense);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeUpdated) {\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, next, vnode),\n            parentSuspense\n          );\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentUpdated(instance);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n      }\n    };\n    const effect = instance.effect = new ReactiveEffect(\n      componentUpdateFn,\n      () => queueJob(update),\n      instance.scope\n      // track it in component's effect scope\n    );\n    const update = instance.update = () => effect.run();\n    update.id = instance.uid;\n    toggleRecurse(instance, true);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;\n      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;\n      update.ownerInstance = instance;\n    }\n    update();\n  };\n  const updateComponentPreRender = (instance, nextVNode, optimized) => {\n    nextVNode.component = instance;\n    const prevProps = instance.vnode.props;\n    instance.vnode = nextVNode;\n    instance.next = null;\n    updateProps(instance, nextVNode.props, prevProps, optimized);\n    updateSlots(instance, nextVNode.children, optimized);\n    pauseTracking();\n    flushPreFlushCbs();\n    resetTracking();\n  };\n  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized = false) => {\n    const c1 = n1 && n1.children;\n    const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n    const c2 = n2.children;\n    const { patchFlag, shapeFlag } = n2;\n    if (patchFlag > 0) {\n      if (patchFlag & 128) {\n        patchKeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      } else if (patchFlag & 256) {\n        patchUnkeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      }\n    }\n    if (shapeFlag & 8) {\n      if (prevShapeFlag & 16) {\n        unmountChildren(c1, parentComponent, parentSuspense);\n      }\n      if (c2 !== c1) {\n        hostSetElementText(container, c2);\n      }\n    } else {\n      if (prevShapeFlag & 16) {\n        if (shapeFlag & 16) {\n          patchKeyedChildren(\n            c1,\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n        } else {\n          unmountChildren(c1, parentComponent, parentSuspense, true);\n        }\n      } else {\n        if (prevShapeFlag & 8) {\n          hostSetElementText(container, \"\");\n        }\n        if (shapeFlag & 16) {\n          mountChildren(\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n        }\n      }\n    }\n  };\n  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    c1 = c1 || EMPTY_ARR;\n    c2 = c2 || EMPTY_ARR;\n    const oldLength = c1.length;\n    const newLength = c2.length;\n    const commonLength = Math.min(oldLength, newLength);\n    let i;\n    for (i = 0; i < commonLength; i++) {\n      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      patch(\n        c1[i],\n        nextChild,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (oldLength > newLength) {\n      unmountChildren(\n        c1,\n        parentComponent,\n        parentSuspense,\n        true,\n        false,\n        commonLength\n      );\n    } else {\n      mountChildren(\n        c2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        isSVG,\n        slotScopeIds,\n        optimized,\n        commonLength\n      );\n    }\n  };\n  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n    let i = 0;\n    const l2 = c2.length;\n    let e1 = c1.length - 1;\n    let e2 = l2 - 1;\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[i];\n      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      i++;\n    }\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[e1];\n      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      e1--;\n      e2--;\n    }\n    if (i > e1) {\n      if (i <= e2) {\n        const nextPos = e2 + 1;\n        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n        while (i <= e2) {\n          patch(\n            null,\n            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n          i++;\n        }\n      }\n    } else if (i > e2) {\n      while (i <= e1) {\n        unmount(c1[i], parentComponent, parentSuspense, true);\n        i++;\n      }\n    } else {\n      const s1 = i;\n      const s2 = i;\n      const keyToNewIndexMap = /* @__PURE__ */ new Map();\n      for (i = s2; i <= e2; i++) {\n        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n        if (nextChild.key != null) {\n          if (!!(process.env.NODE_ENV !== \"production\") && keyToNewIndexMap.has(nextChild.key)) {\n            warn(\n              `Duplicate keys found during update:`,\n              JSON.stringify(nextChild.key),\n              `Make sure keys are unique.`\n            );\n          }\n          keyToNewIndexMap.set(nextChild.key, i);\n        }\n      }\n      let j;\n      let patched = 0;\n      const toBePatched = e2 - s2 + 1;\n      let moved = false;\n      let maxNewIndexSoFar = 0;\n      const newIndexToOldIndexMap = new Array(toBePatched);\n      for (i = 0; i < toBePatched; i++)\n        newIndexToOldIndexMap[i] = 0;\n      for (i = s1; i <= e1; i++) {\n        const prevChild = c1[i];\n        if (patched >= toBePatched) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n          continue;\n        }\n        let newIndex;\n        if (prevChild.key != null) {\n          newIndex = keyToNewIndexMap.get(prevChild.key);\n        } else {\n          for (j = s2; j <= e2; j++) {\n            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {\n              newIndex = j;\n              break;\n            }\n          }\n        }\n        if (newIndex === void 0) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n        } else {\n          newIndexToOldIndexMap[newIndex - s2] = i + 1;\n          if (newIndex >= maxNewIndexSoFar) {\n            maxNewIndexSoFar = newIndex;\n          } else {\n            moved = true;\n          }\n          patch(\n            prevChild,\n            c2[newIndex],\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n          patched++;\n        }\n      }\n      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;\n      j = increasingNewIndexSequence.length - 1;\n      for (i = toBePatched - 1; i >= 0; i--) {\n        const nextIndex = s2 + i;\n        const nextChild = c2[nextIndex];\n        const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;\n        if (newIndexToOldIndexMap[i] === 0) {\n          patch(\n            null,\n            nextChild,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n        } else if (moved) {\n          if (j < 0 || i !== increasingNewIndexSequence[j]) {\n            move(nextChild, container, anchor, 2);\n          } else {\n            j--;\n          }\n        }\n      }\n    }\n  };\n  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n    const { el, type, transition, children, shapeFlag } = vnode;\n    if (shapeFlag & 6) {\n      move(vnode.component.subTree, container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 128) {\n      vnode.suspense.move(container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 64) {\n      type.move(vnode, container, anchor, internals);\n      return;\n    }\n    if (type === Fragment) {\n      hostInsert(el, container, anchor);\n      for (let i = 0; i < children.length; i++) {\n        move(children[i], container, anchor, moveType);\n      }\n      hostInsert(vnode.anchor, container, anchor);\n      return;\n    }\n    if (type === Static) {\n      moveStaticNode(vnode, container, anchor);\n      return;\n    }\n    const needTransition = moveType !== 2 && shapeFlag & 1 && transition;\n    if (needTransition) {\n      if (moveType === 0) {\n        transition.beforeEnter(el);\n        hostInsert(el, container, anchor);\n        queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n      } else {\n        const { leave, delayLeave, afterLeave } = transition;\n        const remove2 = () => hostInsert(el, container, anchor);\n        const performLeave = () => {\n          leave(el, () => {\n            remove2();\n            afterLeave && afterLeave();\n          });\n        };\n        if (delayLeave) {\n          delayLeave(el, remove2, performLeave);\n        } else {\n          performLeave();\n        }\n      }\n    } else {\n      hostInsert(el, container, anchor);\n    }\n  };\n  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n    const {\n      type,\n      props,\n      ref,\n      children,\n      dynamicChildren,\n      shapeFlag,\n      patchFlag,\n      dirs\n    } = vnode;\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode, true);\n    }\n    if (shapeFlag & 256) {\n      parentComponent.ctx.deactivate(vnode);\n      return;\n    }\n    const shouldInvokeDirs = shapeFlag & 1 && dirs;\n    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n    let vnodeHook;\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n      invokeVNodeHook(vnodeHook, parentComponent, vnode);\n    }\n    if (shapeFlag & 6) {\n      unmountComponent(vnode.component, parentSuspense, doRemove);\n    } else {\n      if (shapeFlag & 128) {\n        vnode.suspense.unmount(parentSuspense, doRemove);\n        return;\n      }\n      if (shouldInvokeDirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeUnmount\");\n      }\n      if (shapeFlag & 64) {\n        vnode.type.remove(\n          vnode,\n          parentComponent,\n          parentSuspense,\n          optimized,\n          internals,\n          doRemove\n        );\n      } else if (dynamicChildren && // #1153: fast path should not be taken for non-stable (v-for) fragments\n      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {\n        unmountChildren(\n          dynamicChildren,\n          parentComponent,\n          parentSuspense,\n          false,\n          true\n        );\n      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {\n        unmountChildren(children, parentComponent, parentSuspense);\n      }\n      if (doRemove) {\n        remove(vnode);\n      }\n    }\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, \"unmounted\");\n      }, parentSuspense);\n    }\n  };\n  const remove = (vnode) => {\n    const { type, el, anchor, transition } = vnode;\n    if (type === Fragment) {\n      if (!!(process.env.NODE_ENV !== \"production\") && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {\n        vnode.children.forEach((child) => {\n          if (child.type === Comment) {\n            hostRemove(child.el);\n          } else {\n            remove(child);\n          }\n        });\n      } else {\n        removeFragment(el, anchor);\n      }\n      return;\n    }\n    if (type === Static) {\n      removeStaticNode(vnode);\n      return;\n    }\n    const performRemove = () => {\n      hostRemove(el);\n      if (transition && !transition.persisted && transition.afterLeave) {\n        transition.afterLeave();\n      }\n    };\n    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {\n      const { leave, delayLeave } = transition;\n      const performLeave = () => leave(el, performRemove);\n      if (delayLeave) {\n        delayLeave(vnode.el, performRemove, performLeave);\n      } else {\n        performLeave();\n      }\n    } else {\n      performRemove();\n    }\n  };\n  const removeFragment = (cur, end) => {\n    let next;\n    while (cur !== end) {\n      next = hostNextSibling(cur);\n      hostRemove(cur);\n      cur = next;\n    }\n    hostRemove(end);\n  };\n  const unmountComponent = (instance, parentSuspense, doRemove) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      unregisterHMR(instance);\n    }\n    const { bum, scope, update, subTree, um } = instance;\n    if (bum) {\n      invokeArrayFns(bum);\n    }\n    scope.stop();\n    if (update) {\n      update.active = false;\n      unmount(subTree, instance, parentSuspense, doRemove);\n    }\n    if (um) {\n      queuePostRenderEffect(um, parentSuspense);\n    }\n    queuePostRenderEffect(() => {\n      instance.isUnmounted = true;\n    }, parentSuspense);\n    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {\n      parentSuspense.deps--;\n      if (parentSuspense.deps === 0) {\n        parentSuspense.resolve();\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentRemoved(instance);\n    }\n  };\n  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n    }\n  };\n  const getNextHostNode = (vnode) => {\n    if (vnode.shapeFlag & 6) {\n      return getNextHostNode(vnode.component.subTree);\n    }\n    if (vnode.shapeFlag & 128) {\n      return vnode.suspense.next();\n    }\n    return hostNextSibling(vnode.anchor || vnode.el);\n  };\n  const render = (vnode, container, isSVG) => {\n    if (vnode == null) {\n      if (container._vnode) {\n        unmount(container._vnode, null, null, true);\n      }\n    } else {\n      patch(container._vnode || null, vnode, container, null, null, null, isSVG);\n    }\n    flushPreFlushCbs();\n    flushPostFlushCbs();\n    container._vnode = vnode;\n  };\n  const internals = {\n    p: patch,\n    um: unmount,\n    m: move,\n    r: remove,\n    mt: mountComponent,\n    mc: mountChildren,\n    pc: patchChildren,\n    pbc: patchBlockChildren,\n    n: getNextHostNode,\n    o: options\n  };\n  let hydrate;\n  let hydrateNode;\n  if (createHydrationFns) {\n    [hydrate, hydrateNode] = createHydrationFns(\n      internals\n    );\n  }\n  return {\n    render,\n    hydrate,\n    createApp: createAppAPI(render, hydrate)\n  };\n}\nfunction toggleRecurse({ effect, update }, allowed) {\n  effect.allowRecurse = update.allowRecurse = allowed;\n}\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n  const ch1 = n1.children;\n  const ch2 = n2.children;\n  if (isArray(ch1) && isArray(ch2)) {\n    for (let i = 0; i < ch1.length; i++) {\n      const c1 = ch1[i];\n      let c2 = ch2[i];\n      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {\n        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {\n          c2 = ch2[i] = cloneIfMounted(ch2[i]);\n          c2.el = c1.el;\n        }\n        if (!shallow)\n          traverseStaticChildren(c1, c2);\n      }\n      if (c2.type === Text) {\n        c2.el = c1.el;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && c2.type === Comment && !c2.el) {\n        c2.el = c1.el;\n      }\n    }\n  }\n}\nfunction getSequence(arr) {\n  const p = arr.slice();\n  const result = [0];\n  let i, j, u, v, c;\n  const len = arr.length;\n  for (i = 0; i < len; i++) {\n    const arrI = arr[i];\n    if (arrI !== 0) {\n      j = result[result.length - 1];\n      if (arr[j] < arrI) {\n        p[i] = j;\n        result.push(i);\n        continue;\n      }\n      u = 0;\n      v = result.length - 1;\n      while (u < v) {\n        c = u + v >> 1;\n        if (arr[result[c]] < arrI) {\n          u = c + 1;\n        } else {\n          v = c;\n        }\n      }\n      if (arrI < arr[result[u]]) {\n        if (u > 0) {\n          p[i] = result[u - 1];\n        }\n        result[u] = i;\n      }\n    }\n  }\n  u = result.length;\n  v = result[u - 1];\n  while (u-- > 0) {\n    result[u] = v;\n    v = p[v];\n  }\n  return result;\n}\n\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst resolveTarget = (props, select) => {\n  const targetSelector = props && props.to;\n  if (isString(targetSelector)) {\n    if (!select) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(\n        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n      );\n      return null;\n    } else {\n      const target = select(targetSelector);\n      if (!target) {\n        !!(process.env.NODE_ENV !== \"production\") && warn(\n          `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n        );\n      }\n      return target;\n    }\n  } else {\n    if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n      warn(`Invalid Teleport target: ${targetSelector}`);\n    }\n    return targetSelector;\n  }\n};\nconst TeleportImpl = {\n  __isTeleport: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals) {\n    const {\n      mc: mountChildren,\n      pc: patchChildren,\n      pbc: patchBlockChildren,\n      o: { insert, querySelector, createText, createComment }\n    } = internals;\n    const disabled = isTeleportDisabled(n2.props);\n    let { shapeFlag, children, dynamicChildren } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (n1 == null) {\n      const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n      const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n      insert(placeholder, container, anchor);\n      insert(mainAnchor, container, anchor);\n      const target = n2.target = resolveTarget(n2.props, querySelector);\n      const targetAnchor = n2.targetAnchor = createText(\"\");\n      if (target) {\n        insert(targetAnchor, target);\n        isSVG = isSVG || isTargetSVG(target);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n        warn(\"Invalid Teleport target on mount:\", target, `(${typeof target})`);\n      }\n      const mount = (container2, anchor2) => {\n        if (shapeFlag & 16) {\n          mountChildren(\n            children,\n            container2,\n            anchor2,\n            parentComponent,\n            parentSuspense,\n            isSVG,\n            slotScopeIds,\n            optimized\n          );\n        }\n      };\n      if (disabled) {\n        mount(container, mainAnchor);\n      } else if (target) {\n        mount(target, targetAnchor);\n      }\n    } else {\n      n2.el = n1.el;\n      const mainAnchor = n2.anchor = n1.anchor;\n      const target = n2.target = n1.target;\n      const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n      const wasDisabled = isTeleportDisabled(n1.props);\n      const currentContainer = wasDisabled ? container : target;\n      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n      isSVG = isSVG || isTargetSVG(target);\n      if (dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          currentContainer,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds\n        );\n        traverseStaticChildren(n1, n2, true);\n      } else if (!optimized) {\n        patchChildren(\n          n1,\n          n2,\n          currentContainer,\n          currentAnchor,\n          parentComponent,\n          parentSuspense,\n          isSVG,\n          slotScopeIds,\n          false\n        );\n      }\n      if (disabled) {\n        if (!wasDisabled) {\n          moveTeleport(\n            n2,\n            container,\n            mainAnchor,\n            internals,\n            1\n          );\n        }\n      } else {\n        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n          const nextTarget = n2.target = resolveTarget(\n            n2.props,\n            querySelector\n          );\n          if (nextTarget) {\n            moveTeleport(\n              n2,\n              nextTarget,\n              null,\n              internals,\n              0\n            );\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn(\n              \"Invalid Teleport target on update:\",\n              target,\n              `(${typeof target})`\n            );\n          }\n        } else if (wasDisabled) {\n          moveTeleport(\n            n2,\n            target,\n            targetAnchor,\n            internals,\n            1\n          );\n        }\n      }\n    }\n    updateCssVars(n2);\n  },\n  remove(vnode, parentComponent, parentSuspense, optimized, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n    const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode;\n    if (target) {\n      hostRemove(targetAnchor);\n    }\n    if (doRemove || !isTeleportDisabled(props)) {\n      hostRemove(anchor);\n      if (shapeFlag & 16) {\n        for (let i = 0; i < children.length; i++) {\n          const child = children[i];\n          unmount(\n            child,\n            parentComponent,\n            parentSuspense,\n            true,\n            !!child.dynamicChildren\n          );\n        }\n      }\n    }\n  },\n  move: moveTeleport,\n  hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n  if (moveType === 0) {\n    insert(vnode.targetAnchor, container, parentAnchor);\n  }\n  const { el, anchor, shapeFlag, children, props } = vnode;\n  const isReorder = moveType === 2;\n  if (isReorder) {\n    insert(el, container, parentAnchor);\n  }\n  if (!isReorder || isTeleportDisabled(props)) {\n    if (shapeFlag & 16) {\n      for (let i = 0; i < children.length; i++) {\n        move(\n          children[i],\n          container,\n          parentAnchor,\n          2\n        );\n      }\n    }\n  }\n  if (isReorder) {\n    insert(anchor, container, parentAnchor);\n  }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n  o: { nextSibling, parentNode, querySelector }\n}, hydrateChildren) {\n  const target = vnode.target = resolveTarget(\n    vnode.props,\n    querySelector\n  );\n  if (target) {\n    const targetNode = target._lpa || target.firstChild;\n    if (vnode.shapeFlag & 16) {\n      if (isTeleportDisabled(vnode.props)) {\n        vnode.anchor = hydrateChildren(\n          nextSibling(node),\n          vnode,\n          parentNode(node),\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        vnode.targetAnchor = targetNode;\n      } else {\n        vnode.anchor = nextSibling(node);\n        let targetAnchor = targetNode;\n        while (targetAnchor) {\n          targetAnchor = nextSibling(targetAnchor);\n          if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === \"teleport anchor\") {\n            vnode.targetAnchor = targetAnchor;\n            target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n            break;\n          }\n        }\n        hydrateChildren(\n          targetNode,\n          vnode,\n          target,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n    updateCssVars(vnode);\n  }\n  return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode) {\n  const ctx = vnode.ctx;\n  if (ctx && ctx.ut) {\n    let node = vnode.children[0].el;\n    while (node !== vnode.targetAnchor) {\n      if (node.nodeType === 1)\n        node.setAttribute(\"data-v-owner\", ctx.uid);\n      node = node.nextSibling;\n    }\n    ctx.ut();\n  }\n}\n\nconst Fragment = Symbol.for(\"v-fgt\");\nconst Text = Symbol.for(\"v-txt\");\nconst Comment = Symbol.for(\"v-cmt\");\nconst Static = Symbol.for(\"v-stc\");\nconst blockStack = [];\nlet currentBlock = null;\nfunction openBlock(disableTracking = false) {\n  blockStack.push(currentBlock = disableTracking ? null : []);\n}\nfunction closeBlock() {\n  blockStack.pop();\n  currentBlock = blockStack[blockStack.length - 1] || null;\n}\nlet isBlockTreeEnabled = 1;\nfunction setBlockTracking(value) {\n  isBlockTreeEnabled += value;\n}\nfunction setupBlock(vnode) {\n  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;\n  closeBlock();\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n  return setupBlock(\n    createBaseVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      shapeFlag,\n      true\n      /* isBlock */\n    )\n  );\n}\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n  return setupBlock(\n    createVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      true\n      /* isBlock: prevent a block from tracking itself */\n    )\n  );\n}\nfunction isVNode(value) {\n  return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n  if (!!(process.env.NODE_ENV !== \"production\") && n2.shapeFlag & 6 && hmrDirtyComponents.has(n2.type)) {\n    n1.shapeFlag &= ~256;\n    n2.shapeFlag &= ~512;\n    return false;\n  }\n  return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\nfunction transformVNodeArgs(transformer) {\n  vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n  return _createVNode(\n    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args\n  );\n};\nconst InternalObjectKey = `__vInternal`;\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({\n  ref,\n  ref_key,\n  ref_for\n}) => {\n  if (typeof ref === \"number\") {\n    ref = \"\" + ref;\n  }\n  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {\n  const vnode = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type,\n    props,\n    key: props && normalizeKey(props),\n    ref: props && normalizeRef(props),\n    scopeId: currentScopeId,\n    slotScopeIds: null,\n    children,\n    component: null,\n    suspense: null,\n    ssContent: null,\n    ssFallback: null,\n    dirs: null,\n    transition: null,\n    el: null,\n    anchor: null,\n    target: null,\n    targetAnchor: null,\n    staticCount: 0,\n    shapeFlag,\n    patchFlag,\n    dynamicProps,\n    dynamicChildren: null,\n    appContext: null,\n    ctx: currentRenderingInstance\n  };\n  if (needFullChildrenNormalization) {\n    normalizeChildren(vnode, children);\n    if (shapeFlag & 128) {\n      type.normalize(vnode);\n    }\n  } else if (children) {\n    vnode.shapeFlag |= isString(children) ? 8 : 16;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.key !== vnode.key) {\n    warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n  }\n  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself\n  !isBlockNode && // has current parent block\n  currentBlock && // presence of a patch flag indicates this node needs patching on updates.\n  // component nodes also should always be patched, because even if the\n  // component doesn't need to update, it needs to persist the instance on to\n  // the next vnode so that it can be properly unmounted later.\n  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the\n  // vnode should not be considered dynamic due to handler caching.\n  vnode.patchFlag !== 32) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nconst createVNode = !!(process.env.NODE_ENV !== \"production\") ? createVNodeWithArgsTransform : _createVNode;\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n  if (!type || type === NULL_DYNAMIC_COMPONENT) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !type) {\n      warn(`Invalid vnode type when creating vnode: ${type}.`);\n    }\n    type = Comment;\n  }\n  if (isVNode(type)) {\n    const cloned = cloneVNode(\n      type,\n      props,\n      true\n      /* mergeRef: true */\n    );\n    if (children) {\n      normalizeChildren(cloned, children);\n    }\n    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n      if (cloned.shapeFlag & 6) {\n        currentBlock[currentBlock.indexOf(type)] = cloned;\n      } else {\n        currentBlock.push(cloned);\n      }\n    }\n    cloned.patchFlag |= -2;\n    return cloned;\n  }\n  if (isClassComponent(type)) {\n    type = type.__vccOpts;\n  }\n  if (props) {\n    props = guardReactiveProps(props);\n    let { class: klass, style } = props;\n    if (klass && !isString(klass)) {\n      props.class = normalizeClass(klass);\n    }\n    if (isObject(style)) {\n      if (isProxy(style) && !isArray(style)) {\n        style = extend({}, style);\n      }\n      props.style = normalizeStyle(style);\n    }\n  }\n  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && shapeFlag & 4 && isProxy(type)) {\n    type = toRaw(type);\n    warn(\n      `Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with \\`markRaw\\` or using \\`shallowRef\\` instead of \\`ref\\`.`,\n      `\nComponent that was made reactive: `,\n      type\n    );\n  }\n  return createBaseVNode(\n    type,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    shapeFlag,\n    isBlockNode,\n    true\n  );\n}\nfunction guardReactiveProps(props) {\n  if (!props)\n    return null;\n  return isProxy(props) || InternalObjectKey in props ? extend({}, props) : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false) {\n  const { props, ref, patchFlag, children } = vnode;\n  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n  const cloned = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type: vnode.type,\n    props: mergedProps,\n    key: mergedProps && normalizeKey(mergedProps),\n    ref: extraProps && extraProps.ref ? (\n      // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n      // if the vnode itself already has a ref, cloneVNode will need to merge\n      // the refs so the single vnode can be set on multiple refs\n      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)\n    ) : ref,\n    scopeId: vnode.scopeId,\n    slotScopeIds: vnode.slotScopeIds,\n    children: !!(process.env.NODE_ENV !== \"production\") && patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,\n    target: vnode.target,\n    targetAnchor: vnode.targetAnchor,\n    staticCount: vnode.staticCount,\n    shapeFlag: vnode.shapeFlag,\n    // if the vnode is cloned with extra props, we can no longer assume its\n    // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n    // note: preserve flag for fragments since they use the flag for children\n    // fast paths only.\n    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,\n    dynamicProps: vnode.dynamicProps,\n    dynamicChildren: vnode.dynamicChildren,\n    appContext: vnode.appContext,\n    dirs: vnode.dirs,\n    transition: vnode.transition,\n    // These should technically only be non-null on mounted VNodes. However,\n    // they *should* be copied for kept-alive vnodes. So we just always copy\n    // them since them being non-null during a mount doesn't affect the logic as\n    // they will simply be overwritten.\n    component: vnode.component,\n    suspense: vnode.suspense,\n    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n    el: vnode.el,\n    anchor: vnode.anchor,\n    ctx: vnode.ctx,\n    ce: vnode.ce\n  };\n  return cloned;\n}\nfunction deepCloneVNode(vnode) {\n  const cloned = cloneVNode(vnode);\n  if (isArray(vnode.children)) {\n    cloned.children = vnode.children.map(deepCloneVNode);\n  }\n  return cloned;\n}\nfunction createTextVNode(text = \" \", flag = 0) {\n  return createVNode(Text, null, text, flag);\n}\nfunction createStaticVNode(content, numberOfNodes) {\n  const vnode = createVNode(Static, null, content);\n  vnode.staticCount = numberOfNodes;\n  return vnode;\n}\nfunction createCommentVNode(text = \"\", asBlock = false) {\n  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n  if (child == null || typeof child === \"boolean\") {\n    return createVNode(Comment);\n  } else if (isArray(child)) {\n    return createVNode(\n      Fragment,\n      null,\n      // #3666, avoid reference pollution when reusing vnode\n      child.slice()\n    );\n  } else if (typeof child === \"object\") {\n    return cloneIfMounted(child);\n  } else {\n    return createVNode(Text, null, String(child));\n  }\n}\nfunction cloneIfMounted(child) {\n  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n  let type = 0;\n  const { shapeFlag } = vnode;\n  if (children == null) {\n    children = null;\n  } else if (isArray(children)) {\n    type = 16;\n  } else if (typeof children === \"object\") {\n    if (shapeFlag & (1 | 64)) {\n      const slot = children.default;\n      if (slot) {\n        slot._c && (slot._d = false);\n        normalizeChildren(vnode, slot());\n        slot._c && (slot._d = true);\n      }\n      return;\n    } else {\n      type = 32;\n      const slotFlag = children._;\n      if (!slotFlag && !(InternalObjectKey in children)) {\n        children._ctx = currentRenderingInstance;\n      } else if (slotFlag === 3 && currentRenderingInstance) {\n        if (currentRenderingInstance.slots._ === 1) {\n          children._ = 1;\n        } else {\n          children._ = 2;\n          vnode.patchFlag |= 1024;\n        }\n      }\n    }\n  } else if (isFunction(children)) {\n    children = { default: children, _ctx: currentRenderingInstance };\n    type = 32;\n  } else {\n    children = String(children);\n    if (shapeFlag & 64) {\n      type = 16;\n      children = [createTextVNode(children)];\n    } else {\n      type = 8;\n    }\n  }\n  vnode.children = children;\n  vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n  const ret = {};\n  for (let i = 0; i < args.length; i++) {\n    const toMerge = args[i];\n    for (const key in toMerge) {\n      if (key === \"class\") {\n        if (ret.class !== toMerge.class) {\n          ret.class = normalizeClass([ret.class, toMerge.class]);\n        }\n      } else if (key === \"style\") {\n        ret.style = normalizeStyle([ret.style, toMerge.style]);\n      } else if (isOn(key)) {\n        const existing = ret[key];\n        const incoming = toMerge[key];\n        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {\n          ret[key] = existing ? [].concat(existing, incoming) : incoming;\n        }\n      } else if (key !== \"\") {\n        ret[key] = toMerge[key];\n      }\n    }\n  }\n  return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n  callWithAsyncErrorHandling(hook, instance, 7, [\n    vnode,\n    prevVNode\n  ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n  const type = vnode.type;\n  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n  const instance = {\n    uid: uid++,\n    vnode,\n    type,\n    parent,\n    appContext,\n    root: null,\n    // to be immediately set\n    next: null,\n    subTree: null,\n    // will be set synchronously right after creation\n    effect: null,\n    update: null,\n    // will be set synchronously right after creation\n    scope: new EffectScope(\n      true\n      /* detached */\n    ),\n    render: null,\n    proxy: null,\n    exposed: null,\n    exposeProxy: null,\n    withProxy: null,\n    provides: parent ? parent.provides : Object.create(appContext.provides),\n    accessCache: null,\n    renderCache: [],\n    // local resolved assets\n    components: null,\n    directives: null,\n    // resolved props and emits options\n    propsOptions: normalizePropsOptions(type, appContext),\n    emitsOptions: normalizeEmitsOptions(type, appContext),\n    // emit\n    emit: null,\n    // to be set immediately\n    emitted: null,\n    // props default value\n    propsDefaults: EMPTY_OBJ,\n    // inheritAttrs\n    inheritAttrs: type.inheritAttrs,\n    // state\n    ctx: EMPTY_OBJ,\n    data: EMPTY_OBJ,\n    props: EMPTY_OBJ,\n    attrs: EMPTY_OBJ,\n    slots: EMPTY_OBJ,\n    refs: EMPTY_OBJ,\n    setupState: EMPTY_OBJ,\n    setupContext: null,\n    attrsProxy: null,\n    slotsProxy: null,\n    // suspense related\n    suspense,\n    suspenseId: suspense ? suspense.pendingId : 0,\n    asyncDep: null,\n    asyncResolved: false,\n    // lifecycle hooks\n    // not using enums here because it results in computed properties\n    isMounted: false,\n    isUnmounted: false,\n    isDeactivated: false,\n    bc: null,\n    c: null,\n    bm: null,\n    m: null,\n    bu: null,\n    u: null,\n    um: null,\n    bum: null,\n    da: null,\n    a: null,\n    rtg: null,\n    rtc: null,\n    ec: null,\n    sp: null\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.ctx = createDevRenderContext(instance);\n  } else {\n    instance.ctx = { _: instance };\n  }\n  instance.root = parent ? parent.root : instance;\n  instance.emit = emit.bind(null, instance);\n  if (vnode.ce) {\n    vnode.ce(instance);\n  }\n  return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nlet internalSetCurrentInstance;\nlet globalCurrentInstanceSetters;\nlet settersKey = \"__VUE_INSTANCE_SETTERS__\";\n{\n  if (!(globalCurrentInstanceSetters = getGlobalThis()[settersKey])) {\n    globalCurrentInstanceSetters = getGlobalThis()[settersKey] = [];\n  }\n  globalCurrentInstanceSetters.push((i) => currentInstance = i);\n  internalSetCurrentInstance = (instance) => {\n    if (globalCurrentInstanceSetters.length > 1) {\n      globalCurrentInstanceSetters.forEach((s) => s(instance));\n    } else {\n      globalCurrentInstanceSetters[0](instance);\n    }\n  };\n}\nconst setCurrentInstance = (instance) => {\n  internalSetCurrentInstance(instance);\n  instance.scope.on();\n};\nconst unsetCurrentInstance = () => {\n  currentInstance && currentInstance.scope.off();\n  internalSetCurrentInstance(null);\n};\nconst isBuiltInTag = /* @__PURE__ */ makeMap(\"slot,component\");\nfunction validateComponentName(name, config) {\n  const appIsNativeTag = config.isNativeTag || NO;\n  if (isBuiltInTag(name) || appIsNativeTag(name)) {\n    warn(\n      \"Do not use built-in or reserved HTML elements as component id: \" + name\n    );\n  }\n}\nfunction isStatefulComponent(instance) {\n  return instance.vnode.shapeFlag & 4;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false) {\n  isInSSRComponentSetup = isSSR;\n  const { props, children } = instance.vnode;\n  const isStateful = isStatefulComponent(instance);\n  initProps(instance, props, isStateful, isSSR);\n  initSlots(instance, children);\n  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;\n  isInSSRComponentSetup = false;\n  return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n  var _a;\n  const Component = instance.type;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (Component.name) {\n      validateComponentName(Component.name, instance.appContext.config);\n    }\n    if (Component.components) {\n      const names = Object.keys(Component.components);\n      for (let i = 0; i < names.length; i++) {\n        validateComponentName(names[i], instance.appContext.config);\n      }\n    }\n    if (Component.directives) {\n      const names = Object.keys(Component.directives);\n      for (let i = 0; i < names.length; i++) {\n        validateDirectiveName(names[i]);\n      }\n    }\n    if (Component.compilerOptions && isRuntimeOnly()) {\n      warn(\n        `\"compilerOptions\" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`\n      );\n    }\n  }\n  instance.accessCache = /* @__PURE__ */ Object.create(null);\n  instance.proxy = markRaw(new Proxy(instance.ctx, PublicInstanceProxyHandlers));\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    exposePropsOnRenderContext(instance);\n  }\n  const { setup } = Component;\n  if (setup) {\n    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;\n    setCurrentInstance(instance);\n    pauseTracking();\n    const setupResult = callWithErrorHandling(\n      setup,\n      instance,\n      0,\n      [!!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(instance.props) : instance.props, setupContext]\n    );\n    resetTracking();\n    unsetCurrentInstance();\n    if (isPromise(setupResult)) {\n      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n      if (isSSR) {\n        return setupResult.then((resolvedResult) => {\n          handleSetupResult(instance, resolvedResult, isSSR);\n        }).catch((e) => {\n          handleError(e, instance, 0);\n        });\n      } else {\n        instance.asyncDep = setupResult;\n        if (!!(process.env.NODE_ENV !== \"production\") && !instance.suspense) {\n          const name = (_a = Component.name) != null ? _a : \"Anonymous\";\n          warn(\n            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`\n          );\n        }\n      }\n    } else {\n      handleSetupResult(instance, setupResult, isSSR);\n    }\n  } else {\n    finishComponentSetup(instance, isSSR);\n  }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n  if (isFunction(setupResult)) {\n    if (instance.type.__ssrInlineRender) {\n      instance.ssrRender = setupResult;\n    } else {\n      instance.render = setupResult;\n    }\n  } else if (isObject(setupResult)) {\n    if (!!(process.env.NODE_ENV !== \"production\") && isVNode(setupResult)) {\n      warn(\n        `setup() should not return VNodes directly - return a render function instead.`\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.devtoolsRawSetupState = setupResult;\n    }\n    instance.setupState = proxyRefs(setupResult);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      exposeSetupStateOnRenderContext(instance);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\") && setupResult !== void 0) {\n    warn(\n      `setup() should return an object. Received: ${setupResult === null ? \"null\" : typeof setupResult}`\n    );\n  }\n  finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\nfunction registerRuntimeCompiler(_compile) {\n  compile = _compile;\n  installWithProxy = (i) => {\n    if (i.render._rc) {\n      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n    }\n  };\n}\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n  const Component = instance.type;\n  if (!instance.render) {\n    if (!isSSR && compile && !Component.render) {\n      const template = Component.template || resolveMergedOptions(instance).template;\n      if (template) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `compile`);\n        }\n        const { isCustomElement, compilerOptions } = instance.appContext.config;\n        const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n        const finalCompilerOptions = extend(\n          extend(\n            {\n              isCustomElement,\n              delimiters\n            },\n            compilerOptions\n          ),\n          componentCompilerOptions\n        );\n        Component.render = compile(template, finalCompilerOptions);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `compile`);\n        }\n      }\n    }\n    instance.render = Component.render || NOOP;\n    if (installWithProxy) {\n      installWithProxy(instance);\n    }\n  }\n  if (__VUE_OPTIONS_API__ && true) {\n    setCurrentInstance(instance);\n    pauseTracking();\n    applyOptions(instance);\n    resetTracking();\n    unsetCurrentInstance();\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !Component.render && instance.render === NOOP && !isSSR) {\n    if (!compile && Component.template) {\n      warn(\n        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n        /* should not happen */\n      );\n    } else {\n      warn(`Component is missing template or render function.`);\n    }\n  }\n}\nfunction getAttrsProxy(instance) {\n  return instance.attrsProxy || (instance.attrsProxy = new Proxy(\n    instance.attrs,\n    !!(process.env.NODE_ENV !== \"production\") ? {\n      get(target, key) {\n        markAttrsAccessed();\n        track(instance, \"get\", \"$attrs\");\n        return target[key];\n      },\n      set() {\n        warn(`setupContext.attrs is readonly.`);\n        return false;\n      },\n      deleteProperty() {\n        warn(`setupContext.attrs is readonly.`);\n        return false;\n      }\n    } : {\n      get(target, key) {\n        track(instance, \"get\", \"$attrs\");\n        return target[key];\n      }\n    }\n  ));\n}\nfunction getSlotsProxy(instance) {\n  return instance.slotsProxy || (instance.slotsProxy = new Proxy(instance.slots, {\n    get(target, key) {\n      track(instance, \"get\", \"$slots\");\n      return target[key];\n    }\n  }));\n}\nfunction createSetupContext(instance) {\n  const expose = (exposed) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (instance.exposed) {\n        warn(`expose() should be called only once per setup().`);\n      }\n      if (exposed != null) {\n        let exposedType = typeof exposed;\n        if (exposedType === \"object\") {\n          if (isArray(exposed)) {\n            exposedType = \"array\";\n          } else if (isRef(exposed)) {\n            exposedType = \"ref\";\n          }\n        }\n        if (exposedType !== \"object\") {\n          warn(\n            `expose() should be passed a plain object, received ${exposedType}.`\n          );\n        }\n      }\n    }\n    instance.exposed = exposed || {};\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    return Object.freeze({\n      get attrs() {\n        return getAttrsProxy(instance);\n      },\n      get slots() {\n        return getSlotsProxy(instance);\n      },\n      get emit() {\n        return (event, ...args) => instance.emit(event, ...args);\n      },\n      expose\n    });\n  } else {\n    return {\n      get attrs() {\n        return getAttrsProxy(instance);\n      },\n      slots: instance.slots,\n      emit: instance.emit,\n      expose\n    };\n  }\n}\nfunction getExposeProxy(instance) {\n  if (instance.exposed) {\n    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n      get(target, key) {\n        if (key in target) {\n          return target[key];\n        } else if (key in publicPropertiesMap) {\n          return publicPropertiesMap[key](instance);\n        }\n      },\n      has(target, key) {\n        return key in target || key in publicPropertiesMap;\n      }\n    }));\n  }\n}\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, \"\");\nfunction getComponentName(Component, includeInferred = true) {\n  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;\n}\nfunction formatComponentName(instance, Component, isRoot = false) {\n  let name = getComponentName(Component);\n  if (!name && Component.__file) {\n    const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n    if (match) {\n      name = match[1];\n    }\n  }\n  if (!name && instance && instance.parent) {\n    const inferFromRegistry = (registry) => {\n      for (const key in registry) {\n        if (registry[key] === Component) {\n          return key;\n        }\n      }\n    };\n    name = inferFromRegistry(\n      instance.components || instance.parent.type.components\n    ) || inferFromRegistry(instance.appContext.components);\n  }\n  return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n  return isFunction(value) && \"__vccOpts\" in value;\n}\n\nconst computed = (getterOrOptions, debugOptions) => {\n  return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);\n};\n\nfunction h(type, propsOrChildren, children) {\n  const l = arguments.length;\n  if (l === 2) {\n    if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {\n      if (isVNode(propsOrChildren)) {\n        return createVNode(type, null, [propsOrChildren]);\n      }\n      return createVNode(type, propsOrChildren);\n    } else {\n      return createVNode(type, null, propsOrChildren);\n    }\n  } else {\n    if (l > 3) {\n      children = Array.prototype.slice.call(arguments, 2);\n    } else if (l === 3 && isVNode(children)) {\n      children = [children];\n    }\n    return createVNode(type, propsOrChildren, children);\n  }\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n  {\n    const ctx = inject(ssrContextKey);\n    if (!ctx) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(\n        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n      );\n    }\n    return ctx;\n  }\n};\n\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\n\nfunction initCustomFormatter() {\n  if (!!!(process.env.NODE_ENV !== \"production\") || typeof window === \"undefined\") {\n    return;\n  }\n  const vueStyle = { style: \"color:#3ba776\" };\n  const numberStyle = { style: \"color:#0b1bc9\" };\n  const stringStyle = { style: \"color:#b62e24\" };\n  const keywordStyle = { style: \"color:#9d288c\" };\n  const formatter = {\n    header(obj) {\n      if (!isObject(obj)) {\n        return null;\n      }\n      if (obj.__isVue) {\n        return [\"div\", vueStyle, `VueInstance`];\n      } else if (isRef(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, genRefFlag(obj)],\n          \"<\",\n          formatValue(obj.value),\n          `>`\n        ];\n      } else if (isReactive(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReactive\" : \"Reactive\"],\n          \"<\",\n          formatValue(obj),\n          `>${isReadonly(obj) ? ` (readonly)` : ``}`\n        ];\n      } else if (isReadonly(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReadonly\" : \"Readonly\"],\n          \"<\",\n          formatValue(obj),\n          \">\"\n        ];\n      }\n      return null;\n    },\n    hasBody(obj) {\n      return obj && obj.__isVue;\n    },\n    body(obj) {\n      if (obj && obj.__isVue) {\n        return [\n          \"div\",\n          {},\n          ...formatInstance(obj.$)\n        ];\n      }\n    }\n  };\n  function formatInstance(instance) {\n    const blocks = [];\n    if (instance.type.props && instance.props) {\n      blocks.push(createInstanceBlock(\"props\", toRaw(instance.props)));\n    }\n    if (instance.setupState !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"setup\", instance.setupState));\n    }\n    if (instance.data !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"data\", toRaw(instance.data)));\n    }\n    const computed = extractKeys(instance, \"computed\");\n    if (computed) {\n      blocks.push(createInstanceBlock(\"computed\", computed));\n    }\n    const injected = extractKeys(instance, \"inject\");\n    if (injected) {\n      blocks.push(createInstanceBlock(\"injected\", injected));\n    }\n    blocks.push([\n      \"div\",\n      {},\n      [\n        \"span\",\n        {\n          style: keywordStyle.style + \";opacity:0.66\"\n        },\n        \"$ (internal): \"\n      ],\n      [\"object\", { object: instance }]\n    ]);\n    return blocks;\n  }\n  function createInstanceBlock(type, target) {\n    target = extend({}, target);\n    if (!Object.keys(target).length) {\n      return [\"span\", {}];\n    }\n    return [\n      \"div\",\n      { style: \"line-height:1.25em;margin-bottom:0.6em\" },\n      [\n        \"div\",\n        {\n          style: \"color:#476582\"\n        },\n        type\n      ],\n      [\n        \"div\",\n        {\n          style: \"padding-left:1.25em\"\n        },\n        ...Object.keys(target).map((key) => {\n          return [\n            \"div\",\n            {},\n            [\"span\", keywordStyle, key + \": \"],\n            formatValue(target[key], false)\n          ];\n        })\n      ]\n    ];\n  }\n  function formatValue(v, asRaw = true) {\n    if (typeof v === \"number\") {\n      return [\"span\", numberStyle, v];\n    } else if (typeof v === \"string\") {\n      return [\"span\", stringStyle, JSON.stringify(v)];\n    } else if (typeof v === \"boolean\") {\n      return [\"span\", keywordStyle, v];\n    } else if (isObject(v)) {\n      return [\"object\", { object: asRaw ? toRaw(v) : v }];\n    } else {\n      return [\"span\", stringStyle, String(v)];\n    }\n  }\n  function extractKeys(instance, type) {\n    const Comp = instance.type;\n    if (isFunction(Comp)) {\n      return;\n    }\n    const extracted = {};\n    for (const key in instance.ctx) {\n      if (isKeyOfType(Comp, key, type)) {\n        extracted[key] = instance.ctx[key];\n      }\n    }\n    return extracted;\n  }\n  function isKeyOfType(Comp, key, type) {\n    const opts = Comp[type];\n    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {\n      return true;\n    }\n    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n      return true;\n    }\n    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {\n      return true;\n    }\n  }\n  function genRefFlag(v) {\n    if (isShallow(v)) {\n      return `ShallowRef`;\n    }\n    if (v.effect) {\n      return `ComputedRef`;\n    }\n    return `Ref`;\n  }\n  if (window.devtoolsFormatters) {\n    window.devtoolsFormatters.push(formatter);\n  } else {\n    window.devtoolsFormatters = [formatter];\n  }\n}\n\nfunction withMemo(memo, render, cache, index) {\n  const cached = cache[index];\n  if (cached && isMemoSame(cached, memo)) {\n    return cached;\n  }\n  const ret = render();\n  ret.memo = memo.slice();\n  return cache[index] = ret;\n}\nfunction isMemoSame(cached, memo) {\n  const prev = cached.memo;\n  if (prev.length != memo.length) {\n    return false;\n  }\n  for (let i = 0; i < prev.length; i++) {\n    if (hasChanged(prev[i], memo[i])) {\n      return false;\n    }\n  }\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(cached);\n  }\n  return true;\n}\n\nconst version = \"3.3.4\";\nconst _ssrUtils = {\n  createComponentInstance,\n  setupComponent,\n  renderComponentRoot,\n  setCurrentRenderingInstance,\n  isVNode: isVNode,\n  normalizeVNode\n};\nconst ssrUtils = _ssrUtils ;\nconst resolveFilter = null;\nconst compatUtils = null;\n\nexport { BaseTransition, BaseTransitionPropsValidators, Comment, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useModel, useSSRContext, useSlots, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };\n","import { warn, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, createVNode, getCurrentInstance, watchPostEffect, onMounted, onUnmounted, Fragment, Static, h, BaseTransition, BaseTransitionPropsValidators, assertNumber, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, isRuntimeOnly, createRenderer, createHydrationRenderer } from '@vue/runtime-core';\nexport * from '@vue/runtime-core';\nimport { isString, isArray, hyphenate, capitalize, isSpecialBooleanAttr, includeBooleanAttr, isOn, isModelListener, isFunction, camelize as camelize$1, toNumber, extend, EMPTY_OBJ, isObject, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag } from '@vue/shared';\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\nconst doc = typeof document !== \"undefined\" ? document : null;\nconst templateContainer = doc && /* @__PURE__ */ doc.createElement(\"template\");\nconst nodeOps = {\n  insert: (child, parent, anchor) => {\n    parent.insertBefore(child, anchor || null);\n  },\n  remove: (child) => {\n    const parent = child.parentNode;\n    if (parent) {\n      parent.removeChild(child);\n    }\n  },\n  createElement: (tag, isSVG, is, props) => {\n    const el = isSVG ? doc.createElementNS(svgNS, tag) : doc.createElement(tag, is ? { is } : void 0);\n    if (tag === \"select\" && props && props.multiple != null) {\n      el.setAttribute(\"multiple\", props.multiple);\n    }\n    return el;\n  },\n  createText: (text) => doc.createTextNode(text),\n  createComment: (text) => doc.createComment(text),\n  setText: (node, text) => {\n    node.nodeValue = text;\n  },\n  setElementText: (el, text) => {\n    el.textContent = text;\n  },\n  parentNode: (node) => node.parentNode,\n  nextSibling: (node) => node.nextSibling,\n  querySelector: (selector) => doc.querySelector(selector),\n  setScopeId(el, id) {\n    el.setAttribute(id, \"\");\n  },\n  // __UNSAFE__\n  // Reason: innerHTML.\n  // Static content here can only come from compiled templates.\n  // As long as the user only uses trusted templates, this is safe.\n  insertStaticContent(content, parent, anchor, isSVG, start, end) {\n    const before = anchor ? anchor.previousSibling : parent.lastChild;\n    if (start && (start === end || start.nextSibling)) {\n      while (true) {\n        parent.insertBefore(start.cloneNode(true), anchor);\n        if (start === end || !(start = start.nextSibling))\n          break;\n      }\n    } else {\n      templateContainer.innerHTML = isSVG ? `<svg>${content}</svg>` : content;\n      const template = templateContainer.content;\n      if (isSVG) {\n        const wrapper = template.firstChild;\n        while (wrapper.firstChild) {\n          template.appendChild(wrapper.firstChild);\n        }\n        template.removeChild(wrapper);\n      }\n      parent.insertBefore(template, anchor);\n    }\n    return [\n      // first\n      before ? before.nextSibling : parent.firstChild,\n      // last\n      anchor ? anchor.previousSibling : parent.lastChild\n    ];\n  }\n};\n\nfunction patchClass(el, value, isSVG) {\n  const transitionClasses = el._vtc;\n  if (transitionClasses) {\n    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(\" \");\n  }\n  if (value == null) {\n    el.removeAttribute(\"class\");\n  } else if (isSVG) {\n    el.setAttribute(\"class\", value);\n  } else {\n    el.className = value;\n  }\n}\n\nfunction patchStyle(el, prev, next) {\n  const style = el.style;\n  const isCssString = isString(next);\n  if (next && !isCssString) {\n    if (prev && !isString(prev)) {\n      for (const key in prev) {\n        if (next[key] == null) {\n          setStyle(style, key, \"\");\n        }\n      }\n    }\n    for (const key in next) {\n      setStyle(style, key, next[key]);\n    }\n  } else {\n    const currentDisplay = style.display;\n    if (isCssString) {\n      if (prev !== next) {\n        style.cssText = next;\n      }\n    } else if (prev) {\n      el.removeAttribute(\"style\");\n    }\n    if (\"_vod\" in el) {\n      style.display = currentDisplay;\n    }\n  }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n  if (isArray(val)) {\n    val.forEach((v) => setStyle(style, name, v));\n  } else {\n    if (val == null)\n      val = \"\";\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (semicolonRE.test(val)) {\n        warn(\n          `Unexpected semicolon at the end of '${name}' style value: '${val}'`\n        );\n      }\n    }\n    if (name.startsWith(\"--\")) {\n      style.setProperty(name, val);\n    } else {\n      const prefixed = autoPrefix(style, name);\n      if (importantRE.test(val)) {\n        style.setProperty(\n          hyphenate(prefixed),\n          val.replace(importantRE, \"\"),\n          \"important\"\n        );\n      } else {\n        style[prefixed] = val;\n      }\n    }\n  }\n}\nconst prefixes = [\"Webkit\", \"Moz\", \"ms\"];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n  const cached = prefixCache[rawName];\n  if (cached) {\n    return cached;\n  }\n  let name = camelize(rawName);\n  if (name !== \"filter\" && name in style) {\n    return prefixCache[rawName] = name;\n  }\n  name = capitalize(name);\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefixed = prefixes[i] + name;\n    if (prefixed in style) {\n      return prefixCache[rawName] = prefixed;\n    }\n  }\n  return rawName;\n}\n\nconst xlinkNS = \"http://www.w3.org/1999/xlink\";\nfunction patchAttr(el, key, value, isSVG, instance) {\n  if (isSVG && key.startsWith(\"xlink:\")) {\n    if (value == null) {\n      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    const isBoolean = isSpecialBooleanAttr(key);\n    if (value == null || isBoolean && !includeBooleanAttr(value)) {\n      el.removeAttribute(key);\n    } else {\n      el.setAttribute(key, isBoolean ? \"\" : value);\n    }\n  }\n}\n\nfunction patchDOMProp(el, key, value, prevChildren, parentComponent, parentSuspense, unmountChildren) {\n  if (key === \"innerHTML\" || key === \"textContent\") {\n    if (prevChildren) {\n      unmountChildren(prevChildren, parentComponent, parentSuspense);\n    }\n    el[key] = value == null ? \"\" : value;\n    return;\n  }\n  const tag = el.tagName;\n  if (key === \"value\" && tag !== \"PROGRESS\" && // custom elements may use _value internally\n  !tag.includes(\"-\")) {\n    el._value = value;\n    const oldValue = tag === \"OPTION\" ? el.getAttribute(\"value\") : el.value;\n    const newValue = value == null ? \"\" : value;\n    if (oldValue !== newValue) {\n      el.value = newValue;\n    }\n    if (value == null) {\n      el.removeAttribute(key);\n    }\n    return;\n  }\n  let needRemove = false;\n  if (value === \"\" || value == null) {\n    const type = typeof el[key];\n    if (type === \"boolean\") {\n      value = includeBooleanAttr(value);\n    } else if (value == null && type === \"string\") {\n      value = \"\";\n      needRemove = true;\n    } else if (type === \"number\") {\n      value = 0;\n      needRemove = true;\n    }\n  }\n  try {\n    el[key] = value;\n  } catch (e) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !needRemove) {\n      warn(\n        `Failed setting prop \"${key}\" on <${tag.toLowerCase()}>: value ${value} is invalid.`,\n        e\n      );\n    }\n  }\n  needRemove && el.removeAttribute(key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n  el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n  el.removeEventListener(event, handler, options);\n}\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n  const invokers = el._vei || (el._vei = {});\n  const existingInvoker = invokers[rawName];\n  if (nextValue && existingInvoker) {\n    existingInvoker.value = nextValue;\n  } else {\n    const [name, options] = parseName(rawName);\n    if (nextValue) {\n      const invoker = invokers[rawName] = createInvoker(nextValue, instance);\n      addEventListener(el, name, invoker, options);\n    } else if (existingInvoker) {\n      removeEventListener(el, name, existingInvoker, options);\n      invokers[rawName] = void 0;\n    }\n  }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n  let options;\n  if (optionsModifierRE.test(name)) {\n    options = {};\n    let m;\n    while (m = name.match(optionsModifierRE)) {\n      name = name.slice(0, name.length - m[0].length);\n      options[m[0].toLowerCase()] = true;\n    }\n  }\n  const event = name[2] === \":\" ? name.slice(3) : hyphenate(name.slice(2));\n  return [event, options];\n}\nlet cachedNow = 0;\nconst p = /* @__PURE__ */ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());\nfunction createInvoker(initialValue, instance) {\n  const invoker = (e) => {\n    if (!e._vts) {\n      e._vts = Date.now();\n    } else if (e._vts <= invoker.attached) {\n      return;\n    }\n    callWithAsyncErrorHandling(\n      patchStopImmediatePropagation(e, invoker.value),\n      instance,\n      5,\n      [e]\n    );\n  };\n  invoker.value = initialValue;\n  invoker.attached = getNow();\n  return invoker;\n}\nfunction patchStopImmediatePropagation(e, value) {\n  if (isArray(value)) {\n    const originalStop = e.stopImmediatePropagation;\n    e.stopImmediatePropagation = () => {\n      originalStop.call(e);\n      e._stopped = true;\n    };\n    return value.map((fn) => (e2) => !e2._stopped && fn && fn(e2));\n  } else {\n    return value;\n  }\n}\n\nconst nativeOnRE = /^on[a-z]/;\nconst patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {\n  if (key === \"class\") {\n    patchClass(el, nextValue, isSVG);\n  } else if (key === \"style\") {\n    patchStyle(el, prevValue, nextValue);\n  } else if (isOn(key)) {\n    if (!isModelListener(key)) {\n      patchEvent(el, key, prevValue, nextValue, parentComponent);\n    }\n  } else if (key[0] === \".\" ? (key = key.slice(1), true) : key[0] === \"^\" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {\n    patchDOMProp(\n      el,\n      key,\n      nextValue,\n      prevChildren,\n      parentComponent,\n      parentSuspense,\n      unmountChildren\n    );\n  } else {\n    if (key === \"true-value\") {\n      el._trueValue = nextValue;\n    } else if (key === \"false-value\") {\n      el._falseValue = nextValue;\n    }\n    patchAttr(el, key, nextValue, isSVG);\n  }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n  if (isSVG) {\n    if (key === \"innerHTML\" || key === \"textContent\") {\n      return true;\n    }\n    if (key in el && nativeOnRE.test(key) && isFunction(value)) {\n      return true;\n    }\n    return false;\n  }\n  if (key === \"spellcheck\" || key === \"draggable\" || key === \"translate\") {\n    return false;\n  }\n  if (key === \"form\") {\n    return false;\n  }\n  if (key === \"list\" && el.tagName === \"INPUT\") {\n    return false;\n  }\n  if (key === \"type\" && el.tagName === \"TEXTAREA\") {\n    return false;\n  }\n  if (nativeOnRE.test(key) && isString(value)) {\n    return false;\n  }\n  return key in el;\n}\n\nfunction defineCustomElement(options, hydrate2) {\n  const Comp = defineComponent(options);\n  class VueCustomElement extends VueElement {\n    constructor(initialProps) {\n      super(Comp, initialProps, hydrate2);\n    }\n  }\n  VueCustomElement.def = Comp;\n  return VueCustomElement;\n}\nconst defineSSRCustomElement = (options) => {\n  return defineCustomElement(options, hydrate);\n};\nconst BaseClass = typeof HTMLElement !== \"undefined\" ? HTMLElement : class {\n};\nclass VueElement extends BaseClass {\n  constructor(_def, _props = {}, hydrate2) {\n    super();\n    this._def = _def;\n    this._props = _props;\n    /**\n     * @internal\n     */\n    this._instance = null;\n    this._connected = false;\n    this._resolved = false;\n    this._numberProps = null;\n    if (this.shadowRoot && hydrate2) {\n      hydrate2(this._createVNode(), this.shadowRoot);\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && this.shadowRoot) {\n        warn(\n          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \\`defineSSRCustomElement\\`.`\n        );\n      }\n      this.attachShadow({ mode: \"open\" });\n      if (!this._def.__asyncLoader) {\n        this._resolveProps(this._def);\n      }\n    }\n  }\n  connectedCallback() {\n    this._connected = true;\n    if (!this._instance) {\n      if (this._resolved) {\n        this._update();\n      } else {\n        this._resolveDef();\n      }\n    }\n  }\n  disconnectedCallback() {\n    this._connected = false;\n    nextTick(() => {\n      if (!this._connected) {\n        render(null, this.shadowRoot);\n        this._instance = null;\n      }\n    });\n  }\n  /**\n   * resolve inner component definition (handle possible async component)\n   */\n  _resolveDef() {\n    this._resolved = true;\n    for (let i = 0; i < this.attributes.length; i++) {\n      this._setAttr(this.attributes[i].name);\n    }\n    new MutationObserver((mutations) => {\n      for (const m of mutations) {\n        this._setAttr(m.attributeName);\n      }\n    }).observe(this, { attributes: true });\n    const resolve = (def, isAsync = false) => {\n      const { props, styles } = def;\n      let numberProps;\n      if (props && !isArray(props)) {\n        for (const key in props) {\n          const opt = props[key];\n          if (opt === Number || opt && opt.type === Number) {\n            if (key in this._props) {\n              this._props[key] = toNumber(this._props[key]);\n            }\n            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;\n          }\n        }\n      }\n      this._numberProps = numberProps;\n      if (isAsync) {\n        this._resolveProps(def);\n      }\n      this._applyStyles(styles);\n      this._update();\n    };\n    const asyncDef = this._def.__asyncLoader;\n    if (asyncDef) {\n      asyncDef().then((def) => resolve(def, true));\n    } else {\n      resolve(this._def);\n    }\n  }\n  _resolveProps(def) {\n    const { props } = def;\n    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});\n    for (const key of Object.keys(this)) {\n      if (key[0] !== \"_\" && declaredPropKeys.includes(key)) {\n        this._setProp(key, this[key], true, false);\n      }\n    }\n    for (const key of declaredPropKeys.map(camelize$1)) {\n      Object.defineProperty(this, key, {\n        get() {\n          return this._getProp(key);\n        },\n        set(val) {\n          this._setProp(key, val);\n        }\n      });\n    }\n  }\n  _setAttr(key) {\n    let value = this.getAttribute(key);\n    const camelKey = camelize$1(key);\n    if (this._numberProps && this._numberProps[camelKey]) {\n      value = toNumber(value);\n    }\n    this._setProp(camelKey, value, false);\n  }\n  /**\n   * @internal\n   */\n  _getProp(key) {\n    return this._props[key];\n  }\n  /**\n   * @internal\n   */\n  _setProp(key, val, shouldReflect = true, shouldUpdate = true) {\n    if (val !== this._props[key]) {\n      this._props[key] = val;\n      if (shouldUpdate && this._instance) {\n        this._update();\n      }\n      if (shouldReflect) {\n        if (val === true) {\n          this.setAttribute(hyphenate(key), \"\");\n        } else if (typeof val === \"string\" || typeof val === \"number\") {\n          this.setAttribute(hyphenate(key), val + \"\");\n        } else if (!val) {\n          this.removeAttribute(hyphenate(key));\n        }\n      }\n    }\n  }\n  _update() {\n    render(this._createVNode(), this.shadowRoot);\n  }\n  _createVNode() {\n    const vnode = createVNode(this._def, extend({}, this._props));\n    if (!this._instance) {\n      vnode.ce = (instance) => {\n        this._instance = instance;\n        instance.isCE = true;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          instance.ceReload = (newStyles) => {\n            if (this._styles) {\n              this._styles.forEach((s) => this.shadowRoot.removeChild(s));\n              this._styles.length = 0;\n            }\n            this._applyStyles(newStyles);\n            this._instance = null;\n            this._update();\n          };\n        }\n        const dispatch = (event, args) => {\n          this.dispatchEvent(\n            new CustomEvent(event, {\n              detail: args\n            })\n          );\n        };\n        instance.emit = (event, ...args) => {\n          dispatch(event, args);\n          if (hyphenate(event) !== event) {\n            dispatch(hyphenate(event), args);\n          }\n        };\n        let parent = this;\n        while (parent = parent && (parent.parentNode || parent.host)) {\n          if (parent instanceof VueElement) {\n            instance.parent = parent._instance;\n            instance.provides = parent._instance.provides;\n            break;\n          }\n        }\n      };\n    }\n    return vnode;\n  }\n  _applyStyles(styles) {\n    if (styles) {\n      styles.forEach((css) => {\n        const s = document.createElement(\"style\");\n        s.textContent = css;\n        this.shadowRoot.appendChild(s);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          (this._styles || (this._styles = [])).push(s);\n        }\n      });\n    }\n  }\n}\n\nfunction useCssModule(name = \"$style\") {\n  {\n    const instance = getCurrentInstance();\n    if (!instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`useCssModule must be called inside setup()`);\n      return EMPTY_OBJ;\n    }\n    const modules = instance.type.__cssModules;\n    if (!modules) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS modules injected.`);\n      return EMPTY_OBJ;\n    }\n    const mod = modules[name];\n    if (!mod) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS module named \"${name}\".`);\n      return EMPTY_OBJ;\n    }\n    return mod;\n  }\n}\n\nfunction useCssVars(getter) {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`useCssVars is called without current active component instance.`);\n    return;\n  }\n  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {\n    Array.from(\n      document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)\n    ).forEach((node) => setVarsOnNode(node, vars));\n  };\n  const setVars = () => {\n    const vars = getter(instance.proxy);\n    setVarsOnVNode(instance.subTree, vars);\n    updateTeleports(vars);\n  };\n  watchPostEffect(setVars);\n  onMounted(() => {\n    const ob = new MutationObserver(setVars);\n    ob.observe(instance.subTree.el.parentNode, { childList: true });\n    onUnmounted(() => ob.disconnect());\n  });\n}\nfunction setVarsOnVNode(vnode, vars) {\n  if (vnode.shapeFlag & 128) {\n    const suspense = vnode.suspense;\n    vnode = suspense.activeBranch;\n    if (suspense.pendingBranch && !suspense.isHydrating) {\n      suspense.effects.push(() => {\n        setVarsOnVNode(suspense.activeBranch, vars);\n      });\n    }\n  }\n  while (vnode.component) {\n    vnode = vnode.component.subTree;\n  }\n  if (vnode.shapeFlag & 1 && vnode.el) {\n    setVarsOnNode(vnode.el, vars);\n  } else if (vnode.type === Fragment) {\n    vnode.children.forEach((c) => setVarsOnVNode(c, vars));\n  } else if (vnode.type === Static) {\n    let { el, anchor } = vnode;\n    while (el) {\n      setVarsOnNode(el, vars);\n      if (el === anchor)\n        break;\n      el = el.nextSibling;\n    }\n  }\n}\nfunction setVarsOnNode(el, vars) {\n  if (el.nodeType === 1) {\n    const style = el.style;\n    for (const key in vars) {\n      style.setProperty(`--${key}`, vars[key]);\n    }\n  }\n}\n\nconst TRANSITION = \"transition\";\nconst ANIMATION = \"animation\";\nconst Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);\nTransition.displayName = \"Transition\";\nconst DOMTransitionPropsValidators = {\n  name: String,\n  type: String,\n  css: {\n    type: Boolean,\n    default: true\n  },\n  duration: [String, Number, Object],\n  enterFromClass: String,\n  enterActiveClass: String,\n  enterToClass: String,\n  appearFromClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  leaveFromClass: String,\n  leaveActiveClass: String,\n  leaveToClass: String\n};\nconst TransitionPropsValidators = Transition.props = /* @__PURE__ */ extend(\n  {},\n  BaseTransitionPropsValidators,\n  DOMTransitionPropsValidators\n);\nconst callHook = (hook, args = []) => {\n  if (isArray(hook)) {\n    hook.forEach((h2) => h2(...args));\n  } else if (hook) {\n    hook(...args);\n  }\n};\nconst hasExplicitCallback = (hook) => {\n  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;\n};\nfunction resolveTransitionProps(rawProps) {\n  const baseProps = {};\n  for (const key in rawProps) {\n    if (!(key in DOMTransitionPropsValidators)) {\n      baseProps[key] = rawProps[key];\n    }\n  }\n  if (rawProps.css === false) {\n    return baseProps;\n  }\n  const {\n    name = \"v\",\n    type,\n    duration,\n    enterFromClass = `${name}-enter-from`,\n    enterActiveClass = `${name}-enter-active`,\n    enterToClass = `${name}-enter-to`,\n    appearFromClass = enterFromClass,\n    appearActiveClass = enterActiveClass,\n    appearToClass = enterToClass,\n    leaveFromClass = `${name}-leave-from`,\n    leaveActiveClass = `${name}-leave-active`,\n    leaveToClass = `${name}-leave-to`\n  } = rawProps;\n  const durations = normalizeDuration(duration);\n  const enterDuration = durations && durations[0];\n  const leaveDuration = durations && durations[1];\n  const {\n    onBeforeEnter,\n    onEnter,\n    onEnterCancelled,\n    onLeave,\n    onLeaveCancelled,\n    onBeforeAppear = onBeforeEnter,\n    onAppear = onEnter,\n    onAppearCancelled = onEnterCancelled\n  } = baseProps;\n  const finishEnter = (el, isAppear, done) => {\n    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n    done && done();\n  };\n  const finishLeave = (el, done) => {\n    el._isLeaving = false;\n    removeTransitionClass(el, leaveFromClass);\n    removeTransitionClass(el, leaveToClass);\n    removeTransitionClass(el, leaveActiveClass);\n    done && done();\n  };\n  const makeEnterHook = (isAppear) => {\n    return (el, done) => {\n      const hook = isAppear ? onAppear : onEnter;\n      const resolve = () => finishEnter(el, isAppear, done);\n      callHook(hook, [el, resolve]);\n      nextFrame(() => {\n        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n        addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n        if (!hasExplicitCallback(hook)) {\n          whenTransitionEnds(el, type, enterDuration, resolve);\n        }\n      });\n    };\n  };\n  return extend(baseProps, {\n    onBeforeEnter(el) {\n      callHook(onBeforeEnter, [el]);\n      addTransitionClass(el, enterFromClass);\n      addTransitionClass(el, enterActiveClass);\n    },\n    onBeforeAppear(el) {\n      callHook(onBeforeAppear, [el]);\n      addTransitionClass(el, appearFromClass);\n      addTransitionClass(el, appearActiveClass);\n    },\n    onEnter: makeEnterHook(false),\n    onAppear: makeEnterHook(true),\n    onLeave(el, done) {\n      el._isLeaving = true;\n      const resolve = () => finishLeave(el, done);\n      addTransitionClass(el, leaveFromClass);\n      forceReflow();\n      addTransitionClass(el, leaveActiveClass);\n      nextFrame(() => {\n        if (!el._isLeaving) {\n          return;\n        }\n        removeTransitionClass(el, leaveFromClass);\n        addTransitionClass(el, leaveToClass);\n        if (!hasExplicitCallback(onLeave)) {\n          whenTransitionEnds(el, type, leaveDuration, resolve);\n        }\n      });\n      callHook(onLeave, [el, resolve]);\n    },\n    onEnterCancelled(el) {\n      finishEnter(el, false);\n      callHook(onEnterCancelled, [el]);\n    },\n    onAppearCancelled(el) {\n      finishEnter(el, true);\n      callHook(onAppearCancelled, [el]);\n    },\n    onLeaveCancelled(el) {\n      finishLeave(el);\n      callHook(onLeaveCancelled, [el]);\n    }\n  });\n}\nfunction normalizeDuration(duration) {\n  if (duration == null) {\n    return null;\n  } else if (isObject(duration)) {\n    return [NumberOf(duration.enter), NumberOf(duration.leave)];\n  } else {\n    const n = NumberOf(duration);\n    return [n, n];\n  }\n}\nfunction NumberOf(val) {\n  const res = toNumber(val);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(res, \"<transition> explicit duration\");\n  }\n  return res;\n}\nfunction addTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.add(c));\n  (el._vtc || (el._vtc = /* @__PURE__ */ new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.remove(c));\n  const { _vtc } = el;\n  if (_vtc) {\n    _vtc.delete(cls);\n    if (!_vtc.size) {\n      el._vtc = void 0;\n    }\n  }\n}\nfunction nextFrame(cb) {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(cb);\n  });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n  const id = el._endId = ++endId;\n  const resolveIfNotStale = () => {\n    if (id === el._endId) {\n      resolve();\n    }\n  };\n  if (explicitTimeout) {\n    return setTimeout(resolveIfNotStale, explicitTimeout);\n  }\n  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n  if (!type) {\n    return resolve();\n  }\n  const endEvent = type + \"end\";\n  let ended = 0;\n  const end = () => {\n    el.removeEventListener(endEvent, onEnd);\n    resolveIfNotStale();\n  };\n  const onEnd = (e) => {\n    if (e.target === el && ++ended >= propCount) {\n      end();\n    }\n  };\n  setTimeout(() => {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n  const styles = window.getComputedStyle(el);\n  const getStyleProperties = (key) => (styles[key] || \"\").split(\", \");\n  const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n  const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n  const animationTimeout = getTimeout(animationDelays, animationDurations);\n  let type = null;\n  let timeout = 0;\n  let propCount = 0;\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n    propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n  }\n  const hasTransform = type === TRANSITION && /\\b(transform|all)(,|$)/.test(\n    getStyleProperties(`${TRANSITION}Property`).toString()\n  );\n  return {\n    type,\n    timeout,\n    propCount,\n    hasTransform\n  };\n}\nfunction getTimeout(delays, durations) {\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\nfunction toMs(s) {\n  return Number(s.slice(0, -1).replace(\",\", \".\")) * 1e3;\n}\nfunction forceReflow() {\n  return document.body.offsetHeight;\n}\n\nconst positionMap = /* @__PURE__ */ new WeakMap();\nconst newPositionMap = /* @__PURE__ */ new WeakMap();\nconst TransitionGroupImpl = {\n  name: \"TransitionGroup\",\n  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {\n    tag: String,\n    moveClass: String\n  }),\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    let prevChildren;\n    let children;\n    onUpdated(() => {\n      if (!prevChildren.length) {\n        return;\n      }\n      const moveClass = props.moveClass || `${props.name || \"v\"}-move`;\n      if (!hasCSSTransform(\n        prevChildren[0].el,\n        instance.vnode.el,\n        moveClass\n      )) {\n        return;\n      }\n      prevChildren.forEach(callPendingCbs);\n      prevChildren.forEach(recordPosition);\n      const movedChildren = prevChildren.filter(applyTranslation);\n      forceReflow();\n      movedChildren.forEach((c) => {\n        const el = c.el;\n        const style = el.style;\n        addTransitionClass(el, moveClass);\n        style.transform = style.webkitTransform = style.transitionDuration = \"\";\n        const cb = el._moveCb = (e) => {\n          if (e && e.target !== el) {\n            return;\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(\"transitionend\", cb);\n            el._moveCb = null;\n            removeTransitionClass(el, moveClass);\n          }\n        };\n        el.addEventListener(\"transitionend\", cb);\n      });\n    });\n    return () => {\n      const rawProps = toRaw(props);\n      const cssTransitionProps = resolveTransitionProps(rawProps);\n      let tag = rawProps.tag || Fragment;\n      prevChildren = children;\n      children = slots.default ? getTransitionRawChildren(slots.default()) : [];\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (child.key != null) {\n          setTransitionHooks(\n            child,\n            resolveTransitionHooks(child, cssTransitionProps, state, instance)\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(`<TransitionGroup> children must be keyed.`);\n        }\n      }\n      if (prevChildren) {\n        for (let i = 0; i < prevChildren.length; i++) {\n          const child = prevChildren[i];\n          setTransitionHooks(\n            child,\n            resolveTransitionHooks(child, cssTransitionProps, state, instance)\n          );\n          positionMap.set(child, child.el.getBoundingClientRect());\n        }\n      }\n      return createVNode(tag, null, children);\n    };\n  }\n};\nconst removeMode = (props) => delete props.mode;\n/* @__PURE__ */ removeMode(TransitionGroupImpl.props);\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n  const el = c.el;\n  if (el._moveCb) {\n    el._moveCb();\n  }\n  if (el._enterCb) {\n    el._enterCb();\n  }\n}\nfunction recordPosition(c) {\n  newPositionMap.set(c, c.el.getBoundingClientRect());\n}\nfunction applyTranslation(c) {\n  const oldPos = positionMap.get(c);\n  const newPos = newPositionMap.get(c);\n  const dx = oldPos.left - newPos.left;\n  const dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    const s = c.el.style;\n    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;\n    s.transitionDuration = \"0s\";\n    return c;\n  }\n}\nfunction hasCSSTransform(el, root, moveClass) {\n  const clone = el.cloneNode();\n  if (el._vtc) {\n    el._vtc.forEach((cls) => {\n      cls.split(/\\s+/).forEach((c) => c && clone.classList.remove(c));\n    });\n  }\n  moveClass.split(/\\s+/).forEach((c) => c && clone.classList.add(c));\n  clone.style.display = \"none\";\n  const container = root.nodeType === 1 ? root : root.parentNode;\n  container.appendChild(clone);\n  const { hasTransform } = getTransitionInfo(clone);\n  container.removeChild(clone);\n  return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n  const fn = vnode.props[\"onUpdate:modelValue\"] || false;\n  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n  e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n  const target = e.target;\n  if (target.composing) {\n    target.composing = false;\n    target.dispatchEvent(new Event(\"input\"));\n  }\n}\nconst vModelText = {\n  created(el, { modifiers: { lazy, trim, number } }, vnode) {\n    el._assign = getModelAssigner(vnode);\n    const castToNumber = number || vnode.props && vnode.props.type === \"number\";\n    addEventListener(el, lazy ? \"change\" : \"input\", (e) => {\n      if (e.target.composing)\n        return;\n      let domValue = el.value;\n      if (trim) {\n        domValue = domValue.trim();\n      }\n      if (castToNumber) {\n        domValue = looseToNumber(domValue);\n      }\n      el._assign(domValue);\n    });\n    if (trim) {\n      addEventListener(el, \"change\", () => {\n        el.value = el.value.trim();\n      });\n    }\n    if (!lazy) {\n      addEventListener(el, \"compositionstart\", onCompositionStart);\n      addEventListener(el, \"compositionend\", onCompositionEnd);\n      addEventListener(el, \"change\", onCompositionEnd);\n    }\n  },\n  // set value on mounted so it's after min/max for type=\"range\"\n  mounted(el, { value }) {\n    el.value = value == null ? \"\" : value;\n  },\n  beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {\n    el._assign = getModelAssigner(vnode);\n    if (el.composing)\n      return;\n    if (document.activeElement === el && el.type !== \"range\") {\n      if (lazy) {\n        return;\n      }\n      if (trim && el.value.trim() === value) {\n        return;\n      }\n      if ((number || el.type === \"number\") && looseToNumber(el.value) === value) {\n        return;\n      }\n    }\n    const newValue = value == null ? \"\" : value;\n    if (el.value !== newValue) {\n      el.value = newValue;\n    }\n  }\n};\nconst vModelCheckbox = {\n  // #4096 array checkboxes need to be deep traversed\n  deep: true,\n  created(el, _, vnode) {\n    el._assign = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      const modelValue = el._modelValue;\n      const elementValue = getValue(el);\n      const checked = el.checked;\n      const assign = el._assign;\n      if (isArray(modelValue)) {\n        const index = looseIndexOf(modelValue, elementValue);\n        const found = index !== -1;\n        if (checked && !found) {\n          assign(modelValue.concat(elementValue));\n        } else if (!checked && found) {\n          const filtered = [...modelValue];\n          filtered.splice(index, 1);\n          assign(filtered);\n        }\n      } else if (isSet(modelValue)) {\n        const cloned = new Set(modelValue);\n        if (checked) {\n          cloned.add(elementValue);\n        } else {\n          cloned.delete(elementValue);\n        }\n        assign(cloned);\n      } else {\n        assign(getCheckboxValue(el, checked));\n      }\n    });\n  },\n  // set initial checked on mount to wait for true-value/false-value\n  mounted: setChecked,\n  beforeUpdate(el, binding, vnode) {\n    el._assign = getModelAssigner(vnode);\n    setChecked(el, binding, vnode);\n  }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n  el._modelValue = value;\n  if (isArray(value)) {\n    el.checked = looseIndexOf(value, vnode.props.value) > -1;\n  } else if (isSet(value)) {\n    el.checked = value.has(vnode.props.value);\n  } else if (value !== oldValue) {\n    el.checked = looseEqual(value, getCheckboxValue(el, true));\n  }\n}\nconst vModelRadio = {\n  created(el, { value }, vnode) {\n    el.checked = looseEqual(value, vnode.props.value);\n    el._assign = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      el._assign(getValue(el));\n    });\n  },\n  beforeUpdate(el, { value, oldValue }, vnode) {\n    el._assign = getModelAssigner(vnode);\n    if (value !== oldValue) {\n      el.checked = looseEqual(value, vnode.props.value);\n    }\n  }\n};\nconst vModelSelect = {\n  // <select multiple> value need to be deep traversed\n  deep: true,\n  created(el, { value, modifiers: { number } }, vnode) {\n    const isSetModel = isSet(value);\n    addEventListener(el, \"change\", () => {\n      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(\n        (o) => number ? looseToNumber(getValue(o)) : getValue(o)\n      );\n      el._assign(\n        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]\n      );\n    });\n    el._assign = getModelAssigner(vnode);\n  },\n  // set value in mounted & updated because <select> relies on its children\n  // <option>s.\n  mounted(el, { value }) {\n    setSelected(el, value);\n  },\n  beforeUpdate(el, _binding, vnode) {\n    el._assign = getModelAssigner(vnode);\n  },\n  updated(el, { value }) {\n    setSelected(el, value);\n  }\n};\nfunction setSelected(el, value) {\n  const isMultiple = el.multiple;\n  if (isMultiple && !isArray(value) && !isSet(value)) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(\n      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`\n    );\n    return;\n  }\n  for (let i = 0, l = el.options.length; i < l; i++) {\n    const option = el.options[i];\n    const optionValue = getValue(option);\n    if (isMultiple) {\n      if (isArray(value)) {\n        option.selected = looseIndexOf(value, optionValue) > -1;\n      } else {\n        option.selected = value.has(optionValue);\n      }\n    } else {\n      if (looseEqual(getValue(option), value)) {\n        if (el.selectedIndex !== i)\n          el.selectedIndex = i;\n        return;\n      }\n    }\n  }\n  if (!isMultiple && el.selectedIndex !== -1) {\n    el.selectedIndex = -1;\n  }\n}\nfunction getValue(el) {\n  return \"_value\" in el ? el._value : el.value;\n}\nfunction getCheckboxValue(el, checked) {\n  const key = checked ? \"_trueValue\" : \"_falseValue\";\n  return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n  created(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"created\");\n  },\n  mounted(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"mounted\");\n  },\n  beforeUpdate(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"beforeUpdate\");\n  },\n  updated(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"updated\");\n  }\n};\nfunction resolveDynamicModel(tagName, type) {\n  switch (tagName) {\n    case \"SELECT\":\n      return vModelSelect;\n    case \"TEXTAREA\":\n      return vModelText;\n    default:\n      switch (type) {\n        case \"checkbox\":\n          return vModelCheckbox;\n        case \"radio\":\n          return vModelRadio;\n        default:\n          return vModelText;\n      }\n  }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n  const modelToUse = resolveDynamicModel(\n    el.tagName,\n    vnode.props && vnode.props.type\n  );\n  const fn = modelToUse[hook];\n  fn && fn(el, binding, vnode, prevVNode);\n}\nfunction initVModelForSSR() {\n  vModelText.getSSRProps = ({ value }) => ({ value });\n  vModelRadio.getSSRProps = ({ value }, vnode) => {\n    if (vnode.props && looseEqual(vnode.props.value, value)) {\n      return { checked: true };\n    }\n  };\n  vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n    if (isArray(value)) {\n      if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {\n        return { checked: true };\n      }\n    } else if (isSet(value)) {\n      if (vnode.props && value.has(vnode.props.value)) {\n        return { checked: true };\n      }\n    } else if (value) {\n      return { checked: true };\n    }\n  };\n  vModelDynamic.getSSRProps = (binding, vnode) => {\n    if (typeof vnode.type !== \"string\") {\n      return;\n    }\n    const modelToUse = resolveDynamicModel(\n      // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n      vnode.type.toUpperCase(),\n      vnode.props && vnode.props.type\n    );\n    if (modelToUse.getSSRProps) {\n      return modelToUse.getSSRProps(binding, vnode);\n    }\n  };\n}\n\nconst systemModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\"];\nconst modifierGuards = {\n  stop: (e) => e.stopPropagation(),\n  prevent: (e) => e.preventDefault(),\n  self: (e) => e.target !== e.currentTarget,\n  ctrl: (e) => !e.ctrlKey,\n  shift: (e) => !e.shiftKey,\n  alt: (e) => !e.altKey,\n  meta: (e) => !e.metaKey,\n  left: (e) => \"button\" in e && e.button !== 0,\n  middle: (e) => \"button\" in e && e.button !== 1,\n  right: (e) => \"button\" in e && e.button !== 2,\n  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))\n};\nconst withModifiers = (fn, modifiers) => {\n  return (event, ...args) => {\n    for (let i = 0; i < modifiers.length; i++) {\n      const guard = modifierGuards[modifiers[i]];\n      if (guard && guard(event, modifiers))\n        return;\n    }\n    return fn(event, ...args);\n  };\n};\nconst keyNames = {\n  esc: \"escape\",\n  space: \" \",\n  up: \"arrow-up\",\n  left: \"arrow-left\",\n  right: \"arrow-right\",\n  down: \"arrow-down\",\n  delete: \"backspace\"\n};\nconst withKeys = (fn, modifiers) => {\n  return (event) => {\n    if (!(\"key\" in event)) {\n      return;\n    }\n    const eventKey = hyphenate(event.key);\n    if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {\n      return fn(event);\n    }\n  };\n};\n\nconst vShow = {\n  beforeMount(el, { value }, { transition }) {\n    el._vod = el.style.display === \"none\" ? \"\" : el.style.display;\n    if (transition && value) {\n      transition.beforeEnter(el);\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  mounted(el, { value }, { transition }) {\n    if (transition && value) {\n      transition.enter(el);\n    }\n  },\n  updated(el, { value, oldValue }, { transition }) {\n    if (!value === !oldValue)\n      return;\n    if (transition) {\n      if (value) {\n        transition.beforeEnter(el);\n        setDisplay(el, true);\n        transition.enter(el);\n      } else {\n        transition.leave(el, () => {\n          setDisplay(el, false);\n        });\n      }\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  beforeUnmount(el, { value }) {\n    setDisplay(el, value);\n  }\n};\nfunction setDisplay(el, value) {\n  el.style.display = value ? el._vod : \"none\";\n}\nfunction initVShowForSSR() {\n  vShow.getSSRProps = ({ value }) => {\n    if (!value) {\n      return { style: { display: \"none\" } };\n    }\n  };\n}\n\nconst rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n  return renderer || (renderer = createRenderer(rendererOptions));\n}\nfunction ensureHydrationRenderer() {\n  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);\n  enabledHydration = true;\n  return renderer;\n}\nconst render = (...args) => {\n  ensureRenderer().render(...args);\n};\nconst hydrate = (...args) => {\n  ensureHydrationRenderer().hydrate(...args);\n};\nconst createApp = (...args) => {\n  const app = ensureRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (!container)\n      return;\n    const component = app._component;\n    if (!isFunction(component) && !component.render && !component.template) {\n      component.template = container.innerHTML;\n    }\n    container.innerHTML = \"\";\n    const proxy = mount(container, false, container instanceof SVGElement);\n    if (container instanceof Element) {\n      container.removeAttribute(\"v-cloak\");\n      container.setAttribute(\"data-v-app\", \"\");\n    }\n    return proxy;\n  };\n  return app;\n};\nconst createSSRApp = (...args) => {\n  const app = ensureHydrationRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (container) {\n      return mount(container, true, container instanceof SVGElement);\n    }\n  };\n  return app;\n};\nfunction injectNativeTagCheck(app) {\n  Object.defineProperty(app.config, \"isNativeTag\", {\n    value: (tag) => isHTMLTag(tag) || isSVGTag(tag),\n    writable: false\n  });\n}\nfunction injectCompilerOptionsCheck(app) {\n  if (isRuntimeOnly()) {\n    const isCustomElement = app.config.isCustomElement;\n    Object.defineProperty(app.config, \"isCustomElement\", {\n      get() {\n        return isCustomElement;\n      },\n      set() {\n        warn(\n          `The \\`isCustomElement\\` config option is deprecated. Use \\`compilerOptions.isCustomElement\\` instead.`\n        );\n      }\n    });\n    const compilerOptions = app.config.compilerOptions;\n    const msg = `The \\`compilerOptions\\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka \"full build\"). Since you are using the runtime-only build, \\`compilerOptions\\` must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\n- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;\n    Object.defineProperty(app.config, \"compilerOptions\", {\n      get() {\n        warn(msg);\n        return compilerOptions;\n      },\n      set() {\n        warn(msg);\n      }\n    });\n  }\n}\nfunction normalizeContainer(container) {\n  if (isString(container)) {\n    const res = document.querySelector(container);\n    if (!!(process.env.NODE_ENV !== \"production\") && !res) {\n      warn(\n        `Failed to mount app: mount target selector \"${container}\" returned null.`\n      );\n    }\n    return res;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === \"closed\") {\n    warn(\n      `mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`\n    );\n  }\n  return container;\n}\nlet ssrDirectiveInitialized = false;\nconst initDirectivesForSSR = () => {\n  if (!ssrDirectiveInitialized) {\n    ssrDirectiveInitialized = true;\n    initVModelForSSR();\n    initVShowForSSR();\n  }\n} ;\n\nexport { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };\n","var map = {\n\t\"./assets/export.mdx\": [\n\t\t78352,\n\t\t\"src_docs_pages_mdx_assets_export_mdx\"\n\t],\n\t\"./assets/import/models.mdx\": [\n\t\t74218,\n\t\t\"src_docs_pages_mdx_assets_import_models_mdx\"\n\t],\n\t\"./assets/import/textures.mdx\": [\n\t\t47044,\n\t\t\"src_docs_pages_mdx_assets_import_textures_mdx\"\n\t],\n\t\"./assets/index.mdx\": [\n\t\t8529,\n\t\t\"src_docs_pages_mdx_assets_index_mdx\"\n\t],\n\t\"./editor/codepreview.mdx\": [\n\t\t10694,\n\t\t\"src_docs_pages_mdx_editor_codepreview_mdx\"\n\t],\n\t\"./editor/config.mdx\": [\n\t\t51631,\n\t\t\"src_docs_pages_mdx_editor_config_mdx\"\n\t],\n\t\"./editor/copy_paste.mdx\": [\n\t\t45495,\n\t\t\"src_docs_pages_mdx_editor_copy_paste_mdx\"\n\t],\n\t\"./editor/index.mdx\": [\n\t\t58599,\n\t\t\"src_docs_pages_mdx_editor_index_mdx\"\n\t],\n\t\"./editor/network.mdx\": [\n\t\t12465,\n\t\t\"src_docs_pages_mdx_editor_network_mdx\"\n\t],\n\t\"./editor/params.mdx\": [\n\t\t42925,\n\t\t\"src_docs_pages_mdx_editor_params_mdx\"\n\t],\n\t\"./editor/performance.mdx\": [\n\t\t90845,\n\t\t\"src_docs_pages_mdx_editor_performance_mdx\"\n\t],\n\t\"./editor/scenetree.mdx\": [\n\t\t42599,\n\t\t\"src_docs_pages_mdx_editor_scenetree_mdx\"\n\t],\n\t\"./editor/spreadsheet.mdx\": [\n\t\t88727,\n\t\t\"src_docs_pages_mdx_editor_spreadsheet_mdx\"\n\t],\n\t\"./editor/viewer.mdx\": [\n\t\t94101,\n\t\t\"src_docs_pages_mdx_editor_viewer_mdx\"\n\t],\n\t\"./export/index.mdx\": [\n\t\t23749,\n\t\t\"src_docs_pages_mdx_export_index_mdx\"\n\t],\n\t\"./export/local.mdx\": [\n\t\t26082,\n\t\t\"src_docs_pages_mdx_export_local_mdx\"\n\t],\n\t\"./export/online.mdx\": [\n\t\t40229,\n\t\t\"src_docs_pages_mdx_export_online_mdx\"\n\t],\n\t\"./index.mdx\": [\n\t\t49079,\n\t\t\"src_docs_pages_mdx_index_mdx\"\n\t],\n\t\"./install/add.mdx\": [\n\t\t48989,\n\t\t\"src_docs_pages_mdx_install_add_mdx\"\n\t],\n\t\"./install/index.mdx\": [\n\t\t6167,\n\t\t\"src_docs_pages_mdx_install_index_mdx\"\n\t],\n\t\"./install/new.mdx\": [\n\t\t49435,\n\t\t\"src_docs_pages_mdx_install_new_mdx\"\n\t],\n\t\"./integrations/fxhash.mdx\": [\n\t\t17732,\n\t\t\"src_docs_pages_mdx_integrations_fxhash_mdx\"\n\t],\n\t\"./integrations/git.mdx\": [\n\t\t58057,\n\t\t\"src_docs_pages_mdx_integrations_git_mdx\"\n\t],\n\t\"./integrations/index.mdx\": [\n\t\t67906,\n\t\t\"src_docs_pages_mdx_integrations_index_mdx\"\n\t],\n\t\"./integrations/mapbox.mdx\": [\n\t\t46124,\n\t\t\"src_docs_pages_mdx_integrations_mapbox_mdx\"\n\t],\n\t\"./integrations/react.mdx\": [\n\t\t95722,\n\t\t\"src_docs_pages_mdx_integrations_react_mdx\"\n\t],\n\t\"./integrations/react_three_fiber.mdx\": [\n\t\t27294,\n\t\t\"src_docs_pages_mdx_integrations_react_three_fiber_mdx\"\n\t],\n\t\"./integrations/s3.mdx\": [\n\t\t95749,\n\t\t\"src_docs_pages_mdx_integrations_s3_mdx\"\n\t],\n\t\"./integrations/threejs.mdx\": [\n\t\t53200,\n\t\t\"src_docs_pages_mdx_integrations_threejs_mdx\"\n\t],\n\t\"./integrations/threejs/stepbystep.mdx\": [\n\t\t96322,\n\t\t\"src_docs_pages_mdx_integrations_threejs_stepbystep_mdx\"\n\t],\n\t\"./integrations/vue.mdx\": [\n\t\t27581,\n\t\t\"src_docs_pages_mdx_integrations_vue_mdx\"\n\t],\n\t\"./integrations/webflow.mdx\": [\n\t\t79617,\n\t\t\"src_docs_pages_mdx_integrations_webflow_mdx\"\n\t],\n\t\"./integrations/wordpress.mdx\": [\n\t\t7912,\n\t\t\"src_docs_pages_mdx_integrations_wordpress_mdx\"\n\t],\n\t\"./multiplayer.mdx\": [\n\t\t61246,\n\t\t\"src_docs_pages_mdx_multiplayer_mdx\"\n\t],\n\t\"./plugins/ifc.mdx\": [\n\t\t21025,\n\t\t\"src_docs_pages_mdx_plugins_ifc_mdx\"\n\t],\n\t\"./plugins/index.mdx\": [\n\t\t80865,\n\t\t\"src_docs_pages_mdx_plugins_index_mdx\"\n\t],\n\t\"./plugins/mapbox.mdx\": [\n\t\t389,\n\t\t\"src_docs_pages_mdx_plugins_mapbox_mdx\"\n\t],\n\t\"./plugins/marker-tracking.mdx\": [\n\t\t65235,\n\t\t\"src_docs_pages_mdx_plugins_marker-tracking_mdx\"\n\t],\n\t\"./plugins/occlusion.mdx\": [\n\t\t31768,\n\t\t\"src_docs_pages_mdx_plugins_occlusion_mdx\"\n\t],\n\t\"./plugins/trace.mdx\": [\n\t\t49243,\n\t\t\"src_docs_pages_mdx_plugins_trace_mdx\"\n\t],\n\t\"./resources/api.mdx\": [\n\t\t30125,\n\t\t\"src_docs_pages_mdx_resources_api_mdx\"\n\t],\n\t\"./resources/audio.mdx\": [\n\t\t72537,\n\t\t\"src_docs_pages_mdx_resources_audio_mdx\"\n\t],\n\t\"./resources/design.mdx\": [\n\t\t76135,\n\t\t\"src_docs_pages_mdx_resources_design_mdx\"\n\t],\n\t\"./resources/forums.mdx\": [\n\t\t78680,\n\t\t\"src_docs_pages_mdx_resources_forums_mdx\"\n\t],\n\t\"./resources/index.mdx\": [\n\t\t50560,\n\t\t\"src_docs_pages_mdx_resources_index_mdx\"\n\t],\n\t\"./resources/materials.mdx\": [\n\t\t68653,\n\t\t\"src_docs_pages_mdx_resources_materials_mdx\"\n\t],\n\t\"./resources/models.mdx\": [\n\t\t127,\n\t\t\"src_docs_pages_mdx_resources_models_mdx\"\n\t],\n\t\"./resources/site_builders.mdx\": [\n\t\t78448,\n\t\t\"src_docs_pages_mdx_resources_site_builders_mdx\"\n\t],\n\t\"./resources/textures.mdx\": [\n\t\t93788,\n\t\t\"src_docs_pages_mdx_resources_textures_mdx\"\n\t],\n\t\"./resources/threejs.mdx\": [\n\t\t51079,\n\t\t\"src_docs_pages_mdx_resources_threejs_mdx\"\n\t],\n\t\"./tutorials/camera_renderer.mdx\": [\n\t\t68091,\n\t\t\"src_docs_pages_mdx_tutorials_camera_renderer_mdx\"\n\t],\n\t\"./tutorials/configurator.mdx\": [\n\t\t89616,\n\t\t\"src_docs_pages_mdx_tutorials_configurator_mdx\"\n\t],\n\t\"./tutorials/debugging.mdx\": [\n\t\t8983,\n\t\t\"src_docs_pages_mdx_tutorials_debugging_mdx\"\n\t],\n\t\"./tutorials/index.mdx\": [\n\t\t1936,\n\t\t\"src_docs_pages_mdx_tutorials_index_mdx\"\n\t],\n\t\"./tutorials/instancing.mdx\": [\n\t\t34896,\n\t\t\"src_docs_pages_mdx_tutorials_instancing_mdx\"\n\t],\n\t\"./tutorials/introducing_audio_nodes.mdx\": [\n\t\t43583,\n\t\t\"src_docs_pages_mdx_tutorials_introducing_audio_nodes_mdx\"\n\t],\n\t\"./tutorials/mapbox_basics.mdx\": [\n\t\t35587,\n\t\t\"src_docs_pages_mdx_tutorials_mapbox_basics_mdx\"\n\t],\n\t\"./tutorials/marketplace.mdx\": [\n\t\t58007,\n\t\t\"src_docs_pages_mdx_tutorials_marketplace_mdx\"\n\t],\n\t\"./tutorials/marketplace_edit_templates.mdx\": [\n\t\t40442,\n\t\t\"src_docs_pages_mdx_tutorials_marketplace_edit_templates_mdx\"\n\t],\n\t\"./tutorials/particles_logo.mdx\": [\n\t\t19077,\n\t\t\"src_docs_pages_mdx_tutorials_particles_logo_mdx\"\n\t],\n\t\"./tutorials/particles_music.mdx\": [\n\t\t18697,\n\t\t\"src_docs_pages_mdx_tutorials_particles_music_mdx\"\n\t],\n\t\"./tutorials/poly_nodes.mdx\": [\n\t\t86623,\n\t\t\"src_docs_pages_mdx_tutorials_poly_nodes_mdx\"\n\t],\n\t\"./tutorials/preparing_models.mdx\": [\n\t\t40386,\n\t\t\"src_docs_pages_mdx_tutorials_preparing_models_mdx\"\n\t],\n\t\"./tutorials/states_and_events_introduction.mdx\": [\n\t\t58510,\n\t\t\"src_docs_pages_mdx_tutorials_states_and_events_introduction_mdx\"\n\t],\n\t\"./tutorials/troubleshooting.mdx\": [\n\t\t96390,\n\t\t\"src_docs_pages_mdx_tutorials_troubleshooting_mdx\"\n\t],\n\t\"./upgrade.mdx\": [\n\t\t85914,\n\t\t\"src_docs_pages_mdx_upgrade_mdx\"\n\t],\n\t\"./your_first_scene.mdx\": [\n\t\t2088,\n\t\t\"src_docs_pages_mdx_your_first_scene_mdx\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 54486;\nmodule.exports = webpackAsyncContext;","var process = process || {};\n(function () {\n  \"use strict\";\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\nvar isWindows = process.platform === 'win32';\nvar util = require('util');\n\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n\nif (isWindows) {\n  // Regex to split a windows path into three parts: [*, device, slash,\n  // tail] windows-only\n  var splitDeviceRe =\n      /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\n  // Regex to split the tail part of the above into [*, dir, basename, ext]\n  var splitTailRe =\n      /^([\\s\\S]*?)((?:\\.{1,2}|[^\\\\\\/]+?|)(\\.[^.\\/\\\\]*|))(?:[\\\\\\/]*)$/;\n\n  // Function to split a filename into [root, dir, basename, ext]\n  // windows version\n  var splitPath = function(filename) {\n    // Separate device+slash from tail\n    var result = splitDeviceRe.exec(filename),\n        device = (result[1] || '') + (result[2] || ''),\n        tail = result[3] || '';\n    // Split the tail into dir, basename and extension\n    var result2 = splitTailRe.exec(tail),\n        dir = result2[1],\n        basename = result2[2],\n        ext = result2[3];\n    return [device, dir, basename, ext];\n  };\n\n  var normalizeUNCRoot = function(device) {\n    return '\\\\\\\\' + device.replace(/^[\\\\\\/]+/, '').replace(/[\\\\\\/]+/g, '\\\\');\n  };\n\n  // path.resolve([from ...], to)\n  // windows version\n  exports.resolve = function() {\n    var resolvedDevice = '',\n        resolvedTail = '',\n        resolvedAbsolute = false;\n\n    for (var i = arguments.length - 1; i >= -1; i--) {\n      var path;\n      if (i >= 0) {\n        path = arguments[i];\n      } else if (!resolvedDevice) {\n        path = process.cwd();\n      } else {\n        // Windows has the concept of drive-specific current working\n        // directories. If we've resolved a drive letter but not yet an\n        // absolute path, get cwd for that drive. We're sure the device is not\n        // an unc path at this points, because unc paths are always absolute.\n        path = process.env['=' + resolvedDevice];\n        // Verify that a drive-local cwd was found and that it actually points\n        // to our drive. If not, default to the drive's root.\n        if (!path || path.substr(0, 3).toLowerCase() !==\n            resolvedDevice.toLowerCase() + '\\\\') {\n          path = resolvedDevice + '\\\\';\n        }\n      }\n\n      // Skip empty and invalid entries\n      if (!util.isString(path)) {\n        throw new TypeError('Arguments to path.resolve must be strings');\n      } else if (!path) {\n        continue;\n      }\n\n      var result = splitDeviceRe.exec(path),\n          device = result[1] || '',\n          isUnc = device && device.charAt(1) !== ':',\n          isAbsolute = exports.isAbsolute(path),\n          tail = result[3];\n\n      if (device &&\n          resolvedDevice &&\n          device.toLowerCase() !== resolvedDevice.toLowerCase()) {\n        // This path points to another device so it is not applicable\n        continue;\n      }\n\n      if (!resolvedDevice) {\n        resolvedDevice = device;\n      }\n      if (!resolvedAbsolute) {\n        resolvedTail = tail + '\\\\' + resolvedTail;\n        resolvedAbsolute = isAbsolute;\n      }\n\n      if (resolvedDevice && resolvedAbsolute) {\n        break;\n      }\n    }\n\n    // Convert slashes to backslashes when `resolvedDevice` points to an UNC\n    // root. Also squash multiple slashes into a single one where appropriate.\n    if (isUnc) {\n      resolvedDevice = normalizeUNCRoot(resolvedDevice);\n    }\n\n    // At this point the path should be resolved to a full absolute path,\n    // but handle relative paths to be safe (might happen when process.cwd()\n    // fails)\n\n    // Normalize the tail path\n\n    function f(p) {\n      return !!p;\n    }\n\n    resolvedTail = normalizeArray(resolvedTail.split(/[\\\\\\/]+/).filter(f),\n                                  !resolvedAbsolute).join('\\\\');\n\n    return (resolvedDevice + (resolvedAbsolute ? '\\\\' : '') + resolvedTail) ||\n           '.';\n  };\n\n  // windows version\n  exports.normalize = function(path) {\n    var result = splitDeviceRe.exec(path),\n        device = result[1] || '',\n        isUnc = device && device.charAt(1) !== ':',\n        isAbsolute = exports.isAbsolute(path),\n        tail = result[3],\n        trailingSlash = /[\\\\\\/]$/.test(tail);\n\n    // If device is a drive letter, we'll normalize to lower case.\n    if (device && device.charAt(1) === ':') {\n      device = device[0].toLowerCase() + device.substr(1);\n    }\n\n    // Normalize the tail path\n    tail = normalizeArray(tail.split(/[\\\\\\/]+/).filter(function(p) {\n      return !!p;\n    }), !isAbsolute).join('\\\\');\n\n    if (!tail && !isAbsolute) {\n      tail = '.';\n    }\n    if (tail && trailingSlash) {\n      tail += '\\\\';\n    }\n\n    // Convert slashes to backslashes when `device` points to an UNC root.\n    // Also squash multiple slashes into a single one where appropriate.\n    if (isUnc) {\n      device = normalizeUNCRoot(device);\n    }\n\n    return device + (isAbsolute ? '\\\\' : '') + tail;\n  };\n\n  // windows version\n  exports.isAbsolute = function(path) {\n    var result = splitDeviceRe.exec(path),\n        device = result[1] || '',\n        isUnc = !!device && device.charAt(1) !== ':';\n    // UNC paths are always absolute\n    return !!result[2] || isUnc;\n  };\n\n  // windows version\n  exports.join = function() {\n    function f(p) {\n      if (!util.isString(p)) {\n        throw new TypeError('Arguments to path.join must be strings');\n      }\n      return p;\n    }\n\n    var paths = Array.prototype.filter.call(arguments, f);\n    var joined = paths.join('\\\\');\n\n    // Make sure that the joined path doesn't start with two slashes, because\n    // normalize() will mistake it for an UNC path then.\n    //\n    // This step is skipped when it is very clear that the user actually\n    // intended to point at an UNC path. This is assumed when the first\n    // non-empty string arguments starts with exactly two slashes followed by\n    // at least one more non-slash character.\n    //\n    // Note that for normalize() to treat a path as an UNC path it needs to\n    // have at least 2 components, so we don't filter for that here.\n    // This means that the user can use join to construct UNC paths from\n    // a server name and a share name; for example:\n    //   path.join('//server', 'share') -> '\\\\\\\\server\\\\share\\')\n    if (!/^[\\\\\\/]{2}[^\\\\\\/]/.test(paths[0])) {\n      joined = joined.replace(/^[\\\\\\/]{2,}/, '\\\\');\n    }\n\n    return exports.normalize(joined);\n  };\n\n  // path.relative(from, to)\n  // it will solve the relative path from 'from' to 'to', for instance:\n  // from = 'C:\\\\orandea\\\\test\\\\aaa'\n  // to = 'C:\\\\orandea\\\\impl\\\\bbb'\n  // The output of the function should be: '..\\\\..\\\\impl\\\\bbb'\n  // windows version\n  exports.relative = function(from, to) {\n    from = exports.resolve(from);\n    to = exports.resolve(to);\n\n    // windows is not case sensitive\n    var lowerFrom = from.toLowerCase();\n    var lowerTo = to.toLowerCase();\n\n    function trim(arr) {\n      var start = 0;\n      for (; start < arr.length; start++) {\n        if (arr[start] !== '') break;\n      }\n\n      var end = arr.length - 1;\n      for (; end >= 0; end--) {\n        if (arr[end] !== '') break;\n      }\n\n      if (start > end) return [];\n      return arr.slice(start, end + 1);\n    }\n\n    var toParts = trim(to.split('\\\\'));\n\n    var lowerFromParts = trim(lowerFrom.split('\\\\'));\n    var lowerToParts = trim(lowerTo.split('\\\\'));\n\n    var length = Math.min(lowerFromParts.length, lowerToParts.length);\n    var samePartsLength = length;\n    for (var i = 0; i < length; i++) {\n      if (lowerFromParts[i] !== lowerToParts[i]) {\n        samePartsLength = i;\n        break;\n      }\n    }\n\n    if (samePartsLength == 0) {\n      return to;\n    }\n\n    var outputParts = [];\n    for (var i = samePartsLength; i < lowerFromParts.length; i++) {\n      outputParts.push('..');\n    }\n\n    outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n    return outputParts.join('\\\\');\n  };\n\n  exports.sep = '\\\\';\n  exports.delimiter = ';';\n\n} else /* posix */ {\n\n  // Split a filename into [root, dir, basename, ext], unix version\n  // 'root' is just a slash, or nothing.\n  var splitPathRe =\n      /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n  var splitPath = function(filename) {\n    return splitPathRe.exec(filename).slice(1);\n  };\n\n  // path.resolve([from ...], to)\n  // posix version\n  exports.resolve = function() {\n    var resolvedPath = '',\n        resolvedAbsolute = false;\n\n    for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n      var path = (i >= 0) ? arguments[i] : process.cwd();\n\n      // Skip empty and invalid entries\n      if (!util.isString(path)) {\n        throw new TypeError('Arguments to path.resolve must be strings');\n      } else if (!path) {\n        continue;\n      }\n\n      resolvedPath = path + '/' + resolvedPath;\n      resolvedAbsolute = path.charAt(0) === '/';\n    }\n\n    // At this point the path should be resolved to a full absolute path, but\n    // handle relative paths to be safe (might happen when process.cwd() fails)\n\n    // Normalize the path\n    resolvedPath = normalizeArray(resolvedPath.split('/').filter(function(p) {\n      return !!p;\n    }), !resolvedAbsolute).join('/');\n\n    return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n  };\n\n  // path.normalize(path)\n  // posix version\n  exports.normalize = function(path) {\n    var isAbsolute = exports.isAbsolute(path),\n        trailingSlash = path[path.length - 1] === '/',\n        segments = path.split('/'),\n        nonEmptySegments = [];\n\n    // Normalize the path\n    for (var i = 0; i < segments.length; i++) {\n      if (segments[i]) {\n        nonEmptySegments.push(segments[i]);\n      }\n    }\n    path = normalizeArray(nonEmptySegments, !isAbsolute).join('/');\n\n    if (!path && !isAbsolute) {\n      path = '.';\n    }\n    if (path && trailingSlash) {\n      path += '/';\n    }\n\n    return (isAbsolute ? '/' : '') + path;\n  };\n\n  // posix version\n  exports.isAbsolute = function(path) {\n    return path.charAt(0) === '/';\n  };\n\n  // posix version\n  exports.join = function() {\n    var path = '';\n    for (var i = 0; i < arguments.length; i++) {\n      var segment = arguments[i];\n      if (!util.isString(segment)) {\n        throw new TypeError('Arguments to path.join must be strings');\n      }\n      if (segment) {\n        if (!path) {\n          path += segment;\n        } else {\n          path += '/' + segment;\n        }\n      }\n    }\n    return exports.normalize(path);\n  };\n\n\n  // path.relative(from, to)\n  // posix version\n  exports.relative = function(from, to) {\n    from = exports.resolve(from).substr(1);\n    to = exports.resolve(to).substr(1);\n\n    function trim(arr) {\n      var start = 0;\n      for (; start < arr.length; start++) {\n        if (arr[start] !== '') break;\n      }\n\n      var end = arr.length - 1;\n      for (; end >= 0; end--) {\n        if (arr[end] !== '') break;\n      }\n\n      if (start > end) return [];\n      return arr.slice(start, end + 1);\n    }\n\n    var fromParts = trim(from.split('/'));\n    var toParts = trim(to.split('/'));\n\n    var length = Math.min(fromParts.length, toParts.length);\n    var samePartsLength = length;\n    for (var i = 0; i < length; i++) {\n      if (fromParts[i] !== toParts[i]) {\n        samePartsLength = i;\n        break;\n      }\n    }\n\n    var outputParts = [];\n    for (var i = samePartsLength; i < fromParts.length; i++) {\n      outputParts.push('..');\n    }\n\n    outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n    return outputParts.join('/');\n  };\n\n  exports.sep = '/';\n  exports.delimiter = ':';\n}\n\nexports.dirname = function(path) {\n  var result = splitPath(path),\n      root = result[0],\n      dir = result[1];\n\n  if (!root && !dir) {\n    // No dirname whatsoever\n    return '.';\n  }\n\n  if (dir) {\n    // It has a dirname, strip trailing slash\n    dir = dir.substr(0, dir.length - 1);\n  }\n\n  return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n  var f = splitPath(path)[2];\n  // TODO: make this comparison case-insensitive on windows?\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\n\nexports.extname = function(path) {\n  return splitPath(path)[3];\n};\n\n\nexports.exists = util.deprecate(function(path, callback) {\n  require('fs').exists(path, callback);\n}, 'path.exists is now called `fs.exists`.');\n\n\nexports.existsSync = util.deprecate(function(path) {\n  return require('fs').existsSync(path);\n}, 'path.existsSync is now called `fs.existsSync`.');\n\n\nif (isWindows) {\n  exports._makeLong = function(path) {\n    // Note: this will *probably* throw somewhere.\n    if (!util.isString(path))\n      return path;\n\n    if (!path) {\n      return '';\n    }\n\n    var resolvedPath = exports.resolve(path);\n\n    if (/^[a-zA-Z]\\:\\\\/.test(resolvedPath)) {\n      // path is local filesystem path, which needs to be converted\n      // to long UNC path.\n      return '\\\\\\\\?\\\\' + resolvedPath;\n    } else if (/^\\\\\\\\[^?.]/.test(resolvedPath)) {\n      // path is network UNC path, which needs to be converted\n      // to long UNC path.\n      return '\\\\\\\\?\\\\UNC\\\\' + resolvedPath.substring(2);\n    }\n\n    return path;\n  };\n} else {\n  exports._makeLong = function(path) {\n    return path;\n  };\n}\n}());\n","/* (ignored) */","/* (ignored) */","/* (ignored) */","/* (ignored) */","// src/index.ts\nimport { ReactiveEffect, isReactive, isRef, isShallow } from \"@vue/reactivity\";\nimport { NOOP, hasChanged, isArray, isFunction as isFunction2, isObject } from \"@vue/shared\";\n\n// src/errorHandling.ts\nimport { isFunction, isPromise } from \"@vue/shared\";\nfunction callWithErrorHandling(fn, type, args) {\n  let res;\n  try {\n    res = args ? fn(...args) : fn();\n  } catch (err) {\n    handleError(err, type);\n  }\n  return res;\n}\nfunction callWithAsyncErrorHandling(fn, type, args) {\n  if (isFunction(fn)) {\n    const res = callWithErrorHandling(fn, type, args);\n    if (res && isPromise(res)) {\n      res.catch((err) => {\n        handleError(err, type);\n      });\n    }\n    return res;\n  }\n  const values = [];\n  for (let i = 0; i < fn.length; i++)\n    values.push(callWithAsyncErrorHandling(fn[i], type, args));\n  return values;\n}\nfunction handleError(err, type) {\n  console.error(new Error(`[@vue-reactivity/watch]: ${type}`));\n  console.error(err);\n}\nfunction warn(message) {\n  console.warn(createError(message));\n}\nfunction createError(message) {\n  return new Error(`[reactivue]: ${message}`);\n}\n\n// src/index.ts\nvar INITIAL_WATCHER_VALUE = {};\nfunction watchEffect(effect, options) {\n  return doWatch(effect, null, options);\n}\nfunction watch(source, cb, options) {\n  return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, { immediate, deep, flush } = {}) {\n  let getter;\n  let forceTrigger = false;\n  let isMultiSource = false;\n  if (isRef(source)) {\n    getter = () => source.value;\n    forceTrigger = isShallow(source);\n  } else if (isReactive(source)) {\n    getter = () => source;\n    deep = true;\n  } else if (isArray(source)) {\n    isMultiSource = true;\n    forceTrigger = source.some(isReactive);\n    getter = () => source.map((s) => {\n      if (isRef(s))\n        return s.value;\n      else if (isReactive(s))\n        return traverse(s);\n      else if (isFunction2(s))\n        return callWithErrorHandling(s, \"watch getter\");\n      else\n        return warn(\"invalid source\");\n    });\n  } else if (isFunction2(source)) {\n    if (cb) {\n      getter = () => callWithErrorHandling(source, \"watch getter\");\n    } else {\n      getter = () => {\n        if (cleanup)\n          cleanup();\n        return callWithAsyncErrorHandling(source, \"watch callback\", [onCleanup]);\n      };\n    }\n  } else {\n    getter = NOOP;\n  }\n  if (cb && deep) {\n    const baseGetter = getter;\n    getter = () => traverse(baseGetter());\n  }\n  let cleanup;\n  let onCleanup = (fn) => {\n    cleanup = effect.onStop = () => {\n      callWithErrorHandling(fn, \"watch cleanup\");\n    };\n  };\n  let oldValue = isMultiSource ? [] : INITIAL_WATCHER_VALUE;\n  const job = () => {\n    if (!effect.active)\n      return;\n    if (cb) {\n      const newValue = effect.run();\n      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n        if (cleanup)\n          cleanup();\n        callWithAsyncErrorHandling(cb, \"watch value\", [\n          newValue,\n          oldValue === INITIAL_WATCHER_VALUE ? void 0 : oldValue,\n          onCleanup\n        ]);\n        oldValue = newValue;\n      }\n    } else {\n      effect.run();\n    }\n  };\n  job.allowRecurse = !!cb;\n  let scheduler;\n  if (flush === \"sync\") {\n    scheduler = job;\n  } else {\n    scheduler = () => {\n      job();\n    };\n  }\n  const effect = new ReactiveEffect(getter, scheduler);\n  if (cb) {\n    if (immediate)\n      job();\n    else\n      oldValue = effect.run();\n  } else {\n    effect.run();\n  }\n  return () => effect.stop();\n}\nfunction traverse(value, seen = /* @__PURE__ */ new Set()) {\n  if (!isObject(value) || seen.has(value))\n    return value;\n  seen.add(value);\n  if (isArray(value)) {\n    for (let i = 0; i < value.length; i++)\n      traverse(value[i], seen);\n  } else if (value instanceof Map) {\n    value.forEach((_, key) => {\n      traverse(value.get(key), seen);\n    });\n  } else if (value instanceof Set) {\n    value.forEach((v) => {\n      traverse(v, seen);\n    });\n  } else {\n    for (const key of Object.keys(value))\n      traverse(value[key], seen);\n  }\n  return value;\n}\nexport {\n  watch,\n  watchEffect\n};\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nexport default baseGetTag;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","/**\n * postprocessing v6.36.3 build Thu Sep 26 2024\n * https://github.com/pmndrs/postprocessing\n * Copyright 2015-2024 Raoul van Rüschen\n * @license Zlib\n */\n\n// package.json\nvar version = \"6.36.3\";\n\n// src/core/Disposable.js\nvar Disposable = class {\n  /**\n   * Frees internal resources.\n   */\n  dispose() {\n  }\n};\n\n// src/core/EffectComposer.js\nimport {\n  DepthStencilFormat,\n  DepthTexture,\n  LinearFilter as LinearFilter2,\n  SRGBColorSpace as SRGBColorSpace2,\n  UnsignedByteType as UnsignedByteType2,\n  UnsignedIntType,\n  UnsignedInt248Type,\n  Vector2,\n  WebGLRenderTarget as WebGLRenderTarget3\n} from \"three\";\n\n// src/core/Timer.js\nvar MILLISECONDS_TO_SECONDS = 1 / 1e3;\nvar SECONDS_TO_MILLISECONDS = 1e3;\nvar Timer = class {\n  /**\n   * Constructs a new timer.\n   */\n  constructor() {\n    this.startTime = performance.now();\n    this.previousTime = 0;\n    this.currentTime = 0;\n    this._delta = 0;\n    this._elapsed = 0;\n    this._fixedDelta = 1e3 / 60;\n    this.timescale = 1;\n    this.useFixedDelta = false;\n    this._autoReset = false;\n  }\n  /**\n   * Enables or disables auto reset based on page visibility.\n   *\n   * If enabled, the timer will be reset when the page becomes visible. This effectively pauses the timer when the page\n   * is hidden. Has no effect if the API is not supported.\n   *\n   * @type {Boolean}\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API\n   */\n  get autoReset() {\n    return this._autoReset;\n  }\n  set autoReset(value) {\n    if (typeof document !== \"undefined\" && document.hidden !== void 0) {\n      if (value) {\n        document.addEventListener(\"visibilitychange\", this);\n      } else {\n        document.removeEventListener(\"visibilitychange\", this);\n      }\n      this._autoReset = value;\n    }\n  }\n  get delta() {\n    return this._delta * MILLISECONDS_TO_SECONDS;\n  }\n  get fixedDelta() {\n    return this._fixedDelta * MILLISECONDS_TO_SECONDS;\n  }\n  set fixedDelta(value) {\n    this._fixedDelta = value * SECONDS_TO_MILLISECONDS;\n  }\n  get elapsed() {\n    return this._elapsed * MILLISECONDS_TO_SECONDS;\n  }\n  /**\n   * Updates this timer.\n   *\n   * @param {Boolean} [timestamp] - The current time in milliseconds.\n   */\n  update(timestamp) {\n    if (this.useFixedDelta) {\n      this._delta = this.fixedDelta;\n    } else {\n      this.previousTime = this.currentTime;\n      this.currentTime = (timestamp !== void 0 ? timestamp : performance.now()) - this.startTime;\n      this._delta = this.currentTime - this.previousTime;\n    }\n    this._delta *= this.timescale;\n    this._elapsed += this._delta;\n  }\n  /**\n   * Resets this timer.\n   */\n  reset() {\n    this._delta = 0;\n    this._elapsed = 0;\n    this.currentTime = performance.now() - this.startTime;\n  }\n  getDelta() {\n    return this.delta;\n  }\n  getElapsed() {\n    return this.elapsed;\n  }\n  handleEvent(e) {\n    if (!document.hidden) {\n      this.currentTime = performance.now() - this.startTime;\n    }\n  }\n  dispose() {\n    this.autoReset = false;\n  }\n};\n\n// src/passes/Pass.js\nimport {\n  BasicDepthPacking,\n  BufferAttribute,\n  BufferGeometry,\n  Camera,\n  Material,\n  Mesh,\n  Scene,\n  Texture,\n  WebGLRenderTarget\n} from \"three\";\nvar fullscreenGeometry = /* @__PURE__ */ (() => {\n  const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]);\n  const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);\n  const geometry = new BufferGeometry();\n  geometry.setAttribute(\"position\", new BufferAttribute(vertices, 3));\n  geometry.setAttribute(\"uv\", new BufferAttribute(uvs, 2));\n  return geometry;\n})();\nvar Pass = class _Pass {\n  /**\n   * A shared fullscreen triangle.\n   *\n   * The screen size is 2x2 units (NDC). A triangle needs to be 4x4 units to fill the screen.\n   * @see https://michaldrobot.com/2014/04/01/gcn-execution-patterns-in-full-screen-passes/\n   * @type {BufferGeometry}\n   * @internal\n   */\n  static get fullscreenGeometry() {\n    return fullscreenGeometry;\n  }\n  /**\n   * Constructs a new pass.\n   *\n   * @param {String} [name] - The name of this pass. Does not have to be unique.\n   * @param {Scene} [scene] - The scene to render. The default scene contains a single mesh that fills the screen.\n   * @param {Camera} [camera] - A camera. Fullscreen effect passes don't require a camera.\n   */\n  constructor(name = \"Pass\", scene = new Scene(), camera = new Camera()) {\n    this.name = name;\n    this.renderer = null;\n    this.scene = scene;\n    this.camera = camera;\n    this.screen = null;\n    this.rtt = true;\n    this.needsSwap = true;\n    this.needsDepthTexture = false;\n    this.enabled = true;\n  }\n  /**\n   * Sets the render to screen flag.\n   *\n   * If this flag is changed, the fullscreen material will be updated as well.\n   *\n   * @type {Boolean}\n   */\n  get renderToScreen() {\n    return !this.rtt;\n  }\n  set renderToScreen(value) {\n    if (this.rtt === value) {\n      const material = this.fullscreenMaterial;\n      if (material !== null) {\n        material.needsUpdate = true;\n      }\n      this.rtt = !value;\n    }\n  }\n  /**\n   * Sets the main scene.\n   *\n   * @type {Scene}\n   */\n  set mainScene(value) {\n  }\n  /**\n   * Sets the main camera.\n   *\n   * @type {Camera}\n   */\n  set mainCamera(value) {\n  }\n  /**\n   * Sets the renderer\n   *\n   * @deprecated\n   * @param {WebGLRenderer} renderer - The renderer.\n   */\n  setRenderer(renderer) {\n    this.renderer = renderer;\n  }\n  /**\n   * Indicates whether this pass is enabled.\n   *\n   * @deprecated Use enabled instead.\n   * @return {Boolean} Whether this pass is enabled.\n   */\n  isEnabled() {\n    return this.enabled;\n  }\n  /**\n   * Enables or disables this pass.\n   *\n   * @deprecated Use enabled instead.\n   * @param {Boolean} value - Whether the pass should be enabled.\n   */\n  setEnabled(value) {\n    this.enabled = value;\n  }\n  /**\n   * The fullscreen material.\n   *\n   * @type {Material}\n   */\n  get fullscreenMaterial() {\n    return this.screen !== null ? this.screen.material : null;\n  }\n  set fullscreenMaterial(value) {\n    let screen = this.screen;\n    if (screen !== null) {\n      screen.material = value;\n    } else {\n      screen = new Mesh(_Pass.fullscreenGeometry, value);\n      screen.frustumCulled = false;\n      if (this.scene === null) {\n        this.scene = new Scene();\n      }\n      this.scene.add(screen);\n      this.screen = screen;\n    }\n  }\n  /**\n   * Returns the current fullscreen material.\n   *\n   * @deprecated Use fullscreenMaterial instead.\n   * @return {Material} The current fullscreen material, or null if there is none.\n   */\n  getFullscreenMaterial() {\n    return this.fullscreenMaterial;\n  }\n  /**\n   * Sets the fullscreen material.\n   *\n   * @deprecated Use fullscreenMaterial instead.\n   * @protected\n   * @param {Material} value - A fullscreen material.\n   */\n  setFullscreenMaterial(value) {\n    this.fullscreenMaterial = value;\n  }\n  /**\n   * Returns the current depth texture.\n   *\n   * @return {Texture} The current depth texture, or null if there is none.\n   */\n  getDepthTexture() {\n    return null;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * This method will be called automatically by the {@link EffectComposer}.\n   * You may override this method if your pass relies on the depth information of a preceding {@link RenderPass}.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategy} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking) {\n  }\n  /**\n   * Renders this pass.\n   *\n   * This is an abstract method that must be overridden.\n   *\n   * @abstract\n   * @throws {Error} An error is thrown if the method is not overridden.\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    throw new Error(\"Render method not implemented!\");\n  }\n  /**\n   * Sets the size.\n   *\n   * You may override this method if you want to be informed about the size of the backbuffer/canvas.\n   * This method is called before {@link initialize} and every time the size of the {@link EffectComposer} changes.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * This method is called when this pass is added to an {@link EffectComposer}.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n  }\n  /**\n   * Performs a shallow search for disposable properties and deletes them.\n   *\n   * The {@link EffectComposer} calls this method when it is being destroyed. You can use it independently to free\n   * memory when you're certain that you don't need this pass anymore.\n   */\n  dispose() {\n    for (const key of Object.keys(this)) {\n      const property = this[key];\n      const isDisposable = property instanceof WebGLRenderTarget || property instanceof Material || property instanceof Texture || property instanceof _Pass;\n      if (isDisposable) {\n        this[key].dispose();\n      }\n    }\n    if (this.fullscreenMaterial !== null) {\n      this.fullscreenMaterial.dispose();\n    }\n  }\n};\n\n// src/passes/ClearMaskPass.js\nvar ClearMaskPass = class extends Pass {\n  /**\n   * Constructs a new clear mask pass.\n   */\n  constructor() {\n    super(\"ClearMaskPass\", null, null);\n    this.needsSwap = false;\n  }\n  /**\n   * Disables the global stencil test.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const stencil = renderer.state.buffers.stencil;\n    stencil.setLocked(false);\n    stencil.setTest(false);\n  }\n};\n\n// src/passes/CopyPass.js\nimport { LinearFilter, SRGBColorSpace, UnsignedByteType, WebGLRenderTarget as WebGLRenderTarget2 } from \"three\";\n\n// src/materials/CopyMaterial.js\nimport { NoBlending, ShaderMaterial, Uniform } from \"three\";\n\n// src/materials/glsl/copy.frag\nvar copy_default = \"#include <common>\\n#include <dithering_pars_fragment>\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform float opacity;varying vec2 vUv;void main(){vec4 texel=texture2D(inputBuffer,vUv);gl_FragColor=opacity*texel;\\n#include <colorspace_fragment>\\n#include <dithering_fragment>\\n}\";\n\n// src/materials/glsl/common.vert\nvar common_default = \"varying vec2 vUv;void main(){vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/CopyMaterial.js\nvar CopyMaterial = class extends ShaderMaterial {\n  /**\n   * Constructs a new copy material.\n   */\n  constructor() {\n    super({\n      name: \"CopyMaterial\",\n      uniforms: {\n        inputBuffer: new Uniform(null),\n        opacity: new Uniform(1)\n      },\n      blending: NoBlending,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: copy_default,\n      vertexShader: common_default\n    });\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Number} value - The buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Returns the opacity.\n   *\n   * @deprecated Use opacity instead.\n   * @return {Number} The opacity.\n   */\n  getOpacity(value) {\n    return this.uniforms.opacity.value;\n  }\n  /**\n   * Sets the opacity.\n   *\n   * @deprecated Use opacity instead.\n   * @param {Number} value - The opacity.\n   */\n  setOpacity(value) {\n    this.uniforms.opacity.value = value;\n  }\n};\n\n// src/passes/CopyPass.js\nvar CopyPass = class extends Pass {\n  /**\n   * Constructs a new save pass.\n   *\n   * @param {WebGLRenderTarget} [renderTarget] - A render target.\n   * @param {Boolean} [autoResize=true] - Whether the render target size should be updated automatically.\n   */\n  constructor(renderTarget, autoResize = true) {\n    super(\"CopyPass\");\n    this.fullscreenMaterial = new CopyMaterial();\n    this.needsSwap = false;\n    this.renderTarget = renderTarget;\n    if (renderTarget === void 0) {\n      this.renderTarget = new WebGLRenderTarget2(1, 1, {\n        minFilter: LinearFilter,\n        magFilter: LinearFilter,\n        stencilBuffer: false,\n        depthBuffer: false\n      });\n      this.renderTarget.texture.name = \"CopyPass.Target\";\n    }\n    this.autoResize = autoResize;\n  }\n  /**\n   * Enables or disables auto resizing of the render target.\n   *\n   * @deprecated Use autoResize instead.\n   * @type {Boolean}\n   */\n  get resize() {\n    return this.autoResize;\n  }\n  set resize(value) {\n    this.autoResize = value;\n  }\n  /**\n   * The output texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the output texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Enables or disables auto resizing of the render target.\n   *\n   * @deprecated Use autoResize instead.\n   * @param {Boolean} value - Whether the render target size should be updated automatically.\n   */\n  setAutoResizeEnabled(value) {\n    this.autoResize = value;\n  }\n  /**\n   * Saves the input buffer.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    this.fullscreenMaterial.inputBuffer = inputBuffer.texture;\n    renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n    renderer.render(this.scene, this.camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    if (this.autoResize) {\n      this.renderTarget.setSize(width, height);\n    }\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - A renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (frameBufferType !== void 0) {\n      this.renderTarget.texture.type = frameBufferType;\n      if (frameBufferType !== UnsignedByteType) {\n        this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n      } else if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace) {\n        this.renderTarget.texture.colorSpace = SRGBColorSpace;\n      }\n    }\n  }\n};\n\n// src/passes/ClearPass.js\nimport { Color } from \"three\";\nvar color = /* @__PURE__ */ new Color();\nvar ClearPass = class extends Pass {\n  /**\n   * Constructs a new clear pass.\n   *\n   * @param {Boolean} [color=true] - Determines whether the color buffer should be cleared.\n   * @param {Boolean} [depth=true] - Determines whether the depth buffer should be cleared.\n   * @param {Boolean} [stencil=false] - Determines whether the stencil buffer should be cleared.\n   */\n  constructor(color2 = true, depth = true, stencil = false) {\n    super(\"ClearPass\", null, null);\n    this.needsSwap = false;\n    this.color = color2;\n    this.depth = depth;\n    this.stencil = stencil;\n    this.overrideClearColor = null;\n    this.overrideClearAlpha = -1;\n  }\n  /**\n   * Sets the clear flags.\n   *\n   * @param {Boolean} color - Whether the color buffer should be cleared.\n   * @param {Boolean} depth - Whether the depth buffer should be cleared.\n   * @param {Boolean} stencil - Whether the stencil buffer should be cleared.\n   */\n  setClearFlags(color2, depth, stencil) {\n    this.color = color2;\n    this.depth = depth;\n    this.stencil = stencil;\n  }\n  /**\n   * Returns the override clear color. Default is null.\n   *\n   * @deprecated Use overrideClearColor instead.\n   * @return {Color} The clear color.\n   */\n  getOverrideClearColor() {\n    return this.overrideClearColor;\n  }\n  /**\n   * Sets the override clear color.\n   *\n   * @deprecated Use overrideClearColor instead.\n   * @param {Color} value - The clear color.\n   */\n  setOverrideClearColor(value) {\n    this.overrideClearColor = value;\n  }\n  /**\n   * Returns the override clear alpha. Default is -1.\n   *\n   * @deprecated Use overrideClearAlpha instead.\n   * @return {Number} The clear alpha.\n   */\n  getOverrideClearAlpha() {\n    return this.overrideClearAlpha;\n  }\n  /**\n   * Sets the override clear alpha.\n   *\n   * @deprecated Use overrideClearAlpha instead.\n   * @param {Number} value - The clear alpha.\n   */\n  setOverrideClearAlpha(value) {\n    this.overrideClearAlpha = value;\n  }\n  /**\n   * Clears the input buffer or the screen.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const overrideClearColor = this.overrideClearColor;\n    const overrideClearAlpha = this.overrideClearAlpha;\n    const clearAlpha = renderer.getClearAlpha();\n    const hasOverrideClearColor = overrideClearColor !== null;\n    const hasOverrideClearAlpha = overrideClearAlpha >= 0;\n    if (hasOverrideClearColor) {\n      renderer.getClearColor(color);\n      renderer.setClearColor(overrideClearColor, hasOverrideClearAlpha ? overrideClearAlpha : clearAlpha);\n    } else if (hasOverrideClearAlpha) {\n      renderer.setClearAlpha(overrideClearAlpha);\n    }\n    renderer.setRenderTarget(this.renderToScreen ? null : inputBuffer);\n    renderer.clear(this.color, this.depth, this.stencil);\n    if (hasOverrideClearColor) {\n      renderer.setClearColor(color, clearAlpha);\n    } else if (hasOverrideClearAlpha) {\n      renderer.setClearAlpha(clearAlpha);\n    }\n  }\n};\n\n// src/passes/MaskPass.js\nvar MaskPass = class extends Pass {\n  /**\n   * Constructs a new mask pass.\n   *\n   * @param {Scene} scene - The scene to render.\n   * @param {Camera} camera - The camera to use.\n   */\n  constructor(scene, camera) {\n    super(\"MaskPass\", scene, camera);\n    this.needsSwap = false;\n    this.clearPass = new ClearPass(false, false, true);\n    this.inverse = false;\n  }\n  set mainScene(value) {\n    this.scene = value;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n  }\n  /**\n   * Indicates whether the mask should be inverted.\n   *\n   * @type {Boolean}\n   */\n  get inverted() {\n    return this.inverse;\n  }\n  set inverted(value) {\n    this.inverse = value;\n  }\n  /**\n   * Indicates whether this pass should clear the stencil buffer.\n   *\n   * @type {Boolean}\n   * @deprecated Use clearPass.enabled instead.\n   */\n  get clear() {\n    return this.clearPass.enabled;\n  }\n  set clear(value) {\n    this.clearPass.enabled = value;\n  }\n  /**\n   * Returns the internal clear pass.\n   *\n   * @deprecated Use clearPass.enabled instead.\n   * @return {ClearPass} The clear pass.\n   */\n  getClearPass() {\n    return this.clearPass;\n  }\n  /**\n   * Indicates whether the mask is inverted.\n   *\n   * @deprecated Use inverted instead.\n   * @return {Boolean} Whether the mask is inverted.\n   */\n  isInverted() {\n    return this.inverted;\n  }\n  /**\n   * Enables or disable mask inversion.\n   *\n   * @deprecated Use inverted instead.\n   * @param {Boolean} value - Whether the mask should be inverted.\n   */\n  setInverted(value) {\n    this.inverted = value;\n  }\n  /**\n   * Renders the effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const context = renderer.getContext();\n    const buffers = renderer.state.buffers;\n    const scene = this.scene;\n    const camera = this.camera;\n    const clearPass = this.clearPass;\n    const writeValue = this.inverted ? 0 : 1;\n    const clearValue = 1 - writeValue;\n    buffers.color.setMask(false);\n    buffers.depth.setMask(false);\n    buffers.color.setLocked(true);\n    buffers.depth.setLocked(true);\n    buffers.stencil.setTest(true);\n    buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE);\n    buffers.stencil.setFunc(context.ALWAYS, writeValue, 4294967295);\n    buffers.stencil.setClear(clearValue);\n    buffers.stencil.setLocked(true);\n    if (this.clearPass.enabled) {\n      if (this.renderToScreen) {\n        clearPass.render(renderer, null);\n      } else {\n        clearPass.render(renderer, inputBuffer);\n        clearPass.render(renderer, outputBuffer);\n      }\n    }\n    if (this.renderToScreen) {\n      renderer.setRenderTarget(null);\n      renderer.render(scene, camera);\n    } else {\n      renderer.setRenderTarget(inputBuffer);\n      renderer.render(scene, camera);\n      renderer.setRenderTarget(outputBuffer);\n      renderer.render(scene, camera);\n    }\n    buffers.color.setLocked(false);\n    buffers.depth.setLocked(false);\n    buffers.stencil.setLocked(false);\n    buffers.stencil.setFunc(context.EQUAL, 1, 4294967295);\n    buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);\n    buffers.stencil.setLocked(true);\n  }\n};\n\n// src/core/EffectComposer.js\nvar EffectComposer = class {\n  /**\n   * Constructs a new effect composer.\n   *\n   * @param {WebGLRenderer} renderer - The renderer that should be used.\n   * @param {Object} [options] - The options.\n   * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer.\n   * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer.\n   * @param {Boolean} [options.alpha] - Deprecated. Buffers are always RGBA since three r137.\n   * @param {Number} [options.multisampling=0] - The number of samples used for multisample antialiasing. Requires WebGL 2.\n   * @param {Number} [options.frameBufferType] - The type of the internal frame buffers. It's recommended to use HalfFloatType if possible.\n   */\n  constructor(renderer = null, {\n    depthBuffer = true,\n    stencilBuffer = false,\n    multisampling = 0,\n    frameBufferType\n  } = {}) {\n    this.renderer = null;\n    this.inputBuffer = this.createBuffer(depthBuffer, stencilBuffer, frameBufferType, multisampling);\n    this.outputBuffer = this.inputBuffer.clone();\n    this.copyPass = new CopyPass();\n    this.depthTexture = null;\n    this.passes = [];\n    this.timer = new Timer();\n    this.autoRenderToScreen = true;\n    this.setRenderer(renderer);\n  }\n  /**\n   * The current amount of samples used for multisample anti-aliasing.\n   *\n   * @type {Number}\n   */\n  get multisampling() {\n    return this.inputBuffer.samples || 0;\n  }\n  /**\n   * Sets the amount of MSAA samples.\n   *\n   * Requires WebGL 2. Set to zero to disable multisampling.\n   *\n   * @type {Number}\n   */\n  set multisampling(value) {\n    const buffer = this.inputBuffer;\n    const multisampling = this.multisampling;\n    if (multisampling > 0 && value > 0) {\n      this.inputBuffer.samples = value;\n      this.outputBuffer.samples = value;\n      this.inputBuffer.dispose();\n      this.outputBuffer.dispose();\n    } else if (multisampling !== value) {\n      this.inputBuffer.dispose();\n      this.outputBuffer.dispose();\n      this.inputBuffer = this.createBuffer(\n        buffer.depthBuffer,\n        buffer.stencilBuffer,\n        buffer.texture.type,\n        value\n      );\n      this.inputBuffer.depthTexture = this.depthTexture;\n      this.outputBuffer = this.inputBuffer.clone();\n    }\n  }\n  /**\n   * Returns the internal timer.\n   *\n   * @return {Timer} The timer.\n   */\n  getTimer() {\n    return this.timer;\n  }\n  /**\n   * Returns the renderer.\n   *\n   * @return {WebGLRenderer} The renderer.\n   */\n  getRenderer() {\n    return this.renderer;\n  }\n  /**\n   * Sets the renderer.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   */\n  setRenderer(renderer) {\n    this.renderer = renderer;\n    if (renderer !== null) {\n      const size = renderer.getSize(new Vector2());\n      const alpha = renderer.getContext().getContextAttributes().alpha;\n      const frameBufferType = this.inputBuffer.texture.type;\n      if (frameBufferType === UnsignedByteType2 && renderer.outputColorSpace === SRGBColorSpace2) {\n        this.inputBuffer.texture.colorSpace = SRGBColorSpace2;\n        this.outputBuffer.texture.colorSpace = SRGBColorSpace2;\n        this.inputBuffer.dispose();\n        this.outputBuffer.dispose();\n      }\n      renderer.autoClear = false;\n      this.setSize(size.width, size.height);\n      for (const pass of this.passes) {\n        pass.initialize(renderer, alpha, frameBufferType);\n      }\n    }\n  }\n  /**\n   * Replaces the current renderer with the given one.\n   *\n   * The auto clear mechanism of the provided renderer will be disabled. If the new render size differs from the\n   * previous one, all passes will be updated.\n   *\n   * By default, the DOM element of the current renderer will automatically be removed from its parent node and the DOM\n   * element of the new renderer will take its place.\n   *\n   * @deprecated Use setRenderer instead.\n   * @param {WebGLRenderer} renderer - The new renderer.\n   * @param {Boolean} updateDOM - Indicates whether the old canvas should be replaced by the new one in the DOM.\n   * @return {WebGLRenderer} The old renderer.\n   */\n  replaceRenderer(renderer, updateDOM = true) {\n    const oldRenderer = this.renderer;\n    const parent = oldRenderer.domElement.parentNode;\n    this.setRenderer(renderer);\n    if (updateDOM && parent !== null) {\n      parent.removeChild(oldRenderer.domElement);\n      parent.appendChild(renderer.domElement);\n    }\n    return oldRenderer;\n  }\n  /**\n   * Creates a depth texture attachment that will be provided to all passes.\n   *\n   * Note: When a shader reads from a depth texture and writes to a render target that uses the same depth texture\n   * attachment, the depth information will be lost. This happens even if `depthWrite` is disabled.\n   *\n   * @private\n   * @return {DepthTexture} The depth texture.\n   */\n  createDepthTexture() {\n    const depthTexture = this.depthTexture = new DepthTexture();\n    this.inputBuffer.depthTexture = depthTexture;\n    this.inputBuffer.dispose();\n    if (this.inputBuffer.stencilBuffer) {\n      depthTexture.format = DepthStencilFormat;\n      depthTexture.type = UnsignedInt248Type;\n    } else {\n      depthTexture.type = UnsignedIntType;\n    }\n    return depthTexture;\n  }\n  /**\n   * Deletes the current depth texture.\n   *\n   * @private\n   */\n  deleteDepthTexture() {\n    if (this.depthTexture !== null) {\n      this.depthTexture.dispose();\n      this.depthTexture = null;\n      this.inputBuffer.depthTexture = null;\n      this.inputBuffer.dispose();\n      for (const pass of this.passes) {\n        pass.setDepthTexture(null);\n      }\n    }\n  }\n  /**\n   * Creates a new render target.\n   *\n   * @deprecated Create buffers manually via WebGLRenderTarget instead.\n   * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer.\n   * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer.\n   * @param {Number} type - The frame buffer type.\n   * @param {Number} multisampling - The number of samples to use for antialiasing.\n   * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas.\n   */\n  createBuffer(depthBuffer, stencilBuffer, type, multisampling) {\n    const renderer = this.renderer;\n    const size = renderer === null ? new Vector2() : renderer.getDrawingBufferSize(new Vector2());\n    const options = {\n      minFilter: LinearFilter2,\n      magFilter: LinearFilter2,\n      stencilBuffer,\n      depthBuffer,\n      type\n    };\n    const renderTarget = new WebGLRenderTarget3(size.width, size.height, options);\n    if (multisampling > 0) {\n      renderTarget.ignoreDepthForMultisampleCopy = false;\n      renderTarget.samples = multisampling;\n    }\n    if (type === UnsignedByteType2 && renderer !== null && renderer.outputColorSpace === SRGBColorSpace2) {\n      renderTarget.texture.colorSpace = SRGBColorSpace2;\n    }\n    renderTarget.texture.name = \"EffectComposer.Buffer\";\n    renderTarget.texture.generateMipmaps = false;\n    return renderTarget;\n  }\n  /**\n   * Can be used to change the main scene for all registered passes and effects.\n   *\n   * @param {Scene} scene - The scene.\n   */\n  setMainScene(scene) {\n    for (const pass of this.passes) {\n      pass.mainScene = scene;\n    }\n  }\n  /**\n   * Can be used to change the main camera for all registered passes and effects.\n   *\n   * @param {Camera} camera - The camera.\n   */\n  setMainCamera(camera) {\n    for (const pass of this.passes) {\n      pass.mainCamera = camera;\n    }\n  }\n  /**\n   * Adds a pass, optionally at a specific index.\n   *\n   * @param {Pass} pass - A new pass.\n   * @param {Number} [index] - An index at which the pass should be inserted.\n   */\n  addPass(pass, index) {\n    const passes = this.passes;\n    const renderer = this.renderer;\n    const drawingBufferSize = renderer.getDrawingBufferSize(new Vector2());\n    const alpha = renderer.getContext().getContextAttributes().alpha;\n    const frameBufferType = this.inputBuffer.texture.type;\n    pass.setRenderer(renderer);\n    pass.setSize(drawingBufferSize.width, drawingBufferSize.height);\n    pass.initialize(renderer, alpha, frameBufferType);\n    if (this.autoRenderToScreen) {\n      if (passes.length > 0) {\n        passes[passes.length - 1].renderToScreen = false;\n      }\n      if (pass.renderToScreen) {\n        this.autoRenderToScreen = false;\n      }\n    }\n    if (index !== void 0) {\n      passes.splice(index, 0, pass);\n    } else {\n      passes.push(pass);\n    }\n    if (this.autoRenderToScreen) {\n      passes[passes.length - 1].renderToScreen = true;\n    }\n    if (pass.needsDepthTexture || this.depthTexture !== null) {\n      if (this.depthTexture === null) {\n        const depthTexture = this.createDepthTexture();\n        for (pass of passes) {\n          pass.setDepthTexture(depthTexture);\n        }\n      } else {\n        pass.setDepthTexture(this.depthTexture);\n      }\n    }\n  }\n  /**\n   * Removes a pass.\n   *\n   * @param {Pass} pass - The pass.\n   */\n  removePass(pass) {\n    const passes = this.passes;\n    const index = passes.indexOf(pass);\n    const exists = index !== -1;\n    const removed = exists && passes.splice(index, 1).length > 0;\n    if (removed) {\n      if (this.depthTexture !== null) {\n        const reducer = (a, b) => a || b.needsDepthTexture;\n        const depthTextureRequired = passes.reduce(reducer, false);\n        if (!depthTextureRequired) {\n          if (pass.getDepthTexture() === this.depthTexture) {\n            pass.setDepthTexture(null);\n          }\n          this.deleteDepthTexture();\n        }\n      }\n      if (this.autoRenderToScreen) {\n        if (index === passes.length) {\n          pass.renderToScreen = false;\n          if (passes.length > 0) {\n            passes[passes.length - 1].renderToScreen = true;\n          }\n        }\n      }\n    }\n  }\n  /**\n   * Removes all passes.\n   */\n  removeAllPasses() {\n    const passes = this.passes;\n    this.deleteDepthTexture();\n    if (passes.length > 0) {\n      if (this.autoRenderToScreen) {\n        passes[passes.length - 1].renderToScreen = false;\n      }\n      this.passes = [];\n    }\n  }\n  /**\n   * Renders all enabled passes in the order in which they were added.\n   *\n   * @param {Number} [deltaTime] - The time since the last frame in seconds.\n   */\n  render(deltaTime) {\n    const renderer = this.renderer;\n    const copyPass = this.copyPass;\n    let inputBuffer = this.inputBuffer;\n    let outputBuffer = this.outputBuffer;\n    let stencilTest = false;\n    let context, stencil, buffer;\n    if (deltaTime === void 0) {\n      this.timer.update();\n      deltaTime = this.timer.getDelta();\n    }\n    for (const pass of this.passes) {\n      if (pass.enabled) {\n        pass.render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest);\n        if (pass.needsSwap) {\n          if (stencilTest) {\n            copyPass.renderToScreen = pass.renderToScreen;\n            context = renderer.getContext();\n            stencil = renderer.state.buffers.stencil;\n            stencil.setFunc(context.NOTEQUAL, 1, 4294967295);\n            copyPass.render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest);\n            stencil.setFunc(context.EQUAL, 1, 4294967295);\n          }\n          buffer = inputBuffer;\n          inputBuffer = outputBuffer;\n          outputBuffer = buffer;\n        }\n        if (pass instanceof MaskPass) {\n          stencilTest = true;\n        } else if (pass instanceof ClearMaskPass) {\n          stencilTest = false;\n        }\n      }\n    }\n  }\n  /**\n   * Sets the size of the buffers, passes and the renderer.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   * @param {Boolean} [updateStyle] - Determines whether the style of the canvas should be updated.\n   */\n  setSize(width, height, updateStyle) {\n    const renderer = this.renderer;\n    const currentSize = renderer.getSize(new Vector2());\n    if (width === void 0 || height === void 0) {\n      width = currentSize.width;\n      height = currentSize.height;\n    }\n    if (currentSize.width !== width || currentSize.height !== height) {\n      renderer.setSize(width, height, updateStyle);\n    }\n    const drawingBufferSize = renderer.getDrawingBufferSize(new Vector2());\n    this.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\n    this.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\n    for (const pass of this.passes) {\n      pass.setSize(drawingBufferSize.width, drawingBufferSize.height);\n    }\n  }\n  /**\n   * Resets this composer by deleting all passes and creating new buffers.\n   */\n  reset() {\n    this.dispose();\n    this.autoRenderToScreen = true;\n  }\n  /**\n   * Disposes this composer and all passes.\n   */\n  dispose() {\n    for (const pass of this.passes) {\n      pass.dispose();\n    }\n    this.passes = [];\n    if (this.inputBuffer !== null) {\n      this.inputBuffer.dispose();\n    }\n    if (this.outputBuffer !== null) {\n      this.outputBuffer.dispose();\n    }\n    this.deleteDepthTexture();\n    this.copyPass.dispose();\n    this.timer.dispose();\n    Pass.fullscreenGeometry.dispose();\n  }\n};\n\n// src/core/EffectShaderData.js\nimport { LinearSRGBColorSpace } from \"three\";\n\n// src/enums/EffectAttribute.js\nvar EffectAttribute = {\n  NONE: 0,\n  DEPTH: 1,\n  CONVOLUTION: 2\n};\n\n// src/enums/EffectShaderSection.js\nvar EffectShaderSection = {\n  FRAGMENT_HEAD: \"FRAGMENT_HEAD\",\n  FRAGMENT_MAIN_UV: \"FRAGMENT_MAIN_UV\",\n  FRAGMENT_MAIN_IMAGE: \"FRAGMENT_MAIN_IMAGE\",\n  VERTEX_HEAD: \"VERTEX_HEAD\",\n  VERTEX_MAIN_SUPPORT: \"VERTEX_MAIN_SUPPORT\"\n};\n\n// src/core/EffectShaderData.js\nvar EffectShaderData = class {\n  /**\n   * Constructs new shader data.\n   */\n  constructor() {\n    this.shaderParts = /* @__PURE__ */ new Map([\n      [EffectShaderSection.FRAGMENT_HEAD, null],\n      [EffectShaderSection.FRAGMENT_MAIN_UV, null],\n      [EffectShaderSection.FRAGMENT_MAIN_IMAGE, null],\n      [EffectShaderSection.VERTEX_HEAD, null],\n      [EffectShaderSection.VERTEX_MAIN_SUPPORT, null]\n    ]);\n    this.defines = /* @__PURE__ */ new Map();\n    this.uniforms = /* @__PURE__ */ new Map();\n    this.blendModes = /* @__PURE__ */ new Map();\n    this.extensions = /* @__PURE__ */ new Set();\n    this.attributes = EffectAttribute.NONE;\n    this.varyings = /* @__PURE__ */ new Set();\n    this.uvTransformation = false;\n    this.readDepth = false;\n    this.colorSpace = LinearSRGBColorSpace;\n  }\n};\n\n// src/core/GaussKernel.js\nfunction getCoefficients(n) {\n  let result;\n  if (n === 0) {\n    result = new Float64Array(0);\n  } else if (n === 1) {\n    result = new Float64Array([1]);\n  } else if (n > 1) {\n    let row0 = new Float64Array(n);\n    let row1 = new Float64Array(n);\n    for (let y = 1; y <= n; ++y) {\n      for (let x = 0; x < y; ++x) {\n        row1[x] = x === 0 || x === y - 1 ? 1 : row0[x - 1] + row0[x];\n      }\n      result = row1;\n      row1 = row0;\n      row0 = result;\n    }\n  }\n  return result;\n}\nvar GaussKernel = class {\n  /**\n   * Constructs a new Gauss kernel.\n   *\n   * @param {Number} kernelSize - The kernel size. Should be an odd number in the range [3, 1020].\n   * @param {Number} [edgeBias=2] - Determines how many edge coefficients should be cut off for increased accuracy.\n   */\n  constructor(kernelSize, edgeBias = 2) {\n    this.weights = null;\n    this.offsets = null;\n    this.linearWeights = null;\n    this.linearOffsets = null;\n    this.generate(kernelSize, edgeBias);\n  }\n  /**\n   * The number of steps for discrete sampling.\n   *\n   * @type {Number}\n   */\n  get steps() {\n    return this.offsets === null ? 0 : this.offsets.length;\n  }\n  /**\n   * The number of steps for linear sampling.\n   *\n   * @type {Number}\n   */\n  get linearSteps() {\n    return this.linearOffsets === null ? 0 : this.linearOffsets.length;\n  }\n  /**\n   * Generates the kernel.\n   *\n   * @private\n   * @param {Number} kernelSize - The kernel size.\n   * @param {Number} edgeBias - The amount of edge coefficients to ignore.\n   */\n  generate(kernelSize, edgeBias) {\n    if (kernelSize < 3 || kernelSize > 1020) {\n      throw new Error(\"The kernel size must be in the range [3, 1020]\");\n    }\n    const n = kernelSize + edgeBias * 2;\n    const coefficients = edgeBias > 0 ? getCoefficients(n).slice(edgeBias, -edgeBias) : getCoefficients(n);\n    const mid = Math.floor((coefficients.length - 1) / 2);\n    const sum = coefficients.reduce((a, b) => a + b, 0);\n    const weights = coefficients.slice(mid);\n    const offsets = [...Array(mid + 1).keys()];\n    const linearWeights = new Float64Array(Math.floor(offsets.length / 2));\n    const linearOffsets = new Float64Array(linearWeights.length);\n    linearWeights[0] = weights[0] / sum;\n    for (let i = 1, j = 1, l = offsets.length - 1; i < l; i += 2, ++j) {\n      const offset0 = offsets[i], offset1 = offsets[i + 1];\n      const weight0 = weights[i], weight1 = weights[i + 1];\n      const w = weight0 + weight1;\n      const o = (offset0 * weight0 + offset1 * weight1) / w;\n      linearWeights[j] = w / sum;\n      linearOffsets[j] = o;\n    }\n    for (let i = 0, l = weights.length, s = 1 / sum; i < l; ++i) {\n      weights[i] *= s;\n    }\n    const linearWeightSum = (linearWeights.reduce((a, b) => a + b, 0) - linearWeights[0] * 0.5) * 2;\n    if (linearWeightSum !== 0) {\n      for (let i = 0, l = linearWeights.length, s = 1 / linearWeightSum; i < l; ++i) {\n        linearWeights[i] *= s;\n      }\n    }\n    this.offsets = offsets;\n    this.weights = weights;\n    this.linearOffsets = linearOffsets;\n    this.linearWeights = linearWeights;\n  }\n};\n\n// src/core/ImmutableTimer.js\nvar ImmutableTimer = class {\n  /**\n   * The current delta time in seconds.\n   *\n   * @type {Number}\n   */\n  getDelta() {\n    return NaN;\n  }\n  /**\n   * The elapsed time in seconds.\n   *\n   * @type {Number}\n   */\n  getElapsed() {\n    return NaN;\n  }\n};\n\n// src/core/Initializable.js\nvar Initializable = class {\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - A renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n  }\n};\n\n// src/core/OverrideMaterialManager.js\nimport { BackSide, DoubleSide, FrontSide, ShaderMaterial as ShaderMaterial2 } from \"three\";\nvar workaroundEnabled = false;\nvar OverrideMaterialManager = class {\n  /**\n   * Constructs a new override material manager.\n   *\n   * @param {Material} [material=null] - An override material.\n   */\n  constructor(material = null) {\n    this.originalMaterials = /* @__PURE__ */ new Map();\n    this.material = null;\n    this.materials = null;\n    this.materialsBackSide = null;\n    this.materialsDoubleSide = null;\n    this.materialsFlatShaded = null;\n    this.materialsFlatShadedBackSide = null;\n    this.materialsFlatShadedDoubleSide = null;\n    this.setMaterial(material);\n    this.meshCount = 0;\n    this.replaceMaterial = (node) => {\n      if (node.isMesh) {\n        let materials;\n        if (node.material.flatShading) {\n          switch (node.material.side) {\n            case DoubleSide:\n              materials = this.materialsFlatShadedDoubleSide;\n              break;\n            case BackSide:\n              materials = this.materialsFlatShadedBackSide;\n              break;\n            default:\n              materials = this.materialsFlatShaded;\n              break;\n          }\n        } else {\n          switch (node.material.side) {\n            case DoubleSide:\n              materials = this.materialsDoubleSide;\n              break;\n            case BackSide:\n              materials = this.materialsBackSide;\n              break;\n            default:\n              materials = this.materials;\n              break;\n          }\n        }\n        this.originalMaterials.set(node, node.material);\n        if (node.isSkinnedMesh) {\n          node.material = materials[2];\n        } else if (node.isInstancedMesh) {\n          node.material = materials[1];\n        } else {\n          node.material = materials[0];\n        }\n        ++this.meshCount;\n      }\n    };\n  }\n  /**\n   * Clones the given material.\n   *\n   * @private\n   * @param {Material} material - The material.\n   * @return {Material} The cloned material.\n   */\n  cloneMaterial(material) {\n    if (!(material instanceof ShaderMaterial2)) {\n      return material.clone();\n    }\n    const uniforms = material.uniforms;\n    const textureUniforms = /* @__PURE__ */ new Map();\n    for (const key in uniforms) {\n      const value = uniforms[key].value;\n      if (value.isRenderTargetTexture) {\n        uniforms[key].value = null;\n        textureUniforms.set(key, value);\n      }\n    }\n    const clone = material.clone();\n    for (const entry of textureUniforms) {\n      uniforms[entry[0]].value = entry[1];\n      clone.uniforms[entry[0]].value = entry[1];\n    }\n    return clone;\n  }\n  /**\n   * Sets the override material.\n   *\n   * @param {Material} material - The material.\n   */\n  setMaterial(material) {\n    this.disposeMaterials();\n    this.material = material;\n    if (material !== null) {\n      const materials = this.materials = [\n        this.cloneMaterial(material),\n        this.cloneMaterial(material),\n        this.cloneMaterial(material)\n      ];\n      for (const m2 of materials) {\n        m2.uniforms = Object.assign({}, material.uniforms);\n        m2.side = FrontSide;\n      }\n      materials[2].skinning = true;\n      this.materialsBackSide = materials.map((m2) => {\n        const c2 = this.cloneMaterial(m2);\n        c2.uniforms = Object.assign({}, material.uniforms);\n        c2.side = BackSide;\n        return c2;\n      });\n      this.materialsDoubleSide = materials.map((m2) => {\n        const c2 = this.cloneMaterial(m2);\n        c2.uniforms = Object.assign({}, material.uniforms);\n        c2.side = DoubleSide;\n        return c2;\n      });\n      this.materialsFlatShaded = materials.map((m2) => {\n        const c2 = this.cloneMaterial(m2);\n        c2.uniforms = Object.assign({}, material.uniforms);\n        c2.flatShading = true;\n        return c2;\n      });\n      this.materialsFlatShadedBackSide = materials.map((m2) => {\n        const c2 = this.cloneMaterial(m2);\n        c2.uniforms = Object.assign({}, material.uniforms);\n        c2.flatShading = true;\n        c2.side = BackSide;\n        return c2;\n      });\n      this.materialsFlatShadedDoubleSide = materials.map((m2) => {\n        const c2 = this.cloneMaterial(m2);\n        c2.uniforms = Object.assign({}, material.uniforms);\n        c2.flatShading = true;\n        c2.side = DoubleSide;\n        return c2;\n      });\n    }\n  }\n  /**\n   * Renders the scene with the override material.\n   *\n   * @private\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Scene} scene - A scene.\n   * @param {Camera} camera - A camera.\n   */\n  render(renderer, scene, camera) {\n    const shadowMapEnabled = renderer.shadowMap.enabled;\n    renderer.shadowMap.enabled = false;\n    if (workaroundEnabled) {\n      const originalMaterials = this.originalMaterials;\n      this.meshCount = 0;\n      scene.traverse(this.replaceMaterial);\n      renderer.render(scene, camera);\n      for (const entry of originalMaterials) {\n        entry[0].material = entry[1];\n      }\n      if (this.meshCount !== originalMaterials.size) {\n        originalMaterials.clear();\n      }\n    } else {\n      const overrideMaterial = scene.overrideMaterial;\n      scene.overrideMaterial = this.material;\n      renderer.render(scene, camera);\n      scene.overrideMaterial = overrideMaterial;\n    }\n    renderer.shadowMap.enabled = shadowMapEnabled;\n  }\n  /**\n   * Deletes cloned override materials.\n   *\n   * @private\n   */\n  disposeMaterials() {\n    if (this.material !== null) {\n      const materials = this.materials.concat(this.materialsBackSide).concat(this.materialsDoubleSide).concat(this.materialsFlatShaded).concat(this.materialsFlatShadedBackSide).concat(this.materialsFlatShadedDoubleSide);\n      for (const m2 of materials) {\n        m2.dispose();\n      }\n    }\n  }\n  /**\n   * Performs cleanup tasks.\n   */\n  dispose() {\n    this.originalMaterials.clear();\n    this.disposeMaterials();\n  }\n  /**\n   * Indicates whether the override material workaround is enabled.\n   *\n   * @type {Boolean}\n   */\n  static get workaroundEnabled() {\n    return workaroundEnabled;\n  }\n  /**\n   * Enables or disables the override material workaround globally.\n   *\n   * This only affects post processing passes and effects.\n   *\n   * @type {Boolean}\n   */\n  static set workaroundEnabled(value) {\n    workaroundEnabled = value;\n  }\n};\n\n// src/core/Resizable.js\nvar Resizable = class {\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n  }\n};\n\n// src/core/Resolution.js\nimport { EventDispatcher, Vector2 as Vector22 } from \"three\";\nvar AUTO_SIZE = -1;\nvar Resolution = class extends EventDispatcher {\n  /**\n   * Constructs a new resolution.\n   *\n   * TODO Remove resizable param.\n   * @param {Resizable} resizable - A resizable object.\n   * @param {Number} [width=Resolution.AUTO_SIZE] - The preferred width.\n   * @param {Number} [height=Resolution.AUTO_SIZE] - The preferred height.\n   * @param {Number} [scale=1.0] - A resolution scale.\n   */\n  constructor(resizable, width = AUTO_SIZE, height = AUTO_SIZE, scale = 1) {\n    super();\n    this.resizable = resizable;\n    this.baseSize = new Vector22(1, 1);\n    this.preferredSize = new Vector22(width, height);\n    this.target = this.preferredSize;\n    this.s = scale;\n    this.effectiveSize = new Vector22();\n    this.addEventListener(\"change\", () => this.updateEffectiveSize());\n    this.updateEffectiveSize();\n  }\n  /**\n   * Calculates the effective size.\n   *\n   * @private\n   */\n  updateEffectiveSize() {\n    const base = this.baseSize;\n    const preferred = this.preferredSize;\n    const effective = this.effectiveSize;\n    const scale = this.scale;\n    if (preferred.width !== AUTO_SIZE) {\n      effective.width = preferred.width;\n    } else if (preferred.height !== AUTO_SIZE) {\n      effective.width = Math.round(preferred.height * (base.width / Math.max(base.height, 1)));\n    } else {\n      effective.width = Math.round(base.width * scale);\n    }\n    if (preferred.height !== AUTO_SIZE) {\n      effective.height = preferred.height;\n    } else if (preferred.width !== AUTO_SIZE) {\n      effective.height = Math.round(preferred.width / Math.max(base.width / Math.max(base.height, 1), 1));\n    } else {\n      effective.height = Math.round(base.height * scale);\n    }\n  }\n  /**\n   * The effective width.\n   *\n   * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base width will be returned.\n   *\n   * @type {Number}\n   */\n  get width() {\n    return this.effectiveSize.width;\n  }\n  set width(value) {\n    this.preferredWidth = value;\n  }\n  /**\n   * The effective height.\n   *\n   * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base height will be returned.\n   *\n   * @type {Number}\n   */\n  get height() {\n    return this.effectiveSize.height;\n  }\n  set height(value) {\n    this.preferredHeight = value;\n  }\n  /**\n   * Returns the effective width.\n   *\n   * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base width will be returned.\n   *\n   * @deprecated Use width instead.\n   * @return {Number} The effective width.\n   */\n  getWidth() {\n    return this.width;\n  }\n  /**\n   * Returns the effective height.\n   *\n   * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base height will be returned.\n   *\n   * @deprecated Use height instead.\n   * @return {Number} The effective height.\n   */\n  getHeight() {\n    return this.height;\n  }\n  /**\n   * The resolution scale.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.s;\n  }\n  set scale(value) {\n    if (this.s !== value) {\n      this.s = value;\n      this.preferredSize.setScalar(AUTO_SIZE);\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @deprecated Use scale instead.\n   * @return {Number} The scale.\n   */\n  getScale() {\n    return this.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * Also sets the preferred resolution to {@link Resizer.AUTO_SIZE}.\n   *\n   * @deprecated Use scale instead.\n   * @param {Number} value - The scale.\n   */\n  setScale(value) {\n    this.scale = value;\n  }\n  /**\n   * The base width.\n   *\n   * @type {Number}\n   */\n  get baseWidth() {\n    return this.baseSize.width;\n  }\n  set baseWidth(value) {\n    if (this.baseSize.width !== value) {\n      this.baseSize.width = value;\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * Returns the base width.\n   *\n   * @deprecated Use baseWidth instead.\n   * @return {Number} The base width.\n   */\n  getBaseWidth() {\n    return this.baseWidth;\n  }\n  /**\n   * Sets the base width.\n   *\n   * @deprecated Use baseWidth instead.\n   * @param {Number} value - The width.\n   */\n  setBaseWidth(value) {\n    this.baseWidth = value;\n  }\n  /**\n   * The base height.\n   *\n   * @type {Number}\n   */\n  get baseHeight() {\n    return this.baseSize.height;\n  }\n  set baseHeight(value) {\n    if (this.baseSize.height !== value) {\n      this.baseSize.height = value;\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * Returns the base height.\n   *\n   * @deprecated Use baseHeight instead.\n   * @return {Number} The base height.\n   */\n  getBaseHeight() {\n    return this.baseHeight;\n  }\n  /**\n   * Sets the base height.\n   *\n   * @deprecated Use baseHeight instead.\n   * @param {Number} value - The height.\n   */\n  setBaseHeight(value) {\n    this.baseHeight = value;\n  }\n  /**\n   * Sets the base size.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setBaseSize(width, height) {\n    if (this.baseSize.width !== width || this.baseSize.height !== height) {\n      this.baseSize.set(width, height);\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * The preferred width.\n   *\n   * @type {Number}\n   */\n  get preferredWidth() {\n    return this.preferredSize.width;\n  }\n  set preferredWidth(value) {\n    if (this.preferredSize.width !== value) {\n      this.preferredSize.width = value;\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * Returns the preferred width.\n   *\n   * @deprecated Use preferredWidth instead.\n   * @return {Number} The preferred width.\n   */\n  getPreferredWidth() {\n    return this.preferredWidth;\n  }\n  /**\n   * Sets the preferred width.\n   *\n   * Use {@link Resizer.AUTO_SIZE} to automatically calculate the width based on the height and aspect ratio.\n   *\n   * @deprecated Use preferredWidth instead.\n   * @param {Number} value - The width.\n   */\n  setPreferredWidth(value) {\n    this.preferredWidth = value;\n  }\n  /**\n   * The preferred height.\n   *\n   * @type {Number}\n   */\n  get preferredHeight() {\n    return this.preferredSize.height;\n  }\n  set preferredHeight(value) {\n    if (this.preferredSize.height !== value) {\n      this.preferredSize.height = value;\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * Returns the preferred height.\n   *\n   * @deprecated Use preferredHeight instead.\n   * @return {Number} The preferred height.\n   */\n  getPreferredHeight() {\n    return this.preferredHeight;\n  }\n  /**\n   * Sets the preferred height.\n   *\n   * Use {@link Resizer.AUTO_SIZE} to automatically calculate the height based on the width and aspect ratio.\n   *\n   * @deprecated Use preferredHeight instead.\n   * @param {Number} value - The height.\n   */\n  setPreferredHeight(value) {\n    this.preferredHeight = value;\n  }\n  /**\n   * Sets the preferred size.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setPreferredSize(width, height) {\n    if (this.preferredSize.width !== width || this.preferredSize.height !== height) {\n      this.preferredSize.set(width, height);\n      this.dispatchEvent({ type: \"change\" });\n      this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n    }\n  }\n  /**\n   * Copies the given resolution.\n   *\n   * @param {Resolution} resolution - The resolution.\n   */\n  copy(resolution) {\n    this.s = resolution.scale;\n    this.baseSize.set(resolution.baseWidth, resolution.baseHeight);\n    this.preferredSize.set(resolution.preferredWidth, resolution.preferredHeight);\n    this.dispatchEvent({ type: \"change\" });\n    this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n  }\n  /**\n   * An auto sizing constant.\n   *\n   * Can be used to automatically calculate the width or height based on the original aspect ratio.\n   *\n   * @type {Number}\n   */\n  static get AUTO_SIZE() {\n    return AUTO_SIZE;\n  }\n};\n\n// src/utils/IdManager.js\nvar IdManager = class {\n  /**\n   * Constructs a new ID manager.\n   *\n   * @param initialId - The first ID.\n   */\n  constructor(initialId = 0) {\n    this.nextId = initialId;\n  }\n  /**\n   * Returns the next unique ID.\n   *\n   * @return The ID.\n   */\n  getNextId() {\n    return this.nextId++;\n  }\n  /**\n   * Resets the ID counter.\n   *\n   * @param initialId - The first ID.\n   * @return This manager.\n   */\n  reset(initialId = 0) {\n    this.nextId = initialId;\n    return this;\n  }\n};\n\n// src/core/Selection.js\nvar idManager = /* @__PURE__ */ new IdManager(2);\nvar Selection = class extends Set {\n  /**\n   * Constructs a new selection.\n   *\n   * @param {Iterable<Object3D>} [iterable] - A collection of objects that should be added to this selection.\n   * @param {Number} [layer] - A dedicated render layer for selected objects. Range is `[2, 31]`. Starts at 2 if omitted.\n   */\n  constructor(iterable, layer = idManager.getNextId()) {\n    super();\n    this.exclusive = false;\n    this._layer = layer;\n    if (this._layer < 1 || this._layer > 31) {\n      console.warn(\"Layer out of range, resetting to 2\");\n      idManager.reset(2);\n      this._layer = idManager.getNextId();\n    }\n    if (iterable !== void 0) {\n      this.set(iterable);\n    }\n  }\n  /**\n   * The render layer for selected objects.\n   *\n   * @type {Number}\n   */\n  get layer() {\n    return this._layer;\n  }\n  set layer(value) {\n    const currentLayer = this._layer;\n    for (const object of this) {\n      object.layers.disable(currentLayer);\n      object.layers.enable(value);\n    }\n    this._layer = value;\n  }\n  /**\n   * Returns the current render layer for selected objects.\n   *\n   * The default layer is 2. If this collides with your own custom layers, please change it before rendering!\n   *\n   * @deprecated Use layer instead.\n   * @return {Number} The layer.\n   */\n  getLayer() {\n    return this.layer;\n  }\n  /**\n   * Sets the render layer for selected objects.\n   *\n   * The current selection will be updated accordingly.\n   *\n   * @deprecated Use layer instead.\n   * @param {Number} value - The layer. Range is [0, 31].\n   */\n  setLayer(value) {\n    this.layer = value;\n  }\n  /**\n   * Indicates whether objects that are added to this selection will be removed from all other layers.\n   *\n   * @deprecated Use exclusive instead.\n   * @return {Number} Whether this selection is exclusive. Default is false.\n   */\n  isExclusive() {\n    return this.exclusive;\n  }\n  /**\n   * Controls whether objects that are added to this selection should be removed from all other layers.\n   *\n   * @deprecated Use exclusive instead.\n   * @param {Number} value - Whether this selection should be exclusive.\n   */\n  setExclusive(value) {\n    this.exclusive = value;\n  }\n  /**\n   * Clears this selection.\n   *\n   * @return {Selection} This selection.\n   */\n  clear() {\n    const layer = this.layer;\n    for (const object of this) {\n      object.layers.disable(layer);\n    }\n    return super.clear();\n  }\n  /**\n   * Clears this selection and adds the given objects.\n   *\n   * @param {Iterable<Object3D>} objects - The objects that should be selected.\n   * @return {Selection} This selection.\n   */\n  set(objects) {\n    this.clear();\n    for (const object of objects) {\n      this.add(object);\n    }\n    return this;\n  }\n  /**\n   * An alias for {@link has}.\n   *\n   * @param {Object3D} object - An object.\n   * @return {Number} Returns 0 if the given object is currently selected, or -1 otherwise.\n   * @deprecated Added for backward-compatibility.\n   */\n  indexOf(object) {\n    return this.has(object) ? 0 : -1;\n  }\n  /**\n   * Adds an object to this selection.\n   *\n   * If {@link exclusive} is set to `true`, the object will also be removed from all other layers.\n   *\n   * @param {Object3D} object - The object that should be selected.\n   * @return {Selection} This selection.\n   */\n  add(object) {\n    if (this.exclusive) {\n      object.layers.set(this.layer);\n    } else {\n      object.layers.enable(this.layer);\n    }\n    return super.add(object);\n  }\n  /**\n   * Removes an object from this selection.\n   *\n   * @param {Object3D} object - The object that should be deselected.\n   * @return {Boolean} Returns true if an object has successfully been removed from this selection; otherwise false.\n   */\n  delete(object) {\n    if (this.has(object)) {\n      object.layers.disable(this.layer);\n    }\n    return super.delete(object);\n  }\n  /**\n   * Removes an existing object from the selection. If the object doesn't exist it's added instead.\n   *\n   * @param {Object3D} object - The object.\n   * @return {Boolean} Returns true if the object is added, false otherwise.\n   */\n  toggle(object) {\n    let result;\n    if (this.has(object)) {\n      this.delete(object);\n      result = false;\n    } else {\n      this.add(object);\n      result = true;\n    }\n    return result;\n  }\n  /**\n   * Sets the visibility of all selected objects.\n   *\n   * This method enables or disables render layer 0 of all selected objects.\n   *\n   * @param {Boolean} visible - Whether the selected objects should be visible.\n   * @return {Selection} This selection.\n   */\n  setVisible(visible) {\n    for (const object of this) {\n      if (visible) {\n        object.layers.enable(0);\n      } else {\n        object.layers.disable(0);\n      }\n    }\n    return this;\n  }\n};\n\n// src/effects/blending/BlendMode.js\nimport { EventDispatcher as EventDispatcher2, Uniform as Uniform2 } from \"three\";\n\n// src/enums/BlendFunction.js\nvar BlendFunction = {\n  SKIP: 9,\n  SET: 30,\n  ADD: 0,\n  ALPHA: 1,\n  AVERAGE: 2,\n  COLOR: 3,\n  COLOR_BURN: 4,\n  COLOR_DODGE: 5,\n  DARKEN: 6,\n  DIFFERENCE: 7,\n  DIVIDE: 8,\n  DST: 9,\n  EXCLUSION: 10,\n  HARD_LIGHT: 11,\n  HARD_MIX: 12,\n  HUE: 13,\n  INVERT: 14,\n  INVERT_RGB: 15,\n  LIGHTEN: 16,\n  LINEAR_BURN: 17,\n  LINEAR_DODGE: 18,\n  LINEAR_LIGHT: 19,\n  LUMINOSITY: 20,\n  MULTIPLY: 21,\n  NEGATION: 22,\n  NORMAL: 23,\n  OVERLAY: 24,\n  PIN_LIGHT: 25,\n  REFLECT: 26,\n  SATURATION: 27,\n  SCREEN: 28,\n  SOFT_LIGHT: 29,\n  SRC: 30,\n  SUBTRACT: 31,\n  VIVID_LIGHT: 32\n};\n\n// src/effects/blending/glsl/add.frag\nvar add_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x+y,opacity);}\";\n\n// src/effects/blending/glsl/alpha.frag\nvar alpha_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,y,min(y.a,opacity));}\";\n\n// src/effects/blending/glsl/average.frag\nvar average_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,(x+y)*0.5,opacity);}\";\n\n// src/effects/blending/glsl/color.frag\nvar color_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(yHSL.rg,xHSL.b));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/color-burn.frag\nvar color_burn_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(step(0.0,y)*(1.0-min(vec4(1.0),(1.0-x)/y)),vec4(1.0),step(1.0,x));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/color-dodge.frag\nvar color_dodge_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=step(0.0,x)*mix(min(vec4(1.0),x/max(1.0-y,1e-9)),vec4(1.0),step(1.0,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/darken.frag\nvar darken_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,min(x,y),opacity);}\";\n\n// src/effects/blending/glsl/difference.frag\nvar difference_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,abs(x-y),opacity);}\";\n\n// src/effects/blending/glsl/divide.frag\nvar divide_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x/max(y,1e-12),opacity);}\";\n\n// src/effects/blending/glsl/exclusion.frag\nvar exclusion_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,(x+y-2.0*x*y),opacity);}\";\n\n// src/effects/blending/glsl/hard-light.frag\nvar hard_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 a=min(x,1.0),b=min(y,1.0);vec4 z=mix(2.0*a*b,1.0-2.0*(1.0-a)*(1.0-b),step(0.5,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/hard-mix.frag\nvar hard_mix_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,step(1.0,x+y),opacity);}\";\n\n// src/effects/blending/glsl/hue.frag\nvar hue_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(yHSL.r,xHSL.gb));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/invert.frag\nvar invert_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,1.0-y,opacity);}\";\n\n// src/effects/blending/glsl/invert-rgb.frag\nvar invert_rgb_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,y*(1.0-x),opacity);}\";\n\n// src/effects/blending/glsl/lighten.frag\nvar lighten_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,max(x,y),opacity);}\";\n\n// src/effects/blending/glsl/linear-burn.frag\nvar linear_burn_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,clamp(y+x-1.0,0.0,1.0),opacity);}\";\n\n// src/effects/blending/glsl/linear-dodge.frag\nvar linear_dodge_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,min(x+y,1.0),opacity);}\";\n\n// src/effects/blending/glsl/linear-light.frag\nvar linear_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,clamp(2.0*y+x-1.0,0.0,1.0),opacity);}\";\n\n// src/effects/blending/glsl/luminosity.frag\nvar luminosity_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(xHSL.rg,yHSL.b));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/multiply.frag\nvar multiply_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x*y,opacity);}\";\n\n// src/effects/blending/glsl/negation.frag\nvar negation_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,1.0-abs(1.0-x-y),opacity);}\";\n\n// src/effects/blending/glsl/normal.frag\nvar normal_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,y,opacity);}\";\n\n// src/effects/blending/glsl/overlay.frag\nvar overlay_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(2.0*y*x,1.0-2.0*(1.0-y)*(1.0-x),step(0.5,x));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/pin-light.frag\nvar pin_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 y2=2.0*y;vec4 z=mix(mix(y2,x,step(0.5*x,y)),max(vec4(0.0),y2-1.0),step(x,(y2-1.0)));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/reflect.frag\nvar reflect_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(min(x*x/max(1.0-y,1e-12),1.0),y,step(1.0,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/saturation.frag\nvar saturation_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(xHSL.r,yHSL.g,xHSL.b));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/screen.frag\nvar screen_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x+y-min(x*y,1.0),opacity);}\";\n\n// src/effects/blending/glsl/soft-light.frag\nvar soft_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 y2=2.0*y;vec4 w=step(0.5,y);vec4 z=mix(x-(1.0-y2)*x*(1.0-x),mix(x+(y2-1.0)*(sqrt(x)-x),x+(y2-1.0)*x*((16.0*x-12.0)*x+3.0),w*(1.0-step(0.25,x))),w);return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/src.frag\nvar src_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return y;}\";\n\n// src/effects/blending/glsl/subtract.frag\nvar subtract_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,max(x+y-1.0,0.0),opacity);}\";\n\n// src/effects/blending/glsl/vivid-light.frag\nvar vivid_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(max(1.0-min((1.0-x)/(2.0*y),1.0),0.0),min(x/(2.0*(1.0-y)),1.0),step(0.5,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/BlendMode.js\nvar blendFunctions = /* @__PURE__ */ new Map([\n  [BlendFunction.ADD, add_default],\n  [BlendFunction.ALPHA, alpha_default],\n  [BlendFunction.AVERAGE, average_default],\n  [BlendFunction.COLOR, color_default],\n  [BlendFunction.COLOR_BURN, color_burn_default],\n  [BlendFunction.COLOR_DODGE, color_dodge_default],\n  [BlendFunction.DARKEN, darken_default],\n  [BlendFunction.DIFFERENCE, difference_default],\n  [BlendFunction.DIVIDE, divide_default],\n  [BlendFunction.DST, null],\n  [BlendFunction.EXCLUSION, exclusion_default],\n  [BlendFunction.HARD_LIGHT, hard_light_default],\n  [BlendFunction.HARD_MIX, hard_mix_default],\n  [BlendFunction.HUE, hue_default],\n  [BlendFunction.INVERT, invert_default],\n  [BlendFunction.INVERT_RGB, invert_rgb_default],\n  [BlendFunction.LIGHTEN, lighten_default],\n  [BlendFunction.LINEAR_BURN, linear_burn_default],\n  [BlendFunction.LINEAR_DODGE, linear_dodge_default],\n  [BlendFunction.LINEAR_LIGHT, linear_light_default],\n  [BlendFunction.LUMINOSITY, luminosity_default],\n  [BlendFunction.MULTIPLY, multiply_default],\n  [BlendFunction.NEGATION, negation_default],\n  [BlendFunction.NORMAL, normal_default],\n  [BlendFunction.OVERLAY, overlay_default],\n  [BlendFunction.PIN_LIGHT, pin_light_default],\n  [BlendFunction.REFLECT, reflect_default],\n  [BlendFunction.SATURATION, saturation_default],\n  [BlendFunction.SCREEN, screen_default],\n  [BlendFunction.SOFT_LIGHT, soft_light_default],\n  [BlendFunction.SRC, src_default],\n  [BlendFunction.SUBTRACT, subtract_default],\n  [BlendFunction.VIVID_LIGHT, vivid_light_default]\n]);\nvar BlendMode = class extends EventDispatcher2 {\n  /**\n   * Constructs a new blend mode.\n   *\n   * @param {BlendFunction} blendFunction - The blend function.\n   * @param {Number} opacity - The opacity of the color that will be blended with the base color.\n   */\n  constructor(blendFunction, opacity = 1) {\n    super();\n    this._blendFunction = blendFunction;\n    this.opacity = new Uniform2(opacity);\n  }\n  /**\n   * Returns the opacity.\n   *\n   * @return {Number} The opacity.\n   */\n  getOpacity() {\n    return this.opacity.value;\n  }\n  /**\n   * Sets the opacity.\n   *\n   * @param {Number} value - The opacity.\n   */\n  setOpacity(value) {\n    this.opacity.value = value;\n  }\n  /**\n   * The blend function.\n   *\n   * @type {BlendFunction}\n   */\n  get blendFunction() {\n    return this._blendFunction;\n  }\n  set blendFunction(value) {\n    this._blendFunction = value;\n    this.dispatchEvent({ type: \"change\" });\n  }\n  /**\n   * Returns the blend function.\n   *\n   * @deprecated Use blendFunction instead.\n   * @return {BlendFunction} The blend function.\n   */\n  getBlendFunction() {\n    return this.blendFunction;\n  }\n  /**\n   * Sets the blend function.\n   *\n   * @deprecated Use blendFunction instead.\n   * @param {BlendFunction} value - The blend function.\n   */\n  setBlendFunction(value) {\n    this.blendFunction = value;\n  }\n  /**\n   * Returns the blend function shader code.\n   *\n   * @return {String} The blend function shader code.\n   */\n  getShaderCode() {\n    return blendFunctions.get(this.blendFunction);\n  }\n};\n\n// src/effects/BloomEffect.js\nimport { SRGBColorSpace as SRGBColorSpace5, Uniform as Uniform7, WebGLRenderTarget as WebGLRenderTarget8 } from \"three\";\n\n// src/enums/KernelSize.js\nvar KernelSize = {\n  VERY_SMALL: 0,\n  SMALL: 1,\n  MEDIUM: 2,\n  LARGE: 3,\n  VERY_LARGE: 4,\n  HUGE: 5\n};\n\n// src/passes/KawaseBlurPass.js\nimport { SRGBColorSpace as SRGBColorSpace3, UnsignedByteType as UnsignedByteType3, WebGLRenderTarget as WebGLRenderTarget4 } from \"three\";\n\n// src/materials/KawaseBlurMaterial.js\nimport { NoBlending as NoBlending2, ShaderMaterial as ShaderMaterial3, Uniform as Uniform3, Vector4 } from \"three\";\n\n// src/materials/glsl/convolution.kawase.frag\nvar convolution_kawase_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nvarying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec4 sum=texture2D(inputBuffer,vUv0);sum+=texture2D(inputBuffer,vUv1);sum+=texture2D(inputBuffer,vUv2);sum+=texture2D(inputBuffer,vUv3);gl_FragColor=sum*0.25;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.kawase.vert\nvar convolution_kawase_default2 = \"uniform vec4 texelSize;uniform float kernel;uniform float scale;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 uv=position.xy*0.5+0.5;vec2 dUv=(texelSize.xy*vec2(kernel)+texelSize.zw)*scale;vUv0=vec2(uv.x-dUv.x,uv.y+dUv.y);vUv1=vec2(uv.x+dUv.x,uv.y+dUv.y);vUv2=vec2(uv.x+dUv.x,uv.y-dUv.y);vUv3=vec2(uv.x-dUv.x,uv.y-dUv.y);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/KawaseBlurMaterial.js\nvar kernelPresets = [\n  new Float32Array([0, 0]),\n  new Float32Array([0, 1, 1]),\n  new Float32Array([0, 1, 1, 2]),\n  new Float32Array([0, 1, 2, 2, 3]),\n  new Float32Array([0, 1, 2, 3, 4, 4, 5]),\n  new Float32Array([0, 1, 2, 3, 4, 5, 7, 8, 9, 10])\n];\nvar KawaseBlurMaterial = class extends ShaderMaterial3 {\n  /**\n   * Constructs a new convolution material.\n   *\n   * TODO Remove texelSize param.\n   * @param {Vector4} [texelSize] - Deprecated.\n   */\n  constructor(texelSize = new Vector4()) {\n    super({\n      name: \"KawaseBlurMaterial\",\n      uniforms: {\n        inputBuffer: new Uniform3(null),\n        texelSize: new Uniform3(new Vector4()),\n        scale: new Uniform3(1),\n        kernel: new Uniform3(0)\n      },\n      blending: NoBlending2,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_kawase_default,\n      vertexShader: convolution_kawase_default2\n    });\n    this.setTexelSize(texelSize.x, texelSize.y);\n    this.kernelSize = KernelSize.MEDIUM;\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.inputBuffer = value;\n  }\n  /**\n   * The kernel sequence for the current kernel size.\n   *\n   * @type {Float32Array}\n   */\n  get kernelSequence() {\n    return kernelPresets[this.kernelSize];\n  }\n  /**\n   * The blur scale.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.uniforms.scale.value;\n  }\n  set scale(value) {\n    this.uniforms.scale.value = value;\n  }\n  /**\n   * Returns the blur scale.\n   *\n   * @deprecated Use scale instead.\n   * @return {Number} The scale.\n   */\n  getScale() {\n    return this.uniforms.scale.value;\n  }\n  /**\n   * Sets the blur scale.\n   *\n   * @deprecated Use scale instead.\n   * @return {Number} value - The scale.\n   */\n  setScale(value) {\n    this.uniforms.scale.value = value;\n  }\n  /**\n   * Returns the kernel.\n   *\n   * @return {Float32Array} The kernel.\n   * @deprecated Implementation detail, removed with no replacement.\n   */\n  getKernel() {\n    return null;\n  }\n  /**\n   * The current kernel.\n   *\n   * @type {Number}\n   */\n  get kernel() {\n    return this.uniforms.kernel.value;\n  }\n  set kernel(value) {\n    this.uniforms.kernel.value = value;\n  }\n  /**\n   * Sets the current kernel.\n   *\n   * @deprecated Use kernel instead.\n   * @param {Number} value - The kernel.\n   */\n  setKernel(value) {\n    this.kernel = value;\n  }\n  /**\n   * Sets the texel size.\n   *\n   * @deprecated Use setSize() instead.\n   * @param {Number} x - The texel width.\n   * @param {Number} y - The texel height.\n   */\n  setTexelSize(x, y) {\n    this.uniforms.texelSize.value.set(x, y, x * 0.5, y * 0.5);\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const x = 1 / width, y = 1 / height;\n    this.uniforms.texelSize.value.set(x, y, x * 0.5, y * 0.5);\n  }\n};\n\n// src/passes/KawaseBlurPass.js\nvar KawaseBlurPass = class extends Pass {\n  /**\n   * Constructs a new Kawase blur pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {KernelSize} [options.kernelSize=KernelSize.MEDIUM] - The blur kernel size.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor({\n    kernelSize = KernelSize.MEDIUM,\n    resolutionScale = 0.5,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"KawaseBlurPass\");\n    this.renderTargetA = new WebGLRenderTarget4(1, 1, { depthBuffer: false });\n    this.renderTargetA.texture.name = \"Blur.Target.A\";\n    this.renderTargetB = this.renderTargetA.clone();\n    this.renderTargetB.texture.name = \"Blur.Target.B\";\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this._blurMaterial = new KawaseBlurMaterial();\n    this._blurMaterial.kernelSize = kernelSize;\n    this.copyMaterial = new CopyMaterial();\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * The blur material.\n   *\n   * @type {KawaseBlurMaterial}\n   */\n  get blurMaterial() {\n    return this._blurMaterial;\n  }\n  /**\n   * The blur material.\n   *\n   * @type {KawaseBlurMaterial}\n   * @protected\n   */\n  set blurMaterial(value) {\n    this._blurMaterial = value;\n  }\n  /**\n   * Indicates whether dithering is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated Use copyMaterial.dithering instead.\n   */\n  get dithering() {\n    return this.copyMaterial.dithering;\n  }\n  set dithering(value) {\n    this.copyMaterial.dithering = value;\n  }\n  /**\n   * The kernel size.\n   *\n   * @type {KernelSize}\n   * @deprecated Use blurMaterial.kernelSize instead.\n   */\n  get kernelSize() {\n    return this.blurMaterial.kernelSize;\n  }\n  set kernelSize(value) {\n    this.blurMaterial.kernelSize = value;\n  }\n  /**\n   * The current width of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.width instead.\n   */\n  get width() {\n    return this.resolution.width;\n  }\n  /**\n   * Sets the render width.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.preferredWidth instead.\n   */\n  set width(value) {\n    this.resolution.preferredWidth = value;\n  }\n  /**\n   * The current height of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.height instead.\n   */\n  get height() {\n    return this.resolution.height;\n  }\n  /**\n   * Sets the render height.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.preferredHeight instead.\n   */\n  set height(value) {\n    this.resolution.preferredHeight = value;\n  }\n  /**\n   * The current blur scale.\n   *\n   * @type {Number}\n   * @deprecated Use blurMaterial.scale instead.\n   */\n  get scale() {\n    return this.blurMaterial.scale;\n  }\n  set scale(value) {\n    this.blurMaterial.scale = value;\n  }\n  /**\n   * Returns the current blur scale.\n   *\n   * @deprecated Use blurMaterial.scale instead.\n   * @return {Number} The scale.\n   */\n  getScale() {\n    return this.blurMaterial.scale;\n  }\n  /**\n   * Sets the blur scale.\n   *\n   * @deprecated Use blurMaterial.scale instead.\n   * @param {Number} value - The scale.\n   */\n  setScale(value) {\n    this.blurMaterial.scale = value;\n  }\n  /**\n   * Returns the kernel size.\n   *\n   * @deprecated Use blurMaterial.kernelSize instead.\n   * @return {KernelSize} The kernel size.\n   */\n  getKernelSize() {\n    return this.kernelSize;\n  }\n  /**\n   * Sets the kernel size.\n   *\n   * Larger kernels require more processing power but scale well with larger render resolutions.\n   *\n   * @deprecated Use blurMaterial.kernelSize instead.\n   * @param {KernelSize} value - The kernel size.\n   */\n  setKernelSize(value) {\n    this.kernelSize = value;\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @return {Number} The resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  getResolutionScale() {\n    return this.resolution.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * @param {Number} scale - The new resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  setResolutionScale(scale) {\n    this.resolution.scale = scale;\n  }\n  /**\n   * Renders the blur.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const scene = this.scene;\n    const camera = this.camera;\n    const renderTargetA = this.renderTargetA;\n    const renderTargetB = this.renderTargetB;\n    const material = this.blurMaterial;\n    const kernelSequence = material.kernelSequence;\n    let previousBuffer = inputBuffer;\n    this.fullscreenMaterial = material;\n    for (let i = 0, l = kernelSequence.length; i < l; ++i) {\n      const buffer = (i & 1) === 0 ? renderTargetA : renderTargetB;\n      material.kernel = kernelSequence[i];\n      material.inputBuffer = previousBuffer.texture;\n      renderer.setRenderTarget(buffer);\n      renderer.render(scene, camera);\n      previousBuffer = buffer;\n    }\n    this.fullscreenMaterial = this.copyMaterial;\n    this.copyMaterial.inputBuffer = previousBuffer.texture;\n    renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n    renderer.render(scene, camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.renderTargetA.setSize(w, h);\n    this.renderTargetB.setSize(w, h);\n    this.blurMaterial.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (frameBufferType !== void 0) {\n      this.renderTargetA.texture.type = frameBufferType;\n      this.renderTargetB.texture.type = frameBufferType;\n      if (frameBufferType !== UnsignedByteType3) {\n        this.blurMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n        this.copyMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n      } else if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace3) {\n        this.renderTargetA.texture.colorSpace = SRGBColorSpace3;\n        this.renderTargetB.texture.colorSpace = SRGBColorSpace3;\n      }\n    }\n  }\n  /**\n   * An auto sizing flag.\n   *\n   * @type {Number}\n   * @deprecated Use {@link Resolution.AUTO_SIZE} instead.\n   */\n  static get AUTO_SIZE() {\n    return Resolution.AUTO_SIZE;\n  }\n};\n\n// src/passes/LuminancePass.js\nimport { UnsignedByteType as UnsignedByteType4, WebGLRenderTarget as WebGLRenderTarget5 } from \"three\";\n\n// src/materials/LuminanceMaterial.js\nimport { NoBlending as NoBlending3, REVISION, ShaderMaterial as ShaderMaterial4, Uniform as Uniform4 } from \"three\";\n\n// src/materials/glsl/luminance.frag\nvar luminance_default = \"#include <common>\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#ifdef RANGE\\nuniform vec2 range;\\n#elif defined(THRESHOLD)\\nuniform float threshold;uniform float smoothing;\\n#endif\\nvarying vec2 vUv;void main(){vec4 texel=texture2D(inputBuffer,vUv);float l=luminance(texel.rgb);\\n#ifdef RANGE\\nfloat low=step(range.x,l);float high=step(l,range.y);l*=low*high;\\n#elif defined(THRESHOLD)\\nl=smoothstep(threshold,threshold+smoothing,l)*l;\\n#endif\\n#ifdef COLOR\\ngl_FragColor=vec4(texel.rgb*clamp(l,0.0,1.0),l);\\n#else\\ngl_FragColor=vec4(l);\\n#endif\\n}\";\n\n// src/materials/LuminanceMaterial.js\nvar LuminanceMaterial = class extends ShaderMaterial4 {\n  /**\n   * Constructs a new luminance material.\n   *\n   * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colors scaled with their luminance value.\n   * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range.\n   */\n  constructor(colorOutput = false, luminanceRange = null) {\n    super({\n      name: \"LuminanceMaterial\",\n      defines: {\n        THREE_REVISION: REVISION.replace(/\\D+/g, \"\")\n      },\n      uniforms: {\n        inputBuffer: new Uniform4(null),\n        threshold: new Uniform4(0),\n        smoothing: new Uniform4(1),\n        range: new Uniform4(null)\n      },\n      blending: NoBlending3,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: luminance_default,\n      vertexShader: common_default\n    });\n    this.colorOutput = colorOutput;\n    this.luminanceRange = luminanceRange;\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The luminance threshold.\n   *\n   * @type {Number}\n   */\n  get threshold() {\n    return this.uniforms.threshold.value;\n  }\n  set threshold(value) {\n    if (this.smoothing > 0 || value > 0) {\n      this.defines.THRESHOLD = \"1\";\n    } else {\n      delete this.defines.THRESHOLD;\n    }\n    this.uniforms.threshold.value = value;\n  }\n  /**\n   * Returns the luminance threshold.\n   *\n   * @deprecated Use threshold instead.\n   * @return {Number} The threshold.\n   */\n  getThreshold() {\n    return this.threshold;\n  }\n  /**\n   * Sets the luminance threshold.\n   *\n   * @deprecated Use threshold instead.\n   * @param {Number} value - The threshold.\n   */\n  setThreshold(value) {\n    this.threshold = value;\n  }\n  /**\n   * The luminance threshold smoothing.\n   *\n   * @type {Number}\n   */\n  get smoothing() {\n    return this.uniforms.smoothing.value;\n  }\n  set smoothing(value) {\n    if (this.threshold > 0 || value > 0) {\n      this.defines.THRESHOLD = \"1\";\n    } else {\n      delete this.defines.THRESHOLD;\n    }\n    this.uniforms.smoothing.value = value;\n  }\n  /**\n   * Returns the luminance threshold smoothing factor.\n   *\n   * @deprecated Use smoothing instead.\n   * @return {Number} The smoothing factor.\n   */\n  getSmoothingFactor() {\n    return this.smoothing;\n  }\n  /**\n   * Sets the luminance threshold smoothing factor.\n   *\n   * @deprecated Use smoothing instead.\n   * @param {Number} value - The smoothing factor.\n   */\n  setSmoothingFactor(value) {\n    this.smoothing = value;\n  }\n  /**\n   * Indicates whether the luminance threshold is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated Adjust the threshold or smoothing factor instead.\n   */\n  get useThreshold() {\n    return this.threshold > 0 || this.smoothing > 0;\n  }\n  set useThreshold(value) {\n  }\n  /**\n   * Indicates whether color output is enabled.\n   *\n   * @type {Boolean}\n   */\n  get colorOutput() {\n    return this.defines.COLOR !== void 0;\n  }\n  set colorOutput(value) {\n    if (value) {\n      this.defines.COLOR = \"1\";\n    } else {\n      delete this.defines.COLOR;\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Indicates whether color output is enabled.\n   *\n   * @deprecated Use colorOutput instead.\n   * @return {Boolean} Whether color output is enabled.\n   */\n  isColorOutputEnabled(value) {\n    return this.colorOutput;\n  }\n  /**\n   * Enables or disables color output.\n   *\n   * @deprecated Use colorOutput instead.\n   * @param {Boolean} value - Whether color output should be enabled.\n   */\n  setColorOutputEnabled(value) {\n    this.colorOutput = value;\n  }\n  /**\n   * Indicates whether luminance masking is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated\n   */\n  get useRange() {\n    return this.luminanceRange !== null;\n  }\n  set useRange(value) {\n    this.luminanceRange = null;\n  }\n  /**\n   * The luminance range. Set to null to disable.\n   *\n   * @type {Boolean}\n   */\n  get luminanceRange() {\n    return this.uniforms.range.value;\n  }\n  set luminanceRange(value) {\n    if (value !== null) {\n      this.defines.RANGE = \"1\";\n    } else {\n      delete this.defines.RANGE;\n    }\n    this.uniforms.range.value = value;\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the current luminance range.\n   *\n   * @deprecated Use luminanceRange instead.\n   * @return {Vector2} The luminance range.\n   */\n  getLuminanceRange() {\n    return this.luminanceRange;\n  }\n  /**\n   * Sets a luminance range. Set to null to disable.\n   *\n   * @deprecated Use luminanceRange instead.\n   * @param {Vector2} value - The luminance range.\n   */\n  setLuminanceRange(value) {\n    this.luminanceRange = value;\n  }\n};\n\n// src/passes/LuminancePass.js\nvar LuminancePass = class extends Pass {\n  /**\n   * Constructs a new luminance pass.\n   *\n   * @param {Object} [options] - The options. See {@link LuminanceMaterial} for additional options.\n   * @param {WebGLRenderTarget} [options.renderTarget] - A custom render target.\n   * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor({\n    renderTarget,\n    luminanceRange,\n    colorOutput,\n    resolutionScale = 1,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"LuminancePass\");\n    this.fullscreenMaterial = new LuminanceMaterial(colorOutput, luminanceRange);\n    this.needsSwap = false;\n    this.renderTarget = renderTarget;\n    if (this.renderTarget === void 0) {\n      this.renderTarget = new WebGLRenderTarget5(1, 1, { depthBuffer: false });\n      this.renderTarget.texture.name = \"LuminancePass.Target\";\n    }\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n  }\n  /**\n   * The luminance texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the luminance texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * Renders the luminance.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const material = this.fullscreenMaterial;\n    material.inputBuffer = inputBuffer.texture;\n    renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n    renderer.render(this.scene, this.camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    this.renderTarget.setSize(resolution.width, resolution.height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - A renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (frameBufferType !== void 0 && frameBufferType !== UnsignedByteType4) {\n      this.renderTarget.texture.type = frameBufferType;\n      this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n    }\n  }\n};\n\n// src/passes/MipmapBlurPass.js\nimport { SRGBColorSpace as SRGBColorSpace4, UnsignedByteType as UnsignedByteType5, Vector2 as Vector25, WebGLRenderTarget as WebGLRenderTarget6 } from \"three\";\n\n// src/materials/DownsamplingMaterial.js\nimport { NoBlending as NoBlending4, ShaderMaterial as ShaderMaterial5, Uniform as Uniform5, Vector2 as Vector23 } from \"three\";\n\n// src/materials/glsl/convolution.downsampling.frag\nvar convolution_downsampling_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#define WEIGHT_INNER 0.125\\n#define WEIGHT_OUTER 0.0555555\\nvarying vec2 vUv;varying vec2 vUv00;varying vec2 vUv01;varying vec2 vUv02;varying vec2 vUv03;varying vec2 vUv04;varying vec2 vUv05;varying vec2 vUv06;varying vec2 vUv07;varying vec2 vUv08;varying vec2 vUv09;varying vec2 vUv10;varying vec2 vUv11;float clampToBorder(const in vec2 uv){return float(uv.s>=0.0&&uv.s<=1.0&&uv.t>=0.0&&uv.t<=1.0);}void main(){vec4 c=vec4(0.0);vec4 w=WEIGHT_INNER*vec4(clampToBorder(vUv00),clampToBorder(vUv01),clampToBorder(vUv02),clampToBorder(vUv03));c+=w.x*texture2D(inputBuffer,vUv00);c+=w.y*texture2D(inputBuffer,vUv01);c+=w.z*texture2D(inputBuffer,vUv02);c+=w.w*texture2D(inputBuffer,vUv03);w=WEIGHT_OUTER*vec4(clampToBorder(vUv04),clampToBorder(vUv05),clampToBorder(vUv06),clampToBorder(vUv07));c+=w.x*texture2D(inputBuffer,vUv04);c+=w.y*texture2D(inputBuffer,vUv05);c+=w.z*texture2D(inputBuffer,vUv06);c+=w.w*texture2D(inputBuffer,vUv07);w=WEIGHT_OUTER*vec4(clampToBorder(vUv08),clampToBorder(vUv09),clampToBorder(vUv10),clampToBorder(vUv11));c+=w.x*texture2D(inputBuffer,vUv08);c+=w.y*texture2D(inputBuffer,vUv09);c+=w.z*texture2D(inputBuffer,vUv10);c+=w.w*texture2D(inputBuffer,vUv11);c+=WEIGHT_OUTER*texture2D(inputBuffer,vUv);gl_FragColor=c;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.downsampling.vert\nvar convolution_downsampling_default2 = \"uniform vec2 texelSize;varying vec2 vUv;varying vec2 vUv00;varying vec2 vUv01;varying vec2 vUv02;varying vec2 vUv03;varying vec2 vUv04;varying vec2 vUv05;varying vec2 vUv06;varying vec2 vUv07;varying vec2 vUv08;varying vec2 vUv09;varying vec2 vUv10;varying vec2 vUv11;void main(){vUv=position.xy*0.5+0.5;vUv00=vUv+texelSize*vec2(-1.0,1.0);vUv01=vUv+texelSize*vec2(1.0,1.0);vUv02=vUv+texelSize*vec2(-1.0,-1.0);vUv03=vUv+texelSize*vec2(1.0,-1.0);vUv04=vUv+texelSize*vec2(-2.0,2.0);vUv05=vUv+texelSize*vec2(0.0,2.0);vUv06=vUv+texelSize*vec2(2.0,2.0);vUv07=vUv+texelSize*vec2(-2.0,0.0);vUv08=vUv+texelSize*vec2(2.0,0.0);vUv09=vUv+texelSize*vec2(-2.0,-2.0);vUv10=vUv+texelSize*vec2(0.0,-2.0);vUv11=vUv+texelSize*vec2(2.0,-2.0);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/DownsamplingMaterial.js\nvar DownsamplingMaterial = class extends ShaderMaterial5 {\n  /**\n   * Constructs a new downsampling material.\n   */\n  constructor() {\n    super({\n      name: \"DownsamplingMaterial\",\n      uniforms: {\n        inputBuffer: new Uniform5(null),\n        texelSize: new Uniform5(new Vector23())\n      },\n      blending: NoBlending4,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_downsampling_default,\n      vertexShader: convolution_downsampling_default2\n    });\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/materials/UpsamplingMaterial.js\nimport { NoBlending as NoBlending5, ShaderMaterial as ShaderMaterial6, Uniform as Uniform6, Vector2 as Vector24 } from \"three\";\n\n// src/materials/glsl/convolution.upsampling.frag\nvar convolution_upsampling_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;uniform mediump sampler2D supportBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;uniform lowp sampler2D supportBuffer;\\n#endif\\nuniform float radius;varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;varying vec2 vUv6;varying vec2 vUv7;void main(){vec4 c=vec4(0.0);c+=texture2D(inputBuffer,vUv0)*0.0625;c+=texture2D(inputBuffer,vUv1)*0.125;c+=texture2D(inputBuffer,vUv2)*0.0625;c+=texture2D(inputBuffer,vUv3)*0.125;c+=texture2D(inputBuffer,vUv)*0.25;c+=texture2D(inputBuffer,vUv4)*0.125;c+=texture2D(inputBuffer,vUv5)*0.0625;c+=texture2D(inputBuffer,vUv6)*0.125;c+=texture2D(inputBuffer,vUv7)*0.0625;vec4 baseColor=texture2D(supportBuffer,vUv);gl_FragColor=mix(baseColor,c,radius);\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.upsampling.vert\nvar convolution_upsampling_default2 = \"uniform vec2 texelSize;varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;varying vec2 vUv6;varying vec2 vUv7;void main(){vUv=position.xy*0.5+0.5;vUv0=vUv+texelSize*vec2(-1.0,1.0);vUv1=vUv+texelSize*vec2(0.0,1.0);vUv2=vUv+texelSize*vec2(1.0,1.0);vUv3=vUv+texelSize*vec2(-1.0,0.0);vUv4=vUv+texelSize*vec2(1.0,0.0);vUv5=vUv+texelSize*vec2(-1.0,-1.0);vUv6=vUv+texelSize*vec2(0.0,-1.0);vUv7=vUv+texelSize*vec2(1.0,-1.0);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/UpsamplingMaterial.js\nvar UpsamplingMaterial = class extends ShaderMaterial6 {\n  /**\n   * Constructs a new upsampling material.\n   */\n  constructor() {\n    super({\n      name: \"UpsamplingMaterial\",\n      uniforms: {\n        inputBuffer: new Uniform6(null),\n        supportBuffer: new Uniform6(null),\n        texelSize: new Uniform6(new Vector24()),\n        radius: new Uniform6(0.85)\n      },\n      blending: NoBlending5,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_upsampling_default,\n      vertexShader: convolution_upsampling_default2\n    });\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * A support buffer.\n   *\n   * @type {Texture}\n   */\n  set supportBuffer(value) {\n    this.uniforms.supportBuffer.value = value;\n  }\n  /**\n   * The blur radius.\n   *\n   * @type {Number}\n   */\n  get radius() {\n    return this.uniforms.radius.value;\n  }\n  set radius(value) {\n    this.uniforms.radius.value = value;\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/passes/MipmapBlurPass.js\nvar MipmapBlurPass = class extends Pass {\n  /**\n   * Constructs a new mipmap blur pass.\n   *\n   * @param {Object} [options] - The options.\n   */\n  constructor() {\n    super(\"MipmapBlurPass\");\n    this.needsSwap = false;\n    this.renderTarget = new WebGLRenderTarget6(1, 1, { depthBuffer: false });\n    this.renderTarget.texture.name = \"Upsampling.Mipmap0\";\n    this.downsamplingMipmaps = [];\n    this.upsamplingMipmaps = [];\n    this.downsamplingMaterial = new DownsamplingMaterial();\n    this.upsamplingMaterial = new UpsamplingMaterial();\n    this.resolution = new Vector25();\n  }\n  /**\n   * A texture that contains the blurred result.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * The MIP levels. Default is 8.\n   *\n   * @type {Number}\n   */\n  get levels() {\n    return this.downsamplingMipmaps.length;\n  }\n  set levels(value) {\n    if (this.levels !== value) {\n      const renderTarget = this.renderTarget;\n      this.dispose();\n      this.downsamplingMipmaps = [];\n      this.upsamplingMipmaps = [];\n      for (let i = 0; i < value; ++i) {\n        const mipmap = renderTarget.clone();\n        mipmap.texture.name = \"Downsampling.Mipmap\" + i;\n        this.downsamplingMipmaps.push(mipmap);\n      }\n      this.upsamplingMipmaps.push(renderTarget);\n      for (let i = 1, l = value - 1; i < l; ++i) {\n        const mipmap = renderTarget.clone();\n        mipmap.texture.name = \"Upsampling.Mipmap\" + i;\n        this.upsamplingMipmaps.push(mipmap);\n      }\n      this.setSize(this.resolution.x, this.resolution.y);\n    }\n  }\n  /**\n   * The blur radius.\n   *\n   * @type {Number}\n   */\n  get radius() {\n    return this.upsamplingMaterial.radius;\n  }\n  set radius(value) {\n    this.upsamplingMaterial.radius = value;\n  }\n  /**\n   * Renders the blur.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const { scene, camera } = this;\n    const { downsamplingMaterial, upsamplingMaterial } = this;\n    const { downsamplingMipmaps, upsamplingMipmaps } = this;\n    let previousBuffer = inputBuffer;\n    this.fullscreenMaterial = downsamplingMaterial;\n    for (let i = 0, l = downsamplingMipmaps.length; i < l; ++i) {\n      const mipmap = downsamplingMipmaps[i];\n      downsamplingMaterial.setSize(previousBuffer.width, previousBuffer.height);\n      downsamplingMaterial.inputBuffer = previousBuffer.texture;\n      renderer.setRenderTarget(mipmap);\n      renderer.render(scene, camera);\n      previousBuffer = mipmap;\n    }\n    this.fullscreenMaterial = upsamplingMaterial;\n    for (let i = upsamplingMipmaps.length - 1; i >= 0; --i) {\n      const mipmap = upsamplingMipmaps[i];\n      upsamplingMaterial.setSize(previousBuffer.width, previousBuffer.height);\n      upsamplingMaterial.inputBuffer = previousBuffer.texture;\n      upsamplingMaterial.supportBuffer = downsamplingMipmaps[i].texture;\n      renderer.setRenderTarget(mipmap);\n      renderer.render(scene, camera);\n      previousBuffer = mipmap;\n    }\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.set(width, height);\n    let w = resolution.width, h = resolution.height;\n    for (let i = 0, l = this.downsamplingMipmaps.length; i < l; ++i) {\n      w = Math.round(w * 0.5);\n      h = Math.round(h * 0.5);\n      this.downsamplingMipmaps[i].setSize(w, h);\n      if (i < this.upsamplingMipmaps.length) {\n        this.upsamplingMipmaps[i].setSize(w, h);\n      }\n    }\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (frameBufferType !== void 0) {\n      const mipmaps = this.downsamplingMipmaps.concat(this.upsamplingMipmaps);\n      for (const mipmap of mipmaps) {\n        mipmap.texture.type = frameBufferType;\n      }\n      if (frameBufferType !== UnsignedByteType5) {\n        this.downsamplingMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n        this.upsamplingMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n      } else if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace4) {\n        for (const mipmap of mipmaps) {\n          mipmap.texture.colorSpace = SRGBColorSpace4;\n        }\n      }\n    }\n  }\n  /**\n   * Deletes internal render targets and textures.\n   */\n  dispose() {\n    super.dispose();\n    for (const mipmap of this.downsamplingMipmaps.concat(this.upsamplingMipmaps)) {\n      mipmap.dispose();\n    }\n  }\n};\n\n// src/effects/Effect.js\nimport {\n  BasicDepthPacking as BasicDepthPacking2,\n  EventDispatcher as EventDispatcher3,\n  LinearSRGBColorSpace as LinearSRGBColorSpace2,\n  Material as Material2,\n  NoColorSpace,\n  Texture as Texture2,\n  WebGLRenderTarget as WebGLRenderTarget7\n} from \"three\";\nvar Effect = class extends EventDispatcher3 {\n  /**\n   * Constructs a new effect.\n   *\n   * @param {String} name - The name of this effect. Doesn't have to be unique.\n   * @param {String} fragmentShader - The fragment shader. This shader is required.\n   * @param {Object} [options] - Additional options.\n   * @param {EffectAttribute} [options.attributes=EffectAttribute.NONE] - The effect attributes that determine the execution priority and resource requirements.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.NORMAL] - The blend function of this effect.\n   * @param {Map<String, String>} [options.defines] - Custom preprocessor macro definitions. Keys are names and values are code.\n   * @param {Map<String, Uniform>} [options.uniforms] - Custom shader uniforms. Keys are names and values are uniforms.\n   * @param {Set<WebGLExtension>} [options.extensions] - WebGL extensions.\n   * @param {String} [options.vertexShader=null] - The vertex shader. Most effects don't need one.\n   */\n  constructor(name, fragmentShader, {\n    attributes = EffectAttribute.NONE,\n    blendFunction = BlendFunction.NORMAL,\n    defines = /* @__PURE__ */ new Map(),\n    uniforms = /* @__PURE__ */ new Map(),\n    extensions = null,\n    vertexShader = null\n  } = {}) {\n    super();\n    this.name = name;\n    this.renderer = null;\n    this.attributes = attributes;\n    this.fragmentShader = fragmentShader;\n    this.vertexShader = vertexShader;\n    this.defines = defines;\n    this.uniforms = uniforms;\n    this.extensions = extensions;\n    this.blendMode = new BlendMode(blendFunction);\n    this.blendMode.addEventListener(\"change\", (event) => this.setChanged());\n    this._inputColorSpace = LinearSRGBColorSpace2;\n    this._outputColorSpace = NoColorSpace;\n  }\n  /**\n   * The input color space.\n   *\n   * @type {ColorSpace}\n   * @experimental\n   */\n  get inputColorSpace() {\n    return this._inputColorSpace;\n  }\n  /**\n   * @type {ColorSpace}\n   * @protected\n   * @experimental\n   */\n  set inputColorSpace(value) {\n    this._inputColorSpace = value;\n    this.setChanged();\n  }\n  /**\n   * The output color space.\n   *\n   * Should only be changed if this effect converts the input colors to a different color space.\n   *\n   * @type {ColorSpace}\n   * @experimental\n   */\n  get outputColorSpace() {\n    return this._outputColorSpace;\n  }\n  /**\n   * @type {ColorSpace}\n   * @protected\n   * @experimental\n   */\n  set outputColorSpace(value) {\n    this._outputColorSpace = value;\n    this.setChanged();\n  }\n  /**\n   * Sets the main scene.\n   *\n   * @type {Scene}\n   */\n  set mainScene(value) {\n  }\n  /**\n   * Sets the main camera.\n   *\n   * @type {Camera}\n   */\n  set mainCamera(value) {\n  }\n  /**\n   * Returns the name of this effect.\n   *\n   * @deprecated Use name instead.\n   * @return {String} The name.\n   */\n  getName() {\n    return this.name;\n  }\n  /**\n   * Sets the renderer.\n   *\n   * @deprecated\n   * @param {WebGLRenderer} renderer - The renderer.\n   */\n  setRenderer(renderer) {\n    this.renderer = renderer;\n  }\n  /**\n   * Returns the preprocessor macro definitions.\n   *\n   * @deprecated Use defines instead.\n   * @return {Map<String, String>} The extensions.\n   */\n  getDefines() {\n    return this.defines;\n  }\n  /**\n   * Returns the uniforms of this effect.\n   *\n   * @deprecated Use uniforms instead.\n   * @return {Map<String, Uniform>} The extensions.\n   */\n  getUniforms() {\n    return this.uniforms;\n  }\n  /**\n   * Returns the WebGL extensions that are required by this effect.\n   *\n   * @deprecated Use extensions instead.\n   * @return {Set<WebGLExtension>} The extensions.\n   */\n  getExtensions() {\n    return this.extensions;\n  }\n  /**\n   * Returns the blend mode.\n   *\n   * The result of this effect will be blended with the result of the previous effect using this blend mode.\n   *\n   * @deprecated Use blendMode instead.\n   * @return {BlendMode} The blend mode.\n   */\n  getBlendMode() {\n    return this.blendMode;\n  }\n  /**\n   * Returns the effect attributes.\n   *\n   * @return {EffectAttribute} The attributes.\n   */\n  getAttributes() {\n    return this.attributes;\n  }\n  /**\n   * Sets the effect attributes.\n   *\n   * Effects that have the same attributes will be executed in the order in which they were registered. Some attributes\n   * imply a higher priority.\n   *\n   * @protected\n   * @param {EffectAttribute} attributes - The attributes.\n   */\n  setAttributes(attributes) {\n    this.attributes = attributes;\n    this.setChanged();\n  }\n  /**\n   * Returns the fragment shader.\n   *\n   * @return {String} The fragment shader.\n   */\n  getFragmentShader() {\n    return this.fragmentShader;\n  }\n  /**\n   * Sets the fragment shader.\n   *\n   * @protected\n   * @param {String} fragmentShader - The fragment shader.\n   */\n  setFragmentShader(fragmentShader) {\n    this.fragmentShader = fragmentShader;\n    this.setChanged();\n  }\n  /**\n   * Returns the vertex shader.\n   *\n   * @return {String} The vertex shader.\n   */\n  getVertexShader() {\n    return this.vertexShader;\n  }\n  /**\n   * Sets the vertex shader.\n   *\n   * @protected\n   * @param {String} vertexShader - The vertex shader.\n   */\n  setVertexShader(vertexShader) {\n    this.vertexShader = vertexShader;\n    this.setChanged();\n  }\n  /**\n   * Informs the associated {@link EffectPass} that this effect requires a shader recompilation.\n   *\n   * Should be called after changing macros or extensions and after adding/removing uniforms.\n   *\n   * @protected\n   */\n  setChanged() {\n    this.dispatchEvent({ type: \"change\" });\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * You may override this method if your effect requires direct access to the depth texture that is bound to the\n   * associated {@link EffectPass}.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking2) {\n  }\n  /**\n   * Updates this effect by performing supporting operations.\n   *\n   * This method is called by the {@link EffectPass} right before the main fullscreen render operation, even if the\n   * blend function is set to `SKIP`.\n   *\n   * You may override this method if you need to update custom uniforms or render additional off-screen textures.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n  }\n  /**\n   * Updates the size of this effect.\n   *\n   * You may override this method if you want to be informed about the size of the backbuffer/canvas.\n   * This method is called before {@link initialize} and every time the size of the {@link EffectComposer} changes.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * This method is called when the associated {@link EffectPass} is added to an {@link EffectComposer}.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   * @example if(!alpha && frameBufferType === UnsignedByteType) { this.myRenderTarget.texture.format = RGBFormat; }\n   */\n  initialize(renderer, alpha, frameBufferType) {\n  }\n  /**\n   * Performs a shallow search for properties that define a dispose method and deletes them.\n   *\n   * The {@link EffectComposer} calls this method when it is being destroyed.\n   */\n  dispose() {\n    for (const key of Object.keys(this)) {\n      const property = this[key];\n      const isDisposable = property instanceof WebGLRenderTarget7 || property instanceof Material2 || property instanceof Texture2 || property instanceof Pass;\n      if (isDisposable) {\n        this[key].dispose();\n      }\n    }\n  }\n};\n\n// src/effects/glsl/bloom.frag\nvar bloom_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nuniform float intensity;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec4 texel=texture2D(map,uv);outputColor=vec4(texel.rgb*intensity,texel.a);}\";\n\n// src/effects/BloomEffect.js\nvar BloomEffect = class extends Effect {\n  /**\n   * Constructs a new bloom effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function of this effect.\n   * @param {Number} [options.luminanceThreshold=0.9] - The luminance threshold. Raise this value to mask out darker elements in the scene.\n   * @param {Number} [options.luminanceSmoothing=0.025] - Controls the smoothness of the luminance threshold.\n   * @param {Boolean} [options.mipmapBlur=false] - Enables or disables mipmap blur.\n   * @param {Number} [options.intensity=1.0] - The bloom intensity.\n   * @param {Number} [options.radius=0.85] - The blur radius. Only applies to mipmap blur.\n   * @param {Number} [options.levels=8] - The amount of MIP levels. Only applies to mipmap blur.\n   * @param {KernelSize} [options.kernelSize=KernelSize.LARGE] - Deprecated. Use mipmapBlur instead.\n   * @param {Number} [options.resolutionScale=0.5] - Deprecated. Use mipmapBlur instead.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n   */\n  constructor({\n    blendFunction = BlendFunction.SCREEN,\n    luminanceThreshold = 0.9,\n    luminanceSmoothing = 0.025,\n    mipmapBlur = false,\n    intensity = 1,\n    radius = 0.85,\n    levels = 8,\n    kernelSize = KernelSize.LARGE,\n    resolutionScale = 0.5,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"BloomEffect\", bloom_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"map\", new Uniform7(null)],\n        [\"intensity\", new Uniform7(intensity)]\n      ])\n    });\n    this.renderTarget = new WebGLRenderTarget8(1, 1, { depthBuffer: false });\n    this.renderTarget.texture.name = \"Bloom.Target\";\n    this.blurPass = new KawaseBlurPass({ kernelSize });\n    this.luminancePass = new LuminancePass({ colorOutput: true });\n    this.luminanceMaterial.threshold = luminanceThreshold;\n    this.luminanceMaterial.smoothing = luminanceSmoothing;\n    this.mipmapBlurPass = new MipmapBlurPass();\n    this.mipmapBlurPass.enabled = mipmapBlur;\n    this.mipmapBlurPass.radius = radius;\n    this.mipmapBlurPass.levels = levels;\n    this.uniforms.get(\"map\").value = mipmapBlur ? this.mipmapBlurPass.texture : this.renderTarget.texture;\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n  }\n  /**\n   * A texture that contains the intermediate result of this effect.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.mipmapBlurPass.enabled ? this.mipmapBlurPass.texture : this.renderTarget.texture;\n  }\n  /**\n   * Returns the generated bloom texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.texture;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * Returns the blur pass.\n   *\n   * @deprecated\n   * @return {KawaseBlurPass} The blur pass.\n   */\n  getBlurPass() {\n    return this.blurPass;\n  }\n  /**\n   * Returns the luminance pass.\n   *\n   * @deprecated Use luminancePass instead.\n   * @return {LuminancePass} The luminance pass.\n   */\n  getLuminancePass() {\n    return this.luminancePass;\n  }\n  /**\n   * The luminance material.\n   *\n   * @type {LuminanceMaterial}\n   */\n  get luminanceMaterial() {\n    return this.luminancePass.fullscreenMaterial;\n  }\n  /**\n   * Returns the luminance material.\n   *\n   * @deprecated Use luminanceMaterial instead.\n   * @return {LuminanceMaterial} The material.\n   */\n  getLuminanceMaterial() {\n    return this.luminancePass.fullscreenMaterial;\n  }\n  /**\n   * The current width of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated\n   */\n  get width() {\n    return this.resolution.width;\n  }\n  set width(value) {\n    this.resolution.preferredWidth = value;\n  }\n  /**\n   * The current height of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated\n   */\n  get height() {\n    return this.resolution.height;\n  }\n  set height(value) {\n    this.resolution.preferredHeight = value;\n  }\n  /**\n   * Indicates whether dithering is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated Use EffectPass.dithering instead.\n   */\n  get dithering() {\n    return this.blurPass.dithering;\n  }\n  set dithering(value) {\n    this.blurPass.dithering = value;\n  }\n  /**\n   * The blur kernel size.\n   *\n   * @type {KernelSize}\n   * @deprecated\n   */\n  get kernelSize() {\n    return this.blurPass.kernelSize;\n  }\n  set kernelSize(value) {\n    this.blurPass.kernelSize = value;\n  }\n  /**\n   * @type {Number}\n   * @deprecated\n   */\n  get distinction() {\n    console.warn(this.name, \"distinction was removed\");\n    return 1;\n  }\n  set distinction(value) {\n    console.warn(this.name, \"distinction was removed\");\n  }\n  /**\n   * The bloom intensity.\n   *\n   * @type {Number}\n   */\n  get intensity() {\n    return this.uniforms.get(\"intensity\").value;\n  }\n  set intensity(value) {\n    this.uniforms.get(\"intensity\").value = value;\n  }\n  /**\n   * The bloom intensity.\n   *\n   * @deprecated Use intensity instead.\n   * @return {Number} The intensity.\n   */\n  getIntensity() {\n    return this.intensity;\n  }\n  /**\n   * Sets the bloom intensity.\n   *\n   * @deprecated Use intensity instead.\n   * @param {Number} value - The intensity.\n   */\n  setIntensity(value) {\n    this.intensity = value;\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @return {Number} The resolution scale.\n   * @deprecated\n   */\n  getResolutionScale() {\n    return this.resolution.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * @param {Number} scale - The new resolution scale.\n   * @deprecated\n   */\n  setResolutionScale(scale) {\n    this.resolution.scale = scale;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const renderTarget = this.renderTarget;\n    const luminancePass = this.luminancePass;\n    if (luminancePass.enabled) {\n      luminancePass.render(renderer, inputBuffer);\n      if (this.mipmapBlurPass.enabled) {\n        this.mipmapBlurPass.render(renderer, luminancePass.renderTarget);\n      } else {\n        this.blurPass.render(renderer, luminancePass.renderTarget, renderTarget);\n      }\n    } else {\n      if (this.mipmapBlurPass.enabled) {\n        this.mipmapBlurPass.render(renderer, inputBuffer);\n      } else {\n        this.blurPass.render(renderer, inputBuffer, renderTarget);\n      }\n    }\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    this.renderTarget.setSize(resolution.width, resolution.height);\n    this.blurPass.resolution.copy(resolution);\n    this.luminancePass.setSize(width, height);\n    this.mipmapBlurPass.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.blurPass.initialize(renderer, alpha, frameBufferType);\n    this.luminancePass.initialize(renderer, alpha, frameBufferType);\n    this.mipmapBlurPass.initialize(renderer, alpha, frameBufferType);\n    if (frameBufferType !== void 0) {\n      this.renderTarget.texture.type = frameBufferType;\n      if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace5) {\n        this.renderTarget.texture.colorSpace = SRGBColorSpace5;\n      }\n    }\n  }\n};\n\n// src/effects/BokehEffect.js\nimport { Uniform as Uniform8 } from \"three\";\n\n// src/effects/glsl/bokeh.frag\nvar bokeh_default = \"uniform float focus;uniform float dof;uniform float aperture;uniform float maxBlur;void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){vec2 aspectCorrection=vec2(1.0,aspect);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(depth,cameraNear,cameraFar);float linearDepth=viewZToOrthographicDepth(viewZ,cameraNear,cameraFar);\\n#else\\nfloat linearDepth=depth;\\n#endif\\nfloat focusNear=clamp(focus-dof,0.0,1.0);float focusFar=clamp(focus+dof,0.0,1.0);float low=step(linearDepth,focusNear);float high=step(focusFar,linearDepth);float factor=(linearDepth-focusNear)*low+(linearDepth-focusFar)*high;vec2 dofBlur=vec2(clamp(factor*aperture,-maxBlur,maxBlur));vec2 dofblur9=dofBlur*0.9;vec2 dofblur7=dofBlur*0.7;vec2 dofblur4=dofBlur*0.4;vec4 color=inputColor;color+=texture2D(inputBuffer,uv+(vec2(0.0,0.4)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.15,0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.29,0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.37,0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.40,0.0)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.37,-0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.29,-0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.15,-0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.0,-0.4)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.15,0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.29,0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.37,0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.4,0.0)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.37,-0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.29,-0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.15,-0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.15,0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.37,0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.37,-0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.15,-0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.15,0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.37,0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.37,-0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.15,-0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.29,0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.40,0.0)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.29,-0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.0,-0.4)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(-0.29,0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(-0.4,0.0)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(-0.29,-0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.0,0.4)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.29,0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.4,0.0)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.29,-0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.0,-0.4)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(-0.29,0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(-0.4,0.0)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(-0.29,-0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.0,0.4)*aspectCorrection)*dofblur4);outputColor=color/41.0;}\";\n\n// src/effects/BokehEffect.js\nvar BokehEffect = class extends Effect {\n  /**\n   * Constructs a new bokeh effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.focus=0.5] - The focus distance ratio, ranging from 0.0 to 1.0.\n   * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focal point that still appears sharp.\n   * @param {Number} [options.aperture=0.015] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field.\n   * @param {Number} [options.maxBlur=1.0] - The maximum blur strength.\n   */\n  constructor({\n    blendFunction,\n    focus = 0.5,\n    dof = 0.02,\n    aperture = 0.015,\n    maxBlur = 1\n  } = {}) {\n    super(\"BokehEffect\", bokeh_default, {\n      blendFunction,\n      attributes: EffectAttribute.CONVOLUTION | EffectAttribute.DEPTH,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"focus\", new Uniform8(focus)],\n        [\"dof\", new Uniform8(dof)],\n        [\"aperture\", new Uniform8(aperture)],\n        [\"maxBlur\", new Uniform8(maxBlur)]\n      ])\n    });\n  }\n};\n\n// src/effects/BrightnessContrastEffect.js\nimport { SRGBColorSpace as SRGBColorSpace6, Uniform as Uniform9 } from \"three\";\n\n// src/effects/glsl/brightness-contrast.frag\nvar brightness_contrast_default = \"uniform float brightness;uniform float contrast;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=inputColor.rgb+vec3(brightness-0.5);if(contrast>0.0){color/=vec3(1.0-contrast);}else{color*=vec3(1.0+contrast);}outputColor=vec4(color+vec3(0.5),inputColor.a);}\";\n\n// src/effects/BrightnessContrastEffect.js\nvar BrightnessContrastEffect = class extends Effect {\n  /**\n   * Constructs a new brightness/contrast effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {Number} [options.brightness=0.0] - The brightness factor, ranging from -1 to 1, where 0 means no change.\n   * @param {Number} [options.contrast=0.0] - The contrast factor, ranging from -1 to 1, where 0 means no change.\n   */\n  constructor({ blendFunction = BlendFunction.SRC, brightness = 0, contrast = 0 } = {}) {\n    super(\"BrightnessContrastEffect\", brightness_contrast_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"brightness\", new Uniform9(brightness)],\n        [\"contrast\", new Uniform9(contrast)]\n      ])\n    });\n    this.inputColorSpace = SRGBColorSpace6;\n  }\n  /**\n   * The brightness.\n   *\n   * @type {Number}\n   */\n  get brightness() {\n    return this.uniforms.get(\"brightness\").value;\n  }\n  set brightness(value) {\n    this.uniforms.get(\"brightness\").value = value;\n  }\n  /**\n   * Returns the brightness.\n   *\n   * @deprecated Use brightness instead.\n   * @return {Number} The brightness.\n   */\n  getBrightness() {\n    return this.brightness;\n  }\n  /**\n   * Sets the brightness.\n   *\n   * @deprecated Use brightness instead.\n   * @param {Number} value - The brightness.\n   */\n  setBrightness(value) {\n    this.brightness = value;\n  }\n  /**\n   * The contrast.\n   *\n   * @type {Number}\n   */\n  get contrast() {\n    return this.uniforms.get(\"contrast\").value;\n  }\n  set contrast(value) {\n    this.uniforms.get(\"contrast\").value = value;\n  }\n  /**\n   * Returns the contrast.\n   *\n   * @deprecated Use contrast instead.\n   * @return {Number} The contrast.\n   */\n  getContrast() {\n    return this.contrast;\n  }\n  /**\n   * Sets the contrast.\n   *\n   * @deprecated Use contrast instead.\n   * @param {Number} value - The contrast.\n   */\n  setContrast(value) {\n    this.contrast = value;\n  }\n};\n\n// src/effects/glsl/color-average.frag\nvar color_average_default = \"void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=vec4(vec3(average(inputColor.rgb)),inputColor.a);}\";\n\n// src/effects/ColorAverageEffect.js\nvar ColorAverageEffect = class extends Effect {\n  /**\n   * Constructs a new color average effect.\n   *\n   * @param {BlendFunction} [blendFunction] - The blend function of this effect.\n   */\n  constructor(blendFunction) {\n    super(\"ColorAverageEffect\", color_average_default, { blendFunction });\n  }\n};\n\n// src/effects/ColorDepthEffect.js\nimport { Uniform as Uniform10 } from \"three\";\n\n// src/effects/glsl/color-depth.frag\nvar color_depth_default = \"uniform float factor;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=vec4(floor(inputColor.rgb*factor+0.5)/factor,inputColor.a);}\";\n\n// src/effects/ColorDepthEffect.js\nvar ColorDepthEffect = class extends Effect {\n  /**\n   * Constructs a new color depth effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.bits=16] - The color bit depth.\n   */\n  constructor({ blendFunction, bits = 16 } = {}) {\n    super(\"ColorDepthEffect\", color_depth_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"factor\", new Uniform10(1)]\n      ])\n    });\n    this.bits = 0;\n    this.bitDepth = bits;\n  }\n  /**\n   * The virtual amount of color bits.\n   *\n   * Each color channel effectively uses a fourth of the total amount of bits. Alpha remains unaffected.\n   *\n   * @type {Number}\n   */\n  get bitDepth() {\n    return this.bits;\n  }\n  set bitDepth(value) {\n    this.bits = value;\n    this.uniforms.get(\"factor\").value = Math.pow(2, value / 3);\n  }\n  /**\n   * Returns the current color bit depth.\n   *\n   * @return {Number} The bit depth.\n   */\n  getBitDepth() {\n    return this.bitDepth;\n  }\n  /**\n   * Sets the virtual amount of color bits.\n   *\n   * @param {Number} value - The bit depth.\n   */\n  setBitDepth(value) {\n    this.bitDepth = value;\n  }\n};\n\n// src/effects/ChromaticAberrationEffect.js\nimport { Uniform as Uniform11, Vector2 as Vector26 } from \"three\";\n\n// src/effects/glsl/chromatic-aberration.frag\nvar chromatic_aberration_default = \"#ifdef RADIAL_MODULATION\\nuniform float modulationOffset;\\n#endif\\nvarying float vActive;varying vec2 vUvR;varying vec2 vUvB;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec2 ra=inputColor.ra;vec2 ba=inputColor.ba;\\n#ifdef RADIAL_MODULATION\\nconst vec2 center=vec2(0.5);float d=distance(uv,center)*2.0;d=max(d-modulationOffset,0.0);if(vActive>0.0&&d>0.0){ra=texture2D(inputBuffer,mix(uv,vUvR,d)).ra;ba=texture2D(inputBuffer,mix(uv,vUvB,d)).ba;}\\n#else\\nif(vActive>0.0){ra=texture2D(inputBuffer,vUvR).ra;ba=texture2D(inputBuffer,vUvB).ba;}\\n#endif\\noutputColor=vec4(ra.x,inputColor.g,ba.x,max(max(ra.y,ba.y),inputColor.a));}\";\n\n// src/effects/glsl/chromatic-aberration.vert\nvar chromatic_aberration_default2 = \"uniform vec2 offset;varying float vActive;varying vec2 vUvR;varying vec2 vUvB;void mainSupport(const in vec2 uv){vec2 shift=offset*vec2(1.0,aspect);vActive=(shift.x!=0.0||shift.y!=0.0)?1.0:0.0;vUvR=uv+shift;vUvB=uv-shift;}\";\n\n// src/effects/ChromaticAberrationEffect.js\nvar ChromaticAberrationEffect = class extends Effect {\n  /**\n   * Constructs a new chromatic aberration effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Vector2} [options.offset] - The color offset.\n   * @param {Boolean} [options.radialModulation=false] - Whether the effect should be modulated with a radial gradient.\n   * @param {Number} [options.modulationOffset=0.15] - The modulation offset. Only applies if `radialModulation` is enabled.\n   */\n  constructor({\n    offset = new Vector26(1e-3, 5e-4),\n    radialModulation = false,\n    modulationOffset = 0.15\n  } = {}) {\n    super(\"ChromaticAberrationEffect\", chromatic_aberration_default, {\n      vertexShader: chromatic_aberration_default2,\n      attributes: EffectAttribute.CONVOLUTION,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"offset\", new Uniform11(offset)],\n        [\"modulationOffset\", new Uniform11(modulationOffset)]\n      ])\n    });\n    this.radialModulation = radialModulation;\n  }\n  /**\n   * The color offset.\n   *\n   * @type {Vector2}\n   */\n  get offset() {\n    return this.uniforms.get(\"offset\").value;\n  }\n  set offset(value) {\n    this.uniforms.get(\"offset\").value = value;\n  }\n  /**\n   * Indicates whether radial modulation is enabled.\n   *\n   * When enabled, the effect will be weaker in the middle and stronger towards the screen edges.\n   *\n   * @type {Boolean}\n   */\n  get radialModulation() {\n    return this.defines.has(\"RADIAL_MODULATION\");\n  }\n  set radialModulation(value) {\n    if (value) {\n      this.defines.set(\"RADIAL_MODULATION\", \"1\");\n    } else {\n      this.defines.delete(\"RADIAL_MODULATION\");\n    }\n    this.setChanged();\n  }\n  /**\n   * The modulation offset.\n   *\n   * @type {Number}\n   */\n  get modulationOffset() {\n    return this.uniforms.get(\"modulationOffset\").value;\n  }\n  set modulationOffset(value) {\n    this.uniforms.get(\"modulationOffset\").value = value;\n  }\n  /**\n   * Returns the color offset vector.\n   *\n   * @deprecated Use offset instead.\n   * @return {Vector2} The offset.\n   */\n  getOffset() {\n    return this.offset;\n  }\n  /**\n   * Sets the color offset vector.\n   *\n   * @deprecated Use offset instead.\n   * @param {Vector2} value - The offset.\n   */\n  setOffset(value) {\n    this.offset = value;\n  }\n};\n\n// src/effects/glsl/depth.frag\nvar depth_default = \"void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){\\n#ifdef INVERTED\\nvec3 color=vec3(1.0-depth);\\n#else\\nvec3 color=vec3(depth);\\n#endif\\noutputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/DepthEffect.js\nvar DepthEffect = class extends Effect {\n  /**\n   * Constructs a new depth effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {Boolean} [options.inverted=false] - Whether the depth should be inverted.\n   */\n  constructor({ blendFunction = BlendFunction.SRC, inverted = false } = {}) {\n    super(\"DepthEffect\", depth_default, {\n      blendFunction,\n      attributes: EffectAttribute.DEPTH\n    });\n    this.inverted = inverted;\n  }\n  /**\n   * Indicates whether depth should be inverted.\n   *\n   * @type {Boolean}\n   */\n  get inverted() {\n    return this.defines.has(\"INVERTED\");\n  }\n  set inverted(value) {\n    if (this.inverted !== value) {\n      if (value) {\n        this.defines.set(\"INVERTED\", \"1\");\n      } else {\n        this.defines.delete(\"INVERTED\");\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether the rendered depth is inverted.\n   *\n   * @deprecated Use inverted instead.\n   * @return {Boolean} Whether the rendered depth is inverted.\n   */\n  isInverted() {\n    return this.inverted;\n  }\n  /**\n   * Enables or disables depth inversion.\n   *\n   * @deprecated Use inverted instead.\n   * @param {Boolean} value - Whether depth should be inverted.\n   */\n  setInverted(value) {\n    this.inverted = value;\n  }\n};\n\n// src/effects/DepthOfFieldEffect.js\nimport { BasicDepthPacking as BasicDepthPacking4, SRGBColorSpace as SRGBColorSpace7, Uniform as Uniform15, UnsignedByteType as UnsignedByteType8, WebGLRenderTarget as WebGLRenderTarget9 } from \"three\";\n\n// src/enums/ColorChannel.js\nvar ColorChannel = {\n  RED: 0,\n  GREEN: 1,\n  BLUE: 2,\n  ALPHA: 3\n};\n\n// src/enums/MaskFunction.js\nvar MaskFunction = {\n  DISCARD: 0,\n  MULTIPLY: 1,\n  MULTIPLY_RGB_SET_ALPHA: 2,\n  MULTIPLY_RGB: 3\n};\n\n// src/materials/BokehMaterial.js\nimport { NoBlending as NoBlending6, ShaderMaterial as ShaderMaterial7, Uniform as Uniform12, Vector2 as Vector27 } from \"three\";\n\n// src/materials/glsl/convolution.bokeh.frag\nvar convolution_bokeh_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#if PASS == 1\\nuniform vec4 kernel64[32];\\n#else\\nuniform vec4 kernel16[8];\\n#endif\\nuniform lowp sampler2D cocBuffer;uniform vec2 texelSize;uniform float scale;varying vec2 vUv;void main(){\\n#ifdef FOREGROUND\\nvec2 cocNearFar=texture2D(cocBuffer,vUv).rg*scale;float coc=cocNearFar.x;\\n#else\\nfloat coc=texture2D(cocBuffer,vUv).g*scale;\\n#endif\\nif(coc==0.0){gl_FragColor=texture2D(inputBuffer,vUv);}else{\\n#ifdef FOREGROUND\\nvec2 step=texelSize*max(cocNearFar.x,cocNearFar.y);\\n#else\\nvec2 step=texelSize*coc;\\n#endif\\n#if PASS == 1\\nvec4 acc=vec4(0.0);for(int i=0;i<32;++i){vec4 kernel=kernel64[i];vec2 uv=step*kernel.xy+vUv;acc+=texture2D(inputBuffer,uv);uv=step*kernel.zw+vUv;acc+=texture2D(inputBuffer,uv);}gl_FragColor=acc/64.0;\\n#else\\nvec4 maxValue=texture2D(inputBuffer,vUv);for(int i=0;i<8;++i){vec4 kernel=kernel16[i];vec2 uv=step*kernel.xy+vUv;maxValue=max(texture2D(inputBuffer,uv),maxValue);uv=step*kernel.zw+vUv;maxValue=max(texture2D(inputBuffer,uv),maxValue);}gl_FragColor=maxValue;\\n#endif\\n}}\";\n\n// src/materials/BokehMaterial.js\nvar BokehMaterial = class extends ShaderMaterial7 {\n  /**\n   * Constructs a new bokeh material.\n   *\n   * @param {Boolean} [fill=false] - Enables or disables the bokeh highlight fill mode.\n   * @param {Boolean} [foreground=false] - Determines whether this material will be applied to foreground colors.\n   */\n  constructor(fill = false, foreground = false) {\n    super({\n      name: \"BokehMaterial\",\n      defines: {\n        PASS: fill ? \"2\" : \"1\"\n      },\n      uniforms: {\n        inputBuffer: new Uniform12(null),\n        cocBuffer: new Uniform12(null),\n        texelSize: new Uniform12(new Vector27()),\n        kernel64: new Uniform12(null),\n        kernel16: new Uniform12(null),\n        scale: new Uniform12(1)\n      },\n      blending: NoBlending6,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_bokeh_default,\n      vertexShader: common_default\n    });\n    if (foreground) {\n      this.defines.FOREGROUND = \"1\";\n    }\n    this.generateKernel();\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The circle of confusion buffer.\n   *\n   * @type {Texture}\n   */\n  set cocBuffer(value) {\n    this.uniforms.cocBuffer.value = value;\n  }\n  /**\n   * Sets the circle of confusion buffer.\n   *\n   * @deprecated Use cocBuffer instead.\n   * @param {Texture} value - The buffer.\n   */\n  setCoCBuffer(value) {\n    this.uniforms.cocBuffer.value = value;\n  }\n  /**\n   * The blur scale.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.uniforms.scale.value;\n  }\n  set scale(value) {\n    this.uniforms.scale.value = value;\n  }\n  /**\n   * Returns the blur scale.\n   *\n   * @deprecated Use scale instead.\n   * @return {Number} The scale.\n   */\n  getScale(value) {\n    return this.scale;\n  }\n  /**\n   * Sets the blur scale.\n   *\n   * @deprecated Use scale instead.\n   * @param {Number} value - The scale.\n   */\n  setScale(value) {\n    this.scale = value;\n  }\n  /**\n   * Generates the blur kernel.\n   *\n   * @private\n   */\n  generateKernel() {\n    const GOLDEN_ANGLE = 2.39996323;\n    const points64 = new Float64Array(128);\n    const points16 = new Float64Array(32);\n    let i64 = 0, i16 = 0;\n    for (let i = 0, sqrt80 = Math.sqrt(80); i < 80; ++i) {\n      const theta = i * GOLDEN_ANGLE;\n      const r = Math.sqrt(i) / sqrt80;\n      const u = r * Math.cos(theta), v3 = r * Math.sin(theta);\n      if (i % 5 === 0) {\n        points16[i16++] = u;\n        points16[i16++] = v3;\n      } else {\n        points64[i64++] = u;\n        points64[i64++] = v3;\n      }\n    }\n    this.uniforms.kernel64.value = points64;\n    this.uniforms.kernel16.value = points16;\n  }\n  /**\n   * Sets the texel size.\n   *\n   * @deprecated Use setSize() instead.\n   * @param {Number} x - The texel width.\n   * @param {Number} y - The texel height.\n   */\n  setTexelSize(x, y) {\n    this.uniforms.texelSize.value.set(x, y);\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/materials/CircleOfConfusionMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking3, NoBlending as NoBlending7, PerspectiveCamera, ShaderMaterial as ShaderMaterial8, Uniform as Uniform13 } from \"three\";\n\n// src/utils/orthographicDepthToViewZ.js\nfunction orthographicDepthToViewZ(depth, near, far) {\n  return depth * (near - far) - near;\n}\n\n// src/utils/viewZToOrthographicDepth.js\nfunction viewZToOrthographicDepth(viewZ, near, far) {\n  return Math.min(Math.max((viewZ + near) / (near - far), 0), 1);\n}\n\n// src/materials/glsl/circle-of-confusion.frag\nvar circle_of_confusion_default = \"#include <common>\\n#include <packing>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nuniform float focusDistance;uniform float focusRange;uniform float cameraNear;uniform float cameraFar;varying vec2 vUv;float readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nfloat depth=unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nfloat depth=texture2D(depthBuffer,uv).r;\\n#endif\\n#ifdef LOG_DEPTH\\nfloat d=pow(2.0,depth*log2(cameraFar+1.0))-1.0;float a=cameraFar/(cameraFar-cameraNear);float b=cameraFar*cameraNear/(cameraNear-cameraFar);depth=a+b/d;\\n#endif\\nreturn depth;}void main(){float depth=readDepth(vUv);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(depth,cameraNear,cameraFar);float linearDepth=viewZToOrthographicDepth(viewZ,cameraNear,cameraFar);\\n#else\\nfloat linearDepth=depth;\\n#endif\\nfloat signedDistance=linearDepth-focusDistance;float magnitude=smoothstep(0.0,focusRange,abs(signedDistance));gl_FragColor.rg=magnitude*vec2(step(signedDistance,0.0),step(0.0,signedDistance));}\";\n\n// src/materials/CircleOfConfusionMaterial.js\nvar CircleOfConfusionMaterial = class extends ShaderMaterial8 {\n  /**\n   * Constructs a new CoC material.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  constructor(camera) {\n    super({\n      name: \"CircleOfConfusionMaterial\",\n      defines: {\n        DEPTH_PACKING: \"0\"\n      },\n      uniforms: {\n        depthBuffer: new Uniform13(null),\n        focusDistance: new Uniform13(0),\n        focusRange: new Uniform13(0),\n        cameraNear: new Uniform13(0.3),\n        cameraFar: new Uniform13(1e3)\n      },\n      blending: NoBlending7,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: circle_of_confusion_default,\n      vertexShader: common_default\n    });\n    this.uniforms.focalLength = this.uniforms.focusRange;\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * The current near plane setting.\n   *\n   * @type {Number}\n   * @private\n   */\n  get near() {\n    return this.uniforms.cameraNear.value;\n  }\n  /**\n   * The current far plane setting.\n   *\n   * @type {Number}\n   * @private\n   */\n  get far() {\n    return this.uniforms.cameraFar.value;\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer.\n   *\n   * @deprecated Use depthBuffer and depthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = BasicDepthPacking3) {\n    this.depthBuffer = buffer;\n    this.depthPacking = depthPacking;\n  }\n  /**\n   * The focus distance. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get focusDistance() {\n    return this.uniforms.focusDistance.value;\n  }\n  set focusDistance(value) {\n    this.uniforms.focusDistance.value = value;\n  }\n  /**\n   * The focus distance in world units.\n   *\n   * @type {Number}\n   */\n  get worldFocusDistance() {\n    return -orthographicDepthToViewZ(this.focusDistance, this.near, this.far);\n  }\n  set worldFocusDistance(value) {\n    this.focusDistance = viewZToOrthographicDepth(-value, this.near, this.far);\n  }\n  /**\n   * Returns the focus distance.\n   *\n   * @deprecated Use focusDistance instead.\n   * @return {Number} The focus distance.\n   */\n  getFocusDistance(value) {\n    this.uniforms.focusDistance.value = value;\n  }\n  /**\n   * Sets the focus distance.\n   *\n   * @deprecated Use focusDistance instead.\n   * @param {Number} value - The focus distance.\n   */\n  setFocusDistance(value) {\n    this.uniforms.focusDistance.value = value;\n  }\n  /**\n   * The focal length.\n   *\n   * @deprecated Renamed to focusRange.\n   * @type {Number}\n   */\n  get focalLength() {\n    return this.focusRange;\n  }\n  set focalLength(value) {\n    this.focusRange = value;\n  }\n  /**\n   * The focus range. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get focusRange() {\n    return this.uniforms.focusRange.value;\n  }\n  set focusRange(value) {\n    this.uniforms.focusRange.value = value;\n  }\n  /**\n   * The focus range in world units.\n   *\n   * @type {Number}\n   */\n  get worldFocusRange() {\n    return -orthographicDepthToViewZ(this.focusRange, this.near, this.far);\n  }\n  set worldFocusRange(value) {\n    this.focusRange = viewZToOrthographicDepth(-value, this.near, this.far);\n  }\n  /**\n   * Returns the focal length.\n   *\n   * @deprecated Use focusRange instead.\n   * @return {Number} The focal length.\n   */\n  getFocalLength(value) {\n    return this.focusRange;\n  }\n  /**\n   * Sets the focal length.\n   *\n   * @deprecated Use focusRange instead.\n   * @param {Number} value - The focal length.\n   */\n  setFocalLength(value) {\n    this.focusRange = value;\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @deprecated Use copyCameraSettings instead.\n   * @param {Camera} camera - A camera.\n   */\n  adoptCameraSettings(camera) {\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  copyCameraSettings(camera) {\n    if (camera) {\n      this.uniforms.cameraNear.value = camera.near;\n      this.uniforms.cameraFar.value = camera.far;\n      if (camera instanceof PerspectiveCamera) {\n        this.defines.PERSPECTIVE_CAMERA = \"1\";\n      } else {\n        delete this.defines.PERSPECTIVE_CAMERA;\n      }\n      this.needsUpdate = true;\n    }\n  }\n};\n\n// src/materials/MaskMaterial.js\nimport { NoBlending as NoBlending8, ShaderMaterial as ShaderMaterial9, Uniform as Uniform14, UnsignedByteType as UnsignedByteType6 } from \"three\";\n\n// src/materials/glsl/mask.frag\nvar mask_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#ifdef MASK_PRECISION_HIGH\\nuniform mediump sampler2D maskTexture;\\n#else\\nuniform lowp sampler2D maskTexture;\\n#endif\\n#if MASK_FUNCTION != 0\\nuniform float strength;\\n#endif\\nvarying vec2 vUv;void main(){\\n#if COLOR_CHANNEL == 0\\nfloat mask=texture2D(maskTexture,vUv).r;\\n#elif COLOR_CHANNEL == 1\\nfloat mask=texture2D(maskTexture,vUv).g;\\n#elif COLOR_CHANNEL == 2\\nfloat mask=texture2D(maskTexture,vUv).b;\\n#else\\nfloat mask=texture2D(maskTexture,vUv).a;\\n#endif\\n#if MASK_FUNCTION == 0\\n#ifdef INVERTED\\nmask=step(mask,0.0);\\n#else\\nmask=1.0-step(mask,0.0);\\n#endif\\n#else\\nmask=clamp(mask*strength,0.0,1.0);\\n#ifdef INVERTED\\nmask=1.0-mask;\\n#endif\\n#endif\\n#if MASK_FUNCTION == 3\\nvec4 texel=texture2D(inputBuffer,vUv);gl_FragColor=vec4(mask*texel.rgb,texel.a);\\n#elif MASK_FUNCTION == 2\\ngl_FragColor=vec4(mask*texture2D(inputBuffer,vUv).rgb,mask);\\n#else\\ngl_FragColor=mask*texture2D(inputBuffer,vUv);\\n#endif\\n}\";\n\n// src/materials/MaskMaterial.js\nvar MaskMaterial = class extends ShaderMaterial9 {\n  /**\n   * Constructs a new mask material.\n   *\n   * @param {Texture} [maskTexture] - The mask texture.\n   */\n  constructor(maskTexture = null) {\n    super({\n      name: \"MaskMaterial\",\n      uniforms: {\n        maskTexture: new Uniform14(maskTexture),\n        inputBuffer: new Uniform14(null),\n        strength: new Uniform14(1)\n      },\n      blending: NoBlending8,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: mask_default,\n      vertexShader: common_default\n    });\n    this.colorChannel = ColorChannel.RED;\n    this.maskFunction = MaskFunction.DISCARD;\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The mask texture.\n   *\n   * @type {Texture}\n   */\n  set maskTexture(value) {\n    this.uniforms.maskTexture.value = value;\n    delete this.defines.MASK_PRECISION_HIGH;\n    if (value.type !== UnsignedByteType6) {\n      this.defines.MASK_PRECISION_HIGH = \"1\";\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the mask texture.\n   *\n   * @deprecated Use maskTexture instead.\n   * @param {Texture} value - The texture.\n   */\n  setMaskTexture(value) {\n    this.maskTexture = value;\n  }\n  /**\n   * Sets the color channel to use for masking. Default is `ColorChannel.RED`.\n   *\n   * @type {ColorChannel}\n   */\n  set colorChannel(value) {\n    this.defines.COLOR_CHANNEL = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the color channel to use for masking. Default is `ColorChannel.RED`.\n   *\n   * @deprecated Use colorChannel instead.\n   * @param {ColorChannel} value - The channel.\n   */\n  setColorChannel(value) {\n    this.colorChannel = value;\n  }\n  /**\n   * The masking technique. Default is `MaskFunction.DISCARD`.\n   *\n   * @type {MaskFunction}\n   */\n  set maskFunction(value) {\n    this.defines.MASK_FUNCTION = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the masking technique. Default is `MaskFunction.DISCARD`.\n   *\n   * @deprecated Use maskFunction instead.\n   * @param {MaskFunction} value - The function.\n   */\n  setMaskFunction(value) {\n    this.maskFunction = value;\n  }\n  /**\n   * Indicates whether the masking is inverted.\n   *\n   * @type {Boolean}\n   */\n  get inverted() {\n    return this.defines.INVERTED !== void 0;\n  }\n  set inverted(value) {\n    if (this.inverted && !value) {\n      delete this.defines.INVERTED;\n    } else if (value) {\n      this.defines.INVERTED = \"1\";\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Indicates whether the masking is inverted.\n   *\n   * @deprecated Use inverted instead.\n   * @return {Boolean} Whether the masking is inverted.\n   */\n  isInverted() {\n    return this.inverted;\n  }\n  /**\n   * Determines whether the masking should be inverted.\n   *\n   * @deprecated Use inverted instead.\n   * @param {Boolean} value - Whether the masking should be inverted.\n   */\n  setInverted(value) {\n    this.inverted = value;\n  }\n  /**\n   * The current mask strength.\n   *\n   * Individual mask values will be clamped to [0.0, 1.0]. Has no effect when the mask function is set to `DISCARD`.\n   *\n   * @type {Number}\n   */\n  get strength() {\n    return this.uniforms.strength.value;\n  }\n  set strength(value) {\n    this.uniforms.strength.value = value;\n  }\n  /**\n   * Returns the current mask strength.\n   *\n   * @deprecated Use strength instead.\n   * @return {Number} The mask strength.\n   */\n  getStrength() {\n    return this.strength;\n  }\n  /**\n   * Sets the mask strength.\n   *\n   * Has no effect when the mask function is set to `DISCARD`.\n   *\n   * @deprecated Use strength instead.\n   * @param {Number} value - The mask strength.\n   */\n  setStrength(value) {\n    this.strength = value;\n  }\n};\n\n// src/passes/ShaderPass.js\nimport { UnsignedByteType as UnsignedByteType7 } from \"three\";\nvar ShaderPass = class extends Pass {\n  /**\n   * Constructs a new shader pass.\n   *\n   * @param {ShaderMaterial} material - A shader material.\n   * @param {String} [input=\"inputBuffer\"] - The name of the input buffer uniform.\n   */\n  constructor(material, input = \"inputBuffer\") {\n    super(\"ShaderPass\");\n    this.fullscreenMaterial = material;\n    this.input = input;\n  }\n  /**\n   * Sets the name of the input buffer uniform.\n   *\n   * @param {String} input - The name of the input buffer uniform.\n   * @deprecated Use input instead.\n   */\n  setInput(input) {\n    this.input = input;\n  }\n  /**\n   * Renders the effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const uniforms = this.fullscreenMaterial.uniforms;\n    if (inputBuffer !== null && uniforms !== void 0 && uniforms[this.input] !== void 0) {\n      uniforms[this.input].value = inputBuffer.texture;\n    }\n    renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n    renderer.render(this.scene, this.camera);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - A renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (frameBufferType !== void 0 && frameBufferType !== UnsignedByteType7) {\n      this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n    }\n  }\n};\n\n// src/effects/glsl/depth-of-field.frag\nvar depth_of_field_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D nearColorBuffer;uniform mediump sampler2D farColorBuffer;\\n#else\\nuniform lowp sampler2D nearColorBuffer;uniform lowp sampler2D farColorBuffer;\\n#endif\\nuniform lowp sampler2D nearCoCBuffer;uniform lowp sampler2D farCoCBuffer;uniform float scale;void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){vec4 colorNear=texture2D(nearColorBuffer,uv);vec4 colorFar=texture2D(farColorBuffer,uv);\\n#if MASK_FUNCTION == 1\\nvec2 cocNearFar=vec2(texture2D(nearCoCBuffer,uv).r,colorFar.a);cocNearFar.x=min(cocNearFar.x*scale,1.0);\\n#else\\nvec2 cocNearFar=vec2(texture2D(nearCoCBuffer,uv).r,texture2D(farCoCBuffer,uv).g);cocNearFar=min(cocNearFar*scale,1.0);\\n#endif\\nvec4 result=inputColor*(1.0-cocNearFar.y)+colorFar;result=mix(result,colorNear,cocNearFar.x);outputColor=result;}\";\n\n// src/effects/DepthOfFieldEffect.js\nvar DepthOfFieldEffect = class extends Effect {\n  /**\n   * Constructs a new depth of field effect.\n   *\n   * @param {Camera} camera - The main camera.\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.worldFocusDistance] - The focus distance in world units.\n   * @param {Number} [options.worldFocusRange] - The focus distance in world units.\n   * @param {Number} [options.focusDistance=0.0] - The normalized focus distance. Range is [0.0, 1.0].\n   * @param {Number} [options.focusRange=0.1] - The focus range. Range is [0.0, 1.0].\n   * @param {Number} [options.focalLength=0.1] - Deprecated.\n   * @param {Number} [options.bokehScale=1.0] - The scale of the bokeh blur.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor(camera, {\n    blendFunction,\n    worldFocusDistance,\n    worldFocusRange,\n    focusDistance = 0,\n    focalLength = 0.1,\n    focusRange = focalLength,\n    bokehScale = 1,\n    resolutionScale = 1,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"DepthOfFieldEffect\", depth_of_field_default, {\n      blendFunction,\n      attributes: EffectAttribute.DEPTH,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"nearColorBuffer\", new Uniform15(null)],\n        [\"farColorBuffer\", new Uniform15(null)],\n        [\"nearCoCBuffer\", new Uniform15(null)],\n        [\"farCoCBuffer\", new Uniform15(null)],\n        [\"scale\", new Uniform15(1)]\n      ])\n    });\n    this.camera = camera;\n    this.renderTarget = new WebGLRenderTarget9(1, 1, { depthBuffer: false });\n    this.renderTarget.texture.name = \"DoF.Intermediate\";\n    this.renderTargetMasked = this.renderTarget.clone();\n    this.renderTargetMasked.texture.name = \"DoF.Masked.Far\";\n    this.renderTargetNear = this.renderTarget.clone();\n    this.renderTargetNear.texture.name = \"DoF.Bokeh.Near\";\n    this.uniforms.get(\"nearColorBuffer\").value = this.renderTargetNear.texture;\n    this.renderTargetFar = this.renderTarget.clone();\n    this.renderTargetFar.texture.name = \"DoF.Bokeh.Far\";\n    this.uniforms.get(\"farColorBuffer\").value = this.renderTargetFar.texture;\n    this.renderTargetCoC = this.renderTarget.clone();\n    this.renderTargetCoC.texture.name = \"DoF.CoC\";\n    this.uniforms.get(\"farCoCBuffer\").value = this.renderTargetCoC.texture;\n    this.renderTargetCoCBlurred = this.renderTargetCoC.clone();\n    this.renderTargetCoCBlurred.texture.name = \"DoF.CoC.Blurred\";\n    this.uniforms.get(\"nearCoCBuffer\").value = this.renderTargetCoCBlurred.texture;\n    this.cocPass = new ShaderPass(new CircleOfConfusionMaterial(camera));\n    const cocMaterial = this.cocMaterial;\n    cocMaterial.focusDistance = focusDistance;\n    cocMaterial.focusRange = focusRange;\n    if (worldFocusDistance !== void 0) {\n      cocMaterial.worldFocusDistance = worldFocusDistance;\n    }\n    if (worldFocusRange !== void 0) {\n      cocMaterial.worldFocusRange = worldFocusRange;\n    }\n    this.blurPass = new KawaseBlurPass({ resolutionScale, resolutionX, resolutionY, kernelSize: KernelSize.MEDIUM });\n    this.maskPass = new ShaderPass(new MaskMaterial(this.renderTargetCoC.texture));\n    const maskMaterial = this.maskPass.fullscreenMaterial;\n    maskMaterial.colorChannel = ColorChannel.GREEN;\n    this.maskFunction = MaskFunction.MULTIPLY_RGB;\n    this.bokehNearBasePass = new ShaderPass(new BokehMaterial(false, true));\n    this.bokehNearBasePass.fullscreenMaterial.cocBuffer = this.renderTargetCoCBlurred.texture;\n    this.bokehNearFillPass = new ShaderPass(new BokehMaterial(true, true));\n    this.bokehNearFillPass.fullscreenMaterial.cocBuffer = this.renderTargetCoCBlurred.texture;\n    this.bokehFarBasePass = new ShaderPass(new BokehMaterial(false, false));\n    this.bokehFarBasePass.fullscreenMaterial.cocBuffer = this.renderTargetCoC.texture;\n    this.bokehFarFillPass = new ShaderPass(new BokehMaterial(true, false));\n    this.bokehFarFillPass.fullscreenMaterial.cocBuffer = this.renderTargetCoC.texture;\n    this.target = null;\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this.bokehScale = bokehScale;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n    this.cocMaterial.copyCameraSettings(value);\n  }\n  /**\n   * The circle of confusion texture.\n   *\n   * @type {Texture}\n   */\n  get cocTexture() {\n    return this.renderTargetCoC.texture;\n  }\n  /**\n   * The mask function. Default is `MULTIPLY_RGB`.\n   *\n   * @type {MaskFunction}\n   */\n  get maskFunction() {\n    return this.maskPass.fullscreenMaterial.maskFunction;\n  }\n  set maskFunction(value) {\n    if (this.maskFunction !== value) {\n      this.defines.set(\"MASK_FUNCTION\", value.toFixed(0));\n      this.maskPass.fullscreenMaterial.maskFunction = value;\n      this.setChanged();\n    }\n  }\n  /**\n   * The circle of confusion material.\n   *\n   * @type {CircleOfConfusionMaterial}\n   */\n  get cocMaterial() {\n    return this.cocPass.fullscreenMaterial;\n  }\n  /**\n   * The circle of confusion material.\n   *\n   * @deprecated Use cocMaterial instead.\n   * @type {CircleOfConfusionMaterial}\n   */\n  get circleOfConfusionMaterial() {\n    return this.cocMaterial;\n  }\n  /**\n   * Returns the circle of confusion material.\n   *\n   * @deprecated Use cocMaterial instead.\n   * @return {CircleOfConfusionMaterial} The material.\n   */\n  getCircleOfConfusionMaterial() {\n    return this.cocMaterial;\n  }\n  /**\n   * Returns the pass that blurs the foreground CoC buffer to soften edges.\n   *\n   * @deprecated Use blurPass instead.\n   * @return {KawaseBlurPass} The blur pass.\n   */\n  getBlurPass() {\n    return this.blurPass;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * The current bokeh scale.\n   *\n   * @type {Number}\n   */\n  get bokehScale() {\n    return this.uniforms.get(\"scale\").value;\n  }\n  set bokehScale(value) {\n    this.bokehNearBasePass.fullscreenMaterial.scale = value;\n    this.bokehNearFillPass.fullscreenMaterial.scale = value;\n    this.bokehFarBasePass.fullscreenMaterial.scale = value;\n    this.bokehFarFillPass.fullscreenMaterial.scale = value;\n    this.maskPass.fullscreenMaterial.strength = value;\n    this.uniforms.get(\"scale\").value = value;\n  }\n  /**\n   * Returns the current bokeh scale.\n   *\n   * @deprecated Use bokehScale instead.\n   * @return {Number} The scale.\n   */\n  getBokehScale() {\n    return this.bokehScale;\n  }\n  /**\n   * Sets the bokeh scale.\n   *\n   * @deprecated Use bokehScale instead.\n   * @param {Number} value - The scale.\n   */\n  setBokehScale(value) {\n    this.bokehScale = value;\n  }\n  /**\n   * Returns the current auto focus target.\n   *\n   * @deprecated Use target instead.\n   * @return {Vector3} The target.\n   */\n  getTarget() {\n    return this.target;\n  }\n  /**\n   * Sets the auto focus target.\n   *\n   * @deprecated Use target instead.\n   * @param {Vector3} value - The target.\n   */\n  setTarget(value) {\n    this.target = value;\n  }\n  /**\n   * Calculates the focus distance from the camera to the given position.\n   *\n   * @param {Vector3} target - The target.\n   * @return {Number} The normalized focus distance.\n   */\n  calculateFocusDistance(target) {\n    const camera = this.camera;\n    const distance = camera.position.distanceTo(target);\n    return viewZToOrthographicDepth(-distance, camera.near, camera.far);\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking4) {\n    this.cocMaterial.depthBuffer = depthTexture;\n    this.cocMaterial.depthPacking = depthPacking;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const renderTarget = this.renderTarget;\n    const renderTargetCoC = this.renderTargetCoC;\n    const renderTargetCoCBlurred = this.renderTargetCoCBlurred;\n    const renderTargetMasked = this.renderTargetMasked;\n    if (this.target !== null) {\n      const distance = this.calculateFocusDistance(this.target);\n      this.cocMaterial.focusDistance = distance;\n    }\n    this.cocPass.render(renderer, null, renderTargetCoC);\n    this.blurPass.render(renderer, renderTargetCoC, renderTargetCoCBlurred);\n    this.maskPass.render(renderer, inputBuffer, renderTargetMasked);\n    this.bokehFarBasePass.render(renderer, renderTargetMasked, renderTarget);\n    this.bokehFarFillPass.render(renderer, renderTarget, this.renderTargetFar);\n    this.bokehNearBasePass.render(renderer, inputBuffer, renderTarget);\n    this.bokehNearFillPass.render(renderer, renderTarget, this.renderTargetNear);\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.cocPass.setSize(width, height);\n    this.blurPass.setSize(width, height);\n    this.maskPass.setSize(width, height);\n    this.renderTargetFar.setSize(width, height);\n    this.renderTargetCoC.setSize(width, height);\n    this.renderTargetMasked.setSize(width, height);\n    this.renderTarget.setSize(w, h);\n    this.renderTargetNear.setSize(w, h);\n    this.renderTargetCoCBlurred.setSize(w, h);\n    this.bokehNearBasePass.fullscreenMaterial.setSize(width, height);\n    this.bokehNearFillPass.fullscreenMaterial.setSize(width, height);\n    this.bokehFarBasePass.fullscreenMaterial.setSize(width, height);\n    this.bokehFarFillPass.fullscreenMaterial.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.cocPass.initialize(renderer, alpha, frameBufferType);\n    this.maskPass.initialize(renderer, alpha, frameBufferType);\n    this.bokehNearBasePass.initialize(renderer, alpha, frameBufferType);\n    this.bokehNearFillPass.initialize(renderer, alpha, frameBufferType);\n    this.bokehFarBasePass.initialize(renderer, alpha, frameBufferType);\n    this.bokehFarFillPass.initialize(renderer, alpha, frameBufferType);\n    this.blurPass.initialize(renderer, alpha, UnsignedByteType8);\n    if (renderer.capabilities.logarithmicDepthBuffer) {\n      this.cocPass.fullscreenMaterial.defines.LOG_DEPTH = \"1\";\n    }\n    if (frameBufferType !== void 0) {\n      this.renderTarget.texture.type = frameBufferType;\n      this.renderTargetNear.texture.type = frameBufferType;\n      this.renderTargetFar.texture.type = frameBufferType;\n      this.renderTargetMasked.texture.type = frameBufferType;\n      if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace7) {\n        this.renderTarget.texture.colorSpace = SRGBColorSpace7;\n        this.renderTargetNear.texture.colorSpace = SRGBColorSpace7;\n        this.renderTargetFar.texture.colorSpace = SRGBColorSpace7;\n        this.renderTargetMasked.texture.colorSpace = SRGBColorSpace7;\n      }\n    }\n  }\n};\n\n// src/effects/DotScreenEffect.js\nimport { Uniform as Uniform16, Vector2 as Vector28 } from \"three\";\n\n// src/effects/glsl/dot-screen.frag\nvar dot_screen_default = \"uniform vec2 angle;uniform float scale;float pattern(const in vec2 uv){vec2 point=scale*vec2(dot(angle.yx,vec2(uv.x,-uv.y)),dot(angle,uv));return(sin(point.x)*sin(point.y))*4.0;}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=vec3(inputColor.rgb*10.0-5.0+pattern(uv*resolution));outputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/DotScreenEffect.js\nvar DotScreenEffect = class extends Effect {\n  /**\n   * Constructs a new dot screen effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.angle=1.57] - The angle of the dot pattern.\n   * @param {Number} [options.scale=1.0] - The scale of the dot pattern.\n   */\n  constructor({ blendFunction, angle = Math.PI * 0.5, scale = 1 } = {}) {\n    super(\"DotScreenEffect\", dot_screen_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"angle\", new Uniform16(new Vector28())],\n        [\"scale\", new Uniform16(scale)]\n      ])\n    });\n    this.angle = angle;\n  }\n  /**\n   * The angle.\n   *\n   * @type {Number}\n   */\n  get angle() {\n    return Math.acos(this.uniforms.get(\"angle\").value.y);\n  }\n  set angle(value) {\n    this.uniforms.get(\"angle\").value.set(Math.sin(value), Math.cos(value));\n  }\n  /**\n   * Returns the pattern angle.\n   *\n   * @deprecated Use angle instead.\n   * @return {Number} The angle in radians.\n   */\n  getAngle() {\n    return this.angle;\n  }\n  /**\n   * Sets the pattern angle.\n   *\n   * @deprecated Use angle instead.\n   * @param {Number} value - The angle in radians.\n   */\n  setAngle(value) {\n    this.angle = value;\n  }\n  /**\n   * The scale.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.uniforms.get(\"scale\").value;\n  }\n  set scale(value) {\n    this.uniforms.get(\"scale\").value = value;\n  }\n};\n\n// src/effects/glsl/fxaa.frag\nvar fxaa_default = \"#define QUALITY(q) ((q) < 5 ? 1.0 : ((q) > 5 ? ((q) < 10 ? 2.0 : ((q) < 11 ? 4.0 : 8.0)) : 1.5))\\n#define ONE_OVER_TWELVE 0.08333333333333333\\nvarying vec2 vUvDown;varying vec2 vUvUp;varying vec2 vUvLeft;varying vec2 vUvRight;varying vec2 vUvDownLeft;varying vec2 vUvUpRight;varying vec2 vUvUpLeft;varying vec2 vUvDownRight;vec4 fxaa(const in vec4 inputColor,const in vec2 uv){float lumaCenter=luminance(inputColor.rgb);float lumaDown=luminance(texture2D(inputBuffer,vUvDown).rgb);float lumaUp=luminance(texture2D(inputBuffer,vUvUp).rgb);float lumaLeft=luminance(texture2D(inputBuffer,vUvLeft).rgb);float lumaRight=luminance(texture2D(inputBuffer,vUvRight).rgb);float lumaMin=min(lumaCenter,min(min(lumaDown,lumaUp),min(lumaLeft,lumaRight)));float lumaMax=max(lumaCenter,max(max(lumaDown,lumaUp),max(lumaLeft,lumaRight)));float lumaRange=lumaMax-lumaMin;if(lumaRange<max(EDGE_THRESHOLD_MIN,lumaMax*EDGE_THRESHOLD_MAX)){return inputColor;}float lumaDownLeft=luminance(texture2D(inputBuffer,vUvDownLeft).rgb);float lumaUpRight=luminance(texture2D(inputBuffer,vUvUpRight).rgb);float lumaUpLeft=luminance(texture2D(inputBuffer,vUvUpLeft).rgb);float lumaDownRight=luminance(texture2D(inputBuffer,vUvDownRight).rgb);float lumaDownUp=lumaDown+lumaUp;float lumaLeftRight=lumaLeft+lumaRight;float lumaLeftCorners=lumaDownLeft+lumaUpLeft;float lumaDownCorners=lumaDownLeft+lumaDownRight;float lumaRightCorners=lumaDownRight+lumaUpRight;float lumaUpCorners=lumaUpRight+lumaUpLeft;float edgeHorizontal=(abs(-2.0*lumaLeft+lumaLeftCorners)+abs(-2.0*lumaCenter+lumaDownUp)*2.0+abs(-2.0*lumaRight+lumaRightCorners));float edgeVertical=(abs(-2.0*lumaUp+lumaUpCorners)+abs(-2.0*lumaCenter+lumaLeftRight)*2.0+abs(-2.0*lumaDown+lumaDownCorners));bool isHorizontal=(edgeHorizontal>=edgeVertical);float stepLength=isHorizontal?texelSize.y:texelSize.x;float luma1=isHorizontal?lumaDown:lumaLeft;float luma2=isHorizontal?lumaUp:lumaRight;float gradient1=abs(luma1-lumaCenter);float gradient2=abs(luma2-lumaCenter);bool is1Steepest=gradient1>=gradient2;float gradientScaled=0.25*max(gradient1,gradient2);float lumaLocalAverage=0.0;if(is1Steepest){stepLength=-stepLength;lumaLocalAverage=0.5*(luma1+lumaCenter);}else{lumaLocalAverage=0.5*(luma2+lumaCenter);}vec2 currentUv=uv;if(isHorizontal){currentUv.y+=stepLength*0.5;}else{currentUv.x+=stepLength*0.5;}vec2 offset=isHorizontal?vec2(texelSize.x,0.0):vec2(0.0,texelSize.y);vec2 uv1=currentUv-offset*QUALITY(0);vec2 uv2=currentUv+offset*QUALITY(0);float lumaEnd1=luminance(texture2D(inputBuffer,uv1).rgb);float lumaEnd2=luminance(texture2D(inputBuffer,uv2).rgb);lumaEnd1-=lumaLocalAverage;lumaEnd2-=lumaLocalAverage;bool reached1=abs(lumaEnd1)>=gradientScaled;bool reached2=abs(lumaEnd2)>=gradientScaled;bool reachedBoth=reached1&&reached2;if(!reached1){uv1-=offset*QUALITY(1);}if(!reached2){uv2+=offset*QUALITY(1);}if(!reachedBoth){for(int i=2;i<SAMPLES;++i){if(!reached1){lumaEnd1=luminance(texture2D(inputBuffer,uv1).rgb);lumaEnd1=lumaEnd1-lumaLocalAverage;}if(!reached2){lumaEnd2=luminance(texture2D(inputBuffer,uv2).rgb);lumaEnd2=lumaEnd2-lumaLocalAverage;}reached1=abs(lumaEnd1)>=gradientScaled;reached2=abs(lumaEnd2)>=gradientScaled;reachedBoth=reached1&&reached2;if(!reached1){uv1-=offset*QUALITY(i);}if(!reached2){uv2+=offset*QUALITY(i);}if(reachedBoth){break;}}}float distance1=isHorizontal?(uv.x-uv1.x):(uv.y-uv1.y);float distance2=isHorizontal?(uv2.x-uv.x):(uv2.y-uv.y);bool isDirection1=distance1<distance2;float distanceFinal=min(distance1,distance2);float edgeThickness=(distance1+distance2);bool isLumaCenterSmaller=lumaCenter<lumaLocalAverage;bool correctVariation1=(lumaEnd1<0.0)!=isLumaCenterSmaller;bool correctVariation2=(lumaEnd2<0.0)!=isLumaCenterSmaller;bool correctVariation=isDirection1?correctVariation1:correctVariation2;float pixelOffset=-distanceFinal/edgeThickness+0.5;float finalOffset=correctVariation?pixelOffset:0.0;float lumaAverage=ONE_OVER_TWELVE*(2.0*(lumaDownUp+lumaLeftRight)+lumaLeftCorners+lumaRightCorners);float subPixelOffset1=clamp(abs(lumaAverage-lumaCenter)/lumaRange,0.0,1.0);float subPixelOffset2=(-2.0*subPixelOffset1+3.0)*subPixelOffset1*subPixelOffset1;float subPixelOffsetFinal=subPixelOffset2*subPixelOffset2*SUBPIXEL_QUALITY;finalOffset=max(finalOffset,subPixelOffsetFinal);vec2 finalUv=uv;if(isHorizontal){finalUv.y+=finalOffset*stepLength;}else{finalUv.x+=finalOffset*stepLength;}return texture2D(inputBuffer,finalUv);}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=fxaa(inputColor,uv);}\";\n\n// src/effects/glsl/fxaa.vert\nvar fxaa_default2 = \"varying vec2 vUvDown;varying vec2 vUvUp;varying vec2 vUvLeft;varying vec2 vUvRight;varying vec2 vUvDownLeft;varying vec2 vUvUpRight;varying vec2 vUvUpLeft;varying vec2 vUvDownRight;void mainSupport(const in vec2 uv){vUvDown=uv+vec2(0.0,-1.0)*texelSize;vUvUp=uv+vec2(0.0,1.0)*texelSize;vUvRight=uv+vec2(1.0,0.0)*texelSize;vUvLeft=uv+vec2(-1.0,0.0)*texelSize;vUvDownLeft=uv+vec2(-1.0,-1.0)*texelSize;vUvUpRight=uv+vec2(1.0,1.0)*texelSize;vUvUpLeft=uv+vec2(-1.0,1.0)*texelSize;vUvDownRight=uv+vec2(1.0,-1.0)*texelSize;}\";\n\n// src/effects/FXAAEffect.js\nvar FXAAEffect = class extends Effect {\n  /**\n   * Constructs a new FXAA effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   */\n  constructor({ blendFunction = BlendFunction.SRC } = {}) {\n    super(\"FXAAEffect\", fxaa_default, {\n      vertexShader: fxaa_default2,\n      blendFunction,\n      defines: /* @__PURE__ */ new Map([\n        [\"EDGE_THRESHOLD_MIN\", \"0.0312\"],\n        [\"EDGE_THRESHOLD_MAX\", \"0.125\"],\n        [\"SUBPIXEL_QUALITY\", \"0.75\"],\n        [\"SAMPLES\", \"12\"]\n      ])\n    });\n  }\n  /**\n   * The minimum edge detection threshold. Range is [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get minEdgeThreshold() {\n    return Number(this.defines.get(\"EDGE_THRESHOLD_MIN\"));\n  }\n  set minEdgeThreshold(value) {\n    this.defines.set(\"EDGE_THRESHOLD_MIN\", value.toFixed(12));\n    this.setChanged();\n  }\n  /**\n   * The maximum edge detection threshold. Range is [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get maxEdgeThreshold() {\n    return Number(this.defines.get(\"EDGE_THRESHOLD_MAX\"));\n  }\n  set maxEdgeThreshold(value) {\n    this.defines.set(\"EDGE_THRESHOLD_MAX\", value.toFixed(12));\n    this.setChanged();\n  }\n  /**\n   * The subpixel blend quality. Range is [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get subpixelQuality() {\n    return Number(this.defines.get(\"SUBPIXEL_QUALITY\"));\n  }\n  set subpixelQuality(value) {\n    this.defines.set(\"SUBPIXEL_QUALITY\", value.toFixed(12));\n    this.setChanged();\n  }\n  /**\n   * The maximum amount of edge detection samples.\n   *\n   * @type {Number}\n   */\n  get samples() {\n    return Number(this.defines.get(\"SAMPLES\"));\n  }\n  set samples(value) {\n    this.defines.set(\"SAMPLES\", value.toFixed(0));\n    this.setChanged();\n  }\n};\n\n// src/effects/GammaCorrectionEffect.js\nimport { Uniform as Uniform17 } from \"three\";\n\n// src/effects/glsl/gamma-correction.frag\nvar gamma_correction_default = \"uniform float gamma;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=LinearToGamma(max(inputColor,0.0),gamma);}\";\n\n// src/effects/GammaCorrectionEffect.js\nvar GammaCorrectionEffect = class extends Effect {\n  /**\n   * Constructs a new gamma correction effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {Number} [options.gamma=2.0] - The gamma factor.\n   */\n  constructor({ blendFunction = BlendFunction.SRC, gamma = 2 } = {}) {\n    super(\"GammaCorrectionEffect\", gamma_correction_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"gamma\", new Uniform17(gamma)]\n      ])\n    });\n  }\n};\n\n// src/effects/GlitchEffect.js\nimport { NearestFilter, RepeatWrapping, RGBAFormat as RGBAFormat2, Uniform as Uniform18, Vector2 as Vector29 } from \"three\";\n\n// src/enums/GlitchMode.js\nvar GlitchMode = {\n  DISABLED: 0,\n  SPORADIC: 1,\n  CONSTANT_MILD: 2,\n  CONSTANT_WILD: 3\n};\n\n// src/textures/NoiseTexture.js\nimport {\n  DataTexture,\n  LuminanceFormat,\n  RedFormat,\n  RGFormat,\n  RGBAFormat,\n  UnsignedByteType as UnsignedByteType9\n} from \"three\";\nfunction getNoise(size, format, type) {\n  const channels = /* @__PURE__ */ new Map([\n    [LuminanceFormat, 1],\n    [RedFormat, 1],\n    [RGFormat, 2],\n    [RGBAFormat, 4]\n  ]);\n  let data;\n  if (!channels.has(format)) {\n    console.error(\"Invalid noise texture format\");\n  }\n  if (type === UnsignedByteType9) {\n    data = new Uint8Array(size * channels.get(format));\n    for (let i = 0, l = data.length; i < l; ++i) {\n      data[i] = Math.random() * 255 + 0.5;\n    }\n  } else {\n    data = new Float32Array(size * channels.get(format));\n    for (let i = 0, l = data.length; i < l; ++i) {\n      data[i] = Math.random();\n    }\n  }\n  return data;\n}\nvar NoiseTexture = class extends DataTexture {\n  /**\n   * Constructs a new noise texture.\n   *\n   * The texture format can be either `LuminanceFormat` or `RGBAFormat`. Additionally, the formats `RedFormat` and\n   * `RGFormat` can be used in a WebGL 2 context.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   * @param {Number} [format=LuminanceFormat] - The texture format.\n   * @param {Number} [type=UnsignedByteType] - The texture type.\n   */\n  constructor(width, height, format = LuminanceFormat, type = UnsignedByteType9) {\n    super(getNoise(width * height, format, type), width, height, format, type);\n    this.needsUpdate = true;\n  }\n};\n\n// src/effects/glsl/glitch.frag\nvar glitch_default = \"uniform lowp sampler2D perturbationMap;uniform bool active;uniform float columns;uniform float random;uniform vec2 seeds;uniform vec2 distortion;void mainUv(inout vec2 uv){if(active){if(uv.y<distortion.x+columns&&uv.y>distortion.x-columns*random){float sx=clamp(ceil(seeds.x),0.0,1.0);uv.y=sx*(1.0-(uv.y+distortion.y))+(1.0-sx)*distortion.y;}if(uv.x<distortion.y+columns&&uv.x>distortion.y-columns*random){float sy=clamp(ceil(seeds.y),0.0,1.0);uv.x=sy*distortion.x+(1.0-sy)*(1.0-(uv.x+distortion.x));}vec2 normal=texture2D(perturbationMap,uv*random*random).rg;uv+=normal*seeds*(random*0.2);}}\";\n\n// src/effects/GlitchEffect.js\nvar textureTag = \"Glitch.Generated\";\nfunction randomFloat(low, high) {\n  return low + Math.random() * (high - low);\n}\nvar GlitchEffect = class extends Effect {\n  /**\n   * Constructs a new glitch effect.\n   *\n   * TODO Change ratio to 0.15.\n   * @param {Object} [options] - The options.\n   * @param {Vector2} [options.chromaticAberrationOffset] - A chromatic aberration offset. If provided, the glitch effect will influence this offset.\n   * @param {Vector2} [options.delay] - The minimum and maximum delay between glitch activations in seconds.\n   * @param {Vector2} [options.duration] - The minimum and maximum duration of a glitch in seconds.\n   * @param {Vector2} [options.strength] - The strength of weak and strong glitches.\n   * @param {Texture} [options.perturbationMap] - A perturbation map. If none is provided, a noise texture will be created.\n   * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided.\n   * @param {Number} [options.columns=0.05] - The scale of the blocky glitch columns.\n   * @param {Number} [options.ratio=0.85] - The threshold for strong glitches.\n   */\n  constructor({\n    chromaticAberrationOffset = null,\n    delay = new Vector29(1.5, 3.5),\n    duration = new Vector29(0.6, 1),\n    strength = new Vector29(0.3, 1),\n    columns = 0.05,\n    ratio = 0.85,\n    perturbationMap = null,\n    dtSize = 64\n  } = {}) {\n    super(\"GlitchEffect\", glitch_default, {\n      uniforms: /* @__PURE__ */ new Map([\n        [\"perturbationMap\", new Uniform18(null)],\n        [\"columns\", new Uniform18(columns)],\n        [\"active\", new Uniform18(false)],\n        [\"random\", new Uniform18(1)],\n        [\"seeds\", new Uniform18(new Vector29())],\n        [\"distortion\", new Uniform18(new Vector29())]\n      ])\n    });\n    if (perturbationMap === null) {\n      const map = new NoiseTexture(dtSize, dtSize, RGBAFormat2);\n      map.name = textureTag;\n      this.perturbationMap = map;\n    } else {\n      this.perturbationMap = perturbationMap;\n    }\n    this.time = 0;\n    this.distortion = this.uniforms.get(\"distortion\").value;\n    this.delay = delay;\n    this.duration = duration;\n    this.breakPoint = new Vector29(\n      randomFloat(this.delay.x, this.delay.y),\n      randomFloat(this.duration.x, this.duration.y)\n    );\n    this.strength = strength;\n    this.mode = GlitchMode.SPORADIC;\n    this.ratio = ratio;\n    this.chromaticAberrationOffset = chromaticAberrationOffset;\n  }\n  /**\n   * Random number seeds.\n   *\n   * @type {Vector2}\n   * @private\n   */\n  get seeds() {\n    return this.uniforms.get(\"seeds\").value;\n  }\n  /**\n   * Indicates whether the glitch effect is currently active.\n   *\n   * @type {Boolean}\n   */\n  get active() {\n    return this.uniforms.get(\"active\").value;\n  }\n  /**\n   * Indicates whether the glitch effect is currently active.\n   *\n   * @deprecated Use active instead.\n   * @return {Boolean} Whether the glitch effect is active.\n   */\n  isActive() {\n    return this.active;\n  }\n  /**\n   * The minimum delay between glitch activations.\n   *\n   * @type {Number}\n   */\n  get minDelay() {\n    return this.delay.x;\n  }\n  set minDelay(value) {\n    this.delay.x = value;\n  }\n  /**\n   * Returns the minimum delay between glitch activations.\n   *\n   * @deprecated Use minDelay instead.\n   * @return {Number} The minimum delay in seconds.\n   */\n  getMinDelay() {\n    return this.delay.x;\n  }\n  /**\n   * Sets the minimum delay between glitch activations.\n   *\n   * @deprecated Use minDelay instead.\n   * @param {Number} value - The minimum delay in seconds.\n   */\n  setMinDelay(value) {\n    this.delay.x = value;\n  }\n  /**\n   * The maximum delay between glitch activations.\n   *\n   * @type {Number}\n   */\n  get maxDelay() {\n    return this.delay.y;\n  }\n  set maxDelay(value) {\n    this.delay.y = value;\n  }\n  /**\n   * Returns the maximum delay between glitch activations.\n   *\n   * @deprecated Use maxDelay instead.\n   * @return {Number} The maximum delay in seconds.\n   */\n  getMaxDelay() {\n    return this.delay.y;\n  }\n  /**\n   * Sets the maximum delay between glitch activations.\n   *\n   * @deprecated Use maxDelay instead.\n   * @param {Number} value - The maximum delay in seconds.\n   */\n  setMaxDelay(value) {\n    this.delay.y = value;\n  }\n  /**\n   * The minimum duration of sporadic glitches.\n   *\n   * @type {Number}\n   */\n  get minDuration() {\n    return this.duration.x;\n  }\n  set minDuration(value) {\n    this.duration.x = value;\n  }\n  /**\n   * Returns the minimum duration of sporadic glitches.\n   *\n   * @deprecated Use minDuration instead.\n   * @return {Number} The minimum duration in seconds.\n   */\n  getMinDuration() {\n    return this.duration.x;\n  }\n  /**\n   * Sets the minimum duration of sporadic glitches.\n   *\n   * @deprecated Use minDuration instead.\n   * @param {Number} value - The minimum duration in seconds.\n   */\n  setMinDuration(value) {\n    this.duration.x = value;\n  }\n  /**\n   * The maximum duration of sporadic glitches.\n   *\n   * @type {Number}\n   */\n  get maxDuration() {\n    return this.duration.y;\n  }\n  set maxDuration(value) {\n    this.duration.y = value;\n  }\n  /**\n   * Returns the maximum duration of sporadic glitches.\n   *\n   * @deprecated Use maxDuration instead.\n   * @return {Number} The maximum duration in seconds.\n   */\n  getMaxDuration() {\n    return this.duration.y;\n  }\n  /**\n   * Sets the maximum duration of sporadic glitches.\n   *\n   * @deprecated Use maxDuration instead.\n   * @param {Number} value - The maximum duration in seconds.\n   */\n  setMaxDuration(value) {\n    this.duration.y = value;\n  }\n  /**\n   * The strength of weak glitches.\n   *\n   * @type {Number}\n   */\n  get minStrength() {\n    return this.strength.x;\n  }\n  set minStrength(value) {\n    this.strength.x = value;\n  }\n  /**\n   * Returns the strength of weak glitches.\n   *\n   * @deprecated Use minStrength instead.\n   * @return {Number} The strength.\n   */\n  getMinStrength() {\n    return this.strength.x;\n  }\n  /**\n   * Sets the strength of weak glitches.\n   *\n   * @deprecated Use minStrength instead.\n   * @param {Number} value - The strength.\n   */\n  setMinStrength(value) {\n    this.strength.x = value;\n  }\n  /**\n   * The strength of strong glitches.\n   *\n   * @type {Number}\n   */\n  get maxStrength() {\n    return this.strength.y;\n  }\n  set maxStrength(value) {\n    this.strength.y = value;\n  }\n  /**\n   * Returns the strength of strong glitches.\n   *\n   * @deprecated Use maxStrength instead.\n   * @return {Number} The strength.\n   */\n  getMaxStrength() {\n    return this.strength.y;\n  }\n  /**\n   * Sets the strength of strong glitches.\n   *\n   * @deprecated Use maxStrength instead.\n   * @param {Number} value - The strength.\n   */\n  setMaxStrength(value) {\n    this.strength.y = value;\n  }\n  /**\n   * Returns the current glitch mode.\n   *\n   * @deprecated Use mode instead.\n   * @return {GlitchMode} The mode.\n   */\n  getMode() {\n    return this.mode;\n  }\n  /**\n   * Sets the current glitch mode.\n   *\n   * @deprecated Use mode instead.\n   * @param {GlitchMode} value - The mode.\n   */\n  setMode(value) {\n    this.mode = value;\n  }\n  /**\n   * Returns the glitch ratio.\n   *\n   * @deprecated Use ratio instead.\n   * @return {Number} The ratio.\n   */\n  getGlitchRatio() {\n    return 1 - this.ratio;\n  }\n  /**\n   * Sets the ratio of weak (0.0) and strong (1.0) glitches.\n   *\n   * @deprecated Use ratio instead.\n   * @param {Number} value - The ratio. Range is [0.0, 1.0].\n   */\n  setGlitchRatio(value) {\n    this.ratio = Math.min(Math.max(1 - value, 0), 1);\n  }\n  /**\n   * The glitch column size.\n   *\n   * @type {Number}\n   */\n  get columns() {\n    return this.uniforms.get(\"columns\").value;\n  }\n  set columns(value) {\n    this.uniforms.get(\"columns\").value = value;\n  }\n  /**\n   * Returns the glitch column size.\n   *\n   * @deprecated Use columns instead.\n   * @return {Number} The glitch column size.\n   */\n  getGlitchColumns() {\n    return this.columns;\n  }\n  /**\n   * Sets the glitch column size.\n   *\n   * @deprecated Use columns instead.\n   * @param {Number} value - The glitch column size.\n   */\n  setGlitchColumns(value) {\n    this.columns = value;\n  }\n  /**\n   * Returns the chromatic aberration offset.\n   *\n   * @deprecated Use chromaticAberrationOffset instead.\n   * @return {Vector2} The offset.\n   */\n  getChromaticAberrationOffset() {\n    return this.chromaticAberrationOffset;\n  }\n  /**\n   * Sets the chromatic aberration offset.\n   *\n   * @deprecated Use chromaticAberrationOffset instead.\n   * @param {Vector2} value - The offset.\n   */\n  setChromaticAberrationOffset(value) {\n    this.chromaticAberrationOffset = value;\n  }\n  /**\n   * The perturbation map.\n   *\n   * @type {Texture}\n   */\n  get perturbationMap() {\n    return this.uniforms.get(\"perturbationMap\").value;\n  }\n  set perturbationMap(value) {\n    const currentMap = this.perturbationMap;\n    if (currentMap !== null && currentMap.name === textureTag) {\n      currentMap.dispose();\n    }\n    value.minFilter = value.magFilter = NearestFilter;\n    value.wrapS = value.wrapT = RepeatWrapping;\n    value.generateMipmaps = false;\n    this.uniforms.get(\"perturbationMap\").value = value;\n  }\n  /**\n   * Returns the current perturbation map.\n   *\n   * @deprecated Use perturbationMap instead.\n   * @return {Texture} The current perturbation map.\n   */\n  getPerturbationMap() {\n    return this.perturbationMap;\n  }\n  /**\n   * Replaces the current perturbation map with the given one.\n   *\n   * The current map will be disposed if it was generated by this effect.\n   *\n   * @deprecated Use perturbationMap instead.\n   * @param {Texture} value - The new perturbation map.\n   */\n  setPerturbationMap(value) {\n    this.perturbationMap = value;\n  }\n  /**\n   * Generates a perturbation map.\n   *\n   * @deprecated Use NoiseTexture instead.\n   * @param {Number} [value=64] - The texture size.\n   * @return {DataTexture} The perturbation map.\n   */\n  generatePerturbationMap(value = 64) {\n    const map = new NoiseTexture(value, value, RGBAFormat2);\n    map.name = textureTag;\n    return map;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const mode = this.mode;\n    const breakPoint = this.breakPoint;\n    const offset = this.chromaticAberrationOffset;\n    const s = this.strength;\n    let time = this.time;\n    let active = false;\n    let r = 0, a = 0;\n    let trigger;\n    if (mode !== GlitchMode.DISABLED) {\n      if (mode === GlitchMode.SPORADIC) {\n        time += deltaTime;\n        trigger = time > breakPoint.x;\n        if (time >= breakPoint.x + breakPoint.y) {\n          breakPoint.set(\n            randomFloat(this.delay.x, this.delay.y),\n            randomFloat(this.duration.x, this.duration.y)\n          );\n          time = 0;\n        }\n      }\n      r = Math.random();\n      this.uniforms.get(\"random\").value = r;\n      if (trigger && r > this.ratio || mode === GlitchMode.CONSTANT_WILD) {\n        active = true;\n        r *= s.y * 0.03;\n        a = randomFloat(-Math.PI, Math.PI);\n        this.seeds.set(randomFloat(-s.y, s.y), randomFloat(-s.y, s.y));\n        this.distortion.set(randomFloat(0, 1), randomFloat(0, 1));\n      } else if (trigger || mode === GlitchMode.CONSTANT_MILD) {\n        active = true;\n        r *= s.x * 0.03;\n        a = randomFloat(-Math.PI, Math.PI);\n        this.seeds.set(randomFloat(-s.x, s.x), randomFloat(-s.x, s.x));\n        this.distortion.set(randomFloat(0, 1), randomFloat(0, 1));\n      }\n      this.time = time;\n    }\n    if (offset !== null) {\n      if (active) {\n        offset.set(Math.cos(a), Math.sin(a)).multiplyScalar(r);\n      } else {\n        offset.set(0, 0);\n      }\n    }\n    this.uniforms.get(\"active\").value = active;\n  }\n  /**\n   * Deletes generated resources.\n   */\n  dispose() {\n    const map = this.perturbationMap;\n    if (map !== null && map.name === textureTag) {\n      map.dispose();\n    }\n  }\n};\n\n// src/effects/GodRaysEffect.js\nimport {\n  BasicDepthPacking as BasicDepthPacking6,\n  Color as Color2,\n  DepthTexture as DepthTexture2,\n  Matrix4,\n  Scene as Scene2,\n  SRGBColorSpace as SRGBColorSpace8,\n  Uniform as Uniform21,\n  Vector2 as Vector211,\n  Vector3,\n  WebGLRenderTarget as WebGLRenderTarget10\n} from \"three\";\n\n// src/materials/DepthMaskMaterial.js\nimport {\n  AlwaysDepth,\n  BasicDepthPacking as BasicDepthPacking5,\n  EqualDepth,\n  GreaterDepth,\n  GreaterEqualDepth,\n  LessDepth,\n  LessEqualDepth,\n  NeverDepth,\n  NoBlending as NoBlending9,\n  NotEqualDepth,\n  PerspectiveCamera as PerspectiveCamera2,\n  ShaderMaterial as ShaderMaterial10,\n  Uniform as Uniform19,\n  Vector2 as Vector210\n} from \"three\";\n\n// src/enums/DepthTestStrategy.js\nvar DepthTestStrategy = {\n  DEFAULT: 0,\n  KEEP_MAX_DEPTH: 1,\n  DISCARD_MAX_DEPTH: 2\n};\n\n// src/materials/glsl/depth-mask.frag\nvar depth_mask_default = \"#include <common>\\n#include <packing>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer0;uniform highp sampler2D depthBuffer1;\\n#else\\nuniform mediump sampler2D depthBuffer0;uniform mediump sampler2D depthBuffer1;\\n#endif\\nuniform sampler2D inputBuffer;uniform vec2 cameraNearFar;float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#endif\\n}varying vec2 vUv;void main(){vec2 depth;\\n#if DEPTH_PACKING_0 == 3201\\ndepth.x=unpackRGBAToDepth(texture2D(depthBuffer0,vUv));\\n#else\\ndepth.x=texture2D(depthBuffer0,vUv).r;\\n#ifdef LOG_DEPTH\\nfloat d=pow(2.0,depth.x*log2(cameraNearFar.y+1.0))-1.0;float a=cameraNearFar.y/(cameraNearFar.y-cameraNearFar.x);float b=cameraNearFar.y*cameraNearFar.x/(cameraNearFar.x-cameraNearFar.y);depth.x=a+b/d;\\n#endif\\n#endif\\n#if DEPTH_PACKING_1 == 3201\\ndepth.y=unpackRGBAToDepth(texture2D(depthBuffer1,vUv));\\n#else\\ndepth.y=texture2D(depthBuffer1,vUv).r;\\n#ifdef LOG_DEPTH\\nfloat d=pow(2.0,depth.y*log2(cameraNearFar.y+1.0))-1.0;float a=cameraNearFar.y/(cameraNearFar.y-cameraNearFar.x);float b=cameraNearFar.y*cameraNearFar.x/(cameraNearFar.x-cameraNearFar.y);depth.y=a+b/d;\\n#endif\\n#endif\\nbool isMaxDepth=(depth.x==1.0);\\n#ifdef PERSPECTIVE_CAMERA\\ndepth.x=viewZToOrthographicDepth(getViewZ(depth.x),cameraNearFar.x,cameraNearFar.y);depth.y=viewZToOrthographicDepth(getViewZ(depth.y),cameraNearFar.x,cameraNearFar.y);\\n#endif\\n#if DEPTH_TEST_STRATEGY == 0\\nbool keep=depthTest(depth.x,depth.y);\\n#elif DEPTH_TEST_STRATEGY == 1\\nbool keep=isMaxDepth||depthTest(depth.x,depth.y);\\n#else\\nbool keep=!isMaxDepth&&depthTest(depth.x,depth.y);\\n#endif\\nif(keep){gl_FragColor=texture2D(inputBuffer,vUv);}else{discard;}}\";\n\n// src/materials/DepthMaskMaterial.js\nvar DepthMaskMaterial = class extends ShaderMaterial10 {\n  /**\n   * Constructs a new depth mask material.\n   */\n  constructor() {\n    super({\n      name: \"DepthMaskMaterial\",\n      defines: {\n        DEPTH_EPSILON: \"0.0001\",\n        DEPTH_PACKING_0: \"0\",\n        DEPTH_PACKING_1: \"0\",\n        DEPTH_TEST_STRATEGY: DepthTestStrategy.KEEP_MAX_DEPTH\n      },\n      uniforms: {\n        inputBuffer: new Uniform19(null),\n        depthBuffer0: new Uniform19(null),\n        depthBuffer1: new Uniform19(null),\n        cameraNearFar: new Uniform19(new Vector210(1, 1))\n      },\n      blending: NoBlending9,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: depth_mask_default,\n      vertexShader: common_default\n    });\n    this.depthMode = LessDepth;\n  }\n  /**\n   * The primary depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer0(value) {\n    this.uniforms.depthBuffer0.value = value;\n  }\n  /**\n   * The primary depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking0(value) {\n    this.defines.DEPTH_PACKING_0 = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the base depth buffer.\n   *\n   * @deprecated Use depthBuffer0 and depthPacking0 instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer0(buffer, depthPacking = BasicDepthPacking5) {\n    this.depthBuffer0 = buffer;\n    this.depthPacking0 = depthPacking;\n  }\n  /**\n   * The secondary depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer1(value) {\n    this.uniforms.depthBuffer1.value = value;\n  }\n  /**\n   * The secondary depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking1(value) {\n    this.defines.DEPTH_PACKING_1 = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer that will be compared with the base depth buffer.\n   *\n   * @deprecated Use depthBuffer1 and depthPacking1 instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer1(buffer, depthPacking = BasicDepthPacking5) {\n    this.depthBuffer1 = buffer;\n    this.depthPacking1 = depthPacking;\n  }\n  /**\n   * The strategy for handling maximum depth.\n   *\n   * @type {DepthTestStrategy}\n   */\n  get maxDepthStrategy() {\n    return Number(this.defines.DEPTH_TEST_STRATEGY);\n  }\n  set maxDepthStrategy(value) {\n    this.defines.DEPTH_TEST_STRATEGY = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Indicates whether maximum depth values should be preserved.\n   *\n   * @type {Boolean}\n   * @deprecated Use maxDepthStrategy instead.\n   */\n  get keepFar() {\n    return this.maxDepthStrategy;\n  }\n  set keepFar(value) {\n    this.maxDepthStrategy = value ? DepthTestStrategy.KEEP_MAX_DEPTH : DepthTestStrategy.DISCARD_MAX_DEPTH;\n  }\n  /**\n   * Returns the strategy for dealing with maximum depth values.\n   *\n   * @deprecated Use maxDepthStrategy instead.\n   * @return {DepthTestStrategy} The strategy.\n   */\n  getMaxDepthStrategy() {\n    return this.maxDepthStrategy;\n  }\n  /**\n   * Sets the strategy for dealing with maximum depth values.\n   *\n   * @deprecated Use maxDepthStrategy instead.\n   * @param {DepthTestStrategy} value - The strategy.\n   */\n  setMaxDepthStrategy(value) {\n    this.maxDepthStrategy = value;\n  }\n  /**\n   * A small error threshold that is used for `EqualDepth` and `NotEqualDepth` tests. Default is `1e-4`.\n   *\n   * @type {Number}\n   */\n  get epsilon() {\n    return Number(this.defines.DEPTH_EPSILON);\n  }\n  set epsilon(value) {\n    this.defines.DEPTH_EPSILON = value.toFixed(16);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the current error threshold for depth comparisons.\n   *\n   * @deprecated Use epsilon instead.\n   * @return {Number} The error threshold.\n   */\n  getEpsilon() {\n    return this.epsilon;\n  }\n  /**\n   * Sets the depth comparison error threshold.\n   *\n   * @deprecated Use epsilon instead.\n   * @param {Number} value - The new error threshold.\n   */\n  setEpsilon(value) {\n    this.epsilon = value;\n  }\n  /**\n   * The depth mode.\n   *\n   * @see https://threejs.org/docs/#api/en/constants/Materials\n   * @type {DepthModes}\n   */\n  get depthMode() {\n    return Number(this.defines.DEPTH_MODE);\n  }\n  set depthMode(value) {\n    let depthTest;\n    switch (value) {\n      case NeverDepth:\n        depthTest = \"false\";\n        break;\n      case AlwaysDepth:\n        depthTest = \"true\";\n        break;\n      case EqualDepth:\n        depthTest = \"abs(d1 - d0) <= DEPTH_EPSILON\";\n        break;\n      case NotEqualDepth:\n        depthTest = \"abs(d1 - d0) > DEPTH_EPSILON\";\n        break;\n      case LessDepth:\n        depthTest = \"d0 > d1\";\n        break;\n      case LessEqualDepth:\n        depthTest = \"d0 >= d1\";\n        break;\n      case GreaterEqualDepth:\n        depthTest = \"d0 <= d1\";\n        break;\n      case GreaterDepth:\n      default:\n        depthTest = \"d0 < d1\";\n        break;\n    }\n    this.defines.DEPTH_MODE = value.toFixed(0);\n    this.defines[\"depthTest(d0, d1)\"] = depthTest;\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the current depth mode.\n   *\n   * @deprecated Use depthMode instead.\n   * @return {DepthModes} The depth mode. Default is `LessDepth`.\n   */\n  getDepthMode() {\n    return this.depthMode;\n  }\n  /**\n   * Sets the depth mode.\n   *\n   * @deprecated Use depthMode instead.\n   * @param {DepthModes} mode - The depth mode.\n   */\n  setDepthMode(mode) {\n    this.depthMode = mode;\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @deprecated Use copyCameraSettings instead.\n   * @param {Camera} camera - A camera.\n   */\n  adoptCameraSettings(camera) {\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  copyCameraSettings(camera) {\n    if (camera) {\n      this.uniforms.cameraNearFar.value.set(camera.near, camera.far);\n      if (camera instanceof PerspectiveCamera2) {\n        this.defines.PERSPECTIVE_CAMERA = \"1\";\n      } else {\n        delete this.defines.PERSPECTIVE_CAMERA;\n      }\n      this.needsUpdate = true;\n    }\n  }\n};\n\n// src/materials/GodRaysMaterial.js\nimport { NoBlending as NoBlending10, ShaderMaterial as ShaderMaterial11, Uniform as Uniform20 } from \"three\";\n\n// src/materials/glsl/convolution.god-rays.frag\nvar convolution_god_rays_default = \"#include <common>\\n#include <dithering_pars_fragment>\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform vec2 lightPosition;uniform float exposure;uniform float decay;uniform float density;uniform float weight;uniform float clampMax;varying vec2 vUv;void main(){vec2 coord=vUv;vec2 delta=lightPosition-coord;delta*=1.0/SAMPLES_FLOAT*density;float illuminationDecay=1.0;vec4 color=vec4(0.0);for(int i=0;i<SAMPLES_INT;++i){coord+=delta;vec4 texel=texture2D(inputBuffer,coord);texel*=illuminationDecay*weight;color+=texel;illuminationDecay*=decay;}gl_FragColor=clamp(color*exposure,0.0,clampMax);\\n#include <dithering_fragment>\\n}\";\n\n// src/materials/GodRaysMaterial.js\nvar GodRaysMaterial = class extends ShaderMaterial11 {\n  /**\n   * Constructs a new god rays material.\n   *\n   * TODO Remove lightPosition param.\n   * @param {Vector2} lightPosition - Deprecated.\n   */\n  constructor(lightPosition) {\n    super({\n      name: \"GodRaysMaterial\",\n      defines: {\n        SAMPLES_INT: \"60\",\n        SAMPLES_FLOAT: \"60.0\"\n      },\n      uniforms: {\n        inputBuffer: new Uniform20(null),\n        lightPosition: new Uniform20(lightPosition),\n        density: new Uniform20(1),\n        decay: new Uniform20(1),\n        weight: new Uniform20(1),\n        exposure: new Uniform20(1),\n        clampMax: new Uniform20(1)\n      },\n      blending: NoBlending10,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_god_rays_default,\n      vertexShader: common_default\n    });\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The screen space position of the light source.\n   *\n   * @type {Vector2}\n   */\n  get lightPosition() {\n    return this.uniforms.lightPosition.value;\n  }\n  /**\n   * Returns the screen space position of the light source.\n   *\n   * @deprecated Use lightPosition instead.\n   * @return {Vector2} The position.\n   */\n  getLightPosition() {\n    return this.uniforms.lightPosition.value;\n  }\n  /**\n   * Sets the screen space position of the light source.\n   *\n   * @deprecated Use lightPosition instead.\n   * @param {Vector2} value - The position.\n   */\n  setLightPosition(value) {\n    this.uniforms.lightPosition.value = value;\n  }\n  /**\n   * The density.\n   *\n   * @type {Number}\n   */\n  get density() {\n    return this.uniforms.density.value;\n  }\n  set density(value) {\n    this.uniforms.density.value = value;\n  }\n  /**\n   * Returns the density.\n   *\n   * @deprecated Use density instead.\n   * @return {Number} The density.\n   */\n  getDensity() {\n    return this.uniforms.density.value;\n  }\n  /**\n   * Sets the density.\n   *\n   * @deprecated Use density instead.\n   * @param {Number} value - The density.\n   */\n  setDensity(value) {\n    this.uniforms.density.value = value;\n  }\n  /**\n   * The decay.\n   *\n   * @type {Number}\n   */\n  get decay() {\n    return this.uniforms.decay.value;\n  }\n  set decay(value) {\n    this.uniforms.decay.value = value;\n  }\n  /**\n   * Returns the decay.\n   *\n   * @deprecated Use decay instead.\n   * @return {Number} The decay.\n   */\n  getDecay() {\n    return this.uniforms.decay.value;\n  }\n  /**\n   * Sets the decay.\n   *\n   * @deprecated Use decay instead.\n   * @param {Number} value - The decay.\n   */\n  setDecay(value) {\n    this.uniforms.decay.value = value;\n  }\n  /**\n   * The weight.\n   *\n   * @type {Number}\n   */\n  get weight() {\n    return this.uniforms.weight.value;\n  }\n  set weight(value) {\n    this.uniforms.weight.value = value;\n  }\n  /**\n   * Returns the weight.\n   *\n   * @deprecated Use weight instead.\n   * @return {Number} The weight.\n   */\n  getWeight() {\n    return this.uniforms.weight.value;\n  }\n  /**\n   * Sets the weight.\n   *\n   * @deprecated Use weight instead.\n   * @param {Number} value - The weight.\n   */\n  setWeight(value) {\n    this.uniforms.weight.value = value;\n  }\n  /**\n   * The exposure.\n   *\n   * @type {Number}\n   */\n  get exposure() {\n    return this.uniforms.exposure.value;\n  }\n  set exposure(value) {\n    this.uniforms.exposure.value = value;\n  }\n  /**\n   * Returns the exposure.\n   *\n   * @deprecated Use exposure instead.\n   * @return {Number} The exposure.\n   */\n  getExposure() {\n    return this.uniforms.exposure.value;\n  }\n  /**\n   * Sets the exposure.\n   *\n   * @deprecated Use exposure instead.\n   * @param {Number} value - The exposure.\n   */\n  setExposure(value) {\n    this.uniforms.exposure.value = value;\n  }\n  /**\n   * The maximum light intensity.\n   *\n   * @type {Number}\n   */\n  get maxIntensity() {\n    return this.uniforms.clampMax.value;\n  }\n  set maxIntensity(value) {\n    this.uniforms.clampMax.value = value;\n  }\n  /**\n   * Returns the maximum light intensity.\n   *\n   * @deprecated Use maxIntensity instead.\n   * @return {Number} The maximum light intensity.\n   */\n  getMaxIntensity() {\n    return this.uniforms.clampMax.value;\n  }\n  /**\n   * Sets the maximum light intensity.\n   *\n   * @deprecated Use maxIntensity instead.\n   * @param {Number} value - The maximum light intensity.\n   */\n  setMaxIntensity(value) {\n    this.uniforms.clampMax.value = value;\n  }\n  /**\n   * The amount of samples per pixel.\n   *\n   * @type {Number}\n   */\n  get samples() {\n    return Number(this.defines.SAMPLES_INT);\n  }\n  set samples(value) {\n    const s = Math.floor(value);\n    this.defines.SAMPLES_INT = s.toFixed(0);\n    this.defines.SAMPLES_FLOAT = s.toFixed(1);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the amount of samples per pixel.\n   *\n   * @deprecated Use samples instead.\n   * @return {Number} The sample count.\n   */\n  getSamples() {\n    return this.samples;\n  }\n  /**\n   * Sets the amount of samples per pixel.\n   *\n   * @deprecated Use samples instead.\n   * @param {Number} value - The sample count.\n   */\n  setSamples(value) {\n    this.samples = value;\n  }\n};\n\n// src/passes/RenderPass.js\nvar RenderPass = class extends Pass {\n  /**\n   * Constructs a new render pass.\n   *\n   * @param {Scene} scene - The scene to render.\n   * @param {Camera} camera - The camera to use to render the scene.\n   * @param {Material} [overrideMaterial=null] - An override material.\n   */\n  constructor(scene, camera, overrideMaterial = null) {\n    super(\"RenderPass\", scene, camera);\n    this.needsSwap = false;\n    this.clearPass = new ClearPass();\n    this.overrideMaterialManager = overrideMaterial === null ? null : new OverrideMaterialManager(overrideMaterial);\n    this.ignoreBackground = false;\n    this.skipShadowMapUpdate = false;\n    this.selection = null;\n  }\n  set mainScene(value) {\n    this.scene = value;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n  }\n  get renderToScreen() {\n    return super.renderToScreen;\n  }\n  set renderToScreen(value) {\n    super.renderToScreen = value;\n    this.clearPass.renderToScreen = value;\n  }\n  /**\n   * The current override material.\n   *\n   * @type {Material}\n   */\n  get overrideMaterial() {\n    const manager = this.overrideMaterialManager;\n    return manager !== null ? manager.material : null;\n  }\n  set overrideMaterial(value) {\n    const manager = this.overrideMaterialManager;\n    if (value !== null) {\n      if (manager !== null) {\n        manager.setMaterial(value);\n      } else {\n        this.overrideMaterialManager = new OverrideMaterialManager(value);\n      }\n    } else if (manager !== null) {\n      manager.dispose();\n      this.overrideMaterialManager = null;\n    }\n  }\n  /**\n   * Returns the current override material.\n   *\n   * @deprecated Use overrideMaterial instead.\n   * @return {Material} The material.\n   */\n  getOverrideMaterial() {\n    return this.overrideMaterial;\n  }\n  /**\n   * Sets the override material.\n   *\n   * @deprecated Use overrideMaterial instead.\n   * @return {Material} value - The material.\n   */\n  setOverrideMaterial(value) {\n    this.overrideMaterial = value;\n  }\n  /**\n   * Indicates whether the target buffer should be cleared before rendering.\n   *\n   * @type {Boolean}\n   * @deprecated Use clearPass.enabled instead.\n   */\n  get clear() {\n    return this.clearPass.enabled;\n  }\n  set clear(value) {\n    this.clearPass.enabled = value;\n  }\n  /**\n   * Returns the selection. Default is `null` (no restriction).\n   *\n   * @deprecated Use selection instead.\n   * @return {Selection} The selection.\n   */\n  getSelection() {\n    return this.selection;\n  }\n  /**\n   * Sets the selection. Set to `null` to disable.\n   *\n   * @deprecated Use selection instead.\n   * @param {Selection} value - The selection.\n   */\n  setSelection(value) {\n    this.selection = value;\n  }\n  /**\n   * Indicates whether the scene background is disabled.\n   *\n   * @deprecated Use ignoreBackground instead.\n   * @return {Boolean} Whether the scene background is disabled.\n   */\n  isBackgroundDisabled() {\n    return this.ignoreBackground;\n  }\n  /**\n   * Enables or disables the scene background.\n   *\n   * @deprecated Use ignoreBackground instead.\n   * @param {Boolean} value - Whether the scene background should be disabled.\n   */\n  setBackgroundDisabled(value) {\n    this.ignoreBackground = value;\n  }\n  /**\n   * Indicates whether the shadow map auto update is disabled.\n   *\n   * @deprecated Use skipShadowMapUpdate instead.\n   * @return {Boolean} Whether the shadow map update is disabled.\n   */\n  isShadowMapDisabled() {\n    return this.skipShadowMapUpdate;\n  }\n  /**\n   * Enables or disables the shadow map auto update.\n   *\n   * @deprecated Use skipShadowMapUpdate instead.\n   * @param {Boolean} value - Whether the shadow map auto update should be disabled.\n   */\n  setShadowMapDisabled(value) {\n    this.skipShadowMapUpdate = value;\n  }\n  /**\n   * Returns the clear pass.\n   *\n   * @deprecated Use clearPass.enabled instead.\n   * @return {ClearPass} The clear pass.\n   */\n  getClearPass() {\n    return this.clearPass;\n  }\n  /**\n   * Renders the scene.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const scene = this.scene;\n    const camera = this.camera;\n    const selection = this.selection;\n    const mask = camera.layers.mask;\n    const background = scene.background;\n    const shadowMapAutoUpdate = renderer.shadowMap.autoUpdate;\n    const renderTarget = this.renderToScreen ? null : inputBuffer;\n    if (selection !== null) {\n      camera.layers.set(selection.getLayer());\n    }\n    if (this.skipShadowMapUpdate) {\n      renderer.shadowMap.autoUpdate = false;\n    }\n    if (this.ignoreBackground || this.clearPass.overrideClearColor !== null) {\n      scene.background = null;\n    }\n    if (this.clearPass.enabled) {\n      this.clearPass.render(renderer, inputBuffer);\n    }\n    renderer.setRenderTarget(renderTarget);\n    if (this.overrideMaterialManager !== null) {\n      this.overrideMaterialManager.render(renderer, scene, camera);\n    } else {\n      renderer.render(scene, camera);\n    }\n    camera.layers.mask = mask;\n    scene.background = background;\n    renderer.shadowMap.autoUpdate = shadowMapAutoUpdate;\n  }\n};\n\n// src/effects/glsl/god-rays.frag\nvar god_rays_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=texture2D(map,uv);}\";\n\n// src/effects/GodRaysEffect.js\nvar v = /* @__PURE__ */ new Vector3();\nvar m = /* @__PURE__ */ new Matrix4();\nvar GodRaysEffect = class extends Effect {\n  /**\n   * Constructs a new god rays effect.\n   *\n   * @param {Camera} [camera] - The main camera.\n   * @param {Mesh|Points} [lightSource] - The light source. Must not write depth and has to be flagged as transparent.\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function of this effect.\n   * @param {Number} [options.samples=60.0] - The number of samples per pixel.\n   * @param {Number} [options.density=0.96] - The density of the light rays.\n   * @param {Number} [options.decay=0.9] - An illumination decay factor.\n   * @param {Number} [options.weight=0.4] - A light ray weight factor.\n   * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.\n   * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   * @param {KernelSize} [options.kernelSize=KernelSize.SMALL] - The blur kernel size. Has no effect if blur is disabled.\n   * @param {Boolean} [options.blur=true] - Whether the god rays should be blurred to reduce artifacts.\n   */\n  constructor(camera, lightSource, {\n    blendFunction = BlendFunction.SCREEN,\n    samples = 60,\n    density = 0.96,\n    decay = 0.9,\n    weight = 0.4,\n    exposure = 0.6,\n    clampMax = 1,\n    blur = true,\n    kernelSize = KernelSize.SMALL,\n    resolutionScale = 0.5,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"GodRaysEffect\", god_rays_default, {\n      blendFunction,\n      attributes: EffectAttribute.DEPTH,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"map\", new Uniform21(null)]\n      ])\n    });\n    this.camera = camera;\n    this._lightSource = lightSource;\n    this.lightSource = lightSource;\n    this.lightScene = new Scene2();\n    this.screenPosition = new Vector211();\n    this.renderTargetA = new WebGLRenderTarget10(1, 1, { depthBuffer: false });\n    this.renderTargetA.texture.name = \"GodRays.Target.A\";\n    this.renderTargetB = this.renderTargetA.clone();\n    this.renderTargetB.texture.name = \"GodRays.Target.B\";\n    this.uniforms.get(\"map\").value = this.renderTargetB.texture;\n    this.renderTargetLight = new WebGLRenderTarget10(1, 1);\n    this.renderTargetLight.texture.name = \"GodRays.Light\";\n    this.renderTargetLight.depthTexture = new DepthTexture2();\n    this.renderPassLight = new RenderPass(this.lightScene, camera);\n    this.renderPassLight.clearPass.overrideClearColor = new Color2(0);\n    this.clearPass = new ClearPass(true, false, false);\n    this.clearPass.overrideClearColor = new Color2(0);\n    this.blurPass = new KawaseBlurPass({ kernelSize });\n    this.blurPass.enabled = blur;\n    this.depthMaskPass = new ShaderPass(new DepthMaskMaterial());\n    const depthMaskMaterial = this.depthMaskMaterial;\n    depthMaskMaterial.depthBuffer1 = this.renderTargetLight.depthTexture;\n    depthMaskMaterial.copyCameraSettings(camera);\n    this.godRaysPass = new ShaderPass(new GodRaysMaterial(this.screenPosition));\n    const godRaysMaterial = this.godRaysMaterial;\n    godRaysMaterial.density = density;\n    godRaysMaterial.decay = decay;\n    godRaysMaterial.weight = weight;\n    godRaysMaterial.exposure = exposure;\n    godRaysMaterial.maxIntensity = clampMax;\n    godRaysMaterial.samples = samples;\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n  }\n  set mainCamera(value) {\n    this.camera = value;\n    this.renderPassLight.mainCamera = value;\n    this.depthMaskMaterial.copyCameraSettings(value);\n  }\n  /**\n   * Sets the light source.\n   *\n   * @type {Mesh|Points}\n   */\n  get lightSource() {\n    return this._lightSource;\n  }\n  set lightSource(value) {\n    this._lightSource = value;\n    if (value !== null) {\n      value.material.depthWrite = false;\n      value.material.transparent = true;\n    }\n  }\n  /**\n   * Returns the blur pass that reduces aliasing artifacts and makes the light softer.\n   *\n   * @deprecated Use blurPass instead.\n   * @return {KawaseBlurPass} The blur pass.\n   */\n  getBlurPass() {\n    return this.blurPass;\n  }\n  /**\n   * A texture that contains the intermediate result of this effect.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTargetB.texture;\n  }\n  /**\n   * Returns the god rays texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.texture;\n  }\n  /**\n   * The depth mask material.\n   *\n   * @type {DepthMaskMaterial}\n   * @private\n   */\n  get depthMaskMaterial() {\n    return this.depthMaskPass.fullscreenMaterial;\n  }\n  /**\n   * The internal god rays material.\n   *\n   * @type {GodRaysMaterial}\n   */\n  get godRaysMaterial() {\n    return this.godRaysPass.fullscreenMaterial;\n  }\n  /**\n   * Returns the god rays material.\n   *\n   * @deprecated Use godRaysMaterial instead.\n   * @return {GodRaysMaterial} The material.\n   */\n  getGodRaysMaterial() {\n    return this.godRaysMaterial;\n  }\n  /**\n   * Returns the resolution of this effect.\n   *\n   * @deprecated Use resolution instead.\n   * @return {GodRaysMaterial} The material.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * The current width of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.width instead.\n   */\n  get width() {\n    return this.resolution.width;\n  }\n  set width(value) {\n    this.resolution.preferredWidth = value;\n  }\n  /**\n   * The current height of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.height instead.\n   */\n  get height() {\n    return this.resolution.height;\n  }\n  set height(value) {\n    this.resolution.preferredHeight = value;\n  }\n  /**\n   * Indicates whether dithering is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated\n   */\n  get dithering() {\n    return this.godRaysMaterial.dithering;\n  }\n  set dithering(value) {\n    const material = this.godRaysMaterial;\n    material.dithering = value;\n    material.needsUpdate = true;\n  }\n  /**\n   * Indicates whether the god rays should be blurred to reduce artifacts.\n   *\n   * @type {Boolean}\n   * @deprecated Use blurPass.enabled instead.\n   */\n  get blur() {\n    return this.blurPass.enabled;\n  }\n  set blur(value) {\n    this.blurPass.enabled = value;\n  }\n  /**\n   * The blur kernel size.\n   *\n   * @type {KernelSize}\n   * @deprecated Use blurPass.kernelSize instead.\n   */\n  get kernelSize() {\n    return this.blurPass.kernelSize;\n  }\n  set kernelSize(value) {\n    this.blurPass.kernelSize = value;\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @return {Number} The resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  getResolutionScale() {\n    return this.resolution.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * @param {Number} scale - The new resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  setResolutionScale(scale) {\n    this.resolution.scale = scale;\n  }\n  /**\n   * The number of samples per pixel.\n   *\n   * @type {Number}\n   * @deprecated Use godRaysMaterial.samples instead.\n   */\n  get samples() {\n    return this.godRaysMaterial.samples;\n  }\n  /**\n   * A higher sample count improves quality at the cost of performance.\n   *\n   * @type {Number}\n   * @deprecated Use godRaysMaterial.samples instead.\n   */\n  set samples(value) {\n    this.godRaysMaterial.samples = value;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {Number} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking6) {\n    this.depthMaskPass.fullscreenMaterial.depthBuffer0 = depthTexture;\n    this.depthMaskPass.fullscreenMaterial.depthPacking0 = depthPacking;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const lightSource = this.lightSource;\n    const parent = lightSource.parent;\n    const matrixAutoUpdate = lightSource.matrixAutoUpdate;\n    const renderTargetA = this.renderTargetA;\n    const renderTargetLight = this.renderTargetLight;\n    lightSource.material.depthWrite = true;\n    lightSource.matrixAutoUpdate = false;\n    lightSource.updateWorldMatrix(true, false);\n    if (parent !== null) {\n      if (!matrixAutoUpdate) {\n        m.copy(lightSource.matrix);\n      }\n      lightSource.matrix.copy(lightSource.matrixWorld);\n    }\n    this.lightScene.add(lightSource);\n    this.renderPassLight.render(renderer, renderTargetLight);\n    this.clearPass.render(renderer, renderTargetA);\n    this.depthMaskPass.render(renderer, renderTargetLight, renderTargetA);\n    lightSource.material.depthWrite = false;\n    lightSource.matrixAutoUpdate = matrixAutoUpdate;\n    if (parent !== null) {\n      if (!matrixAutoUpdate) {\n        lightSource.matrix.copy(m);\n      }\n      parent.add(lightSource);\n    }\n    v.setFromMatrixPosition(lightSource.matrixWorld).project(this.camera);\n    this.screenPosition.set(\n      Math.min(Math.max((v.x + 1) * 0.5, -1), 2),\n      Math.min(Math.max((v.y + 1) * 0.5, -1), 2)\n    );\n    if (this.blurPass.enabled) {\n      this.blurPass.render(renderer, renderTargetA, renderTargetA);\n    }\n    this.godRaysPass.render(renderer, renderTargetA, this.renderTargetB);\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.renderTargetA.setSize(w, h);\n    this.renderTargetB.setSize(w, h);\n    this.renderTargetLight.setSize(w, h);\n    this.blurPass.resolution.copy(resolution);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.blurPass.initialize(renderer, alpha, frameBufferType);\n    this.renderPassLight.initialize(renderer, alpha, frameBufferType);\n    this.depthMaskPass.initialize(renderer, alpha, frameBufferType);\n    this.godRaysPass.initialize(renderer, alpha, frameBufferType);\n    if (frameBufferType !== void 0) {\n      this.renderTargetA.texture.type = frameBufferType;\n      this.renderTargetB.texture.type = frameBufferType;\n      this.renderTargetLight.texture.type = frameBufferType;\n      if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace8) {\n        this.renderTargetA.texture.colorSpace = SRGBColorSpace8;\n        this.renderTargetB.texture.colorSpace = SRGBColorSpace8;\n        this.renderTargetLight.texture.colorSpace = SRGBColorSpace8;\n      }\n    }\n  }\n};\n\n// src/effects/GridEffect.js\nimport { Uniform as Uniform22, Vector2 as Vector212 } from \"three\";\n\n// src/effects/glsl/grid.frag\nvar grid_default = \"uniform vec2 scale;uniform float lineWidth;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){float grid=0.5-max(abs(mod(uv.x*scale.x,1.0)-0.5),abs(mod(uv.y*scale.y,1.0)-0.5));outputColor=vec4(vec3(smoothstep(0.0,lineWidth,grid)),inputColor.a);}\";\n\n// src/effects/GridEffect.js\nvar GridEffect = class extends Effect {\n  /**\n   * Constructs a new grid effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.OVERLAY] - The blend function of this effect.\n   * @param {Number} [options.scale=1.0] - The scale of the grid pattern.\n   * @param {Number} [options.lineWidth=0.0] - The line width of the grid pattern.\n   */\n  constructor({ blendFunction = BlendFunction.OVERLAY, scale = 1, lineWidth = 0 } = {}) {\n    super(\"GridEffect\", grid_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"scale\", new Uniform22(new Vector212())],\n        [\"lineWidth\", new Uniform22(lineWidth)]\n      ])\n    });\n    this.resolution = new Vector212();\n    this.s = 0;\n    this.scale = scale;\n    this.l = 0;\n    this.lineWidth = lineWidth;\n  }\n  /**\n   * The scale.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.s;\n  }\n  set scale(value) {\n    this.s = Math.max(value, 1e-6);\n    this.setSize(this.resolution.width, this.resolution.height);\n  }\n  /**\n   * Returns the current grid scale.\n   *\n   * @deprecated Use scale instead.\n   * @return {Number} The grid scale.\n   */\n  getScale() {\n    return this.scale;\n  }\n  /**\n   * Sets the grid scale.\n   *\n   * @deprecated Use scale instead.\n   * @param {Number} value - The new grid scale.\n   */\n  setScale(value) {\n    this.scale = value;\n  }\n  /**\n   * The line width.\n   *\n   * @type {Number}\n   */\n  get lineWidth() {\n    return this.l;\n  }\n  set lineWidth(value) {\n    this.l = value;\n    this.setSize(this.resolution.width, this.resolution.height);\n  }\n  /**\n   * Returns the current grid line width.\n   *\n   * @deprecated Use lineWidth instead.\n   * @return {Number} The grid line width.\n   */\n  getLineWidth() {\n    return this.lineWidth;\n  }\n  /**\n   * Sets the grid line width.\n   *\n   * @deprecated Use lineWidth instead.\n   * @param {Number} value - The new grid line width.\n   */\n  setLineWidth(value) {\n    this.lineWidth = value;\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.resolution.set(width, height);\n    const aspect = width / height;\n    const scale = this.scale * (height * 0.125);\n    this.uniforms.get(\"scale\").value.set(aspect * scale, scale);\n    this.uniforms.get(\"lineWidth\").value = scale / height + this.lineWidth;\n  }\n};\n\n// src/effects/HueSaturationEffect.js\nimport { Uniform as Uniform23, Vector3 as Vector32 } from \"three\";\n\n// src/effects/glsl/hue-saturation.frag\nvar hue_saturation_default = \"uniform vec3 hue;uniform float saturation;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=vec3(dot(inputColor.rgb,hue.xyz),dot(inputColor.rgb,hue.zxy),dot(inputColor.rgb,hue.yzx));float average=(color.r+color.g+color.b)/3.0;vec3 diff=average-color;if(saturation>0.0){color+=diff*(1.0-1.0/(1.001-saturation));}else{color+=diff*-saturation;}outputColor=vec4(min(color,1.0),inputColor.a);}\";\n\n// src/effects/HueSaturationEffect.js\nvar HueSaturationEffect = class extends Effect {\n  /**\n   * Constructs a new hue/saturation effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {Number} [options.hue=0.0] - The hue in radians.\n   * @param {Number} [options.saturation=0.0] - The saturation factor, ranging from -1 to 1, where 0 means no change.\n   */\n  constructor({ blendFunction = BlendFunction.SRC, hue = 0, saturation = 0 } = {}) {\n    super(\"HueSaturationEffect\", hue_saturation_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"hue\", new Uniform23(new Vector32())],\n        [\"saturation\", new Uniform23(saturation)]\n      ])\n    });\n    this.hue = hue;\n  }\n  /**\n   * The saturation.\n   *\n   * @type {Number}\n   */\n  get saturation() {\n    return this.uniforms.get(\"saturation\").value;\n  }\n  set saturation(value) {\n    this.uniforms.get(\"saturation\").value = value;\n  }\n  /**\n   * Returns the saturation.\n   *\n   * @deprecated Use saturation instead.\n   * @return {Number} The saturation.\n   */\n  getSaturation() {\n    return this.saturation;\n  }\n  /**\n   * Sets the saturation.\n   *\n   * @deprecated Use saturation instead.\n   * @param {Number} value - The saturation.\n   */\n  setSaturation(value) {\n    this.saturation = value;\n  }\n  /**\n   * The hue.\n   *\n   * @type {Number}\n   */\n  get hue() {\n    const hue = this.uniforms.get(\"hue\").value;\n    return Math.acos((hue.x * 3 - 1) / 2);\n  }\n  set hue(value) {\n    const s = Math.sin(value), c2 = Math.cos(value);\n    this.uniforms.get(\"hue\").value.set(\n      (2 * c2 + 1) / 3,\n      (-Math.sqrt(3) * s - c2 + 1) / 3,\n      (Math.sqrt(3) * s - c2 + 1) / 3\n    );\n  }\n  /**\n   * Returns the hue.\n   *\n   * @deprecated Use hue instead.\n   * @return {Number} The hue in radians.\n   */\n  getHue() {\n    return this.hue;\n  }\n  /**\n   * Sets the hue.\n   *\n   * @deprecated Use hue instead.\n   * @param {Number} value - The hue in radians.\n   */\n  setHue(value) {\n    this.hue = value;\n  }\n};\n\n// src/effects/LensDistortionEffect.js\nimport { Uniform as Uniform24, Vector2 as Vector213 } from \"three\";\n\n// src/effects/glsl/lens-distortion.frag\nvar lens_distortion_default = \"uniform vec2 distortion;uniform vec2 principalPoint;uniform vec2 focalLength;uniform float skew;float mask(const in vec2 uv){return float(uv.s>=0.0&&uv.s<=1.0&&uv.t>=0.0&&uv.t<=1.0);}void mainUv(inout vec2 uv){vec2 xn=2.0*(uv.st-0.5);vec3 xDistorted=vec3((1.0+distortion*dot(xn,xn))*xn,1.0);mat3 kk=mat3(vec3(focalLength.x,0.0,0.0),vec3(skew*focalLength.x,focalLength.y,0.0),vec3(principalPoint.x,principalPoint.y,1.0));uv=(kk*xDistorted).xy*0.5+0.5;}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=mask(uv)*inputColor;}\";\n\n// src/effects/LensDistortionEffect.js\nvar LensDistortionEffect = class extends Effect {\n  /**\n   * Constructs a new lens distortion effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Vector2} [options.distortion] - The distortion value.\n   * @param {Vector2} [options.principalPoint] - The center point.\n   * @param {Vector2} [options.focalLength] - The focal length.\n   * @param {Number} [options.skew=0] - The skew value.\n   */\n  constructor({\n    distortion = new Vector213(0, 0),\n    principalPoint = new Vector213(0, 0),\n    focalLength = new Vector213(1, 1),\n    skew = 0\n  } = {}) {\n    super(\"LensDistortionEffect\", lens_distortion_default, {\n      uniforms: /* @__PURE__ */ new Map([\n        [\"distortion\", new Uniform24(distortion)],\n        [\"principalPoint\", new Uniform24(principalPoint)],\n        [\"focalLength\", new Uniform24(focalLength)],\n        [\"skew\", new Uniform24(skew)]\n      ])\n    });\n  }\n  /**\n   * The radial distortion coefficients. Default is (0, 0).\n   *\n   * @type {Vector2}\n   */\n  get distortion() {\n    return this.uniforms.get(\"distortion\").value;\n  }\n  set distortion(value) {\n    this.uniforms.get(\"distortion\").value = value;\n  }\n  /**\n   * The principal point. Default is (0, 0).\n   *\n   * @type {Vector2}\n   */\n  get principalPoint() {\n    return this.uniforms.get(\"principalPoint\").value;\n  }\n  set principalPoint(value) {\n    this.uniforms.get(\"principalPoint\").value = value;\n  }\n  /**\n   * The focal length. Default is (1, 1).\n   *\n   * @type {Vector2}\n   */\n  get focalLength() {\n    return this.uniforms.get(\"focalLength\").value;\n  }\n  set focalLength(value) {\n    this.uniforms.get(\"focalLength\").value = value;\n  }\n  /**\n   * The skew factor in radians.\n   *\n   * @type {Number}\n   */\n  get skew() {\n    return this.uniforms.get(\"skew\").value;\n  }\n  set skew(value) {\n    this.uniforms.get(\"skew\").value = value;\n  }\n};\n\n// src/effects/LUT1DEffect.js\nimport { FloatType, HalfFloatType, Uniform as Uniform25 } from \"three\";\n\n// src/effects/glsl/lut-1d.frag\nvar lut_1d_default = \"#ifdef LUT_PRECISION_HIGH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D lut;\\n#else\\nuniform mediump sampler2D lut;\\n#endif\\n#else\\nuniform lowp sampler2D lut;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=vec4(texture2D(lut,vec2(inputColor.r,0.5)).r,texture2D(lut,vec2(inputColor.g,0.5)).r,texture2D(lut,vec2(inputColor.b,0.5)).r,inputColor.a);}\";\n\n// src/effects/LUT1DEffect.js\nvar LUT1DEffect = class extends Effect {\n  /**\n   * Constructs a new color grading effect.\n   *\n   * @param {Texture} lut - The lookup texture.\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   */\n  constructor(lut, { blendFunction = BlendFunction.SRC } = {}) {\n    super(\"LUT1DEffect\", lut_1d_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([[\"lut\", new Uniform25(null)]])\n    });\n    this.lut = lut;\n  }\n  /**\n   * The LUT.\n   *\n   * @type {Texture}\n   */\n  get lut() {\n    return this.uniforms.get(\"lut\").value;\n  }\n  set lut(value) {\n    this.uniforms.get(\"lut\").value = value;\n    if (value !== null && (value.type === FloatType || value.type === HalfFloatType)) {\n      this.defines.set(\"LUT_PRECISION_HIGH\", \"1\");\n    }\n  }\n};\n\n// src/effects/LUT3DEffect.js\nimport {\n  Data3DTexture as Data3DTexture2,\n  FloatType as FloatType3,\n  HalfFloatType as HalfFloatType2,\n  LinearFilter as LinearFilter4,\n  NearestFilter as NearestFilter2,\n  SRGBColorSpace as SRGBColorSpace10,\n  Uniform as Uniform26,\n  Vector3 as Vector34\n} from \"three\";\n\n// src/textures/lut/LookupTexture.js\nimport {\n  Color as Color3,\n  ClampToEdgeWrapping,\n  DataTexture as DataTexture2,\n  Data3DTexture,\n  FloatType as FloatType2,\n  LinearFilter as LinearFilter3,\n  LinearSRGBColorSpace as LinearSRGBColorSpace3,\n  RGBAFormat as RGBAFormat3,\n  SRGBColorSpace as SRGBColorSpace9,\n  UnsignedByteType as UnsignedByteType10,\n  Vector3 as Vector33\n} from \"three\";\n\n// src/enums/LUTOperation.js\nvar LUTOperation = {\n  SCALE_UP: \"lut.scaleup\"\n};\n\n// src/textures/RawImageData.js\nfunction createCanvas(width, height, data) {\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  canvas.width = width;\n  canvas.height = height;\n  if (data instanceof Image) {\n    context.drawImage(data, 0, 0);\n  } else {\n    const imageData = context.createImageData(width, height);\n    imageData.data.set(data);\n    context.putImageData(imageData, 0, 0);\n  }\n  return canvas;\n}\nvar RawImageData = class _RawImageData {\n  /**\n   * Constructs a new image data container.\n   *\n   * @param {Number} [width=0] - The width of the image.\n   * @param {Number} [height=0] - The height of the image.\n   * @param {Uint8ClampedArray} [data=null] - The image data.\n   */\n  constructor(width = 0, height = 0, data = null) {\n    this.width = width;\n    this.height = height;\n    this.data = data;\n  }\n  /**\n   * Creates a canvas from this image data.\n   *\n   * @return {Canvas} The canvas, or null if it couldn't be created.\n   */\n  toCanvas() {\n    return typeof document === \"undefined\" ? null : createCanvas(this.width, this.height, this.data);\n  }\n  /**\n   * Creates a new image data container.\n   *\n   * @param {ImageData|Image} image - An image or plain image data.\n   * @return {RawImageData} The image data.\n   */\n  static from(image) {\n    const { width, height } = image;\n    let data;\n    if (image instanceof Image) {\n      const canvas = createCanvas(width, height, image);\n      if (canvas !== null) {\n        const context = canvas.getContext(\"2d\");\n        data = context.getImageData(0, 0, width, height).data;\n      }\n    } else {\n      data = image.data;\n    }\n    return new _RawImageData(width, height, data);\n  }\n};\n\n// tmp/lut/worker.txt\nvar worker_default = '\"use strict\";(()=>{var O={SCALE_UP:\"lut.scaleup\"};var _=[new Float32Array(3),new Float32Array(3)],n=[new Float32Array(3),new Float32Array(3),new Float32Array(3),new Float32Array(3)],Z=[[new Float32Array([0,0,0]),new Float32Array([1,0,0]),new Float32Array([1,1,0]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([1,0,0]),new Float32Array([1,0,1]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,0,1]),new Float32Array([1,0,1]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,1,0]),new Float32Array([1,1,0]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,1,0]),new Float32Array([0,1,1]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,0,1]),new Float32Array([0,1,1]),new Float32Array([1,1,1])]];function d(a,t,r,m){let i=r[0]-t[0],e=r[1]-t[1],y=r[2]-t[2],h=a[0]-t[0],A=a[1]-t[1],w=a[2]-t[2],c=e*w-y*A,l=y*h-i*w,x=i*A-e*h,u=Math.sqrt(c*c+l*l+x*x),b=u*.5,s=c/u,F=l/u,f=x/u,p=-(a[0]*s+a[1]*F+a[2]*f),M=m[0]*s+m[1]*F+m[2]*f;return Math.abs(M+p)*b/3}function V(a,t,r,m,i,e){let y=(r+m*t+i*t*t)*4;e[0]=a[y+0],e[1]=a[y+1],e[2]=a[y+2]}function k(a,t,r,m,i,e){let y=r*(t-1),h=m*(t-1),A=i*(t-1),w=Math.floor(y),c=Math.floor(h),l=Math.floor(A),x=Math.ceil(y),u=Math.ceil(h),b=Math.ceil(A),s=y-w,F=h-c,f=A-l;if(w===y&&c===h&&l===A)V(a,t,y,h,A,e);else{let p;s>=F&&F>=f?p=Z[0]:s>=f&&f>=F?p=Z[1]:f>=s&&s>=F?p=Z[2]:F>=s&&s>=f?p=Z[3]:F>=f&&f>=s?p=Z[4]:f>=F&&F>=s&&(p=Z[5]);let[M,g,X,Y]=p,P=_[0];P[0]=s,P[1]=F,P[2]=f;let o=_[1],L=x-w,S=u-c,U=b-l;o[0]=L*M[0]+w,o[1]=S*M[1]+c,o[2]=U*M[2]+l,V(a,t,o[0],o[1],o[2],n[0]),o[0]=L*g[0]+w,o[1]=S*g[1]+c,o[2]=U*g[2]+l,V(a,t,o[0],o[1],o[2],n[1]),o[0]=L*X[0]+w,o[1]=S*X[1]+c,o[2]=U*X[2]+l,V(a,t,o[0],o[1],o[2],n[2]),o[0]=L*Y[0]+w,o[1]=S*Y[1]+c,o[2]=U*Y[2]+l,V(a,t,o[0],o[1],o[2],n[3]);let T=d(g,X,Y,P)*6,q=d(M,X,Y,P)*6,C=d(M,g,Y,P)*6,E=d(M,g,X,P)*6;n[0][0]*=T,n[0][1]*=T,n[0][2]*=T,n[1][0]*=q,n[1][1]*=q,n[1][2]*=q,n[2][0]*=C,n[2][1]*=C,n[2][2]*=C,n[3][0]*=E,n[3][1]*=E,n[3][2]*=E,e[0]=n[0][0]+n[1][0]+n[2][0]+n[3][0],e[1]=n[0][1]+n[1][1]+n[2][1]+n[3][1],e[2]=n[0][2]+n[1][2]+n[2][2]+n[3][2]}}var v=class{static expand(t,r){let m=Math.cbrt(t.length/4),i=new Float32Array(3),e=new t.constructor(r**3*4),y=t instanceof Uint8Array?255:1,h=r**2,A=1/(r-1);for(let w=0;w<r;++w)for(let c=0;c<r;++c)for(let l=0;l<r;++l){let x=l*A,u=c*A,b=w*A,s=Math.round(l+c*r+w*h)*4;k(t,m,x,u,b,i),e[s+0]=i[0],e[s+1]=i[1],e[s+2]=i[2],e[s+3]=y}return e}};self.addEventListener(\"message\",a=>{let t=a.data,r=t.data;switch(t.operation){case O.SCALE_UP:r=v.expand(r,t.size);break}postMessage(r,[r.buffer]),close()});})();\\n';\n\n// src/textures/lut/LookupTexture.js\nvar c = /* @__PURE__ */ new Color3();\nvar LookupTexture = class _LookupTexture extends Data3DTexture {\n  /**\n   * Constructs a cubic 3D lookup texture.\n   *\n   * @param {TypedArray} data - The pixel data. The default format is RGBA.\n   * @param {Number} size - The sidelength.\n   */\n  constructor(data, size) {\n    super(data, size, size, size);\n    this.type = FloatType2;\n    this.format = RGBAFormat3;\n    this.minFilter = LinearFilter3;\n    this.magFilter = LinearFilter3;\n    this.wrapS = ClampToEdgeWrapping;\n    this.wrapT = ClampToEdgeWrapping;\n    this.wrapR = ClampToEdgeWrapping;\n    this.unpackAlignment = 1;\n    this.needsUpdate = true;\n    this.colorSpace = LinearSRGBColorSpace3;\n    this.domainMin = new Vector33(0, 0, 0);\n    this.domainMax = new Vector33(1, 1, 1);\n  }\n  /**\n   * Indicates that this is an instance of LookupTexture3D.\n   *\n   * @type {Boolean}\n   * @deprecated\n   */\n  get isLookupTexture3D() {\n    return true;\n  }\n  /**\n   * Scales this LUT up to a given target size using tetrahedral interpolation.\n   *\n   * @param {Number} size - The target sidelength.\n   * @param {Boolean} [transferData=true] - Extra fast mode. Set to false to keep the original data intact.\n   * @return {Promise<LookupTexture>} A promise that resolves with a new LUT upon completion.\n   */\n  scaleUp(size, transferData = true) {\n    const image = this.image;\n    let promise;\n    if (size <= image.width) {\n      promise = Promise.reject(new Error(\"The target size must be greater than the current size\"));\n    } else {\n      promise = new Promise((resolve, reject) => {\n        const workerURL = URL.createObjectURL(new Blob([worker_default], {\n          type: \"text/javascript\"\n        }));\n        const worker = new Worker(workerURL);\n        worker.addEventListener(\"error\", (event) => reject(event.error));\n        worker.addEventListener(\"message\", (event) => {\n          const lut = new _LookupTexture(event.data, size);\n          this.colorSpace = lut.colorSpace;\n          lut.type = this.type;\n          lut.name = this.name;\n          URL.revokeObjectURL(workerURL);\n          resolve(lut);\n        });\n        const transferList = transferData ? [image.data.buffer] : [];\n        worker.postMessage({\n          operation: LUTOperation.SCALE_UP,\n          data: image.data,\n          size\n        }, transferList);\n      });\n    }\n    return promise;\n  }\n  /**\n   * Applies the given LUT to this one.\n   *\n   * @param {LookupTexture} lut - A LUT. Must have the same dimensions, type and format as this LUT.\n   * @return {LookupTexture} This texture.\n   */\n  applyLUT(lut) {\n    const img0 = this.image;\n    const img1 = lut.image;\n    const size0 = Math.min(img0.width, img0.height, img0.depth);\n    const size1 = Math.min(img1.width, img1.height, img1.depth);\n    if (size0 !== size1) {\n      console.error(\"Size mismatch\");\n    } else if (lut.type !== FloatType2 || this.type !== FloatType2) {\n      console.error(\"Both LUTs must be FloatType textures\");\n    } else if (lut.format !== RGBAFormat3 || this.format !== RGBAFormat3) {\n      console.error(\"Both LUTs must be RGBA textures\");\n    } else {\n      const data0 = img0.data;\n      const data1 = img1.data;\n      const size = size0;\n      const sizeSq = size ** 2;\n      const s = size - 1;\n      for (let i = 0, l = size ** 3; i < l; ++i) {\n        const i4 = i * 4;\n        const r = data0[i4 + 0] * s;\n        const g = data0[i4 + 1] * s;\n        const b = data0[i4 + 2] * s;\n        const iRGB = Math.round(r + g * size + b * sizeSq) * 4;\n        data0[i4 + 0] = data1[iRGB + 0];\n        data0[i4 + 1] = data1[iRGB + 1];\n        data0[i4 + 2] = data1[iRGB + 2];\n      }\n      this.needsUpdate = true;\n    }\n    return this;\n  }\n  /**\n   * Converts the LUT data into unsigned byte data.\n   *\n   * This is a lossy operation which should only be performed after all other transformations have been applied.\n   *\n   * @return {LookupTexture} This texture.\n   */\n  convertToUint8() {\n    if (this.type === FloatType2) {\n      const floatData = this.image.data;\n      const uint8Data = new Uint8Array(floatData.length);\n      for (let i = 0, l = floatData.length; i < l; ++i) {\n        uint8Data[i] = floatData[i] * 255 + 0.5;\n      }\n      this.image.data = uint8Data;\n      this.type = UnsignedByteType10;\n      this.needsUpdate = true;\n    }\n    return this;\n  }\n  /**\n   * Converts the LUT data into float data.\n   *\n   * @return {LookupTexture} This texture.\n   */\n  convertToFloat() {\n    if (this.type === UnsignedByteType10) {\n      const uint8Data = this.image.data;\n      const floatData = new Float32Array(uint8Data.length);\n      for (let i = 0, l = uint8Data.length; i < l; ++i) {\n        floatData[i] = uint8Data[i] / 255;\n      }\n      this.image.data = floatData;\n      this.type = FloatType2;\n      this.needsUpdate = true;\n    }\n    return this;\n  }\n  /**\n   * Converts this LUT into RGBA data.\n   *\n   * @deprecated LUTs are RGBA by default since three r137.\n   * @return {LookupTexture} This texture.\n   */\n  convertToRGBA() {\n    console.warn(\"LookupTexture\", \"convertToRGBA() is deprecated, LUTs are now RGBA by default\");\n    return this;\n  }\n  /**\n   * Converts the output of this LUT into sRGB color space.\n   *\n   * @return {LookupTexture} This texture.\n   */\n  convertLinearToSRGB() {\n    const data = this.image.data;\n    if (this.type === FloatType2) {\n      for (let i = 0, l = data.length; i < l; i += 4) {\n        c.fromArray(data, i).convertLinearToSRGB().toArray(data, i);\n      }\n      this.colorSpace = SRGBColorSpace9;\n      this.needsUpdate = true;\n    } else {\n      console.error(\"Color space conversion requires FloatType data\");\n    }\n    return this;\n  }\n  /**\n   * Converts the output of this LUT into linear color space.\n   *\n   * @return {LookupTexture} This texture.\n   */\n  convertSRGBToLinear() {\n    const data = this.image.data;\n    if (this.type === FloatType2) {\n      for (let i = 0, l = data.length; i < l; i += 4) {\n        c.fromArray(data, i).convertSRGBToLinear().toArray(data, i);\n      }\n      this.colorSpace = LinearSRGBColorSpace3;\n      this.needsUpdate = true;\n    } else {\n      console.error(\"Color space conversion requires FloatType data\");\n    }\n    return this;\n  }\n  /**\n   * Converts this LUT into a 2D data texture.\n   *\n   * Please note that custom input domains are not carried over to 2D textures.\n   *\n   * @return {DataTexture} The texture.\n   */\n  toDataTexture() {\n    const width = this.image.width;\n    const height = this.image.height * this.image.depth;\n    const texture = new DataTexture2(this.image.data, width, height);\n    texture.name = this.name;\n    texture.type = this.type;\n    texture.format = this.format;\n    texture.minFilter = LinearFilter3;\n    texture.magFilter = LinearFilter3;\n    texture.wrapS = this.wrapS;\n    texture.wrapT = this.wrapT;\n    texture.generateMipmaps = false;\n    texture.needsUpdate = true;\n    this.colorSpace = texture.colorSpace;\n    return texture;\n  }\n  /**\n   * Creates a new 3D LUT by copying a given LUT.\n   *\n   * Common image-based textures will be converted into 3D data textures.\n   *\n   * @param {Texture} texture - The LUT. Assumed to be cubic.\n   * @return {LookupTexture} A new 3D LUT.\n   */\n  static from(texture) {\n    const image = texture.image;\n    const { width, height } = image;\n    const size = Math.min(width, height);\n    let data;\n    if (image instanceof Image) {\n      const rawImageData = RawImageData.from(image);\n      const src = rawImageData.data;\n      if (width > height) {\n        data = new Uint8Array(src.length);\n        for (let z = 0; z < size; ++z) {\n          for (let y = 0; y < size; ++y) {\n            for (let x = 0; x < size; ++x) {\n              const i4 = (x + z * size + y * size * size) * 4;\n              const j4 = (x + y * size + z * size * size) * 4;\n              data[j4 + 0] = src[i4 + 0];\n              data[j4 + 1] = src[i4 + 1];\n              data[j4 + 2] = src[i4 + 2];\n              data[j4 + 3] = src[i4 + 3];\n            }\n          }\n        }\n      } else {\n        data = new Uint8Array(src.buffer);\n      }\n    } else {\n      data = image.data.slice();\n    }\n    const lut = new _LookupTexture(data, size);\n    lut.type = texture.type;\n    lut.name = texture.name;\n    texture.colorSpace = lut.colorSpace;\n    return lut;\n  }\n  /**\n   * Creates a neutral 3D LUT.\n   *\n   * @param {Number} size - The sidelength.\n   * @return {LookupTexture} A neutral 3D LUT.\n   */\n  static createNeutral(size) {\n    const data = new Float32Array(size ** 3 * 4);\n    const sizeSq = size ** 2;\n    const s = 1 / (size - 1);\n    for (let r = 0; r < size; ++r) {\n      for (let g = 0; g < size; ++g) {\n        for (let b = 0; b < size; ++b) {\n          const i4 = (r + g * size + b * sizeSq) * 4;\n          data[i4 + 0] = r * s;\n          data[i4 + 1] = g * s;\n          data[i4 + 2] = b * s;\n          data[i4 + 3] = 1;\n        }\n      }\n    }\n    const lut = new _LookupTexture(data, size);\n    lut.name = \"neutral\";\n    return lut;\n  }\n};\n\n// src/effects/glsl/lut-3d.frag\nvar lut_3d_default = \"uniform vec3 scale;uniform vec3 offset;\\n#ifdef CUSTOM_INPUT_DOMAIN\\nuniform vec3 domainMin;uniform vec3 domainMax;\\n#endif\\n#ifdef LUT_3D\\n#ifdef LUT_PRECISION_HIGH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler3D lut;\\n#else\\nuniform mediump sampler3D lut;\\n#endif\\n#else\\nuniform lowp sampler3D lut;\\n#endif\\nvec4 applyLUT(const in vec3 rgb){\\n#ifdef TETRAHEDRAL_INTERPOLATION\\nvec3 p=floor(rgb);vec3 f=rgb-p;vec3 v1=(p+0.5)*LUT_TEXEL_WIDTH;vec3 v4=(p+1.5)*LUT_TEXEL_WIDTH;vec3 v2,v3;vec3 frac;if(f.r>=f.g){if(f.g>f.b){frac=f.rgb;v2=vec3(v4.x,v1.y,v1.z);v3=vec3(v4.x,v4.y,v1.z);}else if(f.r>=f.b){frac=f.rbg;v2=vec3(v4.x,v1.y,v1.z);v3=vec3(v4.x,v1.y,v4.z);}else{frac=f.brg;v2=vec3(v1.x,v1.y,v4.z);v3=vec3(v4.x,v1.y,v4.z);}}else{if(f.b>f.g){frac=f.bgr;v2=vec3(v1.x,v1.y,v4.z);v3=vec3(v1.x,v4.y,v4.z);}else if(f.r>=f.b){frac=f.grb;v2=vec3(v1.x,v4.y,v1.z);v3=vec3(v4.x,v4.y,v1.z);}else{frac=f.gbr;v2=vec3(v1.x,v4.y,v1.z);v3=vec3(v1.x,v4.y,v4.z);}}vec4 n1=texture(lut,v1);vec4 n2=texture(lut,v2);vec4 n3=texture(lut,v3);vec4 n4=texture(lut,v4);vec4 weights=vec4(1.0-frac.x,frac.x-frac.y,frac.y-frac.z,frac.z);vec4 result=weights*mat4(vec4(n1.r,n2.r,n3.r,n4.r),vec4(n1.g,n2.g,n3.g,n4.g),vec4(n1.b,n2.b,n3.b,n4.b),vec4(1.0));return vec4(result.rgb,1.0);\\n#else\\nreturn texture(lut,rgb);\\n#endif\\n}\\n#else\\n#ifdef LUT_PRECISION_HIGH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D lut;\\n#else\\nuniform mediump sampler2D lut;\\n#endif\\n#else\\nuniform lowp sampler2D lut;\\n#endif\\nvec4 applyLUT(const in vec3 rgb){float slice=rgb.b*LUT_SIZE;float slice0=floor(slice);float interp=slice-slice0;float centeredInterp=interp-0.5;float slice1=slice0+sign(centeredInterp);\\n#ifdef LUT_STRIP_HORIZONTAL\\nfloat xOffset=clamp(rgb.r*LUT_TEXEL_HEIGHT,LUT_TEXEL_WIDTH*0.5,LUT_TEXEL_HEIGHT-LUT_TEXEL_WIDTH*0.5);vec2 uv0=vec2(slice0*LUT_TEXEL_HEIGHT+xOffset,rgb.g);vec2 uv1=vec2(slice1*LUT_TEXEL_HEIGHT+xOffset,rgb.g);\\n#else\\nfloat yOffset=clamp(rgb.g*LUT_TEXEL_WIDTH,LUT_TEXEL_HEIGHT*0.5,LUT_TEXEL_WIDTH-LUT_TEXEL_HEIGHT*0.5);vec2 uv0=vec2(rgb.r,slice0*LUT_TEXEL_WIDTH+yOffset);vec2 uv1=vec2(rgb.r,slice1*LUT_TEXEL_WIDTH+yOffset);\\n#endif\\nvec4 sample0=texture2D(lut,uv0);vec4 sample1=texture2D(lut,uv1);return mix(sample0,sample1,abs(centeredInterp));}\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 c=inputColor.rgb;\\n#ifdef CUSTOM_INPUT_DOMAIN\\nif(c.r>=domainMin.r&&c.g>=domainMin.g&&c.b>=domainMin.b&&c.r<=domainMax.r&&c.g<=domainMax.g&&c.b<=domainMax.b){c=applyLUT(scale*c+offset).rgb;}else{c=inputColor.rgb;}\\n#else\\n#if !defined(LUT_3D) || defined(TETRAHEDRAL_INTERPOLATION)\\nc=clamp(c,0.0,1.0);\\n#endif\\nc=applyLUT(scale*c+offset).rgb;\\n#endif\\noutputColor=vec4(c,inputColor.a);}\";\n\n// src/effects/LUT3DEffect.js\nvar LUT3DEffect = class extends Effect {\n  /**\n   * Constructs a new color grading effect.\n   *\n   * @param {Texture} lut - The lookup texture.\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {Boolean} [options.tetrahedralInterpolation=false] - Enables or disables tetrahedral interpolation.\n   * @param {ColorSpace} [options.inputColorSpace=SRGBColorSpace] - The input color space.\n   */\n  constructor(lut, {\n    blendFunction = BlendFunction.SRC,\n    tetrahedralInterpolation = false,\n    inputColorSpace = SRGBColorSpace10\n  } = {}) {\n    super(\"LUT3DEffect\", lut_3d_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"lut\", new Uniform26(null)],\n        [\"scale\", new Uniform26(new Vector34())],\n        [\"offset\", new Uniform26(new Vector34())],\n        [\"domainMin\", new Uniform26(null)],\n        [\"domainMax\", new Uniform26(null)]\n      ])\n    });\n    this.tetrahedralInterpolation = tetrahedralInterpolation;\n    this.inputColorSpace = inputColorSpace;\n    this.lut = lut;\n  }\n  /**\n   * The LUT.\n   *\n   * @type {Texture}\n   */\n  get lut() {\n    return this.uniforms.get(\"lut\").value;\n  }\n  set lut(value) {\n    const defines = this.defines;\n    const uniforms = this.uniforms;\n    if (this.lut !== value) {\n      uniforms.get(\"lut\").value = value;\n      if (value !== null) {\n        const image = value.image;\n        const tetrahedralInterpolation = this.tetrahedralInterpolation;\n        defines.clear();\n        defines.set(\"LUT_SIZE\", Math.min(image.width, image.height).toFixed(16));\n        defines.set(\"LUT_TEXEL_WIDTH\", (1 / image.width).toFixed(16));\n        defines.set(\"LUT_TEXEL_HEIGHT\", (1 / image.height).toFixed(16));\n        uniforms.get(\"domainMin\").value = null;\n        uniforms.get(\"domainMax\").value = null;\n        if (value.type === FloatType3 || value.type === HalfFloatType2) {\n          defines.set(\"LUT_PRECISION_HIGH\", \"1\");\n        }\n        if (image.width > image.height) {\n          defines.set(\"LUT_STRIP_HORIZONTAL\", \"1\");\n        } else if (value instanceof Data3DTexture2) {\n          defines.set(\"LUT_3D\", \"1\");\n        }\n        if (value instanceof LookupTexture) {\n          const min = value.domainMin;\n          const max = value.domainMax;\n          if (min.x !== 0 || min.y !== 0 || min.z !== 0 || max.x !== 1 || max.y !== 1 || max.z !== 1) {\n            defines.set(\"CUSTOM_INPUT_DOMAIN\", \"1\");\n            uniforms.get(\"domainMin\").value = min.clone();\n            uniforms.get(\"domainMax\").value = max.clone();\n          }\n        }\n        this.tetrahedralInterpolation = tetrahedralInterpolation;\n      }\n    }\n  }\n  /**\n   * Returns the current LUT.\n   *\n   * @deprecated Use lut instead.\n   * @return {Texture} The LUT.\n   */\n  getLUT() {\n    return this.lut;\n  }\n  /**\n   * Sets the LUT.\n   *\n   * @deprecated Use lut instead.\n   * @param {Texture} value - The LUT.\n   */\n  setLUT(value) {\n    this.lut = value;\n  }\n  /**\n   * Updates the scale and offset for the LUT sampling coordinates.\n   *\n   * @private\n   */\n  updateScaleOffset() {\n    const lut = this.lut;\n    if (lut !== null) {\n      const size = Math.min(lut.image.width, lut.image.height);\n      const scale = this.uniforms.get(\"scale\").value;\n      const offset = this.uniforms.get(\"offset\").value;\n      if (this.tetrahedralInterpolation && lut instanceof Data3DTexture2) {\n        if (this.defines.has(\"CUSTOM_INPUT_DOMAIN\")) {\n          const domainScale = lut.domainMax.clone().sub(lut.domainMin);\n          scale.setScalar(size - 1).divide(domainScale);\n          offset.copy(lut.domainMin).negate().multiply(scale);\n        } else {\n          scale.setScalar(size - 1);\n          offset.setScalar(0);\n        }\n      } else {\n        if (this.defines.has(\"CUSTOM_INPUT_DOMAIN\")) {\n          const domainScale = lut.domainMax.clone().sub(lut.domainMin).multiplyScalar(size);\n          scale.setScalar(size - 1).divide(domainScale);\n          offset.copy(lut.domainMin).negate().multiply(scale).addScalar(1 / (2 * size));\n        } else {\n          scale.setScalar((size - 1) / size);\n          offset.setScalar(1 / (2 * size));\n        }\n      }\n    }\n  }\n  /**\n   * Configures parameters for tetrahedral interpolation.\n   *\n   * @private\n   */\n  configureTetrahedralInterpolation() {\n    const lut = this.lut;\n    if (lut !== null) {\n      lut.minFilter = LinearFilter4;\n      lut.magFilter = LinearFilter4;\n      if (this.tetrahedralInterpolation) {\n        if (lut instanceof Data3DTexture2) {\n          lut.minFilter = NearestFilter2;\n          lut.magFilter = NearestFilter2;\n        } else {\n          console.warn(\"Tetrahedral interpolation requires a 3D texture\");\n        }\n      }\n      lut.needsUpdate = true;\n    }\n  }\n  /**\n   * Indicates whether tetrahedral interpolation is enabled. Requires a 3D LUT, disabled by default.\n   *\n   * Tetrahedral interpolation produces highly accurate results but is slower than hardware interpolation.\n   *\n   * @type {Boolean}\n   */\n  get tetrahedralInterpolation() {\n    return this.defines.has(\"TETRAHEDRAL_INTERPOLATION\");\n  }\n  set tetrahedralInterpolation(value) {\n    if (value) {\n      this.defines.set(\"TETRAHEDRAL_INTERPOLATION\", \"1\");\n    } else {\n      this.defines.delete(\"TETRAHEDRAL_INTERPOLATION\");\n    }\n    this.configureTetrahedralInterpolation();\n    this.updateScaleOffset();\n    this.setChanged();\n  }\n  /**\n   * Enables or disables tetrahedral interpolation.\n   *\n   * @deprecated Use tetrahedralInterpolation instead.\n   * @param {Boolean} value - Whether tetrahedral interpolation should be enabled.\n   */\n  setTetrahedralInterpolationEnabled(value) {\n    this.tetrahedralInterpolation = value;\n  }\n};\n\n// src/enums/DepthCopyMode.js\nvar DepthCopyMode = {\n  FULL: 0,\n  SINGLE: 1\n};\n\n// src/enums/EdgeDetectionMode.js\nvar EdgeDetectionMode = {\n  DEPTH: 0,\n  LUMA: 1,\n  COLOR: 2\n};\n\n// src/enums/PredicationMode.js\nvar PredicationMode = {\n  DISABLED: 0,\n  DEPTH: 1,\n  CUSTOM: 2\n};\n\n// src/enums/SMAAPreset.js\nvar SMAAPreset = {\n  LOW: 0,\n  MEDIUM: 1,\n  HIGH: 2,\n  ULTRA: 3\n};\n\n// src/enums/ToneMappingMode.js\nvar ToneMappingMode = {\n  LINEAR: 0,\n  REINHARD: 1,\n  REINHARD2: 2,\n  REINHARD2_ADAPTIVE: 3,\n  UNCHARTED2: 4,\n  OPTIMIZED_CINEON: 5,\n  CINEON: 5,\n  ACES_FILMIC: 6,\n  AGX: 7,\n  NEUTRAL: 8\n};\n\n// src/enums/VignetteTechnique.js\nvar VignetteTechnique = {\n  DEFAULT: 0,\n  ESKIL: 1\n};\n\n// src/enums/WebGLExtension.js\nvar WebGLExtension = {\n  DERIVATIVES: \"derivatives\",\n  FRAG_DEPTH: \"fragDepth\",\n  DRAW_BUFFERS: \"drawBuffers\",\n  SHADER_TEXTURE_LOD: \"shaderTextureLOD\"\n};\n\n// src/effects/glsl/noise.frag\nvar noise_default = \"void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 noise=vec3(rand(uv*(1.0+time)));\\n#ifdef PREMULTIPLY\\noutputColor=vec4(min(inputColor.rgb*noise,vec3(1.0)),inputColor.a);\\n#else\\noutputColor=vec4(noise,inputColor.a);\\n#endif\\n}\";\n\n// src/effects/NoiseEffect.js\nvar NoiseEffect = class extends Effect {\n  /**\n   * Constructs a new noise effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function of this effect.\n   * @param {Boolean} [options.premultiply=false] - Whether the noise should be multiplied with the input colors prior to blending.\n   */\n  constructor({ blendFunction = BlendFunction.SCREEN, premultiply = false } = {}) {\n    super(\"NoiseEffect\", noise_default, { blendFunction });\n    this.premultiply = premultiply;\n  }\n  /**\n   * Indicates whether noise will be multiplied with the input colors prior to blending.\n   *\n   * @type {Boolean}\n   */\n  get premultiply() {\n    return this.defines.has(\"PREMULTIPLY\");\n  }\n  set premultiply(value) {\n    if (this.premultiply !== value) {\n      if (value) {\n        this.defines.set(\"PREMULTIPLY\", \"1\");\n      } else {\n        this.defines.delete(\"PREMULTIPLY\");\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether noise will be multiplied with the input colors prior to blending.\n   *\n   * @deprecated Use premultiply instead.\n   * @return {Boolean} Whether noise is premultiplied.\n   */\n  isPremultiplied() {\n    return this.premultiply;\n  }\n  /**\n   * Controls whether noise should be multiplied with the input colors prior to blending.\n   *\n   * @deprecated Use premultiply instead.\n   * @param {Boolean} value - Whether noise should be premultiplied.\n   */\n  setPremultiplied(value) {\n    this.premultiply = value;\n  }\n};\n\n// src/effects/OutlineEffect.js\nimport { Color as Color5, RepeatWrapping as RepeatWrapping2, Uniform as Uniform29, UnsignedByteType as UnsignedByteType11, WebGLRenderTarget as WebGLRenderTarget12 } from \"three\";\n\n// src/materials/DepthComparisonMaterial.js\nimport { NoBlending as NoBlending11, PerspectiveCamera as PerspectiveCamera3, RGBADepthPacking, ShaderMaterial as ShaderMaterial12, Uniform as Uniform27 } from \"three\";\n\n// src/materials/glsl/depth-comparison.frag\nvar depth_comparison_default = \"#include <packing>\\n#include <clipping_planes_pars_fragment>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nuniform float cameraNear;uniform float cameraFar;centroid varying float vViewZ;centroid varying vec4 vProjTexCoord;void main(){\\n#include <clipping_planes_fragment>\\nvec2 projTexCoord=(vProjTexCoord.xy/vProjTexCoord.w)*0.5+0.5;projTexCoord=clamp(projTexCoord,0.002,0.998);\\n#if DEPTH_PACKING == 3201\\nfloat fragCoordZ=unpackRGBAToDepth(texture2D(depthBuffer,projTexCoord));\\n#else\\nfloat fragCoordZ=texture2D(depthBuffer,projTexCoord).r;\\n#endif\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(fragCoordZ,cameraNear,cameraFar);\\n#else\\nfloat viewZ=orthographicDepthToViewZ(fragCoordZ,cameraNear,cameraFar);\\n#endif\\nfloat depthTest=(-vViewZ>-viewZ)?1.0:0.0;gl_FragColor.rg=vec2(0.0,depthTest);}\";\n\n// src/materials/glsl/depth-comparison.vert\nvar depth_comparison_default2 = \"#include <common>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying float vViewZ;varying vec4 vProjTexCoord;void main(){\\n#include <skinbase_vertex>\\n#include <begin_vertex>\\n#include <morphtarget_vertex>\\n#include <skinning_vertex>\\n#include <project_vertex>\\nvViewZ=mvPosition.z;vProjTexCoord=gl_Position;\\n#include <clipping_planes_vertex>\\n}\";\n\n// src/materials/DepthComparisonMaterial.js\nvar DepthComparisonMaterial = class extends ShaderMaterial12 {\n  /**\n   * Constructs a new depth comparison material.\n   *\n   * @param {Texture} [depthTexture=null] - A depth texture.\n   * @param {PerspectiveCamera} [camera] - A camera.\n   */\n  constructor(depthTexture = null, camera) {\n    super({\n      name: \"DepthComparisonMaterial\",\n      defines: {\n        DEPTH_PACKING: \"0\"\n      },\n      uniforms: {\n        depthBuffer: new Uniform27(null),\n        cameraNear: new Uniform27(0.3),\n        cameraFar: new Uniform27(1e3)\n      },\n      blending: NoBlending11,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: depth_comparison_default,\n      vertexShader: depth_comparison_default2\n    });\n    this.depthBuffer = depthTexture;\n    this.depthPacking = RGBADepthPacking;\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer.\n   *\n   * @deprecated Use depthBuffer and depthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=RGBADepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = RGBADepthPacking) {\n    this.depthBuffer = buffer;\n    this.depthPacking = depthPacking;\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @deprecated Use copyCameraSettings instead.\n   * @param {Camera} camera - A camera.\n   */\n  adoptCameraSettings(camera) {\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  copyCameraSettings(camera) {\n    if (camera) {\n      this.uniforms.cameraNear.value = camera.near;\n      this.uniforms.cameraFar.value = camera.far;\n      if (camera instanceof PerspectiveCamera3) {\n        this.defines.PERSPECTIVE_CAMERA = \"1\";\n      } else {\n        delete this.defines.PERSPECTIVE_CAMERA;\n      }\n      this.needsUpdate = true;\n    }\n  }\n};\n\n// src/materials/OutlineMaterial.js\nimport { NoBlending as NoBlending12, ShaderMaterial as ShaderMaterial13, Uniform as Uniform28, Vector2 as Vector214 } from \"three\";\n\n// src/materials/glsl/outline.frag\nvar outline_default = \"uniform lowp sampler2D inputBuffer;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 c0=texture2D(inputBuffer,vUv0).rg;vec2 c1=texture2D(inputBuffer,vUv1).rg;vec2 c2=texture2D(inputBuffer,vUv2).rg;vec2 c3=texture2D(inputBuffer,vUv3).rg;float d0=(c0.x-c1.x)*0.5;float d1=(c2.x-c3.x)*0.5;float d=length(vec2(d0,d1));float a0=min(c0.y,c1.y);float a1=min(c2.y,c3.y);float visibilityFactor=min(a0,a1);gl_FragColor.rg=(1.0-visibilityFactor>0.001)?vec2(d,0.0):vec2(0.0,d);}\";\n\n// src/materials/glsl/outline.vert\nvar outline_default2 = \"uniform vec2 texelSize;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 uv=position.xy*0.5+0.5;vUv0=vec2(uv.x+texelSize.x,uv.y);vUv1=vec2(uv.x-texelSize.x,uv.y);vUv2=vec2(uv.x,uv.y+texelSize.y);vUv3=vec2(uv.x,uv.y-texelSize.y);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/OutlineMaterial.js\nvar OutlineMaterial = class extends ShaderMaterial13 {\n  /**\n   * Constructs a new outline material.\n   *\n   * TODO Remove texelSize param.\n   * @param {Vector2} [texelSize] - The screen texel size.\n   */\n  constructor(texelSize = new Vector214()) {\n    super({\n      name: \"OutlineMaterial\",\n      uniforms: {\n        inputBuffer: new Uniform28(null),\n        texelSize: new Uniform28(new Vector214())\n      },\n      blending: NoBlending12,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: outline_default,\n      vertexShader: outline_default2\n    });\n    this.uniforms.texelSize.value.set(texelSize.x, texelSize.y);\n    this.uniforms.maskTexture = this.uniforms.inputBuffer;\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the texel size.\n   *\n   * @deprecated Use setSize() instead.\n   * @param {Number} x - The texel width.\n   * @param {Number} y - The texel height.\n   */\n  setTexelSize(x, y) {\n    this.uniforms.texelSize.value.set(x, y);\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/passes/DepthPass.js\nimport { Color as Color4, MeshDepthMaterial, NearestFilter as NearestFilter3, RGBADepthPacking as RGBADepthPacking2, WebGLRenderTarget as WebGLRenderTarget11 } from \"three\";\nvar DepthPass = class extends Pass {\n  /**\n   * Constructs a new depth pass.\n   *\n   * @param {Scene} scene - The scene to render.\n   * @param {Camera} camera - The camera to use to render the scene.\n   * @param {Object} [options] - The options.\n   * @param {WebGLRenderTarget} [options.renderTarget] - A custom render target.\n   * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor(scene, camera, {\n    renderTarget,\n    resolutionScale = 1,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"DepthPass\");\n    this.needsSwap = false;\n    this.renderPass = new RenderPass(scene, camera, new MeshDepthMaterial({\n      depthPacking: RGBADepthPacking2\n    }));\n    const renderPass = this.renderPass;\n    renderPass.skipShadowMapUpdate = true;\n    renderPass.ignoreBackground = true;\n    const clearPass = renderPass.clearPass;\n    clearPass.overrideClearColor = new Color4(16777215);\n    clearPass.overrideClearAlpha = 1;\n    this.renderTarget = renderTarget;\n    if (this.renderTarget === void 0) {\n      this.renderTarget = new WebGLRenderTarget11(1, 1, {\n        minFilter: NearestFilter3,\n        magFilter: NearestFilter3\n      });\n      this.renderTarget.texture.name = \"DepthPass.Target\";\n    }\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n  }\n  set mainScene(value) {\n    this.renderPass.mainScene = value;\n  }\n  set mainCamera(value) {\n    this.renderPass.mainCamera = value;\n  }\n  /**\n   * The depth texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the depth texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @return {Number} The resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  getResolutionScale() {\n    return this.resolution.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * @param {Number} scale - The new resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  setResolutionScale(scale) {\n    this.resolution.scale = scale;\n  }\n  /**\n   * Renders the scene depth.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const renderTarget = this.renderToScreen ? null : this.renderTarget;\n    this.renderPass.render(renderer, renderTarget);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    this.renderTarget.setSize(resolution.width, resolution.height);\n  }\n};\n\n// src/effects/glsl/outline.frag\nvar outline_default3 = \"uniform lowp sampler2D edgeTexture;uniform lowp sampler2D maskTexture;uniform vec3 visibleEdgeColor;uniform vec3 hiddenEdgeColor;uniform float pulse;uniform float edgeStrength;\\n#ifdef USE_PATTERN\\nuniform lowp sampler2D patternTexture;varying vec2 vUvPattern;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec2 edge=texture2D(edgeTexture,uv).rg;vec2 mask=texture2D(maskTexture,uv).rg;\\n#ifndef X_RAY\\nedge.y=0.0;\\n#endif\\nedge*=(edgeStrength*mask.x*pulse);vec3 color=edge.x*visibleEdgeColor+edge.y*hiddenEdgeColor;float visibilityFactor=0.0;\\n#ifdef USE_PATTERN\\nvec4 patternColor=texture2D(patternTexture,vUvPattern);\\n#ifdef X_RAY\\nfloat hiddenFactor=0.5;\\n#else\\nfloat hiddenFactor=0.0;\\n#endif\\nvisibilityFactor=(1.0-mask.y>0.0)?1.0:hiddenFactor;visibilityFactor*=(1.0-mask.x)*patternColor.a;color+=visibilityFactor*patternColor.rgb;\\n#endif\\nfloat alpha=max(max(edge.x,edge.y),visibilityFactor);\\n#ifdef ALPHA\\noutputColor=vec4(color,alpha);\\n#else\\noutputColor=vec4(color,max(alpha,inputColor.a));\\n#endif\\n}\";\n\n// src/effects/glsl/outline.vert\nvar outline_default4 = \"uniform float patternScale;varying vec2 vUvPattern;void mainSupport(const in vec2 uv){vUvPattern=uv*vec2(aspect,1.0)*patternScale;}\";\n\n// src/effects/OutlineEffect.js\nvar OutlineEffect = class extends Effect {\n  /**\n   * Constructs a new outline effect.\n   *\n   * @param {Scene} scene - The main scene.\n   * @param {Camera} camera - The main camera.\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function. Use `BlendFunction.ALPHA` for dark outlines.\n   * @param {Texture} [options.patternTexture=null] - A pattern texture.\n   * @param {Number} [options.patternScale=1.0] - The pattern scale.\n   * @param {Number} [options.edgeStrength=1.0] - The edge strength.\n   * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect.\n   * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges.\n   * @param {Number} [options.hiddenEdgeColor=0x22090a] - The color of hidden edges.\n   * @param {KernelSize} [options.kernelSize=KernelSize.VERY_SMALL] - The blur kernel size.\n   * @param {Boolean} [options.blur=false] - Whether the outline should be blurred.\n   * @param {Boolean} [options.xRay=true] - Whether occluded parts of selected objects should be visible.\n   * @param {Number} [options.multisampling=0] - The number of samples used for multisample antialiasing. Requires WebGL 2.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor(scene, camera, {\n    blendFunction = BlendFunction.SCREEN,\n    patternTexture = null,\n    patternScale = 1,\n    edgeStrength = 1,\n    pulseSpeed = 0,\n    visibleEdgeColor = 16777215,\n    hiddenEdgeColor = 2230538,\n    kernelSize = KernelSize.VERY_SMALL,\n    blur = false,\n    xRay = true,\n    multisampling = 0,\n    resolutionScale = 0.5,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"OutlineEffect\", outline_default3, {\n      uniforms: /* @__PURE__ */ new Map([\n        [\"maskTexture\", new Uniform29(null)],\n        [\"edgeTexture\", new Uniform29(null)],\n        [\"edgeStrength\", new Uniform29(edgeStrength)],\n        [\"visibleEdgeColor\", new Uniform29(new Color5(visibleEdgeColor))],\n        [\"hiddenEdgeColor\", new Uniform29(new Color5(hiddenEdgeColor))],\n        [\"pulse\", new Uniform29(1)],\n        [\"patternScale\", new Uniform29(patternScale)],\n        [\"patternTexture\", new Uniform29(null)]\n      ])\n    });\n    this.blendMode.addEventListener(\"change\", (event) => {\n      if (this.blendMode.blendFunction === BlendFunction.ALPHA) {\n        this.defines.set(\"ALPHA\", \"1\");\n      } else {\n        this.defines.delete(\"ALPHA\");\n      }\n      this.setChanged();\n    });\n    this.blendMode.blendFunction = blendFunction;\n    this.patternTexture = patternTexture;\n    this.xRay = xRay;\n    this.scene = scene;\n    this.camera = camera;\n    this.renderTargetMask = new WebGLRenderTarget12(1, 1);\n    this.renderTargetMask.samples = multisampling;\n    this.renderTargetMask.texture.name = \"Outline.Mask\";\n    this.uniforms.get(\"maskTexture\").value = this.renderTargetMask.texture;\n    this.renderTargetOutline = new WebGLRenderTarget12(1, 1, { depthBuffer: false });\n    this.renderTargetOutline.texture.name = \"Outline.Edges\";\n    this.uniforms.get(\"edgeTexture\").value = this.renderTargetOutline.texture;\n    this.clearPass = new ClearPass();\n    this.clearPass.overrideClearColor = new Color5(0);\n    this.clearPass.overrideClearAlpha = 1;\n    this.depthPass = new DepthPass(scene, camera);\n    this.maskPass = new RenderPass(scene, camera, new DepthComparisonMaterial(this.depthPass.texture, camera));\n    const clearPass = this.maskPass.clearPass;\n    clearPass.overrideClearColor = new Color5(16777215);\n    clearPass.overrideClearAlpha = 1;\n    this.blurPass = new KawaseBlurPass({ resolutionScale, resolutionX, resolutionY, kernelSize });\n    this.blurPass.enabled = blur;\n    const resolution = this.blurPass.resolution;\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this.outlinePass = new ShaderPass(new OutlineMaterial());\n    const outlineMaterial = this.outlinePass.fullscreenMaterial;\n    outlineMaterial.inputBuffer = this.renderTargetMask.texture;\n    this.time = 0;\n    this.forceUpdate = true;\n    this.selection = new Selection();\n    this.pulseSpeed = pulseSpeed;\n  }\n  set mainScene(value) {\n    this.scene = value;\n    this.depthPass.mainScene = value;\n    this.maskPass.mainScene = value;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n    this.depthPass.mainCamera = value;\n    this.maskPass.mainCamera = value;\n    this.maskPass.overrideMaterial.copyCameraSettings(value);\n  }\n  /**\n   * The resolution of this effect.\n   *\n   * @type {Resolution}\n   */\n  get resolution() {\n    return this.blurPass.resolution;\n  }\n  /**\n   * Returns the resolution.\n   *\n   * @return {Resizer} The resolution.\n   */\n  getResolution() {\n    return this.blurPass.getResolution();\n  }\n  /**\n   * The amount of MSAA samples.\n   *\n   * Requires WebGL 2. Set to zero to disable multisampling.\n   *\n   * @experimental Requires three >= r138.\n   * @type {Number}\n   */\n  get multisampling() {\n    return this.renderTargetMask.samples;\n  }\n  set multisampling(value) {\n    this.renderTargetMask.samples = value;\n    this.renderTargetMask.dispose();\n  }\n  /**\n   * The pattern scale.\n   *\n   * @type {Number}\n   */\n  get patternScale() {\n    return this.uniforms.get(\"patternScale\").value;\n  }\n  set patternScale(value) {\n    this.uniforms.get(\"patternScale\").value = value;\n  }\n  /**\n   * The edge strength.\n   *\n   * @type {Number}\n   */\n  get edgeStrength() {\n    return this.uniforms.get(\"edgeStrength\").value;\n  }\n  set edgeStrength(value) {\n    this.uniforms.get(\"edgeStrength\").value = value;\n  }\n  /**\n   * The visible edge color.\n   *\n   * @type {Color}\n   */\n  get visibleEdgeColor() {\n    return this.uniforms.get(\"visibleEdgeColor\").value;\n  }\n  set visibleEdgeColor(value) {\n    this.uniforms.get(\"visibleEdgeColor\").value = value;\n  }\n  /**\n   * The hidden edge color.\n   *\n   * @type {Color}\n   */\n  get hiddenEdgeColor() {\n    return this.uniforms.get(\"hiddenEdgeColor\").value;\n  }\n  set hiddenEdgeColor(value) {\n    this.uniforms.get(\"hiddenEdgeColor\").value = value;\n  }\n  /**\n   * Returns the blur pass.\n   *\n   * @deprecated Use blurPass instead.\n   * @return {KawaseBlurPass} The blur pass.\n   */\n  getBlurPass() {\n    return this.blurPass;\n  }\n  /**\n   * Returns the selection.\n   *\n   * @deprecated Use selection instead.\n   * @return {Selection} The selection.\n   */\n  getSelection() {\n    return this.selection;\n  }\n  /**\n   * Returns the pulse speed.\n   *\n   * @deprecated Use pulseSpeed instead.\n   * @return {Number} The speed.\n   */\n  getPulseSpeed() {\n    return this.pulseSpeed;\n  }\n  /**\n   * Sets the pulse speed. Set to zero to disable.\n   *\n   * @deprecated Use pulseSpeed instead.\n   * @param {Number} value - The speed.\n   */\n  setPulseSpeed(value) {\n    this.pulseSpeed = value;\n  }\n  /**\n   * The current width of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.width instead.\n   */\n  get width() {\n    return this.resolution.width;\n  }\n  set width(value) {\n    this.resolution.preferredWidth = value;\n  }\n  /**\n   * The current height of the internal render targets.\n   *\n   * @type {Number}\n   * @deprecated Use resolution.height instead.\n   */\n  get height() {\n    return this.resolution.height;\n  }\n  set height(value) {\n    this.resolution.preferredHeight = value;\n  }\n  /**\n   * The selection layer.\n   *\n   * @type {Number}\n   * @deprecated Use selection.layer instead.\n   */\n  get selectionLayer() {\n    return this.selection.layer;\n  }\n  set selectionLayer(value) {\n    this.selection.layer = value;\n  }\n  /**\n   * Indicates whether dithering is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated\n   */\n  get dithering() {\n    return this.blurPass.dithering;\n  }\n  set dithering(value) {\n    this.blurPass.dithering = value;\n  }\n  /**\n   * The blur kernel size.\n   *\n   * @type {KernelSize}\n   * @deprecated Use blurPass.kernelSize instead.\n   */\n  get kernelSize() {\n    return this.blurPass.kernelSize;\n  }\n  set kernelSize(value) {\n    this.blurPass.kernelSize = value;\n  }\n  /**\n   * Indicates whether the outlines should be blurred.\n   *\n   * @type {Boolean}\n   * @deprecated Use blurPass.enabled instead.\n   */\n  get blur() {\n    return this.blurPass.enabled;\n  }\n  set blur(value) {\n    this.blurPass.enabled = value;\n  }\n  /**\n   * Indicates whether X-ray mode is enabled.\n   *\n   * @type {Boolean}\n   */\n  get xRay() {\n    return this.defines.has(\"X_RAY\");\n  }\n  set xRay(value) {\n    if (this.xRay !== value) {\n      if (value) {\n        this.defines.set(\"X_RAY\", \"1\");\n      } else {\n        this.defines.delete(\"X_RAY\");\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether X-ray mode is enabled.\n   *\n   * @deprecated Use xRay instead.\n   * @return {Boolean} Whether X-ray mode is enabled.\n   */\n  isXRayEnabled() {\n    return this.xRay;\n  }\n  /**\n   * Enables or disables X-ray outlines.\n   *\n   * @deprecated Use xRay instead.\n   * @param {Boolean} value - Whether X-ray should be enabled.\n   */\n  setXRayEnabled(value) {\n    this.xRay = value;\n  }\n  /**\n   * The pattern texture. Set to `null` to disable.\n   *\n   * @type {Texture}\n   */\n  get patternTexture() {\n    return this.uniforms.get(\"patternTexture\").value;\n  }\n  set patternTexture(value) {\n    if (value !== null) {\n      value.wrapS = value.wrapT = RepeatWrapping2;\n      this.defines.set(\"USE_PATTERN\", \"1\");\n      this.setVertexShader(outline_default4);\n    } else {\n      this.defines.delete(\"USE_PATTERN\");\n      this.setVertexShader(null);\n    }\n    this.uniforms.get(\"patternTexture\").value = value;\n    this.setChanged();\n  }\n  /**\n   * Sets the pattern texture.\n   *\n   * @deprecated Use patternTexture instead.\n   * @param {Texture} value - The new texture.\n   */\n  setPatternTexture(value) {\n    this.patternTexture = value;\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @return {Number} The resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  getResolutionScale() {\n    return this.resolution.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * @param {Number} scale - The new resolution scale.\n   * @deprecated Use resolution instead.\n   */\n  setResolutionScale(scale) {\n    this.resolution.scale = scale;\n  }\n  /**\n   * Clears the current selection and selects a list of objects.\n   *\n   * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied.\n   * @return {OutlinePass} This pass.\n   * @deprecated Use selection.set() instead.\n   */\n  setSelection(objects) {\n    this.selection.set(objects);\n    return this;\n  }\n  /**\n   * Clears the list of selected objects.\n   *\n   * @return {OutlinePass} This pass.\n   * @deprecated Use selection.clear() instead.\n   */\n  clearSelection() {\n    this.selection.clear();\n    return this;\n  }\n  /**\n   * Selects an object.\n   *\n   * @param {Object3D} object - The object that should be outlined.\n   * @return {OutlinePass} This pass.\n   * @deprecated Use selection.add() instead.\n   */\n  selectObject(object) {\n    this.selection.add(object);\n    return this;\n  }\n  /**\n   * Deselects an object.\n   *\n   * @param {Object3D} object - The object that should no longer be outlined.\n   * @return {OutlinePass} This pass.\n   * @deprecated Use selection.delete() instead.\n   */\n  deselectObject(object) {\n    this.selection.delete(object);\n    return this;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const scene = this.scene;\n    const camera = this.camera;\n    const selection = this.selection;\n    const uniforms = this.uniforms;\n    const pulse = uniforms.get(\"pulse\");\n    const background = scene.background;\n    const mask = camera.layers.mask;\n    if (this.forceUpdate || selection.size > 0) {\n      scene.background = null;\n      pulse.value = 1;\n      if (this.pulseSpeed > 0) {\n        pulse.value = Math.cos(this.time * this.pulseSpeed * 10) * 0.375 + 0.625;\n      }\n      this.time += deltaTime;\n      selection.setVisible(false);\n      this.depthPass.render(renderer);\n      selection.setVisible(true);\n      camera.layers.set(selection.layer);\n      this.maskPass.render(renderer, this.renderTargetMask);\n      camera.layers.mask = mask;\n      scene.background = background;\n      this.outlinePass.render(renderer, null, this.renderTargetOutline);\n      if (this.blurPass.enabled) {\n        this.blurPass.render(renderer, this.renderTargetOutline, this.renderTargetOutline);\n      }\n    }\n    this.forceUpdate = selection.size > 0;\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.blurPass.setSize(width, height);\n    this.renderTargetMask.setSize(width, height);\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.depthPass.setSize(w, h);\n    this.renderTargetOutline.setSize(w, h);\n    this.outlinePass.fullscreenMaterial.setSize(w, h);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.blurPass.initialize(renderer, alpha, UnsignedByteType11);\n    if (frameBufferType !== void 0) {\n      this.depthPass.initialize(renderer, alpha, frameBufferType);\n      this.maskPass.initialize(renderer, alpha, frameBufferType);\n      this.outlinePass.initialize(renderer, alpha, frameBufferType);\n    }\n  }\n};\n\n// src/effects/PixelationEffect.js\nimport { Uniform as Uniform30, Vector2 as Vector215, Vector4 as Vector42 } from \"three\";\n\n// src/effects/glsl/pixelation.frag\nvar pixelation_default = \"uniform bool active;uniform vec4 d;void mainUv(inout vec2 uv){if(active){uv=d.xy*(floor(uv*d.zw)+0.5);}}\";\n\n// src/effects/PixelationEffect.js\nvar PixelationEffect = class extends Effect {\n  /**\n   * Constructs a new pixelation effect.\n   *\n   * @param {Object} [granularity=30.0] - The pixel granularity.\n   */\n  constructor(granularity = 30) {\n    super(\"PixelationEffect\", pixelation_default, {\n      uniforms: /* @__PURE__ */ new Map([\n        [\"active\", new Uniform30(false)],\n        [\"d\", new Uniform30(new Vector42())]\n      ])\n    });\n    this.resolution = new Vector215();\n    this._granularity = 0;\n    this.granularity = granularity;\n  }\n  /**\n   * The pixel granularity.\n   *\n   * A higher value yields coarser visuals.\n   *\n   * @type {Number}\n   */\n  get granularity() {\n    return this._granularity;\n  }\n  set granularity(value) {\n    let d = Math.floor(value);\n    if (d % 2 > 0) {\n      d += 1;\n    }\n    this._granularity = d;\n    this.uniforms.get(\"active\").value = d > 0;\n    this.setSize(this.resolution.width, this.resolution.height);\n  }\n  /**\n   * Returns the pixel granularity.\n   *\n   * @deprecated Use granularity instead.\n   * @return {Number} The granularity.\n   */\n  getGranularity() {\n    return this.granularity;\n  }\n  /**\n   * Sets the pixel granularity.\n   *\n   * @deprecated Use granularity instead.\n   * @param {Number} value - The new granularity.\n   */\n  setGranularity(value) {\n    this.granularity = value;\n  }\n  /**\n   * Updates the granularity.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.set(width, height);\n    const d = this.granularity;\n    const x = d / resolution.x;\n    const y = d / resolution.y;\n    this.uniforms.get(\"d\").value.set(x, y, 1 / x, 1 / y);\n  }\n};\n\n// src/effects/RealisticBokehEffect.js\nimport { Uniform as Uniform31, Vector4 as Vector43 } from \"three\";\n\n// src/effects/glsl/realistic-bokeh.frag\nvar realistic_bokeh_default = \"uniform float focus;uniform float focalLength;uniform float fStop;uniform float maxBlur;uniform float luminanceThreshold;uniform float luminanceGain;uniform float bias;uniform float fringe;\\n#ifdef MANUAL_DOF\\nuniform vec4 dof;\\n#endif\\n#ifdef PENTAGON\\nfloat pentagon(const in vec2 coords){const vec4 HS0=vec4(1.0,0.0,0.0,1.0);const vec4 HS1=vec4(0.309016994,0.951056516,0.0,1.0);const vec4 HS2=vec4(-0.809016994,0.587785252,0.0,1.0);const vec4 HS3=vec4(-0.809016994,-0.587785252,0.0,1.0);const vec4 HS4=vec4(0.309016994,-0.951056516,0.0,1.0);const vec4 HS5=vec4(0.0,0.0,1.0,1.0);const vec4 ONE=vec4(1.0);const float P_FEATHER=0.4;const float N_FEATHER=-P_FEATHER;float inOrOut=-4.0;vec4 P=vec4(coords,vec2(RINGS_FLOAT-1.3));vec4 dist=vec4(dot(P,HS0),dot(P,HS1),dot(P,HS2),dot(P,HS3));dist=smoothstep(N_FEATHER,P_FEATHER,dist);inOrOut+=dot(dist,ONE);dist.x=dot(P,HS4);dist.y=HS5.w-abs(P.z);dist=smoothstep(N_FEATHER,P_FEATHER,dist);inOrOut+=dist.x;return clamp(inOrOut,0.0,1.0);}\\n#endif\\nvec3 processTexel(const in vec2 coords,const in float blur){vec2 scale=texelSize*fringe*blur;vec3 c=vec3(texture2D(inputBuffer,coords+vec2(0.0,1.0)*scale).r,texture2D(inputBuffer,coords+vec2(-0.866,-0.5)*scale).g,texture2D(inputBuffer,coords+vec2(0.866,-0.5)*scale).b);float luminance=linearToRelativeLuminance(c);float threshold=max((luminance-luminanceThreshold)*luminanceGain,0.0);return c+mix(vec3(0.0),c,threshold*blur);}float gather(const in float i,const in float j,const in float ringSamples,const in vec2 uv,const in vec2 blurFactor,const in float blur,inout vec3 color){float step=PI2/ringSamples;vec2 wh=vec2(cos(j*step)*i,sin(j*step)*i);\\n#ifdef PENTAGON\\nfloat p=pentagon(wh);\\n#else\\nfloat p=1.0;\\n#endif\\ncolor+=processTexel(wh*blurFactor+uv,blur)*mix(1.0,i/RINGS_FLOAT,bias)*p;return mix(1.0,i/RINGS_FLOAT,bias)*p;}void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(depth,cameraNear,cameraFar);float linearDepth=viewZToOrthographicDepth(viewZ,cameraNear,cameraFar);\\n#else\\nfloat linearDepth=depth;\\n#endif\\n#ifdef MANUAL_DOF\\nfloat focalPlane=linearDepth-focus;float farDoF=(focalPlane-dof.z)/dof.w;float nearDoF=(-focalPlane-dof.x)/dof.y;float blur=(focalPlane>0.0)?farDoF:nearDoF;\\n#else\\nconst float CIRCLE_OF_CONFUSION=0.03;float focalPlaneMM=focus*1000.0;float depthMM=linearDepth*1000.0;float focalPlane=(depthMM*focalLength)/(depthMM-focalLength);float farDoF=(focalPlaneMM*focalLength)/(focalPlaneMM-focalLength);float nearDoF=(focalPlaneMM-focalLength)/(focalPlaneMM*fStop*CIRCLE_OF_CONFUSION);float blur=abs(focalPlane-farDoF)*nearDoF;\\n#endif\\nconst int MAX_RING_SAMPLES=RINGS_INT*SAMPLES_INT;blur=clamp(blur,0.0,1.0);vec3 color=inputColor.rgb;if(blur>=0.05){vec2 blurFactor=blur*maxBlur*texelSize;float s=1.0;int ringSamples;for(int i=1;i<=RINGS_INT;i++){ringSamples=i*SAMPLES_INT;for(int j=0;j<MAX_RING_SAMPLES;j++){if(j>=ringSamples){break;}s+=gather(float(i),float(j),float(ringSamples),uv,blurFactor,blur,color);}}color/=s;}\\n#ifdef SHOW_FOCUS\\nfloat edge=0.002*linearDepth;float m=clamp(smoothstep(0.0,edge,blur),0.0,1.0);float e=clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);color=mix(color,vec3(1.0,0.5,0.0),(1.0-m)*0.6);color=mix(color,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);\\n#endif\\noutputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/RealisticBokehEffect.js\nvar RealisticBokehEffect = class extends Effect {\n  /**\n   * Constructs a new bokeh effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.focus=1.0] - The focus distance in world units.\n   * @param {Number} [options.focalLength=24.0] - The focal length of the main camera.\n   * @param {Number} [options.fStop=0.9] - The ratio of the lens focal length to the diameter of the entrance pupil (aperture).\n   * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold.\n   * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor.\n   * @param {Number} [options.bias=0.5] - A blur bias.\n   * @param {Number} [options.fringe=0.7] - A blur offset.\n   * @param {Number} [options.maxBlur=1.0] - The maximum blur strength.\n   * @param {Boolean} [options.rings=3] - The number of blur iterations.\n   * @param {Boolean} [options.samples=2] - The amount of samples taken per ring.\n   * @param {Boolean} [options.showFocus=false] - Whether the focal point should be highlighted. Useful for debugging.\n   * @param {Boolean} [options.manualDoF=false] - Enables manual control over the depth of field.\n   * @param {Boolean} [options.pentagon=false] - Enables pentagonal blur shapes. Requires a high number of rings and samples.\n   */\n  constructor({\n    blendFunction,\n    focus = 1,\n    focalLength = 24,\n    fStop = 0.9,\n    luminanceThreshold = 0.5,\n    luminanceGain = 2,\n    bias = 0.5,\n    fringe = 0.7,\n    maxBlur = 1,\n    rings = 3,\n    samples = 2,\n    showFocus = false,\n    manualDoF = false,\n    pentagon = false\n  } = {}) {\n    super(\"RealisticBokehEffect\", realistic_bokeh_default, {\n      blendFunction,\n      attributes: EffectAttribute.CONVOLUTION | EffectAttribute.DEPTH,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"focus\", new Uniform31(focus)],\n        [\"focalLength\", new Uniform31(focalLength)],\n        [\"fStop\", new Uniform31(fStop)],\n        [\"luminanceThreshold\", new Uniform31(luminanceThreshold)],\n        [\"luminanceGain\", new Uniform31(luminanceGain)],\n        [\"bias\", new Uniform31(bias)],\n        [\"fringe\", new Uniform31(fringe)],\n        [\"maxBlur\", new Uniform31(maxBlur)],\n        [\"dof\", new Uniform31(null)]\n      ])\n    });\n    this.rings = rings;\n    this.samples = samples;\n    this.showFocus = showFocus;\n    this.manualDoF = manualDoF;\n    this.pentagon = pentagon;\n  }\n  /**\n   * The amount of blur iterations.\n   *\n   * @type {Number}\n   */\n  get rings() {\n    return Number.parseInt(this.defines.get(\"RINGS_INT\"));\n  }\n  set rings(value) {\n    const r = Math.floor(value);\n    this.defines.set(\"RINGS_INT\", r.toFixed(0));\n    this.defines.set(\"RINGS_FLOAT\", r.toFixed(1));\n    this.setChanged();\n  }\n  /**\n   * The amount of blur samples per ring.\n   *\n   * @type {Number}\n   */\n  get samples() {\n    return Number.parseInt(this.defines.get(\"SAMPLES_INT\"));\n  }\n  set samples(value) {\n    const s = Math.floor(value);\n    this.defines.set(\"SAMPLES_INT\", s.toFixed(0));\n    this.defines.set(\"SAMPLES_FLOAT\", s.toFixed(1));\n    this.setChanged();\n  }\n  /**\n   * Indicates whether the focal point will be highlighted.\n   *\n   * @type {Boolean}\n   */\n  get showFocus() {\n    return this.defines.has(\"SHOW_FOCUS\");\n  }\n  set showFocus(value) {\n    if (this.showFocus !== value) {\n      if (value) {\n        this.defines.set(\"SHOW_FOCUS\", \"1\");\n      } else {\n        this.defines.delete(\"SHOW_FOCUS\");\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether the Depth of Field should be calculated manually.\n   *\n   * If enabled, the Depth of Field can be adjusted via the `dof` uniform.\n   *\n   * @type {Boolean}\n   */\n  get manualDoF() {\n    return this.defines.has(\"MANUAL_DOF\");\n  }\n  set manualDoF(value) {\n    if (this.manualDoF !== value) {\n      if (value) {\n        this.defines.set(\"MANUAL_DOF\", \"1\");\n        this.uniforms.get(\"dof\").value = new Vector43(0.2, 1, 0.2, 2);\n      } else {\n        this.defines.delete(\"MANUAL_DOF\");\n        this.uniforms.get(\"dof\").value = null;\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether the blur shape should be pentagonal.\n   *\n   * @type {Boolean}\n   */\n  get pentagon() {\n    return this.defines.has(\"PENTAGON\");\n  }\n  set pentagon(value) {\n    if (this.pentagon !== value) {\n      if (value) {\n        this.defines.set(\"PENTAGON\", \"1\");\n      } else {\n        this.defines.delete(\"PENTAGON\");\n      }\n      this.setChanged();\n    }\n  }\n};\n\n// src/effects/ScanlineEffect.js\nimport { Uniform as Uniform32, Vector2 as Vector216 } from \"three\";\n\n// src/effects/glsl/scanlines.frag\nvar scanlines_default = \"uniform float count;\\n#ifdef SCROLL\\nuniform float scrollSpeed;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){float y=uv.y;\\n#ifdef SCROLL\\ny+=time*scrollSpeed;\\n#endif\\nvec2 sl=vec2(sin(y*count),cos(y*count));outputColor=vec4(sl.xyx,inputColor.a);}\";\n\n// src/effects/ScanlineEffect.js\nvar ScanlineEffect = class extends Effect {\n  /**\n   * Constructs a new scanline effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.OVERLAY] - The blend function of this effect.\n   * @param {Number} [options.density=1.25] - The scanline density.\n   * @param {Number} [options.scrollSpeed=0.0] - The scanline scroll speed.\n   */\n  constructor({ blendFunction = BlendFunction.OVERLAY, density = 1.25, scrollSpeed = 0 } = {}) {\n    super(\"ScanlineEffect\", scanlines_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"count\", new Uniform32(0)],\n        [\"scrollSpeed\", new Uniform32(0)]\n      ])\n    });\n    this.resolution = new Vector216();\n    this.d = density;\n    this.scrollSpeed = scrollSpeed;\n  }\n  /**\n   * The scanline density.\n   *\n   * @type {Number}\n   */\n  get density() {\n    return this.d;\n  }\n  set density(value) {\n    this.d = value;\n    this.setSize(this.resolution.width, this.resolution.height);\n  }\n  /**\n   * Returns the current scanline density.\n   *\n   * @deprecated Use density instead.\n   * @return {Number} The scanline density.\n   */\n  getDensity() {\n    return this.density;\n  }\n  /**\n   * Sets the scanline density.\n   *\n   * @deprecated Use density instead.\n   * @param {Number} value - The new scanline density.\n   */\n  setDensity(value) {\n    this.density = value;\n  }\n  /**\n   * The scanline scroll speed. Default is 0 (disabled).\n   *\n   * @type {Number}\n   */\n  get scrollSpeed() {\n    return this.uniforms.get(\"scrollSpeed\").value;\n  }\n  set scrollSpeed(value) {\n    this.uniforms.get(\"scrollSpeed\").value = value;\n    if (value === 0) {\n      if (this.defines.delete(\"SCROLL\")) {\n        this.setChanged();\n      }\n    } else if (!this.defines.has(\"SCROLL\")) {\n      this.defines.set(\"SCROLL\", \"1\");\n      this.setChanged();\n    }\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.resolution.set(width, height);\n    this.uniforms.get(\"count\").value = Math.round(height * this.density);\n  }\n};\n\n// src/effects/ShockWaveEffect.js\nimport { Uniform as Uniform33, Vector2 as Vector217, Vector3 as Vector35 } from \"three\";\n\n// src/effects/glsl/shock-wave.frag\nvar shock_wave_default = \"uniform bool active;uniform vec2 center;uniform float waveSize;uniform float radius;uniform float maxRadius;uniform float amplitude;varying float vSize;void mainUv(inout vec2 uv){if(active){vec2 aspectCorrection=vec2(aspect,1.0);vec2 difference=uv*aspectCorrection-center*aspectCorrection;float distance=sqrt(dot(difference,difference))*vSize;if(distance>radius){if(distance<radius+waveSize){float angle=(distance-radius)*PI2/waveSize;float cosSin=(1.0-cos(angle))*0.5;float extent=maxRadius+waveSize;float decay=max(extent-distance*distance,0.0)/extent;uv-=((cosSin*amplitude*difference)/distance)*decay;}}}}\";\n\n// src/effects/glsl/shock-wave.vert\nvar shock_wave_default2 = \"uniform float size;uniform float cameraDistance;varying float vSize;void mainSupport(){vSize=(0.1*cameraDistance)/size;}\";\n\n// src/effects/ShockWaveEffect.js\nvar HALF_PI = Math.PI * 0.5;\nvar v2 = /* @__PURE__ */ new Vector35();\nvar ab = /* @__PURE__ */ new Vector35();\nvar ShockWaveEffect = class extends Effect {\n  /**\n   * Constructs a new shock wave effect.\n   *\n   * @param {Camera} camera - The main camera.\n   * @param {Vector3} [position] - The world position of the shock wave.\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.speed=2.0] - The animation speed.\n   * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave.\n   * @param {Number} [options.waveSize=0.2] - The wave size.\n   * @param {Number} [options.amplitude=0.05] - The distortion amplitude.\n   */\n  constructor(camera, position = new Vector35(), {\n    speed = 2,\n    maxRadius = 1,\n    waveSize = 0.2,\n    amplitude = 0.05\n  } = {}) {\n    super(\"ShockWaveEffect\", shock_wave_default, {\n      vertexShader: shock_wave_default2,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"active\", new Uniform33(false)],\n        [\"center\", new Uniform33(new Vector217(0.5, 0.5))],\n        [\"cameraDistance\", new Uniform33(1)],\n        [\"size\", new Uniform33(1)],\n        [\"radius\", new Uniform33(-waveSize)],\n        [\"maxRadius\", new Uniform33(maxRadius)],\n        [\"waveSize\", new Uniform33(waveSize)],\n        [\"amplitude\", new Uniform33(amplitude)]\n      ])\n    });\n    this.position = position;\n    this.speed = speed;\n    this.camera = camera;\n    this.screenPosition = this.uniforms.get(\"center\").value;\n    this.time = 0;\n    this.active = false;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n  }\n  /**\n   * The amplitude.\n   *\n   * @type {Number}\n   */\n  get amplitude() {\n    return this.uniforms.get(\"amplitude\").value;\n  }\n  set amplitude(value) {\n    this.uniforms.get(\"amplitude\").value = value;\n  }\n  /**\n   * The wave size.\n   *\n   * @type {Number}\n   */\n  get waveSize() {\n    return this.uniforms.get(\"waveSize\").value;\n  }\n  set waveSize(value) {\n    this.uniforms.get(\"waveSize\").value = value;\n  }\n  /**\n   * The maximum radius.\n   *\n   * @type {Number}\n   */\n  get maxRadius() {\n    return this.uniforms.get(\"maxRadius\").value;\n  }\n  set maxRadius(value) {\n    this.uniforms.get(\"maxRadius\").value = value;\n  }\n  /**\n   * The position of the shock wave.\n   *\n   * @type {Vector3}\n   * @deprecated Use position instead.\n   */\n  get epicenter() {\n    return this.position;\n  }\n  set epicenter(value) {\n    this.position = value;\n  }\n  /**\n   * Returns the position of the shock wave.\n   *\n   * @deprecated Use position instead.\n   * @return {Vector3} The position.\n   */\n  getPosition() {\n    return this.position;\n  }\n  /**\n   * Sets the position of the shock wave.\n   *\n   * @deprecated Use position instead.\n   * @param {Vector3} value - The position.\n   */\n  setPosition(value) {\n    this.position = value;\n  }\n  /**\n   * Returns the speed of the shock wave.\n   *\n   * @deprecated Use speed instead.\n   * @return {Number} The speed.\n   */\n  getSpeed() {\n    return this.speed;\n  }\n  /**\n   * Sets the speed of the shock wave.\n   *\n   * @deprecated Use speed instead.\n   * @param {Number} value - The speed.\n   */\n  setSpeed(value) {\n    this.speed = value;\n  }\n  /**\n   * Emits the shock wave.\n   */\n  explode() {\n    this.time = 0;\n    this.active = true;\n    this.uniforms.get(\"active\").value = true;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [delta] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, delta) {\n    const position = this.position;\n    const camera = this.camera;\n    const uniforms = this.uniforms;\n    const uActive = uniforms.get(\"active\");\n    if (this.active) {\n      const waveSize = uniforms.get(\"waveSize\").value;\n      camera.getWorldDirection(v2);\n      ab.copy(camera.position).sub(position);\n      uActive.value = v2.angleTo(ab) > HALF_PI;\n      if (uActive.value) {\n        uniforms.get(\"cameraDistance\").value = camera.position.distanceTo(position);\n        v2.copy(position).project(camera);\n        this.screenPosition.set((v2.x + 1) * 0.5, (v2.y + 1) * 0.5);\n      }\n      this.time += delta * this.speed;\n      const radius = this.time - waveSize;\n      uniforms.get(\"radius\").value = radius;\n      if (radius >= (uniforms.get(\"maxRadius\").value + waveSize) * 2) {\n        this.active = false;\n        uActive.value = false;\n      }\n    }\n  }\n};\n\n// src/effects/SelectiveBloomEffect.js\nimport {\n  BasicDepthPacking as BasicDepthPacking7,\n  Color as Color6,\n  NotEqualDepth as NotEqualDepth2,\n  EqualDepth as EqualDepth2,\n  RGBADepthPacking as RGBADepthPacking3,\n  SRGBColorSpace as SRGBColorSpace11,\n  WebGLRenderTarget as WebGLRenderTarget13\n} from \"three\";\nvar SelectiveBloomEffect = class extends BloomEffect {\n  /**\n   * Constructs a new selective bloom effect.\n   *\n   * @param {Scene} scene - The main scene.\n   * @param {Camera} camera - The main camera.\n   * @param {Object} [options] - The options. See {@link BloomEffect} for details.\n   */\n  constructor(scene, camera, options) {\n    super(options);\n    this.setAttributes(this.getAttributes() | EffectAttribute.DEPTH);\n    this.camera = camera;\n    this.depthPass = new DepthPass(scene, camera);\n    this.clearPass = new ClearPass(true, false, false);\n    this.clearPass.overrideClearColor = new Color6(0);\n    this.depthMaskPass = new ShaderPass(new DepthMaskMaterial());\n    const depthMaskMaterial = this.depthMaskMaterial;\n    depthMaskMaterial.copyCameraSettings(camera);\n    depthMaskMaterial.depthBuffer1 = this.depthPass.texture;\n    depthMaskMaterial.depthPacking1 = RGBADepthPacking3;\n    depthMaskMaterial.depthMode = EqualDepth2;\n    this.renderTargetMasked = new WebGLRenderTarget13(1, 1, { depthBuffer: false });\n    this.renderTargetMasked.texture.name = \"Bloom.Masked\";\n    this.selection = new Selection();\n    this._inverted = false;\n    this._ignoreBackground = false;\n  }\n  set mainScene(value) {\n    this.depthPass.mainScene = value;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n    this.depthPass.mainCamera = value;\n    this.depthMaskMaterial.copyCameraSettings(value);\n  }\n  /**\n   * Returns the selection.\n   *\n   * @deprecated Use selection instead.\n   * @return {Selection} The selection.\n   */\n  getSelection() {\n    return this.selection;\n  }\n  /**\n   * The depth mask material.\n   *\n   * @type {DepthMaskMaterial}\n   * @private\n   */\n  get depthMaskMaterial() {\n    return this.depthMaskPass.fullscreenMaterial;\n  }\n  /**\n   * Indicates whether the selection should be considered inverted.\n   *\n   * @type {Boolean}\n   */\n  get inverted() {\n    return this._inverted;\n  }\n  set inverted(value) {\n    this._inverted = value;\n    this.depthMaskMaterial.depthMode = value ? NotEqualDepth2 : EqualDepth2;\n  }\n  /**\n   * Indicates whether the mask is inverted.\n   *\n   * @deprecated Use inverted instead.\n   * @return {Boolean} Whether the mask is inverted.\n   */\n  isInverted() {\n    return this.inverted;\n  }\n  /**\n   * Enables or disable mask inversion.\n   *\n   * @deprecated Use inverted instead.\n   * @param {Boolean} value - Whether the mask should be inverted.\n   */\n  setInverted(value) {\n    this.inverted = value;\n  }\n  /**\n   * Indicates whether the background colors will be ignored.\n   *\n   * @type {Boolean}\n   */\n  get ignoreBackground() {\n    return this._ignoreBackground;\n  }\n  set ignoreBackground(value) {\n    this._ignoreBackground = value;\n    this.depthMaskMaterial.maxDepthStrategy = value ? DepthTestStrategy.DISCARD_MAX_DEPTH : DepthTestStrategy.KEEP_MAX_DEPTH;\n  }\n  /**\n   * Indicates whether the background is disabled.\n   *\n   * @deprecated Use ignoreBackground instead.\n   * @return {Boolean} Whether the background is disabled.\n   */\n  isBackgroundDisabled() {\n    return this.ignoreBackground;\n  }\n  /**\n   * Enables or disables the background.\n   *\n   * @deprecated Use ignoreBackground instead.\n   * @param {Boolean} value - Whether the background should be disabled.\n   */\n  setBackgroundDisabled(value) {\n    this.ignoreBackground = value;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking7) {\n    this.depthMaskMaterial.depthBuffer0 = depthTexture;\n    this.depthMaskMaterial.depthPacking0 = depthPacking;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const camera = this.camera;\n    const selection = this.selection;\n    const inverted = this.inverted;\n    let renderTarget = inputBuffer;\n    if (this.ignoreBackground || !inverted || selection.size > 0) {\n      const mask = camera.layers.mask;\n      camera.layers.set(selection.layer);\n      this.depthPass.render(renderer);\n      camera.layers.mask = mask;\n      renderTarget = this.renderTargetMasked;\n      this.clearPass.render(renderer, renderTarget);\n      this.depthMaskPass.render(renderer, inputBuffer, renderTarget);\n    }\n    super.update(renderer, renderTarget, deltaTime);\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    super.setSize(width, height);\n    this.renderTargetMasked.setSize(width, height);\n    this.depthPass.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    super.initialize(renderer, alpha, frameBufferType);\n    this.clearPass.initialize(renderer, alpha, frameBufferType);\n    this.depthPass.initialize(renderer, alpha, frameBufferType);\n    this.depthMaskPass.initialize(renderer, alpha, frameBufferType);\n    if (renderer !== null && renderer.capabilities.logarithmicDepthBuffer) {\n      this.depthMaskPass.fullscreenMaterial.defines.LOG_DEPTH = \"1\";\n    }\n    if (frameBufferType !== void 0) {\n      this.renderTargetMasked.texture.type = frameBufferType;\n      if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace11) {\n        this.renderTargetMasked.texture.colorSpace = SRGBColorSpace11;\n      }\n    }\n  }\n};\n\n// src/effects/SepiaEffect.js\nimport { Uniform as Uniform34, Vector3 as Vector36 } from \"three\";\n\n// src/effects/glsl/sepia.frag\nvar sepia_default = \"uniform vec3 weightsR;uniform vec3 weightsG;uniform vec3 weightsB;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=vec3(dot(inputColor.rgb,weightsR),dot(inputColor.rgb,weightsG),dot(inputColor.rgb,weightsB));outputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/SepiaEffect.js\nvar SepiaEffect = class extends Effect {\n  /**\n   * Constructs a new sepia effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.intensity=1.0] - The intensity of the effect.\n   */\n  constructor({ blendFunction, intensity = 1 } = {}) {\n    super(\"SepiaEffect\", sepia_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"weightsR\", new Uniform34(new Vector36(0.393, 0.769, 0.189))],\n        [\"weightsG\", new Uniform34(new Vector36(0.349, 0.686, 0.168))],\n        [\"weightsB\", new Uniform34(new Vector36(0.272, 0.534, 0.131))]\n      ])\n    });\n  }\n  /**\n   * The intensity.\n   *\n   * @deprecated Use blendMode.opacity instead.\n   * @type {Number}\n   */\n  get intensity() {\n    return this.blendMode.opacity.value;\n  }\n  set intensity(value) {\n    this.blendMode.opacity.value = value;\n  }\n  /**\n   * Returns the current sepia intensity.\n   *\n   * @deprecated Use blendMode.opacity instead.\n   * @return {Number} The intensity.\n   */\n  getIntensity() {\n    return this.intensity;\n  }\n  /**\n   * Sets the sepia intensity.\n   *\n   * @deprecated Use blendMode.opacity instead.\n   * @param {Number} value - The intensity.\n   */\n  setIntensity(value) {\n    this.intensity = value;\n  }\n  /**\n   * The weights for the red channel. Default is `(0.393, 0.769, 0.189)`.\n   *\n   * @type {Vector3}\n   */\n  get weightsR() {\n    return this.uniforms.get(\"weightsR\").value;\n  }\n  /**\n   * The weights for the green channel. Default is `(0.349, 0.686, 0.168)`.\n   *\n   * @type {Vector3}\n   */\n  get weightsG() {\n    return this.uniforms.get(\"weightsG\").value;\n  }\n  /**\n   * The weights for the blue channel. Default is `(0.272, 0.534, 0.131)`.\n   *\n   * @type {Vector3}\n   */\n  get weightsB() {\n    return this.uniforms.get(\"weightsB\").value;\n  }\n};\n\n// src/effects/SMAAEffect.js\nimport {\n  BasicDepthPacking as BasicDepthPacking9,\n  Color as Color7,\n  LinearFilter as LinearFilter5,\n  LoadingManager,\n  NearestFilter as NearestFilter4,\n  Texture as Texture3,\n  Uniform as Uniform37,\n  WebGLRenderTarget as WebGLRenderTarget14\n} from \"three\";\n\n// src/materials/EdgeDetectionMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking8, NoBlending as NoBlending13, REVISION as REVISION2, ShaderMaterial as ShaderMaterial14, Uniform as Uniform35, Vector2 as Vector218 } from \"three\";\n\n// src/materials/glsl/edge-detection.frag\nvar edge_detection_default = \"varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;\\n#if EDGE_DETECTION_MODE != 0\\nvarying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;\\n#endif\\n#if EDGE_DETECTION_MODE == 1\\n#include <common>\\n#endif\\n#if EDGE_DETECTION_MODE == 0 || PREDICATION_MODE == 1\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}vec3 gatherNeighbors(){float p=readDepth(vUv);float pLeft=readDepth(vUv0);float pTop=readDepth(vUv1);return vec3(p,pLeft,pTop);}\\n#elif PREDICATION_MODE == 2\\nuniform sampler2D predicationBuffer;vec3 gatherNeighbors(){float p=texture2D(predicationBuffer,vUv).r;float pLeft=texture2D(predicationBuffer,vUv0).r;float pTop=texture2D(predicationBuffer,vUv1).r;return vec3(p,pLeft,pTop);}\\n#endif\\n#if PREDICATION_MODE != 0\\nvec2 calculatePredicatedThreshold(){vec3 neighbours=gatherNeighbors();vec2 delta=abs(neighbours.xx-neighbours.yz);vec2 edges=step(PREDICATION_THRESHOLD,delta);return PREDICATION_SCALE*EDGE_THRESHOLD*(1.0-PREDICATION_STRENGTH*edges);}\\n#endif\\n#if EDGE_DETECTION_MODE != 0\\nuniform sampler2D inputBuffer;\\n#endif\\nvoid main(){\\n#if EDGE_DETECTION_MODE == 0\\nconst vec2 threshold=vec2(DEPTH_THRESHOLD);\\n#elif PREDICATION_MODE != 0\\nvec2 threshold=calculatePredicatedThreshold();\\n#else\\nconst vec2 threshold=vec2(EDGE_THRESHOLD);\\n#endif\\n#if EDGE_DETECTION_MODE == 0\\nvec3 neighbors=gatherNeighbors();vec2 delta=abs(neighbors.xx-vec2(neighbors.y,neighbors.z));vec2 edges=step(threshold,delta);if(dot(edges,vec2(1.0))==0.0){discard;}gl_FragColor=vec4(edges,0.0,1.0);\\n#elif EDGE_DETECTION_MODE == 1\\nfloat l=luminance(texture2D(inputBuffer,vUv).rgb);float lLeft=luminance(texture2D(inputBuffer,vUv0).rgb);float lTop=luminance(texture2D(inputBuffer,vUv1).rgb);vec4 delta;delta.xy=abs(l-vec2(lLeft,lTop));vec2 edges=step(threshold,delta.xy);if(dot(edges,vec2(1.0))==0.0){discard;}float lRight=luminance(texture2D(inputBuffer,vUv2).rgb);float lBottom=luminance(texture2D(inputBuffer,vUv3).rgb);delta.zw=abs(l-vec2(lRight,lBottom));vec2 maxDelta=max(delta.xy,delta.zw);float lLeftLeft=luminance(texture2D(inputBuffer,vUv4).rgb);float lTopTop=luminance(texture2D(inputBuffer,vUv5).rgb);delta.zw=abs(vec2(lLeft,lTop)-vec2(lLeftLeft,lTopTop));maxDelta=max(maxDelta.xy,delta.zw);float finalDelta=max(maxDelta.x,maxDelta.y);edges.xy*=step(finalDelta,LOCAL_CONTRAST_ADAPTATION_FACTOR*delta.xy);gl_FragColor=vec4(edges,0.0,1.0);\\n#elif EDGE_DETECTION_MODE == 2\\nvec4 delta;vec3 c=texture2D(inputBuffer,vUv).rgb;vec3 cLeft=texture2D(inputBuffer,vUv0).rgb;vec3 t=abs(c-cLeft);delta.x=max(max(t.r,t.g),t.b);vec3 cTop=texture2D(inputBuffer,vUv1).rgb;t=abs(c-cTop);delta.y=max(max(t.r,t.g),t.b);vec2 edges=step(threshold,delta.xy);if(dot(edges,vec2(1.0))==0.0){discard;}vec3 cRight=texture2D(inputBuffer,vUv2).rgb;t=abs(c-cRight);delta.z=max(max(t.r,t.g),t.b);vec3 cBottom=texture2D(inputBuffer,vUv3).rgb;t=abs(c-cBottom);delta.w=max(max(t.r,t.g),t.b);vec2 maxDelta=max(delta.xy,delta.zw);vec3 cLeftLeft=texture2D(inputBuffer,vUv4).rgb;t=abs(c-cLeftLeft);delta.z=max(max(t.r,t.g),t.b);vec3 cTopTop=texture2D(inputBuffer,vUv5).rgb;t=abs(c-cTopTop);delta.w=max(max(t.r,t.g),t.b);maxDelta=max(maxDelta.xy,delta.zw);float finalDelta=max(maxDelta.x,maxDelta.y);edges*=step(finalDelta,LOCAL_CONTRAST_ADAPTATION_FACTOR*delta.xy);gl_FragColor=vec4(edges,0.0,1.0);\\n#endif\\n}\";\n\n// src/materials/glsl/edge-detection.vert\nvar edge_detection_default2 = \"uniform vec2 texelSize;varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;\\n#if EDGE_DETECTION_MODE != 0\\nvarying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;\\n#endif\\nvoid main(){vUv=position.xy*0.5+0.5;vUv0=vUv+texelSize*vec2(-1.0,0.0);vUv1=vUv+texelSize*vec2(0.0,-1.0);\\n#if EDGE_DETECTION_MODE != 0\\nvUv2=vUv+texelSize*vec2(1.0,0.0);vUv3=vUv+texelSize*vec2(0.0,1.0);vUv4=vUv+texelSize*vec2(-2.0,0.0);vUv5=vUv+texelSize*vec2(0.0,-2.0);\\n#endif\\ngl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/EdgeDetectionMaterial.js\nvar EdgeDetectionMaterial = class extends ShaderMaterial14 {\n  /**\n   * Constructs a new edge detection material.\n   *\n   * TODO Remove parameters.\n   * @param {Vector2} [texelSize] - The screen texel size.\n   * @param {EdgeDetectionMode} [mode=EdgeDetectionMode.COLOR] - The edge detection mode.\n   */\n  constructor(texelSize = new Vector218(), mode = EdgeDetectionMode.COLOR) {\n    super({\n      name: \"EdgeDetectionMaterial\",\n      defines: {\n        THREE_REVISION: REVISION2.replace(/\\D+/g, \"\"),\n        LOCAL_CONTRAST_ADAPTATION_FACTOR: \"2.0\",\n        EDGE_THRESHOLD: \"0.1\",\n        DEPTH_THRESHOLD: \"0.01\",\n        PREDICATION_MODE: \"0\",\n        PREDICATION_THRESHOLD: \"0.01\",\n        PREDICATION_SCALE: \"2.0\",\n        PREDICATION_STRENGTH: \"1.0\",\n        DEPTH_PACKING: \"0\"\n      },\n      uniforms: {\n        inputBuffer: new Uniform35(null),\n        depthBuffer: new Uniform35(null),\n        predicationBuffer: new Uniform35(null),\n        texelSize: new Uniform35(texelSize)\n      },\n      blending: NoBlending13,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: edge_detection_default,\n      vertexShader: edge_detection_default2\n    });\n    this.edgeDetectionMode = mode;\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer.\n   *\n   * @deprecated Use depthBuffer and depthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = BasicDepthPacking8) {\n    this.depthBuffer = buffer;\n    this.depthPacking = depthPacking;\n  }\n  /**\n   * The edge detection mode.\n   *\n   * @type {EdgeDetectionMode}\n   */\n  get edgeDetectionMode() {\n    return Number(this.defines.EDGE_DETECTION_MODE);\n  }\n  set edgeDetectionMode(value) {\n    this.defines.EDGE_DETECTION_MODE = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the edge detection mode.\n   *\n   * @deprecated Use edgeDetectionMode instead.\n   * @return {EdgeDetectionMode} The mode.\n   */\n  getEdgeDetectionMode() {\n    return this.edgeDetectionMode;\n  }\n  /**\n   * Sets the edge detection mode.\n   *\n   * @deprecated Use edgeDetectionMode instead.\n   * @param {EdgeDetectionMode} value - The edge detection mode.\n   */\n  setEdgeDetectionMode(value) {\n    this.edgeDetectionMode = value;\n  }\n  /**\n   * The local contrast adaptation factor. Has no effect if the edge detection mode is set to DEPTH. Default is 2.0.\n   *\n   * If a neighbor edge has _factor_ times bigger contrast than the current edge, the edge will be discarded.\n   *\n   * This allows to eliminate spurious crossing edges and is based on the fact that if there is too much contrast in a\n   * direction, the perceptual contrast in the other neighbors will be hidden.\n   *\n   * @type {Number}\n   */\n  get localContrastAdaptationFactor() {\n    return Number(this.defines.LOCAL_CONTRAST_ADAPTATION_FACTOR);\n  }\n  set localContrastAdaptationFactor(value) {\n    this.defines.LOCAL_CONTRAST_ADAPTATION_FACTOR = value.toFixed(\"6\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the local contrast adaptation factor.\n   *\n   * @deprecated Use localContrastAdaptationFactor instead.\n   * @return {Number} The factor.\n   */\n  getLocalContrastAdaptationFactor() {\n    return this.localContrastAdaptationFactor;\n  }\n  /**\n   * Sets the local contrast adaptation factor. Has no effect if the edge detection mode is set to DEPTH.\n   *\n   * @deprecated Use localContrastAdaptationFactor instead.\n   * @param {Number} value - The local contrast adaptation factor. Default is 2.0.\n   */\n  setLocalContrastAdaptationFactor(value) {\n    this.localContrastAdaptationFactor = value;\n  }\n  /**\n   * The edge detection threshold. Range: [0.0, 0.5].\n   *\n   * A lower value results in more edges being detected at the expense of performance.\n   *\n   * For luma- and chroma-based edge detection, 0.1 is a reasonable value and allows to catch most visible edges. 0.05\n   * is a rather overkill value that allows to catch 'em all. Darker scenes may require an even lower threshold.\n   *\n   * If depth-based edge detection is used, the threshold will depend on the scene depth.\n   *\n   * @type {Number}\n   */\n  get edgeDetectionThreshold() {\n    return Number(this.defines.EDGE_THRESHOLD);\n  }\n  set edgeDetectionThreshold(value) {\n    this.defines.EDGE_THRESHOLD = value.toFixed(\"6\");\n    this.defines.DEPTH_THRESHOLD = (value * 0.1).toFixed(\"6\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the edge detection threshold.\n   *\n   * @deprecated Use edgeDetectionThreshold instead.\n   * @return {Number} The threshold.\n   */\n  getEdgeDetectionThreshold() {\n    return this.edgeDetectionThreshold;\n  }\n  /**\n   * Sets the edge detection threshold.\n   *\n   * @deprecated Use edgeDetectionThreshold instead.\n   * @param {Number} value - The edge detection threshold. Range: [0.0, 0.5].\n   */\n  setEdgeDetectionThreshold(value) {\n    this.edgeDetectionThreshold = value;\n  }\n  /**\n   * The predication mode.\n   *\n   * Predicated thresholding allows to better preserve texture details and to improve edge detection using an additional\n   * buffer such as a light accumulation or depth buffer.\n   *\n   * @type {PredicationMode}\n   */\n  get predicationMode() {\n    return Number(this.defines.PREDICATION_MODE);\n  }\n  set predicationMode(value) {\n    this.defines.PREDICATION_MODE = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the predication mode.\n   *\n   * @deprecated Use predicationMode instead.\n   * @return {PredicationMode} The mode.\n   */\n  getPredicationMode() {\n    return this.predicationMode;\n  }\n  /**\n   * Sets the predication mode.\n   *\n   * @deprecated Use predicationMode instead.\n   * @param {PredicationMode} value - The predication mode.\n   */\n  setPredicationMode(value) {\n    this.predicationMode = value;\n  }\n  /**\n   * The predication buffer.\n   *\n   * @type {Texture}\n   */\n  set predicationBuffer(value) {\n    this.uniforms.predicationBuffer.value = value;\n  }\n  /**\n   * Sets a custom predication buffer.\n   *\n   * @deprecated Use predicationBuffer instead.\n   * @param {Texture} value - The predication buffer.\n   */\n  setPredicationBuffer(value) {\n    this.uniforms.predicationBuffer.value = value;\n  }\n  /**\n   * The predication threshold.\n   *\n   * @type {Number}\n   */\n  get predicationThreshold() {\n    return Number(this.defines.PREDICATION_THRESHOLD);\n  }\n  set predicationThreshold(value) {\n    this.defines.PREDICATION_THRESHOLD = value.toFixed(\"6\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the predication threshold.\n   *\n   * @deprecated Use predicationThreshold instead.\n   * @return {Number} The threshold.\n   */\n  getPredicationThreshold() {\n    return this.predicationThreshold;\n  }\n  /**\n   * Sets the predication threshold.\n   *\n   * @deprecated Use predicationThreshold instead.\n   * @param {Number} value - The threshold.\n   */\n  setPredicationThreshold(value) {\n    this.predicationThreshold = value;\n  }\n  /**\n   * The predication scale. Range: [1.0, 5.0].\n   *\n   * Determines how much the edge detection threshold should be scaled when using predication.\n   *\n   * @type {Boolean|Texture|Number}\n   */\n  get predicationScale() {\n    return Number(this.defines.PREDICATION_SCALE);\n  }\n  set predicationScale(value) {\n    this.defines.PREDICATION_SCALE = value.toFixed(\"6\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the predication scale.\n   *\n   * @deprecated Use predicationScale instead.\n   * @return {Number} The scale.\n   */\n  getPredicationScale() {\n    return this.predicationScale;\n  }\n  /**\n   * Sets the predication scale.\n   *\n   * @deprecated Use predicationScale instead.\n   * @param {Number} value - The scale. Range: [1.0, 5.0].\n   */\n  setPredicationScale(value) {\n    this.predicationScale = value;\n  }\n  /**\n   * The predication strength. Range: [0.0, 1.0].\n   *\n   * Determines how much the edge detection threshold should be decreased locally when using predication.\n   *\n   * @type {Number}\n   */\n  get predicationStrength() {\n    return Number(this.defines.PREDICATION_STRENGTH);\n  }\n  set predicationStrength(value) {\n    this.defines.PREDICATION_STRENGTH = value.toFixed(\"6\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the predication strength.\n   *\n   * @deprecated Use predicationStrength instead.\n   * @return {Number} The strength.\n   */\n  getPredicationStrength() {\n    return this.predicationStrength;\n  }\n  /**\n   * Sets the predication strength.\n   *\n   * @deprecated Use predicationStrength instead.\n   * @param {Number} value - The strength. Range: [0.0, 1.0].\n   */\n  setPredicationStrength(value) {\n    this.predicationStrength = value;\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/materials/SMAAWeightsMaterial.js\nimport { NoBlending as NoBlending14, ShaderMaterial as ShaderMaterial15, Uniform as Uniform36, Vector2 as Vector219 } from \"three\";\n\n// src/materials/glsl/smaa-weights.frag\nvar smaa_weights_default = \"#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + offset * texelSize)\\n#if __VERSION__ < 300\\n#define round(v) floor(v + 0.5)\\n#endif\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform lowp sampler2D areaTexture;uniform lowp sampler2D searchTexture;uniform vec2 texelSize;uniform vec2 resolution;varying vec2 vUv;varying vec4 vOffset[3];varying vec2 vPixCoord;void movec(const in bvec2 c,inout vec2 variable,const in vec2 value){if(c.x){variable.x=value.x;}if(c.y){variable.y=value.y;}}void movec(const in bvec4 c,inout vec4 variable,const in vec4 value){movec(c.xy,variable.xy,value.xy);movec(c.zw,variable.zw,value.zw);}vec2 decodeDiagBilinearAccess(in vec2 e){e.r=e.r*abs(5.0*e.r-5.0*0.75);return round(e);}vec4 decodeDiagBilinearAccess(in vec4 e){e.rb=e.rb*abs(5.0*e.rb-5.0*0.75);return round(e);}vec2 searchDiag1(const in vec2 texCoord,const in vec2 dir,out vec2 e){vec4 coord=vec4(texCoord,-1.0,1.0);vec3 t=vec3(texelSize,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(coord.z<float(MAX_SEARCH_STEPS_DIAG_INT-1)&&coord.w>0.9)){break;}coord.xyz=t*vec3(dir,1.0)+coord.xyz;e=texture2D(inputBuffer,coord.xy).rg;coord.w=dot(e,vec2(0.5));}return coord.zw;}vec2 searchDiag2(const in vec2 texCoord,const in vec2 dir,out vec2 e){vec4 coord=vec4(texCoord,-1.0,1.0);coord.x+=0.25*texelSize.x;vec3 t=vec3(texelSize,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(coord.z<float(MAX_SEARCH_STEPS_DIAG_INT-1)&&coord.w>0.9)){break;}coord.xyz=t*vec3(dir,1.0)+coord.xyz;e=texture2D(inputBuffer,coord.xy).rg;e=decodeDiagBilinearAccess(e);coord.w=dot(e,vec2(0.5));}return coord.zw;}vec2 areaDiag(const in vec2 dist,const in vec2 e,const in float offset){vec2 texCoord=vec2(AREATEX_MAX_DISTANCE_DIAG,AREATEX_MAX_DISTANCE_DIAG)*e+dist;texCoord=AREATEX_PIXEL_SIZE*texCoord+0.5*AREATEX_PIXEL_SIZE;texCoord.x+=0.5;texCoord.y+=AREATEX_SUBTEX_SIZE*offset;return texture2D(areaTexture,texCoord).rg;}vec2 calculateDiagWeights(const in vec2 texCoord,const in vec2 e,const in vec4 subsampleIndices){vec2 weights=vec2(0.0);vec4 d;vec2 end;if(e.r>0.0){d.xz=searchDiag1(texCoord,vec2(-1.0,1.0),end);d.x+=float(end.y>0.9);}else{d.xz=vec2(0.0);}d.yw=searchDiag1(texCoord,vec2(1.0,-1.0),end);if(d.x+d.y>2.0){vec4 coords=vec4(-d.x+0.25,d.x,d.y,-d.y-0.25)*texelSize.xyxy+texCoord.xyxy;vec4 c;c.xy=sampleLevelZeroOffset(inputBuffer,coords.xy,vec2(-1,0)).rg;c.zw=sampleLevelZeroOffset(inputBuffer,coords.zw,vec2(1,0)).rg;c.yxwz=decodeDiagBilinearAccess(c.xyzw);vec2 cc=vec2(2.0)*c.xz+c.yw;movec(bvec2(step(0.9,d.zw)),cc,vec2(0.0));weights+=areaDiag(d.xy,cc,subsampleIndices.z);}d.xz=searchDiag2(texCoord,vec2(-1.0,-1.0),end);if(sampleLevelZeroOffset(inputBuffer,texCoord,vec2(1,0)).r>0.0){d.yw=searchDiag2(texCoord,vec2(1.0),end);d.y+=float(end.y>0.9);}else{d.yw=vec2(0.0);}if(d.x+d.y>2.0){vec4 coords=vec4(-d.x,-d.x,d.y,d.y)*texelSize.xyxy+texCoord.xyxy;vec4 c;c.x=sampleLevelZeroOffset(inputBuffer,coords.xy,vec2(-1,0)).g;c.y=sampleLevelZeroOffset(inputBuffer,coords.xy,vec2(0,-1)).r;c.zw=sampleLevelZeroOffset(inputBuffer,coords.zw,vec2(1,0)).gr;vec2 cc=vec2(2.0)*c.xz+c.yw;movec(bvec2(step(0.9,d.zw)),cc,vec2(0.0));weights+=areaDiag(d.xy,cc,subsampleIndices.w).gr;}return weights;}float searchLength(const in vec2 e,const in float offset){vec2 scale=SEARCHTEX_SIZE*vec2(0.5,-1.0);vec2 bias=SEARCHTEX_SIZE*vec2(offset,1.0);scale+=vec2(-1.0,1.0);bias+=vec2(0.5,-0.5);scale*=1.0/SEARCHTEX_PACKED_SIZE;bias*=1.0/SEARCHTEX_PACKED_SIZE;return texture2D(searchTexture,scale*e+bias).r;}float searchXLeft(in vec2 texCoord,const in float end){vec2 e=vec2(0.0,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(texCoord.x>end&&e.g>0.8281&&e.r==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=vec2(-2.0,0.0)*texelSize+texCoord;}float offset=-(255.0/127.0)*searchLength(e,0.0)+3.25;return texelSize.x*offset+texCoord.x;}float searchXRight(vec2 texCoord,const in float end){vec2 e=vec2(0.0,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(texCoord.x<end&&e.g>0.8281&&e.r==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=vec2(2.0,0.0)*texelSize.xy+texCoord;}float offset=-(255.0/127.0)*searchLength(e,0.5)+3.25;return-texelSize.x*offset+texCoord.x;}float searchYUp(vec2 texCoord,const in float end){vec2 e=vec2(1.0,0.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(texCoord.y>end&&e.r>0.8281&&e.g==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=-vec2(0.0,2.0)*texelSize.xy+texCoord;}float offset=-(255.0/127.0)*searchLength(e.gr,0.0)+3.25;return texelSize.y*offset+texCoord.y;}float searchYDown(vec2 texCoord,const in float end){vec2 e=vec2(1.0,0.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;i++){if(!(texCoord.y<end&&e.r>0.8281&&e.g==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=vec2(0.0,2.0)*texelSize.xy+texCoord;}float offset=-(255.0/127.0)*searchLength(e.gr,0.5)+3.25;return-texelSize.y*offset+texCoord.y;}vec2 area(const in vec2 dist,const in float e1,const in float e2,const in float offset){vec2 texCoord=vec2(AREATEX_MAX_DISTANCE)*round(4.0*vec2(e1,e2))+dist;texCoord=AREATEX_PIXEL_SIZE*texCoord+0.5*AREATEX_PIXEL_SIZE;texCoord.y=AREATEX_SUBTEX_SIZE*offset+texCoord.y;return texture2D(areaTexture,texCoord).rg;}void detectHorizontalCornerPattern(inout vec2 weights,const in vec4 texCoord,const in vec2 d){\\n#if !defined(DISABLE_CORNER_DETECTION)\\nvec2 leftRight=step(d.xy,d.yx);vec2 rounding=(1.0-CORNER_ROUNDING_NORM)*leftRight;rounding/=leftRight.x+leftRight.y;vec2 factor=vec2(1.0);factor.x-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(0,1)).r;factor.x-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(1,1)).r;factor.y-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(0,-2)).r;factor.y-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(1,-2)).r;weights*=clamp(factor,0.0,1.0);\\n#endif\\n}void detectVerticalCornerPattern(inout vec2 weights,const in vec4 texCoord,const in vec2 d){\\n#if !defined(DISABLE_CORNER_DETECTION)\\nvec2 leftRight=step(d.xy,d.yx);vec2 rounding=(1.0-CORNER_ROUNDING_NORM)*leftRight;rounding/=leftRight.x+leftRight.y;vec2 factor=vec2(1.0);factor.x-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(1,0)).g;factor.x-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(1,1)).g;factor.y-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(-2,0)).g;factor.y-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(-2,1)).g;weights*=clamp(factor,0.0,1.0);\\n#endif\\n}void main(){vec4 weights=vec4(0.0);vec4 subsampleIndices=vec4(0.0);vec2 e=texture2D(inputBuffer,vUv).rg;if(e.g>0.0){\\n#if !defined(DISABLE_DIAG_DETECTION)\\nweights.rg=calculateDiagWeights(vUv,e,subsampleIndices);if(weights.r==-weights.g){\\n#endif\\nvec2 d;vec3 coords;coords.x=searchXLeft(vOffset[0].xy,vOffset[2].x);coords.y=vOffset[1].y;d.x=coords.x;float e1=texture2D(inputBuffer,coords.xy).r;coords.z=searchXRight(vOffset[0].zw,vOffset[2].y);d.y=coords.z;d=round(resolution.xx*d+-vPixCoord.xx);vec2 sqrtD=sqrt(abs(d));float e2=sampleLevelZeroOffset(inputBuffer,coords.zy,vec2(1,0)).r;weights.rg=area(sqrtD,e1,e2,subsampleIndices.y);coords.y=vUv.y;detectHorizontalCornerPattern(weights.rg,coords.xyzy,d);\\n#if !defined(DISABLE_DIAG_DETECTION)\\n}else{e.r=0.0;}\\n#endif\\n}if(e.r>0.0){vec2 d;vec3 coords;coords.y=searchYUp(vOffset[1].xy,vOffset[2].z);coords.x=vOffset[0].x;d.x=coords.y;float e1=texture2D(inputBuffer,coords.xy).g;coords.z=searchYDown(vOffset[1].zw,vOffset[2].w);d.y=coords.z;d=round(resolution.yy*d-vPixCoord.yy);vec2 sqrtD=sqrt(abs(d));float e2=sampleLevelZeroOffset(inputBuffer,coords.xz,vec2(0,1)).g;weights.ba=area(sqrtD,e1,e2,subsampleIndices.x);coords.x=vUv.x;detectVerticalCornerPattern(weights.ba,coords.xyxz,d);}gl_FragColor=weights;}\";\n\n// src/materials/glsl/smaa-weights.vert\nvar smaa_weights_default2 = \"uniform vec2 texelSize;uniform vec2 resolution;varying vec2 vUv;varying vec4 vOffset[3];varying vec2 vPixCoord;void main(){vUv=position.xy*0.5+0.5;vPixCoord=vUv*resolution;vOffset[0]=vUv.xyxy+texelSize.xyxy*vec4(-0.25,-0.125,1.25,-0.125);vOffset[1]=vUv.xyxy+texelSize.xyxy*vec4(-0.125,-0.25,-0.125,1.25);vOffset[2]=vec4(vOffset[0].xz,vOffset[1].yw)+vec4(-2.0,2.0,-2.0,2.0)*texelSize.xxyy*MAX_SEARCH_STEPS_FLOAT;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/SMAAWeightsMaterial.js\nvar SMAAWeightsMaterial = class extends ShaderMaterial15 {\n  /**\n   * Constructs a new SMAA weights material.\n   *\n   * @param {Vector2} [texelSize] - The absolute screen texel size.\n   * @param {Vector2} [resolution] - The resolution.\n   */\n  constructor(texelSize = new Vector219(), resolution = new Vector219()) {\n    super({\n      name: \"SMAAWeightsMaterial\",\n      defines: {\n        // Configurable settings:\n        MAX_SEARCH_STEPS_INT: \"16\",\n        MAX_SEARCH_STEPS_FLOAT: \"16.0\",\n        MAX_SEARCH_STEPS_DIAG_INT: \"8\",\n        MAX_SEARCH_STEPS_DIAG_FLOAT: \"8.0\",\n        CORNER_ROUNDING: \"25\",\n        CORNER_ROUNDING_NORM: \"0.25\",\n        // Non-configurable settings:\n        AREATEX_MAX_DISTANCE: \"16.0\",\n        AREATEX_MAX_DISTANCE_DIAG: \"20.0\",\n        AREATEX_PIXEL_SIZE: \"(1.0 / vec2(160.0, 560.0))\",\n        AREATEX_SUBTEX_SIZE: \"(1.0 / 7.0)\",\n        SEARCHTEX_SIZE: \"vec2(66.0, 33.0)\",\n        SEARCHTEX_PACKED_SIZE: \"vec2(64.0, 16.0)\"\n      },\n      uniforms: {\n        inputBuffer: new Uniform36(null),\n        searchTexture: new Uniform36(null),\n        areaTexture: new Uniform36(null),\n        resolution: new Uniform36(resolution),\n        texelSize: new Uniform36(texelSize)\n      },\n      blending: NoBlending14,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: smaa_weights_default,\n      vertexShader: smaa_weights_default2\n    });\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The search lookup texture.\n   *\n   * @type {Texture}\n   */\n  get searchTexture() {\n    return this.uniforms.searchTexture.value;\n  }\n  set searchTexture(value) {\n    this.uniforms.searchTexture.value = value;\n  }\n  /**\n   * The area lookup texture.\n   *\n   * @type {Texture}\n   */\n  get areaTexture() {\n    return this.uniforms.areaTexture.value;\n  }\n  set areaTexture(value) {\n    this.uniforms.areaTexture.value = value;\n  }\n  /**\n   * Sets the search and area lookup textures.\n   *\n   * @deprecated Use searchTexture and areaTexture instead.\n   * @param {Texture} search - The search lookup texture.\n   * @param {Texture} area - The area lookup texture.\n   */\n  setLookupTextures(search, area2) {\n    this.searchTexture = search;\n    this.areaTexture = area2;\n  }\n  /**\n   * The maximum amount of steps performed in the horizontal/vertical pattern searches, at each side of the pixel.\n   * Range: [0, 112].\n   *\n   * In number of pixels, it's actually the double. So the maximum line length perfectly handled by, for example 16, is\n   * 64 (perfectly means that longer lines won't look as good, but are still antialiased).\n   *\n   * @type {Number}\n   */\n  get orthogonalSearchSteps() {\n    return Number(this.defines.MAX_SEARCH_STEPS_INT);\n  }\n  set orthogonalSearchSteps(value) {\n    const s = Math.min(Math.max(value, 0), 112);\n    this.defines.MAX_SEARCH_STEPS_INT = s.toFixed(\"0\");\n    this.defines.MAX_SEARCH_STEPS_FLOAT = s.toFixed(\"1\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the maximum amount of steps performed in the horizontal/vertical pattern searches, at each side of the pixel.\n   *\n   * @deprecated Use orthogonalSearchSteps instead.\n   * @param {Number} value - The search steps. Range: [0, 112].\n   */\n  setOrthogonalSearchSteps(value) {\n    this.orthogonalSearchSteps = value;\n  }\n  /**\n   * The maximum steps performed in the diagonal pattern searches, at each side of the pixel. This search\n   * jumps one pixel at a time. Range: [0, 20].\n   *\n   * On high-end machines this search is cheap (between 0.8x and 0.9x slower for 16 steps), but it can have a\n   * significant impact on older machines.\n   *\n   * @type {Number}\n   */\n  get diagonalSearchSteps() {\n    return Number(this.defines.MAX_SEARCH_STEPS_DIAG_INT);\n  }\n  set diagonalSearchSteps(value) {\n    const s = Math.min(Math.max(value, 0), 20);\n    this.defines.MAX_SEARCH_STEPS_DIAG_INT = s.toFixed(\"0\");\n    this.defines.MAX_SEARCH_STEPS_DIAG_FLOAT = s.toFixed(\"1\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Specifies the maximum steps performed in the diagonal pattern searches, at each side of the pixel.\n   *\n   * @deprecated Use diagonalSearchSteps instead.\n   * @param {Number} value - The search steps. Range: [0, 20].\n   */\n  setDiagonalSearchSteps(value) {\n    this.diagonalSearchSteps = value;\n  }\n  /**\n   * Indicates whether diagonal pattern detection is enabled.\n   *\n   * @type {Boolean}\n   */\n  get diagonalDetection() {\n    return this.defines.DISABLE_DIAG_DETECTION === void 0;\n  }\n  set diagonalDetection(value) {\n    if (value) {\n      delete this.defines.DISABLE_DIAG_DETECTION;\n    } else {\n      this.defines.DISABLE_DIAG_DETECTION = \"1\";\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Indicates whether diagonal pattern detection is enabled.\n   *\n   * @deprecated Use diagonalDetection instead.\n   * @return {Boolean} Whether diagonal pattern detection is enabled.\n   */\n  isDiagonalDetectionEnabled() {\n    return this.diagonalDetection;\n  }\n  /**\n   * Enables or disables diagonal pattern detection.\n   *\n   * @deprecated Use diagonalDetection instead.\n   * @param {Boolean} value - Whether diagonal pattern detection should be enabled.\n   */\n  setDiagonalDetectionEnabled(value) {\n    this.diagonalDetection = value;\n  }\n  /**\n   * Specifies how much sharp corners will be rounded. Range: [0, 100].\n   *\n   * @type {Number}\n   */\n  get cornerRounding() {\n    return Number(this.defines.CORNER_ROUNDING);\n  }\n  set cornerRounding(value) {\n    const r = Math.min(Math.max(value, 0), 100);\n    this.defines.CORNER_ROUNDING = r.toFixed(\"4\");\n    this.defines.CORNER_ROUNDING_NORM = (r / 100).toFixed(\"4\");\n    this.needsUpdate = true;\n  }\n  /**\n   * Specifies how much sharp corners will be rounded.\n   *\n   * @deprecated Use cornerRounding instead.\n   * @param {Number} value - The corner rounding amount. Range: [0, 100].\n   */\n  setCornerRounding(value) {\n    this.cornerRounding = value;\n  }\n  /**\n   * Indicates whether corner detection is enabled.\n   *\n   * @type {Number}\n   */\n  get cornerDetection() {\n    return this.defines.DISABLE_CORNER_DETECTION === void 0;\n  }\n  set cornerDetection(value) {\n    if (value) {\n      delete this.defines.DISABLE_CORNER_DETECTION;\n    } else {\n      this.defines.DISABLE_CORNER_DETECTION = \"1\";\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Indicates whether corner rounding is enabled.\n   *\n   * @deprecated Use cornerDetection instead.\n   * @return {Boolean} Whether corner rounding is enabled.\n   */\n  isCornerRoundingEnabled() {\n    return this.cornerDetection;\n  }\n  /**\n   * Enables or disables corner rounding.\n   *\n   * @deprecated Use cornerDetection instead.\n   * @param {Boolean} value - Whether corner rounding should be enabled.\n   */\n  setCornerRoundingEnabled(value) {\n    this.cornerDetection = value;\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const uniforms = this.uniforms;\n    uniforms.texelSize.value.set(1 / width, 1 / height);\n    uniforms.resolution.value.set(width, height);\n  }\n};\n\n// src/textures/smaa/searchImageDataURL.js\nvar searchImageDataURL_default = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAQCAYAAACm53kpAAAAeElEQVRYR+2XSwqAMAxEJ168ePEqwRSKhIIiuHjJqiU0gWE+1CQdApcVAMUAuARaMGCX1MIL/Ow13++9lW2s3mW9MWvsnWc/2fvGygwPAN4E8QzAA4CXAB6AHjG4JTHYI1ey3pcx6FHnEfhLDOIBKAmUBK6/ANUDTlROXAHd9EC1AAAAAElFTkSuQmCC\";\n\n// src/textures/smaa/areaImageDataURL.js\nvar areaImageDataURL_default = \"data:image/png;base64,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\";\n\n// src/effects/glsl/smaa.frag\nvar smaa_default = \"uniform sampler2D weightMap;varying vec2 vOffset0;varying vec2 vOffset1;void movec(const in bvec2 c,inout vec2 variable,const in vec2 value){if(c.x){variable.x=value.x;}if(c.y){variable.y=value.y;}}void movec(const in bvec4 c,inout vec4 variable,const in vec4 value){movec(c.xy,variable.xy,value.xy);movec(c.zw,variable.zw,value.zw);}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec4 a;a.x=texture2D(weightMap,vOffset0).a;a.y=texture2D(weightMap,vOffset1).g;a.wz=texture2D(weightMap,uv).rb;vec4 color=inputColor;if(dot(a,vec4(1.0))>=1e-5){bool h=max(a.x,a.z)>max(a.y,a.w);vec4 blendingOffset=vec4(0.0,a.y,0.0,a.w);vec2 blendingWeight=a.yw;movec(bvec4(h),blendingOffset,vec4(a.x,0.0,a.z,0.0));movec(bvec2(h),blendingWeight,a.xz);blendingWeight/=dot(blendingWeight,vec2(1.0));vec4 blendingCoord=blendingOffset*vec4(texelSize,-texelSize)+uv.xyxy;color=blendingWeight.x*texture2D(inputBuffer,blendingCoord.xy);color+=blendingWeight.y*texture2D(inputBuffer,blendingCoord.zw);}outputColor=color;}\";\n\n// src/effects/glsl/smaa.vert\nvar smaa_default2 = \"varying vec2 vOffset0;varying vec2 vOffset1;void mainSupport(const in vec2 uv){vOffset0=uv+texelSize*vec2(1.0,0.0);vOffset1=uv+texelSize*vec2(0.0,1.0);}\";\n\n// src/effects/SMAAEffect.js\nvar SMAAEffect = class extends Effect {\n  /**\n   * Constructs a new SMAA effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {SMAAPreset} [options.preset=SMAAPreset.MEDIUM] - The quality preset.\n   * @param {EdgeDetectionMode} [options.edgeDetectionMode=EdgeDetectionMode.COLOR] - The edge detection mode.\n   * @param {PredicationMode} [options.predicationMode=PredicationMode.DISABLED] - The predication mode.\n   */\n  constructor({\n    blendFunction = BlendFunction.SRC,\n    preset = SMAAPreset.MEDIUM,\n    edgeDetectionMode = EdgeDetectionMode.COLOR,\n    predicationMode = PredicationMode.DISABLED\n  } = {}) {\n    super(\"SMAAEffect\", smaa_default, {\n      vertexShader: smaa_default2,\n      blendFunction,\n      attributes: EffectAttribute.CONVOLUTION | EffectAttribute.DEPTH,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"weightMap\", new Uniform37(null)]\n      ])\n    });\n    let searchImage, areaImage;\n    if (arguments.length > 1) {\n      searchImage = arguments[0];\n      areaImage = arguments[1];\n      if (arguments.length > 2) {\n        preset = arguments[2];\n      }\n      if (arguments.length > 3) {\n        edgeDetectionMode = arguments[3];\n      }\n    }\n    this.renderTargetEdges = new WebGLRenderTarget14(1, 1, { depthBuffer: false });\n    this.renderTargetEdges.texture.name = \"SMAA.Edges\";\n    this.renderTargetWeights = this.renderTargetEdges.clone();\n    this.renderTargetWeights.texture.name = \"SMAA.Weights\";\n    this.uniforms.get(\"weightMap\").value = this.renderTargetWeights.texture;\n    this.clearPass = new ClearPass(true, false, false);\n    this.clearPass.overrideClearColor = new Color7(0);\n    this.clearPass.overrideClearAlpha = 1;\n    this.edgeDetectionPass = new ShaderPass(new EdgeDetectionMaterial());\n    this.edgeDetectionMaterial.edgeDetectionMode = edgeDetectionMode;\n    this.edgeDetectionMaterial.predicationMode = predicationMode;\n    this.weightsPass = new ShaderPass(new SMAAWeightsMaterial());\n    const loadingManager = new LoadingManager();\n    loadingManager.onLoad = () => {\n      const searchTexture = new Texture3(searchImage);\n      searchTexture.name = \"SMAA.Search\";\n      searchTexture.magFilter = NearestFilter4;\n      searchTexture.minFilter = NearestFilter4;\n      searchTexture.generateMipmaps = false;\n      searchTexture.needsUpdate = true;\n      searchTexture.flipY = true;\n      this.weightsMaterial.searchTexture = searchTexture;\n      const areaTexture = new Texture3(areaImage);\n      areaTexture.name = \"SMAA.Area\";\n      areaTexture.magFilter = LinearFilter5;\n      areaTexture.minFilter = LinearFilter5;\n      areaTexture.generateMipmaps = false;\n      areaTexture.needsUpdate = true;\n      areaTexture.flipY = false;\n      this.weightsMaterial.areaTexture = areaTexture;\n      this.dispatchEvent({ type: \"load\" });\n    };\n    loadingManager.itemStart(\"search\");\n    loadingManager.itemStart(\"area\");\n    if (searchImage !== void 0 && areaImage !== void 0) {\n      loadingManager.itemEnd(\"search\");\n      loadingManager.itemEnd(\"area\");\n    } else if (typeof Image !== \"undefined\") {\n      searchImage = new Image();\n      areaImage = new Image();\n      searchImage.addEventListener(\"load\", () => loadingManager.itemEnd(\"search\"));\n      areaImage.addEventListener(\"load\", () => loadingManager.itemEnd(\"area\"));\n      searchImage.src = searchImageDataURL_default;\n      areaImage.src = areaImageDataURL_default;\n    }\n    this.applyPreset(preset);\n  }\n  /**\n   * The edges texture.\n   *\n   * @type {Texture}\n   */\n  get edgesTexture() {\n    return this.renderTargetEdges.texture;\n  }\n  /**\n   * Returns the edges texture.\n   *\n   * @deprecated Use edgesTexture instead.\n   * @return {Texture} The texture.\n   */\n  getEdgesTexture() {\n    return this.edgesTexture;\n  }\n  /**\n   * The edge weights texture.\n   *\n   * @type {Texture}\n   */\n  get weightsTexture() {\n    return this.renderTargetWeights.texture;\n  }\n  /**\n   * Returns the edge weights texture.\n   *\n   * @deprecated Use weightsTexture instead.\n   * @return {Texture} The texture.\n   */\n  getWeightsTexture() {\n    return this.weightsTexture;\n  }\n  /**\n   * The edge detection material.\n   *\n   * @type {EdgeDetectionMaterial}\n   */\n  get edgeDetectionMaterial() {\n    return this.edgeDetectionPass.fullscreenMaterial;\n  }\n  /**\n   * The edge detection material.\n   *\n   * @type {EdgeDetectionMaterial}\n   * @deprecated Use edgeDetectionMaterial instead.\n   */\n  get colorEdgesMaterial() {\n    return this.edgeDetectionMaterial;\n  }\n  /**\n   * Returns the edge detection material.\n   *\n   * @deprecated Use edgeDetectionMaterial instead.\n   * @return {EdgeDetectionMaterial} The material.\n   */\n  getEdgeDetectionMaterial() {\n    return this.edgeDetectionMaterial;\n  }\n  /**\n   * The edge weights material.\n   *\n   * @type {SMAAWeightsMaterial}\n   */\n  get weightsMaterial() {\n    return this.weightsPass.fullscreenMaterial;\n  }\n  /**\n   * Returns the edge weights material.\n   *\n   * @deprecated Use weightsMaterial instead.\n   * @return {SMAAWeightsMaterial} The material.\n   */\n  getWeightsMaterial() {\n    return this.weightsMaterial;\n  }\n  /**\n   * Sets the edge detection sensitivity.\n   *\n   * See {@link EdgeDetectionMaterial#setEdgeDetectionThreshold} for more details.\n   *\n   * @deprecated Use edgeDetectionMaterial instead.\n   * @param {Number} threshold - The edge detection sensitivity. Range: [0.05, 0.5].\n   */\n  setEdgeDetectionThreshold(threshold) {\n    this.edgeDetectionMaterial.edgeDetectionThreshold = threshold;\n  }\n  /**\n   * Sets the maximum amount of horizontal/vertical search steps.\n   *\n   * See {@link SMAAWeightsMaterial#setOrthogonalSearchSteps} for more details.\n   *\n   * @deprecated Use weightsMaterial instead.\n   * @param {Number} steps - The search steps. Range: [0, 112].\n   */\n  setOrthogonalSearchSteps(steps) {\n    this.weightsMaterial.orthogonalSearchSteps = steps;\n  }\n  /**\n   * Applies the given quality preset.\n   *\n   * @param {SMAAPreset} preset - The preset.\n   */\n  applyPreset(preset) {\n    const edgeDetectionMaterial = this.edgeDetectionMaterial;\n    const weightsMaterial = this.weightsMaterial;\n    switch (preset) {\n      case SMAAPreset.LOW:\n        edgeDetectionMaterial.edgeDetectionThreshold = 0.15;\n        weightsMaterial.orthogonalSearchSteps = 4;\n        weightsMaterial.diagonalDetection = false;\n        weightsMaterial.cornerDetection = false;\n        break;\n      case SMAAPreset.MEDIUM:\n        edgeDetectionMaterial.edgeDetectionThreshold = 0.1;\n        weightsMaterial.orthogonalSearchSteps = 8;\n        weightsMaterial.diagonalDetection = false;\n        weightsMaterial.cornerDetection = false;\n        break;\n      case SMAAPreset.HIGH:\n        edgeDetectionMaterial.edgeDetectionThreshold = 0.1;\n        weightsMaterial.orthogonalSearchSteps = 16;\n        weightsMaterial.diagonalSearchSteps = 8;\n        weightsMaterial.cornerRounding = 25;\n        weightsMaterial.diagonalDetection = true;\n        weightsMaterial.cornerDetection = true;\n        break;\n      case SMAAPreset.ULTRA:\n        edgeDetectionMaterial.edgeDetectionThreshold = 0.05;\n        weightsMaterial.orthogonalSearchSteps = 32;\n        weightsMaterial.diagonalSearchSteps = 16;\n        weightsMaterial.cornerRounding = 25;\n        weightsMaterial.diagonalDetection = true;\n        weightsMaterial.cornerDetection = true;\n        break;\n    }\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking9) {\n    this.edgeDetectionMaterial.depthBuffer = depthTexture;\n    this.edgeDetectionMaterial.depthPacking = depthPacking;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    this.clearPass.render(renderer, this.renderTargetEdges);\n    this.edgeDetectionPass.render(renderer, inputBuffer, this.renderTargetEdges);\n    this.weightsPass.render(renderer, this.renderTargetEdges, this.renderTargetWeights);\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.edgeDetectionMaterial.setSize(width, height);\n    this.weightsMaterial.setSize(width, height);\n    this.renderTargetEdges.setSize(width, height);\n    this.renderTargetWeights.setSize(width, height);\n  }\n  /**\n   * Deletes internal render targets and textures.\n   */\n  dispose() {\n    const { searchTexture, areaTexture } = this.weightsMaterial;\n    if (searchTexture !== null && areaTexture !== null) {\n      searchTexture.dispose();\n      areaTexture.dispose();\n    }\n    super.dispose();\n  }\n  /**\n   * The SMAA search image, encoded as a base64 data URL.\n   *\n   * @type {String}\n   * @deprecated\n   */\n  static get searchImageDataURL() {\n    return searchImageDataURL_default;\n  }\n  /**\n   * The SMAA area image, encoded as a base64 data URL.\n   *\n   * @type {String}\n   * @deprecated\n   */\n  static get areaImageDataURL() {\n    return areaImageDataURL_default;\n  }\n};\n\n// src/effects/SSAOEffect.js\nimport { BasicDepthPacking as BasicDepthPacking13, Color as Color8, RepeatWrapping as RepeatWrapping3, RGBAFormat as RGBAFormat4, Uniform as Uniform40, WebGLRenderTarget as WebGLRenderTarget16 } from \"three\";\n\n// src/materials/SSAOMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking10, Matrix4 as Matrix42, NoBlending as NoBlending15, PerspectiveCamera as PerspectiveCamera4, ShaderMaterial as ShaderMaterial16, Uniform as Uniform38, Vector2 as Vector220 } from \"three\";\n\n// src/materials/glsl/ssao.frag\nvar ssao_default = \"#include <common>\\n#include <packing>\\n#ifdef NORMAL_DEPTH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){return texture2D(normalDepthBuffer,uv).a;}\\n#else\\nuniform lowp sampler2D normalBuffer;\\n#if DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}\\n#endif\\nuniform lowp sampler2D noiseTexture;uniform mat4 inverseProjectionMatrix;uniform mat4 projectionMatrix;uniform vec2 texelSize;uniform vec2 cameraNearFar;uniform float intensity;uniform float minRadiusScale;uniform float fade;uniform float bias;uniform vec2 distanceCutoff;uniform vec2 proximityCutoff;varying vec2 vUv;varying vec2 vUv2;float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#endif\\n}vec3 getViewPosition(const in vec2 screenPosition,const in float depth,const in float viewZ){vec4 clipPosition=vec4(vec3(screenPosition,depth)*2.0-1.0,1.0);float clipW=projectionMatrix[2][3]*viewZ+projectionMatrix[3][3];clipPosition*=clipW;return(inverseProjectionMatrix*clipPosition).xyz;}float getAmbientOcclusion(const in vec3 p,const in vec3 n,const in float depth,const in vec2 uv){float radiusScale=1.0-smoothstep(0.0,distanceCutoff.y,depth);radiusScale=radiusScale*(1.0-minRadiusScale)+minRadiusScale;float radius=RADIUS*radiusScale;float noise=texture2D(noiseTexture,vUv2).r;float baseAngle=noise*PI2;float rings=SPIRAL_TURNS*PI2;float occlusion=0.0;int taps=0;for(int i=0;i<SAMPLES_INT;++i){float alpha=(float(i)+0.5)*INV_SAMPLES_FLOAT;float angle=alpha*rings+baseAngle;vec2 rotation=vec2(cos(angle),sin(angle));vec2 coords=alpha*radius*rotation*texelSize+uv;if(coords.s<0.0||coords.s>1.0||coords.t<0.0||coords.t>1.0){continue;}float sampleDepth=readDepth(coords);float viewZ=getViewZ(sampleDepth);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat linearSampleDepth=viewZToOrthographicDepth(viewZ,cameraNearFar.x,cameraNearFar.y);\\n#else\\nfloat linearSampleDepth=sampleDepth;\\n#endif\\nfloat proximity=abs(depth-linearSampleDepth);if(proximity<proximityCutoff.y){float falloff=1.0-smoothstep(proximityCutoff.x,proximityCutoff.y,proximity);vec3 Q=getViewPosition(coords,sampleDepth,viewZ);vec3 v=Q-p;float vv=dot(v,v);float vn=dot(v,n)-bias;float f=max(RADIUS_SQ-vv,0.0)/RADIUS_SQ;occlusion+=(f*f*f*max(vn/(fade+vv),0.0))*falloff;}++taps;}return occlusion/(4.0*max(float(taps),1.0));}void main(){\\n#ifdef NORMAL_DEPTH\\nvec4 normalDepth=texture2D(normalDepthBuffer,vUv);\\n#else\\nvec4 normalDepth=vec4(texture2D(normalBuffer,vUv).xyz,readDepth(vUv));\\n#endif\\nfloat ao=0.0;float depth=normalDepth.a;float viewZ=getViewZ(depth);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat linearDepth=viewZToOrthographicDepth(viewZ,cameraNearFar.x,cameraNearFar.y);\\n#else\\nfloat linearDepth=depth;\\n#endif\\nif(linearDepth<distanceCutoff.y){vec3 viewPosition=getViewPosition(vUv,depth,viewZ);vec3 viewNormal=unpackRGBToNormal(normalDepth.rgb);ao+=getAmbientOcclusion(viewPosition,viewNormal,linearDepth,vUv);float d=smoothstep(distanceCutoff.x,distanceCutoff.y,linearDepth);ao=mix(ao,0.0,d);\\n#ifdef LEGACY_INTENSITY\\nao=clamp(1.0-pow(1.0-ao,abs(intensity)),0.0,1.0);\\n#endif\\n}gl_FragColor.r=ao;}\";\n\n// src/materials/glsl/ssao.vert\nvar ssao_default2 = \"uniform vec2 noiseScale;varying vec2 vUv;varying vec2 vUv2;void main(){vUv=position.xy*0.5+0.5;vUv2=vUv*noiseScale;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/SSAOMaterial.js\nvar SSAOMaterial = class extends ShaderMaterial16 {\n  /**\n   * Constructs a new SSAO material.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  constructor(camera) {\n    super({\n      name: \"SSAOMaterial\",\n      defines: {\n        SAMPLES_INT: \"0\",\n        INV_SAMPLES_FLOAT: \"0.0\",\n        SPIRAL_TURNS: \"0.0\",\n        RADIUS: \"1.0\",\n        RADIUS_SQ: \"1.0\",\n        DISTANCE_SCALING: \"1\",\n        DEPTH_PACKING: \"0\"\n      },\n      uniforms: {\n        depthBuffer: new Uniform38(null),\n        normalBuffer: new Uniform38(null),\n        normalDepthBuffer: new Uniform38(null),\n        noiseTexture: new Uniform38(null),\n        inverseProjectionMatrix: new Uniform38(new Matrix42()),\n        projectionMatrix: new Uniform38(new Matrix42()),\n        texelSize: new Uniform38(new Vector220()),\n        cameraNearFar: new Uniform38(new Vector220()),\n        distanceCutoff: new Uniform38(new Vector220()),\n        proximityCutoff: new Uniform38(new Vector220()),\n        noiseScale: new Uniform38(new Vector220()),\n        minRadiusScale: new Uniform38(0.33),\n        intensity: new Uniform38(1),\n        fade: new Uniform38(0.01),\n        bias: new Uniform38(0)\n      },\n      blending: NoBlending15,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: ssao_default,\n      vertexShader: ssao_default2\n    });\n    this.copyCameraSettings(camera);\n    this.resolution = new Vector220();\n    this.r = 1;\n  }\n  /**\n   * The current near plane setting.\n   *\n   * @type {Number}\n   * @private\n   */\n  get near() {\n    return this.uniforms.cameraNearFar.value.x;\n  }\n  /**\n   * The current far plane setting.\n   *\n   * @type {Number}\n   * @private\n   */\n  get far() {\n    return this.uniforms.cameraNearFar.value.y;\n  }\n  /**\n   * A combined normal-depth buffer.\n   *\n   * @type {Texture}\n   */\n  set normalDepthBuffer(value) {\n    this.uniforms.normalDepthBuffer.value = value;\n    if (value !== null) {\n      this.defines.NORMAL_DEPTH = \"1\";\n    } else {\n      delete this.defines.NORMAL_DEPTH;\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the combined normal-depth buffer.\n   *\n   * @deprecated Use normalDepthBuffer instead.\n   * @param {Number} value - The buffer.\n   */\n  setNormalDepthBuffer(value) {\n    this.normalDepthBuffer = value;\n  }\n  /**\n   * The normal buffer.\n   *\n   * @type {Texture}\n   */\n  set normalBuffer(value) {\n    this.uniforms.normalBuffer.value = value;\n  }\n  /**\n   * Sets the normal buffer.\n   *\n   * @deprecated Use normalBuffer instead.\n   * @param {Number} value - The buffer.\n   */\n  setNormalBuffer(value) {\n    this.uniforms.normalBuffer.value = value;\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer.\n   *\n   * @deprecated Use depthBuffer and depthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = BasicDepthPacking10) {\n    this.depthBuffer = buffer;\n    this.depthPacking = depthPacking;\n  }\n  /**\n   * The noise texture.\n   *\n   * @type {Texture}\n   */\n  set noiseTexture(value) {\n    this.uniforms.noiseTexture.value = value;\n  }\n  /**\n   * Sets the noise texture.\n   *\n   * @deprecated Use noiseTexture instead.\n   * @param {Number} value - The texture.\n   */\n  setNoiseTexture(value) {\n    this.uniforms.noiseTexture.value = value;\n  }\n  /**\n   * The sample count.\n   *\n   * @type {Number}\n   */\n  get samples() {\n    return Number(this.defines.SAMPLES_INT);\n  }\n  set samples(value) {\n    this.defines.SAMPLES_INT = value.toFixed(0);\n    this.defines.INV_SAMPLES_FLOAT = (1 / value).toFixed(9);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the amount of occlusion samples per pixel.\n   *\n   * @deprecated Use samples instead.\n   * @return {Number} The sample count.\n   */\n  getSamples() {\n    return this.samples;\n  }\n  /**\n   * Sets the amount of occlusion samples per pixel.\n   *\n   * @deprecated Use samples instead.\n   * @param {Number} value - The sample count.\n   */\n  setSamples(value) {\n    this.samples = value;\n  }\n  /**\n   * The sampling spiral ring count.\n   *\n   * @type {Number}\n   */\n  get rings() {\n    return Number(this.defines.SPIRAL_TURNS);\n  }\n  set rings(value) {\n    this.defines.SPIRAL_TURNS = value.toFixed(1);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the amount of spiral turns in the occlusion sampling pattern.\n   *\n   * @deprecated Use rings instead.\n   * @return {Number} The radius.\n   */\n  getRings() {\n    return this.rings;\n  }\n  /**\n   * Sets the amount of spiral turns in the occlusion sampling pattern.\n   *\n   * @deprecated Use rings instead.\n   * @param {Number} value - The radius.\n   */\n  setRings(value) {\n    this.rings = value;\n  }\n  /**\n   * The intensity.\n   *\n   * @type {Number}\n   * @deprecated Use SSAOEffect.intensity instead.\n   */\n  get intensity() {\n    return this.uniforms.intensity.value;\n  }\n  set intensity(value) {\n    this.uniforms.intensity.value = value;\n    if (this.defines.LEGACY_INTENSITY === void 0) {\n      this.defines.LEGACY_INTENSITY = \"1\";\n      this.needsUpdate = true;\n    }\n  }\n  /**\n   * Returns the intensity.\n   *\n   * @deprecated Use SSAOEffect.intensity instead.\n   * @return {Number} The intensity.\n   */\n  getIntensity() {\n    return this.uniforms.intensity.value;\n  }\n  /**\n   * Sets the intensity.\n   *\n   * @deprecated Use SSAOEffect.intensity instead.\n   * @param {Number} value - The intensity.\n   */\n  setIntensity(value) {\n    this.uniforms.intensity.value = value;\n  }\n  /**\n   * The depth fade factor.\n   *\n   * @type {Number}\n   */\n  get fade() {\n    return this.uniforms.fade.value;\n  }\n  set fade(value) {\n    this.uniforms.fade.value = value;\n  }\n  /**\n   * Returns the depth fade factor.\n   *\n   * @deprecated Use fade instead.\n   * @return {Number} The fade factor.\n   */\n  getFade() {\n    return this.uniforms.fade.value;\n  }\n  /**\n   * Sets the depth fade factor.\n   *\n   * @deprecated Use fade instead.\n   * @param {Number} value - The fade factor.\n   */\n  setFade(value) {\n    this.uniforms.fade.value = value;\n  }\n  /**\n   * The depth bias. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get bias() {\n    return this.uniforms.bias.value;\n  }\n  set bias(value) {\n    this.uniforms.bias.value = value;\n  }\n  /**\n   * Returns the depth bias.\n   *\n   * @deprecated Use bias instead.\n   * @return {Number} The bias.\n   */\n  getBias() {\n    return this.uniforms.bias.value;\n  }\n  /**\n   * Sets the depth bias.\n   *\n   * @deprecated Use bias instead.\n   * @param {Number} value - The bias.\n   */\n  setBias(value) {\n    this.uniforms.bias.value = value;\n  }\n  /**\n   * The minimum radius scale for distance scaling. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get minRadiusScale() {\n    return this.uniforms.minRadiusScale.value;\n  }\n  set minRadiusScale(value) {\n    this.uniforms.minRadiusScale.value = value;\n  }\n  /**\n   * Returns the minimum radius scale for distance scaling.\n   *\n   * @deprecated Use minRadiusScale instead.\n   * @return {Number} The minimum radius scale.\n   */\n  getMinRadiusScale() {\n    return this.uniforms.minRadiusScale.value;\n  }\n  /**\n   * Sets the minimum radius scale for distance scaling.\n   *\n   * @deprecated Use minRadiusScale instead.\n   * @param {Number} value - The minimum radius scale.\n   */\n  setMinRadiusScale(value) {\n    this.uniforms.minRadiusScale.value = value;\n  }\n  /**\n   * Updates the absolute radius.\n   *\n   * @private\n   */\n  updateRadius() {\n    const radius = this.r * this.resolution.height;\n    this.defines.RADIUS = radius.toFixed(11);\n    this.defines.RADIUS_SQ = (radius * radius).toFixed(11);\n    this.needsUpdate = true;\n  }\n  /**\n   * The occlusion sampling radius. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get radius() {\n    return this.r;\n  }\n  set radius(value) {\n    this.r = Math.min(Math.max(value, 1e-6), 1);\n    this.updateRadius();\n  }\n  /**\n   * Returns the occlusion sampling radius.\n   *\n   * @deprecated Use radius instead.\n   * @return {Number} The radius.\n   */\n  getRadius() {\n    return this.radius;\n  }\n  /**\n   * Sets the occlusion sampling radius.\n   *\n   * @deprecated Use radius instead.\n   * @param {Number} value - The radius. Range [1e-6, 1.0].\n   */\n  setRadius(value) {\n    this.radius = value;\n  }\n  /**\n   * Indicates whether distance-based radius scaling is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated\n   */\n  get distanceScaling() {\n    return true;\n  }\n  set distanceScaling(value) {\n  }\n  /**\n   * Indicates whether distance-based radius scaling is enabled.\n   *\n   * @deprecated\n   * @return {Boolean} Whether distance scaling is enabled.\n   */\n  isDistanceScalingEnabled() {\n    return this.distanceScaling;\n  }\n  /**\n   * Enables or disables distance-based radius scaling.\n   *\n   * @deprecated\n   * @param {Boolean} value - Whether distance scaling should be enabled.\n   */\n  setDistanceScalingEnabled(value) {\n    this.distanceScaling = value;\n  }\n  /**\n   * The occlusion distance threshold. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get distanceThreshold() {\n    return this.uniforms.distanceCutoff.value.x;\n  }\n  set distanceThreshold(value) {\n    this.uniforms.distanceCutoff.value.set(\n      Math.min(Math.max(value, 0), 1),\n      Math.min(Math.max(value + this.distanceFalloff, 0), 1)\n    );\n  }\n  /**\n   * The occlusion distance threshold in world units.\n   *\n   * @type {Number}\n   */\n  get worldDistanceThreshold() {\n    return -orthographicDepthToViewZ(this.distanceThreshold, this.near, this.far);\n  }\n  set worldDistanceThreshold(value) {\n    this.distanceThreshold = viewZToOrthographicDepth(-value, this.near, this.far);\n  }\n  /**\n   * The occlusion distance falloff. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get distanceFalloff() {\n    return this.uniforms.distanceCutoff.value.y - this.distanceThreshold;\n  }\n  set distanceFalloff(value) {\n    this.uniforms.distanceCutoff.value.y = Math.min(Math.max(this.distanceThreshold + value, 0), 1);\n  }\n  /**\n   * The occlusion distance falloff in world units.\n   *\n   * @type {Number}\n   */\n  get worldDistanceFalloff() {\n    return -orthographicDepthToViewZ(this.distanceFalloff, this.near, this.far);\n  }\n  set worldDistanceFalloff(value) {\n    this.distanceFalloff = viewZToOrthographicDepth(-value, this.near, this.far);\n  }\n  /**\n   * Sets the occlusion distance cutoff.\n   *\n   * @deprecated Use distanceThreshold and distanceFalloff instead.\n   * @param {Number} threshold - The distance threshold. Range [0.0, 1.0].\n   * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n   */\n  setDistanceCutoff(threshold, falloff) {\n    this.uniforms.distanceCutoff.value.set(\n      Math.min(Math.max(threshold, 0), 1),\n      Math.min(Math.max(threshold + falloff, 0), 1)\n    );\n  }\n  /**\n   * The occlusion proximity threshold. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get proximityThreshold() {\n    return this.uniforms.proximityCutoff.value.x;\n  }\n  set proximityThreshold(value) {\n    this.uniforms.proximityCutoff.value.set(\n      Math.min(Math.max(value, 0), 1),\n      Math.min(Math.max(value + this.proximityFalloff, 0), 1)\n    );\n  }\n  /**\n   * The occlusion proximity threshold in world units.\n   *\n   * @type {Number}\n   */\n  get worldProximityThreshold() {\n    return -orthographicDepthToViewZ(this.proximityThreshold, this.near, this.far);\n  }\n  set worldProximityThreshold(value) {\n    this.proximityThreshold = viewZToOrthographicDepth(-value, this.near, this.far);\n  }\n  /**\n   * The occlusion proximity falloff. Range: [0.0, 1.0].\n   *\n   * @type {Number}\n   */\n  get proximityFalloff() {\n    return this.uniforms.proximityCutoff.value.y - this.proximityThreshold;\n  }\n  set proximityFalloff(value) {\n    this.uniforms.proximityCutoff.value.y = Math.min(Math.max(this.proximityThreshold + value, 0), 1);\n  }\n  /**\n   * The occlusion proximity falloff in world units.\n   *\n   * @type {Number}\n   */\n  get worldProximityFalloff() {\n    return -orthographicDepthToViewZ(this.proximityFalloff, this.near, this.far);\n  }\n  set worldProximityFalloff(value) {\n    this.proximityFalloff = viewZToOrthographicDepth(-value, this.near, this.far);\n  }\n  /**\n   * Sets the occlusion proximity cutoff.\n   *\n   * @deprecated Use proximityThreshold and proximityFalloff instead.\n   * @param {Number} threshold - The range threshold. Range [0.0, 1.0].\n   * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n   */\n  setProximityCutoff(threshold, falloff) {\n    this.uniforms.proximityCutoff.value.set(\n      Math.min(Math.max(threshold, 0), 1),\n      Math.min(Math.max(threshold + falloff, 0), 1)\n    );\n  }\n  /**\n   * Sets the texel size.\n   *\n   * @deprecated Use setSize() instead.\n   * @param {Number} x - The texel width.\n   * @param {Number} y - The texel height.\n   */\n  setTexelSize(x, y) {\n    this.uniforms.texelSize.value.set(x, y);\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @deprecated Use copyCameraSettings instead.\n   * @param {Camera} camera - A camera.\n   */\n  adoptCameraSettings(camera) {\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  copyCameraSettings(camera) {\n    if (camera) {\n      this.uniforms.cameraNearFar.value.set(camera.near, camera.far);\n      this.uniforms.projectionMatrix.value.copy(camera.projectionMatrix);\n      this.uniforms.inverseProjectionMatrix.value.copy(camera.projectionMatrix).invert();\n      if (camera instanceof PerspectiveCamera4) {\n        this.defines.PERSPECTIVE_CAMERA = \"1\";\n      } else {\n        delete this.defines.PERSPECTIVE_CAMERA;\n      }\n      this.needsUpdate = true;\n    }\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const uniforms = this.uniforms;\n    const noiseTexture = uniforms.noiseTexture.value;\n    if (noiseTexture !== null) {\n      uniforms.noiseScale.value.set(\n        width / noiseTexture.image.width,\n        height / noiseTexture.image.height\n      );\n    }\n    uniforms.texelSize.value.set(1 / width, 1 / height);\n    this.resolution.set(width, height);\n    this.updateRadius();\n  }\n};\n\n// src/passes/DepthDownsamplingPass.js\nimport { BasicDepthPacking as BasicDepthPacking12, FloatType as FloatType4, NearestFilter as NearestFilter5, WebGLRenderTarget as WebGLRenderTarget15 } from \"three\";\n\n// src/materials/DepthDownsamplingMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking11, NoBlending as NoBlending16, ShaderMaterial as ShaderMaterial17, Uniform as Uniform39, Vector2 as Vector221 } from \"three\";\n\n// src/materials/glsl/depth-downsampling.frag\nvar depth_downsampling_default = \"#include <packing>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\n#ifdef DOWNSAMPLE_NORMALS\\nuniform lowp sampler2D normalBuffer;\\n#endif\\nvarying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;float readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}int findBestDepth(const in float samples[4]){float c=(samples[0]+samples[1]+samples[2]+samples[3])*0.25;float distances[4];distances[0]=abs(c-samples[0]);distances[1]=abs(c-samples[1]);distances[2]=abs(c-samples[2]);distances[3]=abs(c-samples[3]);float maxDistance=max(max(distances[0],distances[1]),max(distances[2],distances[3]));int remaining[3];int rejected[3];int i,j,k;for(i=0,j=0,k=0;i<4;++i){if(distances[i]<maxDistance){remaining[j++]=i;}else{rejected[k++]=i;}}for(;j<3;++j){remaining[j]=rejected[--k];}vec3 s=vec3(samples[remaining[0]],samples[remaining[1]],samples[remaining[2]]);c=(s.x+s.y+s.z)/3.0;distances[0]=abs(c-s.x);distances[1]=abs(c-s.y);distances[2]=abs(c-s.z);float minDistance=min(distances[0],min(distances[1],distances[2]));for(i=0;i<3;++i){if(distances[i]==minDistance){break;}}return remaining[i];}void main(){float d[4];d[0]=readDepth(vUv0);d[1]=readDepth(vUv1);d[2]=readDepth(vUv2);d[3]=readDepth(vUv3);int index=findBestDepth(d);\\n#ifdef DOWNSAMPLE_NORMALS\\nvec3 n[4];n[0]=texture2D(normalBuffer,vUv0).rgb;n[1]=texture2D(normalBuffer,vUv1).rgb;n[2]=texture2D(normalBuffer,vUv2).rgb;n[3]=texture2D(normalBuffer,vUv3).rgb;\\n#else\\nvec3 n[4];n[0]=vec3(0.0);n[1]=vec3(0.0);n[2]=vec3(0.0);n[3]=vec3(0.0);\\n#endif\\ngl_FragColor=vec4(n[index],d[index]);}\";\n\n// src/materials/glsl/depth-downsampling.vert\nvar depth_downsampling_default2 = \"uniform vec2 texelSize;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 uv=position.xy*0.5+0.5;vUv0=uv;vUv1=vec2(uv.x,uv.y+texelSize.y);vUv2=vec2(uv.x+texelSize.x,uv.y);vUv3=uv+texelSize;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/DepthDownsamplingMaterial.js\nvar DepthDownsamplingMaterial = class extends ShaderMaterial17 {\n  /**\n   * Constructs a new depth downsampling material.\n   */\n  constructor() {\n    super({\n      name: \"DepthDownsamplingMaterial\",\n      defines: {\n        DEPTH_PACKING: \"0\"\n      },\n      uniforms: {\n        depthBuffer: new Uniform39(null),\n        normalBuffer: new Uniform39(null),\n        texelSize: new Uniform39(new Vector221())\n      },\n      blending: NoBlending16,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: depth_downsampling_default,\n      vertexShader: depth_downsampling_default2\n    });\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer.\n   *\n   * @deprecated Use depthBuffer and depthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = BasicDepthPacking11) {\n    this.depthBuffer = buffer;\n    this.depthPacking = depthPacking;\n  }\n  /**\n   * The normal buffer.\n   *\n   * @type {Texture}\n   */\n  set normalBuffer(value) {\n    this.uniforms.normalBuffer.value = value;\n    if (value !== null) {\n      this.defines.DOWNSAMPLE_NORMALS = \"1\";\n    } else {\n      delete this.defines.DOWNSAMPLE_NORMALS;\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the normal buffer.\n   *\n   * @deprecated Use normalBuffer instead.\n   * @param {Texture} value - The normal buffer.\n   */\n  setNormalBuffer(value) {\n    this.normalBuffer = value;\n  }\n  /**\n   * Sets the texel size.\n   *\n   * @deprecated Use setSize() instead.\n   * @param {Number} x - The texel width.\n   * @param {Number} y - The texel height.\n   */\n  setTexelSize(x, y) {\n    this.uniforms.texelSize.value.set(x, y);\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/passes/DepthDownsamplingPass.js\nvar DepthDownsamplingPass = class extends Pass {\n  /**\n   * Constructs a new depth downsampling pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Texture} [options.normalBuffer=null] - A texture that contains view space normals. See {@link NormalPass}.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor({\n    normalBuffer = null,\n    resolutionScale = 0.5,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"DepthDownsamplingPass\");\n    const material = new DepthDownsamplingMaterial();\n    material.normalBuffer = normalBuffer;\n    this.fullscreenMaterial = material;\n    this.needsDepthTexture = true;\n    this.needsSwap = false;\n    this.renderTarget = new WebGLRenderTarget15(1, 1, {\n      minFilter: NearestFilter5,\n      magFilter: NearestFilter5,\n      depthBuffer: false,\n      type: FloatType4\n    });\n    this.renderTarget.texture.name = \"DepthDownsamplingPass.Target\";\n    this.renderTarget.texture.generateMipmaps = false;\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n  }\n  /**\n   * The normal(RGB) + depth(A) texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the normal(RGB) + depth(A) texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking12) {\n    this.fullscreenMaterial.depthBuffer = depthTexture;\n    this.fullscreenMaterial.depthPacking = depthPacking;\n  }\n  /**\n   * Downsamples depth and scene normals.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n    renderer.render(this.scene, this.camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    this.renderTarget.setSize(resolution.width, resolution.height);\n    this.fullscreenMaterial.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    const gl = renderer.getContext();\n    const renderable = gl.getExtension(\"EXT_color_buffer_float\") || gl.getExtension(\"EXT_color_buffer_half_float\");\n    if (!renderable) {\n      throw new Error(\"Rendering to float texture is not supported.\");\n    }\n  }\n};\n\n// src/effects/glsl/ssao.frag\nvar ssao_default3 = \"uniform lowp sampler2D aoBuffer;uniform float luminanceInfluence;uniform float intensity;\\n#if defined(DEPTH_AWARE_UPSAMPLING) && defined(NORMAL_DEPTH)\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\n#endif\\n#ifdef COLORIZE\\nuniform vec3 color;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){float aoLinear=texture2D(aoBuffer,uv).r;\\n#if defined(DEPTH_AWARE_UPSAMPLING) && defined(NORMAL_DEPTH) && __VERSION__ == 300\\nvec4 normalDepth[4];normalDepth[0]=textureOffset(normalDepthBuffer,uv,ivec2(0,0));normalDepth[1]=textureOffset(normalDepthBuffer,uv,ivec2(0,1));normalDepth[2]=textureOffset(normalDepthBuffer,uv,ivec2(1,0));normalDepth[3]=textureOffset(normalDepthBuffer,uv,ivec2(1,1));float dot01=dot(normalDepth[0].rgb,normalDepth[1].rgb);float dot02=dot(normalDepth[0].rgb,normalDepth[2].rgb);float dot03=dot(normalDepth[0].rgb,normalDepth[3].rgb);float minDot=min(dot01,min(dot02,dot03));float s=step(THRESHOLD,minDot);float smallestDistance=1.0;int index;for(int i=0;i<4;++i){float distance=abs(depth-normalDepth[i].a);if(distance<smallestDistance){smallestDistance=distance;index=i;}}ivec2 offsets[4];offsets[0]=ivec2(0,0);offsets[1]=ivec2(0,1);offsets[2]=ivec2(1,0);offsets[3]=ivec2(1,1);ivec2 coord=ivec2(uv*vec2(textureSize(aoBuffer,0)))+offsets[index];float aoNearest=texelFetch(aoBuffer,coord,0).r;float ao=mix(aoNearest,aoLinear,s);\\n#else\\nfloat ao=aoLinear;\\n#endif\\nfloat l=luminance(inputColor.rgb);ao=mix(ao,0.0,l*luminanceInfluence);ao=clamp(ao*intensity,0.0,1.0);\\n#ifdef COLORIZE\\noutputColor=vec4(1.0-ao*(1.0-color),inputColor.a);\\n#else\\noutputColor=vec4(vec3(1.0-ao),inputColor.a);\\n#endif\\n}\";\n\n// src/effects/SSAOEffect.js\nvar NOISE_TEXTURE_SIZE = 64;\nvar SSAOEffect = class extends Effect {\n  /**\n   * Constructs a new SSAO effect.\n   *\n   * @todo Move normalBuffer to options.\n   * @param {Camera} [camera] - The main camera.\n   * @param {Texture} [normalBuffer] - A texture that contains the scene normals.\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.MULTIPLY] - The blend function of this effect.\n   * @param {Boolean} [options.distanceScaling=true] - Deprecated.\n   * @param {Boolean} [options.depthAwareUpsampling=true] - Enables or disables depth-aware upsampling. Has no effect if WebGL 2 is not supported.\n   * @param {Texture} [options.normalDepthBuffer=null] - Deprecated.\n   * @param {Number} [options.samples=9] - The amount of samples per pixel. Should not be a multiple of the ring count.\n   * @param {Number} [options.rings=7] - The amount of spiral turns in the occlusion sampling pattern. Should be a prime number.\n   * @param {Number} [options.worldDistanceThreshold] - The world distance threshold at which the occlusion effect starts to fade out.\n   * @param {Number} [options.worldDistanceFalloff] - The world distance falloff. Influences the smoothness of the occlusion cutoff.\n   * @param {Number} [options.worldProximityThreshold] - The world proximity threshold at which the occlusion starts to fade out.\n   * @param {Number} [options.worldProximityFalloff] - The world proximity falloff. Influences the smoothness of the proximity cutoff.\n   * @param {Number} [options.distanceThreshold=0.97] - Deprecated.\n   * @param {Number} [options.distanceFalloff=0.03] - Deprecated.\n   * @param {Number} [options.rangeThreshold=0.0005] - Deprecated.\n   * @param {Number} [options.rangeFalloff=0.001] - Deprecated.\n   * @param {Number} [options.minRadiusScale=0.1] - The minimum radius scale.\n   * @param {Number} [options.luminanceInfluence=0.7] - Determines how much the luminance of the scene influences the ambient occlusion.\n   * @param {Number} [options.radius=0.1825] - The occlusion sampling radius, expressed as a scale relative to the resolution. Range [1e-6, 1.0].\n   * @param {Number} [options.intensity=1.0] - The intensity of the ambient occlusion.\n   * @param {Number} [options.bias=0.025] - An occlusion bias. Eliminates artifacts caused by depth discontinuities.\n   * @param {Number} [options.fade=0.01] - Influences the smoothness of the shadows. A lower value results in higher contrast.\n   * @param {Color} [options.color=null] - The color of the ambient occlusion.\n   * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor(camera, normalBuffer, {\n    blendFunction = BlendFunction.MULTIPLY,\n    samples = 9,\n    rings = 7,\n    normalDepthBuffer = null,\n    depthAwareUpsampling = true,\n    worldDistanceThreshold,\n    worldDistanceFalloff,\n    worldProximityThreshold,\n    worldProximityFalloff,\n    distanceThreshold = 0.97,\n    distanceFalloff = 0.03,\n    rangeThreshold = 5e-4,\n    rangeFalloff = 1e-3,\n    minRadiusScale = 0.1,\n    luminanceInfluence = 0.7,\n    radius = 0.1825,\n    intensity = 1,\n    bias = 0.025,\n    fade = 0.01,\n    color: color2 = null,\n    resolutionScale = 1,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"SSAOEffect\", ssao_default3, {\n      blendFunction,\n      attributes: EffectAttribute.DEPTH,\n      defines: /* @__PURE__ */ new Map([\n        [\"THRESHOLD\", \"0.997\"]\n      ]),\n      uniforms: /* @__PURE__ */ new Map([\n        [\"aoBuffer\", new Uniform40(null)],\n        [\"normalDepthBuffer\", new Uniform40(normalDepthBuffer)],\n        [\"luminanceInfluence\", new Uniform40(luminanceInfluence)],\n        [\"color\", new Uniform40(null)],\n        [\"intensity\", new Uniform40(intensity)],\n        [\"scale\", new Uniform40(0)]\n        // Unused.\n      ])\n    });\n    this.renderTarget = new WebGLRenderTarget16(1, 1, { depthBuffer: false });\n    this.renderTarget.texture.name = \"AO.Target\";\n    this.uniforms.get(\"aoBuffer\").value = this.renderTarget.texture;\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this.camera = camera;\n    this.depthDownsamplingPass = new DepthDownsamplingPass({ normalBuffer, resolutionScale });\n    this.depthDownsamplingPass.enabled = normalDepthBuffer === null;\n    this.ssaoPass = new ShaderPass(new SSAOMaterial(camera));\n    const noiseTexture = new NoiseTexture(NOISE_TEXTURE_SIZE, NOISE_TEXTURE_SIZE, RGBAFormat4);\n    noiseTexture.wrapS = noiseTexture.wrapT = RepeatWrapping3;\n    const ssaoMaterial = this.ssaoMaterial;\n    ssaoMaterial.normalBuffer = normalBuffer;\n    ssaoMaterial.noiseTexture = noiseTexture;\n    ssaoMaterial.minRadiusScale = minRadiusScale;\n    ssaoMaterial.samples = samples;\n    ssaoMaterial.radius = radius;\n    ssaoMaterial.rings = rings;\n    ssaoMaterial.fade = fade;\n    ssaoMaterial.bias = bias;\n    ssaoMaterial.distanceThreshold = distanceThreshold;\n    ssaoMaterial.distanceFalloff = distanceFalloff;\n    ssaoMaterial.proximityThreshold = rangeThreshold;\n    ssaoMaterial.proximityFalloff = rangeFalloff;\n    if (worldDistanceThreshold !== void 0) {\n      ssaoMaterial.worldDistanceThreshold = worldDistanceThreshold;\n    }\n    if (worldDistanceFalloff !== void 0) {\n      ssaoMaterial.worldDistanceFalloff = worldDistanceFalloff;\n    }\n    if (worldProximityThreshold !== void 0) {\n      ssaoMaterial.worldProximityThreshold = worldProximityThreshold;\n    }\n    if (worldProximityFalloff !== void 0) {\n      ssaoMaterial.worldProximityFalloff = worldProximityFalloff;\n    }\n    if (normalDepthBuffer !== null) {\n      this.ssaoMaterial.normalDepthBuffer = normalDepthBuffer;\n      this.defines.set(\"NORMAL_DEPTH\", \"1\");\n    }\n    this.depthAwareUpsampling = depthAwareUpsampling;\n    this.color = color2;\n  }\n  set mainCamera(value) {\n    this.camera = value;\n    this.ssaoMaterial.copyCameraSettings(value);\n  }\n  /**\n   * Sets the normal buffer.\n   *\n   * @type {Texture}\n   */\n  get normalBuffer() {\n    return this.ssaoMaterial.normalBuffer;\n  }\n  set normalBuffer(value) {\n    this.ssaoMaterial.normalBuffer = value;\n    this.depthDownsamplingPass.fullscreenMaterial.normalBuffer = value;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * The SSAO material.\n   *\n   * @type {SSAOMaterial}\n   */\n  get ssaoMaterial() {\n    return this.ssaoPass.fullscreenMaterial;\n  }\n  /**\n   * Returns the SSAO material.\n   *\n   * @deprecated Use ssaoMaterial instead.\n   * @return {SSAOMaterial} The material.\n   */\n  getSSAOMaterial() {\n    return this.ssaoMaterial;\n  }\n  /**\n   * The amount of occlusion samples per pixel.\n   *\n   * @type {Number}\n   * @deprecated Use ssaoMaterial.samples instead.\n   */\n  get samples() {\n    return this.ssaoMaterial.samples;\n  }\n  set samples(value) {\n    this.ssaoMaterial.samples = value;\n  }\n  /**\n   * The amount of spiral turns in the occlusion sampling pattern.\n   *\n   * @type {Number}\n   * @deprecated Use ssaoMaterial.rings instead.\n   */\n  get rings() {\n    return this.ssaoMaterial.rings;\n  }\n  set rings(value) {\n    this.ssaoMaterial.rings = value;\n  }\n  /**\n   * The occlusion sampling radius.\n   *\n   * @type {Number}\n   * @deprecated Use ssaoMaterial.radius instead.\n   */\n  get radius() {\n    return this.ssaoMaterial.radius;\n  }\n  set radius(value) {\n    this.ssaoMaterial.radius = value;\n  }\n  /**\n   * Indicates whether depth-aware upsampling is enabled.\n   *\n   * @type {Boolean}\n   */\n  get depthAwareUpsampling() {\n    return this.defines.has(\"DEPTH_AWARE_UPSAMPLING\");\n  }\n  set depthAwareUpsampling(value) {\n    if (this.depthAwareUpsampling !== value) {\n      if (value) {\n        this.defines.set(\"DEPTH_AWARE_UPSAMPLING\", \"1\");\n      } else {\n        this.defines.delete(\"DEPTH_AWARE_UPSAMPLING\");\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether depth-aware upsampling is enabled.\n   *\n   * @deprecated Use depthAwareUpsampling instead.\n   * @return {Boolean} Whether depth-aware upsampling is enabled.\n   */\n  isDepthAwareUpsamplingEnabled() {\n    return this.depthAwareUpsampling;\n  }\n  /**\n   * Enables or disables depth-aware upsampling.\n   *\n   * @deprecated Use depthAwareUpsampling instead.\n   * @param {Boolean} value - Whether depth-aware upsampling should be enabled.\n   */\n  setDepthAwareUpsamplingEnabled(value) {\n    this.depthAwareUpsampling = value;\n  }\n  /**\n   * Indicates whether distance-based radius scaling is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated\n   */\n  get distanceScaling() {\n    return true;\n  }\n  set distanceScaling(value) {\n  }\n  /**\n   * The color of the ambient occlusion. Set to `null` to disable.\n   *\n   * @type {Color}\n   */\n  get color() {\n    return this.uniforms.get(\"color\").value;\n  }\n  set color(value) {\n    const uniforms = this.uniforms;\n    const defines = this.defines;\n    if (value !== null) {\n      if (defines.has(\"COLORIZE\")) {\n        uniforms.get(\"color\").value.set(value);\n      } else {\n        defines.set(\"COLORIZE\", \"1\");\n        uniforms.get(\"color\").value = new Color8(value);\n        this.setChanged();\n      }\n    } else if (defines.has(\"COLORIZE\")) {\n      defines.delete(\"COLORIZE\");\n      uniforms.get(\"color\").value = null;\n      this.setChanged();\n    }\n  }\n  /**\n   * The luminance influence factor. Range: [0.0, 1.0].\n   *\n   * @type {Boolean}\n   */\n  get luminanceInfluence() {\n    return this.uniforms.get(\"luminanceInfluence\").value;\n  }\n  set luminanceInfluence(value) {\n    this.uniforms.get(\"luminanceInfluence\").value = value;\n  }\n  /**\n   * The intensity.\n   *\n   * @type {Number}\n   */\n  get intensity() {\n    return this.uniforms.get(\"intensity\").value;\n  }\n  set intensity(value) {\n    this.uniforms.get(\"intensity\").value = value;\n  }\n  /**\n   * Returns the color of the ambient occlusion.\n   *\n   * @deprecated Use color instead.\n   * @return {Color} The color.\n   */\n  getColor() {\n    return this.color;\n  }\n  /**\n   * Sets the color of the ambient occlusion. Set to `null` to disable colorization.\n   *\n   * @deprecated Use color instead.\n   * @param {Color} value - The color.\n   */\n  setColor(value) {\n    this.color = value;\n  }\n  /**\n   * Sets the occlusion distance cutoff.\n   *\n   * @deprecated Use ssaoMaterial instead.\n   * @param {Number} threshold - The distance threshold. Range [0.0, 1.0].\n   * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n   */\n  setDistanceCutoff(threshold, falloff) {\n    this.ssaoMaterial.distanceThreshold = threshold;\n    this.ssaoMaterial.distanceFalloff = falloff;\n  }\n  /**\n   * Sets the occlusion proximity cutoff.\n   *\n   * @deprecated Use ssaoMaterial instead.\n   * @param {Number} threshold - The proximity threshold. Range [0.0, 1.0].\n   * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n   */\n  setProximityCutoff(threshold, falloff) {\n    this.ssaoMaterial.proximityThreshold = threshold;\n    this.ssaoMaterial.proximityFalloff = falloff;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking13) {\n    this.depthDownsamplingPass.setDepthTexture(depthTexture, depthPacking);\n    this.ssaoMaterial.depthBuffer = depthTexture;\n    this.ssaoMaterial.depthPacking = depthPacking;\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    const renderTarget = this.renderTarget;\n    if (this.depthDownsamplingPass.enabled) {\n      this.depthDownsamplingPass.render(renderer);\n    }\n    this.ssaoPass.render(renderer, null, renderTarget);\n  }\n  /**\n   * Sets the size.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.ssaoMaterial.copyCameraSettings(this.camera);\n    this.ssaoMaterial.setSize(w, h);\n    this.renderTarget.setSize(w, h);\n    this.depthDownsamplingPass.resolution.scale = resolution.scale;\n    this.depthDownsamplingPass.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    try {\n      let normalDepthBuffer = this.uniforms.get(\"normalDepthBuffer\").value;\n      if (normalDepthBuffer === null) {\n        this.depthDownsamplingPass.initialize(renderer, alpha, frameBufferType);\n        normalDepthBuffer = this.depthDownsamplingPass.texture;\n        this.uniforms.get(\"normalDepthBuffer\").value = normalDepthBuffer;\n        this.ssaoMaterial.normalDepthBuffer = normalDepthBuffer;\n        this.defines.set(\"NORMAL_DEPTH\", \"1\");\n      }\n    } catch (e) {\n      this.depthDownsamplingPass.enabled = false;\n    }\n  }\n};\n\n// src/effects/TextureEffect.js\nimport { Uniform as Uniform41, UnsignedByteType as UnsignedByteType12 } from \"three\";\n\n// src/effects/glsl/texture.frag\nvar texture_default = \"#ifdef TEXTURE_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nvarying vec2 vUv2;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){\\n#ifdef UV_TRANSFORM\\nvec4 texel=texture2D(map,vUv2);\\n#else\\nvec4 texel=texture2D(map,uv);\\n#endif\\noutputColor=TEXEL;}\";\n\n// src/effects/glsl/texture.vert\nvar texture_default2 = \"#ifdef ASPECT_CORRECTION\\nuniform float scale;\\n#else\\nuniform mat3 uvTransform;\\n#endif\\nvarying vec2 vUv2;void mainSupport(const in vec2 uv){\\n#ifdef ASPECT_CORRECTION\\nvUv2=uv*vec2(aspect,1.0)*scale;\\n#else\\nvUv2=(uvTransform*vec3(uv,1.0)).xy;\\n#endif\\n}\";\n\n// src/effects/TextureEffect.js\nvar TextureEffect = class extends Effect {\n  /**\n   * Constructs a new texture effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Texture} [options.texture] - A texture.\n   * @param {Boolean} [options.aspectCorrection=false] - Deprecated. Adjust the texture's offset, repeat and center instead.\n   */\n  constructor({ blendFunction, texture = null, aspectCorrection = false } = {}) {\n    super(\"TextureEffect\", texture_default, {\n      blendFunction,\n      defines: /* @__PURE__ */ new Map([\n        [\"TEXEL\", \"texel\"]\n      ]),\n      uniforms: /* @__PURE__ */ new Map([\n        [\"map\", new Uniform41(null)],\n        [\"scale\", new Uniform41(1)],\n        [\"uvTransform\", new Uniform41(null)]\n      ])\n    });\n    this.texture = texture;\n    this.aspectCorrection = aspectCorrection;\n  }\n  /**\n   * The texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.uniforms.get(\"map\").value;\n  }\n  set texture(value) {\n    const prevTexture = this.texture;\n    const uniforms = this.uniforms;\n    const defines = this.defines;\n    if (prevTexture !== value) {\n      uniforms.get(\"map\").value = value;\n      uniforms.get(\"uvTransform\").value = value.matrix;\n      defines.delete(\"TEXTURE_PRECISION_HIGH\");\n      if (value !== null) {\n        if (value.matrixAutoUpdate) {\n          defines.set(\"UV_TRANSFORM\", \"1\");\n          this.setVertexShader(texture_default2);\n        } else {\n          defines.delete(\"UV_TRANSFORM\");\n          this.setVertexShader(null);\n        }\n        if (value.type !== UnsignedByteType12) {\n          defines.set(\"TEXTURE_PRECISION_HIGH\", \"1\");\n        }\n        if (prevTexture === null || prevTexture.type !== value.type || prevTexture.encoding !== value.encoding) {\n          this.setChanged();\n        }\n      }\n    }\n  }\n  /**\n   * Returns the texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.texture;\n  }\n  /**\n   * Sets the texture.\n   *\n   * @deprecated Use texture instead.\n   * @param {Texture} value - The texture.\n   */\n  setTexture(value) {\n    this.texture = value;\n  }\n  /**\n   * Indicates whether aspect correction is enabled.\n   *\n   * @type {Number}\n   * @deprecated Adjust the texture's offset, repeat, rotation and center instead.\n   */\n  get aspectCorrection() {\n    return this.defines.has(\"ASPECT_CORRECTION\");\n  }\n  set aspectCorrection(value) {\n    if (this.aspectCorrection !== value) {\n      if (value) {\n        this.defines.set(\"ASPECT_CORRECTION\", \"1\");\n      } else {\n        this.defines.delete(\"ASPECT_CORRECTION\");\n      }\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether the texture UV coordinates will be transformed using the transformation matrix of the texture.\n   *\n   * @type {Boolean}\n   * @deprecated Use texture.matrixAutoUpdate instead.\n   */\n  get uvTransform() {\n    const texture = this.texture;\n    return texture !== null && texture.matrixAutoUpdate;\n  }\n  set uvTransform(value) {\n    const texture = this.texture;\n    if (texture !== null) {\n      texture.matrixAutoUpdate = value;\n    }\n  }\n  /**\n   * Sets the swizzles that will be applied to the components of a texel before it is written to the output color.\n   *\n   * @param {ColorChannel} r - The swizzle for the `r` component.\n   * @param {ColorChannel} [g=r] - The swizzle for the `g` component.\n   * @param {ColorChannel} [b=r] - The swizzle for the `b` component.\n   * @param {ColorChannel} [a=r] - The swizzle for the `a` component.\n   */\n  setTextureSwizzleRGBA(r, g = r, b = r, a = r) {\n    const rgba = \"rgba\";\n    let swizzle = \"\";\n    if (r !== ColorChannel.RED || g !== ColorChannel.GREEN || b !== ColorChannel.BLUE || a !== ColorChannel.ALPHA) {\n      swizzle = [\".\", rgba[r], rgba[g], rgba[b], rgba[a]].join(\"\");\n    }\n    this.defines.set(\"TEXEL\", \"texel\" + swizzle);\n    this.setChanged();\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    if (this.texture.matrixAutoUpdate) {\n      this.texture.updateMatrix();\n    }\n  }\n};\n\n// src/effects/TiltShiftEffect.js\nimport { SRGBColorSpace as SRGBColorSpace12, Uniform as Uniform43, Vector2 as Vector223, WebGLRenderTarget as WebGLRenderTarget17 } from \"three\";\n\n// src/materials/TiltShiftBlurMaterial.js\nimport { Uniform as Uniform42, Vector2 as Vector222, Vector4 as Vector44 } from \"three\";\n\n// src/materials/glsl/convolution.tilt-shift.frag\nvar convolution_tilt_shift_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform vec4 maskParams;varying vec2 vUv;varying vec2 vUv2;varying vec2 vOffset;float linearGradientMask(const in float x){return smoothstep(maskParams.x,maskParams.y,x)-smoothstep(maskParams.w,maskParams.z,x);}void main(){vec2 dUv=vOffset*(1.0-linearGradientMask(vUv2.y));vec4 sum=texture2D(inputBuffer,vec2(vUv.x-dUv.x,vUv.y+dUv.y));sum+=texture2D(inputBuffer,vec2(vUv.x+dUv.x,vUv.y+dUv.y));sum+=texture2D(inputBuffer,vec2(vUv.x+dUv.x,vUv.y-dUv.y));sum+=texture2D(inputBuffer,vec2(vUv.x-dUv.x,vUv.y-dUv.y));gl_FragColor=sum*0.25;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.tilt-shift.vert\nvar convolution_tilt_shift_default2 = \"uniform vec4 texelSize;uniform float kernel;uniform float scale;uniform float aspect;uniform vec2 rotation;varying vec2 vUv;varying vec2 vUv2;varying vec2 vOffset;void main(){vec2 uv=position.xy*0.5+0.5;vUv=uv;vUv2=(uv-0.5)*2.0*vec2(aspect,1.0);vUv2=vec2(dot(rotation,vUv2),dot(rotation,vec2(vUv2.y,-vUv2.x)));vOffset=(texelSize.xy*vec2(kernel)+texelSize.zw)*scale;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/TiltShiftBlurMaterial.js\nvar TiltShiftBlurMaterial = class extends KawaseBlurMaterial {\n  /**\n   * Constructs a new tilt shift blur material.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.offset=0.0] - The relative offset of the focus area.\n   * @param {Number} [options.rotation=0.0] - The rotation of the focus area in radians.\n   * @param {Number} [options.focusArea=0.4] - The relative size of the focus area.\n   * @param {Number} [options.feather=0.3] - The softness of the focus area edges.\n   */\n  constructor({\n    kernelSize = KernelSize.MEDIUM,\n    offset = 0,\n    rotation = 0,\n    focusArea = 0.4,\n    feather = 0.3\n  } = {}) {\n    super();\n    this.fragmentShader = convolution_tilt_shift_default;\n    this.vertexShader = convolution_tilt_shift_default2;\n    this.kernelSize = kernelSize;\n    this.uniforms.aspect = new Uniform42(1);\n    this.uniforms.rotation = new Uniform42(new Vector222());\n    this.uniforms.maskParams = new Uniform42(new Vector44());\n    this._offset = offset;\n    this._focusArea = focusArea;\n    this._feather = feather;\n    this.rotation = rotation;\n    this.updateParams();\n  }\n  /**\n   * The relative offset of the focus area.\n   *\n   * @private\n   */\n  updateParams() {\n    const params = this.uniforms.maskParams.value;\n    const a = Math.max(this.focusArea, 0);\n    const b = Math.max(a - this.feather, 0);\n    params.set(\n      this.offset - a,\n      this.offset - b,\n      this.offset + a,\n      this.offset + b\n    );\n  }\n  /**\n   * The rotation of the focus area in radians.\n   *\n   * @type {Number}\n   */\n  get rotation() {\n    return Math.acos(this.uniforms.rotation.value.x);\n  }\n  set rotation(value) {\n    this.uniforms.rotation.value.set(Math.cos(value), Math.sin(value));\n  }\n  /**\n   * The relative offset of the focus area.\n   *\n   * @type {Number}\n   */\n  get offset() {\n    return this._offset;\n  }\n  set offset(value) {\n    this._offset = value;\n    this.updateParams();\n  }\n  /**\n   * The relative size of the focus area.\n   *\n   * @type {Number}\n   */\n  get focusArea() {\n    return this._focusArea;\n  }\n  set focusArea(value) {\n    this._focusArea = value;\n    this.updateParams();\n  }\n  /**\n   * The softness of the focus area edges.\n   *\n   * @type {Number}\n   */\n  get feather() {\n    return this._feather;\n  }\n  set feather(value) {\n    this._feather = value;\n    this.updateParams();\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    super.setSize(width, height);\n    this.uniforms.aspect.value = width / height;\n  }\n};\n\n// src/passes/TiltShiftBlurPass.js\nvar TiltShiftBlurPass = class extends KawaseBlurPass {\n  /**\n   * Constructs a new Kawase blur pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.offset=0.0] - The relative offset of the focus area.\n   * @param {Number} [options.rotation=0.0] - The rotation of the focus area in radians.\n   * @param {Number} [options.focusArea=0.4] - The relative size of the focus area.\n   * @param {Number} [options.feather=0.3] - The softness of the focus area edges.\n   * @param {KernelSize} [options.kernelSize=KernelSize.MEDIUM] - The blur kernel size.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   */\n  constructor({\n    offset = 0,\n    rotation = 0,\n    focusArea = 0.4,\n    feather = 0.3,\n    kernelSize = KernelSize.MEDIUM,\n    resolutionScale = 0.5,\n    resolutionX = Resolution.AUTO_SIZE,\n    resolutionY = Resolution.AUTO_SIZE\n  } = {}) {\n    super({ kernelSize, resolutionScale, resolutionX, resolutionY });\n    this.blurMaterial = new TiltShiftBlurMaterial({ kernelSize, offset, rotation, focusArea, feather });\n  }\n};\n\n// src/effects/glsl/tilt-shift.frag\nvar tilt_shift_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nuniform vec2 maskParams;varying vec2 vUv2;float linearGradientMask(const in float x){return step(maskParams.x,x)-step(maskParams.y,x);}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){float mask=linearGradientMask(vUv2.y);vec4 texel=texture2D(map,uv);outputColor=mix(texel,inputColor,mask);}\";\n\n// src/effects/glsl/tilt-shift.vert\nvar tilt_shift_default2 = \"uniform vec2 rotation;varying vec2 vUv2;void mainSupport(const in vec2 uv){vUv2=(uv-0.5)*2.0*vec2(aspect,1.0);vUv2=vec2(dot(rotation,vUv2),dot(rotation,vec2(vUv2.y,-vUv2.x)));}\";\n\n// src/effects/TiltShiftEffect.js\nvar TiltShiftEffect = class extends Effect {\n  /**\n   * Constructs a new tilt shift Effect\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {Number} [options.offset=0.0] - The relative offset of the focus area.\n   * @param {Number} [options.rotation=0.0] - The rotation of the focus area in radians.\n   * @param {Number} [options.focusArea=0.4] - The relative size of the focus area.\n   * @param {Number} [options.feather=0.3] - The softness of the focus area edges.\n   * @param {Number} [options.bias=0.06] - Deprecated.\n   * @param {KernelSize} [options.kernelSize=KernelSize.MEDIUM] - The blur kernel size.\n   * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   */\n  constructor({\n    blendFunction,\n    offset = 0,\n    rotation = 0,\n    focusArea = 0.4,\n    feather = 0.3,\n    kernelSize = KernelSize.MEDIUM,\n    resolutionScale = 0.5,\n    resolutionX = Resolution.AUTO_SIZE,\n    resolutionY = Resolution.AUTO_SIZE\n  } = {}) {\n    super(\"TiltShiftEffect\", tilt_shift_default, {\n      vertexShader: tilt_shift_default2,\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"rotation\", new Uniform43(new Vector223())],\n        [\"maskParams\", new Uniform43(new Vector223())],\n        [\"map\", new Uniform43(null)]\n      ])\n    });\n    this._offset = offset;\n    this._focusArea = focusArea;\n    this._feather = feather;\n    this.renderTarget = new WebGLRenderTarget17(1, 1, { depthBuffer: false });\n    this.renderTarget.texture.name = \"TiltShift.Target\";\n    this.uniforms.get(\"map\").value = this.renderTarget.texture;\n    this.blurPass = new TiltShiftBlurPass({\n      kernelSize,\n      resolutionScale,\n      resolutionX,\n      resolutionY,\n      offset,\n      rotation,\n      focusArea,\n      feather\n    });\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this.rotation = rotation;\n    this.updateParams();\n  }\n  /**\n   * Updates the mask params.\n   *\n   * @private\n   */\n  updateParams() {\n    const params = this.uniforms.get(\"maskParams\").value;\n    const x = Math.max(this.focusArea - this.feather, 0);\n    params.set(this.offset - x, this.offset + x);\n  }\n  /**\n   * The rotation of the focus area in radians.\n   *\n   * @type {Number}\n   */\n  get rotation() {\n    return Math.acos(this.uniforms.get(\"rotation\").value.x);\n  }\n  set rotation(value) {\n    this.uniforms.get(\"rotation\").value.set(Math.cos(value), Math.sin(value));\n    this.blurPass.blurMaterial.rotation = value;\n  }\n  /**\n   * The relative offset of the focus area.\n   *\n   * @type {Number}\n   */\n  get offset() {\n    return this._offset;\n  }\n  set offset(value) {\n    this._offset = value;\n    this.blurPass.blurMaterial.offset = value;\n    this.updateParams();\n  }\n  /**\n   * The relative size of the focus area.\n   *\n   * @type {Number}\n   */\n  get focusArea() {\n    return this._focusArea;\n  }\n  set focusArea(value) {\n    this._focusArea = value;\n    this.blurPass.blurMaterial.focusArea = value;\n    this.updateParams();\n  }\n  /**\n   * The softness of the focus area edges.\n   *\n   * @type {Number}\n   */\n  get feather() {\n    return this._feather;\n  }\n  set feather(value) {\n    this._feather = value;\n    this.blurPass.blurMaterial.feather = value;\n    this.updateParams();\n  }\n  /**\n   * A blend bias.\n   *\n   * @type {Number}\n   * @deprecated\n   */\n  get bias() {\n    return 0;\n  }\n  set bias(value) {\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    this.blurPass.render(renderer, inputBuffer, this.renderTarget);\n  }\n  /**\n   * Updates the size of internal render targets.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    this.renderTarget.setSize(resolution.width, resolution.height);\n    this.blurPass.resolution.copy(resolution);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.blurPass.initialize(renderer, alpha, frameBufferType);\n    if (frameBufferType !== void 0) {\n      this.renderTarget.texture.type = frameBufferType;\n      if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace12) {\n        this.renderTarget.texture.colorSpace = SRGBColorSpace12;\n      }\n    }\n  }\n};\n\n// src/effects/ToneMappingEffect.js\nimport { LinearMipmapLinearFilter, REVISION as REVISION3, Uniform as Uniform45, WebGLRenderTarget as WebGLRenderTarget19 } from \"three\";\n\n// src/passes/AdaptiveLuminancePass.js\nimport { NearestFilter as NearestFilter6, WebGLRenderTarget as WebGLRenderTarget18 } from \"three\";\n\n// src/materials/AdaptiveLuminanceMaterial.js\nimport { NoBlending as NoBlending17, ShaderMaterial as ShaderMaterial18, Uniform as Uniform44 } from \"three\";\n\n// src/materials/glsl/adaptive-luminance.frag\nvar adaptive_luminance_default = \"#include <packing>\\n#define packFloatToRGBA(v) packDepthToRGBA(v)\\n#define unpackRGBAToFloat(v) unpackRGBAToDepth(v)\\nuniform lowp sampler2D luminanceBuffer0;uniform lowp sampler2D luminanceBuffer1;uniform float minLuminance;uniform float deltaTime;uniform float tau;varying vec2 vUv;void main(){float l0=unpackRGBAToFloat(texture2D(luminanceBuffer0,vUv));\\n#if __VERSION__ < 300\\nfloat l1=texture2DLodEXT(luminanceBuffer1,vUv,MIP_LEVEL_1X1).r;\\n#else\\nfloat l1=textureLod(luminanceBuffer1,vUv,MIP_LEVEL_1X1).r;\\n#endif\\nl0=max(minLuminance,l0);l1=max(minLuminance,l1);float adaptedLum=l0+(l1-l0)*(1.0-exp(-deltaTime*tau));gl_FragColor=(adaptedLum==1.0)?vec4(1.0):packFloatToRGBA(adaptedLum);}\";\n\n// src/materials/AdaptiveLuminanceMaterial.js\nvar AdaptiveLuminanceMaterial = class extends ShaderMaterial18 {\n  /**\n   * Constructs a new adaptive luminance material.\n   */\n  constructor() {\n    super({\n      name: \"AdaptiveLuminanceMaterial\",\n      defines: {\n        MIP_LEVEL_1X1: \"0.0\"\n      },\n      uniforms: {\n        luminanceBuffer0: new Uniform44(null),\n        luminanceBuffer1: new Uniform44(null),\n        minLuminance: new Uniform44(0.01),\n        deltaTime: new Uniform44(0),\n        tau: new Uniform44(1)\n      },\n      extensions: {\n        shaderTextureLOD: true\n      },\n      blending: NoBlending17,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: adaptive_luminance_default,\n      vertexShader: common_default\n    });\n  }\n  /**\n   * The primary luminance buffer that contains the downsampled average luminance.\n   *\n   * @type {Texture}\n   */\n  set luminanceBuffer0(value) {\n    this.uniforms.luminanceBuffer0.value = value;\n  }\n  /**\n   * Sets the primary luminance buffer that contains the downsampled average luminance.\n   *\n   * @deprecated Use luminanceBuffer0 instead.\n   * @param {Texture} value - The buffer.\n   */\n  setLuminanceBuffer0(value) {\n    this.uniforms.luminanceBuffer0.value = value;\n  }\n  /**\n   * The secondary luminance buffer.\n   *\n   * @type {Texture}\n   */\n  set luminanceBuffer1(value) {\n    this.uniforms.luminanceBuffer1.value = value;\n  }\n  /**\n   * Sets the secondary luminance buffer.\n   *\n   * @deprecated Use luminanceBuffer1 instead.\n   * @param {Texture} value - The buffer.\n   */\n  setLuminanceBuffer1(value) {\n    this.uniforms.luminanceBuffer1.value = value;\n  }\n  /**\n   * The 1x1 mipmap level.\n   *\n   * This level is used to identify the smallest mipmap of the primary luminance buffer.\n   *\n   * @type {Number}\n   */\n  set mipLevel1x1(value) {\n    this.defines.MIP_LEVEL_1X1 = value.toFixed(1);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the 1x1 mipmap level.\n   *\n   * @deprecated Use mipLevel1x1 instead.\n   * @param {Number} value - The level.\n   */\n  setMipLevel1x1(value) {\n    this.mipLevel1x1 = value;\n  }\n  /**\n   * The delta time.\n   *\n   * @type {Number}\n   */\n  set deltaTime(value) {\n    this.uniforms.deltaTime.value = value;\n  }\n  /**\n   * Sets the delta time.\n   *\n   * @deprecated Use deltaTime instead.\n   * @param {Number} value - The delta time.\n   */\n  setDeltaTime(value) {\n    this.uniforms.deltaTime.value = value;\n  }\n  /**\n   * The lowest possible luminance value.\n   *\n   * @type {Number}\n   */\n  get minLuminance() {\n    return this.uniforms.minLuminance.value;\n  }\n  set minLuminance(value) {\n    this.uniforms.minLuminance.value = value;\n  }\n  /**\n   * Returns the lowest possible luminance value.\n   *\n   * @deprecated Use minLuminance instead.\n   * @return {Number} The minimum luminance.\n   */\n  getMinLuminance() {\n    return this.uniforms.minLuminance.value;\n  }\n  /**\n   * Sets the minimum luminance.\n   *\n   * @deprecated Use minLuminance instead.\n   * @param {Number} value - The minimum luminance.\n   */\n  setMinLuminance(value) {\n    this.uniforms.minLuminance.value = value;\n  }\n  /**\n   * The luminance adaptation rate.\n   *\n   * @type {Number}\n   */\n  get adaptationRate() {\n    return this.uniforms.tau.value;\n  }\n  set adaptationRate(value) {\n    this.uniforms.tau.value = value;\n  }\n  /**\n   * Returns the luminance adaptation rate.\n   *\n   * @deprecated Use adaptationRate instead.\n   * @return {Number} The adaptation rate.\n   */\n  getAdaptationRate() {\n    return this.uniforms.tau.value;\n  }\n  /**\n   * Sets the luminance adaptation rate.\n   *\n   * @deprecated Use adaptationRate instead.\n   * @param {Number} value - The adaptation rate.\n   */\n  setAdaptationRate(value) {\n    this.uniforms.tau.value = value;\n  }\n};\n\n// src/passes/AdaptiveLuminancePass.js\nvar AdaptiveLuminancePass = class extends Pass {\n  /**\n   * Constructs a new adaptive luminance pass.\n   *\n   * @param {Texture} luminanceBuffer - A buffer that contains the current scene luminance.\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.minLuminance=0.01] - The minimum luminance.\n   * @param {Number} [options.adaptationRate=1.0] - The luminance adaptation rate.\n   */\n  constructor(luminanceBuffer, { minLuminance = 0.01, adaptationRate = 1 } = {}) {\n    super(\"AdaptiveLuminancePass\");\n    this.fullscreenMaterial = new AdaptiveLuminanceMaterial();\n    this.needsSwap = false;\n    this.renderTargetPrevious = new WebGLRenderTarget18(1, 1, {\n      minFilter: NearestFilter6,\n      magFilter: NearestFilter6,\n      depthBuffer: false\n    });\n    this.renderTargetPrevious.texture.name = \"Luminance.Previous\";\n    const material = this.fullscreenMaterial;\n    material.luminanceBuffer0 = this.renderTargetPrevious.texture;\n    material.luminanceBuffer1 = luminanceBuffer;\n    material.minLuminance = minLuminance;\n    material.adaptationRate = adaptationRate;\n    this.renderTargetAdapted = this.renderTargetPrevious.clone();\n    this.renderTargetAdapted.texture.name = \"Luminance.Adapted\";\n    this.copyPass = new CopyPass(this.renderTargetPrevious, false);\n  }\n  /**\n   * The adaptive luminance texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTargetAdapted.texture;\n  }\n  /**\n   * Returns the adaptive 1x1 luminance texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTargetAdapted.texture;\n  }\n  /**\n   * Sets the 1x1 mipmap level.\n   *\n   * This level is used to identify the smallest mipmap of the main luminance texture which contains the downsampled\n   * average scene luminance.\n   *\n   * @type {Number}\n   * @deprecated Use fullscreenMaterial.mipLevel1x1 instead.\n   */\n  set mipLevel1x1(value) {\n    this.fullscreenMaterial.mipLevel1x1 = value;\n  }\n  /**\n   * The luminance adaptation rate.\n   *\n   * @type {Number}\n   * @deprecated Use fullscreenMaterial.adaptationRate instead.\n   */\n  get adaptationRate() {\n    return this.fullscreenMaterial.adaptationRate;\n  }\n  /**\n   * @type {Number}\n   * @deprecated Use fullscreenMaterial.adaptationRate instead.\n   */\n  set adaptationRate(value) {\n    this.fullscreenMaterial.adaptationRate = value;\n  }\n  /**\n   * Renders the scene normals.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    this.fullscreenMaterial.deltaTime = deltaTime;\n    renderer.setRenderTarget(this.renderToScreen ? null : this.renderTargetAdapted);\n    renderer.render(this.scene, this.camera);\n    this.copyPass.render(renderer, this.renderTargetAdapted);\n  }\n};\n\n// src/effects/glsl/tone-mapping.frag\nvar tone_mapping_default = \"#include <tonemapping_pars_fragment>\\nuniform float whitePoint;\\n#if TONE_MAPPING_MODE == 2 || TONE_MAPPING_MODE == 3\\nuniform float middleGrey;\\n#if TONE_MAPPING_MODE == 3\\nuniform lowp sampler2D luminanceBuffer;\\n#else\\nuniform float averageLuminance;\\n#endif\\nvec3 Reinhard2ToneMapping(vec3 color){color*=toneMappingExposure;float l=luminance(color);\\n#if TONE_MAPPING_MODE == 3\\nfloat lumAvg=unpackRGBAToFloat(texture2D(luminanceBuffer,vec2(0.5)));\\n#else\\nfloat lumAvg=averageLuminance;\\n#endif\\nfloat lumScaled=(l*middleGrey)/max(lumAvg,1e-6);float lumCompressed=lumScaled*(1.0+lumScaled/(whitePoint*whitePoint));lumCompressed/=(1.0+lumScaled);return clamp(lumCompressed*color,0.0,1.0);}\\n#elif TONE_MAPPING_MODE == 4\\n#define A 0.15\\n#define B 0.50\\n#define C 0.10\\n#define D 0.20\\n#define E 0.02\\n#define F 0.30\\nvec3 Uncharted2Helper(const in vec3 x){return((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;}vec3 Uncharted2ToneMapping(vec3 color){color*=toneMappingExposure;return clamp(Uncharted2Helper(color)/Uncharted2Helper(vec3(whitePoint)),0.0,1.0);}\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){\\n#if TONE_MAPPING_MODE == 2 || TONE_MAPPING_MODE == 3\\noutputColor=vec4(Reinhard2ToneMapping(inputColor.rgb),inputColor.a);\\n#elif TONE_MAPPING_MODE == 4\\noutputColor=vec4(Uncharted2ToneMapping(inputColor.rgb),inputColor.a);\\n#else\\noutputColor=vec4(toneMapping(inputColor.rgb),inputColor.a);\\n#endif\\n}\";\n\n// src/effects/ToneMappingEffect.js\nvar ToneMappingEffect = class extends Effect {\n  /**\n   * Constructs a new tone mapping effect.\n   *\n   * The additional parameters only affect the Reinhard2 operator.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n   * @param {Boolean} [options.adaptive=false] - Deprecated. Use mode instead.\n   * @param {ToneMappingMode} [options.mode=ToneMappingMode.AGX] - The tone mapping mode.\n   * @param {Number} [options.resolution=256] - The resolution of the luminance texture. Must be a power of two.\n   * @param {Number} [options.maxLuminance=4.0] - Deprecated. Same as whitePoint.\n   * @param {Number} [options.whitePoint=4.0] - The white point.\n   * @param {Number} [options.middleGrey=0.6] - The middle grey factor.\n   * @param {Number} [options.minLuminance=0.01] - The minimum luminance. Prevents very high exposure in dark scenes.\n   * @param {Number} [options.averageLuminance=1.0] - The average luminance. Used for the non-adaptive Reinhard operator.\n   * @param {Number} [options.adaptationRate=1.0] - The luminance adaptation rate.\n   */\n  constructor({\n    blendFunction = BlendFunction.SRC,\n    adaptive = false,\n    mode = adaptive ? ToneMappingMode.REINHARD2_ADAPTIVE : ToneMappingMode.AGX,\n    resolution = 256,\n    maxLuminance = 4,\n    whitePoint = maxLuminance,\n    middleGrey = 0.6,\n    minLuminance = 0.01,\n    averageLuminance = 1,\n    adaptationRate = 1\n  } = {}) {\n    super(\"ToneMappingEffect\", tone_mapping_default, {\n      blendFunction,\n      uniforms: /* @__PURE__ */ new Map([\n        [\"luminanceBuffer\", new Uniform45(null)],\n        [\"maxLuminance\", new Uniform45(maxLuminance)],\n        // Unused\n        [\"whitePoint\", new Uniform45(whitePoint)],\n        [\"middleGrey\", new Uniform45(middleGrey)],\n        [\"averageLuminance\", new Uniform45(averageLuminance)]\n      ])\n    });\n    this.renderTargetLuminance = new WebGLRenderTarget19(1, 1, {\n      minFilter: LinearMipmapLinearFilter,\n      depthBuffer: false\n    });\n    this.renderTargetLuminance.texture.generateMipmaps = true;\n    this.renderTargetLuminance.texture.name = \"Luminance\";\n    this.luminancePass = new LuminancePass({\n      renderTarget: this.renderTargetLuminance\n    });\n    this.adaptiveLuminancePass = new AdaptiveLuminancePass(this.luminancePass.texture, {\n      minLuminance,\n      adaptationRate\n    });\n    this.uniforms.get(\"luminanceBuffer\").value = this.adaptiveLuminancePass.texture;\n    this.resolution = resolution;\n    this.mode = mode;\n  }\n  /**\n   * The tone mapping mode.\n   *\n   * @type {ToneMappingMode}\n   */\n  get mode() {\n    return Number(this.defines.get(\"TONE_MAPPING_MODE\"));\n  }\n  set mode(value) {\n    if (this.mode === value) {\n      return;\n    }\n    const revision = REVISION3.replace(/\\D+/g, \"\");\n    const cineonToneMapping = revision >= 168 ? \"CineonToneMapping(texel)\" : \"OptimizedCineonToneMapping(texel)\";\n    this.defines.clear();\n    this.defines.set(\"TONE_MAPPING_MODE\", value.toFixed(0));\n    switch (value) {\n      case ToneMappingMode.LINEAR:\n        this.defines.set(\"toneMapping(texel)\", \"LinearToneMapping(texel)\");\n        break;\n      case ToneMappingMode.REINHARD:\n        this.defines.set(\"toneMapping(texel)\", \"ReinhardToneMapping(texel)\");\n        break;\n      case ToneMappingMode.CINEON:\n      case ToneMappingMode.OPTIMIZED_CINEON:\n        this.defines.set(\"toneMapping(texel)\", cineonToneMapping);\n        break;\n      case ToneMappingMode.ACES_FILMIC:\n        this.defines.set(\"toneMapping(texel)\", \"ACESFilmicToneMapping(texel)\");\n        break;\n      case ToneMappingMode.AGX:\n        this.defines.set(\"toneMapping(texel)\", \"AgXToneMapping(texel)\");\n        break;\n      case ToneMappingMode.NEUTRAL:\n        this.defines.set(\"toneMapping(texel)\", \"NeutralToneMapping(texel)\");\n        break;\n      default:\n        this.defines.set(\"toneMapping(texel)\", \"texel\");\n        break;\n    }\n    this.adaptiveLuminancePass.enabled = value === ToneMappingMode.REINHARD2_ADAPTIVE;\n    this.setChanged();\n  }\n  /**\n   * Returns the current tone mapping mode.\n   *\n   * @deprecated Use mode instead.\n   * @return {ToneMappingMode} The tone mapping mode.\n   */\n  getMode() {\n    return this.mode;\n  }\n  /**\n   * Sets the tone mapping mode.\n   *\n   * @deprecated Use mode instead.\n   * @param {ToneMappingMode} value - The tone mapping mode.\n   */\n  setMode(value) {\n    this.mode = value;\n  }\n  /**\n   * The white point. Default is `4.0`.\n   *\n   * Only applies to Reinhard2 (Modified & Adaptive).\n   *\n   * @type {Number}\n   */\n  get whitePoint() {\n    return this.uniforms.get(\"whitePoint\").value;\n  }\n  set whitePoint(value) {\n    this.uniforms.get(\"whitePoint\").value = value;\n  }\n  /**\n   * The middle grey factor. Default is `0.6`.\n   *\n   * Only applies to Reinhard2 (Modified & Adaptive).\n   *\n   * @type {Number}\n   */\n  get middleGrey() {\n    return this.uniforms.get(\"middleGrey\").value;\n  }\n  set middleGrey(value) {\n    this.uniforms.get(\"middleGrey\").value = value;\n  }\n  /**\n   * The average luminance.\n   *\n   * Only applies to Reinhard2 (Modified).\n   *\n   * @type {Number}\n   */\n  get averageLuminance() {\n    return this.uniforms.get(\"averageLuminance\").value;\n  }\n  set averageLuminance(value) {\n    this.uniforms.get(\"averageLuminance\").value = value;\n  }\n  /**\n   * The adaptive luminance material.\n   *\n   * @type {AdaptiveLuminanceMaterial}\n   */\n  get adaptiveLuminanceMaterial() {\n    return this.adaptiveLuminancePass.fullscreenMaterial;\n  }\n  /**\n   * Returns the adaptive luminance material.\n   *\n   * @deprecated Use adaptiveLuminanceMaterial instead.\n   * @return {AdaptiveLuminanceMaterial} The material.\n   */\n  getAdaptiveLuminanceMaterial() {\n    return this.adaptiveLuminanceMaterial;\n  }\n  /**\n   * The resolution of the luminance texture. Must be a power of two.\n   *\n   * @type {Number}\n   */\n  get resolution() {\n    return this.luminancePass.resolution.width;\n  }\n  set resolution(value) {\n    const exponent = Math.max(0, Math.ceil(Math.log2(value)));\n    const size = Math.pow(2, exponent);\n    this.luminancePass.resolution.setPreferredSize(size, size);\n    this.adaptiveLuminanceMaterial.mipLevel1x1 = exponent;\n  }\n  /**\n   * Returns the resolution of the luminance texture.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Number} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * Sets the resolution of the luminance texture. Must be a power of two.\n   *\n   * @deprecated Use resolution instead.\n   * @param {Number} value - The resolution.\n   */\n  setResolution(value) {\n    this.resolution = value;\n  }\n  /**\n   * Indicates whether this pass uses adaptive luminance.\n   *\n   * @type {Boolean}\n   * @deprecated Use mode instead.\n   */\n  get adaptive() {\n    return this.mode === ToneMappingMode.REINHARD2_ADAPTIVE;\n  }\n  set adaptive(value) {\n    this.mode = value ? ToneMappingMode.REINHARD2_ADAPTIVE : ToneMappingMode.REINHARD2;\n  }\n  /**\n   * The luminance adaptation rate.\n   *\n   * @type {Number}\n   * @deprecated Use adaptiveLuminanceMaterial.adaptationRate instead.\n   */\n  get adaptationRate() {\n    return this.adaptiveLuminanceMaterial.adaptationRate;\n  }\n  set adaptationRate(value) {\n    this.adaptiveLuminanceMaterial.adaptationRate = value;\n  }\n  /**\n   * @type {Number}\n   * @deprecated\n   */\n  get distinction() {\n    console.warn(this.name, \"distinction was removed.\");\n    return 1;\n  }\n  set distinction(value) {\n    console.warn(this.name, \"distinction was removed.\");\n  }\n  /**\n   * Updates this effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   */\n  update(renderer, inputBuffer, deltaTime) {\n    if (this.adaptiveLuminancePass.enabled) {\n      this.luminancePass.render(renderer, inputBuffer);\n      this.adaptiveLuminancePass.render(renderer, null, null, deltaTime);\n    }\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.adaptiveLuminancePass.initialize(renderer, alpha, frameBufferType);\n  }\n};\n\n// src/effects/VignetteEffect.js\nimport { Uniform as Uniform46 } from \"three\";\n\n// src/effects/glsl/vignette.frag\nvar vignette_default = \"uniform float offset;uniform float darkness;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){const vec2 center=vec2(0.5);vec3 color=inputColor.rgb;\\n#if VIGNETTE_TECHNIQUE == 0\\nfloat d=distance(uv,center);color*=smoothstep(0.8,offset*0.799,d*(darkness+offset));\\n#else\\nvec2 coord=(uv-center)*vec2(offset);color=mix(color,vec3(1.0-darkness),dot(coord,coord));\\n#endif\\noutputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/VignetteEffect.js\nvar VignetteEffect = class extends Effect {\n  /**\n   * Constructs a new Vignette effect.\n   *\n   * @param {Object} [options] - The options.\n   * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n   * @param {VignetteTechnique} [options.technique=VignetteTechnique.DEFAULT] - The Vignette technique.\n   * @param {Boolean} [options.eskil=false] - Deprecated. Use technique instead.\n   * @param {Number} [options.offset=0.5] - The Vignette offset.\n   * @param {Number} [options.darkness=0.5] - The Vignette darkness.\n   */\n  constructor({\n    blendFunction,\n    eskil = false,\n    technique = eskil ? VignetteTechnique.ESKIL : VignetteTechnique.DEFAULT,\n    offset = 0.5,\n    darkness = 0.5\n  } = {}) {\n    super(\"VignetteEffect\", vignette_default, {\n      blendFunction,\n      defines: /* @__PURE__ */ new Map([\n        [\"VIGNETTE_TECHNIQUE\", technique.toFixed(0)]\n      ]),\n      uniforms: /* @__PURE__ */ new Map([\n        [\"offset\", new Uniform46(offset)],\n        [\"darkness\", new Uniform46(darkness)]\n      ])\n    });\n  }\n  /**\n   * The Vignette technique.\n   *\n   * @type {VignetteTechnique}\n   */\n  get technique() {\n    return Number(this.defines.get(\"VIGNETTE_TECHNIQUE\"));\n  }\n  set technique(value) {\n    if (this.technique !== value) {\n      this.defines.set(\"VIGNETTE_TECHNIQUE\", value.toFixed(0));\n      this.setChanged();\n    }\n  }\n  /**\n   * Indicates whether Eskil's Vignette technique is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated Use technique instead.\n   */\n  get eskil() {\n    return this.technique === VignetteTechnique.ESKIL;\n  }\n  /**\n   * Indicates whether Eskil's Vignette technique is enabled.\n   *\n   * @type {Boolean}\n   * @deprecated Use technique instead.\n   */\n  set eskil(value) {\n    this.technique = value ? VignetteTechnique.ESKIL : VignetteTechnique.DEFAULT;\n  }\n  /**\n   * Returns the Vignette technique.\n   *\n   * @deprecated Use technique instead.\n   * @return {VignetteTechnique} The technique.\n   */\n  getTechnique() {\n    return this.technique;\n  }\n  /**\n   * Sets the Vignette technique.\n   *\n   * @deprecated Use technique instead.\n   * @param {VignetteTechnique} value - The technique.\n   */\n  setTechnique(value) {\n    this.technique = value;\n  }\n  /**\n   * The Vignette offset.\n   *\n   * @type {Number}\n   */\n  get offset() {\n    return this.uniforms.get(\"offset\").value;\n  }\n  set offset(value) {\n    this.uniforms.get(\"offset\").value = value;\n  }\n  /**\n   * Returns the Vignette offset.\n   *\n   * @deprecated Use offset instead.\n   * @return {Number} The offset.\n   */\n  getOffset() {\n    return this.offset;\n  }\n  /**\n   * Sets the Vignette offset.\n   *\n   * @deprecated Use offset instead.\n   * @param {Number} value - The offset.\n   */\n  setOffset(value) {\n    this.offset = value;\n  }\n  /**\n   * The Vignette darkness.\n   *\n   * @type {Number}\n   */\n  get darkness() {\n    return this.uniforms.get(\"darkness\").value;\n  }\n  set darkness(value) {\n    this.uniforms.get(\"darkness\").value = value;\n  }\n  /**\n   * Returns the Vignette darkness.\n   *\n   * @deprecated Use darkness instead.\n   * @return {Number} The darkness.\n   */\n  getDarkness() {\n    return this.darkness;\n  }\n  /**\n   * Sets the Vignette darkness.\n   *\n   * @deprecated Use darkness instead.\n   * @param {Number} value - The darkness.\n   */\n  setDarkness(value) {\n    this.darkness = value;\n  }\n};\n\n// src/loaders/LUT3dlLoader.js\nimport { FileLoader, Loader, LoadingManager as LoadingManager2 } from \"three\";\nvar LUT3dlLoader = class extends Loader {\n  /**\n   * Loads a LUT.\n   *\n   * @param {String} url - The URL of the 3dl-file.\n   * @param {Function} [onLoad] - A callback that receives the loaded lookup texture.\n   * @param {Function} [onProgress] - A progress callback that receives the XMLHttpRequest instance.\n   * @param {Function} [onError] - An error callback that receives the URL of the file that failed to load.\n   * @return {Promise<LookupTexture>} A promise that returns the lookup texture.\n   */\n  load(url, onLoad = () => {\n  }, onProgress = () => {\n  }, onError = null) {\n    const externalManager = this.manager;\n    const internalManager = new LoadingManager2();\n    const loader = new FileLoader(internalManager);\n    loader.setPath(this.path);\n    loader.setResponseType(\"text\");\n    return new Promise((resolve, reject) => {\n      internalManager.onError = (url2) => {\n        externalManager.itemError(url2);\n        if (onError !== null) {\n          onError(`Failed to load ${url2}`);\n          resolve();\n        } else {\n          reject(`Failed to load ${url2}`);\n        }\n      };\n      externalManager.itemStart(url);\n      loader.load(url, (data) => {\n        try {\n          const result = this.parse(data);\n          externalManager.itemEnd(url);\n          onLoad(result);\n          resolve(result);\n        } catch (e) {\n          console.error(e);\n          internalManager.onError(url);\n        }\n      }, onProgress);\n    });\n  }\n  /**\n   * Parses the given data.\n   *\n   * @param {String} input - The LUT data.\n   * @return {LookupTexture} The lookup texture.\n   * @throws {Error} Fails if the data is invalid.\n   */\n  parse(input) {\n    const regExpGridInfo = /^[\\d ]+$/m;\n    const regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n    let result = regExpGridInfo.exec(input);\n    if (result === null) {\n      throw new Error(\"Missing grid information\");\n    }\n    const gridLines = result[0].trim().split(/\\s+/g).map((n) => Number(n));\n    const gridStep = gridLines[1] - gridLines[0];\n    const size = gridLines.length;\n    const sizeSq = size ** 2;\n    for (let i = 1, l = gridLines.length; i < l; ++i) {\n      if (gridStep !== gridLines[i] - gridLines[i - 1]) {\n        throw new Error(\"Inconsistent grid size\");\n      }\n    }\n    const data = new Float32Array(size ** 3 * 4);\n    let maxValue = 0;\n    let index = 0;\n    while ((result = regExpDataPoints.exec(input)) !== null) {\n      const r = Number(result[1]);\n      const g = Number(result[2]);\n      const b = Number(result[3]);\n      maxValue = Math.max(maxValue, r, g, b);\n      const bLayer = index % size;\n      const gLayer = Math.floor(index / size) % size;\n      const rLayer = Math.floor(index / sizeSq) % size;\n      const d4 = (bLayer * sizeSq + gLayer * size + rLayer) * 4;\n      data[d4 + 0] = r;\n      data[d4 + 1] = g;\n      data[d4 + 2] = b;\n      data[d4 + 3] = 1;\n      ++index;\n    }\n    const bits = Math.ceil(Math.log2(maxValue));\n    const maxBitValue = Math.pow(2, bits);\n    for (let i = 0, l = data.length; i < l; i += 4) {\n      data[i + 0] /= maxBitValue;\n      data[i + 1] /= maxBitValue;\n      data[i + 2] /= maxBitValue;\n    }\n    return new LookupTexture(data, size);\n  }\n};\n\n// src/loaders/LUTCubeLoader.js\nimport { FileLoader as FileLoader2, Loader as Loader2, LoadingManager as LoadingManager3, Vector3 as Vector37 } from \"three\";\nvar LUTCubeLoader = class extends Loader2 {\n  /**\n   * Loads a LUT.\n   *\n   * @param {String} url - The URL of the CUBE-file.\n   * @param {Function} [onLoad] - A callback that receives the loaded lookup texture.\n   * @param {Function} [onProgress] - A progress callback that receives the XMLHttpRequest instance.\n   * @param {Function} [onError] - An error callback that receives the URL of the file that failed to load.\n   * @return {Promise<LookupTexture>} A promise that returns the lookup texture.\n   */\n  load(url, onLoad = () => {\n  }, onProgress = () => {\n  }, onError = null) {\n    const externalManager = this.manager;\n    const internalManager = new LoadingManager3();\n    const loader = new FileLoader2(internalManager);\n    loader.setPath(this.path);\n    loader.setResponseType(\"text\");\n    return new Promise((resolve, reject) => {\n      internalManager.onError = (url2) => {\n        externalManager.itemError(url2);\n        if (onError !== null) {\n          onError(`Failed to load ${url2}`);\n          resolve();\n        } else {\n          reject(`Failed to load ${url2}`);\n        }\n      };\n      externalManager.itemStart(url);\n      loader.load(url, (data) => {\n        try {\n          const result = this.parse(data);\n          externalManager.itemEnd(url);\n          onLoad(result);\n          resolve(result);\n        } catch (e) {\n          console.error(e);\n          internalManager.onError(url);\n        }\n      }, onProgress);\n    });\n  }\n  /**\n   * Parses the given data.\n   *\n   * @param {String} input - The LUT data.\n   * @return {LookupTexture} The lookup texture.\n   * @throws {Error} Fails if the data is invalid.\n   */\n  parse(input) {\n    const regExpTitle = /TITLE +\"([^\"]*)\"/;\n    const regExpSize = /LUT_3D_SIZE +(\\d+)/;\n    const regExpDomainMin = /DOMAIN_MIN +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n    const regExpDomainMax = /DOMAIN_MAX +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n    const regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n    let result = regExpTitle.exec(input);\n    const title = result !== null ? result[1] : null;\n    result = regExpSize.exec(input);\n    if (result === null) {\n      throw new Error(\"Missing LUT_3D_SIZE information\");\n    }\n    const size = Number(result[1]);\n    const data = new Float32Array(size ** 3 * 4);\n    const domainMin = new Vector37(0, 0, 0);\n    const domainMax = new Vector37(1, 1, 1);\n    result = regExpDomainMin.exec(input);\n    if (result !== null) {\n      domainMin.set(Number(result[1]), Number(result[2]), Number(result[3]));\n    }\n    result = regExpDomainMax.exec(input);\n    if (result !== null) {\n      domainMax.set(Number(result[1]), Number(result[2]), Number(result[3]));\n    }\n    if (domainMin.x > domainMax.x || domainMin.y > domainMax.y || domainMin.z > domainMax.z) {\n      domainMin.set(0, 0, 0);\n      domainMax.set(1, 1, 1);\n      throw new Error(\"Invalid input domain\");\n    }\n    let i = 0;\n    while ((result = regExpDataPoints.exec(input)) !== null) {\n      data[i++] = Number(result[1]);\n      data[i++] = Number(result[2]);\n      data[i++] = Number(result[3]);\n      data[i++] = 1;\n    }\n    const lut = new LookupTexture(data, size);\n    lut.domainMin.copy(domainMin);\n    lut.domainMax.copy(domainMax);\n    if (title !== null) {\n      lut.name = title;\n    }\n    return lut;\n  }\n};\n\n// src/loaders/SMAAImageLoader.js\nimport { Loader as Loader3, LoadingManager as LoadingManager4 } from \"three\";\nvar SMAAImageLoader = class extends Loader3 {\n  /**\n   * Loads the SMAA data images.\n   *\n   * @param {Function} [onLoad] - A callback that receives the search image and area image as a pair.\n   * @param {Function} [onError] - An error callback that receives the URL of the image that failed to load.\n   * @return {Promise<Image[]>} A promise that returns the search image and area image as a pair.\n   */\n  load(onLoad = () => {\n  }, onError = null) {\n    if (arguments.length === 4) {\n      onLoad = arguments[1];\n      onError = arguments[3];\n    } else if (arguments.length === 3 || typeof arguments[0] !== \"function\") {\n      onLoad = arguments[1];\n      onError = null;\n    }\n    const externalManager = this.manager;\n    const internalManager = new LoadingManager4();\n    return new Promise((resolve, reject) => {\n      const searchImage = new Image();\n      const areaImage = new Image();\n      internalManager.onError = (url) => {\n        externalManager.itemError(url);\n        if (onError !== null) {\n          onError(`Failed to load ${url}`);\n          resolve();\n        } else {\n          reject(`Failed to load ${url}`);\n        }\n      };\n      internalManager.onLoad = () => {\n        const result = [searchImage, areaImage];\n        onLoad(result);\n        resolve(result);\n      };\n      searchImage.addEventListener(\"error\", (e) => {\n        internalManager.itemError(\"smaa-search\");\n      });\n      areaImage.addEventListener(\"error\", (e) => {\n        internalManager.itemError(\"smaa-area\");\n      });\n      searchImage.addEventListener(\"load\", () => {\n        externalManager.itemEnd(\"smaa-search\");\n        internalManager.itemEnd(\"smaa-search\");\n      });\n      areaImage.addEventListener(\"load\", () => {\n        externalManager.itemEnd(\"smaa-area\");\n        internalManager.itemEnd(\"smaa-area\");\n      });\n      externalManager.itemStart(\"smaa-search\");\n      externalManager.itemStart(\"smaa-area\");\n      internalManager.itemStart(\"smaa-search\");\n      internalManager.itemStart(\"smaa-area\");\n      searchImage.src = searchImageDataURL_default;\n      areaImage.src = areaImageDataURL_default;\n    });\n  }\n};\n\n// src/materials/BoxBlurMaterial.js\nimport { NoBlending as NoBlending18, PerspectiveCamera as PerspectiveCamera5, ShaderMaterial as ShaderMaterial19, Uniform as Uniform47, Vector2 as Vector224 } from \"three\";\n\n// src/materials/glsl/convolution.box.frag\nvar convolution_box_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#ifdef BILATERAL\\n#include <packing>\\nuniform vec2 cameraNearFar;\\n#ifdef NORMAL_DEPTH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){return texture2D(normalDepthBuffer,uv).a;}\\n#else\\n#if DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}\\n#endif\\nfloat getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#endif\\n}\\n#ifdef PERSPECTIVE_CAMERA\\n#define linearDepth(v) viewZToOrthographicDepth(getViewZ(readDepth(v)), cameraNearFar.x, cameraNearFar.y)\\n#else\\n#define linearDepth(v) readDepth(v)\\n#endif\\n#endif\\n#define getTexel(v) texture2D(inputBuffer, v)\\n#if KERNEL_SIZE == 3\\nvarying vec2 vUv00,vUv01,vUv02;varying vec2 vUv03,vUv04,vUv05;varying vec2 vUv06,vUv07,vUv08;\\n#elif KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13\\nvarying vec2 vUv00,vUv01,vUv02,vUv03,vUv04;varying vec2 vUv05,vUv06,vUv07,vUv08,vUv09;varying vec2 vUv10,vUv11,vUv12,vUv13,vUv14;varying vec2 vUv15,vUv16,vUv17,vUv18,vUv19;varying vec2 vUv20,vUv21,vUv22,vUv23,vUv24;\\n#else\\nuniform vec2 texelSize;uniform float scale;varying vec2 vUv;\\n#endif\\nvoid main(){\\n#if KERNEL_SIZE == 3\\nvec4 c[]=vec4[KERNEL_SIZE_SQ](getTexel(vUv00),getTexel(vUv01),getTexel(vUv02),getTexel(vUv03),getTexel(vUv04),getTexel(vUv05),getTexel(vUv06),getTexel(vUv07),getTexel(vUv08));\\n#ifdef BILATERAL\\nfloat z[]=float[KERNEL_SIZE_SQ](linearDepth(vUv00),linearDepth(vUv01),linearDepth(vUv02),linearDepth(vUv03),linearDepth(vUv04),linearDepth(vUv05),linearDepth(vUv06),linearDepth(vUv07),linearDepth(vUv08));\\n#endif\\n#elif KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13\\nvec4 c[]=vec4[KERNEL_SIZE_SQ](getTexel(vUv00),getTexel(vUv01),getTexel(vUv02),getTexel(vUv03),getTexel(vUv04),getTexel(vUv05),getTexel(vUv06),getTexel(vUv07),getTexel(vUv08),getTexel(vUv09),getTexel(vUv10),getTexel(vUv11),getTexel(vUv12),getTexel(vUv13),getTexel(vUv14),getTexel(vUv15),getTexel(vUv16),getTexel(vUv17),getTexel(vUv18),getTexel(vUv19),getTexel(vUv20),getTexel(vUv21),getTexel(vUv22),getTexel(vUv23),getTexel(vUv24));\\n#ifdef BILATERAL\\nfloat z[]=float[KERNEL_SIZE_SQ](linearDepth(vUv00),linearDepth(vUv01),linearDepth(vUv02),linearDepth(vUv03),linearDepth(vUv04),linearDepth(vUv05),linearDepth(vUv06),linearDepth(vUv07),linearDepth(vUv08),linearDepth(vUv09),linearDepth(vUv10),linearDepth(vUv11),linearDepth(vUv12),linearDepth(vUv13),linearDepth(vUv14),linearDepth(vUv15),linearDepth(vUv16),linearDepth(vUv17),linearDepth(vUv18),linearDepth(vUv19),linearDepth(vUv20),linearDepth(vUv21),linearDepth(vUv22),linearDepth(vUv23),linearDepth(vUv24));\\n#endif\\n#endif\\nvec4 result=vec4(0.0);\\n#ifdef BILATERAL\\nfloat w=0.0;\\n#if KERNEL_SIZE == 3 || (KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13)\\nfloat centerDepth=z[KERNEL_SIZE_SQ_HALF];for(int i=0;i<KERNEL_SIZE_SQ;++i){float d=step(abs(z[i]-centerDepth),DISTANCE_THRESHOLD);result+=c[i]*d;w+=d;}\\n#else\\nfloat centerDepth=linearDepth(vUv);vec2 s=texelSize*scale;for(int x=-KERNEL_SIZE_HALF;x<=KERNEL_SIZE_HALF;++x){for(int y=-KERNEL_SIZE_HALF;y<=KERNEL_SIZE_HALF;++y){vec2 coords=vUv+vec2(x,y)*s;vec4 c=getTexel(coords);float z=(x==0&&y==0)?centerDepth:linearDepth(coords);float d=step(abs(z-centerDepth),DISTANCE_THRESHOLD);result+=c*d;w+=d;}}\\n#endif\\ngl_FragColor=result/max(w,1.0);\\n#else\\n#if KERNEL_SIZE == 3 || (KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13)\\nfor(int i=0;i<KERNEL_SIZE_SQ;++i){result+=c[i];}\\n#else\\nvec2 s=texelSize*scale;for(int x=-KERNEL_SIZE_HALF;x<=KERNEL_SIZE_HALF;++x){for(int y=-KERNEL_SIZE_HALF;y<=KERNEL_SIZE_HALF;++y){result+=getTexel(uv+vec2(x,y)*s);}}\\n#endif\\ngl_FragColor=result*INV_KERNEL_SIZE_SQ;\\n#endif\\n}\";\n\n// src/materials/glsl/convolution.box.vert\nvar convolution_box_default2 = \"uniform vec2 texelSize;uniform float scale;\\n#if KERNEL_SIZE == 3\\nvarying vec2 vUv00,vUv01,vUv02;varying vec2 vUv03,vUv04,vUv05;varying vec2 vUv06,vUv07,vUv08;\\n#elif KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13\\nvarying vec2 vUv00,vUv01,vUv02,vUv03,vUv04;varying vec2 vUv05,vUv06,vUv07,vUv08,vUv09;varying vec2 vUv10,vUv11,vUv12,vUv13,vUv14;varying vec2 vUv15,vUv16,vUv17,vUv18,vUv19;varying vec2 vUv20,vUv21,vUv22,vUv23,vUv24;\\n#else\\nvarying vec2 vUv;\\n#endif\\nvoid main(){vec2 uv=position.xy*0.5+0.5;\\n#if KERNEL_SIZE == 3\\nvec2 s=texelSize*scale;vUv00=uv+s*vec2(-1.0,-1.0);vUv01=uv+s*vec2(0.0,-1.0);vUv02=uv+s*vec2(1.0,-1.0);vUv03=uv+s*vec2(-1.0,0.0);vUv04=uv;vUv05=uv+s*vec2(1.0,0.0);vUv06=uv+s*vec2(-1.0,1.0);vUv07=uv+s*vec2(0.0,1.0);vUv08=uv+s*vec2(1.0,1.0);\\n#elif KERNEL_SIZE == 5\\nvec2 s=texelSize*scale;vUv00=uv+s*vec2(-2.0,-2.0);vUv01=uv+s*vec2(-1.0,-2.0);vUv02=uv+s*vec2(0.0,-2.0);vUv03=uv+s*vec2(1.0,-2.0);vUv04=uv+s*vec2(2.0,-2.0);vUv05=uv+s*vec2(-2.0,-1.0);vUv06=uv+s*vec2(-1.0,-1.0);vUv07=uv+s*vec2(0.0,-1.0);vUv08=uv+s*vec2(1.0,-1.0);vUv09=uv+s*vec2(2.0,-1.0);vUv10=uv+s*vec2(-2.0,0.0);vUv11=uv+s*vec2(-1.0,0.0);vUv12=uv;vUv13=uv+s*vec2(1.0,0.0);vUv14=uv+s*vec2(2.0,0.0);vUv15=uv+s*vec2(-2.0,1.0);vUv16=uv+s*vec2(-1.0,1.0);vUv17=uv+s*vec2(0.0,1.0);vUv18=uv+s*vec2(1.0,1.0);vUv19=uv+s*vec2(2.0,1.0);vUv20=uv+s*vec2(-2.0,2.0);vUv21=uv+s*vec2(-1.0,2.0);vUv22=uv+s*vec2(0.0,2.0);vUv23=uv+s*vec2(1.0,2.0);vUv24=uv+s*vec2(2.0,2.0);\\n#else\\nvUv=uv;\\n#endif\\ngl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/BoxBlurMaterial.js\nvar BoxBlurMaterial = class extends ShaderMaterial19 {\n  /**\n   * Constructs a new box blur material.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.bilateral=false] - Enables or disables bilateral blurring.\n   * @param {Number} [options.kernelSize=5] - The kernel size.\n   */\n  constructor({ bilateral = false, kernelSize = 5 } = {}) {\n    super({\n      name: \"BoxBlurMaterial\",\n      defines: {\n        DEPTH_PACKING: \"0\",\n        DISTANCE_THRESHOLD: \"0.1\"\n      },\n      uniforms: {\n        inputBuffer: new Uniform47(null),\n        depthBuffer: new Uniform47(null),\n        normalDepthBuffer: new Uniform47(null),\n        texelSize: new Uniform47(new Vector224()),\n        cameraNearFar: new Uniform47(new Vector224()),\n        scale: new Uniform47(1)\n      },\n      blending: NoBlending18,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_box_default,\n      vertexShader: convolution_box_default2\n    });\n    this.bilateral = bilateral;\n    this.kernelSize = kernelSize;\n    this.maxVaryingVectors = 8;\n  }\n  /**\n   * The maximum amount of varying vectors.\n   *\n   * Should be synced with `renderer.capabilities.maxVaryings`. Default is 8.\n   *\n   * @type {Number}\n   */\n  set maxVaryingVectors(value) {\n    this.defines.MAX_VARYING_VECTORS = value.toFixed(0);\n  }\n  /**\n   * The kernel size.\n   *\n   * - Must be an odd number\n   * - Kernel size 3 and 5 use optimized code paths\n   * - Default is 5\n   *\n   * @type {Number}\n   */\n  get kernelSize() {\n    return Number(this.defines.KERNEL_SIZE);\n  }\n  set kernelSize(value) {\n    if (value % 2 === 0) {\n      throw new Error(\"The kernel size must be an odd number\");\n    }\n    this.defines.KERNEL_SIZE = value.toFixed(0);\n    this.defines.KERNEL_SIZE_HALF = Math.floor(value / 2).toFixed(0);\n    this.defines.KERNEL_SIZE_SQ = (value ** 2).toFixed(0);\n    this.defines.KERNEL_SIZE_SQ_HALF = Math.floor(value ** 2 / 2).toFixed(0);\n    this.defines.INV_KERNEL_SIZE_SQ = (1 / value ** 2).toFixed(6);\n    this.needsUpdate = true;\n  }\n  /**\n   * The blur scale.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.uniforms.scale.value;\n  }\n  set scale(value) {\n    this.uniforms.scale.value = value;\n  }\n  /**\n   * The current near plane setting.\n   *\n   * @type {Number}\n   * @private\n   */\n  get near() {\n    return this.uniforms.cameraNearFar.value.x;\n  }\n  /**\n   * The current far plane setting.\n   *\n   * @type {Number}\n   * @private\n   */\n  get far() {\n    return this.uniforms.cameraNearFar.value.y;\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * A combined normal-depth buffer. Overrides {@link depthBuffer} if set.\n   *\n   * @type {Texture}\n   */\n  set normalDepthBuffer(value) {\n    this.uniforms.normalDepthBuffer.value = value;\n    if (value !== null) {\n      this.defines.NORMAL_DEPTH = \"1\";\n    } else {\n      delete this.defines.NORMAL_DEPTH;\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Indicates whether bilateral filtering is enabled.\n   *\n   * @type {Boolean}\n   */\n  get bilateral() {\n    return this.defines.BILATERAL !== void 0;\n  }\n  set bilateral(value) {\n    if (value !== null) {\n      this.defines.BILATERAL = \"1\";\n    } else {\n      delete this.defines.BILATERAL;\n    }\n    this.needsUpdate = true;\n  }\n  /**\n   * The bilateral filter distance threshold in world units.\n   *\n   * @type {Number}\n   */\n  get worldDistanceThreshold() {\n    return -orthographicDepthToViewZ(Number(this.defines.DISTANCE_THRESHOLD), this.near, this.far);\n  }\n  set worldDistanceThreshold(value) {\n    const threshold = viewZToOrthographicDepth(-value, this.near, this.far);\n    this.defines.DISTANCE_THRESHOLD = threshold.toFixed(12);\n    this.needsUpdate = true;\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  copyCameraSettings(camera) {\n    if (camera) {\n      this.uniforms.cameraNearFar.value.set(camera.near, camera.far);\n      if (camera instanceof PerspectiveCamera5) {\n        this.defines.PERSPECTIVE_CAMERA = \"1\";\n      } else {\n        delete this.defines.PERSPECTIVE_CAMERA;\n      }\n      this.needsUpdate = true;\n    }\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/materials/DepthCopyMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking14, NoBlending as NoBlending19, ShaderMaterial as ShaderMaterial20, Uniform as Uniform48, Vector2 as Vector225 } from \"three\";\n\n// src/materials/glsl/depth-copy.frag\nvar depth_copy_default = \"#include <packing>\\nvarying vec2 vUv;\\n#ifdef NORMAL_DEPTH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){return texture2D(normalDepthBuffer,uv).a;}\\n#else\\n#if INPUT_DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if INPUT_DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}\\n#endif\\nvoid main(){\\n#if INPUT_DEPTH_PACKING == OUTPUT_DEPTH_PACKING\\ngl_FragColor=texture2D(depthBuffer,vUv);\\n#else\\nfloat depth=readDepth(vUv);\\n#if OUTPUT_DEPTH_PACKING == 3201\\ngl_FragColor=(depth==1.0)?vec4(1.0):packDepthToRGBA(depth);\\n#else\\ngl_FragColor=vec4(vec3(depth),1.0);\\n#endif\\n#endif\\n}\";\n\n// src/materials/glsl/depth-copy.vert\nvar depth_copy_default2 = \"varying vec2 vUv;\\n#if DEPTH_COPY_MODE == 1\\nuniform vec2 texelPosition;\\n#endif\\nvoid main(){\\n#if DEPTH_COPY_MODE == 1\\nvUv=texelPosition;\\n#else\\nvUv=position.xy*0.5+0.5;\\n#endif\\ngl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/DepthCopyMaterial.js\nvar DepthCopyMaterial = class extends ShaderMaterial20 {\n  /**\n   * Constructs a new depth copy material.\n   */\n  constructor() {\n    super({\n      name: \"DepthCopyMaterial\",\n      defines: {\n        INPUT_DEPTH_PACKING: \"0\",\n        OUTPUT_DEPTH_PACKING: \"0\",\n        DEPTH_COPY_MODE: \"0\"\n      },\n      uniforms: {\n        depthBuffer: new Uniform48(null),\n        texelPosition: new Uniform48(new Vector225())\n      },\n      blending: NoBlending19,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: depth_copy_default,\n      vertexShader: depth_copy_default2\n    });\n    this.depthCopyMode = DepthCopyMode.FULL;\n  }\n  /**\n   * The input depth buffer.\n   *\n   * @type {Texture}\n   */\n  get depthBuffer() {\n    return this.uniforms.depthBuffer.value;\n  }\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The input depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  set inputDepthPacking(value) {\n    this.defines.INPUT_DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * The output depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  get outputDepthPacking() {\n    return Number(this.defines.OUTPUT_DEPTH_PACKING);\n  }\n  set outputDepthPacking(value) {\n    this.defines.OUTPUT_DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the input depth buffer.\n   *\n   * @deprecated Use depthBuffer and inputDepthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = BasicDepthPacking14) {\n    this.depthBuffer = buffer;\n    this.inputDepthPacking = depthPacking;\n  }\n  /**\n   * Returns the current input depth packing strategy.\n   *\n   * @deprecated\n   * @return {DepthPackingStrategies} The input depth packing strategy.\n   */\n  getInputDepthPacking() {\n    return Number(this.defines.INPUT_DEPTH_PACKING);\n  }\n  /**\n   * Sets the input depth packing strategy.\n   *\n   * @deprecated Use inputDepthPacking instead.\n   * @param {DepthPackingStrategies} value - The new input depth packing strategy.\n   */\n  setInputDepthPacking(value) {\n    this.defines.INPUT_DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the current output depth packing strategy.\n   *\n   * @deprecated Use outputDepthPacking instead.\n   * @return {DepthPackingStrategies} The output depth packing strategy.\n   */\n  getOutputDepthPacking() {\n    return Number(this.defines.OUTPUT_DEPTH_PACKING);\n  }\n  /**\n   * Sets the output depth packing strategy.\n   *\n   * @deprecated Use outputDepthPacking instead.\n   * @param {DepthPackingStrategies} value - The new output depth packing strategy.\n   */\n  setOutputDepthPacking(value) {\n    this.defines.OUTPUT_DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * The screen space position used for single-texel copy operations.\n   *\n   * @type {Vector2}\n   */\n  get texelPosition() {\n    return this.uniforms.texelPosition.value;\n  }\n  /**\n   * Returns the screen space position used for single-texel copy operations.\n   *\n   * @deprecated Use texelPosition instead.\n   * @return {Vector2} The position.\n   */\n  getTexelPosition() {\n    return this.uniforms.texelPosition.value;\n  }\n  /**\n   * Sets the screen space position used for single-texel copy operations.\n   *\n   * @deprecated\n   * @param {Vector2} value - The position.\n   */\n  setTexelPosition(value) {\n    this.uniforms.texelPosition.value = value;\n  }\n  /**\n   * The depth copy mode.\n   *\n   * @type {DepthCopyMode}\n   */\n  get mode() {\n    return this.depthCopyMode;\n  }\n  set mode(value) {\n    this.depthCopyMode = value;\n    this.defines.DEPTH_COPY_MODE = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Returns the depth copy mode.\n   *\n   * @deprecated Use mode instead.\n   * @return {DepthCopyMode} The depth copy mode.\n   */\n  getMode() {\n    return this.mode;\n  }\n  /**\n   * Sets the depth copy mode.\n   *\n   * @deprecated Use mode instead.\n   * @param {DepthCopyMode} value - The new mode.\n   */\n  setMode(value) {\n    this.mode = value;\n  }\n};\n\n// src/materials/EffectMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking15, NoBlending as NoBlending20, PerspectiveCamera as PerspectiveCamera6, REVISION as REVISION4, ShaderMaterial as ShaderMaterial21, Uniform as Uniform49, Vector2 as Vector226 } from \"three\";\n\n// src/materials/glsl/effect.frag\nvar effect_default = \"#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#define packFloatToRGBA(v) packDepthToRGBA(v)\\n#define unpackRGBAToFloat(v) unpackRGBAToDepth(v)\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#if DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nuniform vec2 resolution;uniform vec2 texelSize;uniform float cameraNear;uniform float cameraFar;uniform float aspect;uniform float time;varying vec2 vUv;vec4 sRGBToLinear(const in vec4 value){return vec4(mix(pow(value.rgb*0.9478672986+vec3(0.0521327014),vec3(2.4)),value.rgb*0.0773993808,vec3(lessThanEqual(value.rgb,vec3(0.04045)))),value.a);}float readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNear,cameraFar);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNear,cameraFar);\\n#endif\\n}vec3 RGBToHCV(const in vec3 RGB){vec4 P=mix(vec4(RGB.bg,-1.0,2.0/3.0),vec4(RGB.gb,0.0,-1.0/3.0),step(RGB.b,RGB.g));vec4 Q=mix(vec4(P.xyw,RGB.r),vec4(RGB.r,P.yzx),step(P.x,RGB.r));float C=Q.x-min(Q.w,Q.y);float H=abs((Q.w-Q.y)/(6.0*C+EPSILON)+Q.z);return vec3(H,C,Q.x);}vec3 RGBToHSL(const in vec3 RGB){vec3 HCV=RGBToHCV(RGB);float L=HCV.z-HCV.y*0.5;float S=HCV.y/(1.0-abs(L*2.0-1.0)+EPSILON);return vec3(HCV.x,S,L);}vec3 HueToRGB(const in float H){float R=abs(H*6.0-3.0)-1.0;float G=2.0-abs(H*6.0-2.0);float B=2.0-abs(H*6.0-4.0);return clamp(vec3(R,G,B),0.0,1.0);}vec3 HSLToRGB(const in vec3 HSL){vec3 RGB=HueToRGB(HSL.x);float C=(1.0-abs(2.0*HSL.z-1.0))*HSL.y;return(RGB-0.5)*C+HSL.z;}FRAGMENT_HEAD void main(){FRAGMENT_MAIN_UV vec4 color0=texture2D(inputBuffer,UV);vec4 color1=vec4(0.0);FRAGMENT_MAIN_IMAGE color0.a=clamp(color0.a,0.0,1.0);gl_FragColor=color0;\\n#ifdef ENCODE_OUTPUT\\n#include <colorspace_fragment>\\n#endif\\n#include <dithering_fragment>\\n}\";\n\n// src/materials/glsl/effect.vert\nvar effect_default2 = \"uniform vec2 resolution;uniform vec2 texelSize;uniform float cameraNear;uniform float cameraFar;uniform float aspect;uniform float time;varying vec2 vUv;VERTEX_HEAD void main(){vUv=position.xy*0.5+0.5;VERTEX_MAIN_SUPPORT gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/EffectMaterial.js\nvar EffectMaterial = class extends ShaderMaterial21 {\n  /**\n   * Constructs a new effect material.\n   *\n   * @param {Map<String, String>} [shaderParts] - Deprecated. Use setShaderData instead.\n   * @param {Map<String, String>} [defines] - Deprecated. Use setShaderData instead.\n   * @param {Map<String, Uniform>} [uniforms] - Deprecated. Use setShaderData instead.\n   * @param {Camera} [camera] - A camera.\n   * @param {Boolean} [dithering=false] - Deprecated.\n   */\n  constructor(shaderParts, defines, uniforms, camera, dithering = false) {\n    super({\n      name: \"EffectMaterial\",\n      defines: {\n        THREE_REVISION: REVISION4.replace(/\\D+/g, \"\"),\n        DEPTH_PACKING: \"0\",\n        ENCODE_OUTPUT: \"1\"\n      },\n      uniforms: {\n        inputBuffer: new Uniform49(null),\n        depthBuffer: new Uniform49(null),\n        resolution: new Uniform49(new Vector226()),\n        texelSize: new Uniform49(new Vector226()),\n        cameraNear: new Uniform49(0.3),\n        cameraFar: new Uniform49(1e3),\n        aspect: new Uniform49(1),\n        time: new Uniform49(0)\n      },\n      blending: NoBlending20,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      dithering\n    });\n    if (shaderParts) {\n      this.setShaderParts(shaderParts);\n    }\n    if (defines) {\n      this.setDefines(defines);\n    }\n    if (uniforms) {\n      this.setUniforms(uniforms);\n    }\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * Sets the input buffer.\n   *\n   * @deprecated Use inputBuffer instead.\n   * @param {Texture} value - The input buffer.\n   */\n  setInputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The depth buffer.\n   *\n   * @type {Texture}\n   */\n  get depthBuffer() {\n    return this.uniforms.depthBuffer.value;\n  }\n  set depthBuffer(value) {\n    this.uniforms.depthBuffer.value = value;\n  }\n  /**\n   * The depth packing strategy.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  get depthPacking() {\n    return Number(this.defines.DEPTH_PACKING);\n  }\n  set depthPacking(value) {\n    this.defines.DEPTH_PACKING = value.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the depth buffer.\n   *\n   * @deprecated Use depthBuffer and depthPacking instead.\n   * @param {Texture} buffer - The depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthBuffer(buffer, depthPacking = BasicDepthPacking15) {\n    this.depthBuffer = buffer;\n    this.depthPacking = depthPacking;\n  }\n  /**\n   * Sets the shader data.\n   *\n   * @param {EffectShaderData} data - The shader data.\n   * @return {EffectMaterial} This material.\n   */\n  setShaderData(data) {\n    this.setShaderParts(data.shaderParts);\n    this.setDefines(data.defines);\n    this.setUniforms(data.uniforms);\n    this.setExtensions(data.extensions);\n  }\n  /**\n   * Sets the shader parts.\n   *\n   * @deprecated Use setShaderData instead.\n   * @param {Map<String, String>} shaderParts - A collection of shader snippets. See {@link EffectShaderSection}.\n   * @return {EffectMaterial} This material.\n   */\n  setShaderParts(shaderParts) {\n    this.fragmentShader = effect_default.replace(EffectShaderSection.FRAGMENT_HEAD, shaderParts.get(EffectShaderSection.FRAGMENT_HEAD) || \"\").replace(EffectShaderSection.FRAGMENT_MAIN_UV, shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_UV) || \"\").replace(EffectShaderSection.FRAGMENT_MAIN_IMAGE, shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_IMAGE) || \"\");\n    this.vertexShader = effect_default2.replace(EffectShaderSection.VERTEX_HEAD, shaderParts.get(EffectShaderSection.VERTEX_HEAD) || \"\").replace(EffectShaderSection.VERTEX_MAIN_SUPPORT, shaderParts.get(EffectShaderSection.VERTEX_MAIN_SUPPORT) || \"\");\n    this.needsUpdate = true;\n    return this;\n  }\n  /**\n   * Sets the shader macros.\n   *\n   * @deprecated Use setShaderData instead.\n   * @param {Map<String, String>} defines - A collection of preprocessor macro definitions.\n   * @return {EffectMaterial} This material.\n   */\n  setDefines(defines) {\n    for (const entry of defines.entries()) {\n      this.defines[entry[0]] = entry[1];\n    }\n    this.needsUpdate = true;\n    return this;\n  }\n  /**\n   * Sets the shader uniforms.\n   *\n   * @deprecated Use setShaderData instead.\n   * @param {Map<String, Uniform>} uniforms - A collection of uniforms.\n   * @return {EffectMaterial} This material.\n   */\n  setUniforms(uniforms) {\n    for (const entry of uniforms.entries()) {\n      this.uniforms[entry[0]] = entry[1];\n    }\n    return this;\n  }\n  /**\n   * Sets the required shader extensions.\n   *\n   * @deprecated Use setShaderData instead.\n   * @param {Set<WebGLExtension>} extensions - A collection of extensions.\n   * @return {EffectMaterial} This material.\n   */\n  setExtensions(extensions) {\n    this.extensions = {};\n    for (const extension of extensions) {\n      this.extensions[extension] = true;\n    }\n    return this;\n  }\n  /**\n   * Indicates whether output encoding is enabled.\n   *\n   * @type {Boolean}\n   */\n  get encodeOutput() {\n    return this.defines.ENCODE_OUTPUT !== void 0;\n  }\n  set encodeOutput(value) {\n    if (this.encodeOutput !== value) {\n      if (value) {\n        this.defines.ENCODE_OUTPUT = \"1\";\n      } else {\n        delete this.defines.ENCODE_OUTPUT;\n      }\n      this.needsUpdate = true;\n    }\n  }\n  /**\n   * Indicates whether output encoding is enabled.\n   *\n   * @deprecated Use encodeOutput instead.\n   * @return {Boolean} Whether output encoding is enabled.\n   */\n  isOutputEncodingEnabled(value) {\n    return this.encodeOutput;\n  }\n  /**\n   * Enables or disables output encoding.\n   *\n   * @deprecated Use encodeOutput instead.\n   * @param {Boolean} value - Whether output encoding should be enabled.\n   */\n  setOutputEncodingEnabled(value) {\n    this.encodeOutput = value;\n  }\n  /**\n   * The time in seconds.\n   *\n   * @type {Number}\n   */\n  get time() {\n    return this.uniforms.time.value;\n  }\n  set time(value) {\n    this.uniforms.time.value = value;\n  }\n  /**\n   * Sets the delta time.\n   *\n   * @deprecated Use time instead.\n   * @param {Number} value - The delta time in seconds.\n   */\n  setDeltaTime(value) {\n    this.uniforms.time.value += value;\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @deprecated Use copyCameraSettings instead.\n   * @param {Camera} camera - A camera.\n   */\n  adoptCameraSettings(camera) {\n    this.copyCameraSettings(camera);\n  }\n  /**\n   * Copies the settings of the given camera.\n   *\n   * @param {Camera} camera - A camera.\n   */\n  copyCameraSettings(camera) {\n    if (camera) {\n      this.uniforms.cameraNear.value = camera.near;\n      this.uniforms.cameraFar.value = camera.far;\n      if (camera instanceof PerspectiveCamera6) {\n        this.defines.PERSPECTIVE_CAMERA = \"1\";\n      } else {\n        delete this.defines.PERSPECTIVE_CAMERA;\n      }\n      this.needsUpdate = true;\n    }\n  }\n  /**\n   * Sets the resolution.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const uniforms = this.uniforms;\n    uniforms.resolution.value.set(width, height);\n    uniforms.texelSize.value.set(1 / width, 1 / height);\n    uniforms.aspect.value = width / height;\n  }\n  /**\n   * An enumeration of shader code placeholders.\n   *\n   * @deprecated Use EffectShaderSection instead.\n   * @type {Object}\n   */\n  static get Section() {\n    return EffectShaderSection;\n  }\n};\n\n// src/materials/GaussianBlurMaterial.js\nimport { NoBlending as NoBlending21, ShaderMaterial as ShaderMaterial22, Uniform as Uniform50, Vector2 as Vector227 } from \"three\";\n\n// src/materials/glsl/convolution.gaussian.frag\nvar convolution_gaussian_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform vec2 kernel[STEPS];varying vec2 vOffset;varying vec2 vUv;void main(){vec4 result=texture2D(inputBuffer,vUv)*kernel[0].y;for(int i=1;i<STEPS;++i){vec2 offset=kernel[i].x*vOffset;vec4 c0=texture2D(inputBuffer,vUv+offset);vec4 c1=texture2D(inputBuffer,vUv-offset);result+=(c0+c1)*kernel[i].y;}gl_FragColor=result;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.gaussian.vert\nvar convolution_gaussian_default2 = \"uniform vec2 texelSize;uniform vec2 direction;uniform float scale;varying vec2 vOffset;varying vec2 vUv;void main(){vOffset=direction*texelSize*scale;vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/GaussianBlurMaterial.js\nvar GaussianBlurMaterial = class extends ShaderMaterial22 {\n  /**\n   * Constructs a new convolution material.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.kernelSize=35] - The kernel size.\n   */\n  constructor({ kernelSize = 35 } = {}) {\n    super({\n      name: \"GaussianBlurMaterial\",\n      uniforms: {\n        inputBuffer: new Uniform50(null),\n        texelSize: new Uniform50(new Vector227()),\n        direction: new Uniform50(new Vector227()),\n        kernel: new Uniform50(null),\n        scale: new Uniform50(1)\n      },\n      blending: NoBlending21,\n      toneMapped: false,\n      depthWrite: false,\n      depthTest: false,\n      fragmentShader: convolution_gaussian_default,\n      vertexShader: convolution_gaussian_default2\n    });\n    this._kernelSize = 0;\n    this.kernelSize = kernelSize;\n  }\n  /**\n   * The input buffer.\n   *\n   * @type {Texture}\n   */\n  set inputBuffer(value) {\n    this.uniforms.inputBuffer.value = value;\n  }\n  /**\n   * The kernel size.\n   *\n   * @type {Number}\n   */\n  get kernelSize() {\n    return this._kernelSize;\n  }\n  set kernelSize(value) {\n    this._kernelSize = value;\n    this.generateKernel(value);\n  }\n  /**\n   * The blur direction.\n   *\n   * @type {Vector2}\n   */\n  get direction() {\n    return this.uniforms.direction.value;\n  }\n  /**\n   * The blur kernel scale. Values greater than 1.0 may introduce artifacts.\n   *\n   * @type {Number}\n   */\n  get scale() {\n    return this.uniforms.scale.value;\n  }\n  set scale(value) {\n    this.uniforms.scale.value = value;\n  }\n  /**\n   * Generates the Gauss kernel.\n   *\n   * @param {KernelSize} kernelSize - The kernel size. Should be an odd number.\n   * @private\n   */\n  generateKernel(kernelSize) {\n    const kernel = new GaussKernel(kernelSize);\n    const steps = kernel.linearSteps;\n    const kernelData = new Float64Array(steps * 2);\n    for (let i = 0, j = 0; i < steps; ++i) {\n      kernelData[j++] = kernel.linearOffsets[i];\n      kernelData[j++] = kernel.linearWeights[i];\n    }\n    this.uniforms.kernel.value = kernelData;\n    this.defines.STEPS = steps.toFixed(0);\n    this.needsUpdate = true;\n  }\n  /**\n   * Sets the size of this object.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.uniforms.texelSize.value.set(1 / width, 1 / height);\n  }\n};\n\n// src/passes/BoxBlurPass.js\nimport { BasicDepthPacking as BasicDepthPacking16, SRGBColorSpace as SRGBColorSpace13, UnsignedByteType as UnsignedByteType13, WebGLRenderTarget as WebGLRenderTarget20 } from \"three\";\nvar BoxBlurPass = class extends Pass {\n  /**\n   * Constructs a new box blur pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.kernelSize=5] - Must be an odd number. The sizes 3 and 5 use optimized code paths.\n   * @param {Number} [options.iterations=1] - The amount of times the blur should be applied.\n   * @param {Number} [options.bilateral=false] - Enables or disables bilateral blurring.\n   * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   */\n  constructor({\n    kernelSize = 5,\n    iterations = 1,\n    bilateral = false,\n    resolutionScale = 1,\n    resolutionX = Resolution.AUTO_SIZE,\n    resolutionY = Resolution.AUTO_SIZE\n  } = {}) {\n    super(\"BoxBlurPass\");\n    this.needsDepthTexture = bilateral;\n    this.renderTargetA = new WebGLRenderTarget20(1, 1, { depthBuffer: false });\n    this.renderTargetA.texture.name = \"Blur.Target.A\";\n    this.renderTargetB = new WebGLRenderTarget20(1, 1, { depthBuffer: false });\n    this.renderTargetB.texture.name = \"Blur.Target.B\";\n    this.blurMaterial = new BoxBlurMaterial({ bilateral, kernelSize });\n    this.copyMaterial = new CopyMaterial();\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this.iterations = iterations;\n  }\n  set mainCamera(value) {\n    this.blurMaterial.copyCameraSettings(value);\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking16) {\n    this.blurMaterial.depthBuffer = depthTexture;\n    this.blurMaterial.depthPacking = depthPacking;\n  }\n  /**\n   * Renders the blur.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const scene = this.scene;\n    const camera = this.camera;\n    const renderTargetA = this.renderTargetA;\n    const renderTargetB = this.renderTargetB;\n    const blurMaterial = this.blurMaterial;\n    this.fullscreenMaterial = blurMaterial;\n    let previousBuffer = inputBuffer;\n    for (let i = 0, l = Math.max(this.iterations, 1); i < l; ++i) {\n      const buffer = (i & 1) === 0 ? renderTargetA : renderTargetB;\n      blurMaterial.inputBuffer = previousBuffer.texture;\n      renderer.setRenderTarget(buffer);\n      renderer.render(scene, camera);\n      previousBuffer = buffer;\n    }\n    this.copyMaterial.inputBuffer = previousBuffer.texture;\n    this.fullscreenMaterial = this.copyMaterial;\n    renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n    renderer.render(scene, camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.renderTargetA.setSize(w, h);\n    this.renderTargetB.setSize(w, h);\n    this.blurMaterial.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (renderer !== null) {\n      this.blurMaterial.maxVaryingVectors = renderer.capabilities.maxVaryings;\n    }\n    if (frameBufferType !== void 0) {\n      this.renderTargetA.texture.type = frameBufferType;\n      this.renderTargetB.texture.type = frameBufferType;\n      if (frameBufferType !== UnsignedByteType13) {\n        this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n      } else if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace13) {\n        this.renderTargetA.texture.colorSpace = SRGBColorSpace13;\n        this.renderTargetB.texture.colorSpace = SRGBColorSpace13;\n      }\n    }\n  }\n};\n\n// src/passes/DepthPickingPass.js\nimport { BasicDepthPacking as BasicDepthPacking18, FloatType as FloatType6, REVISION as REVISION5, RGBADepthPacking as RGBADepthPacking5 } from \"three\";\n\n// src/passes/DepthCopyPass.js\nimport {\n  BasicDepthPacking as BasicDepthPacking17,\n  FloatType as FloatType5,\n  NearestFilter as NearestFilter7,\n  RGBADepthPacking as RGBADepthPacking4,\n  UnsignedByteType as UnsignedByteType14,\n  WebGLRenderTarget as WebGLRenderTarget21\n} from \"three\";\nvar DepthCopyPass = class extends Pass {\n  /**\n   * Constructs a new depth save pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {DepthPackingStrategies} [options.depthPacking=RGBADepthPacking] - The output depth packing.\n   */\n  constructor({ depthPacking = RGBADepthPacking4 } = {}) {\n    super(\"DepthCopyPass\");\n    const material = new DepthCopyMaterial();\n    material.outputDepthPacking = depthPacking;\n    this.fullscreenMaterial = material;\n    this.needsDepthTexture = true;\n    this.needsSwap = false;\n    this.renderTarget = new WebGLRenderTarget21(1, 1, {\n      type: depthPacking === RGBADepthPacking4 ? UnsignedByteType14 : FloatType5,\n      minFilter: NearestFilter7,\n      magFilter: NearestFilter7,\n      depthBuffer: false\n    });\n    this.renderTarget.texture.name = \"DepthCopyPass.Target\";\n  }\n  /**\n   * The output depth texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the output depth texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * The output depth packing.\n   *\n   * @type {DepthPackingStrategies}\n   */\n  get depthPacking() {\n    return this.fullscreenMaterial.outputDepthPacking;\n  }\n  /**\n   * Returns the output depth packing.\n   *\n   * @deprecated Use depthPacking instead.\n   * @return {DepthPackingStrategies} The depth packing.\n   */\n  getDepthPacking() {\n    return this.fullscreenMaterial.outputDepthPacking;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking17) {\n    this.fullscreenMaterial.depthBuffer = depthTexture;\n    this.fullscreenMaterial.inputDepthPacking = depthPacking;\n  }\n  /**\n   * Copies depth from a depth texture.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n    renderer.render(this.scene, this.camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.renderTarget.setSize(width, height);\n  }\n};\n\n// src/passes/DepthPickingPass.js\nvar threeRevision = Number(REVISION5.replace(/\\D+/g, \"\"));\nvar unpackDownscale = 255 / 256;\nvar unpackFactorsLegacy = new Float32Array([\n  unpackDownscale / 256 ** 3,\n  unpackDownscale / 256 ** 2,\n  unpackDownscale / 256,\n  unpackDownscale\n]);\nvar unpackFactors = new Float32Array([\n  unpackDownscale,\n  unpackDownscale / 256,\n  unpackDownscale / 256 ** 2,\n  1 / 256 ** 3\n]);\nfunction unpackRGBAToDepth(packedDepth) {\n  const f = threeRevision >= 167 ? unpackFactors : unpackFactorsLegacy;\n  return (packedDepth[0] * f[0] + packedDepth[1] * f[1] + packedDepth[2] * f[2] + packedDepth[3] * f[3]) / 255;\n}\nvar DepthPickingPass = class extends DepthCopyPass {\n  /**\n   * Constructs a new depth picking pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {DepthPackingStrategies} [options.depthPacking=RGBADepthPacking] - The depth packing.\n   * @param {Number} [options.mode=DepthCopyMode.SINGLE] - The depth copy mode.\n   */\n  constructor({ depthPacking = RGBADepthPacking5, mode = DepthCopyMode.SINGLE } = {}) {\n    if (depthPacking !== RGBADepthPacking5 && depthPacking !== BasicDepthPacking18) {\n      throw new Error(`Unsupported depth packing: ${depthPacking}`);\n    }\n    super({ depthPacking });\n    this.name = \"DepthPickingPass\";\n    this.fullscreenMaterial.mode = mode;\n    this.pixelBuffer = depthPacking === RGBADepthPacking5 ? new Uint8Array(4) : new Float32Array(4);\n    this.callback = null;\n  }\n  /**\n   * Reads depth at a specific screen position.\n   *\n   * Only one depth value can be picked per frame. Calling this method multiple times per frame will overwrite the\n   * picking coordinates. Unresolved promises will be abandoned.\n   *\n   * @example\n   * const ndc = new Vector3();\n   * const clientRect = myViewport.getBoundingClientRect();\n   * const clientX = pointerEvent.clientX - clientRect.left;\n   * const clientY = pointerEvent.clientY - clientRect.top;\n   * ndc.x = (clientX / myViewport.clientWidth) * 2.0 - 1.0;\n   * ndc.y = -(clientY / myViewport.clientHeight) * 2.0 + 1.0;\n   * const depth = await depthPickingPass.readDepth(ndc);\n   * ndc.z = depth * 2.0 - 1.0;\n   *\n   * const worldPosition = ndc.unproject(camera);\n   *\n   * @param {Vector2|Vector3} ndc - Normalized device coordinates. Only X and Y are relevant.\n   * @return {Promise<Number>} A promise that returns the depth on the next frame.\n   */\n  readDepth(ndc) {\n    this.fullscreenMaterial.texelPosition.set(ndc.x * 0.5 + 0.5, ndc.y * 0.5 + 0.5);\n    return new Promise((resolve) => {\n      this.callback = resolve;\n    });\n  }\n  /**\n   * Copies depth and resolves depth picking promises.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const material = this.fullscreenMaterial;\n    const mode = material.mode;\n    if (mode === DepthCopyMode.FULL) {\n      super.render(renderer);\n    }\n    if (this.callback !== null) {\n      const renderTarget = this.renderTarget;\n      const pixelBuffer = this.pixelBuffer;\n      const packed = renderTarget.texture.type !== FloatType6;\n      let x = 0, y = 0;\n      if (mode === DepthCopyMode.SINGLE) {\n        super.render(renderer);\n      } else {\n        const texelPosition = material.texelPosition;\n        x = Math.round(texelPosition.x * renderTarget.width);\n        y = Math.round(texelPosition.y * renderTarget.height);\n      }\n      renderer.readRenderTargetPixels(renderTarget, x, y, 1, 1, pixelBuffer);\n      this.callback(packed ? unpackRGBAToDepth(pixelBuffer) : pixelBuffer[0]);\n      this.callback = null;\n    }\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    if (this.fullscreenMaterial.mode === DepthCopyMode.FULL) {\n      super.setSize(width, height);\n    }\n  }\n};\n\n// src/passes/EffectPass.js\nimport { BasicDepthPacking as BasicDepthPacking19, NoColorSpace as NoColorSpace2, SRGBColorSpace as SRGBColorSpace14, UnsignedByteType as UnsignedByteType15 } from \"three\";\nfunction prefixSubstrings(prefix, substrings, strings) {\n  for (const substring of substrings) {\n    const prefixed = \"$1\" + prefix + substring.charAt(0).toUpperCase() + substring.slice(1);\n    const regExp = new RegExp(\"([^\\\\.])(\\\\b\" + substring + \"\\\\b)\", \"g\");\n    for (const entry of strings.entries()) {\n      if (entry[1] !== null) {\n        strings.set(entry[0], entry[1].replace(regExp, prefixed));\n      }\n    }\n  }\n}\nfunction integrateEffect(prefix, effect, data) {\n  let fragmentShader = effect.getFragmentShader();\n  let vertexShader = effect.getVertexShader();\n  const mainImageExists = fragmentShader !== void 0 && /mainImage/.test(fragmentShader);\n  const mainUvExists = fragmentShader !== void 0 && /mainUv/.test(fragmentShader);\n  data.attributes |= effect.getAttributes();\n  if (fragmentShader === void 0) {\n    throw new Error(`Missing fragment shader (${effect.name})`);\n  } else if (mainUvExists && (data.attributes & EffectAttribute.CONVOLUTION) !== 0) {\n    throw new Error(`Effects that transform UVs are incompatible with convolution effects (${effect.name})`);\n  } else if (!mainImageExists && !mainUvExists) {\n    throw new Error(`Could not find mainImage or mainUv function (${effect.name})`);\n  } else {\n    const functionRegExp = /\\w+\\s+(\\w+)\\([\\w\\s,]*\\)\\s*{/g;\n    const shaderParts = data.shaderParts;\n    let fragmentHead = shaderParts.get(EffectShaderSection.FRAGMENT_HEAD) || \"\";\n    let fragmentMainUv = shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_UV) || \"\";\n    let fragmentMainImage = shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_IMAGE) || \"\";\n    let vertexHead = shaderParts.get(EffectShaderSection.VERTEX_HEAD) || \"\";\n    let vertexMainSupport = shaderParts.get(EffectShaderSection.VERTEX_MAIN_SUPPORT) || \"\";\n    const varyings = /* @__PURE__ */ new Set();\n    const names = /* @__PURE__ */ new Set();\n    if (mainUvExists) {\n      fragmentMainUv += `\t${prefix}MainUv(UV);\n`;\n      data.uvTransformation = true;\n    }\n    if (vertexShader !== null && /mainSupport/.test(vertexShader)) {\n      const needsUv = /mainSupport *\\([\\w\\s]*?uv\\s*?\\)/.test(vertexShader);\n      vertexMainSupport += `\t${prefix}MainSupport(`;\n      vertexMainSupport += needsUv ? \"vUv);\\n\" : \");\\n\";\n      for (const m2 of vertexShader.matchAll(/(?:varying\\s+\\w+\\s+([\\S\\s]*?);)/g)) {\n        for (const n of m2[1].split(/\\s*,\\s*/)) {\n          data.varyings.add(n);\n          varyings.add(n);\n          names.add(n);\n        }\n      }\n      for (const m2 of vertexShader.matchAll(functionRegExp)) {\n        names.add(m2[1]);\n      }\n    }\n    for (const m2 of fragmentShader.matchAll(functionRegExp)) {\n      names.add(m2[1]);\n    }\n    for (const d of effect.defines.keys()) {\n      names.add(d.replace(/\\([\\w\\s,]*\\)/g, \"\"));\n    }\n    for (const u of effect.uniforms.keys()) {\n      names.add(u);\n    }\n    names.delete(\"while\");\n    names.delete(\"for\");\n    names.delete(\"if\");\n    effect.uniforms.forEach((val, key) => data.uniforms.set(prefix + key.charAt(0).toUpperCase() + key.slice(1), val));\n    effect.defines.forEach((val, key) => data.defines.set(prefix + key.charAt(0).toUpperCase() + key.slice(1), val));\n    const shaders = /* @__PURE__ */ new Map([[\"fragment\", fragmentShader], [\"vertex\", vertexShader]]);\n    prefixSubstrings(prefix, names, data.defines);\n    prefixSubstrings(prefix, names, shaders);\n    fragmentShader = shaders.get(\"fragment\");\n    vertexShader = shaders.get(\"vertex\");\n    const blendMode = effect.blendMode;\n    data.blendModes.set(blendMode.blendFunction, blendMode);\n    if (mainImageExists) {\n      if (effect.inputColorSpace !== null && effect.inputColorSpace !== data.colorSpace) {\n        fragmentMainImage += effect.inputColorSpace === SRGBColorSpace14 ? \"color0 = sRGBTransferOETF(color0);\\n\t\" : \"color0 = sRGBToLinear(color0);\\n\t\";\n      }\n      if (effect.outputColorSpace !== NoColorSpace2) {\n        data.colorSpace = effect.outputColorSpace;\n      } else if (effect.inputColorSpace !== null) {\n        data.colorSpace = effect.inputColorSpace;\n      }\n      const depthParamRegExp = /MainImage *\\([\\w\\s,]*?depth[\\w\\s,]*?\\)/;\n      fragmentMainImage += `${prefix}MainImage(color0, UV, `;\n      if ((data.attributes & EffectAttribute.DEPTH) !== 0 && depthParamRegExp.test(fragmentShader)) {\n        fragmentMainImage += \"depth, \";\n        data.readDepth = true;\n      }\n      fragmentMainImage += \"color1);\\n\t\";\n      const blendOpacity = prefix + \"BlendOpacity\";\n      data.uniforms.set(blendOpacity, blendMode.opacity);\n      fragmentMainImage += `color0 = blend${blendMode.blendFunction}(color0, color1, ${blendOpacity});\n\n\t`;\n      fragmentHead += `uniform float ${blendOpacity};\n\n`;\n    }\n    fragmentHead += fragmentShader + \"\\n\";\n    if (vertexShader !== null) {\n      vertexHead += vertexShader + \"\\n\";\n    }\n    shaderParts.set(EffectShaderSection.FRAGMENT_HEAD, fragmentHead);\n    shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_UV, fragmentMainUv);\n    shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_IMAGE, fragmentMainImage);\n    shaderParts.set(EffectShaderSection.VERTEX_HEAD, vertexHead);\n    shaderParts.set(EffectShaderSection.VERTEX_MAIN_SUPPORT, vertexMainSupport);\n    if (effect.extensions !== null) {\n      for (const extension of effect.extensions) {\n        data.extensions.add(extension);\n      }\n    }\n  }\n}\nvar EffectPass = class extends Pass {\n  /**\n   * Constructs a new effect pass.\n   *\n   * @param {Camera} camera - The main camera.\n   * @param {...Effect} effects - The effects that will be rendered by this pass.\n   */\n  constructor(camera, ...effects) {\n    super(\"EffectPass\");\n    this.fullscreenMaterial = new EffectMaterial(null, null, null, camera);\n    this.listener = (event) => this.handleEvent(event);\n    this.effects = [];\n    this.setEffects(effects);\n    this.skipRendering = false;\n    this.minTime = 1;\n    this.maxTime = Number.POSITIVE_INFINITY;\n    this.timeScale = 1;\n  }\n  set mainScene(value) {\n    for (const effect of this.effects) {\n      effect.mainScene = value;\n    }\n  }\n  set mainCamera(value) {\n    this.fullscreenMaterial.copyCameraSettings(value);\n    for (const effect of this.effects) {\n      effect.mainCamera = value;\n    }\n  }\n  /**\n   * Indicates whether this pass encodes its output when rendering to screen.\n   *\n   * @type {Boolean}\n   * @deprecated Use fullscreenMaterial.encodeOutput instead.\n   */\n  get encodeOutput() {\n    return this.fullscreenMaterial.encodeOutput;\n  }\n  set encodeOutput(value) {\n    this.fullscreenMaterial.encodeOutput = value;\n  }\n  /**\n   * Indicates whether dithering is enabled.\n   *\n   * @type {Boolean}\n   */\n  get dithering() {\n    return this.fullscreenMaterial.dithering;\n  }\n  set dithering(value) {\n    const material = this.fullscreenMaterial;\n    material.dithering = value;\n    material.needsUpdate = true;\n  }\n  /**\n   * Sets the effects.\n   *\n   * @param {Effect[]} effects - The effects.\n   * @protected\n   */\n  setEffects(effects) {\n    for (const effect of this.effects) {\n      effect.removeEventListener(\"change\", this.listener);\n    }\n    this.effects = effects.sort((a, b) => b.attributes - a.attributes);\n    for (const effect of this.effects) {\n      effect.addEventListener(\"change\", this.listener);\n    }\n  }\n  /**\n   * Updates the compound shader material.\n   *\n   * @protected\n   */\n  updateMaterial() {\n    const data = new EffectShaderData();\n    let id = 0;\n    for (const effect of this.effects) {\n      if (effect.blendMode.blendFunction === BlendFunction.DST) {\n        data.attributes |= effect.getAttributes() & EffectAttribute.DEPTH;\n      } else if ((data.attributes & effect.getAttributes() & EffectAttribute.CONVOLUTION) !== 0) {\n        throw new Error(`Convolution effects cannot be merged (${effect.name})`);\n      } else {\n        integrateEffect(\"e\" + id++, effect, data);\n      }\n    }\n    let fragmentHead = data.shaderParts.get(EffectShaderSection.FRAGMENT_HEAD);\n    let fragmentMainImage = data.shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_IMAGE);\n    let fragmentMainUv = data.shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_UV);\n    const blendRegExp = /\\bblend\\b/g;\n    for (const blendMode of data.blendModes.values()) {\n      fragmentHead += blendMode.getShaderCode().replace(blendRegExp, `blend${blendMode.blendFunction}`) + \"\\n\";\n    }\n    if ((data.attributes & EffectAttribute.DEPTH) !== 0) {\n      if (data.readDepth) {\n        fragmentMainImage = \"float depth = readDepth(UV);\\n\\n\t\" + fragmentMainImage;\n      }\n      this.needsDepthTexture = this.getDepthTexture() === null;\n    } else {\n      this.needsDepthTexture = false;\n    }\n    if (data.colorSpace === SRGBColorSpace14) {\n      fragmentMainImage += \"color0 = sRGBToLinear(color0);\\n\t\";\n    }\n    if (data.uvTransformation) {\n      fragmentMainUv = \"vec2 transformedUv = vUv;\\n\" + fragmentMainUv;\n      data.defines.set(\"UV\", \"transformedUv\");\n    } else {\n      data.defines.set(\"UV\", \"vUv\");\n    }\n    data.shaderParts.set(EffectShaderSection.FRAGMENT_HEAD, fragmentHead);\n    data.shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_IMAGE, fragmentMainImage);\n    data.shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_UV, fragmentMainUv);\n    for (const [key, value] of data.shaderParts) {\n      if (value !== null) {\n        data.shaderParts.set(key, value.trim().replace(/^#/, \"\\n#\"));\n      }\n    }\n    this.skipRendering = id === 0;\n    this.needsSwap = !this.skipRendering;\n    this.fullscreenMaterial.setShaderData(data);\n  }\n  /**\n   * Rebuilds the shader material.\n   */\n  recompile() {\n    this.updateMaterial();\n  }\n  /**\n   * Returns the current depth texture.\n   *\n   * @return {Texture} The current depth texture, or null if there is none.\n   */\n  getDepthTexture() {\n    return this.fullscreenMaterial.depthBuffer;\n  }\n  /**\n   * Sets the depth texture.\n   *\n   * @param {Texture} depthTexture - A depth texture.\n   * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n   */\n  setDepthTexture(depthTexture, depthPacking = BasicDepthPacking19) {\n    this.fullscreenMaterial.depthBuffer = depthTexture;\n    this.fullscreenMaterial.depthPacking = depthPacking;\n    for (const effect of this.effects) {\n      effect.setDepthTexture(depthTexture, depthPacking);\n    }\n  }\n  /**\n   * Renders the effect.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    for (const effect of this.effects) {\n      effect.update(renderer, inputBuffer, deltaTime);\n    }\n    if (!this.skipRendering || this.renderToScreen) {\n      const material = this.fullscreenMaterial;\n      material.inputBuffer = inputBuffer.texture;\n      material.time += deltaTime * this.timeScale;\n      renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n      renderer.render(this.scene, this.camera);\n    }\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    this.fullscreenMaterial.setSize(width, height);\n    for (const effect of this.effects) {\n      effect.setSize(width, height);\n    }\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    this.renderer = renderer;\n    for (const effect of this.effects) {\n      effect.initialize(renderer, alpha, frameBufferType);\n    }\n    this.updateMaterial();\n    if (frameBufferType !== void 0 && frameBufferType !== UnsignedByteType15) {\n      this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n    }\n  }\n  /**\n   * Deletes disposable objects.\n   */\n  dispose() {\n    super.dispose();\n    for (const effect of this.effects) {\n      effect.removeEventListener(\"change\", this.listener);\n      effect.dispose();\n    }\n  }\n  /**\n   * Handles events.\n   *\n   * @param {Event} event - An event.\n   */\n  handleEvent(event) {\n    switch (event.type) {\n      case \"change\":\n        this.recompile();\n        break;\n    }\n  }\n};\n\n// src/passes/GaussianBlurPass.js\nimport { SRGBColorSpace as SRGBColorSpace15, UnsignedByteType as UnsignedByteType16, WebGLRenderTarget as WebGLRenderTarget22 } from \"three\";\nvar GaussianBlurPass = class extends Pass {\n  /**\n   * Constructs a new Gaussian blur pass.\n   *\n   * @param {Object} [options] - The options.\n   * @param {Number} [options.kernelSize=35] - The kernel size. Should be an odd number in the range [3, 1020].\n   * @param {Number} [options.iterations=1] - The amount of times the blur should be applied.\n   * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   */\n  constructor({\n    kernelSize = 35,\n    iterations = 1,\n    resolutionScale = 1,\n    resolutionX = Resolution.AUTO_SIZE,\n    resolutionY = Resolution.AUTO_SIZE\n  } = {}) {\n    super(\"GaussianBlurPass\");\n    this.renderTargetA = new WebGLRenderTarget22(1, 1, { depthBuffer: false });\n    this.renderTargetA.texture.name = \"Blur.Target.A\";\n    this.renderTargetB = this.renderTargetA.clone();\n    this.renderTargetB.texture.name = \"Blur.Target.B\";\n    this.blurMaterial = new GaussianBlurMaterial({ kernelSize });\n    this.copyMaterial = new CopyMaterial();\n    this.copyMaterial.inputBuffer = this.renderTargetB.texture;\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n    this.iterations = iterations;\n  }\n  /**\n   * Renders the blur.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const scene = this.scene;\n    const camera = this.camera;\n    const renderTargetA = this.renderTargetA;\n    const renderTargetB = this.renderTargetB;\n    const blurMaterial = this.blurMaterial;\n    this.fullscreenMaterial = blurMaterial;\n    let previousBuffer = inputBuffer;\n    for (let i = 0, l = Math.max(this.iterations, 1); i < l; ++i) {\n      blurMaterial.direction.set(1, 0);\n      blurMaterial.inputBuffer = previousBuffer.texture;\n      renderer.setRenderTarget(renderTargetA);\n      renderer.render(scene, camera);\n      blurMaterial.direction.set(0, 1);\n      blurMaterial.inputBuffer = renderTargetA.texture;\n      renderer.setRenderTarget(renderTargetB);\n      renderer.render(scene, camera);\n      if (i === 0 && l > 1) {\n        previousBuffer = renderTargetB;\n      }\n    }\n    this.fullscreenMaterial = this.copyMaterial;\n    renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n    renderer.render(scene, camera);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    const w = resolution.width, h = resolution.height;\n    this.renderTargetA.setSize(w, h);\n    this.renderTargetB.setSize(w, h);\n    this.blurMaterial.setSize(width, height);\n  }\n  /**\n   * Performs initialization tasks.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n   * @param {Number} frameBufferType - The type of the main frame buffers.\n   */\n  initialize(renderer, alpha, frameBufferType) {\n    if (frameBufferType !== void 0) {\n      this.renderTargetA.texture.type = frameBufferType;\n      this.renderTargetB.texture.type = frameBufferType;\n      if (frameBufferType !== UnsignedByteType16) {\n        this.blurMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n        this.copyMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n      } else if (renderer !== null && renderer.outputColorSpace === SRGBColorSpace15) {\n        this.renderTargetA.texture.colorSpace = SRGBColorSpace15;\n        this.renderTargetB.texture.colorSpace = SRGBColorSpace15;\n      }\n    }\n  }\n};\n\n// src/passes/LambdaPass.js\nvar LambdaPass = class extends Pass {\n  /**\n   * Constructs a new lambda pass.\n   *\n   * @param {Function} f - A function.\n   */\n  constructor(f) {\n    super(\"LambdaPass\", null, null);\n    this.needsSwap = false;\n    this.f = f;\n  }\n  /**\n   * Executes the function.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    this.f();\n  }\n};\n\n// src/passes/NormalPass.js\nimport { Color as Color9, MeshNormalMaterial, NearestFilter as NearestFilter8, WebGLRenderTarget as WebGLRenderTarget23 } from \"three\";\nvar NormalPass = class extends Pass {\n  /**\n   * Constructs a new normal pass.\n   *\n   * @param {Scene} scene - The scene to render.\n   * @param {Camera} camera - The camera to use to render the scene.\n   * @param {Object} [options] - The options.\n   * @param {WebGLRenderTarget} [options.renderTarget] - A custom render target.\n   * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n   * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n   * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n   * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n   * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n   */\n  constructor(scene, camera, {\n    renderTarget,\n    resolutionScale = 1,\n    width = Resolution.AUTO_SIZE,\n    height = Resolution.AUTO_SIZE,\n    resolutionX = width,\n    resolutionY = height\n  } = {}) {\n    super(\"NormalPass\");\n    this.needsSwap = false;\n    this.renderPass = new RenderPass(scene, camera, new MeshNormalMaterial());\n    const renderPass = this.renderPass;\n    renderPass.ignoreBackground = true;\n    renderPass.skipShadowMapUpdate = true;\n    const clearPass = renderPass.getClearPass();\n    clearPass.overrideClearColor = new Color9(7829503);\n    clearPass.overrideClearAlpha = 1;\n    this.renderTarget = renderTarget;\n    if (this.renderTarget === void 0) {\n      this.renderTarget = new WebGLRenderTarget23(1, 1, {\n        minFilter: NearestFilter8,\n        magFilter: NearestFilter8\n      });\n      this.renderTarget.texture.name = \"NormalPass.Target\";\n    }\n    const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n    resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n  }\n  set mainScene(value) {\n    this.renderPass.mainScene = value;\n  }\n  set mainCamera(value) {\n    this.renderPass.mainCamera = value;\n  }\n  /**\n   * The normal texture.\n   *\n   * @type {Texture}\n   */\n  get texture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * The normal texture.\n   *\n   * @deprecated Use texture instead.\n   * @return {Texture} The texture.\n   */\n  getTexture() {\n    return this.renderTarget.texture;\n  }\n  /**\n   * Returns the resolution settings.\n   *\n   * @deprecated Use resolution instead.\n   * @return {Resolution} The resolution.\n   */\n  getResolution() {\n    return this.resolution;\n  }\n  /**\n   * Returns the current resolution scale.\n   *\n   * @return {Number} The resolution scale.\n   * @deprecated Use resolution.preferredWidth or resolution.preferredHeight instead.\n   */\n  getResolutionScale() {\n    return this.resolution.scale;\n  }\n  /**\n   * Sets the resolution scale.\n   *\n   * @param {Number} scale - The new resolution scale.\n   * @deprecated Use resolution.preferredWidth or resolution.preferredHeight instead.\n   */\n  setResolutionScale(scale) {\n    this.resolution.scale = scale;\n  }\n  /**\n   * Renders the scene normals.\n   *\n   * @param {WebGLRenderer} renderer - The renderer.\n   * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n   * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n   * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n   * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n   */\n  render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n    const renderTarget = this.renderToScreen ? null : this.renderTarget;\n    this.renderPass.render(renderer, renderTarget, renderTarget);\n  }\n  /**\n   * Updates the size of this pass.\n   *\n   * @param {Number} width - The width.\n   * @param {Number} height - The height.\n   */\n  setSize(width, height) {\n    const resolution = this.resolution;\n    resolution.setBaseSize(width, height);\n    this.renderTarget.setSize(resolution.width, resolution.height);\n  }\n};\n\n// src/textures/lut/TetrahedralUpscaler.js\nvar P = [\n  new Float32Array(3),\n  new Float32Array(3)\n];\nvar C = [\n  new Float32Array(3),\n  new Float32Array(3),\n  new Float32Array(3),\n  new Float32Array(3)\n];\nvar T = [\n  [\n    new Float32Array([0, 0, 0]),\n    new Float32Array([1, 0, 0]),\n    new Float32Array([1, 1, 0]),\n    new Float32Array([1, 1, 1])\n  ],\n  [\n    new Float32Array([0, 0, 0]),\n    new Float32Array([1, 0, 0]),\n    new Float32Array([1, 0, 1]),\n    new Float32Array([1, 1, 1])\n  ],\n  [\n    new Float32Array([0, 0, 0]),\n    new Float32Array([0, 0, 1]),\n    new Float32Array([1, 0, 1]),\n    new Float32Array([1, 1, 1])\n  ],\n  [\n    new Float32Array([0, 0, 0]),\n    new Float32Array([0, 1, 0]),\n    new Float32Array([1, 1, 0]),\n    new Float32Array([1, 1, 1])\n  ],\n  [\n    new Float32Array([0, 0, 0]),\n    new Float32Array([0, 1, 0]),\n    new Float32Array([0, 1, 1]),\n    new Float32Array([1, 1, 1])\n  ],\n  [\n    new Float32Array([0, 0, 0]),\n    new Float32Array([0, 0, 1]),\n    new Float32Array([0, 1, 1]),\n    new Float32Array([1, 1, 1])\n  ]\n];\nfunction calculateTetrahedronVolume(a, b, c2, d) {\n  const bcX = c2[0] - b[0];\n  const bcY = c2[1] - b[1];\n  const bcZ = c2[2] - b[2];\n  const baX = a[0] - b[0];\n  const baY = a[1] - b[1];\n  const baZ = a[2] - b[2];\n  const crossX = bcY * baZ - bcZ * baY;\n  const crossY = bcZ * baX - bcX * baZ;\n  const crossZ = bcX * baY - bcY * baX;\n  const length = Math.sqrt(crossX * crossX + crossY * crossY + crossZ * crossZ);\n  const triangleArea = length * 0.5;\n  const normalX = crossX / length;\n  const normalY = crossY / length;\n  const normalZ = crossZ / length;\n  const constant = -(a[0] * normalX + a[1] * normalY + a[2] * normalZ);\n  const dot = d[0] * normalX + d[1] * normalY + d[2] * normalZ;\n  const height = Math.abs(dot + constant);\n  return height * triangleArea / 3;\n}\nfunction sample(data, size, x, y, z, color2) {\n  const i4 = (x + y * size + z * size * size) * 4;\n  color2[0] = data[i4 + 0];\n  color2[1] = data[i4 + 1];\n  color2[2] = data[i4 + 2];\n}\nfunction tetrahedralSample(data, size, u, v3, w, color2) {\n  const px = u * (size - 1);\n  const py = v3 * (size - 1);\n  const pz = w * (size - 1);\n  const minX = Math.floor(px);\n  const minY = Math.floor(py);\n  const minZ = Math.floor(pz);\n  const maxX = Math.ceil(px);\n  const maxY = Math.ceil(py);\n  const maxZ = Math.ceil(pz);\n  const su = px - minX;\n  const sv = py - minY;\n  const sw = pz - minZ;\n  if (minX === px && minY === py && minZ === pz) {\n    sample(data, size, px, py, pz, color2);\n  } else {\n    let vertices;\n    if (su >= sv && sv >= sw) {\n      vertices = T[0];\n    } else if (su >= sw && sw >= sv) {\n      vertices = T[1];\n    } else if (sw >= su && su >= sv) {\n      vertices = T[2];\n    } else if (sv >= su && su >= sw) {\n      vertices = T[3];\n    } else if (sv >= sw && sw >= su) {\n      vertices = T[4];\n    } else if (sw >= sv && sv >= su) {\n      vertices = T[5];\n    }\n    const [P0, P1, P2, P3] = vertices;\n    const coords = P[0];\n    coords[0] = su;\n    coords[1] = sv;\n    coords[2] = sw;\n    const tmp = P[1];\n    const diffX = maxX - minX;\n    const diffY = maxY - minY;\n    const diffZ = maxZ - minZ;\n    tmp[0] = diffX * P0[0] + minX;\n    tmp[1] = diffY * P0[1] + minY;\n    tmp[2] = diffZ * P0[2] + minZ;\n    sample(data, size, tmp[0], tmp[1], tmp[2], C[0]);\n    tmp[0] = diffX * P1[0] + minX;\n    tmp[1] = diffY * P1[1] + minY;\n    tmp[2] = diffZ * P1[2] + minZ;\n    sample(data, size, tmp[0], tmp[1], tmp[2], C[1]);\n    tmp[0] = diffX * P2[0] + minX;\n    tmp[1] = diffY * P2[1] + minY;\n    tmp[2] = diffZ * P2[2] + minZ;\n    sample(data, size, tmp[0], tmp[1], tmp[2], C[2]);\n    tmp[0] = diffX * P3[0] + minX;\n    tmp[1] = diffY * P3[1] + minY;\n    tmp[2] = diffZ * P3[2] + minZ;\n    sample(data, size, tmp[0], tmp[1], tmp[2], C[3]);\n    const V0 = calculateTetrahedronVolume(P1, P2, P3, coords) * 6;\n    const V1 = calculateTetrahedronVolume(P0, P2, P3, coords) * 6;\n    const V2 = calculateTetrahedronVolume(P0, P1, P3, coords) * 6;\n    const V3 = calculateTetrahedronVolume(P0, P1, P2, coords) * 6;\n    C[0][0] *= V0;\n    C[0][1] *= V0;\n    C[0][2] *= V0;\n    C[1][0] *= V1;\n    C[1][1] *= V1;\n    C[1][2] *= V1;\n    C[2][0] *= V2;\n    C[2][1] *= V2;\n    C[2][2] *= V2;\n    C[3][0] *= V3;\n    C[3][1] *= V3;\n    C[3][2] *= V3;\n    color2[0] = C[0][0] + C[1][0] + C[2][0] + C[3][0];\n    color2[1] = C[0][1] + C[1][1] + C[2][1] + C[3][1];\n    color2[2] = C[0][2] + C[1][2] + C[2][2] + C[3][2];\n  }\n}\nvar TetrahedralUpscaler = class {\n  /**\n   * Expands the given data to the target size.\n   *\n   * @param {TypedArray} data - The input RGBA data. Assumed to be cubic.\n   * @param {Number} size - The target size.\n   * @return {TypedArray} The new data.\n   */\n  static expand(data, size) {\n    const originalSize = Math.cbrt(data.length / 4);\n    const rgb = new Float32Array(3);\n    const array = new data.constructor(size ** 3 * 4);\n    const maxValue = data instanceof Uint8Array ? 255 : 1;\n    const sizeSq = size ** 2;\n    const s = 1 / (size - 1);\n    for (let z = 0; z < size; ++z) {\n      for (let y = 0; y < size; ++y) {\n        for (let x = 0; x < size; ++x) {\n          const u = x * s;\n          const v3 = y * s;\n          const w = z * s;\n          const i4 = Math.round(x + y * size + z * sizeSq) * 4;\n          tetrahedralSample(data, originalSize, u, v3, w, rgb);\n          array[i4 + 0] = rgb[0];\n          array[i4 + 1] = rgb[1];\n          array[i4 + 2] = rgb[2];\n          array[i4 + 3] = maxValue;\n        }\n      }\n    }\n    return array;\n  }\n};\n\n// src/textures/smaa/SMAAAreaImageData.js\nvar area = [\n  new Float32Array(2),\n  new Float32Array(2)\n];\nvar ORTHOGONAL_SIZE = 16;\nvar DIAGONAL_SIZE = 20;\nvar DIAGONAL_SAMPLES = 30;\nvar SMOOTH_MAX_DISTANCE = 32;\nvar orthogonalSubsamplingOffsets = new Float32Array([\n  0,\n  -0.25,\n  0.25,\n  -0.125,\n  0.125,\n  -0.375,\n  0.375\n]);\nvar diagonalSubsamplingOffsets = [\n  new Float32Array([0, 0]),\n  new Float32Array([0.25, -0.25]),\n  new Float32Array([-0.25, 0.25]),\n  new Float32Array([0.125, -0.125]),\n  new Float32Array([-0.125, 0.125])\n];\nvar orthogonalEdges = [\n  new Uint8Array([0, 0]),\n  new Uint8Array([3, 0]),\n  new Uint8Array([0, 3]),\n  new Uint8Array([3, 3]),\n  new Uint8Array([1, 0]),\n  new Uint8Array([4, 0]),\n  new Uint8Array([1, 3]),\n  new Uint8Array([4, 3]),\n  new Uint8Array([0, 1]),\n  new Uint8Array([3, 1]),\n  new Uint8Array([0, 4]),\n  new Uint8Array([3, 4]),\n  new Uint8Array([1, 1]),\n  new Uint8Array([4, 1]),\n  new Uint8Array([1, 4]),\n  new Uint8Array([4, 4])\n];\nvar diagonalEdges = [\n  new Uint8Array([0, 0]),\n  new Uint8Array([1, 0]),\n  new Uint8Array([0, 2]),\n  new Uint8Array([1, 2]),\n  new Uint8Array([2, 0]),\n  new Uint8Array([3, 0]),\n  new Uint8Array([2, 2]),\n  new Uint8Array([3, 2]),\n  new Uint8Array([0, 1]),\n  new Uint8Array([1, 1]),\n  new Uint8Array([0, 3]),\n  new Uint8Array([1, 3]),\n  new Uint8Array([2, 1]),\n  new Uint8Array([3, 1]),\n  new Uint8Array([2, 3]),\n  new Uint8Array([3, 3])\n];\nfunction lerp(a, b, p) {\n  return a + (b - a) * p;\n}\nfunction saturate(a) {\n  return Math.min(Math.max(a, 0), 1);\n}\nfunction smoothArea(d) {\n  const a1 = area[0];\n  const a2 = area[1];\n  const b1X = Math.sqrt(a1[0] * 2) * 0.5;\n  const b1Y = Math.sqrt(a1[1] * 2) * 0.5;\n  const b2X = Math.sqrt(a2[0] * 2) * 0.5;\n  const b2Y = Math.sqrt(a2[1] * 2) * 0.5;\n  const p = saturate(d / SMOOTH_MAX_DISTANCE);\n  a1[0] = lerp(b1X, a1[0], p);\n  a1[1] = lerp(b1Y, a1[1], p);\n  a2[0] = lerp(b2X, a2[0], p);\n  a2[1] = lerp(b2Y, a2[1], p);\n}\nfunction getOrthArea(p1X, p1Y, p2X, p2Y, x, result) {\n  const dX = p2X - p1X;\n  const dY = p2Y - p1Y;\n  const x1 = x;\n  const x2 = x + 1;\n  const y1 = p1Y + dY * (x1 - p1X) / dX;\n  const y2 = p1Y + dY * (x2 - p1X) / dX;\n  if (x1 >= p1X && x1 < p2X || x2 > p1X && x2 <= p2X) {\n    if (Math.sign(y1) === Math.sign(y2) || Math.abs(y1) < 1e-4 || Math.abs(y2) < 1e-4) {\n      const a = (y1 + y2) / 2;\n      if (a < 0) {\n        result[0] = Math.abs(a);\n        result[1] = 0;\n      } else {\n        result[0] = 0;\n        result[1] = Math.abs(a);\n      }\n    } else {\n      const t = -p1Y * dX / dY + p1X;\n      const tInt = Math.trunc(t);\n      const a1 = t > p1X ? y1 * (t - tInt) / 2 : 0;\n      const a2 = t < p2X ? y2 * (1 - (t - tInt)) / 2 : 0;\n      const a = Math.abs(a1) > Math.abs(a2) ? a1 : -a2;\n      if (a < 0) {\n        result[0] = Math.abs(a1);\n        result[1] = Math.abs(a2);\n      } else {\n        result[0] = Math.abs(a2);\n        result[1] = Math.abs(a1);\n      }\n    }\n  } else {\n    result[0] = 0;\n    result[1] = 0;\n  }\n  return result;\n}\nfunction getOrthAreaForPattern(pattern, left, right, offset, result) {\n  const a1 = area[0];\n  const a2 = area[1];\n  const o1 = 0.5 + offset;\n  const o2 = 0.5 + offset - 1;\n  const d = left + right + 1;\n  switch (pattern) {\n    case 0: {\n      result[0] = 0;\n      result[1] = 0;\n      break;\n    }\n    case 1: {\n      if (left <= right) {\n        getOrthArea(0, o2, d / 2, 0, left, result);\n      } else {\n        result[0] = 0;\n        result[1] = 0;\n      }\n      break;\n    }\n    case 2: {\n      if (left >= right) {\n        getOrthArea(d / 2, 0, d, o2, left, result);\n      } else {\n        result[0] = 0;\n        result[1] = 0;\n      }\n      break;\n    }\n    case 3: {\n      getOrthArea(0, o2, d / 2, 0, left, a1);\n      getOrthArea(d / 2, 0, d, o2, left, a2);\n      smoothArea(d, area);\n      result[0] = a1[0] + a2[0];\n      result[1] = a1[1] + a2[1];\n      break;\n    }\n    case 4: {\n      if (left <= right) {\n        getOrthArea(0, o1, d / 2, 0, left, result);\n      } else {\n        result[0] = 0;\n        result[1] = 0;\n      }\n      break;\n    }\n    case 5: {\n      result[0] = 0;\n      result[1] = 0;\n      break;\n    }\n    case 6: {\n      if (Math.abs(offset) > 0) {\n        getOrthArea(0, o1, d, o2, left, a1);\n        getOrthArea(0, o1, d / 2, 0, left, a2);\n        getOrthArea(d / 2, 0, d, o2, left, result);\n        a2[0] = a2[0] + result[0];\n        a2[1] = a2[1] + result[1];\n        result[0] = (a1[0] + a2[0]) / 2;\n        result[1] = (a1[1] + a2[1]) / 2;\n      } else {\n        getOrthArea(0, o1, d, o2, left, result);\n      }\n      break;\n    }\n    case 7: {\n      getOrthArea(0, o1, d, o2, left, result);\n      break;\n    }\n    case 8: {\n      if (left >= right) {\n        getOrthArea(d / 2, 0, d, o1, left, result);\n      } else {\n        result[0] = 0;\n        result[1] = 0;\n      }\n      break;\n    }\n    case 9: {\n      if (Math.abs(offset) > 0) {\n        getOrthArea(0, o2, d, o1, left, a1);\n        getOrthArea(0, o2, d / 2, 0, left, a2);\n        getOrthArea(d / 2, 0, d, o1, left, result);\n        a2[0] = a2[0] + result[0];\n        a2[1] = a2[1] + result[1];\n        result[0] = (a1[0] + a2[0]) / 2;\n        result[1] = (a1[1] + a2[1]) / 2;\n      } else {\n        getOrthArea(0, o2, d, o1, left, result);\n      }\n      break;\n    }\n    case 10: {\n      result[0] = 0;\n      result[1] = 0;\n      break;\n    }\n    case 11: {\n      getOrthArea(0, o2, d, o1, left, result);\n      break;\n    }\n    case 12: {\n      getOrthArea(0, o1, d / 2, 0, left, a1);\n      getOrthArea(d / 2, 0, d, o1, left, a2);\n      smoothArea(d, area);\n      result[0] = a1[0] + a2[0];\n      result[1] = a1[1] + a2[1];\n      break;\n    }\n    case 13: {\n      getOrthArea(0, o2, d, o1, left, result);\n      break;\n    }\n    case 14: {\n      getOrthArea(0, o1, d, o2, left, result);\n      break;\n    }\n    case 15: {\n      result[0] = 0;\n      result[1] = 0;\n      break;\n    }\n  }\n  return result;\n}\nfunction isInsideArea(a1X, a1Y, a2X, a2Y, x, y) {\n  let result = a1X === a2X && a1Y === a2Y;\n  if (!result) {\n    const xm = (a1X + a2X) / 2;\n    const ym = (a1Y + a2Y) / 2;\n    const a = a2Y - a1Y;\n    const b = a1X - a2X;\n    const c2 = a * (x - xm) + b * (y - ym);\n    result = c2 > 0;\n  }\n  return result;\n}\nfunction getDiagAreaForPixel(a1X, a1Y, a2X, a2Y, pX, pY) {\n  let n = 0;\n  for (let y = 0; y < DIAGONAL_SAMPLES; ++y) {\n    for (let x = 0; x < DIAGONAL_SAMPLES; ++x) {\n      const offsetX = x / (DIAGONAL_SAMPLES - 1);\n      const offsetY = y / (DIAGONAL_SAMPLES - 1);\n      if (isInsideArea(a1X, a1Y, a2X, a2Y, pX + offsetX, pY + offsetY)) {\n        ++n;\n      }\n    }\n  }\n  return n / (DIAGONAL_SAMPLES * DIAGONAL_SAMPLES);\n}\nfunction getDiagArea(pattern, a1X, a1Y, a2X, a2Y, left, offset, result) {\n  const e = diagonalEdges[pattern];\n  const e1 = e[0];\n  const e2 = e[1];\n  if (e1 > 0) {\n    a1X += offset[0];\n    a1Y += offset[1];\n  }\n  if (e2 > 0) {\n    a2X += offset[0];\n    a2Y += offset[1];\n  }\n  result[0] = 1 - getDiagAreaForPixel(a1X, a1Y, a2X, a2Y, 1 + left, 0 + left);\n  result[1] = getDiagAreaForPixel(a1X, a1Y, a2X, a2Y, 1 + left, 1 + left);\n  return result;\n}\nfunction getDiagAreaForPattern(pattern, left, right, offset, result) {\n  const a1 = area[0];\n  const a2 = area[1];\n  const d = left + right + 1;\n  switch (pattern) {\n    case 0: {\n      getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 1: {\n      getDiagArea(pattern, 1, 0, 0 + d, 0 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 2: {\n      getDiagArea(pattern, 0, 0, 1 + d, 0 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 3: {\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, result);\n      break;\n    }\n    case 4: {\n      getDiagArea(pattern, 1, 1, 0 + d, 0 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 5: {\n      getDiagArea(pattern, 1, 1, 0 + d, 0 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 6: {\n      getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, result);\n      break;\n    }\n    case 7: {\n      getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 8: {\n      getDiagArea(pattern, 0, 0, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 9: {\n      getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, result);\n      getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, result);\n      break;\n    }\n    case 10: {\n      getDiagArea(pattern, 0, 0, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 11: {\n      getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 12: {\n      getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, result);\n      break;\n    }\n    case 13: {\n      getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 14: {\n      getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n    case 15: {\n      getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n      getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n      result[0] = (a1[0] + a2[0]) / 2;\n      result[1] = (a1[1] + a2[1]) / 2;\n      break;\n    }\n  }\n  return result;\n}\nfunction generatePatterns(patterns, offset, orthogonal) {\n  const result = new Float32Array(2);\n  for (let i = 0, l = patterns.length; i < l; ++i) {\n    const pattern = patterns[i];\n    const data = pattern.data;\n    const size = pattern.width;\n    for (let y = 0; y < size; ++y) {\n      for (let x = 0; x < size; ++x) {\n        if (orthogonal) {\n          getOrthAreaForPattern(i, x, y, offset, result);\n        } else {\n          getDiagAreaForPattern(i, x, y, offset, result);\n        }\n        const c2 = (y * size + x) * 2;\n        data[c2] = result[0] * 255;\n        data[c2 + 1] = result[1] * 255;\n      }\n    }\n  }\n}\nfunction assemble(baseX, baseY, patterns, edges2, size, orthogonal, target) {\n  const dstData = target.data;\n  const dstWidth = target.width;\n  for (let i = 0, l = patterns.length; i < l; ++i) {\n    const edge = edges2[i];\n    const pattern = patterns[i];\n    const srcData = pattern.data;\n    const srcWidth = pattern.width;\n    for (let y = 0; y < size; ++y) {\n      for (let x = 0; x < size; ++x) {\n        const pX = edge[0] * size + baseX + x;\n        const pY = edge[1] * size + baseY + y;\n        const c2 = (pY * dstWidth + pX) * 4;\n        const d = orthogonal ? (y * y * srcWidth + x * x) * 2 : (y * srcWidth + x) * 2;\n        dstData[c2] = srcData[d];\n        dstData[c2 + 1] = srcData[d + 1];\n        dstData[c2 + 2] = 0;\n        dstData[c2 + 3] = 255;\n      }\n    }\n  }\n}\nvar SMAAAreaImageData = class {\n  /**\n   * Creates a new area image.\n   *\n   * @return {RawImageData} The generated image data.\n   */\n  static generate() {\n    const width = 2 * 5 * ORTHOGONAL_SIZE;\n    const height = orthogonalSubsamplingOffsets.length * 5 * ORTHOGONAL_SIZE;\n    const data = new Uint8ClampedArray(width * height * 4);\n    const result = new RawImageData(width, height, data);\n    const orthPatternSize = Math.pow(ORTHOGONAL_SIZE - 1, 2) + 1;\n    const diagPatternSize = DIAGONAL_SIZE;\n    const orthogonalPatterns = [];\n    const diagonalPatterns = [];\n    for (let i = 3, l = data.length; i < l; i += 4) {\n      data[i] = 255;\n    }\n    for (let i = 0; i < 16; ++i) {\n      orthogonalPatterns.push(new RawImageData(\n        orthPatternSize,\n        orthPatternSize,\n        new Uint8ClampedArray(orthPatternSize * orthPatternSize * 2),\n        2\n      ));\n      diagonalPatterns.push(new RawImageData(\n        diagPatternSize,\n        diagPatternSize,\n        new Uint8ClampedArray(diagPatternSize * diagPatternSize * 2),\n        2\n      ));\n    }\n    for (let i = 0, l = orthogonalSubsamplingOffsets.length; i < l; ++i) {\n      generatePatterns(orthogonalPatterns, orthogonalSubsamplingOffsets[i], true);\n      assemble(\n        0,\n        5 * ORTHOGONAL_SIZE * i,\n        orthogonalPatterns,\n        orthogonalEdges,\n        ORTHOGONAL_SIZE,\n        true,\n        result\n      );\n    }\n    for (let i = 0, l = diagonalSubsamplingOffsets.length; i < l; ++i) {\n      generatePatterns(diagonalPatterns, diagonalSubsamplingOffsets[i], false);\n      assemble(\n        5 * ORTHOGONAL_SIZE,\n        4 * DIAGONAL_SIZE * i,\n        diagonalPatterns,\n        diagonalEdges,\n        DIAGONAL_SIZE,\n        false,\n        result\n      );\n    }\n    return result;\n  }\n};\n\n// src/textures/smaa/SMAAImageGenerator.js\nimport { LoadingManager as LoadingManager5 } from \"three\";\n\n// tmp/smaa/worker.txt\nvar worker_default2 = '\"use strict\";(()=>{function q(t,a,s){let e=document.createElement(\"canvas\"),n=e.getContext(\"2d\");if(e.width=t,e.height=a,s instanceof Image)n.drawImage(s,0,0);else{let r=n.createImageData(t,a);r.data.set(s),n.putImageData(r,0,0)}return e}var F=class t{constructor(a=0,s=0,e=null){this.width=a,this.height=s,this.data=e}toCanvas(){return typeof document==\"undefined\"?null:q(this.width,this.height,this.data)}static from(a){let{width:s,height:e}=a,n;if(a instanceof Image){let r=q(s,e,a);r!==null&&(n=r.getContext(\"2d\").getImageData(0,0,s,e).data)}else n=a.data;return new t(s,e,n)}};var M=[new Float32Array(2),new Float32Array(2)],D=16,W=20,I=30,j=32,v=new Float32Array([0,-.25,.25,-.125,.125,-.375,.375]),N=[new Float32Array([0,0]),new Float32Array([.25,-.25]),new Float32Array([-.25,.25]),new Float32Array([.125,-.125]),new Float32Array([-.125,.125])],z=[new Uint8Array([0,0]),new Uint8Array([3,0]),new Uint8Array([0,3]),new Uint8Array([3,3]),new Uint8Array([1,0]),new Uint8Array([4,0]),new Uint8Array([1,3]),new Uint8Array([4,3]),new Uint8Array([0,1]),new Uint8Array([3,1]),new Uint8Array([0,4]),new Uint8Array([3,4]),new Uint8Array([1,1]),new Uint8Array([4,1]),new Uint8Array([1,4]),new Uint8Array([4,4])],p=[new Uint8Array([0,0]),new Uint8Array([1,0]),new Uint8Array([0,2]),new Uint8Array([1,2]),new Uint8Array([2,0]),new Uint8Array([3,0]),new Uint8Array([2,2]),new Uint8Array([3,2]),new Uint8Array([0,1]),new Uint8Array([1,1]),new Uint8Array([0,3]),new Uint8Array([1,3]),new Uint8Array([2,1]),new Uint8Array([3,1]),new Uint8Array([2,3]),new Uint8Array([3,3])];function C(t,a,s){return t+(a-t)*s}function B(t){return Math.min(Math.max(t,0),1)}function _(t){let a=M[0],s=M[1],e=Math.sqrt(a[0]*2)*.5,n=Math.sqrt(a[1]*2)*.5,r=Math.sqrt(s[0]*2)*.5,o=Math.sqrt(s[1]*2)*.5,c=B(t/j);a[0]=C(e,a[0],c),a[1]=C(n,a[1],c),s[0]=C(r,s[0],c),s[1]=C(o,s[1],c)}function d(t,a,s,e,n,r){let o=s-t,c=e-a,h=n,i=n+1,w=a+c*(h-t)/o,b=a+c*(i-t)/o;if(h>=t&&h<s||i>t&&i<=s)if(Math.sign(w)===Math.sign(b)||Math.abs(w)<1e-4||Math.abs(b)<1e-4){let g=(w+b)/2;g<0?(r[0]=Math.abs(g),r[1]=0):(r[0]=0,r[1]=Math.abs(g))}else{let g=-a*o/c+t,k=Math.trunc(g),m=g>t?w*(g-k)/2:0,U=g<s?b*(1-(g-k))/2:0;(Math.abs(m)>Math.abs(U)?m:-U)<0?(r[0]=Math.abs(m),r[1]=Math.abs(U)):(r[0]=Math.abs(U),r[1]=Math.abs(m))}else r[0]=0,r[1]=0;return r}function J(t,a,s,e,n){let r=M[0],o=M[1],c=.5+e,h=.5+e-1,i=a+s+1;switch(t){case 0:{n[0]=0,n[1]=0;break}case 1:{a<=s?d(0,h,i/2,0,a,n):(n[0]=0,n[1]=0);break}case 2:{a>=s?d(i/2,0,i,h,a,n):(n[0]=0,n[1]=0);break}case 3:{d(0,h,i/2,0,a,r),d(i/2,0,i,h,a,o),_(i,M),n[0]=r[0]+o[0],n[1]=r[1]+o[1];break}case 4:{a<=s?d(0,c,i/2,0,a,n):(n[0]=0,n[1]=0);break}case 5:{n[0]=0,n[1]=0;break}case 6:{Math.abs(e)>0?(d(0,c,i,h,a,r),d(0,c,i/2,0,a,o),d(i/2,0,i,h,a,n),o[0]=o[0]+n[0],o[1]=o[1]+n[1],n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2):d(0,c,i,h,a,n);break}case 7:{d(0,c,i,h,a,n);break}case 8:{a>=s?d(i/2,0,i,c,a,n):(n[0]=0,n[1]=0);break}case 9:{Math.abs(e)>0?(d(0,h,i,c,a,r),d(0,h,i/2,0,a,o),d(i/2,0,i,c,a,n),o[0]=o[0]+n[0],o[1]=o[1]+n[1],n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2):d(0,h,i,c,a,n);break}case 10:{n[0]=0,n[1]=0;break}case 11:{d(0,h,i,c,a,n);break}case 12:{d(0,c,i/2,0,a,r),d(i/2,0,i,c,a,o),_(i,M),n[0]=r[0]+o[0],n[1]=r[1]+o[1];break}case 13:{d(0,h,i,c,a,n);break}case 14:{d(0,c,i,h,a,n);break}case 15:{n[0]=0,n[1]=0;break}}return n}function K(t,a,s,e,n,r){let o=t===s&&a===e;if(!o){let c=(t+s)/2,h=(a+e)/2,i=e-a,w=t-s;o=i*(n-c)+w*(r-h)>0}return o}function G(t,a,s,e,n,r){let o=0;for(let c=0;c<I;++c)for(let h=0;h<I;++h){let i=h/(I-1),w=c/(I-1);K(t,a,s,e,n+i,r+w)&&++o}return o/(I*I)}function A(t,a,s,e,n,r,o,c){let h=p[t],i=h[0],w=h[1];return i>0&&(a+=o[0],s+=o[1]),w>0&&(e+=o[0],n+=o[1]),c[0]=1-G(a,s,e,n,1+r,0+r),c[1]=G(a,s,e,n,1+r,1+r),c}function Q(t,a,s,e,n){let r=M[0],o=M[1],c=a+s+1;switch(t){case 0:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 1:{A(t,1,0,0+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 2:{A(t,0,0,1+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 3:{A(t,1,0,1+c,0+c,a,e,n);break}case 4:{A(t,1,1,0+c,0+c,a,e,r),A(t,1,1,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 5:{A(t,1,1,0+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 6:{A(t,1,1,1+c,0+c,a,e,n);break}case 7:{A(t,1,1,1+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 8:{A(t,0,0,1+c,1+c,a,e,r),A(t,1,0,1+c,1+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 9:{A(t,1,0,1+c,1+c,a,e,n),A(t,1,0,1+c,1+c,a,e,n);break}case 10:{A(t,0,0,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 11:{A(t,1,0,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 12:{A(t,1,1,1+c,1+c,a,e,n);break}case 13:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,0,1+c,1+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 14:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,1,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 15:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}}return n}function R(t,a,s){let e=new Float32Array(2);for(let n=0,r=t.length;n<r;++n){let o=t[n],c=o.data,h=o.width;for(let i=0;i<h;++i)for(let w=0;w<h;++w){s?J(n,w,i,a,e):Q(n,w,i,a,e);let b=(i*h+w)*2;c[b]=e[0]*255,c[b+1]=e[1]*255}}}function T(t,a,s,e,n,r,o){let c=o.data,h=o.width;for(let i=0,w=s.length;i<w;++i){let b=e[i],g=s[i],k=g.data,m=g.width;for(let U=0;U<n;++U)for(let x=0;x<n;++x){let Z=b[0]*n+t+x,O=((b[1]*n+a+U)*h+Z)*4,L=r?(U*U*m+x*x)*2:(U*m+x)*2;c[O]=k[L],c[O+1]=k[L+1],c[O+2]=0,c[O+3]=255}}}var S=class{static generate(){let a=10*D,s=v.length*5*D,e=new Uint8ClampedArray(a*s*4),n=new F(a,s,e),r=Math.pow(D-1,2)+1,o=W,c=[],h=[];for(let i=3,w=e.length;i<w;i+=4)e[i]=255;for(let i=0;i<16;++i)c.push(new F(r,r,new Uint8ClampedArray(r*r*2),2)),h.push(new F(o,o,new Uint8ClampedArray(o*o*2),2));for(let i=0,w=v.length;i<w;++i)R(c,v[i],!0),T(0,5*D*i,c,z,D,!0,n);for(let i=0,w=N.length;i<w;++i)R(h,N[i],!1),T(5*D,4*W*i,h,p,W,!1,n);return n}};var P=new Map([[y(0,0,0,0),new Float32Array([0,0,0,0])],[y(0,0,0,1),new Float32Array([0,0,0,1])],[y(0,0,1,0),new Float32Array([0,0,1,0])],[y(0,0,1,1),new Float32Array([0,0,1,1])],[y(0,1,0,0),new Float32Array([0,1,0,0])],[y(0,1,0,1),new Float32Array([0,1,0,1])],[y(0,1,1,0),new Float32Array([0,1,1,0])],[y(0,1,1,1),new Float32Array([0,1,1,1])],[y(1,0,0,0),new Float32Array([1,0,0,0])],[y(1,0,0,1),new Float32Array([1,0,0,1])],[y(1,0,1,0),new Float32Array([1,0,1,0])],[y(1,0,1,1),new Float32Array([1,0,1,1])],[y(1,1,0,0),new Float32Array([1,1,0,0])],[y(1,1,0,1),new Float32Array([1,1,0,1])],[y(1,1,1,0),new Float32Array([1,1,1,0])],[y(1,1,1,1),new Float32Array([1,1,1,1])]]);function H(t,a,s){return t+(a-t)*s}function y(t,a,s,e){let n=H(t,a,.75),r=H(s,e,1-.25);return H(n,r,1-.125)}function V(t,a){let s=0;return a[3]===1&&(s+=1),s===1&&a[2]===1&&t[1]!==1&&t[3]!==1&&(s+=1),s}function $(t,a){let s=0;return a[3]===1&&t[1]!==1&&t[3]!==1&&(s+=1),s===1&&a[2]===1&&t[0]!==1&&t[2]!==1&&(s+=1),s}var E=class{static generate(){let o=new Uint8ClampedArray(2178),c=new Uint8ClampedArray(64*16*4);for(let h=0;h<33;++h)for(let i=0;i<66;++i){let w=.03125*i,b=.03125*h;if(P.has(w)&&P.has(b)){let g=P.get(w),k=P.get(b),m=h*66+i;o[m]=127*V(g,k),o[m+33]=127*$(g,k)}}for(let h=0,i=17;i<33;++i)for(let w=0;w<64;++w,h+=4)c[h]=o[i*66+w],c[h+3]=255;return new F(64,16,c)}};self.addEventListener(\"message\",t=>{let a=S.generate(),s=E.generate();postMessage({areaImageData:a,searchImageData:s},[a.data.buffer,s.data.buffer]),close()});})();\\n';\n\n// src/textures/smaa/SMAAImageGenerator.js\nfunction generate(useCache = true) {\n  const workerURL = URL.createObjectURL(new Blob([worker_default2], {\n    type: \"text/javascript\"\n  }));\n  const worker = new Worker(workerURL);\n  URL.revokeObjectURL(workerURL);\n  return new Promise((resolve, reject) => {\n    worker.addEventListener(\"error\", (event) => reject(event.error));\n    worker.addEventListener(\"message\", (event) => {\n      const searchImageData = RawImageData.from(event.data.searchImageData);\n      const areaImageData = RawImageData.from(event.data.areaImageData);\n      const urls = [\n        searchImageData.toCanvas().toDataURL(\"image/png\", 1),\n        areaImageData.toCanvas().toDataURL(\"image/png\", 1)\n      ];\n      if (useCache) {\n        localStorage.setItem(\"smaa-search\", urls[0]);\n        localStorage.setItem(\"smaa-area\", urls[1]);\n      }\n      resolve(urls);\n    });\n    worker.postMessage(null);\n  });\n}\nvar SMAAImageGenerator = class {\n  /**\n   * Constructs a new SMAA image generator.\n   */\n  constructor() {\n    this.disableCache = false;\n  }\n  /**\n   * Enables or disables caching via localStorage.\n   *\n   * @param {Boolean} value - Whether the cache should be enabled.\n   */\n  setCacheEnabled(value) {\n    this.disableCache = !value;\n  }\n  /**\n   * Generates the SMAA data images.\n   *\n   * @example\n   * SMAAImageGenerator.generate().then(([search, area]) => {\n   *   const smaaEffect = new SMAAEffect(search, area);\n   * });\n   * @return {Promise<Image[]>} A promise that returns the search image and area image as a pair.\n   */\n  generate() {\n    const useCache = !this.disableCache && window.localStorage !== void 0;\n    const cachedURLs = useCache ? [\n      localStorage.getItem(\"smaa-search\"),\n      localStorage.getItem(\"smaa-area\")\n    ] : [null, null];\n    const promise = cachedURLs[0] !== null && cachedURLs[1] !== null ? Promise.resolve(cachedURLs) : generate(useCache);\n    return promise.then((urls) => {\n      return new Promise((resolve, reject) => {\n        const searchImage = new Image();\n        const areaImage = new Image();\n        const manager = new LoadingManager5();\n        manager.onLoad = () => resolve([searchImage, areaImage]);\n        manager.onError = reject;\n        searchImage.addEventListener(\"error\", (e) => manager.itemError(\"smaa-search\"));\n        areaImage.addEventListener(\"error\", (e) => manager.itemError(\"smaa-area\"));\n        searchImage.addEventListener(\"load\", () => manager.itemEnd(\"smaa-search\"));\n        areaImage.addEventListener(\"load\", () => manager.itemEnd(\"smaa-area\"));\n        manager.itemStart(\"smaa-search\");\n        manager.itemStart(\"smaa-area\");\n        searchImage.src = urls[0];\n        areaImage.src = urls[1];\n      });\n    });\n  }\n};\n\n// src/textures/smaa/SMAASearchImageData.js\nvar edges = /* @__PURE__ */ new Map([\n  [bilinear(0, 0, 0, 0), new Float32Array([0, 0, 0, 0])],\n  [bilinear(0, 0, 0, 1), new Float32Array([0, 0, 0, 1])],\n  [bilinear(0, 0, 1, 0), new Float32Array([0, 0, 1, 0])],\n  [bilinear(0, 0, 1, 1), new Float32Array([0, 0, 1, 1])],\n  [bilinear(0, 1, 0, 0), new Float32Array([0, 1, 0, 0])],\n  [bilinear(0, 1, 0, 1), new Float32Array([0, 1, 0, 1])],\n  [bilinear(0, 1, 1, 0), new Float32Array([0, 1, 1, 0])],\n  [bilinear(0, 1, 1, 1), new Float32Array([0, 1, 1, 1])],\n  [bilinear(1, 0, 0, 0), new Float32Array([1, 0, 0, 0])],\n  [bilinear(1, 0, 0, 1), new Float32Array([1, 0, 0, 1])],\n  [bilinear(1, 0, 1, 0), new Float32Array([1, 0, 1, 0])],\n  [bilinear(1, 0, 1, 1), new Float32Array([1, 0, 1, 1])],\n  [bilinear(1, 1, 0, 0), new Float32Array([1, 1, 0, 0])],\n  [bilinear(1, 1, 0, 1), new Float32Array([1, 1, 0, 1])],\n  [bilinear(1, 1, 1, 0), new Float32Array([1, 1, 1, 0])],\n  [bilinear(1, 1, 1, 1), new Float32Array([1, 1, 1, 1])]\n]);\nfunction lerp2(a, b, p) {\n  return a + (b - a) * p;\n}\nfunction bilinear(e0, e1, e2, e3) {\n  const a = lerp2(e0, e1, 1 - 0.25);\n  const b = lerp2(e2, e3, 1 - 0.25);\n  return lerp2(a, b, 1 - 0.125);\n}\nfunction deltaLeft(left, top) {\n  let d = 0;\n  if (top[3] === 1) {\n    d += 1;\n  }\n  if (d === 1 && top[2] === 1 && left[1] !== 1 && left[3] !== 1) {\n    d += 1;\n  }\n  return d;\n}\nfunction deltaRight(left, top) {\n  let d = 0;\n  if (top[3] === 1 && left[1] !== 1 && left[3] !== 1) {\n    d += 1;\n  }\n  if (d === 1 && top[2] === 1 && left[0] !== 1 && left[2] !== 1) {\n    d += 1;\n  }\n  return d;\n}\nvar SMAASearchImageData = class {\n  /**\n   * Creates a new search image.\n   *\n   * @return {RawImageData} The generated image data.\n   */\n  static generate() {\n    const width = 66;\n    const height = 33;\n    const halfWidth = width / 2;\n    const croppedWidth = 64;\n    const croppedHeight = 16;\n    const data = new Uint8ClampedArray(width * height);\n    const croppedData = new Uint8ClampedArray(croppedWidth * croppedHeight * 4);\n    for (let y = 0; y < height; ++y) {\n      for (let x = 0; x < width; ++x) {\n        const s = 0.03125 * x;\n        const t = 0.03125 * y;\n        if (edges.has(s) && edges.has(t)) {\n          const e1 = edges.get(s);\n          const e2 = edges.get(t);\n          const i = y * width + x;\n          data[i] = 127 * deltaLeft(e1, e2);\n          data[i + halfWidth] = 127 * deltaRight(e1, e2);\n        }\n      }\n    }\n    for (let i = 0, y = height - croppedHeight; y < height; ++y) {\n      for (let x = 0; x < croppedWidth; ++x, i += 4) {\n        croppedData[i] = data[y * width + x];\n        croppedData[i + 3] = 255;\n      }\n    }\n    return new RawImageData(croppedWidth, croppedHeight, croppedData);\n  }\n};\nexport {\n  AdaptiveLuminanceMaterial,\n  AdaptiveLuminancePass,\n  BlendFunction,\n  BlendMode,\n  BloomEffect,\n  KawaseBlurPass as BlurPass,\n  BokehEffect,\n  BokehMaterial,\n  BoxBlurMaterial,\n  BoxBlurPass,\n  BrightnessContrastEffect,\n  ChromaticAberrationEffect,\n  CircleOfConfusionMaterial,\n  ClearMaskPass,\n  ClearPass,\n  ColorAverageEffect,\n  ColorChannel,\n  ColorDepthEffect,\n  EdgeDetectionMaterial as ColorEdgesMaterial,\n  KawaseBlurMaterial as ConvolutionMaterial,\n  CopyMaterial,\n  CopyPass,\n  DepthComparisonMaterial,\n  DepthCopyMaterial,\n  DepthCopyMode,\n  DepthCopyPass,\n  DepthDownsamplingMaterial,\n  DepthDownsamplingPass,\n  DepthEffect,\n  DepthMaskMaterial,\n  DepthOfFieldEffect,\n  DepthPass,\n  DepthPickingPass,\n  DepthCopyPass as DepthSavePass,\n  DepthTestStrategy,\n  Disposable,\n  DotScreenEffect,\n  DownsamplingMaterial,\n  EdgeDetectionMaterial,\n  EdgeDetectionMode,\n  Effect,\n  EffectAttribute,\n  EffectComposer,\n  EffectMaterial,\n  EffectPass,\n  EffectShaderData,\n  EffectShaderSection,\n  FXAAEffect,\n  GammaCorrectionEffect,\n  GaussKernel,\n  GaussianBlurMaterial,\n  GaussianBlurPass,\n  GlitchEffect,\n  GlitchMode,\n  GodRaysEffect,\n  GodRaysMaterial,\n  GridEffect,\n  HueSaturationEffect,\n  ImmutableTimer,\n  Initializable,\n  KawaseBlurMaterial,\n  KawaseBlurPass,\n  KernelSize,\n  LUT1DEffect,\n  LUT3DEffect,\n  LUT3dlLoader,\n  LUTCubeLoader,\n  LUT3DEffect as LUTEffect,\n  LUTOperation,\n  LambdaPass,\n  LensDistortionEffect,\n  LookupTexture,\n  LookupTexture as LookupTexture3D,\n  LuminanceMaterial,\n  LuminancePass,\n  MaskFunction,\n  MaskMaterial,\n  MaskPass,\n  MipmapBlurPass,\n  NoiseEffect,\n  NoiseTexture,\n  NormalPass,\n  OutlineMaterial as OutlineEdgesMaterial,\n  OutlineEffect,\n  OutlineMaterial,\n  OverrideMaterialManager,\n  Pass,\n  PixelationEffect,\n  PredicationMode,\n  RawImageData,\n  RealisticBokehEffect,\n  RenderPass,\n  Resizable,\n  Resolution as Resizer,\n  Resolution,\n  SMAAAreaImageData,\n  SMAAEffect,\n  SMAAImageGenerator,\n  SMAAImageLoader,\n  SMAAPreset,\n  SMAASearchImageData,\n  SMAAWeightsMaterial,\n  SSAOEffect,\n  SSAOMaterial,\n  CopyPass as SavePass,\n  ScanlineEffect,\n  EffectShaderSection as Section,\n  Selection,\n  SelectiveBloomEffect,\n  SepiaEffect,\n  ShaderPass,\n  ShockWaveEffect,\n  TetrahedralUpscaler,\n  TextureEffect,\n  TiltShiftBlurMaterial,\n  TiltShiftBlurPass,\n  TiltShiftEffect,\n  Timer,\n  ToneMappingEffect,\n  ToneMappingMode,\n  UpsamplingMaterial,\n  VignetteEffect,\n  VignetteTechnique,\n  WebGLExtension,\n  version\n};\n","import { ShaderMaterial } from 'three';\n\nexport class MaterialBase extends ShaderMaterial {\n\n\tconstructor( shader ) {\n\n\t\tsuper( shader );\n\n\t\tfor ( const key in this.uniforms ) {\n\n\t\t\tObject.defineProperty( this, key, {\n\n\t\t\t\tget() {\n\n\t\t\t\t\treturn this.uniforms[ key ].value;\n\n\t\t\t\t},\n\n\t\t\t\tset( v ) {\n\n\t\t\t\t\tthis.uniforms[ key ].value = v;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// sets the given named define value and sets \"needsUpdate\" to true if it's different\n\tsetDefine( name, value = undefined ) {\n\n\t\tif ( value === undefined || value === null ) {\n\n\t\t\tif ( name in this.defines ) {\n\n\t\t\t\tdelete this.defines[ name ];\n\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this.defines[ name ] !== value ) {\n\n\t\t\t\tthis.defines[ name ] = value;\n\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","import { PerspectiveCamera } from 'three';\n\nexport class PhysicalCamera extends PerspectiveCamera {\n\n\tset bokehSize( size ) {\n\n\t\tthis.fStop = this.getFocalLength() / size;\n\n\t}\n\n\tget bokehSize() {\n\n\t\treturn this.getFocalLength() / this.fStop;\n\n\t}\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\t\tthis.fStop = 1.4;\n\t\tthis.apertureBlades = 0;\n\t\tthis.apertureRotation = 0;\n\t\tthis.focusDistance = 25;\n\t\tthis.anamorphicRatio = 1;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fStop = source.fStop;\n\t\tthis.apertureBlades = source.apertureBlades;\n\t\tthis.apertureRotation = source.apertureRotation;\n\t\tthis.focusDistance = source.focusDistance;\n\t\tthis.anamorphicRatio = source.anamorphicRatio;\n\n\t\treturn this;\n\n\t}\n\n}\n","export const utilsGLSL = /* glsl */`\n\n\t// TODO: possibly this should be renamed something related to material or path tracing logic\n\n\t#ifndef RAY_OFFSET\n\t#define RAY_OFFSET 1e-4\n\t#endif\n\n\t// adjust the hit point by the surface normal by a factor of some offset and the\n\t// maximum component-wise value of the current point to accommodate floating point\n\t// error as values increase.\n\tvec3 stepRayOrigin( vec3 rayOrigin, vec3 rayDirection, vec3 offset, float dist ) {\n\n\t\tvec3 point = rayOrigin + rayDirection * dist;\n\t\tvec3 absPoint = abs( point );\n\t\tfloat maxPoint = max( absPoint.x, max( absPoint.y, absPoint.z ) );\n\t\treturn point + offset * ( maxPoint + 1.0 ) * RAY_OFFSET;\n\n\t}\n\n\t// https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md#attenuation\n\tvec3 transmissionAttenuation( float dist, vec3 attColor, float attDist ) {\n\n\t\tvec3 ot = - log( attColor ) / attDist;\n\t\treturn exp( - ot * dist );\n\n\t}\n\n\tvec3 getHalfVector( vec3 wi, vec3 wo, float eta ) {\n\n\t\t// get the half vector - assuming if the light incident vector is on the other side\n\t\t// of the that it's transmissive.\n\t\tvec3 h;\n\t\tif ( wi.z > 0.0 ) {\n\n\t\t\th = normalize( wi + wo );\n\n\t\t} else {\n\n\t\t\t// Scale by the ior ratio to retrieve the appropriate half vector\n\t\t\t// From Section 2.2 on computing the transmission half vector:\n\t\t\t// https://blog.selfshadow.com/publications/s2015-shading-course/burley/s2015_pbs_disney_bsdf_notes.pdf\n\t\t\th = normalize( wi + wo * eta );\n\n\t\t}\n\n\t\th *= sign( h.z );\n\t\treturn h;\n\n\t}\n\n\tvec3 getHalfVector( vec3 a, vec3 b ) {\n\n\t\treturn normalize( a + b );\n\n\t}\n\n\t// The discrepancy between interpolated surface normal and geometry normal can cause issues when a ray\n\t// is cast that is on the top side of the geometry normal plane but below the surface normal plane. If\n\t// we find a ray like that we ignore it to avoid artifacts.\n\t// This function returns if the direction is on the same side of both planes.\n\tbool isDirectionValid( vec3 direction, vec3 surfaceNormal, vec3 geometryNormal ) {\n\n\t\tbool aboveSurfaceNormal = dot( direction, surfaceNormal ) > 0.0;\n\t\tbool aboveGeometryNormal = dot( direction, geometryNormal ) > 0.0;\n\t\treturn aboveSurfaceNormal == aboveGeometryNormal;\n\n\t}\n\n\t// ray sampling x and z are swapped to align with expected background view\n\tvec2 equirectDirectionToUv( vec3 direction ) {\n\n\t\t// from Spherical.setFromCartesianCoords\n\t\tvec2 uv = vec2( atan( direction.z, direction.x ), acos( direction.y ) );\n\t\tuv /= vec2( 2.0 * PI, PI );\n\n\t\t// apply adjustments to get values in range [0, 1] and y right side up\n\t\tuv.x += 0.5;\n\t\tuv.y = 1.0 - uv.y;\n\t\treturn uv;\n\n\t}\n\n\tvec3 equirectUvToDirection( vec2 uv ) {\n\n\t\t// undo above adjustments\n\t\tuv.x -= 0.5;\n\t\tuv.y = 1.0 - uv.y;\n\n\t\t// from Vector3.setFromSphericalCoords\n\t\tfloat theta = uv.x * 2.0 * PI;\n\t\tfloat phi = uv.y * PI;\n\n\t\tfloat sinPhi = sin( phi );\n\n\t\treturn vec3( sinPhi * cos( theta ), cos( phi ), sinPhi * sin( theta ) );\n\n\t}\n\n\t// power heuristic for multiple importance sampling\n\tfloat misHeuristic( float a, float b ) {\n\n\t\tfloat aa = a * a;\n\t\tfloat bb = b * b;\n\t\treturn aa / ( aa + bb );\n\n\t}\n\n\t// tentFilter from Peter Shirley's 'Realistic Ray Tracing (2nd Edition)' book, pg. 60\n\t// erichlof/THREE.js-PathTracing-Renderer/\n\tfloat tentFilter( float x ) {\n\n\t\treturn x < 0.5 ? sqrt( 2.0 * x ) - 1.0 : 1.0 - sqrt( 2.0 - ( 2.0 * x ) );\n\n\t}\n`;\n","import {\n\tDataTexture,\n\tFileLoader,\n\tHalfFloatType,\n\tLinearFilter,\n\tRedFormat,\n\tMathUtils,\n\tLoader,\n} from 'three';\n\nimport { toHalfFloatArray } from './TextureUtils.js';\n\nfunction IESLamp( text ) {\n\n\tconst _self = this;\n\n\tconst textArray = text.split( '\\n' );\n\n\tlet lineNumber = 0;\n\tlet line;\n\n\t_self.verAngles = [ ];\n\t_self.horAngles = [ ];\n\n\t_self.candelaValues = [ ];\n\n\t_self.tiltData = { };\n\t_self.tiltData.angles = [ ];\n\t_self.tiltData.mulFactors = [ ];\n\n\tfunction textToArray( text ) {\n\n\t\ttext = text.trim(); // remove leading or trailing spaces\n\t\ttext = text.replace( /,/g, ' ' ); // replace commas with spaces\n\t\ttext = text.replace( /\\s\\s+/g, ' ' ); // replace white space/tabs etc by single whitespace\n\n\t\tconst array = text.split( ' ' );\n\n\t\treturn array;\n\n\t}\n\n\tfunction readArray( count, array ) {\n\n\t\twhile ( true ) {\n\n\t\t\tconst line = textArray[ lineNumber ++ ];\n\t\t\tconst lineData = textToArray( line );\n\n\t\t\tfor ( let i = 0; i < lineData.length; ++ i ) {\n\n\t\t\t\tarray.push( Number( lineData[ i ] ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length === count )\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction readTilt() {\n\n\t\tlet line = textArray[ lineNumber ++ ];\n\t\tlet lineData = textToArray( line );\n\n\t\t_self.tiltData.lampToLumGeometry = Number( lineData[ 0 ] );\n\n\t\tline = textArray[ lineNumber ++ ];\n\t\tlineData = textToArray( line );\n\n\t\t_self.tiltData.numAngles = Number( lineData[ 0 ] );\n\n\t\treadArray( _self.tiltData.numAngles, _self.tiltData.angles );\n\t\treadArray( _self.tiltData.numAngles, _self.tiltData.mulFactors );\n\n\t}\n\n\tfunction readLampValues() {\n\n\t\tconst values = [ ];\n\t\treadArray( 10, values );\n\n\t\t_self.count = Number( values[ 0 ] );\n\t\t_self.lumens = Number( values[ 1 ] );\n\t\t_self.multiplier = Number( values[ 2 ] );\n\t\t_self.numVerAngles = Number( values[ 3 ] );\n\t\t_self.numHorAngles = Number( values[ 4 ] );\n\t\t_self.gonioType = Number( values[ 5 ] );\n\t\t_self.units = Number( values[ 6 ] );\n\t\t_self.width = Number( values[ 7 ] );\n\t\t_self.length = Number( values[ 8 ] );\n\t\t_self.height = Number( values[ 9 ] );\n\n\t}\n\n\tfunction readLampFactors() {\n\n\t\tconst values = [ ];\n\t\treadArray( 3, values );\n\n\t\t_self.ballFactor = Number( values[ 0 ] );\n\t\t_self.blpFactor = Number( values[ 1 ] );\n\t\t_self.inputWatts = Number( values[ 2 ] );\n\n\t}\n\n\twhile ( true ) {\n\n\t\tline = textArray[ lineNumber ++ ];\n\n\t\tif ( line.includes( 'TILT' ) ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tif ( ! line.includes( 'NONE' ) ) {\n\n\t\tif ( line.includes( 'INCLUDE' ) ) {\n\n\t\t\treadTilt();\n\n\t\t} else {\n\n\t\t\t// TODO:: Read tilt data from a file\n\n\t\t}\n\n\t}\n\n\treadLampValues();\n\n\treadLampFactors();\n\n\t// Initialize candela value array\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\t_self.candelaValues.push( [ ] );\n\n\t}\n\n\t// Parse Angles\n\treadArray( _self.numVerAngles, _self.verAngles );\n\treadArray( _self.numHorAngles, _self.horAngles );\n\n\t// Parse Candela values\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\treadArray( _self.numVerAngles, _self.candelaValues[ i ] );\n\n\t}\n\n\t// Calculate actual candela values, and normalize.\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\tfor ( let j = 0; j < _self.numVerAngles; ++ j ) {\n\n\t\t\t_self.candelaValues[ i ][ j ] *= _self.candelaValues[ i ][ j ] * _self.multiplier\n\t\t\t\t* _self.ballFactor * _self.blpFactor;\n\n\t\t}\n\n\t}\n\n\tlet maxVal = - 1;\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\tfor ( let j = 0; j < _self.numVerAngles; ++ j ) {\n\n\t\t\tconst value = _self.candelaValues[ i ][ j ];\n\t\t\tmaxVal = maxVal < value ? value : maxVal;\n\n\t\t}\n\n\t}\n\n\tconst bNormalize = true;\n\tif ( bNormalize && maxVal > 0 ) {\n\n\t\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\t\tfor ( let j = 0; j < _self.numVerAngles; ++ j ) {\n\n\t\t\t\t_self.candelaValues[ i ][ j ] /= maxVal;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport class IESLoader extends Loader {\n\n\t_getIESValues( iesLamp ) {\n\n\t\tconst width = 360;\n\t\tconst height = 180;\n\t\tconst size = width * height;\n\n\t\tconst data = new Float32Array( size );\n\n\t\tfunction interpolateCandelaValues( phi, theta ) {\n\n\t\t\tlet phiIndex = 0, thetaIndex = 0;\n\t\t\tlet startTheta = 0, endTheta = 0, startPhi = 0, endPhi = 0;\n\n\t\t\tfor ( let i = 0; i < iesLamp.numHorAngles - 1; ++ i ) { // numHorAngles = horAngles.length-1 because of extra padding, so this wont cause an out of bounds error\n\n\t\t\t\tif ( theta < iesLamp.horAngles[ i + 1 ] || i == iesLamp.numHorAngles - 2 ) {\n\n\t\t\t\t\tthetaIndex = i;\n\t\t\t\t\tstartTheta = iesLamp.horAngles[ i ];\n\t\t\t\t\tendTheta = iesLamp.horAngles[ i + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < iesLamp.numVerAngles - 1; ++ i ) {\n\n\t\t\t\tif ( phi < iesLamp.verAngles[ i + 1 ] || i == iesLamp.numVerAngles - 2 ) {\n\n\t\t\t\t\tphiIndex = i;\n\t\t\t\t\tstartPhi = iesLamp.verAngles[ i ];\n\t\t\t\t\tendPhi = iesLamp.verAngles[ i + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst deltaTheta = endTheta - startTheta;\n\t\t\tconst deltaPhi = endPhi - startPhi;\n\n\t\t\tif ( deltaPhi === 0 ) // Outside range\n\t\t\t\treturn 0;\n\n\t\t\tconst t1 = deltaTheta === 0 ? 0 : ( theta - startTheta ) / deltaTheta;\n\t\t\tconst t2 = ( phi - startPhi ) / deltaPhi;\n\n\t\t\tconst nextThetaIndex = deltaTheta === 0 ? thetaIndex : thetaIndex + 1;\n\n\t\t\tconst v1 = MathUtils.lerp( iesLamp.candelaValues[ thetaIndex ][ phiIndex ], iesLamp.candelaValues[ nextThetaIndex ][ phiIndex ], t1 );\n\t\t\tconst v2 = MathUtils.lerp( iesLamp.candelaValues[ thetaIndex ][ phiIndex + 1 ], iesLamp.candelaValues[ nextThetaIndex ][ phiIndex + 1 ], t1 );\n\t\t\tconst v = MathUtils.lerp( v1, v2, t2 );\n\n\t\t\treturn v;\n\n\t\t}\n\n\t\tconst startTheta = iesLamp.horAngles[ 0 ], endTheta = iesLamp.horAngles[ iesLamp.numHorAngles - 1 ];\n\t\tfor ( let i = 0; i < size; ++ i ) {\n\n\t\t\tlet theta = i % width;\n\t\t\tconst phi = Math.floor( i / width );\n\n\t\t\tif ( endTheta - startTheta !== 0 && ( theta < startTheta || theta >= endTheta ) ) { // Handle symmetry for hor angles\n\n\t\t\t\ttheta %= endTheta * 2;\n\t\t\t\tif ( theta > endTheta )\n\t\t\t\t\ttheta = endTheta * 2 - theta;\n\n\t\t\t}\n\n\t\t\tdata[ i ] = interpolateCandelaValues( phi, theta );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'text' );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\n\t\tconst texture = new DataTexture( null, 360, 180, RedFormat, HalfFloatType );\n\t\ttexture.minFilter = LinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\n\t\tloader.load( url, text => {\n\n\t\t\tconst iesLamp = new IESLamp( text );\n\n\t\t\ttexture.image.data = toHalfFloatArray( this._getIESValues( iesLamp ) );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n\tparse( text ) {\n\n\t\tconst iesLamp = new IESLamp( text );\n\t\tconst texture = new DataTexture( null, 360, 180, RedFormat, HalfFloatType );\n\t\ttexture.minFilter = LinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.image.data = toHalfFloatArray( this._getIESValues( iesLamp ) );\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n","import { DataUtils } from 'three';\n\n\nexport function toHalfFloatArray( f32Array ) {\n\n\tconst f16Array = new Uint16Array( f32Array.length );\n\tfor ( let i = 0, n = f32Array.length; i < n; ++ i ) {\n\n\t\tf16Array[ i ] = DataUtils.toHalfFloat( f32Array[ i ] );\n\n\t}\n\n\treturn f16Array;\n\n}\n","// Split strategy constants\nexport const CENTER = 0;\nexport const AVERAGE = 1;\nexport const SAH = 2;\n\n// Traversal constants\nexport const NOT_INTERSECTED = 0;\nexport const INTERSECTED = 1;\nexport const CONTAINED = 2;\n\n// SAH cost constants\n// TODO: hone these costs more. The relative difference between them should be the\n// difference in measured time to perform a triangle intersection vs traversing\n// bounds.\nexport const TRIANGLE_INTERSECT_COST = 1.25;\nexport const TRAVERSAL_COST = 1;\n\n\n// Build constants\nexport const BYTES_PER_NODE = 6 * 4 + 4 + 4;\nexport const IS_LEAFNODE_FLAG = 0xFFFF;\n\n// EPSILON for computing floating point error during build\n// https://en.wikipedia.org/wiki/Machine_epsilon#Values_for_standard_hardware_floating_point_arithmetics\nexport const FLOAT32_EPSILON = Math.pow( 2, - 24 );\n\nexport const SKIP_GENERATION = Symbol( 'SKIP_GENERATION' );\n","import { BufferAttribute, Box3, FrontSide } from 'three';\nimport { CENTER, BYTES_PER_NODE, IS_LEAFNODE_FLAG, SKIP_GENERATION } from './Constants.js';\nimport { buildPackedTree } from './build/buildTree.js';\nimport { OrientedBox } from '../math/OrientedBox.js';\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\nimport { ExtendedTrianglePool } from '../utils/ExtendedTrianglePool.js';\nimport { shapecast } from './cast/shapecast.js';\nimport { closestPointToPoint } from './cast/closestPointToPoint.js';\n\nimport { iterateOverTriangles } from './utils/iterationUtils.generated.js';\nimport { refit } from './cast/refit.generated.js';\nimport { raycast } from './cast/raycast.generated.js';\nimport { raycastFirst } from './cast/raycastFirst.generated.js';\nimport { intersectsGeometry } from './cast/intersectsGeometry.generated.js';\nimport { closestPointToGeometry } from './cast/closestPointToGeometry.generated.js';\n\nimport { iterateOverTriangles_indirect } from './utils/iterationUtils_indirect.generated.js';\nimport { refit_indirect } from './cast/refit_indirect.generated.js';\nimport { raycast_indirect } from './cast/raycast_indirect.generated.js';\nimport { raycastFirst_indirect } from './cast/raycastFirst_indirect.generated.js';\nimport { intersectsGeometry_indirect } from './cast/intersectsGeometry_indirect.generated.js';\nimport { closestPointToGeometry_indirect } from './cast/closestPointToGeometry_indirect.generated.js';\nimport { isSharedArrayBufferSupported } from '../utils/BufferUtils.js';\nimport { setTriangle } from '../utils/TriangleUtilities.js';\nimport { bvhcast } from './cast/bvhcast.js';\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst tempBox = /* @__PURE__ */ new Box3();\nexport const DEFAULT_OPTIONS = {\n\tstrategy: CENTER,\n\tmaxDepth: 40,\n\tmaxLeafTris: 10,\n\tuseSharedArrayBuffer: false,\n\tsetBoundingBox: true,\n\tonProgress: null,\n\tindirect: false,\n\tverbose: true,\n\trange: null\n};\n\nexport class MeshBVH {\n\n\tstatic serialize( bvh, options = {} ) {\n\n\t\toptions = {\n\t\t\tcloneBuffers: true,\n\t\t\t...options,\n\t\t};\n\n\t\tconst geometry = bvh.geometry;\n\t\tconst rootData = bvh._roots;\n\t\tconst indirectBuffer = bvh._indirectBuffer;\n\t\tconst indexAttribute = geometry.getIndex();\n\t\tlet result;\n\t\tif ( options.cloneBuffers ) {\n\n\t\t\tresult = {\n\t\t\t\troots: rootData.map( root => root.slice() ),\n\t\t\t\tindex: indexAttribute ? indexAttribute.array.slice() : null,\n\t\t\t\tindirectBuffer: indirectBuffer ? indirectBuffer.slice() : null,\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tresult = {\n\t\t\t\troots: rootData,\n\t\t\t\tindex: indexAttribute ? indexAttribute.array : null,\n\t\t\t\tindirectBuffer: indirectBuffer,\n\t\t\t};\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tstatic deserialize( data, geometry, options = {} ) {\n\n\t\toptions = {\n\t\t\tsetIndex: true,\n\t\t\tindirect: Boolean( data.indirectBuffer ),\n\t\t\t...options,\n\t\t};\n\n\t\tconst { index, roots, indirectBuffer } = data;\n\t\tconst bvh = new MeshBVH( geometry, { ...options, [ SKIP_GENERATION ]: true } );\n\t\tbvh._roots = roots;\n\t\tbvh._indirectBuffer = indirectBuffer || null;\n\n\t\tif ( options.setIndex ) {\n\n\t\t\tconst indexAttribute = geometry.getIndex();\n\t\t\tif ( indexAttribute === null ) {\n\n\t\t\t\tconst newIndex = new BufferAttribute( data.index, 1, false );\n\t\t\t\tgeometry.setIndex( newIndex );\n\n\t\t\t} else if ( indexAttribute.array !== index ) {\n\n\t\t\t\tindexAttribute.array.set( index );\n\t\t\t\tindexAttribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bvh;\n\n\t}\n\n\tget indirect() {\n\n\t\treturn ! ! this._indirectBuffer;\n\n\t}\n\n\tconstructor( geometry, options = {} ) {\n\n\t\tif ( ! geometry.isBufferGeometry ) {\n\n\t\t\tthrow new Error( 'MeshBVH: Only BufferGeometries are supported.' );\n\n\t\t} else if ( geometry.index && geometry.index.isInterleavedBufferAttribute ) {\n\n\t\t\tthrow new Error( 'MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.' );\n\n\t\t}\n\n\t\t// default options\n\t\toptions = Object.assign( {\n\n\t\t\t...DEFAULT_OPTIONS,\n\n\t\t\t// undocumented options\n\n\t\t\t// Whether to skip generating the tree. Used for deserialization.\n\t\t\t[ SKIP_GENERATION ]: false,\n\n\t\t}, options );\n\n\t\tif ( options.useSharedArrayBuffer && ! isSharedArrayBufferSupported() ) {\n\n\t\t\tthrow new Error( 'MeshBVH: SharedArrayBuffer is not available.' );\n\n\t\t}\n\n\t\t// retain references to the geometry so we can use them it without having to\n\t\t// take a geometry reference in every function.\n\t\tthis.geometry = geometry;\n\t\tthis._roots = null;\n\t\tthis._indirectBuffer = null;\n\t\tif ( ! options[ SKIP_GENERATION ] ) {\n\n\t\t\tbuildPackedTree( this, options );\n\n\t\t\tif ( ! geometry.boundingBox && options.setBoundingBox ) {\n\n\t\t\t\tgeometry.boundingBox = this.getBoundingBox( new Box3() );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.resolveTriangleIndex = options.indirect ? i => this._indirectBuffer[ i ] : i => i;\n\n\t}\n\n\trefit( nodeIndices = null ) {\n\n\t\tconst refitFunc = this.indirect ? refit_indirect : refit;\n\t\treturn refitFunc( this, nodeIndices );\n\n\t}\n\n\ttraverse( callback, rootIndex = 0 ) {\n\n\t\tconst buffer = this._roots[ rootIndex ];\n\t\tconst uint32Array = new Uint32Array( buffer );\n\t\tconst uint16Array = new Uint16Array( buffer );\n\t\t_traverse( 0 );\n\n\t\tfunction _traverse( node32Index, depth = 0 ) {\n\n\t\t\tconst node16Index = node32Index * 2;\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\n\t\t\tif ( isLeaf ) {\n\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\n\t\t\t\tcallback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), offset, count );\n\n\t\t\t} else {\n\n\t\t\t\t// TODO: use node functions here\n\t\t\t\tconst left = node32Index + BYTES_PER_NODE / 4;\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\n\t\t\t\tconst splitAxis = uint32Array[ node32Index + 7 ];\n\t\t\t\tconst stopTraversal = callback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), splitAxis );\n\n\t\t\t\tif ( ! stopTraversal ) {\n\n\t\t\t\t\t_traverse( left, depth + 1 );\n\t\t\t\t\t_traverse( right, depth + 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/* Core Cast Functions */\n\traycast( ray, materialOrSide = FrontSide, near = 0, far = Infinity ) {\n\n\t\tconst roots = this._roots;\n\t\tconst geometry = this.geometry;\n\t\tconst intersects = [];\n\t\tconst isMaterial = materialOrSide.isMaterial;\n\t\tconst isArrayMaterial = Array.isArray( materialOrSide );\n\n\t\tconst groups = geometry.groups;\n\t\tconst side = isMaterial ? materialOrSide.side : materialOrSide;\n\t\tconst raycastFunc = this.indirect ? raycast_indirect : raycast;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst materialSide = isArrayMaterial ? materialOrSide[ groups[ i ].materialIndex ].side : side;\n\t\t\tconst startCount = intersects.length;\n\n\t\t\traycastFunc( this, i, materialSide, ray, intersects, near, far );\n\n\t\t\tif ( isArrayMaterial ) {\n\n\t\t\t\tconst materialIndex = groups[ i ].materialIndex;\n\t\t\t\tfor ( let j = startCount, jl = intersects.length; j < jl; j ++ ) {\n\n\t\t\t\t\tintersects[ j ].face.materialIndex = materialIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn intersects;\n\n\t}\n\n\traycastFirst( ray, materialOrSide = FrontSide, near = 0, far = Infinity ) {\n\n\t\tconst roots = this._roots;\n\t\tconst geometry = this.geometry;\n\t\tconst isMaterial = materialOrSide.isMaterial;\n\t\tconst isArrayMaterial = Array.isArray( materialOrSide );\n\n\t\tlet closestResult = null;\n\n\t\tconst groups = geometry.groups;\n\t\tconst side = isMaterial ? materialOrSide.side : materialOrSide;\n\t\tconst raycastFirstFunc = this.indirect ? raycastFirst_indirect : raycastFirst;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst materialSide = isArrayMaterial ? materialOrSide[ groups[ i ].materialIndex ].side : side;\n\t\t\tconst result = raycastFirstFunc( this, i, materialSide, ray, near, far );\n\t\t\tif ( result != null && ( closestResult == null || result.distance < closestResult.distance ) ) {\n\n\t\t\t\tclosestResult = result;\n\t\t\t\tif ( isArrayMaterial ) {\n\n\t\t\t\t\tresult.face.materialIndex = groups[ i ].materialIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn closestResult;\n\n\t}\n\n\tintersectsGeometry( otherGeometry, geomToMesh ) {\n\n\t\tlet result = false;\n\t\tconst roots = this._roots;\n\t\tconst intersectsGeometryFunc = this.indirect ? intersectsGeometry_indirect : intersectsGeometry;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tresult = intersectsGeometryFunc( this, i, otherGeometry, geomToMesh );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tshapecast( callbacks ) {\n\n\t\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\t\tconst iterateFunc = this.indirect ? iterateOverTriangles_indirect : iterateOverTriangles;\n\t\tlet {\n\t\t\tboundsTraverseOrder,\n\t\t\tintersectsBounds,\n\t\t\tintersectsRange,\n\t\t\tintersectsTriangle,\n\t\t} = callbacks;\n\n\t\t// wrap the intersectsRange function\n\t\tif ( intersectsRange && intersectsTriangle ) {\n\n\t\t\tconst originalIntersectsRange = intersectsRange;\n\t\t\tintersectsRange = ( offset, count, contained, depth, nodeIndex ) => {\n\n\t\t\t\tif ( ! originalIntersectsRange( offset, count, contained, depth, nodeIndex ) ) {\n\n\t\t\t\t\treturn iterateFunc( offset, count, this, intersectsTriangle, contained, depth, triangle );\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t} else if ( ! intersectsRange ) {\n\n\t\t\tif ( intersectsTriangle ) {\n\n\t\t\t\tintersectsRange = ( offset, count, contained, depth ) => {\n\n\t\t\t\t\treturn iterateFunc( offset, count, this, intersectsTriangle, contained, depth, triangle );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tintersectsRange = ( offset, count, contained ) => {\n\n\t\t\t\t\treturn contained;\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// run shapecast\n\t\tlet result = false;\n\t\tlet byteOffset = 0;\n\t\tconst roots = this._roots;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst root = roots[ i ];\n\t\t\tresult = shapecast( this, i, intersectsBounds, intersectsRange, boundsTraverseOrder, byteOffset );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tbyteOffset += root.byteLength;\n\n\t\t}\n\n\t\tExtendedTrianglePool.releasePrimitive( triangle );\n\n\t\treturn result;\n\n\t}\n\n\tbvhcast( otherBvh, matrixToLocal, callbacks ) {\n\n\t\tlet {\n\t\t\tintersectsRanges,\n\t\t\tintersectsTriangles,\n\t\t} = callbacks;\n\n\t\tconst triangle1 = ExtendedTrianglePool.getPrimitive();\n\t\tconst indexAttr1 = this.geometry.index;\n\t\tconst positionAttr1 = this.geometry.attributes.position;\n\t\tconst assignTriangle1 = this.indirect ?\n\t\t\ti1 => {\n\n\n\t\t\t\tconst ti = this.resolveTriangleIndex( i1 );\n\t\t\t\tsetTriangle( triangle1, ti * 3, indexAttr1, positionAttr1 );\n\n\t\t\t} :\n\t\t\ti1 => {\n\n\t\t\t\tsetTriangle( triangle1, i1 * 3, indexAttr1, positionAttr1 );\n\n\t\t\t};\n\n\t\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\t\tconst indexAttr2 = otherBvh.geometry.index;\n\t\tconst positionAttr2 = otherBvh.geometry.attributes.position;\n\t\tconst assignTriangle2 = otherBvh.indirect ?\n\t\t\ti2 => {\n\n\t\t\t\tconst ti2 = otherBvh.resolveTriangleIndex( i2 );\n\t\t\t\tsetTriangle( triangle2, ti2 * 3, indexAttr2, positionAttr2 );\n\n\t\t\t} :\n\t\t\ti2 => {\n\n\t\t\t\tsetTriangle( triangle2, i2 * 3, indexAttr2, positionAttr2 );\n\n\t\t\t};\n\n\t\t// generate triangle callback if needed\n\t\tif ( intersectsTriangles ) {\n\n\t\t\tconst iterateOverDoubleTriangles = ( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) => {\n\n\t\t\t\tfor ( let i2 = offset2, l2 = offset2 + count2; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\tassignTriangle2( i2 );\n\n\t\t\t\t\ttriangle2.a.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.b.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.c.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tfor ( let i1 = offset1, l1 = offset1 + count1; i1 < l1; i1 ++ ) {\n\n\t\t\t\t\t\tassignTriangle1( i1 );\n\n\t\t\t\t\t\ttriangle1.needsUpdate = true;\n\n\t\t\t\t\t\tif ( intersectsTriangles( triangle1, triangle2, i1, i2, depth1, index1, depth2, index2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t\tif ( intersectsRanges ) {\n\n\t\t\t\tconst originalIntersectsRanges = intersectsRanges;\n\t\t\t\tintersectsRanges = function ( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) {\n\n\t\t\t\t\tif ( ! originalIntersectsRanges( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) ) {\n\n\t\t\t\t\t\treturn iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, index1, depth2, index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tintersectsRanges = iterateOverDoubleTriangles;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bvhcast( this, otherBvh, matrixToLocal, intersectsRanges );\n\n\t}\n\n\n\t/* Derived Cast Functions */\n\tintersectsBox( box, boxToMesh ) {\n\n\t\tobb.set( box.min, box.max, boxToMesh );\n\t\tobb.needsUpdate = true;\n\n\t\treturn this.shapecast(\n\t\t\t{\n\t\t\t\tintersectsBounds: box => obb.intersectsBox( box ),\n\t\t\t\tintersectsTriangle: tri => obb.intersectsTriangle( tri )\n\t\t\t}\n\t\t);\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.shapecast(\n\t\t\t{\n\t\t\t\tintersectsBounds: box => sphere.intersectsBox( box ),\n\t\t\t\tintersectsTriangle: tri => tri.intersectsSphere( sphere )\n\t\t\t}\n\t\t);\n\n\t}\n\n\tclosestPointToGeometry( otherGeometry, geometryToBvh, target1 = { }, target2 = { }, minThreshold = 0, maxThreshold = Infinity ) {\n\n\t\tconst closestPointToGeometryFunc = this.indirect ? closestPointToGeometry_indirect : closestPointToGeometry;\n\t\treturn closestPointToGeometryFunc(\n\t\t\tthis,\n\t\t\totherGeometry,\n\t\t\tgeometryToBvh,\n\t\t\ttarget1,\n\t\t\ttarget2,\n\t\t\tminThreshold,\n\t\t\tmaxThreshold,\n\t\t);\n\n\t}\n\n\tclosestPointToPoint( point, target = { }, minThreshold = 0, maxThreshold = Infinity ) {\n\n\t\treturn closestPointToPoint(\n\t\t\tthis,\n\t\t\tpoint,\n\t\t\ttarget,\n\t\t\tminThreshold,\n\t\t\tmaxThreshold,\n\t\t);\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\ttarget.makeEmpty();\n\n\t\tconst roots = this._roots;\n\t\troots.forEach( buffer => {\n\n\t\t\tarrayToBox( 0, new Float32Array( buffer ), tempBox );\n\t\t\ttarget.union( tempBox );\n\n\t\t} );\n\n\t\treturn target;\n\n\t}\n\n}\n","export class MeshBVHNode {\n\n\tconstructor() {\n\n\t\t// internal nodes have boundingData, left, right, and splitAxis\n\t\t// leaf nodes have offset and count (referring to primitives in the mesh geometry)\n\n\t\tthis.boundingData = new Float32Array( 6 );\n\n\t}\n\n}\n","import { ensureIndex, getFullGeometryRange, getRootIndexRanges, getTriCount, hasGroupGaps, } from './geometryUtils.js';\nimport { getBounds, computeTriangleBounds } from './computeBoundsUtils.js';\nimport { getOptimalSplit } from './splitUtils.js';\nimport { MeshBVHNode } from '../MeshBVHNode.js';\nimport { BYTES_PER_NODE } from '../Constants.js';\n\nimport { partition } from './sortUtils.generated.js';\nimport { partition_indirect } from './sortUtils_indirect.generated.js';\nimport { countNodes, populateBuffer } from './buildUtils.js';\n\nexport function generateIndirectBuffer( geometry, useSharedArrayBuffer ) {\n\n\tconst triCount = ( geometry.index ? geometry.index.count : geometry.attributes.position.count ) / 3;\n\tconst useUint32 = triCount > 2 ** 16;\n\tconst byteCount = useUint32 ? 4 : 2;\n\n\tconst buffer = useSharedArrayBuffer ? new SharedArrayBuffer( triCount * byteCount ) : new ArrayBuffer( triCount * byteCount );\n\tconst indirectBuffer = useUint32 ? new Uint32Array( buffer ) : new Uint16Array( buffer );\n\tfor ( let i = 0, l = indirectBuffer.length; i < l; i ++ ) {\n\n\t\tindirectBuffer[ i ] = i;\n\n\t}\n\n\treturn indirectBuffer;\n\n}\n\nexport function buildTree( bvh, triangleBounds, offset, count, options ) {\n\n\t// epxand variables\n\tconst {\n\t\tmaxDepth,\n\t\tverbose,\n\t\tmaxLeafTris,\n\t\tstrategy,\n\t\tonProgress,\n\t\tindirect,\n\t} = options;\n\tconst indirectBuffer = bvh._indirectBuffer;\n\tconst geometry = bvh.geometry;\n\tconst indexArray = geometry.index ? geometry.index.array : null;\n\tconst partionFunc = indirect ? partition_indirect : partition;\n\n\t// generate intermediate variables\n\tconst totalTriangles = getTriCount( geometry );\n\tconst cacheCentroidBoundingData = new Float32Array( 6 );\n\tlet reachedMaxDepth = false;\n\n\tconst root = new MeshBVHNode();\n\tgetBounds( triangleBounds, offset, count, root.boundingData, cacheCentroidBoundingData );\n\tsplitNode( root, offset, count, cacheCentroidBoundingData );\n\treturn root;\n\n\tfunction triggerProgress( trianglesProcessed ) {\n\n\t\tif ( onProgress ) {\n\n\t\t\tonProgress( trianglesProcessed / totalTriangles );\n\n\t\t}\n\n\t}\n\n\t// either recursively splits the given node, creating left and right subtrees for it, or makes it a leaf node,\n\t// recording the offset and count of its triangles and writing them into the reordered geometry index.\n\tfunction splitNode( node, offset, count, centroidBoundingData = null, depth = 0 ) {\n\n\t\tif ( ! reachedMaxDepth && depth >= maxDepth ) {\n\n\t\t\treachedMaxDepth = true;\n\t\t\tif ( verbose ) {\n\n\t\t\t\tconsole.warn( `MeshBVH: Max depth of ${ maxDepth } reached when generating BVH. Consider increasing maxDepth.` );\n\t\t\t\tconsole.warn( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// early out if we've met our capacity\n\t\tif ( count <= maxLeafTris || depth >= maxDepth ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\t\t\treturn node;\n\n\t\t}\n\n\t\t// Find where to split the volume\n\t\tconst split = getOptimalSplit( node.boundingData, centroidBoundingData, triangleBounds, offset, count, strategy );\n\t\tif ( split.axis === - 1 ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\t\t\treturn node;\n\n\t\t}\n\n\t\tconst splitOffset = partionFunc( indirectBuffer, indexArray, triangleBounds, offset, count, split );\n\n\t\t// create the two new child nodes\n\t\tif ( splitOffset === offset || splitOffset === offset + count ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\n\t\t} else {\n\n\t\t\tnode.splitAxis = split.axis;\n\n\t\t\t// create the left child and compute its bounding box\n\t\t\tconst left = new MeshBVHNode();\n\t\t\tconst lstart = offset;\n\t\t\tconst lcount = splitOffset - offset;\n\t\t\tnode.left = left;\n\n\t\t\tgetBounds( triangleBounds, lstart, lcount, left.boundingData, cacheCentroidBoundingData );\n\t\t\tsplitNode( left, lstart, lcount, cacheCentroidBoundingData, depth + 1 );\n\n\t\t\t// repeat for right\n\t\t\tconst right = new MeshBVHNode();\n\t\t\tconst rstart = splitOffset;\n\t\t\tconst rcount = count - lcount;\n\t\t\tnode.right = right;\n\n\t\t\tgetBounds( triangleBounds, rstart, rcount, right.boundingData, cacheCentroidBoundingData );\n\t\t\tsplitNode( right, rstart, rcount, cacheCentroidBoundingData, depth + 1 );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n}\n\nexport function buildPackedTree( bvh, options ) {\n\n\tconst geometry = bvh.geometry;\n\tif ( options.indirect ) {\n\n\t\tbvh._indirectBuffer = generateIndirectBuffer( geometry, options.useSharedArrayBuffer );\n\n\t\tif ( hasGroupGaps( geometry, options.range ) && ! options.verbose ) {\n\n\t\t\tconsole.warn(\n\t\t\t\t'MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the \"indirect\" option. ' +\n\t\t\t\t'BVH may incorrectly report intersections on unrendered portions of the geometry.'\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tif ( ! bvh._indirectBuffer ) {\n\n\t\tensureIndex( geometry, options );\n\n\t}\n\n\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\n\n\tconst triangleBounds = computeTriangleBounds( geometry );\n\tconst geometryRanges = options.indirect ? getFullGeometryRange( geometry, options.range ) : getRootIndexRanges( geometry, options.range );\n\tbvh._roots = geometryRanges.map( range => {\n\n\t\tconst root = buildTree( bvh, triangleBounds, range.offset, range.count, options );\n\t\tconst nodeCount = countNodes( root );\n\t\tconst buffer = new BufferConstructor( BYTES_PER_NODE * nodeCount );\n\t\tpopulateBuffer( 0, root, buffer );\n\t\treturn buffer;\n\n\t} );\n\n}\n","import { BYTES_PER_NODE, IS_LEAFNODE_FLAG } from '../Constants.js';\nimport { IS_LEAF } from '../utils/nodeBufferUtils.js';\n\nlet float32Array, uint32Array, uint16Array, uint8Array;\nconst MAX_POINTER = Math.pow( 2, 32 );\n\nexport function countNodes( node ) {\n\n\tif ( 'count' in node ) {\n\n\t\treturn 1;\n\n\t} else {\n\n\t\treturn 1 + countNodes( node.left ) + countNodes( node.right );\n\n\t}\n\n}\n\nexport function populateBuffer( byteOffset, node, buffer ) {\n\n\tfloat32Array = new Float32Array( buffer );\n\tuint32Array = new Uint32Array( buffer );\n\tuint16Array = new Uint16Array( buffer );\n\tuint8Array = new Uint8Array( buffer );\n\n\treturn _populateBuffer( byteOffset, node );\n\n}\n\n// pack structure\n// boundingData  \t\t\t\t: 6 float32\n// right / offset \t\t\t\t: 1 uint32\n// splitAxis / isLeaf + count \t: 1 uint32 / 2 uint16\nfunction _populateBuffer( byteOffset, node ) {\n\n\tconst stride4Offset = byteOffset / 4;\n\tconst stride2Offset = byteOffset / 2;\n\tconst isLeaf = 'count' in node;\n\tconst boundingData = node.boundingData;\n\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\tfloat32Array[ stride4Offset + i ] = boundingData[ i ];\n\n\t}\n\n\tif ( isLeaf ) {\n\n\t\tif ( node.buffer ) {\n\n\t\t\tconst buffer = node.buffer;\n\t\t\tuint8Array.set( new Uint8Array( buffer ), byteOffset );\n\n\t\t\tfor ( let offset = byteOffset, l = byteOffset + buffer.byteLength; offset < l; offset += BYTES_PER_NODE ) {\n\n\t\t\t\tconst offset2 = offset / 2;\n\t\t\t\tif ( ! IS_LEAF( offset2, uint16Array ) ) {\n\n\t\t\t\t\tuint32Array[ ( offset / 4 ) + 6 ] += stride4Offset;\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn byteOffset + buffer.byteLength;\n\n\t\t} else {\n\n\t\t\tconst offset = node.offset;\n\t\t\tconst count = node.count;\n\t\t\tuint32Array[ stride4Offset + 6 ] = offset;\n\t\t\tuint16Array[ stride2Offset + 14 ] = count;\n\t\t\tuint16Array[ stride2Offset + 15 ] = IS_LEAFNODE_FLAG;\n\t\t\treturn byteOffset + BYTES_PER_NODE;\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = node.left;\n\t\tconst right = node.right;\n\t\tconst splitAxis = node.splitAxis;\n\n\t\tlet nextUnusedPointer;\n\t\tnextUnusedPointer = _populateBuffer( byteOffset + BYTES_PER_NODE, left );\n\n\t\tif ( ( nextUnusedPointer / 4 ) > MAX_POINTER ) {\n\n\t\t\tthrow new Error( 'MeshBVH: Cannot store child pointer greater than 32 bits.' );\n\n\t\t}\n\n\t\tuint32Array[ stride4Offset + 6 ] = nextUnusedPointer / 4;\n\t\tnextUnusedPointer = _populateBuffer( nextUnusedPointer, right );\n\n\t\tuint32Array[ stride4Offset + 7 ] = splitAxis;\n\t\treturn nextUnusedPointer;\n\n\t}\n\n}\n","import { FLOAT32_EPSILON } from '../Constants.js';\nimport { getTriCount } from './geometryUtils.js';\n\n// computes the union of the bounds of all of the given triangles and puts the resulting box in \"target\".\n// A bounding box is computed for the centroids of the triangles, as well, and placed in \"centroidTarget\".\n// These are computed together to avoid redundant accesses to bounds array.\nexport function getBounds( triangleBounds, offset, count, target, centroidTarget ) {\n\n\tlet minx = Infinity;\n\tlet miny = Infinity;\n\tlet minz = Infinity;\n\tlet maxx = - Infinity;\n\tlet maxy = - Infinity;\n\tlet maxz = - Infinity;\n\n\tlet cminx = Infinity;\n\tlet cminy = Infinity;\n\tlet cminz = Infinity;\n\tlet cmaxx = - Infinity;\n\tlet cmaxy = - Infinity;\n\tlet cmaxz = - Infinity;\n\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\n\n\t\tconst cx = triangleBounds[ i + 0 ];\n\t\tconst hx = triangleBounds[ i + 1 ];\n\t\tconst lx = cx - hx;\n\t\tconst rx = cx + hx;\n\t\tif ( lx < minx ) minx = lx;\n\t\tif ( rx > maxx ) maxx = rx;\n\t\tif ( cx < cminx ) cminx = cx;\n\t\tif ( cx > cmaxx ) cmaxx = cx;\n\n\t\tconst cy = triangleBounds[ i + 2 ];\n\t\tconst hy = triangleBounds[ i + 3 ];\n\t\tconst ly = cy - hy;\n\t\tconst ry = cy + hy;\n\t\tif ( ly < miny ) miny = ly;\n\t\tif ( ry > maxy ) maxy = ry;\n\t\tif ( cy < cminy ) cminy = cy;\n\t\tif ( cy > cmaxy ) cmaxy = cy;\n\n\t\tconst cz = triangleBounds[ i + 4 ];\n\t\tconst hz = triangleBounds[ i + 5 ];\n\t\tconst lz = cz - hz;\n\t\tconst rz = cz + hz;\n\t\tif ( lz < minz ) minz = lz;\n\t\tif ( rz > maxz ) maxz = rz;\n\t\tif ( cz < cminz ) cminz = cz;\n\t\tif ( cz > cmaxz ) cmaxz = cz;\n\n\t}\n\n\ttarget[ 0 ] = minx;\n\ttarget[ 1 ] = miny;\n\ttarget[ 2 ] = minz;\n\n\ttarget[ 3 ] = maxx;\n\ttarget[ 4 ] = maxy;\n\ttarget[ 5 ] = maxz;\n\n\tcentroidTarget[ 0 ] = cminx;\n\tcentroidTarget[ 1 ] = cminy;\n\tcentroidTarget[ 2 ] = cminz;\n\n\tcentroidTarget[ 3 ] = cmaxx;\n\tcentroidTarget[ 4 ] = cmaxy;\n\tcentroidTarget[ 5 ] = cmaxz;\n\n}\n\n// precomputes the bounding box for each triangle; required for quickly calculating tree splits.\n// result is an array of size tris.length * 6 where triangle i maps to a\n// [x_center, x_delta, y_center, y_delta, z_center, z_delta] tuple starting at index i * 6,\n// representing the center and half-extent in each dimension of triangle i\nexport function computeTriangleBounds( geo, target = null, offset = null, count = null ) {\n\n\tconst posAttr = geo.attributes.position;\n\tconst index = geo.index ? geo.index.array : null;\n\tconst triCount = getTriCount( geo );\n\tconst normalized = posAttr.normalized;\n\tlet triangleBounds;\n\tif ( target === null ) {\n\n\t\ttriangleBounds = new Float32Array( triCount * 6 );\n\t\toffset = 0;\n\t\tcount = triCount;\n\n\t} else {\n\n\t\ttriangleBounds = target;\n\t\toffset = offset || 0;\n\t\tcount = count || triCount;\n\n\t}\n\n\t// used for non-normalized positions\n\tconst posArr = posAttr.array;\n\n\t// support for an interleaved position buffer\n\tconst bufferOffset = posAttr.offset || 0;\n\tlet stride = 3;\n\tif ( posAttr.isInterleavedBufferAttribute ) {\n\n\t\tstride = posAttr.data.stride;\n\n\t}\n\n\t// used for normalized positions\n\tconst getters = [ 'getX', 'getY', 'getZ' ];\n\n\tfor ( let tri = offset; tri < offset + count; tri ++ ) {\n\n\t\tconst tri3 = tri * 3;\n\t\tconst tri6 = tri * 6;\n\n\t\tlet ai = tri3 + 0;\n\t\tlet bi = tri3 + 1;\n\t\tlet ci = tri3 + 2;\n\n\t\tif ( index ) {\n\n\t\t\tai = index[ ai ];\n\t\t\tbi = index[ bi ];\n\t\t\tci = index[ ci ];\n\n\t\t}\n\n\t\t// we add the stride and offset here since we access the array directly\n\t\t// below for the sake of performance\n\t\tif ( ! normalized ) {\n\n\t\t\tai = ai * stride + bufferOffset;\n\t\t\tbi = bi * stride + bufferOffset;\n\t\t\tci = ci * stride + bufferOffset;\n\n\t\t}\n\n\t\tfor ( let el = 0; el < 3; el ++ ) {\n\n\t\t\tlet a, b, c;\n\n\t\t\tif ( normalized ) {\n\n\t\t\t\ta = posAttr[ getters[ el ] ]( ai );\n\t\t\t\tb = posAttr[ getters[ el ] ]( bi );\n\t\t\t\tc = posAttr[ getters[ el ] ]( ci );\n\n\t\t\t} else {\n\n\t\t\t\ta = posArr[ ai + el ];\n\t\t\t\tb = posArr[ bi + el ];\n\t\t\t\tc = posArr[ ci + el ];\n\n\t\t\t}\n\n\t\t\tlet min = a;\n\t\t\tif ( b < min ) min = b;\n\t\t\tif ( c < min ) min = c;\n\n\t\t\tlet max = a;\n\t\t\tif ( b > max ) max = b;\n\t\t\tif ( c > max ) max = c;\n\n\t\t\t// Increase the bounds size by float32 epsilon to avoid precision errors when\n\t\t\t// converting to 32 bit float. Scale the epsilon by the size of the numbers being\n\t\t\t// worked with.\n\t\t\tconst halfExtents = ( max - min ) / 2;\n\t\t\tconst el2 = el * 2;\n\t\t\ttriangleBounds[ tri6 + el2 + 0 ] = min + halfExtents;\n\t\t\ttriangleBounds[ tri6 + el2 + 1 ] = halfExtents + ( Math.abs( min ) + halfExtents ) * FLOAT32_EPSILON;\n\n\t\t}\n\n\t}\n\n\treturn triangleBounds;\n\n}\n","import { BufferAttribute } from 'three';\n\nexport function getVertexCount( geo ) {\n\n\treturn geo.index ? geo.index.count : geo.attributes.position.count;\n\n}\n\nexport function getTriCount( geo ) {\n\n\treturn getVertexCount( geo ) / 3;\n\n}\n\nexport function getIndexArray( vertexCount, BufferConstructor = ArrayBuffer ) {\n\n\tif ( vertexCount > 65535 ) {\n\n\t\treturn new Uint32Array( new BufferConstructor( 4 * vertexCount ) );\n\n\t} else {\n\n\t\treturn new Uint16Array( new BufferConstructor( 2 * vertexCount ) );\n\n\t}\n\n}\n\n// ensures that an index is present on the geometry\nexport function ensureIndex( geo, options ) {\n\n\tif ( ! geo.index ) {\n\n\t\tconst vertexCount = geo.attributes.position.count;\n\t\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\n\t\tconst index = getIndexArray( vertexCount, BufferConstructor );\n\t\tgeo.setIndex( new BufferAttribute( index, 1 ) );\n\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tindex[ i ] = i;\n\n\t\t}\n\n\t}\n\n}\n\n// Computes the set of { offset, count } ranges which need independent BVH roots. Each\n// region in the geometry index that belongs to a different set of material groups requires\n// a separate BVH root, so that triangles indices belonging to one group never get swapped\n// with triangle indices belongs to another group. For example, if the groups were like this:\n//\n// [-------------------------------------------------------------]\n// |__________________|\n//   g0 = [0, 20]  |______________________||_____________________|\n//                      g1 = [16, 40]           g2 = [41, 60]\n//\n// we would need four BVH roots: [0, 15], [16, 20], [21, 40], [41, 60].\nexport function getFullGeometryRange( geo, range ) {\n\n\tconst triCount = getTriCount( geo );\n\tconst drawRange = range ? range : geo.drawRange;\n\tconst start = drawRange.start / 3;\n\tconst end = ( drawRange.start + drawRange.count ) / 3;\n\n\tconst offset = Math.max( 0, start );\n\tconst count = Math.min( triCount, end ) - offset;\n\treturn [ {\n\t\toffset: Math.floor( offset ),\n\t\tcount: Math.floor( count ),\n\t} ];\n\n}\n\nexport function getRootIndexRanges( geo, range ) {\n\n\tif ( ! geo.groups || ! geo.groups.length ) {\n\n\t\treturn getFullGeometryRange( geo, range );\n\n\t}\n\n\tconst ranges = [];\n\tconst rangeBoundaries = new Set();\n\n\tconst drawRange = range ? range : geo.drawRange;\n\tconst drawRangeStart = drawRange.start / 3;\n\tconst drawRangeEnd = ( drawRange.start + drawRange.count ) / 3;\n\tfor ( const group of geo.groups ) {\n\n\t\tconst groupStart = group.start / 3;\n\t\tconst groupEnd = ( group.start + group.count ) / 3;\n\t\trangeBoundaries.add( Math.max( drawRangeStart, groupStart ) );\n\t\trangeBoundaries.add( Math.min( drawRangeEnd, groupEnd ) );\n\n\t}\n\n\n\t// note that if you don't pass in a comparator, it sorts them lexicographically as strings :-(\n\tconst sortedBoundaries = Array.from( rangeBoundaries.values() ).sort( ( a, b ) => a - b );\n\tfor ( let i = 0; i < sortedBoundaries.length - 1; i ++ ) {\n\n\t\tconst start = sortedBoundaries[ i ];\n\t\tconst end = sortedBoundaries[ i + 1 ];\n\n\t\tranges.push( {\n\t\t\toffset: Math.floor( start ),\n\t\t\tcount: Math.floor( end - start ),\n\t\t} );\n\n\t}\n\n\treturn ranges;\n\n}\n\nexport function hasGroupGaps( geometry, range ) {\n\n\tconst vertexCount = getTriCount( geometry );\n\tconst groups = getRootIndexRanges( geometry, range )\n\t\t.sort( ( a, b ) => a.offset - b.offset );\n\n\tconst finalGroup = groups[ groups.length - 1 ];\n\tfinalGroup.count = Math.min( vertexCount - finalGroup.offset, finalGroup.count );\n\n\tlet total = 0;\n\tgroups.forEach( ( { count } ) => total += count );\n\treturn vertexCount !== total;\n\n}\n","/********************************************************/\n/* This file is generated from \"sortUtils.template.js\". */\n/********************************************************/\n// reorders `tris` such that for `count` elements after `offset`, elements on the left side of the split\n// will be on the left and elements on the right side of the split will be on the right. returns the index\n// of the first element on the right side, or offset + count if there are no elements on the right side.\nfunction partition( indirectBuffer, index, triangleBounds, offset, count, split ) {\n\n\tlet left = offset;\n\tlet right = offset + count - 1;\n\tconst pos = split.pos;\n\tconst axisOffset = split.axis * 2;\n\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\n\twhile ( true ) {\n\n\t\twhile ( left <= right && triangleBounds[ left * 6 + axisOffset ] < pos ) {\n\n\t\t\tleft ++;\n\n\t\t}\n\n\t\t// if a triangle center lies on the partition plane it is considered to be on the right side\n\t\twhile ( left <= right && triangleBounds[ right * 6 + axisOffset ] >= pos ) {\n\n\t\t\tright --;\n\n\t\t}\n\n\t\tif ( left < right ) {\n\n\t\t\t// we need to swap all of the information associated with the triangles at index\n\t\t\t// left and right; that's the verts in the geometry index, the bounds,\n\t\t\t// and perhaps the SAH planes\n\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\tlet t0 = index[ left * 3 + i ];\n\t\t\t\tindex[ left * 3 + i ] = index[ right * 3 + i ];\n\t\t\t\tindex[ right * 3 + i ] = t0;\n\n\t\t\t}\n\n\n\t\t\t// swap bounds\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tlet tb = triangleBounds[ left * 6 + i ];\n\t\t\t\ttriangleBounds[ left * 6 + i ] = triangleBounds[ right * 6 + i ];\n\t\t\t\ttriangleBounds[ right * 6 + i ] = tb;\n\n\t\t\t}\n\n\t\t\tleft ++;\n\t\t\tright --;\n\n\t\t} else {\n\n\t\t\treturn left;\n\n\t\t}\n\n\t}\n\n}\n\nexport { partition };\n","/********************************************************/\n/* This file is generated from \"sortUtils.template.js\". */\n/********************************************************/\n// reorders `tris` such that for `count` elements after `offset`, elements on the left side of the split\n// will be on the left and elements on the right side of the split will be on the right. returns the index\n// of the first element on the right side, or offset + count if there are no elements on the right side.\nfunction partition_indirect( indirectBuffer, index, triangleBounds, offset, count, split ) {\n\n\tlet left = offset;\n\tlet right = offset + count - 1;\n\tconst pos = split.pos;\n\tconst axisOffset = split.axis * 2;\n\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\n\twhile ( true ) {\n\n\t\twhile ( left <= right && triangleBounds[ left * 6 + axisOffset ] < pos ) {\n\n\t\t\tleft ++;\n\n\t\t}\n\n\t\t// if a triangle center lies on the partition plane it is considered to be on the right side\n\t\twhile ( left <= right && triangleBounds[ right * 6 + axisOffset ] >= pos ) {\n\n\t\t\tright --;\n\n\t\t}\n\n\t\tif ( left < right ) {\n\n\t\t\t// we need to swap all of the information associated with the triangles at index\n\t\t\t// left and right; that's the verts in the geometry index, the bounds,\n\t\t\t// and perhaps the SAH planes\n\t\t\tlet t = indirectBuffer[ left ];\n\t\t\tindirectBuffer[ left ] = indirectBuffer[ right ];\n\t\t\tindirectBuffer[ right ] = t;\n\n\n\t\t\t// swap bounds\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tlet tb = triangleBounds[ left * 6 + i ];\n\t\t\t\ttriangleBounds[ left * 6 + i ] = triangleBounds[ right * 6 + i ];\n\t\t\t\ttriangleBounds[ right * 6 + i ] = tb;\n\n\t\t\t}\n\n\t\t\tleft ++;\n\t\t\tright --;\n\n\t\t} else {\n\n\t\t\treturn left;\n\n\t\t}\n\n\t}\n\n}\n\nexport { partition_indirect };\n","import { getLongestEdgeIndex, computeSurfaceArea, copyBounds, unionBounds, expandByTriangleBounds } from '../../utils/ArrayBoxUtilities.js';\nimport { CENTER, AVERAGE, SAH, TRIANGLE_INTERSECT_COST, TRAVERSAL_COST } from '../Constants.js';\n\nconst BIN_COUNT = 32;\nconst binsSort = ( a, b ) => a.candidate - b.candidate;\nconst sahBins = new Array( BIN_COUNT ).fill().map( () => {\n\n\treturn {\n\n\t\tcount: 0,\n\t\tbounds: new Float32Array( 6 ),\n\t\trightCacheBounds: new Float32Array( 6 ),\n\t\tleftCacheBounds: new Float32Array( 6 ),\n\t\tcandidate: 0,\n\n\t};\n\n} );\nconst leftBounds = new Float32Array( 6 );\n\nexport function getOptimalSplit( nodeBoundingData, centroidBoundingData, triangleBounds, offset, count, strategy ) {\n\n\tlet axis = - 1;\n\tlet pos = 0;\n\n\t// Center\n\tif ( strategy === CENTER ) {\n\n\t\taxis = getLongestEdgeIndex( centroidBoundingData );\n\t\tif ( axis !== - 1 ) {\n\n\t\t\tpos = ( centroidBoundingData[ axis ] + centroidBoundingData[ axis + 3 ] ) / 2;\n\n\t\t}\n\n\t} else if ( strategy === AVERAGE ) {\n\n\t\taxis = getLongestEdgeIndex( nodeBoundingData );\n\t\tif ( axis !== - 1 ) {\n\n\t\t\tpos = getAverage( triangleBounds, offset, count, axis );\n\n\t\t}\n\n\t} else if ( strategy === SAH ) {\n\n\t\tconst rootSurfaceArea = computeSurfaceArea( nodeBoundingData );\n\t\tlet bestCost = TRIANGLE_INTERSECT_COST * count;\n\n\t\t// iterate over all axes\n\t\tconst cStart = offset * 6;\n\t\tconst cEnd = ( offset + count ) * 6;\n\t\tfor ( let a = 0; a < 3; a ++ ) {\n\n\t\t\tconst axisLeft = centroidBoundingData[ a ];\n\t\t\tconst axisRight = centroidBoundingData[ a + 3 ];\n\t\t\tconst axisLength = axisRight - axisLeft;\n\t\t\tconst binWidth = axisLength / BIN_COUNT;\n\n\t\t\t// If we have fewer triangles than we're planning to split then just check all\n\t\t\t// the triangle positions because it will be faster.\n\t\t\tif ( count < BIN_COUNT / 4 ) {\n\n\t\t\t\t// initialize the bin candidates\n\t\t\t\tconst truncatedBins = [ ...sahBins ];\n\t\t\t\ttruncatedBins.length = count;\n\n\t\t\t\t// set the candidates\n\t\t\t\tlet b = 0;\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6, b ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ b ];\n\t\t\t\t\tbin.candidate = triangleBounds[ c + 2 * a ];\n\t\t\t\t\tbin.count = 0;\n\n\t\t\t\t\tconst {\n\t\t\t\t\t\tbounds,\n\t\t\t\t\t\tleftCacheBounds,\n\t\t\t\t\t\trightCacheBounds,\n\t\t\t\t\t} = bin;\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\t\t\t\t\trightCacheBounds[ d ] = Infinity;\n\t\t\t\t\t\trightCacheBounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t\tleftCacheBounds[ d ] = Infinity;\n\t\t\t\t\t\tleftCacheBounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t\tbounds[ d ] = Infinity;\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t}\n\n\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bounds );\n\n\t\t\t\t}\n\n\t\t\t\ttruncatedBins.sort( binsSort );\n\n\t\t\t\t// remove redundant splits\n\t\t\t\tlet splitCount = count;\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\twhile ( bi + 1 < splitCount && truncatedBins[ bi + 1 ].candidate === bin.candidate ) {\n\n\t\t\t\t\t\ttruncatedBins.splice( bi + 1, 1 );\n\t\t\t\t\t\tsplitCount --;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// find the appropriate bin for each triangle and expand the bounds.\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\n\n\t\t\t\t\tconst center = triangleBounds[ c + 2 * a ];\n\t\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\t\tif ( center >= bin.candidate ) {\n\n\t\t\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.rightCacheBounds );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.leftCacheBounds );\n\t\t\t\t\t\t\tbin.count ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// expand all the bounds\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\tconst leftCount = bin.count;\n\t\t\t\t\tconst rightCount = count - bin.count;\n\n\t\t\t\t\t// check the cost of this split\n\t\t\t\t\tconst leftBounds = bin.leftCacheBounds;\n\t\t\t\t\tconst rightBounds = bin.rightCacheBounds;\n\n\t\t\t\t\tlet leftProb = 0;\n\t\t\t\t\tif ( leftCount !== 0 ) {\n\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet rightProb = 0;\n\t\t\t\t\tif ( rightCount !== 0 ) {\n\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cost = TRAVERSAL_COST + TRIANGLE_INTERSECT_COST * (\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( cost < bestCost ) {\n\n\t\t\t\t\t\taxis = a;\n\t\t\t\t\t\tbestCost = cost;\n\t\t\t\t\t\tpos = bin.candidate;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// reset the bins\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT; i ++ ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tbin.count = 0;\n\t\t\t\t\tbin.candidate = axisLeft + binWidth + i * binWidth;\n\n\t\t\t\t\tconst bounds = bin.bounds;\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\t\t\t\t\tbounds[ d ] = Infinity;\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over all center positions\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\n\n\t\t\t\t\tconst triCenter = triangleBounds[ c + 2 * a ];\n\t\t\t\t\tconst relativeCenter = triCenter - axisLeft;\n\n\t\t\t\t\t// in the partition function if the centroid lies on the split plane then it is\n\t\t\t\t\t// considered to be on the right side of the split\n\t\t\t\t\tlet binIndex = ~ ~ ( relativeCenter / binWidth );\n\t\t\t\t\tif ( binIndex >= BIN_COUNT ) binIndex = BIN_COUNT - 1;\n\n\t\t\t\t\tconst bin = sahBins[ binIndex ];\n\t\t\t\t\tbin.count ++;\n\n\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.bounds );\n\n\t\t\t\t}\n\n\t\t\t\t// cache the unioned bounds from right to left so we don't have to regenerate them each time\n\t\t\t\tconst lastBin = sahBins[ BIN_COUNT - 1 ];\n\t\t\t\tcopyBounds( lastBin.bounds, lastBin.rightCacheBounds );\n\t\t\t\tfor ( let i = BIN_COUNT - 2; i >= 0; i -- ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\n\t\t\t\t\tunionBounds( bin.bounds, nextBin.rightCacheBounds, bin.rightCacheBounds );\n\n\t\t\t\t}\n\n\t\t\t\tlet leftCount = 0;\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT - 1; i ++ ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tconst binCount = bin.count;\n\t\t\t\t\tconst bounds = bin.bounds;\n\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\n\t\t\t\t\tconst rightBounds = nextBin.rightCacheBounds;\n\n\t\t\t\t\t// don't do anything with the bounds if the new bounds have no triangles\n\t\t\t\t\tif ( binCount !== 0 ) {\n\n\t\t\t\t\t\tif ( leftCount === 0 ) {\n\n\t\t\t\t\t\t\tcopyBounds( bounds, leftBounds );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tunionBounds( bounds, leftBounds, leftBounds );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tleftCount += binCount;\n\n\t\t\t\t\t// check the cost of this split\n\t\t\t\t\tlet leftProb = 0;\n\t\t\t\t\tlet rightProb = 0;\n\n\t\t\t\t\tif ( leftCount !== 0 ) {\n\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rightCount = count - leftCount;\n\t\t\t\t\tif ( rightCount !== 0 ) {\n\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cost = TRAVERSAL_COST + TRIANGLE_INTERSECT_COST * (\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( cost < bestCost ) {\n\n\t\t\t\t\t\taxis = a;\n\t\t\t\t\t\tbestCost = cost;\n\t\t\t\t\t\tpos = bin.candidate;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\tconsole.warn( `MeshBVH: Invalid build strategy value ${ strategy } used.` );\n\n\t}\n\n\treturn { axis, pos };\n\n}\n\n// returns the average coordinate on the specified axis of the all the provided triangles\nfunction getAverage( triangleBounds, offset, count, axis ) {\n\n\tlet avg = 0;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tavg += triangleBounds[ i * 6 + axis * 2 ];\n\n\t}\n\n\treturn avg / count;\n\n}\n","import { Box3, Matrix4 } from 'three';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { BOUNDING_DATA_INDEX, COUNT, IS_LEAF, LEFT_NODE, OFFSET, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { PrimitivePool } from '../../utils/PrimitivePool.js';\n\nconst _bufferStack1 = new BufferStack.constructor();\nconst _bufferStack2 = new BufferStack.constructor();\nconst _boxPool = new PrimitivePool( () => new Box3() );\nconst _leftBox1 = new Box3();\nconst _rightBox1 = new Box3();\n\nconst _leftBox2 = new Box3();\nconst _rightBox2 = new Box3();\n\nlet _active = false;\n\nexport function bvhcast( bvh, otherBvh, matrixToLocal, intersectsRanges ) {\n\n\tif ( _active ) {\n\n\t\tthrow new Error( 'MeshBVH: Recursive calls to bvhcast not supported.' );\n\n\t}\n\n\t_active = true;\n\n\tconst roots = bvh._roots;\n\tconst otherRoots = otherBvh._roots;\n\tlet result;\n\tlet offset1 = 0;\n\tlet offset2 = 0;\n\tconst invMat = new Matrix4().copy( matrixToLocal ).invert();\n\n\t// iterate over the first set of roots\n\tfor ( let i = 0, il = roots.length; i < il; i ++ ) {\n\n\t\t_bufferStack1.setBuffer( roots[ i ] );\n\t\toffset2 = 0;\n\n\t\t// prep the initial root box\n\t\tconst localBox = _boxPool.getPrimitive();\n\t\tarrayToBox( BOUNDING_DATA_INDEX( 0 ), _bufferStack1.float32Array, localBox );\n\t\tlocalBox.applyMatrix4( invMat );\n\n\t\t// iterate over the second set of roots\n\t\tfor ( let j = 0, jl = otherRoots.length; j < jl; j ++ ) {\n\n\t\t\t_bufferStack2.setBuffer( otherRoots[ j ] );\n\n\t\t\tresult = _traverse(\n\t\t\t\t0, 0, matrixToLocal, invMat, intersectsRanges,\n\t\t\t\toffset1, offset2, 0, 0,\n\t\t\t\tlocalBox,\n\t\t\t);\n\n\t\t\t_bufferStack2.clearBuffer();\n\t\t\toffset2 += otherRoots[ j ].length;\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// release stack info\n\t\t_boxPool.releasePrimitive( localBox );\n\t\t_bufferStack1.clearBuffer();\n\t\toffset1 += roots[ i ].length;\n\n\t\tif ( result ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t_active = false;\n\treturn result;\n\n}\n\nfunction _traverse(\n\tnode1Index32,\n\tnode2Index32,\n\tmatrix2to1,\n\tmatrix1to2,\n\tintersectsRangesFunc,\n\n\t// offsets for ids\n\tnode1IndexByteOffset = 0,\n\tnode2IndexByteOffset = 0,\n\n\t// tree depth\n\tdepth1 = 0,\n\tdepth2 = 0,\n\n\tcurrBox = null,\n\treversed = false,\n\n) {\n\n\t// get the buffer stacks associated with the current indices\n\tlet bufferStack1, bufferStack2;\n\tif ( reversed ) {\n\n\t\tbufferStack1 = _bufferStack2;\n\t\tbufferStack2 = _bufferStack1;\n\n\t} else {\n\n\t\tbufferStack1 = _bufferStack1;\n\t\tbufferStack2 = _bufferStack2;\n\n\t}\n\n\t// get the local instances of the typed buffers\n\tconst\n\t\tfloat32Array1 = bufferStack1.float32Array,\n\t\tuint32Array1 = bufferStack1.uint32Array,\n\t\tuint16Array1 = bufferStack1.uint16Array,\n\t\tfloat32Array2 = bufferStack2.float32Array,\n\t\tuint32Array2 = bufferStack2.uint32Array,\n\t\tuint16Array2 = bufferStack2.uint16Array;\n\n\tconst node1Index16 = node1Index32 * 2;\n\tconst node2Index16 = node2Index32 * 2;\n\tconst isLeaf1 = IS_LEAF( node1Index16, uint16Array1 );\n\tconst isLeaf2 = IS_LEAF( node2Index16, uint16Array2 );\n\tlet result = false;\n\tif ( isLeaf2 && isLeaf1 ) {\n\n\t\t// if both bounds are leaf nodes then fire the callback if the boxes intersect\n\t\tif ( reversed ) {\n\n\t\t\tresult = intersectsRangesFunc(\n\t\t\t\tOFFSET( node2Index32, uint32Array2 ), COUNT( node2Index32 * 2, uint16Array2 ),\n\t\t\t\tOFFSET( node1Index32, uint32Array1 ), COUNT( node1Index32 * 2, uint16Array1 ),\n\t\t\t\tdepth2, node2IndexByteOffset + node2Index32,\n\t\t\t\tdepth1, node1IndexByteOffset + node1Index32,\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tresult = intersectsRangesFunc(\n\t\t\t\tOFFSET( node1Index32, uint32Array1 ), COUNT( node1Index32 * 2, uint16Array1 ),\n\t\t\t\tOFFSET( node2Index32, uint32Array2 ), COUNT( node2Index32 * 2, uint16Array2 ),\n\t\t\t\tdepth1, node1IndexByteOffset + node1Index32,\n\t\t\t\tdepth2, node2IndexByteOffset + node2Index32,\n\t\t\t);\n\n\t\t}\n\n\t} else if ( isLeaf2 ) {\n\n\t\t// SWAP\n\t\t// If we've traversed to the leaf node on the other bvh then we need to swap over\n\t\t// to traverse down the first one\n\n\t\t// get the new box to use\n\t\tconst newBox = _boxPool.getPrimitive();\n\t\tarrayToBox( BOUNDING_DATA_INDEX( node2Index32 ), float32Array2, newBox );\n\t\tnewBox.applyMatrix4( matrix2to1 );\n\n\t\t// get the child bounds to check before traversal\n\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\tresult = (\n\t\t\tintersectCl1 && _traverse(\n\t\t\t\tnode2Index32, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\tnode2IndexByteOffset, node1IndexByteOffset, depth2, depth1 + 1,\n\t\t\t\tnewBox, ! reversed,\n\t\t\t)\n\t\t) || (\n\t\t\tintersectCr1 && _traverse(\n\t\t\t\tnode2Index32, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\tnode2IndexByteOffset, node1IndexByteOffset, depth2, depth1 + 1,\n\t\t\t\tnewBox, ! reversed,\n\t\t\t)\n\t\t);\n\n\t\t_boxPool.releasePrimitive( newBox );\n\n\t} else {\n\n\t\t// if neither are leaves then we should swap if one of the children does not\n\t\t// intersect with the current bounds\n\n\t\t// get the child bounds to check\n\t\tconst cl2 = LEFT_NODE( node2Index32 );\n\t\tconst cr2 = RIGHT_NODE( node2Index32, uint32Array2 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cl2 ), float32Array2, _leftBox2 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cr2 ), float32Array2, _rightBox2 );\n\n\t\tconst leftIntersects = currBox.intersectsBox( _leftBox2 );\n\t\tconst rightIntersects = currBox.intersectsBox( _rightBox2 );\n\t\tif ( leftIntersects && rightIntersects ) {\n\n\t\t\t// continue to traverse both children if they both intersect\n\t\t\tresult = _traverse(\n\t\t\t\tnode1Index32, cl2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\tnode1IndexByteOffset, node2IndexByteOffset, depth1, depth2 + 1,\n\t\t\t\tcurrBox, reversed,\n\t\t\t) || _traverse(\n\t\t\t\tnode1Index32, cr2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\tnode1IndexByteOffset, node2IndexByteOffset, depth1, depth2 + 1,\n\t\t\t\tcurrBox, reversed,\n\t\t\t);\n\n\t\t} else if ( leftIntersects ) {\n\n\t\t\tif ( isLeaf1 ) {\n\n\t\t\t\t// if the current box is a leaf then just continue\n\t\t\t\tresult = _traverse(\n\t\t\t\t\tnode1Index32, cl2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\t\tnode1IndexByteOffset, node2IndexByteOffset, depth1, depth2 + 1,\n\t\t\t\t\tcurrBox, reversed,\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\t// SWAP\n\t\t\t\t// if only one box intersects then we have to swap to the other bvh to continue\n\t\t\t\tconst newBox = _boxPool.getPrimitive();\n\t\t\t\tnewBox.copy( _leftBox2 ).applyMatrix4( matrix2to1 );\n\n\t\t\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\t\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\t\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\t\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\t\t\tresult = (\n\t\t\t\t\tintersectCl1 && _traverse(\n\t\t\t\t\t\tcl2, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexByteOffset, node1IndexByteOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t) || (\n\t\t\t\t\tintersectCr1 && _traverse(\n\t\t\t\t\t\tcl2, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexByteOffset, node1IndexByteOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t_boxPool.releasePrimitive( newBox );\n\n\t\t\t}\n\n\t\t} else if ( rightIntersects ) {\n\n\t\t\tif ( isLeaf1 ) {\n\n\t\t\t\t// if the current box is a leaf then just continue\n\t\t\t\tresult = _traverse(\n\t\t\t\t\tnode1Index32, cr2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\t\tnode1IndexByteOffset, node2IndexByteOffset, depth1, depth2 + 1,\n\t\t\t\t\tcurrBox, reversed,\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\t// SWAP\n\t\t\t\t// if only one box intersects then we have to swap to the other bvh to continue\n\t\t\t\tconst newBox = _boxPool.getPrimitive();\n\t\t\t\tnewBox.copy( _rightBox2 ).applyMatrix4( matrix2to1 );\n\n\t\t\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\t\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\t\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\t\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\t\t\tresult = (\n\t\t\t\t\tintersectCl1 && _traverse(\n\t\t\t\t\t\tcr2, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexByteOffset, node1IndexByteOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t) || (\n\t\t\t\t\tintersectCr1 && _traverse(\n\t\t\t\t\t\tcr2, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexByteOffset, node1IndexByteOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t_boxPool.releasePrimitive( newBox );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n","import { Matrix4, Vector3 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { getTriCount } from '../build/geometryUtils.js';\nimport { ExtendedTrianglePool } from '../../utils/ExtendedTrianglePool.js';\n\n/*********************************************************************/\n/* This file is generated from \"closestPointToGeometry.template.js\". */\n/*********************************************************************/\n\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\nconst temp1 = /* @__PURE__ */ new Vector3();\nconst temp2 = /* @__PURE__ */ new Vector3();\nconst temp3 = /* @__PURE__ */ new Vector3();\nconst temp4 = /* @__PURE__ */ new Vector3();\n\nfunction closestPointToGeometry(\n\tbvh,\n\totherGeometry,\n\tgeometryToBvh,\n\ttarget1 = { },\n\ttarget2 = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\tif ( ! otherGeometry.boundingBox ) {\n\n\t\totherGeometry.computeBoundingBox();\n\n\t}\n\n\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\tobb.needsUpdate = true;\n\n\tconst geometry = bvh.geometry;\n\tconst pos = geometry.attributes.position;\n\tconst index = geometry.index;\n\tconst otherPos = otherGeometry.attributes.position;\n\tconst otherIndex = otherGeometry.index;\n\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\n\tlet tempTarget1 = temp1;\n\tlet tempTargetDest1 = temp2;\n\tlet tempTarget2 = null;\n\tlet tempTargetDest2 = null;\n\n\tif ( target2 ) {\n\n\t\ttempTarget2 = temp3;\n\t\ttempTargetDest2 = temp4;\n\n\t}\n\n\tlet closestDistance = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tlet closestDistanceOtherTriIndex = null;\n\ttempMatrix.copy( geometryToBvh ).invert();\n\tobb2.matrix.copy( tempMatrix );\n\tbvh.shapecast(\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\treturn obb.distanceToBox( box );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\n\n\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\n\t\t\t\t\t// save the bounds to use during triangle checks.\n\t\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t\tobb2.min.copy( box.min );\n\t\t\t\t\t\tobb2.max.copy( box.max );\n\t\t\t\t\t\tobb2.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\tintersectsRange: ( offset, count ) => {\n\n\t\t\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\n\t\t\t\t\t// the closest bounds in the other geometry to check.\n\t\t\t\t\tconst otherBvh = otherGeometry.boundsTree;\n\t\t\t\t\treturn otherBvh.shapecast( {\n\t\t\t\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\n\n\t\t\t\t\t\t\tfor ( let i2 = otherOffset, l2 = otherOffset + otherCount; i2 < l2; i2 ++ ) {\n\n\n\t\t\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\n\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle, 3 * i, index, pos );\n\n\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\n\t\t\t\t\tconst triCount = getTriCount( otherGeometry );\n\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\n\t\t\t\t\t\t\tsetTriangle( triangle, 3 * i, index, pos );\n\n\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tExtendedTrianglePool.releasePrimitive( triangle );\n\tExtendedTrianglePool.releasePrimitive( triangle2 );\n\n\tif ( closestDistance === Infinity ) {\n\n\t\treturn null;\n\n\t}\n\n\tif ( ! target1.point ) {\n\n\t\ttarget1.point = tempTargetDest1.clone();\n\n\t} else {\n\n\t\ttarget1.point.copy( tempTargetDest1 );\n\n\t}\n\n\ttarget1.distance = closestDistance,\n\ttarget1.faceIndex = closestDistanceTriIndex;\n\n\tif ( target2 ) {\n\n\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\n\t\telse target2.point.copy( tempTargetDest2 );\n\t\ttarget2.point.applyMatrix4( tempMatrix );\n\t\ttempTargetDest1.applyMatrix4( tempMatrix );\n\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\n\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\n\n\t}\n\n\treturn target1;\n\n}\n\nexport { closestPointToGeometry };\n","import { Matrix4, Vector3 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { getTriCount } from '../build/geometryUtils.js';\nimport { ExtendedTrianglePool } from '../../utils/ExtendedTrianglePool.js';\n\n/*********************************************************************/\n/* This file is generated from \"closestPointToGeometry.template.js\". */\n/*********************************************************************/\n\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\nconst temp1 = /* @__PURE__ */ new Vector3();\nconst temp2 = /* @__PURE__ */ new Vector3();\nconst temp3 = /* @__PURE__ */ new Vector3();\nconst temp4 = /* @__PURE__ */ new Vector3();\n\nfunction closestPointToGeometry_indirect(\n\tbvh,\n\totherGeometry,\n\tgeometryToBvh,\n\ttarget1 = { },\n\ttarget2 = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\tif ( ! otherGeometry.boundingBox ) {\n\n\t\totherGeometry.computeBoundingBox();\n\n\t}\n\n\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\tobb.needsUpdate = true;\n\n\tconst geometry = bvh.geometry;\n\tconst pos = geometry.attributes.position;\n\tconst index = geometry.index;\n\tconst otherPos = otherGeometry.attributes.position;\n\tconst otherIndex = otherGeometry.index;\n\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\n\tlet tempTarget1 = temp1;\n\tlet tempTargetDest1 = temp2;\n\tlet tempTarget2 = null;\n\tlet tempTargetDest2 = null;\n\n\tif ( target2 ) {\n\n\t\ttempTarget2 = temp3;\n\t\ttempTargetDest2 = temp4;\n\n\t}\n\n\tlet closestDistance = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tlet closestDistanceOtherTriIndex = null;\n\ttempMatrix.copy( geometryToBvh ).invert();\n\tobb2.matrix.copy( tempMatrix );\n\tbvh.shapecast(\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\treturn obb.distanceToBox( box );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\n\n\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\n\t\t\t\t\t// save the bounds to use during triangle checks.\n\t\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t\tobb2.min.copy( box.min );\n\t\t\t\t\t\tobb2.max.copy( box.max );\n\t\t\t\t\t\tobb2.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\tintersectsRange: ( offset, count ) => {\n\n\t\t\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\n\t\t\t\t\t// the closest bounds in the other geometry to check.\n\t\t\t\t\tconst otherBvh = otherGeometry.boundsTree;\n\t\t\t\t\treturn otherBvh.shapecast( {\n\t\t\t\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\n\n\t\t\t\t\t\t\tfor ( let i2 = otherOffset, l2 = otherOffset + otherCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\t\t\tconst ti2 = otherBvh.resolveTriangleIndex( i2 );\n\t\t\t\t\t\t\t\tsetTriangle( triangle2, 3 * ti2, otherIndex, otherPos );\n\n\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle, 3 * ti, index, pos );\n\n\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\n\t\t\t\t\tconst triCount = getTriCount( otherGeometry );\n\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\t\t\t\tsetTriangle( triangle, 3 * ti, index, pos );\n\n\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tExtendedTrianglePool.releasePrimitive( triangle );\n\tExtendedTrianglePool.releasePrimitive( triangle2 );\n\n\tif ( closestDistance === Infinity ) {\n\n\t\treturn null;\n\n\t}\n\n\tif ( ! target1.point ) {\n\n\t\ttarget1.point = tempTargetDest1.clone();\n\n\t} else {\n\n\t\ttarget1.point.copy( tempTargetDest1 );\n\n\t}\n\n\ttarget1.distance = closestDistance,\n\ttarget1.faceIndex = closestDistanceTriIndex;\n\n\tif ( target2 ) {\n\n\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\n\t\telse target2.point.copy( tempTargetDest2 );\n\t\ttarget2.point.applyMatrix4( tempMatrix );\n\t\ttempTargetDest1.applyMatrix4( tempMatrix );\n\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\n\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\n\n\t}\n\n\treturn target1;\n\n}\n\nexport { closestPointToGeometry_indirect };\n","import { Vector3 } from 'three';\n\nconst temp = /* @__PURE__ */ new Vector3();\nconst temp1 = /* @__PURE__ */ new Vector3();\n\nexport function closestPointToPoint(\n\tbvh,\n\tpoint,\n\ttarget = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\t// early out if under minThreshold\n\t// skip checking if over maxThreshold\n\t// set minThreshold = maxThreshold to quickly check if a point is within a threshold\n\t// returns Infinity if no value found\n\tconst minThresholdSq = minThreshold * minThreshold;\n\tconst maxThresholdSq = maxThreshold * maxThreshold;\n\tlet closestDistanceSq = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tbvh.shapecast(\n\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\ttemp.copy( point ).clamp( box.min, box.max );\n\t\t\t\treturn temp.distanceToSquared( point );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\treturn score < closestDistanceSq && score < maxThresholdSq;\n\n\t\t\t},\n\n\t\t\tintersectsTriangle: ( tri, triIndex ) => {\n\n\t\t\t\ttri.closestPointToPoint( point, temp );\n\t\t\t\tconst distSq = point.distanceToSquared( temp );\n\t\t\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\t\t\ttemp1.copy( temp );\n\t\t\t\t\tclosestDistanceSq = distSq;\n\t\t\t\t\tclosestDistanceTriIndex = triIndex;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distSq < minThresholdSq ) {\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tif ( closestDistanceSq === Infinity ) return null;\n\n\tconst closestDistance = Math.sqrt( closestDistanceSq );\n\n\tif ( ! target.point ) target.point = temp1.clone();\n\telse target.point.copy( temp1 );\n\ttarget.distance = closestDistance,\n\ttarget.faceIndex = closestDistanceTriIndex;\n\n\treturn target;\n\n}\n","import { Box3, Matrix4 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { ExtendedTriangle } from '../../math/ExtendedTriangle.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, OFFSET, COUNT, BOUNDING_DATA_INDEX } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\n\n/*****************************************************************/\n/* This file is generated from \"intersectsGeometry.template.js\". */\n/*****************************************************************/\n/* eslint-disable indent */\n\nconst boundingBox = /* @__PURE__ */ new Box3();\nconst triangle = /* @__PURE__ */ new ExtendedTriangle();\nconst triangle2 = /* @__PURE__ */ new ExtendedTriangle();\nconst invertedMat = /* @__PURE__ */ new Matrix4();\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\n\nfunction intersectsGeometry( bvh, root, otherGeometry, geometryToBvh ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _intersectsGeometry( 0, bvh, otherGeometry, geometryToBvh );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _intersectsGeometry( nodeIndex32, bvh, otherGeometry, geometryToBvh, cachedObb = null ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tif ( cachedObb === null ) {\n\n\t\tif ( ! otherGeometry.boundingBox ) {\n\n\t\t\totherGeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\t\tcachedObb = obb;\n\n\t}\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst thisGeometry = bvh.geometry;\n\t\tconst thisIndex = thisGeometry.index;\n\t\tconst thisPos = thisGeometry.attributes.position;\n\n\t\tconst index = otherGeometry.index;\n\t\tconst pos = otherGeometry.attributes.position;\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\n\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\n\t\t// here.\n\t\tinvertedMat.copy( geometryToBvh ).invert();\n\n\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t// if there's a bounds tree\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\n\t\t\tobb2.matrix.copy( invertedMat );\n\t\t\tobb2.needsUpdate = true;\n\n\t\t\t// TODO: use a triangle iteration function here\n\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\n\n\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\n\n\t\t\t\tintersectsTriangle: tri => {\n\n\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.needsUpdate = true;\n\n\n\t\t\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\n\n\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\t\t\tsetTriangle( triangle2, i, thisIndex, thisPos );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\t// if we're just dealing with raw geometry\n\n\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\n\n\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\tsetTriangle( triangle, i, thisIndex, thisPos );\n\n\n\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\tfor ( let i2 = 0, l2 = index.count; i2 < l2; i2 += 3 ) {\n\n\t\t\t\t\tsetTriangle( triangle2, i2, index, pos );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = nodeIndex32 + 8;\n\t\tconst right = uint32Array[ nodeIndex32 + 6 ];\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\n\t\tconst leftIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( left, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( leftIntersection ) return true;\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\n\t\tconst rightIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( right, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( rightIntersection ) return true;\n\n\t\treturn false;\n\n\t}\n\n}\n\nexport { intersectsGeometry };\n","import { Box3, Matrix4 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { ExtendedTriangle } from '../../math/ExtendedTriangle.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, OFFSET, COUNT, BOUNDING_DATA_INDEX } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\n\n/*****************************************************************/\n/* This file is generated from \"intersectsGeometry.template.js\". */\n/*****************************************************************/\n/* eslint-disable indent */\n\nconst boundingBox = /* @__PURE__ */ new Box3();\nconst triangle = /* @__PURE__ */ new ExtendedTriangle();\nconst triangle2 = /* @__PURE__ */ new ExtendedTriangle();\nconst invertedMat = /* @__PURE__ */ new Matrix4();\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\n\nfunction intersectsGeometry_indirect( bvh, root, otherGeometry, geometryToBvh ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _intersectsGeometry( 0, bvh, otherGeometry, geometryToBvh );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _intersectsGeometry( nodeIndex32, bvh, otherGeometry, geometryToBvh, cachedObb = null ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tif ( cachedObb === null ) {\n\n\t\tif ( ! otherGeometry.boundingBox ) {\n\n\t\t\totherGeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\t\tcachedObb = obb;\n\n\t}\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst thisGeometry = bvh.geometry;\n\t\tconst thisIndex = thisGeometry.index;\n\t\tconst thisPos = thisGeometry.attributes.position;\n\n\t\tconst index = otherGeometry.index;\n\t\tconst pos = otherGeometry.attributes.position;\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\n\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\n\t\t// here.\n\t\tinvertedMat.copy( geometryToBvh ).invert();\n\n\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t// if there's a bounds tree\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\n\t\t\tobb2.matrix.copy( invertedMat );\n\t\t\tobb2.needsUpdate = true;\n\n\t\t\t// TODO: use a triangle iteration function here\n\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\n\n\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\n\n\t\t\t\tintersectsTriangle: tri => {\n\n\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.needsUpdate = true;\n\n\t\t\t\t\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * bvh.resolveTriangleIndex( i ), thisIndex, thisPos );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\t// if we're just dealing with raw geometry\n\t\t\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\tsetTriangle( triangle, 3 * ti, thisIndex, thisPos );\n\n\n\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\tfor ( let i2 = 0, l2 = index.count; i2 < l2; i2 += 3 ) {\n\n\t\t\t\t\tsetTriangle( triangle2, i2, index, pos );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = nodeIndex32 + 8;\n\t\tconst right = uint32Array[ nodeIndex32 + 6 ];\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\n\t\tconst leftIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( left, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( leftIntersection ) return true;\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\n\t\tconst rightIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( right, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( rightIntersection ) return true;\n\n\t\treturn false;\n\n\t}\n\n}\n\nexport { intersectsGeometry_indirect };\n","import { intersectRay } from '../utils/intersectUtils.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectTris } from '../utils/iterationUtils.generated.js';\nimport '../utils/iterationUtils_indirect.generated.js';\n\n/******************************************************/\n/* This file is generated from \"raycast.template.js\". */\n/******************************************************/\n\nfunction raycast( bvh, root, side, ray, intersects, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\t_raycast( 0, bvh, side, ray, intersects, near, far );\n\tBufferStack.clearBuffer();\n\n}\n\nfunction _raycast( nodeIndex32, bvh, side, ray, intersects, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tconst nodeIndex16 = nodeIndex32 * 2;\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\n\t\tintersectTris( bvh, side, ray, offset, count, intersects, near, far );\n\n\n\t} else {\n\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\n\t\tif ( intersectRay( leftIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( leftIndex, bvh, side, ray, intersects, near, far );\n\n\t\t}\n\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tif ( intersectRay( rightIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( rightIndex, bvh, side, ray, intersects, near, far );\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycast };\n","import { IS_LEAF, OFFSET, COUNT, SPLIT_AXIS, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectRay } from '../utils/intersectUtils.js';\nimport { intersectClosestTri } from '../utils/iterationUtils.generated.js';\nimport '../utils/iterationUtils_indirect.generated.js';\n\n/***********************************************************/\n/* This file is generated from \"raycastFirst.template.js\". */\n/***********************************************************/\n\nconst _xyzFields = [ 'x', 'y', 'z' ];\n\nfunction raycastFirst( bvh, root, side, ray, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _raycastFirst( 0, bvh, side, ray, near, far );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _raycastFirst( nodeIndex32, bvh, side, ray, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\n\t\t// eslint-disable-next-line no-unreachable\n\t\treturn intersectClosestTri( bvh, side, ray, offset, count, near, far );\n\n\n\t} else {\n\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\t\tconst xyzAxis = _xyzFields[ splitAxis ];\n\t\tconst rayDir = ray.direction[ xyzAxis ];\n\t\tconst leftToRight = rayDir >= 0;\n\n\t\t// c1 is the child to check first\n\t\tlet c1, c2;\n\t\tif ( leftToRight ) {\n\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t} else {\n\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\n\n\t\t}\n\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, near, far );\n\t\tconst c1Result = c1Intersection ? _raycastFirst( c1, bvh, side, ray, near, far ) : null;\n\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\n\t\tif ( c1Result ) {\n\n\t\t\t// check if the point is within the second bounds\n\t\t\t// \"point\" is in the local frame of the bvh\n\t\t\tconst point = c1Result.point[ xyzAxis ];\n\t\t\tconst isOutside = leftToRight ?\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\n\n\t\t\tif ( isOutside ) {\n\n\t\t\t\treturn c1Result;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// either there was no intersection in the first node, or there could still be a closer\n\t\t// intersection in the second, so check the second node and then take the better of the two\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, near, far );\n\t\tconst c2Result = c2Intersection ? _raycastFirst( c2, bvh, side, ray, near, far ) : null;\n\n\t\tif ( c1Result && c2Result ) {\n\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\n\n\t\t} else {\n\n\t\t\treturn c1Result || c2Result || null;\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycastFirst };\n","import { IS_LEAF, OFFSET, COUNT, SPLIT_AXIS, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectRay } from '../utils/intersectUtils.js';\nimport '../utils/iterationUtils.generated.js';\nimport { intersectClosestTri_indirect } from '../utils/iterationUtils_indirect.generated.js';\n\n/***********************************************************/\n/* This file is generated from \"raycastFirst.template.js\". */\n/***********************************************************/\n\nconst _xyzFields = [ 'x', 'y', 'z' ];\n\nfunction raycastFirst_indirect( bvh, root, side, ray, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _raycastFirst( 0, bvh, side, ray, near, far );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _raycastFirst( nodeIndex32, bvh, side, ray, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\treturn intersectClosestTri_indirect( bvh, side, ray, offset, count, near, far );\n\n\n\t} else {\n\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\t\tconst xyzAxis = _xyzFields[ splitAxis ];\n\t\tconst rayDir = ray.direction[ xyzAxis ];\n\t\tconst leftToRight = rayDir >= 0;\n\n\t\t// c1 is the child to check first\n\t\tlet c1, c2;\n\t\tif ( leftToRight ) {\n\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t} else {\n\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\n\n\t\t}\n\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, near, far );\n\t\tconst c1Result = c1Intersection ? _raycastFirst( c1, bvh, side, ray, near, far ) : null;\n\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\n\t\tif ( c1Result ) {\n\n\t\t\t// check if the point is within the second bounds\n\t\t\t// \"point\" is in the local frame of the bvh\n\t\t\tconst point = c1Result.point[ xyzAxis ];\n\t\t\tconst isOutside = leftToRight ?\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\n\n\t\t\tif ( isOutside ) {\n\n\t\t\t\treturn c1Result;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// either there was no intersection in the first node, or there could still be a closer\n\t\t// intersection in the second, so check the second node and then take the better of the two\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, near, far );\n\t\tconst c2Result = c2Intersection ? _raycastFirst( c2, bvh, side, ray, near, far ) : null;\n\n\t\tif ( c1Result && c2Result ) {\n\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\n\n\t\t} else {\n\n\t\t\treturn c1Result || c2Result || null;\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycastFirst_indirect };\n","import { intersectRay } from '../utils/intersectUtils.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport '../utils/iterationUtils.generated.js';\nimport { intersectTris_indirect } from '../utils/iterationUtils_indirect.generated.js';\n\n/******************************************************/\n/* This file is generated from \"raycast.template.js\". */\n/******************************************************/\n\nfunction raycast_indirect( bvh, root, side, ray, intersects, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\t_raycast( 0, bvh, side, ray, intersects, near, far );\n\tBufferStack.clearBuffer();\n\n}\n\nfunction _raycast( nodeIndex32, bvh, side, ray, intersects, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tconst nodeIndex16 = nodeIndex32 * 2;\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\tintersectTris_indirect( bvh, side, ray, offset, count, intersects, near, far );\n\n\n\t} else {\n\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\n\t\tif ( intersectRay( leftIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( leftIndex, bvh, side, ray, intersects, near, far );\n\n\t\t}\n\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tif ( intersectRay( rightIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( rightIndex, bvh, side, ray, intersects, near, far );\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycast_indirect };\n","import { IS_LEAFNODE_FLAG } from '../Constants.js';\n\n/****************************************************/\n/* This file is generated from \"refit.template.js\". */\n/****************************************************/\n\nfunction refit( bvh, nodeIndices = null ) {\n\n\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\tnodeIndices = new Set( nodeIndices );\n\n\t}\n\n\tconst geometry = bvh.geometry;\n\tconst indexArr = geometry.index ? geometry.index.array : null;\n\tconst posAttr = geometry.attributes.position;\n\n\tlet buffer, uint32Array, uint16Array, float32Array;\n\tlet byteOffset = 0;\n\tconst roots = bvh._roots;\n\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\tbuffer = roots[ i ];\n\t\tuint32Array = new Uint32Array( buffer );\n\t\tuint16Array = new Uint16Array( buffer );\n\t\tfloat32Array = new Float32Array( buffer );\n\n\t\t_traverse( 0, byteOffset );\n\t\tbyteOffset += buffer.byteLength;\n\n\t}\n\n\tfunction _traverse( node32Index, byteOffset, force = false ) {\n\n\t\tconst node16Index = node32Index * 2;\n\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\n\t\tif ( isLeaf ) {\n\n\t\t\tconst offset = uint32Array[ node32Index + 6 ];\n\t\t\tconst count = uint16Array[ node16Index + 14 ];\n\n\t\t\tlet minx = Infinity;\n\t\t\tlet miny = Infinity;\n\t\t\tlet minz = Infinity;\n\t\t\tlet maxx = - Infinity;\n\t\t\tlet maxy = - Infinity;\n\t\t\tlet maxz = - Infinity;\n\n\n\t\t\tfor ( let i = 3 * offset, l = 3 * ( offset + count ); i < l; i ++ ) {\n\n\t\t\t\tlet index = indexArr[ i ];\n\t\t\t\tconst x = posAttr.getX( index );\n\t\t\t\tconst y = posAttr.getY( index );\n\t\t\t\tconst z = posAttr.getZ( index );\n\n\t\t\t\tif ( x < minx ) minx = x;\n\t\t\t\tif ( x > maxx ) maxx = x;\n\n\t\t\t\tif ( y < miny ) miny = y;\n\t\t\t\tif ( y > maxy ) maxy = y;\n\n\t\t\t\tif ( z < minz ) minz = z;\n\t\t\t\tif ( z > maxz ) maxz = z;\n\n\t\t\t}\n\n\n\t\t\tif (\n\t\t\t\tfloat32Array[ node32Index + 0 ] !== minx ||\n\t\t\t\tfloat32Array[ node32Index + 1 ] !== miny ||\n\t\t\t\tfloat32Array[ node32Index + 2 ] !== minz ||\n\n\t\t\t\tfloat32Array[ node32Index + 3 ] !== maxx ||\n\t\t\t\tfloat32Array[ node32Index + 4 ] !== maxy ||\n\t\t\t\tfloat32Array[ node32Index + 5 ] !== maxz\n\t\t\t) {\n\n\t\t\t\tfloat32Array[ node32Index + 0 ] = minx;\n\t\t\t\tfloat32Array[ node32Index + 1 ] = miny;\n\t\t\t\tfloat32Array[ node32Index + 2 ] = minz;\n\n\t\t\t\tfloat32Array[ node32Index + 3 ] = maxx;\n\t\t\t\tfloat32Array[ node32Index + 4 ] = maxy;\n\t\t\t\tfloat32Array[ node32Index + 5 ] = maxz;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst left = node32Index + 8;\n\t\t\tconst right = uint32Array[ node32Index + 6 ];\n\n\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\n\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\n\t\t\tconst offsetLeft = left + byteOffset;\n\t\t\tconst offsetRight = right + byteOffset;\n\t\t\tlet forceChildren = force;\n\t\t\tlet includesLeft = false;\n\t\t\tlet includesRight = false;\n\n\t\t\tif ( nodeIndices ) {\n\n\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\n\t\t\t\t// then we assume that all children need to be updated.\n\t\t\t\tif ( ! forceChildren ) {\n\n\t\t\t\t\tincludesLeft = nodeIndices.has( offsetLeft );\n\t\t\t\t\tincludesRight = nodeIndices.has( offsetRight );\n\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tincludesLeft = true;\n\t\t\t\tincludesRight = true;\n\n\t\t\t}\n\n\t\t\tconst traverseLeft = forceChildren || includesLeft;\n\t\t\tconst traverseRight = forceChildren || includesRight;\n\n\t\t\tlet leftChange = false;\n\t\t\tif ( traverseLeft ) {\n\n\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tlet rightChange = false;\n\t\t\tif ( traverseRight ) {\n\n\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tconst didChange = leftChange || rightChange;\n\t\t\tif ( didChange ) {\n\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\tconst lefti = left + i;\n\t\t\t\t\tconst righti = right + i;\n\t\t\t\t\tconst minLeftValue = float32Array[ lefti ];\n\t\t\t\t\tconst maxLeftValue = float32Array[ lefti + 3 ];\n\t\t\t\t\tconst minRightValue = float32Array[ righti ];\n\t\t\t\t\tconst maxRightValue = float32Array[ righti + 3 ];\n\n\t\t\t\t\tfloat32Array[ node32Index + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\n\t\t\t\t\tfloat32Array[ node32Index + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn didChange;\n\n\t\t}\n\n\t}\n\n}\n\nexport { refit };\n","import { IS_LEAFNODE_FLAG } from '../Constants.js';\n\n/****************************************************/\n/* This file is generated from \"refit.template.js\". */\n/****************************************************/\n\nfunction refit_indirect( bvh, nodeIndices = null ) {\n\n\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\tnodeIndices = new Set( nodeIndices );\n\n\t}\n\n\tconst geometry = bvh.geometry;\n\tconst indexArr = geometry.index ? geometry.index.array : null;\n\tconst posAttr = geometry.attributes.position;\n\n\tlet buffer, uint32Array, uint16Array, float32Array;\n\tlet byteOffset = 0;\n\tconst roots = bvh._roots;\n\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\tbuffer = roots[ i ];\n\t\tuint32Array = new Uint32Array( buffer );\n\t\tuint16Array = new Uint16Array( buffer );\n\t\tfloat32Array = new Float32Array( buffer );\n\n\t\t_traverse( 0, byteOffset );\n\t\tbyteOffset += buffer.byteLength;\n\n\t}\n\n\tfunction _traverse( node32Index, byteOffset, force = false ) {\n\n\t\tconst node16Index = node32Index * 2;\n\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\n\t\tif ( isLeaf ) {\n\n\t\t\tconst offset = uint32Array[ node32Index + 6 ];\n\t\t\tconst count = uint16Array[ node16Index + 14 ];\n\n\t\t\tlet minx = Infinity;\n\t\t\tlet miny = Infinity;\n\t\t\tlet minz = Infinity;\n\t\t\tlet maxx = - Infinity;\n\t\t\tlet maxy = - Infinity;\n\t\t\tlet maxz = - Infinity;\n\n\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\tconst t = 3 * bvh.resolveTriangleIndex( i );\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tlet index = t + j;\n\t\t\t\t\tindex = indexArr ? indexArr[ index ] : index;\n\n\t\t\t\t\tconst x = posAttr.getX( index );\n\t\t\t\t\tconst y = posAttr.getY( index );\n\t\t\t\t\tconst z = posAttr.getZ( index );\n\n\t\t\t\t\tif ( x < minx ) minx = x;\n\t\t\t\t\tif ( x > maxx ) maxx = x;\n\n\t\t\t\t\tif ( y < miny ) miny = y;\n\t\t\t\t\tif ( y > maxy ) maxy = y;\n\n\t\t\t\t\tif ( z < minz ) minz = z;\n\t\t\t\t\tif ( z > maxz ) maxz = z;\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tif (\n\t\t\t\tfloat32Array[ node32Index + 0 ] !== minx ||\n\t\t\t\tfloat32Array[ node32Index + 1 ] !== miny ||\n\t\t\t\tfloat32Array[ node32Index + 2 ] !== minz ||\n\n\t\t\t\tfloat32Array[ node32Index + 3 ] !== maxx ||\n\t\t\t\tfloat32Array[ node32Index + 4 ] !== maxy ||\n\t\t\t\tfloat32Array[ node32Index + 5 ] !== maxz\n\t\t\t) {\n\n\t\t\t\tfloat32Array[ node32Index + 0 ] = minx;\n\t\t\t\tfloat32Array[ node32Index + 1 ] = miny;\n\t\t\t\tfloat32Array[ node32Index + 2 ] = minz;\n\n\t\t\t\tfloat32Array[ node32Index + 3 ] = maxx;\n\t\t\t\tfloat32Array[ node32Index + 4 ] = maxy;\n\t\t\t\tfloat32Array[ node32Index + 5 ] = maxz;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst left = node32Index + 8;\n\t\t\tconst right = uint32Array[ node32Index + 6 ];\n\n\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\n\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\n\t\t\tconst offsetLeft = left + byteOffset;\n\t\t\tconst offsetRight = right + byteOffset;\n\t\t\tlet forceChildren = force;\n\t\t\tlet includesLeft = false;\n\t\t\tlet includesRight = false;\n\n\t\t\tif ( nodeIndices ) {\n\n\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\n\t\t\t\t// then we assume that all children need to be updated.\n\t\t\t\tif ( ! forceChildren ) {\n\n\t\t\t\t\tincludesLeft = nodeIndices.has( offsetLeft );\n\t\t\t\t\tincludesRight = nodeIndices.has( offsetRight );\n\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tincludesLeft = true;\n\t\t\t\tincludesRight = true;\n\n\t\t\t}\n\n\t\t\tconst traverseLeft = forceChildren || includesLeft;\n\t\t\tconst traverseRight = forceChildren || includesRight;\n\n\t\t\tlet leftChange = false;\n\t\t\tif ( traverseLeft ) {\n\n\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tlet rightChange = false;\n\t\t\tif ( traverseRight ) {\n\n\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tconst didChange = leftChange || rightChange;\n\t\t\tif ( didChange ) {\n\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\tconst lefti = left + i;\n\t\t\t\t\tconst righti = right + i;\n\t\t\t\t\tconst minLeftValue = float32Array[ lefti ];\n\t\t\t\t\tconst maxLeftValue = float32Array[ lefti + 3 ];\n\t\t\t\t\tconst minRightValue = float32Array[ righti ];\n\t\t\t\t\tconst maxRightValue = float32Array[ righti + 3 ];\n\n\t\t\t\t\tfloat32Array[ node32Index + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\n\t\t\t\t\tfloat32Array[ node32Index + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn didChange;\n\n\t\t}\n\n\t}\n\n}\n\nexport { refit_indirect };\n","import { Box3 } from 'three';\nimport { CONTAINED } from '../Constants.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { PrimitivePool } from '../../utils/PrimitivePool.js';\nimport { COUNT, OFFSET, LEFT_NODE, RIGHT_NODE, IS_LEAF, BOUNDING_DATA_INDEX } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\n\nlet _box1, _box2;\nconst boxStack = [];\nconst boxPool = /* @__PURE__ */ new PrimitivePool( () => new Box3() );\n\nexport function shapecast( bvh, root, intersectsBounds, intersectsRange, boundsTraverseOrder, byteOffset ) {\n\n\t// setup\n\t_box1 = boxPool.getPrimitive();\n\t_box2 = boxPool.getPrimitive();\n\tboxStack.push( _box1, _box2 );\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\n\tconst result = shapecastTraverse( 0, bvh.geometry, intersectsBounds, intersectsRange, boundsTraverseOrder, byteOffset );\n\n\t// cleanup\n\tBufferStack.clearBuffer();\n\tboxPool.releasePrimitive( _box1 );\n\tboxPool.releasePrimitive( _box2 );\n\tboxStack.pop();\n\tboxStack.pop();\n\n\tconst length = boxStack.length;\n\tif ( length > 0 ) {\n\n\t\t_box2 = boxStack[ length - 1 ];\n\t\t_box1 = boxStack[ length - 2 ];\n\n\t}\n\n\treturn result;\n\n}\n\nfunction shapecastTraverse(\n\tnodeIndex32,\n\tgeometry,\n\tintersectsBoundsFunc,\n\tintersectsRangeFunc,\n\tnodeScoreFunc = null,\n\tnodeIndexByteOffset = 0, // offset for unique node identifier\n\tdepth = 0\n) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, _box1 );\n\t\treturn intersectsRangeFunc( offset, count, false, depth, nodeIndexByteOffset + nodeIndex32, _box1 );\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tlet c1 = left;\n\t\tlet c2 = right;\n\n\t\tlet score1, score2;\n\t\tlet box1, box2;\n\t\tif ( nodeScoreFunc ) {\n\n\t\t\tbox1 = _box1;\n\t\t\tbox2 = _box2;\n\n\t\t\t// bounding data is not offset\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\n\n\t\t\tscore1 = nodeScoreFunc( box1 );\n\t\t\tscore2 = nodeScoreFunc( box2 );\n\n\t\t\tif ( score2 < score1 ) {\n\n\t\t\t\tc1 = right;\n\t\t\t\tc2 = left;\n\n\t\t\t\tconst temp = score1;\n\t\t\t\tscore1 = score2;\n\t\t\t\tscore2 = temp;\n\n\t\t\t\tbox1 = box2;\n\t\t\t\t// box2 is always set before use below\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Check box 1 intersection\n\t\tif ( ! box1 ) {\n\n\t\t\tbox1 = _box1;\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\n\n\t\t}\n\n\t\tconst isC1Leaf = IS_LEAF( c1 * 2, uint16Array );\n\t\tconst c1Intersection = intersectsBoundsFunc( box1, isC1Leaf, score1, depth + 1, nodeIndexByteOffset + c1 );\n\n\t\tlet c1StopTraversal;\n\t\tif ( c1Intersection === CONTAINED ) {\n\n\t\t\tconst offset = getLeftOffset( c1 );\n\t\t\tconst end = getRightEndOffset( c1 );\n\t\t\tconst count = end - offset;\n\n\t\t\tc1StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c1, box1 );\n\n\t\t} else {\n\n\t\t\tc1StopTraversal =\n\t\t\t\tc1Intersection &&\n\t\t\t\tshapecastTraverse(\n\t\t\t\t\tc1,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tintersectsBoundsFunc,\n\t\t\t\t\tintersectsRangeFunc,\n\t\t\t\t\tnodeScoreFunc,\n\t\t\t\t\tnodeIndexByteOffset,\n\t\t\t\t\tdepth + 1\n\t\t\t\t);\n\n\t\t}\n\n\t\tif ( c1StopTraversal ) return true;\n\n\t\t// Check box 2 intersection\n\t\t// cached box2 will have been overwritten by previous traversal\n\t\tbox2 = _box2;\n\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\n\n\t\tconst isC2Leaf = IS_LEAF( c2 * 2, uint16Array );\n\t\tconst c2Intersection = intersectsBoundsFunc( box2, isC2Leaf, score2, depth + 1, nodeIndexByteOffset + c2 );\n\n\t\tlet c2StopTraversal;\n\t\tif ( c2Intersection === CONTAINED ) {\n\n\t\t\tconst offset = getLeftOffset( c2 );\n\t\t\tconst end = getRightEndOffset( c2 );\n\t\t\tconst count = end - offset;\n\n\t\t\tc2StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c2, box2 );\n\n\t\t} else {\n\n\t\t\tc2StopTraversal =\n\t\t\t\tc2Intersection &&\n\t\t\t\tshapecastTraverse(\n\t\t\t\t\tc2,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tintersectsBoundsFunc,\n\t\t\t\t\tintersectsRangeFunc,\n\t\t\t\t\tnodeScoreFunc,\n\t\t\t\t\tnodeIndexByteOffset,\n\t\t\t\t\tdepth + 1\n\t\t\t\t);\n\n\t\t}\n\n\t\tif ( c2StopTraversal ) return true;\n\n\t\treturn false;\n\n\t\t// Define these inside the function so it has access to the local variables needed\n\t\t// when converting to the buffer equivalents\n\t\tfunction getLeftOffset( nodeIndex32 ) {\n\n\t\t\tconst { uint16Array, uint32Array } = BufferStack;\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t// traverse until we find a leaf\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\t\tnodeIndex32 = LEFT_NODE( nodeIndex32 );\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t}\n\n\t\t\treturn OFFSET( nodeIndex32, uint32Array );\n\n\t\t}\n\n\t\tfunction getRightEndOffset( nodeIndex32 ) {\n\n\t\t\tconst { uint16Array, uint32Array } = BufferStack;\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t// traverse until we find a leaf\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\t\t// adjust offset to point to the right node\n\t\t\t\tnodeIndex32 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t}\n\n\t\t\t// return the end offset of the triangle range\n\t\t\treturn OFFSET( nodeIndex32, uint32Array ) + COUNT( nodeIndex16, uint16Array );\n\n\t\t}\n\n\t}\n\n}\n","class _BufferStack {\n\n\tconstructor() {\n\n\t\tthis.float32Array = null;\n\t\tthis.uint16Array = null;\n\t\tthis.uint32Array = null;\n\n\t\tconst stack = [];\n\t\tlet prevBuffer = null;\n\t\tthis.setBuffer = buffer => {\n\n\t\t\tif ( prevBuffer ) {\n\n\t\t\t\tstack.push( prevBuffer );\n\n\t\t\t}\n\n\t\t\tprevBuffer = buffer;\n\t\t\tthis.float32Array = new Float32Array( buffer );\n\t\t\tthis.uint16Array = new Uint16Array( buffer );\n\t\t\tthis.uint32Array = new Uint32Array( buffer );\n\n\t\t};\n\n\t\tthis.clearBuffer = () => {\n\n\t\t\tprevBuffer = null;\n\t\t\tthis.float32Array = null;\n\t\t\tthis.uint16Array = null;\n\t\t\tthis.uint32Array = null;\n\n\t\t\tif ( stack.length !== 0 ) {\n\n\t\t\t\tthis.setBuffer( stack.pop() );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n}\n\nexport const BufferStack = new _BufferStack();\n","/**\n * This function performs intersection tests similar to Ray.intersectBox in three.js,\n * with the difference that the box values are read from an array to improve performance.\n */\nexport function intersectRay( nodeIndex32, array, ray, near, far ) {\n\n\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\tconst invdirx = 1 / ray.direction.x,\n\t\tinvdiry = 1 / ray.direction.y,\n\t\tinvdirz = 1 / ray.direction.z;\n\n\tconst ox = ray.origin.x;\n\tconst oy = ray.origin.y;\n\tconst oz = ray.origin.z;\n\n\tlet minx = array[ nodeIndex32 ];\n\tlet maxx = array[ nodeIndex32 + 3 ];\n\n\tlet miny = array[ nodeIndex32 + 1 ];\n\tlet maxy = array[ nodeIndex32 + 3 + 1 ];\n\n\tlet minz = array[ nodeIndex32 + 2 ];\n\tlet maxz = array[ nodeIndex32 + 3 + 2 ];\n\n\tif ( invdirx >= 0 ) {\n\n\t\ttmin = ( minx - ox ) * invdirx;\n\t\ttmax = ( maxx - ox ) * invdirx;\n\n\t} else {\n\n\t\ttmin = ( maxx - ox ) * invdirx;\n\t\ttmax = ( minx - ox ) * invdirx;\n\n\t}\n\n\tif ( invdiry >= 0 ) {\n\n\t\ttymin = ( miny - oy ) * invdiry;\n\t\ttymax = ( maxy - oy ) * invdiry;\n\n\t} else {\n\n\t\ttymin = ( maxy - oy ) * invdiry;\n\t\ttymax = ( miny - oy ) * invdiry;\n\n\t}\n\n\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return false;\n\n\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\tif ( invdirz >= 0 ) {\n\n\t\ttzmin = ( minz - oz ) * invdirz;\n\t\ttzmax = ( maxz - oz ) * invdirz;\n\n\t} else {\n\n\t\ttzmin = ( maxz - oz ) * invdirz;\n\t\ttzmax = ( minz - oz ) * invdirz;\n\n\t}\n\n\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return false;\n\n\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t//return point closest to the ray (positive side)\n\n\treturn tmin <= far && tmax >= near;\n\n}\n","import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\n\n/*************************************************************/\n/* This file is generated from \"iterationUtils.template.js\". */\n/*************************************************************/\n/* eslint-disable indent */\n\nfunction intersectTris( bvh, side, ray, offset, count, intersections, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\n\t\tintersectTri( geometry, side, ray, i, intersections, near, far );\n\n\n\t}\n\n}\n\nfunction intersectClosestTri( bvh, side, ray, offset, count, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tlet dist = Infinity;\n\tlet res = null;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet intersection;\n\n\t\tintersection = intersectTri( geometry, side, ray, i, null, near, far );\n\n\n\t\tif ( intersection && intersection.distance < dist ) {\n\n\t\t\tres = intersection;\n\t\t\tdist = intersection.distance;\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\nfunction iterateOverTriangles(\n\toffset,\n\tcount,\n\tbvh,\n\tintersectsTriangleFunc,\n\tcontained,\n\tdepth,\n\ttriangle\n) {\n\n\tconst { geometry } = bvh;\n\tconst { index } = geometry;\n\tconst pos = geometry.attributes.position;\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\tlet tri;\n\n\t\ttri = i;\n\n\t\tsetTriangle( triangle, tri * 3, index, pos );\n\t\ttriangle.needsUpdate = true;\n\n\t\tif ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport { intersectClosestTri, intersectTris, iterateOverTriangles };\n","import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\n\n/*************************************************************/\n/* This file is generated from \"iterationUtils.template.js\". */\n/*************************************************************/\n/* eslint-disable indent */\n\nfunction intersectTris_indirect( bvh, side, ray, offset, count, intersections, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet vi = _indirectBuffer ? _indirectBuffer[ i ] : i;\n\t\tintersectTri( geometry, side, ray, vi, intersections, near, far );\n\n\n\t}\n\n}\n\nfunction intersectClosestTri_indirect( bvh, side, ray, offset, count, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tlet dist = Infinity;\n\tlet res = null;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet intersection;\n\t\tintersection = intersectTri( geometry, side, ray, _indirectBuffer ? _indirectBuffer[ i ] : i, null, near, far );\n\n\n\t\tif ( intersection && intersection.distance < dist ) {\n\n\t\t\tres = intersection;\n\t\t\tdist = intersection.distance;\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\nfunction iterateOverTriangles_indirect(\n\toffset,\n\tcount,\n\tbvh,\n\tintersectsTriangleFunc,\n\tcontained,\n\tdepth,\n\ttriangle\n) {\n\n\tconst { geometry } = bvh;\n\tconst { index } = geometry;\n\tconst pos = geometry.attributes.position;\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\tlet tri;\n\t\ttri = bvh.resolveTriangleIndex( i );\n\n\t\tsetTriangle( triangle, tri * 3, index, pos );\n\t\ttriangle.needsUpdate = true;\n\n\t\tif ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport { intersectClosestTri_indirect, intersectTris_indirect, iterateOverTriangles_indirect };\n","export function IS_LEAF( n16, uint16Array ) {\n\n\treturn uint16Array[ n16 + 15 ] === 0xFFFF;\n\n}\n\nexport function OFFSET( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 6 ];\n\n}\n\nexport function COUNT( n16, uint16Array ) {\n\n\treturn uint16Array[ n16 + 14 ];\n\n}\n\nexport function LEFT_NODE( n32 ) {\n\n\treturn n32 + 8;\n\n}\n\nexport function RIGHT_NODE( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 6 ];\n\n}\n\nexport function SPLIT_AXIS( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 7 ];\n\n}\n\nexport function BOUNDING_DATA_INDEX( n32 ) {\n\n\treturn n32;\n\n}\n","import { Triangle, Vector3, Line3, Sphere, Plane } from 'three';\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\nimport { closestPointsSegmentToSegment, sphereIntersectTriangle } from './MathUtilities.js';\n\nconst ZERO_EPSILON = 1e-15;\nfunction isNearZero( value ) {\n\n\treturn Math.abs( value ) < ZERO_EPSILON;\n\n}\n\nexport class ExtendedTriangle extends Triangle {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isExtendedTriangle = true;\n\t\tthis.satAxes = new Array( 4 ).fill().map( () => new Vector3() );\n\t\tthis.satBounds = new Array( 4 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.points = [ this.a, this.b, this.c ];\n\t\tthis.sphere = new Sphere();\n\t\tthis.plane = new Plane();\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphereIntersectTriangle( sphere, this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst a = this.a;\n\t\tconst b = this.b;\n\t\tconst c = this.c;\n\t\tconst points = this.points;\n\n\t\tconst satAxes = this.satAxes;\n\t\tconst satBounds = this.satBounds;\n\n\t\tconst axis0 = satAxes[ 0 ];\n\t\tconst sab0 = satBounds[ 0 ];\n\t\tthis.getNormal( axis0 );\n\t\tsab0.setFromPoints( axis0, points );\n\n\t\tconst axis1 = satAxes[ 1 ];\n\t\tconst sab1 = satBounds[ 1 ];\n\t\taxis1.subVectors( a, b );\n\t\tsab1.setFromPoints( axis1, points );\n\n\t\tconst axis2 = satAxes[ 2 ];\n\t\tconst sab2 = satBounds[ 2 ];\n\t\taxis2.subVectors( b, c );\n\t\tsab2.setFromPoints( axis2, points );\n\n\t\tconst axis3 = satAxes[ 3 ];\n\t\tconst sab3 = satBounds[ 3 ];\n\t\taxis3.subVectors( c, a );\n\t\tsab3.setFromPoints( axis3, points );\n\n\t\tthis.sphere.setFromPoints( this.points );\n\t\tthis.plane.setFromNormalAndCoplanarPoint( axis0, a );\n\t\tthis.needsUpdate = false;\n\n\t}\n\n}\n\nExtendedTriangle.prototype.closestPointToSegment = ( function () {\n\n\tconst point1 = new Vector3();\n\tconst point2 = new Vector3();\n\tconst edge = new Line3();\n\n\treturn function distanceToSegment( segment, target1 = null, target2 = null ) {\n\n\t\tconst { start, end } = segment;\n\t\tconst points = this.points;\n\t\tlet distSq;\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check the triangle edges\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst nexti = ( i + 1 ) % 3;\n\t\t\tedge.start.copy( points[ i ] );\n\t\t\tedge.end.copy( points[ nexti ] );\n\n\t\t\tclosestPointsSegmentToSegment( edge, segment, point1, point2 );\n\n\t\t\tdistSq = point1.distanceToSquared( point2 );\n\t\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = distSq;\n\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check end points\n\t\tthis.closestPointToPoint( start, point1 );\n\t\tdistSq = start.distanceToSquared( point1 );\n\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\tclosestDistanceSq = distSq;\n\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\tif ( target2 ) target2.copy( start );\n\n\t\t}\n\n\t\tthis.closestPointToPoint( end, point1 );\n\t\tdistSq = end.distanceToSquared( point1 );\n\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\tclosestDistanceSq = distSq;\n\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\tif ( target2 ) target2.copy( end );\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n\nExtendedTriangle.prototype.intersectsTriangle = ( function () {\n\n\tconst saTri2 = new ExtendedTriangle();\n\tconst arr1 = new Array( 3 );\n\tconst arr2 = new Array( 3 );\n\tconst cachedSatBounds = new SeparatingAxisBounds();\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\n\tconst cachedAxis = new Vector3();\n\tconst dir = new Vector3();\n\tconst dir1 = new Vector3();\n\tconst dir2 = new Vector3();\n\tconst tempDir = new Vector3();\n\tconst edge = new Line3();\n\tconst edge1 = new Line3();\n\tconst edge2 = new Line3();\n\tconst tempPoint = new Vector3();\n\n\tfunction triIntersectPlane( tri, plane, targetEdge ) {\n\n\t\t// find the edge that intersects the other triangle plane\n\t\tconst points = tri.points;\n\t\tlet count = 0;\n\t\tlet startPointIntersection = - 1;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst { start, end } = edge;\n\t\t\tstart.copy( points[ i ] );\n\t\t\tend.copy( points[ ( i + 1 ) % 3 ] );\n\t\t\tedge.delta( dir );\n\n\t\t\tconst startIntersects = isNearZero( plane.distanceToPoint( start ) );\n\t\t\tif ( isNearZero( plane.normal.dot( dir ) ) && startIntersects ) {\n\n\t\t\t\t// if the edge lies on the plane then take the line\n\t\t\t\ttargetEdge.copy( edge );\n\t\t\t\tcount = 2;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// check if the start point is near the plane because \"intersectLine\" is not robust to that case\n\t\t\tconst doesIntersect = plane.intersectLine( edge, tempPoint );\n\t\t\tif ( ! doesIntersect && startIntersects ) {\n\n\t\t\t\ttempPoint.copy( start );\n\n\t\t\t}\n\n\t\t\t// ignore the end point\n\t\t\tif ( ( doesIntersect || startIntersects ) && ! isNearZero( tempPoint.distanceTo( end ) ) ) {\n\n\t\t\t\tif ( count <= 1 ) {\n\n\t\t\t\t\t// assign to the start or end point and save which index was snapped to\n\t\t\t\t\t// the start point if necessary\n\t\t\t\t\tconst point = count === 1 ? targetEdge.start : targetEdge.end;\n\t\t\t\t\tpoint.copy( tempPoint );\n\t\t\t\t\tif ( startIntersects ) {\n\n\t\t\t\t\t\tstartPointIntersection = count;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( count >= 2 ) {\n\n\t\t\t\t\t// if we're here that means that there must have been one point that had\n\t\t\t\t\t// snapped to the start point so replace it here\n\t\t\t\t\tconst point = startPointIntersection === 1 ? targetEdge.start : targetEdge.end;\n\t\t\t\t\tpoint.copy( tempPoint );\n\t\t\t\t\tcount = 2;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tcount ++;\n\t\t\t\tif ( count === 2 && startPointIntersection === - 1 ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn count;\n\n\t}\n\n\t// TODO: If the triangles are coplanar and intersecting the target is nonsensical. It should at least\n\t// be a line contained by both triangles if not a different special case somehow represented in the return result.\n\treturn function intersectsTriangle( other, target = null, suppressLog = false ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( ! other.isExtendedTriangle ) {\n\n\t\t\tsaTri2.copy( other );\n\t\t\tsaTri2.update();\n\t\t\tother = saTri2;\n\n\t\t} else if ( other.needsUpdate ) {\n\n\t\t\tother.update();\n\n\t\t}\n\n\t\tconst plane1 = this.plane;\n\t\tconst plane2 = other.plane;\n\n\t\tif ( Math.abs( plane1.normal.dot( plane2.normal ) ) > 1.0 - 1e-10 ) {\n\n\t\t\t// perform separating axis intersection test only for coplanar triangles\n\t\t\tconst satBounds1 = this.satBounds;\n\t\t\tconst satAxes1 = this.satAxes;\n\t\t\tarr2[ 0 ] = other.a;\n\t\t\tarr2[ 1 ] = other.b;\n\t\t\tarr2[ 2 ] = other.c;\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\t\tconst sb = satBounds1[ i ];\n\t\t\t\tconst sa = satAxes1[ i ];\n\t\t\t\tcachedSatBounds.setFromPoints( sa, arr2 );\n\t\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t\t}\n\n\t\t\tconst satBounds2 = other.satBounds;\n\t\t\tconst satAxes2 = other.satAxes;\n\t\t\tarr1[ 0 ] = this.a;\n\t\t\tarr1[ 1 ] = this.b;\n\t\t\tarr1[ 2 ] = this.c;\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\t\tconst sb = satBounds2[ i ];\n\t\t\t\tconst sa = satAxes2[ i ];\n\t\t\t\tcachedSatBounds.setFromPoints( sa, arr1 );\n\t\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t\t}\n\n\t\t\t// check crossed axes\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\t\tconst sa1 = satAxes1[ i ];\n\t\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\n\n\t\t\t\t\tconst sa2 = satAxes2[ i2 ];\n\t\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\n\t\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, arr1 );\n\t\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, arr2 );\n\t\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( target ) {\n\n\t\t\t\t// TODO find two points that intersect on the edges and make that the result\n\t\t\t\tif ( ! suppressLog ) {\n\n\t\t\t\t\tconsole.warn( 'ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.' );\n\n\t\t\t\t}\n\n\t\t\t\ttarget.start.set( 0, 0, 0 );\n\t\t\t\ttarget.end.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\t// find the edge that intersects the other triangle plane\n\t\t\tconst count1 = triIntersectPlane( this, plane2, edge1 );\n\t\t\tif ( count1 === 1 && other.containsPoint( edge1.end ) ) {\n\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\ttarget.start.copy( edge1.end );\n\t\t\t\t\ttarget.end.copy( edge1.end );\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else if ( count1 !== 2 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// find the other triangles edge that intersects this plane\n\t\t\tconst count2 = triIntersectPlane( other, plane1, edge2 );\n\t\t\tif ( count2 === 1 && this.containsPoint( edge2.end ) ) {\n\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\ttarget.start.copy( edge2.end );\n\t\t\t\t\ttarget.end.copy( edge2.end );\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else if ( count2 !== 2 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// find swap the second edge so both lines are running the same direction\n\t\t\tedge1.delta( dir1 );\n\t\t\tedge2.delta( dir2 );\n\n\t\t\tif ( dir1.dot( dir2 ) < 0 ) {\n\n\t\t\t\tlet tmp = edge2.start;\n\t\t\t\tedge2.start = edge2.end;\n\t\t\t\tedge2.end = tmp;\n\n\t\t\t}\n\n\t\t\t// check if the edges are overlapping\n\t\t\tconst s1 = edge1.start.dot( dir1 );\n\t\t\tconst e1 = edge1.end.dot( dir1 );\n\t\t\tconst s2 = edge2.start.dot( dir1 );\n\t\t\tconst e2 = edge2.end.dot( dir1 );\n\t\t\tconst separated1 = e1 < s2;\n\t\t\tconst separated2 = s1 < e2;\n\n\t\t\tif ( s1 !== e2 && s2 !== e1 && separated1 === separated2 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// assign the target output\n\t\t\tif ( target ) {\n\n\t\t\t\ttempDir.subVectors( edge1.start, edge2.start );\n\t\t\t\tif ( tempDir.dot( dir1 ) > 0 ) {\n\n\t\t\t\t\ttarget.start.copy( edge1.start );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttarget.start.copy( edge2.start );\n\n\t\t\t\t}\n\n\t\t\t\ttempDir.subVectors( edge1.end, edge2.end );\n\t\t\t\tif ( tempDir.dot( dir1 ) < 0 ) {\n\n\t\t\t\t\ttarget.end.copy( edge1.end );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttarget.end.copy( edge2.end );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n} )();\n\n\nExtendedTriangle.prototype.distanceToPoint = ( function () {\n\n\tconst target = new Vector3();\n\treturn function distanceToPoint( point ) {\n\n\t\tthis.closestPointToPoint( point, target );\n\t\treturn point.distanceTo( target );\n\n\t};\n\n} )();\n\n\nExtendedTriangle.prototype.distanceToTriangle = ( function () {\n\n\tconst point = new Vector3();\n\tconst point2 = new Vector3();\n\tconst cornerFields = [ 'a', 'b', 'c' ];\n\tconst line1 = new Line3();\n\tconst line2 = new Line3();\n\n\treturn function distanceToTriangle( other, target1 = null, target2 = null ) {\n\n\t\tconst lineTarget = target1 || target2 ? line1 : null;\n\t\tif ( this.intersectsTriangle( other, lineTarget ) ) {\n\n\t\t\tif ( target1 || target2 ) {\n\n\t\t\t\tif ( target1 ) lineTarget.getCenter( target1 );\n\t\t\t\tif ( target2 ) lineTarget.getCenter( target2 );\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check all point distances\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tlet dist;\n\t\t\tconst field = cornerFields[ i ];\n\t\t\tconst otherVec = other[ field ];\n\t\t\tthis.closestPointToPoint( otherVec, point );\n\n\t\t\tdist = otherVec.distanceToSquared( point );\n\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( point );\n\t\t\t\tif ( target2 ) target2.copy( otherVec );\n\n\t\t\t}\n\n\n\t\t\tconst thisVec = this[ field ];\n\t\t\tother.closestPointToPoint( thisVec, point );\n\n\t\t\tdist = thisVec.distanceToSquared( point );\n\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( thisVec );\n\t\t\t\tif ( target2 ) target2.copy( point );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst f11 = cornerFields[ i ];\n\t\t\tconst f12 = cornerFields[ ( i + 1 ) % 3 ];\n\t\t\tline1.set( this[ f11 ], this[ f12 ] );\n\t\t\tfor ( let i2 = 0; i2 < 3; i2 ++ ) {\n\n\t\t\t\tconst f21 = cornerFields[ i2 ];\n\t\t\t\tconst f22 = cornerFields[ ( i2 + 1 ) % 3 ];\n\t\t\t\tline2.set( other[ f21 ], other[ f22 ] );\n\n\t\t\t\tclosestPointsSegmentToSegment( line1, line2, point, point2 );\n\n\t\t\t\tconst dist = point.distanceToSquared( point2 );\n\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\tif ( target1 ) target1.copy( point );\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n","import { Vector3, Vector2, Plane, Line3 } from 'three';\n\nexport const closestPointLineToLine = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Line.cpp#L56\n\tconst dir1 = new Vector3();\n\tconst dir2 = new Vector3();\n\tconst v02 = new Vector3();\n\treturn function closestPointLineToLine( l1, l2, result ) {\n\n\t\tconst v0 = l1.start;\n\t\tconst v10 = dir1;\n\t\tconst v2 = l2.start;\n\t\tconst v32 = dir2;\n\n\t\tv02.subVectors( v0, v2 );\n\t\tdir1.subVectors( l1.end, l1.start );\n\t\tdir2.subVectors( l2.end, l2.start );\n\n\t\t// float d0232 = v02.Dot(v32);\n\t\tconst d0232 = v02.dot( v32 );\n\n\t\t// float d3210 = v32.Dot(v10);\n\t\tconst d3210 = v32.dot( v10 );\n\n\t\t// float d3232 = v32.Dot(v32);\n\t\tconst d3232 = v32.dot( v32 );\n\n\t\t// float d0210 = v02.Dot(v10);\n\t\tconst d0210 = v02.dot( v10 );\n\n\t\t// float d1010 = v10.Dot(v10);\n\t\tconst d1010 = v10.dot( v10 );\n\n\t\t// float denom = d1010*d3232 - d3210*d3210;\n\t\tconst denom = d1010 * d3232 - d3210 * d3210;\n\n\t\tlet d, d2;\n\t\tif ( denom !== 0 ) {\n\n\t\t\td = ( d0232 * d3210 - d0210 * d3232 ) / denom;\n\n\t\t} else {\n\n\t\t\td = 0;\n\n\t\t}\n\n\t\td2 = ( d0232 + d * d3210 ) / d3232;\n\n\t\tresult.x = d;\n\t\tresult.y = d2;\n\n\t};\n\n} )();\n\nexport const closestPointsSegmentToSegment = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/LineSegment.cpp#L187\n\tconst paramResult = new Vector2();\n\tconst temp1 = new Vector3();\n\tconst temp2 = new Vector3();\n\treturn function closestPointsSegmentToSegment( l1, l2, target1, target2 ) {\n\n\t\tclosestPointLineToLine( l1, l2, paramResult );\n\n\t\tlet d = paramResult.x;\n\t\tlet d2 = paramResult.y;\n\t\tif ( d >= 0 && d <= 1 && d2 >= 0 && d2 <= 1 ) {\n\n\t\t\tl1.at( d, target1 );\n\t\t\tl2.at( d2, target2 );\n\n\t\t\treturn;\n\n\t\t} else if ( d >= 0 && d <= 1 ) {\n\n\t\t\t// Only d2 is out of bounds.\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tl2.at( 0, target2 );\n\n\t\t\t} else {\n\n\t\t\t\tl2.at( 1, target2 );\n\n\t\t\t}\n\n\t\t\tl1.closestPointToPoint( target2, true, target1 );\n\t\t\treturn;\n\n\t\t} else if ( d2 >= 0 && d2 <= 1 ) {\n\n\t\t\t// Only d is out of bounds.\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tl1.at( 0, target1 );\n\n\t\t\t} else {\n\n\t\t\t\tl1.at( 1, target1 );\n\n\t\t\t}\n\n\t\t\tl2.closestPointToPoint( target1, true, target2 );\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// Both u and u2 are out of bounds.\n\t\t\tlet p;\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tp = l1.start;\n\n\t\t\t} else {\n\n\t\t\t\tp = l1.end;\n\n\t\t\t}\n\n\t\t\tlet p2;\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tp2 = l2.start;\n\n\t\t\t} else {\n\n\t\t\t\tp2 = l2.end;\n\n\t\t\t}\n\n\t\t\tconst closestPoint = temp1;\n\t\t\tconst closestPoint2 = temp2;\n\t\t\tl1.closestPointToPoint( p2, true, temp1 );\n\t\t\tl2.closestPointToPoint( p, true, temp2 );\n\n\t\t\tif ( closestPoint.distanceToSquared( p2 ) <= closestPoint2.distanceToSquared( p ) ) {\n\n\t\t\t\ttarget1.copy( closestPoint );\n\t\t\t\ttarget2.copy( p2 );\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\ttarget1.copy( p );\n\t\t\t\ttarget2.copy( closestPoint2 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n} )();\n\n\nexport const sphereIntersectTriangle = ( function () {\n\n\t// https://stackoverflow.com/questions/34043955/detect-collision-between-sphere-and-triangle-in-three-js\n\tconst closestPointTemp = new Vector3();\n\tconst projectedPointTemp = new Vector3();\n\tconst planeTemp = new Plane();\n\tconst lineTemp = new Line3();\n\treturn function sphereIntersectTriangle( sphere, triangle ) {\n\n\t\tconst { radius, center } = sphere;\n\t\tconst { a, b, c } = triangle;\n\n\t\t// phase 1\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = b;\n\t\tconst closestPoint1 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint1.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint2 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint2.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = b;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint3 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint3.distanceTo( center ) <= radius ) return true;\n\n\t\t// phase 2\n\t\tconst plane = triangle.getPlane( planeTemp );\n\t\tconst dp = Math.abs( plane.distanceToPoint( center ) );\n\t\tif ( dp <= radius ) {\n\n\t\t\tconst pp = plane.projectPoint( center, projectedPointTemp );\n\t\t\tconst cp = triangle.containsPoint( pp );\n\t\t\tif ( cp ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t};\n\n} )();\n","import { Vector3, Matrix4, Line3 } from 'three';\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\nimport { ExtendedTriangle } from './ExtendedTriangle.js';\nimport { closestPointsSegmentToSegment } from './MathUtilities.js';\n\nexport class OrientedBox {\n\n\tconstructor( min, max, matrix ) {\n\n\t\tthis.isOrientedBox = true;\n\t\tthis.min = new Vector3();\n\t\tthis.max = new Vector3();\n\t\tthis.matrix = new Matrix4();\n\t\tthis.invMatrix = new Matrix4();\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\n\t\tthis.satAxes = new Array( 3 ).fill().map( () => new Vector3() );\n\t\tthis.satBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.alignedSatBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.needsUpdate = false;\n\n\t\tif ( min ) this.min.copy( min );\n\t\tif ( max ) this.max.copy( max );\n\t\tif ( matrix ) this.matrix.copy( matrix );\n\n\t}\n\n\tset( min, max, matrix ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\t\tthis.matrix.copy( matrix );\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.min.copy( other.min );\n\t\tthis.max.copy( other.max );\n\t\tthis.matrix.copy( other.matrix );\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nOrientedBox.prototype.update = ( function () {\n\n\treturn function update() {\n\n\t\tconst matrix = this.matrix;\n\t\tconst min = this.min;\n\t\tconst max = this.max;\n\n\t\tconst points = this.points;\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tconst i = ( ( 1 << 0 ) * x ) | ( ( 1 << 1 ) * y ) | ( ( 1 << 2 ) * z );\n\t\t\t\t\tconst v = points[ i ];\n\t\t\t\t\tv.x = x ? max.x : min.x;\n\t\t\t\t\tv.y = y ? max.y : min.y;\n\t\t\t\t\tv.z = z ? max.z : min.z;\n\n\t\t\t\t\tv.applyMatrix4( matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\t\tconst minVec = points[ 0 ];\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis = satAxes[ i ];\n\t\t\tconst sb = satBounds[ i ];\n\t\t\tconst index = 1 << i;\n\t\t\tconst pi = points[ index ];\n\n\t\t\taxis.subVectors( minVec, pi );\n\t\t\tsb.setFromPoints( axis, points );\n\n\t\t}\n\n\t\tconst alignedSatBounds = this.alignedSatBounds;\n\t\talignedSatBounds[ 0 ].setFromPointsField( points, 'x' );\n\t\talignedSatBounds[ 1 ].setFromPointsField( points, 'y' );\n\t\talignedSatBounds[ 2 ].setFromPointsField( points, 'z' );\n\n\t\tthis.invMatrix.copy( this.matrix ).invert();\n\t\tthis.needsUpdate = false;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.intersectsBox = ( function () {\n\n\tconst aabbBounds = new SeparatingAxisBounds();\n\treturn function intersectsBox( box ) {\n\n\t\t// TODO: should this be doing SAT against the AABB?\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tconst min = box.min;\n\t\tconst max = box.max;\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\t\tconst alignedSatBounds = this.alignedSatBounds;\n\n\t\taabbBounds.min = min.x;\n\t\taabbBounds.max = max.x;\n\t\tif ( alignedSatBounds[ 0 ].isSeparated( aabbBounds ) ) return false;\n\n\t\taabbBounds.min = min.y;\n\t\taabbBounds.max = max.y;\n\t\tif ( alignedSatBounds[ 1 ].isSeparated( aabbBounds ) ) return false;\n\n\t\taabbBounds.min = min.z;\n\t\taabbBounds.max = max.z;\n\t\tif ( alignedSatBounds[ 2 ].isSeparated( aabbBounds ) ) return false;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis = satAxes[ i ];\n\t\t\tconst sb = satBounds[ i ];\n\t\t\taabbBounds.setFromBox( axis, box );\n\t\t\tif ( sb.isSeparated( aabbBounds ) ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.intersectsTriangle = ( function () {\n\n\tconst saTri = new ExtendedTriangle();\n\tconst pointsArr = new Array( 3 );\n\tconst cachedSatBounds = new SeparatingAxisBounds();\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\n\tconst cachedAxis = new Vector3();\n\treturn function intersectsTriangle( triangle ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( ! triangle.isExtendedTriangle ) {\n\n\t\t\tsaTri.copy( triangle );\n\t\t\tsaTri.update();\n\t\t\ttriangle = saTri;\n\n\t\t} else if ( triangle.needsUpdate ) {\n\n\t\t\ttriangle.update();\n\n\t\t}\n\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\n\t\tpointsArr[ 0 ] = triangle.a;\n\t\tpointsArr[ 1 ] = triangle.b;\n\t\tpointsArr[ 2 ] = triangle.c;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds[ i ];\n\t\t\tconst sa = satAxes[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, pointsArr );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t}\n\n\t\tconst triSatBounds = triangle.satBounds;\n\t\tconst triSatAxes = triangle.satAxes;\n\t\tconst points = this.points;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = triSatBounds[ i ];\n\t\t\tconst sa = triSatAxes[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t}\n\n\t\t// check crossed axes\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sa1 = satAxes[ i ];\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\n\n\t\t\t\tconst sa2 = triSatAxes[ i2 ];\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, pointsArr );\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, points );\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.closestPointToPoint = ( function () {\n\n\treturn function closestPointToPoint( point, target1 ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\ttarget1\n\t\t\t.copy( point )\n\t\t\t.applyMatrix4( this.invMatrix )\n\t\t\t.clamp( this.min, this.max )\n\t\t\t.applyMatrix4( this.matrix );\n\n\t\treturn target1;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.distanceToPoint = ( function () {\n\n\tconst target = new Vector3();\n\treturn function distanceToPoint( point ) {\n\n\t\tthis.closestPointToPoint( point, target );\n\t\treturn point.distanceTo( target );\n\n\t};\n\n} )();\n\nOrientedBox.prototype.distanceToBox = ( function () {\n\n\tconst xyzFields = [ 'x', 'y', 'z' ];\n\tconst segments1 = new Array( 12 ).fill().map( () => new Line3() );\n\tconst segments2 = new Array( 12 ).fill().map( () => new Line3() );\n\n\tconst point1 = new Vector3();\n\tconst point2 = new Vector3();\n\n\t// early out if we find a value below threshold\n\treturn function distanceToBox( box, threshold = 0, target1 = null, target2 = null ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( this.intersectsBox( box ) ) {\n\n\t\t\tif ( target1 || target2 ) {\n\n\t\t\t\tbox.getCenter( point2 );\n\t\t\t\tthis.closestPointToPoint( point2, point1 );\n\t\t\t\tbox.closestPointToPoint( point1, point2 );\n\n\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tconst threshold2 = threshold * threshold;\n\t\tconst min = box.min;\n\t\tconst max = box.max;\n\t\tconst points = this.points;\n\n\n\t\t// iterate over every edge and compare distances\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check over all these points\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tpoint2.copy( p ).clamp( min, max );\n\n\t\t\tconst dist = p.distanceToSquared( point2 );\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( p );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate and check all line segment distances\n\t\tlet count = 0;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tfor ( let i1 = 0; i1 <= 1; i1 ++ ) {\n\n\t\t\t\tfor ( let i2 = 0; i2 <= 1; i2 ++ ) {\n\n\t\t\t\t\tconst nextIndex = ( i + 1 ) % 3;\n\t\t\t\t\tconst nextIndex2 = ( i + 2 ) % 3;\n\n\t\t\t\t\t// get obb line segments\n\t\t\t\t\tconst index = i1 << nextIndex | i2 << nextIndex2;\n\t\t\t\t\tconst index2 = 1 << i | i1 << nextIndex | i2 << nextIndex2;\n\t\t\t\t\tconst p1 = points[ index ];\n\t\t\t\t\tconst p2 = points[ index2 ];\n\t\t\t\t\tconst line1 = segments1[ count ];\n\t\t\t\t\tline1.set( p1, p2 );\n\n\n\t\t\t\t\t// get aabb line segments\n\t\t\t\t\tconst f1 = xyzFields[ i ];\n\t\t\t\t\tconst f2 = xyzFields[ nextIndex ];\n\t\t\t\t\tconst f3 = xyzFields[ nextIndex2 ];\n\t\t\t\t\tconst line2 = segments2[ count ];\n\t\t\t\t\tconst start = line2.start;\n\t\t\t\t\tconst end = line2.end;\n\n\t\t\t\t\tstart[ f1 ] = min[ f1 ];\n\t\t\t\t\tstart[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\n\t\t\t\t\tstart[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\n\n\t\t\t\t\tend[ f1 ] = max[ f1 ];\n\t\t\t\t\tend[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\n\t\t\t\t\tend[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\n\n\t\t\t\t\tcount ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check all the other boxes point\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tpoint2.x = x ? max.x : min.x;\n\t\t\t\t\tpoint2.y = y ? max.y : min.y;\n\t\t\t\t\tpoint2.z = z ? max.z : min.z;\n\n\t\t\t\t\tthis.closestPointToPoint( point2, point1 );\n\t\t\t\t\tconst dist = point2.distanceToSquared( point1 );\n\t\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 12; i ++ ) {\n\n\t\t\tconst l1 = segments1[ i ];\n\t\t\tfor ( let i2 = 0; i2 < 12; i2 ++ ) {\n\n\t\t\t\tconst l2 = segments2[ i2 ];\n\t\t\t\tclosestPointsSegmentToSegment( l1, l2, point1, point2 );\n\t\t\t\tconst dist = point1.distanceToSquared( point2 );\n\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n","import { Vector3 } from 'three';\n\nexport class SeparatingAxisBounds {\n\n\tconstructor() {\n\n\t\tthis.min = Infinity;\n\t\tthis.max = - Infinity;\n\n\t}\n\n\tsetFromPointsField( points, field ) {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tconst val = p[ field ];\n\t\t\tmin = val < min ? val : min;\n\t\t\tmax = val > max ? val : max;\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tsetFromPoints( axis, points ) {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tconst val = axis.dot( p );\n\t\t\tmin = val < min ? val : min;\n\t\t\tmax = val > max ? val : max;\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tisSeparated( other ) {\n\n\t\treturn this.min > other.max || other.min > this.max;\n\n\t}\n\n}\n\nSeparatingAxisBounds.prototype.setFromBox = ( function () {\n\n\tconst p = new Vector3();\n\treturn function setFromBox( axis, box ) {\n\n\t\tconst boxMin = box.min;\n\t\tconst boxMax = box.max;\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tp.x = boxMin.x * x + boxMax.x * ( 1 - x );\n\t\t\t\t\tp.y = boxMin.y * y + boxMax.y * ( 1 - y );\n\t\t\t\t\tp.z = boxMin.z * z + boxMax.z * ( 1 - z );\n\n\t\t\t\t\tconst val = axis.dot( p );\n\t\t\t\t\tmin = Math.min( val, min );\n\t\t\t\t\tmax = Math.max( val, max );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t};\n\n} )();\n\nexport const areIntersecting = ( function () {\n\n\tconst cacheSatBounds = new SeparatingAxisBounds();\n\treturn function areIntersecting( shape1, shape2 ) {\n\n\t\tconst points1 = shape1.points;\n\t\tconst satAxes1 = shape1.satAxes;\n\t\tconst satBounds1 = shape1.satBounds;\n\n\t\tconst points2 = shape2.points;\n\t\tconst satAxes2 = shape2.satAxes;\n\t\tconst satBounds2 = shape2.satBounds;\n\n\t\t// check axes of the first shape\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds1[ i ];\n\t\t\tconst sa = satAxes1[ i ];\n\t\t\tcacheSatBounds.setFromPoints( sa, points2 );\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\n\n\t\t}\n\n\t\t// check axes of the second shape\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds2[ i ];\n\t\t\tconst sa = satAxes2[ i ];\n\t\t\tcacheSatBounds.setFromPoints( sa, points1 );\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\n\n\t\t}\n\n\t};\n\n} )();\n","export function arrayToBox( nodeIndex32, array, target ) {\n\n\ttarget.min.x = array[ nodeIndex32 ];\n\ttarget.min.y = array[ nodeIndex32 + 1 ];\n\ttarget.min.z = array[ nodeIndex32 + 2 ];\n\n\ttarget.max.x = array[ nodeIndex32 + 3 ];\n\ttarget.max.y = array[ nodeIndex32 + 4 ];\n\ttarget.max.z = array[ nodeIndex32 + 5 ];\n\n\treturn target;\n\n}\n\nexport function makeEmptyBounds( target ) {\n\n\ttarget[ 0 ] = target[ 1 ] = target[ 2 ] = Infinity;\n\ttarget[ 3 ] = target[ 4 ] = target[ 5 ] = - Infinity;\n\n}\n\nexport function getLongestEdgeIndex( bounds ) {\n\n\tlet splitDimIdx = - 1;\n\tlet splitDist = - Infinity;\n\n\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\tconst dist = bounds[ i + 3 ] - bounds[ i ];\n\t\tif ( dist > splitDist ) {\n\n\t\t\tsplitDist = dist;\n\t\t\tsplitDimIdx = i;\n\n\t\t}\n\n\t}\n\n\treturn splitDimIdx;\n\n}\n\n// copies bounds a into bounds b\nexport function copyBounds( source, target ) {\n\n\ttarget.set( source );\n\n}\n\n// sets bounds target to the union of bounds a and b\nexport function unionBounds( a, b, target ) {\n\n\tlet aVal, bVal;\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst d3 = d + 3;\n\n\t\t// set the minimum values\n\t\taVal = a[ d ];\n\t\tbVal = b[ d ];\n\t\ttarget[ d ] = aVal < bVal ? aVal : bVal;\n\n\t\t// set the max values\n\t\taVal = a[ d3 ];\n\t\tbVal = b[ d3 ];\n\t\ttarget[ d3 ] = aVal > bVal ? aVal : bVal;\n\n\t}\n\n}\n\n// expands the given bounds by the provided triangle bounds\nexport function expandByTriangleBounds( startIndex, triangleBounds, bounds ) {\n\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst tCenter = triangleBounds[ startIndex + 2 * d ];\n\t\tconst tHalf = triangleBounds[ startIndex + 2 * d + 1 ];\n\n\t\tconst tMin = tCenter - tHalf;\n\t\tconst tMax = tCenter + tHalf;\n\n\t\tif ( tMin < bounds[ d ] ) {\n\n\t\t\tbounds[ d ] = tMin;\n\n\t\t}\n\n\t\tif ( tMax > bounds[ d + 3 ] ) {\n\n\t\t\tbounds[ d + 3 ] = tMax;\n\n\t\t}\n\n\t}\n\n}\n\n// compute bounds surface area\nexport function computeSurfaceArea( bounds ) {\n\n\tconst d0 = bounds[ 3 ] - bounds[ 0 ];\n\tconst d1 = bounds[ 4 ] - bounds[ 1 ];\n\tconst d2 = bounds[ 5 ] - bounds[ 2 ];\n\n\treturn 2 * ( d0 * d1 + d1 * d2 + d2 * d0 );\n\n}\n","export function isSharedArrayBufferSupported() {\n\n\treturn typeof SharedArrayBuffer !== 'undefined';\n\n}\n\nexport function convertToBufferType( array, BufferConstructor ) {\n\n\tif ( array === null ) {\n\n\t\treturn array;\n\n\t} else if ( array.buffer ) {\n\n\t\tconst buffer = array.buffer;\n\t\tif ( buffer.constructor === BufferConstructor ) {\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tconst ArrayConstructor = array.constructor;\n\t\tconst result = new ArrayConstructor( new BufferConstructor( buffer.byteLength ) );\n\t\tresult.set( array );\n\t\treturn result;\n\n\t} else {\n\n\t\tif ( array.constructor === BufferConstructor ) {\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tconst result = new BufferConstructor( array.byteLength );\n\t\tnew Uint8Array( result ).set( new Uint8Array( array ) );\n\t\treturn result;\n\n\t}\n\n}\n","import { ExtendedTriangle } from '../math/ExtendedTriangle.js';\nimport { PrimitivePool } from './PrimitivePool.js';\n\nclass ExtendedTrianglePoolBase extends PrimitivePool {\n\n\tconstructor() {\n\n\t\tsuper( () => new ExtendedTriangle() );\n\n\t}\n\n}\n\nexport const ExtendedTrianglePool = /* @__PURE__ */ new ExtendedTrianglePoolBase();\n","export class PrimitivePool {\n\n\tconstructor( getNewPrimitive ) {\n\n\t\tthis._getNewPrimitive = getNewPrimitive;\n\t\tthis._primitives = [];\n\n\t}\n\n\tgetPrimitive() {\n\n\t\tconst primitives = this._primitives;\n\t\tif ( primitives.length === 0 ) {\n\n\t\t\treturn this._getNewPrimitive();\n\n\t\t} else {\n\n\t\t\treturn primitives.pop();\n\n\t\t}\n\n\t}\n\n\treleasePrimitive( primitive ) {\n\n\t\tthis._primitives.push( primitive );\n\n\t}\n\n}\n","import { BufferAttribute, BufferGeometry, Vector3, Vector4, Matrix4, Matrix3 } from 'three';\n\nconst _positionVector = /*@__PURE__*/ new Vector3();\nconst _normalVector = /*@__PURE__*/ new Vector3();\nconst _tangentVector = /*@__PURE__*/ new Vector3();\nconst _tangentVector4 = /*@__PURE__*/ new Vector4();\n\nconst _morphVector = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\n\n// Confirms that the two provided attributes are compatible\nfunction validateAttributes( attr1, attr2 ) {\n\n\tif ( ! attr1 && ! attr2 ) {\n\n\t\treturn;\n\n\t}\n\n\tconst sameCount = attr1.count === attr2.count;\n\tconst sameNormalized = attr1.normalized === attr2.normalized;\n\tconst sameType = attr1.array.constructor === attr2.array.constructor;\n\tconst sameItemSize = attr1.itemSize === attr2.itemSize;\n\n\tif ( ! sameCount || ! sameNormalized || ! sameType || ! sameItemSize ) {\n\n\t\tthrow new Error();\n\n\t}\n\n}\n\n// Clones the given attribute with a new compatible buffer attribute but no data\nfunction createAttributeClone( attr, countOverride = null ) {\n\n\tconst cons = attr.array.constructor;\n\tconst normalized = attr.normalized;\n\tconst itemSize = attr.itemSize;\n\tconst count = countOverride === null ? attr.count : countOverride;\n\n\treturn new BufferAttribute( new cons( itemSize * count ), itemSize, normalized );\n\n}\n\n// target offset is the number of elements in the target buffer stride to skip before copying the\n// attributes contents in to.\nfunction copyAttributeContents( attr, target, targetOffset = 0 ) {\n\n\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\tconst itemSize = attr.itemSize;\n\t\tfor ( let i = 0, l = attr.count; i < l; i ++ ) {\n\n\t\t\tconst io = i + targetOffset;\n\t\t\ttarget.setX( io, attr.getX( i ) );\n\t\t\tif ( itemSize >= 2 ) target.setY( io, attr.getY( i ) );\n\t\t\tif ( itemSize >= 3 ) target.setZ( io, attr.getZ( i ) );\n\t\t\tif ( itemSize >= 4 ) target.setW( io, attr.getW( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst array = target.array;\n\t\tconst cons = array.constructor;\n\t\tconst byteOffset = array.BYTES_PER_ELEMENT * attr.itemSize * targetOffset;\n\t\tconst temp = new cons( array.buffer, byteOffset, attr.array.length );\n\t\ttemp.set( attr.array );\n\n\t}\n\n}\n\n// Adds the \"matrix\" multiplied by \"scale\" to \"target\"\nfunction addScaledMatrix( target, matrix, scale ) {\n\n\tconst targetArray = target.elements;\n\tconst matrixArray = matrix.elements;\n\tfor ( let i = 0, l = matrixArray.length; i < l; i ++ ) {\n\n\t\ttargetArray[ i ] += matrixArray[ i ] * scale;\n\n\t}\n\n}\n\n// A version of \"SkinnedMesh.boneTransform\" for normals\nfunction boneNormalTransform( mesh, index, target ) {\n\n\tconst skeleton = mesh.skeleton;\n\tconst geometry = mesh.geometry;\n\tconst bones = skeleton.bones;\n\tconst boneInverses = skeleton.boneInverses;\n\n\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t_matrix.elements.fill( 0 );\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\tif ( weight !== 0 ) {\n\n\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\t\t\t_boneMatrix.multiplyMatrices( bones[ boneIndex ].matrixWorld, boneInverses[ boneIndex ] );\n\n\t\t\taddScaledMatrix( _matrix, _boneMatrix, weight );\n\n\t\t}\n\n\t}\n\n\t_matrix.multiply( mesh.bindMatrix ).premultiply( mesh.bindMatrixInverse );\n\ttarget.transformDirection( _matrix );\n\n\treturn target;\n\n}\n\n// Applies the morph target data to the target vector\nfunction applyMorphTarget( morphData, morphInfluences, morphTargetsRelative, i, target ) {\n\n\t_morphVector.set( 0, 0, 0 );\n\tfor ( let j = 0, jl = morphData.length; j < jl; j ++ ) {\n\n\t\tconst influence = morphInfluences[ j ];\n\t\tconst morphAttribute = morphData[ j ];\n\n\t\tif ( influence === 0 ) continue;\n\n\t\t_temp.fromBufferAttribute( morphAttribute, i );\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\t_morphVector.addScaledVector( _temp, influence );\n\n\t\t} else {\n\n\t\t\t_morphVector.addScaledVector( _temp.sub( target ), influence );\n\n\t\t}\n\n\t}\n\n\ttarget.add( _morphVector );\n\n}\n\n// Modified version of BufferGeometryUtils.mergeBufferGeometries that ignores morph targets and updates a attributes in place\nfunction mergeBufferGeometries( geometries, options = { useGroups: false, updateIndex: false, skipAttributes: [] }, targetGeometry = new BufferGeometry() ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\tconst { useGroups = false, updateIndex = false, skipAttributes = [] } = options;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst attributes = {};\n\n\tlet offset = 0;\n\n\ttargetGeometry.clearGroups();\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tthrow new Error( 'StaticGeometryGenerator: All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tthrow new Error( 'StaticGeometryGenerator: All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) {\n\n\t\t\t\tattributes[ name ] = [];\n\n\t\t\t}\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tthrow new Error( 'StaticGeometryGenerator: Make sure all geometries have the same number of attributes.' );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'StaticGeometryGenerator: The geometry must have either an index or a position attribute' );\n\n\t\t\t}\n\n\t\t\ttargetGeometry.addGroup( offset, count, i );\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\tif ( isIndexed ) {\n\n\t\tlet forceUpdateIndex = false;\n\t\tif ( ! targetGeometry.index ) {\n\n\t\t\tlet indexCount = 0;\n\t\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\t\tindexCount += geometries[ i ].index.count;\n\n\t\t\t}\n\n\t\t\ttargetGeometry.setIndex( new BufferAttribute( new Uint32Array( indexCount ), 1, false ) );\n\t\t\tforceUpdateIndex = true;\n\n\t\t}\n\n\t\tif ( updateIndex || forceUpdateIndex ) {\n\n\t\t\tconst targetIndex = targetGeometry.index;\n\t\t\tlet targetOffset = 0;\n\t\t\tlet indexOffset = 0;\n\t\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst index = geometry.index;\n\t\t\t\tif ( skipAttributes[ i ] !== true ) {\n\n\t\t\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\t\t\ttargetIndex.setX( targetOffset, index.getX( j ) + indexOffset );\n\t\t\t\t\t\ttargetOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tindexOffset += geometry.attributes.position.count;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// merge attributes\n\tfor ( const name in attributes ) {\n\n\t\tconst attrList = attributes[ name ];\n\t\tif ( ! ( name in targetGeometry.attributes ) ) {\n\n\t\t\tlet count = 0;\n\t\t\tfor ( const key in attrList ) {\n\n\t\t\t\tcount += attrList[ key ].count;\n\n\t\t\t}\n\n\t\t\ttargetGeometry.setAttribute( name, createAttributeClone( attributes[ name ][ 0 ], count ) );\n\n\t\t}\n\n\t\tconst targetAttribute = targetGeometry.attributes[ name ];\n\t\tlet offset = 0;\n\t\tfor ( let i = 0, l = attrList.length; i < l; i ++ ) {\n\n\t\t\tconst attr = attrList[ i ];\n\t\t\tif ( skipAttributes[ i ] !== true ) {\n\n\t\t\t\tcopyAttributeContents( attr, targetAttribute, offset );\n\n\t\t\t}\n\n\t\t\toffset += attr.count;\n\n\t\t}\n\n\t}\n\n\treturn targetGeometry;\n\n}\n\nfunction checkTypedArrayEquality( a, b ) {\n\n\tif ( a === null || b === null ) {\n\n\t\treturn a === b;\n\n\t}\n\n\tif ( a.length !== b.length ) {\n\n\t\treturn false;\n\n\t}\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nfunction invertGeometry( geometry ) {\n\n\tconst { index, attributes } = geometry;\n\tif ( index ) {\n\n\t\tfor ( let i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\tconst v0 = index.getX( i );\n\t\t\tconst v2 = index.getX( i + 2 );\n\t\t\tindex.setX( i, v2 );\n\t\t\tindex.setX( i + 2, v0 );\n\n\t\t}\n\n\t} else {\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attr = attributes[ key ];\n\t\t\tconst itemSize = attr.itemSize;\n\t\t\tfor ( let i = 0, l = attr.count; i < l; i += 3 ) {\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tconst v0 = attr.getComponent( i, j );\n\t\t\t\t\tconst v2 = attr.getComponent( i + 2, j );\n\t\t\t\t\tattr.setComponent( i, j, v2 );\n\t\t\t\t\tattr.setComponent( i + 2, j, v0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n\n}\n\n// Checks whether the geometry changed between this and last evaluation\nclass GeometryDiff {\n\n\tconstructor( mesh ) {\n\n\t\tthis.matrixWorld = new Matrix4();\n\t\tthis.geometryHash = null;\n\t\tthis.boneMatrices = null;\n\t\tthis.primitiveCount = - 1;\n\t\tthis.mesh = mesh;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.mesh;\n\t\tconst geometry = mesh.geometry;\n\t\tconst skeleton = mesh.skeleton;\n\t\tconst primitiveCount = ( geometry.index ? geometry.index.count : geometry.attributes.position.count ) / 3;\n\t\tthis.matrixWorld.copy( mesh.matrixWorld );\n\t\tthis.geometryHash = geometry.attributes.position.version;\n\t\tthis.primitiveCount = primitiveCount;\n\n\t\tif ( skeleton ) {\n\n\t\t\t// ensure the bone matrix array is updated to the appropriate length\n\t\t\tif ( ! skeleton.boneTexture ) {\n\n\t\t\t\tskeleton.computeBoneTexture();\n\n\t\t\t}\n\n\t\t\tskeleton.update();\n\n\t\t\t// copy data if possible otherwise clone it\n\t\t\tconst boneMatrices = skeleton.boneMatrices;\n\t\t\tif ( ! this.boneMatrices || this.boneMatrices.length !== boneMatrices.length ) {\n\n\t\t\t\tthis.boneMatrices = boneMatrices.slice();\n\n\t\t\t} else {\n\n\t\t\t\tthis.boneMatrices.set( boneMatrices );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = null;\n\n\t\t}\n\n\t}\n\n\tdidChange() {\n\n\t\tconst mesh = this.mesh;\n\t\tconst geometry = mesh.geometry;\n\t\tconst primitiveCount = ( geometry.index ? geometry.index.count : geometry.attributes.position.count ) / 3;\n\t\tconst identical =\n\t\t\tthis.matrixWorld.equals( mesh.matrixWorld ) &&\n\t\t\tthis.geometryHash === geometry.attributes.position.version &&\n\t\t\tcheckTypedArrayEquality( mesh.skeleton && mesh.skeleton.boneMatrices || null, this.boneMatrices ) &&\n\t\t\tthis.primitiveCount === primitiveCount;\n\n\t\treturn ! identical;\n\n\t}\n\n}\n\nexport class StaticGeometryGenerator {\n\n\tconstructor( meshes ) {\n\n\t\tif ( ! Array.isArray( meshes ) ) {\n\n\t\t\tmeshes = [ meshes ];\n\n\t\t}\n\n\t\tconst finalMeshes = [];\n\t\tmeshes.forEach( object => {\n\n\t\t\tobject.traverseVisible( c => {\n\n\t\t\t\tif ( c.isMesh ) {\n\n\t\t\t\t\tfinalMeshes.push( c );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t\tthis.meshes = finalMeshes;\n\t\tthis.useGroups = true;\n\t\tthis.applyWorldTransforms = true;\n\t\tthis.attributes = [ 'position', 'normal', 'color', 'tangent', 'uv', 'uv2' ];\n\t\tthis._intermediateGeometry = new Array( finalMeshes.length ).fill().map( () => new BufferGeometry() );\n\t\tthis._diffMap = new WeakMap();\n\n\t}\n\n\tgetMaterials() {\n\n\t\tconst materials = [];\n\t\tthis.meshes.forEach( mesh => {\n\n\t\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\t\tmaterials.push( ...mesh.material );\n\n\t\t\t} else {\n\n\t\t\t\tmaterials.push( mesh.material );\n\n\t\t\t}\n\n\t\t} );\n\t\treturn materials;\n\n\t}\n\n\tgenerate( targetGeometry = new BufferGeometry() ) {\n\n\t\t// track which attributes have been updated and which to skip to avoid unnecessary attribute copies\n\t\tlet skipAttributes = [];\n\t\tconst { meshes, useGroups, _intermediateGeometry, _diffMap } = this;\n\t\tfor ( let i = 0, l = meshes.length; i < l; i ++ ) {\n\n\t\t\tconst mesh = meshes[ i ];\n\t\t\tconst geom = _intermediateGeometry[ i ];\n\t\t\tconst diff = _diffMap.get( mesh );\n\t\t\tif ( ! diff || diff.didChange( mesh ) ) {\n\n\t\t\t\tthis._convertToStaticGeometry( mesh, geom );\n\t\t\t\tskipAttributes.push( false );\n\n\t\t\t\tif ( ! diff ) {\n\n\t\t\t\t\t_diffMap.set( mesh, new GeometryDiff( mesh ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdiff.update();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tskipAttributes.push( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( _intermediateGeometry.length === 0 ) {\n\n\t\t\t// if there are no geometries then just create a fake empty geometry to provide\n\t\t\ttargetGeometry.setIndex( null );\n\n\t\t\t// remove all geometry\n\t\t\tconst attrs = targetGeometry.attributes;\n\t\t\tfor ( const key in attrs ) {\n\n\t\t\t\ttargetGeometry.deleteAttribute( key );\n\n\t\t\t}\n\n\t\t\t// create dummy attributes\n\t\t\tfor ( const key in this.attributes ) {\n\n\t\t\t\ttargetGeometry.setAttribute( this.attributes[ key ], new BufferAttribute( new Float32Array( 0 ), 4, false ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmergeBufferGeometries( _intermediateGeometry, { useGroups, skipAttributes }, targetGeometry );\n\n\t\t}\n\n\t\tfor ( const key in targetGeometry.attributes ) {\n\n\t\t\ttargetGeometry.attributes[ key ].needsUpdate = true;\n\n\t\t}\n\n\t\treturn targetGeometry;\n\n\t}\n\n\t_convertToStaticGeometry( mesh, targetGeometry = new BufferGeometry() ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tconst applyWorldTransforms = this.applyWorldTransforms;\n\t\tconst includeNormal = this.attributes.includes( 'normal' );\n\t\tconst includeTangent = this.attributes.includes( 'tangent' );\n\t\tconst attributes = geometry.attributes;\n\t\tconst targetAttributes = targetGeometry.attributes;\n\n\t\t// initialize the attributes if they don't exist\n\t\tif ( ! targetGeometry.index && geometry.index ) {\n\n\t\t\ttargetGeometry.index = geometry.index.clone();\n\n\t\t}\n\n\t\tif ( ! targetAttributes.position ) {\n\n\t\t\ttargetGeometry.setAttribute( 'position', createAttributeClone( attributes.position ) );\n\n\t\t}\n\n\t\tif ( includeNormal && ! targetAttributes.normal && attributes.normal ) {\n\n\t\t\ttargetGeometry.setAttribute( 'normal', createAttributeClone( attributes.normal ) );\n\n\t\t}\n\n\t\tif ( includeTangent && ! targetAttributes.tangent && attributes.tangent ) {\n\n\t\t\ttargetGeometry.setAttribute( 'tangent', createAttributeClone( attributes.tangent ) );\n\n\t\t}\n\n\t\t// ensure the attributes are consistent\n\t\tvalidateAttributes( geometry.index, targetGeometry.index );\n\t\tvalidateAttributes( attributes.position, targetAttributes.position );\n\n\t\tif ( includeNormal ) {\n\n\t\t\tvalidateAttributes( attributes.normal, targetAttributes.normal );\n\n\t\t}\n\n\t\tif ( includeTangent ) {\n\n\t\t\tvalidateAttributes( attributes.tangent, targetAttributes.tangent );\n\n\t\t}\n\n\t\t// generate transformed vertex attribute data\n\t\tconst position = attributes.position;\n\t\tconst normal = includeNormal ? attributes.normal : null;\n\t\tconst tangent = includeTangent ? attributes.tangent : null;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphNormal = geometry.morphAttributes.normal;\n\t\tconst morphTangent = geometry.morphAttributes.tangent;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\tconst morphInfluences = mesh.morphTargetInfluences;\n\t\tconst normalMatrix = new Matrix3();\n\t\tnormalMatrix.getNormalMatrix( mesh.matrixWorld );\n\n\t\t// copy the index\n\t\tif ( geometry.index ) {\n\n\t\t\ttargetGeometry.index.array.set( geometry.index.array );\n\n\t\t}\n\n\t\t// copy and apply other attributes\n\t\tfor ( let i = 0, l = attributes.position.count; i < l; i ++ ) {\n\n\t\t\t_positionVector.fromBufferAttribute( position, i );\n\t\t\tif ( normal ) {\n\n\t\t\t\t_normalVector.fromBufferAttribute( normal, i );\n\n\t\t\t}\n\n\t\t\tif ( tangent ) {\n\n\t\t\t\t_tangentVector4.fromBufferAttribute( tangent, i );\n\t\t\t\t_tangentVector.fromBufferAttribute( tangent, i );\n\n\t\t\t}\n\n\t\t\t// apply morph target transform\n\t\t\tif ( morphInfluences ) {\n\n\t\t\t\tif ( morphPosition ) {\n\n\t\t\t\t\tapplyMorphTarget( morphPosition, morphInfluences, morphTargetsRelative, i, _positionVector );\n\n\t\t\t\t}\n\n\t\t\t\tif ( morphNormal ) {\n\n\t\t\t\t\tapplyMorphTarget( morphNormal, morphInfluences, morphTargetsRelative, i, _normalVector );\n\n\t\t\t\t}\n\n\t\t\t\tif ( morphTangent ) {\n\n\t\t\t\t\tapplyMorphTarget( morphTangent, morphInfluences, morphTargetsRelative, i, _tangentVector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// apply bone transform\n\t\t\tif ( mesh.isSkinnedMesh ) {\n\n\t\t\t\tmesh.applyBoneTransform( i, _positionVector );\n\t\t\t\tif ( normal ) {\n\n\t\t\t\t\tboneNormalTransform( mesh, i, _normalVector );\n\n\t\t\t\t}\n\n\t\t\t\tif ( tangent ) {\n\n\t\t\t\t\tboneNormalTransform( mesh, i, _tangentVector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update the vectors of the attributes\n\t\t\tif ( applyWorldTransforms ) {\n\n\t\t\t\t_positionVector.applyMatrix4( mesh.matrixWorld );\n\n\t\t\t}\n\n\t\t\ttargetAttributes.position.setXYZ( i, _positionVector.x, _positionVector.y, _positionVector.z );\n\n\t\t\tif ( normal ) {\n\n\t\t\t\tif ( applyWorldTransforms ) {\n\n\t\t\t\t\t_normalVector.applyNormalMatrix( normalMatrix );\n\n\t\t\t\t}\n\n\t\t\t\ttargetAttributes.normal.setXYZ( i, _normalVector.x, _normalVector.y, _normalVector.z );\n\n\t\t\t}\n\n\t\t\tif ( tangent ) {\n\n\t\t\t\tif ( applyWorldTransforms ) {\n\n\t\t\t\t\t_tangentVector.transformDirection( mesh.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\ttargetAttributes.tangent.setXYZW( i, _tangentVector.x, _tangentVector.y, _tangentVector.z, _tangentVector4.w );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// copy other attributes over\n\t\tfor ( const i in this.attributes ) {\n\n\t\t\tconst key = this.attributes[ i ];\n\t\t\tif ( key === 'position' || key === 'tangent' || key === 'normal' || ! ( key in attributes ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ! targetAttributes[ key ] ) {\n\n\t\t\t\ttargetGeometry.setAttribute( key, createAttributeClone( attributes[ key ] ) );\n\n\t\t\t}\n\n\t\t\tvalidateAttributes( attributes[ key ], targetAttributes[ key ] );\n\t\t\tcopyAttributeContents( attributes[ key ], targetAttributes[ key ] );\n\n\t\t}\n\n\t\tif ( mesh.matrixWorld.determinant() < 0 ) {\n\n\t\t\tinvertGeometry( targetGeometry );\n\n\t\t}\n\n\t\treturn targetGeometry;\n\n\t}\n\n}\n","import { Vector3, Vector2, Triangle, DoubleSide, BackSide, REVISION } from 'three';\n\nconst IS_GT_REVISION_169 = parseInt( REVISION ) >= 169;\n\n// Ripped and modified From THREE.js Mesh raycast\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L115\nconst _vA = /* @__PURE__ */ new Vector3();\nconst _vB = /* @__PURE__ */ new Vector3();\nconst _vC = /* @__PURE__ */ new Vector3();\n\nconst _uvA = /* @__PURE__ */ new Vector2();\nconst _uvB = /* @__PURE__ */ new Vector2();\nconst _uvC = /* @__PURE__ */ new Vector2();\n\nconst _normalA = /* @__PURE__ */ new Vector3();\nconst _normalB = /* @__PURE__ */ new Vector3();\nconst _normalC = /* @__PURE__ */ new Vector3();\n\nconst _intersectionPoint = /* @__PURE__ */ new Vector3();\nfunction checkIntersection( ray, pA, pB, pC, point, side, near, far ) {\n\n\tlet intersect;\n\tif ( side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\tconst distance = ray.origin.distanceTo( point );\n\n\tif ( distance < near || distance > far ) return null;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\tpoint: point.clone(),\n\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst intersection = checkIntersection( ray, _vA, _vB, _vC, _intersectionPoint, side, near, far );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA, _vB, _vC, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv1, a );\n\t\t\t_uvB.fromBufferAttribute( uv1, b );\n\t\t\t_uvC.fromBufferAttribute( uv1, c );\n\n\t\t\tintersection.uv1 = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\t_normalA.fromBufferAttribute( normal, a );\n\t\t\t_normalB.fromBufferAttribute( normal, b );\n\t\t\t_normalC.fromBufferAttribute( normal, c );\n\n\t\t\tintersection.normal = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _normalA, _normalB, _normalC, new Vector3() );\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.faceIndex = a;\n\n\t\tif ( IS_GT_REVISION_169 ) {\n\n\t\t\tintersection.barycoord = barycoord;\n\n\t\t}\n\n\t}\n\n\treturn intersection;\n\n}\n\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L258\nfunction intersectTri( geo, side, ray, tri, intersections, near, far ) {\n\n\tconst triOffset = tri * 3;\n\tlet a = triOffset + 0;\n\tlet b = triOffset + 1;\n\tlet c = triOffset + 2;\n\n\tconst index = geo.index;\n\tif ( geo.index ) {\n\n\t\ta = index.getX( a );\n\t\tb = index.getX( b );\n\t\tc = index.getX( c );\n\n\t}\n\n\tconst { position, normal, uv, uv1 } = geo.attributes;\n\tconst intersection = checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far );\n\n\tif ( intersection ) {\n\n\t\tintersection.faceIndex = tri;\n\t\tif ( intersections ) intersections.push( intersection );\n\t\treturn intersection;\n\n\t}\n\n\treturn null;\n\n}\n\nexport { intersectTri };\n","\nimport { Vector2, Vector3, Triangle } from 'three';\n\n// sets the vertices of triangle `tri` with the 3 vertices after i\nexport function setTriangle( tri, i, index, pos ) {\n\n\tconst ta = tri.a;\n\tconst tb = tri.b;\n\tconst tc = tri.c;\n\n\tlet i0 = i;\n\tlet i1 = i + 1;\n\tlet i2 = i + 2;\n\tif ( index ) {\n\n\t\ti0 = index.getX( i0 );\n\t\ti1 = index.getX( i1 );\n\t\ti2 = index.getX( i2 );\n\n\t}\n\n\tta.x = pos.getX( i0 );\n\tta.y = pos.getY( i0 );\n\tta.z = pos.getZ( i0 );\n\n\ttb.x = pos.getX( i1 );\n\ttb.y = pos.getY( i1 );\n\ttb.z = pos.getZ( i1 );\n\n\ttc.x = pos.getX( i2 );\n\ttc.y = pos.getY( i2 );\n\ttc.z = pos.getZ( i2 );\n\n}\n\nconst tempV1 = /* @__PURE__ */ new Vector3();\nconst tempV2 = /* @__PURE__ */ new Vector3();\nconst tempV3 = /* @__PURE__ */ new Vector3();\nconst tempUV1 = /* @__PURE__ */ new Vector2();\nconst tempUV2 = /* @__PURE__ */ new Vector2();\nconst tempUV3 = /* @__PURE__ */ new Vector2();\n\nexport function getTriangleHitPointInfo( point, geometry, triangleIndex, target ) {\n\n\tconst indices = geometry.getIndex().array;\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst uvs = geometry.getAttribute( 'uv' );\n\n\tconst a = indices[ triangleIndex * 3 ];\n\tconst b = indices[ triangleIndex * 3 + 1 ];\n\tconst c = indices[ triangleIndex * 3 + 2 ];\n\n\ttempV1.fromBufferAttribute( positions, a );\n\ttempV2.fromBufferAttribute( positions, b );\n\ttempV3.fromBufferAttribute( positions, c );\n\n\t// find the associated material index\n\tlet materialIndex = 0;\n\tconst groups = geometry.groups;\n\tconst firstVertexIndex = triangleIndex * 3;\n\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\t\tconst { start, count } = group;\n\t\tif ( firstVertexIndex >= start && firstVertexIndex < start + count ) {\n\n\t\t\tmaterialIndex = group.materialIndex;\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t// extract barycoord\n\tconst barycoord = target && target.barycoord ? target.barycoord : new Vector3();\n\tTriangle.getBarycoord( point, tempV1, tempV2, tempV3, barycoord );\n\n\t// extract uvs\n\tlet uv = null;\n\tif ( uvs ) {\n\n\t\ttempUV1.fromBufferAttribute( uvs, a );\n\t\ttempUV2.fromBufferAttribute( uvs, b );\n\t\ttempUV3.fromBufferAttribute( uvs, c );\n\n\t\tif ( target && target.uv ) uv = target.uv;\n\t\telse uv = new Vector2();\n\n\t\tTriangle.getInterpolation( point, tempV1, tempV2, tempV3, tempUV1, tempUV2, tempUV3, uv );\n\n\t}\n\n\t// adjust the provided target or create a new one\n\tif ( target ) {\n\n\t\tif ( ! target.face ) target.face = { };\n\t\ttarget.face.a = a;\n\t\ttarget.face.b = b;\n\t\ttarget.face.c = c;\n\t\ttarget.face.materialIndex = materialIndex;\n\t\tif ( ! target.face.normal ) target.face.normal = new Vector3();\n\t\tTriangle.getNormal( tempV1, tempV2, tempV3, target.face.normal );\n\n\t\tif ( uv ) target.uv = uv;\n\t\ttarget.barycoord = barycoord;\n\n\t\treturn target;\n\n\t} else {\n\n\t\treturn {\n\t\t\tface: {\n\t\t\t\ta: a,\n\t\t\t\tb: b,\n\t\t\t\tc: c,\n\t\t\t\tmaterialIndex: materialIndex,\n\t\t\t\tnormal: Triangle.getNormal( tempV1, tempV2, tempV3, new Vector3() )\n\t\t\t},\n\t\t\tuv: uv,\n\t\t\tbarycoord: barycoord,\n\t\t};\n\n\t}\n\n}\n","/**\n * @license\n * Copyright 2010-2024 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '167';\n\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst ConstantColorFactor = 211;\nconst OneMinusConstantColorFactor = 212;\nconst ConstantAlphaFactor = 213;\nconst OneMinusConstantAlphaFactor = 214;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\nconst AgXToneMapping = 6;\nconst NeutralToneMapping = 7;\nconst AttachedBindMode = 'attached';\nconst DetachedBindMode = 'detached';\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst UnsignedInt5999Type = 35902;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBIntegerFormat = 1032;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst RGB_BPTC_SIGNED_Format = 36494;\nconst RGB_BPTC_UNSIGNED_Format = 36495;\nconst RED_RGTC1_Format = 36283;\nconst SIGNED_RED_RGTC1_Format = 36284;\nconst RED_GREEN_RGTC2_Format = 36285;\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst RGBDepthPacking = 3202;\nconst RGDepthPacking = 3203;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\nconst DisplayP3ColorSpace = 'display-p3';\nconst LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nconst LinearTransfer = 'linear';\nconst SRGBTransfer = 'srgb';\n\nconst Rec709Primaries = 'rec709';\nconst P3Primaries = 'p3';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst NeverCompare = 512;\nconst LessCompare = 513;\nconst EqualCompare = 514;\nconst LessEqualCompare = 515;\nconst GreaterCompare = 516;\nconst NotEqualCompare = 517;\nconst GreaterEqualCompare = 518;\nconst AlwaysCompare = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst WebGLCoordinateSystem = 2000;\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tVector2.prototype.isVector2 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nclass Matrix3 {\n\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nfunction warnOnce( message ) {\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\tconsole.warn( message );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * Matrices converting P3 <-> Rec. 709 primaries, without gamut mapping\n * or clipping. Based on W3C specifications for sRGB and Display P3,\n * and ICC specifications for the D50 connection space. Values in/out\n * are _linear_ sRGB and _linear_ Display P3.\n *\n * Note that both sRGB and Display P3 use the sRGB transfer functions.\n *\n * Reference:\n * - http://www.russellcottrell.com/photo/matrixCalculator.htm\n */\n\nconst LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t0.8224621, 0.177538, 0.0,\n\t0.0331941, 0.9668058, 0.0,\n\t0.0170827, 0.0723974, 0.9105199,\n);\n\nconst LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = /*@__PURE__*/ new Matrix3().set(\n\t1.2249401, - 0.2249404, 0.0,\n\t- 0.0420569, 1.0420571, 0.0,\n\t- 0.0196376, - 0.0786361, 1.0982735\n);\n\n/**\n * Defines supported color spaces by transfer function and primaries,\n * and provides conversions to/from the Linear-sRGB reference space.\n */\nconst COLOR_SPACES = {\n\t[ LinearSRGBColorSpace ]: {\n\t\ttransfer: LinearTransfer,\n\t\tprimaries: Rec709Primaries,\n\t\tluminanceCoefficients: [ 0.2126, 0.7152, 0.0722 ],\n\t\ttoReference: ( color ) => color,\n\t\tfromReference: ( color ) => color,\n\t},\n\t[ SRGBColorSpace ]: {\n\t\ttransfer: SRGBTransfer,\n\t\tprimaries: Rec709Primaries,\n\t\tluminanceCoefficients: [ 0.2126, 0.7152, 0.0722 ],\n\t\ttoReference: ( color ) => color.convertSRGBToLinear(),\n\t\tfromReference: ( color ) => color.convertLinearToSRGB(),\n\t},\n\t[ LinearDisplayP3ColorSpace ]: {\n\t\ttransfer: LinearTransfer,\n\t\tprimaries: P3Primaries,\n\t\tluminanceCoefficients: [ 0.2289, 0.6917, 0.0793 ],\n\t\ttoReference: ( color ) => color.applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ),\n\t\tfromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ),\n\t},\n\t[ DisplayP3ColorSpace ]: {\n\t\ttransfer: SRGBTransfer,\n\t\tprimaries: P3Primaries,\n\t\tluminanceCoefficients: [ 0.2289, 0.6917, 0.0793 ],\n\t\ttoReference: ( color ) => color.convertSRGBToLinear().applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ),\n\t\tfromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ).convertLinearToSRGB(),\n\t},\n};\n\nconst SUPPORTED_WORKING_COLOR_SPACES = new Set( [ LinearSRGBColorSpace, LinearDisplayP3ColorSpace ] );\n\nconst ColorManagement = {\n\n\tenabled: true,\n\n\t_workingColorSpace: LinearSRGBColorSpace,\n\n\tget workingColorSpace() {\n\n\t\treturn this._workingColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tif ( ! SUPPORTED_WORKING_COLOR_SPACES.has( colorSpace ) ) {\n\n\t\t\tthrow new Error( `Unsupported working color space, \"${ colorSpace }\".` );\n\n\t\t}\n\n\t\tthis._workingColorSpace = colorSpace;\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tconst sourceToReference = COLOR_SPACES[ sourceColorSpace ].toReference;\n\t\tconst targetFromReference = COLOR_SPACES[ targetColorSpace ].fromReference;\n\n\t\treturn targetFromReference( sourceToReference( color ) );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this._workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this._workingColorSpace );\n\n\t},\n\n\tgetPrimaries: function ( colorSpace ) {\n\n\t\treturn COLOR_SPACES[ colorSpace ].primaries;\n\n\t},\n\n\tgetTransfer: function ( colorSpace ) {\n\n\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\treturn COLOR_SPACES[ colorSpace ].transfer;\n\n\t},\n\n\tgetLuminanceCoefficients: function ( target, colorSpace = this._workingColorSpace ) {\n\n\t\treturn target.fromArray( COLOR_SPACES[ colorSpace ].luminanceCoefficients );\n\n\t},\n\n};\n\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.isSource = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\t\tthis.dataReady = true;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\tthis.isTexture = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\t\tthis.channel = 0;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\tthis.colorSpace = colorSpace;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.pmremVersion = 0; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\nTexture.DEFAULT_ANISOTROPY = 1;\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tVector4.prototype.isVector4 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass RenderTarget extends EventDispatcher {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.isRenderTarget = true;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1\n\t\t}, options );\n\n\t\tconst texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\ttexture.flipY = false;\n\t\ttexture.generateMipmaps = options.generateMipmaps;\n\t\ttexture.internalFormat = options.internalFormat;\n\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\tthis.depthBuffer = options.depthBuffer;\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\tthis.samples = options.samples;\n\n\t}\n\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass WebGLRenderTarget extends RenderTarget {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.isDataArrayTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.isData3DTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// sets this quaternion to a uniform random unit quaternnion\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox3 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$3.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$3 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$3, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$3, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$3, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$3, _v1$7, _v2$4, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$3 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.isSphere = true;\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$4.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$4.elements[ 0 ] *= invSX;\n\t\t_m1$4.elements[ 1 ] *= invSX;\n\t\t_m1$4.elements[ 2 ] *= invSX;\n\n\t\t_m1$4.elements[ 4 ] *= invSY;\n\t\t_m1$4.elements[ 5 ] *= invSY;\n\t\t_m1$4.elements[ 6 ] *= invSY;\n\n\t\t_m1$4.elements[ 8 ] *= invSZ;\n\t\t_m1$4.elements[ 9 ] *= invSZ;\n\t\t_m1$4.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$4 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\td = ( - 2 * far * near ) / ( far - near );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tc = - far / ( far - near );\n\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\n\t\tlet z, zInv;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tz = ( far + near ) * p;\n\t\t\tzInv = - 2 * p;\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tz = near * p;\n\t\t\tzInv = - 1 * p;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0; \t\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = zInv;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$4 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.DEFAULT_ORDER = 'XYZ';\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$3 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nconst _childaddedEvent = { type: 'childadded', child: null };\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isObject3D = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$3.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$3.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$3.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$3 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$3.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$3 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$3.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$3.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$3 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.visibility = this._visibility;\n\t\t\tobject.active = this._active;\n\t\t\tobject.bounds = this._bounds.map( bound => ( {\n\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\tboxMin: bound.box.min.toArray(),\n\t\t\t\tboxMax: bound.box.max.toArray(),\n\n\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\tsphereRadius: bound.sphere.radius,\n\t\t\t\tsphereCenter: bound.sphere.center.toArray()\n\t\t\t} ) );\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) object.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = {\n\t\t\t\t\tcenter: object.boundingSphere.center.toArray(),\n\t\t\t\t\tradius: object.boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = {\n\t\t\t\t\tmin: object.boundingBox.min.toArray(),\n\t\t\t\t\tmax: object.boundingBox.max.toArray()\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$2.subVectors( a, b );\n\t\ttarget.cross( _v0$2 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$2.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$2.dot( _v0$2 );\n\t\tconst dot01 = _v0$2.dot( _v1$3 );\n\t\tconst dot02 = _v0$2.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$2.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$2.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$2.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$2.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tthis.isColor = true;\n\n\t\tthis.r = 1;\n\t\tthis.g = 1;\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isMaterial = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\t\tthis.alphaHash = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\t\tthis.blendAlpha = 0;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\t\tthis.forceSinglePass = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {\n\n\t\tconsole.warn( 'Material: onBuild() has been removed.' ); // @deprecated, r166\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {\n\n\t\tconsole.warn( 'Material: onBeforeRender() has been removed.' ); // @deprecated, r166\n\n\t}\n\n\n}\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < - 27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < - 14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= ~ 0x00800000; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n// float32 to float16\n\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, - 65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n// float16 to float32\n\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\nconst DataUtils = {\n\ttoHalfFloat: toHalfFloat,\n\tfromHalfFloat: fromHalfFloat,\n};\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.isBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis._updateRange = { offset: 0, count: - 1 };\n\t\tthis.updateRanges = [];\n\t\tthis.gpuType = FloatType;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tget updateRange() {\n\n\t\twarnOnce( 'THREE.BufferAttribute: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159\n\t\treturn this._updateRange;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$2 = 0;\n\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1$2.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$2.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$2.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$2.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$2.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$2.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _normalA = /*@__PURE__*/ new Vector3();\nconst _normalB = /*@__PURE__*/ new Vector3();\nconst _normalC = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv1, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv1, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv1, c );\n\n\t\t\tintersection.uv1 = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\t_normalA.fromBufferAttribute( normal, a );\n\t\t\t_normalB.fromBufferAttribute( normal, b );\n\t\t\t_normalC.fromBufferAttribute( normal, c );\n\n\t\t\tintersection.normal = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _normalA, _normalB, _normalC, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\tconsole.warn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\t\tthis.uniformsGroups = [];\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.forceSinglePass = true;\n\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets minTarget and maxTarget to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( - 1, - 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Copies the result into the target Vector2, where x is width and y is height.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t *   const w = 1920;\n\t *   const h = 1080;\n\t *   const fullWidth = w * 3;\n\t *   const fullHeight = h * 2;\n\t *\n\t *   --A--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t *   --B--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t *   --C--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t *   --D--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t *   --E--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t *   --F--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t *   Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = - 90; // negative fov is not an error\nconst aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tthis.renderTarget = renderTarget;\n\t\tthis.coordinateSystem = null;\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( - 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, - 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, - 1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, - 1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\t\tcameraPX.lookAt( - 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\t\tcameraNY.lookAt( 0, - 1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, - 1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\tthis.isPlane = true;\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$5.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$5.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$5 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$5.center.set( 0, 0, 0 );\n\t\t_sphere$5.radius = 0.7071067811865476;\n\t\t_sphere$5.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$5 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$7 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute._updateRange; // @deprecated, r159\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 && updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t}\n\n\t\tif ( updateRanges.length !== 0 ) {\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\t// @deprecated, r159\n\t\tif ( updateRange.count !== - 1 ) {\n\n\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660,  0.0556434,\\n\\t\\t-1.5371385,  1.8760108, -0.2040259,\\n\\t\\t-0.4985314,  0.0415560,  1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"\\nconst mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3(\\n\\tvec3( 0.8224621, 0.177538, 0.0 ),\\n\\tvec3( 0.0331941, 0.9668058, 0.0 ),\\n\\tvec3( 0.0170827, 0.0723974, 0.9105199 )\\n);\\nconst mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.2249401, - 0.2249404, 0.0 ),\\n\\tvec3( - 0.0420569, 1.0420571, 0.0 ),\\n\\tvec3( - 0.0196376, - 0.0786361, 1.0982735 )\\n);\\nvec4 LinearSRGBToLinearDisplayP3( in vec4 value ) {\\n\\treturn vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a );\\n}\\nvec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) {\\n\\treturn vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a );\\n}\\nvec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n    float x2 = x * x;\\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3(    0, 1,    0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] =  texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3(  1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108,  1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605,  1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t\\n\\t\\t#else\\n\\t\\t\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <logdepthbuf_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: - 1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= - 1; _e1$1.y *= - 1; _e1$1.z *= - 1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= - 1;\n\t\t\t\t_e1$1.z *= - 1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ];\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < primcount.length; i ++ ) {\n\n\t\t\t\tinfo.update( elementCount, mode, primcount[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t * The smallest supported equirectangular image size is 64 x 32.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t * The smallest supported cube size is 16 x 16.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\t\tconst n = this._lodPlanes.length;\n\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tconst array = geometry.morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.remove( array[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ];\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < primcount.length; i ++ ) {\n\n\t\t\t\tinfo.update( elementCount, mode, primcount[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format = DepthFormat ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedIntType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isDepthTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\tconst encodingPrimaries = ColorManagement.getPrimaries( colorSpace );\n\n\tlet gamutMapping;\n\n\tif ( workingPrimaries === encodingPrimaries ) {\n\n\t\tgamutMapping = '';\n\n\t} else if ( workingPrimaries === P3Primaries && encodingPrimaries === Rec709Primaries ) {\n\n\t\tgamutMapping = 'LinearDisplayP3ToLinearSRGB';\n\n\t} else if ( workingPrimaries === Rec709Primaries && encodingPrimaries === P3Primaries ) {\n\n\t\tgamutMapping = 'LinearSRGBToLinearDisplayP3';\n\n\t}\n\n\tswitch ( colorSpace ) {\n\n\t\tcase LinearSRGBColorSpace:\n\t\tcase LinearDisplayP3ColorSpace:\n\t\t\treturn [ gamutMapping, 'LinearTransferOETF' ];\n\n\t\tcase SRGBColorSpace:\n\t\tcase DisplayP3ColorSpace:\n\t\t\treturn [ gamutMapping, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported color space:', colorSpace );\n\t\t\treturn [ gamutMapping, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\treturn `vec4 ${functionName}( vec4 value ) { return ${components[ 0 ]}( ${components[ 1 ]}( value ) ); }`;\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0$1 );\n\n\tconst r = _v0$1.x.toFixed( 4 );\n\tconst g = _v0$1.y.toFixed( 4 );\n\tconst b = _v0$1.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id$1 = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id$1 ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading === true,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 19 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1,\n\t\t\tnumSpotMaps: - 1,\n\n\t\t\tnumLightProbes: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include <packing>\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n\n\n/**\n * Given the width, height, format, and type of a texture. Determines how many\n * bytes must be used to represent the texture.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase LuminanceFormat:\n\t\t\treturn width * height;\n\t\tcase LuminanceAlphaFormat:\n\t\t\treturn width * height * 2;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\nconst TextureUtils = {\n\tcontain,\n\tcover,\n\tfill,\n\tgetByteLength\n};\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\tconsole.warn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData, 0, 0 );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isArrayCamera = true;\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// private method\n\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\nclass WebXRDepthSensing {\n\n\tconstructor() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t\tthis.depthNear = 0;\n\t\tthis.depthFar = 0;\n\n\t}\n\n\tinit( renderer, depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new Texture();\n\n\t\t\tconst texProps = renderer.properties.get( texture );\n\t\t\ttexProps.__webglTexture = depthData.texture;\n\n\t\t\tif ( ( depthData.depthNear != renderState.depthNear ) || ( depthData.depthFar != renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\t\tcameraXR.layers.enable( 1 );\n\t\tcameraXR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\t\t\t\tif ( session.renderState.layers === undefined ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === - 1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tcamera.near = depthSensing.depthNear;\n\t\t\t\tcamera.far = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t\tcameraL.near = _currentDepthNear;\n\t\t\t\tcameraL.far = _currentDepthFar;\n\t\t\t\tcameraR.near = _currentDepthNear;\n\t\t\t\tcameraR.far = _currentDepthFar;\n\n\t\t\t\tcameraL.updateProjectionMatrix();\n\t\t\t\tcameraR.updateProjectionMatrix();\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\n\t\t\t\tif ( enabledFeatures && enabledFeatures.includes( 'depth-sensing' ) ) {\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( renderer, depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= - 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= - 1; _e1.y *= - 1; _e1.z *= - 1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= - 1;\n\t\t\t\t_e1.z *= - 1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === - 1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\nclass WebGLRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t} = parameters;\n\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = canvas;\n\n\t\t// Debug configuration container\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = NoToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = - 1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl );\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t_this.capabilities = capabilities;\n\t\t\t_this.extensions = extensions;\n\t\t\t_this.properties = properties;\n\t\t\t_this.renderLists = renderLists;\n\t\t\t_this.shadowMap = shadowMap;\n\t\t\t_this.state = state;\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\tthis.xr = xr;\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor.apply( background, arguments );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t\t};\n\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = targetFormat === RGBAIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RGIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RedIntegerFormat;\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = targetType === UnsignedByteType ||\n\t\t\t\t\t\ttargetType === UnsignedIntType ||\n\t\t\t\t\t\ttargetType === UnsignedShortType ||\n\t\t\t\t\t\ttargetType === UnsignedInt248Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort4444Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort5551Type;\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t//\n\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\trenderStateStack.pop();\n\t\t\tcurrentRenderState = null;\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z, activeViewport.w );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst object = renderItem.object;\n\t\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\t\tconst material = renderItem.material;\n\t\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst object = renderItem.object;\n\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\t\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\t\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\n\t\t\t\t\t\t} finally {\n\n\t\t\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn buffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\t// support previous signature with position first\n\t\t\tif ( texture.isTexture !== true ) {\n\n\t\t\t\t// @deprecated, r165\n\t\t\t\twarnOnce( 'WebGLRenderer: copyFramebufferToTexture function signature has changed.' );\n\n\t\t\t\tposition = arguments[ 0 ] || null;\n\t\t\t\ttexture = arguments[ 1 ];\n\n\t\t\t}\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {\n\n\t\t\t// support previous signature with dstPosition first\n\t\t\tif ( srcTexture.isTexture !== true ) {\n\n\t\t\t\t// @deprecated, r165\n\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed.' );\n\n\t\t\t\tdstPosition = arguments[ 0 ] || null;\n\t\t\t\tsrcTexture = arguments[ 1 ];\n\t\t\t\tdstTexture = arguments[ 2 ];\n\t\t\t\tlevel = arguments[ 3 ] || 0;\n\t\t\t\tsrcRegion = null;\n\n\t\t\t}\n\n\t\t\tlet width, height, minX, minY;\n\t\t\tlet dstX, dstY;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\n\t\t\t} else {\n\n\t\t\t\twidth = srcTexture.image.width;\n\t\t\t\theight = srcTexture.image.height;\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\n\t\t\t}\n\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t\t// As another texture upload may have changed pixelStorei\n\t\t\t// parameters, make sure they are correct for the dstTexture\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\n\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture3D = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {\n\n\t\t\t// support previous signature with source box first\n\t\t\tif ( srcTexture.isTexture !== true ) {\n\n\t\t\t\t// @deprecated, r165\n\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture3D function signature has changed.' );\n\n\t\t\t\tsrcRegion = arguments[ 0 ] || null;\n\t\t\t\tdstPosition = arguments[ 1 ] || null;\n\t\t\t\tsrcTexture = arguments[ 2 ];\n\t\t\t\tdstTexture = arguments[ 3 ];\n\t\t\t\tlevel = arguments[ 4 ] || 0;\n\n\t\t\t}\n\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.max.z - srcRegion.min.z;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.min.z;\n\n\t\t\t} else {\n\n\t\t\t\twidth = image.width;\n\t\t\t\theight = image.height;\n\t\t\t\tdepth = image.depth;\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tif ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = colorSpace === DisplayP3ColorSpace ? 'display-p3' : 'srgb';\n\t\tgl.unpackColorSpace = ColorManagement.workingColorSpace === LinearDisplayP3ColorSpace ? 'display-p3' : 'srgb';\n\n\t}\n\n}\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.isFogExp2 = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.isFog = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.backgroundBlurriness = 0;\n\t\tthis.backgroundIntensity = 1;\n\t\tthis.backgroundRotation = new Euler();\n\n\t\tthis.environmentIntensity = 1;\n\t\tthis.environmentRotation = new Euler();\n\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.isInterleavedBuffer = true;\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis._updateRange = { offset: 0, count: - 1 };\n\t\tthis.updateRanges = [];\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tget updateRange() {\n\n\t\twarnOnce( 'THREE.InterleavedBuffer: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159\n\t\treturn this._updateRange;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = material;\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t},\n\t\t\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = AttachedBindMode;\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\tapplyBoneTransform( index, vector ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( vector ).applyMatrix4( this.bindMatrix );\n\n\t\tvector.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\tvector.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn vector.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isDataTexture = true;\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix$1 = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix$1;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isInstancedMesh = true;\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\t\tthis.morphTexture = null;\n\n\t\tthis.count = count;\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$3 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$3.copy( this.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( drawRange, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: - 1,\n\t\t\t\tcount: - 1,\n\t\t\t\tz: - 1,\n\t\t\t\tindex: - 1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = drawRange.start;\n\t\titem.count = drawRange.count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _invMatrixWorld = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// @TODO: SkinnedMesh support?\n// @TODO: geometry.groups support?\n// @TODO: geometry.drawRange support?\n// @TODO: geometry.morphAttributes support?\n// @TODO: Support uniform parameter per geometry\n// @TODO: Add an \"optimize\" function to pack geometry and remove data gaps\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\nclass BatchedMesh extends Mesh {\n\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\tthis.isBatchedMesh = true;\n\t\tthis.perObjectFrustumCulled = true;\n\t\tthis.sortObjects = true;\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per object\n\t\tthis._drawInfo = [];\n\n\t\t// geometry information\n\t\tthis._drawRanges = [];\n\t\tthis._reservedRanges = [];\n\t\tthis._bounds = [];\n\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tthis._geometryInitialized = false;\n\t\tthis._geometryCount = 0;\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\t\tthis._visibilityChanged = true;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 matrices * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 matrices * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 matrices * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxIndexCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst geometryCount = this._geometryCount;\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst drawInfo = this._drawInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\tif ( drawInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst drawInfo = this._drawInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( drawInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\taddInstance( geometryId ) {\n\n\t\t// ensure we're not over geometry\n\t\tif ( this._drawInfo.length >= this._maxInstanceCount ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tthis._drawInfo.push( {\n\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\n\t\t} );\n\n\t\t// initialize the matrix\n\t\tconst drawId = this._drawInfo.length - 1;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = matricesTexture.image.data;\n\t\t_identityMatrix.toArray( matricesArray, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\treturn drawId;\n\n\t}\n\n\taddGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\t// ensure we're not over geometry\n\t\tif ( this._drawInfo.length >= this._maxInstanceCount ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\t// get the necessary range fo the geometry\n\t\tconst reservedRange = {\n\t\t\tvertexStart: - 1,\n\t\t\tvertexCount: - 1,\n\t\t\tindexStart: - 1,\n\t\t\tindexCount: - 1,\n\t\t};\n\n\t\tlet lastRange = null;\n\t\tconst reservedRanges = this._reservedRanges;\n\t\tconst drawRanges = this._drawRanges;\n\t\tconst bounds = this._bounds;\n\t\tif ( this._geometryCount !== 0 ) {\n\n\t\t\tlastRange = reservedRanges[ reservedRanges.length - 1 ];\n\n\t\t}\n\n\t\tif ( vertexCount === - 1 ) {\n\n\t\t\treservedRange.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\t} else {\n\n\t\t\treservedRange.vertexCount = vertexCount;\n\n\t\t}\n\n\t\tif ( lastRange === null ) {\n\n\t\t\treservedRange.vertexStart = 0;\n\n\t\t} else {\n\n\t\t\treservedRange.vertexStart = lastRange.vertexStart + lastRange.vertexCount;\n\n\t\t}\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tif ( indexCount\t=== - 1 ) {\n\n\t\t\t\treservedRange.indexCount = index.count;\n\n\t\t\t} else {\n\n\t\t\t\treservedRange.indexCount = indexCount;\n\n\t\t\t}\n\n\t\t\tif ( lastRange === null ) {\n\n\t\t\t\treservedRange.indexStart = 0;\n\n\t\t\t} else {\n\n\t\t\t\treservedRange.indexStart = lastRange.indexStart + lastRange.indexCount;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (\n\t\t\treservedRange.indexStart !== - 1 &&\n\t\t\treservedRange.indexStart + reservedRange.indexCount > this._maxIndexCount ||\n\t\t\treservedRange.vertexStart + reservedRange.vertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tconst geometryId = this._geometryCount;\n\t\tthis._geometryCount ++;\n\n\t\t// add the reserved range and draw range objects\n\t\treservedRanges.push( reservedRange );\n\t\tdrawRanges.push( {\n\t\t\tstart: hasIndex ? reservedRange.indexStart : reservedRange.vertexStart,\n\t\t\tcount: - 1\n\t\t} );\n\t\tbounds.push( {\n\t\t\tboxInitialized: false,\n\t\t\tbox: new Box3(),\n\n\t\t\tsphereInitialized: false,\n\t\t\tsphere: new Sphere()\n\t\t} );\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\treturn geometryId;\n\n\t}\n\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst reservedRange = this._reservedRanges[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > reservedRange.indexCount ||\n\t\t\tgeometry.attributes.position.count > reservedRange.vertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry over\n\t\tconst vertexStart = reservedRange.vertexStart;\n\t\tconst vertexCount = reservedRange.vertexCount;\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = vertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, vertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = reservedRange.indexStart;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedRange.indexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, reservedRange.indexCount );\n\n\t\t}\n\n\t\t// store the bounding boxes\n\t\tconst bound = this._bounds[ geometryId ];\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tbound.box.copy( geometry.boundingBox );\n\t\t\tbound.boxInitialized = true;\n\n\t\t} else {\n\n\t\t\tbound.boxInitialized = false;\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tbound.sphere.copy( geometry.boundingSphere );\n\t\t\tbound.sphereInitialized = true;\n\n\t\t} else {\n\n\t\t\tbound.sphereInitialized = false;\n\n\t\t}\n\n\t\t// set drawRange count\n\t\tconst drawRange = this._drawRanges[ geometryId ];\n\t\tconst posAttr = geometry.getAttribute( 'position' );\n\t\tdrawRange.count = hasIndex ? srcIndex.count : posAttr.count;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/*\n\tdeleteGeometry( geometryId ) {\n\n\t\t// TODO: delete geometry and associated instances\n\n\t}\n\t*/\n\n\t/*\n\tdeleteInstance( instanceId ) {\n\n\t\t// Note: User needs to call optimize() afterward to pack the data.\n\n\t\tconst drawInfo = this._drawInfo;\n\t\tif ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tdrawInfo[ instanceId ].active = false;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\t*/\n\n\t// get bounding box and compute it if it doesn't exist\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst bound = this._bounds[ geometryId ];\n\t\tconst box = bound.box;\n\t\tconst geometry = this.geometry;\n\t\tif ( bound.boxInitialized === false ) {\n\n\t\t\tbox.makeEmpty();\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst drawRange = this._drawRanges[ geometryId ];\n\t\t\tfor ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tbound.boxInitialized = true;\n\n\t\t}\n\n\t\ttarget.copy( box );\n\t\treturn target;\n\n\t}\n\n\t// get bounding sphere and compute it if it doesn't exist\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst bound = this._bounds[ geometryId ];\n\t\tconst sphere = bound.sphere;\n\t\tconst geometry = this.geometry;\n\t\tif ( bound.sphereInitialized === false ) {\n\n\t\t\tsphere.makeEmpty();\n\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst drawRange = this._drawRanges[ geometryId ];\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tbound.sphereInitialized = true;\n\n\t\t}\n\n\t\ttarget.copy( sphere );\n\t\treturn target;\n\n\t}\n\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\t// @TODO: Map geometryId to index of the arrays because\n\t\t//        optimize() can make geometryId mismatch the index\n\n\t\tconst drawInfo = this._drawInfo;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tif ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tconst drawInfo = this._drawInfo;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tif ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn matrix.fromArray( matricesArray, instanceId * 16 );\n\n\t}\n\n\tsetColorAt( instanceId, color ) {\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\t// @TODO: Map id to index of the arrays because\n\t\t//        optimize() can make id mismatch the index\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tconst colorsArray = this._colorsTexture.image.data;\n\t\tconst drawInfo = this._drawInfo;\n\t\tif ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tcolor.toArray( colorsArray, instanceId * 4 );\n\t\tcolorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( instanceId, color ) {\n\n\t\tconst colorsArray = this._colorsTexture.image.data;\n\t\tconst drawInfo = this._drawInfo;\n\t\tif ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn color.fromArray( colorsArray, instanceId * 4 );\n\n\t}\n\n\tsetVisibleAt( instanceId, value ) {\n\n\t\t// if the geometry is out of range, not active, or visibility state\n\t\t// does not change then return early\n\t\tconst drawInfo = this._drawInfo;\n\t\tif (\n\t\t\tinstanceId >= drawInfo.length ||\n\t\t\tdrawInfo[ instanceId ].active === false ||\n\t\t\tdrawInfo[ instanceId ].visible === value\n\t\t) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tdrawInfo[ instanceId ].visible = value;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\tgetVisibleAt( instanceId ) {\n\n\t\t// return early if the geometry is out of range or not active\n\t\tconst drawInfo = this._drawInfo;\n\t\tif ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn drawInfo[ instanceId ].visible;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst drawInfo = this._drawInfo;\n\t\tconst drawRanges = this._drawRanges;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\t\t\tconst drawRange = drawRanges[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );\n\n\t\t\t// ge the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._drawRanges = source._drawRanges.map( range => ( { ...range } ) );\n\t\tthis._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );\n\n\t\tthis._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );\n\t\tthis._bounds = source._bounds.map( bound => ( {\n\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\tbox: bound.box.clone(),\n\n\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\tsphere: bound.sphere.clone()\n\t\t} ) );\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._geometryCount = source._geometryCount;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst drawInfo = this._drawInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst drawRanges = this._drawRanges;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t_projScreenMatrix$2\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\trenderer.coordinateSystem\n\t\t\t);\n\n\t\t}\n\n\t\tlet count = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_invMatrixWorld.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );\n\t\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );\n\n\t\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( drawInfo[ i ].visible && drawInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! _frustum.intersectsSphere( _sphere$2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward );\n\t\t\t\t\t\t_renderList.push( drawRanges[ geometryId ], z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ count ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ count ] = item.count;\n\t\t\t\tindirectArray[ count ] = item.index;\n\t\t\t\tcount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( drawInfo[ i ].visible && drawInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! _frustum.intersectsSphere( _sphere$2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst range = drawRanges[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ count ] = range.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ count ] = range.count;\n\t\t\t\t\t\tindirectArray[ count ] = i;\n\t\t\t\t\t\tcount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = count;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: a,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoTexture = true;\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.isFramebufferTexture = true;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCompressedTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nclass CompressedArrayTexture extends CompressedTexture {\n\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\tthis.isCompressedArrayTexture = true;\n\t\tthis.image.depth = depth;\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\nclass CompressedCubeTexture extends CompressedTexture {\n\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\tthis.isCompressedCubeTexture = true;\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t *   p(0) = x0, p(1) = x1\n\t *  and\n\t *   p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n *  curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t// getPoint() depends on getLength\n\n\tgetLength() {\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\t// cacheLengths must be recalculated.\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t// Compute lengths and cache them\n\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\tgetCurveLengths() {\n\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tlength: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.4)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n           ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n           ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n           ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n            ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n            equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n *  curveSegments: <int>, // number of points on the curves\n *  steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n *  depth: <float>, // Depth to extrude the shape\n *\n *  bevelEnabled: <bool>, // turn on bevel\n *  bevelThickness: <float>, // how deep into the original shape bevel goes\n *  bevelSize: <float>, // how far from shape outline (including bevelOffset) is bevel\n *  bevelOffset: <float>, // how far from shape outline does bevel start\n *  bevelSegments: <int>, // number of bevel layers\n *\n *  extrudePath: <THREE.Curve> // curve to extrude shape along\n *\n *  UVGenerator: <Object> // object that provides UV generator functions\n *\n * }\n */\n\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t//  but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t/////  Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.anisotropyRotation = 0;\n\t\tthis.anisotropyMap = null;\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.iridescenceMap = null;\n\t\tthis.iridescenceIOR = 1.3;\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = Infinity;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineDashedMaterial = true;\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// converts an array to a specific type\nfunction convertArray( array, type, forceClone ) {\n\n\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t! forceClone && array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) &&\n\t\t! ( object instanceof DataView );\n\n}\n\n// returns an array by which times and values can be sorted\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n// uses the array previously returned by 'getKeyframeOrder' to sort data\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n// function for parsing AOS keyframe formats\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\nconst AnimationUtils = {\n\tconvertArray: convertArray,\n\tisTypedArray: isTypedArray,\n\tgetKeyframeOrder: getKeyframeOrder,\n\tsortedArray: sortedArray,\n\tflattenJSON: flattenJSON,\n\tsubclip: subclip,\n\tmakeClipAdditive: makeClipAdditive\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t// Template methods for derived classes:\n\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = - 0;\n\t\tthis._offsetPrev = - 0;\n\t\tthis._weightNext = - 0;\n\t\tthis._offsetNext = - 0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t// No interpolation parameter because only InterpolateDiscrete is valid.\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t// No interpolation parameter because only InterpolateDiscrete is valid.\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name = '', duration = - 1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, - 1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.intensity = 1;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.isSpotLightShadow = true;\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay;\n\n\t\tthis.map = null;\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t//  xzXZ\n\t\t\t//   y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay;\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Primary reference:\n *   https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n *   https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isLightProbe = true;\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = MaterialLoader.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) { // @deprecated, r165\n\n\t\tconsole.warn( 'THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead.' );\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._visibility = data.visibility;\n\t\t\t\tobject._active = data.active;\n\t\t\t\tobject._bounds = data.bounds.map( bound => {\n\n\t\t\t\t\tconst box = new Box3();\n\t\t\t\t\tbox.min.fromArray( bound.boxMin );\n\t\t\t\t\tbox.max.fromArray( bound.boxMax );\n\n\t\t\t\t\tconst sphere = new Sphere();\n\t\t\t\t\tsphere.radius = bound.sphereRadius;\n\t\t\t\t\tsphere.center.fromArray( bound.sphereCenter );\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\t\t\tbox: box,\n\n\t\t\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\t\t\tsphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\t\t\t\tif ( data.colorsTexture !== undefined ) object._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} ).catch( e => {\n\n\t\t\t\t\tif ( onError ) onError( e );\n\n\t\t\t\t} );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tCache.remove( url );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( url, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nlet _context;\n\nclass AudioContext {\n\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu<i>'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu<i>' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.warn( 'THREE.PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n *  - Add objects you would otherwise pass as 'root' to the\n *    constructor or the .clipAction method of AnimationMixer.\n *\n *  - Instead pass this object as 'root'.\n *\n *  - You can also add and remove objects later when the mixer\n *    is running.\n *\n * Note:\n *\n *    Objects of this class appear as one object to the mixer,\n *    so cache control of the individual objects must be done\n *    on the group.\n *\n * Limitation:\n *\n *  - The animated properties must be compatible among the\n *    all objects in the group.\n *\n *  - A single property can either be controlled through a\n *    target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = - 1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions |  inactive actions  ]\n\t\t// [  active actions >| inactive actions ]\n\t\t//                 s        a\n\t\t//                  <-swap->\n\t\t//                 a        s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [  active actions  | inactive actions ]\n\t\t// [ active actions |< inactive actions  ]\n\t\t//        a        s\n\t\t//         <-swap->\n\t\t//        s        a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\nclass UniformsGroup extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isUniformsGroup = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.uniforms = [];\n\n\t}\n\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== - 1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.isGLBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, - 1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * phi (the polar angle) is measured from the positive y-axis. The positive y-axis is up.\n * theta (the azimuthal angle) is measured from the positive z-axis.\n */\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix2 {\n\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox2 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success    or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t//  with the horizontal line through inPt, left of inPt\n\t\t\t//  not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget { // @deprecated, r162\n\n\tconstructor( width = 1, height = 1, count = 1, options = {} ) {\n\n\t\tconsole.warn( 'THREE.WebGLMultipleRenderTargets has been deprecated and will be removed in r172. Use THREE.WebGLRenderTarget and set the \"count\" parameter to enable MRT.' );\n\n\t\tsuper( width, height, { ...options, count } );\n\n\t\tthis.isWebGLMultipleRenderTargets = true;\n\n\t}\n\n\tget texture() {\n\n\t\treturn this.textures;\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DisplayP3ColorSpace, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearDisplayP3ColorSpace, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, P3Primaries, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, Rec709Primaries, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, createCanvasElement };\n","import {\n\tBoxGeometry,\n\tVector3\n} from 'three';\n\nconst _tempNormal = new Vector3();\n\nfunction getUv( faceDirVector, normal, uvAxis, projectionAxis, radius, sideLength ) {\n\n\tconst totArcLength = 2 * Math.PI * radius / 4;\n\n\t// length of the planes between the arcs on each axis\n\tconst centerLength = Math.max( sideLength - 2 * radius, 0 );\n\tconst halfArc = Math.PI / 4;\n\n\t// Get the vector projected onto the Y plane\n\t_tempNormal.copy( normal );\n\t_tempNormal[ projectionAxis ] = 0;\n\t_tempNormal.normalize();\n\n\t// total amount of UV space alloted to a single arc\n\tconst arcUvRatio = 0.5 * totArcLength / ( totArcLength + centerLength );\n\n\t// the distance along one arc the point is at\n\tconst arcAngleRatio = 1.0 - ( _tempNormal.angleTo( faceDirVector ) / halfArc );\n\n\tif ( Math.sign( _tempNormal[ uvAxis ] ) === 1 ) {\n\n\t\treturn arcAngleRatio * arcUvRatio;\n\n\t} else {\n\n\t\t// total amount of UV space alloted to the plane between the arcs\n\t\tconst lenUv = centerLength / ( totArcLength + centerLength );\n\t\treturn lenUv + arcUvRatio + arcUvRatio * ( 1.0 - arcAngleRatio );\n\n\t}\n\n}\n\nclass RoundedBoxGeometry extends BoxGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, segments = 2, radius = 0.1 ) {\n\n\t\t// ensure segments is odd so we have a plane connecting the rounded corners\n\t\tsegments = segments * 2 + 1;\n\n\t\t// ensure radius isn't bigger than shortest side\n\t\tradius = Math.min( width / 2, height / 2, depth / 2, radius );\n\n\t\tsuper( 1, 1, 1, segments, segments, segments );\n\n\t\t// if we just have one segment we're the same as a regular box\n\t\tif ( segments === 1 ) return;\n\n\t\tconst geometry2 = this.toNonIndexed();\n\n\t\tthis.index = null;\n\t\tthis.attributes.position = geometry2.attributes.position;\n\t\tthis.attributes.normal = geometry2.attributes.normal;\n\t\tthis.attributes.uv = geometry2.attributes.uv;\n\n\t\t//\n\n\t\tconst position = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst box = new Vector3( width, height, depth ).divideScalar( 2 ).subScalar( radius );\n\n\t\tconst positions = this.attributes.position.array;\n\t\tconst normals = this.attributes.normal.array;\n\t\tconst uvs = this.attributes.uv.array;\n\n\t\tconst faceTris = positions.length / 6;\n\t\tconst faceDirVector = new Vector3();\n\t\tconst halfSegmentSize = 0.5 / segments;\n\n\t\tfor ( let i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\tposition.fromArray( positions, i );\n\t\t\tnormal.copy( position );\n\t\t\tnormal.x -= Math.sign( normal.x ) * halfSegmentSize;\n\t\t\tnormal.y -= Math.sign( normal.y ) * halfSegmentSize;\n\t\t\tnormal.z -= Math.sign( normal.z ) * halfSegmentSize;\n\t\t\tnormal.normalize();\n\n\t\t\tpositions[ i + 0 ] = box.x * Math.sign( position.x ) + normal.x * radius;\n\t\t\tpositions[ i + 1 ] = box.y * Math.sign( position.y ) + normal.y * radius;\n\t\t\tpositions[ i + 2 ] = box.z * Math.sign( position.z ) + normal.z * radius;\n\n\t\t\tnormals[ i + 0 ] = normal.x;\n\t\t\tnormals[ i + 1 ] = normal.y;\n\t\t\tnormals[ i + 2 ] = normal.z;\n\n\t\t\tconst side = Math.floor( i / faceTris );\n\n\t\t\tswitch ( side ) {\n\n\t\t\t\tcase 0: // right\n\n\t\t\t\t\t// generate UVs along Z then Y\n\t\t\t\t\tfaceDirVector.set( 1, 0, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = getUv( faceDirVector, normal, 'z', 'y', radius, depth );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'z', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // left\n\n\t\t\t\t\t// generate UVs along Z then Y\n\t\t\t\t\tfaceDirVector.set( - 1, 0, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'z', 'y', radius, depth );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'z', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // top\n\n\t\t\t\t\t// generate UVs along X then Z\n\t\t\t\t\tfaceDirVector.set( 0, 1, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'x', 'z', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = getUv( faceDirVector, normal, 'z', 'x', radius, depth );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // bottom\n\n\t\t\t\t\t// generate UVs along X then Z\n\t\t\t\t\tfaceDirVector.set( 0, - 1, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'x', 'z', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'z', 'x', radius, depth );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 4: // front\n\n\t\t\t\t\t// generate UVs along X then Y\n\t\t\t\t\tfaceDirVector.set( 0, 0, 1 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'x', 'y', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'x', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 5: // back\n\n\t\t\t\t\t// generate UVs along X then Y\n\t\t\t\t\tfaceDirVector.set( 0, 0, - 1 );\n\t\t\t\t\tuvs[ j + 0 ] = getUv( faceDirVector, normal, 'x', 'y', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'x', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { RoundedBoxGeometry };\n","/*!\nfflate - fast JavaScript compression/decompression\n<https://101arrowz.github.io/fflate>\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.8.2\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n        c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n    ], { type: 'text/javascript' }))));\n    w.onmessage = function (e) {\n        var d = e.data, ed = d.$e$;\n        if (ed) {\n            var err = new Error(ed[0]);\n            err['code'] = ed[1];\n            err.stack = ed[2];\n            cb(err, null);\n        }\n        else\n            cb(null, d);\n    };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new i32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i) {\n        if (cd[i])\n            ++l[cd[i] - 1];\n    }\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 1; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n    UnexpectedEOF: 0,\n    InvalidBlockType: 1,\n    InvalidLengthLiteral: 2,\n    InvalidDistance: 3,\n    StreamFinished: 4,\n    NoStreamHandler: 5,\n    InvalidHeader: 6,\n    NoCallback: 7,\n    InvalidUTF8: 8,\n    ExtraFieldTooLong: 9,\n    InvalidDate: 10,\n    FilenameTooLong: 11,\n    StreamFinishing: 12,\n    InvalidZipData: 13,\n    UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n    'unexpected EOF',\n    'invalid block type',\n    'invalid length/literal',\n    'invalid distance',\n    'stream finished',\n    'no stream handler',\n    ,\n    'no callback',\n    'invalid UTF-8 data',\n    'extra field too long',\n    'date not in range 1980-2099',\n    'filename too long',\n    'stream finishing',\n    'invalid zip data'\n    // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n    var e = new Error(msg || ec[ind]);\n    e.code = ind;\n    if (Error.captureStackTrace)\n        Error.captureStackTrace(e, err);\n    if (!nt)\n        throw e;\n    return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n    // source length       dict length\n    var sl = dat.length, dl = dict ? dict.length : 0;\n    if (!sl || st.f && !st.l)\n        return buf || new u8(0);\n    var noBuf = !buf;\n    // have to estimate size\n    var resize = noBuf || st.i != 2;\n    // no state\n    var noSt = st.i;\n    // Assumes roughly 33% compression ratio average\n    if (noBuf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                // ensure size\n                if (resize)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8, st.f = final;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                err(1);\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17\n        if (resize)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n            if (!c)\n                err(2);\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n                if (!d)\n                    err(3);\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                if (resize)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                if (bt < dt) {\n                    var shift = dl - dt, dend = Math.min(dt, end);\n                    if (shift + bt < 0)\n                        err(3);\n                    for (; bt < dend; ++bt)\n                        buf[bt] = dict[shift + bt];\n                }\n                for (; bt < end; ++bt)\n                    buf[bt] = buf[bt - dt];\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    // don't reallocate for streams or user buffers\n    return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n    d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return { t: et, l: 0 };\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return { t: v, l: 1 };\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n    var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n    var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n    var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        ++lcfreq[lclt[i] & 31];\n    for (var i = 0; i < lcdt.length; ++i)\n        ++lcfreq[lcdt[i] & 31];\n    var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n    if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        var sym = syms[i];\n        if (sym > 255) {\n            var len = (sym >> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n            var dst = sym & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[sym]), p += ll[sym];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n    var s = st.z || dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var lst = st.l;\n    var pos = (st.r || 0) & 7;\n    if (lvl) {\n        if (pos)\n            w[0] = st.r >> 3;\n        var opt = deo[lvl - 1];\n        var n = opt >> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new i32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index          l/lind  waitdx          blkpos\n        var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n        for (; i + 2 < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = i - dif + j & 32767;\n                                    var pti = prev[ti];\n                                    var cd = ti - pti & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += imod - pimod & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one int32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        for (i = Math.max(i, wi); i < s; ++i) {\n            syms[li++] = dat[i];\n            ++lf[dat[i]];\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        if (!lst) {\n            st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n            // shft(pos) now 1 less if pos & 7 != 0\n            pos -= 7;\n            st.h = head, st.p = prev, st.i = i, st.w = wi;\n        }\n    }\n    else {\n        for (var i = st.w || 0; i < s + lst; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e >= s) {\n                // write final block\n                w[(pos / 8) | 0] = lst;\n                e = s;\n            }\n            pos = wfblk(w, pos + 1, dat.subarray(i, e));\n        }\n        st.i = s;\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new Int32Array(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && -306674912) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Adler32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length | 0;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    if (!st) {\n        st = { l: 1 };\n        if (opt.dictionary) {\n            var dict = opt.dictionary.subarray(-32768);\n            var newDat = new u8(dict.length + dat.length);\n            newDat.set(dict);\n            newDat.set(dat, dict.length);\n            dat = newDat;\n            st.w = dict.length;\n        }\n    }\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k].buffer) {\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n        }\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            fnStr = wcln(fns[i], fnStr, td_1);\n        ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n    }\n    var td = mrg({}, ch[id].e);\n    return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n    out: o.size && new u8(o.size),\n    dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) {\n        if (ev.data.length) {\n            strm.push(ev.data[0], ev.data[1]);\n            postMessage([ev.data[0].length]);\n        }\n        else\n            strm.flush();\n    };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else if (!Array.isArray(dat))\n            ext(dat);\n        else if (dat.length == 1) {\n            strm.queuedSize -= dat[0];\n            if (strm.ondrain)\n                strm.ondrain(dat[0]);\n        }\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.queuedSize = 0;\n    strm.push = function (d, f) {\n        if (!strm.ondata)\n            err(5);\n        if (t)\n            strm.ondata(err(4, 0, 1), null, !!f);\n        strm.queuedSize += d.length;\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n    if (flush) {\n        strm.flush = function () { w.postMessage([]); };\n    }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        err(6, 'invalid gzip data');\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += (d[10] | d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n    c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n    if (o.dictionary) {\n        var h = adler();\n        h.p(o.dictionary);\n        wbytes(c, 2, h.d());\n    }\n};\n// zlib start\nvar zls = function (d, dict) {\n    if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        err(6, 'invalid zlib data');\n    if ((d[1] >> 5 & 1) == +!dict)\n        err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n    return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n    if (typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n        this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n        // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n        // 98304 = 32768 (lookback) + 65536 (common chunk size)\n        this.b = new u8(98304);\n        if (this.o.dictionary) {\n            var dict = this.o.dictionary.subarray(-32768);\n            this.b.set(dict, 32768 - dict.length);\n            this.s.i = 32768 - dict.length;\n        }\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        var endLen = chunk.length + this.s.z;\n        if (endLen > this.b.length) {\n            if (endLen > 2 * this.b.length - 32768) {\n                var newBuf = new u8(endLen & -32768);\n                newBuf.set(this.b.subarray(0, this.s.z));\n                this.b = newBuf;\n            }\n            var split = this.b.length - this.s.z;\n            this.b.set(chunk.subarray(0, split), this.s.z);\n            this.s.z = this.b.length;\n            this.p(this.b, false);\n            this.b.set(this.b.subarray(-32768));\n            this.b.set(chunk.subarray(split), 32768);\n            this.s.z = chunk.length - split + 32768;\n            this.s.i = 32766, this.s.w = 32768;\n        }\n        else {\n            this.b.set(chunk, this.s.z);\n            this.s.z += chunk.length;\n        }\n        this.s.l = final & 1;\n        if (this.s.z > this.s.w + 8191 || final) {\n            this.p(this.b, final || false);\n            this.s.w = this.s.i, this.s.i -= 2;\n        }\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * deflated output for small inputs.\n     */\n    Deflate.prototype.flush = function () {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        this.p(this.b, false);\n        this.s.w = this.s.i, this.s.i -= 2;\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6, 1);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    function Inflate(opts, cb) {\n        // no StrmOpt here to avoid adding to workerizer\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n        this.s = { i: 0, b: dict ? dict.length : 0 };\n        this.o = new u8(32768);\n        this.p = new u8(0);\n        if (dict)\n            this.o.set(dict);\n    }\n    Inflate.prototype.e = function (c) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        if (!this.p.length)\n            this.p = c;\n        else if (c.length) {\n            var n = new u8(this.p.length + c.length);\n            n.set(this.p), n.set(c, this.p.length), this.p = n;\n        }\n    };\n    Inflate.prototype.c = function (final) {\n        this.s.i = +(this.d = final || false);\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.s, this.o);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    function AsyncInflate(opts, cb) {\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Inflate(ev.data);\n            onmessage = astrm(strm);\n        }, 7, 0);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n    return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        this.l += chunk.length;\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * GZIPped output for small inputs.\n     */\n    Gzip.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8, 1);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    function Gunzip(opts, cb) {\n        this.v = 1;\n        this.r = 0;\n        Inflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        this.r += chunk.length;\n        if (this.v) {\n            var p = this.p.subarray(this.v - 1);\n            var s = p.length > 3 ? gzs(p) : 4;\n            if (s > p.length) {\n                if (!final)\n                    return;\n            }\n            else if (this.v > 1 && this.onmember) {\n                this.onmember(this.r - p.length);\n            }\n            this.p = p.subarray(s), this.v = 0;\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n        // process concatenated GZIP\n        if (this.s.f && !this.s.l && !final) {\n            this.v = shft(this.s.p) + 9;\n            this.s = { i: 0 };\n            this.o = new u8(0);\n            this.push(new u8(0), final);\n        }\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    function AsyncGunzip(opts, cb) {\n        var _this = this;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gunzip(ev.data);\n            strm.onmember = function (offset) { return postMessage(offset); };\n            onmessage = astrm(strm);\n        }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n    var st = gzs(data);\n    if (st + 8 > data.length)\n        err(6, 'invalid gzip data');\n    return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * zlibbed output for small inputs.\n     */\n    Zlib.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10, 1);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    function Unzlib(opts, cb) {\n        Inflate.call(this, opts, cb);\n        this.v = opts && opts.dictionary ? 2 : 1;\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 6 && !final)\n                return;\n            this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                err(6, 'invalid zlib data');\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    function AsyncUnzlib(opts, cb) {\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Unzlib(ev.data);\n            onmessage = astrm(strm);\n        }, 11, 0);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n    return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    function Decompress(opts, cb) {\n        this.o = StrmOpt.call(this, opts, cb) || {};\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n    }\n    // init substream\n    // overriden by AsyncDecompress\n    Decompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (dat, final) {\n            _this.ondata(dat, final);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(this.o)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(this.o)\n                        : new this.Z(this.o);\n                this.i();\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    function AsyncDecompress(opts, cb) {\n        Decompress.call(this, opts, cb);\n        this.queuedSize = 0;\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n    }\n    AsyncDecompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        };\n        this.s.ondrain = function (size) {\n            _this.queuedSize -= size;\n            if (_this.ondrain)\n                _this.ondrain(size);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        this.queuedSize += chunk.length;\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, opts)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, opts)\n            : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k, op = o;\n        if (Array.isArray(val))\n            op = mrg(o, val[1]), val = val[0];\n        if (val instanceof u8)\n            t[n] = [val, op];\n        else {\n            t[n += '/'] = [new u8(0), op];\n            fltn(val, n, t, o);\n        }\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return { s: r, r: slc(d, i - 1) };\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    err(8);\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            err(4);\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (final) {\n            if (r.length)\n                err(8);\n            this.p = null;\n        }\n        else\n            this.p = r;\n        this.ondata(s, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td) {\n        return td.decode(dat);\n    }\n    else {\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (r.length)\n            err(8);\n        return s;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n    var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                err(9);\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        err(10);\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n    if (c != -1) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this = this;\n        if (!this.ondata)\n            err(5);\n        // finishing or finished\n        if (this.d & 2)\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n        else {\n            var f = strToU8(file.filename), fl_1 = f.length;\n            var com = file.comment, o = com && strToU8(com);\n            var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n            var hl_1 = fl_1 + exfl(file.extra) + 30;\n            if (fl_1 > 65535)\n                this.ondata(err(11, 0, 1), null, false);\n            var header = new u8(hl_1);\n            wzh(header, 0, file, f, u, -1);\n            var chks_1 = [header];\n            var pAll_1 = function () {\n                for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n                    var chk = chks_2[_i];\n                    _this.ondata(null, chk, false);\n                }\n                chks_1 = [];\n            };\n            var tr_1 = this.d;\n            this.d = 0;\n            var ind_1 = this.u.length;\n            var uf_1 = mrg(file, {\n                f: f,\n                u: u,\n                o: o,\n                t: function () {\n                    if (file.terminate)\n                        file.terminate();\n                },\n                r: function () {\n                    pAll_1();\n                    if (tr_1) {\n                        var nxt = _this.u[ind_1 + 1];\n                        if (nxt)\n                            nxt.r();\n                        else\n                            _this.d = 1;\n                    }\n                    tr_1 = 1;\n                }\n            });\n            var cl_1 = 0;\n            file.ondata = function (err, dat, final) {\n                if (err) {\n                    _this.ondata(err, dat, final);\n                    _this.terminate();\n                }\n                else {\n                    cl_1 += dat.length;\n                    chks_1.push(dat);\n                    if (final) {\n                        var dd = new u8(16);\n                        wbytes(dd, 0, 0x8074B50);\n                        wbytes(dd, 4, file.crc);\n                        wbytes(dd, 8, cl_1);\n                        wbytes(dd, 12, file.size);\n                        chks_1.push(dd);\n                        uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n                        if (tr_1)\n                            uf_1.r();\n                        tr_1 = 1;\n                    }\n                    else if (tr_1)\n                        pAll_1();\n                }\n            };\n            this.u.push(uf_1);\n        }\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this = this;\n        if (this.d & 2) {\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n            return;\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this.d & 1))\n                        return;\n                    _this.u.splice(-1, 1);\n                    _this.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cbd(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cbd(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cbd(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl(err(11, 0, 1), null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            err(11);\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (data, final) {\n        this.ondata(null, data, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this = this;\n        this.i = new Inflate(function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (data, final) {\n        try {\n            this.i.push(data, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (data, final) {\n        if (this.i.terminate)\n            data = slc(data, 0);\n        this.i.push(data, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this = this;\n        if (!this.onfile)\n            err(5);\n        if (!this.p)\n            err(4);\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var _a;\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_3 = [];\n                        this_1.k.unshift(chks_3);\n                        f = 2;\n                        var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        if (sc_1 == 4294967295) {\n                            _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n                        }\n                        else if (dd)\n                            sc_1 = -1;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    err(5);\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this.o[cmp_1];\n                                    if (!ctr)\n                                        file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n                                        var dat = chks_4[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this.k[0] == chks_3 && _this.c)\n                                        _this.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                err(13);\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cbd(err(13, 0, 1), null);\n            return tAll;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (lft) {\n        var c = lft;\n        var o = b4(data, e + 16);\n        var z = o == 4294967295 || c == 65535;\n        if (z) {\n            var ze = b4(data, e - 12);\n            z = b4(data, ze) == 0x6064B50;\n            if (z) {\n                c = lft = b4(data, ze + 32);\n                o = b4(data, ze + 48);\n            }\n        }\n        var fltr = opts && opts.filter;\n        var _loop_3 = function (i) {\n            var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n            o = no;\n            var cbl = function (e, d) {\n                if (e) {\n                    tAll();\n                    cbd(e, null);\n                }\n                else {\n                    if (d)\n                        files[fn] = d;\n                    if (!--lft)\n                        cbd(null, files);\n                }\n            };\n            if (!fltr || fltr({\n                name: fn,\n                size: sc,\n                originalSize: su,\n                compression: c_1\n            })) {\n                if (!c_1)\n                    cbl(null, slc(data, b, b + sc));\n                else if (c_1 == 8) {\n                    var infl = data.subarray(b, b + sc);\n                    // Synchronously decompress under 512KB, or barely-compressed data\n                    if (su < 524288 || sc > 0.8 * su) {\n                        try {\n                            cbl(null, inflateSync(infl, { out: new u8(su) }));\n                        }\n                        catch (e) {\n                            cbl(e, null);\n                        }\n                    }\n                    else\n                        term.push(inflate(infl, { size: su }, cbl));\n                }\n                else\n                    cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n            }\n            else\n                cbl(null, null);\n        };\n        for (var i = 0; i < c; ++i) {\n            _loop_3(i);\n        }\n    }\n    else\n        cbd(null, {});\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            err(13);\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295 || c == 65535;\n    if (z) {\n        var ze = b4(data, e - 12);\n        z = b4(data, ze) == 0x6064B50;\n        if (z) {\n            c = b4(data, ze + 32);\n            o = b4(data, ze + 48);\n        }\n    }\n    var fltr = opts && opts.filter;\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!fltr || fltr({\n            name: fn,\n            size: sc,\n            originalSize: su,\n            compression: c_2\n        })) {\n            if (!c_2)\n                files[fn] = slc(data, b, b + sc);\n            else if (c_2 == 8)\n                files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n            else\n                err(14, 'unknown compression type ' + c_2);\n        }\n    }\n    return files;\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i ).convertSRGBToLinear();\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\nclass SVGLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t// Default dots per inch\n\t\tthis.defaultDPI = 90;\n\n\t\t// Accepted units: 'mm', 'cm', 'in', 'pt', 'pc', 'px'\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length  )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute θ1 and Δθ\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from  pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a sinle value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t//  | cosθ sx   -sinθ sy |\n\t\t\t\t//  | sinθ sx    cosθ sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tanθ = sinθ / cosθ; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t//    [ A  B ]\n\t\t//    [ B  C ]\n\t\t// in the form\n\t\t//    [ A  B ]  =  [ cs  -sn ] [ rt1   0  ] [  cs  sn ]\n\t\t//    [ B  C ]     [ sn   cs ] [  0   rt2 ] [ -sn  cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\tstatic createShapes( shapePath ) {\n\n\t\t// Param shapePath: a shapepath as returned by the parse function of this class\n\t\t// Returns Shape object\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that oter path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t      \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\t// Param width: Stroke width\n\t\t// Param color: As returned by THREE.Color.getStyle()\n\t\t// Param lineJoin: One of \"round\", \"bevel\", \"miter\" or \"miter-limit\"\n\t\t// Param lineCap: One of \"round\", \"square\" or \"butt\"\n\t\t// Param miterLimit: Maximum join length, in multiples of the \"width\" parameter (join is truncated if it exceeds that distance)\n\t\t// Returns style object\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\t// Generates a stroke with some width around the given path.\n\t\t// The path can be open or closed (last point equals to first point)\n\t\t// Param points: Array of Vector2D (the path). Minimum 2 points.\n\t\t// Param style: Object with SVG properties as returned by SVGLoader.getStrokeStyle(), or SVGLoader.parse() in the path.userData.style object\n\t\t// Params arcDivisions: Arc divisions for round joins and endcaps. (Optional)\n\t\t// Param minDistance: Points closer to this distance will be merged. (Optional)\n\t\t// Returns BufferGeometry with stroke triangles (In plane z = 0). UV coordinates are generated ('u' along path. 'v' across it, from left to right)\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param  {Array<BufferGeometry>} geometries\n * @param  {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '.  .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tPlaneGeometry,\n\tShaderMaterial,\n\tUniform,\n\tMesh,\n\tPerspectiveCamera,\n\tScene,\n\tWebGLRenderer,\n\tCanvasTexture,\n\tSRGBColorSpace\n} from 'three';\n\nlet _renderer;\nlet fullscreenQuadGeometry;\nlet fullscreenQuadMaterial;\nlet fullscreenQuad;\n\nexport function decompress( texture, maxTextureSize = Infinity, renderer = null ) {\n\n\tif ( ! fullscreenQuadGeometry ) fullscreenQuadGeometry = new PlaneGeometry( 2, 2, 1, 1 );\n\tif ( ! fullscreenQuadMaterial ) fullscreenQuadMaterial = new ShaderMaterial( {\n\t\tuniforms: { blitTexture: new Uniform( texture ) },\n\t\tvertexShader: `\n\t\t\tvarying vec2 vUv;\n\t\t\tvoid main(){\n\t\t\t\tvUv = uv;\n\t\t\t\tgl_Position = vec4(position.xy * 1.0,0.,.999999);\n\t\t\t}`,\n\t\tfragmentShader: `\n\t\t\tuniform sampler2D blitTexture; \n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main(){ \n\t\t\t\tgl_FragColor = vec4(vUv.xy, 0, 1);\n\t\t\t\t\n\t\t\t\t#ifdef IS_SRGB\n\t\t\t\tgl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );\n\t\t\t\t#else\n\t\t\t\tgl_FragColor = texture2D( blitTexture, vUv);\n\t\t\t\t#endif\n\t\t\t}`\n\t} );\n\n\tfullscreenQuadMaterial.uniforms.blitTexture.value = texture;\n\tfullscreenQuadMaterial.defines.IS_SRGB = texture.colorSpace == SRGBColorSpace;\n\tfullscreenQuadMaterial.needsUpdate = true;\n\n\tif ( ! fullscreenQuad ) {\n\n\t\tfullscreenQuad = new Mesh( fullscreenQuadGeometry, fullscreenQuadMaterial );\n\t\tfullscreenQuad.frustumCulled = false;\n\n\t}\n\n\tconst _camera = new PerspectiveCamera();\n\tconst _scene = new Scene();\n\t_scene.add( fullscreenQuad );\n\n\tif ( renderer === null ) {\n\n\t\trenderer = _renderer = new WebGLRenderer( { antialias: false } );\n\n\t}\n\n\tconst width = Math.min( texture.image.width, maxTextureSize );\n\tconst height = Math.min( texture.image.height, maxTextureSize );\n\n\trenderer.setSize( width, height );\n\trenderer.clear();\n\trenderer.render( _scene, _camera );\n\n\tconst canvas = document.createElement( 'canvas' );\n\tconst context = canvas.getContext( '2d' );\n\n\tcanvas.width = width;\n\tcanvas.height = height;\n\n\tcontext.drawImage( renderer.domElement, 0, 0, width, height );\n\n\tconst readableTexture = new CanvasTexture( canvas );\n\n\treadableTexture.minFilter = texture.minFilter;\n\treadableTexture.magFilter = texture.magFilter;\n\treadableTexture.wrapS = texture.wrapS;\n\treadableTexture.wrapT = texture.wrapT;\n\treadableTexture.name = texture.name;\n\n\tif ( _renderer ) {\n\n\t\t_renderer.forceContextLoss();\n\t\t_renderer.dispose();\n\t\t_renderer = null;\n\n\t}\n\n\treturn readableTexture;\n\n}\n","const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n\tMathUtils\n};\n","var Module = (() => {\n\tvar _scriptDir = import.meta.url;\n\n\treturn async function (moduleArg = {}) {\n\t\tvar Module = moduleArg;\n\t\tvar readyPromiseResolve, readyPromiseReject;\n\t\tModule['ready'] = new Promise((resolve, reject) => {\n\t\t\treadyPromiseResolve = resolve;\n\t\t\treadyPromiseReject = reject;\n\t\t});\n\t\tvar _ManifoldInitialized = false;\n\t\tModule.setup = function () {\n\t\t\tif (_ManifoldInitialized) return;\n\t\t\t_ManifoldInitialized = true;\n\t\t\tfunction toVec(vec, list, f = (x) => x) {\n\t\t\t\tif (list) {\n\t\t\t\t\tfor (let x of list) {\n\t\t\t\t\t\tvec.push_back(f(x));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn vec;\n\t\t\t}\n\t\t\tfunction fromVec(vec, f = (x) => x) {\n\t\t\t\tconst result = [];\n\t\t\t\tconst size = vec.size();\n\t\t\t\tfor (let i = 0; i < size; i++) result.push(f(vec.get(i)));\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tfunction vec2polygons(vec, f = (x) => x) {\n\t\t\t\tconst result = [];\n\t\t\t\tconst nPoly = vec.size();\n\t\t\t\tfor (let i = 0; i < nPoly; i++) {\n\t\t\t\t\tconst v = vec.get(i);\n\t\t\t\t\tconst nPts = v.size();\n\t\t\t\t\tconst poly = [];\n\t\t\t\t\tfor (let j = 0; j < nPts; j++) {\n\t\t\t\t\t\tpoly.push(f(v.get(j)));\n\t\t\t\t\t}\n\t\t\t\t\tresult.push(poly);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tfunction polygons2vec(polygons) {\n\t\t\t\tif (polygons[0].length < 3) {\n\t\t\t\t\tpolygons = [polygons];\n\t\t\t\t}\n\t\t\t\treturn toVec(new Module.Vector2_vec2(), polygons, (poly) =>\n\t\t\t\t\ttoVec(new Module.Vector_vec2(), poly, (p) => {\n\t\t\t\t\t\tif (p instanceof Array) return {x: p[0], y: p[1]};\n\t\t\t\t\t\treturn p;\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tfunction disposePolygons(polygonsVec) {\n\t\t\t\tfor (let i = 0; i < polygonsVec.size(); i++) polygonsVec.get(i).delete();\n\t\t\t\tpolygonsVec.delete();\n\t\t\t}\n\t\t\tfunction vararg2vec2(vec) {\n\t\t\t\tif (vec[0] instanceof Array) return {x: vec[0][0], y: vec[0][1]};\n\t\t\t\tif (typeof vec[0] == 'number') return {x: vec[0] || 0, y: vec[1] || 0};\n\t\t\t\treturn vec[0];\n\t\t\t}\n\t\t\tfunction vararg2vec3(vec) {\n\t\t\t\tif (vec[0] instanceof Array) return {x: vec[0][0], y: vec[0][1], z: vec[0][2]};\n\t\t\t\tif (typeof vec[0] == 'number') return {x: vec[0] || 0, y: vec[1] || 0, z: vec[2] || 0};\n\t\t\t\treturn vec[0];\n\t\t\t}\n\t\t\tfunction fillRuleToInt(fillRule) {\n\t\t\t\treturn fillRule == 'EvenOdd' ? 0 : fillRule == 'NonZero' ? 1 : fillRule == 'Negative' ? 3 : 2;\n\t\t\t}\n\t\t\tfunction joinTypeToInt(joinType) {\n\t\t\t\treturn joinType == 'Round' ? 1 : joinType == 'Miter' ? 2 : 0;\n\t\t\t}\n\t\t\tconst CrossSectionCtor = Module.CrossSection;\n\t\t\tfunction cross(polygons, fillRule = 'Positive') {\n\t\t\t\tif (polygons instanceof CrossSectionCtor) {\n\t\t\t\t\treturn polygons;\n\t\t\t\t} else {\n\t\t\t\t\tconst polygonsVec = polygons2vec(polygons);\n\t\t\t\t\tconst cs = new CrossSectionCtor(polygonsVec, fillRuleToInt(fillRule));\n\t\t\t\t\tdisposePolygons(polygonsVec);\n\t\t\t\t\treturn cs;\n\t\t\t\t}\n\t\t\t}\n\t\t\tModule.CrossSection.prototype.translate = function (...vec) {\n\t\t\t\treturn this._Translate(vararg2vec2(vec));\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.scale = function (vec) {\n\t\t\t\tif (typeof vec == 'number') {\n\t\t\t\t\treturn this._Scale({x: vec, y: vec});\n\t\t\t\t}\n\t\t\t\treturn this._Scale(vararg2vec2([vec]));\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.mirror = function (vec) {\n\t\t\t\treturn this._Mirror(vararg2vec2([vec]));\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.warp = function (func) {\n\t\t\t\tconst wasmFuncPtr = addFunction(function (vec2Ptr) {\n\t\t\t\t\tconst x = getValue(vec2Ptr, 'float');\n\t\t\t\t\tconst y = getValue(vec2Ptr + 4, 'float');\n\t\t\t\t\tconst vert = [x, y];\n\t\t\t\t\tfunc(vert);\n\t\t\t\t\tsetValue(vec2Ptr, vert[0], 'float');\n\t\t\t\t\tsetValue(vec2Ptr + 4, vert[1], 'float');\n\t\t\t\t}, 'vi');\n\t\t\t\tconst out = this._Warp(wasmFuncPtr);\n\t\t\t\tremoveFunction(wasmFuncPtr);\n\t\t\t\treturn out;\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.decompose = function () {\n\t\t\t\tconst vec = this._Decompose();\n\t\t\t\tconst result = fromVec(vec);\n\t\t\t\tvec.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.bounds = function () {\n\t\t\t\tconst result = this._Bounds();\n\t\t\t\treturn {min: ['x', 'y'].map((f) => result.min[f]), max: ['x', 'y'].map((f) => result.max[f])};\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.offset = function (\n\t\t\t\tdelta,\n\t\t\t\tjoinType = 'Square',\n\t\t\t\tmiterLimit = 2,\n\t\t\t\tcircularSegments = 0\n\t\t\t) {\n\t\t\t\treturn this._Offset(delta, joinTypeToInt(joinType), miterLimit, circularSegments);\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.extrude = function (\n\t\t\t\theight,\n\t\t\t\tnDivisions = 0,\n\t\t\t\ttwistDegrees = 0,\n\t\t\t\tscaleTop = [1, 1],\n\t\t\t\tcenter = false\n\t\t\t) {\n\t\t\t\tscaleTop = vararg2vec2([scaleTop]);\n\t\t\t\tconst man = Module._Extrude(this, height, nDivisions, twistDegrees, scaleTop);\n\t\t\t\treturn center ? man.translate([0, 0, -height / 2]) : man;\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.revolve = function (circularSegments = 0, revolveDegrees = 360) {\n\t\t\t\treturn Module._Revolve(this, circularSegments, revolveDegrees);\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.add = function (other) {\n\t\t\t\treturn this._add(cross(other));\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.subtract = function (other) {\n\t\t\t\treturn this._subtract(cross(other));\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.intersect = function (other) {\n\t\t\t\treturn this._intersect(cross(other));\n\t\t\t};\n\t\t\tModule.CrossSection.prototype.toPolygons = function () {\n\t\t\t\tconst vec = this._ToPolygons();\n\t\t\t\tconst result = vec2polygons(vec);\n\t\t\t\tvec.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.Manifold.prototype.warp = function (func) {\n\t\t\t\tconst wasmFuncPtr = addFunction(function (vec3Ptr) {\n\t\t\t\t\tconst x = getValue(vec3Ptr, 'float');\n\t\t\t\t\tconst y = getValue(vec3Ptr + 4, 'float');\n\t\t\t\t\tconst z = getValue(vec3Ptr + 8, 'float');\n\t\t\t\t\tconst vert = [x, y, z];\n\t\t\t\t\tfunc(vert);\n\t\t\t\t\tsetValue(vec3Ptr, vert[0], 'float');\n\t\t\t\t\tsetValue(vec3Ptr + 4, vert[1], 'float');\n\t\t\t\t\tsetValue(vec3Ptr + 8, vert[2], 'float');\n\t\t\t\t}, 'vi');\n\t\t\t\tconst out = this._Warp(wasmFuncPtr);\n\t\t\t\tremoveFunction(wasmFuncPtr);\n\t\t\t\tconst status = out.status();\n\t\t\t\tif (status.value !== 0) {\n\t\t\t\t\tthrow new Module.ManifoldError(status.value);\n\t\t\t\t}\n\t\t\t\treturn out;\n\t\t\t};\n\t\t\tModule.Manifold.prototype.setProperties = function (numProp, func) {\n\t\t\t\tconst oldNumProp = this.numProp();\n\t\t\t\tconst wasmFuncPtr = addFunction(function (newPtr, vec3Ptr, oldPtr) {\n\t\t\t\t\tconst newProp = [];\n\t\t\t\t\tfor (let i = 0; i < numProp; ++i) {\n\t\t\t\t\t\tnewProp[i] = getValue(newPtr + 4 * i, 'float');\n\t\t\t\t\t}\n\t\t\t\t\tconst pos = [];\n\t\t\t\t\tfor (let i = 0; i < 3; ++i) {\n\t\t\t\t\t\tpos[i] = getValue(vec3Ptr + 4 * i, 'float');\n\t\t\t\t\t}\n\t\t\t\t\tconst oldProp = [];\n\t\t\t\t\tfor (let i = 0; i < oldNumProp; ++i) {\n\t\t\t\t\t\toldProp[i] = getValue(oldPtr + 4 * i, 'float');\n\t\t\t\t\t}\n\t\t\t\t\tfunc(newProp, pos, oldProp);\n\t\t\t\t\tfor (let i = 0; i < numProp; ++i) {\n\t\t\t\t\t\tsetValue(newPtr + 4 * i, newProp[i], 'float');\n\t\t\t\t\t}\n\t\t\t\t}, 'viii');\n\t\t\t\tconst out = this._SetProperties(numProp, wasmFuncPtr);\n\t\t\t\tremoveFunction(wasmFuncPtr);\n\t\t\t\treturn out;\n\t\t\t};\n\t\t\tModule.Manifold.prototype.translate = function (...vec) {\n\t\t\t\treturn this._Translate(vararg2vec3(vec));\n\t\t\t};\n\t\t\tModule.Manifold.prototype.rotate = function (vec) {\n\t\t\t\treturn this._Rotate(...vec);\n\t\t\t};\n\t\t\tModule.Manifold.prototype.scale = function (vec) {\n\t\t\t\tif (typeof vec == 'number') {\n\t\t\t\t\treturn this._Scale({x: vec, y: vec, z: vec});\n\t\t\t\t}\n\t\t\t\treturn this._Scale(vararg2vec3([vec]));\n\t\t\t};\n\t\t\tModule.Manifold.prototype.mirror = function (vec) {\n\t\t\t\treturn this._Mirror(vararg2vec3([vec]));\n\t\t\t};\n\t\t\tModule.Manifold.prototype.trimByPlane = function (normal, offset = 0) {\n\t\t\t\treturn this._TrimByPlane(vararg2vec3([normal]), offset);\n\t\t\t};\n\t\t\tModule.Manifold.prototype.split = function (manifold) {\n\t\t\t\tconst vec = this._split(manifold);\n\t\t\t\tconst result = fromVec(vec);\n\t\t\t\tvec.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.Manifold.prototype.splitByPlane = function (normal, offset = 0) {\n\t\t\t\tconst vec = this._splitByPlane(vararg2vec3([normal]), offset);\n\t\t\t\tconst result = fromVec(vec);\n\t\t\t\tvec.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.Manifold.prototype.decompose = function () {\n\t\t\t\tconst vec = this._Decompose();\n\t\t\t\tconst result = fromVec(vec);\n\t\t\t\tvec.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.Manifold.prototype.boundingBox = function () {\n\t\t\t\tconst result = this._boundingBox();\n\t\t\t\treturn {min: ['x', 'y', 'z'].map((f) => result.min[f]), max: ['x', 'y', 'z'].map((f) => result.max[f])};\n\t\t\t};\n\t\t\tclass Mesh {\n\t\t\t\tconstructor({\n\t\t\t\t\tnumProp: numProp = 3,\n\t\t\t\t\ttriVerts: triVerts = new Uint32Array(),\n\t\t\t\t\tvertProperties: vertProperties = new Float32Array(),\n\t\t\t\t\tmergeFromVert: mergeFromVert,\n\t\t\t\t\tmergeToVert: mergeToVert,\n\t\t\t\t\trunIndex: runIndex,\n\t\t\t\t\trunOriginalID: runOriginalID,\n\t\t\t\t\tfaceID: faceID,\n\t\t\t\t\thalfedgeTangent: halfedgeTangent,\n\t\t\t\t\trunTransform: runTransform,\n\t\t\t\t} = {}) {\n\t\t\t\t\tthis.numProp = numProp;\n\t\t\t\t\tthis.triVerts = triVerts;\n\t\t\t\t\tthis.vertProperties = vertProperties;\n\t\t\t\t\tthis.mergeFromVert = mergeFromVert;\n\t\t\t\t\tthis.mergeToVert = mergeToVert;\n\t\t\t\t\tthis.runIndex = runIndex;\n\t\t\t\t\tthis.runOriginalID = runOriginalID;\n\t\t\t\t\tthis.faceID = faceID;\n\t\t\t\t\tthis.halfedgeTangent = halfedgeTangent;\n\t\t\t\t\tthis.runTransform = runTransform;\n\t\t\t\t}\n\t\t\t\tget numTri() {\n\t\t\t\t\treturn this.triVerts.length / 3;\n\t\t\t\t}\n\t\t\t\tget numVert() {\n\t\t\t\t\treturn this.vertProperties.length / this.numProp;\n\t\t\t\t}\n\t\t\t\tget numRun() {\n\t\t\t\t\treturn this.runOriginalID.length;\n\t\t\t\t}\n\t\t\t\tmerge() {\n\t\t\t\t\tconst {changed: changed, mesh: mesh} = Module._Merge(this);\n\t\t\t\t\tObject.assign(this, {...mesh});\n\t\t\t\t\treturn changed;\n\t\t\t\t}\n\t\t\t\tverts(tri) {\n\t\t\t\t\treturn this.triVerts.subarray(3 * tri, 3 * (tri + 1));\n\t\t\t\t}\n\t\t\t\tposition(vert) {\n\t\t\t\t\treturn this.vertProperties.subarray(numProp * vert, numProp * vert + 3);\n\t\t\t\t}\n\t\t\t\textras(vert) {\n\t\t\t\t\treturn this.vertProperties.subarray(numProp * vert + 3, numProp * (vert + 1));\n\t\t\t\t}\n\t\t\t\ttangent(halfedge) {\n\t\t\t\t\treturn this.halfedgeTangent.subarray(4 * halfedge, 4 * (halfedge + 1));\n\t\t\t\t}\n\t\t\t\ttransform(run) {\n\t\t\t\t\tconst mat4 = new Array(16);\n\t\t\t\t\tfor (const col of [0, 1, 2, 3]) {\n\t\t\t\t\t\tfor (const row of [0, 1, 2]) {\n\t\t\t\t\t\t\tmat4[4 * col + row] = this.runTransform[12 * run + 3 * col + row];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmat4[15] = 1;\n\t\t\t\t\treturn mat4;\n\t\t\t\t}\n\t\t\t}\n\t\t\tModule.Mesh = Mesh;\n\t\t\tModule.Manifold.prototype.getMesh = function (normalIdx = [0, 0, 0]) {\n\t\t\t\tif (normalIdx instanceof Array) normalIdx = {0: normalIdx[0], 1: normalIdx[1], 2: normalIdx[2]};\n\t\t\t\treturn new Mesh(this._GetMeshJS(normalIdx));\n\t\t\t};\n\t\t\tModule.ManifoldError = function ManifoldError(code, ...args) {\n\t\t\t\tlet message = 'Unknown error';\n\t\t\t\tswitch (code) {\n\t\t\t\t\tcase Module.status.NonFiniteVertex.value:\n\t\t\t\t\t\tmessage = 'Non-finite vertex';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.NotManifold.value:\n\t\t\t\t\t\tmessage = 'Not manifold';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.VertexOutOfBounds.value:\n\t\t\t\t\t\tmessage = 'Vertex index out of bounds';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.PropertiesWrongLength.value:\n\t\t\t\t\t\tmessage = 'Properties have wrong length';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.MissingPositionProperties.value:\n\t\t\t\t\t\tmessage = 'Less than three properties';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.MergeVectorsDifferentLengths.value:\n\t\t\t\t\t\tmessage = 'Merge vectors have different lengths';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.MergeIndexOutOfBounds.value:\n\t\t\t\t\t\tmessage = 'Merge index out of bounds';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.TransformWrongLength.value:\n\t\t\t\t\t\tmessage = 'Transform vector has wrong length';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.RunIndexWrongLength.value:\n\t\t\t\t\t\tmessage = 'Run index vector has wrong length';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Module.status.FaceIDWrongLength.value:\n\t\t\t\t\t\tmessage = 'Face ID vector has wrong length';\n\t\t\t\t\tcase Module.status.InvalidConstruction.value:\n\t\t\t\t\t\tmessage = 'Manifold constructed with invalid parameters';\n\t\t\t\t}\n\t\t\t\tconst base = Error.apply(this, [message, ...args]);\n\t\t\t\tbase.name = this.name = 'ManifoldError';\n\t\t\t\tthis.message = base.message;\n\t\t\t\tthis.stack = base.stack;\n\t\t\t\tthis.code = code;\n\t\t\t};\n\t\t\tModule.ManifoldError.prototype = Object.create(Error.prototype, {\n\t\t\t\tconstructor: {value: Module.ManifoldError, writable: true, configurable: true},\n\t\t\t});\n\t\t\tModule.CrossSection = function (polygons, fillRule = 'Positive') {\n\t\t\t\tconst polygonsVec = polygons2vec(polygons);\n\t\t\t\tconst cs = new CrossSectionCtor(polygonsVec, fillRuleToInt(fillRule));\n\t\t\t\tdisposePolygons(polygonsVec);\n\t\t\t\treturn cs;\n\t\t\t};\n\t\t\tModule.CrossSection.ofPolygons = function (polygons, fillRule = 'Positive') {\n\t\t\t\treturn new Module.CrossSection(polygons, fillRule);\n\t\t\t};\n\t\t\tModule.CrossSection.square = function (...args) {\n\t\t\t\tlet size = undefined;\n\t\t\t\tif (args.length == 0) size = {x: 1, y: 1};\n\t\t\t\telse if (typeof args[0] == 'number') size = {x: args[0], y: args[0]};\n\t\t\t\telse size = vararg2vec2(args);\n\t\t\t\tconst center = args[1] || false;\n\t\t\t\treturn Module._Square(size, center);\n\t\t\t};\n\t\t\tModule.CrossSection.circle = function (radius, circularSegments = 0) {\n\t\t\t\treturn Module._Circle(radius, circularSegments);\n\t\t\t};\n\t\t\tfunction crossSectionBatchbool(name) {\n\t\t\t\treturn function (...args) {\n\t\t\t\t\tif (args.length == 1) args = args[0];\n\t\t\t\t\tconst v = new Module.Vector_crossSection();\n\t\t\t\t\tfor (const cs of args) v.push_back(cross(cs));\n\t\t\t\t\tconst result = Module['_crossSection' + name](v);\n\t\t\t\t\tv.delete();\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\t}\n\t\t\tModule.CrossSection.compose = crossSectionBatchbool('Compose');\n\t\t\tModule.CrossSection.union = crossSectionBatchbool('UnionN');\n\t\t\tModule.CrossSection.difference = crossSectionBatchbool('DifferenceN');\n\t\t\tModule.CrossSection.intersection = crossSectionBatchbool('IntersectionN');\n\t\t\tfunction pushVec2(vec, ps) {\n\t\t\t\ttoVec(vec, ps, (p) => {\n\t\t\t\t\tif (p instanceof Array) return {x: p[0], y: p[1]};\n\t\t\t\t\treturn p;\n\t\t\t\t});\n\t\t\t}\n\t\t\tModule.CrossSection.hull = function (...args) {\n\t\t\t\tif (args.length == 1) args = args[0];\n\t\t\t\tlet pts = new Module.Vector_vec2();\n\t\t\t\tfor (const cs of args) {\n\t\t\t\t\tif (cs instanceof CrossSectionCtor) {\n\t\t\t\t\t\tModule._crossSectionCollectVertices(pts, cs);\n\t\t\t\t\t} else if (cs instanceof Array && cs.length == 2 && typeof cs[0] == 'number') {\n\t\t\t\t\t\tpts.push_back({x: cs[0], y: cs[1]});\n\t\t\t\t\t} else if (cs.x) {\n\t\t\t\t\t\tpts.push_back(cs);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst wrap = (cs[0].length == 2 && typeof cs[0][0] == 'number') || cs[0].x;\n\t\t\t\t\t\tconst polys = wrap ? [cs] : cs;\n\t\t\t\t\t\tfor (const poly of polys) pushVec2(pts, poly);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst result = Module._crossSectionHullPoints(pts);\n\t\t\t\tpts.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.CrossSection.prototype = Object.create(CrossSectionCtor.prototype);\n\t\t\tObject.defineProperty(Module.CrossSection, Symbol.hasInstance, {\n\t\t\t\tget: () => (t) => t instanceof CrossSectionCtor,\n\t\t\t});\n\t\t\tconst ManifoldCtor = Module.Manifold;\n\t\t\tModule.Manifold = function (mesh) {\n\t\t\t\tconst manifold = new ManifoldCtor(mesh);\n\t\t\t\tconst status = manifold.status();\n\t\t\t\tif (status.value !== 0) {\n\t\t\t\t\tthrow new Module.ManifoldError(status.value);\n\t\t\t\t}\n\t\t\t\treturn manifold;\n\t\t\t};\n\t\t\tModule.Manifold.ofMesh = function (mesh) {\n\t\t\t\treturn new Module.Manifold(mesh);\n\t\t\t};\n\t\t\tModule.Manifold.tetrahedron = function () {\n\t\t\t\treturn Module._Tetrahedron();\n\t\t\t};\n\t\t\tModule.Manifold.cube = function (...args) {\n\t\t\t\tlet size = undefined;\n\t\t\t\tif (args.length == 0) size = {x: 1, y: 1, z: 1};\n\t\t\t\telse if (typeof args[0] == 'number') size = {x: args[0], y: args[0], z: args[0]};\n\t\t\t\telse size = vararg2vec3(args);\n\t\t\t\tconst center = args[1] || false;\n\t\t\t\treturn Module._Cube(size, center);\n\t\t\t};\n\t\t\tModule.Manifold.cylinder = function (\n\t\t\t\theight,\n\t\t\t\tradiusLow,\n\t\t\t\tradiusHigh = -1,\n\t\t\t\tcircularSegments = 0,\n\t\t\t\tcenter = false\n\t\t\t) {\n\t\t\t\treturn Module._Cylinder(height, radiusLow, radiusHigh, circularSegments, center);\n\t\t\t};\n\t\t\tModule.Manifold.sphere = function (radius, circularSegments = 0) {\n\t\t\t\treturn Module._Sphere(radius, circularSegments);\n\t\t\t};\n\t\t\tModule.Manifold.smooth = function (mesh, sharpenedEdges = []) {\n\t\t\t\tconst sharp = new Module.Vector_smoothness();\n\t\t\t\ttoVec(sharp, sharpenedEdges);\n\t\t\t\tconst result = Module._Smooth(mesh, sharp);\n\t\t\t\tsharp.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.Manifold.extrude = function (\n\t\t\t\tpolygons,\n\t\t\t\theight,\n\t\t\t\tnDivisions = 0,\n\t\t\t\ttwistDegrees = 0,\n\t\t\t\tscaleTop = [1, 1],\n\t\t\t\tcenter = false\n\t\t\t) {\n\t\t\t\tconst cs = polygons instanceof CrossSectionCtor ? polygons : Module.CrossSection(polygons, 'Positive');\n\t\t\t\treturn cs.extrude(height, nDivisions, twistDegrees, scaleTop, center);\n\t\t\t};\n\t\t\tModule.Manifold.revolve = function (polygons, circularSegments = 0, revolveDegrees = 360) {\n\t\t\t\tconst cs = polygons instanceof CrossSectionCtor ? polygons : Module.CrossSection(polygons, 'Positive');\n\t\t\t\treturn cs.revolve(circularSegments, revolveDegrees);\n\t\t\t};\n\t\t\tModule.Manifold.reserveIDs = function (n) {\n\t\t\t\treturn Module._ReserveIDs(n);\n\t\t\t};\n\t\t\tModule.Manifold.compose = function (manifolds) {\n\t\t\t\tconst vec = new Module.Vector_manifold();\n\t\t\t\ttoVec(vec, manifolds);\n\t\t\t\tconst result = Module._manifoldCompose(vec);\n\t\t\t\tvec.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tfunction manifoldBatchbool(name) {\n\t\t\t\treturn function (...args) {\n\t\t\t\t\tif (args.length == 1) args = args[0];\n\t\t\t\t\tconst v = new Module.Vector_manifold();\n\t\t\t\t\tfor (const m of args) v.push_back(m);\n\t\t\t\t\tconst result = Module['_manifold' + name + 'N'](v);\n\t\t\t\t\tv.delete();\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\t}\n\t\t\tModule.Manifold.union = manifoldBatchbool('Union');\n\t\t\tModule.Manifold.difference = manifoldBatchbool('Difference');\n\t\t\tModule.Manifold.intersection = manifoldBatchbool('Intersection');\n\t\t\tModule.Manifold.levelSet = function (sdf, bounds, edgeLength, level = 0) {\n\t\t\t\tconst bounds2 = {\n\t\t\t\t\tmin: {x: bounds.min[0], y: bounds.min[1], z: bounds.min[2]},\n\t\t\t\t\tmax: {x: bounds.max[0], y: bounds.max[1], z: bounds.max[2]},\n\t\t\t\t};\n\t\t\t\tconst wasmFuncPtr = addFunction(function (vec3Ptr) {\n\t\t\t\t\tconst x = getValue(vec3Ptr, 'float');\n\t\t\t\t\tconst y = getValue(vec3Ptr + 4, 'float');\n\t\t\t\t\tconst z = getValue(vec3Ptr + 8, 'float');\n\t\t\t\t\tconst vert = [x, y, z];\n\t\t\t\t\treturn sdf(vert);\n\t\t\t\t}, 'fi');\n\t\t\t\tconst out = Module._LevelSet(wasmFuncPtr, bounds2, edgeLength, level);\n\t\t\t\tremoveFunction(wasmFuncPtr);\n\t\t\t\treturn out;\n\t\t\t};\n\t\t\tfunction pushVec3(vec, ps) {\n\t\t\t\ttoVec(vec, ps, (p) => {\n\t\t\t\t\tif (p instanceof Array) return {x: p[0], y: p[1], z: p[2]};\n\t\t\t\t\treturn p;\n\t\t\t\t});\n\t\t\t}\n\t\t\tModule.Manifold.hull = function (...args) {\n\t\t\t\tif (args.length == 1) args = args[0];\n\t\t\t\tlet pts = new Module.Vector_vec3();\n\t\t\t\tfor (const m of args) {\n\t\t\t\t\tif (m instanceof ManifoldCtor) {\n\t\t\t\t\t\tModule._manifoldCollectVertices(pts, m);\n\t\t\t\t\t} else if (m instanceof Array && m.length == 3 && typeof m[0] == 'number') {\n\t\t\t\t\t\tpts.push_back({x: m[0], y: m[1], z: m[2]});\n\t\t\t\t\t} else if (m.x) {\n\t\t\t\t\t\tpts.push_back(m);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpushVec3(pts, m);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst result = Module._manifoldHullPoints(pts);\n\t\t\t\tpts.delete();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t\tModule.Manifold.prototype = Object.create(ManifoldCtor.prototype);\n\t\t\tObject.defineProperty(Module.Manifold, Symbol.hasInstance, {get: () => (t) => t instanceof ManifoldCtor});\n\t\t\tModule.triangulate = function (polygons, precision = -1) {\n\t\t\t\tconst polygonsVec = polygons2vec(polygons);\n\t\t\t\tconst result = fromVec(Module._Triangulate(polygonsVec, precision), (x) => [x[0], x[1], x[2]]);\n\t\t\t\tdisposePolygons(polygonsVec);\n\t\t\t\treturn result;\n\t\t\t};\n\t\t};\n\t\tvar moduleOverrides = Object.assign({}, Module);\n\t\tvar arguments_ = [];\n\t\tvar thisProgram = './this.program';\n\t\tvar quit_ = (status, toThrow) => {\n\t\t\tthrow toThrow;\n\t\t};\n\t\tvar ENVIRONMENT_IS_WEB = typeof window == 'object';\n\t\tvar ENVIRONMENT_IS_WORKER = typeof importScripts == 'function';\n\t\tvar ENVIRONMENT_IS_NODE =\n\t\t\ttypeof process == 'object' &&\n\t\t\ttypeof process.versions == 'object' &&\n\t\t\ttypeof process.versions.node == 'string';\n\t\tvar scriptDirectory = '';\n\t\tfunction locateFile(path) {\n\t\t\tif (Module['locateFile']) {\n\t\t\t\treturn Module['locateFile'](path, scriptDirectory);\n\t\t\t}\n\t\t\treturn scriptDirectory + path;\n\t\t}\n\t\tvar read_, readAsync, readBinary, setWindowTitle;\n\t\tif (ENVIRONMENT_IS_NODE) {\n\t\t\t// const {createRequire: createRequire} = await import('module');\n\t\t\t// var require = createRequire(import.meta.url);\n\t\t\t// var fs = require('fs');\n\t\t\t// var nodePath = require('path');\n\t\t\t// if (ENVIRONMENT_IS_WORKER) {\n\t\t\t// \tscriptDirectory = nodePath.dirname(scriptDirectory) + '/';\n\t\t\t// } else {\n\t\t\t// \tscriptDirectory = require('url').fileURLToPath(new URL('./', import.meta.url));\n\t\t\t// }\n\t\t\t// read_ = (filename, binary) => {\n\t\t\t// \tfilename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);\n\t\t\t// \treturn fs.readFileSync(filename, binary ? undefined : 'utf8');\n\t\t\t// };\n\t\t\t// readBinary = (filename) => {\n\t\t\t// \tvar ret = read_(filename, true);\n\t\t\t// \tif (!ret.buffer) {\n\t\t\t// \t\tret = new Uint8Array(ret);\n\t\t\t// \t}\n\t\t\t// \treturn ret;\n\t\t\t// };\n\t\t\t// readAsync = (filename, onload, onerror, binary = true) => {\n\t\t\t// \tfilename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);\n\t\t\t// \tfs.readFile(filename, binary ? undefined : 'utf8', (err, data) => {\n\t\t\t// \t\tif (err) onerror(err);\n\t\t\t// \t\telse onload(binary ? data.buffer : data);\n\t\t\t// \t});\n\t\t\t// };\n\t\t\t// if (!Module['thisProgram'] && process.argv.length > 1) {\n\t\t\t// \tthisProgram = process.argv[1].replace(/\\\\/g, '/');\n\t\t\t// }\n\t\t\t// arguments_ = process.argv.slice(2);\n\t\t\t// quit_ = (status, toThrow) => {\n\t\t\t// \tprocess.exitCode = status;\n\t\t\t// \tthrow toThrow;\n\t\t\t// };\n\t\t\t// Module['inspect'] = () => '[Emscripten Module object]';\n\t\t} else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n\t\t\tif (ENVIRONMENT_IS_WORKER) {\n\t\t\t\tscriptDirectory = self.location.href;\n\t\t\t} else if (typeof document != 'undefined' && document.currentScript) {\n\t\t\t\tscriptDirectory = document.currentScript.src;\n\t\t\t}\n\t\t\tif (_scriptDir) {\n\t\t\t\tscriptDirectory = _scriptDir;\n\t\t\t}\n\t\t\tif (scriptDirectory.indexOf('blob:') !== 0) {\n\t\t\t\tscriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1);\n\t\t\t} else {\n\t\t\t\tscriptDirectory = '';\n\t\t\t}\n\t\t\t{\n\t\t\t\tread_ = (url) => {\n\t\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\t\txhr.open('GET', url, false);\n\t\t\t\t\txhr.send(null);\n\t\t\t\t\treturn xhr.responseText;\n\t\t\t\t};\n\t\t\t\tif (ENVIRONMENT_IS_WORKER) {\n\t\t\t\t\treadBinary = (url) => {\n\t\t\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\t\t\txhr.open('GET', url, false);\n\t\t\t\t\t\txhr.responseType = 'arraybuffer';\n\t\t\t\t\t\txhr.send(null);\n\t\t\t\t\t\treturn new Uint8Array(xhr.response);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treadAsync = (url, onload, onerror) => {\n\t\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\t\txhr.open('GET', url, true);\n\t\t\t\t\txhr.responseType = 'arraybuffer';\n\t\t\t\t\txhr.onload = () => {\n\t\t\t\t\t\tif (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\n\t\t\t\t\t\t\tonload(xhr.response);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonerror();\n\t\t\t\t\t};\n\t\t\t\t\txhr.onerror = onerror;\n\t\t\t\t\txhr.send(null);\n\t\t\t\t};\n\t\t\t}\n\t\t\tsetWindowTitle = (title) => (document.title = title);\n\t\t} else {\n\t\t}\n\t\tvar out = Module['print'] || console.log.bind(console);\n\t\tvar err = Module['printErr'] || console.error.bind(console);\n\t\tObject.assign(Module, moduleOverrides);\n\t\tmoduleOverrides = null;\n\t\tif (Module['arguments']) arguments_ = Module['arguments'];\n\t\tif (Module['thisProgram']) thisProgram = Module['thisProgram'];\n\t\tif (Module['quit']) quit_ = Module['quit'];\n\t\tvar wasmBinary;\n\t\tif (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];\n\t\tvar noExitRuntime = Module['noExitRuntime'] || true;\n\t\tif (typeof WebAssembly != 'object') {\n\t\t\tabort('no native wasm support detected');\n\t\t}\n\t\tvar wasmMemory;\n\t\tvar ABORT = false;\n\t\tvar EXITSTATUS;\n\t\tfunction assert(condition, text) {\n\t\t\tif (!condition) {\n\t\t\t\tabort(text);\n\t\t\t}\n\t\t}\n\t\tvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\t\tfunction updateMemoryViews() {\n\t\t\tvar b = wasmMemory.buffer;\n\t\t\tModule['HEAP8'] = HEAP8 = new Int8Array(b);\n\t\t\tModule['HEAP16'] = HEAP16 = new Int16Array(b);\n\t\t\tModule['HEAPU8'] = HEAPU8 = new Uint8Array(b);\n\t\t\tModule['HEAPU16'] = HEAPU16 = new Uint16Array(b);\n\t\t\tModule['HEAP32'] = HEAP32 = new Int32Array(b);\n\t\t\tModule['HEAPU32'] = HEAPU32 = new Uint32Array(b);\n\t\t\tModule['HEAPF32'] = HEAPF32 = new Float32Array(b);\n\t\t\tModule['HEAPF64'] = HEAPF64 = new Float64Array(b);\n\t\t}\n\t\tvar wasmTable;\n\t\tvar __ATPRERUN__ = [];\n\t\tvar __ATINIT__ = [];\n\t\tvar __ATPOSTRUN__ = [];\n\t\tvar runtimeInitialized = false;\n\t\tfunction preRun() {\n\t\t\tif (Module['preRun']) {\n\t\t\t\tif (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n\t\t\t\twhile (Module['preRun'].length) {\n\t\t\t\t\taddOnPreRun(Module['preRun'].shift());\n\t\t\t\t}\n\t\t\t}\n\t\t\tcallRuntimeCallbacks(__ATPRERUN__);\n\t\t}\n\t\tfunction initRuntime() {\n\t\t\truntimeInitialized = true;\n\t\t\tif (!Module['noFSInit'] && !FS.init.initialized) FS.init();\n\t\t\tFS.ignorePermissions = false;\n\t\t\tTTY.init();\n\t\t\tcallRuntimeCallbacks(__ATINIT__);\n\t\t}\n\t\tfunction postRun() {\n\t\t\tif (Module['postRun']) {\n\t\t\t\tif (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n\t\t\t\twhile (Module['postRun'].length) {\n\t\t\t\t\taddOnPostRun(Module['postRun'].shift());\n\t\t\t\t}\n\t\t\t}\n\t\t\tcallRuntimeCallbacks(__ATPOSTRUN__);\n\t\t}\n\t\tfunction addOnPreRun(cb) {\n\t\t\t__ATPRERUN__.unshift(cb);\n\t\t}\n\t\tfunction addOnInit(cb) {\n\t\t\t__ATINIT__.unshift(cb);\n\t\t}\n\t\tfunction addOnPostRun(cb) {\n\t\t\t__ATPOSTRUN__.unshift(cb);\n\t\t}\n\t\tvar runDependencies = 0;\n\t\tvar runDependencyWatcher = null;\n\t\tvar dependenciesFulfilled = null;\n\t\tfunction getUniqueRunDependency(id) {\n\t\t\treturn id;\n\t\t}\n\t\tfunction addRunDependency(id) {\n\t\t\trunDependencies++;\n\t\t\tif (Module['monitorRunDependencies']) {\n\t\t\t\tModule['monitorRunDependencies'](runDependencies);\n\t\t\t}\n\t\t}\n\t\tfunction removeRunDependency(id) {\n\t\t\trunDependencies--;\n\t\t\tif (Module['monitorRunDependencies']) {\n\t\t\t\tModule['monitorRunDependencies'](runDependencies);\n\t\t\t}\n\t\t\tif (runDependencies == 0) {\n\t\t\t\tif (runDependencyWatcher !== null) {\n\t\t\t\t\tclearInterval(runDependencyWatcher);\n\t\t\t\t\trunDependencyWatcher = null;\n\t\t\t\t}\n\t\t\t\tif (dependenciesFulfilled) {\n\t\t\t\t\tvar callback = dependenciesFulfilled;\n\t\t\t\t\tdependenciesFulfilled = null;\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfunction abort(what) {\n\t\t\tif (Module['onAbort']) {\n\t\t\t\tModule['onAbort'](what);\n\t\t\t}\n\t\t\twhat = 'Aborted(' + what + ')';\n\t\t\terr(what);\n\t\t\tABORT = true;\n\t\t\tEXITSTATUS = 1;\n\t\t\twhat += '. Build with -sASSERTIONS for more info.';\n\t\t\tvar e = new WebAssembly.RuntimeError(what);\n\t\t\treadyPromiseReject(e);\n\t\t\tthrow e;\n\t\t}\n\t\tvar dataURIPrefix = 'data:application/octet-stream;base64,';\n\t\tfunction isDataURI(filename) {\n\t\t\treturn filename.startsWith(dataURIPrefix);\n\t\t}\n\t\tfunction isFileURI(filename) {\n\t\t\treturn filename.startsWith('file://');\n\t\t}\n\t\tvar wasmBinaryFile;\n\t\tif (Module['locateFile']) {\n\t\t\twasmBinaryFile = 'manifold.wasm';\n\t\t\tif (!isDataURI(wasmBinaryFile)) {\n\t\t\t\twasmBinaryFile = locateFile(wasmBinaryFile);\n\t\t\t}\n\t\t} else {\n\t\t\t// wasmBinaryFile = new URL('manifold.wasm', import.meta.url).href;\n\t\t}\n\t\tfunction getBinarySync(file) {\n\t\t\tif (file == wasmBinaryFile && wasmBinary) {\n\t\t\t\treturn new Uint8Array(wasmBinary);\n\t\t\t}\n\t\t\tif (readBinary) {\n\t\t\t\treturn readBinary(file);\n\t\t\t}\n\t\t\tthrow 'both async and sync fetching of the wasm failed';\n\t\t}\n\t\tfunction getBinaryPromise(binaryFile) {\n\t\t\tif (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n\t\t\t\tif (typeof fetch == 'function' && !isFileURI(binaryFile)) {\n\t\t\t\t\treturn fetch(binaryFile, {credentials: 'same-origin'})\n\t\t\t\t\t\t.then((response) => {\n\t\t\t\t\t\t\tif (!response['ok']) {\n\t\t\t\t\t\t\t\tthrow \"failed to load wasm binary file at '\" + binaryFile + \"'\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn response['arrayBuffer']();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => getBinarySync(binaryFile));\n\t\t\t\t} else if (readAsync) {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\treadAsync(binaryFile, (response) => resolve(new Uint8Array(response)), reject);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Promise.resolve().then(() => getBinarySync(binaryFile));\n\t\t}\n\t\tfunction instantiateArrayBuffer(binaryFile, imports, receiver) {\n\t\t\treturn getBinaryPromise(binaryFile)\n\t\t\t\t.then((binary) => WebAssembly.instantiate(binary, imports))\n\t\t\t\t.then((instance) => instance)\n\t\t\t\t.then(receiver, (reason) => {\n\t\t\t\t\terr(`failed to asynchronously prepare wasm: ${reason}`);\n\t\t\t\t\tabort(reason);\n\t\t\t\t});\n\t\t}\n\t\tfunction instantiateAsync(binary, binaryFile, imports, callback) {\n\t\t\tif (\n\t\t\t\t!binary &&\n\t\t\t\ttypeof WebAssembly.instantiateStreaming == 'function' &&\n\t\t\t\t!isDataURI(binaryFile) &&\n\t\t\t\t!isFileURI(binaryFile) &&\n\t\t\t\t!ENVIRONMENT_IS_NODE &&\n\t\t\t\ttypeof fetch == 'function'\n\t\t\t) {\n\t\t\t\treturn fetch(binaryFile, {credentials: 'same-origin'}).then((response) => {\n\t\t\t\t\tvar result = WebAssembly.instantiateStreaming(response, imports);\n\t\t\t\t\treturn result.then(callback, function (reason) {\n\t\t\t\t\t\terr(`wasm streaming compile failed: ${reason}`);\n\t\t\t\t\t\terr('falling back to ArrayBuffer instantiation');\n\t\t\t\t\t\treturn instantiateArrayBuffer(binaryFile, imports, callback);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn instantiateArrayBuffer(binaryFile, imports, callback);\n\t\t}\n\t\tfunction createWasm() {\n\t\t\tvar info = {a: wasmImports};\n\t\t\tfunction receiveInstance(instance, module) {\n\t\t\t\tvar exports = instance.exports;\n\t\t\t\twasmExports = exports;\n\t\t\t\twasmMemory = wasmExports['Na'];\n\t\t\t\tupdateMemoryViews();\n\t\t\t\twasmTable = wasmExports['Pa'];\n\t\t\t\taddOnInit(wasmExports['Oa']);\n\t\t\t\tremoveRunDependency('wasm-instantiate');\n\t\t\t\treturn exports;\n\t\t\t}\n\t\t\taddRunDependency('wasm-instantiate');\n\t\t\tfunction receiveInstantiationResult(result) {\n\t\t\t\treceiveInstance(result['instance']);\n\t\t\t}\n\t\t\tif (Module['instantiateWasm']) {\n\t\t\t\ttry {\n\t\t\t\t\treturn Module['instantiateWasm'](info, receiveInstance);\n\t\t\t\t} catch (e) {\n\t\t\t\t\terr(`Module.instantiateWasm callback failed with error: ${e}`);\n\t\t\t\t\treadyPromiseReject(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\tinstantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject);\n\t\t\treturn {};\n\t\t}\n\t\tvar tempDouble;\n\t\tvar tempI64;\n\t\tvar callRuntimeCallbacks = (callbacks) => {\n\t\t\twhile (callbacks.length > 0) {\n\t\t\t\tcallbacks.shift()(Module);\n\t\t\t}\n\t\t};\n\t\tfunction getValue(ptr, type = 'i8') {\n\t\t\tif (type.endsWith('*')) type = '*';\n\t\t\tswitch (type) {\n\t\t\t\tcase 'i1':\n\t\t\t\t\treturn HEAP8[ptr >> 0];\n\t\t\t\tcase 'i8':\n\t\t\t\t\treturn HEAP8[ptr >> 0];\n\t\t\t\tcase 'i16':\n\t\t\t\t\treturn HEAP16[ptr >> 1];\n\t\t\t\tcase 'i32':\n\t\t\t\t\treturn HEAP32[ptr >> 2];\n\t\t\t\tcase 'i64':\n\t\t\t\t\tabort('to do getValue(i64) use WASM_BIGINT');\n\t\t\t\tcase 'float':\n\t\t\t\t\treturn HEAPF32[ptr >> 2];\n\t\t\t\tcase 'double':\n\t\t\t\t\treturn HEAPF64[ptr >> 3];\n\t\t\t\tcase '*':\n\t\t\t\t\treturn HEAPU32[ptr >> 2];\n\t\t\t\tdefault:\n\t\t\t\t\tabort(`invalid type for getValue: ${type}`);\n\t\t\t}\n\t\t}\n\t\tfunction setValue(ptr, value, type = 'i8') {\n\t\t\tif (type.endsWith('*')) type = '*';\n\t\t\tswitch (type) {\n\t\t\t\tcase 'i1':\n\t\t\t\t\tHEAP8[ptr >> 0] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'i8':\n\t\t\t\t\tHEAP8[ptr >> 0] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'i16':\n\t\t\t\t\tHEAP16[ptr >> 1] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'i32':\n\t\t\t\t\tHEAP32[ptr >> 2] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'i64':\n\t\t\t\t\tabort('to do setValue(i64) use WASM_BIGINT');\n\t\t\t\tcase 'float':\n\t\t\t\t\tHEAPF32[ptr >> 2] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'double':\n\t\t\t\t\tHEAPF64[ptr >> 3] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '*':\n\t\t\t\t\tHEAPU32[ptr >> 2] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tabort(`invalid type for setValue: ${type}`);\n\t\t\t}\n\t\t}\n\t\tvar exceptionCaught = [];\n\t\tvar uncaughtExceptionCount = 0;\n\t\tvar ___cxa_begin_catch = (ptr) => {\n\t\t\tvar info = new ExceptionInfo(ptr);\n\t\t\tif (!info.get_caught()) {\n\t\t\t\tinfo.set_caught(true);\n\t\t\t\tuncaughtExceptionCount--;\n\t\t\t}\n\t\t\tinfo.set_rethrown(false);\n\t\t\texceptionCaught.push(info);\n\t\t\t___cxa_increment_exception_refcount(info.excPtr);\n\t\t\treturn info.get_exception_ptr();\n\t\t};\n\t\tvar exceptionLast = 0;\n\t\tvar ___cxa_end_catch = () => {\n\t\t\t_setThrew(0, 0);\n\t\t\tvar info = exceptionCaught.pop();\n\t\t\t___cxa_decrement_exception_refcount(info.excPtr);\n\t\t\texceptionLast = 0;\n\t\t};\n\t\tfunction ExceptionInfo(excPtr) {\n\t\t\tthis.excPtr = excPtr;\n\t\t\tthis.ptr = excPtr - 24;\n\t\t\tthis.set_type = function (type) {\n\t\t\t\tHEAPU32[(this.ptr + 4) >> 2] = type;\n\t\t\t};\n\t\t\tthis.get_type = function () {\n\t\t\t\treturn HEAPU32[(this.ptr + 4) >> 2];\n\t\t\t};\n\t\t\tthis.set_destructor = function (destructor) {\n\t\t\t\tHEAPU32[(this.ptr + 8) >> 2] = destructor;\n\t\t\t};\n\t\t\tthis.get_destructor = function () {\n\t\t\t\treturn HEAPU32[(this.ptr + 8) >> 2];\n\t\t\t};\n\t\t\tthis.set_caught = function (caught) {\n\t\t\t\tcaught = caught ? 1 : 0;\n\t\t\t\tHEAP8[(this.ptr + 12) >> 0] = caught;\n\t\t\t};\n\t\t\tthis.get_caught = function () {\n\t\t\t\treturn HEAP8[(this.ptr + 12) >> 0] != 0;\n\t\t\t};\n\t\t\tthis.set_rethrown = function (rethrown) {\n\t\t\t\trethrown = rethrown ? 1 : 0;\n\t\t\t\tHEAP8[(this.ptr + 13) >> 0] = rethrown;\n\t\t\t};\n\t\t\tthis.get_rethrown = function () {\n\t\t\t\treturn HEAP8[(this.ptr + 13) >> 0] != 0;\n\t\t\t};\n\t\t\tthis.init = function (type, destructor) {\n\t\t\t\tthis.set_adjusted_ptr(0);\n\t\t\t\tthis.set_type(type);\n\t\t\t\tthis.set_destructor(destructor);\n\t\t\t};\n\t\t\tthis.set_adjusted_ptr = function (adjustedPtr) {\n\t\t\t\tHEAPU32[(this.ptr + 16) >> 2] = adjustedPtr;\n\t\t\t};\n\t\t\tthis.get_adjusted_ptr = function () {\n\t\t\t\treturn HEAPU32[(this.ptr + 16) >> 2];\n\t\t\t};\n\t\t\tthis.get_exception_ptr = function () {\n\t\t\t\tvar isPointer = ___cxa_is_pointer_type(this.get_type());\n\t\t\t\tif (isPointer) {\n\t\t\t\t\treturn HEAPU32[this.excPtr >> 2];\n\t\t\t\t}\n\t\t\t\tvar adjusted = this.get_adjusted_ptr();\n\t\t\t\tif (adjusted !== 0) return adjusted;\n\t\t\t\treturn this.excPtr;\n\t\t\t};\n\t\t}\n\t\tvar ___resumeException = (ptr) => {\n\t\t\tif (!exceptionLast) {\n\t\t\t\texceptionLast = ptr;\n\t\t\t}\n\t\t\tthrow exceptionLast;\n\t\t};\n\t\tvar findMatchingCatch = (args) => {\n\t\t\tvar thrown = exceptionLast;\n\t\t\tif (!thrown) {\n\t\t\t\tsetTempRet0(0);\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tvar info = new ExceptionInfo(thrown);\n\t\t\tinfo.set_adjusted_ptr(thrown);\n\t\t\tvar thrownType = info.get_type();\n\t\t\tif (!thrownType) {\n\t\t\t\tsetTempRet0(0);\n\t\t\t\treturn thrown;\n\t\t\t}\n\t\t\tfor (var arg in args) {\n\t\t\t\tvar caughtType = args[arg];\n\t\t\t\tif (caughtType === 0 || caughtType === thrownType) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tvar adjusted_ptr_addr = info.ptr + 16;\n\t\t\t\tif (___cxa_can_catch(caughtType, thrownType, adjusted_ptr_addr)) {\n\t\t\t\t\tsetTempRet0(caughtType);\n\t\t\t\t\treturn thrown;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetTempRet0(thrownType);\n\t\t\treturn thrown;\n\t\t};\n\t\tvar ___cxa_find_matching_catch_2 = () => findMatchingCatch([]);\n\t\tvar ___cxa_find_matching_catch_3 = (arg0) => findMatchingCatch([arg0]);\n\t\tvar ___cxa_rethrow = () => {\n\t\t\tvar info = exceptionCaught.pop();\n\t\t\tif (!info) {\n\t\t\t\tabort('no exception to throw');\n\t\t\t}\n\t\t\tvar ptr = info.excPtr;\n\t\t\tif (!info.get_rethrown()) {\n\t\t\t\texceptionCaught.push(info);\n\t\t\t\tinfo.set_rethrown(true);\n\t\t\t\tinfo.set_caught(false);\n\t\t\t\tuncaughtExceptionCount++;\n\t\t\t}\n\t\t\texceptionLast = ptr;\n\t\t\tthrow exceptionLast;\n\t\t};\n\t\tvar ___cxa_throw = (ptr, type, destructor) => {\n\t\t\tvar info = new ExceptionInfo(ptr);\n\t\t\tinfo.init(type, destructor);\n\t\t\texceptionLast = ptr;\n\t\t\tuncaughtExceptionCount++;\n\t\t\tthrow exceptionLast;\n\t\t};\n\t\tvar ___cxa_uncaught_exceptions = () => uncaughtExceptionCount;\n\t\tvar structRegistrations = {};\n\t\tvar runDestructors = (destructors) => {\n\t\t\twhile (destructors.length) {\n\t\t\t\tvar ptr = destructors.pop();\n\t\t\t\tvar del = destructors.pop();\n\t\t\t\tdel(ptr);\n\t\t\t}\n\t\t};\n\t\tfunction simpleReadValueFromPointer(pointer) {\n\t\t\treturn this['fromWireType'](HEAP32[pointer >> 2]);\n\t\t}\n\t\tvar awaitingDependencies = {};\n\t\tvar registeredTypes = {};\n\t\tvar typeDependencies = {};\n\t\tvar InternalError = undefined;\n\t\tvar throwInternalError = (message) => {\n\t\t\tthrow new InternalError(message);\n\t\t};\n\t\tvar whenDependentTypesAreResolved = (myTypes, dependentTypes, getTypeConverters) => {\n\t\t\tmyTypes.forEach(function (type) {\n\t\t\t\ttypeDependencies[type] = dependentTypes;\n\t\t\t});\n\t\t\tfunction onComplete(typeConverters) {\n\t\t\t\tvar myTypeConverters = getTypeConverters(typeConverters);\n\t\t\t\tif (myTypeConverters.length !== myTypes.length) {\n\t\t\t\t\tthrowInternalError('Mismatched type converter count');\n\t\t\t\t}\n\t\t\t\tfor (var i = 0; i < myTypes.length; ++i) {\n\t\t\t\t\tregisterType(myTypes[i], myTypeConverters[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar typeConverters = new Array(dependentTypes.length);\n\t\t\tvar unregisteredTypes = [];\n\t\t\tvar registered = 0;\n\t\t\tdependentTypes.forEach((dt, i) => {\n\t\t\t\tif (registeredTypes.hasOwnProperty(dt)) {\n\t\t\t\t\ttypeConverters[i] = registeredTypes[dt];\n\t\t\t\t} else {\n\t\t\t\t\tunregisteredTypes.push(dt);\n\t\t\t\t\tif (!awaitingDependencies.hasOwnProperty(dt)) {\n\t\t\t\t\t\tawaitingDependencies[dt] = [];\n\t\t\t\t\t}\n\t\t\t\t\tawaitingDependencies[dt].push(() => {\n\t\t\t\t\t\ttypeConverters[i] = registeredTypes[dt];\n\t\t\t\t\t\t++registered;\n\t\t\t\t\t\tif (registered === unregisteredTypes.length) {\n\t\t\t\t\t\t\tonComplete(typeConverters);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (0 === unregisteredTypes.length) {\n\t\t\t\tonComplete(typeConverters);\n\t\t\t}\n\t\t};\n\t\tvar __embind_finalize_value_object = (structType) => {\n\t\t\tvar reg = structRegistrations[structType];\n\t\t\tdelete structRegistrations[structType];\n\t\t\tvar rawConstructor = reg.rawConstructor;\n\t\t\tvar rawDestructor = reg.rawDestructor;\n\t\t\tvar fieldRecords = reg.fields;\n\t\t\tvar fieldTypes = fieldRecords\n\t\t\t\t.map((field) => field.getterReturnType)\n\t\t\t\t.concat(fieldRecords.map((field) => field.setterArgumentType));\n\t\t\twhenDependentTypesAreResolved([structType], fieldTypes, (fieldTypes) => {\n\t\t\t\tvar fields = {};\n\t\t\t\tfieldRecords.forEach((field, i) => {\n\t\t\t\t\tvar fieldName = field.fieldName;\n\t\t\t\t\tvar getterReturnType = fieldTypes[i];\n\t\t\t\t\tvar getter = field.getter;\n\t\t\t\t\tvar getterContext = field.getterContext;\n\t\t\t\t\tvar setterArgumentType = fieldTypes[i + fieldRecords.length];\n\t\t\t\t\tvar setter = field.setter;\n\t\t\t\t\tvar setterContext = field.setterContext;\n\t\t\t\t\tfields[fieldName] = {\n\t\t\t\t\t\tread: (ptr) => getterReturnType['fromWireType'](getter(getterContext, ptr)),\n\t\t\t\t\t\twrite: (ptr, o) => {\n\t\t\t\t\t\t\tvar destructors = [];\n\t\t\t\t\t\t\tsetter(setterContext, ptr, setterArgumentType['toWireType'](destructors, o));\n\t\t\t\t\t\t\trunDestructors(destructors);\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: reg.name,\n\t\t\t\t\t\tfromWireType: (ptr) => {\n\t\t\t\t\t\t\tvar rv = {};\n\t\t\t\t\t\t\tfor (var i in fields) {\n\t\t\t\t\t\t\t\trv[i] = fields[i].read(ptr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trawDestructor(ptr);\n\t\t\t\t\t\t\treturn rv;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoWireType: (destructors, o) => {\n\t\t\t\t\t\t\tfor (var fieldName in fields) {\n\t\t\t\t\t\t\t\tif (!(fieldName in o)) {\n\t\t\t\t\t\t\t\t\tthrow new TypeError(`Missing field: \"${fieldName}\"`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar ptr = rawConstructor();\n\t\t\t\t\t\t\tfor (fieldName in fields) {\n\t\t\t\t\t\t\t\tfields[fieldName].write(ptr, o[fieldName]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (destructors !== null) {\n\t\t\t\t\t\t\t\tdestructors.push(rawDestructor, ptr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn ptr;\n\t\t\t\t\t\t},\n\t\t\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\t\t\treadValueFromPointer: simpleReadValueFromPointer,\n\t\t\t\t\t\tdestructorFunction: rawDestructor,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t});\n\t\t};\n\t\tvar __embind_register_bigint = (primitiveType, name, size, minRange, maxRange) => {};\n\t\tvar embind_init_charCodes = () => {\n\t\t\tvar codes = new Array(256);\n\t\t\tfor (var i = 0; i < 256; ++i) {\n\t\t\t\tcodes[i] = String.fromCharCode(i);\n\t\t\t}\n\t\t\tembind_charCodes = codes;\n\t\t};\n\t\tvar embind_charCodes = undefined;\n\t\tvar readLatin1String = (ptr) => {\n\t\t\tvar ret = '';\n\t\t\tvar c = ptr;\n\t\t\twhile (HEAPU8[c]) {\n\t\t\t\tret += embind_charCodes[HEAPU8[c++]];\n\t\t\t}\n\t\t\treturn ret;\n\t\t};\n\t\tvar BindingError = undefined;\n\t\tvar throwBindingError = (message) => {\n\t\t\tthrow new BindingError(message);\n\t\t};\n\t\tfunction sharedRegisterType(rawType, registeredInstance, options = {}) {\n\t\t\tvar name = registeredInstance.name;\n\t\t\tif (!rawType) {\n\t\t\t\tthrowBindingError(`type \"${name}\" must have a positive integer typeid pointer`);\n\t\t\t}\n\t\t\tif (registeredTypes.hasOwnProperty(rawType)) {\n\t\t\t\tif (options.ignoreDuplicateRegistrations) {\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\tthrowBindingError(`Cannot register type '${name}' twice`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tregisteredTypes[rawType] = registeredInstance;\n\t\t\tdelete typeDependencies[rawType];\n\t\t\tif (awaitingDependencies.hasOwnProperty(rawType)) {\n\t\t\t\tvar callbacks = awaitingDependencies[rawType];\n\t\t\t\tdelete awaitingDependencies[rawType];\n\t\t\t\tcallbacks.forEach((cb) => cb());\n\t\t\t}\n\t\t}\n\t\tfunction registerType(rawType, registeredInstance, options = {}) {\n\t\t\tif (!('argPackAdvance' in registeredInstance)) {\n\t\t\t\tthrow new TypeError('registerType registeredInstance requires argPackAdvance');\n\t\t\t}\n\t\t\treturn sharedRegisterType(rawType, registeredInstance, options);\n\t\t}\n\t\tvar GenericWireTypeSize = 8;\n\t\tvar __embind_register_bool = (rawType, name, trueValue, falseValue) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tregisterType(rawType, {\n\t\t\t\tname: name,\n\t\t\t\tfromWireType: function (wt) {\n\t\t\t\t\treturn !!wt;\n\t\t\t\t},\n\t\t\t\ttoWireType: function (destructors, o) {\n\t\t\t\t\treturn o ? trueValue : falseValue;\n\t\t\t\t},\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: function (pointer) {\n\t\t\t\t\treturn this['fromWireType'](HEAPU8[pointer]);\n\t\t\t\t},\n\t\t\t\tdestructorFunction: null,\n\t\t\t});\n\t\t};\n\t\tfunction ClassHandle_isAliasOf(other) {\n\t\t\tif (!(this instanceof ClassHandle)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!(other instanceof ClassHandle)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar leftClass = this.$$.ptrType.registeredClass;\n\t\t\tvar left = this.$$.ptr;\n\t\t\tvar rightClass = other.$$.ptrType.registeredClass;\n\t\t\tvar right = other.$$.ptr;\n\t\t\twhile (leftClass.baseClass) {\n\t\t\t\tleft = leftClass.upcast(left);\n\t\t\t\tleftClass = leftClass.baseClass;\n\t\t\t}\n\t\t\twhile (rightClass.baseClass) {\n\t\t\t\tright = rightClass.upcast(right);\n\t\t\t\trightClass = rightClass.baseClass;\n\t\t\t}\n\t\t\treturn leftClass === rightClass && left === right;\n\t\t}\n\t\tvar shallowCopyInternalPointer = (o) => ({\n\t\t\tcount: o.count,\n\t\t\tdeleteScheduled: o.deleteScheduled,\n\t\t\tpreservePointerOnDelete: o.preservePointerOnDelete,\n\t\t\tptr: o.ptr,\n\t\t\tptrType: o.ptrType,\n\t\t\tsmartPtr: o.smartPtr,\n\t\t\tsmartPtrType: o.smartPtrType,\n\t\t});\n\t\tvar throwInstanceAlreadyDeleted = (obj) => {\n\t\t\tfunction getInstanceTypeName(handle) {\n\t\t\t\treturn handle.$$.ptrType.registeredClass.name;\n\t\t\t}\n\t\t\tthrowBindingError(getInstanceTypeName(obj) + ' instance already deleted');\n\t\t};\n\t\tvar finalizationRegistry = false;\n\t\tvar detachFinalizer = (handle) => {};\n\t\tvar runDestructor = ($$) => {\n\t\t\tif ($$.smartPtr) {\n\t\t\t\t$$.smartPtrType.rawDestructor($$.smartPtr);\n\t\t\t} else {\n\t\t\t\t$$.ptrType.registeredClass.rawDestructor($$.ptr);\n\t\t\t}\n\t\t};\n\t\tvar releaseClassHandle = ($$) => {\n\t\t\t$$.count.value -= 1;\n\t\t\tvar toDelete = 0 === $$.count.value;\n\t\t\tif (toDelete) {\n\t\t\t\trunDestructor($$);\n\t\t\t}\n\t\t};\n\t\tvar downcastPointer = (ptr, ptrClass, desiredClass) => {\n\t\t\tif (ptrClass === desiredClass) {\n\t\t\t\treturn ptr;\n\t\t\t}\n\t\t\tif (undefined === desiredClass.baseClass) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);\n\t\t\tif (rv === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn desiredClass.downcast(rv);\n\t\t};\n\t\tvar registeredPointers = {};\n\t\tvar getInheritedInstanceCount = () => Object.keys(registeredInstances).length;\n\t\tvar getLiveInheritedInstances = () => {\n\t\t\tvar rv = [];\n\t\t\tfor (var k in registeredInstances) {\n\t\t\t\tif (registeredInstances.hasOwnProperty(k)) {\n\t\t\t\t\trv.push(registeredInstances[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn rv;\n\t\t};\n\t\tvar deletionQueue = [];\n\t\tvar flushPendingDeletes = () => {\n\t\t\twhile (deletionQueue.length) {\n\t\t\t\tvar obj = deletionQueue.pop();\n\t\t\t\tobj.$$.deleteScheduled = false;\n\t\t\t\tobj['delete']();\n\t\t\t}\n\t\t};\n\t\tvar delayFunction = undefined;\n\t\tvar setDelayFunction = (fn) => {\n\t\t\tdelayFunction = fn;\n\t\t\tif (deletionQueue.length && delayFunction) {\n\t\t\t\tdelayFunction(flushPendingDeletes);\n\t\t\t}\n\t\t};\n\t\tvar init_embind = () => {\n\t\t\tModule['getInheritedInstanceCount'] = getInheritedInstanceCount;\n\t\t\tModule['getLiveInheritedInstances'] = getLiveInheritedInstances;\n\t\t\tModule['flushPendingDeletes'] = flushPendingDeletes;\n\t\t\tModule['setDelayFunction'] = setDelayFunction;\n\t\t};\n\t\tvar registeredInstances = {};\n\t\tvar getBasestPointer = (class_, ptr) => {\n\t\t\tif (ptr === undefined) {\n\t\t\t\tthrowBindingError('ptr should not be undefined');\n\t\t\t}\n\t\t\twhile (class_.baseClass) {\n\t\t\t\tptr = class_.upcast(ptr);\n\t\t\t\tclass_ = class_.baseClass;\n\t\t\t}\n\t\t\treturn ptr;\n\t\t};\n\t\tvar getInheritedInstance = (class_, ptr) => {\n\t\t\tptr = getBasestPointer(class_, ptr);\n\t\t\treturn registeredInstances[ptr];\n\t\t};\n\t\tvar makeClassHandle = (prototype, record) => {\n\t\t\tif (!record.ptrType || !record.ptr) {\n\t\t\t\tthrowInternalError('makeClassHandle requires ptr and ptrType');\n\t\t\t}\n\t\t\tvar hasSmartPtrType = !!record.smartPtrType;\n\t\t\tvar hasSmartPtr = !!record.smartPtr;\n\t\t\tif (hasSmartPtrType !== hasSmartPtr) {\n\t\t\t\tthrowInternalError('Both smartPtrType and smartPtr must be specified');\n\t\t\t}\n\t\t\trecord.count = {value: 1};\n\t\t\treturn attachFinalizer(Object.create(prototype, {$$: {value: record}}));\n\t\t};\n\t\tfunction RegisteredPointer_fromWireType(ptr) {\n\t\t\tvar rawPointer = this.getPointee(ptr);\n\t\t\tif (!rawPointer) {\n\t\t\t\tthis.destructor(ptr);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar registeredInstance = getInheritedInstance(this.registeredClass, rawPointer);\n\t\t\tif (undefined !== registeredInstance) {\n\t\t\t\tif (0 === registeredInstance.$$.count.value) {\n\t\t\t\t\tregisteredInstance.$$.ptr = rawPointer;\n\t\t\t\t\tregisteredInstance.$$.smartPtr = ptr;\n\t\t\t\t\treturn registeredInstance['clone']();\n\t\t\t\t} else {\n\t\t\t\t\tvar rv = registeredInstance['clone']();\n\t\t\t\t\tthis.destructor(ptr);\n\t\t\t\t\treturn rv;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction makeDefaultHandle() {\n\t\t\t\tif (this.isSmartPointer) {\n\t\t\t\t\treturn makeClassHandle(this.registeredClass.instancePrototype, {\n\t\t\t\t\t\tptrType: this.pointeeType,\n\t\t\t\t\t\tptr: rawPointer,\n\t\t\t\t\t\tsmartPtrType: this,\n\t\t\t\t\t\tsmartPtr: ptr,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn makeClassHandle(this.registeredClass.instancePrototype, {ptrType: this, ptr: ptr});\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar actualType = this.registeredClass.getActualType(rawPointer);\n\t\t\tvar registeredPointerRecord = registeredPointers[actualType];\n\t\t\tif (!registeredPointerRecord) {\n\t\t\t\treturn makeDefaultHandle.call(this);\n\t\t\t}\n\t\t\tvar toType;\n\t\t\tif (this.isConst) {\n\t\t\t\ttoType = registeredPointerRecord.constPointerType;\n\t\t\t} else {\n\t\t\t\ttoType = registeredPointerRecord.pointerType;\n\t\t\t}\n\t\t\tvar dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass);\n\t\t\tif (dp === null) {\n\t\t\t\treturn makeDefaultHandle.call(this);\n\t\t\t}\n\t\t\tif (this.isSmartPointer) {\n\t\t\t\treturn makeClassHandle(toType.registeredClass.instancePrototype, {\n\t\t\t\t\tptrType: toType,\n\t\t\t\t\tptr: dp,\n\t\t\t\t\tsmartPtrType: this,\n\t\t\t\t\tsmartPtr: ptr,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn makeClassHandle(toType.registeredClass.instancePrototype, {ptrType: toType, ptr: dp});\n\t\t\t}\n\t\t}\n\t\tvar attachFinalizer = (handle) => {\n\t\t\tif ('undefined' === typeof FinalizationRegistry) {\n\t\t\t\tattachFinalizer = (handle) => handle;\n\t\t\t\treturn handle;\n\t\t\t}\n\t\t\tfinalizationRegistry = new FinalizationRegistry((info) => {\n\t\t\t\treleaseClassHandle(info.$$);\n\t\t\t});\n\t\t\tattachFinalizer = (handle) => {\n\t\t\t\tvar $$ = handle.$$;\n\t\t\t\tvar hasSmartPtr = !!$$.smartPtr;\n\t\t\t\tif (hasSmartPtr) {\n\t\t\t\t\tvar info = {$$: $$};\n\t\t\t\t\tfinalizationRegistry.register(handle, info, handle);\n\t\t\t\t}\n\t\t\t\treturn handle;\n\t\t\t};\n\t\t\tdetachFinalizer = (handle) => finalizationRegistry.unregister(handle);\n\t\t\treturn attachFinalizer(handle);\n\t\t};\n\t\tfunction ClassHandle_clone() {\n\t\t\tif (!this.$$.ptr) {\n\t\t\t\tthrowInstanceAlreadyDeleted(this);\n\t\t\t}\n\t\t\tif (this.$$.preservePointerOnDelete) {\n\t\t\t\tthis.$$.count.value += 1;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar clone = attachFinalizer(\n\t\t\t\t\tObject.create(Object.getPrototypeOf(this), {$$: {value: shallowCopyInternalPointer(this.$$)}})\n\t\t\t\t);\n\t\t\t\tclone.$$.count.value += 1;\n\t\t\t\tclone.$$.deleteScheduled = false;\n\t\t\t\treturn clone;\n\t\t\t}\n\t\t}\n\t\tfunction ClassHandle_delete() {\n\t\t\tif (!this.$$.ptr) {\n\t\t\t\tthrowInstanceAlreadyDeleted(this);\n\t\t\t}\n\t\t\tif (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {\n\t\t\t\tthrowBindingError('Object already scheduled for deletion');\n\t\t\t}\n\t\t\tdetachFinalizer(this);\n\t\t\treleaseClassHandle(this.$$);\n\t\t\tif (!this.$$.preservePointerOnDelete) {\n\t\t\t\tthis.$$.smartPtr = undefined;\n\t\t\t\tthis.$$.ptr = undefined;\n\t\t\t}\n\t\t}\n\t\tfunction ClassHandle_isDeleted() {\n\t\t\treturn !this.$$.ptr;\n\t\t}\n\t\tfunction ClassHandle_deleteLater() {\n\t\t\tif (!this.$$.ptr) {\n\t\t\t\tthrowInstanceAlreadyDeleted(this);\n\t\t\t}\n\t\t\tif (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {\n\t\t\t\tthrowBindingError('Object already scheduled for deletion');\n\t\t\t}\n\t\t\tdeletionQueue.push(this);\n\t\t\tif (deletionQueue.length === 1 && delayFunction) {\n\t\t\t\tdelayFunction(flushPendingDeletes);\n\t\t\t}\n\t\t\tthis.$$.deleteScheduled = true;\n\t\t\treturn this;\n\t\t}\n\t\tvar init_ClassHandle = () => {\n\t\t\tClassHandle.prototype['isAliasOf'] = ClassHandle_isAliasOf;\n\t\t\tClassHandle.prototype['clone'] = ClassHandle_clone;\n\t\t\tClassHandle.prototype['delete'] = ClassHandle_delete;\n\t\t\tClassHandle.prototype['isDeleted'] = ClassHandle_isDeleted;\n\t\t\tClassHandle.prototype['deleteLater'] = ClassHandle_deleteLater;\n\t\t};\n\t\tfunction ClassHandle() {}\n\t\tvar char_0 = 48;\n\t\tvar char_9 = 57;\n\t\tvar makeLegalFunctionName = (name) => {\n\t\t\tif (undefined === name) {\n\t\t\t\treturn '_unknown';\n\t\t\t}\n\t\t\tname = name.replace(/[^a-zA-Z0-9_]/g, '$');\n\t\t\tvar f = name.charCodeAt(0);\n\t\t\tif (f >= char_0 && f <= char_9) {\n\t\t\t\treturn `_${name}`;\n\t\t\t}\n\t\t\treturn name;\n\t\t};\n\t\tfunction createNamedFunction(name, body) {\n\t\t\tname = makeLegalFunctionName(name);\n\t\t\treturn {\n\t\t\t\t[name]: function () {\n\t\t\t\t\treturn body.apply(this, arguments);\n\t\t\t\t},\n\t\t\t}[name];\n\t\t}\n\t\tvar ensureOverloadTable = (proto, methodName, humanName) => {\n\t\t\tif (undefined === proto[methodName].overloadTable) {\n\t\t\t\tvar prevFunc = proto[methodName];\n\t\t\t\tproto[methodName] = function () {\n\t\t\t\t\tif (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) {\n\t\t\t\t\t\tthrowBindingError(\n\t\t\t\t\t\t\t`Function '${humanName}' called with an invalid number of arguments (${arguments.length}) - expects one of (${proto[methodName].overloadTable})!`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn proto[methodName].overloadTable[arguments.length].apply(this, arguments);\n\t\t\t\t};\n\t\t\t\tproto[methodName].overloadTable = [];\n\t\t\t\tproto[methodName].overloadTable[prevFunc.argCount] = prevFunc;\n\t\t\t}\n\t\t};\n\t\tvar exposePublicSymbol = (name, value, numArguments) => {\n\t\t\tif (Module.hasOwnProperty(name)) {\n\t\t\t\tif (\n\t\t\t\t\tundefined === numArguments ||\n\t\t\t\t\t(undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])\n\t\t\t\t) {\n\t\t\t\t\tthrowBindingError(`Cannot register public name '${name}' twice`);\n\t\t\t\t}\n\t\t\t\tensureOverloadTable(Module, name, name);\n\t\t\t\tif (Module.hasOwnProperty(numArguments)) {\n\t\t\t\t\tthrowBindingError(\n\t\t\t\t\t\t`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tModule[name].overloadTable[numArguments] = value;\n\t\t\t} else {\n\t\t\t\tModule[name] = value;\n\t\t\t\tif (undefined !== numArguments) {\n\t\t\t\t\tModule[name].numArguments = numArguments;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tfunction RegisteredClass(\n\t\t\tname,\n\t\t\tconstructor,\n\t\t\tinstancePrototype,\n\t\t\trawDestructor,\n\t\t\tbaseClass,\n\t\t\tgetActualType,\n\t\t\tupcast,\n\t\t\tdowncast\n\t\t) {\n\t\t\tthis.name = name;\n\t\t\tthis.constructor = constructor;\n\t\t\tthis.instancePrototype = instancePrototype;\n\t\t\tthis.rawDestructor = rawDestructor;\n\t\t\tthis.baseClass = baseClass;\n\t\t\tthis.getActualType = getActualType;\n\t\t\tthis.upcast = upcast;\n\t\t\tthis.downcast = downcast;\n\t\t\tthis.pureVirtualFunctions = [];\n\t\t}\n\t\tvar upcastPointer = (ptr, ptrClass, desiredClass) => {\n\t\t\twhile (ptrClass !== desiredClass) {\n\t\t\t\tif (!ptrClass.upcast) {\n\t\t\t\t\tthrowBindingError(\n\t\t\t\t\t\t`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tptr = ptrClass.upcast(ptr);\n\t\t\t\tptrClass = ptrClass.baseClass;\n\t\t\t}\n\t\t\treturn ptr;\n\t\t};\n\t\tfunction constNoSmartPtrRawPointerToWireType(destructors, handle) {\n\t\t\tif (handle === null) {\n\t\t\t\tif (this.isReference) {\n\t\t\t\t\tthrowBindingError(`null is not a valid ${this.name}`);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (!handle.$$) {\n\t\t\t\tthrowBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`);\n\t\t\t}\n\t\t\tif (!handle.$$.ptr) {\n\t\t\t\tthrowBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);\n\t\t\t}\n\t\t\tvar handleClass = handle.$$.ptrType.registeredClass;\n\t\t\tvar ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);\n\t\t\treturn ptr;\n\t\t}\n\t\tfunction genericPointerToWireType(destructors, handle) {\n\t\t\tvar ptr;\n\t\t\tif (handle === null) {\n\t\t\t\tif (this.isReference) {\n\t\t\t\t\tthrowBindingError(`null is not a valid ${this.name}`);\n\t\t\t\t}\n\t\t\t\tif (this.isSmartPointer) {\n\t\t\t\t\tptr = this.rawConstructor();\n\t\t\t\t\tif (destructors !== null) {\n\t\t\t\t\t\tdestructors.push(this.rawDestructor, ptr);\n\t\t\t\t\t}\n\t\t\t\t\treturn ptr;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!handle.$$) {\n\t\t\t\tthrowBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`);\n\t\t\t}\n\t\t\tif (!handle.$$.ptr) {\n\t\t\t\tthrowBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);\n\t\t\t}\n\t\t\tif (!this.isConst && handle.$$.ptrType.isConst) {\n\t\t\t\tthrowBindingError(\n\t\t\t\t\t`Cannot convert argument of type ${\n\t\t\t\t\t\thandle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name\n\t\t\t\t\t} to parameter type ${this.name}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tvar handleClass = handle.$$.ptrType.registeredClass;\n\t\t\tptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);\n\t\t\tif (this.isSmartPointer) {\n\t\t\t\tif (undefined === handle.$$.smartPtr) {\n\t\t\t\t\tthrowBindingError('Passing raw pointer to smart pointer is illegal');\n\t\t\t\t}\n\t\t\t\tswitch (this.sharingPolicy) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tif (handle.$$.smartPtrType === this) {\n\t\t\t\t\t\t\tptr = handle.$$.smartPtr;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrowBindingError(\n\t\t\t\t\t\t\t\t`Cannot convert argument of type ${\n\t\t\t\t\t\t\t\t\thandle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name\n\t\t\t\t\t\t\t\t} to parameter type ${this.name}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tptr = handle.$$.smartPtr;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tif (handle.$$.smartPtrType === this) {\n\t\t\t\t\t\t\tptr = handle.$$.smartPtr;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar clonedHandle = handle['clone']();\n\t\t\t\t\t\t\tptr = this.rawShare(\n\t\t\t\t\t\t\t\tptr,\n\t\t\t\t\t\t\t\tEmval.toHandle(() => clonedHandle['delete']())\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (destructors !== null) {\n\t\t\t\t\t\t\t\tdestructors.push(this.rawDestructor, ptr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrowBindingError('Unsupporting sharing policy');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ptr;\n\t\t}\n\t\tfunction nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {\n\t\t\tif (handle === null) {\n\t\t\t\tif (this.isReference) {\n\t\t\t\t\tthrowBindingError(`null is not a valid ${this.name}`);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (!handle.$$) {\n\t\t\t\tthrowBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`);\n\t\t\t}\n\t\t\tif (!handle.$$.ptr) {\n\t\t\t\tthrowBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);\n\t\t\t}\n\t\t\tif (handle.$$.ptrType.isConst) {\n\t\t\t\tthrowBindingError(\n\t\t\t\t\t`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tvar handleClass = handle.$$.ptrType.registeredClass;\n\t\t\tvar ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);\n\t\t\treturn ptr;\n\t\t}\n\t\tfunction readPointer(pointer) {\n\t\t\treturn this['fromWireType'](HEAPU32[pointer >> 2]);\n\t\t}\n\t\tfunction RegisteredPointer_getPointee(ptr) {\n\t\t\tif (this.rawGetPointee) {\n\t\t\t\tptr = this.rawGetPointee(ptr);\n\t\t\t}\n\t\t\treturn ptr;\n\t\t}\n\t\tfunction RegisteredPointer_destructor(ptr) {\n\t\t\tif (this.rawDestructor) {\n\t\t\t\tthis.rawDestructor(ptr);\n\t\t\t}\n\t\t}\n\t\tvar RegisteredPointer_deleteObject = (handle) => {\n\t\t\tif (handle !== null) {\n\t\t\t\thandle['delete']();\n\t\t\t}\n\t\t};\n\t\tvar init_RegisteredPointer = () => {\n\t\t\tRegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;\n\t\t\tRegisteredPointer.prototype.destructor = RegisteredPointer_destructor;\n\t\t\tRegisteredPointer.prototype['argPackAdvance'] = GenericWireTypeSize;\n\t\t\tRegisteredPointer.prototype['readValueFromPointer'] = readPointer;\n\t\t\tRegisteredPointer.prototype['deleteObject'] = RegisteredPointer_deleteObject;\n\t\t\tRegisteredPointer.prototype['fromWireType'] = RegisteredPointer_fromWireType;\n\t\t};\n\t\tfunction RegisteredPointer(\n\t\t\tname,\n\t\t\tregisteredClass,\n\t\t\tisReference,\n\t\t\tisConst,\n\t\t\tisSmartPointer,\n\t\t\tpointeeType,\n\t\t\tsharingPolicy,\n\t\t\trawGetPointee,\n\t\t\trawConstructor,\n\t\t\trawShare,\n\t\t\trawDestructor\n\t\t) {\n\t\t\tthis.name = name;\n\t\t\tthis.registeredClass = registeredClass;\n\t\t\tthis.isReference = isReference;\n\t\t\tthis.isConst = isConst;\n\t\t\tthis.isSmartPointer = isSmartPointer;\n\t\t\tthis.pointeeType = pointeeType;\n\t\t\tthis.sharingPolicy = sharingPolicy;\n\t\t\tthis.rawGetPointee = rawGetPointee;\n\t\t\tthis.rawConstructor = rawConstructor;\n\t\t\tthis.rawShare = rawShare;\n\t\t\tthis.rawDestructor = rawDestructor;\n\t\t\tif (!isSmartPointer && registeredClass.baseClass === undefined) {\n\t\t\t\tif (isConst) {\n\t\t\t\t\tthis['toWireType'] = constNoSmartPtrRawPointerToWireType;\n\t\t\t\t\tthis.destructorFunction = null;\n\t\t\t\t} else {\n\t\t\t\t\tthis['toWireType'] = nonConstNoSmartPtrRawPointerToWireType;\n\t\t\t\t\tthis.destructorFunction = null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis['toWireType'] = genericPointerToWireType;\n\t\t\t}\n\t\t}\n\t\tvar replacePublicSymbol = (name, value, numArguments) => {\n\t\t\tif (!Module.hasOwnProperty(name)) {\n\t\t\t\tthrowInternalError('Replacing nonexistant public symbol');\n\t\t\t}\n\t\t\tif (undefined !== Module[name].overloadTable && undefined !== numArguments) {\n\t\t\t\tModule[name].overloadTable[numArguments] = value;\n\t\t\t} else {\n\t\t\t\tModule[name] = value;\n\t\t\t\tModule[name].argCount = numArguments;\n\t\t\t}\n\t\t};\n\t\tvar dynCallLegacy = (sig, ptr, args) => {\n\t\t\tvar f = Module['dynCall_' + sig];\n\t\t\treturn args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr);\n\t\t};\n\t\tvar wasmTableMirror = [];\n\t\tvar getWasmTableEntry = (funcPtr) => {\n\t\t\tvar func = wasmTableMirror[funcPtr];\n\t\t\tif (!func) {\n\t\t\t\tif (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;\n\t\t\t\twasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);\n\t\t\t}\n\t\t\treturn func;\n\t\t};\n\t\tvar dynCall = (sig, ptr, args) => {\n\t\t\tif (sig.includes('j')) {\n\t\t\t\treturn dynCallLegacy(sig, ptr, args);\n\t\t\t}\n\t\t\tvar rtn = getWasmTableEntry(ptr).apply(null, args);\n\t\t\treturn rtn;\n\t\t};\n\t\tvar getDynCaller = (sig, ptr) => {\n\t\t\tvar argCache = [];\n\t\t\treturn function () {\n\t\t\t\targCache.length = 0;\n\t\t\t\tObject.assign(argCache, arguments);\n\t\t\t\treturn dynCall(sig, ptr, argCache);\n\t\t\t};\n\t\t};\n\t\tvar embind__requireFunction = (signature, rawFunction) => {\n\t\t\tsignature = readLatin1String(signature);\n\t\t\tfunction makeDynCaller() {\n\t\t\t\tif (signature.includes('j')) {\n\t\t\t\t\treturn getDynCaller(signature, rawFunction);\n\t\t\t\t}\n\t\t\t\treturn getWasmTableEntry(rawFunction);\n\t\t\t}\n\t\t\tvar fp = makeDynCaller();\n\t\t\tif (typeof fp != 'function') {\n\t\t\t\tthrowBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`);\n\t\t\t}\n\t\t\treturn fp;\n\t\t};\n\t\tvar extendError = (baseErrorType, errorName) => {\n\t\t\tvar errorClass = createNamedFunction(errorName, function (message) {\n\t\t\t\tthis.name = errorName;\n\t\t\t\tthis.message = message;\n\t\t\t\tvar stack = new Error(message).stack;\n\t\t\t\tif (stack !== undefined) {\n\t\t\t\t\tthis.stack = this.toString() + '\\n' + stack.replace(/^Error(:[^\\n]*)?\\n/, '');\n\t\t\t\t}\n\t\t\t});\n\t\t\terrorClass.prototype = Object.create(baseErrorType.prototype);\n\t\t\terrorClass.prototype.constructor = errorClass;\n\t\t\terrorClass.prototype.toString = function () {\n\t\t\t\tif (this.message === undefined) {\n\t\t\t\t\treturn this.name;\n\t\t\t\t} else {\n\t\t\t\t\treturn `${this.name}: ${this.message}`;\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn errorClass;\n\t\t};\n\t\tvar UnboundTypeError = undefined;\n\t\tvar getTypeName = (type) => {\n\t\t\tvar ptr = ___getTypeName(type);\n\t\t\tvar rv = readLatin1String(ptr);\n\t\t\t_free(ptr);\n\t\t\treturn rv;\n\t\t};\n\t\tvar throwUnboundTypeError = (message, types) => {\n\t\t\tvar unboundTypes = [];\n\t\t\tvar seen = {};\n\t\t\tfunction visit(type) {\n\t\t\t\tif (seen[type]) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (registeredTypes[type]) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (typeDependencies[type]) {\n\t\t\t\t\ttypeDependencies[type].forEach(visit);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tunboundTypes.push(type);\n\t\t\t\tseen[type] = true;\n\t\t\t}\n\t\t\ttypes.forEach(visit);\n\t\t\tthrow new UnboundTypeError(`${message}: ` + unboundTypes.map(getTypeName).join([', ']));\n\t\t};\n\t\tvar __embind_register_class = (\n\t\t\trawType,\n\t\t\trawPointerType,\n\t\t\trawConstPointerType,\n\t\t\tbaseClassRawType,\n\t\t\tgetActualTypeSignature,\n\t\t\tgetActualType,\n\t\t\tupcastSignature,\n\t\t\tupcast,\n\t\t\tdowncastSignature,\n\t\t\tdowncast,\n\t\t\tname,\n\t\t\tdestructorSignature,\n\t\t\trawDestructor\n\t\t) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tgetActualType = embind__requireFunction(getActualTypeSignature, getActualType);\n\t\t\tif (upcast) {\n\t\t\t\tupcast = embind__requireFunction(upcastSignature, upcast);\n\t\t\t}\n\t\t\tif (downcast) {\n\t\t\t\tdowncast = embind__requireFunction(downcastSignature, downcast);\n\t\t\t}\n\t\t\trawDestructor = embind__requireFunction(destructorSignature, rawDestructor);\n\t\t\tvar legalFunctionName = makeLegalFunctionName(name);\n\t\t\texposePublicSymbol(legalFunctionName, function () {\n\t\t\t\tthrowUnboundTypeError(`Cannot construct ${name} due to unbound types`, [baseClassRawType]);\n\t\t\t});\n\t\t\twhenDependentTypesAreResolved(\n\t\t\t\t[rawType, rawPointerType, rawConstPointerType],\n\t\t\t\tbaseClassRawType ? [baseClassRawType] : [],\n\t\t\t\tfunction (base) {\n\t\t\t\t\tbase = base[0];\n\t\t\t\t\tvar baseClass;\n\t\t\t\t\tvar basePrototype;\n\t\t\t\t\tif (baseClassRawType) {\n\t\t\t\t\t\tbaseClass = base.registeredClass;\n\t\t\t\t\t\tbasePrototype = baseClass.instancePrototype;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbasePrototype = ClassHandle.prototype;\n\t\t\t\t\t}\n\t\t\t\t\tvar constructor = createNamedFunction(legalFunctionName, function () {\n\t\t\t\t\t\tif (Object.getPrototypeOf(this) !== instancePrototype) {\n\t\t\t\t\t\t\tthrow new BindingError(\"Use 'new' to construct \" + name);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (undefined === registeredClass.constructor_body) {\n\t\t\t\t\t\t\tthrow new BindingError(name + ' has no accessible constructor');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar body = registeredClass.constructor_body[arguments.length];\n\t\t\t\t\t\tif (undefined === body) {\n\t\t\t\t\t\t\tthrow new BindingError(\n\t\t\t\t\t\t\t\t`Tried to invoke ctor of ${name} with invalid number of parameters (${\n\t\t\t\t\t\t\t\t\targuments.length\n\t\t\t\t\t\t\t\t}) - expected (${Object.keys(\n\t\t\t\t\t\t\t\t\tregisteredClass.constructor_body\n\t\t\t\t\t\t\t\t).toString()}) parameters instead!`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn body.apply(this, arguments);\n\t\t\t\t\t});\n\t\t\t\t\tvar instancePrototype = Object.create(basePrototype, {constructor: {value: constructor}});\n\t\t\t\t\tconstructor.prototype = instancePrototype;\n\t\t\t\t\tvar registeredClass = new RegisteredClass(\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tconstructor,\n\t\t\t\t\t\tinstancePrototype,\n\t\t\t\t\t\trawDestructor,\n\t\t\t\t\t\tbaseClass,\n\t\t\t\t\t\tgetActualType,\n\t\t\t\t\t\tupcast,\n\t\t\t\t\t\tdowncast\n\t\t\t\t\t);\n\t\t\t\t\tif (registeredClass.baseClass) {\n\t\t\t\t\t\tif (registeredClass.baseClass.__derivedClasses === undefined) {\n\t\t\t\t\t\t\tregisteredClass.baseClass.__derivedClasses = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tregisteredClass.baseClass.__derivedClasses.push(registeredClass);\n\t\t\t\t\t}\n\t\t\t\t\tvar referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false);\n\t\t\t\t\tvar pointerConverter = new RegisteredPointer(name + '*', registeredClass, false, false, false);\n\t\t\t\t\tvar constPointerConverter = new RegisteredPointer(\n\t\t\t\t\t\tname + ' const*',\n\t\t\t\t\t\tregisteredClass,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\t\t\t\t\tregisteredPointers[rawType] = {\n\t\t\t\t\t\tpointerType: pointerConverter,\n\t\t\t\t\t\tconstPointerType: constPointerConverter,\n\t\t\t\t\t};\n\t\t\t\t\treplacePublicSymbol(legalFunctionName, constructor);\n\t\t\t\t\treturn [referenceConverter, pointerConverter, constPointerConverter];\n\t\t\t\t}\n\t\t\t);\n\t\t};\n\t\tvar heap32VectorToArray = (count, firstElement) => {\n\t\t\tvar array = [];\n\t\t\tfor (var i = 0; i < count; i++) {\n\t\t\t\tarray.push(HEAPU32[(firstElement + i * 4) >> 2]);\n\t\t\t}\n\t\t\treturn array;\n\t\t};\n\t\tfunction newFunc(constructor, argumentList) {\n\t\t\tif (!(constructor instanceof Function)) {\n\t\t\t\tthrow new TypeError(`new_ called with constructor type ${typeof constructor} which is not a function`);\n\t\t\t}\n\t\t\tvar dummy = createNamedFunction(constructor.name || 'unknownFunctionName', function () {});\n\t\t\tdummy.prototype = constructor.prototype;\n\t\t\tvar obj = new dummy();\n\t\t\tvar r = constructor.apply(obj, argumentList);\n\t\t\treturn r instanceof Object ? r : obj;\n\t\t}\n\t\tfunction craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc, isAsync) {\n\t\t\tvar argCount = argTypes.length;\n\t\t\tif (argCount < 2) {\n\t\t\t\tthrowBindingError(\"argTypes array size mismatch! Must at least get return value and 'this' types!\");\n\t\t\t}\n\t\t\tvar isClassMethodFunc = argTypes[1] !== null && classType !== null;\n\t\t\tvar needsDestructorStack = false;\n\t\t\tfor (var i = 1; i < argTypes.length; ++i) {\n\t\t\t\tif (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) {\n\t\t\t\t\tneedsDestructorStack = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar returns = argTypes[0].name !== 'void';\n\t\t\tvar argsList = '';\n\t\t\tvar argsListWired = '';\n\t\t\tfor (var i = 0; i < argCount - 2; ++i) {\n\t\t\t\targsList += (i !== 0 ? ', ' : '') + 'arg' + i;\n\t\t\t\targsListWired += (i !== 0 ? ', ' : '') + 'arg' + i + 'Wired';\n\t\t\t}\n\t\t\tvar invokerFnBody = `\\n        return function ${makeLegalFunctionName(\n\t\t\t\thumanName\n\t\t\t)}(${argsList}) {\\n        if (arguments.length !== ${\n\t\t\t\targCount - 2\n\t\t\t}) {\\n          throwBindingError('function ${humanName} called with ' + arguments.length + ' arguments, expected ${\n\t\t\t\targCount - 2\n\t\t\t}');\\n        }`;\n\t\t\tif (needsDestructorStack) {\n\t\t\t\tinvokerFnBody += 'var destructors = [];\\n';\n\t\t\t}\n\t\t\tvar dtorStack = needsDestructorStack ? 'destructors' : 'null';\n\t\t\tvar args1 = ['throwBindingError', 'invoker', 'fn', 'runDestructors', 'retType', 'classParam'];\n\t\t\tvar args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]];\n\t\t\tif (isClassMethodFunc) {\n\t\t\t\tinvokerFnBody += 'var thisWired = classParam.toWireType(' + dtorStack + ', this);\\n';\n\t\t\t}\n\t\t\tfor (var i = 0; i < argCount - 2; ++i) {\n\t\t\t\tinvokerFnBody +=\n\t\t\t\t\t'var arg' +\n\t\t\t\t\ti +\n\t\t\t\t\t'Wired = argType' +\n\t\t\t\t\ti +\n\t\t\t\t\t'.toWireType(' +\n\t\t\t\t\tdtorStack +\n\t\t\t\t\t', arg' +\n\t\t\t\t\ti +\n\t\t\t\t\t'); // ' +\n\t\t\t\t\targTypes[i + 2].name +\n\t\t\t\t\t'\\n';\n\t\t\t\targs1.push('argType' + i);\n\t\t\t\targs2.push(argTypes[i + 2]);\n\t\t\t}\n\t\t\tif (isClassMethodFunc) {\n\t\t\t\targsListWired = 'thisWired' + (argsListWired.length > 0 ? ', ' : '') + argsListWired;\n\t\t\t}\n\t\t\tinvokerFnBody +=\n\t\t\t\t(returns || isAsync ? 'var rv = ' : '') +\n\t\t\t\t'invoker(fn' +\n\t\t\t\t(argsListWired.length > 0 ? ', ' : '') +\n\t\t\t\targsListWired +\n\t\t\t\t');\\n';\n\t\t\tif (needsDestructorStack) {\n\t\t\t\tinvokerFnBody += 'runDestructors(destructors);\\n';\n\t\t\t} else {\n\t\t\t\tfor (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {\n\t\t\t\t\tvar paramName = i === 1 ? 'thisWired' : 'arg' + (i - 2) + 'Wired';\n\t\t\t\t\tif (argTypes[i].destructorFunction !== null) {\n\t\t\t\t\t\tinvokerFnBody += paramName + '_dtor(' + paramName + '); // ' + argTypes[i].name + '\\n';\n\t\t\t\t\t\targs1.push(paramName + '_dtor');\n\t\t\t\t\t\targs2.push(argTypes[i].destructorFunction);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (returns) {\n\t\t\t\tinvokerFnBody += 'var ret = retType.fromWireType(rv);\\n' + 'return ret;\\n';\n\t\t\t} else {\n\t\t\t}\n\t\t\tinvokerFnBody += '}\\n';\n\t\t\targs1.push(invokerFnBody);\n\t\t\treturn newFunc(Function, args1).apply(null, args2);\n\t\t}\n\t\tvar __embind_register_class_constructor = (\n\t\t\trawClassType,\n\t\t\targCount,\n\t\t\trawArgTypesAddr,\n\t\t\tinvokerSignature,\n\t\t\tinvoker,\n\t\t\trawConstructor\n\t\t) => {\n\t\t\tvar rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);\n\t\t\tinvoker = embind__requireFunction(invokerSignature, invoker);\n\t\t\twhenDependentTypesAreResolved([], [rawClassType], function (classType) {\n\t\t\t\tclassType = classType[0];\n\t\t\t\tvar humanName = `constructor ${classType.name}`;\n\t\t\t\tif (undefined === classType.registeredClass.constructor_body) {\n\t\t\t\t\tclassType.registeredClass.constructor_body = [];\n\t\t\t\t}\n\t\t\t\tif (undefined !== classType.registeredClass.constructor_body[argCount - 1]) {\n\t\t\t\t\tthrow new BindingError(\n\t\t\t\t\t\t`Cannot register multiple constructors with identical number of parameters (${\n\t\t\t\t\t\t\targCount - 1\n\t\t\t\t\t\t}) for class '${\n\t\t\t\t\t\t\tclassType.name\n\t\t\t\t\t\t}'! Overload resolution is currently only performed using the parameter count, not actual type info!`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tclassType.registeredClass.constructor_body[argCount - 1] = () => {\n\t\t\t\t\tthrowUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`, rawArgTypes);\n\t\t\t\t};\n\t\t\t\twhenDependentTypesAreResolved([], rawArgTypes, (argTypes) => {\n\t\t\t\t\targTypes.splice(1, 0, null);\n\t\t\t\t\tclassType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(\n\t\t\t\t\t\thumanName,\n\t\t\t\t\t\targTypes,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tinvoker,\n\t\t\t\t\t\trawConstructor\n\t\t\t\t\t);\n\t\t\t\t\treturn [];\n\t\t\t\t});\n\t\t\t\treturn [];\n\t\t\t});\n\t\t};\n\t\tvar __embind_register_class_function = (\n\t\t\trawClassType,\n\t\t\tmethodName,\n\t\t\targCount,\n\t\t\trawArgTypesAddr,\n\t\t\tinvokerSignature,\n\t\t\trawInvoker,\n\t\t\tcontext,\n\t\t\tisPureVirtual,\n\t\t\tisAsync\n\t\t) => {\n\t\t\tvar rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);\n\t\t\tmethodName = readLatin1String(methodName);\n\t\t\trawInvoker = embind__requireFunction(invokerSignature, rawInvoker);\n\t\t\twhenDependentTypesAreResolved([], [rawClassType], function (classType) {\n\t\t\t\tclassType = classType[0];\n\t\t\t\tvar humanName = `${classType.name}.${methodName}`;\n\t\t\t\tif (methodName.startsWith('@@')) {\n\t\t\t\t\tmethodName = Symbol[methodName.substring(2)];\n\t\t\t\t}\n\t\t\t\tif (isPureVirtual) {\n\t\t\t\t\tclassType.registeredClass.pureVirtualFunctions.push(methodName);\n\t\t\t\t}\n\t\t\t\tfunction unboundTypesHandler() {\n\t\t\t\t\tthrowUnboundTypeError(`Cannot call ${humanName} due to unbound types`, rawArgTypes);\n\t\t\t\t}\n\t\t\t\tvar proto = classType.registeredClass.instancePrototype;\n\t\t\t\tvar method = proto[methodName];\n\t\t\t\tif (\n\t\t\t\t\tundefined === method ||\n\t\t\t\t\t(undefined === method.overloadTable &&\n\t\t\t\t\t\tmethod.className !== classType.name &&\n\t\t\t\t\t\tmethod.argCount === argCount - 2)\n\t\t\t\t) {\n\t\t\t\t\tunboundTypesHandler.argCount = argCount - 2;\n\t\t\t\t\tunboundTypesHandler.className = classType.name;\n\t\t\t\t\tproto[methodName] = unboundTypesHandler;\n\t\t\t\t} else {\n\t\t\t\t\tensureOverloadTable(proto, methodName, humanName);\n\t\t\t\t\tproto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;\n\t\t\t\t}\n\t\t\t\twhenDependentTypesAreResolved([], rawArgTypes, function (argTypes) {\n\t\t\t\t\tvar memberFunction = craftInvokerFunction(\n\t\t\t\t\t\thumanName,\n\t\t\t\t\t\targTypes,\n\t\t\t\t\t\tclassType,\n\t\t\t\t\t\trawInvoker,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tisAsync\n\t\t\t\t\t);\n\t\t\t\t\tif (undefined === proto[methodName].overloadTable) {\n\t\t\t\t\t\tmemberFunction.argCount = argCount - 2;\n\t\t\t\t\t\tproto[methodName] = memberFunction;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tproto[methodName].overloadTable[argCount - 2] = memberFunction;\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t});\n\t\t\t\treturn [];\n\t\t\t});\n\t\t};\n\t\tfunction handleAllocatorInit() {\n\t\t\tObject.assign(HandleAllocator.prototype, {\n\t\t\t\tget(id) {\n\t\t\t\t\treturn this.allocated[id];\n\t\t\t\t},\n\t\t\t\thas(id) {\n\t\t\t\t\treturn this.allocated[id] !== undefined;\n\t\t\t\t},\n\t\t\t\tallocate(handle) {\n\t\t\t\t\tvar id = this.freelist.pop() || this.allocated.length;\n\t\t\t\t\tthis.allocated[id] = handle;\n\t\t\t\t\treturn id;\n\t\t\t\t},\n\t\t\t\tfree(id) {\n\t\t\t\t\tthis.allocated[id] = undefined;\n\t\t\t\t\tthis.freelist.push(id);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tfunction HandleAllocator() {\n\t\t\tthis.allocated = [undefined];\n\t\t\tthis.freelist = [];\n\t\t}\n\t\tvar emval_handles = new HandleAllocator();\n\t\tvar __emval_decref = (handle) => {\n\t\t\tif (handle >= emval_handles.reserved && 0 === --emval_handles.get(handle).refcount) {\n\t\t\t\temval_handles.free(handle);\n\t\t\t}\n\t\t};\n\t\tvar count_emval_handles = () => {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = emval_handles.reserved; i < emval_handles.allocated.length; ++i) {\n\t\t\t\tif (emval_handles.allocated[i] !== undefined) {\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t};\n\t\tvar init_emval = () => {\n\t\t\temval_handles.allocated.push({value: undefined}, {value: null}, {value: true}, {value: false});\n\t\t\temval_handles.reserved = emval_handles.allocated.length;\n\t\t\tModule['count_emval_handles'] = count_emval_handles;\n\t\t};\n\t\tvar Emval = {\n\t\t\ttoValue: (handle) => {\n\t\t\t\tif (!handle) {\n\t\t\t\t\tthrowBindingError('Cannot use deleted val. handle = ' + handle);\n\t\t\t\t}\n\t\t\t\treturn emval_handles.get(handle).value;\n\t\t\t},\n\t\t\ttoHandle: (value) => {\n\t\t\t\tswitch (value) {\n\t\t\t\t\tcase undefined:\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tcase null:\n\t\t\t\t\t\treturn 2;\n\t\t\t\t\tcase true:\n\t\t\t\t\t\treturn 3;\n\t\t\t\t\tcase false:\n\t\t\t\t\t\treturn 4;\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\treturn emval_handles.allocate({refcount: 1, value: value});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tvar __embind_register_emval = (rawType, name) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tregisterType(rawType, {\n\t\t\t\tname: name,\n\t\t\t\tfromWireType: (handle) => {\n\t\t\t\t\tvar rv = Emval.toValue(handle);\n\t\t\t\t\t__emval_decref(handle);\n\t\t\t\t\treturn rv;\n\t\t\t\t},\n\t\t\t\ttoWireType: (destructors, value) => Emval.toHandle(value),\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: simpleReadValueFromPointer,\n\t\t\t\tdestructorFunction: null,\n\t\t\t});\n\t\t};\n\t\tvar enumReadValueFromPointer = (name, width, signed) => {\n\t\t\tswitch (width) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn signed\n\t\t\t\t\t\t? function (pointer) {\n\t\t\t\t\t\t\t\treturn this['fromWireType'](HEAP8[pointer >> 0]);\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t: function (pointer) {\n\t\t\t\t\t\t\t\treturn this['fromWireType'](HEAPU8[pointer >> 0]);\n\t\t\t\t\t\t  };\n\t\t\t\tcase 2:\n\t\t\t\t\treturn signed\n\t\t\t\t\t\t? function (pointer) {\n\t\t\t\t\t\t\t\treturn this['fromWireType'](HEAP16[pointer >> 1]);\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t: function (pointer) {\n\t\t\t\t\t\t\t\treturn this['fromWireType'](HEAPU16[pointer >> 1]);\n\t\t\t\t\t\t  };\n\t\t\t\tcase 4:\n\t\t\t\t\treturn signed\n\t\t\t\t\t\t? function (pointer) {\n\t\t\t\t\t\t\t\treturn this['fromWireType'](HEAP32[pointer >> 2]);\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t: function (pointer) {\n\t\t\t\t\t\t\t\treturn this['fromWireType'](HEAPU32[pointer >> 2]);\n\t\t\t\t\t\t  };\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new TypeError(`invalid integer width (${width}): ${name}`);\n\t\t\t}\n\t\t};\n\t\tvar __embind_register_enum = (rawType, name, size, isSigned) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tfunction ctor() {}\n\t\t\tctor.values = {};\n\t\t\tregisterType(rawType, {\n\t\t\t\tname: name,\n\t\t\t\tconstructor: ctor,\n\t\t\t\tfromWireType: function (c) {\n\t\t\t\t\treturn this.constructor.values[c];\n\t\t\t\t},\n\t\t\t\ttoWireType: (destructors, c) => c.value,\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: enumReadValueFromPointer(name, size, isSigned),\n\t\t\t\tdestructorFunction: null,\n\t\t\t});\n\t\t\texposePublicSymbol(name, ctor);\n\t\t};\n\t\tvar requireRegisteredType = (rawType, humanName) => {\n\t\t\tvar impl = registeredTypes[rawType];\n\t\t\tif (undefined === impl) {\n\t\t\t\tthrowBindingError(humanName + ' has unknown type ' + getTypeName(rawType));\n\t\t\t}\n\t\t\treturn impl;\n\t\t};\n\t\tvar __embind_register_enum_value = (rawEnumType, name, enumValue) => {\n\t\t\tvar enumType = requireRegisteredType(rawEnumType, 'enum');\n\t\t\tname = readLatin1String(name);\n\t\t\tvar Enum = enumType.constructor;\n\t\t\tvar Value = Object.create(enumType.constructor.prototype, {\n\t\t\t\tvalue: {value: enumValue},\n\t\t\t\tconstructor: {value: createNamedFunction(`${enumType.name}_${name}`, function () {})},\n\t\t\t});\n\t\t\tEnum.values[enumValue] = Value;\n\t\t\tEnum[name] = Value;\n\t\t};\n\t\tvar embindRepr = (v) => {\n\t\t\tif (v === null) {\n\t\t\t\treturn 'null';\n\t\t\t}\n\t\t\tvar t = typeof v;\n\t\t\tif (t === 'object' || t === 'array' || t === 'function') {\n\t\t\t\treturn v.toString();\n\t\t\t} else {\n\t\t\t\treturn '' + v;\n\t\t\t}\n\t\t};\n\t\tvar floatReadValueFromPointer = (name, width) => {\n\t\t\tswitch (width) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn function (pointer) {\n\t\t\t\t\t\treturn this['fromWireType'](HEAPF32[pointer >> 2]);\n\t\t\t\t\t};\n\t\t\t\tcase 8:\n\t\t\t\t\treturn function (pointer) {\n\t\t\t\t\t\treturn this['fromWireType'](HEAPF64[pointer >> 3]);\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new TypeError(`invalid float width (${width}): ${name}`);\n\t\t\t}\n\t\t};\n\t\tvar __embind_register_float = (rawType, name, size) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tregisterType(rawType, {\n\t\t\t\tname: name,\n\t\t\t\tfromWireType: (value) => value,\n\t\t\t\ttoWireType: (destructors, value) => value,\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: floatReadValueFromPointer(name, size),\n\t\t\t\tdestructorFunction: null,\n\t\t\t});\n\t\t};\n\t\tvar __embind_register_function = (name, argCount, rawArgTypesAddr, signature, rawInvoker, fn, isAsync) => {\n\t\t\tvar argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);\n\t\t\tname = readLatin1String(name);\n\t\t\trawInvoker = embind__requireFunction(signature, rawInvoker);\n\t\t\texposePublicSymbol(\n\t\t\t\tname,\n\t\t\t\tfunction () {\n\t\t\t\t\tthrowUnboundTypeError(`Cannot call ${name} due to unbound types`, argTypes);\n\t\t\t\t},\n\t\t\t\targCount - 1\n\t\t\t);\n\t\t\twhenDependentTypesAreResolved([], argTypes, function (argTypes) {\n\t\t\t\tvar invokerArgsArray = [argTypes[0], null].concat(argTypes.slice(1));\n\t\t\t\treplacePublicSymbol(\n\t\t\t\t\tname,\n\t\t\t\t\tcraftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn, isAsync),\n\t\t\t\t\targCount - 1\n\t\t\t\t);\n\t\t\t\treturn [];\n\t\t\t});\n\t\t};\n\t\tvar integerReadValueFromPointer = (name, width, signed) => {\n\t\t\tswitch (width) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn signed ? (pointer) => HEAP8[pointer >> 0] : (pointer) => HEAPU8[pointer >> 0];\n\t\t\t\tcase 2:\n\t\t\t\t\treturn signed ? (pointer) => HEAP16[pointer >> 1] : (pointer) => HEAPU16[pointer >> 1];\n\t\t\t\tcase 4:\n\t\t\t\t\treturn signed ? (pointer) => HEAP32[pointer >> 2] : (pointer) => HEAPU32[pointer >> 2];\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new TypeError(`invalid integer width (${width}): ${name}`);\n\t\t\t}\n\t\t};\n\t\tvar __embind_register_integer = (primitiveType, name, size, minRange, maxRange) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tif (maxRange === -1) {\n\t\t\t\tmaxRange = 4294967295;\n\t\t\t}\n\t\t\tvar fromWireType = (value) => value;\n\t\t\tif (minRange === 0) {\n\t\t\t\tvar bitshift = 32 - 8 * size;\n\t\t\t\tfromWireType = (value) => (value << bitshift) >>> bitshift;\n\t\t\t}\n\t\t\tvar isUnsignedType = name.includes('unsigned');\n\t\t\tvar checkAssertions = (value, toTypeName) => {};\n\t\t\tvar toWireType;\n\t\t\tif (isUnsignedType) {\n\t\t\t\ttoWireType = function (destructors, value) {\n\t\t\t\t\tcheckAssertions(value, this.name);\n\t\t\t\t\treturn value >>> 0;\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\ttoWireType = function (destructors, value) {\n\t\t\t\t\tcheckAssertions(value, this.name);\n\t\t\t\t\treturn value;\n\t\t\t\t};\n\t\t\t}\n\t\t\tregisterType(primitiveType, {\n\t\t\t\tname: name,\n\t\t\t\tfromWireType: fromWireType,\n\t\t\t\ttoWireType: toWireType,\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: integerReadValueFromPointer(name, size, minRange !== 0),\n\t\t\t\tdestructorFunction: null,\n\t\t\t});\n\t\t};\n\t\tvar __embind_register_memory_view = (rawType, dataTypeIndex, name) => {\n\t\t\tvar typeMapping = [\n\t\t\t\tInt8Array,\n\t\t\t\tUint8Array,\n\t\t\t\tInt16Array,\n\t\t\t\tUint16Array,\n\t\t\t\tInt32Array,\n\t\t\t\tUint32Array,\n\t\t\t\tFloat32Array,\n\t\t\t\tFloat64Array,\n\t\t\t];\n\t\t\tvar TA = typeMapping[dataTypeIndex];\n\t\t\tfunction decodeMemoryView(handle) {\n\t\t\t\tvar size = HEAPU32[handle >> 2];\n\t\t\t\tvar data = HEAPU32[(handle + 4) >> 2];\n\t\t\t\treturn new TA(HEAP8.buffer, data, size);\n\t\t\t}\n\t\t\tname = readLatin1String(name);\n\t\t\tregisterType(\n\t\t\t\trawType,\n\t\t\t\t{\n\t\t\t\t\tname: name,\n\t\t\t\t\tfromWireType: decodeMemoryView,\n\t\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\t\treadValueFromPointer: decodeMemoryView,\n\t\t\t\t},\n\t\t\t\t{ignoreDuplicateRegistrations: true}\n\t\t\t);\n\t\t};\n\t\tvar stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {\n\t\t\tif (!(maxBytesToWrite > 0)) return 0;\n\t\t\tvar startIdx = outIdx;\n\t\t\tvar endIdx = outIdx + maxBytesToWrite - 1;\n\t\t\tfor (var i = 0; i < str.length; ++i) {\n\t\t\t\tvar u = str.charCodeAt(i);\n\t\t\t\tif (u >= 55296 && u <= 57343) {\n\t\t\t\t\tvar u1 = str.charCodeAt(++i);\n\t\t\t\t\tu = (65536 + ((u & 1023) << 10)) | (u1 & 1023);\n\t\t\t\t}\n\t\t\t\tif (u <= 127) {\n\t\t\t\t\tif (outIdx >= endIdx) break;\n\t\t\t\t\theap[outIdx++] = u;\n\t\t\t\t} else if (u <= 2047) {\n\t\t\t\t\tif (outIdx + 1 >= endIdx) break;\n\t\t\t\t\theap[outIdx++] = 192 | (u >> 6);\n\t\t\t\t\theap[outIdx++] = 128 | (u & 63);\n\t\t\t\t} else if (u <= 65535) {\n\t\t\t\t\tif (outIdx + 2 >= endIdx) break;\n\t\t\t\t\theap[outIdx++] = 224 | (u >> 12);\n\t\t\t\t\theap[outIdx++] = 128 | ((u >> 6) & 63);\n\t\t\t\t\theap[outIdx++] = 128 | (u & 63);\n\t\t\t\t} else {\n\t\t\t\t\tif (outIdx + 3 >= endIdx) break;\n\t\t\t\t\theap[outIdx++] = 240 | (u >> 18);\n\t\t\t\t\theap[outIdx++] = 128 | ((u >> 12) & 63);\n\t\t\t\t\theap[outIdx++] = 128 | ((u >> 6) & 63);\n\t\t\t\t\theap[outIdx++] = 128 | (u & 63);\n\t\t\t\t}\n\t\t\t}\n\t\t\theap[outIdx] = 0;\n\t\t\treturn outIdx - startIdx;\n\t\t};\n\t\tvar stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n\t\tvar lengthBytesUTF8 = (str) => {\n\t\t\tvar len = 0;\n\t\t\tfor (var i = 0; i < str.length; ++i) {\n\t\t\t\tvar c = str.charCodeAt(i);\n\t\t\t\tif (c <= 127) {\n\t\t\t\t\tlen++;\n\t\t\t\t} else if (c <= 2047) {\n\t\t\t\t\tlen += 2;\n\t\t\t\t} else if (c >= 55296 && c <= 57343) {\n\t\t\t\t\tlen += 4;\n\t\t\t\t\t++i;\n\t\t\t\t} else {\n\t\t\t\t\tlen += 3;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn len;\n\t\t};\n\t\tvar UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;\n\t\tvar UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {\n\t\t\tvar endIdx = idx + maxBytesToRead;\n\t\t\tvar endPtr = idx;\n\t\t\twhile (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n\t\t\tif (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n\t\t\t\treturn UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n\t\t\t}\n\t\t\tvar str = '';\n\t\t\twhile (idx < endPtr) {\n\t\t\t\tvar u0 = heapOrArray[idx++];\n\t\t\t\tif (!(u0 & 128)) {\n\t\t\t\t\tstr += String.fromCharCode(u0);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar u1 = heapOrArray[idx++] & 63;\n\t\t\t\tif ((u0 & 224) == 192) {\n\t\t\t\t\tstr += String.fromCharCode(((u0 & 31) << 6) | u1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar u2 = heapOrArray[idx++] & 63;\n\t\t\t\tif ((u0 & 240) == 224) {\n\t\t\t\t\tu0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n\t\t\t\t} else {\n\t\t\t\t\tu0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);\n\t\t\t\t}\n\t\t\t\tif (u0 < 65536) {\n\t\t\t\t\tstr += String.fromCharCode(u0);\n\t\t\t\t} else {\n\t\t\t\t\tvar ch = u0 - 65536;\n\t\t\t\t\tstr += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn str;\n\t\t};\n\t\tvar UTF8ToString = (ptr, maxBytesToRead) => (ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '');\n\t\tvar __embind_register_std_string = (rawType, name) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tvar stdStringIsUTF8 = name === 'std::string';\n\t\t\tregisterType(rawType, {\n\t\t\t\tname: name,\n\t\t\t\tfromWireType: (value) => {\n\t\t\t\t\tvar length = HEAPU32[value >> 2];\n\t\t\t\t\tvar payload = value + 4;\n\t\t\t\t\tvar str;\n\t\t\t\t\tif (stdStringIsUTF8) {\n\t\t\t\t\t\tvar decodeStartPtr = payload;\n\t\t\t\t\t\tfor (var i = 0; i <= length; ++i) {\n\t\t\t\t\t\t\tvar currentBytePtr = payload + i;\n\t\t\t\t\t\t\tif (i == length || HEAPU8[currentBytePtr] == 0) {\n\t\t\t\t\t\t\t\tvar maxRead = currentBytePtr - decodeStartPtr;\n\t\t\t\t\t\t\t\tvar stringSegment = UTF8ToString(decodeStartPtr, maxRead);\n\t\t\t\t\t\t\t\tif (str === undefined) {\n\t\t\t\t\t\t\t\t\tstr = stringSegment;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstr += String.fromCharCode(0);\n\t\t\t\t\t\t\t\t\tstr += stringSegment;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdecodeStartPtr = currentBytePtr + 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar a = new Array(length);\n\t\t\t\t\t\tfor (var i = 0; i < length; ++i) {\n\t\t\t\t\t\t\ta[i] = String.fromCharCode(HEAPU8[payload + i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstr = a.join('');\n\t\t\t\t\t}\n\t\t\t\t\t_free(value);\n\t\t\t\t\treturn str;\n\t\t\t\t},\n\t\t\t\ttoWireType: (destructors, value) => {\n\t\t\t\t\tif (value instanceof ArrayBuffer) {\n\t\t\t\t\t\tvalue = new Uint8Array(value);\n\t\t\t\t\t}\n\t\t\t\t\tvar length;\n\t\t\t\t\tvar valueIsOfTypeString = typeof value == 'string';\n\t\t\t\t\tif (\n\t\t\t\t\t\t!(\n\t\t\t\t\t\t\tvalueIsOfTypeString ||\n\t\t\t\t\t\t\tvalue instanceof Uint8Array ||\n\t\t\t\t\t\t\tvalue instanceof Uint8ClampedArray ||\n\t\t\t\t\t\t\tvalue instanceof Int8Array\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrowBindingError('Cannot pass non-string to std::string');\n\t\t\t\t\t}\n\t\t\t\t\tif (stdStringIsUTF8 && valueIsOfTypeString) {\n\t\t\t\t\t\tlength = lengthBytesUTF8(value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlength = value.length;\n\t\t\t\t\t}\n\t\t\t\t\tvar base = _malloc(4 + length + 1);\n\t\t\t\t\tvar ptr = base + 4;\n\t\t\t\t\tHEAPU32[base >> 2] = length;\n\t\t\t\t\tif (stdStringIsUTF8 && valueIsOfTypeString) {\n\t\t\t\t\t\tstringToUTF8(value, ptr, length + 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (valueIsOfTypeString) {\n\t\t\t\t\t\t\tfor (var i = 0; i < length; ++i) {\n\t\t\t\t\t\t\t\tvar charCode = value.charCodeAt(i);\n\t\t\t\t\t\t\t\tif (charCode > 255) {\n\t\t\t\t\t\t\t\t\t_free(ptr);\n\t\t\t\t\t\t\t\t\tthrowBindingError('String has UTF-16 code units that do not fit in 8 bits');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tHEAPU8[ptr + i] = charCode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (var i = 0; i < length; ++i) {\n\t\t\t\t\t\t\t\tHEAPU8[ptr + i] = value[i];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (destructors !== null) {\n\t\t\t\t\t\tdestructors.push(_free, base);\n\t\t\t\t\t}\n\t\t\t\t\treturn base;\n\t\t\t\t},\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: readPointer,\n\t\t\t\tdestructorFunction: (ptr) => _free(ptr),\n\t\t\t});\n\t\t};\n\t\tvar UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined;\n\t\tvar UTF16ToString = (ptr, maxBytesToRead) => {\n\t\t\tvar endPtr = ptr;\n\t\t\tvar idx = endPtr >> 1;\n\t\t\tvar maxIdx = idx + maxBytesToRead / 2;\n\t\t\twhile (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;\n\t\t\tendPtr = idx << 1;\n\t\t\tif (endPtr - ptr > 32 && UTF16Decoder) return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));\n\t\t\tvar str = '';\n\t\t\tfor (var i = 0; !(i >= maxBytesToRead / 2); ++i) {\n\t\t\t\tvar codeUnit = HEAP16[(ptr + i * 2) >> 1];\n\t\t\t\tif (codeUnit == 0) break;\n\t\t\t\tstr += String.fromCharCode(codeUnit);\n\t\t\t}\n\t\t\treturn str;\n\t\t};\n\t\tvar stringToUTF16 = (str, outPtr, maxBytesToWrite) => {\n\t\t\tif (maxBytesToWrite === undefined) {\n\t\t\t\tmaxBytesToWrite = 2147483647;\n\t\t\t}\n\t\t\tif (maxBytesToWrite < 2) return 0;\n\t\t\tmaxBytesToWrite -= 2;\n\t\t\tvar startPtr = outPtr;\n\t\t\tvar numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;\n\t\t\tfor (var i = 0; i < numCharsToWrite; ++i) {\n\t\t\t\tvar codeUnit = str.charCodeAt(i);\n\t\t\t\tHEAP16[outPtr >> 1] = codeUnit;\n\t\t\t\toutPtr += 2;\n\t\t\t}\n\t\t\tHEAP16[outPtr >> 1] = 0;\n\t\t\treturn outPtr - startPtr;\n\t\t};\n\t\tvar lengthBytesUTF16 = (str) => str.length * 2;\n\t\tvar UTF32ToString = (ptr, maxBytesToRead) => {\n\t\t\tvar i = 0;\n\t\t\tvar str = '';\n\t\t\twhile (!(i >= maxBytesToRead / 4)) {\n\t\t\t\tvar utf32 = HEAP32[(ptr + i * 4) >> 2];\n\t\t\t\tif (utf32 == 0) break;\n\t\t\t\t++i;\n\t\t\t\tif (utf32 >= 65536) {\n\t\t\t\t\tvar ch = utf32 - 65536;\n\t\t\t\t\tstr += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n\t\t\t\t} else {\n\t\t\t\t\tstr += String.fromCharCode(utf32);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn str;\n\t\t};\n\t\tvar stringToUTF32 = (str, outPtr, maxBytesToWrite) => {\n\t\t\tif (maxBytesToWrite === undefined) {\n\t\t\t\tmaxBytesToWrite = 2147483647;\n\t\t\t}\n\t\t\tif (maxBytesToWrite < 4) return 0;\n\t\t\tvar startPtr = outPtr;\n\t\t\tvar endPtr = startPtr + maxBytesToWrite - 4;\n\t\t\tfor (var i = 0; i < str.length; ++i) {\n\t\t\t\tvar codeUnit = str.charCodeAt(i);\n\t\t\t\tif (codeUnit >= 55296 && codeUnit <= 57343) {\n\t\t\t\t\tvar trailSurrogate = str.charCodeAt(++i);\n\t\t\t\t\tcodeUnit = (65536 + ((codeUnit & 1023) << 10)) | (trailSurrogate & 1023);\n\t\t\t\t}\n\t\t\t\tHEAP32[outPtr >> 2] = codeUnit;\n\t\t\t\toutPtr += 4;\n\t\t\t\tif (outPtr + 4 > endPtr) break;\n\t\t\t}\n\t\t\tHEAP32[outPtr >> 2] = 0;\n\t\t\treturn outPtr - startPtr;\n\t\t};\n\t\tvar lengthBytesUTF32 = (str) => {\n\t\t\tvar len = 0;\n\t\t\tfor (var i = 0; i < str.length; ++i) {\n\t\t\t\tvar codeUnit = str.charCodeAt(i);\n\t\t\t\tif (codeUnit >= 55296 && codeUnit <= 57343) ++i;\n\t\t\t\tlen += 4;\n\t\t\t}\n\t\t\treturn len;\n\t\t};\n\t\tvar __embind_register_std_wstring = (rawType, charSize, name) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tvar decodeString, encodeString, getHeap, lengthBytesUTF, shift;\n\t\t\tif (charSize === 2) {\n\t\t\t\tdecodeString = UTF16ToString;\n\t\t\t\tencodeString = stringToUTF16;\n\t\t\t\tlengthBytesUTF = lengthBytesUTF16;\n\t\t\t\tgetHeap = () => HEAPU16;\n\t\t\t\tshift = 1;\n\t\t\t} else if (charSize === 4) {\n\t\t\t\tdecodeString = UTF32ToString;\n\t\t\t\tencodeString = stringToUTF32;\n\t\t\t\tlengthBytesUTF = lengthBytesUTF32;\n\t\t\t\tgetHeap = () => HEAPU32;\n\t\t\t\tshift = 2;\n\t\t\t}\n\t\t\tregisterType(rawType, {\n\t\t\t\tname: name,\n\t\t\t\tfromWireType: (value) => {\n\t\t\t\t\tvar length = HEAPU32[value >> 2];\n\t\t\t\t\tvar HEAP = getHeap();\n\t\t\t\t\tvar str;\n\t\t\t\t\tvar decodeStartPtr = value + 4;\n\t\t\t\t\tfor (var i = 0; i <= length; ++i) {\n\t\t\t\t\t\tvar currentBytePtr = value + 4 + i * charSize;\n\t\t\t\t\t\tif (i == length || HEAP[currentBytePtr >> shift] == 0) {\n\t\t\t\t\t\t\tvar maxReadBytes = currentBytePtr - decodeStartPtr;\n\t\t\t\t\t\t\tvar stringSegment = decodeString(decodeStartPtr, maxReadBytes);\n\t\t\t\t\t\t\tif (str === undefined) {\n\t\t\t\t\t\t\t\tstr = stringSegment;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstr += String.fromCharCode(0);\n\t\t\t\t\t\t\t\tstr += stringSegment;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdecodeStartPtr = currentBytePtr + charSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_free(value);\n\t\t\t\t\treturn str;\n\t\t\t\t},\n\t\t\t\ttoWireType: (destructors, value) => {\n\t\t\t\t\tif (!(typeof value == 'string')) {\n\t\t\t\t\t\tthrowBindingError(`Cannot pass non-string to C++ string type ${name}`);\n\t\t\t\t\t}\n\t\t\t\t\tvar length = lengthBytesUTF(value);\n\t\t\t\t\tvar ptr = _malloc(4 + length + charSize);\n\t\t\t\t\tHEAPU32[ptr >> 2] = length >> shift;\n\t\t\t\t\tencodeString(value, ptr + 4, length + charSize);\n\t\t\t\t\tif (destructors !== null) {\n\t\t\t\t\t\tdestructors.push(_free, ptr);\n\t\t\t\t\t}\n\t\t\t\t\treturn ptr;\n\t\t\t\t},\n\t\t\t\targPackAdvance: GenericWireTypeSize,\n\t\t\t\treadValueFromPointer: simpleReadValueFromPointer,\n\t\t\t\tdestructorFunction: (ptr) => _free(ptr),\n\t\t\t});\n\t\t};\n\t\tvar __embind_register_value_object = (\n\t\t\trawType,\n\t\t\tname,\n\t\t\tconstructorSignature,\n\t\t\trawConstructor,\n\t\t\tdestructorSignature,\n\t\t\trawDestructor\n\t\t) => {\n\t\t\tstructRegistrations[rawType] = {\n\t\t\t\tname: readLatin1String(name),\n\t\t\t\trawConstructor: embind__requireFunction(constructorSignature, rawConstructor),\n\t\t\t\trawDestructor: embind__requireFunction(destructorSignature, rawDestructor),\n\t\t\t\tfields: [],\n\t\t\t};\n\t\t};\n\t\tvar __embind_register_value_object_field = (\n\t\t\tstructType,\n\t\t\tfieldName,\n\t\t\tgetterReturnType,\n\t\t\tgetterSignature,\n\t\t\tgetter,\n\t\t\tgetterContext,\n\t\t\tsetterArgumentType,\n\t\t\tsetterSignature,\n\t\t\tsetter,\n\t\t\tsetterContext\n\t\t) => {\n\t\t\tstructRegistrations[structType].fields.push({\n\t\t\t\tfieldName: readLatin1String(fieldName),\n\t\t\t\tgetterReturnType: getterReturnType,\n\t\t\t\tgetter: embind__requireFunction(getterSignature, getter),\n\t\t\t\tgetterContext: getterContext,\n\t\t\t\tsetterArgumentType: setterArgumentType,\n\t\t\t\tsetter: embind__requireFunction(setterSignature, setter),\n\t\t\t\tsetterContext: setterContext,\n\t\t\t});\n\t\t};\n\t\tvar __embind_register_void = (rawType, name) => {\n\t\t\tname = readLatin1String(name);\n\t\t\tregisterType(rawType, {\n\t\t\t\tisVoid: true,\n\t\t\t\tname: name,\n\t\t\t\targPackAdvance: 0,\n\t\t\t\tfromWireType: () => undefined,\n\t\t\t\ttoWireType: (destructors, o) => undefined,\n\t\t\t});\n\t\t};\n\t\tvar __emval_as = (handle, returnType, destructorsRef) => {\n\t\t\thandle = Emval.toValue(handle);\n\t\t\treturnType = requireRegisteredType(returnType, 'emval::as');\n\t\t\tvar destructors = [];\n\t\t\tvar rd = Emval.toHandle(destructors);\n\t\t\tHEAPU32[destructorsRef >> 2] = rd;\n\t\t\treturn returnType['toWireType'](destructors, handle);\n\t\t};\n\t\tvar emval_allocateDestructors = (destructorsRef) => {\n\t\t\tvar destructors = [];\n\t\t\tHEAPU32[destructorsRef >> 2] = Emval.toHandle(destructors);\n\t\t\treturn destructors;\n\t\t};\n\t\tvar emval_symbols = {};\n\t\tvar getStringOrSymbol = (address) => {\n\t\t\tvar symbol = emval_symbols[address];\n\t\t\tif (symbol === undefined) {\n\t\t\t\treturn readLatin1String(address);\n\t\t\t}\n\t\t\treturn symbol;\n\t\t};\n\t\tvar emval_methodCallers = [];\n\t\tvar __emval_call_method = (caller, handle, methodName, destructorsRef, args) => {\n\t\t\tcaller = emval_methodCallers[caller];\n\t\t\thandle = Emval.toValue(handle);\n\t\t\tmethodName = getStringOrSymbol(methodName);\n\t\t\treturn caller(handle, methodName, emval_allocateDestructors(destructorsRef), args);\n\t\t};\n\t\tvar __emval_call_void_method = (caller, handle, methodName, args) => {\n\t\t\tcaller = emval_methodCallers[caller];\n\t\t\thandle = Emval.toValue(handle);\n\t\t\tmethodName = getStringOrSymbol(methodName);\n\t\t\tcaller(handle, methodName, null, args);\n\t\t};\n\t\tvar __emval_equals = (first, second) => {\n\t\t\tfirst = Emval.toValue(first);\n\t\t\tsecond = Emval.toValue(second);\n\t\t\treturn first == second;\n\t\t};\n\t\tvar emval_addMethodCaller = (caller) => {\n\t\t\tvar id = emval_methodCallers.length;\n\t\t\temval_methodCallers.push(caller);\n\t\t\treturn id;\n\t\t};\n\t\tvar emval_lookupTypes = (argCount, argTypes) => {\n\t\t\tvar a = new Array(argCount);\n\t\t\tfor (var i = 0; i < argCount; ++i) {\n\t\t\t\ta[i] = requireRegisteredType(HEAPU32[(argTypes + i * 4) >> 2], 'parameter ' + i);\n\t\t\t}\n\t\t\treturn a;\n\t\t};\n\t\tvar emval_registeredMethods = [];\n\t\tvar __emval_get_method_caller = (argCount, argTypes) => {\n\t\t\tvar types = emval_lookupTypes(argCount, argTypes);\n\t\t\tvar retType = types[0];\n\t\t\tvar signatureName =\n\t\t\t\tretType.name +\n\t\t\t\t'_$' +\n\t\t\t\ttypes\n\t\t\t\t\t.slice(1)\n\t\t\t\t\t.map(function (t) {\n\t\t\t\t\t\treturn t.name;\n\t\t\t\t\t})\n\t\t\t\t\t.join('_') +\n\t\t\t\t'$';\n\t\t\tvar returnId = emval_registeredMethods[signatureName];\n\t\t\tif (returnId !== undefined) {\n\t\t\t\treturn returnId;\n\t\t\t}\n\t\t\tvar params = ['retType'];\n\t\t\tvar args = [retType];\n\t\t\tvar argsList = '';\n\t\t\tfor (var i = 0; i < argCount - 1; ++i) {\n\t\t\t\targsList += (i !== 0 ? ', ' : '') + 'arg' + i;\n\t\t\t\tparams.push('argType' + i);\n\t\t\t\targs.push(types[1 + i]);\n\t\t\t}\n\t\t\tvar functionName = makeLegalFunctionName('methodCaller_' + signatureName);\n\t\t\tvar functionBody = 'return function ' + functionName + '(handle, name, destructors, args) {\\n';\n\t\t\tvar offset = 0;\n\t\t\tfor (var i = 0; i < argCount - 1; ++i) {\n\t\t\t\tfunctionBody +=\n\t\t\t\t\t'    var arg' +\n\t\t\t\t\ti +\n\t\t\t\t\t' = argType' +\n\t\t\t\t\ti +\n\t\t\t\t\t'.readValueFromPointer(args' +\n\t\t\t\t\t(offset ? '+' + offset : '') +\n\t\t\t\t\t');\\n';\n\t\t\t\toffset += types[i + 1]['argPackAdvance'];\n\t\t\t}\n\t\t\tfunctionBody += '    var rv = handle[name](' + argsList + ');\\n';\n\t\t\tfor (var i = 0; i < argCount - 1; ++i) {\n\t\t\t\tif (types[i + 1]['deleteObject']) {\n\t\t\t\t\tfunctionBody += '    argType' + i + '.deleteObject(arg' + i + ');\\n';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!retType.isVoid) {\n\t\t\t\tfunctionBody += '    return retType.toWireType(destructors, rv);\\n';\n\t\t\t}\n\t\t\tfunctionBody += '};\\n';\n\t\t\tparams.push(functionBody);\n\t\t\tvar invokerFunction = newFunc(Function, params).apply(null, args);\n\t\t\treturnId = emval_addMethodCaller(invokerFunction);\n\t\t\temval_registeredMethods[signatureName] = returnId;\n\t\t\treturn returnId;\n\t\t};\n\t\tvar __emval_get_property = (handle, key) => {\n\t\t\thandle = Emval.toValue(handle);\n\t\t\tkey = Emval.toValue(key);\n\t\t\treturn Emval.toHandle(handle[key]);\n\t\t};\n\t\tvar __emval_incref = (handle) => {\n\t\t\tif (handle > 4) {\n\t\t\t\temval_handles.get(handle).refcount += 1;\n\t\t\t}\n\t\t};\n\t\tvar __emval_new_cstring = (v) => Emval.toHandle(getStringOrSymbol(v));\n\t\tvar __emval_new_object = () => Emval.toHandle({});\n\t\tvar __emval_run_destructors = (handle) => {\n\t\t\tvar destructors = Emval.toValue(handle);\n\t\t\trunDestructors(destructors);\n\t\t\t__emval_decref(handle);\n\t\t};\n\t\tvar __emval_set_property = (handle, key, value) => {\n\t\t\thandle = Emval.toValue(handle);\n\t\t\tkey = Emval.toValue(key);\n\t\t\tvalue = Emval.toValue(value);\n\t\t\thandle[key] = value;\n\t\t};\n\t\tvar __emval_take_value = (type, arg) => {\n\t\t\ttype = requireRegisteredType(type, '_emval_take_value');\n\t\t\tvar v = type['readValueFromPointer'](arg);\n\t\t\treturn Emval.toHandle(v);\n\t\t};\n\t\tvar _abort = () => {\n\t\t\tabort('');\n\t\t};\n\t\tvar _emscripten_memcpy_big = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);\n\t\tvar getHeapMax = () => 2147483648;\n\t\tvar growMemory = (size) => {\n\t\t\tvar b = wasmMemory.buffer;\n\t\t\tvar pages = (size - b.byteLength + 65535) / 65536;\n\t\t\ttry {\n\t\t\t\twasmMemory.grow(pages);\n\t\t\t\tupdateMemoryViews();\n\t\t\t\treturn 1;\n\t\t\t} catch (e) {}\n\t\t};\n\t\tvar _emscripten_resize_heap = (requestedSize) => {\n\t\t\tvar oldSize = HEAPU8.length;\n\t\t\trequestedSize >>>= 0;\n\t\t\tvar maxHeapSize = getHeapMax();\n\t\t\tif (requestedSize > maxHeapSize) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar alignUp = (x, multiple) => x + ((multiple - (x % multiple)) % multiple);\n\t\t\tfor (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n\t\t\t\tvar overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n\t\t\t\toverGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n\t\t\t\tvar newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n\t\t\t\tvar replacement = growMemory(newSize);\n\t\t\t\tif (replacement) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t\tvar ENV = {};\n\t\tvar getExecutableName = () => thisProgram || './this.program';\n\t\tvar getEnvStrings = () => {\n\t\t\tif (!getEnvStrings.strings) {\n\t\t\t\tvar lang =\n\t\t\t\t\t((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace(\n\t\t\t\t\t\t'-',\n\t\t\t\t\t\t'_'\n\t\t\t\t\t) + '.UTF-8';\n\t\t\t\tvar env = {\n\t\t\t\t\tUSER: 'web_user',\n\t\t\t\t\tLOGNAME: 'web_user',\n\t\t\t\t\tPATH: '/',\n\t\t\t\t\tPWD: '/',\n\t\t\t\t\tHOME: '/home/web_user',\n\t\t\t\t\tLANG: lang,\n\t\t\t\t\t_: getExecutableName(),\n\t\t\t\t};\n\t\t\t\tfor (var x in ENV) {\n\t\t\t\t\tif (ENV[x] === undefined) delete env[x];\n\t\t\t\t\telse env[x] = ENV[x];\n\t\t\t\t}\n\t\t\t\tvar strings = [];\n\t\t\t\tfor (var x in env) {\n\t\t\t\t\tstrings.push(`${x}=${env[x]}`);\n\t\t\t\t}\n\t\t\t\tgetEnvStrings.strings = strings;\n\t\t\t}\n\t\t\treturn getEnvStrings.strings;\n\t\t};\n\t\tvar stringToAscii = (str, buffer) => {\n\t\t\tfor (var i = 0; i < str.length; ++i) {\n\t\t\t\tHEAP8[buffer++ >> 0] = str.charCodeAt(i);\n\t\t\t}\n\t\t\tHEAP8[buffer >> 0] = 0;\n\t\t};\n\t\tvar PATH = {\n\t\t\tisAbs: (path) => path.charAt(0) === '/',\n\t\t\tsplitPath: (filename) => {\n\t\t\t\tvar splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n\t\t\t\treturn splitPathRe.exec(filename).slice(1);\n\t\t\t},\n\t\t\tnormalizeArray: (parts, allowAboveRoot) => {\n\t\t\t\tvar up = 0;\n\t\t\t\tfor (var i = parts.length - 1; i >= 0; i--) {\n\t\t\t\t\tvar last = parts[i];\n\t\t\t\t\tif (last === '.') {\n\t\t\t\t\t\tparts.splice(i, 1);\n\t\t\t\t\t} else if (last === '..') {\n\t\t\t\t\t\tparts.splice(i, 1);\n\t\t\t\t\t\tup++;\n\t\t\t\t\t} else if (up) {\n\t\t\t\t\t\tparts.splice(i, 1);\n\t\t\t\t\t\tup--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (allowAboveRoot) {\n\t\t\t\t\tfor (; up; up--) {\n\t\t\t\t\t\tparts.unshift('..');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn parts;\n\t\t\t},\n\t\t\tnormalize: (path) => {\n\t\t\t\tvar isAbsolute = PATH.isAbs(path),\n\t\t\t\t\ttrailingSlash = path.substr(-1) === '/';\n\t\t\t\tpath = PATH.normalizeArray(\n\t\t\t\t\tpath.split('/').filter((p) => !!p),\n\t\t\t\t\t!isAbsolute\n\t\t\t\t).join('/');\n\t\t\t\tif (!path && !isAbsolute) {\n\t\t\t\t\tpath = '.';\n\t\t\t\t}\n\t\t\t\tif (path && trailingSlash) {\n\t\t\t\t\tpath += '/';\n\t\t\t\t}\n\t\t\t\treturn (isAbsolute ? '/' : '') + path;\n\t\t\t},\n\t\t\tdirname: (path) => {\n\t\t\t\tvar result = PATH.splitPath(path),\n\t\t\t\t\troot = result[0],\n\t\t\t\t\tdir = result[1];\n\t\t\t\tif (!root && !dir) {\n\t\t\t\t\treturn '.';\n\t\t\t\t}\n\t\t\t\tif (dir) {\n\t\t\t\t\tdir = dir.substr(0, dir.length - 1);\n\t\t\t\t}\n\t\t\t\treturn root + dir;\n\t\t\t},\n\t\t\tbasename: (path) => {\n\t\t\t\tif (path === '/') return '/';\n\t\t\t\tpath = PATH.normalize(path);\n\t\t\t\tpath = path.replace(/\\/$/, '');\n\t\t\t\tvar lastSlash = path.lastIndexOf('/');\n\t\t\t\tif (lastSlash === -1) return path;\n\t\t\t\treturn path.substr(lastSlash + 1);\n\t\t\t},\n\t\t\tjoin: function () {\n\t\t\t\tvar paths = Array.prototype.slice.call(arguments);\n\t\t\t\treturn PATH.normalize(paths.join('/'));\n\t\t\t},\n\t\t\tjoin2: (l, r) => PATH.normalize(l + '/' + r),\n\t\t};\n\t\tvar initRandomFill = () => {\n\t\t\tif (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') {\n\t\t\t\treturn (view) => crypto.getRandomValues(view);\n\t\t\t} else if (ENVIRONMENT_IS_NODE) {\n\t\t\t\t// try {\n\t\t\t\t// \tvar crypto_module = require('crypto');\n\t\t\t\t// \tvar randomFillSync = crypto_module['randomFillSync'];\n\t\t\t\t// \tif (randomFillSync) {\n\t\t\t\t// \t\treturn (view) => crypto_module['randomFillSync'](view);\n\t\t\t\t// \t}\n\t\t\t\t// \tvar randomBytes = crypto_module['randomBytes'];\n\t\t\t\t// \treturn (view) => (view.set(randomBytes(view.byteLength)), view);\n\t\t\t\t// } catch (e) {}\n\t\t\t}\n\t\t\tabort('initRandomDevice');\n\t\t};\n\t\tvar randomFill = (view) => (randomFill = initRandomFill())(view);\n\t\tvar PATH_FS = {\n\t\t\tresolve: function () {\n\t\t\t\tvar resolvedPath = '',\n\t\t\t\t\tresolvedAbsolute = false;\n\t\t\t\tfor (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n\t\t\t\t\tvar path = i >= 0 ? arguments[i] : FS.cwd();\n\t\t\t\t\tif (typeof path != 'string') {\n\t\t\t\t\t\tthrow new TypeError('Arguments to path.resolve must be strings');\n\t\t\t\t\t} else if (!path) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t\tresolvedPath = path + '/' + resolvedPath;\n\t\t\t\t\tresolvedAbsolute = PATH.isAbs(path);\n\t\t\t\t}\n\t\t\t\tresolvedPath = PATH.normalizeArray(\n\t\t\t\t\tresolvedPath.split('/').filter((p) => !!p),\n\t\t\t\t\t!resolvedAbsolute\n\t\t\t\t).join('/');\n\t\t\t\treturn (resolvedAbsolute ? '/' : '') + resolvedPath || '.';\n\t\t\t},\n\t\t\trelative: (from, to) => {\n\t\t\t\tfrom = PATH_FS.resolve(from).substr(1);\n\t\t\t\tto = PATH_FS.resolve(to).substr(1);\n\t\t\t\tfunction trim(arr) {\n\t\t\t\t\tvar start = 0;\n\t\t\t\t\tfor (; start < arr.length; start++) {\n\t\t\t\t\t\tif (arr[start] !== '') break;\n\t\t\t\t\t}\n\t\t\t\t\tvar end = arr.length - 1;\n\t\t\t\t\tfor (; end >= 0; end--) {\n\t\t\t\t\t\tif (arr[end] !== '') break;\n\t\t\t\t\t}\n\t\t\t\t\tif (start > end) return [];\n\t\t\t\t\treturn arr.slice(start, end - start + 1);\n\t\t\t\t}\n\t\t\t\tvar fromParts = trim(from.split('/'));\n\t\t\t\tvar toParts = trim(to.split('/'));\n\t\t\t\tvar length = Math.min(fromParts.length, toParts.length);\n\t\t\t\tvar samePartsLength = length;\n\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\tif (fromParts[i] !== toParts[i]) {\n\t\t\t\t\t\tsamePartsLength = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar outputParts = [];\n\t\t\t\tfor (var i = samePartsLength; i < fromParts.length; i++) {\n\t\t\t\t\toutputParts.push('..');\n\t\t\t\t}\n\t\t\t\toutputParts = outputParts.concat(toParts.slice(samePartsLength));\n\t\t\t\treturn outputParts.join('/');\n\t\t\t},\n\t\t};\n\t\tvar FS_stdin_getChar_buffer = [];\n\t\tfunction intArrayFromString(stringy, dontAddNull, length) {\n\t\t\tvar len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;\n\t\t\tvar u8array = new Array(len);\n\t\t\tvar numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);\n\t\t\tif (dontAddNull) u8array.length = numBytesWritten;\n\t\t\treturn u8array;\n\t\t}\n\t\tvar FS_stdin_getChar = () => {\n\t\t\tif (!FS_stdin_getChar_buffer.length) {\n\t\t\t\tvar result = null;\n\t\t\t\tif (ENVIRONMENT_IS_NODE) {\n\t\t\t\t\t// var BUFSIZE = 256;\n\t\t\t\t\t// var buf = Buffer.alloc(BUFSIZE);\n\t\t\t\t\t// var bytesRead = 0;\n\t\t\t\t\t// var fd = process.stdin.fd;\n\t\t\t\t\t// try {\n\t\t\t\t\t// \tbytesRead = fs.readSync(fd, buf);\n\t\t\t\t\t// } catch (e) {\n\t\t\t\t\t// \tif (e.toString().includes('EOF')) bytesRead = 0;\n\t\t\t\t\t// \telse throw e;\n\t\t\t\t\t// }\n\t\t\t\t\t// if (bytesRead > 0) {\n\t\t\t\t\t// \tresult = buf.slice(0, bytesRead).toString('utf-8');\n\t\t\t\t\t// } else {\n\t\t\t\t\t// \tresult = null;\n\t\t\t\t\t// }\n\t\t\t\t} else if (typeof window != 'undefined' && typeof window.prompt == 'function') {\n\t\t\t\t\tresult = window.prompt('Input: ');\n\t\t\t\t\tif (result !== null) {\n\t\t\t\t\t\tresult += '\\n';\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof readline == 'function') {\n\t\t\t\t\tresult = readline();\n\t\t\t\t\tif (result !== null) {\n\t\t\t\t\t\tresult += '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!result) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tFS_stdin_getChar_buffer = intArrayFromString(result, true);\n\t\t\t}\n\t\t\treturn FS_stdin_getChar_buffer.shift();\n\t\t};\n\t\tvar TTY = {\n\t\t\tttys: [],\n\t\t\tinit() {},\n\t\t\tshutdown() {},\n\t\t\tregister(dev, ops) {\n\t\t\t\tTTY.ttys[dev] = {input: [], output: [], ops: ops};\n\t\t\t\tFS.registerDevice(dev, TTY.stream_ops);\n\t\t\t},\n\t\t\tstream_ops: {\n\t\t\t\topen(stream) {\n\t\t\t\t\tvar tty = TTY.ttys[stream.node.rdev];\n\t\t\t\t\tif (!tty) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(43);\n\t\t\t\t\t}\n\t\t\t\t\tstream.tty = tty;\n\t\t\t\t\tstream.seekable = false;\n\t\t\t\t},\n\t\t\t\tclose(stream) {\n\t\t\t\t\tstream.tty.ops.fsync(stream.tty);\n\t\t\t\t},\n\t\t\t\tfsync(stream) {\n\t\t\t\t\tstream.tty.ops.fsync(stream.tty);\n\t\t\t\t},\n\t\t\t\tread(stream, buffer, offset, length, pos) {\n\t\t\t\t\tif (!stream.tty || !stream.tty.ops.get_char) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(60);\n\t\t\t\t\t}\n\t\t\t\t\tvar bytesRead = 0;\n\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\tvar result;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresult = stream.tty.ops.get_char(stream.tty);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tthrow new FS.ErrnoError(29);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result === undefined && bytesRead === 0) {\n\t\t\t\t\t\t\tthrow new FS.ErrnoError(6);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result === null || result === undefined) break;\n\t\t\t\t\t\tbytesRead++;\n\t\t\t\t\t\tbuffer[offset + i] = result;\n\t\t\t\t\t}\n\t\t\t\t\tif (bytesRead) {\n\t\t\t\t\t\tstream.node.timestamp = Date.now();\n\t\t\t\t\t}\n\t\t\t\t\treturn bytesRead;\n\t\t\t\t},\n\t\t\t\twrite(stream, buffer, offset, length, pos) {\n\t\t\t\t\tif (!stream.tty || !stream.tty.ops.put_char) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(60);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\tstream.tty.ops.put_char(stream.tty, buffer[offset + i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(29);\n\t\t\t\t\t}\n\t\t\t\t\tif (length) {\n\t\t\t\t\t\tstream.node.timestamp = Date.now();\n\t\t\t\t\t}\n\t\t\t\t\treturn i;\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault_tty_ops: {\n\t\t\t\tget_char(tty) {\n\t\t\t\t\treturn FS_stdin_getChar();\n\t\t\t\t},\n\t\t\t\tput_char(tty, val) {\n\t\t\t\t\tif (val === null || val === 10) {\n\t\t\t\t\t\tout(UTF8ArrayToString(tty.output, 0));\n\t\t\t\t\t\ttty.output = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (val != 0) tty.output.push(val);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfsync(tty) {\n\t\t\t\t\tif (tty.output && tty.output.length > 0) {\n\t\t\t\t\t\tout(UTF8ArrayToString(tty.output, 0));\n\t\t\t\t\t\ttty.output = [];\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tioctl_tcgets(tty) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tc_iflag: 25856,\n\t\t\t\t\t\tc_oflag: 5,\n\t\t\t\t\t\tc_cflag: 191,\n\t\t\t\t\t\tc_lflag: 35387,\n\t\t\t\t\t\tc_cc: [\n\t\t\t\t\t\t\t3, 28, 127, 21, 4, 0, 1, 0, 17, 19, 26, 0, 18, 15, 23, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t\t\t\t\t\t\t0, 0, 0, 0, 0,\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tioctl_tcsets(tty, optional_actions, data) {\n\t\t\t\t\treturn 0;\n\t\t\t\t},\n\t\t\t\tioctl_tiocgwinsz(tty) {\n\t\t\t\t\treturn [24, 80];\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault_tty1_ops: {\n\t\t\t\tput_char(tty, val) {\n\t\t\t\t\tif (val === null || val === 10) {\n\t\t\t\t\t\terr(UTF8ArrayToString(tty.output, 0));\n\t\t\t\t\t\ttty.output = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (val != 0) tty.output.push(val);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfsync(tty) {\n\t\t\t\t\tif (tty.output && tty.output.length > 0) {\n\t\t\t\t\t\terr(UTF8ArrayToString(tty.output, 0));\n\t\t\t\t\t\ttty.output = [];\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tvar mmapAlloc = (size) => {\n\t\t\tabort();\n\t\t};\n\t\tvar MEMFS = {\n\t\t\tops_table: null,\n\t\t\tmount(mount) {\n\t\t\t\treturn MEMFS.createNode(null, '/', 16384 | 511, 0);\n\t\t\t},\n\t\t\tcreateNode(parent, name, mode, dev) {\n\t\t\t\tif (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tif (!MEMFS.ops_table) {\n\t\t\t\t\tMEMFS.ops_table = {\n\t\t\t\t\t\tdir: {\n\t\t\t\t\t\t\tnode: {\n\t\t\t\t\t\t\t\tgetattr: MEMFS.node_ops.getattr,\n\t\t\t\t\t\t\t\tsetattr: MEMFS.node_ops.setattr,\n\t\t\t\t\t\t\t\tlookup: MEMFS.node_ops.lookup,\n\t\t\t\t\t\t\t\tmknod: MEMFS.node_ops.mknod,\n\t\t\t\t\t\t\t\trename: MEMFS.node_ops.rename,\n\t\t\t\t\t\t\t\tunlink: MEMFS.node_ops.unlink,\n\t\t\t\t\t\t\t\trmdir: MEMFS.node_ops.rmdir,\n\t\t\t\t\t\t\t\treaddir: MEMFS.node_ops.readdir,\n\t\t\t\t\t\t\t\tsymlink: MEMFS.node_ops.symlink,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstream: {llseek: MEMFS.stream_ops.llseek},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfile: {\n\t\t\t\t\t\t\tnode: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr},\n\t\t\t\t\t\t\tstream: {\n\t\t\t\t\t\t\t\tllseek: MEMFS.stream_ops.llseek,\n\t\t\t\t\t\t\t\tread: MEMFS.stream_ops.read,\n\t\t\t\t\t\t\t\twrite: MEMFS.stream_ops.write,\n\t\t\t\t\t\t\t\tallocate: MEMFS.stream_ops.allocate,\n\t\t\t\t\t\t\t\tmmap: MEMFS.stream_ops.mmap,\n\t\t\t\t\t\t\t\tmsync: MEMFS.stream_ops.msync,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\tnode: {\n\t\t\t\t\t\t\t\tgetattr: MEMFS.node_ops.getattr,\n\t\t\t\t\t\t\t\tsetattr: MEMFS.node_ops.setattr,\n\t\t\t\t\t\t\t\treadlink: MEMFS.node_ops.readlink,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstream: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchrdev: {\n\t\t\t\t\t\t\tnode: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr},\n\t\t\t\t\t\t\tstream: FS.chrdev_stream_ops,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tvar node = FS.createNode(parent, name, mode, dev);\n\t\t\t\tif (FS.isDir(node.mode)) {\n\t\t\t\t\tnode.node_ops = MEMFS.ops_table.dir.node;\n\t\t\t\t\tnode.stream_ops = MEMFS.ops_table.dir.stream;\n\t\t\t\t\tnode.contents = {};\n\t\t\t\t} else if (FS.isFile(node.mode)) {\n\t\t\t\t\tnode.node_ops = MEMFS.ops_table.file.node;\n\t\t\t\t\tnode.stream_ops = MEMFS.ops_table.file.stream;\n\t\t\t\t\tnode.usedBytes = 0;\n\t\t\t\t\tnode.contents = null;\n\t\t\t\t} else if (FS.isLink(node.mode)) {\n\t\t\t\t\tnode.node_ops = MEMFS.ops_table.link.node;\n\t\t\t\t\tnode.stream_ops = MEMFS.ops_table.link.stream;\n\t\t\t\t} else if (FS.isChrdev(node.mode)) {\n\t\t\t\t\tnode.node_ops = MEMFS.ops_table.chrdev.node;\n\t\t\t\t\tnode.stream_ops = MEMFS.ops_table.chrdev.stream;\n\t\t\t\t}\n\t\t\t\tnode.timestamp = Date.now();\n\t\t\t\tif (parent) {\n\t\t\t\t\tparent.contents[name] = node;\n\t\t\t\t\tparent.timestamp = node.timestamp;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t},\n\t\t\tgetFileDataAsTypedArray(node) {\n\t\t\t\tif (!node.contents) return new Uint8Array(0);\n\t\t\t\tif (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);\n\t\t\t\treturn new Uint8Array(node.contents);\n\t\t\t},\n\t\t\texpandFileStorage(node, newCapacity) {\n\t\t\t\tvar prevCapacity = node.contents ? node.contents.length : 0;\n\t\t\t\tif (prevCapacity >= newCapacity) return;\n\t\t\t\tvar CAPACITY_DOUBLING_MAX = 1024 * 1024;\n\t\t\t\tnewCapacity = Math.max(\n\t\t\t\t\tnewCapacity,\n\t\t\t\t\t(prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0\n\t\t\t\t);\n\t\t\t\tif (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);\n\t\t\t\tvar oldContents = node.contents;\n\t\t\t\tnode.contents = new Uint8Array(newCapacity);\n\t\t\t\tif (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);\n\t\t\t},\n\t\t\tresizeFileStorage(node, newSize) {\n\t\t\t\tif (node.usedBytes == newSize) return;\n\t\t\t\tif (newSize == 0) {\n\t\t\t\t\tnode.contents = null;\n\t\t\t\t\tnode.usedBytes = 0;\n\t\t\t\t} else {\n\t\t\t\t\tvar oldContents = node.contents;\n\t\t\t\t\tnode.contents = new Uint8Array(newSize);\n\t\t\t\t\tif (oldContents) {\n\t\t\t\t\t\tnode.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)));\n\t\t\t\t\t}\n\t\t\t\t\tnode.usedBytes = newSize;\n\t\t\t\t}\n\t\t\t},\n\t\t\tnode_ops: {\n\t\t\t\tgetattr(node) {\n\t\t\t\t\tvar attr = {};\n\t\t\t\t\tattr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n\t\t\t\t\tattr.ino = node.id;\n\t\t\t\t\tattr.mode = node.mode;\n\t\t\t\t\tattr.nlink = 1;\n\t\t\t\t\tattr.uid = 0;\n\t\t\t\t\tattr.gid = 0;\n\t\t\t\t\tattr.rdev = node.rdev;\n\t\t\t\t\tif (FS.isDir(node.mode)) {\n\t\t\t\t\t\tattr.size = 4096;\n\t\t\t\t\t} else if (FS.isFile(node.mode)) {\n\t\t\t\t\t\tattr.size = node.usedBytes;\n\t\t\t\t\t} else if (FS.isLink(node.mode)) {\n\t\t\t\t\t\tattr.size = node.link.length;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tattr.size = 0;\n\t\t\t\t\t}\n\t\t\t\t\tattr.atime = new Date(node.timestamp);\n\t\t\t\t\tattr.mtime = new Date(node.timestamp);\n\t\t\t\t\tattr.ctime = new Date(node.timestamp);\n\t\t\t\t\tattr.blksize = 4096;\n\t\t\t\t\tattr.blocks = Math.ceil(attr.size / attr.blksize);\n\t\t\t\t\treturn attr;\n\t\t\t\t},\n\t\t\t\tsetattr(node, attr) {\n\t\t\t\t\tif (attr.mode !== undefined) {\n\t\t\t\t\t\tnode.mode = attr.mode;\n\t\t\t\t\t}\n\t\t\t\t\tif (attr.timestamp !== undefined) {\n\t\t\t\t\t\tnode.timestamp = attr.timestamp;\n\t\t\t\t\t}\n\t\t\t\t\tif (attr.size !== undefined) {\n\t\t\t\t\t\tMEMFS.resizeFileStorage(node, attr.size);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlookup(parent, name) {\n\t\t\t\t\tthrow FS.genericErrors[44];\n\t\t\t\t},\n\t\t\t\tmknod(parent, name, mode, dev) {\n\t\t\t\t\treturn MEMFS.createNode(parent, name, mode, dev);\n\t\t\t\t},\n\t\t\t\trename(old_node, new_dir, new_name) {\n\t\t\t\t\tif (FS.isDir(old_node.mode)) {\n\t\t\t\t\t\tvar new_node;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnew_node = FS.lookupNode(new_dir, new_name);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t\tif (new_node) {\n\t\t\t\t\t\t\tfor (var i in new_node.contents) {\n\t\t\t\t\t\t\t\tthrow new FS.ErrnoError(55);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdelete old_node.parent.contents[old_node.name];\n\t\t\t\t\told_node.parent.timestamp = Date.now();\n\t\t\t\t\told_node.name = new_name;\n\t\t\t\t\tnew_dir.contents[new_name] = old_node;\n\t\t\t\t\tnew_dir.timestamp = old_node.parent.timestamp;\n\t\t\t\t\told_node.parent = new_dir;\n\t\t\t\t},\n\t\t\t\tunlink(parent, name) {\n\t\t\t\t\tdelete parent.contents[name];\n\t\t\t\t\tparent.timestamp = Date.now();\n\t\t\t\t},\n\t\t\t\trmdir(parent, name) {\n\t\t\t\t\tvar node = FS.lookupNode(parent, name);\n\t\t\t\t\tfor (var i in node.contents) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(55);\n\t\t\t\t\t}\n\t\t\t\t\tdelete parent.contents[name];\n\t\t\t\t\tparent.timestamp = Date.now();\n\t\t\t\t},\n\t\t\t\treaddir(node) {\n\t\t\t\t\tvar entries = ['.', '..'];\n\t\t\t\t\tfor (var key in node.contents) {\n\t\t\t\t\t\tif (!node.contents.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentries.push(key);\n\t\t\t\t\t}\n\t\t\t\t\treturn entries;\n\t\t\t\t},\n\t\t\t\tsymlink(parent, newname, oldpath) {\n\t\t\t\t\tvar node = MEMFS.createNode(parent, newname, 511 | 40960, 0);\n\t\t\t\t\tnode.link = oldpath;\n\t\t\t\t\treturn node;\n\t\t\t\t},\n\t\t\t\treadlink(node) {\n\t\t\t\t\tif (!FS.isLink(node.mode)) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t\t}\n\t\t\t\t\treturn node.link;\n\t\t\t\t},\n\t\t\t},\n\t\t\tstream_ops: {\n\t\t\t\tread(stream, buffer, offset, length, position) {\n\t\t\t\t\tvar contents = stream.node.contents;\n\t\t\t\t\tif (position >= stream.node.usedBytes) return 0;\n\t\t\t\t\tvar size = Math.min(stream.node.usedBytes - position, length);\n\t\t\t\t\tif (size > 8 && contents.subarray) {\n\t\t\t\t\t\tbuffer.set(contents.subarray(position, position + size), offset);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i];\n\t\t\t\t\t}\n\t\t\t\t\treturn size;\n\t\t\t\t},\n\t\t\t\twrite(stream, buffer, offset, length, position, canOwn) {\n\t\t\t\t\tif (buffer.buffer === HEAP8.buffer) {\n\t\t\t\t\t\tcanOwn = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (!length) return 0;\n\t\t\t\t\tvar node = stream.node;\n\t\t\t\t\tnode.timestamp = Date.now();\n\t\t\t\t\tif (buffer.subarray && (!node.contents || node.contents.subarray)) {\n\t\t\t\t\t\tif (canOwn) {\n\t\t\t\t\t\t\tnode.contents = buffer.subarray(offset, offset + length);\n\t\t\t\t\t\t\tnode.usedBytes = length;\n\t\t\t\t\t\t\treturn length;\n\t\t\t\t\t\t} else if (node.usedBytes === 0 && position === 0) {\n\t\t\t\t\t\t\tnode.contents = buffer.slice(offset, offset + length);\n\t\t\t\t\t\t\tnode.usedBytes = length;\n\t\t\t\t\t\t\treturn length;\n\t\t\t\t\t\t} else if (position + length <= node.usedBytes) {\n\t\t\t\t\t\t\tnode.contents.set(buffer.subarray(offset, offset + length), position);\n\t\t\t\t\t\t\treturn length;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tMEMFS.expandFileStorage(node, position + length);\n\t\t\t\t\tif (node.contents.subarray && buffer.subarray) {\n\t\t\t\t\t\tnode.contents.set(buffer.subarray(offset, offset + length), position);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\tnode.contents[position + i] = buffer[offset + i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode.usedBytes = Math.max(node.usedBytes, position + length);\n\t\t\t\t\treturn length;\n\t\t\t\t},\n\t\t\t\tllseek(stream, offset, whence) {\n\t\t\t\t\tvar position = offset;\n\t\t\t\t\tif (whence === 1) {\n\t\t\t\t\t\tposition += stream.position;\n\t\t\t\t\t} else if (whence === 2) {\n\t\t\t\t\t\tif (FS.isFile(stream.node.mode)) {\n\t\t\t\t\t\t\tposition += stream.node.usedBytes;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (position < 0) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t\t}\n\t\t\t\t\treturn position;\n\t\t\t\t},\n\t\t\t\tallocate(stream, offset, length) {\n\t\t\t\t\tMEMFS.expandFileStorage(stream.node, offset + length);\n\t\t\t\t\tstream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);\n\t\t\t\t},\n\t\t\t\tmmap(stream, length, position, prot, flags) {\n\t\t\t\t\tif (!FS.isFile(stream.node.mode)) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(43);\n\t\t\t\t\t}\n\t\t\t\t\tvar ptr;\n\t\t\t\t\tvar allocated;\n\t\t\t\t\tvar contents = stream.node.contents;\n\t\t\t\t\tif (!(flags & 2) && contents.buffer === HEAP8.buffer) {\n\t\t\t\t\t\tallocated = false;\n\t\t\t\t\t\tptr = contents.byteOffset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (position > 0 || position + length < contents.length) {\n\t\t\t\t\t\t\tif (contents.subarray) {\n\t\t\t\t\t\t\t\tcontents = contents.subarray(position, position + length);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontents = Array.prototype.slice.call(contents, position, position + length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tallocated = true;\n\t\t\t\t\t\tptr = mmapAlloc(length);\n\t\t\t\t\t\tif (!ptr) {\n\t\t\t\t\t\t\tthrow new FS.ErrnoError(48);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tHEAP8.set(contents, ptr);\n\t\t\t\t\t}\n\t\t\t\t\treturn {ptr: ptr, allocated: allocated};\n\t\t\t\t},\n\t\t\t\tmsync(stream, buffer, offset, length, mmapFlags) {\n\t\t\t\t\tMEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);\n\t\t\t\t\treturn 0;\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tvar asyncLoad = (url, onload, onerror, noRunDep) => {\n\t\t\tvar dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : '';\n\t\t\treadAsync(\n\t\t\t\turl,\n\t\t\t\t(arrayBuffer) => {\n\t\t\t\t\tassert(arrayBuffer, `Loading data file \"${url}\" failed (no arrayBuffer).`);\n\t\t\t\t\tonload(new Uint8Array(arrayBuffer));\n\t\t\t\t\tif (dep) removeRunDependency(dep);\n\t\t\t\t},\n\t\t\t\t(event) => {\n\t\t\t\t\tif (onerror) {\n\t\t\t\t\t\tonerror();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow `Loading data file \"${url}\" failed.`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t\tif (dep) addRunDependency(dep);\n\t\t};\n\t\tvar preloadPlugins = Module['preloadPlugins'] || [];\n\t\tvar FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => {\n\t\t\tif (typeof Browser != 'undefined') Browser.init();\n\t\t\tvar handled = false;\n\t\t\tpreloadPlugins.forEach((plugin) => {\n\t\t\t\tif (handled) return;\n\t\t\t\tif (plugin['canHandle'](fullname)) {\n\t\t\t\t\tplugin['handle'](byteArray, fullname, finish, onerror);\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn handled;\n\t\t};\n\t\tvar FS_createPreloadedFile = (\n\t\t\tparent,\n\t\t\tname,\n\t\t\turl,\n\t\t\tcanRead,\n\t\t\tcanWrite,\n\t\t\tonload,\n\t\t\tonerror,\n\t\t\tdontCreateFile,\n\t\t\tcanOwn,\n\t\t\tpreFinish\n\t\t) => {\n\t\t\tvar fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;\n\t\t\tvar dep = getUniqueRunDependency(`cp ${fullname}`);\n\t\t\tfunction processData(byteArray) {\n\t\t\t\tfunction finish(byteArray) {\n\t\t\t\t\tif (preFinish) preFinish();\n\t\t\t\t\tif (!dontCreateFile) {\n\t\t\t\t\t\tFS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n\t\t\t\t\t}\n\t\t\t\t\tif (onload) onload();\n\t\t\t\t\tremoveRunDependency(dep);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tFS_handledByPreloadPlugin(byteArray, fullname, finish, () => {\n\t\t\t\t\t\tif (onerror) onerror();\n\t\t\t\t\t\tremoveRunDependency(dep);\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfinish(byteArray);\n\t\t\t}\n\t\t\taddRunDependency(dep);\n\t\t\tif (typeof url == 'string') {\n\t\t\t\tasyncLoad(url, (byteArray) => processData(byteArray), onerror);\n\t\t\t} else {\n\t\t\t\tprocessData(url);\n\t\t\t}\n\t\t};\n\t\tvar FS_modeStringToFlags = (str) => {\n\t\t\tvar flagModes = {r: 0, 'r+': 2, w: 512 | 64 | 1, 'w+': 512 | 64 | 2, a: 1024 | 64 | 1, 'a+': 1024 | 64 | 2};\n\t\t\tvar flags = flagModes[str];\n\t\t\tif (typeof flags == 'undefined') {\n\t\t\t\tthrow new Error(`Unknown file open mode: ${str}`);\n\t\t\t}\n\t\t\treturn flags;\n\t\t};\n\t\tvar FS_getMode = (canRead, canWrite) => {\n\t\t\tvar mode = 0;\n\t\t\tif (canRead) mode |= 292 | 73;\n\t\t\tif (canWrite) mode |= 146;\n\t\t\treturn mode;\n\t\t};\n\t\tvar FS = {\n\t\t\troot: null,\n\t\t\tmounts: [],\n\t\t\tdevices: {},\n\t\t\tstreams: [],\n\t\t\tnextInode: 1,\n\t\t\tnameTable: null,\n\t\t\tcurrentPath: '/',\n\t\t\tinitialized: false,\n\t\t\tignorePermissions: true,\n\t\t\tErrnoError: null,\n\t\t\tgenericErrors: {},\n\t\t\tfilesystems: null,\n\t\t\tsyncFSRequests: 0,\n\t\t\tlookupPath(path, opts = {}) {\n\t\t\t\tpath = PATH_FS.resolve(path);\n\t\t\t\tif (!path) return {path: '', node: null};\n\t\t\t\tvar defaults = {follow_mount: true, recurse_count: 0};\n\t\t\t\topts = Object.assign(defaults, opts);\n\t\t\t\tif (opts.recurse_count > 8) {\n\t\t\t\t\tthrow new FS.ErrnoError(32);\n\t\t\t\t}\n\t\t\t\tvar parts = path.split('/').filter((p) => !!p);\n\t\t\t\tvar current = FS.root;\n\t\t\t\tvar current_path = '/';\n\t\t\t\tfor (var i = 0; i < parts.length; i++) {\n\t\t\t\t\tvar islast = i === parts.length - 1;\n\t\t\t\t\tif (islast && opts.parent) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = FS.lookupNode(current, parts[i]);\n\t\t\t\t\tcurrent_path = PATH.join2(current_path, parts[i]);\n\t\t\t\t\tif (FS.isMountpoint(current)) {\n\t\t\t\t\t\tif (!islast || (islast && opts.follow_mount)) {\n\t\t\t\t\t\t\tcurrent = current.mounted.root;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!islast || opts.follow) {\n\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\twhile (FS.isLink(current.mode)) {\n\t\t\t\t\t\t\tvar link = FS.readlink(current_path);\n\t\t\t\t\t\t\tcurrent_path = PATH_FS.resolve(PATH.dirname(current_path), link);\n\t\t\t\t\t\t\tvar lookup = FS.lookupPath(current_path, {recurse_count: opts.recurse_count + 1});\n\t\t\t\t\t\t\tcurrent = lookup.node;\n\t\t\t\t\t\t\tif (count++ > 40) {\n\t\t\t\t\t\t\t\tthrow new FS.ErrnoError(32);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {path: current_path, node: current};\n\t\t\t},\n\t\t\tgetPath(node) {\n\t\t\t\tvar path;\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (FS.isRoot(node)) {\n\t\t\t\t\t\tvar mount = node.mount.mountpoint;\n\t\t\t\t\t\tif (!path) return mount;\n\t\t\t\t\t\treturn mount[mount.length - 1] !== '/' ? `${mount}/${path}` : mount + path;\n\t\t\t\t\t}\n\t\t\t\t\tpath = path ? `${node.name}/${path}` : node.name;\n\t\t\t\t\tnode = node.parent;\n\t\t\t\t}\n\t\t\t},\n\t\t\thashName(parentid, name) {\n\t\t\t\tvar hash = 0;\n\t\t\t\tfor (var i = 0; i < name.length; i++) {\n\t\t\t\t\thash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n\t\t\t\t}\n\t\t\t\treturn ((parentid + hash) >>> 0) % FS.nameTable.length;\n\t\t\t},\n\t\t\thashAddNode(node) {\n\t\t\t\tvar hash = FS.hashName(node.parent.id, node.name);\n\t\t\t\tnode.name_next = FS.nameTable[hash];\n\t\t\t\tFS.nameTable[hash] = node;\n\t\t\t},\n\t\t\thashRemoveNode(node) {\n\t\t\t\tvar hash = FS.hashName(node.parent.id, node.name);\n\t\t\t\tif (FS.nameTable[hash] === node) {\n\t\t\t\t\tFS.nameTable[hash] = node.name_next;\n\t\t\t\t} else {\n\t\t\t\t\tvar current = FS.nameTable[hash];\n\t\t\t\t\twhile (current) {\n\t\t\t\t\t\tif (current.name_next === node) {\n\t\t\t\t\t\t\tcurrent.name_next = node.name_next;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent = current.name_next;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tlookupNode(parent, name) {\n\t\t\t\tvar errCode = FS.mayLookup(parent);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode, parent);\n\t\t\t\t}\n\t\t\t\tvar hash = FS.hashName(parent.id, name);\n\t\t\t\tfor (var node = FS.nameTable[hash]; node; node = node.name_next) {\n\t\t\t\t\tvar nodeName = node.name;\n\t\t\t\t\tif (node.parent.id === parent.id && nodeName === name) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn FS.lookup(parent, name);\n\t\t\t},\n\t\t\tcreateNode(parent, name, mode, rdev) {\n\t\t\t\tvar node = new FS.FSNode(parent, name, mode, rdev);\n\t\t\t\tFS.hashAddNode(node);\n\t\t\t\treturn node;\n\t\t\t},\n\t\t\tdestroyNode(node) {\n\t\t\t\tFS.hashRemoveNode(node);\n\t\t\t},\n\t\t\tisRoot(node) {\n\t\t\t\treturn node === node.parent;\n\t\t\t},\n\t\t\tisMountpoint(node) {\n\t\t\t\treturn !!node.mounted;\n\t\t\t},\n\t\t\tisFile(mode) {\n\t\t\t\treturn (mode & 61440) === 32768;\n\t\t\t},\n\t\t\tisDir(mode) {\n\t\t\t\treturn (mode & 61440) === 16384;\n\t\t\t},\n\t\t\tisLink(mode) {\n\t\t\t\treturn (mode & 61440) === 40960;\n\t\t\t},\n\t\t\tisChrdev(mode) {\n\t\t\t\treturn (mode & 61440) === 8192;\n\t\t\t},\n\t\t\tisBlkdev(mode) {\n\t\t\t\treturn (mode & 61440) === 24576;\n\t\t\t},\n\t\t\tisFIFO(mode) {\n\t\t\t\treturn (mode & 61440) === 4096;\n\t\t\t},\n\t\t\tisSocket(mode) {\n\t\t\t\treturn (mode & 49152) === 49152;\n\t\t\t},\n\t\t\tflagsToPermissionString(flag) {\n\t\t\t\tvar perms = ['r', 'w', 'rw'][flag & 3];\n\t\t\t\tif (flag & 512) {\n\t\t\t\t\tperms += 'w';\n\t\t\t\t}\n\t\t\t\treturn perms;\n\t\t\t},\n\t\t\tnodePermissions(node, perms) {\n\t\t\t\tif (FS.ignorePermissions) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\tif (perms.includes('r') && !(node.mode & 292)) {\n\t\t\t\t\treturn 2;\n\t\t\t\t} else if (perms.includes('w') && !(node.mode & 146)) {\n\t\t\t\t\treturn 2;\n\t\t\t\t} else if (perms.includes('x') && !(node.mode & 73)) {\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tmayLookup(dir) {\n\t\t\t\tvar errCode = FS.nodePermissions(dir, 'x');\n\t\t\t\tif (errCode) return errCode;\n\t\t\t\tif (!dir.node_ops.lookup) return 2;\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tmayCreate(dir, name) {\n\t\t\t\ttry {\n\t\t\t\t\tvar node = FS.lookupNode(dir, name);\n\t\t\t\t\treturn 20;\n\t\t\t\t} catch (e) {}\n\t\t\t\treturn FS.nodePermissions(dir, 'wx');\n\t\t\t},\n\t\t\tmayDelete(dir, name, isdir) {\n\t\t\t\tvar node;\n\t\t\t\ttry {\n\t\t\t\t\tnode = FS.lookupNode(dir, name);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn e.errno;\n\t\t\t\t}\n\t\t\t\tvar errCode = FS.nodePermissions(dir, 'wx');\n\t\t\t\tif (errCode) {\n\t\t\t\t\treturn errCode;\n\t\t\t\t}\n\t\t\t\tif (isdir) {\n\t\t\t\t\tif (!FS.isDir(node.mode)) {\n\t\t\t\t\t\treturn 54;\n\t\t\t\t\t}\n\t\t\t\t\tif (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n\t\t\t\t\t\treturn 10;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (FS.isDir(node.mode)) {\n\t\t\t\t\t\treturn 31;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tmayOpen(node, flags) {\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn 44;\n\t\t\t\t}\n\t\t\t\tif (FS.isLink(node.mode)) {\n\t\t\t\t\treturn 32;\n\t\t\t\t} else if (FS.isDir(node.mode)) {\n\t\t\t\t\tif (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) {\n\t\t\t\t\t\treturn 31;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n\t\t\t},\n\t\t\tMAX_OPEN_FDS: 4096,\n\t\t\tnextfd() {\n\t\t\t\tfor (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) {\n\t\t\t\t\tif (!FS.streams[fd]) {\n\t\t\t\t\t\treturn fd;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow new FS.ErrnoError(33);\n\t\t\t},\n\t\t\tgetStreamChecked(fd) {\n\t\t\t\tvar stream = FS.getStream(fd);\n\t\t\t\tif (!stream) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\treturn stream;\n\t\t\t},\n\t\t\tgetStream: (fd) => FS.streams[fd],\n\t\t\tcreateStream(stream, fd = -1) {\n\t\t\t\tif (!FS.FSStream) {\n\t\t\t\t\tFS.FSStream = function () {\n\t\t\t\t\t\tthis.shared = {};\n\t\t\t\t\t};\n\t\t\t\t\tFS.FSStream.prototype = {};\n\t\t\t\t\tObject.defineProperties(FS.FSStream.prototype, {\n\t\t\t\t\t\tobject: {\n\t\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\t\treturn this.node;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tset(val) {\n\t\t\t\t\t\t\t\tthis.node = val;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisRead: {\n\t\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\t\treturn (this.flags & 2097155) !== 1;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisWrite: {\n\t\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\t\treturn (this.flags & 2097155) !== 0;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisAppend: {\n\t\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\t\treturn this.flags & 1024;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tflags: {\n\t\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\t\treturn this.shared.flags;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tset(val) {\n\t\t\t\t\t\t\t\tthis.shared.flags = val;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\t\treturn this.shared.position;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tset(val) {\n\t\t\t\t\t\t\t\tthis.shared.position = val;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tstream = Object.assign(new FS.FSStream(), stream);\n\t\t\t\tif (fd == -1) {\n\t\t\t\t\tfd = FS.nextfd();\n\t\t\t\t}\n\t\t\t\tstream.fd = fd;\n\t\t\t\tFS.streams[fd] = stream;\n\t\t\t\treturn stream;\n\t\t\t},\n\t\t\tcloseStream(fd) {\n\t\t\t\tFS.streams[fd] = null;\n\t\t\t},\n\t\t\tchrdev_stream_ops: {\n\t\t\t\topen(stream) {\n\t\t\t\t\tvar device = FS.getDevice(stream.node.rdev);\n\t\t\t\t\tstream.stream_ops = device.stream_ops;\n\t\t\t\t\tif (stream.stream_ops.open) {\n\t\t\t\t\t\tstream.stream_ops.open(stream);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tllseek() {\n\t\t\t\t\tthrow new FS.ErrnoError(70);\n\t\t\t\t},\n\t\t\t},\n\t\t\tmajor: (dev) => dev >> 8,\n\t\t\tminor: (dev) => dev & 255,\n\t\t\tmakedev: (ma, mi) => (ma << 8) | mi,\n\t\t\tregisterDevice(dev, ops) {\n\t\t\t\tFS.devices[dev] = {stream_ops: ops};\n\t\t\t},\n\t\t\tgetDevice: (dev) => FS.devices[dev],\n\t\t\tgetMounts(mount) {\n\t\t\t\tvar mounts = [];\n\t\t\t\tvar check = [mount];\n\t\t\t\twhile (check.length) {\n\t\t\t\t\tvar m = check.pop();\n\t\t\t\t\tmounts.push(m);\n\t\t\t\t\tcheck.push.apply(check, m.mounts);\n\t\t\t\t}\n\t\t\t\treturn mounts;\n\t\t\t},\n\t\t\tsyncfs(populate, callback) {\n\t\t\t\tif (typeof populate == 'function') {\n\t\t\t\t\tcallback = populate;\n\t\t\t\t\tpopulate = false;\n\t\t\t\t}\n\t\t\t\tFS.syncFSRequests++;\n\t\t\t\tif (FS.syncFSRequests > 1) {\n\t\t\t\t\terr(\n\t\t\t\t\t\t`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tvar mounts = FS.getMounts(FS.root.mount);\n\t\t\t\tvar completed = 0;\n\t\t\t\tfunction doCallback(errCode) {\n\t\t\t\t\tFS.syncFSRequests--;\n\t\t\t\t\treturn callback(errCode);\n\t\t\t\t}\n\t\t\t\tfunction done(errCode) {\n\t\t\t\t\tif (errCode) {\n\t\t\t\t\t\tif (!done.errored) {\n\t\t\t\t\t\t\tdone.errored = true;\n\t\t\t\t\t\t\treturn doCallback(errCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (++completed >= mounts.length) {\n\t\t\t\t\t\tdoCallback(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmounts.forEach((mount) => {\n\t\t\t\t\tif (!mount.type.syncfs) {\n\t\t\t\t\t\treturn done(null);\n\t\t\t\t\t}\n\t\t\t\t\tmount.type.syncfs(mount, populate, done);\n\t\t\t\t});\n\t\t\t},\n\t\t\tmount(type, opts, mountpoint) {\n\t\t\t\tvar root = mountpoint === '/';\n\t\t\t\tvar pseudo = !mountpoint;\n\t\t\t\tvar node;\n\t\t\t\tif (root && FS.root) {\n\t\t\t\t\tthrow new FS.ErrnoError(10);\n\t\t\t\t} else if (!root && !pseudo) {\n\t\t\t\t\tvar lookup = FS.lookupPath(mountpoint, {follow_mount: false});\n\t\t\t\t\tmountpoint = lookup.path;\n\t\t\t\t\tnode = lookup.node;\n\t\t\t\t\tif (FS.isMountpoint(node)) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(10);\n\t\t\t\t\t}\n\t\t\t\t\tif (!FS.isDir(node.mode)) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(54);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar mount = {type: type, opts: opts, mountpoint: mountpoint, mounts: []};\n\t\t\t\tvar mountRoot = type.mount(mount);\n\t\t\t\tmountRoot.mount = mount;\n\t\t\t\tmount.root = mountRoot;\n\t\t\t\tif (root) {\n\t\t\t\t\tFS.root = mountRoot;\n\t\t\t\t} else if (node) {\n\t\t\t\t\tnode.mounted = mount;\n\t\t\t\t\tif (node.mount) {\n\t\t\t\t\t\tnode.mount.mounts.push(mount);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn mountRoot;\n\t\t\t},\n\t\t\tunmount(mountpoint) {\n\t\t\t\tvar lookup = FS.lookupPath(mountpoint, {follow_mount: false});\n\t\t\t\tif (!FS.isMountpoint(lookup.node)) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tvar node = lookup.node;\n\t\t\t\tvar mount = node.mounted;\n\t\t\t\tvar mounts = FS.getMounts(mount);\n\t\t\t\tObject.keys(FS.nameTable).forEach((hash) => {\n\t\t\t\t\tvar current = FS.nameTable[hash];\n\t\t\t\t\twhile (current) {\n\t\t\t\t\t\tvar next = current.name_next;\n\t\t\t\t\t\tif (mounts.includes(current.mount)) {\n\t\t\t\t\t\t\tFS.destroyNode(current);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent = next;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tnode.mounted = null;\n\t\t\t\tvar idx = node.mount.mounts.indexOf(mount);\n\t\t\t\tnode.mount.mounts.splice(idx, 1);\n\t\t\t},\n\t\t\tlookup(parent, name) {\n\t\t\t\treturn parent.node_ops.lookup(parent, name);\n\t\t\t},\n\t\t\tmknod(path, mode, dev) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {parent: true});\n\t\t\t\tvar parent = lookup.node;\n\t\t\t\tvar name = PATH.basename(path);\n\t\t\t\tif (!name || name === '.' || name === '..') {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tvar errCode = FS.mayCreate(parent, name);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tif (!parent.node_ops.mknod) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\treturn parent.node_ops.mknod(parent, name, mode, dev);\n\t\t\t},\n\t\t\tcreate(path, mode) {\n\t\t\t\tmode = mode !== undefined ? mode : 438;\n\t\t\t\tmode &= 4095;\n\t\t\t\tmode |= 32768;\n\t\t\t\treturn FS.mknod(path, mode, 0);\n\t\t\t},\n\t\t\tmkdir(path, mode) {\n\t\t\t\tmode = mode !== undefined ? mode : 511;\n\t\t\t\tmode &= 511 | 512;\n\t\t\t\tmode |= 16384;\n\t\t\t\treturn FS.mknod(path, mode, 0);\n\t\t\t},\n\t\t\tmkdirTree(path, mode) {\n\t\t\t\tvar dirs = path.split('/');\n\t\t\t\tvar d = '';\n\t\t\t\tfor (var i = 0; i < dirs.length; ++i) {\n\t\t\t\t\tif (!dirs[i]) continue;\n\t\t\t\t\td += '/' + dirs[i];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tFS.mkdir(d, mode);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (e.errno != 20) throw e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tmkdev(path, mode, dev) {\n\t\t\t\tif (typeof dev == 'undefined') {\n\t\t\t\t\tdev = mode;\n\t\t\t\t\tmode = 438;\n\t\t\t\t}\n\t\t\t\tmode |= 8192;\n\t\t\t\treturn FS.mknod(path, mode, dev);\n\t\t\t},\n\t\t\tsymlink(oldpath, newpath) {\n\t\t\t\tif (!PATH_FS.resolve(oldpath)) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tvar lookup = FS.lookupPath(newpath, {parent: true});\n\t\t\t\tvar parent = lookup.node;\n\t\t\t\tif (!parent) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tvar newname = PATH.basename(newpath);\n\t\t\t\tvar errCode = FS.mayCreate(parent, newname);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tif (!parent.node_ops.symlink) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\treturn parent.node_ops.symlink(parent, newname, oldpath);\n\t\t\t},\n\t\t\trename(old_path, new_path) {\n\t\t\t\tvar old_dirname = PATH.dirname(old_path);\n\t\t\t\tvar new_dirname = PATH.dirname(new_path);\n\t\t\t\tvar old_name = PATH.basename(old_path);\n\t\t\t\tvar new_name = PATH.basename(new_path);\n\t\t\t\tvar lookup, old_dir, new_dir;\n\t\t\t\tlookup = FS.lookupPath(old_path, {parent: true});\n\t\t\t\told_dir = lookup.node;\n\t\t\t\tlookup = FS.lookupPath(new_path, {parent: true});\n\t\t\t\tnew_dir = lookup.node;\n\t\t\t\tif (!old_dir || !new_dir) throw new FS.ErrnoError(44);\n\t\t\t\tif (old_dir.mount !== new_dir.mount) {\n\t\t\t\t\tthrow new FS.ErrnoError(75);\n\t\t\t\t}\n\t\t\t\tvar old_node = FS.lookupNode(old_dir, old_name);\n\t\t\t\tvar relative = PATH_FS.relative(old_path, new_dirname);\n\t\t\t\tif (relative.charAt(0) !== '.') {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\trelative = PATH_FS.relative(new_path, old_dirname);\n\t\t\t\tif (relative.charAt(0) !== '.') {\n\t\t\t\t\tthrow new FS.ErrnoError(55);\n\t\t\t\t}\n\t\t\t\tvar new_node;\n\t\t\t\ttry {\n\t\t\t\t\tnew_node = FS.lookupNode(new_dir, new_name);\n\t\t\t\t} catch (e) {}\n\t\t\t\tif (old_node === new_node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar isdir = FS.isDir(old_node.mode);\n\t\t\t\tvar errCode = FS.mayDelete(old_dir, old_name, isdir);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\terrCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tif (!old_dir.node_ops.rename) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tif (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n\t\t\t\t\tthrow new FS.ErrnoError(10);\n\t\t\t\t}\n\t\t\t\tif (new_dir !== old_dir) {\n\t\t\t\t\terrCode = FS.nodePermissions(old_dir, 'w');\n\t\t\t\t\tif (errCode) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFS.hashRemoveNode(old_node);\n\t\t\t\ttry {\n\t\t\t\t\told_dir.node_ops.rename(old_node, new_dir, new_name);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow e;\n\t\t\t\t} finally {\n\t\t\t\t\tFS.hashAddNode(old_node);\n\t\t\t\t}\n\t\t\t},\n\t\t\trmdir(path) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {parent: true});\n\t\t\t\tvar parent = lookup.node;\n\t\t\t\tvar name = PATH.basename(path);\n\t\t\t\tvar node = FS.lookupNode(parent, name);\n\t\t\t\tvar errCode = FS.mayDelete(parent, name, true);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tif (!parent.node_ops.rmdir) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tif (FS.isMountpoint(node)) {\n\t\t\t\t\tthrow new FS.ErrnoError(10);\n\t\t\t\t}\n\t\t\t\tparent.node_ops.rmdir(parent, name);\n\t\t\t\tFS.destroyNode(node);\n\t\t\t},\n\t\t\treaddir(path) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {follow: true});\n\t\t\t\tvar node = lookup.node;\n\t\t\t\tif (!node.node_ops.readdir) {\n\t\t\t\t\tthrow new FS.ErrnoError(54);\n\t\t\t\t}\n\t\t\t\treturn node.node_ops.readdir(node);\n\t\t\t},\n\t\t\tunlink(path) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {parent: true});\n\t\t\t\tvar parent = lookup.node;\n\t\t\t\tif (!parent) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tvar name = PATH.basename(path);\n\t\t\t\tvar node = FS.lookupNode(parent, name);\n\t\t\t\tvar errCode = FS.mayDelete(parent, name, false);\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tif (!parent.node_ops.unlink) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tif (FS.isMountpoint(node)) {\n\t\t\t\t\tthrow new FS.ErrnoError(10);\n\t\t\t\t}\n\t\t\t\tparent.node_ops.unlink(parent, name);\n\t\t\t\tFS.destroyNode(node);\n\t\t\t},\n\t\t\treadlink(path) {\n\t\t\t\tvar lookup = FS.lookupPath(path);\n\t\t\t\tvar link = lookup.node;\n\t\t\t\tif (!link) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tif (!link.node_ops.readlink) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\treturn PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link));\n\t\t\t},\n\t\t\tstat(path, dontFollow) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {follow: !dontFollow});\n\t\t\t\tvar node = lookup.node;\n\t\t\t\tif (!node) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tif (!node.node_ops.getattr) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\treturn node.node_ops.getattr(node);\n\t\t\t},\n\t\t\tlstat(path) {\n\t\t\t\treturn FS.stat(path, true);\n\t\t\t},\n\t\t\tchmod(path, mode, dontFollow) {\n\t\t\t\tvar node;\n\t\t\t\tif (typeof path == 'string') {\n\t\t\t\t\tvar lookup = FS.lookupPath(path, {follow: !dontFollow});\n\t\t\t\t\tnode = lookup.node;\n\t\t\t\t} else {\n\t\t\t\t\tnode = path;\n\t\t\t\t}\n\t\t\t\tif (!node.node_ops.setattr) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tnode.node_ops.setattr(node, {mode: (mode & 4095) | (node.mode & ~4095), timestamp: Date.now()});\n\t\t\t},\n\t\t\tlchmod(path, mode) {\n\t\t\t\tFS.chmod(path, mode, true);\n\t\t\t},\n\t\t\tfchmod(fd, mode) {\n\t\t\t\tvar stream = FS.getStreamChecked(fd);\n\t\t\t\tFS.chmod(stream.node, mode);\n\t\t\t},\n\t\t\tchown(path, uid, gid, dontFollow) {\n\t\t\t\tvar node;\n\t\t\t\tif (typeof path == 'string') {\n\t\t\t\t\tvar lookup = FS.lookupPath(path, {follow: !dontFollow});\n\t\t\t\t\tnode = lookup.node;\n\t\t\t\t} else {\n\t\t\t\t\tnode = path;\n\t\t\t\t}\n\t\t\t\tif (!node.node_ops.setattr) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tnode.node_ops.setattr(node, {timestamp: Date.now()});\n\t\t\t},\n\t\t\tlchown(path, uid, gid) {\n\t\t\t\tFS.chown(path, uid, gid, true);\n\t\t\t},\n\t\t\tfchown(fd, uid, gid) {\n\t\t\t\tvar stream = FS.getStreamChecked(fd);\n\t\t\t\tFS.chown(stream.node, uid, gid);\n\t\t\t},\n\t\t\ttruncate(path, len) {\n\t\t\t\tif (len < 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tvar node;\n\t\t\t\tif (typeof path == 'string') {\n\t\t\t\t\tvar lookup = FS.lookupPath(path, {follow: true});\n\t\t\t\t\tnode = lookup.node;\n\t\t\t\t} else {\n\t\t\t\t\tnode = path;\n\t\t\t\t}\n\t\t\t\tif (!node.node_ops.setattr) {\n\t\t\t\t\tthrow new FS.ErrnoError(63);\n\t\t\t\t}\n\t\t\t\tif (FS.isDir(node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(31);\n\t\t\t\t}\n\t\t\t\tif (!FS.isFile(node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tvar errCode = FS.nodePermissions(node, 'w');\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tnode.node_ops.setattr(node, {size: len, timestamp: Date.now()});\n\t\t\t},\n\t\t\tftruncate(fd, len) {\n\t\t\t\tvar stream = FS.getStreamChecked(fd);\n\t\t\t\tif ((stream.flags & 2097155) === 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tFS.truncate(stream.node, len);\n\t\t\t},\n\t\t\tutime(path, atime, mtime) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {follow: true});\n\t\t\t\tvar node = lookup.node;\n\t\t\t\tnode.node_ops.setattr(node, {timestamp: Math.max(atime, mtime)});\n\t\t\t},\n\t\t\topen(path, flags, mode) {\n\t\t\t\tif (path === '') {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tflags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags;\n\t\t\t\tmode = typeof mode == 'undefined' ? 438 : mode;\n\t\t\t\tif (flags & 64) {\n\t\t\t\t\tmode = (mode & 4095) | 32768;\n\t\t\t\t} else {\n\t\t\t\t\tmode = 0;\n\t\t\t\t}\n\t\t\t\tvar node;\n\t\t\t\tif (typeof path == 'object') {\n\t\t\t\t\tnode = path;\n\t\t\t\t} else {\n\t\t\t\t\tpath = PATH.normalize(path);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar lookup = FS.lookupPath(path, {follow: !(flags & 131072)});\n\t\t\t\t\t\tnode = lookup.node;\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t}\n\t\t\t\tvar created = false;\n\t\t\t\tif (flags & 64) {\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tif (flags & 128) {\n\t\t\t\t\t\t\tthrow new FS.ErrnoError(20);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode = FS.mknod(path, mode, 0);\n\t\t\t\t\t\tcreated = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!node) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tif (FS.isChrdev(node.mode)) {\n\t\t\t\t\tflags &= ~512;\n\t\t\t\t}\n\t\t\t\tif (flags & 65536 && !FS.isDir(node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(54);\n\t\t\t\t}\n\t\t\t\tif (!created) {\n\t\t\t\t\tvar errCode = FS.mayOpen(node, flags);\n\t\t\t\t\tif (errCode) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (flags & 512 && !created) {\n\t\t\t\t\tFS.truncate(node, 0);\n\t\t\t\t}\n\t\t\t\tflags &= ~(128 | 512 | 131072);\n\t\t\t\tvar stream = FS.createStream({\n\t\t\t\t\tnode: node,\n\t\t\t\t\tpath: FS.getPath(node),\n\t\t\t\t\tflags: flags,\n\t\t\t\t\tseekable: true,\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tstream_ops: node.stream_ops,\n\t\t\t\t\tungotten: [],\n\t\t\t\t\terror: false,\n\t\t\t\t});\n\t\t\t\tif (stream.stream_ops.open) {\n\t\t\t\t\tstream.stream_ops.open(stream);\n\t\t\t\t}\n\t\t\t\tif (Module['logReadFiles'] && !(flags & 1)) {\n\t\t\t\t\tif (!FS.readFiles) FS.readFiles = {};\n\t\t\t\t\tif (!(path in FS.readFiles)) {\n\t\t\t\t\t\tFS.readFiles[path] = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn stream;\n\t\t\t},\n\t\t\tclose(stream) {\n\t\t\t\tif (FS.isClosed(stream)) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif (stream.getdents) stream.getdents = null;\n\t\t\t\ttry {\n\t\t\t\t\tif (stream.stream_ops.close) {\n\t\t\t\t\t\tstream.stream_ops.close(stream);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow e;\n\t\t\t\t} finally {\n\t\t\t\t\tFS.closeStream(stream.fd);\n\t\t\t\t}\n\t\t\t\tstream.fd = null;\n\t\t\t},\n\t\t\tisClosed(stream) {\n\t\t\t\treturn stream.fd === null;\n\t\t\t},\n\t\t\tllseek(stream, offset, whence) {\n\t\t\t\tif (FS.isClosed(stream)) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif (!stream.seekable || !stream.stream_ops.llseek) {\n\t\t\t\t\tthrow new FS.ErrnoError(70);\n\t\t\t\t}\n\t\t\t\tif (whence != 0 && whence != 1 && whence != 2) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tstream.position = stream.stream_ops.llseek(stream, offset, whence);\n\t\t\t\tstream.ungotten = [];\n\t\t\t\treturn stream.position;\n\t\t\t},\n\t\t\tread(stream, buffer, offset, length, position) {\n\t\t\t\tif (length < 0 || position < 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tif (FS.isClosed(stream)) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif ((stream.flags & 2097155) === 1) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif (FS.isDir(stream.node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(31);\n\t\t\t\t}\n\t\t\t\tif (!stream.stream_ops.read) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tvar seeking = typeof position != 'undefined';\n\t\t\t\tif (!seeking) {\n\t\t\t\t\tposition = stream.position;\n\t\t\t\t} else if (!stream.seekable) {\n\t\t\t\t\tthrow new FS.ErrnoError(70);\n\t\t\t\t}\n\t\t\t\tvar bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n\t\t\t\tif (!seeking) stream.position += bytesRead;\n\t\t\t\treturn bytesRead;\n\t\t\t},\n\t\t\twrite(stream, buffer, offset, length, position, canOwn) {\n\t\t\t\tif (length < 0 || position < 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tif (FS.isClosed(stream)) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif ((stream.flags & 2097155) === 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif (FS.isDir(stream.node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(31);\n\t\t\t\t}\n\t\t\t\tif (!stream.stream_ops.write) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tif (stream.seekable && stream.flags & 1024) {\n\t\t\t\t\tFS.llseek(stream, 0, 2);\n\t\t\t\t}\n\t\t\t\tvar seeking = typeof position != 'undefined';\n\t\t\t\tif (!seeking) {\n\t\t\t\t\tposition = stream.position;\n\t\t\t\t} else if (!stream.seekable) {\n\t\t\t\t\tthrow new FS.ErrnoError(70);\n\t\t\t\t}\n\t\t\t\tvar bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n\t\t\t\tif (!seeking) stream.position += bytesWritten;\n\t\t\t\treturn bytesWritten;\n\t\t\t},\n\t\t\tallocate(stream, offset, length) {\n\t\t\t\tif (FS.isClosed(stream)) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif (offset < 0 || length <= 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(28);\n\t\t\t\t}\n\t\t\t\tif ((stream.flags & 2097155) === 0) {\n\t\t\t\t\tthrow new FS.ErrnoError(8);\n\t\t\t\t}\n\t\t\t\tif (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(43);\n\t\t\t\t}\n\t\t\t\tif (!stream.stream_ops.allocate) {\n\t\t\t\t\tthrow new FS.ErrnoError(138);\n\t\t\t\t}\n\t\t\t\tstream.stream_ops.allocate(stream, offset, length);\n\t\t\t},\n\t\t\tmmap(stream, length, position, prot, flags) {\n\t\t\t\tif ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) {\n\t\t\t\t\tthrow new FS.ErrnoError(2);\n\t\t\t\t}\n\t\t\t\tif ((stream.flags & 2097155) === 1) {\n\t\t\t\t\tthrow new FS.ErrnoError(2);\n\t\t\t\t}\n\t\t\t\tif (!stream.stream_ops.mmap) {\n\t\t\t\t\tthrow new FS.ErrnoError(43);\n\t\t\t\t}\n\t\t\t\treturn stream.stream_ops.mmap(stream, length, position, prot, flags);\n\t\t\t},\n\t\t\tmsync(stream, buffer, offset, length, mmapFlags) {\n\t\t\t\tif (!stream.stream_ops.msync) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags);\n\t\t\t},\n\t\t\tmunmap: (stream) => 0,\n\t\t\tioctl(stream, cmd, arg) {\n\t\t\t\tif (!stream.stream_ops.ioctl) {\n\t\t\t\t\tthrow new FS.ErrnoError(59);\n\t\t\t\t}\n\t\t\t\treturn stream.stream_ops.ioctl(stream, cmd, arg);\n\t\t\t},\n\t\t\treadFile(path, opts = {}) {\n\t\t\t\topts.flags = opts.flags || 0;\n\t\t\t\topts.encoding = opts.encoding || 'binary';\n\t\t\t\tif (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n\t\t\t\t\tthrow new Error(`Invalid encoding type \"${opts.encoding}\"`);\n\t\t\t\t}\n\t\t\t\tvar ret;\n\t\t\t\tvar stream = FS.open(path, opts.flags);\n\t\t\t\tvar stat = FS.stat(path);\n\t\t\t\tvar length = stat.size;\n\t\t\t\tvar buf = new Uint8Array(length);\n\t\t\t\tFS.read(stream, buf, 0, length, 0);\n\t\t\t\tif (opts.encoding === 'utf8') {\n\t\t\t\t\tret = UTF8ArrayToString(buf, 0);\n\t\t\t\t} else if (opts.encoding === 'binary') {\n\t\t\t\t\tret = buf;\n\t\t\t\t}\n\t\t\t\tFS.close(stream);\n\t\t\t\treturn ret;\n\t\t\t},\n\t\t\twriteFile(path, data, opts = {}) {\n\t\t\t\topts.flags = opts.flags || 577;\n\t\t\t\tvar stream = FS.open(path, opts.flags, opts.mode);\n\t\t\t\tif (typeof data == 'string') {\n\t\t\t\t\tvar buf = new Uint8Array(lengthBytesUTF8(data) + 1);\n\t\t\t\t\tvar actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);\n\t\t\t\t\tFS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);\n\t\t\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\t\t\tFS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Unsupported data type');\n\t\t\t\t}\n\t\t\t\tFS.close(stream);\n\t\t\t},\n\t\t\tcwd: () => FS.currentPath,\n\t\t\tchdir(path) {\n\t\t\t\tvar lookup = FS.lookupPath(path, {follow: true});\n\t\t\t\tif (lookup.node === null) {\n\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t}\n\t\t\t\tif (!FS.isDir(lookup.node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(54);\n\t\t\t\t}\n\t\t\t\tvar errCode = FS.nodePermissions(lookup.node, 'x');\n\t\t\t\tif (errCode) {\n\t\t\t\t\tthrow new FS.ErrnoError(errCode);\n\t\t\t\t}\n\t\t\t\tFS.currentPath = lookup.path;\n\t\t\t},\n\t\t\tcreateDefaultDirectories() {\n\t\t\t\tFS.mkdir('/tmp');\n\t\t\t\tFS.mkdir('/home');\n\t\t\t\tFS.mkdir('/home/web_user');\n\t\t\t},\n\t\t\tcreateDefaultDevices() {\n\t\t\t\tFS.mkdir('/dev');\n\t\t\t\tFS.registerDevice(FS.makedev(1, 3), {\n\t\t\t\t\tread: () => 0,\n\t\t\t\t\twrite: (stream, buffer, offset, length, pos) => length,\n\t\t\t\t});\n\t\t\t\tFS.mkdev('/dev/null', FS.makedev(1, 3));\n\t\t\t\tTTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n\t\t\t\tTTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n\t\t\t\tFS.mkdev('/dev/tty', FS.makedev(5, 0));\n\t\t\t\tFS.mkdev('/dev/tty1', FS.makedev(6, 0));\n\t\t\t\tvar randomBuffer = new Uint8Array(1024),\n\t\t\t\t\trandomLeft = 0;\n\t\t\t\tvar randomByte = () => {\n\t\t\t\t\tif (randomLeft === 0) {\n\t\t\t\t\t\trandomLeft = randomFill(randomBuffer).byteLength;\n\t\t\t\t\t}\n\t\t\t\t\treturn randomBuffer[--randomLeft];\n\t\t\t\t};\n\t\t\t\tFS.createDevice('/dev', 'random', randomByte);\n\t\t\t\tFS.createDevice('/dev', 'urandom', randomByte);\n\t\t\t\tFS.mkdir('/dev/shm');\n\t\t\t\tFS.mkdir('/dev/shm/tmp');\n\t\t\t},\n\t\t\tcreateSpecialDirectories() {\n\t\t\t\tFS.mkdir('/proc');\n\t\t\t\tvar proc_self = FS.mkdir('/proc/self');\n\t\t\t\tFS.mkdir('/proc/self/fd');\n\t\t\t\tFS.mount(\n\t\t\t\t\t{\n\t\t\t\t\t\tmount() {\n\t\t\t\t\t\t\tvar node = FS.createNode(proc_self, 'fd', 16384 | 511, 73);\n\t\t\t\t\t\t\tnode.node_ops = {\n\t\t\t\t\t\t\t\tlookup(parent, name) {\n\t\t\t\t\t\t\t\t\tvar fd = +name;\n\t\t\t\t\t\t\t\t\tvar stream = FS.getStreamChecked(fd);\n\t\t\t\t\t\t\t\t\tvar ret = {\n\t\t\t\t\t\t\t\t\t\tparent: null,\n\t\t\t\t\t\t\t\t\t\tmount: {mountpoint: 'fake'},\n\t\t\t\t\t\t\t\t\t\tnode_ops: {readlink: () => stream.path},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tret.parent = ret;\n\t\t\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn node;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{},\n\t\t\t\t\t'/proc/self/fd'\n\t\t\t\t);\n\t\t\t},\n\t\t\tcreateStandardStreams() {\n\t\t\t\tif (Module['stdin']) {\n\t\t\t\t\tFS.createDevice('/dev', 'stdin', Module['stdin']);\n\t\t\t\t} else {\n\t\t\t\t\tFS.symlink('/dev/tty', '/dev/stdin');\n\t\t\t\t}\n\t\t\t\tif (Module['stdout']) {\n\t\t\t\t\tFS.createDevice('/dev', 'stdout', null, Module['stdout']);\n\t\t\t\t} else {\n\t\t\t\t\tFS.symlink('/dev/tty', '/dev/stdout');\n\t\t\t\t}\n\t\t\t\tif (Module['stderr']) {\n\t\t\t\t\tFS.createDevice('/dev', 'stderr', null, Module['stderr']);\n\t\t\t\t} else {\n\t\t\t\t\tFS.symlink('/dev/tty1', '/dev/stderr');\n\t\t\t\t}\n\t\t\t\tvar stdin = FS.open('/dev/stdin', 0);\n\t\t\t\tvar stdout = FS.open('/dev/stdout', 1);\n\t\t\t\tvar stderr = FS.open('/dev/stderr', 1);\n\t\t\t},\n\t\t\tensureErrnoError() {\n\t\t\t\tif (FS.ErrnoError) return;\n\t\t\t\tFS.ErrnoError = function ErrnoError(errno, node) {\n\t\t\t\t\tthis.name = 'ErrnoError';\n\t\t\t\t\tthis.node = node;\n\t\t\t\t\tthis.setErrno = function (errno) {\n\t\t\t\t\t\tthis.errno = errno;\n\t\t\t\t\t};\n\t\t\t\t\tthis.setErrno(errno);\n\t\t\t\t\tthis.message = 'FS error';\n\t\t\t\t};\n\t\t\t\tFS.ErrnoError.prototype = new Error();\n\t\t\t\tFS.ErrnoError.prototype.constructor = FS.ErrnoError;\n\t\t\t\t[44].forEach((code) => {\n\t\t\t\t\tFS.genericErrors[code] = new FS.ErrnoError(code);\n\t\t\t\t\tFS.genericErrors[code].stack = '<generic error, no stack>';\n\t\t\t\t});\n\t\t\t},\n\t\t\tstaticInit() {\n\t\t\t\tFS.ensureErrnoError();\n\t\t\t\tFS.nameTable = new Array(4096);\n\t\t\t\tFS.mount(MEMFS, {}, '/');\n\t\t\t\tFS.createDefaultDirectories();\n\t\t\t\tFS.createDefaultDevices();\n\t\t\t\tFS.createSpecialDirectories();\n\t\t\t\tFS.filesystems = {MEMFS: MEMFS};\n\t\t\t},\n\t\t\tinit(input, output, error) {\n\t\t\t\tFS.init.initialized = true;\n\t\t\t\tFS.ensureErrnoError();\n\t\t\t\tModule['stdin'] = input || Module['stdin'];\n\t\t\t\tModule['stdout'] = output || Module['stdout'];\n\t\t\t\tModule['stderr'] = error || Module['stderr'];\n\t\t\t\tFS.createStandardStreams();\n\t\t\t},\n\t\t\tquit() {\n\t\t\t\tFS.init.initialized = false;\n\t\t\t\tfor (var i = 0; i < FS.streams.length; i++) {\n\t\t\t\t\tvar stream = FS.streams[i];\n\t\t\t\t\tif (!stream) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tFS.close(stream);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfindObject(path, dontResolveLastLink) {\n\t\t\t\tvar ret = FS.analyzePath(path, dontResolveLastLink);\n\t\t\t\tif (!ret.exists) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\treturn ret.object;\n\t\t\t},\n\t\t\tanalyzePath(path, dontResolveLastLink) {\n\t\t\t\ttry {\n\t\t\t\t\tvar lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});\n\t\t\t\t\tpath = lookup.path;\n\t\t\t\t} catch (e) {}\n\t\t\t\tvar ret = {\n\t\t\t\t\tisRoot: false,\n\t\t\t\t\texists: false,\n\t\t\t\t\terror: 0,\n\t\t\t\t\tname: null,\n\t\t\t\t\tpath: null,\n\t\t\t\t\tobject: null,\n\t\t\t\t\tparentExists: false,\n\t\t\t\t\tparentPath: null,\n\t\t\t\t\tparentObject: null,\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tvar lookup = FS.lookupPath(path, {parent: true});\n\t\t\t\t\tret.parentExists = true;\n\t\t\t\t\tret.parentPath = lookup.path;\n\t\t\t\t\tret.parentObject = lookup.node;\n\t\t\t\t\tret.name = PATH.basename(path);\n\t\t\t\t\tlookup = FS.lookupPath(path, {follow: !dontResolveLastLink});\n\t\t\t\t\tret.exists = true;\n\t\t\t\t\tret.path = lookup.path;\n\t\t\t\t\tret.object = lookup.node;\n\t\t\t\t\tret.name = lookup.node.name;\n\t\t\t\t\tret.isRoot = lookup.path === '/';\n\t\t\t\t} catch (e) {\n\t\t\t\t\tret.error = e.errno;\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t},\n\t\t\tcreatePath(parent, path, canRead, canWrite) {\n\t\t\t\tparent = typeof parent == 'string' ? parent : FS.getPath(parent);\n\t\t\t\tvar parts = path.split('/').reverse();\n\t\t\t\twhile (parts.length) {\n\t\t\t\t\tvar part = parts.pop();\n\t\t\t\t\tif (!part) continue;\n\t\t\t\t\tvar current = PATH.join2(parent, part);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tFS.mkdir(current);\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tparent = current;\n\t\t\t\t}\n\t\t\t\treturn current;\n\t\t\t},\n\t\t\tcreateFile(parent, name, properties, canRead, canWrite) {\n\t\t\t\tvar path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name);\n\t\t\t\tvar mode = FS_getMode(canRead, canWrite);\n\t\t\t\treturn FS.create(path, mode);\n\t\t\t},\n\t\t\tcreateDataFile(parent, name, data, canRead, canWrite, canOwn) {\n\t\t\t\tvar path = name;\n\t\t\t\tif (parent) {\n\t\t\t\t\tparent = typeof parent == 'string' ? parent : FS.getPath(parent);\n\t\t\t\t\tpath = name ? PATH.join2(parent, name) : parent;\n\t\t\t\t}\n\t\t\t\tvar mode = FS_getMode(canRead, canWrite);\n\t\t\t\tvar node = FS.create(path, mode);\n\t\t\t\tif (data) {\n\t\t\t\t\tif (typeof data == 'string') {\n\t\t\t\t\t\tvar arr = new Array(data.length);\n\t\t\t\t\t\tfor (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n\t\t\t\t\t\tdata = arr;\n\t\t\t\t\t}\n\t\t\t\t\tFS.chmod(node, mode | 146);\n\t\t\t\t\tvar stream = FS.open(node, 577);\n\t\t\t\t\tFS.write(stream, data, 0, data.length, 0, canOwn);\n\t\t\t\t\tFS.close(stream);\n\t\t\t\t\tFS.chmod(node, mode);\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t},\n\t\t\tcreateDevice(parent, name, input, output) {\n\t\t\t\tvar path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name);\n\t\t\t\tvar mode = FS_getMode(!!input, !!output);\n\t\t\t\tif (!FS.createDevice.major) FS.createDevice.major = 64;\n\t\t\t\tvar dev = FS.makedev(FS.createDevice.major++, 0);\n\t\t\t\tFS.registerDevice(dev, {\n\t\t\t\t\topen(stream) {\n\t\t\t\t\t\tstream.seekable = false;\n\t\t\t\t\t},\n\t\t\t\t\tclose(stream) {\n\t\t\t\t\t\tif (output && output.buffer && output.buffer.length) {\n\t\t\t\t\t\t\toutput(10);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tread(stream, buffer, offset, length, pos) {\n\t\t\t\t\t\tvar bytesRead = 0;\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\tvar result;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tresult = input();\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tthrow new FS.ErrnoError(29);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (result === undefined && bytesRead === 0) {\n\t\t\t\t\t\t\t\tthrow new FS.ErrnoError(6);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (result === null || result === undefined) break;\n\t\t\t\t\t\t\tbytesRead++;\n\t\t\t\t\t\t\tbuffer[offset + i] = result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (bytesRead) {\n\t\t\t\t\t\t\tstream.node.timestamp = Date.now();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn bytesRead;\n\t\t\t\t\t},\n\t\t\t\t\twrite(stream, buffer, offset, length, pos) {\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\toutput(buffer[offset + i]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tthrow new FS.ErrnoError(29);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (length) {\n\t\t\t\t\t\t\tstream.node.timestamp = Date.now();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn FS.mkdev(path, mode, dev);\n\t\t\t},\n\t\t\tforceLoadFile(obj) {\n\t\t\t\tif (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n\t\t\t\tif (typeof XMLHttpRequest != 'undefined') {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.'\n\t\t\t\t\t);\n\t\t\t\t} else if (read_) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tobj.contents = intArrayFromString(read_(obj.url), true);\n\t\t\t\t\t\tobj.usedBytes = obj.contents.length;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(29);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Cannot load without read() or XMLHttpRequest.');\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreateLazyFile(parent, name, url, canRead, canWrite) {\n\t\t\t\tfunction LazyUint8Array() {\n\t\t\t\t\tthis.lengthKnown = false;\n\t\t\t\t\tthis.chunks = [];\n\t\t\t\t}\n\t\t\t\tLazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n\t\t\t\t\tif (idx > this.length - 1 || idx < 0) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tvar chunkOffset = idx % this.chunkSize;\n\t\t\t\t\tvar chunkNum = (idx / this.chunkSize) | 0;\n\t\t\t\t\treturn this.getter(chunkNum)[chunkOffset];\n\t\t\t\t};\n\t\t\t\tLazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n\t\t\t\t\tthis.getter = getter;\n\t\t\t\t};\n\t\t\t\tLazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n\t\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\t\txhr.open('HEAD', url, false);\n\t\t\t\t\txhr.send(null);\n\t\t\t\t\tif (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))\n\t\t\t\t\t\tthrow new Error(\"Couldn't load \" + url + '. Status: ' + xhr.status);\n\t\t\t\t\tvar datalength = Number(xhr.getResponseHeader('Content-length'));\n\t\t\t\t\tvar header;\n\t\t\t\t\tvar hasByteServing = (header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes';\n\t\t\t\t\tvar usesGzip = (header = xhr.getResponseHeader('Content-Encoding')) && header === 'gzip';\n\t\t\t\t\tvar chunkSize = 1024 * 1024;\n\t\t\t\t\tif (!hasByteServing) chunkSize = datalength;\n\t\t\t\t\tvar doXHR = (from, to) => {\n\t\t\t\t\t\tif (from > to)\n\t\t\t\t\t\t\tthrow new Error('invalid range (' + from + ', ' + to + ') or no bytes requested!');\n\t\t\t\t\t\tif (to > datalength - 1)\n\t\t\t\t\t\t\tthrow new Error('only ' + datalength + ' bytes available! programmer error!');\n\t\t\t\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\t\t\t\txhr.open('GET', url, false);\n\t\t\t\t\t\tif (datalength !== chunkSize) xhr.setRequestHeader('Range', 'bytes=' + from + '-' + to);\n\t\t\t\t\t\txhr.responseType = 'arraybuffer';\n\t\t\t\t\t\tif (xhr.overrideMimeType) {\n\t\t\t\t\t\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.send(null);\n\t\t\t\t\t\tif (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))\n\t\t\t\t\t\t\tthrow new Error(\"Couldn't load \" + url + '. Status: ' + xhr.status);\n\t\t\t\t\t\tif (xhr.response !== undefined) {\n\t\t\t\t\t\t\treturn new Uint8Array(xhr.response || []);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn intArrayFromString(xhr.responseText || '', true);\n\t\t\t\t\t};\n\t\t\t\t\tvar lazyArray = this;\n\t\t\t\t\tlazyArray.setDataGetter((chunkNum) => {\n\t\t\t\t\t\tvar start = chunkNum * chunkSize;\n\t\t\t\t\t\tvar end = (chunkNum + 1) * chunkSize - 1;\n\t\t\t\t\t\tend = Math.min(end, datalength - 1);\n\t\t\t\t\t\tif (typeof lazyArray.chunks[chunkNum] == 'undefined') {\n\t\t\t\t\t\t\tlazyArray.chunks[chunkNum] = doXHR(start, end);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof lazyArray.chunks[chunkNum] == 'undefined') throw new Error('doXHR failed!');\n\t\t\t\t\t\treturn lazyArray.chunks[chunkNum];\n\t\t\t\t\t});\n\t\t\t\t\tif (usesGzip || !datalength) {\n\t\t\t\t\t\tchunkSize = datalength = 1;\n\t\t\t\t\t\tdatalength = this.getter(0).length;\n\t\t\t\t\t\tchunkSize = datalength;\n\t\t\t\t\t\tout('LazyFiles on gzip forces download of the whole file when length is accessed');\n\t\t\t\t\t}\n\t\t\t\t\tthis._length = datalength;\n\t\t\t\t\tthis._chunkSize = chunkSize;\n\t\t\t\t\tthis.lengthKnown = true;\n\t\t\t\t};\n\t\t\t\tif (typeof XMLHttpRequest != 'undefined') {\n\t\t\t\t\tif (!ENVIRONMENT_IS_WORKER)\n\t\t\t\t\t\tthrow 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n\t\t\t\t\tvar lazyArray = new LazyUint8Array();\n\t\t\t\t\tObject.defineProperties(lazyArray, {\n\t\t\t\t\t\tlength: {\n\t\t\t\t\t\t\tget: function () {\n\t\t\t\t\t\t\t\tif (!this.lengthKnown) {\n\t\t\t\t\t\t\t\t\tthis.cacheLength();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn this._length;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchunkSize: {\n\t\t\t\t\t\t\tget: function () {\n\t\t\t\t\t\t\t\tif (!this.lengthKnown) {\n\t\t\t\t\t\t\t\t\tthis.cacheLength();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn this._chunkSize;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tvar properties = {isDevice: false, contents: lazyArray};\n\t\t\t\t} else {\n\t\t\t\t\tvar properties = {isDevice: false, url: url};\n\t\t\t\t}\n\t\t\t\tvar node = FS.createFile(parent, name, properties, canRead, canWrite);\n\t\t\t\tif (properties.contents) {\n\t\t\t\t\tnode.contents = properties.contents;\n\t\t\t\t} else if (properties.url) {\n\t\t\t\t\tnode.contents = null;\n\t\t\t\t\tnode.url = properties.url;\n\t\t\t\t}\n\t\t\t\tObject.defineProperties(node, {\n\t\t\t\t\tusedBytes: {\n\t\t\t\t\t\tget: function () {\n\t\t\t\t\t\t\treturn this.contents.length;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tvar stream_ops = {};\n\t\t\t\tvar keys = Object.keys(node.stream_ops);\n\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\tvar fn = node.stream_ops[key];\n\t\t\t\t\tstream_ops[key] = function forceLoadLazyFile() {\n\t\t\t\t\t\tFS.forceLoadFile(node);\n\t\t\t\t\t\treturn fn.apply(null, arguments);\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tfunction writeChunks(stream, buffer, offset, length, position) {\n\t\t\t\t\tvar contents = stream.node.contents;\n\t\t\t\t\tif (position >= contents.length) return 0;\n\t\t\t\t\tvar size = Math.min(contents.length - position, length);\n\t\t\t\t\tif (contents.slice) {\n\t\t\t\t\t\tfor (var i = 0; i < size; i++) {\n\t\t\t\t\t\t\tbuffer[offset + i] = contents[position + i];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (var i = 0; i < size; i++) {\n\t\t\t\t\t\t\tbuffer[offset + i] = contents.get(position + i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn size;\n\t\t\t\t}\n\t\t\t\tstream_ops.read = (stream, buffer, offset, length, position) => {\n\t\t\t\t\tFS.forceLoadFile(node);\n\t\t\t\t\treturn writeChunks(stream, buffer, offset, length, position);\n\t\t\t\t};\n\t\t\t\tstream_ops.mmap = (stream, length, position, prot, flags) => {\n\t\t\t\t\tFS.forceLoadFile(node);\n\t\t\t\t\tvar ptr = mmapAlloc(length);\n\t\t\t\t\tif (!ptr) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(48);\n\t\t\t\t\t}\n\t\t\t\t\twriteChunks(stream, HEAP8, ptr, length, position);\n\t\t\t\t\treturn {ptr: ptr, allocated: true};\n\t\t\t\t};\n\t\t\t\tnode.stream_ops = stream_ops;\n\t\t\t\treturn node;\n\t\t\t},\n\t\t};\n\t\tvar SYSCALLS = {\n\t\t\tDEFAULT_POLLMASK: 5,\n\t\t\tcalculateAt(dirfd, path, allowEmpty) {\n\t\t\t\tif (PATH.isAbs(path)) {\n\t\t\t\t\treturn path;\n\t\t\t\t}\n\t\t\t\tvar dir;\n\t\t\t\tif (dirfd === -100) {\n\t\t\t\t\tdir = FS.cwd();\n\t\t\t\t} else {\n\t\t\t\t\tvar dirstream = SYSCALLS.getStreamFromFD(dirfd);\n\t\t\t\t\tdir = dirstream.path;\n\t\t\t\t}\n\t\t\t\tif (path.length == 0) {\n\t\t\t\t\tif (!allowEmpty) {\n\t\t\t\t\t\tthrow new FS.ErrnoError(44);\n\t\t\t\t\t}\n\t\t\t\t\treturn dir;\n\t\t\t\t}\n\t\t\t\treturn PATH.join2(dir, path);\n\t\t\t},\n\t\t\tdoStat(func, path, buf) {\n\t\t\t\ttry {\n\t\t\t\t\tvar stat = func(path);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {\n\t\t\t\t\t\treturn -54;\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t\tHEAP32[buf >> 2] = stat.dev;\n\t\t\t\tHEAP32[(buf + 4) >> 2] = stat.mode;\n\t\t\t\tHEAPU32[(buf + 8) >> 2] = stat.nlink;\n\t\t\t\tHEAP32[(buf + 12) >> 2] = stat.uid;\n\t\t\t\tHEAP32[(buf + 16) >> 2] = stat.gid;\n\t\t\t\tHEAP32[(buf + 20) >> 2] = stat.rdev;\n\t\t\t\t(tempI64 = [\n\t\t\t\t\tstat.size >>> 0,\n\t\t\t\t\t((tempDouble = stat.size),\n\t\t\t\t\t+Math.abs(tempDouble) >= 1\n\t\t\t\t\t\t? tempDouble > 0\n\t\t\t\t\t\t\t? +Math.floor(tempDouble / 4294967296) >>> 0\n\t\t\t\t\t\t\t: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0\n\t\t\t\t\t\t: 0),\n\t\t\t\t]),\n\t\t\t\t\t(HEAP32[(buf + 24) >> 2] = tempI64[0]),\n\t\t\t\t\t(HEAP32[(buf + 28) >> 2] = tempI64[1]);\n\t\t\t\tHEAP32[(buf + 32) >> 2] = 4096;\n\t\t\t\tHEAP32[(buf + 36) >> 2] = stat.blocks;\n\t\t\t\tvar atime = stat.atime.getTime();\n\t\t\t\tvar mtime = stat.mtime.getTime();\n\t\t\t\tvar ctime = stat.ctime.getTime();\n\t\t\t\t(tempI64 = [\n\t\t\t\t\tMath.floor(atime / 1e3) >>> 0,\n\t\t\t\t\t((tempDouble = Math.floor(atime / 1e3)),\n\t\t\t\t\t+Math.abs(tempDouble) >= 1\n\t\t\t\t\t\t? tempDouble > 0\n\t\t\t\t\t\t\t? +Math.floor(tempDouble / 4294967296) >>> 0\n\t\t\t\t\t\t\t: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0\n\t\t\t\t\t\t: 0),\n\t\t\t\t]),\n\t\t\t\t\t(HEAP32[(buf + 40) >> 2] = tempI64[0]),\n\t\t\t\t\t(HEAP32[(buf + 44) >> 2] = tempI64[1]);\n\t\t\t\tHEAPU32[(buf + 48) >> 2] = (atime % 1e3) * 1e3;\n\t\t\t\t(tempI64 = [\n\t\t\t\t\tMath.floor(mtime / 1e3) >>> 0,\n\t\t\t\t\t((tempDouble = Math.floor(mtime / 1e3)),\n\t\t\t\t\t+Math.abs(tempDouble) >= 1\n\t\t\t\t\t\t? tempDouble > 0\n\t\t\t\t\t\t\t? +Math.floor(tempDouble / 4294967296) >>> 0\n\t\t\t\t\t\t\t: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0\n\t\t\t\t\t\t: 0),\n\t\t\t\t]),\n\t\t\t\t\t(HEAP32[(buf + 56) >> 2] = tempI64[0]),\n\t\t\t\t\t(HEAP32[(buf + 60) >> 2] = tempI64[1]);\n\t\t\t\tHEAPU32[(buf + 64) >> 2] = (mtime % 1e3) * 1e3;\n\t\t\t\t(tempI64 = [\n\t\t\t\t\tMath.floor(ctime / 1e3) >>> 0,\n\t\t\t\t\t((tempDouble = Math.floor(ctime / 1e3)),\n\t\t\t\t\t+Math.abs(tempDouble) >= 1\n\t\t\t\t\t\t? tempDouble > 0\n\t\t\t\t\t\t\t? +Math.floor(tempDouble / 4294967296) >>> 0\n\t\t\t\t\t\t\t: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0\n\t\t\t\t\t\t: 0),\n\t\t\t\t]),\n\t\t\t\t\t(HEAP32[(buf + 72) >> 2] = tempI64[0]),\n\t\t\t\t\t(HEAP32[(buf + 76) >> 2] = tempI64[1]);\n\t\t\t\tHEAPU32[(buf + 80) >> 2] = (ctime % 1e3) * 1e3;\n\t\t\t\t(tempI64 = [\n\t\t\t\t\tstat.ino >>> 0,\n\t\t\t\t\t((tempDouble = stat.ino),\n\t\t\t\t\t+Math.abs(tempDouble) >= 1\n\t\t\t\t\t\t? tempDouble > 0\n\t\t\t\t\t\t\t? +Math.floor(tempDouble / 4294967296) >>> 0\n\t\t\t\t\t\t\t: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0\n\t\t\t\t\t\t: 0),\n\t\t\t\t]),\n\t\t\t\t\t(HEAP32[(buf + 88) >> 2] = tempI64[0]),\n\t\t\t\t\t(HEAP32[(buf + 92) >> 2] = tempI64[1]);\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t\tdoMsync(addr, stream, len, flags, offset) {\n\t\t\t\tif (!FS.isFile(stream.node.mode)) {\n\t\t\t\t\tthrow new FS.ErrnoError(43);\n\t\t\t\t}\n\t\t\t\tif (flags & 2) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\tvar buffer = HEAPU8.slice(addr, addr + len);\n\t\t\t\tFS.msync(stream, buffer, offset, len, flags);\n\t\t\t},\n\t\t\tvarargs: undefined,\n\t\t\tget() {\n\t\t\t\tvar ret = HEAP32[SYSCALLS.varargs >> 2];\n\t\t\t\tSYSCALLS.varargs += 4;\n\t\t\t\treturn ret;\n\t\t\t},\n\t\t\tgetp() {\n\t\t\t\treturn SYSCALLS.get();\n\t\t\t},\n\t\t\tgetStr(ptr) {\n\t\t\t\tvar ret = UTF8ToString(ptr);\n\t\t\t\treturn ret;\n\t\t\t},\n\t\t\tgetStreamFromFD(fd) {\n\t\t\t\tvar stream = FS.getStreamChecked(fd);\n\t\t\t\treturn stream;\n\t\t\t},\n\t\t};\n\t\tvar _environ_get = (__environ, environ_buf) => {\n\t\t\tvar bufSize = 0;\n\t\t\tgetEnvStrings().forEach((string, i) => {\n\t\t\t\tvar ptr = environ_buf + bufSize;\n\t\t\t\tHEAPU32[(__environ + i * 4) >> 2] = ptr;\n\t\t\t\tstringToAscii(string, ptr);\n\t\t\t\tbufSize += string.length + 1;\n\t\t\t});\n\t\t\treturn 0;\n\t\t};\n\t\tvar _environ_sizes_get = (penviron_count, penviron_buf_size) => {\n\t\t\tvar strings = getEnvStrings();\n\t\t\tHEAPU32[penviron_count >> 2] = strings.length;\n\t\t\tvar bufSize = 0;\n\t\t\tstrings.forEach((string) => (bufSize += string.length + 1));\n\t\t\tHEAPU32[penviron_buf_size >> 2] = bufSize;\n\t\t\treturn 0;\n\t\t};\n\t\tfunction _fd_close(fd) {\n\t\t\ttry {\n\t\t\t\tvar stream = SYSCALLS.getStreamFromFD(fd);\n\t\t\t\tFS.close(stream);\n\t\t\t\treturn 0;\n\t\t\t} catch (e) {\n\t\t\t\tif (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;\n\t\t\t\treturn e.errno;\n\t\t\t}\n\t\t}\n\t\tvar doReadv = (stream, iov, iovcnt, offset) => {\n\t\t\tvar ret = 0;\n\t\t\tfor (var i = 0; i < iovcnt; i++) {\n\t\t\t\tvar ptr = HEAPU32[iov >> 2];\n\t\t\t\tvar len = HEAPU32[(iov + 4) >> 2];\n\t\t\t\tiov += 8;\n\t\t\t\tvar curr = FS.read(stream, HEAP8, ptr, len, offset);\n\t\t\t\tif (curr < 0) return -1;\n\t\t\t\tret += curr;\n\t\t\t\tif (curr < len) break;\n\t\t\t\tif (typeof offset !== 'undefined') {\n\t\t\t\t\toffset += curr;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret;\n\t\t};\n\t\tfunction _fd_read(fd, iov, iovcnt, pnum) {\n\t\t\ttry {\n\t\t\t\tvar stream = SYSCALLS.getStreamFromFD(fd);\n\t\t\t\tvar num = doReadv(stream, iov, iovcnt);\n\t\t\t\tHEAPU32[pnum >> 2] = num;\n\t\t\t\treturn 0;\n\t\t\t} catch (e) {\n\t\t\t\tif (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;\n\t\t\t\treturn e.errno;\n\t\t\t}\n\t\t}\n\t\tvar convertI32PairToI53Checked = (lo, hi) =>\n\t\t\t(hi + 2097152) >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN;\n\t\tfunction _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n\t\t\tvar offset = convertI32PairToI53Checked(offset_low, offset_high);\n\t\t\ttry {\n\t\t\t\tif (isNaN(offset)) return 61;\n\t\t\t\tvar stream = SYSCALLS.getStreamFromFD(fd);\n\t\t\t\tFS.llseek(stream, offset, whence);\n\t\t\t\t(tempI64 = [\n\t\t\t\t\tstream.position >>> 0,\n\t\t\t\t\t((tempDouble = stream.position),\n\t\t\t\t\t+Math.abs(tempDouble) >= 1\n\t\t\t\t\t\t? tempDouble > 0\n\t\t\t\t\t\t\t? +Math.floor(tempDouble / 4294967296) >>> 0\n\t\t\t\t\t\t\t: ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0\n\t\t\t\t\t\t: 0),\n\t\t\t\t]),\n\t\t\t\t\t(HEAP32[newOffset >> 2] = tempI64[0]),\n\t\t\t\t\t(HEAP32[(newOffset + 4) >> 2] = tempI64[1]);\n\t\t\t\tif (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;\n\t\t\t\treturn 0;\n\t\t\t} catch (e) {\n\t\t\t\tif (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;\n\t\t\t\treturn e.errno;\n\t\t\t}\n\t\t}\n\t\tvar doWritev = (stream, iov, iovcnt, offset) => {\n\t\t\tvar ret = 0;\n\t\t\tfor (var i = 0; i < iovcnt; i++) {\n\t\t\t\tvar ptr = HEAPU32[iov >> 2];\n\t\t\t\tvar len = HEAPU32[(iov + 4) >> 2];\n\t\t\t\tiov += 8;\n\t\t\t\tvar curr = FS.write(stream, HEAP8, ptr, len, offset);\n\t\t\t\tif (curr < 0) return -1;\n\t\t\t\tret += curr;\n\t\t\t\tif (typeof offset !== 'undefined') {\n\t\t\t\t\toffset += curr;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret;\n\t\t};\n\t\tfunction _fd_write(fd, iov, iovcnt, pnum) {\n\t\t\ttry {\n\t\t\t\tvar stream = SYSCALLS.getStreamFromFD(fd);\n\t\t\t\tvar num = doWritev(stream, iov, iovcnt);\n\t\t\t\tHEAPU32[pnum >> 2] = num;\n\t\t\t\treturn 0;\n\t\t\t} catch (e) {\n\t\t\t\tif (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;\n\t\t\t\treturn e.errno;\n\t\t\t}\n\t\t}\n\t\tvar _llvm_eh_typeid_for = (type) => type;\n\t\tvar isLeapYear = (year) => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n\t\tvar arraySum = (array, index) => {\n\t\t\tvar sum = 0;\n\t\t\tfor (var i = 0; i <= index; sum += array[i++]) {}\n\t\t\treturn sum;\n\t\t};\n\t\tvar MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\t\tvar MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\t\tvar addDays = (date, days) => {\n\t\t\tvar newDate = new Date(date.getTime());\n\t\t\twhile (days > 0) {\n\t\t\t\tvar leap = isLeapYear(newDate.getFullYear());\n\t\t\t\tvar currentMonth = newDate.getMonth();\n\t\t\t\tvar daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth];\n\t\t\t\tif (days > daysInCurrentMonth - newDate.getDate()) {\n\t\t\t\t\tdays -= daysInCurrentMonth - newDate.getDate() + 1;\n\t\t\t\t\tnewDate.setDate(1);\n\t\t\t\t\tif (currentMonth < 11) {\n\t\t\t\t\t\tnewDate.setMonth(currentMonth + 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDate.setMonth(0);\n\t\t\t\t\t\tnewDate.setFullYear(newDate.getFullYear() + 1);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewDate.setDate(newDate.getDate() + days);\n\t\t\t\t\treturn newDate;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newDate;\n\t\t};\n\t\tvar writeArrayToMemory = (array, buffer) => {\n\t\t\tHEAP8.set(array, buffer);\n\t\t};\n\t\tvar _strftime = (s, maxsize, format, tm) => {\n\t\t\tvar tm_zone = HEAPU32[(tm + 40) >> 2];\n\t\t\tvar date = {\n\t\t\t\ttm_sec: HEAP32[tm >> 2],\n\t\t\t\ttm_min: HEAP32[(tm + 4) >> 2],\n\t\t\t\ttm_hour: HEAP32[(tm + 8) >> 2],\n\t\t\t\ttm_mday: HEAP32[(tm + 12) >> 2],\n\t\t\t\ttm_mon: HEAP32[(tm + 16) >> 2],\n\t\t\t\ttm_year: HEAP32[(tm + 20) >> 2],\n\t\t\t\ttm_wday: HEAP32[(tm + 24) >> 2],\n\t\t\t\ttm_yday: HEAP32[(tm + 28) >> 2],\n\t\t\t\ttm_isdst: HEAP32[(tm + 32) >> 2],\n\t\t\t\ttm_gmtoff: HEAP32[(tm + 36) >> 2],\n\t\t\t\ttm_zone: tm_zone ? UTF8ToString(tm_zone) : '',\n\t\t\t};\n\t\t\tvar pattern = UTF8ToString(format);\n\t\t\tvar EXPANSION_RULES_1 = {\n\t\t\t\t'%c': '%a %b %d %H:%M:%S %Y',\n\t\t\t\t'%D': '%m/%d/%y',\n\t\t\t\t'%F': '%Y-%m-%d',\n\t\t\t\t'%h': '%b',\n\t\t\t\t'%r': '%I:%M:%S %p',\n\t\t\t\t'%R': '%H:%M',\n\t\t\t\t'%T': '%H:%M:%S',\n\t\t\t\t'%x': '%m/%d/%y',\n\t\t\t\t'%X': '%H:%M:%S',\n\t\t\t\t'%Ec': '%c',\n\t\t\t\t'%EC': '%C',\n\t\t\t\t'%Ex': '%m/%d/%y',\n\t\t\t\t'%EX': '%H:%M:%S',\n\t\t\t\t'%Ey': '%y',\n\t\t\t\t'%EY': '%Y',\n\t\t\t\t'%Od': '%d',\n\t\t\t\t'%Oe': '%e',\n\t\t\t\t'%OH': '%H',\n\t\t\t\t'%OI': '%I',\n\t\t\t\t'%Om': '%m',\n\t\t\t\t'%OM': '%M',\n\t\t\t\t'%OS': '%S',\n\t\t\t\t'%Ou': '%u',\n\t\t\t\t'%OU': '%U',\n\t\t\t\t'%OV': '%V',\n\t\t\t\t'%Ow': '%w',\n\t\t\t\t'%OW': '%W',\n\t\t\t\t'%Oy': '%y',\n\t\t\t};\n\t\t\tfor (var rule in EXPANSION_RULES_1) {\n\t\t\t\tpattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);\n\t\t\t}\n\t\t\tvar WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\t\t\tvar MONTHS = [\n\t\t\t\t'January',\n\t\t\t\t'February',\n\t\t\t\t'March',\n\t\t\t\t'April',\n\t\t\t\t'May',\n\t\t\t\t'June',\n\t\t\t\t'July',\n\t\t\t\t'August',\n\t\t\t\t'September',\n\t\t\t\t'October',\n\t\t\t\t'November',\n\t\t\t\t'December',\n\t\t\t];\n\t\t\tfunction leadingSomething(value, digits, character) {\n\t\t\t\tvar str = typeof value == 'number' ? value.toString() : value || '';\n\t\t\t\twhile (str.length < digits) {\n\t\t\t\t\tstr = character[0] + str;\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t}\n\t\t\tfunction leadingNulls(value, digits) {\n\t\t\t\treturn leadingSomething(value, digits, '0');\n\t\t\t}\n\t\t\tfunction compareByDay(date1, date2) {\n\t\t\t\tfunction sgn(value) {\n\t\t\t\t\treturn value < 0 ? -1 : value > 0 ? 1 : 0;\n\t\t\t\t}\n\t\t\t\tvar compare;\n\t\t\t\tif ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) {\n\t\t\t\t\tif ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {\n\t\t\t\t\t\tcompare = sgn(date1.getDate() - date2.getDate());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn compare;\n\t\t\t}\n\t\t\tfunction getFirstWeekStartDate(janFourth) {\n\t\t\t\tswitch (janFourth.getDay()) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\treturn new Date(janFourth.getFullYear() - 1, 11, 29);\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\treturn janFourth;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\treturn new Date(janFourth.getFullYear(), 0, 3);\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\treturn new Date(janFourth.getFullYear(), 0, 2);\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\treturn new Date(janFourth.getFullYear(), 0, 1);\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\treturn new Date(janFourth.getFullYear() - 1, 11, 31);\n\t\t\t\t\tcase 6:\n\t\t\t\t\t\treturn new Date(janFourth.getFullYear() - 1, 11, 30);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction getWeekBasedYear(date) {\n\t\t\t\tvar thisDate = addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);\n\t\t\t\tvar janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);\n\t\t\t\tvar janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);\n\t\t\t\tvar firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n\t\t\t\tvar firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n\t\t\t\tif (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {\n\t\t\t\t\tif (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {\n\t\t\t\t\t\treturn thisDate.getFullYear() + 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn thisDate.getFullYear();\n\t\t\t\t}\n\t\t\t\treturn thisDate.getFullYear() - 1;\n\t\t\t}\n\t\t\tvar EXPANSION_RULES_2 = {\n\t\t\t\t'%a': (date) => WEEKDAYS[date.tm_wday].substring(0, 3),\n\t\t\t\t'%A': (date) => WEEKDAYS[date.tm_wday],\n\t\t\t\t'%b': (date) => MONTHS[date.tm_mon].substring(0, 3),\n\t\t\t\t'%B': (date) => MONTHS[date.tm_mon],\n\t\t\t\t'%C': (date) => {\n\t\t\t\t\tvar year = date.tm_year + 1900;\n\t\t\t\t\treturn leadingNulls((year / 100) | 0, 2);\n\t\t\t\t},\n\t\t\t\t'%d': (date) => leadingNulls(date.tm_mday, 2),\n\t\t\t\t'%e': (date) => leadingSomething(date.tm_mday, 2, ' '),\n\t\t\t\t'%g': (date) => getWeekBasedYear(date).toString().substring(2),\n\t\t\t\t'%G': (date) => getWeekBasedYear(date),\n\t\t\t\t'%H': (date) => leadingNulls(date.tm_hour, 2),\n\t\t\t\t'%I': (date) => {\n\t\t\t\t\tvar twelveHour = date.tm_hour;\n\t\t\t\t\tif (twelveHour == 0) twelveHour = 12;\n\t\t\t\t\telse if (twelveHour > 12) twelveHour -= 12;\n\t\t\t\t\treturn leadingNulls(twelveHour, 2);\n\t\t\t\t},\n\t\t\t\t'%j': (date) =>\n\t\t\t\t\tleadingNulls(\n\t\t\t\t\t\tdate.tm_mday +\n\t\t\t\t\t\t\tarraySum(\n\t\t\t\t\t\t\t\tisLeapYear(date.tm_year + 1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR,\n\t\t\t\t\t\t\t\tdate.tm_mon - 1\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t3\n\t\t\t\t\t),\n\t\t\t\t'%m': (date) => leadingNulls(date.tm_mon + 1, 2),\n\t\t\t\t'%M': (date) => leadingNulls(date.tm_min, 2),\n\t\t\t\t'%n': () => '\\n',\n\t\t\t\t'%p': (date) => {\n\t\t\t\t\tif (date.tm_hour >= 0 && date.tm_hour < 12) {\n\t\t\t\t\t\treturn 'AM';\n\t\t\t\t\t}\n\t\t\t\t\treturn 'PM';\n\t\t\t\t},\n\t\t\t\t'%S': (date) => leadingNulls(date.tm_sec, 2),\n\t\t\t\t'%t': () => '\\t',\n\t\t\t\t'%u': (date) => date.tm_wday || 7,\n\t\t\t\t'%U': (date) => {\n\t\t\t\t\tvar days = date.tm_yday + 7 - date.tm_wday;\n\t\t\t\t\treturn leadingNulls(Math.floor(days / 7), 2);\n\t\t\t\t},\n\t\t\t\t'%V': (date) => {\n\t\t\t\t\tvar val = Math.floor((date.tm_yday + 7 - ((date.tm_wday + 6) % 7)) / 7);\n\t\t\t\t\tif ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) {\n\t\t\t\t\t\tval++;\n\t\t\t\t\t}\n\t\t\t\t\tif (!val) {\n\t\t\t\t\t\tval = 52;\n\t\t\t\t\t\tvar dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7;\n\t\t\t\t\t\tif (dec31 == 4 || (dec31 == 5 && isLeapYear((date.tm_year % 400) - 1))) {\n\t\t\t\t\t\t\tval++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (val == 53) {\n\t\t\t\t\t\tvar jan1 = (date.tm_wday + 371 - date.tm_yday) % 7;\n\t\t\t\t\t\tif (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) val = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn leadingNulls(val, 2);\n\t\t\t\t},\n\t\t\t\t'%w': (date) => date.tm_wday,\n\t\t\t\t'%W': (date) => {\n\t\t\t\t\tvar days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7);\n\t\t\t\t\treturn leadingNulls(Math.floor(days / 7), 2);\n\t\t\t\t},\n\t\t\t\t'%y': (date) => (date.tm_year + 1900).toString().substring(2),\n\t\t\t\t'%Y': (date) => date.tm_year + 1900,\n\t\t\t\t'%z': (date) => {\n\t\t\t\t\tvar off = date.tm_gmtoff;\n\t\t\t\t\tvar ahead = off >= 0;\n\t\t\t\t\toff = Math.abs(off) / 60;\n\t\t\t\t\toff = (off / 60) * 100 + (off % 60);\n\t\t\t\t\treturn (ahead ? '+' : '-') + String('0000' + off).slice(-4);\n\t\t\t\t},\n\t\t\t\t'%Z': (date) => date.tm_zone,\n\t\t\t\t'%%': () => '%',\n\t\t\t};\n\t\t\tpattern = pattern.replace(/%%/g, '\\0\\0');\n\t\t\tfor (var rule in EXPANSION_RULES_2) {\n\t\t\t\tif (pattern.includes(rule)) {\n\t\t\t\t\tpattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));\n\t\t\t\t}\n\t\t\t}\n\t\t\tpattern = pattern.replace(/\\0\\0/g, '%');\n\t\t\tvar bytes = intArrayFromString(pattern, false);\n\t\t\tif (bytes.length > maxsize) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\twriteArrayToMemory(bytes, s);\n\t\t\treturn bytes.length - 1;\n\t\t};\n\t\tvar _strftime_l = (s, maxsize, format, tm, loc) => _strftime(s, maxsize, format, tm);\n\t\tvar uleb128Encode = (n, target) => {\n\t\t\tif (n < 128) {\n\t\t\t\ttarget.push(n);\n\t\t\t} else {\n\t\t\t\ttarget.push(n % 128 | 128, n >> 7);\n\t\t\t}\n\t\t};\n\t\tvar sigToWasmTypes = (sig) => {\n\t\t\tvar typeNames = {i: 'i32', j: 'i64', f: 'f32', d: 'f64', p: 'i32'};\n\t\t\tvar type = {parameters: [], results: sig[0] == 'v' ? [] : [typeNames[sig[0]]]};\n\t\t\tfor (var i = 1; i < sig.length; ++i) {\n\t\t\t\ttype.parameters.push(typeNames[sig[i]]);\n\t\t\t}\n\t\t\treturn type;\n\t\t};\n\t\tvar generateFuncType = (sig, target) => {\n\t\t\tvar sigRet = sig.slice(0, 1);\n\t\t\tvar sigParam = sig.slice(1);\n\t\t\tvar typeCodes = {i: 127, p: 127, j: 126, f: 125, d: 124};\n\t\t\ttarget.push(96);\n\t\t\tuleb128Encode(sigParam.length, target);\n\t\t\tfor (var i = 0; i < sigParam.length; ++i) {\n\t\t\t\ttarget.push(typeCodes[sigParam[i]]);\n\t\t\t}\n\t\t\tif (sigRet == 'v') {\n\t\t\t\ttarget.push(0);\n\t\t\t} else {\n\t\t\t\ttarget.push(1, typeCodes[sigRet]);\n\t\t\t}\n\t\t};\n\t\tvar convertJsFunctionToWasm = (func, sig) => {\n\t\t\tif (typeof WebAssembly.Function == 'function') {\n\t\t\t\treturn new WebAssembly.Function(sigToWasmTypes(sig), func);\n\t\t\t}\n\t\t\tvar typeSectionBody = [1];\n\t\t\tgenerateFuncType(sig, typeSectionBody);\n\t\t\tvar bytes = [0, 97, 115, 109, 1, 0, 0, 0, 1];\n\t\t\tuleb128Encode(typeSectionBody.length, bytes);\n\t\t\tbytes.push.apply(bytes, typeSectionBody);\n\t\t\tbytes.push(2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0);\n\t\t\tvar module = new WebAssembly.Module(new Uint8Array(bytes));\n\t\t\tvar instance = new WebAssembly.Instance(module, {e: {f: func}});\n\t\t\tvar wrappedFunc = instance.exports['f'];\n\t\t\treturn wrappedFunc;\n\t\t};\n\t\tvar updateTableMap = (offset, count) => {\n\t\t\tif (functionsInTableMap) {\n\t\t\t\tfor (var i = offset; i < offset + count; i++) {\n\t\t\t\t\tvar item = getWasmTableEntry(i);\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\tfunctionsInTableMap.set(item, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvar functionsInTableMap = undefined;\n\t\tvar getFunctionAddress = (func) => {\n\t\t\tif (!functionsInTableMap) {\n\t\t\t\tfunctionsInTableMap = new WeakMap();\n\t\t\t\tupdateTableMap(0, wasmTable.length);\n\t\t\t}\n\t\t\treturn functionsInTableMap.get(func) || 0;\n\t\t};\n\t\tvar freeTableIndexes = [];\n\t\tvar getEmptyTableSlot = () => {\n\t\t\tif (freeTableIndexes.length) {\n\t\t\t\treturn freeTableIndexes.pop();\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twasmTable.grow(1);\n\t\t\t} catch (err) {\n\t\t\t\tif (!(err instanceof RangeError)) {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t\tthrow 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.';\n\t\t\t}\n\t\t\treturn wasmTable.length - 1;\n\t\t};\n\t\tvar setWasmTableEntry = (idx, func) => {\n\t\t\twasmTable.set(idx, func);\n\t\t\twasmTableMirror[idx] = wasmTable.get(idx);\n\t\t};\n\t\tvar addFunction = (func, sig) => {\n\t\t\tvar rtn = getFunctionAddress(func);\n\t\t\tif (rtn) {\n\t\t\t\treturn rtn;\n\t\t\t}\n\t\t\tvar ret = getEmptyTableSlot();\n\t\t\ttry {\n\t\t\t\tsetWasmTableEntry(ret, func);\n\t\t\t} catch (err) {\n\t\t\t\tif (!(err instanceof TypeError)) {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t\tvar wrapped = convertJsFunctionToWasm(func, sig);\n\t\t\t\tsetWasmTableEntry(ret, wrapped);\n\t\t\t}\n\t\t\tfunctionsInTableMap.set(func, ret);\n\t\t\treturn ret;\n\t\t};\n\t\tvar removeFunction = (index) => {\n\t\t\tfunctionsInTableMap.delete(getWasmTableEntry(index));\n\t\t\tfreeTableIndexes.push(index);\n\t\t};\n\t\tInternalError = Module['InternalError'] = class InternalError extends Error {\n\t\t\tconstructor(message) {\n\t\t\t\tsuper(message);\n\t\t\t\tthis.name = 'InternalError';\n\t\t\t}\n\t\t};\n\t\tembind_init_charCodes();\n\t\tBindingError = Module['BindingError'] = class BindingError extends Error {\n\t\t\tconstructor(message) {\n\t\t\t\tsuper(message);\n\t\t\t\tthis.name = 'BindingError';\n\t\t\t}\n\t\t};\n\t\tinit_ClassHandle();\n\t\tinit_embind();\n\t\tinit_RegisteredPointer();\n\t\tUnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError');\n\t\thandleAllocatorInit();\n\t\tinit_emval();\n\t\tvar FSNode = function (parent, name, mode, rdev) {\n\t\t\tif (!parent) {\n\t\t\t\tparent = this;\n\t\t\t}\n\t\t\tthis.parent = parent;\n\t\t\tthis.mount = parent.mount;\n\t\t\tthis.mounted = null;\n\t\t\tthis.id = FS.nextInode++;\n\t\t\tthis.name = name;\n\t\t\tthis.mode = mode;\n\t\t\tthis.node_ops = {};\n\t\t\tthis.stream_ops = {};\n\t\t\tthis.rdev = rdev;\n\t\t};\n\t\tvar readMode = 292 | 73;\n\t\tvar writeMode = 146;\n\t\tObject.defineProperties(FSNode.prototype, {\n\t\t\tread: {\n\t\t\t\tget: function () {\n\t\t\t\t\treturn (this.mode & readMode) === readMode;\n\t\t\t\t},\n\t\t\t\tset: function (val) {\n\t\t\t\t\tval ? (this.mode |= readMode) : (this.mode &= ~readMode);\n\t\t\t\t},\n\t\t\t},\n\t\t\twrite: {\n\t\t\t\tget: function () {\n\t\t\t\t\treturn (this.mode & writeMode) === writeMode;\n\t\t\t\t},\n\t\t\t\tset: function (val) {\n\t\t\t\t\tval ? (this.mode |= writeMode) : (this.mode &= ~writeMode);\n\t\t\t\t},\n\t\t\t},\n\t\t\tisFolder: {\n\t\t\t\tget: function () {\n\t\t\t\t\treturn FS.isDir(this.mode);\n\t\t\t\t},\n\t\t\t},\n\t\t\tisDevice: {\n\t\t\t\tget: function () {\n\t\t\t\t\treturn FS.isChrdev(this.mode);\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\tFS.FSNode = FSNode;\n\t\tFS.createPreloadedFile = FS_createPreloadedFile;\n\t\tFS.staticInit();\n\t\tvar wasmImports = {\n\t\t\tB: ___cxa_begin_catch,\n\t\t\tK: ___cxa_end_catch,\n\t\t\ta: ___cxa_find_matching_catch_2,\n\t\t\tk: ___cxa_find_matching_catch_3,\n\t\t\tS: ___cxa_rethrow,\n\t\t\th: ___cxa_throw,\n\t\t\tna: ___cxa_uncaught_exceptions,\n\t\t\td: ___resumeException,\n\t\t\tDa: __embind_finalize_value_object,\n\t\t\tca: __embind_register_bigint,\n\t\t\tsa: __embind_register_bool,\n\t\t\tx: __embind_register_class,\n\t\t\tw: __embind_register_class_constructor,\n\t\t\ti: __embind_register_class_function,\n\t\t\tra: __embind_register_emval,\n\t\t\tO: __embind_register_enum,\n\t\t\tt: __embind_register_enum_value,\n\t\t\tU: __embind_register_float,\n\t\t\to: __embind_register_function,\n\t\t\tz: __embind_register_integer,\n\t\t\ts: __embind_register_memory_view,\n\t\t\tT: __embind_register_std_string,\n\t\t\tM: __embind_register_std_wstring,\n\t\t\tE: __embind_register_value_object,\n\t\t\tEa: __embind_register_value_object_field,\n\t\t\tta: __embind_register_void,\n\t\t\tJa: __emval_as,\n\t\t\tza: __emval_call_method,\n\t\t\tGa: __emval_call_void_method,\n\t\t\tLa: __emval_decref,\n\t\t\tIa: __emval_equals,\n\t\t\tBa: __emval_get_method_caller,\n\t\t\tKa: __emval_get_property,\n\t\t\tHa: __emval_incref,\n\t\t\tF: __emval_new_cstring,\n\t\t\t$: __emval_new_object,\n\t\t\tpa: __emval_run_destructors,\n\t\t\tMa: __emval_set_property,\n\t\t\ty: __emval_take_value,\n\t\t\tL: _abort,\n\t\t\tqa: _emscripten_memcpy_big,\n\t\t\toa: _emscripten_resize_heap,\n\t\t\tja: _environ_get,\n\t\t\tka: _environ_sizes_get,\n\t\t\tla: _fd_close,\n\t\t\tma: _fd_read,\n\t\t\tba: _fd_seek,\n\t\t\tR: _fd_write,\n\t\t\tH: invoke_diii,\n\t\t\tA: invoke_diiiii,\n\t\t\tW: invoke_fii,\n\t\t\tP: invoke_fiii,\n\t\t\tr: invoke_i,\n\t\t\tc: invoke_ii,\n\t\t\tb: invoke_iii,\n\t\t\tn: invoke_iiii,\n\t\t\tl: invoke_iiiii,\n\t\t\tN: invoke_iiiiii,\n\t\t\tD: invoke_iiiiiii,\n\t\t\tQ: invoke_iiiiiiii,\n\t\t\tJ: invoke_iiiiiiiiiiii,\n\t\t\taa: invoke_jiiii,\n\t\t\tj: invoke_v,\n\t\t\tf: invoke_vi,\n\t\t\tva: invoke_vidi,\n\t\t\tg: invoke_vii,\n\t\t\tAa: invoke_viid,\n\t\t\tG: invoke_viiddi,\n\t\t\tV: invoke_viidi,\n\t\t\twa: invoke_viidiidid,\n\t\t\tu: invoke_viif,\n\t\t\tya: invoke_viifff,\n\t\t\tCa: invoke_viififi,\n\t\t\te: invoke_viii,\n\t\t\tX: invoke_viiif,\n\t\t\tFa: invoke_viiiffi,\n\t\t\tm: invoke_viiii,\n\t\t\tp: invoke_viiiii,\n\t\t\txa: invoke_viiiiid,\n\t\t\t_: invoke_viiiiif,\n\t\t\tC: invoke_viiiiii,\n\t\t\tv: invoke_viiiiiii,\n\t\t\tY: invoke_viiiiiiiii,\n\t\t\tq: invoke_viiiiiiiiii,\n\t\t\tI: invoke_viiiiiiiiiiiiiii,\n\t\t\tZ: invoke_viiiiiiiiiiiiiiiiii,\n\t\t\tga: invoke_viiij,\n\t\t\tda: invoke_viiji,\n\t\t\tha: invoke_viijii,\n\t\t\tea: invoke_vijii,\n\t\t\tfa: invoke_vijiii,\n\t\t\tua: _llvm_eh_typeid_for,\n\t\t\tia: _strftime_l,\n\t\t};\n\t\tvar wasmExports = createWasm();\n\t\tvar ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports['Oa'])();\n\t\tvar ___cxa_free_exception = (a0) => (___cxa_free_exception = wasmExports['__cxa_free_exception'])(a0);\n\t\tvar _free = (a0) => (_free = wasmExports['Qa'])(a0);\n\t\tvar _malloc = (a0) => (_malloc = wasmExports['Ra'])(a0);\n\t\tvar ___getTypeName = (a0) => (___getTypeName = wasmExports['Sa'])(a0);\n\t\tvar __embind_initialize_bindings = (Module['__embind_initialize_bindings'] = () =>\n\t\t\t(__embind_initialize_bindings = Module['__embind_initialize_bindings'] = wasmExports['Ta'])());\n\t\tvar ___errno_location = () => (___errno_location = wasmExports['__errno_location'])();\n\t\tvar _setThrew = (a0, a1) => (_setThrew = wasmExports['Ua'])(a0, a1);\n\t\tvar setTempRet0 = (a0) => (setTempRet0 = wasmExports['Va'])(a0);\n\t\tvar stackSave = () => (stackSave = wasmExports['Wa'])();\n\t\tvar stackRestore = (a0) => (stackRestore = wasmExports['Xa'])(a0);\n\t\tvar ___cxa_decrement_exception_refcount = (a0) => (___cxa_decrement_exception_refcount = wasmExports['Ya'])(a0);\n\t\tvar ___cxa_increment_exception_refcount = (a0) => (___cxa_increment_exception_refcount = wasmExports['Za'])(a0);\n\t\tvar ___cxa_can_catch = (a0, a1, a2) => (___cxa_can_catch = wasmExports['_a'])(a0, a1, a2);\n\t\tvar ___cxa_is_pointer_type = (a0) => (___cxa_is_pointer_type = wasmExports['$a'])(a0);\n\t\tvar dynCall_viijii = (Module['dynCall_viijii'] = (a0, a1, a2, a3, a4, a5, a6) =>\n\t\t\t(dynCall_viijii = Module['dynCall_viijii'] = wasmExports['ab'])(a0, a1, a2, a3, a4, a5, a6));\n\t\tvar dynCall_viiij = (Module['dynCall_viiij'] = (a0, a1, a2, a3, a4, a5) =>\n\t\t\t(dynCall_viiij = Module['dynCall_viiij'] = wasmExports['bb'])(a0, a1, a2, a3, a4, a5));\n\t\tvar dynCall_vijiii = (Module['dynCall_vijiii'] = (a0, a1, a2, a3, a4, a5, a6) =>\n\t\t\t(dynCall_vijiii = Module['dynCall_vijiii'] = wasmExports['cb'])(a0, a1, a2, a3, a4, a5, a6));\n\t\tvar dynCall_vijii = (Module['dynCall_vijii'] = (a0, a1, a2, a3, a4, a5) =>\n\t\t\t(dynCall_vijii = Module['dynCall_vijii'] = wasmExports['db'])(a0, a1, a2, a3, a4, a5));\n\t\tvar dynCall_viiji = (Module['dynCall_viiji'] = (a0, a1, a2, a3, a4, a5) =>\n\t\t\t(dynCall_viiji = Module['dynCall_viiji'] = wasmExports['eb'])(a0, a1, a2, a3, a4, a5));\n\t\tvar dynCall_jiji = (Module['dynCall_jiji'] = (a0, a1, a2, a3, a4) =>\n\t\t\t(dynCall_jiji = Module['dynCall_jiji'] = wasmExports['fb'])(a0, a1, a2, a3, a4));\n\t\tvar dynCall_jiiii = (Module['dynCall_jiiii'] = (a0, a1, a2, a3, a4) =>\n\t\t\t(dynCall_jiiii = Module['dynCall_jiiii'] = wasmExports['gb'])(a0, a1, a2, a3, a4));\n\t\tvar dynCall_iiiiij = (Module['dynCall_iiiiij'] = (a0, a1, a2, a3, a4, a5, a6) =>\n\t\t\t(dynCall_iiiiij = Module['dynCall_iiiiij'] = wasmExports['hb'])(a0, a1, a2, a3, a4, a5, a6));\n\t\tvar dynCall_iiiiijj = (Module['dynCall_iiiiijj'] = (a0, a1, a2, a3, a4, a5, a6, a7, a8) =>\n\t\t\t(dynCall_iiiiijj = Module['dynCall_iiiiijj'] = wasmExports['ib'])(a0, a1, a2, a3, a4, a5, a6, a7, a8));\n\t\tvar dynCall_iiiiiijj = (Module['dynCall_iiiiiijj'] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) =>\n\t\t\t(dynCall_iiiiiijj = Module['dynCall_iiiiiijj'] = wasmExports['jb'])(\n\t\t\t\ta0,\n\t\t\t\ta1,\n\t\t\t\ta2,\n\t\t\t\ta3,\n\t\t\t\ta4,\n\t\t\t\ta5,\n\t\t\t\ta6,\n\t\t\t\ta7,\n\t\t\t\ta8,\n\t\t\t\ta9\n\t\t\t));\n\t\tfunction invoke_viii(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iii(index, a1, a2) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_diiiii(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_vi(index, a1) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_ii(index, a1) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_diii(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_vii(index, a1, a2) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiii(index, a1, a2, a3, a4) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iiiii(index, a1, a2, a3, a4) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3, a4);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iiii(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiffi(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viififi(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_v(index) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)();\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viif(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iiiiii(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiii(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiii(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiif(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiiiiiiiiiiiiiii(\n\t\t\tindex,\n\t\t\ta1,\n\t\t\ta2,\n\t\t\ta3,\n\t\t\ta4,\n\t\t\ta5,\n\t\t\ta6,\n\t\t\ta7,\n\t\t\ta8,\n\t\t\ta9,\n\t\t\ta10,\n\t\t\ta11,\n\t\t\ta12,\n\t\t\ta13,\n\t\t\ta14,\n\t\t\ta15,\n\t\t\ta16,\n\t\t\ta17,\n\t\t\ta18\n\t\t) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(\n\t\t\t\t\ta1,\n\t\t\t\t\ta2,\n\t\t\t\t\ta3,\n\t\t\t\t\ta4,\n\t\t\t\t\ta5,\n\t\t\t\t\ta6,\n\t\t\t\t\ta7,\n\t\t\t\t\ta8,\n\t\t\t\t\ta9,\n\t\t\t\t\ta10,\n\t\t\t\t\ta11,\n\t\t\t\t\ta12,\n\t\t\t\t\ta13,\n\t\t\t\t\ta14,\n\t\t\t\t\ta15,\n\t\t\t\t\ta16,\n\t\t\t\t\ta17,\n\t\t\t\t\ta18\n\t\t\t\t);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_i(index) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)();\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viid(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viifff(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiid(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiif(index, a1, a2, a3, a4) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_fii(index, a1, a2) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viidi(index, a1, a2, a3, a4) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viidiidid(index, a1, a2, a3, a4, a5, a6, a7, a8) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiddi(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_vidi(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iiiiiiii(index, a1, a2, a3, a4, a5, a6, a7) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_fiii(index, a1, a2, a3) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_iiiiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiiiiiiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tgetWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viijii(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tdynCall_viijii(index, a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiij(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tdynCall_viiij(index, a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_vijiii(index, a1, a2, a3, a4, a5, a6) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tdynCall_vijiii(index, a1, a2, a3, a4, a5, a6);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_vijii(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tdynCall_vijii(index, a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_viiji(index, a1, a2, a3, a4, a5) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\tdynCall_viiji(index, a1, a2, a3, a4, a5);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tfunction invoke_jiiii(index, a1, a2, a3, a4) {\n\t\t\tvar sp = stackSave();\n\t\t\ttry {\n\t\t\t\treturn dynCall_jiiii(index, a1, a2, a3, a4);\n\t\t\t} catch (e) {\n\t\t\t\tstackRestore(sp);\n\t\t\t\tif (e !== e + 0) throw e;\n\t\t\t\t_setThrew(1, 0);\n\t\t\t}\n\t\t}\n\t\tModule['addFunction'] = addFunction;\n\t\tModule['removeFunction'] = removeFunction;\n\t\tvar calledRun;\n\t\tdependenciesFulfilled = function runCaller() {\n\t\t\tif (!calledRun) run();\n\t\t\tif (!calledRun) dependenciesFulfilled = runCaller;\n\t\t};\n\t\tfunction run() {\n\t\t\tif (runDependencies > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreRun();\n\t\t\tif (runDependencies > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfunction doRun() {\n\t\t\t\tif (calledRun) return;\n\t\t\t\tcalledRun = true;\n\t\t\t\tModule['calledRun'] = true;\n\t\t\t\tif (ABORT) return;\n\t\t\t\tinitRuntime();\n\t\t\t\treadyPromiseResolve(Module);\n\t\t\t\tif (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();\n\t\t\t\tpostRun();\n\t\t\t}\n\t\t\tif (Module['setStatus']) {\n\t\t\t\tModule['setStatus']('Running...');\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\tModule['setStatus']('');\n\t\t\t\t\t}, 1);\n\t\t\t\t\tdoRun();\n\t\t\t\t}, 1);\n\t\t\t} else {\n\t\t\t\tdoRun();\n\t\t\t}\n\t\t}\n\t\tif (Module['preInit']) {\n\t\t\tif (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n\t\t\twhile (Module['preInit'].length > 0) {\n\t\t\t\tModule['preInit'].pop()();\n\t\t\t}\n\t\t}\n\t\trun();\n\n\t\treturn moduleArg.ready;\n\t};\n})();\nexport default Module;\n","import{Fragment as Q,computed as x,defineComponent as F,h as q,inject as X,nextTick as L,onMounted as $,onUnmounted as Y,provide as Z,ref as w,toRaw as v,watch as J,watchEffect as U}from\"vue\";import{Features as K,render as j,omit as W,compact as z}from'../../utils/render.js';import{useId as N}from'../../hooks/use-id.js';import{Keys as V}from'../../keyboard.js';import{calculateActiveIndex as ee,Focus as g}from'../../utils/calculate-active-index.js';import{dom as h}from'../../utils/dom.js';import{useOpenClosed as te,State as _,useOpenClosedProvider as oe}from'../../internal/open-closed.js';import{match as k}from'../../utils/match.js';import{useResolveButtonType as ne}from'../../hooks/use-resolve-button-type.js';import{useTreeWalker as ae}from'../../hooks/use-tree-walker.js';import{sortByDomNode as le}from'../../utils/focus-management.js';import{useOutsideClick as ie}from'../../hooks/use-outside-click.js';import{Hidden as ue,Features as re}from'../../internal/hidden.js';import{objectToFormEntries as de}from'../../utils/form.js';import{useControllable as se}from'../../hooks/use-controllable.js';import{useTrackedPointer as pe}from'../../hooks/use-tracked-pointer.js';function fe(n,O){return n===O}var be=(r=>(r[r.Open=0]=\"Open\",r[r.Closed=1]=\"Closed\",r))(be||{}),ve=(r=>(r[r.Single=0]=\"Single\",r[r.Multi=1]=\"Multi\",r))(ve||{}),ce=(r=>(r[r.Pointer=0]=\"Pointer\",r[r.Other=1]=\"Other\",r))(ce||{});let G=Symbol(\"ComboboxContext\");function B(n){let O=X(G,null);if(O===null){let r=new Error(`<${n} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,B),r}return O}let je=F({name:\"Combobox\",emits:{\"update:modelValue\":n=>!0},props:{as:{type:[Object,String],default:\"template\"},disabled:{type:[Boolean],default:!1},by:{type:[String,Function],default:()=>fe},modelValue:{type:[Object,String,Number,Boolean],default:void 0},defaultValue:{type:[Object,String,Number,Boolean],default:void 0},name:{type:String},nullable:{type:Boolean,default:!1},multiple:{type:[Boolean],default:!1}},inheritAttrs:!1,setup(n,{slots:O,attrs:r,emit:T}){let e=w(1),t=w(null),s=w(null),R=w(null),d=w(null),b=w({static:!1,hold:!1}),m=w([]),C=w(null),S=w(1),y=w(!1);function M(a=l=>l){let l=C.value!==null?m.value[C.value]:null,u=le(a(m.value.slice()),f=>h(f.dataRef.domRef)),i=l?u.indexOf(l):null;return i===-1&&(i=null),{options:u,activeOptionIndex:i}}let D=x(()=>n.multiple?1:0),o=x(()=>n.nullable),[c,I]=se(x(()=>n.modelValue===void 0?k(D.value,{[1]:[],[0]:void 0}):n.modelValue),a=>T(\"update:modelValue\",a),x(()=>n.defaultValue)),p={comboboxState:e,value:c,mode:D,compare(a,l){if(typeof n.by==\"string\"){let u=n.by;return(a==null?void 0:a[u])===(l==null?void 0:l[u])}return n.by(a,l)},defaultValue:x(()=>n.defaultValue),nullable:o,inputRef:s,labelRef:t,buttonRef:R,optionsRef:d,disabled:x(()=>n.disabled),options:m,change(a){I(a)},activeOptionIndex:x(()=>{if(y.value&&C.value===null&&m.value.length>0){let a=m.value.findIndex(l=>!l.dataRef.disabled);if(a!==-1)return a}return C.value}),activationTrigger:S,optionsPropsRef:b,closeCombobox(){y.value=!1,!n.disabled&&e.value!==1&&(e.value=1,C.value=null)},openCombobox(){if(y.value=!0,n.disabled||e.value===0)return;let a=m.value.findIndex(l=>{let u=v(l.dataRef.value);return k(D.value,{[0]:()=>p.compare(v(p.value.value),v(u)),[1]:()=>v(p.value.value).some(f=>p.compare(v(f),v(u)))})});a!==-1&&(C.value=a),e.value=0},goToOption(a,l,u){if(y.value=!1,n.disabled||d.value&&!b.value.static&&e.value===1)return;let i=M();if(i.activeOptionIndex===null){let P=i.options.findIndex(H=>!H.dataRef.disabled);P!==-1&&(i.activeOptionIndex=P)}let f=ee(a===g.Specific?{focus:g.Specific,id:l}:{focus:a},{resolveItems:()=>i.options,resolveActiveIndex:()=>i.activeOptionIndex,resolveId:P=>P.id,resolveDisabled:P=>P.dataRef.disabled});C.value=f,S.value=u!=null?u:1,m.value=i.options},selectOption(a){let l=m.value.find(i=>i.id===a);if(!l)return;let{dataRef:u}=l;I(k(D.value,{[0]:()=>u.value,[1]:()=>{let i=v(p.value.value).slice(),f=v(u.value),P=i.findIndex(H=>p.compare(f,v(H)));return P===-1?i.push(f):i.splice(P,1),i}}))},selectActiveOption(){if(p.activeOptionIndex.value===null)return;let{dataRef:a,id:l}=m.value[p.activeOptionIndex.value];I(k(D.value,{[0]:()=>a.value,[1]:()=>{let u=v(p.value.value).slice(),i=v(a.value),f=u.findIndex(P=>p.compare(i,v(P)));return f===-1?u.push(i):u.splice(f,1),u}})),p.goToOption(g.Specific,l)},registerOption(a,l){let u={id:a,dataRef:l},i=M(f=>[...f,u]);if(C.value===null){let f=l.value.value;k(D.value,{[0]:()=>p.compare(v(p.value.value),v(f)),[1]:()=>v(p.value.value).some(H=>p.compare(v(H),v(f)))})&&(i.activeOptionIndex=i.options.indexOf(u))}m.value=i.options,C.value=i.activeOptionIndex,S.value=1},unregisterOption(a){let l=M(u=>{let i=u.findIndex(f=>f.id===a);return i!==-1&&u.splice(i,1),u});m.value=l.options,C.value=l.activeOptionIndex,S.value=1}};ie([s,R,d],()=>p.closeCombobox(),x(()=>e.value===0)),Z(G,p),oe(x(()=>k(e.value,{[0]:_.Open,[1]:_.Closed})));let E=x(()=>p.activeOptionIndex.value===null?null:m.value[p.activeOptionIndex.value].dataRef.value),A=x(()=>{var a;return(a=h(s))==null?void 0:a.closest(\"form\")});return $(()=>{J([A],()=>{if(!A.value||n.defaultValue===void 0)return;function a(){p.change(n.defaultValue)}return A.value.addEventListener(\"reset\",a),()=>{var l;(l=A.value)==null||l.removeEventListener(\"reset\",a)}},{immediate:!0})}),()=>{let{name:a,disabled:l,...u}=n,i={open:e.value===0,disabled:l,activeIndex:p.activeOptionIndex.value,activeOption:E.value,value:c.value};return q(Q,[...a!=null&&c.value!=null?de({[a]:c.value}).map(([f,P])=>q(ue,z({features:re.Hidden,key:f,as:\"input\",type:\"hidden\",hidden:!0,readOnly:!0,name:f,value:P}))):[],j({theirProps:{...r,...W(u,[\"modelValue\",\"defaultValue\",\"nullable\",\"multiple\",\"onUpdate:modelValue\",\"by\"])},ourProps:{},slot:i,slots:O,attrs:r,name:\"Combobox\"})])}}}),Be=F({name:\"ComboboxLabel\",props:{as:{type:[Object,String],default:\"label\"},id:{type:String,default:()=>`headlessui-combobox-label-${N()}`}},setup(n,{attrs:O,slots:r}){let T=B(\"ComboboxLabel\");function e(){var t;(t=h(T.inputRef))==null||t.focus({preventScroll:!0})}return()=>{let t={open:T.comboboxState.value===0,disabled:T.disabled.value},{id:s,...R}=n,d={id:s,ref:T.labelRef,onClick:e};return j({ourProps:d,theirProps:R,slot:t,attrs:O,slots:r,name:\"ComboboxLabel\"})}}}),He=F({name:\"ComboboxButton\",props:{as:{type:[Object,String],default:\"button\"},id:{type:String,default:()=>`headlessui-combobox-button-${N()}`}},setup(n,{attrs:O,slots:r,expose:T}){let e=B(\"ComboboxButton\");T({el:e.buttonRef,$el:e.buttonRef});function t(d){e.disabled.value||(e.comboboxState.value===0?e.closeCombobox():(d.preventDefault(),e.openCombobox()),L(()=>{var b;return(b=h(e.inputRef))==null?void 0:b.focus({preventScroll:!0})}))}function s(d){switch(d.key){case V.ArrowDown:d.preventDefault(),d.stopPropagation(),e.comboboxState.value===1&&e.openCombobox(),L(()=>{var b;return(b=e.inputRef.value)==null?void 0:b.focus({preventScroll:!0})});return;case V.ArrowUp:d.preventDefault(),d.stopPropagation(),e.comboboxState.value===1&&(e.openCombobox(),L(()=>{e.value.value||e.goToOption(g.Last)})),L(()=>{var b;return(b=e.inputRef.value)==null?void 0:b.focus({preventScroll:!0})});return;case V.Escape:if(e.comboboxState.value!==0)return;d.preventDefault(),e.optionsRef.value&&!e.optionsPropsRef.value.static&&d.stopPropagation(),e.closeCombobox(),L(()=>{var b;return(b=e.inputRef.value)==null?void 0:b.focus({preventScroll:!0})});return}}let R=ne(x(()=>({as:n.as,type:O.type})),e.buttonRef);return()=>{var S,y;let d={open:e.comboboxState.value===0,disabled:e.disabled.value,value:e.value.value},{id:b,...m}=n,C={ref:e.buttonRef,id:b,type:R.value,tabindex:\"-1\",\"aria-haspopup\":\"listbox\",\"aria-controls\":(S=h(e.optionsRef))==null?void 0:S.id,\"aria-expanded\":e.disabled.value?void 0:e.comboboxState.value===0,\"aria-labelledby\":e.labelRef.value?[(y=h(e.labelRef))==null?void 0:y.id,b].join(\" \"):void 0,disabled:e.disabled.value===!0?!0:void 0,onKeydown:s,onClick:t};return j({ourProps:C,theirProps:m,slot:d,attrs:O,slots:r,name:\"ComboboxButton\"})}}}),Ne=F({name:\"ComboboxInput\",props:{as:{type:[Object,String],default:\"input\"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},displayValue:{type:Function},defaultValue:{type:String,default:void 0},id:{type:String,default:()=>`headlessui-combobox-input-${N()}`}},emits:{change:n=>!0},setup(n,{emit:O,attrs:r,slots:T,expose:e}){let t=B(\"ComboboxInput\"),s={value:!1};e({el:t.inputRef,$el:t.inputRef});let R=x(()=>{var c;let o=t.value.value;return h(t.inputRef)?typeof n.displayValue!=\"undefined\"&&o!==void 0?(c=n.displayValue(o))!=null?c:\"\":typeof o==\"string\"?o:\"\":\"\"});$(()=>{J([R,t.comboboxState],([o,c],[I,p])=>{if(s.value)return;let E=h(t.inputRef);!E||(p===0&&c===1||o!==I)&&(E.value=o)},{immediate:!0})});let d=w(!1);function b(){d.value=!0}function m(){setTimeout(()=>{d.value=!1})}function C(o){switch(s.value=!0,o.key){case V.Backspace:case V.Delete:if(t.mode.value!==0||!t.nullable.value)return;let c=o.currentTarget;requestAnimationFrame(()=>{if(c.value===\"\"){t.change(null);let I=h(t.optionsRef);I&&(I.scrollTop=0),t.goToOption(g.Nothing)}});break;case V.Enter:if(s.value=!1,t.comboboxState.value!==0||d.value)return;if(o.preventDefault(),o.stopPropagation(),t.activeOptionIndex.value===null){t.closeCombobox();return}t.selectActiveOption(),t.mode.value===0&&t.closeCombobox();break;case V.ArrowDown:return s.value=!1,o.preventDefault(),o.stopPropagation(),k(t.comboboxState.value,{[0]:()=>t.goToOption(g.Next),[1]:()=>t.openCombobox()});case V.ArrowUp:return s.value=!1,o.preventDefault(),o.stopPropagation(),k(t.comboboxState.value,{[0]:()=>t.goToOption(g.Previous),[1]:()=>{t.openCombobox(),L(()=>{t.value.value||t.goToOption(g.Last)})}});case V.Home:if(o.shiftKey)break;return s.value=!1,o.preventDefault(),o.stopPropagation(),t.goToOption(g.First);case V.PageUp:return s.value=!1,o.preventDefault(),o.stopPropagation(),t.goToOption(g.First);case V.End:if(o.shiftKey)break;return s.value=!1,o.preventDefault(),o.stopPropagation(),t.goToOption(g.Last);case V.PageDown:return s.value=!1,o.preventDefault(),o.stopPropagation(),t.goToOption(g.Last);case V.Escape:if(s.value=!1,t.comboboxState.value!==0)return;o.preventDefault(),t.optionsRef.value&&!t.optionsPropsRef.value.static&&o.stopPropagation(),t.closeCombobox();break;case V.Tab:if(s.value=!1,t.comboboxState.value!==0)return;t.mode.value===0&&t.selectActiveOption(),t.closeCombobox();break}}function S(o){O(\"change\",o)}function y(o){t.openCombobox(),O(\"change\",o)}function M(){s.value=!1}let D=x(()=>{var o,c,I,p;return(p=(I=(c=n.defaultValue)!=null?c:t.defaultValue.value!==void 0?(o=n.displayValue)==null?void 0:o.call(n,t.defaultValue.value):null)!=null?I:t.defaultValue.value)!=null?p:\"\"});return()=>{var A,a,l,u,i,f;let o={open:t.comboboxState.value===0},{id:c,displayValue:I,...p}=n,E={\"aria-controls\":(A=t.optionsRef.value)==null?void 0:A.id,\"aria-expanded\":t.disabled.value?void 0:t.comboboxState.value===0,\"aria-activedescendant\":t.activeOptionIndex.value===null||(a=t.options.value[t.activeOptionIndex.value])==null?void 0:a.id,\"aria-multiselectable\":t.mode.value===1?!0:void 0,\"aria-labelledby\":(i=(l=h(t.labelRef))==null?void 0:l.id)!=null?i:(u=h(t.buttonRef))==null?void 0:u.id,id:c,onCompositionstart:b,onCompositionend:m,onKeydown:C,onChange:S,onInput:y,onBlur:M,role:\"combobox\",type:(f=r.type)!=null?f:\"text\",tabIndex:0,ref:t.inputRef,defaultValue:D.value};return j({ourProps:E,theirProps:p,slot:o,attrs:r,slots:T,features:K.RenderStrategy|K.Static,name:\"ComboboxInput\"})}}}),Ke=F({name:\"ComboboxOptions\",props:{as:{type:[Object,String],default:\"ul\"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},hold:{type:[Boolean],default:!1}},setup(n,{attrs:O,slots:r,expose:T}){let e=B(\"ComboboxOptions\"),t=`headlessui-combobox-options-${N()}`;T({el:e.optionsRef,$el:e.optionsRef}),U(()=>{e.optionsPropsRef.value.static=n.static}),U(()=>{e.optionsPropsRef.value.hold=n.hold});let s=te(),R=x(()=>s!==null?s.value===_.Open:e.comboboxState.value===0);return ae({container:x(()=>h(e.optionsRef)),enabled:x(()=>e.comboboxState.value===0),accept(d){return d.getAttribute(\"role\")===\"option\"?NodeFilter.FILTER_REJECT:d.hasAttribute(\"role\")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(d){d.setAttribute(\"role\",\"none\")}}),()=>{var C,S,y,M;let d={open:e.comboboxState.value===0},b={\"aria-activedescendant\":e.activeOptionIndex.value===null||(C=e.options.value[e.activeOptionIndex.value])==null?void 0:C.id,\"aria-labelledby\":(M=(S=h(e.labelRef))==null?void 0:S.id)!=null?M:(y=h(e.buttonRef))==null?void 0:y.id,id:t,ref:e.optionsRef,role:\"listbox\"},m=W(n,[\"hold\"]);return j({ourProps:b,theirProps:m,slot:d,attrs:O,slots:r,features:K.RenderStrategy|K.Static,visible:R.value,name:\"ComboboxOptions\"})}}}),$e=F({name:\"ComboboxOption\",props:{as:{type:[Object,String],default:\"li\"},value:{type:[Object,String,Number,Boolean]},disabled:{type:Boolean,default:!1}},setup(n,{slots:O,attrs:r,expose:T}){let e=B(\"ComboboxOption\"),t=`headlessui-combobox-option-${N()}`,s=w(null);T({el:s,$el:s});let R=x(()=>e.activeOptionIndex.value!==null?e.options.value[e.activeOptionIndex.value].id===t:!1),d=x(()=>k(e.mode.value,{[0]:()=>e.compare(v(e.value.value),v(n.value)),[1]:()=>v(e.value.value).some(o=>e.compare(v(o),v(n.value)))})),b=x(()=>({disabled:n.disabled,value:n.value,domRef:s}));$(()=>e.registerOption(t,b)),Y(()=>e.unregisterOption(t)),U(()=>{e.comboboxState.value===0&&(!R.value||e.activationTrigger.value!==0&&L(()=>{var o,c;return(c=(o=h(s))==null?void 0:o.scrollIntoView)==null?void 0:c.call(o,{block:\"nearest\"})}))});function m(o){if(n.disabled)return o.preventDefault();e.selectOption(t),e.mode.value===0&&e.closeCombobox()}function C(){if(n.disabled)return e.goToOption(g.Nothing);e.goToOption(g.Specific,t)}let S=pe();function y(o){S.update(o)}function M(o){!S.wasMoved(o)||n.disabled||R.value||e.goToOption(g.Specific,t,0)}function D(o){!S.wasMoved(o)||n.disabled||!R.value||e.optionsPropsRef.value.hold||e.goToOption(g.Nothing)}return()=>{let{disabled:o}=n,c={active:R.value,selected:d.value,disabled:o},I={id:t,ref:s,role:\"option\",tabIndex:o===!0?void 0:-1,\"aria-disabled\":o===!0?!0:void 0,\"aria-selected\":d.value,disabled:void 0,onClick:m,onFocus:C,onPointerenter:y,onMouseenter:y,onPointermove:M,onMousemove:M,onPointerleave:D,onMouseleave:D};return j({ourProps:I,theirProps:n,slot:c,attrs:r,slots:O,name:\"ComboboxOption\"})}}});export{je as Combobox,He as ComboboxButton,Ne as ComboboxInput,Be as ComboboxLabel,$e as ComboboxOption,Ke as ComboboxOptions};\n","import{computed as m,defineComponent as x,inject as R,onMounted as v,onUnmounted as D,provide as j,ref as u,unref as y}from\"vue\";import{useId as C}from'../../hooks/use-id.js';import{render as h}from'../../utils/render.js';let p=Symbol(\"DescriptionContext\");function b(){let t=R(p,null);if(t===null)throw new Error(\"Missing parent\");return t}function M({slot:t=u({}),name:i=\"Description\",props:o={}}={}){let e=u([]);function s(n){return e.value.push(n),()=>{let r=e.value.indexOf(n);r!==-1&&e.value.splice(r,1)}}return j(p,{register:s,slot:t,name:i,props:o}),m(()=>e.value.length>0?e.value.join(\" \"):void 0)}let E=x({name:\"Description\",props:{as:{type:[Object,String],default:\"p\"},id:{type:String,default:()=>`headlessui-description-${C()}`}},setup(t,{attrs:i,slots:o}){let e=b();return v(()=>D(e.register(t.id))),()=>{let{name:s=\"Description\",slot:n=u({}),props:r={}}=e,{id:d,...l}=t,c={...Object.entries(r).reduce((f,[a,g])=>Object.assign(f,{[a]:y(g)}),{}),id:d};return h({ourProps:c,theirProps:l,slot:n.value,attrs:i,slots:o,name:s})}}});export{E as Description,M as useDescriptions};\n","import{watchEffect as i}from\"vue\";import{isServer as r}from'../utils/ssr.js';function w(e,n,t){r||i(o=>{window.addEventListener(e,n,t),o(()=>window.removeEventListener(e,n,t))})}export{w as useWindowEvent};\n","import{ref as a}from\"vue\";import{useWindowEvent as t}from'./use-window-event.js';var d=(r=>(r[r.Forwards=0]=\"Forwards\",r[r.Backwards=1]=\"Backwards\",r))(d||{});function n(){let o=a(0);return t(\"keydown\",e=>{e.key===\"Tab\"&&(o.value=e.shiftKey?1:0)}),o}export{d as Direction,n as useTabDirection};\n","import{watchEffect as i}from\"vue\";import{isServer as a}from'../utils/ssr.js';function E(n,e,o,r){a||i(t=>{n=n!=null?n:window,n.addEventListener(e,o,r),t(()=>n.removeEventListener(e,o,r))})}export{E as useEventListener};\n","function t(e){typeof queueMicrotask==\"function\"?queueMicrotask(e):Promise.resolve().then(e).catch(o=>setTimeout(()=>{throw o}))}export{t as microTask};\n","import{computed as F,defineComponent as N,h as R,onMounted as w,onUnmounted as y,ref as E,watch as g,Fragment as A}from\"vue\";import{render as O}from'../../utils/render.js';import{Hidden as h,Features as k}from'../../internal/hidden.js';import{dom as H}from'../../utils/dom.js';import{focusIn as M,Focus as T,focusElement as v,FocusResult as I}from'../../utils/focus-management.js';import{match as D}from'../../utils/match.js';import{useTabDirection as j,Direction as b}from'../../hooks/use-tab-direction.js';import{getOwnerDocument as K}from'../../utils/owner.js';import{useEventListener as C}from'../../hooks/use-event-listener.js';import{microTask as x}from'../../utils/micro-task.js';var P=(e=>(e[e.None=1]=\"None\",e[e.InitialFocus=2]=\"InitialFocus\",e[e.TabLock=4]=\"TabLock\",e[e.FocusLock=8]=\"FocusLock\",e[e.RestoreFocus=16]=\"RestoreFocus\",e[e.All=30]=\"All\",e))(P||{});let le=Object.assign(N({name:\"FocusTrap\",props:{as:{type:[Object,String],default:\"div\"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:Object,default:E(new Set)}},inheritAttrs:!1,setup(l,{attrs:i,slots:n,expose:r}){let t=E(null);r({el:t,$el:t});let o=F(()=>K(t));U({ownerDocument:o},F(()=>Boolean(l.features&16)));let e=_({ownerDocument:o,container:t,initialFocus:F(()=>l.initialFocus)},F(()=>Boolean(l.features&2)));q({ownerDocument:o,container:t,containers:l.containers,previousActiveElement:e},F(()=>Boolean(l.features&8)));let s=j();function c(a){let m=H(t);if(!m)return;(p=>p())(()=>{D(s.value,{[b.Forwards]:()=>M(m,T.First,{skipElements:[a.relatedTarget]}),[b.Backwards]:()=>M(m,T.Last,{skipElements:[a.relatedTarget]})})})}let u=E(!1);function f(a){a.key===\"Tab\"&&(u.value=!0,requestAnimationFrame(()=>{u.value=!1}))}function L(a){var p;let m=new Set((p=l.containers)==null?void 0:p.value);m.add(t);let d=a.relatedTarget;!d||d.dataset.headlessuiFocusGuard!==\"true\"&&(B(m,d)||(u.value?M(H(t),D(s.value,{[b.Forwards]:()=>T.Next,[b.Backwards]:()=>T.Previous})|T.WrapAround,{relativeTo:a.target}):a.target instanceof HTMLElement&&v(a.target)))}return()=>{let a={},m={ref:t,onKeydown:f,onFocusout:L},{features:d,initialFocus:p,containers:G,...S}=l;return R(A,[Boolean(d&4)&&R(h,{as:\"button\",type:\"button\",\"data-headlessui-focus-guard\":!0,onFocus:c,features:k.Focusable}),O({ourProps:m,theirProps:{...i,...S},slot:a,attrs:i,slots:n,name:\"FocusTrap\"}),Boolean(d&4)&&R(h,{as:\"button\",type:\"button\",\"data-headlessui-focus-guard\":!0,onFocus:c,features:k.Focusable})])}}}),{features:P});function U({ownerDocument:l},i){let n=E(null);function r(){var o;n.value||(n.value=(o=l.value)==null?void 0:o.activeElement)}function t(){!n.value||(v(n.value),n.value=null)}w(()=>{g(i,(o,e)=>{o!==e&&(o?r():t())},{immediate:!0})}),y(t)}function _({ownerDocument:l,container:i,initialFocus:n},r){let t=E(null),o=E(!1);return w(()=>o.value=!0),y(()=>o.value=!1),w(()=>{g([i,n,r],(e,s)=>{if(e.every((u,f)=>(s==null?void 0:s[f])===u)||!r.value)return;let c=H(i);!c||x(()=>{var L,a;if(!o.value)return;let u=H(n),f=(L=l.value)==null?void 0:L.activeElement;if(u){if(u===f){t.value=f;return}}else if(c.contains(f)){t.value=f;return}u?v(u):M(c,T.First|T.NoScroll)===I.Error&&console.warn(\"There are no focusable elements inside the <FocusTrap />\"),t.value=(a=l.value)==null?void 0:a.activeElement})},{immediate:!0,flush:\"post\"})}),t}function q({ownerDocument:l,container:i,containers:n,previousActiveElement:r},t){var o;C((o=l.value)==null?void 0:o.defaultView,\"focus\",e=>{if(!t.value)return;let s=new Set(n==null?void 0:n.value);s.add(i);let c=r.value;if(!c)return;let u=e.target;u&&u instanceof HTMLElement?B(s,u)?(r.value=u,v(u)):(e.preventDefault(),e.stopPropagation(),v(c)):v(r.value)},!0)}function B(l,i){var n;for(let r of l)if((n=r.value)!=null&&n.contains(i))return!0;return!1}export{le as FocusTrap};\n","import{ref as E,watchEffect as m}from\"vue\";import{getOwnerDocument as b}from'../utils/owner.js';let l=\"body > *\",i=new Set,r=new Map;function u(t){t.setAttribute(\"aria-hidden\",\"true\"),t.inert=!0}function s(t){let n=r.get(t);!n||(n[\"aria-hidden\"]===null?t.removeAttribute(\"aria-hidden\"):t.setAttribute(\"aria-hidden\",n[\"aria-hidden\"]),t.inert=n.inert)}function g(t,n=E(!0)){m(d=>{if(!n.value||!t.value)return;let a=t.value,o=b(a);if(!!o){i.add(a);for(let e of r.keys())e.contains(a)&&(s(e),r.delete(e));o.querySelectorAll(l).forEach(e=>{if(e instanceof HTMLElement){for(let f of i)if(e.contains(f))return;i.size===1&&(r.set(e,{\"aria-hidden\":e.getAttribute(\"aria-hidden\"),inert:e.inert}),u(e))}}),d(()=>{if(i.delete(a),i.size>0)o.querySelectorAll(l).forEach(e=>{if(e instanceof HTMLElement&&!r.has(e)){for(let f of i)if(e.contains(f))return;r.set(e,{\"aria-hidden\":e.getAttribute(\"aria-hidden\"),inert:e.inert}),u(e)}});else for(let e of r.keys())s(e),r.delete(e)})}})}export{g as useInertOthers};\n","import{defineComponent as l,inject as a,provide as c}from\"vue\";import{render as p}from'../utils/render.js';let e=Symbol(\"ForcePortalRootContext\");function u(){return a(e,!1)}let P=l({name:\"ForcePortalRoot\",props:{as:{type:[Object,String],default:\"template\"},force:{type:Boolean,default:!1}},setup(o,{slots:t,attrs:r}){return c(e,o.force),()=>{let{force:f,...n}=o;return p({theirProps:n,ourProps:{},slot:{},slots:t,attrs:r,name:\"ForcePortalRoot\"})}}});export{P as ForcePortalRoot,u as usePortalRoot};\n","import{Teleport as P,defineComponent as s,h,inject as y,onUnmounted as T,provide as E,reactive as w,ref as d,watchEffect as C,computed as b}from\"vue\";import{render as f}from'../../utils/render.js';import{usePortalRoot as j}from'../../internal/portal-force-root.js';import{getOwnerDocument as v}from'../../utils/owner.js';function c(t){let r=v(t);if(!r){if(t===null)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${t}`)}let o=r.getElementById(\"headlessui-portal-root\");if(o)return o;let e=r.createElement(\"div\");return e.setAttribute(\"id\",\"headlessui-portal-root\"),r.body.appendChild(e)}let R=s({name:\"Portal\",props:{as:{type:[Object,String],default:\"div\"}},setup(t,{slots:r,attrs:o}){let e=d(null),p=b(()=>v(e)),n=j(),u=y(g,null),l=d(n===!0||u==null?c(e.value):u.resolveTarget());return C(()=>{n||u!=null&&(l.value=u.resolveTarget())}),T(()=>{var i,m;let a=(i=p.value)==null?void 0:i.getElementById(\"headlessui-portal-root\");!a||l.value===a&&l.value.children.length<=0&&((m=l.value.parentElement)==null||m.removeChild(l.value))}),()=>{if(l.value===null)return null;let a={ref:e,\"data-headlessui-portal\":\"\"};return h(P,{to:l.value},f({ourProps:a,theirProps:t,slot:{},attrs:o,slots:r,name:\"Portal\"}))}}}),g=Symbol(\"PortalGroupContext\"),L=s({name:\"PortalGroup\",props:{as:{type:[Object,String],default:\"template\"},target:{type:Object,default:null}},setup(t,{attrs:r,slots:o}){let e=w({resolveTarget(){return t.target}});return E(g,e),()=>{let{target:p,...n}=t;return f({theirProps:n,ourProps:{},slot:{},attrs:r,slots:o,name:\"PortalGroup\"})}}});export{R as Portal,L as PortalGroup};\n","import{inject as f,provide as m,onMounted as l,onUnmounted as c,watch as s}from\"vue\";let u=Symbol(\"StackContext\");var p=(e=>(e[e.Add=0]=\"Add\",e[e.Remove=1]=\"Remove\",e))(p||{});function v(){return f(u,()=>{})}function S({type:o,enabled:r,element:e,onUpdate:i}){let a=v();function t(...n){i==null||i(...n),a(...n)}l(()=>{s(r,(n,d)=>{n?t(0,o,e):d===!0&&t(1,o,e)},{immediate:!0,flush:\"sync\"})}),c(()=>{r.value&&t(1,o,e)}),m(u,t)}export{p as StackMessage,v as useStackContext,S as useStackProvider};\n","function o(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}export{o as isIOS};\n","import{computed as g,defineComponent as T,h as S,inject as _,nextTick as oe,onMounted as j,onUnmounted as ae,provide as ne,ref as y,watchEffect as q}from\"vue\";import{render as P,Features as G}from'../../utils/render.js';import{Keys as re}from'../../keyboard.js';import{useId as E}from'../../hooks/use-id.js';import{FocusTrap as C}from'../../components/focus-trap/focus-trap.js';import{useInertOthers as ie}from'../../hooks/use-inert-others.js';import{Portal as z,PortalGroup as se}from'../portal/portal.js';import{StackMessage as J,useStackProvider as ue}from'../../internal/stack-context.js';import{match as A}from'../../utils/match.js';import{ForcePortalRoot as B}from'../../internal/portal-force-root.js';import{Description as de,useDescriptions as pe}from'../description/description.js';import{dom as Q}from'../../utils/dom.js';import{useOpenClosed as fe,State as X}from'../../internal/open-closed.js';import{useOutsideClick as ce}from'../../hooks/use-outside-click.js';import{getOwnerDocument as ge}from'../../utils/owner.js';import{useEventListener as me}from'../../hooks/use-event-listener.js';import{Hidden as ve,Features as De}from'../../internal/hidden.js';import{disposables as he}from'../../utils/disposables.js';import{isIOS as Se}from'../../utils/platform.js';var ye=(t=>(t[t.Open=0]=\"Open\",t[t.Closed=1]=\"Closed\",t))(ye||{});let W=Symbol(\"DialogContext\");function R(l){let i=_(W,null);if(i===null){let t=new Error(`<${l} /> is missing a parent <Dialog /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,R),t}return i}let M=\"DC8F892D-2EBD-447C-A4C8-A03058436FF4\",Ue=T({name:\"Dialog\",inheritAttrs:!1,props:{as:{type:[Object,String],default:\"div\"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:M},initialFocus:{type:Object,default:null},id:{type:String,default:()=>`headlessui-dialog-${E()}`}},emits:{close:l=>!0},setup(l,{emit:i,attrs:t,slots:u,expose:s}){var K;let o=y(!1);j(()=>{o.value=!0});let d=y(0),D=fe(),h=g(()=>l.open===M&&D!==null?A(D.value,{[X.Open]:!0,[X.Closed]:!1}):l.open),H=y(new Set),m=y(null),V=y(null),x=g(()=>ge(m));if(s({el:m,$el:m}),!(l.open!==M||D!==null))throw new Error(\"You forgot to provide an `open` prop to the `Dialog`.\");if(typeof h.value!=\"boolean\")throw new Error(`You provided an \\`open\\` prop to the \\`Dialog\\`, but the value is not a boolean. Received: ${h.value===M?void 0:l.open}`);let c=g(()=>o.value&&h.value?0:1),Y=g(()=>c.value===0),k=g(()=>d.value>1),Z=_(W,null)!==null,ee=g(()=>k.value?\"parent\":\"leaf\");ie(m,g(()=>k.value?Y.value:!1)),ue({type:\"Dialog\",enabled:g(()=>c.value===0),element:m,onUpdate:(a,e,n)=>{if(e===\"Dialog\")return A(a,{[J.Add](){H.value.add(n),d.value+=1},[J.Remove](){H.value.delete(n),d.value-=1}})}});let te=pe({name:\"DialogDescription\",slot:g(()=>({open:h.value}))}),L=y(null),b={titleId:L,panelRef:y(null),dialogState:c,setTitleId(a){L.value!==a&&(L.value=a)},close(){i(\"close\",!1)}};ne(W,b);function I(){var e,n,v;return[...Array.from((n=(e=x.value)==null?void 0:e.querySelectorAll(\"body > *, [data-headlessui-portal]\"))!=null?n:[]).filter(r=>!(!(r instanceof HTMLElement)||r.contains(Q(V))||b.panelRef.value&&r.contains(b.panelRef.value))),(v=b.panelRef.value)!=null?v:m.value]}return ce(()=>I(),(a,e)=>{b.close(),oe(()=>e==null?void 0:e.focus())},g(()=>c.value===0&&!k.value)),me((K=x.value)==null?void 0:K.defaultView,\"keydown\",a=>{a.defaultPrevented||a.key===re.Escape&&c.value===0&&(k.value||(a.preventDefault(),a.stopPropagation(),b.close()))}),q(a=>{var U;if(c.value!==0||Z)return;let e=x.value;if(!e)return;let n=he(),v=window.pageYOffset;function r(f,p,w){let F=f.style.getPropertyValue(p);return Object.assign(f.style,{[p]:w}),n.add(()=>{Object.assign(f.style,{[p]:F})})}let O=e==null?void 0:e.documentElement,N=((U=e.defaultView)!=null?U:window).innerWidth-O.clientWidth;if(r(O,\"overflow\",\"hidden\"),N>0){let f=O.clientWidth-O.offsetWidth,p=N-f;r(O,\"paddingRight\",`${p}px`)}if(Se()){r(e.body,\"marginTop\",`-${v}px`),window.scrollTo(0,0);let f=null;n.addEventListener(e,\"click\",p=>{if(p.target instanceof HTMLElement)try{let w=p.target.closest(\"a\");if(!w)return;let{hash:F}=new URL(w.href),$=e.querySelector(F);$&&!I().some(le=>le.contains($))&&(f=$)}catch{}},!0),n.addEventListener(e,\"touchmove\",p=>{p.target instanceof HTMLElement&&!I().some(w=>w.contains(p.target))&&p.preventDefault()},{passive:!1}),n.add(()=>{window.scrollTo(0,window.pageYOffset+v),f&&f.isConnected&&(f.scrollIntoView({block:\"nearest\"}),f=null)})}a(n.dispose)}),q(a=>{if(c.value!==0)return;let e=Q(m);if(!e)return;let n=new IntersectionObserver(v=>{for(let r of v)r.boundingClientRect.x===0&&r.boundingClientRect.y===0&&r.boundingClientRect.width===0&&r.boundingClientRect.height===0&&b.close()});n.observe(e),a(()=>n.disconnect())}),()=>{let{id:a,open:e,initialFocus:n,...v}=l,r={...t,ref:m,id:a,role:\"dialog\",\"aria-modal\":c.value===0?!0:void 0,\"aria-labelledby\":L.value,\"aria-describedby\":te.value},O={open:c.value===0};return S(B,{force:!0},()=>[S(z,()=>S(se,{target:m.value},()=>S(B,{force:!1},()=>S(C,{initialFocus:n,containers:H,features:Y.value?A(ee.value,{parent:C.features.RestoreFocus,leaf:C.features.All&~C.features.FocusLock}):C.features.None},()=>P({ourProps:r,theirProps:v,slot:O,attrs:t,slots:u,visible:c.value===0,features:G.RenderStrategy|G.Static,name:\"Dialog\"}))))),S(ve,{features:De.Hidden,ref:V})])}}}),_e=T({name:\"DialogOverlay\",props:{as:{type:[Object,String],default:\"div\"},id:{type:String,default:()=>`headlessui-dialog-overlay-${E()}`}},setup(l,{attrs:i,slots:t}){let u=R(\"DialogOverlay\");function s(o){o.target===o.currentTarget&&(o.preventDefault(),o.stopPropagation(),u.close())}return()=>{let{id:o,...d}=l;return P({ourProps:{id:o,\"aria-hidden\":!0,onClick:s},theirProps:d,slot:{open:u.dialogState.value===0},attrs:i,slots:t,name:\"DialogOverlay\"})}}}),qe=T({name:\"DialogBackdrop\",props:{as:{type:[Object,String],default:\"div\"},id:{type:String,default:()=>`headlessui-dialog-backdrop-${E()}`}},inheritAttrs:!1,setup(l,{attrs:i,slots:t,expose:u}){let s=R(\"DialogBackdrop\"),o=y(null);return u({el:o,$el:o}),j(()=>{if(s.panelRef.value===null)throw new Error(\"A <DialogBackdrop /> component is being used, but a <DialogPanel /> component is missing.\")}),()=>{let{id:d,...D}=l,h={id:d,ref:o,\"aria-hidden\":!0};return S(B,{force:!0},()=>S(z,()=>P({ourProps:h,theirProps:{...i,...D},slot:{open:s.dialogState.value===0},attrs:i,slots:t,name:\"DialogBackdrop\"})))}}}),Ge=T({name:\"DialogPanel\",props:{as:{type:[Object,String],default:\"div\"},id:{type:String,default:()=>`headlessui-dialog-panel-${E()}`}},setup(l,{attrs:i,slots:t,expose:u}){let s=R(\"DialogPanel\");u({el:s.panelRef,$el:s.panelRef});function o(d){d.stopPropagation()}return()=>{let{id:d,...D}=l,h={id:d,ref:s.panelRef,onClick:o};return P({ourProps:h,theirProps:D,slot:{open:s.dialogState.value===0},attrs:i,slots:t,name:\"DialogPanel\"})}}}),ze=T({name:\"DialogTitle\",props:{as:{type:[Object,String],default:\"h2\"},id:{type:String,default:()=>`headlessui-dialog-title-${E()}`}},setup(l,{attrs:i,slots:t}){let u=R(\"DialogTitle\");return j(()=>{u.setTitleId(l.id),ae(()=>u.setTitleId(null))}),()=>{let{id:s,...o}=l;return P({ourProps:{id:s},theirProps:o,slot:{open:u.dialogState.value===0},attrs:i,slots:t,name:\"DialogTitle\"})}}}),Je=de;export{Ue as Dialog,qe as DialogBackdrop,Je as DialogDescription,_e as DialogOverlay,Ge as DialogPanel,ze as DialogTitle};\n","import{Fragment as $,computed as O,defineComponent as V,h as K,inject as Q,nextTick as C,onMounted as A,onUnmounted as z,provide as _,ref as k,toRaw as T,watch as N,watchEffect as q}from\"vue\";import{Features as H,render as I,omit as W,compact as G}from'../../utils/render.js';import{useId as F}from'../../hooks/use-id.js';import{Keys as c}from'../../keyboard.js';import{calculateActiveIndex as J,Focus as g}from'../../utils/calculate-active-index.js';import{dom as v}from'../../utils/dom.js';import{useOpenClosed as X,State as B,useOpenClosedProvider as Y}from'../../internal/open-closed.js';import{match as P}from'../../utils/match.js';import{useResolveButtonType as Z}from'../../hooks/use-resolve-button-type.js';import{FocusableMode as ee,isFocusableElement as te,sortByDomNode as oe}from'../../utils/focus-management.js';import{useOutsideClick as ie}from'../../hooks/use-outside-click.js';import{Hidden as ae,Features as ne}from'../../internal/hidden.js';import{objectToFormEntries as le}from'../../utils/form.js';import{useControllable as ue}from'../../hooks/use-controllable.js';import{useTrackedPointer as re}from'../../hooks/use-tracked-pointer.js';function se(t,b){return t===b}var de=(u=>(u[u.Open=0]=\"Open\",u[u.Closed=1]=\"Closed\",u))(de||{}),fe=(u=>(u[u.Single=0]=\"Single\",u[u.Multi=1]=\"Multi\",u))(fe||{}),pe=(u=>(u[u.Pointer=0]=\"Pointer\",u[u.Other=1]=\"Other\",u))(pe||{});function ce(t){requestAnimationFrame(()=>requestAnimationFrame(t))}let U=Symbol(\"ListboxContext\");function E(t){let b=Q(U,null);if(b===null){let u=new Error(`<${t} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(u,E),u}return b}let Ee=V({name:\"Listbox\",emits:{\"update:modelValue\":t=>!0},props:{as:{type:[Object,String],default:\"template\"},disabled:{type:[Boolean],default:!1},by:{type:[String,Function],default:()=>se},horizontal:{type:[Boolean],default:!1},modelValue:{type:[Object,String,Number,Boolean],default:void 0},defaultValue:{type:[Object,String,Number,Boolean],default:void 0},name:{type:String,optional:!0},multiple:{type:[Boolean],default:!1}},inheritAttrs:!1,setup(t,{slots:b,attrs:u,emit:L}){let e=k(1),d=k(null),m=k(null),x=k(null),f=k([]),o=k(\"\"),i=k(null),w=k(1);function R(a=l=>l){let l=i.value!==null?f.value[i.value]:null,r=oe(a(f.value.slice()),S=>v(S.dataRef.domRef)),s=l?r.indexOf(l):null;return s===-1&&(s=null),{options:r,activeOptionIndex:s}}let h=O(()=>t.multiple?1:0),[y,M]=ue(O(()=>t.modelValue===void 0?P(h.value,{[1]:[],[0]:void 0}):t.modelValue),a=>L(\"update:modelValue\",a),O(()=>t.defaultValue)),n={listboxState:e,value:y,mode:h,compare(a,l){if(typeof t.by==\"string\"){let r=t.by;return(a==null?void 0:a[r])===(l==null?void 0:l[r])}return t.by(a,l)},orientation:O(()=>t.horizontal?\"horizontal\":\"vertical\"),labelRef:d,buttonRef:m,optionsRef:x,disabled:O(()=>t.disabled),options:f,searchQuery:o,activeOptionIndex:i,activationTrigger:w,closeListbox(){t.disabled||e.value!==1&&(e.value=1,i.value=null)},openListbox(){t.disabled||e.value!==0&&(e.value=0)},goToOption(a,l,r){if(t.disabled||e.value===1)return;let s=R(),S=J(a===g.Specific?{focus:g.Specific,id:l}:{focus:a},{resolveItems:()=>s.options,resolveActiveIndex:()=>s.activeOptionIndex,resolveId:D=>D.id,resolveDisabled:D=>D.dataRef.disabled});o.value=\"\",i.value=S,w.value=r!=null?r:1,f.value=s.options},search(a){if(t.disabled||e.value===1)return;let r=o.value!==\"\"?0:1;o.value+=a.toLowerCase();let S=(i.value!==null?f.value.slice(i.value+r).concat(f.value.slice(0,i.value+r)):f.value).find(j=>j.dataRef.textValue.startsWith(o.value)&&!j.dataRef.disabled),D=S?f.value.indexOf(S):-1;D===-1||D===i.value||(i.value=D,w.value=1)},clearSearch(){t.disabled||e.value!==1&&o.value!==\"\"&&(o.value=\"\")},registerOption(a,l){let r=R(s=>[...s,{id:a,dataRef:l}]);f.value=r.options,i.value=r.activeOptionIndex},unregisterOption(a){let l=R(r=>{let s=r.findIndex(S=>S.id===a);return s!==-1&&r.splice(s,1),r});f.value=l.options,i.value=l.activeOptionIndex,w.value=1},select(a){t.disabled||M(P(h.value,{[0]:()=>a,[1]:()=>{let l=T(n.value.value).slice(),r=T(a),s=l.findIndex(S=>n.compare(r,T(S)));return s===-1?l.push(r):l.splice(s,1),l}}))}};ie([m,x],(a,l)=>{var r;n.closeListbox(),te(l,ee.Loose)||(a.preventDefault(),(r=v(m))==null||r.focus())},O(()=>e.value===0)),_(U,n),Y(O(()=>P(e.value,{[0]:B.Open,[1]:B.Closed})));let p=O(()=>{var a;return(a=v(m))==null?void 0:a.closest(\"form\")});return A(()=>{N([p],()=>{if(!p.value||t.defaultValue===void 0)return;function a(){n.select(t.defaultValue)}return p.value.addEventListener(\"reset\",a),()=>{var l;(l=p.value)==null||l.removeEventListener(\"reset\",a)}},{immediate:!0})}),()=>{let{name:a,modelValue:l,disabled:r,...s}=t,S={open:e.value===0,disabled:r,value:y.value};return K($,[...a!=null&&y.value!=null?le({[a]:y.value}).map(([D,j])=>K(ae,G({features:ne.Hidden,key:D,as:\"input\",type:\"hidden\",hidden:!0,readOnly:!0,name:D,value:j}))):[],I({ourProps:{},theirProps:{...u,...W(s,[\"defaultValue\",\"onUpdate:modelValue\",\"horizontal\",\"multiple\",\"by\"])},slot:S,slots:b,attrs:u,name:\"Listbox\"})])}}}),je=V({name:\"ListboxLabel\",props:{as:{type:[Object,String],default:\"label\"},id:{type:String,default:()=>`headlessui-listbox-label-${F()}`}},setup(t,{attrs:b,slots:u}){let L=E(\"ListboxLabel\");function e(){var d;(d=v(L.buttonRef))==null||d.focus({preventScroll:!0})}return()=>{let d={open:L.listboxState.value===0,disabled:L.disabled.value},{id:m,...x}=t,f={id:m,ref:L.labelRef,onClick:e};return I({ourProps:f,theirProps:x,slot:d,attrs:b,slots:u,name:\"ListboxLabel\"})}}}),Ae=V({name:\"ListboxButton\",props:{as:{type:[Object,String],default:\"button\"},id:{type:String,default:()=>`headlessui-listbox-button-${F()}`}},setup(t,{attrs:b,slots:u,expose:L}){let e=E(\"ListboxButton\");L({el:e.buttonRef,$el:e.buttonRef});function d(o){switch(o.key){case c.Space:case c.Enter:case c.ArrowDown:o.preventDefault(),e.openListbox(),C(()=>{var i;(i=v(e.optionsRef))==null||i.focus({preventScroll:!0}),e.value.value||e.goToOption(g.First)});break;case c.ArrowUp:o.preventDefault(),e.openListbox(),C(()=>{var i;(i=v(e.optionsRef))==null||i.focus({preventScroll:!0}),e.value.value||e.goToOption(g.Last)});break}}function m(o){switch(o.key){case c.Space:o.preventDefault();break}}function x(o){e.disabled.value||(e.listboxState.value===0?(e.closeListbox(),C(()=>{var i;return(i=v(e.buttonRef))==null?void 0:i.focus({preventScroll:!0})})):(o.preventDefault(),e.openListbox(),ce(()=>{var i;return(i=v(e.optionsRef))==null?void 0:i.focus({preventScroll:!0})})))}let f=Z(O(()=>({as:t.as,type:b.type})),e.buttonRef);return()=>{var h,y;let o={open:e.listboxState.value===0,disabled:e.disabled.value,value:e.value.value},{id:i,...w}=t,R={ref:e.buttonRef,id:i,type:f.value,\"aria-haspopup\":\"listbox\",\"aria-controls\":(h=v(e.optionsRef))==null?void 0:h.id,\"aria-expanded\":e.disabled.value?void 0:e.listboxState.value===0,\"aria-labelledby\":e.labelRef.value?[(y=v(e.labelRef))==null?void 0:y.id,i].join(\" \"):void 0,disabled:e.disabled.value===!0?!0:void 0,onKeydown:d,onKeyup:m,onClick:x};return I({ourProps:R,theirProps:w,slot:o,attrs:b,slots:u,name:\"ListboxButton\"})}}}),Fe=V({name:\"ListboxOptions\",props:{as:{type:[Object,String],default:\"ul\"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:()=>`headlessui-listbox-options-${F()}`}},setup(t,{attrs:b,slots:u,expose:L}){let e=E(\"ListboxOptions\"),d=k(null);L({el:e.optionsRef,$el:e.optionsRef});function m(o){switch(d.value&&clearTimeout(d.value),o.key){case c.Space:if(e.searchQuery.value!==\"\")return o.preventDefault(),o.stopPropagation(),e.search(o.key);case c.Enter:if(o.preventDefault(),o.stopPropagation(),e.activeOptionIndex.value!==null){let i=e.options.value[e.activeOptionIndex.value];e.select(i.dataRef.value)}e.mode.value===0&&(e.closeListbox(),C(()=>{var i;return(i=v(e.buttonRef))==null?void 0:i.focus({preventScroll:!0})}));break;case P(e.orientation.value,{vertical:c.ArrowDown,horizontal:c.ArrowRight}):return o.preventDefault(),o.stopPropagation(),e.goToOption(g.Next);case P(e.orientation.value,{vertical:c.ArrowUp,horizontal:c.ArrowLeft}):return o.preventDefault(),o.stopPropagation(),e.goToOption(g.Previous);case c.Home:case c.PageUp:return o.preventDefault(),o.stopPropagation(),e.goToOption(g.First);case c.End:case c.PageDown:return o.preventDefault(),o.stopPropagation(),e.goToOption(g.Last);case c.Escape:o.preventDefault(),o.stopPropagation(),e.closeListbox(),C(()=>{var i;return(i=v(e.buttonRef))==null?void 0:i.focus({preventScroll:!0})});break;case c.Tab:o.preventDefault(),o.stopPropagation();break;default:o.key.length===1&&(e.search(o.key),d.value=setTimeout(()=>e.clearSearch(),350));break}}let x=X(),f=O(()=>x!==null?x.value===B.Open:e.listboxState.value===0);return()=>{var h,y,M,n;let o={open:e.listboxState.value===0},{id:i,...w}=t,R={\"aria-activedescendant\":e.activeOptionIndex.value===null||(h=e.options.value[e.activeOptionIndex.value])==null?void 0:h.id,\"aria-multiselectable\":e.mode.value===1?!0:void 0,\"aria-labelledby\":(n=(y=v(e.labelRef))==null?void 0:y.id)!=null?n:(M=v(e.buttonRef))==null?void 0:M.id,\"aria-orientation\":e.orientation.value,id:i,onKeydown:m,role:\"listbox\",tabIndex:0,ref:e.optionsRef};return I({ourProps:R,theirProps:w,slot:o,attrs:b,slots:u,features:H.RenderStrategy|H.Static,visible:f.value,name:\"ListboxOptions\"})}}}),Be=V({name:\"ListboxOption\",props:{as:{type:[Object,String],default:\"li\"},value:{type:[Object,String,Number,Boolean]},disabled:{type:Boolean,default:!1},id:{type:String,default:()=>`headlessui-listbox.option-${F()}`}},setup(t,{slots:b,attrs:u,expose:L}){let e=E(\"ListboxOption\"),d=k(null);L({el:d,$el:d});let m=O(()=>e.activeOptionIndex.value!==null?e.options.value[e.activeOptionIndex.value].id===t.id:!1),x=O(()=>P(e.mode.value,{[0]:()=>e.compare(T(e.value.value),T(t.value)),[1]:()=>T(e.value.value).some(n=>e.compare(T(n),T(t.value)))})),f=O(()=>P(e.mode.value,{[1]:()=>{var p;let n=T(e.value.value);return((p=e.options.value.find(a=>n.some(l=>e.compare(T(l),T(a.dataRef.value)))))==null?void 0:p.id)===t.id},[0]:()=>x.value})),o=O(()=>({disabled:t.disabled,value:t.value,textValue:\"\",domRef:d}));A(()=>{var p,a;let n=(a=(p=v(d))==null?void 0:p.textContent)==null?void 0:a.toLowerCase().trim();n!==void 0&&(o.value.textValue=n)}),A(()=>e.registerOption(t.id,o)),z(()=>e.unregisterOption(t.id)),A(()=>{N([e.listboxState,x],()=>{e.listboxState.value===0&&(!x.value||P(e.mode.value,{[1]:()=>{f.value&&e.goToOption(g.Specific,t.id)},[0]:()=>{e.goToOption(g.Specific,t.id)}}))},{immediate:!0})}),q(()=>{e.listboxState.value===0&&(!m.value||e.activationTrigger.value!==0&&C(()=>{var n,p;return(p=(n=v(d))==null?void 0:n.scrollIntoView)==null?void 0:p.call(n,{block:\"nearest\"})}))});function i(n){if(t.disabled)return n.preventDefault();e.select(t.value),e.mode.value===0&&(e.closeListbox(),C(()=>{var p;return(p=v(e.buttonRef))==null?void 0:p.focus({preventScroll:!0})}))}function w(){if(t.disabled)return e.goToOption(g.Nothing);e.goToOption(g.Specific,t.id)}let R=re();function h(n){R.update(n)}function y(n){!R.wasMoved(n)||t.disabled||m.value||e.goToOption(g.Specific,t.id,0)}function M(n){!R.wasMoved(n)||t.disabled||!m.value||e.goToOption(g.Nothing)}return()=>{let{disabled:n}=t,p={active:m.value,selected:x.value,disabled:n},{id:a,value:l,disabled:r,...s}=t,S={id:a,ref:d,role:\"option\",tabIndex:n===!0?void 0:-1,\"aria-disabled\":n===!0?!0:void 0,\"aria-selected\":x.value,disabled:void 0,onClick:i,onFocus:w,onPointerenter:h,onMouseenter:h,onPointermove:y,onMousemove:y,onPointerleave:M,onMouseleave:M};return I({ourProps:S,theirProps:s,slot:p,attrs:u,slots:b,name:\"ListboxOption\"})}}});export{Ee as Listbox,Ae as ListboxButton,je as ListboxLabel,Be as ListboxOption,Fe as ListboxOptions};\n","function l(r){let e={called:!1};return(...t)=>{if(!e.called)return e.called=!0,r(...t)}}export{l as once};\n","import{once as f}from'../../../utils/once.js';import{disposables as p}from'../../../utils/disposables.js';function m(e,...t){e&&t.length>0&&e.classList.add(...t)}function d(e,...t){e&&t.length>0&&e.classList.remove(...t)}var g=(i=>(i.Finished=\"finished\",i.Cancelled=\"cancelled\",i))(g||{});function F(e,t){let i=p();if(!e)return i.dispose;let{transitionDuration:n,transitionDelay:a}=getComputedStyle(e),[l,s]=[n,a].map(o=>{let[u=0]=o.split(\",\").filter(Boolean).map(r=>r.includes(\"ms\")?parseFloat(r):parseFloat(r)*1e3).sort((r,c)=>c-r);return u});return l!==0?i.setTimeout(()=>t(\"finished\"),l+s):t(\"finished\"),i.add(()=>t(\"cancelled\")),i.dispose}function L(e,t,i,n,a,l){let s=p(),o=l!==void 0?f(l):()=>{};return d(e,...a),m(e,...t,...i),s.nextFrame(()=>{d(e,...i),m(e,...n),s.add(F(e,u=>(d(e,...n,...t),m(e,...a),o(u))))}),s.add(()=>d(e,...t,...i,...n,...a)),s.add(()=>o(\"cancelled\")),s.dispose}export{g as Reason,L as transition};\n","import{computed as b,defineComponent as A,h as D,inject as L,onMounted as h,onUnmounted as I,provide as H,ref as T,watch as X,watchEffect as y}from\"vue\";import{useId as Y}from'../../hooks/use-id.js';import{match as E}from'../../utils/match.js';import{Features as Z,omit as ee,render as P,RenderStrategy as f}from'../../utils/render.js';import{Reason as j,transition as M}from'./utils/transition.js';import{dom as U}from'../../utils/dom.js';import{useOpenClosedProvider as te,State as V,useOpenClosed as ne,hasOpenClosed as re}from'../../internal/open-closed.js';function d(e=\"\"){return e.split(\" \").filter(t=>t.trim().length>1)}let B=Symbol(\"TransitionContext\");var ae=(a=>(a.Visible=\"visible\",a.Hidden=\"hidden\",a))(ae||{});function le(){return L(B,null)!==null}function ie(){let e=L(B,null);if(e===null)throw new Error(\"A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.\");return e}function se(){let e=L(F,null);if(e===null)throw new Error(\"A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.\");return e}let F=Symbol(\"NestingContext\");function w(e){return\"children\"in e?w(e.children):e.value.filter(({state:t})=>t===\"visible\").length>0}function K(e){let t=T([]),a=T(!1);h(()=>a.value=!0),I(()=>a.value=!1);function s(r,n=f.Hidden){let l=t.value.findIndex(({id:i})=>i===r);l!==-1&&(E(n,{[f.Unmount](){t.value.splice(l,1)},[f.Hidden](){t.value[l].state=\"hidden\"}}),!w(t)&&a.value&&(e==null||e()))}function v(r){let n=t.value.find(({id:l})=>l===r);return n?n.state!==\"visible\"&&(n.state=\"visible\"):t.value.push({id:r,state:\"visible\"}),()=>s(r,f.Unmount)}return{children:t,register:v,unregister:s}}let _=Z.RenderStrategy,oe=A({props:{as:{type:[Object,String],default:\"div\"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:\"\"},enterFrom:{type:[String],default:\"\"},enterTo:{type:[String],default:\"\"},entered:{type:[String],default:\"\"},leave:{type:[String],default:\"\"},leaveFrom:{type:[String],default:\"\"},leaveTo:{type:[String],default:\"\"}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:a,slots:s,expose:v}){if(!le()&&re())return()=>D(fe,{...e,onBeforeEnter:()=>t(\"beforeEnter\"),onAfterEnter:()=>t(\"afterEnter\"),onBeforeLeave:()=>t(\"beforeLeave\"),onAfterLeave:()=>t(\"afterLeave\")},s);let r=T(null),n=T(\"visible\"),l=b(()=>e.unmount?f.Unmount:f.Hidden);v({el:r,$el:r});let{show:i,appear:x}=ie(),{register:g,unregister:p}=se(),R={value:!0},m=Y(),S={value:!1},N=K(()=>{S.value||(n.value=\"hidden\",p(m),t(\"afterLeave\"))});h(()=>{let o=g(m);I(o)}),y(()=>{if(l.value===f.Hidden&&!!m){if(i&&n.value!==\"visible\"){n.value=\"visible\";return}E(n.value,{[\"hidden\"]:()=>p(m),[\"visible\"]:()=>g(m)})}});let k=d(e.enter),$=d(e.enterFrom),q=d(e.enterTo),O=d(e.entered),z=d(e.leave),G=d(e.leaveFrom),J=d(e.leaveTo);h(()=>{y(()=>{if(n.value===\"visible\"){let o=U(r);if(o instanceof Comment&&o.data===\"\")throw new Error(\"Did you forget to passthrough the `ref` to the actual DOM node?\")}})});function Q(o){let c=R.value&&!x.value,u=U(r);!u||!(u instanceof HTMLElement)||c||(S.value=!0,i.value&&t(\"beforeEnter\"),i.value||t(\"beforeLeave\"),o(i.value?M(u,k,$,q,O,C=>{S.value=!1,C===j.Finished&&t(\"afterEnter\")}):M(u,z,G,J,O,C=>{S.value=!1,C===j.Finished&&(w(N)||(n.value=\"hidden\",p(m),t(\"afterLeave\")))})))}return h(()=>{X([i],(o,c,u)=>{Q(u),R.value=!1},{immediate:!0})}),H(F,N),te(b(()=>E(n.value,{[\"visible\"]:V.Open,[\"hidden\"]:V.Closed}))),()=>{let{appear:o,show:c,enter:u,enterFrom:C,enterTo:de,entered:ve,leave:pe,leaveFrom:me,leaveTo:Te,...W}=e;return P({theirProps:W,ourProps:{ref:r},slot:{},slots:s,attrs:a,features:_,visible:n.value===\"visible\",name:\"TransitionChild\"})}}}),ue=oe,fe=A({inheritAttrs:!1,props:{as:{type:[Object,String],default:\"div\"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:\"\"},enterFrom:{type:[String],default:\"\"},enterTo:{type:[String],default:\"\"},entered:{type:[String],default:\"\"},leave:{type:[String],default:\"\"},leaveFrom:{type:[String],default:\"\"},leaveTo:{type:[String],default:\"\"}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:a,slots:s}){let v=ne(),r=b(()=>e.show===null&&v!==null?E(v.value,{[V.Open]:!0,[V.Closed]:!1}):e.show);y(()=>{if(![!0,!1].includes(r.value))throw new Error('A <Transition /> is used but it is missing a `:show=\"true | false\"` prop.')});let n=T(r.value?\"visible\":\"hidden\"),l=K(()=>{n.value=\"hidden\"}),i=T(!0),x={show:r,appear:b(()=>e.appear||!i.value)};return h(()=>{y(()=>{i.value=!1,r.value?n.value=\"visible\":w(l)||(n.value=\"hidden\")})}),H(F,l),H(B,x),()=>{let g=ee(e,[\"show\",\"appear\",\"unmount\",\"onBeforeEnter\",\"onBeforeLeave\",\"onAfterEnter\",\"onAfterLeave\"]),p={unmount:e.unmount};return P({ourProps:{...p,as:\"template\"},theirProps:{},slot:{},slots:{...s,default:()=>[D(ue,{onBeforeEnter:()=>t(\"beforeEnter\"),onAfterEnter:()=>t(\"afterEnter\"),onBeforeLeave:()=>t(\"beforeLeave\"),onAfterLeave:()=>t(\"afterLeave\"),...a,...p,...g},s.default)]},attrs:{},features:_,visible:n.value===\"visible\",name:\"Transition\"})}}});export{oe as TransitionChild,fe as TransitionRoot};\n","import{computed as p,ref as s}from\"vue\";function d(u,e,r){let i=s(r==null?void 0:r.value),f=p(()=>u.value!==void 0);return[p(()=>f.value?u.value:i.value),function(t){return f.value||(i.value=t),e==null?void 0:e(t)}]}export{d as useControllable};\n","let e=0;function n(){return++e}function t(){return n()}export{t as useId};\n","import{watchEffect as r}from\"vue\";import{isServer as m}from'../utils/ssr.js';function v(e,t,n){m||r(o=>{document.addEventListener(e,t,n),o(()=>document.removeEventListener(e,t,n))})}export{v as useDocumentEvent};\n","import{computed as s,ref as E}from\"vue\";import{FocusableMode as d,isFocusableElement as p}from'../utils/focus-management.js';import{dom as C}from'../utils/dom.js';import{useDocumentEvent as l}from'./use-document-event.js';function y(f,m,i=s(()=>!0)){function a(e,u){if(!i.value||e.defaultPrevented)return;let n=u(e);if(n===null||!n.getRootNode().contains(n))return;let c=function o(t){return typeof t==\"function\"?o(t()):Array.isArray(t)||t instanceof Set?t:[t]}(f);for(let o of c){if(o===null)continue;let t=o instanceof HTMLElement?o:C(o);if(t!=null&&t.contains(n)||e.composed&&e.composedPath().includes(t))return}return!p(n,d.Loose)&&n.tabIndex!==-1&&e.preventDefault(),m(e,n)}let r=E(null);l(\"mousedown\",e=>{var u,n;i.value&&(r.value=((n=(u=e.composedPath)==null?void 0:u.call(e))==null?void 0:n[0])||e.target)},!0),l(\"click\",e=>{!r.value||(a(e,()=>r.value),r.value=null)},!0),l(\"blur\",e=>a(e,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}export{y as useOutsideClick};\n","import{ref as f,onMounted as i,watchEffect as l}from\"vue\";import{dom as u}from'../utils/dom.js';function r(t,e){if(t)return t;let n=e!=null?e:\"button\";if(typeof n==\"string\"&&n.toLowerCase()===\"button\")return\"button\"}function b(t,e){let n=f(r(t.value.type,t.value.as));return i(()=>{n.value=r(t.value.type,t.value.as)}),l(()=>{var o;n.value||!u(e)||u(e)instanceof HTMLButtonElement&&!((o=u(e))!=null&&o.hasAttribute(\"type\"))&&(n.value=\"button\")}),n}export{b as useResolveButtonType};\n","import{ref as o}from\"vue\";function r(e){return[e.screenX,e.screenY]}function u(){let e=o([-1,-1]);return{wasMoved(n){let t=r(n);return e.value[0]===t[0]&&e.value[1]===t[1]?!1:(e.value=t,!0)},update(n){e.value=r(n)}}}export{u as useTrackedPointer};\n","import{watchEffect as u}from\"vue\";import{getOwnerDocument as E}from'../utils/owner.js';function p({container:e,accept:t,walk:d,enabled:o}){u(()=>{let r=e.value;if(!r||o!==void 0&&!o.value)return;let l=E(e);if(!l)return;let c=Object.assign(f=>t(f),{acceptNode:t}),n=l.createTreeWalker(r,NodeFilter.SHOW_ELEMENT,c,!1);for(;n.nextNode();)d(n.currentNode)})}export{p as useTreeWalker};\n","import{defineComponent as i}from\"vue\";import{render as p}from'../utils/render.js';var a=(e=>(e[e.None=1]=\"None\",e[e.Focusable=2]=\"Focusable\",e[e.Hidden=4]=\"Hidden\",e))(a||{});let f=i({name:\"Hidden\",props:{as:{type:[Object,String],default:\"div\"},features:{type:Number,default:1}},setup(r,{slots:t,attrs:d}){return()=>{let{features:e,...o}=r,n={\"aria-hidden\":(e&2)===2?!0:void 0,style:{position:\"fixed\",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:\"hidden\",clip:\"rect(0, 0, 0, 0)\",whiteSpace:\"nowrap\",borderWidth:\"0\",...(e&4)===4&&(e&2)!==2&&{display:\"none\"}}};return p({ourProps:n,theirProps:o,slot:{},attrs:d,slots:t,name:\"Hidden\"})}}});export{a as Features,f as Hidden};\n","import{inject as t,provide as r}from\"vue\";let n=Symbol(\"Context\");var l=(e=>(e[e.Open=0]=\"Open\",e[e.Closed=1]=\"Closed\",e))(l||{});function f(){return p()!==null}function p(){return t(n,null)}function c(o){r(n,o)}export{l as State,f as hasOpenClosed,p as useOpenClosed,c as useOpenClosedProvider};\n","var o=(r=>(r.Space=\" \",r.Enter=\"Enter\",r.Escape=\"Escape\",r.Backspace=\"Backspace\",r.Delete=\"Delete\",r.ArrowLeft=\"ArrowLeft\",r.ArrowUp=\"ArrowUp\",r.ArrowRight=\"ArrowRight\",r.ArrowDown=\"ArrowDown\",r.Home=\"Home\",r.End=\"End\",r.PageUp=\"PageUp\",r.PageDown=\"PageDown\",r.Tab=\"Tab\",r))(o||{});export{o as Keys};\n","function f(r){throw new Error(\"Unexpected object: \"+r)}var a=(e=>(e[e.First=0]=\"First\",e[e.Previous=1]=\"Previous\",e[e.Next=2]=\"Next\",e[e.Last=3]=\"Last\",e[e.Specific=4]=\"Specific\",e[e.Nothing=5]=\"Nothing\",e))(a||{});function x(r,n){let t=n.resolveItems();if(t.length<=0)return null;let l=n.resolveActiveIndex(),s=l!=null?l:-1,d=(()=>{switch(r.focus){case 0:return t.findIndex(e=>!n.resolveDisabled(e));case 1:{let e=t.slice().reverse().findIndex((i,c,u)=>s!==-1&&u.length-c-1>=s?!1:!n.resolveDisabled(i));return e===-1?e:t.length-1-e}case 2:return t.findIndex((e,i)=>i<=s?!1:!n.resolveDisabled(e));case 3:{let e=t.slice().reverse().findIndex(i=>!n.resolveDisabled(i));return e===-1?e:t.length-1-e}case 4:return t.findIndex(e=>n.resolveId(e)===r.id);case 5:return null;default:f(r)}})();return d===-1?l:d}export{a as Focus,x as calculateActiveIndex};\n","function s(){let a=[],i=[],t={enqueue(e){i.push(e)},addEventListener(e,n,o,r){return e.addEventListener(n,o,r),t.add(()=>e.removeEventListener(n,o,r))},requestAnimationFrame(...e){let n=requestAnimationFrame(...e);t.add(()=>cancelAnimationFrame(n))},nextFrame(...e){t.requestAnimationFrame(()=>{t.requestAnimationFrame(...e)})},setTimeout(...e){let n=setTimeout(...e);t.add(()=>clearTimeout(n))},add(e){a.push(e)},dispose(){for(let e of a.splice(0))e()},async workQueue(){for(let e of i.splice(0))await e()}};return t}export{s as disposables};\n","function o(n){var l;return n==null||n.value==null?null:(l=n.value.$el)!=null?l:n.value}export{o as dom};\n","import{nextTick as b}from\"vue\";import{match as L}from'./match.js';import{getOwnerDocument as E}from'./owner.js';let f=[\"[contentEditable=true]\",\"[tabindex]\",\"a[href]\",\"area[href]\",\"button:not([disabled])\",\"iframe\",\"input:not([disabled])\",\"select:not([disabled])\",\"textarea:not([disabled])\"].map(e=>`${e}:not([tabindex='-1'])`).join(\",\");var N=(n=>(n[n.First=1]=\"First\",n[n.Previous=2]=\"Previous\",n[n.Next=4]=\"Next\",n[n.Last=8]=\"Last\",n[n.WrapAround=16]=\"WrapAround\",n[n.NoScroll=32]=\"NoScroll\",n))(N||{}),T=(o=>(o[o.Error=0]=\"Error\",o[o.Overflow=1]=\"Overflow\",o[o.Success=2]=\"Success\",o[o.Underflow=3]=\"Underflow\",o))(T||{}),F=(r=>(r[r.Previous=-1]=\"Previous\",r[r.Next=1]=\"Next\",r))(F||{});function d(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(f)).sort((t,r)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(r.tabIndex||Number.MAX_SAFE_INTEGER)))}var h=(r=>(r[r.Strict=0]=\"Strict\",r[r.Loose=1]=\"Loose\",r))(h||{});function S(e,t=0){var r;return e===((r=E(e))==null?void 0:r.body)?!1:L(t,{[0](){return e.matches(f)},[1](){let l=e;for(;l!==null;){if(l.matches(f))return!0;l=l.parentElement}return!1}})}function g(e){let t=E(e);b(()=>{t&&!S(t.activeElement,0)&&H(e)})}function H(e){e==null||e.focus({preventScroll:!0})}let w=[\"textarea\",\"input\"].join(\",\");function A(e){var t,r;return(r=(t=e==null?void 0:e.matches)==null?void 0:t.call(e,w))!=null?r:!1}function I(e,t=r=>r){return e.slice().sort((r,l)=>{let o=t(r),i=t(l);if(o===null||i===null)return 0;let n=o.compareDocumentPosition(i);return n&Node.DOCUMENT_POSITION_FOLLOWING?-1:n&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function D(e,t){return O(d(),t,{relativeTo:e})}function O(e,t,{sorted:r=!0,relativeTo:l=null,skipElements:o=[]}={}){var m;let i=(m=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e==null?void 0:e.ownerDocument)!=null?m:document,n=Array.isArray(e)?r?I(e):e:d(e);o.length>0&&(n=n.filter(s=>!o.includes(s))),l=l!=null?l:i.activeElement;let x=(()=>{if(t&5)return 1;if(t&10)return-1;throw new Error(\"Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last\")})(),p=(()=>{if(t&1)return 0;if(t&2)return Math.max(0,n.indexOf(l))-1;if(t&4)return Math.max(0,n.indexOf(l))+1;if(t&8)return n.length-1;throw new Error(\"Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last\")})(),M=t&32?{preventScroll:!0}:{},c=0,a=n.length,u;do{if(c>=a||c+a<=0)return 0;let s=p+c;if(t&16)s=(s+a)%a;else{if(s<0)return 3;if(s>=a)return 1}u=n[s],u==null||u.focus(M),c+=x}while(u!==i.activeElement);return t&6&&A(u)&&u.select(),u.hasAttribute(\"tabindex\")||u.setAttribute(\"tabindex\",\"0\"),2}export{N as Focus,T as FocusResult,h as FocusableMode,H as focusElement,D as focusFrom,O as focusIn,d as getFocusableElements,S as isFocusableElement,g as restoreFocusIfNecessary,I as sortByDomNode};\n","function e(n={},r=null,t=[]){for(let[i,o]of Object.entries(n))f(t,s(r,i),o);return t}function s(n,r){return n?n+\"[\"+r+\"]\":r}function f(n,r,t){if(Array.isArray(t))for(let[i,o]of t.entries())f(n,s(r,i.toString()),o);else t instanceof Date?n.push([r,t.toISOString()]):typeof t==\"boolean\"?n.push([r,t?\"1\":\"0\"]):typeof t==\"string\"?n.push([r,t]):typeof t==\"number\"?n.push([r,`${t}`]):t==null?n.push([r,\"\"]):e(t,r,n)}function p(n){var t;let r=(t=n==null?void 0:n.form)!=null?t:n.closest(\"form\");if(!!r){for(let i of r.elements)if(i.tagName===\"INPUT\"&&i.type===\"submit\"||i.tagName===\"BUTTON\"&&i.type===\"submit\"||i.nodeName===\"INPUT\"&&i.type===\"image\"){i.click();return}}}export{p as attemptSubmit,e as objectToFormEntries};\n","function u(r,n,...a){if(r in n){let e=n[r];return typeof e==\"function\"?e(...a):e}let t=new Error(`Tried to handle \"${r}\" but there is no handler defined. Only defined handlers are: ${Object.keys(n).map(e=>`\"${e}\"`).join(\", \")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,u),t}export{u as match};\n","import{dom as n}from'./dom.js';import{isServer as t}from'./ssr.js';function m(r){if(t)return null;if(r instanceof Node)return r.ownerDocument;if(r!=null&&r.hasOwnProperty(\"value\")){let o=n(r);if(o)return o.ownerDocument}return document}export{m as getOwnerDocument};\n","import{h as m,cloneVNode as h,Fragment as b}from\"vue\";import{match as j}from'./match.js';var R=(o=>(o[o.None=0]=\"None\",o[o.RenderStrategy=1]=\"RenderStrategy\",o[o.Static=2]=\"Static\",o))(R||{}),O=(e=>(e[e.Unmount=0]=\"Unmount\",e[e.Hidden=1]=\"Hidden\",e))(O||{});function P({visible:r=!0,features:t=0,ourProps:e,theirProps:o,...i}){var a;let n=k(o,e),s=Object.assign(i,{props:n});if(r||t&2&&n.static)return p(s);if(t&1){let l=(a=n.unmount)==null||a?0:1;return j(l,{[0](){return null},[1](){return p({...i,props:{...n,hidden:!0,style:{display:\"none\"}}})}})}return p(s)}function p({props:r,attrs:t,slots:e,slot:o,name:i}){var y;let{as:n,...s}=w(r,[\"unmount\",\"static\"]),a=(y=e.default)==null?void 0:y.call(e,o),l={};if(o){let d=!1,u=[];for(let[f,c]of Object.entries(o))typeof c==\"boolean\"&&(d=!0),c===!0&&u.push(f);d&&(l[\"data-headlessui-state\"]=u.join(\" \"))}if(n===\"template\"){if(a=g(a!=null?a:[]),Object.keys(s).length>0||Object.keys(t).length>0){let[d,...u]=a!=null?a:[];if(!x(d)||u.length>0)throw new Error(['Passing props on \"template\"!',\"\",`The current component <${i} /> is rendering a \"template\".`,\"However we need to passthrough the following props:\",Object.keys(s).concat(Object.keys(t)).sort((f,c)=>f.localeCompare(c)).map(f=>`  - ${f}`).join(`\n`),\"\",\"You can apply a few solutions:\",['Add an `as=\"...\"` prop, to ensure that we render an actual element instead of a \"template\".',\"Render a single element as the child so that we can forward the props onto that element.\"].map(f=>`  - ${f}`).join(`\n`)].join(`\n`));return h(d,Object.assign({},s,l))}return Array.isArray(a)&&a.length===1?a[0]:a}return m(n,Object.assign({},s,l),{default:()=>a})}function g(r){return r.flatMap(t=>t.type===b?g(t.children):[t])}function k(...r){var o;if(r.length===0)return{};if(r.length===1)return r[0];let t={},e={};for(let i of r)for(let n in i)n.startsWith(\"on\")&&typeof i[n]==\"function\"?((o=e[n])!=null||(e[n]=[]),e[n].push(i[n])):t[n]=i[n];if(t.disabled||t[\"aria-disabled\"])return Object.assign(t,Object.fromEntries(Object.keys(e).map(i=>[i,void 0])));for(let i in e)Object.assign(t,{[i](n,...s){let a=e[i];for(let l of a){if(n instanceof Event&&n.defaultPrevented)return;l(n,...s)}}});return t}function V(r){let t=Object.assign({},r);for(let e in t)t[e]===void 0&&delete t[e];return t}function w(r,t=[]){let e=Object.assign({},r);for(let o of t)o in e&&delete e[o];return e}function x(r){return r==null?!1:typeof r.type==\"string\"||typeof r.type==\"object\"||typeof r.type==\"function\"}export{R as Features,O as RenderStrategy,V as compact,w as omit,P as render};\n","const e=typeof window==\"undefined\"||typeof document==\"undefined\";export{e as isServer};\n","/**\n * marked - a markdown parser\n * Copyright (c) 2011-2022, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction getDefaults() {\n  return {\n    async: false,\n    baseUrl: null,\n    breaks: false,\n    extensions: null,\n    gfm: true,\n    headerIds: true,\n    headerPrefix: '',\n    highlight: null,\n    langPrefix: 'language-',\n    mangle: true,\n    pedantic: false,\n    renderer: null,\n    sanitize: false,\n    sanitizer: null,\n    silent: false,\n    smartypants: false,\n    tokenizer: null,\n    walkTokens: null,\n    xhtml: false\n  };\n}\n\nlet defaults = getDefaults();\n\nfunction changeDefaults(newDefaults) {\n  defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = /[&<>\"']/g;\nconst escapeTestNoEncode = /[<>\"']|&(?!#?\\w+;)/;\nconst escapeReplaceNoEncode = /[<>\"']|&(?!#?\\w+;)/g;\nconst escapeReplacements = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n  if (encode) {\n    if (escapeTest.test(html)) {\n      return html.replace(escapeReplace, getEscapeReplacement);\n    }\n  } else {\n    if (escapeTestNoEncode.test(html)) {\n      return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n    }\n  }\n\n  return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n/**\n * @param {string} html\n */\nfunction unescape(html) {\n  // explicitly match decimal, hex, and named HTML entities\n  return html.replace(unescapeTest, (_, n) => {\n    n = n.toLowerCase();\n    if (n === 'colon') return ':';\n    if (n.charAt(0) === '#') {\n      return n.charAt(1) === 'x'\n        ? String.fromCharCode(parseInt(n.substring(2), 16))\n        : String.fromCharCode(+n.substring(1));\n    }\n    return '';\n  });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\n\n/**\n * @param {string | RegExp} regex\n * @param {string} opt\n */\nfunction edit(regex, opt) {\n  regex = typeof regex === 'string' ? regex : regex.source;\n  opt = opt || '';\n  const obj = {\n    replace: (name, val) => {\n      val = val.source || val;\n      val = val.replace(caret, '$1');\n      regex = regex.replace(name, val);\n      return obj;\n    },\n    getRegex: () => {\n      return new RegExp(regex, opt);\n    }\n  };\n  return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n/**\n * @param {boolean} sanitize\n * @param {string} base\n * @param {string} href\n */\nfunction cleanUrl(sanitize, base, href) {\n  if (sanitize) {\n    let prot;\n    try {\n      prot = decodeURIComponent(unescape(href))\n        .replace(nonWordAndColonTest, '')\n        .toLowerCase();\n    } catch (e) {\n      return null;\n    }\n    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n      return null;\n    }\n  }\n  if (base && !originIndependentUrl.test(href)) {\n    href = resolveUrl(base, href);\n  }\n  try {\n    href = encodeURI(href).replace(/%25/g, '%');\n  } catch (e) {\n    return null;\n  }\n  return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n/**\n * @param {string} base\n * @param {string} href\n */\nfunction resolveUrl(base, href) {\n  if (!baseUrls[' ' + base]) {\n    // we can ignore everything in base after the last slash of its path component,\n    // but we might need to add _that_\n    // https://tools.ietf.org/html/rfc3986#section-3\n    if (justDomain.test(base)) {\n      baseUrls[' ' + base] = base + '/';\n    } else {\n      baseUrls[' ' + base] = rtrim(base, '/', true);\n    }\n  }\n  base = baseUrls[' ' + base];\n  const relativeBase = base.indexOf(':') === -1;\n\n  if (href.substring(0, 2) === '//') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(protocol, '$1') + href;\n  } else if (href.charAt(0) === '/') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(domain, '$1') + href;\n  } else {\n    return base + href;\n  }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction merge(obj) {\n  let i = 1,\n    target,\n    key;\n\n  for (; i < arguments.length; i++) {\n    target = arguments[i];\n    for (key in target) {\n      if (Object.prototype.hasOwnProperty.call(target, key)) {\n        obj[key] = target[key];\n      }\n    }\n  }\n\n  return obj;\n}\n\nfunction splitCells(tableRow, count) {\n  // ensure that every cell-delimiting pipe has a space\n  // before it to distinguish it from an escaped pipe\n  const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n      let escaped = false,\n        curr = offset;\n      while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n      if (escaped) {\n        // odd number of slashes means | is escaped\n        // so we leave it alone\n        return '|';\n      } else {\n        // add space before unescaped |\n        return ' |';\n      }\n    }),\n    cells = row.split(/ \\|/);\n  let i = 0;\n\n  // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n  if (!cells[0].trim()) { cells.shift(); }\n  if (cells.length > 0 && !cells[cells.length - 1].trim()) { cells.pop(); }\n\n  if (cells.length > count) {\n    cells.splice(count);\n  } else {\n    while (cells.length < count) cells.push('');\n  }\n\n  for (; i < cells.length; i++) {\n    // leading or trailing whitespace is ignored per the gfm spec\n    cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n  }\n  return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param {string} str\n * @param {string} c\n * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n  const l = str.length;\n  if (l === 0) {\n    return '';\n  }\n\n  // Length of suffix matching the invert condition.\n  let suffLen = 0;\n\n  // Step left until we fail to match the invert condition.\n  while (suffLen < l) {\n    const currChar = str.charAt(l - suffLen - 1);\n    if (currChar === c && !invert) {\n      suffLen++;\n    } else if (currChar !== c && invert) {\n      suffLen++;\n    } else {\n      break;\n    }\n  }\n\n  return str.slice(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n  if (str.indexOf(b[1]) === -1) {\n    return -1;\n  }\n  const l = str.length;\n  let level = 0,\n    i = 0;\n  for (; i < l; i++) {\n    if (str[i] === '\\\\') {\n      i++;\n    } else if (str[i] === b[0]) {\n      level++;\n    } else if (str[i] === b[1]) {\n      level--;\n      if (level < 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\nfunction checkSanitizeDeprecation(opt) {\n  if (opt && opt.sanitize && !opt.silent) {\n    console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n  }\n}\n\n// copied from https://stackoverflow.com/a/5450113/806777\n/**\n * @param {string} pattern\n * @param {number} count\n */\nfunction repeatString(pattern, count) {\n  if (count < 1) {\n    return '';\n  }\n  let result = '';\n  while (count > 1) {\n    if (count & 1) {\n      result += pattern;\n    }\n    count >>= 1;\n    pattern += pattern;\n  }\n  return result + pattern;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n  const href = link.href;\n  const title = link.title ? escape(link.title) : null;\n  const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n\n  if (cap[0].charAt(0) !== '!') {\n    lexer.state.inLink = true;\n    const token = {\n      type: 'link',\n      raw,\n      href,\n      title,\n      text,\n      tokens: lexer.inlineTokens(text)\n    };\n    lexer.state.inLink = false;\n    return token;\n  }\n  return {\n    type: 'image',\n    raw,\n    href,\n    title,\n    text: escape(text)\n  };\n}\n\nfunction indentCodeCompensation(raw, text) {\n  const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n\n  if (matchIndentToCode === null) {\n    return text;\n  }\n\n  const indentToCode = matchIndentToCode[1];\n\n  return text\n    .split('\\n')\n    .map(node => {\n      const matchIndentInNode = node.match(/^\\s+/);\n      if (matchIndentInNode === null) {\n        return node;\n      }\n\n      const [indentInNode] = matchIndentInNode;\n\n      if (indentInNode.length >= indentToCode.length) {\n        return node.slice(indentToCode.length);\n      }\n\n      return node;\n    })\n    .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nclass Tokenizer {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  space(src) {\n    const cap = this.rules.block.newline.exec(src);\n    if (cap && cap[0].length > 0) {\n      return {\n        type: 'space',\n        raw: cap[0]\n      };\n    }\n  }\n\n  code(src) {\n    const cap = this.rules.block.code.exec(src);\n    if (cap) {\n      const text = cap[0].replace(/^ {1,4}/gm, '');\n      return {\n        type: 'code',\n        raw: cap[0],\n        codeBlockStyle: 'indented',\n        text: !this.options.pedantic\n          ? rtrim(text, '\\n')\n          : text\n      };\n    }\n  }\n\n  fences(src) {\n    const cap = this.rules.block.fences.exec(src);\n    if (cap) {\n      const raw = cap[0];\n      const text = indentCodeCompensation(raw, cap[3] || '');\n\n      return {\n        type: 'code',\n        raw,\n        lang: cap[2] ? cap[2].trim() : cap[2],\n        text\n      };\n    }\n  }\n\n  heading(src) {\n    const cap = this.rules.block.heading.exec(src);\n    if (cap) {\n      let text = cap[2].trim();\n\n      // remove trailing #s\n      if (/#$/.test(text)) {\n        const trimmed = rtrim(text, '#');\n        if (this.options.pedantic) {\n          text = trimmed.trim();\n        } else if (!trimmed || / $/.test(trimmed)) {\n          // CommonMark requires space before trailing #s\n          text = trimmed.trim();\n        }\n      }\n\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[1].length,\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n\n  hr(src) {\n    const cap = this.rules.block.hr.exec(src);\n    if (cap) {\n      return {\n        type: 'hr',\n        raw: cap[0]\n      };\n    }\n  }\n\n  blockquote(src) {\n    const cap = this.rules.block.blockquote.exec(src);\n    if (cap) {\n      const text = cap[0].replace(/^ *>[ \\t]?/gm, '');\n\n      return {\n        type: 'blockquote',\n        raw: cap[0],\n        tokens: this.lexer.blockTokens(text, []),\n        text\n      };\n    }\n  }\n\n  list(src) {\n    let cap = this.rules.block.list.exec(src);\n    if (cap) {\n      let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine,\n        line, nextLine, rawLine, itemContents, endEarly;\n\n      let bull = cap[1].trim();\n      const isordered = bull.length > 1;\n\n      const list = {\n        type: 'list',\n        raw: '',\n        ordered: isordered,\n        start: isordered ? +bull.slice(0, -1) : '',\n        loose: false,\n        items: []\n      };\n\n      bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n      if (this.options.pedantic) {\n        bull = isordered ? bull : '[*+-]';\n      }\n\n      // Get next list item\n      const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n\n      // Check if current bullet point can start a new List Item\n      while (src) {\n        endEarly = false;\n        if (!(cap = itemRegex.exec(src))) {\n          break;\n        }\n\n        if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n          break;\n        }\n\n        raw = cap[0];\n        src = src.substring(raw.length);\n\n        line = cap[2].split('\\n', 1)[0];\n        nextLine = src.split('\\n', 1)[0];\n\n        if (this.options.pedantic) {\n          indent = 2;\n          itemContents = line.trimLeft();\n        } else {\n          indent = cap[2].search(/[^ ]/); // Find first non-space char\n          indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n          itemContents = line.slice(indent);\n          indent += cap[1].length;\n        }\n\n        blankLine = false;\n\n        if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n          raw += nextLine + '\\n';\n          src = src.substring(nextLine.length + 1);\n          endEarly = true;\n        }\n\n        if (!endEarly) {\n          const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?: [^\\\\n]*)?(?:\\\\n|$))`);\n          const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n          const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n          const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n\n          // Check if following lines should be included in List Item\n          while (src) {\n            rawLine = src.split('\\n', 1)[0];\n            line = rawLine;\n\n            // Re-align to follow commonmark nesting rules\n            if (this.options.pedantic) {\n              line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n            }\n\n            // End list item if found code fences\n            if (fencesBeginRegex.test(line)) {\n              break;\n            }\n\n            // End list item if found start of new heading\n            if (headingBeginRegex.test(line)) {\n              break;\n            }\n\n            // End list item if found start of new bullet\n            if (nextBulletRegex.test(line)) {\n              break;\n            }\n\n            // Horizontal rule found\n            if (hrRegex.test(src)) {\n              break;\n            }\n\n            if (line.search(/[^ ]/) >= indent || !line.trim()) { // Dedent if possible\n              itemContents += '\\n' + line.slice(indent);\n            } else if (!blankLine) { // Until blank line, item doesn't need indentation\n              itemContents += '\\n' + line;\n            } else { // Otherwise, improper indentation ends this item\n              break;\n            }\n\n            if (!blankLine && !line.trim()) { // Check if current line is blank\n              blankLine = true;\n            }\n\n            raw += rawLine + '\\n';\n            src = src.substring(rawLine.length + 1);\n          }\n        }\n\n        if (!list.loose) {\n          // If the previous item ended with a blank line, the list is loose\n          if (endsWithBlankLine) {\n            list.loose = true;\n          } else if (/\\n *\\n *$/.test(raw)) {\n            endsWithBlankLine = true;\n          }\n        }\n\n        // Check for task list items\n        if (this.options.gfm) {\n          istask = /^\\[[ xX]\\] /.exec(itemContents);\n          if (istask) {\n            ischecked = istask[0] !== '[ ] ';\n            itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n          }\n        }\n\n        list.items.push({\n          type: 'list_item',\n          raw,\n          task: !!istask,\n          checked: ischecked,\n          loose: false,\n          text: itemContents\n        });\n\n        list.raw += raw;\n      }\n\n      // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n      list.items[list.items.length - 1].raw = raw.trimRight();\n      list.items[list.items.length - 1].text = itemContents.trimRight();\n      list.raw = list.raw.trimRight();\n\n      const l = list.items.length;\n\n      // Item child tokens handled here at end because we needed to have the final item to trim it first\n      for (i = 0; i < l; i++) {\n        this.lexer.state.top = false;\n        list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n        const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n        const hasMultipleLineBreaks = spacers.every(t => {\n          const chars = t.raw.split('');\n          let lineBreaks = 0;\n          for (const char of chars) {\n            if (char === '\\n') {\n              lineBreaks += 1;\n            }\n            if (lineBreaks > 1) {\n              return true;\n            }\n          }\n\n          return false;\n        });\n\n        if (!list.loose && spacers.length && hasMultipleLineBreaks) {\n          // Having a single line break doesn't mean a list is loose. A single line break is terminating the last list item\n          list.loose = true;\n          list.items[i].loose = true;\n        }\n      }\n\n      return list;\n    }\n  }\n\n  html(src) {\n    const cap = this.rules.block.html.exec(src);\n    if (cap) {\n      const token = {\n        type: 'html',\n        raw: cap[0],\n        pre: !this.options.sanitizer\n          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n        text: cap[0]\n      };\n      if (this.options.sanitize) {\n        const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n        token.type = 'paragraph';\n        token.text = text;\n        token.tokens = this.lexer.inline(text);\n      }\n      return token;\n    }\n  }\n\n  def(src) {\n    const cap = this.rules.block.def.exec(src);\n    if (cap) {\n      if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);\n      const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n      return {\n        type: 'def',\n        tag,\n        raw: cap[0],\n        href: cap[2],\n        title: cap[3]\n      };\n    }\n  }\n\n  table(src) {\n    const cap = this.rules.block.table.exec(src);\n    if (cap) {\n      const item = {\n        type: 'table',\n        header: splitCells(cap[1]).map(c => { return { text: c }; }),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n      };\n\n      if (item.header.length === item.align.length) {\n        item.raw = cap[0];\n\n        let l = item.align.length;\n        let i, j, k, row;\n        for (i = 0; i < l; i++) {\n          if (/^ *-+: *$/.test(item.align[i])) {\n            item.align[i] = 'right';\n          } else if (/^ *:-+: *$/.test(item.align[i])) {\n            item.align[i] = 'center';\n          } else if (/^ *:-+ *$/.test(item.align[i])) {\n            item.align[i] = 'left';\n          } else {\n            item.align[i] = null;\n          }\n        }\n\n        l = item.rows.length;\n        for (i = 0; i < l; i++) {\n          item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => { return { text: c }; });\n        }\n\n        // parse child tokens inside headers and cells\n\n        // header child tokens\n        l = item.header.length;\n        for (j = 0; j < l; j++) {\n          item.header[j].tokens = this.lexer.inline(item.header[j].text);\n        }\n\n        // cell child tokens\n        l = item.rows.length;\n        for (j = 0; j < l; j++) {\n          row = item.rows[j];\n          for (k = 0; k < row.length; k++) {\n            row[k].tokens = this.lexer.inline(row[k].text);\n          }\n        }\n\n        return item;\n      }\n    }\n  }\n\n  lheading(src) {\n    const cap = this.rules.block.lheading.exec(src);\n    if (cap) {\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[2].charAt(0) === '=' ? 1 : 2,\n        text: cap[1],\n        tokens: this.lexer.inline(cap[1])\n      };\n    }\n  }\n\n  paragraph(src) {\n    const cap = this.rules.block.paragraph.exec(src);\n    if (cap) {\n      const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n        ? cap[1].slice(0, -1)\n        : cap[1];\n      return {\n        type: 'paragraph',\n        raw: cap[0],\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n\n  text(src) {\n    const cap = this.rules.block.text.exec(src);\n    if (cap) {\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: cap[0],\n        tokens: this.lexer.inline(cap[0])\n      };\n    }\n  }\n\n  escape(src) {\n    const cap = this.rules.inline.escape.exec(src);\n    if (cap) {\n      return {\n        type: 'escape',\n        raw: cap[0],\n        text: escape(cap[1])\n      };\n    }\n  }\n\n  tag(src) {\n    const cap = this.rules.inline.tag.exec(src);\n    if (cap) {\n      if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n        this.lexer.state.inLink = true;\n      } else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n        this.lexer.state.inLink = false;\n      }\n      if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = true;\n      } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = false;\n      }\n\n      return {\n        type: this.options.sanitize\n          ? 'text'\n          : 'html',\n        raw: cap[0],\n        inLink: this.lexer.state.inLink,\n        inRawBlock: this.lexer.state.inRawBlock,\n        text: this.options.sanitize\n          ? (this.options.sanitizer\n            ? this.options.sanitizer(cap[0])\n            : escape(cap[0]))\n          : cap[0]\n      };\n    }\n  }\n\n  link(src) {\n    const cap = this.rules.inline.link.exec(src);\n    if (cap) {\n      const trimmedUrl = cap[2].trim();\n      if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n        // commonmark requires matching angle brackets\n        if (!(/>$/.test(trimmedUrl))) {\n          return;\n        }\n\n        // ending angle bracket cannot be escaped\n        const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n        if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n          return;\n        }\n      } else {\n        // find closing parenthesis\n        const lastParenIndex = findClosingBracket(cap[2], '()');\n        if (lastParenIndex > -1) {\n          const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n          const linkLen = start + cap[1].length + lastParenIndex;\n          cap[2] = cap[2].substring(0, lastParenIndex);\n          cap[0] = cap[0].substring(0, linkLen).trim();\n          cap[3] = '';\n        }\n      }\n      let href = cap[2];\n      let title = '';\n      if (this.options.pedantic) {\n        // split pedantic href and title\n        const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n        if (link) {\n          href = link[1];\n          title = link[3];\n        }\n      } else {\n        title = cap[3] ? cap[3].slice(1, -1) : '';\n      }\n\n      href = href.trim();\n      if (/^</.test(href)) {\n        if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n          // pedantic allows starting angle bracket without ending angle bracket\n          href = href.slice(1);\n        } else {\n          href = href.slice(1, -1);\n        }\n      }\n      return outputLink(cap, {\n        href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n        title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n      }, cap[0], this.lexer);\n    }\n  }\n\n  reflink(src, links) {\n    let cap;\n    if ((cap = this.rules.inline.reflink.exec(src))\n        || (cap = this.rules.inline.nolink.exec(src))) {\n      let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n      link = links[link.toLowerCase()];\n      if (!link || !link.href) {\n        const text = cap[0].charAt(0);\n        return {\n          type: 'text',\n          raw: text,\n          text\n        };\n      }\n      return outputLink(cap, link, cap[0], this.lexer);\n    }\n  }\n\n  emStrong(src, maskedSrc, prevChar = '') {\n    let match = this.rules.inline.emStrong.lDelim.exec(src);\n    if (!match) return;\n\n    // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n    if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u)) return;\n\n    const nextChar = match[1] || match[2] || '';\n\n    if (!nextChar || (nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {\n      const lLength = match[0].length - 1;\n      let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n      const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n      endReg.lastIndex = 0;\n\n      // Clip maskedSrc to same section of string as src (move to lexer?)\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n        if (!rDelim) continue; // skip single * in __abc*abc__\n\n        rLength = rDelim.length;\n\n        if (match[3] || match[4]) { // found another Left Delim\n          delimTotal += rLength;\n          continue;\n        } else if (match[5] || match[6]) { // either Left or Right Delim\n          if (lLength % 3 && !((lLength + rLength) % 3)) {\n            midDelimTotal += rLength;\n            continue; // CommonMark Emphasis Rules 9-10\n          }\n        }\n\n        delimTotal -= rLength;\n\n        if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n        // Remove extra characters. *a*** -> *a*\n        rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n\n        const raw = src.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);\n\n        // Create `em` if smallest delimiter has odd char count. *a***\n        if (Math.min(lLength, rLength) % 2) {\n          const text = raw.slice(1, -1);\n          return {\n            type: 'em',\n            raw,\n            text,\n            tokens: this.lexer.inlineTokens(text)\n          };\n        }\n\n        // Create 'strong' if smallest delimiter has even char count. **a***\n        const text = raw.slice(2, -2);\n        return {\n          type: 'strong',\n          raw,\n          text,\n          tokens: this.lexer.inlineTokens(text)\n        };\n      }\n    }\n  }\n\n  codespan(src) {\n    const cap = this.rules.inline.code.exec(src);\n    if (cap) {\n      let text = cap[2].replace(/\\n/g, ' ');\n      const hasNonSpaceChars = /[^ ]/.test(text);\n      const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n      if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n        text = text.substring(1, text.length - 1);\n      }\n      text = escape(text, true);\n      return {\n        type: 'codespan',\n        raw: cap[0],\n        text\n      };\n    }\n  }\n\n  br(src) {\n    const cap = this.rules.inline.br.exec(src);\n    if (cap) {\n      return {\n        type: 'br',\n        raw: cap[0]\n      };\n    }\n  }\n\n  del(src) {\n    const cap = this.rules.inline.del.exec(src);\n    if (cap) {\n      return {\n        type: 'del',\n        raw: cap[0],\n        text: cap[2],\n        tokens: this.lexer.inlineTokens(cap[2])\n      };\n    }\n  }\n\n  autolink(src, mangle) {\n    const cap = this.rules.inline.autolink.exec(src);\n    if (cap) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n        href = 'mailto:' + text;\n      } else {\n        text = escape(cap[1]);\n        href = text;\n      }\n\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n\n  url(src, mangle) {\n    let cap;\n    if (cap = this.rules.inline.url.exec(src)) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n        href = 'mailto:' + text;\n      } else {\n        // do extended autolink path validation\n        let prevCapZero;\n        do {\n          prevCapZero = cap[0];\n          cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n        } while (prevCapZero !== cap[0]);\n        text = escape(cap[0]);\n        if (cap[1] === 'www.') {\n          href = 'http://' + text;\n        } else {\n          href = text;\n        }\n      }\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n\n  inlineText(src, smartypants) {\n    const cap = this.rules.inline.text.exec(src);\n    if (cap) {\n      let text;\n      if (this.lexer.state.inRawBlock) {\n        text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0];\n      } else {\n        text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n      }\n      return {\n        type: 'text',\n        raw: cap[0],\n        text\n      };\n    }\n  }\n}\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n  newline: /^(?: *(?:\\n|$))+/,\n  code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n  fences: /^ {0,3}(`{3,}(?=[^`\\n]*\\n)|~{3,})([^\\n]*)\\n(?:|([\\s\\S]*?)\\n)(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n  hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n  heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n  blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n  list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n  html: '^ {0,3}(?:' // optional indentation\n    + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n    + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n    + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n    + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n    + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n    + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n    + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n    + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n    + ')',\n  def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?<?([^\\s>]+)>?(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n  table: noopTest,\n  lheading: /^([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  // regex template, placeholders will be replaced according to different paragraph\n  // interruption rules of commonmark and the original markdown spec:\n  _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n  text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n  .replace('label', block._label)\n  .replace('title', block._title)\n  .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n  .replace('bull', block.bullet)\n  .getRegex();\n\nblock.list = edit(block.list)\n  .replace(/bull/g, block.bullet)\n  .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n  .replace('def', '\\\\n+(?=' + block.def.source + ')')\n  .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n  + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n  + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n  + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n  + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n  + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i')\n  .replace('comment', block._comment)\n  .replace('tag', block._tag)\n  .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n  .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n  .replace('|table', '')\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n  .replace('paragraph', block.paragraph)\n  .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n  table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n    + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n    + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n});\n\nblock.gfm.table = edit(block.gfm.table)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('blockquote', ' {0,3}>')\n  .replace('code', ' {4}[^\\\\n]')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n  .getRegex();\n\nblock.gfm.paragraph = edit(block._paragraph)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n  .replace('table', block.gfm.table) // interrupt paragraphs with table\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = merge({}, block.normal, {\n  html: edit(\n    '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n    + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n    + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n    .replace('comment', block._comment)\n    .replace(/tag/g, '(?!(?:'\n      + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n      + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n      + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n    .getRegex(),\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n  heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n  fences: noopTest, // fences not supported\n  paragraph: edit(block.normal._paragraph)\n    .replace('hr', block.hr)\n    .replace('heading', ' *#{1,6} *[^\\n]')\n    .replace('lheading', block.lheading)\n    .replace('blockquote', ' {0,3}>')\n    .replace('|fences', '')\n    .replace('|list', '')\n    .replace('|html', '')\n    .getRegex()\n});\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n  escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n  autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n  url: noopTest,\n  tag: '^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>', // CDATA section\n  link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n  reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n  nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n  reflinkSearch: 'reflink|nolink(?!\\\\()',\n  emStrong: {\n    lDelim: /^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,\n    //        (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.\n    //          () Skip orphan inside strong                                      () Consume to delim     (1) #***                (2) a***#, a***                             (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a\n    rDelimAst: /^(?:[^_*\\\\]|\\\\.)*?\\_\\_(?:[^_*\\\\]|\\\\.)*?\\*(?:[^_*\\\\]|\\\\.)*?(?=\\_\\_)|(?:[^*\\\\]|\\\\.)+(?=[^*])|[punct_](\\*+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[^punct*_\\s])/,\n    rDelimUnd: /^(?:[^_*\\\\]|\\\\.)*?\\*\\*(?:[^_*\\\\]|\\\\.)*?\\_(?:[^_*\\\\]|\\\\.)*?(?=\\*\\*)|(?:[^_\\\\]|\\\\.)+(?=[^_])|[punct*](\\_+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/ // ^- Not allowed for _\n  },\n  code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n  br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n  del: noopTest,\n  text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n  punctuation: /^([\\spunctuation])/\n};\n\n// list of punctuation marks from CommonMark spec\n// without * and _ to handle the different emphasis markers * and _\ninline._punctuation = '!\"#$%&\\'()+\\\\-.,/:;<=>?@\\\\[\\\\]`^{|}~';\ninline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g;\n// lookbehind is not available on Safari as of version 16\n// inline.escapedEmSt = /(?<=(?:^|[^\\\\)(?:\\\\[^])*)\\\\[*_]/g;\ninline.escapedEmSt = /(?:^|[^\\\\])(?:\\\\\\\\)*\\\\[*_]/g;\n\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\n\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim)\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n  .replace('scheme', inline._scheme)\n  .replace('email', inline._email)\n  .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n  .replace('comment', inline._comment)\n  .replace('attribute', inline._attribute)\n  .getRegex();\n\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n  .replace('label', inline._label)\n  .replace('href', inline._href)\n  .replace('title', inline._title)\n  .getRegex();\n\ninline.reflink = edit(inline.reflink)\n  .replace('label', inline._label)\n  .replace('ref', block._label)\n  .getRegex();\n\ninline.nolink = edit(inline.nolink)\n  .replace('ref', block._label)\n  .getRegex();\n\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n  .replace('reflink', inline.reflink)\n  .replace('nolink', inline.nolink)\n  .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n  strong: {\n    start: /^__|\\*\\*/,\n    middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n    endAst: /\\*\\*(?!\\*)/g,\n    endUnd: /__(?!_)/g\n  },\n  em: {\n    start: /^_|\\*/,\n    middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n    endAst: /\\*(?!\\*)/g,\n    endUnd: /_(?!_)/g\n  },\n  link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n    .replace('label', inline._label)\n    .getRegex(),\n  reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n    .replace('label', inline._label)\n    .getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n  escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n  _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n  url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n  _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n  del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n  text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n});\n\ninline.gfm.url = edit(inline.gfm.url, 'i')\n  .replace('email', inline.gfm._extended_email)\n  .getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = merge({}, inline.gfm, {\n  br: edit(inline.br).replace('{2,}', '*').getRegex(),\n  text: edit(inline.gfm.text)\n    .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n    .replace(/\\{2,\\}/g, '*')\n    .getRegex()\n});\n\n/**\n * smartypants text replacement\n * @param {string} text\n */\nfunction smartypants(text) {\n  return text\n    // em-dashes\n    .replace(/---/g, '\\u2014')\n    // en-dashes\n    .replace(/--/g, '\\u2013')\n    // opening singles\n    .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n    // closing singles & apostrophes\n    .replace(/'/g, '\\u2019')\n    // opening doubles\n    .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n    // closing doubles\n    .replace(/\"/g, '\\u201d')\n    // ellipses\n    .replace(/\\.{3}/g, '\\u2026');\n}\n\n/**\n * mangle email addresses\n * @param {string} text\n */\nfunction mangle(text) {\n  let out = '',\n    i,\n    ch;\n\n  const l = text.length;\n  for (i = 0; i < l; i++) {\n    ch = text.charCodeAt(i);\n    if (Math.random() > 0.5) {\n      ch = 'x' + ch.toString(16);\n    }\n    out += '&#' + ch + ';';\n  }\n\n  return out;\n}\n\n/**\n * Block Lexer\n */\nclass Lexer {\n  constructor(options) {\n    this.tokens = [];\n    this.tokens.links = Object.create(null);\n    this.options = options || defaults;\n    this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n    this.tokenizer = this.options.tokenizer;\n    this.tokenizer.options = this.options;\n    this.tokenizer.lexer = this;\n    this.inlineQueue = [];\n    this.state = {\n      inLink: false,\n      inRawBlock: false,\n      top: true\n    };\n\n    const rules = {\n      block: block.normal,\n      inline: inline.normal\n    };\n\n    if (this.options.pedantic) {\n      rules.block = block.pedantic;\n      rules.inline = inline.pedantic;\n    } else if (this.options.gfm) {\n      rules.block = block.gfm;\n      if (this.options.breaks) {\n        rules.inline = inline.breaks;\n      } else {\n        rules.inline = inline.gfm;\n      }\n    }\n    this.tokenizer.rules = rules;\n  }\n\n  /**\n   * Expose Rules\n   */\n  static get rules() {\n    return {\n      block,\n      inline\n    };\n  }\n\n  /**\n   * Static Lex Method\n   */\n  static lex(src, options) {\n    const lexer = new Lexer(options);\n    return lexer.lex(src);\n  }\n\n  /**\n   * Static Lex Inline Method\n   */\n  static lexInline(src, options) {\n    const lexer = new Lexer(options);\n    return lexer.inlineTokens(src);\n  }\n\n  /**\n   * Preprocessing\n   */\n  lex(src) {\n    src = src\n      .replace(/\\r\\n|\\r/g, '\\n');\n\n    this.blockTokens(src, this.tokens);\n\n    let next;\n    while (next = this.inlineQueue.shift()) {\n      this.inlineTokens(next.src, next.tokens);\n    }\n\n    return this.tokens;\n  }\n\n  /**\n   * Lexing\n   */\n  blockTokens(src, tokens = []) {\n    if (this.options.pedantic) {\n      src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n    } else {\n      src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n        return leading + '    '.repeat(tabs.length);\n      });\n    }\n\n    let token, lastToken, cutSrc, lastParagraphClipped;\n\n    while (src) {\n      if (this.options.extensions\n        && this.options.extensions.block\n        && this.options.extensions.block.some((extTokenizer) => {\n          if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n            src = src.substring(token.raw.length);\n            tokens.push(token);\n            return true;\n          }\n          return false;\n        })) {\n        continue;\n      }\n\n      // newline\n      if (token = this.tokenizer.space(src)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.length === 1 && tokens.length > 0) {\n          // if there's a single \\n as a spacer, it's terminating the last line,\n          // so move it there so that we don't get unecessary paragraph tags\n          tokens[tokens.length - 1].raw += '\\n';\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.code(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        // An indented code block cannot interrupt a paragraph.\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // fences\n      if (token = this.tokenizer.fences(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // heading\n      if (token = this.tokenizer.heading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // hr\n      if (token = this.tokenizer.hr(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // blockquote\n      if (token = this.tokenizer.blockquote(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // list\n      if (token = this.tokenizer.list(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // html\n      if (token = this.tokenizer.html(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // def\n      if (token = this.tokenizer.def(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.raw;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else if (!this.tokens.links[token.tag]) {\n          this.tokens.links[token.tag] = {\n            href: token.href,\n            title: token.title\n          };\n        }\n        continue;\n      }\n\n      // table (gfm)\n      if (token = this.tokenizer.table(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // lheading\n      if (token = this.tokenizer.lheading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // top-level paragraph\n      // prevent paragraph consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startBlock) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startBlock.forEach(function(getStartIndex) {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n        lastToken = tokens[tokens.length - 1];\n        if (lastParagraphClipped && lastToken.type === 'paragraph') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        lastParagraphClipped = (cutSrc.length !== src.length);\n        src = src.substring(token.raw.length);\n        continue;\n      }\n\n      // text\n      if (token = this.tokenizer.text(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    this.state.top = true;\n    return tokens;\n  }\n\n  inline(src, tokens = []) {\n    this.inlineQueue.push({ src, tokens });\n    return tokens;\n  }\n\n  /**\n   * Lexing/Compiling\n   */\n  inlineTokens(src, tokens = []) {\n    let token, lastToken, cutSrc;\n\n    // String with links masked to avoid interference with em and strong\n    let maskedSrc = src;\n    let match;\n    let keepPrevChar, prevChar;\n\n    // Mask out reflinks\n    if (this.tokens.links) {\n      const links = Object.keys(this.tokens.links);\n      if (links.length > 0) {\n        while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n          if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n          }\n        }\n      }\n    }\n    // Mask out other blocks\n    while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n    }\n\n    // Mask out escaped em & strong delimiters\n    while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);\n      this.tokenizer.rules.inline.escapedEmSt.lastIndex--;\n    }\n\n    while (src) {\n      if (!keepPrevChar) {\n        prevChar = '';\n      }\n      keepPrevChar = false;\n\n      // extensions\n      if (this.options.extensions\n        && this.options.extensions.inline\n        && this.options.extensions.inline.some((extTokenizer) => {\n          if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n            src = src.substring(token.raw.length);\n            tokens.push(token);\n            return true;\n          }\n          return false;\n        })) {\n        continue;\n      }\n\n      // escape\n      if (token = this.tokenizer.escape(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // tag\n      if (token = this.tokenizer.tag(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // link\n      if (token = this.tokenizer.link(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // reflink, nolink\n      if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // em & strong\n      if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.codespan(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // br\n      if (token = this.tokenizer.br(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // del (gfm)\n      if (token = this.tokenizer.del(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // autolink\n      if (token = this.tokenizer.autolink(src, mangle)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // url (gfm)\n      if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // text\n      // prevent inlineText consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startInline) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startInline.forEach(function(getStartIndex) {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n          prevChar = token.raw.slice(-1);\n        }\n        keepPrevChar = true;\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    return tokens;\n  }\n}\n\n/**\n * Renderer\n */\nclass Renderer {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  code(code, infostring, escaped) {\n    const lang = (infostring || '').match(/\\S*/)[0];\n    if (this.options.highlight) {\n      const out = this.options.highlight(code, lang);\n      if (out != null && out !== code) {\n        escaped = true;\n        code = out;\n      }\n    }\n\n    code = code.replace(/\\n$/, '') + '\\n';\n\n    if (!lang) {\n      return '<pre><code>'\n        + (escaped ? code : escape(code, true))\n        + '</code></pre>\\n';\n    }\n\n    return '<pre><code class=\"'\n      + this.options.langPrefix\n      + escape(lang, true)\n      + '\">'\n      + (escaped ? code : escape(code, true))\n      + '</code></pre>\\n';\n  }\n\n  /**\n   * @param {string} quote\n   */\n  blockquote(quote) {\n    return `<blockquote>\\n${quote}</blockquote>\\n`;\n  }\n\n  html(html) {\n    return html;\n  }\n\n  /**\n   * @param {string} text\n   * @param {string} level\n   * @param {string} raw\n   * @param {any} slugger\n   */\n  heading(text, level, raw, slugger) {\n    if (this.options.headerIds) {\n      const id = this.options.headerPrefix + slugger.slug(raw);\n      return `<h${level} id=\"${id}\">${text}</h${level}>\\n`;\n    }\n\n    // ignore IDs\n    return `<h${level}>${text}</h${level}>\\n`;\n  }\n\n  hr() {\n    return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n  }\n\n  list(body, ordered, start) {\n    const type = ordered ? 'ol' : 'ul',\n      startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n    return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n  }\n\n  /**\n   * @param {string} text\n   */\n  listitem(text) {\n    return `<li>${text}</li>\\n`;\n  }\n\n  checkbox(checked) {\n    return '<input '\n      + (checked ? 'checked=\"\" ' : '')\n      + 'disabled=\"\" type=\"checkbox\"'\n      + (this.options.xhtml ? ' /' : '')\n      + '> ';\n  }\n\n  /**\n   * @param {string} text\n   */\n  paragraph(text) {\n    return `<p>${text}</p>\\n`;\n  }\n\n  /**\n   * @param {string} header\n   * @param {string} body\n   */\n  table(header, body) {\n    if (body) body = `<tbody>${body}</tbody>`;\n\n    return '<table>\\n'\n      + '<thead>\\n'\n      + header\n      + '</thead>\\n'\n      + body\n      + '</table>\\n';\n  }\n\n  /**\n   * @param {string} content\n   */\n  tablerow(content) {\n    return `<tr>\\n${content}</tr>\\n`;\n  }\n\n  tablecell(content, flags) {\n    const type = flags.header ? 'th' : 'td';\n    const tag = flags.align\n      ? `<${type} align=\"${flags.align}\">`\n      : `<${type}>`;\n    return tag + content + `</${type}>\\n`;\n  }\n\n  /**\n   * span level renderer\n   * @param {string} text\n   */\n  strong(text) {\n    return `<strong>${text}</strong>`;\n  }\n\n  /**\n   * @param {string} text\n   */\n  em(text) {\n    return `<em>${text}</em>`;\n  }\n\n  /**\n   * @param {string} text\n   */\n  codespan(text) {\n    return `<code>${text}</code>`;\n  }\n\n  br() {\n    return this.options.xhtml ? '<br/>' : '<br>';\n  }\n\n  /**\n   * @param {string} text\n   */\n  del(text) {\n    return `<del>${text}</del>`;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */\n  link(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n    let out = '<a href=\"' + escape(href) + '\"';\n    if (title) {\n      out += ' title=\"' + title + '\"';\n    }\n    out += '>' + text + '</a>';\n    return out;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */\n  image(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n\n    let out = `<img src=\"${href}\" alt=\"${text}\"`;\n    if (title) {\n      out += ` title=\"${title}\"`;\n    }\n    out += this.options.xhtml ? '/>' : '>';\n    return out;\n  }\n\n  text(text) {\n    return text;\n  }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass TextRenderer {\n  // no need for block level renderers\n  strong(text) {\n    return text;\n  }\n\n  em(text) {\n    return text;\n  }\n\n  codespan(text) {\n    return text;\n  }\n\n  del(text) {\n    return text;\n  }\n\n  html(text) {\n    return text;\n  }\n\n  text(text) {\n    return text;\n  }\n\n  link(href, title, text) {\n    return '' + text;\n  }\n\n  image(href, title, text) {\n    return '' + text;\n  }\n\n  br() {\n    return '';\n  }\n}\n\n/**\n * Slugger generates header id\n */\nclass Slugger {\n  constructor() {\n    this.seen = {};\n  }\n\n  /**\n   * @param {string} value\n   */\n  serialize(value) {\n    return value\n      .toLowerCase()\n      .trim()\n      // remove html tags\n      .replace(/<[!\\/a-z].*?>/ig, '')\n      // remove unwanted chars\n      .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n      .replace(/\\s/g, '-');\n  }\n\n  /**\n   * Finds the next safe (unique) slug to use\n   * @param {string} originalSlug\n   * @param {boolean} isDryRun\n   */\n  getNextSafeSlug(originalSlug, isDryRun) {\n    let slug = originalSlug;\n    let occurenceAccumulator = 0;\n    if (this.seen.hasOwnProperty(slug)) {\n      occurenceAccumulator = this.seen[originalSlug];\n      do {\n        occurenceAccumulator++;\n        slug = originalSlug + '-' + occurenceAccumulator;\n      } while (this.seen.hasOwnProperty(slug));\n    }\n    if (!isDryRun) {\n      this.seen[originalSlug] = occurenceAccumulator;\n      this.seen[slug] = 0;\n    }\n    return slug;\n  }\n\n  /**\n   * Convert string to unique id\n   * @param {object} [options]\n   * @param {boolean} [options.dryrun] Generates the next unique slug without\n   * updating the internal accumulator.\n   */\n  slug(value, options = {}) {\n    const slug = this.serialize(value);\n    return this.getNextSafeSlug(slug, options.dryrun);\n  }\n}\n\n/**\n * Parsing & Compiling\n */\nclass Parser {\n  constructor(options) {\n    this.options = options || defaults;\n    this.options.renderer = this.options.renderer || new Renderer();\n    this.renderer = this.options.renderer;\n    this.renderer.options = this.options;\n    this.textRenderer = new TextRenderer();\n    this.slugger = new Slugger();\n  }\n\n  /**\n   * Static Parse Method\n   */\n  static parse(tokens, options) {\n    const parser = new Parser(options);\n    return parser.parse(tokens);\n  }\n\n  /**\n   * Static Parse Inline Method\n   */\n  static parseInline(tokens, options) {\n    const parser = new Parser(options);\n    return parser.parseInline(tokens);\n  }\n\n  /**\n   * Parse Loop\n   */\n  parse(tokens, top = true) {\n    let out = '',\n      i,\n      j,\n      k,\n      l2,\n      l3,\n      row,\n      cell,\n      header,\n      body,\n      token,\n      ordered,\n      start,\n      loose,\n      itemBody,\n      item,\n      checked,\n      task,\n      checkbox,\n      ret;\n\n    const l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n        if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      switch (token.type) {\n        case 'space': {\n          continue;\n        }\n        case 'hr': {\n          out += this.renderer.hr();\n          continue;\n        }\n        case 'heading': {\n          out += this.renderer.heading(\n            this.parseInline(token.tokens),\n            token.depth,\n            unescape(this.parseInline(token.tokens, this.textRenderer)),\n            this.slugger);\n          continue;\n        }\n        case 'code': {\n          out += this.renderer.code(token.text,\n            token.lang,\n            token.escaped);\n          continue;\n        }\n        case 'table': {\n          header = '';\n\n          // header\n          cell = '';\n          l2 = token.header.length;\n          for (j = 0; j < l2; j++) {\n            cell += this.renderer.tablecell(\n              this.parseInline(token.header[j].tokens),\n              { header: true, align: token.align[j] }\n            );\n          }\n          header += this.renderer.tablerow(cell);\n\n          body = '';\n          l2 = token.rows.length;\n          for (j = 0; j < l2; j++) {\n            row = token.rows[j];\n\n            cell = '';\n            l3 = row.length;\n            for (k = 0; k < l3; k++) {\n              cell += this.renderer.tablecell(\n                this.parseInline(row[k].tokens),\n                { header: false, align: token.align[k] }\n              );\n            }\n\n            body += this.renderer.tablerow(cell);\n          }\n          out += this.renderer.table(header, body);\n          continue;\n        }\n        case 'blockquote': {\n          body = this.parse(token.tokens);\n          out += this.renderer.blockquote(body);\n          continue;\n        }\n        case 'list': {\n          ordered = token.ordered;\n          start = token.start;\n          loose = token.loose;\n          l2 = token.items.length;\n\n          body = '';\n          for (j = 0; j < l2; j++) {\n            item = token.items[j];\n            checked = item.checked;\n            task = item.task;\n\n            itemBody = '';\n            if (item.task) {\n              checkbox = this.renderer.checkbox(checked);\n              if (loose) {\n                if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                  item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                  if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                    item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                  }\n                } else {\n                  item.tokens.unshift({\n                    type: 'text',\n                    text: checkbox\n                  });\n                }\n              } else {\n                itemBody += checkbox;\n              }\n            }\n\n            itemBody += this.parse(item.tokens, loose);\n            body += this.renderer.listitem(itemBody, task, checked);\n          }\n\n          out += this.renderer.list(body, ordered, start);\n          continue;\n        }\n        case 'html': {\n          // TODO parse inline content if parameter markdown=1\n          out += this.renderer.html(token.text);\n          continue;\n        }\n        case 'paragraph': {\n          out += this.renderer.paragraph(this.parseInline(token.tokens));\n          continue;\n        }\n        case 'text': {\n          body = token.tokens ? this.parseInline(token.tokens) : token.text;\n          while (i + 1 < l && tokens[i + 1].type === 'text') {\n            token = tokens[++i];\n            body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n          }\n          out += top ? this.renderer.paragraph(body) : body;\n          continue;\n        }\n\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n\n    return out;\n  }\n\n  /**\n   * Parse Inline Tokens\n   */\n  parseInline(tokens, renderer) {\n    renderer = renderer || this.renderer;\n    let out = '',\n      i,\n      token,\n      ret;\n\n    const l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n        if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      switch (token.type) {\n        case 'escape': {\n          out += renderer.text(token.text);\n          break;\n        }\n        case 'html': {\n          out += renderer.html(token.text);\n          break;\n        }\n        case 'link': {\n          out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'image': {\n          out += renderer.image(token.href, token.title, token.text);\n          break;\n        }\n        case 'strong': {\n          out += renderer.strong(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'em': {\n          out += renderer.em(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'codespan': {\n          out += renderer.codespan(token.text);\n          break;\n        }\n        case 'br': {\n          out += renderer.br();\n          break;\n        }\n        case 'del': {\n          out += renderer.del(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'text': {\n          out += renderer.text(token.text);\n          break;\n        }\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n    return out;\n  }\n}\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n  // throw error in case of non string input\n  if (typeof src === 'undefined' || src === null) {\n    throw new Error('marked(): input parameter is undefined or null');\n  }\n  if (typeof src !== 'string') {\n    throw new Error('marked(): input parameter is of type '\n      + Object.prototype.toString.call(src) + ', string expected');\n  }\n\n  if (typeof opt === 'function') {\n    callback = opt;\n    opt = null;\n  }\n\n  opt = merge({}, marked.defaults, opt || {});\n  checkSanitizeDeprecation(opt);\n\n  if (callback) {\n    const highlight = opt.highlight;\n    let tokens;\n\n    try {\n      tokens = Lexer.lex(src, opt);\n    } catch (e) {\n      return callback(e);\n    }\n\n    const done = function(err) {\n      let out;\n\n      if (!err) {\n        try {\n          if (opt.walkTokens) {\n            marked.walkTokens(tokens, opt.walkTokens);\n          }\n          out = Parser.parse(tokens, opt);\n        } catch (e) {\n          err = e;\n        }\n      }\n\n      opt.highlight = highlight;\n\n      return err\n        ? callback(err)\n        : callback(null, out);\n    };\n\n    if (!highlight || highlight.length < 3) {\n      return done();\n    }\n\n    delete opt.highlight;\n\n    if (!tokens.length) return done();\n\n    let pending = 0;\n    marked.walkTokens(tokens, function(token) {\n      if (token.type === 'code') {\n        pending++;\n        setTimeout(() => {\n          highlight(token.text, token.lang, function(err, code) {\n            if (err) {\n              return done(err);\n            }\n            if (code != null && code !== token.text) {\n              token.text = code;\n              token.escaped = true;\n            }\n\n            pending--;\n            if (pending === 0) {\n              done();\n            }\n          });\n        }, 0);\n      }\n    });\n\n    if (pending === 0) {\n      done();\n    }\n\n    return;\n  }\n\n  function onError(e) {\n    e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n    if (opt.silent) {\n      return '<p>An error occurred:</p><pre>'\n        + escape(e.message + '', true)\n        + '</pre>';\n    }\n    throw e;\n  }\n\n  try {\n    const tokens = Lexer.lex(src, opt);\n    if (opt.walkTokens) {\n      if (opt.async) {\n        return Promise.all(marked.walkTokens(tokens, opt.walkTokens))\n          .then(() => {\n            return Parser.parse(tokens, opt);\n          })\n          .catch(onError);\n      }\n      marked.walkTokens(tokens, opt.walkTokens);\n    }\n    return Parser.parse(tokens, opt);\n  } catch (e) {\n    onError(e);\n  }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n  merge(marked.defaults, opt);\n  changeDefaults(marked.defaults);\n  return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args) {\n  const opts = merge({}, ...args);\n  const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };\n  let hasExtensions;\n\n  args.forEach((pack) => {\n    // ==-- Parse \"addon\" extensions --== //\n    if (pack.extensions) {\n      hasExtensions = true;\n      pack.extensions.forEach((ext) => {\n        if (!ext.name) {\n          throw new Error('extension name required');\n        }\n        if (ext.renderer) { // Renderer extensions\n          const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;\n          if (prevRenderer) {\n            // Replace extension with func to run new extension but fall back if false\n            extensions.renderers[ext.name] = function(...args) {\n              let ret = ext.renderer.apply(this, args);\n              if (ret === false) {\n                ret = prevRenderer.apply(this, args);\n              }\n              return ret;\n            };\n          } else {\n            extensions.renderers[ext.name] = ext.renderer;\n          }\n        }\n        if (ext.tokenizer) { // Tokenizer Extensions\n          if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n            throw new Error(\"extension level must be 'block' or 'inline'\");\n          }\n          if (extensions[ext.level]) {\n            extensions[ext.level].unshift(ext.tokenizer);\n          } else {\n            extensions[ext.level] = [ext.tokenizer];\n          }\n          if (ext.start) { // Function to check for start of token\n            if (ext.level === 'block') {\n              if (extensions.startBlock) {\n                extensions.startBlock.push(ext.start);\n              } else {\n                extensions.startBlock = [ext.start];\n              }\n            } else if (ext.level === 'inline') {\n              if (extensions.startInline) {\n                extensions.startInline.push(ext.start);\n              } else {\n                extensions.startInline = [ext.start];\n              }\n            }\n          }\n        }\n        if (ext.childTokens) { // Child tokens to be visited by walkTokens\n          extensions.childTokens[ext.name] = ext.childTokens;\n        }\n      });\n    }\n\n    // ==-- Parse \"overwrite\" extensions --== //\n    if (pack.renderer) {\n      const renderer = marked.defaults.renderer || new Renderer();\n      for (const prop in pack.renderer) {\n        const prevRenderer = renderer[prop];\n        // Replace renderer with func to run extension, but fall back if false\n        renderer[prop] = (...args) => {\n          let ret = pack.renderer[prop].apply(renderer, args);\n          if (ret === false) {\n            ret = prevRenderer.apply(renderer, args);\n          }\n          return ret;\n        };\n      }\n      opts.renderer = renderer;\n    }\n    if (pack.tokenizer) {\n      const tokenizer = marked.defaults.tokenizer || new Tokenizer();\n      for (const prop in pack.tokenizer) {\n        const prevTokenizer = tokenizer[prop];\n        // Replace tokenizer with func to run extension, but fall back if false\n        tokenizer[prop] = (...args) => {\n          let ret = pack.tokenizer[prop].apply(tokenizer, args);\n          if (ret === false) {\n            ret = prevTokenizer.apply(tokenizer, args);\n          }\n          return ret;\n        };\n      }\n      opts.tokenizer = tokenizer;\n    }\n\n    // ==-- Parse WalkTokens extensions --== //\n    if (pack.walkTokens) {\n      const walkTokens = marked.defaults.walkTokens;\n      opts.walkTokens = function(token) {\n        let values = [];\n        values.push(pack.walkTokens.call(this, token));\n        if (walkTokens) {\n          values = values.concat(walkTokens.call(this, token));\n        }\n        return values;\n      };\n    }\n\n    if (hasExtensions) {\n      opts.extensions = extensions;\n    }\n\n    marked.setOptions(opts);\n  });\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens, callback) {\n  let values = [];\n  for (const token of tokens) {\n    values = values.concat(callback.call(marked, token));\n    switch (token.type) {\n      case 'table': {\n        for (const cell of token.header) {\n          values = values.concat(marked.walkTokens(cell.tokens, callback));\n        }\n        for (const row of token.rows) {\n          for (const cell of row) {\n            values = values.concat(marked.walkTokens(cell.tokens, callback));\n          }\n        }\n        break;\n      }\n      case 'list': {\n        values = values.concat(marked.walkTokens(token.items, callback));\n        break;\n      }\n      default: {\n        if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { // Walk any extensions\n          marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {\n            values = values.concat(marked.walkTokens(token[childTokens], callback));\n          });\n        } else if (token.tokens) {\n          values = values.concat(marked.walkTokens(token.tokens, callback));\n        }\n      }\n    }\n  }\n  return values;\n};\n\n/**\n * Parse Inline\n * @param {string} src\n */\nmarked.parseInline = function(src, opt) {\n  // throw error in case of non string input\n  if (typeof src === 'undefined' || src === null) {\n    throw new Error('marked.parseInline(): input parameter is undefined or null');\n  }\n  if (typeof src !== 'string') {\n    throw new Error('marked.parseInline(): input parameter is of type '\n      + Object.prototype.toString.call(src) + ', string expected');\n  }\n\n  opt = merge({}, marked.defaults, opt || {});\n  checkSanitizeDeprecation(opt);\n\n  try {\n    const tokens = Lexer.lexInline(src, opt);\n    if (opt.walkTokens) {\n      marked.walkTokens(tokens, opt.walkTokens);\n    }\n    return Parser.parseInline(tokens, opt);\n  } catch (e) {\n    e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n    if (opt.silent) {\n      return '<p>An error occurred:</p><pre>'\n        + escape(e.message + '', true)\n        + '</pre>';\n    }\n    throw e;\n  }\n};\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.parse = marked;\n\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = Parser.parse;\nconst lexer = Lexer.lex;\n\nexport { Lexer, Parser, Renderer, Slugger, TextRenderer, Tokenizer, defaults, getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n","/*!\n  * vue-router v4.2.5\n  * (c) 2023 Eduardo San Martin Morote\n  * @license MIT\n  */\nimport { getCurrentInstance, inject, onUnmounted, onDeactivated, onActivated, computed, unref, watchEffect, defineComponent, reactive, h, provide, ref, watch, shallowRef, shallowReactive, nextTick } from 'vue';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\nconst isBrowser = typeof window !== 'undefined';\n\nfunction isESModule(obj) {\n    return obj.__esModule || obj[Symbol.toStringTag] === 'Module';\n}\nconst assign = Object.assign;\nfunction applyToParams(fn, params) {\n    const newParams = {};\n    for (const key in params) {\n        const value = params[key];\n        newParams[key] = isArray(value)\n            ? value.map(fn)\n            : fn(value);\n    }\n    return newParams;\n}\nconst noop = () => { };\n/**\n * Typesafe alternative to Array.isArray\n * https://github.com/microsoft/TypeScript/pull/48228\n */\nconst isArray = Array.isArray;\n\nfunction warn(msg) {\n    // avoid using ...args as it breaks in older Edge builds\n    const args = Array.from(arguments).slice(1);\n    console.warn.apply(console, ['[Vue Router warn]: ' + msg].concat(args));\n}\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, '');\n/**\n * Transforms a URI into a normalized history location\n *\n * @param parseQuery\n * @param location - URI to normalize\n * @param currentLocation - current absolute location. Allows resolving relative\n * paths. Must start with `/`. Defaults to `/`\n * @returns a normalized history location\n */\nfunction parseURL(parseQuery, location, currentLocation = '/') {\n    let path, query = {}, searchString = '', hash = '';\n    // Could use URL and URLSearchParams but IE 11 doesn't support it\n    // TODO: move to new URL()\n    const hashPos = location.indexOf('#');\n    let searchPos = location.indexOf('?');\n    // the hash appears before the search, so it's not part of the search string\n    if (hashPos < searchPos && hashPos >= 0) {\n        searchPos = -1;\n    }\n    if (searchPos > -1) {\n        path = location.slice(0, searchPos);\n        searchString = location.slice(searchPos + 1, hashPos > -1 ? hashPos : location.length);\n        query = parseQuery(searchString);\n    }\n    if (hashPos > -1) {\n        path = path || location.slice(0, hashPos);\n        // keep the # character\n        hash = location.slice(hashPos, location.length);\n    }\n    // no search and no query\n    path = resolveRelativePath(path != null ? path : location, currentLocation);\n    // empty path means a relative query or hash `?foo=f`, `#thing`\n    return {\n        fullPath: path + (searchString && '?') + searchString + hash,\n        path,\n        query,\n        hash,\n    };\n}\n/**\n * Stringifies a URL object\n *\n * @param stringifyQuery\n * @param location\n */\nfunction stringifyURL(stringifyQuery, location) {\n    const query = location.query ? stringifyQuery(location.query) : '';\n    return location.path + (query && '?') + query + (location.hash || '');\n}\n/**\n * Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\n *\n * @param pathname - location.pathname\n * @param base - base to strip off\n */\nfunction stripBase(pathname, base) {\n    // no base or base is not found at the beginning\n    if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase()))\n        return pathname;\n    return pathname.slice(base.length) || '/';\n}\n/**\n * Checks if two RouteLocation are equal. This means that both locations are\n * pointing towards the same {@link RouteRecord} and that all `params`, `query`\n * parameters and `hash` are the same\n *\n * @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.\n * @param a - first {@link RouteLocation}\n * @param b - second {@link RouteLocation}\n */\nfunction isSameRouteLocation(stringifyQuery, a, b) {\n    const aLastIndex = a.matched.length - 1;\n    const bLastIndex = b.matched.length - 1;\n    return (aLastIndex > -1 &&\n        aLastIndex === bLastIndex &&\n        isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) &&\n        isSameRouteLocationParams(a.params, b.params) &&\n        stringifyQuery(a.query) === stringifyQuery(b.query) &&\n        a.hash === b.hash);\n}\n/**\n * Check if two `RouteRecords` are equal. Takes into account aliases: they are\n * considered equal to the `RouteRecord` they are aliasing.\n *\n * @param a - first {@link RouteRecord}\n * @param b - second {@link RouteRecord}\n */\nfunction isSameRouteRecord(a, b) {\n    // since the original record has an undefined value for aliasOf\n    // but all aliases point to the original record, this will always compare\n    // the original record\n    return (a.aliasOf || a) === (b.aliasOf || b);\n}\nfunction isSameRouteLocationParams(a, b) {\n    if (Object.keys(a).length !== Object.keys(b).length)\n        return false;\n    for (const key in a) {\n        if (!isSameRouteLocationParamsValue(a[key], b[key]))\n            return false;\n    }\n    return true;\n}\nfunction isSameRouteLocationParamsValue(a, b) {\n    return isArray(a)\n        ? isEquivalentArray(a, b)\n        : isArray(b)\n            ? isEquivalentArray(b, a)\n            : a === b;\n}\n/**\n * Check if two arrays are the same or if an array with one single entry is the\n * same as another primitive value. Used to check query and parameters\n *\n * @param a - array of values\n * @param b - array of values or a single value\n */\nfunction isEquivalentArray(a, b) {\n    return isArray(b)\n        ? a.length === b.length && a.every((value, i) => value === b[i])\n        : a.length === 1 && a[0] === b;\n}\n/**\n * Resolves a relative path that starts with `.`.\n *\n * @param to - path location we are resolving\n * @param from - currentLocation.path, should start with `/`\n */\nfunction resolveRelativePath(to, from) {\n    if (to.startsWith('/'))\n        return to;\n    if ((process.env.NODE_ENV !== 'production') && !from.startsWith('/')) {\n        warn(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\n        return to;\n    }\n    if (!to)\n        return from;\n    const fromSegments = from.split('/');\n    const toSegments = to.split('/');\n    const lastToSegment = toSegments[toSegments.length - 1];\n    // make . and ./ the same (../ === .., ../../ === ../..)\n    // this is the same behavior as new URL()\n    if (lastToSegment === '..' || lastToSegment === '.') {\n        toSegments.push('');\n    }\n    let position = fromSegments.length - 1;\n    let toPosition;\n    let segment;\n    for (toPosition = 0; toPosition < toSegments.length; toPosition++) {\n        segment = toSegments[toPosition];\n        // we stay on the same position\n        if (segment === '.')\n            continue;\n        // go up in the from array\n        if (segment === '..') {\n            // we can't go below zero, but we still need to increment toPosition\n            if (position > 1)\n                position--;\n            // continue\n        }\n        // we reached a non-relative path, we stop here\n        else\n            break;\n    }\n    return (fromSegments.slice(0, position).join('/') +\n        '/' +\n        toSegments\n            // ensure we use at least the last element in the toSegments\n            .slice(toPosition - (toPosition === toSegments.length ? 1 : 0))\n            .join('/'));\n}\n\nvar NavigationType;\n(function (NavigationType) {\n    NavigationType[\"pop\"] = \"pop\";\n    NavigationType[\"push\"] = \"push\";\n})(NavigationType || (NavigationType = {}));\nvar NavigationDirection;\n(function (NavigationDirection) {\n    NavigationDirection[\"back\"] = \"back\";\n    NavigationDirection[\"forward\"] = \"forward\";\n    NavigationDirection[\"unknown\"] = \"\";\n})(NavigationDirection || (NavigationDirection = {}));\n/**\n * Starting location for Histories\n */\nconst START = '';\n// Generic utils\n/**\n * Normalizes a base by removing any trailing slash and reading the base tag if\n * present.\n *\n * @param base - base to normalize\n */\nfunction normalizeBase(base) {\n    if (!base) {\n        if (isBrowser) {\n            // respect <base> tag\n            const baseEl = document.querySelector('base');\n            base = (baseEl && baseEl.getAttribute('href')) || '/';\n            // strip full URL origin\n            base = base.replace(/^\\w+:\\/\\/[^\\/]+/, '');\n        }\n        else {\n            base = '/';\n        }\n    }\n    // ensure leading slash when it was removed by the regex above avoid leading\n    // slash with hash because the file could be read from the disk like file://\n    // and the leading slash would cause problems\n    if (base[0] !== '/' && base[0] !== '#')\n        base = '/' + base;\n    // remove the trailing slash so all other method can just do `base + fullPath`\n    // to build an href\n    return removeTrailingSlash(base);\n}\n// remove any character before the hash\nconst BEFORE_HASH_RE = /^[^#]+#/;\nfunction createHref(base, location) {\n    return base.replace(BEFORE_HASH_RE, '#') + location;\n}\n\nfunction getElementPosition(el, offset) {\n    const docRect = document.documentElement.getBoundingClientRect();\n    const elRect = el.getBoundingClientRect();\n    return {\n        behavior: offset.behavior,\n        left: elRect.left - docRect.left - (offset.left || 0),\n        top: elRect.top - docRect.top - (offset.top || 0),\n    };\n}\nconst computeScrollPosition = () => ({\n    left: window.pageXOffset,\n    top: window.pageYOffset,\n});\nfunction scrollToPosition(position) {\n    let scrollToOptions;\n    if ('el' in position) {\n        const positionEl = position.el;\n        const isIdSelector = typeof positionEl === 'string' && positionEl.startsWith('#');\n        /**\n         * `id`s can accept pretty much any characters, including CSS combinators\n         * like `>` or `~`. It's still possible to retrieve elements using\n         * `document.getElementById('~')` but it needs to be escaped when using\n         * `document.querySelector('#\\\\~')` for it to be valid. The only\n         * requirements for `id`s are them to be unique on the page and to not be\n         * empty (`id=\"\"`). Because of that, when passing an id selector, it should\n         * be properly escaped for it to work with `querySelector`. We could check\n         * for the id selector to be simple (no CSS combinators `+ >~`) but that\n         * would make things inconsistent since they are valid characters for an\n         * `id` but would need to be escaped when using `querySelector`, breaking\n         * their usage and ending up in no selector returned. Selectors need to be\n         * escaped:\n         *\n         * - `#1-thing` becomes `#\\31 -thing`\n         * - `#with~symbols` becomes `#with\\\\~symbols`\n         *\n         * - More information about  the topic can be found at\n         *   https://mathiasbynens.be/notes/html5-id-class.\n         * - Practical example: https://mathiasbynens.be/demo/html5-id\n         */\n        if ((process.env.NODE_ENV !== 'production') && typeof position.el === 'string') {\n            if (!isIdSelector || !document.getElementById(position.el.slice(1))) {\n                try {\n                    const foundEl = document.querySelector(position.el);\n                    if (isIdSelector && foundEl) {\n                        warn(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\n                        // return to avoid other warnings\n                        return;\n                    }\n                }\n                catch (err) {\n                    warn(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\n                    // return to avoid other warnings\n                    return;\n                }\n            }\n        }\n        const el = typeof positionEl === 'string'\n            ? isIdSelector\n                ? document.getElementById(positionEl.slice(1))\n                : document.querySelector(positionEl)\n            : positionEl;\n        if (!el) {\n            (process.env.NODE_ENV !== 'production') &&\n                warn(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\n            return;\n        }\n        scrollToOptions = getElementPosition(el, position);\n    }\n    else {\n        scrollToOptions = position;\n    }\n    if ('scrollBehavior' in document.documentElement.style)\n        window.scrollTo(scrollToOptions);\n    else {\n        window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.pageXOffset, scrollToOptions.top != null ? scrollToOptions.top : window.pageYOffset);\n    }\n}\nfunction getScrollKey(path, delta) {\n    const position = history.state ? history.state.position - delta : -1;\n    return position + path;\n}\nconst scrollPositions = new Map();\nfunction saveScrollPosition(key, scrollPosition) {\n    scrollPositions.set(key, scrollPosition);\n}\nfunction getSavedScrollPosition(key) {\n    const scroll = scrollPositions.get(key);\n    // consume it so it's not used again\n    scrollPositions.delete(key);\n    return scroll;\n}\n// TODO: RFC about how to save scroll position\n/**\n * ScrollBehavior instance used by the router to compute and restore the scroll\n * position when navigating.\n */\n// export interface ScrollHandler<ScrollPositionEntry extends HistoryStateValue, ScrollPosition extends ScrollPositionEntry> {\n//   // returns a scroll position that can be saved in history\n//   compute(): ScrollPositionEntry\n//   // can take an extended ScrollPositionEntry\n//   scroll(position: ScrollPosition): void\n// }\n// export const scrollHandler: ScrollHandler<ScrollPosition> = {\n//   compute: computeScroll,\n//   scroll: scrollToPosition,\n// }\n\nlet createBaseLocation = () => location.protocol + '//' + location.host;\n/**\n * Creates a normalized history location from a window.location object\n * @param base - The base path\n * @param location - The window.location object\n */\nfunction createCurrentLocation(base, location) {\n    const { pathname, search, hash } = location;\n    // allows hash bases like #, /#, #/, #!, #!/, /#!/, or even /folder#end\n    const hashPos = base.indexOf('#');\n    if (hashPos > -1) {\n        let slicePos = hash.includes(base.slice(hashPos))\n            ? base.slice(hashPos).length\n            : 1;\n        let pathFromHash = hash.slice(slicePos);\n        // prepend the starting slash to hash so the url starts with /#\n        if (pathFromHash[0] !== '/')\n            pathFromHash = '/' + pathFromHash;\n        return stripBase(pathFromHash, '');\n    }\n    const path = stripBase(pathname, base);\n    return path + search + hash;\n}\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\n    let listeners = [];\n    let teardowns = [];\n    // TODO: should it be a stack? a Dict. Check if the popstate listener\n    // can trigger twice\n    let pauseState = null;\n    const popStateHandler = ({ state, }) => {\n        const to = createCurrentLocation(base, location);\n        const from = currentLocation.value;\n        const fromState = historyState.value;\n        let delta = 0;\n        if (state) {\n            currentLocation.value = to;\n            historyState.value = state;\n            // ignore the popstate and reset the pauseState\n            if (pauseState && pauseState === from) {\n                pauseState = null;\n                return;\n            }\n            delta = fromState ? state.position - fromState.position : 0;\n        }\n        else {\n            replace(to);\n        }\n        // Here we could also revert the navigation by calling history.go(-delta)\n        // this listener will have to be adapted to not trigger again and to wait for the url\n        // to be updated before triggering the listeners. Some kind of validation function would also\n        // need to be passed to the listeners so the navigation can be accepted\n        // call all listeners\n        listeners.forEach(listener => {\n            listener(currentLocation.value, from, {\n                delta,\n                type: NavigationType.pop,\n                direction: delta\n                    ? delta > 0\n                        ? NavigationDirection.forward\n                        : NavigationDirection.back\n                    : NavigationDirection.unknown,\n            });\n        });\n    };\n    function pauseListeners() {\n        pauseState = currentLocation.value;\n    }\n    function listen(callback) {\n        // set up the listener and prepare teardown callbacks\n        listeners.push(callback);\n        const teardown = () => {\n            const index = listeners.indexOf(callback);\n            if (index > -1)\n                listeners.splice(index, 1);\n        };\n        teardowns.push(teardown);\n        return teardown;\n    }\n    function beforeUnloadListener() {\n        const { history } = window;\n        if (!history.state)\n            return;\n        history.replaceState(assign({}, history.state, { scroll: computeScrollPosition() }), '');\n    }\n    function destroy() {\n        for (const teardown of teardowns)\n            teardown();\n        teardowns = [];\n        window.removeEventListener('popstate', popStateHandler);\n        window.removeEventListener('beforeunload', beforeUnloadListener);\n    }\n    // set up the listeners and prepare teardown callbacks\n    window.addEventListener('popstate', popStateHandler);\n    // TODO: could we use 'pagehide' or 'visibilitychange' instead?\n    // https://developer.chrome.com/blog/page-lifecycle-api/\n    window.addEventListener('beforeunload', beforeUnloadListener, {\n        passive: true,\n    });\n    return {\n        pauseListeners,\n        listen,\n        destroy,\n    };\n}\n/**\n * Creates a state object\n */\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\n    return {\n        back,\n        current,\n        forward,\n        replaced,\n        position: window.history.length,\n        scroll: computeScroll ? computeScrollPosition() : null,\n    };\n}\nfunction useHistoryStateNavigation(base) {\n    const { history, location } = window;\n    // private variables\n    const currentLocation = {\n        value: createCurrentLocation(base, location),\n    };\n    const historyState = { value: history.state };\n    // build current history entry as this is a fresh navigation\n    if (!historyState.value) {\n        changeLocation(currentLocation.value, {\n            back: null,\n            current: currentLocation.value,\n            forward: null,\n            // the length is off by one, we need to decrease it\n            position: history.length - 1,\n            replaced: true,\n            // don't add a scroll as the user may have an anchor, and we want\n            // scrollBehavior to be triggered without a saved position\n            scroll: null,\n        }, true);\n    }\n    function changeLocation(to, state, replace) {\n        /**\n         * if a base tag is provided, and we are on a normal domain, we have to\n         * respect the provided `base` attribute because pushState() will use it and\n         * potentially erase anything before the `#` like at\n         * https://github.com/vuejs/router/issues/685 where a base of\n         * `/folder/#` but a base of `/` would erase the `/folder/` section. If\n         * there is no host, the `<base>` tag makes no sense and if there isn't a\n         * base tag we can just use everything after the `#`.\n         */\n        const hashIndex = base.indexOf('#');\n        const url = hashIndex > -1\n            ? (location.host && document.querySelector('base')\n                ? base\n                : base.slice(hashIndex)) + to\n            : createBaseLocation() + base + to;\n        try {\n            // BROWSER QUIRK\n            // NOTE: Safari throws a SecurityError when calling this function 100 times in 30 seconds\n            history[replace ? 'replaceState' : 'pushState'](state, '', url);\n            historyState.value = state;\n        }\n        catch (err) {\n            if ((process.env.NODE_ENV !== 'production')) {\n                warn('Error with push/replace State', err);\n            }\n            else {\n                console.error(err);\n            }\n            // Force the navigation, this also resets the call count\n            location[replace ? 'replace' : 'assign'](url);\n        }\n    }\n    function replace(to, data) {\n        const state = assign({}, history.state, buildState(historyState.value.back, \n        // keep back and forward entries but override current position\n        to, historyState.value.forward, true), data, { position: historyState.value.position });\n        changeLocation(to, state, true);\n        currentLocation.value = to;\n    }\n    function push(to, data) {\n        // Add to current entry the information of where we are going\n        // as well as saving the current position\n        const currentState = assign({}, \n        // use current history state to gracefully handle a wrong call to\n        // history.replaceState\n        // https://github.com/vuejs/router/issues/366\n        historyState.value, history.state, {\n            forward: to,\n            scroll: computeScrollPosition(),\n        });\n        if ((process.env.NODE_ENV !== 'production') && !history.state) {\n            warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\n` +\n                `history.replaceState(history.state, '', url)\\n\\n` +\n                `You can find more information at https://next.router.vuejs.org/guide/migration/#usage-of-history-state.`);\n        }\n        changeLocation(currentState.current, currentState, true);\n        const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data);\n        changeLocation(to, state, false);\n        currentLocation.value = to;\n    }\n    return {\n        location: currentLocation,\n        state: historyState,\n        push,\n        replace,\n    };\n}\n/**\n * Creates an HTML5 history. Most common history for single page applications.\n *\n * @param base -\n */\nfunction createWebHistory(base) {\n    base = normalizeBase(base);\n    const historyNavigation = useHistoryStateNavigation(base);\n    const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\n    function go(delta, triggerListeners = true) {\n        if (!triggerListeners)\n            historyListeners.pauseListeners();\n        history.go(delta);\n    }\n    const routerHistory = assign({\n        // it's overridden right after\n        location: '',\n        base,\n        go,\n        createHref: createHref.bind(null, base),\n    }, historyNavigation, historyListeners);\n    Object.defineProperty(routerHistory, 'location', {\n        enumerable: true,\n        get: () => historyNavigation.location.value,\n    });\n    Object.defineProperty(routerHistory, 'state', {\n        enumerable: true,\n        get: () => historyNavigation.state.value,\n    });\n    return routerHistory;\n}\n\n/**\n * Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\n * It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\n *\n * @param base - Base applied to all urls, defaults to '/'\n * @returns a history object that can be passed to the router constructor\n */\nfunction createMemoryHistory(base = '') {\n    let listeners = [];\n    let queue = [START];\n    let position = 0;\n    base = normalizeBase(base);\n    function setLocation(location) {\n        position++;\n        if (position !== queue.length) {\n            // we are in the middle, we remove everything from here in the queue\n            queue.splice(position);\n        }\n        queue.push(location);\n    }\n    function triggerListeners(to, from, { direction, delta }) {\n        const info = {\n            direction,\n            delta,\n            type: NavigationType.pop,\n        };\n        for (const callback of listeners) {\n            callback(to, from, info);\n        }\n    }\n    const routerHistory = {\n        // rewritten by Object.defineProperty\n        location: START,\n        // TODO: should be kept in queue\n        state: {},\n        base,\n        createHref: createHref.bind(null, base),\n        replace(to) {\n            // remove current entry and decrement position\n            queue.splice(position--, 1);\n            setLocation(to);\n        },\n        push(to, data) {\n            setLocation(to);\n        },\n        listen(callback) {\n            listeners.push(callback);\n            return () => {\n                const index = listeners.indexOf(callback);\n                if (index > -1)\n                    listeners.splice(index, 1);\n            };\n        },\n        destroy() {\n            listeners = [];\n            queue = [START];\n            position = 0;\n        },\n        go(delta, shouldTrigger = true) {\n            const from = this.location;\n            const direction = \n            // we are considering delta === 0 going forward, but in abstract mode\n            // using 0 for the delta doesn't make sense like it does in html5 where\n            // it reloads the page\n            delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\n            position = Math.max(0, Math.min(position + delta, queue.length - 1));\n            if (shouldTrigger) {\n                triggerListeners(this.location, from, {\n                    direction,\n                    delta,\n                });\n            }\n        },\n    };\n    Object.defineProperty(routerHistory, 'location', {\n        enumerable: true,\n        get: () => queue[position],\n    });\n    return routerHistory;\n}\n\n/**\n * Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\n * handle any URL is not possible.\n *\n * @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\n * in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\n * calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\n * after the `#`).\n *\n * @example\n * ```js\n * // at https://example.com/folder\n * createWebHashHistory() // gives a url of `https://example.com/folder#`\n * createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\n * // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\n * createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\n * // you should avoid doing this because it changes the original url and breaks copying urls\n * createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\n *\n * // at file:///usr/etc/folder/index.html\n * // for locations with no `host`, the base is ignored\n * createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\n * ```\n */\nfunction createWebHashHistory(base) {\n    // Make sure this implementation is fine in terms of encoding, specially for IE11\n    // for `file://`, directly use the pathname and ignore the base\n    // location.pathname contains an initial `/` even at the root: `https://example.com`\n    base = location.host ? base || location.pathname + location.search : '';\n    // allow the user to provide a `#` in the middle: `/base/#/app`\n    if (!base.includes('#'))\n        base += '#';\n    if ((process.env.NODE_ENV !== 'production') && !base.endsWith('#/') && !base.endsWith('#')) {\n        warn(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, '#')}\".`);\n    }\n    return createWebHistory(base);\n}\n\nfunction isRouteLocation(route) {\n    return typeof route === 'string' || (route && typeof route === 'object');\n}\nfunction isRouteName(name) {\n    return typeof name === 'string' || typeof name === 'symbol';\n}\n\n/**\n * Initial route location where the router is. Can be used in navigation guards\n * to differentiate the initial navigation.\n *\n * @example\n * ```js\n * import { START_LOCATION } from 'vue-router'\n *\n * router.beforeEach((to, from) => {\n *   if (from === START_LOCATION) {\n *     // initial navigation\n *   }\n * })\n * ```\n */\nconst START_LOCATION_NORMALIZED = {\n    path: '/',\n    name: undefined,\n    params: {},\n    query: {},\n    hash: '',\n    fullPath: '/',\n    matched: [],\n    meta: {},\n    redirectedFrom: undefined,\n};\n\nconst NavigationFailureSymbol = Symbol((process.env.NODE_ENV !== 'production') ? 'navigation failure' : '');\n/**\n * Enumeration with all possible types for navigation failures. Can be passed to\n * {@link isNavigationFailure} to check for specific failures.\n */\nvar NavigationFailureType;\n(function (NavigationFailureType) {\n    /**\n     * An aborted navigation is a navigation that failed because a navigation\n     * guard returned `false` or called `next(false)`\n     */\n    NavigationFailureType[NavigationFailureType[\"aborted\"] = 4] = \"aborted\";\n    /**\n     * A cancelled navigation is a navigation that failed because a more recent\n     * navigation finished started (not necessarily finished).\n     */\n    NavigationFailureType[NavigationFailureType[\"cancelled\"] = 8] = \"cancelled\";\n    /**\n     * A duplicated navigation is a navigation that failed because it was\n     * initiated while already being at the exact same location.\n     */\n    NavigationFailureType[NavigationFailureType[\"duplicated\"] = 16] = \"duplicated\";\n})(NavigationFailureType || (NavigationFailureType = {}));\n// DEV only debug messages\nconst ErrorTypeMessages = {\n    [1 /* ErrorTypes.MATCHER_NOT_FOUND */]({ location, currentLocation }) {\n        return `No match for\\n ${JSON.stringify(location)}${currentLocation\n            ? '\\nwhile being at\\n' + JSON.stringify(currentLocation)\n            : ''}`;\n    },\n    [2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */]({ from, to, }) {\n        return `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\n    },\n    [4 /* ErrorTypes.NAVIGATION_ABORTED */]({ from, to }) {\n        return `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\n    },\n    [8 /* ErrorTypes.NAVIGATION_CANCELLED */]({ from, to }) {\n        return `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\n    },\n    [16 /* ErrorTypes.NAVIGATION_DUPLICATED */]({ from, to }) {\n        return `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\n    },\n};\nfunction createRouterError(type, params) {\n    // keep full error messages in cjs versions\n    if ((process.env.NODE_ENV !== 'production') || !true) {\n        return assign(new Error(ErrorTypeMessages[type](params)), {\n            type,\n            [NavigationFailureSymbol]: true,\n        }, params);\n    }\n    else {\n        return assign(new Error(), {\n            type,\n            [NavigationFailureSymbol]: true,\n        }, params);\n    }\n}\nfunction isNavigationFailure(error, type) {\n    return (error instanceof Error &&\n        NavigationFailureSymbol in error &&\n        (type == null || !!(error.type & type)));\n}\nconst propertiesToLog = ['params', 'query', 'hash'];\nfunction stringifyRoute(to) {\n    if (typeof to === 'string')\n        return to;\n    if ('path' in to)\n        return to.path;\n    const location = {};\n    for (const key of propertiesToLog) {\n        if (key in to)\n            location[key] = to[key];\n    }\n    return JSON.stringify(location, null, 2);\n}\n\n// default pattern for a param: non-greedy everything but /\nconst BASE_PARAM_PATTERN = '[^/]+?';\nconst BASE_PATH_PARSER_OPTIONS = {\n    sensitive: false,\n    strict: false,\n    start: true,\n    end: true,\n};\n// Special Regex characters that must be escaped in static tokens\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\n/**\n * Creates a path parser from an array of Segments (a segment is an array of Tokens)\n *\n * @param segments - array of segments returned by tokenizePath\n * @param extraOptions - optional options for the regexp\n * @returns a PathParser\n */\nfunction tokensToParser(segments, extraOptions) {\n    const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\n    // the amount of scores is the same as the length of segments except for the root segment \"/\"\n    const score = [];\n    // the regexp as a string\n    let pattern = options.start ? '^' : '';\n    // extracted keys\n    const keys = [];\n    for (const segment of segments) {\n        // the root segment needs special treatment\n        const segmentScores = segment.length ? [] : [90 /* PathScore.Root */];\n        // allow trailing slash\n        if (options.strict && !segment.length)\n            pattern += '/';\n        for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\n            const token = segment[tokenIndex];\n            // resets the score if we are inside a sub-segment /:a-other-:b\n            let subSegmentScore = 40 /* PathScore.Segment */ +\n                (options.sensitive ? 0.25 /* PathScore.BonusCaseSensitive */ : 0);\n            if (token.type === 0 /* TokenType.Static */) {\n                // prepend the slash if we are starting a new segment\n                if (!tokenIndex)\n                    pattern += '/';\n                pattern += token.value.replace(REGEX_CHARS_RE, '\\\\$&');\n                subSegmentScore += 40 /* PathScore.Static */;\n            }\n            else if (token.type === 1 /* TokenType.Param */) {\n                const { value, repeatable, optional, regexp } = token;\n                keys.push({\n                    name: value,\n                    repeatable,\n                    optional,\n                });\n                const re = regexp ? regexp : BASE_PARAM_PATTERN;\n                // the user provided a custom regexp /:id(\\\\d+)\n                if (re !== BASE_PARAM_PATTERN) {\n                    subSegmentScore += 10 /* PathScore.BonusCustomRegExp */;\n                    // make sure the regexp is valid before using it\n                    try {\n                        new RegExp(`(${re})`);\n                    }\n                    catch (err) {\n                        throw new Error(`Invalid custom RegExp for param \"${value}\" (${re}): ` +\n                            err.message);\n                    }\n                }\n                // when we repeat we must take care of the repeating leading slash\n                let subPattern = repeatable ? `((?:${re})(?:/(?:${re}))*)` : `(${re})`;\n                // prepend the slash if we are starting a new segment\n                if (!tokenIndex)\n                    subPattern =\n                        // avoid an optional / if there are more segments e.g. /:p?-static\n                        // or /:p?-:p2\n                        optional && segment.length < 2\n                            ? `(?:/${subPattern})`\n                            : '/' + subPattern;\n                if (optional)\n                    subPattern += '?';\n                pattern += subPattern;\n                subSegmentScore += 20 /* PathScore.Dynamic */;\n                if (optional)\n                    subSegmentScore += -8 /* PathScore.BonusOptional */;\n                if (repeatable)\n                    subSegmentScore += -20 /* PathScore.BonusRepeatable */;\n                if (re === '.*')\n                    subSegmentScore += -50 /* PathScore.BonusWildcard */;\n            }\n            segmentScores.push(subSegmentScore);\n        }\n        // an empty array like /home/ -> [[{home}], []]\n        // if (!segment.length) pattern += '/'\n        score.push(segmentScores);\n    }\n    // only apply the strict bonus to the last score\n    if (options.strict && options.end) {\n        const i = score.length - 1;\n        score[i][score[i].length - 1] += 0.7000000000000001 /* PathScore.BonusStrict */;\n    }\n    // TODO: dev only warn double trailing slash\n    if (!options.strict)\n        pattern += '/?';\n    if (options.end)\n        pattern += '$';\n    // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else\n    else if (options.strict)\n        pattern += '(?:/|$)';\n    const re = new RegExp(pattern, options.sensitive ? '' : 'i');\n    function parse(path) {\n        const match = path.match(re);\n        const params = {};\n        if (!match)\n            return null;\n        for (let i = 1; i < match.length; i++) {\n            const value = match[i] || '';\n            const key = keys[i - 1];\n            params[key.name] = value && key.repeatable ? value.split('/') : value;\n        }\n        return params;\n    }\n    function stringify(params) {\n        let path = '';\n        // for optional parameters to allow to be empty\n        let avoidDuplicatedSlash = false;\n        for (const segment of segments) {\n            if (!avoidDuplicatedSlash || !path.endsWith('/'))\n                path += '/';\n            avoidDuplicatedSlash = false;\n            for (const token of segment) {\n                if (token.type === 0 /* TokenType.Static */) {\n                    path += token.value;\n                }\n                else if (token.type === 1 /* TokenType.Param */) {\n                    const { value, repeatable, optional } = token;\n                    const param = value in params ? params[value] : '';\n                    if (isArray(param) && !repeatable) {\n                        throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\n                    }\n                    const text = isArray(param)\n                        ? param.join('/')\n                        : param;\n                    if (!text) {\n                        if (optional) {\n                            // if we have more than one optional param like /:a?-static we don't need to care about the optional param\n                            if (segment.length < 2) {\n                                // remove the last slash as we could be at the end\n                                if (path.endsWith('/'))\n                                    path = path.slice(0, -1);\n                                // do not append a slash on the next iteration\n                                else\n                                    avoidDuplicatedSlash = true;\n                            }\n                        }\n                        else\n                            throw new Error(`Missing required param \"${value}\"`);\n                    }\n                    path += text;\n                }\n            }\n        }\n        // avoid empty path when we have multiple optional params\n        return path || '/';\n    }\n    return {\n        re,\n        score,\n        keys,\n        parse,\n        stringify,\n    };\n}\n/**\n * Compares an array of numbers as used in PathParser.score and returns a\n * number. This function can be used to `sort` an array\n *\n * @param a - first array of numbers\n * @param b - second array of numbers\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n * should be sorted first\n */\nfunction compareScoreArray(a, b) {\n    let i = 0;\n    while (i < a.length && i < b.length) {\n        const diff = b[i] - a[i];\n        // only keep going if diff === 0\n        if (diff)\n            return diff;\n        i++;\n    }\n    // if the last subsegment was Static, the shorter segments should be sorted first\n    // otherwise sort the longest segment first\n    if (a.length < b.length) {\n        return a.length === 1 && a[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n            ? -1\n            : 1;\n    }\n    else if (a.length > b.length) {\n        return b.length === 1 && b[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n            ? 1\n            : -1;\n    }\n    return 0;\n}\n/**\n * Compare function that can be used with `sort` to sort an array of PathParser\n *\n * @param a - first PathParser\n * @param b - second PathParser\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n */\nfunction comparePathParserScore(a, b) {\n    let i = 0;\n    const aScore = a.score;\n    const bScore = b.score;\n    while (i < aScore.length && i < bScore.length) {\n        const comp = compareScoreArray(aScore[i], bScore[i]);\n        // do not return if both are equal\n        if (comp)\n            return comp;\n        i++;\n    }\n    if (Math.abs(bScore.length - aScore.length) === 1) {\n        if (isLastScoreNegative(aScore))\n            return 1;\n        if (isLastScoreNegative(bScore))\n            return -1;\n    }\n    // if a and b share the same score entries but b has more, sort b first\n    return bScore.length - aScore.length;\n    // this is the ternary version\n    // return aScore.length < bScore.length\n    //   ? 1\n    //   : aScore.length > bScore.length\n    //   ? -1\n    //   : 0\n}\n/**\n * This allows detecting splats at the end of a path: /home/:id(.*)*\n *\n * @param score - score to check\n * @returns true if the last entry is negative\n */\nfunction isLastScoreNegative(score) {\n    const last = score[score.length - 1];\n    return score.length > 0 && last[last.length - 1] < 0;\n}\n\nconst ROOT_TOKEN = {\n    type: 0 /* TokenType.Static */,\n    value: '',\n};\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\n// After some profiling, the cache seems to be unnecessary because tokenizePath\n// (the slowest part of adding a route) is very fast\n// const tokenCache = new Map<string, Token[][]>()\nfunction tokenizePath(path) {\n    if (!path)\n        return [[]];\n    if (path === '/')\n        return [[ROOT_TOKEN]];\n    if (!path.startsWith('/')) {\n        throw new Error((process.env.NODE_ENV !== 'production')\n            ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".`\n            : `Invalid path \"${path}\"`);\n    }\n    // if (tokenCache.has(path)) return tokenCache.get(path)!\n    function crash(message) {\n        throw new Error(`ERR (${state})/\"${buffer}\": ${message}`);\n    }\n    let state = 0 /* TokenizerState.Static */;\n    let previousState = state;\n    const tokens = [];\n    // the segment will always be valid because we get into the initial state\n    // with the leading /\n    let segment;\n    function finalizeSegment() {\n        if (segment)\n            tokens.push(segment);\n        segment = [];\n    }\n    // index on the path\n    let i = 0;\n    // char at index\n    let char;\n    // buffer of the value read\n    let buffer = '';\n    // custom regexp for a param\n    let customRe = '';\n    function consumeBuffer() {\n        if (!buffer)\n            return;\n        if (state === 0 /* TokenizerState.Static */) {\n            segment.push({\n                type: 0 /* TokenType.Static */,\n                value: buffer,\n            });\n        }\n        else if (state === 1 /* TokenizerState.Param */ ||\n            state === 2 /* TokenizerState.ParamRegExp */ ||\n            state === 3 /* TokenizerState.ParamRegExpEnd */) {\n            if (segment.length > 1 && (char === '*' || char === '+'))\n                crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\n            segment.push({\n                type: 1 /* TokenType.Param */,\n                value: buffer,\n                regexp: customRe,\n                repeatable: char === '*' || char === '+',\n                optional: char === '*' || char === '?',\n            });\n        }\n        else {\n            crash('Invalid state to consume buffer');\n        }\n        buffer = '';\n    }\n    function addCharToBuffer() {\n        buffer += char;\n    }\n    while (i < path.length) {\n        char = path[i++];\n        if (char === '\\\\' && state !== 2 /* TokenizerState.ParamRegExp */) {\n            previousState = state;\n            state = 4 /* TokenizerState.EscapeNext */;\n            continue;\n        }\n        switch (state) {\n            case 0 /* TokenizerState.Static */:\n                if (char === '/') {\n                    if (buffer) {\n                        consumeBuffer();\n                    }\n                    finalizeSegment();\n                }\n                else if (char === ':') {\n                    consumeBuffer();\n                    state = 1 /* TokenizerState.Param */;\n                }\n                else {\n                    addCharToBuffer();\n                }\n                break;\n            case 4 /* TokenizerState.EscapeNext */:\n                addCharToBuffer();\n                state = previousState;\n                break;\n            case 1 /* TokenizerState.Param */:\n                if (char === '(') {\n                    state = 2 /* TokenizerState.ParamRegExp */;\n                }\n                else if (VALID_PARAM_RE.test(char)) {\n                    addCharToBuffer();\n                }\n                else {\n                    consumeBuffer();\n                    state = 0 /* TokenizerState.Static */;\n                    // go back one character if we were not modifying\n                    if (char !== '*' && char !== '?' && char !== '+')\n                        i--;\n                }\n                break;\n            case 2 /* TokenizerState.ParamRegExp */:\n                // TODO: is it worth handling nested regexp? like :p(?:prefix_([^/]+)_suffix)\n                // it already works by escaping the closing )\n                // https://paths.esm.dev/?p=AAMeJbiAwQEcDKbAoAAkP60PG2R6QAvgNaA6AFACM2ABuQBB#\n                // is this really something people need since you can also write\n                // /prefix_:p()_suffix\n                if (char === ')') {\n                    // handle the escaped )\n                    if (customRe[customRe.length - 1] == '\\\\')\n                        customRe = customRe.slice(0, -1) + char;\n                    else\n                        state = 3 /* TokenizerState.ParamRegExpEnd */;\n                }\n                else {\n                    customRe += char;\n                }\n                break;\n            case 3 /* TokenizerState.ParamRegExpEnd */:\n                // same as finalizing a param\n                consumeBuffer();\n                state = 0 /* TokenizerState.Static */;\n                // go back one character if we were not modifying\n                if (char !== '*' && char !== '?' && char !== '+')\n                    i--;\n                customRe = '';\n                break;\n            default:\n                crash('Unknown state');\n                break;\n        }\n    }\n    if (state === 2 /* TokenizerState.ParamRegExp */)\n        crash(`Unfinished custom RegExp for param \"${buffer}\"`);\n    consumeBuffer();\n    finalizeSegment();\n    // tokenCache.set(path, tokens)\n    return tokens;\n}\n\nfunction createRouteRecordMatcher(record, parent, options) {\n    const parser = tokensToParser(tokenizePath(record.path), options);\n    // warn against params with the same name\n    if ((process.env.NODE_ENV !== 'production')) {\n        const existingKeys = new Set();\n        for (const key of parser.keys) {\n            if (existingKeys.has(key.name))\n                warn(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\n            existingKeys.add(key.name);\n        }\n    }\n    const matcher = assign(parser, {\n        record,\n        parent,\n        // these needs to be populated by the parent\n        children: [],\n        alias: [],\n    });\n    if (parent) {\n        // both are aliases or both are not aliases\n        // we don't want to mix them because the order is used when\n        // passing originalRecord in Matcher.addRoute\n        if (!matcher.record.aliasOf === !parent.record.aliasOf)\n            parent.children.push(matcher);\n    }\n    return matcher;\n}\n\n/**\n * Creates a Router Matcher.\n *\n * @internal\n * @param routes - array of initial routes\n * @param globalOptions - global route options\n */\nfunction createRouterMatcher(routes, globalOptions) {\n    // normalized ordered array of matchers\n    const matchers = [];\n    const matcherMap = new Map();\n    globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions);\n    function getRecordMatcher(name) {\n        return matcherMap.get(name);\n    }\n    function addRoute(record, parent, originalRecord) {\n        // used later on to remove by name\n        const isRootAdd = !originalRecord;\n        const mainNormalizedRecord = normalizeRouteRecord(record);\n        if ((process.env.NODE_ENV !== 'production')) {\n            checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\n        }\n        // we might be the child of an alias\n        mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\n        const options = mergeOptions(globalOptions, record);\n        // generate an array of records to correctly handle aliases\n        const normalizedRecords = [\n            mainNormalizedRecord,\n        ];\n        if ('alias' in record) {\n            const aliases = typeof record.alias === 'string' ? [record.alias] : record.alias;\n            for (const alias of aliases) {\n                normalizedRecords.push(assign({}, mainNormalizedRecord, {\n                    // this allows us to hold a copy of the `components` option\n                    // so that async components cache is hold on the original record\n                    components: originalRecord\n                        ? originalRecord.record.components\n                        : mainNormalizedRecord.components,\n                    path: alias,\n                    // we might be the child of an alias\n                    aliasOf: originalRecord\n                        ? originalRecord.record\n                        : mainNormalizedRecord,\n                    // the aliases are always of the same kind as the original since they\n                    // are defined on the same record\n                }));\n            }\n        }\n        let matcher;\n        let originalMatcher;\n        for (const normalizedRecord of normalizedRecords) {\n            const { path } = normalizedRecord;\n            // Build up the path for nested routes if the child isn't an absolute\n            // route. Only add the / delimiter if the child path isn't empty and if the\n            // parent path doesn't have a trailing slash\n            if (parent && path[0] !== '/') {\n                const parentPath = parent.record.path;\n                const connectingSlash = parentPath[parentPath.length - 1] === '/' ? '' : '/';\n                normalizedRecord.path =\n                    parent.record.path + (path && connectingSlash + path);\n            }\n            if ((process.env.NODE_ENV !== 'production') && normalizedRecord.path === '*') {\n                throw new Error('Catch all routes (\"*\") must now be defined using a param with a custom regexp.\\n' +\n                    'See more at https://next.router.vuejs.org/guide/migration/#removed-star-or-catch-all-routes.');\n            }\n            // create the object beforehand, so it can be passed to children\n            matcher = createRouteRecordMatcher(normalizedRecord, parent, options);\n            if ((process.env.NODE_ENV !== 'production') && parent && path[0] === '/')\n                checkMissingParamsInAbsolutePath(matcher, parent);\n            // if we are an alias we must tell the original record that we exist,\n            // so we can be removed\n            if (originalRecord) {\n                originalRecord.alias.push(matcher);\n                if ((process.env.NODE_ENV !== 'production')) {\n                    checkSameParams(originalRecord, matcher);\n                }\n            }\n            else {\n                // otherwise, the first record is the original and others are aliases\n                originalMatcher = originalMatcher || matcher;\n                if (originalMatcher !== matcher)\n                    originalMatcher.alias.push(matcher);\n                // remove the route if named and only for the top record (avoid in nested calls)\n                // this works because the original record is the first one\n                if (isRootAdd && record.name && !isAliasRecord(matcher))\n                    removeRoute(record.name);\n            }\n            if (mainNormalizedRecord.children) {\n                const children = mainNormalizedRecord.children;\n                for (let i = 0; i < children.length; i++) {\n                    addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\n                }\n            }\n            // if there was no original record, then the first one was not an alias and all\n            // other aliases (if any) need to reference this record when adding children\n            originalRecord = originalRecord || matcher;\n            // TODO: add normalized records for more flexibility\n            // if (parent && isAliasRecord(originalRecord)) {\n            //   parent.children.push(originalRecord)\n            // }\n            // Avoid adding a record that doesn't display anything. This allows passing through records without a component to\n            // not be reached and pass through the catch all route\n            if ((matcher.record.components &&\n                Object.keys(matcher.record.components).length) ||\n                matcher.record.name ||\n                matcher.record.redirect) {\n                insertMatcher(matcher);\n            }\n        }\n        return originalMatcher\n            ? () => {\n                // since other matchers are aliases, they should be removed by the original matcher\n                removeRoute(originalMatcher);\n            }\n            : noop;\n    }\n    function removeRoute(matcherRef) {\n        if (isRouteName(matcherRef)) {\n            const matcher = matcherMap.get(matcherRef);\n            if (matcher) {\n                matcherMap.delete(matcherRef);\n                matchers.splice(matchers.indexOf(matcher), 1);\n                matcher.children.forEach(removeRoute);\n                matcher.alias.forEach(removeRoute);\n            }\n        }\n        else {\n            const index = matchers.indexOf(matcherRef);\n            if (index > -1) {\n                matchers.splice(index, 1);\n                if (matcherRef.record.name)\n                    matcherMap.delete(matcherRef.record.name);\n                matcherRef.children.forEach(removeRoute);\n                matcherRef.alias.forEach(removeRoute);\n            }\n        }\n    }\n    function getRoutes() {\n        return matchers;\n    }\n    function insertMatcher(matcher) {\n        let i = 0;\n        while (i < matchers.length &&\n            comparePathParserScore(matcher, matchers[i]) >= 0 &&\n            // Adding children with empty path should still appear before the parent\n            // https://github.com/vuejs/router/issues/1124\n            (matcher.record.path !== matchers[i].record.path ||\n                !isRecordChildOf(matcher, matchers[i])))\n            i++;\n        matchers.splice(i, 0, matcher);\n        // only add the original record to the name map\n        if (matcher.record.name && !isAliasRecord(matcher))\n            matcherMap.set(matcher.record.name, matcher);\n    }\n    function resolve(location, currentLocation) {\n        let matcher;\n        let params = {};\n        let path;\n        let name;\n        if ('name' in location && location.name) {\n            matcher = matcherMap.get(location.name);\n            if (!matcher)\n                throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n                    location,\n                });\n            // warn if the user is passing invalid params so they can debug it better when they get removed\n            if ((process.env.NODE_ENV !== 'production')) {\n                const invalidParams = Object.keys(location.params || {}).filter(paramName => !matcher.keys.find(k => k.name === paramName));\n                if (invalidParams.length) {\n                    warn(`Discarded invalid param(s) \"${invalidParams.join('\", \"')}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\n                }\n            }\n            name = matcher.record.name;\n            params = assign(\n            // paramsFromLocation is a new object\n            paramsFromLocation(currentLocation.params, \n            // only keep params that exist in the resolved location\n            // TODO: only keep optional params coming from a parent record\n            matcher.keys.filter(k => !k.optional).map(k => k.name)), \n            // discard any existing params in the current location that do not exist here\n            // #1497 this ensures better active/exact matching\n            location.params &&\n                paramsFromLocation(location.params, matcher.keys.map(k => k.name)));\n            // throws if cannot be stringified\n            path = matcher.stringify(params);\n        }\n        else if ('path' in location) {\n            // no need to resolve the path with the matcher as it was provided\n            // this also allows the user to control the encoding\n            path = location.path;\n            if ((process.env.NODE_ENV !== 'production') && !path.startsWith('/')) {\n                warn(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);\n            }\n            matcher = matchers.find(m => m.re.test(path));\n            // matcher should have a value after the loop\n            if (matcher) {\n                // we know the matcher works because we tested the regexp\n                params = matcher.parse(path);\n                name = matcher.record.name;\n            }\n            // location is a relative path\n        }\n        else {\n            // match by name or path of current route\n            matcher = currentLocation.name\n                ? matcherMap.get(currentLocation.name)\n                : matchers.find(m => m.re.test(currentLocation.path));\n            if (!matcher)\n                throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n                    location,\n                    currentLocation,\n                });\n            name = matcher.record.name;\n            // since we are navigating to the same location, we don't need to pick the\n            // params like when `name` is provided\n            params = assign({}, currentLocation.params, location.params);\n            path = matcher.stringify(params);\n        }\n        const matched = [];\n        let parentMatcher = matcher;\n        while (parentMatcher) {\n            // reversed order so parents are at the beginning\n            matched.unshift(parentMatcher.record);\n            parentMatcher = parentMatcher.parent;\n        }\n        return {\n            name,\n            path,\n            params,\n            matched,\n            meta: mergeMetaFields(matched),\n        };\n    }\n    // add initial routes\n    routes.forEach(route => addRoute(route));\n    return { addRoute, resolve, removeRoute, getRoutes, getRecordMatcher };\n}\nfunction paramsFromLocation(params, keys) {\n    const newParams = {};\n    for (const key of keys) {\n        if (key in params)\n            newParams[key] = params[key];\n    }\n    return newParams;\n}\n/**\n * Normalizes a RouteRecordRaw. Creates a copy\n *\n * @param record\n * @returns the normalized version\n */\nfunction normalizeRouteRecord(record) {\n    return {\n        path: record.path,\n        redirect: record.redirect,\n        name: record.name,\n        meta: record.meta || {},\n        aliasOf: undefined,\n        beforeEnter: record.beforeEnter,\n        props: normalizeRecordProps(record),\n        children: record.children || [],\n        instances: {},\n        leaveGuards: new Set(),\n        updateGuards: new Set(),\n        enterCallbacks: {},\n        components: 'components' in record\n            ? record.components || null\n            : record.component && { default: record.component },\n    };\n}\n/**\n * Normalize the optional `props` in a record to always be an object similar to\n * components. Also accept a boolean for components.\n * @param record\n */\nfunction normalizeRecordProps(record) {\n    const propsObject = {};\n    // props does not exist on redirect records, but we can set false directly\n    const props = record.props || false;\n    if ('component' in record) {\n        propsObject.default = props;\n    }\n    else {\n        // NOTE: we could also allow a function to be applied to every component.\n        // Would need user feedback for use cases\n        for (const name in record.components)\n            propsObject[name] = typeof props === 'object' ? props[name] : props;\n    }\n    return propsObject;\n}\n/**\n * Checks if a record or any of its parent is an alias\n * @param record\n */\nfunction isAliasRecord(record) {\n    while (record) {\n        if (record.record.aliasOf)\n            return true;\n        record = record.parent;\n    }\n    return false;\n}\n/**\n * Merge meta fields of an array of records\n *\n * @param matched - array of matched records\n */\nfunction mergeMetaFields(matched) {\n    return matched.reduce((meta, record) => assign(meta, record.meta), {});\n}\nfunction mergeOptions(defaults, partialOptions) {\n    const options = {};\n    for (const key in defaults) {\n        options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\n    }\n    return options;\n}\nfunction isSameParam(a, b) {\n    return (a.name === b.name &&\n        a.optional === b.optional &&\n        a.repeatable === b.repeatable);\n}\n/**\n * Check if a path and its alias have the same required params\n *\n * @param a - original record\n * @param b - alias record\n */\nfunction checkSameParams(a, b) {\n    for (const key of a.keys) {\n        if (!key.optional && !b.keys.find(isSameParam.bind(null, key)))\n            return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n    }\n    for (const key of b.keys) {\n        if (!key.optional && !a.keys.find(isSameParam.bind(null, key)))\n            return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n    }\n}\n/**\n * A route with a name and a child with an empty path without a name should warn when adding the route\n *\n * @param mainNormalizedRecord - RouteRecordNormalized\n * @param parent - RouteRecordMatcher\n */\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\n    if (parent &&\n        parent.record.name &&\n        !mainNormalizedRecord.name &&\n        !mainNormalizedRecord.path) {\n        warn(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\n    }\n}\nfunction checkMissingParamsInAbsolutePath(record, parent) {\n    for (const key of parent.keys) {\n        if (!record.keys.find(isSameParam.bind(null, key)))\n            return warn(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\n    }\n}\nfunction isRecordChildOf(record, parent) {\n    return parent.children.some(child => child === record || isRecordChildOf(record, child));\n}\n\n/**\n * Encoding Rules ␣ = Space Path: ␣ \" < > # ? { } Query: ␣ \" < > # & = Hash: ␣ \"\n * < > `\n *\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\n * defines some extra characters to be encoded. Most browsers do not encode them\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\n * plus `-._~`. This extra safety should be applied to query by patching the\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\n * encoded everywhere because some browsers like FF encode it when directly\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\n */\n// const EXTRA_RESERVED_RE = /[!'()*]/g\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\nconst HASH_RE = /#/g; // %23\nconst AMPERSAND_RE = /&/g; // %26\nconst SLASH_RE = /\\//g; // %2F\nconst EQUAL_RE = /=/g; // %3D\nconst IM_RE = /\\?/g; // %3F\nconst PLUS_RE = /\\+/g; // %2B\n/**\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\n * seems to be less flexible than not doing so and I can't find out the legacy\n * systems requiring this for regular requests like text/html. In the standard,\n * the encoding of the plus character is only mentioned for\n * application/x-www-form-urlencoded\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\n * leave the plus character as is in queries. To be more flexible, we allow the\n * plus character on the query, but it can also be manually encoded by the user.\n *\n * Resources:\n * - https://url.spec.whatwg.org/#urlencoded-parsing\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\n */\nconst ENC_BRACKET_OPEN_RE = /%5B/g; // [\nconst ENC_BRACKET_CLOSE_RE = /%5D/g; // ]\nconst ENC_CARET_RE = /%5E/g; // ^\nconst ENC_BACKTICK_RE = /%60/g; // `\nconst ENC_CURLY_OPEN_RE = /%7B/g; // {\nconst ENC_PIPE_RE = /%7C/g; // |\nconst ENC_CURLY_CLOSE_RE = /%7D/g; // }\nconst ENC_SPACE_RE = /%20/g; // }\n/**\n * Encode characters that need to be encoded on the path, search and hash\n * sections of the URL.\n *\n * @internal\n * @param text - string to encode\n * @returns encoded string\n */\nfunction commonEncode(text) {\n    return encodeURI('' + text)\n        .replace(ENC_PIPE_RE, '|')\n        .replace(ENC_BRACKET_OPEN_RE, '[')\n        .replace(ENC_BRACKET_CLOSE_RE, ']');\n}\n/**\n * Encode characters that need to be encoded on the hash section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeHash(text) {\n    return commonEncode(text)\n        .replace(ENC_CURLY_OPEN_RE, '{')\n        .replace(ENC_CURLY_CLOSE_RE, '}')\n        .replace(ENC_CARET_RE, '^');\n}\n/**\n * Encode characters that need to be encoded query values on the query\n * section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeQueryValue(text) {\n    return (commonEncode(text)\n        // Encode the space as +, encode the + to differentiate it from the space\n        .replace(PLUS_RE, '%2B')\n        .replace(ENC_SPACE_RE, '+')\n        .replace(HASH_RE, '%23')\n        .replace(AMPERSAND_RE, '%26')\n        .replace(ENC_BACKTICK_RE, '`')\n        .replace(ENC_CURLY_OPEN_RE, '{')\n        .replace(ENC_CURLY_CLOSE_RE, '}')\n        .replace(ENC_CARET_RE, '^'));\n}\n/**\n * Like `encodeQueryValue` but also encodes the `=` character.\n *\n * @param text - string to encode\n */\nfunction encodeQueryKey(text) {\n    return encodeQueryValue(text).replace(EQUAL_RE, '%3D');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodePath(text) {\n    return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL as a\n * param. This function encodes everything {@link encodePath} does plus the\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\n * string instead.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeParam(text) {\n    return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F');\n}\n/**\n * Decode text using `decodeURIComponent`. Returns the original text if it\n * fails.\n *\n * @param text - string to decode\n * @returns decoded string\n */\nfunction decode(text) {\n    try {\n        return decodeURIComponent('' + text);\n    }\n    catch (err) {\n        (process.env.NODE_ENV !== 'production') && warn(`Error decoding \"${text}\". Using original value`);\n    }\n    return '' + text;\n}\n\n/**\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\n * version with the leading `?` and without Should work as URLSearchParams\n\n * @internal\n *\n * @param search - search string to parse\n * @returns a query object\n */\nfunction parseQuery(search) {\n    const query = {};\n    // avoid creating an object with an empty key and empty value\n    // because of split('&')\n    if (search === '' || search === '?')\n        return query;\n    const hasLeadingIM = search[0] === '?';\n    const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\n    for (let i = 0; i < searchParams.length; ++i) {\n        // pre decode the + into space\n        const searchParam = searchParams[i].replace(PLUS_RE, ' ');\n        // allow the = character\n        const eqPos = searchParam.indexOf('=');\n        const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n        const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n        if (key in query) {\n            // an extra variable for ts types\n            let currentValue = query[key];\n            if (!isArray(currentValue)) {\n                currentValue = query[key] = [currentValue];\n            }\n            currentValue.push(value);\n        }\n        else {\n            query[key] = value;\n        }\n    }\n    return query;\n}\n/**\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\n * doesn't prepend a `?`\n *\n * @internal\n *\n * @param query - query object to stringify\n * @returns string version of the query without the leading `?`\n */\nfunction stringifyQuery(query) {\n    let search = '';\n    for (let key in query) {\n        const value = query[key];\n        key = encodeQueryKey(key);\n        if (value == null) {\n            // only null adds the value\n            if (value !== undefined) {\n                search += (search.length ? '&' : '') + key;\n            }\n            continue;\n        }\n        // keep null values\n        const values = isArray(value)\n            ? value.map(v => v && encodeQueryValue(v))\n            : [value && encodeQueryValue(value)];\n        values.forEach(value => {\n            // skip undefined values in arrays as if they were not present\n            // smaller code than using filter\n            if (value !== undefined) {\n                // only append & with non-empty search\n                search += (search.length ? '&' : '') + key;\n                if (value != null)\n                    search += '=' + value;\n            }\n        });\n    }\n    return search;\n}\n/**\n * Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\n * numbers into strings, removing keys with an undefined value and replacing\n * undefined with null in arrays\n *\n * @param query - query object to normalize\n * @returns a normalized query object\n */\nfunction normalizeQuery(query) {\n    const normalizedQuery = {};\n    for (const key in query) {\n        const value = query[key];\n        if (value !== undefined) {\n            normalizedQuery[key] = isArray(value)\n                ? value.map(v => (v == null ? null : '' + v))\n                : value == null\n                    ? value\n                    : '' + value;\n        }\n    }\n    return normalizedQuery;\n}\n\n/**\n * RouteRecord being rendered by the closest ancestor Router View. Used for\n * `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\n * Location Matched\n *\n * @internal\n */\nconst matchedRouteKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location matched' : '');\n/**\n * Allows overriding the router view depth to control which component in\n * `matched` is rendered. rvd stands for Router View Depth\n *\n * @internal\n */\nconst viewDepthKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view depth' : '');\n/**\n * Allows overriding the router instance returned by `useRouter` in tests. r\n * stands for router\n *\n * @internal\n */\nconst routerKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router' : '');\n/**\n * Allows overriding the current route returned by `useRoute` in tests. rl\n * stands for route location\n *\n * @internal\n */\nconst routeLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'route location' : '');\n/**\n * Allows overriding the current route used by router-view. Internally this is\n * used when the `route` prop is passed.\n *\n * @internal\n */\nconst routerViewLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location' : '');\n\n/**\n * Create a list of callbacks that can be reset. Used to create before and after navigation guards list\n */\nfunction useCallbacks() {\n    let handlers = [];\n    function add(handler) {\n        handlers.push(handler);\n        return () => {\n            const i = handlers.indexOf(handler);\n            if (i > -1)\n                handlers.splice(i, 1);\n        };\n    }\n    function reset() {\n        handlers = [];\n    }\n    return {\n        add,\n        list: () => handlers.slice(),\n        reset,\n    };\n}\n\nfunction registerGuard(record, name, guard) {\n    const removeFromList = () => {\n        record[name].delete(guard);\n    };\n    onUnmounted(removeFromList);\n    onDeactivated(removeFromList);\n    onActivated(() => {\n        record[name].add(guard);\n    });\n    record[name].add(guard);\n}\n/**\n * Add a navigation guard that triggers whenever the component for the current\n * location is about to be left. Similar to {@link beforeRouteLeave} but can be\n * used in any component. The guard is removed when the component is unmounted.\n *\n * @param leaveGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteLeave(leaveGuard) {\n    if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n        warn('getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function');\n        return;\n    }\n    const activeRecord = inject(matchedRouteKey, \n    // to avoid warning\n    {}).value;\n    if (!activeRecord) {\n        (process.env.NODE_ENV !== 'production') &&\n            warn('No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n        return;\n    }\n    registerGuard(activeRecord, 'leaveGuards', leaveGuard);\n}\n/**\n * Add a navigation guard that triggers whenever the current location is about\n * to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\n * component. The guard is removed when the component is unmounted.\n *\n * @param updateGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteUpdate(updateGuard) {\n    if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n        warn('getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function');\n        return;\n    }\n    const activeRecord = inject(matchedRouteKey, \n    // to avoid warning\n    {}).value;\n    if (!activeRecord) {\n        (process.env.NODE_ENV !== 'production') &&\n            warn('No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n        return;\n    }\n    registerGuard(activeRecord, 'updateGuards', updateGuard);\n}\nfunction guardToPromiseFn(guard, to, from, record, name) {\n    // keep a reference to the enterCallbackArray to prevent pushing callbacks if a new navigation took place\n    const enterCallbackArray = record &&\n        // name is defined if record is because of the function overload\n        (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\n    return () => new Promise((resolve, reject) => {\n        const next = (valid) => {\n            if (valid === false) {\n                reject(createRouterError(4 /* ErrorTypes.NAVIGATION_ABORTED */, {\n                    from,\n                    to,\n                }));\n            }\n            else if (valid instanceof Error) {\n                reject(valid);\n            }\n            else if (isRouteLocation(valid)) {\n                reject(createRouterError(2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */, {\n                    from: to,\n                    to: valid,\n                }));\n            }\n            else {\n                if (enterCallbackArray &&\n                    // since enterCallbackArray is truthy, both record and name also are\n                    record.enterCallbacks[name] === enterCallbackArray &&\n                    typeof valid === 'function') {\n                    enterCallbackArray.push(valid);\n                }\n                resolve();\n            }\n        };\n        // wrapping with Promise.resolve allows it to work with both async and sync guards\n        const guardReturn = guard.call(record && record.instances[name], to, from, (process.env.NODE_ENV !== 'production') ? canOnlyBeCalledOnce(next, to, from) : next);\n        let guardCall = Promise.resolve(guardReturn);\n        if (guard.length < 3)\n            guardCall = guardCall.then(next);\n        if ((process.env.NODE_ENV !== 'production') && guard.length > 2) {\n            const message = `The \"next\" callback was never called inside of ${guard.name ? '\"' + guard.name + '\"' : ''}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\n            if (typeof guardReturn === 'object' && 'then' in guardReturn) {\n                guardCall = guardCall.then(resolvedValue => {\n                    // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n                    if (!next._called) {\n                        warn(message);\n                        return Promise.reject(new Error('Invalid navigation guard'));\n                    }\n                    return resolvedValue;\n                });\n            }\n            else if (guardReturn !== undefined) {\n                // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n                if (!next._called) {\n                    warn(message);\n                    reject(new Error('Invalid navigation guard'));\n                    return;\n                }\n            }\n        }\n        guardCall.catch(err => reject(err));\n    });\n}\nfunction canOnlyBeCalledOnce(next, to, from) {\n    let called = 0;\n    return function () {\n        if (called++ === 1)\n            warn(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\n        // @ts-expect-error: we put it in the original one because it's easier to check\n        next._called = true;\n        if (called === 1)\n            next.apply(null, arguments);\n    };\n}\nfunction extractComponentsGuards(matched, guardType, to, from) {\n    const guards = [];\n    for (const record of matched) {\n        if ((process.env.NODE_ENV !== 'production') && !record.components && !record.children.length) {\n            warn(`Record with path \"${record.path}\" is either missing a \"component(s)\"` +\n                ` or \"children\" property.`);\n        }\n        for (const name in record.components) {\n            let rawComponent = record.components[name];\n            if ((process.env.NODE_ENV !== 'production')) {\n                if (!rawComponent ||\n                    (typeof rawComponent !== 'object' &&\n                        typeof rawComponent !== 'function')) {\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is not` +\n                        ` a valid component. Received \"${String(rawComponent)}\".`);\n                    // throw to ensure we stop here but warn to ensure the message isn't\n                    // missed by the user\n                    throw new Error('Invalid route component');\n                }\n                else if ('then' in rawComponent) {\n                    // warn if user wrote import('/component.vue') instead of () =>\n                    // import('./component.vue')\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is a ` +\n                        `Promise instead of a function that returns a Promise. Did you ` +\n                        `write \"import('./MyPage.vue')\" instead of ` +\n                        `\"() => import('./MyPage.vue')\" ? This will break in ` +\n                        `production if not fixed.`);\n                    const promise = rawComponent;\n                    rawComponent = () => promise;\n                }\n                else if (rawComponent.__asyncLoader &&\n                    // warn only once per component\n                    !rawComponent.__warnedDefineAsync) {\n                    rawComponent.__warnedDefineAsync = true;\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is defined ` +\n                        `using \"defineAsyncComponent()\". ` +\n                        `Write \"() => import('./MyPage.vue')\" instead of ` +\n                        `\"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\n                }\n            }\n            // skip update and leave guards if the route component is not mounted\n            if (guardType !== 'beforeRouteEnter' && !record.instances[name])\n                continue;\n            if (isRouteComponent(rawComponent)) {\n                // __vccOpts is added by vue-class-component and contain the regular options\n                const options = rawComponent.__vccOpts || rawComponent;\n                const guard = options[guardType];\n                guard && guards.push(guardToPromiseFn(guard, to, from, record, name));\n            }\n            else {\n                // start requesting the chunk already\n                let componentPromise = rawComponent();\n                if ((process.env.NODE_ENV !== 'production') && !('catch' in componentPromise)) {\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\n                    componentPromise = Promise.resolve(componentPromise);\n                }\n                guards.push(() => componentPromise.then(resolved => {\n                    if (!resolved)\n                        return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`));\n                    const resolvedComponent = isESModule(resolved)\n                        ? resolved.default\n                        : resolved;\n                    // replace the function with the resolved component\n                    // cannot be null or undefined because we went into the for loop\n                    record.components[name] = resolvedComponent;\n                    // __vccOpts is added by vue-class-component and contain the regular options\n                    const options = resolvedComponent.__vccOpts || resolvedComponent;\n                    const guard = options[guardType];\n                    return guard && guardToPromiseFn(guard, to, from, record, name)();\n                }));\n            }\n        }\n    }\n    return guards;\n}\n/**\n * Allows differentiating lazy components from functional components and vue-class-component\n * @internal\n *\n * @param component\n */\nfunction isRouteComponent(component) {\n    return (typeof component === 'object' ||\n        'displayName' in component ||\n        'props' in component ||\n        '__vccOpts' in component);\n}\n/**\n * Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\n *\n * @param route - resolved route to load\n */\nfunction loadRouteLocation(route) {\n    return route.matched.every(record => record.redirect)\n        ? Promise.reject(new Error('Cannot load a route that redirects.'))\n        : Promise.all(route.matched.map(record => record.components &&\n            Promise.all(Object.keys(record.components).reduce((promises, name) => {\n                const rawComponent = record.components[name];\n                if (typeof rawComponent === 'function' &&\n                    !('displayName' in rawComponent)) {\n                    promises.push(rawComponent().then(resolved => {\n                        if (!resolved)\n                            return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\n                        const resolvedComponent = isESModule(resolved)\n                            ? resolved.default\n                            : resolved;\n                        // replace the function with the resolved component\n                        // cannot be null or undefined because we went into the for loop\n                        record.components[name] = resolvedComponent;\n                        return;\n                    }));\n                }\n                return promises;\n            }, [])))).then(() => route);\n}\n\n// TODO: we could allow currentRoute as a prop to expose `isActive` and\n// `isExactActive` behavior should go through an RFC\nfunction useLink(props) {\n    const router = inject(routerKey);\n    const currentRoute = inject(routeLocationKey);\n    const route = computed(() => router.resolve(unref(props.to)));\n    const activeRecordIndex = computed(() => {\n        const { matched } = route.value;\n        const { length } = matched;\n        const routeMatched = matched[length - 1];\n        const currentMatched = currentRoute.matched;\n        if (!routeMatched || !currentMatched.length)\n            return -1;\n        const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n        if (index > -1)\n            return index;\n        // possible parent record\n        const parentRecordPath = getOriginalPath(matched[length - 2]);\n        return (\n        // we are dealing with nested routes\n        length > 1 &&\n            // if the parent and matched route have the same path, this link is\n            // referring to the empty child. Or we currently are on a different\n            // child of the same parent\n            getOriginalPath(routeMatched) === parentRecordPath &&\n            // avoid comparing the child with its parent\n            currentMatched[currentMatched.length - 1].path !== parentRecordPath\n            ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2]))\n            : index);\n    });\n    const isActive = computed(() => activeRecordIndex.value > -1 &&\n        includesParams(currentRoute.params, route.value.params));\n    const isExactActive = computed(() => activeRecordIndex.value > -1 &&\n        activeRecordIndex.value === currentRoute.matched.length - 1 &&\n        isSameRouteLocationParams(currentRoute.params, route.value.params));\n    function navigate(e = {}) {\n        if (guardEvent(e)) {\n            return router[unref(props.replace) ? 'replace' : 'push'](unref(props.to)\n            // avoid uncaught errors are they are logged anyway\n            ).catch(noop);\n        }\n        return Promise.resolve();\n    }\n    // devtools only\n    if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n        const instance = getCurrentInstance();\n        if (instance) {\n            const linkContextDevtools = {\n                route: route.value,\n                isActive: isActive.value,\n                isExactActive: isExactActive.value,\n            };\n            // @ts-expect-error: this is internal\n            instance.__vrl_devtools = instance.__vrl_devtools || [];\n            // @ts-expect-error: this is internal\n            instance.__vrl_devtools.push(linkContextDevtools);\n            watchEffect(() => {\n                linkContextDevtools.route = route.value;\n                linkContextDevtools.isActive = isActive.value;\n                linkContextDevtools.isExactActive = isExactActive.value;\n            }, { flush: 'post' });\n        }\n    }\n    /**\n     * NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\n     */\n    return {\n        route,\n        href: computed(() => route.value.href),\n        isActive,\n        isExactActive,\n        navigate,\n    };\n}\nconst RouterLinkImpl = /*#__PURE__*/ defineComponent({\n    name: 'RouterLink',\n    compatConfig: { MODE: 3 },\n    props: {\n        to: {\n            type: [String, Object],\n            required: true,\n        },\n        replace: Boolean,\n        activeClass: String,\n        // inactiveClass: String,\n        exactActiveClass: String,\n        custom: Boolean,\n        ariaCurrentValue: {\n            type: String,\n            default: 'page',\n        },\n    },\n    useLink,\n    setup(props, { slots }) {\n        const link = reactive(useLink(props));\n        const { options } = inject(routerKey);\n        const elClass = computed(() => ({\n            [getLinkClass(props.activeClass, options.linkActiveClass, 'router-link-active')]: link.isActive,\n            // [getLinkClass(\n            //   props.inactiveClass,\n            //   options.linkInactiveClass,\n            //   'router-link-inactive'\n            // )]: !link.isExactActive,\n            [getLinkClass(props.exactActiveClass, options.linkExactActiveClass, 'router-link-exact-active')]: link.isExactActive,\n        }));\n        return () => {\n            const children = slots.default && slots.default(link);\n            return props.custom\n                ? children\n                : h('a', {\n                    'aria-current': link.isExactActive\n                        ? props.ariaCurrentValue\n                        : null,\n                    href: link.href,\n                    // this would override user added attrs but Vue will still add\n                    // the listener, so we end up triggering both\n                    onClick: link.navigate,\n                    class: elClass.value,\n                }, children);\n        };\n    },\n});\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to render a link that triggers a navigation on click.\n */\nconst RouterLink = RouterLinkImpl;\nfunction guardEvent(e) {\n    // don't redirect with control keys\n    if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n        return;\n    // don't redirect when preventDefault called\n    if (e.defaultPrevented)\n        return;\n    // don't redirect on right click\n    if (e.button !== undefined && e.button !== 0)\n        return;\n    // don't redirect if `target=\"_blank\"`\n    // @ts-expect-error getAttribute does exist\n    if (e.currentTarget && e.currentTarget.getAttribute) {\n        // @ts-expect-error getAttribute exists\n        const target = e.currentTarget.getAttribute('target');\n        if (/\\b_blank\\b/i.test(target))\n            return;\n    }\n    // this may be a Weex event which doesn't have this method\n    if (e.preventDefault)\n        e.preventDefault();\n    return true;\n}\nfunction includesParams(outer, inner) {\n    for (const key in inner) {\n        const innerValue = inner[key];\n        const outerValue = outer[key];\n        if (typeof innerValue === 'string') {\n            if (innerValue !== outerValue)\n                return false;\n        }\n        else {\n            if (!isArray(outerValue) ||\n                outerValue.length !== innerValue.length ||\n                innerValue.some((value, i) => value !== outerValue[i]))\n                return false;\n        }\n    }\n    return true;\n}\n/**\n * Get the original path value of a record by following its aliasOf\n * @param record\n */\nfunction getOriginalPath(record) {\n    return record ? (record.aliasOf ? record.aliasOf.path : record.path) : '';\n}\n/**\n * Utility class to get the active class based on defaults.\n * @param propClass\n * @param globalClass\n * @param defaultClass\n */\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null\n    ? propClass\n    : globalClass != null\n        ? globalClass\n        : defaultClass;\n\nconst RouterViewImpl = /*#__PURE__*/ defineComponent({\n    name: 'RouterView',\n    // #674 we manually inherit them\n    inheritAttrs: false,\n    props: {\n        name: {\n            type: String,\n            default: 'default',\n        },\n        route: Object,\n    },\n    // Better compat for @vue/compat users\n    // https://github.com/vuejs/router/issues/1315\n    compatConfig: { MODE: 3 },\n    setup(props, { attrs, slots }) {\n        (process.env.NODE_ENV !== 'production') && warnDeprecatedUsage();\n        const injectedRoute = inject(routerViewLocationKey);\n        const routeToDisplay = computed(() => props.route || injectedRoute.value);\n        const injectedDepth = inject(viewDepthKey, 0);\n        // The depth changes based on empty components option, which allows passthrough routes e.g. routes with children\n        // that are used to reuse the `path` property\n        const depth = computed(() => {\n            let initialDepth = unref(injectedDepth);\n            const { matched } = routeToDisplay.value;\n            let matchedRoute;\n            while ((matchedRoute = matched[initialDepth]) &&\n                !matchedRoute.components) {\n                initialDepth++;\n            }\n            return initialDepth;\n        });\n        const matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);\n        provide(viewDepthKey, computed(() => depth.value + 1));\n        provide(matchedRouteKey, matchedRouteRef);\n        provide(routerViewLocationKey, routeToDisplay);\n        const viewRef = ref();\n        // watch at the same time the component instance, the route record we are\n        // rendering, and the name\n        watch(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => {\n            // copy reused instances\n            if (to) {\n                // this will update the instance for new instances as well as reused\n                // instances when navigating to a new route\n                to.instances[name] = instance;\n                // the component instance is reused for a different route or name, so\n                // we copy any saved update or leave guards. With async setup, the\n                // mounting component will mount before the matchedRoute changes,\n                // making instance === oldInstance, so we check if guards have been\n                // added before. This works because we remove guards when\n                // unmounting/deactivating components\n                if (from && from !== to && instance && instance === oldInstance) {\n                    if (!to.leaveGuards.size) {\n                        to.leaveGuards = from.leaveGuards;\n                    }\n                    if (!to.updateGuards.size) {\n                        to.updateGuards = from.updateGuards;\n                    }\n                }\n            }\n            // trigger beforeRouteEnter next callbacks\n            if (instance &&\n                to &&\n                // if there is no instance but to and from are the same this might be\n                // the first visit\n                (!from || !isSameRouteRecord(to, from) || !oldInstance)) {\n                (to.enterCallbacks[name] || []).forEach(callback => callback(instance));\n            }\n        }, { flush: 'post' });\n        return () => {\n            const route = routeToDisplay.value;\n            // we need the value at the time we render because when we unmount, we\n            // navigated to a different location so the value is different\n            const currentName = props.name;\n            const matchedRoute = matchedRouteRef.value;\n            const ViewComponent = matchedRoute && matchedRoute.components[currentName];\n            if (!ViewComponent) {\n                return normalizeSlot(slots.default, { Component: ViewComponent, route });\n            }\n            // props from route configuration\n            const routePropsOption = matchedRoute.props[currentName];\n            const routeProps = routePropsOption\n                ? routePropsOption === true\n                    ? route.params\n                    : typeof routePropsOption === 'function'\n                        ? routePropsOption(route)\n                        : routePropsOption\n                : null;\n            const onVnodeUnmounted = vnode => {\n                // remove the instance reference to prevent leak\n                if (vnode.component.isUnmounted) {\n                    matchedRoute.instances[currentName] = null;\n                }\n            };\n            const component = h(ViewComponent, assign({}, routeProps, attrs, {\n                onVnodeUnmounted,\n                ref: viewRef,\n            }));\n            if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) &&\n                isBrowser &&\n                component.ref) {\n                // TODO: can display if it's an alias, its props\n                const info = {\n                    depth: depth.value,\n                    name: matchedRoute.name,\n                    path: matchedRoute.path,\n                    meta: matchedRoute.meta,\n                };\n                const internalInstances = isArray(component.ref)\n                    ? component.ref.map(r => r.i)\n                    : [component.ref.i];\n                internalInstances.forEach(instance => {\n                    // @ts-expect-error\n                    instance.__vrv_devtools = info;\n                });\n            }\n            return (\n            // pass the vnode to the slot as a prop.\n            // h and <component :is=\"...\"> both accept vnodes\n            normalizeSlot(slots.default, { Component: component, route }) ||\n                component);\n        };\n    },\n});\nfunction normalizeSlot(slot, data) {\n    if (!slot)\n        return null;\n    const slotContent = slot(data);\n    return slotContent.length === 1 ? slotContent[0] : slotContent;\n}\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to display the current route the user is at.\n */\nconst RouterView = RouterViewImpl;\n// warn against deprecated usage with <transition> & <keep-alive>\n// due to functional component being no longer eager in Vue 3\nfunction warnDeprecatedUsage() {\n    const instance = getCurrentInstance();\n    const parentName = instance.parent && instance.parent.type.name;\n    const parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;\n    if (parentName &&\n        (parentName === 'KeepAlive' || parentName.includes('Transition')) &&\n        typeof parentSubTreeType === 'object' &&\n        parentSubTreeType.name === 'RouterView') {\n        const comp = parentName === 'KeepAlive' ? 'keep-alive' : 'transition';\n        warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\\n` +\n            `Use slot props instead:\\n\\n` +\n            `<router-view v-slot=\"{ Component }\">\\n` +\n            `  <${comp}>\\n` +\n            `    <component :is=\"Component\" />\\n` +\n            `  </${comp}>\\n` +\n            `</router-view>`);\n    }\n}\n\n/**\n * Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\n *\n * @param routeLocation - routeLocation to format\n * @param tooltip - optional tooltip\n * @returns a copy of the routeLocation\n */\nfunction formatRouteLocation(routeLocation, tooltip) {\n    const copy = assign({}, routeLocation, {\n        // remove variables that can contain vue instances\n        matched: routeLocation.matched.map(matched => omit(matched, ['instances', 'children', 'aliasOf'])),\n    });\n    return {\n        _custom: {\n            type: null,\n            readOnly: true,\n            display: routeLocation.fullPath,\n            tooltip,\n            value: copy,\n        },\n    };\n}\nfunction formatDisplay(display) {\n    return {\n        _custom: {\n            display,\n        },\n    };\n}\n// to support multiple router instances\nlet routerId = 0;\nfunction addDevtools(app, router, matcher) {\n    // Take over router.beforeEach and afterEach\n    // make sure we are not registering the devtool twice\n    if (router.__hasDevtools)\n        return;\n    router.__hasDevtools = true;\n    // increment to support multiple router instances\n    const id = routerId++;\n    setupDevtoolsPlugin({\n        id: 'org.vuejs.router' + (id ? '.' + id : ''),\n        label: 'Vue Router',\n        packageName: 'vue-router',\n        homepage: 'https://router.vuejs.org',\n        logo: 'https://router.vuejs.org/logo.png',\n        componentStateTypes: ['Routing'],\n        app,\n    }, api => {\n        if (typeof api.now !== 'function') {\n            console.warn('[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\n        }\n        // display state added by the router\n        api.on.inspectComponent((payload, ctx) => {\n            if (payload.instanceData) {\n                payload.instanceData.state.push({\n                    type: 'Routing',\n                    key: '$route',\n                    editable: false,\n                    value: formatRouteLocation(router.currentRoute.value, 'Current Route'),\n                });\n            }\n        });\n        // mark router-link as active and display tags on router views\n        api.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\n            if (componentInstance.__vrv_devtools) {\n                const info = componentInstance.__vrv_devtools;\n                node.tags.push({\n                    label: (info.name ? `${info.name.toString()}: ` : '') + info.path,\n                    textColor: 0,\n                    tooltip: 'This component is rendered by &lt;router-view&gt;',\n                    backgroundColor: PINK_500,\n                });\n            }\n            // if multiple useLink are used\n            if (isArray(componentInstance.__vrl_devtools)) {\n                componentInstance.__devtoolsApi = api;\n                componentInstance.__vrl_devtools.forEach(devtoolsData => {\n                    let backgroundColor = ORANGE_400;\n                    let tooltip = '';\n                    if (devtoolsData.isExactActive) {\n                        backgroundColor = LIME_500;\n                        tooltip = 'This is exactly active';\n                    }\n                    else if (devtoolsData.isActive) {\n                        backgroundColor = BLUE_600;\n                        tooltip = 'This link is active';\n                    }\n                    node.tags.push({\n                        label: devtoolsData.route.path,\n                        textColor: 0,\n                        tooltip,\n                        backgroundColor,\n                    });\n                });\n            }\n        });\n        watch(router.currentRoute, () => {\n            // refresh active state\n            refreshRoutesView();\n            api.notifyComponentUpdate();\n            api.sendInspectorTree(routerInspectorId);\n            api.sendInspectorState(routerInspectorId);\n        });\n        const navigationsLayerId = 'router:navigations:' + id;\n        api.addTimelineLayer({\n            id: navigationsLayerId,\n            label: `Router${id ? ' ' + id : ''} Navigations`,\n            color: 0x40a8c4,\n        });\n        // const errorsLayerId = 'router:errors'\n        // api.addTimelineLayer({\n        //   id: errorsLayerId,\n        //   label: 'Router Errors',\n        //   color: 0xea5455,\n        // })\n        router.onError((error, to) => {\n            api.addTimelineEvent({\n                layerId: navigationsLayerId,\n                event: {\n                    title: 'Error during Navigation',\n                    subtitle: to.fullPath,\n                    logType: 'error',\n                    time: api.now(),\n                    data: { error },\n                    groupId: to.meta.__navigationId,\n                },\n            });\n        });\n        // attached to `meta` and used to group events\n        let navigationId = 0;\n        router.beforeEach((to, from) => {\n            const data = {\n                guard: formatDisplay('beforeEach'),\n                from: formatRouteLocation(from, 'Current Location during this navigation'),\n                to: formatRouteLocation(to, 'Target location'),\n            };\n            // Used to group navigations together, hide from devtools\n            Object.defineProperty(to.meta, '__navigationId', {\n                value: navigationId++,\n            });\n            api.addTimelineEvent({\n                layerId: navigationsLayerId,\n                event: {\n                    time: api.now(),\n                    title: 'Start of navigation',\n                    subtitle: to.fullPath,\n                    data,\n                    groupId: to.meta.__navigationId,\n                },\n            });\n        });\n        router.afterEach((to, from, failure) => {\n            const data = {\n                guard: formatDisplay('afterEach'),\n            };\n            if (failure) {\n                data.failure = {\n                    _custom: {\n                        type: Error,\n                        readOnly: true,\n                        display: failure ? failure.message : '',\n                        tooltip: 'Navigation Failure',\n                        value: failure,\n                    },\n                };\n                data.status = formatDisplay('❌');\n            }\n            else {\n                data.status = formatDisplay('✅');\n            }\n            // we set here to have the right order\n            data.from = formatRouteLocation(from, 'Current Location during this navigation');\n            data.to = formatRouteLocation(to, 'Target location');\n            api.addTimelineEvent({\n                layerId: navigationsLayerId,\n                event: {\n                    title: 'End of navigation',\n                    subtitle: to.fullPath,\n                    time: api.now(),\n                    data,\n                    logType: failure ? 'warning' : 'default',\n                    groupId: to.meta.__navigationId,\n                },\n            });\n        });\n        /**\n         * Inspector of Existing routes\n         */\n        const routerInspectorId = 'router-inspector:' + id;\n        api.addInspector({\n            id: routerInspectorId,\n            label: 'Routes' + (id ? ' ' + id : ''),\n            icon: 'book',\n            treeFilterPlaceholder: 'Search routes',\n        });\n        function refreshRoutesView() {\n            // the routes view isn't active\n            if (!activeRoutesPayload)\n                return;\n            const payload = activeRoutesPayload;\n            // children routes will appear as nested\n            let routes = matcher.getRoutes().filter(route => !route.parent ||\n                // these routes have a parent with no component which will not appear in the view\n                // therefore we still need to include them\n                !route.parent.record.components);\n            // reset match state to false\n            routes.forEach(resetMatchStateOnRouteRecord);\n            // apply a match state if there is a payload\n            if (payload.filter) {\n                routes = routes.filter(route => \n                // save matches state based on the payload\n                isRouteMatching(route, payload.filter.toLowerCase()));\n            }\n            // mark active routes\n            routes.forEach(route => markRouteRecordActive(route, router.currentRoute.value));\n            payload.rootNodes = routes.map(formatRouteRecordForInspector);\n        }\n        let activeRoutesPayload;\n        api.on.getInspectorTree(payload => {\n            activeRoutesPayload = payload;\n            if (payload.app === app && payload.inspectorId === routerInspectorId) {\n                refreshRoutesView();\n            }\n        });\n        /**\n         * Display information about the currently selected route record\n         */\n        api.on.getInspectorState(payload => {\n            if (payload.app === app && payload.inspectorId === routerInspectorId) {\n                const routes = matcher.getRoutes();\n                const route = routes.find(route => route.record.__vd_id === payload.nodeId);\n                if (route) {\n                    payload.state = {\n                        options: formatRouteRecordMatcherForStateInspector(route),\n                    };\n                }\n            }\n        });\n        api.sendInspectorTree(routerInspectorId);\n        api.sendInspectorState(routerInspectorId);\n    });\n}\nfunction modifierForKey(key) {\n    if (key.optional) {\n        return key.repeatable ? '*' : '?';\n    }\n    else {\n        return key.repeatable ? '+' : '';\n    }\n}\nfunction formatRouteRecordMatcherForStateInspector(route) {\n    const { record } = route;\n    const fields = [\n        { editable: false, key: 'path', value: record.path },\n    ];\n    if (record.name != null) {\n        fields.push({\n            editable: false,\n            key: 'name',\n            value: record.name,\n        });\n    }\n    fields.push({ editable: false, key: 'regexp', value: route.re });\n    if (route.keys.length) {\n        fields.push({\n            editable: false,\n            key: 'keys',\n            value: {\n                _custom: {\n                    type: null,\n                    readOnly: true,\n                    display: route.keys\n                        .map(key => `${key.name}${modifierForKey(key)}`)\n                        .join(' '),\n                    tooltip: 'Param keys',\n                    value: route.keys,\n                },\n            },\n        });\n    }\n    if (record.redirect != null) {\n        fields.push({\n            editable: false,\n            key: 'redirect',\n            value: record.redirect,\n        });\n    }\n    if (route.alias.length) {\n        fields.push({\n            editable: false,\n            key: 'aliases',\n            value: route.alias.map(alias => alias.record.path),\n        });\n    }\n    if (Object.keys(route.record.meta).length) {\n        fields.push({\n            editable: false,\n            key: 'meta',\n            value: route.record.meta,\n        });\n    }\n    fields.push({\n        key: 'score',\n        editable: false,\n        value: {\n            _custom: {\n                type: null,\n                readOnly: true,\n                display: route.score.map(score => score.join(', ')).join(' | '),\n                tooltip: 'Score used to sort routes',\n                value: route.score,\n            },\n        },\n    });\n    return fields;\n}\n/**\n * Extracted from tailwind palette\n */\nconst PINK_500 = 0xec4899;\nconst BLUE_600 = 0x2563eb;\nconst LIME_500 = 0x84cc16;\nconst CYAN_400 = 0x22d3ee;\nconst ORANGE_400 = 0xfb923c;\n// const GRAY_100 = 0xf4f4f5\nconst DARK = 0x666666;\nfunction formatRouteRecordForInspector(route) {\n    const tags = [];\n    const { record } = route;\n    if (record.name != null) {\n        tags.push({\n            label: String(record.name),\n            textColor: 0,\n            backgroundColor: CYAN_400,\n        });\n    }\n    if (record.aliasOf) {\n        tags.push({\n            label: 'alias',\n            textColor: 0,\n            backgroundColor: ORANGE_400,\n        });\n    }\n    if (route.__vd_match) {\n        tags.push({\n            label: 'matches',\n            textColor: 0,\n            backgroundColor: PINK_500,\n        });\n    }\n    if (route.__vd_exactActive) {\n        tags.push({\n            label: 'exact',\n            textColor: 0,\n            backgroundColor: LIME_500,\n        });\n    }\n    if (route.__vd_active) {\n        tags.push({\n            label: 'active',\n            textColor: 0,\n            backgroundColor: BLUE_600,\n        });\n    }\n    if (record.redirect) {\n        tags.push({\n            label: typeof record.redirect === 'string'\n                ? `redirect: ${record.redirect}`\n                : 'redirects',\n            textColor: 0xffffff,\n            backgroundColor: DARK,\n        });\n    }\n    // add an id to be able to select it. Using the `path` is not possible because\n    // empty path children would collide with their parents\n    let id = record.__vd_id;\n    if (id == null) {\n        id = String(routeRecordId++);\n        record.__vd_id = id;\n    }\n    return {\n        id,\n        label: record.path,\n        tags,\n        children: route.children.map(formatRouteRecordForInspector),\n    };\n}\n//  incremental id for route records and inspector state\nlet routeRecordId = 0;\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\nfunction markRouteRecordActive(route, currentRoute) {\n    // no route will be active if matched is empty\n    // reset the matching state\n    const isExactActive = currentRoute.matched.length &&\n        isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\n    route.__vd_exactActive = route.__vd_active = isExactActive;\n    if (!isExactActive) {\n        route.__vd_active = currentRoute.matched.some(match => isSameRouteRecord(match, route.record));\n    }\n    route.children.forEach(childRoute => markRouteRecordActive(childRoute, currentRoute));\n}\nfunction resetMatchStateOnRouteRecord(route) {\n    route.__vd_match = false;\n    route.children.forEach(resetMatchStateOnRouteRecord);\n}\nfunction isRouteMatching(route, filter) {\n    const found = String(route.re).match(EXTRACT_REGEXP_RE);\n    route.__vd_match = false;\n    if (!found || found.length < 3) {\n        return false;\n    }\n    // use a regexp without $ at the end to match nested routes better\n    const nonEndingRE = new RegExp(found[1].replace(/\\$$/, ''), found[2]);\n    if (nonEndingRE.test(filter)) {\n        // mark children as matches\n        route.children.forEach(child => isRouteMatching(child, filter));\n        // exception case: `/`\n        if (route.record.path !== '/' || filter === '/') {\n            route.__vd_match = route.re.test(filter);\n            return true;\n        }\n        // hide the / route\n        return false;\n    }\n    const path = route.record.path.toLowerCase();\n    const decodedPath = decode(path);\n    // also allow partial matching on the path\n    if (!filter.startsWith('/') &&\n        (decodedPath.includes(filter) || path.includes(filter)))\n        return true;\n    if (decodedPath.startsWith(filter) || path.startsWith(filter))\n        return true;\n    if (route.record.name && String(route.record.name).includes(filter))\n        return true;\n    return route.children.some(child => isRouteMatching(child, filter));\n}\nfunction omit(obj, keys) {\n    const ret = {};\n    for (const key in obj) {\n        if (!keys.includes(key)) {\n            // @ts-expect-error\n            ret[key] = obj[key];\n        }\n    }\n    return ret;\n}\n\n/**\n * Creates a Router instance that can be used by a Vue app.\n *\n * @param options - {@link RouterOptions}\n */\nfunction createRouter(options) {\n    const matcher = createRouterMatcher(options.routes, options);\n    const parseQuery$1 = options.parseQuery || parseQuery;\n    const stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\n    const routerHistory = options.history;\n    if ((process.env.NODE_ENV !== 'production') && !routerHistory)\n        throw new Error('Provide the \"history\" option when calling \"createRouter()\":' +\n            ' https://next.router.vuejs.org/api/#history.');\n    const beforeGuards = useCallbacks();\n    const beforeResolveGuards = useCallbacks();\n    const afterGuards = useCallbacks();\n    const currentRoute = shallowRef(START_LOCATION_NORMALIZED);\n    let pendingLocation = START_LOCATION_NORMALIZED;\n    // leave the scrollRestoration if no scrollBehavior is provided\n    if (isBrowser && options.scrollBehavior && 'scrollRestoration' in history) {\n        history.scrollRestoration = 'manual';\n    }\n    const normalizeParams = applyToParams.bind(null, paramValue => '' + paramValue);\n    const encodeParams = applyToParams.bind(null, encodeParam);\n    const decodeParams = \n    // @ts-expect-error: intentionally avoid the type check\n    applyToParams.bind(null, decode);\n    function addRoute(parentOrRoute, route) {\n        let parent;\n        let record;\n        if (isRouteName(parentOrRoute)) {\n            parent = matcher.getRecordMatcher(parentOrRoute);\n            record = route;\n        }\n        else {\n            record = parentOrRoute;\n        }\n        return matcher.addRoute(record, parent);\n    }\n    function removeRoute(name) {\n        const recordMatcher = matcher.getRecordMatcher(name);\n        if (recordMatcher) {\n            matcher.removeRoute(recordMatcher);\n        }\n        else if ((process.env.NODE_ENV !== 'production')) {\n            warn(`Cannot remove non-existent route \"${String(name)}\"`);\n        }\n    }\n    function getRoutes() {\n        return matcher.getRoutes().map(routeMatcher => routeMatcher.record);\n    }\n    function hasRoute(name) {\n        return !!matcher.getRecordMatcher(name);\n    }\n    function resolve(rawLocation, currentLocation) {\n        // const objectLocation = routerLocationAsObject(rawLocation)\n        // we create a copy to modify it later\n        currentLocation = assign({}, currentLocation || currentRoute.value);\n        if (typeof rawLocation === 'string') {\n            const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\n            const matchedRoute = matcher.resolve({ path: locationNormalized.path }, currentLocation);\n            const href = routerHistory.createHref(locationNormalized.fullPath);\n            if ((process.env.NODE_ENV !== 'production')) {\n                if (href.startsWith('//'))\n                    warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n                else if (!matchedRoute.matched.length) {\n                    warn(`No match found for location with path \"${rawLocation}\"`);\n                }\n            }\n            // locationNormalized is always a new object\n            return assign(locationNormalized, matchedRoute, {\n                params: decodeParams(matchedRoute.params),\n                hash: decode(locationNormalized.hash),\n                redirectedFrom: undefined,\n                href,\n            });\n        }\n        let matcherLocation;\n        // path could be relative in object as well\n        if ('path' in rawLocation) {\n            if ((process.env.NODE_ENV !== 'production') &&\n                'params' in rawLocation &&\n                !('name' in rawLocation) &&\n                // @ts-expect-error: the type is never\n                Object.keys(rawLocation.params).length) {\n                warn(`Path \"${rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\n            }\n            matcherLocation = assign({}, rawLocation, {\n                path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path,\n            });\n        }\n        else {\n            // remove any nullish param\n            const targetParams = assign({}, rawLocation.params);\n            for (const key in targetParams) {\n                if (targetParams[key] == null) {\n                    delete targetParams[key];\n                }\n            }\n            // pass encoded values to the matcher, so it can produce encoded path and fullPath\n            matcherLocation = assign({}, rawLocation, {\n                params: encodeParams(targetParams),\n            });\n            // current location params are decoded, we need to encode them in case the\n            // matcher merges the params\n            currentLocation.params = encodeParams(currentLocation.params);\n        }\n        const matchedRoute = matcher.resolve(matcherLocation, currentLocation);\n        const hash = rawLocation.hash || '';\n        if ((process.env.NODE_ENV !== 'production') && hash && !hash.startsWith('#')) {\n            warn(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\n        }\n        // the matcher might have merged current location params, so\n        // we need to run the decoding again\n        matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\n        const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\n            hash: encodeHash(hash),\n            path: matchedRoute.path,\n        }));\n        const href = routerHistory.createHref(fullPath);\n        if ((process.env.NODE_ENV !== 'production')) {\n            if (href.startsWith('//')) {\n                warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n            }\n            else if (!matchedRoute.matched.length) {\n                warn(`No match found for location with path \"${'path' in rawLocation ? rawLocation.path : rawLocation}\"`);\n            }\n        }\n        return assign({\n            fullPath,\n            // keep the hash encoded so fullPath is effectively path + encodedQuery +\n            // hash\n            hash,\n            query: \n            // if the user is using a custom query lib like qs, we might have\n            // nested objects, so we keep the query as is, meaning it can contain\n            // numbers at `$route.query`, but at the point, the user will have to\n            // use their own type anyway.\n            // https://github.com/vuejs/router/issues/328#issuecomment-649481567\n            stringifyQuery$1 === stringifyQuery\n                ? normalizeQuery(rawLocation.query)\n                : (rawLocation.query || {}),\n        }, matchedRoute, {\n            redirectedFrom: undefined,\n            href,\n        });\n    }\n    function locationAsObject(to) {\n        return typeof to === 'string'\n            ? parseURL(parseQuery$1, to, currentRoute.value.path)\n            : assign({}, to);\n    }\n    function checkCanceledNavigation(to, from) {\n        if (pendingLocation !== to) {\n            return createRouterError(8 /* ErrorTypes.NAVIGATION_CANCELLED */, {\n                from,\n                to,\n            });\n        }\n    }\n    function push(to) {\n        return pushWithRedirect(to);\n    }\n    function replace(to) {\n        return push(assign(locationAsObject(to), { replace: true }));\n    }\n    function handleRedirectRecord(to) {\n        const lastMatched = to.matched[to.matched.length - 1];\n        if (lastMatched && lastMatched.redirect) {\n            const { redirect } = lastMatched;\n            let newTargetLocation = typeof redirect === 'function' ? redirect(to) : redirect;\n            if (typeof newTargetLocation === 'string') {\n                newTargetLocation =\n                    newTargetLocation.includes('?') || newTargetLocation.includes('#')\n                        ? (newTargetLocation = locationAsObject(newTargetLocation))\n                        : // force empty params\n                            { path: newTargetLocation };\n                // @ts-expect-error: force empty params when a string is passed to let\n                // the router parse them again\n                newTargetLocation.params = {};\n            }\n            if ((process.env.NODE_ENV !== 'production') &&\n                !('path' in newTargetLocation) &&\n                !('name' in newTargetLocation)) {\n                warn(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\n                throw new Error('Invalid redirect');\n            }\n            return assign({\n                query: to.query,\n                hash: to.hash,\n                // avoid transferring params if the redirect has a path\n                params: 'path' in newTargetLocation ? {} : to.params,\n            }, newTargetLocation);\n        }\n    }\n    function pushWithRedirect(to, redirectedFrom) {\n        const targetLocation = (pendingLocation = resolve(to));\n        const from = currentRoute.value;\n        const data = to.state;\n        const force = to.force;\n        // to could be a string where `replace` is a function\n        const replace = to.replace === true;\n        const shouldRedirect = handleRedirectRecord(targetLocation);\n        if (shouldRedirect)\n            return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\n                state: typeof shouldRedirect === 'object'\n                    ? assign({}, data, shouldRedirect.state)\n                    : data,\n                force,\n                replace,\n            }), \n            // keep original redirectedFrom if it exists\n            redirectedFrom || targetLocation);\n        // if it was a redirect we already called `pushWithRedirect` above\n        const toLocation = targetLocation;\n        toLocation.redirectedFrom = redirectedFrom;\n        let failure;\n        if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\n            failure = createRouterError(16 /* ErrorTypes.NAVIGATION_DUPLICATED */, { to: toLocation, from });\n            // trigger scroll to allow scrolling to the same anchor\n            handleScroll(from, from, \n            // this is a push, the only way for it to be triggered from a\n            // history.listen is with a redirect, which makes it become a push\n            true, \n            // This cannot be the first navigation because the initial location\n            // cannot be manually navigated to\n            false);\n        }\n        return (failure ? Promise.resolve(failure) : navigate(toLocation, from))\n            .catch((error) => isNavigationFailure(error)\n            ? // navigation redirects still mark the router as ready\n                isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)\n                    ? error\n                    : markAsReady(error) // also returns the error\n            : // reject any unknown error\n                triggerError(error, toLocation, from))\n            .then((failure) => {\n            if (failure) {\n                if (isNavigationFailure(failure, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n                    if ((process.env.NODE_ENV !== 'production') &&\n                        // we are redirecting to the same location we were already at\n                        isSameRouteLocation(stringifyQuery$1, resolve(failure.to), toLocation) &&\n                        // and we have done it a couple of times\n                        redirectedFrom &&\n                        // @ts-expect-error: added only in dev\n                        (redirectedFrom._count = redirectedFrom._count\n                            ? // @ts-expect-error\n                                redirectedFrom._count + 1\n                            : 1) > 30) {\n                        warn(`Detected a possibly infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow.\\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);\n                        return Promise.reject(new Error('Infinite redirect in navigation guard'));\n                    }\n                    return pushWithRedirect(\n                    // keep options\n                    assign({\n                        // preserve an existing replacement but allow the redirect to override it\n                        replace,\n                    }, locationAsObject(failure.to), {\n                        state: typeof failure.to === 'object'\n                            ? assign({}, data, failure.to.state)\n                            : data,\n                        force,\n                    }), \n                    // preserve the original redirectedFrom if any\n                    redirectedFrom || toLocation);\n                }\n            }\n            else {\n                // if we fail we don't finalize the navigation\n                failure = finalizeNavigation(toLocation, from, true, replace, data);\n            }\n            triggerAfterEach(toLocation, from, failure);\n            return failure;\n        });\n    }\n    /**\n     * Helper to reject and skip all navigation guards if a new navigation happened\n     * @param to\n     * @param from\n     */\n    function checkCanceledNavigationAndReject(to, from) {\n        const error = checkCanceledNavigation(to, from);\n        return error ? Promise.reject(error) : Promise.resolve();\n    }\n    function runWithContext(fn) {\n        const app = installedApps.values().next().value;\n        // support Vue < 3.3\n        return app && typeof app.runWithContext === 'function'\n            ? app.runWithContext(fn)\n            : fn();\n    }\n    // TODO: refactor the whole before guards by internally using router.beforeEach\n    function navigate(to, from) {\n        let guards;\n        const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\n        // all components here have been resolved once because we are leaving\n        guards = extractComponentsGuards(leavingRecords.reverse(), 'beforeRouteLeave', to, from);\n        // leavingRecords is already reversed\n        for (const record of leavingRecords) {\n            record.leaveGuards.forEach(guard => {\n                guards.push(guardToPromiseFn(guard, to, from));\n            });\n        }\n        const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\n        guards.push(canceledNavigationCheck);\n        // run the queue of per route beforeRouteLeave guards\n        return (runGuardQueue(guards)\n            .then(() => {\n            // check global guards beforeEach\n            guards = [];\n            for (const guard of beforeGuards.list()) {\n                guards.push(guardToPromiseFn(guard, to, from));\n            }\n            guards.push(canceledNavigationCheck);\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // check in components beforeRouteUpdate\n            guards = extractComponentsGuards(updatingRecords, 'beforeRouteUpdate', to, from);\n            for (const record of updatingRecords) {\n                record.updateGuards.forEach(guard => {\n                    guards.push(guardToPromiseFn(guard, to, from));\n                });\n            }\n            guards.push(canceledNavigationCheck);\n            // run the queue of per route beforeEnter guards\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // check the route beforeEnter\n            guards = [];\n            for (const record of enteringRecords) {\n                // do not trigger beforeEnter on reused views\n                if (record.beforeEnter) {\n                    if (isArray(record.beforeEnter)) {\n                        for (const beforeEnter of record.beforeEnter)\n                            guards.push(guardToPromiseFn(beforeEnter, to, from));\n                    }\n                    else {\n                        guards.push(guardToPromiseFn(record.beforeEnter, to, from));\n                    }\n                }\n            }\n            guards.push(canceledNavigationCheck);\n            // run the queue of per route beforeEnter guards\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // NOTE: at this point to.matched is normalized and does not contain any () => Promise<Component>\n            // clear existing enterCallbacks, these are added by extractComponentsGuards\n            to.matched.forEach(record => (record.enterCallbacks = {}));\n            // check in-component beforeRouteEnter\n            guards = extractComponentsGuards(enteringRecords, 'beforeRouteEnter', to, from);\n            guards.push(canceledNavigationCheck);\n            // run the queue of per route beforeEnter guards\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // check global guards beforeResolve\n            guards = [];\n            for (const guard of beforeResolveGuards.list()) {\n                guards.push(guardToPromiseFn(guard, to, from));\n            }\n            guards.push(canceledNavigationCheck);\n            return runGuardQueue(guards);\n        })\n            // catch any navigation canceled\n            .catch(err => isNavigationFailure(err, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)\n            ? err\n            : Promise.reject(err)));\n    }\n    function triggerAfterEach(to, from, failure) {\n        // navigation is confirmed, call afterGuards\n        // TODO: wrap with error handlers\n        afterGuards\n            .list()\n            .forEach(guard => runWithContext(() => guard(to, from, failure)));\n    }\n    /**\n     * - Cleans up any navigation guards\n     * - Changes the url if necessary\n     * - Calls the scrollBehavior\n     */\n    function finalizeNavigation(toLocation, from, isPush, replace, data) {\n        // a more recent navigation took place\n        const error = checkCanceledNavigation(toLocation, from);\n        if (error)\n            return error;\n        // only consider as push if it's not the first navigation\n        const isFirstNavigation = from === START_LOCATION_NORMALIZED;\n        const state = !isBrowser ? {} : history.state;\n        // change URL only if the user did a push/replace and if it's not the initial navigation because\n        // it's just reflecting the url\n        if (isPush) {\n            // on the initial navigation, we want to reuse the scroll position from\n            // history state if it exists\n            if (replace || isFirstNavigation)\n                routerHistory.replace(toLocation.fullPath, assign({\n                    scroll: isFirstNavigation && state && state.scroll,\n                }, data));\n            else\n                routerHistory.push(toLocation.fullPath, data);\n        }\n        // accept current navigation\n        currentRoute.value = toLocation;\n        handleScroll(toLocation, from, isPush, isFirstNavigation);\n        markAsReady();\n    }\n    let removeHistoryListener;\n    // attach listener to history to trigger navigations\n    function setupListeners() {\n        // avoid setting up listeners twice due to an invalid first navigation\n        if (removeHistoryListener)\n            return;\n        removeHistoryListener = routerHistory.listen((to, _from, info) => {\n            if (!router.listening)\n                return;\n            // cannot be a redirect route because it was in history\n            const toLocation = resolve(to);\n            // due to dynamic routing, and to hash history with manual navigation\n            // (manually changing the url or calling history.hash = '#/somewhere'),\n            // there could be a redirect record in history\n            const shouldRedirect = handleRedirectRecord(toLocation);\n            if (shouldRedirect) {\n                pushWithRedirect(assign(shouldRedirect, { replace: true }), toLocation).catch(noop);\n                return;\n            }\n            pendingLocation = toLocation;\n            const from = currentRoute.value;\n            // TODO: should be moved to web history?\n            if (isBrowser) {\n                saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\n            }\n            navigate(toLocation, from)\n                .catch((error) => {\n                if (isNavigationFailure(error, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n                    return error;\n                }\n                if (isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n                    // Here we could call if (info.delta) routerHistory.go(-info.delta,\n                    // false) but this is bug prone as we have no way to wait the\n                    // navigation to be finished before calling pushWithRedirect. Using\n                    // a setTimeout of 16ms seems to work but there is no guarantee for\n                    // it to work on every browser. So instead we do not restore the\n                    // history entry and trigger a new navigation as requested by the\n                    // navigation guard.\n                    // the error is already handled by router.push we just want to avoid\n                    // logging the error\n                    pushWithRedirect(error.to, toLocation\n                    // avoid an uncaught rejection, let push call triggerError\n                    )\n                        .then(failure => {\n                        // manual change in hash history #916 ending up in the URL not\n                        // changing, but it was changed by the manual url change, so we\n                        // need to manually change it ourselves\n                        if (isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ |\n                            16 /* ErrorTypes.NAVIGATION_DUPLICATED */) &&\n                            !info.delta &&\n                            info.type === NavigationType.pop) {\n                            routerHistory.go(-1, false);\n                        }\n                    })\n                        .catch(noop);\n                    // avoid the then branch\n                    return Promise.reject();\n                }\n                // do not restore history on unknown direction\n                if (info.delta) {\n                    routerHistory.go(-info.delta, false);\n                }\n                // unrecognized error, transfer to the global handler\n                return triggerError(error, toLocation, from);\n            })\n                .then((failure) => {\n                failure =\n                    failure ||\n                        finalizeNavigation(\n                        // after navigation, all matched components are resolved\n                        toLocation, from, false);\n                // revert the navigation\n                if (failure) {\n                    if (info.delta &&\n                        // a new navigation has been triggered, so we do not want to revert, that will change the current history\n                        // entry while a different route is displayed\n                        !isNavigationFailure(failure, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n                        routerHistory.go(-info.delta, false);\n                    }\n                    else if (info.type === NavigationType.pop &&\n                        isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 16 /* ErrorTypes.NAVIGATION_DUPLICATED */)) {\n                        // manual change in hash history #916\n                        // it's like a push but lacks the information of the direction\n                        routerHistory.go(-1, false);\n                    }\n                }\n                triggerAfterEach(toLocation, from, failure);\n            })\n                // avoid warnings in the console about uncaught rejections, they are logged by triggerErrors\n                .catch(noop);\n        });\n    }\n    // Initialization and Errors\n    let readyHandlers = useCallbacks();\n    let errorListeners = useCallbacks();\n    let ready;\n    /**\n     * Trigger errorListeners added via onError and throws the error as well\n     *\n     * @param error - error to throw\n     * @param to - location we were navigating to when the error happened\n     * @param from - location we were navigating from when the error happened\n     * @returns the error as a rejected promise\n     */\n    function triggerError(error, to, from) {\n        markAsReady(error);\n        const list = errorListeners.list();\n        if (list.length) {\n            list.forEach(handler => handler(error, to, from));\n        }\n        else {\n            if ((process.env.NODE_ENV !== 'production')) {\n                warn('uncaught error during route navigation:');\n            }\n            console.error(error);\n        }\n        // reject the error no matter there were error listeners or not\n        return Promise.reject(error);\n    }\n    function isReady() {\n        if (ready && currentRoute.value !== START_LOCATION_NORMALIZED)\n            return Promise.resolve();\n        return new Promise((resolve, reject) => {\n            readyHandlers.add([resolve, reject]);\n        });\n    }\n    function markAsReady(err) {\n        if (!ready) {\n            // still not ready if an error happened\n            ready = !err;\n            setupListeners();\n            readyHandlers\n                .list()\n                .forEach(([resolve, reject]) => (err ? reject(err) : resolve()));\n            readyHandlers.reset();\n        }\n        return err;\n    }\n    // Scroll behavior\n    function handleScroll(to, from, isPush, isFirstNavigation) {\n        const { scrollBehavior } = options;\n        if (!isBrowser || !scrollBehavior)\n            return Promise.resolve();\n        const scrollPosition = (!isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0))) ||\n            ((isFirstNavigation || !isPush) &&\n                history.state &&\n                history.state.scroll) ||\n            null;\n        return nextTick()\n            .then(() => scrollBehavior(to, from, scrollPosition))\n            .then(position => position && scrollToPosition(position))\n            .catch(err => triggerError(err, to, from));\n    }\n    const go = (delta) => routerHistory.go(delta);\n    let started;\n    const installedApps = new Set();\n    const router = {\n        currentRoute,\n        listening: true,\n        addRoute,\n        removeRoute,\n        hasRoute,\n        getRoutes,\n        resolve,\n        options,\n        push,\n        replace,\n        go,\n        back: () => go(-1),\n        forward: () => go(1),\n        beforeEach: beforeGuards.add,\n        beforeResolve: beforeResolveGuards.add,\n        afterEach: afterGuards.add,\n        onError: errorListeners.add,\n        isReady,\n        install(app) {\n            const router = this;\n            app.component('RouterLink', RouterLink);\n            app.component('RouterView', RouterView);\n            app.config.globalProperties.$router = router;\n            Object.defineProperty(app.config.globalProperties, '$route', {\n                enumerable: true,\n                get: () => unref(currentRoute),\n            });\n            // this initial navigation is only necessary on client, on server it doesn't\n            // make sense because it will create an extra unnecessary navigation and could\n            // lead to problems\n            if (isBrowser &&\n                // used for the initial navigation client side to avoid pushing\n                // multiple times when the router is used in multiple apps\n                !started &&\n                currentRoute.value === START_LOCATION_NORMALIZED) {\n                // see above\n                started = true;\n                push(routerHistory.location).catch(err => {\n                    if ((process.env.NODE_ENV !== 'production'))\n                        warn('Unexpected error when starting the router:', err);\n                });\n            }\n            const reactiveRoute = {};\n            for (const key in START_LOCATION_NORMALIZED) {\n                Object.defineProperty(reactiveRoute, key, {\n                    get: () => currentRoute.value[key],\n                    enumerable: true,\n                });\n            }\n            app.provide(routerKey, router);\n            app.provide(routeLocationKey, shallowReactive(reactiveRoute));\n            app.provide(routerViewLocationKey, currentRoute);\n            const unmountApp = app.unmount;\n            installedApps.add(app);\n            app.unmount = function () {\n                installedApps.delete(app);\n                // the router is not attached to an app anymore\n                if (installedApps.size < 1) {\n                    // invalidate the current navigation\n                    pendingLocation = START_LOCATION_NORMALIZED;\n                    removeHistoryListener && removeHistoryListener();\n                    removeHistoryListener = null;\n                    currentRoute.value = START_LOCATION_NORMALIZED;\n                    started = false;\n                    ready = false;\n                }\n                unmountApp();\n            };\n            // TODO: this probably needs to be updated so it can be used by vue-termui\n            if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n                addDevtools(app, router, matcher);\n            }\n        },\n    };\n    // TODO: type this as NavigationGuardReturn or similar instead of any\n    function runGuardQueue(guards) {\n        return guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());\n    }\n    return router;\n}\nfunction extractChangingRecords(to, from) {\n    const leavingRecords = [];\n    const updatingRecords = [];\n    const enteringRecords = [];\n    const len = Math.max(from.matched.length, to.matched.length);\n    for (let i = 0; i < len; i++) {\n        const recordFrom = from.matched[i];\n        if (recordFrom) {\n            if (to.matched.find(record => isSameRouteRecord(record, recordFrom)))\n                updatingRecords.push(recordFrom);\n            else\n                leavingRecords.push(recordFrom);\n        }\n        const recordTo = to.matched[i];\n        if (recordTo) {\n            // the type doesn't matter because we are comparing per reference\n            if (!from.matched.find(record => isSameRouteRecord(record, recordTo))) {\n                enteringRecords.push(recordTo);\n            }\n        }\n    }\n    return [leavingRecords, updatingRecords, enteringRecords];\n}\n\n/**\n * Returns the router instance. Equivalent to using `$router` inside\n * templates.\n */\nfunction useRouter() {\n    return inject(routerKey);\n}\n/**\n * Returns the current route location. Equivalent to using `$route` inside\n * templates.\n */\nfunction useRoute() {\n    return inject(routeLocationKey);\n}\n\nexport { NavigationFailureType, RouterLink, RouterView, START_LOCATION_NORMALIZED as START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"src_npm_module_PolyConfigLoadController_ts\":\"6d2f3f3797d6f1e66ffa\",\"vendors-_polygonjs_polygonjs_node_modules_chromotome_dist_index_umd_js-_polygonjs_polygonjs_n-a0c7ef\":\"9a00d55079528109aa91\",\"vendors-_polygonjs_polygonjs_node_modules_mediapipe_face_mesh_face_mesh_js-_polygonjs_polygon-5c038f\":\"9a7444847e6ed82f3d1a\",\"_polygonjs_polygonjs_src_engine_nodes_mat_RayMarchingBuilder_ts\":\"ae96535e7b7296b5b34e\",\"_polygonjs_polygonjs_src_engine_nodes_mat_LineBasic_ts-_polygonjs_polygonjs_src_engine_nodes_-af07fa\":\"ed5548aef4b9d7fb3352\",\"_polygonjs_polygonjs_src_core_player_PlayerCommon_ts-_polygonjs_polygonjs_src_engine_function-85309a\":\"dd46a0de35903c86eb51\",\"_polygonjs_polygonjs_src_engine_poly_registers_All_ts\":\"c53906a7a1460c6865a0\",\"vendors-node_modules_ag-grid-community_dist_ag-grid-community_cjs_js-node_modules_ag-grid-com-736807\":\"8d0e4c6f3ce2791cda6a\",\"src_editor_components_panels_performance_Performance_vue\":\"59c7aace5f6ae3c93c28\",\"src_editor_components_panels_spreadsheet_Spreadsheet_vue\":\"ca9598f36fbba0694578\",\"src_editor_components_panels_sceneTree_tree_SceneTreeCore_vue\":\"7401503ca0585592dadb\",\"src_editor_components_panels_sceneTree_SceneTree_vue\":\"a05d0945fe0f8a65ff3b\",\"vendors-include-loader_node_modules_monaco-editor_esm_vs_editor_editor_api_js-node_modules_mo-09427e\":\"63219047d23c61502aba\",\"src_editor_components_panels_codePreview_CodePreview_vue\":\"f77b995d9983a8b85543\",\"src_editor_components_panels_nodeDocs_NodeDocs_vue\":\"131ef6511b7c04b9cd41\",\"src_editor_components_panels_paramsStack_ParamsStack_vue\":\"b3a787c42a9ec2ad0e2d\",\"src_editor_components_panels_animation_AnimationCore_vue\":\"8009a7ea981f5618d515\",\"src_editor_components_panels_animation_Animation_vue-src_editor_components_panels_animation_A-36f339\":\"4676276c91eca9c00518\",\"src_editor_core_hooks_HooksController_ts\":\"64d6a5e729f568cacddd\",\"src_dashboard_Dashboard_vue\":\"3c5af837784cd18b1690\",\"src_dashboard_SceneSettings_vue\":\"8ad7783e885a129bd81b\",\"src_editor_components_editor_EditorSceneLoader_vue\":\"78bc5edf74d08c081b5b\",\"src_editor_components_editor_EditorExampleLoader_vue\":\"dc5b0d276ed828e88b34\",\"src_editor_components_widgets_dialogs_About_vue\":\"3928014ba7a8a28c4f06\",\"src_editor_components_widgets_dialogs_preferences_Preferences_vue\":\"4df0db7d48226c2afd62\",\"src_editor_components_widgets_dialogs_export_ExportPanel_vue\":\"8b8c75fe82dffd3eb056\",\"src_editor_components_editor_widgets_WindowsLibrariesManager_vue\":\"1ecaf18b34cb3b801d59\",\"src_editor_components_widgets_dialogs_ModalResizable_vue\":\"f5c6a339e8a950800663\",\"src_editor_components_widgets_dialogs_marketplace_MarketplacePolyNodes_vue\":\"a353acc4f9ceeb6348e2\",\"src_editor_components_widgets_dialogs_share_PanelShare_vue\":\"c8ac822800cb09c04f09\",\"src_editor_components_widgets_dialogs_multiPlayer_PanelMultiPlayer_vue\":\"79012c6004dae9da3d61\",\"src_editor_components_editor_widgets_PanelAssetsList_vue\":\"e1919b27b1238e010ff8\",\"src_editor_components_widgets_dialogs_ApiLogin_vue\":\"2f85fda88325bbff3dda\",\"src_editor_components_widgets_paramsEditor_ParamsEditorCore_vue\":\"7b347641ad4d097e000a\",\"src_editor_components_editor_widgets_PanelSpareParamsEditor_vue\":\"b318d03ad19057db0dba\",\"src_editor_components_widgets_dialogs_polyNode_inputs_InputsForm_vue\":\"ad4f7b4789547586b77c\",\"src_editor_components_widgets_dialogs_polyNode_PolyNodeCreateForm_vue\":\"f77101876746148cfe0d\",\"src_editor_components_widgets_dialogs_polyNode_PolyNodeUpdateForm_vue\":\"5507d4ce963e36fd27ab\",\"src_editor_components_editor_widgets_PanelFileSelector_vue\":\"281c512940b139083c35\",\"src_editor_components_editor_widgets_PanelNodeSelector_vue\":\"e2c469317b02571696b1\",\"src_editor_components_editor_widgets_PanelObjectMask_vue\":\"d704019a261bb8f0c24e\",\"src_editor_components_panels_animation_AnimationModal_vue-src_editor_components_panels_animat-4f7378\":\"b75e37f0772e30493f7e\",\"src_docs_search_SearchIndexController_ts\":\"0794b3ac40219fd9e92a\",\"src_docs_Docs_vue\":\"bca761bc5e8d03c2a275\",\"vendors-node_modules_heroicons_vue_24_outline_ArrowDownTrayIcon_js-node_modules_heroicons_vue-d98e37\":\"6767160723bdb12161f9\",\"src_docs_components_MdxComponents_ts\":\"1c2d18796b669af5e2d0\",\"src_docs_pages_Page_vue\":\"e0817ba5bf0e2a1f1430\",\"src_docs_pages_RootPage_vue\":\"0b013df15d09800244d8\",\"src_docs_nodes_Nodes_vue\":\"3a046597fd7ac35766d6\",\"src_docs_nodes_NodeContext_vue\":\"9df699d39778b8cd1c5d\",\"src_docs_nodes_Node_vue\":\"6a5495dcfa410424801e\",\"src_docs_expressions_Expressions_vue\":\"d36c145a1564107c8a0a\",\"src_docs_expressions_Expression_vue\":\"6f70eabdc2a569a74af5\",\"src_docs_examples_Examples_vue\":\"4bed908ee3ddd22b2499\",\"src_docs_help_Help_vue\":\"9a8005b78e0625f67327\",\"src_docs_pages_NotFound_vue\":\"82e5701b693107c29a41\",\"src_docs_search_SearchExport_vue\":\"345639f3b038af101eb7\",\"src_docs_pages_mdx_assets_SupportedFiles_vue\":\"ae8735006ef3fb6aa0b7\",\"src_docs_api_Api_vue\":\"8de9a77779172c00630c\",\"src_docs_pages_mdx_assets_export_mdx\":\"da1c4290a6ffeda163b7\",\"src_docs_pages_mdx_assets_import_models_mdx\":\"1a398f7b1be38a653f6e\",\"src_docs_pages_mdx_assets_import_textures_mdx\":\"022cd743d8939d829522\",\"src_docs_pages_mdx_assets_index_mdx\":\"c9b238c02387b601e9be\",\"src_docs_pages_mdx_editor_codepreview_mdx\":\"f21f535cfad8e8086e70\",\"src_docs_pages_mdx_editor_config_mdx\":\"ac944036ef26806c1e1a\",\"src_docs_pages_mdx_editor_copy_paste_mdx\":\"f9ec2695abb8a81c87f5\",\"src_docs_pages_mdx_editor_index_mdx\":\"2b364c6ad2b9901a1c58\",\"src_docs_pages_mdx_editor_network_mdx\":\"6a76c08e7c445a29eef5\",\"src_docs_pages_mdx_editor_params_mdx\":\"a20d2187a1bccacc2590\",\"src_docs_pages_mdx_editor_performance_mdx\":\"dc6c96e5a8367a571245\",\"src_docs_pages_mdx_editor_scenetree_mdx\":\"434c7ad7fdfc32853b6b\",\"src_docs_pages_mdx_editor_spreadsheet_mdx\":\"0757da492029a5e5974f\",\"src_docs_pages_mdx_editor_viewer_mdx\":\"149690a1783eda8d537d\",\"src_docs_pages_mdx_export_index_mdx\":\"4f283d26c1c55d911653\",\"src_docs_pages_mdx_export_local_mdx\":\"e5bac4a1b40764719dfa\",\"src_docs_pages_mdx_export_online_mdx\":\"c936b945678cf7592ec3\",\"src_docs_pages_mdx_index_mdx\":\"4a06e24a8de3e8dfdc98\",\"src_docs_pages_mdx_install_add_mdx\":\"03107d36ec6d3e29b7eb\",\"src_docs_pages_mdx_install_index_mdx\":\"015172b20c284184a3c4\",\"src_docs_pages_mdx_install_new_mdx\":\"28725f0f3fd039a5b0e6\",\"src_docs_pages_mdx_integrations_fxhash_mdx\":\"4a040239da210e873a4f\",\"src_docs_pages_mdx_integrations_git_mdx\":\"834151eea406e01bad10\",\"src_docs_pages_mdx_integrations_index_mdx\":\"a8bc16309d16fcf60dcd\",\"src_docs_pages_mdx_integrations_mapbox_mdx\":\"56ffd7db9f4b9c4de649\",\"src_docs_pages_mdx_integrations_react_mdx\":\"547ef2c3a4eb5200bbf2\",\"src_docs_pages_mdx_integrations_react_three_fiber_mdx\":\"c147de2c3abb01ba9beb\",\"src_docs_pages_mdx_integrations_s3_mdx\":\"571add5ee3cbe99e75f9\",\"src_docs_pages_mdx_integrations_threejs_mdx\":\"3db24c548d2035239fc3\",\"src_docs_pages_mdx_integrations_threejs_stepbystep_mdx\":\"7143394c864dee8466e7\",\"src_docs_pages_mdx_integrations_vue_mdx\":\"f71e39a8217fe49998dc\",\"src_docs_pages_mdx_integrations_webflow_mdx\":\"58becbe737b3da73bc2a\",\"src_docs_pages_mdx_integrations_wordpress_mdx\":\"89b18eec5f7a35b00cb2\",\"src_docs_pages_mdx_multiplayer_mdx\":\"a96283f75ac5dfcbcb9d\",\"src_docs_pages_mdx_plugins_ifc_mdx\":\"c49dbf9a3ca39ec8e277\",\"src_docs_pages_mdx_plugins_index_mdx\":\"94c03bbe958ccb8e59c1\",\"src_docs_pages_mdx_plugins_mapbox_mdx\":\"3a5f457791ea00013ba9\",\"src_docs_pages_mdx_plugins_marker-tracking_mdx\":\"3e8761d52c53a4b7c6f8\",\"src_docs_pages_mdx_plugins_occlusion_mdx\":\"0835f3356afd5b64a02a\",\"src_docs_pages_mdx_plugins_trace_mdx\":\"9ae56f02b31c22987aed\",\"src_docs_pages_mdx_resources_api_mdx\":\"808b592e5faf826694a0\",\"src_docs_pages_mdx_resources_audio_mdx\":\"1a19d41ff9488681bf88\",\"src_docs_pages_mdx_resources_design_mdx\":\"d33edff5dd72015c78c7\",\"src_docs_pages_mdx_resources_forums_mdx\":\"10245228abfe7279da22\",\"src_docs_pages_mdx_resources_index_mdx\":\"341a234a40aca27dec89\",\"src_docs_pages_mdx_resources_materials_mdx\":\"664ba460fc3f1ed938e4\",\"src_docs_pages_mdx_resources_models_mdx\":\"a05001cbe3938a8e48c4\",\"src_docs_pages_mdx_resources_site_builders_mdx\":\"2719d036ff90a273ff38\",\"src_docs_pages_mdx_resources_textures_mdx\":\"f8aa576454169a27fb8c\",\"src_docs_pages_mdx_resources_threejs_mdx\":\"84f5a7902e4bea10fc1f\",\"src_docs_pages_mdx_tutorials_camera_renderer_mdx\":\"4c5d81e1deb3fda000b5\",\"src_docs_pages_mdx_tutorials_configurator_mdx\":\"f04e49d733d3f395050f\",\"src_docs_pages_mdx_tutorials_debugging_mdx\":\"5584d2c941ef32debe89\",\"src_docs_pages_mdx_tutorials_index_mdx\":\"9ede7476ccd520327592\",\"src_docs_pages_mdx_tutorials_instancing_mdx\":\"f82f31dc382061d64a85\",\"src_docs_pages_mdx_tutorials_introducing_audio_nodes_mdx\":\"40d578627904d8a64433\",\"src_docs_pages_mdx_tutorials_mapbox_basics_mdx\":\"0b72ce23e9577621eb5a\",\"src_docs_pages_mdx_tutorials_marketplace_mdx\":\"458e859896c69ff1ffa3\",\"src_docs_pages_mdx_tutorials_marketplace_edit_templates_mdx\":\"48ced8cb3bf35ad7b5ab\",\"src_docs_pages_mdx_tutorials_particles_logo_mdx\":\"911f1135bfee9dcabb59\",\"src_docs_pages_mdx_tutorials_particles_music_mdx\":\"24c1d7ab0e8f8e27fa32\",\"src_docs_pages_mdx_tutorials_poly_nodes_mdx\":\"2852dce85df86180da6b\",\"src_docs_pages_mdx_tutorials_preparing_models_mdx\":\"becfdb4d98bbc9e42533\",\"src_docs_pages_mdx_tutorials_states_and_events_introduction_mdx\":\"5c71dfa3aa39785cfdd8\",\"src_docs_pages_mdx_tutorials_troubleshooting_mdx\":\"b8e65340cf4ecf12a9cf\",\"src_docs_pages_mdx_upgrade_mdx\":\"c7dd0a60a6b61dd7a951\",\"src_docs_pages_mdx_your_first_scene_mdx\":\"bc8c83ad36c3faef58f1\",\"src_editor_components_panels_network_components_nodes_extras_js_Debug_vue\":\"2311388274999fcfbc01\",\"src_editor_components_widgets_monaco_MonacoEditorWrapper_vue\":\"6e4dde0188d4f4b483aa\",\"src_editor_components_panels_params_components_extras_nodes_anim_Null_vue\":\"3e3b99c800cfe3c6f505\",\"src_editor_components_panels_params_components_extras_nodes_anim_Play_vue\":\"dc4430cf1a1350932f55\",\"src_editor_components_panels_params_components_extras_nodes_audio_File_vue\":\"c74eea11e7322e0f6f25\",\"src_editor_components_panels_params_components_extras_instruments_piano_Piano_vue\":\"815a5b0035f2d5289344\",\"src_editor_components_panels_params_components_extras_nodes_audio_Switch_vue\":\"ce7c1a7ce3ed92fc5b83\",\"src_editor_components_panels_params_components_extras_nodes_cop_ImageEXR_vue\":\"9f2f2259b4e75cac4273\",\"src_editor_components_panels_params_components_extras_nodes_cop_SDFExporter_vue\":\"294653c89a838bd1fc9e\",\"src_editor_components_panels_params_components_extras_nodes_gl_Param_vue\":\"5c7a5827c3e19be6b221\",\"src_editor_components_panels_params_components_extras_nodes_gl_Ramp_vue\":\"06266ff16f829ef2dca5\",\"src_editor_components_panels_params_components_extras_nodes_gl_Texture_vue\":\"544fee5b12e868d090b7\",\"src_editor_components_panels_params_components_extras_nodes_gl_Texture2DArray_vue\":\"e838d65717c4796fe83a\",\"src_editor_components_panels_params_components_extras_nodes_gl_TextureSDF_vue\":\"ec7d0dc416876ab483af\",\"src_editor_components_panels_params_components_extras_nodes_js_Keyframes_vue\":\"0a7fa6e455da3b7bc945\",\"src_editor_components_panels_params_components_extras_nodes_rop_PathTracingRenderer_vue\":\"334ead1e56021fecb0a3\",\"src_editor_components_panels_params_components_extras_nodes_sop_CameraWebXRARMarkerTracking_vue\":\"c350ca9659c9776682bc\",\"_polygonjs_polygonjs_src_engine_nodes_mat_utils_UniformsFogController_ts-src_editor_component-6ba838\":\"d2201e61a5bbe9c955df\",\"src_editor_components_panels_params_components_extras_nodes_sop_Exporter_vue\":\"a5b1b2d7f3843460a813\",\"src_editor_components_panels_params_components_extras_nodes_sop_Merge_vue\":\"767cad49c2e57215ec39\",\"src_editor_components_panels_params_components_extras_nodes_sop_Switch_vue\":\"bc34b006750919790609\",\"src_engine_examples_ExamplesRegister_ts\":\"767cd0c066667d7f5649\",\"vendors-_polygonjs_polygonjs_node_modules_dimforge_rapier3d-compat_rapier_es_js\":\"eb4f7faeeb5e946377e0\",\"node_modules_monaco-editor_esm_vs_basic-languages_typescript_typescript_js\":\"35bea73312d8ae756905\",\"vendors-node_modules_monaco-editor_esm_vs_language_typescript_tsMode_js\":\"7230e84b9ae6e95d2f0d\",\"vendors-node_modules_monaco-editor_esm_vs_language_json_jsonMode_js\":\"3fe256ec7615cdd78d68\",\"node_modules_monaco-editor_esm_vs_basic-languages_css_css_js\":\"c8b8ca238e2dd8a89f73\",\"vendors-node_modules_monaco-editor_esm_vs_language_css_cssMode_js\":\"babdb52230f8e69c3054\",\"node_modules_monaco-editor_esm_vs_basic-languages_html_html_js\":\"81e090a9dba0a3668904\",\"vendors-node_modules_monaco-editor_esm_vs_language_html_htmlMode_js\":\"58c67c115e430a5fa04f\",\"_polygonjs_polygonjs_src_engine_poly_registers_nodes_types_Mat_ts-src_editor_components_edito-9da109\":\"0b14d9f6fe9b5a4e87b2\",\"src_engine_examples_examples_actor_AnimationMixer_onScenePlay_ts\":\"af5d595903d45905472e\",\"src_engine_examples_examples_actor_OnObjectAttributeUpdate_ts\":\"546a9f2c01da9892e62f\",\"src_engine_examples_examples_actor_SetObjectLookAt_camera_ts\":\"78cdc996a1fb971c6d39\",\"src_engine_examples_examples_actor_SetObjectLookAt_cursor_ts\":\"5dddb54c225e5bb07cdb\",\"src_engine_examples_examples_actor_TrackHand_physics_ts\":\"22bed741f77f9590f3da\",\"src_engine_examples_examples_anim_Easing_ts\":\"58a8654e16df6b570c33\",\"src_engine_examples_examples_anim_Target_Node_ts\":\"ccc8fb87fffdb1086eb5\",\"src_engine_examples_examples_anim_Target_SceneGraph_ts\":\"0918911d3beeaaffe4c9\",\"src_engine_examples_examples_mat_LineBasic_ts\":\"608f5f046f806dba674b\",\"src_engine_examples_examples_mat_LineBasicBuilder_grass_ts\":\"96f631ec6607c9066f46\",\"src_engine_examples_examples_mat_MeshBasic_ts\":\"e44ac3981b7840f30811\",\"src_engine_examples_examples_mat_MeshBasicBuilder_blink_multiple_ts\":\"fe9c2183c1126d5f4e83\",\"src_engine_examples_examples_mat_MeshBasicBuilder_blink_on_hover_with_instances_ts\":\"248ad209866a5804f75a\",\"src_engine_examples_examples_mat_MeshBasicBuilder_blink_single_ts\":\"dc35fb5bf30e8dbdf910\",\"src_engine_examples_examples_mat_MeshBasicBuilder_texture_transition_ts\":\"9e45cbfaf5ec6fdea4ab\",\"src_engine_examples_examples_mat_MeshLambert_ts\":\"2f1874163c5d9e4253ac\",\"src_engine_examples_examples_mat_MeshMatcap_ts\":\"349a9f76f346b731db8a\",\"src_engine_examples_examples_mat_MeshNormal_ts\":\"95bf54a2e3b7e8f7d5fa\",\"src_engine_examples_examples_mat_MeshPhong_ts\":\"448c054c38b2ff03c029\",\"src_engine_examples_examples_mat_MeshPhysical_ts\":\"1f7f4fdd4e883eb1e63b\",\"src_engine_examples_examples_mat_MeshPhysicalBuilder_tranmission_animation_ts\":\"2f7a3964991b75b53e36\",\"src_engine_examples_examples_mat_MeshStandard_ts\":\"b9c4a280d71f76fe971d\",\"src_engine_examples_examples_mat_MeshStandardBuilder_texture_distortion_ts\":\"0eb70d14b54ec2bc6b17\",\"src_engine_examples_examples_mat_MeshToon_ts\":\"3a194fb90c28f68aab3b\",\"src_engine_examples_examples_mat_Points_ts\":\"9d8cc1d4067623507ffa\",\"src_engine_examples_examples_mat_RayMarchingBuilder_areaLights_ts\":\"bc2e38ed39a111797991\",\"src_engine_examples_examples_mat_RayMarchingBuilder_multishapes_ts\":\"631adf0ab062c4ab785e\",\"src_engine_examples_examples_mat_RayMarchingBuilder_primitives_ts\":\"cb0bd0ca018f3396a288\",\"src_engine_examples_examples_mat_RayMarchingBuilder_reflections_ts\":\"27e453e6422b8033fec8\",\"src_engine_examples_examples_mat_RayMarchingBuilder_refractions_ts\":\"28d43950e8bc35c55145\",\"src_engine_examples_examples_mat_RayMarchingBuilder_SDFFromObject_ts\":\"48072a0ff81e1f7e3870\",\"src_engine_examples_examples_mat_RayMarchingBuilder_shadows_ts\":\"efc9e9d7d7472cda358b\",\"src_engine_examples_examples_mat_RayMarchingBuilder_WebXRAR_ts\":\"dae6fa6d84b84db9f908\",\"src_engine_examples_examples_mat_Shadow_ts\":\"cdbe5c855d22e1a8b2ff\",\"src_engine_examples_examples_mat_Sky_ts\":\"561c15f683302c6c1048\",\"src_engine_examples_examples_sop_Add_createLine_ts\":\"b9b107966458bb06812a\",\"src_engine_examples_examples_sop_Add_ts\":\"1612059b414d72a82bdc\",\"src_engine_examples_examples_sop_AttribAddMult_ts\":\"0c847afe890574e3df45\",\"src_engine_examples_examples_sop_AttribCopy_ts\":\"08ce5fecf6d4226cd39f\",\"src_engine_examples_examples_sop_AttribCreate_ts\":\"122ac52382fb449099c7\",\"src_engine_examples_examples_sop_Blend_ts\":\"265522e743c934197879\",\"src_engine_examples_examples_sop_Box_ts\":\"c84e1035f93ab549a8ec\",\"src_engine_examples_examples_sop_CameraWebXRAR_basic_ts\":\"fc665a95f3ee2e8d2836\",\"src_engine_examples_examples_controls_firstPersonControls_BVH_compact_ts\":\"122b998ee968b12baa68\",\"src_engine_examples_examples_sop_CameraWebXRAR_controllerRay_ts\":\"2f7f3e10dd0c2e72b78e\",\"src_engine_examples_examples_sop_CameraWebXRAR_controllerRay2_ts\":\"bc7cd8ce043bd0559ca0\",\"src_engine_examples_examples_sop_CameraWebXRVR_basic_ts\":\"ebaeec63db0a8b3265de\",\"src_engine_examples_examples_sop_Copy_materialsAndTextures_ts\":\"aef12163ffd59e068fad\",\"src_engine_examples_examples_sop_Copy_stairCaseFPS_ts\":\"4ab2e9d49e72df522437\",\"src_engine_examples_examples_sop_Copy_stairCaseMultiple_ts\":\"7e7930bab0e8cbf13f38\",\"src_engine_examples_examples_sop_Copy_stairCaseSimple_ts\":\"03ac6264c743bc30d5ce\",\"src_engine_examples_examples_sop_Copy_withTemplateAttributes_ts\":\"e637d648bc6e7b4fb5ad\",\"src_engine_examples_examples_sop_CSS2DObject_basic_ts\":\"78a4dec3414ed4d6ff70\",\"src_engine_examples_examples_sop_CSS2DObject_clickable_ts\":\"bd606b53019d7452edbb\",\"src_engine_examples_examples_sop_CSS2DObject_fromData_ts\":\"0eef8c787b016e772dd2\",\"src_engine_examples_examples_sop_CSS3DObject_basic_ts\":\"af6b735e96bc1963dc46\",\"src_engine_examples_examples_sop_ClickableObjects_ts\":\"a9d6326041fe3d9a6a6b\",\"src_engine_examples_examples_sop_Data_advanced_ts\":\"0b152e37e0da93004bf3\",\"src_engine_examples_examples_sop_Data_advancedWithCopy_ts\":\"3399792426e6842d275b\",\"src_engine_examples_examples_sop_Data_basic_ts\":\"2c6558f299621d62351f\",\"src_engine_examples_examples_sop_DataUrl_ts\":\"edfb634f04321092fb1c\",\"src_engine_examples_examples_sop_Decompose_basic_ts\":\"86f5fa4e525ef76210d3\",\"src_engine_examples_examples_sop_File_ts\":\"910b8658b71df645c48c\",\"src_engine_examples_examples_sop_FileGEOJSON_ts\":\"59bd46ae2a5d6903e96f\",\"src_engine_examples_examples_sop_Instance_withTemplateAttributes_ts\":\"32eac29a9be489aab65b\",\"src_engine_examples_examples_sop_Instance_ts\":\"ad9dcd7d9c959de35205\",\"src_engine_examples_examples_sop_MapboxCamera_basic_ts\":\"e3075a6f216d0a0348bc\",\"src_engine_examples_examples_sop_MapboxPlaceSingleObject_ts\":\"65b06e562a8c12090ef7\",\"src_engine_examples_examples_sop_MapboxPlaceObjectsFromPool_ts\":\"b05898db0d9e0b0790c4\",\"src_engine_examples_examples_sop_MapboxPlaceObjectsProcedurally_ts\":\"4de4a02a3d6e33cfc9f1\",\"src_engine_examples_examples_sop_MapboxCamera_html2D_ts\":\"04e91b70dea4ab9cbd92\",\"src_engine_examples_examples_sop_Noise_ts\":\"019e3a9362173ca4c3cf\",\"src_engine_examples_examples_sop_ParticlesSystemGPU_polygonjsLogo_ts\":\"6f9dbc7669a642b67d9a\",\"src_engine_examples_examples_sop_PerspectiveCamera_lookAtClickedObject_ts\":\"1886e4fabfb18d485d9f\",\"src_engine_examples_examples_sop_RoundedBox_ts\":\"9a3f812ec8e336070e0d\",\"src_engine_examples_examples_sop_Sphere_icosahedron_ts\":\"2c896cec34d087b74769\",\"src_engine_examples_examples_sop_Sphere_ts\":\"57ff3714bdbf2293a693\",\"src_engine_examples_examples_sop_Subdivide_ts\":\"c5710d69087f0a8cf612\",\"src_engine_examples_examples_sop_Switch_ts\":\"f2b1f95e0150ebfbe9a4\",\"src_engine_examples_examples_sop_Tetrahedron_ts\":\"37b5fe60478147ec9223\",\"src_engine_examples_examples_sop_Torus_ts\":\"3161db92186927cba2b3\",\"src_engine_examples_examples_sop_TorusKnot_ts\":\"8c0955d9810df5f4ef52\",\"src_engine_examples_examples_sop_UvUnwrap_ts\":\"c3b5d2b2baf02e5ae726\",\"src_engine_examples_examples_expressions_bbox_ts\":\"e5d0841b2ce12645c9b2\",\"src_engine_examples_examples_expressions_centroid_ts\":\"7482ad8907753b943e4f\",\"src_engine_examples_examples_advanced_CornellBoxLightMaps_ts\":\"27648276081172367cba\",\"src_engine_examples_examples_advanced_PsychedelicCar_ts\":\"06d790b700540700d9d4\",\"src_engine_examples_examples_advanced_TubesFlowingOnCurves_ts\":\"2b0d9fc9aedd6a33e182\",\"src_engine_examples_examples_advanced_Portal_ts\":\"e247a754d4a980b5cabc\",\"src_engine_examples_examples_advanced_VertexAnimationTexture_simple_ts\":\"3542508a5d2096f133de\",\"src_engine_examples_examples_advanced_LightMap_ts\":\"53bff4460d75a528f184\",\"src_engine_examples_examples_advanced_CigarSmoke_ts\":\"3c26a0595d65b55335d8\",\"src_engine_examples_examples_advanced_ClothSolverBasic_ts\":\"f41e346610beb6b7401d\",\"src_engine_examples_examples_advanced_SoftBodySolverBasic_ts\":\"1deade1853eda3202e9e\",\"src_engine_examples_examples_advanced_SoftBodySolverHighRes_ts\":\"c580e981b5ee86dece66\",\"src_engine_examples_examples_physics_PhysicsRBDAttractorCursor_ts\":\"212cb1a7d99a4d104082\",\"src_engine_examples_examples_physics_PhysicsRBDSimple_ts\":\"14b1cc9feb03fd7f05c2\",\"src_engine_examples_examples_sop_CAD_fillet_ts\":\"3b725bb115148994d552\",\"vendors-_polygonjs_polygonjs_node_modules_three-mesh-bvh_src_workers_generateMeshBVH_worker_js\":\"d318474bf1657ac90441\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"polygonjs_editor_components.\" + {\"vendors-node_modules_ag-grid-community_dist_ag-grid-community_cjs_js-node_modules_ag-grid-com-736807\":\"e7b293420f89b2c97662\",\"vendors-include-loader_node_modules_monaco-editor_esm_vs_editor_editor_api_js-node_modules_mo-09427e\":\"ded19945d403dfa7e580\",\"src_editor_components_panels_paramsStack_ParamsStack_vue\":\"7f03343c7d17a5dbc2ff\",\"src_editor_components_panels_animation_Animation_vue-src_editor_components_panels_animation_A-36f339\":\"8a973b9b13889378c0cd\",\"src_editor_components_panels_animation_AnimationModal_vue-src_editor_components_panels_animat-4f7378\":\"8a973b9b13889378c0cd\",\"src_docs_expressions_Expressions_vue\":\"c6591f7081d5fa5f6e91\",\"src_editor_components_panels_params_components_extras_instruments_piano_Piano_vue\":\"5ef305b085b39bbea7a9\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\n// data-webpack is not used as build has no uniqueName\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\t\tscript.type = \"module\";\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/editor/\";","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t\"polygonjs-editor\": 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"vendors-node_modules_ag-grid-community_dist_ag-grid-community_cjs_js-node_modules_ag-grid-com-736807\":1,\"vendors-include-loader_node_modules_monaco-editor_esm_vs_editor_editor_api_js-node_modules_mo-09427e\":1,\"src_editor_components_panels_paramsStack_ParamsStack_vue\":1,\"src_editor_components_panels_animation_Animation_vue-src_editor_components_panels_animation_A-36f339\":1,\"src_editor_components_panels_animation_AnimationModal_vue-src_editor_components_panels_animat-4f7378\":1,\"src_docs_expressions_Expressions_vue\":1,\"src_editor_components_panels_params_components_extras_instruments_piano_Piano_vue\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"polygonjs-editor\": 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk\"] = self[\"webpackChunk\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import {NpmModuleApiController} from './NpmModuleApiController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\nexport class NpmModuleLibraryInstallerClass {\n\tprivate static _instance: NpmModuleLibraryInstallerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NpmModuleLibraryInstallerClass());\n\t}\n\n\tasync requestDracoInstallation() {\n\t\tconst result = await StoreController.editor.dialogConfirm.show({\n\t\t\ttitle: 'Draco library required',\n\t\t\tmessage: 'This example requires the draco library, do you accept to download it in this project?',\n\t\t\tacceptLabel: 'Install Draco',\n\t\t});\n\t\tif (result) {\n\t\t\tconst response = await NpmModuleApiController.libraries.installDraco();\n\t\t\tif (!response) {\n\t\t\t\tStoreController.editor.status.setError('failed to install draco');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const NpmModuleLibraryInstaller = NpmModuleLibraryInstallerClass.instance();\n","import {NodeContext} from '../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {PolyNodeController} from '../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\n\nimport {API_ROOT_URL} from './controllers/Common';\nimport {LocalServerUrl, PolyNode, MarketPlace} from './NpmModuleTypes';\nexport class NpmMarketplaceController {\n\t/*\n\t *\n\t * MARKETPLACE\n\t *\n\t */\n\tstatic async marketplacePolyNodeIndex(\n\t\toptions: MarketPlace.PolyNodeIndexRequestBody\n\t): Promise<MarketPlace.PolyNodeIndexResponseFromLocal> {\n\t\t// const username = StoreController.editor.currentUser.username().value;\n\t\t// if (!username) {\n\t\t// \tconsole.warn('you need to be logged in to fetch polyNodes');\n\t\t// \treturn {error: 'username is required'};\n\t\t// }\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MARKETPLACE_POLY_NODES_INDEX}`;\n\t\t// const urlParams = new URLSearchParams();\n\t\t// urlParams.append('username', username);\n\t\t// urlParams.append('secret', options.secret);\n\t\t// if (window.skip_token_with_username) {\n\t\t// \turlParams.append('skip_token_with_username', window.skip_token_with_username);\n\t\t// }\n\t\t// const urlWithQuery = `${url}?${urlParams.toString()}`;\n\t\tconst data: MarketPlace.PolyNodeIndexRequestBody = options;\n\t\tif (window.skip_token_with_username) {\n\t\t\tdata.skip_token_with_username = window.skip_token_with_username;\n\t\t}\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {error: 'bad response from server'};\n\t\t\t}\n\t\t\tconst json = (await response.json()) as MarketPlace.PolyNodeIndexResponseFromLocal;\n\t\t\treturn json;\n\t\t} catch (err) {\n\t\t\treturn {error: 'bad response from server'};\n\t\t}\n\t}\n\tstatic async marketplacePolyNodeSearch(\n\t\toptions: MarketPlace.PolyNodeSearchRequestFromEditorBody\n\t): Promise<MarketPlace.PolyNodeSearchResponseFromServer> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MARKETPLACE_POLY_NODES_SEARCH}`;\n\t\t// const urlParams = new URLSearchParams();\n\t\t// urlParams.append('q', options.q || '');\n\t\t// if (window.skip_token_with_username) {\n\t\t// \turlParams.append('skip_token_with_username', window.skip_token_with_username);\n\t\t// } else {\n\t\t// \turlParams.append('secret', options.secret);\n\t\t// }\n\t\t// const urlWithQuery = `${url}?${urlParams.toString()}`;\n\t\tconst data: MarketPlace.PolyNodeSearchRequestFromEditorBody = options;\n\t\tif (window.skip_token_with_username) {\n\t\t\tdata.skip_token_with_username = window.skip_token_with_username;\n\t\t}\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.warn('response', response.status, response);\n\t\t\t\treturn {error: 'bad response from server'};\n\t\t\t}\n\t\t\tconst json = (await response.json()) as MarketPlace.PolyNodeSearchResponseFromServer;\n\t\t\treturn json;\n\t\t} catch (err) {\n\t\t\treturn {error: 'bad response from server'};\n\t\t}\n\t}\n\tstatic async marketplacePolyNodeDownload(\n\t\toptions: MarketPlace.PolyNodeDownloadRequestFromEditorBody\n\t): Promise<MarketPlace.PolyNodeDownloadResponseFromLocal> {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MARKETPLACE_POLY_NODES_DOWNLOAD}`;\n\t\t// const urlParams = new URLSearchParams();\n\t\t// urlParams.append('username', options.username);\n\t\t// urlParams.append('node_context', options.node_context);\n\t\t// urlParams.append('node_type', options.node_type);\n\t\t// urlParams.append('version', `${options.version}`);\n\t\t// if (window.skip_token_with_username) {\n\t\t// \turlParams.append('skip_token_with_username', window.skip_token_with_username);\n\t\t// }\n\t\tconst data: MarketPlace.PolyNodeDownloadRequestFromEditorBody = options;\n\t\tif (window.skip_token_with_username) {\n\t\t\tdata.skip_token_with_username = window.skip_token_with_username;\n\t\t}\n\t\t// urlParams.append('fromOtherUser', `${options.fromOtherUser}`);\n\t\t// const urlWithQuery = `${url}?${urlParams.toString()}`;\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t});\n\t\t\tconst json = (await response.json()) as MarketPlace.PolyNodeDownloadResponseFromLocal;\n\n\t\t\tif (json.error) {\n\t\t\t\tStoreController.editor.status.setError(json.error);\n\t\t\t\treturn {error: 'bad response from server'};\n\t\t\t}\n\t\t\tif (!json.polyNodeDefinition) {\n\t\t\t\tStoreController.editor.status.setError('no definition in response');\n\t\t\t\treturn {error: 'bad response from server'};\n\t\t\t}\n\n\t\t\tPolyNodeController.createNodeClassAndRegister({\n\t\t\t\tnode_context: options.node_context as NodeContext,\n\t\t\t\tnode_type: options.node_type,\n\t\t\t\tdata: json.polyNodeDefinition,\n\t\t\t});\n\n\t\t\treturn json;\n\t\t} catch (err) {\n\t\t\treturn {error: 'bad response from server'};\n\t\t}\n\t}\n\tstatic async marketplacePolyNodeUpload(data: MarketPlace.PolyNodeUploadRequestFromLocalEditorBody) {\n\t\tconst url = `${API_ROOT_URL}${LocalServerUrl.MARKETPLACE_POLY_NODES_UPLOAD}`;\n\n\t\tif (window.skip_token_with_username) {\n\t\t\tdata.skip_token_with_username = window.skip_token_with_username;\n\t\t}\n\t\tconsole.log('upload', data);\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(data),\n\t\t});\n\t\tconst json = (await response.json()) as PolyNode.CreateResponse;\n\t\treturn json;\n\t}\n}\n","import {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {EditorLayoutData} from '../editor/types';\nimport {SceneJsonExporterData} from '../../@polygonjs/polygonjs/src/engine/io/json/export/Scene';\nimport {StoreController} from '../editor/store/controllers/StoreController';\nimport {MetaSceneTraverser} from '../editor/core/scene_traversers/Meta';\nimport {NpmModuleApiController} from './NpmModuleApiController';\nimport {SceneConfig} from './controllers/ScenesController';\nimport {Poly} from '../../@polygonjs/polygonjs/src/engine/Poly';\n// import {Editor} from '../Editor';\nimport {BaseSaveController} from '../editor/core/SceneSaveController';\nimport {WindowController} from '../editor/core/WindowController';\nimport {sceneDataWithVersion, versions} from '../editor/versions';\nimport {Editor} from '../editor/Editor';\nimport {AppSceneLoader} from '../config/AppSceneLoader';\ninterface NpmModuleSceneSaveControllerOptions {\n\trequestNewName: boolean;\n}\ninterface SaveOptions {\n\tforceDownloadIfRemoteAssets?: boolean;\n}\nexport class NpmModuleSceneSaveController extends BaseSaveController {\n\tconstructor(\n\t\tprivate scene: PolyScene,\n\t\tprivate code: SceneJsonExporterData,\n\t\tprivate layout_data: EditorLayoutData,\n\t\tprivate options: NpmModuleSceneSaveControllerOptions\n\t) {\n\t\tsuper();\n\t}\n\n\tstatic engineVersion() {\n\t\treturn versions().polygonjs;\n\t}\n\n\tasync save(options?: SaveOptions) {\n\t\tlet forceDownloadIfRemoteAssets = options?.forceDownloadIfRemoteAssets;\n\t\tif (forceDownloadIfRemoteAssets == null) {\n\t\t\tforceDownloadIfRemoteAssets = true;\n\t\t}\n\n\t\tconst engine_version = NpmModuleSceneSaveController.engineVersion();\n\n\t\t/**\n\t\t *\n\t\t * check if scene is readonly\n\t\t *\n\t\t */\n\t\tif (StoreController.editor.readonly.readonly() == true) {\n\t\t\tconst reason = StoreController.editor.readonly.reason();\n\t\t\tlet message = 'This scene cannot be saved as it is marked as read-only';\n\t\t\tif (reason) {\n\t\t\t\tmessage = `${message} since ${reason}`;\n\t\t\t\talert(message);\n\t\t\t}\n\t\t\tthis.updateStatusBarWithNoSave(message);\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t *\n\t\t * check if the scene is already being saved\n\t\t *\n\t\t */\n\t\tif (WindowController.instance().sceneSavingInProgress()) {\n\t\t\tconst message = 'the scene is currently being saved, please wait';\n\t\t\talert(message);\n\t\t\tthis.updateStatusBarWithNoSave(message);\n\t\t\treturn;\n\t\t}\n\t\t/**\n\t\t *\n\t\t * check if the scene uses remote assets\n\t\t *\n\t\t */\n\t\t// traverse scene\n\t\tconst metaTraverser = new MetaSceneTraverser(this.scene);\n\t\tawait metaTraverser.traverseScene();\n\n\t\tconst hasRemoteAssets = metaTraverser.localAssets.paramsReferencingRemoteAsset().length > 0;\n\t\t// const exportRequested = this.layout_data.saveOptions?.createExport == true;\n\t\tconst sceneIsPersisted = AppSceneLoader.scenePersisted();\n\t\tconst checkRemoteAssetsUse = Editor.instance().checkRemoteAssetsUse();\n\t\t// if (this.layout_data.saveOptions) {\n\t\t// \tthis.layout_data.saveOptions.skipExportSinceRemoteAssetsPresents = hasRemoteAssets && exportRequested;\n\t\t// }\n\t\tif (hasRemoteAssets && sceneIsPersisted && checkRemoteAssetsUse) {\n\t\t\tif (forceDownloadIfRemoteAssets) {\n\t\t\t\t// \t\t\talert(`Some nodes are referencing an external asset.\n\t\t\t\t// Make sure to download those in your local project.\n\n\t\t\t\t// ${metaTraverser.localAssets\n\t\t\t\t// \t.nodesReferencingRemoteAsset()\n\t\t\t\t// \t.map((n) => n.name())\n\t\t\t\t// \t.map((name) => `- ${name}`)\n\t\t\t\t// \t.join('\\n')}\n\t\t\t\t// `);\n\t\t\t\tStoreController.editor.panelAssetsList.open({\n\t\t\t\t\tonClose: async () => {\n\t\t\t\t\t\t// we need to make sure the code that will be saved is up to date\n\t\t\t\t\t\t// with the asset urls that were just changed\n\t\t\t\t\t\tthis.code = await sceneDataWithVersion({scene: this.scene, withPersistedConfig: true});\n\t\t\t\t\t\tthis.save({forceDownloadIfRemoteAssets: false});\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t *\n\t\t * check if the scene has a name\n\t\t *\n\t\t */\n\t\tif (!this.scene.name() || this.options.requestNewName) {\n\t\t\t// scenePreviousPersisted = false;\n\t\t\tconst sceneName = await StoreController.editor.dialogPrompt.show({\n\t\t\t\ttitle: 'Name your scene:',\n\t\t\t\tconfirmLabel: 'Save',\n\t\t\t\tdefaultValue: this.scene.name() || 'scene_01',\n\t\t\t});\n\t\t\tif (sceneName) {\n\t\t\t\tthis.scene.setName(sceneName);\n\t\t\t}\n\t\t}\n\t\tconst sceneName = this.scene.name();\n\t\tif (!sceneName) {\n\t\t\tthis.updateStatusBarWithNoSave();\n\t\t\treturn;\n\t\t}\n\n\t\tconst plugins_data = Poly.pluginsRegister.toJson();\n\n\t\t// const {fullUrls, storedUrls} = Poly.blobs.assetsManifestWithBlobsMap();\n\t\tconst assets = await metaTraverser.localAssets.urls();\n\t\tconst configAssets = [assets][0];\n\t\tconst sceneData: SceneConfig = {\n\t\t\tengine_version,\n\t\t\tname: sceneName,\n\t\t\tcode: this.code,\n\t\t\tlayout_data: this.layout_data,\n\t\t\tnodes: metaTraverser.nodes.usedNodes(),\n\t\t\toperations: metaTraverser.nodes.usedOperations(),\n\t\t\tjsFunctionTypes: metaTraverser.nodes.usedJsFunctionTypes(),\n\t\t\tassets: configAssets,\n\t\t\tmodules: metaTraverser.modules.requiredModules(),\n\t\t\tassemblers: metaTraverser.assemblers.used_assemblers(),\n\t\t\tintegrations: metaTraverser.integrations.used_integrations(),\n\t\t\tnodes_map: metaTraverser.nodesMap.nodes_map(),\n\t\t\tplugins_data,\n\t\t\tpoly_nodes: metaTraverser.polyNodes.usedPolyNodes(),\n\t\t\tlibsRoot: Poly.libs.root() || '',\n\t\t\tassetsRoot: this.scene.assets.root() || '',\n\t\t\tscenePropTypes: metaTraverser.propTypes.propTypesMap(),\n\t\t};\n\t\tawait NpmModuleApiController.scenes.save(sceneData);\n\t}\n}\n","import {NpmAuthController} from './NpmAuthController';\nimport {NpmMarketplaceController} from './NpmMarketplaceController';\nimport {PolyNodeDefinition} from './../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDefinition';\nimport {PolyNode} from './NpmModuleTypes';\nimport {PolyNodeDataRegister} from '../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeDataRegister';\nimport {NodeContext} from '../../@polygonjs/polygonjs/src/engine/poly/NodeContext';\nimport {PolyNodeController} from '../../@polygonjs/polygonjs/src/engine/nodes/utils/poly/PolyNodeController';\nimport {BaseNodeType} from '../../@polygonjs/polygonjs/src/engine/nodes/_Base';\nimport {BasePolyNodeSaveController, PolyNodeDownloadOptions} from '../editor/core/_BasePolyNodeSaveController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\nimport {NpmModuleApiController} from './NpmModuleApiController';\nimport {versions} from '../editor/versions';\n\nexport function addPolyNodeMetadata(data: PolyNodeDefinition) {\n\tdata.metadata = data.metadata || {};\n\tdata.metadata.version = {\n\t\t// polyNode: 1,\n\t\teditor: versions().editor,\n\t\tpolygonjs: versions().polygonjs,\n\t};\n\tdata.metadata.createdAt = Date.now();\n}\nexport class NpmModulePolyNodeSaveController extends BasePolyNodeSaveController {\n\tasync readAndRegisterPolyNodes() {\n\t\tconst nodeDefinitions = await NpmModuleApiController.polyNodes.index();\n\t\tif (!nodeDefinitions) {\n\t\t\treturn;\n\t\t}\n\t\tfor (let definition of nodeDefinitions) {\n\t\t\tconst definitionWithNodeContext = {\n\t\t\t\t...definition,\n\t\t\t\tnode_context: definition.node_context as NodeContext,\n\t\t\t};\n\t\t\tPolyNodeController.createNodeClassAndRegister(definitionWithNodeContext);\n\t\t}\n\t}\n\n\tasync create(node: BaseNodeType, polyNodeData: PolyNode.DataRegisterDummy): Promise<BaseNodeType | undefined> {\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 1) {\n\t\t\tconsole.log('*** polynode create START');\n\t\t}\n\t\tconst node_context = polyNodeData.node_context as NodeContext;\n\t\tconst convertedPolyNodeData: PolyNodeDataRegister<NodeContext> = {\n\t\t\tnode_context,\n\t\t\tnode_type: polyNodeData.node_type,\n\t\t\tdata: polyNodeData.data,\n\t\t};\n\t\taddPolyNodeMetadata(convertedPolyNodeData.data);\n\t\tconst json = await NpmModuleApiController.polyNodes.create(convertedPolyNodeData);\n\t\tif (BasePolyNodeSaveController.DEBUG_LEVEL > 1) {\n\t\t\tconsole.log(json);\n\t\t}\n\t\tif (json.error) {\n\t\t\tconsole.error(json.error);\n\t\t\tStoreController.editor.status.setError(json.error);\n\t\t} else {\n\t\t\tconst newNode = this._createPolyNodeAndReplaceNode(node, convertedPolyNodeData);\n\t\t\tStoreController.editor.status.setMessage('poly node created');\n\t\t\tif (newNode) {\n\t\t\t\treturn newNode;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync update(node: BaseNodeType, polyNodeData: PolyNode.DataRegisterDummy): Promise<BaseNodeType | undefined> {\n\t\tconst node_context = polyNodeData.node_context as NodeContext;\n\t\tconst convertedPolyNodeData: PolyNodeDataRegister<NodeContext> = {\n\t\t\tnode_context,\n\t\t\tnode_type: polyNodeData.node_type,\n\t\t\tdata: polyNodeData.data,\n\t\t};\n\t\taddPolyNodeMetadata(convertedPolyNodeData.data);\n\t\tconst json = await NpmModuleApiController.polyNodes.update(convertedPolyNodeData);\n\t\tif (json.error) {\n\t\t\tStoreController.editor.status.setError(json.error);\n\t\t} else {\n\t\t\tconst {newNode} = this._updatePolyNodeAndReplaceNodes(node, convertedPolyNodeData, StoreController.scene);\n\t\t\tStoreController.editor.status.setMessage('poly node updated');\n\t\t\tif (newNode) {\n\t\t\t\treturn newNode;\n\t\t\t}\n\t\t}\n\t}\n\tasync download(options: PolyNodeDownloadOptions) {\n\t\tconst secret = NpmAuthController.secret();\n\t\tconst reponse = await NpmMarketplaceController.marketplacePolyNodeDownload({\n\t\t\tnode_context: options.node_context,\n\t\t\tnode_type: options.node_type,\n\t\t\tversion: options.version,\n\t\t\t// fromOtherUser: false,\n\t\t\tusername: options.username,\n\t\t\tsecret,\n\t\t});\n\t\tif (reponse.polyNodeDefinition) {\n\t\t\tconst convertedPolyNodeData: PolyNodeDataRegister<NodeContext> = {\n\t\t\t\tnode_context: options.node_context as NodeContext,\n\t\t\t\tnode_type: options.node_type,\n\t\t\t\tdata: reponse.polyNodeDefinition,\n\t\t\t};\n\t\t\tconst {convertedNodes} = this._updatePolyNodeAndReplaceNodes(\n\t\t\t\tundefined,\n\t\t\t\tconvertedPolyNodeData,\n\t\t\t\tStoreController.scene\n\t\t\t);\n\t\t\treturn convertedNodes;\n\t\t}\n\t}\n}\n","import {BaseCommand} from '../commands/_Base';\nimport {StoreController} from './../../store/controllers/StoreController';\nimport {BaseCommandJSON} from './../commands/utils/CommandType';\n\nexport interface RequestCommandResult {\n\tcommandData: BaseCommandJSON;\n}\nexport interface PushCommandResult {\n\tupdatedCommandData: BaseCommandJSON;\n\tcommand: BaseCommand;\n}\nexport interface CommandConfirmOptions {\n\tcommandData: BaseCommandJSON;\n\tstackIndex: number;\n}\nexport interface UndoRedoConfirmOptions {\n\tcommandData?: BaseCommandJSON;\n\tstackIndex: number;\n}\n\nexport abstract class BaseSerializedStack {\n\tprotected _index: number = 0;\n\tprotected _indexAtSceneSave: number = 0;\n\tprotected _doInprogress: boolean = false;\n\tprotected _undoInprogress: boolean = false;\n\n\tsceneModified(): boolean {\n\t\treturn this._index != this._indexAtSceneSave;\n\t}\n\tmarkSceneAsSaved() {\n\t\tthis._indexAtSceneSave = this._index;\n\t}\n\tsetStackIndex(index: number) {\n\t\tthis._index = index;\n\t}\n\tnotifyNoUndo() {\n\t\tStoreController.editor.status.setMessage('nothing to undo');\n\t}\n\tnotifyNoRedo() {\n\t\tStoreController.editor.status.setMessage('nothing to redo');\n\t}\n\tdoInProgress() {\n\t\treturn this._doInprogress;\n\t}\n\tundoInProgress() {\n\t\treturn this._undoInprogress;\n\t}\n\n\tabstract requestPushCommand(command: BaseCommand): Promise<void>;\n\tabstract requestUndo(): Promise<void>;\n\tabstract requestRedo(): Promise<void>;\n\tabstract confirmPushCommand(commandData: CommandConfirmOptions): Promise<PushCommandResult | undefined>;\n\tabstract confirmUndo(commandData: UndoRedoConfirmOptions): Promise<void>;\n\tabstract confirmRedo(commandData: UndoRedoConfirmOptions): Promise<void>;\n}\n","import {StoreController} from './../../store/controllers/StoreController';\nimport {createCommandFromJSON} from '../commands/utils/CommandFactory';\nimport {BaseCommandFromJSONMode} from './../commands/utils/CommandType';\nimport {BaseSerializedStack, CommandConfirmOptions, UndoRedoConfirmOptions} from './_BaseSerializedStack';\nimport {BaseCommand} from '../commands/_Base';\n\nexport class NpmSerializedStack extends BaseSerializedStack {\n\tasync requestPushCommand(command: BaseCommand) {\n\t\tconst commandData = await command.toJSON();\n\t\tawait StoreController.editor.multiPlayer.commands.requestPushCommandData(commandData);\n\t}\n\tasync requestUndo() {\n\t\t// StoreController.editor.multiPlayer.undo();\n\t\tawait StoreController.editor.multiPlayer.commands.requestUndo();\n\t}\n\tasync requestRedo() {\n\t\tawait StoreController.editor.multiPlayer.commands.requestRedo();\n\t}\n\n\t// reception of confirmations\n\tasync confirmPushCommand(options: CommandConfirmOptions) {\n\t\tconst {commandData, stackIndex} = options;\n\t\tconst command = createCommandFromJSON(StoreController.engine.scene, commandData, BaseCommandFromJSONMode.DO);\n\t\tif (!command) {\n\t\t\tconst message = 'failed not create command from data';\n\t\t\tconsole.error(message);\n\t\t\tconsole.log(commandData);\n\t\t\tStoreController.editor.status.setError(`${message}, see browser developer console for details`);\n\t\t\treturn;\n\t\t}\n\n\t\t// await StoreController.editor.multiPlayer.processConfirmedCommand({\n\t\t// \tcommand,\n\t\t// \tstackIndex: args.stackIndex,\n\t\t// \tstackUpdateConfirmedAt: args.stackUpdateConfirmedAt,\n\t\t// \tuuid: args.uuid,\n\t\t// });\n\t\t// await HistoryStack.instance().processConfirmedCommand(options.command);\n\t\tthis._doInprogress = true;\n\t\tawait command.do(this);\n\t\tthis._doInprogress = false;\n\t\tthis.setStackIndex(stackIndex);\n\t\t// this.setStackIndex(options.stackIndex);\n\t\t// this._confirmSceneData(options);\n\n\t\t// if (options.command.dataUpdateRequired()) {\n\t\t// \tNpmModuleApiController.updateCommandData({\n\t\t// \t\tuuid: options.uuid,\n\t\t// \t\tcommand: await options.command.toJSON(),\n\t\t// \t\tsceneName: this.sceneName(),\n\t\t// \t});\n\t\t// }\n\t\tconst updatedCommandData = command.dataUpdateRequired() ? await command.toJSON() : commandData;\n\t\treturn {updatedCommandData, command};\n\t}\n\tasync confirmUndo(options: UndoRedoConfirmOptions) {\n\t\tconst {commandData, stackIndex} = options;\n\t\tif (!commandData) {\n\t\t\tthis.notifyNoUndo();\n\t\t\treturn;\n\t\t}\n\t\tconst command = createCommandFromJSON(StoreController.engine.scene, commandData, BaseCommandFromJSONMode.UNDO);\n\t\t// await HistoryStack.instance().runUndo();\n\t\tif (!command) {\n\t\t\tthis.notifyNoRedo();\n\t\t\treturn;\n\t\t}\n\t\tthis._index = stackIndex;\n\t\tthis._undoInprogress = true;\n\t\tawait command.undo(this);\n\t\tthis._undoInprogress = false;\n\t}\n\tasync confirmRedo(options: UndoRedoConfirmOptions) {\n\t\tconst {commandData, stackIndex} = options;\n\t\t// await HistoryStack.instance().runRedo();\n\t\tif (!commandData) {\n\t\t\tthis.notifyNoRedo();\n\t\t\treturn;\n\t\t}\n\t\tconst command = createCommandFromJSON(StoreController.engine.scene, commandData, BaseCommandFromJSONMode.DO);\n\t\tif (!command) {\n\t\t\tthis.notifyNoRedo();\n\t\t\treturn;\n\t\t}\n\t\tthis._index = stackIndex;\n\t\tthis._doInprogress = true;\n\t\tawait command.do(this);\n\t\tthis._doInprogress = false;\n\t}\n}\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach(key => {\n    PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = obj => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n    if (withNativeBlob && data instanceof Blob) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(data, callback);\n        }\n    }\n    else if (withNativeArrayBuffer &&\n        (data instanceof ArrayBuffer || isView(data))) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(new Blob([data]), callback);\n        }\n    }\n    // plain string\n    return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n    const fileReader = new FileReader();\n    fileReader.onload = function () {\n        const content = fileReader.result.split(\",\")[1];\n        callback(\"b\" + content);\n    };\n    return fileReader.readAsDataURL(data);\n};\nexport default encodePacket;\n","const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n    let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n    for (i = 0; i < len; i += 3) {\n        base64 += chars[bytes[i] >> 2];\n        base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n        base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n        base64 += chars[bytes[i + 2] & 63];\n    }\n    if (len % 3 === 2) {\n        base64 = base64.substring(0, base64.length - 1) + '=';\n    }\n    else if (len % 3 === 1) {\n        base64 = base64.substring(0, base64.length - 2) + '==';\n    }\n    return base64;\n};\nexport const decode = (base64) => {\n    let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup[base64.charCodeAt(i)];\n        encoded2 = lookup[base64.charCodeAt(i + 1)];\n        encoded3 = lookup[base64.charCodeAt(i + 2)];\n        encoded4 = lookup[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return arraybuffer;\n};\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst decodePacket = (encodedPacket, binaryType) => {\n    if (typeof encodedPacket !== \"string\") {\n        return {\n            type: \"message\",\n            data: mapBinary(encodedPacket, binaryType)\n        };\n    }\n    const type = encodedPacket.charAt(0);\n    if (type === \"b\") {\n        return {\n            type: \"message\",\n            data: decodeBase64Packet(encodedPacket.substring(1), binaryType)\n        };\n    }\n    const packetType = PACKET_TYPES_REVERSE[type];\n    if (!packetType) {\n        return ERROR_PACKET;\n    }\n    return encodedPacket.length > 1\n        ? {\n            type: PACKET_TYPES_REVERSE[type],\n            data: encodedPacket.substring(1)\n        }\n        : {\n            type: PACKET_TYPES_REVERSE[type]\n        };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n    if (withNativeArrayBuffer) {\n        const decoded = decode(data);\n        return mapBinary(decoded, binaryType);\n    }\n    else {\n        return { base64: true, data }; // fallback for old browsers\n    }\n};\nconst mapBinary = (data, binaryType) => {\n    switch (binaryType) {\n        case \"blob\":\n            return data instanceof ArrayBuffer ? new Blob([data]) : data;\n        case \"arraybuffer\":\n        default:\n            return data; // assuming the data is already an ArrayBuffer\n    }\n};\nexport default decodePacket;\n","import encodePacket from \"./encodePacket.js\";\nimport decodePacket from \"./decodePacket.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n    // some packets may be added to the array while encoding, so the initial length must be saved\n    const length = packets.length;\n    const encodedPackets = new Array(length);\n    let count = 0;\n    packets.forEach((packet, i) => {\n        // force base64 encoding for binary packets\n        encodePacket(packet, false, encodedPacket => {\n            encodedPackets[i] = encodedPacket;\n            if (++count === length) {\n                callback(encodedPackets.join(SEPARATOR));\n            }\n        });\n    });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n    const encodedPackets = encodedPayload.split(SEPARATOR);\n    const packets = [];\n    for (let i = 0; i < encodedPackets.length; i++) {\n        const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n        packets.push(decodedPacket);\n        if (decodedPacket.type === \"error\") {\n            break;\n        }\n    }\n    return packets;\n};\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n  if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  function on() {\n    this.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks['$' + event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks['$' + event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n\n  // Remove event specific arrays for event types that no\n  // one is subscribed for to avoid memory leak.\n  if (callbacks.length === 0) {\n    delete this._callbacks['$' + event];\n  }\n\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n\n  var args = new Array(arguments.length - 1)\n    , callbacks = this._callbacks['$' + event];\n\n  for (var i = 1; i < arguments.length; i++) {\n    args[i - 1] = arguments[i];\n  }\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n","export const globalThisShim = (() => {\n    if (typeof self !== \"undefined\") {\n        return self;\n    }\n    else if (typeof window !== \"undefined\") {\n        return window;\n    }\n    else {\n        return Function(\"return this\")();\n    }\n})();\n","import { globalThisShim as globalThis } from \"./globalThis.js\";\nexport function pick(obj, ...attr) {\n    return attr.reduce((acc, k) => {\n        if (obj.hasOwnProperty(k)) {\n            acc[k] = obj[k];\n        }\n        return acc;\n    }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n    if (opts.useNativeTimers) {\n        obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n        obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n    }\n    else {\n        obj.setTimeoutFn = setTimeout.bind(globalThis);\n        obj.clearTimeoutFn = clearTimeout.bind(globalThis);\n    }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n    if (typeof obj === \"string\") {\n        return utf8Length(obj);\n    }\n    // arraybuffer or blob\n    return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n    let c = 0, length = 0;\n    for (let i = 0, l = str.length; i < l; i++) {\n        c = str.charCodeAt(i);\n        if (c < 0x80) {\n            length += 1;\n        }\n        else if (c < 0x800) {\n            length += 2;\n        }\n        else if (c < 0xd800 || c >= 0xe000) {\n            length += 3;\n        }\n        else {\n            i++;\n            length += 4;\n        }\n    }\n    return length;\n}\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nclass TransportError extends Error {\n    constructor(reason, description, context) {\n        super(reason);\n        this.description = description;\n        this.context = context;\n        this.type = \"TransportError\";\n    }\n}\nexport class Transport extends Emitter {\n    /**\n     * Transport abstract constructor.\n     *\n     * @param {Object} options.\n     * @api private\n     */\n    constructor(opts) {\n        super();\n        this.writable = false;\n        installTimerFunctions(this, opts);\n        this.opts = opts;\n        this.query = opts.query;\n        this.readyState = \"\";\n        this.socket = opts.socket;\n    }\n    /**\n     * Emits an error.\n     *\n     * @param {String} reason\n     * @param description\n     * @param context - the error context\n     * @return {Transport} for chaining\n     * @api protected\n     */\n    onError(reason, description, context) {\n        super.emitReserved(\"error\", new TransportError(reason, description, context));\n        return this;\n    }\n    /**\n     * Opens the transport.\n     *\n     * @api public\n     */\n    open() {\n        if (\"closed\" === this.readyState || \"\" === this.readyState) {\n            this.readyState = \"opening\";\n            this.doOpen();\n        }\n        return this;\n    }\n    /**\n     * Closes the transport.\n     *\n     * @api public\n     */\n    close() {\n        if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n            this.doClose();\n            this.onClose();\n        }\n        return this;\n    }\n    /**\n     * Sends multiple packets.\n     *\n     * @param {Array} packets\n     * @api public\n     */\n    send(packets) {\n        if (\"open\" === this.readyState) {\n            this.write(packets);\n        }\n        else {\n            // this might happen if the transport was silently closed in the beforeunload event handler\n        }\n    }\n    /**\n     * Called upon open\n     *\n     * @api protected\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        this.writable = true;\n        super.emitReserved(\"open\");\n    }\n    /**\n     * Called with data.\n     *\n     * @param {String} data\n     * @api protected\n     */\n    onData(data) {\n        const packet = decodePacket(data, this.socket.binaryType);\n        this.onPacket(packet);\n    }\n    /**\n     * Called with a decoded packet.\n     *\n     * @api protected\n     */\n    onPacket(packet) {\n        super.emitReserved(\"packet\", packet);\n    }\n    /**\n     * Called upon close.\n     *\n     * @api protected\n     */\n    onClose(details) {\n        this.readyState = \"closed\";\n        super.emitReserved(\"close\", details);\n    }\n}\n","// imported from https://github.com/unshiftio/yeast\n'use strict';\nconst alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split(''), length = 64, map = {};\nlet seed = 0, i = 0, prev;\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nexport function encode(num) {\n    let encoded = '';\n    do {\n        encoded = alphabet[num % length] + encoded;\n        num = Math.floor(num / length);\n    } while (num > 0);\n    return encoded;\n}\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nexport function decode(str) {\n    let decoded = 0;\n    for (i = 0; i < str.length; i++) {\n        decoded = decoded * length + map[str.charAt(i)];\n    }\n    return decoded;\n}\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nexport function yeast() {\n    const now = encode(+new Date());\n    if (now !== prev)\n        return seed = 0, prev = now;\n    return now + '.' + encode(seed++);\n}\n//\n// Map each character to its index.\n//\nfor (; i < length; i++)\n    map[alphabet[i]] = i;\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n    let str = '';\n    for (let i in obj) {\n        if (obj.hasOwnProperty(i)) {\n            if (str.length)\n                str += '&';\n            str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n        }\n    }\n    return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n    let qry = {};\n    let pairs = qs.split('&');\n    for (let i = 0, l = pairs.length; i < l; i++) {\n        let pair = pairs[i].split('=');\n        qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n    }\n    return qry;\n}\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n    value = typeof XMLHttpRequest !== 'undefined' &&\n        'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n    // if XMLHttp support is disabled in IE then it will throw\n    // when trying to create\n}\nexport const hasCORS = value;\n","// browser shim for xmlhttprequest module\nimport { hasCORS } from \"../contrib/has-cors.js\";\nimport { globalThisShim as globalThis } from \"../globalThis.js\";\nexport function XHR(opts) {\n    const xdomain = opts.xdomain;\n    // XMLHttpRequest can be disabled on IE\n    try {\n        if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n            return new XMLHttpRequest();\n        }\n    }\n    catch (e) { }\n    if (!xdomain) {\n        try {\n            return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n        }\n        catch (e) { }\n    }\n}\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encode } from \"../contrib/parseqs.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { XHR as XMLHttpRequest } from \"./xmlhttprequest.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globalThis.js\";\nfunction empty() { }\nconst hasXHR2 = (function () {\n    const xhr = new XMLHttpRequest({\n        xdomain: false\n    });\n    return null != xhr.responseType;\n})();\nexport class Polling extends Transport {\n    /**\n     * XHR Polling constructor.\n     *\n     * @param {Object} opts\n     * @api public\n     */\n    constructor(opts) {\n        super(opts);\n        this.polling = false;\n        if (typeof location !== \"undefined\") {\n            const isSSL = \"https:\" === location.protocol;\n            let port = location.port;\n            // some user agents have empty `location.port`\n            if (!port) {\n                port = isSSL ? \"443\" : \"80\";\n            }\n            this.xd =\n                (typeof location !== \"undefined\" &&\n                    opts.hostname !== location.hostname) ||\n                    port !== opts.port;\n            this.xs = opts.secure !== isSSL;\n        }\n        /**\n         * XHR supports binary\n         */\n        const forceBase64 = opts && opts.forceBase64;\n        this.supportsBinary = hasXHR2 && !forceBase64;\n    }\n    /**\n     * Transport name.\n     */\n    get name() {\n        return \"polling\";\n    }\n    /**\n     * Opens the socket (triggers polling). We write a PING message to determine\n     * when the transport is open.\n     *\n     * @api private\n     */\n    doOpen() {\n        this.poll();\n    }\n    /**\n     * Pauses polling.\n     *\n     * @param {Function} callback upon buffers are flushed and transport is paused\n     * @api private\n     */\n    pause(onPause) {\n        this.readyState = \"pausing\";\n        const pause = () => {\n            this.readyState = \"paused\";\n            onPause();\n        };\n        if (this.polling || !this.writable) {\n            let total = 0;\n            if (this.polling) {\n                total++;\n                this.once(\"pollComplete\", function () {\n                    --total || pause();\n                });\n            }\n            if (!this.writable) {\n                total++;\n                this.once(\"drain\", function () {\n                    --total || pause();\n                });\n            }\n        }\n        else {\n            pause();\n        }\n    }\n    /**\n     * Starts polling cycle.\n     *\n     * @api public\n     */\n    poll() {\n        this.polling = true;\n        this.doPoll();\n        this.emitReserved(\"poll\");\n    }\n    /**\n     * Overloads onData to detect payloads.\n     *\n     * @api private\n     */\n    onData(data) {\n        const callback = packet => {\n            // if its the first message we consider the transport open\n            if (\"opening\" === this.readyState && packet.type === \"open\") {\n                this.onOpen();\n            }\n            // if its a close packet, we close the ongoing requests\n            if (\"close\" === packet.type) {\n                this.onClose({ description: \"transport closed by the server\" });\n                return false;\n            }\n            // otherwise bypass onData and handle the message\n            this.onPacket(packet);\n        };\n        // decode payload\n        decodePayload(data, this.socket.binaryType).forEach(callback);\n        // if an event did not trigger closing\n        if (\"closed\" !== this.readyState) {\n            // if we got data we're not polling\n            this.polling = false;\n            this.emitReserved(\"pollComplete\");\n            if (\"open\" === this.readyState) {\n                this.poll();\n            }\n            else {\n            }\n        }\n    }\n    /**\n     * For polling, send a close packet.\n     *\n     * @api private\n     */\n    doClose() {\n        const close = () => {\n            this.write([{ type: \"close\" }]);\n        };\n        if (\"open\" === this.readyState) {\n            close();\n        }\n        else {\n            // in case we're trying to close while\n            // handshaking is in progress (GH-164)\n            this.once(\"open\", close);\n        }\n    }\n    /**\n     * Writes a packets payload.\n     *\n     * @param {Array} data packets\n     * @param {Function} drain callback\n     * @api private\n     */\n    write(packets) {\n        this.writable = false;\n        encodePayload(packets, data => {\n            this.doWrite(data, () => {\n                this.writable = true;\n                this.emitReserved(\"drain\");\n            });\n        });\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @api private\n     */\n    uri() {\n        let query = this.query || {};\n        const schema = this.opts.secure ? \"https\" : \"http\";\n        let port = \"\";\n        // cache busting is forced\n        if (false !== this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = yeast();\n        }\n        if (!this.supportsBinary && !query.sid) {\n            query.b64 = 1;\n        }\n        // avoid port if default for schema\n        if (this.opts.port &&\n            ((\"https\" === schema && Number(this.opts.port) !== 443) ||\n                (\"http\" === schema && Number(this.opts.port) !== 80))) {\n            port = \":\" + this.opts.port;\n        }\n        const encodedQuery = encode(query);\n        const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n        return (schema +\n            \"://\" +\n            (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n            port +\n            this.opts.path +\n            (encodedQuery.length ? \"?\" + encodedQuery : \"\"));\n    }\n    /**\n     * Creates a request.\n     *\n     * @param {String} method\n     * @api private\n     */\n    request(opts = {}) {\n        Object.assign(opts, { xd: this.xd, xs: this.xs }, this.opts);\n        return new Request(this.uri(), opts);\n    }\n    /**\n     * Sends data.\n     *\n     * @param {String} data to send.\n     * @param {Function} called upon flush.\n     * @api private\n     */\n    doWrite(data, fn) {\n        const req = this.request({\n            method: \"POST\",\n            data: data\n        });\n        req.on(\"success\", fn);\n        req.on(\"error\", (xhrStatus, context) => {\n            this.onError(\"xhr post error\", xhrStatus, context);\n        });\n    }\n    /**\n     * Starts a poll cycle.\n     *\n     * @api private\n     */\n    doPoll() {\n        const req = this.request();\n        req.on(\"data\", this.onData.bind(this));\n        req.on(\"error\", (xhrStatus, context) => {\n            this.onError(\"xhr poll error\", xhrStatus, context);\n        });\n        this.pollXhr = req;\n    }\n}\nexport class Request extends Emitter {\n    /**\n     * Request constructor\n     *\n     * @param {Object} options\n     * @api public\n     */\n    constructor(uri, opts) {\n        super();\n        installTimerFunctions(this, opts);\n        this.opts = opts;\n        this.method = opts.method || \"GET\";\n        this.uri = uri;\n        this.async = false !== opts.async;\n        this.data = undefined !== opts.data ? opts.data : null;\n        this.create();\n    }\n    /**\n     * Creates the XHR object and sends the request.\n     *\n     * @api private\n     */\n    create() {\n        const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n        opts.xdomain = !!this.opts.xd;\n        opts.xscheme = !!this.opts.xs;\n        const xhr = (this.xhr = new XMLHttpRequest(opts));\n        try {\n            xhr.open(this.method, this.uri, this.async);\n            try {\n                if (this.opts.extraHeaders) {\n                    xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n                    for (let i in this.opts.extraHeaders) {\n                        if (this.opts.extraHeaders.hasOwnProperty(i)) {\n                            xhr.setRequestHeader(i, this.opts.extraHeaders[i]);\n                        }\n                    }\n                }\n            }\n            catch (e) { }\n            if (\"POST\" === this.method) {\n                try {\n                    xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n                }\n                catch (e) { }\n            }\n            try {\n                xhr.setRequestHeader(\"Accept\", \"*/*\");\n            }\n            catch (e) { }\n            // ie6 check\n            if (\"withCredentials\" in xhr) {\n                xhr.withCredentials = this.opts.withCredentials;\n            }\n            if (this.opts.requestTimeout) {\n                xhr.timeout = this.opts.requestTimeout;\n            }\n            xhr.onreadystatechange = () => {\n                if (4 !== xhr.readyState)\n                    return;\n                if (200 === xhr.status || 1223 === xhr.status) {\n                    this.onLoad();\n                }\n                else {\n                    // make sure the `error` event handler that's user-set\n                    // does not throw in the same tick and gets caught here\n                    this.setTimeoutFn(() => {\n                        this.onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n                    }, 0);\n                }\n            };\n            xhr.send(this.data);\n        }\n        catch (e) {\n            // Need to defer since .create() is called directly from the constructor\n            // and thus the 'error' event can only be only bound *after* this exception\n            // occurs.  Therefore, also, we cannot throw here at all.\n            this.setTimeoutFn(() => {\n                this.onError(e);\n            }, 0);\n            return;\n        }\n        if (typeof document !== \"undefined\") {\n            this.index = Request.requestsCount++;\n            Request.requests[this.index] = this;\n        }\n    }\n    /**\n     * Called upon error.\n     *\n     * @api private\n     */\n    onError(err) {\n        this.emitReserved(\"error\", err, this.xhr);\n        this.cleanup(true);\n    }\n    /**\n     * Cleans up house.\n     *\n     * @api private\n     */\n    cleanup(fromError) {\n        if (\"undefined\" === typeof this.xhr || null === this.xhr) {\n            return;\n        }\n        this.xhr.onreadystatechange = empty;\n        if (fromError) {\n            try {\n                this.xhr.abort();\n            }\n            catch (e) { }\n        }\n        if (typeof document !== \"undefined\") {\n            delete Request.requests[this.index];\n        }\n        this.xhr = null;\n    }\n    /**\n     * Called upon load.\n     *\n     * @api private\n     */\n    onLoad() {\n        const data = this.xhr.responseText;\n        if (data !== null) {\n            this.emitReserved(\"data\", data);\n            this.emitReserved(\"success\");\n            this.cleanup();\n        }\n    }\n    /**\n     * Aborts the request.\n     *\n     * @api public\n     */\n    abort() {\n        this.cleanup();\n    }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n    // @ts-ignore\n    if (typeof attachEvent === \"function\") {\n        // @ts-ignore\n        attachEvent(\"onunload\", unloadHandler);\n    }\n    else if (typeof addEventListener === \"function\") {\n        const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n        addEventListener(terminationEvent, unloadHandler, false);\n    }\n}\nfunction unloadHandler() {\n    for (let i in Request.requests) {\n        if (Request.requests.hasOwnProperty(i)) {\n            Request.requests[i].abort();\n        }\n    }\n}\n","import { globalThisShim as globalThis } from \"../globalThis.js\";\nexport const nextTick = (() => {\n    const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n    if (isPromiseAvailable) {\n        return cb => Promise.resolve().then(cb);\n    }\n    else {\n        return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n    }\n})();\nexport const WebSocket = globalThis.WebSocket || globalThis.MozWebSocket;\nexport const usingBrowserWebSocket = true;\nexport const defaultBinaryType = \"arraybuffer\";\n","import { Transport } from \"../transport.js\";\nimport { encode } from \"../contrib/parseqs.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { defaultBinaryType, nextTick, usingBrowserWebSocket, WebSocket } from \"./websocket-constructor.js\";\nimport { encodePacket } from \"engine.io-parser\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n    typeof navigator.product === \"string\" &&\n    navigator.product.toLowerCase() === \"reactnative\";\nexport class WS extends Transport {\n    /**\n     * WebSocket transport constructor.\n     *\n     * @api {Object} connection options\n     * @api public\n     */\n    constructor(opts) {\n        super(opts);\n        this.supportsBinary = !opts.forceBase64;\n    }\n    /**\n     * Transport name.\n     *\n     * @api public\n     */\n    get name() {\n        return \"websocket\";\n    }\n    /**\n     * Opens socket.\n     *\n     * @api private\n     */\n    doOpen() {\n        if (!this.check()) {\n            // let probe timeout\n            return;\n        }\n        const uri = this.uri();\n        const protocols = this.opts.protocols;\n        // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n        const opts = isReactNative\n            ? {}\n            : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n        if (this.opts.extraHeaders) {\n            opts.headers = this.opts.extraHeaders;\n        }\n        try {\n            this.ws =\n                usingBrowserWebSocket && !isReactNative\n                    ? protocols\n                        ? new WebSocket(uri, protocols)\n                        : new WebSocket(uri)\n                    : new WebSocket(uri, protocols, opts);\n        }\n        catch (err) {\n            return this.emitReserved(\"error\", err);\n        }\n        this.ws.binaryType = this.socket.binaryType || defaultBinaryType;\n        this.addEventListeners();\n    }\n    /**\n     * Adds event listeners to the socket\n     *\n     * @api private\n     */\n    addEventListeners() {\n        this.ws.onopen = () => {\n            if (this.opts.autoUnref) {\n                this.ws._socket.unref();\n            }\n            this.onOpen();\n        };\n        this.ws.onclose = closeEvent => this.onClose({\n            description: \"websocket connection closed\",\n            context: closeEvent\n        });\n        this.ws.onmessage = ev => this.onData(ev.data);\n        this.ws.onerror = e => this.onError(\"websocket error\", e);\n    }\n    /**\n     * Writes data to socket.\n     *\n     * @param {Array} array of packets.\n     * @api private\n     */\n    write(packets) {\n        this.writable = false;\n        // encodePacket efficient as it uses WS framing\n        // no need for encodePayload\n        for (let i = 0; i < packets.length; i++) {\n            const packet = packets[i];\n            const lastPacket = i === packets.length - 1;\n            encodePacket(packet, this.supportsBinary, data => {\n                // always create a new object (GH-437)\n                const opts = {};\n                if (!usingBrowserWebSocket) {\n                    if (packet.options) {\n                        opts.compress = packet.options.compress;\n                    }\n                    if (this.opts.perMessageDeflate) {\n                        const len = \n                        // @ts-ignore\n                        \"string\" === typeof data ? Buffer.byteLength(data) : data.length;\n                        if (len < this.opts.perMessageDeflate.threshold) {\n                            opts.compress = false;\n                        }\n                    }\n                }\n                // Sometimes the websocket has already been closed but the browser didn't\n                // have a chance of informing us about it yet, in that case send will\n                // throw an error\n                try {\n                    if (usingBrowserWebSocket) {\n                        // TypeError is thrown when passing the second argument on Safari\n                        this.ws.send(data);\n                    }\n                    else {\n                        this.ws.send(data, opts);\n                    }\n                }\n                catch (e) {\n                }\n                if (lastPacket) {\n                    // fake drain\n                    // defer to next tick to allow Socket to clear writeBuffer\n                    nextTick(() => {\n                        this.writable = true;\n                        this.emitReserved(\"drain\");\n                    }, this.setTimeoutFn);\n                }\n            });\n        }\n    }\n    /**\n     * Closes socket.\n     *\n     * @api private\n     */\n    doClose() {\n        if (typeof this.ws !== \"undefined\") {\n            this.ws.close();\n            this.ws = null;\n        }\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @api private\n     */\n    uri() {\n        let query = this.query || {};\n        const schema = this.opts.secure ? \"wss\" : \"ws\";\n        let port = \"\";\n        // avoid port if default for schema\n        if (this.opts.port &&\n            ((\"wss\" === schema && Number(this.opts.port) !== 443) ||\n                (\"ws\" === schema && Number(this.opts.port) !== 80))) {\n            port = \":\" + this.opts.port;\n        }\n        // append timestamp to URI\n        if (this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = yeast();\n        }\n        // communicate binary support capabilities\n        if (!this.supportsBinary) {\n            query.b64 = 1;\n        }\n        const encodedQuery = encode(query);\n        const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n        return (schema +\n            \"://\" +\n            (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n            port +\n            this.opts.path +\n            (encodedQuery.length ? \"?\" + encodedQuery : \"\"));\n    }\n    /**\n     * Feature detection for WebSocket.\n     *\n     * @return {Boolean} whether this transport is available.\n     * @api public\n     */\n    check() {\n        return !!WebSocket;\n    }\n}\n","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nexport const transports = {\n    websocket: WS,\n    polling: Polling\n};\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n    const src = str, b = str.indexOf('['), e = str.indexOf(']');\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n    let m = re.exec(str || ''), uri = {}, i = 14;\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n    uri.pathNames = pathNames(uri, uri['path']);\n    uri.queryKey = queryKey(uri, uri['query']);\n    return uri;\n}\nfunction pathNames(obj, path) {\n    const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n    if (path.slice(0, 1) == '/' || path.length === 0) {\n        names.splice(0, 1);\n    }\n    if (path.slice(-1) == '/') {\n        names.splice(names.length - 1, 1);\n    }\n    return names;\n}\nfunction queryKey(uri, query) {\n    const data = {};\n    query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n        if ($1) {\n            data[$1] = $2;\n        }\n    });\n    return data;\n}\n","import { transports } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nexport class Socket extends Emitter {\n    /**\n     * Socket constructor.\n     *\n     * @param {String|Object} uri or options\n     * @param {Object} opts - options\n     * @api public\n     */\n    constructor(uri, opts = {}) {\n        super();\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = null;\n        }\n        if (uri) {\n            uri = parse(uri);\n            opts.hostname = uri.host;\n            opts.secure = uri.protocol === \"https\" || uri.protocol === \"wss\";\n            opts.port = uri.port;\n            if (uri.query)\n                opts.query = uri.query;\n        }\n        else if (opts.host) {\n            opts.hostname = parse(opts.host).host;\n        }\n        installTimerFunctions(this, opts);\n        this.secure =\n            null != opts.secure\n                ? opts.secure\n                : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n        if (opts.hostname && !opts.port) {\n            // if no port is specified manually, use the protocol default\n            opts.port = this.secure ? \"443\" : \"80\";\n        }\n        this.hostname =\n            opts.hostname ||\n                (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n        this.port =\n            opts.port ||\n                (typeof location !== \"undefined\" && location.port\n                    ? location.port\n                    : this.secure\n                        ? \"443\"\n                        : \"80\");\n        this.transports = opts.transports || [\"polling\", \"websocket\"];\n        this.readyState = \"\";\n        this.writeBuffer = [];\n        this.prevBufferLen = 0;\n        this.opts = Object.assign({\n            path: \"/engine.io\",\n            agent: false,\n            withCredentials: false,\n            upgrade: true,\n            timestampParam: \"t\",\n            rememberUpgrade: false,\n            rejectUnauthorized: true,\n            perMessageDeflate: {\n                threshold: 1024\n            },\n            transportOptions: {},\n            closeOnBeforeunload: true\n        }, opts);\n        this.opts.path = this.opts.path.replace(/\\/$/, \"\") + \"/\";\n        if (typeof this.opts.query === \"string\") {\n            this.opts.query = decode(this.opts.query);\n        }\n        // set on handshake\n        this.id = null;\n        this.upgrades = null;\n        this.pingInterval = null;\n        this.pingTimeout = null;\n        // set on heartbeat\n        this.pingTimeoutTimer = null;\n        if (typeof addEventListener === \"function\") {\n            if (this.opts.closeOnBeforeunload) {\n                // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n                // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n                // closed/reloaded)\n                this.beforeunloadEventListener = () => {\n                    if (this.transport) {\n                        // silently close the transport\n                        this.transport.removeAllListeners();\n                        this.transport.close();\n                    }\n                };\n                addEventListener(\"beforeunload\", this.beforeunloadEventListener, false);\n            }\n            if (this.hostname !== \"localhost\") {\n                this.offlineEventListener = () => {\n                    this.onClose(\"transport close\", {\n                        description: \"network connection lost\"\n                    });\n                };\n                addEventListener(\"offline\", this.offlineEventListener, false);\n            }\n        }\n        this.open();\n    }\n    /**\n     * Creates transport of the given type.\n     *\n     * @param {String} transport name\n     * @return {Transport}\n     * @api private\n     */\n    createTransport(name) {\n        const query = Object.assign({}, this.opts.query);\n        // append engine.io protocol identifier\n        query.EIO = protocol;\n        // transport name\n        query.transport = name;\n        // session id if we already have one\n        if (this.id)\n            query.sid = this.id;\n        const opts = Object.assign({}, this.opts.transportOptions[name], this.opts, {\n            query,\n            socket: this,\n            hostname: this.hostname,\n            secure: this.secure,\n            port: this.port\n        });\n        return new transports[name](opts);\n    }\n    /**\n     * Initializes transport to use and starts probe.\n     *\n     * @api private\n     */\n    open() {\n        let transport;\n        if (this.opts.rememberUpgrade &&\n            Socket.priorWebsocketSuccess &&\n            this.transports.indexOf(\"websocket\") !== -1) {\n            transport = \"websocket\";\n        }\n        else if (0 === this.transports.length) {\n            // Emit error on next tick so it can be listened to\n            this.setTimeoutFn(() => {\n                this.emitReserved(\"error\", \"No transports available\");\n            }, 0);\n            return;\n        }\n        else {\n            transport = this.transports[0];\n        }\n        this.readyState = \"opening\";\n        // Retry with the next transport if the transport is disabled (jsonp: false)\n        try {\n            transport = this.createTransport(transport);\n        }\n        catch (e) {\n            this.transports.shift();\n            this.open();\n            return;\n        }\n        transport.open();\n        this.setTransport(transport);\n    }\n    /**\n     * Sets the current transport. Disables the existing one (if any).\n     *\n     * @api private\n     */\n    setTransport(transport) {\n        if (this.transport) {\n            this.transport.removeAllListeners();\n        }\n        // set up transport\n        this.transport = transport;\n        // set up transport listeners\n        transport\n            .on(\"drain\", this.onDrain.bind(this))\n            .on(\"packet\", this.onPacket.bind(this))\n            .on(\"error\", this.onError.bind(this))\n            .on(\"close\", reason => this.onClose(\"transport close\", reason));\n    }\n    /**\n     * Probes a transport.\n     *\n     * @param {String} transport name\n     * @api private\n     */\n    probe(name) {\n        let transport = this.createTransport(name);\n        let failed = false;\n        Socket.priorWebsocketSuccess = false;\n        const onTransportOpen = () => {\n            if (failed)\n                return;\n            transport.send([{ type: \"ping\", data: \"probe\" }]);\n            transport.once(\"packet\", msg => {\n                if (failed)\n                    return;\n                if (\"pong\" === msg.type && \"probe\" === msg.data) {\n                    this.upgrading = true;\n                    this.emitReserved(\"upgrading\", transport);\n                    if (!transport)\n                        return;\n                    Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n                    this.transport.pause(() => {\n                        if (failed)\n                            return;\n                        if (\"closed\" === this.readyState)\n                            return;\n                        cleanup();\n                        this.setTransport(transport);\n                        transport.send([{ type: \"upgrade\" }]);\n                        this.emitReserved(\"upgrade\", transport);\n                        transport = null;\n                        this.upgrading = false;\n                        this.flush();\n                    });\n                }\n                else {\n                    const err = new Error(\"probe error\");\n                    // @ts-ignore\n                    err.transport = transport.name;\n                    this.emitReserved(\"upgradeError\", err);\n                }\n            });\n        };\n        function freezeTransport() {\n            if (failed)\n                return;\n            // Any callback called by transport should be ignored since now\n            failed = true;\n            cleanup();\n            transport.close();\n            transport = null;\n        }\n        // Handle any error that happens while probing\n        const onerror = err => {\n            const error = new Error(\"probe error: \" + err);\n            // @ts-ignore\n            error.transport = transport.name;\n            freezeTransport();\n            this.emitReserved(\"upgradeError\", error);\n        };\n        function onTransportClose() {\n            onerror(\"transport closed\");\n        }\n        // When the socket is closed while we're probing\n        function onclose() {\n            onerror(\"socket closed\");\n        }\n        // When the socket is upgraded while we're probing\n        function onupgrade(to) {\n            if (transport && to.name !== transport.name) {\n                freezeTransport();\n            }\n        }\n        // Remove all listeners on the transport and on self\n        const cleanup = () => {\n            transport.removeListener(\"open\", onTransportOpen);\n            transport.removeListener(\"error\", onerror);\n            transport.removeListener(\"close\", onTransportClose);\n            this.off(\"close\", onclose);\n            this.off(\"upgrading\", onupgrade);\n        };\n        transport.once(\"open\", onTransportOpen);\n        transport.once(\"error\", onerror);\n        transport.once(\"close\", onTransportClose);\n        this.once(\"close\", onclose);\n        this.once(\"upgrading\", onupgrade);\n        transport.open();\n    }\n    /**\n     * Called when connection is deemed open.\n     *\n     * @api private\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n        this.emitReserved(\"open\");\n        this.flush();\n        // we check for `readyState` in case an `open`\n        // listener already closed the socket\n        if (\"open\" === this.readyState &&\n            this.opts.upgrade &&\n            this.transport.pause) {\n            let i = 0;\n            const l = this.upgrades.length;\n            for (; i < l; i++) {\n                this.probe(this.upgrades[i]);\n            }\n        }\n    }\n    /**\n     * Handles a packet.\n     *\n     * @api private\n     */\n    onPacket(packet) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            this.emitReserved(\"packet\", packet);\n            // Socket is live - any packet counts\n            this.emitReserved(\"heartbeat\");\n            switch (packet.type) {\n                case \"open\":\n                    this.onHandshake(JSON.parse(packet.data));\n                    break;\n                case \"ping\":\n                    this.resetPingTimeout();\n                    this.sendPacket(\"pong\");\n                    this.emitReserved(\"ping\");\n                    this.emitReserved(\"pong\");\n                    break;\n                case \"error\":\n                    const err = new Error(\"server error\");\n                    // @ts-ignore\n                    err.code = packet.data;\n                    this.onError(err);\n                    break;\n                case \"message\":\n                    this.emitReserved(\"data\", packet.data);\n                    this.emitReserved(\"message\", packet.data);\n                    break;\n            }\n        }\n        else {\n        }\n    }\n    /**\n     * Called upon handshake completion.\n     *\n     * @param {Object} data - handshake obj\n     * @api private\n     */\n    onHandshake(data) {\n        this.emitReserved(\"handshake\", data);\n        this.id = data.sid;\n        this.transport.query.sid = data.sid;\n        this.upgrades = this.filterUpgrades(data.upgrades);\n        this.pingInterval = data.pingInterval;\n        this.pingTimeout = data.pingTimeout;\n        this.maxPayload = data.maxPayload;\n        this.onOpen();\n        // In case open handler closes socket\n        if (\"closed\" === this.readyState)\n            return;\n        this.resetPingTimeout();\n    }\n    /**\n     * Sets and resets ping timeout timer based on server pings.\n     *\n     * @api private\n     */\n    resetPingTimeout() {\n        this.clearTimeoutFn(this.pingTimeoutTimer);\n        this.pingTimeoutTimer = this.setTimeoutFn(() => {\n            this.onClose(\"ping timeout\");\n        }, this.pingInterval + this.pingTimeout);\n        if (this.opts.autoUnref) {\n            this.pingTimeoutTimer.unref();\n        }\n    }\n    /**\n     * Called on `drain` event\n     *\n     * @api private\n     */\n    onDrain() {\n        this.writeBuffer.splice(0, this.prevBufferLen);\n        // setting prevBufferLen = 0 is very important\n        // for example, when upgrading, upgrade packet is sent over,\n        // and a nonzero prevBufferLen could cause problems on `drain`\n        this.prevBufferLen = 0;\n        if (0 === this.writeBuffer.length) {\n            this.emitReserved(\"drain\");\n        }\n        else {\n            this.flush();\n        }\n    }\n    /**\n     * Flush write buffers.\n     *\n     * @api private\n     */\n    flush() {\n        if (\"closed\" !== this.readyState &&\n            this.transport.writable &&\n            !this.upgrading &&\n            this.writeBuffer.length) {\n            const packets = this.getWritablePackets();\n            this.transport.send(packets);\n            // keep track of current length of writeBuffer\n            // splice writeBuffer and callbackBuffer on `drain`\n            this.prevBufferLen = packets.length;\n            this.emitReserved(\"flush\");\n        }\n    }\n    /**\n     * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n     * long-polling)\n     *\n     * @private\n     */\n    getWritablePackets() {\n        const shouldCheckPayloadSize = this.maxPayload &&\n            this.transport.name === \"polling\" &&\n            this.writeBuffer.length > 1;\n        if (!shouldCheckPayloadSize) {\n            return this.writeBuffer;\n        }\n        let payloadSize = 1; // first packet type\n        for (let i = 0; i < this.writeBuffer.length; i++) {\n            const data = this.writeBuffer[i].data;\n            if (data) {\n                payloadSize += byteLength(data);\n            }\n            if (i > 0 && payloadSize > this.maxPayload) {\n                return this.writeBuffer.slice(0, i);\n            }\n            payloadSize += 2; // separator + packet type\n        }\n        return this.writeBuffer;\n    }\n    /**\n     * Sends a message.\n     *\n     * @param {String} message.\n     * @param {Function} callback function.\n     * @param {Object} options.\n     * @return {Socket} for chaining.\n     * @api public\n     */\n    write(msg, options, fn) {\n        this.sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    send(msg, options, fn) {\n        this.sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param {String} packet type.\n     * @param {String} data.\n     * @param {Object} options.\n     * @param {Function} callback function.\n     * @api private\n     */\n    sendPacket(type, data, options, fn) {\n        if (\"function\" === typeof data) {\n            fn = data;\n            data = undefined;\n        }\n        if (\"function\" === typeof options) {\n            fn = options;\n            options = null;\n        }\n        if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n            return;\n        }\n        options = options || {};\n        options.compress = false !== options.compress;\n        const packet = {\n            type: type,\n            data: data,\n            options: options\n        };\n        this.emitReserved(\"packetCreate\", packet);\n        this.writeBuffer.push(packet);\n        if (fn)\n            this.once(\"flush\", fn);\n        this.flush();\n    }\n    /**\n     * Closes the connection.\n     *\n     * @api public\n     */\n    close() {\n        const close = () => {\n            this.onClose(\"forced close\");\n            this.transport.close();\n        };\n        const cleanupAndClose = () => {\n            this.off(\"upgrade\", cleanupAndClose);\n            this.off(\"upgradeError\", cleanupAndClose);\n            close();\n        };\n        const waitForUpgrade = () => {\n            // wait for upgrade to finish since we can't send packets while pausing a transport\n            this.once(\"upgrade\", cleanupAndClose);\n            this.once(\"upgradeError\", cleanupAndClose);\n        };\n        if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n            this.readyState = \"closing\";\n            if (this.writeBuffer.length) {\n                this.once(\"drain\", () => {\n                    if (this.upgrading) {\n                        waitForUpgrade();\n                    }\n                    else {\n                        close();\n                    }\n                });\n            }\n            else if (this.upgrading) {\n                waitForUpgrade();\n            }\n            else {\n                close();\n            }\n        }\n        return this;\n    }\n    /**\n     * Called upon transport error\n     *\n     * @api private\n     */\n    onError(err) {\n        Socket.priorWebsocketSuccess = false;\n        this.emitReserved(\"error\", err);\n        this.onClose(\"transport error\", err);\n    }\n    /**\n     * Called upon transport close.\n     *\n     * @api private\n     */\n    onClose(reason, description) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            // clear timers\n            this.clearTimeoutFn(this.pingTimeoutTimer);\n            // stop event from firing again for transport\n            this.transport.removeAllListeners(\"close\");\n            // ensure transport won't stay open\n            this.transport.close();\n            // ignore further transport communication\n            this.transport.removeAllListeners();\n            if (typeof removeEventListener === \"function\") {\n                removeEventListener(\"beforeunload\", this.beforeunloadEventListener, false);\n                removeEventListener(\"offline\", this.offlineEventListener, false);\n            }\n            // set ready state\n            this.readyState = \"closed\";\n            // clear session id\n            this.id = null;\n            // emit close event\n            this.emitReserved(\"close\", reason, description);\n            // clean buffers after, so users can still\n            // grab the buffers on `close` event\n            this.writeBuffer = [];\n            this.prevBufferLen = 0;\n        }\n    }\n    /**\n     * Filters upgrades, returning only those matching client transports.\n     *\n     * @param {Array} server upgrades\n     * @api private\n     *\n     */\n    filterUpgrades(upgrades) {\n        const filteredUpgrades = [];\n        let i = 0;\n        const j = upgrades.length;\n        for (; i < j; i++) {\n            if (~this.transports.indexOf(upgrades[i]))\n                filteredUpgrades.push(upgrades[i]);\n        }\n        return filteredUpgrades;\n    }\n}\nSocket.protocol = protocol;\n","import { Socket } from \"./socket.js\";\nexport { Socket };\nexport const protocol = Socket.protocol;\nexport { Transport } from \"./transport.js\";\nexport { transports } from \"./transports/index.js\";\nexport { installTimerFunctions } from \"./util.js\";\nexport { parse } from \"./contrib/parseuri.js\";\nexport { nextTick } from \"./transports/websocket-constructor.js\";\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n *        Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n    let obj = uri;\n    // default to window.location\n    loc = loc || (typeof location !== \"undefined\" && location);\n    if (null == uri)\n        uri = loc.protocol + \"//\" + loc.host;\n    // relative path support\n    if (typeof uri === \"string\") {\n        if (\"/\" === uri.charAt(0)) {\n            if (\"/\" === uri.charAt(1)) {\n                uri = loc.protocol + uri;\n            }\n            else {\n                uri = loc.host + uri;\n            }\n        }\n        if (!/^(https?|wss?):\\/\\//.test(uri)) {\n            if (\"undefined\" !== typeof loc) {\n                uri = loc.protocol + \"//\" + uri;\n            }\n            else {\n                uri = \"https://\" + uri;\n            }\n        }\n        // parse\n        obj = parse(uri);\n    }\n    // make sure we treat `localhost:80` and `localhost` equally\n    if (!obj.port) {\n        if (/^(http|ws)$/.test(obj.protocol)) {\n            obj.port = \"80\";\n        }\n        else if (/^(http|ws)s$/.test(obj.protocol)) {\n            obj.port = \"443\";\n        }\n    }\n    obj.path = obj.path || \"/\";\n    const ipv6 = obj.host.indexOf(\":\") !== -1;\n    const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n    // define unique id\n    obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n    // define href\n    obj.href =\n        obj.protocol +\n            \"://\" +\n            host +\n            (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n    return obj;\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n    (typeof File !== \"undefined\" &&\n        toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n    return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n        (withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n    if (!obj || typeof obj !== \"object\") {\n        return false;\n    }\n    if (Array.isArray(obj)) {\n        for (let i = 0, l = obj.length; i < l; i++) {\n            if (hasBinary(obj[i])) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (isBinary(obj)) {\n        return true;\n    }\n    if (obj.toJSON &&\n        typeof obj.toJSON === \"function\" &&\n        arguments.length === 1) {\n        return hasBinary(obj.toJSON(), true);\n    }\n    for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n            return true;\n        }\n    }\n    return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n    const buffers = [];\n    const packetData = packet.data;\n    const pack = packet;\n    pack.data = _deconstructPacket(packetData, buffers);\n    pack.attachments = buffers.length; // number of binary 'attachments'\n    return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (isBinary(data)) {\n        const placeholder = { _placeholder: true, num: buffers.length };\n        buffers.push(data);\n        return placeholder;\n    }\n    else if (Array.isArray(data)) {\n        const newData = new Array(data.length);\n        for (let i = 0; i < data.length; i++) {\n            newData[i] = _deconstructPacket(data[i], buffers);\n        }\n        return newData;\n    }\n    else if (typeof data === \"object\" && !(data instanceof Date)) {\n        const newData = {};\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                newData[key] = _deconstructPacket(data[key], buffers);\n            }\n        }\n        return newData;\n    }\n    return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n    packet.data = _reconstructPacket(packet.data, buffers);\n    packet.attachments = undefined; // no longer useful\n    return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (data && data._placeholder === true) {\n        const isIndexValid = typeof data.num === \"number\" &&\n            data.num >= 0 &&\n            data.num < buffers.length;\n        if (isIndexValid) {\n            return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n        }\n        else {\n            throw new Error(\"illegal attachments\");\n        }\n    }\n    else if (Array.isArray(data)) {\n        for (let i = 0; i < data.length; i++) {\n            data[i] = _reconstructPacket(data[i], buffers);\n        }\n    }\n    else if (typeof data === \"object\") {\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                data[key] = _reconstructPacket(data[key], buffers);\n            }\n        }\n    }\n    return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n    PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n    PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n    PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n    PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n    PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n    PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n    PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n    /**\n     * Encoder constructor\n     *\n     * @param {function} replacer - custom replacer to pass down to JSON.parse\n     */\n    constructor(replacer) {\n        this.replacer = replacer;\n    }\n    /**\n     * Encode a packet as a single string if non-binary, or as a\n     * buffer sequence, depending on packet type.\n     *\n     * @param {Object} obj - packet object\n     */\n    encode(obj) {\n        if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n            if (hasBinary(obj)) {\n                obj.type =\n                    obj.type === PacketType.EVENT\n                        ? PacketType.BINARY_EVENT\n                        : PacketType.BINARY_ACK;\n                return this.encodeAsBinary(obj);\n            }\n        }\n        return [this.encodeAsString(obj)];\n    }\n    /**\n     * Encode packet as string.\n     */\n    encodeAsString(obj) {\n        // first is type\n        let str = \"\" + obj.type;\n        // attachments if we have them\n        if (obj.type === PacketType.BINARY_EVENT ||\n            obj.type === PacketType.BINARY_ACK) {\n            str += obj.attachments + \"-\";\n        }\n        // if we have a namespace other than `/`\n        // we append it followed by a comma `,`\n        if (obj.nsp && \"/\" !== obj.nsp) {\n            str += obj.nsp + \",\";\n        }\n        // immediately followed by the id\n        if (null != obj.id) {\n            str += obj.id;\n        }\n        // json data\n        if (null != obj.data) {\n            str += JSON.stringify(obj.data, this.replacer);\n        }\n        return str;\n    }\n    /**\n     * Encode packet as 'buffer sequence' by removing blobs, and\n     * deconstructing packet into object with placeholders and\n     * a list of buffers.\n     */\n    encodeAsBinary(obj) {\n        const deconstruction = deconstructPacket(obj);\n        const pack = this.encodeAsString(deconstruction.packet);\n        const buffers = deconstruction.buffers;\n        buffers.unshift(pack); // add packet info to beginning of data list\n        return buffers; // write all the buffers\n    }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n    /**\n     * Decoder constructor\n     *\n     * @param {function} reviver - custom reviver to pass down to JSON.stringify\n     */\n    constructor(reviver) {\n        super();\n        this.reviver = reviver;\n    }\n    /**\n     * Decodes an encoded packet string into packet JSON.\n     *\n     * @param {String} obj - encoded packet\n     */\n    add(obj) {\n        let packet;\n        if (typeof obj === \"string\") {\n            if (this.reconstructor) {\n                throw new Error(\"got plaintext data when reconstructing a packet\");\n            }\n            packet = this.decodeString(obj);\n            if (packet.type === PacketType.BINARY_EVENT ||\n                packet.type === PacketType.BINARY_ACK) {\n                // binary packet's json\n                this.reconstructor = new BinaryReconstructor(packet);\n                // no attachments, labeled binary but no binary data to follow\n                if (packet.attachments === 0) {\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n            else {\n                // non-binary full packet\n                super.emitReserved(\"decoded\", packet);\n            }\n        }\n        else if (isBinary(obj) || obj.base64) {\n            // raw binary data\n            if (!this.reconstructor) {\n                throw new Error(\"got binary data when not reconstructing a packet\");\n            }\n            else {\n                packet = this.reconstructor.takeBinaryData(obj);\n                if (packet) {\n                    // received final buffer\n                    this.reconstructor = null;\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n        }\n        else {\n            throw new Error(\"Unknown type: \" + obj);\n        }\n    }\n    /**\n     * Decode a packet String (JSON data)\n     *\n     * @param {String} str\n     * @return {Object} packet\n     */\n    decodeString(str) {\n        let i = 0;\n        // look up type\n        const p = {\n            type: Number(str.charAt(0)),\n        };\n        if (PacketType[p.type] === undefined) {\n            throw new Error(\"unknown packet type \" + p.type);\n        }\n        // look up attachments if type binary\n        if (p.type === PacketType.BINARY_EVENT ||\n            p.type === PacketType.BINARY_ACK) {\n            const start = i + 1;\n            while (str.charAt(++i) !== \"-\" && i != str.length) { }\n            const buf = str.substring(start, i);\n            if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n                throw new Error(\"Illegal attachments\");\n            }\n            p.attachments = Number(buf);\n        }\n        // look up namespace (if any)\n        if (\"/\" === str.charAt(i + 1)) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (\",\" === c)\n                    break;\n                if (i === str.length)\n                    break;\n            }\n            p.nsp = str.substring(start, i);\n        }\n        else {\n            p.nsp = \"/\";\n        }\n        // look up id\n        const next = str.charAt(i + 1);\n        if (\"\" !== next && Number(next) == next) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (null == c || Number(c) != c) {\n                    --i;\n                    break;\n                }\n                if (i === str.length)\n                    break;\n            }\n            p.id = Number(str.substring(start, i + 1));\n        }\n        // look up json data\n        if (str.charAt(++i)) {\n            const payload = this.tryParse(str.substr(i));\n            if (Decoder.isPayloadValid(p.type, payload)) {\n                p.data = payload;\n            }\n            else {\n                throw new Error(\"invalid payload\");\n            }\n        }\n        return p;\n    }\n    tryParse(str) {\n        try {\n            return JSON.parse(str, this.reviver);\n        }\n        catch (e) {\n            return false;\n        }\n    }\n    static isPayloadValid(type, payload) {\n        switch (type) {\n            case PacketType.CONNECT:\n                return typeof payload === \"object\";\n            case PacketType.DISCONNECT:\n                return payload === undefined;\n            case PacketType.CONNECT_ERROR:\n                return typeof payload === \"string\" || typeof payload === \"object\";\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                return Array.isArray(payload) && payload.length > 0;\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                return Array.isArray(payload);\n        }\n    }\n    /**\n     * Deallocates a parser's resources\n     */\n    destroy() {\n        if (this.reconstructor) {\n            this.reconstructor.finishedReconstruction();\n        }\n    }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n    constructor(packet) {\n        this.packet = packet;\n        this.buffers = [];\n        this.reconPack = packet;\n    }\n    /**\n     * Method to be called when binary data received from connection\n     * after a BINARY_EVENT packet.\n     *\n     * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n     * @return {null | Object} returns null if more binary data is expected or\n     *   a reconstructed packet object if all buffers have been received.\n     */\n    takeBinaryData(binData) {\n        this.buffers.push(binData);\n        if (this.buffers.length === this.reconPack.attachments) {\n            // done with buffer list\n            const packet = reconstructPacket(this.reconPack, this.buffers);\n            this.finishedReconstruction();\n            return packet;\n        }\n        return null;\n    }\n    /**\n     * Cleans up binary packet reconstruction variables.\n     */\n    finishedReconstruction() {\n        this.reconPack = null;\n        this.buffers = [];\n    }\n}\n","export function on(obj, ev, fn) {\n    obj.on(ev, fn);\n    return function subDestroy() {\n        obj.off(ev, fn);\n    };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n    connect: 1,\n    connect_error: 1,\n    disconnect: 1,\n    disconnecting: 1,\n    // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n    newListener: 1,\n    removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n *   console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n *   // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n *   console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n    /**\n     * `Socket` constructor.\n     */\n    constructor(io, nsp, opts) {\n        super();\n        /**\n         * Whether the socket is currently connected to the server.\n         *\n         * @example\n         * const socket = io();\n         *\n         * socket.on(\"connect\", () => {\n         *   console.log(socket.connected); // true\n         * });\n         *\n         * socket.on(\"disconnect\", () => {\n         *   console.log(socket.connected); // false\n         * });\n         */\n        this.connected = false;\n        /**\n         * Buffer for packets received before the CONNECT packet\n         */\n        this.receiveBuffer = [];\n        /**\n         * Buffer for packets that will be sent once the socket is connected\n         */\n        this.sendBuffer = [];\n        this.ids = 0;\n        this.acks = {};\n        this.flags = {};\n        this.io = io;\n        this.nsp = nsp;\n        if (opts && opts.auth) {\n            this.auth = opts.auth;\n        }\n        if (this.io._autoConnect)\n            this.open();\n    }\n    /**\n     * Whether the socket is currently disconnected\n     *\n     * @example\n     * const socket = io();\n     *\n     * socket.on(\"connect\", () => {\n     *   console.log(socket.disconnected); // false\n     * });\n     *\n     * socket.on(\"disconnect\", () => {\n     *   console.log(socket.disconnected); // true\n     * });\n     */\n    get disconnected() {\n        return !this.connected;\n    }\n    /**\n     * Subscribe to open, close and packet events\n     *\n     * @private\n     */\n    subEvents() {\n        if (this.subs)\n            return;\n        const io = this.io;\n        this.subs = [\n            on(io, \"open\", this.onopen.bind(this)),\n            on(io, \"packet\", this.onpacket.bind(this)),\n            on(io, \"error\", this.onerror.bind(this)),\n            on(io, \"close\", this.onclose.bind(this)),\n        ];\n    }\n    /**\n     * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n     *\n     * @example\n     * const socket = io();\n     *\n     * console.log(socket.active); // true\n     *\n     * socket.on(\"disconnect\", (reason) => {\n     *   if (reason === \"io server disconnect\") {\n     *     // the disconnection was initiated by the server, you need to manually reconnect\n     *     console.log(socket.active); // false\n     *   }\n     *   // else the socket will automatically try to reconnect\n     *   console.log(socket.active); // true\n     * });\n     */\n    get active() {\n        return !!this.subs;\n    }\n    /**\n     * \"Opens\" the socket.\n     *\n     * @example\n     * const socket = io({\n     *   autoConnect: false\n     * });\n     *\n     * socket.connect();\n     */\n    connect() {\n        if (this.connected)\n            return this;\n        this.subEvents();\n        if (!this.io[\"_reconnecting\"])\n            this.io.open(); // ensure open\n        if (\"open\" === this.io._readyState)\n            this.onopen();\n        return this;\n    }\n    /**\n     * Alias for {@link connect()}.\n     */\n    open() {\n        return this.connect();\n    }\n    /**\n     * Sends a `message` event.\n     *\n     * This method mimics the WebSocket.send() method.\n     *\n     * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n     *\n     * @example\n     * socket.send(\"hello\");\n     *\n     * // this is equivalent to\n     * socket.emit(\"message\", \"hello\");\n     *\n     * @return self\n     */\n    send(...args) {\n        args.unshift(\"message\");\n        this.emit.apply(this, args);\n        return this;\n    }\n    /**\n     * Override `emit`.\n     * If the event is in `events`, it's emitted normally.\n     *\n     * @example\n     * socket.emit(\"hello\", \"world\");\n     *\n     * // all serializable datastructures are supported (no need to call JSON.stringify)\n     * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n     *\n     * // with an acknowledgement from the server\n     * socket.emit(\"hello\", \"world\", (val) => {\n     *   // ...\n     * });\n     *\n     * @return self\n     */\n    emit(ev, ...args) {\n        if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n            throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n        }\n        args.unshift(ev);\n        const packet = {\n            type: PacketType.EVENT,\n            data: args,\n        };\n        packet.options = {};\n        packet.options.compress = this.flags.compress !== false;\n        // event ack callback\n        if (\"function\" === typeof args[args.length - 1]) {\n            const id = this.ids++;\n            const ack = args.pop();\n            this._registerAckCallback(id, ack);\n            packet.id = id;\n        }\n        const isTransportWritable = this.io.engine &&\n            this.io.engine.transport &&\n            this.io.engine.transport.writable;\n        const discardPacket = this.flags.volatile && (!isTransportWritable || !this.connected);\n        if (discardPacket) {\n        }\n        else if (this.connected) {\n            this.notifyOutgoingListeners(packet);\n            this.packet(packet);\n        }\n        else {\n            this.sendBuffer.push(packet);\n        }\n        this.flags = {};\n        return this;\n    }\n    /**\n     * @private\n     */\n    _registerAckCallback(id, ack) {\n        const timeout = this.flags.timeout;\n        if (timeout === undefined) {\n            this.acks[id] = ack;\n            return;\n        }\n        // @ts-ignore\n        const timer = this.io.setTimeoutFn(() => {\n            delete this.acks[id];\n            for (let i = 0; i < this.sendBuffer.length; i++) {\n                if (this.sendBuffer[i].id === id) {\n                    this.sendBuffer.splice(i, 1);\n                }\n            }\n            ack.call(this, new Error(\"operation has timed out\"));\n        }, timeout);\n        this.acks[id] = (...args) => {\n            // @ts-ignore\n            this.io.clearTimeoutFn(timer);\n            ack.apply(this, [null, ...args]);\n        };\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param packet\n     * @private\n     */\n    packet(packet) {\n        packet.nsp = this.nsp;\n        this.io._packet(packet);\n    }\n    /**\n     * Called upon engine `open`.\n     *\n     * @private\n     */\n    onopen() {\n        if (typeof this.auth == \"function\") {\n            this.auth((data) => {\n                this.packet({ type: PacketType.CONNECT, data });\n            });\n        }\n        else {\n            this.packet({ type: PacketType.CONNECT, data: this.auth });\n        }\n    }\n    /**\n     * Called upon engine or manager `error`.\n     *\n     * @param err\n     * @private\n     */\n    onerror(err) {\n        if (!this.connected) {\n            this.emitReserved(\"connect_error\", err);\n        }\n    }\n    /**\n     * Called upon engine `close`.\n     *\n     * @param reason\n     * @param description\n     * @private\n     */\n    onclose(reason, description) {\n        this.connected = false;\n        delete this.id;\n        this.emitReserved(\"disconnect\", reason, description);\n    }\n    /**\n     * Called with socket packet.\n     *\n     * @param packet\n     * @private\n     */\n    onpacket(packet) {\n        const sameNamespace = packet.nsp === this.nsp;\n        if (!sameNamespace)\n            return;\n        switch (packet.type) {\n            case PacketType.CONNECT:\n                if (packet.data && packet.data.sid) {\n                    const id = packet.data.sid;\n                    this.onconnect(id);\n                }\n                else {\n                    this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n                }\n                break;\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                this.onevent(packet);\n                break;\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                this.onack(packet);\n                break;\n            case PacketType.DISCONNECT:\n                this.ondisconnect();\n                break;\n            case PacketType.CONNECT_ERROR:\n                this.destroy();\n                const err = new Error(packet.data.message);\n                // @ts-ignore\n                err.data = packet.data.data;\n                this.emitReserved(\"connect_error\", err);\n                break;\n        }\n    }\n    /**\n     * Called upon a server event.\n     *\n     * @param packet\n     * @private\n     */\n    onevent(packet) {\n        const args = packet.data || [];\n        if (null != packet.id) {\n            args.push(this.ack(packet.id));\n        }\n        if (this.connected) {\n            this.emitEvent(args);\n        }\n        else {\n            this.receiveBuffer.push(Object.freeze(args));\n        }\n    }\n    emitEvent(args) {\n        if (this._anyListeners && this._anyListeners.length) {\n            const listeners = this._anyListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, args);\n            }\n        }\n        super.emit.apply(this, args);\n    }\n    /**\n     * Produces an ack callback to emit with an event.\n     *\n     * @private\n     */\n    ack(id) {\n        const self = this;\n        let sent = false;\n        return function (...args) {\n            // prevent double callbacks\n            if (sent)\n                return;\n            sent = true;\n            self.packet({\n                type: PacketType.ACK,\n                id: id,\n                data: args,\n            });\n        };\n    }\n    /**\n     * Called upon a server acknowlegement.\n     *\n     * @param packet\n     * @private\n     */\n    onack(packet) {\n        const ack = this.acks[packet.id];\n        if (\"function\" === typeof ack) {\n            ack.apply(this, packet.data);\n            delete this.acks[packet.id];\n        }\n        else {\n        }\n    }\n    /**\n     * Called upon server connect.\n     *\n     * @private\n     */\n    onconnect(id) {\n        this.id = id;\n        this.connected = true;\n        this.emitBuffered();\n        this.emitReserved(\"connect\");\n    }\n    /**\n     * Emit buffered events (received and emitted).\n     *\n     * @private\n     */\n    emitBuffered() {\n        this.receiveBuffer.forEach((args) => this.emitEvent(args));\n        this.receiveBuffer = [];\n        this.sendBuffer.forEach((packet) => {\n            this.notifyOutgoingListeners(packet);\n            this.packet(packet);\n        });\n        this.sendBuffer = [];\n    }\n    /**\n     * Called upon server disconnect.\n     *\n     * @private\n     */\n    ondisconnect() {\n        this.destroy();\n        this.onclose(\"io server disconnect\");\n    }\n    /**\n     * Called upon forced client/server side disconnections,\n     * this method ensures the manager stops tracking us and\n     * that reconnections don't get triggered for this.\n     *\n     * @private\n     */\n    destroy() {\n        if (this.subs) {\n            // clean subscriptions to avoid reconnections\n            this.subs.forEach((subDestroy) => subDestroy());\n            this.subs = undefined;\n        }\n        this.io[\"_destroy\"](this);\n    }\n    /**\n     * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n     *\n     * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n     *\n     * @example\n     * const socket = io();\n     *\n     * socket.on(\"disconnect\", (reason) => {\n     *   // console.log(reason); prints \"io client disconnect\"\n     * });\n     *\n     * socket.disconnect();\n     *\n     * @return self\n     */\n    disconnect() {\n        if (this.connected) {\n            this.packet({ type: PacketType.DISCONNECT });\n        }\n        // remove socket from pool\n        this.destroy();\n        if (this.connected) {\n            // fire events\n            this.onclose(\"io client disconnect\");\n        }\n        return this;\n    }\n    /**\n     * Alias for {@link disconnect()}.\n     *\n     * @return self\n     */\n    close() {\n        return this.disconnect();\n    }\n    /**\n     * Sets the compress flag.\n     *\n     * @example\n     * socket.compress(false).emit(\"hello\");\n     *\n     * @param compress - if `true`, compresses the sending data\n     * @return self\n     */\n    compress(compress) {\n        this.flags.compress = compress;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n     * ready to send messages.\n     *\n     * @example\n     * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n     *\n     * @returns self\n     */\n    get volatile() {\n        this.flags.volatile = true;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n     * given number of milliseconds have elapsed without an acknowledgement from the server:\n     *\n     * @example\n     * socket.timeout(5000).emit(\"my-event\", (err) => {\n     *   if (err) {\n     *     // the server did not acknowledge the event in the given delay\n     *   }\n     * });\n     *\n     * @returns self\n     */\n    timeout(timeout) {\n        this.flags.timeout = timeout;\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * @example\n     * socket.onAny((event, ...args) => {\n     *   console.log(`got ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    onAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * @example\n     * socket.prependAny((event, ...args) => {\n     *   console.log(`got event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    prependAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @example\n     * const catchAllListener = (event, ...args) => {\n     *   console.log(`got event ${event}`);\n     * }\n     *\n     * socket.onAny(catchAllListener);\n     *\n     * // remove a specific listener\n     * socket.offAny(catchAllListener);\n     *\n     * // or remove all listeners\n     * socket.offAny();\n     *\n     * @param listener\n     */\n    offAny(listener) {\n        if (!this._anyListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     */\n    listenersAny() {\n        return this._anyListeners || [];\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * Note: acknowledgements sent to the server are not included.\n     *\n     * @example\n     * socket.onAnyOutgoing((event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    onAnyOutgoing(listener) {\n        this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n        this._anyOutgoingListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * Note: acknowledgements sent to the server are not included.\n     *\n     * @example\n     * socket.prependAnyOutgoing((event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    prependAnyOutgoing(listener) {\n        this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n        this._anyOutgoingListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @example\n     * const catchAllListener = (event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * }\n     *\n     * socket.onAnyOutgoing(catchAllListener);\n     *\n     * // remove a specific listener\n     * socket.offAnyOutgoing(catchAllListener);\n     *\n     * // or remove all listeners\n     * socket.offAnyOutgoing();\n     *\n     * @param [listener] - the catch-all listener (optional)\n     */\n    offAnyOutgoing(listener) {\n        if (!this._anyOutgoingListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyOutgoingListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyOutgoingListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     */\n    listenersAnyOutgoing() {\n        return this._anyOutgoingListeners || [];\n    }\n    /**\n     * Notify the listeners for each packet sent\n     *\n     * @param packet\n     *\n     * @private\n     */\n    notifyOutgoingListeners(packet) {\n        if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n            const listeners = this._anyOutgoingListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, packet.data);\n            }\n        }\n    }\n}\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n    opts = opts || {};\n    this.ms = opts.min || 100;\n    this.max = opts.max || 10000;\n    this.factor = opts.factor || 2;\n    this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n    this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n    var ms = this.ms * Math.pow(this.factor, this.attempts++);\n    if (this.jitter) {\n        var rand = Math.random();\n        var deviation = Math.floor(rand * this.jitter * ms);\n        ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n    }\n    return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n    this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n    this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n    this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n    this.jitter = jitter;\n};\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n    constructor(uri, opts) {\n        var _a;\n        super();\n        this.nsps = {};\n        this.subs = [];\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = undefined;\n        }\n        opts = opts || {};\n        opts.path = opts.path || \"/socket.io\";\n        this.opts = opts;\n        installTimerFunctions(this, opts);\n        this.reconnection(opts.reconnection !== false);\n        this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n        this.reconnectionDelay(opts.reconnectionDelay || 1000);\n        this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n        this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n        this.backoff = new Backoff({\n            min: this.reconnectionDelay(),\n            max: this.reconnectionDelayMax(),\n            jitter: this.randomizationFactor(),\n        });\n        this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n        this._readyState = \"closed\";\n        this.uri = uri;\n        const _parser = opts.parser || parser;\n        this.encoder = new _parser.Encoder();\n        this.decoder = new _parser.Decoder();\n        this._autoConnect = opts.autoConnect !== false;\n        if (this._autoConnect)\n            this.open();\n    }\n    reconnection(v) {\n        if (!arguments.length)\n            return this._reconnection;\n        this._reconnection = !!v;\n        return this;\n    }\n    reconnectionAttempts(v) {\n        if (v === undefined)\n            return this._reconnectionAttempts;\n        this._reconnectionAttempts = v;\n        return this;\n    }\n    reconnectionDelay(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelay;\n        this._reconnectionDelay = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n        return this;\n    }\n    randomizationFactor(v) {\n        var _a;\n        if (v === undefined)\n            return this._randomizationFactor;\n        this._randomizationFactor = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n        return this;\n    }\n    reconnectionDelayMax(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelayMax;\n        this._reconnectionDelayMax = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n        return this;\n    }\n    timeout(v) {\n        if (!arguments.length)\n            return this._timeout;\n        this._timeout = v;\n        return this;\n    }\n    /**\n     * Starts trying to reconnect if reconnection is enabled and we have not\n     * started reconnecting yet\n     *\n     * @private\n     */\n    maybeReconnectOnOpen() {\n        // Only try to reconnect if it's the first time we're connecting\n        if (!this._reconnecting &&\n            this._reconnection &&\n            this.backoff.attempts === 0) {\n            // keeps reconnection from firing twice for the same reconnection loop\n            this.reconnect();\n        }\n    }\n    /**\n     * Sets the current transport `socket`.\n     *\n     * @param {Function} fn - optional, callback\n     * @return self\n     * @public\n     */\n    open(fn) {\n        if (~this._readyState.indexOf(\"open\"))\n            return this;\n        this.engine = new Engine(this.uri, this.opts);\n        const socket = this.engine;\n        const self = this;\n        this._readyState = \"opening\";\n        this.skipReconnect = false;\n        // emit `open`\n        const openSubDestroy = on(socket, \"open\", function () {\n            self.onopen();\n            fn && fn();\n        });\n        // emit `error`\n        const errorSub = on(socket, \"error\", (err) => {\n            self.cleanup();\n            self._readyState = \"closed\";\n            this.emitReserved(\"error\", err);\n            if (fn) {\n                fn(err);\n            }\n            else {\n                // Only do this if there is no fn to handle the error\n                self.maybeReconnectOnOpen();\n            }\n        });\n        if (false !== this._timeout) {\n            const timeout = this._timeout;\n            if (timeout === 0) {\n                openSubDestroy(); // prevents a race condition with the 'open' event\n            }\n            // set timer\n            const timer = this.setTimeoutFn(() => {\n                openSubDestroy();\n                socket.close();\n                // @ts-ignore\n                socket.emit(\"error\", new Error(\"timeout\"));\n            }, timeout);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(function subDestroy() {\n                clearTimeout(timer);\n            });\n        }\n        this.subs.push(openSubDestroy);\n        this.subs.push(errorSub);\n        return this;\n    }\n    /**\n     * Alias for open()\n     *\n     * @return self\n     * @public\n     */\n    connect(fn) {\n        return this.open(fn);\n    }\n    /**\n     * Called upon transport open.\n     *\n     * @private\n     */\n    onopen() {\n        // clear old subs\n        this.cleanup();\n        // mark as open\n        this._readyState = \"open\";\n        this.emitReserved(\"open\");\n        // add new subs\n        const socket = this.engine;\n        this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n    }\n    /**\n     * Called upon a ping.\n     *\n     * @private\n     */\n    onping() {\n        this.emitReserved(\"ping\");\n    }\n    /**\n     * Called with data.\n     *\n     * @private\n     */\n    ondata(data) {\n        try {\n            this.decoder.add(data);\n        }\n        catch (e) {\n            this.onclose(\"parse error\", e);\n        }\n    }\n    /**\n     * Called when parser fully decodes a packet.\n     *\n     * @private\n     */\n    ondecoded(packet) {\n        // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n        nextTick(() => {\n            this.emitReserved(\"packet\", packet);\n        }, this.setTimeoutFn);\n    }\n    /**\n     * Called upon socket error.\n     *\n     * @private\n     */\n    onerror(err) {\n        this.emitReserved(\"error\", err);\n    }\n    /**\n     * Creates a new socket for the given `nsp`.\n     *\n     * @return {Socket}\n     * @public\n     */\n    socket(nsp, opts) {\n        let socket = this.nsps[nsp];\n        if (!socket) {\n            socket = new Socket(this, nsp, opts);\n            this.nsps[nsp] = socket;\n        }\n        return socket;\n    }\n    /**\n     * Called upon a socket close.\n     *\n     * @param socket\n     * @private\n     */\n    _destroy(socket) {\n        const nsps = Object.keys(this.nsps);\n        for (const nsp of nsps) {\n            const socket = this.nsps[nsp];\n            if (socket.active) {\n                return;\n            }\n        }\n        this._close();\n    }\n    /**\n     * Writes a packet.\n     *\n     * @param packet\n     * @private\n     */\n    _packet(packet) {\n        const encodedPackets = this.encoder.encode(packet);\n        for (let i = 0; i < encodedPackets.length; i++) {\n            this.engine.write(encodedPackets[i], packet.options);\n        }\n    }\n    /**\n     * Clean up transport subscriptions and packet buffer.\n     *\n     * @private\n     */\n    cleanup() {\n        this.subs.forEach((subDestroy) => subDestroy());\n        this.subs.length = 0;\n        this.decoder.destroy();\n    }\n    /**\n     * Close the current socket.\n     *\n     * @private\n     */\n    _close() {\n        this.skipReconnect = true;\n        this._reconnecting = false;\n        this.onclose(\"forced close\");\n        if (this.engine)\n            this.engine.close();\n    }\n    /**\n     * Alias for close()\n     *\n     * @private\n     */\n    disconnect() {\n        return this._close();\n    }\n    /**\n     * Called upon engine close.\n     *\n     * @private\n     */\n    onclose(reason, description) {\n        this.cleanup();\n        this.backoff.reset();\n        this._readyState = \"closed\";\n        this.emitReserved(\"close\", reason, description);\n        if (this._reconnection && !this.skipReconnect) {\n            this.reconnect();\n        }\n    }\n    /**\n     * Attempt a reconnection.\n     *\n     * @private\n     */\n    reconnect() {\n        if (this._reconnecting || this.skipReconnect)\n            return this;\n        const self = this;\n        if (this.backoff.attempts >= this._reconnectionAttempts) {\n            this.backoff.reset();\n            this.emitReserved(\"reconnect_failed\");\n            this._reconnecting = false;\n        }\n        else {\n            const delay = this.backoff.duration();\n            this._reconnecting = true;\n            const timer = this.setTimeoutFn(() => {\n                if (self.skipReconnect)\n                    return;\n                this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n                // check again for the case socket closed in above events\n                if (self.skipReconnect)\n                    return;\n                self.open((err) => {\n                    if (err) {\n                        self._reconnecting = false;\n                        self.reconnect();\n                        this.emitReserved(\"reconnect_error\", err);\n                    }\n                    else {\n                        self.onreconnect();\n                    }\n                });\n            }, delay);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(function subDestroy() {\n                clearTimeout(timer);\n            });\n        }\n    }\n    /**\n     * Called upon successful reconnect.\n     *\n     * @private\n     */\n    onreconnect() {\n        const attempt = this.backoff.attempts;\n        this._reconnecting = false;\n        this.backoff.reset();\n        this.emitReserved(\"reconnect\", attempt);\n    }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n    if (typeof uri === \"object\") {\n        opts = uri;\n        uri = undefined;\n    }\n    opts = opts || {};\n    const parsed = url(uri, opts.path || \"/socket.io\");\n    const source = parsed.source;\n    const id = parsed.id;\n    const path = parsed.path;\n    const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n    const newConnection = opts.forceNew ||\n        opts[\"force new connection\"] ||\n        false === opts.multiplex ||\n        sameNamespace;\n    let io;\n    if (newConnection) {\n        io = new Manager(source, opts);\n    }\n    else {\n        if (!cache[id]) {\n            cache[id] = new Manager(source, opts);\n        }\n        io = cache[id];\n    }\n    if (parsed.query && !opts.query) {\n        opts.query = parsed.queryKey;\n    }\n    return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n    Manager,\n    Socket,\n    io: lookup,\n    connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\n","import {Editor} from '../editor/Editor';\nimport {NpmAuthController} from './NpmAuthController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\nimport {AssetsHelper} from '../editor/core/AssetsHelper';\nimport {\n\tSocketEvent,\n\tFileWatchData,\n\tAuthSession,\n\tMultiPlayer,\n\t// MultiplayerRequestCommandData,\n} from './NpmModuleTypes';\nimport {io, Socket, ManagerOptions} from 'socket.io-client';\nimport {PORT} from './controllers/Common';\nimport {WindowController} from '../editor/core/WindowController';\n\n// https://socket.io/get-started\nexport class NpmSocketControllerClass {\n\tprivate static _instance: NpmSocketControllerClass;\n\tstatic instance() {\n\t\treturn (this._instance = this._instance || new NpmSocketControllerClass());\n\t}\n\n\tprivate _started = false;\n\tprivate _socket: Socket<any, any> | undefined;\n\tstart() {\n\t\tif (this._started) {\n\t\t\tconsole.log('already started');\n\t\t\treturn;\n\t\t}\n\t\tthis._started = true;\n\n\t\twindow.addEventListener('beforeunload', (event) => {\n\t\t\tthis.disconnect();\n\t\t});\n\t\tconst options: Partial<ManagerOptions> = {\n\t\t\treconnectionDelay: 100,\n\t\t};\n\t\t// do not set the socket to ws://localhost:PORT\n\t\t// as this would not work when loaded via ngrok\n\t\tconst socketProtocol = location.protocol.startsWith('https') ? 'wss' : 'ws';\n\t\tlet url = `${socketProtocol}://${location.host}`;\n\t\tif (url == 'ws://localhost:5000') {\n\t\t\turl = `ws://localhost:${PORT}`;\n\t\t}\n\t\tconsole.log('socket url:', url);\n\t\tthis._socket = io(url, options);\n\t\t// console.log('create new socket');\n\t\tthis._socket.connect();\n\t\t// this._connect();\n\t\tthis._addEvents();\n\t}\n\t// private _connect() {\n\t// \tif (!this._socket) {\n\t// \t\tconsole.error('no socket to connect');\n\t// \t\treturn;\n\t// \t}\n\t// \t// console.log('connecting');\n\t// \tthis._socket.connect();\n\t// \t// socket.on('hello', (args) => {\n\t// \t// \tconsole.log('hello', args);\n\t// \t// });\n\t// \t// this._socket.on('error', () => console.log('socket error'));\n\t// }\n\tprivate _addEvents() {\n\t\tif (!this._socket) {\n\t\t\tconsole.error('no sockets to add events to');\n\t\t\treturn;\n\t\t}\n\t\tthis._socket.on('connect', () => {\n\t\t\tStoreController.editor.multiPlayer.sessions.setSocketConnected(true);\n\t\t\tconsole.log('receive connect');\n\t\t\t// this._socket?.close();\n\t\t\t// location.reload();\n\t\t\t// setTimeout(() => {\n\t\t\t// \tthis._connect();\n\t\t\t// }, 100);\n\t\t});\n\t\tthis._socket.on('disconnect', () => {\n\t\t\tStoreController.editor.multiPlayer.sessions.setSocketConnected(false);\n\t\t\tconsole.log('receive disconnect');\n\t\t\t// this._socket?.close();\n\t\t\t// location.reload();\n\t\t\t// setTimeout(() => {\n\t\t\t// \tthis._connect();\n\t\t\t// }, 100);\n\t\t});\n\t\tthis._socket.on('connect_failed', function () {\n\t\t\tStoreController.editor.multiPlayer.sessions.setSocketConnected(false);\n\t\t\tconsole.log('receive connect_failed');\n\t\t\t// socket.connect()\n\t\t});\n\t\tthis._socket.on('close', function () {\n\t\t\tStoreController.editor.multiPlayer.sessions.setSocketConnected(false);\n\t\t\tconsole.log('receive close');\n\t\t\t// socket.connect()\n\t\t});\n\t\tthis._socket.on(SocketEvent.FILE_CHANGED, (args: FileWatchData) => {\n\t\t\tAssetsHelper.updateFromFileChangeEvent(args);\n\t\t});\n\t\tthis._socket.on(SocketEvent.AUTH_SESSION_DESTROYED, (args: AuthSession.DestroyedData) => {\n\t\t\t// console.log(SocketEvent.AUTH_SESSION_DESTROYED, ':', args, NpmAuthController.browserId());\n\t\t\t// if (args.browserIdToKeep == NpmAuthController.browserId()) {\n\t\t\t// \treturn;\n\t\t\t// }\n\t\t\tif (!args.browserIds.includes(NpmAuthController.browserId())) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// if (args.username != StoreController.editor.currentUser.username().value) {\n\t\t\t// \treturn;\n\t\t\t// }\n\t\t\t// console.log(SocketEvent.AUTH_SESSION_DESTROYED, 'logout');\n\t\t\tWindowController.instance().skipPrompt();\n\t\t\tEditor.instance().logout();\n\t\t});\n\t\tthis._socket.on(SocketEvent.MULTIPLAYER_SESSION_DESTROYED, (args: MultiPlayer.Session.DestroyedData) => {\n\t\t\tif (!StoreController.editor.multiPlayer.active.value) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (args.browserIdToKeep == NpmAuthController.browserId()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// console.log(SocketEvent.MULTIPLAYER_SESSION_DESTROYED, 'logout');\n\t\t\tWindowController.instance().skipPrompt();\n\t\t\tEditor.instance().logout();\n\t\t});\n\t\tthis._socket.on(SocketEvent.MULTIPLAYER_USERS_UPDATED, async (args: MultiPlayer.User.UpdatedData) => {\n\t\t\t// console.log(SocketEvent.MULTIPLAYER_USERS_UPDATED, ':', args);\n\t\t\tStoreController.editor.multiPlayer.users.setUsers(args.users);\n\t\t\tStoreController.editor.multiPlayer.userRequests.setRequests(args.requests);\n\t\t\tStoreController.editor.multiPlayer.awareness.updatePath();\n\t\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\t\tconst user = args.users.find((u) => u.username == username);\n\t\t\tif ((username != null && user == null) || user?.banned) {\n\t\t\t\tconsole.log(SocketEvent.MULTIPLAYER_USERS_UPDATED, 'logout');\n\t\t\t\t// WindowController.instance().skipPrompt();\n\t\t\t\t// Editor.instance().logout();\n\t\t\t}\n\t\t});\n\t\tthis._socket.on(SocketEvent.MULTIPLAYER_AWARENESS_UPDATED, async (args: MultiPlayer.Awareness.UpdateData) => {\n\t\t\t// console.log('awareness', args);\n\t\t\tconst sceneName = StoreController.editor.multiPlayer.sceneName();\n\t\t\tif (!sceneName) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst sceneData = args[sceneName];\n\t\t\tif (!sceneData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!StoreController.editor.multiPlayer.users.currentUserInUsers.value) {\n\t\t\t\t// do not show awareness if user is not granted access\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tStoreController.editor.multiPlayer.awareness.setAwareness(sceneData);\n\t\t});\n\t\tthis._socket.on(\n\t\t\tSocketEvent.MULTIPLAYER_COMMAND_CONFIRMED,\n\t\t\tasync (args: MultiPlayer.Command.ConfirmCommandData) => {\n\t\t\t\tconst {sceneName} = args;\n\t\t\t\tif (sceneName != StoreController.editor.multiPlayer.sceneName()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this._userAllowed()) {\n\t\t\t\t\t// do not process commands if user is not granted access\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait StoreController.editor.multiPlayer.commands.processConfirmedCommand({\n\t\t\t\t\tcommandData: args.command,\n\t\t\t\t\tstackIndex: args.stackIndex,\n\t\t\t\t\tstackUpdateConfirmedAt: args.stackUpdateConfirmedAt,\n\t\t\t\t\tuuid: args.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\tthis._socket.on(SocketEvent.MULTIPLAYER_UNDO_CONFIRMED, async (args: MultiPlayer.Command.ConfirmUndoData) => {\n\t\t\tconst {sceneName} = args;\n\t\t\tif (sceneName != StoreController.editor.multiPlayer.sceneName()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._userAllowed()) {\n\t\t\t\t// do not process commands if user is not granted access\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tStoreController.editor.multiPlayer.commands.processConfirmedUndo({\n\t\t\t\tcommandData: args.command,\n\t\t\t\tstackIndex: args.stackIndex,\n\t\t\t\tstackUpdateConfirmedAt: args.stackUpdateConfirmedAt,\n\t\t\t});\n\t\t});\n\n\t\tthis._socket.on(SocketEvent.MULTIPLAYER_REDO_CONFIRMED, async (args: MultiPlayer.Command.ConfirmRedoData) => {\n\t\t\tconst {sceneName} = args;\n\t\t\tif (sceneName != StoreController.editor.multiPlayer.sceneName()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._userAllowed()) {\n\t\t\t\t// do not process commands if user is not granted access\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tStoreController.editor.multiPlayer.commands.processConfirmedRedo({\n\t\t\t\tcommandData: args.command,\n\t\t\t\tstackIndex: args.stackIndex,\n\t\t\t\tstackUpdateConfirmedAt: args.stackUpdateConfirmedAt,\n\t\t\t});\n\t\t});\n\t}\n\tdisconnect() {\n\t\tthis._socket?.close();\n\t}\n\tprivate _userAllowed(): boolean {\n\t\tif (!StoreController.editor.multiPlayer.active.value) {\n\t\t\treturn true;\n\t\t}\n\t\tif (StoreController.editor.multiPlayer.users.currentUserInUsers.value) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nexport const NpmSocketController = NpmSocketControllerClass.instance();\n","import {NpmAuthController} from './NpmAuthController';\nimport {NpmModuleLibraryInstaller} from './NpmModuleLibraryInstaller';\nimport {NpmMarketplaceController} from './NpmMarketplaceController';\nimport {Editor} from '../editor/Editor';\nimport {Poly} from '../../@polygonjs/polygonjs/src/engine/Poly';\nimport {ConsoleLogger} from '../../@polygonjs/polygonjs/src/core/logger/Console';\nimport {\n\t// EditorProps,\n\tEditorEvent,\n\t// SceneData,\n\tEditorType,\n} from '../editor/types';\nimport {NpmModuleSceneSaveController} from './NpmModuleSceneSaveController';\nimport {NpmModuleApiController} from './NpmModuleApiController';\n// import {NpmModuleSceneLoadController} from './SceneLoadController';\nimport {router, rootPath, newSceneUrl, settingsScenePath} from '../routes';\nimport {WindowController} from '../editor/core/WindowController';\n\n// import {NpmModuleEditorConfigLoadController} from './EditorConfigLoadController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\n\n// import {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\nimport {NpmModulePolyNodeSaveController} from './NpmModulePolyNodeSaveController';\n\nimport {NpmSerializedStack} from '../editor/history/serializedStack/NpmSerializedStack';\n// import {AppConfig} from '../config/AppConfig';\nimport {NpmSocketController} from './NpmSocketController';\nimport {removeLoader} from '../editor/core/LoaderController';\n\n// var url_params = new URLSearchParams(window.location.search);\nexport async function npmEditorConfig() {\n\tconst currentRoot = Poly.libs.root() || '';\n\tif (currentRoot[0] == '/') {\n\t\tPoly.libs.setRoot(`.${currentRoot}`);\n\t}\n\n\tPoly.setPlayerMode(false);\n\tPoly.setLogger(new ConsoleLogger());\n\n\tNpmSocketController.start();\n\tNpmModuleApiController.libraries.reInstallAllIfAlreadyPresent();\n\n\tEditor.setType(EditorType.LOCAL);\n\n\tEditor.on(EditorEvent.MOUNTED, removeLoader);\n\n\t/**\n\t *\n\t * SAVE/LOAD/EXPORT\n\t *\n\t */\n\tEditor.on(EditorEvent.VIEW_EXPORT, async (scene) => {\n\t\t// await StoreController.editor.exportFormLocal.display();\n\t\tconst t = new Date().getTime();\n\t\tEditor.instance().open_in_new_tab(`/polygonjs/build/${scene.name()}/index.html?t=${t}`);\n\t});\n\tEditor.on(EditorEvent.NEW_SCENE, () => {\n\t\t// only updating the router has the following problem:\n\t\t// - when we update a new scene from /scenes/new\n\t\t// - and then click again on File->New Scene\n\t\t// then the scene doesn't reset to a new one.\n\t\t// It is therefore easier to open a new tab\n\t\t// router.push(Route.SCENE_NEW);\n\t\tconsole.log(newSceneUrl());\n\t\tEditor.instance().open_in_new_tab(newSceneUrl());\n\t});\n\t// Editor.on(EditorEvent.LOAD_SCENE, () => {\n\t// \tStoreController.editor.panelSceneSelector.open();\n\t// });\n\tEditor.on(EditorEvent.SAVE, async (scene, code, layout_data) => {\n\t\tconst saveController = new NpmModuleSceneSaveController(scene, code, layout_data, {requestNewName: false});\n\t\tawait saveController.save();\n\t});\n\tEditor.on(EditorEvent.SAVE_AS, async (scene, code, layout_data) => {\n\t\tconst saveController = new NpmModuleSceneSaveController(scene, code, layout_data, {requestNewName: true});\n\t\tawait saveController.save();\n\t});\n\tEditor.on(EditorEvent.SETTINGS, () => {\n\t\tconst scene = StoreController.scene;\n\t\tconst sceneName = scene.name();\n\t\tif (!sceneName) {\n\t\t\treturn;\n\t\t}\n\t\trouter.push(settingsScenePath(sceneName));\n\t\t// const uuid = scene.uuid;\n\t\t// Editor.instance().open_in_new_tab(`/scenes/${uuid}/settings`);\n\t});\n\tEditor.on(EditorEvent.DASHBOARD, () => {\n\t\t// router.push(rootPath());\n\t\t// it feels nicer in a new tab\n\t\tEditor.instance().open_in_new_tab(rootPath());\n\t});\n\t// Editor.on(EditorEvent.EXPORT, async (scene, blobs, code, layout_data) => {\n\t// \treturn new Promise(async (resolve, reject) => {\n\t// \t\tconst sceneName = scene.name();\n\t// \t\tif (!sceneName) {\n\t// \t\t\talert('scene needs to be saved before exporting');\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t\tawait NpmModuleApiController.loadCaptureStatic(sceneName);\n\t// \t\t// const filename = `${scene.name()}.polygonjs`;\n\t// \t\t// CoreFileUtils.downloadBlob(blob, filename);\n\t// \t\t// const polygonjsFile = CoreFileUtils.blobToFile(blobs.polygonjs, filename, {addExtFromBlobType: false});\n\t// \t\tconst fileName = `${scene.name()}.zip`;\n\t// \t\tCoreFileUtils.downloadBlob(blobs.zipWithHTML, fileName);\n\t// \t\tStoreController.editor.status.setMessage(`downloaded export as ${fileName}`);\n\t// \t});\n\t// });\n\t/**\n\t *\n\t * COMMANDS\n\t *\n\t */\n\tEditor.instance().setHistorySerializedStack(new NpmSerializedStack());\n\n\t/**\n\t *\n\t * POLY NODES/MARKETPLACE\n\t *\n\t */\n\tEditor.on(EditorEvent.CREATE_POLY_NODE, async (data) => {\n\t\tconst saveController = new NpmModulePolyNodeSaveController();\n\t\tconst newNode = await saveController.create(data.node, data.polyNodeData);\n\t\tdata.callback(newNode);\n\t});\n\tEditor.on(EditorEvent.SAVE_POLY_NODE, async (data) => {\n\t\tconst saveController = new NpmModulePolyNodeSaveController();\n\t\tconst newNode = await saveController.update(data.node, data.polyNodeData);\n\t\tdata.callback(newNode);\n\t});\n\t/**\n\t *\n\t * Marketplace\n\t *\n\t */ Editor.on(EditorEvent.MARKETPLACE_DOWNLOAD_POLY_NODE, async (data) => {\n\t\tconst saveController = new NpmModulePolyNodeSaveController();\n\t\tconst updatedNodes = await saveController.download(data);\n\t\tdata.callback(updatedNodes);\n\t});\n\tEditor.on(EditorEvent.MARKETPLACE_UPLOAD_POLY_NODE, async (data) => {\n\t\tconst secret = NpmAuthController.secret();\n\t\tif (secret) {\n\t\t\tawait NpmMarketplaceController.marketplacePolyNodeUpload({\n\t\t\t\tnode_context: data.node_context,\n\t\t\t\tnode_type: data.node_type,\n\t\t\t\tsecret,\n\t\t\t});\n\t\t} else {\n\t\t\tStoreController.editor.dialogApiLogin.show();\n\t\t}\n\t});\n\t// Editor.on(EditorEvent.MARKETPLACE_UPLOAD_POLY_NODE, async (data) => {\n\t// \tconst secret = NpmAuthController.secret()\n\t// \tif(secret){\n\t// \tawait NpmMarketplaceController.marketplacePolyNodeUpload({\n\t// \t\tnode_context: data.node_context,\n\t// \t\tnode_type: data.node_type,secret\n\t// \t});}else{\n\t// \t\tStoreController.editor.status.setError('you must login in order to upload to the marketplace')\n\t// \t}\n\t// });\n\tEditor.on(EditorEvent.MARKETPLACE_INDEX_POLY_NODE, async (data) => {\n\t\tconst secret = NpmAuthController.secret();\n\t\tconst username = StoreController.editor.currentUser.username().value;\n\t\tif (secret && username) {\n\t\t\treturn await NpmMarketplaceController.marketplacePolyNodeIndex({\n\t\t\t\tusername,\n\t\t\t\tsecret,\n\t\t\t});\n\t\t} else {\n\t\t\treturn {error: 'you must be logged in to list your polyNodes'};\n\t\t}\n\t});\n\n\tEditor.on(EditorEvent.MARKETPLACE_SEARCH, async (data) => {\n\t\t// const secret = NpmAuthController.secret();\n\t\t// if (secret) {\n\t\treturn await NpmMarketplaceController.marketplacePolyNodeSearch({q: data.q});\n\t\t// } else {\n\t\t// return {error: 'you must be logged in to search the marketplace'};\n\t\t// }\n\t});\n\n\t/**\n\t *\n\t * MISC\n\t *\n\t */\n\tEditor.on(EditorEvent.LIBRARY_INSTALL_DRACO_REQUEST, async () => {\n\t\tawait NpmModuleLibraryInstaller.requestDracoInstallation();\n\t});\n\t// Editor.on(EditorEvent.SCENE_CREATED, async (scene: PolyScene) => {\n\t// \tawait NpmModuleEditorConfigLoadController.load(scene);\n\t// });\n\t// Editor.on(EditorEvent.ACCOUNT_SETTINGS, () => {\n\t// \tEditor.instance().open_in_new_tab(`https://polygonjs.com/account`);\n\t// });\n\tEditor.on(EditorEvent.LOGOUT, () => {\n\t\tNpmModuleApiController.sessions.destroy();\n\t});\n\tEditor.on(EditorEvent.DISPLAY_LOGIN_FORM, () => {\n\t\tStoreController.editor.dialogApiLogin.show();\n\t});\n\n\tEditor.on(EditorEvent.VIEWER_CAPTURE_STATIC, async (file) => {\n\t\t// if (!scene_data.name) {\n\t\t// \talert('make sure to save your scene before capturing an image');\n\t\t// \treturn;\n\t\t// }\n\t\tconst scene = StoreController.scene;\n\t\tconst sceneName = scene.name();\n\t\tif (!sceneName) {\n\t\t\talert('make sure to save your scene before capturing an image');\n\t\t\treturn;\n\t\t}\n\t\tNpmModuleApiController.captures.saveStatic(sceneName, file);\n\t});\n\tEditor.on(EditorEvent.VIEWER_CAPTURE_ANIMATION, async (file) => {\n\t\t// if (!scene_data.name) {\n\t\t// \talert('make sure to save your scene before capturing a video');\n\t\t// \treturn;\n\t\t// }\n\t\tconst scene = StoreController.scene;\n\t\tconst sceneName = scene.name();\n\t\tif (!sceneName) {\n\t\t\talert('make sure to save your scene before capturing a video');\n\t\t\treturn;\n\t\t}\n\t\tNpmModuleApiController.captures.saveAnimation(sceneName, file);\n\t\t// const link = document.createElement('a');\n\t\t// link.href = URL.createObjectURL(file);\n\t\t// link.download = 'polygonjs.webm';\n\t\t// link.dispatchEvent(new MouseEvent('click'));\n\t});\n\tEditor.on(EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_SAVE, async (options) => {\n\t\t// if (StoreController.editor.captureForm.forceReadRendersFromMemory()) {\n\t\t// \treturn StoreController.editor.captureForm.onFrameSave(options);\n\t\t// } else {\n\t\tconst {file, fileName} = options;\n\t\tconst scene = StoreController.scene;\n\t\tconst sceneName = scene.name();\n\t\tif (!sceneName) {\n\t\t\talert('make sure to save your scene before capturing a video');\n\t\t\treturn;\n\t\t}\n\t\tawait NpmModuleApiController.captures.saveAnimationFrame(sceneName, file, fileName);\n\t\t// }\n\t});\n\tEditor.on(EditorEvent.VIEWER_CAPTURE_ANIMATION_FRAME_LOAD, async (options) => {\n\t\t// if (StoreController.editor.captureForm.forceReadRendersFromMemory()) {\n\t\t// \treturn StoreController.editor.captureForm.onFrameRead(options);\n\t\t// } else {\n\t\tconst {fileName} = options;\n\t\tconst scene = StoreController.scene;\n\t\tconst sceneName = scene.name();\n\t\tif (!sceneName) {\n\t\t\talert('make sure to save your scene before capturing a video');\n\t\t\treturn;\n\t\t}\n\t\treturn await NpmModuleApiController.captures.loadAnimationFrame(sceneName, fileName);\n\t\t//}\n\t});\n\n\tEditor.allowFileBrowse();\n\n\tWindowController.instance().initEvent();\n\n\tStoreController.editor.userPlan.setPro(false);\n\n\t// MultiPlayerController.init();\n}\n","// import {PolyDictionary} from '../../../@polygonjs/polygonjs/src/types/GlobalTypes';\n// import {Editor} from '../Editor';\n// import {NpmModuleApiController} from './ApiController';\n\nimport {Editor} from '../editor/Editor';\nimport {EditorApiOptions} from '../editor/api/EditorApi';\nimport type {EditorApi} from '../editor/api/EditorApi';\nimport {NpmModuleApiController} from './NpmModuleApiController';\nimport {PolyScene} from '../../@polygonjs/polygonjs/src/engine/scene/PolyScene';\n\ninterface ResolveOptions {\n\texportFolder: string;\n}\ntype ResolveCallback = (options: ResolveOptions) => void;\ndeclare global {\n\tinterface Window {\n\t\t__POLYGONJS_EDITOR_API_OPTIONS_INSTANCE__: EditorApiOptions | undefined;\n\t\t__POLYGONJS_EDITOR_INSTANCE__RESOLVE: ResolveCallback | undefined;\n\t}\n}\nexport class NpmModuleEditorConfigLoadController {\n\tstatic async load(scene: PolyScene): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst sceneName = scene.name();\n\t\t\tif (!sceneName) {\n\t\t\t\tconsole.warn('scene must be saved in order to load EditorConfig');\n\t\t\t\treturn resolve();\n\t\t\t}\n\n\t\t\tconst api = Editor.instance().api;\n\t\t\tconst url = NpmModuleApiController.config.loadEditorConfigUrl();\n\t\t\twindow.__POLYGONJS_EDITOR_INSTANCE__RESOLVE = async (options: ResolveOptions) => {\n\t\t\t\twindow.__POLYGONJS_EDITOR_API_OPTIONS_INSTANCE__ = undefined;\n\t\t\t\tawait this._applyApi(api);\n\t\t\t\tapi.export.setExportFolder(options.exportFolder);\n\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst scriptElement = document.createElement('script');\n\t\t\tscriptElement.setAttribute('type', 'module');\n\t\t\twindow.__POLYGONJS_EDITOR_API_OPTIONS_INSTANCE__ = {api: api, sceneName: sceneName};\n\t\t\tscriptElement.text = `\nasync function loadPolygonjsEditorConfig(){\n\tconst editorConfigResolve = window.__POLYGONJS_EDITOR_INSTANCE__RESOLVE;\n\tif(!editorConfigResolve){\n\t\tconsole.warn('no resolve found for EditorConfig load');\n\t\treturn\n\t}\n\tconst noModuleErrorMessage = 'no module from EditorConfig (it is expected if the scene is not saved)'\n\tconst module = await import('${url}');\n\tif(!module){\n\t\tconsole.warn(noModuleErrorMessage);\n\t\teditorConfigResolve({exportFolder:''});\n\t\treturn\n\t}\n\tconst configureEditor = module.configureEditor;\n\tconst exportFolder = module.exportFolder;\n\tif(!(configureEditor && exportFolder)){\n\t\tconsole.warn(noModuleErrorMessage);\n\t\teditorConfigResolve({exportFolder:''});\n\t\treturn\n\t}\n\tconfigureEditor(window.__POLYGONJS_EDITOR_API_OPTIONS_INSTANCE__);\n\twindow.__POLYGONJS_EDITOR_INSTANCE__RESOLVE = undefined;\n\teditorConfigResolve({exportFolder});\n}\nloadPolygonjsEditorConfig();\n\t`;\n\t\t\tdocument.body.appendChild(scriptElement);\n\t\t});\n\n\t\t// const response = await fetch(url);\n\t\t// const json: PolyDictionary<string> = await response.json();\n\t\t// const panels_config = Editor.instance().api.panel.custom;\n\t\t// const panel_names = Object.keys(json);\n\t\t// for (let panel_name of panel_names) {\n\t\t// \tconst content = json[panel_name];\n\t\t// \tif (panel_name == VIEWER_PANEL_NAME) {\n\t\t// \t\tpanels_config.viewer.setHTML(content);\n\t\t// \t} else {\n\t\t// \t\tpanels_config.custom.addPanel(panel_name, content);\n\t\t// \t}\n\t\t// }\n\t\t// const viewer_content: string = json.viewer;\n\t\t// if (viewer_content) {\n\t\t// \tEditor.instance().panels_config.viewer.setHTML(viewer_content);\n\t\t// }\n\t}\n\tprivate static async _applyApi(api: EditorApi) {\n\t\tdocument.title = api.html.head.title();\n\n\t\t// const scriptTags = api.html.head.scriptTags();\n\t\t// for (let scriptTag of scriptTags) {\n\t\t// \tawait this._loadScript(scriptTag);\n\t\t// }\n\t}\n\t// private static _loadScript(scriptTag: string) {\n\t// \t// return new Promise((resolve) => {\n\t// \tconst div = document.createElement('div');\n\t// \tdiv.innerHTML = scriptTag;\n\t// \tconst scriptElement = div.children[0] as HTMLScriptElement;\n\t// \tconst content = scriptElement.innerHTML;\n\t// \tconsole.log(content);\n\t// \teval(content);\n\t// \t// scriptElement.onload = resolve;\n\t// \t// document.body.appendChild(scriptElement);\n\t// \t// resolve(null);\n\t// \t// });\n\t// }\n}\n","import {npmEditorConfig} from './NpmEditorConfig';\nimport {AppConfig} from '../config/AppConfig';\nimport {NpmModulePolyNodeSaveController} from './NpmModulePolyNodeSaveController';\nimport {\n\t// EditorProps,\n\t// EditorEvent,\n\tSceneData,\n\t// TopMenuFileEntry,\n\t// EditorType\n} from '../editor/types';\nimport {NpmModuleEditorConfigLoadController} from './EditorConfigLoadController';\nimport {AppSceneLoader} from '../config/AppSceneLoader';\nimport {AppLoader} from '../config/AppLoader';\nimport {NpmModuleSceneLoadController} from './NpmModuleSceneLoadController';\nimport {NpmModuleApiController} from './NpmModuleApiController';\nimport {StoreController} from '../editor/store/controllers/StoreController';\n// css is also required here in the web_editor pack,\n// otherwise when running rake deploy, css will not be created\n// and the test will fail\nimport './css/EditorCSS';\n\n// import {Poly} from '../../@polygonjs/polygonjs/src/engine/Poly';\n\n// let sceneDataLoadInProgress = false;\n// export async function _npmEditorMount() {\n// \tif (sceneDataLoadInProgress) {\n// \t\treturn;\n// \t}\n// \tsceneDataLoadInProgress = true;\n\n// \ttry {\n// \t\t// const queryString = window.location.href.split('?')[1];\n// \t\t// const urlParams = new URLSearchParams(window.location.search);\n// \t\t// const urlParamSceneName = urlParams.get('scene');\n// \t\t// AppSceneLoader.setLoadSceneDataCallback(async (sceneName)=>{\n// \t\t// \treturn await NpmModuleSceneLoadController.load(sceneName)\n// \t\t// })\n// \t\t// const data = ;\n// \t\t// if (!data) {\n// \t\t// \treturn;\n// \t\t// }\n// \t\t// const {scene_code, editor_data, sceneName} = data;\n\n// \t\t// load nodes and plugins\n// \t\t// AllModulesRegister.run(Poly);\n\n// \t\t// await new NpmModulePolyNodeSaveController().readAndRegisterPolyNodes();\n\n// \t\t// MultiPlayerController.setActive(true);\n// \t\t// console.log('registerNode', ErrorNotifierSopNode);\n// \t\t// Poly.registerNode(ErrorNotifierSopNode, 'debug');\n\n// \t\t// we add a dot to the current root\n// \t\t// in order to make it easier for exports.\n// \t\t// And it also will not cause a problem when fetching the libraries in the local app,\n// \t\t// as opposed to when we are in the web app,\n// \t\t// since we are always at the root url\n\n// \t\tconst scene_data: SceneData = {\n// \t\t\tjson: scene_code,\n// \t\t\tuuid: sceneName || undefined,\n// \t\t\tname: sceneName || undefined,\n// \t\t\tassets_root: '',\n// \t\t};\n\n// \t\tconst editorProps: EditorProps = {\n// \t\t\tcurrent_node: editor_data.current_node,\n// \t\t\tcurrentNodes: editor_data.currentNodes,\n// \t\t\tnavigationHistory: editor_data.navigationHistory,\n// \t\t\t// selected: url_params.get('selected') || undefined,\n// \t\t\t// perf: url_params.has('perf') ? CoreString.toBoolean(url_params.get('perf') || '') : undefined,\n// \t\t\tscene_update_allowed: true,\n// \t\t\t// no idea why I have to add \"multiple_panel\"\n// \t\t\tinit_layout_data: editor_data.multiple_panel, // not working for now...?\n// \t\t\tfullscreenPanelId: editor_data.fullscreenPanelId,\n// \t\t\tsaveOptions: editor_data.saveOptions,\n// \t\t\tparamsModal: editor_data.paramsModal,\n// \t\t\ttop_menu_entries: [\n// \t\t\t\tTopMenuFileEntry.NEW_SCENE,\n// \t\t\t\tTopMenuFileEntry.LOAD_SCENE,\n// \t\t\t\tTopMenuFileEntry.SAVE_SCENE,\n// \t\t\t\tTopMenuFileEntry.SAVE_SCENE_AS,\n// \t\t\t\tTopMenuFileEntry.PREFERENCES,\n// \t\t\t\t// TopMenuFileEntry.VIEW_EXPORT,\n// \t\t\t\tTopMenuFileEntry.LIBRARIES_MANAGER,\n// \t\t\t\t// TopMenuFileEntry.SCENE_SETTINGS,\n// \t\t\t\t// TopMenuFileEntry.EXPORT_SCENE,\n// \t\t\t\t// TopMenuFileEntry.PUBLIC_PAGE,\n// \t\t\t\t// TopMenuFileEntry.DASHBOARD,\n// \t\t\t\t// TopMenuFileEntry.QUIT,\n// \t\t\t\t// TopMenuFileEntry.SAVE_PROJECT,\n// \t\t\t\t// TopMenuFileEntry.OPEN_SCENE,\n// \t\t\t\t// TopMenuFileEntry.LOGOUT,\n// \t\t\t\t// TopMenuFileEntry.QUIT,\n// \t\t\t],\n// \t\t};\n\n// \t\tnpmEditorConfig(scene_data, editorProps);\n// \t} catch (error) {\n// \t\talert(`failed to load scene, please check that the app is running`);\n// \t\tconsole.log(error);\n// \t}\n// }\n// import {NpmModulePolyConfigLoadController} from './PolyConfigLoadController'\n\nlet _started = false;\nasync function start() {\n\tif (_started) {\n\t\treturn;\n\t}\n\t_started = true;\n\n\tnpmEditorConfig();\n\n\tAppConfig.setRequestCaptureStatusCallback(async (sceneName) => {\n\t\treturn await NpmModuleApiController.captures.requestStatus({sceneName});\n\t});\n\tAppConfig.setRegisterCallback(async (sceneName) => {\n\t\tconst {FilesRegister} = await import('../editor/self_contained/FilesRegister');\n\t\tawait FilesRegister.init();\n\n\t\t// const {registerPluginsForLocalTests} = await import('../../../../src/engine/registerPlugins');\n\t\t// if (process.env.NODE_ENV == 'development') {\n\t\t// \tregisterPluginsForLocalTests();\n\t\t// }\n\t\tif (sceneName != null) {\n\t\t\tconst {NpmModulePolyConfigLoadController} = await import('./PolyConfigLoadController');\n\t\t\tawait NpmModulePolyConfigLoadController.load(sceneName);\n\t\t} else {\n\t\t\tconsole.warn('no scene name provided, cannot load PolyConfig.ts');\n\t\t}\n\n\t\tconst {AllRegister} = await import('../../@polygonjs/polygonjs/src/engine/poly/registers/All');\n\t\tAllRegister.registerAll();\n\n\t\tawait new NpmModulePolyNodeSaveController().readAndRegisterPolyNodes();\n\t});\n\tAppConfig.setOnEditorRoutesCreated(async () => {\n\t\t// We only login once the editor has added its routes.\n\t\t// If we were doing it before,\n\t\t// when login is required (for a multiplayer session for instance)\n\t\t// then we could do change to the login route, as it doesn't exist yet\n\t\tawait StoreController.editor.multiPlayer.sessions.show();\n\t\tNpmModuleApiController.sessions.show();\n\t});\n\n\tAppSceneLoader.setLoadSceneDataCallback(async (sceneName) => {\n\t\t// if (!sceneName) {\n\t\t// alert('no scene name');\n\t\t// return;\n\t\t// }\n\t\tconst data = await NpmModuleSceneLoadController.load(sceneName);\n\t\t// console.log('data', data);\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tif (data && data.sceneData) {\n\t\t\tconst sceneData: SceneData = {\n\t\t\t\tjson: data.sceneData.scene_code,\n\t\t\t\t// uuid?: string;\n\t\t\t\tname: sceneName || undefined,\n\t\t\t\tassets_root: '',\n\t\t\t};\n\t\t\tAppConfig.setEditorLayoutData(data.sceneData.editor_data);\n\t\t\treturn sceneData;\n\t\t}\n\t\t// \tconst scenePolygonjsVersion = data.editor_data.json.properties?.versions?.polygonjs;\n\t\t// if (scenePolygonjsVersion) {\n\t\t// \tconst currentVersion = NpmModuleSceneSaveController.engineVersion();\n\t\t// \tif (currentVersion != scenePolygonjsVersion) {\n\t\t// \t\tconst message = `you are loading a scene saved with Polygonjs version ${scenePolygonjsVersion}, but the editor you are loading it with is using version ${currentVersion}. You can proceed and check that your scene works well. But if not, you can load the editor with the same version with 'npx polygonjs-editor@${scenePolygonjsVersion}-1'.`;\n\t\t// \t\tawait StoreController.editor.dialogNotice.show({\n\t\t// \t\t\ttitle: 'Scene versions conflict',\n\t\t// \t\t\tmessage: message,\n\t\t// \t\t});\n\t\t// \t}\n\t\t// }\n\t});\n\tAppSceneLoader.setOnSceneCreatedCallback(async (scene) => {\n\t\tawait NpmModuleEditorConfigLoadController.load(scene);\n\t});\n\tAppLoader.mount('#app');\n\t// AppConfig.setOptions('#app', {\n\t// \teditorProps,\n\t// \tloadSceneCallback: async () => {\n\t// \t\tawait Editor.loadSceneData(scene_data, editorProps);\n\t// \t},\n\t// });\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n\tstart();\n});\nstart();\n"],"names":["ColorConversion","GeneratorName","element","ImageExtension","GeometryExtension","SDFExtension","AudioExtension","FontExtension","MouseButton","MouseButtons","BooleanString","TransformTargetType","RotationOrder","ObjectTransformSpace","ObjectTransformMode","ObjectUserData","VideoEvent","AnimNodeEasing","InOutMode","Operation","CameraAttribute","PerspectiveCameraAttribute","OrthographicCameraAttribute","maxFPS","CameraFrameMode","BaseCodeProcessor","CoreEventEmitter","DragEventType","KeyboardEventType","MouseEventType","PointerEventType","TouchEventType","WindowEventType","Attribute","ObjectAttribute","ObjectType","objectTypeCheckFunctions","dataByObjectType","AttribClass","AttribType","AttribSize","ComponentName","objectPath","GroupOperation","EntityGroupType","ObjectEvent","GlConstant","InstanceAttrib","index","CustomMaterialName","material","CoreObjectType","PropertyName","CadGeometryType","FaceOrientation","faceData","CsgGeometryType","QUADObjectType","QuadTriangulationAttribute","attribute","geometry","target","i","SDFObjectType","dummyMesh","AttribLookup","ChannelInterpolation","LightUserDataRaymarching","FileFontFormat","GeometryFormat","ParticlesAttribute","ParticlesDataType","dataType","CSSObjectAttribute","PowerPreference","RendererPrecision","MapboxCameraAttribute","BaseXRSessionEventName","WebXRFeatureStatus","MarkerTrackingSourceMode","MarkerTrackingTransformMode","WebXRARFeature","coreObjectClass","WebXRVRFeature","WFCQuadAttribute","WFCTileAttribute","WFCConnectionAttribute","tileConfigElements","side1s","quadId","WebGLContext","KeyModifierRequirement","nodeType","nodeCreateOptions","node","result","_a","_b","ErrorType","CubeMapUrlKey","CubeMapUrlAxis","m","VideoMode","setWrapping","imageCopParamConfig","BaseImageCopParamsConfig","ParamsConfig","MouseControl","TouchControl","ForLoopInput","cloneData","data","json","GlobalsOutput","GlobalsBaseControllerType","shader_name","GlobalsTextureHandlerPurpose","definitions","replace","LineType","GLDefinitionType","AttributeJsNodeInput","AttributeJsNodeOutput","GetChildrenAttributesInputName","GetObjectAttributeInputName","GetObjectAttributeOutputName","KeyframesJsNodeInputName","OnChildAttributeUpdateInputName","type","varName","variable","tmpVarName","OnObjectAttributeUpdateInputName","SetMaterialUniformJsNodeInputName","TrackFaceJsNodeOutput","TrackHandJsNodeOutput","inputObject3D","inputParam","linesController","inputNode","OnObjectPointerEventGPUJsNodeInputName","OnObjectPointerEventGPUJsNodeOutputName","SerializedVariableType","ActorAssemblerConstant","JsDefinitionType","BackgroundMode","FogType","ObjNodeRenderOrder","pass","ToneMappingName","ToneMappingValue","ShadowMapTypeName","ShadowMapTypeValue","generate","coreGroup","value","DataType","state","ComparisonOperator","MapboxPlaneType","geometries","TextSopJustifiyMode","shapes","TextType","_createObject","srcTileId","destTileId","EventConnectionPointType","GlConnectionPointType","JsConnectionPointType","ShaderName","JsFunctionName","AttribPromoteMode","referenceSpace","options","pointsCount","TransformResetMode","RampInterpolation","StringParamLanguage","FileType","InputCloneMode","NodeContext","NetworkNodeType","NetworkChildNodeType","CameraNodeType","CameraSopNodeType","CameraControlsNodeType","AudioNodeAnalyserType","NodeEvent","ParamEvent","ParamType","HandlerName","SceneEvent","AssemblerName","ModuleName","AnimType","AudioType","CopType","CopTypeImage","EventInputType","GlType","JsType","LightType","THREELightType","ObjType","PostType","RopType","SopType","SopTypeFile","SopTypeFileMulti","SopExporter","PolyEventName","EventHandlerType","warningMessage","nodeId","performance","_ref","UniformName","Status","CameraControlsEvent","resolve","PreviousJsType","imageTypeByExt","ext","importer","scene","autoLayout","ApiName","DocsRoute","LayoutEntryId","viewerData","_fuzzyFilter","_basicFilter","filteredTypes","entries","ControlsMode","ControlsSpace","LineItemState","fileData","lineItem","CaptureType","CssType","UrlParamFeature","Keyboard","SelectionMethod","TailwindColor","TailwindPalette","node_type","ExportNotAllowedReason","EventName","input_connection","connections","BaseCommandFromJSONMode","CommandType","CaptureRendererType","ExportType","StatusType","channelData","selectionData","EditorEvent","EditorType","MultiplePanelSplitMode","PanelType","TopMenuFileEntry","ExamplePrefix","ExampleCategory","ExamplesRegisterAsync","body","response","SelfContainedFileName","ResponseMessageFromLocalServer","LocalServerUrl","Route","EditorRoute","SocketEvent","SaveWarningResponse","FetchErrorMessage","FigmaPluginSceneOrigin","FigmaMessageType","sceneData","layoutData","route","router","matcher","props","MultiplePanelSplitLabel","MultiplePanelSplitAction","ViewerKeyActionName","ViewerKey","event","NetworkAction","destInputConnectionPoints","ColorSpace","groupTypes","size","Action","awarenessData","blob","controls","domElement","canvas","viewer","json_params","CameraViewerCodePresetName","PresetLibrary","entry","param","copyPoint","dest","normalized_pos","sceneName"],"sourceRoot":""}